Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Kentaro Kuribayashi

July 28, 2017
Tweet

More Decks by Kentaro Kuribayashi

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. NSVCZ૊ΈࠐΈͷखॱ

    View Slide

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

    View Slide

  14. ೖྗ͞ΕͨจࣈྻΛ
    NSVCZͷίʔυͱͯ͠ධՁ͢Δ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. ϛυϧ΢ΣΞˠNSVCZˠϛυϧ΢ΣΞ
    NSVCZͷ
    ੈք
    ϛυϧ΢ΣΞͷ
    ੈք
    ϛυϧ΢ΣΞͷ
    ੈք
    (char *
    ܕͰ
    ίʔυΛ౉͢˞
    mrb_valueܕ
    ͔Βద੾ͳܕ΁ม׵
    ˞ࠓճ͸ͦ͏͍ͯ͠Δ͚ͩͰɺ࣮ࡍʹ͸ͦͷଞʹ΋ϑΝΠϧΛΘͨ͢ͱ͔͍Ζ͍Ζํ๏͕͋Γ·͢ɻ

    View Slide

  19. mruby_valueܕ͔Βͷܕม׵
    ࣮ࡍͷܕΛ
    ൑ఆ͢Δ
    ܕ͝ͱʹ
    ม׵͍ͯ͘͠

    View Slide

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

    View Slide

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

    View Slide

  22. FDIPαʔόͷίΞߏ଄ମ
    typedef struct em_t {
    int reply_count; // ϦΫΤετ΁ͷฦ৴ճ਺
    char *reply_prefix; // ϓϩϯϓτͷจࣈྻ
    mrb_state *mrb;
    } em;
    Emߏ଄ମͷఆٛ

    View Slide

  23. NSVCZͷίʔυ͔Βϛυϧ΢ΣΞʹ৮Δ
    NSVCZ͔Β
    Emߏ଄ମͷ
    ίʔυΛݺͿ
    Χ΢ϯτ͕
    ͞Ε͍ͯΔ
    NSVCZ͔Β
    Emߏ଄ମͷ
    ίʔυΛݺͿ
    ϓϩϯϓτͷ
    จࣈ͕มԽ

    View Slide

  24. NSVCZʹΫϥεͱϝιουΛຒΊࠐΉ
    EmΫϥεΛ
    ࡞Δ
    EmΫϥεʹ
    ϝιουΛ࡞Δ

    View Slide

  25. mrb_valueܕ
    ͔Βద੾ͳܕ΁ม׵
    NSVCZˠϛυϧ΢ΣΞˠNSVCZ
    ϛυϧ΢ΣΞͷ
    ੈք
    NSVCZͷ
    ੈք
    NSVCZͷ
    ੈք
    mrb_valueܕ
    ΁ม׵
    ͖ͬ͞ͱٯͩͶ

    View Slide

  26. ϝιουΛఆٛ͢Δ
    Em ߏ଄ମΛ
    औΓग़͢
    Em ߏ଄ମͷ
    ϝϯό஋Λมߋ

    View Slide

  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ߏ଄ମΛೖΕ͓ͯ͘

    View Slide

  28. MJCNSVCZΛ
    ϛυϧ΢ΣΞʹ૊ΈࠐΉ

    View Slide

  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 [email protected]:mruby/mruby.git vendor/mruby
    $ cd vendor/mruby && rake all
    NSVCZΛ΋͖ͬͯͯϏϧυ͢Δ

    View Slide

  30. ΋ͬͱ͍͍ํ๏͸ˣΛࢀরͷ͜ͱ
    http://hb.matsumoto-r.jp/entry/2015/02/07/011237

    View Slide

  31. ͓ΘΓʹ

    View Slide

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

    View Slide

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

    View Slide

  34. NSVCZ΍ΔͷʹϖύϘΊͪΌ࠷ߴ
    ΤϥʔͰϋϚͬͯࢮΜͰ͚ͨͲɺ
    @matsumotory

    @udzura

    ͷ໊྆ʹฉ͍ͨΒ͙͢ղܾ͠
    ͨ

    View Slide