Slide 1

Slide 1 text

͠͹Β͓͘଴͍ͪͩ͘͞ ✓ ͝ཡͷεϙϯαʔͷఏڙ ʹΑΓ͓ૹΓ͠·͢

Slide 2

Slide 2 text

slide sponsors 044(BUFח⿫⸇׃״ֲׅ ջأذ؍٦ـؤռ䋆涪㡰⚥!NB ؔزشה3VCZדֶ䖉׍׃גְתׅկ!NJXB ؔزشה3VCZדֶ䖉׍׃גְתׅկ!NBNF 歍׃鴥׫כUPSVCZEPPSLFFQFSKQַ׵!WFTUJHF@ ؔزشה3VCZծ➙䎃כְְ괏ス ך傈!1613- 虠加歕ջ梾楤㼔Ꟍ枾䒍莔ռ׀勻䏄ֶ䖉׍׃גֶ׶תׅ!PHJKVO

Slide 3

Slide 3 text

more slide sponsors Ⰻ鿇׌׏ה䙼׏ג׋??![[BL@KQ E3VCZח״׷ⴓ侔٥8FCفؚٗٓىؚٝ ؔ٦ي爡F#PPL4UPSF IUUQFTUPSFPINTIBDPKQUJUMFT1!IJTBTIJN ׫זׁתծTFLJ眍׾ֶ嚂׃׫ֻ׌ְׁկ䊛䃵歲꥔ך倯כծLBXBTBLJSCծ ZPLPIBNBSC׾ֶ鑐׃ֻ׌ְׁկ,ذٖؽך飑ⰅכծTFLJׁ׿穗歋ד׀湱锑ְ׋ ׌ֽ׷ה׀⼿⸂׃תׅկ!UTVCPJ &NCFS4BQQPSP׾״׹׃ֶֻיְָ׃תׅխխխխխխխ IUUQTXXXGBDFCPPLDPNHSPVQTFNCFSTBQQPSP!USJDLOPUFT ְִ٦ְ✌✌؟ٝٓ؎ؤ⳿ꨡד3VCZ8PSME$POGFSFODF遤ֲֿ ׈٦!ZBODZB

Slide 4

Slide 4 text

dRuby in the last century [email protected]

Slide 5

Slide 5 text

@m_seki Rubyίϛολ ERB, dRuby, Rindaͷஶऀ લ࠲͕Matz - Ruby committer - Author of ERB, dRuby, Rinda

Slide 6

Slide 6 text

Agenda dRubyͷੜཱ͍ͪ dRubyͷ঺հ ͜Ε͔Β - The birth of dRuby - Introduction of dRuby - Future

Slide 7

Slide 7 text

1999 [ruby-list:15406] 1st dRuby

Slide 8

Slide 8 text

1st dRuby on T-shirts TV[VSJKQN@TFLJ

Slide 9

Slide 9 text

2005 - ·ͩॳ࡮Γങ͑·͢ dRuby ʹΑΔ ؔকढ़ஶ ෼ࢄ ɾ Web ϓϩάϥϛϯά First printing from 2005 (Still available)

Slide 10

Slide 10 text

΋ͬͱΘ͔Γ΍͘͢΄Ίͯʂ Praise it more directly, please!

Slide 11

Slide 11 text

2012 (-2014 ઈ൛) Publication from 2012 (Become out of print in 2014)

Slide 12

Slide 12 text

2000 Perl/Ruby Conference (Kyoto) 2000೥ ࠷ॳͷߨԋ͸͜ͷձ৔ ײܹ͍ͯ͠Δ - Perl/Ruby Conference (Kyoto) - The first talk I gave was in year 2000 at this place. - I am impressed.

Slide 13

Slide 13 text

2000-2016 ࠓ೔͸ಉ͡ձ৔Ͱ·ͨdRubyͷ࿩Λ͍ͨ͠ I would like to give a talk about dRuby again in the same place today.

Slide 14

Slide 14 text

͠͹Β͓͘଴͍ͪͩ͘͞ ✓ ✓ 4MJEFTQPOTPST ✓ "HFOEB please wait for a moment

Slide 15

Slide 15 text

OOPARTS I was just reminded of dRuby's OOPARTS-ness

Slide 16

Slide 16 text

OOPARTS

Slide 17

Slide 17 text

dRuby͸Ͳ͔͜Β͖ͨͷ dRubyҎલ (Before dRuby: BD) Where did dRuby come from? - Before dRuby (BD)

Slide 18

Slide 18 text

BD8͘Β͍ͷ͜ͱ ੲͬΆ͍UNIXΛ࢖ͬͨ૊ΈࠐΈγεςϜ খ͞ͳσʔϞϯͷ૊Έ߹Θͤ fork, pipe, signal, SystemV IPC select()ͳ͔ͬͨ From the old days (BD8) - Embedded system using old-fashioned UNIX - Combination of tiny daemons - fork, pipe, signal, SystemV IPC - select() did not exist

Slide 19

Slide 19 text

BD8͘Β͍ͷ͜ͱ ܭଌ૷ஔ܈Λ੍ޚ ૷ஔ͔ΒσʔλΛऔΔ/੍ޚ͢Δͨ͘͞Μ ͷσʔϞϯͱͦΕΛ·ͱΊΔσʔϞϯ ৘ใΛՄࢹԽ͢ΔΞϓϦέʔγϣϯ ϓϩηεΛ෼͚Δඞવੑ͕͋ͬͨ From the old days (BD8) - Controlling a group of measurement devices - Many daemons that extract and control data from devices, and a daemon that controls them in turn - Need to divide between processes

Slide 20

Slide 20 text

CGIͷ୯७ͳੈք (BD5) ԶϚΠΫϩαʔϏε࣌୅ request/response, stateless ͍ΖΜͳγεςϜΛCGIͰॻ͖௚ͨ͠ Perl, AppleScript A simple world of CGI - My Microservices era - request/response, stateless - Rewrote various systems using CGI

Slide 21

Slide 21 text

Ruby & shttpsrv (BD1) 1998-9 Ruby & shttpsrvʹग़ձ͏ 1998-9, Met Ruby & shttpsrv

Slide 22

Slide 22 text

shttpsrv RubyͰॻ͔ΕͨHTTPαʔό WEBrickΑΓͣͬͱલ খ͍͞ - Web server written in Ruby - Before WEBrick - Small and extensible

Slide 23

Slide 23 text

HTTPΛϓϩηεʹຒΊࠐΉ খ͞ͳΞϓϦʹWebαʔόΛຒΊࠐΉ ΞϓϦؒΛHTTPͰͭͳ͍Ͱָ͠ΜͰͨ Embedding HTTP into processes - Embedding web server into small apps - Had fun Application communication via HTTP

Slide 24

Slide 24 text

ͳΜ͔ؾʹೖΒͳ͍ ͍ͭ΋RubyͱWebͷੈքͷ຋༁࡞ۀͯͨ͠ HTTPʹ͓͚ΔΦϒδΣΫτͷަ׵ͷ੍໿ Server - Clientͷݻఆతͳؔ܎ ϝιουͱ͍͏ΑΓؔ਺ίʔϧ Not so cool because... - Routine work translating between Ruby and the Web world - HTTP's restriction on how to exchange objects - Fixed relation between Server and Client - More like a functional call rather than a method

Slide 25

Slide 25 text

RubyͰ࿩͍ͨ͠ Ruby ObjectͳΜ͔ͩΒɺRubyΆ͘࿩͍ͨ͠ Want to speak in Ruby - Given that they are Ruby objects, it is tempting to speak in Ruby-ish way

Slide 26

Slide 26 text

RubyʹؼΖ RubyͷΑ͏ʹৼΔ෣͏෼ࢄΦϒδΣΫτ RPCͰͳ͘RMI Rubyͷϝιουݺͼग़͠ΛsocketͰ֦ு Return to Ruby - Distributed objects acting like Ruby - No RPC, but RMI - Extending Ruby's method invocation with sockets

Slide 27

Slide 27 text

ϩϚϯ RMIΛࢥ͍͍͔ͭͯΒͷࢥߟ࣮ݧ ෼ࢄΦϒδΣΫτ͕͋Δ͔ͷΑ͏ͳԋग़ͱ͸ OOPLͱΦϒδΣΫτΈ͍ͨͳ... Romance - Thought-experiment since the idea of RMI - How to make it look like there are distributed objects - Something like OOP-language and objects

Slide 28

Slide 28 text

ͭ·Γ ؆୯௨৴ϥΠϒϥϦͰ͸ͳ͍ ௨৴Λ؆୯ʹ͢Δ͜ͱ͸ૂ͍ͬͯͳ͍ طଘͷRPCϓϩτίϧͷϥούʔͰ͸ͳ͍ ΋ͬͱ৘ॹతͳ΋ͷ In other words, Not a library that makes communication simple - It doesn't aim to make communication simple - It is not a wrapper of an already-existing RPC protocol - Something more poetic

Slide 29

Slide 29 text

͠͹Β͓͘଴͍ͪͩ͘͞ ✓ ✓ E3VCZલ࢙Λઆ໌ͨ͠ ✓ ͔ͭ͗ΒE3VCZΛ঺հ please wait for a moment - Done: Pre-history of dRuby - Now, we are on to demonstration

Slide 30

Slide 30 text

dRubyͯͳʹʁ ෼ࢄΦϒδΣΫτγεςϜ ϓϩηεӽ͠ʹϝιου͕ݺ΂Δ ϓϩηεؒͰΦϒδΣΫτ͕ૹΕΔ What is dRuby? - Distributed Object System - Can Invoke methods in different process - Can send objects between process

Slide 31

Slide 31 text

ਐΊํ irbͷσϞͰجຊతͳಈ࡞Λઆ໌ ΈΜͳTerminalΛ2ͭ༻ҙͯ͠ʂ unixͷਓ΋windowsͷਓ΋! Outline - Basis using irb demo - Please prepare two teminals!

Slide 32

Slide 32 text

dRubyͷ͓͔͛ͰWindowsͰ ΋࣮ݧͰ͖ΔΑʂ Thanks to the dRuby book, gets on Windows no longer blocks other threads.

Slide 33

Slide 33 text

Demo1 Starting up dRubyΛ࢖͏ͨΊͷ४උ ؆୯ͳRMI Key Value Store Demo1 Starting Up - Preparing to use dRuby - A simple RMI - Key-Value Store

Slide 34

Slide 34 text

Hashαʔό Hash server (oso-matz) client (jushi-matz) Hash server kvs['greeting'] = 'Hello, World.'

Slide 35

Slide 35 text

start_service start_serviceͰ͸͡Ί·͢ URIͱΦϒδΣΫτΛࢦఆͯ͠ެ։ ໌ࣔతͳެ։ DRb.start_service('druby://localhost:54321', {}) DRb.uri #=> 'druby://localhost:54321' DRb.front #=> {} start_service - Begin with start_service - Publicize URI and an object - Explicit publicizing

Slide 36

Slide 36 text

Proxy URI͔ΒProxyΛੜ੒ kvs = DRbObject.new_with_uri('druby://localhost:54321') Generates a proxy from a URI

Slide 37

Slide 37 text

ͨͩݺͿ͚ͩ ผϓϩηεͷϝιουݺͼग़͠ Hash#[]=(k, v) kvs['greeting'] = "Hello, World." Just call the method - Calling method in a different process

Slide 38

Slide 38 text

Hashαʔό DRb.start_service('druby://localhost:54321', {}) DRb.front #=> {} DRb.start_service kvs = DRbObject.new_with_uri('druby://localhost:54321') kvs['greeting'] = "Hello, World." DRb.front #=> {"greeting"=>"Hello, World."}

Slide 39

Slide 39 text

Demo1 DRb.start_service('druby://localhost:54321', {}) DRb.front DRb.start_service kvs = DRbObject.new_with_uri('druby://localhost:54321') kvs['greeting'] = "Hello, World."

Slide 40

Slide 40 text

΍ͬͨ͜ͱ DRb.start_serviceͰ͸͡Ίͨ URIͰproxyΛͭͬͨ͘ ͋ͱ͸ݺͿ͚ͩ What we did - Started with DRb.start_service - Created a proxy with a URI - Then, we just called it

Slide 41

Slide 41 text

ͼͬ͘Γͯ͠ʂ dRubyͷ४උ͸start_service͚ͩ ΠϯλʔϑΣΠεఆٛෆཁ ੲ͸IDLఆٛ͢ΔγεςϜ͕ଟ͔ͬͨ Surprised, aren't you? - Only need to do start_service to prepare for dRuby - No need to declare interfaces - In the old days, many systems defined IDL

Slide 42

Slide 42 text

Demo2 Ͳ͕ͬͪαʔόʁ ҉໧తʹObjectΛެ։͠·͢ jushi-matzͷ $stdout Λoso-matz͕ݺͼ·͢ server / clientͷཱ৔͕ೖΕସΘΓ·͢ Demo 2 Which one is the server? - Implicitly publicize an object - oso-matz will call $stdout on jushi-matz - Server/client roles will switch

Slide 43

Slide 43 text

ΦϒδΣΫτΛૹΔ ϝιουͷҾ਺Ͱ$stdoutΛૹΔ ҉໧తʹެ։ kvs['outlet'] = $stdout Sending objects - Send $stdout as method arguments - Publicized implicitly

Slide 44

Slide 44 text

ٯస ϦϞʔτͷ$stdoutͷϝιουΛݺͿ ϗϯϞϊΛ͍࣋ͬͯΔํ͕αʔόʔ ϝιουΛݺͿํ͕ΫϥΠΞϯτ DRb.front['outlet'].class #=> DRb::DRbObject DRb.front['outlet'].puts('Hello, Again.') Reversal - Call $stdout methods on the remote - The one that has the read one is the server - The one that calls the method is the client

Slide 45

Slide 45 text

Demo2 Ͳ͕ͬͪαʔόʁ DRb.front['outlet'].class #=> DRb::DRbObject DRb.front['outlet'].puts('Hello, Again.') kvs['outlet'] = $stdout kvs['outlet'] #=> $stdout Demo2 Which one is the server?

Slide 46

Slide 46 text

Demo2 Ͳ͕ͬͪαʔόʁ kvs['outlet'] = $stdout kvs['outlet'] #=> $stdout DRb.front['outlet'].class #=> DRb::DRbObject DRb.front['outlet'].puts('Hello, Again.')

Slide 47

Slide 47 text

΍ͬͨ͜ͱ jushi-matzͷ$stdoutΛoso-matzʹڭ͑ͨ oso-matz͸ͦΕʹputsͨ͠ jushi-matzͷ୺຤ʹҹࣈ͞Εͨ What we did - Taught oso-matz about $stdout on jushi-matz - oso-matz did puts on it - Printed on a terminal on jushi-matz

Slide 48

Slide 48 text

ͳʹ͕͓͖ͨʁ ҉໧తͳެ։ $stdoutΛࣗಈతʹproxyʹऔΓସ͑ͨ Marshal.dumpͷՄ൱͕৚݅ dumpՄೳ ➡ ෳ੡ dumpෆՄೳ ➡ proxy What happened? - Implicit publicization - Replaced $stdout with proxy automatically - Depends on the availability of Marshal.dump - dumpable => duplication - not dumpable => proxy

Slide 49

Slide 49 text

Marshal.dump 'outlet'͸dumpͰ͖Δ ෳ੡ $stdout͸dumpͰ͖ͳ͍ proxy Marshal.dump - 'outlet' is dumpable - duplicating - $stdout cannot be dumped - proxy kvs['outlet'] = $stdout # kvs.[]=('outlet', $stdout)

Slide 50

Slide 50 text

͜͜Ͱͷԋग़ RubyͳΒҾ਺΍໭Γ஋͕ෳ੡͞Εͳ͍ dRubyͰ΋͢΂ͯproxyʹ͢Δ΂͖ʁ ౰વͦ͏ࢥ͏ true, false, nil, ਺... ͜Ε΋proxyʹ͢Δ΂͖ʁ ͏ʔΜ Some thinking - In Ruby, arguments and return values are not duplicated - Should dRuby proxy everything? - Yes, of course - true, false, nil, numbers, ... should it also proxy them? - Mmm

Slide 51

Slide 51 text

ࣗવʹݟ͑Δଥڠ΋ඞཁͩ ӬԕʹProxyͰ͸஋͕खʹೖΒͳ͍ Ͳ͔͜ʹڥք͕ඞཁͩ Marshal.dumpʹͨ͠ ͳΜ͔͍͍ײ͡ʹಈ͘ Natural compromise - Using proxy, we will never get the value - We need a border somewhere - Made it using Marshal.dump - Works good

Slide 52

Slide 52 text

OOPͬΆ͞ ΦϒδΣΫτ͕૬ޓʹݺͼ߹͑Δ͜ͱ How to make it look OOP-ish - Let objects call each other

Slide 53

Slide 53 text

ruby-list:15406 1st sampleɹ require 'drb.rb' class DRbEx def initialize @hello = 'hello' end def hello @hello end def sample(a, b, c) a.to_i + b.to_i + c.to_i end end if __FILE__ == $0 DRb.start_service('druby://localhost:7640', DRbEx.new) DRb.thread.join end require 'drb.rb' class DRbEx2 def initialize(n) @n = n end def _dump raise TypeError, 'can\'t dump' end def to_i @n.to_i end end if __FILE__ == $0 DRb.start_service('druby://localhost:7950') ro = DRbObject.new(nil, 'druby://localhost: 7640') p ro.hello p ro.sample(DRbEx2.new(1), 2, 3) p ro.sample(1, ro.sample(DRbEx2.new(1), 2, 3), DRbEx2.new(3)) end

Slide 54

Slide 54 text

OOPͬΆ͞ ΠςϨʔλ΋ಉ͡࢓૊ΈͰಈ͘Α block ro.each do |it| foo(it) end How to make it look OOP-ish - Iterators also work the same way - block

Slide 55

Slide 55 text

Demo3 ෼ࢄQueue QueueΛ࢖ͬͯ଴ͪ߹Θͤ͠·͢ ϓϩηεؒͰpush/pop Demo 3 Distributed Queue - Wait using queue - push/pop between processes

Slide 56

Slide 56 text

଴ͪ߹Θͤ QueueΛ࢖ͬͯ଴ͪ߹Θͤ jushi-matz͔Βͷσʔλͷ౸ணΛ଴ͪ·͢ Waiting - Waiting using queue - Wait for the data from jushi-matz to arrive

Slide 57

Slide 57 text

४උ QueueΛ࡞ͬͯHashʹೖΕ·͢ popͯ͠଴ͪ·͢ queue = Queue.new DRb.front['queue'] = queue queue.pop Preparation - Create a queue, and put it in a Hash - Pop, and wait

Slide 58

Slide 58 text

σʔλΛૹΔ Hashαʔό͔ΒQueueΛखʹೖΕΔ pushͰσʔλΛૹΓ·͢ queue = kvs['queue'] queue.push(1.0) Sending data - Obtain a queue from a hash server - send a data

Slide 59

Slide 59 text

Demo3 ෼ࢄQueue queue = Queue.new DRb.front['queue'] = queue queue = kvs['queue'] queue.push(1.0) queue.pop #=> 1.0 queue.pop #(blocked) queue.push(2.0) queue.pop #=> 2.0 (cont.) Demo 3 Distributed Queue

Slide 60

Slide 60 text

Demo3 ෼ࢄQueue queue = Queue.new DRb.front['queue'] = queue queue.pop queue.pop queue = kvs['queue'] queue.push(1.0) queue.push(2.0)

Slide 61

Slide 61 text

ͳʹ͕͓͖ͨʁ HashαʔόΛհͯ͠QueueΛखʹೖΕͨ Name Serivce QueueΛ࢖ͬͯೋਓ͕଴ͪ߹Θͤͯͨ͠ What happened? - A queue was obtained via a hash server - Two people were waiting for each other using a queue

Slide 62

Slide 62 text

͜͜Ͱͷԋग़ Queue, Mutex, Monitor ... ThreadಉظϝΧχζϜ΋ͦͷ··࢖͑Δ Some thoughts here - Queue, Mutex, Monitor, ... - We can use the Thread-synchronization mechanism as is

Slide 63

Slide 63 text

dRuby͕޲͘ঢ়گ ण໋ͷҧ͏৘ใΛѻ͏ ଴ͪ߹ΘͤΛσβΠϯ͢Δ͜ͱ͕ଟ͍ Scenarios suited for dRuby - Handling information of different life span - A system of waiting

Slide 64

Slide 64 text

BD8͘Β͍ͷ͜ͱ ܭଌ૷ஔ܈Λ੍ޚ ૷ஔ͔ΒσʔλΛऔΔ/੍ޚ͢Δͨ͘͞Μ ͷσʔϞϯͱͦΕΛ·ͱΊΔσʔϞϯ ৘ใΛՄࢹԽ͢ΔΞϓϦέʔγϣϯ ϓϩηεΛ෼͚Δඞવੑ͕͋ͬͨ From the old days (BD8) - Controlling a group of measurement devices - Many daemons that extract and control data from devices, and a daemon that controls them in turn - Need to divide between processes

Slide 65

Slide 65 text

Twitterͷ৔߹ In case of Twitter

Slide 66

Slide 66 text

Prototyping Twitter ॳظ͸dRuby/RindaͩͬͨΒ͍͠ ͍·͸࢖ͬͯͳ͍ ࣗ෼ͷαʔϏε΋dRubyͰ͸͡Ίͯ࠷ޙʹ͸ ࢖Θͳ͘ͳΔ͜ͱ͕͋Δ ར༻͞Εͯޮ཰͋͛Δඞཁ͕Ͱ͔ͯΒ - It looks like they had used dRuby/Rinda in the beginning. - But not now. - Even I sometimes start some services using dRuby, ending up not using it. - It happened since my services gained popularity, and I needed to make them more efficient.

Slide 67

Slide 67 text

঺հͷ·ͱΊ جຊతͳdRubyͷ࢖͍ํΛ঺հͨ͠ ४උ RMI Queue ෼ࢄΦϒδΣΫτΆ͔ͬͨʁ Interim summary - Introduced basic uses of dRuby - Preparation - RMI - Queue - Looked like distributed objects?

Slide 68

Slide 68 text

͠͹Β͓͘଴͍ͪͩ͘͞ ✓ ✓ E3VCZͷσϞΛͨ͠ ✓ ෼ࢄΦϒδΣΫτΆ͍ʁ ✓ ଓ͖͸ॻ੶Ͱʂ ✓ ࣍͸ݴ͍༁ please wait for a moment - Did demo on dRuby - Looks like distributed objects? - Please buy the book for more information! - Next: the excuses

Slide 69

Slide 69 text

͜Ε͔Β ௚͍ͨ͠ͱ͜Ζ ॳظͷ࣮૷ʹ໭͍ͨ͠ͱ͜Ζ͕͍͔ͭ͘ ςετ ܒ໤͢Δ From now on - Want to fix: - Several points to revert to the initial implementation - Tests - Enlighten people

Slide 70

Slide 70 text

ηΩϡϦςΟͬΆ͍ͷফ͍ͨ͠ ACL, insecure_method ... dRuby͸RMIͰϝιουݺͼग़͠ͷ֦ு ϝιουݺͼग़͠ͳͷͰ݀ͩΒ͚Ͱྑ͍ ةͳ͍΋ͷ͸ةͳ͘ݟ͑Δ΂͖ Want to hide security-ish things - ACL, insecure_method, ... - dRuby extends methods with RMI - It is okay to have loop holes since it is a method call - Dangerous things should look dangerous

Slide 71

Slide 71 text

UnitTest ڈ೥akr͞Μʹݴ͍༁ͨ͠ צҧ͍ͯͨ͠ Ұൠతʹ͸APIͷϝιου୯Ґʹॻ͘΋ͷ ͩͬͨΒ͍͠ ςετέʔεΛετʔϦʔϨϕϧͰॻ͘΂ ͖ͩͱࢥͬͯͨ - I made an excuse to akr last year. - I mistook it. - Turned out that in general, they should be written per API method. - I had thought they should be written at story levels.

Slide 72

Slide 72 text

ܒ໤͢Δ ·͓ͣ΋͠Ζ͕ͬͯ΋Β͏ ฒߦॲཧͷצॴ(ʁ)ʹؾ͍ͮͯ΋Β͏ Enlightening people - Have people enjoy it. - Let them realize the tips of parallel processing

Slide 73

Slide 73 text

͠͹Β͓͘଴͍ͪͩ͘͞ ✓ ✓ ඪ४ఴ෇Λଓ͚ͯ΋Β͏ Α͏ʹΞϐʔϧ͢Δ ✓ ΋͏ऴΘΓ ✓ εϥΠυӳ༁νʔϜʹ͓ ྱΛ͍͏ please wait for a moment - Appeal to have them continuously attached by default - Almost the end

Slide 74

Slide 74 text

History of dRuby (and me) 1999-3 ERB 1999-9 DRb 2003 committer 2010 pokemon-master 2000 Rinda 1998 started ruby 2006 - 2016 Ruby Kaigi

Slide 75

Slide 75 text

·ͱΊ 2000೥ͱಉ͡৔ॴͰdRubyͷ࿩Λͨ͠ dRubyͷੜཱ͍ͪ dRubyͷ঺հ ͜Ε͔Β 21ੈل΋͓΋͠Ζ͕ͬͯ΋Β͑ΔͰ͠ΐ͏͔ Conclusion - I gave a talk on dRuby at the same place I did in year 2000. - Birth of dRuby - Introduction of dRuby - Future - Will people still have fun with dRuby in the 21st century?