2005-01-01 [長年日記]
@ 2005年到来
明けましておめでとうございます。今年は(も)みなさんにとって良い年でありますように。
@ なんか
あれですね、日記上部のカレンダーが2005年1月になっていると「2005年来たー」っていうのを実感します。病気かな...
2005-01-05 [長年日記]
2005-01-06 [長年日記]
2005-01-07 [長年日記]
@ ちなみに
nCommonsはまだアルファ版です。品質が悪いという意味ではなく*1、APIが固まっていないという意味でです。ただし、APIガイドにあるものは変わることはないと思います。
*1 ちょっと心配ですが
@ [pc] Dual Opteronに対応したキューブPC「ZMAXdp」がデビュー
DualコアのOpteronってもう出てるんでしたっけ??
2005-01-08 [長年日記]
@ [mysoft] nCommons 0.2.0リリース
nCommonsはまだアルファ版です。品質が悪いという意味ではなく*1、APIが固まっていないという意味でです。ただし、APIガイドにあるものは変わることはないと思います。
と言いながら早速バグが1件...さらにクラスを1つリネーム。ダメだこりゃ。
@ [cygwin] cygwinプログラミング
CygwinのGCCでのDLLの作り方とか載ってます。
@ [java] Cygwin上のGCCでJNIのDLLを作成する
眠いのでとりあえずメモ。(Java Forumsより)
$ gcc -mno-cygwin -shared -o DLLファイル \ -I$JAVA_HOME/include -I$JAVA_HOME/include/win32 \ -Wl,--kill-at ソースファイル
2005-01-09 [長年日記]
@ [cygwin] cygwin1.dllに依存してないことの確認
をしたかったので、Cygwin上のGCCで作ったバイナリをCygwinがインストールされてないマシンで実行していたのですが、よく考えたらバイナリを実行する前に
cygwin1.dllをリネームしておけばいいだけ
でした...鬱
@ [mysoft] nCommons 0.3.0 リリース
「Javaで環境変数を取得する」機能を実験的に実装してみました。ただし、マルチバイト文字を正しく扱えない、WindowsとLinuxでしか使えないなどの制限はあります。
マルチバイト文字が扱えないのは、JNIで文字列を変換する必要があるのですが、これが面倒そうなのでサボっているだけです*1。今はUTF-8を使っているため、ASCIIの範囲ならば大丈夫なはず。日本人が作ってるのに日本語も使えないようではカッコ悪いので、暇を見付けて取り組んでみようと思います。
あとは共有ライブラリ(DLL)のビルド。今は g++ でリンクまで一気にやっているのですが、本当は autoconf, automake, libtools を使って他のUnixやコンパイラでもビルド出来るようにしたいです。それとVC++でのビルドも。
*1 ちゃんとわかってない、っていうのもあります
NetBSDが多くのアーキテクチャをサポートしているのもすごいですが、世の中に
52個ものシステムアーキテクチャ
があることにびっくりしました。
@ ちなみに
なんで「環境変数の取得」なんかをサポートしたかというと、以前この日記でこんなことを書いてしまったために、「Java 環境変数 取得」というキーワードでサーチエンジンからやって来る人が非常に多くなったんです。まぁAntを使うのも一つの手ですが、JNIで C 使って書けば簡単に解決するじゃん、ってことを思いついちゃったんで(^^; 私自身がJavaプログラムから環境変数を取得したい、と思ったことは一度もないのですが、サーチエンジンからやってくる人達の数がそりゃあもう多いので、「こういうのもあるよん」という一例の意味でやってみました。
あと久しぶりの C/C++ は結構楽しいです(^^
2005-01-10 [長年日記]
@ [java][ruby] JRubyを使ってみる(1)
とりあえずCVSからHEADをcoしてビルド。
$ ant jar ... BUILD SUCCESSFUL Total time: 9 seconds
$ java -jar lib/jruby.jar -e \
'print "Hello world with ruby #{RUBY_VERSION} #{RELEASE_DATE} #{RUBY_PLATFORM}\n"'
Hello world with ruby 1.8.2 0 java
RELEASE_DATEは設定されてないのかな。
@ [java][ruby] JRubyを使ってみる(2)
ruby-1.8.2に同梱されているライブラリが使えるかテストしてみました。
- use_csv.rb
-
if ARGV.length == 0 puts "Usage: #{File.basename($0)} CSV" exit(0) end require 'csv' CSV.open(ARGV[0], "r") do |row| p row end - test.csv
foo,bar,hoge 1,2,3
普通のrubyで実行。
$ ruby -v ruby 1.8.2 (2004-12-23) [i386-linux] $ ruby use_csv.rb test.csv ["foo", "bar", "hoge"] ["1", "2", "3"]
JRubyの場合。
$ java -jar lib/jruby.jar use_csv.rb test.csv
use_csv.rb:5:in `require': No such file to load -- csv (LoadError)
from use_csv.rb:5
「csvなんかないよ」と言われるので、LOAD_PATHを通してみます。
$ java -jar lib/jruby.jar -I /usr/lib/ruby/1.8 use_csv.rb test.csv ["foo", "bar", "hoge"] ["1", "2", "3"]
おお。普通に使えますね。
ちなみに、-Iで明示的にLOAD_PATHを通す以外に、もう1つ方法がありました。
$ ant -projecthelp ... jar.standalone Create a standalone jruby.jar file using libraries from RUBY_HOME/lib/ruby/1.8 ...
このjar.standaloneというタスクは、$RUBY_HOME/lib/ruby/1.8の下にあるファイルを解析してjruby.jarに突っ込んでおく、というものみたいです。試しにやってみます。私の環境(Debian)では、ライブラリは/usr/lib/rubyにインストールされてので、先ほどのタスクの説明にしたがってRUBY_HOMEには/usrだけ指定します。
$ RUBY_HOME=/usr ant jar.standalone ... BUILD SUCCESSFUL Total time: 19 seconds
出来上がったjarを見てみると、確かにライブラリのファイルみたいなものが入っています。
$ jar tvf lib/jruby.jar ... 8500 Mon Jan 10 15:45:12 JST 2005 ostruct.rb.ast.ser 7834 Mon Jan 10 15:45:16 JST 2005 parsearg.rb.ast.ser 2364 Mon Jan 10 15:45:10 JST 2005 parsedate.rb.ast.ser ...
というわけで、ライブラリが同梱されているjarでもう1回やってみましょう。
$ java -jar lib/jruby.jar use_csv.rb test.csv ["foo", "bar", "hoge"] ["1", "2", "3"]
おお! -Iがなくても動きました。
@ [debian][java] SargeでJDK-1.3が動かない
JDK-1.3を入れたのですが、起動しようとするとエラーが。
$ JAVA_HOME=/usr/lib/j2sdk1.3-sun ant /usr/lib/j2sdk1.3-sun/bin/i386/native_threads/java: error while loading shared libraries: libstdc++-libc6.1-1.so.2: cannot open shared object file: No such file or directory
とりあえずあるバージョンの共有ライブラリがないという話だけだと思うので、適当にsymlink張ってみると動きました。
# ln -s /usr/lib/libstdc++-libc6.2-2.so.3 \ /usr/lib/libstdc++-libc6.1-1.so.2 $ JAVA_HOME=/usr/lib/j2sdk1.3-sun ant Buildfile: build.xml does not exist! Build failed
@ [java][ncommons] java.net.URL#getPath()
このメソッドって1.3から導入されたものなんですね。nCommonsをJDK-1.2でビルドしようとしたらこれ使ってるところでコンパイルエラーが。一応標準ライブラリのクラス使うときはJavadocの「導入されたバージョン」を見ているのですが、JDK-1.3のAPIドキュメントだとgetPath()には何にも書かれてなかったので普通に使ってました。しかも今調べたらJDK-1.4のAPIドキュメントにはしっかり「導入されたバージョン: 1.3」と書かれてありました。何だよ〜。
@ [java][ncommons] Lumberjackを使う
nCommons自体はJDK-1.2以上で動作するのですが(はず)、org.homeunix.kazz.ncommons.i18n.CommonsI18nMessagesというクラスで使用しているCommons I18nがjava.util.loggingを使っており*1、結果としてJDK-1.4以上じゃないと(全体としては)動きません。しかし以前こんなことを書いたのを思い出したので、インストールしてみました。
アーカイブを解凍するとlibディレクトリ配下にlogging.jarがあるのでこれをクラスパスに含めるようにして実行すると...
java.io.FileNotFoundException: /usr/local/java/jdk-1.2/jre/lib/logging.properties
(そのようなファイルやディレクトリはありません)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:61)
at java.util.logging.LogManager.readConfiguration(LogManager.java:205)
at java.util.logging.LogManager.(LogManager.java:48)
...
と言われるので、lib/logging.propertiesを$JAVA_HOME/jre/lib/にコピー。これでうまくいきました。というわけでJDK-1.2にもフル対応(のはず)。
*1 別に使わなくてもいいと思うんだけど
@ [memo] デスマーチが起きる理由 - 3つの指標
途中まで読んで挫折。またあとで。(from BONGOLE BLOG;)
@ 車輪の再発明
私もたけぞうさんの意見に賛成。それと引用されている「プログラマーのためのプログラマー日記」の言葉も昔読んだことがあって、「まったくそうだよなぁ」と思った記憶があります。「使う」だけじゃ欧米には勝てませんって*1。作らないと!*2
nCommonsも車輪の再発明っぽい機能がいっぱいありますが、作り始めた時はCommonsにはそういうものがなかったんですよねぇ。
@ ふぅ
今日はなんかいっぱい日記書いたな。まだ書きたいことあるんですけど、明日にしよう。
2005-01-11 [長年日記]
@ AmaterasのWiki
ってoutlineプラグインが全く使われていないので使えないのかと思ってましたが、使えるんですね。危うくたけぞうさんに「outline使えるようにしてくれません?」的なメールを送りそうになりました...
2005-01-12 [長年日記]
@ [java][ruby] JRubyを使ってみる(3)
Rubyで定義したクラスをJava側から使用出来ないか試してみました。JRubyはBSFを実装しているので、スクリプトを評価した結果をJavaで受け取ることが出来ます。まずは下記のclass.rbを作ってみます。
class Foo
def hello
return "Hello world!"
end
end
Foo.new
スクリプトの最後でFoo.newしているのは、JavaからBSFManager#evalした時に戻り値を得るためです。これがないとただのクラスの定義になってしまうので、evalの結果がnullになります。
Java側のコードは下記のようになります。examples/jrubyというパッケージの下にRuby2Java.javaとして作成しておきます。
package examples.jruby;
import java.io.*;
import org.apache.bsf.BSFManager;
import org.jruby.RubyObject;
import org.jruby.javasupport.JavaUtil;
import org.jruby.runtime.builtin.IRubyObject;
/**
* RubyオブジェクトのメソッドをJavaから呼んでみるテスト。
*/
public class Ruby2Java {
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.out.println("Usage: java examples.jruby.Ruby2Java FILE");
System.exit(1);
}
new Ruby2Java().execute(args[0]);
}
private void execute(String file) throws Exception {
BSFManager.registerScriptingEngine(
"ruby", "org.jruby.javasupport.bsf.JRubyEngine", new String[] { "rb" });
BSFManager manager = new BSFManager();
String script = loadScript(file);
System.out.println("--- script ---");
System.out.println(script);
Object result = manager.eval("ruby", "(java)", 1, 1, script);
IRubyObject foo = (IRubyObject)result;
// Foo#helloを呼ぶ
IRubyObject ro = foo.callMethod("hello");
String message = (String)JavaUtil.convertRubyToJava(ro, String.class);
System.out.println("message = " + message);
}
private String loadScript(String file) throws IOException {
BufferedReader r = new BufferedReader(new FileReader(file));
StringBuffer sb = new StringBuffer();
for (String line = r.readLine(); line != null; ) {
sb.append(line);
sb.append("\n");
line = r.readLine();
}
return sb.toString();
}
}
実行してみます。
$ java -classpath lib/bsf.jar:lib/jruby.jar examples.jruby.Ruby2Java class.rb
--- script ---
class Foo
def hello
return "Hello world!"
end
end
Foo.new
message = Hello world!
おお! Fooクラスのインスタンスメソッドhelloをちゃんと呼び出せていますね。
2005-01-13 [長年日記]
2005-01-14 [長年日記]
@ [work] 今日も面接
ちっちゃいコンサル会社でした。主にC++でたまにJavaとかVBらしい。SI会社ではないので、技術的な部分に力を置いているわけではなさそう。ただ、業務的にパフォーマンスがとても重視されるそうので、DBのテーブル設計やSQLにはとても気を使っているらしい。
この前面接したところと比べると、どちらも条件的にはほぼ同じ*1なので、すごく悩んでます。でも今日行った会社は「将来的にはコンサルも目指せる」と言っていて、将来的なことまでかなり視野に入れているみたいでした。将来のことを考えると絶対こっちなんですけど、技術的にはあんまり面白味がなさそうなんですよね。今日中には結論を出さなきゃいけないんですが、それにしても悩ましい...
*1 通勤時間とか給料とか
@ [life] 自宅マシンのキーボード
なんかSHIFTキーの効きが悪くなっているっぽい。SHELLで & をつけたつもりが
6
となっていたりして
不愉快なことこの上ない。
この週末にでも買いに行きますかな〜。
@ [work] 結局
今日面接に行ったところは断って、おととい行った方に決めました。やっぱりまだServletとか普通の開発がやりたいんですよね。特に前の仕事はもう完全に異世界だったし、たまには世間一般の流れについて行きたいというか。でもその内飽きちゃうんでしょうけど(飽きっぽい性格)。そんなわけで来週から頑張ってこ〜。
@ [mysoft] epcb-csv
リファクタリング中。以前は何も考えずに作っていたので、データ層とかファイル読み込み/書き込み層とかに分けておらず、かなりダメダメな設計でした。DB保存ツールをJavaで作る上で細かく部品に分けているとJavaでもそいつらを流用できると思われるので*1、真面目に設計し直してコーディングしています。あとはExcel出力部分を書くだけ。
それにしても、ちょっとしたツールのはずなのにエラく面倒くさいことになっています。ExcelPettyCashBookのデータを一旦CSVに吐き出して、それを再度読み込み、新しいExcelPettyCashBookにデータを移しているのですが、読み込むExcelPettyCashBookには様々なバージョンのものがあるため*2、その差異をプログラムで吸収しなくてはいけないからです。まぁ今回のリファクタリングで大分メンテナンスは楽になると思うのですが...
@ そう言えば
jruby-uesrに「Antのcreate-apidocsタスクでエラーになる」という報告(とパッチ)を送ったのですが、音沙汰ないですね。他の人の環境では起きないのかな? それとも英語が下手過ぎただけか...
2005-01-19 [長年日記]
@ [ruby][java] JRubyで外部テキストファイルが文字化け(2)
やっぱりIOHandler#gets内で読み込んだバイトをそのままcharにキャストしていました。とりあえずIO#getsだけの文字化けを防ぐようにするパッチは下記のような感じかな。パフォーマンスとかおざなりにしているちょ〜手抜きなものですが。
--- src/org/jruby/util/IOHandler.java.orig 2005-01-15 20:49:56.000000000 +0900
+++ src/org/jruby/util/IOHandler.java 2005-01-20 00:23:47.000000000 +0900
@@ -147,11 +147,10 @@
return null;
}
- StringBuffer buffer = new StringBuffer();
-
+ java.util.List buffer = new java.util.ArrayList();
LineLoop : while (true) {
while (c != separator[0] && c != -1) {
- buffer.append((char) c);
+ buffer.add(new Byte((byte)c));
c = read();
}
for (int i = 0; i < separator.length; i++) {
@@ -160,7 +159,7 @@
} else if (c != separator[i]) {
continue LineLoop;
}
- buffer.append((char) c);
+ buffer.add(new Byte((byte)c));
if (i < separator.length - 1) {
c = read();
}
@@ -174,8 +173,12 @@
}
ungetc(c);
}
-
- return buffer.toString();
+ Byte[] tmp = (Byte[])buffer.toArray(new Byte[buffer.size()]);
+ byte[] bytes = new byte[tmp.length];
+ for (int i = 0; i < tmp.length; i++) {
+ bytes[i] = tmp[i].byteValue();
+ }
+ return new String(bytes);
}
public String getsEntireStream() {
2005-01-27 [長年日記]
@ [win] VC++のCランタイムライブラリ
とりあえずメモ。
@ [c] MinGW ランタイムリファレンス
mbstowcs関数を調べている時に偶然見つけました。
2005-01-31 [長年日記]
@ [java] VM異常終了
nCommonsで環境変数のマルチバイト文字対応をしてテストしていたら、下記のエラーが出てVMが異常終了するように。
[junit] An unexpected exception has been detected in native code outside the VM.
[junit] Unexpected Signal : 11 occurred at PC=0x400F449D
[junit] Function=(null)+0x400F449D
[junit] Library=/lib/libc.so.6
...
しかも普通にjavaコマンドでVMを起動した場合はOKで、Antから起動した場合にだけ起きるという不可思議な現象。まいったなぁ...
# 前の会社の人 [え?そうだったんだ。知らずに2年半もいまスタ]
# おいぬめ [ん、年俸制だってことを知らなかったんですか? 年俸制と言うよりは「残業代固定制」の方がしっくり来るかもしれませんねぇ..]