バリケンのRuby日記 RSSフィード

2007-04-28

[][] 「嫌なこと書き貯めWebアプリ」を作ろう(7)  「嫌なこと書き貯めWebアプリ」を作ろう(7) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「嫌なこと書き貯めWebアプリ」を作ろう(7) - バリケンのRuby日記  「嫌なこと書き貯めWebアプリ」を作ろう(7) - バリケンのRuby日記 のブックマークコメント

昨日の続きだよ。

じゃあ、1回のSQLで欲しい情報を取ってくるように変更してみるよ。と言ってもとっても簡単、app/controllers/taihen_controller.rbを、次のように編集するよ。

class TaihenController < ApplicationController

  def card
    @cards = Card.find(:all, :include => [{:entry => [:user]}, :card_detail])
  end
end

findメソッドに:includeオプションを指定して、関連するテーブルも一気に持ってくるようにしているよ。

またテスト用のWebサーバを起動して、http://localhost:3000/taihen/cardWebブラウザアクセスアクセスしてみてね。

C:\rails\magica>ruby script\server

log/development.logを見ると、SQLクエリは1回しか発行されていないことがわかるよ。

こんな感じでRuby on RailsではSQLを直接書かなくても済むことが多いけど、「効率のよいSQLクエリが発行されているか」については意識しておく必要があるよ。それと、もっと複雑なWebアプリではSQLを直接書かないといけないケースも出てくるから、できればSQLについてきちんと理解した上でRuby on Railsを使うようにしたほうがいいと思うよ。

SQL勉強には、もちろんこの本。

すらすらと手が動くようになるSQL書き方ドリル

すらすらと手が動くようになるSQL書き方ドリル

もうすぐ第二版が出るみたい

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070428

2007-04-27

[][] 「嫌なこと書き貯めWebアプリ」を作ろう(6)  「嫌なこと書き貯めWebアプリ」を作ろう(6) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「嫌なこと書き貯めWebアプリ」を作ろう(6) - バリケンのRuby日記  「嫌なこと書き貯めWebアプリ」を作ろう(6) - バリケンのRuby日記 のブックマークコメント

昨日の続きだよ。

まずは、駄目な例から。コントローラーとしてapp/controllers/taihen_controller.rbを、次のように編集するよ。

class TaihenController < ApplicationController

  def card
    @cards = Card.find(:all)
  end
end

このコントローラーに対応したビューを作るよ。app/views/taihen/card.rhtmlを、次のように編集(作り直し)するよ。

<html>
<head>
<title>All Cards</title>
</head>
<body>

<h1>Taihen Card - All Cards</h1>
<table border="1">
 <tr>
  <td><p align="center"><i><b>User</b></i></td>
  <td><p align="center"><i><b>Date</b></i></td>
  <td><p align="center"><i><b>CardDetail</b></i></td>
  <td><p align="center"><i><b>Content</b></i></td>
  <td><p align="center"><i><b>Cause</b></i></td>
 </tr>

 <% @cards.each do |card| %>
  <tr>
   <td><%= card.entry.user.name %></td>
   <td><%= card.entry.created_on %></td>
   <td><%= card.card_detail.name %></td>
   <td><%= card.content %></td>
   <td><%= card.cause %></td>
  </tr>
 <% end %>
</table>

</body>
</html>

じゃあ、テスト用のWebサーバを起動して見てみよう!

C:\rails\magica>ruby script\server

http://localhost:3000/taihen/cardWebブラウザアクセスして、さっき作ったページを表示してみるよ。

ちゃんと表示されているけど、これには問題があるよ。log/development.logを見るとわかるけど、たった4つのカードしか登録されていないのに、この表を表示するためにSQLクエリが13回も発行されているよ。SQLの問い合わせは非常に重い処理だから、ひとつのページを表示するときにSQLの問い合わせは1回で済ませるようにするのが理想だよ。

じゃあ、次回は効率のよいSQLとなるように改造してみよう!

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070427

2007-04-26

[][] 「嫌なこと書き貯めWebアプリ」を作ろう(5)  「嫌なこと書き貯めWebアプリ」を作ろう(5) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「嫌なこと書き貯めWebアプリ」を作ろう(5) - バリケンのRuby日記  「嫌なこと書き貯めWebアプリ」を作ろう(5) - バリケンのRuby日記 のブックマークコメント

こないだの続きだよ。

カードの一覧表示ページをつくってみる

とりあえず、カードを一覧で表示するページを作ってみるよ。まずは「ruby script\generate controller taihen card」と入力して、ページの雛形をつくるよ。

C:\rails\magica>ruby script\generate controller taihen card
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/taihen
      create  test/functional/
      create  app/controllers/taihen_controller.rb
      create  test/functional/taihen_controller_test.rb
      create  app/helpers/taihen_helper.rb
      create  app/views/taihen/card.rhtml

C:\rails\magica>

じゃあ、テスト用のWebサーバを起動して見てみよう!

C:\rails\magica>ruby script\server

まずはhttp://localhost:3000/Webブラウザアクセスして、RailsのWelcomeページを表示してみてね。

次に、http://localhost:3000/taihen/cardWebブラウザアクセスして、さっき作った雛形のページを表示してみるよ。

Find me in app/views/taihen/card.rhtml」と表示されるはずだから、次はcard.rhtmlを編集してカードの一覧表示ページを作っていくことにするよ。

[] 自治体で使われる「Ruby on Rails」と「マジカ!」  自治体で使われる「Ruby on Rails」と「マジカ!」 - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  自治体で使われる「Ruby on Rails」と「マジカ!」 - バリケンのRuby日記  自治体で使われる「Ruby on Rails」と「マジカ!」 - バリケンのRuby日記 のブックマークコメント

大分県では,ファイル管理基盤,職員認証基盤,電子決済基盤システムオープンソースソフトウエアで構築した。職員認証基盤はSamba, OpenLDAP,UltraMonkey,MySQLApacheで構築,そのポータルおよび管理ツールRuby on Railsで開発した。

「自治体間でODFとOpenOffice.orgにより文書交換」---IPAがOSS導入実証成果報告:ITpro

おおー。

また職員情報システム地元の小企業も参入できるよう,分割発注を前提とした開発を行った。その際に要求分析を実施するために,スターロジックが開発した分析手法「マジカ!」(関連記事)を利用した。

「自治体間でODFとOpenOffice.orgにより文書交換」---IPAがOSS導入実証成果報告:ITpro

ほほー。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070426

2007-04-25

[][] WWW::Mechanizeを使って「はてなフォトライフアップローダー」を作る(2)  WWW::Mechanizeを使って「はてなフォトライフアップローダー」を作る(2) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  WWW::Mechanizeを使って「はてなフォトライフアップローダー」を作る(2) - バリケンのRuby日記  WWW::Mechanizeを使って「はてなフォトライフアップローダー」を作る(2) - バリケンのRuby日記 のブックマークコメント

このあいだの続きで、「はてなフォトライフ」に、手元の画像ファイルを一気にアップロードするスクリプトだよ。

こんどは、画像ファイルを5個以上でも対応できるように変更してみたよ。

$KCODE = 's'

require 'mechanize'

upload_files = ['01.jpg', '02.jpg', '03.jpg', '04.jpg', '05.jpg',
                '06.jpg', '07.jpg', '08.jpg', '09.jpg', '10.jpg']

USERNAME = '(はてなユーザー名)'
PASSWORD = '(パスワード)'

#TAGNAME = '(写真につけるタグ名)'
TAGNAME = nil

AGENT = WWW::Mechanize.new

login_page = AGENT.get("https://www.hatena.ne.jp/login")

login_form = login_page.forms.first
login_form['key'] = USERNAME
login_form['password'] = PASSWORD
AGENT.submit(login_form)

def photo_upload (upload_files)
  photo_up_page = AGENT.get("http://f.hatena.ne.jp/#{USERNAME}/up")
  photo_up_form = photo_up_page.forms.first
  current_dir = Dir.pwd.gsub(/\//, "\\") + "\\"

  upload_files[0..4].each_with_index do |item, index|
    photo_up_form.file_uploads.name("image#{5 - index}")[0].file_name = current_dir + item
  end

  photo_up_form['taglist'] = TAGNAME if TAGNAME
  AGENT.submit(photo_up_form)

  upload_files = upload_files[5..upload_files.size]
  photo_upload(upload_files) if upload_files
end

photo_upload(upload_files)

残りは、

だね。あと、追加で

ということも思いついたよ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070425

2007-04-24

[] sargeからetchへのアップグレードは大変そう  sargeからetchへのアップグレードは大変そう - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  sargeからetchへのアップグレードは大変そう - バリケンのRuby日記  sargeからetchへのアップグレードは大変そう - バリケンのRuby日記 のブックマークコメント

Debian GNU/Linuxの安定版バージョンが、3.1(sarge)から4.0(etch)に上がったんだね。

3.0(woody)から3.1(sarge)のアップグレードは簡単だったけど、3.1(sarge)から4.0(etch)のアップグレードけっこう大変みたい。データや設定ファイルバックアップしてクリーンインストールして、データや設定ファイルを戻したほうが早いかも。

いずれ古いバージョンバグフィックスセキュリティパッチとかの提供はされなくなっちゃうから、いつかはアップグレードしないとね。UbuntuCentOSなどの、ほかのLinuxディストリビューション移行してもいいかも。

[][] 「作り方」がオープンになった  「作り方」がオープンになった - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「作り方」がオープンになった - バリケンのRuby日記  「作り方」がオープンになった - バリケンのRuby日記 のブックマークコメント

あっ、またタイトルだけで言いたいことが終わっちゃった。Ruby on Railsがすごいのは、「作り方」がオープンになったことじゃないかなあ。「作った結果」がオープンになる「オープンソース」じゃなくて、「作り方」がオープンになる「オープンプロセス」。

もちろん、Ruby on Railsが提案する「Webアプリケーションを作るプロセス」が本当にベストなものかどうかはわからないけどね。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070424

2007-04-23

[] 最初に基礎を徹底的にやること  最初に基礎を徹底的にやること - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  最初に基礎を徹底的にやること - バリケンのRuby日記  最初に基礎を徹底的にやること - バリケンのRuby日記 のブックマークコメント


また、すべての勉強に共通するコツとしては

の5つがあるということ。

社会人版ドラゴン桜!?「無理なく続けられる 年収10倍アップ勉強法」:[俺100]

これはすごく共感するなあ。特に「最初に基礎を徹底的にやること」に共感するよ。

Rubyで僕が「基礎」だと思うのは、「変数」「オブジェクト指向」「ブロック」だと思うよ。そしてこの3つを自分の言葉で説明してみると、すごく勉強になると思うよ。

ちなみに以前、ぼくが自分の言葉で説明してみたエントリ

だよ。参考にしてみてね。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070423

2007-04-22

[][] WWW::Mechanizeを使って「はてなフォトライフアップローダー」を作る(1)  WWW::Mechanizeを使って「はてなフォトライフアップローダー」を作る(1) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  WWW::Mechanizeを使って「はてなフォトライフアップローダー」を作る(1) - バリケンのRuby日記  WWW::Mechanizeを使って「はてなフォトライフアップローダー」を作る(1) - バリケンのRuby日記 のブックマークコメント

はてなフォトライフ」に、手元の画像ファイルを一気にアップロードするスクリプトを書いてみるよ。

動作にはWWW::Mechanizeが必要だから、まだインストールしていない人は

gem install mechanize

インストールしてね。

とりあえずは超手抜き版。Windows限定、画像ファイルは5個まで。ファイル名は配列で指定するよ。画像ファイルスクリプトと同じディレクトリに置いてね。

$KCODE = 's'

USERNAME = '(はてなユーザー名)'
PASSWORD = '(パスワード)'

#TAGNAME = '(写真につけるタグ名)'
TAGNAME = nil

upload_files = ['01.jpg', '02.jpg', '03.jpg', '04.jpg', '05.jpg']

require 'mechanize'
require 'kconv'

agent = WWW::Mechanize.new
login_page = agent.get("https://www.hatena.ne.jp/login")

login_form = login_page.forms.first
login_form['key'] = USERNAME
login_form['password'] = PASSWORD
redirect_page = agent.submit(login_form)

photo_up_page = agent.get("http://f.hatena.ne.jp/#{USERNAME}/up")

photo_up_form = photo_up_page.forms.first

current_dir = Dir.pwd.gsub(/\//, "\\") + "\\"

upload_files[0..4].each_with_index do |item, index|
  photo_up_form.file_uploads.name("image#{5 - index}")[0].file_name = current_dir + item
end

photo_up_form['taglist'] = TAGNAME if TAGNAME

agent.submit(photo_up_form)

この「超手抜き版」だとあんまりだから、もうちょっと何とかしたいと思うよ。とりあえず、

あたりを考えているよ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070422

2007-04-21

[][] 「嫌なこと書き貯めWebアプリ」を作ろう(4)  「嫌なこと書き貯めWebアプリ」を作ろう(4) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「嫌なこと書き貯めWebアプリ」を作ろう(4) - バリケンのRuby日記  「嫌なこと書き貯めWebアプリ」を作ろう(4) - バリケンのRuby日記 のブックマークコメント

昨日のエントリの続きだよ。

Entryテーブルの値の設定

ようやくきょうはカーディナリティ(「1対多」とかの数量の関連性)の設定だよ。でもそのまえに、昨日は設定していなかった「利用者(User)」が「たいへんカード(Card)」を「書き込んだ(Entry)」という記録の部分にも、値を設定するよ。

Entryテーブルの属性は「いつ書き込んだか(created_on)」「誰が書いたか(user_id)」「どのカードに書いたか(card_id)」となっているよ。そして面白いことに、「いつ書き込んだか(created_on)」については、値を新規に作成したときにRails自動的にタイムスタンプを値として入れてくれるよ。

じゃあ、値を設定してみよう!

Entry.create( :user_id => 1, :card_id => 1 )
Entry.create( :user_id => 1, :card_id => 2 )
Entry.create( :user_id => 4, :card_id => 3 )
Entry.create( :user_id => 2, :card_id => 4 )

デバッグコンソールで値を見てみると、日付が自動的に入っているのがわかるよ。

C:\rails\magica>ruby script\console
Loading development environment.
>> require 'pp'
=> ["PP"]
>> pp Entry.find(:all)
[#<Entry:0x48ef270
  @attributes=
   {"created_on"=>"2007-04-21 06:07:21",
    "card_id"=>"1",
    "id"=>"1",
    "user_id"=>"1"}>,
 #<Entry:0x48ef248
  @attributes=
   {"created_on"=>"2007-04-21 06:07:39",
    "card_id"=>"2",
    "id"=>"2",
    "user_id"=>"1"}>,
 #<Entry:0x48ef220
  @attributes=
   {"created_on"=>"2007-04-21 06:07:39",
    "card_id"=>"3",
    "id"=>"3",
    "user_id"=>"4"}>,
 #<Entry:0x48ef1f8
  @attributes=
   {"created_on"=>"2007-04-21 06:07:40",
    "card_id"=>"4",
    "id"=>"4",
    "user_id"=>"2"}>]
=> nil
>>

カーディナリティの設定

じゃあ、いよいよカーディナリティの設定をしてみるよ。いままで設定した値から考えると、

という関連性があるから、これを設定するよ。まずはC:\rails\magica\app\models\card.rbをエディタ編集するよ。エディタで開くと

class Card < ActiveRecord::Base
end

という内容になっているから、

class Card < ActiveRecord::Base
  has_one :entry
  belongs_to :card_detail
end

と設定するよ。次にC:\rails\magica\app\models\card_detail.rbだよ。

class CardDetail < ActiveRecord::Base
  has_many :cards
end

その次はC:\rails\magica\app\models\entry.rbだよ。

class Entry < ActiveRecord::Base
  belongs_to :user
  belongs_to :card
end

さいごにC:\rails\magica\app\models\user.rbだよ。

class User < ActiveRecord::Base
  has_many :entries
  has_many :cards, :through => :entries
end

こう設定しておくことで、各テーブル間で関連する値を簡単に参照できるようになるよ。

たとえば、「2番のカードは、誰が書いたものかな?」ということを調べるには

Card.find(2).entry.user.name.tosjis

とすればいいし、「ユーザーIDが1番の人の悩み事を一覧で表示したい!」ということであれば

User.find(1).cards.each{|i| puts i.content.tosjis }; nil

とすればいいよ。デバッグコンソールで試してみてね。

C:\rails\magica>ruby script\console
Loading development environment.
>> $KCODE='s'
=> "s"
>> require 'kconv'
=> []
>> Card.find(2).entry.user.name.tosjis
=> "バリオ"
>> User.find(1).cards.each{|i| puts i.content.tosjis }; nil
バリトとのけんか
バリミがつついてくる
=> nil
>>

ほかにもいろいろなデータの参照方法があるから、いろいろ試してみてね。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070421

2007-04-20

[][] 「嫌なこと書き貯めWebアプリ」を作ろう(3)  「嫌なこと書き貯めWebアプリ」を作ろう(3) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「嫌なこと書き貯めWebアプリ」を作ろう(3) - バリケンのRuby日記  「嫌なこと書き貯めWebアプリ」を作ろう(3) - バリケンのRuby日記 のブックマークコメント

昨日のエントリの続きだよ。

値の設定

きょうはカーディナリティ(「1対多」とかの数量の関連性)の設定をしてみようとおもったけど、空っぽデータベースに設定するよりも実際に値が入っているデータベースのほうがわかりやすいよね。

じゃあ、昨日つくったデータベースに値をいくつか設定してみよう!

まずは、Railsデバッグ用のコンソールを立ち上げよう。コマンドプロンプトからプロジェクトディレクトリ

ruby script\console

入力してね。うまくいけば、次のように表示されるはずだよ。

C:\rails\magica>ruby script\console
Loading development environment.
>>

このコンソールは、Rubyirb(インタラクティブRuby)と同じようなものなんだけど、Rails関係ライブラリや前回作成したデータベースへのアクセス用のクラスなんかを自動的に読み込んだ状態になっているよ。

じゃあ、実際に値を設定してみよう!

と、その前に日本語関係環境変数の設定とライブラリの読み込みをするよ。

$KCODE = 's'

require 'kconv'

$KCODE = 's'」はコマンドプロンプトの入出力漢字コードシフトJISであることを表しているよ。そして「require 'kconv'」で漢字コードを変換するライブラリを読み込んでいるよ。

ようやく準備が整ったから、値を設定してみよう!まずはCardDetailクラスだよ。

最後が,仕事上の不安を書き込む「もやもや」カードである。従来のバージョンでは「大変」カードと呼ばれていたものに相当する。「たいへん」「ひやひや」「もやもや」「いらいら」「こまった」「きになる」の中で該当する項目にチェックを付け,不安の原因と内容を記述する。

「仕事の流れをマンガ風にまとめよう」,スターロジックが業務分析ツールの新版「マジカ!」をお披露目:ITpro

とあるから、「たいへん」「ひやひや」「もやもや」「いらいら」「こまった」「きになる」という文字列を名前(name)として値を登録していくよ。

[[1,'たいへん'],[2,'ひやひや'],[3,'もやもや'],
 [4,'いらいら'],[5,'こまった'],[6,'きになる']].each do |i|
  CardDetail.create(
    :id => i[0],
    :name => i[1].toutf8
  )
end

ちょっと解説。ActiveRecord::Baseクラスのcreateクラスメソッドは、そのクラスに対応するデータベースのテーブルに値を作成するよ。値をセットするには、それぞれの属性に対応するハッシュのキーに対して値を渡してあげればいいんだよ。

あと、データベースに保存するときにString#toutf8メソッドを使って文字列をUTF-8に変換しているよ。

こんな感じで、ほかのテーブルにも値を設定していこう!

[[1,'バリオ'],[2,'バリト'],[3,'リバ'],
 [4,'バリミ'],[5,'バリコ']].each do |i|
  User.create(
    :id => i[0],
    :name => i[1].toutf8
  )
end

[[1, 2, 'バリトとのけんか', 'なわばりがせまいから'],
 [2, 5, 'バリミがつついてくる', 'なんでだろ?'],
 [3, 4, 'バリオがうっとおしい', 'バリオが水浴びして上がってきたあと、水しぶきがあたる'],
 [4, 6, 'バリミが好きなのに気づいてくれない', 'バリミはリバのことが好き?']].each do |i|
  Card.create(
    :id => i[0],
    :card_detail_id => i[1],
    :content => i[2].toutf8,
    :cause => i[3].toutf8
  )
end

設定した値を参照する方法はいろいろあるけど、たとえば

puts User.find(1).name.tosjis

とすればUserテーブルのひとつめの値のname属性を、

User.find(:all).each{|i| puts i.name.tosjis }; nil

とすればUserテーブルのすべての値のname属性の値を出力するよ。

>> puts User.find(1).name.tosjis
バリオ
=> nil
>> User.find(:all).each{|i| puts i.name.tosjis }; nil
バリオ
バリト
リバ
バリミ
バリコ
=> nil
>>

今日はここまで。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070420

2007-04-19

[][] 「嫌なこと書き貯めWebアプリ」を作ろう(2)  「嫌なこと書き貯めWebアプリ」を作ろう(2) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「嫌なこと書き貯めWebアプリ」を作ろう(2) - バリケンのRuby日記  「嫌なこと書き貯めWebアプリ」を作ろう(2) - バリケンのRuby日記 のブックマークコメント

このあいだの続きだよ。

テーブルの作成

前回railsコマンドで「モデルの雛形」と一緒に「データベーススキーマの雛形」ができているから、まずはそれにモデル属性を定義してテーブルを作成するよ。

具体的には、テキストエディタでC:\rails\magica\db\migrateディレクトリ以下にある「001_create_users.rb」「002_create_cards.rb」「003_create_card_details.rb」「004_create_entries.rb」を次のように編集するよ。

まずは「001_create_users.rb」だよ。編集前は

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
    end
  end

  def self.down
    drop_table :users
  end
end

のような雛形になっているから、追加したい属性を追加していくよ。ここではとりあえず「名前(name)」という属性を追加してみたよ。

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :name, :string, :null => false
    end
  end

  def self.down
    drop_table :users
  end
end

次に「002_create_cards.rb」だよ。「カードの詳細」を参照する属性(card_detail_id)、「原因(cause)」、「内容(content)」という属性を追加してみたよ。「:null => false」と指定した属性は、「入力必須」を表すよ。このあたりの詳細はまたこんど。

class CreateCards < ActiveRecord::Migration
  def self.up
    create_table :cards do |t|
      t.column :card_detail_id, :integer, :null => false
      t.column :cause, :text
      t.column :content, :text
    end
  end

  def self.down
    drop_table :cards
  end
end

その次に「003_create_card_details.rb」だよ。これも「名前(name)」という属性を追加してみたよ。

class CreateCardDetails < ActiveRecord::Migration
  def self.up
    create_table :card_details do |t|
      t.column :name, :string, :null => false
    end
  end

  def self.down
    drop_table :card_details
  end
end

さいごに「004_create_entries.rb」だよ。ここでは「このエントリがいつ作られたか」を保存する属性(created_on)、ユーザーid(user_id)、エントリid(entries_id)という属性を追加してみたよ。

class CreateEntries < ActiveRecord::Migration
  def self.up
    create_table :entries do |t|
      t.column :created_on, :date
      t.column :user_id, :integer
      t.column :card_id, :integer
    end
  end

  def self.down
    drop_table :entries
  end
end

スキーマの準備ができたら、「rake db:migrate」コマンドでテーブルを作るよ。

C:\rails\magica>rake db:migrate
(in C:/rails/magica)
== CreateUsers: migrating =====================================================
-- create_table(:users)
   -> 0.2600s
== CreateUsers: migrated (0.2600s) ============================================

== CreateCards: migrating =====================================================
-- create_table(:cards)
   -> 0.2500s
== CreateCards: migrated (0.2500s) ============================================

== CreateCardDetails: migrating ===============================================
-- create_table(:card_details)
   -> 0.2510s
== CreateCardDetails: migrated (0.2510s) ======================================

== CreateEntries: migrating ===================================================
-- create_table(:entries)
   -> 0.1800s
== CreateEntries: migrated (0.1800s) ==========================================


C:\rails\magica>

今日はここまで。次はカーディナリティ(「1対多」とかの数量の関連性)の設定をしてみるよ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070419

2007-04-18

[]「日本Ruby会議2007」チケット購入 「日本Ruby会議2007」チケット購入 - バリケンのRuby日記 を含むブックマーク はてなブックマーク - 「日本Ruby会議2007」チケット購入 - バリケンのRuby日記 「日本Ruby会議2007」チケット購入 - バリケンのRuby日記 のブックマークコメント

Loppiの使い方にちょっと戸惑った(鳥だから)けど、無事購入することが出来たよ!

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070418

2007-04-17

[][] 「マジカ!」の「もやもや」カード書き溜めWebアプリを作ろう!  「マジカ!」の「もやもや」カード書き溜めWebアプリを作ろう! - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「マジカ!」の「もやもや」カード書き溜めWebアプリを作ろう! - バリケンのRuby日記  「マジカ!」の「もやもや」カード書き溜めWebアプリを作ろう! - バリケンのRuby日記 のブックマークコメント

d:id:habuakihiroさん作の業務分析ツール「マジカ!」についてのITProの記事を読んでいて、

最後が,仕事上の不安を書き込む「もやもや」カードである。従来のバージョンでは「大変」カードと呼ばれていたものに相当する。「たいへん」「ひやひや」「もやもや」「いらいら」「こまった」「きになる」の中で該当する項目にチェックを付け,不安の原因と内容を記述する。羽生氏はこのカードおもしろい使い方も紹介した。ある企業では,大変カードを積み上げておき,1日1枚,いやなことを書き貯めていった。そこから広げていって業務の見える化に成功したという。「いやなことから書いていくというのはすごいノウハウだ」(羽生氏)。

「仕事の流れをマンガ風にまとめよう」,スターロジックが業務分析ツールの新版「マジカ!」をお披露目:ITpro

と書かれていたところがすごく気になったよ。

じゃあ、この「もやもや」カードを書き溜めるツールがあれば、気軽に「業務の見える化」ができるようになるかな?

というわけで、「マジカ!」の「もやもや」カード書き溜めWebアプリRuby on Railsを使って実装してみることにするよ。

Rubyのインストール

まだRubyインストールしていない人は、以前まとめたとおりRubyインストールしてね。

現時点での最新版は、ruby186-25.exeみたいだよ。それより古いバージョンがすでにインストールされている人も、これを機会に最新版にしよう。そのときアップグレードインストールはちょっと不安だから、ぼくはいったん古いバージョンRubyアンインストールしてからインストールしなおすようにしているよ。

Railsインストール

Railsインストール以前まとめてみたから、参考にしてね。

プロジェクトの開始

これまた以前「Ruby on Railsで掲示板(超手抜き版)」というエントリを書いたから、これを参考にしながらRailsプロジェクトを開始してみるよ。

ここではRailsが生成するプロジェクトファイルをC:\railsというフォルダに展開することを前提としているよ。コマンドプロンプトを起動して、次のコマンド入力してね。

cd \rails
rails -d sqlite3 magica

うまくいくと、次のようなメッセージが画面に出るはずだよ。

C:\rails>rails -d sqlite3 magica
      create
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  components
      create  db
      create  doc
      create  lib
      create  lib/tasks
      create  log
      create  public/images
      create  public/javascripts
      create  public/stylesheets
      create  script/performance
      create  script/process
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/mocks/development
      create  test/mocks/test
      create  test/unit
      create  vendor
      create  vendor/plugins
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  Rakefile
      create  README
      create  app/controllers/application.rb
      create  app/helpers/application_helper.rb
      create  test/test_helper.rb
      create  config/database.yml
      create  config/routes.rb
      create  public/.htaccess
      create  config/boot.rb
      create  config/environment.rb
      create  config/environments/production.rb
      create  config/environments/development.rb
      create  config/environments/test.rb
      create  script/about
      create  script/breakpointer
      create  script/console
      create  script/destroy
      create  script/generate
      create  script/performance/benchmarker
      create  script/performance/profiler
      create  script/process/reaper
      create  script/process/spawner
      create  script/process/inspector
      create  script/runner
      create  script/server
      create  script/plugin
      create  public/dispatch.rb
      create  public/dispatch.cgi
      create  public/dispatch.fcgi
      create  public/404.html
      create  public/500.html
      create  public/index.html
      create  public/favicon.ico
      create  public/robots.txt
      create  public/images/rails.png
      create  public/javascripts/prototype.js
      create  public/javascripts/effects.js
      create  public/javascripts/dragdrop.js
      create  public/javascripts/controls.js
      create  public/javascripts/application.js
      create  doc/README_FOR_APP
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log

C:\rails>

プロジェクトディレクトリに移動

さっきのコマンドでmagicaというプロジェクトディレクトリが作成されたから、そこに移動するよ。

cd magica

モデルの作成

次は、モデル部分を作成するよ。ちなみに、この「いきなりテーブル設計」と言う部分については、以前d:id:habuakihiroさんに「いけてない」と指摘されたけど、Rails勉強会@東京第7回では「みんな、はぶさんの『楽々ERDレッスン』を読むべし」という結論になったみたい。

楽々ERDレッスン (CodeZine BOOKS)

楽々ERDレッスン (CodeZine BOOKS)

ということで、テーブル設計について詳しく知りたい人は「楽々ERDレッスン」を読んでみてね。

話をもとにもどして、モデルの雛形の生成をしてみるよ。今回は『「私(User)」が「もやもやカード(Card)」に「感じていること(CardDetail)」を「記入(Entry)」する』から、4つのテーブルを作るよ。次のコマンドを実行してね。

ruby script\generate model user
ruby script\generate model card
ruby script\generate model card_detail
ruby script\generate model entry

うまくいけば、次のようなメッセージが画面に出るはずだよ。

C:\rails\magica>ruby script\generate model user
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/user.rb
      create  test/unit/user_test.rb
      create  test/fixtures/users.yml
      create  db/migrate
      create  db/migrate/001_create_users.rb

C:\rails\magica>ruby script\generate model card
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/card.rb
      create  test/unit/card_test.rb
      create  test/fixtures/cards.yml
      exists  db/migrate
      create  db/migrate/002_create_cards.rb

C:\rails\magica>ruby script\generate model card_detail
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/card_detail.rb
      create  test/unit/card_detail_test.rb
      create  test/fixtures/card_details.yml
      exists  db/migrate
      create  db/migrate/003_create_card_details.rb

C:\rails\magica>ruby script\generate model entry
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/entry.rb
      create  test/unit/entry_test.rb
      create  test/fixtures/entries.yml
      exists  db/migrate
      create  db/migrate/004_create_entries.rb

C:\rails\magica>

その次は、それぞれのモデル属性を定義してテーブルを作成して、テーブル間のカーディナリティ(「1対多」とかの数量の関連性)の設定をしたりするんだけど、続きはまたこんど。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070417

2007-04-15

[][] Ruby on Railsはプロダクトアウト  Ruby on Railsはプロダクトアウト - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  Ruby on Railsはプロダクトアウト - バリケンのRuby日記  Ruby on Railsはプロダクトアウト - バリケンのRuby日記 のブックマークコメント

あっ、タイトルだけで言いたいことが終わっちゃった。ぼくは、Ruby on Railsプロダクトアウトサービスに向いていると思うんだ。

開発者が作りたいものを思い切り作る、そういうことに最適化されているような気がするよ。

もちろん、プロダクトアウトで作ったサービスを「コンセプトアウト・デマンドイン」で改良していくことは大切だと思うよ。でもニワトリとタマゴの話じゃないけど、一番最初にできあがるものって、たぶん「開発者が作りたいものを思い切り作ったもの」なんじゃないかなあ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070415

2007-04-14

[] 「日本Ruby会議2007」申し込んだよ!  「日本Ruby会議2007」申し込んだよ! - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「日本Ruby会議2007」申し込んだよ! - バリケンのRuby日記  「日本Ruby会議2007」申し込んだよ! - バリケンのRuby日記 のブックマークコメント

日本Ruby会議2007」に申し込んだよ!

行こうと思っている人は、チケットの購入はお早めにね。

[][] フレームワークを使っての開発は、オレってばスゲー感が少ない?   フレームワークを使っての開発は、オレってばスゲー感が少ない? - バリケンのRuby日記 を含むブックマーク はてなブックマーク -   フレームワークを使っての開発は、オレってばスゲー感が少ない? - バリケンのRuby日記   フレームワークを使っての開発は、オレってばスゲー感が少ない? - バリケンのRuby日記 のブックマークコメント

スラッシュドット ジャパン | フレームワークを使っての開発は、オレってばスゲー感が少ない?というエントリを見て思ったこと。

ほかのフレームワークは使ったことないから分からないけど、たぶんRuby on Railsd:id:umedamochioさんの言うところの「ウェブ・リテラシーを身に付けるための高速道路」なんだと思うよ。

あくまでもぼくのおすすめだけど、Ruby勉強するなら「たのしいRuby」を、

Rails勉強するなら「かんたんRuby on RailsWebアプリケーション開発」を、

かんたんRuby on RailsでWebアプリケーション開発

かんたんRuby on RailsでWebアプリケーション開発

それぞれきっちり読みこなせば、「インターネット上で新しいサービスを作るにはどうすればいいか」が見えてくると思うよ。

もちろん上で紹介した2冊を読みこなしただけでどんなサービスでも作れるわけじゃないけど、「頑張れば作れそうな感触」は持てると思うよ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070414

2007-04-02

[][][] mongrel_cluster  mongrel_cluster - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  mongrel_cluster - バリケンのRuby日記  mongrel_cluster - バリケンのRuby日記 のブックマークコメント

前回WindowsMongrelサービスとして登録する方法を解説したけど、LinuxでもWindows同様、Mongrelサービスとして登録できたら便利だよね。というわけで、今日LinuxMongrelサービスとして登録する「mongrel_cluster」を使ってみるよ。

「mongrel_cluster」は名前のとおり、本当は複数のMongrelを起動して負荷分散とセットで利用することを想定しているみたいだけど、サービスとして登録する機能が便利だから、ひとつしかMongrelを起動しないようなケースでも利用するといいと思うよ。

mongrel_clusterのインストール

コマンド一発、「gem install mongrel_cluster」でインストールできるよ。

Railsアプリ自動起動するユーザーを作成

Railsアプリサービスとして登録するなら、Railsアプリを起動するユーザーを専用で用意したほうが便利だよ。ここでは、www-dataグループrailsユーザーを作成したよ。

# adduser --ingroup www-data rails

www-dataユーザーからのファイル書き込みを許可するため、このユーザーのホームディレクトリに、グループ書き込み属性も追加しておくよ。

# chmod 775 /home/rails/

Railsアプリコピー

サービスとして登録したいRailsアプリを、/home/railsコピーするよ。ここでは例として、掲示板アプリ(bbs)をコピーしているよ。

# cp -R /home/your_home/rails/bbs/ /home/rails/
# chown -R rails:www-data /home/rails/bbs/

ちなみにSubversionを使ってRailsアプリのソースを管理しているなら、ファイルコピーの代わりにSubversionのリポジトリからチェックアウトすればいいと思うよ。

pidを書き込むディレクトリの作成

pidを書き込むディレクトリをあらかじめ作成して、www-dataグループの書き込み許可を与えておくよ。

# mkdir /var/run/mongrel
# chown www-data:www-data /var/run/mongrel/
# chmod 775 /var/run/mongrel/

mongrel_cluster.ymlのシンボリックリンクの作成

mongrel_cluster.ymlのシンボリックリンクを作成するよ(まだこの時点ではmongrel_cluster.ymlは存在しないけど、先に作っておくよ)。

# mkdir /etc/mongrel_cluster
# mkdir /etc/mongrel_cluster/bbs
# ln -s /home/rails/bbs/config/mongrel_cluster.yml /etc/mongrel_cluster/bbs

mongrel_clusterの設定

いったんrailsユーザーログインしたあと、bbsディレクトリに移動して次のコマンドを実行するよ。

$ cd bbs
$ mongrel_rails cluster::configure \
 -e production -p 4000 -a 0.0.0.0 -l /home/rails/bbs/log/mongrel.log \
 -P /var/run/mongrel/bbs.pid -c /home/rails/bbs \
 -r /home/rails/bbs -N 1 --user rails --group www-data

そうすると、config/mongrel_cluster.ymlが作成されるよ。

mongrel_clusterの起動と停止の確認

次のコマンドで、mongrel_clusterを起動してみてね。

$ mongrel_rails cluster::start

ブラウザhttp://linuxホストIPアドレス:4000/にアクセスして、きちんと動作していることを確認してね。停止は次のコマンドだよ。

$ mongrel_rails cluster::stop

サービスとして登録

じゃあ、いよいよサービスとして登録してみるよ。自動起動用のスクリプトを/etc/init.d/にコピーして、mongrel_cluster.ymlの場所を指定するように編集するよ。

# cp /opt/rubygems/gems/mongrel_cluster-0.2.1/resources/mongrel_cluster /etc/init.d/mongrel_cluster_bbs
# vi /etc/init.d/mongrel_cluster_bbs

CONF_DIRを「/etc/mongrel_cluster/bbs」にするよ。また、こちらを参考にして/opt以下にRuby on Railsインストールしている人は、RUBYLIB、GEM_HOME、PATHの指定も忘れずにね。

CONF_DIR=/etc/mongrel_cluster/bbs
RETVAL=0

export RUBYLIB=/opt/local/lib/site_ruby/1.8/
export GEM_HOME=/opt/rubygems/
export PATH=/opt/bin:/opt/rubygems/bin:$PATH

編集が終わったら、この起動スクリプトに実行許可属性を与えるよ。

# chmod 755 /etc/init.d/mongrel_cluster_bbs

じゃあ、起動してみよう!

# /etc/init.d/mongrel_cluster_bbs start

停止はstopだよ。

# /etc/init.d/mongrel_cluster_bbs stop

自動起動の設定

次のコマンドを実行すれば、Linuxの起動時に自動的に起動させることができるよ。

# update-rc.d mongrel_cluster_bbs defaults

demuyandemuyan2008/08/25 16:36mongrel_railsのオプションですが、-r /home/rails/bbs は -r /home/rails/bbs/publicではないでしょうか?