渋谷道玄坂近辺のランチ情報 高橋名人版

高橋名人はブログでいつも食事の記事をアップしていますが
最近、私の職場近辺でよくランチをしているようなので、まとめてみました。

2011年12月

2012年1月

2012年2月

[PHP] CLIの Symfony, limeなどでカラー表示にならない

自宅のMacのうち1台だけどうしてもカラー表示にならないものがありました。
とりあえず php5-posix をインストールしたら解決しました。

lime.phpのソースではこんな感じになってました。

    // disable colors if not supported (windows or non tty console)
    if (DIRECTORY_SEPARATOR == '\\' || !function_exists('posix_isatty') || !@posix_isatty(STDOUT))
    {
      // 色なし
    }

symfonyのソースは見てませんが、なおってくれたのでこちらも似たような感じになっていると思われます。

[Symfony]ER図ツールとsymfony Modelを連携させる方法を模索中

これまでしばらくの間、DBDesigner4で作ったER図のデータを、以下を参考にした自作のTaskでschemaファイルに変換してModelをつくっていました。
http://www.symfony-project.org/plugins/sfDB4toPropelPlugin

ですが、最近は以下のような理由でストレスを感じるようになってきてしまいました。

  • DBDesigner4はMacで使えない
  • 自作のTaskがいけてなくて 対応できる領域が狭い
    • 複数DBに接続するケースは未対応
    • Doctrineを使いたいケースは未対応
  • MySQL Workbenchを使いたいなあと思っている

ということで、いけてない自作Taskをなんとかするついでに、できればMySQL Workbenchと連携させるために 参考になるものをさがしています。

わりとまとまっているものがMySQLフォーラムにありました。
http://forums.mysql.com/read.php?153,208229

  • MySQL WorkbenchのpluginとしてORM用ファイルを生成
  • .mwbファイルをフレームワーク側でORM用ファイルに変換

MySQL Workbenchはpluginで機能拡張ができるため、アプローチが2パターンありますね。
私はコマンドラインで生成するのが好きなので後者のほうがよいのですが、いまのところ思うように変換できるものがありません。

DB接続時に毎回実行しておきたいクエリーがあるとき

database.yml

all:
  hogeghoge_db:
    class: sfPropelDatabase
    param:
      classname: PropelPDO
      dsn: 'mysql:dbname=hogehoge;host=localhost'
      username: hogehogeuser
      password: hogehogepass
      encoding: null             # コメントアウトすると set names utf8 されてしまう
      persistent: false
      pooling: false
      queries:                   # 接続時に実行
        - "SET time_zone = '+9:00'"

SwiftMailer 4 + Symfony 1.2 の初回設定

私の環境(symfony1.2.9-DEV,Swift 4.0.3)では、SwiftMailerを
(sf_root_dir)/lib/vendor/Swift/ 以下などにそのまま置くだけではうまくautoloadしてくれなくて動きませんでした。

解決法は http://forum.symfony-project.org/index.php/m/77609/ にあるのですが、載っているソースにtypoがあったりしてはまったので、次回からは以下のようにしようと思います。

(1) (sf_root_dir)/lib/vendor/Swift4/ 以下にSwiftMailerのtarを展開
Swift4 の直下に swift_init.php とかが置かれる感じで。

$ ls lib/vendor/Swift4/
classes  dependency_maps  mime_types.php  preferences.php  swift_init.php  swift_required.php

(2) lib/vendor/Swift4/swift_required.php の以下の部分を変更して、同ディレクトリの swift_required_4sf.php に保存

- Swift::registerAutoload();
+ spl_autoload_register(array('Swift', 'autoload'));

(3) 以下のファイルを以下の内容で設置

(sf_root_dir)/plugins/sfSwiftMailerPlugin/config/sfSwiftMailerPluginConfiguration.class.php

<?php
class sfSwiftMailerPluginConfiguration extends sfPluginConfiguration
{
    public function initialize()
    {
        require_once dirname(__FILE__) . '/../../../lib/vendor/Swift4/swift_required_4sf.php';
        return true;
    }
}

(4) symfony cc


ちなみにJISで日本語メールを送るのは半分あきらめてて、別にutf-8でいいやと思ってます。

sfFormのvalidatorで引っかかったエラーメッセージを全部取得

いろいろあって、sfFormはvalidatorのみ使用(widgetはほぼ自動で挿入される_csrf_token的なものでしか使用しない)、という方針で開発をすることがあるのですが、その際のエラーメッセージの取り出し方について一旦たどりついた結論です。

    $this->form = new HogehogeForm();
    $this->form->bind($request->getPostParameters());
    
    if (!$this->form->isValid()) {
      $error_messages = array_map(
          create_function('$e', 'return $e->getMessage();'),
          $this->form->getErrorSchema()->getErrors());

{sfForm}->getErrorSchema()->getErrors(); で、バリデーションに引っかかったすべてのエラーをsfValidatorError(Exceptionのサブクラス) の配列として取得できるようなので、これを利用してみました。myFormクラスに書いておいたほうがよいかもとか、そもそもこれでいいのかという気もするので、もうちょっと検討します。

Taskにも時々application名を指定してあげる

うっかり忘れるのでメモ。


Taskを作る際、symfony generate:task して処理を書くわけですが、sfConfig::get()で取得できる設定が妙に少なくて焦りました。

以下 var_dump(sfConfig::getAll()); の結果です。

array(17) {
  ["sf_symfony_lib_dir"]=>
  string(33) "/path/to/symfony1.2/lib"
  ["sf_root_dir"]=>
  string(43) "/home/yoshihi6/my-project"
  ["sf_apps_dir"]=>
  string(48) "/home/yoshihi6/my-project/apps"
  ["sf_lib_dir"]=>
  string(47) "/home/yoshihi6/my-project/lib"
  ["sf_log_dir"]=>
  string(47) "/home/yoshihi6/my-project/log"
  ["sf_data_dir"]=>
  string(48) "/home/yoshihi6/my-project/data"
  ["sf_config_dir"]=>
  string(50) "/home/yoshihi6/my-project/config"
  ["sf_test_dir"]=>
  string(48) "/home/yoshihi6/my-project/test"
  ["sf_doc_dir"]=>
  string(47) "/home/yoshihi6/my-project/doc"
  ["sf_plugins_dir"]=>
  string(51) "/home/yoshihi6/my-project/plugins"
  ["sf_web_dir"]=>
  string(47) "/home/yoshihi6/my-project/web"
  ["sf_upload_dir"]=>
  string(55) "/home/yoshihi6/my-project/web/uploads"
  ["sf_cache_dir"]=>
  string(49) "/home/yoshihi6/my-project/cache"
  ["sf_orm"]=>
  string(6) "propel"
  ["sf_admin_module_web_dir"]=>
  string(15) "/sfPropelPlugin"
  ["sf_environment"]=>
  string(3) "dev"
  ["sf_logging_enabled"]=>
  bool(false)
}

application名を特に指定していないため、setting.yml, routing.yml なんかが読み込まれないということではあるのですが、

  • (sf_root_dir)/config/app.yml すら読み込まれない
  • log/ 以下にログが出力されない

あたりが一見不可解におもいました。ymlに書いた設定を参照したい、あるいはログを出したいという時点でapplication名の指定が必要なんですね。

ちなみに、application名を指定するのはconfigureメソッド内にあるsfCommandOption('application',〜〜)の第5引数で指定すればよいです。

  protected function configure()
  {
    // 〜〜〜

    $this->addOptions(array(
-      new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name'),
+      new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name', 'backend'),
      new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
      new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'propel'),
      // add your own options here
    ));

    // 〜〜〜
  }