« 前のエントリー | main | 次のエントリー »

30min. iPhoneアプリリリース (2008年08月18日)

How do you like them apples?

遂に30min.のiPhoneアプリをリリース!

「30min. ランチ検索」という名前で、
ナビゲーションのジャンルからダウロードできる。
iTunesでのダウンロードはこちらから





iPhone 3Gの発売前から準備をしていたのだが、
諸々の手続き等に時間がかかってしまい、
やっとのことでリリースに漕ぎ着けた。

8月18日現在の状況だが、無料アプリのトップ50にランクイン中。
早いタイミングでリリースすることに注力して、
相当の苦労があっただけに、嬉しさも大きい。

肝心のアプリの内容はというと、
アプリを起動するだけでGPSから位置情報を取得して、
現在位置から近い順に店舗を探すことができるのと、
近隣の最新ブログ記事を読むことができるアプリだ。

Safariのレンダリングエンジンを使っているので、
ユーザーのブログページに飛んでブログの内容を読むことができる。

現在は東京、神奈川のみのデータのサービスだが、
サービスエリアを順次拡大していくので、
他のエリアの方々も期待して待っていて欲しい。


話は変わるが、先日、30min.に掲載させていただいている、
ハンバーガーストリートのY.Mさんがオフィスに来ていただいて、
雑誌「HAMBURGER STREET」の創刊準備号をいただきました。

残念ながら私が不在の時で直接お話はできなかったのだが、
普通にハンバーガーを紹介している雑誌とは一味違い、
全国のハンバーガー店店主へのインタビューを
メインに構成されているだけでなく、
自費出版とのことで、ハンバーガーへの情熱に頭が下がる思いだ。

書店での販売はせず、全国のハンバーガーショップ/アメリカンダイナー50店での
店頭販売になるとのこと。

詳しくはハンバーガーストリートのお知らせ記事へ。


Rails + PostGIS (2008年08月15日)


夏休みに入り、30min.の運営スタッフの作業が止まるので、
その間に新しいサーバーへのデータ移行を進めている。

フレームワークとしてRuby on Railsを使用していること以前書いたと思うが、
具体的にはmongrel_clusterを使用して開発環境、本番環境の2つのRailsを動作させ、
Apache2のバーチャルホストとProxy Balancerで、
開発環境用のドメインと本番環境用のドメインで別々のRailsに振り分けており、
データベースは、位置情報データを効率よく扱うため、
PostgreSQLとその拡張ソフトのPostGISを使用している。

個別の設定については色々なサイトで紹介されているが、
まとめて紹介されているページが見当たらなかったので紹介しておこう。
(OSはCentOS 5.2を使用)

まずはPostgreSQLのインストール。
# su -
# adduser postgres
# mkdir /usr/local/pgsql
# chown postgres.postgres /usr/local/pgsql
# su - postgres
$ cd /WORKDIR
$ tar xfvz postgresql-***.tar.gz
$ cd postgresql-***
$ ./configure
$ make
$ make install

PATHを通すために /etc/bashrc に次の設定を加える。

# postgres
PG=/usr/local/pgsql
PATH="$PATH":$PG/bin
export MANPATH="$MANPATH":$PG/man
export PGLIB=$PB/lib
export PGDATA=$PG/data

続いてデータベースの初期化
# su - postgres
$ initdb --encoding=UTF-8 --no-locale

起動スクリプトの設定。
# cp /WORKDIR/postgresql-***/contrib/start-scripts/linux /etc/rc.d/init.d/postgres
# chmod 755 /etc/rc.d/init.d/postgres
# chkconfig --add postgres

次にproj.4ライブラリのインストール。
# cd /WORKDIR
# tar xfvz proj-***.tar.gz
# cd proj-***
# ./configure
# make
# make install

/etc/ld.so.conf.d/以下にproj4.confを作成して次の一行を記載。
/usr/local/lib

ldconfigの実行。
# ldconfig

GEOSのインストール。
# cd /WORKDIR
# tar xfvj geos-***.tar.bz2
# cd geos-***
# ./configure
# make
# make install

/etc/ld.so.conf.d/以下にgeos.confを作成して次の一行を記載。
/usr/local/bin

ldconfigの実行。
# ldconfig

PostGISのインストール。
# su - postgres
$ cd /WORKDIR
$ tar xfvz postgis-***.tar.gz
$ cd postgis-***
$ ./configure
$ make
$ make install

PostgreSQLを起動して設定を追加する。
# /etc/rc.d/init.d/postgres start
# su - postgres
$ createlang plpgsql template1
$ psql -d template1 -f /usr/local/pgsql/share/lwpostgis.sql
$ psql -d template1 -f /usr/local/pgsql/share/spatial_ref_sys.sql

ここまででデータベース関連の設定は完了だ。
続いてWebサーバー関連の設定。

Apache2のインストール。
# cd /WORKDIR
# tar xfvz httpd-***.tar.gz
# cd httpd-***/srclib/apr
# ./configure
# make
# make install
# cd ../apr-util
# ./configure --with-apr=/usr/local/apr
# make
# make install
# cd ../../
# ./configure --enable-so --enable-ssl --enable-rewrite --enable-proxy --enable-proxy-balancer
# make
# make install

起動スクリプトの設定。
# cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/apache

/etc/rc.d/init.d/apacheの最初にchkconfig用の設定を追加。
# chkconfig: 2345 99 01
# description: Apache2

chkconfigの実行。
# chkconfig --add apache

続いてrubyのインストール。
# cd /WORKDIR
# tar xfvz ruby-***.tar.gz
# cd ruby-***
# ./configure
# make
# make install

念の為/usr/binでもPATHが通るようにしておく。
# ln -s /usr/local/bin/ruby /usr/bin/ruby

RubyGemsのインストール。
# cd /WORKDIR
# tar xfvz rubygems-***.tar.gz
# cd rubygems-***
# ruby setup.rb

Rails、gettext(日本語のメール送信用に)、mongrel、mongrel_clusterのインストール。
# gem install rails --remote --include-dependencies
# gem install gettext --remote --include-dependencies
# gem install mongrel --remote --include-dependencies
# gem install mongrel_cluster --remote --include-dependencies

Postgres用のアダプタをインストール。
# gem install postgres-pr --remote --include-dependencies

位置情報を扱うためのGeoRubyのインストール。
# gem install GeoRuby --remote --include-dependencies

SpatialAdapterをインストールするのにSubversionが必要なので、
まずはSubversionをインストール。
# cd /WORKDIR
# tar xfvz subversion-***.tar.gz
# cd subversion-***
# ./configure --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr
# make
# make install

/usr/local/apache2/conf/httpd.confにSubversionの設定が追加されるので、
必要ない場合はコメントアウト。
#LoadModule dav_svn_module     modules/mod_dav_svn.so
#LoadModule authz_svn_module   modules/mod_authz_svn.so

Railsの設定。開発環境を/APPROOT/devとし、本番環境を/APPROOT/productとし、
Apache2、mongrelのユーザーをwwwとした場合。

まずはmongrel_clusterの自動起動の設定。
# cp /usr/local/lib/ruby/gems/***/gems/mongrel_cluster-***/resources/mongrel_cluster \
/etc/rc.d/init.d/mongrel_cluster # chmod 755 /etc/rc.d/init.d/mongrel_cluster

/etc/rc.d/init.d/mongrel_clusterを修正。
まずはchkconfigの設定を追加。
#chkconfig: 2345 85 15

ユーザー名を設定。
USER=www

/usr/local/binだとPATHが通らない可能性があるので、
PATHのチェックを外す。
# which mongrel_cluster_ctl >/dev/null || exit 0

同様の理由でmongrel_cluster_ctlの箇所を変更。
/usr/local/bin/mongrel_cluster_ctl

chkconfigを実行。
# chkconfig --add mongrel_cluster

設定ファイル用のディレクトリを作成。
# mkdir /etc/mongrel_cluster
# mkdir /var/run/mongrel_cluster
# chown www.www /var/run/mongrel_cluster

Railsの環境を構築。
# su - www
$ mkdir /APPROOT/dev
$ cd /APPROOT/dev
$ rails rails
$ mongrel_rails cluster::configure -p 3000 -a 127.0.0.1 -e development \
-l /APPROOT/dev/rails/log/mongrel.log \
-c /APPROOT/dev/rails -r /APPROOT/dev/rails \
-P /var/run/mongrel_cluster/mongrel.pid -N 1 --user www --group www $ mkdir /APPROOT/product $ cd /APPROOT/product $ rails rails $ mongrel_rails cluster::configure -p 3001 -a 127.0.0.1 -e production \
-l /APPROOT/product/rails/log/mongrel.log \
-c /APPROOT/product/rails -r /APPROOT/product/rails \
-P /var/run/mongrel_cluster/mongrel.pid -N 1 --user www --group www

/APPROOT/dev/rails/config/mongrel_cluster_yml
/APPROOT/product/rails/config/mongrel_cluster_ymlにdocrootの行がある場合は削除しておく。

Apache2のDocumentRoot用に空のディレクトリを作っておく。
$ mkdir /APPROOT/dev/htdocs
$ mkdir /APPROOT/product/htdocs

mongrel_clusterの設定ディレクトリにmongrel_cluster_ymlへのシンボリックリンクを設定。
$ su -
# ln -s /APPROOT/dev/rails/config/mongrel_cluster_yml /etc/mongrel_cluster/dev.yml
# ln -s /APPROOT/product/rails/config/mongrel_cluster_yml /etc/mongrel_cluster/product.yml

Apache2の設定ファイルの編集。
/usr/local/apache2/conf/httpd.confの変更。

まずは実行ユーザーの変更。
User www
Group www

httpd-vhosts.confを読み込むようにする。
Include conf/extra/httpd-vhosts.conf

その他、ServerNameなど必要に応じて変更しておく。

/usr/local/apache2/conf/extra/httpd-vhosts.confに設定を追加。
NameVirtualHost *

<VirtualHost *>
    ServerAdmin webmaster@DOMAINNAME.jp
    DocumentRoot /APPROOT/product/htdocs
    ServerName www.DOMAINNAME.jp
    ErrorLog "|/usr/local/apache2/bin/rotatelogs \
/usr/local/apache2/logs/error_log.%Y%m%d 86400 540" CustomLog "|/usr/local/apache2/bin/rotatelogs \
/usr/local/apache2/logs/access_log.%Y%m%d 86400 540" combined <IfModule mod_proxy.c> <Proxy *> Order deny,allow deny from all # 開発環境を閲覧できるIPアドレス allow from 192.168.0.0/24 </Proxy> ProxyRequests Off ProxyPreserveHost On ProxyPass / http://localhost:3001/ ProxyPassReverse / http://127.0.0.1:3001/ </IfModule> SetEnv force-proxy-request-1.0 1 SetEnv proxy-nokeepalive 1 </VirtualHost> <VirtualHost *> ServerAdmin webmaster@DOMAINNAME.jp DocumentRoot /APPROOT/dev/htdocs ServerName development.DOMAINNAME.jp ErrorLog "|/usr/local/apache2/bin/rotatelogs \
/usr/local/apache2/logs/development-error_log.%Y%m%d 86400 540" CustomLog "|/usr/local/apache2/bin/rotatelogs \
/usr/local/apache2/logs/development-access_log.%Y%m%d 86400 540" combined <IfModule mod_proxy.c> <Proxy *> Order allow,deny allow from all </Proxy> ProxyRequests Off ProxyPreserveHost On ProxyPass / http://localhost:3000/ ProxyPassReverse / http://127.0.0.1:3000/ </IfModule> SetEnv force-proxy-request-1.0 1 SetEnv proxy-nokeepalive 1 </VirtualHost>

これでWebサーバー関連の設定も完了だ。

iPhoneの好きな機能の一つに、メールの設定が柔軟な所がある。
i.softbank.ne.jp や Gmail だけでなく、自社ドメインのメールなどの送受信も可能だ。

仕事のメールの送受信をiPhoneで行うこともできるし、
プライベートのメールアドレスを、
PCとiPhoneのどちらからでも送受信できるように設定できる。

iPhoneでメールアドレスを追加する際に、
一番下の「その他」を選ぶ。




新規アカウントの作成画面が表示されるので、
名前、アドレス、パスワードを設定する。





受信メールサーバーと送信メールサーバーの設定をする。
デフォルトではSSL通信を行うが、設定をしていない場合は、
SSLなしで接続の可否を聞かれる。

POPとSSLなしの設定が多いと思う。





ここで送信メールサーバーの設定をするのだが、
iPhoneからのアクセスがどのIPアドレスから来るのかが分からないので、
サーバー側で事前にSMTP認証の設定をしておく。
Postfixなどを使用していれば簡単に設定ができるはずだ。

iPhone側が対応しているので、送信メールサーバーの設定には
SMTP認証のユーザー名、パスワードを入力する。


これで万事OK!と思いきや。トラブルが…。
Wi-Fiの時にはメール送信ができるのだが、Softbankに接続している際には、
何故かメールが送信できない。

諸々試してみたところ、どうもSoftbankが
Outbound Port 25 Blocking に対応しているようで、
外部の25番ポートへの接続ができないようだ。

そこでサーバー側でサブミッションポート(587番)の設定をした後、
iPhone側の設定を変更してみる。

アカウントの設定画面から、送信メールサーバーを選択。





設定した送信メールサーバーがプライマリサーバとして表示されるので選択する。





サーバーポートを587に変更する。





これで無事Softbank接続時もメールが送信できるようになった。


受信時にサーバー側にメールを残す設定もデフォルトでオンになっているので、
iPhoneとPCの両方でメールの送受信をすることが可能だ。

出先ではiPhoneから送信、PCの前にいる時はPCから送信と、
便利に使いこなすことができる。


今までずっと欲しかった機能なので、iPhoneが対応してくれたおかげで重宝している。


mod_rewriteを使ったiPhone対応 (2008年07月12日)

iPhone用のサイトを作る際のTipsとして。

HTMLの書き方については色々なサイトで紹介されているので、
そちらを参照していただくとして、
iPhone用のページとPC用のページの振り分けについてなど、
弊社で運営している30min.の設定の一部を例として紹介させていただく。

GoogleAnalyticsなどでiPhoneのアクセスのみを集計したいため、
iPhoneとPC用のURLを分けたいが、トップページは同じURLにしたいので、
http://30min.jp/ にアクセスするとiPhoneは http://30min.jp/iphone/
以下にリダイレクトするようにした。

振り分けの設定はhttpd.conf内に記述することにした。
mod_rewriteを利用して次のような設定をしている。

    RewriteEngine On

    RewriteCond %{HTTP_USER_AGENT} ipod|iphone [NC]
    RewriteRule !^/(iphone|images|javascripts|stylesheets) http://30min.jp/iphone [R=301,L]

画像、JavaScript、CSSは共通のディレクトリを使用するが、
それ以外のページはHTTP_USER_AGENTにipod、iphone(大文字小文字を区別せず)
を含む場合は /iphone へリダイレクトするようにしている。

    RewriteCond %{HTTP_USER_AGENT} !(ipod|iphone) [NC]
    RewriteRule ^/iphone http://30min.jp/ [R=301,L]

逆にPCからの /iphone 以下へのアクセスはPC版のトップへリダイレクトさせている。

Ruby on Railsで開発している場合には、
負荷対策としてページキャッシュを使うことが多いと思う。

プログラム中にリダイレクトの処理を書く方法だと、
静的なページとして保存するページキャッシュが使えないのだが、
httpd.conf中に振り分けを記述してしまうことで、
Railsのページキャッシュを有効に活用することができるので便利だ。

mod_rewriteには他にも便利な使い方がある。
30min.ではエリアを選択した際、そのエリアをCookieに保存して、
次回トップページにアクセスする際には、
Cookieに保存されているエリアにリダイレクトするようにしている。
この設定も次のように記述できる。

    RewriteCond %{HTTP_COOKIE} c_default=town%3A(\d+) [NC]
    RewriteRule ^/$ http://30min.jp/town/%1/1 [R=301,L]

    RewriteCond %{HTTP_COOKIE} c_default=station%3A(\d+) [NC]
    RewriteRule ^/$ http://30min.jp/station/%1/1 [R=301,L]

Cookieがない場合のトップページはブラウザがキャッシュしてしまうと、
Cookieを持った後に以前のページを表示してしまうことがあるので、
トップページのテンプレート(rhtml)には次の記述を入れておく。

    <% if request.env["REQUEST_URI"] == "/" %>
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Cache-Control" content="no-cache" />
    <meta http-equiv="Expires" content ="Thu, 01 Dec 1994 16:00:00 GMT" />
    <% end %>

便利な使い方ができるので、工夫して色々試してもらいたい。
苦労して振り分け処理をしている箇所など、
案外簡単に解決できたりすることがあったりする。


iphone (2008年07月11日)

本日のiphone発売に伴い、30min.のiphone版をリリースした。
PC版と同じURLでアクセス可能だ。

http://30min.jp/

今後機能追加をしていく予定だが、
まずはシンプルに最寄り駅の周りの情報を探す機能から公開してある。

「URLを入力するのは面倒だし、駅名選ぶのナンセンス!GPS対応しないの?」
と思った方、流石です。

実は着々と準備を進めている。
iphone SDK で開発をするために MAC mini を購入し、
アプリの開発もほぼ完了しているので、近日中にGPS対応のアプリをリリース予定。

iphone SDK を使ってみた感想は、
最初は膨大な量の英文のドキュメントと、慣れない手法に戸惑い、
仕組みを理解するのに相当時間がかかるな、と思い途方に暮れそうになったのだが、
サンプルコードが非常に充実していたので、
サンプルコードを紐解きつつ、仕組みを理解していくことができ、
思いの他短い時間で必要な機能を実装することができた。

画像のような感じになる予定なので、リリースまでしばしお待ちを。
(クリックすると拡大)