ããã«ã¡ã¯ãåµé éçºéš å
Œ ãã®ã¥ããæšé²éšã®æ£®ç«¹ã§ãã ããã¯ãšã³ãéçºãæ
åœããŠããŸãããã®ä»ã«ãã¢ãžã£ã€ã«ã®æšé²ã BIT VALLEY -INSIDE- ã®ã³ãã¥ããã£éå¶ã«åç»ããŠããŸãã ä»åã¯æ¯é±éå¬ããŠããèªæžäŒã«ã€ããŠãèšäºã«ãããŠé ããŸããã åºå
žïŒã«ã€ãŒã³ã»ãžã£ãŒã㌠ãã£ã1人ããã¯ãããŠããè¶å¢ãããããŒã ãã€ãããŸã§ ãªãèªæžäŒãéå¬ããã®ã ä»åã¯èªæžäŒã®é¡æãšããŠãã ã«ã€ãŒã³ã»ãžã£ãŒã㌠ãã£ã1人ããã¯ãããŠããè¶å¢ãããããŒã ãã€ãããŸã§ ããéžã³ãŸããã ãã®æžç±ãããç®çã®ããã«èªåããè¡åããŠè¡ãããšãæ¹ããŠåŠã³ãŸããããŸãã¢ãžã£ã€ã«ãæšé²ããããèªåãæ¥œãããšæããããšãå
±æããŠäŒããããšãæããŸãããèªæžäŒãéããŠããèªåãšåãããã«æããŠæ¬²ãããããã¢ãžã£ã€ã«ãæšé²ããã®ã«æé©ãªæžç±ã ããšèããããã§ãã èªæžäŒã®å
容 èªæžäŒã®ããæ¹ã§ããã â»æšå°å¹žãã¡ã·ãªããŒã¿ãŒäºåæ ã ã8åèªæžäŒãã®é²ãæ¹ ã ãåèã«ãããŠé ããŸããã ãã¡ãã®ããæ¹ã§ããã2018-10-31(æ°Ž)ã«ãŽã¡ã«ç ç©¶æã«ãŠéå¬ãããã DevLOVE äž»å¬ã®ã€ãã³ããã çµç¹ã§ã®èªæžäŒã®éãæ¹ ãã«åå ããç¥èŠãåŸãããšãåºæ¥ãŸããã 8åèªæžäŒã®ç¹åŸŽã¯äžèšãšãªããŸãã äºåã«èªãã§ããªããŠããã®ã§æ¥œïŒ åœæ¥ïŒåã ãããã§ãçãšæèŠäº€æã§ããã®ã§ãæè»œ ä»ã®äººã®èŠç¹ãããããã®ã§ãè€åçã«ãã®æ¬ã楜ããããæ¬ãèªã¿é²ããæ¥œãã¿ãå¢ã èªæžäŒåå è
ã§ãããä»åã¯æ§ã
ãªè·çš®ã§ãšã³ãžãã¢ããã¶ã€ããŒããããã¯ããªãŒããŒããã£ã¬ã¯ã¿ãŒãªã©ã§ãã èªæžäŒã®æé èªã8å æžç±ã1話ãã€èªãã§ãããŸãã1話æ¯ã«ããŒãžæ°ã¯ç°ãªããŸãããèªãæéã¯å€æŽããŸãããèªã¿æ¹ã1話å
ã§ããã°ã©ãããã§ãæ§ããŸããã æžã5å ä»ç®ãšãã³ãçšæããæã£ãããšãæããããšãæ°ã«ãªã£ãããšãçåç¹ãªã©ããªãã§ãä»ç®ã«æžããŸãã èªã8å ä»ç®ããã¯ã€ãããŒãã«è²Œããªãããä»ç®ã«æžããå
容ãèªåã®èšèã§èªããŸãã å
šäœèšè° ä»ç®ã貌ããããã¯ã€ãããŒããçºããªãããåå è
å士ã§è©±ããŸãã èªæžäŒãéå¬ããææ³ 8åééå®ã§èªæžããããšã倧äºã ãšæããŸãããèªãã çŽåŸã«ã¢ãŠãããããããã¢ãŠãããããããã®ãèªåã®èšèã§èªãã®ãéèŠã ãšæããŸããã ã¢ãŠãããããèªãããšã§çè§£ãæ·±ãŸã£ãããæ°ããªæ°ä»ãããã£ããããŸããäžåºŠèªãã æžç±ã§ãèªåã®èŠç¹ãèŠçŽããããä»ã®æ¹ã®æ§ã
ãªèŠç¹ã«æ°ä»ãããããŸããããŸããäºãã®äŸ¡å€èгãç¥ãããšã§ãããŒã ãã«ãã£ã³ã°ã«ã圹ç«ã¡ããã«æããŸãããå®éã®ã¹ã¯ã©ã ããŒã ãªã©ã§èªæžäŒãéå¬ããã®ãè¯ãããã§ãã å
šäœèšè°ã§ã¯ãå®éã®ãããžã§ã¯ãã®è©±ãŸã§èžã¿èŸŒãããšããããè¯ãã«ã€ãŒã³ã®å Žã«ãªãã°ãšæããŸããããã®ãããªæã¯ãèªåãªãã®ã¢ãžã£ã€ã«ãªãšãã»ã³ã¹ãå ããŠã話ãããããã«å¿æããŠããŸãã èªæžäŒã®ã«ã€ãŒã³ æåã®ãã¡ã¯åºå®ã¡ã³ããŒã§éå¬ããŠããŸããããéäžããã²ã¹ãã®æ¹ããæãããŠèªæžäŒãäœéšããŠãããåãçµã¿ãå§ããã æ¢åã¡ã³ããŒã«ãšã£ãŠãæŽã«ç°ãªãèŠç¹ã«æ°ä»ãããã£ãããã²ã¹ãã®æ¹æ¬äººã«ã广ãããããã«æããŠããŸãã æåŸã« èªæžäŒã®ããæ¹ãæé ãææ³ãã«ã€ãŒã³ã«ã€ããŠç޹ä»ãããŠé ããŸããã 顿ã§ãããã«ã€ãŒã³ã»ãžã£ãŒããŒãã§ããããŸã èªã¿çµããŠãããåŒãç¶ãèªæžäŒãéå¬ããŠè¡ããŸãã ä»åŸã¯ãã£ãšèªæžäŒã®é
åãäŒããããããå€ãã®æ¹ã«åå ããŠé ããããèªæžäŒã®æåãäœã£ãŠè¡ããããšæã£ãŠããŸãã å®£äŒ BIT VALLEY -INSIDE- Vol.9 ãäžè𿥿ã»å Žæã§éå¬ããŸãã æ¥æïŒ2019-6-4(ç«) 19:30 ~ 21:30 å ŽæïŒæ ªåŒäŒç€Ÿmediba å
ã«ãã§ã¹ãºãŒã¹ã8cafeã ããŒãã¯ ãæ£ãããã®ãæ£ããã€ãããŠãããïŒããçµç£çãããžã§ã¯ãã§ã®ã¢ãžã£ã€ã«éçºã ãšãªããŸãã®ã§ãæ¯éãåå äžããã â»ä»å㯠DevLOVE ãšã®åå
±å¬ãšãªããŸãã
ããã«ã¡ã¯ãåµé éçºéšå
Œãã®ã¥ããæšé²éšã®æŠç°ã§ãã ãã£ããæ¥ãçµããåå€ã®å
ãã§ããããæ¢
éšãšãååã®æŽæ°ããã ãã¶æ¥ã空ããŠããŸããŸããã 仿¥ã¯æè¿ãããžã§ã¯ãã§è©Šè¡é¯èª€ããŠããæäžã®ã ã¢ãããã°ã©ãã³ã°ã®åãçµã¿ ã«ã€ããŠã玹ä»ããŸãã ãŸã ãŸã çµ¶è³è©Šè¡äžã§ããå°ããã€èŠããŠãããã®ãããã®ã§ã ã¢ãããã°ã©ãã³ã°ïŒãããã¯ã¢ãã¯ãŒã¯ïŒã«åãçµãã§ãç§ãæãã誀解ãåãåãæ¹ã«ã€ããŠã®è©± ãããŸãã ã¢ã{ããã°ã©ãã³ã°,ã¯ãŒã¯}ã£ãŠ? ãæ«æãã人ã«ãèªãã§ã»ãããæ¥æ¬ã®ç¬¬äžäººè
ã«èãããã¢ãããã°ã©ãã³ã°ãã®é
åãšã¯ïŒ - ãšã³ãžãã¢type | 転è·type ããåŒçšããŸãã 3åãã5åçšåºŠã®ãšã³ãžãã¢ã1ã€ã®ã¢ãã¿ãŒã1ã€ã®PCãå
±æããŠè¡ãéçºææ³ãå
·äœçã«ã¯å®éã«ã³ãŒããæã¡èŸŒãããã©ã€ããŒã圹ã1人ããã以å€ã¯æç€ºãåºããããã²ãŒã¿ãŒã圹ãšãªããæèŠã亀ãããªããéçºã«åãçµãããã©ã€ããŒã¯æ°ååããã«äº€ä»£ããã¢ããããžã®éäžåå ãéäžéåºãèªç±ãããäœæ¥äžã«åé¡ãçããã°ããã®éœåºŠè©±ãåã£ãŠè§£æ±ºãããããææ»ããå°ãªããçæéã§ããã°ã©ãã³ã°å質ã®åäžãèŠèŸŒããã âŠè¯ããããããªãã§ãã? çŽè¿ãããžã§ã¯ãã§ããŒã ã«ãããåŠç¿ãšã¯ãšããããšãããèããŠãã ãå®éã«ãã£ãŠã¿ãããšæã£ãããã§ããå
æ¥åŒç€Ÿã«æ¥œå€©æ ªåŒäŒç€Ÿããåéšæ¬éããããæãããŠãã¢ãããã°ã©ãã³ã°ã«ã€ããŠå匷äŒãéå¬ããŸããã®ã§ãã¡ãã®è³æããã²åç
§ãã ããã å°ããªããŒã ã倧ããªä»äºãå®è£
ããã¢ãããã°ã©ãã³ã° å®ã¯ãããã¯ãã®å匷äŒã«ã¯åå ããŠãããŸãããè³æãšåœæ¥ã®è©±ãããŒã ã¡ã³ããŒããå
±æããŠããã£ãã®ã¿ã§ãäºåæ
å ±ã¯ããŸãæã¡åãããç¹å¥ããŠããŠãäœç³»çã«åŠãã ããã§ã¯ãªããšããã®ããæ¿ç¥ãããã ããã ãŸãã¯ãã£ãŠã¿ããã§ãŒãº What: ããããš ãã¹ãã¢ãã¿ãŒãšãªã£ããŠããããã¹ãã®ã³ãŒã远å jest ã䜿ã£ããã¹ãã³ãŒã â» jest çµéšè
ã¯ã¡ã³ããŒã®ãã¡2åããããªã Who: ã¡ã³ããŒå
šå¡ïŒ9äººïŒ ãã©ã€ããŒãïŒåãšããŠä»»æã®ã¿ã€ãã³ã°ã§äº€ä»£ ã»ãã¯å
šå¡ããã²ãŒã¿ When: 1.5æé Where: äŒè°å®€ How: VSCode LiveShare ã§ã³ãŒãã·ã§ã¢ãå
šå¡ç«¯æ«ãéããŠããç¶æ
ããã ãæ±ºããŠæäœ3åã¯ãã£ãŠã¿ãããšæ±ºããŠããŸãããæéãçãã£ããã¡ã³ããŒãå€ãã£ããããã®ã¯ããã®äººæ°ã»æéã§ã©ããã£ãæèŠãªã®ãããŸãã¯ç¢ºãããããã§ãããã£ãŠã¿ãªãããšã«ã¯äœãåãããŸããã ãã®æ®µéã§ã¯ããŠããŠãå
šããªãã®ã§ããŸãã¯ããããšäºåã«æ±ºãããæºåãããã¡ã€ã³ã®ãã¡ã·ãªããŒã¿ãŒãç§ããã£ãããªã©ãå人ãå ŽãæŽããæºåãããŠããèšãã§ããŸãã3åç®ã§ç§ã¯ãã¡ã·ãªããŒããèŸããããšããã¢ã¯ã·ã§ã³ãªã©ãå ããŠãã£ãŠã¿ãŸããã ååã3åç®:ãã£ãŠã¿ãŠæããèª²é¡ ãçµãã£ãåŸã«é²æãææãæ°ã«ãªã£ãŠããŸãã ToDo ãªã¹ããç²æ¹ã§ãå
ã«äœã£ãŠãããã£ãæ¹ã鲿ã®èŠããåãã§ããŠãæ¶åããŠããæãéžæãããŠè¯ããã äœãšãªãã ãã©æ¬æ¥ã®ãŽãŒã«ã決ããªãããããšè¯ããã 以äžã®ãããªææ³ããããŸããããŽãŒã«ã決ããã®ã¯ãã¡ãããªãã§ãããã©ãããŠãçµãã£ãåŸã«ä»æ¥ã®ææãæ°ã«ãªã£ãããã¿ã¹ã¯ãå®äºããããªãã£ãããšãå¿æ®ãã«ãªã£ããããŸãããã®äººæ°ãæéããŠãã®ææãâŠãšããå
·åã§å¿ççè² æ
ã¯ãã£ãŠãã©ãããŠãã³ã¹ãé«ãšæåæããŠããŸããŸããã ãéŠãçãã 察é¢åŒã§æ€
åã䞊ãã äŒè°å®€ã§ãã£ããããå
šå¡ã¢ãã¿ãŒãèŠãããšãããšæšªãåãããšã«ãªãã®ã§éŠãçããããšããããšãåãããŸãããå€çãªç°å¢ããã¡ããã¡ã倧äºããã§ãã ãããããªãããšã質åããŠããã®ãè¿·ãã 質åãããšäœæ¥ãæ¢ãŸã£ã¡ããããç³ãèš³ãªãæ°æã¡ã«ãªããšããæèŠããããŸãããããã ãã§ã¯ãªãã1.5æé 10人è¿ãã¡ã³ããŒã§ãã£ãŠããšã»ãšãã©èšèããªãã¡ã³ããŒãåºãŠããŸãã ããã©ã€ããŒã®åœ¹å²åé¡ã ãã©ã€ããŒãã£ãŠããŠã話ããããªã£ãŠãã, äžå®æé話ããªãã®ã¯èŸã ãã©ã€ããŒãé²ããŠããŸãããšãåŸã
ã«ããŠããã®ã§åŸ¹åºããã»ããè¯ããã äžèšã®ãããªææ³ããããŸãããããã«ã€ããŠã¯ã«ãŒã«ã培åºãéããã®ãšãããã誀解ããã£ãããã§ãã ãã©ã€ããŒã¯è³ªåãããèªãé²ããããã²ãŒã¿ãŒã®æç€ºéãäžåäžã³ãŒããã¿ã€ããããããªèª€è§£ ãæã£ãŠåãçµãã§ããŸã£ãŠããŸããã ãèžã¿ãŸãã£ãããããã©ã¯ãã£ã¹ã 人æ°ãå€ãããšã§è©±ãçºæ£ã㊠ãã©ã€ããŒãæ··ä¹±ãã ãã¹ãã±ãŒã¹åã®ãããªæ¥æ¬èªã®åé¡ã§ bikeshed discussion ã«ãªããã¡ é©å®äŒæ©åããªããšã³ãã¥ãã±ãŒã·ã§ã³ãå€ãã®ã§ããªãç²ãã äžèšã®ãããªææ³ãããããããã«ãçµæ§æªãéšåãèžãã§ãã£ããªãš3åç®ãçµãããããã§æããŠããŸããã æ¹åãã§ãŒãº: 4åç®ä»¥éãçŸæç¹ã®åãçµã¿ äžèšãèžãŸããŠæ¹åããŠãããŸãããªã 1åç®ããã¢ãã¯ãŒã¯åŸã«ããææ³ã»æèŠãåããŸããïŒä»ãçµãã£ããããæ¯ãè¿ããŸãïŒãé«éã§åããŠé«éã§ãã£ãŒãããã¯ãé«éã§æ¬¡ã«åæ ãããŸã ããããã詊ããªããããã¹ã¿ã€ã«ã¯ãã©ãã©ãããšã¡ãªãããããããé æ«ããã®ã§ãé«éã§è¯ãããŠããæ¹æ³ãè¯ãã§ãã What: ããããš ç»é¢ãžã®åç·è¿œå Cookie ã䜿ã£ãæ¯ãèã远å ã¬ã³ã¡ã³ãæ©èœå®è£
ã®ããã®ãµãŒãããŒãã£ã¹ã¯ãªããçµã¿èŸŒã¿ ååãããã©ãšãã£ã«ãšãã ã¿ã¹ã¯ã§å€çš®å€æ§ Who: 3,4人 When: 3æé 25å, 5åäŒæ©ã®ãã¢ããŒããã¯ããã¯ãå©çš éäžããŠãããã絶察ã«åºåã ãã®éœåºŠãã©ã€ããŒã亀代ãã Where: ç²ããªãããªãŒã¹ããŒã¹ How: åºæ¬çã«å
šå¡åäººã®æ¥å端æ«ã¯éããããã©ã€ããŒã ãã端æ«ãè§Šã£ãŠããç¶æ
ååããã©ãå€ãã£ãã æ¹åã«ãã£ãŠåŸããããã®ã¯å€§ããã£ãã®ã§ããã ããã¯ãããŸã§ç§ãã¡ã®ããŒã ã®ææã«ãããšããã倧ããã§ã ãååããæ¯èŒããŠèª²é¡ãšæãããã®ãã©ããªã£ãããšãããŸããšã ãçµãã£ãåŸã«é²æãææãæ°ã«ãªã£ãŠããŸãã æ¥µåæ°ã«ããªããªããŸããããããããã®ã ããããšã 人æ°ã9人ãã3,4人ã«å°ãªããªã£ãããšã§å¿ççè² æ
ãæžã£ã ã®ããããŸããããŒã ã§éãŸã£ãŠããã¿ã¹ã¯ãæŽãåºãããŠåãæããããšãã£ãå
·åã§é²ããŠãããããã¯åæ°ãéããããšã«ã¡ã³ããŒã§ãããããç¯å²ãèŠããŠãããèŠç©ããã®ç²ŸåºŠãäžããã®ã ãããªãšæã£ãŠããŸãã ãéŠãçãã ããªãŒã¹ããŒã¹ã«å€§ããã®ãã£ã¹ãã¬ã€ããããŠå
šå¡ããããæ£é¢ããèŠããç°å¢ãéèŠããŸããã ã¢ãããç°å¢ãæ¬åœã«ãã¡ããã¡ã倧äºã§ã ãããšäŒæ©äžã«ç«ã¡ããã£ãŠäŒžã³ããããç«ã¡è©±ãããããªã©èº«äœãæ£æçã«åããããããŠããŸãã9人ããã¢ãããããŒã ãåããã®ããããå¥ã®ããŒã ã®ã¢ãã®æ§åãèŠãã«è¡ã£ãããããŸããã ãããããªãããšã質åããŠããã®ãè¿·ãã ãã¡ãã«ã€ããŠã人æ°ãæžããããšãåãå¥ããŠèªç¶ãªäŒè©±ã®äžã§èª°ã話ããªãããšããããšã¯ãªãããã«æããŸãããªããåºå
¥ãèªç±ãšããŠããŸã仿޻èºã®å Žã¯ãªãããã ã»å¿
èŠã«å¿ããŠåå ãããããšæãããããé¢ããŠè¯ããšããŠããŸãã ããã©ã€ããŒã®åœ¹å²åé¡ã äžæŠã«ãŒã«ã¯å¿ããŠãããããããã«ãã£ãŠã¿ãŸããããã©ã€ããŒãèªãæžãããã®ã¯æžããŸããã倿°ã®å®£èšã§ãããã誰ãã® “c o n s t” ãšããèšèãåŸ
ã£ãŠãå¿
èŠã¯ãããŸããã倿°åã¯ã©ãããã®ïŒ ãã£ã¡ã«ã±ãŒã¹ã ããããªã© 質åãã€ã€äŒè©±ããªãããããã³ãŒãåãã圹å²ããã©ã€ã㌠ãšããæãã§ãã ååããããã«ãããªã£ãŠããããš ãã¢ãäžã« Slack ãããèŠãããŠããªãã éäžåãå§åçã«éããŸãã ãã©ã€ããŒä»¥å€ã¯æå³çã«ç«¯æ«ãéããç¶æ
ã§ïŒãããæã£ãŠããªãã§ããïŒå
šå¡ãã£ã¹ãã¬ã€ãèŠãŠåãäœæ¥ã«æ²¡é ããã®ã§ã¢ããçµãããšãã£ããããã»ã©éäžããŠããŸãã ãªã®ã§ãããŒã¹é
åãªã©ãèããŠãã£ãæ¹ãããã®ã ãããªãšæããŠããŸãã “äžäººã§äœæ¥ããŠããã®ãšã¯å¥ã®ãšãã«ã®ãŒã䜿ã£ãŠããæ°ããã” ãšããææ³ããããããããããäžäººã§ã³ãŒããæžãéã«ã¯äœ¿ããªãäŒè©±ã®ãšãã«ã®ãŒã䜿ã£ãŠãã®ã§ãç·åãããšäžäººããç²ãã倧ããããã«æããŸãã 1æ¥ã®ã¢ãã§ã³ãããã»ãã«ãªã¯ãšã¹ãäœæïŒå®éã«ã¯åæãåŸãŠããã®ã§ã¬ãã¥ãŒããŸãããïŒãŸã§è¡ããšéææã»æºè¶³æãé«ãã§ãã ãäœã§ãèãã»è©±ãã ãšã«ãã質åããã»äœæ¥äžã«è©±ãç¿æ
£ãã€ããŠããããã«æããŸãããã®ç²åºŠã ã£ããæ°ããã¯ã©ã¹äœã£ãŠ import ããïŒ ãã® className ãä»ããæã£ãŠãã«ãã¯ã©ã¹ã«ãªããã©ã©ã®ã»ã¬ã¯ã¿æåã«æžããŠãã®ïŒ ã¿ãããªè©±ãèªç¶ãšæµããŠããŸãã ããã£ãŠãã«ãªã¯ãšã¹ãã§ææããããšé¢åããããã€ã§ããããã¿ã€ã ã©ã°ãããããããã«ãªã¯ãšã¹ããäžãã£ãŠã¬ãã¥ã¢ãææã³ã¡ã³ããããåŸã«ã¬ãã¥ã€ãŒã® fix commit ãŸã§ããããé·ããš3æ¥ããããããããã§ãã ã¡ã³ããŒã®åæããã®å Žã§åããŠã³ãŒãã¬ãã¥ãŒãäžèŠãšãªãã®ã¯æéãçžåœççž®ãããŠããã®ã§ã¯ãªãã§ãããã ã ãéäžã®äŒæ©ãããªãæ¯æãã«ãªãã 5åã®äŒæ©æã«ãæµ·å€ãã©ãã®è©±ã«ãªã£ãŠã¢ããšåãããã©ãŠã¶ã§èª¿ã¹ãŠã¿ããªã§æ
å ±ãèŠããããèåé£ã¹ãªããè«ç¬ãããã ã¢ãäžã®äŒæ©ãã»ãšãã©ã¢ãããŠãããããªç¶æ
ãããªãè¯ã ã§ããã¡ãªããªã¯ãã¡ããã€ããã¹ãã§ãã¿ã€ããŒãã€ããŠã¢ã©ãŒã ã§ãã£ããåãããããªåãããã¡ããšããŠããšè¯ãããã§ãã ããããæé»ç¥ã®å
±æããšããæ°ä»ãã å±äººåããã¿ã¹ã¯ã«ãã£ãŠåŒãç¶ããããªãã±ãŒã¹ã ãšããããã¥ã¡ã³ããã©ãã«ãããããããçæã§ããªãã±ãŒã¹ããšãã£ããããªäºæ
ã®æ¯æ¢ãã«æãåŸããªãšã¢ãããããã³ã«æããŸããäžèšã§ãè§Šãããããªãã«ãªã¯ãšã¹ãäžã§ææãããã¡ãªãèªç¶ãšãããªã£ãŠããã³ãŒãã¹ã¿ã€ã«ãã¯ããã å±äººåããŠããã¿ã¹ã¯ã»ã«ãŒã«ã£ãŠã©ã®ãããžã§ã¯ãã«ããããšæã£ãŠãŸããŠãæé»ç¥ãšãããŠãããã®ãå€ããã°å€ãã»ã©äººããåŒãå¥ããã®ã«æå¹ããªãšæããŸã ã ä»åŸã¯ç£èŠããŒã«ã®èŠæ¹ãäœ¿ãæ¹ãäžäººããè§Šããªãå¯èœæ§ã®ãã CI ã®èšå®ã»YAMLãåŒãå¥ããããã®ããã©ãã©ãã¢ãã§ããªããŠãããããšæããŠããŸãã ãããŠäœããåéšããã®è³æã«ããéããã³ãã¥ãã±ãŒã·ã§ã³ã®åé¡ãäžæ°ã«çä»ããããããšã倧ããªå©ç¹ã§ã¯ãªãããªãšæããŠããŸãã ãŸãšã éã«ãŸãšããŠããŸããšã 人ã«ã¯äººã®ã¢ãã¯ãŒã¯ ããªãã§ããéãããã®ã§ç§ãæããŠããã¢ãããã°ã©ãã³ã°ã®ä»ã®ãšããã®ãã¿ãŒãªæ¹æ³ãšããŠã¯ã ãŸãã¯çæéã§ã现ããéäžæéã§ãå°ããªããŒã ã§ ãªã©ãã¯ã¹ã§ããäœå¢ãä¿ãŠãç°å¢ã§ ãã©ã€ããŒä»¥å€ã¯ç«¯æ«ãéããªã ãã㊠äžçªå€§äºãªã®ã¯ã¡ã³ããŒãæãããæ°æã¡ãæ¬æãããè¯ãå Žã«ããããšããããŒã ã®æè ãªã®ããªãšã æ¬æ¥ã¯ä»¥äžã§ãã
ããã«ã¡ã¯ãauããŒãããŒæ¬éšã®è
éšã§ãã Google Discoverã®èšäºã¬ã³ã¡ã³ãçµç±(googleapi.com or discover.google)ã®ã¢ã¯ã»ã¹å¢ã®è©±é¡ãæè¿å¢ããŠããã®ã§ããã°ã®æ®ãæ¹ãšã¢ã¯ã»ã¹èŠæš¡(ãã¥ãŒã¹ãµã€ã)ãç°¡åã«èª¿æ»ããŠã¿ãŸããã Google Discoverãšã¯ GoogleChrome(æ°èŠã¿ã)ãGoogleã¢ããªã§è¡šç€ºããããã¥ãŒã¹èšäºã®ã¬ã³ã¡ã³ãã§ãæ©æ¢°åŠç¿ãçšããŠãŠãŒã¶ãŒã®è¡åããŒã¿ããæé©ãªã³ã³ãã³ããéžå¥ãããŠããŸãã Android7ãããããã¯ããŒã ç»é¢ãã¹ã¯ã€ãããã ãã§è¡šç€ºãããäºãã§ããŸãã ãªã¯ãšã¹ãããããŒã®ç¢ºèª ã¢ã¯ã»ã¹è§£æãšããŠåã
ã®æµå
¥å
ããšã«ã»ã°ã¡ã³ããäœãããã®ã§ããã±ãããã£ããã£ã§ããããã®ãªã¯ãšã¹ãããããŒã確èªããŸããã 1. Googleã¢ã㪠ã¬ã³ã¡ã³ãç®æã®ãªã¯ãšã¹ãããããŒã¯ä»¥äžã®éãã§ãã Android 4 key value Referrer android-app://com.google.android.googlequicksearchbox/ UserAgent Mozilla/5.0 (Linux; Android 4.4.2; SOL23) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.28 Mobile Safari/537.36 ReferrerãšããŠandroid-appããå§ãŸãç¬èªURIãæž¡ãããŠããŸãã iOS 10 key value Referrer ãªã UserAgent Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) GSA /65.0.225212226 Mobile/14F89 Safari/602.1 Referrerã¯æž¡ãããŠããŸãããã代ããã«UserAgentã§GSAãšããæååã確èªã§ããŸããã ã¿ã°ãããŒãžã£ãŒãããã§æååãåŒã£æããŠã«ã¹ã¿ã ãã£ã¡ã³ã·ã§ã³ã«ã»ããããã°GSAWebviewãšããŠã®ã»ã°ã¡ã³ããåããããã«ãªããŸãã â»GSAWebviewã§ã®èªç¶æ€çŽ¢é·ç§»ã§ã¯ãReferrerã[google.com]ãšããŠæž¡ãããŠããŸããã 2. Google Chrome (v71) æ°èŠã¿ããéããæã®ã¬ã³ã¡ã³ãç®æã®ãªã¯ãšã¹ãããããŒã¯ä»¥äžã®éãã§ãã Android 4 key value Referrer https ://www.googleapis.com/auth/chrome-content-suggestions UserAgent Mozilla/5.0 (Linux; Android 4.4.2; SOL23) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.99 Mobile Safari/537.36 â»Android8ã§ã確èªããŸããããAndroid4åæ§ã®Referrerã§ããã iOS 10 key value Referrer https ://www.googleapis.com/auth/chrome-content-suggestions UserAgent Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) CriOS/71.0.3578.89 Mobile/14F89 Safari/602.1 AndroidOS,iOSãšãã«[https://www.googleapis.com]ããå§ãŸãURLãReferrerãšããŠæž¡ãããŠããŸããã ãšããããã§ãã»ã°ã¡ã³ãåã®å¯åŠããŸãšãããšãããªæãã«ãªããŸãã Googleã¢ã㪠ã¬ã³ã¡ã³ã GoogleChrome ã¬ã³ã¡ã³ã Android â (Referrer) â (Referrer) iOS â³ (UserAgent) â» â (Referrer) â» [GSAæååç¹å®]ãš[directã»ãã·ã§ã³]ã®ANDæ¡ä»¶ã§æšå®ã§ãããšæããŸãã ã»ã°ã¡ã³ãäœæ ãªãã¡ã©ãŒã®æååãGoogleTagManagerçµç±ã§GoogleAnalyticsã®ã«ã¹ã¿ã ãã£ã¡ã³ã·ã§ã³ã«ã»ããããŠããã®ã§ãåœè©²ãã£ã¡ã³ã·ã§ã³ã§æååãæå®ããããšã§ã»ã°ã¡ã³ããäœæãå¯èœã«ãªããŸãã 1. Googleã¢ããªã¬ã³ã¡ã³ã(Android) â»iOSã®ãã©ããã³ã°ã¯ä»åéã«åããªãã£ãã®ã§ã確èªã§ã次第远èšããããšæããŸãã 2. Google Chromeã¬ã³ã¡ã³ã 3. discover.google.comçµç±(æµå
¥å
äžæ) ãã©ãã£ãã¯ç¢ºèª ä»åã¯åŒç€Ÿã§éå¶ããŠãããã¥ãŒã¹ã¡ãã£ã¢ã®1ãµã€ãã§ããã©ãã£ãã¯ã®èŠæš¡ã確èªããŸãããâ»ãã¥ãŒã¹ãµã€ã以å€ã§ã¯ãã©ãã£ãã¯ã確èªã§ããŸããã§ããã ã»åç
§å
/ã¡ãã£ã¢ googleapis.comã6äœãdiscover.google.comã14äœã«å
¥ã£ãŠããŸãã ã»æç³»åæšç§» 2018幎4æã12æãŸã§ã®ã»ã°ã¡ã³ãããšã®ã»ãã·ã§ã³æ°ã®æšç§»ã§ãã 1. Googleã¢ããªã¬ã³ã¡ã³ã ã¢ã¯ã»ã¹ã¯4æãã確èªã§ããŠãããã®ã®ã8æåŸåãã倧å¹
ã«äžæããŠããŸãã 2. Google Chromeã¬ã³ã¡ã³ã 10æäžæ¬ã«æ¥èœããŠããŸããã11ææ«ããæ¥äžæããŠããŸãã 3. discover.google.com 10æäžæ¬ã«çªç¶çŸããŠã12æã«äžèœããŠããŸãã â»1ãµã€ãã®ã¢ã¯ã»ã¹ãã°ã§ãã®ã§ãä»åã®èª¿æ»ããGoogleã®ã¢ã«ãŽãªãºã ãå®è£
ã®å€åãæšæž¬ããã®ã¯å°é£ã§ãã ã»MAUå
šäœã«å ããå²å 以äžã®èšå®ã§ã¬ã³ã¡ã³ããã©ãã£ãã¯ã®ã»ã°ã¡ã³ããäœãå
šäœã«ãããå²åãæž¬å®ããŸããã çµæãšããŠã¯ MAUã®15%ã»ã©ãã¬ã³ã¡ã³ããã©ãã£ãã¯ã«ãããã® ãšæšå®ã§ããŸããã ã¬ã³ã¡ã³ãçµç±ã¯æ°èŠãŠãŒã¶ãŒã®å²åãå€ããããMAUã«è²¢ç®ã§ããããã§ãã ã»OSããšã®éã ãGoogleã®æ€çŽ¢ãŠã£ãžã§ãã(QSB)ã§ã®èªç¶æ€çŽ¢é·ç§»ã§ãandroid-appããå§ãŸãç¬èªURIããªãã¡ã©ãŒã§æž¡ãããšããæ
å ±ããããã¢ããªã®ããŒãžã§ã³ or OSã®ããŒãžã§ã³ã«ãã£ãŠãªãã¡ã©ãŒä»æ§ãç°ãªãå¯èœæ§ããããŸãã ãã®ããã念ã®ããè€æ°ã®OSã§ãæ¯èŒããŸããã OS ver ã¬ã³ã¡ã³ãã®å²åâ» Android 8 17% Android 7 16% Android 6 14% Android 5 9% Android 4 5% â»åœè©²OS MAUã«ãããåœè©²OSã¬ã³ã¡ã³ãMAUã®å²å ãã®æ¯èŒã§ã¯OSã®ããŒãžã§ã³ãäžããããšã«ã¬ã³ã¡ã³ãã®å²åãå¢ããŠããäºãåãããŸãã å®éã«OSã®ããŒãžã§ã³ãäžããããšã«ããŒã ç»é¢ããã®æ€çŽ¢ã¢ã¯ã»ã¹ã容æã«ãªã£ãŠãããããMAUã®15%çšåºŠãšããä»åã®æšæž¬ã¯ããçšåºŠåŠ¥åœããšæããŸããã ãããã« SEOã®èŸ»ãããä»°ã£ãŠããããã« Directæ±ãã®Googleã¢ããªæµå
¥(iOS)ãããã¯ããªã®ã§ãä»åã®æ°å€ãèæ
®ãããšã¬ã³ã¡ã³ãæµå
¥ã¯ç¡èŠã§ããªãèŠæš¡ã«ãªã£ãŠããã®ã§ã¯ãªãããšæããŸãã google.comã§ãè¿ããã¡ã«Discoverãå®è£
ããããããªã®ã§ããããããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã§ã¬ã³ã¡ã³ããã©ãã£ãã¯ãå¢å åŸåã«ãªããšæãããŸãã ä»åŸãé³å£°æ€çŽ¢ãå«ãã調æ»ãç¶ç¶ããŠé²ããŠãããããšæããŸãã åèèšäº 2019幎泚ç®ã®ãµãŒãã¹ãGoogle Discoverã ä»çµã¿ãSEOãžã®åœ±é¿ãæé©åææ³ Discover new information and inspiration with Search, no query required Google Discover - Search Console ãã«ã
ãã®èšäºã¯ã mediba Advent Calendar 2018 ã®20æ¥ç®ã§ãã ããã«ã¡ã¯ãã³ãã¥ãã±ãŒã·ã§ã³ãã¶ã€ã³æ¬éš åµé éšã®æ£®ç«¹ã§ãã ããã¯ãšã³ãéçºãæ
åœããŠããŸããæè¿ã¯ ã«ã€ãŒã³ã»ãžã£ãŒã㌠ãéããŠã®ã¢ãžã£ã€ã«/ã¹ã¯ã©ã ã®æšé²ã BIT VALLEY -INSIDE- ã®ã³ãã¥ããã£éå¶ã«åç»ããŠããŸãã ä»åã¯å
æ¥ã® BIT VALLEY -INSIDE- Vol.2 ã§ã©ã€ããã³ã°ããŒã¯(LT)ãããŠé ããå
容ãäžå¿ã«èšäºãšãããŠé ããŸããããããããã¯ãã®ãããã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ã®ãžã£ãŒããŒã玹ä»ããŸãã AWS Batch AWS ç°å¢ã§ã®ããããšèšãã°ã AWS Batch ã§ã¯ãªãã§ããããã AWS Batch ã®ç¹åŸŽã¯äžèšã®éãã§ãã ãã«ãããŒãžãåã§ãã AWS Batch ã®å®äœã¯ Amazon ECS ããŸããã®å®äœã¯ EC2 ã®æ§æã§ããã¹ãããã€ã³ã¹ã¿ã³ã¹ãžå
¥æããããšãåºæ¥ãŸãã 2018幎3æ ã« CloudWatch Event ã«å¯Ÿå¿ãã cron çãªäœ¿ãæ¹ãåºæ¥ãããã«ãªããŸããã Docker ã³ã³ããð³ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãã ãã°ã¯ CloudWatch Logs ã«åºåããŸãã å®è¡ãã¿ãŒã³ã®1ã€ã«ãã fetch-and-run ãããããŸãã fetch-and-run AWS ããæäŸãããŠãã Dockerfile ã fetch_and_run.sh ã䜿çšããäžèšã®æµãã§å®è¡ããŸãã AWS Batch ã Docker ã³ã³ãããšããŠãžã§ããå®è¡ããã fetch_and_run.sh ãå®è¡ããã AWS S3 ããã¢ããªã±ãŒã·ã§ã³ãååŸããã ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã ã¢ããªã±ãŒã·ã§ã³ã AWS S3 ãžé
眮ããã ãã§ããããã¢ããªã±ãŒã·ã§ã³ãå®è¡å¯èœãšãªããŸãããšã³ãžãã¢ã¯ã¢ããªã±ãŒã·ã§ã³ã®éçºã«æ³šåããããšãåºæ¥ãŸãã â»LTæã«ã¯ fetch-and-run ã§åŒæ°ãæ±ããªããšã話ãããŠããŸããŸããããåŒæ°ãæ±ãããšãåºæ¥ãŸããã倧å€å€±ç€ŒããŸããã ã¢ããªã±ãŒã·ã§ã³éçºèšèª ä»å㯠Go èšèªãæ¡çšããŸããã 瀟å
ã§ã¯2016幎é ãã䜿ãå§ããå®çžŸããããŸããããŒãžã§ã³ã¯ææ°ããŒãžã§ã³ã® Go 1.11 ã§ãã Goèšèªã®ã·ã³ã°ã«ãã€ããªã¯æ±ããããã fetch-and-run ãšã®çžæ§ã¯è¯ãããã§ãâ€ïž ãã«ã/ããã〠ãã«ã Travis CI ã«ãŠ Go ãã«ããå®è¡ãããã€ããªã AWS S3 (ãã«ãçšãã±ãã) ãžPUTããŸãã ããã〠ç°å¢æ¯ã«äœæããäžèšãã©ã³ããžã®ããŒãžãããªã¬ãŒã«ã Travis CI ã«ãŠ AWS S3 (ã¢ããªã±ãŒã·ã§ã³çšãã±ãã) ãžPUTããŸãã fetch-and-run ã§ã®ãããã€ã¯ãããã ãã§ãâ€ïž deployment/production deployment/staging deployment/development Fargate 2018幎8æã«ãã¿ã¹ã¯ã®ã¹ã±ãžã¥ãŒã«ãã«å¯Ÿå¿ãããš çºè¡š ããããŸããã AWS Batch ã§ããããšããŠããäºãšåãããšãã¯ã©ã¹ã¿ãŒç®¡ç( EC2 )äžèŠã§å®çŸåºæ¥ãããã«ãªããŸããâïž ãŸãšã ãããã®ã¢ãŒããã¯ãã£ãžã£ãŒããŒã玹ä»ãããŠé ããŸããã ä»å㯠AWS Batch ã§ã¯ãªãã AWS Fargate ãæ¡çšãã Go ã®ãããã¢ããªã±ãŒã·ã§ã³ã fetch-and-run ã䜿ã£ãŠå®è¡ããã¢ãŒããã¯ãã£ãšããŸããããã¡ãããããã¢ããªã±ãŒã·ã§ã³ã®ä»æ§ãç¹æ§ã«ããã AWS Batch ãæ¡çšããããšããããšæããŸãã CI ã«ã¯ Travis CI ã䜿çšããŠããŸããã AWS CodePipeLine/CodeBuild ã§ãè¯ãããã§ãã ä»åŸã¯ EC2 ã§å®è¡ããŠããæ¢åã®ãããã¢ããªã±ãŒã·ã§ã³ã AWS Batch ããŸã㯠AWS Fargate ãžç§»è¡ããããšãæ€èšããŠè¡ããããšæã£ãŠããŸãã åè Creating a Simple âFetch & Runâ AWS Batch Job AWS Batchã§ã·ã§ã«ã¹ã¯ãªãããå®è¡ããå
žåçãã¿ãŒã³ã®ã玹ä»
ãã®èšäºã¯ã mediba Advent Calendar 2018 ã®10æ¥ç®ã§ãã ã³ãã¥ãã±ãŒã·ã§ã³ãã¶ã€ã³æ¬éš åµé éš ã¢ããªéçºã°ã«ãŒãã®æŸå³¶ã§ããXamarinã倧奜ãã§ãã ä»åã¯ã Xamarin.Forms 4.0 ã®ãã¬ãã¥ãŒçããªãªãŒã¹ãããã®ã§ãæ©é詊ããŠã¿ãŸããã 詊ããããŒãžã§ã³ã¯4.0.0.8055-pre1ã§ãã æ°æ©èœ 以äžã®ïŒã€ã®æ©èœã远å ãããŸããã Shell Visual CollectionView çŸç¶ã§ã¯ããããã®æ©èœã䜿ãããã«ã¯ã AppDelegate ã MainActivity ã§ä»¥äžã®ããã«èšå®ããå¿
èŠããããŸãã global::Xamarin.Forms.Forms.SetFlags("Shell_Experimental", "Visual_Experimental", "CollectionView_Experimental"); Shell Shellã¯ã MasterDetailPage ã®ãããªæè¬ãã³ããŒã¬ãŒã¡ãã¥ãŒãäœæããæ©èœã§ãã MasterDetailPage ãšã©ããéãã®ããšãããšã MasterDetailPage ã§ããŒãžãåãæ¿ããã«ã¯ãåã®ããŒãžãç Žæ£ããŠãåãæ¿ãããã³ã«æ°ããããŒãžãäœæããããšã«ãªãã®ã§ããã Shell ã¯ãæåã«ããŒãžãäœã£ãŠããŸããããšã¯è¡šç€ºãåãæ¿ããã ãã«ãªã£ãŠããŸãããã®ç¹ã¯ã TabbedPage ã«äŒŒãŠããŸãã Shellã¯ã以äžã®ããã«äœ¿ããŸãã <Shell xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:XamarinForms4App" x:Class="XamarinForms4App.MainPage"> <Shell.Resources> ... </Shell.Resources> <ShellItem Title="Visual"> <ShellSection Title="Material"> <ShellContent> <local:MaterialPage/> </ShellContent> </ShellSection> <ShellSection Title="Normal"> <ShellContent> <local:NormalPage/> </ShellContent> </ShellSection> </ShellItem> <ShellItem Title="CollectionView"> <ShellContent> <local:CollectionViewPage/> </ShellContent> </ShellItem> </Shell> ShellItem ã§ãã¡ãã¥ãŒã远å ããŠã ShellContent ã«è¡šç€ºããããŒãžãå«ããŸãã ShellSection ã䜿ãã°ãã¿ãã§åãæ¿ããããšãã§ããããŒãžã«ããããšãã§ããŸãã ããšãiOSã§ã¡ãã¥ãŒã¢ã€ã³ã³ã衚瀺ããã«ã¯ã 3bar.png ãšããååã§ç»åãå«ããªããšãããªãããã§ãã Visual ä»ãŸã§ã¯ãå
±éã«æžããŠããŠããiOSãšAndroidã§èŠãç®ãçµæ§ç°ãªãããã¶ã€ã³ã«èŠåŽããããšããããŸããã4.0ããã¯ããããªã¢ã«ãã¶ã€ã³ã§èŠãç®ãåãããã«ããããšãå¯èœã«ãªããŸããã Visual ããããã£ã Material ã«ããããšã§ããããªã¢ã«ãã¶ã€ã³ã«ããããšãã§ããŸãã <ContentPage ... Visual="Material"> ... </ContentPage> CollectionView ã°ãªãã衚瀺ãããã«ã¯ã AiForms.CollectionView ãšããã©ã€ãã©ãªã䜿ã£ãŠããã®ã§ãããããããå
¬åŒã«ãç»å ŽããŸããã ã«ã©ã æ°ã3ã€ã®ã°ãªãããäœãã«ã¯ä»¥äžã®ããã«ããŸãã <CollectionView ItemsSource="{Binding Items}" > <CollectionView.ItemsLayout> <GridItemsLayout Orientation="Vertical" Span="3" /> </CollectionView.ItemsLayout> <CollectionView.ItemTemplate> <DataTemplate> <StackLayout HeightRequest="100"> <Label Text="{Binding Title}"/> <Label Text="{Binding Detail}" FontSize="Small" /> </StackLayout> </DataTemplate> </CollectionView.ItemTemplate> </CollectionView> çŸç¶ã§ã¯ãã¯ãªãã¯ã€ãã³ããã¹ããŒã¹ã®èšå®ãã§ããªããããªã®ã§ããŸã ãŸã ãããããšãã£ãæãã§ãã GitHub äœã£ããã®ã¯ ãã ã«çœ®ããŠãããŸãã ãããã« æè¿ãXamarin.Formsã®é²åãç®èŠãŸããã§ãããŸã ãŸã ã®ãšããããããŸããã倧å䜿ãããããã®ã«ãªã£ãŠããŸãããä»åŸãèŠãã§ãã¯ã§ããã
ãã®èšäºã¯ mediba Advent Calendar 2018 ïŒæ¥ç®ã®èšäºã§ãã ãã¯ããããããŸãã ããã«ã¡ã¯ã ããã°ããã åµé éš æ°ç±³éšé· å°Ÿéã§ãã åŒç€Ÿã®ç€Ÿå¡ãéå¶ã¡ã³ããŒãšããŠåç»ããŠããã ãBIT VALLEY -INSIDE-ããšããã³ãã¥ããã£ã«ãŠã話ãããŠããã£ãå
容ãäžå¿ã«æžãèšããŸãã ãã®æã®æš¡æ§ã¯ @samuraiRed ããã«ããã°ã«ããŠããã ããŸããã å¬ããéãã§ãã https://blog.samuraikatamaris.red/entry/20181025/1540437510 ãããè¯ãã³ãã¥ããã£ãªã®ã§ãããã£ããã€ãã³ãã«åå ããŠã¿ãŠãã ããã FacebookããŒãž ããŠæ¬é¡ã§ãã ãã£ãšã©ã®ITäŒæ¥ã«æŒããŠãæè¡çè² åµã£ãŠãããšæããŸãã ã ç¡è«ãåŒç€Ÿã«ããã㌠ã ç§ãæ
åœããŠããPJã«æŒããŠãã倧ããªæè¡çè² åµããã£ãŠã åçŽã«æéãè²»ãããŠè² åµããŒãã«ããã ãããïŸïœ¯ïŸïœ²ïŸ
ïœ²ãšæãã»ã»ã» ã ãããªã話ã§ãã åæ PJå
ã®ãšã³ãžãã¢ã®å²åïŒ2018/03åœæïŒ ããã³ããšã³ãïŒ4人ïŒã¯ã©ã€ã¢ã³ããµã€ãïŒ ãµãŒããŒãµã€ãïŒ8人ïŒPHPïŒ ãã£ãã ãšã¯ããæè¡è² åµé§åå·æ°ãããªããã§ãã ã PJããŒã å
šäœã§ã®ãšã³ãžãã¢ãªã³ã°ããŒã ã®çšŒåãã©ã³ã¹ãèŠãæã«ã ããã³ããšã³ãïŒæ®æ¥éå€ ãµãŒããŒãµã€ãïŒãã¯ã€ãäŒæ¥ ã®ãããªç¶æ³ã§ããã ã UX/UIãèµ·ç¹ã«èŠä»¶ãçºçããã®ã¯åœç¶ã§ãããã èŠèªæ§ãæã€UIã«å¯ŸããŠãŠãŒã¶ãŒã¯åå¿ããŸãããããã«å¯ŸããŠã«ã€ãŒã³ã£ãŠãªããŸãããããã ã æšä»ãWebãã©ãŠã¶ã§åºæ¥ãäºã¯ãã®ãããå¢ããŸããã ã Server Side Renderingã«å²ãåŠçã³ã¹ãã£ãŠããã£ãšWebãã©ãŠã¶ã«å¯ããã»ããäœéšãè¯ããªãããæå
ã®ç«¯æ«ã«åŠçãå¯ããã°ãµãŒããŒãªãœãŒã¹/ã³ã¹ããæžãããããããšã ã ã ãã£ãšæå
ã«åŠçãå¯ãããã ãã£ãšãŠãŒã¶ãŒæ¥ç¹ãåžããšã³ãžãã¢ãå¢ãããŠãç·äœçã«ãšã³ãžãã¢ãšãŠãŒã¶ãŒã®è·é¢ãçž®ãããã ã ã ããã ãã©ãŠã¶ãäž»æŠå Ž ãªãã§ã by 瀟å
ã®ãšã³ãžã㢠ã ã 圹å²å®çŸ© ãšããããšã§åœ¹å²å®çŸ©/æè¡ã¹ã¿ãã¯ã倧ããå€ããŸããã Universal JavaScriptå ïŒãµãŒããŒãµã€ã/ããã³ãã®äººå¡ãªãœãŒã¹ã®å¹çå ã SPA/é·ç§»å
ããŒãžã®prefetch/dynamic import/æé©ãªSSRçã«ããç»é¢æç»ãšé·ç§»ã®äœéšãæ¹å ïŒUXåäž ä»ãŸã§ããããšãPHPãåã¯ããïŒPHPïŒã«å€ãã®äºãåŠã³ãŸããã ã ïŸïŸ
ïŸPHP åã¯ä»TypeScriptã«å€¢äžã§ãã ã ãããŠãïŒã€ã®ããŒã ã«è²¬åãæã£ãŠããã£ãŠããã¥ãŒãã³ã°åºæ¥ãæ¹ãã ã³ãã¥ãã±ãŒã·ã§ã³ã³ã¹ããæžããããã責åã«éäžåºæ¥ãããè¯ããã ã ãããªã€ã¡ãŒãžã§åããŸããã ãµãŒããŒãµã€ãã®éšåãWeb+Rest APIïŒä»åã¯GraphQLã«ããŸãããïŒ/Consoleã«åé¢ããŠãããã³ããšããã¯ãšã³ãã«å¯ããŠïŒå±€ã«ããŸããã 責任åçãšè¶
æŠèŠæ§æ ã ãããªã€ã¡ãŒãž ã ããããã§ã ããã¯ãšã³ãã®ããããPHPã¯èŸããŠGolangã«ããŸããã ç¥èŠã¯æ¢ã«ãã£ãã®ã§æŠãç¡åé¡ã§ããã ã 責åç¯å²ã¯ ããã³ããšã³ãïŒãã©ãŠã¶ïŒãµãŒããŒWebïŒAPIïŒBackends For FrontendsïŒ ããã¯ãšã³ãïŒããããšã€ã³ãã© ã ãšãã責任åçã®IFã¯ããã³ãåŽã§èšèšããæ§ã«ããŸããã äœãããã®storageã®schemaäŸåã§ã¯ãªããå©çšããåŽãå©çšæå³ã«å³ãã圢ã§èšèšããProvideråŽã¯ããŒã¿æäŸã®çºã«äœã蟌ãããæ£çŸ©ã ãš ïŒConsumer Driven ContractçãªïŒ åŠç¿ã³ã¹ã å人ïŒã²ãããã³ãŒãæžããŸããã ãããââ å
é£ããŒã ïŒå®è£
åºæ¿ãäœã ãããââ PJããŒã ïŒã¢ãã¯ãäœãæããã¯ããã宿çãªãã£ãŒãã³ã°ãç¹°ãè¿ã ã ãšããã®ãç¹°ãè¿ããªããæµžéãå³ããŸããã éçºPhaseã«ãŠ PJã®éäžïŒäžç€ãåŸæïŒããã§ã¯ãããŸããã eXtream Programmingçãªã¢ãããŒããåãå
¥ããäºã«ããŸããã ã ã©ãããŠãéçºPhaseã«ãããŠãã©ã€ãæãããšPull Requestã£ãŠæºãŸã£ã¡ãããã§ããããã¬ãã¥ãŒåŸåã 宿çã«åºå®ã®ã¬ãã¥ãŒæéãåã£ãŠã鲿ããªããã§ãããã£ã±ãã ã ãããŠãå±äººçã«ã³ãŒãæžãã¡ãããŸãŸã¬ãã¥ãŒåºæ¥ãã«åé¡ãé¡åšååºæ¥ãªãâå質ãåäžããªããšããè² ã®ã¹ãã€ã©ã«ã«é¥ã£ãŠããŸãã®ã§ã»ã»ã» 3人1çµã«ããŠã©ã€ãã³ãŒãã£ã³ã°ãããäºã«ããŸããã ã ã¢ãã§ããã¢ã§ããªããããã²ãŒã¿/ãã©ã€ãã§åããããšããªããã¹ã¿ãã¯åçã§æ¥åç¹ã話ããªããé²ããŠããã¹ã¿ã€ã«ãåããŸããã ã ãããªã«ãŒã«ã§ãã£ãŠãŸãã ãªãŒããŒçãªäººããã©ã³ãåã ã»ãã·ã§ã³åŒµã ã¿ããªãããã«åå ã¿ããªã§TODOãªã¹ãäœã äžäººã§ãããããããªã¥ãŒã æ TODOãªã¹ããã¿ã€ã ããã¯ã¹ç®¡çãã äŸïŒ1æéãšæ±ºããŠæ¶åã確èªãã VSCodeã®Live Shareãšããæ©èœããšãŠãè¯ãã¿ããã§ãã æééœåãåãããããªãåã¯åå åºæ¥ãŠãŸããorz ãšãŠã楜ãããã ããå¹çããã£ãããšããæèŠãããã ããŸããã 矚ãŸããorz ä» ãããã詊éšPhaseã«å
¥ã£ãŠãããŸãããããã責ååé¢ã§ïŸïœ¯ïœŒïœ®ïœ²ããŸãã éæ©èœç ããã©ãã¥ãŒïŒãªãã¡ã¯ã¿ å
šäœã§èšããšããªã¥ãŒã ãã¹ããšäŸå€ãã¹ãããã æ©èœç ãã°ãã±ïŒE2EïŒãªãã¡ã¯ã¿ ã¿ãããªã€ã¡ãŒãžã§é²ããããšèããŠãŸããéã§ããæãããç¯å²ã¯ïœºïœºïŸïŸïŸ 2019ã®ãã€ãããã£ãšçŽ æµãªäœ¿ãå¿å°ããŸãšã£ããããã¯ããäžã®äžã«æŸåºãããŸãã æªæ¥ã®ã話 ãããã¯ããé·ãç®ã§èŠãæã«ã°ããŒã¹ããŠããææã®ã»ããå§åçã«é·ããšæããŸãïŒã±ãŒã¹ãã€ã±ãŒã¹ã§ããïŒ ãã€ã¢ãŒãã«ITã«ãããSoR/SoEã®ã·ãããã§ã³ãžã£ãŠãšãŠãéèŠã ãªãŒãšã ãã®äžã§ãã°ããŒã¹Phaseã«ãããŠã¯SoEã«ã®ã¢ãå
¥ãæ¿ãããã£ãããšãŠãŒã¶ãŒã®åå¿ãèŠãªããããŠãŒã¶ãŒã«æ±ããããæ¹åã«ãããã¯ããæé·ãããŠãããããã»ã¹/æè¡ã«å€ããŠããããšèããŠãŸãã æè¡ã¯äºæ¥æé·ã®ããã«äœ¿ãããã ãšã ãŸã èšããŸãããããŸãã«ãããã倧ããªæ°ãµãŒãã¹ãMicroservicesã§ä»ç«ãŠãŠããèšç»ããã£ãããªãã£ããããŸãã ãŸã ãŸã ææŠãããã®ãããµãŒãã¹æ§æ³ã沢山ããäžã§ããŠãŒã¶ãŒäŸ¡å€ãäžå¿ã«æ®ããŠã¢ãã¥ãããããŠãããæåãããããåµã£ãŠããããšããŠãŸãã ãããªæååµãããæºãããããã£ãŠããåã®åŒ·ããšã³ãžãã¢ãæ±ããŠãããŸãã ã ã§ã¯
ãã®èšäºã¯ mediba Advent Calendar 2018 äºæ¥ç®ã®èšäºã§ã åºå± : https://dic.nicovideo.jp/a/%E3%81%82…%E3%81%82%E3%82%8A%E3%81%AE%E3%81%BE%E3%81%BE%20%E4%BB%8A%20%E8%B5%B7%E3%81%93%E3%81%A3%E3%81%9F%E4%BA%8B%E3%82%92%E8%A9%B1%E3%81%99%E3%81%9C%21 ããã®ãã®ã£ããããããªãµãããŠãŠ…. èªå·±çŽ¹ä» ã¡ãªãŒã¯ãªã¹ãã¹ãŸã§ 3 é±éã¡ããã§ããããããéããã§ãããã ã³ãã¥ãã±ãŒã·ã§ã³ãã¶ã€ã³æ¬éš åµé éš ã¢ããªéçºã°ã«ãŒãã® äœè€çŠç« ãšç³ããŸã æ¬æ¥ãšããŠã¯ãAndroid/iOS ã®ãã€ãã£ãã¢ããªã®æ§ç¯ãããã¡ã³ããŒã®ãæäŒãããã£ãŠããŸã ä»åäœã£ããã® ä»ååºæ¥ãŠãããã®ã¯ã JPG ç»åã®å§çž®çãæ¯èŒã§ãã SPA ã§ã https://github.com/medi-y-sato/imageComplesser now ã« publish ããŠãããŸãã https://build-fbillkollb.now.sh/ äžèº«ã®è§£èª¬ ç»åãæå®ãããšãJPG ã§ã¯ãªãªã㣠10%å»ã¿ 10 段éã®ç»åãçæãããªã¹ãããŸã AngularDart ã®ã¯ãããã äœããšãã®ãã£ãšããæµãã ããèšèŒããŠãããŸã Dart for Web ã® Get Started ã® 2 ãš 3 ã宿œããŠãDart ã® SDK ãš webdev ã stagehand ãå°å
¥ããŠãããŸã ãããžã§ã¯ãçšã®ãã£ã¬ã¯ããªãäœæåŸããã®ãã£ã¬ã¯ããªäžã§ stagehand web-angular ãšããåæãã³ãã¬ãå±éããŠããããŸã ãã®åŸ pub get ãå®è¡ãããšãã«ã¬ã³ãã«ãã pubspec.yaml ãåç
§ããŠããã±ãŒãžãå°å
¥ããŠãããŸã webdev serve ãšãããšéçºã¢ãŒãã§ããŒã«ã«ã«ãµãŒããç«ã¡äžããã®ã§ãåºåã«ãã URL(å€§æŠ http://localhost:8080 ã ãšæããŸã)ãéããŠç¢ºèªããŠã¿ãŠãã ãã webdev build ãšãããšã«ã¬ã³ãã® ./build/ ãã£ã¬ã¯ããªã«ãã«ãçµæãåºåãããã®ã§ãé©åœãªæã«èšçœ®ããŠãã ãã AngularDart ã§åãæ±ãã³ãŒã㯠./lib/ 以äžã«ãããŸãã®ã§ã ./lib/src/app_component.dart ãšããã³ãã¬ã³ã³ããŒãã³ããšããçºããŠæ§æã確èªããã°ãAngulra ããã£ãããšããã人ãªããããŒãªãã»ã©ããšæãã§ããã ä»åãã£ãããš Dart ã£ãœãäºã¯ãããŸããã£ãŠããŸãã TypeScript æžããŠã人ãªã Visual Studio Code ã®ãµãžã§ã¹ããšã«ã³ã§å¯Ÿå¿ãããããã¬ãã«ãªã®ã§ãAngular2 以éãè§Šã£ãããšããã人ãªã AngularDart ã¯ããé£ãããªããšæããŸã base64 ãåãæ±ãããã® crypto ãç»ååŠçãè¡ãããã® image ããã±ãŒãžã pub ããå°å
¥ dependencies: crypto: any image: any ãã¡ã€ã«ã®ã¢ããããŒãã¿ãã㪠UI ãäœæ ãã¡ã€ã«ã®éžæãå®äºãããããã«ã³ã³ããŒãåŠçãèµ°ããããã£ãã®ã§ã (change) ã§ãããªãã¡ãœããåŒã³åºãè¡åã®æªã仿ãã«ããŠãŸã <input style="display: none" type="file" accept="image/png"><button>Select File</button> ç»åã¯å
šéš Base64 ã§ãã¡ã³ã img ã® DOM ã«ãã€ããªãšããŠæŸã蟌ãã®ãæ£ããã®ãããããŸããããããã©ãããã£ãã®ã§ä»¥åããç¥ã£ãŠãæ¹æ³ã§ target.src = 'data:image/jpeg;base64,${Encoded64}'; ãªãã§ãããªãã®ãåºæ¥ãã®ïŒ å¥ä»¶ã§ãã¡ã€ã«å å·¥åŠçã®ãããã Perl ã§äœã£ãŠãã ã§ãä»ã©ããããåŠççšåºŠã§ Perl ç°å¢ã€ã³ã¹ããŒã«ããŠãããã®ã倧å€ã ããªããã¢ãžã¥ãŒã«ãšãé¢åã ãããš Perl ãæãçŽãã ããã§ node/typescript ã§æžããŠã¿ãããå²ãšãã¡ã€ã«ã®åæ±ãããã©ãããã£ã ãããªæã« Dart2 ãš Flutter ã®ãã¥ãŒã¹ãè³ã«ãã 調ã¹ãŠã¿ãã pub ãšããããã±ãŒãžç®¡çã®ä»çµã¿ã(-npm ã®åçºæããšæã£ããã©-)ã¡ãããšããŠãŠãWeb ãµãŒãåŽãããŒã«ã«ã§ã®åŠçãã¡ãããšæžãããã«èŠãã ã®ã§ããã¡ã€ã«å å·¥ã®ãããã Dart2 ã§æžããããããããã£ãããã£ã±ãæžããŠã³ã£ãããã â» ãã®ãããèªäœã¯ã¡ãã£ãšæ©å¯ãªãã®ãªã®ã§å
¬éã§ããªãã§ããããããªãã â» ãã£ãŠãããšã¯ãã¡ã€ã«èªãã§ RegExp ã® match ã replace ãŽãªãŽãªããããããã奎ã§ã ã§ããã®ãæè»œãã誰ãã«äŒãããããšæãã ç¹å®ãã£ã¬ã¯ããªã«ããç»åå
šéšã PNG ã®å§çž®ã¬ãã«æå€§ã§ã³ã³ããŒããçŽãããã©ãã ãå°ãããªããããŒã« ãäœã£ãŠã¿ãã®ã§ãã ããããå
šç¶å€ãããªãã£ããã§ããã¿ããªã¡ãããšæå€§ã¬ãã«ã§å§çž®ããŠããã® ãªããæãããªã£ãã®ã§ãç»åããšã« jpg ã®å§çž®ã¬ãã«ãå€ããŠç»åãæ²¢å±±çæããŠã¿ãããæå€ãšé¢çœãçµæã«ãªã£ãã®ã§ãã èªç¶ç»ã ã£ããã¯ãªãªã㣠50%ãããã«èœãšããŠãçµæ§éããåãããªããã ãªãŒããšãããã®å²ã«å®¹éãããŸãå€ãããªããã ãªãŒããšã ã§ããã¡ã€ã«çæèªäœã¯ç°¡åã«åºæ¥ããã§ããã©ã䞊ã¹ãŠæ¯ã¹ãã®ãé¢åã ã£ããã§ãã Finder ãšã Explorer ã§ãµã ãã€ã«è¡šç€ºã«ããŠèŠæ¯ã¹ãŠããšãããå¿
èŠããã£ãã®ã§ ã ã£ãããã®æ¯èŒããã Web ããŒãžãçæãã¡ããã°ãããããããšæããŸããŠãäœãå§ããŸãã ããã§ããŒãžçææ¹æ³ãèããã®ã§ãããçé¢ç®ã« HTML åãåºãããã¯ãã¬ãŒã ã¯ãŒã¯äœ¿ã£ãã»ããæ¥œã ããªãŒããšæããŸããŠã¡ãã£ãšèª¿ã¹ããããããããªãã§ãã AngularDart ã£ãŠã®ã 以å ionic ãæ±ã£ãŠãã ããšããã£ãŠ Angular ã¯åãã£ãŠããã®ã§ãæåã£ãæµæãšã°ããã«ããã£ãšè¡šç€ºãããŠã¿ãããããã£ãšåºæ¥ãŸãã ãããããã®ææç©ã§ã ….ã§ããããŸã§æ¥ãŠæ°ã¥ãããã§ã Dart2 ã® CLI ããŒã«äœãããããªãã£ãããã ãã¿ãŸããä»ã«ãããããèãããã§ããã©ã©ãããŠãé¢çœã CLI ããŒã«ã«ãªããªãã£ãã®ã§ããããããªãã â» Dart CLI ã§ Google Analytics ã®ããŒã¿åŒã£åŒµãåºããŠå å·¥ã㊠Slack ã«æããããšãããã°ããã£ãã®ã㪅. ããšãã Dart ã®åŒ·åãªãšãã㯠ãµãŒããµã€ããã¯ã©ã€ã¢ã³ããµã€ããåãæ°æã¡ã§æžãã ãšãããJavaScript ãš node ãæã£ãŠããç¹åŸŽããã®ãŸãŸåŒãç¶ãã ã¢ãã€ã«ã¢ããªãåãæ°æã¡ã§æžãã ãšããç¹åŸŽã Flutter ã§è¶³ããŠããæã§ã CI ããŒã«ãã Web ã¢ããªã«ããã£ãšè»¢åããŠãåºæ¥ã¡ãã ãšãã蟺ãããããã®ãæè»œããæããŠããã ãããšããããã³ã¬æžããç²æããã£ããšãããã®ã§ã å ããŠèšèªä»æ§ãšããŠåã®åãæ±ããé 匵ã£ãŠããã®ã§ãTypeScript ã§æããå®å¿æããDart ã§ãæããŠããŸã ã¯ãããã async/await ã stream ãªã©ããããŸããã倧äœã®ãã®ã¯ããæžãã¡ããã§ããã Dartãçµæ§æªæ¥ããããããããŸãã ãšããããã§ãmediba ã§ã¯èšèªããã¬ãŒã ã¯ãŒã¯ã«ãšããããã« äœãäœãã ã§èãããããšã³ãžãã¢ãåéããŠããŸã ç¹ã« ãã€ãã£ãã¢ããªã®ãšã³ãžã㢠ãã§ãã….
â»ããâãSystems Manager ã®ã¢ã€ã³ã³ãããã§ãã ãã¯ããã°ãã¡ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ãŒéšã®æ²Œæ²¢ã§ãã ã¿ãªãããAWS Systems Manager 䜿ã£ãŠãŸããïŒ Systems Manager ã䜿ãããšã§ã倧éã®ãµãŒããŒã®éçšä¿å®äœæ¥ãèªååãããããœãããŠã§ã¢ã€ã³ãã³ããªãåéããŠäžå
çã«ç¢ºèªãããããããšãã§ããã®ã§å€§å€äŸ¿å©ã§ãããã AWS Systems Manager â éçšã®ã€ã³ãµã€ããå
¥æããŠè¿
éã«å¯Ÿå¿ ãã㪠Systems Manager ã«å
æ¥ã ã»ãã·ã§ã³ãããŒãžã£ãŒ ãšããæ©èœãç»å ŽããŸããã ææ° â AWS Systems Manager ã»ãã·ã§ã³ãããŒãžã£ãŒã§ EC2 ã€ã³ã¹ã¿ã³ã¹ãžã®ã·ã§ã«ã¢ã¯ã»ã¹ãå®çŸ | Amazon Web Services ããã° SSHäžèп代ãããã!?AWS Systems Manager ã»ãã·ã§ã³ãããŒãžã£ãŒããªãªãŒã¹ãããŸãã! | DevelopersIO ã§ãããã®è¯ããšãã㯠ã³ã³ãœãŒã«ããã·ã§ã«ã¢ã¯ã»ã¹å¯èœ EC2 ã€ã³ã¹ã¿ã³ã¹ã«å¯Ÿã㊠SSH ã®ç©ŽããäžèŠ èª°ãã»ãã·ã§ã³éå§ããããå±¥æŽãæ®ã æäœãã°ã S3 ã CloudWatch Logs ã«åºåã§ãã ã ãšæã£ãŠããŸãã æ£çŽãIAM ãŠãŒã¶ãŒããã£ãããšå人ããšã«çºè¡ããŠããã°ãOS ã¢ã«ãŠã³ããå人ããšã«äœæããå¿
èŠãç¡ããªã£ãŠè¯ããªãŒãšæã£ãã®ã§ãããšã¯æäœãã°ã®åºåã匷å¶ã§ããã°ç£æ»ã«ã䜿ãããªãŒãšæãã調ã¹ãŠã¿ãŸããã å®çŸãããããš Systems Manager èªäœã¯å¿
èŠãªäººã¯èª°ã§ãå©çšã§ããããã«ããã ãããŒãžãããªã·ãŒ AmazonSSMFullAccess ãä»äžããã€ã¡ãŒãž ã»ãã·ã§ã³ãããŒãžã£ãŒã®èšå®ã¯ãç¹å®ã®äººä»¥å€ã¯æäœã§ããªãããã«ããã èšå®ã®å€æŽ â ãã°åºåèšå®ã®å€æŽ ãããå®çŸãã IAM ããªã·ãŒãç¡ããã調æ»ã»æ€èšŒããŠã¿ãŸããã 調æ»çµæ å
ã«ãè§ã«ããŸãã¯å
¬åŒããã¥ã¡ã³ãããã§ãã¯ããŸããã ãããŠãã£ãããšçããæžããŠãããŸãããããå
¬åŒããã¥ã¡ã³ãã ãã ããæ¬çš¿å·çæç¹(2018幎10æ)ã§ã¯æ¥æ¬èªããã¥ã¡ã³ãã«ã¯ãŸã ç¡ãããŒãžãªã®ã§ãæ¥æ¬èªããã¥ã¡ã³ãã§æ¢ããŠãããšåºãŠããªãã®ã§æ³šæãå¿
èŠã§ãã Grant or Deny a User Permissions to Update Session Manager Preferences - AWS Systems Manager User policy to prevent preferences from being updated ã«ã¯ããæžããŠãããŸãã { "Version": "2012-10-17", "Statement": [ { "Action": [ "ssm:CreateDocument", "ssm:UpdateDocument", "ssm:DeleteDocument" ], "Effect": "Deny", "Resource": [ "arn:aws:ssm:us-east-2:123456789012:document/SSM-SessionManagerRunShell" ] } ] } ãã® IAM ããªã·ãŒã§å®çŸã§ããããã§ãã ãã ããResource ã§ãªãŒãžã§ã³ us-east-2 ãš AWS ã¢ã«ãŠã³ã ID 123456789012 ãæå®ãããŠããã®ã§ãããã¯é¢åãªã®ã§ã¯ã€ã«ãã«ãŒãã«ããŠããŸããŸãããã ç¹å®ã®ãªãŒãžã§ã³ã ãã¯èš±å¯ãããããšããèŠä»¶ãç¡ãã®ã§ããã°ãã¯ã€ã«ãã«ãŒãã«ããŠãç¹ã«åé¡ã¯ç¡ããšæããŸãã ãããšãããªããŸãã { "Version": "2012-10-17", "Statement": [ { "Action": [ "ssm:CreateDocument", "ssm:UpdateDocument", "ssm:DeleteDocument" ], "Effect": "Deny", "Resource": [ "arn:aws:ssm:*:*:document/SSM-SessionManagerRunShell" ] } ] } ãããŒãžãããªã·ãŒ AmazonSSMFullAccess ãä»äžãããŠãŒã¶ãŒã«ããã®ããªã·ãŒã远å ã§ä»äžããã»ãã·ã§ã³ãããŒãžã£ãŒã®èšå®å€æŽã詊ããŠã¿ãŸããã 詊ããŠã¿ã ãŸãšã ãã°åºåèšå®ã倿Žã§ããªãããã«ããããšãã§ããŸããã åé ã§ãè¿°ã¹ããšãããã»ãã·ã§ã³ãããŒãžã£ãŒã«ã¯ä»¥äžã®å©ç¹ããããšèããŠããŸãã ã³ã³ãœãŒã«ããã·ã§ã«ã¢ã¯ã»ã¹å¯èœ EC2 ã€ã³ã¹ã¿ã³ã¹ã«å¯Ÿã㊠SSH ã®ç©ŽããäžèŠ èª°ãã»ãã·ã§ã³éå§ããããå±¥æŽãæ®ã æäœãã°ã S3 ã CloudWatch Logs ã«åºåã§ãã ä»åã®ãã°åºåèšå®ã®å€æŽãæåŠããããªã·ãŒãé©çšããäžã§ã»ãã·ã§ã³ãããŒãžã£ãŒãå°å
¥ããããšã§ãIAM ãŠãŒã¶ãŒãããã£ãã管çã§ããŠããã°ã å人 OS ã¢ã«ãŠã³ãäžèŠ ïŒ IAM ãŠãŒã¶ãŒãš OS ã¢ã«ãŠã³ãã®äºé管çãç¡ããªã å人 OS ã¢ã«ãŠã³ãäžèŠãªã®ã§ãç§å¯éµ/å
¬ééµãäžèŠ OS æäœãã°ãæ°žç¶åããä»çµã¿ãèªåã§çšæãéçšããªããŠè¯ã éçšè² è·è»œæžïŒ ã«ãªããšèããŠããŸãã®ã§ãä»åŸæŽ»çšããŠãããããšæããŸãïŒ è£è¶³ ãã¡ããæ¬æ Œçã«å°å
¥ã®éã¯ãS3 ã«åããããã°ãã¡ã€ã«ã CloudWatch Logs ã®ã¹ããªãŒã ãªã©ã®æäœãå¶éãã IAM ããªã·ãŒãå¿
èŠãªã®ã§ãå¿ããªãïŒ
ããã«ã¡ã¯ãããã³ããšã³ãžãã¢ã®è
éšã§ãã ä»åã¯ECãµã€ãã§ã®ã¬ã³ã¡ã³ããšã³ãžã³è©äŸ¡ã«ããã£ãŠãGoogle Optimize360ã®ããã³ãçµã¿èŸŒã¿ãGoogle Analyticsã®ãŠãŒã¶ãŒãªã¹ãå©çšã宿œããŸããã®ã§äžé£ã®æµããå
±æããããšæããŸãã ãã¹ãå®è£
ã§ãã£ããã¬ã³ã¡ã³ãè©äŸ¡ã®çè§£ã®äžå©ãšãªãã°å¹žãã§ãã â»Google Optimizeã®å°å
¥æ¹æ³ã«ã€ããŠã¯éå»ã®èšäºãã確èªãã ããã ã» Google Optimizeå°å
¥ãšA/Bãã¹ã宿œã®ãã€ã³ã | mediba Creator à Engineer Blog ã¬ã³ã¡ã³ããšã³ãžã³è©äŸ¡ã®ç®ç ãã©ã®ãããã®å¹æãèŠèŸŒãŸãããããA or B or n ã©ã®ã¢ãã«ãåªããŠãããããšãã£ãçåãæããã«ããããã«ã¬ã³ã¡ã³ããšã³ãžã³ã®ããã©ãŒãã³ã¹è©äŸ¡ã宿œããŸããã ã广ããšã¯è²»çšå¯Ÿå¹æã§ãã£ããäºæ¥ææšãžã®è²¢ç®åºŠåããšãªããŸãã ã€ã³ãã©ãä¿å®ãªã©äœãããã®åœ¢ã§ã¢ããªã±ãŒã·ã§ã³ãç¶æããããã®ã³ã¹ãã¯çºçããããã广ãšã³ã¹ãã®ãã©ã³ã¹ãåããŠãããè©äŸ¡ããããšã倧åã§ãã ãŸãã¬ã³ã¡ã³ããšã³ãžã³ã¯éçºããŠçµããã§ã¯ãªããããã©ãŒãã³ã¹ãèšæž¬ããŠè©äŸ¡ã»æ¹åãç¶ããããšãæãŸããã§ãã ãã ååŸæ¯èŒã®è©äŸ¡ã§ã¯ä»ã®èŠå ãé€å»ã§ããå æé¢ä¿ã®å€æãé£ãããããããæ£ç¢ºãªã¢ãã«è©äŸ¡ã®ããã«A/Bãã¹ã(çµ±èšçãªå ææšè«)ã®å¿
èŠããããšèããŠããŸãã ä»åã®ã¬ã³ã¡ã³ãå®è£
æ¹æ³ ã¬ã³ã¡ã³ãã®æç¡ã§ã®A/Bãã¹ããåæã«ã以äžã®ãããªåœ¢ã§å®è£
ãé²ããŸããã ã»API åæäŒç€Ÿæ§ã«æ§ç¯ããã ããã¬ã³ã¡ã³ãã®APIã䜿ããAJAXã«ãŠã¬ã³ã¡ã³ãçµæãJSONã§åãåã£ãŠããŸãã ã¢ã¯ã»ã¹ãã°ã»ã³ã³ããŒãžã§ã³ãã°ãå
ã«ãããåŠçã§ã¢ãœã·ãšãŒã·ã§ã³åæãè¡ãããŠãŒã¶ãŒã»ååããšã«æé©ãª(賌買ãããå¯èœæ§ã®é«ã)ååãææ¡ããŠããŸãã ã»DOM Google Optimizeã®ãšãã£ã¿ã§ç©ºã¿ã°ã®æ¿å
¥ãšJavaScriptã®å®è¡ãæå®ããŠããŸãã ãããŠå¥JavaScriptãã¡ã€ã«ã«ãŠ[AJAXå®è¡,HTMLæååæ§ç¯,åŒæ°ã®HTMLElementãžinnerHTML代å
¥ãã颿°]ãã°ããŒãã«ç©ºéã«çšæããŠããããGoogle OptimizeããåŒã³åºããããã«ããŠããŸãã ã»ä»»æã®ç®æãžç©ºã¿ã°ãæ¿å
¥ ã»ç©ºã¿ã°ã®äžã§JS(AJAX/innerHTML)ãå®è¡ Google OptimizeåŽã®ãšãã£ã¿ã䜿ã£ãŠDOMæžãæããJavaScript(AJAX)ã®å®è¡ãå¯èœã§ãããä»åã¯ã¿ãŒã²ãã£ã³ã°ã«ãŒã«èšå®ã»é¢æ°å®è¡ã»ãã¹ãã®è©äŸ¡ãGoogle Optimizeã«å§ããŠãããžãã¯ã»ãã¥ãŒã¯å¥JavaScriptãã¡ã€ã«ã«æãããŠããŸãã ã¡ã³ããã³ã¹æ§ãã³ãŒãã¬ãã¥ãŒã®èгç¹ã§ãå¯èœãªéãã³ãŒããšããŠGitã§ããŒãžã§ã³ç®¡çããæ¹ã奜ãŸãããšèããŠããŸãã â»ãã®æ¹æ³ãåããšãã¹ãæéäžã«ãDOM倿Žãå¯èœã«ãªããããäœããšäŸ¿å©ã§ãã â»ã¯ãªãã¯ã€ãã³ãã䜵ããŠåã£ãŠãããšåŸã®åæã§åœ¹ã«ç«ã¡ãŸãã A/Bãã¹ãã®å®æœæŠèŠ ä»åã¯è€æ°ç»é¢ã§ã®ã¬ã³ã¡ã³ãå®è£
ãæ³å®ããŠããŸãã ãã Google Optimizeã¯åºæ¬çã«1ç»é¢1ãã¹ããšãªããããã®ãŸãŸã§ã¯ããŒãžããšã«A/Bãã¹ãã®æœéžã宿œãããããããã§ãã¹ããã¿ãŒã³ãå€åããŠããŸããŸãã ã¬ã³ã¡ã³ãæç¡ãã¢ãã«ã®æ¯èŒã®ããã«ãã¬ã³ã¡ã³ãã®ããäžçã»ã¬ã³ã¡ã³ãã®ãªãäžçããã¢ãã«Aã®äžçã»ã¢ãã«Bã®äžçã ãäœãããããã§ããããã®ãŸãŸã§ã¯ããããã®äžçãæ··åšããŠæ¬æ¥æå³ããŠãããã¹ãã宿œã§ããŸããã ããã§ä»åã¯ãGoogle Optimize360(æå)ã®æ©èœãå©çšããŠGoogle AnalyticsåŽã®ãŠãŒã¶ãŒãªã¹ããã€ã³ããŒãããŠã¿ãŒã²ãã£ã³ã°èšå®ããããšã«ããŸããã ã¡ãã£ãšè€éã§ããããã¹ãåäœã®å
šäœã®æµãã¯ä»¥äžã®éãã§ãã èµ·ç¹ããŒãžã«ãŠãŠãŒã¶ãŒããšã«ãã¹ããã¿ãŒã³ãæ±ºå® Google AnalyticsåŽã«ã·ã¹ãã ãã£ã¡ã³ã·ã§ã³ãã»ãã(ID/ãã¿ãŒã³) ãŠãŒã¶ãŒãªã¹ããåçã«çæ(æå·®æã) ä»ããŒãžã§ããŠãŒã¶ãŒãªã¹ãã®ã¿ãŒã²ããã«å¯ŸããŠãã¹ããçç« ãŠãŒã¶ãŒãªã¹ãã¯ãªã¿ãŒã²ãã£ã³ã°åãã®æ©èœãšãªããŸãããGoogle Optimize360ã§ã¯A/Bãã¹ãã®ã¿ãŒã²ãã£ã³ã°é
ä¿¡ã®æ¡ä»¶ãšããŠGoogle Analyticsã®ãŠãŒã¶ãŒãªã¹ããã€ã³ããŒãããããšãã§ããŸãã Google Optimize,Google Analyticsã®èšå® 1. ãã¹ãã®èµ·ç¹ãšãªãããŒãžã®ãã¹ãIDãååŸ ãŸãã¯ãã¹ããã¿ãŒã³ã®æœéžã宿œãããèµ·ç¹ããŒãžã決ããGoogle Optimizeã§ãã¹ããäœæããŸãã äžæžãã®ç¶æ
ã§ãã¹ãIDãå²ãæ¯ãããããããã®ãã¹ãIDãä»ã®ããŒãžã§ã®ã¿ãŒã²ãã£ã³ã°é
ä¿¡ã«å©çšããŸãã 2. ãã¹ãIDãå
ã«ã»ã°ã¡ã³ããäœæã»ãŠãŒã¶ãŒãªã¹ããå
¬é èµ·ç¹ããŒãžã§å®æœãããã¹ãã®ãã¹ãIDãšãã¹ãããªãšãŒã·ã§ã³ãå
ã«ãGoogle AnalyticsåŽã§ãŠãŒã¶ãŒãªã¹ããäœæããŠå
¬éããŸãã ãŸãã¯ã»ã°ã¡ã³ããã«ããŒã«ãŠGoogle OptimizeåŽã§çºè¡ããããã¹ãIDãå©çšããŠä»»æã®ãã¹ããã¿ãŒã³ãæå®ããŸãã ã»[ãã¹ãID]ãã£ã¡ã³ã·ã§ã³ãš[ãã¿ãŒã³]ãã£ã¡ã³ã·ã§ã³ã䜿ãå Žå ã»[ãã¿ãŒã³ãå«ããã¹ãID]ãã£ã¡ã³ã·ã§ã³ã䜿ãå Žå ãã¿ãŒã³ãã£ã¡ã³ã·ã§ã³ã¯ããªãªãžãã«ã§ããã°[0]ãããªãšãŒã·ã§ã³ã®1ã€ãã§ããã°[1]ã2ã€ãã§ããã°[2]ãšãã£ã圢ã§é£çªã§æå®ããäºãã§ããŸãã ä»åã¯A/Bãã¹ãã®ããªãšãŒã·ã§ã³ã®1ã€ããå€å®ããããã[1]ãšããŠããŸãã ããã§[A/Bãã¹ãã®Bãã¿ãŒã³ã衚瀺ããã人(ã¬ã³ã¡ã³ãã衚瀺ããã人)]ãšããã»ã°ã¡ã³ããäœæã§ããŸããã æ¬¡ã«ãã»ã°ã¡ã³ããå
ã«ãŠãŒã¶ãŒãªã¹ããäœæããŸãã ã»äžèЧç»é¢ã«ãŠä»»æã®ã»ã°ã¡ã³ãã§[ãŠãŒã¶ãŒãªã¹ããäœæ]ãéžæ ã»ãŠãŒã¶ãŒãªã¹ãåãå
¥å ã»ãŠãŒã¶ãŒãªã¹ãã®å®å
ã«Googleãªããã£ãã€ãº360ãéžæ ã»å
¬éå
ã«Googleãªããã£ãã€ãº360ãå«ãŸããŠããããšã確èªããŠå
¬é 以äžã§ãŠãŒã¶ãŒãªã¹ãã®èšå®ã¯å®äºã§ãã ä»åã®ä»çµã¿ã§ã¯å
šããŒãžã®ãã¹ãã皌åãããããã«ãŠãŒã¶ãŒãªã¹ããæŽæ°ãããå¿
èŠããããŸãã®ã§ãæ°æéã®éå§æå·®ã蚱容ããå¿
èŠããããŸãã ãªãä»åã¯æçã§4æéçšåºŠã§ãŠãŒã¶ãŒãªã¹ããåæ ãããŸããã 3. ç»é¢ããšã«ãã¹ããäœæ ã¬ã³ã¡ã³ããæ²åºããç»é¢ããšã«ãã¹ããäœæããŸãã ã»ã¿ãŒã²ãã£ã³ã°æ¡ä»¶ã«ä»»æã®ãŠãŒã¶ãŒãªã¹ããæå® ã»ãã¹ãç®æšã¯åçãšãã©ã³ã¶ã¯ã·ã§ã³æ°ãæå® äžé£ã®èšå®ãå®äºããã®ã§ããã¹ãŠã®ç»é¢ã§ãã¹ããéå§ã§ããç¶æ
ãšãªããŸããã A/Bãã¹ããå§ããåã« A/Bãã¹ãã¯äžèœã§ã¯ãªãã宿œã«ãããŠã¯ãµã³ãã«ã®[åã]ãåžžã«æèããããšã倧äºã§ããåçŽç¡äœçº(ã©ã³ãã )ã«å²ãæ¯ã£ãŠãå¿
ãåããçºçããŸããããµã³ãã«ãå°ãªãã»ã©åãããããªããŸãã ç¹ã« ãªããŒã¿ãŒã®æ¯çãé«ããµã€ãã§ã¯ãåã£ãå Žåã«ã¯ãã®ãã¹ãã®äžã§ã¯åãç¶ãã ããšã«ãªããŸãã ãã®ããA/Bãã¹ãã®å®æœã«ããã£ãŠã¯[äºåã«A/Aãã¹ãã宿œããŠåãã®èµ·ããããããææ¡]ããã[A/Bãã¹ãæéã ãã§ãªãã宿œåæéãŸã§å«ããååŸæ¯èŒã§åããªãšãŒã·ã§ã³ã®è©äŸ¡ããããš]ã倧äºã§ãã ã»çŽåž°çã§ã®A/Aãã¹ãã®äŸãåŸã
ã«åããæžå°ããŠãããŸãã ã¬ã³ã¡ã³ããšã³ãžã³ã®è©äŸ¡çµæ ããŠã1ã¶æã»ã©ã¬ã³ã¡ã³ãã®æç¡ã§A/Bãã¹ãããçµæã¯ä»¥äžã®ããã«ãªããŸããã ã»Google Optimize ã¬ã³ã¡ã³ãæãã®ãã¿ãŒã³ã®å£²ãäžãã[95%ã®ç¢ºçã§4%ã16%ãäžå€®å€ã§10%ã®åäž]ãšããããªããªãè¯ãçµæãšãªããŸããã 95%ä¿¡é Œåºéã«ãã€ãã¹ã®å€ãå«ãã§ããªããããä»åã¯[ã¬ã³ã¡ã³ãã«ãã£ãŠåçã®åäžãæåŸ
ã§ãã]ãšãã倿ãããŸããã ã»Google Analytics ã¬ã³ã¡ã³ãæãã»ç¡ãã®ã»ã°ã¡ã³ããäœæããeã³ããŒã¹ã¬ããŒãã«ãŠéããŠæ¯èŒããŠã¿ãŸããããã«ãŒã®ç·ãã¬ã³ã¡ã³ããªãã®ã»ã°ã¡ã³ãã§ããªã¬ã³ãžã®ç·ãã¬ã³ã¡ã³ãããã®ã»ã°ã¡ã³ãã§ãã â»ãŠãŒã¶ãŒã»ã°ã¡ã³ãã§ããã°ãéå»90æ¥ãŸã§é¡ãããšãã§ããŸãã ã»A/Bãã¹ãéå§åã倧ããªåçã®å·®ãç¡ãããã ã»A/Bãã¹ãéå§åŸãäœåºŠããªããããŠããæ§åã確èªã§ããŸãã ä»åã®A/Bãã¹ããçšããã¬ããŒãã»è©äŸ¡ã«ãã£ãŠãå
šãŠãŒã¶ãŒã«éæŸããå Žåã®åçã®ã€ã³ãã¯ããæšæž¬ããããšãã§ããã¬ã³ã¡ã³ãã®è²»çšå¯Ÿå¹æã®è©Šç®ãå¯èœã«ãªããŸããã ãããã« çµ±èšã»æ©æ¢°åŠç¿ãçšãããããã¯ãã¯ãªãªãŒã¹ãããŸã§å¹æãåãããŸãããããªãªãŒã¹ãããã®ãäºæ¥ææšã«ç¹ããä¿èšŒã¯ãããŸããããããŠãªãªãŒã¹ããŠã广ã®å æé¢ä¿ã¯èŠãã¥ããã§ãã ãã®ãããé©åãªææšãå
ã«ãªãªãŒã¹åŸã«ç¶ç¶ããã¢ãã«è©äŸ¡ãå¿
èŠã«ãªããŸããããã®ãã§ãŒãºã§å ææšè«ãšããŠã®A/Bãã¹ããæå¹æŽ»çšã§ãããšå®æã§ããŸããã ãŸãè²»çšå¯Ÿå¹æã®æšå®ã ãã§ãªããæè³å¯Ÿå¹æããšããå¹
ãæãããèãæ¹ã倧äºã ãšæããŸãã ã²ãšã€ã®æ©èœã¬ãã«ã§ã·ãã¢ã«è²»çšå¯Ÿå¹æãèããŠããŸããšããªããªãææãåºãã®ãé£ãããšæããŠããŸããç¹ã«ECãµã€ãã§ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã»å£²ãäžããåäžãããã®ã¯çžåœã«é£ããã§ãã ãã®ããäŸãã°UXãšããæèã§[ãšã³ã²ãŒãžã¡ã³ãææšã®åäž]ãå€æåºæºã«å«ããããåäœã®ãããã¯ãã§ã¯ãªã[åæã»ããŒã¿æŽ»çšã®ãããžã§ã¯ã]ãšããèŠç¹ã§ãåºãæããå¿
èŠããããšãæããŸããã åè A/Bãã¹ãã®çµæã¯å°æ¥ã®ææšãä¿èšŒãããã®ã§ã¯ãããŸããã è€æ°ç»é¢ã§åäžãã¿ãŒã³ãåæ ãããããã«ãŠãŒã¶ãŒãªã¹ããå©çšããŠããŸãããä»åã®æ§æã¯ã¡ãã£ãšåé·ã§ãããåç»é¢ã«HTMLå·®ã蟌ã¿çšã®å
±éã®DOMãçšæããããCookieã«ãã¹ããã¿ãŒã³ãä¿æãããªã©ããŠããŠãŒã¶ãŒãªã¹ãã䜿ãããšãè€æ°ç»é¢ã§ãã¿ãŒã³ãåºå®ããäºã¯å¯èœã§ãã Google Analytics360ã¯Google Optimize360ã®ã¿æ¥ç¶ãå¯èœã§ããã€ãŸãæåçAnalyticsãšç¡åçOptimizeãæ¥ç¶ããããšã¯ã§ããŸããã åèæç® ããŒã¿åæã®å å æé¢ä¿ã«è¿«ãæèæ³ (å
æç€Ÿæ°æž) ã»ã°ã¡ã³ãã«ã€ã㊠- ã¢ããªãã£ã¯ã¹ ãã«ã ã»ã°ã¡ã³ããããŠãŒã¶ãŒãªã¹ããäœæãã - ã¢ããªãã£ã¯ã¹ ãã«ã ãŠãŒã¶ãŒãªã¹ããäœæãç·šéãã - ã¢ããªãã£ã¯ã¹ ãã«ã
ããã³ããšã³ãéçºéšã®é³¥å±
ã§ãã ãµãŒãã¹ã®KPIãæœçã®å¹ææž¬å®ãªã©ãç®çã«AnalyticsããŒã«ã¯ãã䜿ãããŸãããWebãšã¢ãã€ã«ã¢ããªãå
±åããŠãããµãŒãã¹ã§ã¯ãWebã«Google Analytics(GA)ãã¢ãã€ã«ã¢ããªã«Firebase Analytics(FA)ãšã2ã€ã®AnalyticsããŒã«ã䜿ãããŠããã±ãŒã¹ããããããŸãã GAãšFAã®æ©èœã®å·®ç°ãããåæã®éã«ãGAã®æ©èœãFAã§äœ¿ããªããäž»ã«ãã£ã«ã¿ãã»ã°ã¡ã³ããŒã·ã§ã³ã®æ©èœã匱ããåãæ¡ä»¶ã§ãã£ã«ã¿ãã§ããªããšãã£ã課é¡ããããŸããã ãã®èª²é¡ãããGoogle Tag Manager(以äžGTM)ãå©çšããFAã®ããŒã¿ãGAã«è»¢éããŠGAäžã§ããŒã¿ãäžå
çã«æ±ãæ¹æ³ã詊ããŠã¿ãã®ã§ç޹ä»ããŸãã GAãšFAã®æ©èœã®å·®ç°ãããããŒã±ãã£ã³ã°æ
åœã®èŠç¹ã§ã¯ãGAã®æ©èœãFAã§äœ¿ããªããäž»ã«ãã£ã«ã¿ãã»ã°ã¡ã³ããŒã·ã§ã³ã®æ©èœã匱ããåãææšã§åæãé£ãããšãã£ã課é¡ãããããã§ãã ãã®èª²é¡ãããGTMãå©çšããFAã®ããŒã¿ãGAã«è»¢éããŠGAäžã§ããŒã¿ãäžå
çã«æ±ãæ¹æ³ã詊ããŠã¿ãã®ã§ç޹ä»ããŸãã ãã®æçš¿ã§ã¯ãGTM ãå°å
¥ããŠãã¢ããªããFAã®ã€ãã³ããçºè¡ããGAã®ã³ã³ãœãŒã«ã§çºè¡ãããã€ãã³ãã確èªãããšãããŸã§ãæ±ããŸãã Google Tag Manager FAã§çºè¡ãããã€ãã³ããããªã¬ãŒããŠGAã«ã¿ã°ä»ãããããã«å©çšããŸãã 1.Google Tag Managerã®ã³ã³ããã®äœæ ã¯ããã«GTMã®ã³ã³ãœãŒã«ããã³ã³ãããäœæããŸãã GTMã«ã¯ããªã¬ãŒã»å€æ°ã»ã¿ã°ã®èŠçŽ ãããããã®ä»ã®é¢é£èšå®ãšãŸãšãããã®ãã³ã³ãããšåŒã³ãŸãã ããªã¬ãŒ:ãFirebaseã§çºè¡ãããã€ãã³ãã®ã€ãã³ãåã"tapButton"ã ã£ãããã®ããã«ãã¿ã°ä»ãããæ¡ä»¶ã衚ããŸãã 倿°: ã€ãã³ãã«å«ãŸããæ
å ±ãªã©ã®å€ã衚ããŸãã ã¿ã°: ããªã¬ãŒãæ¡ä»¶ã«GAã«å€æ°ãå«ããã€ãã³ããéããšãã£ãã¿ã°ä»ãã®æ¡ä»¶ãå
容ããŸãšãããã®ã§ãã åŸè¿°ããŸãããFAããã¯äžèšã®ãããªã€ãã³ããçºè¡ããã®ã§ãããã«åãããŠã¿ã°ãäœãæé ãèšèŒããŸãã //ã€ãã³ãå: tapButton //ãã©ã¡ãŒã¿: ["button_name": "buttonA"] /* iOS */ Analytics.logEvent("tapButton", parameters: ["button_name": "buttonA"]) /* Android */ Bundle params = new Bundle(); params.putString("button_name", buttonA); mFirebaseAnalytics.logEvent("tapButton", params); 2.ããªã¬ãŒã®äœæ ã¯ãŒã¯ã¹ããŒã¹ -> ããªã¬ãŒ -> æ°èŠ ã€ãã³ãåã âtapButton"ãšçããå Žåã«çºç«ãããããªã¬ãŒãäœæããŸã ããªã¬ãŒã®çš®é¡: ã«ã¹ã¿ã ãã®ããªã¬ãŒã®çºçå Žæ: Event Name, çãã, tapButton 3.倿°ã®äœæ åæ§ã«å€æ°ã2ã€æ°èŠäœæããŸãã ãã¿ã³ã®ååãæ±ã倿°ãäœæ ã¯ãŒã¯ã¹ããŒã¹ -> 倿° -> æ°èŠ ã€ãã³ãã®button_nameã®å€(buttonAãªã©)ãæ±ãããã®å€æ°ãäœæããŸãã 倿°å: ButtonName 倿°ã®çš®é¡: ã€ãã³ããã©ã¡ãŒã¿ EventType: Custom Parameter ã€ãã³ããã©ã¡ãŒã¿ãŒããŒ: button_name GAã®ãã©ããã³ã°IDã®å€æ°(UA-xxx-x)ãäœæ ã¯ãŒã¯ã¹ããŒã¹ -> 倿° -> æ°èŠ GAã®ãã©ããã³ã°IDãæ±ãããã®å€æ°ãäœæããŸãã 倿°å: UA-xxx-x 倿°ã®çš®é¡: Googleã¢ããªãã£ã¯ã¹èšå® ãã©ããã³ã°ID: UA-xxx-x 4.ã¿ã°ã®äœæ ã¯ãŒã¯ã¹ããŒã¹ -> ã¿ã° -> æ°èŠ å
çšäœæããããªã¬ãŒãšå€æ°ã䜿çšããŠã¿ã°ãäœæããŸãã ã¿ã°å: TapButtonTag ã¿ã°ã¿ã€ã: Google ã¢ããªãã£ã¯ã¹ - ãŠãããŒãµã« ã¢ããªãã£ã¯ã¹ ãã©ããã³ã°ã¿ã€ã: ã€ãã³ã ã«ããŽãª: Button ã¢ã¯ã·ã§ã³: Tap ã©ãã«: {{ButtonName}} å€: ä»»æ Googleã¢ããªãã£ã¯ã¹èšå® {{UA-xxx-x}} ããªã¬ãŒ: TapButtonTrigger ãã©ããã³ã°ã¿ã€ãããã©ããã³ã°ãã©ã¡ãŒã¿ã¯GAåŽã§ã©ã®ããã«æ±ããããã®èšå®ã«ãªãã®ã§å¿
èŠã«å¿ããŠå€æŽããŸãã äŸãã°ããã©ããã³ã°ã¿ã€ããã¹ã¯ãªãŒã³ãã¥ãŒãšãããšãFAã®ã€ãã³ãã GAã§ã¯ã¹ã¯ãªãŒã³ãã¥ãŒãšããŠæ±ãããŸãã 5.ã³ã³ãããå
¬é ã³ã³ãœãŒã«ããç·šéããããŒãžã§ã³ã®ã³ã³ãããå
¬éããã³ã³ãããã¡ã€ã«ãããŠã³ããŒãããŸãã ã¢ããªãžã®å°å
¥ 1.Google Tag Manager SDKã®ã€ã³ã¹ããŒã« ã¢ããªã«GTM SDKãã€ã³ã¹ããŒã«ãã ããŠã³ããŒãããã³ã³ãããã¡ã€ã«ãXcodeäžãã远å ããŸãã äžèšã®å
¬åŒã®ããã¥ã¡ã³ãã«åŸãã°åé¡ãªãã€ã³ã¹ããŒã«ã§ããŸãã iOS https://developers.google.com/tag-manager/ios/v5/ Android https://developers.google.com/tag-manager/android/v5/ 2.Firebase SDKã®ã€ã³ã¹ããŒã« Firebase SDKãã€ã³ã¹ããŒã«ããŸãã æ¢ã«Firebaseãå°å
¥ããŠããã¢ããªã±ãŒã·ã§ã³ã¯ãã®éšåã¯äžèŠã§ãã iOS https://firebase.google.com/docs/analytics/ios/start?hl=ja Android https://firebase.google.com/docs/analytics/android/start/?hl=ja 3.Firebaseã«ã¹ã¿ã ã€ãã³ãã®äœæ ã«ã¹ã¿ã ã€ãã³ããäœæããŸãã ä»åã¯2ã€ãã¿ã³ãäœãããã¿ã³ã¿ããã§äžèšã®ã€ãã³ããçºè¡ããŸããã€ãã³ãå㯠tapButton ãšã㊠button_name ãã£ãŒã«ãã®å€ã« buttonA , buttonB ãšããŠãã¿ã³åã«éããã€ããŠããŸãã /* iOS */ //ãã¿ã³A Analytics.logEvent("tapButton", parameters: ["button_name": "buttonA"]) //ãã¿ã³B Analytics.logEvent("tapButton", parameters: ["button_name": "buttonB"]) /* Android */ //ãã¿ã³A Bundle params = new Bundle(); params.putString("button_name", buttonA); mFirebaseAnalytics.logEvent("tapButton", params); //ãã¿ã³B Bundle params = new Bundle(); params.putString("button_name", buttonB); mFirebaseAnalytics.logEvent("tapButton", params); 4.Firebaseãããã°ã¢ãŒã FAã®ã€ãã³ãã峿ã«çºè¡ãããããäžèšã®èšå®ã§ãããã°ã¢ãŒãã«ããŠãããŸãã ãããã°ã¢ãŒãã§ãªãå Žåãã€ãã³ãããããåŠçã§çºè¡ããããã確èªã«å°ãæéãããããŸãã https://firebase.google.com/docs/analytics/debugview?hl=ja çºè¡ãããã€ãã³ãã®ç¢ºèª ã¢ããªãèµ·åããŠFAã€ãã³ããçºè¡ãããŸãã ãããããã¿ã³ãæŒããå Žåã®ãã°ã§ãã Firebase Analytics tapbuttonã€ãã³ãã®button_nameãã©ã¡ãŒã¿ãããããbuttonA buttonBãšãªã£ãŠããããšã確èªã§ããŸãã Google Analytics FAã§çºè¡ããã€ãã³ããGAã§ç¢ºèªã§ããŸããã button_name ãã©ã¡ãŒã¿ãæ£ãã衚瀺ãããŠããŸãã åè å°å
¥ã®å·¥æ° GTMãå°å
¥ãããå Žåãäžèšã®2ã€ã®å·¥æ°ã远å ã§ãããããšãèæ
®ããå¿
èŠããããŸãã ã¢ããªãžã®SDKå°å
¥ æ¢ã«FAãå°å
¥ãããŠããå ŽåãGTM SDKã®ã€ã³ã¹ããŒã«ã®ã¿ã§ãã 倿Žãå°ãªãã®ã§ããªã¹ã¯ãšå·¥æ°ã¯äœãåãŸããŸãã GTMã®ã³ã³ããã®äœæãšã¢ããããŒã GTM ã³ã³ãããæŽæ°ããããã®éçšã³ã¹ãã远å ã§çºçããŸãã äŸãã°ãæ°ããã€ãã³ãã远å ããå ŽåãGTMã³ã³ããã«ããã®ã€ãã³ãã®ã¿ã°ã远å ããå¿
èŠããããŸãã ã€ãã³ãã®çš®é¡ã«æ¯äŸããŠå·¥æ°ãå¢ãããšèããããŸãã Tips ã³ã³ããã®ããŒãžã§ã³ãäžããå Žåãã³ã³ãããã¡ã€ã«ãå·®ããããŠäžåºŠã¢ããªãåé€ããŠããå®è¡ãããšå³æã«æ°ããããŒãžã§ã³ã®GTMã³ã³ããã䜿çšã§ããŸãã GAã®ã¿ã°ã®ãå€ããã©ã¡ãŒã¿ã¯æ°å€ã®ãããæ°å€ä»¥å€ãèšå®ãããšã€ãã³ãã«è¡šç€ºãããŸããã ãŸãšã GTMãå°å
¥ããããšã§ãFAã§èšæž¬ããã€ãã³ããGAäžã§æ±ããããã«ãªããŸããã FAã¯GAã«æ¯ã¹ããšãŸã æ©èœãå°ãªãã衚瀺ããã圢åŒã§ããŒã¿ã衚瀺ã§ããªãããšãããããããã®ãããªå Žåã«æçšãªæ¹æ³ãšèããŠããŸãã ä»åã¯ããã¿ã³ã¿ããã®ç°¡åãªã€ãã³ãã§ç޹ä»ããŸãããã ã¿ã°ã®è©³çްèšå®ã®ãã©ã¡ãŒã¿ã倿Žããããšã§ã FAã®èªåçºè¡ã€ãã³ãããã€ãã³ãã«å«ãŸãããŠãŒã¶ããããã£ãæ±ããªã©ãæè»ãªããŒã¿é£æºãã§ããŸãã
ããã«ã¡ã¯ãã·ã¹ãã æ¬éšã®è
éšã§ãã BIããŒã«ã®è©äŸ¡ã«ããã£ãŠãWebpageTestãšGoogleAnalyticsã®ããããã®ããŒã¿ãå©çšããŠTableauã§å¯èŠåã®ã€ã¡ãŒãžãæŽãã§ã¿ãŸããã®ã§ã äžé£ã®æµããåå¿é²ãšããŠæ®ããŠãããŸãã ãã®1 WebPagetestã®ããŒã¿ãå¯èŠåãã WebPagetestã§å®ç¹èŠ³æž¬ããŠããããŒã¿ã«ã€ããŠãTableauã䜿ã£ãŠæç³»åããŒã¿ããã³æ£åžå³ãšããŠå¯èŠåããŠãããŸãã WebPagetestãšGoogleSpreadSheetã®é£æºã«ã€ããŠã¯ä»¥åã®èšäºãã確èªãã ããã ã»DataStudioãšGASã§WebPagetestã®èšæž¬çµæãã°ã©ãåãã 1. GoogleSpreadSheetãéžæ ãŸãããŒã¿ãœãŒã¹ãšããŠGoogleSpreadSheetãéžæããŸãã GoogleåŽã®èªå¯ç»é¢ã§GoogleDriveãžã®ã¢ã¯ã»ã¹ãèš±å¯ããä»»æã®ã·ãŒããéžæããŸãã 以äžã®ãããªåœ¢ã§ã€ã³ããŒãã§ããŸããã æ¥ä»ãæååãšããŠèªèãããŠããã®ã§ãæç³»åããŒã¿ãšããŠæ±ããããã«æ¥ä»åã«å€æããŠãããŸãã 2. ãã£ããäžå°ãäœæ æ¬¡ã«æ°èŠã®ã·ãŒããäœæããŠã°ã©ããå¯èŠåãé²ããŠãããŸãã SpreadSheetã®ã°ã©ãæ©èœãDataStudioãšæ¯èŒãããšTableauã¯è»œå¿«ã§äœ¿ãããããçŽæçã«æäœãããŠãèŠãç®ãæŽããŸãã ãŸããããŒã¿ãœãŒã¹ãããŒã¿ãŠã§ã¢ããŠã¹ãæ°çŸäžè¡ã®CSVãã¡ã€ã«ãšãã£ã巚倧ãªå Žåã§ããäºãæœåºããŠããããšã§é«éãªã¯ãšãªãšã³ãžã³(Hyper)ãå©çšããŠéåžžã«æ©ãåŠçããããšãã§ããŸãã 3. 埮調æŽããŠå®æ å¿
èŠã«å¿ããŠNULLã®é€å»ãç®çãã®æå€§å€ã®èª¿æŽçãããã°å®æã§ãã TimeToFirstByte,DOMInteractive,FirstPaint,onLoad,SpeedIndexã®ææšããæç³»åãšããŠç¶ºéºã«å¯èŠåã§ããŸããã TableauOnline/Serverã§ããã°ããŒã¿äž»å°ã¢ã©ãŒãã䜿ã£ãŠãç¹å®ã®éŸå€ãè¶
ãããã¢ã©ãŒãã¡ãŒã«ãéä¿¡ããšãã£ãèšå®ãã§ããã¯ãã§ãã FirstPaintã説æå€æ°ãSpeedIndexãç®ç倿°ãšããŠæ£åžå³ãäœæããŠã¿ãŸããã ããŒã«ãã³ãã«ã¯R2ä¹å€ãšpå€ã衚瀺ãããŸãã®ã§ãååž°åŒã®åœãŠã¯ãŸãã®è¯ããææ¡ããããšãã§ããŸãã ãã®2 GoogleAnalyticsã®ããŒã¿ãå°å³ã«éãã GoogleAnalyticsã®éåºŠææšã䜿ã£ãŠå°åããšã®Webããã©ãŒãã³ã¹ãTableauã§ãããã³ã°ããŠãããŸãã 1. GoogleAnalyticsãéžæ ããŒã¿ãœãŒã¹ãšããŠGoogleAnalyticsãéžæããŸãã GoogleåŽã®èªå¯ç»é¢ã§GoogleAnalyticsãžã®ã¢ã¯ã»ã¹ãèš±å¯ããä»»æã®ã·ãŒããéžæããŸãã ä»åã¯ä»¥äžã®ãããªåœ¢ã§GoogleAnalyticsã®CoreReportingAPIããããŒã¿ãååŸããŸããã 2. å°ååãæ£èŠåããŠå°çããŒã¿ãž GoogleAnalyticsã®å°åæ
å ±ã«ã¯[Kanagawa Prefecture]ãšãã£ã圢ã§[Prefecture]ã®æååãå
¥ã£ãŠããããšãããã®ã§ãTableauã®èšç®ãã£ãŒã«ãã䜿ã£ãŠæ£èŠåããŠãããŸãã if CONTAINS([å°å],"Prefecture") = FALSE then [å°å] ELSE REGEXP_REPLACE([å°å],"Prefecture","") END â»å°åãã£ã¡ã³ã·ã§ã³ã®"Prefecture"ã®æååãåãé€ããŠããŸãã ãããŠããã®ãã£ã¡ã³ã·ã§ã³ã¯éœéåºçã®å°çããŒã¿ãšããŠèªèããããã®ã§ã[å°çç圹å²]ãã[éœéåºç/å·]ãéžãã§ãããŸãã 3. ããŒã¿ãå°å³ãšéãã ããã»ã©èšç®ãã£ãŒã«ãã§äœæãããã£ã¡ã³ã·ã§ã³ãšä»»æã®ã¡ãžã£ãŒãéžæããŠèšå·ããããäœæããŸãã ä»åã¯ãã£ã¡ã³ã·ã§ã³ãšããŠããŒãžèªã¿èŸŒã¿æé(onLoad)ãéžæããŸããã 4. é
è²ãå€åããã å
šãŠåãè²ã§å°åããšã®ææšã®å·®ãåããã¥ããã®ã§ãã¡ãžã£ãŒã®å€ãå©çšããŠè²ãå€åãããŸãã 5. ææšãäžå€®å€ã«å€æŽãã èšå·ã®è²ã倧ãããææšã[åèšå€]ãšãªã£ãŠããããããããã[äžå€®å€]ã«å€æŽããŸãã â»åèšå€ã®å ŽåãåçŽã«ã¬ã³ãŒãæ°ã®å€ãéœéåºçã倧ãããªã£ãŠããŸããŸãã 6. è²ã倿Žãã éã®ã°ã©ããŒã·ã§ã³ã§ã¯ææšã®è¯ãæªããããããªããããèµ€ããç·ã®ååã«å€æŽãããã«å転ããããŠãããŸãã onLoadã®ææšãè³ãããªãæ²çž/æ±åãèµ€ãäžžãšãªããããç®ç«ã€ããã«ãªããŸããã ãšããããšã§ããŸãã¯1ã€ã®ç®ã®ã·ãŒãã®å®æã§ãã 8. ããã·ã¥ããŒãã®äœæ ããã«åãæµãã§åèš4ã€ã®ã·ãŒããäœæãã1ã€ã®ããã·ã¥ããŒãã«ãŸãšããŠäžèŠ§è¡šç€ºãããŸããã æ®ã3ã€ã®ã·ãŒãã¯ãããããDOMInteractive/onLoad/DOMContentLoaded/ãµãŒãå¿çãšããŠããŸãã æ²çžçã¯ã©ã®å€ãæªããã§ãåéžãæ±åã®äžéšã®å°åãè³ãããããŸããã çŽæ¥çãªåå ã¯åãããŸããããåWebãµãŒããšã®ç©ççãªè·é¢ãšããã«ããã¬ã€ãã³ã·åœ±é¿ã«ãã£ãŠå°ççã«äžå©ã§ã¯ããããã§ãã GoogleAnalyticsããååŸã§ããææšã¯ãæ¥æ¬äžããã¢ã¯ã»ã¹ããŠããå®éã®ãŠãŒã¶ãŒã®å€ã§ãã®ã§ãå°å³ãšææšãéããããšã§å°åããšã®ããã©ãŒãã³ã¹ãå¯èŠåããããšãã§ããŸããã åè ã¬ã€ãã³ã·ä»¥å€ã«ã[å°åããšã®æºåž¯ç«¯æ«ã®å©çšç¶æ³ã®éã]ã ã£ãã[WiFiæ®åç¶æ³]ãšãã£ãä»ã®èŠå ããããšæããŸãã ã¢ãã€ã«ãããã¯ãŒã¯ã§ã®IPã¢ãã¬ã¹å°åå€å®ã®ç²ŸåºŠã¯é«ããããŸãããéä¿¡äºæ¥è
ã«ãã£ãŠã¯æ±äº¬ã«ããŠã倧éªå€å®ãããã±ãŒã¹ããããŸãã GoogleAnalyticsã®CoreReportingAPIã¯ãã»ã°ã¡ã³ãã®æãåããæ¹ã«ãã£ãŠã¯ç²ŸåºŠãèœã¡ãããšããããŸãã ããŸã Tableauã¯Mapboxãšã®é£æºãå¯èœã§ãã Mapboxã®APIããŒãTableauåŽã§å
¥åããããšã§ãä»»æã®ãããã䜿ãããšãã§ããŸãã ãããã« WebPagetestãGoogleAnalyticsã®ããŒã¿ã䜿ã£ãŠãTableauã®åºæ¬çãªæäœæãæŽãããšãã§ããŸããã å¯èŠåãšããæå³ã§ã¯ãä»BIããŒã«ã§ãã£ãããGoogleAnalyticsãGoogleSpreadSheetãExcelãDataStudioãRe:DashãGrafanaãRãPythonãªã©ãéžæè¢ãšããŠãããŸããã[å人åäººãæ¢çŽ¢çã«åæããŠããŒã¿ãçè§£ããŠãã]ãšããç®çã«ãããŠã¯ãæ©èœé¢ãšæäœæ§ã§Tableauããã©ã³ã¹ãåããŠãããšæããŸããã Tableauã¯UIãçŽæçã§ããŒã¿ã®æœåºé床ãéãããå¯èŠåã®ã³ã¹ããäœãå°è±¡ã§ãã ä»åTableauDesktopã§å®çµãããŠããŸãããTableauOnline/Serverã§ãã©ãŠã¶äžã§åæã§ããç°å¢ãæŽãããšãããŒã¿ãæ°äž»åããäžæ©é²ãã åæãå¯èœã«ãªããšæããŸãã åèURL Tableau ãã¯ãããžãŒ | Tableau Software Hyper | Tableau Software Mapbox ãããã®äœ¿çš Tableau Online ãŸã㯠Tableau Server ããã®ããŒã¿äž»å°ã¢ã©ãŒãã®éä¿¡ Tableauã§Google ã¢ããªãã£ã¯ã¹ãããŒã¿ãœãŒã¹ãšãããšãã®ã³ã Googleã¢ããªãã£ã¯ã¹ x TableauïŒã¿ãããŒïŒããšã¯ãã ãå¿åŸïŒãæ¡
ãä¹
ãã¶ãã§ããã€ã³ãã©ã¹ãã©ã¯ãã£ãŒéšã®æ²Œæ²¢ã§ãã ä¹
ãã¶ãã®ããã«ä»åã¯å°ãã¿ã§ãã OpsWorks ã§ç®¡çããŠãã EC2 ã€ã³ã¹ã¿ã³ã¹ã®ãã°ããCloudWatch Logs ã«è»¢éããå Žåã以åã¯èªåã§ Chef Recipe ãçšæã㊠Execute Recipe ãããå¿
èŠããããŸããã ãã ã(ãã€ãããã¯ææ¡ã§ããŠãŸããã) çŸåšã¯ãOpsWorks ã³ã³ãœãŒã«ã CLI ã ãã§ç°¡åã«èšå®ã§ããããã«ãªã£ãŠããŸãã ä»åã¯ããã詊ããŠã¿ãçµæã®å
±æãšã泚æç¹ãæžãèšããŠãããŸãã åææ¡ä»¶ ä»å詊ããç°å¢ã¯ä»¥äžã®éãã§ãã èšèŒã®ãªããã®ã¯é©åœã«èšå®ããŠããã ããã°åé¡ç¡ããšæããŸãã Stack Chef version: 11.10 OpsWorks Agent version: 3449 (Jun 5th 2018) Default IAM instance profile: AWSOpsWorksCloudWatchLogs ãä»äžãããŠãããããã¡ã€ã«ãæå® Layer PHP App Server Network Public IP Addresses: Yes Security(以äžã®ã»ãã¥ãªãã£ã°ã«ãŒããæå®) Inbound: ã«ãŒã«ãªã(å
šæåŠ) Outbound: å¶éç¡ã(å
šèš±å¯) Instance Amazon Linux 2017.09 å·çæç¹ã§ãOpsWorks ã§æå®ã§ãã Amazon Linux ã®ææ°ããŒãžã§ã³ ä»åã¯2å°çšæããèµ·åæžã¿ãšãã Hostname 㯠numatest01 , numatest02 ãšãã 詊ããŠã¿ã AWS OpsWorks ã¹ã¿ãã¯ã§ã® Amazon CloudWatch Logs ã®äœ¿çš äžèšã®å
¬åŒããã¥ã¡ã³ãã«æžããŠããéãã§ã¯ãããŸãããããã詊ããŠã¿ãããšæããŸãã ãã£ãããã ãã§ãã ãã®èšå®ãããããšãæ°ååŸ
ã€ãš CloudWatch Logs ã«ãã°ã転éããå§ããŸãã ã¡ãããšåºãŠããŸããïŒãã°ã®äžèº«ãèŠãŠã¿ãŸãããã æ³šæç¹ ããããšãŠã楜ãã³ã§ãšãŠã䟿å©ãªãã§ãããèŠãŠã®éããç»é¢ãã㯠CloudWatch Logs ã On ã«ããã Stream command Logs ã Yes (åºå)ã«ããã åºåããããã°ãã¡ã€ã«ã®ãã¹ãå®çŸ© ãã®3ã€ã®èšå®ããã§ããªããããç»é¢ããã§ã¯æ¬æ¥ CloudWatch Logs ã§ã§ããã¯ãã®çްããèšå®ã¯ã§ããªãããã§ãã CloudWatch Logs ãšãŒãžã§ã³ãã®ãªãã¡ã¬ã³ã¹ ç»é¢ããèšå®ãè¡ã£ãã ãã®ç¶æ
ã® /var/awslogs/etc/awslogs.conf ã®äžèº«ã¯ãããªæãã§ããã [general] state_file = /var/awslogs/state/agent-state [numa_cwlogs_test/php-app/opsworks-command-log /var/lib/aws/opsworks/chef/*.log] log_stream_name = numatest01 file = /var/lib/aws/opsworks/chef/*.log log_group_name = numa_cwlogs_test/php-app/opsworks-command-log [numa_cwlogs_test/php-app/var/log/messages /var/log/messages] log_stream_name = numatest01 file = /var/log/messages log_group_name = numa_cwlogs_test/php-app/var/log/messages [numa_cwlogs_test/php-app/var/log/cron /var/log/cron] log_stream_name = numatest01 file = /var/log/cron log_group_name = numa_cwlogs_test/php-app/var/log/cron [numa_cwlogs_test/php-app/var/log/secure /var/log/secure] log_stream_name = numatest01 file = /var/log/secure log_group_name = numa_cwlogs_test/php-app/var/log/secure ããã现ããèšå®ãããå Žåã¯ãCLI ã§èšå®ããããåŸæ¥éãèªåã§ Chef Recipe ãçšæã㊠Execute Recipe ãããå¿
èŠããããŸãã CLI ã¯ã aws opsworks update-layer ã®ããã¥ã¡ã³ãã確èªãããšããã --cloud-watch-logs-configuration ãšãããªãã·ã§ã³ã§çްããæå®ã§ããããã§ãã ããšãã å人çã«ã¯ç»é¢ããè¡ããèšå®ã ãã§ååæããããŸãã ãããã现ããªèšå®ãç»é¢ããè¡ããããã«ãªããšããã«æ¥œã§è¯ãã§ããïŒ
ããã«ã¡ã¯ããã¶ã€ããŒã®æž¡éã§ãã æ©ããã®ã§æ°åå
¥ç€ŸïŒå¹Žç®ãšãªããæ°å1幎ç®ã®åŠã³ãããã§èšäºã«ããŠãã1幎ãçµã£ãŠããŸããŸããã ïŒååã¯ãæ°å1幎ç®ãçµãããŸããïŒããªããŠæ°ç±³æãã£ã·ããªã®ã«ããã£ã1幎ã§ãå
¥ç€Ÿ3幎ç®ã«ãªããŸããïŒãã ãªããŠãæ¥ã«äžçŽçã¿ããã§äžæè°ã§ããïŒ ååã®èšäºã¯ãã¡ã â ãæ°äººWebãã¶ã€ããŒã1幎ã®åŠã³ãæ¯ãè¿ãã ããŠãã®èšäºã§ã¯ãã€ãã«åŸèŒ©ãæã€ããšã«ãªã£ãç§ãä»å¹Žã©ããªäººæã§ããã¹ãããèªèº«ã®æ°åæä»£ã®çµéšãå
ã«èããŠã¿ãããšæããŸãã èªåã®åŸãæ©ããŠããåŠçãããã3幎ç®ã®æ©ã¿ãæ±ããŠããç§ãšåããããªçµéšã®æµ
ããã¶ã€ããŒããã®åèã«ãªãã°å¬ããã§ãã(èªåãžã®èšãèãããšåå¿é²ãå
ŒããŠãŸãã) ã§ã¯æ©é âª ç®æ¬¡ è¯ãå
茩ã£ãŠãªãã ãã ãã¡ãªå
茩ã£ãŠãªãã ãã ããã«æ³šæããªãã3幎ç®ã«ææŠããããš æåŸã« è¯ãå
茩ã£ãŠãªãã ãã 話ããããããé°å²æ°ãæãšã ãã£ãšåŸèŒ©ãããŒã ãæã€ãšå¿ãããªããŸãããéäžããããŠãããªãŒã¹ããŒã¹ã§ä»äºãããŠããããã€ãã€ã€ãã³ãã€ããŠä»äºãããŠããããæ°äººã®ããããªè³ªåãå·ããŠããŸããŸãããã “ããããªãã³ããããããªãããã«ãããªã” ç°å¢äœãã倧äºã«ãããã§ãã (ããã§ãäžéšã®ãšã³ãžãã¢ããã¯ãããããã©ã³ã§é³æ¥œãèŽããŠããæäžã¯è©±ããããªãæ¹ããããããã§ãã) ã¡ãããšæéãå²ããŠãã³ããäžããŠãããã çæéã®å¯Ÿå¿ã§ã¯ãã©ãããŠãç®å
ã®èª²é¡è§£æ±ºãåªå
ãããŠæ ¹æ¬çãªæè¡ååäžã«ãªããªãããšããããŸãã ããã«ãæè¡ãåŠã¹ããšããŠãäºæ¥ã«èŸŒããæ³ããŸã§ã¯åŠã¹ãªãã§ããããæè²ã®åã®äœå°ã確ä¿ããŠããäœè£ã倧åã ãšæã£ãŠãŸãã ã§ãå矜詰ãŸã£ãŠãæã«ã¯çããŸã§å°ããŠãããã ãšã¯ãããã²ãšã€ã®èª²é¡ã«æéãããéããªãã®ã倧äºã§ãããã¶ã€ããŒã«ãšã£ãŠã¯ç€Ÿå€ã®ã€ã³ãããã®æéã倧åã§ãããé
ããªãåã«çµããããŠãç¿æ¥æ°ãã課é¡ã§ãããæŽ»ãããã°OKã ãšç§ã¯æããŸãã æ°ã¥ããåŠã³ããŸãšããããã ç§ã¯ïŒå¹Žåæ¯æ¥æ¥å ±ãæžããããŠã仿¥ããäºå®ã ã£ãã®ã«ã§ããªãã£ãããšããã®çç±ãæ°ã¥ããæ°ããç¥ã£ãèšèãªã©ããŸãšããŠããŸãããåœæã¯é¢åã«ãªã£ãããšããããŸããããä»ãšãªã£ãŠã¯ã¹ãã«ã¬ãã«ã枬ã貎éãªè³æã§ããçµéšããåŸãæ°ã¥ãã¯ãŸãšããããã¹ãã ãšæããŸãã å°ããªããšã«ãåªåãæããŸãªãå§¿å¢ãèŠãããã åŒç€Ÿã®CREDO(äŒæ¥ç念ã«ä»£ãããã®)ã«ãã£ãèšèã§ãã “ãããŸã§ãã"ã¯äŒãã"ãããããã§ããã"ãäŒãã ãã æ³åãè¶
ããŠæåãäžãããïŒ ãšããããšã§ãã ã¡ãªã¿ã«ä»å¹ŽåºŠããCREDOãå·æ°ãããŠãããŸããâ æ°ãããªã£ãmedibaã®CREDO âã€ãŸãè²ãŠãæèãããå
茩ã£ãŠã«ãã³ããïŒã£ãŠæã£ãŠãŸãã ããããã ãã§ãªããæš¡ç¯ãèŠããã ãã¶ã€ã³ããããšãã«éå»äœåããµã³ãã«ããã£ãæ¹ããããŒã³ã®ã€ã¡ãŒãžãæ¹§ããŸãããäºåäœæ¥ã«ãããŠããæ©ãäºæ
ãªãèŠãããããšæã£ãŠããŸãã æšæ¶ã¯èªåããã説æã¯äŸãæ·»ããŠãææãããšãã¯çç±ä»ãã§ïŒ ä»»ããå§¿å¢ãæãšã æ©ã段éãããèªåã§èããŠ1ã€ã®ã¿ã¹ã¯ãå®éãããæ©äŒãäžãããã§ããã€ãã€ãå°ããªä»äºã°ããæ¯ã£ãŠããŸãããã§ããããã§ã«èªåã®ææç©ã®å¯ŸäŸ¡ãšããŠã絊æãæŽããŠãããããããªã®ã§ããã®èªèŠãæã£ãŠæ¬²ãããšæããŸãã ãã¡ããããŸãã¯èªåã«è²¬ä»»æãããããšã§ãããæ¬¡ã«çžæã«ããããæãããå¿æ§ããæ©ãæ®µéããå¿
èŠããšïŒ çµæã ããããªãããã»ã¹ãèŠãã æ°äººãããã«çµæãåºãã®ã¯ç°¡åã§ã¯ãããŸããããªã®ã§éæãŸã§ã®ããã»ã¹ãææ¡ããŠãããã«å¯ŸããŠãè©äŸ¡ãããè€ãããã§ãããšãæé·ãåŸæŒãã§ãããšæããŠããŸãã ããã«ãäžæçãªãããžã§ã¯ãã®éäžæ®µéã§ãææã«åããåŠç¿ããçžã®äžã®åæã¡ã«ãªã£ãè¡åã«å¯ŸããŠãå
¬æ£ãªè©äŸ¡ãã§ããŸãã ãã¹ã¯ãã£ããè¬çœªããã åãšéãããšãèšã£ãŠããŸã£ããæããå
容ã«èª€ãããã£ããæç€ºã«ãã¹ããã£ã…ãã¡ãããšè¬ããŸãããããããšãæ°äººããã£ãããã¹ãã£ãŠããŸã£ããšãã¯äžç·ã«äžã«è¬ãã«è¡ããŸããããã ç®æãããæ¹åæ§ãçè§£ããã æ¬äººã®ãã£ãªã¢ãã©ã³ãæ±²ã¿åã£ãäžã§æé·ã«ã€ãªããã¿ã¹ã¯ãæ¯ãããšãã§ãããšãããããäºãšããããŠããããäºãåèŽããã®ã§ã¢ãããŒã·ã§ã³ãäžãããŸããïŒåãããŠãåŸæé åãæ·±æããããã®ãæçšã§ãã âã€ãŸãã¢ãããŒã·ã§ã³ç®¡çãã§ããå
茩ã£ãŠã«ãã³ããïŒã£ãŠæã£ãŠãŸãã ãã¡ãªå
茩ã£ãŠãªãã ãã åŸèŒ©ã«èªèº«ãžã®è©äŸ¡ãæ±ãã äžçªè¿ãã§èŠãŠããã¯ããªã®ã«ãåŸèŒ©ã¯å
茩ã®å€§å€ãã«æ°ã¥ããŠããªãã£ãããããã®ã§ãã(ãã£ãšç§ãããã§ããã)ã§ãããã®é 匵ãã¯ããã«èªåã®å
茩ã«èŠãŠããããšããŠãåŸèŒ©ã«ã¯èªèº«ã®æé·ã«éäžããŠããããŸãããã åŸèŒ©ãããŒã ã¡ã³ããŒã«å«åЬãã ä»äºã®ãŽãŒã«ã¯è¯ããµãŒãã¹ãã客ããã®æã«å±ãããšã§ãã çžè«ãã«æ¥ã人ãšäžç·ã«ãªã£ãŠæ©ãã§ããŸã ãªãèªåã®å
ã«çžè«ã«æ¥ãã®ãã圹å²ãèããŸããããããèªåã®æ¹ãäžã®ç«ã¡äœçœ®ã ã£ãããã·ããšæ±ºããŠããŸã£ãŠè¯ããšæããŸããæ±ºããããªãå Žåã¯äžç·ã«äžé·ãžïŒ ç°¡åãªä»äºããããŠãªãããæã ãããšæãèŸŒã æ°äººã£ãŠãããããªéšã®äººãšæ¥éã«ç¥ãåããŸãããããããªéåãããªããªããä»äºã®å匷ãããã®ã§çµæ§å¿ããã®ã§ã…ã ã¢ã³ããã®æåºŠãäœã ã¿ããªãç¥ã£ãŠãæ
å ±ã«æ°ã¥ããªãã®ã¯ã¡ãã£ãšã«ãã³æªãã 仲ä»ãªã®ã«äžæµã®æèŠãæ±²ã¿åããŠããªã äžæµããã®ææã§ç¢ºèªæŒãã«æ°ã¥ãã®ã¯æéã®ç¡é§ã倧ããã¹ããŒããããªãã§ããã ããããã®ç®çãæå³ãåªå
床ãªã©ã¯å¿
ã確èªããããšæããŸãã äŒç€Ÿã®æçŽãèšã ãã¬ãã·ã¥ãªæ°äººã®ã¢ãããäžããŠããŸããŸãããé·ãåãã°äžæºã®ã²ãšã€ããããããããŸããããèªåã®å·¥å€«ã§æ¹åã§ããªãããæ¢ããããçžè«ã¯ãŸãå
茩ãäžåžã«èšãã»ããã¹ããŒãããšïŒ èªåã®ããæ¹ã«åºå·ãã åŠã³ãäžã®äžä»£ã«åãç¶ãã®ã¯å€§åã§ããã§ããã€ã«ãŒã«ãã ãã£ãŠãæ¬æ¥ã®ãŽãŒã«ãèŠå€±ããªãããã«ããŸãããïŒ ããã«æ³šæããªãã3幎ç®ã«ææŠããããš åŸèŒ©ã«å¯Ÿã㊠ã»åºç€çãªããŒã«ãšãµãŒãã¹å
容ãèŠããŠããã ã»å匷äŒãéã ã»ã¿ã¹ã¯ã®é²æãä»äºãžã®é¢å¿ãå¿æã¡ãªã©ããã¢ãªã³ã°ããã ã»ããããã®ããä»äºãäžãã èªåã«å¯Ÿã㊠ã»ç©æ¥µçã«ãŠãŒã¶ãŒã«ãªãUIãUXãåŠã¶ ã»ãŠãŒã¶ãŒã®å£°ãèã ã»ããŒã ã¡ã³ããŒããFBãããã æåŸã« ãšã¯ãããŸã 3幎ç®ïŒïŒ âãããã人䞊ã¿ã®ä»äºããããŠããããããã«ãªã£ããšããã§ããŸã å
茩ãäžåžã®æãåããããšãå°ãªãç¡ãã§ãã åŸèŒ©ç€Ÿå¡ãå
¥ç€ŸããŠãããšãäžæè°ãšãèªåã¯å
茩ã ããä»äºã¯ã§ããããšããæ°ã«ãªã£ãŠããŸãããçŽ çŽã«è¬èã«ãèªåããããŸã§åæ§ã«æé·ã«æ³šåãããã§ãã(äžèŠãªä»äºè«ãšã説ããªãããã«ãããã§ããw)
ä¹
ã
ã®æçš¿ã«ãªããŸãã medibaã®æŸæ¬ã§ãã åŒç€Ÿã§ã¯ãå€éšæè¡é¡§åãšããŠ3åã®æ¹ã«ãååããã ããŠãããŸãã äž»ã«ãæ¡çšãæè¡æŠç¥ã®çžè«ãšãã£ããã®ããææ°ã®æ¥çååãªã©ãçžè«ãããŠããã£ãŠããŸãã ä»åã¯ããã®äžã§äž»ã«çµç¹äœããäžå¿ã«çžè«ãããŠããã£ãŠããäºåããïŒããããžã£ãŒããŒCEOïŒã«ã以äžã®ããŒãã§åŒç€Ÿã®ãšã³ãžãã¢åãã«ã話ãããŠããããŸããã®ã§ã玹ä»ããããšæããŸãã åŒç€Ÿã¯è¥æããäžå
ã®ãšã³ãžãã¢ãå€ãã®ã§ãäºåããã®çµéšããå°ãã§ãåŸããã®ãããã°ãããªãšæããŸããã äºåããã«ã€ããŠ æ ªåŒäŒç€Ÿããããžã£ãŒã㌠ãèµ·æ¥ãCEOãšããŠæŽ»èºãããããããæ§ã
ãªäŒæ¥ã®æè¡é¡§åãåããã çŸåšã¯ããã²ãšãã®ã¢ã€ãã¢ãã¿ããªã®ãã«ã©ã«ãããããæ
å ±å
±æããŒã«ãKibelaããéçºããªãªãŒã¹ã ã話ããã ããããŒã ãäºåããããããããã®äººçã®ã¿ãŒãã³ã°ãã€ã³ãã«ãããŠäœãèããŠã©ãè¡åããã®ãã äºåãããããããŸã§ã©ãããããšãèããŠäœããã£ãŠããã®ãããèªèº«ã®çµéšã亀ããªããã話ããã ããŸããã ãšã³ãžãã¢ã«ãšã£ãŠã¯ã転è·ãèµ·æ¥ã¯ä»äººããšã§ã¯ãªãããã€ã€ã³ãã¯ãã®å€§ããã€ãã³ããªã®ã§ãå§ããåããæåŸ
æMAXã§ããã äžèº«ã®æç² éœåã«ããããæŒæã®éå¬ãšãªã£ãã«ãããããããåŒç€Ÿã®ãšã³ãžãã¢ã20åçšåºŠåå ããŠã®éå¬ãšãªããŸããã åœåãäºåããäž»å°ã§ã話ããã ãåœ¢ãæ³å®ããŠããŸããããé²è¡ã®é¢ä¿ã§ãæ¥éœç§ãã€ã³ã¿ãã¥ã¢ãŒåœ¹ãšããŠå¯Ÿè«åœ¢åŒã§é²ããããšã«ãªããŸããã æç²ã«ãªããŸããã以äžã®ãããªæãã§é²ã¿ãŸããã ã¯ãã¯ããããžè»¢è·ããã«åœãã£ãŠèããããš äœããããããŠè»¢è·ããã®ã ã¯ãã¯ãããã§ã¯éçºéšé·ãšããŠäœãããã®ã ã©ããªçµç¹ãäœãããšæã£ãã®ã ãšã³ãžãã¢ãæ¡çšããåºæºãã©ããªãšã³ãžãã¢ã欲ãããšæã£ãã®ã æ»ã¬ã»ã©èŸãã£ãããšãšã ãªãèŸããŠãèµ·æ¥ããããšæã£ãã®ã ããããžã£ãŒããŒãèµ·æ¥ããã«åœãã£ãŠ ã©ããªããšããããããŠäŒç€Ÿãèµ·ããããšæã£ãã®ã å®¶æã®å察ã¯ãªãã£ãã æ¡çšæ
åœãšã㊠ã©ããªäººãåãããšããŠããã ã©ããªããæ¹ã§ãã£ãã®ã ãäžçã§äžçªãšã³ãžãã¢ã幞ããªçµç¹ãäœãã ç®æšã®ããšå·¥å€«ããã話ãã匷ãçµç¹ãäœãããã®ç§èš£ãªã©ãéåžžã«å°è±¡çã§ããã ãŸãä»ã«ããéåžžã«èããããããã話ããããããããŸããã äœããšã³ãžãã¢ã®å£«æ°ã奪ãã®ã äœããããšæåãããã¯ããããªãã£ãããäœããããšå€±æããã®ãã¯ãããããã«ãªã£ã ãã®ããæ¹ã¯ãèªåã¯å¹žãã§ããä»äººïŒããŒã ã¡ã³ããŒãšãïŒã«ãšã£ãŠã¯å¹žããªã®ãïŒ æææ±ºå®ãèªåã®æ¹ã«æã£ãŠæ¥ãããã«ã éžæè¢ãå¢ããããã®ä¿¡é Œ ãäœãããš ã¢ãŠããããã¯ãå¿
ãæ±ããããŠãããã®ã®ïŒïŒã§ãããããä»å 䟡å€ãã€ããŠåºã ãŸããã©ãœã³å¥œããªäºåããããããç®ã®åã®å£ãè¶ããããã®ã話ãããã©ãœã³ã«ãªããããŠè©±ãããŠãããŸããã ã¶ã£ã¡ãããæããªãå¿ãšå£ããªã身äœããããã°ããªããšã§ããªããŸãã (Byäºåãã) æåŸã« ãšããããã§ãããããå匷äŒãšã¯æ¯è²ãå€ããã瀟å
ã®é¢šæ¯ãBlogã«ããŠã¿ãŸããã 瀟å
ã®ãšã³ãžãã¢é£ã«ã奜è©ã§ããŸãæ©äŒãããã°ãã®ãããªå¬ãã宿œããŠã¿ãããšæããŸãã äœãããããå¿ããäžå¿«ãæ¿è«ŸããŠãã ãã£ãäºåãããæ¬åœã«ããããšãããããŸããã æåŸã«å®£äŒã medibaã§ã¯ãåºããšã³ãžãã¢ãåéããŠããŸãã ãèå³ãæã£ãŠããã ããŸãããããã² åéèŠé
ãªã©ç¢ºèªããã ãããé£çµ¡ãã ããïŒ
ã¡ãã£ã¢ã·ã¹ãã éçºéšã®éåŽã§ãã ã¡ãã£ã¢ã·ã¹ãã éçºéšã§ã¯ãã auWebããŒã¿ã« ããã auã¹ããŒããã¹ ããšãã£ãããµãŒãã¹ãæ
åœããŠããŸãã åŒç€Ÿã§ã¯äžéšã®ãµãŒãã¹ã§ã¢ã¯ã»ã¹ãã°ãªã©ãTreasure Dataã«è²¯ããŠããŸãã ä»åŸã¯ãã®ããŒã¿ã忿޻çšããããè¯ããµãŒãã¹ãæäŸããŠãããããšèããŠããŸãã ãã®äžæ©ãšããŠãä»åã¯Treasure Dataå
ã§äœ¿ããæ©æ¢°åŠç¿ã©ã€ãã©ãªhivemallãå©çšããŠãŠãŒã¶ã¬ã³ã¡ã³ãã詊ããŠã¿ãŸããã ã¯ããã« ä»åã¯ãDACããã®ããã°ãåèã«ãããŠããã ããŸããã ãHivemallã§MinhashïŒã䌌ãŠãèšäºãæ¢ãåºããããã â» Treasure Dataã®ããã°ã«ãè±èš³ãããŠãããéåžžã«ããããããèšäºã§ãïŒ ãã®åèèšäºããªãã圢ã§ããããµã³ãã«ããŒã¿ã§ã¯ãªããå®ãµãŒãã¹ã®ããŒã¿ãå
¥åãšããŸãã ãããµãŒãã¹ã®ãŠãŒã¶ããšã®ãžã£ã³ã«å¥ã®é²èЧæ°ãå
¥åãšãã ãããŠãŒã¶ã«é²èЧåŸåã䌌ãŠãããŠãŒã¶ãã¬ã³ã¡ã³ãããŠã¿ãŸãã Minhashãšã¯ minhashã¯ãä¹±æã¢ã«ãŽãªãºã ãšåŒã°ããŸãã 倧éã®ãŠãŒã¶ããŒã¿ãææžããŒã¿ãæ¯èŒãããå Žåã«å©çšããã é¡äŒŒããŠãããŠãŒã¶ãææžãæšå®ããããšãã§ããŸãã ãã2ã€ã®éåïŒãŠãŒã¶ãæç« ïŒã®é¡äŒŒåºŠã¯ã Jaccardä¿æ°ã§è¡šãããšãã§ããŸãã Jaccardä¿æ°ã¯ãç©éåãåéåã§å²ã£ãå€ã§è¡šãããŸãã åèèšäºã«ããããã«ã 2ã€ã®éåã®èŠçŽ ã«ããhash颿°ãé©çšããã®çµæã®ãã¡æå°å€ãäžèŽãã確çãš Jaccardä¿æ°ã¯çãããªãæ§è³ªããããŸãã ãã®éã«äœ¿ãhash颿°ãkåçšæããã°ã æå°å€ãäžèŽããåæ°ãkã§å²ãã°Jaccardä¿æ°ãæšå®ã§ããã ã€ãŸãã2ã€ã®éåã®é¡äŒŒåºŠãæšå®ã§ãããšããããšã«ãªããŸãã å©çšããç°å¢ ä»åå©çšããç°å¢ã¯ä»¥äžã®éãã§ãã hive : 0.13.0 åè hivemall : 0.4.2-rc.4 å©çšãã颿°ã®ç¢ºèª minhashã䜿ããŸãã 颿°ã®å®çŸ©ã¯ã hivemallã®ãŠãŒã¶ã¬ã€ã ãåèã«ããªãã hiveã® DESCRIBE FUNCTION ã䜿ã£ãŠç¢ºèªããã®ãããããããã§ãã (minhash) 第äžåŒæ°ã«ã item ã第äºåŒæ°ã«ã features ãåããŸãã ãŸãããªãã·ã§ã³ãšããŠnãåããŸãã ä»åã¯ãitemãuser_idãšããŸãã è¿ãå€ãšããŠãäžã€ã®user_idã«å¯ŸããŠãnåã®hashå€ãåºåãããŸãã æ¬¡ã«ãfeaturesãçšæããŸãã å
¥åããŒã¿ã®çšæ ãŠãŒã¶ã¬ã€ãã®input ããŒãžãåèã«ããŸãã featuresã¯ãç¹åŸŽéãã¯ãã«ã§ãindexã®ã¿ããŸãã¯indexãšweightãã»ããã§è¡šããŸãã hivemallã§ã¯ãããããããã«ã¯ãªãŒããŒã·ã§ã³ã§æ¬ã£ã圢åŒã§è¡šããŸãã äžèšã®feature颿°ã䜿ããŸãã ãšãããµãŒãã¹ã®ã user_idã«å¯Ÿãããžã£ã³ã«ããšã®é²èЧæ°ãåèšãã ããŒãã« userid_by_genre ãããã®ã§ããããå
ã«ããŸãã user_id genre_id_1 genre_id_2 genre_id_3 1 0 2 10 2 1 4 12 3 0 8 1 4 10 4 0 5 9 7 12 â»èšèŒããŠããããŒã¿ã¯ãµã³ãã«ã§ãã ãã®ããŒãã«ã«å¯ŸããŠã 以äžã®ãããªã¯ãšãªã§feature颿°ãé©å¿ããŸãã (type:hive) SELECT user_id AS user_id, ARRAY(FEATURE(1, genre_id_1), FEATURE(2, genre_id_2), FEATURE(3, genre_id_3)) AS feature FROM userid_by_genre 以äžã®ãããªã user_idãšfeatureã®ããŒã¿ãã§ããŸãã ããããå¥ããŒãã« user_feature ã«æžãåºããŠãããŸãã hashã®äœæ ãã®ããŒãã«ã«å¯ŸããŠãminhash颿°ãé©å¿ããŠãããŸãã n=10ãšããäžã€ã®user_idã«å¯ŸããŠã10åã®hashå€ãçæããŸãã (type:hive) SELECT minhash( user_id, feature, "-n 10" ) AS( clusterId, rowid ) FROM user_feature 以äžã®ãããªãhashå€ãçæãããŸãã ãã®çµæããå¥ããŒãã« user_hash ã«æžãåºããŠãããŸãã é¡äŒŒãŠãŒã¶ã®éèš ããŒãã« user_hash ã® ç°ãªãuser_idããhashå€ãããåæ°äžèŽããuser_idãéèšããŸãã ä»åã¯ã9å以äžã®ãã®ã察象ãšããŸããhash颿°ã¯10çš®é¡ããã®ã§Jaccardä¿æ°ã0.9以äžã®ãã®ãšãªããŸãã SELECT J.Rowid, Collect_set(rid) AS Related_userid FROM ( SELECT L.Rowid, R.Rowid AS rid, COUNT(*) AS cnt -- minhashãäžèŽããæ° FROM user_hash l LEFT OUTER JOIN user_hash r ON ( L.Clusterid = R.Clusterid ) -- minhashã®å€ãäžèŽããã¬ã³ãŒãã®ã¿ãjoin WHERE L.Rowid != R.Rowid --åãuser_idã¯é€å€ GROUP BY l.rowid, r.rowid HAVING cnt > 8 -- Jaccardä¿æ°ã0.8以äžã®ãã®ã¯é€å€ ) J GROUP BY J.Rowid ORDER BY J.Rowid ASC ããã§ã¯ãå®ããŒã¿ã¯ãèŠãã§ããŸãããã 以äžã®ãããªåœ¢åŒã®çµæãåŸãããŸãã user_id:1ã«å¯ŸããŠãuser_id:2,4,5ã®ãŠãŒã¶ã®é²èЧã䌌ãŠããããšã«ãªããŸãã user_id Related_userid 1 [2,4,5] 3 [7,8] 4 [10,11] ãã®è©äŸ¡ã«é¢ããŠããæ¬èšäºã§ã¯è©³çŽ°ãæ±ããŸããã ã»ãŒåæ§ã®é²èЧåŸåã«ãããŠãŒã¶ãã¬ã³ã¡ã³ãããããšãã§ããŸããã ãŸãšã åèèšäºããªãã圢ã«ãªããŸããããå®éã®ãµãŒãã¹ã®ããŒã¿ãçšã㊠Treasure Dataã®hivamallãçšããŠããŠãŒã¶ã®ã¬ã³ã¡ã³ãã詊ããŠã¿ãŸããã ã©ã®ãããªããŒã¿ãç¹åŸŽéãšãããã©ããã£ãŠç¹åŸŽéãäœããããããæžæããŸãããã Treasure Dataäžã«çããŒã¿ãhivemallã®å®è¡ç°å¢ãçšæãããŠããããšã§ãæè»œã«è©Šãããšãã§ããŸããã ã¡ãã£ã¢ã·ã¹ãã éçºéšã§ã¯ãTreasure Dataãªã©ãå©çšããŠãµãŒãã¹ã«è²¢ç®ã§ãããšã³ãžãã¢ãåéããŠããŸãã ãèå³ããæ¹ã¯ã åéè·çš®äžèЧ ãªã©ãã確èªãã ããã
ããã«ã¡ã¯ããã¶ã€ããŒã®å€§æã§ãã Adobe XD CC ã InVision Studio ãæ°ã«ãªãã€ã€ã Sketch ãããŒãžã§ã³ç®¡çã§ãããèšèšããŒã ã§äžç·ã«äœæ¥ããããã®ãã©ãããã©ãŒã Abstract (0.63.5) ã䜿ã£ãŠã¿ããšãããšãŠã䟿å©ã ãªãšæã£ãã®ã§ç޹ä»ããŸãã Abstract ã£ãŠã©ããªãã®ïŒ ãã¶ã€ã³ããŒã¿ã®ããŒãžã§ã³ç®¡çãã§ãã ææ°ããŒã¿ãã©ããªã®ãããŒãžã§ã³ç®¡çã§éæåã§ãã è€æ°äººã§ã®äžŠè¡äœæ¥ãç°¡åã«äžæ¬åã§ãã ãã¡ã€ã«ãéãããšãªããããžã§ã¯ãã®å€æŽç¹ã確èªã§ãã https://www.goabstract.com/ æé¡è²»çšïŒBusiness $16.67ãStarter $10 ã¡ãªãã ããŒãžã§ã³ç®¡çãããéå»ããŒã¿ã§ãããŒã«ã«ã«ãèœãšãã éå»ã«é¡ããã®ã§ããŒãããªãçãŸãããã³ã¡ã³ããæµãã§è¿œãããšãã§ããçè§£ãããã Slack 飿ºã§èª°ãçŸåšäœãã£ãŠãããèŠããåãã§ãã Abstract ã§ç®¡çããŠãã Sketch ãã¡ã€ã«ã¯ ContributorïŒèª²éå©çšããŠããäººïŒ ãªã誰ã§ãç·šéã㊠Commit ããããšãã§ãã ã³ã¡ã³ãã®ãããšãã§ãã¶ã€ã³ã¬ãã¥ãŒã§ããïŒViewer ã§æåŸ
ããã°èª°ã§ãç¡æã§åå å¯èœïŒ Business ã§ããã° ç¡å¶é ã«ããŒãžã§ã³ç®¡çãã§ãã(Starter ã¯250GBãŸã§) ãã¡ãªãã Sketch 以å€ã®ãã¡ã€ã«ã¯ç®¡çã§ããªã ã³ããã¥ã±ãŒã·ã§ã³ãã¹ãæžã£ãŠã¹ãã¬ã¹ãè»œæž ãäœã£ãŠãâãã©ã£ããããŠãâãèŠãŠãã£ãŠäœãã§ãç¥ããããŠãâããè¿äºããã£ãŠãâãèªãã§çè§£ããŠãâãä¿®æ£ããŠãâãä¿®æ£ãããã£ãŠãç¥ããããŠãâãèŠãŠãããã ã¿ãããªãããŒã ãBranch åã£ãŠãâãäœã£ãŠãâãèŠãŠãã£ãŠãç¥ããããŠãâããè¿äºããã£ãŠãâããè¿äºèŠãªããä¿®æ£ããŠãâãCommit ïŒãç¥ããããŠãâãèŠãŠãããã ãšãªããŸãã ãã®ãã©ã£ããããŠããšèšãã®ãéèŠã§ãåŒç€Ÿã§ã¯ Share Point (ããŒã ã«ãã£ãŠã¯ç€Ÿå
ã®å
±æãµãŒãã InVision ã Prott ) ã«æ ŒçŽããŠãã®å Žæããç¥ããããŠã¬ãã¥ãŒã®ãããšããè¡ãã®ã§ããã人çºçãªäœæ¥ãªã®ã§ããå¿ããäžãæŒãããã£ãŠãäžãã£ãŠãªããïŒããåæ ãããŠãªããïŒããšããã¿ã€ã ãã¹ãç¡ããªãã®ã¯å€§ããéããšæããŸãã ãŸãããŒãžã§ã³ç®¡çããŠããã®ã§ããã®ãã¶ã€ã³ã£ãŠã©ãã®é¢é£ã ã£ãïœïŒããšãã¶ã€ã³ããŒã¿ã®ãã¡ã€ã«ç®¡çãæžããå°ã楜ã«ãªããŸãããïŒé
眮ããç»å㯠Photoshop ãš Illustrator ãªã®ã§ãã®ããŒã¿ã¯å¥ã§ç®¡çããŸããïŒ äžçªå¬ããããšã¯ã²ãšãã§æ©ãæéãæžã£ãããšã ããããªãã¶ã€ã³æãã€ãããã©ãè§£æ±ºæ¹æ³ã«ãããããŠãªããããã§ãããèãããšãããããŠãã®ããã»ã»ã»ïŒæ©ïŒãšã£ãŠããããæšãŠããããããšæ©ãã æã«ãèããäºããã®ãŸãŸ Commit ã㊠Comment ã§ã¡ã³ããŒã«èãã°ãã解決ã«ãªããªããªããããªããããšããããããèãæ¹ãããšãã®ãã¶ã€ã³ã§åã£ãŠããšæãããšãã客芳çãªæèŠããã®æç¹ã§èããã®ã§ãã¶ã€ã³ãäœããªããã²ãšãã§æ©ãæéãæžããŸããã ã³ã¡ã³ãã¯ãããªæãã§æžããŸãã @ã§ã¡ã³ã·ã§ã³ããïŒãããïŒãšå³äžã®ãã«ãšã¢ããªã¢ã€ã³ã³ã«ãããžãã€ããŠãç¥ãããããŸãã Slack 飿ºããŠãèŠããåã Slack ããããžã§ã¯ãããŒã ã§äœ¿ã£ãŠãå Žåã飿ºã㊠Commit ããããšããèŠããåãã§ããã®ã§æµããèŠããŠå®å¿ã§ãã Commit ã®ç²åºŠãäžå®ã«ããŠèªå以å€ã®äººãåãããããã§ãããšã¬ãã¥ãŒãæãããã§ãã Slack ãžã®é£æºæ¹æ³ ããŒã ã® Organization Setting ã® Integrations ããå¯èœã§ãã â»Organization Setting 㯠Web ããã®èšå®ã«ãªããŸãã ãç¥ããããã Active Project ãéžæ Organization Setting ã® Integrations ããéç¥ããã Channel ãéžæ ãã¶ã€ã³äœæ¥ãšããŒãžã§ã³ç®¡çã®èŠªåæ§ ãã¶ã€ã³ãé²ããå·¥çšã§ãéžæãééã£ãŠããããšã«æ°ãã€ããŠããä¿ç®¡ãããŠãã Sketch ããŒã¿ãéããŠéå»ã®ãã¶ã€ã³ããŒã¿ãæŸãããšãã§ããã®ã§ããåŸã§äœ¿ããããããªãããã»ã»ããšãããªãããŒã¿ãåã£ãŠããå¿
èŠããªããåæšéžæããªãããšã«ããé²ããããšãã§ããŸãã å¥ããŒãžãå¥ãã¡ã€ã«ã§ãŽãïŒãã€ã䜿ããããããªãïŒããŒã¿ãæ®ããŠãããªããŠãè¯ãã®ã§ããã€ã§ãæŽçãããŠããŠèŠãããã第äžè
ããã¬ãã¥ãŒãããããã§ãã ãŸãã確å®ããŠãããã¶ã€ã³ã¯åžžã« Master ã«ããã®ã§æ¹ä¿®äžã®ãã¶ã€ã³ãšåããŠèŠãããšãã§ãå®å¿ããŠä»è
ã«å±éã§ããŸãã Master ã«ããããŒã¿ã¯äžèЧã§ç¢ºèªã§ãã Sketch ãã¡ã€ã«ãéãããšãªããã¬ãã¥ãŒã§ç¢ºèªã§ããã®ã§ãããœã³ã³ã®è² è·ãå°ãªãæçãæåŸ
ã§ããŸãããããã¯ãŒã¯ã軜ããªãã®ãäžã€ã®é
åã§ãã Commit åäœã§å€æŽãããã®å€æŽããŠãªããã®ãäžç®ã§ããã ãããªé¢šã«èŠããã®ã§ã Commit ã®åäœã¯ããªããã®å€æŽãããã®ãã倿Žã®ç®çåäœã«ããå¿
èŠããããŸãã è€æ°äººã§ã®äžŠè¡äœæ¥ãç°¡åã«äžæ¬åã§ãã èªå以å€ã®äººãç·šéããå·®åããŒã¿ãèªåã® Branch ã«åã蟌ãã§ãã¹ã¿ãŒã« Merge ããããšãã§ããŸããè€æ°äººã§æ¡ãåºããŠéšåã§ãããšãåããå¯èœã§ãããŸããããŒãã®éäžè¶³ã誀åè±åã®ãããªã¡ããšããä¿®æ£ãªããã©ããŒãåã£ãŠãã¶ã€ã³ããŒã¿ã®ééããæ£ããŠããããã§ãã ãããã« INVITE ã§æåŸ
ã¡ãŒã«ãéãã°ã誰ã§ããã¥ãŒã¢ãŒã«ãªã£ãŠã³ã¡ã³ããæžããã®ã§ãDesign ã¬ãã¥ãŒã®ããŒã«ãšããŠã䟿å©ã§ãããã¶ã€ã³ã¯ãŠãŒã¶ãŒãšã®æ¥ç¹ãªã®ã§äŒç»åŽãéçºåŽãããžãã¹åŽå
šãŠã®èгç¹ããã¬ãã¥ãŒãé ããŠãå±ããã人ã«å±ããã¶ã€ã³ãäœããããšæã£ãŠããŸãã
åããŸããŠãããã³ããšã³ããšã³ãžãã¢ã®è¬è±ïŒãžã£ããïŒã§ãã å
¥ç€ŸããŠ8ã¶æã»ã©çµã¡ãŸããŠããããŠåããŠããã°ãæžããŸãã æ²çžãé¢ããŠé·ã幎æãçµã¡ãŸãããæ±äº¬ã§ã¯ããžã£ãããã人åã ãšèªèãããæªã ã«èŠããã§ãããŸããïŒé»è©±ããã ãš100%èãåã£ãŠããããŸããïŒ ãããªãããªã§æ¥œãããä»äºãããŠããã ããŠããã®ã§ãããæè¿ãšãããããžã§ã¯ãã§HTTP/2ãåãå
¥ããã¢ãã€ã«ãµã€ãã®ããŒãžè¡šç€ºé床ã®é«éåã«åãçµã¿ãŸããã®ã§ããã®ã話ãããã³ããšã³ãã®èŠç¹ããã話ããŸãã 衚瀺é床ãé
ãïŒ æ¹åãããïŒ ãšæã£ãŠããŠããå®éã©ãããæãã€ããŠãããããŸãã¡åãããªããšèšãæ¹ãããã£ãããããšæããŸãã å°ãã§ããããªæ¹ã®åèã«ãªãã°ãšæã£ãŠãããŸãã WebããŒãžã®è¡šç€ºéåºŠã®æ¹åã¯ãªãå¿
èŠïŒ ãã¡ãã衚瀺é床ã¯éãã«è¶ããããšã¯ãªããšèª°ãããæãã§ããããã å
·äœçã«è¡šç€ºãé
ããšã©ããã£ãããšãèµ·ããã®ã§ããããïŒ ãŠãŒã¶ã®çŽ50%ã2ç§ä»¥å
ã®ããŒãžè¡šç€ºãæåŸ
ããèªã¿èŸŒã¿é床ã3ç§ä»¥äžããããš40%ã®ãŠãŒã¶ãé¢è±ãã åŒçšå
: https://blog.kissmetrics.com/loading-time/?wide=1 æäœéå§æéã3ç§ã®ãµã€ãã¯1ç§ã®ãµã€ãã«æ¯ã¹ãCVRã¯38%äœäžãçŽåž°çã¯50%äžæãã åŒçšå
: http://web-tan.forum.impressrd.jp/e/2014/07/08/17757 ããŒãã©ããªã«ãããµãŒãã¹ãã³ã³ãã³ããæã£ãŠããŠã衚瀺ãé
ããšãŠãŒã¶ãŒã¯é¢ããŠãã£ãŠããŸããšããããšã§ããã ããŒãžã®è¡šç€ºãé
ããšããã®ã¯ãŸãã«çŸå®³ãã£ãŠäžå©ãªããšããããšãåãããŸãã 衚瀺é床ãé
ããŠãã人ãªããŠããªãã§ããããã€ã©ã€ã©ããŸããããã HTTP1.1ã®åé¡ç¹ HTTP1.1ã§ã¯ã1ã€ã®ãªã¯ãšã¹ããå®äºãããŸã§ã次ã®ãªã¯ãšã¹ããéãããšãã§ããªããªã£ãŠããŸãã ãªãœãŒã¹ã2ã€ãã£ãå Žåã¯ã1ã€ç®ã®èªã¿èŸŒã¿ãå®äºããŠãã2ã€ç®ã®ãªãœãŒã¹ã®ãªã¯ãšã¹ããéå§ããããŸãã åŒè¶ãã§äŸãããªãã°ãåŒè¶ãå
ãŸã§è·ç©ã1ã€ãã€ããéã¹ãªãã®ãšåãç¶æ³ã«ãªããŸãã 100åã®è·ç©ãããã°100åŸåŸ©ããªããã°ãªããŸãããçžåœæéããããããã§ããã ãã®ããã«HTTP1.1ã§ã¯ã1ãã¹ãããšã«1ã€ã®ãªã¯ãšã¹ãããã§ããªãã®ã§ããªãœãŒã¹ãå€ããã°å€ãã»ã©åŸåŸ©ããæ°ãå¢ããããŒãžã®è¡šç€ºã«æéãããã£ãŠããŸããŸãããã®æ¹æ³ã¯æããã«éå¹çã§ãã ãããåé¿ããããã«ãã»ãšãã©ã®ã¢ãã³ãã©ãŠã¶ã¯ïŒãã¡ã€ã³ã«å¯Ÿãè€æ°åææ¥ç¶ãè¡ãããšã§ãããçšåºŠéä¿¡ã®å€éåãå³ã£ãŠããŸãã æ¬¡ã®å³ã¯ãåŒç€Ÿã®Webãµã€ãïŒHTTP1.1ïŒãChromeãã©ãŠã¶ã®ãããã°ããŒã«ã§ç¢ºèªãããã®ã«ãªããŸãã Chromeãåæã«éä¿¡ãããªã¯ãšã¹ãã¯æå€§6ã€ãŸã§ã§ããïŒ7ã€ç®ä»¥éã¯ãããã¯ããïŒããšãåãããŸãã HTTP/2ã®å€éååŠçãšã¯ HTTP1.1ã®1ã€ã®ãªã¯ãšã¹ããå®äºãããŸã§ã次ã®ãªã¯ãšã¹ããéãããšãã§ããªããšããåé¡ç¹ãHTTP/2ã§ã¯ãªã¯ãšã¹ãã䞊åã«éä¿¡ããããšã§ã¯ãªã¢ã«ããŠããŸãã äžã®å³ã®ããã«ãHTTP/2ã§ã¯1ã€ã®ã³ãã¯ã·ã§ã³äžã§è€æ°äžŠåã«æ±ãããšãå¯èœã«ãªããŸããã ãã®åé¡ã解決ããããšæ¬¡ã®å³ã®ããã«ãããŒãžãèªã¿èŸŒã¿å®äº(onLoad)ããããŸã§ã®æéãççž®ãããŸãã ããã«ã次ã®å³ã¯ãåŒç€Ÿãéå¶ããŠãããããWebãµã€ãã®HTTP/2ã§ã®ãªãœãŒã¹ã®ãªã¯ãšã¹ãã®æ§åã§ãã HTTP1.1ãšæ¯èŒããŠããã ããšããå¹çããã1床ã«ããã€ãã®ãªãœãŒã¹ããªã¯ãšã¹ããããŠããããåããããã ããããšæããŸãã ã¬ã³ããªã³ã°ãã¹æé©åã«ã€ã㊠HTTP/2ã®ç¹åŸŽããªããšãªãåãã£ãããšæããŸãã®ã§ãããããã¯è¡šç€ºé床ã®åäžã®ãããããå¹ççãªHTML + CSSã®èšèšã«ã€ããŠèããŠãããŸãã HTTP1.1æä»£ã®CSSèšèš HTTP/1.1ã®å Žåã¯äžåºŠã«éä¿¡ã§ããéãéãããŠããã®ã§ã以äžã®ãµã³ãã«ã®ããã«ãªã¯ãšã¹ãæ°ãæžãããããªãã¹ããŸãšããŠãªã¯ãšã¹ããããã®ãäž»æµã§ããã <html> <head> ... <!-- ãªã¯ãšã¹ãæ°åæžã®ããäžã€ã«ãŸãšããcssãã¡ã€ã« --> <link href=âall.cssâ> </head> <body> ... </body> </html> ä»ã«ãCSSã¹ãã©ã€ããªã©ãªã¯ãšã¹ãæ°ãæ¥µåæžãããããªèšèšãããããšããã®ã§ã¯ãªãã§ããããïŒ ããããHTTP/2ã®å Žåã ãšå
è¿°ããããã«äžŠåã§ã®ãªã¯ãšã¹ããå¯èœã«ãªã£ãããããã®ãããªèšèšã¯å¹æçã§ã¯ãããŸããã ãªã¯ãšã¹ãã䞊åã§è¡ããããšããããšã¯ ç¡çã«ãªãœãŒã¹ã1ã€ã«ãŸãšããå¿
èŠããªããªããŸããã ãããç¡çã«1ã€ã«ãŸãšãããã¡ã€ã«ãµã€ãºã倧ããããŠããŸããšã¬ã¹ãã³ã¹ãè¿ã£ãŠããæéãé·ããªãéã«è¡šç€ºé床ãé
ããªã£ãŠããŸããŸãã HTTP/2æä»£ã®CSSèšèš 以äžãèžãŸããŠãå®éã«HTTP/2ã䜿çšããããŒãžã®CSSã«ã€ããŠã§ãã <html> <head> ... <!-- ãããã®cssãã¡ã€ã« --> <link href=âheader.cssâ> <!-- ã¡ã€ã³ã³ã³ãã³ãã®cssãã¡ã€ã« --> <link href=âmain.cssâ> <!-- ããã¿ã®cssãã¡ã€ã« --> <link href=âfooter.cssâ> </head> <body> ... </body> </html> äžèšã®ããã«1ã€ã«ãŸãšããã®ã§ã¯ãªãããªãã¹ã现ããåããããšããã€ã³ãã§ãã å
è¿°ããŠãããã«ããªãœãŒã¹ãç¡çã«ãŸãšããªããŠãããªã£ããšããã®ããã¡ããã§ããã ã³ã³ããŒãã³ãæåãšãã芳ç¹ãããã£ãã·ã¥ãæããããšããæå³ã§ãCSSã®çްååã¯å¿
èŠãšèšããŸãã çµæ äžèšãèžãŸããŠå®éã«ããŒãžã®è¡šç€ºé床ã¯ã©ãå€ããã®ãChromeã®ãããã°ããŒã«ã§æ€èšŒããŠã¿ãŸããã â HTTP1.1 â¡HTTP/2 çç®ãã¹ãã¯æç»ãéå§ããããŸã§ã®æéã§ãã â ã® 1.89s ã«å¯Ÿããâ¡ã¯ 901ms ãšãªã£ãŠãããŸãã æéãçããªãã«ã€ãããŠãŒã¶ã®åŸ
æ©æéãæžããŸãã®ã§è¡šç€ºã®äœæé床ã¯äžæããŠããšèšããã§ãããã ä»åã¯ãããŸã§ãªãœãŒã¹ãå€ããªãããŒãžã§ã®æ€èšŒã«ãªããŸãããããªãœãŒã¹ãæ¯èŒçå€ãå€§èŠæš¡ãªããŒãžã§ããã°ãããå·®ãã€ãã¯ãã§ãã â»ãã®æ€èšŒã¯å·®ãåºããããæå³çã«é
ãã®ãããã¯ãŒã¯ç°å¢ã§è©ŠããŠãããŸãã ãããããªãã§ãããã§ãHTTP/2ã«ããã°è¡šç€ºé床ãéããªãããšèšããããšããã§ã¯ãããŸããã HTTP/2ã¯ãªã¯ãšã¹ãæ°ãå€ããã°å€ãã»ã©å¹æãçºæ®ããŸãã®ã§ã ãããããªã¯ãšã¹ãæ°ããªãœãŒã¹ãå°ãªããµã€ãã§ã¯ããã»ã©å¹æã¯èŠãããªã ã§ãããã ãŸãšã HTTP1.1ã¯1ãã¹ãããšã«1ã€ã®ãªã¯ãšã¹ãããã§ããªã Chromeãªã©ã®ã¢ãã³ãã©ãŠã¶ã§ã¯åæã«éä¿¡ãããªã¯ãšã¹ãã¯6ã€ãŸã§ HTTP/2ã¯è€æ°äžŠåã«ãªã¯ãšã¹ãããããšãå¯èœ HTTP/2ã§ã¯ãªã¯ãšã¹ãã䞊åã§ãªãããããããªãã¹ããªãœãŒã¹ã现ååããŠãã¡ã€ã«ãµã€ãºãå°ãããããšå¹æç ãªã¯ãšã¹ãæ°ããªãœãŒã¹ã®å°ãªããµã€ãã§ã¯å¹æã¯èã ãŸããæ¬æ¥ã¯è§ŠããŠãããŸããããHTTP/2ã§ã¯ãªã¯ãšã¹ãã®ãã©ã€ãªãªãã£ãæå®ã§ããŸãã ã§ãã®ã§ãåªå
床ã®é«ããªãœãŒã¹ããå
ã«ãªã¯ãšã¹ãããããšãå¯èœã«ãªããŸããã HTTP/2ã®ãã©ã€ãªãªãã£å¶åŸ¡ã«ã€ã㊠å ããŠãããŒãžã®è¡šç€ºé床ãåäžãããã«ã¯CSSãããã«æ©ãè¿ããŠããããããéµãšãªããŸãã ã§ãã®ã§å€éšãã¡ã€ã«ãèªã¿èŸŒãã®ã§ã¯ãªããHTMLå
ã«çŽæ¥CSSãã€ã³ã©ã€ã³åããã¬ã³ããªã³ã°ãŸã§ã®æéããªãããŠããŸãã®ã广çã§ãã ã€ã³ã©ã€ã³åããéã¯ããã£ããèšèšãããŠããªããšã¡ã³ããã³ã¹ã倧å€ã«ãªãããã§ãããããããWebãµã€ããä»åŸå¢ããŠããã®ã§ã¯ãªãã§ããããã ããŸã Chrome Canaryã® chrome://flags ã®ã©ã³ã¿ã€ã ãã©ã°ã®äžã« Experimental Web Platform features ãšããã®ãããã ãã®ãã©ã°ãONã«ããã°CSS in body ã詊ãããšãã§ããŸãã CSS in bodyã«ããæã®ã¡ãªããã¯ä»¥äžã ç¡é§ãªCSSã®èªã¿èŸŒã¿ãåŸ
ãããšãã¬ã³ããªã³ã°ãå¯èœã«ãªãã®ã§ãšãŠãå¹çç å
šãŠã®CSSãèªã¿èŸŒãã§ããäžæ°ã«ã¬ã³ããªã³ã°ãšããããšããªããªããæºåãã§ãããã®ããå°ããã€è¡šç€ºãããã®ã§è¡šç€ºã®äœæé床ã¯åäžãã <html> <head> ... </head> <body> <!-- ãããã®cssãã¡ã€ã« --> <link href=âheader.cssâ> <header> ... </header> <!-- ã¡ã€ã³ã³ã³ãã³ãã®cssãã¡ã€ã« --> <link href=âmain.cssâ> <main> ... </main> <!-- ããã¿ã®cssãã¡ã€ã« --> <link href=âfooter.cssâ> <footer> ... </footer> </body> </html> äžèšã®èšèšã§ããã°ãããããå¿
èŠãªCSSãèªã¿èŸŒãŸããçŽåŸã«ã¬ã³ããªã³ã°ãéå§ãããŸãã äžèŠãªCSSã®èªã¿èŸŒã¿ãç¡é§ã«åŸ
ã£ããããŸããã®ã§ã衚瀺é床ãé£èºçã«åäžããŸãã ãã®CSS in Bodyã以äžã®HTMLã§å®éã«æ€èšŒããŠã¿ãŸããã ã»HTML <html> <head> ... </head> <body> <link href=âreset.min.cssâ> <link href=âdefinition.min.cssâ> <!-- ãããã®cssãã¡ã€ã« --> <link href=âheader.min.cssâ> <header> ... </header> <!-- ã¡ã€ã³ã³ã³ãã³ãã®cssãã¡ã€ã« --> <link href=âtop_main.min.cssâ> <main> <img src=â101.pngâ> <img src=â211.pngâ> <img src=â600.pngâ> <img src=â100.pngâ> <img src=â500.pngâ> <img src=â200.png"> </main> <!-- weeklyã®cssãã¡ã€ã« --> <link href=âweekly.min.cssâ> <div> <img src=â202.pngâ> <img src=â101.pngâ> <img src=â201.pngâ> </div> </body> </html> ã»ãªã¯ãšã¹ãã®æ§å top_main.min.css ãèªã¿èŸŒãã åŸã«ã <main> ã®äžã®ç»åãèªã¿èŸŒãã§ããŸããã ããã«ã <main> ã®ã¬ã³ããªã³ã°ãçµããã°æ¬¡ã«ãã weekly.min.css ãèªã¿èŸŒãã§ããŸãã®ã§ãå¿
èŠãªCSSãèªã¿èŸŒãã åŸã«ã¬ã³ããªã³ã°ããããŠããã®ãåãããŸãã ã»æç»ã®æ§å ãŸãšããŠã¬ã³ããªã³ã°ãããããšã¯ãªãã <header> ããåªå
ããŠã¬ã³ããªã³ã°ãããŠããã®ã確èªã§ããŸãã®ã§ãã¬ã³ããªã³ã°ãã¹ã®æé©åããããŠãããšãããã§ãããã æ¬æ¥ã¯ä»¥äžãšãªããŸããããããšãããããŸããã åè : https://jakearchibald.com/2016/link-in-body/
ããã«ã¡ã¯ãå¶äœéšã®è
éšã§ãã ä»åã¯ããµãŒãã¹æšªæã§ã®Webããã©ãŒãã³ã¹æ¹åã1幎éç¶ããäžã§ææšãšããŠSpeed Indexãæ¡çšããæ¯ãè¿ããæžãæ®ããŠããããšæããŸãã Speed Indexãšã¯ æéããšã®æç»é¢ç©ã§ç®åºãããå€ã§ãäœæéåºŠã®ææšãšããŠåèã«ããããšãã§ããŸãã UXåäžãšããŠã®Webããã©ãŒãã³ã¹æ¹åãèããæã«ãä»ã®ææšããã圹ã«ç«ã¡ãŸãã DOMContentLoadedãwindow.onloadãFirst Paintãšãã£ãããã€ãã®ææšã¯ãããŸã§èª¬æå€æ°ã§ãSpeed Indexãç®ç倿°ã«ãªããšèããŠããŸãã äœæé床ã«ãããç®ç倿°ãæç¢ºã«ãªãããšã§ã宿œãã¹ãæœç(ã¯ãªãã£ã«ã«ã¬ã³ããªã³ã°ãã¹ãªã©)ã«ãã©ãŒã«ã¹ããããšãã§ããããã«ãªããŸãã â»Speed Indexã®è©³ããç®åºæ¹æ³ã«ã€ããŠã¯ä»¥äžããŒãžãåèã«ãªããŸãã Speed Index - WebPagetest Documentation Speed Index â how it works and what it means - NCC Group æ¹åã®é²ãæ¹ 1. æ°å€ãå®éåãã Speed Indexãçµ±èšçãªå®éããŒã¿ã«ããäžã§ãæç³»åã®è»žã§ä»ã®ããŒã¿ãšæ¯èŒã§ããããã«ããŸãã ããã«ãã£ãŠãæ°å€ããããã¡ã¯ãããšããŠæ±ããããã«ãªããŸãã æ°å€ã®åŠ¥åœæ§ãèšãããã«ããã¹ãã°ã©ã ãåãããŠç¢ºèªã§ããããã«ãããšè¯ããšæããŸãã 2. æ¯èŒã®ããã®ãã³ãããŒã¯ããšã é床ãšã¯çžå¯Ÿçãªå€ã§ãã®ã§ãæ¯èŒã®ããã«åãæ¡ä»¶ã§ãã³ãããŒã¯ãè€æ°åãçžå¯Ÿè©äŸ¡ãã§ããããã«ããŸãã ããã§éãã»é
ãã®å€æãã§ããããã«ãªããŸãã 3. æ¹åããŠå¹æã枬ã ãã³ãããŒã¯ãšæ¯èŒããçµæé
ããã°ããã¡ãŒã¹ããã¥ãŒã«ãã©ãŒã«ã¹ããŠæç»ããããã¯ããèŠå ããªããã調ã¹ããã®ããã«ããã¯ã«å¯ŸããŠæ¹åãè¡ããŸãã ãã®åŸãå®éããŒã¿(çµ±èšé)ãååŸæ¯èŒããŠæœçã®è©äŸ¡ãè¡ããŸãã ãã®ç¹°ãè¿ãã§PDCAãµã€ã¯ã«ãåããŠãããŸãã Speed Indexã®çæ³å€ èšæž¬æ¡ä»¶ãèšæž¬å¯Ÿè±¡ã®UIãããã¯èšæž¬æã®ãããã¯ãŒã¯åœ±é¿ã«ãã£ãŠå·®ãåºãŠããŸãããå³å¯ãªçµ¶å¯Ÿå€ã¯åºããŸããããããã€ãåèã«ãªãå€ã¯ãããŸãã ã»HTTP Archive Big Queryã®PublicãªããŒã¿ã»ããã«HTTP Archiveã®ããŒã¿ãä¿åãããŠãããããæ°åäžä»¶ã®èšæž¬ããŒã¿ããä»»æã®çµ±èšéãååŸããããšãã§ããŸãã äŸãã°ä»¥äžã®ãããªã¯ãšãªãå©ãããšã§ãSpeed Indexã®äžå€®å€ãååŸã§ããŸãã ã¯ãšãª SELECT NTH(501, quantiles(SpeedIndex,1001)) pages_mobile_speedindex_median, FROM [httparchive:runs.2017_09_01_pages_mobile] SELECT NTH(501, quantiles(SpeedIndex,1001)) pages_speed_index_median, FROM [httparchive:runs.2017_09_01_pages] å®è¡çµæ 2017幎9æ1æ¥ã®èšæž¬(46äžä»¶)ã«ãããSpeed Indexã®äžå€®å€ã¯ã¢ãã€ã«ãµã€ãã§8,025ããã¹ã¯ããããµã€ãã§3,800ãšãªããŸããã ã¢ãã€ã«ãµã€ãã®æ¹ãSpeed Indexãé«ããªãåŸåã«ããã®ã§ãç®æšãšããå€ã¯Viewportã§åããŠèããå¿
èŠãããããã§ãã â» HTTP Archiveã¯äžçäžã®ãµã€ããèšæž¬ããŠããããããããã¯ãŒã¯(RTT)ã®åœ±é¿ãåããŠæ°å€ãé«ãç¶æ
ã«ãªã£ãŠãããšæããŸãã åèURLïŒ HTTP Archive + BigQuery = Web Performance Answers - igvita.com ã»Google Adsense, Double Click by Google Adsenseã®ããã°ãDouble Clickã®è³æã§ã¯Speed Indexãžã®èšåããããç®æãã¹ãæ°å€ãšããŠ3,000以äžãšèšèŒãããŠããŸãã Webpagetest provides a Speed Index that indicates the average time at which visible parts of the page are displayed. Aim for a Speed Index of 3,000 or less and load time of 3 seconds or less â ideally 1-3 seconds.2 5 steps to improve Page Speed and boost page performance ã»ã¢ãã€ã«ãµã€ãèªå®è³æ Œ Google Partnersã®ã¢ãã€ã«ãµã€ãèªå®è³æ Œã«ã¯ Speed Indexã®ã¹ã³ã¢ã®ç®æšå€ã«é¢ããåé¡ãåºãŠããŸãã 詊éšå¯Ÿçã¬ã€ãã«ã¯ ç§ãã¡ã®ç®æšã¯ãã¹ã³ã¢ã 3,000ãäžåãããšã§ãã 2.1.3 ç®æšå€ã®èšå® - Google Partners ãã«ã ãšèšèŒãããŠããŠè§£çæ¬ã«ã 5,000æªæºãšããéžæé
ç®ãçšæãããŠããã®ã§ãæäœã§ã5,000æªæºãçæ³ã¯3,000æªæºãšããè§£éãã§ãããã§ãã ã»æžç±ïŒããã©ãŒãã³ã¹åäžã®ããã®ãã¶ã€ã³èšèš ãªã©ã€ãªãŒã»ãžã£ãã³ããåºçãããŠãã" ããã©ãŒãã³ã¹åäžã®ããã®ãã¶ã€ã³èšèš (Designing for Performance)“ã§ã¯ãSpeed Indexã®æ°å€ã«ã€ããŠèšåããããŸãã Table 5-1. Example responsive web design budget Measure Goal Speed Index 1,000 Designing for Performance "Example"ãšãªã£ãŠããã®ã§ãæ°å€ã«æ ¹æ ã¯ãªããšæãããã§ãã»ã»ã ã»NCC Groupã®ãã³ãããŒã¯ ã»ãã¥ãªãã£äŒæ¥ã®NCC Groupã®èšäºã«ããã°ãè±åœã®å°å£²åº(äžäœ50äœ)ã®ãã³ãããŒã¯ã¯äžå€®å€ã3,106(垯å:8Mbps)ã ã£ã ãšã®ããšã§ãã in a recent test of top 50 UK retailer home pages (tested in Performance Analyser with Internet Explorer 11 at 8Mbps), the best Speed Index score was 819. The average was 3,658 (median 3,106), while the poorest had a score of 8,582 Speed Index â how it works and what it means ã»Lighthouse Chrome Developer Toolsã®Auditsã«ãŠããã©ãŒãã³ã¹èšºæããããšLighthouseã䜿ã£ãåæãå¯èœã§ãã å®è¡çµæãšããŠSpeed Indexã®å€ã衚瀺ãããŸãããç®æšã®æ°å€ãšããŠã¯ [< 1,250] ãšãªã£ãŠããŸãã Chromeã®ãœãŒã¹ã³ãŒãã«ã¯ä»¥äžã®ãããªã³ã¡ã³ãã¢ãŠãã®èšè¿°ããããäžå€®å€ã5,500ãšæ³å®ããŠããæš¡æ§ã§ãã // 10th Percentile = 2,240 // 25th Percentile = 3,430 // Median = 5,500 // 75th Percentile = 8,820 // 95th Percentile = 17,400 åèURLïŒ https://github.com/GoogleChrome/lighthouse/blob/v2.4.0/lighthouse-core/audits/speed-index-metric.js#L62 ã»medibaéå¶ã®ãµãŒãã¹ ç§ãã¡ãèšæž¬ããŠããè€æ°ã®ã¢ãã€ã«ãµã€ãã®ãã³ãããŒã¯ã¯ä»¥äžã®ããã«ãªããŸããã(2016幎12æã2017幎8æ) èšæž¬æŠèŠ é
ç® å
容 ããŒã« WebpageTest å°ç¹ EC2 north-west1 Viewport iPhone5c 垯å/RTT Mobile3GFast(1.6Mbps/768Kbps 150msRTT) æ°å€ã®ç®åºæ¹æ³ 1æ¥12åèšæž¬ããäžã§æåäœã§ã®äžå€®å€ãååŸ èšæž¬çµæ èšæž¬å¯Ÿè±¡ æ¯æã®äžå€®å€ã®å¹³å A 3,452 B 4,276 C 4,808 D 5,330 E 5,756 F 6,098 â»Dã»Eã¯åæçãªA/Bãã¹ãããŒã«ã®èªã¿èŸŒã¿(HTMLããŒã¹ã®ããããã³ã°)ããããFã¯ãã¡ãŒã¹ããã¥ãŒã«ã«ã«ãŒã»ã«UIãååšããŠããããããããåæ ããŠæ°å€ãé«ããªã£ãŠããŸãã æèŠçã«ãã¬ã³ããªã³ã°ããããã¯ããèŠçŽ ããªããã°(ããã«ããã¯ããªããã°)ã5,000以äžã®æ°å€ãåºãã ãšããå°è±¡ã§ãã ãããŠLighthouseã®5,500ãšããäžå€®å€ãèæèŠãšããŠã¯åŠ¥åœã«æããŸãã ãã®ãããmedibaã§ã¯5,000ãéŸå€ãšããŠããã©ãŒãã³ã¹æ¹åã«åãçµãã§ããŸãã 6,000ãè¶
ããŠãããããªç¶æ³ã§ã¯ãäœæé床ãé
ããæ¹åã®äœå°ãããããšãã£ããã£ãã倿ãããŠããŸãã Speed Indexãåãå
¥ãããã€ã³ã 1. ãã£ããæãã Speed Indexã¯æç»ã®é¢ç©ã§ç®åºããããããã¡ãŒã¹ããã¥ãŒã«èªåéãã®ã«ã«ãŒã»ã«ãååšããŠããããããŒåºåããã£ããããå Žåã¯äžå©ã«ãªãäºããããŸãã éã«ç»åã®å°ãªãããã¹ãããŒã¹ã®ãã¶ã€ã³ã§ããã°æå©ã«ãªããŸãã ãã äœæé床ãšããæå³ã§ã¯ããæå³åŠ¥åœã§ãããä»ã®ãã³ãããŒã¯ãšæ¯èŒã¯ã§ããªããšããŠãåäžèšæž¬å¯Ÿè±¡ã§ã®æ¯èŒãšããŠã¯æçšã ãšæããŸãã ãã®ãããå³å¯ããæ±ããããçšåºŠã®ããã£ããæãããã£ãŠåãå
¥ãããšè¯ããšæããŸãã 2. ä»ã®ææšã䜿ã£ãŠæ¹åãã Speed Indexã¯ãããŸã§çµæãšããŠã®æ°å€(ç®ç倿°)ãªã®ã§ãäœãã¢ã¯ã·ã§ã³ãèµ·ããããã«ã¯ãTTFBãfirstPaintãDOMContentLoadedãªã©ã®ä»ã®ææš(説æå€æ°)ãå¿
èŠã«ãªããŸãã ãŸãonLoadã¯å€ãææšãšèšããããããäºããããŸãããonLoadãé
ãå Žåã¯ãã©ãŠã¶ã®ã€ã³ãžã±ãŒã¿ã®è¡šç€ºæéãå¢ãããããäœæé床ãžã®ãã€ãã¹åœ±é¿ããããŸãã ãã®ããææ©çãªèªã¿èŸŒã¿ãäžèŠãªãµãŒãããŒãã£çµ¡ã¿ã®ãªã¯ãšã¹ãã®åé€ãªã©ãonLoadã®æé©åãå¿
èŠã ãšæããŸãã Speed Indexã¯ä»ã®ææšã代æ¿ããããã§ã¯ãªããçžäºçã«è£å®ããŠããã€ã¡ãŒãžã§ãã 3. ããžã¥ã¢ã©ã€ãºãã Speed Indexã®æ¹åå¹
ãæ°å€ã§å
±æããŠãããªããªãçžæã«æå³ãäŒããã¥ãããšæããŸãã ãã®ãããæ°å€(äžå€®å€)ãè¿ããã®åå£«ã®æ¯èŒåç»ãWebPagetestäžã§äœæããæ°åãšåãããŠå±éãããšèŠèŠçã«ããããããããã³ãã¥ãã±ãŒã·ã§ã³ãã¹ã ãŒãºã«ãªããšæããŸãã é床æ¹åã®ãããã£ãã ããã©ãŒãã³ã¹æ¹åã«ãããã³ã¹ãã«å¯ŸããŠãã©ããã£ããããã£ãããæåŸ
ã§ãããã®èª¬æã«æ©ãããšã¯åžžã«ãããšæããŸãã ãéãæ¹ããããã®ã¯ééããªãã§ãããããã ãã§ã¯ååãåŸãäºãé£ããã§ãã å€ãã®äººãçŽåŸã§ãã説æãå¿
èŠã«ãªãã®ã§ããããã®äžã€ãšããŠãããã©ãŒãã³ã¹æ¹åã¯åž¯åã®å質ãäœãã»ã©å¹æã倧ããããšããããšãæãããããšæã£ãŠããŸãã æè¿ã®ããŒã¿å¥çŽã¯å®¹éã«äžéïŒãšè¶
ããå Žåã®éä¿¡å¶éïŒãããããšãã»ãšãã©ã§ãã MVNOã®åžå Žã·ã§ã¢ã䌞ã³ãŠããŠããŸãããäºæ¥è
ã«ãã£ãŠã¯ç¯çŽã¢ãŒã(äžãå¶é)ã®ã¹ã€ãããçšæããŠããã±ãŒã¹ããããŸãã ã€ãŸãåœå
ã®éä¿¡ç°å¢ã«ã倿§æ§ãããããããŒãã³ããçãããªãã®ã§ãéä¿¡é床ãéããã倧äžå€«ããšããããã§ããªãããã§ãã ãšããããã§ããããŒãã³ããèæ
®ãããšãã«ãUXãšããŠã®ãšã³ã²ãŒãžã¡ã³ãè²¢ç®ãäºæ¥ææšãžã®æåŸ
ãã§ãããšæã£ãŠããŸãã â» rtt attribute ãã¢ãã€ã«ã®Chromeã«ãå®è£
ãããããRUMãšããŠåéããã®ãé¢çœããã§ãã ãããã« Speed Indexã䜿ã£ãŠããã«ããã¯ã«ãã©ãŒã«ã¹ããããšã§ãããã©ãŒãã³ã¹æ¹åãã·ã³ãã«ã«èããããšãã§ãããšæããŸãã äŸãã°ãããã«ããã¯ã«ã¯ä»¥äžã®ãããªãã®ãæããããŸãã CSSãã¡ã€ã«ã®è¥å€§å åæçãªScriptèªã¿èŸŒã¿ã«ããHTMLããŒã¹ã®ããã㯠å§çž®ãæå¹ã«ãªã£ãŠããªã 巚倧ãªCSS Spriteç»åã®èªã¿èŸŒã¿ HTTP/1.1ã§ã®åææ¥ç¶æ°å¶é ãã£ãã·ã¥ã®èšèšã®åé¡ ã©ããé£ããããšã§ã¯ãªã解決ã®ããã®ã³ã¹ããäœãã§ããããµãŒãããŒãã£ã®ãªãœãŒã¹ãå«ããŠããã®ããããã課é¡ãšããŠèŠã€ããäºãå€ãã§ãã ãããŠã©ãããããã¯ãŒã¯(RTT)圱é¿ã倧ããåãããããRTTçã«äžå©ãªã¢ãã€ã«ãããã¯ãŒã¯ã§ã¯ããããããäœæé床ãäžããããšãã§ããŸããã Speed Indexã¯ç²ŸåºŠãé«ããªããããããŸãããã[äœæé床ãé
ããã©ãã]ãææ¡ã次ã®ã¢ã¯ã·ã§ã³ã«ç¹ããäºãã§ãããããããè¯ãã¢ãã€ã«UXãæäŸã§ããææšã ãšæã£ãŠããŸãã
ããã«ã¡ã¯ãAWS Lambda ãšæ¯ããæ¥ã
ãéãããŠããã€ã³ãã©ã¹ãã©ã¯ãã£ãŒéšã®æ²Œæ²¢ã§ãã ã¿ãªãããAWS Lambda 䜿ã£ãŠããŸããïŒ Lambda ã§ã¯ CloudWatch Logs ã« /aws/lambda/颿°å ãšãããã°ã°ã«ãŒãåã§ãã°ãåºåããããšãã§ããŸããã Lambda@Edge ã§ãåãããã«ãã°ãåºåããããšæã£ãã®ã§ããããã°ã°ã«ãŒããèŠã€ãããå°ã£ãã®ã§åãããã«å°ã£ãŠã人ã®å©ãã«ãªãã°å¹žãã§ãã çµè« 以äžã®å
¬åŒããã¥ã¡ã³ããèŠããšã¡ãããšæžããŠãããŸãã Lambda 颿°ã® CloudWatch ã¡ããªã¯ã¹ãš CloudWatch Logs - Amazon CloudFront 以äžåŒçšã§ãã Lambda ã¯ã颿°ãå®è¡ãããå Žæã«æãè¿ã CloudWatch Logs ãªãŒãžã§ã³ã§ CloudWatch Logs ãã°ã¹ããªãŒã ãäœæããŸããåãã°ã¹ããªãŒã ã®ååã®åœ¢åŒã¯ã/aws/lambda/us-east-1.function-name ã§ãã ã€ãŸããæ¥æ¬ã§ CloudFront ã«ã¢ã¯ã»ã¹ã㊠Lambda@Edge ãåäœãããå Žåã¯æ±äº¬ãªãŒãžã§ã³è¿èŸºã®ãšããžãã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ãããã®ã§ãæ±äº¬ãªãŒãžã§ã³ã® CloudWatch Logs ã«åºåãããŸãã Lambda@Edge ã§ã¯é¢æ°èªäœã¯ããŒãžãã¢ãªãŒãžã§ã³ã«äœæããå¿
èŠãããããããŠã£ãããã°ãããŒãžãã¢ãªãŒãžã§ã³ã® CloudWatch Logs ã«åºåãããããšã®æã蟌ãã§ããŸããã ãã®ãããæå㯠Lambda@Edge ã§ã¯ãã°ãåºããªãã®ããšæã£ãŠããŸããŸããããç¡äºã«çºèŠããããšãã§ããŸããã å°ã£ãŠããããã¥ã¡ã³ããèŠããšããçãä»ããŠãããããå°ãããã£ããšããã話ã§ããã å
¬åŒããã¥ã¡ã³ãã¯ã¡ãããšèŠãŸãããã(èªæ)
ããã«ã¡ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ãŒéšã®æ²Œæ²¢ã§ãã 以åã Lambda@Edge ã䜿ã£ãŠããã€ã¹å€å®ãããèšäºãæžããŸããããæè¿ Lambda@Edge ãæ£åŒãªãªãŒã¹ãããã®ã§ãæ£åŒçã§ã®æ€èšŒã宿œããŠã¿ãŸãã ä»¥åæžããèšäºã¯ãã¡ã Lambda@Edge ã§ããã€ã¹å€å®ããã | mediba Creator à Engineer Blog æŠèŠ ä»åããååãšåãããã«ä»¥äžã®å€å®ãã§ããããã«ããŸãã iPhone iPad Android äžèšä»¥å€(Other) CloudFront ã®èšå®ãååãšåããã Viewer Request ã« Lambda@Edge ãå®çŸ©ããŸãã ãã£ãŠã¿ã ãªãªãžã³ãµãŒããŒçžåœã® EC2(nginx) ãçšæ ååãšåæ§ã®æé ãªã®ã§å²æããŸãã nginx ã®ã¢ã¯ã»ã¹ãã°ãã«ã¹ã¿ãã€ãº ãã¡ããååãšåæ§ã®æé ãªã®ã§å²æããŸãã ãã ããä»å㯠“X-Custom-Device” ãšããããããŒåã«ããŠããããããã ã倿ŽããŸãããã Lambda ãã¡ã³ã¯ã·ã§ã³ãçšæ Lambda@Edge ã®ãã¡ã³ã¯ã·ã§ã³äœæã«ã€ããŠã¯ãã¡ãã®å
¬åŒããã¥ã¡ã³ããåèã«ãªããŸãã AWS Lambda@Edge - AWS Lambda Preview ã®æã¯æ±äº¬ãªãŒãžã§ã³ã§äœã£ãŠãåäœããŸããããæ£åŒçã® Lambda@Edge ã¯ã ããŒãžãã¢ãªãŒãžã§ã³ã§äœæããå¿
èŠããããããå¿
ãããŒãžãã¢ãªãŒãžã§ã³(us-east-1)ã§äœæããŸãããã Lambda 颿°ã®äœæ èšèšå³ã®éžæ: ãã©ã³ã¯é¢æ° ããªã¬ãŒã®èšå®: (äœã倿Žãã) æ¬¡ãž é¢æ°ã®èšå® åå: device_judge_test 説æ: device judge ã©ã³ã¿ã€ã : Node.js 6.10 (âããã¯Previewæã¯ Edge Node.js 4.3 ã§ãã) Lambda 颿°ã®ã³ãŒã ã³ãŒã ãšã³ã㪠ã¿ã€ã: ã³ãŒããã€ã³ã©ã€ã³ã§ç·šé 以äžã®ã³ãŒããå
¥å 'use strict'; exports.handler = (event, context, callback) => { const customHeaderName = 'X-Custom-Device'; const uaHeaderName = 'User-Agent'; const request = event.Records[0].cf.request; const headers = request.headers; if (headers[uaHeaderName.toLowerCase()]) { const device = { "key": customHeaderName, "value": headers[uaHeaderName.toLowerCase()][0]['value'].match(/(Android|iPhone|iPad)/)? RegExp.$1: 'Other' }; headers[customHeaderName.toLowerCase()] = [ device ]; } callback(null, request); }; Lambda 颿°ãã³ãã©ããã³ããŒã« ãã³ãã©: index.handler ããŒã«: ãã³ãã¬ãŒãããæ°ããããŒã«ãäœæ ããŒã«å: lambda_edge_execute_role ããªã·ãŒãã³ãã¬ãŒã: åºæ¬ç㪠ãšããž Lambda ã®ã¢ã¯ã»ã¹æš©é 颿°ã®ãã¹ãã¯ããµã³ãã«ã€ãã³ããã³ãã¬ãŒãã® “CloudFront AB Test” ãéžæããŠãUserâAgent ã®å€ã ãæžãæããŠå®æœãããšè¯ã äœæå®äºåŸã以äžã®æé ã§ Lambda 颿°ã®æ°ããããŒãžã§ã³ãçºè¡ CloudFront Web Distribution ãçšæ 以äžã®éãèšå®ããŠãããŸãã äœæåŸãStatus ã Deployed ã«ãªããŸã§åŸ
ã¡ãCloudFront ã® Domain Name (xxxx.cloudfront.net) ã«ã¢ã¯ã»ã¹ããéã« nginx ã®ããã©ã«ãããŒãžã衚瀺ãããã°æºå㯠OK ã§ãã åäœæ€èšŒ ä»åã®æ€èšŒã§æåŸ
ããåäœã¯ããX-Custom-Device ãåããªã¯ãšã¹ãã¯ã30 ç§é(Age ã 30 ã«ãªããŸã§)ã¯ãªãªãžã³åŽã® nginx ã«ã¢ã¯ã»ã¹ã¯æ¥ããCloudFront ããã£ãã·ã¥ãè¿ãããšãã§ãã ããã確èªããããã以äžã®ã³ãã³ããæµããŠç¢ºèªããŸãã(MacOS åã) ua_list=("{å€å®ããããUAæåå1}" "{å€å®ããããUAæåå2}" "{å€å®ããããUAæåå3}" "{å€å®ããããUAæåå4}" ...) i=0 v=0 while : do curl -i -s -H "User-Agent:${ua_list[$v]} ${i}" http://**************.cloudfront.net/ | egrep "^(HTTP|X-Cache|Age)" echo "" sleep 0.85 i=$(( i + 1 )) if [ $v == `expr ${#ua_list[*]} - 1` ]; then v=0 else v=$(( v + 1 )) fi done ãã®ã³ãã³ãã«å User-Agent ãèšå®ããŠã¢ã¯ã»ã¹ããnginx ã®ã¢ã¯ã»ã¹ãã°ã確èªããŸãã ã€ã³ã¯ãªã¡ã³ãããæ°åãæåŸã«ä»äžããŠããã®ã¯ãUser-Agent ãå€ãã£ãŠãããã€ã¹å€å®çµæ( X-Custom-Device )ãåãå Žåã«ã¯ãªãªãžã³ã«ã¢ã¯ã»ã¹ãæ¥ãªãããšã確èªããããã§ãã “ãã®ä»” å€å® “ãã®ä»” ãå€å®ããããããGoogle Chrome ã® User-Agent (以äž)ã§ã¢ã¯ã»ã¹ããŠã¿ãŸãã User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 ã³ãã³ãå®è¡çµæã¯ä»¥äžã HTTP/1.1 200 OK X-Cache: Miss from cloudfront â ååã¢ã¯ã»ã¹ãªã®ã§ Miss HTTP/1.1 200 OK Age: 1 X-Cache: Hit from cloudfront â 2åç®ä»¥é㯠User-Agent ãç°ãªã£ãŠã iPhone å€å®ãªã®ã§ Hit ãããäžç¥ããã HTTP/1.1 200 OK Age: 29 X-Cache: Hit from cloudfront â Age: 29 ãŸã§ã¯ Hit HTTP/1.1 200 OK X-Cache: RefreshHit from cloudfront â Age: 30 ãè¿ããé ã« RefreshHit HTTP/1.1 200 OK Age: 1 X-Cache: Hit from cloudfront â RefreshHit 以éã¯ãŸã Age:30 ã«ãªããŸã§ Hit èšé²ããã nginx ã¢ã¯ã»ã¹ãã°ã¯ä»¥äžã ***.***.***.*** - - [07/Aug/2017:16:25:02 +0900] "GET / HTTP/1.1" 200 3770 "-" "Amazon CloudFront" "***.***.***.***" Other ***.***.***.*** - - [07/Aug/2017:16:25:32 +0900] "GET / HTTP/1.1" 304 0 "-" "Amazon CloudFront" "***.***.***.***" Other ç¡äºã«æ«å°Ÿã« “Other” ãèšé²ãããæåã« “Other” å€å®ãããã¢ã¯ã»ã¹ãã30ç§éã¯ã"Other" å€å®ãããä»ã®ã¢ã¯ã»ã¹ã¯ nginx åŽã«ã¯æ¥ãŸããã§ããã “iPhone” å€å® “iPhone” ãå€å®ãããããã以äžã® 4 ã€ã®ããŒãžã§ã³ã® User-Agent ã§é çªã«ã¢ã¯ã»ã¹ãç¹°ãè¿ããŠã¿ãŸãã iOS 10 Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.0 Mobile/14F89 Safari/602.1 iOS 9 Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_5 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G36 Safari/601.1 iOS 8 Mozilla /5.0 (iPhone; CPU iPhone OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4 iOS 7 Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 ã³ãã³ãå®è¡çµæã¯ “ãã®ä»” æãšåæ§ãªã®ã§å²æããŸãã èšé²ããã nginx ã¢ã¯ã»ã¹ãã°ã¯ä»¥äžã ***.***.***.*** - - [07/Aug/2017:17:33:36 +0900] "GET / HTTP/1.1" 200 3770 "-" "Amazon CloudFront" "***.***.***.***" iPhone ***.***.***.*** - - [07/Aug/2017:17:34:06 +0900] "GET / HTTP/1.1" 304 0 "-" "Amazon CloudFront" "***.***.***.***" iPhone ç¡äºã«æ«å°Ÿã« “iPhone” ãèšé²ãããæåã« “iPhone” å€å®ãããã¢ã¯ã»ã¹ãã30ç§éã¯ã"iPhone" å€å®ãããä»ã®ã¢ã¯ã»ã¹ã¯ nginx åŽã«ã¯æ¥ãŸããã§ããã “iPad” å€å® “iPad” ãå€å®ãããããã以äžã® 4 ã€ã®ããŒãžã§ã³ã® User-Agent ã§é çªã«ã¢ã¯ã»ã¹ãç¹°ãè¿ããŠã¿ãŸãã iOS 10 Mozilla/5.0 (iPad; CPU OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.0 Mobile/14F91 Safari/602.1 iOS 9 Mozilla/5.0 (iPad; CPU OS 9_3_5 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13G36 Safari/601.1 iOS 8 Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4 iOS 7 Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53 ã³ãã³ãå®è¡çµæã¯ “ãã®ä»” æãšåæ§ãªã®ã§å²æããŸãã èšé²ããã nginx ã¢ã¯ã»ã¹ãã°ã¯ä»¥äžã ***.***.***.*** - - [07/Aug/2017:17:58:10 +0900] "GET / HTTP/1.1" 200 3770 "-" "Amazon CloudFront" "***.***.***.***" iPad ***.***.***.*** - - [07/Aug/2017:17:58:40 +0900] "GET / HTTP/1.1" 304 0 "-" "Amazon CloudFront" "***.***.***.***" iPad ç¡äºã«æ«å°Ÿã« “iPad” ãèšé²ãããæåã« “iPad” å€å®ãããã¢ã¯ã»ã¹ãã30ç§éã¯ã"iPad" å€å®ãããä»ã®ã¢ã¯ã»ã¹ã¯ nginx åŽã«ã¯æ¥ãŸããã§ããã “Android” å€å® “Android” ãå€å®ãããããã以äžã® 4 ã€ã®ããŒãžã§ã³ã® User-Agent ã§é çªã«ã¢ã¯ã»ã¹ãç¹°ãè¿ããŠã¿ãŸãã Android 7 Mozilla/5.0 (Linux; Android 7.0; SCV36 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36 Android 6 Mozilla/5.0 (Linux; Android 6.0.1; SOV34 Build/39.0.C.0.282) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Mobile Safari/537.36 Android 5 Mozilla/5.0 (Linux; Android 5.1.1; SOV32 Build/32.0.D.0.282) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36 Android 4 Mozilla/5.0 (Linux; Android 4.4.4; SOL26 Build/23.0.C.0.296) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36 Android 2 Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; IS12F Build/FGK600) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 ã³ãã³ãå®è¡çµæã¯ “ãã®ä»” æãšåæ§ãªã®ã§å²æããŸãã èšé²ããã nginx ã¢ã¯ã»ã¹ãã°ã¯ä»¥äžã ***.***.***.*** - - [07/Aug/2017:18:11:28 +0900] "GET / HTTP/1.1" 200 3770 "-" "Amazon CloudFront" "***.***.***.***" Android ***.***.***.*** - - [07/Aug/2017:18:11:58 +0900] "GET / HTTP/1.1" 304 0 "-" "Amazon CloudFront" "***.***.***.***" Android ç¡äºã«æ«å°Ÿã« “Android” ãèšé²ãããæåã« “Android” å€å®ãããã¢ã¯ã»ã¹ãã30ç§éã¯ã"Android" å€å®ãããä»ã®ã¢ã¯ã»ã¹ã¯ nginx åŽã«ã¯æ¥ãŸããã§ããã ããããã€ã¹ã®ãã£ãã·ã¥ãããç¶æ
ã§å¥ããã€ã¹å€å®ã®ã¢ã¯ã»ã¹ããã äŸãã° “iPhone” ã®ãã£ãã·ã¥ãããç¶æ
ã§ “Android” ã®ã¢ã¯ã»ã¹ãããå Žåã«ã"iPhone" ã®ãã£ãã·ã¥ãè¿ããããªãªãžã³ã«ã¢ã¯ã»ã¹ãæ¥ããããæ€èšŒããŸãã “iPhone” å€å®ã®ã³ãã³ããå
ã«éå§ãã15ç§åŸã« “Android” å€å®ã®ã³ãã³ããéå§ããŠæ€èšŒã èšé²ããã nginx ã¢ã¯ã»ã¹ãã°ã¯ä»¥äžã ***.***.***.*** - - [07/Aug/2017:18:22:00 +0900] "GET / HTTP/1.1" 304 0 "-" "Amazon CloudFront" "***.***.***.***" iPhone ***.***.***.*** - - [07/Aug/2017:18:22:15 +0900] "GET / HTTP/1.1" 304 0 "-" "Amazon CloudFront" "***.***.***.***" Android ***.***.***.*** - - [07/Aug/2017:18:22:30 +0900] "GET / HTTP/1.1" 304 0 "-" "Amazon CloudFront" "***.***.***.***" iPhone ***.***.***.*** - - [07/Aug/2017:18:22:45 +0900] "GET / HTTP/1.1" 304 0 "-" "Amazon CloudFront" "***.***.***.***" Android 15ç§åŸã« “Android” å€å®ã®ã¢ã¯ã»ã¹ããããããããã30ç§ããšã«ãªãªãžã³ã«ã¢ã¯ã»ã¹ãæ¥ãããšã確èªã§ããŸããã ããšãã ä»åè¡ã£ã CloudFront ã®èšå®äžã¯ãé©åœã«ã¯ãšãªãã©ã¡ãŒã¿ãä»ããããCookie ã倿ŽãããããŠãã1ã€ã® Path ã«å¯ŸããŠã¯ããã€ã¹å€å®çµæ( X-Custom-Device ) ãç°ãªããªãéãåããã£ãã·ã¥ãè¿ããŸãã ãããã®æ€èšŒçµæãŸã§ã¯èŒããŠããŸãããããã®ããšãæèãããšããªãªãžã³ã§å€å®åŠççãããããšç¡ã CloudFront ã® Edge äžã§ãã£ãã·ã¥ã®åäœãã³ã³ãããŒã«ã§ããããšèããããŸãã ãã ããæ¬èšäºå·çæç¹ã§ Lambda@Edge 㯠1ç§ or 3ç§ã®ã¿ã€ã ã¢ãŠã(倿Žäžå¯) ããããããããŸã倧å€ãªåŠçã¯ã§ããªãã®ã§ããªãã¹ãç°¡åãªåŠçã«çããããšã倧äºã§ãã ã¡ãªã¿ã«ãä»åã®ã³ãŒãã§ã¯ãããã1ããªç§ä»¥å
ã§åŠçã§ããŸããã åè: Lambda@Edge ã®å¶é ãŸããä»åã®æ€èšŒã§ã¯ X-Custom-Device ããšã®ã¬ã¹ãã³ã¹åºãåããŸã§ã¯ããŸããã§ãããããã®ä»çµã¿ã䜿ãã° User-Agent ãéããã«ããã€ã¹ããšã«ã¬ã¹ãã³ã¹ãåºãåããããããããã£ãã·ã¥ãããçã®åäžïŒãªãªãžã³ãµãŒããŒã®è² è·è»œæžãã¬ã¹ãã³ã¹é床æ¹åãèŠèŸŒããŸãã Lambda@Edge ã¯ç¡äºã«æ£åŒãªãªãŒã¹ãããã®ã§ãmediba ã§ãã©ãã©ãå°å
¥ããŠããäºå®ã§ãã