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" するというのはなかなかキュートな方法だと思います。わざわざエンコードしておいた甲斐がありました。