2003/11の Past topics

1st day

日付が変わるまで準備してたし。

僕は朝から晩までバイトがあったので大祭は完全に人任せだった。

仕事を終えて大学に行ったら、ちょうど僕に用のある方がいらっしゃってた。 CG 集(夏コミで出した魔法少女堕子のやつ)は売ってないのか、という話。残念ながら在庫は全てとらのあなに委託してあるので、そっちをあたって下さい、としか言いようがなかったのだけど。ええと、第伍堕第四堕第参堕ともに売り上げゼロなので在庫の点は問題ないハズ……って、今見てみたら在庫:無とか書いてありますよ先生? 12部という極少部数しか送ってないからキレられましたか?

2nd day

今日はちゃんと朝から働いてましたよ(大祭で)。

陶芸部(アート&クラフト)で湯飲みを買った。壺等も並べられていたが、それらは一向に買い手が付かないため何代も前から受け継がれているらしい。怪しい部もあったものだなあ。

軽音のブースの前を通りかかったら「 Pleasure'9x 」(91か95か98か……歌詞をちゃんと聴いてなかったのでわからない)が聞こえてきたのでフラフラと中に入っていったら、 B'z のコピーバンドだった。ええと……結構上手かったと思うよ。ヴォーカル以外は。

Daft Punkテイ・トウワを展示の時にゴニョゴニョ。 24k 氏に借りたディスクに入っていた MP3 の楽曲ファイル4つから検索して辿り着いたのだけれど、これはいいなと思った。僕の嗜好では普段ヘッドホンで聴くのには物足りないんだけど、スピーカーから BGM として垂れ流すのにはちょうどいい薄さというか何というか(失礼)。ていうか、例年の展示会や皐月祭でいつも思ってたんだけど、 AIR とか月姫とかそれらの同人アレンジとかが BGM ってのは、どうかと思うんですよ。

店仕舞い後に何故か少林サッカー上映会。その後、徹夜するというとら吉氏・クロ君と再び映画上映会( WⅩⅢ - PATLABOR THE MOVIE 3)。何やってんだろう……

3rd day

夜中まで部屋で作業(というか落描き)してたら、何故かお客が。まあいいんですが……アピールにも「展示は午後5時半まで」としか書いてなくて、開店時刻は気分次第だったし。その時描いてて後輩にコピックという画材を紹介するのに利用していた落描きが気に入られたのか、栞に加工した物はないのかと聞かれて、今からは作れないと答えたらなんか残念そうだったので、落描きそのものを差し上げてみた。その線画だけは残ってたのでもう一度塗ってみたバージョン

帰って、風呂を洗って、湯を入れて、昨日から洗濯機の中で脱水まで終わった状態で放置されていた洗濯物を干して、風呂に入って、出て、寝た。何もできん……

8時と9時半に目が覚めた記憶はあるのだけれど、二度寝三度寝して、ちゃんと起きたのは昼を過ぎていた。外から聞こえるのはザーザー降りの雨音……もう嫌! なんで毎年雨なのよ! なんかうちらに恨みでもあるわけ?!(雨だと大祭自体の来場者数が激減する) とカマ口調で八つ当たりしたくなったが、どうにもならないものはどうにもならない。

結局、三日間通しての来場者数は去年の半分くらいだったような気がする。正確な数字は会長に訊かないとわからんけど、主観的にはサッパリだ。アンケートに答えてくれた方に差し上げていた記念品も、二日目夜の時点で「足りるかなぁ?」とか言ってたにもかかわらず結構残ってしまったし。

4th day

マンガのページを作ってみた。今回の大祭合わせの会誌に掲載したやつしか置いてないけど。

綺麗事や理想だけじゃおまんまは食えない。しかし綺麗事や理想が全くないのはつまらない事だと思う。生きていく上で両者のバランスをどの程度に取るかが重要なのだろう。僕は、実利92%に対して理想8%くらいかなあ。僕はこれで相当理想主義的だと思ってるんだけれど。

そういうわけで、僕が「選挙に行けよコノヤロウっていうかむしろ行って下さいおながいします」と思う理由は、例えば「そのせいで具体的に誰に迷惑をかけてるでもない俺っちの嗜好が制限されては困る」からとかそういう浅い所に落ち着くわけです。政党が糞だ、制度が糞だ、法律が糞だ、世間の風潮が糞だ、国民が糞だ、とかなんとか思ってみても、傍観してるつもりでいたところで肉体は既にその渦の中に巻き込まれてしまってるので、生きながらえるためのあがきはしないといけない(と、ゴーストがささやくのですよ)。愚かだから。古いマンガによくある(?)「高いとこから落ちる人間が必死で水をかくような動きをする」みたいな、そんな感じですね。自分でも愚かだと思ってるので、否定されるのは当然だと思うので、否定されたから否定し返すとかそんな事は全くないんですが。ハァ。――という事を、御利巧な奴は選擧に行つて、自分の力で日本を動かしたやうな氣になるが良いという皮肉を読んで思った。

あー、うん、実利92%・理想8%っていうより、むしろ、実利10%・理想8%・フィーリング82%って感じ? 駄目すぎですね。

いかん……せっかく大祭が終わって時間ができたというのに、溜まりに溜まった障害報告の対応を放っぽらかして遊んでますよコイツは。今日は昼から打ち上げに行くとか言ってるし。

何かが無くなってしまった気がする。ただもう老いた、老衰した気がする。というか一昨年辺りを頂点として僕は衰退の一途を辿っている気がする。ずいぶん馬鹿になったと思う。僕は一体どこまで堕ちていくんだろう……

K&M の300円バルキリー( SUPER DIMENSION FIGURE シリーズ)を買ってみた。当たったのは山口可動の VF-1J バトロイド。測ってみたところ、だいたい1/166くらいのスケールのようだ。1/150の GFF より更に小さいのう。

5th day

「視覚デザイン(レイアウト)に凝りたがる Web ページ製作者は文字サイズの固定を望んでいる」という風な偏見に対しては、僕はそれは違うだろうと言いたい。僕は文字サイズの相対指定を推奨するが、本心では、文字サイズの固定ではなく画像サイズの相対指定を望んでいる。文字サイズの固定は、現状では文字に組み合わせるワンポイントや背景にラスタ画像しか使えないという制約があるが故のやむを得ない処置である場合が多いのであって、スケーラブルなベクター画像を広く使えるようになれば、画像との組み合わせの都合で文字サイズを固定する必要はなくなる。

実現の容易さで言えば、ベクター画像を利用できるようにする事の方が、「自分でユーザースタイルシートを編集できる」程度までの情報リテラシー教育の徹底よりはずっと簡単だと思う。事実、 Mozilla の SVG ネイティブサポートは相当なレベルに達しているし。

説明無しでも既存のものと同じ感覚で使えるようにしろ、それが駄目ならせめて使っていてわかるようにしろ、説明が必要なのは愚の愚だ、というのは UI 設計の基本のキだけど、これは、宇宙船の使い方は知ってても壊れたら直せないというようなみずほ先生状態を招く危険性もある。実際、今の電子機器なんてほとんどそんな感じだ。もしかしたら知らん間に騙されてました、てな事になってもおかしくはない。既にそうなっているのかもしれない。徳保氏のように「ユーザーが賢くならなければならない」と考える人がいるのは当然だし、僕もそう考える時はある。

PNG の再圧縮を自動化する話で紹介されていた PNGGauntlet を試してみた所、確かに大部分のものはサイズが小さくなったのだけれど、却って肥大化してしまったものもあった。最高で3倍。壊れちまった画像もあったし。

Node.hasChildNodes() の意義

閉じられないタブが window.open() で開かれる障害は、結構根が深い問題だった――というかコード全体に渡って問題が散らばっていた。具体的には、タブのグループ化のために各メソッド内で参照していた parentTab_parentTabchildTabs_childTabs などのプロパティ・変数がタブの要素ノードだったりタブの ID 文字列だったりと混乱していたせいで要素ノードを渡すべき所に文字列を渡してしまったりしていてエラーが起こってた。

動作の効率を考えたら、あるタブに別のタブを関連付けたときはそのタブのプロパティで要素ノードの参照として保持した方が良さそう。しかし、そうするとメモリリークの原因になるかもしれない(杞憂?)。そういうわけで、いつだったか、代わりにタブの ID 文字列(自動生成したランダムな数字)を保持するように手を入れた事があった。具体例としては、タブの「親」を得るには tab.parentTab ではなく tabbrowser.getTabByTabId(tab.parentTab) と書くようにするという感じ。

ところが、この変更を行ったときに追従して修正するのを忘れてた箇所があちこちにあった。タブを渡すべき所で ID を渡してたりという感じのしょうもないミス。今までは何故かそれでも動いてたんだけど、またちょこちょこと手を入れたのをきっかけにして問題がどばっと表面化したというのが今回の事態だったようで。

最終的には、タブの内部プロパティ _parentTab_childTabs では常にタブの ID 文字列のみを保持、プロパティ parentTabchildTabs はそれぞれが参照された時点で ID 文字列に対応する要素ノードを自動的に検索して返す、他の部分は原則として parentTabchildTabs だけを参照する、という所に落ち着いた。

で、まあ、そこからやっと表題の話に繋がるわけですけど。ここから先はプログラマの人には当たり前すぎてつまらない話だと思うので読み飛ばすのが吉かもしれませんが。

僕は今まで、何故 DOM の Node インターフェースに hasChildNodes() なんてメソッドがあるのかが不思議でした。 childNodes.length0かどうかを調べればいいじゃん、なんでわざわざ真偽値を返すだけのメソッドを用意するわけ? と。しかし、今回 childTabs プロパティの内部処理を書き直したことで、その意義がよくわかりました。

新しい childTabs プロパティは、アクセスされた際に、 ID 文字列の配列 _childTabs を for ループで走査してタブの要素ノードの配列をその場で生成して返します。こんな稚拙な手法では、当然、子タブがあるかどうかを調べるのに childTabs.length と書いただけでもループが発生するわけで、場合によってはとんでもないオーバーヘッド無駄なループによる遅延が発生します。

そこで僕は、直接 _childTabs.length を調べて真偽値を返すだけの hasChildTabs() というメソッドを用意しました。これならオーバーヘッドは最小限に食い止められるはず。

つまり DOM の hasChildNodes() を使うと、 DOM の処理系の内部で childNodes へのアクセス時にオーバーヘッドが生じるのを、うまいこと回避できる(かもしれない)というメリットがあるわけですね。

プログラムを専門的に扱ってる人にしたら当たり前の事なんでしょうが、メイン趣味が絵でプログラムはトーシロの僕にとってはこんなことでもトリビアになるのでした。というお話。

6th day

ふと思い立って MATRIX の緑色の文字が流れ落ちてくるアレのスクリーンセーバーを探してみた。案の定いろんな人が作ってたけど、いくつか見てみた中では、 Matrix Style が一番良くできてる。公式より感じ出ててステキだ。

職業に対する興味の傾向と、自分の理想とする職業に必要な興味の傾向を調べるテストをやった。現実的、研究的、芸術的、社会的(社交的)、企業的、慣習的(定型的)、の6つの尺度で隣り合うもの3つが(※「慣習的」と「現実的」は隣接する)高いのが望ましいというかあるべき結果らしいのだけれど、僕のテスト結果は「現実的」「芸術的」「慣習的」の三つが突出して高く、「研究的」「企業的」が著しく低いというものだった。これが何を意味するかというと、良く言えば「拘らずに何にでも携われる」、悪く言えば「現実を見ていない夢想家」……つまり、「自己愛的で虚栄心だけが肥大化しており、努力も我慢も嫌なら人付き合いも嫌、独創的な発想もなく決まりきった事しかできない、そのくせ芸術を理解する才能が自分にはあると錯覚していて孤高の芸術家を気取っている、救いようのない社会不適合者である」、と。なんていうか駄目ヲタクの中でも特に駄目な部類ですね。鬱だ。

7th day

Ez Sidebarctxextensions で RDF データソースからテンプレートを使って要素を生成した際に nsIXULTemplateBuilder.rebuild() の二度目の実行時にクラッシュする問題が最近の Mozilla では起こっていて、どうも僕の知識の及ばないような下位レイヤの問題のようなのだけれど、発生する条件がやたら特殊なせいか、バグとして認識してもらえる可能性は低いようで、仕方がないので自分で解決する事にした。要するに nsIXULTemplateBuilder.rebuild() を実行したときに墜ちるのだから、それを使わずにテンプレートと RDF データソースを解釈して自分で XUL 要素を生成すれば問題はない(処理速度は落ちるだろうけど)。そういうわけで、前に作ったクラスもどきと組み合わせて rebuild を行う処理を書いてみた。自分の環境ではそんなに処理が重くなった印象はないので、次版からはこれで動かすようにするとしよう(一応、隠し設定でこれまでの処理にする事もできる)。

8th day

バイト代が出たからってまたオモチャ買ってますよこの人は。今日買ったのは GFF #0012 バーザム。ガンダム Mk-Ⅱ、とは敢えて言わないでおこう。肩の可動範囲とか明らかにバーザム形態の方がいい感じだし。店にはマーキングが02(カクリコン機)のものと03(ジェリド/カミーユ機)のものがあったんだけど、なんとなく、人気が高いらしい03の方を買ってみた。でもどうせバーザム形態でしか飾らない(ていうかガンダム Mk-Ⅱでいたのは開封後ほんの数分間だけだった)んだから、02でも良かったかもしれん……まあとりあえずブルースプリンター Ex-S の次くらいにオススメの一品。

近親相姦は合法か

「道徳的」にいかがはしいものは、法律で規制されて當然だという文を見て、「そういえば、近親相姦は不道徳でも合法だという話を聞いたが、ソースは調べてなかったなぁ」と思って、改めてググってみた。

近親相姦は現代では一般に不道徳と認識されていて、違法だと定めている国が多いそうだけれど、意外にも日本では違法ではないようだ(僕の調べた範囲では)。ということは「合法」と言ってもいいのか。一番それっぽい条文があるのは民法第734条(直系血族又は3親等内の傍系血族の間では結婚できない、という例のアレ)だけれど、ここではセックスの可否についてまでは規定していない。刑法(第22章)にも、強姦や強制猥褻の罪はあっても近親相姦の罪は無い。判例までは調べてないので、「近親相姦だから罪だ」と判決を下した例があれば誰か教えて貰えるととても嬉しいのだけれど。

ただ、まあ、違法じゃないからといってマジ近親相姦したらいわゆる世間から白い目で見られる可能性が高いと思うので、そこら辺は「あくどい商売」とかと似たようなものだよなと思った。

9th day

NHK の何とかいう賞の番組で「ピタゴラスイッチ」が受賞作品として放送されていたので、見てみた。すげぇ。こんな高度な子供向け番組があっていいのか?(他の人の仕事がなくなるぞ、という意味で)

10th day

固定が緩くなってきたせいか排気ファンの辺りから騒音が……気になって仕方がないのでなんとかしてみた。あとカバー開けたついでに完全昇天した MO ドライブを取り外そうと考えて、ふと、もしかして掃除したら治るかも?と考えて(スーファミ世代の発想)、ドライブを分解して中にウンザリするほど溜まってたホコリを掃除機でギュンギュン吸い取って元に戻して組み込んだ(よい子もよい大人もマネしてはいけません)ら、完全復活してしまった。うーん、何事もやってみるもんですな……

GFF バーザム。モノアイがクリアーパーツの奴(再販分は全部そうなのか?)だったので、思い立って、目を光らせる加工を施してみた。といってもやった事は単純で、後頭部からモノアイに向けてドリルで採光用の穴を開けて後ろから照らしてるだけなんですが。昔のオモチャみたいですね。

民主党がマニフェストを白紙に。ご愁傷様。

11th day

ブックマークに関連付けたタブの設定を、独自の設定ファイルではなくブックマーク自体に保存できるように改良中。 Mozilla のブックマークは内部的には RDF としてアクセスできるんだけど、 URL や Name などの既定のもの以外には勝手にプロパティを追加できないというのが憎らしいというか何というか。仕方がないので説明文の部分に文字列として保存するようにしてみた。普通に使ってる人には意味のない改変だけど、複数のマシンやプロファイルでブックマークを共用してる場合なんかには多分便利になるはず。

あと、機能の許可のデフォルト値を設定できるようにもしつつある。最初は javascript.enabled や browser.frames.enabled や network.image.imageBehavior を見て動作を変えるようにしてみたけど、これらの設定でオフにした機能は nsIDocShell のプロパティからは有効化できないようなので& browser.frames.enabled を無効にすると Mozilla 自身の設定パネルや Sidebar まで動作しなくなってしまったので、全て独自の設定項目を持つようにした。

エデュテイメント・デザイン演習用のスクリプトをしこしこと記述。とりあえず、背景と立ち絵4枚とカットインの表示、 goTo や選択肢の表示といった簡単な機能から実装。目下の課題はムービーの埋め込みだなあ。

12th day

更にシコシコとカキ続けて、セーブ・ロードの機能を実装し終えた。しかしよく考えれば(よく考えなくても)こういうゲームの実行エンジンみたいなスクリプトは絶対世の中のどっかに既存のものがあるわけで、というか時の封土がまさにそうなわけで、いくら大学の演習課題のためとはいえ車輪を再発明する必要があるのだろうかという無力感に脱力しないでもない。

育英会の学生ローン化

「ちちんぷいぷい」見てたら日本育英会奨学金の話をやってた。それによると育英会の貸し倒れ率は3%(1560億÷5兆)なのだそうで。参考までに、アイフルの2002年度の貸し倒れ率は5%

  • 育英会の数字は設立以来の総額からはじき出しだものなので、例え昔の貸し倒れ率が0%・近年の貸し倒れ率が10%だとしてもトータルでは3%だし、その逆でも3%。
  • 独立行政法人になった後は営利を求める事業になるが、現在の日本育英会は元々は福祉事業。

さあ、これをどう見る?

13th day

メッセージスキップとログ表示機能を実装した。あぁ、実行エンジンがどんどんエロゲー化していく……

JavaScript の勉強。 XUL の勉強。 XBL の勉強。というのを見て、いやあ、 XUL や XBL は勉強する必要ないと思いますよと思った。カネにならないし、将来性無いし。やるならここは一つ XAML で。これなら将来性はなくてもカネにはなりそうだし。

マルチメディアファイルを XHTML 文書に埋め込むを参考にして音声の再生機能を加えた。仕様的には BGM ・ SE ・声の三つを同時再生できるようにしたけど、声なんて使わないよなぁ、この課題では……

14th day

キャラクターのフェードイン/アウト( Mozilla と Windows IE でしか動かないけど)と、滑らかな移動( Virgo の滑らかスクロールのサンプルが大変役に立った)ができるようになった。あとキャラクターの最大数の制限を無くした。無駄に高機能だね……アルファを使ってるから IE 上だと並のエロゲーより綺麗にキャラが動いてますよ?(ぉぃ)

TSUTAYA でカードを更新しようとしたら私大の学生証は身分証明にならないので帰れと言われた。鬱だ。

15th day

例のエンジン用のデモスクリプトを書いたり試したりカイたり(?)。あと、自動メッセージ送りを実装した。

自分でやってみて初めて「なるほど」と思う事がしばしばある。エロゲー風のインタープリタを作ってみて初めて、何でこのゲームはこんな不便な仕様なんだろう、と思うようなケースの原因がわかる。

こどな( Mr. マサシ)

どこだかの誰某という人から電話だ、というので取り次いでもらったら、結婚相談所の勧誘だった。「迷惑電話とかイタズラとかじゃないんで〜」とか言われたので「これが既に迷惑電話なんですが」と言って切った。

駄目ヲタというのはヒトとして未成熟で極めて自己中心的な生き物だ。ヒトという種が種の存続のために僕ら個体の目の前にぶら下げた「快楽」というエサをかすめ取りながら種の存続のためには何ら貢献しない自己中だ。

趣味のためだけに時間を使いたい、彼女を作る時間すら惜しい、あるいは、三次元の女が怖い、等々、ともかく駄目ヲタは自分自身子作りには関わらないし関われない。極めて非生産的な存在だと思う。子供も同じように非生産的だけど、子供は大人になったら生産的になれるかもしれない。駄目ヲタは違う。大人になってもなお非生産的なままなのが駄目ヲタだ。駄目ヲタに「明るい将来を築ける可能性」というものはない。駄目ヲタという現在がもう、辿り着いた「将来」なのだから。

いわゆる「普通の人」というのはそういう意味で、生きているだけでもう、性質として十分生産的だと思う。駄目ヲタは違う。駄目ヲタは性質が非生産的だから、何かしない限り、現象として生産的にはなれない。例えばバイトだったり仕事だったり。生産的でないと、社会の中で生きていけない。現在も将来も非生産的なだけの存在は排除されて当然。

そういうわけで、性質が非生産的でありがなら社会から排除されるのが怖くてたまらない僕は、生産的に見えるようにと色々な事をやっている次第。役に立たない物は無い方がマシだけど、役に立つ物は無いよりはマシ。僕が「他人の役に立ちたい」と思う理由はこれ以外にない。

18th day

カトキ立ちの話に、肩幅 x ・肩の先の高さから股関節軸までを y ・股関節軸から足先までを z ・開き方を2θと置いたときの関係式は (x/sinθ)=(2y/cosθ)+z だ、という文を書き加えたのだけれど、この式がどう役に立つのかは知らないし、式がこれで正しいのかどうかも知らない。ていうか三角関数の出てくる計算をやったのなんてほぼ4年ぶりですよ。しかも4年前で既に劣等生。合ってんのかどうかすらわからないっていうのがもう駄目。なので、恥さらしを兼ねてそこに至ったトンデモ計算の内容を書いておきます。まずカトキ立ち状態における肩幅の高さから床までの長さを H と置いて、 H=x/2tanθH=y+zcosθ の二つの式を作る。 H を消して、 x/2tanθ=y+zcos θ 。両辺に 2tanθをかけて、 x=2ytanθ +2zcosθtanθ=2y(sinθ/cosθ)+2zsinθ 更に両辺を 2sinθで割って (x/2sinθ)=(y/cosθ)+z ……ゴフッ(吐血)。記事の方の式、間違ってるやん。というわけでこっそり修正。

今日はアナログ入力のためのインターフェースを作ってました。手っ取り早く iframe を使ってみたのですが、幅1000まであるのに0〜800の範囲でしかスクロール量を取得できないので鬱です。ああもうめんどくさいなあ。

何か雑誌が某デジタル G 学科の取材だかで来てて、僕も(学科違うくせに)その中に潜り込んで写真に写ってみました。それらしいことが書かれたホワイトボードの前で、鮎釣りのポイントはどうのこうのとか全く関係ない話をしている様子をうわなんwやmtl¥すけrq9z。・0

19th day

アナログ入力の手直しや文字列入力機能の追加。それから、全ての引数で自由に変数を参照できるように改良した(今までは変数は一部の機能でしか使えなかったのですよ……うわダッセェ)。あと、タイマーを実装したので、制限時間ありの入力や制限時間ありの脱出イベントなんかも作れるようになった。

さしあたって必要そうな機能は全部揃ったんじゃないだろうか。となると、次に取りかかるべきはスクリプトの作成支援ツールってことになるなあ。なんせ XHTML ベースで記述するもんだから、 NScripter とかのスクリプトに比べて手書きの面倒さがケタ違いです。これ致命的。

20th day

Flash をプログラミングする?

つうか XUL のラクさ(慣れの問題ってわけではなく、 tabbox ウィジェットとかそういう便利なものがあるという意味で)に比べたら、 HTML でインターフェース作るのはマジ死ねる。せっかく ActiveX 使ってファイルの入出力を行う所までわかっても、 GUI を作るのがめんどくさすぎて、スクリプトエディタの開発(?)が遅々として進みません。

とりあえず今できてる段階のエンジンだけ公開しときます(機能デモ)。そのうちなんかゲームっぽいのを公開するかもしれないし、しないかもしれない。

ポイントは、どの程度まで違う環境でも動くのか? という点。 XHTML1.0+CSS2+JavaScript+W3C DOM にフィルタとか MozOpacity とかの独自拡張を一部使用しているとはいえ、とりあえず(音がなんでか鳴らなかったけど) Firebird 0.7では動いたので、最悪でも Mozilla とプラグインさえあればクロスプラットフォームちっくに動いてはくれるハズなんだけど。

Re: 偽偽夜食日記の部屋 2003年10月 - 13日 ( 月 ) ( object 要素で音声ファイルをページ中に埋め込む方法の話)を参考にやってみたら IE では音が鳴るのになんで Mozilla Firebird では鳴らんのだろう? と悩んでたのだけど、やっと原因がわかった。音量の指定の仕方が違うんだ。件の記事では volume は -10000 〜0で指定すると書いてあるけど、 QuickTime Plug-in 6.4では0〜100% で指定してやらないといかんらしい。最大音量のつもりで0にしたら QuickTime では音量ゼロになってしまってましたとさ、というオチ。どーしたもんだろ。ユーザー自身に選択式で設定させてしまおうか?

21st day

キーボードの調子が悪いのか、僕の調子が悪いのか、最近「 z 」とテンキーの「6」の入力に失敗することが多い。この二つのキーだけが特に際立って多いので、機械の方かなあ、やっぱり。このキーボード、なんだかんだで6年は使ってるしね……

その豆知識にサングラスの男は心底から感心し、ボタンを連打した( Admiring the trivia greatly,the man with sunglasses pressed the button again and again. )に ワロタ。なんちゅう例文だ。

昨日のボリュームの問題は、システムメニュー内に設定項目を設けることで解決することにした。ついでに、セーブ・ロードなどの機能をシステムメニューに移動して UI を整理。と、テストしてて重大な問題が発覚。このエンジンでは学習コンテンツ作成にもしかしたら便利かもしれないと思ってメッセージ中に外部リソースへのリンクを埋め込めるようにしてるのだけれど、 Tab キーを押していくと不可視のフレームの中にある生スクリプトのリンクにフォーカスできてしまうではないですか。ぬう。時の封土みたいに DOM2 や ActiveX の機能でやりますかねえ。

しかしナンですな。指摘されるまで、カトキ立ち時の足の開き幅は肩幅と同じだということに気付かないとは。僕は視野が実に狭いので、一度「角度を調べてやる」と思ったが最後、結論までその狭まった視野のまま突っ走ってしまったのでした。この気性が後々自分の首を絞めることになりかねない。というかスデになってると思う。

今両親共に田舎に行っててうちに帰っても僕一人だ……とかそんなことをボヤいていたら、バイト先の S 氏に夕食をごちそうになってしまった。恐縮してしまう。せめてものご恩返しにということで、 VAIO ノートがインターネットに繋がらねぇというトラブルに対応してみた。……調べ始めて数分で解決した。 ADSL が LAN と同じ感覚で勝手に繋がるのに対して、 B フレッツはダイヤルアップ接続のようにその都度認証しなければならないようなのだけれど、それを忘れていただけだったというオチ。「ネットワーク接続」の「広帯域接続」だったっけ、そこに WAN 云々と書かれたアイコンがあって説明が「切断」になっていたのでダブルクリックしてみたらあっさり繋がりましたという話。

使わないブックマーク

なんか長時間連続稼働で酷使してたら Firebird がだんだん調子悪くなってきてウィンドウを閉じようとクローズボックスをクリックした瞬間に Windows2000 が死んだ。そして全ての Firebird の設定とブックマークが消失……やってらんねぇぇぇ!!!

気を取り直して環境を再構築するのです。とりあえずブックマークについては数週間前のバックアップがたまたまあったので、それを使うことができました。そして記憶と履歴を頼りに、最近巡回ルートに追加した@ JOJOSimple - 憂鬱なプログラマによるオブジェクト指向な日々 -Numeri などを再びブックマーク。しかしこの時点で、ちょっと前にインストールしてからその存在すらすっかり忘れていた Bookmark Backup によって直前の状態のバックアップが残っていたことに気付く。有り難いが、さっきまでの苦労は何だったんだ……

まあ、ブックマークマネージャを開いたのはちょうどいい機会だと思ったので、もう必要なさそうなものとかサイトが消えてるものとかをサクサク消してみた。

ていうか Google があるとホントにブックマークを参照しない。パーソナルツールバーフォルダを残して後は全部消えてしまっても困らないだろうなあ。 W3C の仕様書とか、ブックマークしてても先に Google に手が伸びてしまう。自分で掘ったブックマークのフォルダがもう思い出せなくなってしまってるから。自分の外部記憶への手がかりを物理的なメモからデジタルなメモ・ブックマークに移し、今度はそれすらも無くして Google だけに頼るようになって……あぁ、最近頭が悪くなったなあとよく感じてたけど、確かにこんなんじゃあねぇ。

最後に、拡張機能の復帰。自作のものはアプリケーションディレクトリにあるからそのままでいいけど、プロファイル内に入れてたものは復元がめんどくさかったので、全部配布元から再インストールした。

Bookmark Backup
ブックマークのファイルを曜日別に自動でバックアップしてくれる。急なトラブルの時に頼りになる(はず)。
Copy Image
「画像の内容をコピー」をメニューに加える。
CuteMenus
コンテキストメニューなどの項目名の横にツールバーの物と同じアイコンを表示する。あるとないとじゃ、メニューの使い勝手が段違いです。
Live HTTP Headers
正直言って使ってないけど、障害報告の検証には時々使うので。ていうかこれと競合してクラッシュするという話の検証用に入れたんだけど。
RSS Reader Panel
ほかに RSS フィードリーダーを導入するのがめんどいので。

世間では All-in-One Extension が人気みたいなんだけど、僕はホントにものぐさなので、マウスジェスチャとかの記憶力が必要になる機能は使わないっていうか使えないんですよ……それに、あんまりバカスカ入れると自作のやつのデバッグの邪魔になるし。

22nd day

目が覚めたら9時半を過ぎていた。死ぬほど焦った。飯も食わずにバイトに直行、そして遅刻。受講者の方は怒ってるとかそんな風には見えなかったけど、内心ハラワタ煮えくりかえってるはずだと僕は思う。僕ごときが下らん理由でルールを曲げて許されるはずがないではないか。

以前、バイト先に行く途中の本屋でコピックが売られているのを見つけたということを書いたけど……今日立ち寄ったら同人誌が棚にあった。やばいです先生。ここは本物のようです。なんていうか店内のレイアウトもアニメイト京橋店に似てる気がするし。(強引な関連付け)

右手の薬指が昨日か一昨日くらいから浅く切れてて(何で切ったかわからない)ヒリヒリ痛いので、先日クロスボーンガンダムのパーツを注文したのに届かなかった部品があるとクレームを付けたらそのパーツと一緒に送られてきた粗品の絆創膏でも貼ろうかと思って開封したら、アバレンジャー絆創膏ですた。こんなの貼って表歩けねえよ……

23rd day

代金分と給料分、さて僕はどっちの額に合わせた働きをするべきでしょうか?

何か軽い物が落ちたような音がしたので見てみたら、階段のとこに飾って置いてた王立科学博物館の「ザ・ライトスタッフ」(アポロ13号のやつですな)が落ちてた。サーチ対策で入れられてた鉄球を瞬着で裏に固定して安定させてたんだけど、その鉄球が外れてた。寒さで収縮したとかだろうか?

GFF が何種か再販かかったという噂を目にしていそいそと近所の店を見に行ってみたけど、この辺には行き渡っていないようで残念だった。しかしちょっと外れたとこの小汚い店(失礼)にはちゃっかりディープストライカーが入ってた。前々からマニアックな品揃えだとは思ってたけど、なんつうか…… WAVE のバーチャロンプラモのライデン( 1P カラーと 2P カラー限定版)とか置いてあるし。

バトロワ 11(Amazon.co.jp)、ブラックジャックによろしく 7(Amazon.co.jp)、 EDEN 10(Amazon.co.jp) 、 ZETMAN 1(Amazon.co.jp) 、と買った(前2冊は昨日の話)。ゼットマンって2度目ですかね? 短期連載(あるいは短編)→設定を変えて長編というパターンが多いんでしょうか、この方は。

労働とその対価

僕は、仕事というのは楽しくてはいけないものだと思っている。辛くて苦しくてやりがいがないからこそカネを貰うに値するのであって、辛くも何ともないなら金を取ってはいけないのではないかと思っている。楽しんでいてカネを貰うのなど言語道断だとすら思っている。「趣味を仕事にすると辛いぞ(ストレス発散できないから)」と親に吹き込まれたのが、どこでどうねじ曲がったのか、そういう解釈となって深層心理に刻み込まれているのが、原因だと思う。それで、自分もそのうち辛くて辛くて仕方がない仕事に就かなければならないのだと思っている。だから、趣味が高じて仕事になったとか仕事を楽しんでやってるとかやりがいを持ってやってるとかそういう話を見たり聞いたりすると、羨ましかったりあるいは綺麗事を言いやがってコンチクショウとか思う。

最近では、これまでの僕の人生の大半の時間と多くのカネをこの趣味につぎ込んだ結果が今の僕の技術・知識レベルなのであり、それを持たない人が僕と同じレベルの物を今から得ようと思ったら、それに相当するカネを払わなければならないのは当然だ、と考え、そうして自分が給金を貰うことの根拠を正当化するようになった。言い替えれば、カネを(割高ではあっても)払えば時間の投資や苦労抜きに結果を買えるのだ、という風に考えるようになった。何故かというと、そう考えなければ、僕が他人の持っているものの恩恵にあずかることができる論理的根拠がなくなってしまうから。

24th day

今日は煙草特集です NE !自分

もしこの時 Piro 君がよくある医学的にどーのこーのという理屈で、自分の前で吸うのを止めてくれと言ったのであれば……というけれど、実際そんなことをいきなり人前で言い出す人がいるもんだろうか。にわかには信じがたいけど、僕のような自分のサイトで能書きたれるくらいしかできない内弁慶のヘタレパッシブ嫌煙者だけでなく、他人に対しても田嶋陽子のようにズケズケ言いまくるアクティブ嫌煙者も、まぁ、いるかもしれんなあ。「嫌煙者」を「ヲタク」と言い替えれば僕には分かりやすい。ほら、いるよね、頼みもしてないのに「泣けるエロゲー」を必死で売り込んでくるウザイ奴!(←はい、ここに)

Hatena::agendaCSS でプロパティ名の先頭にアンダースコア( _ )を書くと Windows 版 IE5 以降でのみ認識されるようになるという話が紹介されている。うぉぉ。マジデスカ。マジデスヨ。 expression() を使う方法は JScript が切られてたら意味がないけど、これなら。というわけで早速全面的に採用(勇み足)。

喫煙者と嫌煙者のケンカ

元喫煙者からの、嫌煙者への批判について。

煙草を吸ったこともないくせに、こっちの辛い気持ちもわからんくせに、文句を言うな!とのことですが、喫煙者・元喫煙者の方は、「喫煙者の辛い気持ち」を説明しているケースが少ないとは思いませんでしょうか? いえ、肩身の狭い思いをしているとかそういう「喫煙者という立場の辛さ」ではなく、「喫煙というものの辛さ」についてです。こちら(嫌煙者)は「けむい」「くさい」てな感じで辛い気持ちを表現していると思うのですが、喫煙者の側から「喫煙の苦しみ」をアピールしている例は、あまり見かけない気がします。逆に、説明を放棄したかのような「とにかく、やめたくてもやめられないんだ」という言葉の方が多い気がします。

喫煙者の人が非喫煙者に「喫煙の苦しみ」をわかってもらい理解を得たいと考えるなら、岩城氏の「喫煙者を救え!」にある喫煙者のニコチン切れ疑似体験法のような誰にでもわかる形で説明をする必要があるでしょう。いやいや実際はこんな物ではない……というなら、この例のように言葉を尽くして説明するべきです。「実際に喫ってみれば分かる」というのは、説明の手間を惜しんでいるに過ぎないと僕は思います。

相手の歩み寄りに期待するのは、甘え、あるいは現状の認識が足りないと僕は思います。どちらも歩み寄ろうとしないなら、社会的に弱い立場の方がやがては淘汰されます。両者が合意するにはどちらかが歩み寄らなければなりませんが、強い立場の側は合意しなくても望む結果が手に入ります。だから、彼らは「こちらが歩み寄る必要などない」と考えるのです。そんな彼らの中から「いや、こちらからも歩み寄るべきだ」と語る「人権派」が出てくる可能性にただ期待していてよいのでしょうか? 人間はそれほど賢くて良心的なのでしょうか? 僕はそうは思いません。

奇しくも、先の「疑似体験法」を書いた岩城氏は、この疑似体験法がかなりリアルであるという事実は「タバコを吸う人にはわからない」のであると述べています。氏の言を信用するなら、こうして喫煙の辛さを説明し喫煙者を擁護できるのは喫煙をやめた人だけだということになります。しかし実際に喫煙をやめた人がこれほど丁寧に「擁護」をしているところを僕は見かけません。喫煙をやめた人にとって、現役喫煙者の苦しみなどは所詮他人事に過ぎないからだと僕は思っています。斯様に、人は他人には優しくない生き物なのだ、と僕はこの例を見て思うのです。

自分のヲタク趣味、自分が何故それに拘るのかということについて、共感はしてもらえずとも、せめて「理解」はしてもらいたいと僕は思います。自分の為していることが誰かにとって不快になるなら、「理解」もなしに共生はあり得ません。「カトキ立ち」に固執する理由についての考察なども、今にして思えば、「カトキ立ちを気持ち悪いとしか思わない大多数の人」に対してのこちらからの説明なのかもしれません(←ヲタ臭漂う表現がテンコ盛りのくせにどの口でそういうこと言いますか?)。……尤も、そういう人に対してはそれ以前に「いい歳してガンダムのオモチャに拘る理由」から説明する必要がありそうですが

言っちゃ駄目

実際のところ、煙草をさぁ喫おうかとしている人に対して「すみませんけど煙草は控えて頂けますか?」と言うのは、僕にとっては相当勇気の要ることだ。ああどうしようどうしよう、このままほっといたらもっとケムいことになっちゃうよ、でも言うの怖いなあ、怒られるかもしれないし、僕のことを「自分本位のヤな奴」って思うだろうなぁ、でもあの苦しいのだけは勘弁して欲しいんだよぅ、ああ火を点けちゃった、もう止められないよぅ、ゲフンゲフン、ほらこれだけ咳き込んでるんですよ?辛いんですよ?だからやめて?うぅ、あぁちくしょう、なんでこいつはこうも無神経なんだ?こんな奴ばっかりだから喫煙者は嫌いなんだよッ!! ……そんな感じ。

でも、これっておかしな話だ。自分で何も言わずにおいて「無神経」だなんて、勘違いも甚だしい。気を遣って欲しけりゃあ言葉で言うしかない。身振りで示したって、相手が真意を理解するとは限らない。そんな、相手の分からない自分だけのサインで何かを言い表した気になるなんて、まるっきり子供じゃあないか。

しかし、自分の思ったことをストレートに言うのもまた子供のすることだ。「大人」は我慢しなきゃあならん。つまり、不満を表すならはっきり言え、しかし不満を表すこと自体がガキのする事だ、と。

先日、会長のお父さんが運転する車で合宿に行った際、車内が煙くてたまらなかった。僕はあの時、「嫌なら降りて自分で行け」と言われるリスクを冒しても「申し訳ありませんが煙草はやめて頂けませんでしょうか?」と口にするべきだったんだろうか。いや、黙って目と耳と口とついでに鼻を塞いで耐えたその選択が、正しかったんだろう。そう思っておく。

25th day

Ez Sidebar を、 Sidebar 部分についてもページ読み込み中の処理を行うように改変してみた。結果、コンテキストメニュー拡張のサイト別ユーザースタイルなどもそのまま適用できるようになった。カトゆー家断絶なども、 [WIDTH="100%"][BGCOLOR="#ffffff"], [WIDTH="95%"][BGCOLOR="#ffffff"], [WIDTH="600"], [WIDTH="705"], div[align] { display: none; } font[size] { font-size: 100%; }td[WIDTH="65%"] { width: 100%; } てな感じで Sidebar パネルっぽく表示できる。

まぁその、二つに分割した状態でそれぞれの分量に明らかに差があるわけで、どっちが僕の主に言いたいことであるかは、自明ですがお察し下さい。

エンジン部から進んでなかった分、一気に進行。といっても画像素材がないので文字情報ばかりだけど。とりあえず、入学までの手続きと学科・技能それぞれのメニューのような部分は作った。後のシナリオは会長任せ

煙草の話を引きずってみる・メタ編

先制攻撃――被害妄想と言われるでしょうが、嫌煙者は一本目の煙草で既に「先制攻撃」を受けているものと認識します(その程度で何を……と思われるのでしたら、それはちょっと認識が甘いと言わざるを得ません)。煙草を喫っていないのに本当に突然「先制攻撃」する人がいるとしたら、それは嫌煙者全体の傾向ではなく、その人の人格の問題、その人が喫煙者をやりこめたい意識の方が肥大化しているアンチ喫煙者だからであると考えられます。

喫煙の辛さを愚痴ることに意味はないと中野さんはお考えのようですが、積極的に主張することに意味はなくても、問われたときに答える(答えへのリンクを提示する)程度のことには意味があると僕は思います。「とにかく辛い」以外の答えがないのでは、本当は辛くないんじゃないのか?ただ「嫌煙ウザイ」と文句を言いたいだけなんじゃないのか?という疑念を僕は捨てきれません。卑近な例では、例えば僕が最近ウォッチしているカトキハジメ叩きの一連のスレッドにおいて、 MG および HGUC と題されたプラモデルのシリーズにおけるカトキハジメの「原典のイメージとはかけ離れたリファイン」が批判・否定されていますが、では具体的にどのようなリファインが理想に近いのか?という問いに対して、批判・否定の立場からは「旨味がいる」「ふくよかさが大事」といった主観的な文言しか提示されておらず、いわゆる「才谷ガンダム」などの具体例を提示したりといったアプローチが見られません。これでは、例え批判・否定の立場の主張に利があったとしても説得力を感じることはできませんし、ただ文句を言いたいだけなんじゃないのか?という疑念を捨てきれません。

嫌煙者と一口に言っても、そこには煙害被害者としての嫌煙者と、アンチ喫煙者としての嫌煙者の二種類があります。僕としては、中野さんには単なる「アンチ嫌煙者」にはなって欲しくはないと思う所存です。

中野さんの文章からは、「嫌煙者」というものに煮え湯を飲まされ続けてきた恨みがひしひしと感じられます。煙草の煙自体に拒否反応を起こすと主張しがちな嫌煙者にまずは一年ぐらいタバコを吸って、その後禁煙してから考えてみてくださいと無理難題をふっかけている辺りなど、僕は悲しみを禁じ得ませんでした。これではただの逆ギレです。行き過ぎた批判行為に対する批判と、批判の内容に対する反論とは、切り分けて下さい。中野さんの最初の主張は、そこのところが幾分ごっちゃになっているように見受けられます。僕も人のことは言えませんが。

煙草の話を引きずってみる・内容編

何かをかけた戦いでもない――被害妄想と言われるでしょうが、嫌煙者にとってはこれ(目の前で煙草を喫われるかどうか)は平穏な暮らしと健康をかけた戦いです。来る途中に乗ったバスの前の席の人が煙草をプカプカふかしていたせいで呼吸器系の弱い O さんが講習中も1時間以上咳き込んでいたのを見て、僕はとてもいたたまれない思いをしました。

普段は辛くない、という自覚症状の無さがそもそも大きな問題なのではないかと僕には思えます。禁断症状の辛さをもってしても、「普段は辛くない」とまで言わしめる、煙草というもの。禁断症状があること自体が「普段が辛い」ということだと気付いているのでしょうか。まぁ、これは喫煙者自身の問題ではなく、煙草というものの嫌らしい性質に根ざした問題だと僕は思っていますし、既に煙草をやめられた中野さんに言っても無意味ですが。

止めなきゃなぁという思いが禁断症状の辛さに負けてしまう時点で、十分辛く恐ろしいことだと僕は思います。

26th day

トイザらスまで行ったけどクロスボーン X2 しかなかったのでヤケになってヘイズル改買ってきた。(詳細はヘイズル改制作記に移動)

chrome://global/content/widgets/ → chrome://global/content/bindings/

朝顔日記でも触れられている Toolkit の変更に関して、タブブラウザ拡張で使っている回避策を書き留めておきます。おそらくはもっとスマートなやり方があるのだと思いますが、誰かが踏み台にしてくれることを期待して、恥を晒しておきます。

前提として、 tabextensionsBindings.xml は chrome://global/content/widgets/tabbrowser.xml を、 tabextensions.xml は chrome://global/content/bindings/tabbrowser.xml を拡張するようにハードコーディングされているものとします。

/* "tabextensions.css" */

tabbrowser /* Mozilla Seamonkey */ {
    -moz-binding: url("./tabextensions.xml#tabbrowser") !important;
}

#contentEnclosure tabbrowser, /* Phoenix 0.5*/
#browser #appcontent tabbrowser /* Firebird 0.6 or later */ {
    -moz-binding: url("./tabextensionsBindings.xml#tabbrowser") !important;
}

これ( tabextensions.css )は、最終的には globalOverlay.xul から読み込まれる形になっているスタイルシートです。最初に Mozilla Seamonkey の navigator.xul 用の指定があり、次に、 navigator.xul と browser.xul の構造の違いを利用して browser.xul に対してのみ chrome://global/content/widgets/tabbrowser.xml に依存するバインディングを適用しています。ここまでは旧来から使っていたコード。

/* tabextensionsBindings.css */
#browser #appcontent tabbrowser {
    -moz-binding: url("./tabextensions.xml#tabbrowser") !important;
}
// globalOverlay.js
function TabbrowserServiceInternalInit() {
  var parentWindow = window;
  var testDocument = document.implementation.createDocument('', '', null);
  testDocument.addEventListener(
    'load',
    function(aEvent)
    {
      if (!testDocument.documentElement || ||
          testDocument.documentElement.localName == 'bindings') return;

      var d     = parentWindow.document;
      var newPI = d.createProcessingInstruction(
                    'xml-stylesheet',
                    'href="chrome://tabextensions/content/tabextensionsBindings.css" type="text/css" media="all"'
                  );
      d.insertBefore(newPI, d.documentElement);
    },
    false
  );
  testDocument.load('chrome://global/content/widgets/tabbrowser.xml');
}

// only for Firebird
if (Components.classes['@mozilla.org/commandlinehandler/general-startup;1?type=browser']
      .getService(Components.interfaces.nsICmdLineHandler
      .chromeUrlForTask
      .match(/^chrome:\/\/browser\//)) {
  TabbrowserServiceInternalInit();
}

これらが、新しく追加したコード。 chrome://global/content/widgets/tabbrowser.xml を試しに読み込んでみて、ルート要素が bindings ではないなら、バインディングの指定を上書きする新しいスタイルシートを動的に適用しています。 XUL ドキュメントへの動的なスタイルシートの追加は古い Mozilla では行えませんでしたが、今回問題となっている変更が入ったバージョンでは問題なく行えます。

絶対確実な方法だとは断言しかねますが、とりあえず、当方環境でテストした限りではうまいこと動いているようです。

……と書いていましたが、やはり単なる恥さらしだったようですね。読み込みのタイミングが少しでも遅れるとエラーになって起動すらできなくなりました。ああもうっ。

1/144 RX-121-1 GUNDAM TR-1 HAZEL

ヘイズル改制作記に移動)

圧倒的閃きっ……!!

26日に書いた駄目駄目な回避策の改良版である。気付くのが遅すぎだし、圧倒的でも何でもないし、プログラマの人にしたら当たり前すぎて屁でもない内容だろうけど。

前回から変えたのは、起動時のバージョン判定部分。以下がそれ。

function TabbrowserServiceInternalInit()
{
  var channel = TabbrowserService.IOService.newChannelFromURI(
      TabbrowserService.makeURIFromSpec(
        'chrome://global/content/widgets/tabbrowser.xml'
      )
    );
  channel.open();

  if (channel.contentLength > -1) return;

  var newPI = document.createProcessingInstruction(
      'xml-stylesheet',
      'href="chrome://tabextensions/content/tabextensionsBindings.css" type="text/css" media="all"'
    );
  document.insertBefore(newPI, document.documentElement);

  channel.QueryInterface(Components.interfaces.nsIRequest).cancel(0);
}
if (TabbrowserService.isNewTypeBrowser)
  TabbrowserServiceInternalInit();

つまるところ、 DOM の機能でやろうとするとドキュメントの読み込みが始まるのが遅すぎてチェックが間に合わないので、 XPCOM でそれより早くチェックしてしまおうという話。 asyncOpen ではなく open を使えばチェックができる状態になるまでそこで処理がストップするはずという目論見。唯一の懸念は、 IDL 定義によるとこの open メソッドは asyncOpen と違って必ずしも実装しなければならないということはないらしいという点……