                                                                    Rubyとデータベースとの連携技術




    Rubyとデータベースとの連携技術
    Integration Technology of Ruby and Database




                                              鹿児島大学 学術情報基盤センター
                                              学術情報処理研究部門
                                              古屋 保
                                              furuya@cc.kagoshima-u.ac.jp
K-Ruby, July 28, 2011       © Tamotsu FURUYA, All rights reserved.                   1
                                                                Rubyとデータベースとの連携技術



 内容
    ●   1. データベース連携概要
    ●   2. MySQLバインディングによる連携
    ●   3. ActiveRecordによる連携




K-Ruby, July 28, 2011   © Tamotsu FURUYA, All rights reserved.                   2
                                                                          Rubyとデータベースとの連携技術



 1. データベース連携概要
    ●   RubyとMySQLデータベースとの連携
         –    データベース抽象レイヤを使用せず,直接バインディングを使
              用してみる.(SQLを記述する必要がある)
                   「mysql2」…MySQL用のバインディング
                    Gem(https://github.com/brianmario/mysql2)

                 #MySQLのバインディングをインストールする
                 $ gem install mysql2




K-Ruby, July 28, 2011             © Tamotsu FURUYA, All rights reserved.                   3
                                                                          Rubyとデータベースとの連携技術



 1. データベース連携概要
    ●   Rubyとデータベースとの連携
         –    ほとんどのDBMSと連携可能
                   MySQL,PostgreSQL,Oracle,Microsoft SQL
                    Server,DB2,SQLite
                   各データベースAPIへのバインディングをGemで提供
         –    データベース抽象レイヤ(ActiveRecord)
                   DBの違いを意識することなくコーディング可能.




K-Ruby, July 28, 2011             © Tamotsu FURUYA, All rights reserved.                   4
                                                                        Rubyとデータベースとの連携技術



 2. MySQLバインディングによる連携
    ●
        連携するデータベース(テーブル)
         –    「students」テーブル(予めmysqlツールで作成)
              mysql> use test;
              mysql> CREATE TABLE students (
              -> id CHAR(11) NOT NULL,
              -> name VARCHAR(40),
              -> e_mail VARCHAR(80),
              -> PRIMARY KEY (id)
              ->);




K-Ruby, July 28, 2011           © Tamotsu FURUYA, All rights reserved.                   5
                                                                     Rubyとデータベースとの連携技術



 2. MySQLバインディングによる連携
    ●
        プログラム例
         # -*- coding: utf-8 -*-
         require 'mysql2'

         # ユーザ dbuser で MySQL の test データベースに接続する.
         client = Mysql2::Client.new(
                        :host => "localhost",
                        :database => "test",
                        :username => "dbuser",
                        :password => "pass"
                  )
         # SQLを実行し結果セットを得る.
         results = client.query("SELECT * FROM students")




K-Ruby, July 28, 2011        © Tamotsu FURUYA, All rights reserved.                   6
                                                                     Rubyとデータベースとの連携技術



 2. MySQLバインディングによる連携
    ●
        プログラム例
         # 結果セットから全レコードのカラムの値をイテレータで取得する.
         results.each do |row|
           printf "%st%st%sn", row["id"],
                    row["name"], row["e_mail"]
         end

         # データベースと接続をクローズする.
         client.close



              $ ruby dbaccess.rb
              1234567891    鹿児島太郎          taro@kago.jp
              1234567892    薩摩花子           hana@kago.jp
              1234567893    西郷隆盛           taka@satsuma.jp



K-Ruby, July 28, 2011        © Tamotsu FURUYA, All rights reserved.                   7
                                                                   Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   ActiveRecord
         –    データベース抽象レイヤのモジュール
         –    Ruby on Railsを構成するライブラリ群の1つ
         –    O/Rマッピング(Object / Relation Mapping)ライブラリ




K-Ruby, July 28, 2011      © Tamotsu FURUYA, All rights reserved.                   8
                                                                Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   O/Rマッピング
         –    データベースのレコードとRubyのオブジェクトをマップする
         –    テーブルのフィールドが、オブジェクトの属性となり,フィー
              ルド名がそのままアクセサとして定義される.




K-Ruby, July 28, 2011   © Tamotsu FURUYA, All rights reserved.                   9
                                                                     Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   プログラム例(ActiveRecord編)
         # -*- coding: utf-8 -*-
         require 'active_record'
            # 1.8系
           # require 'rubygems'
           # require 'activerecord'

         # データベースとの接続
         ActiveRecord::Base.establish_connection(
             :adapter => 'mysql2', # 使用するDBはMySQLデータベース
             :host => 'localhost',
             :database => 'test',
             :username => 'dbuser',
             :password => 'pass'
         )

                                                                      (次のスライドへ続く...)
K-Ruby, July 28, 2011        © Tamotsu FURUYA, All rights reserved.                   10
                                                                     Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   プログラム例(ActiveRecord編)
         # O/Rマッピング
                                                             id,name,e_mail等の
                                                              id,name,e_mail等の
         class Student < ActiveRecord::Base
                                                            属性メソッドは定義してない
                                                            属性メソッドは定義してない
         end                                                のにも関わらず...
                                                            のにも関わらず...

         students = Student.find(:all)
         students.each do |res|
           printf "%st%st%sn", res.id, res.name, res.e_mail
         end


              $ ruby dbaccess.rb
              1234567891    鹿児島太郎          taro@kago.jp
              1234567892    薩摩花子           hana@kago.jp
              1234567893    西郷隆盛           taka@satsuma.jp



K-Ruby, July 28, 2011        © Tamotsu FURUYA, All rights reserved.                   11
                                                                 Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   Conversion over Configuration(CoC)
         –    「設定よりも規約」(Railsの哲学)
         –    XMLファイルなどのコンフィグはいらない
         –    すべては命名規約に従うこと




K-Ruby, July 28, 2011    © Tamotsu FURUYA, All rights reserved.                   12
                                                                       Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●    YAMLファイルの利用
          –   YAML (YAML Ain't Markup Language)
          –   構造化されたテキストフォーマット
          –   Railsでは config/database.yml で利用

        YAMLファイルの例: database.yml(MySQL用)
         development_test:
           adapter: mysql2
           host: localhost
           database: test
           username: dbuser
           password: pass
           socket: /opt/local/var/run/mysql5/mysqld.sock
           encoding: utf8
           pool: 5

K-Ruby, July 28, 2011          © Tamotsu FURUYA, All rights reserved.                   13
                                                                           Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   プログラム例(ActiveRecord,YAML利用)
         # -*- coding:utf-8 -*-
         require 'active_record'


         # YAMLを利用したデータベースの接続
         ActiveRecord::Base.configurations
                              = YAML.load_file('database.yml')
         ActiveRecord::Base.establish_connection('development_test')


         class Student < ActiveRecord::Base
         end


         students = Student.find(:all)
         students.each do |res|
           printf "%st%st%sn", res.id, res.name, res.e_mail
         end


K-Ruby, July 28, 2011              © Tamotsu FURUYA, All rights reserved.                   14
                                                                           Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   findメソッドの使用法
        例えば...
        result = Student.find(2)


        これは次のSQL文と同等である
        SELECT * FROM students WHERE id = 2

        ※プライマリキーフィールドは「id」というフィールド名でなければNG

        解決策
        class Student < ActiveRecord::Base
            set_table_name 'gakusei' # テーブル名は任意でもOK
            set_primary_key 's_code'    # プライマリキーは任意でもOK
        end



K-Ruby, July 28, 2011              © Tamotsu FURUYA, All rights reserved.                   15
                                                                           Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   もうSQLは書かなくても良い?
        さらに条件をつけて抽出したい場合は...
        result = Student.find(:all,
                        :conditions => [ 'name = ?', '鹿児島太郎' ])

        SELECT * FROM students WHERE name = '鹿児島太郎'


        find以外にも次のようなメソッドも準備されている...
        result = Student.find_by_name("鹿児島太郎")

        さらにレコードの新規追加も...

        student = Student.new(:id => '1234567894',
             :name =>"川内次郎", :e_mail => 'jiro@kago.jp')
        student.save

K-Ruby, July 28, 2011              © Tamotsu FURUYA, All rights reserved.                   16
                                                                    Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   ホントにSQLは書かなくても良い?

        複雑なクエリーは,直接SQLで書くことも可能...

        result = Student.find_by_sql("SELECT * FROM students
          WHERE name LIKE '%太郎%' AND e_mail LIKE '%jp%'")


         まとめ...
          ● 規約に従えばきちんとO/Rマッピングしてくれる.

          ●
            マッピングできれば用意されたメソッドで結果セットを得られる.
          ●
            結果セットから属性メソッドでフィールドデータを得られる.
          ● 極力SQLを書かなくて済む

          ●
            データベースをいつでも交換できる
         その他...
          ● DMLだけでなくDDLも可能(Migrationクラス)




K-Ruby, July 28, 2011       © Tamotsu FURUYA, All rights reserved.                   17
                                                                                 Rubyとデータベースとの連携技術



 4. おまけ
    ●    テーブルのJOIN

    students(学生)                                                subjects(科目)
            id           name        e_mail                          id              name         teacher
        1234567891      鹿児島太郎    taro@kago.jp                      S01     情報科学入門               山田太郎
        1234567892      薩摩花子     hana@kago.jp                      S02     エンドユーザ実習             鈴木一郎
        1234567893      西郷隆盛     taka@kago.jp                      S03     応用数学                 松井秀喜

                         1                                                                  1

                                courses(履修)
                                   student_id           subject_id          rating
                                 1234567891       S02                      A
                                 1234567891       S03                      B
                             多   1234567892       S01                      C          多
                                 1234567893       S02                      B




K-Ruby, July 28, 2011                    © Tamotsu FURUYA, All rights reserved.                             18
                                                                                Rubyとデータベースとの連携技術



 4. おまけ
    ●
        結合ビュー

                 student_id     name               subject_id                   name   rating
              1234567891      鹿児島太郎          S02                      エンドユーザ実習         A
              1234567891      鹿児島太郎          S03                      応用数学             B
              1234567892      薩摩花子           S01                      情報科学入門           C
              1234567893      西郷隆盛           S02                      エンドユーザ実習         B




         mysql>         SELECT student_id, students.name, subject_id, 
             ->         subjects.name, rating
             ->         FROM students JOIN (courses JOIN subjects
             ->         ON courses.subject_id = subjects.id )
             ->         ON students.id = courses.student_id;


K-Ruby, July 28, 2011                  © Tamotsu FURUYA, All rights reserved.                    19
                                                                                 Rubyとデータベースとの連携技術



 4. おまけ
    ●    テーブルのJOIN

    students(学生)                                                subjects(科目)
            id           name        e_mail                          id              name           teacher
        1234567891      鹿児島太郎    taro@kago.jp                      S01     情報科学入門               山田太郎
        1234567892      薩摩花子     hana@kago.jp                      S02     エンドユーザ実習             鈴木一郎
        1234567893      西郷隆盛     taka@kago.jp                      S03     応用数学                 松井秀喜

    has_many :course                                                                        has_many :course
                                courses(履修)
                                   student_id           subject_id          rating
                                 1234567891       S02                      A
                                 1234567891       S03                      B
        belongs_to :student      1234567892       S01                      C          belongs_to :subject
                                 1234567893       S02                      B




K-Ruby, July 28, 2011                    © Tamotsu FURUYA, All rights reserved.                                20
                                                                    Rubyとデータベースとの連携技術



 4. おまけ
    ●
        テーブル間リレーションを意識した定義

         class Student < ActiveRecord::Base
             has_many :course
         end

         class Subject < ActiveRecord::Base
             has_many :course
         End

         class Course < ActiveRecord::Base
             belongs_to :student
             belongs_to :subject
         end



K-Ruby, July 28, 2011       © Tamotsu FURUYA, All rights reserved.                   21
                                                                  Rubyとデータベースとの連携技術



 4. おまけ
    ●
        結合結果の出力

    courses = Course.find(:all, :include => [:student, :subject])
    courses.each do |res|
       printf "%st%st%st%st%sn",
        res.student_id, res.student.name,
       res.subject_id, res.subject.name, res.rating
    end



     $ ruby dbaccess.rb
     1234567891   鹿児島太郎   S02       エンドユーザ実習                         A
     1234567891   鹿児島太郎   S03       応用数学                             B
     1234567892   薩摩花子    S01       情報科学入門                           C
     1234567893   西郷隆盛    S02       エンドユーザ実習                         B


K-Ruby, July 28, 2011     © Tamotsu FURUYA, All rights reserved.                   22

Integration Technology of Ruby and DB.

  • 1.
    Rubyとデータベースとの連携技術 Rubyとデータベースとの連携技術 Integration Technology of Ruby and Database 鹿児島大学 学術情報基盤センター 学術情報処理研究部門 古屋 保 furuya@cc.kagoshima-u.ac.jp K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 1
  • 2.
    Rubyとデータベースとの連携技術 内容 ● 1. データベース連携概要 ● 2. MySQLバインディングによる連携 ● 3. ActiveRecordによる連携 K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 2
  • 3.
    Rubyとデータベースとの連携技術 1. データベース連携概要 ● RubyとMySQLデータベースとの連携 – データベース抽象レイヤを使用せず,直接バインディングを使 用してみる.(SQLを記述する必要がある)  「mysql2」…MySQL用のバインディング Gem(https://github.com/brianmario/mysql2) #MySQLのバインディングをインストールする $ gem install mysql2 K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 3
  • 4.
    Rubyとデータベースとの連携技術 1. データベース連携概要 ● Rubyとデータベースとの連携 – ほとんどのDBMSと連携可能  MySQL,PostgreSQL,Oracle,Microsoft SQL Server,DB2,SQLite  各データベースAPIへのバインディングをGemで提供 – データベース抽象レイヤ(ActiveRecord)  DBの違いを意識することなくコーディング可能. K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 4
  • 5.
    Rubyとデータベースとの連携技術 2. MySQLバインディングによる連携 ● 連携するデータベース(テーブル) – 「students」テーブル(予めmysqlツールで作成) mysql> use test; mysql> CREATE TABLE students ( -> id CHAR(11) NOT NULL, -> name VARCHAR(40), -> e_mail VARCHAR(80), -> PRIMARY KEY (id) ->); K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 5
  • 6.
    Rubyとデータベースとの連携技術 2. MySQLバインディングによる連携 ● プログラム例 # -*- coding: utf-8 -*- require 'mysql2' # ユーザ dbuser で MySQL の test データベースに接続する. client = Mysql2::Client.new( :host => "localhost", :database => "test", :username => "dbuser", :password => "pass" ) # SQLを実行し結果セットを得る. results = client.query("SELECT * FROM students") K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 6
  • 7.
    Rubyとデータベースとの連携技術 2. MySQLバインディングによる連携 ● プログラム例 # 結果セットから全レコードのカラムの値をイテレータで取得する. results.each do |row| printf "%st%st%sn", row["id"], row["name"], row["e_mail"] end # データベースと接続をクローズする. client.close $ ruby dbaccess.rb 1234567891 鹿児島太郎 taro@kago.jp 1234567892 薩摩花子 hana@kago.jp 1234567893 西郷隆盛 taka@satsuma.jp K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 7
  • 8.
    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● ActiveRecord – データベース抽象レイヤのモジュール – Ruby on Railsを構成するライブラリ群の1つ – O/Rマッピング(Object / Relation Mapping)ライブラリ K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 8
  • 9.
    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● O/Rマッピング – データベースのレコードとRubyのオブジェクトをマップする – テーブルのフィールドが、オブジェクトの属性となり,フィー ルド名がそのままアクセサとして定義される. K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 9
  • 10.
    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● プログラム例(ActiveRecord編) # -*- coding: utf-8 -*- require 'active_record' # 1.8系 # require 'rubygems' # require 'activerecord' # データベースとの接続 ActiveRecord::Base.establish_connection( :adapter => 'mysql2', # 使用するDBはMySQLデータベース :host => 'localhost', :database => 'test', :username => 'dbuser', :password => 'pass' ) (次のスライドへ続く...) K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 10
  • 11.
    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● プログラム例(ActiveRecord編) # O/Rマッピング id,name,e_mail等の id,name,e_mail等の class Student < ActiveRecord::Base 属性メソッドは定義してない 属性メソッドは定義してない end のにも関わらず... のにも関わらず... students = Student.find(:all) students.each do |res| printf "%st%st%sn", res.id, res.name, res.e_mail end $ ruby dbaccess.rb 1234567891 鹿児島太郎 taro@kago.jp 1234567892 薩摩花子 hana@kago.jp 1234567893 西郷隆盛 taka@satsuma.jp K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 11
  • 12.
    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● Conversion over Configuration(CoC) – 「設定よりも規約」(Railsの哲学) – XMLファイルなどのコンフィグはいらない – すべては命名規約に従うこと K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 12
  • 13.
    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● YAMLファイルの利用 – YAML (YAML Ain't Markup Language) – 構造化されたテキストフォーマット – Railsでは config/database.yml で利用 YAMLファイルの例: database.yml(MySQL用) development_test: adapter: mysql2 host: localhost database: test username: dbuser password: pass socket: /opt/local/var/run/mysql5/mysqld.sock encoding: utf8 pool: 5 K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 13
  • 14.
    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● プログラム例(ActiveRecord,YAML利用) # -*- coding:utf-8 -*- require 'active_record' # YAMLを利用したデータベースの接続 ActiveRecord::Base.configurations = YAML.load_file('database.yml') ActiveRecord::Base.establish_connection('development_test') class Student < ActiveRecord::Base end students = Student.find(:all) students.each do |res| printf "%st%st%sn", res.id, res.name, res.e_mail end K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 14
  • 15.
    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● findメソッドの使用法 例えば... result = Student.find(2) これは次のSQL文と同等である SELECT * FROM students WHERE id = 2 ※プライマリキーフィールドは「id」というフィールド名でなければNG 解決策 class Student < ActiveRecord::Base set_table_name 'gakusei' # テーブル名は任意でもOK set_primary_key 's_code' # プライマリキーは任意でもOK end K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 15
  • 16.
    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● もうSQLは書かなくても良い? さらに条件をつけて抽出したい場合は... result = Student.find(:all, :conditions => [ 'name = ?', '鹿児島太郎' ]) SELECT * FROM students WHERE name = '鹿児島太郎' find以外にも次のようなメソッドも準備されている... result = Student.find_by_name("鹿児島太郎") さらにレコードの新規追加も... student = Student.new(:id => '1234567894', :name =>"川内次郎", :e_mail => 'jiro@kago.jp') student.save K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 16
  • 17.
    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● ホントにSQLは書かなくても良い? 複雑なクエリーは,直接SQLで書くことも可能... result = Student.find_by_sql("SELECT * FROM students WHERE name LIKE '%太郎%' AND e_mail LIKE '%jp%'") まとめ... ● 規約に従えばきちんとO/Rマッピングしてくれる. ● マッピングできれば用意されたメソッドで結果セットを得られる. ● 結果セットから属性メソッドでフィールドデータを得られる. ● 極力SQLを書かなくて済む ● データベースをいつでも交換できる その他... ● DMLだけでなくDDLも可能(Migrationクラス) K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 17
  • 18.
    Rubyとデータベースとの連携技術 4. おまけ ● テーブルのJOIN students(学生) subjects(科目) id name e_mail id name teacher 1234567891 鹿児島太郎 taro@kago.jp S01 情報科学入門 山田太郎 1234567892 薩摩花子 hana@kago.jp S02 エンドユーザ実習 鈴木一郎 1234567893 西郷隆盛 taka@kago.jp S03 応用数学 松井秀喜 1 1 courses(履修) student_id subject_id rating 1234567891 S02 A 1234567891 S03 B 多 1234567892 S01 C 多 1234567893 S02 B K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 18
  • 19.
    Rubyとデータベースとの連携技術 4. おまけ ● 結合ビュー student_id name subject_id name rating 1234567891 鹿児島太郎 S02 エンドユーザ実習 A 1234567891 鹿児島太郎 S03 応用数学 B 1234567892 薩摩花子 S01 情報科学入門 C 1234567893 西郷隆盛 S02 エンドユーザ実習 B mysql> SELECT student_id, students.name, subject_id,  -> subjects.name, rating -> FROM students JOIN (courses JOIN subjects -> ON courses.subject_id = subjects.id ) -> ON students.id = courses.student_id; K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 19
  • 20.
    Rubyとデータベースとの連携技術 4. おまけ ● テーブルのJOIN students(学生) subjects(科目) id name e_mail id name teacher 1234567891 鹿児島太郎 taro@kago.jp S01 情報科学入門 山田太郎 1234567892 薩摩花子 hana@kago.jp S02 エンドユーザ実習 鈴木一郎 1234567893 西郷隆盛 taka@kago.jp S03 応用数学 松井秀喜 has_many :course has_many :course courses(履修) student_id subject_id rating 1234567891 S02 A 1234567891 S03 B belongs_to :student 1234567892 S01 C belongs_to :subject 1234567893 S02 B K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 20
  • 21.
    Rubyとデータベースとの連携技術 4. おまけ ● テーブル間リレーションを意識した定義 class Student < ActiveRecord::Base has_many :course end class Subject < ActiveRecord::Base has_many :course End class Course < ActiveRecord::Base belongs_to :student belongs_to :subject end K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 21
  • 22.
    Rubyとデータベースとの連携技術 4. おまけ ● 結合結果の出力 courses = Course.find(:all, :include => [:student, :subject]) courses.each do |res| printf "%st%st%st%st%sn", res.student_id, res.student.name, res.subject_id, res.subject.name, res.rating end $ ruby dbaccess.rb 1234567891 鹿児島太郎 S02 エンドユーザ実習 A 1234567891 鹿児島太郎 S03 応用数学 B 1234567892 薩摩花子 S01 情報科学入門 C 1234567893 西郷隆盛 S02 エンドユーザ実習 B K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 22