N2 ToolBox(跡地)

跡地です。引っ越しました。http://d.hatena.ne.jp/nosen

Scala: Manifest

2008-12-04 20:30:50 | オープンソース
Manifests: Reified Typesで紹介されているScala2.7.2の隠し?新機能が自分的にヒットです。

Java の Generics はコンパイルされてバイトコードになると消えてなくなってしまうものでした。そのため、実行時にパラメータ型が実際どの型になっているのかを知る手段がありませんでした。

たとえば、

----
public <T> T hoge()
----

というメソッドがあったとき、
hogeメソッドの実装は今、このTの実際の型をどうがんばっても取得できなかったのです。
なので、hogeの中でTの型を知りたいときは、

----
public <T> T hoge(Class<T> type)
----

のように引数にClassを渡す必要がありました。

この問題を解決するため、 Scala 2.7.2からは、scala.reflect.Manifestという
クラスを暗黙のパラメータとして引数に指定しておくと、
呼び出し側では、明示的にパラメータを渡さなくても、

勝手にManifestのインスタンスを渡してくれるし、
このManifestのインスタンスから、Tの実行時のクラスも取れるということです。

まだ実験的なものなので、Undocumentedな状態らしいですが。

Scalaによるダイエット

2008-12-02 23:01:35 | その他
またしてもBlogを書くのをさぼってしまいました。
別に仕事が忙しかった訳ではないし、書くネタもそれなりにあったのですが。。

それはそうと、最近ものすごく太ってしまったので、またダイエットにチャレンジすることにしました。
以前RubyでBlogから体重を拾ってきてグラフにするスクリプトを書いたのですが、
それのScala版を書いています。

だいぶScalaにも慣れてきました。やっぱりScalaはものすごく面白いですね。
いちいちニヤリとしてしまう文法が満載です。
ただ、Javaをちゃんとわかった上でScala的な部分を理解しないといけないので、学習コストは高いのかもしれません。
自分も、先にHaskellを勉強してなかったら理解が遅くなっていた部分がかなりあるような気がします。

今とりあえず、グラフを画像で出すところまでは出来ていて、あとFTPでサーバにあげるところを
書けば完成です。

難しかったのはScalaというよりもむしろJFreeChart。初めて触ったけど、APIがややこしいです。

あと、うちのMacOS Xでは、ImageIOでgifもjpegもうまく出力できなくて、pngを試してやっとうまく行きました。
Windows上では普通にgifを出力できるのに。

ImageIO#getWriterFormatNamesというメソッドで、ImageIOがサポートする画像のフォーマットの一覧が
取れるのですが、gifはそこに入っていなかったので、まぁそれは私が悪いということにしましょう。

しかし、ImageIO#writeメソッドで画像をファイルに書き出そうとしたときに、
何の例外も投げずに、こっそりfalseとかを返して静かに失敗するのはいかがなものか。

あと、jpgについてはサポートされているはずなのに、なんでか真っ黒な画像が出力されてしまいました。
pngを試したらうまく行ったので、細かい原因は調べておりません。

とはいえ、やはり既存のJavaのライブラリが使えるというのは、大きなメリットだと感じました。
ランタイムから完全に新しい言語だと、JFreeChartのようなややこしいことをするライブラリは
なかなか出てこないでしょうから。。