Contenu connexe
Similaire à Summary of Ruby
Similaire à Summary of Ruby (20)
Summary of Ruby
- 1. Rubyの概要
Rubyの概要
Summary of Ruby as Programming Language
2011年05月26日
鹿児島大学 学術情報基盤センター
学術情報処理研究部門
古屋 保
furuya@cc.kagoshima-u.ac.jp
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 1
- 2. Rubyの概要
内容
1. Rubyとは
2. Rubyの処理系
3. Rubyのセットアップ
4. スクリプトの作成と実行
5. 基本文法
6. クラスについて
7. Ruby on Rails
8. おわりに
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 2
- 3. Rubyの概要
1. Rubyとは
● Rubyとは
– まつもとゆきひろ(通称Matz)さんによって開発されたオブ
ジェクト指向スクリプト言語
– 1993年開発開始〜1995年12月にfj上で発表された.
– 主な適用分野
テキスト処理
システム管理
ネットワーク・プログラミング
Webアプリケーション開発
(Ruby on Rails)
– もちろんフリーソフトウエア
出典: オブジェクト指向スクリプト言語 Ruby, URL http://www.ruby-lang.org/ja/
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 3
- 4. Rubyの概要
1. Rubyとは
● Rubyの特徴
– オブジェクト指向言語
数値などプリミティブなものも含めて,すべてのデータがオブ
ジェクトである.
多重継承に代わるMix-in機能を持つ
豊富なクラスライブラリ
– マルチスレッド,GC,正規表現のサポート
– 簡潔な文法
型宣言が不要
ブロック付きメソッド,イテレータ
「より良いPerl」,「ALGOLの皮を被ったLisp」などと呼ばれる
「より良いPerl」,「ALGOLの皮を被ったLisp」などと呼ばれる
参考: Yugui,初めてのRuby,オライリージャパン
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 4
- 5. Rubyの概要
2. Rubyの処理系
● Rubyの処理系
– MRI(Matz's Ruby Implementation)
Matz自身によって開発されていた公式実装
C言語による実装(CRuby)で最も使用されている
バージョン1.8系統と1.9系統が混在中
– YARV(Yet Another Ruby VM)
笹田耕一氏(東大大学院)により開発された処理系
バイトコードインタプリタ
● JIT方式でバイトコードにコンパイルされ,VM上で実行
Ruby 1.9以降よりMRIに正式組込み
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 5
- 6. Rubyの概要
2. Rubyの処理系
●
主なその他の実装
– JRuby
Javaベースの実装のためプラットフォーム非依存
(JavaでRubyランタイムインタプリタを実装)
JavaだけでRubyスクリプトが実行可能
RubyからJava APIが使用可能
– IronRuby
.NET Framework上で動作する実装(JScriptと同様)
DLR(Dynamic Language Runtime)上でRubyをサポート
– MacRuby
Objective-Cで書かれた実装(Mac OS X上で動作)
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 6
- 7. Rubyの概要
2. Rubyの処理系
● MRIバージョン体系
– 1.8系統
2003年8月に1.8.0をリリース,2011年5月現在1.8.7
現在広く利用されている,1.8系でしか動作しないライブラリも
存在
– 1.9系統
2007年12月に1.9.0をリリース,2011年5月現在1.9.2
評価器を書き直すことで実行効率を向上
Multilingualization(M17N)多数の文字エンコーディング
RubyGems,Rakeが標準添付
「夢のRuby2.0」への足がかり
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 7
- 8. Rubyの概要
2. Rubyの処理系
●
実行モデル
– 1.8系統
ソースコードを解析して構文木を構築
構文木を巡りながらプログラムを実行
– 1.9系統
ソースコードを解析して構文木を構築
構文木をバイトコードに変換する
独自の仮想マシン(YARV)で実行
参考: Yugui,初めてのRuby,オライリージャパン
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 8
- 9. Rubyの概要
3. Rubyのセットアップ
● Windows用 RubyInstaller
– サイトURL http://rubyinstaller.org/
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 9
- 10. Rubyの概要
3. Rubyのセットアップ
● yum
– RPM系Linux(RedHat Linux,Fedora,CentOS等)
– # yum install ruby
● apt
– Debian GNU Linux ,Ubuntu Linux,Vine Linux等
– $ sudo apt-get install ruby
●
MacPorts
– $ sudo port install ruby19 +nosuffix
– $ /opt/local/bin/ruby -v ==> Ruby 1.9
– $ /usr/bin/ruby -v ==> システムのRuby(Ver.1.8)
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 10
- 11. Rubyの概要
3. Rubyのセットアップ
● RubyGems
– Rubyのパッケージ管理システム
– Ruby 1.9より標準添付(1.8系では別パッケージ)
– PerlのCPANに似ている
– 外部ライブラリを簡単に導入,管理可能.
# Railsライブラリをインストールする
$ gem install rails
# インストール済みのライブラリを表示する
$ gem list
# ライブラリを検索する
$ gem list -r sqlite
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 11
- 12. Rubyの概要
3. Rubyのセットアップ
● RVM(Ruby Version Manager)
– 複数のRuby環境を構築できるツール
– 1.8系統と1.9系統の環境を簡単に切り替え可能
– RVMのインストール方法
Webサイト(http://rvm.beginrescueend.com/)に記載
# RVMを使用して1.9系統をインストール
$ rvm install ruby-1.9.2
# RVMを使用して1.8系統をインストール
$ rvm install ruby-1.8.7
# 1.9系統環境を利用する
$ rvm use ruby-1.9.2
# 1.8系統環境を利用する
$ rvm use ruby-1.8.7
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 12
- 13. Rubyの概要
4. スクリプトの作成と実行
●
簡潔な文法
– おまじない一切なし,いきなり書き始められる.
– Javaと異なり,必ずしもクラスを定義する必要はない.
– 式と式の区切りは改行だけでOK.(一応,セミコロン「;」
も利用可能)
– 自動的にファイルを閉じる(ブロック付きメソッド).
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
puts "Hello World!"
"こんにちは,世界!n".display
※1行目の「#!/usr/bin/ruby」はSheBang
※2行目は文字エンコーディングにUTF-8を指定している(マジックコメント)
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 13
- 14. Rubyの概要
4. スクリプトの作成と実行
● Rubyの実行
– インタプリタの実行
シェル上で実行する
– 対話的実行環境(irb: interactive ruby)
# Rubyプログラムの実行
$ ruby hello.rb
# irbの実行
$ irb
irb(main):001:0> Time.now
=> 2011-05-23 11:22:55 +0900
irb(main):002:0> quit
$
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 14
- 15. Rubyの概要
4. スクリプトの作成と実行
●
プログラムの簡潔さについて
– 次の課題をJava,Rubyそれぞれで実現させる場合のソースを
比較してみる.
課題1行ごとに数値が記録されている任意のテキストファイルを
読み込み,そこに記録されている数値をすべて2倍にした値を画
面に出力させなさい.
テキストファイル例(data.txt) 実行例
10 $ PROG data.txt
20 20
30 40
40 60
50 80
100
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 15
- 16. Rubyの概要
4. スクリプトの作成と実行
● プログラム例(Javaの場合)
import java.io.*;
class Hoge {
public static void main(String[] args) {
String fname = args[0];
try{
BufferedReader br = new BufferedReader(
new FileReader(fname));
while ((String line = br.readLine()) != null)
System.out.println(Integer.parseInt(line) * 2);
br.close();
} catch (IOException e) {}
}
}
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 16
- 17. Rubyの概要
4. スクリプトの作成と実行
● プログラム例(Rubyの場合)
fname = ARGV[0]
File::open(fname) { |f|
f.each do |line|
puts line.to_i * 2
end
}
$ ruby hoge.rb data.txt
20
40
60
80
100
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 17
- 18. Rubyの概要
5. 基本文法
●
型宣言が不要(動的型付け言語)
– ポリモーフィズム(多様性,多態性)
データ型が異なっても同様に処理が可能
# 変数 i に整数を代入する
i = 6
# 文字列の代入も可能
i = "Hello"
# 文字列の長さを求める
puts i.size #=> 3
# 配列の代入も可能
i = [1, 2, 3, 4, 5]
puts i.size #=> 3
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 18
- 19. Rubyの概要
5. 基本文法
●
すべてのデータがオブジェクト
– 数値や文字列等の基本的なデータもオブジェクト
# 通常の変数への文字列の代入
str1 = "hello"
str2 = "hello"
# それぞれのオブジェクトIDを確認
str1.object_id #=> 2152236160
str2.object_id #=> 2152228620
# 文字列の中身自体は等しい
str1 == str2 #=> true
# オブジェクトは異なる
str1.equal?(str2) #=> false
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 19
- 20. Rubyの概要
5. 基本文法
●
ブロック付きメソッド
– メソッドの呼び出しの後にブロックを付ける事が可能
object.method名 ( 引数1, … ) do | 変数 |
…中略…
end
object.method名 ( 引数1, … ) { | 変数 |
…中略…
}
a = [1,2,3,4]
a.each do |i| a = [1,2,3,4]
puts i b = a.map {|i| i * 2}
end
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 20
- 21. Rubyの概要
5. 基本文法
●
データ型について
– 基本的なデータ型に加えて,配列型,範囲型,ハッシュ型が
ある.
a = 100 # 数値型
b = "Hello" # 文字列型
c = [1, 2, 3] # 配列型
d = 1..3 # 範囲型
# ハッシュ型
e = {"Apr" => 4, "May" => 5, "Jun" => 6}
e = {:Apr => 4, :May => 5, :Jun => 6}
puts e[:May] #=> 5
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 21
- 22. Rubyの概要
5. 基本文法
●
数値リテラルについて
– 多倍長整数をサポート(メモリが許す限り幾らでも大きな整
数を表現可能)
– 実数値はIEEE754の倍精度浮動小数点数(少なくとも仮数部
52bit,指数部11bitの精度)
– 整数のサイズ,実数の精度,共にシステムに依存
a = 2**64 # 2の64乗
puts a #=> 18446744073709551616
a = 1.0 / 3
printf("%.20fn", a) #=> 0.33333333333333331483
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 22
- 23. Rubyの概要
5. 基本文法
●
文字列リテラルとシンボル(唯一性を維持)
# 結合と反復
puts "hello " + "world!" #=> "hello world!"
puts "hello " * 3 #=> "hello hello hello "
# 通常の変数への文字列(シンボル)の代入
str1 = :hello
str2 = :hello
# 値(文字列)は等しい
str1 == str2 #=> true
# オブジェクトも等しい(同一)
str1.equal?(str2) #=> true
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 23
- 24. Rubyの概要
5. 基本文法
●
変数について
– 接頭文字により,インスタンス変数やクラス変数等を識別.
– 変数は値ではなくオブジェクトへの参照を保持する.
VAR = "constant" # 定数
$var = "global variable" # グローバル変数
var = "local variable" # ローカル変数
@var = "instance variable" # インスタンス変数
@@var = "class variable" # クラス変数
デフォルト値について
●
インスタンス変数とグローバル変数は,nil(値がないことを示す値)
●
他の変数はすべて参照する前に代入が必要
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 24
- 25. Rubyの概要
5. 基本文法
●
配列について
– 配列は変数同様オブジェクトへの参照を保持する.
– v[0]は,実際はv[](0)というArray#[]メソッドである.
v = [31,"foo",7,"hoge"] # 配列リテラル
p v[1] #=> "foo" …添字参照
p v[-2] #=> 7 …負の添字も可能
v[1] = "boo" #=> [31,"boo",7,"hoge"] …添字代入
v[1,2] = "zoo",5 #=> [31,"zoo",5,"hoge"]
arr = ["C","D","B","A"]
p arr.sort #=> ["A","B","C","D"]
arr.sort! #=> ["A","B","C","D"] 破壊的メソッド
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 25
- 26. Rubyの概要
5. 基本文法
●
イテレータ
– for文,while文よりもイテレータを多用.
– each,times,upto,loop等がある.
eachメソッド timesメソッド
[1, 2, 3].each do |i| 3.times do |i|
puts "Hello.#{i}" puts "Hello.#{i}"
end end
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 26
- 27. Rubyの概要
5. 基本文法
●
メソッド
– すべてのメソッドは少なくとも1つのオブジェクトと対応
メソッドの定義例 メソッドの定義例(多値の返却)
def kasan(x, y) def my_method(x)
x + y return x, 1, 2
end end
puts kasan(3, 5) a, *b = my_method(0)
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 27
- 28. Rubyの概要
5. 基本文法
●
メソッド
– ブロック付きメソッド
ブロック付きメソッドの呼び出し例 ブロック付きメソッドの定義例
a, b = "apple", "banana" def my_method
[1,2,3].each do |a| yield "apple"
a, b = 1, 2 yield "banana"
end end
puts a, b my_method do |i|
p i
#=> "apple" end
2
#=> "apple"
"banana"
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 28
- 29. Rubyの概要
6. クラスについて
●
クラスの定義
– クラス階層は単一階層(トップはObjectクラス※)
– コンストラクタは initialize メソッド
class Person
def initialize
puts "INIT."
@b_year = 1986
end
def foo
puts @b_year
end
end
p1 = Person.new #=> "INIT."
p1.foo #=> 1986
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 29
- 30. Rubyの概要
6. クラスについて
●
継承(サブクラス化)
– class文に「<」とスーパークラス名を追加
class Person
def foo
puts "Hello!" 「Person」クラスの
end サブクラス「Worker」
end を定義
class Worker < Person
end
w1 = Worker.new
w1.foo #=> "Hello!"
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 30
- 31. Rubyの概要
6. クラスについて
●
(継承ではなく)クラス定義を追加可能.
class Person
def foo
puts "Hello!"
end 以前のクラス定義を
end 破棄する事なく,
class Person 新たな機能を追加定義
def foo することが可能
puts "Good bye"
end
end
p1 = Person.new
p1.foo #=> "Good bye"
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 31
- 32. Rubyの概要
6. クラスについて
●
オープンクラス
– 既に定義されているクラスに後から機能を追加可能.
– (場合によっては)標準クラスも書き換え可能.
class String まずは「length」メソッド
undef length は無かったことにする.
def lengchu
return 12345 新たに「lengchu」メソッ
end ドを追加してみる.
end
p "hello".length #=> エラー
p "hello".lengchu #=> 12345
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 32
- 33. Rubyの概要
6. クラスについて
●
モジュール
– Mix-inとして使用される(多重継承の代わり)
module SatsumaImo
モジュールの定義
def msg (インスタンス化は不可)
puts "..Imo.."
end
end モジュールを使用する際は
include する
class Shouchu < Osake
include KomeKouji, SatsumaImo
end
s1 = Shouchu.new
s1.msg #=> "..Imo.."
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 33
- 34. Rubyの概要
7. Ruby on Rails
● Ruby on Rails(以下,Rails)とは
– RubyによるWebアプリケーションフレームワーク
– ライブラリとユーティリティプログラムのパッケージ
– デンマークのDavid Heinemeier Hansson氏(通称DHH)によっ
て開発
– MVC(Model-View-Controller)アーキテクチャをサポート
– オープンソースウエアである
– RubyGemsにより配布されている
– Twitter※注,Groupon,楽天
参考: Ruby on Rails URL http://rubyonrails.org/
※注 最近ではバックエンドやインフラを「Scala」に置き換えている
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 34
- 35. Rubyの概要
7. Ruby on Rails
● Railsの全体概要
Railsは,これら複数のライブラリからなる
フルスタックフレームワークである.
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 35
- 36. Rubyの概要
7. Ruby on Rails
● Railsアプリケーション作成概要
– まずは,railsコマンドでスケルトン作成
– コマンド「rails new アプリケーション名」で作成可能.
# Railsアプリケーションのスケルトン作成
$ rails new blog
create
create README
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
create app/controllers/
:
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 36
- 37. Rubyの概要
7. Ruby on Rails
● Railsアプリケーション作成概要
– Webサーバ機能
コマンド「rails server」でRails付属のWebサーバが起動.
# 作成されたディレクトリに移動
$ cd blog
# アプリに必要なGemをインストール
$ bundle install
# Webサーバの起動
$ rails server
=> Booting WEBrick
=> Rails 3.0.4 application starting in ...
=> Call with -d to detach
=> Ctrl-C to shutdown server
: http://localhost:3000/
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 37
- 38. Rubyの概要
7. Ruby on Rails
● Railsアプリケーション作成概要
– Scaffold
データベース内のデータの登録,読み込み,更新,削除(CRUD
操作)のために必要なコード(モデル,コントローラ,ビュー
のセット)を生成するしくみ
# Railsコマンドでscaffoldを利用する
$ rails generate scaffold Post name:string title:string
content:text
invoke active_record
create db/migrate/20110309010212_create_posts.rb
create app/models/post.rb
invoke test_unit
create 15個程度のファイル(モデル
test/unit/post_test.rb
: やビューなどのプログラム
コード)を作成
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 38
- 39. Rubyの概要
7. Ruby on Rails
● Railsアプリケーション作成概要
– rake(ビルドツール,MakeのRuby版)でデータベースのマイ
グレーションを行う.
# rakeコマンドでDBマイグレーションの実行
$ rake db:migrate
== CreatePosts: migrating ================
-- create_table(:posts)
-> 0.0021s
== CreatePosts: migrated (0.0022s) =======
postsテーブルを自動生成
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 39
- 40. Rubyの概要
7. Ruby on Rails
● O/Rマッピング
– DBのレコードとRubyのオブジェクトをマップする.
– テーブルのフィールドが,オブジェクトの属性となり,フィー
ルド名がそのままアクセサとして定義される.
– ActiveRecord(DB抽象レイヤモジュール)の機能
Postオブジェクト postsテーブル
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 40
- 41. Rubyの概要
7. Ruby on Rails
● Railsアプリケーション作成概要
– 既にCRUDアプリケーションは完成している.
http://localhost:3000/posts
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 41
- 42. Rubyの概要
7. Ruby on Rails
● Railsアプリケーション作成概要
– 既にCRUDアプリケーションは完成している.
実際のテーブルには,
レコード追加時のタイム
スタンプまで保存されて
いる.
$ rails dbconsole
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from posts;
1|鹿児島太郎|はじめまして|こんにちは,初めての書き込み.|2011-05-24 09:43:31....
2|薩摩花子|こんにちは|よろしくお願いします.|2011-05-24 09:44:02.458322|201....
sqlite>
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 42
- 43. Rubyの概要
8. おわりに
● Rubyの利用状況
– 2010年10月現在,デプロイ
されているRubyのバージョ
ンの統計
– 1.9系への移行メリット
多言語化
VMによる高速化
– 懸念材料
1.9未対応のライブラリが
存在する.
出典: RailsLab .:. State of the Stack: A Ruby on Rails Benchmarking Report - 05 October 2010
URL http://railslab.newrelic.com/2010/10/05/state-of-the-stack-a-ruby-on-rails-benchmarking-report-05-october-2010
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 43
- 44. Rubyの概要
8. おわりに
● Railsの利用状況
– 2010年10月現在,デプロイ
されているRailsのバージョ
ンの統計
– Rails3への移行メリット
HTML5へのいち早い対応
jQueryも正式サポート
Ruby1.9への本格対応
パフォーマンスの向上
柔軟なカスタマイズ性
参考: 松田明著「詳解Rails3」WEB+DB PRESS Vol.58 技術評論社
出典: RailsLab .:. State of the Stack: A Ruby on Rails Benchmarking Report - 05 October 2010
URL http://railslab.newrelic.com/2010/10/05/state-of-the-stack-a-ruby-on-rails-benchmarking-report-05-october-2010
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 44
- 45. Rubyの概要
8. おわりに
●
まとめ
– Rubyは純粋なオブジェクト指向言語である.
– すべてのデータがオブジェクトである.
– 予約語あるいは演算子の様で実はメソッド
(例 include, 1+2, a[0],等)
– Conversion over Configuration(設定より規約)
– Ruby1.8からRuby1.9へ,Rails2からRails3へのバージョン移行の
問題
– 公式実装MRI(cRuby)が先を行っているが,JRubyも気になる
存在.
– とにかく,プログラミングしていて楽しい!
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 45
- 46. Rubyの概要
9. おまけ
●
プログラミング例
$ irb --simple-prompt
>> p 3.14156.round(2)
=> 3.14
>> require 'active_support/all'
=> true
>> Time.now
=> 2011-05-24 19:16:52 +0900
>> p 2.weeks.ago
=> 2011-05-10 19:17:03 +0900
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 46
- 47. Rubyの概要
9. おまけ
●
プログラミング例
>> "student".pluralize
=> "students"
>> "ruby".pluralize
=> "rubies"
>> %w[apple banana orange].sample(1)
=> ["orange"]
>> %w[apple banana orange].sample(1)
=> ["apple"]
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 47
- 48. Rubyの概要
9. おまけ
●
プログラミング例
def fact(n)
if n == 1
1
else
n * fact(n - 1)
end
end
print "20!=", fact(20)
#=> 20!=2432902008176640000
(1..20).reduce{|s, x| s * x}
(1..20).reduce(:*)
参考: まつもとゆきひろ,Rubyビジネスの将来
May 26, 2011 © Tamotsu FURUYA, All rights reserved. 48