なんか Mephistoの公式サイト 死んでるし、jekyll に変えようかなと思ってるんだけど、 移行ガイド の通りにやってもうまくいかない。
Railsむずい
CakePHPはなんも考えなくてもテキトーにやってたらサイトできてたんだけど、Railsはそんな風にはやらしてもらえない。Railsのサイト作んの自体の効率性が悪い訳ではもちろんないんだけど、レールに乗るためにはそれなりに知っとかなきゃいけないことが多い感じ。『Railsによるアジャイル〜』はいま14章まで読んだ。14章はテストの章だったんだけど、初めてテストに触れた感じ。CakePHP 1.2の公式ガイドにもテストについての章はあったけど、後ろの方でおまけみたいな感じだったから飛ばしちゃってた。たまたま先月の頭に買ってた『WEB + DB Press 56』がRubyでのテストを紹介してて、そこを読みながら14章のコードを写経していったけど、わりと早い段階でテストの重要性が説いてあって、アジャイル本はしっかりしてるわと思った。
たのしいネットストーキング with Ruby
この前大阪で第二回アメ村ブルゾンの会をやったんですけど、そこで日夜ネットストーキングプログラミングにいそしんでおられる皆さんとお会いして、TwitterのStreaming APIの使い方を教えてもらいました。なんか自分でやろうとしてたんだけど、全然見当違いなところを見ていたみたいで、僕もStreaming APIでネットストーキングできるようになりました。pokutunaさんにもらったコードと "Twitter Streaming APIをRubyで試してみる - しばそんノート":http://d.hatena.ne.jp/shibason/20090816/1250405491 を参考に、以下のような感じにしてみました。
#!/usr/bin/env ruby
# coding: utf-8
require 'net/http'
require 'uri'
require 'rubygems'
require 'json'
USERNAME = 'morygonzalez'
PASSWORD = '***'
uri = URI.parse('http://chirpstream.twitter.com/2b/user.json')
begin
Net::HTTP.start(uri.host, uri.port) do |http|
request = Net::HTTP::Get.new(uri.request_uri)
request.basic_auth(USERNAME, PASSWORD)
http.request(request) do |response|
raise 'Response is not chunked' unless response.chunked?
response.read_body do |chunk|
#空行は無視
status = JSON.parse(chunk) rescue next
#eventを含まないものは無視
next unless status['event']
source = status['source']
if status['target_object']
target_obj = status['target_object']
target_user = target_obj['user']
puts "#{status['event']}: #{source['screen_name']} -> #{target_user['screen_name']}: #{target_obj['text']}"
elsif status['target']
target = status['target']
puts "#{status['event']}: #{source['screen_name']} -> #{target['screen_name']}"
end
end
end
end
rescue Timeout::Error => ex
p "<-----!!!! Timeout::Error!!!!----->"
retry
end
教えてもらったコードではTweetの内容を垂れ流しにするやつだったんですけど、自分でちょこっといじってTweet以外のステータスを表示するようにしてみた。しかしなんか調子悪いっぽくて、完全にはStreamを取れてないっぽいです。
でもまぁ一歩前進したことは確か。Rubyがんばるぜ。
DreamHostでRailsアプリケーションを再起動
レンタルサーバーみたいな共有サーバーとか sudo
権限のないサーバーで動かしてるRailsアプリケーションを再起動したくなることがある。でもApacheをリスタートする権限がない。じゃあどうするかとググっていたらこういう記事にたどり着いた。
To restart your rails app do a "ps x" to get the pid of your dispatch.fcgi process(let's say it's 1234) then do a "kill 1234". This will kill the running process and a new one will be automatically spawned and you should now see your changes. How do I restart rails app? - DreamHost Forum
要するに ps x
でRailsアプリケーションのプロセスIDを調べ、 kill #pid
しちゃうというわけ。 kill
できんのかなと半信半疑だったけどちゃんとできた。
他のレンタルサーバーには当てはまらないかもしれないけどメモっときます。
CakePHP 1.2.xのRSSヘルパーはわかりにくい
ちょっと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を選びたい。
MVCのViewにどこまで書くか
『Railsによるアジャイル〜』とかのコードはViewの部分がスゲーシンプルで、ロジックがほとんど書いてない。これに慣れると、CakePHPに戻って自分が作ってるウェブアプリを見たときに、Viewに結構ロジックが書いてあって愕然とする。例えばフラグをたてて条件にマッチすれば日付を表示し、マッチしなければ表示しないとかしたいとするじゃないですか。Controllerでそういう設定できなくないけど長くなる。Viewの中に書いてしまったら数行で済むし。
だから僕の作ってるCakePHPアプリはMVCとか名ばかりでViewのコード超きたない。入れ子になったif文がたくさんあるし、正規表現で日付の書式変更とかまでやってる。さすがに関数とかは定義してないですけどね。
そもそもCake FoundationのCakeBookも結構Viewにロジックが書いてあったりする。というかかなりハードに書いてある。CakePHPってViewとロジックを分離させるのが難しいのかな。
加えて、Controllerも結構ひどいことになってる。本当はModelに書くべきことを結構Controllerに書いている気がしないではない。サイト検索のためのメソッドとか200行近くあるし、joinとかしまくり。
MVCでロジックとヴューを分離することでデザイナーがViewを触れるようになって分業が進むかもとか思ってたけど、到底そんな状況にないですね。
Gitのbranchの使い方
Gitでbranchの効率的な使い方みたいのがよくわからない。
実験的な機能をつけたい
ブランチを分ける(例えば開発用に alternate というブランチを作る)
開発する
開発完了後、 master にマージ
みたいな感じかなと思ってた。
しかし実際に運用してみると、実験的な機能の実装の他に、日常的にmasterでコードの改良みたいな作業があり、alternateで開発が完了した後にmasterにマージしたら多分コンフリクト起こりまくりになるような気がしてきた。
それで日常メンテみたいな作業はmasterブランチで行い、それをalternateにマージするという手順をとってる。正しい開発方法かどうかはわからないけど、一応alternateブランチもmasterの最新の変更を追跡できる。んでalternateではしこしこ開発を続けて、開発完了時にmasterにマージしても多分派手なコンフリクトは起こらないんじゃないかと思ってますがどうなんでしょう。