« Greasemonkeyを作る時に気をつけていること | メイン | ヒウィッヒヒーの神様 »

「FIREFOX 3 HACKS」を読みました

JavaScript人口やGreasemonkeyの開発者数を考えると、日本発のFirefoxのaddonの数は非常に少ないのではないでしょうか。この原因は、日本語で読めるaddonの開発方法が少ないかと思います。「FIREFOX 3 HACKS」はFirefox全般について書かれていますが、この書籍の3章はaddonの開発方法が日本語で書かれた数少ない文章のひとつではないかと思います。1章から5章までで358ページあるのですが、3章にはなんと140ページ、約4割も割り当てられています。Firefoxユーザだけでなく、Firefoxのaddonを開発したいと考えている人にお勧めします。
このエントリーでは「FIREFOX 3 HACKS」を読んで、後で読み返したい部分や気になった点等を列挙します。
まず、はじめに何点か注意点。
本の内容を書き過ぎて購入者が減ってしまい、著作陣に迷惑をかけてしまうのは本意ではありません。このため、書籍が手元にないとわかりにくい書き方をあえてします。
文章が膨大になると思いますので、リンク等は特に設定せずに書いていく事にします。
ほとんどを通勤中の電車内で読んだため、疑問に思った事があっても実行環境がありませんでした。このため、動作確認等を全くしていません。誤った記述が含まれている含まれていると思います。
文中にChromeという言葉が頻繁に出てきますが、これはGoogle Chromeの事ではなく、Firefoxの用語です。Google Chromeの話は一切出てきませんので気をつけて下さい。関係ない話ですが、Googleが同じ名前を用いてしまったため、FirefoxのChromeの情報が探しにくくて仕方がないです。
この本は50余りのHACKが5章にわかれて構成されています。言及している場所を示す時に、ページ数と共にどのHACKなのかを番号とともに表示するようにします。また、ページ内の場所を示すために代替の位置を分数で併記する場合もあります。例えば、「P12 #1 1/3」の場合は、12ページのHACK #1についてページの1/3ぐらいの位置に書かれた文章について言及しています。このエントリーは初版第1刷をもとにしています。版が変わった場合、ページ数が変更になる可能性がありますのでご注意下さい。
#22~#25はこの本の最大の難所だと思います。通読を目指している人の多くはここで断念してしまうかもしれません。ブックマークや履歴等を操作するaddonを開発したい場合には必須だと思いますが、そのような操作を行なわないのであれば後回しにしてしまっても構わないと思います。#27には#22~#25に関連した内容が書かれており、理解しにくいかもしれませんが、そうゆうものだという感覚で良いのではないでしょうか。
3章は前出の通りaddonの開発について書かれています。しかし、JavaScriptよりの話が多く、addonのGUI部分を記述するためのXULについてはほとんど書かれていません。筆者陣も勧めている通り、XULについての記述が多い「Firefox 拡張機能開発チュートリアル」という電子ファイルをオンラインで読む事ができますので、合わせて読む事をお勧めします。
1章
[P12 #1 9/10]
APNG作成ツールのURLがあります。
[P15 #2 4/5]
ロケーションバーの自動補完リストに、何がどのような順で表示されるかを決定する方法について書かれたページのURLがあります。
[P19 #3 3/5]
スマートブックマークフォルダの検索条件を細かく指定する方法について書かれています。
[P20 #3 1/2]
スマートブックマークフォルダの検索条件の主なパラメータについて一覧にまとめられています。
[P25 #4 1/5]
Firefoxのブックマークツールバーはどれだけブックマークが多くても横一列に表示されます。表示領域が足りない場合は省略されて「»」にまとめられてしまいます。ここには、ユーザスタイルシートを書いて、ブックマークツールバーを多段表示する方法についての記述があります。
[P29 #5 1/6]
Firefoxのウィンドウの右上には検索バーが表示されています。この検索バーに新しい検索エンジンを登録する方法について書かれています。また、検索エンジンを提供しているサイトの一覧へのURLが書かれています。
[P31 #5 0/1]
複数の単語でページ内検索を行なったときにページ内を単語別に色を変えハイライト表示をするaddon、そして日本語を入力中でもページ内のインクリメンタルサーチが可能になるaddonが紹介されています。
[P31 #5 1/2]
前出の検索エンジンの作成方法の簡単な説明と、詳細なドキュメントのURLがあります。
[P46 #8 0/1]
「不用意に実行してしまう軽減すること」は記述ミスかと思います。
[P51 #9 0/1]
プロファイルフォルダは、所定の位置でないと認識されないと思っていたのですが、そうではないとのことです。ここにはプロファイルフォルダの位置を、相対パスや絶対パスで指定する方法が書かれています。
[P52 #10 4/5]
プロファイルフォルダ内には個人辞書情報というものがあるらしいのですが、何が保存されているんでしょうか。

2章
[P96 #18 3/5]
Greasemonkey Scriptはバージョン指定が可能とは知りませんでした。
[P96 #18 4/5]
トップレベルドメインはまとめて指定できるんですね。Google向けのScriptを書く時に役にたちそうです。
[P97 #18 1/5]
GM_getValueにはデフォルト値が指定可能だそうです。
[P97 #18 1/8]
GM_registerMenuCommandには第5引数まで指定が可能なんですね。何に使うんでしょうか。
[P99 #18 2/5]
E4Xを使うとヒアドキュメントのような事ができるのは知っていましたが、このような記述をすることで「+」で連結していく事もできるんですね。これは是非覚えておきたい記述方法です。

3章
[P105 #20 2/5]
addon作成の際に非常に便利そうなFUELについての説明です。
[P111 #20 2/5]
activeWindowのインスタンスの仕様のため、一致したWindowオブジェクトが単純には見つけられないのはハマりどころかもしれません。代替手段はあるんでしょうか。
[P111 #20 1/8]
activeTabもactiveTabと同様の仕様のようですが、こちらには回避方法が書かれています。
[P114 #20 1/8]
BookmarkオブジェクトもBookmarkFolderオブジェクトも同様の仕様のようですが、こちらも回避方法があります。
[P117 #20 1/2]
ブックマークのタグの誤った操作方法で、ブックマークのデータを破壊してしまう問題を回避する方法が書かれています。
[P126 #20 3/5]
表が誤っているようです。定数名とそれの説明内容が一致していません。
[P148 #22 1/2]
遷移元と遷移先を入れかえるために、[P147 #22 7/8]のSQLを書き変えています。ちょっと自信がないんですが、WHERE句内のvisit_typeの判定にはfrom_infoではなくto_infoを用いるべきなのではないでしょうか。
[P152 #22 1/2]
SQLが間違えている気がします。COUNT関数を使用するサブクエリは、hテーブルにJOINして、COUNTされたカラムの別称をORDER句に指定しないと取得できないのではないかと思います。それともここに書かれているように、サブクエリそのものをORDER句内に直接書いても動作するのでしょうか。書いていたら動作しそうな気がしてきました。これが動作するのなら実行速度がはやくなりそうな気がします。
[P165 #23 2/3]
getChildFolderの名称が名前と一致していないと思います。getChildFolderByNameが妥当ではないでしょうか。
[P171 #23 0/1]
作成時のイベント名はcreatedじゃなくaddedを使うんですね。
[P175 #23 1/2]
ファビコンの登録方法が書かれています。
[P177 #23 3/5]
ここでは、#20を参照するように書かれていますが、#20は20ページ以上もありどこを見れば良いのか戸惑いました。該当する情報は表20-25だと思います。
[P183 #24 9/10]
#24を読むとスマートブックマークの検索条件の詳細な指定方法を知ることができます。
[P184 #24 3/4]
ここの表のメソッドのように、配列も渡しているのにも関わらず配列の長さを渡すようなものが多いのですが何故なんでしょうか。渡した配列自身から簡単に求まると思うんですが、何か理由でもあるのでしょうか。
[P185 #24 2/3]
表24-2にはスマートブックマークで利用できる検索条件が書かれています。
[P192 #24 2/5]
サンプルコードが間違えているようです。「var queries = [query];」とありますが「var queries = [];」が正しいのではないでしょうか。
[P198 #24 1/8]
タイトルのソートについての例外的な挙動について書かれています。この挙動は変更される可能性があるのでしょうか。他と同様の動作をしないのであれば別の定数を割り当ててあれば親切だったかと思います。将来、もし他の条件と同じような動作をさせる事が可能となった場合には、どのような定数になるのでしょうか。
[P199 #24 1/8]
includeHiddenの意味合いは他のプロパティと意味合いが逆になっています。
[P202 #25 7/8]
例外的にpropertyBagは読み書き可能のような書かれ方をしていますが、表25-3では読み取り専用となっています。[P203 #25 7/8]にその理由が書かれていました。
[P206 #25 5/6]
hacChildrenへの情報の反映のタイミングは本当にクセがありますね。これは知らないと確実にハマります。
[P210 #25 0/1]
「steps.push();」となっていますが「steps.push(step);」だと思います。
[P211 #25 0/1]
コンポーネントの名前空間の制御について書かれています。これは知っておきたいですね。
[P211 #25 2/5]
モジュールの評価が一回だけというもの重要な情報かもしれません。
[P211 #25 3/4]
モジュールの公開するメソッドや変数の指定はEXPORTED_SYMBOLSを使うようです。
[P213 #26 9/10]
標準で指定されているResource URIと、Resource URIの指定方法が書かれています。
[P214 #26 3/4]
サンプルコードで唐突にioServiceオブジェクトが使用されています。また、次の行ではサービスが読み込まれているにも関わらず、変数への代入が行なわれていません。varの位置もおかしいので記述ミスだと思います。
[P217 #27 1/2]
引数の「前回の残り秒数」がどう使われるのかが全く予想できません。getDownloadStatusは「メソッド」に書かれている引数の数と「変換例」に書かれている引数の数が一致しません。この記述は多分間違いだと思います。また、getTimeLeftの「変換例」は渡した値がそのまま戻ってきています。このため「前回の残り秒数」の使い方を推測もできませんでした。
[P220 #27 1/3]
Microformatsの情報のURLが書かれています。
[P221 #27 2/5]
getMostRecentBackupの説明が重複しています。
[P226 #27 1/8]
デバッグ用のアサーションが使えるようです。動的言語なのが理由ではないかと思いますが、メソッドがひとつしかありません。
[P228 #28 0/1]
ここに書かれているコードは、ここだけでは終わりません。次ページ[P229 #28 7/8]の最後のほうに書かれているコードへと続いています。ここのページだけを読むと、Firefoxがコンポーネントを呼び出す方法が理解できません。私は何度も読み返した後にやっと気付きました。
[P228 #28 1/3]
15行目と19行目の処理は必要なのでしょうか。次ページの_xpcom_categoriesに登録しているapp-startupをfinal-ui-startupに変更しておけば、15行目、19行目の処理は不要な気がします。イベントを動的に追加/削除する例を示すためにこういう書き方をしているのか、それとも何らかの理由があるのか不明です。
[P229 #28 1/1]
欄外に、GUIDを生成するツールやサービスについての情報があります。
[P231 #28 1/2]
domwindowopenedの名称がここまでのイベント名の命名規則と違いハイフンがありません。もしかすると、イベント名はコンポーネント依存なのかもしれません。
[P233 #28 1/8]
contractID周辺でsyntax errorが発生しそうです。多分、誤植だと思います。
[P236 #29 2/5]
デジタル署名についての説明が続いていますが、非常に混乱しました。install.rdfにはupdateURLが、update.rdfにはupdateLinkが書かれており、両者は同じものではない点に注意して下さい。ここも何度も読み返してしまった場所です。
[P236 #29 3/5]
デジタル署名ツールのURLと、ツールの簡単な使い方の説明が載っています。
[P239 #29 1/2]
ハッシュを求めるツールの取得方法が書かれています。LinuxやCygwinでは標準で使えるのでしょうか。

4章
[P242 #31 5/6]
確かGoogle GearsはDOM Strageに合流するようなアナウンスがあったと思います。このためここに書かれている事は過去のAPIとなってしまう可能性がありますが、とりあえず読み進める事にします。
[P247 #31 1/8]
どちらでも良い話ですが、図31-2を見てニヤリとしてしまいました。
[P250 #32 3/5]
ApacheでDOM Storageを使うには、localhostではなくダメらしいです。理由はわかりません。
[P251 #32 1/2]
innerHTMLが使われていますが、セキュリティやエスケープに言及しないのであれば、Firefoxの書籍なのでtextContentの方が良いのではないかと思います。実は、P248でも同様な処理がありますが、あちらはタグを使用しているためinnerHTMLを使用する理由は(エスケープはしていないとはいえ)あります。しかし、こちらではtextContentを使えば脆弱性をはらんだコードにもなりませんし、エスケープについての説明を省けるのでtextContentを使用するほうが良かったのではないかと思いました。
[P252 #33 1/3]
図33-1のサンプルが格好いいです。
[P253 #33 1/4]
ここまで、meta要素がある場合は指定される文字コードはUTF-8でしたが、ここではShift_JISが指定されています。理由は不明です。
[P263 #37 1/10]
ここまでのサンプルコードは比較的小さいものばかりでした。しかし、#37は最初から最後まで同じものを説明しています。先に全体を斜め読みしてから読んだ方がわかりやすいかもしれません。
[P264 #37 1/10]
「FlickrにXMLHttpRequest」となっていますが、「FlickrからXMLHttpRequest」が正しいのではないかと思います。
[P264 #37 2/5]
「&login;」という文字実体参照が使われているのですが、初めて見ました。何が表示されるのでしょうか。
[P264 #37 3/5]
if文の条件がクラスを元にしているの事が気になります。しかも、複数のクラスを指定しています。
[P265 #37 5/6]
「すべてnullを渡しています。」となっていますが、最後の引数「fresh」はundefinedだと思います。freshの定義されている場所を逆に辿っていくと、[P264 #37 9/10]の「login: function(fresh) {」の引数になります。これは、[P264 #37 3/4]で「users.login();」という呼び出され方をしていますので、nullにはならないでしょう。
[P266 #37 0/1]
「flickr.auth._getFrob()」とありますが、[P265 #37 1/3]は「flickr.auth.getFrob()」という形で呼ばれています。最初は、APIの仕様がそうなっているのかと思いました。しかし、良く見ると[P265 #37 3/5]で「'method': 'flickr.auth.getFrob'」と文字列で定義されており、[P266 #37 1/4]あたりで文字列編集と行ない「_」をつけて「flickr.auth._getFrob」とし、引数を連結させ、callback用の処理を文字列として生成しています。
[P266 #37 3/4]
唐突に「clearTimeout」が出てきていますが、ここまで「setTimeout」は使用されていません。
[P267 #37 1/2]
comfirmの引数が4つもあります。chromeのconfirmは引数を4つとると言う事でしょうか。windowsオブジェクトは使えないはずなので、window.comfirmではないはずです。
[P268 #37 1/6]
「&buttons.auth;」という文字実体参照の様なものがまたあります。もしかしてこれは多言語対応のための仕組みなのかもしれません。
[P269 #37 1/6]
低レベルの処理を行なう関数が多いのでわかりにくくなっているような事が書かれていますが、この注意書きは#37の最初のほう欲しかったと思いました。
[P269 #37 1/2]
「&buttons.upload;」という文字実体参照の様なものがここにもあります。
[P272 #37 3/5]
ここのコードは[P266 #37 2/3]の部分の再引用のようです。
[P275 #38 1/3]
「XULRunnerアプリケーションの実行」となっていますが、実質的に各OS別の簡易的なXULRunnerアプリケーションの作成方法が書かれています。
[P279 #39 0/1]
こちらはXULRunnerアプリケーションの本格的なパッケージングの方法が書かれています。
[P290 #40 0/1]
processing.jsは知っていましたが、ContextFree.jsは知りませんでした。これは面白そうです。

5章
[P293 #41 2/5]
色の違いは何を意味するんだろうかと思っていましたが、キャッシュなんですね。知りませんでした。
[P295 #40 2/5]
console.logで書式指定子が使えるらしいです。特に、オブジェクトリンクが便利そうです。Firebugの使い方は一通り読んだはずなんですが、すっかり忘れていますね。
[P296 #40 2/5]
FirebugのコマンドラインAPIの一覧です。
[P297 #40 1/6]
同様に、FirebugのコンソールAPIの一覧です。
[P300 #42 3/5]
Firebugを更に拡張するaddonは、ここで紹介されている以外にもあるようです。サポートサイトを見て下さいとのことです。
[P301 #42 9/10]
YSlowからは、以前読んだ『JavaScript:The Good Parts』に載っていたJSLintが組み込まれているようです。JSLintはそのうち利用しようとしていたのですが、YSlowから実行できるのであれば気軽に実行できますね。
[P302 #42 1/10]
ここから数ページに渡って、JSLintが推奨している13のルールについて解説されています。全て実践するかどうかは別にして、一度は目を通しておきたい内容です。
[P305 #42 9/10]
14番目のルールもあるらしいです。
[P306 #42 1/10]
Firebug上で、addon等のChromeのデバッグを可能にするChromeBugについて説明されています。addonを開発する時にインストールしたいと思います。
[P312 #43 3/4]
mozDrawTextには文字リテラルが渡されていますが、変数textを使うべきかと思います。
[P314 #44 1/2]
Canvasの情報へのURLが載っています。
[P315 #44 0/1]
GIFに対するanimated GIFのように、PNGに対するアニメーションPNGというものがあります。それがMNGとAPNGです。ここでは、何故2つあるのかの歴史的背景が説明されています。
[P320 #44 1/10]
APNGの仕様のURLが載っています。
[P320 #45 1/4]
Microsummaryの解説です。色々な情報をサイトから抽出し、ツールバーに並べておけるようです。MacのSafari+DashboardでできるWidgetのようなものの文字版と言ったところでしょうか。歴史的にはどちらが先なのかはわかりません。
[P322 #45 3/4]
「含ページ」とありますが「含むページ」だと思います。
[P323 #45 1/3]
Microsummaryの書き方を解説したページのURLが載っています。
[P323 #45 1/2]
Microsummaryを簡単に作成するジェネレータの簡単な解説です。手軽に作成できるのは良いですね。
[P329 #46 1/3]
配列の内包表記についての解説です。内包表記は便利なので覚えたいのですが、これまでのJavaScriptの文法と感覚的に一致しないため、なかなか覚える事ができなくて困っている書き方です。多分現行のIEでは使えなさそうですが...。
[P331 #47 1/2]
letはlet宣言はともかく、let文やlet式の書き方がわかりにくいと思っています。let文はif文に似ているのでまだなんとかなりそうですが、let式は「{}」が省略されたlet文と考えれば良いのでしょうか。
[P333 #47 1/4]
Iteratorコンストラクタの第2引数にtrueを指定するとkeysが返るようですが、valuesを返すような方法はないのでしょうか。
[P333 #47 9/10]
Iteratorに対してfor inすると配列が返るようです。
[P334 #47 2/5]
独自イテレータの作成方法です。[P333 #47 1/10]に、イテレータは全ての要素が返された後でnextメソッドを呼ぶと例外が発生すると説明されていますが、独自イテレータを作る時は、この例外を投げる処理を自分で記述しなければならないようです。
[P335 #47 5/8]
ジェネレータにはnextメソッド以外にもメソッドがあるようです。それらのメソッドの使用方法について書かれたURLが載っています。
[P335 #47 9/10]
ジェネレータで使用するyieldは、Rubyのyieldと同じ名前ですが、使い方が違うためいつも混乱します。
[P336 #47 1/10]
配列の内包表記の「[]」を「()」に書き変えるだけでジェネレータになるようです。
[P336 #47 9/10]
奇妙な記述の方法が載っています。オライリーの書籍の本文で顔文字を見たのは初めてかもしれません。(^^;
[P337 #47 1/2]
JavaScriptの将来を知りたいのであれば、やはりECMAScriptのサイトを参照するのが良いようです。
最後に
一番最初に『書籍が手元にないとわかりにくい書き方をあえてします。』と断りを入れていましたが、読み返してみるとわかりにくく書き過ぎた感じがします。また、「URLが書かれています」等の記述をもしたため、冗長になってしまいました。これらの点を改めると、読みやすくなるかとは思うのですが、もう書き直す気力がないためそのままにしておきます。

トラックバック

このエントリーのトラックバックURL:
http://www.kanasansoft.com/cgi/mt/mt-tb.cgi/242

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google