著作一覧 |
子供のころ、ドライブすると周りの車のナンバープレートを使って10を作る遊びを親とやった(やらされたのかも)。同じようなことをここ数年は自分が子供とやっている。
20080601だと、20/(0+8+0-6)+0*1で10ができる。この場合の20のように桁数を変えるのが結構ミソだったりする。最近は負数にできるのだから逆数もありにしようとか、段々できる範囲が大きくなってきている。
やり方が複数通りある場合は、2*(0+0+8)+0-6+0*1のようにシンプル(除算や複数桁はシンプルではないと感じる)なものが良い解となる。
あるミッションスクールの創立年の話になって、1860か1870のどちらかだと言い張る。
徳川政権ではあり得ないから1860は却下して、ハイフツ(携帯から入力するのは無理だ:追記:廃仏毀釈と書きたかったのだったがフを濁らせてなかったのが原因かな?)が1870年代終わりだと思うから(間違い。初め。日本のタリバン―天皇主義者による石仏破壊事件など)1870も否定した。
でも実際は1870だった。例えばフェリス。
キリシタン(漢字で書きたい)禁制の解除は1874のはずだ(確認してないので誤差はあり得る)。
なぜ禁制下で建学可能なんだ?
そこで考える。ミッションスクールが宣教師のための学校ならば、日本人用ではないのであり得るかも知れない。
ミッションがミショナリの意味のミッションならば、それで合っているだろう。
そこで疑問はミッションスクールのミッションとは何か?
TopCoderのJWSアプリケーションで遊んでいるというか遊ばれているというか遊べていないというかなのだが、OSXの世界とコピー&ペーストができなくて閉口する。
Command-v/cに反応しないし、マウスクリックにコンテキストメニューをアサインしているわけでもないし、メニューバーも実装されていない。だから、何かの理由からコピー&ペーストを実装していないのかと思っていた。
が、途中で放置して別のことしていて戻ってみたら、セッションが切れたからローカルへコピー&ペーストしてやり直せというようなメッセージを出しているのに気づいた。コピー&ペーストしろと書いてあるくらいだから実装されているのだろう。
でも、Command-cは効かないし、マウスをどうしようが何も出ない(選択はできる)。ふと、JavaのWORA特性に思い当たる。Ctrl-cを押してみる。コピーできた。
疑問点:jTextなんちゃらがOSがどうだろうがCtrl-Cでコピーを実装しているのか、それともアプリケーションを作った人がCtrl-Cにアサインしたのか、それともOSXのSWingの実装がCtrl-Cをコピーに割り当てたのか、どのレイヤーで、キーボードショートカットが動作しているのだろうか。
TopCoderの最初の練習問題(チュートリアルではなくアリーナのほうのやつ)のアドバンスがどうやってもできずにえらく悩む。
1から与えられた数までの集合(たとえば、与えられた数が4なら、1,2,3,4)から、与えられた桁数を埋める数字を作る(たとえば与えられた数が3なら、123とか431とか)。
この時、作られた数字の並びが、左側に対して等しいか大きくなるような数は何通りできるか? という問題。たとえば、上の集合と桁であれば、123はOK、111もOK。でも、121はNG。
これは再帰を使えばすぐに解ける。といってもすぐにできたわけではないのが悲しいところであるが。
#最後のパラメータはデバッグ用 def count_r(start, range, depth, a) if depth == 0 p a if $DEBUG return 1 end r = 0 start.upto(range) do |is| a.push is r += count_r(is, range, depth - 1, a) a.pop end r end puts "4, 3(r)=" + count_r(1, 4, 3, []).to_s puts "4, 4(r)=" + count_r(1, 4, 4, []).to_s puts "4, 5(r)=" + count_r(1, 4, 5, []).to_s puts "93, 8(r)=" + count_r(1, 93, 8, []).to_s
最初の3つはすぐに求まる。
4, 3(r)=20 4, 4(r)=35 4, 5(r)=56
だが、4つ目(実際の問題のINDIGOのはず)は無限とも思われる時間がかかっても終わらない。もちろんYARVじゃなくてJavaで書いても同じだ。
ということは、もっと賢い(というか、全件を求めているのだから単に力任せで少しも賢くはないから、「もっと」というのは変だな)アルゴリズムがあるはずだ。
が、これがわからない。頭の中には左から右に枝分かれする絵があるのだが、再帰を使ってすべての枝をたどる方法ではなく、それを計算で求める方法がわからない。
で、考えていた。ほぼ1日。正味でも数時間かも。
さっきわかった。1から4の場合であれば
[1, 1, 1, 1] [4, 3, 2, 1] [10, 6, 3, 1] [20, 10, 4, 1]
ということか(数字自体は見えていたのだが、配列に入れることで求め方がわかったということ)。その要素から右端までの要素の総和が次ぎの要素となる。
それにしても、こういうの(あるいはもっと賢い方法)をさっと考えつく人がうじゃうじゃいるわけだから、世の中は広い。
いや、だから、今の、ステイブルなバージョンについて書くと(言葉は違うが)最初に書いてあるじゃん。あと、JRubyはスコープ外。
>特集1 が Java との比較ってのもすごいな
これは同意。正直、JRubyの記事が最初に来て、それに対しての補完(じゃないな。カウンターでもないし、蛇足と言う気はないし)になるのかと思ってた。
>Lisp 涙目
なぜ?
まともにものを考え、他人の考えを尊重すれば、(社会的な分野については)断言はできないし、結局はみんながどう考えるかがすべてなので、相手に考えることを勧めるために、疑問調にならざるを得ない。
問題は、それが正しい戦略なのかどうかだ。と時々考える。
ここから。
順に読んでいっていきなり不思議に思う。っていうか、大域脱出は使わないのだろうか?
思い出してみると、Cでは一回しか使ったことないけど(フレームワークが呼び出したアプリケーションが強制退出するために呼び出す関数としてlongjumpする関数を提供した。もちろん、あらかじめフレームワーク側でsetjumpしておく)。
空whileだのの理屈でいくと、こんな感じだろうか?
ErrorType e = ERROR_NONE; // なんかのenum値 while (0) { // 6/7追記: これは間違い。doでなければいきなりスキップされる if (foo() != SUCCESS) { e = ERROR_FOO; break; } ... } switch (e) { case ERROR_FOO: throw new FooError(); case ... } return SUCCESS;
スタックトレース情報が無駄になるなぁと思う。
というか、eという状態変数は無駄だと思う。
というか(前提とした場合)、enumと対応する例外クラスというのはバカ丸出し(なので、さすがにこういうのはあり得ないか)。
と考えると、スローはどこからでもOKなのだろう。であれば、returnだってどこからでもOKじゃん。
でも、OKじゃないからwhile使ったりしているという前提となるのだから、……どうやるんだ?
で、最後までいくとまさに最初にガンガン例外を投げる話に行きつく。どうみてもwhileが意味不明だ。
意味不明なものというのは、たいていの場合、文化だ。たとえば、ちょんまげとか辮髪とか。文化外から見ればただのバカ丸出しだが、本人たちにとっては存在証明だったり。
コードは文化なのだなぁ、とつくづくと思う。
ならば、それはそれで良いことなのだろう。
世界中の誰もが魅了されるようなWebアプリケーションを開発し、公開する。
しかも、仕様から、細かいリクエストが山ほど来るように作る。日記とかBlogみたいに、ある程度ローカルで書きこんでから投げるようなのではなく、ひとことふたこと書いてすぐサブミットみたいなやつ。
ここまでできたら、終わったも同然だ。というか、ここまでが一番のハードル。
あとは、人気が出まくったところで、これはStrutsを使って開発したことを明言する。もしかしたら規約の表示画面だけかも知れないけど、使っていることについては嘘でないのでOK。突っ込まれたら、「一部は他の技術も取り入れている」とか言えばOK。まったくもって嘘ではないし。
そのうち負荷に耐えきれなくなる。そうしたら、自然とシステムが劣化するに任せる。時々、処理を変えてみたり。なにか中の人がいろいろ頑張っています感が醸せればOK。
そのうちに、実際にはそのシステムがどのように構築されたかは中の人以外は、知りもしないけど、なんとなくStrutsダメダメという雰囲気が利用者の間で広まる。
今ここ。
昨日書いたリストを眺めていて、やっと「トリッキーなコード」という言葉の意味を理解したように思えた。
トリッキーという言葉が意味することは「奇をてらったさま。巧妙なさま。「―な仕組み」」なので、奇をてらってはいるけれど、考え通りに動く=巧妙なコードという意味だろう。
女子高校生風に考える(良くわからないことにしておくが、こういう場合、JKと書くものらしい)と、途中のコードをスキップして制御を移動させる場合はgotoというステートメントを使うものだ。Cの言語仕様ではそうなっている。
したがって、常識的で、まったく奇のてらいがない、普通のコードであれば
int foo() { int result = ERROR_EXIT; if (foobar() != SUCCESS) goto error_return; if (barbaz() != SUCCESS) goto error_return; ... ... result = SUCCESS; error_return: return result; }
と書くところだ。
これは、しかし、do……whileを使った(修正済み:コメント欄参照)トリッキーなコードでも記述できる。
int foo() { int result = ERROR_EXIT; do { if (foobar() != SUCCESS) break; if (barbaz() != SUCCESS) break; ... result = SUCCESS; } while (0); return result; }
これがトリッキーなのは、本来、「偽になるまでループ」するために利用するwhileを、breakによって節から退出できることを悪用してgotoに代替させている点にある。そもそも論では、あらかじめ条件式に偽を設定するところからしてトリッキーだ。
僕が良く耳にする女子高校生なコーディング規約は、「トリッキーなコードは禁止」というものだ。ふむ。
どうやら、トリッキーなコードを許容できるくらいに、gotoを使うことに無意味(この場合に意味ありますか?)な拒否反応があるのだろう。
おもしろい。
そこで考えるのだが、ダイクストラの時代であればともかく、while、do……while、さらにはforといった至極便利極まりないステートメントを持つ言語を利用していて、あえてgotoを使う人がいるのだろうか?
昔の人はそうだったかも知れない。はじめてwhileだのdoだのを目にした人が、「かーっ! こんなまだるっこしいもの使ってられるかってんだ」とgotoを使うというのは、まあ、理解できなくはない。
しかしだよ、今この時点で、
for (int i = 0; i < 10; i++) { if (a) { continue; } else if (b) { break; } ... }
と書かずに、わざわざわざと、
int i = 0; start_loop: if (i >= 10) goto exit_loop; if (a) { i++; goto start_loop; } else if (b) { goto exit_loop; } .... i++; goto start_loop; exit_loop: ...
なんて書くかね? 本気でそう信じているのか?
そう信じているなら、イワシの頭賞を進呈する。どうぞご自由に。
しかし、女子高校生風に考えれば、そんな面倒なことをする人間はいない。
であれば、goto禁止というのは取り下げたほうが良い。
そうすれば、「このgotoというステートメントは何の役に立つんだ?」となるだろう。
そこで、「エラーになったら、エラーリターン用のラベルへ分岐するために利用したり、深い制御構造の中から脱出するために利用するんだよ」で済むではないか。
10年ドロドロおじさんの悪口を言うのも結構だが、ドロドロおじさんと同じレベルで「禁止」とか無定見に言ってないか、考えてみても良いと思う。
ペドロコスタのコロッサスユースを観に、イメージフォーラム。
世の中には、真に才能を持つ人間が存在するという事実に、打ちのめされると同時に、深く楽しむ。
映画館も気を利かせて、始まるまでの幕間の音楽はヤングマーブルジャイアンツ。
Colossal Youth (Dlx)(Young Marble Giants)
例によって大して好きでもない、オルガンのペナペナとリズムボックスのドンカマ音とへたな歌。でもまあ、一種のドアーズと言えなくもないかなぁとか一瞬感じたりした。なんで、コロッサルユース(どでかな若さ?)と不思議に思っていたのだが、どうも、ペドロコスタ自身が、YMGを意識して英語タイトルを付けたらしい(オリジナルとフランス題は、前進する若さみたいな感じ)。
薄暗い画面奥に半ば壊れた外壁の建物。代官山の同潤会アパートをちょっと思わせる。ディープフォーカス。いきなり窓からでっかな家具が落ちる。それまでの静寂が破れる。次々に家具が落ちる。強烈な破壊音。いやな音だ。
黒人女性。手にナイフ。海で泳ぐ話を話す。鮫がいると男たちに言われる。いつまでも泳いでいたい。岩の上に置いた子供を心配する。探している。岩から落ちそうになる。
まくしたてて去る。
すべての構図とすべての光と影、すべての衣装、すべてのセリフが完璧に構築された2時間30分。バンダの部屋にはまだ残っていた退屈する一瞬が完全に無くなっている(もっとも、観客つまりおれの体調や精神状態にも依存する)。
撮影は、一部を除き、すべて大して広くない部屋の中。
スラムからの立ち退き先の中層アパートの白い部屋。美術館。バンダのダブルベッド、妹の薄暗い部屋、レントのテーブル、名前忘れた末息子と食事する食堂のテーブル。ほとんどのシーンでの独白は腰のあたりから仰角による撮影。遠近感を強調するために、台形の映像。異様な映画だ。明るいか、暗いかのどちらか。清潔か汚いかのどちらか。惨めか神々しいかのどちらか。
それに対して、美術館の庭、最後に一瞬出る川。中層アパートの中庭でヴァンダを呼ぶシーンではあえて近寄っているため、広さはまったく感じさせない。
現在の服である白いワイシャツと黒いスーツ。ぴかぴかのワイシャツなのだが、それは行く場所によって異なる。美術館や、鍵を持った市の職員とのシーンではシミだらけの不潔なおっさんだが、ヴァンダや(名前忘れたが足の異常を抱えた物乞い)と一緒のシーンでは未来のように光る。
レントと一緒のときの作業員風の服。頭の包帯。包帯が巻かれるのは、美術館の警備人に、美術館の工事中に落下したことが語られた後となる。
完全な映画で示されているのは、ある移民の物語のメタデータだけだ。
たとえば、奥さんに刺し殺された亡霊の家族巡りの物語と読むことすら可能だ。過去と未来、あったこととなかったこと、ありそうなことが、ごちゃまぜに語られる。レントに教え込む手紙の文句はどんどん長く変容していく。
バンダの部屋の不健康だがぞっとする美しさを見せる女性と、同じ女性とは思えない、年月。煙草と咳とたえまないお喋りだけが共通。ヘロイン中毒は治療中だとわかる。出産の話。治療薬が盗難されてからは、余分に配布されるようになったこと。
存在しない子供のために一番広い部屋を手に入れる。しかし家具を失ったので床で寝ている。市の職員の電気、ガス、家賃に関する冷たい宣告。最初の部屋での壁についた汚れを拭うシーン。すべてが的確。
どうして、ペドロコスタは特別なのだろうか? ペドロコスタと比較するとゴダールでさえ夾雑物が多すぎて退屈だ。
おそらく、映画とは何かについて、さらに深化させることに成功したからだろう。時代が後になるほうが、高速道路が延びているというだけのことかも知れない。しかし、それだけではない。というのは、これだけの映画は、他にはデプレシャンくらいしか考えつかないからだ(でも、まだまだ物語で楽しませてくれる)。
物語をいっさい語らずに、純粋にその物語のメタデータ(たとえば会話、たとえば独白、たとえば動き、たとえば光、たとえば影、たとえば場所、たとえば建物、たとえば音響)だけを呈示するというのは、どう考えても難しそうだ。それだけのロケーションと役者(しかも役者ではない)がいれば、物語を語りたくなるのではないだろうか。でも、それがない。すべてがばらばらで、それをつなげるのは、観客の作業となる。完全な素材が提供されているのだ。それがおもしろくないわけがない。
だからおもしろいのだな。
だから、おれはペドロ・コスタを特別に特別な映画作家だと感じるらしい。
コロッサル・ユース [DVD]
コロッサルユースの中で、思い出してみると、暗いのはほとんどが過去で、明るいのはほとんどが現在であった。夜のシーンで始まる。
暗い過去では、故郷に残る妻へのラブレター、独立を祝う(たぶん)革命歌のレコードと歌。高揚感と針飛び。怪我をしてから変調するラブレターの文言。シルク。本来であれば若いのだが、同じ人間が演じているので少しも若くない。そこにおそらく、タイトルのユースがある。
しかし、直接床に寝ていて物乞いに起こされるシーンは現在だが、暗かった。末娘の部屋のシーンも暗い。しかし窓は光る。ヴァンダの部屋は明るい。美術館は白い。末息子(たぶん)と食事をするレストランは明るかったような記憶がある。食事を取らずに喋る。刺された手を見せる。
しかし、2軒目のアパートの入り口で待っているシーンは明るくない。部屋は明るい。1軒目で会ったときより、役人は力強くなり、主人公は薄汚れている。
物乞いが入院している病室。窓は光る。手前に女が椅子に腰かけていて、その手前のベッド。その手前に主人公。女は喋らず、ただ居るだけ。
最後のヴァンダの部屋。窓は光る。ダブルベッドに寝そべる。手前の隙間に子供。顔だけがベッドより少し高い位置。左(テレビの方向)を向いている。何か口に出している。
突然暗くなっておしまい。
ちょっとアプレットを作ってみたくなったのだが、そのものずばりのプロジェクトテンプレートが無かったので、とりあえず以下のようにやってみた。
1.新規プロジェクトで、「Javaクラスライブラリ」を選択
2. 新規ファイルで、「Swing GUIフォーム」からJAppletフォームを選択
しかし、このプロジェクトで「実行」などのボタンを押すと、主クラスが登録されていないというエラーとなる。
以下の方法でデバッグ実行などができた
1.プロジェクトビューのソースパッケージから、アプレットのソース(〜.java)を選択する。右クリックして「ファイルを実行」を選択するとAppletViewerが動いてアプレットを実行する。「"〜.java"をデバッグ」を選択すると、NetBeansのものらしいアプレットビューアが起動し、デバッグ(ステップ実行や設定済みブレークポイントでの停止など)が可能となる。
結局、MacBookとかMacBook Proについてはそのままなのかな?
自分の間違いを他人のせいにするわけだが、javax.sound.sampled.SourceDataLineのある種の実装は誉められたものではない。
openしてwriteすると0バイトの書き込みに成功する。
その成功になんの意味があるんだ?
勝手に暗黙にstart呼ぶか、さもなければIllegalStateExceptionをスローすべきではないだろうか。
プログラミング言語Cを利用してプログラミングを学習するということはどういうことだろうか?
一見すると「英語を利用して小説の書き方を学習します」という言い方に通じるものがありそうに思う。英語で小説の書き方を学習して、では日本語で小説を書けるだろうか? 想像してみると、主人公の造形、舞台設定、盛り上げ方、などの小説の内容に関することについては英語か日本語かは関係なさそうだ。しかし、小説らしい文章表現、言い回し、などについてはそれほど応用は利かなそうに思える。
しかし、CとJava、あるいはRubyをあてはめてみると、日本語と英語ほどの相違はなさそうに思える(応用を利かせられるかどうかという点で。もちろん表現そのものは相当異なる)。一方、CとJavaに対して、HaskellとOCamlであれば、ずいぶん異なるだろう。
とすると、異なる自然言語はパラダイムが異なると考えることができるかも知れない。では、フランス人が「英語を利用して小説の書き方を学習します」の後に、フランス語で小説を書くことを想像してみる。似たような言語ではあるが、やはり「小説らしい文章表現……」にはそれなりの差がありそうだ。
違うなぁ、そういうことを考えたのではない。何を考えついたのか忘れた。
もしかしたら、設計の記述と実装の記述はやはり分離可能なのではないか、あるいは分離すべきではないか、と考えたのかな?
そのままNetBeans6.1のインストーラを実行しようとすると、JVMが見つからないというエラーになる。インストールしたJavaがx64版だからかと思いx86版もインストールしてみるが変わらない。
netbeans-6.1-*.exe --javahome "c:\program files (x86)\java ..."
をしてみると、今度はしばらく動いた上で、バージョンが異なるというようなメッセージを表示してインストーラが終了する。
ネイティブアプリケーションなのは、インストーラそのものだけなので、直接Javaの世界でインストールすれば良い。
コマンドラインから、
netbeans-6.1-*.exe --extract
を実行すると、ファイルが展開されるので、次に
c:\program files\java\jdk\...\java -jar bundle.jar
を実行する。すると正しくインストールされる。
実行するjavaはx86版でもx64版でも構わない(と思うが、x64版を指定した)。
波形を適当に変えてどんな音になるのか試すアプレットを作っていろいろ試しているのだが(というほどは試せていないが)、問題は、IE7だと想定通りに動くのだが、Firefoxはハングアップしてしまい強制終了するしかなくなることだ(レースしているんだろうが、何と何が競い合っているのかがわからない)。ほかにも異常となる環境やブラウザーがあるかも(OSXのSafariだと、Java6からのクラス-javax.swing.GroupLayout$Groupがないため、NoClassDefErrorとなるのでハングはしない)。
wave(Vista上のFirefox 2.0.14についてはほぼ確実に死ぬので踏まないこと)
ソースは、WaveApplet.java(NetBeansでGUIを生成したので初期化コードがそういったものになっている)
というか、何が悪いんだろう? あたまか!
こんなのを捕まえられたが……
java.lang.RuntimeException: Error while creating embedded frame at sun.plugin.viewer.WNetscapePluginObject.createFrame(Unknown Source) at sun.plugin.viewer.WNetscapePluginObject.setWindow(Unknown Source)
あと、最初にメニューから「ツール」―「Javaコンソール」を選択しておくと(トレースレベルを変えようとしたのだが、トレースレベルの設定とは無関係に)ハングしないこともわかった。
初期化を急ぎ過ぎている(タイミングの問題と言いたいらしい)とかかなぁ
exerbの1.8.7版を作ろうとしたがsourceforge.jpからチェックアウトできなくて悩む。
open-sshのことを思い出して、keygenし直し、登録し直しでとりあえずチェックアウト完了。
「し直し」という字面は実に妙だな。
Exerbでどう扱うか、結構、厄介だな。むー
追記:微妙だけどenumerator.cで呼び出しているrb_provideを削除することにするのはどうか?
……ってのも微妙だなぁ(Exerbの場合に互換性をなくすとは思えないけど)。とりあえずtestの表明を修正して逃げておくか。
追記:というか期待値が古いのか。こっちを修正。
IEnumeratorをマップすべきなのかな?
MD5 checksum: 5a935b1563f2628a2bc1a7ad3a25b776
追記:下のほうで書いている件の修正をしました。新しいチェックサムは e07ea46227dbeafb5c35723d0b6c7782 です。
Ruby-1.8.7-p17以外のおもな変更点
・rubyにPATHを通した管理者権限のコンソールを追加(gem実行用)
・Exerb-4.5.0
・site_rubyへインストールしていたライブラリ(racc、exerb、vruby、unlhaなど)はvendor_rubyへ移動しました。
・ヘッダとDLL用libは同梱することにしました(staticライブラリは配布しませんし、予定もありません)。
RDocは別パッケージで配布します。追記:RDoc1.8.msi
特に問題がなければ、木曜あたりにinfoseekのほうへコピーしますので、試していただけると嬉しいです。
?? 上のASRですが、いきなりgemが、
C:/Program Files/ruby-1.8/bin/gem:14: undefined method `ruby_version' for Gem:Module (NoMethodError)
になります。原因がわからないので、調査中です。
なんでだろう?
追記:わかった。以前のバージョンを消さずにインストールできるようにしたのだけど、その結果、site_rubyが上書きされないため、中途半端に古いgemが動いてしまうからだ。
というわけで、事前に、以前のバージョンのASR-1.8.xをアンインストールしてからインストールするか、インストール後に、lib/ruby/site_rubyの下を消すかしてください。
さらに追記:逆に空ディレクトリをインストーラは作らないのかぁ。ダミーのファイルを入れておかないと、site_rubyが作られないのは、まずいことか、どうでもよいことか、どっちだろう? (setup.rbでインストールする人がいるのなら、あるべきだし、gemしか使わないのなら、なくてもよいだろうし)
さらにパイプの追記:しぬよりも遅くgem installが動く。とは言え、相手は上がったり下がったりのrubyforgeなので本当にRuby(のsocketというよりもselect)の実装がおかしいのか、端的にgem 1.1.1がおかしいのかはわからない。あとでじっくり眺める予定。
ぐは。XPでテストしたら、管理者コンソールが「関連づけされたプログラムが見つからない」(でも、batだぜ)という変なエラーになる。Vistaの場合だけインストールされるようにすべきかなぁ。
宇宙が生まれて、今年で満137億とんで259年だそうだ(端数はうそ)。
考えるよりも長い年月で想像することもできないのだが、ちょっと待て、と気づく。
今、日本に約1.3億人いると仮定する。そして医学と経済の進歩のおかげでみんな働くこともできずにただ100歳程度までは最低限の生活というものを味わえると仮定してみよう。
すると、日本人すべての認識というものは、宇宙がビッグバンしてから今にいたるまでのすべての年月に匹敵するだけの量があるということになる。
これは恐ろしいことだ。一人で137億年を過ごすことなど考えたかないが、それに匹敵するだけの時間が現在にプラスマイナスして50年の間に存在しているのだから。そして、それを地球の規模に膨らませれば、それは確かに乳幼児がばたばたと死んでいく世界もあれば、ブルガリアのヨーグルトな人たちのように130年くらい生きているというようなうわさのある世界もあるとは言え、それでもほんの2〜3年のレンジで、全人類の脳みその中の時間、内宇宙時間の合計は、外宇宙が誕生してからの時間に匹敵するだけの量となる。
外宇宙はとりあえず1つと仮定できるが、内宇宙は人間の数だけ並列する。そして2〜3年で宇宙が存在していた時間を超えるだけの量となる。
今、南極の極点から(同じ意味か。南極大陸の極点から)北極点まで、らせん状に線をひくことを考える。このらせん状の線の上には、地球上に存在する全人類がどこかしらかで乗っている。一人につき外宇宙の2〜3年分の単位を持つ。
地球が誕生して、昨日でちょうど44億年だ(48億かも)。北極点のほうに近いというか、人類は南半球より圧倒的に北半球のほうに偏って分布していると思うから(インドと中国と北米が北だ)地球の誕生日に相当する人はおそらく、四川省で今、家を失って困っているはずだと思うけど、ベンガル地方でトラ退治しているかも知れない。全然、はずれているかも。
というような、宇宙時間と人間の内宇宙のマッピングした地図を作ったと仮定して、明治100年なんていう日本の近現代は、たかだか北極点に一番近い位置にいる最後の人類の2〜3年程度の時間に過ぎないのだな。と、考えると、なんとかけがえのない時間であることか?
clは、-I"c:/program files/xxxx"と書いてもOKなのに、linkは-libpath:"c:/program files/xxxx"と書くと、
LINK : fatal error LNK1181: 入力ファイル "Files.obj" を開けません
となる。あまりの厄介さにうんざり。
山下さんの紹介が魅力的だったので、寺神戸亮の無伴奏チェロ(でも楽器はヴィオロンチェロ・ダ・スパッラ)組曲を買って、早速聴いている。
以前、遠い昔、誰かので聴いたとき以来……と書いてから、それはシゲティだと思い出し、したがってチェロではなくヴァイオリンではないかと気づくが、そのくらい、あまり聴かない。
そして実際に聴くと、やはり聞き慣れない。
別に弦楽器が好きではないというわけではないのだが、バッハに関しては、圧倒的にピアノ(クラヴサンやハープシコードでもだめで、そこはやはりピアノだ)が聴きやすい。慣れもあるだろうが、音の動きを追いやすいからだ。
そのため、チェロ(ではないが)の独奏曲を聴いていると、自分がどこにいるのかわからなくなり、文字通り音楽の森に迷ってしまうのであった。
にもかかわらず、その迷宮が魅力に溢れているのだから、しょうがない。
録音のせいかもしれないが、音に深みがあり(残響を多めに残しているようだ)、もしそれがこの楽器の能力の一つだとしたら、それは確かに魅力的だ。
それにしても、以前、高橋悠治だと思ったが、一人で眠れぬ夜に自分のために、自分の楽しみのためだけにゴルトベルクを弾くのは楽しいことであるというようなことを書いているのを読んで、妙にあこがれたのだが(いくつかは弾けなくはないが、ああは弾けない)、それ以上に、無伴奏チェロ組曲を自分のために弾くのはは楽しそうだ。
infoseekへコピーした。ASR配布サイト
WindowsでGemのバイナリ配布を行わない場合、つまり、その場でのビルドを実行しようとすると、nmakeあるいはlinkの問題で、Program Files (x86)のような空白入りディレクトリへコピーするとビルドに失敗する。
これはおもしろくないので、rbconfigなどが得るディレクトリ名をWindowsのShortPathNameを利用するように変更した。
この処理を行うスクリプトは(オンデマンドで処理することになるので)同梱してあるが、こんなの。
require 'pathname' require 'dl/win32' class Pathname unless class_variable_defined?('@@GetShortPathName') @@GetShortPathName = Win32API.new('Kernel32.dll', 'GetShortPathNameA', 'SSI', 'I') end def shortname olen = 200 begin buff = ' ' * olen len = @@GetShortPathName.call(relative? ? realpath.to_s : to_s, buff, buff.size) if olen < len olen = len end end while olen == len buff.rstrip.chomp("\0") end end if $0 == __FILE__ if ARGV.length == 0 $stderr.puts 'usage: winpath.rb pathname [more pathname ...]' exit 1 end ARGV.each do |f| p = Pathname.new(f) $stdout.puts p.shortname end end
なんとなく、Pathnameのメソッドだよなぁとか。
rbconfig.rbでは以下のように利用している。
TOPDIR = Pathname.new(File.dirname(__FILE__).chomp!("/lib/ruby/1.8/i386-mswin32")).shortname
逆に、これまでASRを利用していて、長いパス名を前提にしてプログラムを組まれていた場合は、もしかすると互換性の問題があるかも知れません(あるかな? 既知のディレクトリ名とマッチングをしたりしているとあるかも)。
infoseekも更新(6/19に最新置場に配置したものと同じパッケージです)。
考えてみたら事前条件としてMSIの導入を要求しているのだから、同じようにWinsock2の導入も要求すれば良いのでした。
高橋さんから、台湾のOSCみたいなカンファレンスの話を聞いたのだが、とにもかくにも、日本のオープンソフト系カンファレンスのエンターテインメント性は異常、他に匹敵できるのは知っている限りではシアトルの連中だけ、というような内容。シアトルと渋谷のpmだのjsだのが突出しまくりである、と。
で、なぜだろう? と話は続く。
そこで、考えてみるわけだが、おれが最初に参加したことがあるのは(JUSの勉強会みたいなのは別にすると)、YAPRCだったわけで、pmとか言うと、当然、そこに見られた特徴について考えることがベースとなる。確かにPerl Mongersな人たちのプレゼンはおもしろかったような(覚えてないけど)。他にエンターテインメントと言えばライトニングトークは海外の企画の流用だったし、でも、何かもっとオリジナルで圧倒的なエンターテインメント性があるプレゼンがあったような……目の前にいる男こそがその張本人ではないのか?
「いや、YAPRCは、宮川さんが最初に表舞台に登場したという点から、確かに特別のイベントでしたが」
と高橋さんは謙遜するが、
・すべてのシートは1枚では完結しない(状態を持つ)
・1つの文は複数のシートによってポイントされる
・内容の表現は文字に限定される
というテクニカルカンファレンスにおけるプレゼンのアーキテクチャスタイルを決定づけた(高橋メソッドは、アーキテクチャスタイルの1つのインスタンス――プレゼンアーキテクチャ)のではないだろうかなぁ。
もちろんRESTは素晴らしい。
西さんから名刺をいただいたのだが、なぜかアマゾンで売っている。
しかし、名刺だということの証明のようにカバンからあふれんばかりの枚数が入っていて、しかも通りかかる人たちに配りまくっていた。
読みようによってはあまり良く書いていないようにも見えるが、正直なところ、「これ、名刺です」といってあれを渡された衝撃+それがカバンの中にてんこ盛りというのは、おれにとっては、海岸でのミシンと蝙蝠傘の出会いの美しさ以上のパースペクティブだったので、記録せずにはいられない。
(海岸はバラードかロブグリエだけど気にしない)
2枚の名刺のもう1つのほうを子供に見せたら、なんかアニメの主題歌らしくて、喜んでいた(中にカードが入っていて、それも嬉しいらしい。まあそういうこたあるな)。
というわけで、無事名刺入れにしまわれることになりました。
Ruby-1.8.7-p22で作成し直しました。
ActiveRuby.msi(MD5 checksum: f788a2be978da12bd1250c338ac8d0a5)
おまけに、セッションで使ったHeapShowの拡張ライブラリも同梱してあります(実行時イメージ)。
ただしHeapShowは、列挙したメモリーブロックからheaps_slotテーブルらしきものを利用する(該当テーブルはgc.cのstaticなデータ)ということを行っているため、たまたま以前に実行したプロセスのイメージが残っているメモリーブロックを読み込んだなどの理由から存在しないメモリーブロックを参照してクラッシュすることがあります(連続して実行しているとおおよそ20回に1回くらいの頻度)。また、HeapShow::Displayクラスのメソッドのほとんどはテストしていません。さらに、発見した(とみなす)heaps_slotテーブルのダンプをmsvcrtのstdioを使って標準出力へ出すデバッグ処理も有効になったままです。
このため、テスト環境での利用に限定してください。
同梱しているheapshow.rbとcheapshow.soの組み合わせはheapshow.rbのロードと同時にネイティブスレッドを起動してその中で自動的に描画を開始します。そのため、GCの動作を確認したいプログラムを起動するときに、コマンドラインで-rheapshowを指定することで、実行できます。
なお、ソースは、Subversionリポジトリにあります。
主なRVALUEに対応する色は、Object……緑、Class……赤、Module……オレンジ、Float……紫、String……青、Array……黄色、Hash……黄緑、File……ピンク、Data,Scope,Varmap,Node……薄いグレーの一族です。
参考までに、セッションで実行した青と黄色の網目状となり、GCにより黄色が黒(フリーなセル)となり、すべてが青く染まっていくスクリプトを以下に示します。
$files = [] def deep(d) begin Dir.open(d).each do |x| next if x[0] == ?. if File.directory?(File.join(d, x)) deep(File.join(d, x)) else $files << x end end rescue end end deep('/') # ここを変えて、必要となるセルの量を調整する。/windowsあたりが良いかも知れない puts $files.size
結局、文字化けの原因は言語設定Neutralのダイアログに対して(良くわからない理由により)日本語用メッセージが設定されていたためでした。原文に置き換えたので、解消しているはずです。
ムムリクさん、木村さん、どうもありがとうございました。
年輪とか魚の鱗のようなもので、最初はコアしかないのだが、そのまわりにライブラリとかがかぶさって、それを固めたコンポーネントがある。
開発時にパターン化できるようにモデルを与えるフレームワークとは別に、実行時にコンポーネントの相互運用を確保するためのフレームワークがある。
別のところにサービスがあって、より落とし込んでサブジェクトと呼ぶことにする。
ここにおいて、サブジェクト→フレームワーク→コンポーネントという3つ組ができる。
サブジェクトというのは、外部からは、情報をくれといえばくれて、情報を作れといえば作り、消せといえば消し、変えろといえば変えるものだ。副作用の有無(具体的にはサブジェクト間の相互作用)は、外部にとっては関心外である。当然だが、サブジェクトに対して作成した項には識別子が必要である。
ここで、RESTを適用することを考える。
その先を考える。
すると、あるサブジェクトのふるまいは、クライアントの事情や大人の事情で時々別のものとなる。
これをコンテキストと呼ぶ。
コンテキストを上のRESTなシステムに適用することを考える。
URLは変わらない。コンテキストは周辺事情であり、リソースそのものを変形したり、表現に影響したり、あるいはなんらかの副作用を伴うとしても、そのサブジェクトのそのリソースが異なるものになるわけではないからだ。
3種類の実装が考えられる。
1つは、URLの先でコンテキストによって実際に起動されるサブジェクトを変える方法で、それはルーティングの役割である。サブジェクトは静的なコンポーネントで良い。この方法は、つまらないし、まじめな実装であれば、コンテキストの増加によるコンポーネントの爆発的増加という結果となり、それはすべての条件判断のための実装継承のようなもので、捨てられた過去の方法だ。
1つは、OOな仕組みで、サブジェクトはクライアントごとに1インスタンスを割り当てることを前提とすれば、実行時に動的な変形が行われればよい。たった1つのサブジェクトが100クライアントを相手にしているときは、100の異なるふるまい=コードを持ったインスタンスとして動作する。このふるまいの変更をどのように記述できるかは、1つのサブジェクトそのもので、関心領域だ。おそらく、最短はAOPでコンテキストとアスペクトの対応付けかもしれないが、現在のAOPの記述方法、つまり主となるモジュールに対応する少ないアスペクトという方法では、最初の方法と同じくコンテキストの増加(コンテキストが実行順にも影響すると前提すれば、加算でなく、べき乗となる)を整理して記述することはできない。
考え直そう。多数のデータを素早く整理して扱うための道具を利用する。すなわちコンピュータとプログラムである。幸いにしてノイマン型のコンピュータを使っているので、コードとはデータである。
……この方法は、詳細が記述できるようになったBPELのようなもののように見える。使えないな。
というわけで、3番目の方法を考える必要がある。
というような、話だったのかなぁ?
_ ムムリク [ありがとうございます。解消されていました。]
唐沢なをきのマンガの、自分の職業を親戚のおばさんとかに言うとかならずのように、(そのおばさんは自分の)子供に向かって、「○○ちゃん、ほら、ドラエモンを書いてもらいなさい」とか言い出す、というのみだいだな。
ASRにStarRubyをバンドルしようと思うんだけど何かまずいことはあるかなぁ?
StarRubyの実行部(SDL含む)を入れたASRです。(md5checksum: e4d58c7c599476ee0a172c511729ef22)
危険ですが、実験的に(非難されたら消す)ネットワーク越しに(StarRubyを前提とした)スクリプトを直接実行する機能を入れてみました。
Rubyコンソールを起動した後に、書き込み可能なディレクトリへ移動して、
star http://arton.no-ip.info/data/test/star/airship.rb
とか、
star http://arton.no-ip.info/data/test/star/helloworld.rb
を実行してみてください(http://arton.no-ip.info/data/test/starには、StarRuby Windowsパッケージのsamplesディレクトリの内容がそのままコピーされています)。
star.batは、Font.newとTexture.loadに介入して、引数で指定されたURIからの相対でファイルをローカルへコピーします。一度、実行に成功したらローカルにスクリプトとリソース類が残るので、2回目以降は
ruby airship.rb
とか
ruby helloworld.rb
で実行できます(rubyではなく、starを利用してもできるけど)。star.batは、インストールディレクトリ\binにあるので、何をしているのかは確認できます。
とりあえず作ってみたstar.batが介入しているのは、StarRuby::FontとStarRuby::Textureだけなので、requireはだめなわけですが、どうせなら、requireにも介入するか。
というわけで、とりあえずお手元の、star.batに次のパッチを当ててみてください。
--- star.bat~ Fri Jun 27 21:34:47 2008 +++ star.bat Sat Jun 28 02:00:50 2008 @@ -34,11 +34,11 @@ end def self.to_local(uri, path) - [ '', '.TTF', '.png'].each do |ext| + [ '', '.TTF', '.png', '.rb' ].each do |ext| begin src = open(uri.to_s + ext, 'rb') FileUtils.mkdir_p File.dirname(path) - File.open(path, 'wb') do |f| + File.open(path + ext, 'wb') do |f| f.write src.read end src.close @@ -62,9 +62,22 @@ _load RemoteFile.get(path) end end + + end include StarRuby + +alias _require require + +def require(path) + begin + _require path + rescue LoadError + StarRuby::RemoteFile.get(path) + _require path + end +end load RemoteFile.get(ARGV[0])
一応、動くのは確認したので、ASR 1.8.7.6も作るけど。
追記:requireで拡張子pngとかTTFは無駄過ぎるな……
ASR 1.8.7.6(MD5checksum: bbdaad881ab3761b263b5af1de227f95)
requireの場合は拡張子rbのみ検索するようにしたstar.batに更新しました。
あと、RubyGemsを1.2に更新。
star http://arton.no-ip.info/data/test/star/falling_blocks.rb
も実行できます。
というか、知らない人にはなんだかさっぱりわからないよな。
Star Rubyは、SDLの上に星さんが作ったゲームツールキットというか、クラスライブラリ。
で、ASRに0.2.0バイナリ配布アーカイブからSDLを含むDLLを同梱したということです。約1.5MBの増量だけどまだまだOne Clickに比べればコンパクト。
あと、おまけにセキュリティについて一切考えていないスマートクライアント風な実行用バッチファイル(star.bat)を添付したと。Openクラスで良かった!
メモを整理してたら、
Rubinius: Cが少ないから互換性の問題がない
YARV: Rubyで書いたところが少ない
→RubiniusがRubyで書いたコアクラスを取る
ってのが出てきた。反映させるかと一瞬考えたが、ちょっと目線が異なる内容なので、ここに書いて終わりにしとく。
追記:メモなので短い言葉を選んでるため、「取る」という、なんかタマとかクニとかを対象にする物騒な言葉を使っているけど、実装の仕組みからJRubyよりRubiniusのほうが協力しあえるというような意味です(で、その中には、Rubiniusで作成したコアライブラリを流用してVM以外はピュアRuby環境というのも試せるとか、そんな感じ)
なんか、異様にやっかいなことが判明して、メールを書いてみたり。
未見だったデスペアを観に20年ぶりくらいにアテネへ行く。いかにもアテネらしい野放図な喫煙所にちょっと驚く。
ガラスのテーブルの上に乗せたグラスに卵を割りいれ、牛乳を注ぎ、シェークするところを上から撮ったり下から撮ったり、水滴がぽたぽた垂れるところとか、生理的に不快になるシーンが延々と続くオープニング。ガラス。
ガラスは、似ても似つかぬ瓜二つの疑似兄弟と出会う仮想的なミラーハウス、居間のソファ、その他、あらゆるところに出てきて、ファスビンダーのルーツにダグラスサークがあることを思い出した。
水道の蛇口からの水滴は最後のホテルの流し(異常に大きい陶器の破片にぶつかる)にも登場。
鉤十字と制服を印象的に使っているが、この時期に可能だったのか疑問に感じる。プログラムには「国際舞台への飛躍」とか書いてあるが、国内での上映を最初から考えていなかったのではないかと考える。
妻のいとこのアトリエのキャンバスの裏の鉤十字(家主の子供がラクガキしたという言い訳をいとこがする)。何度も強調する。
ペーターカーンが扮するミューラーがどんどん過激化して、制服を着てくる。精肉屋を襲撃するSSをカフェから傍観する。隣の席にユダヤ人の老人が2人で談笑しているのを不思議そうに眺めるシーン(何を強調したかったのだろうか)。
似ていないのに似ているという映画上の設定かと思わせて、錯乱状態なのでやはり似ていないのだと思わせて、しかし計画が進むにつれて、ひげを剃り、錯乱状態が沈静化した後に、計画を妻に話すため、本当は似ているという設定なのかと思わせて、訪問してきた刑事が妻に、「しかし別人です」とやはり似ていないと落とすので、笑いを誘う。ユーモア映画とも言える。
しかし、アルトーやゴッホに献じている(あと一人は知らない人)ので、もちろん、意図的である。
ステッキの銘の強調。
フェリックスの裸体の強調。たぶん、ファスビンダーとしてはサービスショットだったのではないか、と想像してみる。妻の不気味な裸体のお詫びとしてとか。
最初はソファに座っているのがドッペルゲンガーで、寝室にいるのが本物。
2回目は、寝室にいるのがドッペルゲンガーで、ソファに座っているのが本物。それを妻の呼び声で示す。
メイドが最初は下着姿。いとこは最初は風呂上がりでバスタオルを巻いただけ。
精神分析医ではないかといとこに言ったあといとこを邪見に追い払う。いとこが戻ってきて男を精神分析医だと紹介する。妻との生活について話し始める。男は、保険を勧める。いとこは高笑いをして去る。
窓から外を眺めると、いとこが画を書いている。
最後、これは映画の撮影なので、私はここを去ると言ってストップモーション。
傑作だった。
はまるというほどのことでも、ないが、
+GAINER―PHYSICAL COMPUTING WITH GAINER(GainerBook Labo)
をそのまま読みながらコードを打ち込むとうまく動かないので、メモ。
こういうことがあるので、初心者(おれはセンサー初心者)本のチュートリアルは難しい。
P.73の、『ProcessingでGainerを使う』だが、のっけのSketch01からうまく動かない。Appletビューアが一瞬起動してそのまま消えてしまうのだ。
Processingの下半分のコンソールを眺めていると、一瞬、Gainerを見つけるが、すぐにBluetoothのポートを探しにいって、not foundでエラー終了していることがわかる。
さらに良くながめるとthread-2というようなメッセージを見える。
これは、おそらくsetupの処理に時間がかかり、ワーカスレッド側とメインスレッド側の通信に失敗しているからだろうと想像する。
であれば、オリジナルの
void seutp() { gainer = new Gainer(this); size(200, 100); }の実行順序を変えれば良いだろう。おそらく、sizeに想定以上の時間がかかっていると考えられる(とは言っても、MacBook Airで試しているので、そんなに箸にも棒にもかからないほど遅いとも思えないが)。
void setup() { size(200, 100); gainer = new Gainer(this); }
で無事、Appletビューアによる表示ができた。以降も同様で、最後にGainerのインスタンスを作る必要があった。
……もうちょっとライブラリのコードは考えたほうが良いような気はするけど。
チュートリアルが終わったので、再現させてみたが、レスポンスを取りこぼしてるみたいだ。Gainerとの通信スレッドがGainerとのハンドシェイクに失敗している(メインのsizeメソッドとかWindow生成とかに引きずられていると考えると素直だ)ので、次のポートを見に行っているのだろう。うまく行く場合は、Bluetoothのポートは見ていない。
なんとなくアマゾンを眺めているとコルグのおもちゃ(といっていいんじゃないかなぁ)がいっぱいあって楽しい。
KORG コルグ 超コンパクト・サイズ・シンセサイザー カオシレーター KAOSSILATOR(-)
カオスなko1か。
KORG コルグ ダイナミック・エフェクト・プロセッサー カオスパッド ミニ KAOSS PAD MINI MINI-KP(-)
こっちはKP。KeepとPってなんだっけな?
B000S5MVCW
ぱっと見はテノリオンみたいだ。
B000TGO1LO
なんだか妙にポップだがMIDIなのか。
これは何をするもんだろう?
これは色違いかな?
これが本命のDSに入れるやつか。
ジェズイットを見習え |
_ maq [イーノはまだまだ現役バリバリですよ〜ん。バーンとのツアーも計画されてるみたいですし :) 日本に来るかはわかりません..]
_ arton [それ以上に、阿木謙にたどりついたほうがもっと驚きだった……興味深いリンク、どうもありがとうございます。]