« 2009年04月 | メイン | 2009年06月 »

2009年05月 アーカイブ

2009年05月06日

環境変数にIDやPASSWORDを設定しなければならない状況で、ID/PASSWORDをファイルに平文で保存したりシェルの履歴に残したくない

zshを前提にしているが、問題の解決方法が重要なので、ちょっと記述を変更すれば他のシェルでもできるようになるはず。また、暗号化には「gpg」の共通鍵暗号化方式(対象鍵)を使用している。
環境変数にIDとPASSWORDを設定しなければならない場合、例えばProxyだと次のようになる。
export http_proxy="http://userid:password@proxyaddress:portno/"
これを、「.zshrc」等に記述するか「zsh」で打ち込むのだがセキュリティ上の問題がある。「.zshrc」に記述する場合はID/PASSWORDを平文で保存しなくちゃならない。直接打ち込むとシェルの履歴に残ってしまう。色々な人の協力を得て、簡単ではあるがこれを解決する方法を見つけることができた。
まず、次の関数を「.zshrc」等に記述して「source」で読み込むか「zsh」を再起動する。
secenv()
{
    file=~/.secret_environment_value
    if [ $# -eq 0 ]; then
    `gpg <$file`
    fi
    if [ $# -eq 1 ]; then
    `gpg -c --output $file $1`
    fi
 }
環境変数を設定するファイルを準備する。
env.txt
export http_proxy="http://userid:password@proxyaddress:portno/"
export ftp_proxy="http://userid:password@proxyaddress:portno/"
export HTTP_PROXY="http://userid:password@proxyaddress:portno/"
export FTP_PROXY="http://userid:password@proxyaddress:portno/"
ここではファイル名を「env.txt」にした。そしてさっきの関数にファイル名を指定して実行する。
secenv env.txt
パスワードを2回聞かれるので入力する。暗号化された情報が「~/.secret_environment_value」に保存される。そして、env.txtを残しておくと危険なので削除。
rm env.txt
これで準備は完了。後は環境変数の読み込みが必要になった時に次のコマンド実行してパスワードを入力すれば良い。
secenv
関数内の処理の肝は「gpg」のファイル指定に「<」を使っている事と「`」を使って実行している事。「gpg」を「<」を付けずに実行すると、暗号化した内容が実ファイルとして出力されてしまう。環境変数の反映には「source」を使うべきだと勝手に思い込んでいたが、「source」は引数にファイルしか指定できないようなのでどうしようか悩んだけど、「`」の存在を思い出した。関数を弄れば反映させる環境変数を選択することも可能になると思う。
2009/05/08 追記 関数にした理由
当初は以下のような方法で済むと考えてた。
alias make-secenv="gpg -c --output ~/.secret_environment_value"
alias secenv="`gpg <~/.secret_environment_value`"
しかし、この方法だとうまくいかなかった。.zshrcは正確には設定ファイルではなく、あくまで実行スクリプト(のはず)なので、別名を設定しようとした時、つまりzshの起動時に復号化してしまう。JavaScriptであればこのような場合、無名関数に閉じ込めて遅延評価をさせたりする。shellでも同様な事ができないかと調べていたら関数でできそうだとわかった。実は、shellの関数を書いたのははじめてだったりする。
2009/05/08 追記 hist_ignore_space
zshであれば履歴に残さないようにする設定があると、複数の人から聞いた。
setopt hist_ignore_space
履歴に残したくないコマンドははじめにスペースを入れておくと良いらしい。お手軽だけど「shoulder hacking」の危険があって一長一短かな。
2009/05/08 追記 chmod 600
はてなブックマークで、permissionを600にしておくというアイディアを頂いた。なるほど。これでも用途によっては大丈夫そうだ。欠点はroot権限保持者に見られる可能性とcygwinの場合は対応できないことか。
2009/05/08 追記 secenv関数の短所
柔軟性には欠けると思う。他に何か欠点ってあるのかな。
2009/05/08 追記 どの方法をとるべきか
関数・hist_ignore_space・permissionのどの方法を採用するのか。まあ、それぞれ一長一短なので長所短所を踏まえた上で選択すればいいのかな。

2009年05月09日

Macportsでインストールするときにハマった - どのバージョンのパッケージが有効なのか注意

「MacPorts」で「FFmpeg」をインストールしているときにこんなエラーが出てインストールの継続ができなかった。
% sudo port install ffmpeg
Password:
--->  Fetching XviD
--->  Attempting to fetch xvidcore-1.1.3.tar.bz2 from http://distfiles.macports.org/XviD
--->  Verifying checksum(s) for XviD
--->  Extracting XviD
--->  Applying patches to XviD
--->  Configuring XviD
--->  Building XviD
--->  Staging XviD into destroot
--->  Installing XviD @1.1.3_1
--->  Activating XviD @1.1.3_1
--->  Cleaning XviD
(略)
Error: Target org.macports.configure returned: configure failure: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_x11_xorg-libX11/work/libX11-1.2.1" && ./configure --prefix=/opt/local --without-xcb " returned error 1
(略)
checking for XPROTO... configure: error: Package requirements (xproto >= 7.0.13) were not met.
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively you may set the XPROTO_CFLAGS and XPROTO_LIBS environment variables
to avoid the need to call pkg-config.  See the pkg-config man page for
more details.

Error: The following dependencies failed to build: libsdl xorg-libXext xorg-libX11 xorg-libXrandr xorg-randrproto libtheora libvorbis schroedinger liboil x264 yasm
Error: Status 1 encountered during processing.
エラーになった。再度実行。
% sudo port install ffmpeg   
Password:
--->  Configuring xorg-libX11
Error: Target org.macports.configure returned: configure failure: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_x11_xorg-libX11/work/libX11-1.2.1" && ./configure --prefix=/opt/local --without-xcb " returned error 1
(略)
「X11」のエラーっぽかったので色々弄ったけど解決しない。「Leopard」の「X11」はバグがあって「GIMP」を正常に使えない。このため、「X11」を入れ直していたので、「X11」だけでなく「GIMP」との依存関係も疑った。最終的に「GIMP」と「X11」を削除までした。
それでも解決せず。エラーをよく見ると「pkg-config」とあるので実行してみた。
% pkg-config
Must specify package names on the command line
パッケージ名がいる? @nankiさんの推測は、「pkg-config」から「xproto」が読めていないか、環境変数が設定されていないのではとの事。「Alternatively...」の下りと「Package requirements (xproto >= 7.0.13) were not met.」を見ると、確かにそんな感じがする。「xproto.pc」を探せば良いらしい。「.pc」というのは「pkg-config」用のファイル。
パッケージの依存関係を調べるのが「pkg-config」で、「pkg-config」に情報を提供するのが「.pc」ってことか...。
% locate xproto.pc
/opt/local/lib/pkgconfig/xproto.pc
/opt/local/var/macports/software/xorg-xproto/7.0.11_1/opt/local/lib/pkgconfig/xproto.pc
/usr/X11/lib/pkgconfig/dmxproto.pc
/usr/X11/lib/pkgconfig/xproto.pc
「.pc」ファイルはあった。
% locate xproto.pc | xargs ls -al
-rw-r--r--  2 root  admin  214  5  9 09:41 /opt/local/lib/pkgconfig/xproto.pc
-rw-r--r--  1 root  admin  214  1  5  2008 /opt/local/var/macports/software/xorg-xproto/7.0.11_1/opt/local/lib/pkgconfig/xproto.pc
-rw-r--r--  1 root  wheel  184 12 28 20:01 /usr/X11/lib/pkgconfig/dmxproto.pc
-rw-r--r--  1 root  wheel  212 12 28 20:04 /usr/X11/lib/pkgconfig/xproto.pc
権限的には見えてるはず。単純にインストールされていないとか...。いやそれなら「MacPorts」が解決してくれるはず。もしかして「.pc」だけあったりして。インストール状況を見てみる。
% port installed|grep "xproto"
  xorg-xproto @7.0.11_1 (active)
  xorg-xproto @7.0.15_0
原因が掴めたかも。古いバージョンのほうが有効になってる。「MacPorts」は存在しないパッケージの依存関係を調べて同時にインストールをしてくれるけど、既に入っているパッケージは変更しないと推測。確かに勝手にやられたら困る事もあるだろうなぁ。
% port active xorg-xproto
Unrecognized action "active"
「activate」らしい...。
% port activate xorg-xproto
--->  The following versions of xorg-xproto are currently installed:
--->    xorg-xproto @7.0.11_1 (active)
--->    xorg-xproto @7.0.15_0
Error: port activate failed: Registry error: Please specify the full version as recorded in the port registry.
ああ、バージョンの指定...。
% port activate xorg-xproto @7.0.15_0
--->  Activating xorg-xproto @7.0.15_0
Error: port activate failed: Image error: Another version of this port (xorg-xproto @7.0.11_1) is already active.
「active」は自動的に切り替わらないのか...。
% sudo port deactivate xorg-xproto @7.0.11_1
--->  Deactivating xorg-xproto @7.0.11_1
権限...。
% sudo port deactivate xorg-xproto @7.0.11_1
--->  Deactivating xorg-xproto @7.0.11_1
「active」な「xorg-xproto」なし。
% sudo port activate xorg-xproto @7.0.15_0
--->  Activating xorg-xproto @7.0.15_0
これで良いのかな。
% sudo port install ffmpeg
--->  Configuring xorg-libX11
--->  Building xorg-libX11
--->  Staging xorg-libX11 into destroot
--->  Installing xorg-libX11 @1.2.1_0
--->  Activating xorg-libX11 @1.2.1_0
--->  Cleaning xorg-libX11
(略)
@ujihisaさん達につっこまれながらもとりあえずOK。インストールを継続できた。これ知らなかったら確実にハマる。

2009年05月13日

スクリーンショットを印刷してもクオリティを落とさないようにする本当の方法

あまりにも酷いので反応しておく。
自分自身の知識も中途半端なので、間違いがあれば指摘して欲しい。手元にPhotoShopがないためGIMPを使用して説明するが、今回のような処理の場合はアプリケーションによる差異は論点に大きな影響を及ぼすレベルではないはずだ。また、商用印刷レベルの話は今回は視野に入れていない。
元の記事に書かれている画像処理は二段階。一段階目が減色処理。二段階目は拡大縮小処理。順番に説明していく。
減色処理
歴史的な部分から説明する。最近では意識するはほどんどないが、単純にパソコンで使用可能な色と言えば2種類ある。ひとつ目は文字通り「使用可能な色数」、ふたつ目は「一度に使用可能な色数」。例えるなら前者は絵の具の数で、後者はパレットのくぼみの数。絵の具が4096色でパレットのくぼみが16色という感じだ。この場合の絵の具というのは現実世界の絵の具と違い混ぜる事ができない点は留意してほしい。10年程前のWindowsでもディスプレイ表示には、表示サイズによっては256色しか表示できない等の制限があった。256色同時使用の時、Windowsで使用している絵の具とMacintoshで使用している絵の具の種類が一部違っており、両者共通の絵の具は、256色中216色、つまりこの絵の具だけを使用していればWindowsとMacintoshの両方で同じように表示できた。この216色をWebセーフカラーという。厳密に言えばWindowsとMacintoshのモニタは色温度が違うがここでは言及しない。一度に使うパレットのくぼみの数が少なければ少ない程、覚えておかなければならない色の種類が減るため、画面の場合は必要なビデオラム(VRAM)の容量がへり、画像の場合はファイルサイズが小さくなる。画像で使用するパレットのくぼみを減らすと当然使用できる絵の具の数が減るため画質が落ちる。容量を節約しつつも適度な画質を残しておくのが、当時の画像処理アプリケーションの性能でもあり減色処理をする人の腕の見せ所だ。使用する絵の具をいくつにするか、どの絵の具を使用するか経験がものをいった。パソコンが256色表示、画面解像度を落としても65,536色の時代の話だ。
しかし今では、普通に使用していればこの辺りを特に意識する事はない。勿論大量の画像をサイトに貼るときや巨大すぎる画像を扱うときは注意は必要だが、今や画面表示に16,777,216色を使う時代だ。元の記事にある「インデックスカラー」というのは、パレットのくぼみの数を最高でも256まで減らしてしまう。
実例を準備した。GIMPのカラーホイールをスクリーンショットして保存したもの、それを256色(最適パレット使用)に減色したものだ。減色したものはディザリングをしていないものと適応したものを作成したため、全部で3種類ある。ディザリングについては詳細に触れないが、減色結果を見てもらえればなんとなく意味がわかると思う。
減色前
減色前
256色に減色(最適パレット使用・ディザリングなし)
256色に減色(最適パレット使用・ディザリングなし)
256色に減色(最適パレット使用・ディザリングあり)
256色に減色(最適パレット使用・ディザリングあり)
ディザリングの有無に限らず、明らかに画質が劣化している。このような画像を見てクオリティが落ちないと言えるのだろうか。補足すると減色処理をしなければならない事もある。一例がアニメーションGIFだ。FlashやAPNG、もしくはJavaScriptでもアニメーションが可能であるが、正常に表示される可能性が一番高いのはアニメーションGIFであることには変わりがない。
拡大縮小処理
個人的には、拡大縮小処理はあまりお勧めしない。考えられる用途は、スクリーンショットをとってExcel等の別アプリケーションに張り込む事だとではなかろうか。で、あるならそのまま張り付け、ドローの機能を使って拡大縮小すれば良い。最近のアプリケーションは、内部的にどのような処理が行なわれているかわからないが、クオリティが高いまま拡大縮小してくれる。知っている限りで酷いものといえば、数世代前のWindows版PowerPointで、張り込んだ画像のアンチエイリアス処理は見られたものではなかった。現行バージョンではどうなっているかわからないことは付け加えておく。とりあえずこの段階で貼付けて拡大しその品質を確かめて見ればいいと思う。
次に考えられる用途は、スクリーンショットをそのまま印刷する用途だ。この場合、画像の再サンプルは行なわずに、解像度かドキュメントの幅・高さだけ変えれば良い。解像度とドキュメントの幅・高さは連動しており、解像度を高くすれば画像の長さ面積は小さくなる。属性のみで拡大縮小を制御すれば、画素データには一切手を加えないため、品質は勿論高い。最近のプリンタの性能は驚く程高く、プリンタへ出力するデータの解像度がプリンタの解像度と整数比になっていなくても綺麗にプリントしてくれる。なぜ、整数比が重要なのかは後述する拡大縮小処理を読んでもらいたい。とにかく、最近のプリンタドライバの性能を信じて頂きたい。
さて、拡大縮小処理を自分で行なわなければならない場合があったとする。または、アプリケーションの画像処理能力やプリンタドライバの性能を信じられずに、全部自分でやりたいのかもしれない。スクリーンショットの内容はなんだろうか。文字なのか写真がメインなのかイラストか、それともそれらの混合だろうか。何をスクリーンショットしたかによって適切な方法が若干変わってくる。これを理解するためには画像の再サンプルの方法を知らなければならない。主要な再サンプル方法は3つ、ニアレストネイバー法(nearest neighbor convolution)、バイリニア法(bi-linear convolution)、バイキュービック法(bi-cubic convolution)である。ニアレストネイバーを直訳すると「一番近い隣」という通り、拡大後の画素の補完の際、拡大前の点の相対的に一番近い点の色を採用する方法である。拡大前の色をそのまま使用し拡大後の画素を決定するため、使用する色数は変わらない。また、新しい中間色が発生しないため、スクリーンショット画像に向いている。ここで、補完に四方の画素の中間色を使用するバイリニア法や八方の中間色を使用するバイキュービック法を使用すると、スクリーンショット画像にはなかった新たな補完色が発生してしまい本来の表示にはならない。バイリニア法とバイキュービック法は単純な平均値ではなく、拡大前の点との相対距離も計算に含めるらしい点、バイキュービック法は正確には4ピクセル×4ピクセルを使用するらしい事を補足しておく。とにかく、バイリニア法やバイキュービック法を使用すると意図しない色が発生する。例えば、拡大処理する前のスクリーンショットに描かれている文字にアンチエイリアスがかかっていなかったとしても、拡大後のスクリーンショット画像の文字はアンチエイリアスがかかったようになってしまうということだ。スクリーンショットをとるような場合、どのように表示されていたかが重要なはずだ。勝手に見た目を変更してもらっては困る。写真を含むスクリーンショットも、デスクトップ画面として扱うのであれば元の状態のまま拡大したいはずだ。写真として扱いたいのであれば、バイリニア法やバイキュービック法でも良いとは思うが、スクリーンショットよりも画像ファイルをそのまま取得したほうが最良な手ではないだろうか。ただし、ニアレストネイバー法にも弱点はある。元のサイズの整数倍でないと綺麗にならない場合がある。2ピクセル×2ピクセルの画像を3ピクセル×3ピクセルに拡大するバターンを考えてもらえれば、この弱点がよくわかると思う。実際にはこのような極端な例は少なく、ある程度の大きさの画像であればさほど問題にはならないはずだ。元の記事は画像の拡大に「バイキュービック法」を採用しているが、以上の理由により自分で画像処理をするのであればニアレストネイバー法を採用すべきと思う。
スクリーンショットのお勧めの方法
スクリーンショットの画像は何も弄らずにそのままアプリケーションに貼ったり読み込んだりしてみる。そして、表示したいサイズにドローの機能を使って拡大縮小をする。表示結果や印刷結果に納得がいかない場合に初めて画像処理を行なえば良い。この方が時間の節約にもなるし、変に拡大してドキュメントのファイルサイズを増やす事もない。
もう何点か
元記事では、スクリーンショットの撮り方を「Ctrl+PrtSc」としているけど「PrtSc」だけでいいと思うのだが、ノートPCやコンパクトタイプのキーボードならそういうのもありえるのだろうか。
スクリーンショットはMacintoshの用語で、Windowsではプリントスクリーンやハードコピーと言うのではないのかと思っているのだがどうなのだろうか。

2009年05月15日

言語牧場

なんか牧場とか交配とか流行っているらしい。
プログラム言語を交配してみようかな。
言語の歴史は交配の履歴そのものだからね。
じゃあ、JavaScriptとVB6を交配してみよう。
JavaScript
//1から10の合計を求める
var sum=0;
for(var i=1;i<=10;i++){
    sum+=i;
}
VB6
'1から10の合計を求める
Dim sum
sum=0
For i=1 To 10
    sum=sum+i
Next
JavaScript+VB6
Rem 1から10の合計を求めろ
var sum=0;
for(var i=1;i<=10;i++){
    sum+=i;
}
ちょw
コメントだけ!
何もしなくて口だけ出すのか!
しかも命令している!
いや、Remって懐かしすぎるw
...。
もうちょっと何かしようよ。
頑張れVB!
頑張れMS!
控えめなJavaScript+頑張ったVB6
//1から10の合計を求める
var excel=ActiveXObject("Excel.Application");
だめぇぇぇ!!!
クライアントでExcel起動して計算しちゃだめぇぇぇ!!!
それってJScript!!!
IE限定ならクライアントサイドVBScriptでいいじゃん!!!
ごめんなさいorz
もう頑張らなくていいです...。
反省
ネタが古すぎた...。

2009年05月19日

オプション指定なしでFFmpegをインストールすると、バージョンによってライセンスが変わってしまう

FFmpegのインストールオプションが変わっているようだ。
上記の記事を書いた時点(2008/09/18)でのFFmpegのインストールオプションは以下の通り。
% port variants ffmpeg
ffmpeg has the variants:
    universal
    darwin_i386
    gpl: allow use of GPL code, the resulting libav* and ffmpeg will be under GPL
    postproc: enable GPLed postprocessing support
    lame: enable MP3 encoding via libmp3lame
    extvorbis: enable Vorbis encoding via libvorbis, native implementation exists
    theora: enable Theora encoding via libtheora
    faac: enable FAAC support via libfaac
    faad: enable FAAD support via libfaad
    xvid: enable Xvid encoding via xvidcore, native MPEG-4/Xvid encoder exists
    x264: enable H.264 encoding via x264
    a52: enable GPLed liba52 support
    avfilter: video filter support (replaces vhook)
しかし、最新のバージョンでは違っている。
上記エントリーを書いたときのログに残っていたインストールオプションは以下の通り。
% sudo port variants ffmpeg
Password:
ffmpeg has the variants:
    no_mmx: disable all x86 asm optimizations
    no_gpl: disallow use of GPL code, license will be LGPL
    speex: enable Speex decoding via libspeex
インストールをすると次のような表示になる。ただし、この表示をコピーするために一度FFmpegを消してからインストールをやり直しているので、依存しているパッケージのビルド等は表示されていない。
% sudo port install ffmpeg 
--->  Fetching ffmpeg
--->  Verifying checksum(s) for ffmpeg
--->  Extracting ffmpeg
--->  Applying patches to ffmpeg
--->  Configuring ffmpeg
--->  Building ffmpeg
--->  Staging ffmpeg into destroot
--->  Installing ffmpeg @0.5_2
--->  Activating ffmpeg @0.5_2

*******
******* This build of ffmpeg includes GPLed code and
******* is therefore licensed under GPL.
*******
******* The following modules are GPLed:
*******
*******      postproc
*******      swscale
*******      libfaad
*******      libx264
*******      libxvid
*******
******* To include only LGPLed code use variant +no_gpl
*******

--->  Cleaning ffmpeg
つまり、以前のバージョンであれば、オプションを指定せずにFFmpegをインストールしても、GPLのencoderはincludeされないためLGPLだったけど、今のバージョンではオプションでincludeを拒否しないとGPLになるってこと。ライセンスに厳しい開発をやっているなら気をつけないといけないなぁ。

2009年05月20日

iモードブラウザ2.0のJavaScript

今日、正確には昨日発表されたdocomoの携帯電話に組み込まれているiモードブラウザがやっとJavaScriptに対応したようだ。
他には外部CSSやCookieにも対応している。
これまでのドコモはWindows・Microsoftよりのイメージだった。ダウンロードできるツールは(ほぼ?)全てWindowsでしか使えなかったり、サービスもWindowsばかりだった。JavaScriptもWindows寄りだったら嫌だなぁと思っていたが、今回はどうも違うらしい。
仕様をざっと見たところ、標準に準拠しているようだ。例えば、addEventListenerがあってattachEventはなかったり。XMLHttpRequestにも対応しているのを見てちょっと興奮した。Cookieに対応したため、個体識別番号を使う必要がなくなり、開発も楽になるし(個体識別番号による名寄せが不可能になるため)セキュリティも向上する。
少々疑問なのは対応している画像がGIF・JPEG・BMPだけで、PNGに公式に対応していないこと。Content-Typeの説明のところにPNGの例が載っているので機種依存と理解すればいいのかもしれない。
あと、JavaScriptやCSSがこれだけモダンな実装にも関わらず、HTMLだけが過去の書式を引きずっているところが気になる。確かにXHTMLではなくHTMLなのでタグ名を小文字で書く必要がないのだが、折角ここまでやったのだからHTMLも小文字にすればいいのにと思う。まあ、独自実装の属性があったり下位互換の問題があるのかもしれないけど、今時、小文字タグ名に対応していない端末があるのかなぁ。FRAMEやIFRAMEにも対応したので、バージョンを一気に8.0まであげても良かったんじゃないのかなぁ。
関係ないけど、MDCにも日本語の説明がないJavaScriptやDOMの簡単な説明も載っていたのであとで見返す。

2009年05月31日

ワンクリックでコナミコマンドを実行するKonamiCommander

インターネットを見ていて、コナミコマンドの入力が必要になった時、いちいちマウスから手を離してキーボードから「上上下下左右左右BA」するのは面倒ですよね。パソコンを使っているのですから、単調な作業や繰り返しする入力は自動化したいものです。そこで、コナミコマンドを入力するBookmarkletを作成しました。
/*
================================================================================
    Name        :   KonamiCommander Ver1.0.1
    In          :   [none]      
    Out         :   [none]      
    Note        :   コナミコマンドを入力するBookmarkletです。
--------------------------------------------------------------------------------
    Version     :   Ver1.0.0    |   2009/05/31  |   新規作成
                :   Ver1.0.1    |   2009/07/08  |   Safariに対応
--------------------------------------------------------------------------------
    License     :   MIT license
    URL         :   www.kanasansoft.com
================================================================================
*/

(
    function(){
        [38,38,40,40,37,39,37,39,66,65].forEach(
            function(keyCode){
                ["keydown","keypress","keyup"].forEach(
                    function(eventName){
                        var eve=document.createEvent("Events");
                        eve.initEvent(eventName,true,false,window,1);
                        eve.keyCode=keyCode;
                        document.body.dispatchEvent(eve);
                    }
                );
            }
        );
    }
)();
KonamiCommanderを導入し、アナタのインターネット生活をパワーアップしましょう。
説明
Firefoxでしか動作しないはずです。せめてSafari3で動作すればiPhoneやiPod touchからもコナミコマンドを入力できるようになったかもしれないのですが...。dispatchEventをbody要素でしているので、documentElementオブジェクトやwindowオブジェクトへaddEventListenerされていてもイベント伝播で対応できているはずです。
2009/07/08 追記
KonamiCommanderを修正しiPod touchとSafariで動くようになりました。iPhoneでも動作するはずです。Safariではどうも生成したイベントに関連づいたプロパティが初期化されてしまうようです。
KonamiCommander Ver1.0.0の処理概要
function f(e){
    alert(eve.keyCode);     //=>Firefox3の場合38,Safari4の場合0
    alert(eve.charCode);    //=>Firefox3の場合38,Safari4の場合0
    alert(eve.myCode);      //=>Firefox3の場合38,Safari4の場合38
}
document.body.addEventListener("keydown",f,false);

eve=document.createEvent("UIEvents");//UIEventでも動いた
eve.initUIEvent("keydown",true,false,window,1);
eve.keyCode=38;
eve.charCode=38;
eve.myCode=38;
document.body.dispatchEvent(eve);
イベントの初期化の例
//Firefox3では何故か動作しません
function f(e){
    alert(eve.keyCode);     //Safari4の場合0
    alert(eve.charCode);    //Safari4の場合0
    alert(eve.myCode);      //Safari4の場合38
}
document.body.addEventListener("keydown",f,false);

eve=document.createEvent("KeyboardEvents");//KeyboardEventでも動いた
eve.initKeyboardEvent("keydown",true,false,window,1);
eve.keyCode=38;
eve.charCode=38;
eve.myCode=38;
document.body.dispatchEvent(eve);
KonamiCommander Ver1.0.1の処理概要
function f(e){
    alert(eve.keyCode);     //=>Firefox3,Safari4共に38
    alert(eve.charCode);    //=>Firefox3,Safari4共に38
    alert(eve.myCode);      //=>Firefox3,Safari4共に38
}
document.body.addEventListener("keydown",f,false);

eve=document.createEvent("Events");//Eventでも動いた
eve.initEvent("keydown",true,false,window,1);
eve.keyCode=38;
eve.charCode=38;
eve.myCode=38;
document.body.dispatchEvent(eve);
イベント生成・初期化・発火のブラウザ間の互換性についてのまとまった情報が欲しいですね。
iPhone/iPod touchでBookmarkletを登録するには以下をご利用ください。
Google

タグ クラウド