Celeron 540って速いのね。
T8300は玉砕。R61がPenryn対応したら、そのうちBIOSが上がるかなと気長に待つことにする。
T42はPentiumM 1.8GHz、R61はCerelon 540(1.84GHz)、正直、体感は、ほとんど変わらんだろうと思っていたら、なんだか、まるで違う。いやこれはCPUというより、ビデオチップの性能差なんだろうな。しかしCerelon、いつのまに64bit化していたんだ? というわけでUbuntu 64bit版を導入。
無線がつながらず、往生する。どうやらiwp3945にはバグがあるらしい。iwp3945 iwl3945で検索すると、いっぱいひっかかるんで、それらに書いてある通りiwp3945をブラックリストに乗せて、かわりにiwl3945を導入。
で、全然つながらないじゃん、と思ったら、iwl3945の場合、無線のインジケータが点灯しない模様。それ以外は普通に使えているようだ。
[備忘録] Daredevil skkをUbuntuのxft版Emacsに導入
最初にガイドに従って、apelを入れるんだけど、apelが/usr/local/share/emacs/site-lispの下に、emuが/usr/local/share/emacs/23.0.60/site-lispの下に入ってしまう。で、
shanai@shanai-laptop:~/ddskk-13.1$ make emacs -batch -q -no-site-file -l SKK-MK -f SKK-MK-compile Loading /home/shanai/ddskk-13.1/SKK-CFG... Cannot open load file: install make: *** [elc] エラー 255
とか、
shanai@shanai-laptop:~/ddskk-13.1$ make emacs -batch -q -no-site-file -l SKK-MK -f SKK-MK-compile Loading /home/shanai/ddskk-13.1/SKK-CFG... Cannot open load file: poe make: *** [elc] エラー 255
とか、文句を言われてしまう。/usr/share/emacs-snapshot/site-lispの下に、シンボリックリンクを張ってやればok。でddskkをインストールすると、これまた/usr/local/share/emacs/23.0.60/site-lispの下に入ってしまうんで、これも/usr/lshare/emacs-snapshot/site-lispの下にシンボシンクリンクを張っておく。
R61捕獲
いよいよLenovoのページは、R61もワイドばかりになってヤバくなってきたので、秋葉原に行って8943A12を捕獲。SXGA+ 15inchが入って、ニッシンパルで77800円。安いよねぇ。とても見やすいし、明るさも申し分なし。
無線LANのドータカード入れて、メモリもGreen Houseの2GBを2枚で4GB搭載。ここまでは順調。CPUもT8300に入れかえてみたら、立ち上がらず。ダメかなぁ。とりあえずBIOSを最新に上げてリトライの予定。
いやぁ、しかしR61、なかなか好印象。重いとはいえ3kgは切っているし。キーボード打ち易いし。ドライブベイはホットスワップできるようになっているし、多分無いだろうと思っていた無線on/offスイッチもついているし。
継承とインナークラスとクラスローダ
なんか、わけ分からないことに巻き込まれた。
まず継承関係のBaseとSubクラス。
abstract public class Base { protected void baseMethod() { System.err.println("Base.baseMethod()"); } abstract protected void perform(); } public class Sub extends Base { class Foo { void foo() { baseMethod(); // Sub.super.baseMethod(); // Sub.this.baseMethod(); } } public void perform() { new Foo().foo(); // baseMethod(); } }ちょっと変わっているのは、SubからはインナクラスであるFoo経由でBaseを呼び出している点。Subだけ、別のクラスローダでロードする。
import java.io.*;
class MyClassLoader extends ClassLoader {
MyClassLoader(ClassLoader parent) {
super (parent);
}
protected Class> findClass(String name) throws ClassNotFoundException {
File classFile = new File("subclasses/" + name.replace('.', '/') + ".class");
byte[] buf = new byte[(int)classFile.length()];
InputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(classFile));
int offset = 0;
int readSize = 0;
while (offset < buf.length) {
readSize = is.read(buf, offset, buf.length - offset);
if (readSize == -1)
throw new EOFException(classFile.getAbsolutePath());
offset += readSize;
}
return defineClass(name, buf, 0, buf.length);
}
catch (IOException ex) {
throw new ClassNotFoundException(name, ex);
}
finally {
if (is != null) {
try {is.close();}
catch (IOException ex) {ex.printStackTrace();}
}
}
}
}
そしてメインクラス。
public class Main {
public static void main(String[] args) throws Exception {
ClassLoader cl = new MyClassLoader(Main.class.getClassLoader());
Class> cls = cl.loadClass("Sub");
Base base = (Base)cls.newInstance();
base.perform();
}
}
baseclassesディレクトリとsubclassesディレクトリを用意して、コンパイル。
$ javac -d baseclasses Main.java Base.java MyClassLoader.java $ javac -d subclasses -cp baseclasses Sub.java
実行。
$ java -cp baseclasses Main
Exception in thread "main" java.lang.IllegalAccessError: tried to access method
Base.baseMethod()V from class Sub$Foo
at Sub$Foo.foo(Sub.java:4)
at Sub.perform(Sub.java:11)
at Main.main(Main.java:6)
妙なのは、Subの書き方を少し変えると大丈夫になる点(コメントで入っている)。インナクラスを使わずに、perform()から直接baseMethod()を呼ぶと、大丈夫。
public void perform() {
baseMethod();
}
インナクラスから、エンクロージングクラスを明示的に指定してsuper指定で呼び出せば大丈夫。
class Foo {
void foo() {
Sub.super.baseMethod();
}
}
でも、this指定だとダメ。
class Foo {
void foo() {
Sub.this.baseMethod();
}
}
たしかに、これらはバイトコードが変わっていて、ダメな場合は直接baseMethodがinvokestaticされているけど、大丈夫な場合は、access$001()が呼ばれ、そこ経由でbaseMethod()が呼ばれている。限りなくバグっぽいんだけど、これってこういうもんなんだろうか。環境:WindowsXP SP2 Java 1.6.0_04。ちなみに、各クラスのクラスローダを表示してみると、
public class Sub extends Base {
class Foo {
void foo() {
System.err.println("Foo :" + this.getClass());
System.err.println("Foo classloader:" + this.getClass().getClassLoader());
...
Sub.this.baseMethod();
}
}
public void perform() {
System.err.println("Sub :" + this.getClass());
System.err.println("Sub classloader:" + this.getClass().getClassLoader());
}
}
Sub :class Sub Sub classloader:MyClassLoader@1a758cb Foo :class Sub$Foo Foo classloader:MyClassLoader@1a758cb
同じものが使われている。
Groovyとクラスローダ
ちょっとツールを作る機会があったんで、さっそくプラグインの設定ファイルをGroovyでDSLしてみた。プラグイン読み込み用に、pluginsディレクトリの下のjarをかたっぱしから読み込んで、jarの中から設定を読んで初期化するクラスローダを作ったんだけど、デバッグしていてびっくり。例えば、FieldAnalyzerPluginクラスをロードしようとすると、
java.lang.FieldAnalyzerPlugin java.io.FieldAnalyzerPlugin java.net.FieldAnalyzerPlugin java.util.FieldAnalyzerPlugin groovy.lang.FieldAnalyzerPlugin groovy.util.FieldAnalyzerPlugin
を、えんえんとロードしようとするんだね。たしかに、これらのパッケージのクラスは、importしなくても使える仕様になっているんで、クラスローダ部分で解決しているわけだ。これ、パッケージ無しだから、まだいんんだけど、パッケージありのクラスだと、更に激しい。com.ruimo.FieldAnalyzerなんかは、上記に加えて
com$ruimo$FieldAnalyzerPlugin com.ruimo$FieldAnalyzerPlugin com.ruimo.FieldAnalyzerPlugin
を試すようだ。この$付きが、何に使用されているのかは、まだ不明。まぁ、一回ロードしてしまえばキャッシュされてしまうんで、パフォーマンス上の大きな問題にはならないようだけど、でも、これって優先順位を考えると、自分が使っているクラスと同じ名前のクラスが、将来java.utilとかに追加されてしまったら、Groovyでは使えなくなっちゃうってことだよね。それは困るなぁ。
P.S. と思ったけど、明示的にimportしていれば、そちらが使われるみたいだ。
GroovyMarkupでハイフン入りの要素を出力。
GantでdjUnitを使おうとしたら、
djunit-coverage-report(serFile: 'jcoverage.ser', srcdir: Path.SRC_DIR,
destdir: Path.COVERAGE_REPORT_DIR) {
classpath(refid: Path.TEST_CLASSES_DIR)
}
ま、当然だけどハイフン入りはダメだ。要は、これは、引数がハッシュとクロージャのメソッド呼び出しなので、以下のようにすれば良いみたいだ。ちょっと不恰好だけど。
Ant.invokeMethod('djunit-coverage-report', [[
serFile: 'jcoverage.ser', srcdir: Path.SRC_DIR, destdir: Path.COVERAGE_REPORT_DIR], {
classpath(refid: 'test.classpath')
}
])
invokeMethodの引数は、メソッド名と、引数オブジェクトなんで、第二引数には、ハチミツとクローバハッシュとクロージャを格納した配列を渡している。2番目のところを[]で、くくってやらないと、なぜかinvokeMethodという名前の要素が出力される(なんで??)。
メソッド名自体は、ハイフン入りでもいいんだね。
プリンタがやばい。
BTR2 ERRORとか出るようになった。どうも定着ローラの修理が必要のようだ。ん〜、定価の高いプリンタだから修理代かかりそうだな。というか、まだ修理できるんか? これ? とはいえ、このプリンタ、捨てるのにも、やたらとお金かかりそうだし。電源入れ直したら、直ったから、しばらくは、だましだまし使うことにしよう。
猫バリケード
猫バリケード完成。って、キミキミ、頭がたかぁい!

とりあえず、これでF1連打でヘルプ連続攻撃とか、PrintScreen連打で、大量のスクリーンショット生成地獄からは開放されそう。でもマウスカーソル追ってるなぁ。バシっとやってくれるなよ。古い方のディスプレイは、既に猫の爪あと入りだ。

Xあがらず
そういえば昨日、なんかアップデートが入ったなと思って、Synapticから履歴を見ると、xserver-xorg-coreとxserver-xorg-devがubuntu 8.1からubuntu 8.3に上がっている。どうも、これがnvidiaのドライバと合わないみたいだ。nvidiaのサイトに行ってみたけど、まだ古いドライバしかないみたい。とりあえず古いxserverを探し中。
Synapticにバージョンの固定というのがあったので、試してみたらubuntu8かubuntu8.3しか選べない。ubuntu8に戻したら、やっぱりだめ。困ったもんだ。
そういえばNVIDIAのドライバをインストールした時、何やらコンパイルしていたなと思い、xserverを8.3にした上で、もう一度NVIDIAのドライバを上書きでインストールしてみたら、直った。やれやれ。
Gantのパス設定
やっぱり、せっかくFileというクラスがあるんだから、パス設定はFileのインスタンスでやるべきな気がしてきた。これならプラットフォームによるパスセパレータの違いとか気にしなくていいしね。幸いAnt呼び出しの時はFileオブジェクトで渡しても大丈夫みたいだ。ただdirディレクトリの下のfileファイルみたいな時に、
File dir = new File('dir')
File file = new File(dir, 'file')
というのは、なんとも煩雑で、イケてない感じだなぁと思ったんだけど、あ、そうか、これはGroovyだった。
File.metaClass.plus = {String child -> new File(delegate, child)}
File dir = new File('dir')
File file = dir + 'file'
println file
$ groovy test.groovy dir/file
うん、うまくいった。
SunがMySQL買収?
ちょっと意外だ。買ってどうするんだろ。RDBからアプリケーションサーバ、Solarisまでをセットにした、設定簡単なオープンソーススイートを提供とかかな。あ、ちょっと魅力的に思えてきた。
今日はTwitterFoxの調子が悪い。
findbugsのGUIが遅い。
久しぶりにFindBugs-1.3.1を落としてきて、GUIモードで立ち上げようとしたら、えらく遅い。CPUが100%に張り付いている。Java5だと大丈夫でJava6だと遅い。NetBeans profilerで見てみると、sun.awt.shell.Win32ShellFolder2で、やたらと時間をとられている。
で、Bug paradeを見ると、この辺とか、この辺が関係しているみたいだ。どうやらディレクトリを見に行った時、WindowsXPのzipフォルダ機能が働いて、そこにあるzipファイルを展開しようとするので、やたらと遅いらしい。で、デスクトップにあるファイルを掃除するか、
regsvr32 /u %windir%\system32\zipfldr.dll
で、zipフォルダ機能を殺せば、回避できるようだ。
Ubuntuとサウンドカード
結構有名らしいけど、Linuxで複数のサウンドカードをつないでいると、認識の順番がコロコロと変わる。うちのマシンはマザーボードに積まれているやつ、USB Audio(音楽鑑賞用)、USB Midiが認識されていて、/proc/asound/modulesは3つ表示される。
0 snd_hda_intel 1 snd_usb_audio 2 snd_usb_audio
で、この順番がコロコロ変わるのだ。mplayerなどでの演奏なら、番号が変わっても、大した問題ではない。aplay -lでデバイスの名前を見て、
**** ハードウェアデバイス PLAYBACK のリスト **** カード 0: Intel [HDA Intel], デバイス 0: ALC883 Analog [ALC883 Analog] サブデバイス: 1/1 サブデバイス #0: subdevice #0 カード 0: Intel [HDA Intel], デバイス 1: ALC883 Digital [ALC883 Digital] サブデバイス: 1/1 サブデバイス #0: subdevice #0 カード 1: Audio [YAMAHA DP-U50 USB Audio], デバイス 0: USB Audio [USB Audio] サブデバイス: 1/1 サブデバイス #0: subdevice #0 カード 1: Audio [YAMAHA DP-U50 USB Audio], デバイス 1: USB Audio [USB Audio #1] サブデバイス: 1/1 サブデバイス #0: subdevice #0
この"Intel"とか"Audio"という名前を使えば良い。
mplayer -ao alsa:device=hw=Intel no08-1.mp3
問題は、YouTubeみたいにブラウザから直接ストリーミングで再生するようなケースで、これはデバイス番号0決め打ちのようで、設定ができない。で、腰を据えてちょっと調べてみた。
このあたりの情報によると、/etc/modprobe.d/soundにデバイスごとにindexを書いてやれば、その順番に認識されるとある。しかし、今回はusb-audioが2つあって、色々試してみたけど、うまくいかなかった。
そういう場合についてはMultipleUSBAudioDevicesに書いてあった。まずlsusbで、USBの情報を表示する。
Bus 001 Device 006: ID 0424:2228 Standard Microsystems Corp. Bus 001 Device 005: ID 0424:2503 Standard Microsystems Corp. Bus 001 Device 003: ID 0424:2504 Standard Microsystems Corp. Bus 001 Device 001: ID 0000:0000 Bus 008 Device 003: ID 152d:2338 Bus 008 Device 001: ID 0000:0000 Bus 007 Device 001: ID 0000:0000 Bus 002 Device 002: ID 046d:c51a Logitech, Inc. Bus 002 Device 001: ID 0000:0000 Bus 003 Device 002: ID 0499:3102 Yamaha Corp. Bus 003 Device 001: ID 0000:0000 Bus 005 Device 004: ID 0582:0009 Roland Corp. Bus 005 Device 001: ID 0000:0000 Bus 006 Device 001: ID 0000:0000 Bus 004 Device 001: ID 0000:0000
IDの後にあるのが、デバイス識別用のベンダIDと、プロダクトIDだ。YamahaがUSBオーディオで、RolandがMIDIなので、0499:3102, 0582:0009がそれになる。
で、USBのドライバの情報をmodinfo snd-usb-audioで表示すると、最後の方にパラメータの説明が表示される。
parm: index:Index value for the USB audio adapter. (array of int) parm: id:ID string for the USB audio adapter. (array of charp) parm: enable:Enable USB audio adapter. (array of bool) parm: vid:Vendor ID for the USB audio device. (array of int) parm: pid:Product ID for the USB audio device. (array of int) parm: nrpacks:Max. number of packets per URB. (int) parm: async_unlink:Use async unlink mode. (bool) parm: device_setup:Specific device setup (if needed). (array of int)
これまで見た説明はindexを使用したものだったけど、これ以外にもvidとpidでベンダIDとプロダクトIDを指定できることが分かる。そこで、/etc/modprobe.d/soundを以下のように編集。
options snd_hda_intel index=0 options snd_usb_audio index=1,2 vid=0x0499,0x0582 pid=0x3102,0x0009
めでたく、3つのデバイスが思った通りの順序で認識されるようになった... ように見える。今のところ。しばらくは、これで様子見だな。
Magicolor 330
うちにあるプリンタは、昔Unoさんとこで買った、コニカ・ミノルタのMagicolor 330というA3まで印刷できるカラーレーザ。あまりに巨大で、電源上げると部屋の電気が暗くなるのと、両面印字機能が無いのが玉に瑕ではあるけど、当時確か3万くらいで買った(というか譲り受けたような)ものなので、十分過ぎる程、元はとれている。まだ最初に装填したトナーも7割ほど残っているしね。で、日本のサイトにはLinuxドライバがないんで、Ubuntuから使用するのは、あきらめていたんだけど、なんかUSのサイトには、ドライバが置いてあったので、Ubuntu 7.10にインストールしてみた。
サイトにあるのは、ppdファイルで、Ubuntuではシステム->システム管理->プリンタで、新規プリンタを選び、LPD/LPR Host or Printerを選択。IPアドレスを入れて、ドライバにppdファイルmqc330j2.ppdを指定してやるだけで、使えるようになった。
ネットワークプリンタなので、VMWare上のWindowsからも、普通にWindows版のドライバを入れれば利用可能だ。
Groovyと定数
gantで設定を外に出すとして、antプロパティも使えるんだけど、やっぱりGroovyで設定した方が柔軟だよねぇ。でもGroovyって定数は定義できないんだろうか。
final I = 10 I = 2 println I
$ groovy test.groovy 2
groovycでコンパイルしてみると、これってrun()メソッドのローカル変数になっているようだ。考えてみると、finalなローカル変数って、クラスファイル上は情報が残ってなくって、javacレベルでのチェックのみなのか。
クラスにすれば大丈夫みたいだ。
class Path {
static final TMP = '/tmp'
}
Path.TMP = '/home'
println Path.TMP
$ p:/tmp$test.groovy
Caught: java.lang.IllegalAccessException: Can not set static final java.lang.Object field Path.TMP to java.lang.String
at test.run(test.groovy:5)
at test.main(test.groovy)
クラスにしておいて、importというのが無難かな。
OpenOfficeとuim
OpenOfficeとuimの組み合わせ、漢字入力でハングすることが分かった。でも、デスクトップ(Ubuntu 7.10 64bit)では、ちゃんと動いているんだよね。Ubuntu 7.10 32bitの方だけダメみたいだ。
で、困ったなと思って、アプリケーションの追加と削除のところを、つらつらと見ていたら、IncscapeInkscapeというのが目にとまったので、導入してみる。
え? 何、これ、すごくいいね。びっくり。MS Officeとのファイル互換性にこだわらなければ、実は、結構いいソフトがあるのかな。ヘルプも、すごく充実してるし。しばらくはドロー系は、これで行ってみようかな。難点はPDF出力が無いことくらいか。
P.S. と思ったら、PDFも可能のようだ。
Connection.isValid()
Java 6から追加された、Connection.isValid(int)。これでStale状態になったConnectionに対してrollback()とか発行してエラーになるのを防げるので、歓迎なんだけど、
SQLException - if the value supplied for timeout is less then 0
いや、そういうプログラミングエラーは、IllegalArgumentExceptionでしょ。なんでチェック例外にするんだよ。また余計なtry-catch書かなきゃならないじゃん。もう。
%sの幅指定に0は許されない。
階層構造を表示する時、インデントを付けたい時に、今までは、
void print(Node node, int indent) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < indent; ++i)
buf.append(' ');
System.err.println
(buf.toString() + node);
...
}
みたいなことをして、空白文字を連ねて作っていたのだけど、そういえば、printf()があったなぁと思って、
System.err.printf
("%" + indent + "%s%s%n", "", node);
としたら、
Exception in thread "main" java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags = 0 at java.util.Formatter$FormatSpecifier.failMismatch(Formatter.java:3988) at java.util.Formatter$FormatSpecifier.checkBadFlags(Formatter.java:2904)
0は許されないみたいだ。惜しい。
NetBeans6のGlassfishコンソール
どうも、無用に改行が入るみたいだ。
long start = System.currentTimeMillis();
...
System.err.printf
("Elapsed %d ms.%n",
System.currentTimeMillis() - start);
とすると、
Elapsed 1 ms.
みたいになる。ためしに、
System.err.print("Hello");
System.err.print("World");
とすると、
Hello World
あぁ、やっぱり改行が入りますな。
RMI
確か、最近はrmicいらなくなったんだよねってことで試すも、Stubが見つからないというエラーで悩む。と思ったら、こんなところに書いてあった。
The static method UnicastRemoteObject.exportObject(Remote) is declared to return java.rmi.server.RemoteStub and therefore cannot be used to export a remote object to use a dynamically generated stub class for its stub. An instance of a dynamically generated stub class is a java.lang.reflect.Proxy instance which is not assignable to RemoteStub.
Stubをダイナミックに作りたい時は、exportObject(Remote)じゃだめよってことらしい。で、正解はexportObject(Remote, 0)のようだ。そういうことは、ちゃんとAPI仕様書に書いておいて欲しいなぁ。
Servlet復習
う〜む、NetBeans 6でサーブレット作ると、雛形ではHttpResponse.getWriter()でとったHttpResponseを最後にclose()するんだけど、これってclose()するもんだっけ。
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet HelloServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet HelloServlet at " + request.getContextPath () + "</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
というか、あれだ、API仕様書に、どうすべきか明確に書いてないのが悪いんだよな。「flush()するとコミットされますよ」としか書いてない。でも裏を読めばclose()はいらないともとれるか。なんとなくgetXXX()でとったものを、close()するのは抵抗あるんだけど。逆にopenXXX()でとったものはclose()が必要に感じる。
P.S. と思ったけど、java.sql.Connection()は、getConnection()したものをclose()するか。ストリーム系も、基本的にnewしたものをclose()だし、Javaだと、むしろopen() - close()ってパターンは少ないかも。
android
毎回emulatorを立ち上げ直していて「遅いな〜」とか言ってましたよ。プログラム修正した時は、emulator上げっぱなしで、いいのね。なんかlandscapeモードだと、ボタン押しても反応しなかったりすることが多いようだけど、Linux版だけかな。
SQLiteがプラットフォームに組み込みで、RDB前提にしていいのは助かるけど、しかしまぁDBアクセスもJDBCじゃない独自の方法を使うんだね。なんで、ここまで独自にしちまったんだろうか。Symbianとかのプログラミングモデルが、こんな感じで、真似をしたとかなのかな。
携帯端末用だけど、@Overrideとかジェネリクスが普通に使えるのは、なんだか妙な感じで落ち着かない ^^; (いや、もちろん使えた方がいいに決まってるんだけど)。
preferredSize
JavaFXでのpreferredSizeの指定はDimensionだから、こうかと思ったら、
preferredSize: Dimension {width:100, height:20}
Dimensionは省略して書くようだ。
preferredSize: {width:100, height:20}
なんでだ〜。こういう暗黙のルールは、どこに書いてあるんだろう。
JavaFX
なんかEclipse用のプラグインだと動かないな。Eclipse 3.3だとダメなんだろうか。とりあえずNetBeans 6では問題無く動いた。{...}で、インスタンスのnewと、プロパティ設定をまとめてやるという構文は面白いね。jaxbと組み合わせれて、XHTMLのレンダリングとかさせると、すっきり書けそうな気がする。って、クライアントサイド用の技術でしたな。ただ、for文の
for (i in [0..10], j in [0..10]) {
// 二重ループ
}
for (i in [0..10] where i % 2 == 0) {
// 偶数の時だけ
}
みたいなのは、個人的には、気持わるいっす。
まぁ、肝は、モバイルからPCの環境まで、スペックの違いをいかにスクリプト言語で吸収できるかってところなんだろうな。
久しぶりにAppletを復習したり。
一時はOBJECTタグの使用が推奨されていたと思うんだけど(ブラウザ組込みの古いJavaが起動しないように)、知らないうちに、またAPPLETタグが推奨になっていたり。
しかしLinux版のfirefoxは、ちょっとAPPLETタグの設定にミスがあるとブラウザごとハングするのが手に負えない。そういえばLinux版ってJava console無いんだろうか。
APPLETタグのcode属性に何を設定すべきかで、悩む。ここには、
This attribute specifies either the name of the class file that contains the applet's compiled applet subclass or the path to get the class, including the class file itself. It is interpreted with respect to the applet's codebase. One of code or object must be present.
と書いてあるから「クラスファイル名か、クラスファイルへのパス」らしいんだけど、なんだか意味不明な表現だよね。「クラス名か、クラスファイルへのパス」なら分かるんだけどさ。で、firefoxでは、"package/Sample.class"と書いても、"package.Sample"と書いても大丈夫みたいだ。まぁ仕様書の方を尊重して"package/Sample.class"にしておくか。
ねこ鍋
これまで使っていた鍋のヒビが、かなり進行してきたので買い替え。で、試しにストーブ前に設置してみた。
キター! こいつは春から縁起がいいね。
ちょっと窮屈そう?
君は使い方違うから。いやまぁ、それを言ったら、どれも間違ってるわけだが。











