Makeを利用したJavaScriptファイルの結合・圧縮 というエントリを目にしました。
Make に対抗して Rake を紹介するのもいいかなと思ったのですが (以前訳してみた Rake チュートリアルは、たまに見てくれている方もいらっしゃるようですし)、 後半の「圧縮」という方に目をつけて、JavaScript のコメントとインデントを削除する 正規表現を紹介してみます。
このようなスクリプトが
/*
 * hogehoge
 */
function C(){
    var a = 1;
    /*
     * foo
     */
    this.foo = function(){
        // foobar
        var str = "/* comment */";
        this.a = '"foobar"';
    }
}
var c = new C(); // fugafuga
c.foo();
こういう感じになります。
function C(){
var a = 1;
this.foo = function(){
var str = "/* comment */";
this.a = '"foobar"';
}
}
var c = new C();
c.foo();
これは、次のようなワンライナーで可能です。
% ruby -e "print ARGF.read(nil).gsub(%r<([^\"'/\\s]+|\"[^\"\\\\]*(?:\\\\.[^\\\\]*)*\"[^\"'/\\s]*|'[^'\\\\]+(?:\\\\.[^'\\\\]*)*'[^\"'/\\s]*)|/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/|//[^\\n]*|^\\s+>){\$1}"
……これだけ見ても、さっぱり分からないですね。
この正規表現は、詳説正規表現第2版を参考にしました。 第6章で、C言語のコメントを削除する正規表現の書き方と、その最適化の方法が 順を追って解説されています。 正規表現について詳しく知りたいという人にはおすすめの本です。
http://kitaj.no-ip.com/tdiary/20051206.html#p03
どうやら、将来的に space でのファイル名補完がなくなるようです。 (自分で割り合てればいいわけですが)
私は space を使ってます。いつからかは覚えてないなぁ…… 多分、Emacs を使い始めてからずっとなんだろう。
Web アプリケーションのテストとして、Selenium を試してみましたので、 初歩的な使い方をメモしておきます。
Selenium は、実際のブラウザ上で Web アプリケーションを自動実行しながら テストを行なうというツールです。 デモがあるので、実行してみてください。
Selenium を使うには、基本的に、テスト対象の Web アプリケーションがインストールされているホストに Selenium を置く必要があります。
ダウンロードページから selenium-0.6.0.zip を ダウンロードし、アーカイブの中の selenium ディレクトリを、httpd から見える位置に置きます。
ここでは、http://<Server>/selenium/ に相当する場所に置いたとしましょう。
http://<Server>/selenium/TestRunner.html にアクセスすると、配布物に含められているテストを実行することができるので、 一度実行してみましょう。 ウィンドウのポップアップを禁止していたりすると、ポップアップ関連のテストでエラーが出るかもしれませんが、 それ以外は問題なく通ると思います。
テストは、selenium/tests ディレクトリの中に書きます。
単なる HTML ファイルの table なので、手で書いてもいいのですが、 Selenium recorder を使うととても便利です。
書いたテストファイルには、TestSuite.html からリンクをはっておきます。 すると、TestRunner から実行できるようになります。
JavaScript の話に対して正規表現の指摘をするのもどうかという気持ちですが、 こっちの方が、ちょっと短く書けていいかもしれません。
function capitalize(str){
  return str.replace(/\b\w/g, function(word){ return word.charAt(0).toUpperCase() });
}
from Collection & Copy
Selenium でのテストで、ローカルの Windows マシンにある hta を使って 別ホストのアプリケーションをテストするとき、Windows XP だと クッキーを送ってくれなくて悩んだ。
ローカルの html ファイルで iframe に別ホストを記述した状態で、 iframe の中のページのクッキーを送ってくれない(Windows 2000 だと送ってくれる)ので、Selenium 自体の問題ではない模様。
試行錯誤してみたが、テスト対象ホストを「信頼済みサイト」にすると解決した。SP2 におけるセキュリティ強化の一種なのだろうか。 (もしくは、クッキーだけ送るようにする設定があるかもしれない。後で調べる)
このパッチで動くようになった。
Index: html-xpath/html-xpath-patched.js
===================================================================
--- html-xpath/html-xpath-patched.js    (revision 666)
+++ html-xpath/html-xpath-patched.js    (working copy)
@@ -602,7 +602,7 @@
            {
                var attribute = node.attributes[i];
                var attributeValue = attribute.nodeValue;
-                   if (attributeValue && attribute.specified)
+                   if (attributeValue && (attribute.specified || attribute.nodeName.toLowerCase() == 'value'))
                {
                    var domAttribute = dom.createAttribute(attribute.nodeName);
                    domAttribute.value = attributeValue;
なぜ IE でダメだったかというと、どうも IE だと input 要素に value 属性を指定しても、 attribute.specified が true にならないからのようだ。IE のバグ?
Selenium で、//a[@href="..."] という指定子が a 要素をうまく見つけられ ないというので悩みました。
実験してみると、どうも、IE の getAttribute は a 要素の href 属性に対しては、半角空白を %20 で置き換えた値を返すようです。
こんな感じの HTML でテスト。
<a href="Program Files/hogehoge" foo="Program Files/hogehoge">foobar</a>
<script type="text/javascript" language="javascript">
alert("<" + document.getElementsByTagName('a')[0].getAttribute('href') + ">");
alert("<" + document.getElementsByTagName('a')[0].getAttribute('foo') + ">");
</script>
個別には書きませんが、転機の一年だったのではないかと思います。
いろんなところに行って、いろんな人と会って、いろんな体験をしました。 お世話になった皆様本当にありがとうございました。
来年もよろしくお願いします。
_ llamerada [トラックバックありがとうございます。 Railsは結構使っているのですが、Rakeは調べたことがありませんでした。便..]
_ yanagi [実はこの正規表現をワンライナーの形にしてみたのはこれが初めてです。半分はネタのつもりだったのですが、実際に書いてみた..]