著作一覧 |
圏外からのひとことへの突っ込みを読んでいて目からウロコが少し剥がれた。
ほとんどの事項で例え話は基礎知識のない人への有害情報になり得ます。
というような言明は特にスラドなんかでも目立つが結構見かける。
で、この突っ込み者は、以下のように例え話では無い話をして無害情報を出している。
うつ病の原因はまだ完全には確定していないのですが、脳内シナプス間の神経伝達物質(セロトニン、ノルエピネフリンなど)が枯渇した状態です。
基礎知識の無い僕には、「クリンゴンがバリンゴンに攻めてきた状態です」と書いてあるのとほとんど変わらない。(追記:要するに、この説明が正しいのか間違っているかまったく判断できないということ。ここで重要なことは、基礎知識がないのは本質的には興味がないからであり、したがって何を書いてあっても別にそれが正しいかどうか調べる気にはならないということだ。逆に調べる気がある人であれば何が書いてあっても調べるわけだから元の主張=例え話云々は無関係ということになる)
ところが、次の段では糖尿病に例えているがこちらの説明はわかりやすい。要するに最初の例え話ではない部分は単なるお経に過ぎず(したがって確かに無害情報ではある。何もわからないから)、次の例え話は知見を得られるから意味がある。意味がある情報はなんらかの影響を持ちえるから少なくても無害ではない。確かに。
注)したがってこのコメント者は、結局は例え話をしてしまっているのだが、それによって僕は多少なりとも知見を広げられた。したがって書き出しとは裏腹に良いことを書いているのだ。
ということは、例え話でない無害情報というのは、「素人は黙ってろ、どうせわかんないだろ? ほれほれ」という、口をつぐませるための方法論なのではないか? それにより素人がコモンセンスからの異議申し立てを封じ込めることによって無害化するという意図があるのではないか? それに反して例え話は有害というのは、素人が口をはさめる余地を与えるということなのではないか?
もちろん、素人は黙ってろという局面は多い。少なくても僕の分野に関してはそういいたいことは多い。だが、そんなことは知ったことではないのだ。つまり、ほとんどの場合、素人のコモンセンスってのは誤りかも知れないが、そのいっぽうで素人による異議申し立てにより世のありようが様変わりし、結果的に人類が得することがあるということもまた事実としてあるからだ。
また、専門家(特に医者だよ)の思い上がりによって誤った方法論が蔓延することだってあるわけだ。したがって例え話でない妄言(間違っているという意味では例え話よりも程度は低い)の可能性も未来から振り返ってみればありえる。例える必要もなく歴史的な事実を挙げれば、火傷の治療だの傷口の治療だのがころころ変わるのを目にしたし、胃潰瘍がストレスに由来したかと思えばピロロン菌になってみたりしてみたりしたのも見たわけだし、コレステロールが悪党だけから善玉がいることになりさらに基準値が上がったり(金銭的な問題かも知れず)、切ってみたり切らずに残したり薬を与えたり自然においたり、世界で最も信用ならない商売と言えば、医者と政治家というくらいのものだ。(君子は豹変すべきであるし、過ちて革めざるこれ過ちなりだから、ころころ変わるのは問題ない。ただ、その場その場で偉そうな=反論を認めないような口をきくのが問題なのだな。)
言えることはせいぜい、例え話は有害かも知れないが無害かも知れない。また、例え話でないとある時点で考えているものもしょせん例え話に過ぎないかも知れないし有害かも知れない。人はその時代とその人自身によって制約された範囲でしか何も語れない、ということだ。
というわけで、例え話大いに結構。毒にもクスリにもならない無害情報よりは、毒にまみれた有害情報のほうが百家争鳴を巻き起こせる分だけ望ましい。
あるいはこういう見方もできる。
人は自分の考え方に制約されるから、例え話を否定する人というのは、
・例え話によってミスリードされた経験がある
・例え話と主題を結合して判断することができない(から、他人もそうだと考える)
・類推力に乏しいため、例え話によって混乱する
・類推力が強すぎるため、例え話によって混乱する
のかも知れない。逆も真で、例え話をする人は
・例え話によって物事の理解が進んだ経験がある
・例え話と主題を切り離して判断することができる(から、他人もそうだと考える)
・類推力が適度なため、例え話によって与えられた心象によって対象となっている事物の認識を深めることができる
のかも知れない。
ものは言いようだ。
追記:意図的に有害/無害の二元論を出しているが、実際には直交した有益/無益があるのだ。で、無害/有益は実は屁のツッパリ程度にしかならず(印象に薄かったり、直接的な働きかけを出来なかったりしやすい)、有害/有益にこそ価値があるのではないかということなのであった。まったく、例は重要ですね。例題もなかなか難しいです。
さらに追記:元の題材が微妙な問題だったため、夾雑な内容になってしまいました。一応、書いておきますが「うつ病をどうたとえるのか、それは無害か」はまったく書かれた内容とは関係ないことです(ただし引っ張られたため医者の悪口が出てきたりはしているので、影響は受けてはいます)。しかし関係無いとはいえ、それが切り口になっているため、この内容によって気分を害されたかたもいるかも知れません。それについては軽率に俎上に乗せたことをお詫びします。
Yahooで2004-4-16を検索するとなんでこのサイトが1位になるんだろう? しかもキャッシュの色づけをみると真ん中の4は抜けているようだし。
Googleでは当然のようにそんなことは無い。
ふと思ったが、通常はキャッシュを除けば直接実際のサイトへのリンクを検索結果のアンカータグに入れるるのだが、ここをリダイレクトにすれば(とは言え、ショートカットの作成などに利用されると利用者側にとっては不幸かも知れないのでそういうのは無いだろうな、やっぱり)一覧表示した中からさらに人間がサマリーを見て選択することが多いサイトを集計することができる。それを重み付けに適用するという方法論もありそうな気がする。
日比谷を読みたくなったが手元に見つからない。いろいろ探しているうちに
が見つかったので会田綱雄を読んだりしたが(むつびあうというのはきれいなことばだとあらためておもう)、読みたいのは萩原恭次郎なのだ。それはそれとしてあらためて読んでみると田村隆一は良い詩人だな。
しかし見つかった。だがT-Timeビュワーが必要なのだ。面倒なことだ。とは言え、その理由はわかる。
言葉だけではないからだ。
言葉の限界に挑戦して、言葉から文字へと表現方法を転化させ、さらに文字からタイポグラフィを利用した視覚効果へと進めたために、詩であるにもかかわらず逆にテキストに収まらなくなってしまうということは妙な感じだ。
追記:どうも印象が違うな。!が多いぞ全体的に。特に日比谷は全然考えていたのと違う。どちらかというと1人先端を突き進むという前衛たる意思表示のようだ。そこであらためて会田綱雄を読み返してみたり。
MS-IME調べ。
今日は虫の日。無視の日。蒸しの日。無私の日。無死の日。蟲の日。生し(こう読んだ場合どういう意味になるんだ? 苔の生すまでの活用か)の日。寧(? わからん)の日。
なかった日
無始の日。夢死の日。苧の日。帔の日(虫の垂れ衣とは?)。
だから本文に書けば良いのに、ツッコミしやすいところだ。
つまりだ。クライアントに何かを説明するときに、「例え話は有害である」とか考えて、専門用語を駆使してもそれは独り善がりというものだ。相手の知識レベル(こちら=説明する側の専門については素人かも知れないが、しかし相手の専門については多分熟知している)にあわせて、相手の類推力に一定の信用をおいたうえで相手の言葉で語りかける、そのためには例示することが非常に重要なのだ。
したがって、専門家同士であればそんな斟酌はおそらく無用(冗談としては使えるが)、専門家になろうとしている人間に対しては用語の意味の説明を交えながらできるだけ平易にそのものについて語る、といった使い分けこそが重要なのであり、一般論(=不特定相手)の場合には、例え話こそ有益なのだ。
まず例えを考えるという思考過程により一般論として通用可能なレベルまで問題領域を汎化しなければならないわけだが、それにより語ろうとしているこちらが単に上っ面の用語理解だけでしかないのか、それとも真にその対象としているものについての概念を形成できているかを問い直すことが必要となる。その挌闘抜きにオマエラ勉強シロという態度が通用すると考えること自体がおこがましい。
#ちょっとどこで見かけたかわからないが、技術者が技術者に対して情報を発信する場合に例えを避けるのは、ある意味当然のことだ。それは専門家同士のやり取りなのだ。それにしても新たな概念や方法論あるいは思考法を発見した場合には、その理解を補助するために類推に頼る必要はある。それは、しかし一般論として語るというのとは全く異なる作業なのだから、できるだけ近しい事例を持ってきたほうが良いのも当然。逆にパラダイムがシフトするようなことであれば、突拍子もない例を適用することで1度衝撃を食らわしたほうが良いかも知れない。でもOOを語るのに人と動物と哺乳類だのを持ち出すのはカンベンな。
人を見て法を説けってこった。(コンテキスト重要といっても良い)
ここで、また医者を俎上に上げる乗せるが(これは逆に言えば医者という職業に敬意を払っていることの裏返しなのだがわからんだろうな)、どっかの婆さんやあるいは子供やあるいは呑気なトッツァンに対して、専門用語を駆使してインフォームドコンセンサスを得よう(なんか変だな。得るものじゃなくてするもののような。でもコンセンサスなんだよね? 情報を開示したうえで同意を取り付けるのだから得るでやっぱり良いのかな? 追記:というか言葉そのものを間違えていた。)としようとしたら、それこそが専門バカだ。相手に理解できるように考え抜いてやらなきゃならないだろう。事実は事実として説明するのは間違いなく必要だが、それを相手が理解できると考えたり相手がその知識を受け止めるだけ勉強すると前提することは誤りだ。客(=金を払ってサービスを受ける人)の目線に立つという作業ができない人間は、対人間の職業につくべきではない。(katoさんのツッコミは正しいと思います。問題は例えを使うかどうかではなく、相手に正しく意味が通じるかどうかですから。で、問題領域に対する知識を前提できない相手に対しては相手の知識で類推可能な範囲で説明することでその理解を助ける必要があるということで、そのための努力を専門家はしなければならない、すくなくても対面処理を行うためにはということも論点の1つです)
また、政治、法律、経済、生命に関することは、素人がいくらでも口出しできなければならない分野でもあるということをあらかじめ知っておかなければならないだろう。その素人談義によって専門家の観点から抜け落ちた貴重な考えが掬える可能性があるからだ(とは言え、ノイズがほぼ100%なのは間違いないだろうが、そのノイズを受け取る気構えなしに何かを広く語りかけようという姿勢がもしあれば、それはおこがましいということだ)。
#追記:別にそういった床屋談義の題材になりやすいものだけを取り上げる必要はなかったな。たとえば我々の分野においてもユーザビリティのように素人による異議申し立てが必須となる領域がある。
#さらに追記:違う違う論点がずれた。我々の分野は実行すれば素人にもすぐわかるのだ(除く:サーバーサイド処理)。だから口は自由にはさめるのだ。しかし、非常に高度な知識を前提とするものにおいては、口を開かせるべく努力が必要になるのだから土俵を与えなければならないのであった。あるいは逆に土俵が作られてしまうことを厭ってはいけないということなのだ。(さらにさらに追記:って言うか、床屋談義になるくらいなんだから最初から口を挟めるのではないか? と考えてはいけない。床屋と客が話してもそれだけでは意味があまりないからだ。とは言え破片なんだから論点がずれても構わないのであった。)
#またまた追記:モデリングってのはそういうことなんだな、うん、と納得。
イーテックって読むのだと高速道路のSAやPAに貼ってあるポスターとかに書いてあった気がするんだが、イーテックって言ってもまったく通用しない(対自動車屋さん、対JAF)。
イーティーシーなら通用する。
イー電みたいなものか?
日本道路公団のETC FAQには、「イー(Electronic, Economy, Ecology, Elegant, Expressなどの頭文字E(イー)) とテック(Technology)の造語」とか書いてあるから、さすがに「良いテクノロジー」では無かった。
しかしエレガントだのエコロジーだのと言われるとバカですか? と聞き返したくならなくもない。でもExcellentとかExtremityとかExodus(なんのこっちゃ)とは言わないところが奥ゆかしいかも。
とりあえずExpensive Technologyではないと思いたい。50000円前払いでで8000円の利息がつく勘定だし。
それに、まだ今のところは行列からのExodusが可能ではあると思うけど。
マイカー奮闘編の人もイーティーシー攻撃を受けたらしい。
やだという人もいたり。
平成13年の寂しいページ。しかし今何年かわからないから何年前のことか実はわからない。
SQLをシーケル、SCSIをスカジー、BIOSをバイオス、Symbiosをシンビーオス、IEEEをアイトリプルイー、Cthulhuをクートルとかクリトルリトル、CBOPをシーボップ(でUMTPは何て読むんだろう?)、comme ca du modeをコムサデモードと呼べるんだから、ETCをイーテックでいいと思うんだけどなぁ。
ちなみに本意は「ETCとは"Electronic Toll Collection System"の略称」(上記FAQより)とのこと。電子的通行料収集システムですか。
なんでETCSにしなかったんだろうか? というところで、LSIは実際にはLSICだろうごるぁと怒って見せた大学時代の先生の顔を突然思い出した。
E-TollColl縮めてE-TOCOとかどうかな? イートーコーと読む。
同意。したがってある意味においては相当口惜しいような感じ。
それにしても、この日のエントリーは、例外:ひがさん、あなたはわたしですか? というくらいに同意。テスト:詳細設計書という言葉の示すものが違うかも知れないのではっきりとはわからないけど、どうも同じ考えをもたれているようだ。ロジックの位置:興味深い。
例外については、Javaが最初のころのインタラクティブなプログラミング言語(Swingアプリケーションが代表)の頃の名残が強くて(FileNotFoundExceptionであればそれはキャッチしてユーザーに問い合わせるべきでしょう)、サーバーサイド時代の手法がきちんと確立してないってことではないかとも考えられるけど(サーバーサイドで存在を前提としたファイルがFileNotFoundExceptionなら処理は継続できないでしょう)、MVCでいうとMとCの微妙な境目、BCEなら文句なくCの部分で例外を一律キャッチというのが基本(処理内容によっては再試行可能なものもある)だと思う。
全然、オブジェクト指向的では無い構造化型の機能分割によるオブジェクトによる責務分割というのを考えて
コントローラ → エンティティ
↑
ビジネスルール(集) --- 機能の固まり
ビジネスルール(集)というのは、ビジターのようなもの(パターンではなくオブジェクトの分割手法として)を想像すれば良くて、(この場合エンティティの)外部のオブジェクト(1対多である)なのだが、ある特定の(この場合エンティティの)オブジェクトに対する操作の権限を持っていて、それを組み合わせてエンティティ自身に実行させる(のはコントローラの役割)というような感じに実装できるのではないかと、まさに現在やっているところだったり。(追記:デザインパターンだとストラテジパターンに近いのだが、コンテキスト(これが上だとエンティティに当たる)が、ストラテジに対して自分を与えるだけという点が本来のストラテジとは異なる――エンティティはストラテジが自分に何をするのか基本的に知らない――したがって関連性はエンティティがthisを与えるという点を除いて単方向――ストラテジ側からの操作――になるので、コンテキストがアルゴリズムを集約するストラテジパターンとは異なる。)
まあ、日本にはひがさんがいるので、ロッドジョンソンはいらないな、というところか。
を忘れないうちに。
といっても、とっくに誰かが言っていて、誰もが思い当たっているだろうけど。(ちょうど羽生さんも書いてる)。
Webブラウザーがのしてきたころに、クライアントOSなんてなんでもいいじゃん(というか不要説まで出ていたような)、Webブラウザーが動けばさ、みたいなのがあったわけだが、それ以上に(というのは結局、クライアントでワープロ、プレゼン、表計算が必要で、これらは現時点では代替できないわけだから)、サーバーっていうのは、Webサーバー(+Webアプリケーションを動かす仕組み)が動けばサーバーOSなんていらないじゃん、というのが言えるのかもと思った。
JavaOSというOSを想像した場合、現時点ではクライアントマシンでは使えないという結論になるかも知れないが、サーバーであれば、それでOKなのではないか? (DBMSサーバーは別か)
そういえば、Windows2003サーバーではIISの一部はカーネルに回されているわけで、そのへんの対応の早さはやはりMSだ。
#今日のトリビア(ogijunさんから聞いた話):最初のWebサーバーはNextNeXT上に実装された。
弔旗なのか? (なんのことだか後で読んでもわかんねぇな。でもそういったたぐいのことについてなのだ、と書いておけば思い出せるかも)
まだ頭の後ろに重い空疎感(この矛盾こそ病気だな)があって振ると前から何かが転がり落ちて痛かったりと両脇のなんかの節のことろに圧迫感があったりするが、音楽を聴ける状態になった。
というわけで届いていたジョンケージを聴くことにする。
民主主義国家で教育が義務(権利でもある――日本の場合、親は子供に教育を受けさせる義務を負い(かつ国家は義務教育については無償とする)、国民は能力に応じた教育を受ける権利を持つ)なのは、国民が権利者としてその国体を護持する必要があるからだ。直接の国家運営を行わない(その意味で非常に弱い)権力者である国民が国体を護持するためには、委託によって直接運営を行う(そのため、談合を抑制するために分立させるのだがそれにしても圧倒的なしかもその抑制機構は多くの場合効率化を名目に骨抜きにされてしまいやすい、または既に骨抜きにされている)権力が国家を私物化することができないように努力しなければならない。
すぐれた直接的な権力者は長期的には民主主義政体であれば国体を長期に渡って護持できることがわかっているので妙なことをしでかさない可能性があるが、劣った直接的権力者は短期的な視点で運営を行ってしまう可能性を強く持つ(国体の生き残り戦略)。たとえばある特定の時点では絶対主義は効率が最大化されることは自明であるが、そのためには絶対者が無謬性においても絶対でなければならず、それは現実にはありえないことだが、それを優れた為政者(=直接的な権力者)は了解できるが(にもかかわらずあえてそれを選択しなければならない局面もまたありえる)、劣った為政者は了解できない(したがって権力の強化を常に目論む)。単純な例では、国体を強くするには領土を広げれば良い。そこで非常に質が低い為政者は領土を広げるために愚直なまでに直接的な行動を起こしてしまう。正気とは思えないが、10年前にそういう国があり今妙なことになっているし、70年ほど前、非常に限定されていたとは言え曲がりなりにも憲法を持つ国家がそのような行動を起こしたのをこの国は知っている。おそらくどちらの国家も国民へ教育を義務として与えなかった……のだろうか?
かくして、国民は国体を護持するために、仮説(このチームに運営を任せれば良い国家経営が行われるだろう)―実験(投票し信任し運営させる)―検証(良い運営がなされたか?)を行う。だが、その目的、仕組みを理解したうえで仮説の立て方、検証の方法、こういったものを知らなければこの制度(民主主義)は比較的簡単に破綻してしまうだろう。
民主主義国家が、国民に教育を義務付けるのはそのためだ。そのためには複数の視点をいかに獲得するか、異なる考え方それぞれの長短所をどう判断するかという方法をどう組み立てるか、異なる言葉が持つ背後のコンテキストを読解すること――これができなければ異なる視点や異なる意見を理解しこちらの視点や意見と照合し判断することもできない、こういった教育が必要だ。あと、それが仮説―実験―検証によって成り立つことから最低限(多ければそのほうが良い)の科学。そこまでが義務教育で行わなければならない範疇(一瞬「範囲」のほうが意味的に正しいのではないかと疑問に感じたので追記:範囲は量を規定し、範疇は質を規定すると勝手に決めることで折り合いが付く。科目が並ぶのであれば範囲であるが、意味を並べているのだから範疇が正しいとした)となる。
日本の教育は正しく行われているのだろうか? 逆の方向を向いていないかが気になるな。
#ひとつわかっていることは、誰がなんと言おうと、もし現在も日本が民主主義の国家であるのなら、1946-1984までの教育は正しかったということだ。なぜなら、民主主義が失われていないという前提が成立しているのだから。
RAAが復活したのでRjbを載せようと思ったものの、内部で利用するクラス(文字通りJavaバイトコードのクラス)ファイルをどこにコピーすれば良いのかわかりません。
extconf.rbで、Makefileにjavacを組み込んで(jikeとかに変えたければextconf.rbで変えられるからこれでよいと思う)extの下に作るのですが、これをsite-lib/arch の下にsoと一緒にコピーするのは変だし、rbじゃないのでsite-lib/rjbの下というのも奇妙(とは言え、無難かも)。しかし特定可能な位置になければ動作不可能な必須なファイルだし。binにコピーしてしまうというのも考えたけど、そのまま実行できるわけでも無いし。
setup.rbだとshareというディレクトリがあるけどここかな?
多重継承が可能だから、別にinterfaceはいらない。
下の例だと、Number(値が返せて、加算が可能)、Character(コードを返せる)は、単なるインターフェイスで、実装を継承するために用意したわけではない。
#include <stdio.h> class Number { public: virtual int value() = 0; virtual int add(int x) = 0; }; class Character { public: virtual int code() = 0; }; class A : public Character { public: int code() { return 0x41; } }; class HexA : public Number, public A { public: int value() { return 0x0a; } int add(int x) { return value() + x; } }; class One : public Number { public: int value() { return 1; } int add(int x) { return x + 1; } }; void printNumber(Number& n) { printf("number: value=%d\n", n.value()); printf("number: add(8)=%d\n", n.add(8)); } void printCharacter(Character& c) { printf("Character: code=0x%X\n", c.code()); } int main(int argc, char* argv[]) { A a; HexA ha; One one; printCharacter(a); printCharacter(ha); printNumber(ha); printNumber(one); return 0; }
実行するとこんなふうになる。
C:\Home\arton>cl test.cpp cl test.cpp Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. test.cpp Microsoft (R) Incremental Linker Version 6.00.8447 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. /out:test.exe test.obj C:\Home\arton>test test Character: code=0x41 Character: code=0x41 number: value=10 number: add(8)=18 number: value=1 number: add(8)=9 C:\Home\arton>
この例では、HexAは、NumberインターフェイスとCharacterインターフェイスを両方実装している(かつ、Characterインターフェイスを実装したクラスAの実装を借用している)。
多重継承を正しく扱うためには、万能のObjectのような型を周到にデザインから排除しなければならない。そうでなければ、菱形継承の問題が顔を表すことになる。
また、多重継承をうまく利用するためにはデータを排除することが重要なのではないか?と語るスコットEffective C++マイヤー。
それでは、実体を伴わないメソッドの集合の定義としてinterface(起源はOMG IDLなのかな?)を採用したJavaには菱形(ダイアモンド)継承問題はないのか? というとダイアモンドは永遠にということも。
ダイアモンドは永遠にを読んでいて??となったが、Javaってそうなのか。C#だと全然OKなんだけど。
public interface HonestClass { bool turnInLostMoney(); } public interface DishonestClass { bool turnInLostMoney(); } public class Citizen : HonestClass, DishonestClass { bool HonestClass.turnInLostMoney() { return true; } bool DishonestClass.turnInLostMoney() { return false; } public static void Main() { Citizen c = new Citizen(); System.Console.WriteLine("Do you turn in lost money ?"); System.Console.WriteLine(((HonestClass)c).turnInLostMoney()); System.Console.WriteLine(((DishonestClass)c).turnInLostMoney()); } }
実行すると
C:\Home\arton>csc Citizen.cs csc Citizen.cs Microsoft(R) Visual C# .NET Compiler version 7.10.3052.4 for Microsoft(R) .NET Framework version 1.1.4322 Copyright (C) Microsoft Corporation 2001-2002. All rights reserved. C:\Home\arton>citizen citizen Do you turn in lost money ? True False C:\Home\arton>
変なところで不便な善良な市民には住みにくい仕様だな。
「とんでもない欠陥が見つかりました。至急リコールを」
「いらんいらん。実害は無いから」
「な、何を根拠に?」
「だってリコールしたらブランドイメージにキズがつくっていう実害があるでしょ? それに対してリコールしなければ当然その実害は無い。実害が無いんだからこのままで良い。シュアロジカリー」
「そりゃ無理です。至急リコールを」
「無理だと思ったら何も始まらない。我が社のチャレンジが日本を変える。やらなきゃ!」
「そりゃ人死にが出たら変わるでしょうが、それでは手遅れってものです。リコール無しで済ますのは無理です」
「『無理だ』は我が社の禁句にせえへんか?」
「我が社が禁句にしたところで、実害に合うのは我が社以外の人なんですよ」
「まぁまぁ、知らぬが仏と言うではないか」
「そりゃ確かに知らないうちに仏になっちゃうでしょうけど、生き残った人にはバレバレですよ」
「そっか生き残りが出ると言うことは、シェアが低いのが問題ということだな。目指せナンバーワン!」
「無理ですよ」
「無理だと思ったら何も始まらない。我が社のチャレンジが日本を変える。やらなきゃ!」
「この会社で仕事を続けるのは無理だな……」
require 'rjb' Rjb::load class FileChooser @@klass = Rjb::import('javax.swing.JFileChooser') def initialize() @selected = nil end def show() @selected = nil chooser = @@klass.new() ret = chooser.showOpenDialog(nil) if ret == 0 @selected = chooser.getSelectedFile end ret end attr_reader :selected end f = FileChooser.new if f.show == 0 puts f.selected.getAbsolutePath end puts 'bye'Swingのイベントディスパッチスレッドについて途中まで調べたが今日は(あるいは当分)ここまで。
$ruby -v ruby 1.8.0 (2003-08-04) [sparc-solaris2.9] $java -version java version "1.4.2" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28) Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)この環境でも問題なく動くなぁ。しかも、LD_LIBRARY_PATHを設定しなくても平気だし。
(適宜改行を追加) read(13, "\0\1\0\271\0\0\4\210\5\310\0\5\0-@\31\3\221\0\22\1\3\3"..., 76) = 76 write(2, "ruby: ../../../src/share/native/"..., 219 ruby: ../../../src/share/native/sun/awt/font/fontmanager/fontobjects/fontObject.cpp:506: void fileFontObject::readBlock(size_t, size_t, char *): Assertion `(*__errno_location ()) == 0 && count == (size_t) size' failed.) = 219 rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0 getpid() = 29658 kill(29658, SIGABRT) = 0 --- SIGABRT (Aborted) @ 0 (0) --- +++ killed by SIGABRT +++SIGABRTですか……なぜ? 上のアサーションに関係してるんだろうか。
を食べたくなっているときは、当然だけどチョコレートが食べたい。
この時、味だけでなく歯ざわりや舌ざわりなんかも想像される。
が、こんなものを食べても太るか虫歯になるかでろくなことにならないこともわかりきっている。
にも関わらず食べたくなっているため、食べた時の状態がいろいろ浮かんでくる。少なくても食べたその時はとってもハッピーになれるということもわかっている。当然のようにそんな幸せな気分でいっぱいになっている自分のこともまた想像できる。
チョコレートはどこにでも売っているから実際にはその気になればいつでも食べられる。
と考えてみれば、明日できることは今日するなの原理が働くからやっぱり食べるのやめた、となる。
こうやって欲望を抑制していくとそのうち人間乾物ができるのかな。乾物と堅物というのは字面も音も似ていないが内実は同じようだ。
VS.NETにもあったが、何がクリプッレット(という名前か忘れたし調べる気にもならない)だとバカにして使いもしなかったが、突然その効用に目覚めてしまった。
そこで職場のWikiにクリップレットのページを作成。
たとえばpublic void static main(String[] args) { junit.textui.TestRunner.run(new TestSuite(*.class)); }
といった覚えてもしょうもないけどいつも同じことを書いているコード片とかimport文の一揃いとかantのタスクの雛型とかを用意しておいてコピペして使う。が、なんか使いまくるわりにはあまり意味が無いような気がしてくるのはなぜなんだか。
-Xrsを付けたら少なくても箱は描画されるようになった。
どうもスレッド間のタイミング合わせにシグナルを使っていた様子。
しかし、中身が描画されない。
strace見ているとホームディレクトリでstat64というのをかけてファイルを列挙しているからjFileChooserは動いているようではある。
意外と梃子摺るものだな。
SMPに未対応ということはないだろうなぁ。
TkとかGtkとかあるとは言え、現時点でもっともどこにでもインストールされているGUIライブラリと言えばJ2SEなんだから(と思うけどーーちょっと弱気)、というのも動機の1つではあるのだが、なんと言ってもMSWin32でsetup.rb setupは敷居が高いかも。したがってASRへ統合。
が、相変わらずLinuxでの動作は謎なままであった。というか、OS X も試して見ようっと。
__APPLE__は定義されているが、__DARWIN__は無い。というか、man gccでも無いし、何見りゃいいんだ?
JAVA_HOMEは未定義。
しかし、/System/Libarary/Frameworks/JavaVM.frameworkの下を見るのがどうも決まりのようだ(バージョン別のシンボリックリンクもできている)。ただしincludeではなくHeaders、libではなくLibraries(こっちは/System直下のと異なり複数形)。
libjvm.soに相当するのは、libjvm_compat.dylib(拡張子はちょっと違うかも)。よくnmとか覚えていたもんだ。
以上の修正をextconf.rbとload.cに入れたら比較的すんなりtest.rbを通った……わけがない。なぜか、loadimport('java.lang.Integer')したクラスのnewに関してだけはエラーになる(java.lang.Longとかは通る)。
javacが吐くメッセージは、shift_JIS。……iTermの言語設定をjavac使う前にutf-8からshift_jisに変更する必要がある(Windows−DOSだと改行コードが影響されるのでだめ)。
ああ、ruby-dev:23712の山本さんのパッチを当てれば良かった。次の機会に入れさせてもらうことにしよう……
犯罪捜査研究をどうせ買うのなら情報をくれている人へポイントを付けたいなと思えども無かったりして。って言うか在庫切れのままだし。
おお、どうもありがとうございます。早速見てみます。
というのもそうですが、これ無茶苦茶便利ですね。暗記しておこう。
ちなみに、SFUでやってみたらこうなった。
$ gcc -E -dM -xc /dev/null #define __DBL_MIN_EXP__ (-1021) #define __FLT_MIN__ 1.17549435e-38F #define _X86_ 1 #define __CHAR_BIT__ 8 #define __WCHAR_MAX__ 65535U #define __DBL_DENORM_MIN__ 4.9406564584124654e-324 #define __FLT_EVAL_METHOD__ 2 #define __i386__ 1 #define __SIZE_TYPE__ unsigned int #define __LANGUAGE_C 1 #define __DBL_MIN_10_EXP__ (-307) #define __FINITE_MATH_ONLY__ 0 #define __GNUC_PATCHLEVEL__ 0 #define __FLT_RADIX__ 2 #define __LDBL_EPSILON__ 1.08420217248550443401e-19L #define __SHRT_MAX__ 32767 #define __LDBL_MAX__ 1.18973149535723176502e+4932L #define __LANGUAGE_C__ 1 #define _M_IX86 300 #define __OPENNT 1 #define __LDBL_MAX_EXP__ 16384 #define __LONG_MAX__ 2147483647L #define __INTERIX 1 #define __SCHAR_MAX__ 127 #define __DBL_DIG__ 15 #define __USER_LABEL_PREFIX__ _ #define __tune_pentium__ 1 #define __STDC_HOSTED__ 1 #define __stdcall __attribute__((__stdcall__)) #define __LDBL_MANT_DIG__ 64 #define __FLT_EPSILON__ 1.19209290e-7F #define __LDBL_MIN__ 3.36210314311209350626e-4932L #define __WCHAR_TYPE__ short unsigned int #define __FLT_DIG__ 6 #define __FLT_MAX_10_EXP__ 38 #define __INT_MAX__ 2147483647 #define __FLT_MAX_EXP__ 128 #define __DECIMAL_DIG__ 21 #define __DBL_MANT_DIG__ 53 #define __WINT_TYPE__ unsigned int #define __GNUC__ 3 #define __LDBL_MIN_EXP__ (-16381) #define __tune_i586__ 1 #define __LDBL_MAX_10_EXP__ 4932 #define __DBL_EPSILON__ 2.2204460492503131e-16 #define __DBL_MAX__ 1.7976931348623157e+308 #define __USING_SJLJ_EXCEPTIONS__ 1 #define __DBL_MAX_EXP__ 1024 #define __FLT_DENORM_MIN__ 1.40129846e-45F #define __LONG_LONG_MAX__ 9223372036854775807LL #define __FLT_MAX__ 3.40282347e+38F #define LANGUAGE_C 1 #define __GXX_ABI_VERSION 102 #define __FLT_MIN_10_EXP__ (-37) #define __FLT_MIN_EXP__ (-125) #define i386 1 #define __GNUC_MINOR__ 3 #define __DBL_MAX_10_EXP__ 308 #define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L #define __DBL_MIN__ 2.2250738585072014e-308 #define __PTRDIFF_TYPE__ int #define __LDBL_MIN_10_EXP__ (-4931) #define __REGISTER_PREFIX__ #define __cdecl __attribute__((__cdecl__)) #define __LDBL_DIG__ 18 #define __NO_INLINE__ 1 #define __i386 1 #define __FLT_MANT_DIG__ 24 #define __VERSION__ "3.3" #define __declspec(x) __attribute__((x))
#if defined(__APPLE__) && defined(_ARCH_PPC)
が良さそうだな。
あと、上でimport('java.lang.Integer')がどうしたとか書いているのは、たまたまWin32とLinuxとSolarisのJ2SEでは Integer(int value);が先にヒットしただけでInteger(String value);の存在を忘れていたということでした。
で、問題はjFileChooserとかだがこれはわかりやすい。
ibk:~/rjb-0.0.9/samples$ ruby filechooser.rb 2004-06-20 22:03:16.160 ruby[419] Apple AWT: Running on AppKit Thread when not expected. (src/macosx/native/apple/awt/awt.m - JNI_OnLoad : 297) 2004-06-20 22:03:16.164 ruby[419] Please file a bug report at http://developer.apple.com/java/ with this message and a reproducible test case. 2004-06-20 22:03:16.236 ruby[419] Apple AWT Java VM was loaded on first thread -- can't start AWT. Exception in thread "main" java.lang.InternalError: Can't start the AWT because Java was started on the first thread. Make sure StartOnFirstThread is not specified in your application's Info.plist or on the command line at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1560) ...snip... filechooser.rb:6:in `import': `javax.swing.JFileChooser' not found (RuntimeError) from filechooser.rb:6原因はわかったからではこれをどうするかだが。
どんな仕組みか想像してみたり(とは言え知ったこっちゃないのでそんなまじめに考えたわけではないので抜けは多そうだしどのようなリソースが使えるか知らないのでそのあたりも怪しい。ただし一般的なICカードはオフライン時の自己認証機能を持つことは知っている)。
カード ゲート センター
<- poll
Ack ->
<- 位置情報
ID情報 -> -> 非同期でIDを認証したことを登録
位置情報ストア
(書き込み失敗でセッション無効->音声で利用できないことを通知)
走行
<- poll
Ack -> (最初の時点で書き込みに失敗している場合はAckを返さない)
ID情報と進入時の位置情報->
料金計算(表引き) -> 非同期でIDを認証したことを登録
<-位置/料金情報
(これは相当手前で実行しなければならないはずだ。受信できなかった場合には音声ガイドを使い進入できないことを明らかにしなければならないから)
->開門要求
料金/位置情報ストア
(書き込み失敗は無視)
ICカードなのだから情報を書き込み可能だ。その可否はオフラインでも音声で通知できる。事故を抑制するためにはゲートとセンターのオンライン/オフラインに依存できないはずなので、このような仕組みになるのではないかなぁ。
と考えると、最後の部分は次のような形式かも知れない。
<- poll
Ack -> (最初の時点で書き込みに失敗している場合はAckを返さない)
->開門要求
<- Ack
ID情報と進入時の位置情報->
料金計算(表引き) -> 非同期でIDを認証したことを登録
<-位置/料金情報
料金/位置情報ストア
(書き込み失敗は無視)
この方法ならとりあえず通過してから情報をやり取りすれば良いから事故は起きにくいかも知れない
後はフェールセーフをどう考えるかとか。
ゲートに衝突しても料金の取りっぱぐれがないことをセーフと考えるか、仮に料金を取りぱぐれてもゲートに衝突しないことをセーフと判断するか。
追記:開門要求というのは不要か。読み取り器についているMACアドレスのような識別情報を事前にゲート(ではなく料金所の認証システム)に送信してAckがもらえれば、実際の開門はゲート側からの識別情報の走査によって可能かも知れない。
日経コミュニケーションのちょっと前のやつ(6/14)を読んでたら編集後記に路面電車が青山通りを走っていたとか言及されていた。
そういえば、と思い出したが、南へ進むと青山通りで路面電車、北へ進むと明治通りでトロリーバスだったのだ。見た目と語感はトロリーバスが圧倒的に好きだったがこっちには乗ったことは無いような気がする。というか物心がきっちりするより前にトロリーバスのほうは消えていたような。
この両者の使い分けってなんだったのだろうか?
車線が多いと路面電車で少ないとトロリーバスなのかな。
軌道が決定されている路面電車はともかく、なぜトロリーバスまで廃止されたんだろう。記憶の中では電線が網の目のように張られていたように見えるからそのあたりの維持コストと安全性の問題なんだろうか。
で、まあそんな具合に電気自動車が消えてから半世紀が過ぎようとするころに、自走式(と言っていいのかどうか。スタンドアローンというのとも違うような)の電気自動車の時代がやって来ようとしているわけで、エネルギーそのものより媒体に制限されるんだなとかつくづく思ったり。
相変わらずおもしろい。
そこでぼそっと呟いてみるテスト。
しかしその前に2元論そのものがイヤなのだということを明らかにしなければならず、そのためには2元論を援用して説明しなければならないのが面倒なのだが。
そこで面倒なのでぶっちゃけてしまえば、文系と理系という切り口そのものがどうかしているというのが明らかだということだということだ(×後2回くらい)。なぜか。そのためには人類の文化の成り立ちについて考えねばならず、そこには複数の2元論たとえば、一神教対多神教とか、治水事業対狩場の線引きとか、口伝対筆伝(そんな言葉はないが口伝に対して記録し公開するという方法)、それに先立つ万世一系対権力闘争による交代制、などなどについて考えねばならないからだ。(追記:だから、面倒だからぶっちゃけて結論を最初に出した、と続くのだが書き忘れてるね)
でそういうあれこれをすっとばして見れば、すべては「政治」に還元されることになる。「政治」というのは対立する利害の調停が本質だ(といきなり公理)。調停である以上、あるときはこっち側、あるときはあっち側、あるときはあさっての方角と、その時その時に相対する(あいたいする、と読む。ここでは「相対的」の「相対」ではない。素直に直面すると書いても良いのだが直接面していない場合さえありうるので「あいたいする」のほうが良い)問題とそれを取り巻く状況、対立しあう陣営の力関係、第3勢力の動向、自分の地位の保全と人類の未来に対するこうあって欲しいという願望とこうあるに違いないという蓋然、そしてこうなるに決まっているという必然、こういった種々の要素からその時その時に応じた「必然の道」だと考え得るものを見つけ出しその方向へ人々を誘導すること、これが政治なのだ。
1番簡単な政治の使い方は2元論で対立軸を作り出し、その場へ人々を誘導し2つの陣営に分けた上で力関係が上のほうを支持するという方法だ。かくしてここで2元論の意義が出てくる。小選挙区制なんてのは(僕がどう思うかとは関係なく)愚民を民主主義に参加させるために無理矢理この場を作り出す方法論に他ならない。
やっぱり面倒なんでやめた。
というわけで、常にケースバイケースなんだよね、ということが言いたいだけであり、ヌエやコウモリみたいにあっちについたりこっちについたりフラフラしてたいなぁ、という願望でもある。
追記:だから、エンドユーザーと運用部とシステム部とベンダーの間で要求仕様の「調停」をすべき動機付けられているSI屋やアーキテクトといった連中はすべからく政治を知らなきゃならないということで、逆に言えば政治を知らなければただただ翻弄されるだけだから、相手の政治家を探し出してその考えている方向性や対立陣営それぞれの思惑といったものを見越した上で作業をしなければならない、といったことも言えるのだよ、諸君(と呼びかけながら自分に言い聞かせるのであった)。
さらに追記:にもかかわらず、職業倫理を高く掲げたまま、かつ技術者としての矜持を失わずに、妥協の産物に対してどう向き合えば良いかというのが次に続く。そこでEA流の多層アーキテクチャで、アプリケーションアーキテクチャが妥協の産物であってもテクノロジーアーキテクチャは完全を目指すであるとか、プロジェクトを短期、中期、長期で考え、短期のto beモデルは中期的にはas isモデルの延長なのだから、ここで本来のto beモデルへ如何に繋げるかを第1に考えてもっとも最適なシステムの構築を図る、といったような合理的(ここでの「合理」には、心理的な蟠りの解消を意味する「合理」化を含む)な戦略の一部としての妥協戦術の採用と考えるといったこともありえる。もっとも長期的には自分のクライアントではなくなる可能性もあるわけだが、それを言っちゃそれこそ職業倫理もクソも無いことになってしまう。正しい設計美しい実装がベストだとしたら、不正な設計美しい実装も次善としては採用可能なのだ、とか、いろいろ考え方はある。逆に正しい設計醜い実装こそ回避すべき(だが、短期的な目標で中期的には廃棄を前提としたサブシステムであれば、それで十分。正しい設計でなければ廃棄できなくなるから、この場合は設計の正しさは重要)とか、いろいろやれることはあるのだ。と、考えてみることにする。
カンの綴りが合ってるか不明。
議論そのものは媒体で、その議論のメタデータが本質(不変の価値を持つ)なのだと考えて、そのメタデータを一度抽出しそこから別の議論を持ち出すという方法論を採ることが僕は多いようだ。(例:例え話の件)
そのため、ほとんどの場合、直接の話題とは関係を持たず、むしろ自分がその前後で書いたものと関連する。
この場合も、送電線か電池かは時代と技術によって変化するが動力として電力を使用すると言うことに違いはないという最初のエントリーと、次のエントリーがまさに上で考察した方法論を採用して勝手なことを書いているということで関係しているが、次のエントリーの触媒となった圏外のエントリーとは全く関係していない。
おもしろい。
_ なかだ [連環]
子供がおもしろがって読んでいたので借りて読んだ。
お国柄が出ているのかどうか(というよりも、昔話だってことは現在の国と異なる国だった可能性もまた大有りなのだが)わからないが、イランの昔話の痛烈さには度肝を抜かれたりとまどったり。
頭の軽い王様と、その軽さにつけこんで私腹を肥やし政敵を殺しまくる賢い大臣の痛烈なインドの笑い話にもぶっとんだが――
「(省略)よいな、大臣、これからも、けっしてわしを見すてずにいてくれるであろうな?」
「はい、けっして」と大臣はいいました。「天国であろうと、地獄であろうと、陛下のいらっしゃるところなら、どこまでもお供いたします」
というオベンチャラの繰り返しで話が展開していく(1イテレーションの都度、大臣の私腹が肥え、政敵――単に気に食わないというだけだが――が1人あの世へ行く)ので、いったいどういうオチがつくのかと不思議に思いながら読み進むと、あっと驚く笑い話的な逆転が来る(しかし、王様は一貫してオツムがゆるいままで、そのすっとぼけぶりがまたイイ味を出す)のだが、その強烈なオチの付け方に笑いがひきつってしまうのであった。
エントリーのタイトルは、美人のゴキブリの婿取り話なのだが、これまたびっくり。妙齢のゴキブリが遠くの街の金持ちの嫁になりに旅に出ると、行き先々でナンパされる。
「よう、どこへ行くんだい、ゴキブリのおねえちゃん?」
「ゴキブリのおねえちゃんですって! まあ、失礼な! あたしを、そのへんの年ごろの女の子といっしょにしないでちょうだい」
で、口の利き方について説教をたれ、望む呼び方をさせ、最後に夫婦げんかに使う武器について尋ねる。と、相手は自分の職業に関する答えを言う。
例:肉屋
「もし、結婚したら、夫婦げんかになったとき、あんた、あたしのことなんでぶつ?」
「肉きり包丁でさ!」
かくしてゴキブリはプンプンしながら旅を続ける。
そこにお洒落なネズミがあらわれた。いきなり、ゴキブリが望むとおりの呼び方をしてみせる。
「これはこれは、おはようございます。かわいいお嬢さん。そんなにきれいな赤いくつをはいて、いったいどちらへお出かけですか?」
――っていうか、この昔話は、ナンパの仕方を子供に教えるための役回りを持っていたのだろうか?
それはそれとして、この後、ネズミのナンパ師の面目躍如たる洒脱な会話が交わされる。
これは、絶対ゴキブリはネズミの餌だな、と思うとそれは全くの勘違いだとわかる。2人は結婚して幸せに暮らすのだ。いやそれも本気で幸福そうな暮らしっぷりだ。
しかし、好事魔多し!
ある日ゴキブリは病気になってしまうのだ(そこに至るまでまた美しい言葉が交わされたりするのだが、そのシチュエーションの必死振りと会話の優雅さのすさまじい落差がこれまた驚き)。
ネズミは病気にきくカブのスープを必死になって作り……
とびっくりするような話が展開し、最後は、
ゴキブリが今にいたるまで、ずっと黒い着物を着ているのは、ほかでもない、こういうわけがあったのでした
と昔話によくある、「なぜxはyなのか」モノとして終了する。
びーっくり。
単純に、ああ、この奥行きと複雑さが文化として根付いているから、キアロスタミやマフマルバフ(調べるの面倒なので嘘の可能性大さすがに調べた。サイクリストの親父と板を背負った娘の映画ファミリー)なんかが普通に公開される映画としてああいう優れた作品を生み出し、受け入れられてるってわけなのか、と想像してみたり。
また、後書きのこの本が開発された経緯も興味深い。
お宅のお子さんにも是非、この多様性で満ち溢れた世界への本をどうぞ。
WIN32OLE::ARGV
読み取り専用にしたいがためにクラス定数にしたがウカツだった。
これのせいで、-dを付けようものなら呼び出しの都度定数への代入警告がバカスカ出力されるのだが、どうしたものか、またはどうにかなっているかな?
C:\Home\arton\test>ruby -d ie.rb
ie.rb:13: warning: class variable ARGV of Object is overridden by WIN32OLE
ie.rb:17: warning: class variable ARGV of Object is overridden by WIN32OLE
今なら内部的にはインスタンス変数として、取り出し用にメソッドを用意すべきだった。
class WIN32OLE
def initialize()
@last_arguments = nil
end
...
attr_reader :last_arguments
end
こんな感じ。でも名前が変わるのはまずいだろうから
class WIN32OLE
@@argv = nil
def initialize()
@last_arguments = nil
end
def method_missing
obj.invoke
last_arguments = _
@@argv = _c #クラス変数へ最後の引数を保持
end
...
attr_reader :last_arguments
def ARGV() # こんなメソッド名は許されている?
@@argv
end
end
と、取り合えずメモ。
何やってんだか、9;00だというのについ調べ始めてしまったが、win32ole.cを読むと配列のインスタンスを最初に代入した後は、その配列のインスタンスのclearを呼んでプッシュするだけで、定数そのものへの代入は行っていないな……、と言うか、そう書いたんだからそりゃそうだ。とは言えミュータブルオブジェクトな定数というのがそもそもまずい選択だったわけなのだが。
なんで代入そのものを行っていないのに警告されるんだ?
該当メッセージはvariable.c#cvar_override_checkで、これを呼ぶのはrb_cvar_set (当然) だけではなく、rb_cvar_get ……なぜ?
#ということは、rb_define_constへ与えるrb_ary_newの結果をwin32ole.cで保持しておいて、それを直接操作すれば警告は出なくなるってことだな。
最初のスレッドでのAWTの実行についてADCのバグレポート(でもバグじゃないんだな、間違いなく。Appleはjavaをそういうふうに実装し、こちらはそれとは関係なくJNIでホスティングしているわけだから)を出してからはや数日たつが、何の進展もない。ADCが提供しているMLに参加して質問するのが正解だったのかなぁ。
JNIで呼び出されるライブラリーを記述するのは普通にあるが、その逆ってあまり無いんだろうか? Java側のオブジェクトの参照の扱いを見るとそういう気もするのだが。
moleskinさんの紹介文(田園秘話、シモンのパパ)が興味をそそるモーパッサン(岩波文庫)。中学生の頃、手が復讐する話とかジュール伯父さんとかは読んだわけだが、あらためて読むと確かにうまい作家だと感心する。
どうしてそう考えてそう行動するかを突き放して書いている点とかビアスみたいだ(あるいはその逆か、いずれにしろこれらの作家は冷徹な観察者である。芥川龍之介もそうだな。というか、短篇の名手というのはそういう能力に秀でてるんだろう)。でもそうじゃない優れた短篇作家もいる。たとえばラニアンだ。
突然思い出したので貼ってみたり。ニューヨークのケチなノミ屋が競馬の借金のカタに預けられた3歳くらいの女の子を(親が雲隠れしてしまったから)どうにもしょうがなく育てるはめに陥ってしまう(ケチなノミ屋だがオニではない)。仲間(と言ってもノミ屋と客の関係だから心が許せるわけじゃないんだが、ようするにノミ屋はミニスクールジなんだな)と来たらこれまたささくれきった野郎共だがやっぱり鬼じゃない。かくして太陽が西から昇るようにこのケチなノミ屋の生活が変わり、仲間も何かが変わる。しかし好事魔多し……そしてすべては元に戻る。
それから、WEB+DBの21。これは羽生さんの記事が目当て。
あと、トロツキーの我が生涯の岩波文庫版。
ついでに日経サイエンスの恐竜の別冊。
こないだ子供と国立科学博物館に行ったときどうやって恐竜は獲物を捕らえたんだろうかとか親子で不思議に思ったわけでタイムリー。ライオンみたいに後ろから襲ったのか。今アフリカで水牛とライオンがやっているようなことを1億年前にアクロカントサウルス(知らないけど)とプレウロコエルス(こっちも知らないけど)がやっていたとかおもしろいな。だってサイズが全然違うんだぜ。
そういや歯に全く臼歯が無いんだけどどうやって肉を食うんだ? 人間様は前歯だけじゃ食事できないのだが不思議だな、とかティラノザウルスの頭を前にして話し合ったのも思い出したのは、そんなことについての記事もあったり。
以前、MOT(MMOTか? 東京現代美術館―で検索するとModern Museum Of Tokyoじゃないのか。実際はMuseum Of Contemporary ART Of Tokyo――ART Of Nagoyaだとオレのことみたいだが、名古屋は関係ない――と寄り道してからなぜMusIum? (メタデータだからかも、っていうかソースが強烈で行ってみたいぞ「東京魯現代美術館」とか))とか本題に入る前にグダグダ書いてみたり。
で、地獄という作品を見たのだが、誰の何時の作品なんだろうか。地獄を軸に検索しても全然引っ掛からない。
部屋一面にガラクタを並べ組み合わせて回転させてミッキーマウスが椅子にぐちゃぐちゃに錆付いてあるいは腐敗して腰をかけ、軋み、唸る、全体的にはガラクタ色(ブリキに錆が浮いた色)を基調にした説得力が高く印象的な作品だったのだが。
この時の展示には他にも、ビュフェとデュシャンを足したような名前の作家(だめだ、全然固有名詞が出てこないぞ)――白をバックに黒いカクカクした線をつないでいって印刷と切り抜きをする前のジグソーパズルのようなものを作る人――の部屋全体を使った作品も気に入ったし、子供用にはカンディンスキーの部屋を作って(トンネルの中がカンディンスキーだったり除き穴からのぞくとカンディンスキーだったり)、展示場と子供棟の間に迷路を設置したり(これは常設かも)――しかし地図見るとわけわからないな。B2のはずだから子供棟は特設で研修室、迷路が展示してあったのはサンクンガーデンなのかな? とか、3階あたりに飛び降りる人の飛び降り後の部屋とかもあったように覚えているがこちらは印象だけ(でもなく多少の光景は覚えているが)さーぱり固有名詞は記憶できていないのであった。
で、地獄なのだが、なんで地獄を思い出したかを思い出せないのであった。
腰の上がり具合と頭の下げ方が違うが(っていうかむしろ向きは希望方向なんで全然違うのだがそれはおいておいて)僕なんかの世代だと比較的キースヘリング(Red BabyとWhite Babyに注目)を思い出すのではなかろうか。
地獄のほうじゃなくてビュフェとデュシャンみたいな名前のほう。
デュビュフェだ。
で、作品も思い出した。
で、これはジョルジュポンビドゥ所蔵だから、MOTのポンピドゥ展だ(グーグルのトップは怒れる人(だが書いていることは筋が通ってるような)。
ということは再び地獄を訪問したければレアルへ行けば良いということだな。と思えどもふらんすはあまりに遠し
とは言え、クッキーをかませてスクリプトを使ってURLの生コピーを不可能にしているので直接的には見えないが、
入る。以降JavaScript必須。
RESSOURCES EN LIGNE(オンラインリソース)
AUTRES CATALOGUES EN LIGNE(カンディンスキ以外のオンラインカタログ)
Collection du Musee en ligne(オンライン美術館収蔵作品)
でポップアップされるので検索(recherche rapide)からenfer(地獄)。ダバダバ出てくるので写真からJean Tinguelyと当たりを付けると出てきたよ、これだよ。でもこれは写真で見てもだめだ。部屋いっぱいにこいつが軋んでいなければ地獄じゃない。って言うかタイトルはL'enfer, un petit debutだから「地獄――最初の1歩」じゃかっこ悪いから「地獄の萌芽」というか「地獄の誕生」か。それとも「ようこそ地獄へ」か。単純に「散乱の始まり」とか「ここから始まる散らかった部屋」とか「かくしてゴミ溜めと化す」なのか、どうとでも解釈できるところが、まさに地獄たるゆえんだ。と嘘ばかり。
それにしても、ここのオンラインカタログはすごいな。今度タンギーとかドローネとか好きな人の作品をいろいろ見てみよう。
closeは大事だよ。
アズカバンの囚人を見てきた。とりあえずおもしろかったし退屈もしなかった。しかし話を知ってるからそうなのかはわからない。
予告編ではトムハンクスが出てくるクリマスのやつがすごく気味悪かった。
ESRは好き嫌いで言えば嫌いなヤツだが(まるで個人的な知り合いのような言い方だがもちろん知らない。その見かけたことがある言動その他からの判断だ)、
ハッカーらしくふるまうには、 これ [人間はくだらない反復仕事で苦労すべきではないということ] を深く信じ、 退屈な仕事はできるだけ自動化してしまいたい、 それも自分のためだけでなくほかのみんなのために、 と思うようにならなくてはいけない。
には、諸手を挙げて賛成するしかあるまい(これ読んだことなかったな)。別にハッカーらしくふるまいたくないので、ハッカーではなく人間と言い換えても良いのだ。(って言うか、退屈な仕事は敢えてやってみる以外は人間がやるべきではないと考えるのは人間だからで、別にハッカーかどうかは関係ないんじゃないかと思うんだが、そう考えること自体がハッカーですか? ーー否、町工場の人もそう言っているし町工場の人はハッカーじゃなくて旋盤工だ)(追記:でも僕がハッカーと言う場合は、MITのLISPハッカーから連綿とつながるハッカーを指しているのは言うまでもない)
グリゴリの捕縛ーーカネゴンさんのとこ経由。
これがあのJSCかというくらいマトモになっている。
1.JSFコンポーネントのアイコンが立体できれいになった(どうでもいいことだけど、結構重要な気が)
2.Page#getBean、Page#setBeanがまともに動作する。
3.アーリーアクセスではただのゴミだったアプリケーションビーンとセッションビーンが、ページビーンに統合された。
疑問:で、どうやってPage#getBean(これはたどれば良いからまあいいとして)、Page#setBeanがスコープを判断するのだろうか? (試してみると、Managed Beanのmanaged-bean-name要素に登録されていればmanaged-bean-scope要素の記述に従い、それ以外ならリクエストスコープという判断のようだ)
4.やっと日本語というか、JSPを勝手に書き換えなくなったし、ロケールを見て勝手に初期設定してくれる(Windows XPではWindows-31Jになっている。良い判断だ)。とは言え、別の言語に変えると、ちょっとしたはずみでWindows-31Jに変わるんだったら以前と変わらないわけだがとりあえずその検証は不要なのでおいておく。
5.ヘルプも妙にきれいになった。
6.パッケージの変名はうまくいっているのかな? パッケージ名にa.b.cを入れるとa.b.cというディレクトリができてしまうが、WEB-INF/classesの下にはa/b/c/とできているからまあいいのかも。(追記:コンパイルは通るがインテリセンスが赤いバツを食らわしてうるさいから、ちゃんとディレクトリを分離しなければならないようだ。分離させるのはまだ試していない。)
相変わらずダメな点:
1.PageBeanのJavadocが無い。インテリセンスのヘルプがすべてなのか? Helpメニューで検索してもAbstractPageBeanでは意味が無いページが1箇所ひっかかるだけだ。
後はこれから。
ページ(フォーム)フレームワークというのは、ASP.NET+VS.NETのフレームワークで、JSCはある程度まではそれを踏襲しているが、異なる点もある。
一番異なるのは、最初からセッションビーンとアプリケーションビーンというものをプロジェクトに用意している点だ。
ASP.NETの場合、アプリケーションスコープ(そもそもJ2EEのServletフレームワークではないから、アプリケーションスコープとは呼ばないが)相当のHttpApplicationStateクラスのインスタンスと、セッションスコープに相当するHttpSessionStateクラスのインスタンスは、基本的にASP.NETが提供するクラスを直接使い、それぞれのインデクサに対して値を設定する(サーブレットのServletContextおよびHttpSessionに相当すると考えれば良い)のだが、JSCでは、このあたりはPage#getBean、Page#setBeanという形で目に見えないようにし(区別が必要な場合はManaged Beanの設定に行う)、PageBean間の値の受け渡しには直接setBeanで設定した値を利用するかあるいは直前のページビーンそのものを参照し、セッションおよびアプリケーションスコープで保持すべき情報が必要であればそれぞれManaged Beanの設定にあらかじめ組み込まれているアプリケーションビーンまたはセッションビーンに対してフィールドを作成することで対応する、ということのようだ。(追記:直接いじりたい=マップマンセーな人用にPage#getSessionMapとかPage#getApplicationMapとかは用意されているが……最後の手段――用意はしておくがそれを使うことはしない――だろうなぁ)
ページビーンとJSPは基本的に(Managed Beanの設定では同一ページビーンを複数のJSPで共用することも可能だろうがあまり良い方法とは考えにくい)密結合しているから、StrutsのようなJSPタイプ2フレームワークのようにMVCモデルで考えるのには向かない(VとCが密結合しているからだ)。むしろBCEのBとしてページがあり、パラメータ的にビジュアル編集可能なJSPとそのコード(プロセス)を記述するページビーンと、共用情報としてのセッション/アプリケーションビーンがあると考えたほうが素直だろう。
ではCやEはといえば、EJBが好きならローカルホームインターフェイスを呼び出せば良いし、単一JVMで済むのならDIコンテナを使えば良いということになる。Strutsにマッピングすれば、アクション(ページビーンのイベントハンドラに対応させる)+アクションフォーム(JSF+バリデータ)=ページビーンとなるから、それほどわけがわからないことでは無い(やりたければ、AbstractPageBean > ProjectCommonPageBean > 個別ページビーン と実装継承したって構わないわけだが、JSCがうまくハンドリングできるかは別問題)。ASP.NETにようにIsPostBackメソッドがページに実装されているわけではないから必ずしも1ページでリクエストレスポンスをやる必然も無い(というか、判断するのが難しいような気がするけど)。
#Struts使ったって、ActionからいきなりJDBC使う実装だってできちゃうわけだから、JSCを使ってイベントハンドラでいきなりDataSource#getConnectionしていろいろやることも可能なわけで、それで構わなければそれで構わないのだが、そういうのってテストはどうするんだという問題が常に付いて回るわけだから、やらないのが賢明。VBだってまともに作ればイベントハンドラから内包したコンポーネントへ委譲するように作るわけで、どんなフレームワークを使おうが妙な方法論を採用すればそれなりの結果になるということだ。たとえば:ソースファイルは1個にしましょう、とか。
XをクリックしてJSCを終了させた場合、AppServerとPointbaseは起動しておいたままにしてくれるんですか? 親切過ぎると思うんですが。
ジェズイットを見習え |
Before...
_ Ragamuffin [私のコメントを読んだのならば判ったはずなのですが、私は専門家ではありません。「他人の生命のやり取りを職業とする人間」..]
_ arton [いや詫びる必要はまったくありません。なぜならまったく関係ないからです。と何度も書いているんですが。それはご理解いただ..]
_ Hien [いまさらでは有りますが、例え話を否定する人と例え話をする人の折衝について。 例え話をする人は、その比喩を適切に解釈す..]