たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
このサイトの方にまだ配布ページ作ってないのでとりあえずMozilla Add-onsに置いてみました。「ルーラ」と書くか「ルーラー」と書くか迷って「ルーラ」にしてしまいました。知ってる土地まで戻る魔法ではありません。→0.2で「ルーラーバー」に名前を変更したのでこのエントリの表記も「ルーラー」に統一しました。
見ての通り、Rulerrrrrのクローンです。公開終了しちゃってる上に特にオープンソースなライセンスが設定されていたわけでもないので、Rulerrrrrの改造ではなく一応フルスクラッチです。以下の点がちょっとだけRulerrrrrよりパワーアップしてます。
空行から左キーを押して一つ前の行の末尾に移動する時に、ルーラー上の強調表示がちゃんと追従してくれないとか、右キーを押して行末→行頭に移動しても強調表示は行末側に残ってしまうとか、Rulerrrrrでも見られた問題がこいつにもあります。そのうちなんとかしたいですね。→0.2.2008101101で改善しました
ていうか誰かすでにクローンを作ってるんじゃないかと思ったら案外誰もやってなかったみたいで驚いた。
例えばW3C DOMでは、子ノードがあるかどうかを調べるメソッドの名前はhasChildNodes()
(三人称単数形)だけど、子ノードを追加するメソッドはappendChild()
(不定形、原形)となっている。どうしてこのようにバラバラなのか? どっちかに統一しないのか? という話。
Matz氏はRubyのメソッド名から三人称単数形を廃して原形に統一したいらしい。上に挙げたような例なら、hasChildNodesではなくhaveChildNodesという感じ。
日本語で書かれた命名規則の文書としては、ググってみたらOkapi Projectの命名規約というのが引っかかった。ここではブール値を返すメソッドは三人称単数形で始めるようにとされている。でも、「何故そう決めたのか」は書かれていない。
そもそも英語圏の人はどう考えてるんだ? と思って「naming convention verb method」とかでググってみたところ出てきたセントラルワシントン大学のドメインで公開されているJavaの命名規則のページには、こう書かれてた。
Begin method names with a strong action verb (for example, deposit).
(snip)
If the method returns a boolean value, use is or has as the prefix for the method name.
何の説明もなく、ブール値を返す物は三人称単数形で、そうでない一般的なメソッドは原形で例が挙げられている。何故そうなのか、ということが全く述べられていない。ネイティブスピーカーの人にとってこれらの使い分けはあまりに自明すぎて、敢えて説明する必要が感じられないということなのだろうか。
僕の場合は、自分でメソッド名を考える時も、Okapi Projectの規約とだいたい同じようなルールで考えてる。そしてこのルールは上記のセントラルワシントン大学のルールとも同じだ。深く理由を考えたことはなかったけど、どうしてこれで違和感が無かったのか、改めて考えてみた。
なんとなくだけど、何かをする系のメソッドを使った文、例えばparentNode.appendChild(newChild)
だったら、これに対応する英文というのは Hey, you "parentNode"! Append "newChild" to yourself as a child! みたいな「命令文」で、状態を尋ねる系のメソッドを使った文、例えばsomeNode.hasChildNodes()
だったら、対応する英文は He "someNode" has some child nodes. みたいな「普通の文」なんじゃないのかなー、と思ってる。逆に言うと、これらの英文を思い浮かべてコードを書くと、自然に、普通のメソッドは原形で状態を尋ねる系のメソッドは三人称単数形になるんじゃないのか、と。He "someNode" have some child nodes. とは書かないし。
そう考えると、Matz氏は「対応する英文」をイメージしないで単純に単語レベルでメソッド名を認識していて「原形と三人称単数形が混在してるのは統一感がない。メソッド名から三人称単数形を廃して原形に統一したい。」という風に考えてるんじゃないかなー、と、僕には思える。その発想が、ネイティブスピーカー的ではないんじゃないかなー、と。
僕は、メソッド名とかで英語を使うんだったらそれを母語としている人達の発想に一番しっくりくる命名規則を使うのが筋なんじゃないかと思う。ネイティブスピーカーがこれでイイって言ってんのに母語にもしてない日本人が「こうあるべきだ」と言っても説得力がない、と思ってる。日本人的・日本語的発想にこだわるんであればそれこそなでしこみたいに日本語ベースの言語にするのが筋なんじゃないの、と。
まあ、ここで参照した命名規則はJavaのものだから、上記の発想はあくまで「Java使いの英語ネイティブスピーカーの発想」とまでしか言えなくて、「大多数の英語ネイティブスピーカーの発想」がそうであるかどうかってのは分からないんだけども。
Jinkunさんに言われたこと。
僕は、JNK Worldに顔を出していた10年前くらいが一番たくさん絵を描いていた時期だと思う。今では、年に2回、コミケに合わせてもえじら組の活動をやってるくらいだ。当時色々と偉そうなことを言ったりしたりしていた僕が、今そんな体たらくであることを知ったら、Jinkunさんも川家さんも僕を軽蔑するんじゃないか。そんな風に思っていた。
でも、Jinkunさん曰く、今の僕の方が楽しそうだという。
そういう風に言われたことの理由は、多分、絵を描くことに対する意識の変化があるんだろうと思う。
当時の僕は「これしかない」と思っていた。絵を描くこと以外で、世界に確かに自分が生きたという足跡は残せないと思っていた。だから自分で色々縛っていた。右向きの顔を反転無しで描けなくてはならない。エロに頼ってアクセス数や販売部数を稼ぐのではなく、絵の質や世界観やそういったもので支持を得なくてはならない。誰からも認められる物を目指さなければならない。高尚でなければならない。そんな風な拘りがたくさんあった。今から思えば、下らない拘りばかりにも思えるけれども、当時は、真面目に拘っていた。
でも、興味の中心がWeb標準とかWeb技術とかに移ってしまって以降、絵を描くことに対して割く時間が減ってしまった。いや、もしかしたらそれは逆で、自分より下の世代で自分よりずっと情熱がありずっと絵が上手い人達がどんどん出てくるのを見て、「もう敵わない」と悟ってしまい、絵の世界から逃げてしまっただけなのかもしれない。
転機になったのは、もえじら組の活動だったと思う。
哀さんの勧めでIRCNetの#汚れの巣や#順列都市に常駐するようになり、いつかの「CSSコミュニティ」の人達と気軽に連絡を取れるようになり、Junさんとinugamixさんの結婚があり、inugamixさんのふぉくす子がその界隈である種のアイドルとなり(良い子はW3C子の事には触れちゃダメ!)、界隈内外のいろんな人がふぉくす子の絵を発表するようになり、ここは誰かが音頭を取って同人誌でも一発作るべきなんじゃね?という空気になって、コミケ出展経験があり自分で絵も描いており一番時間的に余裕があった僕が首謀者となって、成り行きでプロジェクトが始まって。ネトランがふぉくす子をフィギュア化し、気合いの入ったコスプレ衣装まで制作されて、祭りの空気はどんどん盛り上がり。僕は物凄く久しぶりに、ファン活動として絵を描くことの楽しさというものを感じていたのだと思う。
触れちゃダメ、と書いたけどやっぱり触れる。W3C子での失敗はやはり大きかったと思う。ビジュアルイメージが無かったものにビジュアルイメージを付ける、キャラクターをデザインする、という事における「敗北」。僕のやり方が色々まずかったのだと思うけれども、僕がビジュアル化したW3C子は僕のせいで死んでしまい、inugamixさんがビジュアル化したふぉくす子はいろんな人に愛された。その時悟った。僕には、広がりを生み出すオリジンを作ることはできない。そういう才能がない。だから、誰かが作ったオリジンにぶら下がって、それをネタにして楽しむことしかできない。僕は無力だ。僕にはそもそも無理な事だったのだ。いいかげん、身の程を知り、分をわきまえるべきだ。
それからは、気負いがだいぶなくなった、と思う。下手でもいい、上達してなくてもいい、絵柄が古くてもいい。下品でもエロでも全然構わない。好きなキャラを好きなように描いて、同じようなことをしている人達の祭りに参加し、祭りの空気を楽しむ。自己表現のための・自己顕示欲を満たすための手段、生贄としてではなく、それ自体が目的である、絵を描くこと・漫画を描くこと・そしてそれを発表することの、そのものの楽しさ。そういうことを今は感じられているんじゃないか、と思う。
今から10年近く前、僕がネットの利用を始めて、当時のISPのWebスペースでWebサイトの公開を始めたばかりの頃に、どういう経緯でかよく行くようになったサイトがあった。その名はJNK World。管理人のJinkun氏が運営する、掲示板や画像素材等コンテンツが盛りだくさんで、2DCGをやる人達の情報交換やコミュニケーションの場として多くの人が出入りしていた、大規模なサイトだった。と記憶している。
そのサイトを通じてロック君や飛鳥と知り合い、それ以前から交流があった人達と共に、僕にとっては初めての「オフ会」をして、サークル「堕」を作ることになったきっかけになった。川家さんなどの実力のある人との交流もあった。絵を描く人としての自分について、漫画研究部と同じかそれに次ぐくらいのウェイトを占めていた存在だった。そんなサイト。
興味の中心がWeb標準やWeb技術に移った頃から僕はそこに行かなくなってしまったけれども、僕以外の人達の中には、当時からの夢を叶えた人達もいる。上で名前を挙げたロック君は絵描きの人に弟子入りして修行し、今では某ゲーム会社でキャラクターイラストを描いたりムービーを作ったりするプロフェッショナル。飛鳥はプロの元でアシスタントとして修行し、もうすぐ漫画誌で商業デビューするらしい。彼ら以外にも、当時JNK Worldにいた人達で、そんな風に努力を重ねて成功した人は他にもいるんじゃないかと思う。
川家さんが人生の転機を迎えることになって、かつてJNK Worldに集まっていた人達の飲み会というのが先月行われたらしい。参加したロック君曰く、川家さんもJinkunさんも(会ったことはないけど)僕のことを覚えていたそうだ。びっくりだ。当時僕のことを買ってくれていた人達の目に、年に2回程絵を描いたり描かなかったりしているエセ絵描きになってしまっている僕は、どう映るんだろう。そんなことを思ってしまった。
ロック君が話をまとめてくれて、彼とJinkunさんを含む少人数で、僕も混ざって飲み会をする事になった。
参加者は僕を入れて5人。僕が直接覚えていた・当時から交流があったのはJinkunさんとロック君だけで、もう二人は当時は交流がなかったのだけれども、すぐに打ち解けた。昔話に花を咲かせたり、皆や当時のJNK Worldにいた人達の近況で盛り上がったり。僕が話の種にでもと持って行ったもえじら組の本を回し読みしたり。結局3次会の徹夜カラオケまで全員参加で、途中落とし物をするというトラブルもあったけれども、とても楽しい時間を過ごせた。ナイスタイミングで石河君から連絡があったりもして、いつか石河君も入れてまた集まろう、という話にもなった。
10年。もうそんなに経ってしまうんだ。当時16歳とか17歳で、今はもう26歳だ。今ここでこうしてるなんて、あの頃には全く想像もしなかった。絵の道から離れてSEとかプログラマとか言われるような仕事をしているなんて事も、思いもよらなかった。ブログが大流行してWebがこんな風に変わってしまうということも、考えもしなかった。
あの頃に比べて、僕は少しでも大人になれたんだろうか?
元々あった霧吹き?は100円ショップで買ったもので、目が荒いというか大量の水がドバドバ出るため、アイロンがけに使おうとしたら乾いたはずの洗濯物がビショビショになってしまった。ということでもっと目の細かい霧吹きが欲しくて、池袋まで行ったついでに東急ハンズでそれらしい物を探してみた。
売り場を見てみたら、詰め替えボトルのコーナーにそれらしい物がたくさんあったのだけれども、目が細かいかどうかまでは分からなかった……一種類だけ「ミスト状になります」と書いてあったのがあって「これかな?」と思ったけど確証が持てなかったので、ダメ元で店員さんに声をかけて聞いてみた。「アイロンがけの時に使うような目の細かい霧吹きを探してるんですが、一番目が細かいのはどれですか?」と。そしたら、そのうちの一つを「自分が試した中ではこれが一番細かかった」と教えてもらえたので、それを買うことにした。
買ったのは、ノズルを押すとプシューと中身が吹き出してくる普通のヘアスプレーみたいな形をした奴。タグにはthe SCENTPUMPとか書いてあった。892円。輸入物らしい。市販のヘアスプレーの入れ物と違ってキャップに長い足が付いていて、キャップを押したり引いたりすると自転車の空気入れみたいに空気が入っていって圧縮される。で、キャップを外してノズルを押すと、圧縮空気の圧力によって中身がプシュート吹き出す、という物だった。面白いことを考える人もいるもんだなあ。実際に水を入れて試してみたら、確かに目の細かい霧状になって水が出てきた。これはいい買い物をした。
聞いた店員さんがたまたま「当たり」だったのかもしれないけど、商品知識が豊富な人が売り場にいるというのは素晴らしいことだと思った。またここで買い物をしたいなと思った(乗せられてます)。
あと、今までの自分だったら、こういう場所で右も左も分からない状況になったら、悩みに悩んでカンで選んで買って帰って期待外れで後悔、というオチになっていたんじゃないかと思うけど、自然に人を頼ることができたという事実を改めて意識して、深い感慨を覚えた。
ここに来るまでにどれだけの事があっただろう。自分のホームでない、アウェーの場所に飛び込むという事。恐怖を乗り越えて人に話しかけるということ。したいこと・求めていることをきちんと伝えて、自分から相手にできる限り協力して、相手の協力を引き出して、一番いい結果を得られるようにするということ。
自分一人で全てを抱え込んで、人の手を借りずにパーフェクトにこなせるようになることを目指すのでなく、(人の手を借りないとどうにもならないことから目を背けて、その時の自分にできることの範囲が世界の全てだと思い込む、のではなく、人の手を借りないとどうにもならないことも含めての世界だと認識して、自分にはコントロールできない事がたくさんあるのだと認めて、)必要に応じてアウトソーシングすることで自分も相手も利益を最大化し、閉じた「個」として生きるのではなく流動的な「状態」として生きるということ。
自分一人じゃここまで来れなかった。ゆずほさんとかいろんな人が手助けしてくれてやっとここまで来れたという気がする。
FirefoxもThunderbirdもインストーラに「-ms」を起動オプションで付けるとサイレントインストールできるのに、アンインストーラに同じオプションを指定してもそうならないのは何故なんだぜ? Netscape 7のアンインストーラ(NSUninst.exe)は「-ms」オプションでサイレントアンインストールできるのに!!! と思ってBugzillaに書いてみた後で、ソース見てて「アレ?」と思って「-ms」の代わりに「/S」を使ってみたらさっくりサイレントアンインストールできた。うわーかっこわりー!!!
いやでも僕の気持ちも分かって下さいよ。どうしてインストール時は「-ms」なのにアンインストール時は「/S」なんですか? オプションが違うだけならまだしも、Linuxっぽい「-*」とWindowsっぽい「/*」が混在してるっていったいどういう事なんですか?? どうしてNetscape 7とはオプションが違うんですか???
これは絶対に罠だ……
違うオプションで行けるという発想が全然無かったものだから、Firefox 3 Hacks読みながらビルド環境を2日がかりで作って、アンインストーラだけ個別にビルドできる状態まで持って行って、どうすればサイレントアンインストールだけすっきりと実行できるだろうかとあれやこれややってみたのが、まるっきり無駄になってしまった。あわや無意味なパッチを送りつける寸前でしたよ。ギリギリの所で引き返せて良かったね、と自分で自分を慰めておきます。
つーかこういう勘違いをした理由の一つには、検索しても他にも困ってる人の話しか見つからなくて、「こうすればいいよ」っていう情報に辿り着けなかったからなんですよね。あんまり使う機会のなさそうな機能だけに、情報自体があんまり出てなくて……
もう少しよくソースを見てみたら、Support for the deprecated -ms command line argument.
って書いてあった……つまり「-ms」オプションはずっと前から廃止予定になってた古いもので(その割にはFirefox 2.0.0.xでも3.0.xでも使えるんだけど)、今はインストールもアンインストールもサイレントにやるには「/S」を使うのが正解なのか。実際にインストーラに対して「/S」を付けてみたらこっちもちゃんとサイレントインストールされた。うわー二重にはずかしー!!!
Fx3.1b1pre tabbrowser全滅で報じられているとおり、Bug 456048 – Use the new D&D API in tabbrowserによって、tabbrowser要素のドラッグ&ドロップ関係の処理がHTML5で定められた仕様に基づいたものに変更されたようだ。
新APIの使い方についてはGomitaさんが分かりやすい解説を連載で書いてくださっているので、そちらを見てもらうとして。
パッチを見た感じでは、可能な限り最小の変更で新APIに移行していたので、ツリー型タブにも手を入れてみた。変更点を見ると分かるけど、以下のようにしている。
onDragStart
→ _onDragStart
(ツリー型タブでは触ってないけど)onDragOver
→ _onDragOver
onDragExit
→ _onDragLeave
canDrop
→ _setEffectAllowedForDataTransfer
aDragSession
が消えたので、Cc['@mozilla.org/widget/dragservice;1'].getService(Ci.nsIDragService).getCurrentSession();
でその都度取得するようにした。canDrop
の代わりの_setEffectAllowedForDataTransfer
は、返り値が真偽値ではなく文字列になっているので、それに合わせて色々変更。ツリー型タブでは、Firefoxのtabbrowser要素の各メソッドを書き換える時に上記の点を動的に判別して、Firefox 3.0.xとFirefox 3.1の両方に対応するようにしている。
基本的に、新APIは旧APIの機能をほとんど包含しているので、旧APIに基づいて作った拡張機能等はほとんど機能を失うことなく新APIに移行できると思う。逆に、新APIではドラッグ元要素に新しいイベントが発行されるようになっているため、それをバリバリに使った新しい機能は旧APIベースで再現するのは大変そうだ。
これに関連してMDCの最初のページだけ訳してみたけど、新しいシステムの上で訳したのは初めてだったので、だいぶ難儀した。翻訳文書新規作成支援ボットは使えないし、リンク先はいちいち手で打ち直さないといけないし、リンク先を変える時に開くプロパティみたいな画面を表示する度にいちいちものすごく待たされるし……
こないだからやってるNetscape Communicator 4.xからの移行、現地でのリリース候補版レベルでのテストでまた詰まった。自分とこで作ったテスト環境では問題なかったのに、実際の環境だとnsIMessengerMigratorのUpgradePrefs()
で謎の例外発生ですよ。
もういっそのこと処理を全部JavaScriptに移植してみるか? なんて不毛なことを考えてもみたけど、せめて現地でできる事はやり尽くしておこうと思ってMXRでソースを見ながら目デバッグし始めてみたら、冒頭でいきなりそれっぽい箇所を発見した。移行元の設定でmail.server_type
が未定義だと駄目らしい。よくよく調べてみたら、その環境ではnetscape.cfg内で指定されてる設定がたくさんあって、その値はユーザプロファイルの中のprefs.jsには保存されてないから、Thunderbirdが「全然設定が足りねえぞゴラァ!!」と怒ってた、と。
こんなん、今回うちで作った移行ツールじゃなくても本体の設定インポートでも普通に詰まるんじゃないの? どうなってんだまったく。
仕事で書いてるコードがどーにもうまく動かなくて、ついこないだまで正常に動いてたのにどうして?!と思って色々試していたら、特定の関数をtoString()
等で文字列化した時におかしな現象が起こっていた。具体的には、Thunderbird 2.0.0.17のAccountManager.jsで定義されているsaveAccount()
を書き換えようとしたら例外が発生して、onSave()
を文字列にしてreplace()
で改変した物はfor〜inループだった箇所がwhileループになってしまっていた。コードを削っていったらめちゃめちゃ短いコードでも再現したので、Bugzillaに報告しておいた。
上記のような方法で動的にパッチを当てる手法を僕は多用してるので、仕事で書いたコードもここで公開してる拡張機能のコードも、正直、どのくらい影響を受けるのか見当も付かない。早急に解決されることを祈るのみだ。
ちなみにFirefox 3.0.3ではこの問題は起こらなかった。2.0.0.17で入ったセキュリティ上の修正による後退バグっぽい?
追記。29日時点ですでに修正済みだったようだ。これ、あと1ヶ月間放置ですか……? ものっそクリティカルなバグだと思うんだけど。
今まで必要なかったからこっちに来てからアイロンを使ってなかったのだけれどもどうやら必要になりそうだったので近所のホームセンターっぽい店に行ったらアイロンはあってもアイロン台はなかったのでアイロンだけ買って1ヶ月くらい寝かせてた。kinaさんに相談してみたら「ハンズにならあるんじゃね?」と助言をいただき、昨日めでたく購入と相成った。3000円しない安い奴。
シワの無い服とはよいものだ。
実家にいたときは一時期ちょっとだけアイロンがけをやっていたこともある。その時のことを思い出しながらちょっとやってみた。ちょっと失敗したけどまあこんなもんでしょう……
でもアイロンがけが必要そうな服ってたいして持ってない(スーツは着ること自体が稀なので、カッターシャツも一緒にクリーニングに出してた)ので、物置の肥やしになりそうな気がする。「アイロンかけなきゃまずい」と思った服というのも半袖でもうそろそろ出番がなくなりそうだし。どうしよう。