【Javascript】「var」はなるべく一つにまとめよう

YUI CompressorでJavascriptを圧縮する | blog.delphinus.dev」で書いた YUI Compressor で Javascript ファイルを圧縮するといつも次のような警告文が出る。

[WARNING] Try to use a single 'var' statement per scope.

ググって調べてみると次のリンクがヒットした。

Try to use one var statement per scope in JavaScript
http://wonko.com/post/try-to-use-one-var-statement-per-scope-in-javascript

つまり、一つのスコープ内で複数の var を使うのはリソースの無駄になるというのだ。リンク先のをそのままコピーすると、

悪い例

function getElementsByClassName(className, tagName, root) {
  var elements = [];
  var root     = root || document;
  var tagName  = tagName || '*';
  var haystack = root.getElementsByTagName(tagName);
  var regex    = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');

  for (var i = 0, length = haystack.length; i < length; ++i) {
    var el = haystack[i];

    if (el.className && regex.test(el.className)) {
      elements.push(el);
    }
  }

  return elements;
}

良い例

function getElementsByClassName(className, tagName, root) {
  root    = root || document;
  tagName = tagName || '*';

  var elements = [],
      haystack = root.getElementsByTagName(tagName),
      length   = haystack.length,
      regex    = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)'),
      el, i;

  for (i = 0; i < length; ++i) {
    el = haystack[i];

    if (el.className && regex.test(el.className)) {
      elements.push(el);
    }
  }

  return elements;
}

記事のコメントには、こんな最適化じゃ目に見える差なんて出ないよ、なんて意見もあり、どちらが正しいのかよくわからない。しかし、関数の一番最初で変数を全部宣言するなんて、いかにも古臭い言語という感じでなんかやだな。

YUI CompressorでJavascriptを圧縮する

Javascriptライブラリをgzip圧縮する | blog.delphinus.dev」では一つの Javascript を gzip 圧縮する話を書いた。しかし gzip で圧縮する前に、ライブラリ内のコメントや空行など、動作に支障のない部分を削ってしまった方が更に効果は高い。勿論それは手作業でも可能だが、ツールを使った方が確実で早いだろう。今回は YUI Compressor を使ってみることにした。

YUI Compressor
http://developer.yahoo.com/yui/compressor/

ダウンロードとインストール

ダウンロードして解凍すると、build ディレクトリの中に実行ファイル(jar 形式)が現れる。

$ unzip yuicompressor-2.4.2.zip
$ cd yuicompressor-2.4.2/build
$ ll
total 1664
-rw-r--r--@ 1 delphinus  staff  851219 11 14  2008 yuicompressor-2.4.2.jar

実行には Java 実行環境も必要なのでインストールしておこう(Mac OS X では標準で入ってるっぽい?)。

java.com: あなたと Java
http://www.java.com/ja/

Continue reading

【MovableType】iPhone用テンプレートの導入

IMG_1031.PNG

MovableType の iPhone 用テーマを導入してみた。この種のテーマでは crema 氏による iPhone テンプレート for MTがデファクトスタンダードのようだが、インストール手順が非常に煩雑だったことで導入をためらっていた。

そんなとき、もう一つの選択肢を発見。

Ogawa::Buzz: Pluggable なテンプレートセットを実現する Templetsフレームワーク
http://blog.as-is.net/2008/08/pluggable-templets.html

このプラグインを使うと、ベースとなるテンプレートに対して小さなテーマの固まり(「テンプレット」と呼ばれる。)を追加することができる。デフォルトで上述の「iPhone テンプレート for MT」を「テンプレット化」したものが用意されており、導入がだいぶ簡単になっている。手順は次の通りだ。

  1. テンプレットプラグインのインストール
  2. iPhone テンプレットをインストール
  3. 現在のテーマにテンプレットを適用する

Continue reading

【MovableType】iPhone用管理ツール「iMT」がMT5に正式対応

iPhoneなどのスマートフォンで記事の投稿・編集、コメントの閲覧・削除などが行えるプラグイン、「iMT」がバージョンアップしてMT5に対応してた。

iMT – iPhone Interface for Movable Type
http://plugins.movabletype.org/imt/

インストール方法はこちら。MT4用の文書だが、MT5でも方法は変わっていない。

Movable Type 4 を iPod touch または iPhone で利用する
http://www.movabletype.jp/documentation/appendices/imt.html

Continue reading

【MovableType】Captcha画像の生成に異様な時間がかかる件について

MT5をFastCGIで動かしているとmt-comments.fcgiによるCaptcha画像の生成に時間がかかりまくり。おまけに一度アクセスしただけでプロセスが際限なく増えていく。ググってもこんな症状見つからなかったんだけど、うちの変態環境(Mac OS X + Perl5.10.1)が原因なのかな?

Apacheのログ

[notice] Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.8l DAV/2 mod_fastcgi/2.4.2 configured -- resuming normal operations
[notice] FastCGI: process manager initialized (pid 23678)
[warn] FastCGI: (dynamic) server "/pato/to/mt/mt-comments.fcgi" started (pid 23692)
[warn] FastCGI: (dynamic) server "/pato/to/mt/mt-comments.fcgi" started (pid 23724)
[warn] FastCGI: (dynamic) server "/pato/to/mt/mt-comments.fcgi" started (pid 23732)
[warn] FastCGI: (dynamic) server "/pato/to/mt/mt-comments.fcgi" started (pid 23736)
[warn] FastCGI: (dynamic) server "/pato/to/mt/mt-comments.fcgi" started (pid 23766)
[warn] FastCGI: scheduled the start of the last (dynamic) server "/path/to/mt/mt-comments.fcgi" process: reached dynamicMaxClassProcs (6)
[warn] FastCGI: (dynamic) server "/path/to/mt/mt-comments.fcgi" started (pid 23769)

このログの後、30秒待ってやっとCaptcha画像が表示される。これがなかなか直せないのでずっと悩んでいた。症状は違うものの、Captchaのトラブルとしては定番らしいハックを試してみる。

Continue reading

HTML::Tidyについて追試

先日、
【MovableType】Tidy を使って HTML を整形するプラグイン | blog.delphinus.dev
を書いたが、littlebuddhaさんからうまくインストールできないという話を受けてこちらでも追試。

すると……、あれ?こけた?

$ make test

~省略~

Test Summary Report
-------------------
t/ignore-text.t    (Wstat: 256 Tests: 3 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t/ignore.t         (Wstat: 256 Tests: 7 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t/levels.t         (Wstat: 256 Tests: 3 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
Files=20, Tests=80,  1 wallclock secs ( 0.09 usr  0.08 sys +  0.65 cusr  0.16 csys =  0.98 CPU)
Result: FAIL
Failed 3/20 test programs. 3/80 subtests failed.
make: *** [test_dynamic] Error 255

前に試したときはうまくいったと思ったが、どうやら気のせいだったらしい。エラーも訳がわからないので放置していたところ、littlebuddhaさんから更に情報があった

Bug #29593 for HTML-Tidy: [PATCH] fixing coredumps in 1.08

http://rt.cpan.org/Public/Bug/Display.html?id=29593

このパッチを当てると上記のエラーも消え、すんなりインストールが完了した。

【MovableType】Tidy を使って HTML を整形するプラグイン

以前、「外部リンクを明示するMovableTypeプラグイン | blog.delphinus.dev」で紹介したプラグインで、MovableType で生成する HTML をちょっとだけ整形してみた。今度は本格的なツールを使ってみよう。

HTML Tidy による整形

HTML Tidy は整形ツールとしては一番著名で強力なツールだ。歴史も古く、最初のバージョンは前世紀まで遡る。

HTML Tidy Project Page
http://tidy.sourceforge.net/

現バージョンの `HTML::Tidy` では tidyp というツールが推奨されているようだ。tidyp を使うならば、後述の `HTML::Tidy` のバージョン違いによるエラーは起こらない。詳しくはこちら。
【Perl】HTML / XML の 整形には tidy“p”? | blog.delphinus.dev

そしてそれを Perl から利用するためのモジュールが HTML::Tidy

HTML::Tidy – search.cpan.org
http://search.cpan.org/~petdance/HTML-Tidy-1.50/lib/HTML/Tidy.pm

更に HTML::Tidy を利用して、MovableType で生成する HTML の整形を行ってくれるのがこれ。

Movable Type Monday: Etelos Partnership, Plugin Development, HTML Tidy, and More | The Blog Herald
http://www.blogherald.com/2009/04/07/movable-type-monday-etelos-partnership-plugin-development-html-tidy-and-more/

3つもインストールしなければならない上、一つ一つがかなり曲者だった(Mac OS X を使っていることが主因なんだけれども)。

Continue reading