2011年1月23日日曜日

NetBeans 6.9.1でJavaScriptを実行する

RhinoはJavaのクラスを使う必要はあるが、ちょっとしたツールを作るとか、いろいろいじって確認したいといった用途なら、コンパイルも要らないのでとても手軽。JDK6に含まれているので、JDK6が入っていれば他に何も要らないのが特に有利です。

以前はNetBeansでJavaScriptを編集して、そのままRhinoで実行できた記憶があったのがだが、ちょっと調べた限り6.9.1では出来なかった。

ただ、とりあえず実行するだけなら簡単で、jrunscriptのMainを呼ぶだけでいい。Javaのクラスとかも補完してくれると良いんだけど…


手順は簡単

  1. 適当なJavaプロジェクトを作る
  2. JavaScriptのファイルを追加して適当に作る
  3. プロジェクトの実行ライブラリに${JDK_HOME}/lib/tools.jarを追加
  4. 実行の主クラスにcom.sun.tools.script.shell.Mainを設定
  5. 引数に2.で作ったJavaScriptのファイルを指定(JavaScriptに引数が必要ならさらに続けて書く。この引数はargumentsと言う名前で参照できる)
  6. 実行
これだけ。ついでに、jarの作成をしないとか、src/testフォルダを削除すればいい。

ソース,テストパッケージフォルダは不要

実行用ライブラリにtools.jarを追加する

jarは作らない

主クラス変更, 実行するjsファイルとjsに対する引数を書く

実行してみた

2011年1月13日木曜日

はてなのキーワードリンクを削除するブックマークレット再び

はてなのキーワードリンクを削除するブックマークレットで除去されないキーワードがあったので見たら、どうもokeywordというクラスもあるらしいことが分かりました。
そこで、keyword, okeywordのリンクを除去するようにしてみました。Selectors APIを使って、両方いっぺんに検索するようにしました。IE8ではドキュメントモードをIE8標準にすれば動きました。

javascript:(function(){var d=document,a=d.querySelectorAll(".keyword,.okeyword"),v,n=a.length;while(n--){v=a[n];v.parentNode.replaceChild(d.createTextNode(v.innerHTML), v)}})()

しかし、Selectors APIは便利ですね。


2011/2/13 追記
上のbookmarkletでは検索語がハイライトされている場合(アンカー中にハイライト用spanが入っている)に期待通り動かないので、対策しました。
自分でNodeを辿るしかないかと思っていましたが面倒だと悩んでいたところ、ふとDOM Rangeを思い出したので調べ直してみたらこれが便利そうなので使ってみました。かなり簡単で便利です。

ついでに検索語のハイライトも無効にするようにしてみました。はてなの検索語ハイライトはキャッシュが効いてしまって、検索してないのにハイライトされることがあって微妙だと思っていたので…

javascript:(function(){var d=document,r=d.createRange(),a=d.querySelectorAll("span.highlight,a.keyword,a.okeyword"),n=a.length,v;while(n--){v=a[n];r.selectNodeContents(v);v.parentNode.replaceChild(r.extractContents(),v);}})();
span.highlightを削れば、検索語のハイライトは残ります。

PythonでのU+005CとU+00A5

U+00A5(¥)は円記号, U+005C(\)はバックスラッシュで,
SJISにしたとき問題になる可能性があることはよく知られている.

Python(2.6.6)でのこの挙動を確認してみた.

>>> print u'\u00a5'
¥
>>> print u'\u005c'
\
>>> print u'\u005c'.encode('sjis')
\
>>> print u'\u00a5'.encode('sjis')
\
>>> u'\u00a5'.encode('sjis') == u'\u005c'.encode('sjis')
True

CP932を使うことが多いので, そっちでも確認しようとしたらU+00A5は変換できなかった.
>>> print u'\u005c'.encode('cp932')
\
>>> print u'\u00a5'.encode('cp932')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character u'\xa5' in position 0: illegal multibyte sequence