2007年7月30日月曜日

東大工学部広報室

に、カソウケンの内田さんが就任された。



内田さんは応化卒なんですね。知らなかった。


独自ドメインやt.u-tokyo.ac.jpを(選ぶことはできたはずだが)選ばなかったのは、話題性とかユーザコミュニティとかを鑑みた上での決定なんだろうなあ。はてなを選んだのは(立ち上がりとして)いいと思う。人力検索やブログ(ダイアリー)やブックマークや、最近だとスターもだね、そういうのが「つながる」のがはてなだし、実際つながってる感じはするし(はてな村と揶揄もされるが)、コミュニティ力は高いように感じるから。


内田さんには思う存分腕を振るっていただきたい。



カソウケン(家庭科学総合研究所)へようこそ

2007年7月24日火曜日

システムリソースが不足するため、APIを終了できません。

メモリを1GB以上積んでいるWindows XP sp2マシンで掲題のエラーが出る人は、KB909095をインストールすると直る……かもしれない。


……こういう記事を書くと、ここばっかりページビューが上がるんだよなあ。crypt32の記事も常にアクセスがあるからなあ。

IronRuby Pre Alpha

via 荒井省三のBlog

公開されました

ソースコードが公開されてます。.NET Framework 2.0 再頒布可能パッケージがあればビルドできます。

2007年7月22日日曜日

プログラミング言語別「はてブ指数」

「はてブ指数」についてはリンク先を参照のこと。


プログラミング言語について見てみたら面白いかもと思って調べた。測定方法は、『タグ「●●」を含む人気エントリー』の、●●部分を各言語に置き換えてみるというもの。


(追記)「h指数だと対応する概念はないような……」というのはその通りです。Wikipediaには


ある研究者のh指数は、「その研究者が公刊した論文のうち、被引用数がh以上であるものがh以上あることを満たすような数値」となる。

とありますんで、本来は人を評価する概念ですからね。ただ、「その言語に関する記事のうち、ブクマ数がh以上であるものがh以上あることを満たすような数値」と無理やり読み替えてみました。



説明しておくと、リンク先は"http://b.hatena.ne.jp/t?tag=言語名&of=スキップするブクマの数&sort=count"ってなってます。なのでたとえば"of=100"だと、101件目から表示します。


ちなみにこの方法だとJavaは測定不可能でした(JavaScriptが混ざるため)。Cも無理くさい。C++なら測定できそう。

2007年7月21日土曜日

h-indexをSQLで

後で推敲


「h-index を Ruby で書いてみた」を見て、ついカッとなってやった。後悔はしていない。でもSQLで書くなんて当たり前すぎてつまらない。


分析関数


Oracle8.1.6EE以降またはSQL Server 2005なら分析関数が楽。



SELECT COUNT(*) FROM
(SELECT
ITEM,
ROW_NUMBER OVER (ORDER BY ITEM DESC) AS INDEX
FROM DATA
WHERE INDEX <= ITEM)

COUNT(*)ならROW_NUMBERの代わりにRANKでもおk。
ROW_NUMBER限定ならCOUNT(*)の代わりにMAX(INDEX)でもおk。



OracleのROWNUM


ROWNUMならサブクエリが増える(ORDER BYのため)



SELECT COUNT(*) FROM
(SELECT
ITEM,
ROWNUM AS INDEX
FROM (SELECT ITEM FROM DATA ORDER BY ITEM DESC)
WHERE INDEX <= ITEM)


JOINで順位付け


MySQLとかSQL Server 2000とかみたいに上の手段が×ならJOIN(ここでは書いていないけど、ユーザ変数でも可。効率がいいのはどっちなんだろう。誰か教えて)。



SELECT COUNT(*) FROM
(SELECT
T1.ITEM AS ITEM,
COUNT(*) AS INDEX
FROM DATA AS T1, DATA AS T2
WHERE T1.ITEM <= T2.ITEM
GROUP BY t1.ITEM
HAVING INDEX <= ITEM)

これだとROW_NUMBERというよりはRANK的な数値になるんで、
INDEXというエイリアシングは良くないけど、上の例にあわせた。



サブクエリが使えない



サブクエリも試してみたけど
昔のMySQL相手じゃ意味が無い!
だから次は絶対勝つために
僕は一時テーブルだけは最後までとっておく

2007年7月20日金曜日

フリーセル(その3)

幅優先探索を実装してみたのはいいけど、枝が発散する。


breadth-first search


アルゴリズムを真面目に考えないといけないんだけど、面倒なのでヤメ。

2007年7月15日日曜日

Day 31: 安全な削除

やっと終わった……


元記事


31日間ReSharper一周」の31日目にようこそ(はいはい1日遅いですよ。昨日は休んだから)。


ネタにする最後のReSharperリファクタリングは「安全な削除」だ。Ctrl+Shift+Rメニューからでも、直接Alt+Delでも利用できる。


「安全な削除」は、また別のReSharperリファクタリングウィザードを表示する。最初のページ(大抵このページしか見ない)はかなりつまんない。まあそりゃ、何かを削除するのにそんなに何種類もやり方があるはず無いよね。



「安全な削除」の基本的な考えは、コードを壊さずに削除するということだ。次の2つのことをやってくれる。



  • 問題が起きるかチェックする。メソッドを削除しようとしたときに、そのメソッドがどこかでまだ使われているならReSharperが警告するので、削除をキャンセルできる。ハイパーリンクのどれかをクリックすればコードにジャンプできるし、問題を全部「結果検索」ウィンドウに表示することもできる。

  • 変更を完遂する。パラメータを削除する場合は全部の呼び出し元が更新されるだろう。仮想メソッドかインターフェースメソッドを削除する場合は、全子孫クラスからも削除するかどうか聞かれる。


「安全な削除」は、理論的には素晴らしい。コードが使われていないと思ったときに、実際使われていないことを確認し、それを削除し、全呼び出し元を更新するまでを1つの操作でできる。未使用パラメータについては手で確認する方法だってある。なぜならReSharperは、publicメソッドの未使用パラメータを確認したりしないから。ソリューションに含まれる全メソッドの全パラメータに対して「安全な削除」を手で動かすのは嫌だろうけど、何かが不適切ではないかと思った時にはいいクリーンアップツールだ。


ただ、この投稿のために調査しながら気づいたんだけど、ReSharperのチェックは完璧とは言いがたい。変更の完遂についてはかなりよくやってくれるようだが、最初に問題をチェックし通すことからはだいぶ離れている。だから……


注意の言葉


「安全な削除」の直前および直後には、いつもコンパイルすること。コードが壊れるかもしれないからだ。


1~2分探りまわって見つけた2つのケースは以下の通り。



  • メソッドがデリゲートとして使われていて、そのメソッドのパラメータを「安全な削除」する場合は、ReSharperは止めない。その後はもう、メソッドは同じデリゲート型には明らかに一致しないから、コードはコンパイルできなくなる(メソッド全体を削除しようとしたときは警告してくれるから、少なくとも部分的にはデリゲートを意識しているんだろう)。

  • もし別アセンブリのメソッド(たとえばSystem.Windows.Forms.Control.IsInputKeyとか)をオーバーライドしていて、メソッドからパラメータを「安全な削除」するのなら、ReSharperは先祖についての警告もなしにパラメータを削除するだろう。だからそのオーバーライドがコンパイルを通らなくなる。オーバーライドするメソッドと一致するシグネチャが無くなってしまうからだ。


いつでもコードが壊れると言いたいわけじゃない。それはありえない。注意してればなおさらだ(僕はイベントハンドラメソッドのパラメータを削除してみるほどバカじゃなかった。どうなるか知りたいとは思ったけども)。ほとんどの場合、ReSharperのチェックにひっかかるだろう。でもやっぱり前後にコンパイルしておいたほうがいい。

2007年7月14日土曜日

Day 30: リネーム(伝播リネームを含む)

元記事


31日間ReSharper一周」の30日目にようこそ。


今日は全リファクタリングの母について。「リネーム」だ。F2で利用できる。もちろんCtrl+Shift+Rメニューから使うこともできる。


今となっては「リネーム」リファクタリングについて言わなきゃいけないことはそんなにない。まとめて言えば、機能したりしなかったりだ。すごさにも限度はあるけど、ReSharperではすてきな技をいくつかキメることができる。


注: 技術的な問題や、計画不足や、何回かの大吹雪なんかが相まって、現在自宅でReSharperを使うことができない。だから今日の(たぶん明日も)投稿にはスクリーンショットが無いし、詳細は記憶頼みだ。もし何か間違ってたら訂正してほしい。それらはいつか反映させるから。


局所変数のリネーム: 同期編集と提案


局所変数をリネームするとき、ReSharperでは同期編集(僕がこう呼んでるだけで公式名称ではない)によりエディタ上で変更できる。変数名の提案リストもポップアップするから、リストから名前を選ぶこともできる。


僕はDelphiに慣れているが、Delphiでは同期編集モードを終了して変更を確定させるのにEscを押さないといけなかった。ここからの転向はReSharperには準備不足だったね。というのは、ReSharperの同期編集でEscを押すと、変更が取り消されてしまうんだ。ReSharoerでは、変更の確定にはEnterを押さないといけない(そう、もしDelphiでも同じ動きをするんならとても納得のいくことだったんだろうけど)。


今はEnterを押して変更を保存するのは納得なんだけど、弱点もある。もし変数名リストが表示されていたら、Enterを押すとリストで選択中のアイテムが選ばれてしまう。だから例外オブジェクトに名前をつけようとして、たとえばexとするけど、exと入力してEnterを押しても変数名はexにリネームされない――exceptionになってしまうだろう。なぜならexで始まる変数名の提案の先頭だからだ。


短い変数名を入力するための回避策は次の通り。Enterを1度押せば変数名提案は消えるけど、同期編集はまだ終わらない(提案リストがもう消えていても、もう1度Enterを押す必要がある。押さないとリネームは取り消される)。だから、Escを押して提案リストを消し、それからEnterを押してリネームを確定させよう。


クラスのリネーム: 伝播リネーム


僕は長い間、伝播リネームのリファクタリングを待ち望んでいた――関係する全コードに影響するやつ。たとえば、SongFileという名前のクラスがあったとすれば、songFileとかfileという名前の変数や、SongFileという名前のプロパティやなにかがたくさんある可能性が高い。僕が望むリネームとは、SongFileからSongDataStoreに変えたら、それら変数名やプロパティ名のすべてに影響して、そっちもリネームしてくれるものだ。


ReSharperにはその機能がある。


さて、どちらにせよ普通は、クラスをリネームするときはウィザードが表示され、最初のページでは新しい名前を聞かれる。そこまでは何も目新しくない。しかしその後、次のような変数とプロパティを探す。(1)リネームする型に一致するもの、(2)変えようとする名前の一部分に似た名前をもつもの。そして2番目のページでそれらをリストアップし、それら全部に新しい名前を提案してくる。リネームしたくないものはチェックをはずすこともできるけど、そうする意味はあるか?


唯一の弱点は、子孫クラスには同じことをしてくれないことだ。でも僕は機能要求を起こしたから、いずれきっと……

2007年7月13日金曜日

フリーセル(その2)

フリーセルの続き。

アルゴリズムはほとんど変えず、内部構造だけ変えたら、とたんに3秒で答えを出すようになった。

答えあわせはまだだけど、100倍近く速くなったのでびびった。

ちなみに深さ優先探索で、発見された解の手数は6000ステップ強。これを幅優先探索に変えたらどうなるんだろうか。楽しみ。

2007年7月12日木曜日

Day 29: インターフェースがらみのリファクタリング

元記事


31日間ReSharper一周」の29日目にようこそ。


インターフェースを使うのは、昔からかなりいらいらの種だ。テスト可能なコードを書くときには必要で、ファイルシステムに見せかけたヌルオブジェクトを渡すことができる。でもコードが実際にやっていることを追いかけようとするときには辛い。


ReSharperには、インターフェースを使うのをずっと簡単にする機能がいくつかある。2つはもうネタにした。「先祖クラスへナビゲート」「型階層ビュー」だ。


今日はインターフェースを使うときに便利な機能をもう1つネタにする。「ベースメソッド」プロンプトだ。



メソッドのリファクタリング――たとえばリネーム――をするときに、そのメソッドがインターフェースを満たすためのものなら、ReSharperはそのリファクタリングをインターフェースの方に適用するかどうか聞いてくる。


このダイアログボックスはポンコツ的だ。思考の流れを中断させるし、質問は簡単に理解できるようなものでもない。僕の考えるようには動かない。残念だが、改善案はひとつも思い浮かばない。


そうは言っても、この機能が嫌いなわけではない。メソッドをリネームしようと思ったときに、ReSharperが自動的に割り込んできて、インターフェースもリネームするか聞いてくる。答えは勿論Yes!コードがコンパイル可能に保たれるからだ(時には先に「はい」を押してしまい、その後で「ああー、このメソッドはインターフェースから来てたんだ!」ってなる)。


同じことは「使用箇所の検索」でも当てはまる。インターフェースを実装するメソッドについて「使用箇所の検索」をするなら、「このメソッドを探しますか、それともインターフェースを経由して使う同じメソッドを探しますか?」と聞かれるだろう。この場合、このメソッドの使用箇所を全部知りたければ2回検索しないといけないかもしれない(インターフェース経由での使用箇所だけ知りたいのなら、「はい」と答えて1回検索するだけでいいけれども)。

2007年7月11日水曜日

Day 28: スタティックメソッドの抽出(本気)とプロパティの抽出

元記事


31日間ReSharper一周」の28日目にようこそ。


今日は、「メソッドの抽出」と一緒に使えるリファクタリングを(昨日話した「パラメータの導入」を除いて)もう2個ふれる。


スタティックメソッドの抽出(本気)


ReSharperではいつでもスタティックメソッドを抽出できるわけではない(たとえば、コードがインスタンスフィールドやメソッドを参照している場合など)。でも2ステップかければできる。まずメソッドを抽出し、それから「メソッドをスタティックにする」リファクタリングを使う。



このリファクタリングはあまり使ったことがないから詳細には触れない。これがあるって事を指摘したかっただけだ。


プロパティの抽出


ReSharperには「プロパティの抽出」リファクタリングがない。でも2ステップかければできる。まずメソッドを抽出し、それから「メソッドをプロパティに変更」を使う。



もし逆をやりたければ、「プロパティをメソッドに変更」のリファクタリングもある。

あいまいな用語と私

企業情報システム開発にはびこるあいまい語。その1: 「メッセージ管理」


「メッセージ」もあいまいなら、「管理」もあいまい。何とかしてくれ。


OOのメッセージパッシングでも、EAIのメッセージ交換でも、MQのメッセージングでもなかったりする。


よく聞いてみると、「企業情報システムが表示する(警告、注意、問い合わせ、情報などの)メッセージの一貫性が取れていないとエンドユーザが混乱するので、メッセージの文言を管理し、場当たり的なメッセージを表示しないようにする」ということだったりする。


それ自体は大事なことなんだけどね……

Day 27: メソッドの抽出

翻訳に時間をかけている間にメジャーアップデート。


でもそんなの関係ねぇ!


元記事


31日間ReSharper一周」の27日目にようこそ。


今日のネタは「メソッドの抽出」だ。おそらく史上2番目に役立つリファクタリングだ(もちろん「リネーム」が1番だ。2~3日以内に扱うつもり)。




  • 「メソッド名」は一目瞭然。

  • 式がインスタンスフィールドや、メソッドや、プロパティのどれかを使っているなら、「static宣言」は自動的にグレーアウトされる。どうしてそうなのかはいまいち分からない。メソッドを呼び出すときには意味があるけど、フィールドやプロパティは、新しいメソッドに単に渡すだけでも良かったはずだ。ReSharperが許してくれるなら。

  • 「戻り値」には何の目的もないようだ。これが利用可能になっているのを見たことがない。「戻り値なし」か、空欄になっているかだ(ReSharperは明らかに戻り値の型を知っているはずなのに――「シグネチャのプレビュー」ダイアログボックスでは正しく表示されるんだから)。これが単にバグなのか、それとも空のコンボボックスを置くというのが慎重に決められたデザインなのか、よく分からない。

  • 「パラメータ」。どのパラメータが必要なのかはReSharperが決めて、記入してくれる。一方、グリッドは「シグネチャの変更」ダイアログのものと似ている。フル機能には程遠い。ここでできるのはリネームと並べ替えだけだ。パラメータの型を変えたりといったことは何もできない。


ReSharperは、必要だと判断したパラメータの名前を提案してくれる。でもダイアログが開いたときの1度きりだ。他の提案リストをドロップダウンすることはできない。


パラメータのチェックをはずすと渡されなくなる。その代わり、ReSharperは局所変数を生成して、3つの点(...)で初期化する。だからコンパイラは必ず、何か他のものを記入しなさいと穏やかに諭してくる。


パラメータを追加して抽出


何度か、ReSharperの(Delphiのもそう。この件に関してはね)「メソッドの抽出」ダイアログにパラメータを追加するオプションがあったらなあと願ったことがある。でも今夜このことを考えていて、必要ない――少なくともReSharperでは――ことに気づいた。


テスト用のセットアップコードがあるとしよう。こんな感じだ。


_foo = new Foo(42);

そして、このコード行を新しいメソッドに変えたいとする。メソッド名はInitializeFoo()で、int引数をとる。望みのものは、「メソッドの抽出」ダイアログがこれから書き出すコードを表示し、それが42をハイライトして、「さあ、この式に別のパラメータを追加してくれ」と言ってくることだ。


って、どんだけー。まさにそれをやってくれる機能はもうあったんだよ!な、なんだってー!実際にはまずOKをクリックしてメソッドを抽出しないといけない。でもそれからコードエディタで42をハイライトさせて「パラメータの導入」をすることができる。そうすると呼び出し元が42を渡すように自動的に更新される。全部オッケー。

2007年7月10日火曜日

Day 26: シグネチャの変更

元記事


31日間ReSharper一周」の26日目にようこそ。


3つの関数が同じ引数を持つんだけど、それぞれ順序が違う、なんてことが今までにあった?もしあったなら、「シグネチャの変更」はぴったりの機能だ。



ReSharperの「シグネチャの変更」ダイアログは、メソッドのシグネチャに関するどんなものでも変えることができる。ReSharperの他の機能にもメソッドのシグネチャを特定の手段で変更するものはある。たとえば「パラメータの導入」とか。でもこれにはショートカットが無い。以下のことができる。



  • メソッドのリネーム。「メソッドをオーバーロードして委譲」を選んだら、前の名前のメソッドを挿入するが、それは単に新しいメソッドを呼び出すだけしかしない。もしかしたらまだ使うかもしれないから。

  • 戻り値の型を変更。

  • パラメータの追加。デフォルト値を指定する必要があり、その値がすべての呼び出し元から渡されるようになる。でも固定値を毎回渡したくないときだってあるだろう。その場合は次の章を見ること。

  • パラメータの削除。ReSharperはパラメータが使われていないかどうか確認しないから、コンパイルできないコードになってしまうかもしれまない。(パラメータを安全に削除する機能もある。他のとあわせてDay 31で扱おうと思って残してある。)

  • パラメータ名のリネーム。残念、ReSharperはここでは変数名の提案をしてくれない。Ctrl+Spaceを押したとしてもね。

  • パラメータの並べ替え。


どの場合でも、ReSharperは全部の呼び出し元をちゃんと更新してくれる。


新しいパラメータに非固定の値を


新しいパラメータを追加するとき、コードをコンパイル可能に保つために、ReSharperはすでにこのメソッドを呼んでいるすべての呼び出し元を修正する必要がある。つまり、何かを渡す必要があるということだ。これは必須フィールドであり、すべての呼び出し元から渡される何かを指定しないといけない。


じゃあ、すべての呼び出し元からまったく同じ値を渡すのが嫌なら、どうすればいい?それにはいくつか選択肢がある。



  • 「シグネチャの変更」を使わないこと。その代わりに手でパラメータを追加する。そうすればコンパイラが全ての呼び出し元に移動させてくれるだろう――たぶんね(他にもオーバーロードがあると分かって痛い目にあったことがある)。ごく単純な場合以外推奨はできない。だからこういうツールが必要になるんだけど。

  • とりあえずデフォルト値を使い、忘れずに戻って変更すること。これもお勧めはできない。人の記憶力ってそんなにいいもんじゃない。だからそもそもReSharperを使っているんだし。nullのようなデフォルト値は、それを渡すことが一番理にかなったときだけ使うべきだ。

  • どの呼び出し元にも存在しない、asdfjklみたいな意味の無い式を使うこと。ReSharperは止めたりしないけど、(当然)コンパイルできないコードになる。これが実際に役立つのは次のような点だ――コンパイラはすべての呼び出し元に確実に移動させてくれるので、そこで何を渡すべきなのか、ケースバイケースの判断をすることができる。

  • ほとんどの場所で機能すると思われる式を使うこと。もしFooオブジェクトを渡しているのならデフォルト値としてFooとだけ入力してもいい。ほとんどの呼び出し元にはFooプロパティを持ったクラスがいくつかあることを期待してね。僕らはこの手でうまくいったことも多かった。

  • 代わりに「パラメータの導入」を使うこと。もし「パラメータの導入」を使えるのなら、そっちの方が「シグネチャの変更」よりいい。「パラメータの導入」は正しいことを為してくれるからだ。ただし、新しいパラメータをメソッドが知っている形で表すことができるときしか機能しない。

2007年7月8日日曜日

「数学ガール」読んだ

楽しんだ。次は紙と鉛筆を持って、読みながら気づいたわき道を歩いてみよう。


以下は数学にあまり関係ないメモ。



  • カバー裏。(追記)恋の冪級数。
    math girl

  • 「がくら」=学生ラウンジ

惣菜つくった

20070707 惣菜


5品全部俺。

おすすめ


Amazon.co.jpで以前に、Gregor Hohpeの著書をチェックされたお客様に、David Thomasの『Tell Me Why, Mummy』のご案内をお送りしています。



ちょ、別人ww

2007年7月7日土曜日

Day 25: パラメータの導入

モチベーション低下中……


元記事


31日間ReSharper一周」の25日目にようこそ。


導入系リファクタリングは3つのうち2つ話した(「変数の導入」と「フィールドの導入」)。今日は3番目、「パラメータの導入」。



「型」コンボボックスのてっぺんのピクセルが欠けてたり、「定数の導入」チェックボックスが無かったりするのを無視すれば、かなり「変数の導入」とそっくりだ。動きもほとんど同じ。青いハイライトは邪魔だったり、そんな感じ。


代わり映えしないように聞こえるだろうけど言う。これは効く。びっくりするぐらい賢い。


以下はつまらない例だ。


_tilesWide = GetTilesWide(_previewer);
...
private int GetTilesWide(Control control)

return (control.Width + TileWidth - 1) / TileWidth;
}

この関数に対するユニットテストを書きたいが、テスト内でControlのインスタンスを作りたくはないとする。単にcontrol.Widthをハイライトし、「パラメータの導入」ができた。


おかしなことに、最初に提案されるパラメータ名は、ありそうなwidthじゃなく、iだ(widthはコンボボックスをドロップダウンすれば使えるけど)。controlWidthを提案してくれないのはちょっとサムい。


変数名としてcontrolWidthを入力したとすれば、結果のコードは以下のようになる。


_tilesWide = GetTilesWide(_previewer, _previewer.Width);
...
private int GetTilesWide(Control control, int controlWidth)
{
return (controlWidth + TileWidth - 1) / TileWidth;
}

そうすると、controlパラメータが灰色になる。もう使ってないからね。なので、カーソルをそこに動かしてAlt+Enterを押し、未使用のパラメータを削除できる。するとコードから恐ろしい依存性が消え、よりユニットテストがやりやすくなる。


_tilesWide = GetTilesWide(_previewer.Width);
...
private int GetTilesWide(int controlWidth)
{
return (controlWidth + TileWidth - 1) / TileWidth;
}

(メソッドがpublicだったならパラメータは灰色で表示されなかっただろう。ReSharperは臆病だからpublicメソッドを見てくれないんだ。個々の警告を抑制する#pragmaがサポートされるようになればこれは直るかもしれない。その機能は次のリリースに含まれているそうだ。でもあきらめないように。ReSharperにはパラメータを削除する方法を知っている別の機能もある。)


パラメータを追加することがすごいわけではない。実際、局所変数を追加するのよりすごいことは何もない。すごいのは、呼び出し元に対して自動的に「正しいことを為す(Do The Right Thing)」ことだ。もし呼び出し元に、Conotrolインスタンスを返すようなあいまいで複雑な式を渡すようなものがあったとしても、結果は素晴らしい。あいまいで複雑な式の末尾には.Widthが追加されるだろう。


もっと複雑な式を抽出していてもうまくいく。他のパラメータだけでなくスタティックメソッドも使えるし、現在のクラスが持つインスタンスメソッドやプロパティであったとしても問題ない。ReSharperはちゃんと正しいことを為すだろう。


もう少し現実に近い例を挙げよう。コード中で実際にやるようなことに近いかもしれないし、近くないかもしれない。でもこの記事の残りの部分がフィクションだとしても、すごさが減るわけではない。


processor.ProcessFile(FileType.Foo);
...
public void ProcessFile(FileType fileType)
{
string fileName = this.Configuration.GetFileName(fileType);
...
}

僕らはConfigurationプロパティを取り除こうとしていた。テストハーネス内で何かをインスタンス化するのは怖いし大変だからだ。だからまずはthis.Configurationをパラメータとして抽出するところから始めた。


processor.ProcessFile(FileType.Foo, processor.Configuration);
...
public void ProcessFile(FileType fileType, Configuration configuration)
{
string fileName = configuration.GetFileName(fileType);
...
}

僕が本当にうなってしまったのは(君からすれば単純なことかもしれないが、僕は昔パーサーを書いてみたことがあるから、この手のことは評価するんだ)、呼び出し元に対してちゃんと正しいことを為したことだ。呼び出し元はprocessor.Configurationを渡している。追加したパラメータは、自動的に正しいオブジェクトの正しいインスタンスを使って渡されている。


いやー、すごい。

2007年7月6日金曜日

Day 24: フィールドの導入

元記事

31日間ReSharper一周」の24日目にようこそ。


昨日はReSharperの「変数の導入」リファクタリングについて話した。今日は「フィールドの導入」だ。


フィールドの追加は変数の追加にかなり似ているが、オプションが追加されている。



ここでは通常の変数名提案(ReSharper Optionsで指定した命名規約に従うもの)が動作する。


「局所変数の導入」と同じく、これも「式を全て置換する」チェックボックスを持ってる。ただ「フィールドの導入」はクラス全体に影響するから、青いハイライトやカラーバーの青い縞は式がいくつ置換されるのかを見る上でもっと便利になった(まあそれらが消えないっていう事実には相変わらず腹立つけど)。


「キャンセル」が文字通りの「キャンセル」ではなく「すべてハイライトさせる」として使われてるというまぬけなふるまいは「フィールドの導入」にもある。本当の「キャンセル」をしたければ、「キャンセル」をクリックした後にEscを押さないといけない(そしてもし本当の「OK」をしたければ、「OK」をクリックした後にEscを押さないといけない。ぎゃぼー)。


基本設定については特に言うことはない。オプションは見るだけでよく分かる。


テストコードを書くには


もしテストコードを書くなら、「××内で初期化する」系のオプションはテストクラスでは1つも使わないほうがましだと気づくはずだ。「現在のメンバー」が便利な時もあるかもしれないが、期待するようなものではないことが普通だ。(私見だが、「コンストラクタ」や「フィールド宣言」は、[TestFixture]付きクラスを書いているときには使用可能にするべきですらないと思う。テスト間の依存性をむざむざ与えてしまうことになる。)


「[SetUp]メソッド内で初期化」を付け加えるように、ReSharperに機能要求を送ったんだが、プラグインとして実装できるからと言われ、「修正しません」としてクローズされてしまった。もしそれが正しいなら、ReSharperプラグインAPIのドキュメント化を続行するという長い道のりを歩き出しているってことになるぞ。だってリファクタリングのサンプルなんてひとつも無いわけだから。書く予定があるとはビタイチ見えない。リファクタリングについては1節だってない。そういうことだから、もし誰かが、既存のダイアログボックスにラジオボタンの選択肢を追加して、その新しい選択肢は既存のリファクタリングの動作を変更するために使う、そんなReSharperプラグインを書こうと思っているならば、最大級の幸運が今すぐ訪れますようにと祈るだけだ。


これで世界の終わりってわけじゃない。「フィールドの導入」はそれでも適切に使える。ReSharperのほとんどの部分ほど良くは無い。手でSetUpメソッドのところまでスクロールしたりとか、そういったことをしないといけない。(にっこり)


もしテストクラスで「フィールドの導入」を使いたいのなら、うまくいくようにする方法は次の通りだ。もしもプラグイン用ドキュメント作成が回避されるんでなければ、それまではね。



  1. 「フィールドの導入」を使い、「現在のメンバー」を選ぶ。

  2. ReSharperが今生成した割り当て命令をカットして、[SetUp]メソッドにペーストする。


実際はそんなに大変じゃない。ただいらいらするだけだ。全てがとても簡単になったのに慣れてしまった。だから、いつもやってることを取り上げられて、簡単にするべきなのにきっぱり断られたりすると、がっくりする。

筋少×すかんち

行ってきた@C.C.レモンホール。メンバーはミウラ&愛理夫妻、ボビナ先輩、おれ。ミウラとボビナ先輩とおれは大学時代に筋少のコピーバンドをやっていた仲。



先陣はすかんち。


実はすかんちはそんなに知らなかった(恋のマジックポーションと恋のミラクルサマーだけだ。ごっつ世代)ので、事前にYouTubeなどで何曲か聴いておいた。改めて聴いてみたら結構面白いね。元ネタ探すのも楽しい。『恋するマリールー』はQueenの"Now I'm Here"とT-Rexの"Get It On"かな。『ウルトラロケットマン』はリフに聞き覚えがあるが思い出せない。全体的にZep風。Black Dogも。曲はExteremeっぽくもある。他に『恋の$1,000,000マン』も聴いた。どうやら定番曲のようだ。今回のステージでも演るかな?



すかんち セットリスト


  1. 恋のミラクルサマー

  2. タイムマシーンでいこう

  3. ラブレターの悲劇

  4. フローラ

  5. 恋人はアンドロイド(Vo. Dr.田中)

  6. 好き好きダーリン(Vo. Shima-chang)

  7. 伝説のスカンチンロールショウ

  8. 恋の$1,000,000マン

  9. 恋のマジックポーション



Rollyはギターも巧いが、歌も上手い。何より声がいい!オーケンとは比べるべくもない。


Keyboardは、前任のDr.田中と後任の小川文明が両方とも参加してた。Dr.田中はキャラ濃すぎ!小川文明はキーボード積みすぎ!


YouTubeで予習した曲は演奏しなかったが、大満足だった。



ステージを入れ替えて、筋肉少女帯の時間。


ギターアンプが2セット準備されたのを見て苦笑。橘高アンプはマーシャルを壁のようにスタックしていたが、おいちゃんのアンプはちんまりしていたからだ。


今回、というか再結成筋少の見所はなんといってもエディと橘高のカラミだろう。その二人による『サンフランシスコ』を楽しみに来たようなもんだ。



筋肉少女帯 セットリスト


  1. イワンのばか

  2. 仲直りの歌(ブースカver)

  3. 仲直りの歌

  4. 踊るダメ人間

  5. 君よ!俺で変われ!

  6. 神菜、頭を良くしてあげよう

  7. 日本印度化計画

  8. 戦え!何を!人生を!

  9. サンフランシスコ

  10. モーレツア太郎



『イワンのばか』から客は大興奮!やっぱりすかんちファンより筋少ファンの方が多かったみたいだ。


オーケンがブースカ人形を使って新曲『仲直りの歌』を披露するくだりはいかにもオーケンらしいグダグダ感。続く『ダメ人間』ではダメジャンプ(Xジャンプ的なもの)でぴょんぴょん。


そしてニューアルバムのタイトル発表!タイトルは『新人』……苦笑する客席。へこむオーケン。そりゃ誰だってネタだと思うだろう。


嬉しかったのは『戦え!何を!人生を!』から『サンフランシスコ』の流れ。いやー来てよかった。そして最後は『ア太郎』。これは完全に予想外。このあたりが80年代的というか、エディがいてこそというか。


最後は両バンド出てきて、学園天国で〆。楽しゅうございました。

2007年7月5日木曜日

「休日情報Webサービス」をREST対応にする


サービス概要


日本の休日情報を提供する Web サービスです。
SOAP 1.1 および 1.2 に対応しています。REST にはサーバの都合により対応していません。


bear.mini の実験室 「休日情報 Web サービス」

いや、それはサーバの都合じゃなくて、実装してないだけだと思う。確かにASP.NETならSOAPによるXML Webサービスを書くのは簡単だけれども。(←私の勘違いのようでした。bear.miniさんにお詫びして訂正。)面白いと思ったので、自力でREST対応したらどうなるか書いてみた。

ってなわけで、サンプル書いてみた。ソースコードはzipにしておいた。


ポイントはいくつかあるが、



  • HTTPハンドラを使う
    .ashxファイルのこと。詳細は「HTTPハンドラによる動的コンテンツの提供」がおすすめ。

  • System.Xml.Serialization.XmlSerializerを使う
    HolidayInfoとかHolidayNameとかをXMLとして出力するなら、このクラスがお手軽。「ステップ7ハンズオン: XMLを利用したオブジェクトの永続化」や、@ITの記事あたりがわかりやすい。

  • System.Xml.Serialization.XmlRootAttributeやSystem.Xml.Serialization.XmlElementAttributeを使う
    XMLのシリアライズ結果を調整するには、上のカスタム属性をシリアライズ対象クラスに適用するといい。

  • Newtonsoft Json.NETを使う
    JavaScriptから呼び出すならXMLよりJSONのほうが嬉しいのだが、JSON関係は共通ライブラリに含まれていない。自分で書いてもいいんだけど、OSSとして公開されている(ライセンスはCC-BY 2.5)ものがあるのでそれを使う。


といった所か。

2007年7月4日水曜日

フリーセル

携帯アプリでフリーセルをやっているのだが、どうにも解けない問題がある。悔しいのでコンピュータに解かせようと考えた。いい練習なので自分で書いて実行してみた。


そしたら。2分ほど考え込み、得意げに(?)出してきた手順が2万ステップ弱。


アホなロジックにしたのは俺なんだけど、つい笑ってしまった。

2007年7月3日火曜日

マイコンBASICマガジン(ベーマガ)

まさにプログラマの原典!「ベーマガ」の魅力


暇なときに、リンク先のアンケートに答えてみる。(あとで書く)


Q. 『マイコンBASICマガジン』を読み始めたのはいつごろですか?


最初に読んだのは……覚えていないが、買い始めたのは11歳のとき、1986年12月号。
この年のクリスマスに親の許可が出て、MSX2(FS-A1)を買ったのだ。うちはファミコン禁止だったけれど、交渉の結果、MSXはなんとかOKになった。
ちなみにそれまでは電気屋の店頭に置いてある8ビットパソコンをいじったり、パソコンを持ってる友人の家に遊びに行って何時間もプログラムを打ち込んだりとかする、迷惑なガキだった。
話を戻して、ベーマガを買うようになったのはMSX2を買う直前からだ。

Q. 『ベーマガ』をどのように利用していましたか?

ゲームプログラムを打ちこんだ。基本はMSX(2)。他機種のゲームをMSX(2)に移植しようと思ったこともあったが、スクリーンの解像度は違うし、キャラクタとグラフィックは同時に出せないしで挫折した。Dr. Dのプログラムアドバイスみたいなのは参考にした(読みやすいコードにしろとか、スパゲッティは悪とか、サブルーチン化するとか、マルチステートメントにはしないとか)。
でもどちらかと言うと、(BASICのPLAY文を使った)ゲームミュージックプログラムの方が熱心だったかも。こういうのは他紙にはあまりなかったように記憶している。ゲームミュージックスコアは嬉しかった。小学校の音楽の時間、合奏曲を決めるときにアウトランのMagical Sound Showerを持ってったら音楽の先生から却下された(当然だ)。
パソコンショップの広告を眺めてたけど、2桁万円以上は小学生に手が出るはずもない。
あとは、ゲーム紹介読んだり、読者投稿読んだり、手塚一郎のファンタジー通信読んだり(ゲームブックが載ってたこともあったような)、そんなとこか?

Q. 思い出深い記事は何ですか?

(あとで書く)

Q. 競合誌と比べていかがでしたか?

(あとで書く)

Q. 『マイコンBASICマガジン』が今のお仕事にどのように影響していますか?

(あとで書く)

Q. あなたにとって『マイコンBASICマガジン』とは?

(あとで書く)