Slide 1

Slide 1 text

͸͡Ίͯͷ 2013/08/31 Niigata.rb #3 dictav

Slide 2

Slide 2 text

RUBY ೔ຊਓ͕։ൃͨ͠ΠϯλϓϦλʔݴޠ ࠓ΋ଟ͘ͷ೔ຊਓʹϝϯς͞Ε͍ͯΔ ΍ͬͨʂϝϯςφʔͱ೔ຊޠͰ࿩ͤΔʂʂ Ruby on Rails ͰେϒϨΠΫ ࠓ೥20ࡀΛܴ͑ͯ Ruby2.0 ϦϦʔεʂ ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]

Slide 3

Slide 3 text

RUBY VERSIONS ruby 1.6 ܥ ruby 1.7 ܥ ruby 1.8 ܥ ruby 1.9 ܥ ruby 2.0 ܥ ruby 2.1 ܥ ruby 1.6 ܥ ruby 1.7 ܥ ruby 1.8 ܥ ruby 1.9 ܥ ruby 2.0 ܥ ruby 2.1 ܥ

Slide 4

Slide 4 text

RUBY 2.1.0 Ϋόʔδϣχϯάʹ͍ͭͯ MAJOR: MINOR ϦϦʔεͰରԠͰ͖ͳ͍ޓ׵ੑͷͳ͍มߋ͕͋Δ৔߹ ʹ૿Ճ͢ΔɻಛผͳΠϕϯτͷͨΊʹ༧໿͞ΕΔɻ MINOR: ΫϦεϚε͝ͱʹ૿Ճ͢ΔɻAPI ϨϕϧͰͷඇޓ׵͕͋Γ͑Δɻ TEENY: API ޓ׵ੑΛҡ࣋͢ΔηΩϡϦςΟϑΟοΫε΍όάϑΟοΫ εɻ2.1.11 ͷΑ͏ʹ10Ҏ্ͷ஋ʹͳΓ͑Δɻ2ɺ3ϲ݄͓͖ʹϦϦʔε͞Ε Δɻ PATCH: ௚લͷ MINOR ϦϦʔε͔Βͷίϛοτ਺ɻ (MINOR ͕ϦϦʔ ε͞ΕΔ͝ͱʹ 0 ʹ໭Δ) {MAJOR}.{MINOR}.{TEENY}p{PATCH} https://www.ruby-lang.org/ja/news/2013/12/21/semantic-versioning-after-2-1-0/

Slide 5

Slide 5 text

ಛ௃ άϧʔݴޠ จࣈͷѻ͍ʹڧ͍ ͢΂͕ͯΦϒδΣΫτ ΦʔϓϯΫϥε ϦϑϨΫγϣϯ ڧྗͳ૊ΈࠐΈΫϥε

Slide 6

Slide 6 text

άϧʔݴޠ OSಛ༗ͷػೳΛݺͼग़ͤΔ
 ϓϥοτϑΥʔϜʹґଘͨ͠CݴޠͷϥΠϒϥϦ΋ݺͼग़ͤ Δ system(“sl”, “-al”)

Slide 7

Slide 7 text

จࣈͷѻ͍ʹڧ͍ σϑΥϧτจࣈίʔυ͸ UTF-8 
 
 
 ! # coding: euc-jp # UTF-8 3bytes t1="͍͋͏͓͑" t1.bytesize #=> 15 t1.length #=> 5 ! # UTF-8 4bytes t2 = "㘏㚁䆰䆵䇁" t2.bytesize #=> 20 t2.length #=> 5

Slide 8

Slide 8 text

จࣈͷѻ͍ʹڧ͍ M17N:multilingualization ϚϧνϦϯΨϥΠθʔγϣϯ ! ! euc_str = "೔ຊޠ".encode("euc-jp") => “\x{C6FC}\x{CBDC}\x{B8EC}" ! sjis_str = "ʹͬΆΜ".encode("sjis") => "\x{82C9}\x{82D9}\x{82F1}\x{82B2}" ! euc_str.encode('utf-8') + sjis_str.encode('utf-8') => "೔ຊޠʹͬΆΜ"

Slide 9

Slide 9 text

จࣈͷѻ͍ʹڧ͍ ਖ਼نදݱ logs = ['192.168.0.1 - - [14/Feb…’, '192.168.0.2 - - [14/Feb…’, '192.168.0.3 - - [14/Feb…’ ] # ਖ਼نදݱ: regs = /(?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/ # ܁Γฦ͠ॲཧ:ɹdo ~ end ͸ϒϩοΫ {} ͱ΋ॻ͚Δ logs.each do |log| log.match regs do |m| p m[:ip] end end ! # =>”192.168.0.1"ɹ“192.168.0.2"ɹ"192.168.0.3"

Slide 10

Slide 10 text

ڧྗͳ૊ΈࠐΈΫϥε Numeric String Array Hash Enumrator

Slide 11

Slide 11 text

NUMERIC ਺஋Λѻ͏ΫϥεʢInteger/Float/Rational/Complex) ؙΊૢ࡞ ਺஋දݱ
 ܁Γฦ͠ (1.4).round #=> 1 1_0000_0000_0000_0000 #1ܠ 1.step(5, 2).inject(:+) #=> 1+3+5 = 9 16.to_s(16) #=> "10" 0.1r * 3 #=> (3/10)

Slide 12

Slide 12 text

STRING "Niigata.rb".include? "rb" #=> true "Niigata.rb".start_with? "Niigata" #=> true "Niigata"+".rb" #=> "Niigata.rb" "ruby" * 3 #=> "rubyrubyruby" "%02d݄%02d೔" % [8,31] #=> "08݄31೔" "Niigata.rb"[0,7] #=> "Niigata" "rubyrubyruby".scan(/ruby/) #=> ["ruby", "ruby", "ruby"] "ruby".split("") #=> ["r", "u", "b", "y"] euc_str = "೔ຊޠ".encode("euc-jp") #=> "\x{C6FC}\x{CBDC}\x{B8EC}"

Slide 13

Slide 13 text

ARRAY ["Niigata"] + ["rb"] #=> ["Niigata" ,"rb"] ["ruby"] * 3 #=> ["ruby", "ruby", "ruby"] ["Niigata", "rb"].join(".") #=> "Niigata.rb" [1,2,3,4,5,6,7,8,9,10].inject(:+) #=> 55

Slide 14

Slide 14 text

HASH # ॳظԽ hash = {one: 1, two: 2} #=> {:one => 1, :two => 2} ! #ΞΫηε hash.each do |key,val| puts "#{key}: #{val}" end ! #ߋ৽ hash[:one] = 1.0 #=> {:one => 1.0, :two => 2} hash.merge!({one: '1', two: ‘2'}) #=> {:one => '1', :two => '2'}

Slide 15

Slide 15 text

ENUMERA ཁૉ΁ΞΫηε (each/each_with_index/each_cons) ཁૉͷऔಘ (map/grep/detect/select/take) ৞ΈࠐΈԋࢉ (inject) άϧʔϐϯά (group_by/partition) ιʔτ(sort/sort_by)

Slide 16

Slide 16 text

ENUMERATOR::LAZY Enumerator ([1,2,3,4,5].each / (1..10).map) Enumerator::Lazy ͍͢͝େ͖͍഑ྻ࢖͏࣌ʹ࢖͑Δ big_data = (1..Float::INFINITY).lazy squares = big_data.map{|a| (a**2).to_s } p squares.select{|a| a.match /7/}.take(1).force #=> ["576"]

Slide 17

Slide 17 text

͢΂͕ͯΦϒδΣΫτ จࣈྻͩͬͯΦϒδΣΫτ
 ਺஋ͩͬͯΦϒδΣΫτ ഑ྻͩͬͯΦϒδΣΫτ ΫϥεͩͬͯΦϒδΣΫτ “hello".each_byte.to_a #=> [104, 101, 108, 108, 111] 3.times{puts ‘hello’} [1,2,3,4,5].include?(3) #=> true Foo = Class.new #=> Foo

Slide 18

Slide 18 text

͢΂͕ͯΦϒδΣΫτ ϝιουఆٛ p self # => main p self.class # => Object ! def self.my_method :my_method end ! p self.my_method #=> :my_method # 2.1.0 new feature m = def my_method :my_method end ! p send(m) #=> :my_method p self # => main p self.class # => Object ! def my_method :my_method end ! p my_method #=> :my_method

Slide 19

Slide 19 text

͢΂͕ͯΦϒδΣΫτ ϝιουఆٛ obj = Object.new ! def obj.my_method :my_method end ! p obj.my_method #=> :my_method

Slide 20

Slide 20 text

͢΂͕ͯΦϒδΣΫτ Ϋϥεϝιουఆٛ Foo = Class.new def Foo.my_class_method :my_class_method end ! p Foo.my_class_method #=> :my_class_method

Slide 21

Slide 21 text

͢΂͕ͯΦϒδΣΫτ Πϯελϯεϝιουఆٛ Foo = Class.new Foo.module_eval do def my_method :my_method end def my_metho2 :my_metho2 end end obj1 = Foo.new p obj1.my_method #=> :my_method ! obj2 = Foo.new p obj2.my_method #=> :my_method p obj2.my_metho2 #=> :my_metho2

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

͢΂͕ͯΦϒδΣΫτ Πϯελϯεϝιουఆٛ class Foo < Object def my_method :my_method end def my_metho2 :my_metho2 end def self.my_class_method :my_class_method end end p Foo.my_class_method #=> :my_class_method obj1 = MyClass.new p obj1.my_method #=> :my_method p obj1.my_metho2 #=> :my_metho2

Slide 24

Slide 24 text

ΦʔϓϯΫϥε class Foo def hello(name) puts "hello #{name}" end end class Foo def goodbye puts "goodbye" end end class Foo def hello(name) puts "hello #{name} san" end end Foo.new.hello 'rubico' => "hello rubico san" Foo.new.goodbye => 'goodbye'

Slide 25

Slide 25 text

MODULE ! include prepend (>= 2.0.0) using (>= 2.1.0)

Slide 26

Slide 26 text

MODULE.INCLUDE class Foo def hello(name) puts "hello #{name}" end end module Goodbye def goodbye puts "goodbye" end end class Foo include Goodbye end ! Foo.new.hello name:'rubico' => "hello rubico" Foo.new.goodbye => 'goodbye'

Slide 27

Slide 27 text

MODULE.PREPEND class Foo def hello(name) puts "hello #{name}" end end module SanTukero def hello(name) super(name + " san") end end class Foo prepend SanTukero end ! Foo.new.hello 'rubico' => "hello rubico san" ! !

Slide 28

Slide 28 text

MODULE. module Bar refine Numeric do def bar "bar" * self end end end ! using Bar puts 5.bar # ruby 2.1 module Huga using Bar puts 5.bar end => "foofoofoofoofoo" ! !

Slide 29

Slide 29 text

ϦϑϨΫγϣϯ Object#instance_variables Object#methods Object#respond_to? Object#__send__ Module#class_variables Module#methods TracePoint (>= 2.0.0)

Slide 30

Slide 30 text

ϦϑϨΫγϣϯ TRACEPOINT trace = TracePoint.new(:call) do |tp| puts "#{tp.defined_class}##{tp.method_id}" puts '---------' end trace.enable ! def my_method :my_method end p my_method #=> Object#my_method --------- :my_method

Slide 31

Slide 31 text

RUBY RailsΛ࢝Ίͨ͘͞ΜͷϓϩμΫτ͕͋Δ ΏΔ;ΘͰԿͰ΋Ͱ͖ͪΌ͏ݴޠ ϓϩάϥϛϯάָ͕͘͠ͳΔ