48
Rubyの概要 Rubyの概要 1 © Tamotsu FURUYA, All rights reserved. May 26, 2011 Ruby Ruby の概要 の概要 Summary of Ruby as Programming Language 20110526鹿児島大学 学術情報基盤センター 学術情報処理研究部門 古屋 保 [email protected]

Summary of Ruby

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"]

Rubyの概要Rubyの概要

48© Tamotsu FURUYA, All rights reserved.May 26, 2011

9. 9. おまけおまけ● プログラミング例

def fact(n) if n == 1 1 else n * fact(n - 1) endendprint "20!=", fact(20) #=> 20!=2432902008176640000

(1..20).reduce{|s, x| s * x}(1..20).reduce(:*)

参考: まつもとゆきひろ,Rubyビジネスの将来