Rails勉強会やRuby会議でお世話になっている高橋さん、moroさんから献本いただきました。ありがとうございます!

Railsレシピブック 183の技
高橋 征義 諸橋 恭介
ソフトバンククリエイティブ
売り上げランキング: 1238

本書は、Railsを使う上で知っていると非常に役に立つ情報が満載の一冊です。 Rails中・上級者がアプリケーション開発の幅を広げるために、座右の書として傍に置いておくとすれば、本書が最適ではないでしょうか。 Railsをこれから使ってみたい人が、Railsを使うとどんなことが出来るのかということを把握するのにも良いかもしれません。

待望の一冊ですね。

posted by Png genki on Thu 29 May 2008 at 23:45

RailsChatでいつもお世話になっているnorioさんから著書を献本いただきました。 ありがとうございます。ちょっと時間がたってしまいましたが、時間差で紹介します。

Rails of Ruby on Rails ~Case of LOCUSANDWONDERS.COM~
Plan de Sens 清水 智雄
毎日コミュニケーションズ
売り上げランキング: 45174

Rails本は大体読んでいますが、本書はその中でも一際ユニークな一冊だと思います。

  • 本書をひらくと、まずは黒地に白文字という技術書ではあまりお目にかかれないデザインに驚きます。総天然色で、目で見てわかりやすく、全体的にとてもRails Spiritに溢れている感じだと思いました。
  • 具体的なサイトの事例を沢山紹介しているので、Railsを使ったサイト製作の参考になると思います。

Step by Stepに豊富な画面写真を踏まえて説明されているので、 これからRailsを使ってみたい人にお勧めです。

posted by Png genki on Thu 29 May 2008 at 23:35

Zsh用のgit-svnサブコマンド補完関数を書いてみました。

   1  _git-svn () {
   2    `git-svn --help | grep "^  \w" | sed "s/^  //" | sed "s/ .*//" | sed 's/^/ compadd /'`
   3  }
   4  
   5  compdef _git-svn git-svn

git-svn [TAB]でも、git svn [TAB]でも、どちらでも補完できます。

posted by Png genki on Wed 28 May 2008 at 20:33 with 1 comment

EC2onRailsの0.9.8.1を使って、0.9.7時代のAMIイメージに cap deployしようとした場合、なぜか/etc/init.d/以下のいくつかの 起動スクリプトの実行パーミッションが剥奪されてしまい、 デプロイ処理の途中でエラーが起きて中断してしまうようです。

とりあえず対処療法として、Capfileの中で

   1  load 'deploy' if respond_to?(:namespace) # cap2 differentiator
   2  load 'config/deploy'
   3  gem 'ec2onrails', '=0.9.7'
   4  require 'ec2onrails/recipes' 

のように0.9.7を明示的に指定するようにして回避しています。 本家筋のAMIイメージへの変更をマージしていく必要がありそうですね。

posted by Png genki on Tue 27 May 2008 at 11:38

公開鍵を登録してもpush出来ない問題でしばらく放置していたのですが、 Tom Copeland氏のサポート のお陰で原因と解決方法がわかったので まとめておきます。

  1. Dr. Nicのチュートリアルの通りにやる
  2. ただし、公開鍵の登録時には、公開鍵の末尾のコメント部分("=="の後ですね)に、メールアドレスなどのユニークな識別子を書いておく必要がある。

あとは、

   1  % git remote add rubyforge gitosis@rubyforge.org:<project-name>

GitHubと両方登録しておいたら良いと思います。 Let's add remote rubyforge!

See Also

posted by Png genki on Thu 22 May 2008 at 19:21

本家のフォーラム Thread: ec2-bundle-vol fails にも上がっていますが、EC2のイメージを作成する時にrsync関連の 警告が出ることがあるようです。

NOTE: rsync with preservation of extended file attributes failed. Retrying rsync without attempting to preserve extended file attributes... NOTE: rsync seemed successful but exited with error code 23. This probably means that your version of rsync was built against a kernel with HAVE_LUTIMES defined, although the current kernel was not built with this option enabled. The bundling process will thus ignore the error and continue bundling. If bundling completes successfully, your image should be perfectly usable. We, however, recommend that you install a version of rsync that handles this situation more elegantly.

警告は出るものの、イメージ自体は作成されている模様。

posted by Png genki on Thu 22 May 2008 at 10:45

なかなか実装する時間がなくて困ってるアイディアのメモ。

NATに近い。

P1000164.JPG

SpaceguardはLAN内のどこかのPCにインストールされるローカルCometサーバ。 SATT(Spaceguard Address Translation Table)はSpaceguardを見つけ出すためのテーブル。

Spaceguardはグローバルから見える場所に設置することもできる。

ブラウザ(=クライアント)は、最寄のSpaceguardか、見つからなければ直接従来のCometの仕組みに従ってCometサーバとXmlSocket(単にSocketでもいいけど)で接続する。 優先順位は、ローカルSpaceguard、グローバルSpaceguard、Cometサーバの順。 Firewallがあるような環境では、ローカルSpaceguardの設置を必須とすることも考えられる。

メリット

  • Spaceguardをイベント通知のMUX/DMUXとして中継させることで、 無駄な接続数を減らせる
  • 一般にLAN内ではHTTP以外の通信ができると思われるので、 ローカルSpaceguard⇔FlushクライアントによるXmlSocket/Socket通信を前提とすることができ、 Cometクライアントの実装を簡素化できるかも
posted by Png genki on Thu 22 May 2008 at 00:45

EC2onRailsを使って、既存のRailsアプリをEC2上で動くようにするための手順のメモです。 EC2onRailsを複数アプリ対応にする方法のメモ を適用した状態を想定しています。

  1. config/deploy.rb を用意 (サンプルファイルはこちら:server_config_files_rootを適当に設定し、指定したPATHにディレクトリを作る。
  2. Capfileを以下のような感じで用意。
       1  load 'deploy' if respond_to?(:namespace) # cap2 differentiator
       2  load 'config/deploy'
       3  require 'ec2onrails/recipes'
       4  
       5  set :deploy_to, "/mnt/app/<app_name>"
       6  
       7  # override default start/stop/restart tasks
       8  namespace :deploy do
       9    desc <<-"DESC"
      10      Overrides the default Capistrano deploy:start, directly calls \
      11      /etc/init.d/mongrel #{application}
      12    DESC
      13    task :start, :roles => :app do
      14      run "/etc/init.d/mongrel start #{application}"
      15    end
      16  
      17    desc <<-"DESC"
      18      Overrides the default Capistrano deploy:stop, directly calls \
      19      /etc/init.d/mongrel #{application}
      20    DESC
      21    task :stop, :roles => :app do
      22      run "/etc/init.d/mongrel stop #{application}"
      23    end
      24  
      25    desc <<-"DESC"
      26      Overrides the default Capistrano deploy:restart, directly calls \
      27      /etc/init.d/mongrel #{application}
      28    DESC
      29    task :restart, :roles => :app do
      30      run "/etc/init.d/mongrel restart #{application}"
      31    end
      32  end
    
    EC2onRailsが上書きしたデフォルトのタスクをさらに上書きして、複数アプリ対応できるようにしています。  3. 最後に、mongrel_clusterを使うので、config/mongrel_cluster.yml ファイルを用意します。
       1  ---
       2  cwd: /mnt/app/<app_name>/current
       3  port: 8000
       4  environment: production
       5  pid_file: log/mongrel.pid
       6  servers: 3
    
    ポート番号はサーバをシェアするアプリ間で適当に割り振ります。

あとは、以下のコマンドを実行してデプロイします。

   1  cap ec2onrails:setup
   2  cap deploy:cold

最後に、EC2onRailsを複数アプリ対応にする方法のメモに書いてあるような、EC2上のApacheのVirtualHostの設定と、ProxyBalancerの設定を行います。

posted by Png genki on Wed 21 May 2008 at 18:27

自前のSVNリポジトリで開発しつつ、 適宜必要に応じてRubyforgeやGitHubのリポジトリにPushする方法のメモです。

まずは以下のコマンドでremoteを追加します。

   1  % git remote add rubyforge gitosis@rubyforge.org:openid-fu.git

addの第一パラメータのrubyforgeというのは適当につけた名前です。 あとは、pushするだけです。

   1  % git push rubyforge master

Rubyforgeにpushするためには、 事前に公開鍵を登録しておく必要があります(See Also#2参照)

それから こちら でも報告されていますが、 Rubyforgeに登録する公開鍵の末尾のコメントに、メールアドレスなどの ユニークな文字列を指定する必要があるようです。

See Also

posted by Png genki on Sun 18 May 2008 at 05:47

既存のSVNリポジトリを使いつつ、ローカルではGitの利便性を享受するために、 git-svnを使う方法のメモです。以下はopenid-fuのリポジトリを使った例です。

  1. まずは普通にSVNリポジトリにファイルをimportしておきます。既存のものがある場合はそれを使います。
  2. git-svnでリポジトリをcloneします。
       1  % git svn clone https://svn.s21g.com/public/openid-fu/ openid-fu
    
    これでopenid-fu/にクローンされました。
  3. ファイルの変更などをSVNにコミットする場合は、 普通にGitを使うように、git addでGit管理下に置き、git commitします。 そのあと、
       1  % git svn dcommit
    
    すると、SVNにコミットされます。
  4. SVN上の変更は、git svn rebaseする事でローカルに反映されます。 svn upに相当する感じですね。

追記

SVN::Core.pmがない、などといわれる場合は、libsvn-perlを 入れる必要があるようです。

posted by Png genki on Sun 18 May 2008 at 05:26