esa.ioの育て方

Ffdf2b0baba2980a90923978cf32a6ca?s=47 fukayatsu
February 23, 2018

 esa.ioの育て方

Ruby Business Users Conference 2018
2018-02-23 (Fri) 14:00 - 17:00

http://www.ruby.or.jp/rbuc2018/
https://rubyassociation.doorkeeper.jp/events/69247

Ffdf2b0baba2980a90923978cf32a6ca?s=128

fukayatsu

February 23, 2018
Tweet

Transcript

  1. esa.ioͷҭͯํ 2018/02/23 esa LLC ਂ୩ಞੜ

  2. 2 • ߹ಉձࣾ esa • ߹ܭ3໊ • ΤϯδχΞ2໊ • σβΠφʔ1໊

    • શһ͕ίʔυΛॻ͘ • શһ͕ձࣾ୅ද • ૑ۀ4೥໨
  3. esa LLC͕΍͍ͬͯΔ͜ͱ • esa.ioͷ։ൃɾӡӦ (ࠓ೔ͷຊ୊) • pplog.netͷ։ൃɾӡӦ • ଞͷձࣾͷ։ൃ΍σβΠϯͷ͓ख఻͍ 3

  4. esa LLC͕΍Βͳ͍͜ͱ • αʔϏε΍ձࣾͷٸܹͳ੒௕͸໨ࢦ͞ͳ͍ • ౤ࢿ͸ड͚ͳ͍ • (ۜߦ౳͔Βগֹͷ༥ࢿ͸ड͚ͨ͜ͱ͕͋Δ) • Web

    ޿ࠂ͸ग़͞ͳ͍ 4
  5. esa.ioͱ͸? 5

  6. 6

  7. 7 • ݱࡏɺ໿2,200νʔϜ͕ར༻த • ITاۀΛத৺ͱͨ͠ձࣾɾஂମɾݸਓʢن໛: 1ਓʙ300ਓఔ౓ʣ • ΤϯδχΞɾσβΠφʔΛத৺ʹɺاըɾӦۀ৬ɾࣄ຿ܥͷํ΋ར༻ • ݸਓ΍͝Ոఉɺେֶͷݚڀࣨɺझຯͷஂମ΋ଟ਺

    User About esa.io • MarkdownܗࣜͰॻ͚ΔɺνʔϜͷͨΊͷ৘ใڞ༗πʔϧ • ೔ใɾٞࣄ࿥ɾϝϞɾΞΠσΞɾ࢓༷ॻɾاըॻ౳ɺνʔϜͰͷυ Ωϡϝϯτڞ༗Ͱར༻
  8. 8 • ݱࡏɺ2,000νʔϜҎ্͕༗ྉར༻ • ITاۀΛத৺ͱͨ͠ձࣾɾஂମɾݸਓʢن໛: 1ਓʙ300ਓఔ౓ʣ • ΤϯδχΞɾσβΠφʔΛத৺ʹɺاըɾӦۀ৬ɾࣄ຿ܥͷํ΋ར༻ • ݸਓ΍͝Ոఉɺझຯͷஂମ΋ଟ਺

    User Concept: ৘ใΛɺҭ͍ͯͨɻ • υΩϡϝϯτ͸࠷ॳ͔Β׬ᘳͰ͸ͳ͘ɺ࣌ؒΛ͔͚ͯΑ͍΋ͷʹҭ͍ͬͯ͘ • ݸਓ͕ΏΔ͍ΞΠσΞΛग़͠΍͘͢ɺΈΜͳͰܧଓతʹվળ͠΍͍͢࢓૊Έ • ্͔Βͷԡ͠෇͚Ͱ͸ͳ͘ϘτϜΞοϓͰࣗൃతʹ৘ใൃ৴͢ΔΑ͏ʹͳΔ ͜ͱ͕ɺΑΓ͍͖͍͖ͱͨࣗ͠཯తͳνʔϜͮ͘Γʹͭͳ͕Δ
  9. 2014೥ͷ5݄ ͋Δ։ൃऀίϛϡχςΟͷ झຯ։ൃ߹॓Ͱ஀ੜ 9

  10. 10 ↓ਖ਼ࣜެ։ ↑୯ମͰࠇࣈԽ ࠶ࠇࣈԽˣ ࣾһ͕1໊૿Ճˣ

  11. ౰ॳͷ໨ඪͰ͋ͬͨ ʮesa ͷऩӹ͚ͩͰձࣾΛܦ ӦͰ͖ΔʯΛୡ੒ 11

  12. ࠓ೔͓࿩͍ͨ͜͠ͱ • esaΛগਓ਺Ͱ։ൃɾӡӦ͍ͯͨ͘͠ΊʹɺͲ ͷΑ͏ͳٕज़ɾઓུ΍PaaS/SaaSͷྗΛआΓ ͖͔ͯͨΛ࣮ྫΛަ͑ͯ঺հ • झຯͰ࡞Γ࢝ΊͨWebαʔϏε͕ͲͷΑ͏ʹ ͯ͠Ϗδωεͱͯ͠੒ཱ͢ΔΑ͏ʹͳ͔ͬͨ 12

  13. ࠓ೔͓࿩͍ͨ͜͠ͱ • [x] esaͱesa LLC ʹ͍ͭͯ (5෼) • [ ]

    esaͷγεςϜߏ੒ (10෼) • [ ] esaͷػೳ͝ͱͷ࣮૷ํ๏ (15෼) • [ ] esaͷϢʔβʔαϙʔτ (5෼) • [ ] esaͱϞνϕʔγϣϯ (5෼) 13
  14. ࣮͸͜ͷൃද͸ Δͼ·0052߸ (2015-12) ͕ϕʔεͰ͢ 14 magazine.rubyist.net/?0052-esaio

  15. esaͷγεςϜߏ੒ 15

  16. جຊతͳઓུ • ࠷৽ͷRuby/RailsΛ࢖͏ • 2018/02/16࣌఺ͰRuby 2.5.0 / Rails 5.1.5 •

    ຖ೔ɺ൒ࣗಈͰBundle Update͢Δ • ܧଓతʹ΍ͬͨ΄͏͕݁Ռతʹָ • ։ൃͷϦζϜʹ΋ͳΔ 16
  17. 2014 ~ 2016 • Heroku (US region) • 2X dyno

    Λ 2~5ݸ • ໷ؒ΍ٳ೔ʹdynoΛগͳͯ͘͠અ໿ • ϦϦʔε͔Β2೥ऑͷؒΠϯϑϥʹ͍ͭͯ೰ ·͞ΕΔ͜ͱ͕গͳͯ͘ຊ౰ʹॿ͔ͬͨ 17
  18. 2014 ~ 2016 • Heroku (US region) • ຊ֨తʹར༻͞ΕΔʹͭΕɺϨΠςϯγ͕ ਏ͘ͳ͖ͬͯͨ

    • Enterpriseܖ໿͢Ε͹Tokyo region΋࢖͑ ͦ͏͕ͩͬͨɺྉۚతʹஅ೦ 18
  19. ΠϯϑϥେҾͬӽ͠ 19 docs.esa.io/posts/179

  20. Ҡߦޙͷߏ੒ 20

  21. Ҡߦޙͷߏ੒ • AWS ECS (Tokyo region) • Railsίϯςφ x 4ɺSidekiqίϯςφ

    x 1 • db:migrate࣌ʹ͸ຖճ৽نʹίϯςφΛى ಈˠഇغ 21
  22. Ҡߦޙͷߏ੒ • AWS ECS (Tokyo region) • ϖʔδͷදࣔ଎౓͕1/2 ~ 1/3ఔ౓·Ͱվળ

    • Ͱ͖Δ͚ͩHeroku࣌୅ͱಉ͡Α͏ͳ։ൃ͕ଓ͚ΒΕ ΔΑ͏ʹ޻෉ • masterϚʔδͰࣗಈσϓϩΠ • ίϯςφͷ਺͕ҰఆʹอͨΕΔ 22
  23. ֤ίϯςφʹ͍ͭͯ • Rails / Sidekiq ίϯςφ (2016/03 ~) • PlantUML

    ίϯςφ (2016/10 ~) • ܾࡁܥίϯςφ (2017/02 ~) 23
  24. Rails / Sidekiq ίϯςφ • ී௨ͷRails / Sidekiq app •

    ݩʑHeroku্Ͱಈ͍͍ͯͨesa.ioͷຊମ • ಉ͡Docker ImageͰىಈΦϓγϣϯͰweb/ workerΛ੾Γସ͑ • ಈ͍͍ͯΔίϯςφ਺͸Rails: 4ɺSidekiq: 1 24
  25. PlantUML ίϯςφ 25

  26. PlantUML ίϯςφ 26 • PlantUML͸Java੡ • Javaͷαʔόͷϝϯς͸ͨ͘͠ͳ͍ɻɻɻ • JRuby +

    Sinatra + PumaͰ࣮૷ • ςΩετΛड͚औͬͯsvgΛฦ͚ͩ͢ • ։ൃ։͔࢝Β1೔ఔ౓ͰϦϦʔε
  27. ܾࡁܥίϯςφ • ܾࡁ୅ߦαʔϏεΛWebPay͔ΒPAY.JPʹ੾Γସ ͑ΔλΠϛϯάͰΧʔυొ࿥ը໘ΛผγεςϜʹ ੾Γ෼͚ • ܾࡁ୅ߦαʔϏε͕ఏڙ͢ΔJSϥΠϒϥϦΛ࢖͏ ͜ͱͰɺݩʑesaͷαʔόʹΧʔυ৘ใ͕౉Βͳ͍ Α͏ʹͳ͍ͬͯΔ͕ɺผυϝΠϯɾผγεςϜԽ ͢Δ͜ͱʹΑͬͯߋʹηΩϡΞʹ͢Δ͜ͱ͕ૂ͍

    27
  28. ܾࡁܥίϯςφ • Ruby + Sinatra + PumaͰ࣮૷ • ͳͥSinatra? •

    DBΞΫηε͕ͳ͍ • ը໘਺͕গͳ͍ 28
  29. γεςϜߏ੒·ͱΊ • ॳखHeroku͸Twelve-Factor Appͷࢥ૝ʹೃછΉ ͜ͱ͕ग़དྷͨͱ͍͏఺Ͱ΋ྑ͔ͬͨ • ECS౳ίϯςφରԠͷϚωʔδυɾαʔϏεΛ࢖ ͏͜ͱͰɺHerokuΠϯϑϥ࡞ۀͷखؒΛݮΒ͢ • ίϯςφԽ͓ͯ͘͜͠ͱͰɺҟͳΔݴޠ΍ϑϨʔ

    ϜϫʔΫͷαϒγεςϜΛ௥Ճ͠΍͍͢ 29
  30. 30 12factor.net/ja/ (ࢀߟ) Twelve-Factor App

  31. esaͷػೳ͝ͱͷ࣮૷ํ๏ 31

  32. ΧςΰϦػೳ 32 • هࣄλΠτϧΛʮ/ ʯͰ۠੾ΔͱΧςΰϦʹͳ Δ • ΧςΰϦ͸HOMEը໘ͰυϦϧμ΢ϯͰ͖Δ

  33. ΧςΰϦػೳ 33

  34. ΧςΰϦػೳ • ܦ࿏ྻڍϞσϧͰ࣮૷ 34 DBUFHPSJFTςʔϒϧ JE QBUI  GPP 

    GPPCBS UJUMF GPPهࣄ GPPCBSهࣄ GPPCBSهࣄ QPTUTςʔϒϧ JE OBNF DBUFHPSZ@JE  هࣄ   هࣄ   هࣄ 
  35. ΧςΰϦػೳ 35 DBUFHPSJFTςʔϒϧ JE QBUI  GPP  GPPCBS QPTUTςʔϒϧ

    JE OBNF DBUFHPSZ@JE  هࣄ   هࣄ   هࣄ  “foo/bar” ΧςΰϦ಺ͷهࣄݕࡧ: select * from posts join categories on categories.id = posts.category_id where categories.path like ‘foo/bar/%’
  36. ֎෦ެ։ػೳ • ೚ҙͷهࣄ΍εϥΠυΛνʔϜ֎ʹެ։Ͱ͖ Δػೳ • URLΛ஌͍ͬͯΕ͹ϩάΠϯෆཁͰӾཡՄೳ • GitHub pagesΛҙࣝͯ͠ɺesa-pages.ioͱ͍ ͏υϝΠϯ্Ͱڞ༗͞ΕΔ

    36
  37. ֎෦ެ։ػೳ 37 esa-pages.io/p/sharing/105/posts/ 46/70c5c045110fa64018dd.html

  38. ֎෦ެ։ػೳ • هࣄɾεϥΠυΛHTMLม׵ޙʹS3ʹग़ྗ ͠ɺCloudFrontܦ༝Ͱ഑৴ • େྔͷΞΫηε͕͋ͬͯ΋esaຊମʹෛՙ͕ ֻ͔Βͳ͍Α͏ʹ • ݩهࣄΛߋ৽͢Ε͹S3্ͷهࣄ΋ࣗಈߋ৽ 38

  39. ܾࡁ • ݄ॳʹɺલͷ݄ͷར༻ঢ়گʹԠͯ͡ΫϨδοτΧʔ υܾࡁ • ޙ෷͍ͳͷͰΩϟογϡϑϩʔ͸एׯ٘ਜ਼ʹͳ Δ͕ɺ՝ۚλΠϛϯάΛͻͱ݄͋ͨΓ1ճʹͯ͠ γεςϜͷγϯϓϧ͞ͱ҆຾ΛಘΔ • ҎલͷձࣾͰ೔࣍՝ۚόον͕͋ͬͯো֐ͷ

    ࣌ʹప໷ରԠͨ͠ࢥ͍ग़ɻɻɻ 39
  40. ܾࡁ • ࣾ಺ʹෳ਺νʔϜ͕͋Δ৔߹͸ʮܾࡁͷ࿈݁ʯ ͕Մೳ • νʔϜ಺Ͱॏෳͨ͠Ϣʔβʔʹ͍ͭͯ͸1 νʔϜ෼ͷྉۚʹͳΔͷͰ͓ಘ 40 docs.esa.io/posts/190

  41. ܾࡁ 41 • Q.ʮ੥ٻॻ෷͍͸ແ͍ΜͰ͔͢ʁʯ • A. ͢Έ·ͤΜɻࠓͷͱ͜Ζແ͍Ͱ͢ɻ

  42. શจݕࡧ • ࠷ॳ͸Postgresql + RansackͰແཧ΍Γ࣮૷ • هࣄ͕૿͑Δʹैͬͯݕࡧਫ਼౓΍଎౓ʹෆຬ • ΠϯΫϦϝϯλϧݕࡧ͕͍ͨ͠ 42

  43. શจݕࡧ 43 docs.esa.io/posts/198

  44. શจݕࡧ • Elasticsearchͷಋೖ • ਫ਼౓্͕͕ͬͨ • ιʔτΦϓγϣϯ͕૿͑ͨ • ଎͘ͳͬͨ •

    ΠϯΫϦϝϯλϧݕࡧ΋Ͱ͖ΔΑ͏ʹ 44
  45. શจݕࡧ • Best matchιʔτ • “͍͍ײ͡” ͷॱ൪Ͱݕࡧ݁ՌΛදࣔ • Elasticsearchͷfunction_score queryΛ׆

    ༻ 45
  46. શจݕࡧ • “͍͍ײ͡” ͷॱ൪ͱ͸ʁ • هࣄλΠτϧ΍ΧςΰϦʹϚονͨ͠΄͏͕ɺهࣄຊจʹϚο ν͢ΔΑΓείΞ͕ߴ͍ • ࠷ۙͷStarɾWatchɾCommentͷ਺͕ଟ͍΄͏͕είΞ͕ ߴ͍

    • ΞʔΧΠϒ͞ΕͨهࣄͷείΞ͸ͱͯ΋௿͍ • etc 46
  47. API • 2015/05ࠒ͔Βαϙʔτ • Doorkeeper gemΛ࢖࣮ͬͯ૷ • APIυΩϡϝϯτ: docs.esa.io/posts/102 •

    APIΛ࢖ͬͨαʔυύʔςΟπʔϧ΋๛෋ 47
  48. αʔυύʔςΟπʔϧ 48 docs.esa.io/posts/158

  49. ϩάΠϯ • ݱঢ়Google OAuth͚ͩ • ೋஈ֊ೝূͳͲ΋GoogleଆͰ୲อ • ϩάΠϯػೳΛͰ͖Δ͚࣮ͩ૷͠ͳ͍͜ͱ Ͱ։ൃίετΛԼ͛ͭͭηΩϡΞʹ͢Δૂ ͍

    49
  50. ϩάΠϯ • ෳ਺ΞΧ΢ϯτಉ࣌ϩάΠϯ΋Մೳ 50 docs.esa.io/posts/210

  51. ϩάΠϯ • Q. ʮGmailҎ֎ͷϝʔϧΞυϨεͱύεϫʔ υͰϩάΠϯͰ͖ΔΑ͏ʹͳΓ·ͤΜ͔ʁʯ • A. ͢Έ·ͤΜɻ·ͩͰ͖·ͤΜɻ • (কདྷతʹ͸ఏڙ͍ͨ͠)

    51
  52. esaͷϢʔβʔαϙʔτ 52

  53. جຊతͳߟ͑ํ • զʑͱϢʔβʔ͕ڞʹ޾ͤʹͳΔํ๏Λ୳͢ • 5෼Ͱฦ৴͢Δ • (ӳจϝʔϧͷ௚༁Έ͍ͨͳจ໘ʹͳΔ) • ࣭໰ʹରͯ͠ɺʮ͸͍/͍͍͑ɻʯΑΓ΋ྑ͍ ฦࣄ͕͋Δ͸ͣ

    53
  54. ϑΟʔυόοΫϑΥʔϜ 54

  55. ϑΟʔυόοΫϑΥʔϜ 55 Slack, GitHub, Gmailʹ௨஌͕ඈͿ

  56. ϑΟʔυόοΫϑΥʔϜ 56 • GmailͰͷ΍ΓͱΓ͸GitHubͷIssueʹࣗಈͰ ಉظ͞ΕΔ github.com/fukayatsu/feedback-sync

  57. TwitterͰͷϑΟʔυόοΫ • esaؔ࿈πΠʔτ΍@esa_io΁ͷreplyͳͲ͕ SlackʹྲྀΕΔΑ͏ʹͯ͋͠Δ • SlackͰEmoji reactionΛ͢Ε͹Twitter্Ͱ͓ ؾʹೖΓ͕Ͱ͖Δ 57 github.com/fukayatsu/esarch

  58. ϑΟʔυόοΫۦಈ։ൃ • ʮ͜͜͸͜͏ͩͱخ͍͠ΜͰ͚͢Ͳʯ • ʮΑͦ͞͏Ͱ͢Ͷɻ΍ͬͯΈ·͢ʂʯ • (30෼ޙ)ʮϦϦʔε͠·ͨ͠ʂʯ • ʮΘʔ͍ʂʯ •

    …Έ͍ͨͳͷ͕ཧ૝ 58
  59. ϑΟʔυόοΫۦಈ։ൃ • ར఺ • ΍ΔؾͷॠؒՐྗΛ։ൃʹ׆͔ͤΔ • ૣ͚Ε͹ૣ͍΄Ͳɺͼͬ͘Γͨ͠ΓتΜͩ Γͯ͠΋Β͑ΔͷͰɺ࣍ͷ։ൃͷϞνϕʔγϣ ϯʹͳΔ 59

  60. esaͱϞνϕʔγϣϯ 60

  61. Ϟνϕʔγϣϯ • Ϟνϕʔγϣϯࣗମ͸੍ޚͰ͖ͳ͍ • ੍ޚͰ͖ͳ͍΋ͷ͸ٕज़ͰͲ͏ʹ΋ͳΒͳ ͍? • esaͰ͸։ൃεέδϡʔϧΛ΄ͱΜͲ੾Βͣϊ ϧϚ΋ͳ͍ͷͰɺϞνϕʔγϣϯ͕௿Լ͢Δ ͱ։ൃ͕଺Δ

    61
  62. Ϟνϕʔγϣϯ • ϞνϕʔγϣϯΛੜΈग़͠͏Δ؀ڥ΍Πϕϯ τ(ΛੜΈग़͠͏ΔԿ͔…)Λ੍ޚ͢Δ͜ͱͰɺ ؒ઀తʹϞνϕʔγϣϯΛߴΊΔ౒ྗΛ͢Δ • “΍ΔؾΛग़͢” Ͱ͸ͳ͘ɺ “΍Δؾ͕ग़ͦ͏ ͳԿ͔”

    ʹ࠷ળΛਚ͘͢ 62
  63. Ϟνϕʔγϣϯ͕ग़ͦ͏ͳԿ͔ • Ϣʔβʔ͞Μʹ௚઀Ձ஋Λಧ͚ΒΕ͍ͯΔ • Ϣʔβʔ͞Μ͔Β͋Γ͕ͱ͏ͱݴͬͯ΋Β͑ Δ • Ϣʔβʔ͞Μͷձ্͕ࣾख͍͘͘ • ৭ΜͳਓʹesaάοζΛָ͠ΜͰ΋Β͍͑ͯΔ

    63
  64. Ϟνϕʔγϣϯ͕ग़ͦ͏ͳԿ͔ • ࣗࣾαʔϏεͷऩӹ͚ͩͰձࣾΛӡӦͰ͖Δ • ඞཁे෼ͳڅ༩ΛಘΒΕΔ • Α͘৸Δ / ݈߁Ͱ͍Δ •

    ΍Γ͍ͨࣄΛ΍Γ͍ͨ࣌ʹ΍Δ 64
  65. Α͍॥؀ 1. αʔϏεΛ࡞Δ 2. Ϣʔβʔ͞Μ͕࢖ͬͯ͘ΕΔ/تΜͰ͘ΕΔ 3. զʑͷϞνϕʔγϣϯ(ͱച্)্͕͕Δ 4. ߋʹྑ͍αʔϏεΛ࡞Δ 65

  66. esaͱϞνϕʔγϣϯ • esaͷ։ൃʹͱͬͯϞνϕʔγϣϯ͸ඇৗʹॏ ཁ • ੍ޚͰ͖Δ෦෼ͱ੍ޚͰ͖ͳ͍෦෼ͱΛݟۃ Ίͯɺ੍ޚͰ͖Δ෦෼ʹ஫ྗ͢Δ • ྑ͍॥؀Λૉૣ͘ࡉ͔͘ճ͍ͯ͘͜͠ͱΛҙ ࣝ͢Δ

    66
  67. ·ͱΊ 67

  68. ·ͱΊ • esaͷγεςϜ΍࣮૷ʹ͍ͭͯ͝঺հ͠·ͨ͠ • খ͘͞ϦϦʔεͯ͠ɺϢʔβʔ͞Μ͔ΒϑΟʔυόο Ϋ΍ϞνϕʔγϣϯΛ໯͍ͳ͕ΒαʔϏε΍ࣗ෼ ͨͪΛҭ͍ͯͯ͘ͷ͸ͱͯ΋ָ͍͜͠ͱͩͬͨ • ͦͷΑ͍॥؀Λճ͢͜ͱΛҙ͍ࣝͯͨ͠Β͍ͭ ͷؒʹ͔͜͜·Ͱདྷ͍ͯͨ

    68
  69. ࢀߟ 69

  70. χʔόʔͷفΓ • ʮئΘ͘͹Θͨ͠ʹɺม͑Δ͜ͱͷͰ͖ͳ͍ ෺ࣄΛड͚ೖΕΔམͪண͖ͱɺม͑Δ͜ͱͷ Ͱ͖Δ෺ࣄΛม͑Δ༐ؾͱɺͦͷҧ͍Λৗʹ ݟ෼͚Δ஌ܙͱΛ͚ͣͨ͞·͑ʯ 70 ja.wikipedia.org/wiki/χʔόʔͷفΓ