RakeでRailsのユニットテストを走らせたら不可解な現象が。
ActiveRecordの属性を取得するところで何故かArgumentError("wrong number of arguments")が。
ARの属性メソッドはmethod_missingで実現されてて、で、Rakeを走らせるとRakeがFileUtilsとかいろんなものをObjectにincludeしてくれるせいらしい。それで、属性のgetterを呼んだつもりがそのモジュールのほうへ行ってしまった。
ここ数日、普段と違うRailsの使い方をしてたら色々初歩的なところではまるなぁ。
今まで何回かContinuationネタで使ったことがあるActiveRecord用の「途中でコミットできるトランザクション」をrailsプラグインにしてみた。なんか、意外と自分で実用することが判明してきたので。
ActiveRecord::Base.transactionを拡張して、途中で「ここまで保存」する機能を提供する。
$KCODE = 'u'でrailsを動かすとSQLServerへのクエリがエラーを起こすんだが。 前にメーリングリストでも見かけたことがあったような。で、$KCODE = 's'で我慢しるってことだったような。
ちょっと試してみた。
自分が不快であるというだけの理由で他人の人権を制限し、尊厳を剥奪したり自己存続をやめさせようとする輩がいる。
私は彼らを甚だ不快に思うのだけれども、彼らは私のために自己存続をやめてくれるのかね。自己は存在すべきでないと考えるのかね。
まぁ、私は彼らには存在する権利があると思うし、私が不快であるというだけの理由で自己存続をやめて欲しくはない。生きてほしい。けれども、彼らが自身の思想に殉じてくれたとしても、それはそれでひとつの問題解決ではあるので構わない。
SQLServerのrand()は同一のクエリ内においては常に一定の値を返すのね。
だから、order byにランダムな値を与えてシャッフルしようと思ったら、一工夫必要。Black Rainさんという方が書いてらっしゃるのを見つけた。 こんなの。
結果セットの行ごとに異なる値で、かつ時間に依存して毎度変化する値がほしいわけだから、行のidか何か(行依存成分)+RANDの値(時間依存成分)を使う。ただし、このままだと行のidに対して単調増加で意味がないから、それでタンジェントに掛けてから変動の激しい下位桁を使ってる。なるほど。
さしあたってはこれでいいかな。
「rubyのcatch throwは安心して利用できるのか?」が面白かった。今まで使い込んだことがないから深く考えてなかった。いわれてみると、確かにブロック付きメソッドが勝手にthrowを握りつぶすと問題があるな。
でも、どこだったか忘れたけれども標準ライブラリか何かで「このシンボルをthrowします」「catchします」ってドキュメント化されてるのを見た記憶がある。そのドキュメントの意味は上の記事を読んで初めて気づいたわけだけれども。
それに、ドキュメント化しないままに勝手に握りつぶしたり翻訳したりすると問題があるのは例外も同じだしな。Rubyと限らず、C#のdelegateやJavaの匿名クラスをコールバックに用いている場面でその中から例外が発生したのを握りつぶしても同じだしな。
だとすると、結論は「catch, throwは問題がある」ではなくて、「例外やRubyのKernel#throwの使用に当たってはきちんとドキュメント化しましょう」だな。とりあえず、上の記事で例示しているFind.find, Optparse#order!, PStore#transactionは現在ドキュメントに何も書いていないので問題だな。
私はJavaがドキュメント化の習慣をChecked exceptionsとして言語仕様にきっちり組み込んでるのが好きなんだけど。だから、SQLExceptionがうざったいのはよくよく分かるけれども、それでもRuntimeExceptionの乱用は好きじゃない。Spring Frameworkはその辺勝手に例外翻訳しすぎだと思ってる。
とにかく、Rubyのライブラリ作者は、catch, throwするときにはドキュメントに書きましょう。もちろん、例外も。
要件の大枠は決まってるけど詳細な仕様は未定のときとか。要件を満たすために実現しなければならない仕様に気づいたけど今は他の項目をGreenにしようとしてる最中で仕様を詰めることに頭を使いたくないときとか。
[Test]
public void ○○のとき××は△△であること()
{
Assert.Fail("について、あとで書く");
}
ogijunさんには足を向けて寝られない。
property injectionでは、インスタンス変数だけ宣言してもプロパティを作らないとInjectされないよー、と。されないよー、と。
3回同じミスではまったから書いておく。
つーか、C#はだいぶ改善はされてるけどやっぱりRubyに比べるとプロパティの宣言が面倒すぎ。VS2003だとコードの自動生成もしてくれないし。VS2005ならしてくれるのかな。コードを畳めるのは素敵なんだけど。
Second Lifeを始めた。
あれ? 基底現実で服を買いに行く予定が、Second Lifeで服を探して一日終わってしまった。
RubyにおいてProcやMethodをできるだけ普通のメソッドに近い構文で呼び出すために、まつもとさんもずいぶんと試行錯誤しているというのは呼び出し可能シリーズ初回で見たとおり。
朝起きたら左耳が痛いのでお医者にいきました。急性中耳炎だそうです。左耳がよく聞こえない。
Rubyの本読書会で、今度の会社では.NETやってると言ったらささださんに「Railsをやれる会社に行こうとは思わなかったの?」と訊かれた。
その発想はなかったな。言われてみれば確かにそういう選びかたも理屈の上では存在する訳だ。
でも、私にとっては開発する内容が一番問題で、あとは開発態勢や体質が問題で、言語やフレームワークはあまり拘らない。というか、私が付けてる開発内容の条件を出した時点で他の条件を付けるだけの選択の余地があまりないというか。まぁ、もし選べるならRubyかSchemeがいいけどRailsである必要はないし、そもそもWebアプリでなくていい。私の知識じゃ組込みやゲームや汎用機は無理そうだけどさ。
Railsをゴールデンハンマーにはしたくないやな。やりたい開発をやるかたわらで、Railsが適してる部分にはRailsを使っていけばいい。というわけで、今日、これから社内向けの業務支援機能はRailsでチョロッと作ることに決まった。
テレビゲーム、PCゲームの類はまったくと言っていいほどやらないのだが、なんか買ってしまった。なんであれ文章を読むのは好きだから、実はノベルゲームとは相性がいいのかもしれない。

たまたま広告リンクのところで「そう、あたしたちはこんなにも理不尽な世界に生きているのだらよ」というタイトルに「だらよ?」と興味をひかれて見てみたら、以前読んだ何かのレビューでこのシリーズの「ANOSシステム」を絶賛しているのを思い出して、引き込まれた。ギャルゲー風に見えるけれども違うらしい。ギャルゲーじゃないなら、楽しめそうだ。で、思わず買ってしまった。
分岐する物語を行き来することで、物語世界の時間軸とは別の、読者にとっての時間軸をもたらすとともに、交錯する時間を表現の中に織り込んでいくという発想は興味深い。「多層的立体的に積み重なっていく累積的シナリオを構築するシステム」ということなのだそうだ。ふーん。
12月1日で、転職しました。