Passengerは非常に便利なのですが、 通常の設定では、アプリケーションへのアクセスが無い状態が5分程度続くと、プロセスがkillされてしまい、次回にアクセスする時に時間がかかるようになります。

これを回避するためには、httpd.confなどで、以下のように指定します。

   1  PassengerPoolIdleTime 0

これで、プロセス数の限界に達して追い出されるまで、Idle時間によってkillされる事は無くなります。

See Also

posted by Png genki on Sat 28 Mar 2009 at 20:36

待っていたものが登場したようです。

Rails Searchable API Doc

ss

上記は Rails-2.3.2のSearchable API Docです。 RailsのAPIを、class, method等を横断してLive Searchできるようです。

MerbのAPIドキュメント と比べても、勝るとも劣らない仕上がりですね。 オフライン状態でも使えるようにダウンロードできるバージョンも用意されている模様。

posted by Png genki on Sat 28 Mar 2009 at 18:23

ローカライゼーションの問題で再びRejectされたので、再度アップデート申請いたしました。

審査結果がでるまで、おそらくもう一週間ほどかかる見通しです。

お待たせして申し訳ありません。

posted by Png genki on Sat 28 Mar 2009 at 08:01

Reserved Instanceを使ってみるために、ec2-api-toolsをアップデートしてみました。

   1  % wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip
   2  % unzip ec2-api-tools.zip

/usr/local/ec2-api-toolsあたりに移動させて、 環境変数EC2_HOMEを設定します。

Reserved Instanceを使う場合、最初に、自分が使いたいインスタンスが提供されているかどうか、以下のようにして調べます。

   1  % ec2drio -z us-east-1b -t m1.small
   2  OFFERING	3a98bf7d-96c3-4d2f-a263-123fa6b46d61	us-east-1b	m1.smal3y 	500.0	0.03	Linux/UNIX
   3  OFFERING	60dcfab3-a56c-4092-8c90-3677e9da02b7	us-east-1b	m1.smal1y 	325.0	0.03	Linux/UNIX

ゾーンとタイプを指定しています。

2カラム目にあるUUID風の文字列がoffering IDなので、これを覚えておきます。

続いて、実際にReserved Instanceを購入します。

   1  % ec2prio -c 1 -o 60dcfab3-a56c-4092-8c90-3677e9da02b7

-cで台数、-oで先ほどのoffering IDを指定します。 これで購入完了です。

   1  % ec2dri
   2  RESERVEDINSTANCES	(*****)	us-east-1b	m1.small	Linux/UNIX	1y 	0.03	325.0	1	2009-03-27T06:51:18+000payment-pending

しばらくすると(この記事を執筆時点では結構待ちました)、payment-pendingがactiveになります。

あとは、us-east-1bで、通常通りにm1.smallのインスタンスを起動すれば、 自動的にReserved Instanceの料金プランが適用されるようです。

See Also

posted by Png genki on Fri 27 Mar 2009 at 16:03

このアプリは初めて企画したiPhoneアプリです。ezPhotoMailの方が後に作ったのですが、DBへのアクセスの勉強や、デザインの調整など色々しているうちに、リリースが遅くなってしまいました...なので思い出深い製品です!

今回はデザインを美術部さんにお願いしました。アイコンから、ボタンから背景までピンクなので、このhappy lovely pinkで日々の面倒な買い物リスト作りが楽しく思えたら幸いです!また、美術部さんのサイトでは素材提供も考えておられるとのこと、ぜひ定期的にチェックをお願いします!


Icon_ShoppingPink.png Shopping Pink

シンプルなインターフェースで買い物リストが作成できます。ピンクを背景だけでなくアイコン・ボタンにも用いており、かわいらしさが特徴です。

iTunes URL:
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=307045581&mt=8

特徴

  • ピンクをテーマに背景を4つ用意
  • 1タップで背景を変更することが可能
  • シンプルな入力インターフェース
  • 買い物アイテムの再利用が可能:History

ShoppingPink_UI1_60%.png ShoppingPink_UI2_60%.png

Shopping Pink URL: http://www.s21g.com/ShoppingPink.html

posted by Png satoko on Fri 27 Mar 2009 at 13:23

methoparaに触発されてDIコンテナを作成してみました。コンストラクタインジェクションとプロパティインジェクションをサポートしています。

   1  require 'object_injection'
   2  
   3  class Juicer
   4    attr_reader :fruit
   5  
   6    def initialize fruit
   7      @fruit = fruit
   8    end
   9  end
  10  
  11  class Fruit
  12  end
  13  
  14  container = ObjectInjection::Container.new
  15  container.add Juicer
  16  container.add Fruit
  17  
  18  juicer = container.get :Juicer
  19  p juicer.fruit # => #<Fruit:0x00000001059aa0>

詳細は、 http://github.com/takai/object_injection/ をどうぞ。

posted by Png takai on Thu 26 Mar 2009 at 10:59

iPhone appのバージョンアップを申請後、時期verを開発継続している際にrejectされた、という場面があったので、タグ・ブランチでの運用を始めました:ezPhotoMail2度目のrejectを食らってしまいました orz

rails@githubの場合:命名

ブランチ:バージョン+stable/unstableの形
http://github.com/rails/rails/tree/2-3-stable

タグ:タグ名はvが入っている形
http://github.com/rails/rails/tree/v2.3.2.1

railsを参考にezPhotoMailでの運用を決めました、下記。

ezPhotoMailでの運用:命名

appリリース後、新しいバージョンをリリースする場合はタグを付けます:タグは後付けも可能。 ブランチ名にはタグ名のvがない、数字だけのものを採用することにしました。

ex

  • タグ名:v1.1
  • ブランチ名:1.1

タグ名とブランチ名を同じにするとcheckoutやshowなどでrefspec(refs/heads/1.1, refs/tags/v1.1などの形式)を挙げねばならず運用が面倒。

ezPhotoMailでの運用:rejectされた

  • タグ名のvを取ったブランチがあるか確認、なければブランチを作成して修正
       1  git branch -r
       2  git checkout -b 1.1 refs/tags/v1.1 #1.1ブランチを作成してcheckout
       3  git push origin HEAD:refs/heads/v1.1 #HEADはカレントブランチ。refs/heads/v1.1はサーバ上のブランチ名
    
  • ブランチがあれば、checkoutして修正
  • Info.plistのversionの末端を+1する:1.1→1.1.1
  • 申請用のzip作成:appName_1.1.1.zip
  • add, commit・push
  • (各ブランチを最新にして)1.1ブランチをmasterブランチにマージ
       1  git checkout 1.1
       2  git pull --rebase origin v1.1:1.1 #v1.1=サーバブランチ
       3  git checkout master
       4  git pull --rebase origin master #サーバでもローカルでも同じ名前master
       5  git merge 1.1 #masterに1.1をマージ
    
  • 申請作業

ezPhotoMailでの運用:申請が通った

ブランチのInfo.plist内のバージョンを確認して、タグを作成。

posted by Png satoko on Wed 25 Mar 2009 at 12:01

Rails-2.2以前とはちょっとやり方が変わったようなので、メモしておきます。 いままでは、:session_domainを指定すれば良かったのですが、 Rails2.3では、以下のように:domainを指定するようになったようです。

   1  config.action_controller.session = {
   2    :session_key => 'session_key',
   3    :domain => 'foo.com'
   4  }

See Also

posted by Png genki on Wed 25 Mar 2009 at 07:39

まだPokéDia-1.3のアップデート審査が通っていないのですが、 次期バージョンで実装予定のデータバックアップ・リストアについて、 実装方法を考えてみます。

データをバックアップする方法として最初に考えた方法は、 指定したメールアドレスにデータファイルを添付して送信するというものだったのですが、この場合、データをリストアするフローが以下のように面倒になってしまいます。

  1. メールの中の添付ファイルをダウンロード
  2. 添付されたデータファイルをどこかにアップロード
  3. データファイルをpokedia://restore?url={url to data file}でPokéDiaにダウンロードしてリストア

次に考えた方法は、バックアップデータファイルをアップロードするアップローダサービス(例えば backup.s21g.com)を用意して、

  1. PokéDiaからbackup.s21g.comに直接HTTP POSTでデータファイルをアップロード(メールアドレスをキーにする)すると、リストアURL(pokedia://restore?url={url to data file})を含んだメールがキーとして指定されたメールアドレスに届く。
  2. 届いたメールの中のリストアURLをタップすればリストア完了。

という流れです。今の所これが良さそうかな。 汎用的なサービスになりそうなので、http://appli.st で提供する方が良いかもしれないですね。

posted by Png genki on Sun 22 Mar 2009 at 15:41

会社設立以来ほとんど更新していなかったのですが、 iPhoneアプリ等の開発で製品を紹介するページを置く場所が必要になったので、 Rails-2.3.2がリリースされた事もあり、I18nを使って国際化仕様のサイトを作りました。

http://ja.www.s21g.com/ 日本語 ss1

http://en.www.s21g.com/ 英語 ss2

従来通り、http://www.s21g.com/にアクセスすると、ブラウザの設定に従って、自動的に日本語か英語のサイトに振り分けられます。 localizationファイルをもっと用意すれば、ISOで定義されてる言語なら何語でも大丈夫なのですが、とりあえずはjaとenのみサポートです。

I18nの使い方

ローカライズファイルは、デフォルトではconfig/locales/*.ymlに配置します。 mutohさんの、 localelocale_rails を使うと色々と便利です。 EdgeバージョンはRails-2.3.2でも利用出来ました。

自動的にロケールを判別するために、以下のようなコードを ApplicationControllerに書きました。

   1  class ApplicationController < ActionController::Base
   2    before_filter :set_locale
   3  
   4    (..snip..)
   5  
   6    def set_locale
   7      I18n.locale = @original_locale = fallback_locale(I18n.locale)
   8      if request.host =~ /^([\w-]+)\.#{HOST.split(':')[0]}/i
   9        I18n.locale = fallback_locale($1)
  10      end
  11    end
  12  
  13  private
  14    def fallback_locale(locale)
  15      locale = locale.to_s
  16      @available_locales ||= Set.new(I18n.available_locales)
  17      until locale.empty? || @available_locales.include?(locale.intern)
  18        locale = locale.split(/([-_])/)[0..-3].join
  19      end
  20      locale.present? ? locale.intern : I18n.default_locale
  21    end

実際にローカライズする手順は、以下のような感じになります。

文字列のローカライズ

*.ymlファイルで定義されているメッセージキーに対して、

   1  ja:
   2    "hello": "こんにちわ"

こんな感じにt(...)ヘルパーメソッドを使います。

   1    t("hello") #=> "こんにちわ"

時刻などのローカライズ

時刻の場合もほぼ同様で、以下のような*.ymlファイルで定義されている設定に対応して、

   1  ja:
   2    date:
   3      formats:
   4        default: "%Y/%m/%d"
   5        short: "%m/%d"
   6        long: "%Y年%m月%d日(%a)"

以下のようにl(...)ヘルパーメソッドを使ってローカライズします。

   1  l(Date.today, :format => :short) #=> "03/22"

テンプレートのローカライズ

Viewテンプレートを丸ごとローカライズする場合は、

  • top/index.ja.html.erb
  • top/index.en.html.erb

のようなファイル名すればOKです。

posted by Png genki on Sun 22 Mar 2009 at 10:04