トップ 最新 追記

日々の破片

Subscribe with livedoor Reader
著作一覧

2005-01-01

_ 年の初め

去年は大晦日に大雪は降るは、インド洋でとんでもない災害は起きるは、12月なのに蒸し暑い日があったり、夏は過ごしやすかったりしたものの6月からばんばん台風が来て大きな被害をもたらしたり(林檎が吹き飛んだ直後の弘前とかに旅行へ行ったけど、本当に林檎が落ちまくってたし)、新潟などで大地震があったり、ASIMOが走ったりと、実にいろいろあった年だった。

今年がどんな年になるのかはわからないが、とりあえず寒すぎたり暑すぎたりしないといいな。


2005-01-02

_ BitTorrent

なんとなくメタインフォの取得まで実装してみた

っていうか、こんなことをしている余裕は無いような気が。


2005-01-03

_ 細分化する世界

最初の頃のプログラミング言語には、サブルーチンというような考え方はなかったはずだ。なぜなら、スタックマシンの登場は比較的最近(ていうこともないか)だし、スタックなしで戻りアドレスを保持するには相当特殊なことをしなければならないからだ(というか、そういうマシンを知っているし)。

でもLISPには再帰関数があるな、と書いた瞬間に気付いたが、実用の世界(リアルワールド)の話と限定すればいいか。

で、構造化されたりモジュール化されたり細分化されるようになった。オブジェクトというのも細分化の1つの方法だ。

というようなことを考えれば考えるほど、AOPっていうのは理に適っている流れに感じる。ただ、ちょっと僕が考えている実用の世界のプログラム(というか業務アプリケーションプログラムということだが)では、向きが反対なように感じられるのは、AOPがOOPの上に乗っかるように今のところなっているからかな。

つまり、何をアスペクトと見るかということだ。現時点のAOPの例を見る限り、業務処理(機能そのもの)をアスペクトとは見ず、非機能要件に関する部分をアスペクトとして記述する方向がうかがえるからだ。

そうではなく、機能は(フレームワークで言うところの)ホットスポットに相当するのではないだろうか。で、ホットスポットを切り替える/差し替える/充当する(この言葉がいちばん適切な感じがするな)のにアスペクトを利用できるようにするのが良いように思える。

データがあるとする。面倒だから従業員でいいや。こいつの給料の計算をどうするかは、実に多数のファクタで決定される。基準額、時間あたり単価(は時間外勤務手当ての計算に使われる)、勤続年数、歩合(これは部門に依存するかも)、家族構成、考課、所属部署(というか職能か)、休日勤務数、差し引く代休数(時間数かも知れないし、日数かも知れない)……。

で、これらのファクタは極端に言えば日ごとに変化する。

が、データそのものには社員コードのように不変なものから、今月の勤務時間数、本日の時間外時数、本年度の職能、本年度の勤続年数、今期の考課、本日の売上などの可変なものまである。

実際の計算は複数のマトリクス(これは給与規定によって通常年度ごとに決定される)を適用した結果に対して法律的なルールと企業独自のルールによって制約(ただし最大???円まで、最大???時間までというような制約)をかけて求められる。

ここでマトリクスと制約をシステムとしてどのように持つかによって実装戦略が決定されることになる。

1つの巨大なループ処理の中で計算する(その過程でデータを引っ張ってくることになる)ように設計すれば、これはTransaction Scriptパターンによる実装ということだ。

マトリクスを主となるデータに従属させ、そこで求めさせた結果をまとめるように設計すれば、それはDomain Modelパターンによる実装ということになる。

だいたいにおいて、ウィジェットをオブジェクトとして扱うように、業務処理をオブジェクトとして扱おうという発想自体が筋が悪いのだ(ロジックの分散設計にオブジェクト指向を援用することには問題はないと考えられる。経験的に)。

オブジェクトはアイデンティティを持つが、ルールやマトリクスにアイデンティティは無い(実際にはあるが、あくまでもシングルトンでしかない)。正しく現実をシステムへ写像すれば、オブジェクトは単なるデータとしてしか出てきようがないのだ。

OOPはシミュレーションのために生まれ、GUI(むしろ古式ゆかしくマルチメディアというべきか)プログラミングによって育まれたプログラミング言語だ。その言語をビジネスの、つまりリアルワールドのシステムの構築に利用しようとしたときに、もってこなくても良い、余分なOOの尻尾がついてきたと見るのが良さそうだ。その尻尾の最たるものがOOAあたりかも。勝手に伸びて木に巻きついているから始末に悪い。

人間のシステムはサルのシステムではない。尻尾はいつか切らなきゃならない。

現実的な解決策はストラテジとしてルールやマトリクスを組み込むことだ。それは正しく現実のシステムを正しく写像している。次にすべきことは、このストラテジをシステムに対する変更/修正ではなく、あたかも給与規定書を変更するように、簡単に置換できるようにすることだ。給与規定の変更は別途行うシミュレートなどによって熟成させる必要はあるだろうが、適用は即時だ。

しかしシステム化された場合、適用のために要求の決定(別途行うシミュレートなどによる熟成フェーズと等しい)の後に、仕様化−設計−開発−配備というステップが必要になる。これはおかしい。かえって工数が必要になっている。

ここでのマトリクスやルールが、システムへのパラメータとしてあらかじめ決定可能なものならば、それはパラメータとして実装すれば良いから何も問題はない。適用はパラメータの変更で済むからだ。

だが、実際は人間にとっては何の問題もない計算方法の変更であっても、それはいわゆるパラメータの変更の範疇を越えてしまう(乗数の変更程度であればもちろん問題はない。健康保険の本人負担分の上昇程度なら)。

というか、基本的にはパラメータ化されているのだが、そのパラメータがただ事ではなかったりするので、そのパラメータのメンテナンスするための特殊技能の持ち主が必要となったりしているという現状もある。また、パラメータというのは、そのパラメータをプルしてきて、内容について実装で面倒みなければならないという点からあまり筋が良い手法とは考えにくい。

想起するのはWebアプリケーションの進化だ。CGIは、完全に外部の(HTMLを吐く)アプリケーションの呼び出しで、続くのは埋め込みHTML(埋め込みアプリケーションかな)、そしてWebアプリケーション自体をホットスポットとして交換可能にしたサーブレットコンテナやASP.NETだ。

業務システムはまだ埋め込みHTML(過剰パラメータ)とCGI(完全な作りこみ)が共存している状態に近い(入れ子になっていることに注意。WebサーバーとWebアプリケーションの関係を、Webアプリケーションの中に見ているのである)。サーブレットがそのコンテキストでは(パフォーマンス要件が理由だとしても)シングルトンだということに注目すべきだろう。

なんて書いていたら6時か。外が少し明るい。やめた。

本日のツッコミ(全6件) [ツッコミを入れる]

Before...

_ arton [おお、識者と認められたぞ。]

_ みけ [小僧、サブルーチンは、1940年代にM.V.ウィルクスがEDSACを作ったことから存在しているぞ! つ〜か、水銀遅延..]

_ arton [人間は同じことをする必要ないと思うよ。 貴兄は僕に歴史を教えてくれるといいな。そうすれば僕は業務における効果的な実装..]


2005-01-04

_ それって愛かも

千駄ヶ谷にOne's Dinerというバーとハンバーガーショップが合体したような店がある。良くアメリカ映画に出てくるドライブインとかを想像すれば良い。腎臓を象った50年代風インテリアとか使っていて(と思ったけどちょっと嘘だな)。50セントででっかなペプシの壜が買えた頃の雰囲気ということだ。

で、そこで飯を食うのだが、こういった皿にハンバーグと刻んだピクルスとトマト、玉ねぎ、レタスをどっかんどっかんと並べて、ちょっと焦げたバンズを2枚無造作に置いて、フレンチフライドポテトを山盛りにしたスタイルで食べるハンバーガーはマクドナルドより遥かにうまい。テーブルの上のサルサソースをベチャベチャにかけて全部まとめて分厚いハンバーガーにして両手で掴んでガシガシ食べる。ケチャップとマスタードを皿の空いたところ(ってのが無かったり)に搾り出してポテトを食べる。しかし、これっぽちもヘルスィーじゃないね。

反対側の窓際の席では、若い頃のキースキャラダインのような感じの小僧が二人、何か良からぬ相談をしていたり。

というところでBGMに耳をとめる。

いきなりコステロが唄っている。

Armed Forces(Elvis Costello)

オリバーズアーミーはすごく軽快だ。好きな唄だ。

で、プリテンダーズ。ニューウェーブのボーカルが強いギターバンドが続くな。

Learning to Crawl(Pretenders)

バックオンザチェインギャングだ。この曲が流れる店に外れはない。それくらいの名曲だ。

で、次に衝撃を受けた。最初のリズムを刻むところに哀愁フレーバーが盛り付けてあるので一瞬キラークィーンが始まるのかと勘違いしたがすぐに打ち消された。

これはなんだ? It must be love, love, love...というリフレインは記憶にあるのだがさっぱり思い出せない。でも、すごくいかしている。フラットにリズムを刻んでいる上に唄を被せている部分もすごくいい。アレンジも文句なしだ。とにかく、it must be loveというキーワードをメモして後で調べることにした。

で、調べた。検索したらBBCのサイトが見つかった。しかし一昨日はBBCが作ったオーストラリアのTV番組を見たし、どうもBBCはついてまわるな。でもそれはそれとして

ベスト・オブ・マッドネス(マッドネス)

マッドネスのイットマストビーラヴはすごい傑作だ。オリジナルのメロディーラインをうまく利用して完全に独自のリズムにしてしまっている。唄もいい。

Touch(Eurythmics)

で、食べ終わるころには、ユーリズミックスが『また雨が降り出した』と唄い出した。

50年代のUSと80年代のUKと00年代のJPか。

本日のツッコミ(全1件) [ツッコミを入れる]

_ toshiyukisasaki [コステロは毎回、来日に行ってますが、50前なのにルー・リードよりも長老に見えて、樽の様な腹のせいなのかと勘ぐっていま..]


2005-01-05

_ 夜更かし

くせになってるよ。まずいね。

本日のツッコミ(全2件) [ツッコミを入れる]

_ Makoto [同感。正月恐ろしや。]

_ arton [しかも太ったりするしね。]


2005-01-06

_ そこそこ早起き

今日はいい感じかな。

_ 僕の大事な

ぼーくのだいじなLDプレイヤー

20年前に買ったLDプレイヤー

リモコンにひーもがついてるよー

つーいに回らなくなっちゃったー

どーしよーどーしよー

おっぱっぱらぱっぱぱっぱらぱっぱのぱおぱおぱ

おっぱっぱらぱっぱぱっぱらぱっぱのぱおぱおぱ

——僕の大事なクラリネット

どのくらい大事かといえば、

・ベルトリッチの1900年完全版! (これこそ映画の中の映画だなぁ、とつくづく思う。リアルの映画でここに入ってない要素って無いんじゃないかな)

・死の都 もちろんコルンゴルドのオペラだよ。ホルライザーが振ったベルリンドイツオペラのやつで日本語字幕版。ちなみにラパロマそのものはDVDにもなってるみたいだが、僕はコルンゴルドのメロディが好きなのだ。

・エドワードヤンのクーリンチェ少年殺人事件と恐怖分子

・アルトマンのボウイとキーチ

パリの灯は遠く [DVD]

・ロージーのパリの灯は遠く (DVDだって絶版だ)

・ジャームッシュの記念すべきロングバケーションパーマネントバケーション

・ケネスアンガーのマジックランタンサイクル

・ジャンヴィゴのアトラントアタラント号(なんで、これがDVDで出てないんだ?)

・ニコラスレイの大砂塵

・ニコラスレイの理由なき反抗

・ファスビンダーのマリアブラウンの結婚

まあ、大事なんだけどしばらく使ってなかったね。ちなみに最初に購入したLDはディーバとブレードランナーとヴィデオドロームというスタイリッシュで特徴的な3枚であったな。さすがにこいつらはDVDでも出てるね。

魔笛*歌劇 [DVD](サヴァリッシュ(ヴォルフガング)/モーツァルト/バイエルン国立歌劇場管弦楽団/バイエルン国立歌劇場合唱団)

で、こないだニューイヤーオペラ見てて子供が魔笛に興味を持ったみたいだったからサバリッシュだけど何しろ夜の女王がグルベローヴァだから購入したLD(DVDにもなってるけど別にこれ自体はそんなに惜しくはないけど)を見せてやろうとしたら全然動かなくて愕然。

Pioneer DVD/LDコンパチブルプレーヤー DVL-919

というわけで購入するしかないか、とか。

追記:マーケットプレイスにしか無いじゃん……。でも新古品みたいだからいいか。とクリック。


2005-01-07

_ GUIDの恐怖

単純に(Windows2000より前の)GUIDをサロゲートキーとして利用すると時刻パートが先頭に来るためにインサートしていくと幾ら2分木を使っていてもどんどん遅くなるというワナ。(もちろん数万とか数10万という単位の話)

最後の6バイトを先頭に持ってくるとかすると結構良くなったり。

でも、Windows2000からはそういうことを気にしなくても良くなったみたいだ。結構、散らばっているように見える。

と、サロゲートキーという言葉を使ってみたくて書いたりして。

ちなみに、サロゲートキーの話は、るいもさんのとこから。

_ GUIDの文字列版を生成(というか表示)するrubyのスクリプト

#!/usr/bin/ruby -Ks
require 'Win32API'
createGuid = Win32API.new 'ole32', 'CoCreateGuid', ['P'], 'V'
guid2str = Win32API.new 'ole32', 'StringFromGUID2', ['P', 'P', 'L' ], 'L'
lpguid = ' ' * 16
createGuid.call lpguid
lpprtable = ' ' * 128
len = guid2str.Call lpguid, lpprtable, 64
s = lpprtable[0, len * 2]
print s.gsub("\0", '')
最初gsubの第1パラメータを'\0'にしてて、なんで変な表示になるのか不思議におもったり。

2005-01-08

_ Windowsが動くノートを買うべきか?

欲しいかどうかで言えば、別に欲しくはない。だってPowerBook 15で間に合ってるし。

でも、VS.NETが動くノートが無いとすごーく面倒なことになる予感。

かといってPowerBook 15よりでかいの買う気にはならないし。より携帯性が良いのなら買ってもいいかも? たとえばX31あたりならどうだろうか。しかし、VS.NETを動かすにはXGAではちと狭い。

ドンボックスみたく、Emacsでやりゃいいかも?

本日のツッコミ(全3件) [ツッコミを入れる]

_ 桑島 [X31はロードマップ的にはもう出なそうな雰囲気だったのに身売りが決まったとたん微妙にパワーアップしたのが出てるから、..]

_ むらまさ [X31のそれは確か、元々海外で出ていたのが日本でも出ただけだったような気が。]

_ 桑島 [遅レスですが、そうなんだ。 というか海外では出すのか。 日本の方が需要はある気がするのに。 いや僕は買わないけど。持..]


2005-01-09

_ X31

確かに身売り話と重なってましたね。と結局、11日までに白黒つける必要があったので買ってしまいました。Let's Noteは結構回りに使っている人間がいるのでパス(どうも、へそ曲がりだな)。赤いポッチは良く回るしボタンのクリック感もいいので相当気に入った。PowerBookと比べると全然熱くならないのもいいかも。

で、いろいろインストールしているうちに、もうこんな時間かよ。

なんか、とても凶悪でCoregaの802.11bのAPをハングさせまくるんだけど、なんでだろう? 無線はよくわからないので相当困ってみたり(で、有線でやっていたり)。とりあえず明日調べてみよう。でも、某所のAirMac Expressを引き上げる予定なのでそっちに単純に変えてみてから調べるかどうか決めようかなとか。(追記:ぜんぜんOKだ。ちなみにWPAパーソナルで使ってるが)

_ 今日のバカが往く

すげぇ、その通りだ。というか強く同感。

ある程度の規模になれば、どうしたって同じようなコードが出てくる。それら

をどうまとめるか。それらをまとめるうちにそのアプリ独自のフレームワーク

というのものが出来上がるでしょう。

——バカが往く(17:26現在)から引用

というわけで、こんなセッションをやらせていただきます。顔出しなんでここで告知する気はなかったんだけど。

ほんと、そう思うんだよね(で、こういうのって思ってるだけじゃしょうがないから実際にやってるわけだが)。

本日のツッコミ(全1件) [ツッコミを入れる]

_ ひが [私も家のノートが動かなくなったので、何買おうか迷ってます。 X31は第一候補なので、インプレッションよろしくお願いし..]


2005-01-10

_ X31インプレッション

カタログを見ると40G HDDは5400RPMで、80Gより回転数は早いんだけど容量はでかいのがよいので80Gモデルを購入(と決めていたけど実際問題店頭在庫もそれしかなくてまあ決まり)。

気に入った点:

キーストロークが深い(ただし、底打ち感も結構強いので好き好きはわかれそうです。僕は底打ち感がちょっと気になります)のは、しっかり打ち込むのにはよさそうです。またキーがきちんと分離しているので相当早いタッチタイピングをしていてもダブり打ちは(僕には)起こし難いようです。

PgUp、PgDn、Home、Endキーなどがちゃんとあるので、Fnキーを押す必要が無い点もよいです。

昨日も書いたけどトラックポイントの反応が良くて使いやすいことと、ボタンのクリック感が強いので使いやすく感じます。

HDDが2.5inchということで遅いんじゃないかと不安でしたが一応耐えうる程度の速度です。

あとなんと言っても軽いこと(といってもPowerBook 15"と比較しているから意味ないか)。

それからパームレストが痛くないこと(PowerBookは手前の角がわりと立っているのでちょっと痛いことがある)。ゆるいカーブが手前に来ているのが良い感じです。

でも、いいことより悪く感じる点のほうが参考になるでしょう。

気に食わない点

Fxキーが左に寄っている。というわけでF8などをさっと押せない。特にF1が半角/全角とEscの間に位置しているのでしょっちゅう押し間違えてしまいます。すると、なにしろF1だからへルプが起動されて面倒なのなんのって適わないですね。

Fnキーが無意味に場所を占有。PgUpなどが独立しているからなんの意味もないFnキーが本来Ctrlキーが占めるべき左端を占有しているのでEmacsやIMEの操作が結構な頻度で失敗するのも閉口もの。

変なキーがカーソルキーの左右矢印の上にある。なにか押した瞬間によからぬことが起きて違うウィンドウになったりするキーなのだがひき逃げになってしまっているので何が起きているのか良くわからない(でこういう場合に調べればよいドキュメントって特に付属していないように見える—「できるThinkpad」というのがオンライン付属しているのだが、これがまた役立たずなマニュアルの典型で知りたいことを調べられなくて通読すると結局出ていないというタイプのやつ)。なんなんだろう? で、困ったことにカーソルキー全体が1列分下にずれているので高い頻度で左右カーソルキーと打ち間違えてしまう。すると入力していた情報がどこかへ消えたりして非常に困る。

という具合でキーボードの配列関係に不満は非常に強い。確かに桑島さんがキーの変更ツールに言及されるはずですね。このあたりは(比較は無意味だけど)PowerBookのほうがすばらしい。

それから無線LANに癖があって(もちろん、AP側にくせがあるのかも知れない)切断状態になりやすい。ただし、AirMac ExpressでWAPパーソナルを利用した接続ではまったく問題が起きていないので、最近のAPとの組み合わせなら問題ないかも知れません。

ほとんどの場合問題ないとは言え、やはりHDDアクセスは早くはありません。具体的にはJ2SE5.0のJavadocのzipをWindowsXPのCompression Folderからのコピーという形で展開したら15分近く(追記:違うな。40分近かったようだ)かかりました。すごく遅い(でもCPUが遅いとは考えにくい)。ただし、他の環境ではWinZipでの展開だけでCompression Folder(正しい呼び方か自信なし)を利用していないから、単にExplorerが遅いのかも知れません。(追記:添付のNorton AntiVirusが影響している可能性が高いことに気づいた。大量ファイルの作成(読み込み)だからかも。普段使っているTrendMicroのやつとは雰囲気が違うな)

IBMのネットワークアクセス切り替えツールは便利。現時点で2種類の無線LANのAP、3種類のH"inの接続先、1種類の有線LANを設定し、それぞれで異なるプロクシ設定などをしていますが、それぞれの切り替えでうまく動作しています。

XGAというサイズも気にすれば気になります(気にしなければそんなもんで、視認性は高いLCDだと思うので悪くないです)。

音は最低。PowerBookとかiBookとかステレオに慣れてしまったせいで許し難く感じます。やせた音とかそういうレベルではなく、まったくお話にならないレベルです。

とまあ、気に食わない点もありますが、値段(僕の場合本体と512M増設メモリーと純正らしきリュック兼バッグで19万ちょいくらいだった——不正確なので-1万の誤差あり)に折り合いがつけば、安心感が高くて良いと思います。

・今のところ(といってもまだ高々100回もやっていないはずだけど)サスペンドからの復帰は常に完璧。これはでかいなぁ。ふたを閉めればサスペンド状態にすぐ入る(し、状態が三日月マークでふたを閉めていても確認可能)のも良いです。というか、以前使っていたwindwosのノートがひど過ぎただけかも知れませんが(もちろんPowerBookも半年使っていて復帰に失敗したのは2回程度しかない)

まあ、そんな感じです。プログラマ的には1.7GHzのPIII−M+1Gメモリーの能力が高くてレスポンスが結構良くほとんどストレスを感じさせない点(ただし、ディスクアクセスが大きくものを言うMeadowの初回^X-^FとかZipの抽出のような処理は遅い)も良いと思います。

_ 言ってることとやってることが違う

言行不一致だ。

機械にできることは機械にやらせ、人間は余分なことをしない(というかやらせるために余分なことをするのは全然OKなんだけど)主義者のくせに、キーボードだけは人間が機械に合わせちゃうんだな、これが。

常駐プログラムに対する根強い不信感があるのにもかかわらず、キーアサインについては自分で作るよりは指に覚えさせたほうが楽だと感じているからだろう。

本日のツッコミ(全6件) [ツッコミを入れる]

Before...

_ arton [それほど気にならないです。 元々ASCII配列とJIS配列とDEC配列(<>が変な場所にある)を同時に使..]

_ 桑島 [F1の速度が変えられるのは知らなかった。これでオフィスツールのお節介に耐えられそうです。 ブラウザキーは特殊なキーじ..]

_ arton [この情報は、すごくありがたかったです。桑島さんありがとうございます。]


2005-01-11

_ PPT

PowerとPointはわかるけどTってなんだろう? PoinTなのかな。

DDTに似ている言葉だな。

ZZTにもちょっと似ている。

RRTに字面は似ているけど音は随分違う。

ふむ、Googleにwhat is PPTと入れたらトップに定義リンク集が出てきたぞ。 Parts per trillionとか、Parts per Thousandとかか。


2005-01-12

_ Rjb 0.1.8

キャスパーのパッチを適用。0.1.7あたりから実装されていたがバグっていたもの。
require 'rjb'
Rjb::load('/usr/local/junit-3.8.1/junit.jar')
TestCase = Rjb::import('junit.framework.TestCase')
 ...
のように利用する。

Win32ならば;、Unixなら:を利用して複数のjarやクラスのルートディレクトリを指定可能。

なお、Rjb::loadはrjbの他のメソッドより先に呼び出す必要がある。

_ きれいな日本語

そこはただ闇雲に炭化しているだけです。

確かに燃えてしまえば清潔なものであるな。


2005-01-13

_ YARV

さて、せっかくPowerPC搭載のマシンがあるんだからやってみるか。

でも、さい先は良くないぞ。

$ cvs -d :pserver:anonymous@cvs.ruby-lang.org:/src login
(Logging in to anonymous@cvs.ruby-lang.org)
CVS password: 
 
cvs [login aborted]: connect to cvs.ruby-lang.org:2401 failed: Connection refused

(で、何度もトライしたんでログに相当書かれてしまっただろうな)

あきらめてcvswebでtarballを取得。

でもって

$ mkdir save
$ cp eval.c save
$ patch <../yarv-0.1.0/evalc.patch 
(Stripping trailing CRs from patch.)
patching file eval.c
$ diff save/eval.c eval.c
20a21,59
> 
> /******************************************
>  * for YARV                               *
>  ******************************************/
 ...(snip)...

でauatoconfして、make。DESTDIRの設定をミスって/usr/local/binのrubyを更新しちゃったけどまあいいか。

$ ruby -v
ruby 1.9.0 (2005-01-12) [powerpc-darwin7.7.0]

で、おもむろに(と一応gccのオプションを表示したいのでコピペ)

$ ruby extconf.rb
checking for ulong... no
creating Makefile
$ make
/usr/local/bin/ruby ./rb/insns2vm.rb -I. -I/usr/local/lib/ruby/1.9/powerpc-darwin7.7.0 -I/usr/local/lib/ruby/1.9/powerpc-darwin7.7.0 -I. -DDISPATCH_THREADED_CODE -DDISPATCH_DIRECT_THREADED_CODE -DOPT_BASIC_OPERATIONS -DOPT_REGEXP_MATCH -DOPT_STACK_CACHING -DINLINE_METHOD_CACHE 
gcc -fno-common -g -O2 -pipe -fno-common  -I. -I/usr/local/lib/ruby/1.9/powerpc-darwin7.7.0 -I/usr/local/lib/ruby/1.9/powerpc-darwin7.7.0 -I. -DDISPATCH_THREADED_CODE -DDISPATCH_DIRECT_THREADED_CODE -DOPT_BASIC_OPERATIONS -DOPT_REGEXP_MATCH -DOPT_STACK_CACHING -DINLINE_METHOD_CACHE  -c compile.c
 ...(snip)...
cc -dynamic -bundle -undefined suppress -flat_namespace  -L"/usr/local/lib" -o yarvcore.bundle compile.o compiled.o debug.o disasm.o vm.o yarvcore.o yarvsubst.o  -ldl -lobjc  

ちなみにgccはXCodeにバンドルされてるやつ。

$ gcc -v
Reading specs from /usr/libexec/gcc/darwin/ppc/3.3/specs
Thread model: posix
gcc version 3.3 20030304 (Apple Computer, Inc. build 1640)

うん? どこにyarvcore.soはあるんだ? と思ったらOS X版ではyarvcore.bundleになるのか(実は今まで意識してなかったり)

$ ls -l yarvcore.bundle 
-rw-r--r--  1 arton  arton  461636 13 Jan 03:09 yarvcore.bundle

では、テストだ。

$ ruby test/runner.rb 
Loaded suite test
Started
.....*eval*:11: warning: already initialized constant C
*eval*:11: warning: already initialized constant C
*eval*:11: warning: already initialized constant C
<*YARV eval*>:14: warning: already initialized constant C
<*YARV eval*>:14: warning: already initialized constant C
<*YARV eval*>:14: warning: already initialized constant C
.........................................................................................
Finished in 2.895308 seconds.
 
94 tests, 246 assertions, 0 failures, 0 errors

できてるらしい。では、benchmarkを取ってみるか。

すごい量なので、結果はここ。とりあえず、ここまでで今日はおしまい。

_ YARVアセンブラ出力(PowerPC G4)

vm.asm.txtです。

本日のツッコミ(全3件) [ツッコミを入れる]

_ ささだ [おー,どうもありがとうございます.x86 といろいろと違いますね. できれば,アセンブラ出力を出してもらえませんか...]

_ arton [できたけどサイズが大きいので夜になったら上げておきます。>vm.asm.txt]

_ ささだ [遅くなってすみません。わざわざどうもありがとうございました。でも、正直、見てもわかりませんですた orz rb/m..]


2005-01-14

_ 膝の上

PowerBookをラップトップとして使ってると、最初は暖かくていい気持ちなんだが、ふと気づくと痛くなっている。低温火傷の前兆なんだろうか? (あるいはもう手遅れか)

_ play it again, Sam

YARVを使って何かスクリプトを動かしてみようと思ったが、考えたら計算してドンドンみたいなプログラムって全然作らないから何も思いつかない。

そういや、sum(1)とかたまに使うし、あのあたりならどうかなと思ってman sumしたらアルゴリズムが書いてあったんで作ってみた。

This is a 16-bit checksum, with a right rotation before each addition; overflow is discarded.
——man sum (OS X)

こんな感じか

def sum(s)
  r = 0
  s.each_byte do |b|
    if (r & 1) != 0
      r >>= 1 
      r |= 0x8000
    else
      r >>= 1
    end
    r += b
    r &= 0xffff
  end
  r
end
 
File.open(ARGV[0], 'rb') do |f|
  puts sum(f.read)
end

でも、これだとtest.rbに埋め込めないから(ARGVがひっかかる)、適当なファイル名を入れてやってみたけど良くわからないや。

っていうか、readで一度に全部読もうとしているところが諸悪の根源と気づいたり。それでsum(1)だとバイト数じゃなくてブロック数が表示されるのか(多分、この単位で読み込むんだろう)。


2005-01-15

_ 魔笛

レーザーディスクプレイヤーが届いたので早速見る。

魔笛*歌劇 [DVD](サヴァリッシュ(ヴォルフガング)/モーツァルト/バイエルン国立歌劇場管弦楽団/バイエルン国立歌劇場合唱団)

最初、えんえんと(ほぼ)無音状態が続くのでちょっと不安になったり。

しかし、何度見ても(というほどは見ても聴いてもないが。ベームのレコードとか、ベルイマンの映画版とか、このサバリッシュ版のLDとか、全部1回ずつくらいだし)無茶苦茶な話で思わず笑ってしまったり。

最初大蛇に追っかけられて「お助け—お助け—」とタミーノ(これが民野という名前の日本人だというのは定説になっている)が逃げてくる。あきらかに、優男金と力は無かりけりの典型のような男で、事実3人の侍女もそういう言い方をしている。ところが途中から勇気に満ちた男として扱われてパミーナを救出することになる。何時の間に性格が変わったんだ? それはそれとして、なんでパパゲーノが自分が退治したと言い出すことになるのか忘れていたが3人で恋の鞘当をするからだったのか。

で、侍女がいなくなるとパパゲーノ登場。実にいい感じだ。

で、陽気で楽しくやっていることろに侍女が再登場。タミーノは絵姿に一目ぼれして恋の唄をえんえんと歌う。まあ、有名な曲だが個人的には退屈なんだが。

で、夜の女王の出現シーンは山が割れるからかっこいいんだね。でグルベローヴァの声が(姿も)実に美しい。コロラットゥーラソプラノってそれにつけても化け物のような存在であるな。で、切々と子供を奪われた母の心を唄う。うまい。

でムームームーがあって、最後は全員で嘘つきは良くないから正直に生きようとお説教ソングを大合唱(思わず笑ってしまうわけだが)してまずは幕。それにしても、この舞台だと黄色いレンガの道ではなくザラストロの城への案内の3人の童子が女性でしかも全員が青池保子のエーベル大佐のような顔の長い連中だったり(追記:大嘘。今、パミーナの自殺を止めるシーンを見てて気付いたが少年隊ですな)。

怪物あり、恐怖あり、勇気あり(3人の侍女の退治の唄)、嫉妬あり、陽気あり、恋あり、母心あり、教訓あり、でなんでもかんでも詰め込んでいるから、まさに御伽噺であるなぁ、とか。

このあとは黒いやつ(アラビアンナイトでもそうだが、ムーア人っていうのは実際はなんなんだろう)は邪であるといったドグマが出て来るんだが、魔笛がちびくろサンボみたく問題視されたのは見たことないな、と思ったり。というか全編好き勝手なことを脈絡なくつないだだけだから問題になりようもないような。まさに大衆娯楽の王道のような作品で、クラシックの殿堂に入れとくのはもったいないが、後半ますます説教くさくなるから(で、これ以上はご免だ、と思わせるたびにパパゲーノが登場して楽しませてくれるわけだが)それはそれでいいのかも。

それにつけてもパパゲーノがさっさと城に忍び込んでパミーナを助けているのに、タミーノは役立たずにも城の前でうろうろして呑気に禅問答したりしているシナリオの馬鹿っぽさは楽しいな。

_ シャウト・トゥ・ザ・トップ

アワ・フェイヴァリット・ショップ(ザ・スタイル・カウンシル)

この3日くらいで、5回以上シャウトトゥザトップを聴いたぜ。

というのは、どうも携帯の着信音をこいつにしてる人間が少なくても5人はいた勘定だ。

さすがに不思議になって昨日飯食ってるとき横にいたやつに聞いてみた。

なんで今頃スタイルカウンシルなんだ?

と、思わぬ答えが。そいつも良く知らないようだがなんかの朝のニュース時間のテーマソングになってるらしい。

ふーん、エバーチェンジングムーズ、イエーイ


2005-01-16

_ play it again, sum

やり直し。もっとまじめに作ってみることにしてbenchmarkのrun.rbを使って461636バイトのyarvcore.bundeleで測ってみた。(まじめに作ってみるというのは、どうせならsumではなくcksumの1〜3まで実装しようかなと考えたということで、とりあえずは-o 1つまりsumしか実装してない)

class BsdSum
  BLOCK_SIZE = 1024
  def initialize()
    @cksum = 0
    @block_size = BLOCK_SIZE
  end
  def sum(s)
    s.each_byte do |b|
      if (@cksum & 1) != 0
        @cksum >>= 1 
        @cksum |= 0x8000
      else
        @cksum >>= 1
      end
      @cksum += b
      @cksum &= 0xffff
    end
  end
  attr_reader :cksum, :block_size
end
#実際はオプションを見てアルゴリズムを変更するわけである
algorithm = BsdSum.new()
blk = 0
 
File.open('yarvcore.bundle', 'rb') do |f|
  until (s = f.read(algorithm.block_size)).nil?
    blk += 1
    algorithm.sum(s)
  end
end
#printf("%d %d %s\n", algorithm.cksum, blk, 'yarvcore.bundle')
で、結果は
$ ruby -I. work/run.rb
ruby 1.9.0 powerpc-darwin7.7.0(2005-01-12)
YARVCore 0.1.0 rev: 120 (2005-01-09)
[direct threaded code] [optimize basic operation] [optimize regexp match] [stack caching] [inline method cache] 
 ...(snip)...
--
      user     system      total        real
ruby  2.660000   0.020000   2.680000 (  3.543170)
yarv  0.950000   0.010000   0.960000 (  1.443204)

実際rubyで実行する3秒以上というのはずいぶんもっさりした動きなのだが、これが1秒(リアルだと3.5に対して1.5)になるということは相当大きい。

ちなみに本当のsumだとこんな感じ。

$ time sum yarvcore.bundle 
48013 451 yarvcore.bundle
 
real	0m0.074s
user	0m0.000s
sys	0m0.010s

_ そりゃそうだ

あ、確かに試してみようとする人の役には立たなかったかも。

artonさんのエントリだと 「/usr/local/bin に ruby-1.9.0 いれちゃうのはイヤだなぁ」って人もいそうなので、極力通常の環境に影響しないやり方で。

あれだとautoconfからmake installまですっ飛ばしてるし、元々libは1.9で別になるから単純にbinの位置だけ変える(DESTDIRだけ設定する)というのを想定してたので参考にはなりませんね。

僕が、まあいいかで済ませられるのは必要になったら

$ sudo rm -rf /usr/local/lib/ruby
$ cd ruby-1.8.2
$ sudo make install

すりゃいいやってのがあるからだけど普通はそうではないでしょう(というか、事実そうではないからWin32マシンではcvsヘッドを試すとかやらないわけだし)。

うん、はやるといいな。

_ 今日のお言葉

重要なのは巨人の肩に乗り、他人の概念やアイデアの上に、改善を積み重ねていくことです。

——リヌス・トーバルズ

『改善を積み重ねていくこと』をやらずに、ただそのまま利用するあるいはそれを勧める連中(as is野郎と言えば良いかも)がいかに多いことか。

本日のツッコミ(全2件) [ツッコミを入れる]

_ たむら [せっかくなんで流行ればいいなぁ、位のノリです。 ちなみに、私も「まぁいいかかで済ませられる」んですけどね :-)]

_ arton [早いなぁ、というかTB撃ち損なったのを拾ったのかな。]


2005-01-17

_ rjb-0.1.8

って、中身は0.1.7のままだった...orz

でもパッケージングはやりなおさずに0.1.9の完成を急ぐ(throwできるようにする)。

_ rjb-0.1.9

例外を実装。

こんなふうに使う。

class Iterator
  def hasNext()
    true
  end
  def next()
    Rjb::throw('java.util.NoSuchElementException', 'test exception')
  end
end

直接インスタンスを作成しても良い。その場合

def next()
  ns = Rjb::import('java.util.NoSuchElementException').new('test exception')
  Rjb::throw(ns)
end

となる。でも、catchした例外の再スローはできないな、まだ。

SQLException投げようとして実装してないことに気付いたんだったり。


2005-01-18

_ HTTPメソッドの対称性

ちょっと迷ってるので考えを整理するためにメモ。

状況:JavaのオブジェクトをバイナリシリアライゼーションしてPOSTする。

問題:サーバは何を返送するのがきれいか。

わかっていること。HTTPのメソッドはGETとPOSTがある(DELETEとかもあるし、HEADもあるが、この場合関係ないので無視)。

GETは、ファイル転送要求なので、パスに対して(それがなんであれ)ファイルが返送される。それはそういうものだとして。

POSTってのは、なんだろう? 投稿と考えれば投稿結果が返ることになる。実体はフォームに対してHTMLが返るとしても、意味的には投稿した文章が反映された文章が返るという処理だろう。

でも、今やPOSTは投稿とは限らない。さらに実装を考えると型を無視するのもなんか気持ちよくない。public T post(T data);と同じTとしたい。で、String post(String newOpinion);というのはきれいだが、ここではObjectを送りたいのである。

でも、それはそれとして、POSTはやっぱり投稿だと考えることもできる。その場合、オブジェクトを投稿したら、結果を反映したHTMLが返るのが良いかな。トマトをぶつけたらトマトが返ってくるのではなく説教が返ってくるということだ。なんのことやら。

でも、フォームは文字列で、それに対して文字列が返るという、基本型での型の対称性を考えてしまうと、オブジェクトを送ったらオブジェクトが返るほうがきれいな気もする。でも、そのオブジェクトをデシリアライズしたら文字列になるのだとしたらなんかばかばかしい。

アドホックにやるなら、なんでもできるんだからオブジェクトを返すのが良さそうなのだが。

本日のツッコミ(全6件) [ツッコミを入れる]

Before...

_ なひ [> 投稿と考えれば投稿結果が返ることになる。(略)意味的には投稿した文章が反映された文章が返るという処理だろう。 ..]

_ arton [いや、だったらPOSTなんてメソッド名を付けるとはちと考えにくい(だってGETときたらPUTとなるのが普通だと思うん..]

_ arton [ちなみにRMIというよりは単にエンベロープとしてJavaのクラスを使うってだけの話です。(メソッドを呼ぶというのとは..]


2005-01-19

_ ASR-1.8.2.2

nyasuさんの更新を受けてSwin050117とvruby050117、それからこないだ作ったrjb-0.1.9に更新。

あと、1.8.1までは入れていたrequire 'irb/completion'を忘れていたのでirb.batに記述追加。

_ キンクス

Ultimate Collection(Kinks)

最初にキンクスの名前を知ったのは、山田ミネ子の書いたLSDの作り方についての1ページくらいの埋め草のマンガだ。なんでそんなのを覚えているんだか。

でも、そんな古いバンドに興味はないからそれはそこまで。というか、UKの昔のバンドって歴史上の話になってしまうから、ビートルズとストーンズまでは一応聞いてみてもフー(これはケンラッセルのトミーを見たから聴いたことはある)とかあたりになるとさすがにいちいち聴かなかったり。

リアリティ(初回)(デヴィッド・ボウイ)

ところが、ボウイが(この人も十分古いんだが)カバーしたウォータールーサンセットがあまりにも美しい曲なんで、どうしてもオリジナルが聴きたくなった。

で、買った聴いた驚いた。

シーナアンドロケッツで良く聴いたユーリアリガットミーってこいつらだったのか(というか多分その頃は知っていたんだろうが)とか、ジャムでもお気に入りなデヴィッドワッツってこいつらだったのか(ジャムはやたらと詰め込んだコンパクトジャムというアンソロジーを持っているだけなので個々の曲は意識して聞いてなかったりする)とかストラングラーズのヒーローズじゃないのかのオールデイアンドオールオブザナイト(良く考えたら同名タイトルのライブ版でストラングラーズもカバーしてたな、でもホンモノを聴くまでは良く把握していなかったり)、プリテンダーズのデビュー曲(だと思ったけど)のストップユアソビングとか、確認できたのはそれだけにしても、あのビート、このメロディー、なんかどこかで聴いたようなのがわさわさ入っている。まさに宝貝のようなアーティストであるな。

すげぇや。

(蛇足:中村八大ってキンクスみたいだな)


2005-01-20

_ 漢字カタカナ混じり文

これは皇室典範だけど、なんで、漢字+カタカナという表記があって、かつ、今はなくなったんだろう?

印刷上の問題ではなさそうなのは漢字を使っているからだが、それなら平仮名と混ぜれば良い気がするんだけど。

それなのにカタカナを使うメリットは、当時は平仮名が一般的ではなかったんだろうか(なわけがない。江戸時代の絵草子とか平仮名だし)、それとも片仮名には何か特別な意味があったんだろうか。もちろん慣れと教育の問題だから明治の頃は漢字片仮名混じりが読みやすかったという可能性もゼロではないだろうけど(でも相当怪しい。夏目漱石とか小説だって漢字平仮名混じりなわけだし)。

今は、片仮名の役回りは外来語の表記と特殊なキョウチョウくらいなもんなわけだが。

追記:そう言えば明治時代の教科書って最初が「ハト マメ マス」とカタカナで始まってたような覚えがあるな。

本日のツッコミ(全6件) [ツッコミを入れる]

Before...

_ arton [おお、これはおもしろい。読んでみます。どうもありがとうございます。]

_ joe [こんにちは。高島俊夫「漢字と日本人」によると、「かな」というのはあくまで「仮名」であって本式でない文字であり、男は漢..]

_ arton [なるほど。どうもありがとうございます。 rucilaさんの「片仮名は元々漢文のお経を書き下すため」、joeさんの(高..]


2005-01-21

_ わたしこのごろ変なのよ

ちょっとしたことで、何かを思い出すことがある。

ほら、マドレーヌを食っただか、紅茶の匂いを嗅いだかでスワン家のことを思い出すようなもんだ(シュレンドルフかな? とまた新たな記憶が呼び出されたが)。

で、月があまりにでかくて丸いので、ニャースの唄じゃないが、子供のころ家にあって他に聞くものがなくて聴いたレコードのことを思い出した。

『ヤケッパチでナンセンスでフラッパー丸出しの歌』のことをだ。

1つは四谷文子の『わたし変なのよ』。変でしょ? うろ覚えに決まっているがこんな唄だ。

いつも出ていーる、お月さま、

丸くて白い、お月さま

(忘れたが、多分、ここにキモがあるはず。だから子供のおいらは実感がなく忘れたんだと思う)

わたし、このごろ、変なのよ、なんだかなんだか変なのよ

丸くて白くてでっかなお月さまに、怪しい心のトキメキを告白しまくる唄だ。と思うが、変だった。この部分のメロディーも思い出した。

ニイロツルチヨとかシンノウツルチヨとかも思い出したぞサムライニッポン。でもこれはメロディーは出てこないな。人を斬るのがサムライならば。

あきれたぼういずも思い出した。

地球の上に朝が来る。その裏側は夜だろう

このあと、でたらめざんまいの無礼講が始まるように記憶しているが、後はきれいさっぱり忘れてるな。

それから大島の火山に飛び込んで心中する二人の唄。

それから、カフェの女給の唄。てんで覚えてないが。でもどこかにカケラが記憶されているようだ。

放浪時代・アパアトの女たちと僕と (講談社文芸文庫)(竜胆寺 雄)

というようなのを思い出すと芋づるのように、龍膽寺雄のアパアトの女たちと僕とだの、小津安二郎の非常線の女だの、姉と弟のアパアト暮らしの映画(題は忘れた)だのが、次々と思い出される。ボオル紙の皇帝万歳。

アパアトの女たちと僕とのアパアトも、小津の映画のアパアトもすごーくモダンでお洒落でデラシネなんだが、小説と違って映画は残酷に視覚可能なものを残すから、それが畳敷きで漆喰壁の、そうか同潤会とかだね、という今となってはこれっぽっちもモダーンでもなければお洒落でもない貧乏くさい世界だったりすることがわかるんだが、それはそれ。実際にどう考えているかを表に出さず、見た目なんにも考えず、その日その時を足どり軽く世間をなめてふらふら生きるってのは、いかしている。それがモダーンな人間というものだ。っていうか、パーマネントバケーションを楽しむには、本当は終末がやって来るってことをびくびく意識しながらしかし知らぬ顔をしなきゃならないからね。綱渡りが綱渡り足りえるのは、落ちたら最期の綱の上としっかり認識しているからだ。地面の上に置いた綱の上を歩くのは簡単だ。そして本当に簡単なことなら、誰もそんなものなど知ったこっちゃない。

っていうか、同潤会アパート(アパアトじゃないね)も今は昔の物語か。

代官山食堂で飯食ってたのも既に20年前のことだからな。

考えなくても、戦前の日本の震災後からほんの10年弱というのはびっくりするくらい東京が東京たりえた時代だったのだ。

人間椅子を運送屋が運んできて、パノラマ島が建設されて、アパアトには風俗ねいちゃんが住んでいて、辻潤が尺八吹いて、浅草ではオペレッタ、ギロチン社のテロリストが上海と東京を行ったり来たり。洋館に住むハムレットが洋行からの帰路、客船の中で福助を見たり、緑の髪のロシア女が海からやってきたり、死人箱には15人セメント樽には手紙が一通水族館の槽の中には死なないタコ

でも、まあ、おれは今の時代でいいや。

_ モボ

おいらが子供の頃、考えてみれば、まだ戦前はベトナム戦争前でもなく第1〜4次中東戦争前でもましてや湾岸戦争前でもなかったわけだから、そんなに遠いわけじゃない。

「もう戦後じゃない」「ベトナム戦争中ですが何か?」

まだ、京成サブがガード下で呑んでいたりしたころなんだな。

っていうか、ウルトラマンの2回目のバルタン星人の時にカラーTVが家にやって来たのであった。

だから、おそ松くんを読んでエノケンやロッパって連中のことを知ったわけだし普通に生活していれば

おれは村中で1番モボだと言われた男

(ここは思い出せない)

ブカブカのセーラーのパンツ(ズボンだっけなぁ?)

(カフェの女給の唄を思い出しているうちに、こっちの唄のほうに行ってしまった。まるで旅行のようだ。確か、この田舎のモボは最後はカフェの女給にセクハラして追い出されるんじゃなかったっけな。っていうかむしろジョンボイトのカウボーイとかを無関係に想起してみたりテキサス無宿のクリントイーストウッドがはるばるニューヨークに出てきてタクシーに乗って「よお、運ちゃん、この街にブルーミングデールって店は何軒あるんだい?」、タクシーの運転手せせら笑って「1軒に決まってんだろ」、するとイーストウッドいきなりピストルを運転手の鼻先に突きつけて「ブルーミングデールの前を通るのはこれで8回目だぞ。テキサス育ちをなめんなよ」とか)

程度は耳にしても不思議じゃない。でも、私この頃変なのよってのはレコードでしか聞いたことはなかったな。

っていうか、京成サブをグーグルで検索しても5件しかヒットしないよ。失われちまったニッポンここにありだな。


2005-01-22

_ テキストとバイナリー

たとえばrubyのプログラムと拡張ライブラリ。

ASPでのCOMコンポーネント。

シェルとコマンド。

遡ればJCLとプログラム。

こういう組み合わせってWebアプリケーションではどうなっているのかな。部分的にはJSP(最終的にはコンパイルされてJVMにロードされるわけだが)とタグlibとかで無いわけではないが。でもそれは表示にまつわる部分だけで、ASPとCOMコンポーネントというのとは違うようだし。追記:web.xmlだのstruts-configだとかはちと違うと思う。まあ、選択と組み合わせを決定しているテキストではあるから完全に違うというとそれも間違いだとは思うが。

というようなことを疑問に持つ。

もちろん、テキストの部分なんて不要だという考えもあるだろうが、組み合わせるということが制約なのか知恵なのかで判断はわかれるだろうし。

#追記:もちろん、知恵だと僕は考える。

_ イメージ

個体と液体というか、粘性の液体(変かな)で満たした水槽の中にビー玉が入っているようなイメージだろうか。

ビー玉はお互いに点でしか接触できないとか、固いからお互いにうまく結合することはできない。それでドロドロしたというと表現がネガティブだから別の言い方、たとえばしなやかで弾力性に富んだものでそれぞれをくるみながらつなげていくとか。ただ、そっちは柔らかいから簡単に形が変わってしまう。ところが形が変わってはまずいものがある。そこでその部分は固くしておくとかかな。

追記:グルーというのとは随分イメージが異なる。グルーだと緩衝材という意味は見えにくい。繋げるという側面だけを取り上げればグルーかも知れないが、むしろ固いもの同士がぶつかりあってお互いが壊れるのを防ぐという意味を持たせたい。

結局は通信なんだけど、通信は通信としてノイズを混入できるようにしておきたい、つまりjumpとかcallといった機械語で繋げたくはないってことに尽きるのだな。

ノイズを混入っていうとネガティブ方面だから、フィルタリングしたりプロクシをかませたり中継したりが可能なように、つまりホンモノの通信として扱えるようにしたいといえば良さそうだ。

_ メッセージパッシング

で、コンセプトとしてのメッセージパッシングをいかに実際のメッセージパッシングに近づけるかという方法論としてデザインパターンとか(たとえばフィルターとか)があって(まあそういうことができるようになるためにはオーバーヘッドが許容可能になるくらいインフラの整備が必要だったわけだが)、フィルターをかけるためにはインターフェイスベースの継承が(強い型付け言語では)必要とかがあって、でもそれだけでは実体をどうするのよ、ってのがあるから発見のためのプロトコルとしてたとえばJNDIのような生なものがあったりしたけどそれでもプルしてくるわけで、そこにDIみたいなプッシュされてくるものへの転換があったり。

でなんでメッセージパッシングを外に出してそこに介入したいかというと、それがアスペクトであるとか。で合ってるのかな? ではサブジェクトってのはなんだろう、というのは用語(というのは基盤となる考え方が異なるからだろう)の問題だろうか。で、それは定義だから調べれば済むからおいておいて。

_ 2種類のユニットテスト

あるビー玉のテストについて、そのビー玉それ自身のテストと、そのビー玉が満たすべき入出力のテストの2種類があって、前者はいわゆるユニットテストで良いが(newすれば良いの世界)、後者は交換可能なテストが必要だというのは、通信のノード実装のテストと同じか。

でも交換するというのは、単純な移植でなければ何かが違うはずだから、そこをどうテストするかが後者のキモだな。ではどうするか。副作用型の呼び出しなら副作用の検証をテストに外挿しできる仕組みを用意すれば良さそうだ。っていうか、それがもともとのexpectedが記述できるモックオブジェクトなんだが、それ自身がコードされてコンパイルされてしまうという罠。

_ キンクスのCDレビュー

Ultimate Collection(Kinks)

まあ、評を読まずに買って聴いたわけだが、あらためて眺めていたら

映画『Percy』(性転換手術で男になった主人公がイチモツの元の持ち主を捜すという物語)のサウンドトラックからの「God's Children」も収められている。

なんてぶっとんだ映画というか発想なんだろう(キンクスとは関係ないと思ったけどこのぶっとんだ映画の関係者がサントラとして選んだということであながち無関係なわけでもあるまい)。

_ 多態性

多態性がなければ、オブジェクト指向言語を利用する意味のうち相当大きな部分がなくなるように思える反面(っていうか現実に僕は困るぞ)、別にオブジェクト指向言語云々とは関係ない概念なのか、とまつもとさんの指摘を眺めていて思った。

なんとなく、気分的になのだが、多態関数とオブジェクト指向での(3本柱みたく言われるところの)多態性とは区別して考えていたが、実際には自分でも書いていたりするくらいに、メソッドの引数の型によってそのコンテキストに合った実際の関数(とselfとかthisとかからは取り合えず切り離した言い方をしてみて)を呼ぶ仕組みというのはそれほど目新しいことでもない(と思うんだが実例は知らないが、でも想像はつく)。オブジェクト指向言語だと引数のうちselfやthisが暗黙のうちに利用されるからほとんど意識することはないというだけのことなんだろうか(でも、その意識するかしないかの差は相当大きいようにも思える)。

的を外しているような気がするが指を使って考えを外出しすることにはどうも自分にとって意味があるようなのでやってみるが、多態関数(と書いて、総称関数との違いがわからなくなったぞ。総称関数は多態関数を記述しやすくするための機構で考え方は同じものなのかな? それはそれとしてsumimさんのWikiは勉強になるなぁ)って、型無し言語だと自分で型をチェックして処理を分岐させるからいまいち楽しくないんだが、どっちが得なんだか。というか単に向き不向きの問題かも。(やっぱりうまく書けないや)

追記:なんかついこないだも多態性(追記:性を抜いて書くのはおかしいんだな)について似たようなことを書いていたような気がしてきたけどまあいいや。

#プログラミング言語の(それ自体の)実装技術と、(その言語の)利用技術、ソフトウェアの(構成に関わる)概念、現実への適用時の(その現実への写像としての)概念、そういったものを同じ用語で語るとわけがわからなくなるかも、というやつの一種かも。オブジェクト指向なんてのがまさにそうなわけだが。

_ 現実つまりビジネスへの適用

1989年頃のオブジェクトにおいては、

(1)それ自身のプライベートデータをもつ。

(2)そのデータの上で行われる操作の組みがある。

(3)継承を利用した再利用性

なのだが、このうちビジネスロジックとかビジネスコンポーネントとか呼ばれるものに当てはまるものはなんだろうか?

まず、ビジネスロジックはそれ自身のプライベートデータを持たない。ビジネスデータは外部にある。そこにミスマッチを見つけるとDAOとかになるのだが、それも結構妙なのは操作の組みはデータベースマネージャなどのリソース管理の機構の延長であって、その持たれたデータの操作とは異なるものだからだ。で、そこにビジネスメソッドと呼ばれるものを入れるとどうなるかというと、これも単にどこにメソッドを配置するかという実装戦略に過ぎないのは当然。なぜならば元々内部で利用するためのプライベート(アクセス制御の用語と紛らわしいな)データという考え方とは乖離しているからだ。データは伝票じゃないからだ。伝票オブジェクトというのはシンプルだな、それにしても。

継承が利用できるかと言うと、実際には個々のビジネスロジックに継承は無い。というのは1つのビジネスルールが時間の経過とともに変化することはあっても(時間軸に沿った継承。でもこれはそのものの変更を要求するわけだし)、横並びに継承可能ではない(もし継承可能ならそれはビジネスルールと言えるのか? というかそういうアスペクトはありえるだろうが)。

でも業務の手順はどうだろうか? 手順は大体決定されていて、伝票を受け取ってルールを適用(というか処理して)たらい回す。その処理そのものはオブジェクトと考えられる。

したがって、ある業務の全体についてはオブジェクトと見ることは可能だ。(って言うか、これはSOAのサービスのことになってしまうな。粒度が粗いからだ。でも実際にはこの単位でカプセル化されているのだからしょうがない。伝統的なオブジェクトの粒度を超えているから別な言葉としてサービスと呼ぶわけだろう。)そこで業務アプリケーションのフレームワークみたいなものは幾らでもある。だがその業務全体の中の個々のプロセス(ビジネスロジック)は伝統的なオブジェクトの概念を持たない。でもあまり正確じゃないな。たとえば特定の料率のようなものはその料率を利用するビジネスロジックのプライベートなデータと見なすことも可能だからだ。その反面、仮に個々のビジネスロジックの中に閉じているように見えても実際には外部要因で決定されて後から与えられるわけだから結局は外部データと考えるほうが正しそうだ。(で、この単位もやはりオブジェクトという言葉との乖離があるので、ビジネスコンポーネントという呼び方があるということになるのかな)

個々のビジネスロジックはこの全体としてのオブジェクトの中のプライベートなデータとして見なすと収まりが良い。収まりが良いというのは、実際のプログラミング言語によってプログラムする対象として考えやすいということだ。つまり実装に結びつくということである。

で、データなんだからそれなりの扱い方があるということになる。

本日のツッコミ(全5件) [ツッコミを入れる]

Before...

_ arton [>ケイの考え方とストラウストラップの考え方が渾然一体 これ、僕も同感です(もっとも前者はすごく大雑把に知ってるつもり..]

_ ogino. [ここの文脈からは外れてしまうのですが私の修士のときの指導教官は、数学的に定義されていないという意味でオブジェクト指向..]

_ sumim [そうですね。数学的に定義されていない…という結構重要な切り口をすっかり忘れていました(^_^;)。上の2つに追加させ..]


2005-01-23

_ primitive型のClassインスタンス

どうもすぐに忘れてしまうな。

プリミティブのClassインスタンスは、プリミティブクラスのTYPEスタティックフィールドだ。

intなら、Integer.TYPE。

Foo#bar(int, boolean);のメソッドを引っ張るには、Foo.class.getMethod("bar", new Class[] { Integer.TYPE, Boolean.TYPE });と書けば良い。

import java.lang.reflect.*;
public class Foo {
    public void bar(int n, boolean b) {
        System.out.println("n=" + n + ", b=" + b);
    }
    public static void main(String[] args) throws Exception {
        Method m = Foo.class.getMethod("bar", new Class[] { Integer.TYPE, Boolean.TYPE });
        Foo f = new Foo();
        m.invoke(f, new Object[] { new Integer(801), Boolean.FALSE });
    }
}
=>
$ java Foo
n=801, b=false

ちなみにC#だと何でもtypeofで取れるから覚えることはない。

using System;
using System.Reflection;
public class Foo {
    public void bar(int n, bool b) {
        System.Console.WriteLine("n=" + n + ", b=" + b);
    }
    public static void Main() {
        MethodInfo m = typeof(Foo).GetMethod("bar", new Type[] { typeof(int), typeof(bool) });
        Foo f = new Foo();
        m.Invoke(f, new Object[] { 801, false });
    }
}

なんて書いてからふと気付いてやってみると

import java.lang.reflect.*;
 
public class Foo {
    public void bar(int n, boolean b) {
        System.out.println("n=" + n + ", b=" + b);
    }
    public static void main(String[] args) throws Exception {
        Method m = Foo.class.getMethod("bar", new Class[] { int.class, boolean.class });
        Foo f = new Foo();
        m.invoke(f, new Object[] { new Integer(801), Boolean.FALSE });
    }
}

なんのことはなく、int.classとか書けるんじゃん。知らなかったよ。

良く見たらClass Literalsに記述があるな。


2005-01-24

_ 混乱

JDO2.0が出るとなんで混乱するんだろう?

王様が2人になると混乱するっていう意味なのかな。JDOというのはUDA+ADOのJava版だと思っていたのだが死に体の今こそマジメに調べてみるべきか。

本日のツッコミ(全2件) [ツッコミを入れる]

_ hir [エントリと無関係で恐縮です。 RSSで読んでるのですが、itemがspamコメントで埋め尽くされてます! どうぞご注..]

_ arton [ぎゃ、どうもありがとうございます。しかし、厄介ですねぇ。 面倒だけで手を打つしかないかなぁ。]


2005-01-25

_ というわけで

青木さんのtDiary / コメント SPAM 避けチェックボックスパッチを入れてみる。

ところでfumihiroさんの指摘が直ってないよ。と思ったら、20050123という日付だな。

_ なんとなく埋もれたコンテンツをリンクしてみたり

以前超訳したフリーマンのモックオブジェクトを利用したテストファーストについて

ただ、僕自身はJDBCそのものをモックするよりは、それがどんな実装であれDAOに類するコンポーネントに実際のDBマネージャとのインターフェイスを任せるようにビジネスロジックを実装し、そのDAOのモックを使うほうがいいんじゃないかと最近は考えています。っていうか、たとえばモックのResultSetを使うとgetStringなんかの呼び出しを延々と記述することになるため、あまりにも辛い。

それとは別にモックDBみたいなものを用意する(JDBC部分のユニットテストは捨てて、単にテストデータを供給するだけの仕組み)のも良さそうです。

つまり、テストプログラム→テスト対象→モック(DAO)とするか、テストプログラム→テスト対象→データ供給モック とするということです。

で、ENDOはテスト対象の内部の複数のクラスのインタラクションなんかに適用してみる(DAOモックは当然、ENDOできるのでそれはそれであり)。

Win32系だと、テスト対象→ADO→OLEDB→Excelというように、ADOに与える接続文字列の変更でDB(この場合、データ供給だけに着目)の切り替えができるんだけど。(というのは、JDOを調べるかに絡んでくるんだが)

_ わかっていてもやってしまうことがある

とは言え、すぐわかったけど。でもわからなければわからんね、やっぱり。

public class Starter {
    /** 空のインスタンス */
    public Starter() {
    }
    /** すぐ使えるインスタンス */
    public Starter(String s) {
        initNew(s);
    }
    /** 初期化、再初期化時に呼ぶ */
    public void initNew(String s) {
    }
}

の場合の罠だ。

実装継承でFollowerを作成。

public class Follower extends Starter {
    List list = new ArrayList();
    public Follower(String s) {
        super(s);
    }
    public void initNew(String s) {
        list.add(s);  // ドーン
    }
}

案1

public class Follower extends Starter {
    List list = new ArrayList();
    public Follower(String s) {
        super();
        initNew(s);
    }
    ....
}

良くないがこれでもできる。

public class Follower extends Starter {
    List list;
    public Follower(String s) {
        super(s);
    }
    public void initNew(String s) {
        if (list == null) {   // でもこれは見苦しいな。
             list = new ArrayList();
        }
        ...
    }
}

ちなみに泥沼化の例。

public class Follower extends Starter {
    List list = new ArrayList();
    public Follower(String s) {
        super(s);
    }
    public void initNew(String s) {
        if (list == null) {
             list = new ArrayList();
        }
        list.add(s);
        ...
    }
    public void foo() {
       if (list.size() == 0) {
           System.out.println("WHHHHHHHHHHHHHHHHHHY!!!");
           System.exit(1); // maybe, java has a bug pun pun...
       }
       ...
    }
}

もちろんJavaは正しい


2005-01-26

_ 実際に僕が現在取ろうとしているモック戦略

なんか、いろいろ書いているうちに方法論を思いついたので、来週試してみることにする。

どうも本来の目的からずれ始めていることに気付いたからだ。

と、わけわかめなメモだな。


2005-01-27

_ インターフェイスの変更

それまで、public void tsukkomi(String name, String mailAddress, String article);だったものをpublic void tsukkomi(boolean sense, String name, String mailAddress, String article);に変えれば、既存のインターフェイス用にコンパイルされた人間はエラーとなることを身をもって知ってしまったり。


2005-01-28

_ 無茶苦茶おもしれえ

どーしてこういうの(あおきさんの本もそうだな)は面白いんだろう?

1.順を追ってく過程がおもしろい。

2.その時、突然の心の動きがおもしろい(鍋を例にしたのは失敗だと気付いた部分とか)。

3.内容そのものが十分に一般的で(っていうか自分がある程度の知識を持っているからということだな)興味深いからおもしろい。

4.書いている人がおもしろいからっていうか、書いている対象への愛情がにじみ出てるからかな?

5.というか文体が文語でも口語でもない、考語(口語と音は同じとこがミソ)とでもいうべきものだから読みやすいからとか。

Googleで"test test set"で検索したらTest&Set(c) if c == 0っていうのが出てきたけど、これかなぁ。test&setのオーバーヘッドを回避するために最初のtestで抜けられるようにしたアトミックな操作なんだろうか?

_ フラー

ああ、いつのまにかこんなものが。

サミュエル・フラー DVD-BOX

ストリートオブノーリタンもある。声を潰されて殺された?はずの歌手がギャングの親分に復讐するために舞い戻って来て、声のかわりに別のところを潰す話だ。青と門と馬。

ショック集団だよ。廊下の奥行きを出すために矮人を雇って後ろのほうを歩かせたとかいう伝説がある。朝鮮戦争で捕虜になり共産党に洗脳されたプアホワイト(だけど本当に洗脳されたのか? とか)、リンチにあって精神を病んだ(でも本当に病んでいるのは? とか)某州立大学の史上最初の黒人の入学者、水爆を開発した科学者とか。

で、裸のキッスだが、なんかあんまり印象にないな。

個人的にはリトルトーキョーで勇者の歌「赤とんぼ」マーチを鳴らしながら凶悪事件に挑む日系刑事の大活躍を描くクリムゾンキモノのDVD化もきぼーん。

ちなみに、ショック集団で言及されたでっかな赤の1の軍曹を描いたビッグレッドワンは持っていたり。

本日のツッコミ(全1件) [ツッコミを入れる]

_ ささだ [恐縮です.しかし,そんなに面白がってくれる人がいるとは思いませんでした.]


2005-01-29

_ ちょっと嫌になった

CD-Rにラベルを貼ろうと考えて専用用紙を買ってきた。変な形なので特殊なソフトを使わないと延々とプリンター相手に格闘しなきゃならなそうな予感。でも専用のラベル印字ソフトを無料で配布とか書いてあるからこれで良いかなと。

ちなみに元のラベルイメージはPDFだ。それでPDFからどうやりゃ専用ソフト(無料で用紙屋さんが配布しているやつ)に取り込めるかちょっと考えたが、良く見たらAcrobat Readerってイメージのコピーアンドペーストができるのか(って言うかバージョン7からかなのかな)。

ところがこの専用ソフトが曲者でクリップボードからのイメージのペーストができない。で、いろいろいじっているうちにファイルの読み込みはサポートしてることがわかった(メニューのメニューのメニューくらいの位置)。

で、Acrobat Readerからコピーしたイメージを画像編集ソフトにペーストしてpngで保存して、ラベル印字ソフトに読み込んで、とか面倒な手順を踏みながら印刷。ちなみに印字ソフトそのものは用紙ぴったりにやってくれるのでこりゃ確かに手間要らずでグッドですな。

で、まあそれは良い。

で、1枚目に貼る。おお、うまいじゃん。

で、2枚目に貼る。ガーソ、5ミリくらいはみ出したぞ。しょうがないのでカッターではみ出した部分を削る。

で、3枚目に貼る。ドーン。しわんしわんになっちまった(でもはみ出さなかったっていうか、はみ出さないように端からやらずに真ん中からやったのが敗因だな。

というわけで、経験を積むほど悪い結果になるというのはどうしたもんだか。無心が1番ってこともないわけじゃないなとか(多分10枚くらいまでは。そのあたりから熟練してくるのかも知れないが)。

追記:4枚目ばっちり。5枚目3ミリくらいはみ出す。これで終わりだが予測として6枚目はしわしわになるのか?


2005-01-30

_ ニヤニヤ

RFC2828日本語訳)。

素直にこれの存在に気付いていなかった。

分野が分野だけに文書が示す意味を厳密に一意あるいは識別可能にしなきゃならんわけだしな。

で、(D)だけとりあえず拾い読みすると

electronic signature

(D) ISDs SHOULD NOT use this term because there is no current

consensus on its definition. (Instead, see: digital signature.)

なんてのが出ていて、そうか電子署名じゃなくてデジタル署名と(日本語なら)書くべきなのかぁ、とか今頃になって知ったり。

ハッシュ値とかハッシュコードとかがダメな理由はわかりやすいな。

malware(これはわかる)とかpagejacking(という言い方があるのは知らなかった)が(D)な理由は辞書を見ても出ていないし外人にはわからんだろうだから、インターネット標準文書を書くときにはそういう点にも注意すべきなのか。っていうかそりゃそうだな。辞書に出てない言葉が出てると困るし。

spamについてはここにも定義されてるのか。ってことはSPAMとか書いてあったら「RFC嫁ニヤニヤ」とか言い切れるわけだ(しかも必要な情報がすべて出ているという稀有な例になるし)。っていうか(C)は蛇足じゃないだろか(Sまで書いていて疲れたのか、書いてるやつがこの文書を書くだけあってハッカーだってことか)。

おお、verifyとvalidateの使い分け情報は目からウロコ。ここの日本語はまずっているが(機械翻訳っぽい)。原子性の検証がverifyで、関連情報を含む検証がvalidateなのか。

Webアプリケーションだと、文字の構成チェックとか長さチェックとかした後、その入力(たとえば社員コードとしよう)が存在するかをまず検証したりする(たとえば社員テーブルと突き合わせる)。これはverify。で、その社員コードについて(たとえば休暇申請として)すでに取得済み休暇時数(たとえば休暇取得テーブルとかがあるとして)と申請した時数や、休日テーブル(たとえば休暇取得予定日が祝日ならそもそもおかしいとか)の整合性の検証がvalidateということかな。

ちなみにスラドのlynxのやつ読んでたら出てた。情報量と皮肉の両方の按配が良いナイスなフォローだな。

しかし、lynx便利なんだけどな。FirefoxとかIEがEmacs(VS.NETとかでもいいや)なら、lynxはvi(とかwviとか)という感じ。

企業とかだとイントラネットでのIE縛りとか十分にありそうだな。それに対応させると、開発規定とかでEclipなんちゃら使えとかで縛るようなもんかな。lynxは就業規則違反で、Meadowは開発規約違反とか。


2005-01-31

_ フィッシュアンドチップス

西麻布というか霞町というかにフィッシュアンドチップスを食わせる店があったんだが、いつの間にかなくなってしまった。いつの間にかと言ったって結構な年月なんだけど。

でも、品川の外れに多分その支店だか本店が残っていることは残っている。全然関係ないかも知れないけど。

なんでそんなとこを知ってるかと言えば、その近くの公園に船とペンギンの噴水があったりしてオモシロそうだったからまだ幼児だった頃に、良く子供を連れて遊びに行ってたからだ。っていうか、でっかな船がある公園って港区には他にも芝(ここは汽車もあったり)とか、麻布十番の近くとかあって、結構おもしろいんだが。やっぱり港区だからかな? だったら渋谷区は公園に谷を作ればおもしろそうなもんだが。で綱を使ってビッグトレイルとかできたりするといいな。

それはどうでも良くて、この店が結構好きだ。ロコモコみたいなハワイ風料理(一時はSPAM握りもあった——ただ妙に上品にこじんまりとしていたけど——んだが今は無いみたいだな)や、なかなかおいしいスパゲッティとかピッツァとか。その印象が強くてイタ飯屋の一種として個人的には扱っているんだが、そもそもフィッシュアンドチップスはイギリスだな。酸っぱいソースとベタベタの白いソース(マヨネーズなんだろうか)の2種類とてんこ盛りのフライドポテトとでっかな白身魚を揚げたやつがついてくる。

で、この店のマークが魚で、店内には太陽のレリーフやら鳥や魚のデコイ(でいいのかな? 木でできた人形というか模型)が置いてあって、家ではいつしか太陽と魚の店という符丁で呼ばれて親しまれているのであった。

というわけで臨海副都心のほうへ行った帰りに何か食うことになると、どうもお台場とかのあたりは敬遠して、つい太陽と月の店に行くことになっている。

あと、鈴が森の近くの天婦羅屋とか。

_ メモ貼り

子どもの思考力を高める「スクイーク」 理数力をみるみるあげる魔法の授業(BJ・アレン=コン/キム・ローズ/大島 芳樹/高田 秀志/喜多 千草/片岡 裕子/アラン・ケイ)

Squeaker(中略)日記から。

科学を学ぶことの意義、そのときに重要なこととそうでないことについて語ったアラン・ケイによるあとがきだけでも読む価値があると思います。

(中略)

彼女の入魂の監訳者のことば(今までこんなに魂の入った「監訳者のことば」を見たことがあるだろうか)も彼女の手による「インターネットの思想史」および、全世界が期待するその続編の要旨としても読めるようなずっしりとしたものです。

本文よりも、脇を固める部分だけで読みたくさせるのはいかがと思わないでもないが、実際読みたくなるんだからしょうがないな。

追記:結局のところカートに入れてチェックアウト。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|

ジェズイットを見習え