こもろぐ @tenkoma

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

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

uninstall macports, hello homebrew

参考 http://d.hatena.ne.jp/hidde/20090914/1252944208

chpass -s /bin/bash

# exit / reopen shell

sudo port unload apache2 mysql5 mysql5-server
sudo port deactivate active
sudo port -f uninstall installed
sudo port clean all
sudo rm -rf /opt/local
sudo rm -rf /Library/Tcl/macports1.0
ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"
brew install git
brew upgrade

テスト駆動 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 に再インストールするソフトウェアメモ