Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

of

My way with Ruby Slide 1

YouTube videos are no longer supported on SlideShare

View original on YouTube

My way with Ruby Slide 3 My way with Ruby Slide 4 My way with Ruby Slide 5 My way with Ruby Slide 6 My way with Ruby Slide 7 My way with Ruby Slide 8 My way with Ruby Slide 9 My way with Ruby Slide 10 My way with Ruby Slide 11 My way with Ruby Slide 12 My way with Ruby Slide 13 My way with Ruby Slide 14 My way with Ruby Slide 15 My way with Ruby Slide 16 My way with Ruby Slide 17 My way with Ruby Slide 18 My way with Ruby Slide 19 My way with Ruby Slide 20 My way with Ruby Slide 21 My way with Ruby Slide 22 My way with Ruby Slide 23 My way with Ruby Slide 24 My way with Ruby Slide 25 My way with Ruby Slide 26 My way with Ruby Slide 27 My way with Ruby Slide 28 My way with Ruby Slide 29 My way with Ruby Slide 30 My way with Ruby Slide 31 My way with Ruby Slide 32 My way with Ruby Slide 33 My way with Ruby Slide 34 My way with Ruby Slide 35 My way with Ruby Slide 36 My way with Ruby Slide 37 My way with Ruby Slide 38 My way with Ruby Slide 39 My way with Ruby Slide 40 My way with Ruby Slide 41 My way with Ruby Slide 42 My way with Ruby Slide 43 My way with Ruby Slide 44 My way with Ruby Slide 45 My way with Ruby Slide 46 My way with Ruby Slide 47 My way with Ruby Slide 48 My way with Ruby Slide 49 My way with Ruby Slide 50 My way with Ruby Slide 51 My way with Ruby Slide 52 My way with Ruby Slide 53 My way with Ruby Slide 54 My way with Ruby Slide 55 My way with Ruby Slide 56 My way with Ruby Slide 57 My way with Ruby Slide 58 My way with Ruby Slide 59 My way with Ruby Slide 60 My way with Ruby Slide 61 My way with Ruby Slide 62 My way with Ruby Slide 63 My way with Ruby Slide 64 My way with Ruby Slide 65 My way with Ruby Slide 66 My way with Ruby Slide 67 My way with Ruby Slide 68 My way with Ruby Slide 69 My way with Ruby Slide 70 My way with Ruby Slide 71 My way with Ruby Slide 72 My way with Ruby Slide 73 My way with Ruby Slide 74 My way with Ruby Slide 75 My way with Ruby Slide 76 My way with Ruby Slide 77 My way with Ruby Slide 78 My way with Ruby Slide 79 My way with Ruby Slide 80 My way with Ruby Slide 81 My way with Ruby Slide 82 My way with Ruby Slide 83 My way with Ruby Slide 84 My way with Ruby Slide 85 My way with Ruby Slide 86 My way with Ruby Slide 87 My way with Ruby Slide 88 My way with Ruby Slide 89 My way with Ruby Slide 90 My way with Ruby Slide 91 My way with Ruby Slide 92 My way with Ruby Slide 93 My way with Ruby Slide 94 My way with Ruby Slide 95 My way with Ruby Slide 96 My way with Ruby Slide 97 My way with Ruby Slide 98 My way with Ruby Slide 99 My way with Ruby Slide 100 My way with Ruby Slide 101 My way with Ruby Slide 102 My way with Ruby Slide 103 My way with Ruby Slide 104 My way with Ruby Slide 105 My way with Ruby Slide 106 My way with Ruby Slide 107 My way with Ruby Slide 108 My way with Ruby Slide 109 My way with Ruby Slide 110 My way with Ruby Slide 111 My way with Ruby Slide 112 My way with Ruby Slide 113 My way with Ruby Slide 114 My way with Ruby Slide 115 My way with Ruby Slide 116 My way with Ruby Slide 117 My way with Ruby Slide 118 My way with Ruby Slide 119 My way with Ruby Slide 120 My way with Ruby Slide 121 My way with Ruby Slide 122 My way with Ruby Slide 123 My way with Ruby Slide 124 My way with Ruby Slide 125 My way with Ruby Slide 126 My way with Ruby Slide 127 My way with Ruby Slide 128 My way with Ruby Slide 129 My way with Ruby Slide 130 My way with Ruby Slide 131 My way with Ruby Slide 132 My way with Ruby Slide 133 My way with Ruby Slide 134 My way with Ruby Slide 135 My way with Ruby Slide 136 My way with Ruby Slide 137 My way with Ruby Slide 138 My way with Ruby Slide 139 My way with Ruby Slide 140 My way with Ruby Slide 141 My way with Ruby Slide 142 My way with Ruby Slide 143 My way with Ruby Slide 144 My way with Ruby Slide 145 My way with Ruby Slide 146 My way with Ruby Slide 147 My way with Ruby Slide 148 My way with Ruby Slide 149 My way with Ruby Slide 150 My way with Ruby Slide 151 My way with Ruby Slide 152 My way with Ruby Slide 153 My way with Ruby Slide 154 My way with Ruby Slide 155 My way with Ruby Slide 156 My way with Ruby Slide 157 My way with Ruby Slide 158 My way with Ruby Slide 159 My way with Ruby Slide 160 My way with Ruby Slide 161 My way with Ruby Slide 162 My way with Ruby Slide 163 My way with Ruby Slide 164 My way with Ruby Slide 165 My way with Ruby Slide 166 My way with Ruby Slide 167 My way with Ruby Slide 168 My way with Ruby Slide 169 My way with Ruby Slide 170 My way with Ruby Slide 171 My way with Ruby Slide 172 My way with Ruby Slide 173 My way with Ruby Slide 174 My way with Ruby Slide 175 My way with Ruby Slide 176 My way with Ruby Slide 177 My way with Ruby Slide 178 My way with Ruby Slide 179 My way with Ruby Slide 180 My way with Ruby Slide 181 My way with Ruby Slide 182 My way with Ruby Slide 183 My way with Ruby Slide 184 My way with Ruby Slide 185 My way with Ruby Slide 186 My way with Ruby Slide 187 My way with Ruby Slide 188 My way with Ruby Slide 189 My way with Ruby Slide 190 My way with Ruby Slide 191 My way with Ruby Slide 192 My way with Ruby Slide 193 My way with Ruby Slide 194 My way with Ruby Slide 195 My way with Ruby Slide 196 My way with Ruby Slide 197 My way with Ruby Slide 198 My way with Ruby Slide 199 My way with Ruby Slide 200
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

1

Share

My way with Ruby

Download to read offline

Here are my activities as a Rubyist:

* Increase what Ruby can do with free software
* Maintain libraries

In this talk, I introduce my activities.

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

My way with Ruby

  1. 1. My way with Ruby Powered by Rabbit 2.2.2 My way with Ruby Kouhei Sutou ClearCode Inc. RubyKaigi 2018 2018-06-01
  2. 2. My way with Ruby Powered by Rabbit 2.2.2 Ad: Silver sponsor
  3. 3. My way with Ruby Powered by Rabbit 2.2.2 Acknowledgment 感謝 @drbrain Eric Hodel He fixed English in this slide 英語をチェックしてくれたよ!ありがとう!
  4. 4. My way with Ruby Powered by Rabbit 2.2.2 Keynote-ish topic キーノートっぽい話題 Did you think about it?考えたことある?
  5. 5. My way with Ruby Powered by Rabbit 2.2.2 Keynote-ish topic1 キーノートっぽい話題1 Future未来のこと
  6. 6. My way with Ruby Powered by Rabbit 2.2.2 Keynote-ish topic2 キーノートっぽい話題2 Focus on one thing deeplyなにかを深掘り
  7. 7. My way with Ruby Powered by Rabbit 2.2.2 Keynote-ish topic3 キーノートっぽい話題3 Overview俯瞰した話
  8. 8. My way with Ruby Powered by Rabbit 2.2.2 My activities as a Rubyist 私のRubyist活動 Increase what Ruby can do with free software フリーソフトウェアを使ってRubyでできることを増やす ✓ Maintain libraries ライブラリーのメンテナンス ✓
  9. 9. My way with Ruby Powered by Rabbit 2.2.2 # of libraries maintained メンテナンスしているライブラリー数 About 130130くらい
  10. 10. My way with Ruby Powered by Rabbit 2.2.2 Today's topic 今日の話題 Overview what we can do with RubyRubyでできるようになったことをたくさん紹介
  11. 11. My way with Ruby Powered by Rabbit 2.2.2 How to find targets? そんなにネタがあるの? Just I needed単に自分が必要だったから
  12. 12. My way with Ruby Powered by Rabbit 2.2.2 Opening1 きっかけ1 Web feedWebフィード
  13. 13. My way with Ruby Powered by Rabbit 2.2.2 RSS Parser RSS/Atom parser with validationバリデーション機能付きのRSS/Atomパーサー
  14. 14. My way with Ruby Powered by Rabbit 2.2.2 RSS Parser - History 歴史 2003-05: The first release 最初のリリース No other RSS/Atom parser that supports validation even now 今でもバリデーション付きのパーサーは他にない ✓ ✓ 2004-01: Ruby bundles this RubyがRSS Parserをバンドル I became a Ruby committer Rubyコミッターになる ✓ ✓
  15. 15. My way with Ruby Powered by Rabbit 2.2.2 Validate RSS/Atom RSS/Atomのバリデーション Important for me 私にとっては大事 ✓ Most wild RSS/Atom feeds are invalid 野生のRSS/Atomの多くは不正 Validation helps to find problems バリデーションがあると問題を見つけやすくなる ✓ ✓
  16. 16. My way with Ruby Powered by Rabbit 2.2.2 RSS::Parser.parse # Validates by default # デフォルトでバリデーション RSS::Parser.parse(rss) # Validation can be disabled # 無効にできる RSS::Parser.parse(rss, false)
  17. 17. My way with Ruby Powered by Rabbit 2.2.2 Since Ruby 2.6 Ruby 2.6以降 # Supports keyword argument # キーワード引数対応 parse(rss, validate: false)
  18. 18. My way with Ruby Powered by Rabbit 2.2.2 REXML XML parser written in pure RubyRuby実装のXMLパーサー
  19. 19. My way with Ruby Powered by Rabbit 2.2.2 REXML - History 歴史 2001: Started by Sean Russell Seanさんが開発を開始 Based on Electric XML (Java) Java実装のElectric XMLを参考に開発 ✓ REXML is "Ruby Electric XML" REXMLは「Ruby Electric XML」 ✓ ✓ 2003-01: Ruby bundles this RubyがREXMLをバンドル ✓
  20. 20. My way with Ruby Powered by Rabbit 2.2.2 REXML - Side story おまけ話 Sean was "書運" in Kanji Seanさんには「書運」という漢字表記があった ✓ He was interested in Japan 日本好きだった "How to write your name in Kanji?" 「君の名前は漢字でどう書くの?」 ✓ ✓ We can connect with Ruby! RubyistはRubyをきっかけにつながれる! ✓
  21. 21. My way with Ruby Powered by Rabbit 2.2.2 Ad: Code Party 宣伝:コード懇親会
  22. 22. My way with Ruby Powered by Rabbit 2.2.2 Ad: Code Party 宣伝:コード懇親会 This is a challenge 実験的な企画 Ruby focus: to have fun Rubyは楽しさを大事にしている ✓ We have fun writing Ruby Rubyistは楽しくRubyを書いている ✓ We have fun together with writing Ruby at after party!? だったら懇親会で一緒にRubyを書くと楽しそう!? ✓
  23. 23. My way with Ruby Powered by Rabbit 2.2.2 Ad: Code Party 宣伝:コード懇親会 Matz attends Code Party まつもとさんもコード懇親会に参加 ✓ Sponsored by Speee, Inc. Speeeさんがスポンサー ✓
  24. 24. My way with Ruby Powered by Rabbit 2.2.2 REXML - Recent1 最近1 2010-08: RubyKaigi 2010 I became the maintainer 私がメンテナーになった ✓ Because RSS Parser uses it RSS Parserが使っているから ✓ ✓
  25. 25. My way with Ruby Powered by Rabbit 2.2.2 REXML - Recent2 最近2 2016: element[attribute_name] Ruby 2.5 ships it Ruby 2.5以降で使える ✓ ✓
  26. 26. My way with Ruby Powered by Rabbit 2.2.2 REXML - Recent3 最近3 2018: Fix XPath related bugs XPath関連のバグ修正 Ruby 2.6 ships it Ruby 2.6以降で使える ✓ ✓
  27. 27. My way with Ruby Powered by Rabbit 2.2.2 REXML - Future? 未来はあるの? Pure Ruby is valuable Rubyだけで書かれていることには価値がある Easy to install インストールが簡単 ✓ JIT may improve performance NOTE: We should improve general logic before we expect JIT to improve performance JITで速くなるかもしれない JITの前に普通にロジックを改良するのが先だけどね ✓ ✓
  28. 28. My way with Ruby Powered by Rabbit 2.2.2 Recent my works 最近の仕事 XML/HTML libraries for LuaJIT LuaJIT用のXML/HTMLライブラリー XMLua: https://clear-code.github.io/xmlua/ libxml2 based XML/HTML parser ✓ LuaCS: https://clear-code.github.io/luacs/ CSS Selectors→XPath converter ✓ ✓ Found what is lacking in REXML API REXMLのAPIに足りないものはなにか考えた ✓
  29. 29. My way with Ruby Powered by Rabbit 2.2.2 REXML - Future1 未来1 Introduce NodeSetNodeSetが足りないんじゃないか
  30. 30. My way with Ruby Powered by Rabbit 2.2.2 REXML - NodeSet doc. search("//list"). # => NodeSet search("item"). # => All <item> in <list> text # All texts in <item> in <list>
  31. 31. My way with Ruby Powered by Rabbit 2.2.2 REXML - Future2 未来2 Support CSS SelectorsCSSセレクターが足りないんじゃないか
  32. 32. My way with Ruby Powered by Rabbit 2.2.2 REXML - CSS Selectors CSSセレクター doc.css_select("ul li, dl dt")
  33. 33. My way with Ruby Powered by Rabbit 2.2.2 REXML - Future3 未来3 Support HTML5 supportHTML5対応が足りないんじゃないか
  34. 34. My way with Ruby Powered by Rabbit 2.2.2 REXML - HTML5 doc = REXML::HTML5Document.new(html5) doc.search("//li") doc.css_select("ul li")
  35. 35. My way with Ruby Powered by Rabbit 2.2.2 REXML - Future 未来 Low priority in my activities 優先度は高くない ✓ Do you want to work with me? 一緒にやりたい人はいる? ✓
  36. 36. My way with Ruby Powered by Rabbit 2.2.2 Opening2 きっかけ1 Presentationプレゼンテーション
  37. 37. My way with Ruby Powered by Rabbit 2.2.2 Rabbit Presentation tool for RubyistRubyist用のプレゼンツール
  38. 38. My way with Ruby Powered by Rabbit 2.2.2 Rabbit - History 歴史 2004-07: The first release 最初のリリース No other presentation tool for a Rubyist even now 今でもRubyist用のプレゼンツールは他にない ✓ ✓ 2010: Matz migrated to Rabbit まつもとさんがRabbitに乗り換えた Since RubyKaigi 2010? RubyKaigi 2010から? ✓ ✓
  39. 39. My way with Ruby Powered by Rabbit 2.2.2 For Rubyist? Rubyist向けに必要なもの RD supportRDサポート
  40. 40. My way with Ruby Powered by Rabbit 2.2.2 RD Ruby Document Designed by Matz (Right?) まつもとさんがデザインしたはず ✓ ✓ A text based markup language テキストベースのマークアップ言語 Version controllable バージョン管理できる ✓ ✓
  41. 41. My way with Ruby Powered by Rabbit 2.2.2 For Rubyist? Rubyist向けに必要なもの Publish our slides as usualいつも通りスライドを公開できる
  42. 42. My way with Ruby Powered by Rabbit 2.2.2 Publish as usual いつも通り公開 % gem push your-slide-1.0.gem
  43. 43. My way with Ruby Powered by Rabbit 2.2.2 Published! 公開完了! https://slide.rabbit-shocker.org/
  44. 44. My way with Ruby Powered by Rabbit 2.2.2 What's needed for presentation tool? プレゼンツールに必要なもの GUI
  45. 45. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GTK3 Multi-platform GUI toolkit複数プラットフォーム対応GUIツールキット
  46. 46. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GTK3 - History 歴史 1998-01: 1st release by Matz [ruby-list:5877] まつもとさんが最初のリリース ✓ 2004-05: I joined development 私が開発に参加 ✓
  47. 47. My way with Ruby Powered by Rabbit 2.2.2 Example - Window require "gtk3" app = Gtk::Application.new app.signal_connect(:activate) do window = Gtk::ApplicationWindow.new(app) window.show_all end app.run
  48. 48. My way with Ruby Powered by Rabbit 2.2.2 Approaches on missing libraries(1) ライブラリーがない時のやり方(1) Implement only the needed features 必要な機能だけ実装 1. then back to Rabbit 必要な機能ができたらRabbitに戻る 2.
  49. 49. My way with Ruby Powered by Rabbit 2.2.2 Approaches on missing libraries(2) ライブラリーがない時のやり方(2) Implement not only the needed features 必要な機能だけじゃなく 1. but also almost all features ほぼすべての機能を実装 2. then back to Rabbit 終わったらRabbitに戻る 3.
  50. 50. My way with Ruby Powered by Rabbit 2.2.2 My approach 私のやり方 Implement all featurestesting with Rabbit すべての機能を実装
  51. 51. My way with Ruby Powered by Rabbit 2.2.2 My priority 私の優先度 Rabbit is important Rabbitは大事だけど ✓ Increasing what Ruby can do is important too Rubyでできることを増やすのも大事 ✓
  52. 52. My way with Ruby Powered by Rabbit 2.2.2 GTK+ 3 - Size サイズ 3000 over APIs3000以上のAPI
  53. 53. My way with Ruby Powered by Rabbit 2.2.2 How to implement 実装方法 Handwriting手書き ↓ Auto generation自動生成
  54. 54. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GI Generate bindings automatically at run-time実行時に自動でバインディングを生成 GI: GObject Introspection
  55. 55. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GI - History 歴史 2012: The first commit by me 最初のコミット ✓ 2014: Ruby/GTK3 used Ruby/GI Ruby/GTK3をRuby/GIベースに移行 ✓
  56. 56. My way with Ruby Powered by Rabbit 2.2.2 Handwriting 手書き Ruby scriptRuby/GTK3 Handwritten bindings libgtk-3 Ruby C
  57. 57. My way with Ruby Powered by Rabbit 2.2.2 Auto generation 自動生成 Ruby scriptRuby/GTK3 Generated at run-time Gtk-3.0.typelib Ruby/GI GI = GObject Introspection libgtk-3 Ruby C Data
  58. 58. My way with Ruby Powered by Rabbit 2.2.2 Performance(性能) Slower than handwriting 手書きより遅い ✓ Overhead オーバーヘッド Dynamic arguments conversion 動的な引数の変換 ✓ libffi based function call libffiを使った関数呼び出し ✓ ✓
  59. 59. My way with Ruby Powered by Rabbit 2.2.2 Improve idea(改善案) JIT compilingJITコンパイル
  60. 60. My way with Ruby Powered by Rabbit 2.2.2 JIT compiling(JITコンパイル) VALUE rb_method_generic() { func = dlsym(name); ... ffi_call(func, ..., &result); return C2RB(result); } ↓ // Build rb_method() at run-time and call it. VALUE rb_method() {return C2RB(name(...));}
  61. 61. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GI - See also 参考情報 "How to create bindings 2016" at RubyKaigi 2016 http://rubykaigi.org/2016/presentations/ktou.html✓ ✓ "GI Introduction" (in Japanese) 「GObject Introspection入門」 https://github.com/RubyData/workshop-materials/ blob/master/gobject-introspection/introduction.md ✓ Build system: Meson + Ninja ビルドシステム:Meson + Ninja ✓ ✓
  62. 62. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GI based bindings Ruby/GIベースのバインディング Ruby/Pango
  63. 63. My way with Ruby Powered by Rabbit 2.2.2 Ruby/Pango Text layout engine with i18n support国際化対応のテキストレイアウトエンジン i18n: Internationalization
  64. 64. My way with Ruby Powered by Rabbit 2.2.2 Prohibition processing 禁則処理 widget.signal_connect(:draw) do |_, context| layout = context.create_pango_layout layout.text = "Helloこんにちは。 " context.show_pango_layout(layout) GLib::Source::CONTINUE end
  65. 65. My way with Ruby Powered by Rabbit 2.2.2 Bidirectional text 双方向テキスト Hello ‫م‬‫ر‬‫ح‬‫ب‬‫ا‬ こんにちは
  66. 66. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GI based bindings Ruby/GIベースのバインディング Ruby/GdkPixbuf2
  67. 67. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GdkPixbuf2 Image manipulation画像操作
  68. 68. My way with Ruby Powered by Rabbit 2.2.2 Half image 画像を半分に require "gdk_pixbuf2" # Load an image: Format is auto detected pixbuf = GdkPixbuf::Pixbuf.new(file: "x.png") # Scale to half size half = pixbuf.scale(pixbuf.width / 2, pixbuf.height / 2, :bilinear) # Save as different format half.save("half.jpg")
  69. 69. My way with Ruby Powered by Rabbit 2.2.2 Animated GIF アニメーションGIF
  70. 70. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GI based bindings Ruby/GIベースのバインディング Ruby/Poppler
  71. 71. My way with Ruby Powered by Rabbit 2.2.2 Ruby/Poppler PDF parser/rendererPDFパーサー・レンダラー
  72. 72. My way with Ruby Powered by Rabbit 2.2.2 Text extraction テキスト抽出 require "poppler" doc = Poppler::Document.new("x.pdf") doc.each do |page| puts(page.text) # Extract all texts end
  73. 73. My way with Ruby Powered by Rabbit 2.2.2 Embed PDF PDFの埋め込み Improve extension API - C++ as better language for extension Powered by Rabbit 2.2.2 Improve extension API C++ as better language for extension Kouhei Sutou ClearCode Inc. RubyKaigi 2017 2017-09-18 http://rubykaigi.org/2017/presentations/ktou.html
  74. 74. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GI based bindings Ruby/GIベースのバインディング Ruby/GStreamer
  75. 75. My way with Ruby Powered by Rabbit 2.2.2 Ruby/GStreamer Audio/Video player音声・動画プレイヤー (*) Streaming media framework 本当はストリーミングメディアフレームワーク
  76. 76. My way with Ruby Powered by Rabbit 2.2.2 Camera(カメラ) require "gst" description = [ "autovideosrc", # Camera "videoconvert", # Filter "autovideosink", # Window ].join(" ! ") pipeline = Gst.parse_launch(description) pipeline.play until pipeline.bus.poll.type.eos? do end # Main loop pipeline.stop
  77. 77. My way with Ruby Powered by Rabbit 2.2.2 Face detection(顔認識) description = [ "autovideosrc", # Camera "videoconvert", # Filter "facedetect", # Face detection (!) "videoconvert", # Filter (!) "autovideosink", # Window ].join(" ! ") pipeline = Gst.parse_launch(description) pipeline.play
  78. 78. My way with Ruby Powered by Rabbit 2.2.2 What's needed for presentation tool? プレゼンツールに必要なもの PDF outputPDF出力
  79. 79. My way with Ruby Powered by Rabbit 2.2.2 rcairo 2D graphics renderer2次元画像レンダラー
  80. 80. My way with Ruby Powered by Rabbit 2.2.2 rcairo - Outputs 出力 PNG・SVG✓ PDF✓ Display (X/macOS/Windows)✓ ...✓
  81. 81. My way with Ruby Powered by Rabbit 2.2.2 rcairo - History 歴史 2003-10: The initial commit 最初のコミット ✓ 2005-09: I started developing 私が開発に参加 ✓
  82. 82. My way with Ruby Powered by Rabbit 2.2.2 Red A4 PDF 赤いA4のPDFを出力 require "cairo" include Cairo PDFSurface.create("x.pdf", "A4") do |surface| Context.create(surface) do |context| context.set_source_color(:red) context.paint end end
  83. 83. My way with Ruby Powered by Rabbit 2.2.2 rcairo - GC 11 11.5 12 12.5 13 13.5 14 14.5 15 0 100 200 300 400 500 600 700 800 900 1000 Memoryusage(MiB) Nth loop 1000.times do Cairo::ImageSurface.new(:argb32, 6000, 6000) end
  84. 84. My way with Ruby Powered by Rabbit 2.2.2 GC - Cause(原因) 11 11.5 12 12.5 13 13.5 14 14.5 15 0 100 200 300 400 500 600 700 800 900 1000 Memoryusage(MiB) Nth loop GC isn't run often enough GCの実行頻度が十分じゃなかった Because Ruby doesn't know how much memory used by cairo Rubyはcairoのメモリー使用量を知らないから ✓ ✓
  85. 85. My way with Ruby Powered by Rabbit 2.2.2 GC - Fix(修正) 11 11.5 12 12.5 13 13.5 14 14.5 15 0 100 200 300 400 500 600 700 800 900 1000 Memoryusage(MiB) Nth loop rb_gc_adjust_memory_usage() Improve GC frequency(GC実行頻度を改善)✓ ✓ Ruby 2.4 ships it(Ruby 2.4以降)✓
  86. 86. My way with Ruby Powered by Rabbit 2.2.2 What's needed for presentation tool? プレゼンツールに必要なもの Easy to install簡単インストール
  87. 87. My way with Ruby Powered by Rabbit 2.2.2 native-package-installer Install system packages on gem install gem install時にシステムのパッケージをインストール
  88. 88. My way with Ruby Powered by Rabbit 2.2.2 extconf.rb/Rakefile require "pkg-config" require "native-package-installer" unless PKGConfig.check_version?("gdk-3.0") packages = { altlinux: "libgtk+3-devel", debian: "libgtk-3-dev", redhat: "pkgconfig(gdk-3.0)", homebrew: "gtk+3", macports: "gtk3", msys2: "gtk3", } unless NativePackageInstaller.install(packages) exit(false) end end
  89. 89. My way with Ruby Powered by Rabbit 2.2.2 rake-compiler Build fat gem by cross compileクロスコンパイルでfat gemをビルド
  90. 90. My way with Ruby Powered by Rabbit 2.2.2 rake-compiler - History 歴史 2008-11: The first commit 最初のコミット ✓ 2014-12: Orphan だれかメンテナー変わってー ✓ 2014-12: I became the maintainer 私がメンテナーになった ✓
  91. 91. My way with Ruby Powered by Rabbit 2.2.2 Opening3 きっかけ3 Testテスト
  92. 92. My way with Ruby Powered by Rabbit 2.2.2 test-unit Testing framework to write tests in RubyRubyでテストを書けるテスティングフレームワーク
  93. 93. My way with Ruby Powered by Rabbit 2.2.2 test-unit - History 歴史 2003-02: Import to Ruby Rubyに取り込まれる ✓ 2008-05: I became the maintainer 私がメンテナーになった ✓ 2008-10: Removed from Ruby Rubyから削除 ✓ See also: "The history of testing framework in Ruby" http://rubykaigi.org/2015/presentations/kou
  94. 94. My way with Ruby Powered by Rabbit 2.2.2 test-unit - New feature 新機能 Groupingグループ化
  95. 95. My way with Ruby Powered by Rabbit 2.2.2 Grouping グループ化 The most important feature 一番大事な機能 ✓ Keep tests maintainable メンテナンスできるテストを維持できる ✓
  96. 96. My way with Ruby Powered by Rabbit 2.2.2 Example(例) class StackTest < Test::Unit::TestCase class PushTest < self def test_XXX; end end class PopTest < self def test_XXX; end end end
  97. 97. My way with Ruby Powered by Rabbit 2.2.2 Method style(メソッド形式) class StackTest < Test::Unit::TestCase sub_test_case("#push") do def test_XXX; end end sub_test_case("#pop") do def test_XXX; end end end
  98. 98. My way with Ruby Powered by Rabbit 2.2.2 test-unit - New feature 新機能 Data driven testデータ駆動テスト
  99. 99. My way with Ruby Powered by Rabbit 2.2.2 Data driven test データ駆動テスト data("positive", [3, 1, 2]) data("negative", [-4, 1, -5]) def test_add(data) expected, augend, addend = data assert_equal(expected, add(augend, addend)) end
  100. 100. My way with Ruby Powered by Rabbit 2.2.2 test-unit - New feature 新機能 Reverse backtrace逆順のバックトレース
  101. 101. My way with Ruby Powered by Rabbit 2.2.2 Reverse backtrace 逆順のバックトレース Reverse backtrace only for terminal output ターミナル出力のときだけ逆順 ✓ The same change as Ruby 2.5.0 Ruby 2.5.0と同じ変更 ✓
  102. 102. My way with Ruby Powered by Rabbit 2.2.2 test-unit - New feature 新機能 Test doubleテストダブル
  103. 103. My way with Ruby Powered by Rabbit 2.2.2 test-unit-rr RR integrationRRとの統合
  104. 104. My way with Ruby Powered by Rabbit 2.2.2 RR - History 歴史 2007-06: The initial commit 最初のコミット ✓ 2014-12: Orphan だれかメンテナー変わってー ✓ 2015-05: I became the maintainer 私がメンテナーになった ✓
  105. 105. My way with Ruby Powered by Rabbit 2.2.2 Stub(スタブ) adder = Object.new adder.add(1, 2) # => Error stub(adder).add(1, 2) {3} adder.add(1, 2) # => 3
  106. 106. My way with Ruby Powered by Rabbit 2.2.2 Opening4 きっかけ4 Full text search全文検索
  107. 107. My way with Ruby Powered by Rabbit 2.2.2 Rroonga Full text search library全文検索ライブラリー
  108. 108. My way with Ruby Powered by Rabbit 2.2.2 Library vs Client ライブラリー対クライアント No server process サーバープロセスがいらない ✓ Easy to start 簡単に使い始められる ✓ Write in Ruby Rubyで書ける ✓
  109. 109. My way with Ruby Powered by Rabbit 2.2.2 Create DB(データベース作成) require "groonga" Groonga::Database.create(path: "/tmp/db")
  110. 110. My way with Ruby Powered by Rabbit 2.2.2 Define schema(スキーマ定義) Groonga::Schema.define do |schema| schema.create_table("docs") do |table| # The column to store text table.text("content") end # The index for full text search schema.create_lexicon("terms") do |table| table.index("docs.content") end end
  111. 111. My way with Ruby Powered by Rabbit 2.2.2 Add records(レコード追加) docs = Groonga["docs"] docs.add(content: "String#<< concatenates ...") docs.add(content: "String#dup duplicates ...")
  112. 112. My way with Ruby Powered by Rabbit 2.2.2 Search(検索) matches = docs.select do |record| record.content.match("concat") end p matches.size # => 1 matches.each do |record| p record.content # => "String#<< concat..." end
  113. 113. My way with Ruby Powered by Rabbit 2.2.2 User - Rabbit Slide Show https://slide.rabbit-shocker.org/
  114. 114. My way with Ruby Powered by Rabbit 2.2.2 User - Rurema Search https://docs.ruby-lang.org/ja/search/
  115. 115. My way with Ruby Powered by Rabbit 2.2.2 Rurema Search るりまサーチ Super fast! すごく速い! ✓ Tuned for Ruby documents Rubyのドキュメント用にチューニング ✓
  116. 116. My way with Ruby Powered by Rabbit 2.2.2 User - RDoc Search Planning 考えてはいるけど。。。 ✓ Do you want to work with me? 一緒にやりたい人はいる? ✓
  117. 117. My way with Ruby Powered by Rabbit 2.2.2 Rurema and RDoc Project Language Target Rurema Japanese Japanese Rubyists RDoc English All Rubyists
  118. 118. My way with Ruby Powered by Rabbit 2.2.2 Source ソース Shared nothing 共有していない Copy based share 共有するときはコピー ✓ e.g.: Description, Sample codes, ... 例:説明やサンプルコードなどをコピー ✓ ✓
  119. 119. My way with Ruby Powered by Rabbit 2.2.2 From my point of view 私が思うこと Can we share documents? ドキュメントを共有できないかな ✓ How to work together deeply? もっと協力してできないかな ✓
  120. 120. My way with Ruby Powered by Rabbit 2.2.2 I18n 国際化 Source: RDoc ソースはRDoc For all Rubyists これは全Rubyist向け ✓ ✓ Translate to Japanese RDocのドキュメントを日本語に翻訳 For Japanese Rubyists これは日本人Rubyist向け ✓ ✓
  121. 121. My way with Ruby Powered by Rabbit 2.2.2 Add i18n support 国際化サポートを追加 YARD Since 0.8.0 at 2012-04✓ ✓ RDoc Since 4.2.0 at 2014-12✓ ✓
  122. 122. My way with Ruby Powered by Rabbit 2.2.2 YARD - i18n # Generates po/yard.pot # po/yard.potを生成 % yard i18n
  123. 123. My way with Ruby Powered by Rabbit 2.2.2 YARD - i18n # Create po/ja.po from po/yard.pot # po/yard.potからpo/ja.poを作成 % msginit --locale=ja_JP.UTF-8 --input=po/yard.pot --output-file=po/ja.po
  124. 124. My way with Ruby Powered by Rabbit 2.2.2 YARD - i18n # Translate messages in po/ja.po # po/ja.po内のメッセージを翻訳 % editor po/ja.po
  125. 125. My way with Ruby Powered by Rabbit 2.2.2 YARD - i18n # Generate documents with # translated messages # 翻訳したメッセージを使って # ドキュメント生成 % yard --locale ja
  126. 126. My way with Ruby Powered by Rabbit 2.2.2 Packnga Rake task for YARD i18nYARDの国際化機能向けのRakeタスク
  127. 127. My way with Ruby Powered by Rabbit 2.2.2 Setting 設定 # Rakefile require "packnga" Packnga::DocumentTask.new(spec) do |task| task.original_language = "en" task.translate_languages = ["ja"] end
  128. 128. My way with Ruby Powered by Rabbit 2.2.2 Workflow ワークフロー % rake reference:translate % editor doc/po/ja/x.edit.po % rake reference:translate % editor lib/x.rb % rake reference:translate ...
  129. 129. My way with Ruby Powered by Rabbit 2.2.2 Users ユーザー test-unit✓ Rroonga✓ ...✓
  130. 130. My way with Ruby Powered by Rabbit 2.2.2 RDoc - i18n # Generates doc/rdoc.pot # doc/rdoc.potを生成 % rdoc --format=pot
  131. 131. My way with Ruby Powered by Rabbit 2.2.2 RDoc - i18n # Create locale/ja.po # from doc/rdoc.pot # doc/rdoc.potからlocale/ja.poを作成 % mkdir -p locale % msginit --locale=ja_JP.UTF-8 --input=doc/rdoc.pot --output-file=locale/ja.po
  132. 132. My way with Ruby Powered by Rabbit 2.2.2 RDoc - i18n # Translate messages in locale/ja.po # locale/ja.po内のメッセージを翻訳 % editor locale/ja.po
  133. 133. My way with Ruby Powered by Rabbit 2.2.2 RDoc - i18n # Generate documents with # translated messages # 翻訳したメッセージを使って # ドキュメント生成 % rdoc --locale ja
  134. 134. My way with Ruby Powered by Rabbit 2.2.2 RDoc, Rurema and i18n No progress... ツールの整備まででそれ以降は進んでいない。。。 ✓ Do you want to work with me? 一緒にやりたい人はいる? ✓
  135. 135. My way with Ruby Powered by Rabbit 2.2.2 jekyll-task-i18n Jekyll + i18n
  136. 136. My way with Ruby Powered by Rabbit 2.2.2 Features 機能 Support all markups! すべてのマークアップ対応! ✓ GitHub Pages ready! GitHub Pagesでも使える! ✓
  137. 137. My way with Ruby Powered by Rabbit 2.2.2 Setting(設定) # Rakefile require "jekyll/task/i18n" Jekyll::Task::I18n.define do |task| task.locales = ["ja"] task.files = Rake::FileList["**/*.md"] task.files -= Rake::FileList["_*/**/*.md"] task.locales.each do |locale| task.files -= Rake::FileList["#{locale}/**/*.md"] end end task default: ["jekyll:i18n:translate"]
  138. 138. My way with Ruby Powered by Rabbit 2.2.2 Workflow(ワークフロー) % editor index.md % rake % editor _po/ja/index.edit.po % rake % git commit -a
  139. 139. My way with Ruby Powered by Rabbit 2.2.2 User - Red Data Tools https://red-data-tools.github.io/
  140. 140. My way with Ruby Powered by Rabbit 2.2.2 groonga-client Full text search client全文検索クライアント
  141. 141. My way with Ruby Powered by Rabbit 2.2.2 Library vs Client ライブラリー対クライアント Less dependencies 依存関係が少ない ✓ Less resources needed 必要なリソースが少ない ✓
  142. 142. My way with Ruby Powered by Rabbit 2.2.2 Search(検索) require "groonga/client" url = "http://localhost:10041" Groonga::Client.open(url: url) do |client| response = client.select(table: "docs", match_columns: "content", query: "concat") p response.n_hits # => 1 end
  143. 143. My way with Ruby Powered by Rabbit 2.2.2 Asynchronous(非同期) # Call with block client.select(table: "docs", match_columns: "content", query: "concat") do |response| p response.n_hits # => 1 end p :here # => :here then ↑ sleep(0.1)
  144. 144. My way with Ruby Powered by Rabbit 2.2.2 Asynchronous - wait request = client.select(table: "docs", match_columns: "content", query: "concat") do |response| p response.n_hits # => 1 end p :here # => :here then ↑ request.wait
  145. 145. My way with Ruby Powered by Rabbit 2.2.2 groonga-client-rails Ruby on Rails integration for groonga-clientRuby on Railsで使う
  146. 146. My way with Ruby Powered by Rabbit 2.2.2 Architecture アーキテクチャー Data: RDBMS データはRDBMSに格納 ✓ Full text search: Groonga 全文検索はGroongaで処理 ✓
  147. 147. My way with Ruby Powered by Rabbit 2.2.2 Define app searcher アプリ用サーチャーを定義 # app/searchers/application_searcher.rb class ApplicationSearcher < Groonga::Client::Searcher end
  148. 148. My way with Ruby Powered by Rabbit 2.2.2 Define searcher サーチャーを定義 # app/searchers/document_searcher.rb class DocumentsSearcher < ApplicationSearcher # Define a full text search index as "content" # 全文検索用のインデックスを定義 schema.column :content, { type: "Text", index: true, index_type: :full_text_search, } end
  149. 149. My way with Ruby Powered by Rabbit 2.2.2 Bind to model モデルと結びつける # app/models/document.rb class Document < ApplicationRecord # DocumentsSearcher searches Document model source = DocumentsSearcher.source(self) # Bind Document's "content" column to # DocumentsSearcher's "content" index source.content = :content end
  150. 150. My way with Ruby Powered by Rabbit 2.2.2 Search(検索) # app/controllers/documents_controller.rb class DocumentsController < ApplicationController def index @query = params[:query] searcher = DocumentSearcher.new @result_set = searcher.search. query(@query). result_set end end
  151. 151. My way with Ruby Powered by Rabbit 2.2.2 See also 参考情報 Tutorial in Japanese 日本語のチュートリアル http://www.clear-code.com/blog/2016/12/22.html✓ ✓
  152. 152. My way with Ruby Powered by Rabbit 2.2.2 Ranguba (WIP)(開発中) Full text search system全文検索システム
  153. 153. My way with Ruby Powered by Rabbit 2.2.2 Use cases 利用例 File server search ファイルサーバー検索 ✓ E-mail search メール検索 ✓ Web site search Webサイト検索 ✓
  154. 154. My way with Ruby Powered by Rabbit 2.2.2 Features 機能 Crawlers クローラー ✓ Web UI✓ Command line interface Update documents 更新 ✓ Search documents 検索 ✓ ✓
  155. 155. My way with Ruby Powered by Rabbit 2.2.2 ChupaText Text extractorテキスト抽出
  156. 156. My way with Ruby Powered by Rabbit 2.2.2 Supported formats 対応フォーマット PDF✓ Office documents(オフィス文書) OpenDocument, Word, Excel, ...✓ ✓ E-mail(メール)✓ ...✓
  157. 157. My way with Ruby Powered by Rabbit 2.2.2 Interface インターフェイス HTTP✓ Web UI✓ Command line interface✓ API (Library)✓
  158. 158. My way with Ruby Powered by Rabbit 2.2.2 Install - Docker % GITHUB=https://github.com % git clone ${GITHUB}/ranguba/chupa-text-docker.git % cd chupa-text-docker % docker-compose up --build
  159. 159. My way with Ruby Powered by Rabbit 2.2.2 How to use 使い方 % curl --form data=@XXX.pdf http://localhost:20080/extraction.json
  160. 160. My way with Ruby Powered by Rabbit 2.2.2 Use cases 利用例 Ranguba Full text search system 全文検索システム ✓ ✓ Commit e-mail コミットメール ✓
  161. 161. My way with Ruby Powered by Rabbit 2.2.2 git-commit-mailer Commit e-mail for GitGit用のコミットメール
  162. 162. My way with Ruby Powered by Rabbit 2.2.2 Features 機能 HTML mail HTMLメール Highlighted diff diffをハイライト ✓ ✓ GitLab/GitHub Web hook GitLab/GitHubのWebフック対応 By GitHub:clear-code/github-web-hooks-receiver✓ ✓
  163. 163. My way with Ruby Powered by Rabbit 2.2.2 Users 利用者 tDiary✓ My products✓
  164. 164. My way with Ruby Powered by Rabbit 2.2.2 commit-email.info Commit e-mail as a Serviceコミットメールのクラウドサービス
  165. 165. My way with Ruby Powered by Rabbit 2.2.2 How to use 使い方 Send a pull request to GitHub:kou/commit-email.info pull requestを送る ✓ Register a Web hook Webフックを登録 ✓ Subscribe your mailing list メーリングリストを購読 ✓ See also http://www.commit-email.info/
  166. 166. My way with Ruby Powered by Rabbit 2.2.2 Opening5 きっかけ5 Data processingデータ処理
  167. 167. My way with Ruby Powered by Rabbit 2.2.2 csv CSV parserCSVパーサー
  168. 168. My way with Ruby Powered by Rabbit 2.2.2 csv - History 歴史 2003: Import Rubyに取り込み ✓ 2007: Replaced with FasterCSV FasterCSVで置き換え ✓ 2018: I became a co- maintainer with mrkn mrknと一緒にメンテナーになった ✓
  169. 169. My way with Ruby Powered by Rabbit 2.2.2 Why? なんで? There are many data sources in CSV CSVのデータはたくさんある ✓ Important to process data データを処理するためにCSVパーサーは重要 ✓
  170. 170. My way with Ruby Powered by Rabbit 2.2.2 CSV format problems CSVフォーマットの問題 Slow to parse パースが遅い ✓ Too wild なんでもあり ✓
  171. 171. My way with Ruby Powered by Rabbit 2.2.2 Red Arrow Apache Arrow Ruby
  172. 172. My way with Ruby Powered by Rabbit 2.2.2 Red Arrow - History 歴史 2017-02: The first commit 最初のコミット ✓ 2018-05: Became the "official" Ruby bindings of Apache Arrow Apache Arrowの公式Rubyバインディングになった ✓
  173. 173. My way with Ruby Powered by Rabbit 2.2.2 Apache Arrow Super fast data format すごく速いデータフォーマット For in-memory data インメモリーデータ用 ✓ ✓ Cross-language support いろんな言語がサポート Easy to share data with Python, Java, ... PythonやJavaなどとデータ交換がしやすい ✓ ✓
  174. 174. My way with Ruby Powered by Rabbit 2.2.2 Performance(性能) 0 0.005 0.01 0.015 0.02 0.025 0.03 0.035 0.04 0.045 0 500 1000 1500 2000 2500 Loadtime(sec) N rows CSV Apache Arrow
  175. 175. My way with Ruby Powered by Rabbit 2.2.2 Apache Arrow - Position 立ち位置 A very important piece in recent data processing 最近のデータ処理界隈ではすごく大事な1ピース Like JIT for Ruby 3 Ruby 3で例えるとJITみたいな感じ ✓ ✓
  176. 176. My way with Ruby Powered by Rabbit 2.2.2 Red Arrow - Impl. 実装 Based on Ruby/GI Ruby/GIを使っている Auto generated bindings バインディングを自動生成 ✓ ✓
  177. 177. My way with Ruby Powered by Rabbit 2.2.2 Extendable load API 拡張可能なロードAPI # Load Apache Arrow data Arrow::Table.load("iris.arrow") # Load CSV data Arrow::Table.load("iris.csv") # Load Apache Parquet data Arrow::Table.load("iris.parquet")
  178. 178. My way with Ruby Powered by Rabbit 2.2.2 Apache Parquet Super fast data format すごく速いデータフォーマット For storing analysis target data 解析対象のデータを保存する用 ✓ ✓ Widely used 広く使われている ✓
  179. 179. My way with Ruby Powered by Rabbit 2.2.2 Performance(性能) 0 0.005 0.01 0.015 0.02 0.025 0.03 0.035 0.04 0.045 0 500 1000 1500 2000 2500 Loadtime(sec) N rows CSV Apache Arrow Apache Parquet
  180. 180. My way with Ruby Powered by Rabbit 2.2.2 Red Parquet Apache Parquet
  181. 181. My way with Ruby Powered by Rabbit 2.2.2 Red Data Tools A project to make Ruby data processableRubyでデータ処理できるようにするためのプロジェクト
  182. 182. My way with Ruby Powered by Rabbit 2.2.2 Red Data Tools - History 歴史 2017-02: Start(開始)✓ 2017-11-: Develop events per month at Tokyo 東京で毎月開発イベントを開催 ✓
  183. 183. My way with Ruby Powered by Rabbit 2.2.2 The number of products プロダクト数 About 20including Red Arrow and Red Parquet 20くらい Red ArrowやRed ParquetもRed Data Toolsプロダクツ
  184. 184. My way with Ruby Powered by Rabbit 2.2.2 Red Datasets Dataset fetcherデータセット取得
  185. 185. My way with Ruby Powered by Rabbit 2.2.2 Supported datasets 対応データセット Iris✓ CIFAR✓ Wikipedia✓
  186. 186. My way with Ruby Powered by Rabbit 2.2.2 Wikipedia require "datasets" wikipedia = Datasets::Wikipedia.new wikipedia.each do |page| p page.title end
  187. 187. My way with Ruby Powered by Rabbit 2.2.2 Wikipedia search pages = Groonga["pages"] wikipedia = Datasets::Wikipedia.new wikipedia.each do |page| pages.add(title: page.title, content: page.revision.text) end ruby_pages = pages.select do |record| record.match("Ruby OR Rails") do |target| (target.title * 10) | target.content end end p ruby_pages.size
  188. 188. My way with Ruby Powered by Rabbit 2.2.2 jekyll-jupyter-notebook Jekyll + Jupyter Notebook
  189. 189. My way with Ruby Powered by Rabbit 2.2.2 Usage 使い方 {% jupyter_notebook sample.ipynb %}
  190. 190. My way with Ruby Powered by Rabbit 2.2.2 Red OpenCV Computer visionコンピュータービジョン
  191. 191. My way with Ruby Powered by Rabbit 2.2.2 Camera(カメラ) require "cv" camera = CV::Camera.new image = camera.read image.write("capture.jpg")
  192. 192. My way with Ruby Powered by Rabbit 2.2.2 Face detect(顔認識) image_gray = image.convert_color(:bgr2gray) classifier = # Face detector CV::CascadeClassifier.new("frontalface_alt") objects = classifier.detect(image_gray) color = CV::Color.new(0, 0, 255) objects.each do |object| # Draw detected area image.draw_rectangle(object, color) end image.write("detect.jpg")
  193. 193. My way with Ruby Powered by Rabbit 2.2.2 Red OpenCV - Impl. 実装 Based on Ruby/GI Ruby/GIを使っている Auto generated bindings バインディングを自動生成 ✓ ✓
  194. 194. My way with Ruby Powered by Rabbit 2.2.2 Ad: RubyData Workshop 2018-06-01 15:50/17:20✓ Contents:(内容) Workshop by mrkn mrknによるワークショップ ✓ Presentations from Red Data Tools members Red Data ToolsメンバーによるRed Data Toolsでやって きたことの紹介 ✓ ✓
  195. 195. My way with Ruby Powered by Rabbit 2.2.2 Process data with Ruby Rubyでデータ処理 We're working on it Red Data Toolsは継続して取り組んでいる ✓ Do you want to work with us? 一緒にやりたい人はいる? ✓
  196. 196. My way with Ruby Powered by Rabbit 2.2.2 How to join1(参加方法1) Join our chat rooms: チャットルームに参加 en: Gitter:red-data-tools/en✓ ja: Gitter:red-data-tools/ja✓ ✓ Join monthly events at Tokyo 東京での毎月の開発イベントに参加 https://speee.connpass.com/✓ ✓
  197. 197. My way with Ruby Powered by Rabbit 2.2.2 How to join2(参加方法2) Hire developers to work on it 仕事として開発する開発者を雇う e.g.: mrkn by Speee, Inc. 例:Speeeの村田さん ✓ ✓
  198. 198. My way with Ruby Powered by Rabbit 2.2.2 How to join3(参加方法3) Order ClearCode to work on it クリアコードに開発の仕事を発注 ✓ Join ClearCode to work on it クリアコードに入って仕事として開発を進める ✓
  199. 199. My way with Ruby Powered by Rabbit 2.2.2 Wrap up まとめ I'm working on the following as a Rubyist Rubyistとしての私の活動 Increase what Ruby can do with free software フリーソフトウェアを使ってRubyでできることを増やす ✓ Maintain libraries ライブラリーのメンテナス ✓ ✓ Do you want to work with me? 一緒にやりたい人はいる? ✓
  • GOTOSatoru

    Jun. 4, 2018

Here are my activities as a Rubyist: * Increase what Ruby can do with free software * Maintain libraries In this talk, I introduce my activities.

Views

Total views

485

On Slideshare

0

From embeds

0

Number of embeds

2

Actions

Downloads

2

Shares

0

Comments

0

Likes

1

×