モノノフ日記

普通の日記です

symfony1.1 beta3を導入してみる

ちょっと試しにローカル環境に導入してみました。
導入にはPEARからインストールせず、サクっと試せるsf_sandboxを利用してます。

sf_sandboxは必要なライブラリとか全部込みでワンパッケージ化されていて、webルートディレクトリに置けばそのまま動く便利モノです。sf_sandboxの詳細は原文を参照したので参考に。

The sandbox

The sandbox is an empty symfony project where all the required libraries are already included, and where the basic configuration is already done. It is made for symfony beginners, who want to play with the framework or try the tutorials without installing anything.

You can download a sandbox sf_sandbox.tgz. Unpack it in your root web directory. Refer to the included readme file for more information.

After downloading the sandbox, you might want to follow the My first project tutorial to discover the basics of symfony development.

http://www.symfony-project.org/installation/1_1

この後やった手順は順に、

  1. ダウンロードしたtgzファイルを展開
  2. webルートディレクトリに置く
  3. Apacheの設定をsf_sandboxを参照するように変更
  4. Apache再起動

と、普通のセットアップ手順になります。セットアップ完了後、http://localhost/にアクセスしたSSが下記です。
f:id:Kiske:20080422110203j:image
1.0の時と同じデフォルト画面。変わってるかなと期待してたので残念。

sf_sandboxのディレクトリ構成を見てみます。下記リストがディレクトリ構成になってます。

ザッと見た感じディレクトリの構成は1.0からの変更はなさそう。
ディレクトリ構成を眺めた雑感をまとめると、

  • libとdataディレクトリにsymfonyのCoreライブラリがガッツリ入ってる
  • サンプルはapp名がお決まりのfrontend
  • prototype.jsが1.6.0.2、script.aculo.usが1.8.1にアップデート

試しにsf_sandboxのプロジェクトルートで下記コマンドを実行。

./symfony -V
symfony version 1.1.0-BETA3 (/var/www/sf_sandbox/lib/symfony)

ちゃんと1.1.0-BETA3で動いてます。
コレsymfonyはインストールしなくてパッケージ化できるよ、って事なのでアピールポイントになるんじゃないのかな。jarみたいに置いてwebサーバの設定だけでOKですよ!みたいな。
まぁ、どのフレームワークでもパッケージングはやろうと思えばできるから同じか。

app名がfrontendとわかったのでdev環境でdebugバーを表示させてみました。
f:id:Kiske:20080422112241j:image

これも特に1.0から変わりなし。次にvars&configをクリックしてみました。
f:id:Kiske:20080422112925j:image

項目が増えてます。中身も見ると表示の仕方が変わっていてスッキリしていました。
気になった点を箇条書きでつらつらと挙げておきます。

  • configuration
    • tokenizerが追加されてる
  • request variables
    • RequestのattributeHolderにformatsパラメータがデフォで入ってる
parameterHolder:
  action: index
  module: default
attributeHolder:
  formats: { txt: text/plain, js: [application/javascript, application/x-javascript, text/javascript], css: text/css, json: [application/json, application/x-json], xml: [text/xml, application/xml, application/x-xml], rdf: application/rdf+xml, atom: application/atom+xml }
    • Responseのjavascripts, stylesheetsにfirst, lastという項目がある
options:
  logging: '1'
  charset: utf-8
cookies: {  }
httpHeaders:
  Content-Type: 'text/html; charset=utf-8'
javascripts:
  first: {  }
  '': {  }
  last: {  }
stylesheets:
  first: {  }
  '': { main: {  } }
  last: { /sf/sf_default/css/screen.css: {  } }
metas:
  robots: 'index, follow'
httpMetas:
  Content-Type: 'text/html; charset=utf-8'
    • Userが追加されてる
options:
  auto_shutdown: false
  culture: null
  default_culture: en
  use_flash: true
  logging: '1'
  timeout: 1800
attributeHolder: {  }
culture: en
  • GlobalのENVにOSの環境変数が入るようになっている (IPやポートやソフト情報は載せてませんがデバッグには出ます)
cookie:
  symfony: 66d52c93923612380f8c6ade58b4df70
env:
  LANG: C
  PATH: '/usr/local/bin:/usr/bin:/bin'
  PWD: /var/www/sf_sandbox
  SHLVL: '1'
  _: /usr/sbin/apache2
files: {  }
get: {  }
post: {  }
server:
  DOCUMENT_ROOT: /var/www/sf_sandbox/web
  GATEWAY_INTERFACE: CGI/1.1
  HTTP_ACCEPT: 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'
  HTTP_ACCEPT_CHARSET: 'Shift_JIS,utf-8;q=0.7,*;q=0.7'
  HTTP_ACCEPT_ENCODING: 'gzip,deflate'
  HTTP_ACCEPT_LANGUAGE: 'ja,en-us;q=0.7,en;q=0.3'
  HTTP_CONNECTION: keep-alive
  HTTP_COOKIE: symfony=66d52c93923612380f8c6ade58b4df70
  HTTP_HOST: 'localhost:8000'
  HTTP_KEEP_ALIVE: '300'
  HTTP_USER_AGENT: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14'
  PATH: '/usr/local/bin:/usr/bin:/bin'
  PATH_INFO: /
  PATH_TRANSLATED: /var/www/sf_sandbox/web/index.php
  PHP_SELF: /frontend_dev.php/
  QUERY_STRING: ''
  REMOTE_ADDR: *.*.*.*
  REMOTE_PORT: '****'
  REQUEST_METHOD: GET
  REQUEST_TIME: 1208829098
  REQUEST_URI: /frontend_dev.php/
  SCRIPT_FILENAME: /var/www/sf_sandbox/web/frontend_dev.php
  SCRIPT_NAME: /frontend_dev.php
  SERVER_ADDR: *.*.*.*
  SERVER_ADMIN: webmaster@localhost
  SERVER_NAME: localhost
  SERVER_PORT: '****'
  SERVER_PROTOCOL: HTTP/1.1
  argc: 0
  argv: {  }
session:
  symfony/user/sfUser/attributes: {  }
  symfony/user/sfUser/authenticated: false
  symfony/user/sfUser/credentials: {  }
  symfony/user/sfUser/culture: en
  symfony/user/sfUser/lastRequest: 1208829073
  • Phpのインストール済みライブラリにバージョン番号が出るようになってるモノがある

とりあえずここまで。1.1は外見的には1.0からそんなに変わってる印象はありませんでした。

週末に本を買った

2冊買いました。

Googleを支える技術 ?巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)

Googleを支える技術 ?巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)

Web標準テキスト(1) DOM Scripting (Web標準テキストシリーズ)

Web標準テキスト(1) DOM Scripting (Web標準テキストシリーズ)

Domの解説本はもう1つ候補があってどっち買うか迷ったけど、
あんまネットで言及されてない方を敢えて選んでみた。
もう1つの候補はコレでした。

DOM Scripting 標準ガイドブック ~やさしく学ぶ、JavaScriptとDOMによるWebデザイン~ (Web Designing BOOKS)

DOM Scripting 標準ガイドブック ~やさしく学ぶ、JavaScriptとDOMによるWebデザイン~ (Web Designing BOOKS)

Googleの本はアルファな人たちがいろいろ書評してたのを見てて、
本屋で立ち読みしたら面白かったので予定外の購入。
文章も平易でサクっと読めそうだったので思わず買っちゃいました。

メインはDOMの解説本。
Javascriptを最近いじってて楽しいんですが、DOMの勉強をちゃんとやらず、
ネットでリファレンス見て今までやってたのでちゃんと本読むことにしました。
読み終わったら、オライリーの第5版読む予定。

symfony1.1 beta3リリース

symfony勉強会のあった当日にリリースされてた模様です。

斜め読みで訳した変更点をまとめておきます。適当に訳してる所もあるので注意w
詳細はsymfony Web PHP Framework » Blog » Symfony 1.1 beta3 is outを参照してください。

変更点

  • Windows環境下でsfFinderとpathでいくつかの問題点があったのを修正
  • escaping設定方法のbcとbothは廃止。現在はonとoffだけになっている
  • アクションテンプレートの変数がレイアウト内でもう使えません。これはレイアウトがグローバル変数(sf_variables)と専用のイベントを通して登録された変数のみにアクセスする事を意味しています。wiki pageにupgradeのやり方の詳細を記述。
  • 現在、CSRFプロテクションはフォームフレームワーク内ではデフォルトでは無効です。有効にするためには、setting.yml内にcsrf_secretパラメータにsecretキーを設定する必要があります。
  • フォーマットとmime-typesのサポートを追加
    • sf_formatパラメータは現在、フォーマットとmime-typesを関連付けるルーティングURL内で利用可能です
    • それぞれの定義済みのフォーマットは拡張子による専用テンプレートと関連付けられてます。例えば、フォーマットがjsなら、デフォルトテンプレートはindexSuccess.js.phpになります
    • フォーマットはテンプレート、レイアウト、コンポーネント、パーシャルでサポートされます
  • i18nの機能をフォームフレームワークに追加
  • 現在sf_compatがoffの場合でもadminジェネレータは動作します
  • 新しくタスクが生成されます: タスクは自動的にタスククラスに生成されます。
  • ドキュメントがアップデート(まだ未完成の状態)
  • 8000以上のユニット & ファンクションテストを行いました
  • Nicolasっていうsymfony1.1のリリースマネージャという人が新登場してますw

beta2からアップグレードするときは下のコマンドでアップグレードする必要があるみたいです。

symfony project:up
symfony cc

beta3以降は今回のような新規要素の追加はしない予定です、とも書かれてます。
新しく人柱したい人はbeta3を使っていって方が良さそうな感じですね。

第1回symfony勉強会

株式会社ディノさんで開催された第1回symfony勉強会に参加してきました。会場提供ありがとうございます!
気になるところノートにメモったので軽く感想レポ。詳細は公開されるであろう資料をw

15分くらい遅刻したのですが、何とかプレゼンには間に合ってよかった。。

symfonyの基本を理解する (発表資料)(Ustream動画)

  • 現状のフレームワークは何かしらRailsの影響受けてるので元を辿ればRailsのパクリだよね
    • helper
    • plugin
    • scaffolding
  • symfony-doc-ja
    • 僕も参加してちまちま和訳してます(主にpluginの所)
    • 参加者募集しているので興味ある人はご一報ください!
  • CheatSheet
  • Cache
    • sfFunctionCache
    • sfProcessCache
      • memcachedみたいに使うと、凄い便利そう
  • テストについても触れて欲しかった

symfonyによる自社サービスの作成事例について (発表資料)(Ustream動画)

  • 日本での導入事例
  • トレイン・トレイン
  • サーバ構成
    • Webサーバ1台 + DBサーバ2台
      • WebサーバはXenで動かしてるらしい
  • ドキュメントが日本語
    • 正直、プログラマーが英語を読むのためらってどうするの?と思う
  • DB+ORM
  • schema周りが弱い
    • これはOSSのORM使ってる宿命かと
    • 満足するにはオレオレORM作るしかない
  • FAQ
    • doctrineとPropelの速度比較は?
      • 全く同じコードなら、たぶんdoctrineの方が若干速い
      • doctrineは妙な動作が多いので、そこが少し怖い
    • 開発環境は個人のもXenで構築してる
      • これいいなー。ウチも導入するべきと思った

symfonyの展望とversion1.1の見所 (Ustream動画)

  • 今日の目標
    • 人柱を増やす
  • Form
  • Contoroller(Action)にはあんまり処理書かないってのは激しく同意
  • ORM
    • Propel1.2→1.3でどれだけ変わるか調べたい
    • CLIからサーバ固有情報(DSN)を入力
      • configファイルに書かないのでDSNを構成に入れない運用が可能
  • Cache
    • 1.0はファイルベース
    • 1.1はmemcachedやAPCでキャッシングしようとする
      • これは期待大!
  • YAML
    • 自前パーサに置き換わった
      • 詳細なエラーが出るようになりました
  • Config
    • config.phpは無くなって、configもクラス化

Lightning Talk

手ぶらLT (Ustream動画)
  • キャッシュ生成時の動作について
symfony.el (Ustream動画)
Symfonian (資料まとめ)(Ustream動画)
  • i18nサイトの作り方
  • Symfonianというsymfony使ってる人用のSNSがある
    • 3月にOSS化されたのでそれを参考に
懇親会
  • 秋元さんに「ブログ書くだけでどれだけもらってんだ」の件をいろいろ聞きましたw
  • もちろん、その他にもいろいろ参考になるお話が聞けました
  • symfonyIRCチャンネル作って集まろうよ、という話が
    • 月宮さんが「誰もいないけど、もうあるよ」発言w
    • freenodeの#symfony-ja

みなさんお疲れ様でした。大盛況でしたねー。
月イチで開催したいという事なので興味ある人は参加しましょう!

詳説 正規表現 第3版

ついに第3版の日本語版が発売されるみたいです。これは買いでしょう。

第2版との比較

うれしいことに値下げして増ページされてるみたいです。

  • 5670円→5040円に値下げ
  • 464ページ→528ページに増ページ

ITMediaの記事がブログに貼りやすくなったらしいので

早速試してみました。

画像にするのはメリットデメリット両方ありそうなんで、ケースバイケースで使い分けようかなと思います。
あと個人的な不満点は、

文章での引用禁止とかは明言していないですよね・・?

PECL::Imagickを試す

GDで展開できない画像*1があったのでImageMagickを試そうと思って導入してみました。

インストール

peclモジュールなのでコマンドライン1発で楽チン。

sudo pecl install imagick

php.iniにライブラリを呼び出す記述を追加

extension=imagick.so

実際に使ってみる

マニュアルはいろいろ探しましたが、PHPマニュアルが一番詳しいと思います。
PHP: Imagick 画像ライブラリ - Manual
しかしPHPマニュアルもAPI一覧のみで詳しい解説は書かれていないので実際に使って試してみました。

サンプル画像はこれです。

リサイズしてみた

APIリストを眺めてみるとリサイズに使いそうなメソッドである下記5つを試してみました。

  • Imagick::adaptiveResizeImage
  • Imagick::cropImage
  • Imagick::thumbnailImage
  • Imagick::resizeImage
  • Imagick::cropThumbnailImage
Imagick::adaptiveResizeImage
メソッドの説明

データに依存する三角測量にもとづいて画像のサイズを変更する, と記述されてますが何のことやら。。引数のcolumns, rowsはマニュアルページのサンプルコードから類推すると、それぞれ縦幅, 横幅の様です。

bool Imagick::adaptiveResizeImage ( int $columns , int $rows )

http://jp2.php.net/manual/ja/function.imagick-adaptiveresizeimage.php
サンプルコード

300x300の正方形にリサイズしています。

<?php
  $image = new Imagick('/path/to/sample.jpg');
  $image->adaptiveResizeImage(300,300);
  header('Content-type: image/jpeg');
  echo $image;
結果
Fatal error: Call to undefined method Imagick::adaptiveResizeImage()

メソッドが無いみたいです。とりあえず次へw

Imagick::cropImage
メソッドの説明

切り取りたい縦・横幅と元画像の切り取り開始位置を引数にとってます。よくあるcropメソッドですね。

bool Imagick::cropImage ( int $width , int $height , int $x , int $y )

http://jp2.php.net/manual/ja/function.imagick-cropimage.php
サンプルコード

300x300の大きさで、元画像の左隅(0,0)からcropさせてみました。

<?php
  $image = new Imagick('/path/to/sample.jpg');
  $image->cropImage(300,300, 0, 0);
  header('Content-type: image/jpeg');
  echo $image;
結果

f:id:Kiske:20080217121007j:image

元画像の左隅の壁の部分がcropできてます。

Imagick::thumbnailImage
メソッドの説明

fitをtrueにすると、columnsかrowsの小さい方の値に合わせてサムネイルが生成される模様です。

bool Imagick::thumbnailImage ( int $columns , int $rows [, bool $fit ] )

画像のサイズを指定したものに変更し、関連付けられたプロパティをすべて削除します。 ウェブ上での表示に適した小さなサムネイル画像を作成します。 3 番目のパラメータに true を指定すると、columns や rows にそれぞれの最大値を使用します。両方のパラメータが、 マッチするまであるいは指定したパラメータより小さくなるまで縮小されます。

http://jp2.php.net/manual/ja/function.imagick-thumbnailimage.php
サンプルコード

300x300の大きさで、filをtrueにしてサムネイル生成

<?php
  $image = new Imagick('/path/to/sample.jpg');
  $image->thumbnailImage(300, 300, true);
  header('Content-type: image/jpeg');
  echo $image;
結果

f:id:Kiske:20080408141932j:image
元画像の比率を維持したまま、サムネイル生成しています。大きさは画像の最大長側(この場合は横幅)を基準としているため300x225にリサイズされています。

Imagick::resizeImage
メソッドの説明

Imagick::thumbnailImage()との違いはfilter, blurを指定できる所の様です。

bool Imagick::resizeImage ( float $columns , float $rows , int $filter , float $blur )

指定した大きさとフィルタで、画像のサイズを変更します。

http://jp2.php.net/manual/ja/function.imagick-resizeimage.php
サンプルコード

マニュアルのサンプルコードをまねて、LANCZOSフィルタ*2を使ってみます。その他の各種フィルタ定数はマニュアルを参考してください

<?php
  $image = new Imagick('/path/to/sample.jpg');
  $image->resizeImage(300, 300, imagick::FILTER_LANCZOS, 0);
  header('Content-type: image/jpeg');
  echo $image;
結果

f:id:Kiske:20080217121007j:image

無理やり300x300に縮小しているので比率がおかしくなっています。

Imagick::cropThumbnailImage
メソッドの説明

縮小してからサムネイルを生成するメソッド。centerから指定した大きさで切り取ってくれてる様です。

bool Imagick::cropThumbnailImage ( int $width , int $height )

固定サイズのサムネイルを作成します。まず画像のサイズを縮小し、指定した範囲を中心から切り取ります。

http://jp2.php.net/manual/ja/function.imagick-cropthumbnailimage.php
サンプルコード

300x300のサムネイルを生成しています。

<?php
  $image = new Imagick('/path/to/sample.jpg');
  $image->cropThumbnailImage(300, 300);
  header('Content-type: image/jpeg');
  echo $image;
結果

f:id:Kiske:20080408143555j:image
元画像と比較すると、左右が切り取りとられていますが比率は維持されています。

まとめ

ざっくりと用途を考えると下みたいな感じでしょうか。

メソッド名 用途
Imagick::adaptiveResizeImage メソッドが存在しないようなので使えない
Imagick::cropImage 元画像から切り取る範囲が決まっている
Imagick::thumbnailImage 比率維持したまま、サムネイル作りたい
Imagick::resizeImage フィルタ使って、サムネイル作りたい
Imagick::cropThumbnailImage 比率維持したまま、中心から任意の範囲を切り取りたい

*1:VQ1005というトイカメラで撮影された画像

*2:aviutlのプラグインで見たことある名前