トップ 最新 追記

日々の破片

著作一覧

2006-10-01

_ 繰り返しは悪

My Job Went To India オフショア時代のソフトウェア開発者サバイバルガイド(Chad Fowler)

を読んでいて背筋が寒くなったりして。

まったくもって、繰り返しは悪だ。だって、繰り返したければ機械にやらせりゃいいんだからだ。人間様は繰り返してはいけない。

というか、繰り返しは刑罰であり拷問だ。

石を背負って山を登るとか。

シーシュポスの神話 (新潮文庫)(カミュ)

反復練習に限らず繰り返すことはそれにしても快楽なので、シーシュポスは微笑むことができるかも知れないが、それでも繰り返すことは悪の道だ。

繰り返し練習を繰り返すことで技能が身に付く。しかし繰り返すことは悪だとすれば、その身に付いた技能は悪なのだろうか? 墨子が非楽を唱えるのは、技術を学ぶ時間を楽に費やす無駄が許せないからだ。楽を学ぶのは反復練習が必須だ。その代わりに技術を繰り返し練習し身につける。役に立つか立たぬかの功利主義の萌芽が見られる。それはそれでありかも知れぬが、さっさと滅びた。ひとつの繰り返しから別の繰り返しへ乗り換えただけだからだ。

墨子 (講談社学術文庫)(浅野 裕一)

しばらく繰り返して身に付いたらさっと投げ捨ててしまう。そうすれば二度と繰り返さなくて済む。

そしてふと気付く。拍動という繰り返し、呼吸という繰り返し。寝て起きて寝て起きて寝て起きるという繰り返し。そうか、わかった人間様の存在そのものが悪なのだ。

_ 急に近代を考える

ヨーロッパの近代を一言のもとに言うならば、主体を神から人へ取り戻す運動ってことだ。そのかわり、孤独だの絶望だの病気だの、パンドラが開けた箱から飛び出したイヤンなものすべてを自分で引き受けなきゃならなくなった。でも、希望もあるでよ。

で、その近代に対して第一次世界大戦でヨーロッパは瀕死になって、そこから現代になる。イヤンなものすべてを自分で引き受けなきゃならないうえに、希望も死んだ。

なんで、日本の近代を明治に、つまり封建制からの脱皮をもって置こうとするんだろうか?

ヨーロッパの主流派の王権神授説の否定=封建制からの脱皮=近代化というのは、あまりにマルクス主義的(下部構造が上部構造を支える)じゃないかい? (下部構造では、封建的な資本の固定化ではなく、新興資本家による富の蓄積によって近代産業の成立があり、それによって封建制度の矛盾を止揚する必要があり、そこに思想としての近代が生まれたとみなす)

そうではなかろう。と鶴屋南北とか近松門左衛門を読んで、上田秋成でも良いが、基角でも別にいいけど、この人たちは、最初からイヤンなものをすべて自分で引き受けてるじゃん。希望はあるのかないのか良くわからん。多分、無いのは諸行無常で800年やってるからだ。

見方が毒されているから、間違って眺めるということはある。

勧善懲悪が、特異だということだ。

だからこそ、滝沢馬琴は、圧倒的であり、他の何者からも孤立していて、ついには眼を奪われて、本当に孤立する。その裏では、日本最初の職業口述筆記婦人たる息子の妻が活躍する。

いや、そうではなく、江戸と上方が特異だということもできる。

だが、文化が国のバロメータであり、文章(この文章が詩文をさすのは曹否が弟を恐れたことから明らかだ)は経世の大業であるのだから、その特異な江戸や上方をもって、ある時期の日本を代表させてもこれっぽちもまずいことはなかろう。下部構造の主流よりも、主体的に生きていたのは誰かという問題だ。つまり誰が人としての尊厳をより意識していたかということ。

むしろ、明治維新は、近代を突き進む江戸に対する封建的な地方からの時代を逆転させる蛮行と見るとしっくりくる。廃藩置県で元の封建領主の力を封じ込めたとはいうものの藩閥政治はむしろ深化する。この無理やり、大砲の力で上野の山をぼこぼこにしたクーデターのせいで、日本の近代は一度葬り去られて、でもびっくりするような復元力(これを称して魔都東京と呼ぶ)のおかげで大正、昭和と盛り返して、そしてまた引っくり返される。引っくり返しの魁になって葬り去られた(3歩後退2歩前進、なんだ、後退したわけか)226の将校たちが都会人じゃない道理だ。

最初の本当に政治的なアナーキーの起源をフリーメイソンに求めることができる。信条としてのアナーキーはゴドウィンだというのはおいておいて。それにしてもどちらもイングランドが起源だ。カソリックとの抗争のせいで宗教(権威)を相対的に見ることができるということだろうか。地域特性に根ざした国家ではなく、民族も出自もなく、ある理念に従うことで、しかも特定の神ではなく人で(もっとも何かを信じていることは求められる。テロリズム(破壊)に結びつくアナーキズムは何も信じないが、創造に結びつくアナーキズムは何かを信じていなければならないだろう)、しかもそれが石工という技術と科学の使徒によって作られたことは重要だ。

近代としての江戸は職人の町だからだ。この洋の東西を無視できる類似性が、技術というものの特性ではないだろうか。

なぜなら技術は、横につながり個人に支えられる技と、時間を超えて受け継がれる術だからだ。

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

_ i [> 人間様の存在そのものが悪 しかし、繰り返しを悪と定義したのもまた人間 人間が自分の繰り返しを観測しなかったら、も..]

_ arton [というか、自転、公転、収縮、膨張、宇宙そのものが悪意に満ち満ちている。で、「悪」という言葉は、「力」であり「強さ」で..]


2006-10-02

_ 一息ごとに一時間

ヘルパメソッドが呼べずに一回休み。

くそっ


2006-10-03

_ 一息ごとに一時間

一時間って、単になんらかの単位程度のつもりだったけど、本気で一時間(60分、360秒)になりそうなんで、ちょっと考える。

八村義夫I:星辰譜(オムニバス(クラシック))

なんと、入手可能とは思わなかった。

追記:買ってしまった……

_ なんでRubyは心地良いのか?

何人もの人が、この問題に挑んでは、それほど良い説明をできなかった。と思う。でも、確かに心地よいのは事実として感じる。ではなぜだろうか?

能書きだけなら、C#やJavaとそれほどはかわらない。もっとも、akrさんと継続はどちらにも組み込まれてないけど。

インタプリタは……は、TurboC(しかおれは知らないがTurboPASCAL知ってる人はそっちが本家というのだろうな)なら、書いてボタンを押せばその場で実行できるわけで、これもそれほどまでの差ではない。

core吐いたら処理系内部までgdbで追える……それって心地よいわけではないですから。

でも、考えてみれば、心地よさの理由というのはそれほど大したことではないのだ。

それは、言語設計/開発者が、ユーザー=プログラマを信用している、というのが原因だ。

つまり、プログラマが言語および組み込みライブラリを相当自由に変更できるということ。

一見自由そうな.NET Frameworkですら、System.Stringはsealされている。ところがRubyの場合は、なにからでも派生できるは、後付でメソッドを追加できるは、要するになんでもできる。

あとから、すべてのルートのObjectにisBlank?(ちょっとJava風味で書いてみた) なんていうメソッドを追加することができるというのが良い例。

それは、信頼されているって感じるのって心地よいよね。調子乗っていつもより高いところに昇っちゃうぞ、ってことだ。

さて、それはそう得心した。

で、この知見は敷衍できることなのか? それが問題だ。

_ partialクラス

昨日、TableAdapter使いまくりしてたら、やっぱり腑に落ちないのが出てきたよ。

前提条件:MSDTC使いたくない。でも、トランザクション必要。

となれば、SqlConnection.BeginTransaction() ですな。

で、TableAdapterは、Connectionプロパティを公開してくれている。明示的にOpenしておけば、自動開閉しないとか、TableAdapterクェリの生成メソッドもそのあたりはわかっている。

でも、だめなんだな。

というのは、TableAdapterクェリ生成メソッドは、Connectionの状態は見てくれるが、トランザクションに参加しているかどうかは見ずに、内部的にこっそりCommandを使う。ちょっと待て。

でも、抜け道が無い。

しょうがないから、TableAdapterクェリ生成メソッドを丸ごとコピー&ペーストして、自分でSqlTransactionをCommandに突っ込むことになる。

で、partialクラスが役に立つ。そのあたりをわかっているので、ジェネレートされたクラスにちゃんとpartialキーワードが付いている。(MSDNにも書いてある)

ジェネレーションギャップパターンのインスタンスいっちょあがり。

でも、さらに待て。デザインパターンが有効なのは、その言語(この場合はADO.NETというフレームワーク)の機能不足でもある。Command取り出しをフックできるようにするとか、Commandの下準備をするデリゲートを与えられるようにしていれば、むしろそのほうが良いのではないだろうか。

delegate void PrepareCommand(Command c);

public void GeneratedUpdateMethod(object param1, object param2, PrepareCommand block)と、生成して(と書いてから気づいたが、デフォルト引数がないから、ほとんどの場合、nullを最後に書かされることになるのでだめか)。

というか、単にpublic void GeneratedUpdateMethod(object param1, object param2, SqlTransaction transaction) を生成してくれるだけで良いのかも。というか、MSDTCを使えという方針なんだろうか。

_ 不思議な人たち

たとえば、次の会話は理解できる。

「ほんと、ハンバーガーってゴミだよな。あんなの食べるやつってウィンピー以外のなにもんでもないよな」

「おい、そのセリフはバーガーキングを食ってから言いな」

あるいは、

「東郷青二(字、忘れた)って、お菓子の看板書きだろ。あんなのが絵描きとして評価されてたなんて、昔の連中はほんとに物を知らねぇよな」

「そのセリフは、やつの自画像を越える画を描いてから言いな」

つまり、ある話題の対象に対して無知から来るネガティブな物言いに対して、ケチをつけるというのはわかる。

次のもわからないではない。

「あーおいしかった。ハンバーガーって本当においしいなぁ。ありがとう、ドナルド!」

「おい、そのセリフはバーガーキングを食ってから言いな」

とか

「東郷青二の画っておしゃれですてき」

「まずはマリーローランサンやドローネを見てから言いな(もっとも全盛期のおしゃれではない東郷青二はもっとすごいがな)」

くそみたいなもので満足している人に対して、もっと良いものに眼を向けろというのもわかる。

わからないのはこういうのだ。

「バーガーキングのワッパー食って、ああ満足だ。」

「不二家レストランのハンバーグ定食にはライスもついているんだぞ」

何が言いたいんだ? きみが不二家レストランが好きなのは結構。まあ、味も同格なんだろう。不二家は戦前から営業してる? それは知らないけど、だからどうした?

パターン1:まずいもののせいで、全体の評価を低くしてしまった人に、良い例を示す

パターン2:まずいものに満足している人に、より良いものを示す

この2つのパターンとは異なる。

パターン3:良いものを評価していたら、なんか全然関係ないものを持ち出してきて、そっちのほうが良い(ライス「もついている」んだぞ、という示し方。でも、それ、全然話題にしてないんだけど)と言い出す。

でも、根本的に間違っているのは、ハンバーガー(バンズで食う)の話をしている=みんなバンズを食うことを前提にしているのに、かっこじゃなかったライスを持ち出して来られてもねぇ。だからどうしましたか? という感じだな(これは、巷で話題の分裂君の話ではない。あれは、マックとバーガーキングのどちらを評価するかというパターン2だから。2つ上のは直接は関係ないからその意味ではパターン3)。mixiね。

パターン3には2種類がある。1つは土俵を変える、あるいは仕切り直しだ。勝負がつかない以上、見方を変えるということだ。これは必要でしょ。

問題はもう1つのほうだ。これはパターン1の裏返しに過ぎない。早い話、無知から来るケチ(お、韻を踏んだ)。もうひとつは、老人の繰言(昔は良かったというやつ)。このタイプは見分けやすい。大抵、ツッコミをおそれて自分から「わしゃ、ケータイってのはよくは使ったことはないんじゃが、モールスの発明した電信技術は、すべてを含んでいるんじゃぞ。ツートンの2つだけで、あらゆることを表現できて……」という具合に、話題の対象を知り抜いてはいないと弁解してから物言いを始める。まずは、ケータイってのを使いこんでから、口を開け。

「いや、よくは使ったことはないんじゃが、結構は使っておるぞ」「ふむ。比較はちゃんとした上で言っているのか。で、誰が使えるの? どこで手に入るの?」「どこにでもあるし、みんなが使っておるぞ。わしは80年間使っておるぞ」「そりゃ、単に、あんたが慣れているってだけだろ」

あと、現実性というものがない(浮世離れという言い回しがある)というのも特徴か。

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

_ mumurik [JavaScriptはObject.prototypeやFunction.prototypeが変更出来るけど心地よく..]

_ arton [そのへんは構文に秘密があるのかも。 タイプすると冗長だけど、endと書くのがキリが良い感を醸し出すとか、そんな程度の..]


2006-10-04

_ pngがだめならjpgがあるさ

よくわからない原因により数時間格闘した後、pngをjpgに変換したら動く(少なくても見える)化できた。

BKの塊っぽい世界。


2006-10-05

_ TableAdapterでエラーなりまくり

あああ、型付き言語ってこういうことか、と何度頭をかきむしったことか(大げさだけど)。

Railsの場合、migrateしてカラムを変えたりしながら、ちゃかちゃかやっていく。としても、あまりモデルをいじらなくても済む(validateとか、自分で書いたところは直す必要はある)。ここで重要なのは、直す必要があるのは自分で書いたところということ。

ADO.NETでは、何もしなければ単に例外を食らう。

何を食らいまくったかといえば、制約違反例外。

でも、制約違反ってなぜ?

と、たとえば、さっきまでchar(6)だったカラムをchar(8)に変えて、当然のように変えたなりのデータが入っているのだが、それを読むと制約違反例外。さっぱり理解できなかったわけだ。

で、どうも再生成するとどうしたとか、@itの掲示板がGoogleで引っかかって、理解した。で、ジェネレートしたソースを見ると、桁数が確かに埋め込まれているわけで、ああ、しょうがないな、とXSDを開いて再ジェネレート。

その後も、一昨日あたりに作ったジェネレーションギャップを埋めるためのメソッド回りでエラーになったり。

クェリーを利用するとLIKE演算子が使えなくて、(無理やり書いたらどうも正しく条件節が生成されていないらしい動きになる。)。で、しょうがないからギャップを埋めるほうにSQLを書いて(ADO.NET自体はfoo LIKE @param1 を受付可能。あくまでも生成したTableRowの実装の問題で、うまくいかないみたい。早い話がLIKEと書いているのに=として解釈されているようだ。SqlParameterクラスの生成方法に原因がありそうだが、時間がないのでCommandSetに独自に作ったText(=SQL)を設定して逃げ。で、逃げついでに読み取るカラムを元のからいじって、エラーになるからParameterとかもいじって……とかやったら、NOT NULL制約のカラム(読まないように変えた)にどうも代入しようとしてそれがDbNullなもんで例外を食らうとか。

いや、とても楽しめた。ADO.NETはうまくできていることは事実。だからそこまでしてTableAdapterを使うのだが、(TableRowを生成してくれるのが大きいんだが、それが逆に面倒の元なのも事実)、数時間おきにレイアウトが変わるテーブルへの利用はあまり向かないという予想を裏付けるだけの結果となってしまった。まったくActiveRecordはちょろい(ただしパフォーマンスコンシャスなんで、仮にActiveRecordが使えたとしてそれが本当に有効かは別問題。いずれにしろADO.NETを使うと決めたわけだし、他でもないおれが)。

事実なんだが、ActiveRecordに比べるとかったるいのもまた事実。

_ アマゾン時間

3Dドラゴン届いたとか。

あの時点では11月のはずだったのに、一転(ヒューマンコミュニケーション重要なアマゾン……ITなんてそんなもんだよ)。もちろん、僕のところへは予定通りまだ届いていない。

#というか、DELLはどうなってるんだろうか。まったく音沙汰が無いんだけど。

_ スルー力カンファレンス

またおもしろそうなカンファレンスが。早速事前登録


2006-10-06

_ C#ジェネリックの確認

別に確認するまでもないが、.NETのGenericsがシンタックスシュガーではないことを確認してみた(追記:つい<T>をそのまま書いてブラウザーに食われていたので修正)。
    public static void Main() {
        List<int> lg = new List<int>();
        lg.Add(4);
        System.Collections.ArrayList lo = new System.Collections.ArrayList();
        lo.Add(4);
        System.Console.WriteLine(lg[0] + (int)lo[0]);
    }
単なるシンタックスシュガーであれば、lgとloに対して生成されるILは同一になる。しかし、実際には異なる。
  IL_0001:  newobj     instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  ldc.i4.4
  IL_0009:  callvirt   instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
loc.0にnewしたList<int>のインスタンスがセットされ(IL_0006のstloc.0)、次のAddメソッド呼び出しのために、IL_0007でloc.0からスタックへロード、IL_0008で即値4がスタックへロードされ、Addメソッドの呼び出しとなる。
  IL_000f:  newobj     instance void [mscorlib]System.Collections.ArrayList::.ctor()
  IL_0014:  stloc.1
  IL_0015:  ldloc.1
  IL_0016:  ldc.i4.4
  IL_0017:  box        [mscorlib]System.Int32
  IL_001c:  callvirt   instance int32 [mscorlib]System.Collections.ArrayList::Add(object)
一方、ArrayListのほうは、即値のロード(IL_0016)の後、ボクシングがスタックに積まれた4に対して行われる(IL_0017)。
インデクサによるアクセスでも同様である。
  IL_0022:  ldloc.0     // ジェネリックリストのロード
  IL_0023:  ldc.i4.0    // インデクサの引数0のロード
  IL_0024:  callvirt   instance !0 class [mscorlib]System.Collections.Generic.List`1<int32>::get_Item(int32)
  // 戻り値はスタックトップに置かれる
  IL_0029:  ldloc.1     // ArrayListのロード
  IL_002a:  ldc.i4.0    // インデクサの引数0のロード
  IL_002b:  callvirt   instance object [mscorlib]System.Collections.ArrayList::get_Item(int32)
  IL_0030:  unbox.any  [mscorlib]System.Int32 // スタックトップに置かれたボクシングされたintのアンボックス化
というよりも、MSILは読みやすくていいなぁ。

_ かんたんRuby on Rails読書記録

ムムリクさんの10日間(いくつかはスキップされたみたいですが)の読書記録が終結されたようです(レイルは続くよ―最初が8月31日)。

著者としていろいろ教えられたり、素直に嬉しかったり、うーむと考え込んだり反省したりと、たくさん得ることがありました。どうもありがとうございます。

正誤表の充実にご協力くださったことにも感謝します。

_ この次は

はらいそ(細野晴臣&イエロー・マジック・バンド)

去り行く足音……が、立ち止まってこちらを振り向き「この次はモアベターよ」って、これだっけ?

小森のおばさんはどうでも良くて、ふざけた野郎だと思ったが、でも確かによっしゃやったぜ、と思ったときほど(不正確な表現だがまあいいや。永遠に完璧だと感じるこたないだろうし)、この次はモアベターよ、と言いたくなるものかも。

_ 雑誌とテレビ

なんでテレビ局ってなくならないんだろうと思ったけど、番組が打ち切られたりってのはあるな(番組=連載記事と考えると、雑誌=テレビ局だけど、そりゃ確かに違う)。

_ インターフェイスと実装のペア

C/C++のヘッダファイルと同じようにこのペアを考えるというのは感じたことはないが(というか、慣習って嫌みなのかな? 原文もhabitだし)確かに、インターフェイスドリブンで作るのに抵抗を感じないだろうな、という点では同意できる。

同じく必要もないのに(特にアプリケーションで)インターフェイスを作るのはあれですなぁ、というのも同意できる。無意味じゃん。

あるコンポーネントをすさまじく汎用的に作っておき、ファクトリメソッドからの取り出し方法によってさまざまなインターフェイスを返す。それぞれのインターフェイスはファサード(ゲートウェイのほうが正確かな? アプリケーションプロトコルの変換をするんだからゲートウェイっぽい)になっているのだが、相互にキャストはできない(QIすらできなくて良い。利用者には一貫したAPIセットを提供するほうが、混乱は少ないだろう)。

ただ、あまりに汎用的に作ると、結局、個々のインターフェイス(ここではAPIセットの意味なので、言語仕様上ではクラスそのものでも良い)ですべての処理を行う必要がでてきて、結局、API(システムAPI)の上のAPI(ここが内部コンポーネント)の上のAPI(ここがインターフェイス)という間の抜けた構造になってしまうので、どのあたりで切り分けるかが興味深い点。たとえば、.NETのStream一族とJavaの%putStream一族のデザイン上の相違とか。

_ アジャイルの押し付け

うーむ、アジャイルというのは雲のように湧き立つものなのだろうか。

良く晴れた午前中に山のある場所を散歩していると、良く見ることができる。山の木々の間から雲が生まれてくるところをだ。雲は決して天から降ってくるのではない。生気ある自然の中から、ごくあたりまえに生まれて、そして上って行く。それは生き生きとしたものだ(と、すっかりアレグザンダーに毒されて、生き生きとという言葉に対するわだかまりが多少は雲霧消散(おいIME、このくらいの慣用語は変換しろよ――と思ったら雲散霧消の覚え間違いだった)しているらしい)。

アジャイルというのは、そういうものだとマーティンファウラーは思っているらしい。

そして、僕も、それは正しい考えだ、と思う。

でも最初にキャズムを超えたと書いている。

だったら、それはしょうがないんじゃないかという気もする。だって、雲は天に集まり雲海となり、そして天から地上へ向けて雨を降らす。キャズムを超えたなら、そりゃ雨も降ってくるだろう。

降られたほうには災難ではある。

そこで、われわれには2つの手段が残されている。

1つは傘を用意しておくことだ。

そしてもう1つは唄うことだ。

雨に唄えば 50周年記念版 スペシャル・エディション [DVD](ジーン・ケリー)

What's a glorious feeling, and I'm happy again,

幸福を取り戻せるかも。

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

_ ムムリク [わざわざご紹介いただき、ありがとうございます。]

_ 通りすがり [×雲霧消散 ○雲散霧消]

_ arton [どうもありがとう。]


2006-10-07

_ 使える使えない

さて、おれはJavaでプログラムを書ける。

しかし、おれはJavaで3Dシューティングゲームを多分、書けない。少なくても今は書けない。もちろん、C#でもC++でもRubyでも書けない。

ということを考えると、見方によってはだけどプログラミング言語ってのはそれほど重要ではない。

早い話、Javaでプログラムはほとんど書けませんが、Strutsを使いこなすプログラムは書けますというのはありえる。前段は汎用で考えた場合(3Dプログラミングは書けない、数値計算はアルゴリズムを知らないので書けない、デザインが苦手なので良いクラスライブラリは書けない、書けないプログラムがいっぱいあるというかほとんど書けない、したがって書けない)、後段は特定分野に限定した場合の答え。でもフレームワークで絞るといまいちつまらないので、もっと上層に広げて考えてみる。

StrutsでEコマースサイトは書けるが、ミッションクリティカルなワークフローシステムは書けないというようなこともありえる。当然、逆もある。悲観ロックでなら完全に制御できるが、楽観ロックでうまくやることは考えも付かないというのもあるし、悲観ロックを最初から念頭に置くことができないってのもありえる。でも、これらの使い分けの知識抜きにまともなRDBプログラミングは書けない。(っていうか、ADO.NETで悲観プログラミングはやりにくかった。結局ジェネレーションギャップパターン使いまくり。そりゃ悲観もしたくなる)

と、適用について考えた場合、プログラミング言語を使える使えないって質問には、いかほどの意味があるのだろうか? もちろん、そんなものは全然ない。むしろ、どのような適用プログラミングができるのか、が問われる。

しかし、その反面、JavaでEコマースサイトを完璧に構築できる人間が、いや、ASP.NETでC#というのは書いたことがありません、とかRailsってなんですか? というもあるだろうが、これはやめたほうが良いだろう。あるいは、それは本当に意味のある選択かということでもある。もちろん、意味はないと思える。ある特定分野のアプリケーション(システム)であれば、おそらく、どんなプログラミング言語を使おうが、おれは作れる。もちろん、ライブラリが無いとか、DBとインターフェイスするための手段が一切ないとか、8ビットパソコンのBASICでもできるのか、おらおら、とか訊かれたらそれは訊くやつがバカだということで、一定の条件を満たしているのならば、という前提がつくのは当然のことだ。

結局のところ、プログラミング言語とアプリケーションは2×2に見えるけど、重要なのはアプリケーションのほうで、作れるアプリケーションについてはプログラミング言語の象限にはほとんど意味はなく、逆に作れないアプリケーションについても、やはりプログラミング言語の象限にはほとんど意味が無い。

で、アプリケーション抜きにあるプログラミング言語だけで使える使えないを問うのは意味がない。

でも、意味を持たせることは、Joelテスト(とは違うエントリーだったような気がするけど)流儀ではできる。風変わりな言語を使えるというような答えをする人は、きっと応用力があるだろうから、アプリケーションについても作れるだろうと想定できるということだ。あとは感覚的なものだ。XXX(嫌いな言語の名前を入れる)が使えるとか言うようなセンスのないやつはいらないなぁ、とか。なぜそこでYYY(好きな言語の名前を入れる)が使えると言わないのか、とか。

となると、プログラミング言語の選択というのは2種類しかない。天から降ってきたものをへいへいと使うか、自分が気に入ってるものをえいえいと使うかだ。あとは意識的に、変えてみたり。

で、さらに一歩進めると、なんのことはなく、楽で手数が少なくて済み、早く書けて、ソースがきれいなグラフを描いて(インデントカーブが)、そういうのが一番という話になる。か、実行性能が良いとか。

さて、これは自然言語でも言える。

日本語で書いてあろうが、ハングルで書いてあろうが、スワヒリ語で書いてあろうが、ガッサンカナファーニはガッサンカナファーニだし、美しい日本語で書いてあろうが英語で書いてあろうが渡辺昇一は渡辺昇一だ。おかげで翻訳を安心して読むことができる。

さらに歌にも言える。

ピアノで伴奏しようが、オーケストラをバックにつけようが、カーペンターズはカーペンターズだし、空き缶を叩いていたってジョンライドンはジョンライドンだ。

国家にも言える。

ポルトガル人が首相をやろうが、ドミニク共和国人が首相をやろうが、日本は日本だし、日本人が大統領をやろうが火星人が大統領をやろうがアメリカはアメリカだ。本当かな? もし本当ではないとしたら、それはなぜなんだろう。

_ ガッサン

という具合に、面倒になって与太っていたら、突然、ガッサンカナファーニを思い出したわけだが、なんてこった。

太陽の男たち・ハイファに戻って (現代アラブ小説全集)(ガッサーン カナファーニー)

もう、入手できずに、ダフ屋が約9000円なんて値段をつけて売っているではないか。ガッサンじゃなくてガッサーンになってるな。では以降はガッサーンだ。

ガッサーンカナファーニは、パレスティナ人の小説家で、真に政治的な作家だった。アンガージュマンなんてもんじゃない。その小説世界の持つ説得力は、すさまじい破壊力を持つ。

太陽の男達は、大して稼ぎにならないイラクから天国のように金がうなっているクェートへ出稼ぎに行こうとするパレスティナ人たちの物語だ。

最初に、一人一人の事情がばらばらの短編のように描かれる。パレスティナの住み慣れた家を追われてイラクへ来たり、生活ができなくなったためにイラクへ来ていたり事情はさまざまだが、みな、食い詰めている。

そこにいい話が持ち込まれる。クェートならたんまり稼げるぜ。しかしヴィザもなければ旅費もない。

そこにタンクローリーの運転手が登場する。クェートから石油を運びに行くんだ、おいらは。つまり、ここイラクからクェートへの道ではタンクローリーの中は空っぽだ。どうだい、素敵じゃないか?

かくして男達はタンクローリーにまたがり、クェートを目指す。

そして、クェートの国境近くにたどり着く。運転手は言う。5分間、5分間、我慢しろ。1分でその丘を越えて国境へ着く。1分で入国審査官へ通行許可書を見せる。1分で許可を得る。そしてやつらの目が届かないところまで2分間突っ走る。合わせて5分だ。そこでおまえらはその地獄の釜からまた外へ出られるという寸法だ。

5分だな? そうだ。5分だ。よし、5分たったら俺達はまた、砂漠の風を浴びることができるんだな。男達はタンクローリーの中に入る。重い鉄の蓋が閉められる。太陽に照らされてタンクの中は40度を超える地獄の釜となる。

運転手は猛スピードで国境へ着く。しかし、入国審査の親父からろくでもないエロ話を15分間も聞かされる羽目になる。やっと解放されてまた猛スピードで2分突っ走る。丘を越えてタンクの蓋を開ける。すさまじい熱風が口から吹き上がる。

運転手は慟哭する。なぜ、おまえらはタンクを叩いて、ここから出せと、あのろくでもないクェート人のヒヒ爺のところでやらかさなかったんだ? なぜ黙って死んで行ったんだ?

かくして、モサドはガッサーンの車に爆弾を仕掛けて爆殺した。テロリストでもなんでもない(PFLPの公然活動家ではあったけど)、ただの作家だったのだが。ペンは剣より強いんだろうか?

それから20年して、イラク人がいきなり大挙して国境を越えてクェートに入り込んだのだが、ああ、ガッサーンが書いたように、本当にクェートというのはイラクから見たらパラダイスなんだな、と思ったものだ。が、タンクローリーに命を賭けた連中とは随分異なる荒っぽい方法だったが。

(写真は、この時、買い直した新装版)

_ 夕張メロン城

まじですか、誰も止めなかったんだろうか?

と子供と子供ニュースを見てて子供と激しく笑った。子供だましもいいとこだ、と子供でもわかる。

炭鉱博物館はわかる。佐渡金山みたいなもので、それなりにおもしろそうだ。おれも機会があったら見てみたい。穴があったら入りたい。

で、それだっけだったらまだいいが。

遊園地。

で、それだっけだったらまだいいが。

豪華温泉会館。

で、それだっけだったらまだいいが。

夕張メロン城。

そりゃ、お金も尽きるだろう。というか、遊園地が見るからにだめっぽい(そのあとの2つはまだわかる)。

ミレニアム・マンボ スペシャル・エディション [DVD](スー・チー)

でも、この作品が残った。住んでる人たちには悪いが、それで十分だ。

追記:夕張メロン城。テレビじゃ数10億もかけて建てた単なるおばかな観光施設にしか見えなかったが、一応、産業施設でそれなりに有意義なようだな。夕張メロンの歴史。これだけの取り扱い金額(追記:良く見たら単なる累計なのかも……)があるのに、無駄な観光政策でしくじったということなんだろうか。

さらに追記:なんとメロン城が売りに出てる……買いたいなぁ。というか、ロボット館だの、知られざる世界の動物館だの、SL館だの、水上レストランだの、良くまあ作りに作ったり、というか。

さらに追記:今後の観光施設のあり方について(PDF:12KB)。遊園地が謎だ。上の売却先募集にも出ていない(上の資料は年間の集客数が出ているので興味深い。炭鉱と温泉はそれなりの数字だ)。しかし、遊園地については閉鎖とさえ書いていない。テレビでの映像から平日は0人として、日曜に100人と計算して年間5000人。仮に1人が大盤振る舞いで10000円落としても5000万円、そりゃだめだろう。しかし鋼鉄の塊だったりするから破壊するにも金がかかる。なかったことにするのだろうか? そして北の橋の竜のようになり、サイクリストと死闘を演じることになるのだろうか、乞うご期待。

北の橋【字幕版】 [VHS](ビュル・オジエ)

名前重要:アドベンチャーファミリー。アドベンチャーだったんだなぁ。別役実の世界的な空疎感が漂う異次元世界と見た。

#おとぎの国。夕張市=空知郡のババリア。


2006-10-08

_ 開発の現場 Vol.6

開発の現場 vol.006(SE編集部)

るいもさんとの連載の2回目。ソース管理編の上(下は次号)です。

_ CSVとString#Split

新人のプログラムにこんなのがあった。(正確に再現する必要はないのでJava,C#混じりかも)
dictionary.Add(data.key, data.foo + "," + ConvertBar(data.bar) + "," + data.baz);
...(幾つかのメソッドが間に挟まる)
try
{
    string d = map[input.key];
    string[] data = d.Split(',');
    if (data[0] == input.Validation_key)
    {
        Command c = new Command("insert into ..." + data[0] + "','" + data[1] ...
        ...
    }
}
catch (NotFoundException e)
{
    throw new ArgumentException(input.key + " not found");
}
...

なぜ、ここでCSVを使うんだ? dictionaryへ元のdataを突っ込めばいいだろ?
と激しく質問。
だって、ConvertBarするし、dataは読み取り専用だからbarのセッタが無いし、……し、……し……
だったら、使う場所でコンバートしたらどうだ?

dictionary.Add(data.key, data.foo + "," + data.bar + "," + data.baz);
...
        Command c = new Command("insert into ..." + data[0] + "','" + ConvertBar(data[1]) ...

これは等価だろ?
確かに……
で、これが等価だということは、

dictionary.Add(data.key, data);
...
    FooData data = map[input.key];
    if (data.foo == input.Validation_key)
    {
        Command c = new Command("insert into ..." + data.foo + "','" + ConvertBar(data.bar) ...
とも等価だよな?
確かに……
で、最初のリストと最後のリスト、どっちが何をインサートしてるか(PreparedStatement相当のを使う/使わないはまた別の問題として)、カラムと整合性が取れているか、わかりやすいか? どっちが簡潔か?
なるほど。

(書いていて思ったが、Webアプリケーションのエスケープ問題と同根だな。なぜか変形した後のデータを保存したくなるらしい――ここでのinsert……は置いておくとして)

_ CSVとString#Split(2)

それからしばらくして見たらCSVが復活していた。
dictionary.Add(data.key, data.foo + "," + ConvertBar(data.bar) + "," + data.baz + "," + currentStatus);
...(幾つかのメソッドが間に挟まる)
try
{
    string d = map[input.key];
    string[] data = d.Split(',');
    if (data[0] == input.Validation_key)
    {
        Command c = new Command("insert into ..." + data[0] + "','" + data[1] ...
        ...
    }
}
...

はい?
いや、ステータスが追加になったんで……
なぜクラスを作らないんだ?
はて?
CSV作ってSplitするオーバーヘッドを考えたらクラスを作ったって同じだろ? (と、インスタンス生成のオーバーヘッドを言ってるのかと思った)
……(ぽかーん)
(あ、まったく考え付かなかったということか)たとえば

internal class FooWithStatus
{
    internal FooData data;
    internal string status;
    internal DataWithStatus(FooData d, string s)
    {
        data = d;
        status = s;
    }
}
...
dictionary.Add(data.key, new FooWithStatus(data, currentStatus));
...(幾つかのメソッドが間に挟まる)
try
{
    FooWithStatus fs = map[input.key];
    if (fs.data.foo == input.Validation_key)
    {
        Command c = new Command("insert into ..." + fs.data.foo + "','" + ConvertBar(fs.data.bar) ...
...
とするだけでも、全然ましだろ?
確かに……
別にクラスだからって、単なる名前つきのフィールドを持ったデータとして使ってもかまわないんだよ。(とりあえずこれでいいや)
なるほど

_ カプセル化

(すでに現実とは異なる展開)

あれ、妙に洗練されてきてるな?

internal class FooWithStatus
{
    FooData data;
    string status;
    internal DataWithStatus(FooData d, string s)
    {
        data = d;
        status = s;
    }
    internal FooData Data
    {
        get { return data; }
    }
    internal string Status
    {
        get { return status; }
    }
}
...
dictionary.Add(data.key, new FooWithStatus(data, currentStatus));
...(幾つかのメソッドが間に挟まる)
try
{
    FooWithStatus fs = map[input.key];
    if (fs.data.foo == input.Validation_key)
    {
        Command c = new Command("insert into ..." + fs.Data.foo + "','" + ConvertBar(fs.Data.bar) ...
...
せっかくのクラスだからちょっとカプセル化を意識してみました。
それ、違うから。
え、フィールドをアクセスしないようにしたんですけど。
まず、第一に、それに意味があるか良く考えてみな。このFooWithStatusといういい加減な名前のクラスはinternalだからこのプログラムのここでしか使わない。別に、プロパティメソッドにする必然は全然ない。だって、privateにするってことは誰かから隠したいということだよな?
ですね。
で、誰かってのは、このプログラム自身ということになるね。
確かに。
ということは隠してるのも隠されてるのもこのプログラムじゃん。それプラスマイナスゼロで、まったく意味無いじゃん。
うう、しかし……
それにカプセル化というのは、そういう意味じゃない。アクセス制御とは関係ない。どうしてもカプセル化したいんだったら、あまり意味はないとは思うが、こうかな……
internal class FooWithStatus
{
    FooData data;
    string status;
    internal DataWithStatus(FooData d, string s)
    {
        data = d;
        status = s;
    }
    internal string Status
    {
        get { return status; }
    }
    internal string Foo 
    {
        get { return data.foo; }
    }    
    internal string Bar
    {
         get { return ConvertBar(data.bar); }
    }
    static string ConvertBar(string s)
    {
        ...
    }
}
...
dictionary.Add(data.key, new FooWithStatus(data, currentStatus));
...(幾つかのメソッドが間に挟まる)
try
{
    FooWithStatus fs = map[input.key];
    if (fs.Foo == input.Validation_key)
    {
        Command c = new Command("insert into ..." + fs.Foo + "','" + fs.Bar ...
...
はあ?
内部にFooDataを持つというのは、利用者にとってはどうでも良い実装詳細に見える。だって利用しているのはfooという文字列、barの変換後の文字列……なわけだろ。
……
さらに、こうだな。
internal class Foo
{
    FooData data;
    string status;
    internal DataWithStatus(FooData d, string s)
    {
        data = d;
        status = s;
    }
    internal bool IsInsertable(string s)
    {
        return data.foo == s;
    }
    internal Command createInsertCommand()
    {
        return new Command("insert into ..." + data.foo + "','" + ConvertBar(data.bar) ...);
    }
    static string ConvertBar(string s)
    {
        ...
    }
}
...
dictionary.Add(data.key, new Foo(data, currentStatus));
...(幾つかのメソッドが間に挟まる)
try
{
    Foo foo = map[input.key];
    if (foo.IsInsertable(input.Validation_key))
    {
        Command c = foo.createInsertCommand()
...
これで、呼び出し側はFooDataなんかについてそもそも意識する必要がなくなった。入力されたキーに一致するFooが存在して、しかもインサートすべき状態ならば、インサートするためのコマンドを作ってもらって、実行する。どのオブジェクトにどの役割を与えるかを決定して分離すること。これがカプセル化ということだ。
なるほど。
ちょっと嘘か。カプセル化した結果は、個々のオブジェクトがそれぞれの役割に応じた処理をするようになること、だ。そのために、必要となる操作とデータをクラス単位にまとめることが、カプセル化。別にprivateかどうかは関係ない。ただ、カプセル化されていれば余分なものにさわる必要がなくなるから、さわる必要がないものをさわれなくするのにアクセス指定が使えるというだけのことだ。

_ ハスケラーにシープラスプラスを説明する

C++ for Haskeller

すさまくじ、おもしろい。と、ひっくりかえるくらにいおもしろい。

関数あたりは笑いを抑えるこたできないなぁ。途中、おれにはわけわかんないが、おもしろ過ぎてさらに最後で大爆笑。

こういうセンスってすげえ。

追記:あろはさんがまとめている

追記の追記:斉藤さんのawk for Haskeller

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

_ yowa [追記のリンクがおかしいようです。]

_ arton [どうもありがとうございます。直しておきました。]


2006-10-09

_ 目玉

子供が図書館から借りて読んでた本がおもしろそうなんで、読み終わるのを待っていっき読み。

目玉かかしの秘密 (ちくまプリマーブックス)(城田 安幸)

遺伝の研究者が、かいこ(くわこ)の幼虫に目玉模様をつける研究から、目玉で鳥をおどかしたり、さらにくねくねで鳥をおどかしたり、という本、とまとめるとそういうもんだが、こりゃいい本だ。

のっけから、進化を研究したいのだが、過去は見ることができないんだから、どうしたら良いか? ここを基点として変化を記録していけば100年後、200年後には研究可能なほど資料も溜まるんじゃないか、ということでかいこの幼虫に目玉模様を獲得させる研究を始めた、とか書いている。なければ作る精神だな。

で、さらにフリッシュ、ローレンツ、ティンバーゲンの研究についてのおもしろ読み物(特にティンバーゲンが詳しいんだが、なるほど、と中盤になって納得する)が来て、いよいよ鳥かかしについての話が始まる。

かいこに目玉を獲得させるなんて研究は役に立たないからやめちまえと言われるのだが、いや基礎研究は役に立つんだ、と言いながら、ムクドリを育てて、かいこの幼虫に目玉をつけてどれだけ食べられることを防げるか(というか視点は鳥側なので、どれだけ怖がるか)の実験に入る。と、でっかな目玉に怖がる=そうか、ティンバーゲンの研究どおり、形より特徴なんだな、と納得して、では本当にそうなのかと、風船に目玉を描いてまた実験。すると鳥にも個体差があって全然気にしないやつから、極度に怖がるやつまでいろいろ。さらに大きさを変える、色を変える、繰り返してみせる、といろいろ実験。で、とにかく効き目はある。というのをNHKの科学番組でやったらさあ大変、知らないうちにそこら中で目玉風船が売られ始めるようになった。特許を取ってなかったからだ。でも、役に立ってるならまあいいか。でも、まだ、効果の持続性について実験してないんだがなぁ、と実験すると、結構あっさりトリは慣れてしまう(このあたりは数値データ付きでいろいろおもしろい)。むしろ、おいしいエサがある場所のマークとして利用されるようになるということがわかり、憮然とする。こいつら、実用新案だの特許出願中だの書いているし、絶対確実とか売り文句をつけてるが、まったく実験してないんじゃないか? と売ってるやつを買って実験すると、慣れる以前に効果がないのがほとんどだったり。さらに、JALとANAが目玉マークをタービンに書く方法で特許を申請して争っているのにあきれたり。

というあたりで、特許をちゃんと取らなければならないようだと気づいて、蛇にヒントを得たくねくね(これもいろいろ実験して、眼でもうろこでも形でもなく、とにかくでっかな筒がくねくねしてると鳥は死ぬほど怖がるということを発見)かかしのときは学会やテレビでの発表前に特許を取っといた。で、効果がない製品ははねるようにした(それで、あまり見かけないのか、と納得)とか。市と協力してカラスを追い払う実証実験したりと、いろいろやりながらも、鳥と人間がいかに共存するか、追い払う方法よりむしろ集める方法のほうが効果的ではないか、では何があれば集まってくるのか、とかの方向に考えが向かう。

で、トキが明治くらいまでは、田んぼを荒らす害鳥の代表で民謡にまで歌われていたのがあっというまに絶滅してしまったというところから、カルガモはどうなるんだとか、カラス(糞を調べるとネズミの駆除に相当役立っているように見えるが、本当に害のほうが多いのかちゃんと調べてから駆除するとか言ってんだろうな? という疑問とか)、エコロジカルな話にも進んだり。さらには、モアの化石から遺伝子を抽出するという本来の研究のほうに進んだり、かかしを作りながらかいこの目玉つくりも実はやってました、と山ほど目玉模様がついたかいこの写真が最後に出てくるわ(ちょっと感動した)で、興味が途切れることなくあっというまに読み終わった。

とにかく仮説をたてては実際にモデルを作ってとっかえひっかえ実験しては効果があれば実用化するの繰り返しだが、それが実に楽しそうだし(想像するだけで根気が必要そうなんで、そんな単純なわけないだろうが)それこそが重要なわけだし、しかも内容も興味深いので、これは小学校高学年から中学くらいにかけての子供にお勧めできる良書だな。

#追記:今、何してんだろうと思って調べたら、本書の終わりのほうで、冬虫夏草の抗癌性について調べる予定とか書いてあったが、結局、リンゴにたどりついたようだ。で、リンゴジュースを売っていたり


2006-10-10

_ 風邪ひいたらしい

ふむ、頭が痛い。

_ display

Railsで、displayというアクションを作ると、rhtmlは呼ばれるが、コントローラ上のメソッドは呼ばれない。


2006-10-11

_ trac spam

まず不思議なのは、どうしてtracが設置してあることに気づいたんだろうか、というのが1点。ホスト名にtracを含めたのが敗因かな。

次に、spam判定を仕掛けるにしても、Webアプリケーションをシュリンクラップ的に利用しているとままならぬ、いかんなあ、というのが2点。外部に開かれたアプリケーションは、自分でいじくれなければならないという教訓を得たということ。どうしようか。

とりあえずは、.htaccessで弾くしかなさそうだが、浜の真砂以上に尽きないから多分、おっかけっこになりそうなのでやる気ナルポというのが3点。かといって、まったく手を打たなければどんどん壊されるわけだし。

というか、Wikiに不可視のURLを山ほど埋め込むというはSOH的な技なんだろうか。すげえ、気分悪いんだが。

参考:<div style="position:absolute;left:-43210px;height:1px;"> としてURLを埋め込む。


2006-10-12

_ 勤勉な人たちが標準を殺す

あたりをやわらかく、無効化する、と言っても良いけど。

標準がまだ実装されていないとか、標準が実装されるまでまだ時間があるといった場合に、でも、同等の機能が欲しい場合にどうするかという問いかけである。

まあ、最終的には出るまで待とうほととぎすか、作ってしまえほととぎすなんだが、前者は良いとして後者が作ったものをどう扱うかという問題である。

1.標準ではないんだから、捨てることを意識して安く作ってさくっと使ってさくっと捨てる

2.標準と同等のものを作る

3.標準より優れた(と信じるところのものを)作る

4.標準より優れた(と信じるところのものを)作り、かつ標準として提案する

4.までやれれば立派なものだ。確かにまだ実装が出ていないんだからそういうのはありなんじゃなかろうか。

1.が意外とうまくいかない。捨てろといっても捨てないからだ。それでもあまり不自由なければそれはそれで良く、不自由であれば標準へ移行すれば良い。

3.が傍目には1.と等しく見える。しかも不自由になるはずがない。この世界では標準=非標準である。

実は標準といってもそれほど固いものではなかったりするので2.の立場は微妙だ。

というようなことを書きたかったんじゃなくて、スタイルシートの指定でFirefoxだと意図通りに表示できるのにIEだと表示できないことをしょうがないなぁ、といろいろタグをいじって変えるようなことは、IE7が出るまで待て(あとちょっとじゃん)、というようなことを書きたかったのであった。

_ trac spam(続)

で、ドメインがアメリカのISPだったりすれば、容赦なくDenyできるんだが、softbank*.bbtec.netってのは、Yahoo BBのことなんだろうなぁ、となると弱る。きっとボットが山ほどいるんだろうし、ダイナミックにアサインされたIPアドレスだったらそんなものDenyに書いてもしょうがないわけだし、やっかいなことだ。

と考えると、やはりチケットの中にバイアグラがらみの単語やURLの数とか見て弾くしかないわけだな。

しょうがないので、tracのインストール方法以外のドキュメントを後で読む。

_ 産業の成長とその裏での死

コンピュータとかその周辺産業は車とか工場とか建築とかでたとえられたりすることが多いけど、実際やりやすくて想像させやすいからだが、それ以外の身の回りのもので相似形を描けるものってなにかあるだろうか。

と考えると、やはり車は簡単だ。おそらく金額規模とか20世紀以降の産業の標準的な進み方のモデルとかだったりするからかも。

特にどうってことはないんだが、ことここにいたっては、バックミラーの効果は、あるいはシートベルトの効果は、最初から装備されているのが当たり前となる。するとそれまで非標準で、賢いディーラーはどっかからベンダーを見つけてディーラーオプションにしてたかも知れないけど、それからは車メーカーが標準装備するのが当然となる。メーカーはどっかを買収して作らせるかも知れないし、安全にかかわる問題だから自社できっちり組織を作るかも知れない。特別な能力があるベンダーは特注品でしのぐこともできるかも知れないけど市場規模はより小さくなる。廃業するところも出てくる。

それに対して、自動車会社の横暴とか言い出すのはおかど違いだろう。どうしても声を荒げたいなら、交通マナーとか交通違反(違反そのもの=事故ではないとはいえ、違法駐車のせいで飛び出してくる子供が見えないとかだってあるわけで)とか、利用者側に対して、おまいらのせいで仕事がなくなるぞごるぁと言うべきだけど、それは矛盾だな。

安全産業ってのは、準強制になる瞬間までに稼いで撤退すべき産業なんだろうな、と思ったということ。

_ 比較するする

比較するする(なんで今頃?)」、で思い出したんだけど、同じように批判がましい内容にもかかわらず、まぬけな書き間違い(時と場合にけりけりにまで踏み込まなかったのが惜しい)があって論点をスルースルーされていた話題がどっかにあったけど、なんだったけな? (謝罪しるじゃなくて、同じような技術系の話題で)

#元の話題は、単純な(というのは相手はそれほど経験を積んでない学生だから)コンパイルするから早いみたいな考え方を、そりゃ一面的な見方過ぎるからもっといろいろ見ろと諭すところから始まって、そうは言っても……を経由して、開発の速度が重要という内容なので、それに対して批判がましいというのはちょっと違うかな(その1つ上の時期外しなツッコミは明らかにお門違いだが)。とは言え、開発者が多ければピンからキリまでなのでキリも積もれば山となるとか、ピンはふつうのやつらの上にあるとか、確かに条件いろいろなのは当たり前なので、書き間違えほどのおもしろさはないのだが。


2006-10-13

_ JavaとC#

C#で再スローした例外のスタックトレースの出方が期待と異なるように見えたので試したが、問題ない。
とりあえず、問題なかった例をメモ

using System;
using System.IO;
public class Ex {
    static void Raise()
    {
        try
        {
            using (FileStream fs = new FileStream("////////", FileMode.Open, FileAccess.Read))
            {
            }
        }
        catch (IOException e)
        {
            throw e;
        }
    }
    public static void Main() 
    {
        try
        {
            Raise();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }
}
比較用のJavaプログラム
import java.io.FileInputStream;
import java.io.IOException;
public class Ex {
    static void raise() throws IOException {
        try {
            FileInputStream fi = new FileInputStream("///////");
            fi.close();
        } catch (IOException e) {
            throw e;
        }
    }
    public static void main(String[] args) {
        try {
            raise();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ここで調べたかったこととは異なるが、例外についてのメモ:
C#の選択(例外宣言を排除)のほうが賢明だと思ったが、低レベル(直接Serial扱うようなやつ)なプログラムではそうとは言い切れないと感じた。とはいえ、大多数の上位アプリケーションについては、やはりC#の選択のほうが賢明に見える。

_ i-know.jp

って知らないんだけど、それはそれとして、なんか、このサイトは厄介なサイトらしい。でも、referrer見ると、一貫してi-know.jpからのアクセスはできてるみたいだし(実の人なのかな?)、放っておいても良いかなとも思ったけど、確かにルートのrobots.txtはあんまりな気もするので後で直しておきます。(ちょっとぐだぐだ)

追記:直した。というか、Apache2に移行したときに、DocumentRoot変えたのは良かったが、以前のrobots.txtを反映させるのを忘れてた。思い出させてくれてありがとう >kkkkkkkkさん。

高井さんのrobots.txtの仕様解説。なるほどー。

_ 安部公房

えー、安部公房は結局、ノーベル賞を取ってなかったのか、と初めて知った。3人目がどうしたってことは、そういうことだよな。

Wikipediaが薄すぎる……


2006-10-14

_ Rjb

なんか良くわからない理由から複数件の問い合わせが来たので、少し書いて見た。それにしても、英語で書くのは難しいんだか簡単なんだか。

日本語と違って表現をまったく考えないで書けるという点に関してだけは簡単なわけだが(そのくせ時間の消費量はすさまじくてちょっとびっくり。ゾーンでズーン)、書いてる先からきっと唐変木なんだろうと思うとえらく難しく、しかも考えたからといって正しく書けるわけでもなく、その意味ではテストできないプログラムを書いてるみたいな感じだ。

仕組み

最初、Graffle Proで書こうとしたが、途中でやめた。クラス図については書き易いと今でも思うが、メッセージを書き始めるとどうにも辛い。というわけで、Jude。やっぱり圧倒的に楽だし早いし(というか起動もむちゃくちゃ早いんだが、JDK 5の威力なのか、特別な技があるのか(っていうか、家のマシンがメモリー量があふれてるからかも)。

_ ナナオ L887

思い切って買った(高かったよ、デルあたりと比較して2倍近く当時した)わりにすぐにカタログから消え去ったために、つかまされたのか……と暗澹たる気分になった(っていうのは、比較対象ないわけだし。どれだけ気に入っていても、実はそれは狸の泥舟という可能性はやはりあるのだ)。でもなんというか、紙ほどじゃないまでも、実に良い感じだ。というかPDFで2桁ページ以上を読める(椅子のせいもあるか?)。しかし、カタログからすぐに消えたという事実は事実。やはり掴まされたのであって、他のはもっと良く、しかも安価なのではという疑いが。というか、PC Updateあたりを見てもプレスリリース以上の記事も評価もないし。

が、こないだ何気なく『目が疲れにくい・目に優しい液晶モニタ』にたどりついて、こんど買うときはこういうのを参考にしようと眺めてたら、なんとL887は神扱いされていた。高かっただけに(というか、ここに出てる価格よりさらに遥かに高かったし)嬉しい。あと、自分の感覚がずれてなさそうだな、と確認できたのも良い(とはいえ、ここでクソミソにされてるやつのほうが使うと気に入るかも知れないので、そればっかりはいろいろ使いこまなきゃわからない)。

つまり、いろいろ試すことが必要なので、墓とか家とか絵画とかコートとか高価なものをとっかえひっかえ試すことができるお金持ちは、文字通り豊かな人生経験と鑑識眼を養うことができるということだ。

でも、大して金がなくても、プログラミング言語とかだと時間さえあればいくらでもとっかえひっかえ試して豊かな人生経験と鑑識眼を養えるわけで、実に結構なことであるなぁということでもある。

_ メモ

大島さんのVMの記事をまじめに読む。感動したぞ。

_ 上のメモについて補足

出先で、携帯でlivedoorReader使って読んでると、おおっと言う記事を読んでも後でどれだったか思い出せなくなることがある。ので、とにかくメモした次第で、リンクもないのはそのせい(にもかかわらず、わざわざツッコミすみません)。

あらためて、Strongtalkのオープンソース化

最初のほうは、JVMに対してSmalltalkerのグループがいろいろ貢献したというような話や、Hotspotの出自に関してなんかで普通に業界歴史物語として興味深いんだけど、その後が深い。というか目を開かれた。

Hotspotの元になったStrongtalkというSmalltalkのVMがオープンソース化されたことを受けての考察というか信条の表明のあたり。

仮に5倍の速さで動くとしても、世界中で一握りの人しかメインテナンスのできないようなものは長い期間にわたって成長させていくべきオープンソース的活動にはそぐわないですからね。なにより動的言語というからには、VMのような固定化したレイヤーはなるべく小さくして、将来に渡って必要な変更をなるべく簡単に行えるようになっているほうが良いと思います。

2つの論点。1つは、オープンソースとしての価値について(=誰でも読めて、かつ変えることができるソースコードということ)。そして動的言語のVMのありかたについて。

(追記:以下の段落については正しくはないので、大島さんのViewpoints Researchの絵の説明を参照のこと。これ自体は自分のメモとして残しておくけど)途中で出てくる「ブループレーン」は(小さな変化)のこと。対照概念は「ピンクプレーン」(パラダイムシフト)。(http://jeffsutherland.com/oopsla97/squeak.html)――よくわからないんだけど、これらの文脈から想像すると、パラダイムを変えるほどの大きな変革ではなくても、少しの変化で大きな効果を得て大きな影響を社会に与えること、のようなものかな? (そのためのとっかかり(look up ―― 探査とか偵察とかだけど。青い空にピンクの飛行機は目立つが、青い飛行機は目立たない。ということを考えれば良いのかなぁ)かも)

動的言語界は遅くても許される場合が多いので、数百行という普通のプログラマでも全容が理解できる程度の記述で処理系を書いてしまって将来のユーザーの拡張を促すほうが良いのではないか、と思います。

確かに! と拍手。そして、最後に、言語ではなくシステム、それも本当に使えるものを、と締めくくられているのを読み、世界が広がるのを感じた。

普段自分が仕事にしているビジネスシステム、まんざら知らないわけでもないWebのシステム、そして社会人やXX人ではなく、人間そのものの知性を増幅するためのシステム、子供の自由のためのシステム。その3番目のシステムはこうやってちゃくちゃくと練られ、考えられ、作られていくのだな、と思うと、素直に嬉しいし、そして感動的だ。

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

Before...

_ よしき [ふたたびありがとうございます。 http://www.vpri.org/ の絵を見ていただけるとわかりますが、ピ..]

_ ただただし [>携帯でlivedoorReader使って読んでると、おおっと言う記事を読んでも後でどれだったか思い出せなくなること..]

_ arton [ああそういうふうに使うのか、というかそりゃそうですね。全く正しいです。>ピン]


2006-10-15

_ 関越日曜17時

混んでた。特に高崎インター入ってすぐの場所から。そして金網の空のあたり。

練馬の料金所では、右のETC専用が長蛇の列。でも左のETC/人間共用はがら空き(途中で気づいて、左に賭けてみた)。でも、その後のボトルネックがやっぱりボトルネック。なぜ、ジッパーみたく交互にスムーズに合流しないんだろうか?


2006-10-16

_ テスラ祭り

ジャンクカルチャーに見られるテスラ。

Junk Culture(OMD)

テスラガールは、こんな歌。

テスラガール、理論を実証せよ。電気椅子だ発電機だ。殺しの装い(デパルマかな)、殺されちゃう。

テスラガール、日記をつけるよテスラガール

ときどきテレビを見るよ、ときどき話しかけるよ、でも作り方はあの世に持ってかれちゃった。

おばかですね。

コーヒー&シガレッツ [DVD](ロベルト・ベニーニ)

テスラコイルは、散文系弟が、姉にテスラの偉業を延々と解説するカフェでの風景を描いたもの。最後に弟がコイルを動かそうとすると動かない。すると姉がいきなり結線を修正し出す。するとコイルがばちばちする。実は姉は筋金入りの理工女だったというオチ(たぶん)。


2006-10-17

_ LATITUDE D410

会社のメール専用マシンがリプレースされた。

それまでのP4 1.8Gから、P-M 1.7Gにアップグレードされたもんで快適なのなんのって。つい、VS2005からJDKからインストール大会。(というより、256Mから1Gと人並みなメモリー量になったというのが正解で、P4にはそれほどまでの罪は無さそうだが)

しかし、それにしてもB5ノートとは思えないズシリ感があったり、マウスパッドとトラックポイントもどきが両方ついていたり(で、いまいちトラックポイントもどきが硬かったり、そっち用のマウスボタン相当が深すぎて押しにくかったり)、いろいろ不満はあるものの、外部モニターもミラーリングしかできないし(追記:できることになっているので明日試す……変だなぁ)、というか書いていると不満ばっかりだが、しかし、メールを開いて、添付されたWordやらExcelやらを開くたびに10分間の休憩タイムが不要になっただけでもありがたい。

_ いよっ大統領

場所はアメリカ、ホワイトハウス。

大統領執務室で憂鬱げに重ねた手の上に顎を乗せ、大統領は悩んでいる。

電話が鳴る。あわてて手に取った補佐官が、うれしそうに大統領に叫ぶ。「やつと連絡が取れました! 今、こちらに向かっているそうです」

「おお」大統領は顔を上げる。うってかわって晴れ晴れとした表情だ。

だが、さいとうたかおではなく新田たつおだ。

デューク東郷の代わりに、乱暴に扉を開けて入ってきた長身の男は、開口一番「いよっ、大統領」

ビッグ・マグナム黒岩先生 1 (マンサンQコミックス)(新田 たつお)(たぶんこれ)


2006-10-18

_ IDE-USB2.0コネクタ

IDE / USB2.0変換ケーブル

送料が価格(2000円ってのはAmazonで売ってるのに比較すると安い)の割りに高いなぁ、と思いながらもつい購入してしまった。ディスクはクラッシュするときはクラッシュするが、クラッシュしないやつはクラッシュしないからなぁ。

_ Flash Gateway

連続して呼びまくると、最後の呼び出ししか受け取れないことがわかった(ソースでは確認してないが、実際、そう動くんだからしょうがない)。RPCではなく、1個しかバッファが無いキューを利用するというような実装なんだろうか。具体的には
new Ajax.Request('/foo/bar/', {
    asynchronous: true,
    onComplete: function(response, json) {
        var a = response.responseText.split(';');
        for (var i = 0; i < a.length; i++) {
            flashProxy.call("fooBar", a[i]);
        }
    }
});
というようなコードを書くと、配列の最後だけが受け取れる(サーバーから受け取るデータは、"command=value;command=value……のように組んである。別にXMLで組んでもいいし、JSONでも良いのだが、シンプルなデータにはシンプルな伝送形式)。
そこで、JavaScript側でばらさずに、flashProxy.call("fooBarAll", respone.responseText);と呼び出して、Flash側で分割させようとしたら、getURL("javascript:...");と同様な長さ制限もあるみたいで(というか、あるんだけど、これもソースでは確認してないし、1バイトずつ伸ばしてテストする気はないので、何バイト以上はだめというような確定的な情報ではないわけだが)ある時点から反応がなくなる。
そこで、ひとつ考えたのは、Ajaxではなく、Flashの中で、XMLSocket使う方法。一見うまくいきそうだが、考えてみたらポート80なんだな相手は。crossdomain.xmlのことを考えると面倒だし却下だ。
次にIFrameにgetURLして……どうやって読めば良いのかわからないので、これもだめ。
最後にMovieClipを作って、そこへloadVarsする方法を考えた。これはうまくいくのは間違いなさそうだが、なんだかなぁ感というか微妙な敗北感が漂う。というかURLエンコード/デコードするの面倒だし。
で、やっぱりFalshProxyを使う方法で、
new Ajax.Request('/foo/bar/', {
    asynchronous: true,
    onComplete: function(response, json) {
        var i = 0;
        var a = response.responseText.split(';');
        var oInterval = setInterval(
            function() {
                if (i < a.length) {
                    flashProxy.call("fooBar", a[i++]);
                } else {
                    clearInterval(oInterval);
                }
            }, 100);
    }
});
これはこれで、タイマーの間隔を短くすると歯抜けになったりするんだが、とりあえずここまで。

2006-10-19

_ おもちゃ(ホワイトボード)

中途半端だけど、出してみよう(というか、RailsChatでは出してるけど)。

http://wb.arton.no-ip.info/

Rails+Juggernaut改(Tigerbaumkuchen)+Flash(Motion-Twin)+PureImage改+Flash-JavaScript で作ったホワイトボード。すみからすみまでオープンソース(Flash-JavaScriptのライセンスはフリーじゃないけど、多分オープンソースコンパチっぽい。後は全部MITまたはMIT改)、コンパクトな実装、でも見た目は動きゃいいという投げやりモード全開なので、とっつきは悪い。

svnレポジトリ

環境: Flash7以上が必要なはずだけど、8以上じゃなきゃ動かないかも。ポート8080でサービスしているTigerbaumkuchenから受信するので、8080から外に出る必要がある。

使い方:フラッシュ(ここでは640×480の白い領域)上でマウスをクリックしながら書くと書ける。でも、1回あたりのストロークで保持できる座標情報は4000バイトまでなので、あまり長い線を書くと無視される。

右クリックでメニュー。Penはペン、Eraserはイレイザー(黒板消し)、Snapshotは現時点の絵を別ウインドウで表示、Downloadは現時点の絵をダウンロード(ただし、IEだと画面遷移するので戻る必要あり。Firefoxだと問題ないんだけど)。Newは現在の絵をクローズ後アーカイブ化して新規にオープン。

アーカイブは、http://wb.arton.no-ip.info/whiteboard/listから参照可能。

なお、このサービスは突然終了したり、ハングしたりする(多分)のでそのつもりで。

その他:消しゴムのアイコンは、のりおさんが作ってくれた。PureImage改の改の部分については、サムネール化がへたくそだとか、線の太さの変え方がおかしいとか、座標を扱うプログラムはど素人というのが丸出しなのでちょっといやんとか。


2006-10-20

_ しゃー

ついじゅうしねー(そのうちリンクは切れるが、すでに多分「か」の縦棒を取り損なったのかリンクが切れてる)

当初予期せぬ使われ方でおもしろい。

_ ちょっと先が思いやられる

ms download manager

どうしてこう、MSはMSなんだろう。

_ 行くぞ

初夏のやつは直前になってすっぽかさざるを得なかったけど、今度は万難を排して行く(つもり、とちょっと弱気だけど予約は入れた)。

Seasar Conference 2006 Autumn - 11/12(SUN), Tokyo

_ Vistaへの道

やっとAMD64x2マシンが届いたのでRC1をインストール。ただし調子に乗ってX64版だ。

でちょっといじっただけの感想。

山ほどあったグラフィックハード屋さんの淘汰やアプリ屋さんの淘汰やパソコンハード屋さんの淘汰の果てにマックじゃなくてガラパゴスじゃなくて……つまり何て言うか……Vistaがある、と。

美しい。

_ 社会的コンセンサス

「みんな」が意識的にそれが「正しい」と合意してよろしくやるという期間が、無意識にそれが「当然」(つまり「常識」)となるには必要なんだろうなぁ。

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

_ るいも [IBM JDKの、どこかのバージョンのインスーラでも、フォントが横になっているのがありました。多分中途半端に日本語知..]

_ arton [ありそう>知ったか縦書き(ダイアログ全体も90度回っていればそれはそれで……今度はパス名とかがだめか)]


2006-10-21

_ スパークス

第1部

ハロー・ヤング・ラヴァーズ(スパークス)

プロジェクタに投影した人物と舞台上の人物(で、それがロンだったりするわけだが)の掛け合いがおもしろかった。最初、プロジェクタが見えたときには、PILのRitzライブみたいなのをやるのかと心配したが、ローリーアンダーソンみたいな感じだったので一安心。

(実は、スパークスを知ったのは奥平イラのモダンラバーズだったりするので、ここでラバーズという言葉が出てくるのが僕にとってはちょっとした符丁になっている)

エレファント・マニア (思索カセットブックス)(奥平 イラ)(へー、こっちはまだ入手できるのか)

第2部

アッチューって、ハクションに聞こえるなぁ。アチョーという訳はちょっと変じゃないか?

Propaganda(Sparks)

モロダーサウンドのシーケンサーのような細かいカットを延々と情熱的に刻み続けたベースの若者が気に入(な)った(腱鞘炎になったりしないのかな)。機械にできることは機械にさせるべきとは思うが、ライブはライブだから人間がやることに意味があるのかも。いい音出してたし。

アマチュアアワーは最初のアンコール。

キモノ・マイ・ハウス(スパークス)

未来は未来。誰も見たことはない。そりゃそうだ。

で、最後はアコースティック(音は。実際にはシンセサイザーだけど……電子ピアノかも知れないけど)バージョンのディックアラウンド。

Dick Around/Waterproof(Sparks)

前座の捏造と贋作も良かった。

捏造と贋作(上野耕路&久保田真吾)

_ スポンジ野郎

self absorber

確かに、こういう言い回しはあるような(「もしかして」も出てるけど)

_ 人件費の削減

ガソリンスタンドをセルフにすることで、人件費は削減できる。しかし、ボンネットを開けてオイルが汚れてるとか、ブレーキオイルがやばいとか、バッテリー液を補充したほうが良いとか、売りつけるチャンスは確実に減ってるわけだと思う。そういうのって、背中を押されて買うもののように思うのだが、違うんだろうか。

で、トータルで見て、コストが下がってもその分売り上げも下がってるのではないか、いやそんなことはないのか? ガソリンの利幅はものすごく小さいというのを聞いた覚えもある。逆にオイルだのバッテリーだのは利幅があると考えると納得が行くのだが。もちろん、スタンドの経営者はそれを勘案してセルフにするんだろうけど、セルフの機器の導入コストを回収できるんだろうか。場所柄、DIY派が多くてオートバックスみたいな店が近くにあれば、セルフにせざるを得ないということもありそうだし……それで郊外ほどセルフが多いのかな? 人件費は都心のほうが高いと思うんだが、実際には都心ではセルフのガソリンスタンドをあまり見かけないわけだし。


2006-10-22

_ Vistaをちょっと使う

x64版は、ドライバーが無かったり無かったり青くなったりいろいろ問題があったので、ちょっとやめることにして、x86版を再インストール。

かってないほど、エクスプローラのデフォルトがシンプルになったうえに、何かやるたびに本当に良いのかと聞かれまくりな上に複数のことを同時にやっていると聞くやつがどこかバックグラウンドに回ってしまって見つからなくなってとまどったりとかして、環境の整備がなかなかできないのだが徐々に環境もできてきた。

で、使ってみて画面がきれいなのは別にして、一番、気に入った点、それは音量の調整がアプリケーション単位に設定できるようになったことだ。

これまでだと、音が小さいCD(プリテンダーズとか)のために、音量を上げておくとBecky!がメールを受信すると雷鳴の如く音が鳴ったり、ちょっとモーダルダイアログの後ろのタイトルバーをさわると、スピーカーが破れるんじゃないかというような音でDing!とか鳴り響いていたのが、別々にできるようになった。で、メディアプレイヤーには適正な音量、Windowsシステムには限りなくゼロとか(無しにするとそれはそれで不便なんで無しにはできないのが、上で書いた問題点の根源なんだが)割り当てられる。これは本当にありがたい。

しかし、ホームユーザー、ビジネスユーザーのようなテンプレートがあるみたいなんだから、デベロッパーってのも用意しておいて欲しいな。最初からありありモードのエクスプローラとCMD(sudoなエクスプローラとCMDも)をクイックスタートに登録しておくとか、管理ツールも最初から表示、コントロールパネルも同様とか、そんな感じのやつ。


2006-10-23

_ ビスタン

時々、Explorerがハングしたり(実際には考え込んでるだけかも知れないけど)することがあるなぁ。というか、XPの時もそうだったけど(圧縮フォルダーとか)まだ、何がなんだかわからないので、手が打てない。

_ mputさんのRubyConfレポート

1日目

2日目

?日目

英語の聞き取り能力があって、その言語のこと良く知っていて(悪い点も良い点も)、RubyConfへ行って、しかもそれを日記にレポートしてくれる(さらにはバグとかリリースの管理もしてくれて苦言まで呈してくれるわけだが)んだから、得がたい人物だよな、とつくづく。ありがたいことだ。ありがとう。

以下、微妙な問題(多面的な見方ができる)について。

mputさんについて語られたこと:リリースは政治パフォーマンス?

を読んで以下のような脳内カテキズム。

・その発言のその書き方だけを取り上げると、そりゃ、なんじゃいと感じるのはわかる。

・しかし、その背景や経緯まで見てれば、そりゃ、愚痴のひとつも言いたくなるだろうというのもわかる。

・人によって発言のポジショニングとかそのスタイルとかもあるしね。

・そのへんの事情を知らずにけちをつけるのはいかがなものか。

・では、そういったことすべて知らずに感想を述べてはいかんのか?

・言論は自由ですね。

・ってことは、部外者と部内者で発言には軽重があるということでFA?

・それって、内側の人による参入障壁?

・いや、それは違う。参入障壁とか、バリアとかではなく、それはやはり語るにあたっての知識の問題。

・その「知識」ってのがなければ口を開いてはならんのか?

・言論は自由ですね。

・でも、外野の意見は軽くみるってことだよね?

・それは内容に依存する。拘泥している人には無い新鮮な視点を与えることだって可能だから、やはり意見は多いほうが良い。S/N比は低くなるかも知れないが、それはオープンであるということの証明じゃないだろうか。

・っていうか、ネガティブな物言いする場合には、謙虚に知識を埋めてからにしたほうが良いかも。

・でも、それしてしまって妙に事情を斟酌すると、外部からの新鮮な視点ってものが失われるかも。

・まあ、そうは言っても歴史は進む。

・普段の行いがものを言い、見てる人は見てるという信頼を持つことが重要かな。

追記:2005年RubyConf(これ読むと、無線LANの調子が悪くて(2006年のにもそんな記述がある)IRCがうまく動かなかったのが逆に良かったらしい)

IRCから採録

キーノートとかDSLの書き方とかおもしろい、16日

State of Rails by DHHがあった17日


2006-10-24

_ DELL E521

9月下旬お届け予定が10月中旬にまでずれこんだのは不快だったが、来てみたら、これはいいなぁ、とても良い。

まず、静か。猛烈に静かで、動いてんだか止まってんだかさっぱりわからない。と打ち込んでるんだからもちろん動いてるんだけど。

これがAMD64x2のおかげなのか、SATA360Gのディスク(WDだな)のせいなのかはわからないけど、とにかく静かだということ。以前買ったPrecision470とは比較にならない。(どちらにしても、arton.no-ip.infoサーバーのHDDがうるさいから全体としてはうるさい部屋なんだけど)

で、十分に早いし。グラフィックはしょせんオンボードだからそれなりだけど、VistaのRC1については、ストレスは感じないな(エクスプローラが黙る件は別として)

筐体が取り回しやすいのは、DELLの特徴だと思うのでこれもOK。色はそれほど好みじゃないがしょうがない。

もっとも早いといっても、数値からいくとしょぼそうではある。Vistaのおもしろい点として、コントロールパネルに「お使いのコンピュータのパフォーマンスの評価と改善」というのがある。

この結果が、

・プロセッサ 4.8

メモリ 5.1

グラフィックス 3.4

ゲーム用グラフィックス 3.0

プライマリハードディスク 5.4

という結果になっている。で、5.xというのがあるくらいだから、グラフィックスの3.xというのは十分に低そうだ。

というわけで、むしろ、今となってはPrecisionのほうが失敗感が漂っている(だって、E521にメモリー詰め込めばそっちのほうが良かったわけだから。でも筐体のデザインや色はL887と似合うしPrecision470は好きだ)。やっぱ最後のネットバーストXeonをつかんだのが間違いだったかも。でも時期的にしょうがなかったしな。

_ AHO

きたよ3Dドラゴンブック。

重い、でかい、厚い。こりゃ晩飯食いながら読むべき本だが、晩飯キューにはまだ、時をかける建築(時かけ本――間違ってるけどそれ)が詰まってるんだよな、とはいえ、いよいよ核心を越えて(パターンランゲージを整理して、無名の質に迫りつつあるところ)来たので先は見えた。というか、深いなぁ。最初のいかさまタオイストから、より技術的見地に立った論議を通過するんだな、ちゃんと。いや、でも伝統を重視するのはどこまで当を得てるんだろうか、とかいろいろ思うところはあるんだけど、確かに提示されているパターンには納得が行くものもあるわけだし。パターンが有機的に結合し、複雑に絡み合うという点は重要だと直観的にはわかるんだが。この歯がゆさというのは、モデルにならないからなのかな? とか。

_ trac 0.10 バージョンアップメモ

終わって数日、覚えてる分。

trac 0.10をダウンロード。UPGRADEを読むとそれほど面倒はなさそう。

まず、/usr/local/lib/python/site-packages/trac を削除(は怖いのでとりあえず名前を変えておく)

/usr/local/share/trac のcgi-bin、htdocs、templates、を削除(は怖いのでとりあえず名前を変えておく)

次に、python setup.py install を実行(展開したディレクトリで)

DBが変更されているので、

trac-admin プロジェクトのフルパス upgrade

Wikiページも変わっているので

trac-admin プロジェクトのフルパス wiki upgrade

で、最後にapache reload。

で、これは良いのだが、肝心なspam-filterは別立てなので、こちらのインストール。

よくわからないので、とりあえず python setup.py とやるとエラーになる。easy_installがインストールされていないからだ。で、グーグルで探して http://peak.telecommunity.com/DevCenter/EasyInstall からダウンロード、インストール。

で、http://trac.edgewall.org/wiki/SpamFilter のあたりを読みながらtrac.ini に書く。次にspam判定語を登録したBadContentというページをWikiに作る。登録は最初のコードブロック({{{}}})に1行1正規表現として記述。よくわからないので、GoogleでBadContentで検索したら、そのものずばりのtracのBadContentページが結構ひっかかるので、それらを参照して作成(というかほとんどコピペ)。

とか、そんな感じ。でもBadContentはWikiへの書き込みチェックには使うけど、ticketには適用されないみたいだ(実験では適用されなかった)。で、ticketについてはしょうがないので認証を使うことにする。

#公開コンテンツのキット(広義のCMSになるのか?)を開発し、提供する場合には、最初からspam対策を仕込んでおくべきだな。絶対にspamが来るんだから、最初のリリースから含めておかないと、結局後から対処することになるし、その時点ではspammerの爪あとはもう残されてるわけだし。

#というわけで、相変わらずpythonのソースをまったく見ることも無く使ってるんだが、これはやはり強いな(もっとも、easy_installでは引っかかったわけだけど)。

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

_ discypus [あえて補足するなら、古いのを削除するとき /usr/local/bin の trac-admin, tracd や ..]

_ arton [そうですね。あらかじめ消しておいたほうが安心感はありますね。 多分、tracのUPGRADE(上の元ネタ)を書いた人..]


2006-10-25

_ KVMの買い替え

最初

ATEN 1対4 CPU切替器 VGA/USB/USB/USB HUB CS-104U(-)

を買おうと思ったが、良く見るとケーブルは別売りとなっている。

だったら、オールインワンのほうが楽じゃん(とりあえず1台だけとかいう運用だと話は別か)。

というわけで

エレコム KVMスイッチ USB VGA 4台 KVM-NVU4(-)

こっちを注文。ついに、PS2と別れを告げることになった(E521にはPS2コネクタが無いので、今はキーボードが入り乱れててとんでもないことになってるのであった)。

追記:ACアダプタが必要になるのか……うれしくないな。

_ Ruby Java Mapping

Metaprogramming with Ruby: Mapping Java Packages Onto Ruby Modules

なんか、宿題が出たらしいので、明日、読む。

_ 内と外

やっかいだなぁ、やっかいだなぁ。と呪文を外からかけると直るかな?

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

_ ムムリク [RSS の URL がまたモンド紙になってしまっているような感じです。http://monde/diary/ 謎。]

_ arton [あ、了解です。すみません。明朝までにはなおしておきます。]


2006-10-26

_ ナチュラルごーや

こんだ、ASP.NETだ。最初Railsでやろうと思ったんだけど、Webサーバーを仕込む時間がとれなかったから、IISで素直に動くASP.NETに決定。

しかしデフォルトがVB.NETなんだな(IISでASP.NETサイトを作ろうとするとそうなっている)。

でもC#だ。

で、データソースを作って……と思ったが、画面とデータベースがえらく異なる。表示上の問題で横を日付にして縦をキーにしてという、テーブルを横縦に展開したような感じとなる。日付ごとに集計するようにSQLを組むことも考えたが、ちょっとあまりに複雑になりそうなんで(行は行で集計したりするからグルーピングが必要だったりいろいろ)、結局、一度TableAdapterから読み込んだRowSetを元にオブジェクトコレクションを作って、それをGridへデータソースとして与えることにした。

とかやっていて、それがモデル層のエンティティとプレゼンテーション層のエンティティの分離だな、と思ったということ。

それにしても、ADO.NETでもコードは書かない。SQLは書くけど。特にASP.NETの場合はデータセットもXMLが生成されるだけで実行時に動的にバインドされるから(ただし、型付けは行われるのでソースはまったく見えないのにインテリセンスは利いたりして、これはこれで独特の世界でおもしろい。クェリデザイナのインテリぶりもすさまじく、どう考えてもデザイナでは作りようがないようなSQLを解析していろいろやってくれる(このへんは、SQL ServerからSQL解析部を利用するようになっているのかも))ちょっととまどったり。Windowsアプリケーションの場合はコードが生成されるから再利用性(トランザクションのサポートの追加とか)も高いんだが、そのへんが逆に弱いんじゃないかと思ったり。

それにしてもASP.NETでのコード記述量の少なさも圧倒的で、セッションへ明示的に保持することとPreviousPageのためにプロパティをコードする程度で、あとはSQL書くことを除けばほとんどツールだけいじっていれば済む(CSSとの連動は弱いかも。あと、Calendar使って思ったが、はやくAjax(Atlas)連携してほしいかも。いちいちポストバックするのでフリッカーが今となってはすごく気になる。


2006-10-27

_ こういう考え方もできる

さて、2年以上OS XというかMacとも付き合ってきたわけだが、これが良い点はベターなUnix(語弊があるけど、まあ気にするな)でもあるという点だと思う。さくっとmake installできるわけだし。

でもさくっとmake installできるとか、X端末として使えるとかなんてこた、10年以上前からUnixでは、というかLinux 0.9.8あたりからでもできてたことで、別段大した話じゃない。でも、それ以外にも良い点がOS Xにはある。早い話が画面がきれいだ。フォントがきれいだ。

だったら、ベターOS XとしてのVistaという考え方もできる。何しろ、画面はきれいだが、それ以前にWin32APIが使えるし、CreateObjectとかActiveXObject.newとかも現役で動く。IE7も良い。

#Vista RC1を使っているうちに、PowerBookをMacBookに買い換えようという意思がすごく薄まっていることに気づいたのであった。

_ 嘘RSS

まあ、やってしまうことはあるなぁ。

_ 誰もが通る道。でも今は高速道路があるので通る人はほとんどいない

こんなの買って読んだな。(実際には、MicroEmacsをAmigaからPC9801に移植して覚えたのであった)

これは、単純なラインバッファ+リンクドリスト方式で、行を現す構造体をcellと呼んで削除されたらリンクから外して、メモリーが不足したら有効行を詰めて回収する仕組み。

というか20年前の本なので、最初に1ページ使ってunsigned charが無い環境でコンパイルするために、CHARというマクロを定義して……というような苦労話が出ていたり。

#そうか、おれが書く本の原点にはこういうプログラム解説の本があるんだな、とぱらぱら読み返していて思った。


2006-10-28

_ NETアプリケーションにリモートオートメーションを付ける

必要がでてきて、ちょっと考えた。

たとえば、定期的に何かする静かなアプリケーション(UIと言えばタスクバーの通知領域にアイコンがあって、たまに「エラーになってるからログ見てくれ」とか吹き出しが出る程度のやつ)が今何してるか知りたいとする。

クライアントは、HTAとかだよな、やっぱり、と考える。

すると逆向きCOM Interopってのが候補に挙がる。

が、なんか違う気がする。大体、後からノートPCをHubに差し込んで調べるというようなこと考えると、危険極まりないDCOMの利用になってしまう。それは、最悪の場合に最悪の事態となる。

ではRemotingって……相変わらずVisual Studioのサポートないのか。却下だ。

Webサービス……「追加」からは選べないな。

で、System.Net.HttpListenerを使うことになる。

使い方は簡単。送信情報に秘匿すべきものがなければ、ほとんど何も考える必要すらない。エフェメラルポートの衝突は怖いけど(ないわけじゃないんだな、これが)、まあ、多少のリスクは抱えてもしょうがないと割り切る。(追記:80でも良いのだがなんとなく別にしたい)

ただ、ワーカースレッドとか勝手に作ってくれないし、基本は一発勝負型なので自分で再要求したりしないといけない。最初、ちょびっとはまった。(続く)

_ 常駐するプログラム例

たとえば、こんなプログラムを作るとする。
10秒ごとにカウンターは増えるが外側から知る術がない。
っていうか、終わらせることもできない(終わらせるための準備はできているけど)。
using System.Threading;
public class Counter
{
    volatile bool stop;
    volatile int counter;
    public void Service()
    {
        while (!stop)
        {
            counter++;
            Thread.Sleep(10000);
        }
    }
     
    public static void Main()
    {
        Counter c = new Counter();
        c.Service();
    }
}
このプログラムが、外部のプログラムに現在のカウンター値を教えるようにできることと、いざとなったらきれいに終わらせられるようにすることがやりたいことだ。

_ HttpListenerによる外部インターフェイスの提供

というわけで、HttpListenerを使う。それにしても無名メソッドが使えるおかげでいちいちハンドラに無用な参照を与える必要がなくなったのは大いに結構なことだ。
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
public class Counter
{
    volatile bool stop;
    volatile int counter;
    volatile HttpListener listener;
    public Counter()
    {
        listener = new HttpListener();
        listener.Prefixes.Add("http://*:9020/counter/");
        listener.IgnoreWriteExceptions = true;
        listener.Start();
        Listen(); // 再実行するので別メソッドにしておく
    }
    void Listen()
    {
        listener.BeginGetContext(delegate (IAsyncResult ar)
         {
             if (stop)
             {
                 return;
             }
             Listen(); // 次のリクエストを受け付けるようにする
             HttpListenerContext lc = listener.EndGetContext(ar);
             lc.Response.ContentType = "text/xml";
             TextWriter w = new StreamWriter(lc.Response.OutputStream,
                                             Encoding.UTF8);
             w.WriteLine("<?xml version=\"1.0\"?>");
             w.WriteLine("<Counter>");
             w.WriteLine("  <value>" + counter + "</value>");
             w.WriteLine("</Counter>");
             w.Close(); // MSDNのサンプルだとCloseを呼んでるので真似。
             if (lc.Request.Url.Segments[lc.Request.Url.Segments.Length - 1]
                 == "quit") // C#とJavaの最大の差
             {
                 stop = true;
             }
             lc.Response.Close();
         }, this);
    }
    public void Service()
    {
        while (!stop)
        {
            counter++;
            Thread.Sleep(10000);
        }
        listener.Stop();
    }
    
    public static void Main()
    {
        if (!HttpListener.IsSupported)
        {
            Console.WriteLine("Buy Windows XP SP2 Now !!!");
            return;
        }
        Counter c = new Counter();
        c.Service();
    }
}
これで、http://localhost:9020/counter と呼べば現在のカウンター値を参照できるし、http://localhost:9020/counter/quit と呼べば実行を終了できる(最大10秒待たされるけど)。
なお、ここではHTAをクライアントとして想定しているから、VBScriptで手軽に扱えるtext/xmlを返しているが、jsonとかでも良いとは思うし、open-uriを想定すればYAMLというてもある。
本日のツッコミ(全2件) [ツッコミを入れる]

_ きしだ [JMX使うのが一番便利かな〜と。]

_ arton [サンプルソースきぼんぬ。]


2006-10-29

_ 昨日の続き

WMIでやってみる

おお、どんな感じなのか楽しみです。(クライアント側はわかるけど、サーバー側の実装方法は知らないな、そう言えば)

_ Instrumentation

なんか違和感がある名前だなと思うのは、条件反射的に楽器を考えるからだな。

それはそれとして、WMI版

なるほど、これはイージーだ(と思わずカタカナ)。

でもCRUDのRだけなのか……? と疑問に思ってちょっと試す。確かに、Wbemtestにメソッドは反映されないなぁ。

_ VS2005のだめな点

どうもイミディエイトウィンドウが動かないと思ったら、おそらくバグだと気づいた。

例)Debug.Print 1 と入力してEnterを押す。何も起きない。カーソルが次の行へすら進まない。はて、とCtrl-Mを押す。次のストロークをしろとステータスストリップに出てくる。はて? 何かインストールミスのようだなとあきらめていた。

ワークアラウンド)キーコードをEmacsから標準へ変更すれば動く。む。使えないね(コピー&ペーストもこれが臭い、実に臭い)。キーコードを変えれば編集はまともにできなくなるから、使えない。かと言ってEmacsのままだとイミディエイトウィンドウが使えない。結局、使えない。ゴミだな、この点に関しては。それはそれとしてインテリセンスの予測はなかなかすごいものがあると気づいた。が、100%じゃないと意味ないということに気づく。期待しないものが入力された場合の修正の手間が1%でもあれば、普通に打ち込むほうがストレスを感じないからだ。

というわけで、どうしようかと思ったがとりあえず「Microsoft Visual Studio 2005 品質および機能に関するアンケート」にご協力のお願いに、文句を書いてみたり。ちゃんと反映されるかなぁ。しょせんアンケートで多国語化にしか興味ないみたいだし、あまりあてにはならないな……


2006-10-30

_ RjbJdbcAdapter

いつの間に! (ありがとう)

試してみたいが、今は我慢。

RubyForgeからリンクを張ろうとしたけど、なんかhttpsが繋がらないなぁ。

_ 百年恋歌

うー、すばらしかった。時代の描き方の集大成というか。

特に60年代がやっぱりすばらしい。可能性としてはホウシャオシェンがその時代に成人したから一番感覚がしっくり来ていることか、またはこっちの記憶のルーツがあの時代だからしっくり来るということもありえる。

でも、それにしても、たとえば服の風に対する動き、色、船の上のポーズとそのシルエットといった演出に依存している部分について考えると、それだけじゃない気がする。

あの時代の服の風合いが、適当なぷらぷら加減が、映画にマッチするのかも知れない。

塀の向こうに突き立つ地名の看板、行く先々で次の行き先を告げられる流れ、道路の線の動きが無いロードムービー。抜群だ。

で、次に現在が初めて本当にしっくり見られた。ナイルの娘の暗いばかりでごちゃごちゃしていた感じ(で、内容はさーぱーり忘れた)に始まって紆余曲折があってミレニアムマンボで光の使い方が時代に追いついたのかな、という感じの先に、こう来るのか。台湾ゴスかぁ。これもバイクに乗る人間の服のシルエットがまず美しく、風を撮るのが本当にうまいと感じる。思わせぶりにいくらでもできるのに、そうせずに、ただそこにあるものをそこにあるように撮るってのは難しいだろうなぁとか思いながらも、そこに居て傍観しているような複雑な味わい。まさに映画だ、満足した。

ホウ・シャオシエン監督 『百年恋歌』 [DVD](スー・チー/チャン・チェン)


2006-10-31

_ Majerus.net Active Shell

MAS.

ASRをJScript、VBScriptの次に置いてくれてるので紹介。
こんな感じで使える。

MAS JScript> var x = new ActiveXObject("Microsoft.XMLHTTP");
MAS JScript> x.open("GET", "http://www.yahoo.co.jp", false);
MAS JScript> x.send();
MAS JScript> ? x.responseText.substring(0, 50);
<html>
<head>
<meta http-equiv="Content-Type" cont
MAS JScript> Exit();
あるいは、
MAS VBScript> Dim x
MAS VBScript> Set x = CreateObject("Microsoft.XMLHTTP")
MAS VBScript> x.open "GET", "http://www.google.co.jp", False
MAS VBScript> x.send
MAS VBScript> ? Len(x.responseText)
4,125
MAS VBScript> ? Left(x.responseText, 50)
<html><head><meta http-equiv="content-type" conten
MAS VBScript> Quit
irbのJScript/VBScript版として使えるかな(という意味ではirbがあるからASR版はいまいち使い道はないかも知れないけど)。


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|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え