SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

JavaScriptでブラウザコマンドラインを実装する

コマンドをテキストボックスに入力し特定の機能を呼び出す方法

ダウンロード サンプルコード (1.2 KB)

拡張のためのアイデア

 このコマンドラインのコードは非常に短く、わずか100行ほどしかありません。これは、必要最小限の機能しか実装していないからです。ここでは、コードをより実用的なものにするためのアイデアをいくつか示します。

Unixスタイルのオプション

 このコマンドライン構文では、"g i"のような連続する単語を使って特定のコマンドを実装できるようになっています。このコマンドを"g -i"のように指定できれば、よりUnix風になって便利かもしれません。これを実装するには次のような方法があります。

  1. オプションからダッシュ(-)を取り除き、g_i()関数を呼び出す。
  2. g()という1つの関数を定義し、オプションを解釈する機能を持たせる。

関数の明確化

 このコードでは、アラート(alert)コマンドにal()という名前を付けました。コマンドを「alert」という名前にしたければ、alert()という名前のハンドラを実装することになりますが、これは許されません。JavaScriptには既にalert()という関数があり、これを再定義してはならないからです。

 この問題を解決する1つの方法は、bcl_g()bcl_g_i()のようにハンドラ名に接頭辞を使うことです。この規則は必須にすることも任意にすることもできます。任意にする場合は、bcl_g()が存在するかどうかをコードで確認する必要があります。存在しない場合は、次にg()が存在するかどうかを確認します。

セキュリティ

 ブラウザコマンドラインでは、自分で特に定義したハンドラだけでなく、任意のJavaScript関数を呼び出すことができます。ハンドラもしょせんは通常の関数にすぎません。ですから、alert helloコマンドを実行し、警告ウィンドウを開いて「hello」という単語を表示することもできます。しかし、誰でもアクセスできる場所にこのようなスクリプトを置くとトラブルを招きかねません。

 関数の明確化のための解決策は、このセキュリティの問題の解決策にもなります。つまり、ハンドラの名前を「bcl_」で始めるように義務付けて、ハンドラだけを呼び出せるように指定することです。もう1つの解決策は、すべてのハンドラ関数を配列またはオブジェクト内に閉じこめて、システムがその配列/オブジェクト内でのみハンドラを検索できるようにすることです。ただし、どちらの解決策も完全ではありません。ハッカーがブラウザのバグやその他の脆弱性を悪用し、「bcl_」で始まる関数を定義したり、ハンドラが含まれるオブジェクトを変更したりするJavaScriptコードを作成する可能性があるからです。

個別のファイルへのコマンドの分離

 ブラウザコマンドラインの便利さを実感すると、おそらく役に立つコマンドハンドラをたくさんため込むようになるでしょう。それらすべてをコマンドラインコードと共に同じファイルに保存すると、混乱を招くおそれがあります。例えばハンドラを機能別にまとめて、個別のファイルに保存すると便利です。ただし、非同期読み込みの問題のせいで、JavaScriptコードの読み込みに注意を要することがあります。そのため、コードの読み込みにAjaxの手法やAjaxフレームワークを使うことを検討してください。

解析の改良

 パーサーは、コマンドをスペースで分割して単語に分けるだけの非常に単純な仕組みです。しかし、次のコマンドを見てください。

% al "hello world!"

 このコマンドは正しく機能しません。本来は警告ボックスが開いて「hello world!」という単語が表示されるはずですが、実際には「hello」という単語しか表示されません(図4を参照)。

図4 パーサーが"hello world!"コマンドを分割する
図4 パーサーが"hello world!"コマンドを分割する

 パーサーはこのコマンドを次のような単語に分割します。

al
"hello
world!"

 引数は両方ともal()に渡されますが、al()関数は最初の引数しか認識しないため、最初の引数しか表示されません。

 この問題は、引用符を認識する、より複雑なパーサーを使うことで解決できます。ただし今度は、引用符をエスケープする構文が必要になります。完全なコマンドラインパーサーを実現するにはさまざまな要素が必要になります。必要な要素を自由に追加してください。

スクリプト言語のためのスクリプト言語

 コマンドラインが役に立つ理由はいくつも挙げられます。新しいコードを実行する場合は、ハンドラからコードを呼び出す方が、コードを呼び出すGUIを作成するよりもはるかに簡単です。コマンドラインは、本物のインターフェイスを実装する前に新しいコードを試してみる絶好の方法です。また、コマンドラインはマウスを必要以上に使いたくないせっかちな人にも役立ちます。

 今回のコマンドラインの実装は教育用にも適しています。いくつかの基本的なDHTML/JavaScriptの手法に加え、自身のコードを調べて関数を動的に呼び出すJavaScriptプログラムの機能も示しているからです。

 ブラウザコマンドラインは、ある意味でスクリプト言語のためのスクリプト言語と言えます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Greg Travis(Greg Travis)

ニューヨーク在住のJavaプログラマ兼テクノロジーライター。ハイエンドPCゲーム業界で3年間を過ごした後に、EarthWebに参加し、当時最新鋭のJavaプログラミング言語を用いた新規テクノロジーを各種開発。1997年以降は、さまざまなWebテクノロジーについてのコンサルタントを務める。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1234 2007/04/23 08:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー