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

フリマアプリ「メルカリ」の急成長を支えるエンジニアリング

 フリマアプリ「メルカリ」の急成長を支えるエンジニアリング

Tatsuhiko Kubo

October 03, 2015
Tweet

More Decks by Tatsuhiko Kubo

Other Decks in Technology

Transcript

  1. ϑϦϚΞϓϦ
    ʮϝϧΧϦʯͷ
    ٸ੒௕Λࢧ͑Δ
    ΤϯδχΞϦϯά
    גࣜձࣾϝϧΧϦ
    ΤϯδχΞ
    ٱอୡ඙
    [email protected]
    PHPΧϯϑΝϨϯε 2015

    View Slide

  2. @cubicdaiya / Tatsuhiko Kubo
    • Software Engineer @ Mercari, Inc.
    • Infrastructure Engineering
    • Skills
    • C, Go, Lua, nginx,…
    • OSS developer
    • ngx_small_light, ngx_dynamic_upstream,
    nginx-build, slackboard, cachectl, gaurun, …

    View Slide

  3. ISUCON5༧બ 2ҐͰಥഁ͠·ͨ͠
    ݴޠ͸PerlͰ͢
    νʔϜGoBold
    @kazeburo
    @shmorimo
    @cubicdaiya

    View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. ओཁKPIσʔλ
    μ΢ϯϩʔυ਺
    ߪೖֹۚ
    ग़඼਺
    ਺஋
    2000ສDL(JP+US)
    ݄ؒ਺ेԯԁ
    1೔਺ेສ඼Ҏ্

    View Slide

  8. 4ਓ
    30ਓऑ
    ΠϯϑϥνʔϜ
    ૯ΤϯδχΞ਺

    View Slide

  9. 100+
    13,000+
    αʔό୆਺
    ඵؒϦΫΤετ਺
    (ϐʔΫ࣌)
    JP only

    View Slide

  10. Πϯϑϥ͸͘͞ΒͱAWSͷϋΠϒϦουߏ੒
    • ͘͞Βͷઐ༻αʔό
    • ͘͞ΒͷΫϥ΢υ
    • Amazon Web Services
    • EC2, S3, SES౳

    View Slide

  11. ઐ༻αʔόͱΫϥ΢υͷ࢖͍෼͚
    • ઐ༻αʔό͸ίετύϑΥʔϚϯε͕ߴ͍
    • 1୆͋ͨΓͷੑೳ͕ߴ͍ͷͰ୆਺ΛগͳΊʹͰ͖Δ
    • MySQL on ioDrive
    • Ϋϥ΢υ͸ॊೈੑ͕ߴ͍
    • ಥൃతͳෛՙ΁ͷରԠ
    • ࢼݧɾ࢖͍ࣺͯ༻ʹαʔόΛ֬อ͠΍͍͢

    View Slide

  12. PHPͰߴ଎ͳAPIαʔόΛ࣮ݱ

    View Slide

  13. PHPͰߴ଎ͳAPIαʔόΛ࣮ݱ
    • ֤ॴͰΧϦΧϦʹνϡʔχϯά
    • ܰྔͳϑϨʔϜϫʔΫΛར༻(dietcake)
    • Ωϟογϡ(memcached, Redis)
    • ඇಉظॲཧ(Q4M + php-Parallel-Prefork)
    • ۚͷ஄ؙMySQL on ioDrive

    View Slide

  14. http://dietcake.github.io/

    View Slide

  15. php-Parallel-Prefork
    • prefork server framework for PHP
    • https://github.com/travail/php-parallel-prefork
    • ඇಉظॲཧʹར༻
    • Q4M͔ΒδϣϒΛσΩϡʔɺϚϧνϓϩηεͰฒྻʹॲཧ

    View Slide

  16. New RelicʹΑΔϞχλϦϯά

    View Slide

  17. PHP5.3 -> 5.6ʢ2015೥7݄ʣ

    View Slide

  18. nginxʹΑΔϋΠύϑΥʔϚϯε
    ωοτϫʔΩϯά

    View Slide

  19. TLSλʔϛωʔγϣϯɺSPDYήʔτ΢ΣΠ
    ɾɾɾ ɾɾɾ
    "1* "[email protected]

    OHJOY
    OHJOY
    HTTPS or SPDY
    HTTP
    "1* "[email protected]
    "1* "[email protected]

    ɾɾɾ ɾɾɾ
    OHJOY

    View Slide

  20. HTTPSऴ୺αʔόͱͯ͠ͷnginx
    • େྔͷಉ࣌઀ଓ(਺ສ)Λܰշʹࡹ͚Δ
    • APIαʔόͷϩʔυόϥϯε΋݉ͶΔ
    • ߴ଎ͳHTTPS௨৴ͷఏڙ
    • TLS Session (Cache|Tickets), OCSP Stapling
    • SPDY/3.1ɺHTTP/2ͷήʔτ΢ΣΠ
    • ϝϧΧϦ͸SPDY/3.1Λར༻

    View Slide

  21. L7(HTTP)ϩʔυόϥϯε
    "1*
    "QBDIF
    4PMS
    search
    "QBDIF
    4PMS
    "QBDIF
    4PMS
    OHJOY
    "1*
    "1*
    search

    View Slide

  22. ݕࡧ݁ՌͷΩϟογϡ
    "1* OHJOY
    "QBDIF
    4PMS
    search

    View Slide

  23. ݕࡧ݁ՌͷΩϟογϡ(Ωϟογϡ͕ͳ͍৔߹)
    "1* OHJOY
    "QBDIF
    4PMS
    1:search 2:proxy
    3:response
    5:response
    4:cached response

    View Slide

  24. ݕࡧ݁ՌͷΩϟογϡ(Ωϟογϡ͕͋Δ৔߹)
    "1* OHJOY
    "QBDIF
    4PMS
    1:search
    2:response

    View Slide

  25. https://speakerdeck.com/cubicdaiya/nginxfalsepahuomansutiyuningu
    ଓ͖͸WebͰ

    View Slide

  26. SlackͰChatOps

    View Slide

  27. SlackͰͰ͖Δ͜ͱʢϝϧΧϦͷ৔߹ʣ
    • σϓϩΠ
    • ۈଵ؅ཧ
    • Ξϥʔτ௨஌
    • CIͷखಈ࣮ߦ
    • etc…

    View Slide

  28. σϓϩΠ

    View Slide

  29. ۈଵ؅ཧ

    View Slide

  30. Ξϥʔτ௨஌

    View Slide

  31. CIͷखಈ࣮ߦ

    View Slide

  32. ࣦഊ͢Δͱɺ

    View Slide

  33. SlackϓϩΩγαʔόܦ༝Ͱ
    Ͳ͔͜ΒͰ΋ϙετ

    View Slide

  34. ͍ΖΜͳαʔό͔ΒSlackʹ௨஌͢Δࡍͷ໰୊఺
    • ֤αʔό্ͷΫϥΠΞϯτ͕Incomming
    WebhooksͷURLΛ஌͍ͬͯΔඞཁ͕͋Δ
    • ΫϥΠΞϯτͷར༻ݴޠ͕όϥόϥ
    • ௨஌ॲཧΛॻ͘ͷ͕໘౗
    • ϓϩΩγཱͯͯϓϩΩγͱ௨৴͢ΔΫϥΠΞ
    ϯτΛ֤αʔόʹ഑ஔ͠Α͏ʂ

    View Slide

  35. Πϝʔδ

    View Slide

  36. slackboard
    • A slack proxy server in Go
    • https://github.com/cubicdaiya/slackboard
    • ߏ੒ϓϩάϥϜ
    • slackboardʙSlackϓϩΩγαʔόʙ
    • slackboard-cliʙΫϥΠΞϯτ for slackboardʙ
    • slackboard-logʙΫϥΠΞϯτ like cronlogʙ

    View Slide

  37. slackboard-cliͰSlack΁௨஌
    $ echo mercari | \
    slackboard-cli \
    -c tech-test \
    -s slackboard-server:29800
    TMBDLCPBSE
    POST /notify-directly
    Slack΁ϙετ

    View Slide

  38. slackboard-logͰSlack΁௨஌
    $ ls
    $ slackboard-log \
    -c tech-test \
    -s slackboard-server:29800 -- ls hoge
    TMBDLCPBSE
    POST /notify-directly
    Slack΁ϙετ

    View Slide

  39. θϩμ΢ϯλΠϜσϓϩΠ

    View Slide

  40. "1* "[email protected]

    ҎલͷσϓϩΠखॱ
    "1* "[email protected]

    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    rsync
    rsync
    rsync

    View Slide

  41. Pros / Cons
    • Pros
    • ؆୯Ͱͦͦ͜͜଎͍(appαʔό͸30୆͘Β͍)
    • Cons
    • ϊϯΤϥʔͰσϓϩΠͰ͖ͳ͍
    • Too many 500 errors!!!
    • ࣌ʑΦϖίʔυΩϟογϡ͕յΕΔʢ࠶ىಈ͕ඞཁʣ

    View Slide

  42. ɾɾɾ ɾɾɾ
    "1* "[email protected]

    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    HTTPS or SPDY
    OHJOY

    [email protected]@VQTUSFBN
    HTTP
    Mercari frontend
    "1* "[email protected]
    "1* "[email protected]

    ɾɾɾ ɾɾɾ

    View Slide

  43. ɾɾɾ ɾɾɾ
    "1* "[email protected]

    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    HTTPS or SPDY
    OHJOY

    [email protected]@VQTUSFBN
    HTTP
    Mercari frontend
    "1* "[email protected]
    "1* "[email protected]

    ɾɾɾ ɾɾɾ

    View Slide

  44. ngx_dynamic_upstream
    • Dynamic Upstream for nginx
    • https://github.com/cubicdaiya/ngx_dynamic_upstream
    • nginxͷΞοϓετϦʔϜΛ
    HTTPϕʔεͷAPIͰಈతʹมߋͰ͖Δ
    • rsyncͷલޙͰΞοϓετϦʔϜΛॻ͖׵͑

    View Slide

  45. "1* "[email protected]

    θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    "1* "[email protected]

    View Slide

  46. "1* "[email protected]

    θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    "1* "[email protected]

    ※rsync
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream

    View Slide

  47. "1* "[email protected]

    θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    "1* "[email protected]

    ※rsync
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream

    View Slide

  48. θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    "1* "[email protected]

    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream
    down
    "1* "[email protected]

    View Slide

  49. "1* "[email protected]

    θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    "1* "[email protected]

    rsync
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream

    View Slide

  50. θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    "1* "[email protected]

    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream
    up
    "1* "[email protected]

    View Slide

  51. "1* "[email protected]

    θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    "1* "[email protected]

    ※rsync
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream

    View Slide

  52. θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream
    down
    "1* "[email protected]

    "1* "[email protected]

    View Slide

  53. "1* "[email protected]

    θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    "1* "[email protected]

    rsync
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream

    View Slide

  54. θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream
    up
    "1* "[email protected]

    "1* "[email protected]

    View Slide

  55. "1* "[email protected]

    θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    "1* "Q[email protected]

    ※rsync
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream
    EFQMPZCPU

    View Slide

  56. θϩμ΢ϯλΠϜσϓϩΠ
    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream
    down
    "1* "[email protected]

    "1* "[email protected]

    "1* "[email protected]

    View Slide

  57. "1* "[email protected]

    θϩμ΢ϯλΠϜσϓϩΠ
    "1* "[email protected]

    ChatOps with Slack
    yes
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    "1* "[email protected]

    rsync
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream
    EFQMPZCPU

    View Slide

  58. θϩμ΢ϯλΠϜσϓϩΠ
    ChatOps with Slack
    yes
    EFQMPZCPU
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    OHJOY

    [email protected]@VQTUSFBN
    ※ rsync ——rsync-path=mercari_app_rsync(↓)
    #!/bin/sh
    mercari_app_ctl down # deactivate server on nginx upstream
    rsync $* # deploy
    mercari_app_ctl up # activate server on nginx upstream
    up
    "1* "[email protected]

    "1* "[email protected]

    "1* "[email protected]

    View Slide

  59. ϓογϡ௨஌ج൫

    View Slide

  60. 1೥લ

    View Slide

  61. ൒೥લ

    View Slide

  62. ݱࡏ

    View Slide

  63. Gaurun
    • A general push notification server in Go
    • https://github.com/mercari/gaurun
    • APNS΍GCM΁ͷϓογϡ௨஌ϦΫΤετΛϓϩΩγ
    • Q4M+php-Parallel-Preforkͩͱੑೳग़ͳ͔ͬͨͷͰ
    ϑϧεΫϥονͰॻ͍ͨ
    • ଞͷδϣϒϫʔΧʔͷҰ෦΋GoͰϦϥΠτத

    View Slide

  64. ϝϧΧϦͷ੒௕Λࢧ͑Δϩά෼ੳج൫

    View Slide

  65. 200GB / day
    ϩά༰ྔ

    View Slide

  66. ֤αʔόͰऩूͨ͠ϩάσʔλΛFluentdͰసૹ
    "QQ
    8PSLFS
    #BUDI
    ,JCBOB
    #JH2VFSZ
    /PSJLSB
    .BDLFSFM

    View Slide

  67. Mercari\DataTrack
    • Various purpose logging framework for PHP
    • αʔόαΠυͰى͜ΔΠϕϯτΛॊೈʹϩΪϯά
    • ϝʔϧɺϓογϡͷૹ৴
    • A/Bςετ
    • Πϕϯτͷܦա
    • Pascal(ޙड़)ͱૄʹ࿈ܞ

    View Slide

  68. /PSJLSB
    ϩάσʔλసૹ
    ఆظతͳΠϕϯτͷऔಘ
    3ඵຖ

    type norikra
    norikra norikra-server:26571
    target_string access_log


    type norikra
    norikra localhost:26571

    method sweep
    target target_name
    tag query_name
    tag_prefix norikra.query
    interval 3s


    SQLΛొ࿥
    /**
    * access.log͔ΒHTTPεςʔλείʔυͷׂ߹(1෼ؒ)Λूܭ
    */
    SELECT
    COUNT(1, status like "5%")/COUNT(1)*100 AS rate_5xx,
    COUNT(1, status like "4%")/COUNT(1)*100 AS rate_4xx,
    COUNT(1, status like "3%")/COUNT(1)*100 AS rate_3xx,
    COUNT(1, status like "2%")/COUNT(1)*100 AS rate_2xx
    FROM access_log.win:time_batch(1 min)
    NorikraʹΑΔϩάετϦʔϛϯάॲཧ

    View Slide

  69. Πϕϯτͷऔಘ
    fluent-plugin-norikra
    Mackerel΁సૹ
    ֤छϝτϦΫεΛάϥϑԽ
    ྫ:APIͷฏۉϨεϙϯελΠϜ౳
    ݕ஌ͨ͠Τϥʔ಺༰Λ௨஌
    Slack΁సૹ
    /PSJLSB
    SQLͰநग़ͨ࣌͠ܥྻσʔλΛ͞Βʹసૹ

    View Slide

  70. σʔλͷूܭɺՄࢹԽɺϨϙʔςΟϯά
    • Ϩϙʔτϝʔϧ
    • Web UIʹΑΔ౷ܭμογϡϘʔυ
    • ֎෦ͷ෼ੳπʔϧར༻

    View Slide

  71. ϩάσʔλ෼ੳ্ͷ՝୊
    • ֤छKPI΍෼ੳʹඞཁͳݩσʔλ͕෼ࢄ
    • ϩά͕෼ੳ༻ʹઃܭ͞Εͯͳ͍ͷͰɺ෼ੳ͢
    Δͷʹ͸޲͍ͯͳͯ͘࢖͍ͮΒ͍(ίπ͕ཁΔ)
    • ֎෦ͷ෼ੳπʔϧͩͱखܰʹूܭɾՄࢹԽͰ
    ͖Δ͕ɺଞͷσʔλ΍πʔϧͱ૊Έ߹ΘͤΔ
    ͷ͕೉͍͠

    View Slide

  72. ͱ͍͏Θ͚Ͱɺ
    • ෼ੳʹదͨ͠ϩάΛҰ͔Βઃܭɾूܭ
    • ͦͷ্Ͱ෼ੳπʔϧͱ૊Έ߹Θͤͯ࢖͑ΔΑ
    ͏ʹ͠Α͏
    ৽͍͠ϩά෼ੳج൫Λߏங͢Δ͜ͱʹ

    View Slide

  73. PascalʙMercari analysis baseʙ
    0QFO3FTUZ
    0QFO3FTUZ
    0QFO3FTUZ
    (PPHMF#JH2VFSZ
    Developer Data Sientist
    Analyze
    by SQL
    send events
    send events
    send events
    Powered by
    cookpad/puree-(ios|android)
    utilize events
    transfer
    utilize events
    utilize events
    transfer

    View Slide

  74. Puree
    • ΫοΫύου͕ࣾ։ൃɾެ։͍ͯ͠ΔεϚϗ
    ΞϓϦ޲͚ͷϩάίϨΫλϥΠϒϥϦ
    • https://github.com/cookpad/puree-android
    • https://github.com/cookpad/puree-ios
    • Android, iOSͰ΄΅ಉ͡৚݅ͰϩάσʔλΛ
    औಘՄೳ

    View Slide

  75. OpenResty
    • nginxϕʔεͷWebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ
    • bundled ngx_lua, Lua, LuaJIT, ͦͷଞศརͳ
    Ϟδϡʔϧ
    • ͋Δҙຯnginxͷεʔύηοτ

    View Slide

  76. PascalʙMercari analysis baseʙ
    • جຊ͸BigQueryͰΞυϗοΫʹ෼ੳ
    • ϩάͷϑΥʔϚοτ͕෼ੳʹదͨ͠ܗʹ
    • Chartio౳ͷ෼ੳπʔϧͱ΋૊Έ߹Θͤͯར༻
    • ΞϓϦ಺ΞΫγϣϯ΍A/Bςετ෼ੳΛ͸͡Ί
    ద༻ൣғΛ֦େத

    View Slide

  77. ·ͱΊ
    • ৭ʑ޻෉ͯ͠PHPͰߴ଎ͳAPIαʔόΛ࣮ݱ͍ͯ͠·͢
    • དྷ೥͸7ରԠʁ
    • όοΫΤϯυͷํͰ͸GoΛ࠾༻͢Δ৔໘͕૿͑ͯ·͢
    • γεςϜͷύϑΥʔϚϯε΍ࣗಈԽɺσϓϩΠɺϩά෼
    ੳͳͲٸ੒௕Λࢧ͑ΔͨΊͷج൫࡞Γʹۈ͠ΜͰ͍·͢

    View Slide

  78. We are hiring!

    View Slide