$30 off During Our Annual Pro Sale. View Details »

Tokyo Ruby Kaigi

Tokyo Ruby Kaigi

My talk from Tokyo Ruby Kaigi

Aaron Patterson

May 28, 2016
Tweet

More Decks by Aaron Patterson

Other Decks in Technology

Transcript

  1. View Slide

  2. ͜Μʹͪ͸ʂ

    View Slide

  3. ೔ຊޠೖྗࢼݧ

    View Slide

  4. Aaron Patterson
    @tenderlove

    View Slide

  5. GitHub

    View Slide

  6. ko1: ϓϩάϥϛϯάΛ͍ͯͯ͠ʮ͓͓ɺ
    ੌ͍ίʔυ͕ॻ͚ͨʯʮ͜Ε͸ੌ͍΋ͷ
    Λ࡞ͬͯ͠·ͬͨʯͷΑ͏ͳܦݧͳͲ

    View Slide

  7. Me: ʮੌ͍ίʔυʯ
    ͍͍ͬͯͬͨԿͩΖ͏

    View Slide

  8. View Slide

  9. ;ͨͭͷҙຯ
    ڪΖ͍͠ / ා͍
    ૉ੖Β͍͠ / ྑ͍

    View Slide

  10. ೋͭͷτϐοΫ
    ڪΖ͍͠ / ා͍:
    PHP
    ૉ੖Β͍͠ / ྑ͍:
    Computer Vision
    ൿີ

    View Slide

  11. ੌ͍ίʔυ
    ૉ੖Β͍͠ / ྑ͍

    View Slide

  12. ίϯϐϡʔλ
    Ϗδϣϯ

    View Slide

  13. ΨϥΫλ͕
    ͍ͬͺ͍

    View Slide

  14. Magic The
    Gathering (MtG)ͱ͸

    View Slide

  15. Collectible Card
    Game

    View Slide

  16. ࢲͷ໰୊ (Χʔυͷத਎)
    • Too many cards
    • Don’t know what they do
    • Are they worth any money?
    • Plus many more!

    View Slide

  17. ίϯϐϡʔλʔʹ߹͏
    ໰୊Έ͍ͨ
    Seems like a job for computers!

    View Slide

  18. ࢲͷղܾ

    View Slide

  19. ਓ޻஌ೳ
    Χϝϥ
    ೣ!
    Ruby!

    View Slide

  20. High Level Process

    View Slide

  21. ࣸਅΛࡱΔ
    ΧʔυΛൈ͚Δ
    ΧʔυΛ֬ೝ͢Δ
    σʔλΛอଘ͢Δ

    View Slide

  22. Χʔυͷೝࣝ

    View Slide


  23. ͬͨ
    ਪଌ
    ϓϩϯϓτ
    ڭ͑Δ
    ίʔύε

    View Slide


  24. ͬͨ
    ਪଌ
    ϓϩϯϓτ
    ڭ͑Δ
    ίʔύ
    ε

    View Slide

  25. ਓ޻஌ೳ

    View Slide

  26. σʔλɹϞσϧ

    View Slide

  27. Χʔυͷ৘ใ

    View Slide

  28. ࣸਅ
    ໊લ
    ਓؾ౓
    ηοτ

    View Slide

  29. image belongs_to(:card)
    card has_one(:image)

    View Slide

  30. View Slide

  31. image belongs_to(:card)
    card has_many(:images)

    View Slide

  32. View Slide

  33. image habtm(:cards)
    card habmt(:image)

    View Slide

  34. ׬શσʔλϞσϧ
    Cards
    Images
    Hashes
    habtm
    has_many

    View Slide

  35. ίʔύεͷੜ੒

    View Slide

  36. Executor Pool
    class ThreadExecutor
    def initialize size
    @queue = Queue.new
    @size = size
    @pool = size.times.map { |i|
    Thread.new { while job = @queue.pop; job.run end }
    }
    end
    def execute job = Proc.new
    promise = Promise.new job
    @queue << promise
    promise
    end
    def shutdown
    @size.times { @queue << nil }
    @pool.each(&:join)
    end
    end

    View Slide

  37. Queue up work
    promise = @executor.execute do
    @http_pool.with_connection do |conn|
    uri = URI 'http://gatherer.wizards.com/Pages/Default.aspx'
    response = conn.request uri
    # save the response
    end
    end
    # some time later
    promise.value

    View Slide

  38. Me Wizards

    View Slide

  39. 1.6GB

    View Slide

  40. http://mtgjson.com/

    View Slide

  41. ॻ͘લʹ
    άʔάϧͨ͠ํ͕͍͍

    View Slide

  42. Χʔυͷೝࣝ

    View Slide

  43. ஌֮తϋογϡ
    libphash (gem install phasion)

    View Slide

  44. 11998341215223291070 12079686925145871551
    Reference Scanned

    View Slide

  45. ϋϛϯάڑ཭
    require 'phashion'
    left = Phashion.image_hash_for "a.jpg"
    right = Phashion.image_hash_for "b.jpg"
    p Phashion.hamming_distance left, right # => 8

    View Slide

  46. 5622372658725034411 12079686925145871551
    Reference Scanned

    View Slide

  47. ϋϛϯάڑ཭
    require 'phashion'
    left = Phashion.image_hash_for "c.jpg"
    right = Phashion.image_hash_for "b.jpg"
    p Phashion.hamming_distance left, right # => 28

    View Slide

  48. ϋογϡΛ௥Ճ͢Δͱ
    ஌͕ࣝ૿͑Δ

    View Slide

  49. ϋʔυ΢ΣΞ

    View Slide

  50. View Slide

  51. View Slide

  52. View Slide

  53. ιϑτ΢ΣΞ

    View Slide

  54. OpenCV
    https://github.com/ruby-opencv/ruby-opencv

    View Slide

  55. ࡱͬͨࣸਅ

    View Slide

  56. View Slide

  57. ཉ͍͠Πϝʔδ

    View Slide

  58. View Slide

  59. Χʔυͷൈ͖ํ

    View Slide

  60. ؆୯ͳ8ஈ֊͚ͩ!*
    * ؆୯͡Όͳ͍ɺଟ෼

    View Slide

  61. View Slide

  62. લॲཧ

    View Slide

  63. άϨʔεέʔϧ
    gray = OpenCV.BGR2GRAY img

    View Slide

  64. View Slide

  65. Τοδݕग़
    canny_img = gray.canny @thresh, @thresh
    http://en.wikipedia.org/wiki/Canny_edge_detector

    View Slide

  66. View Slide

  67. ྠֲΛݟ͚ͭΔ
    contours = []
    contour_node = processed.find_contours(
    :mode => OpenCV::CV_RETR_TREE,
    :method => OpenCV::CV_CHAIN_APPROX_SIMPLE)
    while contour_node
    unless contour_node.hole?
    contours << contour_node
    end
    contour_node = contour_node.h_next
    end

    View Slide

  68. ྠֲ
    ݀

    View Slide

  69. View Slide

  70. Ұ൪େ͖ͳྠֲ
    max = contours.max_by { |c|
    c.contour_area
    }

    View Slide

  71. View Slide

  72. ଟ֯ܗΛݟ͚ͭΔ
    approx = max.approx_poly(:method => :dp,
    :recursive => true,
    :accuracy => 0.02 * peri)
    x = approx.convex_hull2.to_a
    clockwise_points = clockwise x.reverse

    View Slide

  73. View Slide

  74. ಁࢹม׵ͷߦྻ
    to = [
    OpenCV::CvPoint2D32f.new(0, 0),
    OpenCV::CvPoint2D32f.new(width, 0),
    OpenCV::CvPoint2D32f.new(width, height),
    OpenCV::CvPoint2D32f.new(0, height),
    ]
    from = polygon_points
    transform = OpenCV::CvMat.get_perspective_transform(from, to)

    View Slide

  75. ΠϝʔδΛม׵͢Δ
    new_img = img.warp_perspective transform

    View Slide

  76. View Slide

  77. ڥք࠲ඪΛઃఆ͢Δ
    new_img.set_roi OpenCV::CvRect.new(0, 0, width, height)

    View Slide

  78. View Slide

  79. It’s Just That Easy!

    View Slide

  80. ϢʔβʔΠϯλʔϑΣΠε
    ΧϝϥͰ
    ࡱͬͨ
    Πϝʔδ
    ਪଌ
    #1
    ਪଌ
    #2
    ਪଌ
    #3

    View Slide

  81. View Slide

  82. Կ͕͋Δʁ
    Card.joins(:images)
    .where('images.type' => 'UserImage')
    .group('cards.name')
    .count

    View Slide

  83. Ͳͷ͙Β͍ྑ͍ʁ
    Card.joins(:images) # best
    .where('images.type' => 'UserImage')
    .order('rating desc').first
    Card.joins(:images) # worst
    .where('images.type' => 'UserImage')
    .order('rating asc').first

    View Slide

  84. ࠷ߴ:

    View Slide

  85. ࠷௿:

    View Slide

  86. ϓϩδΣΫτͷ໰୊

    View Slide

  87. য఺ͷ࣌ؒ

    View Slide

  88. View Slide

  89. ࣦഊͷ࣌

    View Slide

  90. View Slide

  91. ֆ͸ࣅͯΔ

    View Slide

  92. View Slide

  93. अຐೣ

    View Slide

  94. View Slide

  95. ར఺
    ઃఆ͸؆୯
    ඞཁϋʔυ΢ΣΞ͸͋·Γͳ͍
    ͍҆
    ΩϟϦϒϨʔτ͠ͳ͍

    View Slide

  96. ܽ఺
    ෳࡶͳιϑτ΢ΣΞ
    ࿑ಇ
    ֬ೝͷ஗͞

    View Slide

  97. ࠓޙͷ׆ಈ

    View Slide

  98. ࣗಈԽ

    View Slide

  99. ੌ͍ίʔυ
    ڪΖ͍͠ / ා͍

    View Slide

  100. PHP + Ruby

    View Slide

  101. Phuby (ϑʔϏΟ)
    https://github.com/tenderlove/phuby
    એ఻

    View Slide

  102. Examples

    View Slide

  103. PHPͷ
    ΦϒδΣΫτΛ࢖͏

    View Slide

  104. ਺ࣈ
    require 'phuby'
    Phuby::Runtime.php do |runtime|
    runtime.eval "$v = strlen('PHP INSIDE OF RUBY');"
    puts runtime['v'] # => 18
    end

    View Slide

  105. จࣈྻ
    require 'phuby'
    Phuby::Runtime.php do |runtime|
    runtime.eval "$name = 'Aaron';"
    puts runtime['name'] # => Aaron
    end

    View Slide

  106. ഑ྻ
    require 'phuby'
    Phuby::Runtime.php do |runtime|
    runtime.eval "$cars = array('Toyota', 'Honda', 'BMW');"
    p runtime['cars'][0] # => Toyota
    p runtime['cars'][1] # => Honda
    p runtime['cars'][2] # => BMW
    end

    View Slide

  107. ࿈૝഑ྻ
    require 'phuby'
    Phuby::Runtime.php do |runtime|
    runtime.eval "$e = array('foo' => 'bar', 'bar' => 'baz');"
    p runtime['e']['foo'] # => 'bar'
    p runtime['e']['bar'] # => 'baz'
    end

    View Slide

  108. Rubyͷ
    ΦϒδΣΫτΛ࢖͏

    View Slide

  109. Objects
    require 'phuby'
    class RubyKaigi
    def where
    puts "౦ژ"
    end
    end
    Phuby::Runtime.php do |runtime|
    runtime['kaigi'] = RubyKaigi.new
    runtime.eval("$kaigi->where();") # => ౦ژ
    end

    View Slide

  110. ͳͥʁ

    View Slide

  111. ͍͍͔Β

    View Slide

  112. scientists were so
    preoccupied with
    whether or not they could
    that they didn't stop to
    think if they should.

    View Slide

  113. ϓϩάϥϜͷମܕ

    View Slide

  114. Runtime Proxy
    Object Map
    Ruby Object Proxy
    PHP Object Proxy

    View Slide

  115. Wrapper
    Access PHP Objects
    Ruby C PHP
    Object
    Map
    Ruby
    Proxy
    PHP
    Runtime
    Object

    View Slide

  116. Wrapper
    Access Ruby Objects
    Ruby C PHP
    Object
    Map
    Ruby
    Proxy
    PHP
    Runtime
    Object

    View Slide

  117. ϓϩδΣΫτͷ
    ໰୊

    View Slide

  118. PHPΛ
    ίϯύΠϧ͢Δ

    View Slide

  119. GC

    View Slide

  120. άϩʔόϧͷม਺

    View Slide

  121. ໰୊
    require 'phuby'
    require 'openssl'
    p OpenSSL::Cipher.ciphers # => ["AES-128-CBC", "AES-128-CBC-HMAC-SHA1", ... ]
    Phuby::Runtime.php do |runtime|
    runtime.eval("$hi = 'Hello World';")
    end
    p OpenSSL::Cipher.ciphers # => []

    View Slide

  122. Solution: fork
    require 'phuby'
    require 'openssl'
    p OpenSSL::Cipher.ciphers # => ["AES-128-CBC", "AES-128-CBC-HMAC-SHA1", ... ]
    Process.waitpid fork {
    Phuby::Runtime.php do |runtime|
    runtime.eval("$hi = 'Hello World';")
    end
    }
    p OpenSSL::Cipher.ciphers # => ["AES-128-CBC", "AES-128-CBC-HMAC-SHA1", ... ]

    View Slide

  123. Rails Support

    View Slide

  124. PHP templates

    View Slide

  125. View Slide

  126. Πϯελϯεม਺

    View Slide

  127. View Slide

  128. ActiveRecord΋࢖͑·͢

    View Slide

  129. View Slide

  130. How much would
    you pay for this?

    View Slide

  131. 200ԁ?

    View Slide

  132. 250ԁ?

    View Slide

  133. https://github.com/
    tenderlove/phuby
    FREE!

    View Slide

  134. ൿີͷτϐοΫ

    View Slide

  135. ko1 said this is a tech
    conference, so you don’t
    have to tell any jokes

    View Slide

  136. So I won’t tell any
    jokes.

    View Slide

  137. ੌ͍ίʔυ
    How does it work?

    View Slide

  138. Homeopathic
    Optimizations

    View Slide

  139. Homeopathy
    ͱ͸ʁ

    View Slide

  140. رऍɻ

    View Slide

  141. ௕͗͢Δʂ

    View Slide

  142. View Slide

  143. View Slide

  144. Modern advocates of homeopathy
    have proposed a concept of "water
    memory", according to which water
    "remembers" the substances
    mixed in

    View Slide

  145. ਫ͸
    هԱग़དྷ·͢

    View Slide

  146. ۭന΋
    هԱ͢Δࣄ͕Ͱ͖Δʁ

    View Slide

  147. YES!

    View Slide

  148. σϞͷ࣌ؒ!

    View Slide

  149. View Slide

  150. Ͳ͏΍ͬͯ
    ಈ͍ͯΔʁ

    View Slide

  151. VM ͸هԱ͢Δ

    View Slide

  152. ͦΕ͸ۭന͡Όͳ
    ͯ͘ɺهԱͩɻ

    View Slide

  153. ଞͷಛ௃

    View Slide

  154. View Slide

  155. ར఺

    View Slide

  156. ߴ଎Խ

    View Slide

  157. "No code is faster
    than no code"

    View Slide

  158. رऍ͞ΕΕ͹͞ΕΔ΄Ͳ
    ϓϩάϥϜ͸ΑΓ଎͘ͳ Δ

    View Slide

  159. ҡ࣋

    View Slide

  160. ίʔυ͸ͳ͍͔Β

    View Slide

  161. THANK YOU!!!

    View Slide

  162. ࣭໰ʁ

    View Slide