Diary/2007-4

1
気づいたら
23
Fedora Core 6
4
続Fedora Core 6
5
Mailer On Eclipse 0.1.5
67
鯉のぼり
8
Mailer on Eclipse
9101112
可視化ツール
13
Mailer On Eclipse 0.1.8
14
15
イージー
1617
カーネルのコンパイル
1819
Jarのマニフェストをいじる
2021
2223
Swingとスレッド
24
軽井沢
25262728
2930

Diary/2007-4-24

軽井沢

発表無事終了。
発表終了後にもう少し説明しやすい図を思いついたり。
今回は(も?)割と騒いだので、
前より先生方に覚えてもらえたかな?

家に帰ったら

子供には忘れられていたのかも.
大泣きされてしまいました.

Diary/2007-4-23

Swingとスレッド

Swingに関する処理はSwingのイベント・ディスパッチ・スレッドで
実行しなくてはならない。
で、このイベントディスパッチスレッドをmainスレッドとは別にするために、
GUIを構築するコードをmainスレッドから直接呼び出すのではなく、
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MySwingApp();
            }
        });
    }
とか、invokeLaterを使って呼び出すようにするべきのよう。
こうするとmainスレッドとは別にイベント・ディスパッチ・スレッドが
生成されることになる。
Swing使ったソフトで何やら挙動不審な動作をしていたのは、
Swingのスレッドまわりの勉強不足によっていたのかなぁ。
気づいたものから置き換えていこう。
http://java.sun.com/docs/books/tutorial/uiswing/components/examples/index.html#ScrollDemo
http://itpro.nikkeibp.co.jp/article/COLUMN/20070413/268205/
http://www.pc-view.net/article/162/2.html

CSTコンペ

http://www.ieice.org/~cst/compe07/
マルチカーエレベーターの最適制御。
面白そう。

Diary/2007-4-19

Jarのマニフェストをいじる

マニフェスト中の、特定のキーの値が欲しいとき
 Manifest manifest = jf.getManifest();
 Attributes ma = manifest.getMainAttributes();
 String classpath = (String)(ma.getValue("Class-Path"));

COINSを実行可能JARから利用する

実行可能なJarファイルでは、manifestのClass-Pathで必要なライブラリへの
パスを通すことができる。
したがって、COINSを自分でつくったアプリケーションから使う場合、
COINSをビルドしてjarにしたファイル
(COINSで配布されているjarではなくてclassesの下だけをjarにしたもの)
に対して、manifestでclass-pathを指定すればよいはずである。
が、Unix系(Linux、FreeBSD、MacOSX)ではうまく動かなかった。
# なぜかWindowsXPではうまく動いた。
これは、manifestの中のClass-PathがJavaのプロパティであるjava.class.pathに
含まれないために、COINSの中でクラスを動的にロードしようとしても
当該クラスをみつけることができないことに起因していた。
というわけで、これを回避するために、ちょっとハックしてみた。
coins-1.4.2.2-ja-searchClass_resursive.patch
COINSのディレクトリの中で、
 patch -p0 < coins-1.4.2.2-ja-searchClass_resursive.patch
とすれば適用できる。

COINSを実行可能JARから利用するための作業工程

たとえば、
 wallet.jar
 lib/coins.jar
というようなディレクトリ構成にしていて
wallet.jarは実行可能jarファイルで、manifestファイルで次のように
 Manifest-Version: 1.0
 Main-Class: net.wasamon.wallet.WalletGUI
 Class-Path: lib/coins.jar
Class-Pathにlib/coins.jarをちゃんと指定していても
 java -jar wallet.jar
としてLinuxやFreeBD、MacOSXで起動しようとすると
次のような例外が発生して実行できない。
ちなみにWindowsでダブルクリックするとなぜか実行できる。
 Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: coins.driver.SuffixFactory
	at coins.driver.CompilerDriver.initializeSuffixFactory(CompilerDriver.java:81)
	at coins.driver.CompilerDriver.<init>(CompilerDriver.java:184)
	at net.wasamon.wallet.WalletDriver.doCompile(WalletDriver.java:156)
	at net.wasamon.wallet.WalletGUI.actionPerformed(WalletGUI.java:204)
ちなみに、
 java -cp wallet.jar:lib/coins.jar net.wasamon.wallet.WalletGUI
とした場合には、ちゃんと実行できる。
もちろん、coins.driver.SuffixFactoryはcoins.jarに含まれている。
で、みてみると、coins.driver.CompilerDriver.initializeSuffixFactoryで
getAttachedFileInputStream(Class String)という関数を呼び出していて、
このメソッドが原因となる例外を発生している。
このメソッドでは、
System.getProperty("java.class.path")で得られる
パスから、該当するクラスを検索するために
ディレクトリあるいは、jarファイルであっても求めるクラスを探す
searchClassメソッドを呼び出し、この戻り値が全て偽の場合に、例外が投げられる。
ここで問題となるのは、
 java -jar wallet.jar
として起動した場合には、System.getProperty("java.class.path")で得られるのが
wallet.jarだけであるということ。
たしかに、これじゃあ、coins.jarの方は検索していないわけだから見つかるはずもない。
なのでmanifestで指定したClass-Pathファイルについても検索してもらう必要がある。
たとえば、こんな感じ。
 Manifest manifest = jf.getManifest();
 Attributes ma = manifest.getMainAttributes();
 String classpath = (String)(ma.getValue("Class-Path"));
Attrubutesには、get(Object)というメソッドもあるが、getValue(String)でないとダメ。
で後は、ここで得られたclasspathを空白で分割して、
それぞれについて再帰的にsearchClassを検索すればいい。
幅優先で探索するべきなのかもしれないけど、まあ、とりあえず深さ優先で。
ちなみに、オリジナルのsearchClassは、真偽値を返すメソッドだが、
これでは、新しくmanifest中のClass-Pathから得たパスを返すことができないので、
真の代わりにパスを文字列で返し、偽の場合はnullを返すようにした。
Java
COINS

Diary/2007-4-17

カーネルのコンパイル

http://memo.blogdns.net/kernelsource.htmlや
http://bbs.fedora.jp/read.php?FID=9&TID=4013を参考に。
makeとかgccとかは、既にインストールしていたので、
SRPMを操作するツールとかをインストールして設定
 yum install rpmdevtools
 rpmdev-setuptree
ホームディレクトリにある、rpmbuild以下で作業をすることになるようだ。
http://download.fedora.redhat.com/pub/fedora/linux/core/updates/6/SRPMS/
からカーネルのSRPMをダウンロードしてきて
 rpm -Uvh kernel-2.6.20-1.2944.fc6.src.rpm
で展開。~/rmpbuild/SPECSの下で
 rpmbuild -bp --target i686 kernel-2.6.spec
とすると、~rpmbuild/BUILD/kernel-2.6.17/linux-2.6.17.i686/に
ソースが展開される
 cp configs/kernel-2.6.17-i686.config .config
で、現在のconfigファイルをもってきて、
さらに、MakefileのEXTRAVERSIONに適当に-miyo0とか指定。
後は、
 make oldconfig
 make bzImage && make modules
rootになって
 make modules_install
 make install
grubのメニューなんかも一緒に更新してくれる
Linux

Diary/2007-4-15

イージー

なんかちょっといろいろイージーに考えやすいというか,
「のぼせもん」なのは,昔からの悪い性根.
もっと真剣にならねば.
いろいろ今月はやらないといけないことが多いので,
順々にきちんと片付けていこう.

Diary/2007-4-13

Mailer On Eclipse 0.1.8

Mailer On Eclipseの0.1.8をリリース.
ひらの君と,だらだらとコード書き.
でも,サマリアップデートの別スレッド化や,
メールサマリへの検索ができるようになってだいぶ便利に.
特に別スレッドでサマリアップデートするようになったために
bmobileみたいな遅い回線でメールを受信している間でも
Eclipseで他の操作ができるようになったのは便利.
...でもまだEclipse上のWebブラウザで
GMailとかの方が便利なんだよなぁ,きっと.
次はキャッシュだ.

Eclipseでスレッド生成

というよりSWTかな.
勝手に自分で作ったスレッドの中でSWTなオブジェクトに対して
操作を行おうとすると,例外が発生する.
正しくは,runメソッドに行いたい操作を記述した
Runnableインターフェースを実装するクラスを
Display::asyncExecの引数に与えて実行してもらうようにする.
ちなみにEclipseのViewPartを継承しているクラスからは
 getSite().getShell().getDisplay();
としてDisplayのインスタンスが取得できる.

Diary/2007-4-12

可視化ツール

子供をあやしながらプログラミング...
なんてまともにできるわけもないので,
作っているコンパイラの途中結果を可視化するために,
Java3Dで作った三次元グラフツールとか,
GrinEditとかに吐き出すツールとかを生成したり.

Diary/2007-4-8

Mailer on Eclipse

Mailer on Eclipseを0.1.6にバージョンアップ。
いい加減メールがたまってきてしまったという必要にかられて
とりあえずメールの削除とフォルダ移動を実装。
さて、いよいよ次は、フィルタでの自動振り分けとかか。
しかし、そろそろローカルでのデータのキャッシュとかも考えたいところ。
Eclipseでは、たとえばInputDialogの引数で与える
IInputValidatorの実装クラスとかで入力文字列の有効/無効を判定できる。
なので、これを利用して、移動先のフォルダがあるかどうか
動的に判定するようにプログラムを書いてみたのだが...遅い。
まあ、判定の度にネットワークアクセスすれば遅いよな。
というわけで、今はその機能はオフにしていますが、
他にもいろいろデータをキャッシュしておくと便利そう。

なんとなく

年度末、年度始のごたごたが一段落した(つもりになった)からか
だらだらしてしまった一日。

Diary/2007-4-7

鯉のぼり

まさか、鯉のぼりを買う日がくるとは。
とはいえ、ベランダにこじんまりと収まりのいい奴。
すぐに子供の方が大きくなってしまいそう

サークルの先輩と

久しぶりにご飯を食べに。
アルバイトなどでお世話になっていた頃は
しょっちゅう、いろいろ話を聞かせてもらえていたのだが、
アルバイトをやめてからは、
なかなかそういう機会もなく、実に一年ぶりくらい。
近況を尋ねたり、面白い遊びについて相談してみたり。
キーワードは聖徳太子。

夜は短し歩けよ乙女

テレビでタイトルを聞いた瞬間に、読みたくなってしまった小説。
独特の文体で彩られた独特の世界観に飲み込まれてしまい
あっという間に読み終えてしまいました。
時代は現代かもしれないけど、異次元的だよなぁ。
と、振り返りながら、村上春樹のダンスダンスダンスを
読み返したくなってきた。

Diary/2007-4-5

Mailer On Eclipse 0.1.5

Mailer On Eclipseを0.1.5にしました。
添付ファイルを送信できるようにしたり、
サブジェクトなどの日本語が部分的あるいは、
複数回エンコードされている場合にも対応。
フォルダ操作はまだできないのでINBOXフォルダに
メールたまる一方だけど、普段使いには困らない...かな。
もう少しUIとか工夫...するくらいなら0.2.x系に移行だな。

Diary/2007-4-4

続Fedora Core 6

Fedora CoreというよりFedora Core上のEclipseで、
Mailer On Eclipseでメールを送ろうとしたら、
 java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
 at java.util.Properties.getProperty(libgcj.so.7rh)
 at javax.mail.Session.getProperty(Session.java:861)
 at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:333)
 at javax.mail.Service.connect(Service.java:275)
 at javax.mail.Service.connect(Service.java:156)
 at net.wasamon.mailer.driver.SMTPClient.sendMessage(SMTPClient.java:60)
というエラーで送れない。
どうやら、SMTP AUTHのためにJavaMailに指定しているプロパティ値のようだ。
ちなみに、同じキャストによる例外は、
プラグインをパッケージングしようとするときにも発生する。
でもテスト用のワークベンチ上だと、ちゃんと送れる。

解決

Eclipseと、gcj関係のパッケージを全て削除して、
SunのJ2SDKと、eclipse.orgで配布されているバイナリで試したら解決。
確かに、起動は、FedoraCoreパッケージ版のが速かったなぁ。
ついでに、OpenOfficeも削除されてしまったのが、ちょっと残念。
まあ、使わないからいいけど。

Diary/2007-4-3

Fedora Core 6

いろいろあって、結局メインで使うコンピュータに
FedoraCore6をインストールしてみた。
マシンが速くなったからか、MacOSXなどで慣れたからか、
GNOMEなインターフェースも恐くない。
とりあえず、パッケージでEclipseを入れてみたら
gcjが入ってて、ソースが軒並コンパイルできなくて、びっくり。
sunのJavaいれて、Eclipseの設定を5.0用に変えて、解決。
ちなみにEclipseのプラグインを開発するためには、
 yum groupinstall Eclipse
とするだけでは、ダメで、
 yum install eclipse-pde
とか別途インストールする必要があるようだ。
emacsとかzshとかTgifとかいれて、満足。
あと,Acrobat Readerを起動するとexprが延々エラーを吐くのは
 http://bbs.fedora.jp/read.php?FID=5&TID=4123
を参考に,起動スクリプトを変更.

Mailer On Eclipse 0.1.4

Eclipse上でメールが読みたくて書いているプラグインMailer On Eclipse
添付されたデータを保存できるようにしたので、
とりあえず受信に関しては問題がなくなったかな。
あとは、フォルダ操作とかがあれば、常用に耐えるのか?
でも将来的にスレッド表示とか、キーボード操作とかすることを
考えると、もう、ちゃんとエディタを定義する方向で実装しないと、な。

Diary/2007-4-1

気づいたら

4月。
特に面白い嘘をつくまももなくエイプリルフールが終わった。

Copyright (c) 2001-2008 Takefumi MIYOSHI, All rights reserved