| @技術/プログラミング

ちょっとCakePHPで作ってるサイトでRSSフィードを配信したいと思ったのでやってみたんだけど、思いの外面倒くさくてびっくりした。『RailsによるアジャイルWebアプリケーション開発』を読みながらRails 2.3.5でRSSフィード作るときは結構簡単だった気がするので、正直これはないわと思った。

『Railsによる〜』で作ってるデモプロジェクトのdpeotのコードを見てみると、RSSを配信するときはControllerに以下のように記述し、

respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @products }
end

config/routes.rb

map.connect ':controller/:action/:id.:format'

と書いたあと、RSS用のViewを用意してやるだけだ。ものすごくシンプルで簡単だった。

CakePHPで同じことをやるためには以下の手順が必要。

ちょっと面倒くさすぎてやる気にならなかった。どうせいま僕が作ってるサイトなんてRSSリーダー使うような人が見るサイトじゃないし、フィード配信機能の実装はそんなにプライオリティ高くないので他にやることがなくてどうしようもなく暇なときにでもやろう。

Railsは最初のとっかかりのハードルは高いけど、使い方を覚えていったらやっぱりCakePHPとかよりも全然簡単かつ高速に開発できる気がする。レールに乗ってる感強い。このMephistoの設置もすごく楽だった。ただTerminalを使い慣れた人や、サーバーにSSHでアクセスできる環境じゃないとRailsアプリケーションを使うのは難しい。CakePHPは反面、全部FTPでアップロードすれば良いのでサーバーに標準的な構成でPHPがインストールされてりゃ環境構築でつまずくことはない。どっちをとるかって話ですよね。

僕はファッションの観点からRailsを選びたい。

| @技術/プログラミング

『Railsによるアジャイル〜』とかのコードはViewの部分がスゲーシンプルで、ロジックがほとんど書いてない。これに慣れると、CakePHPに戻って自分が作ってるウェブアプリを見たときに、Viewに結構ロジックが書いてあって愕然とする。例えばフラグをたてて条件にマッチすれば日付を表示し、マッチしなければ表示しないとかしたいとするじゃないですか。Controllerでそういう設定できなくないけど長くなる。Viewの中に書いてしまったら数行で済むし。

だから僕の作ってるCakePHPアプリはMVCとか名ばかりでViewのコード超きたない。入れ子になったif文がたくさんあるし、正規表現で日付の書式変更とかまでやってる。さすがに関数とかは定義してないですけどね。

そもそもCake FoundationのCakeBookも結構Viewにロジックが書いてあったりする。というかかなりハードに書いてある。CakePHPってViewとロジックを分離させるのが難しいのかな。

加えて、Controllerも結構ひどいことになってる。本当はModelに書くべきことを結構Controllerに書いている気がしないではない。サイト検索のためのメソッドとか200行近くあるし、joinとかしまくり。

MVCでロジックとヴューを分離することでデザイナーがViewを触れるようになって分業が進むかもとか思ってたけど、到底そんな状況にないですね。

| @技術/プログラミング

CakePHP 1.3のStableがリリース された。 JavascriptヘルパーとかAjaxヘルパーが非推奨になってる 。かわりにHtmlヘルパーのjsメソッドを使うらしい。 $html->js('') みたいな感じかな。で、Ajax系の処理はjQueryがデフォルトのライブラリになったらしい。Rails 3.0もprotorype.jsに別れを告げたらしいし、自分がJavaScriptのライブラリで遊び始めた頃はjQueryが全盛だったのでいまからprototype.jsの使い方勉強するのかったるかったし、jQuery簡単だしこの進化は大歓迎です。

JavascriptヘルパーとAjaxヘルパーが非推奨になった件については、わざわざ別のヘルパーにせんでもいいよなー、という印象は確かに持ってた。Htmlをいじるメソッドは一つのヘルパークラスにまとめてしまった方がすっきりする。1.2.xのときはAjaxヘルパーが使いづらすぎて結局jQueryでAjaxすることもあったし、あまり存在意義を見いだせなかったので良かったんじゃないでしょうか。

でも既存のプロジェクトの1.3への移行はめんどくさそうなのでたぶんやんない気がする。新しくCakePHPでなんか作るときは使ってみようと思います。

| @技術/プログラミング

なんかTwitterで「最近のポータルシット変わったよね…」とかいう意見を目にするようになったので、パソコンネタだけ隔離して別にブログを始めることにした。使っているCMSはMephisto。Railsの勉強になるかと思って。早速DreamhostへMephistoをインストールしていて躓いてしまったのでちょこっとメモ。

とりあえず tech.portalshit.net というサブドメインを用意し、DreamhostのパネルでPassengerのセットアップ。その後SSHでサーバーに接続し、

$ git clone git://github.com/emk/mephisto.git
``

してgithubからプロジェクトをclone。

Mephistoのインストールにはいくつかgemが必要。Dreamhostには結構たくさんgemがインストールしてあるんだけど、いくつか足りないものがあった。とりあえず設置ディレクトリのルートで

```sh
$ rake gems:install

と打ってみたところ、nokogiriとそれに依存するbrynary-webratが入らなかった。原因を調べてみたところ、xsltのライブラリをダウンロードして、gem install するときにパスを指定してあげる必要があるらしい。xsltのライブラリ自体はPHP5をカスタムインストールしたときに入れてあるので、以下のオプションでインストールした。

$ gem install nokogiri \n    --with-xslt-include=/home/morygonzalez/php5/include/ \n    --with-xslt-lib=/home/morygonzalez/php5/lib/

無事インストール成功。その後もう一回 rake gems:install を実行してbrynary-webratも入り、管理ページにアクセスしてみると今度はPassengerのエラーが。これは単純にdatabase.ymlに development: のDB環境しか記述していなかったこと、 rake db:bootstrap のときに RAILS_ENV=production をつけていなかったことが原因だった。そういうわけでdatabase.ymlに production: の設定(sqlite3を使用)を書き、

$ rake db:bootstrap RAILS_ENV=production

ですべてのインストール作業完了。いまこうして動いております。

今後はここにCakePHPやRails、JavaScript関連のことを書いていこうと思います。できれば一日一ポスト、その日に学んだことを書いていきたいです。

| @技術/プログラミング

MephistoでGoogle Analytics使おうと思ってググったら Ruby on Rails Plugin: Google Analytics (blue egg edition) - artweb design というのが出てきたので、早速インストールしてみたんだけど動いていないっぽい。

Mephistoは「rails blog」でググって一番上に出てきたので深く考えもせずにインストールしてしまったんだけど、一年近くバージョンアップされてないし、いまはあんまり活発に開発が行われてるわけじゃないっぽいな。

追記

一晩寝て起きたら動いてた。

| @技術/プログラミング

『RailsによるアジャイルWebアプリケーション開発 第3版』を読んでいます。第10章まで終わったところです。

(Railsに大きく影響を受けている)CakePHPをやったから、Railsをまっさらな状態から学ぶよりも理解は速いだろうと思っていましたが、そうでもない感じです。なかなか苦戦してます。

一言でいうと、RailsはCakePHPとかなり違う。Cakeは Model->Controller->View の流れというか構造がすっきりしてた。例えば posts というテーブルがあれば、Post ModelがあってPostsController があり、ViewにはControllerのメソッドに対応するものがあるという感じです。

しかし『Railsによるアジャイル…』では平気で同名のテーブルをDBに持たないModelやControllerがあったりする。こういうのが混乱します。CakePHPではDB使わないときはわざわざModelに

<?php
class Hoge extends AppModel {
    var $useTable = false;
}
?>

やControllerに

<?php
class HogesController extends AppController {
    var $uses = array();
}
?>

とか書いてあげなきゃいけないのに。

ほかにも基本的にCakePHPではModelのなかでControllerから参照するメソッドを定義したりはしなかったんだけど、Railsではそういうやり方が多い。ModelはDBとのやりとりを定義するためだけの場所ではないっぽいです。逆になんで全部Controllerでメソッドを定義しないのか分からない。率直に言うと気持ち悪かったりします。全部Controllerに書いて、ModelではValidationとかだけやるようにした方がすっきりして見通しが良いと思うんだけどなぁ。

とここまで書いて気がついたんだけど、ModelでもActiveRecordを継承しないやつがあるわけか。よくコードの一行目を読むと、

class Cart

なやつと、

class Order < ActiveRecord::Base

なやつがある。なるほどそういうことだったのか。

こんな感じで前途多難ですが、Railsが出来るっていうとやっぱなんとなくかっこいいので頑張ろうと思います。

| @技術/プログラミング

結局CakePHPを触ってます。Railsはサーバー側の準備するのが無理っぽかったのであきらめました。CakePHPはPHP 4だろうがPHP 5だろうが、普通にサーバーにPHPがインストールされていれば、とりあえずファイルを落としてきて自分の開発機でBake(あるいは開発)し、ちょこちょこ設定をしてサーバーにアップロードするだけで(DBの準備とかは別に必要だけど)CMSが出来上がるのですごく良いと思いました。MySQLでもSQLiteでもPostgreSQLでも、DBに何を使おうとも記述内容は変わらないところとかすごく良いと思います。

オブジェクト指向の醍醐味みたいのはアホなので僕にはあまり分かりません。CakePHPを始める前に『たのしいRuby』を途中まで読んでたんですけど、僕はそれまでPHPとC言語をほんの少しだけ触っていて、そのとき感じた「なんかこれまで触ってきた言語と全然発想が違うなー」という驚きのようなものは感じられなかったです。ただCakePHPのMVCの考え方はRailsそのまんまみたいなのでRailsを勉強する足がかりにはなるかなと思いました。

最初はCakePHPの公式ガイドみたいのをチラ読みしてたんですけど、こういうのは本で持ってた方が使いやすいので『CakePHP1.2ガイドブック』を買いました。まだChapter 7までしか読んでないんだけど、誤植や記述の間違いが多くて困る。わりと最初の、「とりあえずBakeしてみよう」みたいなところで間違いがあるので、根気強くない人は本に書いてあるとおりにBakeできないことに絶望してCakePHP使わなくなるんじゃないかな。僕は公式フォーラムを読んだので間違いに気づきましたけど。“CakePHP1.2でモデルのアソシエーションの設定がビューに反映されない” フォーラム - CakePHP Users in Japan

CakePHP1.2ガイドブック、悪い本じゃないと思うんだけど、1.3対応版とかでは単純な誤植とか記述場所の間違いとかで読者を混乱させないようにして欲しいです。