2004-06-21(Mon) [Edit]
■1 『リーンソフトウエア開発』
『Lean Software Development: An Agile Toolkit』の翻訳。2004/07/21発売予定。原著がAmazon価格4,000円オーバーなのに対して、2,520円とお値頃でございます。(後でもうちょっと補足するかも)
2005-06-21(Tue) [Edit]
■1 QuickJUnitプラグイン: 3.1対応、救援求ム
quick-junit-develは35人しかsubscribeしてないので(!)、こっちにも書いておこう……。
Eclipse3.1系プラグインを触っている方の助けを求めています。
Eclipse 3.1M7で、「PDE enforces code accessibility」というのが導入されたそうで、おかげでinternal系のクラスが軒並、参照できなくなってる模様。
プリファレンス系のAPIも大きく変わっちゃってる……。振り切られました。あうあう。
私が3.1系のプラグインのつくり方を勉強して直していると、3.1リリース時点での対応は間に合わないこと確実。なので、3.1系のプラグインのことがわかる方、アドバイスをいただけないでしょうか。メーリングリストでお待ちしております。
■2 車輪の再実装: 簡易DIコンテナ on Groovy with AOP
前回、39行でDI機能を実装したGroovyのダイコン。今度はTraceInterceptorが必要になったので、実装してみた。AOP(というかInterceptor)の実装のことはよくわからないのだけれど、TDDでやったら動いちゃった。TDDすごいなあ。コンテナ部分のコードは45行増えて、84行になった。
利用イメージ
たとえば、こんなクラスをDIしてTraceInterceptしたいとする。
class TraceStub { doSomethingWith(arg1, arg2) { "doneSomething" } void throwException() { throw new RuntimeException("expected") } }
コンテナに登録するときはBlockInjectionだよね、フツウ。
dicon = new DIContainer() dicon.regist("myComp") { new TraceStub() }
登録したmyCompにinterceptorを適用したいときは:
dicon.intercept("myComp").with { TraceInterceptor.class }
こうでなくっちゃ。で、
dicon.myComp.doSomethingWith("someArg", "otherArg")
って呼んだら:
BEGIN com.kakutani.gradicula.TraceStub#doSomethingWith('someArg', 'otherArg') END com.kakutani.gradicula.TraceStub#doSomethingWith('someArg', 'otherArg') : doneSomething
と出て欲しいし、
dicon.myComp.throwException()
って呼んだら:
BEGIN com.kakutani.gradicula.TraceStub#throwException() END com.kakutani.gradicula.TraceStub#throwException() Throwable: java.lang.RuntimeException: expected
と出て欲しい。
DIContainer.groovy
45行も増えてしまった。なんでこんな設計になっているのか自分でもよくわかってない。テストを通るように実装したらこうなっちゃった。たぶんいろいろマズいと思うけど、自分たちが使うには充分だ。
1 package com.kakutani.gradicula 2 3 class MethodInvocation { 4 target 5 methodName 6 args 7 8 proceed() { 9 target.invokeMethod(methodName, args) 10 } 11 } 12 13 class InterceptProxy { 14 target 15 proc 16 17 InterceptProxy with(closure) { 18 proc = closure 19 this 20 } 21 22 invokeMethod(String name, Object args) { 23 try { 24 return metaClass.invokeMethod(this, name, args) 25 } catch(MissingMethodException e) { 26 interceptor = proc.call() 27 if (interceptor.class == Class.class) { 28 interceptor = interceptor.newInstance() 29 } 30 m = new MethodInvocation( 31 target:target, 32 methodName:name, 33 args:args) 34 return interceptor.invoke(m) 35 } 36 } 37 } 38 39 class DIContainer { 40 instances 41 services 42 interceptors 43 44 DIContainer() { 45 instances = [:] 46 services = [:] 47 interceptors = [:] 48 } 49 50 DIContainer regist(name, closure) { 51 services[name] = closure 52 this 53 } 54 55 InterceptProxy intercept(name) { 56 if (interceptors[name] != null) return interceptors[name] 57 proxy = new InterceptProxy(target:instance(name)) 58 instances[name] = proxy 59 interceptors[name] = proxy 60 } 61 62 Object instance(name) { 63 if (instances[name] != null) return instances[name] 64 closure = services[name] 65 component = closure.call(this) 66 instances[name] = component 67 } 68 69 getProperty(String name) { 70 try { 71 return metaClass.getProperty(this, name) 72 } catch(MissingPropertyException e) { 73 return instance(name) 74 } 75 } 76 77 invokeMethod(String name, Object args) { 78 try { 79 return metaClass.invokeMethod(this, name, args) 80 } catch(MissingMethodException e) { 81 return instance(name) 82 } 83 } 84 }
TraceInterceptor.groovy
S2のTraceInterceptorの丸パクリにインスパイアされました。出力はロギングAPIじゃなくてprintlnで手抜き。
1 package com.kakutani.gradicula 2 3 class TraceInterceptor { 4 Object invoke(invocation) { 5 buf = renderSignature(invocation) 6 println("BEGIN " + buf) 7 try { 8 result = invocation.proceed() 9 buf << " : ${result}" 10 result 11 } catch (Throwable t) { 12 buf << " Throwable: ${t}" 13 throw t 14 } finally { 15 println("END " + buf) 16 } 17 } 18 19 private StringBuffer renderSignature(invocation) { 20 buf = new StringBuffer(100) 21 buf << "${invocation.target.class.name}#" 22 buf << "${invocation.methodName}(${renderArgs(invocation.args)})" 23 buf 24 } 25 26 private String renderArgs(args) { 27 buf = new StringBuffer() 28 buf << args.toList().inject("") {|str, a| "'${a}', " } 29 if (0 < buf.length()) buf.setLength(buf.length() - 2); 30 buf.toString() 31 } 32 }
さらに先に進むために
Interceptorの登録の仕方のバリエーションを増やす。特定のメソッドにだけinterceptするための指定とか。
2006-06-21(Wed) [Edit]
■1 オブジェクト倶楽部2006夏イベント、22日(木)申込締切です(2)
「Rubyはまだまだアウェイなんだなあ」と昨日付けのエントリには書いたけれどもが、本日かずひこさんから届いた「Ruby道チュートリアル」の資料を読ませてもらったところ、内容はオブジェクト倶楽部としてはホームですよホーム。アジャイル言語でTDDなリファクタリングがデザインパターンなのです。
……と、私の悪い癖でキーワードだけズラズラ並べてしまったけれども、チュートリアルはチュートリアルなので、Rubyでのプログラミングのお話です。「Rubyっぽさ」の導きに従えばTDDなリファクタリングがデザインパターンであることがここちよい。私が押しつけた「Ruby道チュートリアル」のタイトルをきちんと受けとめてくれたかずひこさんに感謝。
Rubyに興味はあるけれども、Rubyっぽく書くことのここちよさを(まだ)知らない方には是非聞いてもらいたいセッションになること請け合い。セッションでは魚を与えてくれるだけでなく、魚の捕り方も教えてくれるよ。乞うご期待。
○ TrackBack [http://phenterminereqw.forum5.com Phentermine. Phentermine..]
○ TrackBack [http://www.prozac4all.fora.pl Buy no prescription prozac. ..]
○ TrackBack [http://codeine.eamped.com Buy 60mg codeine. Buy codeine on..]
○ TrackBack [http://herbal-phentermine.blog.drecom.jp Cheap phentermine..]
○ TrackBack [http://codeine121.eamped.com Buy codeine. Buy codeine. Buy..]
2007-06-21(Thu) あー。また日付まちがえた。 [Edit]
■1 『WikiとXPをつなぐ時を超えたプログラミングの道』江渡 浩一郎, オブラブイベント2007夏
オブラブのイベントに興味を持ってもらえるような人たちに江渡さんを紹介できたことを光栄に思います。講演じたいも、自分のなかに勇気と知的興奮がみなぎるのを感じた。江渡さんにはもちろんのこと、講演の実現に尽力いただいた関係各位に感謝します。
「オブラブ行ってみたいなー」という江渡さんの何気ない一言を真に受けて講演をお願いして、ほんとうにほんとうによかった。「WikipediaをWikiと呼んでよいのか?」という素朴な問いの答えを巡るマジカル・ミステリー・ツアー。
パターンは一定の形態を生み出すルール。ランゲージは様々な大きさの部品の有機的な集合。WikiはWikiで書かれていた。WikiとXPは兄弟だ。お母さんはパターンランゲージ、お父さんはWard Cunningham。Wikiはうまくいく。XPはどうだ。那須のケント・ベックのチームはWikiとXPとdRubyでできている(たぶん)。
だったら、私たちにもできるんじゃないだろうか。
アレキサンダーは、最終的には空間の設計者と利用者との力のバランスを取るという試みに失敗した。……プログラマは建物ではなく、ソフトウェア開発は建設施工ではない。……ソフトウェアでは新たな社会構造を作る機会がある。……これが、私たちのメリットである。
——『XPエクストリーム・プログラミング入門 第2版』第23章「時を超えたプログラミングの道」
あわせて読みたい: オレオレまとめ「時を超えたプログラミングの道」
2006年の1月頃に、『XPエクストリーム・プログラミング入門 第2版』第23章「時を超えたプログラミングの道」を原著ベースでまとめて(今は亡きPofEAA勉強会で)プレゼンしたことがあります(今、確認してたら江渡さんのへの言及もしていた。というか、この資料はXP 2ndのエッセンスがよくまとまっている。1年半前のオレ、偉い。
2007/06/25追記:江渡さんのスライド
slideshareで公開されているスライドは、フォントが再現されていないのでリンクするのはどうかなあ、と思っていたけれども、id:yomoyomoで晒されてるからリンクしちゃおう。
2007/06/27追記:江渡さんによる関連論文
メルマガにも書いた 通り、オブラブでの講演のきっかけになった論文は『未来心理 Vol.007』に掲載された「なぜそんなにもWikiは重要なのか」(PDF)。
未来心理のは江渡さんの写真がカッコいいんだけど、内容として今回の講演内容により近いのは、この論文よりも後に書かれた「Wikiの起源と進化」(PDF)(id:yomoyomoで晒されてるからリンクしちゃう)。
2008-06-21(Sat) [Edit]
■1 RubyKaigi2008 1st day
ええと、本格的にRubyKaigiが始まったら全然参加できませんでした。LTは突発的にタイマー係をやった(というかタイマーのことを忘れていた)ので、ぜんぶ聞けたけど、今年もすごかった。どうすごいのかは他の人が書くだろうから自分の視点のみ。
ライトニングトークス
- 池澤さん(toRuby)のLT。選考でも少し議論にもなったのだけれども、今年のテーマを踏まえて採択。ほんとうに採択してよかった。マジ泣きした。懇親会で池澤さんに御礼を言ってたらまた泣けてきた。
- 竹迫さんに「ゆるふわ」のスライドをパクられたwww なんという栄誉wwwww
- 斎藤ただしさん(実行委員)のLTもマジ泣き。そうだよ、ライトニングトークって、話したいことのある人が5分間だけ話せるということじゃないか。
- 永和自重。「自分たち」のやり方を押しつけるのは違うと思う(まあ、明示してないのもよくないかもしれないけれど)。
- テンパっていて、最初の進行管理をミスった。参加者の皆さんを混乱させてしまって申し訳ありませんでした。
懇親会
RichとChadのRubyCentralの人たちにMacBookにサインしてもらった。これについてはあとで書く。もうMacBookにサインしてもらう場所がなくなってしまった。私のMacBookにはRubyKaigiの歴史が刻まれている。
RejectKaigi2008
RejectKaigi実行委員会から基調講演を頼まれた。なので、昨年とは違って今年はマジで準備してみます。
○ shiro [好みの問題ですが、"register(動詞)" が "regist" と省略されてるのを見るとなんとなく落ち着かない..]
○ かくたに [ううっ。そもそものMatzダイコンもregisterなので、そうします。]