2006年11月14日

バイナリアン度チェックの仕組み

先日公開した バイナリアン度チェックは JavaScript で実装されています。たいしたものではありませんが、ここではその仕組みを説明したいと思います。

 

JavaScript で診断テストを作る主なメリットは、ページ遷移なしでテンポよく採点ができること、サーバに負荷をかけないこと、です。

ページのソースを見るとわかるように、診断テストの部分はすべて http://0xcc.net/binhacks/quiz.js で行われています。

printQuestions() では document.write() で安易にHTMLを出力して問題を表示しています。問題は次のような JSON データです。

questions =[
  {
     "question": "nmで表示されるシンボルの前の文字(シンボルクラス)として使われていないのはどれでしょうか?",
     "candidates": [
       "C", "F", "N", "W"
     ],
     "answer": 2,
     "references": [
       "Hack #12 nm でオブジェクトファイルに含まれるシンボルをチェックする"
     ],
   },
   ...

loadQuestions() では問題のデータを http://0xcc.net/binhacks/questions.txt から XMLHttpRequest を使って (非同期ではなく) 同期的に取得しています。

八重樫さんの提案により、解答などを容易に覗き見されるのを防ぐために questions.txt は単純な方法でエンコードされています。エンコードは Ruby を使うと次のようにできます。元のファイルは UTF-8 である必要があります。

% ruby -e 'puts "String.fromCharCode(%s);" % ARGF.read.unpack("U*").join(",");' < orig > out

デコードは eval() するだけです。採点は正解の数 / 問題数 * 100 で単純に行っています。showAnswers() では innerHTML で解答を表示しています。

まとめ

バイナリアン度チェックの仕組みを説明しました。かなり安易なスクリプトですが、自由に改変して使っていただいてかまいません。

ちなみに、questions.txt をデコードする人はいるかなと思っていたら、 やっぱりいました。Ruby の String クラスに fromCharCode() クラスメソッドをつけて load "questions.txt" するというのはなかなかキュートな方法だと思います。わざわざエンコードしておいた甲斐がありました。