http://www2.coins.tsukuba.ac.jp/~i021216/diary/?date=20060205#p02
考えてみると、確かに「Emacs Lisp スクリプトを書く」ことを指すのに「elispを作る」という言い方には自分は違和感がない。これが「Rubyを作る」だと違和感がある。Ruby本体をいじっているように感じてしまう。
うーん、何でだろう。
ちょっと思いついたのは、「Lisp = S式」という印象が強いからではないかというもの。「S式を作る」は意味が通る。無意識のうちに、elisp という言葉と S式を同一視しているのではないだろうか。
と書いてみたものの、自分のことながらよく分からないなぁ……
Selenium では、フィールドを JavaScript で記述することができます。 例えば
<tr> <td>verifyText</td> <td>hoge</td> <td>javascript{var d = new Date(); d.getFullYear()}</td> </tr>
は、JavaScript が解釈されて
<tr> <td>verifyText</td> <td>hoge</td> <td>2006</td> </tr>
とみなされます(2006年の場合)。値を動的に決定したいときには便利です。
ところが、これに
<tr> <td>verifyText</td> <td>hoge</td> <td>javascript{var d = new Date(); d.getFullYear()}</td> </tr>
のように改行を入れてしまうと、IE6 だと動くのですが、Firefox 1.5 だと動かな くなってしまうのに気がつきました。
この原因を調べてみました。
`javascript' というキーワードに反応して JavaScript が実行されるので、 js ファイルに対して `javascript' で grep してみると、selenium-api.js に処理があることが分かりました。Selenium.preprocessParameter がそれで す。
Selenium.prototype.preprocessParameter = function(value) { var match = value.match(/^javascript\{(.+)\}$/); if (match && match[1]) { return eval(match[1]).toString(); } return this.replaceVariables(value); }
テストの JavaScript 文に改行を入れたときこの関数に渡ってくる値を alert で見てみました。すると、IE だと改行がなくなっているのに対し、Firefox では改行が そのまま入っているのが分かりました。
preprocessParameter は selenium-executionloop.js の中にある TestLoop.executeCurrentCommand から呼び出されていて、引数には command.target と command.value という値が渡されています。
この command オブジェクトの出自を調べていくと、 selenium-testrunner.js の
function nextCommand() { var row = currentTest.nextCommand(); if (row == null) { return null; } row.cells[2].originalHTML = row.cells[2].innerHTML; return new SeleniumCommand(getText(row.cells[0]), getText(row.cells[1]), getText(row.cells[2])); }
にたどりつきます。さらに getText は htmlutils.js で定義されていて、 その定義は次のようになっています。
function getText(element) { text = ""; if(element.textContent) { text = element.textContent; } else if(element.innerText) { text = element.innerText; } // Replace with a space // TODO - should this be in the match() code instead? text = text.replace(/\240/g, " "); return text.trim(); }
これで大本にたどりつきました。 textContent と innerText について IE と Firefox での挙動を調べてみると
という結果になりました。(ちなみに、element.firstChild.nodeValue にしても改行に関しては同じ結果です)
よって元に戻ると、preprocessParameter で
var match = value.match(/^javascript\{(.+)\}$/);
によって javascript の処理をするかどうかを判定する際、 `.' が改行にマッチしないために IE と Firefox によってテストの挙動が変 わっていたということになります。
正規表現でのマッチの際、文字列に改行が含まれうることを考慮して
var match = value.match(/^javascript\{((.|\r?\n)+)\}$/);
にすると、Firefox でも javascript{ ... } の中に改行を含めることができ ました。
「メインマシンがLinuxって快適ですか?」の話題。
たま〜に、メインマシン Linux 化できたらなぁと思うことはあるのですが、 そうするとゲームができなくなっちゃうので自宅のマシンは移行できないですね。 それさえなければ、多分 Linux にしてると思います。 大学にいたころは研究室のデスクトップは Debian でした。
今 Linux 化できそうなのは、会社のマシンかなぁ。
http://d.hatena.ne.jp/higepon/20060219/1140324237#c1140333381
WMの設定いじって、Alt+h or Alt+l で仮想デスクトップ移動。Alt+j でウィンドウの最大/最小化。Alt+k で kterm 起動という設定にしてる。 これで、ほとんどマウスを使わないで済む。使わなくなると、今までいかにマウス操作のために無駄に精神的コンテキストスイッチしていたかがわかります。
Windows 上で、自分も同じようなことをしています。
ランチャーに CraftLaunch を使っているのですが、 このランチャーでは、キーボードでのコマンドに「アプリケーションのアクティブ化」を割り当てることができます。
これで、Ctrl+Shift+Space Alt+Enter でブラウザのアクティブ化、 Ctrl+Shift+Space Ctrl+Enter で Meadow のアクティブ化がされるように設定しています。 (Ctrl+Shift+Space で CraftLaunch がアクティブになる)
さらに、仮想デスクトップソフト Virtual Desktop for Win32 を入れ、さらに 各仮想デスクトップごとに置くアプリケーションを決めています。 具体的には、縦2×横3個のデスクトップを設定しているのですが、左上にはブラウザ、中上には Meadow、中下には Cygwin のシェル (ck を使っています)、と言った具合です。
これによって、現状がどういう状態であっても、ブラウザをアクティブにするには、左上のデスクトップに移って(これもキーボードで移動できるようにしています。Ctrl+Alt+hjkl を設定しています)から Ctrl+Shift+Space Alt+Enter と入力すればよいことになります。
アプリケーションをキーボードから起動するのにランチャーを使うという話はよくありますが、 アプリケーションをキーボードから一発でアクティブにできるようにするという話はあまり聞かない気がするので書いてみました。 便利ですよ。
テストを [Selected] で実行するときに、どのテストを実行しているのかがはっきりするので便利です。 (なお、TestRunnerはこちら のものを使っています)
--- TestRunner2.html 2006/02/08 01:31:16 +++ TestRunner2.html 2006/02/15 05:51:36 @@ -61,6 +61,7 @@ <tr class="selenium"> <th width="20%" height="1" class="header"> <h1><a href="http://selenium.thoughtworks.com" title="The Selenium Project">Selenium</a> TestRunner</h1> + <div id="currentTestName">TestName</div> </th> <td width="80%" height="30%" rowspan="2"><iframe name="testFrame" id="testFrame"></iframe></td> </tr>
--- selenium-testrunner.js 2006/02/07 03:03:42 +++ selenium-testrunner.js 2006/02/15 05:51:36 @@ -93,6 +93,14 @@ return document.getElementById('testFrame'); } +function getCurrentTestNameField(){ + return document.getElementById('currentTestName'); +} + +function displayCurrentTestName(name){ + getCurrentTestNameField().innerHTML = name; +} + function loadAndRunIfAuto() { loadSuiteFrame(); } @@ -265,6 +273,8 @@ } currentTest = new HtmlTest(getIframeDocument(getTestFrame())); + + displayCurrentTestName(getTestFrame().src.replace(/^.*\//, '').replace(/\.[^.]*$/, '')); testFailed = false; storedVars = new Object();
YARV試してほしいとのことでしたので、 YARV の SVN HEAD で Hiki の CVS HEAD を動かしてみました。
環境は Debian sarge。
% uname -a Linux kazuki 2.6.8-2-686-smp #1 SMP Tue Aug 16 12:08:30 UTC 2005 i686 GNU/Linux
YARV のビルドは、http://www.atdot.net/yarv/ に書いてあるとおりでできました。(前もって autoconf が必要)
make test-all の結果は 1807 tests, 13350 assertions, 14 failures, 0 errors。
「差分」メニューでページの差分を見ようとすると、次のようなエラーが出ました。
undefined method `exclusive' for YARVCore::VM::Thread:Class
また、管理画面で設定を保存したあと、さらに何かにアクセスすると次のようなエラーが出ました。
/home/ani/public_html/hiki/hiki/util.rb:193:in `theme_url': stack level too deep (SystemStackError) /home/ani/public_html/hiki/hiki/config.rb:214:in `eval' /home/ani/public_html/hiki/hiki/util.rb:193:in `theme_url' /home/ani/public_html/hiki/hiki/util.rb:193:in `theme_url' ... (途中 10000 行くらい) /home/ani/public_html/hiki/hiki/util.rb:193:in `theme_url' (eval):1:in `block in load_cgi_conf' /home/ani/public_html/hiki/hiki/config.rb:214:in `eval' /home/ani/public_html/hiki/hiki/config.rb:214:in `block in load_cgi_conf' /home/ani/public_html/hiki/hiki/config.rb:214:in `each' /home/ani/public_html/hiki/hiki/config.rb:214:in `load_cgi_conf' /home/ani/public_html/hiki/hiki/config.rb:18:in `initialize' hiki.cgi:20:in `new' hiki.cgi:20:in `<main>'
というわけで、残念ながら Hiki はまだ YARV では動かないようです。
_ ささだ [うーん、まぁなんとなくは動いているということで ^^; Thread.exclusive は YARV ではサポ..]
_ yanagi [そういや 1.9 で Hiki がどうなるか試していなかったなぁ…… 後で試してみます。]