トップ 最新 追記

活動日誌


2006-02-06

elisp を作る

http://www2.coins.tsukuba.ac.jp/~i021216/diary/?date=20060205#p02

考えてみると、確かに「Emacs Lisp スクリプトを書く」ことを指すのに「elispを作る」という言い方には自分は違和感がない。これが「Rubyを作る」だと違和感がある。Ruby本体をいじっているように感じてしまう。

うーん、何でだろう。

ちょっと思いついたのは、「Lisp = S式」という印象が強いからではないかというもの。「S式を作る」は意味が通る。無意識のうちに、elisp という言葉と S式を同一視しているのではないだろうか。

と書いてみたものの、自分のことながらよく分からないなぁ……


2006-02-07

[Selenium]テストを JavaScript で記述した際に、改行を含めると Firefox で動かない件

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 &nbsp; with a space
    // TODO - should this be in the match() code instead?
    text = text.replace(/\240/g, " ");
    return text.trim();
}

これで大本にたどりつきました。 textContent と innerText について IE と Firefox での挙動を調べてみると

  • IE では innerText のみが定義されている。改行は取り除かれている。
  • Firefox では textContent のみが定義されている。改行が含まれる。

という結果になりました。(ちなみに、element.firstChild.nodeValue にしても改行に関しては同じ結果です)

よって元に戻ると、preprocessParameter で

var match = value.match(/^javascript\{(.+)\}$/);

によって javascript の処理をするかどうかを判定する際、 `.' が改行にマッチしないために IE と Firefox によってテストの挙動が変 わっていたということになります。

正規表現でのマッチの際、文字列に改行が含まれうることを考慮して

var match = value.match(/^javascript\{((.|\r?\n)+)\}$/);

にすると、Firefox でも javascript{ ... } の中に改行を含めることができ ました。


2006-02-15

[Selenium]長い文字列に対して複数のアスタリスクを含むglobをすると、IEでフリーズする件

そのうち追加します。

要は、SeleniumのglobはJavaScriptの正規表現で実現されているんだけど、 バックトラックが多くなりすぎるとフリーズするよという話。(だと思う)

参考文献

正規表現エンジンの違いがどうとか、バックトラックがどうとかという話は この本に詳しいです。


2006-02-19

メインマシン Linux 化は可能か

メインマシンが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 と入力すればよいことになります。

アプリケーションをキーボードから起動するのにランチャーを使うという話はよくありますが、 アプリケーションをキーボードから一発でアクティブにできるようにするという話はあまり聞かない気がするので書いてみました。 便利ですよ。


2006-02-20

[Selenium] 実行中のテスト名を表示する

テストを [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();

2006-02-21

[Ruby]るびま0013号リリース

http://jp.rubyist.net/magazine/?0013

今回も編集のお手伝いをしました。


2006-02-22

[Ruby][Hiki]Hiki on YARV

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 では動かないようです。

本日のツッコミ(全2件) [ツッコミを入れる]

_ ささだ [うーん、まぁなんとなくは動いているということで ^^;  Thread.exclusive は YARV ではサポ..]

_ yanagi [そういや 1.9 で Hiki がどうなるか試していなかったなぁ…… 後で試してみます。]


2006-02-27

[購入書籍]RailsによるアジャイルWebアプリケーション開発

土曜日・日曜日と本屋に行くも見つからなくてしょんぼりしていたが、 やっと今日購入できた。


2005|02|03|04|05|06|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|03|04|05|06|10|
2008|04|10|
2009|10|
2010|05|08|
2012|01|02|03|
2014|01|
2022|05|
トップ 最新