ウォンツテック

そでやまのーと

VPSとRailsでサービス開発

http://stkr.dip.jp/maps

 先週の3連休、私は家にひきこもって酒を飲みながらemacsの誰得的な記事を書きつつVPSで遊んでいました。
そこで作ったtwitterを利用したサービスが出来るまでの流れをざっくり公開しようかと思います。
 作ったサービスは http://stkr.dip.jp/maps 上で公開してます。
twitter idを入力するとI'm atアプリ等でtweetした文書を取得し、だいたいの場所をGoogle map上にプロットします。
このくらいであれば1日もあれば一から作れます(酒があれば)

VPSの登録

世の中には様々なVPSサービスがありますが、今回使用したのはServersMan@VPSというサービスです。
このサービスは月額490円でメモリ256MB(MAX768MB)でHDDが10GBほどのリソースが使え、
root権限もあるのである程度遊ぶには十分な環境と言えます。
このサービスが出た直後は登録するのに1ヶ月待ちとかだったのですが、今なら登録直後に使用出来るのもいいですね。

http://dream.jp/vps/index.html

へ行きお好きなプランを選んで登録してみてください。
登録したメールアドレスに環境情報が送られてきます。

開発環境の設定

rootユーザーで作業するのは何かと危険なのでまずはユーザーを作りましょう。

 % ssh -P 3843 root@xx.xx.xx.xx

でログインし、useraddコマンドでユーザーを作成します。
作成したユーザーを以下「user」とします。
次にsshまわりの環境を整えます。
ServersManではsshのポートが標準の22から3843に変わっているので普通にログインしようとしたら上記のように打ち込む必要があるので非常に面倒です。
そこで ローカル(VPS上ではない)の~/.ssh/config ファイルに以下のような設定をします。

Host	vps
  HostName  xx.xx.xx.xx
  Port  3843
  User	user

HostNameはServerManから与えられた固定IPアドレス、Portがsshのポート番号で、UserがログインユーザーIDです。
この設定をしておくことで

 % ssh vps

と打つだけで済むようになります。

emacsを使っている方はtrampというリモートサーバのファイルを編集出来る機能を設定しておきましょう。

 % wget http://ftp.gnu.org/gnu/tramp/tramp-2.2.0.tar.gz
 % tar zxvf tramp-2.2.0.tar.gz
 % ./configure --with-contrib
 % make
 % sudo make install

.emacs.elに以下を追加

(require 'tramp)
(setq tramp-shell-prompt-pattern "^.*[#$%>] *")
(setq tramp-default-method "ssh")

設定終了後はemacs上で

 C-x C-f /vps:

と入力しましょう。パスワードの入力をするとVPS上のファイルを編集出来るようになります。

Ruby on Railsのインストール&設定

ServerManでRailsが動くようになるまで以下のアプリ群をインストールしてください。
以下の作業はすべてrootで行います。

コンパイラ関連
 # yum install gcc glibc gcc-c++
Ruby関連
 # yum install readline-devel openssl-devel zlib-devel 
 # wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p299.tar.gz
 # tar xvzf ruby-1.8.7-p299.tar.gz
 # cd ruby-1.8.7-p299
 # ./configure --prefix=/opt/ruby-1.8.7-p299
 # make
 # make install 
 # ln -snf /opt/ruby-1.8.7-p299/bin/ruby /usr/local/bin/ruby
 # ln -snf /opt/ruby-1.8.7-p299/bin/rake /usr/local/bin/rake
 # ln -snf /opt/ruby-1.8.7-p299/bin/irb /usr/local/bin/irb
mysql関連
 # yum install mysql-server
 # yum install mysql-devel 
RubyGems関連
 # wget http://rubyforge.org/frs/download.php/70696/rubygems-1.3.7.tgz
 # tar xvzf rubygems-1.3.7.tgz 
 # cd rubygems-1.3.7
 # ruby setup.rb
 # ln -snf /opt/ruby-1.8.7-p299/bin/gem /usr/local/bin/gem
Rails関連
 # gem install rails
 # ln -snf /opt/ruby-1.8.7-p299/bin/rails /usr/local/bin/rails
sqlite関連
 # wget http://www.sqlite.org/sqlite-autoconf-3070500.tar.gz
 # tar xvzf sqlite-autoconf-3070500.tar.gz
 # cd sqlite-autoconf-3070500
 # ./configure
 # make
 # make install
 # gem install sqlite3-ruby mysql dbi dbd-mysql
passenger関連 (railsapache経由で使用するため)
 # gem install passenger
 # /opt/ruby-1.8.7-p299/lib/ruby/gems/1.8/gems/passenger-3.0.5/bin/passenger-install-apache2-module
railsでプロジェクトを作成する
 # cd /var/www/html
 # rails new stokker
 # cd stokker
 # rails generate scaffold maps
 # rake db:migrate
rails ルーティングの定義 (stokker/config/routes.rb)
  match 'maps/hoge' => 'maps#hoge'
  match 'maps/hoge/:twitter_id' => 'maps#hoge'

scaffoldで作ったmapsコントローラに新しいメソッドを定義した場合、ルーティングが通って無いのでそのメソッドを使用したリンク等をクリックするとエラーとなります。
上記のように適宜ルーティング定義を追加します。

apacheの設定

ServerManはデフォルトでApacheが入っているのでconfの設定だけをします。

/etc/httpd/conf/httpd.conf の以下の行のコメントアウトを外します。

NameVirtualHost *:80

起動ユーザーとグループはデフォルトだとdaemonですが、適切なユーザーに変えておきます。

User user
Group user

/etc/httpd/conf.d/stokker.confファイルを以下のように作成します。


  DocumentRoot /var/www/html/stokker/public
  ServerName stkr.dip.jp
  RailsEnv development
  
     AllowOverride none
     Options -MultiViews
     Order allow,deny
     Allow from all
  

DocumentRootはrailsでプロジェクトを作った際に出来るpublicディレクトリを指定します。


/etc/httpd/conf.d/passenger.confファイルを以下のように作成します。

LoadModule passenger_module /opt/ruby-1.8.7-p299/lib/ruby/gems/1.8/gems/passenger-3.0.5/ext/apache2/mod_passenger.so
PassengerRoot /opt/ruby-1.8.7-p299/lib/ruby/gems/1.8/gems/passenger-3.0.5
PassengerRuby /opt/ruby-1.8.7-p299/bin/ruby

apacheを再起動します。

http://xx.xx.xx.xx/

railsが生成した画面が表示されている事を確認してください。

Google maps api

http://code.google.com/intl/ja/apis/maps/signup.html
ここでgoogle maps apiを使用するドメインを登録しKEYを取得します。
取得したKEYは以下のように使用します。

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;
 sensor=true&amp;key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
 type="text/javascript">
</script> 

マップは

 <div id="map_canvas" style="width: 728px; height: 400px"></div>

というdiv要素上に表示されます。

twitter4r

twitterの発言を取得するのにtwitter4rを使用しました。

 % sudo gem install twitter4r

twitter4rをインストールしたら使用するrubyのファイルで以下のように宣言しておきます。

require "rubygems"
gem "twitter4r"
require "twitter"

公開発言を取得するだけであれば以下のような簡易なコードで取得出来ます。

    @MAX_COUNT = 500
    @twitterid = ...
    last_month = Time.now - 60*60*24*30
    tw_client = Twitter::Client.new
    tw_client.timeline_for(:user, :id => @twitterid, :count => @MAX_COUNT).each do |status|
      created = status.created_at
      if created > last_month then
        ...
      end
    end

その他

ロゴ

twitter風のロゴは http://www.twitlogo.com/ で作成しました。