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
この後やった手順は順に、
と、普通のセットアップ手順になります。セットアップ完了後、http://localhost/にアクセスしたSSが下記です。
1.0の時と同じデフォルト画面。変わってるかなと期待してたので残念。
sf_sandboxのディレクトリ構成を見てみます。下記リストがディレクトリ構成になってます。
- LICENSE
- README
- apps/
- frontend/
- config/
- i18n/
- lib/
- modules/
- templates/
- frontend/
- cache/
- config/
- data/
- symfony/
- bin/
- web/
- symfony/
- doc/
- lib/
- log/
- plugins/
- symfony
- symfony.bat
- test/
- web/
- css/
- frontend_dev.php
- images/
- index.php
- js/
- robots.txt
- sf/
- uploads/
ザッと見た感じディレクトリの構成は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バーを表示させてみました。
これも特に1.0から変わりなし。次にvars&configをクリックしてみました。
項目が増えてます。中身も見ると表示の仕方が変わっていてスッキリしていました。
気になった点を箇条書きでつらつらと挙げておきます。
- 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
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プラスシリーズ)
- 作者: 西田圭介
- 出版社/メーカー: 技術評論社
- 発売日: 2008/03/28
- メディア: 単行本(ソフトカバー)
- 購入: 46人 クリック: 1,143回
- この商品を含むブログ (371件) を見る
Web標準テキスト(1) DOM Scripting (Web標準テキストシリーズ)
- 作者: 古籏一浩
- 出版社/メーカー: 技術評論社
- 発売日: 2008/01/11
- メディア: 単行本(ソフトカバー)
- クリック: 19回
- この商品を含むブログ (3件) を見る
Domの解説本はもう1つ候補があってどっち買うか迷ったけど、
あんまネットで言及されてない方を敢えて選んでみた。
もう1つの候補はコレでした。
DOM Scripting 標準ガイドブック ~やさしく学ぶ、JavaScriptとDOMによるWebデザイン~ (Web Designing BOOKS)
- 作者: Jeremy Keith,中村享介,吉川典秀
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2007/06/21
- メディア: 単行本(ソフトカバー)
- 購入: 4人 クリック: 90回
- この商品を含むブログ (30件) を見る
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のサポートを追加
- 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
- Propelの構文生成ジェネレータがある
- Cache
- sfFunctionCache
- sfProcessCache
- memcachedみたいに使うと、凄い便利そう
- テストについても触れて欲しかった
- limeいいよ、lime
- perlのTest::Moreがベース
- danさんがBlogで書いてる事がsymfonyで出来るよ!
- limeいいよ、lime
symfonyによる自社サービスの作成事例について (発表資料)(Ustream動画)
- 日本での導入事例
- SourceForge.jp Wiki
- トレイン・トレイン
- 鉄っちゃんSNSを開発
- ちなみにphotohito.comもsymfonyです!(思いっきり宣伝)
- サーバ構成
- Webサーバ1台 + DBサーバ2台
- WebサーバはXenで動かしてるらしい
- Webサーバ1台 + DBサーバ2台
- ドキュメントが日本語
- 正直、プログラマーが英語を読むのためらってどうするの?と思う
- DB+ORM
- doctrine使ってるのにビックリ
- 前試したときは結構挙動が怪しかった
- Propel使いにくい
- ORMってそもそもSQLを抽象化するものだし
- たぶん好みの問題
- ちなみにPropelは日本語ドキュメントアルヨーhttp://propel.phpdb.org/trac/wiki/Ja/WikiStart
- propel schemaからdoctrine schemaへのconverter
- 公式サイトにバッチがあったはず。動くかどうか試してないけどw
- ConvertPropelSchemaToDoctrineSchema - symfony - Trac
- doctrine使ってるのにビックリ
- schema周りが弱い
- これはOSSのORM使ってる宿命かと
- 満足するにはオレオレORM作るしかない
- FAQ
- doctrineとPropelの速度比較は?
- 全く同じコードなら、たぶんdoctrineの方が若干速い
- doctrineは妙な動作が多いので、そこが少し怖い
- 開発環境は個人のもXenで構築してる
- これいいなー。ウチも導入するべきと思った
- doctrineとPropelの速度比較は?
symfonyの展望とversion1.1の見所 (Ustream動画)
- 今日の目標
- 人柱を増やす
- Form
- 1.0はHelper
- 1.0でもデフォルトでfillin使えたと思うhttp://www.symfony-project.org/book/1_0/10-Forms#Repopulating%20the%20Form
- 1.1ではクラスに書き換えられてる(sfForm.class.php)
- 1.0はHelper
- Contoroller(Action)にはあんまり処理書かないってのは激しく同意
- ORM
- Propel1.2→1.3でどれだけ変わるか調べたい
- CLIからサーバ固有情報(DSN)を入力
- configファイルに書かないのでDSNを構成に入れない運用が可能
- Cache
- 1.0はファイルベース
- 1.1はmemcachedやAPCでキャッシングしようとする
- これは期待大!
- YAML
- 自前パーサに置き換わった
- 詳細なエラーが出るようになりました
- 自前パーサに置き換わった
- Config
- config.phpは無くなって、configもクラス化
詳説 正規表現 第3版
ついに第3版の日本語版が発売されるみたいです。これは買いでしょう。
第2版との比較
うれしいことに値下げして増ページされてるみたいです。
- 5670円→5040円に値下げ
- 464ページ→528ページに増ページ
ITMediaの記事がブログに貼りやすくなったらしいので
早速試してみました。
画像にするのはメリットデメリット両方ありそうなんで、ケースバイケースで使い分けようかなと思います。
あと個人的な不満点は、
- knowtはキレイに切り抜けるんだけど若干重い
- はてなダイアリーにスクリプトがそのまま貼れない
文章での引用禁止とかは明言していないですよね・・?
2008/04/11追記
はてなダイアリー側でkwoutの貼り付けに対応したみたいです。
Webページを画像化して引用できる「kwout」の貼り付けに対応しました - はてなダイアリー日記
PECL::Imagickを試す
GDで展開できない画像*1があったのでImageMagickを試そうと思って導入してみました。
実際に使ってみる
マニュアルはいろいろ探しましたが、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;
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;
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;
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;
まとめ
ざっくりと用途を考えると下みたいな感じでしょうか。
メソッド名 | 用途 |
---|---|
Imagick::adaptiveResizeImage | メソッドが存在しないようなので使えない |
Imagick::cropImage | 元画像から切り取る範囲が決まっている |
Imagick::thumbnailImage | 比率維持したまま、サムネイル作りたい |
Imagick::resizeImage | フィルタ使って、サムネイル作りたい |
Imagick::cropThumbnailImage | 比率維持したまま、中心から任意の範囲を切り取りたい |