Monthly Archives: November 2006

symfonyチュートリアル実践 まとめ

symfony askeetチュートリアル24日分を終えて、反省点はまず チュートリアルで使われているsymfonyのバージョンはbeta(0.7.*)なのでそれを使うべき SVNを使ってソースをアップデートした方がいい(チュートリアル中にはない変更が加えられている) 質問はフォーラムよりaskeet.comの方がよさげ 上の2つは僕が勝手に端折ったので単に反省。 24日分、24時間はかからなかったですが10時間以上はかかりました。もっと適当にやってもよかった気がします。 で、symfonyそのものについて現段階での感想ですが、 ドキュメントは確かに豊富(チュートリアルの日本語訳はまだ揃っていませんがドキュメントはかなり訳されている模様:参照) 仕組みは明快、ただ設定ファイルはたくさんあってわかりづらいかも 実行速度的な問題はまだわかりません。また、真にstableで使えるバージョンがいつ出てきてくれるかは気になるところです。 MySQLの代わりにPostgreSQLを使うと、動かないわけではないですが一筋縄ではいかない箇所も出てきました。autoincrementの部分とか。この辺りも実際使うとなるといろいろ問題が出てきそうです。 以上でチュートリアル実践はおしまい。終わってよかった。 PHP5のフレームワーク、Symfonyの24チュートリアルを実践してみることにした symfonyチュートリアル実践【第1~2日目】 symfonyチュートリアル実践【第3日目】 symfonyチュートリアル実践【第4日目途中】 symfonyチュートリアル実践【第4日目続き】 symfonyチュートリアル実践【第5日目】 symfonyチュートリアル実践【第6日目】 symfonyチュートリアル実践【第7日目】 symfonyチュートリアル実践【第8~9日目】 symfonyチュートリアル実践【第10~11日目】&Forumに参加 symfonyチュートリアル実践【第12~13日目】 symfonyチュートリアル実践【第14~16日目】 symfonyチュートリアル実践【第17~18日目】 symfonyチュートリアル実践【第19~24日目】 11月15日 追記: オレンジニュースで紹介していただきました。そこで一緒に載っていたサイトによると、チュートリアルは7日目までは訳してくださった方々がいらっしゃいました。 askeetの翻訳一覧 – symfony翻訳サイト 11月15日 追記(おまけ): symfonyのコマンドはオプションが多くて大変ですがzshとbashで補完してくれる関数がオフィシャルで配布されていました。 ZshCompletion – symfony – Trac FedoraCore5にyumで入れたzshの場合、/usr/share/zsh/site-functions/_symfonyに記述すればtabを押すと補完してくれます。

Posted in いじる | Leave a comment

symfonyチュートリアル実践【第19~24日目】

symfonyを使う上で+αな内容になってきたので軽く読み飛ばすだけにしています。 19日目 パフォーマンスとキャッシュ。 Load testing toolとしてJMeterが紹介されていますが僕が使ったことがあるのはMS Web Application Stress ツール。機能的には同じだと思います。もう1つ紹介されていたのがApacheのab。 チュートリアル中、”Put the result of the action in the cache”の項目はsymfonyのstable 0.6系では動かないそうです。 キャッシュに関するドキュメントをざっと見ると、ページ全体やサイドバーだけ、等々かなり細かくキャッシュファイルを生成することが出来るようです。 20日目 管理画面の作成。 eXtreme Programmingでやりましょう、とUser Storiesを組み立てるところから始めている。 $this->getContext()->getLogger()->warning($log);でログを取るのとtry/catchが初めて出てきた。 21日目 “Search engine”と題されているのでごっついが、やっているのはDB内のテキスト検索。 “How to build a search engine?”のところで書かれているZsearchはZend Framework(現在は0.2.0)の中に入っている。 http://framework.zend.com/manual/ja/zend.search.html Zend_Search_Lucene は、完全に PHP 5 で書かれている汎用的なテキスト検索エンジンです。 symfonyでもPHPで書かれた汎用的なものにしたかったらしく、自前で実装する道を選んでいる。 まずは”Word index”。対象はもちろん英語のみ。”Stop words”はarray_diffで、”Stemming”はおなじみのPorter Stemming Algorithm(PHP5用のクラスがちゃんとある)。”Giving weight to words”で重み付け。TF-IDFは使わず単純にbodyとtitle、tagでそれぞれ重みを変えている。ここで登場するarray_count_valuesという関数は使ったことがなかった。 “Updating the index”で既存のデータを更新。 [...]

Posted in いじる | Leave a comment

symfonyチュートリアル実践【第17~18日目】

17日目 API。フレームワークのチュートリアルにAPIの公開の仕方が載っているとは意外。 init-moduleした後、まずは”HTTP Authentication”。new api/index web serviceで自動生成されたapps/frontend/modules/api/actions/actions.class.phpを全面書き換え。apps/frontend/modules/api/templates/errorSuccess.phpとapps/frontend/modules/api/config/view.ymlを記述して http://askeet/frontend_dev.php/api にアクセス。 Undefined variable: error_code error_messageにも同じエラーが出る。Noteに書いてあるようにforwardの部分を修正してみた。 apps/frontend/modules/api/actions/actions.class.php: //$this->forward(‘api’, ‘error’); return array(‘api’, ‘errorSuccess’); エラーは直ったがHTTP-Authにならず、そのままerrorSuccess.phpが表示されているので意図したとおりに動いていない。errorSuccess.phpのファイルがなければHTTP-Authのユーザ名とパスワードを聞くプロンプトが出るのだが。。 チュートリアルのコメント#2にも同様の問題が発生しているようだがレスはない。SVNのレポジトリにあるソースは相変わらずチュートリアル内とだいぶ違うが解決策は見当たらず。 PEARの中のsymfony/response/sfWebResponse.class.phpでheader()が呼ばれているところで適当にechoしてみたところ、ご丁寧にHTTP-Authのheaderを送った後に200を送っている。マニュアルを見るとheaerは類似のHTTPヘッダは上書きされるらしいので、これが動かない原因と判明。 うーん。これってsymfonyのバグ?仕方ないので放置して次へ。 そういえばフォーラムで質問したのはそのままレスが付かず、放置されている。僕の書き方がまずかったのかもしれない。チュートリアルからリンクされていたフォーラムに質問したが、MLとaskeet.comもあるのでどこに質問するのが一番いいのでしょう?フォーラムよりaskeet.comの方が活発なようだ。そして、askeet.comがチュートリアルでつくっているサイトそのものだということに今ようやく気付いた。気付くの遅すぎ。 18日目 フィルター。サブドメインを使ってtagを指定できる機能をつけましょう、ということだがなぜそんな機能を付ける必要が。。フィルター自体はActionが実行される前に実行されるクラスのことらしい。 ざっと読んで終わり。コメントも1つしかついておらず、だれてきた感がある。

Posted in いじる | Leave a comment

symfonyチュートリアル実践【第14~16日目】

14日目 タグの続き。 “Add tags to a question”でタグを追加するフォームを作るのですが、なんと”Autocomplete”。以前自前で実装した身としてはライブラリでできちゃうとあっさり過ぎて複雑な気持ちです。 “Autocomplete”の項目の最後でyou can try itとありますが、ログインしてからブラウザで/question/***にアクセスするとエラーが出ました。 The route “tag_add” does not exist. “Remote form”のrouting.ymlへの追記を済ませると、動く。Autocompleteに関しては、矢印キーは効かないので使い勝手は微妙。 “Display the tag bubble”ではタグクラウドを生成。特に問題なし。 15日目 続いて”Unit tests”。 PHPUnitではなくSimpleTestを使うようです。SimpleTestのページにPEAR installableなtgzがなかったのですが(tar.gzはあったが”Package “simpletest_1.0.tar.gz” is not valid”となりダメ)Googleで発見した下記のURLから直接ダウンロードできました。 $ wget http://jaist.dl.sourceforge.net/sourceforge/simpletest/simpletest_1.0.0.tgz $ pear install simpletest_1.0.0.tgz SimpleTestの11月時点での最新版である1.0.1alpha3は様々な改善が施されているようですがチュートリアルに従って安定版を使うことにします。 とここまで書いてチュートリアルのNoteに、PHP5.0.5で下位互換性のない変更があってそれ以降のバージョンでsimpletest動かないんだよねー、と書いてあることに気付く。。SimpleTestのページには特に動作環境は書いていないのだが。 $ pear uninstall simpletest-1.0.0 $ wget http://ufpr.dl.sourceforge.net/sourceforge/simpletest/simpletest_1.0.1alpha3.tar.gz $ tar zxvf simpletest_1.0.1alpha3.tar.gz $ mv simpletest [...]

Posted in いじる | Leave a comment

symfonyチュートリアル実践【第12~13日目】

昨日の最後でForumにした質問の方はいくつかリプライがあってバグだよね、ということでGeneralからaskeetのForumに改めて投稿しました。最初からaskeetの方に書けばよかったのかも。 12日目 12日目はメール。 加速するためにざっと読んで飛ばします! パスワードを忘れた方云々をメール送信で実現する方法。書き足すコードはほぼ今までと同じ。リマインダーをリクエストすると、DB内のパスワードをランダムな文字列にUPDATEして、本文に直接パスワードが書かれたメールが送られてくる仕組み。メール送信の部分はちゃんとクラスが用意されていて、addAttachmentメソッドなんかもある。 日本語のメールが送れるのか心配ではある。 13日目 13日目はタグ。14日目と2日に分けて。 タグを導入するときはDB構造(テーブルの設計)をどうするかちょっと悩みます。 Tags: Database schemas deliciousとかオープンソースのソーシャルブックマークのDB構造について書いてあります。正規化してtagを主キーにしたテーブルに分けた方が速いのか、どうか。はてブはどうなってるんでしょう? askeetでは正規化せずに文字列のまま各行に挿入する方法を取っています。normalized_tagという全部小文字にして記号を排除した文字列を入れるカラムも用意しています。 “Schema update”で $ symfony propel-build-model しか書いてありませんが、 $ symfony propel-build-sql $ symfony propel-insert-sql も必要です。 “Add some test data”でload_data.phpを実行すると、 PHP Fatal error: Uncaught exception ‘sfException’ with message ‘The object “q1″ from class “Question” is not defined in your data file.’ in /usr/share/pear/symfony/addon/propel/sfPropelData.class.php:104 が出たのでdata/fixtures/question_tag.ymlに書いていたのをtest_data.ymlの末尾に書き直し、再度 [...]

Posted in いじる | Leave a comment

Wii vs. PS3: digg, technorati, flickr and youtube MASH UP

Wii vs. PS3 (closed) Wii vs. PS3ということで最近流行の2.0系なサイトからその人気度らしきものを計ってみました。 PS3の方は検索クエリに”PlayStation3″が入っていないのですが、これはOR検索がうまくできないサイトが多かったため。PlayStation3の方は案外数が少なかったので無視してもいいかな、と。 思いがけず紹介してくださったサイトが多くてうれしいです。この場を借りてお礼をば。ありがとうございます!Thank you!

Posted in つくる | Leave a comment

symfonyチュートリアル実践【第10~11日目】&Forumに参加

10日目 Ajax続き。 特に問題ないですが”The answer/add action”のところでapps/frontend/config/routing.ymlに記述するコードにスペルミスがあります。コメントの#11で指摘されていました。 AjaxでアクセスするURLなので、最初は気付きませんでした。symfonyと言えども、さすがにAjaxのデバッグまで手厚いサポートがあるわけではない模様。ブラウザで直接アクセスしてみて404だったのでprintデバッグで解決。apps/frontend/modules/answer/actions/actions.class.phpのexecuteAddでecho ‘hello’;して http://askeet/frontend_dev.php/answer/add だとhelloが表示されるが本来の http://askeet/frontend_dev.php/add_answer で表示されなかったのでrouting.ymlがおかしいな、と判断。 prototype.jsには慣れているので時々生成されているHTMLのソースを見たりしてデバッグする感じでした。 11日目 続いてfeedを出力しましょう。 $ symfony plugin-install local symfony/sfFeed で ERROR: symfony – Failed to download symfony/symfony within preferred state “beta”, latest release is version 0.9.2641, stability “alpha”, use “channel://pear.symfony-project.com/symfony-0.9.2641″ to install symfony/sfFeed requires package “symfony/symfony” (version >= 0.8.1, version < = 0.9.99999), installed version [...]

Posted in いじる | Leave a comment

symfonyチュートリアル実践【第8~9日目】

8日目 8日目はAjax。 “Add an indicator in the layout”でまずはNow Loading用の画像を配置。 ずっと回っていると頭が痛くなる。。 ……と、なんと今回は何のエラーもなくあっさり全部うまくいきました! ちょっと迷ったのは”Server action”のexecuteInterestedをどこに定義するのか、でしたがSVNのレポジトリを見てapps/frontend/modules/user/actions/actions.class.phpだと判明。 Ajaxに使われているJavaScriptはprototype.jsの1.5.0rc0です。といっても、JavaScriptのコードは1行も書いていません。すばらしい。 勢いに乗って9日目。 今回は諸々改善しましょう、という話。ここにきて1日辺りの量も減ってきた感じ。 “Allow rich text formatting on questions and answers”でMarkdownという構文でテキストをHTMLに変換しましょう、と。symfonyの開発者はMarkdownのファンらしいですが、僕はPukiWikiの方が慣れているのでチュートリアルに逆らってPukiWikiでやってみることにし、、たかったのですがPukiWikiのlib/convert_html.phpだけでは動かない上にStrict Standardsがどうのこうのとエラーが出るので、やめました。 “Hide all ids”のところはセキュリティを考慮しての修正。またSEO的にも数字のidより文字列、というわけです。 ここも特に問題なし。

Posted in いじる | 2 Comments

PEAR::Benchmark_Timerを使う時はBCMathがあった方がいい

PEARのBenchmark_Timerは手軽にベンチマークを取れて便利です。(サンプル) ただ、結果を出力すると4.1007995605469E-05のように浮動小数点の計算が何やらおかしくなることがありました。 で、ソースを見ると/usr/share/pear/Benchmark/Timer.phpの182行目でif (extension_loaded(‘bcmath’))という部分があってBCMath任意精度数学関数なるものがあることが判明。 マニュアルには PHP 4.0.4以降、libbcmathがPHPに付属しています。このモジュールを使 用するために外部のライブラリを使用する必要はありません。 とあるのでソースからコンパイルすればデフォルトで使えるような感じですが、FedoraCore5に付属するPHP5.1.6はextensionが別になっていました。 # yum install php-bcmath でインストール。これでベンチマーク結果のex timeが小数点第6位までの表示になって見やすくなりました。

Posted in いじる | Leave a comment

symfonyチュートリアル実践【第7日目】

7日目 モデルとビューの取り扱い。 “Previously on symfony”では相変わらず読者の心理を見透かしたように、もう6日もかけたけどこのアプリ使えねーじゃん?と思っていませんか、みたいなことが書かれている。 最初の項目、”Prefactoring”。pre+refactoring?と思って調べたらやはり造語でした。 プレファクタリング(Ken Pugh 著) 「プレファクタリング」(Prefactoring)とは、pre(事前に)+refactoring(リファクタリング)という意味の新造語です。リファクタリングとは、コーディング中にコードの動きを変えずにコードを改善する手法のこと。そして、プレファクタリングは、コーディング前にリファクタリングを行うことで、リファクタリングの効率をさらに上げようというもので、著者のKen Pughが提唱している新しい開発手法です。 コピペして手順を追っているだけなのでプレファクタリングもへったくれもないですが。。 手順は $ mkdir apps/frontend/lib/helper $ vi apps/frontend/lib/helper/GlobalHelper.php でpager_navigationを定義。 ページャに使う画像をSVNのレポジトリからダウンロードしましょう、とあるがリンク先にはファイルがない。ページ下部のコメント#24に正しいリンク先が書いてある。web/images/にダウンロード。 wget -r –level=1 http://svn.askeet.com/trunk/web/images/ どうせ使うだろう、とディレクトリの中身をまとめてダウンロードしてみた。wgetの使い方が稚拙なのでもうちょっとオプションを工夫しないと。。 5日目のチュートリアルの最後でよくわからなかったapps/frontend/modules/question/templates/_list.phpもここで書き換え。 ブラウザでアクセスするとwgetでロゴもダウンロードしたので少し華やかになった。 http://askeet/frontend_dev.php/question/list 続いて”List of the recent questions”ではapps/frontend/modules/question/actions/actions.class.phpに新しいメソッドを追加。 この辺りのデータベースに問い合わせるメソッドはPropelがうまくやってくれているらしいが、深く調べずに先に進むことにする。 apps/frontend/module/question/templates/recentSuccess.phpを作ったりして、チュートリアルのBut wait、のところからは、そのままだとページャのリンク先が/question/list/page/2などのままなのでrecentへの修正。 “List of the recent answers”と”User profile”はどんどん書き換えていくだけ。チュートリアルには絶対パスが端折られているので(まだファイルのパスを覚えきっていないので)find ./ -name hoge.phpで調べつつ。 途中、 http://askeet/frontend_dev.php/question/list で Notice: Undefined variable: rule in /home/funaki/work/sfprojects/askeet/apps/frontend/modules/question/templates/_list.php on [...]

Posted in いじる | Leave a comment