Ruby on Railsの最近のブログ記事

HerokuでRails3アプリケーションを作成するさいストレージにMongoDBを、ORMにMongoMapperを使用する場合の手順です。 #他にも方法があるかも知れませんが...

まだ、やってなかったらherokuモジュールを入れたり、Railsを入れたりアップデートしたりしときます。

$ gem install heroku
$ gem update rails

アプリケーションを生成します。MongoMapperを使うのでデフォルトのactive-recordを切っときます。

$ rails new test-app --skip-active-record
$ cd test-app
$ git init
$ git add .
$ git commit -m 'Initial commit.'

必要なモジュールを追加しましょう。

$ vi Gemfile

gem "mongo_mapper", '>=0.8.2'
gem "bson_ext"
gem "rails3-generators"
gem "rspec-rails"

$ bundle install

GeneratorにMongoMapperの設定を追加してもらいます。

$ script/rails g mongo_mapper:install test-app-db

ローカルではデフォルトのlocalhost:27017を使うとするとconfig/database.mongo.ymlは何も変える必要はありません。

接続できているか確認しましょう。

$ rails console
Loading development environment (Rails 3.1.3)
ruby-1.9.2-p290 :001 > class Hoge
ruby-1.9.2-p290 :002?>   include MongoMapper::Document
ruby-1.9.2-p290 :003?>   key :name, String
ruby-1.9.2-p290 :004?>   end
 => # 
ruby-1.9.2-p290 :005 > Hoge.create!(:name => 'Nanashi San')
 => # 
ruby-1.9.2-p290 :006 > 

mongoに直接つないでも確認してみます。

$ mongo
MongoDB shell version: 1.6.5
connecting to: test
> show dbs
test-app-db_development
> use test-app-db_development
switched to db test-app-db_development
> db.getCollectionNames()
[ "hoges", "system.indexes" ]
> db.hoges.find()    
{ "_id" : ObjectId("4ee6f1f15ce68e3de8000001"), "name" : "Nanashi San" }
> 

ローカルの接続設定ができたので、一度コミットしておきます。

$ git add .
$ git st
$ git commit -m 'local mongo setting'

次は、いよいよHeroku上でもMongoLabに繋がるようにしたいと思います。

$ heroku create
Creating warm-sunrise-3496...
 done, stack is bamboo-mri-1.9.2
http://warm-sunrise-3496.heroku.com/ | git@heroku.com:warm-sunrise-3496.git
Git remote heroku added

warm-sunrise-3496 という名前でHeroku上にアプリケーションができました。

MongoLab Add-onをアプリケーションに追加します。

$ heroku addons:add mongolab:starter
-----> Adding mongolab:starter to warm-sunrise-3496... done, (free)
       Welcome to MongoLab.

(MongoLabを使用するにはFree版を使う場合でもクレジットカードなどで課金情報を有効にしておく必要があります)

Herokuで作成したアプリケーションの設定ページを表示します。

https://api.heroku.com/myapps/warm-sunrise-3496

右上にAdd-onsというメニューがあるので、MongoLabを選択します。

Usersタブを表示して、Addボタンをクリックしアプリケーションが接続するためのユーザを登録します。

また、タブの上部に

mongodb://:@ds000000.mongolab.com:11111/heroku_app2222222

このような接続URI情報が表示されているのを確認し、config/database.mongo.yml のproductionモードにHerokuの設定を追加します。 usernameとpasswordは先ほどUserタブで追加したものです。

$ vi config/database.mongo.yml
 :
production:
  <<: *defaults
  host: ds000000.mongolab.com
  port:11111
  username: hogehoge
  password: password
  database: heroku_app2222222
 :

あと、もう一点。このままではポートの変更が効かないようで、初期化ファイルを少しだけ変更します。

$ vi config/initializers/mongo_mapper.rb

-  MongoMapper.connection = Mongo::Connection.new(mongo['host'])
  ↓
+  MongoMapper.connection = Mongo::Connection.new(mongo['host'], mongo['port'])

いよいよHerokuに送ります。

$ git add .
$ git commit
$ git push heroku master

動いたかな?

http://warm-sunrise-3496.heroku.com/

大丈夫そうです(`・ω・´)

昨日、mongrelの事を書いたばかりですが、Ruby1.9.2、Rails3じゃmongrel_clusterが全然動かない(>ω<)

みんなどうしてるんだろうなと、ネットを徘徊してみると時代はthinなんですね!

nginx+thin

いや〜、導入も簡単で動きも、varnish+mongrel_clusterより速い気がしますな〜

今読ミもRails3化したらnginx+thinに移行しよう(`・ω・´)

新しい環境にmongrelをインストールしようとして毎回ググってる事に気付き、備忘のため。


ちなみに --pre 付けないと、こんなエラー吐きます。
INFO:  `gem install -y` is now default and will be removed
INFO:  use --ignore-dependencies to install only the gems you list
Building native extensions.  This could take a while...
ERROR:  Error installing mongrel_cluster:
	ERROR: Failed to build gem native extension.

        /Users/iwazawa/opt/ruby-1.9.2-p290/bin/ruby extconf.rb
checking for main() in -lc... yes
creating Makefile

make
gcc -I. -I/Users/iwazawa/opt/ruby-1.9.2-p290/include/ruby-1.9.1/x86_64-linux -I/Users/iwazawa/opt/ruby-1.9.2-p290/include/ruby-1.9.1/ruby/backward -I/Users/iwazawa/opt/ruby-1.9.2-p290/include/ruby-1.9.1 -I.   -fPIC -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long  -o http11.o -c http11.c
http11.c: In function 'http_field':
http11.c:77: error: 'struct RString' has no member named 'ptr'
http11.c:77: error: 'struct RString' has no member named 'len'
http11.c:77: 警告: カンマ演算子の左側の式に効力がありません
http11.c: In function 'header_done':
http11.c:172: error: 'struct RString' has no member named 'ptr'
http11.c:172: error: 'struct RString' has no member named 'ptr'
http11.c:172: error: 'struct RString' has no member named 'ptr'
http11.c:174: error: 'struct RString' has no member named 'ptr'
http11.c:176: error: 'struct RString' has no member named 'ptr'
http11.c:177: error: 'struct RString' has no member named 'len'
http11.c: In function 'HttpParser_execute':
http11.c:298: error: 'struct RString' has no member named 'ptr'
http11.c:299: error: 'struct RString' has no member named 'len'
make: *** [http11.o] エラー 1


Gem files will remain installed in /Users/iwazawa/opt/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongrel-1.1.5 for inspection.
Results logged to /Users/iwazawa/opt/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongrel-1.1.5/ext/http11/gem_make.out
を書こうかなと思って、今読ミ2008年に読み終わった本をチェックしてたんですが、不便です(>ω<)
ベストを書こうと思ったら評価での並べ替えが出来ないと探せない。それほど読むのが速いとは言えない私でも、今日までで132冊(もう一冊増えそうだけど)、今読ミの表示で14ページ分もある。自力で確認するのはばかばかしいですよね。コンピュータにやらせよう。

とりあえずUIを考えているとそれだけで年が明ける(ぼくは向いていない...)ので、URLだけ考えて年内はしのぐ方向で(笑)
年指定で読み終わった本の一覧のURLは
http://imayomi.jp/archives/iwazer/2008
なので、評価の逆順(評価が高い方が先に表示)のパラメータをこんな感じで追加することにしよう。
http://imayomi.jp/archives/iwazer/2008?order=evaluation_desc
評価は内部的にevaluationという名前なので、その逆順(SQLのORDER BY evaluation DESCという意味で) paginateプラグインやその他いくつかのリンクに渡すパラメータが増えたり、その辺りの動作確認に少し手間取ったけど、一応できた

さて、本題の2008年に読んだ本ベストhogeは、次のエントリーということで、一休み(笑)

music: A Change of Seasons -- Dream Theater
Rails勉強会@東京第32回に参加してきました。

あまりこういった会に参加したことはなかったのですが、今はRubyとRailsに夢中なので自分の知らない楽しい何かを見つけよう、詳しい人に会って話を聞きたい話をしたいと思って参加してきました。

Emacsにだらだらと取ったメモ(話題に取り残されないよう注意しながらざっとですが)を見ながら振り返ってみます。


[Redmine + RESTful] 13:15-14:30

Yuguiさんのセッション。

まずは初めての人のためのRedmineの特徴。
  • Rubyで書ける。
  • 複数のプロジェクトを管理できる。
  • プロジェクトの親子関係も持てる。(1階層)
  • Roleに対する権限を一覧で管理できる。
  • プラグインアーキテクチャ。
RESTの勉強をかねてRedmineにRESTfulなAPIを作っているところ。

そしてここからRESTfulに関する議論へと突入。

RESTと言われているもの
  • RESTful
  • XML-RPC
  • Hibrid
Action WEB ServiceはSORP/XML-RPCなのでHibridか。
RESTfulフレームワークと言えばまずRailsという流れ。
操作対象となるリソースをURLできちんと表す→RESTful

大切なこと言いますよ:RESTで重要なのはGET! GET以外はどうでもいい。

RESTとは何なのか?
HTTPは分散アーキテクチャの世界初で唯一の成功例である。その成功の実績をRESTという言葉でまとめようという話。

そこで問題となるのが認証。色々な話が出ていましたが、印象に残っているところでは、
  • 認証情報を毎回リクエストに含める方法であればRESTfulと思われる。
  • サーバサイドはステートレスな世界でないとRESTfulとは言えない。
  • 認証で処理を変えないといけないところはHTML情報の一部なのでは?
  • RESTについて考える場合、認証はひとまず除いて考えるのが賢いし幸せ。
最後にRedmineにも話は戻って、Redmineでも認証って実はいらないのかも、特に参照系は。
(認証ないとスパムが怖いけど・・・という余談で紹介されたRubyConf08の認証がイカス)


[JRuby] 14:40-15:55

koichiroさんのセッション。

まず、つかみのお話としてゆるふわとJRubyはDarknessなパワーで作られている件。.

Cのネイティブコードで書かれているRubyのモジュールは素直にJRubyで動かせない。
例えばYAMLパーサとか。とりあえずRubyで再実装して置き換えて後でJavaで実装した経緯も。

Rubyを使うと1行で書けるのにJavaで書く。
大変だけど、でもJavaで書いたらたいてい速い。事前にコンパイルできる。JITもある。速くなったとき嬉しい。
クラスの可視性がJavaとRubyで全く違うので注意が必要。
特にprotected要注意。privateもだいぶ違う。

作り方としては、
  • rubyランタイムにクラス/モジュールを登録する。
  • アノテーションを書く。
  • 中身の処理を書く。
jarにまとめてJRubyからrequireすれば使える。

Javaは自分も仕事で最もよく使う言語であるので、話は理解しやすかったし、JRubyならうまく立ち回って仕事にRubyテイストを持ち込みやすいかもと思いました(笑)


[Git] 16:05-17:20

maihaさんのセッション。

  1. 今まで使ったことがない
  2. 遊びで使える程度に
  3. 仕事で使えるレベルに
みんなをいきなり 3. にしちゃいましょうという野望。

最初に一通り、gitに関する概要をgit使いの方々に語っていただく。

  • gitはリポジトリが複数あり得る。
  • でも、あくまでもローカルリポジトリ(自分の手元)がメイン。
  • だからgitはいろいろな操作が速い。
  • 世の中git化の流れ。
その後、具体的な実践へ突入。

最初のローカルリポジトリ作成から、やって見せていただいたので自分でもできる気がしてきます。

ただ、目の前で実行されているコマンドを、自分のMacBookでもトレースしてやってみようとしましたが、展開が速くて挫折。使ったことないので致し方ないと自分を慰めたわけであります(笑)

git使いになるための非常に実践的なセッションでした。最初cvs,svnしか使ったことがないのでチンプンカンプンかなぁと思っていましたが、主にsvnでこうやってたことがgitでうまくできないんだけど、どうするの?という様ないくつかのケースに対して実際にgitコマンドを実行しながら試して納得という内容。

今までsvnで満足していたのですが、これからはgitです(爆) svnからのリポジトリの移行もし易そうなので、さっそく今読ミのをソースコード管理をgitに変えてみようかなと思います。

#git-guiかわいいよgit-gui。



最後になりましたが、Rails勉強会@東京運営者の方々、会場を提供してくださったCTCさま、ありがとうございました。
せっかく今読んでいる本を今読ミにこまめに登録しているのだし、ブログのサイドバーにも表示させたいなと以前から思っていた。いわゆるブログパーツというやつ。

やはりブログパーツはフラッシュだよなぁと思っていたので、なかなか手を付けなかったが簡単なものならJavaScriptだけでもいけそうなのでちょっとやってみた。

きっかけとしては【PHP TIPS】 81. ブログパーツを作ってみようを読んだから。いや、こういう風にやるというのは知っていたが、Railsでの具体的な例は見たことがなかったので、よしやってみるかと。

仕様はめっちゃシンプルに、自分の最新のn件の書影、書名、著者を表示するというもの。

IMGP3452.JPG
これはちょっと前に外出先で手帳に描いていたイメージ。

まずURLをエイヤと http://imayomi.jp/ext/recent/iwazer?n=3 に決めます。パラメータnは表示する件数です。上記イメージだと3件なのでn=3。Railsだとデフォルトのルーティング設定を使うとすれば、 こんな感じで生成されるURLです。すなわちextというコントローラを生成。 次は、ext_controller.rbにidとnをパラメータとして受け取るrecentというメソッドを書くと。 Ownerモデルは(最初、ちょっと名前を付けそこなって気に入ってないのだけど…)本とメンバーの関連テーブルownersのモデル。なのでownersテーブルからメンバーがiwazerで、更新日(updated_at)の逆順にn件とって来ると上記みたいな実装になります。
#サンプルのコードはエラーチェックなどかなり端折ってますよ。

そして、ここからがRailsらしくRJSを使ってJavaScriptをページに埋め込むレスポンスを返すところ。
render :update を使います。 divのidを'd04786a8e9ac3405955a99d479b581b2'などという意味不明な値にしたのは、idがぶつかると危ないだろうなと思い、悩んだ挙句、何かのmd5値です。そしてその何かはもう忘れたが(笑)

ExtController#recent()がリクエストされたら、結果をJavaScriptで返すのですが、まず'd04786a8e9ac3405955a99d479b581b2'をidとしてもつdivタグをdocument.write()でその場に埋め込みます。

そしてその埋め込んだdivの内容を render :partial => 'recent' でレンダリングされるHTMLで置き換えます。すなわち views/ext/_recent.rhtml が必要です。 これはいささか汚いですね。最初はCSS指定を別別ファイルにしてたんですが、どうもブラウザによって効いたり、効かなかったりと制御が大変だったので、とりあえずちゃんと動けということで、全て直接タグへstyle属性として書きました。(テヘ)

実はこれで、もう完成です。
あとはブログの表示したい場所に とjsを読み込むscriptタグを書けば、右のサイドバーに出ている様に表示されました。

最後に、上記の様にRailsのAjax自動生成機能を使って楽をしているので、prototype.js の読み込みが必要ですが、他で使っているかも知れませんし<head>~</head>の記述を確認して、なければそちらに移したほうがよいと思います。

このエントリーのタイトルは「・・・JavaScriptでやってみる」なのですが、実は自分でJavaScriptのコードをを一切書いていない甘やかされよう。

この手のものを作るのは意外と初めてだったりするので、気になる所を見つけた方がいらっしゃれば、突っ込みお願いします。
link_to_remote() はコンテンツの一部だけを書き換えるのに非常に便利ですが、href="#" になってしまう。

JavaScriptをOFFにしている場合やユーザーがマウスで右クリックして新しいウィンドウに表示したとき、また、検索エンジンのクローラにページとしてのリンク先を教えるためなどの理由で、href に適当なページのURLを書きたい事も多いです。

ひょっとして :href オプションを付ければいけるかと思い、
というふうにしてみるがダメ。
RailsのAPIを見てみると となっている。そうだ、html_options!
これで大丈夫。
去年の5月から今読ミ(imayomi)の開発をするのにRuby on Railsと戯れている。その開発環境をどうしようかと最初色々やってみたところ、少し前までAptanaのRadRailsに落ち着いていた。

仕事ではここ何年もJavaがメインであるのでEclipseを一番使っていて、エディタに関しては可もなく不可もなしという印象に過ぎないが、Subversionとの連携がとても便利で気に入っているからというのが一番の理由。

しかしEclipseは正直なところ少々重い。特にRadRailsはJavaに比べて重い、というよりJavaだと当然の様に使えるオートコンプリートやリファクタリングがほとんどないのに、Javaエディタより重いというのが我慢ならなくなってきた。また、たまに文字列を入れようと、'や"を入力した瞬間におかしくなったりするのも、直る気配が無く諦め気味だ。

久しぶりにEmacs(Meadowだが)を使って書いてみると、これがやはり快適なのである。Emacs、昔は決して軽いエディタではなかったのだが、昨今のCPUパワーをもってすれば極めてサクサクである。もちろんEclipseを使うときもキーバインドはEmacsであるので戻るのに全く問題はない。

また、もし次にPCを買い換えるとすればMacBookにしようと思っているのだが、今やMacは一番ちゃんとしたEmacsがあるプラットフォームであるし安心である。
(ちなみにPHPの仕事をしていた時にしばらくMac miniでEclipseを使っていたのだが、アレはかなり重かった)

rhtmlを編集するいいモードがないので躊躇していたのだが、Rails On Emacs を見つけた。

Requirements

Emacs-rails is requiring a CVS version of Emacs, and can't be running on old versions (less 22.0). To install CVS version:

Meadowは難しいか?という気がしないでもないが、これからやってみようかと思う。のこるSubversionのためだけにEclipseを上げるのはさすがにばかばかしいので、コマンドラインを使うかTortoiseSVNを使うかといったところ。
ドキュメントを読むとchange_columnは項目型を変更するもと書かれていて、長さの変更は出来ないのかなと思いましたが、他に適当なメソッドも無さそうだったのでやってみると、(:limit=>32 指定だった 'name' を :limit=>255 に変更) 全然OKでした。まぁ長さ変更も型変更のうちですしね。

この場合、逆変換は破壊的変換になるので、ドキュメントに従えば自動では行わず、 とするのが行儀がよいということでした。

Ruby on Rails 2.0

| コメント(0)

ついにRails 2.0がリリースになったようです。
あぁ、時間が欲しいなぁ。そうしたら今読ミを2.0化するのに。


昨日書いたiTunes Music Storeアクセス不能は直ってました。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちRuby on Railsカテゴリに属しているものが含まれています。

前のカテゴリはRubyです。

次のカテゴリはScalaです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。