こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

広告:本ブログで紹介している書籍等商品の紹介でAmazonアソシエイトを利用していることがあります。

テスト駆動 JavaScript :Internet Explorerにおける、名前付き関数式の実装

「5.3.6 再び関数式について」において、Internet Explorerにおける、名前付き関数式のひどい実装のことが言及されている。

Internet Explorerは、名前付き関数式を前にすると、2つの別々の関数オブジェクトを作り、識別子を外側のスコープにリークし、そのうち1つをホイストしてしまう。

イメージとしては、名前付き関数式と同内容の関数宣言を外側のスコープで行ったようなものなのかな。
ひどさの詳細は、p.102〜p.103 のコードを読めばわかるとして。
これを回避する方法として

私は、必要に応じて分岐が異なれば名前も変わるようにして、クロージャー内の関数宣言を使い、名前付き関数式を避けるようにしている。

とかかれているが、その例となるコードまでは書かれていない。
おそらく次の様なコードだと思う。

名前付き関数式を使った実装

IE で予想しない振る舞いになる、と、この節に書かれているコード

if (!String.prototype.trim) {
  String.prototype.trim = function trim() {
      return this.replace(/^\s+|\s+$/g, "");
  };
}

クロージャと関数宣言を使った実装 (Internet Explorerにおける名前付き関数式の予期しない振る舞いを避けるため)

if (!String.prototype.trim) {
  String.prototype.trim = (function () {
    function trim() {
      return this.replace(/^\s+|\s+$/g, "");
    }
    return trim;
  }());
}

ちなみにこの実装は、p.119 リスト6-16 namespace 関数を読んでようやく思い当たったものだ。

CakePHP 2.0のFixtureでテーブルを生成すると、通常オンメモリにテーブルが生成される

…つまり高速でテストを実行できることが期待でき、HDDやSSDにもやさしい

CakePHP2.0からFixtureでMySQLのMEMORYエンジンが使われる場合の回避方法 | tipshare.info

こちらとしてはテスト時にデータベースをオンメモリに生成する方法を探していたのでむしろ好都合だった。

検証してみたら、そんなことはなかった…まぁ、CakePHP2.0.3ですけど。どういうことか調べてみた。

lib/Cake/TestSuite/Fixture/CakeTestFixture.php 145行目〜
<?php
if (empty($this->fields['tableParameters']['engine'])) {
    $canUseMemory = true;
    foreach($this->fields as $field => $args) {

        if (is_string($args)) {
            $type = $args;
        } elseif (!empty($args['type'])) {
            $type = $args['type'];
        } else {
            continue;
        }

        if (in_array($type, array('blob', 'text', 'binary'))) {
        $canUseMemory = false;
            break;
        }
    }

    if ($canUseMemory) {
        $this->fields['tableParameters']['engine'] = 'MEMORY';
    }
}

blob,text,binary型を使ってるとMEMORYエンジンは使われないと。
強制的につくってみよう。

CREATE TABLE text_contain_table (
  id INT AUTO_INCREMENT not null,
  body text not null,
  primary key (id)
) ENGINE=MEMORY;
ERROR 1163 (42000): The used table type doesn't support BLOB/TEXT columns

だめだ。ドキュメントにも書いてあった。

MySQL :: MySQL 5.5 Reference Manual :: 15.4 The MEMORY Storage Engine

MEMORY tables cannot contain BLOB or TEXT columns.

考えてみたら、たった100文字入れられれば十分なカラムだったのでVARCHAR(100)に変更しましたよ

まとめ

テーブルにtext/blob型のカラムが含まれていると、MySQL 5.5 ではMEMORYエンジンを使ったテストはできません
CakePHP 2.0 のテストでオンメモリのテーブルを使いたければ、安易にtext型を使わないで、VARCHAR型にできないか検討しましょう

僕が連休中に読みたい本

プログラマが知るべき97のこと

日本人寄稿者5名のサインが入った貴重な1冊を無くしてしまい、涙目で買った2冊目
現在1/3まで読んでます。連休中で読み終わりたい

プログラマが知るべき97のこと

プログラマが知るべき97のこと

結果

読了。

JavaScriptパターン

現在半分まで読んでいる。
読み終わりたい本その2

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

結果

6章までは読了。6章が濃すぎ。

エリック・エヴァンスドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

じっくりと読んでいきたい

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

facebookアプリケーション開発ガイド

Facebookアプリが作れるとモテると聞いてやってきました(ぇ

facebookアプリケーション開発ガイド

facebookアプリケーション開発ガイド

MacBook Pro に再インストールするソフトウェアメモ

はてな義援金受付から寄付登録しました

昨日の地震はすごかったですね。さすがに机の下に潜りました。。。
電車がとまってしまったので徒歩とタクシーでの帰宅になりました
家では電子レンジが落っこちたくらいで、iMac液晶テレビが倒れることはありませんでした。電子レンジも落ち方がよかったのかガラスが割れたりすることもなく。

さて、さまざまな機関・企業で義援金の受付がはじまっていますが、日本赤十字社のWebサイトは断続的にページが表示できないような状態になっています。はてなでも義援金の受付を行っている、ということなので、ポイントの購入を含めて寄付をしました。いつも利用している・信頼しているサービスから寄付できるというのはとてもいいことですね。

いい機会なのでニュージーランド地震と宮崎鳥インフルエンザにも寄付。ポイントで払うと はてな ポイント支払・受取履歴から参照できます。

Redmine 1.1.1 インストール

依存コンポーネントのインストールにかかる部分だけ

sudo aptitude install ruby1.8 rubygems1.8
sudo gem install rack -v=1.0.1
sudo aptitude install rake
sudo gem install -v=0.4.2 i18n
sudo aptitude install libmysqlclient-dev
sudo gem install mysql
sudo gem install passenger
sudo aptitude install libcurl4-openssl-dev apache2-prefork-dev libapr1-dev libaprutil1-dev
sudo passenger-install-apache2-module