Slide 1

Slide 1 text

ԘҪඒ࡙ !TIJPJNN!DPF@ 'FC ϓϩάϥϛϯάݴޠ3VCZप೥ه೦Πϕϯτ 3VCZ .3* ͷ޷͖ͳͱ͜Ζ

Slide 2

Slide 2 text

aaॕ3VCZप೥

Slide 3

Slide 3 text

͓ॕ͍ͷؾ࣋ͪΛͿ͚ͭΔ΂͘ɺ 3VCZ .3* ͷݸਓతʹ޷͖ͳͱ͜ΖΛ प೥ʹ͔͚ͭͯ͜ ݸ͝঺հ͠ʹ͖·ͨ͠

Slide 4

Slide 4 text

͝ཡͷօ͞Μ΋ͥͻ͝Ұॹʹ 3VCZͷ޷͖ͳͱ͜ΖΛ ݸߟ͑ͯΈ͍ͯͩ͘͞

Slide 5

Slide 5 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ

Slide 6

Slide 6 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ "QSPHSBNNFS`TCFTUGSJFOE ɹɹɹ࣮ݱ͍ͨ͜͠ͱΛ্ख͍͜ͱදݱͰ͖ΔΑ͏ʹ ɹɹɹͳΔ·Ͱ෇͖߹ͬͯ͘ΕΔ ɹɹɹଞͷ༑ୡΛ঺հͯ͘͠ΕͨΓ΋͢Δ IUUQTXXXSVCZMBOHPSHKB ˞ΧϯϑΝϨϯεɺςοΫΠϕϯτɺίϛϡχςΟͷϛʔτΞοϓ

Slide 7

Slide 7 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ໊લ ɹɹɹʮ3VCZʯ୹͍ɺՄѪ͍ɺ֮͑΍͍͢ ɹɹɹʜ͠ɺ ɹɹɹ3VCZࣗ਎ͷதͰ΋໊લ͕େࣄʹ͞Ε͍ͯΔͱ͜Ζ ɹɹɹ ػೳ໊ɺϝιου໊ɺจԽFUDʜ

Slide 8

Slide 8 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ಉ͜͡ͱΛ͢ΔͨΊʹ ͍ΖΜͳํ๏͕༻ҙ͞Ε͍ͯͯ ଟ༷ੑ͕େࣄʹ͞Ε͍ͯΔͱ͜Ζ class Foo def foo puts "#ruby30th" end end Foo.new.foo # => #ruby30th Bar = Class.new do de fi ne_method(:bar) do stdout = IO.new(2) stdout.send(:write, “#ruby30th\n”) end end Bar.new.bar # => #ruby30th

Slide 9

Slide 9 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ͳΜͰ΋ΦϒδΣΫτ ɹɹɹԿʹͰ΋ϝοηʔδΛૹΔ͜ͱ͕Ͱ͖Δͱ͜Ζ Class.new Module.new Exception.new Errno::ESHUTDOWN.new self.binding self.method(:__method__) self.method(:__method__).unbind TracePoint.new(:call) { |tp| tp.event } Ϋϥε΋ Ϟδϡʔϧ΋ ྫ֎΋ γεςϜΤϥʔ΋ ؀ڥ৘ใ΋ ϝιου΋ Ϩγʔόͷͳ͍ϝιου΋ τϨʔεϙΠϯτ΋FUDʜ

Slide 10

Slide 10 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ɹɹɹͷΑ͏ͳ༡ͼ৺Λ͙͘͢Δϝιου͕๛෋ͳͱ͜Ζ ɹɹɹ͢΂͕ͯఝʹݟ͑ΔΑ͏ʹͳΔ BasicObject#method_missing FUDʜ class Foo def method_missing(name, *_args, &_block) puts "##{name}" end end Foo.new.ruby30th # => #ruby30th

Slide 11

Slide 11 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ େମࣜ ɹɹɹͳͷͰ͜Μͳ͜ͱ͕Ͱ͖Δͱ͜Ζ ɹɹɹ͜Εͬͯ͘͢͝ͳ͍Ͱ͔͢ message = if ruby.birthday? “#ruby30th” else “Anyway I love Ruby everyday” end puts message # => #ruby30th

Slide 12

Slide 12 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ͋ΒΏΔߏจ͕ׅހͰғΉͱࣜ ɹɹɹͳͷͰ͜Μͳ͜ͱ͕Ͱ͖Δͱ͜Ζ ɹɹɹ message = (() || (def foo = “#ruby30th”); foo) puts message # => #ruby30th

Slide 13

Slide 13 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ Ҿ਺͕͘͢͝ॊೈ ɹɹɹͳͷͰ͜Μͳ͜ͱ͕Ͱ͖Δͱ͜Ζ ɹɹɹ def foo(arg = true ? “#ruby30th” : “Anyway I love Ruby everyday”) puts arg # => #ruby30th end def bar(arg: def m; “#ruby30th”; end) puts arg # => :m puts self.method(arg).call # => #ruby30th end

Slide 14

Slide 14 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ϒϩοΫͷଘࡏ͸͔ܽͤͳ͍ ɹɹɹϒϩοΫ͕ࣗ෼ͷߟ͑ํΛॊೈʹͯ͘͠ΕΔͱ͜Ζ i, chars = 0, %(# r u b y 3 0 t h) def foo(chars, &block) yield chars foo(&block) end foo(chars) { |chars| print chars[i]; i += 1; break if i >= chars.length } puts “\n” # => #ruby30th

Slide 15

Slide 15 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ɹɹɹϒϩοΫͷ͜͜ͷ͓͔͛Ͱ ɹɹɹॲཧΛऴྃ͠๨ΕͣʹࡁΉͱ͜Ζ ɹɹɹ File.open { |f| … } Thread.open { |t| … } ͱ͔ ͱ͔ ͜͜ ͜͜

Slide 16

Slide 16 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ྫ֎ॲཧ ɹɹɹػೳ΋ἧ͍ͬͯΔ͠௚ײతͰ໎ࢠʹͳΒͳ͍ͱ͜Ζ def foo raise LightningTalkTimeout if Time.now > lightning_talk_started_at + 300 rescue puts “OMG” else puts “Yaaaaay” ensure puts “Anyway, #ruby30th” end

Slide 17

Slide 17 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ɹɹɹศར ɹɹɹ͜Μͳ͜ͱ΋Ͱ͖Δ (“Perl”..“Smalltalk”).cover? “Ruby" # => true (“Perl”..“Python”).cover? “Ruby" # => false 1..30 ൣғϦςϥϧ 1…30

Slide 18

Slide 18 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ਺஋ʹ۠੾Γจࣈ͕ೖΕΒΕΔ ɹɹɹɹ ɹɹɹͷͰ໨ʹ༏͍͠ “LT͸ը໘੾Γସ͑ͷ࣌ؒࠐΈͰ #{5} ෼Ͱ͢ʂ” “LT͸ը໘੾Γସ͑ͷ࣌ؒࠐΈͰ #{300} ඵͰ͢ʂ” “LT͸ը໘੾Γସ͑ͷ࣌ؒࠐΈͰ #{300_000} ϛϦඵͰ͢ʂ” “LT͸ը໘੾Γସ͑ͷ࣌ؒࠐΈͰ #{300_000_000} ϚΠΫϩඵͰ͢ʂ” “LT͸ը໘੾Γସ͑ͷ࣌ؒࠐΈͰ #{300_000_000_000} φϊඵͰ͢ʂ” IUUQTUXJUUFSDPNSVCZUITUBUVT T

Slide 19

Slide 19 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ɹɹɹ ɹɹɹ ɹɹɹ͜ΕҰൃͰ5$1αʔόʔϓϩηε͕Ͱ͖ͯ͠·͏ ɹɹɹ͜ͷϝιουʹݶΒ্ͣख͍͜ͱ΍ͬͯ͘ΕΔ ɹɹɹศརϝιου͕ͨ͘͞Μ༻ҙ͞Ε͍ͯΔͱ͜Ζ require “socket” Socket.tcp_server_loop(12345) do |sock| sock.puts(“#ruby30th”) sock.close end Socket.tcp_server_loop

Slide 20

Slide 20 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ૊ΈࠐΈϥΠϒϥϦ͚ͩͰͳ͘ ඪ४ఴ෇ͷϥΠϒϥϦ܈͕͓ͦΖ͘͠ ॆ࣮͍ͯ͠Δͱ͜Ζ ɹɹɹ ɹɹɹ ΔΓ·ͷϥΠϒϥϦҰཡϖʔδͷϑϧεΫϦʔϯγϣοτΛࡱΔ΋ શવεϥΠυʹऩ·Βͳ͔ͬͨͷͰԣʹฒ΂ͨͷਤˣ

Slide 21

Slide 21 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ϥΠϒϥϦͱ͍͑͹ 3VCZ(FNTͱ#VOEMFSͷଘࡏ͸Ғେ ɹɹɹ ɹɹɹ๛෋ͳϥΠϒϥϦʹࠓ͙͢ΞΫηεͰ͖ͯ ɹɹɹґଘؔ܎ʹ೰Ή͜ͱͳ͘࢖͑Δͱ͜Ζ ɹɹɹ͍ͭ΋͓ੈ࿩ʹͳ͍ͬͯ·͢

Slide 22

Slide 22 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ΤίγεςϜʹݴٴ࢝͠ΊΔͱແݶʹ ޿͕Γͦ͏ͳͷͰ૊ΈࠐΈϥΠϒϥϦʹ࿩Λ ໭͢ͱɺ04ͷίϚϯυ΍γεςϜίʔϧ͕ 3VCZϨϕϧͰѻ͑Δͱ͜Ζ΋͏Ε͍͠ reader, writer = IO.pipe pid = fork { writer.puts “#ruby30th" } Process.waitpid(pid) exec("echo", “-n", reader.gets) # => #ruby30th

Slide 23

Slide 23 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ͜͜·Ͱ3VCZ͕ίʔυΛॻͨ͘Ίͷ αϙʔτΛͯ͘͠Ε͍ͯΔͱɺ ॻ͍͍ͯΔ͏ͪʹίʔυͷؾ͕࣋ͪ Θ͔ͬͯ͘ΔΑ͏ͳࡨ֮ΛಘΒΕΔ ɹɹɹʮ͜ͷίʔυ͸͜͏͍͏෩ʹॻ͍ͯཉ͍͠ͷͰ͸ ʯ

Slide 24

Slide 24 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ 3VCZࣗ਎΋ զʑϓϩάϥϚʹରͯ͠Φʔϓϯ ɹ ಺෦৘ใ΁ͷ"1*͕ఏڙ͞Ε͍ͯΔ ɹɹɹ $ ruby -e "pp RubyVM::AbstractSyntaxTree.parse('puts 1 + 2')" (SCOPE@1:0-1:10 tbl: [] args: nil body: (FCALL@1:0-1:10 :puts (LIST@1:5-1:10 (OPCALL@1:5-1:10 (LIT@1:5-1:6 1) :+ (LIST@1:9-1:10 (LIT@1:9-1:10 2) nil)) nil))) $ ruby -e "puts RubyVM::InstructionSequence.compile('puts 1 + 2').disasm" == disasm: #@:1 (1,0)-(1,10)> (catch: false) 0000 putself ( 1)[Li] 0001 putobject_INT2FIX_1_ 0002 putobject 2 0004 opt_plus [CcCr] 0006 opt_send_without_block 0008 leave

Slide 25

Slide 25 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ HFNͷڍಈΛௐ΂ΔͨΊʹ HFNͷιʔείʔυΛมߋͨ͠ޙɺ ࠶ίϯύΠϧͤͣʹ ࣮ߦͰ͖Δͱ͜Ζ ɹɹɹศར

Slide 26

Slide 26 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ JSC ɹɹɹଘࡏͦͷ΋ͷ͕ଚ͍ ɹɹɹͦͷ্γϯλοΫεϋΠϥΠτʹิ׬·Ͱʜ

Slide 27

Slide 27 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ίϚϯυʹΦϓγϣϯΛ౉͢ͱ ύʔαͷঢ়ଶมԽ͕֬ೝͰ͖ͯ֨޷͍͍ ruby -y ʜ

Slide 28

Slide 28 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ॊೈͳจ๏Λ׎͑ΔͨΊʹ ߏจنଇ͕ݸɺ ύʔαͷঢ়ଶ͕ݸ΋ ఆٛ͞Ε͍͍ͯͯ͢͝ ˞3VCZ࣌఺͓͍͠ௐ΂

Slide 29

Slide 29 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ͦΕΛ࣮ݱ͢Δ QBSTFZ͸ਆ͕͔Γతॴۀ

Slide 30

Slide 30 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ͦΕΛ۩ݱԽ͢Δ DPNQJMFD΋ਆ͕͔Γతॴۀ

Slide 31

Slide 31 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ JOTOTEFGʹ ʮੜ໋ɺӉ஦ɺͦͯ͠ສ෺ʹ͍ͭͯͷڀۃͷٙ໰ͷ౴͑ʯ Ͱ͋ΔBOTXFS໋ྩ͕ఆٛ͞Ε͍ͯΔͷͰ 3VCZ͸ԿͰ΋஌͍͍ͬͯͯ͢͝

Slide 32

Slide 32 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ຖ೥ΫϦεϚεʹ ϦϦʔε͞ΕΔͱ͜Ζ ɹɹɹϓϨθϯτͬΆͯ͘ྑ͍ ɹɹɹຖ೥͋Γ͕ͱ͏͍͟͝·͢ IUUQTXXXSVCZMBOHPSHKB

Slide 33

Slide 33 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ϑϦʔιϑτ΢ΣΞͳͱ͜Ζ ɹɹɹ.Z3VCZΛͭ͘Δ͜ͱ͕Ͱ͖Δ IUUQTXXXSVCZMBOHPSHFOBCPVUMJDFOTFUYU

Slide 34

Slide 34 text

3VCZ .3* ͷ޷͖ͳͱ͜Ζ ࠓ೔·Ͱ։ൃ͕ଓ͍͍ͯΔͱ͜Ζ ɹɹɹ৽͍͠ػೳ͕ͲΜͲΜ૿͍͑ͯΔ ɹɹɹݩʑ͋ͬͨػೳ΋ޙํޓ׵ੑʹ഑ྀͭͭ͠ ɹɹɹͲΜͲΜվળ͞Ε͍ͯΔ

Slide 35

Slide 35 text

3VCZ .3* ͷ޷͖ͳͱ͜ΖBOENPSFʜ .BU[JTOJDF BOE TPXFBSFOJDF 3VCZ,BJHJ%BZ)BMM"@@%4$

Slide 36

Slide 36 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ ɹɹ(JU)VC!TIJPJNN ɹɹ5XJUUFS!DPF@ ɹɹגࣜձࣾΤεɾΤϜɾΤε ɹɹ'VLVPLBSCग़਎"TBLVTBSCҭͪ a͓͍͕͓͠ૹΓ͠·ͨ͠