SSブログ

GM_registerMenuCommand を Firefox 拡張で実装するには? [NT]

Greasemonkey スクリプトを Firefox 拡張にコンパイルするには? の続き。

まず、何処にメニューを追加するかを考える。Firefox のステータスバーかメニュー項目に表示しようかと思う。 まずは、Firefox のメニューに追加する方法を調べる。

Software Design誌 2007年4月号第2特集「Firefox拡張機能開発チュートリアル」の再録記事 XUL Apps > Documentations > Firefox拡張機能開発チュートリアル - outsider reflex によると、

Firefox のブラウザウィンドウへメニュー項目やボタンなどを追加するためには、browser.xul へクロスパッケージオーバーレイする

そうである。

記事に従って DOM インスペクタでマウントポイントを探すと次図のようになった。

image.png

拡張をたくさん追加しているためか、記事と Firefox のバージョンが異なるからかは分からないが、図は若干異なる。id はかわらず、menu_toolsPopup と satitizeSeparator で良さそうだ。あとは、XUL を書けばよい。

しばらく、記事に沿って進めてみることにする。

※2009/03/29 ~ 2009/05/16 までの各記事はまとめてポストしてます。


タグ:Firefox

Greasemonkey スクリプトを Firefox 拡張にコンパイルするには? [NT]

Greasemonkey ユーザスクリプトを Firefox 拡張にコンパイルすることができる。

Dive into Greasemonkey (日本語訳,PDF) によると、Greasemonkey Compiler を用いた例が取り上げられている。しかし、2009/03/29 時点で、その URL はアクセスできなくなっている。

その代わりに、 User Script Compiler を利用してコンパイルできる。それと Greasemonkey Compiler との違いは知らない。

User Script Compiler を利用して Greasemonkey for smart.fm (iKnow! を改良しよう その7改題)で作ったスクリプトをコンパイルしてみると、ちょっと問題が見つかった。 User Script Compiler では次のメソッドは実装されていない。

上記の部分は、ユーザスクリプトをコンパイルして作成された xpi 中の script-compiler.js に記載がある。これでは、Greasemonkey for smart.fm (iKnow! を改良しよう その7改題) はそのままでは利用できない。自分で実装しようかな?

また、同ソース中に気になる記述を見つけた。

という記載である。どうやら一部のメソッドは GPL のコードを含んでいるらしい。 User Script Compiler を使用して作成した xpi は GPL なコードを含んでしまうから、xpi も GPL になってしまう気がする。それはどうかと思うが、Greasemonkey for smart.fm (iKnow! を改良しよう その7改題) はそもそも修正BSDライセンスであり、GPL と矛盾していないライセンスだから、それを xpi にしたものを GPL にしたところで、私としては問題にならない。

とりあえず、RegisterMenuCommand を実装する方法を考える。

 

※2009/03/29 ~ 2009/05/16 までの各記事はまとめてエントリしてます。


bookmarklet で cookie を使うと [NT]

bookmarklet でも良かったかもしれない の続き。

smart.fm の進捗状況一覧を表示する Greasemonkey スクリプトを Greasemonkey for smart.fm (iKnow! を改良しよう その7改題) で公開した。しかし、これって、bookmarklet で出来るんじゃない?というのが昨日の記事の話。

そこで試して見た。結論からすると技術的には可能だがたぶんやらない方が良さそうとの結論になった。詳しくは後述。

問題はキャッシュにある。何をキャッシュしたいかというと、smart.fm のマイリストに表示される、

  • 各リストの進捗状況(iKnow/Dictation)
  • 各リストの今日の進捗状況(iKnow/Dictation) 
  • 今日の日付

の 3 つ。これをキャッシュしておかないと、smart.fm/home から他のページに移動して、また smart.fm/home に戻る度に、マイリストに追加されているリスト数 * 2 の XmlHttpRequest が発生する。XmlHttpRequest によって XML を読みに行き各リストの今日の進捗状況(iKnow/Dictation) を取得しているからである。

これは非常に無駄である。XmlHttpRequest した結果を保存しておいて後で再利用すれば XmlHttpRequest を再度送信せずにすむ。この保存する機能をここではキャッシュと呼んでいる。

昨日の記事では、このキャッシュを cookie を使えば出来るんじゃないかと述べた。結論からすると出来る。しかし、smart.fm に対して cookie が送信されてしまう。理由は次の通り。

  • bookmarklet は smart.fm/home に対して javascript を書き込む。
  • ブラウザは書き込まれた javascript が smart.fm/home にあるものとして処理される。
  • javascript から cookie を書き込むと、その値は smart.fm に対して設定された cookie となる。

だから、当然、smart.fm に対して cookie が送信される。これは筆者としては行儀が悪いスクリプトに見える。なぜなら、smart.fm としては cookie を設定していないのに、勝手に smart.fm の cookie として送信されるから。

実例を挙げると下図のようになる。

image.png

smart.fm/home を表示した後に cookie を設定する bookmarklet を実行し、smart.fm/home を再表示した。そして、その様子を HttpFox を使って送信した cookie を表示している。この図の cookieKey Hello というのが bookmarklet が設定した cookie。

筆者としては、smart.fm/home に cookie を送りたくない。 smart.fm のサーバから見ると、変な cookie が送られてきているんですけど?みたいな状態になるから。

当たり前のことなんだけど、WWW 関係の知識不足だった。

この状態を回避するためには、キャッシュ機能をあきらめるしか方法がない。iframe とか駆使して別のドメインに対して情報を送ってしまえば何とかなるかもしれないが、それって、ログイン後にページに表示されている情報を他のドメインに送りつけていることとなり、セキュリティ的に問題だと筆者は思う。

しょうがないので bookmarklet はあきらめた。素直に Greasemonkey for smart.fm を使いましょう。あるいは、キャッシュの機能なんて作らなくても良いくらい smart.fm が便利な API を整備するか、smart.fm のサイトデザインがより使いやすくリニューアルされるように祈って下さい。


bookmarklet でも良かったかもしれない [NT]

Greasemonkey for smart.fm (iKnow! を改良しよう その7改題) で作ったユーザスクリプト。ふと、bookmarklet でも十分じゃないかと思った。

ただ、bookmarklet だとキャッシュの機能をつくることができないかなーと思ったが、今、検索してみたら JavaScript からでも Cookie を扱えるようなので、キャッシュの部分は Cookie に放り込めば良いんじゃね?と思う。で、Cookie の期限を 1 日にして...。

bookmarkletの文字数制限を無くす - 川o・-・)<2nd life に書いてあることを使えば、文字数の制限もないし。

リストのページ移動もページ遷移しないのならば、何とかなりそうだし。しかも、bookmarklet なら icon の base64 の部分を書き換えれば Internet Explorer でも動きそう。でもでも、 Internet Explorer と FireFox などブラウザの違いを吸収するのは大変そうなので、prototype.js とかを使わなければならないかな?

Greasemonkey のスクリプト...無駄にはならないけど、Greasemonkey for smart.fm のために Greasemonkey をわざわざ使う必要は無いね。 ということで、bookmarklet 化を試すことにした。

時間があれば明日にでも出来そうだが、たぶん無いので、いつになる事やら。

bookmarklet で cookie を使うと に続く。


Greasemonkey for smart.fm (iKnow! を改良しよう その7改題) [NT]

iKnow というタグがついている記事で開発していた Greasemonkey ユーザスクリプト。一通り出来たようなので公開する。

このユーザスクリプトを実行するために必要な物は、Mozilla FirefoxGreasemonkey。これらがあらかじめインストールされている必要がある。

本ブログでは Mozilla Firefox や Greasemonkey の使い方は解説しない。smlmod.user.js を使用したい人が適宜調べて欲しい。

Greasemonkey に関する参考文献は次の通り。


*** はじめにお読み下さい ***

Smlmod(smart.fm list modifier) は Greasemonkey のユーザスクリプト。http://smart.fm/home に今日の学習状況をアイコンで表示する。

before.png   after.png
ユーザスクリプト適用前   ユーザスクリプト適用後(ページを再読込)
  • 今日まだ学習していないリストは鉛筆のアイコンになる。
  • 今日学習したリストには王冠のアイコンがつく。
    • 王冠のアイコンは Bronze、Silver、Gold があり、その日に学習すべきアイテムをいくつ学習したかによって異なる。
    • iKnow! で 10 アイテム学習:Bronze、20 アイテム学習:Silver、今日学習すべきアイテムが無い:Gold
    • アイコンの色はだいたい上記の学習数によるが、目安にすぎない。
01.png
triangle.gif
02.png
triangle.gif
03.png
triangle.gif
04.png
  • Dictation は 1 日に 1 回でも行った場合は学習済と見なされ Gold の王冠になる。
  • 進捗状況が 100% のリストは常に Gold の王冠になる。
  • アイコンをクリックすると、直接 iKnow! か Dictation のアプリケーションが起動する。
  • アイコンの表示される条件は次の通り。
    • ページのロード(再読込)
    • リストが多く複数ページある場合は、「前へ」「1」「2」....「次へ」というリンク
    • ユーザスクリプトコマンドに登録したメニュー「Check status without cashe」
  • smart.fm への接続に失敗した場合は「!」のアイコンになる。また、iKnow! や Dictation で学習したのにアイコンが変わらない場合は、ページを再読込や、ユーザスクリプトコマンドにあるメニュー 「Check status without cashe」を呼び出すと直るかもしれない。 「Check status without cashe」は、ページの再読込をしてもうまくいかなかった場合に試して欲しい。 (今日の進捗が少ない(今日学習したアイテム数が少ない)場合にアイコンが変わらない状況になりやすい。)

*** 制限事項 ***

  • smart.fm のサイト構成などが変化した場合は使用できない。
  • smart.fm を運営する セレゴ・ジャパン株式会社 とは無関係。smart.fm の単なる 1 ユーザが作成している。
  • 使用言語が日本語の場合にのみ対応。
  • http://smart.fm/home のみ対応。
  • iKnow! アプリケーションの設定で「目標終了日を設定しない」(既定値)の場合に使用できる。(目標終了日を設定している場合は動作しない)
  • このスクリプトは 修正BSDライセンス に従う。修正BSDライセンスの<OWNER>、<ORGANIZATION>、<YEAR> はそれぞれ、p2、p2、2009 と定義する。
  • このスクリプトはマイリスト中の「学習中リスト」にのみ対応する(version 1.0 にて追加)。

*** テスト環境 ***

  • Mozilla Firefox 3.0.7
  • Greasemonkey 0.8.20090123.1

*** 更新履歴 ***

version 0.9
  • 公開
version 1.0
  • エラーメッセージで表示される URL が誤って www.yahoo.co.jp になっていたのを本ブログを指すように修正。
  • smart.fm/home で「作成したリスト」を選択したときエラーが発生する不具合を修正。
    (「作成したリスト」をクリックした場合は無視するようにした)
version 1.5 2009/05/10
  • Dictation が存在しないリスト(例えば アルク2000語絵じてん チャレンジ)に対応。
    (thanks for よよぎさん)
  • その日に学習した進捗状況を smart.fm に問い合わせるときのキャッシュの仕組みを改善。
上記の 「はじめの読み下さい」「制限事項」「修正BSDライセンス」に同意し
smlmod.user.js (smart.fm list modifier) ver.1.5 をダウンロードする。


ダウンロード先を変更しました。experiment.mints.ne.jp からダウンロードして下さい。


NetBeans で空のプロジェクトを作るには? [NetBeans]

NetBeans で空のプロジェクトを作りたい。NetBeans 6.5 で新規プロジェクトを作ろうとすると、[Java] カテゴリに [Java 自由形式プロジェクト] が存在する。しかし、このプロジェクトは新規プロジェクトダイアログの [説明] 欄に、

既存の Java アプリケーションと、その構築スクリプトを IDE プロジェクトにインポートします。

と解説されているように。空のプロジェクトではない。

空のプロジェクトを作るには Freeform Project Extras プラグインを利用するのが手っ取り早い。

NetBeans の [メニュー] - [ツール] - [プラグイン] でプラグインダイアログを開き、[使用可能なプラグイン] から [Freeform Project Extras] を選びインストールする。新規プロジェクトダイアログには次図のように [Empty Ant-Based Project] が追加されるのでこれを選べばよい。

image.png

こうして作成したプロジェクトでは Java のクラスパスなども設定されていないため、ビルドするときには project.xml を適切に自分で書かなければならない。しかし、Java のプロジェクトではなく、JavaScript だけを管理したい場合などは便利である。ビルドしなければならないようなプロジェクトは、[Java アプリケーション]、[Java クラスライブラリ] などのテンプレートを選択した方が便利だ。

NetBeans にはローカルヒストリ(ローカル履歴、ローカルファイル履歴とも呼ばれる) 履歴管理システムが標準で備わっている。このシステムは、プロジェクトを作成し、その中にファイルを追加しないと機能しないようだ。 例えば、[メニュー] - [ファイル] - [ファイルを開く] で任意のファイルを編集した後、[メニュー] - [バージョン管理] - [ローカル履歴] を選択しても履歴は空のままになる。Empty Ant-Based Project でプロジェクトを作成し、そのプロジェクトにファイルを追加すれば、ローカルヒストリも有効になる。

参考文献


Aptana Studio 1.2 を日本語化するには? [NT]

Sun Microsystem は IBM に買収されてしまうのでしょうか?Java と NetBeans の行方はどうなるのでしょう?

IBM は Java を指示しているから Java SDK/JRE に関しては特に気にしていないが、NetBeans はどうなるか微妙。Eclipse あるし。NetBeans はコミュニティが運用しているけれど、Sun からの支援が減少したら、どうなるのでしょう。

心配だなーということではないけれど、JavaScript ファイルの編集に Eclipse をベースとして開発された Aptana Studio 1.2 を使ってみた。日本語化するときに、少し手間取ったので覚え書きを残しておく。

基本的には、あいしん (スタッフぶろぐ) » Blog Archive » Aptana Studio 1.1の日本語化 にある方法で良い。しかし、Aptana が起動しなかったり、「JVM terminated.Exit code=1」 というエラーが発生した場合は、JRE の重複を疑った方が良い。この件に関しても あいしん (スタッフぶろぐ) » Blog Archive » Aptana 1.2 日本語化 で紹介されている。

ただ、 あいしん (スタッフぶろぐ) » Blog Archive » Aptana 1.2 日本語化 では、JRE を上書きすると記述されているが、AptanaStudio.ini を次のように書き換えても良い。ここで、-vm オプションは -vmargs よりも前に記述する必要がある点に注意。-vm は環境によって異なるが、既にシステムにインストールしている javaw.exeのフルパス。尚、パスに空白などがある場合はパスをダブルコーテーションで囲んだ方が良いと思う。

この設定で Aptana が起動したら、AptanaStudio.ini を次のように編集する。

先ほどとの変更点は -javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar だけ。Aptana を起動すると UI は日本語化されているはず。Aptana は -vm オプションで指定したパスの javaw.exe を利用するから、Aptana をインストールしたディレクトリにある JRE は削除しても Aptana の使用には問題はない(注記1参照)。尚、Aptana が起動できなかった場合は、システムにインストールされていた JRE のバージョンが古い可能性がある。その場合は、最新の JRE をインストールするか、Aptana 付属 JRE のフルパスを明示的に指定すればよい(注記2参照)。

【注記1】Aptana の使用には問題ないが、Aptana をアンインストールするときあったはずの jre ディレクトリがないと怒られるかもしれない。不安な人は残しておけばよいと思う。

【注記2】Aptana 付属 JRE を使う場合は、当然ながら、Aptana をインストールしたディレクトリにある jre ディレクトリを削除してはならない。

以下、どうでも良い話。「Aptana Studio 1.2 を日本語化するには?」を知りたいだけであれば上記内容で十分。

Aptana には複数のインストール方法があり、Aptana + JRE がインストールされるものがある。Aptana をインストールしたディレクトリに jre というディレクトリがあれば、Aptana 専用の JRE がインストールされている。いわゆる private JRE という奴である(注記3参照)。

「JVM terminated.Exit code=1」 というエラーは JRE を起動できなかったことを意味するらしいが、JVM terminated Exit code - Google Search で検索すると、メーリングリストのエントリにヒットする。なぜか、The Official Eclipse FAQs - Eclipsepedia には解説がない。

まず、AptanaStudio.ini から Pleiades に関する行を削除して、Aptana が起動するか確かめたところ、問題なく起動する。次に、 log を見てみたいので AptanaStudio.ini を書き換える。

-vm は Aptana が使用する Java 環境を明示的に指定する。-consoleLog は log をコンソールに出力することを意味する。-vm は必ずしも指定する必要は無いが、Aptana が使用する Java 環境が既定で javaw.exe だった場合、コンソールが表示されるか分からなかったので明示的に指定した。すると、次図のようにコマンドプロンプトに log が表示され、Aptana が起動する。

image.png

問題なかったので、-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar を末尾に追加して Aptana を起動したところ、日本語化された。尚、 -javaagent は Java VM に与える引数であって eclipse は解釈しない。そのため、-vmargs
以降に記述する必要がある。-javaagent に関しては J2SE 5.0 Tiger 虎の穴 Instrumentation で解説されている。

ここまで作業したところ、問題が解決してしまったので、「JVM terminated.Exit code=1」が、「JRE を起動できなかったことを意味する」のかはよく分かっていない。日本語化に失敗していたら、ログに何か出力されると思ったのだが...。

【注記3】JRE は Sun が配布している JRE の構成を変更しなければ、必ずしも JRE のインストーラとして配布する必要は無く、Aptana のように、インストーラに組み込んで配布することが許されている。この場合、Aptana 専用の JRE となり、このような JRE を private JRE と言うらしい。private JRE は Java の自動アップデート機能(コントロールパネルの Java アイコンから設定できるもの)の対象外になる(と思う)ので、もし、JRE にセキュリティ上の問題が発生した場合、インストーラを提供した人が更新する必要がある。


タグ:Aptana Java Eclipse

iKnow! を改良しよう その6 [NT]

iKnow! を改良しよう その5 の続き。smart.fm のユーザフォーラムを見ていたら、トピック: その日の学習進捗状況を my page に表示-機能追加リクエスト というのを見つけた。 ここで取り上げられている機能は、まさしく、私が作成した Greasemonkey スクリプトそのものである。

ということで、需要があることは判明した。しかし安易に Greasemonkey のスクリプトを追加して欲しくないんだけどね。まぁ、Greasemonkey に限らず全てのソフトウェアについて言えることだけれど、あるソフトウェアが悪意を持って書かれたものではないということが分からないから。

例えば、Greasemonkey を使えば、入力されたパスワードをどこかに送信するスクリプトを記述するのも可能だ。セキュリティなんてあったもんじゃない。適用されるサイトをきちんと定義すれば、定義したサイト以外ではスクリプトは動かないので、アドオンよりはましかもしれないが...。

Greasemonkey ってコードが読める/書ける人向けのアドオンだからなー。ちなみに、Greasemonkey スクリプトを公開するまでにやらないといけないっぽいことのリストは次の通り。

  • 日付によるキャッシュのクリア
  • iKnow! は 85% を超えたらキャッシュを使用しないようにする。
  • 強制的なキャッシュのクリア
  • エラー処理...たくさん
  • smart.fm が微妙にレイアウトを変更する時がある(メンテナンスの時刻を告知するとき)ので、その対応。
  • 504 一時的に使用不可のレスポンスの対応
  • 使い方を説明した blog の記事の作成

ブログデザインの改善 [NT]

このブログのデザインは happy cafe time というテーマを使っている。java -> beans -> coffee -> cafe つながり。

だいたい良いのだが、最近のブログデザインは幅広が流行っているっぽい。そこで若干幅を広くした。so-net は CSS をカスタマイズできるので、あらかじめ用意されているテーマを元に修正が可能なのが利点だ。

ということで、以下修正メモ。

  • body, bg_img_w
  • container, 770pix->900pix
  • banner, 修正箇所を忘れた, main_w
  • main, 540pix->660pix
  • div.article-title, dotline_w
  • articles, 540->660
  • h2.article-title, title_w
  • article-bottom, dotline_w
  • footer, 770->900

上記で、bg_img_w、dotline_w、title_w、main_w はそれぞれ背景などの画像である。各画像はオリジナルの画像を元に画像編集ソフトで適当に幅を修正したもの。_w は wide の意味を表す。

  • title_w.gif, 664pix
  • dotline_w.gif, 661pix
  • bg_img.gif, 1495pix
  • main_w.jpg, 900pix

なお、CSS の編集には Firefox のアドオンである Firebug がとても便利だった。

例えば、HTML 要素のサイズを次のように容易に可視化できる。

image.png

また、CSS を変更した箇所をリアルタイムでプレビューできる(サーバーにある CSS を上書き保存するわけではない)。

image02.png

他のソフトでもできるけれど、ブラウザとアドオンだけで可能なのは便利だ。その分、Firefox が重くなるという意見をどこかで読んだ気もするけど。


タグ:blog Design

iKnow! を改良しよう その5 [NT]

iKnow! を改良しよう その4 ~prototype.js~ の続き。 smart.fm が作っている JavaScript を解析してもよく分からなかったので、別の方法で回避した。

prototype.js v1.5.0 の使い方 で解説されている Ajax.Responders や Using Prototype and Scriptaculous with Greasemonkey - Jimbojw.com に載っていた埋め込み JavaScript を  Greasemoneky で利用する方法を用いることで、問題は解消。「iKnow! を改良しよう」というネタで続けてきたスクリプトも、ほぼ完成した。

スクリプト適用前:

out2.gif

スクリプト適用後:

out.gif

作成した Greasemonkey 用ユーザスクリプトを適用すると次の機能が smart.fm に付与される。

  • 今日学習したリストには王冠のアイコンがつく。
  • 王冠のアイコンは Bronze、Silver、Gold があり、その日に学習すべきアイテムをいくつ学習したかによって異なる。
  • 一つも学習してないリストは鉛筆のアイコンになる。
  • アイコンをクリックすると、直接 iKnow! か Dictation のアプリケーションが立ち上がる。
  • アイコンの表示される条件は次の通り。
    • ページのロード
    • リストが多く複数ページある場合は、ページの遷移(Ajax的な)
    • ユーザスクリプトコマンドに登録したメニュー

不便だと感じていたから作ったものなので、私としてはとても便利。JavaScript/DOM の手習いにもなったし。

しかし、 改善すべき箇所を見つけた。今日の進捗状況を知るために各リストごとに XmlHttpRequest を発行している。iKnow と Dictatin の 2 つがあるから、私の場合は 1 ページあたり、最大 20 回 のリクエストが発生する。これはとても無駄である。たぶん、リクエストを受けたサーバでは DB を検索してレスポンスを返しているわけで、何とか負荷を下げたいところ。

ということで、簡単なキャッシュの仕組みを作った方が良さそう。キャッシュの作成には Greasemonkey の SetValue/GetValue を使えば良い。

自分だけが使うならサーバにかける負荷なんて無視できるレベルだろうが、公開する場合はそうもいかない...かもしれないし。使う人が少ないなら、気にすること無いのだが...

iKnow! を改良しよう ~その6~ へ続く。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。