MacBook AirでMacデビューしたのでメモ

symfony本の執筆合宿(@六本木ヒルズのWIRED CAFE)へ行ったら、自分以外全員Macというひどいいじめを受けたので、東京から新幹線で名古屋駅へ帰ってきたらその足でビックカメラ名古屋駅西店へ駆け込み、そのままMacBook Air 13インチを買ってお持ち帰りした。後悔はしていない!


Webの動作確認用程度にかなり初期のiMacを所有していたことはあったのですが、最近のものは全く触ったことがなかったので、いろいろ設定などに戸惑いながらやっています・・・。しかしMacはいいですね・・・・。なぜもっと早く買わなかったのかと、自分を問い詰めたくなります。


というわけで、いろいろやったこと調べたことなどの自分用メモ (徐々に追加)。
Mac力をもっと鍛えたいです!

キーボードショートカットの記号

いろいろキーボードで操作したい場合は、まずこれらの記号に慣れる必要あり。

Spaces

ワークスペースを切り替える機能。
Control + 1などで指定番号のスペースへダイレクトに切り替えられる。

  • 2010/12/15追記:いくつかの理由で自分好みな使い方ができないので、Spacesは無効にしてExpose中心に切り替え。
  • Command + Tabでの切り替えを中心に。

トラックパッド

個人的にMacBookを買う決め手になった一番のポイントだったりする。
アプリケーション→システム環境設定→トラックパッド にて設定をカスタマイズできる。

  • 1本指
    • タップでクリック
  • 2本指スクロール
    • 有効に
  • 4本指スワイプ
    • アプリケーションの切り替えを起動するように
  • 3本指スワイプ
    • 最初は3本指スワイプでウィンドウをドラッグできるようにしていたけど、すべてのアプリケーションを最大化して使うためウィンドウのドラッグが不要になったので、3本指スワイプは「スワイプで移動」に。
      • この設定にしておかないと、夜ふくろうのタブを3本指スワイプで切り替えられない。
  • BetterTouchTool http://boastr.net/
    • トラックパッドの高度な設定(5本指等)が可能
    • スクロールを上下・左右ともにインバース(逆向き)に設定
      • こうすると、トラックパッドでスワイプダウンしたときに、スクロールバーとしては上(コンテンツの上方向)へスクロールするようになる。iPhone等で画面をスクロールさせるのと同じになる。個人的にはこちらの方が直感的で好み。

Dock

微妙に邪魔な感じなので、右側表示にした上で、Command + Option + D キーで非表示に。

RightZoom

ウィンドウを(Windows的な意味の)最大化できるようにする。
Command + Option + E で最大化。

Twitterクライアント

夜フクロウがキーボードで操作できて使いやすい。

  • 3本指左右スワイプでタブを切り替え
  • 3本指上下で、タブの内容の先頭、末尾へ
  • 発言欄ではControl + Enterで送信するように設定
  • Command + s でURLを短縮
  • タイムライン上で発言を選択している状態で Enter を押すとリプライに
  • タイムライン上で発言を選択している状態で h を押すと、その発言のユーザーのタイムラインを表示
  • タイムライン上で発言を選択している状態で l を押すと、その発言内のURLをブラウザで開く

IRCクライアント

twitterなどでのみなさんからのオススメでLimeChat

ターミナル

標準のターミナル(Terminal.app)もなかなかいい感じなのですが、がんばってみたけど「■」などの日本語表示がずれる問題を解決できなかったので、サックリあきらめて「iterm2」にしました。
http://code.google.com/p/iterm2/

  • 2バイト文字っぽいものを2バイトで扱うという設定があるので、それを有効にする「Treat ambiguous-width characters as double width」
  • キーボードショートカット(自分はCommand + Option + 2)で開いている iterm2 のウィンドウをアクティブにしてフォーカスがあたるように設定
  • デフォルトでscreenを起動するように設定(ログインシェルを/usr/bin/screenに)

ブラウザ

chromeWindowsUbuntuでもずっと使っていたので)

  • 3本指左右スワイプは、デフォルトではページの戻る/進むになっているが、BetterTouchToolでこれらをタブの切替コマンドに変更
    • いくつか開いたタブを片手だけでだらだらとブラウジングするのに便利

homebrew

いろいろインストールするために最初にいれておく。

VIM

MacVim-kaoriyaをインストールすると、日本語も普通に使え、ある程度初期設定された状態で使える。

Apache

最初からインストールされている。
自動起動するように設定するには、

launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist

のようにする。

設定ファイルは以下。

  • /etc/apache2/httpd.conf
    • メインの設定ファイル
  • /etc/apache2/users/******.conf

PHP

最初からインストールされている(5.3.3)
APCをインストールする

$ sudo pecl install apc

ただし、先にpcreをインストールしないとダメ

$ sudo brew install pcre

php.iniへのextension=apc.soの追加も必要

※/etc/php.ini.defaultを/etc/php.iniにコピーする

MongoDB

$ brew install mongodb
$ sudo pecl install mongo

php.iniへのextension=mongo.soの追加も必要

MySQL

$ brew install mysql

これをデフォルト起動するように設定するには、launchctlを使って以下のようにする。

sudo launchctl -w /usr/local/Cellar/mysql/5.1.53/com.mysql.mysqld.plist

また、my.cnfを自前のものにしたいので、以下のパスにmy.cnfを用意する。

$ sudo touch /usr/local/Cellar/mysql/5.1.53/my.cnf

デフォルトではソケットが/tmp/mysql.sockになっているので、PHPのデフォルトに合うように変更

socket = /var/mysql/mysql.sock

※/var/mysqlディレクトリをMySQL実行ユーザーに書き込める権限で用意しておく必要あり

ログインシェル

Linux感覚で/etc/passwdで変えようと思っても、そこには自分のユーザーがない!
システム環境設定→アカウントの画面で、自分のアカウントを右クリックすると表示される「詳細オプション」で変更可能。

右クリックで隠されていたのか・・・・。

Sphinx (ドキュメントエンジンの方)

素直にpipでインストールする。(homebrewで brew install sphinxすると、検索エンジンの方が入る)

$ sudo easy_install pip
$ sudo pip install sphinx

勉強したいことリスト

NGK忘年会2010では、勉強会を企画運営して勉強する的なLTをしましたが、そんな私が最近「もっと勉強したいなぁ」と思っているネタをメモ的にリストアップ(今さら感があるものばかりですが・・・)


名古屋近辺で、Sphinxの勉強会みたいなの、やってないですかね・・・。

symfony 1.4向けの解説書 出版予定

この記事は、Symfony アドベントカレンダー 2010 に参加しています。


「えっ、いまさら?」
と思う方も
「おー!、やっと!」
と思う方も

どちらもお待たせしました!


現在、主に日本Symfonyユーザー会で活動しているメンバーで、symfony 1.4向けの解説書籍を執筆しています。
書籍は秀和システム様より『オープンソース徹底活用 symfony による Web アプリケーション開発』として出版される予定です!


書籍の内容は、symofny入門者〜中級者くらいを対象としたsymfony 1.4の解説書で、「日本Symfonyユーザー会公式の解説書」と銘打たれる予定です。
大まかな見出しは以下のようなものです。

・入門編
 ・symfony 1.4の特徴と基礎知識
 ・symfony 1.4のインストール
 ・サーバーへの設置
・初級編
 ・サンプルサイト作成で学ぶsymfony開発の基礎
 ・公式サイトのドキュメントナビゲーション
・中級編
 ・DoctrineとPropel
 ・symfonyを使いこなす
 ・プラグインの利用と開発
 ・symfonyのライブラリ
・実践TIPS
 ・マスター、スレーブ構成のデータベース
 ・プロジェクトのソースコード管理とデプロイ
 ・大規模なソフトウェアへの応用(OpenPNE3)

今のところあまり多くを公開できずにすみません(鋭意執筆中です!)

全体としては、実際にsymfonyを使って開発をしてきたメンバーが、「symfonyのコンセプトとベストプラクティス」を伝える、ということを大きなテーマとしています。

なぜ1.4?

この出版の話を聞いて、「なぜ今更1.4なの?」という疑問が浮かんだ方もいらっしゃるんじゃないかと思います。
2.0ではなくて、1.4なんです!

なぜ1.4なのかと言うと、私が「1.4」の寿命はまだまだ長いと考えているからです。


symfony 1.4の「公式コアチームのメンテナンス期間」は2012年11月までです。
ですが、これだけ多く使われているソフトウェアなので、誰かがメンテナンスを引き継ぐという可能性は十分にあると思っています。そして、もし万が一そういう流れが出てこなければ、日本Symfonyユーザー会(または個人的なプロジェクト等)としてsymfony 1.4のForkをメンテナンスしていくことも視野にいれています。
それくらいsymfony 1.4というフレームワークの完成度は高く、まだまだ現役で使い続けられるものだと私は考えています。


このような目的と理由から、symfony 1.4の書籍を執筆しようということになり、今に至っています。

コラムの寄稿や原稿の査読にご協力頂ける方を募集しています

この書籍の執筆プロジェクトには、すでに数名の方に参加頂いて、章やコラムの執筆などをお願いして進めています。できるだけ多くの方に関わっていただいて、symfony 1のノウハウをこの1冊にできるだけまとめることができたらいいなと思っています。
ただ、執筆スケジュールにはあまり余裕がありませんので、12月・1月にある程度時間のとれる方限定となってしまいますが、興味のある方は私(hidenorigoto at gmail)宛にご連絡ください。

Symfony Advent 2010であなたの記事を公開してみませんか?

Symfony Advent 2010では12月1日から12月24日までを使って日替わりでsymfonyでイイなと思った小さなtipsから内部構造まで迫った解説などをブログ記事にし て公開していくイベントです。
参加についてはATNDで参加表明の上、Google
GroupのSymfony Advent 2010に追加リクエストを送信ください。
Symfony Advent 2010チーム一同、あなたの参加をお待ちしております。
日本Symfonyユーザー会
Symfony アドベントカレンダー2010
※Syfony Advent 2010はsymfony好きな有志で集まったチームです。

Symfony ORM のパフォーマンス比較 (2) Symfony2(PR4) & Doctrine2

この記事は、Symfony アドベントカレンダー 2010 に参加しています。

さて、今回はいきなりですが、Symfony2 と Doctrine2 を使って計測してみます。
この計測を行うには、以下のような準備が必要なので、それは日を改めて記事にしたいと思います。

  • Symfony2/Doctrine2 環境でのエンティティクラスの準備
  • Symfony2 でコマンドの作成

今回は、上記準備は整っているものとして、計測に使ったコード部分のみを掲載します。

環境

使用したバージョンは以下です。

  • Symfony2 PR4
  • Doctrine2 ORM BETA4

※Symfony2 Sandbox に付属している Doctrine2 ORM は BETA4 でやや古いですが、そのままで。

Symfony2 & Doctrine2 ORM

INSERT 1万回

Doctrine2 で INSERT を行うには、エンティティオブジェクトを作って EntityManager で persist する方法と、DBAL から Connection オブジェクトを取得して、Connection オブジェクトの insert() メソッドを使う方法があります。

【処理A】 - エンティティをpersist

<?php
        $startTime = microtime(true);

        $em = $this->container->get('doctrine.orm.entity_manager');

        for ($i = 0; $i < 10000; ++$i)
        {
            $address = new Address();
	    $address->setPrefName('岐阜県');
	    $address->setZip1('111');
	    $address->setZip2('2222');
	    $address->setAddr1('山奥の村一丁目一番地');

            $em->persist($address);
        }
        $em->flush();

	echo "proc time:" . (microtime(true) - $startTime) . 'ms' . PHP_EOL;
	echo "memory usage:" . (memory_get_peak_usage(true) / 1048576) . 'MB' . PHP_EOL;

【処理B】 - DBAL の Connection オブジェクトで insert()

<?php
        $startTime = microtime(true);

        $conn = $this->container->get('doctrine.dbal.default_connection');

        for ($i = 0; $i < 10000; ++$i)
        {
            $conn->insert('address', array(
                'pref_name' => '岐阜県',
                'zip1'      => '111',
                'zip2'      => '2222',
                'addr1'     => '山奥の村一丁目一番地',
            ));
        }

	echo "proc time:" . (microtime(true) - $startTime) . 'ms' . PHP_EOL;
	echo "memory usage:" . (memory_get_peak_usage(true) / 1048576) . 'MB' . PHP_EOL;

これらの処理時間とメモリ使用量は次のようになりました。(参考までに、symfony 1.4/Doctrine 1.2の時の数値も並べてあります)

なんだか極端な結果がでましたね・・・。爆速ですが、メモリも激食いです・・・・。
ちなみに、コマンドの処理開始時点での memory_get_peak_usage() の結果は7.5MB程度です。Connection オブジェクトからの insert() の方は、もっとメモリを節約する方法があるような気がしますが・・・。

ところで、処理Aについては、メモリを大量に使うのは当然で、これは1万件すべてを一旦 EntityManager の UnitOfWork にためこんで、最後の flush() の時点で実際に DB に INSERT クエリーを発行する方式だからです。(だからと言って、Pure PHP Objectなのに 70MB かよ! とツッコみたくなりますが・・・)
このようなバッチ処理では、全部を UnitOfWork にためるのではなく、ある程度の件数ごとに flush() するような方法が Doctrine のドキュメントに書いてありました。

この方法で、バッチサイズを 1000、100、10、1 と変えて試してみました。コードは以下のようになります。

【処理A】 - エンティティをpersist - 特定の件数ごとに flush()

<?php
        $startTime = microtime(true);

        $em = $this->container->get('doctrine.orm.entity_manager');

        for ($i = 0; $i < 10000; ++$i)
        {
            $address = new Address();
	    $address->setPrefName('岐阜県');
	    $address->setZip1('111');
	    $address->setZip2('2222');
	    $address->setAddr1('山奥の村一丁目一番地');

            $em->persist($address);
            if ($i % 1000)
            {
                $em->flush();
                $em->clear();
            }
        }
        $em->flush();

	echo "proc time:" . (microtime(true) - $startTime) . 'ms' . PHP_EOL;
	echo "memory usage:" . (memory_get_peak_usage(true) / 1048576) . 'MB' . PHP_EOL;

結果は以下のようでした。

なんだかよく分からない結果ですが、メモリの消費量は抑えられるようです。

主キーランダム SELECT 1万回

ランダムな主キーで 1 件のレコードを取得します。
EntityManager の find() メソッドを使う方法と、DQL を使う方法で試してみます。

【処理A】- EntityManager の find() メソッド

<?php
        $startTime = microtime(true);

        $em = $this->container->get('doctrine.orm.entity_manager');

        for ($i = 0; $i < 10000; ++$i)
        {
            $address = $em->find('Application\HelloBundle\Entity\Address', (int)rand(1, 10000));
        }

	echo "proc time:" . (microtime(true) - $startTime) . 'ms' . PHP_EOL;
	echo "memory usage:" . (memory_get_peak_usage(true) / 1048576) . 'MB' . PHP_EOL;

【処理B】 - DQL から

<?php
        $startTime = microtime(true);

        $em = $this->container->get('doctrine.orm.entity_manager');

        $query = $em->createQuery('select a from Application\HelloBundle\Entity\Address a where a.id =:id');
        $query->setMaxResults(1);
        for ($i = 0; $i < 10000; ++$i)
        {
            $query->setParameter('id', (int)rand(1, 10000));
            $address = $query->getSingleResult();
        }

	echo "proc time:" . (microtime(true) - $startTime) . 'ms' . PHP_EOL;
	echo "memory usage:" . (memory_get_peak_usage(true) / 1048576) . 'MB' . PHP_EOL;

処理Bでは、ハイドレーションしない、というオプションも使えます。

<?php
            $address = $query->getSingleResult(Query::HYDRATE_ARRAY);

※処理Aの方式で、ハイドレーションオプションを指定する方法は、調べていません・・・。

これらの処理の実行時間と、メモリ使用量は次のようになりました。

メモリ使用量は Doctrine1 と比べてやや増えていますが、速度は Doctrine1 でハイドレーションしないときと比べても相当速いですね。

まとめ(にはあいかわらずなっていませんが)
  • Doctrine2 はパフォーマンスは向上しているっぽい
  • けど使い方によってはメモリ消費はきつい

とりあえずいくつかやってみましたが、まだまだ Doctrine2 の使い方をよく分かっていません!
みなさんも実際に使ってみて、「こう書くといい」というやり方など、教えてください!


次回は、同じ検証を、Symfony2 & DoctrineODM(MongoDB) でやったものを掲載予定です。
また、この記事で使った Command の作り方と、Doctrine2 で MySQL を使う場合の注意点のようなことも、別記事でアップします。

Symfony Advent 2010であなたの記事を公開してみませんか?

Symfony Advent 2010では12月1日から12月24日までを使って日替わりでsymfonyでイイなと思った小さなtipsから内部構造まで迫った解説などをブログ記事にし て公開していくイベントです。
参加についてはATNDで参加表明の上、Google
GroupのSymfony Advent 2010に追加リクエストを送信ください。
Symfony Advent 2010チーム一同、あなたの参加をお待ちしております。
日本Symfonyユーザー会
Symfony アドベントカレンダー2010
※Syfony Advent 2010はsymfony好きな有志で集まったチームです。

Symfony ORM のパフォーマンス比較 (1) symfony 1.4 & Doctrine 1.2

この記事は、Symfony アドベントカレンダー 2010 に参加しています。


以前、DoctrineとPropelのパフォーマンス比較 - しんふぉにゃんという記事を書きました。その記事が2009年9月なので、1年以上前ですね。それまでPropel派だった私はその記事以降、Doctrine が(パフォーマンス的にも)結構使えるということが分かり、すっかり Doctrine 使いになってしまっています。その後 Doctrine も Propel も、また symfony 本体もバージョンアップしていますので、比較結果に変化があるかもしれません。
また、現在最も気になるのは、Symfony 2 と Doctrine2 のパフォーマンスじゃないでしょうか。
このあたりを確かめるために、新しいバージョンで同じような処理を行って比較してみたいと思います。

環境

環境は以下のようになっています。前回よりパワーアップしています。

  • CPU Core i7 920
  • OS Ubuntu 10.10 (デスクトップ版 32bit)
  • ノーマルなHDD(SSDではありません)
  • メモリ 3GB
  • PHP 5.3.3、APC有効
  • MySQL 5.1.49

また、前回は触れていませんでしたが、MySQLのmy.cnfで以下の設定をしています。

  • innodb_flush_log_at_trx_commit=0

(この設定には注意が必要ですが、insertのテストでは大きく性能に関わりますので0にしています)

スキーマ

今回テストに使うスキーマは以下のようになっています。後でDoctrine2での比較もあるため、Timestampableなフィールドは省いています。

symfony 1.4 & Doctrine 1.2

今回は、あまり面白みがないかもしれませんが、現役でバリバリ活躍しているこの構成からです。

symfony 1.4.8のソースパッケージをインストールし、frontendアプリケーションを作り、上記のスキーマをconfig/doctrine/schema.ymlに記述してDBとモデルを作成しました。

INSERT 1万回

まずはINSERTからです。前回の記事で、ORMで素直にやる方法と、Doctrineのコネクションオブジェクトを取得してinsertメソッドを使う方法です。
適当なタスクを作成し、タスクの処理本体部分に以下のように記述します。

【処理A】

<?php
    $startTime = microtime(true);

    for ($i = 0; $i < 10000; ++$i)
    {
      //echo $i . PHP_EOL;
      $address = new Address();
      $address->setPrefName('岐阜県');
      $address->setZip1('111');
      $address->setZip2('2222');
      $address->setAddr1('山奥の村一丁目一番地');
      $address->save();
      $address->free();
    }

    echo "proc time:" . (microtime(true) - $startTime) . 'ms' . PHP_EOL;
    echo "memory usage:" . (memory_get_peak_usage(true) / 1048576) . 'MB' . PHP_EOL;

次に、コネクションオブジェクト(Doctrine_Connection)を取得して、コネクションオブジェクトのinsert()メソッドを使います。

【処理B】

<?php
    $startTime = microtime(true);
    
    $table = Doctrine::getTable('Address');
    $conn = $table->getConnection();

    for($i=0; $i<10000;++$i){
      $conn->insert($table,array(
        'zip1'=>'111',
        'zip2'=>'2222',
        'pref_name'=>'岐阜県',
        'addr1'=>'山奥の村一丁目一番地',
      ));
    }
    
    echo "proc time:" . (microtime(true) - $startTime) . 'ms' . PHP_EOL;
    echo "memory usage:" . (memory_get_peak_usage(true) / 1048576) . 'MB' . PHP_EOL;

処理Aと処理Bのそれぞれの実行時間とメモリ使用量は以下のようになります。

主キーランダム SELECT 1万回

次に、ランダムな主キーで1件のレコードを取得する処理を実行してみます。
データベースは、テーブルのオートインクリメント値をクリアした後に、INSERT 1万回のテストでデータを投入した状態なので、IDが1から10000のレコードがあります。

Doctrineのクエリーキャッシュのあり/なしとクエリーの書き方の違い、それにハイドレーションあり/なしを組み合わせて比較してみます。

【処理A】クエリーキャッシュなし、ハイドレーションなし

<?php
    $startTime = microtime(true);

    $q = AddressTable::getInstance()->createQuery('a')->where('a.id = ?');
    for ($i = 0; $i < 10000; ++$i)
    {
      $rec = $q->fetchOne(array((int)rand(1, 10000)), Doctrine_Core::HYDRATE_NONE);
      unset($rec);
    }
    
    echo "proc time:" . (microtime(true) - $startTime) . 'ms' . PHP_EOL;
    echo "memory usage:" . (memory_get_peak_usage(true) / 1048576) . 'MB' . PHP_EOL;

※ハイドレーションありは、Doctrine_Core::HYDRATE_NONEを削除


【処理B】クエリーキャッシュあり、ハイドレーションなし

<?php
    $startTime = microtime(true);
    $manager = Doctrine_Manager::getInstance();
    $manager->setAttribute(Doctrine::ATTR_QUERY_CACHE, new Doctrine_Cache_Apc());

    $q = AddressTable::getInstance()->createQuery('a')->where('a.id = ?');
    for ($i = 0; $i < 10000; ++$i)
    {
      $rec = $q->fetchOne(array((int)rand(1, 10000)), Doctrine_Core::HYDRATE_NONE);
      unset($rec);
    }
    
    echo "proc time:" . (microtime(true) - $startTime) . 'ms' . PHP_EOL;
    echo "memory usage:" . (memory_get_peak_usage(true) / 1048576) . 'MB' . PHP_EOL;


【処理C】クエリーキャッシュなし、ハイドレーションなし、クエリーをループ内で生成

<?php
    $startTime = microtime(true);

    for ($i = 0; $i < 10000; ++$i)
    {
      $q = AddressTable::getInstance()->createQuery('a')->where('a.id = ?');
      $rec = $q->fetchOne(array((int)rand(1, 10000)), Doctrine_Core::HYDRATE_NONE);
      $q->free();
      unset($rec, $q);
    }
    
    echo "proc time:" . (microtime(true) - $startTime) . 'ms' . PHP_EOL;
    echo "memory usage:" . (memory_get_peak_usage(true) / 1048576) . 'MB' . PHP_EOL;

これらの3つの処理の、それぞれの実行時間とメモリ使用量は以下のようになります。

まとめ(にはあまりなっていませんが)
  • Doctrine1は、ハイドレーションのコストは高い
  • 今回のテストのような使い方(バッチの先頭のみでクエリーを作成している)では、クエリーキャッシュの恩恵はない
    • ループ内で、同じクエリーオブジェクトを使い回せるため、再生成の必要がない
  • クエリーオブジェクトの作成コストは無視できる程度?
  • 大量のINSERTでは特に、コネクションオブジェクト経由でinsertしたときの速度改善が大きい

このまとめだけでは、なんだかよく分かりませんね・・・。(検証が正しいのかもちょっと自信がないので、みなさんもやってみてツッコミお願いします)
ただ、今回のテストのように1回の処理で扱うデータの件数がある程度大きくなる場合は、ハイドレーションのオーバーヘッドが顕著になりますね。


次回は、同じ検証を、Symfony2 & Doctrine2 でやったものを掲載予定です。

Symfony Advent 2010であなたの記事を公開してみませんか?

Symfony Advent 2010では12月1日から12月24日までを使って日替わりでsymfonyでイイなと思った小さなtipsから内部構造まで迫った解説などをブログ記事にし て公開していくイベントです。
参加についてはATNDで参加表明の上、Google
GroupのSymfony Advent 2010に追加リクエストを送信ください。
Symfony Advent 2010チーム一同、あなたの参加をお待ちしております。
日本Symfonyユーザー会
Symfony アドベントカレンダー2010
※Syfony Advent 2010はsymfony好きな有志で集まったチームです。

メモ:Doctrine2でMySQL利用時のcreate table文を発行しているところ

charsetとかに対応していないっぽい。

DB接続時(MySQL)に「set names utf8」を投げるには、Doctrine-DBALにあるMysqlSessionInitを有効にする。(なぜデフォルトでは使われていないのかよく分からない)

例えば、HelloBundleのbootメソッドに、以下のように記述する。

<?php
namespace Application\HelloBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
use Doctrine\DBAL\Event\Listeners\MysqlSessionInit;

class HelloBundle extends Bundle
{
    public function boot()
    {
        $em = $this->container->get('doctrine.orm.entity_manager');
        $em->getEventManager()->addEventSubscriber(new MysqlSessionInit('utf8', 'utf8_unicode_ci'));
    }
}

第1回 Symfony2勉強会に参加した

参加というか、言いだしっぺなので主催側ですが・・・。

公式なレポートは以下をご参照ください。


以下はレポートにない、2次会以降の話と余談などを。

2次会、2.5次会、midnightも盛り上がりましたよ!

まず2次会は、ジンガジャパンさんから歩いていける、渋谷の「はかたきむら屋」さんで開催しました。2980円で、もつ鍋としゃぶしゃぶは食べ放題、ドリンク飲み放題というメニューでしたが、鍋と席の都合で、私はもつ鍋側に座りました。移動してどちらも食べればOKなのですが、もつ鍋だけで満腹になりました。チゲのやつが個人的には一番おいしかったです。

その後、midnightの開始予定時間までちょっと時間があいてしまったため、急遽2.5次会としてもう1軒。渋谷で@madapajaさんいきつけのバーを紹介していただき、20人近くでそのままおしかけました。

そして23時からは、六本木ヒルズWIRED CAFESymfony Midnightと称して、閉店時間の朝5時までだらだら?とハッカソンのような、ただの飲み会のようなことまでしました。このお店では「RedBullウォッカ」なる強烈なメニューがあり、私はそれを2杯もいただいてしまいました・・・・。

やっぱりエンジニア同士のお酒の席は楽しい

Symfony Midnightあるよー」
「いつですか?」
「23時から朝の5時まで」
「えっ」
「えっ」

という会話を何度も耳にしましたが、この無茶なスケジュールでもやってよかったなと思います(事前に計画していなくても、勢いでそこまでやっていたような気もします)。

※体力的にはしんどいですがw


もともと掲げていたハッカソン的なことは、自分はほとんどできなかった(MongoDB ODMのコードを追っかけはしましたが・・・)のですが、いろいろな方といろいろなお話ができたので、とても満足しています。


頻繁には開催できませんが、次の勉強会の時などにも、またガッツリと話せる機会は欲しいなと思ってます。

次回のSymfony2勉強会

  • 2011年1月15日(土) 第2回 Symfony2勉強会(東京)
  • 2011年2月か3月 Symfony2ワークショップ@名古屋 計画中