2003-06-02(Mon) [Edit]
■1 『パーフェクト タイ・ムービーガイド』
職場は先週、神保町から引越しちゃったので気軽にはいけないのだなあ。取扱劇場のどこかにいずれ行くだろうからその時に捕獲するか。
■2 ミッキーマウス 独占インタビュー
/.jp経由。囚われの齧歯類、著作権延長裁判を語る。
毎日毎日、ディズニーランドであのガキどもを常に笑顔で歓迎しつづけるのがどんな気分か‐ほんの少しでも‐想像できるか?煙草もやれずにだ!
私のなかでのミッキーのイメージはこういう感じ。ハウディ・ホー!
■3 温湿度履歴のMySQLへの取り込み
ケージの温湿度の記録にはUSB温度計Monitizerを利用している。こいつは温湿度の履歴を30秒おきにCSVファイルに書き出してくれる。最新の温湿度は、履歴ファイルとは別ファイルで5秒おきにこれまたCSVに書き出されている。
この温湿度管理について、日別または月別などの切り口で平均温湿度の情報をWebから把握したい要望がユーザ(って妻だが)から上がっている。なので、このファイルをMySQLのデータベースにインポートするスクリプトをRubyで書いてcronで回す。
csvとmysql-rubyライブラリのおかげでサクっと完了。素晴らしきかな、Ruby。ただ、単体テストコード書いてないんだよな。Rubyでは書き捨てスクリプトをつくることが自分のメインの使い方になっているからか、まだまだテストファーストが身についてない。こーゆうのは意識しないと身につかないんだよな。
一方、サベイランスはStruts1.1に慣れる目的でStrutsで書いている。こちらのほうはEclipseの強烈な支援があるのと、習慣づいているのでテストファーストっぽいことを実施中。Javaのほうが書くのは面倒なのに(面倒だから、か?)。げにおそろしきは習慣とIDEかな。といっても、機能テストは面倒くさがって書いてない。
RubyistならIDEはrubyeclipseプラグインよりはFreeRIDEか。真のRubyistはIDEなんて使わないヨ、という声もあるだろう。けれど、私はEclipse以降、マトモなIDEがあるならそれを使おうよ派に転向したのだ。
ところでJavaにはRubyのcsvライブラリ的な位置付けのデファクトスタンダードはあるのだろーか。ちょこっとGoogleした感触だと見つけられないのは自分の検索力の問題か。
■4 書泉ブックタワー
『Jakartaプロジェクト カンタンStruts』
cbook24.comに標題の書籍が予約受付中(2003/06/03発売)とある。フライング販売といえば書泉ブックタワー。帰宅途中に寄り道。故あってこれまで職場で参照できていたJ2EE関連の書籍が別の場所に行っちゃうことになったので、その補充を兼ねて。
──置いてなかった。ところで本書は本邦書き下ろしなのかな? Struts1.1RC1対応——という時点で既にちょっと古いのだが、2,000円だし:
また、他では触れられていない『DynaActionForm、ファイルアップロード、BeanUtils、アプリケーションの設定方法(1.1と1.0.2では大きく変わった)』も解説しています。
というのがポイントかな、と。実際のところ「第7章」がどれぐらいの分量・記述内容なのか確認したかったのだが……。 Struts(に限らないけど)は使えるだけでは勿体無い。ソースコードもあるんだし、その周辺コンポーネントを含めた設計思想に触れてこその利用価値。……とはいっても、英語を読むのは面倒くさいので、そのとっかかり/導入的な記述を勝手に期待しているのだが、『Struts in Action』の残りをとっとと読んだほうがいいのかなあ。職場に置きっぱなしで近頃開いてない。
『暗号技術大全』
こちらは書泉では既に売り場に置いてあった。山形浩生による「監訳者あとがき」を……立ち読み。現在ただいまの私には暗号だけで7,400円はちょっと手が出せない。
代わりに『不思議の国のアリス』が次の便で来るはずなので許してもらいたい(って誰に言ってんだか)。『環境危機をあおってはいけない』も予約ショッピングカートに入っていたり。たくさん出版されるのは好いのだけれど、肝心のファイナンス本はどうなっているのだろう。
2005-06-02(Thu) [Edit]
■1 車輪の再実装: 簡易DIコンテナ on Groovy
Groovyで、クラスの数が10〜15程度の規模で書かれたコードをDRY原則に従ってリファクタしていると、EoT(Ease of Testing:テスト容易性)の観点からDIコンテナが欲しくなってきた。
しかし、この規模のコードではSeasar2はおろか、PicoContainerですらヘビーウェイト。なので、id:t-wadaさんとTDD && ペアプロで作成してみた。
機能としてはAOPもXMLによる設定も無く、オブジェクトのwiringだけだが、我われの現在の用途には必要十分。インジェクション方法は、ブロック・インジェクション——Groovyだからクロージャ・インジェクションと呼ぶべきか——のみをサポート。車輪の再実装は善。って、『Linux mgazine』(2005.02)のMatzダイコンを丸パクリなので、再実装ですらないか。
利用イメージ
こんな感じ:
class Blog { input display ... } class Input {...} ... dicon = new DICon() dicon.regist("blog") {|c| new Blog(input:c.input(), display:c.display)} dicon.regist("input") {|c| new Input()} dicon.regist("display") {|c| new Display()} blog = dicon.blog # dicon.blog() でも良い blog.display...
テストコード
ガリガリ書き流したので安直だったりコピペだったりで手抜き。「Code as Documentation」になってない。
1 package com.kakutani.groovy.di 2 3 class DIConTest extends GroovyTestCase { 4 dicon 5 6 void setUp() { 7 dicon = new DICon() 8 } 9 10 void testOneCompoent() { 11 dicon.regist("myString") { "Hello World" } 12 assertEquals("Hello World", dicon.myString) 13 } 14 15 void testTwoCompoent() { 16 dicon.regist("myString") { "Hello World" } 17 dicon.regist("foo") { "Hello Foo" } 18 assertEquals("Hello Foo", dicon.foo) 19 } 20 21 void testDependency() { 22 dicon.regist("lineItem") { "ThinkPad"} 23 dicon.regist("order") {|c| 24 order = [] 25 order[0] = c.instance("lineItem") 26 order 27 } 28 29 assertEquals("ThinkPad", dicon.instance("order")[0]) 30 } 31 32 void testPropertyMissing() { 33 dicon.regist("lineItem") { "ThinkPad" } 34 dicon.regist("order") {|c| 35 order = [] 36 order[0] = c.lineItem 37 order 38 } 39 40 assertEquals("ThinkPad", dicon.order[0]) 41 } 42 43 void testMethodMissing() { 44 dicon.regist("lineItem") { "ThinkPad" } 45 dicon.regist("order") {|c| 46 order = [] 47 order[0] = c.lineItem() 48 order 49 } 50 51 assertEquals("ThinkPad", dicon.order()[0]) 52 } 53 }
プロダクトコード
Classic Syntax。JSR Syntaxは気にくわない、というのもあるけれど、MarkupとBuilderが使えないと困るので、beta10を採用。
行数は39行。所要時間は、mixiの日記のタイムスタンプから算出すると29分。getPropertyとinvokeMethodのオーバーライドでハマった(自分で翻訳していたというのに)。メソッドの仮引数の型を明示しないとオーバーライドできないのね……。
ちなみに、ブロック・インジェクションなMatzダイコンはRubyで20行。
1 package com.kakutani.groovy.di 2 3 class DICon { 4 instances 5 services 6 7 DICon() { 8 instances = [:] 9 services = [:] 10 } 11 12 DICon regist(name, closure) { 13 services[name] = closure 14 this 15 } 16 17 Object instance(name) { 18 if (instances[name] != null) return instances[name] 19 closure = services[name] 20 component = closure.call(this) 21 instances[name] = component 22 } 23 24 getProperty(String name) { 25 try { 26 return metaClass.getProperty(this, name) 27 } catch(MissingPropertyException e) { 28 return instance(name) 29 } 30 } 31 32 invokeMethod(String name, Object args) { 33 try { 34 return metaClass.invokeMethod(this, name, args) 35 } catch(MissingMethodException e) { 36 return instance(name) 37 } 38 } 39 }
さらに先に進むために
GroovyでAOPというかインターセプターというか、そーゆうのを仕込もうと思ったらどういうやり方があるのかなあ……。AspectGとか無いのかな。
■2 TodoListTutorial with Rails
id:babieさんによる翻訳。お疲れさまでしたッ!
2007-06-02(Sat) [Edit]
■1 遠足
消防博物館。新宿御苑。
○ TrackBack [http://cialissale.siteboard.de Cialis sale. Cialis sale. C..]
○ TrackBack [http://tramadol.yooblog.gr What is tramadol. Tramadol c.o...]
○ TrackBack [http://phentermine-without-prescription.blogandorra.com/ O..]
○ TrackBack [http://phentermine.yooblog.gr Phentermine pill buy cheap p..]
○ TrackBack [http://alprazolam-online.blog.drecom.jp Alprazolam. Alpraz..]
Before...
○ kdmsnr [『Think』って雑誌にもちょこっとだけのってましたよねえ。どうなったんだろうか。若干、もういいよ組かもしれません。..]
○ kdmsnr [http://cappuccino.ne.jp/keisuken/java/capp/csv_writer_read..]
○ かくたに [薄皮一枚のwrapperとしては悪くない感じっすね。ドキュメントもある。けどなひさんcsvみたいな驚きがないのはJa..]
○ keisuken [む、リンク張られてる(w。API はわざと泥臭く(低レベルに)してました。公開終了しちゃいましたけど(^^;。]
○ かくたに [わざわざお報せありがとうございます。ひとくちにCSVといっても色いろあるから面倒です……。]