ぐる式 (貳) より引っ越し作業中.未完.

2009年12月31日木曜日

和田憲明『7Days Judgement -死神の精度-』2009

「なるほど.人間ってのは,この,眩しいときと笑うときに似た顔になるんだな」 © 千葉.

ラサール石井が出てる芝居で初めて面白いと思った (笑).いきなり "Tubular Bells" の冒頭で始まるが,何事かと思う間もなく停止 (笑).あとは全編古き良き時代のストーンズのルーズなロック. "Brown Sugar" を筆頭に,おそらく全部デッカ時代だと思われ.他に,「ゆったりとした透明感のある女声」も出て来るが,これはちょっとだけ本筋に絡む.

CD ショップの試聴コーナーのヘッドフォンって,パサパサしててめっさ音悪いっしょ? あんなんでは聞くことはできても聴くことはできねぇんじゃねぇの?

お話は NHK によればこんな感じ.

中年男の姿で人間界にやって来た死神・千葉。「死神」は、調査員として人間界に派遣され、その人物に定められた死を実行すべきか否か、 7 日間観察して判断し、報告するという仕事を司っている。そんな千葉が今回担当するのは、藤田という名前のヤクザ。ある日。千葉は、ひょんな事で藤田が暮らす家に辿り着き、そこで藤田と出会う。藤田は、千葉が思い描いていたヤクザのイメージとは違い、筋の通らない事を嫌う馬鹿正直なくらい任侠の男であった。

その藤田は、自分の兄貴分だった男を殺した「クリキ」という男を捜しているという。「クリキ」の居場所を知りつつも知らないフリをしていた阿久津。それには、阿久津が幼かった頃の出来事に関係した深い理由があったのだった・・・。

7 日後の藤田の命のジャッジを握る千葉は、果たしてどんな結論をくだすのだろうか?

まぁ,一種のクリスマス・キャロルというか『素晴らしき哉、人生! (It's a Wonderful Life)』的なもんすかねぇ〜?

  • 千葉 (死神調査員):香川照之
  • 阿久津 (藤田の舎弟):中川晃教
  • 同僚 (死神調査員):鈴木省吾
  • 藤田 (調査対象のヤクザ):ラサール石井
  • 脚本・演出:和田憲明
  • 原作:伊坂幸太郎
  • 美術:長田佳代子
  • 照明:佐藤公穂
  • 音響:遠藤宏志
  • 衣装:牧野純子
  • 舞台監督:安田武司
  • 公演制作:馬場順子
  • プロデューサ:石井久美子
  • 石井光三オフィスプロデュース
  • 2009 年 8 月,シアタートラム

千葉 (と藤田と阿久津) の七日間を描いているが,全部雨の日.最終日に至ってようやく晴れる.これって,ノアの方舟譚をベースにしてると思うんだが,どうスかね.鳩がオリーヴの葉をくわえて戻って来たのは七日後だよね.たぶん,そういう印象を持ったからだろうけど,北村想の『Fairy Tale』の別解的な後日譚という気もする.

およそ 130 分あるけど,いかにも長い.これで終わりかと思っても,まだまだ続くよどこまでも. edit バージョンとして,半分は無理としても 3/4 あるいは 2/3 ぐらいに圧縮しても罰は当たらんと思うがどうスか.

2009年12月30日水曜日

小田一生『笑う大天使(ミカエル)』2006

「お姉さま方,どうぞこちらへ.おチキンおラーメンですわ」 © 司城史緒.発語としては「おチキン,おラーメン」と休符が入る.

原作未読.またもや上野樹里主演作.これもヒドい映画だ.面白かったけど (笑).特撮がエラくチープで,今の時代にこんなんでエエんかいと心配になる.イントロの列車んとこで判るけど,ワザと安っぽくしてるっぽい.まぁ,三次元で御機嫌ような聖ミカエル学園よりも暗黒で月蝕な聖ミカエラ学園だな.誘拐事件以後は,かなり苦しい展開.しかしだな.映画としては『スウィングガールズ』の方が出来がエエのか知れんけど,こちらにはソース焼きそば的な下世話な (あるいは下手物的な) 味わいがあって,そこがたまらんデス (笑).あ〜,チキン・ラーメン的魅力と言うべきなのか知れん.

そういや,刻まれた学校名が ST. MICHAEL になってるのに,その上の紋章では MICHAERL になってるのはどういう訳なんだろ? 初手から全部嘘言って宣言してるンすか.

  • 司城史緒 (チキラー,ラオウさまより強いケンシロウさま):上野樹里
  • 斎木和音 (チキラー,オスカルさま,副委員):関めぐみ
  • 更科柚子 (チキラー,コロボックルちゃん,ガネっ娘学級委員):平愛梨
  • 司城一臣:伊勢谷友
  • 若月俊介:松尾敏伸
  • 万里小路静:佐津川愛美
  • 桜井敦子:菊地凛子
  • ロレンス先生: Brian Davis
  • シスター・マレーナ: Delcea Mihaela Gabriela
  • 更科孝志:加藤啓
  • 沈丁花:谷村美月
  • 白薔薇の君:キタキマユ
  • 紫の上:宮下ともみ
  • 桔梗の宮:松岡璃奈子
  • 桜子:宮内佳奈子
  • 百合枝:岩井七世
  • 薫子;渕内希実子
  • 蛍:早瀬英里奈
  • 杏里:工藤晴香
  • 更紗:岡本奈月
  • 綾乃:葵
  • ナレーション:広川太一郎
  • 監督・VFX:小田一生
  • 原作:川原泉
  • 脚本:吉村元希,小田一生
  • 音楽: Metalchicks: Under the Dradfull Moon, The Eye of the Evil's, St. Wonder (Theme of St. Michael), Power to Girls, Banquet over Memory of my Mother, Girl School, We are the Warriers, Tears for Feas / Consiracy, Unbreakable Bond that ties Two, I'm Knotted in Love
  • 特別協力:ハウステンボス
  • 撮影協力:...,諏訪神社,佐世保市,大村市,長崎市

今をときめく菊地凛子が出ててちょいとびっくりだが,もしかして聖ミカエル学園を訪れた桜井敦子は,ほとんどシースルーの薄物の下はノーブラですか? 佐津川愛美が出てるのはあとで気付いた.どうも不幸キャラの方が輝くらしい (笑).その代わり,平愛梨がエエ感じ.

2009年12月27日日曜日

戦う司書 The Book of Bantorra #13 休暇と絵本と赤錆の髪

「ちょっ,こっ,これはいったい?」 © ミレポック=ファインデル.着る前に言え.ってか,勤務中にそんな妖しい状況に乗るようでは,ミレポ,真面目に仕事してない.

変態的に戦闘能力を獲得している武装司書連中の中で,能力的にイマイチ存在感の薄いミレポ当番回.なんせ持ってるのが思考共有という一種の通信機能なんで,第一線というよりインフラ担当.なので,彼女が前線に出てくるようになるようでは,事態はもう末期的.なはずなんだが,そうではないことを示すための白ドレスか (笑).

赤錆の髪の女,シガル=クルケッサ原理主義者.なんか目付きが和田慎二作品に出てくる登場人物のようだ (笑).ヴァイオリニストで名はアルメ=ノートン.彼女が弾くヴァイオリンには顕著な特徴があって,ブリッジがカマボコにそっくり.弓の持ち方もヘンで,持つというよりつまんでる感じ.そんな持ち方では音量は出ない.あ,それ以前にブリッジがあるのに弦に傾斜角ができてない (一直線だ).あ〜,はっきり言うと,この回,絵はだめだめッす.そういや,シアトルで聴いたストリート・ヴァイオリニストはバッハをカッチョ佳く弾いてたな〜.このとき,アルメに近寄るシガルの歩き方もヘンで,まるで両足が別々に制御されてるような具合.このときすでにシガルは死んでいるのか (笑).

二クールめ開始は年明けからだが,いきなり総集編かよ.いや,知らんけど.でもさおりんが出てくるならエエか (笑).

2009年12月23日水曜日

2009/12/21 の収穫: Fireball Winter Package,観光ユニット「ギズモ」装着 ドロッセル到着

発送しました通知の翌日に受け取ることができた.

2009/12/21 の収穫:観物篇 & その他

ゲデヒトニスはパッケージ底部に登場.腰巻にモットー「未来は,巨大で,無機質で,なまあたたかい」.その一方でなじみ深いのは「未来は残酷で美しい——」.

パッケージに記載されている特典フィギュア (figma SP008) 内容.

  1. フィギュア本体 (胸部ユニット「ギズモ」/頭部ユニット「カスパール」付き) …… 1 体
  2. 「ギズモ」キャタピラパーツ …… 1 組
  3. バックパック「ゼーオッター」 …… 1 個
  4. バックパック「ゼーオッター」フェイスガード …… 1 個
  5. 光学ストック「イヴェルクス」ロング …… 2 本
  6. 光学ストック「イヴェルクス」ショート …… 2 本
  7. おしゃれシール …… 1 枚
  8. 交換用右手首 …… 3 個
  9. 交換用左手首 …… 4 個
  10. 台座本体 …… 1 個
  11. 台座アーム …… 1 個
  12. 収納袋 …… 1 個

いちいち全部名前が付いてるのか (笑).光学ストックの先っちょが,何気にディズニーのロゴをかたどってるんすね.手首の数が左右で違うって…….「胸部」じゃなくて背部ユニットだよね (笑).ところで帽子には名前が付いてないのか.

DVD の中身は夏版と同じもの. ウィンター・パッケージのパッケージ で,観光ユニット「ギズモ」は こんな感じ

あれ, foo-bar-baz さんとこでは,まだ到着報告代わりのパッケージの写真だけッすね,[買い物] GSC ブラック★ロックシューター,ファイアボール ウィンターパッケージ ほか - foo-bar-baz

ディズニーのロゴってミッキー・マウスだけど,登場した辺りはかなりキツい性格だったのに,大衆化するにつれて,その性格がどんどん丸くなる必要があって,その影響が形状に表れている,みたいな分析をネオテニーに絡めて書いててたのはグールドだったっけ?

2009年12月20日日曜日

戦う司書 The Book of Bantorra #12 過去と理不尽とパイプの煙

「ねぇ,いつからだっけ,パイプ?」 © ハミュッツ=メセタ. B パート・ラストの台詞.この時点では過去話は終わってて, A パート頭の,ミレポによるレナス尋問のあとに戻ってるはずなんだが,そうすると,このハミュッツは何者? すでに過去話の事後シーンで知ってるはずだろ?

あれれれ,まだレナスさんで引っ張るデスか.と思ったら頭 40 秒ちょいだけだった.ラスコール=オセロがラスコーリニコフに聞こえるのは空耳空耳.ラスコーの壁画には関係あるかも知れん.で,お話はマットの過去話から始まってハミュッツの過去話へ.お針子のミミが大抜擢で出世に次ぐ出世,しまいにゃブリュンヒルデにという,スーブレットあるいはリリコからドラマティコに変身するというもの.それを出世というか転身というか堕落というかは,その人次第でありましょう (笑).大の男を二発でなぎ倒すイレイアさんのビンタ強烈 (笑).鼓膜を破られるんだそうです.高校にそういう伝説を持つ教師がいたな〜.二年のときの担任だったけど.

短髪 (?) 眼鏡の目付きが逝ってる女=掃除屋ソーヤーは,なんと往時のハミュッツだった.詐欺だ (笑).マットとの対決からソフト・ポルノへ.ただ米 70 年代の stoned なヤツじゃなくて,おそらく偽作のクレランド二作目風.司書 (見習い込み) としては,ハミュッツよりもヴォルケンの方が先輩なのか.もう前の話は消しちゃったんで確認できないけど,先代代行のフォトナ=バードギャモンって初登場だったっけ? 何か二回目のようなおぼろげな記憶があるんだが.

次回予告,ミレポ大盤振る舞いでドレス姿も披露.ただ,ミレポの髪はトウモロコシ色で赤錆ではないので,予告最後でミレポが銃を向けている相手の髪の色.なんですかね.

もしかしてサブ・タイトルのタプルのラストって,その話のキー・パーソンの外部名,じゃなくて,その人を表す属性語句なのか.その前の理不尽→李夫人.何小鳥夫人はやり過ぎ.

2009年12月19日土曜日

Squeak: 文字列の連結とストリームとカンマ・メッセージと VWNC 驚嘆爆速

地味〜で初歩的な話です (笑).あ,あと,クソ長いッす.

ストリームとカンマ・メッセージによる比較

デバッグ出力や自前のロギングとかで大量の文字列コピーを行うときは,ストリームを使う方が佳さ気というお馴染みのお話.文字列の連結には , メッセージよりストリームを使えという格言があったと思うんだが,ほんとだったっけ.というわけで,単純な例で速度を比較してみた. vm は 4.2.2beta1U, vi は 3.10.2 web++,マシンは 2.66GHz Core 2 Duo 4GB 1067MHz の MBP 二代目バーバラたん.あと, VWNC 7.6[VWNC 7.7 はまだですか?] でもやってみたので,ソースはできるだけ似るように書いてみたが,あまりの速さに唖然 (笑).結果は以下のとおり.そうそう, VWNC には MessageTally がないので,代わりに JunMessageSpy を使ってる.

String concatinating comparing stream with comma.
environment comma pattern stream pattern
4.2.2beta1U / sq3.10.2-7179web09.07.1.J.3 246 msec 87 msec
VWNC 7.6 105 msec 爆速!→ 29 msec

Squeak 版, 3 倍の開きがあるとは言え, 10000 回だけ回して差がおよそ 160 msec なら,あんま変わらんじゃん.それよりも VWNC は速すぎるだろ! (笑) ちょい古いオーディオ機器に例えると, VWNC はノッティンガム・アナログ・スタジオの Hyper Spacedeck 辺りのガチガチでハイ・スピードなアナログ・プレイヤーで, Squeak はレガやメリディアン, Linn 辺りのコンパクト・サイズのカジュアルな CD プレイヤーって感じスかね. B&O のコンソレットかな. Squeak 版ソース[Squeak 版ソース:

    | iterationNumber commaBlock string streamBlock |    "Stringのクラス・メソッドを使ってないのは VWNC と合わせるため"    iterationNumber := 10000.    commaBlock :=     [ iterationNumber timesRepeat:             [string := ''.            string := string , '1 string to be copied. '                , (String with: Character cr) , '2 string to be copied. '                , (String with: Character cr) , '3 string to be copied. '                , (String with: Character cr) , '4 string to be copied. '                , (String with: Character cr) , '5 string to be copied. '                , (String with: Character cr) , '6 string to be copied. '                , (String with: Character cr) , '7 string to be copied. '                , (String with: Character cr) , '8 string to be copied. '                , (String with: Character cr) , '9 string to be copied. '                , (String with: Character cr) , '10 string to be copied. '                , (String with: Character cr) , (String with: Character cr)]].    Smalltalk garbageCollectMost.    Transcript        cr;        show: (Time millisecondsToRun: [ commaBlock value ]) printString.    MessageTally spyOn: [ commaBlock value ].    streamBlock :=     [ iterationNumber timesRepeat:         [ | s |        s := WriteStream on: (String new: 1000).        s nextPutAll: '1 string to be copied. '.        s nextPut: Character cr.        s nextPutAll: '2 string to be copied. '.        s nextPut: Character cr.        s nextPutAll: '3 string to be copied. '.        s nextPut: Character cr.        s nextPutAll: '4 string to be copied. '.        s nextPut: Character cr.        s nextPutAll: '5 string to be copied. '.        s nextPut: Character cr.        s nextPutAll: '6 string to be copied. '.        s nextPut: Character cr.        s nextPutAll: '7 string to be copied. '.        s nextPut: Character cr.        s nextPutAll: '8 string to be copied. '.        s nextPut: Character cr.        s nextPutAll: '9 string to be copied. '.        s nextPut: Character cr.        s nextPutAll: '10 string to be copied. '.        s nextPut: Character cr.        s nextPut: Character cr.        string := s contents ] ].    Smalltalk garbageCollectMost.    Transcript        cr;        show: (Time millisecondsToRun: [ streamBlock value ]) printString.    MessageTally spyOn: [ streamBlock value ]
], VWNC 版ソース[VWNC 版ソース:
    | iterationNumber commaBlock string streamBlock |    iterationNumber := 10000.    commaBlock := [iterationNumber        timesRepeat:            [string := ''.            string := string , '1 string to be copied. '                , (String with: Character cr) , '2 string to be copied. '                , (String with: Character cr) , '3 string to be copied. '                , (String with: Character cr) , '4 string to be copied. '                , (String with: Character cr) , '5 string to be copied. '                , (String with: Character cr) , '6 string to be copied. '                , (String with: Character cr) , '7 string to be copied. '                , (String with: Character cr) , '8 string to be copied. '                , (String with: Character cr) , '9 string to be copied. '                , (String with: Character cr) , '10 string to be copied. '                , (String with: Character cr) , (String with: Character cr)]].    ObjectMemory garbageCollect.    Transcript        cr;        show: (Time millisecondsToRun: [commaBlock value]) printString.    JunMessageSpy        spy: [commaBlock value]        often: 5        omit: 0.001.    streamBlock := [iterationNumber        timesRepeat:            [| s |            s := WriteStream on: (String new: 1000).            s nextPutAll: '1 string to be copied. '.            s nextPut: Character cr.            s nextPutAll: '2 string to be copied. '.            s nextPut: Character cr.            s nextPutAll: '3 string to be copied. '.            s nextPut: Character cr.            s nextPutAll: '4 string to be copied. '.            s nextPut: Character cr.            s nextPutAll: '5 string to be copied. '.            s nextPut: Character cr.            s nextPutAll: '6 string to be copied. '.            s nextPut: Character cr.            s nextPutAll: '7 string to be copied. '.            s nextPut: Character cr.            s nextPutAll: '8 string to be copied. '.            s nextPut: Character cr.            s nextPutAll: '9 string to be copied. '.            s nextPut: Character cr.            s nextPutAll: '10 string to be copied. '.            s nextPut: Character cr.            s nextPut: Character cr.            string := s contents]].    ObjectMemory garbageCollect.    Transcript        cr;        show: (Time millisecondsToRun: [streamBlock value]) printString.    JunMessageSpy        spy: [streamBlock value]        often: 5        omit: 0.001
]
, Squeak 版カンマ・パターンのスパイ結果[Squeak 版カンマ・パターンのスパイ結果:
 - 256 tallies, 256 msec.**Tree**61.7% {158ms} ByteString(SequenceableCollection)>>,  |44.5% {114ms} ByteString(SequenceableCollection)>>copyReplaceFrom:to:with:  |  |16.8% {43ms} primitives  |  |15.6% {40ms} ByteString class(String class)>>new:  |  |12.1% {31ms} ByteString(Object)>>species  |17.2% {44ms} primitives23.0% {59ms} Character class>>cr  |14.1% {36ms} primitives  |9.0% {23ms} Character class>>value:14.8% {38ms} String class>>with:  9.0% {23ms} primitives  5.9% {15ms} ByteString class(String class)>>new:**Leaves**21.5% {55ms} ByteString class(String class)>>new:17.2% {44ms} ByteString(SequenceableCollection)>>,16.8% {43ms} ByteString(SequenceableCollection)>>copyReplaceFrom:to:with:14.1% {36ms} Character class>>cr12.1% {31ms} ByteString(Object)>>species 9.0% {23ms} Character class>>value: 9.0% {23ms} String class>>with:**Memory**    old         +0 bytes    young       +182,312 bytes    used        +182,312 bytes    free        -182,312 bytes**GCs**    full         0 totalling 0ms (0.0% uptime)    incr        81 totalling 14ms (5.0% uptime), avg 0.0ms    tenures      0    root table   0 overflows
]
, Squeak 版ストリーム・パターンのスパイ結果[Squeak 版ストリーム・パターンのスパイ結果:
 - 90 tallies, 90 msec.**Tree**31.1% {28ms} WriteStream>>nextPut:  |18.9% {17ms} Character>>isOctetCharacter  |12.2% {11ms} primitives27.8% {25ms} Character class>>cr  |14.4% {13ms} primitives  |13.3% {12ms} Character class>>value:14.4% {13ms} WriteStream>>contents  |7.8% {7ms} ByteString(SequenceableCollection)>>copyFrom:to:  |  |4.4% {4ms} ByteString class(String class)>>new:  |4.4% {4ms} primitives12.2% {11ms} WriteStream>>nextPutAll:6.7% {6ms} WriteStream class(PositionableStream class)>>on:  |5.6% {5ms} WriteStream>>on:  |  5.6% {5ms} WriteStream(PositionableStream)>>on:  |    4.4% {4ms} primitives5.6% {5ms} String class>>new:  3.3% {3ms} primitives**Leaves**18.9% {17ms} Character>>isOctetCharacter14.4% {13ms} Character class>>cr13.3% {12ms} Character class>>value:12.2% {11ms} WriteStream>>nextPutAll:12.2% {11ms} WriteStream>>nextPut:10.0% {9ms} ByteString class(String class)>>new: 4.4% {4ms} WriteStream>>contents 4.4% {4ms} WriteStream(PositionableStream)>>on:**Memory**    old         +0 bytes    young       +1,074,872 bytes    used        +1,074,872 bytes    free        -1,074,872 bytes**GCs**    full         0 totalling 0ms (0.0% uptime)    incr         8 totalling 1ms (1.0% uptime), avg 0.0ms    tenures      0    root table   0 overflows
]

メソッドの組み立て例

ストリームとカンマ・メッセージによる文字列連結だけを考えたときにはたいした差が出ないとしても,ストリームを使うかどうかはもちろん連結以外の部分にも影響する.とりあえずひねり出した実際のメソッドの例. for Squeak オンリ〜.下手な例とか言わない.

お題: n 行の文字列 (sourceString) から m (lineNumber) 行だけコピーしたい

とする.で,ごく単純に考えて,以下のように二つのパターンを組んだとする.思い付きで, m > n でもちゃんと動く= n 行分だけ返すこと,という条件を追加する.

A: カンマ・メッセージ・パターン
foo: sourceString bar: lineNumber    | limit index string |    limit := sourceString lineCount.    index := 1.    string := ''.    [ index <= limit and: [ index <= lineNumber ] ] whileTrue:         [ string := string , (sourceString lineNumber: index) , String cr.        index := index + 1 ].    ^ string
B: ストリーム・パターン
foo: sourceString bar: lineNumber    | stream index |    stream := sourceString readStream.    index := 1.    ^ String streamContents:         [ :s |         [ stream atEnd not and: [ index <= lineNumber ] ] whileTrue:             [ s nextPutAll: (stream upTo: Character cr).            s nextPut: Character cr.            index := index + 1 ] ]

結果は同一になる.で,実行速度を測ってみる.上記 2 パターンをそれぞれ 10000 回走らせてみる.

method using String concatinating comparing stream with comma.
A: カンマ・メッセージ・パターン 4357 msec
B: ストリーム・パターン 329 msec

と 13 倍以上の差になる. spyOn: で調べてみると, A パターンでは,実は lineCount で全体の 90% 近くの処理時間を喰っていることが判る.それじゃぁってんで,

    limit := sourceString occurrencesOf: Character cr.

や,

    limit := sourceString occursInWithEmpty: Character cr caseSensitive: true.

に変えてみても,もっと遅くなる orz.もし Magritte-Model パッケージを入れてると, lines メソッドが使えるので,これを使うと, 2238 msec と倍ぐらいに速くなる ;-).

    limit := sourceString lines size.

こいつは Array streamContents: を使っているが,それでも B パターンが 6 倍以上速いことに変わりはない.

A: カンマ・メッセージ・パターンでじたばたする. B: ストリーム・パターンはも〜まんたい

もし, m <= n が常に成り立つとするならば, A ∩ B の A はつねに真となり終端の検査が必要ないことになる.いちばん重い lineCount メソッドを使わずに済むが,それでも 1881 msec 掛かるので 5 倍以上遅い.その一方で, B パターンでストリームの終端判定を外しても 323 msec とかで,有意な差は出ない.

この条件が常に成り立つと仮定した場合,もっと単純化して index をなくし,

    1 to: lineNumber do: [:i | string := string , (sourceString lineNumber: i) , String cr].

とか,

    lineNumber timesRepeat:         [s nextPutAll: (stream upTo: Character cr).         s nextPut: Character cr].

なども考えられる.

でも, sourceString を string のまま使ってる限り,スピードは上がらん.ストリームにすると upTo: はストリーム中のポインタ k を移動してくれるので,コピーは k から l までの転送で済むのに対し, string のままだと,毎回ソース文字列の先頭から転送開始位置までスキャンする必要があるため.

ならば,それでもストリームを使わないことに固執するなら,あらかじめ findTokens: Character cr でコレクションにして渡せば? という話になりかねん.確かにソレだと m >= n の判定も可能.でもですよ,メソッドの事前条件のチェックをセンダにやらせるんすか,マジで (笑).

念のためトークン分解他力本願兼ノー・チェック版を試してみる.↓これは単に集合の各要素を順番に取り出して繋げてるだけだ.

    | string |    string := ''.    1         to: maxLineNumber        do: [ :index | string := string , (tokens at: index) , String cr ].    ^ string

ここまで責務を削り落とすと 359 msec と劇的に速くなるのだが,それでもストリーム版よりちょいと遅いという結果になった.トークン分解を自前で抱え込むと,一気に 9301 msec となる.どこでやるにしろ,トークン分解を行うと,全体は重くなる.かえってトークン分解を行わない

...do: [ :index | string := string , (sourceString lineNumber: index) , String cr ].

とした方が 1777 msec と,速い. findTokens: はそれだけ重い処理というわけでした. Java だと StringTokenizer という単独のクラスになってるぐらいだもんね.

まとめると以下のとおり.

various using String concatinating comparing stream with comma.
A: カンマ・メッセージ・パターン B: ストリーム・パターン
(全部同じソース)
安全度 メモ 処理時間 安全度 処理時間
自前でトークン分解 & サイズ・チェック 9081 msec 335 msec
lineNumber: & サイズ・チェック
(トークン分解不要)
4329 msec 343 msec
× 自前でトークン分解 & サイズ・チェックなし
(サイズ・チェックありより遅いのは計測誤差の積算結果?)
9301 msec 328 msec
× lineNumber: & サイズ・チェックなし
(トークン分解不要)
1777 msec 329 msec
× トークン分解なし & サイズ・チェックなしでトークン× n をもらう 359 msec 331 msec
B: ストリーム・パターンでエエよ

結論:おとなしくストリーム版を採用することにしますハイ.余談:こ〜ゆ〜のはテストケースにしとくと楽.単体で doIt するときは,

    FooBarBazTest new setTestSelector: #testFooBar; testFooBar.

とかで走りますよ

さらに,キーワードのパラメータについて

あと, A も B も lineNumber には 0 や負数を喰わせてもちゃんと動く. String streamContents: [ :s | ] は空文字を返すので,同じ動きになってくれる. Float, Fraction を喰わせても,よきに計らってくれます.ここまでは佳い.パラメータはそれぞれ String cr を含む長い文字列と自然数を想定しているが,そうじゃないオブジェクト,たとえば nil が渡されたらどうすんの? という問題が残る.それぞれ, asStringasNumber (asInteger の方がベター) が判らないオブジェクトが渡されてきたかどうかを見て, nil なり空文字を返すなりすれば佳い.

あと出しはやみれ〜

と,まぁ,このメソッドが使われる状況を考えないと,あれもこれもという話になってしまう.実はこのメソッド,あるクラスのインスタンス・メソッドなんだが,これに与えられるパラメータは, 1) sourceString が,そのクラスのインスタンス変数に格納された文字列と, 2) lineNumber は,(その行数 min: ある正の定数),ということになっている.つまり, lineNumbersourceString に依存するわけである.そして sourceString に渡されるインスタンス変数は,インスタンス生成時に空文字を含む何らかの文字列で初期化される.どっかの阿呆が nil とかブチ込まん限りは.その阿呆は間違いなく自分な訳だが (笑).というわけで,このメソッドのテストに関しては,実は暗黙の仮定だった lineNumber は自然数で,かつ sourceString の行数より大きくなることはない,という条件だけをテストすりゃエエはず.あとは,このクラス自体あるいは他のメソッドのテストでチェックすべきということで一件落着させる.ということはサイズ・チェックなしでも佳かったんじゃネェか! はい,そのとおりでごぜぇます.でも,「私 ああいうの気持ち悪いんですよね」 © ゆの[蒼樹うめ "ひだまりスケッチ", 第 1 巻, 芳文社, 2005, 2008, ISBN4-8322-7549-6, p.32.]

余談

文字列クラスに関しては, Java でも似たような話があるよね.新人研修必修ネタだけど,文字列をいじくるときは String じゃなくて StringBuilderStringBuffer,あるいは StringWriter を使えって. StringWriter なんてもろにストリームでしょ.

2009年12月18日金曜日

雑記: Apple はおれに EOS の 1DmkIV か 7D を買えというのか! え, D3S で すか?

ソフトウェア・アップデートで「デジタルカメラ RAW 互換性アップデート 2.7」というのが落ちてきたので見てみたら.

EOS-1D Mark IV (APS-H,未発売) や EOS 7D (APS-C), D3S (FX) などのサポートが追加されてる.買えというデスか (笑). kakaku を見てみたら,それぞれ最安値は約 495k, 128k, 509k となってる.ちなみに, 7D のファインダにはホれそうです.ヨドバシで覗いてみたら,えれぇごっつぅたいそうべり〜く〜るに感触佳かった, APS-C だけど

2009年12月14日月曜日

Squeak: 多部な遊び場で道草を喰う

ネタとしてはちょいと古い.

タスク・バーが使えるイメージを使ってると,ワークスペースをいくつか開きっ放しにしてるとウザいことないスか.タスク・バーの中身はアイコンだけにするよう改造していても.というわけで,タブ化に挑戦してみた.寄り道である.

VWNC のワークスペースは,ずいぶん前からタブ表示が可能になっている.あ,こいつってばシンタックス・アウェアじゃなかったのか (笑).

  • Workspece of VWNC7.4.1

上のコードは Squeak 用なので,もちろん動かない.って,そんなことはど〜でも佳くて,とりあえず,多部なワークスペースをでっち上げてみた. ScriptManager で充分ぢゃん,なんて言わない.表示領域を稼ぐため,メニュー・バーやツール・バーはありません,という言い訳. Shout の華麗な (あるいは,こってりした,もしくは,うるさい) カラー・シンタックス表示に慣れるてると, VWNC の表示はやけにあっさり (笑).

  • multi tabbed workspace for Squeak

現状は,ページの追加,改名,削除ぐらいしかできん.多段にも未対応. TabGroup を使ってるので Polymorph 必須.とりあえず SHWorkspace のサブクラスにしてるんで, Shout も必須 (笑).

  • 多部な遊び場の長所
    1. 画面専有面積が少ない.
    2. タスクバーの専有面積が少ない.
  • 多部な遊び場の短所
    1. 複数の遊び場を同時に見ることができない.
    2. ハロを出してタブに関するモルフを削除しようとすると警察沙汰になる.っつ〜か,おそらく再起不能で, OS から kill せんとダメ.

今んとこ,そんな感じ.

2009年12月13日日曜日

Jazz File: Mahavishnu Orchestra Live at Montreux 1974

JAZZ FILE|WOWOWオンライン

どんなもんかと (少しだけ) 期待して再放送を録画してみたが,こりゃジャン=リュック・ポンティとマイケル・ウォルデンを観る (聴く) ためのもんだな.マクラフリンは,重そうなダブル・ネック (6 弦 × 2) のギターを一本調子でガシガシを弾きまくるだけで,ちっとも面白くない.たぶん,マイルスのバンドにいたのは,同姓同名の別人なんだろう (笑).ゲイル・モランはローズがトラブってたのか,スタッフが周りをうろうろしてる.直らなかったみたいね.ラルフィーのベースはあんま派手じゃないけど堅実.ってな感じで,およそ 50 分で 2 曲. 5 人のメンバーに,ホーン部隊 2 名と弦楽四重奏が付く.ゲストの方が人数多いです (笑).音はモコってるが,それなりに聴ける.

  1. Wings of Karma
  2. Hymn to Him
  • Jean-Luc Ponty : vln
  • John McLaughlin : gtr
  • Narada Michael Walden : drms
  • Gayle Moran : kbds
  • Ralphe Armstrong : bs
  • Bob Knapp : fl, perc
  • Steve Frankovich : horns
  • Steve Kindler : vln
  • Carol Shrive : vln
  • Marsha Westbrook : vla
  • Phillip Hirschi : vlc

ネタはおそらく 2007 年に出た Mahavishnu Orchestra: Live at Montreux 1984/1974 の 2 枚目の映像部.曲が (も?) 詰まんないんかな〜.言っちゃぁ悪いが,同じヴァイオリンが入ってるんなら,ディディエ・ロックウッドがいた頃の Magma の方がずっと面白く聴ける.というころで,今後マハヴィシュヌの CD を買うことは,おそらく「ない」.ポンティを聴くなら,ホールズワースと一緒に演ってるソロ・アルバムの方を買うよ.

あと,ファロア・サンダースのインタビュー直前で,ピーター・バラカンが,ワイアットのカバー・アルバムを紹介してた. Around Robert Wyatt by Orchestre National de Jazz がソレで,ほんのちょっとだけだが,ワイアットの歌声が WOWOW の電波に乗ったわけだ (笑).

戦う司書 The Book of Bantorra #11 弱者と迷宮と女王の指し手

「ヤツだ,ハミュッツが来る」 © モッカニア=フルール.「破滅が来る」と聞こえるんですが〜.現状,あながち間違いでないのが笑える.

をいをい,イレイアさん放置ですか.モッカニアが武装司書になったのは幼い頃に殺された母親の本を探し出すため,ということですか? レナス=フルールというのが母親の名前,ということでエエんだよね.若過ぎるんではないかという指摘に「モッカニアの母親はこれでいいんだ」と押し切るウインケニーだが,なぜ佳いんだか全然判らん.モッカニアが偽物と知りつつレナス’を受け入れるんかも,やっぱり判らん.だから,「断れば,あの女 (偽レナス) に秘密をバラす」→「それを知ったら,彼女は憎むだろうな.自分の記憶を奪った神溺教団を.そしてお前を」がなぜ脅迫材料になるのかも判らん.強引に,母親でないものを失うことと母親を失うことが等価にされてるが,その根拠は如何.母親とは記憶なのか? 違うだろ.何か,偽レナスもモッカニアも,説明なしで納得してるけど.「みんなに,済まなかったと」,散々っぱら暴れといて,なんだよ,それ (笑).結句,自滅ですか.え〜と,もしかして,このお話はエエお話だったのか?

最前からずっといるけど,エンリケは就職したんスかね.次回予告にひょいと出てる短髪 (?) 眼鏡の目付きが逝ってる女,なんか掃除屋ソーヤーを思い出した (笑).

あ〜, MBP に比べると Lisa タンのキーボード・タッチは佳いな〜.ふにゃふにゃしてるけど,比較するとストロークが深いのが佳い.

2009年12月7日月曜日

雑記:ドルパ 22

You made me realise

ドールズ・パーティー22 開催情報|株式会社ボークス|VOLKS Inc.

寝坊して盛大に遅刻.→なんかマイブラの "You made me realise" のジャケ写みたいな感じ? 隣でマイナビ就職 EXPO やってて,黒スーツの大洪水.両極端で異様な雰囲気 (笑).会場はホール 3 つブチ抜きで, 首都圏外郭放水路大谷石地下採掘場跡 の地下大神殿とどっちが広いんだろとかバカなことを考えていた.

ギター (というか楽器) お目当てだったんだが,該当出展なし.がっくし.後で確認したら,写真はけっきょく 83 枚ほど撮っていた.

  • You made me realise

特展ブースの何番だったっけ? キラは実際の展示よりブース前に出てた写真の方が佳かった (笑).

そういや国際展示場駅からビッグサイトへの屋根付きオープン通路,あれ TBS とどういう関係があんのかね.まさかビッグサイトの略称が TBS で同じだからとかいうネタ的なもん? (笑)

戦う司書 The Book of Bantorra #10 変人と母親と黒蟻の巣

「母親に言われて叛乱を起こす,か.とんだ武装司書がいたもんだ」 © あの青い制服を着た,垣巣凍二郎中佐みたいなのは誰.フィーキー=クインだっけ? それなら第五迷宮で黒蟻に喰われましたが.

モッカニア=フルールの叛乱伝説.あるいはヒッキー騒動.対するはイレイア=キティ.「ほぉぉぉぉぉ〜 (cresc),ほっ!」,おばさん,カッチョエエ〜っ! (笑) 黒幕は神溺教団のウインケニー=ビゼ.あら,イレイアさん,持久力がない.んでハミュッツが引き継ぐ.リスク管理の問題ッすか.あれ,この話は次回へ続くの? そんな大きな話じゃないと思ってたよ (笑).ところで,記憶の損傷という問題に関して誰も恐怖を抱いてないのはなぜ.

今回も,やや絵がショボい.特に止め絵が.

The 2nd and last day of YOSHIDA MINAKO & THE BAND 2 Days Live 2009/12/05 at STB139

「土方隆行 and THE BAND, 最後までごゆっくりお楽しみください」 © 吉田美奈子.みんなモノトーン系のシャツだったのに一人だけ柄物の刑.

ドラムスが成田さんから島村英二氏に交替.油っこいというか,粘っこくなった印象.イアン・ペイスからスティーヴ・フェローンに交替したような感じ? (笑) タイコはヤマハでした.第二部ラストの『雲の魚』からゲストで村田陽一参加. MC 長いッす (笑).今日はギター・アンプがマーシャルじゃなかった.終演後にでも確認しときゃ佳かった.

  • 吉田美奈子 : vcl
  • 岡沢章 : bs, cho
  • 土方隆行 : gtr, cho
  • 倉田信雄 : pf, el-pf, cho
  • 河合代介 : hammond, cho
  • 島村英二 : drms
  • 村田陽一 : trb

大雨だったが,今回はチケ運が佳くて,第 2 パラグラフ先頭中央やや右寄りでドラムスの真っ正面,ステージ幅を一辺とする正三角形の頂点位置.それだけに,聴こえてくる音とちゃんとそこにあるべき音が一致する.ヴォーカルが天上から降ってくるようなことはない(笑).面押しも健在だが,パルスによる点的打撃も確認.とくにバスドラ.

Camino 2.0.1, mi 2.1.9

Camino. Version 2.0.1 (1.9.0.16 2009120123), Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.4; en; rv:1.9.0.16) Gecko/2009120123 Camino/2.0.1 (like Firefox/3.0.16), Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en; rv:1.9.0.16) Gecko/2009120123 Camino/2.0.1 (like Firefox/3.0.16).

Camino. Releases. 2.0.1.ついこの前 2.0 が出たと思ったんだが (笑). stability and security アップデート.

mi - Mac OS X 用テキストエディタ. mi の方も正式版になった. 2.1.9b9 からやや修正が加わっている.

2009年12月1日火曜日

Jenifer Tidwell『デザイニング・インターフェース』

  • Jenifer Tidwell "デザイニング・インターフェース", パターンによる実践的インタラクションデザイン, ソシオメディア 監, 浅野紀予 訳, オライリー・ジャパン, 2007, 2009, ISBN978-4-87311-316-6, (Jenifer Tidwell "Designing Interfaces", Patterns for Effective Interaction Design, 2005)

2005 年時点での GUI カタログ,だな. 4,000 円近いお値段に見合うかどうかはちょとアレだが,なかなか面白かった.っつ〜か,スクリーンショットがカラーなんで見て楽しい (笑).ところどころで監訳者が原著者にツッコミ入れてるのも可笑しい.