... だったかな?
それはさておき、「真似る」じゃなくて、技術的、技巧的なところの 学習ということなんですね。
学習可能な形に落し込む工程で、何かが抜け落ちてしまうんですかねえ。 みんな、学習して宮部さんに近いレベルの書き方はできても、抜け落ちてしまう「何か」が あって、「宮部さんのように」は書けないのかも知れません。 その「何か」が宮部さんの宮部さんたるところで、それが宮部さんの個性ということになるんでしょうか。
もっとも、私は、誰かの創作技術を学習しようと思ったことも、分析しようと思ったこともありません。 上で書いたことも単なる思いつきです。何の根拠もありません。的外れかも知れません。 (そんな難しいことを考えながら、ミステリを読んだことはありません。)
それにしても、そんなに「意外なところから」のリンクでしたか?
終わりました。
14のプラクティスのうちいくつを実践できたかというと...
計画ゲーム
それなりに実践しようとしたのですが、ゲーム(ゲームの理論のゲームですね。)にはなりませんでした。 顧客不在でプレーヤーは私一人だったもので。ゼロ和ゲームにならないというか。
短期リリース
ストーリーはたった1つだったので、リリース1回。なので短期リリースも何もありませんでした。
メタファ
何も思いつきませんでした。あまり考えませんでした。
シンプルな設計
心がけました。
テスティング
今回の開発では、Testing Framework は利用しませんでした。自前でassert_xxxメソッドを作りましたが。 Frameworkは使いませんでしたが、テストファーストはそれなりに心がけたつもりです。 特に開発の後半は実践できたと自負しております。
リファクタリング
意識して時間を取って実践しました。やはりテストがあるのが心強かったです。
ペアプログラミング
全くできてません。1人だったので。いつかやってみたいです。
共同所有
1人だったので、できてません。やりようが無かったともいう。
継続した結合
別にマシンを用意するようなことはしませんでしたが、 できたタスクから追加してアクセプタンステスト(もどき)を毎日実行していました。
週40時間労働
まあ、それなりに...。
オンサイトのユーザー
さっぱり。
コーディング規約
従来と同じ書き方をしたので、実践できたといえるのかな。
デイリースキーママイグレーション
今回既存データベースを利用することが前提で、変更しないことが最初から決まってました。
オープンワークスペース
1人だったからなあ...。
1人でもできるようなところは、ある程度、実践できたというところでしょうか。 また機会があれば、今回の経験を活かして実践してみたいと思います。
タスクの見積り精度などを上げていきたいですしね。 (公開はできませんが、今回の見積りと実績は、次回に活かすべく記録として残しています。)
私の環境で make test が失敗してたのも 同じ理由だろうな。
Cygwinの環境をヴァージョンアップしたときになんかCygwinの環境そのものが変になったことがありました。
同じタイミングでmake test
がコケるようになったので、うちの環境だけが悪いのだと思って
報告しそびれていました。
「多くの人に愛される」ということは それだけ、アクが強くないというか癖が無いということなんじゃないでしょうか。 癖が無いが故に、いざ真似ようとすると、特徴がつかめず、 みんな真似できないんじゃないかと想像してしまうのです。
どうか私にテストプログラムを修正する勇気をください。 それが駄目なら、私にその勇気を与えてくれるペアの相手をください。
何故か1冊届きました。ありがとうございます。 それにしても、何の協力もした覚えが無いので不思議です。 しかも、何の予告もなしにいきなり届いたのでちょっとびっくりしてます。
リファレンスを眺めていたら私の名前が...。 なんか、ものすごく誉めてもらってますよ。
開発作業として残っているタスクは、あと1つとなりました。
今、『XPエクストリーム・プログラミングアドベンチャー』を読んでいます。 その中で、最初のイテレーションでは、何もしないけど、ともかく動くシステムを作るんだ というようなことが書かれております。
これは、私が忘れていた重要な作業を最初にやるということなのかなあと思いました。
某所の状況が、何が何やらさっぱりわからなくなってしまっています。 私が話をややこしくしちゃったような気がしないでもないんですけど。
まず、最初に真意を問うべきであったと反省しています。 もはや手遅れのような気もしますが、真意を問うてみることにしました。
いろいろ割り込みがあって、あまり進んでいません。
今日は飴玉を導入してみました。
テストが完璧に通って、1つのメソッドの実装が完了したら、 飴玉をなめようという儀式を取り入れてみた訳です。 (たまたま手近にあった飴玉が目についたものですから。)
1人でやっても盛り上がらない。
ますます太ってしまう。
ということがわかったので、飴玉の導入はやめにします。
もっとも、何をやっても、1人じゃ盛り上がらないのかも知れませんが。
は4月25日発売らしい。
書店で見たことがなかったのは、
たまたま、売り切れていた。
そもそも、入荷してなかった。
のどちらかと思ってたんですが、そうじゃなかったんですね。
昨日の突然反応が鈍くなる問題は、やっぱりRuby/Gtk側の問題のようです。 rbcd-tty.rb だと最後まで再生できたので。
何を今更という感じもしますが、何となく、音楽CDの再生も
Rubyでやってみようということで
Ruby CD Player
をインストールしてみました。
(動作確認には、ruby 1.7.2 (2002-04-19) [i686-linux]
を使っています。)
Ruby CD Player は、ユーザーインターフェースに Ruby/Gtk を利用しています。 そこで、まずは、gnome-ruby をインストールします。
ruby-gnome-all-0.27.tar.gz をgnome-rubyのサイトからダウンロードします。 (Ruby/Gtkなど、個別にダウンロードできるようになっていますが、 面倒なので、ruby-gnome-all-0.27.tar.gzをダウンロードしました。)
tar zxvf ruby-gnome-all-0.27.tar.gz cd ruby-gnome-all-0.27 ruby extconf.rb make make install
次は、Ruby CD Playerのインストールです。
rbcd-0.2.0.tar.gz をダウンロードします。
tar zxvf rbcd-0.2.0.tar.gz cd rbcd-0.2.0/cdrom ruby extconf.rb make make install
あとは、rbcd.rb を自分で $LOAD_PATH のうちの1つにコピーしておきます。
cp rbcd.rb /usr/local/lib/ruby/site_ruby
でもって、
rbcd-gtk.rb
を起動すれば再生できました。
...ですが、何曲か再生している途中で突然反応が鈍くなりました。 キーボードもマウスの反応も極端に鈍くてどうしようもなくて、強制終了してしまいました。 なんとなくですが、Ruby/Gtkの方の問題のような気がしています。
受入テストを書くのがちょっと難しいです。
えーと、今回のプログラムは起動された日付によって、挙動が変わります。
あるメソッドのユニット・テストを書く場合は、簡単です。 そのメソッドに外から引数として日付を受け取るようにしておけば、 2002年4月14日のテストも2003年4月14日のテストも自由自在です。
assert_equal(1, obj.method("20020414")) assert_equal(2, obj.method("20030414"))
てな感じで、いろんな日付のテストができます。
ですが、受け入れテストの場合、今日起動したプログラムのアウトプットと 明日起動したプログラムのアウトプットは違う訳です。 この状況の中で受け入れテストを自動化するのは、なかなか難しいです。
...と思ったのですが、今回の場合は、引数で日付を指定できるようにプログラムを 作っておけばいいだけの話でした。
引数で日付が指定されたときは、その日付が起動日であるかのように動作する。 引数を省略した場合は、システム日付を起動日とする。
とするか
引数として必ず起動日付を指定する。 実際に顧客が使うときには、次のようなシェルスクリプトを起動してもらう。 program `date +%Y%m%d`
とすればいいでしょう。
DCOM の話題が、[ruby-talk:38330]で出ていたので、最新版を試してみてください とメールを出しておきました。 DCOMのテストができる環境が無いもので、バグ出ししてもらえると助かるのでした。
はっ!! いけません。重要な作業を忘れていました。 昨日のタスクは、複数のメソッドの開発だったのですが、それらを1つの動くプログラムとして 統合するという作業を完全に忘れておりました。
今日は、動くプログラムを作り、ついでに受け入れテストも書きました。 (顧客不在のプロジェクトなので受け入れテストも自前です。) これで、ごく一部の機能だけしかありませんが、それでも、完結して動くプログラムができました。 「継続的インテグレーション」のための土台ができた感じです。
他のタスクは、片づいたものから、このプログラムに組み込んでいこうという算段です。 (元々今回は、ストーリーはたった1つで、そのストーリーを実現するプログラムも1本なのでした。)
今日の作業(「継続的インテグレーションの土台となる完結して動くプログラムを作る。」)は、 別のタスクとして書いておくべきだったとちょっと反省。
当り前のことですが、ストーリーをタスクに分解したら、 できたタスクを結合して1つのストーリーにする作業もどこかで必要です。 多分それは、継続的インテグレーションにより徐々に1つのストーリーにしていくことになるのでしょう。 だから、本来、タスクとして独立させるほどのものではないのかも知れません。 ですが、その最初のとっかかりの一歩には少し時間がかかるような気がします。 最初の1歩だけは、1つのタスクにしておいても良かったんじゃないかなと思うわけです。
ドラマのタイトルからひょっとしたら、「トリック」の山田奈緒子に会えるのではないかと思い、 ちょっとだけ期待して見てしまいました。 ストーリーは、ほとんど想像できてしまうし、予想通りの展開です。 でも、そんなことはどうでもいいのです。 セリフや間合いなど、どことなく山田奈緒子が垣間見える気がします。 その一瞬を求めて見てしまうかも知れない自分って一体?
昨日、今日で2つ目のタスクが終わりました。 このタスクは8ポイントと見積っていました。 2日で8ポイントなので、1日4ポイントということになります。 一週間に換算すると20ポイントになるので、当初の見積り通りなのですが...。
実は、単純に、1ポイントの作業は、私1人で1時間でできる(だろうと思われる)作業 というつもりで見積もっています。 ところが、今回の8ポイントのタスクを完了するまでに、私が使った時間は8時間ではありませんでした。 実際には12時間くらいかかっています。
うーむ。これはどう考えるべきなのか...。
ちなみに、昨日はちょっとだけ残業しましたが、今日は残業してません。 (日曜も仕事だったせいか、週の始めだというのに疲れ気味なので、今日はとっとと帰ってきました。)
突然、全く予想していなかった方からメールを頂きまして、ものすごくいま焦っております。
読了。満足のでき。評判通り。『共犯マジック』も読まなくちゃ。 それにしても、昼飯前に読んだんだけど、腹が減ってしょうがなかったです。
Cygwin で
gcc -mno-cygwin
とするよりは、やっぱりMinGWを使うのが王道なんでしょうか?
そこで、MinGWをインストールしてみました。 MSYS なんてものがいつの間にやらできているんですね。 これもインストールしてみました。
本当は先にMSYSをインストールすべきだったみたいです。 最初からやり直しました。
MSYS-1.0.6-i686.exe で MSYSをインストール
MinGW, gdb, gcc-2.95.3-20011106.tar.gz, binutils-2.11.92-20011113.tar.gz をインストール
msys を起動して
cd / mkdir mingw cd mingw tar zxvf MinGW-1.1.tar.gz cd .. tar zxvf gdb-5.1.1-1-mingw.tar.gz cd mingw tar zxvf gcc-2.95.3-20011106.tar.gz tar zxvf binutils-2.11.92-20011113.tar.gz
CygwinのmakeでないとRubyをコンパイルできなかったんで、MinGWのmake.exe も MSYSの make も削除。
w32api-1.3.tar.gz と mingw-runtime-2.0-20020412.tar.gz はインストールしませんでした。 インストールしたら、Ruby 1.7 がコンパイルできなくなったためです。1.6は試してません。
今ふと思ったのですが、w32api-1.3.tar.gz の方は、 win32/win32.c で
#include <winsock2.h>
しておけばコンパイルできるような気がしてきました。
読了。表題作が好み。 「魚の交わり」の葉書を出せなかった理由がどうも納得できないんですよね。 全体に満足。
XP エクストリーム・プログラミングアドベンチャー
何とも夢のあるタイトルですね。序文はRuby界でもお馴染のDave。 今知ったけど、『検証編』というのが出てるんですね。 残念ながら書店でまだ見たことがありません。
メイン・ディッシュ
短編の名手と噂の北森鴻です。 私は、狂乱廿四孝しか読んだことがなくて、そのときの評価はさほど高くなかったのですが...。
花の下にて春死なむ
勢いでもう1冊。
きらきらひかる file 3
やっと原作を見つけました。file 1 と file 2 は見つけられませんでした。 一気に読んでしまいました。 ドラマの小林聡美(漢字あってる?)が演じてた役は原作には出てこないんですか? ちょっとショック。
NHK 英語リスニング入門 4月号
5月号が発売されている今、なぜ4月号なのか。 それは今放送されているスキットの最後が聞き取れないからです。 顔に何がついていると言っているのかどうしてもわかりませんでした。 やっとすっきりしました。
それから、2回ずつ同じ内容を放送しているのは勘違いじゃないことも確認できました。
聞き取れないくせに、それでも、テキストを買う気はないらしい。
私が彼を殺した
やっぱり読んでいる気がしたので買うのをやめました。
あれっ? 『だれかが彼を殺した』って何? 私の勘違いですか? 誰が誰を殺したんですか? 私が読んでない本は誰が誰を殺した本で、私が読んだのは誰が誰を殺した本なんですか? いけません。早くも作者の巧妙なトリックにすっかり騙されているようです。 (←あなたの物覚えが悪いだけです。)
誰もがポオを愛していた
読んだような気もするし読んでいないような気もします。どうだったか思い出せません。 読んだのは『笑ってジグソー、殺してパズル』の方だったかも知れません。 少くともどちらかを読んでいるのは間違いないんですけど。 両方とも読んでいたかも知れません。
実は読んでいるんだけど、読んでいないと思い込んでいた本を読むと、 途中で読んだことを思い出します。しかもトリックとか犯人とかも。 だから、読んだかどうかはっきりしない本の場合、買うのをかなり迷います。
しあわせの書
平積みで置いてあったのはテレビで取り上げられて、 注文が殺到したからでしょうか?
ソフトウェア職人気質
今日も今日とて、いろいろありまして...。
やはり残業してタスクが1つ終了しました。 タスクの見積りは4ポイントだったのですが、実際には3ポイントでした。
明日は休暇なので、今週のXPは結局、
見積りに3時間
タスク1つ終了(3ポイント)
というところです。さて、こういう場合、プロジェクト速度はいくつ?
本日もいろいろありまして、作業はほとんどできませんでした。
残業して2時間ほど確保してXP風味にテストファーストでやってみました。 最初のとっかかりのテストを書くのは結構面倒ですが、 そこを通過できれば、リズムに乗れそうな感触です。 テストがあるおかげで勇気を持ってリファクタリングもできました。
週40時間は早くも破られてしまいました(笑)。
ところで残業して時間を確保した場合、プロジェクト速度や負荷係数は どうするのが適当なんでしょうか? いくらなんでも、残業ベースでプロジェクト速度を計算しちゃ駄目ですよねえ。
今日はいろいろありまして、全く作業できませんでした。 進捗0です。
今回、超小規模開発をやることになりました。 で、XPをちょっとだけ(でもできる限り)取り入れてみようと思います。 1人でやる開発なので、ペアプロはできないし、オンサイト顧客もありません。 ストーリーはたった1つしかありません(爆笑)。
今日は手始めに、このストーリーをタスクに分解してそれぞれのタスクの見積りをしてみました。 もちろん、実装だけじゃなくて、テストの時間も考えました。 タスクの合計は38ポイントになりました。 現時点では一週間で20ポイントできる計算をしています。 なので約2週間の作業です。
今日はここまで。
これからぼちぼちドキュメントを整理しようと思います。 [ruby-talk:36826]にあるように、 英語のドキュメントはRDocスタイルで win32ole.c に入れてしまうのがいいかと考えています。
2日ずつ同じ内容を放送しているように思います。 勘違いじゃないですよね。
えーと、ヴァージョンが1個とんだのは、1日で2段階の更新をしたからです。 0.4.6は、数時間の命でしたがちゃんと存在しております。
0.4.6にした後でDCOM対応に取りかかったのです。 多分、DCOMに対応するには数日はかかるだろうと予測していたのですが、 これが大はずれ。 意外に簡単に動くものができたみたいです。 とはいっても
excel = WIN32OLE.new('Excel.Application', 'localhost')
なんていうのが動くことを確認しただけですが。
こう、なんか洗練されて整理された内容ではなくて、 現場の泥臭い部分もまるごと含めたリポートという感じがして面白かったです。
このXPのシリーズって抽象的な話からどんどん具体的な話になってきているように思います。
ファイルの1行を指定した文字数で折り返すコマンドが思い出せなくて悩みました。 cat のオプションには無いし、cut も違うし、paste も違います。 man でいろいろ探し回ってようやく見つけました。 一瞬 Ruby で作ってしまおうかと考えましたが、 あるものは、それを使うべきでしょう。
なんですぐに思い出せなかったのか、ちょっとショックです。
Ruby 1.7 系に dl 拡張ライブラリが添付されるようになったみたいです。 Win32APIを廃止して dl にしようという意見もあったので、前から注目はしてるんですが、 試す時間が取れません。
OLEの世界には、引数つきプロパティなるものがありまして。
obj.PropertyWithArg(1, 2) = 6
などとVB(A)で書いたりする訳です。
で、「Win32OLEでどう書けばいいんですか?」と聞かれることがあります。
それに対して、私は、
obj.setproperty('PropertyWithArg', 1, 2, 6)
と書いてくださいと答えています。
obj.PropertyWithArg(1,2) = 6
なんてのは、そもそも、Rubyが受けつけてくれないのです。
最近になって、
obj.PropertyWithArg[1,2] = 6
ならできるよ。と ruby-win32 で教えていただきました。
こんな感じで、できそうです。
class OLEProperty def initialize(obj, dispid, gettypes, settypes) @obj = obj @dispid = dispid @gettypes = gettypes @settypes = settypes end def [](*args) @obj._getproperty(@dispid, args, @gettypes) end def []=(*args) @obj._setproperty(@dispid, args, @settypes) end end module ModPropWithArg VT_I4 = 3 VT_R4 = 4 def PropertyWithArg OLEProperty.new(self, 0, [VT_I4], [VT_I4, VT_R4]) end end obj = WIN32OLE.new(...) obj.extend(ModPropWithArg) p obj.PropertyWithArg[0] p obj.PropertyWithArg[1] obj.PropertyWithArg[1] = 2 p obj.PropertyWithArg[1]
もちろん、あらかじめ、プロパティのDispIDと引数の型と数を調べておく必要があります。 (これは、Win32OLEで調べることができます。)
ということで、olegen.rbでもこの方法を取り入れてみようかと思うのですが、
(OLEProperty.new
のあたり)実行時のコストが高そうな予感がします。
桜木町でやってたのか...。 私には、縁が無いものと思い油断していました。 せっかく、川崎に出張してたのだから、 話のネタに30日に見に行けば良かったです。 今回の出張は、なんかいろいろ逃がしてしまったような気がしてなりません。
まだ半分も読んでいないのですが、
アーキテクチャとして重要なものであったとしてもユーザにとって優先順位が低ければ後回し。
見積もりにはテスト(ユニット・テスト)の(コードを書く)時間をちゃんと含める。
など、参考になりそうなことが書かれてます。 実践するのはちょっと難しいかも知れませんが。
今日は手抜きでほとんどテストを書かなかったから、 余計に難しいと感じてしまったのかも知れません。
コードはRubyなのに。RubyUnitの作者なのに。極道編の著者なのに。
テスト・ファーストは無理でも、テスト・パラレルぐらいにはしたいとは思っております。 「テスト・パラレル」ってのは、ちょっと実装してはテストコードを書くというものです。 あわよくばテストを先行させてみよう。無理なら、ちょっと実装してからでも書きましょう。 書かないよりは絶対まし。というアプローチです。 テスト並行プログラミングと言ったところです。 「テスト・パラレル」は、私の造語です。
テストを書かないのは、安定して動くテストを書く方が コードを書くより難しいし、時間がかかるからではないかと思う今日この頃です。 今日は、それでテストを書かなかったんです。
でも、本当は
見積りの段階からテストのことを考えないといけない
ということが、この本に書かれている訳です。
オープニングを聴き逃しました。 15分間ずーっと英語を聴かされ続けるのかと思ってちょっと焦ってしまいました。 まだ、英会話入門のような軽快さが感じられません。
Rubyの入門書とかの話をした相手に、 ぴったりの本みたいなので、薦めておいた。