Ruby紹介
         とみたまさひろ
           2010-08-21



Ruby紹介         Powered by Rabbit 0.6.5
自己紹介
     ✓ とみた まさひろ
     ✓ プログラマー
     ✓ mailto:tommy@tmtm.org
     ✓ http://d.hatena.ne.jp/tmtms
     ✓ http://twitter.com/tmtms
                                             1/55
Ruby紹介                            Powered by Rabbit 0.6.5
自己紹介

     ✓ 日本Rubyの会
     ✓ 日本MySQLユーザ会
     ✓ Ruby/MySQL ライブラリ
     ✓ Ruby歴, MySQL歴 十数年

                                      2/55
Ruby紹介                     Powered by Rabbit 0.6.5
自己紹介




         こんな本書きました

                                3/55
Ruby紹介               Powered by Rabbit 0.6.5
NSEG #1 で




                                4/55
Ruby紹介               Powered by Rabbit 0.6.5
NSEG #3 で




                                5/55
Ruby紹介               Powered by Rabbit 0.6.5
今回は
     Rubyの紹
Ruby紹介
        介            6/55
          Powered by Rabbit 0.6.5
Ruby

     ✓ http://www.ruby-lang.org
     ✓ オブジェクト指向スクリプト言語
     ✓ まつもとゆきひろ さん
     ✓ ひろゆき じゃないよ

                                             7/55
Ruby紹介                            Powered by Rabbit 0.6.5
Matz




                           8/55
Ruby紹介          Powered by Rabbit 0.6.5
歴史




     ✓ Ruby1.8 は 1.x の最終形
     ✓ Ruby1.9 は 2.0 に向けた助走
                                       9/55
Ruby紹介                      Powered by Rabbit 0.6.5
バージョン
     ✓ x.y.z-pNNN の形式
     ✓ 最新: 1.8.7-p302, 1.9.2-p0
     ✓ y が奇数のは開発版 (1.9を除く)
     ✓ z の違いでも互換がないことも
     ✓ pNNN はパッチリリース
     ✓ 1.9 は 2.0 に向けて大幅な変更
                                      10/55
Ruby紹介                        Powered by Rabbit 0.6.5
特徴
Ruby紹介
                 11/55
         Powered by Rabbit 0.6.5
楽しい
                 12/55
Ruby紹介   Powered by Rabbit 0.6.5
たのしいRuby




                            13/55
Ruby紹介              Powered by Rabbit 0.6.5
プログラマ
    にとって嬉
Ruby紹介
      しい         14/55
         Powered by Rabbit 0.6.5
余計なこと
   は考えたく
    ない
Ruby紹介
                 15/55
         Powered by Rabbit 0.6.5
ファイルコピー



         require 'fileutils'
         FileUtils.copy 'srcfile', 'destfile'




                                                 16/55
Ruby紹介                                   Powered by Rabbit 0.6.5
TCPサーバー

         require 'socket'
         Socket.tcp_server_loop(9999) do |sock|
           Thread.new sock do |s|
             s.each do |line|
               puts line
             end
           end
         end

                                                   17/55
Ruby紹介                                     Powered by Rabbit 0.6.5
HTTP GET



         require 'open-uri'
         open('http://nseg.jp').read


                                         18/55
Ruby紹介                           Powered by Rabbit 0.6.5
デーモン
         Process.daemon
   ✓ 制御端末を切り離し
   ✓ バックグラウンド化
   ✓ カレントディレクトリを / に移動
   ✓ 標準入出力,エラー出力を /dev/
     null にリダイレクト      19/55
Ruby紹介                    Powered by Rabbit 0.6.5
p

    人間にわかりやすい形で表示
         p Time.now #=> 2010-08-21 01:20:23 +0900
         p Array.new #=> []


    デバッグに便利

                                                     20/55
Ruby紹介                                       Powered by Rabbit 0.6.5
言語とし
  ての特徴           21/55
Ruby紹介   Powered by Rabbit 0.6.5
初めてのRuby
         ただし他のオブジェクト指向言語修
         得者向け




                               22/55
Ruby紹介                 Powered by Rabbit 0.6.5
型がない




                        23/55
Ruby紹介          Powered by Rabbit 0.6.5
変数に型がない
     ✓ どんなオブジェクトでも代入可能
     ✓ 自分が何かはオブジェクト自身が
       知っている
          a = 123
          a.class #=> Fixnum
          a = 'abc'
          a.class #=> String

                                       24/55
Ruby紹介                         Powered by Rabbit 0.6.5
代入というより…
    オブジェクトに貼ったラベル

         a = 'abc'
         b = a
         b.concat '123'
         a #=> "abc123"
         a.object_id == b.object_id
                                         25/55
Ruby紹介                           Powered by Rabbit 0.6.5
読みやすい


     ✓ Pで始まる言語に比べて
     ✓ 主観です


                             26/55
Ruby紹介               Powered by Rabbit 0.6.5
変数のスコープ

         1文字目     スコープ
     [a-z_]     メソッドローカル
     @          インスタンス内
     @@         クラス内
     $          グローバル
     [A-Z]      定数
                              27/55
Ruby紹介                Powered by Rabbit 0.6.5
オープ
   ンクラス
Ruby紹介
                 28/55
         Powered by Rabbit 0.6.5
定義済みのクラスを変更可能
         # Hoge クラス定義
         class Hoge
           def abc
           end
         end
         # xyz メソッド追加
         class Hoge
           def xyz
           end
         end
                                29/55
Ruby紹介                  Powered by Rabbit 0.6.5
すべてがオ
  ブジェクト
                 30/55
Ruby紹介   Powered by Rabbit 0.6.5
数値もオブジェクト

         class Numeric
           def neg
             -self
           end
         end
         123.neg #=> -123

                                    31/55
Ruby紹介                      Powered by Rabbit 0.6.5
Rails 界隈では

         require 'active_support/all'

         3.days.ago
           #=> 2010-08-18 10:38:13 +0900

    これは便利!
    ...っていうかキモい...
                                            32/55
Ruby紹介                              Powered by Rabbit 0.6.5
true, false, nil もオブジェクト


         true.class #=> TrueClass
         false.class #=> FalseClass
         nil.class   #=> NilClass


                                         33/55
Ruby紹介                           Powered by Rabbit 0.6.5
クラスもオブジェクト


         class Hoge
         end
         Hoge.class   #=> Class
         a = Hoge     # 変数への代入も可


                                      34/55
Ruby紹介                        Powered by Rabbit 0.6.5
演算子もメソッド


          123+456

          # これは実は
          123.+(456)

                               35/55
Ruby紹介                 Powered by Rabbit 0.6.5
再定義も可

         class Fixnum
           def +(a)
             self * a
           end
         end
         123+456 #=> 56088

                                     36/55
Ruby紹介                       Powered by Rabbit 0.6.5
特異メソッド

    特定のオブジェクトだけメソッド追加

         obj = Hoge.new
         def obj.hoge
           ...
         end

                                  37/55
Ruby紹介                    Powered by Rabbit 0.6.5
モジュール
    オブジェクトを持たないクラスのような
    もの
    名前空間をわけたり

         module MyProject
           class Hoge
           end
         end
                                    38/55
Ruby紹介                      Powered by Rabbit 0.6.5
モジュール
    メソッド定義しておいて、他のクラスに
    組み込んだり(Mix-in)
         module Abc
           def xyz
             ...
           end
         end
         class Hoge
           include Abc
           # xyz メソッドが使えるようになる
         end
                                         39/55
Ruby紹介                           Powered by Rabbit 0.6.5
ブロッ
Ruby紹介
          ク        40/55
           Powered by Rabbit 0.6.5
ブロック
         def hoge(arg)
           yield arg*2
         end
         def hoge(arg, &block)
           block.call arg*2
         end

         hoge 123 do |n|
           ...
         end
         hoge(123){|n|
           ...
         }
                                         41/55
Ruby紹介                           Powered by Rabbit 0.6.5
後処理


         File.open 'aaa.txt' do |f|
           f.read
         end
    ブロックを抜けると自動的にファイルが
    クローズされる
                                         42/55
Ruby紹介                           Powered by Rabbit 0.6.5
イテレータ

         # 10回繰り返し
         10.times{|i|
           ...
         }

         # 配列の要素を順番にブロックに渡す
         [1, 2, 3].each do |x|
           x * 2
         end
                                   43/55
Ruby紹介                     Powered by Rabbit 0.6.5
Enumerable
    each メソッドさえあれば
    Enumerable モジュールを include
    して
         [1,2,3].map{|x| x*2} #=> [2,4,6]
         [1,2,3].max #=> 3
         [3,2,1].sort #=> [1,2,3]
         [1,2,3].select{|x| x.odd?} #=> [1,3]

                                                 44/55
Ruby紹介                                   Powered by Rabbit 0.6.5
Ruby
Ruby紹介
          1.9       45/55
            Powered by Rabbit 0.6.5
1.9.2
         8/19 リ
Ruby紹介
         リース!         46/55
              Powered by Rabbit 0.6.5
1.8 と結構
    互換あり
                 47/55
Ruby紹介   Powered by Rabbit 0.6.5
VM


     ✓ バイトコード
     ✓ 高速化
     ✓ 数倍〜数十倍?


                             48/55
Ruby紹介               Powered by Rabbit 0.6.5
文字列
     ✓ 1.8 までは文字列はただのバイト
       列
     ✓ 文字単位の処理が可能
     ✓ 文字列オブジェクトが文字コード
       を持つ
     ✓ Code Set Independent
                                      49/55
Ruby紹介                        Powered by Rabbit 0.6.5
Encoding

     ✓ リテラル文字列は magic
       comment に依存
         # -*- coding: utf-8 -*-
         s = "あいう"
         s.encoding #=> #<Encoding:UTF-8>
         s2 = s.encode "cp932"
         s2.encoding #=> #<Encoding:Windows-31J>


                                                   50/55
Ruby紹介                                     Powered by Rabbit 0.6.5
IO は自動変換


         f = File.open('a.txt', 'r+:shift_jis:euc-jp')
         # SJIS ファイルから読んで EUC 文字列を生成する
         f.read
         # 文字列を SJIS に変換して書き込む
         f.write 'xxx'




                                                         51/55
Ruby紹介                                           Powered by Rabbit 0.6.5
2038年問題

         # Ruby 1.8
         Time.at 2147483647
              #=> Tue Jan 19 12:14:07 +0900 2038
         Time.at 2147483648
              # bignum too big to convert into `long' (RangeError)
         # Ruby 1.9
         Time.at 2147483648
              #=> 2038-01-19 12:14:08 +0900
         Time.at 9999999999
              #=> 2286-11-21 02:46:39 +0900
         Time.at 99999999999
              #=> 5138-11-16 18:46:39 +0900



                                                                    52/55
Ruby紹介                                                      Powered by Rabbit 0.6.5
その他便
         利な機能
Ruby紹介
          多数        53/55
            Powered by Rabbit 0.6.5
これから使
   うなら 1.9
                 54/55
Ruby紹介   Powered by Rabbit 0.6.5
ご清聴あり
   がとうござ
    いました
Ruby紹介
                 55/55
         Powered by Rabbit 0.6.5

Ruby紹介

  • 1.
    Ruby紹介 とみたまさひろ 2010-08-21 Ruby紹介 Powered by Rabbit 0.6.5
  • 2.
    自己紹介 ✓ とみた まさひろ ✓ プログラマー ✓ mailto:tommy@tmtm.org ✓ http://d.hatena.ne.jp/tmtms ✓ http://twitter.com/tmtms 1/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 3.
    自己紹介 ✓ 日本Rubyの会 ✓ 日本MySQLユーザ会 ✓ Ruby/MySQL ライブラリ ✓ Ruby歴, MySQL歴 十数年 2/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 4.
    自己紹介 こんな本書きました 3/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 5.
    NSEG #1 で 4/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 6.
    NSEG #3 で 5/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 7.
    今回は Rubyの紹 Ruby紹介 介 6/55 Powered by Rabbit 0.6.5
  • 8.
    Ruby ✓ http://www.ruby-lang.org ✓ オブジェクト指向スクリプト言語 ✓ まつもとゆきひろ さん ✓ ひろゆき じゃないよ 7/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 9.
    Matz 8/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 10.
    歴史 ✓ Ruby1.8 は 1.x の最終形 ✓ Ruby1.9 は 2.0 に向けた助走 9/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 11.
    バージョン ✓ x.y.z-pNNN の形式 ✓ 最新: 1.8.7-p302, 1.9.2-p0 ✓ y が奇数のは開発版 (1.9を除く) ✓ z の違いでも互換がないことも ✓ pNNN はパッチリリース ✓ 1.9 は 2.0 に向けて大幅な変更 10/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 12.
    特徴 Ruby紹介 11/55 Powered by Rabbit 0.6.5
  • 13.
    楽しい 12/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 14.
    たのしいRuby 13/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 15.
    プログラマ にとって嬉 Ruby紹介 しい 14/55 Powered by Rabbit 0.6.5
  • 16.
    余計なこと は考えたく ない Ruby紹介 15/55 Powered by Rabbit 0.6.5
  • 17.
    ファイルコピー require 'fileutils' FileUtils.copy 'srcfile', 'destfile' 16/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 18.
    TCPサーバー require 'socket' Socket.tcp_server_loop(9999) do |sock| Thread.new sock do |s| s.each do |line| puts line end end end 17/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 19.
    HTTP GET require 'open-uri' open('http://nseg.jp').read 18/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 20.
    デーモン Process.daemon ✓ 制御端末を切り離し ✓ バックグラウンド化 ✓ カレントディレクトリを / に移動 ✓ 標準入出力,エラー出力を /dev/ null にリダイレクト 19/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 21.
    p 人間にわかりやすい形で表示 p Time.now #=> 2010-08-21 01:20:23 +0900 p Array.new #=> [] デバッグに便利 20/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 22.
    言語とし ての特徴 21/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 23.
    初めてのRuby ただし他のオブジェクト指向言語修 得者向け 22/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 24.
    型がない 23/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 25.
    変数に型がない ✓ どんなオブジェクトでも代入可能 ✓ 自分が何かはオブジェクト自身が 知っている a = 123 a.class #=> Fixnum a = 'abc' a.class #=> String 24/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 26.
    代入というより… オブジェクトに貼ったラベル a = 'abc' b = a b.concat '123' a #=> "abc123" a.object_id == b.object_id 25/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 27.
    読みやすい ✓ Pで始まる言語に比べて ✓ 主観です 26/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 28.
    変数のスコープ 1文字目 スコープ [a-z_] メソッドローカル @ インスタンス内 @@ クラス内 $ グローバル [A-Z] 定数 27/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 29.
    オープ ンクラス Ruby紹介 28/55 Powered by Rabbit 0.6.5
  • 30.
    定義済みのクラスを変更可能 # Hoge クラス定義 class Hoge def abc end end # xyz メソッド追加 class Hoge def xyz end end 29/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 31.
    すべてがオ ブジェクト 30/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 32.
    数値もオブジェクト class Numeric def neg -self end end 123.neg #=> -123 31/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 33.
    Rails 界隈では require 'active_support/all' 3.days.ago #=> 2010-08-18 10:38:13 +0900 これは便利! ...っていうかキモい... 32/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 34.
    true, false, nilもオブジェクト true.class #=> TrueClass false.class #=> FalseClass nil.class #=> NilClass 33/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 35.
    クラスもオブジェクト class Hoge end Hoge.class #=> Class a = Hoge # 変数への代入も可 34/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 36.
    演算子もメソッド 123+456 # これは実は 123.+(456) 35/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 37.
    再定義も可 class Fixnum def +(a) self * a end end 123+456 #=> 56088 36/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 38.
    特異メソッド 特定のオブジェクトだけメソッド追加 obj = Hoge.new def obj.hoge ... end 37/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 39.
    モジュール オブジェクトを持たないクラスのような もの 名前空間をわけたり module MyProject class Hoge end end 38/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 40.
    モジュール メソッド定義しておいて、他のクラスに 組み込んだり(Mix-in) module Abc def xyz ... end end class Hoge include Abc # xyz メソッドが使えるようになる end 39/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 41.
    ブロッ Ruby紹介 ク 40/55 Powered by Rabbit 0.6.5
  • 42.
    ブロック def hoge(arg) yield arg*2 end def hoge(arg, &block) block.call arg*2 end hoge 123 do |n| ... end hoge(123){|n| ... } 41/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 43.
    後処理 File.open 'aaa.txt' do |f| f.read end ブロックを抜けると自動的にファイルが クローズされる 42/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 44.
    イテレータ # 10回繰り返し 10.times{|i| ... } # 配列の要素を順番にブロックに渡す [1, 2, 3].each do |x| x * 2 end 43/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 45.
    Enumerable each メソッドさえあれば Enumerable モジュールを include して [1,2,3].map{|x| x*2} #=> [2,4,6] [1,2,3].max #=> 3 [3,2,1].sort #=> [1,2,3] [1,2,3].select{|x| x.odd?} #=> [1,3] 44/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 46.
    Ruby Ruby紹介 1.9 45/55 Powered by Rabbit 0.6.5
  • 47.
    1.9.2 8/19 リ Ruby紹介 リース! 46/55 Powered by Rabbit 0.6.5
  • 48.
    1.8 と結構 互換あり 47/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 49.
    VM ✓ バイトコード ✓ 高速化 ✓ 数倍〜数十倍? 48/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 50.
    文字列 ✓ 1.8 までは文字列はただのバイト 列 ✓ 文字単位の処理が可能 ✓ 文字列オブジェクトが文字コード を持つ ✓ Code Set Independent 49/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 51.
    Encoding ✓ リテラル文字列は magic comment に依存 # -*- coding: utf-8 -*- s = "あいう" s.encoding #=> #<Encoding:UTF-8> s2 = s.encode "cp932" s2.encoding #=> #<Encoding:Windows-31J> 50/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 52.
    IO は自動変換 f = File.open('a.txt', 'r+:shift_jis:euc-jp') # SJIS ファイルから読んで EUC 文字列を生成する f.read # 文字列を SJIS に変換して書き込む f.write 'xxx' 51/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 53.
    2038年問題 # Ruby 1.8 Time.at 2147483647 #=> Tue Jan 19 12:14:07 +0900 2038 Time.at 2147483648 # bignum too big to convert into `long' (RangeError) # Ruby 1.9 Time.at 2147483648 #=> 2038-01-19 12:14:08 +0900 Time.at 9999999999 #=> 2286-11-21 02:46:39 +0900 Time.at 99999999999 #=> 5138-11-16 18:46:39 +0900 52/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 54.
    その他便 利な機能 Ruby紹介 多数 53/55 Powered by Rabbit 0.6.5
  • 55.
    これから使 うなら 1.9 54/55 Ruby紹介 Powered by Rabbit 0.6.5
  • 56.
    ご清聴あり がとうござ いました Ruby紹介 55/55 Powered by Rabbit 0.6.5