ミドルウェアにmrubyを組み込む方法 / How to Embed mruby into Middlewares Written in C

ミドルウェアにmrubyを組み込む方法 / How to Embed mruby into Middlewares Written in C

真夏の技術部&BPR室 TechMTG #3(ペパボ社内勉強会)

23f4d5d797a91b6d17d627b90b5a42d9?s=128

Kentaro Kuribayashi

July 28, 2017
Tweet

Transcript

  1. ʙγϯϓϧͳαʔόͷ֦ுΛ୊ࡐʹઆ໌͠·͢ʙ ܀ྛ݈ଠ࿠(.01FQBCP *OD ਅՆͷٕज़෦#13ࣨ5FDI.5(ʢࣾ಺ษڧձʣ ϛυϧ΢ΣΞʹmrubyΛ૊ΈࠐΉํ๏

  2. (.0ϖύϘגࣜձࣾ ܀ྛ݈ଠ࿠@kentaro औక໾$50 https://kentarok.org

  3. ຊτʔΫʹΑͬͯಘΒΕΔ͜ͱ w$ͷϓϩάϥϜʹNSVCZΛ૊ΈࠐΈɺNSVCZͷεΫϦ ϓτΛ࣮ߦ͢Δํ๏͕Θ͔Γ·͢ wطଘͷϛυϧ΢ΣΞʹɺNSVCZΛ૊ΈࠐΜͰ֦ுͰ͖ ΔΑ͏ʹͳΓ·͢ wͭ·ΓɺOHY@NSVCZͷΑ͏ͳ΋ͷΛ࡞ΕΔΑ͏ʹͳ Δͱ͍͏͜ͱͰ͢Ͷʂʢݪཧతʹ͸ʣ

  4. ໨࣍  ֦ு͢Δϛυϧ΢ΣΞ  NSVCZ૊ΈࠐΈͷखॱ  ͓ΘΓʹ

  5. ֦ு͢Δϛυϧ΢ΣΞ

  6. FDIPαʔόΛ֦ு͍͖ͯ͠·͢

  7. FDIPαʔόɺΫϥΠΞϯτͷ3VCZͰͷྫ αʔό ΫϥΠΞϯτ

  8. FDIPαʔόɺΫϥΠΞϯτΛ࣮ߦ ೖྗ͞ΕͨจࣈྻΛ ͦͷ··ฦ͚ͩ͢ͷ αʔόɻ

  9. ͳͥFDIPαʔό͔ʁ w࣮ࡍ͸ɺ$Ͱॻ͍ͨFDIPαʔόΛ֦ு͠·͢ w͜ͷFDIPαʔόΛɺͨͱ͑͹OHJOYͷΑ͏ͳϛυϧ΢Σ Ξͩͱࢥ͍ͬͯͩ͘͞ɻݪཧతʹ͸ɺಉ͡Α͏ͳ΍Γ ํͰ֦ுͰ͖·͢ w͍͖ͳΓେ͖ͳϛυϧ΢ΣΞʹऔΓ૊ΜͰ΋ͭΒ͍˞ ͷͰɺ؆୯ͳ΋ͷΛྫʹ͸͡Ί͍͖ͯ·͠ΐ͏ ˞$ݴޠͱNSVCZͷ஌ࣝʹՃ͑ͯɺର৅ͱͳΔϛυϧ΢ΣΞΛ֦ு͢Δϊ΢ϋ΢΋஌Δඞཁ͕͋Δ͔Βɻ

  10. NSVCZΛ૊ΈࠐΜͩFDIPαʔό ೖྗ͞ΕͨจࣈྻΛ NSVCZͷίʔυͱ͠ ͯධՁ͠ɺ݁ՌΛฦ ͢αʔό

  11. ֦ுͨ͠FDIPαʔόͷಛ௃ w༩͑ΒΕͨจࣈྻΛɺNSVCZͷίʔυͱͯ͠ධՁ͢Δ wNSVCZͷίʔυΛ࣮ߦͨ݁͠ՌͷܕΛ൑ผͯ͠ɺద੾ ͳจࣈྻΛฦ͢ wFDIPαʔόͷߏ଄ମʢ(em * ܕʣͷఏڙ͢Δϝϯό ΍ؔ਺ʹNSVCZίʔυ͔Β৮ΕΒΕΔ

  12. NSVCZ૊ΈࠐΈͷखॱ

  13. ૊ΈࠐΈͷखॱ  ೖྗ͞ΕͨจࣈྻΛNSVCZͷίʔυͱͯ͠ධՁ͢Δ  NSVCZͷίʔυͱ૊ΈࠐΈର৅ͷϛυϧ΢ΣΞͱͷ ؒͰɺ஋Λద੾ͳܕʹม׵͢Δ  NSVCZͷίʔυத͔Βϛυϧ΢ΣΞͷίʔυʹ৮Ε ͍ͨ৔߹͸ɺΫϥεͱϝιουΛ࡞੒͢Δ 

    MJCNSVCZΛϛυϧ΢ΣΞʹ૊ΈࠐΉ
  14. ೖྗ͞ΕͨจࣈྻΛ NSVCZͷίʔυͱͯ͠ධՁ͢Δ

  15. ೖྗΛNSVCZͷίʔυͱ࣮ͯ͠ߦ

  16. ͔͜͜ΒͲ͏΍ͬͯઌʹਐΉ͔ʁ

  17. NSVCZͱϛυϧ΢ΣΞͷؒͰ ஋ͷܕม׵Λ͢Δ

  18. ϛυϧ΢ΣΞˠNSVCZˠϛυϧ΢ΣΞ NSVCZͷ ੈք ϛυϧ΢ΣΞͷ ੈք ϛυϧ΢ΣΞͷ ੈք (char * ܕͰ

    ίʔυΛ౉͢˞ mrb_valueܕ ͔Βద੾ͳܕ΁ม׵ ˞ࠓճ͸ͦ͏͍ͯ͠Δ͚ͩͰɺ࣮ࡍʹ͸ͦͷଞʹ΋ϑΝΠϧΛΘͨ͢ͱ͔͍Ζ͍Ζํ๏͕͋Γ·͢ɻ
  19. mruby_valueܕ͔Βͷܕม׵ ࣮ࡍͷܕΛ ൑ఆ͢Δ ܕ͝ͱʹ ม׵͍ͯ͘͠

  20. લϖʔδͷิ଍ wࠓճͷྫ͸؆୯ͳFDIPαʔόͳͷͰɺͲͷܕͰ͋ͬ ͯ΋͢΂ͯ(char * ܕʹม׵͍ͯ͠·͢ wͨͩ͠ɺݩͷܕ͕Θ͔ΔΑ͏ɺNSVCZίʔυ಺Ͱͷ ܕ໊Λࣔ͢จࣈྻΛ෇Ճ͍ͯ͠·͢ɻ wҰൠతʹ͸ɺ૊ΈࠐΈର৅ͷϛυϧ΢ΣΞ͕ظ଴͢Δ ܕʹม׵͍͖ͯ͠·͢

  21. NSVCZίʔυͷத͔Β ϛυϧ΢ΣΞͷத਎ʹ৮Δ

  22. FDIPαʔόͷίΞߏ଄ମ typedef struct em_t { int reply_count; // ϦΫΤετ΁ͷฦ৴ճ਺ char

    *reply_prefix; // ϓϩϯϓτͷจࣈྻ mrb_state *mrb; } em; Emߏ଄ମͷఆٛ
  23. NSVCZͷίʔυ͔Βϛυϧ΢ΣΞʹ৮Δ NSVCZ͔Β Emߏ଄ମͷ ίʔυΛݺͿ Χ΢ϯτ͕  ͞Ε͍ͯΔ NSVCZ͔Β Emߏ଄ମͷ ίʔυΛݺͿ

    ϓϩϯϓτͷ จࣈ͕มԽ
  24. NSVCZʹΫϥεͱϝιουΛຒΊࠐΉ EmΫϥεΛ ࡞Δ EmΫϥεʹ ϝιουΛ࡞Δ

  25. mrb_valueܕ ͔Βద੾ͳܕ΁ม׵ NSVCZˠϛυϧ΢ΣΞˠNSVCZ ϛυϧ΢ΣΞͷ ੈք NSVCZͷ ੈք NSVCZͷ ੈք mrb_valueܕ

    ΁ม׵ ͖ͬ͞ͱٯͩͶ
  26. ϝιουΛఆٛ͢Δ Em ߏ଄ମΛ औΓग़͢ Em ߏ଄ମͷ ϝϯό஋Λมߋ

  27. ϙΠϯτmrb_stateͷudϝϯό mrb_value em_mrb_method_set_reply_prefix(mrb_state *mrb, mrb_value self); ϝιουఆٛͷγάωνϟ͸ҎԼͷ௨ΓͳͷͰɺ em->mrb->ud = self;

    // udϝϯό͸(void *)ܕ // ……snip…… em *obj = (em *)mrb->ud; // ͳͷͰɺऔΓग़͢ͱ͖ʹΩϟετ͢Δ ͋ͱͰ࢖͏ͨΊʹmrb->udʹEmߏ଄ମΛೖΕ͓ͯ͘
  28. MJCNSVCZΛ ϛυϧ΢ΣΞʹ૊ΈࠐΉ

  29. MJCNSVCZΛ૊ΈࠐΉ $ gcc src/em.c src/em_server.c \ -Iinclude -Ivendor/mruby/include \ -Lvendor/mruby/build/host/lib

    -lmruby \ -o build/echo-mruby ҎԼͷΑ͏ʹϏϧυͯ͠ɺMJCNSVCZΛ૊ΈࠐΉ $ git clone git@github.com:mruby/mruby.git vendor/mruby $ cd vendor/mruby && rake all NSVCZΛ΋͖ͬͯͯϏϧυ͢Δ
  30. ΋ͬͱ͍͍ํ๏͸ˣΛࢀরͷ͜ͱ http://hb.matsumoto-r.jp/entry/2015/02/07/011237

  31. ͓ΘΓʹ

  32. ͋ͱ͸ˣΛΈͯͬͨΒ࡞ΕΔ https://github.com/kentaro/echo-mruby

  33. ͓ΘΓʹ w͍͖ͳΓ͍ͭ͝ϛυϧ΢ΣΞΛ֦ு͠Α͏ͱ͢Δͱɺ NSVCZͱؔ܎ͳ͍ͱ͜ΖͰΘ͔Βͳ͘ͳΔͷͰɺ؆୯ ͳྫͰ૊ΈࠐΈΛߦͬͯΈ·ͨ͠ w͓࢖͍ͷϛυϧ΢ΣΞͷ֦ுੑʹࠔͬͨΒɺNSVCZΛ ૊ΈࠐΉ͜ͱͰָ͕Ͱ͖ͳ͍͔ߟ͑ͯΈ·͠ΐ͏ w͋ͱ͸ɺ͍͍ײ͡ʹόʔϯʂͱΑΖ͘͠

  34. NSVCZ΍ΔͷʹϖύϘΊͪΌ࠷ߴ ΤϥʔͰϋϚͬͯࢮΜͰ͚ͨͲɺ @matsumotory @udzura ͷ໊྆ʹฉ͍ͨΒ͙͢ղܾ͠ ͨ