Upload
tamotsu-furuya
View
1.159
Download
8
Tags:
Embed Size (px)
DESCRIPTION
Rubyの概要
Citation preview
Rubyの概要Rubyの概要
1© Tamotsu FURUYA, All rights reserved.May 26, 2011
RubyRubyの概要の概要Summary of Ruby as Programming Language
2011年05月26日鹿児島大学 学術情報基盤センター学術情報処理研究部門古屋 保[email protected]
Rubyの概要Rubyの概要
2© Tamotsu FURUYA, All rights reserved.May 26, 2011
内容内容1. Rubyとは2. Rubyの処理系3. Rubyのセットアップ4. スクリプトの作成と実行5. 基本文法6. クラスについて7. Ruby on Rails
8. おわりに
Rubyの概要Rubyの概要
3© Tamotsu FURUYA, All rights reserved.May 26, 2011
1. Ruby1. Rubyとはとは● Rubyとは
– まつもとゆきひろ(通称Matz)さんによって開発されたオブジェクト指向スクリプト言語
– 1993年開発開始〜1995年12月にfj上で発表された.– 主な適用分野
テキスト処理 システム管理 ネットワーク・プログラミング Webアプリケーション開発
(Ruby on Rails)– もちろんフリーソフトウエア
出典: オブジェクト指向スクリプト言語 Ruby, URL http://www.ruby-lang.org/ja/
Rubyの概要Rubyの概要
4© Tamotsu FURUYA, All rights reserved.May 26, 2011
1. Ruby1. Rubyとはとは● Rubyの特徴
– オブジェクト指向言語 数値などプリミティブなものも含めて,すべてのデータがオブ
ジェクトである. 多重継承に代わるMix-in機能を持つ 豊富なクラスライブラリ
– マルチスレッド,GC,正規表現のサポート– 簡潔な文法
型宣言が不要 ブロック付きメソッド,イテレータ
「より良いPerl」,「ALGOLの皮を被ったLisp」などと呼ばれる「より良いPerl」,「ALGOLの皮を被ったLisp」などと呼ばれる参考: Yugui,初めてのRuby,オライリージャパン
Rubyの概要Rubyの概要
5© Tamotsu FURUYA, All rights reserved.May 26, 2011
2. Ruby2. 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に正式組込み
Rubyの概要Rubyの概要
6© Tamotsu FURUYA, All rights reserved.May 26, 2011
2. Ruby2. 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上で動作)
Rubyの概要Rubyの概要
7© Tamotsu FURUYA, All rights reserved.May 26, 2011
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」への足がかり
Rubyの概要Rubyの概要
8© Tamotsu FURUYA, All rights reserved.May 26, 2011
2. Ruby2. Rubyの処理系の処理系● 実行モデル
– 1.8系統 ソースコードを解析して構文木を構築 構文木を巡りながらプログラムを実行
– 1.9系統 ソースコードを解析して構文木を構築 構文木をバイトコードに変換する 独自の仮想マシン(YARV)で実行
参考: Yugui,初めてのRuby,オライリージャパン
Rubyの概要Rubyの概要
9© Tamotsu FURUYA, All rights reserved.May 26, 2011
3. Ruby3. Rubyのセットアップのセットアップ● Windows用 RubyInstaller
– サイトURL http://rubyinstaller.org/
Rubyの概要Rubyの概要
10© Tamotsu FURUYA, All rights reserved.May 26, 2011
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)
Rubyの概要Rubyの概要
11© Tamotsu FURUYA, All rights reserved.May 26, 2011
3. Ruby3. Rubyのセットアップのセットアップ● RubyGems
– Rubyのパッケージ管理システム– Ruby 1.9より標準添付(1.8系では別パッケージ)– PerlのCPANに似ている– 外部ライブラリを簡単に導入,管理可能.
# Railsライブラリをインストールする$ gem install rails# インストール済みのライブラリを表示する$ gem list# ライブラリを検索する$ gem list -r sqlite
Rubyの概要Rubyの概要
12© Tamotsu FURUYA, All rights reserved.May 26, 2011
3. Ruby3. 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
Rubyの概要Rubyの概要
13© Tamotsu FURUYA, All rights reserved.May 26, 2011
4. 4. スクリプトの作成と実行スクリプトの作成と実行● 簡潔な文法
– おまじない一切なし,いきなり書き始められる.– Javaと異なり,必ずしもクラスを定義する必要はない.– 式と式の区切りは改行だけでOK.(一応,セミコロン「;」
も利用可能)– 自動的にファイルを閉じる(ブロック付きメソッド).#!/usr/bin/ruby# -*- coding: utf-8 -*-
puts "Hello World!"
"こんにちは,世界!\n".display
※1行目の「#!/usr/bin/ruby」はSheBang※2行目は文字エンコーディングにUTF-8を指定している(マジックコメント)
Rubyの概要Rubyの概要
14© Tamotsu FURUYA, All rights reserved.May 26, 2011
4. スクリプトの作成と実行● Rubyの実行
– インタプリタの実行 シェル上で実行する
– 対話的実行環境(irb: interactive ruby)
# Rubyプログラムの実行$ ruby hello.rb
# irbの実行$ irbirb(main):001:0> Time.now=> 2011-05-23 11:22:55 +0900irb(main):002:0> quit $
Rubyの概要Rubyの概要
15© Tamotsu FURUYA, All rights reserved.May 26, 2011
4. スクリプトの作成と実行● プログラムの簡潔さについて
– 次の課題をJava,Rubyそれぞれで実現させる場合のソースを比較してみる.
課題1行ごとに数値が記録されている任意のテキストファイルを読み込み,そこに記録されている数値をすべて2倍にした値を画面に出力させなさい.
1020304050
$ PROG data.txt20406080100
テキストファイル例(data.txt) 実行例
Rubyの概要Rubyの概要
16© Tamotsu FURUYA, All rights reserved.May 26, 2011
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) {} }}
Rubyの概要Rubyの概要
17© Tamotsu FURUYA, All rights reserved.May 26, 2011
4. スクリプトの作成と実行● プログラム例(Rubyの場合)
fname = ARGV[0]File::open(fname) { |f| f.each do |line| puts line.to_i * 2 end}
$ ruby hoge.rb data.txt20406080100
Rubyの概要Rubyの概要
18© Tamotsu FURUYA, All rights reserved.May 26, 2011
5. 5. 基本文法基本文法● 型宣言が不要(動的型付け言語)
– ポリモーフィズム(多様性,多態性) データ型が異なっても同様に処理が可能# 変数 i に整数を代入するi = 6
# 文字列の代入も可能i = "Hello"
# 文字列の長さを求めるputs i.size #=> 3
# 配列の代入も可能i = [1, 2, 3, 4, 5]puts i.size #=> 3
Rubyの概要Rubyの概要
19© Tamotsu FURUYA, All rights reserved.May 26, 2011
5. 基本文法● すべてのデータがオブジェクト
– 数値や文字列等の基本的なデータもオブジェクト
# 通常の変数への文字列の代入str1 = "hello"str2 = "hello"
# それぞれのオブジェクトIDを確認str1.object_id #=> 2152236160str2.object_id #=> 2152228620
# 文字列の中身自体は等しいstr1 == str2 #=> true# オブジェクトは異なるstr1.equal?(str2) #=> false
Rubyの概要Rubyの概要
20© Tamotsu FURUYA, All rights reserved.May 26, 2011
5. 基本文法● ブロック付きメソッド
– メソッドの呼び出しの後にブロックを付ける事が可能object.method名 ( 引数1, … ) do | 変数 |
…中略…end
object.method名 ( 引数1, … ) { | 変数 |…中略…
}
a = [1,2,3,4]a.each do |i|
puts iend
a = [1,2,3,4]b = a.map {|i| i * 2}
Rubyの概要Rubyの概要
21© Tamotsu FURUYA, All rights reserved.May 26, 2011
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
Rubyの概要Rubyの概要
22© Tamotsu FURUYA, All rights reserved.May 26, 2011
5. 基本文法● 数値リテラルについて
– 多倍長整数をサポート(メモリが許す限り幾らでも大きな整数を表現可能)
– 実数値はIEEE754の倍精度浮動小数点数(少なくとも仮数部52bit,指数部11bitの精度)
– 整数のサイズ,実数の精度,共にシステムに依存
a = 2**64 # 2の64乗puts a #=> 18446744073709551616
a = 1.0 / 3printf("%.20f\n", a) #=> 0.33333333333333331483
Rubyの概要Rubyの概要
23© Tamotsu FURUYA, All rights reserved.May 26, 2011
5. 基本文法● 文字列リテラルとシンボル(唯一性を維持)
# 結合と反復puts "hello " + "world!" #=> "hello world!"puts "hello " * 3 #=> "hello hello hello "
# 通常の変数への文字列(シンボル)の代入str1 = :hellostr2 = :hello
# 値(文字列)は等しいstr1 == str2 #=> true
# オブジェクトも等しい(同一)str1.equal?(str2) #=> true
Rubyの概要Rubyの概要
24© Tamotsu FURUYA, All rights reserved.May 26, 2011
5. 基本文法● 変数について
– 接頭文字により,インスタンス変数やクラス変数等を識別.– 変数は値ではなくオブジェクトへの参照を保持する.
VAR = "constant" # 定数$var = "global variable" # グローバル変数var = "local variable" # ローカル変数@var = "instance variable" # インスタンス変数@@var = "class variable" # クラス変数
デフォルト値について● インスタンス変数とグローバル変数は,nil(値がないことを示す値)● 他の変数はすべて参照する前に代入が必要
Rubyの概要Rubyの概要
25© Tamotsu FURUYA, All rights reserved.May 26, 2011
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"] 破壊的メソッド
Rubyの概要Rubyの概要
26© Tamotsu FURUYA, All rights reserved.May 26, 2011
5. 5. 基本文法基本文法● イテレータ
– for文,while文よりもイテレータを多用.– each,times,upto,loop等がある.
[1, 2, 3].each do |i| puts "Hello.#{i}"end
3.times do |i| puts "Hello.#{i}"end
eachメソッド timesメソッド
Rubyの概要Rubyの概要
27© Tamotsu FURUYA, All rights reserved.May 26, 2011
5. 基本文法● メソッド
– すべてのメソッドは少なくとも1つのオブジェクトと対応
def kasan(x, y) x + yendputs kasan(3, 5)
メソッドの定義例
def my_method(x) return x, 1, 2enda, *b = my_method(0)
メソッドの定義例(多値の返却)
Rubyの概要Rubyの概要
28© Tamotsu FURUYA, All rights reserved.May 26, 2011
5. 基本文法● メソッド
– ブロック付きメソッド
a, b = "apple", "banana"[1,2,3].each do |a| a, b = 1, 2endputs a, b
#=> "apple" 2
ブロック付きメソッドの呼び出し例
def my_method yield "apple" yield "banana"endmy_method do |i| p iend
#=> "apple" "banana"
ブロック付きメソッドの定義例
Rubyの概要Rubyの概要
29© Tamotsu FURUYA, All rights reserved.May 26, 2011
6. 6. クラスについてクラスについて● クラスの定義
– クラス階層は単一階層(トップはObjectクラス※)– コンストラクタは initialize メソッド
class Person def initialize puts "INIT." @b_year = 1986 end def foo puts @b_year endendp1 = Person.new #=> "INIT."p1.foo #=> 1986
Rubyの概要Rubyの概要
30© Tamotsu FURUYA, All rights reserved.May 26, 2011
6. クラスについて● 継承(サブクラス化)
– class文に「<」とスーパークラス名を追加
class Person def foo puts "Hello!" endend
class Worker < Personend
w1 = Worker.neww1.foo #=> "Hello!"
「Person」クラスのサブクラス「Worker」を定義
Rubyの概要Rubyの概要
31© Tamotsu FURUYA, All rights reserved.May 26, 2011
6. クラスについて● (継承ではなく)クラス定義を追加可能.
class Person def foo puts "Hello!" endendclass Person def foo puts "Good bye" endend
p1 = Person.newp1.foo #=> "Good bye"
以前のクラス定義を破棄する事なく,新たな機能を追加定義することが可能
Rubyの概要Rubyの概要
32© Tamotsu FURUYA, All rights reserved.May 26, 2011
6. クラスについて● オープンクラス
– 既に定義されているクラスに後から機能を追加可能.– (場合によっては)標準クラスも書き換え可能.
class String undef length
def lengchu return 12345 endend
p "hello".length #=> エラーp "hello".lengchu #=> 12345
まずは「length」メソッドは無かったことにする.
新たに「lengchu」メソッドを追加してみる.
Rubyの概要Rubyの概要
33© Tamotsu FURUYA, All rights reserved.May 26, 2011
6. クラスについて● モジュール
– Mix-inとして使用される(多重継承の代わり)module SatsumaImo def msg puts "..Imo.." endend
class Shouchu < Osake include KomeKouji, SatsumaImoend
s1 = Shouchu.news1.msg #=> "..Imo.."
モジュールの定義(インスタンス化は不可)
モジュールを使用する際はinclude する
Rubyの概要Rubyの概要
34© Tamotsu FURUYA, All rights reserved.May 26, 2011
7. Ruby on Rails7. 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」に置き換えている
Rubyの概要Rubyの概要
35© Tamotsu FURUYA, All rights reserved.May 26, 2011
7. Ruby on Rails7. Ruby on Rails● Railsの全体概要
Railsは,これら複数のライブラリからなるフルスタックフレームワークである.
Rubyの概要Rubyの概要
36© Tamotsu FURUYA, All rights reserved.May 26, 2011
7. Ruby on Rails7. 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/ :
Rubyの概要Rubyの概要
37© Tamotsu FURUYA, All rights reserved.May 26, 2011
7. Ruby on Rails7. 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/
Rubyの概要Rubyの概要
38© Tamotsu FURUYA, All rights reserved.May 26, 2011
7. Ruby on Rails7. 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 test/unit/post_test.rb :
15個程度のファイル(モデルやビューなどのプログラムコード)を作成
Rubyの概要Rubyの概要
39© Tamotsu FURUYA, All rights reserved.May 26, 2011
7. Ruby on Rails7. Ruby on Rails● Railsアプリケーション作成概要
– rake(ビルドツール,MakeのRuby版)でデータベースのマイグレーションを行う.
# rakeコマンドでDBマイグレーションの実行$ rake db:migrate== CreatePosts: migrating ================-- create_table(:posts) -> 0.0021s== CreatePosts: migrated (0.0022s) =======
postsテーブルを自動生成
Rubyの概要Rubyの概要
40© Tamotsu FURUYA, All rights reserved.May 26, 2011
7. Ruby on Rails7. Ruby on Rails● O/Rマッピング
– DBのレコードとRubyのオブジェクトをマップする.– テーブルのフィールドが,オブジェクトの属性となり,フィー
ルド名がそのままアクセサとして定義される.– ActiveRecord(DB抽象レイヤモジュール)の機能
postsテーブルPostオブジェクト
Rubyの概要Rubyの概要
41© Tamotsu FURUYA, All rights reserved.May 26, 2011
7. Ruby on Rails7. Ruby on Rails● Railsアプリケーション作成概要
– 既にCRUDアプリケーションは完成している.
http://localhost:3000/posts
Rubyの概要Rubyの概要
42© Tamotsu FURUYA, All rights reserved.May 26, 2011
7. Ruby on Rails7. Ruby on Rails● Railsアプリケーション作成概要
– 既にCRUDアプリケーションは完成している.
$ rails dbconsoleSQLite version 3.7.4Enter ".help" for instructionsEnter 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>
実際のテーブルには,レコード追加時のタイムスタンプまで保存されている.
Rubyの概要Rubyの概要
43© Tamotsu FURUYA, All rights reserved.May 26, 2011
8. 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
Rubyの概要Rubyの概要
44© Tamotsu FURUYA, All rights reserved.May 26, 2011
8. 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
Rubyの概要Rubyの概要
45© Tamotsu FURUYA, All rights reserved.May 26, 2011
8. 8. おわりにおわりに● まとめ
– Rubyは純粋なオブジェクト指向言語である.– すべてのデータがオブジェクトである.– 予約語あるいは演算子の様で実はメソッド
(例 include, 1+2, a[0],等)– Conversion over Configuration(設定より規約)– Ruby1.8からRuby1.9へ,Rails2からRails3へのバージョン移行の問題
– 公式実装MRI(cRuby)が先を行っているが,JRubyも気になる存在.
– とにかく,プログラミングしていて楽しい!
Rubyの概要Rubyの概要
46© Tamotsu FURUYA, All rights reserved.May 26, 2011
9. 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
Rubyの概要Rubyの概要
47© Tamotsu FURUYA, All rights reserved.May 26, 2011
9. 9. おまけおまけ● プログラミング例
>> "student".pluralize=> "students"
>> "ruby".pluralize=> "rubies"
>> %w[apple banana orange].sample(1)=> ["orange"]
>> %w[apple banana orange].sample(1)=> ["apple"]