ã¿ãªããããã«ã¡ã¯ãã¡ãã¬ãŒã® QA ãšã³ãžã㢠ãã¿ãã ã§ãã å
¥ç€ŸããŠéããªã 1 幎ã«ãªããŸãã CLINICS éçºããŒã ã® QA 掻åãè¡ã£ãŠããŸãã ç§èªèº«ã®çµæŽãšããŠã¯ããã¹ãã»å質é¢é£æ¥åã«è¶³ãçªã£èŸŒãã§ããæ© 20 幎ã«ãªãããšããŠããŸãã 2020 幎ã¯ã¡ãã¬ãŒã® QA ãšã³ãžãã¢ãäžæ°ã« 0 å â2 åã«ãªããŸããã å
æ¥ Magic Pod å°å
¥ã®èšäº ãå
¬éãã米山ãšã¯ãã€ãŠã®ååã§ããããŸãã çŸåšã¯å¥ã
ã®éšçœ²ã«æå±ããŠããŸããããäºãåŸæåéãçºæ®ãã€ã€æææ
å ±äº€æãçžè«ããšãªã©ãããŠãããããªé¢ä¿æ§ã§ãã èªåãšã¯éãã¿ã€ãã®åè·çš®ããããšãäœããšæããŸãïŒãã®èŸºãã¯ãŸãå¥ã®æ©äŒã«âŠïŒã CLINICS éçºããŒã ã§ã¯ããšã³ãžãã¢ã»ãã¶ã€ããŒã» QA ãšã³ãžãã¢ãã¯ã³ããŒã ã§éçºãé²ããŠããŸãã ãããŸã§ç§ãçµéšããŠããçŸå Žã§ã¯ãQA ã¯éçºããŒã ã®å€åŽã«ããïŒã¹ããŒã¯ãã«ããŒãšããŠïŒããšãå€ããæ°é®®ãªæ°æã¡ã§ããŸãã ãã®èšäºã§ã¯ç§ã®å
¥ç€Ÿä»¥éåãçµãã§ãã QA 掻åã®æŠèŠã«ã€ããŠã話ãããããšæããŸãã ãCLINICS ã® QAããšã¯ïŒ ããŠãäœãããããŸã§ãQA ãšã³ãžãã¢ããšããè·çš®ã®ã²ãšãååšããªãã£ãéçºããŒã ã®ããããŸãã¯ãCLINICS ã«å¿
èŠãª QA ã£ãŠãªãã ããïŒããšãããšããããèãã¯ãããŸããã ãã¡ãããæ°ã
ã®ãããã¯ãã倧ããªé害ãªããªãªãŒã¹ã»éçšããŠããŠããã®ã§ããããªãã« QA/ãã¹ãã®æè¡åã¯ããã¯ãã§ãã å
¥ç€Ÿåã«ããäœåºŠã ãªãïŒä»ã®ææ®µã§ã¯ãªãïŒQA ãšã³ãžãã¢ã®æ¡çšãå¿
èŠãªã®ãïŒ QA ãšã³ãžãã¢ã«ã©ããªåœ¹å²ãæåŸ
ããŠããã®ãïŒ ãšãã£ãç¹ãéçºããŒã ã®äžé·ãšè©±ãåããŸããã ãªãïŒä»ã®ææ®µã§ã¯ãªãïŒQA ãšã³ãžãã¢ã®æ¡çšãå¿
èŠãªã®ãïŒ ç§ã¯ç¬¬äžè
æ€èšŒäŒç€Ÿã«æå±ããŠããæéãé·ãããšããããå質ã«ã€ããŠã®æ©ã¿ãããéçºããŒã ã«ãã¹ãæ¯æŽã ã£ããã³ã³ãµã«ãã£ã³ã°ç圹å²ã§é¢ããããšãå€ãã£ãã®ã§ãããŠã£ãšãæ©ãä»ç€Ÿã«çžè«ããã®ã§ã¯ãªããæ¡çšãããã®ã¯ãªãã ããïŒããšããçåãåçŽã«ãããŸããã çŸå Žã®æããšããŠã以äžã®ç¹ãæããããŠããŸããã ãããã¯ãéçºãšã³ãžãã¢ããªãªãŒã¹æã®ãªã°ã¬ãã·ã§ã³ãã¹ãïŒã·ããªãªãã¹ãïŒãã¡ã³ãã»å®æœããŠããããCLINICSïŒé»åã«ã«ãïŒã®è€éãã«è¿œãã€ããŠããã®ãé£ãããªã£ãŠãã ããã«å¯ŸããŠå°éæ§ããã£ãŠåãçµãããšã§ãè€éãªãã¡ã€ã³ç¥èãæ±ããããã¯ããå®å®ããŠéçºãªãªãŒã¹ã§ããä»çµã¿ãäœããã QA ãšã³ãžãã¢ã«ã©ããªåœ¹å²ãæåŸ
ããŠããã®ãïŒ æããŠããçµç¹äœå¶åãšããŠã¯ä»¥äžã®ãããªã話ã§ããã QA ãšã³ãžãã¢ã«ãã¹ããã§ãŒãºã ã瞊å²ãçã«é¢ãã£ãŠãããã®ã§ã¯ãªãããããã¯ãéçºããŒã ãšããŠã²ãšã€ã«ãªã£ãŠãæãã¹ãéçºããã»ã¹ãäžç·ã«ã€ããäžããŠãããã éçºãšã³ãžãã¢ããã¹ãã«é¢ããŠãã£ãããšçè§£ãããŠããããšã§ãããããå質ã®é«ããããã¯ããã€ããããšãã§ããããšãã£ãäžçãç®æããã ããã課é¡ã«å¯ŸããŠãã£ã¬ã³ãžçã«ããã£ãŠã¿ããããšåŒ·ãæã£ãã®ãšãç§ã¯ãããŸã§ã«ãããããªçŸå Žã®éçºäœå¶ã®äžã§ãã¹ããšã³ãžãã¢/QA ãšã³ãžãã¢ãšããŠæŽ»åããŠããŠããŸããããããããã¯ãéçºããŒã ãšããŠã²ãšã€ã«ãªã£ãŠããšãããšãããããããããè¯ããªïŒããšæã£ãã®ãèŠããŠããŸãã å°éè·ã«ä»»ããã®ã§ã¯ãªãããäžç·ã«çæ³ã®äžçãã€ããããããããšããæ°æã¡ããšãŠãèŠããè¯ãçµç¹ã ãšæããŸããã ãQA ãšã³ãžãã¢ãããã¹ããšã³ãžãã¢ããSET/SWETã ããã§å°ãè·çš®åã«é¢ããè£è¶³èª¬æãããŸããšããQA ãšã³ãžãã¢ããšããåŒç§°ã¯æ¯èŒçæ°ããæŠå¿µãªããããªãããšæããŸãã äžè¬çã«ã¯ããã¹ããšã³ãžãã¢ããšèšããæåéãããã¹ãæ¥åã«ç¹åãããšã³ãžãã¢ããæããŠããŸããããã®åŸã ãã¹ãããèŠããŠãã ã°ãŒã°ã«ã®ãœãããŠã§ã¢éçº ãïŒ2013 å¹Žæ¥æ¬èªççºè¡ïŒãããSET/SWETïŒSoftware Engineer in TestïŒããæ¥æ¬ã§ãèªç¥ãããåœå
ã®å°å
¥äºäŸãåºãŠããããšã§äžæ°ã«åºãŸã£ãå°è±¡ã§ãã ç§ã®è§£éã§ã¯ããQA ãšã³ãžãã¢ããšåŒç§°ããå Žåãããã¹ããšã³ãžãã¢ãããSET/SWETãã®çŽ é€ãå«ã¿ã€ã€ãã¹ã以å€ã«ããå質åäžã®ããã®æŽ»åå
šè¬ãç©æ¥µçã«æ
ã圹å²ããšããæå³åããæ¿ããªãããããªãããšæããŠããŸãã CLINICS ã®ãããããQAãã®å§¿ äžé·ãšè©±ãåã£ãçµæã以äžã®ãããªæŽ»åãã¡ã€ã³ã«æ®ããŠãããŸããããšããããšã«ãªããŸããã ïŒçŸç¶è¡ã£ãŠããïŒãã¹ãã®æ¹å ããã»ã¹æ¹å ç¥èã®åºäžã ããããã®ãããã¯ã«ã€ããŠãçŸåš CLINICS ã® QA 掻åãšããŠã©ã®ããã«åãçµãã§ãããã 1 ã€ãã€è©³ãã説æããŠãããŸãã ããã¹ãã®æ¹åã çŸç¶ CLINICS ã®éçºãµã€ã¯ã«ã¯é± 1 åã®ãªãªãŒã¹ãšããŠããŸãã æ¯åãªãªãŒã¹çšã«ã³ãŒãããªãŒãºããç°å¢ã«å¯ŸããŠãªã°ã¬ãã·ã§ã³ãã¹ããéçºããŒã å
šå¡ã§æäœæ¥ïŒããã¥ã¢ã«ãã¹ãïŒã«ããè¡ã£ãŠããŸãã æ¥ã
ã®æ©èœè¿œå ãæ¹ä¿®ã®éã«æããããŠã¯ããŸããããªã°ã¬ãã·ã§ã³ãã¹ãã®ã·ããªãªããã®ãã®æãã¿ããããã«ãªã£ãŠããŸããã ãããŠå¢ããŠããã·ããªãªã«ãã£ãŠã©ããã©ãå質æ
ä¿ãããŠããã®ãèŠéããæªããªã£ãŠããç¹ã倧ããªæ©ã¿ã§ããã ããã§ãŸãããçŸç¶ã®ã·ããªãªãã¹ããåæããå
šäœçã«åèšèšããããšããèšç»ãããŠãçŸåšã¯éçºããŒã ã®äžã§ãã«ã«ãã«é è©£ã®æ·±ãäžéšã¡ã³ããŒã§å®æçã« MTGïŒã¬ãã¥ãŒäŒïŒãè¡ããªãããã¹ãèšèšã®æ¹éãçµã¿ç«ãŠãŠããŸãã èšèšå³ã§ã¯ãã€ã³ããããããŒã«ããããªã¯ã¹ãäœæããŠæ¹åæ§ãç²åºŠãããåããããŠããŸãã ç§èªèº«ããä»ãŸã§ã®æ¥åã§ããã ããã£ããäžå¯§ã«ãã¹ãèšèšãããŠããããšããªããããå³ããããããžãããããã®ããã¿ã¹ã¯ãšãªã£ãŠããŸãã ãããã»ã¹æ¹åã ãã¡ãã¯ãã¹ããã®ãã®ã§ã¯ãªããéçºããŒã ã®ã«ãŒãã³ã¯ãŒã¯ãäœå¶ã«é¢ããæ¹åã§ãã çš®ãŸãçã«ã¹ã¢ãŒã«ããŒã ã§æ°ãããµããããææ³ã詊ããŠã¿ãããéçºå®äŸäŒã§å
±æããŠããé害æ
å ±ãšãã¹ã宿œäžã«èŠã€ãã£ããã°ã®æ
å ±ãäžå
åããŠæ®ãä»çµã¿ãå°å
¥ããããªã©è¡ããŸããã ç¹ã«ããµãããããã«ã€ããŠã¯åžžã«æ¹åãæèã§ããããã»ã¹ã§ãäžæãªãµãããããããã°ããã»ã©éçºå質ãåäžãããšèããããŠãããããå匷äŒã®åŸã«ãã£ãŒãããã¯ã³ã¡ã³ãããããä»çµã¿ãã€ãã£ãããªã©ã¡ãã£ãšããééã«ãããµããããããå°ããåããããã«è
å¿ããŠããŸãã ãããšãŸã çæã§ããŠããŸããããèšé²ããé害ã»ãã°æ
å ±ãè¿ããã¡ã«åæã»åé¡ããŠãã£ãŠä»åŸã®éçºã«åœ¹ç«ãŠãããšèããŠããŸãã ãã°åæã¯æéããããã®ã§ãªããªããµã¯ããšã¯ãããŸããããé·æçèŠç¹ã§ã¯æçšãªè²¡ç£ã«ãªããŸãã ãŸããéçºããã»ã¹ããæ¥åãããŒãèªäœã®çŸç¶ã®æ©ã¿ããšãçŸå Žã®å£°ãšããŠç§ãçŽæ¥æ¢ããããšãéçºããŒã å
ã§ãå
±éã®ç®æšããèªèããããã®ãã¬ã¹ãããªãŒãé£ãšè¡ããŸããã é²ãæ¹ã¯ã SaPID ããšããæ¹åææ³ãåèã«ããŠããŸãã SaPID ãšã¯ãâSystems analysis/Systems approach based Process Improvement methoDâã®ç¥èªã§ãåœäºè
èªããïŒæçµçã«ã¯ä»²éãšå
±ã«ïŒè§£æ±ºãã¹ãåé¡ç¹ãç¹å®ããçŸå®çã«è§£æ±ºãæ¹åããããŠé©æ°ãå®çŸããªããæ®µéçã»ç¶ç¶çã«èªåŸéå¶ãžã®ãŽãŒã«ãç®æãææ³ã§ãã 誰ãã«ããããããããããã®ã§ã¯ãªããåœäºè
èªãã®ææãããŒã ã»çµç¹ã®ææã§èªåŸçã«éå¶ãé²ããããšãå¿åããã®ãç¹åŸŽã§ãã ã³ããçŠã®äžãæ¥ã«ãã£ãŠãªã¢ãŒãã§åå ã®ã¡ã³ããŒãããããªã©ãµãããã€ãã£ãã¯ãŒã¯ã«ã工倫ãå¿
èŠã§ããããæçµçã«ã¯ãå
±éã®ç®æšããšã㊠èªåãšèº«ã®åšãã«åœ¹ã«ç«ã€ç¶æ³ãã€ãã äžéã«èªç¥ããããããã¯ããã€ãã ãšãããããªå®çŸ©ãã€ããããšãã§ããŸããã ãç¥èã®åºäžãã CLINICS ã¯ãããŸã§äžéæ¡çšã¡ã³ããŒãå€ãã£ããããOJT äžå¿ã§äœç³»çãªæè²ã¯ãŸã ãŸã æŽåãããŠããæ®µéã§ãã æ°åå
¥ç€Ÿãå¢ããŠããŠããæšä»ã§ã¯ã¡ã³ããŒå
šäœã§ç¥èã¬ãã«ãåããªãããšã«ããåŒå®³ãåºãŠããŠãããç®ç·ãåãããŠããããšãå«ç·ã®èª²é¡ã§ããã æ®æ®µã®æ¥åã®äžã§æççãªæ
å ±ãåŸãããšã¯ã§ããŠããªããªãäœç³»çãªç¥èãå¹ççã«èº«ã«ã€ããããšã¯é£ããã®ã§ïŒå°éæžã¯ååããŠããŒãã«ãé«ãïŒãäžé·ããã®ãã£ãŠã®é¡ãã§ããããQA ã«åŸäºããŠããè
ã«ãšã£ãŠã¯å²ãšåæ©çãªãã¹ãææ³ããæããããšã«ããŸããã ç§ã®ããã«ãã£ãš QA 掻åãããŠããè
ã«ãšã£ãŠã¯åœããåã®ææ³ã§ããéçºãšã³ãžãã¢ã«ãšã£ãŠã¯æå€ãšç¥ãæ©äŒããªãã£ãããããã®ã§ãã èŠããŠãããšãã¹ãã®æ®µéã ãã§ã¯ãªãèšèšå質ããããããšãã§ããã®ã§ãå®çããããã«æ¥ã
åãçµãã§ããŸãã ãŸãã¯æç§æžçãªå
容ã CLINICS ããŒã ã® Confluence ã«æžããŠãè¬çŸ©åœ¢åŒã§ CLINICS éçºããŒã ã®ã¡ã³ããŒã«èª¬æããå®è·µç·šãšããŠå®¿é¡ãåºããŠçãåãããšè§£èª¬ãè¡ãããšããæµãã§è¡ã£ãŠããŸãã åŠç¿è
ãšããŠã¯è©±ãèããŠããã ãã§ã¯èŠãã«ãããå®éã«æãåãããããæ¥ã
ã®æ¥åã§æ¬åœã«å°ã£ãçµéšããããšåŠã³ããæ¬²ã«ç«ãã€ããšæã£ãŠããã®ã§ãå®è·µã倧åã«ããŠããŸãã æŒç¿åé¡ã¯ä»¥äžã®ãããªæžç±ãåèã«ããŠäœåããŠããŸããããããšãããããŸããèè
ã®æ¹ã
ã ã ãœãããŠã§ã¢ãã¹ãææ³ããªã«âãã¹ãèšèšã®èãæ¹ãšå®é ã ã ã¯ãããŠåŠã¶ãœãããŠã§ã¢ã®ãã¹ãææ³ ã ã ãœãããŠã§ã¢ãã¹ãææ³ç·Žç¿åž³ ç¥èãçµéšã«å€ãã 40 å ã äžåºŠæãã£ãã ãã§ã¯ãªããªãèŠããã®ãé£ããã®ã§ã倧äºãªãã¹ãææ³ïŒå¢çå€åæãšãâŠïŒã¯æã«è§ŠããŠäœåºŠãäœåºŠãå£ã«ããããã«ããŠããŸãã ïŒåïŒãCLINICS ã® QAããšã¯ïŒ åé ã§åŒçšãã Magic Pod å°å
¥ã®èšäº ã§ã¯ãããã¹ãã®èªååã¯ïŒãªãªãŒã¹åŸå³åº§ã«ä¿®æ£ã§ããªãïŒã¢ããªããçæããŠãããæ¹éãšããŸããã çŸåšã¯ãCLINICS ã® Web ããŒãžåŽã®ãã¹ãèªååãæšé²ããŠããŸãã ãã¹ãèªååã®ç®çã¯çŸå Žã«ãã£ãŠãããããšæãããããã®ã§ãããªãããã¹ãèªååãããã®ãïŒãã«ã€ããŠã¯ãæ©æ¢°ã«ãªã°ã¬ãã·ã§ã³ãã¹ããä»»ããŠæã空ããåãããé«åºŠãªïŒçµéšåãå¿
èŠãªïŒæ¢çŽ¢çãã¹ããã§ããããã«ãªãããããšèããŠããŸãã æåã®åãã«æ»ããŸãã ãCLINICS ã® QAããšã¯äœãïŒ å質åäžããä»çµã¿ãèªç¶ã«ã§ããŠããèªåŸããçµç¹ã§ãç§ã¯éçºããŒã ã¡ã³ããŒãšãããããããã¹ãããæ¥œãããã¹ãããããŠããããããšæã£ãŠããŸãã ããã«ãã£ãŠé¡§å®¢ãåºäŒãå¯èœæ§ã®ããäžå
·åãæžãããããããå質ã®é«ããããã¯ããã€ããããšãã§ãããšããäžçãã«è¿ã¥ããã®ã§ã¯ãªãããªããšèããŠããŸãã ãããããããã¹ãããæ¥œãããã¹ãããšã¯çºèŠã§ãããåŠç¿ã§ããããã£ãŒãããã¯ã®ãµã€ã¯ã«ã«ãã£ãŠçãŸããŸãã ãã®ããã«ãåè¿°ã®ãããã»ã¹æ¹åããšãç¥èã®åºäžããã¯äž¡èŒªã§é²ããŠããå¿
èŠããããŸãã å質åäžã®ããã®ææ®µã¯ããã¹ãã®ä»ã«ãå®ã«å€å²ã«æž¡ããŸãã é·å¹Žãã£ãŠããç§ããŸã å
šè²ãæŽã¿åããŠããªããQA ã®ãšã³ãžãã¢ãªã³ã°ãã£ãŠãããªã«å¥¥æ·±ã楜ããïŒããšããããšãéçºããŒã ã¡ã³ããŒã®å
±éèªèã«ãªããšããããã§ãã æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
äºæ¥æ¬éš ãããã¯ãéçºå®€ã®ãšã³ãžãã¢ã®äžçã§ãã ãªã³ã©ã€ã³èšºçã»æè¬æå°ã»ã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSã ã®éçºã»åºç€åšããæ
åœããŠãããŸãã ä»åã¯ãHTTP ã®ã³ã³ãã³ãå§çž®ã«ã€ããŠèª¿æ»ã»å¯Ÿå¿ããæ©äŒããã£ãã®ã§ãæ¬ããã°ã«ãŠç޹ä»ããããšæããŸãã HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ãHTTP ã®éä¿¡ã«ãã㊠Web ãµãŒããŒåŽãè¿ãããŒã¿ãããªãããã®åœ¢åŒã§å§çž®ããŠã¯ã©ã€ã¢ã³ãã«è¿ãããšã§ããå§çž®ãããã¬ã¹ãã³ã¹ãã¯ã©ã€ã¢ã³ãåŽã¯è§£åããŠå©çšããŸãã HTTP ã³ã³ãã³ãã®å§çž®ã«ãã£ãŠåŸãããã¡ãªããã»ãã¡ãªããã¯ä»¥äžã®éãã§ãã ‎ ã¡ãªãã éä¿¡ã®åž¯å䜿çšéãæžããã ããã«ãã£ãŠéä¿¡ã«ãããæéãåæžãã ããŒãžè¡šç€ºé床ãåäž ã§ãã ‵ ãã¡ãªãã å§çž®ã»è§£åã³ã¹ããããã ãã ããå§çž®ã»è§£åã³ã¹ãã¯ã»ãšãã©ã®å Žåã¯å°ãããããã¡ãªãããäžåã 倧容éãã¡ã€ã«ãããšããšå§çž®ãããŠãããã¡ã€ã«ïŒç»åãåç»ãPDF ãã¡ã€ã«ãªã©ïŒãå§çž®ããã®ã¯ãå§çž®ããŠããµã€ãºãããã»ã©å°ãããªããªãããéå¹çã§ãã ãµã€ãºãããŸãåæžã§ããªãå²ã«ãå§çž®ã»è§£åã« CPU ãªãœãŒã¹ã䜿ããæ°çŸ MB ãè¶
ãããã¡ã€ã«ã«ãªããšããããæ°ç§ãããããšããã HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ãã¯ã©ã€ã¢ã³ããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããå¿
èŠããããŸããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããã«ã¯ããªã¯ãšã¹ããããã« Accept-Encoding ããããæå®ããŸãã æè¿ã®ãã©ãŠã¶ã§ã¯ãHTTP ãªã¯ãšã¹ãæã«èªåçã« Accept-Encoding ããããèªåçã«ä»å ããŠã¢ã¯ã»ã¹ããŠããã®ã§ããã©ãŠã¶çµç±ã®å Žåã¯ç¹ã«æç€ºçã«æå®ããå¿
èŠã¯ãããŸãããChrome, Safari, Edge ãªã©ãã»ãšãã©ã®ã¡ãžã£ãŒãªãã©ãŠã¶ã§ã¯ Accept-Encoding: gzip, deflate, br ãæå®ãããŠããŸã(â»2021-01-23 æç¹)ã å§çž®åœ¢åŒ(gzip, deflate, br) å§çž®åœ¢åŒã¯ããã€ããããŸããããã©ãŠã¶ãå©çšããå Žåã¯ä»¥äžã®ãããããéžæè¢ã«ãªããŸãã gzip: LZ77 ãš 32 ããã CR ãçšããå§çž®åœ¢åŒ deflate: zlib æ§é äœãš deflate å§çž®ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒ br: Brotli ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒãgzip ã«è¿ãã倧容éã®èšèªèŸæžãçšããŠãé »åºãããã¿ãŒã³ã®åèªãå§çž®ããŠå¹çåããã®ããæç« çãªããã¹ãã§ã¯ gzip ãããå§çž®çãé«ã ãšèšããã Brotli ã¯æ¯èŒçæ°ãã圢åŒã§ãã»ãšãã©ã®ãµãŒããŒããã©ãŠã¶ã§å¯Ÿå¿ããŠããŸãã ãµãŒããŒã§ã® HTTP ã³ã³ãã³ãã®å§çž®æ¹æ³(gzip) ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã® Accept-Encoding ãªã¯ãšã¹ãããããåãåãããã®äžãã 1 ã€ãéžæããŠå§çž®åŠçãè¡ãã Content-Encoding ã¬ã¹ãã³ã¹ããããä»å ããŠã¯ã©ã€ã¢ã³ãã«çµæãç¥ãããŸãã CLINICS ãå©çšããŠããããããã®ã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã«çµã£ãŠãã©ã®ããã« HTTP ã³ã³ãã³ãå§çž®ãå®çŸããŠããã解説ããããšæããŸããããã€ãå§çž®åœ¢åŒã¯ãããŸãããããã§ã¯ gzip 圢åŒã§ã®å§çž®æ¹æ³ã«ã€ããŠè§£èª¬ããŸãã NGINX NGINX ã® ngx_http_gzip_module ãå©çšããããšã§ gzip å§çž®ããããšãã§ããŸãã nginx.conf ã® gzip ãã£ã¬ã¯ãã£ãã on ã«ããããšã§å§çž®ãæå¹ã«ãªããŸãããã ããã¿ã€ããæå®ããªããš Content-Type: text/html ã®ãšãã«ããå§çž®ãããŸãããä»ã®ã¿ã€ãã§ãå§çž®ããããšã㯠gzip_types ãã£ã¬ã¯ãã£ããåãããŠæå®ããå¿
èŠããããŸãã gzip_types ã« * ãæå®ããããšã§ããã¹ãŠã®ã³ã³ãã³ããå§çž®ããããšãã§ããŸãã gzip: on; gzip_types: text/css application/javascript application/json ãŸããCloudFront ãªã© Proxy ãçµç±ããŠã®ã¢ã¯ã»ã¹ã®å Žåã¯ããã©ã«ãã§ã¯è¡ãããŸãããProxy çµç±ã®ã¢ã¯ã»ã¹ãã©ããã¯ããªã¯ãšã¹ããããã« Via ãããããããã©ããã§å€å®ããŸãã CloudFront çµç±ã§ã®ã¢ã¯ã»ã¹ã®å Žå㯠Via: 1.1 xxxxx.cloudfront.net (CloudFront) ã®ããã« Via ããããä»å ãããŠãããããNGINX ã«ãŠ Proxy çµç±ã§ãããšå€å®ããŸããProxy çµç±ã§ãã£ãŠãäœãããã®æ¡ä»¶ã§å§çž®ãããå Žå㯠gzip_proxied ãã£ã¬ã¯ãã£ããæå®ããå¿
èŠããããŸãã ref. https://nginx.org/en/docs/http/ngx_http_gzip_module.html CloudFront CloudFront ã® Behavior ã®èšå®ã«ãŠèšå®ããŸããCompress Objects Automatically ãæå¹åããããšã§ãgzip å§çž®ãæå¹ã«ãªããŸãã äžèšãæå¹åãããšãCloudFront ã§ã¯ä»¥äžã®æ¡ä»¶ã§å§çž®ãè¡ãããŸãã ãã¡ã€ã«ãµã€ãºã 1,000(â1KB) ã 10,000,000(â10MB) ãã€ãã®é ãã£ãŠããªãªãžã³ãããã¡ã€ã«ãµã€ãºãå€å®ããããã® Content-Length ããããä»äžãããŠããªãå Žåã¯ããµã€ãºå€å¥ã§ããªãããå§çž®ãããªã ç¹å®ã® Content-Type ã®ã³ã³ãã³ããå§çž®ãã ããã¹ãç³»ã®ã³ã³ãã³ãã¯å§çž®ããããç»åãåç»ãPDF ãªã©ãããšããšå§çž®ãããŠãããã®ã¯å¯Ÿè±¡å€ã詳ãã㯠ãã¡ã ãªãªãžã³åŽïŒNGINX ã Rails ãªã©ïŒããå§çž®ããŠè¿ãããå Žåã¯ã å床å§çž®ã¯è¡ããªã Content-Encoding ãããã®æç¡ã§å€å®ããŠãã ref. https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html Rails Rails ã¯ããã©ã«ãã§ã¯ HTTP ã³ã³ãã³ãã®å§çž®ã¯è¡ããŸãããRails ã§ã³ã³ãã³ãå§çž®ãè¡ãããå Žåã¯ãRails ã® Rack Middleware ã® Rack::Deflater ãå°å
¥ããã®ãç°¡åã§ããããããªãããRack::Deflater ã¯ãã¹ãŠã® Content-Type ã®ã³ã³ãã³ãã§ãå§çž®ããã®ã§ãç»åãåç»ã» PDF ãªã©å§çž®ããã¹ãã§ãªãã³ã³ãã³ããŸã§å§çž®ããŠããŸããŸããNGINX ã CloudFront ãªã©ãRails å€ã®ä»ã®ãµãŒãã¹ãããã«ãŠã§ã¢ã«ä»»ããã®ãè¯ããšæããŸãã CLINICS ã§ã® HTTP ã³ã³ãã³ãå§çž®ã®ã·ãŒã±ã³ã¹ åç« ã§è§£èª¬ããã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã¯ãCLINICS ã§ã¯ä»¥äžã®ããã«é£æºããŠããŸãã AWS äžã« Rails ã¢ããªã±ãŒã·ã§ã³ããããã€ããŠãããéåžžã®ã¢ã¯ã»ã¹ã¯ããŒããã©ã³ãµãŒãã NGINX ãçµç±ã㊠Rails ã«ã¢ã¯ã»ã¹ããéçãã¡ã€ã«ãªã©ãã£ãã·ã¥ã³ã³ãã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããŠããŸãã CLINICS ã§ã¯çšéã«åãããå§çž®ãè¡ã£ãŠããŸãã3 ã€ã®ã±ãŒã¹ã玹ä»ããŸãã 1. NGINX çµç±ã§ Rails ã«ã¢ã¯ã»ã¹ããæ API ã¢ã¯ã»ã¹ãªã©ã¯äžèšã·ãŒã±ã³ã¹ã§ã¢ã¯ã»ã¹ããŠããŸããã»ãšãã©ã text/html ã application/json 圢åŒã®ã³ã³ãã³ããšãªããNGINX ã«ãŠ gzip å§çž®åŠçãè¡ã£ãŠããŸããRails ã¯ã¢ããªã±ãŒã·ã§ã³ã®åŠçã®ã¿ãè¡ããå§çž®ã¯è¡ããªãããã«ããŠããŸãã 2. CloudFront çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ ç»åãã¡ã€ã«ã PDFãéç㪠jsãcss ãã¡ã€ã«ãªã©ã¯ãµãŒãã¹ã®ãããã€æã« S3 ã«ã¢ããããŒãããŠããŸããã¯ã©ã€ã¢ã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããS3 ããååŸããŠãCloudFront ã§ gzip ã«å§çž®åŠçãè¡ã£ãŠããŸãããŸããäžå®æé CloudFront äžã«ãã£ãã·ã¥ãããã®ã§ãå¹çããå§çž®ã³ã³ãã³ããè¿ããŸãã 3. CloudFrontâNGINXâRails çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ éçãã¡ã€ã«ã®äžã§ãã·ã°ããã£ããã§ãã¯ããŠãããã®ã¯ããã®ãããŒã§ã¢ã¯ã»ã¹ããŠããŸããNGINX ã§ãå§çž®èšå®ã ON ã«ããŠããŸããã Via ãããããããããNGINX ã§ã¯å§çž®ããªãããã«ãªã£ãŠããŸãã ãŸãšã HTTP ã³ã³ãã³ãã®å§çž®ãé©åã«è¡ãããšã§ããµãŒãã¹å
šäœã®ããã©ãŒãã³ã¹åäžãèŠèŸŒããŸããæŽã« CloudFront ãæŽ»çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ãããã«ãŠã§ã¢ã§ã®å§çž®åŠçããªãããæŽãªãããã©ãŒãã³ã¹åäžãèŠèŸŒããŸãã ä»å㯠HTTP ã³ã³ãã³ãã® gzip å§çž®ã«ã€ããŠã®ã¿è§ŠããŸããããBrotli å§çž®ã«ã€ããŠã NGINXãCloudFront ãšãã«å¯èœãªãããä»åŸåãå
¥ããŠãããããšèããŠããŸãããã HTTP ã³ã³ãã³ãã®å§çž®èšå®ãç¹ã«æ°ã«ããããšããªãæ¹ã¯äžåºŠç¢ºèªããŠã¿ãŠã¯ãããã§ããããïŒ æåŸã« ã¡ãã¬ãŒã§ã¯ãå»çåéã®ç€ŸäŒèª²é¡ã IT ã«ãŠè§£æ±ºããããã«æ¥ã
éé²ããŠããŸããå»çãšããåéã«ãããŠã¯ãæ©åŸ®ãªæ
å ±ãæ±ã£ãã蚺çãæ¢ããªãããã«ããããã«ãããã©ãŒãã³ã¹ã»ã»ãã¥ãªãã£å
±ã«é«ããµãŒãã¹ã¬ãã«ãæ±ããããŸããèå³ãæã£ãæ¹ãããã£ããããŸãããããŸãã¯æ°è»œã«é¢è«ã§ããã°ãšæããŸãã®ã§ãæ¯éãå¿åãã ããïŒ æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
äºæ¥æ¬éš ãããã¯ãéçºå®€ã®ãšã³ãžãã¢ã®äžçã§ãã ãªã³ã©ã€ã³èšºçã»æè¬æå°ã»ã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSã ã®éçºã»åºç€åšããæ
åœããŠãããŸãã ä»åã¯ãHTTP ã®ã³ã³ãã³ãå§çž®ã«ã€ããŠèª¿æ»ã»å¯Ÿå¿ããæ©äŒããã£ãã®ã§ãæ¬ããã°ã«ãŠç޹ä»ããããšæããŸãã HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ãHTTP ã®éä¿¡ã«ãã㊠Web ãµãŒããŒåŽãè¿ãããŒã¿ãããªãããã®åœ¢åŒã§å§çž®ããŠã¯ã©ã€ã¢ã³ãã«è¿ãããšã§ããå§çž®ãããã¬ã¹ãã³ã¹ãã¯ã©ã€ã¢ã³ãåŽã¯è§£åããŠå©çšããŸãã HTTP ã³ã³ãã³ãã®å§çž®ã«ãã£ãŠåŸãããã¡ãªããã»ãã¡ãªããã¯ä»¥äžã®éãã§ãã ‎ ã¡ãªãã éä¿¡ã®åž¯å䜿çšéãæžããã ããã«ãã£ãŠéä¿¡ã«ãããæéãåæžãã ããŒãžè¡šç€ºé床ãåäž ã§ãã ‵ ãã¡ãªãã å§çž®ã»è§£åã³ã¹ããããã ãã ããå§çž®ã»è§£åã³ã¹ãã¯ã»ãšãã©ã®å Žåã¯å°ãããããã¡ãªãããäžåã 倧容éãã¡ã€ã«ãããšããšå§çž®ãããŠãããã¡ã€ã«ïŒç»åãåç»ãPDF ãã¡ã€ã«ãªã©ïŒãå§çž®ããã®ã¯ãå§çž®ããŠããµã€ãºãããã»ã©å°ãããªããªãããéå¹çã§ãã ãµã€ãºãããŸãåæžã§ããªãå²ã«ãå§çž®ã»è§£åã« CPU ãªãœãŒã¹ã䜿ããæ°çŸ MB ãè¶
ãããã¡ã€ã«ã«ãªããšããããæ°ç§ãããããšããã HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ãã¯ã©ã€ã¢ã³ããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããå¿
èŠããããŸããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããã«ã¯ããªã¯ãšã¹ããããã« Accept-Encoding ããããæå®ããŸãã æè¿ã®ãã©ãŠã¶ã§ã¯ãHTTP ãªã¯ãšã¹ãæã«èªåçã« Accept-Encoding ããããèªåçã«ä»å ããŠã¢ã¯ã»ã¹ããŠããã®ã§ããã©ãŠã¶çµç±ã®å Žåã¯ç¹ã«æç€ºçã«æå®ããå¿
èŠã¯ãããŸãããChrome, Safari, Edge ãªã©ãã»ãšãã©ã®ã¡ãžã£ãŒãªãã©ãŠã¶ã§ã¯ Accept-Encoding: gzip, deflate, br ãæå®ãããŠããŸã(â»2021-01-23 æç¹)ã å§çž®åœ¢åŒ(gzip, deflate, br) å§çž®åœ¢åŒã¯ããã€ããããŸããããã©ãŠã¶ãå©çšããå Žåã¯ä»¥äžã®ãããããéžæè¢ã«ãªããŸãã gzip: LZ77 ãš 32 ããã CR ãçšããå§çž®åœ¢åŒ deflate: zlib æ§é äœãš deflate å§çž®ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒ br: Brotli ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒãgzip ã«è¿ãã倧容éã®èšèªèŸæžãçšããŠãé »åºãããã¿ãŒã³ã®åèªãå§çž®ããŠå¹çåããã®ããæç« çãªããã¹ãã§ã¯ gzip ãããå§çž®çãé«ã ãšèšããã Brotli ã¯æ¯èŒçæ°ãã圢åŒã§ãã»ãšãã©ã®ãµãŒããŒããã©ãŠã¶ã§å¯Ÿå¿ããŠããŸãã ãµãŒããŒã§ã® HTTP ã³ã³ãã³ãã®å§çž®æ¹æ³(gzip) ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã® Accept-Encoding ãªã¯ãšã¹ãããããåãåãããã®äžãã 1 ã€ãéžæããŠå§çž®åŠçãè¡ãã Content-Encoding ã¬ã¹ãã³ã¹ããããä»å ããŠã¯ã©ã€ã¢ã³ãã«çµæãç¥ãããŸãã CLINICS ãå©çšããŠããããããã®ã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã«çµã£ãŠãã©ã®ããã« HTTP ã³ã³ãã³ãå§çž®ãå®çŸããŠããã解説ããããšæããŸããããã€ãå§çž®åœ¢åŒã¯ãããŸãããããã§ã¯ gzip 圢åŒã§ã®å§çž®æ¹æ³ã«ã€ããŠè§£èª¬ããŸãã NGINX NGINX ã® ngx_http_gzip_module ãå©çšããããšã§ gzip å§çž®ããããšãã§ããŸãã nginx.conf ã® gzip ãã£ã¬ã¯ãã£ãã on ã«ããããšã§å§çž®ãæå¹ã«ãªããŸãããã ããã¿ã€ããæå®ããªããš Content-Type: text/html ã®ãšãã«ããå§çž®ãããŸãããä»ã®ã¿ã€ãã§ãå§çž®ããããšã㯠gzip_types ãã£ã¬ã¯ãã£ããåãããŠæå®ããå¿
èŠããããŸãã gzip_types ã« * ãæå®ããããšã§ããã¹ãŠã®ã³ã³ãã³ããå§çž®ããããšãã§ããŸãã gzip: on; gzip_types: text/css application/javascript application/json ãŸããCloudFront ãªã© Proxy ãçµç±ããŠã®ã¢ã¯ã»ã¹ã®å Žåã¯ããã©ã«ãã§ã¯è¡ãããŸãããProxy çµç±ã®ã¢ã¯ã»ã¹ãã©ããã¯ããªã¯ãšã¹ããããã« Via ãããããããã©ããã§å€å®ããŸãã CloudFront çµç±ã§ã®ã¢ã¯ã»ã¹ã®å Žå㯠Via: 1.1 xxxxx.cloudfront.net (CloudFront) ã®ããã« Via ããããä»å ãããŠãããããNGINX ã«ãŠ Proxy çµç±ã§ãããšå€å®ããŸããProxy çµç±ã§ãã£ãŠãäœãããã®æ¡ä»¶ã§å§çž®ãããå Žå㯠gzip_proxied ãã£ã¬ã¯ãã£ããæå®ããå¿
èŠããããŸãã ref. https://nginx.org/en/docs/http/ngx_http_gzip_module.html CloudFront CloudFront ã® Behavior ã®èšå®ã«ãŠèšå®ããŸããCompress Objects Automatically ãæå¹åããããšã§ãgzip å§çž®ãæå¹ã«ãªããŸãã äžèšãæå¹åãããšãCloudFront ã§ã¯ä»¥äžã®æ¡ä»¶ã§å§çž®ãè¡ãããŸãã ãã¡ã€ã«ãµã€ãºã 1,000(â1KB) ã 10,000,000(â10MB) ãã€ãã®é ãã£ãŠããªãªãžã³ãããã¡ã€ã«ãµã€ãºãå€å®ããããã® Content-Length ããããä»äžãããŠããªãå Žåã¯ããµã€ãºå€å¥ã§ããªãããå§çž®ãããªã ç¹å®ã® Content-Type ã®ã³ã³ãã³ããå§çž®ãã ããã¹ãç³»ã®ã³ã³ãã³ãã¯å§çž®ããããç»åãåç»ãPDF ãªã©ãããšããšå§çž®ãããŠãããã®ã¯å¯Ÿè±¡å€ã詳ãã㯠ãã¡ã ãªãªãžã³åŽïŒNGINX ã Rails ãªã©ïŒããå§çž®ããŠè¿ãããå Žåã¯ã å床å§çž®ã¯è¡ããªã Content-Encoding ãããã®æç¡ã§å€å®ããŠãã ref. https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html Rails Rails ã¯ããã©ã«ãã§ã¯ HTTP ã³ã³ãã³ãã®å§çž®ã¯è¡ããŸãããRails ã§ã³ã³ãã³ãå§çž®ãè¡ãããå Žåã¯ãRails ã® Rack Middleware ã® Rack::Deflater ãå°å
¥ããã®ãç°¡åã§ããããããªãããRack::Deflater ã¯ãã¹ãŠã® Content-Type ã®ã³ã³ãã³ãã§ãå§çž®ããã®ã§ãç»åãåç»ã» PDF ãªã©å§çž®ããã¹ãã§ãªãã³ã³ãã³ããŸã§å§çž®ããŠããŸããŸããNGINX ã CloudFront ãªã©ãRails å€ã®ä»ã®ãµãŒãã¹ãããã«ãŠã§ã¢ã«ä»»ããã®ãè¯ããšæããŸãã CLINICS ã§ã® HTTP ã³ã³ãã³ãå§çž®ã®ã·ãŒã±ã³ã¹ åç« ã§è§£èª¬ããã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã¯ãCLINICS ã§ã¯ä»¥äžã®ããã«é£æºããŠããŸãã AWS äžã« Rails ã¢ããªã±ãŒã·ã§ã³ããããã€ããŠãããéåžžã®ã¢ã¯ã»ã¹ã¯ããŒããã©ã³ãµãŒãã NGINX ãçµç±ã㊠Rails ã«ã¢ã¯ã»ã¹ããéçãã¡ã€ã«ãªã©ãã£ãã·ã¥ã³ã³ãã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããŠããŸãã CLINICS ã§ã¯çšéã«åãããå§çž®ãè¡ã£ãŠããŸãã3 ã€ã®ã±ãŒã¹ã玹ä»ããŸãã 1. NGINX çµç±ã§ Rails ã«ã¢ã¯ã»ã¹ããæ API ã¢ã¯ã»ã¹ãªã©ã¯äžèšã·ãŒã±ã³ã¹ã§ã¢ã¯ã»ã¹ããŠããŸããã»ãšãã©ã text/html ã application/json 圢åŒã®ã³ã³ãã³ããšãªããNGINX ã«ãŠ gzip å§çž®åŠçãè¡ã£ãŠããŸããRails ã¯ã¢ããªã±ãŒã·ã§ã³ã®åŠçã®ã¿ãè¡ããå§çž®ã¯è¡ããªãããã«ããŠããŸãã 2. CloudFront çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ ç»åãã¡ã€ã«ã PDFãéç㪠jsãcss ãã¡ã€ã«ãªã©ã¯ãµãŒãã¹ã®ãããã€æã« S3 ã«ã¢ããããŒãããŠããŸããã¯ã©ã€ã¢ã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããS3 ããååŸããŠãCloudFront ã§ gzip ã«å§çž®åŠçãè¡ã£ãŠããŸãããŸããäžå®æé CloudFront äžã«ãã£ãã·ã¥ãããã®ã§ãå¹çããå§çž®ã³ã³ãã³ããè¿ããŸãã 3. CloudFrontâNGINXâRails çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ éçãã¡ã€ã«ã®äžã§ãã·ã°ããã£ããã§ãã¯ããŠãããã®ã¯ããã®ãããŒã§ã¢ã¯ã»ã¹ããŠããŸããNGINX ã§ãå§çž®èšå®ã ON ã«ããŠããŸããã Via ãããããããããNGINX ã§ã¯å§çž®ããªãããã«ãªã£ãŠããŸãã ãŸãšã HTTP ã³ã³ãã³ãã®å§çž®ãé©åã«è¡ãããšã§ããµãŒãã¹å
šäœã®ããã©ãŒãã³ã¹åäžãèŠèŸŒããŸããæŽã« CloudFront ãæŽ»çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ãããã«ãŠã§ã¢ã§ã®å§çž®åŠçããªãããæŽãªãããã©ãŒãã³ã¹åäžãèŠèŸŒããŸãã ä»å㯠HTTP ã³ã³ãã³ãã® gzip å§çž®ã«ã€ããŠã®ã¿è§ŠããŸããããBrotli å§çž®ã«ã€ããŠã NGINXãCloudFront ãšãã«å¯èœãªãããä»åŸåãå
¥ããŠãããããšèããŠããŸãããã HTTP ã³ã³ãã³ãã®å§çž®èšå®ãç¹ã«æ°ã«ããããšããªãæ¹ã¯äžåºŠç¢ºèªããŠã¿ãŠã¯ãããã§ããããïŒ æåŸã« ã¡ãã¬ãŒã§ã¯ãå»çåéã®ç€ŸäŒèª²é¡ã IT ã«ãŠè§£æ±ºããããã«æ¥ã
éé²ããŠããŸããå»çãšããåéã«ãããŠã¯ãæ©åŸ®ãªæ
å ±ãæ±ã£ãã蚺çãæ¢ããªãããã«ããããã«ãããã©ãŒãã³ã¹ã»ã»ãã¥ãªãã£å
±ã«é«ããµãŒãã¹ã¬ãã«ãæ±ããããŸããèå³ãæã£ãæ¹ãããã£ããããŸãããããŸãã¯æ°è»œã«é¢è«ã§ããã°ãšæããŸãã®ã§ãæ¯éãå¿åãã ããïŒ æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
äºæ¥æ¬éš ãããã¯ãéçºå®€ã®ãšã³ãžãã¢ã®äžçã§ãã ãªã³ã©ã€ã³èšºçã»æè¬æå°ã»ã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSã ã®éçºã»åºç€åšããæ
åœããŠãããŸãã ä»åã¯ãHTTP ã®ã³ã³ãã³ãå§çž®ã«ã€ããŠèª¿æ»ã»å¯Ÿå¿ããæ©äŒããã£ãã®ã§ãæ¬ããã°ã«ãŠç޹ä»ããããšæããŸãã HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ãHTTP ã®éä¿¡ã«ãã㊠Web ãµãŒããŒåŽãè¿ãããŒã¿ãããªãããã®åœ¢åŒã§å§çž®ããŠã¯ã©ã€ã¢ã³ãã«è¿ãããšã§ããå§çž®ãããã¬ã¹ãã³ã¹ãã¯ã©ã€ã¢ã³ãåŽã¯è§£åããŠå©çšããŸãã HTTP ã³ã³ãã³ãã®å§çž®ã«ãã£ãŠåŸãããã¡ãªããã»ãã¡ãªããã¯ä»¥äžã®éãã§ãã ‎ ã¡ãªãã éä¿¡ã®åž¯å䜿çšéãæžããã ããã«ãã£ãŠéä¿¡ã«ãããæéãåæžãã ããŒãžè¡šç€ºé床ãåäž ã§ãã ‵ ãã¡ãªãã å§çž®ã»è§£åã³ã¹ããããã ãã ããå§çž®ã»è§£åã³ã¹ãã¯ã»ãšãã©ã®å Žåã¯å°ãããããã¡ãªãããäžåã 倧容éãã¡ã€ã«ãããšããšå§çž®ãããŠãããã¡ã€ã«ïŒç»åãåç»ãPDF ãã¡ã€ã«ãªã©ïŒãå§çž®ããã®ã¯ãå§çž®ããŠããµã€ãºãããã»ã©å°ãããªããªãããéå¹çã§ãã ãµã€ãºãããŸãåæžã§ããªãå²ã«ãå§çž®ã»è§£åã« CPU ãªãœãŒã¹ã䜿ããæ°çŸ MB ãè¶
ãããã¡ã€ã«ã«ãªããšããããæ°ç§ãããããšããã HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ãã¯ã©ã€ã¢ã³ããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããå¿
èŠããããŸããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããã«ã¯ããªã¯ãšã¹ããããã« Accept-Encoding ããããæå®ããŸãã æè¿ã®ãã©ãŠã¶ã§ã¯ãHTTP ãªã¯ãšã¹ãæã«èªåçã« Accept-Encoding ããããèªåçã«ä»å ããŠã¢ã¯ã»ã¹ããŠããã®ã§ããã©ãŠã¶çµç±ã®å Žåã¯ç¹ã«æç€ºçã«æå®ããå¿
èŠã¯ãããŸãããChrome, Safari, Edge ãªã©ãã»ãšãã©ã®ã¡ãžã£ãŒãªãã©ãŠã¶ã§ã¯ Accept-Encoding: gzip, deflate, br ãæå®ãããŠããŸã(â»2021-01-23 æç¹)ã å§çž®åœ¢åŒ(gzip, deflate, br) å§çž®åœ¢åŒã¯ããã€ããããŸããããã©ãŠã¶ãå©çšããå Žåã¯ä»¥äžã®ãããããéžæè¢ã«ãªããŸãã gzip: LZ77 ãš 32 ããã CR ãçšããå§çž®åœ¢åŒ deflate: zlib æ§é äœãš deflate å§çž®ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒ br: Brotli ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒãgzip ã«è¿ãã倧容éã®èšèªèŸæžãçšããŠãé »åºãããã¿ãŒã³ã®åèªãå§çž®ããŠå¹çåããã®ããæç« çãªããã¹ãã§ã¯ gzip ãããå§çž®çãé«ã ãšèšããã Brotli ã¯æ¯èŒçæ°ãã圢åŒã§ãã»ãšãã©ã®ãµãŒããŒããã©ãŠã¶ã§å¯Ÿå¿ããŠããŸãã ãµãŒããŒã§ã® HTTP ã³ã³ãã³ãã®å§çž®æ¹æ³(gzip) ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã® Accept-Encoding ãªã¯ãšã¹ãããããåãåãããã®äžãã 1 ã€ãéžæããŠå§çž®åŠçãè¡ãã Content-Encoding ã¬ã¹ãã³ã¹ããããä»å ããŠã¯ã©ã€ã¢ã³ãã«çµæãç¥ãããŸãã CLINICS ãå©çšããŠããããããã®ã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã«çµã£ãŠãã©ã®ããã« HTTP ã³ã³ãã³ãå§çž®ãå®çŸããŠããã解説ããããšæããŸããããã€ãå§çž®åœ¢åŒã¯ãããŸãããããã§ã¯ gzip 圢åŒã§ã®å§çž®æ¹æ³ã«ã€ããŠè§£èª¬ããŸãã NGINX NGINX ã® ngx_http_gzip_module ãå©çšããããšã§ gzip å§çž®ããããšãã§ããŸãã nginx.conf ã® gzip ãã£ã¬ã¯ãã£ãã on ã«ããããšã§å§çž®ãæå¹ã«ãªããŸãããã ããã¿ã€ããæå®ããªããš Content-Type: text/html ã®ãšãã«ããå§çž®ãããŸãããä»ã®ã¿ã€ãã§ãå§çž®ããããšã㯠gzip_types ãã£ã¬ã¯ãã£ããåãããŠæå®ããå¿
èŠããããŸãã gzip_types ã« * ãæå®ããããšã§ããã¹ãŠã®ã³ã³ãã³ããå§çž®ããããšãã§ããŸãã gzip: on; gzip_types: text/css application/javascript application/json ãŸããCloudFront ãªã© Proxy ãçµç±ããŠã®ã¢ã¯ã»ã¹ã®å Žåã¯ããã©ã«ãã§ã¯è¡ãããŸãããProxy çµç±ã®ã¢ã¯ã»ã¹ãã©ããã¯ããªã¯ãšã¹ããããã« Via ãããããããã©ããã§å€å®ããŸãã CloudFront çµç±ã§ã®ã¢ã¯ã»ã¹ã®å Žå㯠Via: 1.1 xxxxx.cloudfront.net (CloudFront) ã®ããã« Via ããããä»å ãããŠãããããNGINX ã«ãŠ Proxy çµç±ã§ãããšå€å®ããŸããProxy çµç±ã§ãã£ãŠãäœãããã®æ¡ä»¶ã§å§çž®ãããå Žå㯠gzip_proxied ãã£ã¬ã¯ãã£ããæå®ããå¿
èŠããããŸãã ref. https://nginx.org/en/docs/http/ngx_http_gzip_module.html CloudFront CloudFront ã® Behavior ã®èšå®ã«ãŠèšå®ããŸããCompress Objects Automatically ãæå¹åããããšã§ãgzip å§çž®ãæå¹ã«ãªããŸãã äžèšãæå¹åãããšãCloudFront ã§ã¯ä»¥äžã®æ¡ä»¶ã§å§çž®ãè¡ãããŸãã ãã¡ã€ã«ãµã€ãºã 1,000(â1KB) ã 10,000,000(â10MB) ãã€ãã®é ãã£ãŠããªãªãžã³ãããã¡ã€ã«ãµã€ãºãå€å®ããããã® Content-Length ããããä»äžãããŠããªãå Žåã¯ããµã€ãºå€å¥ã§ããªãããå§çž®ãããªã ç¹å®ã® Content-Type ã®ã³ã³ãã³ããå§çž®ãã ããã¹ãç³»ã®ã³ã³ãã³ãã¯å§çž®ããããç»åãåç»ãPDF ãªã©ãããšããšå§çž®ãããŠãããã®ã¯å¯Ÿè±¡å€ã詳ãã㯠ãã¡ã ãªãªãžã³åŽïŒNGINX ã Rails ãªã©ïŒããå§çž®ããŠè¿ãããå Žåã¯ã å床å§çž®ã¯è¡ããªã Content-Encoding ãããã®æç¡ã§å€å®ããŠãã ref. https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html Rails Rails ã¯ããã©ã«ãã§ã¯ HTTP ã³ã³ãã³ãã®å§çž®ã¯è¡ããŸãããRails ã§ã³ã³ãã³ãå§çž®ãè¡ãããå Žåã¯ãRails ã® Rack Middleware ã® Rack::Deflater ãå°å
¥ããã®ãç°¡åã§ããããããªãããRack::Deflater ã¯ãã¹ãŠã® Content-Type ã®ã³ã³ãã³ãã§ãå§çž®ããã®ã§ãç»åãåç»ã» PDF ãªã©å§çž®ããã¹ãã§ãªãã³ã³ãã³ããŸã§å§çž®ããŠããŸããŸããNGINX ã CloudFront ãªã©ãRails å€ã®ä»ã®ãµãŒãã¹ãããã«ãŠã§ã¢ã«ä»»ããã®ãè¯ããšæããŸãã CLINICS ã§ã® HTTP ã³ã³ãã³ãå§çž®ã®ã·ãŒã±ã³ã¹ åç« ã§è§£èª¬ããã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã¯ãCLINICS ã§ã¯ä»¥äžã®ããã«é£æºããŠããŸãã AWS äžã« Rails ã¢ããªã±ãŒã·ã§ã³ããããã€ããŠãããéåžžã®ã¢ã¯ã»ã¹ã¯ããŒããã©ã³ãµãŒãã NGINX ãçµç±ã㊠Rails ã«ã¢ã¯ã»ã¹ããéçãã¡ã€ã«ãªã©ãã£ãã·ã¥ã³ã³ãã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããŠããŸãã CLINICS ã§ã¯çšéã«åãããå§çž®ãè¡ã£ãŠããŸãã3 ã€ã®ã±ãŒã¹ã玹ä»ããŸãã 1. NGINX çµç±ã§ Rails ã«ã¢ã¯ã»ã¹ããæ API ã¢ã¯ã»ã¹ãªã©ã¯äžèšã·ãŒã±ã³ã¹ã§ã¢ã¯ã»ã¹ããŠããŸããã»ãšãã©ã text/html ã application/json 圢åŒã®ã³ã³ãã³ããšãªããNGINX ã«ãŠ gzip å§çž®åŠçãè¡ã£ãŠããŸããRails ã¯ã¢ããªã±ãŒã·ã§ã³ã®åŠçã®ã¿ãè¡ããå§çž®ã¯è¡ããªãããã«ããŠããŸãã 2. CloudFront çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ ç»åãã¡ã€ã«ã PDFãéç㪠jsãcss ãã¡ã€ã«ãªã©ã¯ãµãŒãã¹ã®ãããã€æã« S3 ã«ã¢ããããŒãããŠããŸããã¯ã©ã€ã¢ã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããS3 ããååŸããŠãCloudFront ã§ gzip ã«å§çž®åŠçãè¡ã£ãŠããŸãããŸããäžå®æé CloudFront äžã«ãã£ãã·ã¥ãããã®ã§ãå¹çããå§çž®ã³ã³ãã³ããè¿ããŸãã 3. CloudFrontâNGINXâRails çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ éçãã¡ã€ã«ã®äžã§ãã·ã°ããã£ããã§ãã¯ããŠãããã®ã¯ããã®ãããŒã§ã¢ã¯ã»ã¹ããŠããŸããNGINX ã§ãå§çž®èšå®ã ON ã«ããŠããŸããã Via ãããããããããNGINX ã§ã¯å§çž®ããªãããã«ãªã£ãŠããŸãã ãŸãšã HTTP ã³ã³ãã³ãã®å§çž®ãé©åã«è¡ãããšã§ããµãŒãã¹å
šäœã®ããã©ãŒãã³ã¹åäžãèŠèŸŒããŸããæŽã« CloudFront ãæŽ»çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ãããã«ãŠã§ã¢ã§ã®å§çž®åŠçããªãããæŽãªãããã©ãŒãã³ã¹åäžãèŠèŸŒããŸãã ä»å㯠HTTP ã³ã³ãã³ãã® gzip å§çž®ã«ã€ããŠã®ã¿è§ŠããŸããããBrotli å§çž®ã«ã€ããŠã NGINXãCloudFront ãšãã«å¯èœãªãããä»åŸåãå
¥ããŠãããããšèããŠããŸãããã HTTP ã³ã³ãã³ãã®å§çž®èšå®ãç¹ã«æ°ã«ããããšããªãæ¹ã¯äžåºŠç¢ºèªããŠã¿ãŠã¯ãããã§ããããïŒ æåŸã« ã¡ãã¬ãŒã§ã¯ãå»çåéã®ç€ŸäŒèª²é¡ã IT ã«ãŠè§£æ±ºããããã«æ¥ã
éé²ããŠããŸããå»çãšããåéã«ãããŠã¯ãæ©åŸ®ãªæ
å ±ãæ±ã£ãã蚺çãæ¢ããªãããã«ããããã«ãããã©ãŒãã³ã¹ã»ã»ãã¥ãªãã£å
±ã«é«ããµãŒãã¹ã¬ãã«ãæ±ããããŸããèå³ãæã£ãæ¹ãããã£ããããŸãããããŸãã¯æ°è»œã«é¢è«ã§ããã°ãšæããŸãã®ã§ãæ¯éãå¿åãã ããïŒ æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
äºæ¥æ¬éš ãããã¯ãéçºå®€ã®ãšã³ãžãã¢ã®äžçã§ãã ãªã³ã©ã€ã³èšºçã»æè¬æå°ã»ã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSã ã®éçºã»åºç€åšããæ
åœããŠãããŸãã ä»åã¯ãHTTP ã®ã³ã³ãã³ãå§çž®ã«ã€ããŠèª¿æ»ã»å¯Ÿå¿ããæ©äŒããã£ãã®ã§ãæ¬ããã°ã«ãŠç޹ä»ããããšæããŸãã HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ãHTTP ã®éä¿¡ã«ãã㊠Web ãµãŒããŒåŽãè¿ãããŒã¿ãããªãããã®åœ¢åŒã§å§çž®ããŠã¯ã©ã€ã¢ã³ãã«è¿ãããšã§ããå§çž®ãããã¬ã¹ãã³ã¹ãã¯ã©ã€ã¢ã³ãåŽã¯è§£åããŠå©çšããŸãã HTTP ã³ã³ãã³ãã®å§çž®ã«ãã£ãŠåŸãããã¡ãªããã»ãã¡ãªããã¯ä»¥äžã®éãã§ãã ‎ ã¡ãªãã éä¿¡ã®åž¯å䜿çšéãæžããã ããã«ãã£ãŠéä¿¡ã«ãããæéãåæžãã ããŒãžè¡šç€ºé床ãåäž ã§ãã ‵ ãã¡ãªãã å§çž®ã»è§£åã³ã¹ããããã ãã ããå§çž®ã»è§£åã³ã¹ãã¯ã»ãšãã©ã®å Žåã¯å°ãããããã¡ãªãããäžåã 倧容éãã¡ã€ã«ãããšããšå§çž®ãããŠãããã¡ã€ã«ïŒç»åãåç»ãPDF ãã¡ã€ã«ãªã©ïŒãå§çž®ããã®ã¯ãå§çž®ããŠããµã€ãºãããã»ã©å°ãããªããªãããéå¹çã§ãã ãµã€ãºãããŸãåæžã§ããªãå²ã«ãå§çž®ã»è§£åã« CPU ãªãœãŒã¹ã䜿ããæ°çŸ MB ãè¶
ãããã¡ã€ã«ã«ãªããšããããæ°ç§ãããããšããã HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ãã¯ã©ã€ã¢ã³ããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããå¿
èŠããããŸããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããã«ã¯ããªã¯ãšã¹ããããã« Accept-Encoding ããããæå®ããŸãã æè¿ã®ãã©ãŠã¶ã§ã¯ãHTTP ãªã¯ãšã¹ãæã«èªåçã« Accept-Encoding ããããèªåçã«ä»å ããŠã¢ã¯ã»ã¹ããŠããã®ã§ããã©ãŠã¶çµç±ã®å Žåã¯ç¹ã«æç€ºçã«æå®ããå¿
èŠã¯ãããŸãããChrome, Safari, Edge ãªã©ãã»ãšãã©ã®ã¡ãžã£ãŒãªãã©ãŠã¶ã§ã¯ Accept-Encoding: gzip, deflate, br ãæå®ãããŠããŸã(â»2021-01-23 æç¹)ã å§çž®åœ¢åŒ(gzip, deflate, br) å§çž®åœ¢åŒã¯ããã€ããããŸããããã©ãŠã¶ãå©çšããå Žåã¯ä»¥äžã®ãããããéžæè¢ã«ãªããŸãã gzip: LZ77 ãš 32 ããã CR ãçšããå§çž®åœ¢åŒ deflate: zlib æ§é äœãš deflate å§çž®ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒ br: Brotli ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒãgzip ã«è¿ãã倧容éã®èšèªèŸæžãçšããŠãé »åºãããã¿ãŒã³ã®åèªãå§çž®ããŠå¹çåããã®ããæç« çãªããã¹ãã§ã¯ gzip ãããå§çž®çãé«ã ãšèšããã Brotli ã¯æ¯èŒçæ°ãã圢åŒã§ãã»ãšãã©ã®ãµãŒããŒããã©ãŠã¶ã§å¯Ÿå¿ããŠããŸãã ãµãŒããŒã§ã® HTTP ã³ã³ãã³ãã®å§çž®æ¹æ³(gzip) ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã® Accept-Encoding ãªã¯ãšã¹ãããããåãåãããã®äžãã 1 ã€ãéžæããŠå§çž®åŠçãè¡ãã Content-Encoding ã¬ã¹ãã³ã¹ããããä»å ããŠã¯ã©ã€ã¢ã³ãã«çµæãç¥ãããŸãã CLINICS ãå©çšããŠããããããã®ã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã«çµã£ãŠãã©ã®ããã« HTTP ã³ã³ãã³ãå§çž®ãå®çŸããŠããã解説ããããšæããŸããããã€ãå§çž®åœ¢åŒã¯ãããŸãããããã§ã¯ gzip 圢åŒã§ã®å§çž®æ¹æ³ã«ã€ããŠè§£èª¬ããŸãã NGINX NGINX ã® ngx_http_gzip_module ãå©çšããããšã§ gzip å§çž®ããããšãã§ããŸãã nginx.conf ã® gzip ãã£ã¬ã¯ãã£ãã on ã«ããããšã§å§çž®ãæå¹ã«ãªããŸãããã ããã¿ã€ããæå®ããªããš Content-Type: text/html ã®ãšãã«ããå§çž®ãããŸãããä»ã®ã¿ã€ãã§ãå§çž®ããããšã㯠gzip_types ãã£ã¬ã¯ãã£ããåãããŠæå®ããå¿
èŠããããŸãã gzip_types ã« * ãæå®ããããšã§ããã¹ãŠã®ã³ã³ãã³ããå§çž®ããããšãã§ããŸãã gzip: on; gzip_types: text/css application/javascript application/json ãŸããCloudFront ãªã© Proxy ãçµç±ããŠã®ã¢ã¯ã»ã¹ã®å Žåã¯ããã©ã«ãã§ã¯è¡ãããŸãããProxy çµç±ã®ã¢ã¯ã»ã¹ãã©ããã¯ããªã¯ãšã¹ããããã« Via ãããããããã©ããã§å€å®ããŸãã CloudFront çµç±ã§ã®ã¢ã¯ã»ã¹ã®å Žå㯠Via: 1.1 xxxxx.cloudfront.net (CloudFront) ã®ããã« Via ããããä»å ãããŠãããããNGINX ã«ãŠ Proxy çµç±ã§ãããšå€å®ããŸããProxy çµç±ã§ãã£ãŠãäœãããã®æ¡ä»¶ã§å§çž®ãããå Žå㯠gzip_proxied ãã£ã¬ã¯ãã£ããæå®ããå¿
èŠããããŸãã ref. https://nginx.org/en/docs/http/ngx_http_gzip_module.html CloudFront CloudFront ã® Behavior ã®èšå®ã«ãŠèšå®ããŸããCompress Objects Automatically ãæå¹åããããšã§ãgzip å§çž®ãæå¹ã«ãªããŸãã äžèšãæå¹åãããšãCloudFront ã§ã¯ä»¥äžã®æ¡ä»¶ã§å§çž®ãè¡ãããŸãã ãã¡ã€ã«ãµã€ãºã 1,000(â1KB) ã 10,000,000(â10MB) ãã€ãã®é ãã£ãŠããªãªãžã³ãããã¡ã€ã«ãµã€ãºãå€å®ããããã® Content-Length ããããä»äžãããŠããªãå Žåã¯ããµã€ãºå€å¥ã§ããªãããå§çž®ãããªã ç¹å®ã® Content-Type ã®ã³ã³ãã³ããå§çž®ãã ããã¹ãç³»ã®ã³ã³ãã³ãã¯å§çž®ããããç»åãåç»ãPDF ãªã©ãããšããšå§çž®ãããŠãããã®ã¯å¯Ÿè±¡å€ã詳ãã㯠ãã¡ã ãªãªãžã³åŽïŒNGINX ã Rails ãªã©ïŒããå§çž®ããŠè¿ãããå Žåã¯ã å床å§çž®ã¯è¡ããªã Content-Encoding ãããã®æç¡ã§å€å®ããŠãã ref. https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html Rails Rails ã¯ããã©ã«ãã§ã¯ HTTP ã³ã³ãã³ãã®å§çž®ã¯è¡ããŸãããRails ã§ã³ã³ãã³ãå§çž®ãè¡ãããå Žåã¯ãRails ã® Rack Middleware ã® Rack::Deflater ãå°å
¥ããã®ãç°¡åã§ããããããªãããRack::Deflater ã¯ãã¹ãŠã® Content-Type ã®ã³ã³ãã³ãã§ãå§çž®ããã®ã§ãç»åãåç»ã» PDF ãªã©å§çž®ããã¹ãã§ãªãã³ã³ãã³ããŸã§å§çž®ããŠããŸããŸããNGINX ã CloudFront ãªã©ãRails å€ã®ä»ã®ãµãŒãã¹ãããã«ãŠã§ã¢ã«ä»»ããã®ãè¯ããšæããŸãã CLINICS ã§ã® HTTP ã³ã³ãã³ãå§çž®ã®ã·ãŒã±ã³ã¹ åç« ã§è§£èª¬ããã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã¯ãCLINICS ã§ã¯ä»¥äžã®ããã«é£æºããŠããŸãã AWS äžã« Rails ã¢ããªã±ãŒã·ã§ã³ããããã€ããŠãããéåžžã®ã¢ã¯ã»ã¹ã¯ããŒããã©ã³ãµãŒãã NGINX ãçµç±ã㊠Rails ã«ã¢ã¯ã»ã¹ããéçãã¡ã€ã«ãªã©ãã£ãã·ã¥ã³ã³ãã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããŠããŸãã CLINICS ã§ã¯çšéã«åãããå§çž®ãè¡ã£ãŠããŸãã3 ã€ã®ã±ãŒã¹ã玹ä»ããŸãã 1. NGINX çµç±ã§ Rails ã«ã¢ã¯ã»ã¹ããæ API ã¢ã¯ã»ã¹ãªã©ã¯äžèšã·ãŒã±ã³ã¹ã§ã¢ã¯ã»ã¹ããŠããŸããã»ãšãã©ã text/html ã application/json 圢åŒã®ã³ã³ãã³ããšãªããNGINX ã«ãŠ gzip å§çž®åŠçãè¡ã£ãŠããŸããRails ã¯ã¢ããªã±ãŒã·ã§ã³ã®åŠçã®ã¿ãè¡ããå§çž®ã¯è¡ããªãããã«ããŠããŸãã 2. CloudFront çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ ç»åãã¡ã€ã«ã PDFãéç㪠jsãcss ãã¡ã€ã«ãªã©ã¯ãµãŒãã¹ã®ãããã€æã« S3 ã«ã¢ããããŒãããŠããŸããã¯ã©ã€ã¢ã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããS3 ããååŸããŠãCloudFront ã§ gzip ã«å§çž®åŠçãè¡ã£ãŠããŸãããŸããäžå®æé CloudFront äžã«ãã£ãã·ã¥ãããã®ã§ãå¹çããå§çž®ã³ã³ãã³ããè¿ããŸãã 3. CloudFrontâNGINXâRails çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ éçãã¡ã€ã«ã®äžã§ãã·ã°ããã£ããã§ãã¯ããŠãããã®ã¯ããã®ãããŒã§ã¢ã¯ã»ã¹ããŠããŸããNGINX ã§ãå§çž®èšå®ã ON ã«ããŠããŸããã Via ãããããããããNGINX ã§ã¯å§çž®ããªãããã«ãªã£ãŠããŸãã ãŸãšã HTTP ã³ã³ãã³ãã®å§çž®ãé©åã«è¡ãããšã§ããµãŒãã¹å
šäœã®ããã©ãŒãã³ã¹åäžãèŠèŸŒããŸããæŽã« CloudFront ãæŽ»çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ãããã«ãŠã§ã¢ã§ã®å§çž®åŠçããªãããæŽãªãããã©ãŒãã³ã¹åäžãèŠèŸŒããŸãã ä»å㯠HTTP ã³ã³ãã³ãã® gzip å§çž®ã«ã€ããŠã®ã¿è§ŠããŸããããBrotli å§çž®ã«ã€ããŠã NGINXãCloudFront ãšãã«å¯èœãªãããä»åŸåãå
¥ããŠãããããšèããŠããŸãããã HTTP ã³ã³ãã³ãã®å§çž®èšå®ãç¹ã«æ°ã«ããããšããªãæ¹ã¯äžåºŠç¢ºèªããŠã¿ãŠã¯ãããã§ããããïŒ æåŸã« ã¡ãã¬ãŒã§ã¯ãå»çåéã®ç€ŸäŒèª²é¡ã IT ã«ãŠè§£æ±ºããããã«æ¥ã
éé²ããŠããŸããå»çãšããåéã«ãããŠã¯ãæ©åŸ®ãªæ
å ±ãæ±ã£ãã蚺çãæ¢ããªãããã«ããããã«ãããã©ãŒãã³ã¹ã»ã»ãã¥ãªãã£å
±ã«é«ããµãŒãã¹ã¬ãã«ãæ±ããããŸããèå³ãæã£ãæ¹ãããã£ããããŸãããããŸãã¯æ°è»œã«é¢è«ã§ããã°ãšæããŸãã®ã§ãæ¯éãå¿åãã ããïŒ æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
äºæ¥æ¬éš ãããã¯ãéçºå®€ã®ãšã³ãžãã¢ã®äžçã§ãã ãªã³ã©ã€ã³èšºçã»æè¬æå°ã»ã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSã ã®éçºã»åºç€åšããæ
åœããŠãããŸãã ä»åã¯ãHTTP ã®ã³ã³ãã³ãå§çž®ã«ã€ããŠèª¿æ»ã»å¯Ÿå¿ããæ©äŒããã£ãã®ã§ãæ¬ããã°ã«ãŠç޹ä»ããããšæããŸãã HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ãHTTP ã®éä¿¡ã«ãã㊠Web ãµãŒããŒåŽãè¿ãããŒã¿ãããªãããã®åœ¢åŒã§å§çž®ããŠã¯ã©ã€ã¢ã³ãã«è¿ãããšã§ããå§çž®ãããã¬ã¹ãã³ã¹ãã¯ã©ã€ã¢ã³ãåŽã¯è§£åããŠå©çšããŸãã HTTP ã³ã³ãã³ãã®å§çž®ã«ãã£ãŠåŸãããã¡ãªããã»ãã¡ãªããã¯ä»¥äžã®éãã§ãã ‎ ã¡ãªãã éä¿¡ã®åž¯å䜿çšéãæžããã ããã«ãã£ãŠéä¿¡ã«ãããæéãåæžãã ããŒãžè¡šç€ºé床ãåäž ã§ãã ‵ ãã¡ãªãã å§çž®ã»è§£åã³ã¹ããããã ãã ããå§çž®ã»è§£åã³ã¹ãã¯ã»ãšãã©ã®å Žåã¯å°ãããããã¡ãªãããäžåã 倧容éãã¡ã€ã«ãããšããšå§çž®ãããŠãããã¡ã€ã«ïŒç»åãåç»ãPDF ãã¡ã€ã«ãªã©ïŒãå§çž®ããã®ã¯ãå§çž®ããŠããµã€ãºãããã»ã©å°ãããªããªãããéå¹çã§ãã ãµã€ãºãããŸãåæžã§ããªãå²ã«ãå§çž®ã»è§£åã« CPU ãªãœãŒã¹ã䜿ããæ°çŸ MB ãè¶
ãããã¡ã€ã«ã«ãªããšããããæ°ç§ãããããšããã HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ãã¯ã©ã€ã¢ã³ããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããå¿
èŠããããŸããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããã«ã¯ããªã¯ãšã¹ããããã« Accept-Encoding ããããæå®ããŸãã æè¿ã®ãã©ãŠã¶ã§ã¯ãHTTP ãªã¯ãšã¹ãæã«èªåçã« Accept-Encoding ããããèªåçã«ä»å ããŠã¢ã¯ã»ã¹ããŠããã®ã§ããã©ãŠã¶çµç±ã®å Žåã¯ç¹ã«æç€ºçã«æå®ããå¿
èŠã¯ãããŸãããChrome, Safari, Edge ãªã©ãã»ãšãã©ã®ã¡ãžã£ãŒãªãã©ãŠã¶ã§ã¯ Accept-Encoding: gzip, deflate, br ãæå®ãããŠããŸã(â»2021-01-23 æç¹)ã å§çž®åœ¢åŒ(gzip, deflate, br) å§çž®åœ¢åŒã¯ããã€ããããŸããããã©ãŠã¶ãå©çšããå Žåã¯ä»¥äžã®ãããããéžæè¢ã«ãªããŸãã gzip: LZ77 ãš 32 ããã CR ãçšããå§çž®åœ¢åŒ deflate: zlib æ§é äœãš deflate å§çž®ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒ br: Brotli ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒãgzip ã«è¿ãã倧容éã®èšèªèŸæžãçšããŠãé »åºãããã¿ãŒã³ã®åèªãå§çž®ããŠå¹çåããã®ããæç« çãªããã¹ãã§ã¯ gzip ãããå§çž®çãé«ã ãšèšããã Brotli ã¯æ¯èŒçæ°ãã圢åŒã§ãã»ãšãã©ã®ãµãŒããŒããã©ãŠã¶ã§å¯Ÿå¿ããŠããŸãã ãµãŒããŒã§ã® HTTP ã³ã³ãã³ãã®å§çž®æ¹æ³(gzip) ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã® Accept-Encoding ãªã¯ãšã¹ãããããåãåãããã®äžãã 1 ã€ãéžæããŠå§çž®åŠçãè¡ãã Content-Encoding ã¬ã¹ãã³ã¹ããããä»å ããŠã¯ã©ã€ã¢ã³ãã«çµæãç¥ãããŸãã CLINICS ãå©çšããŠããããããã®ã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã«çµã£ãŠãã©ã®ããã« HTTP ã³ã³ãã³ãå§çž®ãå®çŸããŠããã解説ããããšæããŸããããã€ãå§çž®åœ¢åŒã¯ãããŸãããããã§ã¯ gzip 圢åŒã§ã®å§çž®æ¹æ³ã«ã€ããŠè§£èª¬ããŸãã NGINX NGINX ã® ngx_http_gzip_module ãå©çšããããšã§ gzip å§çž®ããããšãã§ããŸãã nginx.conf ã® gzip ãã£ã¬ã¯ãã£ãã on ã«ããããšã§å§çž®ãæå¹ã«ãªããŸãããã ããã¿ã€ããæå®ããªããš Content-Type: text/html ã®ãšãã«ããå§çž®ãããŸãããä»ã®ã¿ã€ãã§ãå§çž®ããããšã㯠gzip_types ãã£ã¬ã¯ãã£ããåãããŠæå®ããå¿
èŠããããŸãã gzip_types ã« * ãæå®ããããšã§ããã¹ãŠã®ã³ã³ãã³ããå§çž®ããããšãã§ããŸãã gzip: on; gzip_types: text/css application/javascript application/json ãŸããCloudFront ãªã© Proxy ãçµç±ããŠã®ã¢ã¯ã»ã¹ã®å Žåã¯ããã©ã«ãã§ã¯è¡ãããŸãããProxy çµç±ã®ã¢ã¯ã»ã¹ãã©ããã¯ããªã¯ãšã¹ããããã« Via ãããããããã©ããã§å€å®ããŸãã CloudFront çµç±ã§ã®ã¢ã¯ã»ã¹ã®å Žå㯠Via: 1.1 xxxxx.cloudfront.net (CloudFront) ã®ããã« Via ããããä»å ãããŠãããããNGINX ã«ãŠ Proxy çµç±ã§ãããšå€å®ããŸããProxy çµç±ã§ãã£ãŠãäœãããã®æ¡ä»¶ã§å§çž®ãããå Žå㯠gzip_proxied ãã£ã¬ã¯ãã£ããæå®ããå¿
èŠããããŸãã ref. https://nginx.org/en/docs/http/ngx_http_gzip_module.html CloudFront CloudFront ã® Behavior ã®èšå®ã«ãŠèšå®ããŸããCompress Objects Automatically ãæå¹åããããšã§ãgzip å§çž®ãæå¹ã«ãªããŸãã äžèšãæå¹åãããšãCloudFront ã§ã¯ä»¥äžã®æ¡ä»¶ã§å§çž®ãè¡ãããŸãã ãã¡ã€ã«ãµã€ãºã 1,000(â1KB) ã 10,000,000(â10MB) ãã€ãã®é ãã£ãŠããªãªãžã³ãããã¡ã€ã«ãµã€ãºãå€å®ããããã® Content-Length ããããä»äžãããŠããªãå Žåã¯ããµã€ãºå€å¥ã§ããªãããå§çž®ãããªã ç¹å®ã® Content-Type ã®ã³ã³ãã³ããå§çž®ãã ããã¹ãç³»ã®ã³ã³ãã³ãã¯å§çž®ããããç»åãåç»ãPDF ãªã©ãããšããšå§çž®ãããŠãããã®ã¯å¯Ÿè±¡å€ã詳ãã㯠ãã¡ã ãªãªãžã³åŽïŒNGINX ã Rails ãªã©ïŒããå§çž®ããŠè¿ãããå Žåã¯ã å床å§çž®ã¯è¡ããªã Content-Encoding ãããã®æç¡ã§å€å®ããŠãã ref. https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html Rails Rails ã¯ããã©ã«ãã§ã¯ HTTP ã³ã³ãã³ãã®å§çž®ã¯è¡ããŸãããRails ã§ã³ã³ãã³ãå§çž®ãè¡ãããå Žåã¯ãRails ã® Rack Middleware ã® Rack::Deflater ãå°å
¥ããã®ãç°¡åã§ããããããªãããRack::Deflater ã¯ãã¹ãŠã® Content-Type ã®ã³ã³ãã³ãã§ãå§çž®ããã®ã§ãç»åãåç»ã» PDF ãªã©å§çž®ããã¹ãã§ãªãã³ã³ãã³ããŸã§å§çž®ããŠããŸããŸããNGINX ã CloudFront ãªã©ãRails å€ã®ä»ã®ãµãŒãã¹ãããã«ãŠã§ã¢ã«ä»»ããã®ãè¯ããšæããŸãã CLINICS ã§ã® HTTP ã³ã³ãã³ãå§çž®ã®ã·ãŒã±ã³ã¹ åç« ã§è§£èª¬ããã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã¯ãCLINICS ã§ã¯ä»¥äžã®ããã«é£æºããŠããŸãã AWS äžã« Rails ã¢ããªã±ãŒã·ã§ã³ããããã€ããŠãããéåžžã®ã¢ã¯ã»ã¹ã¯ããŒããã©ã³ãµãŒãã NGINX ãçµç±ã㊠Rails ã«ã¢ã¯ã»ã¹ããéçãã¡ã€ã«ãªã©ãã£ãã·ã¥ã³ã³ãã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããŠããŸãã CLINICS ã§ã¯çšéã«åãããå§çž®ãè¡ã£ãŠããŸãã3 ã€ã®ã±ãŒã¹ã玹ä»ããŸãã 1. NGINX çµç±ã§ Rails ã«ã¢ã¯ã»ã¹ããæ API ã¢ã¯ã»ã¹ãªã©ã¯äžèšã·ãŒã±ã³ã¹ã§ã¢ã¯ã»ã¹ããŠããŸããã»ãšãã©ã text/html ã application/json 圢åŒã®ã³ã³ãã³ããšãªããNGINX ã«ãŠ gzip å§çž®åŠçãè¡ã£ãŠããŸããRails ã¯ã¢ããªã±ãŒã·ã§ã³ã®åŠçã®ã¿ãè¡ããå§çž®ã¯è¡ããªãããã«ããŠããŸãã 2. CloudFront çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ ç»åãã¡ã€ã«ã PDFãéç㪠jsãcss ãã¡ã€ã«ãªã©ã¯ãµãŒãã¹ã®ãããã€æã« S3 ã«ã¢ããããŒãããŠããŸããã¯ã©ã€ã¢ã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããS3 ããååŸããŠãCloudFront ã§ gzip ã«å§çž®åŠçãè¡ã£ãŠããŸãããŸããäžå®æé CloudFront äžã«ãã£ãã·ã¥ãããã®ã§ãå¹çããå§çž®ã³ã³ãã³ããè¿ããŸãã 3. CloudFrontâNGINXâRails çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ éçãã¡ã€ã«ã®äžã§ãã·ã°ããã£ããã§ãã¯ããŠãããã®ã¯ããã®ãããŒã§ã¢ã¯ã»ã¹ããŠããŸããNGINX ã§ãå§çž®èšå®ã ON ã«ããŠããŸããã Via ãããããããããNGINX ã§ã¯å§çž®ããªãããã«ãªã£ãŠããŸãã ãŸãšã HTTP ã³ã³ãã³ãã®å§çž®ãé©åã«è¡ãããšã§ããµãŒãã¹å
šäœã®ããã©ãŒãã³ã¹åäžãèŠèŸŒããŸããæŽã« CloudFront ãæŽ»çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ãããã«ãŠã§ã¢ã§ã®å§çž®åŠçããªãããæŽãªãããã©ãŒãã³ã¹åäžãèŠèŸŒããŸãã ä»å㯠HTTP ã³ã³ãã³ãã® gzip å§çž®ã«ã€ããŠã®ã¿è§ŠããŸããããBrotli å§çž®ã«ã€ããŠã NGINXãCloudFront ãšãã«å¯èœãªãããä»åŸåãå
¥ããŠãããããšèããŠããŸãããã HTTP ã³ã³ãã³ãã®å§çž®èšå®ãç¹ã«æ°ã«ããããšããªãæ¹ã¯äžåºŠç¢ºèªããŠã¿ãŠã¯ãããã§ããããïŒ æåŸã« ã¡ãã¬ãŒã§ã¯ãå»çåéã®ç€ŸäŒèª²é¡ã IT ã«ãŠè§£æ±ºããããã«æ¥ã
éé²ããŠããŸããå»çãšããåéã«ãããŠã¯ãæ©åŸ®ãªæ
å ±ãæ±ã£ãã蚺çãæ¢ããªãããã«ããããã«ãããã©ãŒãã³ã¹ã»ã»ãã¥ãªãã£å
±ã«é«ããµãŒãã¹ã¬ãã«ãæ±ããããŸããèå³ãæã£ãæ¹ãããã£ããããŸãããããŸãã¯æ°è»œã«é¢è«ã§ããã°ãšæããŸãã®ã§ãæ¯éãå¿åãã ããïŒ æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
äºæ¥æ¬éš ãããã¯ãéçºå®€ã®ãšã³ãžãã¢ã®äžçã§ãã ãªã³ã©ã€ã³èšºçã»æè¬æå°ã»ã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSã ã®éçºã»åºç€åšããæ
åœããŠãããŸãã ä»åã¯ãHTTP ã®ã³ã³ãã³ãå§çž®ã«ã€ããŠèª¿æ»ã»å¯Ÿå¿ããæ©äŒããã£ãã®ã§ãæ¬ããã°ã«ãŠç޹ä»ããããšæããŸãã HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ãHTTP ã®éä¿¡ã«ãã㊠Web ãµãŒããŒåŽãè¿ãããŒã¿ãããªãããã®åœ¢åŒã§å§çž®ããŠã¯ã©ã€ã¢ã³ãã«è¿ãããšã§ããå§çž®ãããã¬ã¹ãã³ã¹ãã¯ã©ã€ã¢ã³ãåŽã¯è§£åããŠå©çšããŸãã HTTP ã³ã³ãã³ãã®å§çž®ã«ãã£ãŠåŸãããã¡ãªããã»ãã¡ãªããã¯ä»¥äžã®éãã§ãã ‎ ã¡ãªãã éä¿¡ã®åž¯å䜿çšéãæžããã ããã«ãã£ãŠéä¿¡ã«ãããæéãåæžãã ããŒãžè¡šç€ºé床ãåäž ã§ãã ‵ ãã¡ãªãã å§çž®ã»è§£åã³ã¹ããããã ãã ããå§çž®ã»è§£åã³ã¹ãã¯ã»ãšãã©ã®å Žåã¯å°ãããããã¡ãªãããäžåã 倧容éãã¡ã€ã«ãããšããšå§çž®ãããŠãããã¡ã€ã«ïŒç»åãåç»ãPDF ãã¡ã€ã«ãªã©ïŒãå§çž®ããã®ã¯ãå§çž®ããŠããµã€ãºãããã»ã©å°ãããªããªãããéå¹çã§ãã ãµã€ãºãããŸãåæžã§ããªãå²ã«ãå§çž®ã»è§£åã« CPU ãªãœãŒã¹ã䜿ããæ°çŸ MB ãè¶
ãããã¡ã€ã«ã«ãªããšããããæ°ç§ãããããšããã HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ãã¯ã©ã€ã¢ã³ããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããå¿
èŠããããŸããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããã«ã¯ããªã¯ãšã¹ããããã« Accept-Encoding ããããæå®ããŸãã æè¿ã®ãã©ãŠã¶ã§ã¯ãHTTP ãªã¯ãšã¹ãæã«èªåçã« Accept-Encoding ããããèªåçã«ä»å ããŠã¢ã¯ã»ã¹ããŠããã®ã§ããã©ãŠã¶çµç±ã®å Žåã¯ç¹ã«æç€ºçã«æå®ããå¿
èŠã¯ãããŸãããChrome, Safari, Edge ãªã©ãã»ãšãã©ã®ã¡ãžã£ãŒãªãã©ãŠã¶ã§ã¯ Accept-Encoding: gzip, deflate, br ãæå®ãããŠããŸã(â»2021-01-23 æç¹)ã å§çž®åœ¢åŒ(gzip, deflate, br) å§çž®åœ¢åŒã¯ããã€ããããŸããããã©ãŠã¶ãå©çšããå Žåã¯ä»¥äžã®ãããããéžæè¢ã«ãªããŸãã gzip: LZ77 ãš 32 ããã CR ãçšããå§çž®åœ¢åŒ deflate: zlib æ§é äœãš deflate å§çž®ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒ br: Brotli ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒãgzip ã«è¿ãã倧容éã®èšèªèŸæžãçšããŠãé »åºãããã¿ãŒã³ã®åèªãå§çž®ããŠå¹çåããã®ããæç« çãªããã¹ãã§ã¯ gzip ãããå§çž®çãé«ã ãšèšããã Brotli ã¯æ¯èŒçæ°ãã圢åŒã§ãã»ãšãã©ã®ãµãŒããŒããã©ãŠã¶ã§å¯Ÿå¿ããŠããŸãã ãµãŒããŒã§ã® HTTP ã³ã³ãã³ãã®å§çž®æ¹æ³(gzip) ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã® Accept-Encoding ãªã¯ãšã¹ãããããåãåãããã®äžãã 1 ã€ãéžæããŠå§çž®åŠçãè¡ãã Content-Encoding ã¬ã¹ãã³ã¹ããããä»å ããŠã¯ã©ã€ã¢ã³ãã«çµæãç¥ãããŸãã CLINICS ãå©çšããŠããããããã®ã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã«çµã£ãŠãã©ã®ããã« HTTP ã³ã³ãã³ãå§çž®ãå®çŸããŠããã解説ããããšæããŸããããã€ãå§çž®åœ¢åŒã¯ãããŸãããããã§ã¯ gzip 圢åŒã§ã®å§çž®æ¹æ³ã«ã€ããŠè§£èª¬ããŸãã NGINX NGINX ã® ngx_http_gzip_module ãå©çšããããšã§ gzip å§çž®ããããšãã§ããŸãã nginx.conf ã® gzip ãã£ã¬ã¯ãã£ãã on ã«ããããšã§å§çž®ãæå¹ã«ãªããŸãããã ããã¿ã€ããæå®ããªããš Content-Type: text/html ã®ãšãã«ããå§çž®ãããŸãããä»ã®ã¿ã€ãã§ãå§çž®ããããšã㯠gzip_types ãã£ã¬ã¯ãã£ããåãããŠæå®ããå¿
èŠããããŸãã gzip_types ã« * ãæå®ããããšã§ããã¹ãŠã®ã³ã³ãã³ããå§çž®ããããšãã§ããŸãã gzip: on; gzip_types: text/css application/javascript application/json ãŸããCloudFront ãªã© Proxy ãçµç±ããŠã®ã¢ã¯ã»ã¹ã®å Žåã¯ããã©ã«ãã§ã¯è¡ãããŸãããProxy çµç±ã®ã¢ã¯ã»ã¹ãã©ããã¯ããªã¯ãšã¹ããããã« Via ãããããããã©ããã§å€å®ããŸãã CloudFront çµç±ã§ã®ã¢ã¯ã»ã¹ã®å Žå㯠Via: 1.1 xxxxx.cloudfront.net (CloudFront) ã®ããã« Via ããããä»å ãããŠãããããNGINX ã«ãŠ Proxy çµç±ã§ãããšå€å®ããŸããProxy çµç±ã§ãã£ãŠãäœãããã®æ¡ä»¶ã§å§çž®ãããå Žå㯠gzip_proxied ãã£ã¬ã¯ãã£ããæå®ããå¿
èŠããããŸãã ref. https://nginx.org/en/docs/http/ngx_http_gzip_module.html CloudFront CloudFront ã® Behavior ã®èšå®ã«ãŠèšå®ããŸããCompress Objects Automatically ãæå¹åããããšã§ãgzip å§çž®ãæå¹ã«ãªããŸãã äžèšãæå¹åãããšãCloudFront ã§ã¯ä»¥äžã®æ¡ä»¶ã§å§çž®ãè¡ãããŸãã ãã¡ã€ã«ãµã€ãºã 1,000(â1KB) ã 10,000,000(â10MB) ãã€ãã®é ãã£ãŠããªãªãžã³ãããã¡ã€ã«ãµã€ãºãå€å®ããããã® Content-Length ããããä»äžãããŠããªãå Žåã¯ããµã€ãºå€å¥ã§ããªãããå§çž®ãããªã ç¹å®ã® Content-Type ã®ã³ã³ãã³ããå§çž®ãã ããã¹ãç³»ã®ã³ã³ãã³ãã¯å§çž®ããããç»åãåç»ãPDF ãªã©ãããšããšå§çž®ãããŠãããã®ã¯å¯Ÿè±¡å€ã詳ãã㯠ãã¡ã ãªãªãžã³åŽïŒNGINX ã Rails ãªã©ïŒããå§çž®ããŠè¿ãããå Žåã¯ã å床å§çž®ã¯è¡ããªã Content-Encoding ãããã®æç¡ã§å€å®ããŠãã ref. https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html Rails Rails ã¯ããã©ã«ãã§ã¯ HTTP ã³ã³ãã³ãã®å§çž®ã¯è¡ããŸãããRails ã§ã³ã³ãã³ãå§çž®ãè¡ãããå Žåã¯ãRails ã® Rack Middleware ã® Rack::Deflater ãå°å
¥ããã®ãç°¡åã§ããããããªãããRack::Deflater ã¯ãã¹ãŠã® Content-Type ã®ã³ã³ãã³ãã§ãå§çž®ããã®ã§ãç»åãåç»ã» PDF ãªã©å§çž®ããã¹ãã§ãªãã³ã³ãã³ããŸã§å§çž®ããŠããŸããŸããNGINX ã CloudFront ãªã©ãRails å€ã®ä»ã®ãµãŒãã¹ãããã«ãŠã§ã¢ã«ä»»ããã®ãè¯ããšæããŸãã CLINICS ã§ã® HTTP ã³ã³ãã³ãå§çž®ã®ã·ãŒã±ã³ã¹ åç« ã§è§£èª¬ããã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã¯ãCLINICS ã§ã¯ä»¥äžã®ããã«é£æºããŠããŸãã AWS äžã« Rails ã¢ããªã±ãŒã·ã§ã³ããããã€ããŠãããéåžžã®ã¢ã¯ã»ã¹ã¯ããŒããã©ã³ãµãŒãã NGINX ãçµç±ã㊠Rails ã«ã¢ã¯ã»ã¹ããéçãã¡ã€ã«ãªã©ãã£ãã·ã¥ã³ã³ãã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããŠããŸãã CLINICS ã§ã¯çšéã«åãããå§çž®ãè¡ã£ãŠããŸãã3 ã€ã®ã±ãŒã¹ã玹ä»ããŸãã 1. NGINX çµç±ã§ Rails ã«ã¢ã¯ã»ã¹ããæ API ã¢ã¯ã»ã¹ãªã©ã¯äžèšã·ãŒã±ã³ã¹ã§ã¢ã¯ã»ã¹ããŠããŸããã»ãšãã©ã text/html ã application/json 圢åŒã®ã³ã³ãã³ããšãªããNGINX ã«ãŠ gzip å§çž®åŠçãè¡ã£ãŠããŸããRails ã¯ã¢ããªã±ãŒã·ã§ã³ã®åŠçã®ã¿ãè¡ããå§çž®ã¯è¡ããªãããã«ããŠããŸãã 2. CloudFront çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ ç»åãã¡ã€ã«ã PDFãéç㪠jsãcss ãã¡ã€ã«ãªã©ã¯ãµãŒãã¹ã®ãããã€æã« S3 ã«ã¢ããããŒãããŠããŸããã¯ã©ã€ã¢ã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããS3 ããååŸããŠãCloudFront ã§ gzip ã«å§çž®åŠçãè¡ã£ãŠããŸãããŸããäžå®æé CloudFront äžã«ãã£ãã·ã¥ãããã®ã§ãå¹çããå§çž®ã³ã³ãã³ããè¿ããŸãã 3. CloudFrontâNGINXâRails çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ éçãã¡ã€ã«ã®äžã§ãã·ã°ããã£ããã§ãã¯ããŠãããã®ã¯ããã®ãããŒã§ã¢ã¯ã»ã¹ããŠããŸããNGINX ã§ãå§çž®èšå®ã ON ã«ããŠããŸããã Via ãããããããããNGINX ã§ã¯å§çž®ããªãããã«ãªã£ãŠããŸãã ãŸãšã HTTP ã³ã³ãã³ãã®å§çž®ãé©åã«è¡ãããšã§ããµãŒãã¹å
šäœã®ããã©ãŒãã³ã¹åäžãèŠèŸŒããŸããæŽã« CloudFront ãæŽ»çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ãããã«ãŠã§ã¢ã§ã®å§çž®åŠçããªãããæŽãªãããã©ãŒãã³ã¹åäžãèŠèŸŒããŸãã ä»å㯠HTTP ã³ã³ãã³ãã® gzip å§çž®ã«ã€ããŠã®ã¿è§ŠããŸããããBrotli å§çž®ã«ã€ããŠã NGINXãCloudFront ãšãã«å¯èœãªãããä»åŸåãå
¥ããŠãããããšèããŠããŸãããã HTTP ã³ã³ãã³ãã®å§çž®èšå®ãç¹ã«æ°ã«ããããšããªãæ¹ã¯äžåºŠç¢ºèªããŠã¿ãŠã¯ãããã§ããããïŒ æåŸã« ã¡ãã¬ãŒã§ã¯ãå»çåéã®ç€ŸäŒèª²é¡ã IT ã«ãŠè§£æ±ºããããã«æ¥ã
éé²ããŠããŸããå»çãšããåéã«ãããŠã¯ãæ©åŸ®ãªæ
å ±ãæ±ã£ãã蚺çãæ¢ããªãããã«ããããã«ãããã©ãŒãã³ã¹ã»ã»ãã¥ãªãã£å
±ã«é«ããµãŒãã¹ã¬ãã«ãæ±ããããŸããèå³ãæã£ãæ¹ãããã£ããããŸãããããŸãã¯æ°è»œã«é¢è«ã§ããã°ãšæããŸãã®ã§ãæ¯éãå¿åãã ããïŒ æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã https://www.medley.jp/jobs/
äºæ¥æ¬éš ãããã¯ãéçºå®€ã®ãšã³ãžãã¢ã®äžçã§ãã ãªã³ã©ã€ã³èšºçã»æè¬æå°ã»ã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSã ã®éçºã»åºç€åšããæ
åœããŠãããŸãã ä»åã¯ãHTTP ã®ã³ã³ãã³ãå§çž®ã«ã€ããŠèª¿æ»ã»å¯Ÿå¿ããæ©äŒããã£ãã®ã§ãæ¬ããã°ã«ãŠç޹ä»ããããšæããŸãã HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ãHTTP ã®éä¿¡ã«ãã㊠Web ãµãŒããŒåŽãè¿ãããŒã¿ãããªãããã®åœ¢åŒã§å§çž®ããŠã¯ã©ã€ã¢ã³ãã«è¿ãããšã§ããå§çž®ãããã¬ã¹ãã³ã¹ãã¯ã©ã€ã¢ã³ãåŽã¯è§£åããŠå©çšããŸãã HTTP ã³ã³ãã³ãã®å§çž®ã«ãã£ãŠåŸãããã¡ãªããã»ãã¡ãªããã¯ä»¥äžã®éãã§ãã ‎ ã¡ãªãã éä¿¡ã®åž¯å䜿çšéãæžããã ããã«ãã£ãŠéä¿¡ã«ãããæéãåæžãã ããŒãžè¡šç€ºé床ãåäž ã§ãã ‵ ãã¡ãªãã å§çž®ã»è§£åã³ã¹ããããã ãã ããå§çž®ã»è§£åã³ã¹ãã¯ã»ãšãã©ã®å Žåã¯å°ãããããã¡ãªãããäžåã 倧容éãã¡ã€ã«ãããšããšå§çž®ãããŠãããã¡ã€ã«ïŒç»åãåç»ãPDF ãã¡ã€ã«ãªã©ïŒãå§çž®ããã®ã¯ãå§çž®ããŠããµã€ãºãããã»ã©å°ãããªããªãããéå¹çã§ãã ãµã€ãºãããŸãåæžã§ããªãå²ã«ãå§çž®ã»è§£åã« CPU ãªãœãŒã¹ã䜿ããæ°çŸ MB ãè¶
ãããã¡ã€ã«ã«ãªããšããããæ°ç§ãããããšããã HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ãã¯ã©ã€ã¢ã³ããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããå¿
èŠããããŸããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããã«ã¯ããªã¯ãšã¹ããããã« Accept-Encoding ããããæå®ããŸãã æè¿ã®ãã©ãŠã¶ã§ã¯ãHTTP ãªã¯ãšã¹ãæã«èªåçã« Accept-Encoding ããããèªåçã«ä»å ããŠã¢ã¯ã»ã¹ããŠããã®ã§ããã©ãŠã¶çµç±ã®å Žåã¯ç¹ã«æç€ºçã«æå®ããå¿
èŠã¯ãããŸãããChrome, Safari, Edge ãªã©ãã»ãšãã©ã®ã¡ãžã£ãŒãªãã©ãŠã¶ã§ã¯ Accept-Encoding: gzip, deflate, br ãæå®ãããŠããŸã(â»2021-01-23 æç¹)ã å§çž®åœ¢åŒ(gzip, deflate, br) å§çž®åœ¢åŒã¯ããã€ããããŸããããã©ãŠã¶ãå©çšããå Žåã¯ä»¥äžã®ãããããéžæè¢ã«ãªããŸãã gzip: LZ77 ãš 32 ããã CR ãçšããå§çž®åœ¢åŒ deflate: zlib æ§é äœãš deflate å§çž®ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒ br: Brotli ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒãgzip ã«è¿ãã倧容éã®èšèªèŸæžãçšããŠãé »åºãããã¿ãŒã³ã®åèªãå§çž®ããŠå¹çåããã®ããæç« çãªããã¹ãã§ã¯ gzip ãããå§çž®çãé«ã ãšèšããã Brotli ã¯æ¯èŒçæ°ãã圢åŒã§ãã»ãšãã©ã®ãµãŒããŒããã©ãŠã¶ã§å¯Ÿå¿ããŠããŸãã ãµãŒããŒã§ã® HTTP ã³ã³ãã³ãã®å§çž®æ¹æ³(gzip) ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã® Accept-Encoding ãªã¯ãšã¹ãããããåãåãããã®äžãã 1 ã€ãéžæããŠå§çž®åŠçãè¡ãã Content-Encoding ã¬ã¹ãã³ã¹ããããä»å ããŠã¯ã©ã€ã¢ã³ãã«çµæãç¥ãããŸãã CLINICS ãå©çšããŠããããããã®ã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã«çµã£ãŠãã©ã®ããã« HTTP ã³ã³ãã³ãå§çž®ãå®çŸããŠããã解説ããããšæããŸããããã€ãå§çž®åœ¢åŒã¯ãããŸãããããã§ã¯ gzip 圢åŒã§ã®å§çž®æ¹æ³ã«ã€ããŠè§£èª¬ããŸãã NGINX NGINX ã® ngx_http_gzip_module ãå©çšããããšã§ gzip å§çž®ããããšãã§ããŸãã nginx.conf ã® gzip ãã£ã¬ã¯ãã£ãã on ã«ããããšã§å§çž®ãæå¹ã«ãªããŸãããã ããã¿ã€ããæå®ããªããš Content-Type: text/html ã®ãšãã«ããå§çž®ãããŸãããä»ã®ã¿ã€ãã§ãå§çž®ããããšã㯠gzip_types ãã£ã¬ã¯ãã£ããåãããŠæå®ããå¿
èŠããããŸãã gzip_types ã« * ãæå®ããããšã§ããã¹ãŠã®ã³ã³ãã³ããå§çž®ããããšãã§ããŸãã gzip: on; gzip_types: text/css application/javascript application/json ãŸããCloudFront ãªã© Proxy ãçµç±ããŠã®ã¢ã¯ã»ã¹ã®å Žåã¯ããã©ã«ãã§ã¯è¡ãããŸãããProxy çµç±ã®ã¢ã¯ã»ã¹ãã©ããã¯ããªã¯ãšã¹ããããã« Via ãããããããã©ããã§å€å®ããŸãã CloudFront çµç±ã§ã®ã¢ã¯ã»ã¹ã®å Žå㯠Via: 1.1 xxxxx.cloudfront.net (CloudFront) ã®ããã« Via ããããä»å ãããŠãããããNGINX ã«ãŠ Proxy çµç±ã§ãããšå€å®ããŸããProxy çµç±ã§ãã£ãŠãäœãããã®æ¡ä»¶ã§å§çž®ãããå Žå㯠gzip_proxied ãã£ã¬ã¯ãã£ããæå®ããå¿
èŠããããŸãã ref. https://nginx.org/en/docs/http/ngx_http_gzip_module.html CloudFront CloudFront ã® Behavior ã®èšå®ã«ãŠèšå®ããŸããCompress Objects Automatically ãæå¹åããããšã§ãgzip å§çž®ãæå¹ã«ãªããŸãã äžèšãæå¹åãããšãCloudFront ã§ã¯ä»¥äžã®æ¡ä»¶ã§å§çž®ãè¡ãããŸãã ãã¡ã€ã«ãµã€ãºã 1,000(â1KB) ã 10,000,000(â10MB) ãã€ãã®é ãã£ãŠããªãªãžã³ãããã¡ã€ã«ãµã€ãºãå€å®ããããã® Content-Length ããããä»äžãããŠããªãå Žåã¯ããµã€ãºå€å¥ã§ããªãããå§çž®ãããªã ç¹å®ã® Content-Type ã®ã³ã³ãã³ããå§çž®ãã ããã¹ãç³»ã®ã³ã³ãã³ãã¯å§çž®ããããç»åãåç»ãPDF ãªã©ãããšããšå§çž®ãããŠãããã®ã¯å¯Ÿè±¡å€ã詳ãã㯠ãã¡ã ãªãªãžã³åŽïŒNGINX ã Rails ãªã©ïŒããå§çž®ããŠè¿ãããå Žåã¯ã å床å§çž®ã¯è¡ããªã Content-Encoding ãããã®æç¡ã§å€å®ããŠãã ref. https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html Rails Rails ã¯ããã©ã«ãã§ã¯ HTTP ã³ã³ãã³ãã®å§çž®ã¯è¡ããŸãããRails ã§ã³ã³ãã³ãå§çž®ãè¡ãããå Žåã¯ãRails ã® Rack Middleware ã® Rack::Deflater ãå°å
¥ããã®ãç°¡åã§ããããããªãããRack::Deflater ã¯ãã¹ãŠã® Content-Type ã®ã³ã³ãã³ãã§ãå§çž®ããã®ã§ãç»åãåç»ã» PDF ãªã©å§çž®ããã¹ãã§ãªãã³ã³ãã³ããŸã§å§çž®ããŠããŸããŸããNGINX ã CloudFront ãªã©ãRails å€ã®ä»ã®ãµãŒãã¹ãããã«ãŠã§ã¢ã«ä»»ããã®ãè¯ããšæããŸãã CLINICS ã§ã® HTTP ã³ã³ãã³ãå§çž®ã®ã·ãŒã±ã³ã¹ åç« ã§è§£èª¬ããã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã¯ãCLINICS ã§ã¯ä»¥äžã®ããã«é£æºããŠããŸãã AWS äžã« Rails ã¢ããªã±ãŒã·ã§ã³ããããã€ããŠãããéåžžã®ã¢ã¯ã»ã¹ã¯ããŒããã©ã³ãµãŒãã NGINX ãçµç±ã㊠Rails ã«ã¢ã¯ã»ã¹ããéçãã¡ã€ã«ãªã©ãã£ãã·ã¥ã³ã³ãã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããŠããŸãã CLINICS ã§ã¯çšéã«åãããå§çž®ãè¡ã£ãŠããŸãã3 ã€ã®ã±ãŒã¹ã玹ä»ããŸãã 1. NGINX çµç±ã§ Rails ã«ã¢ã¯ã»ã¹ããæ API ã¢ã¯ã»ã¹ãªã©ã¯äžèšã·ãŒã±ã³ã¹ã§ã¢ã¯ã»ã¹ããŠããŸããã»ãšãã©ã text/html ã application/json 圢åŒã®ã³ã³ãã³ããšãªããNGINX ã«ãŠ gzip å§çž®åŠçãè¡ã£ãŠããŸããRails ã¯ã¢ããªã±ãŒã·ã§ã³ã®åŠçã®ã¿ãè¡ããå§çž®ã¯è¡ããªãããã«ããŠããŸãã 2. CloudFront çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ ç»åãã¡ã€ã«ã PDFãéç㪠jsãcss ãã¡ã€ã«ãªã©ã¯ãµãŒãã¹ã®ãããã€æã« S3 ã«ã¢ããããŒãããŠããŸããã¯ã©ã€ã¢ã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããS3 ããååŸããŠãCloudFront ã§ gzip ã«å§çž®åŠçãè¡ã£ãŠããŸãããŸããäžå®æé CloudFront äžã«ãã£ãã·ã¥ãããã®ã§ãå¹çããå§çž®ã³ã³ãã³ããè¿ããŸãã 3. CloudFrontâNGINXâRails çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ éçãã¡ã€ã«ã®äžã§ãã·ã°ããã£ããã§ãã¯ããŠãããã®ã¯ããã®ãããŒã§ã¢ã¯ã»ã¹ããŠããŸããNGINX ã§ãå§çž®èšå®ã ON ã«ããŠããŸããã Via ãããããããããNGINX ã§ã¯å§çž®ããªãããã«ãªã£ãŠããŸãã ãŸãšã HTTP ã³ã³ãã³ãã®å§çž®ãé©åã«è¡ãããšã§ããµãŒãã¹å
šäœã®ããã©ãŒãã³ã¹åäžãèŠèŸŒããŸããæŽã« CloudFront ãæŽ»çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ãããã«ãŠã§ã¢ã§ã®å§çž®åŠçããªãããæŽãªãããã©ãŒãã³ã¹åäžãèŠèŸŒããŸãã ä»å㯠HTTP ã³ã³ãã³ãã® gzip å§çž®ã«ã€ããŠã®ã¿è§ŠããŸããããBrotli å§çž®ã«ã€ããŠã NGINXãCloudFront ãšãã«å¯èœãªãããä»åŸåãå
¥ããŠãããããšèããŠããŸãããã HTTP ã³ã³ãã³ãã®å§çž®èšå®ãç¹ã«æ°ã«ããããšããªãæ¹ã¯äžåºŠç¢ºèªããŠã¿ãŠã¯ãããã§ããããïŒ æåŸã« ã¡ãã¬ãŒã§ã¯ãå»çåéã®ç€ŸäŒèª²é¡ã IT ã«ãŠè§£æ±ºããããã«æ¥ã
éé²ããŠããŸããå»çãšããåéã«ãããŠã¯ãæ©åŸ®ãªæ
å ±ãæ±ã£ãã蚺çãæ¢ããªãããã«ããããã«ãããã©ãŒãã³ã¹ã»ã»ãã¥ãªãã£å
±ã«é«ããµãŒãã¹ã¬ãã«ãæ±ããããŸããèå³ãæã£ãæ¹ãããã£ããããŸãããããŸãã¯æ°è»œã«é¢è«ã§ããã°ãšæããŸãã®ã§ãæ¯éãå¿åãã ããïŒ æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
äºæ¥æ¬éš ãããã¯ãéçºå®€ã®ãšã³ãžãã¢ã®äžçã§ãã ãªã³ã©ã€ã³èšºçã»æè¬æå°ã»ã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSã ã®éçºã»åºç€åšããæ
åœããŠãããŸãã ä»åã¯ãHTTP ã®ã³ã³ãã³ãå§çž®ã«ã€ããŠèª¿æ»ã»å¯Ÿå¿ããæ©äŒããã£ãã®ã§ãæ¬ããã°ã«ãŠç޹ä»ããããšæããŸãã HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ HTTP ã³ã³ãã³ãã®å§çž®ãšã¯ãHTTP ã®éä¿¡ã«ãã㊠Web ãµãŒããŒåŽãè¿ãããŒã¿ãããªãããã®åœ¢åŒã§å§çž®ããŠã¯ã©ã€ã¢ã³ãã«è¿ãããšã§ããå§çž®ãããã¬ã¹ãã³ã¹ãã¯ã©ã€ã¢ã³ãåŽã¯è§£åããŠå©çšããŸãã HTTP ã³ã³ãã³ãã®å§çž®ã«ãã£ãŠåŸãããã¡ãªããã»ãã¡ãªããã¯ä»¥äžã®éãã§ãã ‎ ã¡ãªãã éä¿¡ã®åž¯å䜿çšéãæžããã ããã«ãã£ãŠéä¿¡ã«ãããæéãåæžãã ããŒãžè¡šç€ºé床ãåäž ã§ãã ‵ ãã¡ãªãã å§çž®ã»è§£åã³ã¹ããããã ãã ããå§çž®ã»è§£åã³ã¹ãã¯ã»ãšãã©ã®å Žåã¯å°ãããããã¡ãªãããäžåã 倧容éãã¡ã€ã«ãããšããšå§çž®ãããŠãããã¡ã€ã«ïŒç»åãåç»ãPDF ãã¡ã€ã«ãªã©ïŒãå§çž®ããã®ã¯ãå§çž®ããŠããµã€ãºãããã»ã©å°ãããªããªãããéå¹çã§ãã ãµã€ãºãããŸãåæžã§ããªãå²ã«ãå§çž®ã»è§£åã« CPU ãªãœãŒã¹ã䜿ããæ°çŸ MB ãè¶
ãããã¡ã€ã«ã«ãªããšããããæ°ç§ãããããšããã HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ HTTP ã³ã³ãã³ããå§çž®ããããã«ã¯ãã¯ã©ã€ã¢ã³ããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããå¿
èŠããããŸããè§£åå¯èœãªå§çž®åœ¢åŒãæå®ããã«ã¯ããªã¯ãšã¹ããããã« Accept-Encoding ããããæå®ããŸãã æè¿ã®ãã©ãŠã¶ã§ã¯ãHTTP ãªã¯ãšã¹ãæã«èªåçã« Accept-Encoding ããããèªåçã«ä»å ããŠã¢ã¯ã»ã¹ããŠããã®ã§ããã©ãŠã¶çµç±ã®å Žåã¯ç¹ã«æç€ºçã«æå®ããå¿
èŠã¯ãããŸãããChrome, Safari, Edge ãªã©ãã»ãšãã©ã®ã¡ãžã£ãŒãªãã©ãŠã¶ã§ã¯ Accept-Encoding: gzip, deflate, br ãæå®ãããŠããŸã(â»2021-01-23 æç¹)ã å§çž®åœ¢åŒ(gzip, deflate, br) å§çž®åœ¢åŒã¯ããã€ããããŸããããã©ãŠã¶ãå©çšããå Žåã¯ä»¥äžã®ãããããéžæè¢ã«ãªããŸãã gzip: LZ77 ãš 32 ããã CR ãçšããå§çž®åœ¢åŒ deflate: zlib æ§é äœãš deflate å§çž®ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒ br: Brotli ã¢ã«ãŽãªãºã ãçšããå§çž®åœ¢åŒãgzip ã«è¿ãã倧容éã®èšèªèŸæžãçšããŠãé »åºãããã¿ãŒã³ã®åèªãå§çž®ããŠå¹çåããã®ããæç« çãªããã¹ãã§ã¯ gzip ãããå§çž®çãé«ã ãšèšããã Brotli ã¯æ¯èŒçæ°ãã圢åŒã§ãã»ãšãã©ã®ãµãŒããŒããã©ãŠã¶ã§å¯Ÿå¿ããŠããŸãã ãµãŒããŒã§ã® HTTP ã³ã³ãã³ãã®å§çž®æ¹æ³(gzip) ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã® Accept-Encoding ãªã¯ãšã¹ãããããåãåãããã®äžãã 1 ã€ãéžæããŠå§çž®åŠçãè¡ãã Content-Encoding ã¬ã¹ãã³ã¹ããããä»å ããŠã¯ã©ã€ã¢ã³ãã«çµæãç¥ãããŸãã CLINICS ãå©çšããŠããããããã®ã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã«çµã£ãŠãã©ã®ããã« HTTP ã³ã³ãã³ãå§çž®ãå®çŸããŠããã解説ããããšæããŸããããã€ãå§çž®åœ¢åŒã¯ãããŸãããããã§ã¯ gzip 圢åŒã§ã®å§çž®æ¹æ³ã«ã€ããŠè§£èª¬ããŸãã NGINX NGINX ã® ngx_http_gzip_module ãå©çšããããšã§ gzip å§çž®ããããšãã§ããŸãã nginx.conf ã® gzip ãã£ã¬ã¯ãã£ãã on ã«ããããšã§å§çž®ãæå¹ã«ãªããŸãããã ããã¿ã€ããæå®ããªããš Content-Type: text/html ã®ãšãã«ããå§çž®ãããŸãããä»ã®ã¿ã€ãã§ãå§çž®ããããšã㯠gzip_types ãã£ã¬ã¯ãã£ããåãããŠæå®ããå¿
èŠããããŸãã gzip_types ã« * ãæå®ããããšã§ããã¹ãŠã®ã³ã³ãã³ããå§çž®ããããšãã§ããŸãã gzip: on; gzip_types: text/css application/javascript application/json ãŸããCloudFront ãªã© Proxy ãçµç±ããŠã®ã¢ã¯ã»ã¹ã®å Žåã¯ããã©ã«ãã§ã¯è¡ãããŸãããProxy çµç±ã®ã¢ã¯ã»ã¹ãã©ããã¯ããªã¯ãšã¹ããããã« Via ãããããããã©ããã§å€å®ããŸãã CloudFront çµç±ã§ã®ã¢ã¯ã»ã¹ã®å Žå㯠Via: 1.1 xxxxx.cloudfront.net (CloudFront) ã®ããã« Via ããããä»å ãããŠãããããNGINX ã«ãŠ Proxy çµç±ã§ãããšå€å®ããŸããProxy çµç±ã§ãã£ãŠãäœãããã®æ¡ä»¶ã§å§çž®ãããå Žå㯠gzip_proxied ãã£ã¬ã¯ãã£ããæå®ããå¿
èŠããããŸãã ref. https://nginx.org/en/docs/http/ngx_http_gzip_module.html CloudFront CloudFront ã® Behavior ã®èšå®ã«ãŠèšå®ããŸããCompress Objects Automatically ãæå¹åããããšã§ãgzip å§çž®ãæå¹ã«ãªããŸãã äžèšãæå¹åãããšãCloudFront ã§ã¯ä»¥äžã®æ¡ä»¶ã§å§çž®ãè¡ãããŸãã ãã¡ã€ã«ãµã€ãºã 1,000(â1KB) ã 10,000,000(â10MB) ãã€ãã®é ãã£ãŠããªãªãžã³ãããã¡ã€ã«ãµã€ãºãå€å®ããããã® Content-Length ããããä»äžãããŠããªãå Žåã¯ããµã€ãºå€å¥ã§ããªãããå§çž®ãããªã ç¹å®ã® Content-Type ã®ã³ã³ãã³ããå§çž®ãã ããã¹ãç³»ã®ã³ã³ãã³ãã¯å§çž®ããããç»åãåç»ãPDF ãªã©ãããšããšå§çž®ãããŠãããã®ã¯å¯Ÿè±¡å€ã詳ãã㯠ãã¡ã ãªãªãžã³åŽïŒNGINX ã Rails ãªã©ïŒããå§çž®ããŠè¿ãããå Žåã¯ã å床å§çž®ã¯è¡ããªã Content-Encoding ãããã®æç¡ã§å€å®ããŠãã ref. https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html Rails Rails ã¯ããã©ã«ãã§ã¯ HTTP ã³ã³ãã³ãã®å§çž®ã¯è¡ããŸãããRails ã§ã³ã³ãã³ãå§çž®ãè¡ãããå Žåã¯ãRails ã® Rack Middleware ã® Rack::Deflater ãå°å
¥ããã®ãç°¡åã§ããããããªãããRack::Deflater ã¯ãã¹ãŠã® Content-Type ã®ã³ã³ãã³ãã§ãå§çž®ããã®ã§ãç»åãåç»ã» PDF ãªã©å§çž®ããã¹ãã§ãªãã³ã³ãã³ããŸã§å§çž®ããŠããŸããŸããNGINX ã CloudFront ãªã©ãRails å€ã®ä»ã®ãµãŒãã¹ãããã«ãŠã§ã¢ã«ä»»ããã®ãè¯ããšæããŸãã CLINICS ã§ã® HTTP ã³ã³ãã³ãå§çž®ã®ã·ãŒã±ã³ã¹ åç« ã§è§£èª¬ããã¢ããªã±ãŒã·ã§ã³ã»ããã«ãŠã§ã¢ã¯ãCLINICS ã§ã¯ä»¥äžã®ããã«é£æºããŠããŸãã AWS äžã« Rails ã¢ããªã±ãŒã·ã§ã³ããããã€ããŠãããéåžžã®ã¢ã¯ã»ã¹ã¯ããŒããã©ã³ãµãŒãã NGINX ãçµç±ã㊠Rails ã«ã¢ã¯ã»ã¹ããéçãã¡ã€ã«ãªã©ãã£ãã·ã¥ã³ã³ãã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããŠããŸãã CLINICS ã§ã¯çšéã«åãããå§çž®ãè¡ã£ãŠããŸãã3 ã€ã®ã±ãŒã¹ã玹ä»ããŸãã 1. NGINX çµç±ã§ Rails ã«ã¢ã¯ã»ã¹ããæ API ã¢ã¯ã»ã¹ãªã©ã¯äžèšã·ãŒã±ã³ã¹ã§ã¢ã¯ã»ã¹ããŠããŸããã»ãšãã©ã text/html ã application/json 圢åŒã®ã³ã³ãã³ããšãªããNGINX ã«ãŠ gzip å§çž®åŠçãè¡ã£ãŠããŸããRails ã¯ã¢ããªã±ãŒã·ã§ã³ã®åŠçã®ã¿ãè¡ããå§çž®ã¯è¡ããªãããã«ããŠããŸãã 2. CloudFront çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ ç»åãã¡ã€ã«ã PDFãéç㪠jsãcss ãã¡ã€ã«ãªã©ã¯ãµãŒãã¹ã®ãããã€æã« S3 ã«ã¢ããããŒãããŠããŸããã¯ã©ã€ã¢ã³ã㯠CloudFront çµç±ã§ã¢ã¯ã»ã¹ããS3 ããååŸããŠãCloudFront ã§ gzip ã«å§çž®åŠçãè¡ã£ãŠããŸãããŸããäžå®æé CloudFront äžã«ãã£ãã·ã¥ãããã®ã§ãå¹çããå§çž®ã³ã³ãã³ããè¿ããŸãã 3. CloudFrontâNGINXâRails çµç±ã§ S3 ã«ã¢ã¯ã»ã¹ããæ éçãã¡ã€ã«ã®äžã§ãã·ã°ããã£ããã§ãã¯ããŠãããã®ã¯ããã®ãããŒã§ã¢ã¯ã»ã¹ããŠããŸããNGINX ã§ãå§çž®èšå®ã ON ã«ããŠããŸããã Via ãããããããããNGINX ã§ã¯å§çž®ããªãããã«ãªã£ãŠããŸãã ãŸãšã HTTP ã³ã³ãã³ãã®å§çž®ãé©åã«è¡ãããšã§ããµãŒãã¹å
šäœã®ããã©ãŒãã³ã¹åäžãèŠèŸŒããŸããæŽã« CloudFront ãæŽ»çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ãããã«ãŠã§ã¢ã§ã®å§çž®åŠçããªãããæŽãªãããã©ãŒãã³ã¹åäžãèŠèŸŒããŸãã ä»å㯠HTTP ã³ã³ãã³ãã® gzip å§çž®ã«ã€ããŠã®ã¿è§ŠããŸããããBrotli å§çž®ã«ã€ããŠã NGINXãCloudFront ãšãã«å¯èœãªãããä»åŸåãå
¥ããŠãããããšèããŠããŸãããã HTTP ã³ã³ãã³ãã®å§çž®èšå®ãç¹ã«æ°ã«ããããšããªãæ¹ã¯äžåºŠç¢ºèªããŠã¿ãŠã¯ãããã§ããããïŒ æåŸã« ã¡ãã¬ãŒã§ã¯ãå»çåéã®ç€ŸäŒèª²é¡ã IT ã«ãŠè§£æ±ºããããã«æ¥ã
éé²ããŠããŸããå»çãšããåéã«ãããŠã¯ãæ©åŸ®ãªæ
å ±ãæ±ã£ãã蚺çãæ¢ããªãããã«ããããã«ãããã©ãŒãã³ã¹ã»ã»ãã¥ãªãã£å
±ã«é«ããµãŒãã¹ã¬ãã«ãæ±ããããŸããèå³ãæã£ãæ¹ãããã£ããããŸãããããŸãã¯æ°è»œã«é¢è«ã§ããã°ãšæããŸãã®ã§ãæ¯éãå¿åãã ããïŒ æåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã® QA ãšã³ãžãã¢ã®ç±³å±±ã§ãã䞻㫠CLINICS ã¢ããªã® QA ãæ
åœããŠããŸããã¡ãã¬ãŒã«ã¯ 2020 幎 8 æã«å
¥ç€ŸããŸããã ä»åã¯å
¥ç€ŸããŠãŸãè¡ã£ãããšã®äžã€ããªã°ã¬ãã·ã§ã³ãã¹ãã®èªååãšããã®ããã«å°å
¥ãã Magic Pod ãšããããŒã«ã«ã€ããŠãçµç·¯ãå°å
¥ããŠã¿ãçµæãã玹ä»ããããšæããŸãã CLINICS ãšã¯ ç§ã®æå±ããããŒã ã§éçºããŠãã CLINICS ãšãããããã¯ãã¯ã¢ããªã§ãªã³ã©ã€ã³èšºçããã¯ãªããã¯ã»ç
é¢ããåŠæ¹ç®ãçºè¡ããŠãããããšãã§ãããªã³ã©ã€ã³äžã§èšºå¯ãããè¬ã®åãåããŸã§å®çµã§ãããµãŒãã¹ã§ãã ãã©ãããã©ãŒã 㯠iOS ãš Android ã®ãã€ãã£ãã¢ããªãããããåæ§ã®ãµãŒãã¹ã Web ãã©ãŠã¶ãããå©çšããããšãåºæ¥ãŸãã QAïŒãªãªãŒã¹åšãã®ç¶æ³ CLINICS ã®éçºçµç¹ã« QA ãšã³ãžãã¢ããžã§ã€ã³ããã®ã¯æšå¹ŽïŒ2020 幎ïŒã§ããããµãŒãã¹èªäœã¯ 2016 幎ã«ããŒã³ããããŠããŸãã æ¬çµç¹ã§ã¯ãªãªãŒã¹åã«è¡ããªã°ã¬ãã·ã§ã³ãã¹ãã«ã€ããŠã¯ãéçºã¡ã³ããäžå¿ã«ããŒã å
šäœã§è¡ãæåããããŸãã ã¢ããªã®ãªãªãŒã¹ã¯éé±ã§è¡ã£ãŠããããã®éœåºŠéçºã¡ã³ãèªèº«ã«ãã£ãŠãã¹ããè¡ãããŠããŸããããèªååããã UI ãã¹ãã¯ååšããŠããŸããã§ããã ã¡ãã¬ãŒã§ã¯ QA ãšã³ãžãã¢ããžã§ã€ã³ããŠéããªããããããããããšã»ããã¹ãããšã¯å€å²ã«ãããäžã§ãŸãäœããçæããã¹ããæ€èšããŸããã QA ããã»ã¹ã®çå®ã»æ¹åãããæ°æ©èœããªãªãŒã¹ãŸã§æšé²ããããã® QA 掻åãããã䞊è¡ããŠå¹Ÿã€ãåããŠããäžã§ãã¹ãèªååãã©ã®ã¿ã€ãã³ã°ã§ãã©ããã£ãŠã¹ã¿ãŒããããæ©ã¿ãŸããã ããªã¥ãŒããèãã ã¡ãã¬ãŒã®ããªã¥ãŒã¯ãã®äžã€ã§ãããããã®ããªã¥ãŒèŠç¹ã§èããŠã¿ãŸããã ãå¡äºåŸ¹åºããšããŠããªãªãŒã¹åã®ãªã°ã¬ãã·ã§ã³ãã¹ãããã£ããè¡ãããšã¯åœç¶ã®ããšãšããŠèããããŸãã ãäžå€®çªç Žãã®èŠç¹ã§ã¯ã©ãããšèãããšããã¯ããã¹ãããã»ã¹ã«ãããŠãç¹ã«ãªãªãŒã¹æ¯ã«ç¹°ãè¿ãäœæ¥ãšãªããªã°ã¬ãã·ã§ã³ãã¹ããèªååããããšã¯çéã§ããããã¹ããã©ã¯ãã£ã¹ã®äžã€ã ãšèããããŸãã ãã®ããèªååã¯åªå
床é«ãé²ããã¹ãã§ã¯ãããŸãã æ®ãäžã€ãæªæ¥å¿åãã«ã€ããŠã¯ãäŸãã° 1~2 幎åŸããã®å
ãèããŠããªã°ã¬ãã·ã§ã³ãã¹ããèªååãããŠããã¹ããåŠãã§èšããšãã¯ã Yes ã§ãã ãŸããå¥ã®èгç¹ãšããŠãçŸåšã¯ããã 2 人㮠QA ãšã³ãžãã¢ã«å¯ŸããŠãè€æ°ã®ãããã¯ããååšããŠããç¶æ³ã§ãQA ãšã³ãžãã¢ãã¢ãµã€ã³ãããŠããªããããã¯ããå€ããããŸãã ç§èªèº«ãæšå¹Ž 10 æããã¢ããªã»åºç€ããŒã ã«ç°åããããšããããä»åŸã«ã€ããŠããŸãäœå¶ãå€ãã£ãŠããããšã¯ååã«èããããŸããã ãããªç¶æ³äžã§ã¯ã仮㫠UI ãã¹ããèªååããç°å¢ãçšæã§ãããšããŠããã®åŸã«æ
åœè
ãäžåšã«ãªã£ãå Žåãèæ
®ããŠããå¿
èŠããããŸãïŒèªåãã¹ãã«ãããŠãæ
åœãäžåšã«ãªã£ãããšã§ã¡ã³ããããªããªã圢骞åããã±ãŒã¹ã¯ãããã話ã§ãïŒã ãã®ãããä»®ã«å®è£
è
ãäžåšãšãªã£ãåŸã§ã誰ãã«åŒãç¶ããããããŸããšã³ãžãã¢ä»¥å€ã§ãéçšã§ããç°å¢ãæãŸãããšèããŸããããããã£ã芳ç¹ã§ããŒã«ãšããŠã¯åºæ¬ããŒã³ãŒãã§ãã¡ã³ãã§ãã Magic Pod ã¯æåãªåè£ãšãªããŸããã ãããããŸãšãããšã以äžã®ãããªçµè«ã«è³ããŸããã ãã¹ãã®èªååã¯æšé²ããæ¹ãè¯ã ãã ããä»ã®ã¡ã³ãã§ãã¡ã³ãããããç°å¢ãéžå®ãã ãã ã QA ãšããŠããã¹ãäºã沢山ããäžã§ããã¹ãèªååã ãã«å°å¿µã§ããç¶æ³ã§ã¯ãããŸããã ãã®ãããªãã¹ãä»ã¿ã¹ã¯ãšäžŠè¡ããŠå°ã³ã¹ãã§é²ããããäºãéèŠãªèŠçŽ ã§ããã èªååããã UI ãã¹ãã¯å
šããªãäºããä»ã®ãã¹ãã®å¯åºŠãéã¿ããšããªãã¹ãæ©ã段éã§äžå®ã®èªåãã¹ãç°å¢ã¯çšæããããšããæ³ãããããŸããã ãããã®ç¶æ³ãèžãŸããããŒã«ãéžå®ã»ãã©ã€ã¢ã«ããŠã¿ãçµæãMagic Pod ãå°å
¥ããããšã«æ±ºããŸããã Magic Pod ã®çŽ¹ä» Magic Pod ã«ã€ããŠããµãŒãã¹èªäœã®è©³çްã¯å²æããŸããã端çã«ãããšã¯ã©ãŠãç°å¢ã〠GUI ãã UI ãã¹ãã®å®è£
åã³å®è¡ãè¡ãããšãã§ããããŒã«ã§ãã GUI ã§èªåãã¹ããå®è£
ã§ããããŒã«ã ãšã Autify ãªã©ãæåã§ãã Autify ã¯ãã©ãŠã¶åãã®ããŒã«ã§ãããå®è£
æ¹æ³ã¯ Magic Pod ãšã¯å°ãç°ãªããæäœãã¬ã³ãŒãã£ã³ã°ããŠãã¹ãã·ããªãªãèªåã§çæããã圢ãåºæ¬ã§ãã äžæ¹ãMagic Pod ã¯ä»¥äžã®ããã«ã¢ããªã®ç»é¢ããŸããã£ããã£ã§åã蟌ã¿ããããããã¹ãã§äœ¿ãããé
ç®ãéžæããã·ããªãªã«ãã©ãã°ã¢ã³ãããããããŠããããšã§ãã¹ãã·ããªãªãçæããããšãã§ããŸãã ãã°ã€ã³ãªã©ãè€æ°ã®ãã¹ãã§äœ¿ãéšåã¯å
±éåããŠãããŸãã ãã¹ã察象ã iOS ã¢ããªã§ããããšãAndroid ã¢ããªããã©ãŠã¶ã§ããããšåºæ¬çã«åã I/F ãããã¹ãã®çæã»ã¡ã³ããåºæ¥ãããšã¯å€§ããªåŒ·ã¿ã®äžã€ã§ãã ãŸãããã¹ãã§äœ¿çšãããã£ãŒã«ãã®èŠçŽ ãéžæå¯èœãªããšããç¶æ
å€åã«åŒ·ããã¹ããšããäžã§ã®åŒ·ã¿ãšãªããŸãã äŸãã°ã調å€è¬å±åã§ãããããšããããã¹ããã£ãŒã«ãã«å¯ŸããŠããã®ããã¹ãã䜿ãã®ããID ãªã®ããããã¹ããã£ãŒã«ããªã®ã xpath ãªã®ããšãã£ãæã§ãã ãã®ããã ããã¹ããé »ç¹ã«å€ãããããªå ŽæïŒäŸãã°æ¥ä»ãªã©ïŒã§ã¯ããã¹ãã䜿ããªã ã¢ããªå
éšã§ãªãã¡ã¯ã¿ãªã³ã°ãªã©ãåããŠããå Žåã§ããã°éã« ID ã¯å€ããå¯èœæ§ãé«ããããããã¹ãã§æå®ãã UI ãã¹ããäœã蟌ãäžã§ã¯åœç¶ã®ããšã§ã¯ãããŸãããäžèšã®ãããªå·¥å€«ã«ãããã¹ãã®æåçãäžããããšãã§ããŸãã å°å
¥ããŠã¿ãŠ ãã©ã€ã¢ã«äžã¯æ¢ããªããã®éšåã¯ãã£ããã®ã®ãæ
£ãããšå®è£
å·¥æ°ã¯éåžžã«çæéã§å®è£
ã§ããããŒã¿ã«ã§ã iOS ã§ 2 3 é±éïŒãªã³ããŒãã£ã³ã°å«ãïŒãAndroid ã® UI ãã¹ãã«ã€ããŠã¯å®è³ª 2 3 æ¥ã§åºæ¬çãªãã¹ãã·ããªãªã®èªååãè¡ãäºãã§ããŸããã ãã®åŸãéçšããªããèœã¡ããããã¹ãã®æ¹ä¿®ãè¡ã£ãããéçšãå®å®ããŠãã㯠CI ã«ã飿ºããŠããŸãã UI ãã¹ãã®éçšã«ãããŠã¯å®æçã«å®è¡ããããšã¯éåžžã«éèŠãªããšã§ãããMagic Pod ã®å ŽåãBitrise ã§ã¯ UI äžããèšå®ã§ããCircle CI ã«å¯ŸããŠãããã¥ã¡ã³ããåç
§ããªããæ¯èŒç容æã«èšå®ã§ããŸãã å®éãæšå¹Ž 1 ã¯ã©ãŒã¿ãŒéçšããŠã¿ãŠã幟ã€ãã®ã¯ã©ãã·ã¥ããªãªãŒã¹åã«æ€ç¥ããŠãããŸããã ãŸããç§èªèº«ãéå»ã«ã¯ XCTest ã«ããã UITest( Testing Your Apps in Xcode )ã Appium ã䜿ã£ãŠ UI ãã¹ããéçšããŠããããã以äžã§ã¯ãããä»ããŒã«ãšã®æ¯èŒãå«ããŠç޹ä»ããŠã¿ãããšæããŸãã å®è£
ã³ã¹ã å®è£
ã³ã¹ãã«ãåææ§ç¯ãšããã®åŸã®ã¡ã³ãã³ã¹ãã§åãããŸãããä»ã®ããŒã«ãšæ¯èŒããŠã倧ããç°ãªãã®ã¯åææ§ç¯ã³ã¹ãã ãšæããŸãã Magic Pod ã«ã€ããŠã¯ç°å¢æ§ç¯ã³ã¹ãã¯éåžžã«äœã³ã¹ãã§è¡ãããšãã§ããŸãïŒåºæ¬çãªéšå㯠1 æ¥ããã°ååã ãšæããŸãïŒã ãŸããã¹ãã®ã¬ããŒãã£ã³ã°ããã£ããã£æ©èœãªã©ãæšæºã§ä»ããŠããŸãã®ã§ããã®èŸºããèªåã§é 匵ãå¿
èŠã¯ãããŸããã æ¬¡ã«ã¡ã³ãã³ã¹ãã§ãããäŸãã° XCUITest ã§ã¯ãŸããã«ããè¡ããdebug ããŠåãã¿ã³ãªã©ã®èŠçŽ ã® ID ãªã©ã確èªããããããçšããŠã³ãŒãã£ã³ã°ããŠããŸããã Magic Pod ã§ã¯äžåºŠã¢ããªãã¢ããããŒãããŠãã¹ãã£ã³ããããšã§ç»é¢ã®èŠçŽ ãäžæ¬ã§ååŸã§ãããã®äžããæäœãããèŠçŽ ãéžæããããšãã§ããŸãã ãã®ãããã¡ããã³ã¹ãã¯ã ãã¶äžãããŸãããã ããã®éšåã«ã€ããŠã¯ä»ã®ããŒã«ãèšèªã§ãæ
£ããã°ããæéã¯ããããªãã®ã§ãããããã倧差ãªããããããŸããã ãããŠèšããš debug ã§ ID ã確èªããæéãæ¥œã«ãªããå®è£
ãããã¹ãã詊ããŠå®è¡ããã®ã容æïŒãã«ãåŸ
ã¡ã®æéããªãïŒãšãã£ã蟺ãã§ããããã éçšã³ã¹ã UI ãã¹ããšããã° Flaky ãªãã¹ãïŒèœã¡ããèœã¡ãªãã£ãããããã¹ãïŒã«æ©ãŸãããããšã¯å€ãã§ãããéçšããŠã¿ããšæåã®å
ã¯ãããã£ãããšããããŸããããçŸç¶ã§ã¯ã»ãŒèµ·ããŠããŸããã ãã㯠Magic Pod ã«éã£ã話ã§ã¯ãããŸãããã ã¯ã©ãŠãäžã§å®è¡ãããããšã§ç°å¢èŠå ã§èœã¡ãããšã¯çš èœã¡ãæã«ã¯èªåã§ãªãã©ã€ããã ãã«ãã CI äžã§å®è¡ããŠãã å®è¡ã¯ã¡ã³ããæŽ»åããŠããªãæé垯ã«è¡ã£ãŠãã ãšãã£ã蟺ããèŠå ããšæããŸãã ãŸã Magic Pod ã®ãããªããŒã«ã䜿ã£ãŠããå Žåã«å©ããéšåãšããŠã¯ãXcode ãªã©ãUI ãã¹ãã«å¿
èŠãªããŒã«ã®ã¢ããããŒãã«å¯Ÿããã¡ã³ããäžèŠãšããããšãæããããŸãã éã«å°ãèŸãæ ãããŸã§ Magic Pod ã®è¯ãéšåãå€ãæžããŸããããéã«ãã®ãã㪠GUI ã§ã®ãã¹ãããŒã«ã䜿ãããšã§å°ãããèŸãç¹ã玹ä»ããŠãããããšæããŸãã 1. ãã¹ãã³ãŒãã®ã¬ãã¥ãŒ ãã¹ãã³ãŒãïŒã±ãŒã¹ïŒã¯ Magic Pod äžã§ç®¡çãããŠãããããPR ã¬ãã¥ãŒãªã©ã®ããã»ã¹ãè¡ãããšãã§ããŸããã ãã®ãããã±ãŒã¹ã®ä¿®æ£ã«å¯ŸããŠãåæ ãããåã«ã¬ãã¥ãŒããŠãããããå Žåã¯ããã¹ãã±ãŒã¹ãã³ããŒããŠããç·šéãããªã©å°ã工倫ãå¿
èŠã«ãªãããšæããŸãã çŸç¶ã§ã¯å°ãããšã¯ãããŸããããè€æ°äººã§åäžã®ãããžã§ã¯ãã«å¯ŸããŠéçšãããå Žåã¯å°ãç
©éã«ãªãããã§ãã 2. ãã¹ãã³ãŒãã®ç®¡ç èªåãã¹ãã«ãããŠããã¹ãçµæã«åœ±é¿ãåºã仿§å€æŽãå
¥ããããªå Žåã仿§å€æŽã«å¯Ÿãããã¹ãã³ãŒãã®ä¿®æ£ã¯éçºãšäžŠè¡ããŠçšæããŠããããããã¯ããžã®å€æŽãããŒãžãããã¿ã€ãã³ã°ã§åæã«ãã¹ãã³ãŒãã®ä¿®æ£ãããŒãžãããã±ãŒã¹ããããŸãã Magic Pod ã§ã¯ GitHub äžã§ãã¹ãã³ãŒãã管çããŠããªãããããã®ãããªã±ãŒã¹ãžã®å¯Ÿå¿ãèªåã§è¡ãããšãé£ãããäºããã¹ãã±ãŒã¹ãåããŠçšæããŠãããå®è£
ãããŒãžãããåŸã«æåã§çœ®ãæããããããŒãžãããåŸã«åœ±é¿ã®ãããã¹ãã±ãŒã¹ãä¿®æ£ãããšãã£ãæåã§ã®ããã»ã¹ãå¿
èŠã«ãªããŸãã çŸæç¹ã§æ°ã«ãªã£ãã®ã¯äžèšã® 2 ç¹ã§ãããããããä»åŸæ¹åãããŠããå¯èœæ§ã¯å€§ãã«ãããŸãããããã»ã¹ã®äžã§ã®å·¥å€«æ¬¡ç¬¬ã§å¯ŸåŠãå¯èœããšæããŸãã ãã®ä» åºæ¬çã« UI ãã¹ããèªååããäžã§æ°ãã€ããã¹ãããšãã¢ã³ããã¿ãŒã³ã¯ã©ããªããŒã«ã䜿ã£ãŠãåãã§ãã ä»ã®ããŒã«ã§ã¯é£ããããšãããã®ããŒã«ã§ã¯å®çŸåºæ¥ããšããããšãçšã§ãæã«ã¯ãããã¯ãåŽã§æãå
¥ããå¿
èŠããããŸãã ã©ããªããŒã«ã§ãããäœããã工倫ããã°éæåºæ¥ãããšãå€ããããéããåºãã®ã¯å®è£
ãéçšããªã³ããŒãã£ã³ã°çã®ã³ã¹ãéšåãæã倧ããã®ã§ã¯ãªãããšæããŠããŸãã åšå²ã®ãµããŒã ãã¹ãèªååãè¡ãå ŽåïŒã ãã§ã¯ãªãã§ããïŒãåšå²ã®çè§£ãåŸãããšã¯å€§äºãªéšåã§ãããããŒã ã¡ã³ãã¯çååãã§èå³ãæã£ãŠãããŠé²ããããç°å¢ã§ããã ç¹ã« CI 飿ºã®éšåã§ã¯ iOS/Android ã®éçºã®æ¹ã«ããµããŒãããŠããã ã倧å€å©ãããŸããã ãã㊠Magic Pod ã«ã€ããŠã¯ãæ°å¹ŽåããéçšããŠããæ ªåŒäŒç€Ÿãããã®æŠç°ããã«ãäºåã«è©±ã䌺ã£ããããªã³ããŒãã£ã³ã°äžã¯è³ªåãããŠããã ãããããŸããïŒããããšãããããŸããïŒïŒã ãŸã Magic Pod ã®äŒè€æ§ã«ã¯å°å
¥æãããã©ãã«ã·ã¥ãŒãã£ã³ã°ã«å€å€§ãªãµããŒããããã ããŠããŸãã Circle CI ã«å
¥ã蟌ãéã«ã¯ãã¡ãã£ãšè©°ãŸã£ãç¹ãããäŒè€æ§ãšã¡ãŒã«ã§ããåãããŠããã®ã§ããããã®æ¥ã®ãã¡ã« ããã¥ã¡ã³ã ãã¢ããããããã ãšããç°å¢äžã§äžæãªãšã©ãŒãåºãŠããŠçžè«ããéã«ã¯ãã¹ãã¢ãã CLINICS ã¢ããªãããŠã³ããŒãããŠè©ŠããŠããã ãããããšã«ãããã€ãè¿
éãã€ãäžå¯§ãªå¯Ÿå¿ãå°è±¡çã§ããã ãŸã QA ããŒã ããªããããªå°äººæ°ã®ç¶æ³ã§ã¯ããããã£ããã©ãã«ã«å¯ŸããŠçžè«ã§ããå
±ã«è§£æ±ºæ³ãæ¢ããæ¹ããããšããæå³ã§ãéåžžã«å¿åŒ·ãã§ãã ä»åŸã«ã€ã㊠ã¢ããªã® UI ãã¹ãã«ã€ããŠãæ¹åããŠããããããšã¯ãŸã ãŸã 沢山ããã®ã§ãããçŸç¶ã§ãåºæ¬çãªãã¹ãã¯çšæã§ããŠããããããã£ããè
°ãæ®ããŠæ¹åããŠãããããšèããŠããŸãã ãŸãçŸåšã¯ãã©ãŠã¶ã®ãã¹ãèªååãé²ããŠããŸããã¡ãã¬ãŒã® CLINICS 以å€ã®ãããã¯ãã®å€ã㯠Web ãã©ãŠã¶ããã©ãããã©ãŒã ãšããŠãããããWeb ã«ã€ããŠã¯ãããã¯ããè·šãã æŽ»åãè¡ã£ãŠãããã°ãšèããŠããŸãã é·ããªããŸããããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã https://www.medley.jp/jobs/
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã® QA ãšã³ãžãã¢ã®ç±³å±±ã§ãã䞻㫠CLINICS ã¢ããªã® QA ãæ
åœããŠããŸããã¡ãã¬ãŒã«ã¯ 2020 幎 8 æã«å
¥ç€ŸããŸããã ä»åã¯å
¥ç€ŸããŠãŸãè¡ã£ãããšã®äžã€ããªã°ã¬ãã·ã§ã³ãã¹ãã®èªååãšããã®ããã«å°å
¥ãã Magic Pod ãšããããŒã«ã«ã€ããŠãçµç·¯ãå°å
¥ããŠã¿ãçµæãã玹ä»ããããšæããŸãã CLINICS ãšã¯ ç§ã®æå±ããããŒã ã§éçºããŠãã CLINICS ãšãããããã¯ãã¯ã¢ããªã§ãªã³ã©ã€ã³èšºçããã¯ãªããã¯ã»ç
é¢ããåŠæ¹ç®ãçºè¡ããŠãããããšãã§ãããªã³ã©ã€ã³äžã§èšºå¯ãããè¬ã®åãåããŸã§å®çµã§ãããµãŒãã¹ã§ãã ãã©ãããã©ãŒã 㯠iOS ãš Android ã®ãã€ãã£ãã¢ããªãããããåæ§ã®ãµãŒãã¹ã Web ãã©ãŠã¶ãããå©çšããããšãåºæ¥ãŸãã QAïŒãªãªãŒã¹åšãã®ç¶æ³ CLINICS ã®éçºçµç¹ã« QA ãšã³ãžãã¢ããžã§ã€ã³ããã®ã¯æšå¹ŽïŒ2020 幎ïŒã§ããããµãŒãã¹èªäœã¯ 2016 幎ã«ããŒã³ããããŠããŸãã æ¬çµç¹ã§ã¯ãªãªãŒã¹åã«è¡ããªã°ã¬ãã·ã§ã³ãã¹ãã«ã€ããŠã¯ãéçºã¡ã³ããäžå¿ã«ããŒã å
šäœã§è¡ãæåããããŸãã ã¢ããªã®ãªãªãŒã¹ã¯éé±ã§è¡ã£ãŠããããã®éœåºŠéçºã¡ã³ãèªèº«ã«ãã£ãŠãã¹ããè¡ãããŠããŸããããèªååããã UI ãã¹ãã¯ååšããŠããŸããã§ããã ã¡ãã¬ãŒã§ã¯ QA ãšã³ãžãã¢ããžã§ã€ã³ããŠéããªããããããããããšã»ããã¹ãããšã¯å€å²ã«ãããäžã§ãŸãäœããçæããã¹ããæ€èšããŸããã QA ããã»ã¹ã®çå®ã»æ¹åãããæ°æ©èœããªãªãŒã¹ãŸã§æšé²ããããã® QA 掻åãããã䞊è¡ããŠå¹Ÿã€ãåããŠããäžã§ãã¹ãèªååãã©ã®ã¿ã€ãã³ã°ã§ãã©ããã£ãŠã¹ã¿ãŒããããæ©ã¿ãŸããã ããªã¥ãŒããèãã ã¡ãã¬ãŒã®ããªã¥ãŒã¯ãã®äžã€ã§ãããããã®ããªã¥ãŒèŠç¹ã§èããŠã¿ãŸããã ãå¡äºåŸ¹åºããšããŠããªãªãŒã¹åã®ãªã°ã¬ãã·ã§ã³ãã¹ãããã£ããè¡ãããšã¯åœç¶ã®ããšãšããŠèããããŸãã ãäžå€®çªç Žãã®èŠç¹ã§ã¯ã©ãããšèãããšããã¯ããã¹ãããã»ã¹ã«ãããŠãç¹ã«ãªãªãŒã¹æ¯ã«ç¹°ãè¿ãäœæ¥ãšãªããªã°ã¬ãã·ã§ã³ãã¹ããèªååããããšã¯çéã§ããããã¹ããã©ã¯ãã£ã¹ã®äžã€ã ãšèããããŸãã ãã®ããèªååã¯åªå
床é«ãé²ããã¹ãã§ã¯ãããŸãã æ®ãäžã€ãæªæ¥å¿åãã«ã€ããŠã¯ãäŸãã° 1~2 幎åŸããã®å
ãèããŠããªã°ã¬ãã·ã§ã³ãã¹ããèªååãããŠããã¹ããåŠãã§èšããšãã¯ã Yes ã§ãã ãŸããå¥ã®èгç¹ãšããŠãçŸåšã¯ããã 2 人㮠QA ãšã³ãžãã¢ã«å¯ŸããŠãè€æ°ã®ãããã¯ããååšããŠããç¶æ³ã§ãQA ãšã³ãžãã¢ãã¢ãµã€ã³ãããŠããªããããã¯ããå€ããããŸãã ç§èªèº«ãæšå¹Ž 10 æããã¢ããªã»åºç€ããŒã ã«ç°åããããšããããä»åŸã«ã€ããŠããŸãäœå¶ãå€ãã£ãŠããããšã¯ååã«èããããŸããã ãããªç¶æ³äžã§ã¯ã仮㫠UI ãã¹ããèªååããç°å¢ãçšæã§ãããšããŠããã®åŸã«æ
åœè
ãäžåšã«ãªã£ãå Žåãèæ
®ããŠããå¿
èŠããããŸãïŒèªåãã¹ãã«ãããŠãæ
åœãäžåšã«ãªã£ãããšã§ã¡ã³ããããªããªã圢骞åããã±ãŒã¹ã¯ãããã話ã§ãïŒã ãã®ãããä»®ã«å®è£
è
ãäžåšãšãªã£ãåŸã§ã誰ãã«åŒãç¶ããããããŸããšã³ãžãã¢ä»¥å€ã§ãéçšã§ããç°å¢ãæãŸãããšèããŸããããããã£ã芳ç¹ã§ããŒã«ãšããŠã¯åºæ¬ããŒã³ãŒãã§ãã¡ã³ãã§ãã Magic Pod ã¯æåãªåè£ãšãªããŸããã ãããããŸãšãããšã以äžã®ãããªçµè«ã«è³ããŸããã ãã¹ãã®èªååã¯æšé²ããæ¹ãè¯ã ãã ããä»ã®ã¡ã³ãã§ãã¡ã³ãããããç°å¢ãéžå®ãã ãã ã QA ãšããŠããã¹ãäºã沢山ããäžã§ããã¹ãèªååã ãã«å°å¿µã§ããç¶æ³ã§ã¯ãããŸããã ãã®ãããªãã¹ãä»ã¿ã¹ã¯ãšäžŠè¡ããŠå°ã³ã¹ãã§é²ããããäºãéèŠãªèŠçŽ ã§ããã èªååããã UI ãã¹ãã¯å
šããªãäºããä»ã®ãã¹ãã®å¯åºŠãéã¿ããšããªãã¹ãæ©ã段éã§äžå®ã®èªåãã¹ãç°å¢ã¯çšæããããšããæ³ãããããŸããã ãããã®ç¶æ³ãèžãŸããããŒã«ãéžå®ã»ãã©ã€ã¢ã«ããŠã¿ãçµæãMagic Pod ãå°å
¥ããããšã«æ±ºããŸããã Magic Pod ã®çŽ¹ä» Magic Pod ã«ã€ããŠããµãŒãã¹èªäœã®è©³çްã¯å²æããŸããã端çã«ãããšã¯ã©ãŠãç°å¢ã〠GUI ãã UI ãã¹ãã®å®è£
åã³å®è¡ãè¡ãããšãã§ããããŒã«ã§ãã GUI ã§èªåãã¹ããå®è£
ã§ããããŒã«ã ãšã Autify ãªã©ãæåã§ãã Autify ã¯ãã©ãŠã¶åãã®ããŒã«ã§ãããå®è£
æ¹æ³ã¯ Magic Pod ãšã¯å°ãç°ãªããæäœãã¬ã³ãŒãã£ã³ã°ããŠãã¹ãã·ããªãªãèªåã§çæããã圢ãåºæ¬ã§ãã äžæ¹ãMagic Pod ã¯ä»¥äžã®ããã«ã¢ããªã®ç»é¢ããŸããã£ããã£ã§åã蟌ã¿ããããããã¹ãã§äœ¿ãããé
ç®ãéžæããã·ããªãªã«ãã©ãã°ã¢ã³ãããããããŠããããšã§ãã¹ãã·ããªãªãçæããããšãã§ããŸãã ãã°ã€ã³ãªã©ãè€æ°ã®ãã¹ãã§äœ¿ãéšåã¯å
±éåããŠãããŸãã ãã¹ã察象ã iOS ã¢ããªã§ããããšãAndroid ã¢ããªããã©ãŠã¶ã§ããããšåºæ¬çã«åã I/F ãããã¹ãã®çæã»ã¡ã³ããåºæ¥ãããšã¯å€§ããªåŒ·ã¿ã®äžã€ã§ãã ãŸãããã¹ãã§äœ¿çšãããã£ãŒã«ãã®èŠçŽ ãéžæå¯èœãªããšããç¶æ
å€åã«åŒ·ããã¹ããšããäžã§ã®åŒ·ã¿ãšãªããŸãã äŸãã°ã調å€è¬å±åã§ãããããšããããã¹ããã£ãŒã«ãã«å¯ŸããŠããã®ããã¹ãã䜿ãã®ããID ãªã®ããããã¹ããã£ãŒã«ããªã®ã xpath ãªã®ããšãã£ãæã§ãã ãã®ããã ããã¹ããé »ç¹ã«å€ãããããªå ŽæïŒäŸãã°æ¥ä»ãªã©ïŒã§ã¯ããã¹ãã䜿ããªã ã¢ããªå
éšã§ãªãã¡ã¯ã¿ãªã³ã°ãªã©ãåããŠããå Žåã§ããã°éã« ID ã¯å€ããå¯èœæ§ãé«ããããããã¹ãã§æå®ãã UI ãã¹ããäœã蟌ãäžã§ã¯åœç¶ã®ããšã§ã¯ãããŸãããäžèšã®ãããªå·¥å€«ã«ãããã¹ãã®æåçãäžããããšãã§ããŸãã å°å
¥ããŠã¿ãŠ ãã©ã€ã¢ã«äžã¯æ¢ããªããã®éšåã¯ãã£ããã®ã®ãæ
£ãããšå®è£
å·¥æ°ã¯éåžžã«çæéã§å®è£
ã§ããããŒã¿ã«ã§ã iOS ã§ 2 3 é±éïŒãªã³ããŒãã£ã³ã°å«ãïŒãAndroid ã® UI ãã¹ãã«ã€ããŠã¯å®è³ª 2 3 æ¥ã§åºæ¬çãªãã¹ãã·ããªãªã®èªååãè¡ãäºãã§ããŸããã ãã®åŸãéçšããªããèœã¡ããããã¹ãã®æ¹ä¿®ãè¡ã£ãããéçšãå®å®ããŠãã㯠CI ã«ã飿ºããŠããŸãã UI ãã¹ãã®éçšã«ãããŠã¯å®æçã«å®è¡ããããšã¯éåžžã«éèŠãªããšã§ãããMagic Pod ã®å ŽåãBitrise ã§ã¯ UI äžããèšå®ã§ããCircle CI ã«å¯ŸããŠãããã¥ã¡ã³ããåç
§ããªããæ¯èŒç容æã«èšå®ã§ããŸãã å®éãæšå¹Ž 1 ã¯ã©ãŒã¿ãŒéçšããŠã¿ãŠã幟ã€ãã®ã¯ã©ãã·ã¥ããªãªãŒã¹åã«æ€ç¥ããŠãããŸããã ãŸããç§èªèº«ãéå»ã«ã¯ XCTest ã«ããã UITest( Testing Your Apps in Xcode )ã Appium ã䜿ã£ãŠ UI ãã¹ããéçšããŠããããã以äžã§ã¯ãããä»ããŒã«ãšã®æ¯èŒãå«ããŠç޹ä»ããŠã¿ãããšæããŸãã å®è£
ã³ã¹ã å®è£
ã³ã¹ãã«ãåææ§ç¯ãšããã®åŸã®ã¡ã³ãã³ã¹ãã§åãããŸãããä»ã®ããŒã«ãšæ¯èŒããŠã倧ããç°ãªãã®ã¯åææ§ç¯ã³ã¹ãã ãšæããŸãã Magic Pod ã«ã€ããŠã¯ç°å¢æ§ç¯ã³ã¹ãã¯éåžžã«äœã³ã¹ãã§è¡ãããšãã§ããŸãïŒåºæ¬çãªéšå㯠1 æ¥ããã°ååã ãšæããŸãïŒã ãŸããã¹ãã®ã¬ããŒãã£ã³ã°ããã£ããã£æ©èœãªã©ãæšæºã§ä»ããŠããŸãã®ã§ããã®èŸºããèªåã§é 匵ãå¿
èŠã¯ãããŸããã æ¬¡ã«ã¡ã³ãã³ã¹ãã§ãããäŸãã° XCUITest ã§ã¯ãŸããã«ããè¡ããdebug ããŠåãã¿ã³ãªã©ã®èŠçŽ ã® ID ãªã©ã確èªããããããçšããŠã³ãŒãã£ã³ã°ããŠããŸããã Magic Pod ã§ã¯äžåºŠã¢ããªãã¢ããããŒãããŠãã¹ãã£ã³ããããšã§ç»é¢ã®èŠçŽ ãäžæ¬ã§ååŸã§ãããã®äžããæäœãããèŠçŽ ãéžæããããšãã§ããŸãã ãã®ãããã¡ããã³ã¹ãã¯ã ãã¶äžãããŸãããã ããã®éšåã«ã€ããŠã¯ä»ã®ããŒã«ãèšèªã§ãæ
£ããã°ããæéã¯ããããªãã®ã§ãããããã倧差ãªããããããŸããã ãããŠèšããš debug ã§ ID ã確èªããæéãæ¥œã«ãªããå®è£
ãããã¹ãã詊ããŠå®è¡ããã®ã容æïŒãã«ãåŸ
ã¡ã®æéããªãïŒãšãã£ã蟺ãã§ããããã éçšã³ã¹ã UI ãã¹ããšããã° Flaky ãªãã¹ãïŒèœã¡ããèœã¡ãªãã£ãããããã¹ãïŒã«æ©ãŸãããããšã¯å€ãã§ãããéçšããŠã¿ããšæåã®å
ã¯ãããã£ãããšããããŸããããçŸç¶ã§ã¯ã»ãŒèµ·ããŠããŸããã ãã㯠Magic Pod ã«éã£ã話ã§ã¯ãããŸãããã ã¯ã©ãŠãäžã§å®è¡ãããããšã§ç°å¢èŠå ã§èœã¡ãããšã¯çš èœã¡ãæã«ã¯èªåã§ãªãã©ã€ããã ãã«ãã CI äžã§å®è¡ããŠãã å®è¡ã¯ã¡ã³ããæŽ»åããŠããªãæé垯ã«è¡ã£ãŠãã ãšãã£ã蟺ããèŠå ããšæããŸãã ãŸã Magic Pod ã®ãããªããŒã«ã䜿ã£ãŠããå Žåã«å©ããéšåãšããŠã¯ãXcode ãªã©ãUI ãã¹ãã«å¿
èŠãªããŒã«ã®ã¢ããããŒãã«å¯Ÿããã¡ã³ããäžèŠãšããããšãæããããŸãã éã«å°ãèŸãæ ãããŸã§ Magic Pod ã®è¯ãéšåãå€ãæžããŸããããéã«ãã®ãã㪠GUI ã§ã®ãã¹ãããŒã«ã䜿ãããšã§å°ãããèŸãç¹ã玹ä»ããŠãããããšæããŸãã 1. ãã¹ãã³ãŒãã®ã¬ãã¥ãŒ ãã¹ãã³ãŒãïŒã±ãŒã¹ïŒã¯ Magic Pod äžã§ç®¡çãããŠãããããPR ã¬ãã¥ãŒãªã©ã®ããã»ã¹ãè¡ãããšãã§ããŸããã ãã®ãããã±ãŒã¹ã®ä¿®æ£ã«å¯ŸããŠãåæ ãããåã«ã¬ãã¥ãŒããŠãããããå Žåã¯ããã¹ãã±ãŒã¹ãã³ããŒããŠããç·šéãããªã©å°ã工倫ãå¿
èŠã«ãªãããšæããŸãã çŸç¶ã§ã¯å°ãããšã¯ãããŸããããè€æ°äººã§åäžã®ãããžã§ã¯ãã«å¯ŸããŠéçšãããå Žåã¯å°ãç
©éã«ãªãããã§ãã 2. ãã¹ãã³ãŒãã®ç®¡ç èªåãã¹ãã«ãããŠããã¹ãçµæã«åœ±é¿ãåºã仿§å€æŽãå
¥ããããªå Žåã仿§å€æŽã«å¯Ÿãããã¹ãã³ãŒãã®ä¿®æ£ã¯éçºãšäžŠè¡ããŠçšæããŠããããããã¯ããžã®å€æŽãããŒãžãããã¿ã€ãã³ã°ã§åæã«ãã¹ãã³ãŒãã®ä¿®æ£ãããŒãžãããã±ãŒã¹ããããŸãã Magic Pod ã§ã¯ GitHub äžã§ãã¹ãã³ãŒãã管çããŠããªãããããã®ãããªã±ãŒã¹ãžã®å¯Ÿå¿ãèªåã§è¡ãããšãé£ãããäºããã¹ãã±ãŒã¹ãåããŠçšæããŠãããå®è£
ãããŒãžãããåŸã«æåã§çœ®ãæããããããŒãžãããåŸã«åœ±é¿ã®ãããã¹ãã±ãŒã¹ãä¿®æ£ãããšãã£ãæåã§ã®ããã»ã¹ãå¿
èŠã«ãªããŸãã çŸæç¹ã§æ°ã«ãªã£ãã®ã¯äžèšã® 2 ç¹ã§ãããããããä»åŸæ¹åãããŠããå¯èœæ§ã¯å€§ãã«ãããŸãããããã»ã¹ã®äžã§ã®å·¥å€«æ¬¡ç¬¬ã§å¯ŸåŠãå¯èœããšæããŸãã ãã®ä» åºæ¬çã« UI ãã¹ããèªååããäžã§æ°ãã€ããã¹ãããšãã¢ã³ããã¿ãŒã³ã¯ã©ããªããŒã«ã䜿ã£ãŠãåãã§ãã ä»ã®ããŒã«ã§ã¯é£ããããšãããã®ããŒã«ã§ã¯å®çŸåºæ¥ããšããããšãçšã§ãæã«ã¯ãããã¯ãåŽã§æãå
¥ããå¿
èŠããããŸãã ã©ããªããŒã«ã§ãããäœããã工倫ããã°éæåºæ¥ãããšãå€ããããéããåºãã®ã¯å®è£
ãéçšããªã³ããŒãã£ã³ã°çã®ã³ã¹ãéšåãæã倧ããã®ã§ã¯ãªãããšæããŠããŸãã åšå²ã®ãµããŒã ãã¹ãèªååãè¡ãå ŽåïŒã ãã§ã¯ãªãã§ããïŒãåšå²ã®çè§£ãåŸãããšã¯å€§äºãªéšåã§ãããããŒã ã¡ã³ãã¯çååãã§èå³ãæã£ãŠãããŠé²ããããç°å¢ã§ããã ç¹ã« CI 飿ºã®éšåã§ã¯ iOS/Android ã®éçºã®æ¹ã«ããµããŒãããŠããã ã倧å€å©ãããŸããã ãã㊠Magic Pod ã«ã€ããŠã¯ãæ°å¹ŽåããéçšããŠããæ ªåŒäŒç€Ÿãããã®æŠç°ããã«ãäºåã«è©±ã䌺ã£ããããªã³ããŒãã£ã³ã°äžã¯è³ªåãããŠããã ãããããŸããïŒããããšãããããŸããïŒïŒã ãŸã Magic Pod ã®äŒè€æ§ã«ã¯å°å
¥æãããã©ãã«ã·ã¥ãŒãã£ã³ã°ã«å€å€§ãªãµããŒããããã ããŠããŸãã Circle CI ã«å
¥ã蟌ãéã«ã¯ãã¡ãã£ãšè©°ãŸã£ãç¹ãããäŒè€æ§ãšã¡ãŒã«ã§ããåãããŠããã®ã§ããããã®æ¥ã®ãã¡ã« ããã¥ã¡ã³ã ãã¢ããããããã ãšããç°å¢äžã§äžæãªãšã©ãŒãåºãŠããŠçžè«ããéã«ã¯ãã¹ãã¢ãã CLINICS ã¢ããªãããŠã³ããŒãããŠè©ŠããŠããã ãããããšã«ãããã€ãè¿
éãã€ãäžå¯§ãªå¯Ÿå¿ãå°è±¡çã§ããã ãŸã QA ããŒã ããªããããªå°äººæ°ã®ç¶æ³ã§ã¯ããããã£ããã©ãã«ã«å¯ŸããŠçžè«ã§ããå
±ã«è§£æ±ºæ³ãæ¢ããæ¹ããããšããæå³ã§ãéåžžã«å¿åŒ·ãã§ãã ä»åŸã«ã€ã㊠ã¢ããªã® UI ãã¹ãã«ã€ããŠãæ¹åããŠããããããšã¯ãŸã ãŸã 沢山ããã®ã§ãããçŸç¶ã§ãåºæ¬çãªãã¹ãã¯çšæã§ããŠããããããã£ããè
°ãæ®ããŠæ¹åããŠãããããšèããŠããŸãã ãŸãçŸåšã¯ãã©ãŠã¶ã®ãã¹ãèªååãé²ããŠããŸããã¡ãã¬ãŒã® CLINICS 以å€ã®ãããã¯ãã®å€ã㯠Web ãã©ãŠã¶ããã©ãããã©ãŒã ãšããŠãããããWeb ã«ã€ããŠã¯ãããã¯ããè·šãã æŽ»åãè¡ã£ãŠãããã°ãšèããŠããŸãã é·ããªããŸããããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã® QA ãšã³ãžãã¢ã®ç±³å±±ã§ãã䞻㫠CLINICS ã¢ããªã® QA ãæ
åœããŠããŸããã¡ãã¬ãŒã«ã¯ 2020 幎 8 æã«å
¥ç€ŸããŸããã ä»åã¯å
¥ç€ŸããŠãŸãè¡ã£ãããšã®äžã€ããªã°ã¬ãã·ã§ã³ãã¹ãã®èªååãšããã®ããã«å°å
¥ãã Magic Pod ãšããããŒã«ã«ã€ããŠãçµç·¯ãå°å
¥ããŠã¿ãçµæãã玹ä»ããããšæããŸãã CLINICS ãšã¯ ç§ã®æå±ããããŒã ã§éçºããŠãã CLINICS ãšãããããã¯ãã¯ã¢ããªã§ãªã³ã©ã€ã³èšºçããã¯ãªããã¯ã»ç
é¢ããåŠæ¹ç®ãçºè¡ããŠãããããšãã§ãããªã³ã©ã€ã³äžã§èšºå¯ãããè¬ã®åãåããŸã§å®çµã§ãããµãŒãã¹ã§ãã ãã©ãããã©ãŒã 㯠iOS ãš Android ã®ãã€ãã£ãã¢ããªãããããåæ§ã®ãµãŒãã¹ã Web ãã©ãŠã¶ãããå©çšããããšãåºæ¥ãŸãã QAïŒãªãªãŒã¹åšãã®ç¶æ³ CLINICS ã®éçºçµç¹ã« QA ãšã³ãžãã¢ããžã§ã€ã³ããã®ã¯æšå¹ŽïŒ2020 幎ïŒã§ããããµãŒãã¹èªäœã¯ 2016 幎ã«ããŒã³ããããŠããŸãã æ¬çµç¹ã§ã¯ãªãªãŒã¹åã«è¡ããªã°ã¬ãã·ã§ã³ãã¹ãã«ã€ããŠã¯ãéçºã¡ã³ããäžå¿ã«ããŒã å
šäœã§è¡ãæåããããŸãã ã¢ããªã®ãªãªãŒã¹ã¯éé±ã§è¡ã£ãŠããããã®éœåºŠéçºã¡ã³ãèªèº«ã«ãã£ãŠãã¹ããè¡ãããŠããŸããããèªååããã UI ãã¹ãã¯ååšããŠããŸããã§ããã ã¡ãã¬ãŒã§ã¯ QA ãšã³ãžãã¢ããžã§ã€ã³ããŠéããªããããããããããšã»ããã¹ãããšã¯å€å²ã«ãããäžã§ãŸãäœããçæããã¹ããæ€èšããŸããã QA ããã»ã¹ã®çå®ã»æ¹åãããæ°æ©èœããªãªãŒã¹ãŸã§æšé²ããããã® QA 掻åãããã䞊è¡ããŠå¹Ÿã€ãåããŠããäžã§ãã¹ãèªååãã©ã®ã¿ã€ãã³ã°ã§ãã©ããã£ãŠã¹ã¿ãŒããããæ©ã¿ãŸããã ããªã¥ãŒããèãã ã¡ãã¬ãŒã®ããªã¥ãŒã¯ãã®äžã€ã§ãããããã®ããªã¥ãŒèŠç¹ã§èããŠã¿ãŸããã ãå¡äºåŸ¹åºããšããŠããªãªãŒã¹åã®ãªã°ã¬ãã·ã§ã³ãã¹ãããã£ããè¡ãããšã¯åœç¶ã®ããšãšããŠèããããŸãã ãäžå€®çªç Žãã®èŠç¹ã§ã¯ã©ãããšèãããšããã¯ããã¹ãããã»ã¹ã«ãããŠãç¹ã«ãªãªãŒã¹æ¯ã«ç¹°ãè¿ãäœæ¥ãšãªããªã°ã¬ãã·ã§ã³ãã¹ããèªååããããšã¯çéã§ããããã¹ããã©ã¯ãã£ã¹ã®äžã€ã ãšèããããŸãã ãã®ããèªååã¯åªå
床é«ãé²ããã¹ãã§ã¯ãããŸãã æ®ãäžã€ãæªæ¥å¿åãã«ã€ããŠã¯ãäŸãã° 1~2 幎åŸããã®å
ãèããŠããªã°ã¬ãã·ã§ã³ãã¹ããèªååãããŠããã¹ããåŠãã§èšããšãã¯ã Yes ã§ãã ãŸããå¥ã®èгç¹ãšããŠãçŸåšã¯ããã 2 人㮠QA ãšã³ãžãã¢ã«å¯ŸããŠãè€æ°ã®ãããã¯ããååšããŠããç¶æ³ã§ãQA ãšã³ãžãã¢ãã¢ãµã€ã³ãããŠããªããããã¯ããå€ããããŸãã ç§èªèº«ãæšå¹Ž 10 æããã¢ããªã»åºç€ããŒã ã«ç°åããããšããããä»åŸã«ã€ããŠããŸãäœå¶ãå€ãã£ãŠããããšã¯ååã«èããããŸããã ãããªç¶æ³äžã§ã¯ã仮㫠UI ãã¹ããèªååããç°å¢ãçšæã§ãããšããŠããã®åŸã«æ
åœè
ãäžåšã«ãªã£ãå Žåãèæ
®ããŠããå¿
èŠããããŸãïŒèªåãã¹ãã«ãããŠãæ
åœãäžåšã«ãªã£ãããšã§ã¡ã³ããããªããªã圢骞åããã±ãŒã¹ã¯ãããã話ã§ãïŒã ãã®ãããä»®ã«å®è£
è
ãäžåšãšãªã£ãåŸã§ã誰ãã«åŒãç¶ããããããŸããšã³ãžãã¢ä»¥å€ã§ãéçšã§ããç°å¢ãæãŸãããšèããŸããããããã£ã芳ç¹ã§ããŒã«ãšããŠã¯åºæ¬ããŒã³ãŒãã§ãã¡ã³ãã§ãã Magic Pod ã¯æåãªåè£ãšãªããŸããã ãããããŸãšãããšã以äžã®ãããªçµè«ã«è³ããŸããã ãã¹ãã®èªååã¯æšé²ããæ¹ãè¯ã ãã ããä»ã®ã¡ã³ãã§ãã¡ã³ãããããç°å¢ãéžå®ãã ãã ã QA ãšããŠããã¹ãäºã沢山ããäžã§ããã¹ãèªååã ãã«å°å¿µã§ããç¶æ³ã§ã¯ãããŸããã ãã®ãããªãã¹ãä»ã¿ã¹ã¯ãšäžŠè¡ããŠå°ã³ã¹ãã§é²ããããäºãéèŠãªèŠçŽ ã§ããã èªååããã UI ãã¹ãã¯å
šããªãäºããä»ã®ãã¹ãã®å¯åºŠãéã¿ããšããªãã¹ãæ©ã段éã§äžå®ã®èªåãã¹ãç°å¢ã¯çšæããããšããæ³ãããããŸããã ãããã®ç¶æ³ãèžãŸããããŒã«ãéžå®ã»ãã©ã€ã¢ã«ããŠã¿ãçµæãMagic Pod ãå°å
¥ããããšã«æ±ºããŸããã Magic Pod ã®çŽ¹ä» Magic Pod ã«ã€ããŠããµãŒãã¹èªäœã®è©³çްã¯å²æããŸããã端çã«ãããšã¯ã©ãŠãç°å¢ã〠GUI ãã UI ãã¹ãã®å®è£
åã³å®è¡ãè¡ãããšãã§ããããŒã«ã§ãã GUI ã§èªåãã¹ããå®è£
ã§ããããŒã«ã ãšã Autify ãªã©ãæåã§ãã Autify ã¯ãã©ãŠã¶åãã®ããŒã«ã§ãããå®è£
æ¹æ³ã¯ Magic Pod ãšã¯å°ãç°ãªããæäœãã¬ã³ãŒãã£ã³ã°ããŠãã¹ãã·ããªãªãèªåã§çæããã圢ãåºæ¬ã§ãã äžæ¹ãMagic Pod ã¯ä»¥äžã®ããã«ã¢ããªã®ç»é¢ããŸããã£ããã£ã§åã蟌ã¿ããããããã¹ãã§äœ¿ãããé
ç®ãéžæããã·ããªãªã«ãã©ãã°ã¢ã³ãããããããŠããããšã§ãã¹ãã·ããªãªãçæããããšãã§ããŸãã ãã°ã€ã³ãªã©ãè€æ°ã®ãã¹ãã§äœ¿ãéšåã¯å
±éåããŠãããŸãã ãã¹ã察象ã iOS ã¢ããªã§ããããšãAndroid ã¢ããªããã©ãŠã¶ã§ããããšåºæ¬çã«åã I/F ãããã¹ãã®çæã»ã¡ã³ããåºæ¥ãããšã¯å€§ããªåŒ·ã¿ã®äžã€ã§ãã ãŸãããã¹ãã§äœ¿çšãããã£ãŒã«ãã®èŠçŽ ãéžæå¯èœãªããšããç¶æ
å€åã«åŒ·ããã¹ããšããäžã§ã®åŒ·ã¿ãšãªããŸãã äŸãã°ã調å€è¬å±åã§ãããããšããããã¹ããã£ãŒã«ãã«å¯ŸããŠããã®ããã¹ãã䜿ãã®ããID ãªã®ããããã¹ããã£ãŒã«ããªã®ã xpath ãªã®ããšãã£ãæã§ãã ãã®ããã ããã¹ããé »ç¹ã«å€ãããããªå ŽæïŒäŸãã°æ¥ä»ãªã©ïŒã§ã¯ããã¹ãã䜿ããªã ã¢ããªå
éšã§ãªãã¡ã¯ã¿ãªã³ã°ãªã©ãåããŠããå Žåã§ããã°éã« ID ã¯å€ããå¯èœæ§ãé«ããããããã¹ãã§æå®ãã UI ãã¹ããäœã蟌ãäžã§ã¯åœç¶ã®ããšã§ã¯ãããŸãããäžèšã®ãããªå·¥å€«ã«ãããã¹ãã®æåçãäžããããšãã§ããŸãã å°å
¥ããŠã¿ãŠ ãã©ã€ã¢ã«äžã¯æ¢ããªããã®éšåã¯ãã£ããã®ã®ãæ
£ãããšå®è£
å·¥æ°ã¯éåžžã«çæéã§å®è£
ã§ããããŒã¿ã«ã§ã iOS ã§ 2 3 é±éïŒãªã³ããŒãã£ã³ã°å«ãïŒãAndroid ã® UI ãã¹ãã«ã€ããŠã¯å®è³ª 2 3 æ¥ã§åºæ¬çãªãã¹ãã·ããªãªã®èªååãè¡ãäºãã§ããŸããã ãã®åŸãéçšããªããèœã¡ããããã¹ãã®æ¹ä¿®ãè¡ã£ãããéçšãå®å®ããŠãã㯠CI ã«ã飿ºããŠããŸãã UI ãã¹ãã®éçšã«ãããŠã¯å®æçã«å®è¡ããããšã¯éåžžã«éèŠãªããšã§ãããMagic Pod ã®å ŽåãBitrise ã§ã¯ UI äžããèšå®ã§ããCircle CI ã«å¯ŸããŠãããã¥ã¡ã³ããåç
§ããªããæ¯èŒç容æã«èšå®ã§ããŸãã å®éãæšå¹Ž 1 ã¯ã©ãŒã¿ãŒéçšããŠã¿ãŠã幟ã€ãã®ã¯ã©ãã·ã¥ããªãªãŒã¹åã«æ€ç¥ããŠãããŸããã ãŸããç§èªèº«ãéå»ã«ã¯ XCTest ã«ããã UITest( Testing Your Apps in Xcode )ã Appium ã䜿ã£ãŠ UI ãã¹ããéçšããŠããããã以äžã§ã¯ãããä»ããŒã«ãšã®æ¯èŒãå«ããŠç޹ä»ããŠã¿ãããšæããŸãã å®è£
ã³ã¹ã å®è£
ã³ã¹ãã«ãåææ§ç¯ãšããã®åŸã®ã¡ã³ãã³ã¹ãã§åãããŸãããä»ã®ããŒã«ãšæ¯èŒããŠã倧ããç°ãªãã®ã¯åææ§ç¯ã³ã¹ãã ãšæããŸãã Magic Pod ã«ã€ããŠã¯ç°å¢æ§ç¯ã³ã¹ãã¯éåžžã«äœã³ã¹ãã§è¡ãããšãã§ããŸãïŒåºæ¬çãªéšå㯠1 æ¥ããã°ååã ãšæããŸãïŒã ãŸããã¹ãã®ã¬ããŒãã£ã³ã°ããã£ããã£æ©èœãªã©ãæšæºã§ä»ããŠããŸãã®ã§ããã®èŸºããèªåã§é 匵ãå¿
èŠã¯ãããŸããã æ¬¡ã«ã¡ã³ãã³ã¹ãã§ãããäŸãã° XCUITest ã§ã¯ãŸããã«ããè¡ããdebug ããŠåãã¿ã³ãªã©ã®èŠçŽ ã® ID ãªã©ã確èªããããããçšããŠã³ãŒãã£ã³ã°ããŠããŸããã Magic Pod ã§ã¯äžåºŠã¢ããªãã¢ããããŒãããŠãã¹ãã£ã³ããããšã§ç»é¢ã®èŠçŽ ãäžæ¬ã§ååŸã§ãããã®äžããæäœãããèŠçŽ ãéžæããããšãã§ããŸãã ãã®ãããã¡ããã³ã¹ãã¯ã ãã¶äžãããŸãããã ããã®éšåã«ã€ããŠã¯ä»ã®ããŒã«ãèšèªã§ãæ
£ããã°ããæéã¯ããããªãã®ã§ãããããã倧差ãªããããããŸããã ãããŠèšããš debug ã§ ID ã確èªããæéãæ¥œã«ãªããå®è£
ãããã¹ãã詊ããŠå®è¡ããã®ã容æïŒãã«ãåŸ
ã¡ã®æéããªãïŒãšãã£ã蟺ãã§ããããã éçšã³ã¹ã UI ãã¹ããšããã° Flaky ãªãã¹ãïŒèœã¡ããèœã¡ãªãã£ãããããã¹ãïŒã«æ©ãŸãããããšã¯å€ãã§ãããéçšããŠã¿ããšæåã®å
ã¯ãããã£ãããšããããŸããããçŸç¶ã§ã¯ã»ãŒèµ·ããŠããŸããã ãã㯠Magic Pod ã«éã£ã話ã§ã¯ãããŸãããã ã¯ã©ãŠãäžã§å®è¡ãããããšã§ç°å¢èŠå ã§èœã¡ãããšã¯çš èœã¡ãæã«ã¯èªåã§ãªãã©ã€ããã ãã«ãã CI äžã§å®è¡ããŠãã å®è¡ã¯ã¡ã³ããæŽ»åããŠããªãæé垯ã«è¡ã£ãŠãã ãšãã£ã蟺ããèŠå ããšæããŸãã ãŸã Magic Pod ã®ãããªããŒã«ã䜿ã£ãŠããå Žåã«å©ããéšåãšããŠã¯ãXcode ãªã©ãUI ãã¹ãã«å¿
èŠãªããŒã«ã®ã¢ããããŒãã«å¯Ÿããã¡ã³ããäžèŠãšããããšãæããããŸãã éã«å°ãèŸãæ ãããŸã§ Magic Pod ã®è¯ãéšåãå€ãæžããŸããããéã«ãã®ãã㪠GUI ã§ã®ãã¹ãããŒã«ã䜿ãããšã§å°ãããèŸãç¹ã玹ä»ããŠãããããšæããŸãã 1. ãã¹ãã³ãŒãã®ã¬ãã¥ãŒ ãã¹ãã³ãŒãïŒã±ãŒã¹ïŒã¯ Magic Pod äžã§ç®¡çãããŠãããããPR ã¬ãã¥ãŒãªã©ã®ããã»ã¹ãè¡ãããšãã§ããŸããã ãã®ãããã±ãŒã¹ã®ä¿®æ£ã«å¯ŸããŠãåæ ãããåã«ã¬ãã¥ãŒããŠãããããå Žåã¯ããã¹ãã±ãŒã¹ãã³ããŒããŠããç·šéãããªã©å°ã工倫ãå¿
èŠã«ãªãããšæããŸãã çŸç¶ã§ã¯å°ãããšã¯ãããŸããããè€æ°äººã§åäžã®ãããžã§ã¯ãã«å¯ŸããŠéçšãããå Žåã¯å°ãç
©éã«ãªãããã§ãã 2. ãã¹ãã³ãŒãã®ç®¡ç èªåãã¹ãã«ãããŠããã¹ãçµæã«åœ±é¿ãåºã仿§å€æŽãå
¥ããããªå Žåã仿§å€æŽã«å¯Ÿãããã¹ãã³ãŒãã®ä¿®æ£ã¯éçºãšäžŠè¡ããŠçšæããŠããããããã¯ããžã®å€æŽãããŒãžãããã¿ã€ãã³ã°ã§åæã«ãã¹ãã³ãŒãã®ä¿®æ£ãããŒãžãããã±ãŒã¹ããããŸãã Magic Pod ã§ã¯ GitHub äžã§ãã¹ãã³ãŒãã管çããŠããªãããããã®ãããªã±ãŒã¹ãžã®å¯Ÿå¿ãèªåã§è¡ãããšãé£ãããäºããã¹ãã±ãŒã¹ãåããŠçšæããŠãããå®è£
ãããŒãžãããåŸã«æåã§çœ®ãæããããããŒãžãããåŸã«åœ±é¿ã®ãããã¹ãã±ãŒã¹ãä¿®æ£ãããšãã£ãæåã§ã®ããã»ã¹ãå¿
èŠã«ãªããŸãã çŸæç¹ã§æ°ã«ãªã£ãã®ã¯äžèšã® 2 ç¹ã§ãããããããä»åŸæ¹åãããŠããå¯èœæ§ã¯å€§ãã«ãããŸãããããã»ã¹ã®äžã§ã®å·¥å€«æ¬¡ç¬¬ã§å¯ŸåŠãå¯èœããšæããŸãã ãã®ä» åºæ¬çã« UI ãã¹ããèªååããäžã§æ°ãã€ããã¹ãããšãã¢ã³ããã¿ãŒã³ã¯ã©ããªããŒã«ã䜿ã£ãŠãåãã§ãã ä»ã®ããŒã«ã§ã¯é£ããããšãããã®ããŒã«ã§ã¯å®çŸåºæ¥ããšããããšãçšã§ãæã«ã¯ãããã¯ãåŽã§æãå
¥ããå¿
èŠããããŸãã ã©ããªããŒã«ã§ãããäœããã工倫ããã°éæåºæ¥ãããšãå€ããããéããåºãã®ã¯å®è£
ãéçšããªã³ããŒãã£ã³ã°çã®ã³ã¹ãéšåãæã倧ããã®ã§ã¯ãªãããšæããŠããŸãã åšå²ã®ãµããŒã ãã¹ãèªååãè¡ãå ŽåïŒã ãã§ã¯ãªãã§ããïŒãåšå²ã®çè§£ãåŸãããšã¯å€§äºãªéšåã§ãããããŒã ã¡ã³ãã¯çååãã§èå³ãæã£ãŠãããŠé²ããããç°å¢ã§ããã ç¹ã« CI 飿ºã®éšåã§ã¯ iOS/Android ã®éçºã®æ¹ã«ããµããŒãããŠããã ã倧å€å©ãããŸããã ãã㊠Magic Pod ã«ã€ããŠã¯ãæ°å¹ŽåããéçšããŠããæ ªåŒäŒç€Ÿãããã®æŠç°ããã«ãäºåã«è©±ã䌺ã£ããããªã³ããŒãã£ã³ã°äžã¯è³ªåãããŠããã ãããããŸããïŒããããšãããããŸããïŒïŒã ãŸã Magic Pod ã®äŒè€æ§ã«ã¯å°å
¥æãããã©ãã«ã·ã¥ãŒãã£ã³ã°ã«å€å€§ãªãµããŒããããã ããŠããŸãã Circle CI ã«å
¥ã蟌ãéã«ã¯ãã¡ãã£ãšè©°ãŸã£ãç¹ãããäŒè€æ§ãšã¡ãŒã«ã§ããåãããŠããã®ã§ããããã®æ¥ã®ãã¡ã« ããã¥ã¡ã³ã ãã¢ããããããã ãšããç°å¢äžã§äžæãªãšã©ãŒãåºãŠããŠçžè«ããéã«ã¯ãã¹ãã¢ãã CLINICS ã¢ããªãããŠã³ããŒãããŠè©ŠããŠããã ãããããšã«ãããã€ãè¿
éãã€ãäžå¯§ãªå¯Ÿå¿ãå°è±¡çã§ããã ãŸã QA ããŒã ããªããããªå°äººæ°ã®ç¶æ³ã§ã¯ããããã£ããã©ãã«ã«å¯ŸããŠçžè«ã§ããå
±ã«è§£æ±ºæ³ãæ¢ããæ¹ããããšããæå³ã§ãéåžžã«å¿åŒ·ãã§ãã ä»åŸã«ã€ã㊠ã¢ããªã® UI ãã¹ãã«ã€ããŠãæ¹åããŠããããããšã¯ãŸã ãŸã 沢山ããã®ã§ãããçŸç¶ã§ãåºæ¬çãªãã¹ãã¯çšæã§ããŠããããããã£ããè
°ãæ®ããŠæ¹åããŠãããããšèããŠããŸãã ãŸãçŸåšã¯ãã©ãŠã¶ã®ãã¹ãèªååãé²ããŠããŸããã¡ãã¬ãŒã® CLINICS 以å€ã®ãããã¯ãã®å€ã㯠Web ãã©ãŠã¶ããã©ãããã©ãŒã ãšããŠãããããWeb ã«ã€ããŠã¯ãããã¯ããè·šãã æŽ»åãè¡ã£ãŠãããã°ãšèããŠããŸãã é·ããªããŸããããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã® QA ãšã³ãžãã¢ã®ç±³å±±ã§ãã䞻㫠CLINICS ã¢ããªã® QA ãæ
åœããŠããŸããã¡ãã¬ãŒã«ã¯ 2020 幎 8 æã«å
¥ç€ŸããŸããã ä»åã¯å
¥ç€ŸããŠãŸãè¡ã£ãããšã®äžã€ããªã°ã¬ãã·ã§ã³ãã¹ãã®èªååãšããã®ããã«å°å
¥ãã Magic Pod ãšããããŒã«ã«ã€ããŠãçµç·¯ãå°å
¥ããŠã¿ãçµæãã玹ä»ããããšæããŸãã CLINICS ãšã¯ ç§ã®æå±ããããŒã ã§éçºããŠãã CLINICS ãšãããããã¯ãã¯ã¢ããªã§ãªã³ã©ã€ã³èšºçããã¯ãªããã¯ã»ç
é¢ããåŠæ¹ç®ãçºè¡ããŠãããããšãã§ãããªã³ã©ã€ã³äžã§èšºå¯ãããè¬ã®åãåããŸã§å®çµã§ãããµãŒãã¹ã§ãã ãã©ãããã©ãŒã 㯠iOS ãš Android ã®ãã€ãã£ãã¢ããªãããããåæ§ã®ãµãŒãã¹ã Web ãã©ãŠã¶ãããå©çšããããšãåºæ¥ãŸãã QAïŒãªãªãŒã¹åšãã®ç¶æ³ CLINICS ã®éçºçµç¹ã« QA ãšã³ãžãã¢ããžã§ã€ã³ããã®ã¯æšå¹ŽïŒ2020 幎ïŒã§ããããµãŒãã¹èªäœã¯ 2016 幎ã«ããŒã³ããããŠããŸãã æ¬çµç¹ã§ã¯ãªãªãŒã¹åã«è¡ããªã°ã¬ãã·ã§ã³ãã¹ãã«ã€ããŠã¯ãéçºã¡ã³ããäžå¿ã«ããŒã å
šäœã§è¡ãæåããããŸãã ã¢ããªã®ãªãªãŒã¹ã¯éé±ã§è¡ã£ãŠããããã®éœåºŠéçºã¡ã³ãèªèº«ã«ãã£ãŠãã¹ããè¡ãããŠããŸããããèªååããã UI ãã¹ãã¯ååšããŠããŸããã§ããã ã¡ãã¬ãŒã§ã¯ QA ãšã³ãžãã¢ããžã§ã€ã³ããŠéããªããããããããããšã»ããã¹ãããšã¯å€å²ã«ãããäžã§ãŸãäœããçæããã¹ããæ€èšããŸããã QA ããã»ã¹ã®çå®ã»æ¹åãããæ°æ©èœããªãªãŒã¹ãŸã§æšé²ããããã® QA 掻åãããã䞊è¡ããŠå¹Ÿã€ãåããŠããäžã§ãã¹ãèªååãã©ã®ã¿ã€ãã³ã°ã§ãã©ããã£ãŠã¹ã¿ãŒããããæ©ã¿ãŸããã ããªã¥ãŒããèãã ã¡ãã¬ãŒã®ããªã¥ãŒã¯ãã®äžã€ã§ãããããã®ããªã¥ãŒèŠç¹ã§èããŠã¿ãŸããã ãå¡äºåŸ¹åºããšããŠããªãªãŒã¹åã®ãªã°ã¬ãã·ã§ã³ãã¹ãããã£ããè¡ãããšã¯åœç¶ã®ããšãšããŠèããããŸãã ãäžå€®çªç Žãã®èŠç¹ã§ã¯ã©ãããšèãããšããã¯ããã¹ãããã»ã¹ã«ãããŠãç¹ã«ãªãªãŒã¹æ¯ã«ç¹°ãè¿ãäœæ¥ãšãªããªã°ã¬ãã·ã§ã³ãã¹ããèªååããããšã¯çéã§ããããã¹ããã©ã¯ãã£ã¹ã®äžã€ã ãšèããããŸãã ãã®ããèªååã¯åªå
床é«ãé²ããã¹ãã§ã¯ãããŸãã æ®ãäžã€ãæªæ¥å¿åãã«ã€ããŠã¯ãäŸãã° 1~2 幎åŸããã®å
ãèããŠããªã°ã¬ãã·ã§ã³ãã¹ããèªååãããŠããã¹ããåŠãã§èšããšãã¯ã Yes ã§ãã ãŸããå¥ã®èгç¹ãšããŠãçŸåšã¯ããã 2 人㮠QA ãšã³ãžãã¢ã«å¯ŸããŠãè€æ°ã®ãããã¯ããååšããŠããç¶æ³ã§ãQA ãšã³ãžãã¢ãã¢ãµã€ã³ãããŠããªããããã¯ããå€ããããŸãã ç§èªèº«ãæšå¹Ž 10 æããã¢ããªã»åºç€ããŒã ã«ç°åããããšããããä»åŸã«ã€ããŠããŸãäœå¶ãå€ãã£ãŠããããšã¯ååã«èããããŸããã ãããªç¶æ³äžã§ã¯ã仮㫠UI ãã¹ããèªååããç°å¢ãçšæã§ãããšããŠããã®åŸã«æ
åœè
ãäžåšã«ãªã£ãå Žåãèæ
®ããŠããå¿
èŠããããŸãïŒèªåãã¹ãã«ãããŠãæ
åœãäžåšã«ãªã£ãããšã§ã¡ã³ããããªããªã圢骞åããã±ãŒã¹ã¯ãããã話ã§ãïŒã ãã®ãããä»®ã«å®è£
è
ãäžåšãšãªã£ãåŸã§ã誰ãã«åŒãç¶ããããããŸããšã³ãžãã¢ä»¥å€ã§ãéçšã§ããç°å¢ãæãŸãããšèããŸããããããã£ã芳ç¹ã§ããŒã«ãšããŠã¯åºæ¬ããŒã³ãŒãã§ãã¡ã³ãã§ãã Magic Pod ã¯æåãªåè£ãšãªããŸããã ãããããŸãšãããšã以äžã®ãããªçµè«ã«è³ããŸããã ãã¹ãã®èªååã¯æšé²ããæ¹ãè¯ã ãã ããä»ã®ã¡ã³ãã§ãã¡ã³ãããããç°å¢ãéžå®ãã ãã ã QA ãšããŠããã¹ãäºã沢山ããäžã§ããã¹ãèªååã ãã«å°å¿µã§ããç¶æ³ã§ã¯ãããŸããã ãã®ãããªãã¹ãä»ã¿ã¹ã¯ãšäžŠè¡ããŠå°ã³ã¹ãã§é²ããããäºãéèŠãªèŠçŽ ã§ããã èªååããã UI ãã¹ãã¯å
šããªãäºããä»ã®ãã¹ãã®å¯åºŠãéã¿ããšããªãã¹ãæ©ã段éã§äžå®ã®èªåãã¹ãç°å¢ã¯çšæããããšããæ³ãããããŸããã ãããã®ç¶æ³ãèžãŸããããŒã«ãéžå®ã»ãã©ã€ã¢ã«ããŠã¿ãçµæãMagic Pod ãå°å
¥ããããšã«æ±ºããŸããã Magic Pod ã®çŽ¹ä» Magic Pod ã«ã€ããŠããµãŒãã¹èªäœã®è©³çްã¯å²æããŸããã端çã«ãããšã¯ã©ãŠãç°å¢ã〠GUI ãã UI ãã¹ãã®å®è£
åã³å®è¡ãè¡ãããšãã§ããããŒã«ã§ãã GUI ã§èªåãã¹ããå®è£
ã§ããããŒã«ã ãšã Autify ãªã©ãæåã§ãã Autify ã¯ãã©ãŠã¶åãã®ããŒã«ã§ãããå®è£
æ¹æ³ã¯ Magic Pod ãšã¯å°ãç°ãªããæäœãã¬ã³ãŒãã£ã³ã°ããŠãã¹ãã·ããªãªãèªåã§çæããã圢ãåºæ¬ã§ãã äžæ¹ãMagic Pod ã¯ä»¥äžã®ããã«ã¢ããªã®ç»é¢ããŸããã£ããã£ã§åã蟌ã¿ããããããã¹ãã§äœ¿ãããé
ç®ãéžæããã·ããªãªã«ãã©ãã°ã¢ã³ãããããããŠããããšã§ãã¹ãã·ããªãªãçæããããšãã§ããŸãã ãã°ã€ã³ãªã©ãè€æ°ã®ãã¹ãã§äœ¿ãéšåã¯å
±éåããŠãããŸãã ãã¹ã察象ã iOS ã¢ããªã§ããããšãAndroid ã¢ããªããã©ãŠã¶ã§ããããšåºæ¬çã«åã I/F ãããã¹ãã®çæã»ã¡ã³ããåºæ¥ãããšã¯å€§ããªåŒ·ã¿ã®äžã€ã§ãã ãŸãããã¹ãã§äœ¿çšãããã£ãŒã«ãã®èŠçŽ ãéžæå¯èœãªããšããç¶æ
å€åã«åŒ·ããã¹ããšããäžã§ã®åŒ·ã¿ãšãªããŸãã äŸãã°ã調å€è¬å±åã§ãããããšããããã¹ããã£ãŒã«ãã«å¯ŸããŠããã®ããã¹ãã䜿ãã®ããID ãªã®ããããã¹ããã£ãŒã«ããªã®ã xpath ãªã®ããšãã£ãæã§ãã ãã®ããã ããã¹ããé »ç¹ã«å€ãããããªå ŽæïŒäŸãã°æ¥ä»ãªã©ïŒã§ã¯ããã¹ãã䜿ããªã ã¢ããªå
éšã§ãªãã¡ã¯ã¿ãªã³ã°ãªã©ãåããŠããå Žåã§ããã°éã« ID ã¯å€ããå¯èœæ§ãé«ããããããã¹ãã§æå®ãã UI ãã¹ããäœã蟌ãäžã§ã¯åœç¶ã®ããšã§ã¯ãããŸãããäžèšã®ãããªå·¥å€«ã«ãããã¹ãã®æåçãäžããããšãã§ããŸãã å°å
¥ããŠã¿ãŠ ãã©ã€ã¢ã«äžã¯æ¢ããªããã®éšåã¯ãã£ããã®ã®ãæ
£ãããšå®è£
å·¥æ°ã¯éåžžã«çæéã§å®è£
ã§ããããŒã¿ã«ã§ã iOS ã§ 2 3 é±éïŒãªã³ããŒãã£ã³ã°å«ãïŒãAndroid ã® UI ãã¹ãã«ã€ããŠã¯å®è³ª 2 3 æ¥ã§åºæ¬çãªãã¹ãã·ããªãªã®èªååãè¡ãäºãã§ããŸããã ãã®åŸãéçšããªããèœã¡ããããã¹ãã®æ¹ä¿®ãè¡ã£ãããéçšãå®å®ããŠãã㯠CI ã«ã飿ºããŠããŸãã UI ãã¹ãã®éçšã«ãããŠã¯å®æçã«å®è¡ããããšã¯éåžžã«éèŠãªããšã§ãããMagic Pod ã®å ŽåãBitrise ã§ã¯ UI äžããèšå®ã§ããCircle CI ã«å¯ŸããŠãããã¥ã¡ã³ããåç
§ããªããæ¯èŒç容æã«èšå®ã§ããŸãã å®éãæšå¹Ž 1 ã¯ã©ãŒã¿ãŒéçšããŠã¿ãŠã幟ã€ãã®ã¯ã©ãã·ã¥ããªãªãŒã¹åã«æ€ç¥ããŠãããŸããã ãŸããç§èªèº«ãéå»ã«ã¯ XCTest ã«ããã UITest( Testing Your Apps in Xcode )ã Appium ã䜿ã£ãŠ UI ãã¹ããéçšããŠããããã以äžã§ã¯ãããä»ããŒã«ãšã®æ¯èŒãå«ããŠç޹ä»ããŠã¿ãããšæããŸãã å®è£
ã³ã¹ã å®è£
ã³ã¹ãã«ãåææ§ç¯ãšããã®åŸã®ã¡ã³ãã³ã¹ãã§åãããŸãããä»ã®ããŒã«ãšæ¯èŒããŠã倧ããç°ãªãã®ã¯åææ§ç¯ã³ã¹ãã ãšæããŸãã Magic Pod ã«ã€ããŠã¯ç°å¢æ§ç¯ã³ã¹ãã¯éåžžã«äœã³ã¹ãã§è¡ãããšãã§ããŸãïŒåºæ¬çãªéšå㯠1 æ¥ããã°ååã ãšæããŸãïŒã ãŸããã¹ãã®ã¬ããŒãã£ã³ã°ããã£ããã£æ©èœãªã©ãæšæºã§ä»ããŠããŸãã®ã§ããã®èŸºããèªåã§é 匵ãå¿
èŠã¯ãããŸããã æ¬¡ã«ã¡ã³ãã³ã¹ãã§ãããäŸãã° XCUITest ã§ã¯ãŸããã«ããè¡ããdebug ããŠåãã¿ã³ãªã©ã®èŠçŽ ã® ID ãªã©ã確èªããããããçšããŠã³ãŒãã£ã³ã°ããŠããŸããã Magic Pod ã§ã¯äžåºŠã¢ããªãã¢ããããŒãããŠãã¹ãã£ã³ããããšã§ç»é¢ã®èŠçŽ ãäžæ¬ã§ååŸã§ãããã®äžããæäœãããèŠçŽ ãéžæããããšãã§ããŸãã ãã®ãããã¡ããã³ã¹ãã¯ã ãã¶äžãããŸãããã ããã®éšåã«ã€ããŠã¯ä»ã®ããŒã«ãèšèªã§ãæ
£ããã°ããæéã¯ããããªãã®ã§ãããããã倧差ãªããããããŸããã ãããŠèšããš debug ã§ ID ã確èªããæéãæ¥œã«ãªããå®è£
ãããã¹ãã詊ããŠå®è¡ããã®ã容æïŒãã«ãåŸ
ã¡ã®æéããªãïŒãšãã£ã蟺ãã§ããããã éçšã³ã¹ã UI ãã¹ããšããã° Flaky ãªãã¹ãïŒèœã¡ããèœã¡ãªãã£ãããããã¹ãïŒã«æ©ãŸãããããšã¯å€ãã§ãããéçšããŠã¿ããšæåã®å
ã¯ãããã£ãããšããããŸããããçŸç¶ã§ã¯ã»ãŒèµ·ããŠããŸããã ãã㯠Magic Pod ã«éã£ã話ã§ã¯ãããŸãããã ã¯ã©ãŠãäžã§å®è¡ãããããšã§ç°å¢èŠå ã§èœã¡ãããšã¯çš èœã¡ãæã«ã¯èªåã§ãªãã©ã€ããã ãã«ãã CI äžã§å®è¡ããŠãã å®è¡ã¯ã¡ã³ããæŽ»åããŠããªãæé垯ã«è¡ã£ãŠãã ãšãã£ã蟺ããèŠå ããšæããŸãã ãŸã Magic Pod ã®ãããªããŒã«ã䜿ã£ãŠããå Žåã«å©ããéšåãšããŠã¯ãXcode ãªã©ãUI ãã¹ãã«å¿
èŠãªããŒã«ã®ã¢ããããŒãã«å¯Ÿããã¡ã³ããäžèŠãšããããšãæããããŸãã éã«å°ãèŸãæ ãããŸã§ Magic Pod ã®è¯ãéšåãå€ãæžããŸããããéã«ãã®ãã㪠GUI ã§ã®ãã¹ãããŒã«ã䜿ãããšã§å°ãããèŸãç¹ã玹ä»ããŠãããããšæããŸãã 1. ãã¹ãã³ãŒãã®ã¬ãã¥ãŒ ãã¹ãã³ãŒãïŒã±ãŒã¹ïŒã¯ Magic Pod äžã§ç®¡çãããŠãããããPR ã¬ãã¥ãŒãªã©ã®ããã»ã¹ãè¡ãããšãã§ããŸããã ãã®ãããã±ãŒã¹ã®ä¿®æ£ã«å¯ŸããŠãåæ ãããåã«ã¬ãã¥ãŒããŠãããããå Žåã¯ããã¹ãã±ãŒã¹ãã³ããŒããŠããç·šéãããªã©å°ã工倫ãå¿
èŠã«ãªãããšæããŸãã çŸç¶ã§ã¯å°ãããšã¯ãããŸããããè€æ°äººã§åäžã®ãããžã§ã¯ãã«å¯ŸããŠéçšãããå Žåã¯å°ãç
©éã«ãªãããã§ãã 2. ãã¹ãã³ãŒãã®ç®¡ç èªåãã¹ãã«ãããŠããã¹ãçµæã«åœ±é¿ãåºã仿§å€æŽãå
¥ããããªå Žåã仿§å€æŽã«å¯Ÿãããã¹ãã³ãŒãã®ä¿®æ£ã¯éçºãšäžŠè¡ããŠçšæããŠããããããã¯ããžã®å€æŽãããŒãžãããã¿ã€ãã³ã°ã§åæã«ãã¹ãã³ãŒãã®ä¿®æ£ãããŒãžãããã±ãŒã¹ããããŸãã Magic Pod ã§ã¯ GitHub äžã§ãã¹ãã³ãŒãã管çããŠããªãããããã®ãããªã±ãŒã¹ãžã®å¯Ÿå¿ãèªåã§è¡ãããšãé£ãããäºããã¹ãã±ãŒã¹ãåããŠçšæããŠãããå®è£
ãããŒãžãããåŸã«æåã§çœ®ãæããããããŒãžãããåŸã«åœ±é¿ã®ãããã¹ãã±ãŒã¹ãä¿®æ£ãããšãã£ãæåã§ã®ããã»ã¹ãå¿
èŠã«ãªããŸãã çŸæç¹ã§æ°ã«ãªã£ãã®ã¯äžèšã® 2 ç¹ã§ãããããããä»åŸæ¹åãããŠããå¯èœæ§ã¯å€§ãã«ãããŸãããããã»ã¹ã®äžã§ã®å·¥å€«æ¬¡ç¬¬ã§å¯ŸåŠãå¯èœããšæããŸãã ãã®ä» åºæ¬çã« UI ãã¹ããèªååããäžã§æ°ãã€ããã¹ãããšãã¢ã³ããã¿ãŒã³ã¯ã©ããªããŒã«ã䜿ã£ãŠãåãã§ãã ä»ã®ããŒã«ã§ã¯é£ããããšãããã®ããŒã«ã§ã¯å®çŸåºæ¥ããšããããšãçšã§ãæã«ã¯ãããã¯ãåŽã§æãå
¥ããå¿
èŠããããŸãã ã©ããªããŒã«ã§ãããäœããã工倫ããã°éæåºæ¥ãããšãå€ããããéããåºãã®ã¯å®è£
ãéçšããªã³ããŒãã£ã³ã°çã®ã³ã¹ãéšåãæã倧ããã®ã§ã¯ãªãããšæããŠããŸãã åšå²ã®ãµããŒã ãã¹ãèªååãè¡ãå ŽåïŒã ãã§ã¯ãªãã§ããïŒãåšå²ã®çè§£ãåŸãããšã¯å€§äºãªéšåã§ãããããŒã ã¡ã³ãã¯çååãã§èå³ãæã£ãŠãããŠé²ããããç°å¢ã§ããã ç¹ã« CI 飿ºã®éšåã§ã¯ iOS/Android ã®éçºã®æ¹ã«ããµããŒãããŠããã ã倧å€å©ãããŸããã ãã㊠Magic Pod ã«ã€ããŠã¯ãæ°å¹ŽåããéçšããŠããæ ªåŒäŒç€Ÿãããã®æŠç°ããã«ãäºåã«è©±ã䌺ã£ããããªã³ããŒãã£ã³ã°äžã¯è³ªåãããŠããã ãããããŸããïŒããããšãããããŸããïŒïŒã ãŸã Magic Pod ã®äŒè€æ§ã«ã¯å°å
¥æãããã©ãã«ã·ã¥ãŒãã£ã³ã°ã«å€å€§ãªãµããŒããããã ããŠããŸãã Circle CI ã«å
¥ã蟌ãéã«ã¯ãã¡ãã£ãšè©°ãŸã£ãç¹ãããäŒè€æ§ãšã¡ãŒã«ã§ããåãããŠããã®ã§ããããã®æ¥ã®ãã¡ã« ããã¥ã¡ã³ã ãã¢ããããããã ãšããç°å¢äžã§äžæãªãšã©ãŒãåºãŠããŠçžè«ããéã«ã¯ãã¹ãã¢ãã CLINICS ã¢ããªãããŠã³ããŒãããŠè©ŠããŠããã ãããããšã«ãããã€ãè¿
éãã€ãäžå¯§ãªå¯Ÿå¿ãå°è±¡çã§ããã ãŸã QA ããŒã ããªããããªå°äººæ°ã®ç¶æ³ã§ã¯ããããã£ããã©ãã«ã«å¯ŸããŠçžè«ã§ããå
±ã«è§£æ±ºæ³ãæ¢ããæ¹ããããšããæå³ã§ãéåžžã«å¿åŒ·ãã§ãã ä»åŸã«ã€ã㊠ã¢ããªã® UI ãã¹ãã«ã€ããŠãæ¹åããŠããããããšã¯ãŸã ãŸã 沢山ããã®ã§ãããçŸç¶ã§ãåºæ¬çãªãã¹ãã¯çšæã§ããŠããããããã£ããè
°ãæ®ããŠæ¹åããŠãããããšèããŠããŸãã ãŸãçŸåšã¯ãã©ãŠã¶ã®ãã¹ãèªååãé²ããŠããŸããã¡ãã¬ãŒã® CLINICS 以å€ã®ãããã¯ãã®å€ã㯠Web ãã©ãŠã¶ããã©ãããã©ãŒã ãšããŠãããããWeb ã«ã€ããŠã¯ãããã¯ããè·šãã æŽ»åãè¡ã£ãŠãããã°ãšèããŠããŸãã é·ããªããŸããããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã® QA ãšã³ãžãã¢ã®ç±³å±±ã§ãã䞻㫠CLINICS ã¢ããªã® QA ãæ
åœããŠããŸããã¡ãã¬ãŒã«ã¯ 2020 幎 8 æã«å
¥ç€ŸããŸããã ä»åã¯å
¥ç€ŸããŠãŸãè¡ã£ãããšã®äžã€ããªã°ã¬ãã·ã§ã³ãã¹ãã®èªååãšããã®ããã«å°å
¥ãã Magic Pod ãšããããŒã«ã«ã€ããŠãçµç·¯ãå°å
¥ããŠã¿ãçµæãã玹ä»ããããšæããŸãã CLINICS ãšã¯ ç§ã®æå±ããããŒã ã§éçºããŠãã CLINICS ãšãããããã¯ãã¯ã¢ããªã§ãªã³ã©ã€ã³èšºçããã¯ãªããã¯ã»ç
é¢ããåŠæ¹ç®ãçºè¡ããŠãããããšãã§ãããªã³ã©ã€ã³äžã§èšºå¯ãããè¬ã®åãåããŸã§å®çµã§ãããµãŒãã¹ã§ãã ãã©ãããã©ãŒã 㯠iOS ãš Android ã®ãã€ãã£ãã¢ããªãããããåæ§ã®ãµãŒãã¹ã Web ãã©ãŠã¶ãããå©çšããããšãåºæ¥ãŸãã QAïŒãªãªãŒã¹åšãã®ç¶æ³ CLINICS ã®éçºçµç¹ã« QA ãšã³ãžãã¢ããžã§ã€ã³ããã®ã¯æšå¹ŽïŒ2020 幎ïŒã§ããããµãŒãã¹èªäœã¯ 2016 幎ã«ããŒã³ããããŠããŸãã æ¬çµç¹ã§ã¯ãªãªãŒã¹åã«è¡ããªã°ã¬ãã·ã§ã³ãã¹ãã«ã€ããŠã¯ãéçºã¡ã³ããäžå¿ã«ããŒã å
šäœã§è¡ãæåããããŸãã ã¢ããªã®ãªãªãŒã¹ã¯éé±ã§è¡ã£ãŠããããã®éœåºŠéçºã¡ã³ãèªèº«ã«ãã£ãŠãã¹ããè¡ãããŠããŸããããèªååããã UI ãã¹ãã¯ååšããŠããŸããã§ããã ã¡ãã¬ãŒã§ã¯ QA ãšã³ãžãã¢ããžã§ã€ã³ããŠéããªããããããããããšã»ããã¹ãããšã¯å€å²ã«ãããäžã§ãŸãäœããçæããã¹ããæ€èšããŸããã QA ããã»ã¹ã®çå®ã»æ¹åãããæ°æ©èœããªãªãŒã¹ãŸã§æšé²ããããã® QA 掻åãããã䞊è¡ããŠå¹Ÿã€ãåããŠããäžã§ãã¹ãèªååãã©ã®ã¿ã€ãã³ã°ã§ãã©ããã£ãŠã¹ã¿ãŒããããæ©ã¿ãŸããã ããªã¥ãŒããèãã ã¡ãã¬ãŒã®ããªã¥ãŒã¯ãã®äžã€ã§ãããããã®ããªã¥ãŒèŠç¹ã§èããŠã¿ãŸããã ãå¡äºåŸ¹åºããšããŠããªãªãŒã¹åã®ãªã°ã¬ãã·ã§ã³ãã¹ãããã£ããè¡ãããšã¯åœç¶ã®ããšãšããŠèããããŸãã ãäžå€®çªç Žãã®èŠç¹ã§ã¯ã©ãããšèãããšããã¯ããã¹ãããã»ã¹ã«ãããŠãç¹ã«ãªãªãŒã¹æ¯ã«ç¹°ãè¿ãäœæ¥ãšãªããªã°ã¬ãã·ã§ã³ãã¹ããèªååããããšã¯çéã§ããããã¹ããã©ã¯ãã£ã¹ã®äžã€ã ãšèããããŸãã ãã®ããèªååã¯åªå
床é«ãé²ããã¹ãã§ã¯ãããŸãã æ®ãäžã€ãæªæ¥å¿åãã«ã€ããŠã¯ãäŸãã° 1~2 幎åŸããã®å
ãèããŠããªã°ã¬ãã·ã§ã³ãã¹ããèªååãããŠããã¹ããåŠãã§èšããšãã¯ã Yes ã§ãã ãŸããå¥ã®èгç¹ãšããŠãçŸåšã¯ããã 2 人㮠QA ãšã³ãžãã¢ã«å¯ŸããŠãè€æ°ã®ãããã¯ããååšããŠããç¶æ³ã§ãQA ãšã³ãžãã¢ãã¢ãµã€ã³ãããŠããªããããã¯ããå€ããããŸãã ç§èªèº«ãæšå¹Ž 10 æããã¢ããªã»åºç€ããŒã ã«ç°åããããšããããä»åŸã«ã€ããŠããŸãäœå¶ãå€ãã£ãŠããããšã¯ååã«èããããŸããã ãããªç¶æ³äžã§ã¯ã仮㫠UI ãã¹ããèªååããç°å¢ãçšæã§ãããšããŠããã®åŸã«æ
åœè
ãäžåšã«ãªã£ãå Žåãèæ
®ããŠããå¿
èŠããããŸãïŒèªåãã¹ãã«ãããŠãæ
åœãäžåšã«ãªã£ãããšã§ã¡ã³ããããªããªã圢骞åããã±ãŒã¹ã¯ãããã話ã§ãïŒã ãã®ãããä»®ã«å®è£
è
ãäžåšãšãªã£ãåŸã§ã誰ãã«åŒãç¶ããããããŸããšã³ãžãã¢ä»¥å€ã§ãéçšã§ããç°å¢ãæãŸãããšèããŸããããããã£ã芳ç¹ã§ããŒã«ãšããŠã¯åºæ¬ããŒã³ãŒãã§ãã¡ã³ãã§ãã Magic Pod ã¯æåãªåè£ãšãªããŸããã ãããããŸãšãããšã以äžã®ãããªçµè«ã«è³ããŸããã ãã¹ãã®èªååã¯æšé²ããæ¹ãè¯ã ãã ããä»ã®ã¡ã³ãã§ãã¡ã³ãããããç°å¢ãéžå®ãã ãã ã QA ãšããŠããã¹ãäºã沢山ããäžã§ããã¹ãèªååã ãã«å°å¿µã§ããç¶æ³ã§ã¯ãããŸããã ãã®ãããªãã¹ãä»ã¿ã¹ã¯ãšäžŠè¡ããŠå°ã³ã¹ãã§é²ããããäºãéèŠãªèŠçŽ ã§ããã èªååããã UI ãã¹ãã¯å
šããªãäºããä»ã®ãã¹ãã®å¯åºŠãéã¿ããšããªãã¹ãæ©ã段éã§äžå®ã®èªåãã¹ãç°å¢ã¯çšæããããšããæ³ãããããŸããã ãããã®ç¶æ³ãèžãŸããããŒã«ãéžå®ã»ãã©ã€ã¢ã«ããŠã¿ãçµæãMagic Pod ãå°å
¥ããããšã«æ±ºããŸããã Magic Pod ã®çŽ¹ä» Magic Pod ã«ã€ããŠããµãŒãã¹èªäœã®è©³çްã¯å²æããŸããã端çã«ãããšã¯ã©ãŠãç°å¢ã〠GUI ãã UI ãã¹ãã®å®è£
åã³å®è¡ãè¡ãããšãã§ããããŒã«ã§ãã GUI ã§èªåãã¹ããå®è£
ã§ããããŒã«ã ãšã Autify ãªã©ãæåã§ãã Autify ã¯ãã©ãŠã¶åãã®ããŒã«ã§ãããå®è£
æ¹æ³ã¯ Magic Pod ãšã¯å°ãç°ãªããæäœãã¬ã³ãŒãã£ã³ã°ããŠãã¹ãã·ããªãªãèªåã§çæããã圢ãåºæ¬ã§ãã äžæ¹ãMagic Pod ã¯ä»¥äžã®ããã«ã¢ããªã®ç»é¢ããŸããã£ããã£ã§åã蟌ã¿ããããããã¹ãã§äœ¿ãããé
ç®ãéžæããã·ããªãªã«ãã©ãã°ã¢ã³ãããããããŠããããšã§ãã¹ãã·ããªãªãçæããããšãã§ããŸãã ãã°ã€ã³ãªã©ãè€æ°ã®ãã¹ãã§äœ¿ãéšåã¯å
±éåããŠãããŸãã ãã¹ã察象ã iOS ã¢ããªã§ããããšãAndroid ã¢ããªããã©ãŠã¶ã§ããããšåºæ¬çã«åã I/F ãããã¹ãã®çæã»ã¡ã³ããåºæ¥ãããšã¯å€§ããªåŒ·ã¿ã®äžã€ã§ãã ãŸãããã¹ãã§äœ¿çšãããã£ãŒã«ãã®èŠçŽ ãéžæå¯èœãªããšããç¶æ
å€åã«åŒ·ããã¹ããšããäžã§ã®åŒ·ã¿ãšãªããŸãã äŸãã°ã調å€è¬å±åã§ãããããšããããã¹ããã£ãŒã«ãã«å¯ŸããŠããã®ããã¹ãã䜿ãã®ããID ãªã®ããããã¹ããã£ãŒã«ããªã®ã xpath ãªã®ããšãã£ãæã§ãã ãã®ããã ããã¹ããé »ç¹ã«å€ãããããªå ŽæïŒäŸãã°æ¥ä»ãªã©ïŒã§ã¯ããã¹ãã䜿ããªã ã¢ããªå
éšã§ãªãã¡ã¯ã¿ãªã³ã°ãªã©ãåããŠããå Žåã§ããã°éã« ID ã¯å€ããå¯èœæ§ãé«ããããããã¹ãã§æå®ãã UI ãã¹ããäœã蟌ãäžã§ã¯åœç¶ã®ããšã§ã¯ãããŸãããäžèšã®ãããªå·¥å€«ã«ãããã¹ãã®æåçãäžããããšãã§ããŸãã å°å
¥ããŠã¿ãŠ ãã©ã€ã¢ã«äžã¯æ¢ããªããã®éšåã¯ãã£ããã®ã®ãæ
£ãããšå®è£
å·¥æ°ã¯éåžžã«çæéã§å®è£
ã§ããããŒã¿ã«ã§ã iOS ã§ 2 3 é±éïŒãªã³ããŒãã£ã³ã°å«ãïŒãAndroid ã® UI ãã¹ãã«ã€ããŠã¯å®è³ª 2 3 æ¥ã§åºæ¬çãªãã¹ãã·ããªãªã®èªååãè¡ãäºãã§ããŸããã ãã®åŸãéçšããªããèœã¡ããããã¹ãã®æ¹ä¿®ãè¡ã£ãããéçšãå®å®ããŠãã㯠CI ã«ã飿ºããŠããŸãã UI ãã¹ãã®éçšã«ãããŠã¯å®æçã«å®è¡ããããšã¯éåžžã«éèŠãªããšã§ãããMagic Pod ã®å ŽåãBitrise ã§ã¯ UI äžããèšå®ã§ããCircle CI ã«å¯ŸããŠãããã¥ã¡ã³ããåç
§ããªããæ¯èŒç容æã«èšå®ã§ããŸãã å®éãæšå¹Ž 1 ã¯ã©ãŒã¿ãŒéçšããŠã¿ãŠã幟ã€ãã®ã¯ã©ãã·ã¥ããªãªãŒã¹åã«æ€ç¥ããŠãããŸããã ãŸããç§èªèº«ãéå»ã«ã¯ XCTest ã«ããã UITest( Testing Your Apps in Xcode )ã Appium ã䜿ã£ãŠ UI ãã¹ããéçšããŠããããã以äžã§ã¯ãããä»ããŒã«ãšã®æ¯èŒãå«ããŠç޹ä»ããŠã¿ãããšæããŸãã å®è£
ã³ã¹ã å®è£
ã³ã¹ãã«ãåææ§ç¯ãšããã®åŸã®ã¡ã³ãã³ã¹ãã§åãããŸãããä»ã®ããŒã«ãšæ¯èŒããŠã倧ããç°ãªãã®ã¯åææ§ç¯ã³ã¹ãã ãšæããŸãã Magic Pod ã«ã€ããŠã¯ç°å¢æ§ç¯ã³ã¹ãã¯éåžžã«äœã³ã¹ãã§è¡ãããšãã§ããŸãïŒåºæ¬çãªéšå㯠1 æ¥ããã°ååã ãšæããŸãïŒã ãŸããã¹ãã®ã¬ããŒãã£ã³ã°ããã£ããã£æ©èœãªã©ãæšæºã§ä»ããŠããŸãã®ã§ããã®èŸºããèªåã§é 匵ãå¿
èŠã¯ãããŸããã æ¬¡ã«ã¡ã³ãã³ã¹ãã§ãããäŸãã° XCUITest ã§ã¯ãŸããã«ããè¡ããdebug ããŠåãã¿ã³ãªã©ã®èŠçŽ ã® ID ãªã©ã確èªããããããçšããŠã³ãŒãã£ã³ã°ããŠããŸããã Magic Pod ã§ã¯äžåºŠã¢ããªãã¢ããããŒãããŠãã¹ãã£ã³ããããšã§ç»é¢ã®èŠçŽ ãäžæ¬ã§ååŸã§ãããã®äžããæäœãããèŠçŽ ãéžæããããšãã§ããŸãã ãã®ãããã¡ããã³ã¹ãã¯ã ãã¶äžãããŸãããã ããã®éšåã«ã€ããŠã¯ä»ã®ããŒã«ãèšèªã§ãæ
£ããã°ããæéã¯ããããªãã®ã§ãããããã倧差ãªããããããŸããã ãããŠèšããš debug ã§ ID ã確èªããæéãæ¥œã«ãªããå®è£
ãããã¹ãã詊ããŠå®è¡ããã®ã容æïŒãã«ãåŸ
ã¡ã®æéããªãïŒãšãã£ã蟺ãã§ããããã éçšã³ã¹ã UI ãã¹ããšããã° Flaky ãªãã¹ãïŒèœã¡ããèœã¡ãªãã£ãããããã¹ãïŒã«æ©ãŸãããããšã¯å€ãã§ãããéçšããŠã¿ããšæåã®å
ã¯ãããã£ãããšããããŸããããçŸç¶ã§ã¯ã»ãŒèµ·ããŠããŸããã ãã㯠Magic Pod ã«éã£ã話ã§ã¯ãããŸãããã ã¯ã©ãŠãäžã§å®è¡ãããããšã§ç°å¢èŠå ã§èœã¡ãããšã¯çš èœã¡ãæã«ã¯èªåã§ãªãã©ã€ããã ãã«ãã CI äžã§å®è¡ããŠãã å®è¡ã¯ã¡ã³ããæŽ»åããŠããªãæé垯ã«è¡ã£ãŠãã ãšãã£ã蟺ããèŠå ããšæããŸãã ãŸã Magic Pod ã®ãããªããŒã«ã䜿ã£ãŠããå Žåã«å©ããéšåãšããŠã¯ãXcode ãªã©ãUI ãã¹ãã«å¿
èŠãªããŒã«ã®ã¢ããããŒãã«å¯Ÿããã¡ã³ããäžèŠãšããããšãæããããŸãã éã«å°ãèŸãæ ãããŸã§ Magic Pod ã®è¯ãéšåãå€ãæžããŸããããéã«ãã®ãã㪠GUI ã§ã®ãã¹ãããŒã«ã䜿ãããšã§å°ãããèŸãç¹ã玹ä»ããŠãããããšæããŸãã 1. ãã¹ãã³ãŒãã®ã¬ãã¥ãŒ ãã¹ãã³ãŒãïŒã±ãŒã¹ïŒã¯ Magic Pod äžã§ç®¡çãããŠãããããPR ã¬ãã¥ãŒãªã©ã®ããã»ã¹ãè¡ãããšãã§ããŸããã ãã®ãããã±ãŒã¹ã®ä¿®æ£ã«å¯ŸããŠãåæ ãããåã«ã¬ãã¥ãŒããŠãããããå Žåã¯ããã¹ãã±ãŒã¹ãã³ããŒããŠããç·šéãããªã©å°ã工倫ãå¿
èŠã«ãªãããšæããŸãã çŸç¶ã§ã¯å°ãããšã¯ãããŸããããè€æ°äººã§åäžã®ãããžã§ã¯ãã«å¯ŸããŠéçšãããå Žåã¯å°ãç
©éã«ãªãããã§ãã 2. ãã¹ãã³ãŒãã®ç®¡ç èªåãã¹ãã«ãããŠããã¹ãçµæã«åœ±é¿ãåºã仿§å€æŽãå
¥ããããªå Žåã仿§å€æŽã«å¯Ÿãããã¹ãã³ãŒãã®ä¿®æ£ã¯éçºãšäžŠè¡ããŠçšæããŠããããããã¯ããžã®å€æŽãããŒãžãããã¿ã€ãã³ã°ã§åæã«ãã¹ãã³ãŒãã®ä¿®æ£ãããŒãžãããã±ãŒã¹ããããŸãã Magic Pod ã§ã¯ GitHub äžã§ãã¹ãã³ãŒãã管çããŠããªãããããã®ãããªã±ãŒã¹ãžã®å¯Ÿå¿ãèªåã§è¡ãããšãé£ãããäºããã¹ãã±ãŒã¹ãåããŠçšæããŠãããå®è£
ãããŒãžãããåŸã«æåã§çœ®ãæããããããŒãžãããåŸã«åœ±é¿ã®ãããã¹ãã±ãŒã¹ãä¿®æ£ãããšãã£ãæåã§ã®ããã»ã¹ãå¿
èŠã«ãªããŸãã çŸæç¹ã§æ°ã«ãªã£ãã®ã¯äžèšã® 2 ç¹ã§ãããããããä»åŸæ¹åãããŠããå¯èœæ§ã¯å€§ãã«ãããŸãããããã»ã¹ã®äžã§ã®å·¥å€«æ¬¡ç¬¬ã§å¯ŸåŠãå¯èœããšæããŸãã ãã®ä» åºæ¬çã« UI ãã¹ããèªååããäžã§æ°ãã€ããã¹ãããšãã¢ã³ããã¿ãŒã³ã¯ã©ããªããŒã«ã䜿ã£ãŠãåãã§ãã ä»ã®ããŒã«ã§ã¯é£ããããšãããã®ããŒã«ã§ã¯å®çŸåºæ¥ããšããããšãçšã§ãæã«ã¯ãããã¯ãåŽã§æãå
¥ããå¿
èŠããããŸãã ã©ããªããŒã«ã§ãããäœããã工倫ããã°éæåºæ¥ãããšãå€ããããéããåºãã®ã¯å®è£
ãéçšããªã³ããŒãã£ã³ã°çã®ã³ã¹ãéšåãæã倧ããã®ã§ã¯ãªãããšæããŠããŸãã åšå²ã®ãµããŒã ãã¹ãèªååãè¡ãå ŽåïŒã ãã§ã¯ãªãã§ããïŒãåšå²ã®çè§£ãåŸãããšã¯å€§äºãªéšåã§ãããããŒã ã¡ã³ãã¯çååãã§èå³ãæã£ãŠãããŠé²ããããç°å¢ã§ããã ç¹ã« CI 飿ºã®éšåã§ã¯ iOS/Android ã®éçºã®æ¹ã«ããµããŒãããŠããã ã倧å€å©ãããŸããã ãã㊠Magic Pod ã«ã€ããŠã¯ãæ°å¹ŽåããéçšããŠããæ ªåŒäŒç€Ÿãããã®æŠç°ããã«ãäºåã«è©±ã䌺ã£ããããªã³ããŒãã£ã³ã°äžã¯è³ªåãããŠããã ãããããŸããïŒããããšãããããŸããïŒïŒã ãŸã Magic Pod ã®äŒè€æ§ã«ã¯å°å
¥æãããã©ãã«ã·ã¥ãŒãã£ã³ã°ã«å€å€§ãªãµããŒããããã ããŠããŸãã Circle CI ã«å
¥ã蟌ãéã«ã¯ãã¡ãã£ãšè©°ãŸã£ãç¹ãããäŒè€æ§ãšã¡ãŒã«ã§ããåãããŠããã®ã§ããããã®æ¥ã®ãã¡ã« ããã¥ã¡ã³ã ãã¢ããããããã ãšããç°å¢äžã§äžæãªãšã©ãŒãåºãŠããŠçžè«ããéã«ã¯ãã¹ãã¢ãã CLINICS ã¢ããªãããŠã³ããŒãããŠè©ŠããŠããã ãããããšã«ãããã€ãè¿
éãã€ãäžå¯§ãªå¯Ÿå¿ãå°è±¡çã§ããã ãŸã QA ããŒã ããªããããªå°äººæ°ã®ç¶æ³ã§ã¯ããããã£ããã©ãã«ã«å¯ŸããŠçžè«ã§ããå
±ã«è§£æ±ºæ³ãæ¢ããæ¹ããããšããæå³ã§ãéåžžã«å¿åŒ·ãã§ãã ä»åŸã«ã€ã㊠ã¢ããªã® UI ãã¹ãã«ã€ããŠãæ¹åããŠããããããšã¯ãŸã ãŸã 沢山ããã®ã§ãããçŸç¶ã§ãåºæ¬çãªãã¹ãã¯çšæã§ããŠããããããã£ããè
°ãæ®ããŠæ¹åããŠãããããšèããŠããŸãã ãŸãçŸåšã¯ãã©ãŠã¶ã®ãã¹ãèªååãé²ããŠããŸããã¡ãã¬ãŒã® CLINICS 以å€ã®ãããã¯ãã®å€ã㯠Web ãã©ãŠã¶ããã©ãããã©ãŒã ãšããŠãããããWeb ã«ã€ããŠã¯ãããã¯ããè·šãã æŽ»åãè¡ã£ãŠãããã°ãšèããŠããŸãã é·ããªããŸããããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã® QA ãšã³ãžãã¢ã®ç±³å±±ã§ãã䞻㫠CLINICS ã¢ããªã® QA ãæ
åœããŠããŸããã¡ãã¬ãŒã«ã¯ 2020 幎 8 æã«å
¥ç€ŸããŸããã ä»åã¯å
¥ç€ŸããŠãŸãè¡ã£ãããšã®äžã€ããªã°ã¬ãã·ã§ã³ãã¹ãã®èªååãšããã®ããã«å°å
¥ãã Magic Pod ãšããããŒã«ã«ã€ããŠãçµç·¯ãå°å
¥ããŠã¿ãçµæãã玹ä»ããããšæããŸãã CLINICS ãšã¯ ç§ã®æå±ããããŒã ã§éçºããŠãã CLINICS ãšãããããã¯ãã¯ã¢ããªã§ãªã³ã©ã€ã³èšºçããã¯ãªããã¯ã»ç
é¢ããåŠæ¹ç®ãçºè¡ããŠãããããšãã§ãããªã³ã©ã€ã³äžã§èšºå¯ãããè¬ã®åãåããŸã§å®çµã§ãããµãŒãã¹ã§ãã ãã©ãããã©ãŒã 㯠iOS ãš Android ã®ãã€ãã£ãã¢ããªãããããåæ§ã®ãµãŒãã¹ã Web ãã©ãŠã¶ãããå©çšããããšãåºæ¥ãŸãã QAïŒãªãªãŒã¹åšãã®ç¶æ³ CLINICS ã®éçºçµç¹ã« QA ãšã³ãžãã¢ããžã§ã€ã³ããã®ã¯æšå¹ŽïŒ2020 幎ïŒã§ããããµãŒãã¹èªäœã¯ 2016 幎ã«ããŒã³ããããŠããŸãã æ¬çµç¹ã§ã¯ãªãªãŒã¹åã«è¡ããªã°ã¬ãã·ã§ã³ãã¹ãã«ã€ããŠã¯ãéçºã¡ã³ããäžå¿ã«ããŒã å
šäœã§è¡ãæåããããŸãã ã¢ããªã®ãªãªãŒã¹ã¯éé±ã§è¡ã£ãŠããããã®éœåºŠéçºã¡ã³ãèªèº«ã«ãã£ãŠãã¹ããè¡ãããŠããŸããããèªååããã UI ãã¹ãã¯ååšããŠããŸããã§ããã ã¡ãã¬ãŒã§ã¯ QA ãšã³ãžãã¢ããžã§ã€ã³ããŠéããªããããããããããšã»ããã¹ãããšã¯å€å²ã«ãããäžã§ãŸãäœããçæããã¹ããæ€èšããŸããã QA ããã»ã¹ã®çå®ã»æ¹åãããæ°æ©èœããªãªãŒã¹ãŸã§æšé²ããããã® QA 掻åãããã䞊è¡ããŠå¹Ÿã€ãåããŠããäžã§ãã¹ãèªååãã©ã®ã¿ã€ãã³ã°ã§ãã©ããã£ãŠã¹ã¿ãŒããããæ©ã¿ãŸããã ããªã¥ãŒããèãã ã¡ãã¬ãŒã®ããªã¥ãŒã¯ãã®äžã€ã§ãããããã®ããªã¥ãŒèŠç¹ã§èããŠã¿ãŸããã ãå¡äºåŸ¹åºããšããŠããªãªãŒã¹åã®ãªã°ã¬ãã·ã§ã³ãã¹ãããã£ããè¡ãããšã¯åœç¶ã®ããšãšããŠèããããŸãã ãäžå€®çªç Žãã®èŠç¹ã§ã¯ã©ãããšèãããšããã¯ããã¹ãããã»ã¹ã«ãããŠãç¹ã«ãªãªãŒã¹æ¯ã«ç¹°ãè¿ãäœæ¥ãšãªããªã°ã¬ãã·ã§ã³ãã¹ããèªååããããšã¯çéã§ããããã¹ããã©ã¯ãã£ã¹ã®äžã€ã ãšèããããŸãã ãã®ããèªååã¯åªå
床é«ãé²ããã¹ãã§ã¯ãããŸãã æ®ãäžã€ãæªæ¥å¿åãã«ã€ããŠã¯ãäŸãã° 1~2 幎åŸããã®å
ãèããŠããªã°ã¬ãã·ã§ã³ãã¹ããèªååãããŠããã¹ããåŠãã§èšããšãã¯ã Yes ã§ãã ãŸããå¥ã®èгç¹ãšããŠãçŸåšã¯ããã 2 人㮠QA ãšã³ãžãã¢ã«å¯ŸããŠãè€æ°ã®ãããã¯ããååšããŠããç¶æ³ã§ãQA ãšã³ãžãã¢ãã¢ãµã€ã³ãããŠããªããããã¯ããå€ããããŸãã ç§èªèº«ãæšå¹Ž 10 æããã¢ããªã»åºç€ããŒã ã«ç°åããããšããããä»åŸã«ã€ããŠããŸãäœå¶ãå€ãã£ãŠããããšã¯ååã«èããããŸããã ãããªç¶æ³äžã§ã¯ã仮㫠UI ãã¹ããèªååããç°å¢ãçšæã§ãããšããŠããã®åŸã«æ
åœè
ãäžåšã«ãªã£ãå Žåãèæ
®ããŠããå¿
èŠããããŸãïŒèªåãã¹ãã«ãããŠãæ
åœãäžåšã«ãªã£ãããšã§ã¡ã³ããããªããªã圢骞åããã±ãŒã¹ã¯ãããã話ã§ãïŒã ãã®ãããä»®ã«å®è£
è
ãäžåšãšãªã£ãåŸã§ã誰ãã«åŒãç¶ããããããŸããšã³ãžãã¢ä»¥å€ã§ãéçšã§ããç°å¢ãæãŸãããšèããŸããããããã£ã芳ç¹ã§ããŒã«ãšããŠã¯åºæ¬ããŒã³ãŒãã§ãã¡ã³ãã§ãã Magic Pod ã¯æåãªåè£ãšãªããŸããã ãããããŸãšãããšã以äžã®ãããªçµè«ã«è³ããŸããã ãã¹ãã®èªååã¯æšé²ããæ¹ãè¯ã ãã ããä»ã®ã¡ã³ãã§ãã¡ã³ãããããç°å¢ãéžå®ãã ãã ã QA ãšããŠããã¹ãäºã沢山ããäžã§ããã¹ãèªååã ãã«å°å¿µã§ããç¶æ³ã§ã¯ãããŸããã ãã®ãããªãã¹ãä»ã¿ã¹ã¯ãšäžŠè¡ããŠå°ã³ã¹ãã§é²ããããäºãéèŠãªèŠçŽ ã§ããã èªååããã UI ãã¹ãã¯å
šããªãäºããä»ã®ãã¹ãã®å¯åºŠãéã¿ããšããªãã¹ãæ©ã段éã§äžå®ã®èªåãã¹ãç°å¢ã¯çšæããããšããæ³ãããããŸããã ãããã®ç¶æ³ãèžãŸããããŒã«ãéžå®ã»ãã©ã€ã¢ã«ããŠã¿ãçµæãMagic Pod ãå°å
¥ããããšã«æ±ºããŸããã Magic Pod ã®çŽ¹ä» Magic Pod ã«ã€ããŠããµãŒãã¹èªäœã®è©³çްã¯å²æããŸããã端çã«ãããšã¯ã©ãŠãç°å¢ã〠GUI ãã UI ãã¹ãã®å®è£
åã³å®è¡ãè¡ãããšãã§ããããŒã«ã§ãã GUI ã§èªåãã¹ããå®è£
ã§ããããŒã«ã ãšã Autify ãªã©ãæåã§ãã Autify ã¯ãã©ãŠã¶åãã®ããŒã«ã§ãããå®è£
æ¹æ³ã¯ Magic Pod ãšã¯å°ãç°ãªããæäœãã¬ã³ãŒãã£ã³ã°ããŠãã¹ãã·ããªãªãèªåã§çæããã圢ãåºæ¬ã§ãã äžæ¹ãMagic Pod ã¯ä»¥äžã®ããã«ã¢ããªã®ç»é¢ããŸããã£ããã£ã§åã蟌ã¿ããããããã¹ãã§äœ¿ãããé
ç®ãéžæããã·ããªãªã«ãã©ãã°ã¢ã³ãããããããŠããããšã§ãã¹ãã·ããªãªãçæããããšãã§ããŸãã ãã°ã€ã³ãªã©ãè€æ°ã®ãã¹ãã§äœ¿ãéšåã¯å
±éåããŠãããŸãã ãã¹ã察象ã iOS ã¢ããªã§ããããšãAndroid ã¢ããªããã©ãŠã¶ã§ããããšåºæ¬çã«åã I/F ãããã¹ãã®çæã»ã¡ã³ããåºæ¥ãããšã¯å€§ããªåŒ·ã¿ã®äžã€ã§ãã ãŸãããã¹ãã§äœ¿çšãããã£ãŒã«ãã®èŠçŽ ãéžæå¯èœãªããšããç¶æ
å€åã«åŒ·ããã¹ããšããäžã§ã®åŒ·ã¿ãšãªããŸãã äŸãã°ã調å€è¬å±åã§ãããããšããããã¹ããã£ãŒã«ãã«å¯ŸããŠããã®ããã¹ãã䜿ãã®ããID ãªã®ããããã¹ããã£ãŒã«ããªã®ã xpath ãªã®ããšãã£ãæã§ãã ãã®ããã ããã¹ããé »ç¹ã«å€ãããããªå ŽæïŒäŸãã°æ¥ä»ãªã©ïŒã§ã¯ããã¹ãã䜿ããªã ã¢ããªå
éšã§ãªãã¡ã¯ã¿ãªã³ã°ãªã©ãåããŠããå Žåã§ããã°éã« ID ã¯å€ããå¯èœæ§ãé«ããããããã¹ãã§æå®ãã UI ãã¹ããäœã蟌ãäžã§ã¯åœç¶ã®ããšã§ã¯ãããŸãããäžèšã®ãããªå·¥å€«ã«ãããã¹ãã®æåçãäžããããšãã§ããŸãã å°å
¥ããŠã¿ãŠ ãã©ã€ã¢ã«äžã¯æ¢ããªããã®éšåã¯ãã£ããã®ã®ãæ
£ãããšå®è£
å·¥æ°ã¯éåžžã«çæéã§å®è£
ã§ããããŒã¿ã«ã§ã iOS ã§ 2 3 é±éïŒãªã³ããŒãã£ã³ã°å«ãïŒãAndroid ã® UI ãã¹ãã«ã€ããŠã¯å®è³ª 2 3 æ¥ã§åºæ¬çãªãã¹ãã·ããªãªã®èªååãè¡ãäºãã§ããŸããã ãã®åŸãéçšããªããèœã¡ããããã¹ãã®æ¹ä¿®ãè¡ã£ãããéçšãå®å®ããŠãã㯠CI ã«ã飿ºããŠããŸãã UI ãã¹ãã®éçšã«ãããŠã¯å®æçã«å®è¡ããããšã¯éåžžã«éèŠãªããšã§ãããMagic Pod ã®å ŽåãBitrise ã§ã¯ UI äžããèšå®ã§ããCircle CI ã«å¯ŸããŠãããã¥ã¡ã³ããåç
§ããªããæ¯èŒç容æã«èšå®ã§ããŸãã å®éãæšå¹Ž 1 ã¯ã©ãŒã¿ãŒéçšããŠã¿ãŠã幟ã€ãã®ã¯ã©ãã·ã¥ããªãªãŒã¹åã«æ€ç¥ããŠãããŸããã ãŸããç§èªèº«ãéå»ã«ã¯ XCTest ã«ããã UITest( Testing Your Apps in Xcode )ã Appium ã䜿ã£ãŠ UI ãã¹ããéçšããŠããããã以äžã§ã¯ãããä»ããŒã«ãšã®æ¯èŒãå«ããŠç޹ä»ããŠã¿ãããšæããŸãã å®è£
ã³ã¹ã å®è£
ã³ã¹ãã«ãåææ§ç¯ãšããã®åŸã®ã¡ã³ãã³ã¹ãã§åãããŸãããä»ã®ããŒã«ãšæ¯èŒããŠã倧ããç°ãªãã®ã¯åææ§ç¯ã³ã¹ãã ãšæããŸãã Magic Pod ã«ã€ããŠã¯ç°å¢æ§ç¯ã³ã¹ãã¯éåžžã«äœã³ã¹ãã§è¡ãããšãã§ããŸãïŒåºæ¬çãªéšå㯠1 æ¥ããã°ååã ãšæããŸãïŒã ãŸããã¹ãã®ã¬ããŒãã£ã³ã°ããã£ããã£æ©èœãªã©ãæšæºã§ä»ããŠããŸãã®ã§ããã®èŸºããèªåã§é 匵ãå¿
èŠã¯ãããŸããã æ¬¡ã«ã¡ã³ãã³ã¹ãã§ãããäŸãã° XCUITest ã§ã¯ãŸããã«ããè¡ããdebug ããŠåãã¿ã³ãªã©ã®èŠçŽ ã® ID ãªã©ã確èªããããããçšããŠã³ãŒãã£ã³ã°ããŠããŸããã Magic Pod ã§ã¯äžåºŠã¢ããªãã¢ããããŒãããŠãã¹ãã£ã³ããããšã§ç»é¢ã®èŠçŽ ãäžæ¬ã§ååŸã§ãããã®äžããæäœãããèŠçŽ ãéžæããããšãã§ããŸãã ãã®ãããã¡ããã³ã¹ãã¯ã ãã¶äžãããŸãããã ããã®éšåã«ã€ããŠã¯ä»ã®ããŒã«ãèšèªã§ãæ
£ããã°ããæéã¯ããããªãã®ã§ãããããã倧差ãªããããããŸããã ãããŠèšããš debug ã§ ID ã確èªããæéãæ¥œã«ãªããå®è£
ãããã¹ãã詊ããŠå®è¡ããã®ã容æïŒãã«ãåŸ
ã¡ã®æéããªãïŒãšãã£ã蟺ãã§ããããã éçšã³ã¹ã UI ãã¹ããšããã° Flaky ãªãã¹ãïŒèœã¡ããèœã¡ãªãã£ãããããã¹ãïŒã«æ©ãŸãããããšã¯å€ãã§ãããéçšããŠã¿ããšæåã®å
ã¯ãããã£ãããšããããŸããããçŸç¶ã§ã¯ã»ãŒèµ·ããŠããŸããã ãã㯠Magic Pod ã«éã£ã話ã§ã¯ãããŸãããã ã¯ã©ãŠãäžã§å®è¡ãããããšã§ç°å¢èŠå ã§èœã¡ãããšã¯çš èœã¡ãæã«ã¯èªåã§ãªãã©ã€ããã ãã«ãã CI äžã§å®è¡ããŠãã å®è¡ã¯ã¡ã³ããæŽ»åããŠããªãæé垯ã«è¡ã£ãŠãã ãšãã£ã蟺ããèŠå ããšæããŸãã ãŸã Magic Pod ã®ãããªããŒã«ã䜿ã£ãŠããå Žåã«å©ããéšåãšããŠã¯ãXcode ãªã©ãUI ãã¹ãã«å¿
èŠãªããŒã«ã®ã¢ããããŒãã«å¯Ÿããã¡ã³ããäžèŠãšããããšãæããããŸãã éã«å°ãèŸãæ ãããŸã§ Magic Pod ã®è¯ãéšåãå€ãæžããŸããããéã«ãã®ãã㪠GUI ã§ã®ãã¹ãããŒã«ã䜿ãããšã§å°ãããèŸãç¹ã玹ä»ããŠãããããšæããŸãã 1. ãã¹ãã³ãŒãã®ã¬ãã¥ãŒ ãã¹ãã³ãŒãïŒã±ãŒã¹ïŒã¯ Magic Pod äžã§ç®¡çãããŠãããããPR ã¬ãã¥ãŒãªã©ã®ããã»ã¹ãè¡ãããšãã§ããŸããã ãã®ãããã±ãŒã¹ã®ä¿®æ£ã«å¯ŸããŠãåæ ãããåã«ã¬ãã¥ãŒããŠãããããå Žåã¯ããã¹ãã±ãŒã¹ãã³ããŒããŠããç·šéãããªã©å°ã工倫ãå¿
èŠã«ãªãããšæããŸãã çŸç¶ã§ã¯å°ãããšã¯ãããŸããããè€æ°äººã§åäžã®ãããžã§ã¯ãã«å¯ŸããŠéçšãããå Žåã¯å°ãç
©éã«ãªãããã§ãã 2. ãã¹ãã³ãŒãã®ç®¡ç èªåãã¹ãã«ãããŠããã¹ãçµæã«åœ±é¿ãåºã仿§å€æŽãå
¥ããããªå Žåã仿§å€æŽã«å¯Ÿãããã¹ãã³ãŒãã®ä¿®æ£ã¯éçºãšäžŠè¡ããŠçšæããŠããããããã¯ããžã®å€æŽãããŒãžãããã¿ã€ãã³ã°ã§åæã«ãã¹ãã³ãŒãã®ä¿®æ£ãããŒãžãããã±ãŒã¹ããããŸãã Magic Pod ã§ã¯ GitHub äžã§ãã¹ãã³ãŒãã管çããŠããªãããããã®ãããªã±ãŒã¹ãžã®å¯Ÿå¿ãèªåã§è¡ãããšãé£ãããäºããã¹ãã±ãŒã¹ãåããŠçšæããŠãããå®è£
ãããŒãžãããåŸã«æåã§çœ®ãæããããããŒãžãããåŸã«åœ±é¿ã®ãããã¹ãã±ãŒã¹ãä¿®æ£ãããšãã£ãæåã§ã®ããã»ã¹ãå¿
èŠã«ãªããŸãã çŸæç¹ã§æ°ã«ãªã£ãã®ã¯äžèšã® 2 ç¹ã§ãããããããä»åŸæ¹åãããŠããå¯èœæ§ã¯å€§ãã«ãããŸãããããã»ã¹ã®äžã§ã®å·¥å€«æ¬¡ç¬¬ã§å¯ŸåŠãå¯èœããšæããŸãã ãã®ä» åºæ¬çã« UI ãã¹ããèªååããäžã§æ°ãã€ããã¹ãããšãã¢ã³ããã¿ãŒã³ã¯ã©ããªããŒã«ã䜿ã£ãŠãåãã§ãã ä»ã®ããŒã«ã§ã¯é£ããããšãããã®ããŒã«ã§ã¯å®çŸåºæ¥ããšããããšãçšã§ãæã«ã¯ãããã¯ãåŽã§æãå
¥ããå¿
èŠããããŸãã ã©ããªããŒã«ã§ãããäœããã工倫ããã°éæåºæ¥ãããšãå€ããããéããåºãã®ã¯å®è£
ãéçšããªã³ããŒãã£ã³ã°çã®ã³ã¹ãéšåãæã倧ããã®ã§ã¯ãªãããšæããŠããŸãã åšå²ã®ãµããŒã ãã¹ãèªååãè¡ãå ŽåïŒã ãã§ã¯ãªãã§ããïŒãåšå²ã®çè§£ãåŸãããšã¯å€§äºãªéšåã§ãããããŒã ã¡ã³ãã¯çååãã§èå³ãæã£ãŠãããŠé²ããããç°å¢ã§ããã ç¹ã« CI 飿ºã®éšåã§ã¯ iOS/Android ã®éçºã®æ¹ã«ããµããŒãããŠããã ã倧å€å©ãããŸããã ãã㊠Magic Pod ã«ã€ããŠã¯ãæ°å¹ŽåããéçšããŠããæ ªåŒäŒç€Ÿãããã®æŠç°ããã«ãäºåã«è©±ã䌺ã£ããããªã³ããŒãã£ã³ã°äžã¯è³ªåãããŠããã ãããããŸããïŒããããšãããããŸããïŒïŒã ãŸã Magic Pod ã®äŒè€æ§ã«ã¯å°å
¥æãããã©ãã«ã·ã¥ãŒãã£ã³ã°ã«å€å€§ãªãµããŒããããã ããŠããŸãã Circle CI ã«å
¥ã蟌ãéã«ã¯ãã¡ãã£ãšè©°ãŸã£ãç¹ãããäŒè€æ§ãšã¡ãŒã«ã§ããåãããŠããã®ã§ããããã®æ¥ã®ãã¡ã« ããã¥ã¡ã³ã ãã¢ããããããã ãšããç°å¢äžã§äžæãªãšã©ãŒãåºãŠããŠçžè«ããéã«ã¯ãã¹ãã¢ãã CLINICS ã¢ããªãããŠã³ããŒãããŠè©ŠããŠããã ãããããšã«ãããã€ãè¿
éãã€ãäžå¯§ãªå¯Ÿå¿ãå°è±¡çã§ããã ãŸã QA ããŒã ããªããããªå°äººæ°ã®ç¶æ³ã§ã¯ããããã£ããã©ãã«ã«å¯ŸããŠçžè«ã§ããå
±ã«è§£æ±ºæ³ãæ¢ããæ¹ããããšããæå³ã§ãéåžžã«å¿åŒ·ãã§ãã ä»åŸã«ã€ã㊠ã¢ããªã® UI ãã¹ãã«ã€ããŠãæ¹åããŠããããããšã¯ãŸã ãŸã 沢山ããã®ã§ãããçŸç¶ã§ãåºæ¬çãªãã¹ãã¯çšæã§ããŠããããããã£ããè
°ãæ®ããŠæ¹åããŠãããããšèããŠããŸãã ãŸãçŸåšã¯ãã©ãŠã¶ã®ãã¹ãèªååãé²ããŠããŸããã¡ãã¬ãŒã® CLINICS 以å€ã®ãããã¯ãã®å€ã㯠Web ãã©ãŠã¶ããã©ãããã©ãŒã ãšããŠãããããWeb ã«ã€ããŠã¯ãããã¯ããè·šãã æŽ»åãè¡ã£ãŠãããã°ãšèããŠããŸãã é·ããªããŸããããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã® QA ãšã³ãžãã¢ã®ç±³å±±ã§ãã䞻㫠CLINICS ã¢ããªã® QA ãæ
åœããŠããŸããã¡ãã¬ãŒã«ã¯ 2020 幎 8 æã«å
¥ç€ŸããŸããã ä»åã¯å
¥ç€ŸããŠãŸãè¡ã£ãããšã®äžã€ããªã°ã¬ãã·ã§ã³ãã¹ãã®èªååãšããã®ããã«å°å
¥ãã Magic Pod ãšããããŒã«ã«ã€ããŠãçµç·¯ãå°å
¥ããŠã¿ãçµæãã玹ä»ããããšæããŸãã CLINICS ãšã¯ ç§ã®æå±ããããŒã ã§éçºããŠãã CLINICS ãšãããããã¯ãã¯ã¢ããªã§ãªã³ã©ã€ã³èšºçããã¯ãªããã¯ã»ç
é¢ããåŠæ¹ç®ãçºè¡ããŠãããããšãã§ãããªã³ã©ã€ã³äžã§èšºå¯ãããè¬ã®åãåããŸã§å®çµã§ãããµãŒãã¹ã§ãã ãã©ãããã©ãŒã 㯠iOS ãš Android ã®ãã€ãã£ãã¢ããªãããããåæ§ã®ãµãŒãã¹ã Web ãã©ãŠã¶ãããå©çšããããšãåºæ¥ãŸãã QAïŒãªãªãŒã¹åšãã®ç¶æ³ CLINICS ã®éçºçµç¹ã« QA ãšã³ãžãã¢ããžã§ã€ã³ããã®ã¯æšå¹ŽïŒ2020 幎ïŒã§ããããµãŒãã¹èªäœã¯ 2016 幎ã«ããŒã³ããããŠããŸãã æ¬çµç¹ã§ã¯ãªãªãŒã¹åã«è¡ããªã°ã¬ãã·ã§ã³ãã¹ãã«ã€ããŠã¯ãéçºã¡ã³ããäžå¿ã«ããŒã å
šäœã§è¡ãæåããããŸãã ã¢ããªã®ãªãªãŒã¹ã¯éé±ã§è¡ã£ãŠããããã®éœåºŠéçºã¡ã³ãèªèº«ã«ãã£ãŠãã¹ããè¡ãããŠããŸããããèªååããã UI ãã¹ãã¯ååšããŠããŸããã§ããã ã¡ãã¬ãŒã§ã¯ QA ãšã³ãžãã¢ããžã§ã€ã³ããŠéããªããããããããããšã»ããã¹ãããšã¯å€å²ã«ãããäžã§ãŸãäœããçæããã¹ããæ€èšããŸããã QA ããã»ã¹ã®çå®ã»æ¹åãããæ°æ©èœããªãªãŒã¹ãŸã§æšé²ããããã® QA 掻åãããã䞊è¡ããŠå¹Ÿã€ãåããŠããäžã§ãã¹ãèªååãã©ã®ã¿ã€ãã³ã°ã§ãã©ããã£ãŠã¹ã¿ãŒããããæ©ã¿ãŸããã ããªã¥ãŒããèãã ã¡ãã¬ãŒã®ããªã¥ãŒã¯ãã®äžã€ã§ãããããã®ããªã¥ãŒèŠç¹ã§èããŠã¿ãŸããã ãå¡äºåŸ¹åºããšããŠããªãªãŒã¹åã®ãªã°ã¬ãã·ã§ã³ãã¹ãããã£ããè¡ãããšã¯åœç¶ã®ããšãšããŠèããããŸãã ãäžå€®çªç Žãã®èŠç¹ã§ã¯ã©ãããšèãããšããã¯ããã¹ãããã»ã¹ã«ãããŠãç¹ã«ãªãªãŒã¹æ¯ã«ç¹°ãè¿ãäœæ¥ãšãªããªã°ã¬ãã·ã§ã³ãã¹ããèªååããããšã¯çéã§ããããã¹ããã©ã¯ãã£ã¹ã®äžã€ã ãšèããããŸãã ãã®ããèªååã¯åªå
床é«ãé²ããã¹ãã§ã¯ãããŸãã æ®ãäžã€ãæªæ¥å¿åãã«ã€ããŠã¯ãäŸãã° 1~2 幎åŸããã®å
ãèããŠããªã°ã¬ãã·ã§ã³ãã¹ããèªååãããŠããã¹ããåŠãã§èšããšãã¯ã Yes ã§ãã ãŸããå¥ã®èгç¹ãšããŠãçŸåšã¯ããã 2 人㮠QA ãšã³ãžãã¢ã«å¯ŸããŠãè€æ°ã®ãããã¯ããååšããŠããç¶æ³ã§ãQA ãšã³ãžãã¢ãã¢ãµã€ã³ãããŠããªããããã¯ããå€ããããŸãã ç§èªèº«ãæšå¹Ž 10 æããã¢ããªã»åºç€ããŒã ã«ç°åããããšããããä»åŸã«ã€ããŠããŸãäœå¶ãå€ãã£ãŠããããšã¯ååã«èããããŸããã ãããªç¶æ³äžã§ã¯ã仮㫠UI ãã¹ããèªååããç°å¢ãçšæã§ãããšããŠããã®åŸã«æ
åœè
ãäžåšã«ãªã£ãå Žåãèæ
®ããŠããå¿
èŠããããŸãïŒèªåãã¹ãã«ãããŠãæ
åœãäžåšã«ãªã£ãããšã§ã¡ã³ããããªããªã圢骞åããã±ãŒã¹ã¯ãããã話ã§ãïŒã ãã®ãããä»®ã«å®è£
è
ãäžåšãšãªã£ãåŸã§ã誰ãã«åŒãç¶ããããããŸããšã³ãžãã¢ä»¥å€ã§ãéçšã§ããç°å¢ãæãŸãããšèããŸããããããã£ã芳ç¹ã§ããŒã«ãšããŠã¯åºæ¬ããŒã³ãŒãã§ãã¡ã³ãã§ãã Magic Pod ã¯æåãªåè£ãšãªããŸããã ãããããŸãšãããšã以äžã®ãããªçµè«ã«è³ããŸããã ãã¹ãã®èªååã¯æšé²ããæ¹ãè¯ã ãã ããä»ã®ã¡ã³ãã§ãã¡ã³ãããããç°å¢ãéžå®ãã ãã ã QA ãšããŠããã¹ãäºã沢山ããäžã§ããã¹ãèªååã ãã«å°å¿µã§ããç¶æ³ã§ã¯ãããŸããã ãã®ãããªãã¹ãä»ã¿ã¹ã¯ãšäžŠè¡ããŠå°ã³ã¹ãã§é²ããããäºãéèŠãªèŠçŽ ã§ããã èªååããã UI ãã¹ãã¯å
šããªãäºããä»ã®ãã¹ãã®å¯åºŠãéã¿ããšããªãã¹ãæ©ã段éã§äžå®ã®èªåãã¹ãç°å¢ã¯çšæããããšããæ³ãããããŸããã ãããã®ç¶æ³ãèžãŸããããŒã«ãéžå®ã»ãã©ã€ã¢ã«ããŠã¿ãçµæãMagic Pod ãå°å
¥ããããšã«æ±ºããŸããã Magic Pod ã®çŽ¹ä» Magic Pod ã«ã€ããŠããµãŒãã¹èªäœã®è©³çްã¯å²æããŸããã端çã«ãããšã¯ã©ãŠãç°å¢ã〠GUI ãã UI ãã¹ãã®å®è£
åã³å®è¡ãè¡ãããšãã§ããããŒã«ã§ãã GUI ã§èªåãã¹ããå®è£
ã§ããããŒã«ã ãšã Autify ãªã©ãæåã§ãã Autify ã¯ãã©ãŠã¶åãã®ããŒã«ã§ãããå®è£
æ¹æ³ã¯ Magic Pod ãšã¯å°ãç°ãªããæäœãã¬ã³ãŒãã£ã³ã°ããŠãã¹ãã·ããªãªãèªåã§çæããã圢ãåºæ¬ã§ãã äžæ¹ãMagic Pod ã¯ä»¥äžã®ããã«ã¢ããªã®ç»é¢ããŸããã£ããã£ã§åã蟌ã¿ããããããã¹ãã§äœ¿ãããé
ç®ãéžæããã·ããªãªã«ãã©ãã°ã¢ã³ãããããããŠããããšã§ãã¹ãã·ããªãªãçæããããšãã§ããŸãã ãã°ã€ã³ãªã©ãè€æ°ã®ãã¹ãã§äœ¿ãéšåã¯å
±éåããŠãããŸãã ãã¹ã察象ã iOS ã¢ããªã§ããããšãAndroid ã¢ããªããã©ãŠã¶ã§ããããšåºæ¬çã«åã I/F ãããã¹ãã®çæã»ã¡ã³ããåºæ¥ãããšã¯å€§ããªåŒ·ã¿ã®äžã€ã§ãã ãŸãããã¹ãã§äœ¿çšãããã£ãŒã«ãã®èŠçŽ ãéžæå¯èœãªããšããç¶æ
å€åã«åŒ·ããã¹ããšããäžã§ã®åŒ·ã¿ãšãªããŸãã äŸãã°ã調å€è¬å±åã§ãããããšããããã¹ããã£ãŒã«ãã«å¯ŸããŠããã®ããã¹ãã䜿ãã®ããID ãªã®ããããã¹ããã£ãŒã«ããªã®ã xpath ãªã®ããšãã£ãæã§ãã ãã®ããã ããã¹ããé »ç¹ã«å€ãããããªå ŽæïŒäŸãã°æ¥ä»ãªã©ïŒã§ã¯ããã¹ãã䜿ããªã ã¢ããªå
éšã§ãªãã¡ã¯ã¿ãªã³ã°ãªã©ãåããŠããå Žåã§ããã°éã« ID ã¯å€ããå¯èœæ§ãé«ããããããã¹ãã§æå®ãã UI ãã¹ããäœã蟌ãäžã§ã¯åœç¶ã®ããšã§ã¯ãããŸãããäžèšã®ãããªå·¥å€«ã«ãããã¹ãã®æåçãäžããããšãã§ããŸãã å°å
¥ããŠã¿ãŠ ãã©ã€ã¢ã«äžã¯æ¢ããªããã®éšåã¯ãã£ããã®ã®ãæ
£ãããšå®è£
å·¥æ°ã¯éåžžã«çæéã§å®è£
ã§ããããŒã¿ã«ã§ã iOS ã§ 2 3 é±éïŒãªã³ããŒãã£ã³ã°å«ãïŒãAndroid ã® UI ãã¹ãã«ã€ããŠã¯å®è³ª 2 3 æ¥ã§åºæ¬çãªãã¹ãã·ããªãªã®èªååãè¡ãäºãã§ããŸããã ãã®åŸãéçšããªããèœã¡ããããã¹ãã®æ¹ä¿®ãè¡ã£ãããéçšãå®å®ããŠãã㯠CI ã«ã飿ºããŠããŸãã UI ãã¹ãã®éçšã«ãããŠã¯å®æçã«å®è¡ããããšã¯éåžžã«éèŠãªããšã§ãããMagic Pod ã®å ŽåãBitrise ã§ã¯ UI äžããèšå®ã§ããCircle CI ã«å¯ŸããŠãããã¥ã¡ã³ããåç
§ããªããæ¯èŒç容æã«èšå®ã§ããŸãã å®éãæšå¹Ž 1 ã¯ã©ãŒã¿ãŒéçšããŠã¿ãŠã幟ã€ãã®ã¯ã©ãã·ã¥ããªãªãŒã¹åã«æ€ç¥ããŠãããŸããã ãŸããç§èªèº«ãéå»ã«ã¯ XCTest ã«ããã UITest( Testing Your Apps in Xcode )ã Appium ã䜿ã£ãŠ UI ãã¹ããéçšããŠããããã以äžã§ã¯ãããä»ããŒã«ãšã®æ¯èŒãå«ããŠç޹ä»ããŠã¿ãããšæããŸãã å®è£
ã³ã¹ã å®è£
ã³ã¹ãã«ãåææ§ç¯ãšããã®åŸã®ã¡ã³ãã³ã¹ãã§åãããŸãããä»ã®ããŒã«ãšæ¯èŒããŠã倧ããç°ãªãã®ã¯åææ§ç¯ã³ã¹ãã ãšæããŸãã Magic Pod ã«ã€ããŠã¯ç°å¢æ§ç¯ã³ã¹ãã¯éåžžã«äœã³ã¹ãã§è¡ãããšãã§ããŸãïŒåºæ¬çãªéšå㯠1 æ¥ããã°ååã ãšæããŸãïŒã ãŸããã¹ãã®ã¬ããŒãã£ã³ã°ããã£ããã£æ©èœãªã©ãæšæºã§ä»ããŠããŸãã®ã§ããã®èŸºããèªåã§é 匵ãå¿
èŠã¯ãããŸããã æ¬¡ã«ã¡ã³ãã³ã¹ãã§ãããäŸãã° XCUITest ã§ã¯ãŸããã«ããè¡ããdebug ããŠåãã¿ã³ãªã©ã®èŠçŽ ã® ID ãªã©ã確èªããããããçšããŠã³ãŒãã£ã³ã°ããŠããŸããã Magic Pod ã§ã¯äžåºŠã¢ããªãã¢ããããŒãããŠãã¹ãã£ã³ããããšã§ç»é¢ã®èŠçŽ ãäžæ¬ã§ååŸã§ãããã®äžããæäœãããèŠçŽ ãéžæããããšãã§ããŸãã ãã®ãããã¡ããã³ã¹ãã¯ã ãã¶äžãããŸãããã ããã®éšåã«ã€ããŠã¯ä»ã®ããŒã«ãèšèªã§ãæ
£ããã°ããæéã¯ããããªãã®ã§ãããããã倧差ãªããããããŸããã ãããŠèšããš debug ã§ ID ã確èªããæéãæ¥œã«ãªããå®è£
ãããã¹ãã詊ããŠå®è¡ããã®ã容æïŒãã«ãåŸ
ã¡ã®æéããªãïŒãšãã£ã蟺ãã§ããããã éçšã³ã¹ã UI ãã¹ããšããã° Flaky ãªãã¹ãïŒèœã¡ããèœã¡ãªãã£ãããããã¹ãïŒã«æ©ãŸãããããšã¯å€ãã§ãããéçšããŠã¿ããšæåã®å
ã¯ãããã£ãããšããããŸããããçŸç¶ã§ã¯ã»ãŒèµ·ããŠããŸããã ãã㯠Magic Pod ã«éã£ã話ã§ã¯ãããŸãããã ã¯ã©ãŠãäžã§å®è¡ãããããšã§ç°å¢èŠå ã§èœã¡ãããšã¯çš èœã¡ãæã«ã¯èªåã§ãªãã©ã€ããã ãã«ãã CI äžã§å®è¡ããŠãã å®è¡ã¯ã¡ã³ããæŽ»åããŠããªãæé垯ã«è¡ã£ãŠãã ãšãã£ã蟺ããèŠå ããšæããŸãã ãŸã Magic Pod ã®ãããªããŒã«ã䜿ã£ãŠããå Žåã«å©ããéšåãšããŠã¯ãXcode ãªã©ãUI ãã¹ãã«å¿
èŠãªããŒã«ã®ã¢ããããŒãã«å¯Ÿããã¡ã³ããäžèŠãšããããšãæããããŸãã éã«å°ãèŸãæ ãããŸã§ Magic Pod ã®è¯ãéšåãå€ãæžããŸããããéã«ãã®ãã㪠GUI ã§ã®ãã¹ãããŒã«ã䜿ãããšã§å°ãããèŸãç¹ã玹ä»ããŠãããããšæããŸãã 1. ãã¹ãã³ãŒãã®ã¬ãã¥ãŒ ãã¹ãã³ãŒãïŒã±ãŒã¹ïŒã¯ Magic Pod äžã§ç®¡çãããŠãããããPR ã¬ãã¥ãŒãªã©ã®ããã»ã¹ãè¡ãããšãã§ããŸããã ãã®ãããã±ãŒã¹ã®ä¿®æ£ã«å¯ŸããŠãåæ ãããåã«ã¬ãã¥ãŒããŠãããããå Žåã¯ããã¹ãã±ãŒã¹ãã³ããŒããŠããç·šéãããªã©å°ã工倫ãå¿
èŠã«ãªãããšæããŸãã çŸç¶ã§ã¯å°ãããšã¯ãããŸããããè€æ°äººã§åäžã®ãããžã§ã¯ãã«å¯ŸããŠéçšãããå Žåã¯å°ãç
©éã«ãªãããã§ãã 2. ãã¹ãã³ãŒãã®ç®¡ç èªåãã¹ãã«ãããŠããã¹ãçµæã«åœ±é¿ãåºã仿§å€æŽãå
¥ããããªå Žåã仿§å€æŽã«å¯Ÿãããã¹ãã³ãŒãã®ä¿®æ£ã¯éçºãšäžŠè¡ããŠçšæããŠããããããã¯ããžã®å€æŽãããŒãžãããã¿ã€ãã³ã°ã§åæã«ãã¹ãã³ãŒãã®ä¿®æ£ãããŒãžãããã±ãŒã¹ããããŸãã Magic Pod ã§ã¯ GitHub äžã§ãã¹ãã³ãŒãã管çããŠããªãããããã®ãããªã±ãŒã¹ãžã®å¯Ÿå¿ãèªåã§è¡ãããšãé£ãããäºããã¹ãã±ãŒã¹ãåããŠçšæããŠãããå®è£
ãããŒãžãããåŸã«æåã§çœ®ãæããããããŒãžãããåŸã«åœ±é¿ã®ãããã¹ãã±ãŒã¹ãä¿®æ£ãããšãã£ãæåã§ã®ããã»ã¹ãå¿
èŠã«ãªããŸãã çŸæç¹ã§æ°ã«ãªã£ãã®ã¯äžèšã® 2 ç¹ã§ãããããããä»åŸæ¹åãããŠããå¯èœæ§ã¯å€§ãã«ãããŸãããããã»ã¹ã®äžã§ã®å·¥å€«æ¬¡ç¬¬ã§å¯ŸåŠãå¯èœããšæããŸãã ãã®ä» åºæ¬çã« UI ãã¹ããèªååããäžã§æ°ãã€ããã¹ãããšãã¢ã³ããã¿ãŒã³ã¯ã©ããªããŒã«ã䜿ã£ãŠãåãã§ãã ä»ã®ããŒã«ã§ã¯é£ããããšãããã®ããŒã«ã§ã¯å®çŸåºæ¥ããšããããšãçšã§ãæã«ã¯ãããã¯ãåŽã§æãå
¥ããå¿
èŠããããŸãã ã©ããªããŒã«ã§ãããäœããã工倫ããã°éæåºæ¥ãããšãå€ããããéããåºãã®ã¯å®è£
ãéçšããªã³ããŒãã£ã³ã°çã®ã³ã¹ãéšåãæã倧ããã®ã§ã¯ãªãããšæããŠããŸãã åšå²ã®ãµããŒã ãã¹ãèªååãè¡ãå ŽåïŒã ãã§ã¯ãªãã§ããïŒãåšå²ã®çè§£ãåŸãããšã¯å€§äºãªéšåã§ãããããŒã ã¡ã³ãã¯çååãã§èå³ãæã£ãŠãããŠé²ããããç°å¢ã§ããã ç¹ã« CI 飿ºã®éšåã§ã¯ iOS/Android ã®éçºã®æ¹ã«ããµããŒãããŠããã ã倧å€å©ãããŸããã ãã㊠Magic Pod ã«ã€ããŠã¯ãæ°å¹ŽåããéçšããŠããæ ªåŒäŒç€Ÿãããã®æŠç°ããã«ãäºåã«è©±ã䌺ã£ããããªã³ããŒãã£ã³ã°äžã¯è³ªåãããŠããã ãããããŸããïŒããããšãããããŸããïŒïŒã ãŸã Magic Pod ã®äŒè€æ§ã«ã¯å°å
¥æãããã©ãã«ã·ã¥ãŒãã£ã³ã°ã«å€å€§ãªãµããŒããããã ããŠããŸãã Circle CI ã«å
¥ã蟌ãéã«ã¯ãã¡ãã£ãšè©°ãŸã£ãç¹ãããäŒè€æ§ãšã¡ãŒã«ã§ããåãããŠããã®ã§ããããã®æ¥ã®ãã¡ã« ããã¥ã¡ã³ã ãã¢ããããããã ãšããç°å¢äžã§äžæãªãšã©ãŒãåºãŠããŠçžè«ããéã«ã¯ãã¹ãã¢ãã CLINICS ã¢ããªãããŠã³ããŒãããŠè©ŠããŠããã ãããããšã«ãããã€ãè¿
éãã€ãäžå¯§ãªå¯Ÿå¿ãå°è±¡çã§ããã ãŸã QA ããŒã ããªããããªå°äººæ°ã®ç¶æ³ã§ã¯ããããã£ããã©ãã«ã«å¯ŸããŠçžè«ã§ããå
±ã«è§£æ±ºæ³ãæ¢ããæ¹ããããšããæå³ã§ãéåžžã«å¿åŒ·ãã§ãã ä»åŸã«ã€ã㊠ã¢ããªã® UI ãã¹ãã«ã€ããŠãæ¹åããŠããããããšã¯ãŸã ãŸã 沢山ããã®ã§ãããçŸç¶ã§ãåºæ¬çãªãã¹ãã¯çšæã§ããŠããããããã£ããè
°ãæ®ããŠæ¹åããŠãããããšèããŠããŸãã ãŸãçŸåšã¯ãã©ãŠã¶ã®ãã¹ãèªååãé²ããŠããŸããã¡ãã¬ãŒã® CLINICS 以å€ã®ãããã¯ãã®å€ã㯠Web ãã©ãŠã¶ããã©ãããã©ãŒã ãšããŠãããããWeb ã«ã€ããŠã¯ãããã¯ããè·šãã æŽ»åãè¡ã£ãŠãããã°ãšèããŠããŸãã é·ããªããŸããããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã® QA ãšã³ãžãã¢ã®ç±³å±±ã§ãã䞻㫠CLINICS ã¢ããªã® QA ãæ
åœããŠããŸããã¡ãã¬ãŒã«ã¯ 2020 幎 8 æã«å
¥ç€ŸããŸããã ä»åã¯å
¥ç€ŸããŠãŸãè¡ã£ãããšã®äžã€ããªã°ã¬ãã·ã§ã³ãã¹ãã®èªååãšããã®ããã«å°å
¥ãã Magic Pod ãšããããŒã«ã«ã€ããŠãçµç·¯ãå°å
¥ããŠã¿ãçµæãã玹ä»ããããšæããŸãã CLINICS ãšã¯ ç§ã®æå±ããããŒã ã§éçºããŠãã CLINICS ãšãããããã¯ãã¯ã¢ããªã§ãªã³ã©ã€ã³èšºçããã¯ãªããã¯ã»ç
é¢ããåŠæ¹ç®ãçºè¡ããŠãããããšãã§ãããªã³ã©ã€ã³äžã§èšºå¯ãããè¬ã®åãåããŸã§å®çµã§ãããµãŒãã¹ã§ãã ãã©ãããã©ãŒã 㯠iOS ãš Android ã®ãã€ãã£ãã¢ããªãããããåæ§ã®ãµãŒãã¹ã Web ãã©ãŠã¶ãããå©çšããããšãåºæ¥ãŸãã QAïŒãªãªãŒã¹åšãã®ç¶æ³ CLINICS ã®éçºçµç¹ã« QA ãšã³ãžãã¢ããžã§ã€ã³ããã®ã¯æšå¹ŽïŒ2020 幎ïŒã§ããããµãŒãã¹èªäœã¯ 2016 幎ã«ããŒã³ããããŠããŸãã æ¬çµç¹ã§ã¯ãªãªãŒã¹åã«è¡ããªã°ã¬ãã·ã§ã³ãã¹ãã«ã€ããŠã¯ãéçºã¡ã³ããäžå¿ã«ããŒã å
šäœã§è¡ãæåããããŸãã ã¢ããªã®ãªãªãŒã¹ã¯éé±ã§è¡ã£ãŠããããã®éœåºŠéçºã¡ã³ãèªèº«ã«ãã£ãŠãã¹ããè¡ãããŠããŸããããèªååããã UI ãã¹ãã¯ååšããŠããŸããã§ããã ã¡ãã¬ãŒã§ã¯ QA ãšã³ãžãã¢ããžã§ã€ã³ããŠéããªããããããããããšã»ããã¹ãããšã¯å€å²ã«ãããäžã§ãŸãäœããçæããã¹ããæ€èšããŸããã QA ããã»ã¹ã®çå®ã»æ¹åãããæ°æ©èœããªãªãŒã¹ãŸã§æšé²ããããã® QA 掻åãããã䞊è¡ããŠå¹Ÿã€ãåããŠããäžã§ãã¹ãèªååãã©ã®ã¿ã€ãã³ã°ã§ãã©ããã£ãŠã¹ã¿ãŒããããæ©ã¿ãŸããã ããªã¥ãŒããèãã ã¡ãã¬ãŒã®ããªã¥ãŒã¯ãã®äžã€ã§ãããããã®ããªã¥ãŒèŠç¹ã§èããŠã¿ãŸããã ãå¡äºåŸ¹åºããšããŠããªãªãŒã¹åã®ãªã°ã¬ãã·ã§ã³ãã¹ãããã£ããè¡ãããšã¯åœç¶ã®ããšãšããŠèããããŸãã ãäžå€®çªç Žãã®èŠç¹ã§ã¯ã©ãããšèãããšããã¯ããã¹ãããã»ã¹ã«ãããŠãç¹ã«ãªãªãŒã¹æ¯ã«ç¹°ãè¿ãäœæ¥ãšãªããªã°ã¬ãã·ã§ã³ãã¹ããèªååããããšã¯çéã§ããããã¹ããã©ã¯ãã£ã¹ã®äžã€ã ãšèããããŸãã ãã®ããèªååã¯åªå
床é«ãé²ããã¹ãã§ã¯ãããŸãã æ®ãäžã€ãæªæ¥å¿åãã«ã€ããŠã¯ãäŸãã° 1~2 幎åŸããã®å
ãèããŠããªã°ã¬ãã·ã§ã³ãã¹ããèªååãããŠããã¹ããåŠãã§èšããšãã¯ã Yes ã§ãã ãŸããå¥ã®èгç¹ãšããŠãçŸåšã¯ããã 2 人㮠QA ãšã³ãžãã¢ã«å¯ŸããŠãè€æ°ã®ãããã¯ããååšããŠããç¶æ³ã§ãQA ãšã³ãžãã¢ãã¢ãµã€ã³ãããŠããªããããã¯ããå€ããããŸãã ç§èªèº«ãæšå¹Ž 10 æããã¢ããªã»åºç€ããŒã ã«ç°åããããšããããä»åŸã«ã€ããŠããŸãäœå¶ãå€ãã£ãŠããããšã¯ååã«èããããŸããã ãããªç¶æ³äžã§ã¯ã仮㫠UI ãã¹ããèªååããç°å¢ãçšæã§ãããšããŠããã®åŸã«æ
åœè
ãäžåšã«ãªã£ãå Žåãèæ
®ããŠããå¿
èŠããããŸãïŒèªåãã¹ãã«ãããŠãæ
åœãäžåšã«ãªã£ãããšã§ã¡ã³ããããªããªã圢骞åããã±ãŒã¹ã¯ãããã話ã§ãïŒã ãã®ãããä»®ã«å®è£
è
ãäžåšãšãªã£ãåŸã§ã誰ãã«åŒãç¶ããããããŸããšã³ãžãã¢ä»¥å€ã§ãéçšã§ããç°å¢ãæãŸãããšèããŸããããããã£ã芳ç¹ã§ããŒã«ãšããŠã¯åºæ¬ããŒã³ãŒãã§ãã¡ã³ãã§ãã Magic Pod ã¯æåãªåè£ãšãªããŸããã ãããããŸãšãããšã以äžã®ãããªçµè«ã«è³ããŸããã ãã¹ãã®èªååã¯æšé²ããæ¹ãè¯ã ãã ããä»ã®ã¡ã³ãã§ãã¡ã³ãããããç°å¢ãéžå®ãã ãã ã QA ãšããŠããã¹ãäºã沢山ããäžã§ããã¹ãèªååã ãã«å°å¿µã§ããç¶æ³ã§ã¯ãããŸããã ãã®ãããªãã¹ãä»ã¿ã¹ã¯ãšäžŠè¡ããŠå°ã³ã¹ãã§é²ããããäºãéèŠãªèŠçŽ ã§ããã èªååããã UI ãã¹ãã¯å
šããªãäºããä»ã®ãã¹ãã®å¯åºŠãéã¿ããšããªãã¹ãæ©ã段éã§äžå®ã®èªåãã¹ãç°å¢ã¯çšæããããšããæ³ãããããŸããã ãããã®ç¶æ³ãèžãŸããããŒã«ãéžå®ã»ãã©ã€ã¢ã«ããŠã¿ãçµæãMagic Pod ãå°å
¥ããããšã«æ±ºããŸããã Magic Pod ã®çŽ¹ä» Magic Pod ã«ã€ããŠããµãŒãã¹èªäœã®è©³çްã¯å²æããŸããã端çã«ãããšã¯ã©ãŠãç°å¢ã〠GUI ãã UI ãã¹ãã®å®è£
åã³å®è¡ãè¡ãããšãã§ããããŒã«ã§ãã GUI ã§èªåãã¹ããå®è£
ã§ããããŒã«ã ãšã Autify ãªã©ãæåã§ãã Autify ã¯ãã©ãŠã¶åãã®ããŒã«ã§ãããå®è£
æ¹æ³ã¯ Magic Pod ãšã¯å°ãç°ãªããæäœãã¬ã³ãŒãã£ã³ã°ããŠãã¹ãã·ããªãªãèªåã§çæããã圢ãåºæ¬ã§ãã äžæ¹ãMagic Pod ã¯ä»¥äžã®ããã«ã¢ããªã®ç»é¢ããŸããã£ããã£ã§åã蟌ã¿ããããããã¹ãã§äœ¿ãããé
ç®ãéžæããã·ããªãªã«ãã©ãã°ã¢ã³ãããããããŠããããšã§ãã¹ãã·ããªãªãçæããããšãã§ããŸãã ãã°ã€ã³ãªã©ãè€æ°ã®ãã¹ãã§äœ¿ãéšåã¯å
±éåããŠãããŸãã ãã¹ã察象ã iOS ã¢ããªã§ããããšãAndroid ã¢ããªããã©ãŠã¶ã§ããããšåºæ¬çã«åã I/F ãããã¹ãã®çæã»ã¡ã³ããåºæ¥ãããšã¯å€§ããªåŒ·ã¿ã®äžã€ã§ãã ãŸãããã¹ãã§äœ¿çšãããã£ãŒã«ãã®èŠçŽ ãéžæå¯èœãªããšããç¶æ
å€åã«åŒ·ããã¹ããšããäžã§ã®åŒ·ã¿ãšãªããŸãã äŸãã°ã調å€è¬å±åã§ãããããšããããã¹ããã£ãŒã«ãã«å¯ŸããŠããã®ããã¹ãã䜿ãã®ããID ãªã®ããããã¹ããã£ãŒã«ããªã®ã xpath ãªã®ããšãã£ãæã§ãã ãã®ããã ããã¹ããé »ç¹ã«å€ãããããªå ŽæïŒäŸãã°æ¥ä»ãªã©ïŒã§ã¯ããã¹ãã䜿ããªã ã¢ããªå
éšã§ãªãã¡ã¯ã¿ãªã³ã°ãªã©ãåããŠããå Žåã§ããã°éã« ID ã¯å€ããå¯èœæ§ãé«ããããããã¹ãã§æå®ãã UI ãã¹ããäœã蟌ãäžã§ã¯åœç¶ã®ããšã§ã¯ãããŸãããäžèšã®ãããªå·¥å€«ã«ãããã¹ãã®æåçãäžããããšãã§ããŸãã å°å
¥ããŠã¿ãŠ ãã©ã€ã¢ã«äžã¯æ¢ããªããã®éšåã¯ãã£ããã®ã®ãæ
£ãããšå®è£
å·¥æ°ã¯éåžžã«çæéã§å®è£
ã§ããããŒã¿ã«ã§ã iOS ã§ 2 3 é±éïŒãªã³ããŒãã£ã³ã°å«ãïŒãAndroid ã® UI ãã¹ãã«ã€ããŠã¯å®è³ª 2 3 æ¥ã§åºæ¬çãªãã¹ãã·ããªãªã®èªååãè¡ãäºãã§ããŸããã ãã®åŸãéçšããªããèœã¡ããããã¹ãã®æ¹ä¿®ãè¡ã£ãããéçšãå®å®ããŠãã㯠CI ã«ã飿ºããŠããŸãã UI ãã¹ãã®éçšã«ãããŠã¯å®æçã«å®è¡ããããšã¯éåžžã«éèŠãªããšã§ãããMagic Pod ã®å ŽåãBitrise ã§ã¯ UI äžããèšå®ã§ããCircle CI ã«å¯ŸããŠãããã¥ã¡ã³ããåç
§ããªããæ¯èŒç容æã«èšå®ã§ããŸãã å®éãæšå¹Ž 1 ã¯ã©ãŒã¿ãŒéçšããŠã¿ãŠã幟ã€ãã®ã¯ã©ãã·ã¥ããªãªãŒã¹åã«æ€ç¥ããŠãããŸããã ãŸããç§èªèº«ãéå»ã«ã¯ XCTest ã«ããã UITest( Testing Your Apps in Xcode )ã Appium ã䜿ã£ãŠ UI ãã¹ããéçšããŠããããã以äžã§ã¯ãããä»ããŒã«ãšã®æ¯èŒãå«ããŠç޹ä»ããŠã¿ãããšæããŸãã å®è£
ã³ã¹ã å®è£
ã³ã¹ãã«ãåææ§ç¯ãšããã®åŸã®ã¡ã³ãã³ã¹ãã§åãããŸãããä»ã®ããŒã«ãšæ¯èŒããŠã倧ããç°ãªãã®ã¯åææ§ç¯ã³ã¹ãã ãšæããŸãã Magic Pod ã«ã€ããŠã¯ç°å¢æ§ç¯ã³ã¹ãã¯éåžžã«äœã³ã¹ãã§è¡ãããšãã§ããŸãïŒåºæ¬çãªéšå㯠1 æ¥ããã°ååã ãšæããŸãïŒã ãŸããã¹ãã®ã¬ããŒãã£ã³ã°ããã£ããã£æ©èœãªã©ãæšæºã§ä»ããŠããŸãã®ã§ããã®èŸºããèªåã§é 匵ãå¿
èŠã¯ãããŸããã æ¬¡ã«ã¡ã³ãã³ã¹ãã§ãããäŸãã° XCUITest ã§ã¯ãŸããã«ããè¡ããdebug ããŠåãã¿ã³ãªã©ã®èŠçŽ ã® ID ãªã©ã確èªããããããçšããŠã³ãŒãã£ã³ã°ããŠããŸããã Magic Pod ã§ã¯äžåºŠã¢ããªãã¢ããããŒãããŠãã¹ãã£ã³ããããšã§ç»é¢ã®èŠçŽ ãäžæ¬ã§ååŸã§ãããã®äžããæäœãããèŠçŽ ãéžæããããšãã§ããŸãã ãã®ãããã¡ããã³ã¹ãã¯ã ãã¶äžãããŸãããã ããã®éšåã«ã€ããŠã¯ä»ã®ããŒã«ãèšèªã§ãæ
£ããã°ããæéã¯ããããªãã®ã§ãããããã倧差ãªããããããŸããã ãããŠèšããš debug ã§ ID ã確èªããæéãæ¥œã«ãªããå®è£
ãããã¹ãã詊ããŠå®è¡ããã®ã容æïŒãã«ãåŸ
ã¡ã®æéããªãïŒãšãã£ã蟺ãã§ããããã éçšã³ã¹ã UI ãã¹ããšããã° Flaky ãªãã¹ãïŒèœã¡ããèœã¡ãªãã£ãããããã¹ãïŒã«æ©ãŸãããããšã¯å€ãã§ãããéçšããŠã¿ããšæåã®å
ã¯ãããã£ãããšããããŸããããçŸç¶ã§ã¯ã»ãŒèµ·ããŠããŸããã ãã㯠Magic Pod ã«éã£ã話ã§ã¯ãããŸãããã ã¯ã©ãŠãäžã§å®è¡ãããããšã§ç°å¢èŠå ã§èœã¡ãããšã¯çš èœã¡ãæã«ã¯èªåã§ãªãã©ã€ããã ãã«ãã CI äžã§å®è¡ããŠãã å®è¡ã¯ã¡ã³ããæŽ»åããŠããªãæé垯ã«è¡ã£ãŠãã ãšãã£ã蟺ããèŠå ããšæããŸãã ãŸã Magic Pod ã®ãããªããŒã«ã䜿ã£ãŠããå Žåã«å©ããéšåãšããŠã¯ãXcode ãªã©ãUI ãã¹ãã«å¿
èŠãªããŒã«ã®ã¢ããããŒãã«å¯Ÿããã¡ã³ããäžèŠãšããããšãæããããŸãã éã«å°ãèŸãæ ãããŸã§ Magic Pod ã®è¯ãéšåãå€ãæžããŸããããéã«ãã®ãã㪠GUI ã§ã®ãã¹ãããŒã«ã䜿ãããšã§å°ãããèŸãç¹ã玹ä»ããŠãããããšæããŸãã 1. ãã¹ãã³ãŒãã®ã¬ãã¥ãŒ ãã¹ãã³ãŒãïŒã±ãŒã¹ïŒã¯ Magic Pod äžã§ç®¡çãããŠãããããPR ã¬ãã¥ãŒãªã©ã®ããã»ã¹ãè¡ãããšãã§ããŸããã ãã®ãããã±ãŒã¹ã®ä¿®æ£ã«å¯ŸããŠãåæ ãããåã«ã¬ãã¥ãŒããŠãããããå Žåã¯ããã¹ãã±ãŒã¹ãã³ããŒããŠããç·šéãããªã©å°ã工倫ãå¿
èŠã«ãªãããšæããŸãã çŸç¶ã§ã¯å°ãããšã¯ãããŸããããè€æ°äººã§åäžã®ãããžã§ã¯ãã«å¯ŸããŠéçšãããå Žåã¯å°ãç
©éã«ãªãããã§ãã 2. ãã¹ãã³ãŒãã®ç®¡ç èªåãã¹ãã«ãããŠããã¹ãçµæã«åœ±é¿ãåºã仿§å€æŽãå
¥ããããªå Žåã仿§å€æŽã«å¯Ÿãããã¹ãã³ãŒãã®ä¿®æ£ã¯éçºãšäžŠè¡ããŠçšæããŠããããããã¯ããžã®å€æŽãããŒãžãããã¿ã€ãã³ã°ã§åæã«ãã¹ãã³ãŒãã®ä¿®æ£ãããŒãžãããã±ãŒã¹ããããŸãã Magic Pod ã§ã¯ GitHub äžã§ãã¹ãã³ãŒãã管çããŠããªãããããã®ãããªã±ãŒã¹ãžã®å¯Ÿå¿ãèªåã§è¡ãããšãé£ãããäºããã¹ãã±ãŒã¹ãåããŠçšæããŠãããå®è£
ãããŒãžãããåŸã«æåã§çœ®ãæããããããŒãžãããåŸã«åœ±é¿ã®ãããã¹ãã±ãŒã¹ãä¿®æ£ãããšãã£ãæåã§ã®ããã»ã¹ãå¿
èŠã«ãªããŸãã çŸæç¹ã§æ°ã«ãªã£ãã®ã¯äžèšã® 2 ç¹ã§ãããããããä»åŸæ¹åãããŠããå¯èœæ§ã¯å€§ãã«ãããŸãããããã»ã¹ã®äžã§ã®å·¥å€«æ¬¡ç¬¬ã§å¯ŸåŠãå¯èœããšæããŸãã ãã®ä» åºæ¬çã« UI ãã¹ããèªååããäžã§æ°ãã€ããã¹ãããšãã¢ã³ããã¿ãŒã³ã¯ã©ããªããŒã«ã䜿ã£ãŠãåãã§ãã ä»ã®ããŒã«ã§ã¯é£ããããšãããã®ããŒã«ã§ã¯å®çŸåºæ¥ããšããããšãçšã§ãæã«ã¯ãããã¯ãåŽã§æãå
¥ããå¿
èŠããããŸãã ã©ããªããŒã«ã§ãããäœããã工倫ããã°éæåºæ¥ãããšãå€ããããéããåºãã®ã¯å®è£
ãéçšããªã³ããŒãã£ã³ã°çã®ã³ã¹ãéšåãæã倧ããã®ã§ã¯ãªãããšæããŠããŸãã åšå²ã®ãµããŒã ãã¹ãèªååãè¡ãå ŽåïŒã ãã§ã¯ãªãã§ããïŒãåšå²ã®çè§£ãåŸãããšã¯å€§äºãªéšåã§ãããããŒã ã¡ã³ãã¯çååãã§èå³ãæã£ãŠãããŠé²ããããç°å¢ã§ããã ç¹ã« CI 飿ºã®éšåã§ã¯ iOS/Android ã®éçºã®æ¹ã«ããµããŒãããŠããã ã倧å€å©ãããŸããã ãã㊠Magic Pod ã«ã€ããŠã¯ãæ°å¹ŽåããéçšããŠããæ ªåŒäŒç€Ÿãããã®æŠç°ããã«ãäºåã«è©±ã䌺ã£ããããªã³ããŒãã£ã³ã°äžã¯è³ªåãããŠããã ãããããŸããïŒããããšãããããŸããïŒïŒã ãŸã Magic Pod ã®äŒè€æ§ã«ã¯å°å
¥æãããã©ãã«ã·ã¥ãŒãã£ã³ã°ã«å€å€§ãªãµããŒããããã ããŠããŸãã Circle CI ã«å
¥ã蟌ãéã«ã¯ãã¡ãã£ãšè©°ãŸã£ãç¹ãããäŒè€æ§ãšã¡ãŒã«ã§ããåãããŠããã®ã§ããããã®æ¥ã®ãã¡ã« ããã¥ã¡ã³ã ãã¢ããããããã ãšããç°å¢äžã§äžæãªãšã©ãŒãåºãŠããŠçžè«ããéã«ã¯ãã¹ãã¢ãã CLINICS ã¢ããªãããŠã³ããŒãããŠè©ŠããŠããã ãããããšã«ãããã€ãè¿
éãã€ãäžå¯§ãªå¯Ÿå¿ãå°è±¡çã§ããã ãŸã QA ããŒã ããªããããªå°äººæ°ã®ç¶æ³ã§ã¯ããããã£ããã©ãã«ã«å¯ŸããŠçžè«ã§ããå
±ã«è§£æ±ºæ³ãæ¢ããæ¹ããããšããæå³ã§ãéåžžã«å¿åŒ·ãã§ãã ä»åŸã«ã€ã㊠ã¢ããªã® UI ãã¹ãã«ã€ããŠãæ¹åããŠããããããšã¯ãŸã ãŸã 沢山ããã®ã§ãããçŸç¶ã§ãåºæ¬çãªãã¹ãã¯çšæã§ããŠããããããã£ããè
°ãæ®ããŠæ¹åããŠãããããšèããŠããŸãã ãŸãçŸåšã¯ãã©ãŠã¶ã®ãã¹ãèªååãé²ããŠããŸããã¡ãã¬ãŒã® CLINICS 以å€ã®ãããã¯ãã®å€ã㯠Web ãã©ãŠã¶ããã©ãããã©ãŒã ãšããŠãããããWeb ã«ã€ããŠã¯ãããã¯ããè·šãã æŽ»åãè¡ã£ãŠãããã°ãšèããŠããŸãã é·ããªããŸããããæåŸãŸã§ãèªã¿ããã ãããããšãããããŸããã åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp
ã¯ããã« ããã«ã¡ã¯ãã³ãŒãã¬ãŒããšã³ãžãã¢ã®æºå£ã§ãã ã¡ãã¬ãŒã§ã¯ãä»å¹Ž 7 æã«çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããŸããã 詳现ã¯ãã·ã¹ãã æŠèŠãã®ç« ã§ã玹ä»ããŸãããã·ã¹ãã ã®å
šäœåãšããŠã¯ä»¥äžã®ããã«ãªã£ãŠãããŸãã ã¯ãŒã¯ãããŒã·ã¹ãã ãšèãããããã©ããªã·ã¹ãã ãæãæµ®ãã¹ãŸããïŒ ç³è«è
ãã·ã¹ãã ã§ç³è«ãããšãäºãå®ããããæ¿èªè
ãžæ¿èªäŸé Œãã¡ãŒã«ã§éç¥ãããç³è«å
容ã®ç¢ºèªåã³æ¿èªã®ããã«ã·ã¹ãã ãžãã°ã€ã³ããããšããæµããããããã¯ãŒã¯ãããŒã·ã¹ãã ã§ã¯ãªãããªãšæããŸãã æã
ã¯ã³ãŒãã¬ãŒãéšéãšããŠã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠããŸããæ
ã«ãã¡ãã¬ãŒã®çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã«ãããŠã äŸ¿å© ã§ åçç ãªã·ã¹ãã ãç®æããŠéçºãè¡ããŸãããä»å ChatOps ã®æŠå¿µãåãå
¥ããããšã§ãäžè¬çãªã¯ãŒã¯ãããŒã·ã¹ãã ãããæŽç·Žãããã·ã¹ãã ãæ§ç¯ã§ããããªãšæããŸãã æ¬çš¿ã§ã¯ã·ã¹ãã æŠèŠåã³ãè£åŽã®ä»çµã¿ãã玹ä»ããŠãããŸãã æåŸãŸã§ãä»ãåãããã ããã°å¹žãã§ãã ChatOps ãšã¯ ChatOps ãšã¯ããã£ãããµãŒãã¹ïŒChatïŒãããŒã¹ãšããŠãã·ã¹ãã éçšïŒOpsïŒãè¡ãããšããæå³ã§ãããã£ããæžããšãã·ã¹ãã ãã Chat ãžã¡ãã»ãŒãžãé£ã°ããæ¬¡ã®ã¢ã¯ã·ã§ã³ãåã Chat ç»é¢ã§éå§ã§ããããšãããã®ãšãªããŸãã(äžèšãããŒã¯ãããŸã§äžäŸã§ã) ChatOps ã«ã¯ä»¥äžã®ã¡ãªããããããšèããŠããŸãã åžžã«ç«ã¡äžããŠããããŒã«ãšããå
±éã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ã€ã³ã¿ã©ã¯ãã£ããªã³ãã¥ãã±ãŒã·ã§ã³ã«ã€ãªãããã¹ããŒãã£ã§ãã å
±æãããããèšé²ã«æ®ãããã æ¬çš¿ã§ã¯ã詳ãã説æã¯ããŸããããèå³ãããæ¹ã¯äºäŸçã解説ããŠãããµã€ããããã®ã§ãæ¯éæ¢ããŠã¿ãŠãã ããã ãªã ChatOps ãªã®ã çšè°ç³è«ã«ãããŠã¯ æ¿èªè
ãããå€åŒãããŠããã£ãŠ Ãà åã«ãªã£ãã¯ãã ãã©ãéé¡ééã£ãŠãªãïŒã ç³è«è
ããããŸããã倿Žãå¿ããŸãããå·®æ»ããé¡ãããŸãã ãªã©ã®ã³ãã¥ãã±ãŒã·ã§ã³ã床ã
çºçããŸãã éåžžã®ã·ã¹ãã ã§ããã°ã確èªäºé
ãããéã¯ã·ã¹ãã å
ã®ã³ãã¥ãã±ãŒã·ã§ã³æ©èœã䜿ãããããã¯ãChat ã« URL ãçšè°çªå·ã転èšããŠç¢ºèªã®ããã®ã³ãã¥ãã±ãŒã·ã§ã³ãåãããšãæ³å®ãããŸãã ã¡ãã¬ãŒå
ã®æ¥åã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack äžã§æ®ã©å®çµããŠããŸãã Slack ã§ã¯ãªãä»ã®å Žæã§äŒè©±ãçºçãããšæ
å ±ã忣ããŸãããSlack ã« URL ã転èšãããšãã£ãè¡çºããå¥ã·ã¹ãã ãžã®ãã°ã€ã³ãªã©ãéå¹çã§ãã ããã§ã å
±éã€ã³ã¿ãŒãã§ãŒã¹ã® Chat ãäžå¿ã«ã·ã¹ãã æ§ç¯ããïŒ ChatOps ãæ¡çšããçšè°ã¯ãŒã¯ãããŒãæ§ç¯ããŠã¿ãããšèããŸãããçµæãçšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã®æ
å ±ã Slack ãžé£æºããçšè°ã«ãããã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack ã«éçŽãæ¿èªè¡çºã Slack äžã§å¯èœããšããã·ã¹ãã ãæ§ç¯ããããšãã§ããŸããã ã·ã¹ãã æŠèŠ ç³è« ç³è«è
㯠TeamSpirit äžã§çšè°å
容ãèšå
¥ããçšè°ç³è«ãè¡ããŸãã TeamSpirit ãšã¯ã倿 管çãå·¥æ°ç®¡çãçµè²»ç²Ÿç®ãªã©ã管çã§ããã¯ã©ãŠããµãŒãã¹ã§ããSalesforce ããã©ãããã©ãŒã ãšããŠæ¡çšããŠãããã¢ã€ãã¢æ¬¡ç¬¬ã§ãããããªã«ã¹ã¿ãã€ãºãå¯èœã§ãã Slack ããç³è«ã§ããããã«ããã®ã ChatOps ã®ããã¹ãå§¿ãããããŸããããéå»ã®ç³è«ããã³ããŒããããç³è«çš®å¥ããšã«å
¥åããé
ç®ãç°ãªãçã®èŠä»¶ãèæ
®ããTeamSpirit ããç³è«ããããã«èšèšããŸãããç³è«ã®å°ç·ã«ã€ããŠã¯ãä»åŸãããããä»çµã¿ã«ç£šãäžããŠãããããšèããŠããŸãã æ¿èª ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒäžãããšãSlack ã®çšè°ãã£ã³ãã«ã«ç³è«å
容åã³æ·»ä»ãã¡ã€ã«ãèªåæçš¿ãããŸãã æ¿èªè
ã¯ç³è«å
容ã«åé¡ããªããã°ãæçš¿ã«é
眮ãããŠãããã¿ã³ãå©çšããŠæ¿èªã»å·®æ»ããè¡ããŸãã æ¿èªè
ã¯çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãžã¢ã¯ã»ã¹ããããšãªããSlack ã§æ¿èªè¡çºãå®çµã§ããŸããçšè°å
容ã«ãããŠç¢ºèªäºé
ãããå Žåã«ã¯ Slack ã®æçš¿ã¹ã¬ããã§ç³è«è
ãšè³ªçå¿çã®ããåããã§ããæ¿èªã»å·®æ»ãã®å€æã«å¿
èŠãªã³ãã¥ãã±ãŒã·ã§ã³ãè¡ããŸãã åŸç¶ã®ã¢ã¯ã·ã§ã³ æ¿èªåŸã«ã¯ã ã»ç³è«è
ã«æ¿èª or å·®æ»ãçµæã Slack ã® DM(ãã€ã¬ã¯ãã¡ãã»ãŒãž)ã§éç¥ãã åŸç¶ã®æ
åœè
ãž Slack ã§éç¥ãã (æ³åæŒå°ãªã©ã®)æ¿èªåŸã¿ã¹ã¯ãäœæãæ
åœè
ã«éç¥ãã çãåŸç¶ã®ã¢ã¯ã·ã§ã³ãžã€ãªãã£ãŠããä»çµã¿ãçšæããŸããã ã·ã¹ãã ã®è£åŽ å
¥åã€ã³ã¿ãŒãã§ãŒã¹ å
¥åç»é¢ã¯ãTeamSpirit ã§æšæºæäŸãããŠãã çšè°ãªããžã§ã¯ã ãå©çšããŸãããå
¥åé
ç®ã¯æšæºã§çšæãããŠããã³ã³ããŒãã³ããå©çšããã¡ãã¬ãŒç¬èªã§å®çŸ©ããŠããŸããæ¿èªããã»ã¹ãå®çŸ©ããã°ãSlack ã䜿ããã« TeamSpirit ã®ã¿ã§ãéçšã¯å¯èœã§ãã Slack éç¥ Salesforce ã®æšæºæ©èœãš Apex ãçšãã Script åŠçã䜿ã£ãŠ Slack éç¥ãããŠããŸãã Apex ãšã¯ãSalesforce å
ã§å©çšããããžãã¹ããžãã¯çšã®ãªããžã§ã¯ãæåã®ããã°ã©ãã³ã°èšèª(ã»ãŒ Java)ã®ããšã§ãã Slack éç¥ãŸã§ã®å€§ããªæµãã¯ä»¥äžã§ãã çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ Slack API ãã³ãŒã«ããSlack ãžæçš¿ 1~4 ã®ããã»ã¹ã詳ããèŠãŠãããŸãã 1. çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒããã¿ã€ãã³ã°ã§æ¿èªããã»ã¹ãèµ°ãããŸãã ç³è«æã®ã¢ã¯ã·ã§ã³ãšããŠã ã¹ããŒã¿ã¹ãç³è«äžããšããŸããã¹ããŒã¿ã¹ãå€ããæ¯ã«åŠçãèµ°ãããŠããã®ã§ãã¹ããŒã¿ã¹å®çŸ©ã¯äžã€èã«ãªããŸãã 2. ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« ããã»ã¹ãã«ããŒãå©çšããããšã§ãçšè°ã¬ã³ãŒããäœæãŸãã¯ç·šéãããšããã«äœããã®åŠçã宿œããããšãå¯èœã§ããä»åã¯ãã¹ããŒã¿ã¹ããç³è«äžãã«ãªã£ãå Žåã« Apex ãã³ãŒã«ããããšããåŠçã«ããŠããŸãã 3. Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ éç¥ã«å¿
èŠãªæ
å ±ãæãããããApex ã®åŠçã§ã¯çšè°ãªããžã§ã¯ãã®ç³è«æ
å ±ãšåãããŠæ¬¡ã®æ¿èªè
æ
å ±ãååŸããŠããŸãã String ownerId = p . OwnerId ; //ç³è«è
ã®ãŠãŒã¶åãååŸ String applicant = [SELECT Username FROM User WHERE Id = : ownerId ]. Username ; //æ¿èªããã»ã¹ã®ã¬ã³ãŒãååŸ String processInstanceId = [SELECT Id FROM ProcessInstance WHERE TargetObjectId = : p . Id ORDER BY CreatedDate DESC limit 1 ]. Id ; //æ¿èªè
ã® ID ãååŸ String approveId = [SELECT OriginalActorId FROM ProcessInstanceWorkitem WHERE ProcessInstanceId = : processInstanceId ]. OriginalActorId ; 4. Slack API ãã³ãŒã«ããSlack ãžæçš¿ Apex ãååŸããæ
å ±ãããšã«ãSlack ã«æçš¿ããŸãã çšè°å
容ãèšèŒããç³è«è
ã»æ¿èªè
ã«å¯ŸããŠã¡ã³ã·ã§ã³ãããããã«ãŠãŒã¶åãèšèŒããŸãã ãŸããä»åã¯æ¿èªè
çšã«ã€ã³ã¿ã©ã¯ãã£ããã¿ã³ãé
眮ããå¿
èŠããã£ãã®ã§ã Block Kit ãå©çšãããã¿ã³ä»ãã¡ãã»ãŒãžãäœæããŸããã { "text" : "hoge" , "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "fuga" } }, ... { "type" : "actions" , "elements" : [ { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "æ¿èª" }, "value" : "Approve" , "style" : "primary" }, { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "å·®æ»ã" }, "value" : "Reject" , "style" : "danger" } ] } ] } TeamSpirit(Salesforce)âSlack ãžã®æçš¿ã¯éçºã«ãããŠèŠåŽãããã€ã³ãã®äžã€ã§ãã Slack ããã®ã¢ã¯ã·ã§ã³ Slack ã®æçš¿ã«åã蟌ãã§ãããã¿ã³ãã¯ãªãã¯ãããéã¯ãLambda ãçµç±ã㊠TeamSpirit(Salesforce)ã® RestAPI ãã³ãŒã«ããæ¿èªåŠçãå®è¡ããŠããŸãã ãŸãæ¿èªåŸã¯ããã¿ã³ããæ¿èªãã¹ã¿ã³ãã«çœ®ãæããŠããŸãã éçºãçµã㊠çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããã«ããããChatOps ã®æŠå¿µãåãå
¥ã Slack ã«é£æºããæ¥åã·ã¹ãã ãæ§ç¯ããŸããã æ¿èªè
ããã¯ãSlack ã§æ¿èªãã³ã¡ã³ããã§ãã瀟å€ããã§ãããã«å¯Ÿå¿ã§ããã®ã§äŸ¿å©ããSalesforce-Slack 飿ºã¯ä»ã«ã掻çšã§ããã®ã§æ¯éãã£ãŠãããããªã©ã®ã³ã¡ã³ããããã ããŸããããŸããæ¿èªåŸã«ãã¹ã¬ããã«ãŠããæ¯èŸŒãé¡ãããŸãããç©åå±ããŸãããçã®ãããšããè¡ã£ãŠãããæ
å ±ã Slack ã«éçŽãããŠããçãéãã®éçšã«ãªã£ãããšæã£ãŠããŸãã Chat ãµãŒãã¹ãå©çšããŠããäŒç€Ÿã§ã¯ãä»åã玹ä»ãã ChatOps ã¯æ¥åå¹çåããã«ããããæå¹ãªææ³ã«ãªãã®ã§ã¯ãªãã§ããããããã¡ããããã¹ãŠ Chat ã«é£æºããã°ãããšãããã®ã§ããªãããã£ããèšèšãéçšæ€èšãè¡ãå¿
èŠããããŸãã ä»åŸã¯ ChatOps ã«éããæ¥åå¹çåã«ã€ãªãããã®ã¯ã©ãã©ããã£ãŠãããããšèããŠããŸãã ãããã« ã¡ãã¬ãŒã®ã³ãŒãã¬ãŒãéšéã§ã¯ã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠãæ¥åå¹çæ¹åã®ããã®éçºãæšé²ããŠããŸããé¢çœããïŒãšæããæ¹ãã¡ãã¬ãŒã§ã©ãã©ãæ¹åããŠã¿ããïŒãšæã£ãŠããã ããæ¹ã¯ããã²åŒç€Ÿæ¡çšããŒãžãããå¿åãé¡ãããŸãïŒ åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp æåŸãŸã§èªãã§ããã ãããããšãããããŸããã
ã¯ããã« ããã«ã¡ã¯ãã³ãŒãã¬ãŒããšã³ãžãã¢ã®æºå£ã§ãã ã¡ãã¬ãŒã§ã¯ãä»å¹Ž 7 æã«çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããŸããã 詳现ã¯ãã·ã¹ãã æŠèŠãã®ç« ã§ã玹ä»ããŸãããã·ã¹ãã ã®å
šäœåãšããŠã¯ä»¥äžã®ããã«ãªã£ãŠãããŸãã ã¯ãŒã¯ãããŒã·ã¹ãã ãšèãããããã©ããªã·ã¹ãã ãæãæµ®ãã¹ãŸããïŒ ç³è«è
ãã·ã¹ãã ã§ç³è«ãããšãäºãå®ããããæ¿èªè
ãžæ¿èªäŸé Œãã¡ãŒã«ã§éç¥ãããç³è«å
容ã®ç¢ºèªåã³æ¿èªã®ããã«ã·ã¹ãã ãžãã°ã€ã³ããããšããæµããããããã¯ãŒã¯ãããŒã·ã¹ãã ã§ã¯ãªãããªãšæããŸãã æã
ã¯ã³ãŒãã¬ãŒãéšéãšããŠã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠããŸããæ
ã«ãã¡ãã¬ãŒã®çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã«ãããŠã äŸ¿å© ã§ åçç ãªã·ã¹ãã ãç®æããŠéçºãè¡ããŸãããä»å ChatOps ã®æŠå¿µãåãå
¥ããããšã§ãäžè¬çãªã¯ãŒã¯ãããŒã·ã¹ãã ãããæŽç·Žãããã·ã¹ãã ãæ§ç¯ã§ããããªãšæããŸãã æ¬çš¿ã§ã¯ã·ã¹ãã æŠèŠåã³ãè£åŽã®ä»çµã¿ãã玹ä»ããŠãããŸãã æåŸãŸã§ãä»ãåãããã ããã°å¹žãã§ãã ChatOps ãšã¯ ChatOps ãšã¯ããã£ãããµãŒãã¹ïŒChatïŒãããŒã¹ãšããŠãã·ã¹ãã éçšïŒOpsïŒãè¡ãããšããæå³ã§ãããã£ããæžããšãã·ã¹ãã ãã Chat ãžã¡ãã»ãŒãžãé£ã°ããæ¬¡ã®ã¢ã¯ã·ã§ã³ãåã Chat ç»é¢ã§éå§ã§ããããšãããã®ãšãªããŸãã(äžèšãããŒã¯ãããŸã§äžäŸã§ã) ChatOps ã«ã¯ä»¥äžã®ã¡ãªããããããšèããŠããŸãã åžžã«ç«ã¡äžããŠããããŒã«ãšããå
±éã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ã€ã³ã¿ã©ã¯ãã£ããªã³ãã¥ãã±ãŒã·ã§ã³ã«ã€ãªãããã¹ããŒãã£ã§ãã å
±æãããããèšé²ã«æ®ãããã æ¬çš¿ã§ã¯ã詳ãã説æã¯ããŸããããèå³ãããæ¹ã¯äºäŸçã解説ããŠãããµã€ããããã®ã§ãæ¯éæ¢ããŠã¿ãŠãã ããã ãªã ChatOps ãªã®ã çšè°ç³è«ã«ãããŠã¯ æ¿èªè
ãããå€åŒãããŠããã£ãŠ Ãà åã«ãªã£ãã¯ãã ãã©ãéé¡ééã£ãŠãªãïŒã ç³è«è
ããããŸããã倿Žãå¿ããŸãããå·®æ»ããé¡ãããŸãã ãªã©ã®ã³ãã¥ãã±ãŒã·ã§ã³ã床ã
çºçããŸãã éåžžã®ã·ã¹ãã ã§ããã°ã確èªäºé
ãããéã¯ã·ã¹ãã å
ã®ã³ãã¥ãã±ãŒã·ã§ã³æ©èœã䜿ãããããã¯ãChat ã« URL ãçšè°çªå·ã転èšããŠç¢ºèªã®ããã®ã³ãã¥ãã±ãŒã·ã§ã³ãåãããšãæ³å®ãããŸãã ã¡ãã¬ãŒå
ã®æ¥åã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack äžã§æ®ã©å®çµããŠããŸãã Slack ã§ã¯ãªãä»ã®å Žæã§äŒè©±ãçºçãããšæ
å ±ã忣ããŸãããSlack ã« URL ã転èšãããšãã£ãè¡çºããå¥ã·ã¹ãã ãžã®ãã°ã€ã³ãªã©ãéå¹çã§ãã ããã§ã å
±éã€ã³ã¿ãŒãã§ãŒã¹ã® Chat ãäžå¿ã«ã·ã¹ãã æ§ç¯ããïŒ ChatOps ãæ¡çšããçšè°ã¯ãŒã¯ãããŒãæ§ç¯ããŠã¿ãããšèããŸãããçµæãçšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã®æ
å ±ã Slack ãžé£æºããçšè°ã«ãããã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack ã«éçŽãæ¿èªè¡çºã Slack äžã§å¯èœããšããã·ã¹ãã ãæ§ç¯ããããšãã§ããŸããã ã·ã¹ãã æŠèŠ ç³è« ç³è«è
㯠TeamSpirit äžã§çšè°å
容ãèšå
¥ããçšè°ç³è«ãè¡ããŸãã TeamSpirit ãšã¯ã倿 管çãå·¥æ°ç®¡çãçµè²»ç²Ÿç®ãªã©ã管çã§ããã¯ã©ãŠããµãŒãã¹ã§ããSalesforce ããã©ãããã©ãŒã ãšããŠæ¡çšããŠãããã¢ã€ãã¢æ¬¡ç¬¬ã§ãããããªã«ã¹ã¿ãã€ãºãå¯èœã§ãã Slack ããç³è«ã§ããããã«ããã®ã ChatOps ã®ããã¹ãå§¿ãããããŸããããéå»ã®ç³è«ããã³ããŒããããç³è«çš®å¥ããšã«å
¥åããé
ç®ãç°ãªãçã®èŠä»¶ãèæ
®ããTeamSpirit ããç³è«ããããã«èšèšããŸãããç³è«ã®å°ç·ã«ã€ããŠã¯ãä»åŸãããããä»çµã¿ã«ç£šãäžããŠãããããšèããŠããŸãã æ¿èª ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒäžãããšãSlack ã®çšè°ãã£ã³ãã«ã«ç³è«å
容åã³æ·»ä»ãã¡ã€ã«ãèªåæçš¿ãããŸãã æ¿èªè
ã¯ç³è«å
容ã«åé¡ããªããã°ãæçš¿ã«é
眮ãããŠãããã¿ã³ãå©çšããŠæ¿èªã»å·®æ»ããè¡ããŸãã æ¿èªè
ã¯çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãžã¢ã¯ã»ã¹ããããšãªããSlack ã§æ¿èªè¡çºãå®çµã§ããŸããçšè°å
容ã«ãããŠç¢ºèªäºé
ãããå Žåã«ã¯ Slack ã®æçš¿ã¹ã¬ããã§ç³è«è
ãšè³ªçå¿çã®ããåããã§ããæ¿èªã»å·®æ»ãã®å€æã«å¿
èŠãªã³ãã¥ãã±ãŒã·ã§ã³ãè¡ããŸãã åŸç¶ã®ã¢ã¯ã·ã§ã³ æ¿èªåŸã«ã¯ã ã»ç³è«è
ã«æ¿èª or å·®æ»ãçµæã Slack ã® DM(ãã€ã¬ã¯ãã¡ãã»ãŒãž)ã§éç¥ãã åŸç¶ã®æ
åœè
ãž Slack ã§éç¥ãã (æ³åæŒå°ãªã©ã®)æ¿èªåŸã¿ã¹ã¯ãäœæãæ
åœè
ã«éç¥ãã çãåŸç¶ã®ã¢ã¯ã·ã§ã³ãžã€ãªãã£ãŠããä»çµã¿ãçšæããŸããã ã·ã¹ãã ã®è£åŽ å
¥åã€ã³ã¿ãŒãã§ãŒã¹ å
¥åç»é¢ã¯ãTeamSpirit ã§æšæºæäŸãããŠãã çšè°ãªããžã§ã¯ã ãå©çšããŸãããå
¥åé
ç®ã¯æšæºã§çšæãããŠããã³ã³ããŒãã³ããå©çšããã¡ãã¬ãŒç¬èªã§å®çŸ©ããŠããŸããæ¿èªããã»ã¹ãå®çŸ©ããã°ãSlack ã䜿ããã« TeamSpirit ã®ã¿ã§ãéçšã¯å¯èœã§ãã Slack éç¥ Salesforce ã®æšæºæ©èœãš Apex ãçšãã Script åŠçã䜿ã£ãŠ Slack éç¥ãããŠããŸãã Apex ãšã¯ãSalesforce å
ã§å©çšããããžãã¹ããžãã¯çšã®ãªããžã§ã¯ãæåã®ããã°ã©ãã³ã°èšèª(ã»ãŒ Java)ã®ããšã§ãã Slack éç¥ãŸã§ã®å€§ããªæµãã¯ä»¥äžã§ãã çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ Slack API ãã³ãŒã«ããSlack ãžæçš¿ 1~4 ã®ããã»ã¹ã詳ããèŠãŠãããŸãã 1. çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒããã¿ã€ãã³ã°ã§æ¿èªããã»ã¹ãèµ°ãããŸãã ç³è«æã®ã¢ã¯ã·ã§ã³ãšããŠã ã¹ããŒã¿ã¹ãç³è«äžããšããŸããã¹ããŒã¿ã¹ãå€ããæ¯ã«åŠçãèµ°ãããŠããã®ã§ãã¹ããŒã¿ã¹å®çŸ©ã¯äžã€èã«ãªããŸãã 2. ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« ããã»ã¹ãã«ããŒãå©çšããããšã§ãçšè°ã¬ã³ãŒããäœæãŸãã¯ç·šéãããšããã«äœããã®åŠçã宿œããããšãå¯èœã§ããä»åã¯ãã¹ããŒã¿ã¹ããç³è«äžãã«ãªã£ãå Žåã« Apex ãã³ãŒã«ããããšããåŠçã«ããŠããŸãã 3. Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ éç¥ã«å¿
èŠãªæ
å ±ãæãããããApex ã®åŠçã§ã¯çšè°ãªããžã§ã¯ãã®ç³è«æ
å ±ãšåãããŠæ¬¡ã®æ¿èªè
æ
å ±ãååŸããŠããŸãã String ownerId = p . OwnerId ; //ç³è«è
ã®ãŠãŒã¶åãååŸ String applicant = [SELECT Username FROM User WHERE Id = : ownerId ]. Username ; //æ¿èªããã»ã¹ã®ã¬ã³ãŒãååŸ String processInstanceId = [SELECT Id FROM ProcessInstance WHERE TargetObjectId = : p . Id ORDER BY CreatedDate DESC limit 1 ]. Id ; //æ¿èªè
ã® ID ãååŸ String approveId = [SELECT OriginalActorId FROM ProcessInstanceWorkitem WHERE ProcessInstanceId = : processInstanceId ]. OriginalActorId ; 4. Slack API ãã³ãŒã«ããSlack ãžæçš¿ Apex ãååŸããæ
å ±ãããšã«ãSlack ã«æçš¿ããŸãã çšè°å
容ãèšèŒããç³è«è
ã»æ¿èªè
ã«å¯ŸããŠã¡ã³ã·ã§ã³ãããããã«ãŠãŒã¶åãèšèŒããŸãã ãŸããä»åã¯æ¿èªè
çšã«ã€ã³ã¿ã©ã¯ãã£ããã¿ã³ãé
眮ããå¿
èŠããã£ãã®ã§ã Block Kit ãå©çšãããã¿ã³ä»ãã¡ãã»ãŒãžãäœæããŸããã { "text" : "hoge" , "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "fuga" } }, ... { "type" : "actions" , "elements" : [ { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "æ¿èª" }, "value" : "Approve" , "style" : "primary" }, { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "å·®æ»ã" }, "value" : "Reject" , "style" : "danger" } ] } ] } TeamSpirit(Salesforce)âSlack ãžã®æçš¿ã¯éçºã«ãããŠèŠåŽãããã€ã³ãã®äžã€ã§ãã Slack ããã®ã¢ã¯ã·ã§ã³ Slack ã®æçš¿ã«åã蟌ãã§ãããã¿ã³ãã¯ãªãã¯ãããéã¯ãLambda ãçµç±ã㊠TeamSpirit(Salesforce)ã® RestAPI ãã³ãŒã«ããæ¿èªåŠçãå®è¡ããŠããŸãã ãŸãæ¿èªåŸã¯ããã¿ã³ããæ¿èªãã¹ã¿ã³ãã«çœ®ãæããŠããŸãã éçºãçµã㊠çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããã«ããããChatOps ã®æŠå¿µãåãå
¥ã Slack ã«é£æºããæ¥åã·ã¹ãã ãæ§ç¯ããŸããã æ¿èªè
ããã¯ãSlack ã§æ¿èªãã³ã¡ã³ããã§ãã瀟å€ããã§ãããã«å¯Ÿå¿ã§ããã®ã§äŸ¿å©ããSalesforce-Slack 飿ºã¯ä»ã«ã掻çšã§ããã®ã§æ¯éãã£ãŠãããããªã©ã®ã³ã¡ã³ããããã ããŸããããŸããæ¿èªåŸã«ãã¹ã¬ããã«ãŠããæ¯èŸŒãé¡ãããŸãããç©åå±ããŸãããçã®ãããšããè¡ã£ãŠãããæ
å ±ã Slack ã«éçŽãããŠããçãéãã®éçšã«ãªã£ãããšæã£ãŠããŸãã Chat ãµãŒãã¹ãå©çšããŠããäŒç€Ÿã§ã¯ãä»åã玹ä»ãã ChatOps ã¯æ¥åå¹çåããã«ããããæå¹ãªææ³ã«ãªãã®ã§ã¯ãªãã§ããããããã¡ããããã¹ãŠ Chat ã«é£æºããã°ãããšãããã®ã§ããªãããã£ããèšèšãéçšæ€èšãè¡ãå¿
èŠããããŸãã ä»åŸã¯ ChatOps ã«éããæ¥åå¹çåã«ã€ãªãããã®ã¯ã©ãã©ããã£ãŠãããããšèããŠããŸãã ãããã« ã¡ãã¬ãŒã®ã³ãŒãã¬ãŒãéšéã§ã¯ã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠãæ¥åå¹çæ¹åã®ããã®éçºãæšé²ããŠããŸããé¢çœããïŒãšæããæ¹ãã¡ãã¬ãŒã§ã©ãã©ãæ¹åããŠã¿ããïŒãšæã£ãŠããã ããæ¹ã¯ããã²åŒç€Ÿæ¡çšããŒãžãããå¿åãé¡ãããŸãïŒ åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp æåŸãŸã§èªãã§ããã ãããããšãããããŸããã
ã¯ããã« ããã«ã¡ã¯ãã³ãŒãã¬ãŒããšã³ãžãã¢ã®æºå£ã§ãã ã¡ãã¬ãŒã§ã¯ãä»å¹Ž 7 æã«çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããŸããã 詳现ã¯ãã·ã¹ãã æŠèŠãã®ç« ã§ã玹ä»ããŸãããã·ã¹ãã ã®å
šäœåãšããŠã¯ä»¥äžã®ããã«ãªã£ãŠãããŸãã ã¯ãŒã¯ãããŒã·ã¹ãã ãšèãããããã©ããªã·ã¹ãã ãæãæµ®ãã¹ãŸããïŒ ç³è«è
ãã·ã¹ãã ã§ç³è«ãããšãäºãå®ããããæ¿èªè
ãžæ¿èªäŸé Œãã¡ãŒã«ã§éç¥ãããç³è«å
容ã®ç¢ºèªåã³æ¿èªã®ããã«ã·ã¹ãã ãžãã°ã€ã³ããããšããæµããããããã¯ãŒã¯ãããŒã·ã¹ãã ã§ã¯ãªãããªãšæããŸãã æã
ã¯ã³ãŒãã¬ãŒãéšéãšããŠã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠããŸããæ
ã«ãã¡ãã¬ãŒã®çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã«ãããŠã äŸ¿å© ã§ åçç ãªã·ã¹ãã ãç®æããŠéçºãè¡ããŸãããä»å ChatOps ã®æŠå¿µãåãå
¥ããããšã§ãäžè¬çãªã¯ãŒã¯ãããŒã·ã¹ãã ãããæŽç·Žãããã·ã¹ãã ãæ§ç¯ã§ããããªãšæããŸãã æ¬çš¿ã§ã¯ã·ã¹ãã æŠèŠåã³ãè£åŽã®ä»çµã¿ãã玹ä»ããŠãããŸãã æåŸãŸã§ãä»ãåãããã ããã°å¹žãã§ãã ChatOps ãšã¯ ChatOps ãšã¯ããã£ãããµãŒãã¹ïŒChatïŒãããŒã¹ãšããŠãã·ã¹ãã éçšïŒOpsïŒãè¡ãããšããæå³ã§ãããã£ããæžããšãã·ã¹ãã ãã Chat ãžã¡ãã»ãŒãžãé£ã°ããæ¬¡ã®ã¢ã¯ã·ã§ã³ãåã Chat ç»é¢ã§éå§ã§ããããšãããã®ãšãªããŸãã(äžèšãããŒã¯ãããŸã§äžäŸã§ã) ChatOps ã«ã¯ä»¥äžã®ã¡ãªããããããšèããŠããŸãã åžžã«ç«ã¡äžããŠããããŒã«ãšããå
±éã€ã³ã¿ãŒãã§ãŒã¹ã§ãã ã€ã³ã¿ã©ã¯ãã£ããªã³ãã¥ãã±ãŒã·ã§ã³ã«ã€ãªãããã¹ããŒãã£ã§ãã å
±æãããããèšé²ã«æ®ãããã æ¬çš¿ã§ã¯ã詳ãã説æã¯ããŸããããèå³ãããæ¹ã¯äºäŸçã解説ããŠãããµã€ããããã®ã§ãæ¯éæ¢ããŠã¿ãŠãã ããã ãªã ChatOps ãªã®ã çšè°ç³è«ã«ãããŠã¯ æ¿èªè
ãããå€åŒãããŠããã£ãŠ Ãà åã«ãªã£ãã¯ãã ãã©ãéé¡ééã£ãŠãªãïŒã ç³è«è
ããããŸããã倿Žãå¿ããŸãããå·®æ»ããé¡ãããŸãã ãªã©ã®ã³ãã¥ãã±ãŒã·ã§ã³ã床ã
çºçããŸãã éåžžã®ã·ã¹ãã ã§ããã°ã確èªäºé
ãããéã¯ã·ã¹ãã å
ã®ã³ãã¥ãã±ãŒã·ã§ã³æ©èœã䜿ãããããã¯ãChat ã« URL ãçšè°çªå·ã転èšããŠç¢ºèªã®ããã®ã³ãã¥ãã±ãŒã·ã§ã³ãåãããšãæ³å®ãããŸãã ã¡ãã¬ãŒå
ã®æ¥åã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack äžã§æ®ã©å®çµããŠããŸãã Slack ã§ã¯ãªãä»ã®å Žæã§äŒè©±ãçºçãããšæ
å ±ã忣ããŸãããSlack ã« URL ã転èšãããšãã£ãè¡çºããå¥ã·ã¹ãã ãžã®ãã°ã€ã³ãªã©ãéå¹çã§ãã ããã§ã å
±éã€ã³ã¿ãŒãã§ãŒã¹ã® Chat ãäžå¿ã«ã·ã¹ãã æ§ç¯ããïŒ ChatOps ãæ¡çšããçšè°ã¯ãŒã¯ãããŒãæ§ç¯ããŠã¿ãããšèããŸãããçµæãçšè°ã¯ãŒã¯ãããŒã·ã¹ãã ã®æ
å ±ã Slack ãžé£æºããçšè°ã«ãããã³ãã¥ãã±ãŒã·ã§ã³ã¯ Slack ã«éçŽãæ¿èªè¡çºã Slack äžã§å¯èœããšããã·ã¹ãã ãæ§ç¯ããããšãã§ããŸããã ã·ã¹ãã æŠèŠ ç³è« ç³è«è
㯠TeamSpirit äžã§çšè°å
容ãèšå
¥ããçšè°ç³è«ãè¡ããŸãã TeamSpirit ãšã¯ã倿 管çãå·¥æ°ç®¡çãçµè²»ç²Ÿç®ãªã©ã管çã§ããã¯ã©ãŠããµãŒãã¹ã§ããSalesforce ããã©ãããã©ãŒã ãšããŠæ¡çšããŠãããã¢ã€ãã¢æ¬¡ç¬¬ã§ãããããªã«ã¹ã¿ãã€ãºãå¯èœã§ãã Slack ããç³è«ã§ããããã«ããã®ã ChatOps ã®ããã¹ãå§¿ãããããŸããããéå»ã®ç³è«ããã³ããŒããããç³è«çš®å¥ããšã«å
¥åããé
ç®ãç°ãªãçã®èŠä»¶ãèæ
®ããTeamSpirit ããç³è«ããããã«èšèšããŸãããç³è«ã®å°ç·ã«ã€ããŠã¯ãä»åŸãããããä»çµã¿ã«ç£šãäžããŠãããããšèããŠããŸãã æ¿èª ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒäžãããšãSlack ã®çšè°ãã£ã³ãã«ã«ç³è«å
容åã³æ·»ä»ãã¡ã€ã«ãèªåæçš¿ãããŸãã æ¿èªè
ã¯ç³è«å
容ã«åé¡ããªããã°ãæçš¿ã«é
眮ãããŠãããã¿ã³ãå©çšããŠæ¿èªã»å·®æ»ããè¡ããŸãã æ¿èªè
ã¯çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãžã¢ã¯ã»ã¹ããããšãªããSlack ã§æ¿èªè¡çºãå®çµã§ããŸããçšè°å
容ã«ãããŠç¢ºèªäºé
ãããå Žåã«ã¯ Slack ã®æçš¿ã¹ã¬ããã§ç³è«è
ãšè³ªçå¿çã®ããåããã§ããæ¿èªã»å·®æ»ãã®å€æã«å¿
èŠãªã³ãã¥ãã±ãŒã·ã§ã³ãè¡ããŸãã åŸç¶ã®ã¢ã¯ã·ã§ã³ æ¿èªåŸã«ã¯ã ã»ç³è«è
ã«æ¿èª or å·®æ»ãçµæã Slack ã® DM(ãã€ã¬ã¯ãã¡ãã»ãŒãž)ã§éç¥ãã åŸç¶ã®æ
åœè
ãž Slack ã§éç¥ãã (æ³åæŒå°ãªã©ã®)æ¿èªåŸã¿ã¹ã¯ãäœæãæ
åœè
ã«éç¥ãã çãåŸç¶ã®ã¢ã¯ã·ã§ã³ãžã€ãªãã£ãŠããä»çµã¿ãçšæããŸããã ã·ã¹ãã ã®è£åŽ å
¥åã€ã³ã¿ãŒãã§ãŒã¹ å
¥åç»é¢ã¯ãTeamSpirit ã§æšæºæäŸãããŠãã çšè°ãªããžã§ã¯ã ãå©çšããŸãããå
¥åé
ç®ã¯æšæºã§çšæãããŠããã³ã³ããŒãã³ããå©çšããã¡ãã¬ãŒç¬èªã§å®çŸ©ããŠããŸããæ¿èªããã»ã¹ãå®çŸ©ããã°ãSlack ã䜿ããã« TeamSpirit ã®ã¿ã§ãéçšã¯å¯èœã§ãã Slack éç¥ Salesforce ã®æšæºæ©èœãš Apex ãçšãã Script åŠçã䜿ã£ãŠ Slack éç¥ãããŠããŸãã Apex ãšã¯ãSalesforce å
ã§å©çšããããžãã¹ããžãã¯çšã®ãªããžã§ã¯ãæåã®ããã°ã©ãã³ã°èšèª(ã»ãŒ Java)ã®ããšã§ãã Slack éç¥ãŸã§ã®å€§ããªæµãã¯ä»¥äžã§ãã çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ Slack API ãã³ãŒã«ããSlack ãžæçš¿ 1~4 ã®ããã»ã¹ã詳ããèŠãŠãããŸãã 1. çšè°ç³è«ãã¿ã³ãæŒããã¿ã€ãã³ã°ã§ã¹ããŒã¿ã¹é
ç®ããæªç³è«ããããç³è«äžããžå€æŽ ç³è«è
ããçšè°ç³è«ããã¿ã³ãæŒããã¿ã€ãã³ã°ã§æ¿èªããã»ã¹ãèµ°ãããŸãã ç³è«æã®ã¢ã¯ã·ã§ã³ãšããŠã ã¹ããŒã¿ã¹ãç³è«äžããšããŸããã¹ããŒã¿ã¹ãå€ããæ¯ã«åŠçãèµ°ãããŠããã®ã§ãã¹ããŒã¿ã¹å®çŸ©ã¯äžã€èã«ãªããŸãã 2. ããã»ã¹ãã«ããŒã«ãŠã¹ããŒã¿ã¹é
ç®ããç³è«äžãã«ãªã£ãããšãæ€ç¥ã㊠Apex ãã³ãŒã« ããã»ã¹ãã«ããŒãå©çšããããšã§ãçšè°ã¬ã³ãŒããäœæãŸãã¯ç·šéãããšããã«äœããã®åŠçã宿œããããšãå¯èœã§ããä»åã¯ãã¹ããŒã¿ã¹ããç³è«äžãã«ãªã£ãå Žåã« Apex ãã³ãŒã«ããããšããåŠçã«ããŠããŸãã 3. Apex å
ã§ç³è«æ
å ±ãæ¿èªè
æ
å ±ã®ååŸ éç¥ã«å¿
èŠãªæ
å ±ãæãããããApex ã®åŠçã§ã¯çšè°ãªããžã§ã¯ãã®ç³è«æ
å ±ãšåãããŠæ¬¡ã®æ¿èªè
æ
å ±ãååŸããŠããŸãã String ownerId = p . OwnerId ; //ç³è«è
ã®ãŠãŒã¶åãååŸ String applicant = [SELECT Username FROM User WHERE Id = : ownerId ]. Username ; //æ¿èªããã»ã¹ã®ã¬ã³ãŒãååŸ String processInstanceId = [SELECT Id FROM ProcessInstance WHERE TargetObjectId = : p . Id ORDER BY CreatedDate DESC limit 1 ]. Id ; //æ¿èªè
ã® ID ãååŸ String approveId = [SELECT OriginalActorId FROM ProcessInstanceWorkitem WHERE ProcessInstanceId = : processInstanceId ]. OriginalActorId ; 4. Slack API ãã³ãŒã«ããSlack ãžæçš¿ Apex ãååŸããæ
å ±ãããšã«ãSlack ã«æçš¿ããŸãã çšè°å
容ãèšèŒããç³è«è
ã»æ¿èªè
ã«å¯ŸããŠã¡ã³ã·ã§ã³ãããããã«ãŠãŒã¶åãèšèŒããŸãã ãŸããä»åã¯æ¿èªè
çšã«ã€ã³ã¿ã©ã¯ãã£ããã¿ã³ãé
眮ããå¿
èŠããã£ãã®ã§ã Block Kit ãå©çšãããã¿ã³ä»ãã¡ãã»ãŒãžãäœæããŸããã { "text" : "hoge" , "blocks" : [ { "type" : "section" , "text" : { "type" : "mrkdwn" , "text" : "fuga" } }, ... { "type" : "actions" , "elements" : [ { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "æ¿èª" }, "value" : "Approve" , "style" : "primary" }, { "type" : "button" , "text" : { "type" : "plain_text" , "text" : "å·®æ»ã" }, "value" : "Reject" , "style" : "danger" } ] } ] } TeamSpirit(Salesforce)âSlack ãžã®æçš¿ã¯éçºã«ãããŠèŠåŽãããã€ã³ãã®äžã€ã§ãã Slack ããã®ã¢ã¯ã·ã§ã³ Slack ã®æçš¿ã«åã蟌ãã§ãããã¿ã³ãã¯ãªãã¯ãããéã¯ãLambda ãçµç±ã㊠TeamSpirit(Salesforce)ã® RestAPI ãã³ãŒã«ããæ¿èªåŠçãå®è¡ããŠããŸãã ãŸãæ¿èªåŸã¯ããã¿ã³ããæ¿èªãã¹ã¿ã³ãã«çœ®ãæããŠããŸãã éçºãçµã㊠çšè°ã¯ãŒã¯ãããŒã·ã¹ãã ãå°å
¥ããã«ããããChatOps ã®æŠå¿µãåãå
¥ã Slack ã«é£æºããæ¥åã·ã¹ãã ãæ§ç¯ããŸããã æ¿èªè
ããã¯ãSlack ã§æ¿èªãã³ã¡ã³ããã§ãã瀟å€ããã§ãããã«å¯Ÿå¿ã§ããã®ã§äŸ¿å©ããSalesforce-Slack 飿ºã¯ä»ã«ã掻çšã§ããã®ã§æ¯éãã£ãŠãããããªã©ã®ã³ã¡ã³ããããã ããŸããããŸããæ¿èªåŸã«ãã¹ã¬ããã«ãŠããæ¯èŸŒãé¡ãããŸãããç©åå±ããŸãããçã®ãããšããè¡ã£ãŠãããæ
å ±ã Slack ã«éçŽãããŠããçãéãã®éçšã«ãªã£ãããšæã£ãŠããŸãã Chat ãµãŒãã¹ãå©çšããŠããäŒç€Ÿã§ã¯ãä»åã玹ä»ãã ChatOps ã¯æ¥åå¹çåããã«ããããæå¹ãªææ³ã«ãªãã®ã§ã¯ãªãã§ããããããã¡ããããã¹ãŠ Chat ã«é£æºããã°ãããšãããã®ã§ããªãããã£ããèšèšãéçšæ€èšãè¡ãå¿
èŠããããŸãã ä»åŸã¯ ChatOps ã«éããæ¥åå¹çåã«ã€ãªãããã®ã¯ã©ãã©ããã£ãŠãããããšèããŠããŸãã ãããã« ã¡ãã¬ãŒã®ã³ãŒãã¬ãŒãéšéã§ã¯ã培åºçã«åçæ§ã远æ±ããçµç¹åºç€ãã仿ãã¥ãããè¡ã£ãŠãããããšãç®æããŠãæ¥åå¹çæ¹åã®ããã®éçºãæšé²ããŠããŸããé¢çœããïŒãšæããæ¹ãã¡ãã¬ãŒã§ã©ãã©ãæ¹åããŠã¿ããïŒãšæã£ãŠããã ããæ¹ã¯ããã²åŒç€Ÿæ¡çšããŒãžãããå¿åãé¡ãããŸãïŒ åéã®äžèЧ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ãã¬ãŒã®æ¡çšæ
å ±ã¯ãã¡ãããã確èªãã ããã www.medley.jp æåŸãŸã§èªãã§ããã ãããããšãããããŸããã