たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
Split Browserの作り込みの話のおまけ。このエントリにはドラッグ&ドロップの実装に関する話が含まれているかもしれません。
まず基本の話として、Firefoxで(というかXULで)ドラッグ&ドロップを実装するには、ondraggesutre, ondragover, ondragenter, ondragexit, ondragdropの5つのイベントハンドラと、XPCOMの機能を使う必要がある。このあたりの話はMDCのXULチュートリアルには無いんだけど、古いXULチュートリアルには載ってるので、熟読しとくことをお勧めしたい。
XUL要素をドラッグしようとすると、draggesutreというイベントが発行される。いわゆるAjaxとかだと、ボタンを押下→マウスが動いた、という操作をそれぞれ別のイベントで拾わないといけなかったり、クリック時にマウスがブレただけでドラッグ開始と判断してしまわないように閾値を設定したり、と色々めんどくさい配慮がいるんだけど、XULではdraggestureイベントいっこ拾うだけで済むので話が早い。
ドラッグ中にボタンを放した時、つまりドロップの操作が行われた時には、dragdropというイベントが発生する。これは他のアプリケーションからのドラッグ&ドロップでも発生するので、アプリケーションの垣根を越えてのデータのやりとりもできる。やろうと思えば多分バイナリデータも渡せるんじゃないかな……やったことは無いけど。
あとの3つのイベントはおまけのようなもので、ドラッグ中にポインタが載った要素に対して、今ドラッグ中のデータをドロップできるかどうか(その要素がそのデータのドロップを受け入れられるかどうか)を示す、とかそういった用途で使うことが多い。
データの受け渡しにはXPCOMの機能を使う。詳細は旧チュートリアルの当該項目で解説されてる……ンだけど、ぶっちゃけこんなの真面目に使ったらあかん(ぉぃ)。これをラッピングして簡単に使えるようにしてくれる物として、nsDragAndDropという標準ライブラリがあって、これはFirefoxでも利用できる(っていうかFirefox内部で使われまくり)ので是非活用しましょう。旧チュートリアルのnsDragAndDropの使い方の解説と利用例は要チェックですよ。
……というのがドラッグ&ドロップの実装の基本。ここから先は、その応用。
最初のリリース前の作り込みの話の続き。最終段階、ブラウズ領域の上下左右のポップアップボタンの実装について。このエントリは、XULにおける要素の重ね合わせ表示の方法に関する話が色々含まれています。多分。
実は当初は、こんな機能を付けるつもりは無かった。Split Browserのコンセプト自体が半分冗談みたいなものだったから、そこまで深く考えてなかったし。
ただ、実際に基本的な機能が揃って形になってくると、コンテキストメニューから「ブラウザを分割」を選んでさらにサブメニューから上下左右を選択する、という操作がだんだん鬱陶しくなってきた。と同時に、これをどうにかすることができれば使い勝手の面でブレイクスルーになるのではないか、という事も漠然と思うようになってきた。その最も安直な解決策として思い付いたのが、分割可能な領域の端にポインタが近付いたら勝手にボタンを表示して、それをクリックしたらその方向にそのブラウザを分割する、というものだったワケです。
ただ、思い付いたはいいものの、どうやって実装するかでだいぶあっちに行ったりこっちに行ったりウロウロしてた。
作り込みのフェーズの続きですよ。だいぶ間が空いてしまったけど。
ブラウザの分割の状態を保存する、と一口に言っても、保存するべき内容は2つのレイヤに分けることができる。
1の情報の保存と復元の処理は、nsISHistoryの状態の保存と復元が鍵になる。これはFirefox 2のセッション保存機能を実現しているnsSessionStore.jsの中身を見れば理解できるだろう。要約すると、処理の流れは以下のようになる。
sessionHistory
プロパティ(nsISHistoryのインスタンス)のgetEntryAtIndex()
メソッドで、個々のヒストリエントリ(「戻る」「進む」で辿れる個々の履歴)を取得する。sessionHistory
プロパティにnsISHistoryInternalインターフェースでアクセスして、addEntry()
メソッドでヒストリエントリとして追加する。tabbrowser要素に対しては、これをタブの数だけ繰り返せばいい。
韓国ではActiveXを使えないブラウザは全然使われてないらしいのにもかかわらず、Split BrowserのKorean Language Packを作って送ってきてくれるという奇特な人がいた。박찬규(sushizang)さん、頑張りすぎです。
ところでKorean Localeって日本語にする時どう表記するべきか悩みますね。北の楽園もとい朝鮮民主主義人民共和国でも使われてる言語だから「韓国語」って言い切っちゃうのも何か変だし、かといってハングルってのはひらがなやカタカナと同じく文字の種類でしかないし。考えるのがめんどいからこのエントリでは「Korean」にしちゃいましたよ。
ビデオインタビューの様子の動画によると、MJでもしいたけが流行ってるみたいですよ。
傷つけたくない症候群の鬱陶しい空気感を見ていて、思い出されたこと。
そういえば僕は割とつい最近まで、同級生の名前を覚えられなかった。いや、男子はなんとか覚えられたけれど、女子は壊滅的だった。大学の研究室のような狭い小人数の場ですら、そうだった(卒業制作のために籍を置いた研究室では男だけだったんだけど、1年かそのくらいの時の一般教養の課題の一つで、無作為に選ばれた学生達でチームを組んで……というのがあったんですよ)。
最近になってmixi経由で高校時代の同級生の人達と少し交流が復活したけれども、正直言って、顔と名前が一致しない人の方が多かった。一応同じクラスだったらしいと分かっていても、「これはあの人だ」と、名前から顔を思い浮かべることがなかなかできなかった。自分からマイミク申請できるくらいに相手の事を思い出せたのは、ごく数名だけだった。思い出せた人の中には、自分は思い出せても相手は思い出せないんじゃないか、っていうか僕の事なんて覚えてないんじゃないか、むしろ在学中から「知らなかった」んじゃないか、という人もいて(なぜそう恐れるのかといえば、自分自身が他の人を「覚えていなかった」り、「知らなかった」りするからに他ならない)、自分からマイミク申請できなかった。
いや、そもそも、顔を知らなかったと言った方が正しいだろう。同じクラスの人でも、女の人を前にして僕はまともに話せなかった。学祭の準備やなんかのためにどうしても話さざるを得ない時でも、相手の目を見ない、顔を見ても表情を認識しない、ただそこにその名前の人がいるということを示すアイコンとしてだけ相手の姿を認識することで、僕はやっと女性と話すことができていた。
知人が、かつてノートに書き留めていた日記の束を最近になって偶然見つけて、内容の恥ずかしさのあまりそれらを捨ててしまった、ということを書いていた。6年間にも及ぶそうだから、相当な量だろう。
この日記……じゃなかった近況報告は、たしかサイトを作ったときからずっと書いてるけど、通算でもうそろそろ8年分になるわけか。さすがに古すぎる奴は僕も恥ずかしいから、圧縮して置いとくだけにしてるけど、でも完全に消してしまおうという気にはちょっとなれない。
過去の日記を捨てるということは、自分自身でも忘れていたような過去の記憶の記録を捨てるということは、過去そのものを捨てるという事にとても近いのではないだろうか、と思う。整形とか、引っ越しとか、改名とか、そういう行為も、目的がどうかはともかく、結果的には「過去の自分と現在の自分との関連を断つ」行為になると言えるだろう。
それができない人と、できる人との差は、どこにあるんだろう。
自己愛の強さの差だろうか。本質的には自分大好きナルシシストだから、過去の自分を切り捨てられないんだろうか。
あるいは、「質より量」なのかもしれない。今の人生、過去の人生、どの一瞬を切り取っても厚みのない価値の薄いものであるなら、せめて量だけでも集めて重ねて価値を見出したいのかもしれない。
もしかしたら、未来が失われることを、突然自分がこの世から消え去ってしまうことを、恐れているのかもしれない。「過去を捨てる」ということは、大抵の場合、「新しい、未来の自分」の価値を上昇させるために行う行為だと思う。でも、その「未来」が無かったら、どうだろう。積み重ねてきた過去も、これから積み重ねるはずであった未来も、どっちもなくなってしまったら、自分の価値はどこに残るんだろう。自分のことを誰が覚えていてくれるというんだろう。
諦めが悪いんでしょうね。いろんな意味で。
どうして勉強しなきゃならないんだよ!因数分解が何の役に立つんだよ!
因数分解は使いませんでしたが、Split Browserでこないだ付けた新機能の「分割されたブラウザのタイトルバーをドラッグして、他のブラウザのブラウズ領域の上下左右適当なとこにドロップすると、分割されたブラウザをその位置に移動する」を実装するにあたっては1次関数のグラフの知識を久しぶりに脳の奥底から引っ張り出してきました。嘘。実は引っ張り出してこれなかったのでぐぐった。
ブラウズ領域を対角線で4つに分割して、それぞれのどのエリアにポインタがあるのかを調べるという計算。対角線の1次関数の式を作って、そこにYの値を放り込んで「対角線上のX」の値を求め、実際のXの値と比較することで、今ポインタがその対角線より左にあるか右にあるかが分かる。この計算を2つの対角線について行えば、ポインタが対角線によって分割された4つの領域のどこにあるのかを求めることができる。
……という計算なんだけど、学校でやった計算とはY軸のプラスマイナスが逆だし、screenXとscreenYを参照するから原点が(0, 0)からズレてるし、グラフの傾きがブラウズ領域の縦横の大きさによって変わるし、てな感じで、単純な計算なのにえらく苦労したですよ。中学か高校の頃だったらこんなの一瞬で解けたんだろうなあ。
まあそんな感じで紙の上に図やら式やらを書いて四苦八苦した結果がsplitbrowser.jsのSplitBrowser.getDropPositionOnContentArea()
なんですけど。
MozLabに含まれてる単体テストツールのMozUnitの使いかたが分からない、っていうか真面目にプログラミング勉強したことないから単体テストっていうのがどういう物なのかすらわかってない。説明が全然ないし、普通に他のテスト用のツールを使い慣れた人でないと使えないとかそういう物なのだろうか?
とりあえず試しに動かしてみたけど、何が嬉しいのかいまいち分からない。隠し設定使えば普通にJSコンソールにエラーがリアルタイムで表示されるし、エラー表示だけじゃどこがいけないのか分からないとかいっても結局の所JSデバッガで一行ずつ見ていかないと分からない所だってあるし……自動制御で動かすのも、userChrome.jsとかで自分でスクリプト書いてやるのとの違いが分からない。特に、ブラウザの読み込みが完了したタイミングでのテストとか。
日曜プログラマもどきみたいなのが手を出していい物じゃあないんじゃないのか、これは。
追記。MozUnitのソースコード見てああでもないこうでもないと頭の中で検証してやっと使い方が理解できた。
動画で紹介されてるのは非同期処理の例なんだけど、これで例えばブラウザの読み込みを待ってからテストを実行するとかそういうのをやろうとすると、全然うまくいかない。
こういう場合はコールバック関数とかイベントリスナとかを使って、テストしたい状態になるのを待ってからテストしてやらなきゃいかんのだけど、その方法が全然分からなかった。MozUnitのページには、何やらオプションを指定すると非同期でない(変な日本語だ……)テストができるとか書いてあるんだけど、英語だし略語と技術的専門用語との区別がつかんしで、ちんぷんかんぷんだった。
結論から言うと、async型のテストを作る場合は「setUp」メソッドに渡されるコールバック関数を使うというのが鍵だった。このコールバック関数を実行しないと、処理が一歩も進まない。
感受性が高い、と言うとなんだか良い事のように聞こえますけれども、それってつまり、雰囲気に流されやすいとか他人に影響されやすいとか、そういうことなのではないでしょうか。
あるあるに騙されて必死で納豆買い漁る人や、横山ノックやそのまんま東に投票する人、自分とこの党首のした事も忘れて阪神淡路大震災の話で自衛隊批判をする人(そしてそれに「そうだそうだ!」と同意する人)、レイザーラモンHGやギター侍をもてはやす人、オレオレ詐欺に引っかかる人、相手の涙に騙されてオロオロする人とかと、どこがどう違うのか僕には分かりません。
いや決して感受性が高いと評された事それ自体が嫌なのではないのですよ。むしろ、嬉しいとすら感じた。でも、それを嬉しいと感じてしまう浅はかな自分が嫌だった。「フーン」でスルーできない自分が嫌になった。そんな言葉たった一つに影響される自分が嫌だった。そんな事では動じない人になりたかった。スルー力の高い人に。