著作一覧 |
友人の家でワーグナーがバイロイトで演出したマイスタージンガーを観る。
なんで全裸かわけわかんねぇとか。
それはベックメッサーが歌うところで土をいじくって全裸の男女を舞台に上げて、笑い者になるところだ。
なんだろう? とわからないまま、ワルターの番。ん? 歌は素晴らしいが凡庸で気味が悪い男女、操り人形ぽい、を出して歌を補完する。
わかった。
ベックメッサーは神のごとく土から人間を生み出した、少なくともそれにチャレンジしている。
それに比べるとワルターはかすだ。もちろん観衆も親方たちも。ということは……そういえば、ジークフリートの衣装を着ているのはベックメッサーだ。
ああ、なるほど。この演出はあからさまだよ、と友人が言う。この後がすごいんだ。
すると、ワルターから鹿の像をつき返されたザックス(その間、Bek in The TownのTシャツを着たベックメッサーが傍観者的にせせら笑っている。)が明らかな身振りと照明の中、ドイツを語る。おれはこの曲大好きなのだ。だがここまで露骨にある側面を出されると、気分が悪くなる。アレックス効果だ。
演奏が終わるやウーウー激しいブーイング(その一方で拍手)
引導を渡すのは血を継いだものの役回りと考えたのだろうか。
Cygwin + MinGW + GCC 相談室 Part 5
述べよう。
たぶん、ここの部分で人間ではないと想像がつくけど、それっぽく構成してあるので感心した。
日本語をメインに利用していないという可能性もあるか。
マイクロソフトはコールタールの穴にはまりこんで抜け出せずにいる。自らの住むすべてのエコシステムを焼き尽くす地獄の炎が迫っているのを理解できないのだ。
Steve Jobs が Flash を嫌う本当の理由
.NETが発表された2000年のPDCのオープニングビデオでは、デバイスとネットワークが融合された世界が描かれていた。子供から老人までがネットワークを介して情報を交換していた。iPhoneとiPadにそっくりなわけだが。
その時点ではクラウドという言葉はなかったし、Azureもなかった。あるのは.NET Platformというもので、.NET Passportとか.NET Serviceとかとのなにやらとインフラとしての.NET Frameworkがあった。
しかし.NET Passportは妙に閉鎖的なパスポートだったので総スカンを食らったし、.NET Frameworkがものになるのには2003年を待つ必要もあった。それにしてもOfficeがCLR上で動くようにならなければ、おれは.NETには移行しないよ、みたいな言質がそれなりに通用してしまってはいた。
それに比べると、そういうヴィジョンを直接示すことなしにGoogleはもっとうまくやったように見える。みんなGAEに夢中だし、JVMの再生が行われているようにさえみえる。
でも考えてみれば、10年というのは長いようだが実際にはそれほどのことでもない。
そして、10年かかって気づいてみればOfficeが10になっているし、Azureは動いている。C#はC++と同じくらい複雑怪奇な混合物になっているけどVBは相変わらずそれなりのシンプルさを維持している。Appleはとんでもない化け物に変身してしまったが、Sunは水晶の中に閉じ込められてしまっている。IBMの90年代がMicrosoftの0年代だったということかも知れないな。
観てきた。
エイリアン側に主人公がつくとか、凶悪な私設軍隊が敵とか、モビールスーツを着込んで大暴れとかどことなくアバターみたいな感じだが、物語性はこちらのほうが相当ある。ヨハネスブルクという場所設定が利いているのかも知れない。それにしてもスラムの墓標のような建物群はどうにもすさまじい。
ドキュメンタリー調で社会学者や元同僚、家族のインタビューを合間にはさみながら、妻の父親のひきで異例の昇進を遂げた男の不幸を描くわけだが、それでも妻や元同僚が信用してくれている(元同僚が黒人で、それは上級職の中にはほとんど存在しないとか、主人公はごくごく当たり前に接しているとか(それにしても防弾チョッキが用意されていないというエピソードなどで周りの圧力の存在が示されているので、逆に主人公が「良い人」ということが示されているのだとは思う。それでも卵に対する接し方やはしばしにエイリアンに対してどう感じているかは見せているわけだ))とか、最後の土壇場で人間復興するとか(ここは直前のシーンの上ずったセリフ回しが読み取りにくいらしく、子供や妻はその時点で何らかの意思疎通の結果として陽動作戦に出たと観ていたらしいが、そんなことはなく、その時点では単なる身勝手な(とは言えそれはそれで当然の選択だ)だけのことだ)、最後にささやかな幸福感を残しているのが良い感じだ。
それにしてもなんでナイジェリアなんだろう? 麻薬の密売人はそのあたりから流れてきた連中が多いのかな。
mingw32のままでWindows ScriptingでRubyを使いたい=ASRをどうにかできないか? という問い合わせが来たのでちょっと調べた。
調べたといっても、mingwバイナリからアーカイブを落としてbinディレクトリを調べただけだけど。
そうしたら、Ruby本体はmsvcrt-ruby18.dll(MSVCでコンパイルしたということではなく、msvcrt.dllとリンクするという意味なんだろうな)となっているから、これならRScript18.dllからロードできる。
というわけで、ちょっと古いけどRScriptをダウンロード、mingw版binディレクトリへコピー、regsvr32してもらったらちゃんと動いたと返事が来た。
で、テスト用に書いたスクリプトについての追加の質問が来た(ここから全然、別の話となる)。WSHってなんだ? そんな定数どこにも定義してないし、Rubyの中にもないぞ、と訊いて来る。もっともな質問だなぁ。
で、MSDNをポイントしようとしたのだった。
そこからが長かった。Googleで検索すると、MSDNは5番目の位置でWindows Scriptが見つかる。が、ここは廃墟だ。リンク切れの嵐。
これはおかしいな、とMSDN内部検索すると、Windows Script Host(ja-jp)が見つかる。これならOKだけど、Googleはこっちをポイントすべきだろう。
・古いテクノロジだから、被リンク数は圧倒的に上の廃墟側、ということなのだと思う。いかにURIを変えないということが重要か、ということだ。
で、これが読めるはずありえないから、langを彼の国語に合わせてみたけど、見つからない。
はて、英語ならどうだ? とやると言語は変わるがやはり見つからない。っ本物はWindows Script Hostで、言語だけではなく、ページ名も違う。わけわからんな。しかも(追記:以下、嘘でした。左のペインが日本語になっているので日本語ページだと思い込んだけど良くみたら英語のコンテンツが右のペインに表示されていた。というか、HTMLなんだからペインじゃなくてフレームかも。ではCSSで組んだ配置可能なDIV要素とかだとなんと呼べば良いのだろうか)同じページの日本語版があるのだが、MSDN検索でなぜこっちが出てこないんだ? というか日本では似たようなページがこれで3箇所存在していることになる。
で、同じようなやり方でfr-frも調べてみたが、Developpement Webの下にそもそもそんな項目がない。確かにない。
もしかして、スクリプティングってアメリカと日本だけではやっていたのかなぁ? (そんなことはないと思うけど)
妻が図書館で借りた本を面白そうに読んでいるのでちょっと借りて読んだ。確かに無茶苦茶面白い。
1960年代に女性の下着に革命を起こした人らしい。
その時代の革命と言えばイギリスの(名前忘れた)のミニというのはすぐ出てくるのだが(忘れたけど)、鴨居羊子というのは初耳だった。
色がついたパンティ=スキャンダラスなパンティ略してスキャンティと称したのがスキャンティ(今ではパンティもろとも死語っぽいけど)の語源とはびっくりだ。
で、この本は当時の報道、インタビュー、関係者の回想や当時の言説から構成されたレトロスペクティブとなっている。本当に世の中の価値観って激変するんだな。
特に当時の朝日ジャーナルの記事(聞き書き形式)が面白かった。白い下着というのに対する妄念が形成された歴史的な経緯と、それの打破が実はパラダイムシフトだということを、鴨居はあくまでも製造コストと衛生という観点から説明し、おそらく納得した記者がそれでも読者目線であら探ししていたりとか。というか夕刊紙の冷笑文体そのものなのが(内容とは別にそれはそれで)面白かった。
突然IE8が何も表示しなくなって焦りまくる。
ソースの表示も真っ白。
いろいろ考えた末、Office Send-a-Smileをアンインストールしたことに思い当たる。IEの何かレンダリングに関係するコンポーネントを置き換えたのかも知れない。でも再起動は促されなかったはずだが。
で、ダメ元で再起動したら復旧したけど本当にそれが原因だったのかなぁ。
Rjbのスクリプトによる実験がそれなりにちゃんと動くようになったので拡張ライブラリ側に入れようと思ったのだが、はまるのなんの。
def class_eval(&proc) @user_initialize = proc end def prepare_proxy(pxy) pxy.instance_eval do def include(*mod) extend *mod end end pxy.instance_eval &@user_initialize if @user_initialize pxy end
で、まあ、includeメソッドをいじっているところは、rb_define_alias(instance, "include", "extend"); するから良いとして、class_evalの箇所は、多分、rb_block_procから返るVALUEを保存しておけば良いだろう。
しかし、instance_eval &argはどうすれば良いのだろうか?
で、ソースを追っかけているうちについ眠ってしまっていた。
先日、録画しといたトスカを子供と観ていたら、カヴァラドッシがやたらとイケメンだという話になる。歌手の名前をみるとジョナス・カウフマンという名前で、名前からはドイツ人っぽい。
で、トスカだからマーラーいわくの通り、1幕のおしまいはファンファーレで神様降臨(この演出だとトスカだったけど)、2幕は血みどろ叫び声、3幕は死んだ死んだ、なのだが、さいしょは絵の具だらけのカヴァラドッシがこめかみきりきりの拷問で血まみれになって、最後は服までぼろぼろとなる。
そういえば、と子供が言い出す。家にあるカルメンのDVDもやたらとイケメンのホセだよね。で、やっぱり最後はボロボロになって出てくる。
そこで、見返してみるかと、見返してみると、確かにイケメンで、エスカミーリョが「カルメンがどえらいイケメンに惚れてくっついたのは知ってるが、そろそろ6ヶ月たったから飽きたころだ。そこでおれさまやってきた」と歌いながらホセの顔をみて、「ああ、おまえさんか、すぐわかる」と歌うのも無理はない。まさにはまり役である。
最近のオペラ歌手はイケメン南米系と小太りイタリア系だよねぇ、と話ながら名前を見るとジョナス(ヨナスかも)・カウフマン、同じ人だよ。
George Bizet - Carmen (Ws Sub Ac3 Dol Dts) [DVD] [Import](Anna Caterina Antonacci)
というわけで、少なくともカウフマンはイケメンだという属人的な結論になるのであった。
とにかく、とんでもなく遅い回線のユーザがいて、つまりはモデム回線ということで、秒あたり4Kバイトも送信できればOKという感じ。
そうなってくると、JavaScriptとかで、document.getElemenstByName('long-clear-name'); なんて書くだけで47バイトだから、そんな記述を100行も書けばそれだけで1秒を食ってしまうことになる。当然、$('nm')とかにしたい。したがって、すべての要素名はできるだけ重複をなくして、getElementByIdでアクセスできるようにしておいて、さらに、変数名2文字、要素名(ID)2文字とか、いったいいつの時代のMSX-BASICみたいなJavaScriptを、現代風な動的な感じで書くと、これがとんでもなく読みにくい。というか、バグが結構入る。確かにまともな名前は重要だと思い知るが、さて、難しい。
さすがにインデントやコメントはフィルターを使って削除するようにしてみたりして、ソース上には残しているのだが、10行程度の関数でも仮引数名1文字、変数名2文字、関数名1文字とかだと、ちょっと似たような処理で変数名を取り違えてみたりもして。
RJSのようなアプローチならそういう問題はないはずで、生成したJavaScriptの変数名がどれだけ記号だからといって別段困らないだろう。
しかし、実際に動かしてバグが出た場合、対応関係をとらなければならないから、それはそれで厄介っぽい。
とりあえずは、gzip圧縮かけるとか、encodingで逃げるわけだが、それでもコンパクトにうまく記述する方法はないものかな。(でもデバッグ終われば熱さを忘れるからどうでも良くなったりするのだが)
blockをC APIで呼び出すの続き。
元の問題は、
class A def a(&proc) @proc = proc end def run_a(himself) himself.instance_eval &@proc end end
の&procをどうすればC APIで実現できるかということだった。
上のaに相当するコードは割りと簡単にわかった。
if (rb_block_given_p()) { rb_ivar_set(self, rb_intern("@proc"), rb_block_proc()); }
が、この後がいけない。上で@procに保存したのはProcのインスタンスだが、Methodと異なり、元のselfが組み込まれていてそれを外せない。したがって、元のself以外のselfのコンテキストで実行することができない。
eval.cを読むと、rb_proc_callにはselfは与えられないし(Qundefが設定される)、与えられるproc_invokeはstaticだ。
逆に考えて、元のスクリプト同様にブロックを用意するのはどうだろうか?
PUSH_BLOCKしかないのかな?
では、&はどうやっているのかと思うと、NEW_BLOCK_PASSになるようで(合ってるかな?)つまるところノードに評価時点で組み込まれてしまう。するとeval.cのblock_passに入ってくるので、この関数のstaticを外して、と考えてみるまでも無くノードが引数なわけだしそれは外部に公開されていないはずだ。
で、考えるのをやめて、
rb_ivar_set(himself, rb_intern("@_temporary_block"), proc); rb_funcall(himself, rb_intern("instance_eval"), 1, rb_str_new2("instance_eval &@_temporary_block"));
とした。というわけで、現在のところ、&argに相当するC APIは無いでFAなのかなぁ。
VALUE rb_block_pass(VALUE self, VALUE proc);
selfをレシーバとしてprocをブロックとして与える。
rb_block_pass(self, proc); if (!rb_block_given_p()) { rb_raise("bug"); } rb_funcall(self, rb_intern("instance_eval"), 0, 0);
という感じのが欲しいような気もするが、おそらく公開APIにするよりは、インタプリタを使わせるほうが良いのだろうな。
have_headerのコマンドにライブラリの設定があって、そこにuselessな(主観だけど)スタティックなrubyライブラリが指定されてる。
そのため、おれさまパッケージだと拡張ライブラリが作れない。
どういう経緯でこのへんが変わったんだろう?
なぜか、本屋で目に付いたので、ルワンダ中央銀行総裁の思い出話を買って読み始めた。
はるか昔のことである。革命した大統領がいて、植民地時代の官僚やら、外国からやってきた顧問だとかがいる。
問題点として2重の為替の存在があり、切り下げをして一本化すべきか、そうすべきではないか、と諸説乱れとび、当たり前だがそれぞれの主張は言っている側の利益にかなうことである。
そこで赴任したての中央銀行総裁は各所から意見を聞いている。それぞれ自分勝手なことを喚き立てては去っていくのでうんざりしているところに大統領からお呼びがかかる。大統領は実際問題として途方に暮れているのだ。
では、大統領、あなたはこの国をどうしたいのか? 急激な発展を望むのか、それとも地味だが恒常的な発展を望むのか、それによって採るべき技術は異なる。技術は政治を実現するためにあるのだから、大統領、あなたがどのように国を導きたいのか、まずそれをお聞かせ願いたい。
その問いかけに対する回答が素晴らしく、なぜか心に響く。
私は革命、独立以来、ただルワンダの山々に住んでいるルワンダ人の自由と幸福を願ってきたし、独立ルワンダにおいては、ルワンダ人が昨日より今日の生活が豊かになり、今日よりは明日の生活がよくなる希望がもて、さらには自分よりも自分の子供が豊かな生活ができるという期待をもてるようにしたいと考えている。私の考えているルワンダ人とは官吏などキガリに住む一部の人ではない。ルワンダの山々に住むルワンダの大衆なのである。
なぜ、おれはこの言葉にいささかの感動を覚えたのだろうか。
おそらく、それが建前であったとしても、「自分よりも自分の子供が豊かな生活ができるという期待」という箇所が特に大きいように思える。希望というものは、つまりは、一代限りのものではなく永遠に増幅していくものなのであろう。であれば、そもそも子供が減りつつある国家というものは、それだけで、すでにして希望の総量が減りつつあるということであり、絶望と虚無に侵食されつつあるということかも知れない。
山の彼方の空の遠くの方の下の方の場所のどこかの方に、幸いの終の住むの所の場所が
なかなか続かないのことのようだ。「方の」を使うとそれなりに続けられるが、あまり格好は良いものではない。
貴社ののりののりしろの方式でのを含む単語を混ぜればある程度は重ねられそうだが、ちょっと反則のような気がする。というか地の文のところではなかなか続かない。
なんのかんのでも2回。
日本の東京の新宿の歌舞伎町の駅の近くのビルの5階の事務所の中の会議室、そうか、要諦が掴めたぞ。地名を使えば簡単に重ねられる。地球のアジアの日本の東京の中央区の日本橋の1丁目の1番地の1号のビルの名前はなんでしょう? とか。
時間はどうだろうか。西暦の2010年の1月の1日の12時の5分のことだった。できるな。
それにしても、なぜ物事の肝心なところを示す言葉の要諦の中の最後の字が諦なのだろうか。何かを諦めることが物事では肝心という教えなのかな?
こんなHRESULTは見たことがないので(winerror.hにも出ていない)、Google使って調べたら、VBA_E_COMPILEERROR だとLifeAsBobのエラーコードページに出ていた。それにしても、このページはすげぇな。
名前が不思議な響きなので印象的なオラビニのJRuby on Railsをもらった。
JRuby on Rails実践開発ガイド (Professional Ruby Series)(Ola Bini)
それなりに厚さがある本だが、僕にとって興味があるのは、第6章のJavaインテグレーションの箇所かな。$CLASSPATHとかinclude_classとか。
あと、地味にJRuby-extrasの章とか(と思って読み始めたら実はあまり大した内容ではなかった)。
むしろ、複数のJRailsインスタンスを統合する(レガシーシステムとも)チュートリアル(11〜13章)が興味深かった。Javaと違って圧倒的にコードがコンパクトなので、掲載してあるリストを眺めるのがえらく簡単だから、何をしたいのかがわかりやすい。で、つい読んでしまったりして(正直なところあまり読む気はなかったのだが、スムーズに内容に入れるのでオラビニの書き方はうまいと思った)。
見本誌が来ていないので、実は最終的にどう編集されているかドキドキものではあるけれど(結構執筆/編集バグがあったので)、SDに記事を書きました。
Software Design (ソフトウェア デザイン) 2010年 06月号 [雑誌](-)
特集の「はじめての関数型言語」というやつです。
なぜ、おれが? という疑問を持たれる人もいるでしょうが、これまでのところ関数型の特集をやると
・いい記事なのに、どうも難しいよね〜読者の反応薄いし
となりすぎるきらいがあるのは、関数型の記事を関数型の人が書くと、原稿に関数を適用したような記事になってしまうからかも知れない。ここはあえて逆張りしてみたら……というような理由があったようななかったような、ことのようです。
そこで、お話関数型というかそういった記事とか、なんでもカタログとか、手を変え見方を変え、いろいろな方向からたった一人で群蒙(あ、これは良い変換)虚像(もしかするとこれも良い変換)を撫ぜるような記事(といってもさすがに無理して妙な方向に背伸びをしても誰の得にもならないので、nobsunにアドバイザーや編集しまくりだけどインタビューイをお願いしたり)で作ってみました。
参考文献はこれ。
プログラミング言語の新潮流 (計算機科学・ソフトウェア技術講座 2)(哲雄, 井田)
でも、もう入手できない本みたいだなぁ。
たぶん、これの元ネタかも。
(こっちは読んでないから知らないけど表紙を見ると少しは重なっている点がありそうな気がする)
あと、カタログに並べた本のうち、原稿を最初に書いた時点では読んでいなかったけど(そういうのは正直ベースに読んでないけど〜みたいに書いてある)結局買って読んでしまったのが、これ。
プログラミングClojure(Stuart Halloway)
ま、正直ベースに言って、この特集はけっこうおもしろいと思います。僕は考えて調べて書いて調べて考えて直してまた書いて読み返していて、その都度いろいろ発見ありまくりで、えらくおもしろかった。
新しいホームズ観て来た。渋谷でレイトショー。それなりに入っていた。
ホームズはなんかチャップリンみたいだなぁと思っていたら、後になってプログラムを観たら、本当にチャップリン役を演じたことがある人だった。
そのての、モダンな感じを出している。
しかも、19世紀末のはずなのに1920年代のギャングっぽいよなぁとか思って観ているわけだが、これもあとになってプログラムを観ると明日に向かって撃てが散々言及されているわけだし。ただ、ちびの黒い心とでかい良いやつという組み合わせはニューシネマよりもジョゼジョバンニやジャックドレとかに近い(が、画はニューシネマ)。
ホームズは、くしゃくしゃ頭でひょうひょうとして(このあたりの原作になんとなく抱く主人公像に対するビジュアルの破壊方法は、ロンググッドバイのエリオットグールドに近い)、しかし阿片を吸いだすとどえらい集中力で(ここの集中描写はスケット団っぽいがまさかそれはあるまい)、戦う前にシミュレーションをしてそのとおりに戦う(シミュレーションの部分はちょっぴり初代ターミネータとかみたいだ)のだが、このあたりの描写もおもしろい。
侏儒の死体はローラっぽく侏儒というモチーフともどもデビッドリンチみたいだ。
というように、観ているとテンポが良いのでそれほどは気にはならないのだが、それでもあそこで観た光景、こちらで観たシーンと、いろいろ映画的な風景が多くて、悪達者な印象が強い。悪くはないのだが。高いところでの死闘、そこで足をすべらせて絞首刑ぶーらぶらとか、八つ裂き光輪が迫ってくるとか、思い出せば出すほど、借り物っぽい。というか、ホームズという題材が借り物だし。つまるところは映画らしい映画なのだろう。
と、思い返してみるとやはり悪い借り物競争ではなく、十分に楽しめる良い作品だった。おもしろかった。
ルワンダ中央銀行総裁日記を読了したが、さていろいろな考えが浮かぶ。
単純化すれば、為替を実体に合わせて一本化することで市場が自由経済によって駆動するようにし(為替差益で暴利を貪る外国人(白人系とインドを含むアジア人系で利権差があるため、白人系ということになる)の利益を縮小させ、商業の自由化を進めて市場に出回る必需品(屋根に使うトタン板なんていうものも含まれる)の価格を押し下げ)、それにより国民の購買意欲を高めることで輸出品(コーヒー)に対する生産意欲を押し上げて外貨を増やしていくことで財政基盤の安定を図って、それが6年間の間に凶作にやられた1年を除けばおおむね成功した、良かったね、ということだった。村のほうへ行くと、年をおって、人々の服装がきれいになり、家が立派(といってもトタン板で屋根が葺けるようになるというレベルの話である)になっていくのが実感できるというのだから、マイナスから出発すればゼロになるだけでも大成功という話ではあるよなと覚めた目で読みながらも感動的だ。
しかもその中には山のような知見やら志やら交渉ごとやらが盛り込まれていて、実録版男子の本懐とでもいうような内容となっている。
?先進国から派遣されてきているといっても、国が国なのでどうしようもないのがたくさん
?アメリカとかドイツは植民地支配のうまみをそれほど味わってきていないので比較的合理的に判断する
?カイバンダと次の大統領のいずれも長期政権の末期には奥さんの親戚による政治専横による腐敗があった→最初、劉邦のときの呂氏による権力支配を類推したけれど、この国の場合はフツ(多数派)有力者に対してツチ族が子女を夫人として提供するという慣習があり……ということやら80年代以降の歴史やらに思いが至ったときに非常な不快感を覚えたのは事実。
?1960年代に40代だった著者が、おれの国ではどんなに貧乏人の子供でもまじめに勉強すれば良い学校に進め、良い職につけるのだ。その人材の自由競争がどれほど国家にとって良いことであるのか云々と独回(別の単語なのだが、読み間違えて覚えていたらしいのでまったく出てこないしわからない)するところがあるのだが、さて機会不平等後の現在ではどうだろうか? とか。(もっとも分母がばかでかければ、ある程度のカテゴライズがされていても十分に自由競争が保証されているという見方もできるような気はするのだが)
?インセンティブという言葉はこの頃は日本語化されていなかったのだな。(外国人顧問がルワンダ人はなまけもののバカばかりだ、というのを聞いて実態を調べに行くと、ルワンダ農民たちは、市場に商品が出回っていない=買いたいものが手に入らない=現金収入に価値がない=コーヒー作ってもしょうがない というまさに経済感覚の固まりであることを「発見」して、ばかはこの事実に気づかない外国人顧問じゃないか、これなら正攻法で市場を回せるぞと悟るところとか、今なら、インセンティブという言葉がうれしそうに出てくるところだ)
?成功させるための演出として情報をリークしてインド商人に商品を山ほど仕入れさせるくだり。それが国際通貨基金の手抜きで手続きが遅れて支払いが先か為替一本化が先か(消費財にとってはルワンダフラン高になる)と時間勝負になって、ここはちょっとしたサスペンスだ。
?というか織田信長の楽市楽座から成長戦略の基本は変わっていないような
?密輸商の存在から、実質為替レートやら市場が求める商品(これを調べないと関税をどうするか決定できない)を調査して、かつ一定の流通規制を緩和することで密輸商を正規な商業ルートとは別に残るように法律を変えるとか
?大虐殺→隣国の謎(元の国とどう関係しているのか良くわからない)集団による侵攻→支配 って、カンプチアをどうしても想像してしまうのだが、さてあまりあほうがのさばっていると次の関東大震災とかで同じようなことにならないといいなぁとか不安になったり(するけど、そういうあほうは実はコピペ虚兵の法で数が多いように見せかけているだけだろうから大丈夫だろう)。
いや、実におもしろい。おもしろかった。これ、ミクロ経済とマクロ経済の両方についての生きた(ある意味、生きたからこそ殺すだけの価値が作られたとも言えるところが戦争はよろしくないということでもあるけど)実例なわけだし、それ以外にも政治(ベルギーの市中銀行の関連企業寄り合い会での演説とか)あり哲学(比較的素直な自由経済万歳哲学)あり、なんとなくおれの職業柄うれしくなるようなところ(ベルギーの鉱山会社にいろいろ世話になるので無理なお願いをしにいったりするところで、これらの会社の持ち主はもともとは鉱山技術者だから云々というあたりとか)があったり、単純に、半世紀前に国家の危機を救うため請われて海を越えた日本男子ここにあり的な物語として読んでも良し(きむら(k)さんとか好きそうだ)、いやぁ、実に読んで良かった。
なんで、こんなにおもしろい本が80年代以降忘れられていたのか(不幸なことに大虐殺のおかげで映画が作られ、それのおかげで本屋の平積みに戻ってきたわけで。ただ中央公論社のことだから絶版にさせたことはなさそうだし、その筋の人たちには読み継がれていたように思える)、世の中には他にもおもしろいものがたくさんあるということだけど、不思議な気はした。
ああ、あとおれがえらく感心したのは、わりと最初のほうで、中央銀行に赴任してみてみると、行員は仕事をしないし、外国人顧問は能無し、役員は経済を知らないし知る気もない、そもそも帳簿が存在しない、なんじゃこりゃ、と暗澹たる気持ちで安宿未満のとりあえず公邸で一人空しくなっているときに、ふと、でもこれだけひどいんだから何をやろうがやればすべてプラスになるんだからこれは楽だぞ、と気づいて安心するところだ。このポジティブシンキングは素晴らしいし、そういう発想をここぞというときにできるってのはかっこいいな、と思った。
なんで中黒が化けらった?
新国立劇場で影のない女の初日。
以前、友人からDVDを借りたときは、退屈で死んでしまったので仕事休んで昼寝して、万全の体勢で向かう。
Die Frau Ohne Schatten [DVD] [Import](Cheryl Studer)
(ショルティが振っているのだから悪いはずはないのだが、どえらく退屈した。理由は今になって考えてみればシュトラウス版「魔笛」という能書きによって妙な方向へ期待していたのが裏切られたからだとか、象徴的な内容なのに英語字幕(したがって80%程度しか意味がとれず、行間に至ってはほぼ読めない)で読解しようとしたから置いて行かれたとか、演出が(新国立劇場のドニ・クリエフ版を見た今となっては)汚らしくて世界を把握できなかったとか、いろいろ)
どえらく感動した。
生まれざる子供が2幕の終盤で歌う(うろ覚え)「早くお外に出してよ、お父さんって呼びたいよ。早くお外に出してよ、お母さんって呼ばせてよ」で、思わず目に涙。この一瞬に、子供が出てきて空気を吸ってそれまで紫色だった皮膚がみるみる赤みを帯びてきて、そしてホエーみたいな声を出して(やっと外に出られたよ)、やあ、やって来たね、待ってたよ、それがどんどこ成長して一緒に手をつないで歩いてといった情景が浮かび上がる、これが子供を持つってことなんだな。不思議なものだ。ホフマンスタールがどうして影があるということを子供を産むということに結び付けたのか不思議ではあるが、自分のもうひとつの姿を持つということなのかね。ただ、3幕最後のばかみたいな4重奏はあれ? もうすぐナチスがやってくるの? そうなの? という気持ちの悪さを感じたけど。ハ長調って気分悪いな。
さすがに1910年代になっているので、魔王カイコバートの動機と赤い鷹の動機を除くと音楽ははっきりとは覚えていないのだが(ここはおもしろいな。どうも音楽を覚えるときは、まず隣あう音の音高差で覚えるのだろう。だから、3度と5度が中心となる調性を持ついわゆるメロディーはすぐに覚えられるのに(すぐに忘れもするけど)、半音階が多用されるとすぐに忘れてしまうらしい。おそらくどのように音楽を覚えるかといったところで絶対音感と相対音感がもっとも分かれるところなのかも知れない)、精妙(2幕の途中のセロだと思うがソロとか、3幕最初のファゴットだと思うけどソロとか、途中のまったく自信がないがヴィオラ(セロかなぁ)のソロとか)かつ荘厳かつエロティック(音楽のエロっぽさというのは本当に不思議なもので、何より音色が重要な気がするのは字面ではなく空気の振動に関連するのかも知れない)で、あーなるほどヴァグナー以後のドイツの楽劇であるなぁと納得しまくる。
とにかく演出がすばらしい(ショルティ版というかフリードリッヒ版比)。この楽劇はやたらめったらと場が転換するのだが、木でできた家屋のシルエット(しかひひっくり返すと室内となる)群と、石を詰め込んだ岩のシルエットではなく塊というか壁というか群を、おしゃれな黒子を動員してその場で入れ替えたりひっくり返したりして、その場にあった情景に変えるのだが、そのスピード感が無限旋律とぴったりと合っている。しかも床のガラスを張った穴(泉のようでもあり影をつくらないための地面でもあり、下界への穴でもあり、窓から差し込む光であり)が効果的、照明も良い。赤い鷹と金色の生命の水に血が浮かび赤くなる、を示す赤い光、突如さす白い明るい光。バラクの妻の理不尽な現実に対する不満(しかし、いまわの際でのなびき方を観て、ああ、これがツンデレというものなのか、と目から鱗が落ちまくるのは、まさにお伽話。っていうか、この楽劇って、なんというか、子供奥さんがいろいろあって大人奥さんになる話なんだな、実に下世話でくだらない気がするけどまあそれがオペラ)の視覚化。
バラクと兄弟は比較的清潔で旧約聖書のような不潔さがあるフリードリッヒ版と異なり、自然な人間の世界。魚を揚げる鍋がアルミ(ステンレスかも)のズン胴というモダンさ。というか揚げるのには使わないだろ。子供を呼んだパーティーのシーンは陽気にして優雅、この演出であればバラクの妻の苛立ちのもつ理不尽さが強調され、それによって物語がきわめて明晰になる。
歌手もよかった。皇后は先日のルツェルンかどこかのテレビでやったトスカを演じていたエミリーマギー。声も顔もきれいで皇后のかわいらしさ(ガゼルになって野山をこないだまで駆け回っていたくらいで、当然のように影を持たない)と、「だが断る」のきっぱりの箇所の演技とか。
バラク夫婦も好きで、特におれはバラクに非常に説得力を感じた。ラルフ・ルーカスとかいう人でバイロイトではグンターとかドンナーということはこれから期待の新人というところなのだろうが、立派なものだった。奥さんのフリーデは新国立のお気に入りなのだろう。これまたあの不快な役をヒステリックにならずに見せてくれる好演。
どう考えても主人に忠実な良き乳母なのに最後は地獄に落とされる不幸な役の人は3頭身にカルカチュアされているが、これまた良い声。ヘンシェルという人。名脇役(メゾだし)なのだろう。
オーケストラは時たま外したりしたような気がするが(しかしもともとが半音階を多用している無調に近い調性音楽なのでスコア通りかも知れないけど)、実に説得力がある良い合奏だった。指揮者も良かったのだろう。
これはDVD化されると良いな。というかもしBDしか出なかったらおれはBDプレイヤーを買うくらいの実に見事なキラーコンテンツ足りえる作品だった。
ちょっと読む本探して適当に文庫買って、ロトってのを読み、えもいわれぬ奇怪な印象を持つ。
地球の静止する日 (創元SF文庫)(ブラッドベリ、スタージョン他)
書き方からは、ラストはもしかすると快哉を叫べる内容のような気もするが、シチュエーションからはそうとも思えないし、すべてが妄想という解釈もできそうだし、それにしても題がいろいろと意味深げ。
で、SD買って読む。Scalaの}が落ちてた。
どえらく気に入ったので、今回は子供を誘って当日券で入る。学生はなんと当日券が半額なのか。
バックステージツアーに当たったので、終演後、オペラハウスの裏側ツアーに参加。
今日、後の方で観ていたいかにもソプラノ歌手の女性に気づいた人? と案内の人が訊く。?
彼女は、猿之助が演出したバイエルンの影のない女で皇后を歌っていたルアナ・デヴォルさんだ。DVDも出てる。
リヒャルト・シュトラウス:歌劇《影のない女》 バイエルン国立歌劇場 1992年 [DVD](サヴァリッシュ(ヴォルフガング))
で、デヴォルさんの息子の奥さんというのが、実は、エミリーマギーさん。というわけで、母子して同じ皇后で来日している(もっとも母のほうは今回は観客だけど)というわけですね、と続く。
たぶん、またお見えになるから、DVDとサインペン持って行ってサインをねだると喜んでサインしてくれるよ。
月山(7個あるけど)になったりいろいろな石の壁、どうも質感があると思ったら、本物の石(ただし軽石で中をくりぬいてある。裏から見ると繰り抜いてある穴がそろっているのでちょっとおもしろい)で、演出家がこだわりの人だから、下から上へ向かって大きさを大きくしていくように詰めたりとかしたんだよ。こいつは1台あたり2tあって、それを黒子が2人で移動するから、えらく大変。オーケストラに合わせて黒子のリハーサルをやったりした、とか。しかも普通は出番が来るまで裏でくつろげるけど、今回は舞台の一部でベンチに座って待機しているわけだから、これが大変なんだよ24人。
というわけで、通常は合唱とかに指揮者を見せるための高い位置に取り付けたモニターだけど、今回は舞台装置のフォーメーションの指示に利用した、とか。
2重化して障害に対処(たとえば指揮者を映すカメラとか、ダウンライトとか)してノンストップ環境を構築とか、システムはシステムだなとか、いろいろおもしろかった。
IE8では(他では試してない)Cache-Controlにno-cacheを指定すると、history.back()で再表示したフォームの入力はリセットされる(というより最初に表示した状態に戻る)。
やりたいことが、GETで確実にサーバから再受信することならmax-age=0を指定すれば良い。
ここまでは良いのだが、AjaxでDOMをいじくりまわした場合はどうなるんだ? と、書いている最中に気づいた。
no-cacheならレスポンスを受信した状態に戻ると思うが、そうでなければsubmit直前に戻れるのかな?
IE6だとどうなるんだかは別に試すしかないだろうなぁ。
オーム社から達人と情熱プログラマのRuby本が送られて来た(ありがとうございます)ので早速ざっと眺めた。
で、ほーと思わず感心したのが次の一節(いや、本当はまず表紙にびっくりしたんだけど。RubyはRubyでも成長する(悪く言えば放っておくと爛熟して落ちてしまうわけだが)Rubyというか、なんというか下のほうに獣がうろうろしていると見るか、これこそ生産の現場であると見るか。しかもパノラマだし)。
プログラミング言語に関する書籍はどれも大体似たような構成になっています。基本型(整数、文字列など)に関する章から始まり、(中略)筆者らは、こうした構成にあきあきしていました。
そこで、筆者らは本書の構成を考えるときに壮大な計画を立てていました(当時は若かった)。トップダウン方式でRubyという言語を解説しようと思ったのです。つまり、いきなりクラスとオブジェクトから入り、構文の詳細は後回しにするやり方です。当時は、それが良い考えのように思えました。Rubyではすべてがオブジェクトですから、まずはオブジェクトから入るというのは筋が通っていました。
少なくとも我々はそう思っていました。
しかし、残念ながら、そのような方法で1つの言語を説明するのは難しいことがわかりました。(中略)
そこで我々は別の壮大な計画を思いつきました(だてに実用主義者(pragmatic)と呼ばれているわけではないのですよ)。(後略)
第2章 Ruby.new P.13
いや、なんかすげぇものを期待したおれが非現実主義者だったということなのだが、どれだけ壮大なことをしでかしてくれるのか期待し過ぎてしまったよ。
次に、Fiberのあたり(12章)を読む。すると
ファイバを使うと、次のようにシンプルなコードになります。
という例が出てくる。これが最初見たときは、苦し紛れにいい加減なことを書いたな、と思う例なのだが、よくよく見てみると結構含蓄があることがわかり、ページをめくると無限リストを扱うための遅延評価用に利用する例が出てきて納得したり。というか、確かにそういう利用方法があるのかと良くわかった。だから継続の代替にならないかというような話も出てくるのだな。
あと、MiniTestとTest::Unitの経緯とか相違とかが出ていて(13章。比較的早い時点でユニットテストについて出てくるところは達人本らしい)、これは結構良い点だと思う。ruby-talkを読めば出てくるのかも知れないが外から眺めていると何が起きていてどうなったのかまったくわからなかったからだ。
プログラミングRuby 1.9 −言語編−(Dave Thomas)
どうでも良いけどサンプルジュークボックスの中の曲のうち、これはすぐにわかるどころか口笛で吹けるが、それ以外はまったく知らないなぁ。
スルー・ザ・パスト・ダークリー(ビッグ・ヒッツVol.2)(紙ジャケット仕様)(ザ・ローリング・ストーンズ)
でもPerlはわかった。妙なものを引っ張り出したものだ。
子供がツタヤで借りてきて、おもしろいから観ろというので一緒に観た。
最初はアニメでいい加減な御伽噺が始まる。森に住む娘(ジゼルという名前だけど、なぜだろう)が歌を唄えば小鳥やリスやウサギや鹿がやってくる。
で、当然のように王子様と結ばれてハッピーエンドとなる。
という情景を鏡で観ていた悪い女王(王子の継母で、継母というのはキーワードになってくるのだが)が、王子の独立→自分の権力喪失というのを避けるため(ということだと思うが)、ジゼルを苦悩と絶望に支配された暗黒の世界に魔法で送り込んでしまう。
というわけで、ニューヨークはタイムズスクェアのマンホールから(ここから実写)ジゼルが飛び出してきて、そこで6歳の娘を育てる離婚歴のある弁護士に拾われる、と物語が進む。
この6歳の娘がぽよぽよしたほっぺたで、まるで忍玉乱太郎のしんべえみたいで、可愛い(シュリンクと擬音つきに思える感じでゴールドカードを出すところが特に良い。まるでサウンドオブミュージックで人差し指に巻いた包帯をジュリーアンドリュースにアピールするところのようだ)。
お城の電飾を見つけて必死にノックするという、一体いつの時代のギャグなのかというようなシーンが次々と続くのだが、なかなかおもしろい。
朝になると歌を唄って獣達を呼び寄せて掃除をする(これはシンデレラだな。最初のあたりは白雪姫)のだが、このシーンはおもしろいなぁ。このシーンがあまりにおもしろいから、レミーのシチューじゃなくてラットタイユの話が生まれたんじゃないか?
で、王子が絵に描いたようなディズニーの名作シリーズの王子なので、当然のように何の役にも立たない抜け作(だが、とても良い人)で、これも後からジゼルを探しにニューヨークにやってくるし、女王の子分(ナサニエルという名前だが、これもなぜ? 神の賜物なんだろう)もやってくる。子分はホテルでテレビの人生相談を観て自己洞察をして生まれ変わるとか、まあいろいろ細かいところでシナリオは練られている。
が、なんといってもセントラルパークという設定だと思うのだが、ジゼルが突如と唄い出して、ストリートミュージシャンと競演し、ダンスパーティの老人会が合わさってきて、ちょっとしたミュージカルになるところが実に愉しい。というか、おれはこういったばかみたいなミュージカルが本当に好きなんだな。このシーンがあったので結局最後までまじめに観る事になった。
最後のディズニーではなくキングコング(と書いたが、なんとなくこないだやったアリスに近いような)の役回りのジャバーウォッキーのようなきれいな龍のシーンとか、助けようとして逆に指を剥がしていくリス(それも2回も)とか、ぐしゃぐしゃあって、想像通りのハッピーエンドとなる。めでたしめでたし。
これは確かに佳作だった。ディズニーはたまにスプラッシュがおれにとっては代表だが、妙に素敵な実写の御伽噺を作る。
Software Designの関数型のやつを書くので、Haskellを復習したわけだ。
Software Design (ソフトウェア デザイン) 2010年 06月号 [雑誌](-)ある程度のサイズ(20行を越えるようなやつ)を書いてみようかと、とりあえず適当な題材を考えて、プログラム・プロムナードの最大長方形の面積でも作ってみようとした。というか、Haskellでの解答が出ているはずなのでHaskellプログラミングのほうをやってみるつもりで、間違えて先頭にあったのでプログラミング・プロムナードのほうをやってしまったのだが。
最初の難関は升目の内容をプログラムに取り込むところで、ここに全体の時間の半分近くを費やすことになるとは思いもよらなかった。今も、変な入力に対してどうすれば良いのかわかっていない。
次が、Arrayの存在を知らなくて、いかにリストでやるかで一度ストールした。結果的に元の問題のn(O^2)と同じような方法になっているのだが、現在の枡がx、yとすると、x-1,yとx,y-1の枡の内容を合成することになる。これが1つだけならば、直前の枡の内容から現在の枡の内容を返す関数とすれば良いと思うのだが、同時に2つ過去の内容を扱うというのがリストだと(僕には)できなかった。おそらくそういう利用方法が可能なモナドがあるのだろうけど、なんとなくやさしい Haskell 入門だけを眺めて作ろうしたのでそんな感じだ。
で、一応できた。現在の枡をx,yとすると、x-1,yとx,y-1の枡で作れる長方形から、xまたはyが一致しているか、または両方の枡に同一の始点が存在する長方形を抜き出し、現在の枡までの長方形を現在の枡に格納するという方法を取った。Arrayのインデックスにタプルが使えることがわかったので、(x,y)をインデックスとして、枡の始点を(1,1)としている。-1するときに考えなくても良いように、Arrayの始点は(0,0)に置いている。
こんな感じ。
import IO import Array rList :: String -> IO [Int] rList = readIO rLine :: IO [Int] rLine = do lis <- getLine rList $ "[" ++ lis ++ "]" data Area = Area Int Int Int Int deriving (Eq, Show) showArea :: [Area] -> IO () showArea [] = putStrLn "" showArea (x:xs) = do putStrLn $ show x showArea xs areaX :: Area -> Int areaX (Area x _ _ _) = x areaY :: Area -> Int areaY (Area _ y _ _) = y areaSize :: Area -> Int areaSize (Area _ _ w h) = w * h samePos :: Int -> Int -> Area -> Bool samePos x y a = x == (areaX a) && y == (areaY a) checkArea :: Int -> Int -> [Area] -> [Area] checkArea _ _ [] = [] checkArea x y (a:as) = case a of (Area sx sy _ _)|sx == x || sy == y -> a:(checkArea x y as) |otherwise -> (filter (samePos sx sy) as) ++ (checkArea x y as) calcArea :: Int -> Int -> [Area] -> [Area] calcArea _ _ [] = [] calcArea x y (a:as) = Area sx sy w h : calcArea x y as where sx = areaX a sy = areaY a w = x - sx + 1 h = y - sy + 1 accumArea :: Point -> Array (Int, Int) [Area] -> Array (Int, Int) [Area] accumArea p a = if validPoint p then a // [((x, y), Area x y 1 1 : calcArea x y (checkArea x y ((a ! (x - 1, y)) ++ (a ! (x, y - 1)))))] else a where x = pointX p y = pointY p accumAreas :: [Point] -> Array (Int, Int) [Area] -> Array (Int, Int) [Area] accumAreas [] a = a accumAreas (p:ps) a = accumAreas ps (accumArea p a) cmpArea :: Area -> [Area] -> Area cmpArea a0 [] = a0 cmpArea a0 (a:as) = if (areaSize a0) >= (areaSize a) then cmpArea a0 as else cmpArea a as maxArea :: [Area] -> Area maxArea [] = Area 0 0 0 0 maxArea (a:[]) = a maxArea (a:as) = cmpArea a as validArea :: Area -> Bool validArea (Area _ _ w _) = w > 0 maxAreas :: Array (Int, Int) [Area] -> [Area] maxAreas a = [maxArea (filter validArea [ maxArea es | es <- (elems a)])] data Point = Point Int Int Int deriving (Show) pointX :: Point -> Int pointX (Point x _ _) = x pointY :: Point -> Int pointY (Point _ y _) = y validPoint :: Point -> Bool validPoint (Point _ _ v) = v == 1 mkpnt :: [Int] -> [Int] -> [Int] -> [Point] mkpnt [] _ _ = [] mkpnt _ [] _ = [] mkpnt _ _ [] = [] mkpnt (x:xs) (y:ys) (v:vs) = Point x y v : (mkpnt xs ys vs) rsqr :: Int -> Int -> IO [Point] rsqr n m = if n > m then return [] else do putStrLn $ "input line " ++ (show n) ++ "..." lis <- rLine llis <- rsqr (succ n) m return $ (mkpnt [1..] (repeat n) lis) ++ llis rSquare :: Int -> IO [Point] rSquare 0 = return [] rSquare n = rsqr 1 n main :: IO () main = do let size = 5 let a = array ((0, 0), (size,size)) [((x, y), [])| x <- [0..size], y <- [0..size]] lis <- rSquare size showArea (maxAreas $ accumAreas lis a)
一応、考えた通りに動作する。同じ大きさの長方形が複数存在するときは、始点が一番小さいものを選ぶようにしている。複数選ぶようにもできるが、とりあえずそういう仕様とした。
*Main> main input line 1... 0,0,1,1,0 input line 2... 0,1,1,1,0 input line 3... 0,1,1,0,1 input line 4... 0,1,1,1,0 input line 5... 0,0,1,1,0 Area 2 2 2 3 ← (2,2)から横2、縦3の6枡が最大 *Main> main input line 1... 0,0,0,1,1 input line 2... 0,1,1,0,1 input line 3... 0,0,1,1,0 input line 4... 0,0,1,1,0 input line 5... 1,1,1,1,1 Area 3 3 2 3 ← (3,3)から横2、縦3の6枡が最大
が、できたプログラムを見ると、いろいろと気に食わない。入力時の情報をPointというデータとし、実際の長方形はAreaというデータにしているが、こんなものは最初からAreaとしておけば良いというのは、完成してすぐに気づいた(長方形をどう残すかの試行錯誤の過程でAreaというデータが生まれたからだ)。
もっと気に食わないのは、現在の升目の位置をほぼすべての関数の第1、第2引数にしているところで、考えてみれば、現在のPointを与えればそこに入っているし、最初の気に食わない点と合わせれば最初から現在の升目に必ずある幅1、高さ1のAreaを与えれば良いはずだ。
で、以下のように修正した。(後、このようにすれば、最初から無効な升目は処理しなくても済むというのも考えた)
import IO import Array import Debug.Trace rList :: String -> IO [Int] rList = readIO rLine :: IO [Int] rLine = do lis <- getLine rList $ "[" ++ lis ++ "]" data Area = Area Int Int Int Int deriving (Eq, Show) showArea :: [Area] -> IO () showArea [] = putStrLn "" showArea (x:xs) = do putStrLn $ show x showArea xs areaX :: Area -> Int areaX (Area x _ _ _) = x areaY :: Area -> Int areaY (Area _ y _ _) = y areaSize :: Area -> Int areaSize (Area _ _ w h) = w * h samePos :: Area -> Area -> Bool samePos (Area x0 y0 _ _) (Area x1 y1 _ _) = x0 == x1 && y0 == y1 checkArea :: Area -> [Area] -> [Area] checkArea _ [] = [] checkArea a0 (ar:as) = if samePos a0 ar then ar:(checkArea a0 as) else (filter (samePos ar) as) ++ (checkArea a0 as) calcArea :: Area -> [Area] -> [Area] calcArea _ [] = [] calcArea a0 (ar:as) = Area sx sy w h : calcArea a0 as where sx = areaX ar sy = areaY ar w = areaX a0 - sx + 1 h = areaY a0 - sy + 1 accumArea :: Area -> Array (Int, Int) [Area] -> Array (Int, Int) [Area] accumArea ar a = a // [((x, y), ar : calcArea ar (checkArea ar ((a ! (x - 1, y)) ++ (a ! (x, y - 1)))))] where x = areaX ar y = areaY ar accumAreas :: [Area] -> Array (Int, Int) [Area] -> Array (Int, Int) [Area] accumAreas [] a = a accumAreas (ar:as) a = accumAreas as (accumArea ar a) --accumAreas (ar:as) a = accumAreas (trace (show as) as) (accumArea (trace (show ar) ar) a) compArea :: Area -> [Area] -> Area compArea a0 [] = a0 compArea a0 (a:as) = if (areaSize a0) >= (areaSize a) then compArea a0 as else compArea a as maxArea :: [Area] -> Area maxArea [] = Area 0 0 0 0 maxArea (ar:[]) = ar maxArea (ar:as) = compArea ar as maxAreas :: Array (Int, Int) [Area] -> [Area] maxAreas a = [maxArea [ maxArea es | es <- (elems a)]] makeArea :: [Int] -> [Int] -> [Int] -> [Area] makeArea [] _ _ = [] makeArea _ [] _ = [] makeArea _ _ [] = [] makeArea (_:xs) (_:ys) (0:vs) = makeArea xs ys vs makeArea (x:xs) (y:ys) (_:vs) = Area x y 1 1 : makeArea xs ys vs readSquare :: Int -> IO [Area] readSquare 0 = return [] readSquare size = rsqr 1 size where rsqr :: Int -> Int -> IO [Area] rsqr n m = if n > m then return [] else do putStrLn $ "input line " ++ (show n) ++ "..." lis <- rLine llis <- rsqr (succ n) m return $ (makeArea [1..] (repeat n) lis) ++ llis setArea :: [Area] -> Array (Int, Int) [Area] -> Array (Int, Int) [Area] setArea [] a = a setArea (ar:as) a = setArea as (a // [((areaX ar, areaY ar), [ar])]) main :: IO () main = do let size = 5 let a = array ((0, 0), (size,size)) [((x, y), [])| x <- [0..size], y <- [0..size]] lis <- readSquare size showArea (maxAreas $ accumAreas lis (setArea lis a))
自分としては、最初のプログラムの気に食わない点を直しただけで、それ以外を変えたつもりは無いのだが、こちらは期待した通りには動かない。
*Main> main input line 1... 0,0,1,1,1 input line 2... 0,0,1,1,1 input line 3... 0,0,1,1,0 input line 4... 0,0,0,0,0 input line 5... 0,0,0,1,1 Area 3 1 1 1 ← Area 3 1 2 3 となって欲しい
というか、最初にArrayを知らなくてリストで回そうとしたときと同じ状態である。つまり、意図した順番に処理がされていないということだ(と思うけど、もちろんそれ以外に大きな間違いがある可能性は高い)。
いずれにしても、こういうときには何がどうなっているのかprintfしてみたいなぁと困って調べたら、池上さんのHaskell printfデバッグのページが見つかったので、上のリストではコメントアウトしているが、入れてみたら案の定だ。比べてみると同じ箇所で最初のプログラムとは逆順にprintfされている。
ここで気づくのだが、「意図した順番」というのが出てきた時点で、作り方を間違えているのではないかということだ。最初のプログラムが期待通りに動くのは偶然なのではないか(それはそうだと思う。というのは、2番目のプログラムと同じつもりなのだから)?
というわけで、なかなか難しいものであるなぁと思った。それにしても、どこが間違っているんだろう?
nobsunが解答例を作ってくれたので眺めてみる(入力するところは後から付けた)。
import IO type Rect = (Int,Int) type Rects = [Rect] maxRectArea :: [[Int]] -> Int maxRectArea = maximum . map (uncurry (*)) . concatMap concat . rects rects :: [[Int]] -> [[Rects]] rects = tail . scanl (zipWith v) (repeat []) . map (scanl1 h) h :: Int -> Int -> Int _ `h` 0 = 0 n `h` _ = n+1 v :: Rects -> Int -> Rects _ `v` 0 = [] [] `v` n = [(n,1)] ps `v` n = case span ((n <=) . fst) ps of ([],_) -> (n,1) : map yinc ps (qs,rs) -> (n,1+snd (last qs)) : map yinc rs yinc :: (Int,Int) -> (Int,Int) yinc (x,y) = (x,y+1) rLine :: IO [Int] rLine = do lis <- getLine readIO $ "[" ++ lis ++ "]" readLines :: Int -> IO [[Int]] readLines 0 = return [] readLines n = do lis <- readLines (n - 1) putStrLn $ "input line " ++ (show n) ++ "..." llis <- rLine return $ llis:lis main :: IO () main = do let size = 5 lns <- readLines size putStrLn . show $ maxRectArea lns
当然のように、関数合成の.とかタプルを引数に取れるようにカリー化関数を変えるuncurryとか出て来るが、まあ読める。
しかし垂直の加算の箇所(vではなく、tail . sncal (zipWith v)のあたり)は難しいな。多分、しばらくはこういう書き方もできなさそうだ。
これは面白い感覚だ。
それでなんで難しいと感じるのか、考えてみた。どうもzipWithが問題らしい。引数が3個でかつ関数が引数に入ると途端に難しく感じているようだ。
人によって学習方法はいろいろある。どうしていろいろになるかと言えば、個人的な特性か、または習慣として身についた学習方法のどちらかになると思う。
たとえば語学の天才ってのが歴史の本に出てくることがある。最初にどこかの外国語を覚えようと考えると、1週間くらい、その言語の辞書を頭から丸暗記して、1週間後には完全な読み書きができるようになる。
普通の人はそうはいかないから、最初は単純な文法と少ない語彙で表現を入出力することから始めて、徐々に構文と語彙を増やしていく。
この場合、記憶力(単に覚えるだけではなく例文とかを覚えるのだろうと想像する)の特性が、語学の天才の学習方法を普通の人と分けているところだろう。
おれは記憶力がほとんどないから(ここでは短期的にそれぞれ独立した多数のことを覚える能力のこと)、概念を最初に掴んでそれを利用して構造を作り、あとからその構造の部分部分に記憶すべきことを当てはめていくという学習方法を取ることが多い。記憶は関連があるとしやすいというのは、おそらく普遍的真実だから「いい国作ろう鎌倉幕府」とかやって数字を覚えるのだ。
たとえば中学とか高校の数学では、公理と本当に基本的な定理しか覚えられないから、それだけを使って証明する。必要性として速度的にその方法では間に合わなくなったときになって、便利な(応用的な)定理をその長い証明の部分部分に対して当てはめていくことで(もちろん順序としては逆で、この部分はおそらく定理があるはずである、と考えてから定理集から適合するものを見つけて来ることになる)、記憶していくことができる。
すると、おれがリファクタリングが好きなことに説明がつく。
最初はまず冗長なものを作り、しかしこのような操作をする便利なものがあるはずだ、と調べて見つけてそれを当てはめるという順番だ。
おそらくその過程で記憶することができるのだ。考えてみればRubyのmapだのinjectだのもそういった過程を踏んで使えるようになったのであった。
おれの学習過程というのは、そのような段階を踏むことが多いので、そこからマニュアル教育とか車輪の再発明先生とかに対して、非常な嫌悪感が生じるようだ。というのは、それでは学習できないからだな。
もし、おれのそのような学習過程がそれなりの普遍性を持つのであれば、「初心者ですけど難解です」君に向学心がなければ、そりゃ確かに基本語彙からちょっとでも外れたものが出てくれば、それは難解だろうし、その時点の基本語彙より組み合わせが多少複雑になればなおさらで、しかも向学心がないのだから未来永劫どうやっても難解だろう。
ということに気づけたというか思い出したのは、ある点でよかった。やはり時々は初心者に返って初心を思い出すのは良いことだな。
子供がタワーレコードに行くとかいうのでついてった。
で、うろうろしてたら、ロッカーズが表に並んでいるので惹き付けられる。
そういや、はるか20年以上前に観たのだが、今でもときどき、あの世のピータートッシュが唄う声が聴こえることがある。次々とラスタが集まって一緒に盗み返しに行くところとか。
で、つい買ってしまった。で、観ている。
Legend of Rockers ロッカーズ25TH [DVD](セオドロス・バファルコス)
バーニングスピアが、オートバイ盗まれたりして落ち込みまくったホースマウスを慰めるために、やたらと暗い歌を暗い海岸で歌うシーンとか忘れてたけどあっというまに思い出した、ジャノデ、ジャノデ。
ジュニアマービンの警官と泥棒の歌とか(クラッシュのカバーのほうが好きだけど)、ダーティーハリー(本当の名前は相変わらずわからん)がDJブースを乗っ取って、やたらとエコーを利かせて(ダブだよな)DJはダーティーハリーに任せろ、最高にご機嫌にしてやるぜ、とか喋ってみたりとか。
それにしても、映像がばかのようにクリアで、あれこんなだったっけ? とちょっと驚く。
それにしても、あの曲がないなぁとか、チャプターメニューをいじっていて、あの曲って確か「ハーダーゼイカーム……」っていうか違う映画だよ(だいたいラスタの導師が悪い役だったり)、と気づいたり。
で、いろいろ聴いていてサードワールドのサッタアマサガナの雰囲気で、あーサードワールドいたなぁ(過去形だけど)とか、彼等のジャケットの雰囲気と共に思い出したり。
96 DEGREES IN THE SHADE(Chicago Pro Musica)
それにしても、いかしているなぁ。ルーツだからな。
もっとも、この映画が冗談ではないということは、しばらくして、ピータートッシュが金目当てのチンピラに撃ち殺されたことで思い知らされるわけだが。
(だから、ジャマイカでトップ(ってことは世界でトップ、レゲエに関しては)のドラマーが、金がなくてレコードの宅配で稼ごうとするのとかも、まあ普通にありそうな気がしてくるわけだ)
追記:どうも最近観たようなと思ったらこれだらすた。
iPadを使っていて、良いことに気付いた。
おれは辞書を良く引くが、今や紙のやつは苦痛だ。ならばiPadで引けばいいじゃん。
で、ちょっとAppleStoreを覗くと大辞林が売ってる。最高だ。
でも良くみるとiPhone用だ。
でも調べたらiPhone用は実行できるし拡大表示もできるらしい。ならば無問題。
で、購入。ダウンロード中は待ち遠しいね。で、実行。
確かにフォントはきれいだが、ち、小せい……。iPhone用ってこういうことになるのか。でも右下に拡大ボタンがあるし。
で、拡大。
あっという間にギザギザハートの子守唄。ベクターフォントじゃないのか!?
これを使うなら小さいほうがまだましだ。
というわけで、とっても悲しくなってしまった。
紙は重いし字が小さいのが問題だよなぁ。
ジェズイットを見習え |
Before...
_ arton [日本とドイツですか……。そこにイタリアが来ると、かっての枢軸国だけどどうしてその組み合わせなんでしょうね。]
_ ishisaka [身も蓋もなく売り上げと、英語が不得意なのがそれだけいると言うことじゃないでしょうか。]
_ arton [なるほど、確かに売り上げはありそうな気がしますね。]