Engineer as a Lifestyle @tenkoma

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

homebrew で PHP をインストール

http://d.hatena.ne.jp/okonomi/20110501/1304256929

参考に。


# http://d.hatena.ne.jp/okonomi/20110501/1304256929 のものだと、リダイレクトを促すページのHTMLを取得するので
curl -O https://raw.github.com/ampt/homebrew/php/Library/Formula/php.rb
mv php.rb `brew --prefix`/Library/Formula
brew install php --with-mysql --with-apache --with-intl

intl はSymfony2で遊ぶのに必要

…エラーでた make[1]: *** [install-pear-installer] Segmentation fault: 11の部分
pear のインストールでこけてるらしい

==> Installing php
==> Downloading http://www.php.net/get/php-5.3.10.tar.bz2/from/this/mirror
Already downloaded: /Users/tenkoma/Library/Caches/Homebrew/php-5.3.10
==> Patching
patching file ext/tidy/tidy.c
==> ./configure --prefix=/usr/local/Cellar/php/5.3.10 --disable-debug --with-config-file-path=/usr/local/Cellar/php/5.3.1
==> make
==> make install
Installing PHP SAPI module:       apache2handler
Installing PHP CLI binary:        /usr/local/Cellar/php/5.3.10/bin/
Installing PHP CLI man page:      /usr/local/Cellar/php/5.3.10/share/man/man1/
/usr/share/httpd/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1/build-1/libtool' libs/libphp5.so /usr/local/Cellar/php/5.3.10/libexec/apache2
Installing build environment:     /usr/local/Cellar/php/5.3.10/lib/php/build/
/usr/share/apr-1/build-1/libtool --mode=install cp libs/libphp5.so /usr/local/Cellar/php/5.3.10/libexec/apache2/
libtool: install: cp libs/libphp5.so /usr/local/Cellar/php/5.3.10/libexec/apache2/libphp5.so
Warning!  dlname not found in /usr/local/Cellar/php/5.3.10/libexec/apache2/libphp5.so.
Assuming installing a .so rather than a libtool archive.
chmod 755 /usr/local/Cellar/php/5.3.10/libexec/apache2/libphp5.so
[activating module `php5' in /private/etc/apache2/httpd.conf]
unable to open configuration file
Installing helper programs:       /usr/local/Cellar/php/5.3.10/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/Cellar/php/5.3.10/share/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /usr/local/Cellar/php/5.3.10/lib/php/
make[1]: *** [install-pear-installer] Segmentation fault: 11
make: *** [install-pear] Error 2
make: *** Waiting for unfinished jobs....
Installing header files:          /usr/local/Cellar/php/5.3.10/include/php/
config.log was copied to /Users/tenkoma/Library/Logs/Homebrew
==> Exit Status: 2
http://github.com/mxcl/homebrew/blob/master/Library/Formula/php.rb#L168
==> Environment
HOMEBREW_VERSION: 0.8.1
HEAD: 2f5248f36f6ff292e3e68c09c96693b226ac3ccd
HOMEBREW_PREFIX: /usr/local
HOMEBREW_CELLAR: /usr/local/Cellar
Hardware: dual-core 64-bit penryn
OS X: 10.7.3
Kernel Architecture: i386
Xcode: 4.3.1
GCC-4.0: N/A
GCC-4.2: build 5666
LLVM: build 2336
Clang: 3.0 build 211
MacPorts or Fink? false
X11: /usr/X11
System Ruby: 1.8.7-249
/usr/bin/ruby => /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
Which Perl:   /usr/bin/perl
Which Python: /usr/bin/python
Which Ruby:   /Users/tenkoma/.rbenv/shims/ruby
==> Build Flags
CC: /usr/bin/clang
CXX: /usr/bin/clang++ => /usr/bin/clang
LD: /usr/bin/clang
CFLAGS:  -w -pipe -march=native -Qunused-arguments -O3
CXXFLAGS:  -w -pipe -march=native -Qunused-arguments -O3
CPPFLAGS: -I/usr/local/Cellar/icu4c/4.8.1.1/include -I/usr/local/Cellar/readline/6.2.2/include -I/usr/local/Cellar/gettext/0.18.1.1/include -I/usr/local/Cellar/libxml2/2.7.8/include -I/usr/X11/include
LDFLAGS: -L/usr/local/Cellar/icu4c/4.8.1.1/lib -L/usr/local/Cellar/readline/6.2.2/lib -L/usr/local/Cellar/gettext/0.18.1.1/lib -L/usr/local/Cellar/libxml2/2.7.8/lib -lstdc++ -L/usr/X11/lib
MAKEFLAGS: -j2
PKG_CONFIG_PATH: /usr/local/Cellar/icu4c/4.8.1.1/lib/pkgconfig:/usr/local/Cellar/libxml2/2.7.8/lib/pkgconfig

Error: Failed executing: make install
If `brew doctor' does not help diagnose the issue, please report the bug:
    https://github.com/mxcl/homebrew/wiki/checklist-before-filing-a-new-issue

先にMac OS X 10.7.3 にアップグレードしたことが影響したのかを疑ったが、原因は Xcode 4.3 をインストールしたことらしい

http://mogutan.wordpress.com/2012/02/18/trouble-installing-xcode4-3/

以下のコマンドは、10.7.3 の影響を疑ったときに実行したコマンド
おそらく上の方はXcode 4.2以前用だと思うので、下の方だけでOKだと思う。

sudo xcode-select -switch /Developer
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

一応以下のコマンドも実行した

sudo chown -R $USER /usr/local
sudo chown -R $USER /usr/local/.git

その後で --use-llvm オプション付きでインストールしたらうまくいった

brew install --use-llvm php --with-mysql --with-apache --with-intl
% brew install --use-llvm php --with-mysql --with-pgsql --with-apache --with-intl     tenkoma@Tanaka-Koji-no-MacBook-Air
==> Downloading http://www.php.net/get/php-5.3.10.tar.bz2/from/this/mirror
Already downloaded: /Users/tenkoma/Library/Caches/Homebrew/php-5.3.10==> Patching
patching file ext/tidy/tidy.c==> ./configure --prefix=/usr/local/Cellar/php/5.3.10 --disable-debug --with-config-file-path=/usr/local/Cellar/php/5.3.1
==> make
==> make install
==> cp ./php.ini-production /usr/local/Cellar/php/5.3.10/etc/php.ini
==> chmod 644 /usr/local/Cellar/php/5.3.10/lib/php/.lock
==> Caveats
   To enable PHP in Apache add the following to httpd.conf and restart Apache:
    LoadModule php5_module    /usr/local/Cellar/php/5.3.10/libexec/apache2/libphp5.so

    The php.ini file can be found in:
      /usr/local/Cellar/php/5.3.10/etc/php.ini
==> Summary
/usr/local/Cellar/php/5.3.10: 479 files, 28M, built in 11.8 minutes

あとは

LoadModule php5_module    /usr/local/Cellar/php/5.3.10/libexec/apache2/libphp5.so

を /etc/apache2/httpd.conf に追記して、
Include /etc/apache2/extra/httpd-vhosts.conf のコメントアウトをはずす。
/etc/apache2/extra/httpd-vhosts.conf にVirtualHost設定を書く。
システム環境設定からWeb共有をONにしてやる。
で見られるようになった。

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アプリケーション開発ガイド