æŠèŠ ããã«ã¡ã¯ãã¹ã¿ã³ãã€ã§æ±äººã®åã蟌ã¿ã·ã¹ãã ã®éçºã»éçšãæ
åœããŠããæ± ç°ã§ãã ã¹ã¿ã³ãã€ã§ã¯ãæ±äººããŒã¿ã®ãã¹ã¿ãŒããŒã¿ç®¡çã« Aurora MySQL ã䜿çšããŠããŸãã éçšéå§ãã3幎以äžãçµéãããã®éã«ã·ã¹ãã ã¯æé·ãç¶ããŠããŸããããããã«äŒŽãã³ã¹ããåŸã
ã«å¢å ããŠããŸãããç¹ã«2024幎ã¯åé«ã®åœ±é¿ãçžãŸã£ãŠãAurora MySQL ã®ã€ã³ãã©ã³ã¹ãã¯ããŸããŸã倧ããªèª²é¡ãšãªããŸããã å®ã¯2023幎ã«ããAurora MySQLã®ã³ã¹ãåæžãç®æããå€ãã®ReadæäœãDynamoDBã«ç§»è¡ããããšã§ã倧å¹
ãªåæžã«æåããŸããïŒè©³ãã㯠ãã¡ãã®èšäº ãã芧ãã ããïŒããã®æã«55%ã®ã³ã¹ãåæžãéæããŸãããã2024幎ããããªãæé©åã«ææŠããŸããïŒ ä»åã®ããã°ã§ã¯ã2024幎ã«è¡ã£ãAurora MySQLã®ã³ã¹ãæé©åã®åãçµã¿ãšãã©ã®ããã«ããŠããã«54%ã®åæžãéæããã®ãããã®è©³çްãã玹ä»ããŸãã 宿œããæœçãšçµæ ãŸãå
ã«çµæããã§ããã2024幎3æãš2024幎8æãæ¯èŒããçµæAurora MySQLã®ã€ã³ãã©ã³ã¹ããçŽ54%åæžã§ããŸããã ä»å宿œããæœçãšããã®åæžå²åã®å
èš³ã¯ä»¥äžã®éãã§ãã çªå· æœçæ¡ åæžå²å â Auroraã¯ã©ã¹ã¿ãŒã®ã¬ããªã«ã®å°æ°ãæžãããã€ã³ã¹ã¿ã³ã¹ã¿ã€ããäžãã 9.6 %åæž â¡ Auroraã¯ã©ã¹ã¿ãŒã®åæ§ç¯ã«ãããè¥å€§åãã MySQL ã® ibdata1 ãåé€ 30.5 %åæž ⢠ãªã¶ãŒãã DB ã€ã³ã¹ã¿ã³ã¹ã®è³Œå
¥ 14.1 %åæž 以äžã§ã¯ãããããã®æœçã«ã€ããŠè©³ãã説æããŸãã â Auroraã¯ã©ã¹ã¿ãŒã®ã¬ããªã«å°æ°ãæžãããã€ã³ã¹ã¿ã³ã¹ã¿ã€ããäžãã ã³ã¹ãæé©åã®åã¯ãAuroraã¯ã©ã¹ã¿ãŒã¯6å°ã®ã¬ããªã«ã䜿çšããŠããŸããã ã¬ããªã«ã®ã¡ããªã¯ã¹ãåæãããšãããCPU䜿çšçã«ååãªäœè£ãããããšã倿ããŸãããããã¯ã以å宿œãã察å¿ããéå»1幎ã«ããã仿§å€æŽãªã©ã«ãã£ãŠãã¬ããªã«ãžã®è² è·ã軜æžãããããã ãšèããããŸããããã§ãã¬ããªã«å°æ°ã®åæžãšã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã®å€æŽã«ã€ããŠæ€èšããŸããã ãã ããã³ã¹ãåæžã宿œããéãããã©ãŒãã³ã¹ã«æªåœ±é¿ãåºãªãããã«ããããšãæãéèŠã§ãããã®ãããåŠçè² è·ã®ããŒã¯æã§ãCPU䜿çšçã60%ãè¶
ããªãç¯å²ã§ã段éçã«ã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã®å€æŽãšã¬ããªã«å°æ°ã®åæžãé²ããŸããã å
·äœçã«ã¯ãè² è·è©Šéšãäºåã«å®æœããã€ã³ã¹ã¿ã³ã¹ã®å€æŽã段éçã«è¡ãããã®éœåºŠç¶æ³ã芳å¯ããŸããã詳现ãªã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã¯éå
¬éã§ãããã¬ããªã«æ°ã6å°ãã5å°ã«æžãããã€ã³ã¹ã¿ã³ã¹ã¿ã€ããäžæ®µéäžããããšã§ãçŽ 9.6% ã®ã³ã¹ãåæžãéæããŸããã Auroraã¯ã©ã¹ã¿ãŒå
šäœã§ã¯9.6%ã®åæžã§ãããã¬ããªã«ã€ã³ã¹ã¿ã³ã¹ã«é¢ããŠã¯ã 倿Žåã®ã€ã³ã¹ã¿ã³ã¹è²»çšã®çŽååãŸã§åæžã§ããŸãã ã ãªããä»å察象ãšããŠããAurora MySQLã¯ãwrite-heavyãªã¢ããªã±ãŒã·ã§ã³ã§ãããã¡ããªã¯ã¹ã確èªãããšããããã©ã€ããªã€ã³ã¹ã¿ã³ã¹ã«ã¯ã³ã¹ãåæžã®äœå°ãã»ãšãã©ãªããšå€æããŸããã ãã®ããããã©ã€ããªã®ã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã¯æ®ã眮ãããšã«ããŸããã â¡ Auroraã¯ã©ã¹ã¿ãŒã®åæ§ç¯ã«ãããè¥å€§åãã MySQL ã® ibdata1 ãåé€ ä»åã®æœçã®äžã§ããæãæéãããã£ãæœçããã®ãAuroraã¯ã©ã¹ã¿ãŒã®åæ§ç¯ãã§ãã Auroraã®CostExploreã確èªãããšãAuroraã®ã¹ãã¬ãŒãžæéã§ããAurora:StorageUsageãšããææšããããŸãã ãã®Aurora:StorageUsage 㯠Auroraã䜿çšããŠããã¹ãã¬ãŒãžå®¹éãç€ºãææšã§ãå®ããŒã¿ãã€ã³ããã¯ã¹ã ãã§ãªããInnoDBããŒãã«ã®ã¡ã¿ããŒã¿ããããã¡ãUNDOãã°ãªã©ã®ã·ã¹ãã ããŒã¿ãå«ãŸããŠããŸãã ãããã®ç®¡çããŒã¿ã¯ãMySQLã®InnoDBã¹ãã¬ãŒãžãšã³ãžã³ã«ãã£ãŠibdata1ãšãããã¡ã€ã«ã«æ ŒçŽãããŠããŸãããã®ibdata1ãã¡ã€ã«ã¯ã以äžã®ã¯ãšãªã§ç¢ºèªã§ããŸãã mysql> SELECT file_name,tablespace_name,engine,ROUND(SUM(total_extents * extent_size) / (1024 * 1024 * 1024 * 1024), 2) AS "TableSizeinTB" FROM information_schema.FILES WHERE file_name LIKE '%ibdata%'; +-----------+-----------------+--------+---------------+ | file_name | tablespace_name | engine | TableSizeinTB | +-----------+-----------------+--------+---------------+ | ./ibdata1 | innodb_system | InnoDB | 59.87 | +-----------+-----------------+--------+---------------+ 1 row in set (0.03 sec) ã¹ãã¬ãŒãžã«å ããå²åã調æ»ããçµæãibdata1ãã¡ã€ã«ã¯Auroraã䜿çšããŠããã¹ãã¬ãŒãžå®¹éã® 99.97% ãå ããŠããããšãããããŸããã é·æéã«ããããã¹ã¿ã³ãã€ã®æ±äººããŒã¿ã管çããŠããçµæãibdata1ã¯éåžžã«è¥å€§åããŠããã®ã§ãã ã¹ãã¬ãŒãžå®¹éåæžã®ããã«äžèŠãªããŒãã«ãã¬ã³ãŒããåé€ããŸããããibdata1 ã¯ããŒã¿ãåé€ããŠããµã€ãºãæžå°ããªã ãããæ ¹æ¬çãªè§£æ±ºã«ã¯äžåºŠAuroraã¯ã©ã¹ã¿ãŒãåæ§ç¯ããå¿
èŠããããŸããã ãã ããç©çããã¯ã¢ããïŒDB ã¯ã©ã¹ã¿ãŒã¹ãããã·ã§ããçïŒã§ã¯ibdata1ãå«ããŠå
šããŒã¿ã埩å
ãããŠããŸããããã¹ãã¬ãŒãžåæžã®å¹æã¯ãããŸãããããã§ã è«çããã¯ã¢ãã ã䜿çšããŠç§»è¡ããå¿
èŠããããŸãããããããããŒãã«æ°ãã¬ã³ãŒãæ°ãéåžžã«å€ããããç©çããã¯ã¢ããã«æ¯ã¹ãŠæéããããããšãæžå¿µãããŸããã ããã€ãã®æ€èšŒãããçµæã AWS Database Migration Service(DMS) ã䜿çšããããšã§ãããŠã³ã¿ã€ã ãæå°éã«æããªããããŒã¿ç§»è¡ãé²ããããããšãããããŸããã 1 AWS DMS ãå©çšããäžã§ã工倫ããããš AWS DMSã¯ãããŠã³ã¿ã€ã ãæå°éã«æããªããããŒã¿ãç§»è¡ã§ãããããŒãžããµãŒãã¹ã§ãããMySQLãå«ãå€ãã®ããŒã¿ããŒã¹ã«å¯Ÿå¿ããŠããŸãã ãŸãã DBããµãŒãã¹ã€ã³ãããŸãŸç§»è¡ã§ããã ãæåã®èª²é¡ã§ããããããå¯èœã§ããã°ãã»ãŒããŠã³ã¿ã€ã ãªãã§ããŒã¿ç§»è¡ãå®äºããŸããããããDMSã䜿çšããŠæ€èšŒããããšããããã«ããŒãå®äºåŸãã¬ããªã±ãŒã·ã§ã³é
å»¶ãåºããç¶ããåé¡ãçºçããŸããã DMSã¯ãAurora MySQLã®ãã€ããªãã°ãèªã¿åãããšã§å€æŽããã£ããã£ããŸãããä»åã®ããã« æŽæ°é »åºŠãéåžžã«é«ã ã·ã¹ãã ã§ã¯ã CDCãœãŒã¹ã¬ã€ãã³ã·ãŒ ïŒå€æŽããŒã¿ãã£ããã£ã®é
å»¶ïŒãçºçããã¬ããªã±ãŒã·ã§ã³ã远ãã€ããªããªããšããåé¡ã«çŽé¢ããŸããã â²äžèšã®ãã£ãã·ã§ã³ã§äœåºŠãCDCãœãŒã¹ã¬ã€ãã³ã·ãŒãäžãã£ãŠããŸãããããã¯å床ãã«ããŒããããçŽããããã«ãªããŸãã ããã§ãã¬ããªã±ãŒã·ã§ã³ãè¡ãããAurora MySQLã®ãã¹ã¿ãŒæŽæ°ãäžæåæ¢ããŠDMSã®ãã«ããŒããå®è¡ããæ¹éã«å€æŽããŸãããæ€èšŒã®çµæããã¹ã¿ãŒæŽæ°ã忢ããç¶æ
ã§ã®ãã«ããŒãã¯çŽ4æéã§å®äºããããšã確èªãããæŽæ°åæ¢æéã¯èš±å®¹ç¯å²å
ã«æããããèŠèŸŒã¿ãç«ã¡ãŸããã æçµçã«ã¯ç€Ÿå
ã§èª¿æŽãããã¹ã¿ãŒæŽæ°ãçŽ4æé忢ããããšã§ãç¡äºDMSã«ãããã«ããŒã1åã§åæ§ãå®äºãããŸããã Aurora MySQL ã¯ã©ã¹ã¿ãŒåæ§ç¯ã®çµæãšå¹æ ibdata1ã®ãµã€ãºã倧å¹
ã«åæžããçµæãAurora:StorageUsageã®ã³ã¹ã㯠97.7% ãåæžãããŸããã ããã«ã次ã®ãããªå¯æ¬¡ç广ãåŸãããã¹ã¿ã³ãã€ã®ã·ã¹ãã å
šäœã«å¯ŸããŠå€§ããªæ¹åãèŠãããŸããã Aurora MySQLã®ã¯ãšãªã¬ã€ãã³ã·ãŒãæ¹å Aurora MySQLã«æ¥ç¶ããAPIã®å¿çé床ãåäžããŸããã Aurora MySQLã®ããã¯ã¢ããè²»çšã97%äœäž æ¯æ¥ããã¯ã¢ãããååŸããŠããããããã®ã³ã¹ãåæžå¹æã¯éåžžã«å€§ããã§ãã ããã«ãibdata1 ãšçŽæ¥çãªå æé¢ä¿ããªãã®ã§ãããAurora:StorageIOUsage ã®ã³ã¹ãã3æãšæ¯èŒããŠ33%äžãã£ãŠãããŸãããïŒAurora MySQLã®åæžå²åã§13.35% åæžïŒ æç¢ºãªå æé¢ä¿ã¯ããã£ãŠããªãã®ã§ãããStorageUsageãäžãã£ãããšã«å ããã€ã³ã¹ã¿ã³ã¹å°æ°ãæžãããããšããAurora MySQLã®ã¡ãžã£ãŒããŒãžã§ã³ããããããšãªã©ã圱é¿ããŠãããããããŸããã Aurora MySQL ã¯ã©ã¹ã¿ãŒåæ§ç¯ã®æœçã«ãããStorageUsage, StorageIOUsage, BackupUsageã®ã€ã³ãã©è²»çšãåæžãããåèšã§3æã®Auroraã®è²»çšãã 30.5% ã®ã³ã¹ãåæžã«æåããŸããã ãŸããã®æœç以éãã¢ããªã±ãŒã·ã§ã³ã³ãŒãããäžèŠãªãã©ã³ã¶ã¯ã·ã§ã³åŠçãåé€ããibdata1ãè¥å€§åããé床ã倧å¹
ã«èœãšããŸããã â¢ãªã¶ãŒãã DB ã€ã³ã¹ã¿ã³ã¹ã®è³Œå
¥ æåŸã«è¡ã£ãæœçã¯ã ãªã¶ãŒãã DB ã€ã³ã¹ã¿ã³ã¹ã®è³Œå
¥ ã§ãã Amazon Aurora ã®ãªã¶ãŒãã DB ã€ã³ã¹ã¿ã³ã¹ã¯ã1 幎éãŸã㯠3 幎éã®å¥çŽã§ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã¿ã€ããšãªãŒãžã§ã³ãæå®ããŠã€ã³ã¹ã¿ã³ã¹ã®äºçŽè³Œå
¥ããããšã§ããªã³ããã³ãã® DB ã€ã³ã¹ã¿ã³ã¹ã«æ¯ã¹ãŠå€§å¹
ãªå²åŒãé©çšããããã©ã³ã§ãã 詳ããã¯ã Amazon Aurora åããªã¶ãŒãã DB ã€ã³ã¹ã¿ã³ã¹ ã«èšèŒãããŠããŸãã ãªã¶ãŒããã€ã³ã¹ã¿ã³ã¹ã¯è³Œå
¥åŸã«ã€ã³ã¹ã¿ã³ã¹ã¿ã€ãããªãŒãžã§ã³ãæéã®å€æŽã¯äžå¯ãšãªãããæ
éããæ±ããããŸããè€æ°ã¡ã³ããŒã§ä»åŸã®Aurora MySQLã®ãã£ãã·ãã£äºæž¬ã確èªããªãã賌å
¥ãããã©ã³ã®æ€èšãé²ããŸããã ãŸããæ¯æãæ¹æ³ïŒãå
šé¡åæããããäžéšåæããããåæããªããïŒã«ãã£ãŠãå°ãå²åŒçãå€ãã£ãŠãããããæ¯æãæ¹æ³ãå«ããŠç€Ÿå
åæã«ç¢ºèªãšçžè«ããã賌å
¥ãå®äºãããŸããã ãã®æœçã«ãã£ãŠå
šäœã® 14.1% ã®ã³ã¹ãåæžãå®çŸããŸããã æœçã®ãŸãšã ä»åã®èšäºã§åãäžããããšä»¥å€ã«ãããã€ãã³ã¹ãåæžæœçã宿œããŸããããAWSã®Cost ExplorerãæŽ»çšããŠä»®èª¬ãç«ãŠãããã«åºã¥ããæœçã®ç«æ¡ãæ€èšŒã宿œãé²ããããšã§å€§å¹
ãªã³ã¹ãåæžãéæã§ããŸãããç¹ã«ãé·æééçšãããŠããAurora MySQLãåæ§ç¯ããäžèŠãªãã©ã³ã¶ã¯ã·ã§ã³åŠçãèŠçŽãããšã§ã倧ããªã³ã¹ãåæžãå®çŸã§ããããšãå°è±¡çã§ããã ãŸããAuroraã¯ã©ã¹ã¿ãŒã®åæ§ç¯ã«ãã£ãŠãåã«ã³ã¹ãåæžã ãã§ãªããDBã¯ãšãªã®ã¬ã€ãã³ã·ãŒæ¹åãAPIå¿çé床ã®åäžãšãã£ã坿¬¡çãªå¹æãåŸãããŸããã æåŸã« 2023幎ã«Aurora MySQLã®ã€ã³ãã©ã³ã¹ãã55%åæžã§ããŸããããä»åã®åãçµã¿ã§ããã«ã³ã¹ãã54%åæžããæçµçã« Aurora MySQLã®ã€ã³ãã©ã³ã¹ããçŽ1/5ã«ãŸã§äžãããŸããã ïŒéã«èšãã°ãæšå¹ŽãŸã§ã®ã³ã¹ãã¯çŸåšã®5åãããã£ãŠãããšããããšã§ããïŒ ã³ã¹ãæé©åã¯äžåºŠå®æœããŠçµããã§ã¯ãªããç¶ç¶çã«åãçµãã¹ããã® ã§ãããšãæ¹ããŠå®æããŸããããã®ãã宿çã«Cost Explorerã確èªããåæããããšãéèŠããšæããŸãã ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com è«çããã¯ã¢ããã®æ¡ãšããŠãAurora MySQL ãžã®æžã蟌ã¿ã忢ããmysqldump ã§ããŒã¿ããšã¯ã¹ããŒãããæ°èŠäœæãã Aurora MySQL ã¯ã©ã¹ã¿ãŒã«ã€ã³ããŒãããŠåæ§ç¯ããæ¹æ³ãæ€èšããŸããããããããã®æ¹æ³ã§ã¯åæ¢æéã2æ¥ä»¥äžãããèŠèŸŒã¿ã§ãã£ããããäžæ¡çšãšããŸããã ↩
2024幎8æ30æ¥ïŒéïŒå°é¢š10å·ã®äºå ±ãåºãäžã æ®æ®µã¯éããªã¹ã¿ã³ãã€æ¬ç€Ÿããã€ããšéãç±æ°ã«å
ãŸããŸããã 8æ27æ¥ïŒç«ïŒã29æ¥ïŒæšïŒã®éçºæéãçµãŠãæ ªåŒäŒç€Ÿã¹ã¿ã³ãã€ãããã«ãœã³2024ãã®æçµãã¬ãŒã³å€§äŒãéå¬ãããŸããã éçºæéã¯8æéÃ3æ¥ã®24æéã瀟å
å
¬åã«ããéãŸã£ã8ããŒã èš34åã®ã¡ã³ããŒãå
¥è³ãç®æããŠæºåããŸããã éäŒåŒã®æ§å éäŒåŒã§ã¯é嬿ŠèŠã®ã»ãã«ã審æ»å¡ãChatGPTã解説ãã審æ»å¡ç޹ä»ãæ«é²ããã æ°åã®èªã¿æ¹ãªã©ã现ããªãã¹ãé€ãã°å®ç§ãªèª¬æç²ŸåºŠã«ãåå è
ãããããŒã£ïŒããšæå£°ãããããŸããã COOã®ååã¯ãããŸããš ããšããã瀟åã¯ãStanbyããªãã ãã©ã»ã»ã» ãããã«ãœã³2024ã®ããŒãã ä»åã®ããã«ãœã³ã®ããŒãã¯ããæä»£ãšãšãã«å€ãããæ€çŽ¢ãã«æ±äººé åã§åãåããã GenerativeAIãæŽ»çšããŠããããã®ããŒã ãä»äºæ¢ãã«é¢ãã課é¡ãèŠã€ãã解決ã«ã€ãªããã¢ã€ãã£ã¢ãåºãåãã宿©ã§ãã¢ãã§ããã¢ãŠãããããç«¶ããŸããã ãâ
åå ããŒã åïŒããŒã åã®ç±æ¥ïŒãšèª²é¡ / ãœãªã¥ãŒã·ã§ã³ã â
äžèŸ»äºé·¹äžçްã³ïŒã¡ã³ããŒã®é æåãçžèµ·ã®è¯ã圢åŒã§ïŒ 課é¡ïŒä»äºæ¢ããžã®ã¢ããã€ã¹ãåãããã人ã¯ãªããªãããªã ãœãªã¥ãŒã·ã§ã³ïŒèªåã®æ³ããèªç±å
¥åïŒéžæåœ¢åŒã®è¶
ç°¡åãã©ãŒã ã«å
¥åããã ãã§ãæé©ãªä»äºæ¢ããã§ãã â
NAã»KAã»YAã»MAè»å£ïŒäžå±±ãªãŒããŒã®ååç±æ¥ããšæã£ãããã¡ã³ããŒå
šå¡ã®é æåããïŒ èª²é¡ïŒæ€çŽ¢ãªãã©ã·ãŒãäœããèªèº«ã®ä»äºã®é©æ£ãããããªãããã«ã·ãã¢å±€ãæããã ãœãªã¥ãŒã·ã§ã³ïŒå±¥æŽæžãã¡ã€ã«ãã¢ããããŒãããã°ã驿£ã®ããä»äºãææ¡ããã â
å¯è¢æåããã°ã©ããŒïŒéå»ã«å¯è¢æåããŠåããŠãããšã³ãžãã¢ã ããïŒ èª²é¡ïŒãéã®ããã§ã¯ãªããçããããèŠã€ããããã«åã人ãå¢ãããã ãœãªã¥ãŒã·ã§ã³ïŒäººã®ææ
ã«èšŽããããæ±äººæ
å ±ããAIãé§äœ¿ããŠèªåäœæãã ã â
æªæ¥è·éïŒAIã«èããŠããã£ãååããïŒ èª²é¡ïŒæ±äººæ€çŽ¢ã ãã§ã¯ãªããè»¢è·æåãŸã§æ¯æŽãããµãŒãã¹ãæ±ããŠãããŠãŒã¶ãŒãå€ã ãœãªã¥ãŒã·ã§ã³ïŒLLMãéããŠæ§æ Œã«ãã£ãæ¥çš®ã玹ä»ããå°±è·ãŸã§ã®ãªã¹ããªã³ã°ããæ¯æŽãã â
æçœªã®æè¡é¬æè
Οè空ã«é¿ãã¢ã«ãŽãªãºã ΟïŒAIã«èããŠããã£ãååã ãããΟãã¯äººåïŒ èª²é¡ïŒç°æ¥çš®ç°è·çš®ãžã®è»¢è·ãæ¯æŽãã ãœãªã¥ãŒã·ã§ã³ïŒæ°ããè·çš®ãæ€çŽ¢ããéã«ãæ°ä»ããŠããªãæ¡ä»¶ãèŠã€ããŠç²ŸåºŠã®é«ãæ€çŽ¢ããµããŒããã â
fan-LON-KUINïŒã¡ã³ããŒé æåã®çŸ
åããïŒ èª²é¡ïŒä»äºæ¢ãã®æœåšçãªæ¡ä»¶ãèšèªåã§ããªã ãœãªã¥ãŒã·ã§ã³ïŒãŠãŒã¶ãŒãèŠãæ±äººæ
å ±ãããšã«ãæ°ããªæ€çŽ¢ã¯ãšãªãææ¡ãã â
HMMSïŒã¡ã³ããŒã®é æåã®çŸ
åããïŒ èª²é¡ïŒè»¢è·ã®ããŒãã«ãé«ããçŸç¶ã«ææ
¢ããŠãã人ãå€ã ãœãªã¥ãŒã·ã§ã³ïŒAIã«ãã察話圢åŒã§ãè·æŽ/ã¹ãã«/æ¡ä»¶çããã¢ãªã³ã°ããªããä»äºã®ææ¡ãã¢ããã€ã¹ãè¡ã â
ãªãã®ã²ãšãã¡+aïŒã¡ã³ããŒã®ã»ãšãã©ãããã«ãœã³äºåå±ã¡ã³ããŒã ããïŒ èª²é¡ïŒèªåã«åã£ãä»äºã®æ¢ãæ¹ããããããæéãããã ãœãªã¥ãŒã·ã§ã³ïŒAIãšã®é³å£°äŒè©±ã ãã§åŒ·ã¿ãåŒãåºããã颿¥ãŸã§æè»œã«é²ãã ã第1éšïŒãã¬ãŒã³ããŒã·ã§ã³ã 8ã€ã®ããŒã ãã3åãšããéãããæéã®äžã§ãã¬ãŒã³ããŒã·ã§ã³ãè¡ããŸãããèªåãã¡ãèãæããã¢ã€ãã£ã¢ããªãå®çŸãããã¹ããªã®ãã«ã€ããŠãèšèãšã¹ã©ã€ãã§ç±åŒããŸãããäžã«ã¯3åã§èªãåããã«ãããã£ãšäŒãããããšãã£ãã®ã«ããïŒããšæããããªããçµäºããŠããŸãããŒã ããã¹ã©ã€ãã«ãã¢ã³ã¹ãã¬ãŒã·ã§ã³åç»ãæ¿å
¥ãã¹ã ãŒãºã«é²ããããŒã ãªã©ãåããŒã ã®æ³ããåé¢ã«åºããã¬ãŒã³ããŒã·ã§ã³ãšãªããŸããã ããã£ã¡ãæªæ¥ããããŸãïŒããšç· ãããã æ±äººæ¥çã®çœªãèè² ãã®ã§ã¯ãªããæçœªããããšããæãã ã第2éšïŒå±ç€ºã»ãã·ã§ã³ã å±ç€ºã»ãã·ã§ã³ã§ã¯8ã€ã®ããŒã¹ã«ããŒã ãé
眮ããã 審æ»å¡ã芳客ãããŒã ããŒã¹ãžèšªåããæ¹ããŠãµãŒãã¹ã®ç޹ä»ããã现ããªãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã確èªããŸããã 第1éšã®ãã¬ãŒã³ããŒã·ã§ã³ã§ã¯ç¢ºèªããããªãã£ããå®éã®ãã¢ç»é¢ã®åããæè¡çãªå·¥å€«ã»ãã ãããå£éèŠããŠãé¢çœãççŒç¹ïŒããããã¯äºæ¥ããŒããããã«å
¥ãããããããšãã£ã声ã審æ»å¡ããæããçãäžãããŸããã æéå
ã«å
šãŠã®ããŒã¹ãåšããããªãã£ã人ããä»åã®çºè¡šåå è
ããããä»ã®ããŒã¹ãæ°ã«ãªãã®ã§è¡ãããã®ã«ã»ã»ã»ããªã©ã®å£°ãåºãã»ã©ãè峿·±ãå
容ãå€ãçºè¡šãããŸããã ã衚地ã ãã¬ãŒã³ããŒã·ã§ã³ãšå±ç€ºã»ãã·ã§ã³ã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ãçµããŠããããã衚地ã°ã«ãŒãã®çºè¡šã衚地ãããããŒã ãšã³ã¡ã³ãã玹ä»ããŸãã CTOè³ïŒãªãã®ã²ãš+a 課é¡ïŒèªåã«åã£ãä»äºã®æ¢ãæ¹ããããããæéãããã ãœãªã¥ãŒã·ã§ã³ïŒAIãšã®é³å£°äŒè©±ã ãã§åŒ·ã¿ãåŒãåºããã颿¥ãŸã§æè»œã«é²ãã è©äŸ¡ãã€ã³ã ã»éžèããã»ã¹ãç°¡ç¥åãããšãã課é¡è§£æ±ºã«çç®ããŠããç¹ãç®ãåŒãã ã»ã¯ãªã¢ããªããã°ãããªãæè¡ç課é¡ããããã®ã®ãå°æ¥çã«ãã£ã¬ã³ãžããããšæããå
容ã§ãã£ã LINEã€ããŒå·è¡åœ¹å¡è³ïŒå¯è¢æåããã°ã©ã㌠課é¡ïŒãéã®ããã§ã¯ãªããçããããèŠã€ããããã«åã人ãå¢ãããã ãœãªã¥ãŒã·ã§ã³ïŒäººã®ææ
ã«èšŽããããæ±äººæ
å ±ããAIãé§äœ¿ããŠèªåäœæãã ã è©äŸ¡ãã€ã³ã ã»æ±äººãäœãäŒæ¥åŽã«ççŒç¹ãæã£ãŠããç¹ããŠããŒã¯ ã»æ±äººã®ããã¹ãçæã¯ãä»ç€Ÿã§ãããããšããŠããå®çŸæ§ãã¯ãªã¢ ã»ç»é¢çæéšåãŸã§æ€èšããŠãããè²ã
ãªããªãšãŒã·ã§ã³ãäœã£ãŠäŒæ¥ã«éžãã§ãããç¹ãé¢çœã æåªç§è³ã»COOè³ïŒNAã»KAã»YAã»MAè»å£ 課é¡ïŒæ€çŽ¢ãªãã©ã·ãŒãäœããèªèº«ã®ä»äºã®é©æ£ãããããªãããã«ã·ãã¢å±€ãæããã ãœãªã¥ãŒã·ã§ã³ïŒå±¥æŽæžãã¡ã€ã«ãã¢ããããŒãããã°ã驿£ã®ããä»äºãææ¡ããã è©äŸ¡ãã€ã³ã ã»éåžžã«ã·ã³ãã«ãã¬ãžã¥ã¡ãå
¥ããã ãã§èªåã«ãã£ãæ±äººãææ¡ãããç¹ãUX芳ç¹ã§åªç§ ã»æ€çŽ¢ãããªãäžçãã©ãäœãã®ãããŠãŒã¶ãŒã®æ
å ±ãã©ãååŸããã®ããšãã課é¡ã解決ããã¢ãããŒãã§ãäºæ¥ããŒããããã«ãã£ããããããã ãç·æ¬ã CTOæç³ïŒ ãåè³ãããã©ããã«é¢ãããããµãŒãã¹ã«åã蟌ã¿ããã¢ã€ãã¢ããããããããŸãããæåªç§è³ã®äŒç»ã¯ä»åŸã®ããŒããããã«èŒããŠåãçµãã®ã§ããNAã»KAã»YAã»MAè»å£ã以å€ã®çããã«ãé¢ãã£ãŠããããããã¯ãã«ãªããŸããä»åŸãã仿¥ã®ãããªæ©äŒã§åºãŠããã¢ã€ãã£ã¢ãã©ãã©ãäžã®äžã«åºããŠãããŸãã äºåå±ã¡ã³ããŒãæ¥éœå§ãŸã£ãäŒç»ã ã£ãã«ãé¢ããããç²ãæ§ã§ãããäºç®ã¯å°ãªãã£ãã§ãããDIYæãåºãŠè¯ãã€ãã³ãã«ããŠãããŸãããæ¬¡åã¯äºç®ã確ä¿ããŠè±ªè¯ã«ããããã®ã§æåŸ
ããŠããŠãã ããã 仿ããªãã£ã¹ã®é°å²æ°ãåãããã£ãïŒã°ã«ãŒãããšã«åºãŸã£ãŠè°è«ããŠããŠãè³ãããªé°å²æ°ã ã£ããããããæ©äŒãå¢ãããŠããŒã ã¯ãŒã¯ããã匷åããŠããããã®ã§ãåŒãç¶ãã¿ããªã§é 匵ã£ãŠãããŸãããïŒã ãããã«ãœã³ãçµããŠã ã¹ã¿ã³ãã€ãšããŠã®åããŠã®ããã«ãœã³ã§ããã çµããŠã¿ãŠã®ææ³ãããã«ãœã³åå ã¡ã³ããŒã«èããŠã¿ããšã ãæ®æ®µã®æ¥åã§ã¯æ¥ç¹ããªãã£ã人éãšé¢ãããæãŠãã ãéåžžæ¥åããäžæ©é¢ããŠã1ããã¿ããªã§èããŠäœãããšã楜ãããã ãä»ã®äººã®èããæè¡ãã¹ã¿ã³ãã€ãžã®ç±éãæããããšãã§ããã ãªã©ãæ¥ã
ã®æ¥åã§ã¯äœéšãã¥ããåºæ¿ãåããè¯ãæ©äŒã«ãªããŸããã ãŸããåããä»äºæ¢ãããšããããŒãã§ããæ€çŽ¢/æ±äººäœæ/éžèãããŒ/ãªã¹ããªã³ã°ãªã©ãããŸããŸãªèª²é¡ã«åãåããŸããããã®äžã§æãå€ãã£ããæ€çŽ¢ãã®äžã§ããæ
å ±ã®å
¥åæ¹æ³ã«ã€ããŠåã°ã«ãŒãã倿§ãªçºæ³ã§èããŠãã¢ã€ãã£ã¢ãè±ãã«é£ã³äº€ã£ãæéã§ããã ãããŠãªã«ãããããã«ãœã³ã«åå ããã¡ã³ããŒã®å
å®ãã衚æ
ãšã第2åããã£ãããŸãåå ãããïŒããšãã£ã声ã倿°èããããšãå°è±¡çã§ãä»åŸã®ã¹ã¿ã³ãã€ã®æåã象城ããã€ãã³ãã«ãªãäºæãããŸããïŒ äŒç»ããéå¶ãŸã§ãæ
åœããäºåå±ã¡ã³ããŒã®ã¿ãªãããããããšãããããŸããã 第2åã®ããã«ãœã³éå¬ã«ãä¹ããæåŸ
ïŒ ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
åããŸããŠãã¹ã¿ã³ãã€ã®ãœãããŠã§ã¢ãšã³ãžãã¢ãåããŠãããŸãã®äžè¬ãšã³ãžãã¢ã§ãã ChatGPTã®æµè¡ã«ããå€§èŠæš¡èšèªã¢ãã« (LLM) ãæ³šç®ãéããäžãçæAIã®éçºã¯ããã«æŽ»çºåããŠããŸãããã®äžã§ã泚ç®ãããŠããã®ããRAG (Retrieval Augmented Generation) ã§ããããã¯ãå€éšãœãŒã¹ããé¢é£æ
å ±ãæ€çŽ¢ããçæãããã³ã³ãã³ãã«çµã¿èŸŒãããšã§ãããæ
å ±éãå€ãæ£ç¢ºãªããã¹ããçæããææ³ã§ãã æ¬èšäºã¯ãä»å¹Žåãã«ç€Ÿå
åãäœæããLLMãšVespa掻çšãããã¿ã€ãã®å
容ãåæ§æãããã®ã§ããåœæã® Vespa ææ°æ©èœ (2024.03 æç¹) ãçšããŠLLMã®å¯èœæ§ãæ€èšŒãããã¢ã§ããããçæAIã®éçºã¯æ¥ã
æ¥éã«é²ãã§ãããããèšäºå
å®¹ã¯ææ°ã®æ
å ±ãå®å
šã«åæ ããŠããªãå¯èœæ§ããããŸãããäºæ¿ãã ããã èæ¯ Vespa ã¯ãæ€çŽ¢ãã¬ã³ã¡ã³ããªã©ããã€ããã©ãŒãã³ã¹ãªãµãŒãã³ã°ãŠãŒã¹ã±ãŒã¹åãã«èšèšãããããªãŒãã³ãœãŒã¹ã®ãµãŒãã³ã°ãšã³ãžã³ã§ããããã¹ãæ€çŽ¢ããã¯ã¿ãŒæ€çŽ¢ããã«ããã§ãŒãºæ€çŽ¢ãã©ã³ãã³ã°ãªã©ãå«ããã€ããªããæ€çŽ¢ãªã©ãæå
ç«¯ã®æ©èœãåããŠããŸããVespaã®è©³çްã¯ã å
¬åŒãµã€ã ãã芧ãã ããã ã¹ã¿ã³ãã€ã§ã¯ãæ€çŽ¢ãšã³ãžã³åºç€ãšããŠVespaãæ¡çšããŠããŸããVespaç§»è¡ã®è©³çްã«ã€ããŠã¯ãäžèšã®ååã® èšäº ãã芧ãã ããã ãããã¿ã€ãã¢ã€ã㢠ã¹ã¿ã³ãã€ã¯ãã³ã¢ãšãªã æ±äººæ€çŽ¢ãšã³ãžã³ ã ãã§ã¯ãªããæ±è·é¢é£ã¡ãã£ã¢ãµã€ã ãã¹ã¿ã³ãã€Plusã ãéå¶ããŠããŸãããã¹ã¿ã³ãã€Plusãã§ã¯å°éå®¶ã«ããã¬ãã¥ãŒã»ç·šéæžã¿ã®æ±è·è
åãã®é«å質ãªã¢ããã€ã¹ãåçš®è·çš®ç޹ä»ãªã©ãæ§ã
ãªã³ã³ãã³ããæäŸããŠããŸãã çæAIãšãµã€ãã³ã³ãã³ããçµã¿åãããã°ãå®å
šã«ã»ã«ããµãŒãã¹ã®AIæ±è·ã¢ããã€ã¶ãŒãžãšå€è²ããæ±è·è
ã®çåãäžå®ã«åœ¹ç«ã€åçãæäŸã§ããå¯èœæ§ããããŸãã ãããã¿ã€ã ãæããŠïŒã¹ã¿ã³ãã€å€ªéå
çã ãšããååã®ãããã¿ã€ããéçºããŸããã ãã®ãããã¿ã€ãã¯ä»¥äžã®ãããªæ©èœãæäŸããŸã: LLM çæã«ãã質åã«å¯Ÿãã RAG ã¬ã¹ãã³ã¹ Vespaã«ããå€èšèªã»ãã³ãã£ãã¯æ€çŽ¢ LLMã«ããæ±è·é¢é£ã¯ãšãªã®ææ¡ 質åã«é¢é£ããã¹ã¿ã³ãã€ã®æ±äººæšèŠ ãããã¿ã€ãã®éçºã«äœ¿çšããã¹ã¿ãã¯ã¯ä»¥äžã®éãã§ã: æ€çŽ¢ãšã³ãžã³: Vespa LLMãã¬ãŒã ã¯ãŒã¯: LangChain åºç€ã¢ãã«: Anthropic Claude 3 Haiku via AWS Bedrock Web App: Mercury ãããã¿ã€ãã®å
šäœçãªãããŒã¯äžèšã®å³ã®ããã«ãªã£ãŠããŸã: 以éã®ã»ã¯ã·ã§ã³ã§ã¯ãäž»èŠéšåã®ãã¶ã€ã³ã®è©³çްã«ã€ããŠèª¬æããŸãã ããã¥ã¡ã³ãåŠç ã¹ããŒã ãŸããæ€çŽ¢ãšã³ãžã³ã®ã¹ããŒããå®çŸ©ããŸãã ä»åã¯ãããã¿ã€ããªã®ã§ãæ€çŽ¢çšã®æäœéã®ãã£ãŒã«ãã®ã¿å®çŸ©ããŸãã schema article { document article { field title type string { indexing: summary | index index: enable-bm25 } field body type string { indexing: summary | index index: enable-bm25 summary : dynamic } field path type string { indexing: summary | index } } field embedding type tensor<float>(x[768]) { indexing { "passage: " . (input title || "") . " " . (input body || "") | embed e5 | attribute | index } attribute { distance-metric: angular } index: hnsw } field colbert_embs type tensor<int8>(token{}, x[16]) { indexing { (input title || "") . " " . (input body || "") | embed colbert | attribute } } fieldset default { fields: title,body } } ãã£ãŒã«ã ã¹ã¿ã³ãã€Plusã®èšäºã¯ãHTML圢åŒããããŒã¯ããŠã³åœ¢åŒã«å€æãããbodyãã£ãŒã«ãã«æ ŒçŽãããŸãã Embedder æ°ããããŒãžã§ã³ã®Vespaã§ã¯ãVespaã¯ã©ã¹ã¿ãŒã®ããã¥ã¡ã³ãããã»ããµå
ã§çŽæ¥å®è¡ãããEmbedderã³ã³ããŒãã³ããå°å
¥ãããŸãããããã¥ã¡ã³ããVespaã«æå
¥ããããšããã®ããã»ã¹ã§èªåçã«EmbeddingãçæãããŸããVespaã¯ã©ã¹ã¿ãŒå
ã§çŽæ¥å®è¡ããããããå¥ã®ãã¯ãã«åAPIã管çããŠEmbeddingãäœæããããã®æéãšã³ã¹ããå°ãªããŠæžã¿ãŸãã ãã®ãããã¿ã€ãã§ã¯ãããã¥ã¡ã³ãæå
¥æã«2çš®é¡ã®Embeddingãäœæããããã®2ã€ã®Embedderãå®çŸ©ããŸããã 1ã€ã¯æ€çŽ¢çšã®E5 Embeddingããã1ã€ã¯ColBERT Embeddingã§ãã Embedderã¯ãVespaã¯ã©ã¹ã¿ãŒã®services.xmlã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžãã¡ã€ã«ã«æ°è¡è¿œå ããã ãã§å®çŸ©ã§ããŸãã <component id = "e5" type = "hugging-face-embedder" > <transformer-model url = "/multilingual-e5-base/model.onnx" /> <tokenizer-model url = "/multilingual-e5-base/tokenizer.json" /> </component> <component id = "colbert" type = "colbert-embedder" > <transformer-model url = "/colbert/model.onnx" /> <tokenizer-model url = "/colbert/tokenizer.json" /> </component> URLã¯èª¬æã®ããã®ãã®ã§ãããå®éã«äœ¿çšããURLãšã¯ç°ãªããŸãã Vespa Embedderã³ã³ããŒãã³ãã®è©³çްã«ã€ããŠã¯ãVespa ã® ãšã³ãããã£ã³ã°ããã¥ã¡ã³ã ãåç
§ããŠãã ããã ãã€ããªããæ€çŽ¢ ãã®ãããã¿ã€ãã§ã¯ãåŸæ¥éãã®äºæ®µéã©ã³ãã³ã°ãæ¡çšããŸããã ãããã³ã° ãããã³ã°ã§ã¯ãVespaã§ãã€ãã£ãã«ãµããŒããããŠããè¿åããŒã¹ã»ãã³ãã£ãã¯æ€çŽ¢(Nearest Neighbour Search)ãšã¬ãã·ã«ã«æ€çŽ¢(Lexical Search)ãçµã¿åããå©çšããŸãã(ãã€ããªããæ€çŽ¢ãšããŠç¥ããã) è¿åæ€çŽ¢ã®ã»ããã¬ãã·ã«ã«æ€çŽ¢ããåªããŠããã®ããšããè°è«ããããããŸãããã¬ãã·ã«ã«æ€çŽ¢ã¯æä»£é
ãã§é圹ãã¹ããšããæèŠããããŸããå®éã«ã¯ãã¬ãã·ã«ã«æ€çŽ¢ãšè¿åæ€çŽ¢ã«ã¯ããããé·æãšçæããããäž¡æ¹ã®æ€çŽ¢çµæãçµã¿åãããããšã§ãäž¡æ¹ã®ã¡ãªããã享åã§ããŸãã Vespaã®åŸæãªç¹ãšããŠã¯ã1ã€ã®æ€çŽ¢ãªã¯ãšã¹ãã§åæã«äž¡æ¹æ€çŽ¢ã§ãããããå¹ççã§æéãå°ãªããŠæžãããšã§ãã Vespaã®ã©ã³ã¯ãããã¡ã€ã«é¢æ°å
ã§ããã¡ãŒã¹ããã§ãŒãºã§çŽæ¥åææ€çŽ¢ã§ããããã«å®çŸ©ãããšããã€ããªããæ€çŽ¢ãç°¡åã§ããŸãã first-phase { expression: nativeRank + closeness(field, embedding) } nativeRankã¹ã³ã¢ã¯ã¬ãã·ã«ã«æ€çŽ¢ããã®ããã¹ããããã³ã°ã¹ã³ã¢ã§ãããclosenessã¯ã¯ãšãªãšããã¥ã¡ã³ãã®Embeddingéã®è¿ãã衚ããŸãã åæ€çŽ¢ããã®ã¹ã³ã¢ã«éã¿ãä»ããããšãã§ããŸããããã®ãããã¿ã€ãã§ã¯æé©åãè¡ãæéããªãã£ããããåçŽã«2ã€ã®ã¹ã³ã¢ãå ç®ããŠããŸãã ãã®ãããã¿ã€ãã§ã¯ããã¢ç®çã§ãã¹ãŠãåããã·ã³äžã§å®è¡ãããŠãããããEmbeddingã¢ãã«ããã¡ã€ã³ãã¥ãŒãã³ã°ããæéãšãªãœãŒã¹ããããŸããããã®ãããããã©ãŒãã³ã¹ãšç°¡äŸ¿æ§ãèæ
®ããŠã intfloat/multilingual-e5-base ããã¹ãEmbeddingã¢ãã«ã䜿çšããŠããŸãã ãããã¿ã€ãã§äœ¿çšããVespaæ€çŽ¢ãšã³ãžã³ã®å®éã®ãªã¯ãšã¹ãã¯æ¬¡ã®ããã«ãªããŸãã { " yql ": " select title, body, path from article where (({targetHits:10}nearestNeighbor(embedding,q)) OR weakAnd(userQuery())) ", " ranking ": { " profile ": " colbert " } , " model ": { " locale ": " ja " } , " hits ":" 5 ", " query ":" åšå®
ã¯ãŒã¯ã¯äœã®ä»äºã§ããïŒ ", " input.query(q) ": " embed(e5, \" query: åšå®
ã¯ãŒã¯ã¯äœã®ä»äºã§ããïŒ \" ) ", " input.query(q_t) ": " embed(colbert, \" åšå®
ã¯ãŒã¯ã¯äœã®ä»äºã§ããïŒ \" ) " } ãã®ãããã¿ã€ãã§ã¯ãVespa Embedderã³ã³ããŒãã³ãã䜿çšããŠããªã¯ãšã¹ãæã«ãŠãŒã¶ãŒã¯ãšãªãEmbeddingã«å€æããè¿åæ€çŽ¢ã«äœ¿çšããŠããŸãã ãªã©ã³ã¯ ãªã©ã³ã¯ã¹ããŒãžã§ã¯ããããã¿ã€ãã®ç®çã®1ã€ãšããŠãææ°ã®Vespaæ©èœãå®èšŒããããšã ã£ãã®ã§ãããã§ColBERTã䜿çšããããšã«ããŸããã ColBERT (Contextualized Late Interaction over BERT) ã¯ãå¹ççã§å¹æçãªããã¥ã¡ã³ãæ€çŽ¢ã®ããã«èšèšããããã¥ãŒã©ã«ã©ã³ãã³ã°ã¢ãã«ã§ããã¯ãšãªãšããã¥ã¡ã³ãã®äž¡æ¹ã BERT ã䜿çšããŠå¯ãªãã¯ãã«ã«ãšã³ã³ãŒãããŸããåã
ã®ããŒã¯ã³Embeddingéã®é¡äŒŒåºŠã¹ã³ã¢ãèšç®ããããšã§ãã·ãŒã±ã³ã¹å
šäœã§ã¯ãªããã¬ã€ãã€ã³ã¿ã©ã¯ã·ã§ã³ãå®è¡ããŸãã ã¬ã€ãã€ã³ã¿ã©ã¯ã·ã§ã³(Late Interaction)ã¯ãæ€çŽ¢ã¯ãšãªãšããã¥ã¡ã³ããåå¥ã«åŠçããããã»ã¹ã®æçµæ®µéãŸã§çžäºäœçšãé
ãããããšã§ãå¹ççã§æ£ç¢ºãªæ€çŽ¢ãå®çŸããŸããæ€çŽ¢ã¯ãšãªãšããã¥ã¡ã³ãã®è¡šçŸã¯ãããããç¬ç«ããŠãšã³ã³ãŒãããããã®åŸçžäºäœçšãè¡ããããããã¬ã€ãã€ã³ã¿ã©ã¯ã·ã§ã³ãšåŒã°ããŠããŸãã ããã«ãããå¹çæ§ãç¶æããªããã现ãããããã³ã°ãå¯èœã«ãªããŸããColBERTã¯ããªã©ã³ãã³ã°ã¹ããŒãžã§äœ¿çšã§ããŸãããã¡ãŒã¹ããã§ãŒãºã§æ€çŽ¢ãããåè£ããã¥ã¡ã³ããããæ·±ãæå³çãªçè§£ã«åºã¥ããŠã©ã³ãã³ã°ã®ç²ŸåºŠãåäžãããããšãã§ããŸãã æ®å¿µãªãããVespaèªäœã¯ColBERTã§äœ¿çšãããé¡äŒŒåºŠã¹ã³ã¢ãèšç®ããããã®MaxSim颿°ãæäŸããŠããŸããããVespaãæäŸããç®è¡æŒç®åã䜿çšããŠã«ã¹ã¿ã 颿°ãäœæã§ããŸãã 以äžã¯ããªã©ã³ã¯ãã§ãŒãºã®ã©ã³ã¯ãããã¡ã€ã«ã®ã¹ããããã§ã function maxsim() { expression { sum( reduce( sum( query(q_t) * unpack_bits(attribute(colbert_embs)), x ), max, colbert_embs ), q_t ) } } second-phase { expression: maxsim() } ãªã¯ãšã¹ãæã«å€æãããã¯ãšãªEmbeddingãšããã£ãŒãã£ã³ã°æã«äœæãããããã¥ã¡ã³ãEmbeddingããã»ã«ã³ããã§ãŒãºã§äœ¿çšãããæå³çé¡äŒŒåºŠã¹ã³ã¢ãèšç®ããŸããèšç®ãããã¹ã³ã¢ã«åºã¥ããŠçµæããœãŒããããŸãã ã¬ã¹ãã³ã¹ã®çæ LLM Vespaããèšäºæ€çŽ¢çµæãååŸããåŸããããã®èšäºãRAGã®AG(Augmented Generation)éšåã§äœ¿çšãããŸãã ãã¡ãŠã³ããŒã·ã§ã³ã¢ãã«ã¯ãAWS Bedrockãä»ããŠAnthropic Claude 3 Haikuã䜿çšããŸãããClaude 3 Haikuã¯ãClaude 3 ãã¡ããªãŒããã³ã³ãã¯ããªãµã€ãºã§å³æå¿ççšã«èšèšãããã¢ãã«ã§ããå人çãªãã¹ãã¯ãHaikuããSonnetãOpusãªã©ã®ãã倧ããªã¢ãã«ã䜿çšããŠçæãããå¿çãšæ¯èŒããŠãRAGã¿ã¹ã¯ã«å¯ŸããŠååã§ããããšãããããŸãããAWS Bedrockãéžæããçç±ã¯ãã¹ã¿ã³ãã€ã¯äž»ã«AWSã€ã³ãã©ã䜿çšããŠããããã§ããå®éã«ã¯ãæ¥æ¬èªããµããŒãããŠããã°ãä»ã®LLMã¢ãã«ããããã€ããŒãšçœ®ãæããããšãã§ããŸãã ããã³ãã ãã®ãããã¿ã€ãã§äœ¿çšãããããã³ããã¯ãæéã®å¶çŽã«ãããããã³ããã®æé©åãè¡ãããŠããŸããã ããã³ããã¯æ¥æ¬èªã§ã¯ãªãè±èªã䜿çšããŠããŸããä»ã®LLMãããã¿ã€ããå
éšäœ¿çšããŒã«ãéçºããçµéšãããããã³ããã¯æ¥æ¬èªã§ã¯ãªãè±èªã䜿çšããŠããŸããClaude 3ã¢ãã«ã¯æ¥æ¬èªã®ããã³ããã®æç€ºãçè§£ã§ããŸãããè±èªã®ããã³ããã®æ¹ãå®éçããã³å®æ§çãªåæã«ãããŠãæ¥æ¬èªãããäžè¬çã«åªããå¿çãæäŸããããã§ãããã®ããããããäž»ã«è±èªãããã³ããã«äœ¿çšããŠããŸãã ããã³ããèªäœã¯ãæ€çŽ¢çµæãæ ŒçŽãã {context} ãšããŠãŒã¶ãŒã¯ãšãªãæ ŒçŽãã {query} ã® 2 ã€ã®å€æ°ã®ã¿ãåãåããŸãã以äžã¯ããã®ãããã¿ã€ãã§äœ¿çšãããå®éã®ããã³ããã§ãã You are a helpful, precise, factual Japanese speaking Job Seeking Advice expert who answers questions and user instructions about Job Seeking-related topics. The documents you are presented with are retrieved from a Japanese Job Seeking Advice Blog called Stanby Plus (ã¹ã¿ã³ãã€Plus). Facts about Stanby Plus: - Stanby Plus is a magazine website operated by Stanby Inc. which operate a Japanese Job Search Engine Services called Stanby (ã¹ã¿ã³ãã€). - Stanby is a focus on the Japanese market. <instructions> - The retrieved documents are markdown formatted text from a Japanese Job Seeking Advice Blog operated by Stanby, a Japanese based Job Search Engine company. - Answer questions truthfully and factually using only the information presented. - If you don't know the answer, just say that you don't know, don't make up an answer! - If you can't answer with reference to the document provided, just say ã倧å€ç³ãèš³ããããŸãããæ€çŽ¢ãããã¯ãšãªãé©åçã«çããã§ããŸããã - You are correct, factual, precise, and reliable. - You must reply in Japanese. - You should reply in less than 500 words. </instructions> <articles> {context} </articles> Question: {query} Helpful factual answer: ãããã¿ã€ã㯠Jupyter Notebook äžã§çŽæ¥å®è¡ããããããLangChain ã䜿çšã㊠AWS Bedrock ãéã㊠LLM ãšããåãããŠããŸãããŠã§ãã¢ããªèªäœã¯ãJupyter Notebook ããŠã§ãã¢ããªã«å€æãã Python ã©ã€ãã©ãªã§ããMercuryã䜿çšããŠæ§ç¯ãããŠããŸãã ãŸããLLMã䜿çšããŠãŠãŒã¶ãŒã®è³ªåããæ±äººæ€çŽ¢ã¯ãšãªãäœæããæ±äººæšèŠã衚瀺ãã詊ã¿ãè¡ããŸãããLLMã¯ããã®ãµãã¿ã¹ã¯ã§ãè¯ãæ§èœãçºæ®ããŸããã ã㢠ãããã¿ã€ãã¯å
éšãã¢çšãªã®ã§ãå
¬éã¯ããŠããŸãããããããã¿ã€ãã®ã¹ã¯ãªãŒã³ã·ã§ãããããã€ã玹ä»ããŸãã çæãããå¿çã®ãªãã§ãã¹ã¿ã³ãã€ã®æ±äººæ€çŽ¢ãµãŒãã¹ãèªç¶ã«æšå¥šããŠããŸã ð ä»ã®èšèªã§è³ªåãããéã«ã質åã«å©çšãããèšèªã§ãã®ãŸãŸè¿çããŸã ð çµè« VespaãæäŸããé«åºŠãªæ©èœã«ããããã®RAGãããã¿ã€ãã¯1æ¥ä»¥å
ã§äœæã§ããŸãã (ããã³ããšã³ãèšèªã«æ
£ããŠããªããããUIã®äœæã«å€ãã®æéãè²»ãããŸãã)ãããã¯ãLLMã¢ãã«ãšVespaã®å¯èœæ§ã瀺ããŠããŸãã ãããã¿ã€ãã®å€éšå
¬éãŸã§ãŸã é·ãéããããŸãã以äžã®ãããªã¢ã€ãã£ã¢ã§ãããªãæ¹åãæ€èšããŠããŸãã ããè¯ããªããªãŒãã«ã®ããã«ãe5 ã¢ãã«ãåœç€Ÿã®ããŒã¿ã§ãã¡ã€ã³ãã¥ãŒãã³ã°ãã ããè¯ãColBERTã¢ãã«ãåŠç¿ãã (çŸåšãColBERTããŸã å®éšäž) ããã³ããã®æªçšé²æ¢å¯Ÿç (ãã®ãããã¿ã€ãã¯å
éšäœ¿çšã®ãããããã«ã€ããŠã¯äœãããŠããŸãã) çæãããã³ã³ãã³ãã«ããã®åºã«ãªã£ãŠãããã®ãèšèŒããŸã ã¹ã¿ã³ãã€ã§ã¯ãåžžã«æ°ããã¢ã€ãã¢ãæè¡ã調æ»ãã詊ããŠããŸããæ°ããããšã«ææŠãããæ¹ããçŽ æŽããããã©ãããã©ãŒã ã§çŽ æŽããã仲éãšä»äºããããæ¹ã¯ããã² æ¡çšããŒãž ãã芧ãã ãã! ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
ããã«ã¡ã¯ãæ ªåŒäŒç€Ÿã¹ã¿ã³ãã€ã®Searchã°ã«ãŒãã§æ€çŽ¢ãšã³ãžã³ã®éçšã»éçºãæ
åœããŠããå°éã§ãã ä»åã¯ã瀟å
ã§å®æœãããæ€çŽ¢ã·ã¹ãã ãã®èŒªèªäŒã«ã€ããŠã玹ä»ããŸãã ãªã茪èªäŒãè¡ã£ããïŒ ä»åã茪èªäŒãéå¬ããçç±ã¯å€§ãã2ã€ãããŸãã æ€çŽ¢ãµãŒãã¹ãæäŸããäŒæ¥ãšããŠãæ€çŽ¢æ©èœã«é¢ããäœç³»çãªç¥èãæ·±ããã ãã£ã¹ã«ãã·ã§ã³ãéããŠãæ€çŽ¢ã·ã¹ãã ã«é¢ããçè§£ãããã«é«ããã ç§ãã¡ã䜿çšããã®ã¯ãã©ã ãããŒãç€Ÿã® ãæ€çŽ¢ã·ã¹ãã ã ãšããæžç±ã§ãæ€çŽ¢ã·ã¹ãã ã®éçºã«å¿
èŠãªäœç³»çç¥èãåŠã¹ãäžåã§ãã ã¹ã¿ã³ãã€ãæäŸããæ±äººæ€çŽ¢ãµãŒãã¹ã®ã·ã¹ãã èŠæš¡ã¯ãšãŠã倧ãããããã³ã³ããŒãã³ãå¥ã«æ
åœããŒã ãåãããŠéçºãéçšãè¡ã£ãŠããŸãã 茪èªäŒã§ã¯æ¥åã§ã®æ
åœä»¥å€ãå«ãæ€çŽ¢ã·ã¹ãã å
šäœã®çè§£ãæ·±ããå
±éã®ç¥èåºç€ãç¯ãããšã§ä»åŸã®ãããã¯ãéçºã«ã圹ç«ãŠãããšèããŸããã ã¡ãªã¿ã«ãã¹ã¿ã³ãã€ã«ã¯å¿
èŠãªæžç±ã®è³Œå
¥è£å©ããŠãããããã¹ã¿ã³ãã€å³æžããšããå¶åºŠããããŸãã ä»åã茪èªäŒå®æœã®ããã«å¶åºŠãå©çšããŠè€æ°å賌å
¥ããŠããããŸããã ã©ã®ããã«å®æœãããïŒ é²ãæ¹ é±ã«1åã1æéãªã³ã©ã€ã³ã§è¡ã1ç« ãã€é²ããŸããã å
š12ç« ãçŽ3ã¶æã§å®äºããããšãç®æšã«ããŸããã åå ã¡ã³ããŒã«ã¯äºåã«è©²åœç« ãèªãã§ãããã茪èªäŒã§ã¯ãã®å
容ãå
±æããã£ã¹ã«ãã·ã§ã³ãè¡ã圢åŒã§ãã é²è¡ã¯ä»¥äžã®ã¹ãããã§é²ããŸããã åŠãã å
容ãçåç¹ããµããïŒmiroïŒã«èšå
¥ ãã®ãµãããåå è
å
šå¡ã«å
±æ æ·±æããããå
容ã«ã€ããŠãã£ã¹ã«ãã·ã§ã³ ç« ããšã«miroã§ä»¥äžã®ãããªããŒããäœæããŸããã 工倫ããã㚠茪èªäŒã®äŸ¡å€ãæå€§åããåå ããããããããã«ä»¥äžã工倫ããŸããã ããã¯ãªãã®å®æœ 1åç®ã®èŒªèªäŒã®éå¬åã«ããã¯ãªããè¡ã£ãŠãåå è
ã®èŒªèªäŒãžã®ã¢ãããŒã·ã§ã³ã®å
±æãé²ãæ¹ã決å®ããŸããã ããã¯ãªãã§èŒªèªäŒããã©ããã£ãå Žã«ããããïŒãã®èªèåãããã§ããŸããã å人ã®è² æ
è»œæž èŠçŽãäœæããŠçºè¡šãã圢åŒã¯åãããåã¡ã³ããŒãèªåã®ããŒã¹ã§åå ã§ããããã«ããŸããã ãã¡ã·ãªããŒã¿ãŒã¯ååã§æã¡åãå¶ãšããç¹å®ã®ã¡ã³ããŒã«è² æ
ãéäžããªãããé
æ
®ããŸããã æ¬ã¯äºåã«èªãã§ãã 茪èªäŒã§ã¯ãã£ã¹ã«ãã·ã§ã³ã«éç¹ã眮ãããã«ãäŒã®äžã§èªæžãé³èªããã®ã§ã¯ãªãäºåã«æ¬ãèªãã§ããŠãããããã«ããŸããã å®éã®ãšããã©ãã ã£ããïŒ ååã§çŽ7åãåå ããå
š12ç« ãç¡äºã«èªç ŽããŸããïŒ äžæããã£ãã㚠茪èªäŒã§ã¯æžç±ã®å
容ããçºå±ããŠå®éã®ãããã¯ãã«ã€ããŠã®è°è«ãã§ããããšã§ãã 倿§ãªããã¯ã°ã©ãŠã³ããæã€ã¡ã³ããŒãåå ããŠããã®ã§åäººã®æ¥åã§ã®ç¥èãçµéšã«åºã¥ããŠè°è«ã¯éåžžã«ææçŸ©ã§ããã äŸãã°ãæ°ããå
¥ç€Ÿããã¡ã³ããŒããã¹ã¿ã³ãã€ã§ã¯ã©ããªã£ãŠããã®ãïŒããšããçåãæããããçµéšè±å¯ãªã¡ã³ããŒãããã«çããå Žé¢ãå€ãèŠãããŸããã 瀟å
ã§ã®èŒªèªäŒã ããããæ¥åã«çŽæ¥ãªã³ã¯ããå
容ãŸã§æ·±æãããšãã§ããŸããã é£ããã£ãããš ç« ã«ãã£ãŠé£æåºŠãããŒãžæ°ã«ãã©ããããããåç« ã1æéå
ã«åããã®ãé£ããã£ãã§ãã ç¹ã«åŸåã®ç« ã§ã¯ã¢ã«ãŽãªãºã ãæ©æ¢°åŠç¿ãšãã£ãå°éçãªå
容ãå¢ããæéå
ã«æ·±ãè°è«ãããããšãé£ãããªããŸããã ç« ã®å
容ã«ãã£ãŠã¯äŒãåå²ãããããµã³ãã«ã³ãŒãã䜿ã£ãã¢ãããã°ã©ãã³ã°ãªã©ãç°ãªãé²ãæ¹ãæ¡çšããŠãè¯ãã£ããšæããŸããã çµããã« ä»åã®èŒªèªäŒãéããŠãåã
ã®ã¹ãã«ã¢ããã¯ãã¡ãããã¡ã³ããŒéã§å
±éã®ç¥èåºç€ãæ§ç¯ããäŒç€Ÿå
šäœã®ãããã¯ãéçºåãé«ããããšãã§ããŸããã å¿ããæ¥åã®äžã§åå ããŠãããã¡ã³ããŒã«ã¯å¿ããæè¬ããŠããŸãã ä»åŸããã¡ã³ããŒãšå
±ã«æé·ãç¶ããããç°å¢ãäœã£ãŠãããããšæã£ãŠããŸãïŒ ããã¹ã¿ã³ãã€ã«ã€ããŠå°ãã§ãèå³ãæã£ãæ¹ã¯ããã² æ¡çšãµã€ã ãããæ°è»œã«ãåãåãããã ããã ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
ã¯ããã« ããã«ã¡ã¯ãæ ªåŒäŒç€Ÿã¹ã¿ã³ã〠QAã°ã«ãŒãïŒQuality Assurance GroupïŒã®æšœäºã§ãã ã¹ã¿ã³ãã€ã¯æ±äººæ€çŽ¢ãšã³ãžã³ãéçºã»éçšããŠãããWebãšãã€ãã£ãã¢ããªïŒä»¥éAppïŒã§ãµãŒãã¹ãæäŸããŠããŸããWebã»Appã®ãã¹ãèªååã«ã¯MagicPodãå©çšããŠããŸãããæ¬èšäºã§ã¯ãAppã®MagicPodã·ããªãª 1 倱æçïŒã·ããªãªã®äžåã«ãã倱æïŒãäžããããã®åãçµã¿ãã玹ä»ããŸãã magicpod.com MagicPodå°å
¥ã®çµç·¯ã«ã€ããŠã¯ãéå»èšäºã ã¹ã¿ã³ã〠QAã®ãã¹ãèªååå°å
¥ïŒMagicPodïŒ ããã確èªãã ããã ãªã倱æçãäžããã®ã Appã§MagicPodéçšãå§ããé ã®ã·ããªãªå€±æçïŒå€±ææ°â» ÷ ã·ããªãªæ°ïŒã¯ãAndroidã16%ååŸãiOSã44%ååŸã§ããã â»ç°å¢ãããŒã¿ãªã©ã·ããªãªå
容以å€ã®å€±ææ°ãé€ããæ° ã¹ã¿ã³ãã€ã§ã¯ããã¹ãèªååã®å°ä»»è
ãç«ãŠããWebãAppããããã®QAæ
åœè
ãã·ããªãªéçšã宿œããŠããŸãã äžæ¥1æéååŸãMagicPodéçšäœæ¥ã«å
ãŠãŠããŸãããæ¢åã·ããªãªã®å€±æçãé«ãããšã§ãä¿®æ£ã«æéãåãããæ°èŠã·ããªãªã®äœæãé²ãŸãªãã£ãããæ°ããæ©èœã®åæ ãé
ããããã圱é¿ããããŸãããå ããŠãiOSã¯Androidã«æ¯ã¹ãŠå®è¡é床ãé
ããã·ããªãªä¿®æ£åŸã®ç¢ºèªã«ãæéãèŠããŸãã1ã€ã®ãã±ãŒã¿ãŒ 2 ã確å®ãããã®ã«15åã»ã©ãããããšããããŸããã å ããŠã倱æãå€ãã·ããªãªã§ã¯ãäžå
·åãžèŸ¿ãçãåã«ã·ããªãªãçµäºããŠããŸããååãªå質æ
ä¿ãã§ããŸããã ããã§ãã·ããªãªãå®å®çã«å®è¡ããå¿
èŠãªæ©èœå®è£
ãé²ããããããã倱æçãäžããåãçµã¿ãè¡ãããšã«ããŸããã MagicPodå®è¡ãã°ããäœãããã£ãã ãŸãã¯ãã·ããªãªå€±æçç±ãæ¢ããããAndroidãiOSããããéå»50ååã®MagicPodå®è¡ãã°ãéèšããæ©èœããšã«åé¡ããã·ããªãªã®å²åãç®åºããŸããïŒã·ããªãªåé¡ïŒãããã«ãã·ããªãªåé¡ããšã®å¹³å倱æçãç®åºãã倱æåŸåã倧ãŸãã«ç¢ºèªããŸããïŒã·ããªãªããšã®å¹³å倱æçïŒã OS ã·ããªãªåé¡ ã·ããªãªããšã®å¹³å倱æç Android iOS Androidã®ç¹åŸŽ ç¹å®ã®æ©èœãç¹°ãè¿ã倱æããŠãã æåå
¥åã§ããŠããªã ç»é¢é·ç§»åŸã«ã¿ããã§ããŠããªã iOSã®ç¹åŸŽ æ§ã
ãªæ©èœã§å€±æããŠãã ç»é¢é·ç§»åŸã«ãã±ãŒã¿ãŒãååŸã§ããŠããªã ç»é¢é·ç§»åŸã«ã¿ããã§ããŠããªã æå®ããæéå
ã«ç»é¢æç»ã§ããŠããªã Androidã»iOSå
±éã«çºçããŠãããç»é¢é·ç§»åŸã«ã¿ããã§ããŠããªãããšããåé¡ã§ãããç»é¢ã®èŠçŽ ãå€åããå Žåãå€åå€ãå«ããã±ãŒã¿ãŒãå©çšããŠãããšãããŒã¿ã«ããèŠçŽ æ°ãå€ããããšããã¹ã¯ããŒã«äœçœ®ã«ãã£ãŠæ³å®ããŠããªãèŠçŽ ãæäœããããšããããŸããå€åå€ãå«ããã±ãŒã¿ãŒã®æ¹ã䜿ããããã·ãŒã³ããããŸãããåºå®ããããã±ãŒã¿ãŒãå©çšããããšã§ããXXXã衚瀺ããããŸã§ã¹ã¯ããŒã«ããããããXXXãååšããã確èªããããªã©ã®ã³ãã³ããå©çšãããããªããŸãã ããŒã¿éãã¹ã¯ããŒã«äœçœ®ã®å€åã«ããããã±ãŒã¿ãŒååŸã®å€±æã¯ãã·ããªãªäœæãå®è¡ãéçšã®å
šãŠã«ãããŠæéãšæéããããããšããããå®å®ãããã±ãŒã¿ãŒååŸããæåªå
ã®èª²é¡ãšããŠåãçµãããšã§ã倱æçã®å®å®ãå³ããŸããã ãã±ãŒã¿ãŒãå®å®ãããã«ã¯ã©ãããã°è¯ãããAccessibility IDã ãããªæãMagicPodã®ãã«ãã»ã³ã¿ãŒã§èŠã€ããèšäºã iOSã¢ããªã®ãã¹ããé«éåãããã±ãŒã¿ãŒã®éžã³æ¹ ãã§Accessibility IDã®ååšãç¥ããŸããããã±ãŒã¿ãŒãšããŠã®äœ¿ãåæã®è¯ããšããŠã¯ãiOS Class ChainãXPathã«è»é
ãäžãããŸãããä»åã¯æµåçãªèŠçŽ ã§ã¯ãªããåºå®èŠçŽ ã«å¯ŸããŠã®èå¥ãç®çãšããŠãããããAccessibility IDã®ä»äžãæ€èšããŸããã Accessibility IDãä»äžããããšã§ãåUIèŠçŽ ãäžæã«æå®ã§ããŸããããã«ããMagicPodããèŠçŽ ãç¹å®ãããããããã±ãŒã¿ãŒååŸå€±æãã¿ãã倱æãé²ãã®ã«åœ¹ç«ã¡ãŸããiOSãAndroidã§ä»äžæ¹æ³ãç°ãªããç¹ã«Androidã®å Žåã¯UIãViewããŒã¹ããComposeããŒã¹ãã«ãããIDã®å²ãåœãŠæ¹æ³ãç°ãªããŸãã詳ããã¯ãMagicPodãã«ãã»ã³ã¿ãŒã§èŠã€ããèšäºã èªåãã¹ããç°¡åã«ããããã®ã¢ããªå®è£
ã®å·¥å€«ãç¥ããã ãã«èšèŒããããŸãã®ã§ãã芧ãã ããã äºäŸ èšäºã«èšèŒãããããã«ãAccessibility IDãå©çšããäžã§ã®æå€§ã®ãã€ã³ãã¯ãéçºè
ã«IDãä»äžããŠãããå¿
èŠãããããšã§ãããã€ãã©ã®ã¿ã€ãã³ã°ã§ãã©ã®ããã«ä»äžããã®ããããããä»äžããŠè¯ãããAppéçºããŒã ã®POã«çžè«ããããšããå§ããŸãããéçºè
ã«åããŠã¯ãçŸåšã®åé¡ç¹ãšAccessibility IDã«æåŸ
ããç¹ã«ã€ããŠã®èª¬æäŒã宿œããäžã§ãIDä»äžãéå§ããŸããã Accessibility IDä»äžã®æµã AppéçºããŒã ã®POã«çžè« Appéçºè
ã«èª¬æäŒ éçºæ
åœè
ãšQAæ
åœè
ã§Accessibility IDã®æ±ºå® å®è£
1ïŒéçºè
ïŒ ä»äžå
容ã®ç¢ºèªãšãã£ãŒãããã¯1ïŒQAïŒ å®è£
2ïŒéçºè
ïŒ ä»äžå
容ã®ç¢ºèªãšãã£ãŒãããã¯2ïŒQAïŒ MagicPodã·ããªãªåæ ãã±ãŒã¿ãŒã®å€å IDä»äžååŸã§ãã±ãŒã¿ãŒãã©ã®ããã«å€åããã®ããTextFieldãäŸã«ããŠèšèŒããŸããããšããšãiOS Class Chainã§å€åçãªãã±ãŒã¿ãŒãæå®ããŠããŸããããAccessibility IDãä»äžããããšã§ãIDæå®ãIDãèµ·ç¹ãšããiOS Class Chainã䜿çšã§ããŸããããã«ãããèŠçŽ ãæç¢ºã«è¡šç€ºãããç¶æ
ã§æäœã宿œããããšã容æã«ãªããŸãã Accessibility IDä»äžå -ios class chain=**/XCUIElementTypeTextField[1] Accessibility IDä»äžåŸ accessibility id=input_form_abc ãŸã㯠-ios class chain=**/XCUIElementTypeTextField[`name == "input_form_abc"`] 倱æçã¯ã©ãå€åããã Accessibility IDä»äžååŸã§å€±æçãæ¯èŒãããšããã倧ããªå€åãèŠãããŸããã Android iOS iOSã®å ŽåãIDä»äžããã®æ©èœãå«ãã·ããªãªã«ãŠã20%ãè¶
ããŠãã倱æçã4%å°ãŸã§äžãããåçŽã«ãã±ãŒã¿ãŒååŸã倱æããããšã¯ç¡ããªããŸããã1ã¶æã»ã©çµé芳å¯ããŠãå®å®ããŠããããã確å®ãªå¹æããã£ããšèšããŸããAndroidã®å ŽåãiOSãããIDä»äžããã®æ©èœã¯éå®çã§ãããäžåºŠå€±æçãè·³ãäžãã£ããã®ã®ãçŸåšã®å€±æçã¯1%ãäžåã£ãŠããããã¡ããè¯ã广ããã£ããšèšããŸãããŸããAccessiblity IDãèµ·ç¹ãšããXPathã®æŽ»çšãã§ããããã«ãªãããã±ãŒã¿ãŒã®å¯èªæ§ãå®å®æ§ãé«ããªããŸããã çµããã« ä»åã¯ãã±ãŒã¿ãŒååŸã®å€±æãæžããããšã«æ³šåããAccessibility IDãä»äžããéžæãããŸããã倱æçãäžããããšã§ãã·ããªãªä¿®æ£ã®æéãæžãããçµæçã«ã¯ãã¹ãèªååéçšã³ã¹ãäœäžã«ã€ãªãããŸãããå®è¡é床ãççž®ããããããŒã¿ãã¿ãŒã³ã掻çšãããããšãã£ããã¹ãèªååã®æ©ã¿ã¯å°œããŸããããã¹ã¿ã³ãã€ã®åãçµã¿ãã©ããã§ãŸãã玹ä»ã§ããã°ãšæããŸãã 以äžããããŸã§ãä»ãåãããã ãããããšãããããŸããïŒ ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com ãã¹ãã·ããªãªã¯ããœãããŠã§ã¢ã®ç¹å®ã®æ©èœããããŒãæ€èšŒããããã«èšå®ãããäžé£ã®æäœãæ¡ä»¶ã®ããšãæããŸããã·ããªãªã¯ããã¹ãèªååããŒã«ã«ãã£ãŠå®è¡ãããå
·äœçãªã¹ãããã®éãŸãã§ããã¹ã¿ã³ãã€ã§ã¯ããå€åå°ãæå®ããŠæ±äººãæ€çŽ¢ããããšãã£ã圢ã§ãã·ããªãªãåå²ããŠããŸãã ↩ ãã±ãŒã¿ãŒã¯ããã¹ãèªååã«ãããŠããã¹ã察象ã®ã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ïŒUIïŒèŠçŽ ãèå¥ããæäœããããã«äœ¿çšãããæ¹æ³ãææ®µã§ãããã±ãŒã¿ãŒã¯ãç¹å®ã®èŠçŽ ãæ£ç¢ºã«ç¹å®ãããã¹ãã¹ã¯ãªããããã®èŠçŽ ã«å¯ŸããŠé©åãªã¢ã¯ã·ã§ã³ïŒã¯ãªãã¯ãå
¥åãæ€èšŒãªã©ïŒãå®è¡ã§ããããã«ããŸããã¢ãã€ã«ã¢ããªã®èªååã§å©çšããããã®ã«ãXpathãªã©ããããŸãã ↩
æ ªåŒäŒç€Ÿã¹ã¿ã³ãã€ã§ãã¶ã€ã³ã»ããã³ããšã³ããæ
åœããŠããäžæ¬ã§ãã ã¹ã¿ã³ãã€ã§ã¯ãªãŠã³ãã¡ãã£ã¢ãšããŠãã¹ã¿ã³ãã€plusãïŒ https://jp.stanby.com/magazine/ ïŒããããŸãã ã¹ã¿ã³ãã€plusã§ã¯ãä»äºã«ãããŠèªåã¯äœãã§ãããïŒç§ãªããã§ããããªããšãã§ãããã ïŒãšããæ°ã¥ãã»æ
å ±ã®æäŸãæèãæŽ»åãããŠãããŸãã ãããããŒãžã®ãã¶ã€ã³äžæ°ã®èæ¯ ãããããŒãžã¯æã
ã®ãµãŒãã¹ãçè§£ããããã®éèŠãªçªå£ãšèããŠããŸãã ããããçŸç¶ã¹ã¿ã³ãã€plusã§ã¯èšäºããå
¥ã£ãŠæ¥ãããæ¹ãå€ãããšãããçºãããã ãããããŒãžãååšããã ãã®ç¶æ
ãšãªãããããããŒãžããèšäºãèªãŸããæ°ãç¡ããã®ã§ã¯ïŒãšæããããããã«ãªããŸããã ããã§ã課é¡ã粟æ»ã以äžã®ç¹ãæ¹åããããšãç®æããŸããã å
šäœãéããŠã©ããªèšäºããããçŽæçã«ããããªã 现ããèå³ã«æ²¿ã£ãŠèªã¿é²ããããªã å
šäœãéããŠã©ããªèšäºããããçŽæçã«ããããªã ãã®åé¡ã«ã€ããŠã«ããŽãªã®èŠçŽãïŒã«ããŽãªãéå±€åïŒãè¡ããŸããã çŸç¶4ã€ã®ã«ããŽãªã®ã¿ååšãããã®äžã«èšäºãåé¡ãããŠããŸããããããã1ã€1ã€ã®åé¡ã倧ãããããããããã ãã§ã¯ã©ããªèšäºãããã®ãããããªããšæããŸããã çŸç¶æ°çŸããèšäºããã£ã4ã€ã®ã«ããŽãªã«åé¡ããããããèå³ããã€èšäºãèŠã€ããã®ã¯ãšãŠã倧å€ãªäœæ¥ããšèããããŸãã åŸã
ã«çµã蟌ãã§æ¢ããŠããã ãããããæ°ãã«äžã«ããŽãªãèšçœ®ããæ¢ã«ååšããŠããèšäºã倧ã»äžã»å°ã«ããŽãªãžæŽçãçŽãããŒãžåå²ãããŸããã ããã«äŒŽããèšäºäžèЧããŒãžã®ãã¶ã€ã³ãé·ããã 瞊ã«äžŠã¹ãŠãããã®ã以äžã®ããã«èª¿æŽããŠããŸãã äžã«ããŽãªã®äžèЧãèšçœ® çŸç¶ã®å°ã«ããŽãªã®äžèЧ â ã¬ã€ã¢ãŠãå€æŽ (PCã§ã¯ã°ããŒãã«ããã²ãŒã·ã§ã³ãããSPã§ã¯ã¢ã³ãŒãã£ãªã³ãããã«ããŽãªéžæå¯èœ) ãããããŒãžã«ãããŠã¯ãèšäºãæ¢ãéã©ã®ãããªã€ã¡ãŒãžãæã£ãŠèšäºãæ¢ããããåã«ããŽãªãšãªã¢ã«ã«ããŽãªã®ç¹åŸŽãäŒããããã«èª¬ææã远å ããããã«çްããåé¡ãããäžã«ããŽãªãžçŽæ¥é·ç§»ã§ããããã¿ã°ãèšçœ®ããŸããã 现ããèå³ã«æ²¿ã£ãŠèªã¿é²ããããªã ãã¡ãã®èª²é¡ã«é¢ããŠã¯ã解決çã®ïŒã€ãšããŠåè¿°ãããå
šäœãéããŠã©ããªèšäºããããçŽæçã«ããããªããã§è¡ã£ãã«ããŽãªã®èŠçŽãã«ïŒçްååïŒãã£ãŠè§£æ±ºã§ããéšåããããŸãã ãã1ã€ã®è§£æ±ºçãšããŠããããããŒãžãžèšäºã®æ²èŒæ°å¢å ãæ€èšããŸããã ããããããŒãžãžèšäºã®æ²èŒæ°å¢å ããšã¯ã©ãããããšãïŒ ãã ãããããŒãžã«èšäºã®æ°ãå¢ãããçŸç¶ã®ã«ããŽãªãæŽçããã ããšããããšã§ã¯ãªããæ°ããªåãå£ãæã£ãŠèªè
ã«ä»ã«ãã©ã®ãããªèšäºãããããäŒããããèããŸããã ä»åæ°ããªä»¥äžã®ãã®ããããããŒãžãžè¿œå ããŸããã 仿ã®äººæ°èšäº èšäºç£ä¿®è
仿ã®äººæ°èšäº ãããããŒãžã«ãããŠã仿ã®äººæ°èšäºãæ²èŒããããšã§ãã»ãã«ã©ã®ãããªèšäºã人æ°ãªã®ããçŽæçã«äŒããããšãã§ããããã«ãªããŸããã ãŸããæè¿ã®ã¢ã¯ã»ã¹æ°ãå€ããã®ãäžäœã«è¡šç€ºãããããèªè
ã«ãšã£ãŠãèå³ãæã£ãŠããã ããèšäºãèŠã€ãããããªããŸããã èšäºç£ä¿®è
èšäºç£ä¿®è
ã衚瀺ããããšã§ãèšäºã®ä¿¡é Œæ§ãé«ããããšãã§ãããšèããŸããã ååéã§ã®å°éå®¶ãç£ä¿®ããŠããèšäºããããšèšãäºãç¥ãããšã§ãèªè
ã«ãšã£ãŠãå®å¿ããŠèšäºãèªãããšãã§ããããã«ãªããŸãã ãŸããèšäºç£ä¿®è
ã®ãããã£ãŒã«ãžã®äžèЧããŒãžãèšçœ®ããç£ä¿®è
ã®ãããã£ãŒã«ãèŠãããšã§ãã®äººç©ã®å°éæ§ãç¥ãããšãã§ãããããããæ·±ãèšäºãçè§£ã§ããããã«ããŸããã ä»åŸã¯ãæ°ã«ãªã£ãç£ä¿®è
ãã©ã®èšäºãç£ä¿®ããŠããããããããã«ãããŠãããããšèããŠããŸãã ãŸãšã ä»åããããããŒãžããèšäºãèªãŸããæ°ãç¡ãã®ã§ã¯ïŒããšããçåããããããããŒãžããèŠãæã©ããªèšäºãããã®ãïŒçްããèå³ã«æ²¿ã£ãŠèªã¿é²ãã§ããããããã«ãªãã®ãïŒãšããç¹ãæèããŸããã ãã ããŸã ãŸã æ¹åãã¹ãç¹ãå€ããããã³ã³ãã³ããUIãããã«ã¯ããã©ãŒãã³ã¹çãæ¹åãã¹ããšãããå€ããããŸãã ä»åŸãèªè
ã®æ¹ã
ã«ãšã£ãŠäœ¿ãããããèªã¿æãæèããã¡ãã£ã¢ãç®æããæ¹åãç¶ããŠãããŸãã (å·ŠïŒæ§ãããããŒãž / å³ïŒæ°ãããããŒãž) ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
æ ªåŒäŒç€Ÿã¹ã¿ã³ã〠QAã°ã«ãŒãã«æå±ããŠãã岞ã§ããæ¬èšäºã§ã¯ãã¹ã¿ã³ãã€ã®èåŒ±æ§æ€ç¥ã®éçšã«ã€ããŠç޹ä»ããŸãã ã¹ã¿ã³ãã€ã§ã¯èåŒ±æ§æ€ç¥ã®ã·ã¹ãã ãšããŠ2022幎ããyamoryãšããããŒã«ã䜿ã£ãŠãããŸãã åç
§URL: https://yamory.io/ yamoryã«ã¯ããã€ãã®æ©èœããããŸãããã¹ã¿ã³ãã€ã§ã¯ãããã¯ãã§å©çšããŠãããœãããŠã§ã¢ã®èåŒ±æ§æ€ç¥ãäž»ãšããŠäœ¿çšããŠããŸãã åç
§URL: https://yamory.io/service/vulnerability-management/ yamoryã«ããèåŒ±æ§æ€ç¥ã®å¯Ÿå¿ ãäºåæºåã 1.yamoryã«ã¹ã¿ã³ãã€ã䜿çšããŠããGitã¬ããžããªãç»é² ãéçšæã®å¯Ÿå¿ã 1.yamoryã宿çã«è匱æ§ããŒã¿ããŒã¹ãšç
§åãè匱æ§ã®æç¡ããã§ã㯠2.è匱æ§ãæ€åºãããæã«ã¡ãŒã«ãSlackã«ãŠéç¥ãè¡ããã 3.ã»ãã¥ãªãã£ããŒã ãå
容ã倿ãããããã¯ãéšéã«é£çµ¡ 4.è匱æ§ã®åªå
床ã«ããå®çŸ©ãããã«ãŒã«ã«åŸããããã¯ãéšéã§è匱æ§ã®å
容ãã¹ã¿ã³ãã€ã§ã®äœ¿ç𿹿³ã圱é¿ç¯å²ã確èªããäœ¿çšæ¹æ³ã®å€æŽãã©ã€ãã©ãªã®æŽæ°ãªã©ãè¡ããåçš®èªåãã¹ãã圱é¿ç¯å²ã«ãã£ãŠã¯QAã«ããæ€èšŒãéããŠãªãªãŒã¹ãããªã©å¿
èŠãªæªçœ®ããšããŸãã 5.察å¿ãå®äºããããšãã»ãã¥ãªãã£ããŒã ã«å ±å ããªã¢ãŒãžã¬ãã« yamoryããéç¥ãããè匱æ§ã¯ç€Ÿå
ã§è匱æ§ã®å¯Ÿå¿åªå
床ã«å¿ããŠå ±åã«ãŒã«ã察å¿ããæ
åœç¯å²ãæšå¥šãã察å¿é床ãªã©è匱æ§å¯Ÿå¿ã«ãŒã«ãå®çŸ©ãããŠãããŸãã yamoryã§ã¯æ€åºããè匱æ§ãããªã¢ãŒãžã¬ãã«ãšããïŒã€ã®ã¬ãã«ãååšããŠããŸããã¹ã¿ã³ãã€ç€Ÿå
ã§ã¯ãã®ããªã¢ãŒãžã¬ãã«ã®æäžäœã®Immediateã®ããã«äžã®åºåãå®çŸ©ããç·æ¥å¯Ÿå¿ãšããŠæåªå
察å¿ããã¬ãã«ãã€ããŠããŸãã åç
§URL: https://yamory.io/docs/auto-triage/ è匱æ§å¯Ÿå¿ã®éèŠæ§ 察å¿åªå
床ãé«ãè匱æ§ã¯ãã¡ããç·æ¥å¯Ÿå¿ã§å¯Ÿå¿ããŠããŸãããå±éºåºŠãäœãè匱æ§ãçµã¿åãããããšã§ãµãŒãã¹éå¶ã«æãã¬åœ±é¿ãã§ãå¯èœæ§ããããŸããã¹ã¿ã³ãã€ç€Ÿã§ã¯å±éºåºŠãäœãè匱æ§ã«ã察å¿ã«ãŒã«ãèšããŠè匱æ§ã®æ²æ»
ã«åãçµãã§ãããŸãã éå»ã«çºçããè匱æ§ã®äºäŸã§ã¯2021幎ã®log4jã®è匱æ§ããããäžéçã«åºã䜿ãããŠããã©ã€ãã©ãªãªã ãã«ITæ¥çãéæŒãããè匱æ§ãèšæ¶ã«æ®ã£ãŠããŸãã åºå±ïŒ Log4Shell Apache Log4jã«èŠã€ãã£ãè匱æ§ãLog4Shellããšã¯ Apache Log4j ã®è匱æ§å¯Ÿçã«ã€ããŠ(CVE-2021-44228) æšä»ã®ãããã¯ãéçºã«ãããŠè¿
éã§æé©ãªéçºããµãŒãã¹éçšãè¡ãããã«ããOSSã®æŽ»çšã¯äžå¯æ¬ ã§ããããµãŒãã¹ã®éçºãéå¶ã«ã¯éåžžã«å€ãã®OSSã䜿çšããŠããŸããããããäžæ¹ã§OSSã®82%ã®ã³ã³ããŒãã³ããè匱æ§ãã»ãã¥ãªãã£åé¡ãä¿å®æ§ã®åé¡ãªã©æœåšçã«ãªã¹ã¯ãæ±ããŠãããšèšãããŠããŸãã åºå±ïŒ Lineaje Report Reveals 82% Of OSS Components Are âInherently Riskyâ Due To Security Issues OSSã©ã€ãã©ãªã®è匱æ§ã®æ
å ±ã¯JVN iPedia<è匱æ§å¯Ÿçæ
å ±ããŒã¿ããŒã¹ïŒãæ§ã
ãªITç³»ã®ãã¥ãŒã¹ãµã€ããªã©ã§ææ°ã®æ
å ±ãå
±æãããŠããŸããããµãŒãã¹ã§äœ¿çšããŠãã倧éã®OSSã®è匱æ§ã®æ
å ±åéã人åã§ç¶ç¶çã«è¡ãããšã¯è³é£ã§ãããéèŠãªè匱æ§ã®æãæŒããçã¿åºããããŸãããè匱æ§ã®åœ±é¿ç¯å²ãæ·±å»åºŠã«ãã£ãŠã¯ãµãŒãã¹ããå©çšããã ããŠããã客æ§ã«ãå€å€§ãªãè¿·æããããããšãšãªãã貎éãªãæéãã客æ§ã®å€§åãªããŒã¿ãå±éºã«ãããããšã«ãªããŸãã ã¹ã¿ã³ãã€ã®æ±äººæ€çŽ¢ãšã³ãžã³ã䜿çšããŠããã©ã€ãã©ãªã«è匱æ§ãçºèŠããå Žåããã¥ãŒã¹ã§éšãããããšã瀟å¡ãèªèã瀟å
ã§å¯Ÿå¿ãå§ãŸãã®ã§ã¯ãªããæ€ç¥ã·ã¹ãã ã«ããè匱æ§ãæ€ç¥ãããæ
åœããŒã ãè¿
éã«å¯Ÿå¿ã§ããä»çµã¿ã¯å®å¿ããŠã客æ§ã䜿ããããµãŒãã¹ã®éå¶ã«å¿
èŠäžå¯æ¬ ãšèããŠããŸãã æ
å ±åéã¯ååçã« ã§ããããã«ããŠããã 察å¿ãå¿
èŠã«ãªã£ãæã¯èœåçã« åããããã«ããŠããããšã倧åãšèããŠããŸãã æåŸã« ä»åŸãã客æ§ã«å¿«é©ã§æé©ãªä»äºæ¢ããè¡ããæ±äººæ€çŽ¢ãšã³ãžã³ã®éçºãéçšã«åãçµãã§ãŸãããŸãïŒ ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
ã¯ããã« åããŸããŠãæ ªåŒäŒç€Ÿã¹ã¿ã³ãã€SQGïŒSearch Quality GroupïŒã®åå·ãšç³ããŸãã SQGã®ããã·ã§ã³ã¯æ€çŽ¢å質ã®è©äŸ¡ã§ãè©äŸ¡çµæããããã¯ãéçºã«ãã£ãŒãããã¯ããŠããŸãã ãŸããç§ã¯çµç¹ã®äžã§å¥ã®åœ¹å²ãæ
ã£ãŠããããã®ïŒã€ã«KPIã®å質管çããããŸãããã®æ¥åã®ç®çã¯ãçµç¹ã®æææ±ºå®ãå®å®çã«ãµããŒãããããšã§ãã æ¬èšäºã§ã¯ããã®ãKPIã®å質管çãã«ãããŠå·¥å€«ãããRedashã®ããŒã¿åºåããã簡䟿ã«ããããã®åãçµã¿ã玹ä»ããããŸããRedashãæŽ»çšãããŠããæ¹ã«ã¯ãç¹ã«åèã«ãªãå
容ãšãªã£ãŠãããŸãã®ã§ããã²ãšããäžèªãã ããã åçš®ããŒã«ãç°¡åã«çŽ¹ä» ä»åã®åãçµã¿ã§äœ¿çšããããŒã«ã¯PythonãšRedashã§ããããããã«ã€ããŠãã©ã®ãããªããŒã«ãã説æããŸãã Python Pythonã¯ãªãŒãã³ãœãŒã¹ã®ããã°ã©ãã³ã°èšèªã§ãã倿§ãªã¢ãžã¥ãŒã«ãçšããŠãæ°åŠèšç®ãæ¥ä»åŠçãããŒã¿ããŒã¹æäœãªã©ã®äœæ¥ãè¡ãããšãã§ããŸãã ä»åã¯Pythonã§RedashAPIãå®è¡ããã¢ãžã¥ãŒã«ã䜿ããRedashããããŒã¿ãååŸããããšãšããŸããã Redash Redashã¯ããŒã¿ãå¯èŠåãåæããã®ã«åœ¹ç«ã€BIããŒã«ã®ãªãŒãã³ãœãŒã¹ãœãããŠã§ã¢ã§ããRedashã§éèšããããŒã¿ã¯CSVçã®ãã©ãŒãããã§ããŠã³ããŒãããããšãå¯èœã§ãã ç§ã¯æ®æ®µã®æ¥åã§RedashãæäœããŠææšãéèšããŠããŸãã®ã§ãä»åã®äœæ¥ã«ã€ããŠãRedashãéããŠææšãéèšããŠããŸãã Pythonã§Redashã®ããŒã¿ãæœåºããããšæã£ãçµç·¯ å°ã£ãŠããããš æ®æ®µã®æ¥åã«ãããŠã¯ãRedashããã§ååŸããããŒã¿ãGoogleã¹ãã¬ããã·ãŒãã«è»¢èšããæ°å€ãã§ãã¯ãè¡ã£ãŠå質管çãããŠããŸãã Redashã¯éåžžã«äŸ¿å©ãªããŒã«ãªã®ã§ãããæ¥ã
ã®ã«ãŒãã³ã¯ãŒã¯ãå®è¡ããããšããå Žåã¯ä»¥äžã®ãããªäœæ¥ãæåã§è¡ãå¿
èŠããããç
©éã«ãªããŸãã Redashãå®è¡ããŠææšãéèšãã éèšããææšãããŠã³ããŒããã ããŠã³ããŒãããããŒã¿ãç¹å®ã®ãã©ãŒãããã«æŽåœ¢ãã 1床ã®äœæ¥ã§ããã°ããã»ã©æéãããããŸããããæ¥ã
ã®æ¥åãšãªãã°è©±ã¯å€ãã£ãŠããŸããããªãã¹ã簡䟿ã«éèšããããèªåçã«æ¬²ãããã©ãŒãããã«æŽåœ¢ããããšã§äœæ¥ãã¹èªäœãæžãããããããšãã£ãæãã§ä»åèªååã«èžã¿åãããšã«ããŸããã ä»åã玹ä»ããããã°ã©ã ã䜿ãã°ãRedashããjson圢åŒã§ããŒã¿ãååŸåºæ¥ãããã«ãªããŸãã æºå ããããå
·äœçãªã³ãŒãã亀ããŠå®è£
æ¹æ³ã説æããŸãã 以äžã®ãããªããŒãã«ã§ããŒã¿ãååŸãããã®ã§ããŸãã¯Redashçšã®ããŒãã«ãšSQLã®æºåãããŸãã å
·äœäŸãšããŠã以äžã®ããŒã¿ãä¿åãããŠãããšããŸããããŒãã«å㯠stanby_table ãšããŸãã date user_id action 2023-12-01 id_1 view 2023-12-01 id_2 click 2023-12-02 id_1 view 2023-12-02 id_1 click 2023-12-02 id_2 click 2023-12-03 id_1 view 2023-12-03 id_3 view ãŸããPythonãéããŠå®è¡ããéã«ã¯ãRedashã®URLãå¿
èŠãšãªããŸãã ä»åã¯ä»®ã®URLãšã㊠https://redash-host-url/queries/12345 ã䜿ã£ãŠé²ããŸãã ãã¡ãã®Redashã®ããŒãžã«ã以äžã®SQLãä¿åãã stanby_table ããããŒã¿ãååŸã§ããç¶æ
ã«ããŸãã SELECT distinct user_id FROM stanby_table WHERE date(date) >= date('{{ start_date }}') AND date(date) <= date('{{ end_date }}') LIMIT 10 ; äžèšã®SQLã¯ã stanby_table ãããä»»æã®æ¥ä»ãæå®ããŠæ¥ä»ç¯å²ã®user_idãéè€ãªãååŸããŸãã åŸã®åŠçã®éœåäžãæ¥ä»ã®æå®ã®å€æ°ã¯ start_date ãš end_date ãšããŠãããŸãã å®è£
ã®æ¹æ³ 次ã«ãPythonããRedashAPIãå©çšããŠããŒã¿ã®éèšãè¡ãå®è£
ãé²ããŸãã 䜿çšããã¢ãžã¥ãŒã«ã¯ãªãŒãã³ãœãŒã¹ã® redash_dynamic_query ã§ãããã®ã¢ãžã¥ãŒã«ã§ãRedashã®APIãå®è¡ã§ããŸãããªããæ¬èšäºã§ã玹ä»ãã redash_dynamic_query ã®ããŒãžã§ã³ã¯ 1.0.4 ãšãªããŸãã Pythonã§ãã®ã¢ãžã¥ãŒã«ãå®è¡ããŠãRedashããããŒã¿ãæœåºãããã®ã§ããŸãã¯ãPythonã®ã¹ã¯ãªããäžã§ä»¥äžã®ã³ãŒããèšèŒããã¢ãžã¥ãŒã«ãã€ã³ããŒãããŸãã ã€ã³ããŒã ãšã¯ãå¥ã®ãã¡ã€ã«ïŒã¢ãžã¥ãŒã«ïŒã«èšè¿°ãããPythonã³ãŒããåãèŸŒãæ©èœã®ããšã§ãã 以äžã®ã³ãŒããå®è¡ããããšã§ã redash_dynamic_query ã䜿çšã§ããããã«ãªããŸãã from redash_dynamic_query import RedashDynamicQuery 次ã«ãRedashDynamicQueryã®åŒæ°ãèšå®ããŸããã³ãŒãã¯ä»¥äžã§ãã redash = RedashDynamicQuery( endpoint = 'https://redash-host-url/', apikey = 'your_api_key', ) endpoint ã¯Redashã®URLã®ãšã³ããã€ã³ãã«ãªããŸããä»å㯠https://redash-host-url/ ã§ãã apikey ã¯Redashã®ã¢ã«ãŠã³ãç·šéç»é¢ã§ç¢ºèªã§ããŸãã 以äžã®æé ã§ç»é¢ãé²ããã°ç¢ºèªå¯èœã§ãã Redashãéã settings ã®ç»é¢ãéã Account ã®ã¿ããéã API Keyæ¬ ã® API Key ã確èªãã èšèŒãããŠãã API Key ãã³ããŒããŠãäžèšã®ããã°ã©ã ã® your_api_key éšåãæžãæããŸãã æ¬¡ã«ãã¯ãšãªã®æå®ãè¡ããŸãã query_id ã®å€æ°ã«ã¯ãSQLåºæã®èå¥çªå·ã代å
¥ããŸããå
¥åããæåã¯Redashã®URLã«ãã queries/ çŽåŸã®çªå·ãšãªããä»å㯠12345 ã§ãã query_id = 12345 次ã«ãéå§æ¥ãšçµäºæ¥ã®æ¥ä»ãæå®ããŸãã start_date ãš end_date ã®ããããã«ãæååã§æ¥ä»ãèšèŒããŠãã ããã圢åŒã¯ yyyy-mm-dd ãšãªããŸãã start_date = '2023-12-01' # éå§æ¥ end_date = '2023-12-02' # çµäºæ¥ 次ã«ãæ¥ä»ã®åãRedashã«é©ãã圢ã«å€æŽããŸãããã¡ãã¯ãæå
ã®ããŒãã«ã®æ¥ä»ã®å次第ãªã®ã§ãå¿
èŠã«å¿ããŠèšå®ããŠãã ããã start_date = datetime.strptime(start_date, '%Y-%m-%d').strftime('%Y-%m-%d') 次ã«ããããŸã§èšå®ããå
容ã§RedashããããŒã¿ãååŸããŸãã 以äžã®ã³ãŒããå®è¡ãããšãRedashã®å®è¡çµæã倿° result ã«json圢åŒã§ä»£å
¥ããŸãã result = redash.query(query_id, {'start_date': start_date, 'end_date': end_date}) ããã§ãPythonã®ã¹ã¯ãªãããçšããŠRedashã®ããŒã¿ãjson圢åŒã§ååŸåºæ¥ãããã«ãªããŸããã 以éã¯ãjsonããããŒã¿ãã¬ãŒã ãªã©å©çšçšéã«åãããŠå倿ããããšã§ãã¹ãã¬ããã·ãŒãã«ç°¡æã«è»¢èšããããã°ã©ãæç»ã§ã®å©çšãCSVãã¡ã€ã«çã§åºåçµæã®ä¿åãªã©ãã§ããŸãã ãããŸã§ã®å
容ããŸãšããã³ãŒãå
šäœã¯ä»¥äžãšãªããŸãã # ã¢ãžã¥ãŒã«ã®ã€ã³ããŒã from redash_dynamic_query import RedashDynamicQuery # endpoint ãš apikey ã®æå® redash = RedashDynamicQuery( endpoint = 'https://redash-host-url/', apikey = 'your_api_key', ) # ã©ã®SQLãå®è¡ããããæå® query_id = 12345 # éå§æ¥ãšçµäºæ¥ãæå® start_date = '2023-12-01' # éå§æ¥ end_date = '2023-12-02' # çµäºæ¥ # æ¥ä»ã®åã RedashDynamicQuery ã«é©ãã圢ã«å€æŽ start_date = datetime.strptime(start_date, '%Y-%m-%d').strftime('%Y-%m-%d') # Redashã®å®è¡å
容ã result ã«json圢åŒã§æ ŒçŽ result = redash.query(query_id, {'start_date': start_date, 'end_date': end_date}) ã¹ã¿ã³ãã€ã®äžã®æŽ»çšäºäŸ åé ã§è¿°ã¹ããšãããç§ã¯ãKPIã®å質管çãã®æ¥åãè¡ã£ãŠããããã®äžç°ã§ä»åã®ããã°ã©ã ãäœæããããšã§ãåŸæ¥å°ã£ãŠããRedashã®å®è¡ããç¹å®ã®ãã©ãŒããããžã®æŽåœ¢ããä»åã玹ä»ããPythonã®ã³ãŒãã§å®çµã§ããããã«ãªããŸããã å®éã®æ¥åã§ã¯ã玹ä»ããPythonã®ã³ãŒãã«å ããjsonãããŒã¿ãã¬ãŒã ã«å€æŽããŠGoogleã¹ãã¬ããã·ãŒãã«è»¢èšããåŠçãè¡ã£ãŠããŸããããã«ãããåæãéå§ãããŸã§ã®ã¹ããããç°¡ç¥åããçµæåæã®ããã®æéãå€ãåãããšãã§ããŠããŸãã å®è£
ããææ³ å®è£
ããåã¯ãæäœæ¥ãå€ãããããã¥ãŒãã³ãšã©ãŒãçããå±éºæ§ããããŸããã ä»åã®å®è£
ãéããŠåæã®ããã»ã¹ãŸã§ã®äœæ¥ããªãã¹ãç°¡ç¥åã§ããã®ã§ãããŒã¿ã®ç¢ºèªãåæã«ãå€ãã®æéãå²ããããã«ãªããŸãããçµæãKPIã®å質æ
ä¿ã«è²¢ç®ã§ããŠãããšæããŠããŸãã ä»å玹ä»ããããã°ã©ã ã䜿ã£ãŠãRedashã®å®è¡çµæãPythonã§ååŸã§ããããã«ããŸãããããã«ãããPythonã䜿çšããŠããŒã¿åæãå¯èœãšãªããããã«é«åºŠãªåæãè¡ããŸãã ä»åŸã¯ããã®æ¹æ³ãæœçã®åæã«ãå¿çšããããšèããŠããŸãã ãŸãšã ä»åã®èšäºã§ã¯ãPythonã§Redashã®ããŒã¿ãååŸããæ¹æ³ã«ã€ããŠãå
·äœçãªã³ãŒãã亀ããŠç޹ä»ããŸããã ãã¡ãã®åŠçãããããšã§ãæãåãããŠããäœæ¥ã®äžéšãèªååã§ãããã®çµæKPIã®åæã«è²»ããæéãå¢ããããšãã§ããŸããã ããã°ã©ã èªäœã¯éåžžã«ã·ã³ãã«ã§ããã€ä»åŸçºå±æ§ãèŠèŸŒããå®è£
ãšãªããŸããã®ã§ããæŽ»çšããã ããå
容ã§ããããšãŠãå¬ããã§ãã ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
æ€çŽ¢ãšã³ãžã³ãVespaãžç§»è¡ããŠããŸã ããã«ã¡ã¯ãã¹ã¿ã³ãã€ã§æ€çŽ¢åšãã®éçºãæ
åœããŠããé·¹åã§ãã ä»åã¯ã¹ã¿ã³ãã€ã§å©çšããŠããæ€çŽ¢ãšã³ãžã³ãVespaãžç§»è¡ããŠãã話ã玹ä»ããŸãã æ€çŽ¢ãšã³ãžã³ç§»è¡ã®èæ¯ Stanby Tech Blogã® ã¹ã¿ã³ãã€2+1幎ã®è»è·¡ ã®èšäºã§èª¬æãããŠããéãã ã¹ã¿ã³ãã€ã§ã¯ãäž»ã«æ±äººæ€çŽ¢æ©èœãæäŸããŠããŸããããã®äžã§ããªãŒã¬ããã¯(ç¡ææ²èŒ)ãšåºå(æææ²èŒ)ãšããïŒçš®é¡ã®æ€çŽ¢ãååšããŸãã ãã®2çš®é¡ã®æ€çŽ¢ã§ã¯ããããã§ç°ãªãæ€çŽ¢ãšã³ãžã³ã䜿çšããŠããŸãã ãªãŒã¬ããã¯æ€çŽ¢: Yahoo! ABYSSãšããæ€çŽ¢ãã©ãããã©ãŒã åºåæ€çŽ¢: Elasticsearch ãã®ããã«ãªã£ãŠããèæ¯ã«ã€ããŠã¯ãåè¿°ã®èšäºã«è©³çްãèšèŒãããŠããŸãã®ã§ãèå³ãããæ¹ã¯ãã¡ãããåç
§ãã ããããããŸã§ããã®ïŒçš®é¡ã®æ€çŽ¢ãšã³ãžã³ãéçšããŠããŸããããããããã«èª²é¡ãæ±ããŠããŸããã ãªãŒã¬ããã¯æ€çŽ¢ã«ãããèª²é¡ ãªãŒã¬ããã¯æ€çŽ¢ã«ããã課é¡ãšããŠã¯ã ãŸããæ€çŽ¢ãšã³ãžã³èªäœãå©çšã§ããªããªããªã¹ã¯ã§ãã ABYSSã®æäŸãçµäºããå Žåãã¹ã¿ã³ãã€ã®ãµãŒãã¹å
šäœã忢ããŠããŸãå¯èœæ§ããããŸãã æ¬¡ã«ãéçºäžã®å¶çŽããããŸãã ã¹ã¿ã³ãã€ã¯ABYSSãšããæ€çŽ¢ãã©ãããã©ãŒã ã®å©çšè
ã§ããããããšã³ãžã³èªäœã®éçºãã§ããŸããããã®çµæãæ€çŽ¢ãšã³ãžã³ã®éçºã粟床ã®åäžã«ãããŠãèªç€Ÿã§å®çµã§ããä»ç€Ÿã«äŸåããŠããŸãã ãŸããã¹ã±ãŒãªã³ã°ã®ç¹ã§ãåé¡ãçããŠããŸãã å¥çŽã®éœåäžãã¯ã©ãŠããµãŒãã¹ã®ããã«å³åº§ã«ãµãŒãå°æ°ã墿žã§ããã ãã©ãã£ãã¯ã«å¿ããæè»ãªå€æŽãã§ããŸããã ãã®ãããåžžã«æå€§ã®ãã©ãã£ãã¯ã«èãããããµãŒãå°æ°ã確ä¿ããŠããå¿
èŠããããŸãã æåŸã«ãçµéšãšç¥èã®é¢ã§ã®èª²é¡ãæããããŸãã ä»ç€Ÿã®æ€çŽ¢ãšã³ãžã³ãå©çšããŠãããšã ã¹ã¿ã³ãã€å
ã§æ€çŽ¢ãšã³ãžã³éçºã®ç¥èãéçšçµéšãèç©ãããã é«åºŠãªæ€çŽ¢ãšã³ãžã³ã®éçºãéçšãé£ããç¶æ
ã«ãããŸãã åºåæ€çŽ¢ã®èª²é¡ åºåæ€çŽ¢ã®èª²é¡ãšããŠã¯ãç¬èªã«éçºããŠãããã©ã°ã€ã³ã®éçºã»ã¡ã³ããã³ã¹ã®è² æ
ãæããããŸãã ã¹ã¿ã³ãã€ã§ã¯ãElasticsearchã®ç¬èªãã©ã°ã€ã³ãéçºããã©ã³ãã³ã°æ©èœãå®çŸããŠããŸãã ãã®ãã©ã°ã€ã³å°å
¥åœæãæ¢åã®OSSãã©ã°ã€ã³ã§ã¯ãå®çŸããã仿§ãæ§èœãæºãããªãã£ããããç¬èªã§å®è£
ããããšã«ããŸããã ããããªãããã©ã³ãã³ã°å€æŽã®ãã³ã«ãã©ã°ã€ã³ã®æ¹ä¿®ãããªããã°ãªãããæ¹åã®ããã«ããã¯ãšãªã£ãŠããŸã£ãŠããŸãã ãŸããElasticsearchã®ããŒãžã§ã³ãäžãããã³ã«å¯Ÿå¿ãå¿
èŠã§ããå ããŠãã€ã³ãã©ã³ã¹ãã®åé¡ããããŸãã äžèšã®ãã©ã°ã€ã³ã®åœ±é¿ã«ãããæ§èœãæºããããã«å¿
èŠãªãµãŒãã®å°æ°ãå€ãã€ã³ãã©ã³ã¹ãã®å¢å ã«ã€ãªãã£ãŠããŸãã å
±éã®èª²é¡ ããã«ããªãŒã¬ããã¯ãšåºåã§ç°ãªãæ€çŽ¢ãšã³ãžã³ãéçšããŠããããšã«ãã課é¡ãååšããŠããŸãã ç°ãªããšã³ãžã³ãå©çšããŠããããšããã粟床æ¹åã®ããã®å®è£
ãããããã®ãšã³ãžã³ã§å
±æã§ããã åãæœçã§ããªãŒã¬ããã¯ãšåºåã§å¥ã
ã«å®è£
ããªããã°ãªããŸãããããã«ããã宿œã§ããå
šäœã®ç²ŸåºŠæ¹åæœçã®æ°ãæžå°ããŠããŸãã ãŸããåŠç¿ã³ã¹ããéçšã«ãããã³ã¹ãã2åã«ãªããæ¬æ¥ã®æ€çŽ¢æ¹åãè¡ãããã®æéãæžå°ããŠããŸã£ãŠããŸãã æ€çŽ¢ãšã³ãžã³ã®çµ±äžã®æ±ºå® ãããã®èª²é¡ãè§£æ¶ããããã以äžã®ãããªç®çã§æ€çŽ¢ãšã³ãžã³ãçµ±äžããèªç€Ÿã§éçšããæ¹éãæ±ºå®ãããŸããã 瀟å
ã®æ€çŽ¢ãšã³ãžã³ãçµ±äžããããšã§ããšã³ãžãã¢ãªã³ã°ãªãœãŒã¹ãéçŽããæ€çŽ¢ãšã³ãžã³éçšãšæ€çŽ¢ãµãŒãã¹éçºã®å¹çãäžãã èªç€Ÿã§æ€çŽ¢ãšã³ãžã³ãéçšããããšã§ãæ
å ±æ€çŽ¢æè¡ãæ€çŽ¢ãšã³ãžã³ã«é¢ããæ·±ãç¥èã瀟å
ã«èç©ãã ã·ã¹ãã æäŸããœãããŠã§ã¢ã©ã€ã»ã³ã¹ã«é¢ããŠèªç€Ÿã§ã³ã³ãããŒã«ã§ããªãå¶çŽäºé
ãå¯èœãªéãæé€ããèªç±åºŠé«ãæ€çŽ¢ãµãŒãã¹ã®éçºãè¡ããããã«ãã æ€çŽ¢ãšã³ãžã³ã®éžå® æ€çŽ¢ãšã³ãžã³ãçµ±äžããã«ããã£ãŠãã¹ã¿ã³ãã€ã§ã¯æçµçã« Vespa ãæ¡çšããŸããã ããããã¯ããªãVespaãéžãã ãã«ã€ããŠèª¬æããŸãã ã¹ã¿ã³ãã€ã®æ€çŽ¢ã®ç¹åŸŽ æ€çŽ¢ãšã³ãžã³ã®éžå®ã«åœãã£ãŠããŸãã¯çŸç¶ã®æ€çŽ¢ã®ç¹åŸŽãææ¡ããå¿
èŠããããŸãã ã¹ã¿ã³ãã€ã®æ€çŽ¢ã®ç¹åŸŽããŸãšãããšä»¥äžã®ããã«ãªããŸãã æ€çŽ¢ é«ãã©ãã£ã㯠åœå
ææ°ã®æ±äººæ€çŽ¢ãšã³ãžã³ ãµãŒãã¹ã®æé·ã«äŒŽãä»åŸãæŽã«å¢å èŠèŸŒã¿ äœã¬ã€ãã³ã·ãŒ ã¹ã¿ã³ãã€ã¯æ€çŽ¢ãäž»äœãªã®ã§ãæ€çŽ¢çµæç»é¢ã®è¡šç€ºã«æéãããããšããŠãŒã¶ãé¢è±ããŠããŸããŸããåºåãæ€çŽ¢ãªã®ã§ã売äžã®äœäžã«çŽæ¥ã€ãªãã£ãŠããŸããŸãã æŽæ° æ€çŽ¢å¯Ÿè±¡ã®ããã¥ã¡ã³ãéãå€ã 1000äžä»¶ä»¥äžã®æ±äººããŒã¿ãæ±ã£ãŠããŸãããŸããæ±äººæ€çŽ¢ãšã³ãžã³ã®ç¹æ§äžãç¹å®ã®æ±äººã ãæ€çŽ¢ã§ããã®ã§ã¯ãªãããã¹ãŠã®æ±äººãçããåžžã«æ€çŽ¢ã§ããç¶æ
ã«ãªã£ãŠããå¿
èŠããããŸãã ããã¥ã¡ã³ãã®ç»é²ãšåé€ãé »çºãã æ±äººç¥šã¯åç€Ÿã®æ¡çšç¶æ³ã«å¿ããŠãé »ç¹ã«å
¬éãéå
¬éãè¡ãããŸãã æ°èŠå
¬éæ±äººã®åæ é床ãéèŠã§ãããç¹ã«ã¯å¿åæã®ãã©ãã«é²æ¢ã®ããã«æ±äººç¥šã®åãäžããæŽæ°ã«ã€ããŠã¯æ±äººããŒã¿ãã¹ã¿ã³ãã€ã«é£æºããããå³æåæ ãããå¿
èŠããããŸãã åŸè¿°ããæ©æ¢°åŠç¿ã«äœ¿ãããã®ãç¹åŸŽéããŒã¿ã®åæ ã®ããã®éšåæŽæ°ãå¿
èŠãšãªããŸãã æ©æ¢°åŠç¿ ã¹ã¿ã³ãã€ã§ã¯ãæ€çŽ¢çµæã®ã©ã³ãã³ã°ã«æ©æ¢°åŠç¿ã¢ãã«ã掻çšããŠããŸãã GBDTã¢ãã«ãçšããã©ã³ãã³ã° two-phase ranking æ©æ¢°åŠç¿ã¢ãã«ãäœæããŠããæ©æ¢°åŠç¿ããŒã ãšæ€çŽ¢åºç€ããŒã ãå¥ ç¬èªã®ãã©ã°ã€ã³ã ãšãæ©æ¢°åŠç¿ããŒã ãæ€çŽ¢åºç€ããŒã ã«äŸåããŠããŸããŸã ããããã§æ¹åãè¡ãããããªäœå¶ãæãŸããã§ãã æ¬¡ã«æ€çŽ¢ãšã³ãžã³Vespaã®æŠèŠãšç¹åŸŽã«ã€ããŠèª¬æããŸãã Vespaãšã¯ Vespaãšã¯ããªãŒãã³ãœãŒã¹ã®big data searving engineã§ãã ãªã³ã©ã€ã³ã§ããã°ããŒã¿ã«AIãé©çšã§ããããšãç¹åŸŽã§ãã Vespaã¯æ€çŽ¢ã«éãããã¬ã³ã¡ã³ããäŒè©±AIãªã©ãæ§ã
ãªçšéã«å©çšã§ããŸãã ããšããšã¯ãYahooïŒç±³ïŒã®ç€Ÿå
ã§éçºãããŠããŸãããã 2017幎ã«ãªãŒãã³ãœãŒã¹å 1 ããã2023幎10æã«ã¯YahooïŒç±³ïŒããã¹ãã³ã¢ãŠããç¬ç«ããäŒæ¥ãšãªããŸããã 2 Yahooã®æ€çŽ¢ã§ã®é·ãå®çžŸããããå€§èŠæš¡ãªéã®ããã¥ã¡ã³ããšãã©ãã£ãã¯ã«å¯Ÿå¿ã§ããèœåã蚌æãããŠããŸãã 1æ¥ã«25Bã®ãªã¢ã«ã¿ã€ã ã¯ãšãªãš75Bã®ã©ã€ãã£ã³ã°ïŒæŽæ°ïŒãåŠçå¯èœã§ãã ãŸããSpotifyãªã©ã®ã°ããŒãã«ã«å€§èŠæš¡ãªãµãŒãã¹ãå±éããäŒæ¥ã§ãæ¡çšããå§ããŠããŸãã 3 Vespaã®ç¹åŸŽ é«éãªæ€çŽ¢ãšé«ãã¹ã±ãŒã©ããªã㣠Vespaã¯ãªã¢ã«ã¿ã€ã ã§äœã¬ã€ãã³ã·ãã€é«ã¹ã«ãŒããããæ±ãããããŠãŒã¹ã±ãŒã¹ã«æé©åãããŠããŸãã æ°åããªç§ä»¥äžã®ã¬ã€ãã³ã·ã§ã¬ã¹ãã³ã¹ãè¿ãããšãå¯èœã§ãã ãŸãã䞊åã«ã¯ãšãªãå®è¡ããããšã§ãã©ã®ãããªã¯ãšãªéãããŒã¿éã§ãäžå®ã®å¿çæéãç¶æã§ããããã«èšèšãããŠããŸãã ããã«ãã¯ãšãªããšã«è€æ°ã®ãµãŒãã£ãŒã¹ã¬ãããæŽ»çšããã¹ã«ãŒãããã«å¯ŸããŠã¬ã€ãã³ã·ãæè»ã«ã¹ã±ãŒã«ã§ããŸãã ãŸããVespaã¯é«ãã¹ã±ãŒã©ããªãã£ãåããŠããŸãã Vespaã®ããã¥ã¡ã³ãã¯ãã±ãããšåŒã°ããåäœã§ç®¡çãããŸãã ãã±ããã®ãµã€ãºãšæ°ã¯Vespaã«ãã£ãŠå®å
šã«ç®¡çããã æåã§ã·ã£ãŒãã£ã³ã°ãå¶åŸ¡ããå¿
èŠã¯ãããŸããã ãã®ãããããŒããã¯ã©ã¹ã¿ã«è¿œå ããã ãã§ç°¡åã«ã¹ã±ãŒã«ã§ããŸãã å°æ¥çã«ã¢ã¯ã»ã¹ãå¢å ããŠãã¹ã±ãŒã«ã¢ãŠãã容æã§ãã å¹ççãªã€ã³ããã¯ã¹äœæ Vespaã®ã€ã³ããã¯ã¹äœæã¡ã«ããºã ã¯äœã¬ã€ãã³ã·ã§ã®æŽæ°ã«æé©åãããŠãããåžžã«ããŒã¿ãå€åããã·ããªãªã«é©ããŠããŸãã éåžžã®æ€çŽ¢ãšã³ãžã³ã®ã€ã³ããã¯ã¹äœæã¯ããªã¢ã«ã¿ã€ã ã®æžã蟌ã¿ãå®çŸããããã«ã æžã蟌ã¿ã«å¯ŸããŠã€ãã¥ãŒã¿ãã«ãªè»¢çœ®ã€ã³ããã¯ã¹ã®ã»ã°ã¡ã³ããæ§ç¯ãã ããã¯ã°ã©ãŠã³ãã§ããããããŒãžããããšã§è¡ãããŸãã 倧ããªã»ã°ã¡ã³ããšã®ããŒãžã«ã¯éåžžã«é·ãæéããããããã å€ãã®å ŽåãåŸã
ã«å€§ãããªãè€æ°ã®ã»ã°ã¡ã³ãã䜿çšããè€æ°åããŒãžããå¿
èŠããããŸãã ãã®æ¹åŒã®å Žåãé«ãæžã蟌ã¿ã¬ãŒããç¶æãããšã ã¯ãªãŒã³ã¢ããããªããã°ãªããªãå€ãã®ãŽããäœæããããšã«ãªããŸãã ããã«ãããå®å®ããæžã蟌ã¿ã¬ãŒããšã¯ãšãªã¬ãŒãã®ç¶æã«åé¡ãçããŸãã Vespaã以åã¯ãã®æ¹åŒã§ãããã2010幎以éã¯ç°ãªãæ¹åŒãæ¡çšããŠããŸãã 4 Vespaã¯ã€ãã¥ãŒã¿ãã«ãªã€ã³ããã¯ã¹ã»ã°ã¡ã³ãã®åã«ãã¥ãŒã¿ãã«ãªã€ã³ã¡ã¢ãªã€ã³ããã¯ã¹ãæã¡ãŸãã 倿Žã¯ã€ã³ããã¯ã¹ã»ã°ã¡ã³ãã®ä»£ããã«ã¡ã¢ãªå
ã®B-treeã«æžã蟌ãŸãã ããã¯ã°ã©ãŠã³ãã§äžå€ãªã€ã³ããã¯ã¹ãšããŒãžãããèšèšã«å€æŽãããŸããã ãã®èšèšã§ã¯ã€ã³ããã¯ã¹ã»ã°ã¡ã³ããåŸã
ã«å€§ããããŠããå¿
èŠããªãã ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã倧ããªã¡ã¢ãªæäœã®çºçãéåžžã«å°ãªããšããã¡ãªããããããŸãã ãŸããæŽæ°ãªã¯ãšã¹ããå®äºããæç¹ã§ããã®ããã¥ã¡ã³ãã¯æ€çŽ¢å¯èœã«ãªããŸãã è±å¯ãªæ©æ¢°åŠç¿é¢é£ã®æ©èœ Vespaã¯ããããããã°ããŒã¿ã»ããã«AIãé©çšããããã®ãã©ãããã©ãŒã ãšããŠäœãããŠããããã æ©æ¢°åŠç¿é¢é£ã®æ©èœãè±å¯ã«ãããŸãã äŸãã°ã以äžã®ãããªæ©èœãæã¡ãŸãã ONNX,XGBoost,LightGBMãšãã£ãè€æ°ã®ã¢ãã«ãµããŒã weightedsetãtensorãªã©ã®ããŒã¿åã䜿çšå¯èœ multi phase rankingã®ãµããŒã Vespaã§ã¯rank-profileãšãã°ãã圢åŒã§ã©ã³ãã³ã°ãèšå®ããŸãã rank-profileã§ã¯ãæ§ã
ãªã©ã³ã¯åŒãç¹åŸŽéãçµã¿åãããŠã©ã³ãã³ã°ã®ã¢ã«ãŽãªãºã ãå®çŸ©ã§ããŸãã ãŸããrank-profileã¯èšå®ãã¡ã€ã«ãšããŠVespaã¯ã©ã¹ã¿ã«çŽæ¥ãããã€ããŸãã ããã«ãããã©ã³ãã³ã°ã¢ã«ãŽãªãºã ãæ€çŽ¢ã¯ãšãªãšã¯åããŠç®¡çã§ããŸãã éçšé¢ã§ããVespaã¯æ¬äœã«çµã¿èŸŒã¿ã§æ©æ¢°åŠç¿ã®æ©èœãæã£ãŠããããã ãã©ã°ã€ã³çã管çããæéããããŸããã ã¹ã¿ã³ãã€ã®æ€çŽ¢ãšVespaã®çžæ§ ã¹ã¿ã³ãã€ã®æ€çŽ¢ã®ç¹åŸŽãšVespaã®ç¹åŸŽã以äžã«ãŸãšããŸããã ã¹ã¿ã³ãã€ã®æ€çŽ¢ Vespa æ€çŽ¢ äœã¬ã€ãã³ã· é«ãã©ãã£ã㯠é«éãªæ€çŽ¢ é«ãã¹ã±ãŒã©ããªãã£ æŽæ° æ€çŽ¢å¯Ÿè±¡ã®ããã¥ã¡ã³ããå€ã ããã¥ã¡ã³ãã®æŽæ°éãå€ãé«é »åºŠ å¹ççãªã€ã³ããã¯ã¹ã®äœæ æ©æ¢°åŠç¿ æ©æ¢°åŠç¿ãæŽ»çš æ©æ¢°åŠç¿ããŒã ãšæ€çŽ¢åºç€ããŒã ãå¥ è±å¯ãªæ©æ¢°åŠç¿é¢é£ã®æ©èœ rank-profileã«ããã©ã³ãã³ã°ã¢ã«ãŽãªãºã ã®æå® ãã®ããã«ãäžèšã§è¿°ã¹ãã¹ã¿ã³ãã€ã®æ€çŽ¢ã®ç¹åŸŽãšVespaã®ç¹åŸŽããããããŠãããããVespaãæ¡çšããŸããã æ¬¡ç« ãããå
·äœçã«Vespaã«ç§»è¡ããæ¹æ³ã玹ä»ããŸãã Vespaãžã®ç§»è¡ Vespaãžã®ç§»è¡ã¯ã以äžã®ãããªã¹ãããã§é²ããŠãããŸããã Vespaã®èª¿æ»ã»æ©èœæ€èšŒ Vespaã¯ã©ã¹ã¿ã®æ§ç¯ æ©èœéçº ãã¹ã Vespaã®èª¿æ»ã»æ©èœæ€èšŒ çŸåšæäŸããŠããæ€çŽ¢ä»æ§ãVespaã§å
šãŠæºããããã©ããã®èª¿æ»ã宿œããŸããã å®éã®ç§»è¡å¯èœæ§ã確èªããããã«ãå
¬åŒããã¥ã¡ã³ããèªã¿ãã¿ããã®åŸãããŒã«ã«ç°å¢ã§ã¯ãšãªãäœæããŠæ€èšŒããŸããã Vespaã¯å
¬åŒããã¥ã¡ã³ããå
å®ããŠããããã ããã¥ã¡ã³ããèªãã°ãã©ã®ãããªæ©èœãããããã©ã®ããã«äœ¿ãã°ããããããããŸãããã ããããã¥ã¡ã³ãéã¯å€ãã®ã§ãå
šãŠã¯èªã¿åããŠããããå°ãã¥ã€èªã¿é²ããŠããŸãããŸããVespaã®Slackã§ã¯éçºããŒã ã«çŽæ¥è³ªåãæããããšãã§ããŸããããã§ãéå»ã®è³ªåãæ€çŽ¢ããããšã§ããåèã«ãªããŸãã Vespaã¯Dockerã€ã¡ãŒãžãå
¬åŒã§æäŸãããŠãããããŒã«ã«ã§ã®æ€èšŒãç°¡åã«ã§ããŸããã ããããã¯ã調æ»ããVespaã®æ©èœãããã€ãŸãã§ç޹ä»ããŸãã 詳现ã¯ã Vespaã®å
¬åŒããã¥ã¡ã³ã ãåç
§ããŠãã ããã Vespaã®çŽ¹ä» - Vespaã®ã¢ãŒããã¯ã㣠æåã«ãVespaã®ã¢ãŒããã¯ãã£ã説æããŸãã Vespaã®ã¢ãŒããã¯ãã£ã¯ä»¥äžã®å³ã®ããã«ãªã£ãŠããŸãã ç»ååºå
ž: Vespa OverviewïŒ https://docs.vespa.ai/en/overview.html ïŒ å³ã®ããã«ãVespaã¯è€æ°ã®ã³ã³ããŒãã³ãããæ§æãããŠããŸãã ã³ã³ããŒãã³ã 説æ Admin/Config èšå®ã®ç®¡çãã¯ã©ã¹ã¿ã®å¶åŸ¡ãªã© Stateless Java Conatiner å
¥åããŒã¿ãã¯ãšãªã»ã¬ã¹ãã³ã¹ãå å·¥ããã¹ããŒãã¬ã¹ãªã³ã³ããŒãã³ããã¯ãšãªãšããŒã¿ã®æäœãã³ã³ãã³ãã¯ã©ã¹ã¿ã®é©åãªããŒãã«æž¡ããJavaã§å®è£
ãããŠããããã©ã°ã€ã³ã§å®¹æã«æ¡åŒµã§ãã ã Content ã€ã³ããã¯ã¹ã®ç®¡çãæ
åœãããæ€çŽ¢ã»ã©ã³ãã³ã°ã¯ããã§å®è¡ããããC++ã§å®è£
ãããŠãã Vespaã¯ã©ã¹ã¿ã«å±ããåãµãŒãã¯ããããã®ããããã®åœ¹å²ãæ
ãå調ããŠåäœããŸãã Vespaã®çŽ¹ä» - ã¯ã©ã¹ã¿ã®èšå® å
ã»ã©ãã¢ãŒããã¯ãã£ã«ã€ããŠç޹ä»ããŸããã Vespaã§ã¯èšå®ãã¡ã€ã«ã§ãã¯ã©ã¹ã¿ã®æ§æã管çããŸãã ããã§ã¯ãVespaã®ã¯ã©ã¹ã¿èšå®ã«ã€ããŠèª¬æããŸãã ã¯ã©ã¹ã¿èšå®ã¯ã以äžã®2çš®é¡ã®ãã¡ã€ã«ã§è¡ããŸãã hosts.xml services.xml hosts.xml hosts.xmlã¯ã¯ã©ã¹ã¿ã«åå ãããµãŒããå®çŸ©ããŸãã ãã¹ãåã«å¯ŸããŠãèšå®ã®äžã§äœ¿ããšã€ãªã¢ã¹ãæå®ããŸãã 以äžããhosts.xmlã®äŸã§ãã <? xml version = "1.0" encoding = "utf-8" ?> <hosts> <host name = "node0.vespanet" > <alias> node0 </alias> </host> <host name = "node1.vespanet" > <alias> node1 </alias> </host> ... </hosts> services.xml services.xmlã¯Vespaã¯ã©ã¹ã¿ã®æ§æãå®çŸ©ããŸãã hosts.xmlã§å®çŸ©ãããåãµãŒãã«åœ¹å²ãäžããŸãã ãŸããredundancyãšãã£ãåé·åã®èšå®ããã©ã°ã€ã³ã®èšå®ããã³ã¹ã¬ããæ°ã»ã¡ã¢ãªçã®ãªãœãŒã¹èšå®ããã¡ãã§è¡ããŸãã 以äžãservices.xmlã®äŸã§ãã <? xml version = "1.0" encoding = "utf-8" ?> <services version = "1.0" xmlns : deploy = "vespa" xmlns : preprocess = "properties" > <admin version = "2.0" > <configservers> <configserver hostalias = "node0" /> <configserver hostalias = "node1" /> <configserver hostalias = "node2" /> </configservers> <cluster-controllers> <cluster-controller hostalias = "node0" jvm-options = "-Xms32M -Xmx64M" /> <cluster-controller hostalias = "node1" jvm-options = "-Xms32M -Xmx64M" /> <cluster-controller hostalias = "node2" jvm-options = "-Xms32M -Xmx64M" /> </cluster-controllers> <slobroks> <slobrok hostalias = "node0" /> <slobrok hostalias = "node1" /> <slobrok hostalias = "node2" /> </slobroks> <adminserver hostalias = "node3" /> </admin> <container id = "feed" version = "1.0" > <document-api/> <document-processing/> <nodes> <node hostalias = "node4" /> <node hostalias = "node5" /> </nodes> </container> <container id = "query" version = "1.0" > <search/> <nodes> <node hostalias = "node6" /> <node hostalias = "node7" /> </nodes> </container> <content id = "news" version = "1.0" > <min-redundancy> 2 </min-redundancy> <documents> <document type = "news" mode = "index" /> <document-processing cluster = "feed" /> </documents> <nodes> <node hostalias = "node8" distribution-key = "0" /> <node hostalias = "node9" distribution-key = "1" /> </nodes> </content> </services> Vespaã®çŽ¹ä» - ããã¥ã¡ã³ãã®ç®¡ç ã€ãã«ãVespaã®ããã¥ã¡ã³ã管çã«ã€ããŠç޹ä»ããŸãã Vespaã§ã¯ãããã¥ã¡ã³ãã®ã¹ããŒããã .sd ãšããæ¡åŒµåã®ã¹ããŒãå®çŸ©ãã¡ã€ã«ã§ç®¡çããŸãã ã¹ããŒãå®çŸ©ãã¡ã€ã«ã®äŸã以äžã«ç€ºããŸãã schema news { document news { field news_id type string { indexing: summary | attribute attribute: fast-search } field title type string { indexing: index | summary index: enable-bm25 } field abstract type string { indexing: index | summary index: enable-bm25 } field url type string { indexing: index | summary } field date type int { indexing: summary | attribute attribute: fast-search } field clicks type int { indexing: summary | attribute } field tensorfield type tensor<float>(x{},y{}) { indexing: attribute | summary } } fieldset default { fields: title, abstract } } field ããŒã¯ãŒãã«ç¶ããŠãã£ãŒã«ãåãšåãæå®ããŸãã intãstringãšãã£ãåºæ¬çãªåã®ã»ããtensorãweightedsetãšãã£ãè€éãªåãæ§é äœã®å®çŸ©ãå¯èœã§ãã ãŸãããã£ãŒã«ãããšã«ã€ã³ãã¯ã·ã³ã°ã®æ¹æ³ãæ€çŽ¢æ¹æ³ãæå®ã§ããŸãã äŸãã°ã indexing ãã©ã¡ãŒã¿ãæå®ããããšã§ãã€ã³ããã¯ã¹äœææã«ãã£ãŒã«ãã®ããŒã¿ãã©ã®ããã«åŠçããããèšå®ããŸãã indexing ã«ã¯ä»¥äžã®3ã€ã®å€ãæå®ã§ããŸãããŸããè€æ°çµã¿åãããŠã®æå®ãå¯èœã§ãã index ããã¹ããããçšã®ã€ã³ããã¯ã¹ãäœæããŸãã圢æ
çŽ è§£æãè¡ãããŸãã attribute ã¡ã¢ãªã«ä¿æããŸãããœãŒããã°ã«ãŒãã³ã°ã«äœ¿çšå¯èœã§ãããŸããå®å
šäžèŽããã¬ãã£ãã¯ã¹äžèŽã倧æåå°æåãåºå¥ããäžèŽãªã©ãå¯èœã§ãã summary æ€çŽ¢çµæã®ã¬ã¹ãã³ã¹ã«å«ãŸããããã¥ã¡ã³ãã®æ
å ±(summary)ã«æå®ããããã£ãŒã«ããå«ããŸãã ãŸãã index ãã©ã¡ãŒã¿ã attribute ãã©ã¡ãŒã¿ãæå®ããããšã§ãæ€çŽ¢ã®é«éåãªã©ãå¯èœã§ããä»ã«ãã fieldset ã䜿ãããšã§ãæ€çŽ¢çšã«ãã£ãŒã«ããã°ã«ãŒãåã§ããŸãã æ³šæç¹ãšããŠãVespaã§ã¯åçãªãã£ãŒã«ãã¯äœæã§ããŸããã ãã£ãŒã«ãã远å ããå Žåã¯æç€ºçã«æå®ããå¿
èŠããããŸãã Vespaãžã®ããã¥ã¡ã³ãã®ç»é²æ¹æ³ã§ããã /document/v1/ APIã«HTTPãªã¯ãšã¹ããéãã ãããã¯ãJava補ã®feed-clientã§ãã£ãŒããè¡ãããšãã§ããŸãã /document/v1/ APIã¯æ€çŽ¢çšã®APIãšå¥ã®APIã§ã IDãæå®ããããã¥ã¡ã³ãã®ååŸããç»é²ã»æŽæ°ã»åé€ãå¯èœã§ãã Vespaã®çŽ¹ä» - æ€çŽ¢ã®æ¹æ³ ç¶ããŠãVespaã®æ€çŽ¢æ¹æ³ã«ã€ããŠç޹ä»ããŸãã Vespaã®æ€çŽ¢ã¯ãšãªã¯YQLãšããSQLã«äŒŒãDSLã§èšè¿°ããŸãã select * from news where title contains "vespa" select ã§ã¬ã¹ãã³ã¹ã«å«ãããã£ãŒã«ããæå®ããŸããã¹ããŒãå®çŸ©ã§ summary ãæå®ãããã£ãŒã«ããéžæã§ããŸãã from ã§ã¯æ€çŽ¢å¯Ÿè±¡ã®ããã¥ã¡ã³ãã¿ã€ããæå®ããŸãã ãã㊠where ã§ããŸããŸãªæ€çŽ¢æ¡ä»¶ãæå®ããŸããäžèšã®äŸã§ã¯ãtitleãã£ãŒã«ãã«"vespa"ãå«ãããã¥ã¡ã³ããæ€çŽ¢ããŠããŸããä»ã«ãããã¬ãŒãºæ€çŽ¢ã緯床çµåºŠã«ããæ€çŽ¢ãªã©ãæ§ã
æ€çŽ¢ãå¯èœã§ããã Apache SolrãElasticsearchã§æäŸãããŠããåºæ¬çãªæ€çŽ¢æ©èœã¯äžéãæã£ãŠããŸãã ãŸããã©ã³ãã³ã°åŸã«æ€çŽ¢çµæãã°ã«ãŒãã³ã°ããæ©èœãæäŸãããŠãããéèšãdedupe 5 ãªã©ãå¯èœã§ãã æ€çŽ¢ãªã¯ãšã¹ããVespaã«éãéã«ã¯ã yql ã ãã§ãªããã¿ã€ã ã¢ãŠãæéããããä»¶æ°ãªã©æ€çŽ¢ã«é¢ããä»ã®ãã©ã¡ãŒã¿ãåæã«æå®å¯èœã§ãã ç¹ã«äœ¿çšããrank-profileã®ååãæå®ããããšã§ãæ€çŽ¢çµæã®ã©ã³ãã³ã°ãã¯ãšãªããšã«å€æŽã§ããæ©èœã¯ããªã³ã©ã€ã³ABãã¹ãæãªã©ã«äŸ¿å©ã§ãã { " hits ": 200 , " model ": { " locale ": " ja " } , " timeout ": " 1s ", " offset ": 0 , " ranking ": { " profile ": " vespa-test " } , " yql ": " select * from news where default contains \" vespa \" " } ãŸããrank-profileãšã¯å¥ã®query-profileãšãã°ããæ©èœã䜿ãããšã§ãæ€çŽ¢ãã©ã¡ãŒã¿ã®ã»ãããååãã€ããŠç®¡çã§ããŸãã ããã«ãããæ€çŽ¢æã«query-profileåã ãæå®ããã°è¯ãã æ¯å倿°ã®ãã©ã¡ãŒã¿ãä»ããŠãªã¯ãšã¹ãããã«ãã¿ãŸãã query-profileã¯ä»¥äžã®ããã«èšå®ããŸãã <query-profile id = "MyProfile" > <field name = "hits" > 20 </field> <field name = "maxHits" > 2000 </field> </query-profile> Vespaã®çŽ¹ä» - ã©ã³ãã³ã°ã®æå® æåŸã«Vespaã®ã©ã³ãã³ã°ã®æå®æ¹æ³ã«ã€ããŠç޹ä»ããŸãã æ¬èšäºã§äœåºŠãåºãŠããŠããŸãããVespaã®ã©ã³ãã³ã°ã¯rank-profileã§èšå®ããŸãã rank-profileã¯ä»¥äžã®ããã«èšå®ããŸãã rank-profile my-rank-profile inherits base { function myfeature() { expression: fieldMatch(title).completeness * pow(0 - fieldMatch(title).earliness, 2) } first-phase { expression { attribute(quality) * freshness(timestamp) } } second-phase { expression: lightgbm("test_model.json") rerank-count: 50 } } rank-profile ããŒã¯ãŒãã®ããšã«ãrank-profileã®ååãæå®ããŸãã inherits ã䜿ãããšã§ãä»ã®rank-profileãç¶æ¿ã§ããŸãã ããã¯ãABãã¹ããªã©ã§ãã©ã³ãã³ã°ã®äžéšã倿Žãããå Žå(second-phaseã®ã¿å€æŽãããªã©)ã«éåžžã«äŸ¿å©ã§ãã function ã§ã©ã³ãã³ã°åŒã®äžéšãšããŠããŸããç¹åŸŽéãšããŠäœ¿çšå¯èœãªç¬èªã®é¢æ°ãå®çŸ©ã§ããŸãã ããã«ãVespaã§ã¯å€æ®µéã©ã³ãã³ã°ã§ã©ã³ãã³ã°ã®è² è·ãšç²ŸåºŠã®ãã©ã³ã¹ããšãããšãæåããå¯èœã§ãã first-phase ã§è² è·ã軜ãã©ã³ãã³ã°åŒãæå®ãã second-phase ã¯first-phaseã§ã©ã³ãã³ã°ãããäžäœã®çµæã«å¯ŸããŠã è² è·ãéãããã粟床ã®é«ãã©ã³ãã³ã°åŒãæå®ããŸãã Vespaã¯ã©ã¹ã¿ã®æ§ç¯ ãããŸã§ãVespaã®æ©èœã®äžéšã玹ä»ããŸããã ããããã¯ãå®éã«ã¹ã¿ã³ãã€ã§Vespaã¯ã©ã¹ã¿ãæ§ç¯ããæ¹æ³ã玹ä»ããŸãã ã¯ã©ã¹ã¿ã®æ§æ 以äžãçŸåšã®Vespaã¯ã©ã¹ã¿ã®æ§æã§ãã ã¹ã¿ã³ãã€ã§ã¯AWSã䜿çšããŠããŸãã ãã®ãããåãµãŒãã¯EC2ã䜿çšããŠVespaã¯ã©ã¹ã¿ãæ§ç¯ããŠããŸãã high-availability(HA)ã®ãããmulti-nodeæ§æããšã£ãŠããã admin/configã¯ã©ã¹ã¿ã¯3å°ã®ããŒãããæ§æãããŠããŸãã containerã¯ã©ã¹ã¿ã¯ããã£ãŒããåŠçããããã®ã¯ã©ã¹ã¿ãšæ€çŽ¢ã¯ãšãªãåŠçããããã¯ã©ã¹ã¿ãåããŠããŸãã ããã«ããããã£ãŒããã¯ãšãªããããã§ãè² è·ã«å¿ããŠããŒãã®æ§èœã»å°æ°ã 倿Žã§ããããã«ãããšãšãã«ããã£ãŒãã®è² è·ãæ€çŽ¢ãžåœ±é¿ããªãããã«ããŠããŸãã containerã¯ã©ã¹ã¿ã¯ã¹ããŒãã¬ã¹ã§ãããããç°¡åã«ã¹ã±ãŒã«ã¢ãŠããå¯èœã§ãã åã¯ã©ã¹ã¿ããšã®ã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã¯è² è·ã«å¿ããŠç°ãªããã®ã䜿çšããŠããŸãã contentã¯ã©ã¹ã¿ã®ããŒãã¯ããŒã¿ãä¿æãæ€çŽ¢ãåŠçãããããä»ã®ã¯ã©ã¹ã¿ãšæ¯ã¹ãŠå€§ããªã€ã³ã¹ã¿ã³ã¹ã¿ã€ãã䜿çšããŠããŸãã ãŸãããã£ã¹ã¯ãžã®ã¢ã¯ã»ã¹ãå€ãè¡ããããã€ã³ã¹ã¿ã³ã¹ã¹ãã¢ãæã€ã€ã³ã¹ã¿ã³ã¹ã¿ã€ããéžæããŠããŸãã ã¯ã©ã¹ã¿ã®æ§ç¯æ¹æ³ ã€ãã«ãã¹ã¿ã³ãã€ã§ã®Vespaã®ã¯ã©ã¹ã¿æ§ç¯æ¹æ³ã説æããŸãã æ€èšŒäžäœåºŠãVespaã®ã¯ã©ã¹ã¿ãæ§ç¯ãçŽãå¿
èŠããã£ããããã€ã³ãã©ãã³ãŒãåããŠããŸãã ãŸããVespaãã€ã³ã¹ããŒã«ããããã·ã³ã€ã¡ãŒãž(AMI)ã®äœæããŸãã AWSã®EC2 Image Builderã䜿çšããŠããŽãŒã«ãã³ã€ã¡ãŒãžãäœæããŸãã ãã®éãVespaã ãã§ãªãDatadogAgentãªã©ç£èŠãéçšã«å¿
èŠãªããŒã«ãã€ã³ã¹ããŒã«ããŠããŸãããã®ããã«ãVespaãã€ã³ã¹ããŒã«æžã¿ã®AMIãäœæããŠããããšã§ã ã€ã³ã¹ã¿ã³ã¹èµ·åæéãççž®ã§ããŸãããŸãã æ€èšŒç°å¢ã§ç¢ºèªãããã®ãšå
šãåãç¶æ
ã®ããŒããæ¬çªã«æ§ç¯ã§ãã 以åã®ããŒãžã§ã³ã®ç°å¢ã«ãã©ãããšã容æã«ãªããŸãã ã€ãã«ãVespaã¯ã©ã¹ã¿çšã®ã€ã³ã¹ã¿ã³ã¹ãèµ·åããŸãã å°æ°ãã€ã³ã¹ã¿ã³ã¹ã¿ã€ãããããã¯ãŒã¯æ§æãªã©ã®èšå®ã¯ããã¹ãŠTerraformã§ã³ãŒã管çããŠããŸãããã®ãããæ°ããVespaã¯ã©ã¹ã¿ãæ§ç¯ããéã¯ãæ¢åã®èšå®ãã³ããŒãããã©ã¡ãŒã¿ã倿Žã㊠terraform apply ã³ãã³ããå®è¡ããã ãã§ç°¡åã«æ§ç¯ã§ããããã«ãªã£ãŠããŸãããã®æç¹ã§ã¯ãVespaã¯ã©ã¹ã¿ã®èšå®ã¯ãŸã åæ ãããŠããªãããåããŒãäžã§Vespaã®ããã»ã¹ã¯èµ·åããŠããŸãããã¯ã©ã¹ã¿ãšããŠå調ããŠåäœã§ããŸãããã©ã®ããŒããã©ã®åœ¹å²ãæã€ããæ±ºãŸã£ãŠãããŸããããããã®èšå®ã¯åè¿°ããhosts.xmlãservices.xmlã§è¡ããŸãã ãã ããconfig serverã ãã¯ã VESPA_CONFIGSERVERS ãšããç°å¢å€æ°ããã¹ãŠã®ããŒãã«èšå®ããŠçœ®ãå¿
èŠããããŸããããã¯ãVespaã®èšå®ãã¡ã€ã«ã管çããconfig serverã®ãã¹ãåãæå®ããããã®ç°å¢å€æ°ã§ãããã®ç°å¢å€æ°ãèšå®ããããšã§ãåããŒãã¯config serverã«æ¥ç¶ããèšå®ãã¡ã€ã«ãååŸããŸãã æåŸã«ãVespaã®èšå®ãã¡ã€ã«ãåæ ãããŸãã Vespaã®èšå®ãã¡ã€ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžãšããåäœã«ãŸãšããããããã€ãããŸããã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžã«ã¯ãããã€ãšå®è¡ã«å¿
èŠãªãã¹ãŠã®èšå®ãã³ã³ããŒãã³ããæ©æ¢°åŠç¿ã¢ãã«ãå«ãŸããŠããŸãã ã¹ã¿ã³ãã€ã§ã¯ãJenkinsã䜿çšããŠGithubäžã§ç®¡çããŠãããªãœãŒã¹ããã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžãäœæããVespaã«ãããã€ããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžã®ãããã€ãå®äºãããšãåããŒããVespaã¯ã©ã¹ã¿ãšããŠå調ããŠåäœãéå§ããŸãã æ©èœéçº æ¬¡ã«ãæ€çŽ¢ãšã³ãžã³ç§»è¡ã®ããã«å¿
èŠã ã£ãæ©èœéçºã«ã€ããŠèª¬æããŸãã 以äžããä»å宿œããéçºã®äžèЧã§ãã ã¯ãšãªåŠçãäžç®æã«éçŽ ãªãŒã¬ããã¯APIã»åºåAPIã»ããã¯ãšã³ãAPIã§ãã¯ãšãªã倿ããããžãã¯ãå¥ã
ã«å®è£
ãããŠããããããšã³ãžã³ãçµ±åããåã«ã¯ãšãªåŠçãè¡ãAPIãäœæãçµ±äžããŸããã æ€çŽ¢APIã®å®è£
ãŠãŒã¶ããåãåã£ãã¯ãšãªãYQLã«å€æ rustã§APIãå®è£
Feederã®å®è£
ããã¥ã¡ã³ãïŒä»¶æ¯ã«Vespaãžã®æŽæ°ãªã¯ãšã¹ããçºè¡ Javaã§StreamåŠçãå®è£
Linguisticã¢ãžã¥ãŒã«ã®å®è£
圢æ
çŽ è§£æãªã©ã®èšèªåŠçæ©èœãå®è£
æ©æ¢°åŠç¿ã¢ãã«ã®å®è£
æ¢åã®ã¢ãã«ã§äœ¿çšããŠããç¹åŸŽéããVespaã§äœ¿çšã§ããç¹åŸŽéã«ãããã³ã° rank-profileã®äœæ ããã§ã¯ãç¹ã«Linguisticsã¢ãžã¥ãŒã«ã®éçºã«ã€ããŠè©³ãã説æããŸãã Linguistics Vespaã¯Linguistics(èšèªåŠç)ã¢ãžã¥ãŒã«ã䜿çšããŠã ã€ã³ããã¯ã¹äœæããã³æ€çŽ¢æã«ããã¥ã¡ã³ããã¯ãšãªã®ããã¹ããåŠçããŸãã Linguisticsã¢ãžã¥ãŒã«ã¯ã以äžã®åŠçãå®è£
ããŠããŸãã èšèªç¹å® tokenizing normalizing(ã¢ã¯ã»ã³ãèšå·ã®é€å») stemming ãããã®åŠçãLignusiticsã¢ãžã¥ãŒã«ã§è¡ãããçµæã®termãã€ã³ããã¯ã¹ã«è¿œå ãããŸãã ãŸããæ€çŽ¢æã«ãåæ§ã«ãã¯ãšãªã®ããã¹ãã«å¯ŸããŠåŠçãè¡ãããŸãã Lignusiticsã¢ãžã¥ãŒã«ã¯ãcontainerã¯ã©ã¹ã¿ã§åäœãããããJavaã§å®è£
ãããŠããŸãã Vespaå
¬åŒã§ãããã€ãã®å®è£
ã忢±ãããŠããŸãããã«ã¹ã¿ãã€ãºãããå Žåã«ã¯ã com.yahoo.language.Linguistics ã€ã³ã¿ãã§ãŒã¹ãå®è£
ããŸãã ä»åã¯ãèªåãã¡ã§ã«ã¹ã¿ãã€ãºã§ããããã«ãLinguisticsã¢ãžã¥ãŒã«ãèªåå®è£
ãããã®ã䜿çšããŠããŸãã å®è£
ã«ããã£ãŠã¯ã以äžã®ãããªå®è£
ãåèã«ããŸããã SimpleLinguistics è±èªã®ã¹ããã³ã°ã®ã¿æäŸ LuceneLinguistics Luceneã®Analyzerã䜿çšããå®è£
OpenNlpLinguistics OpenNLPã䜿çšããå®è£
KuromojiLinguistics LINEã€ããŒæ ªåŒäŒç€Ÿãå
¬éããŠããKuromojiã䜿çšããå®è£
ç¹ã«KuromojiLinguisticsã¯æ¥æ¬èªã®åœ¢æ
çŽ è§£æçšã®å®è£
ã®ãããéåžžã«åèã«ãªããŸããã Linguisticsã®æ³šæç¹ãšããŠãããã¹ãã®åŠçæã«èšèªãç¹å®ããŸããã ãã®ç¹å®ãééã£ãŠãããšãããããªããªã£ãŠããŸããç¹ããããŸãã ç¹ã«ãã¯ãšãªã«å«ãŸããã¯ãŒããªã©ãçãåèªã¯èšèªã®ç¹å®ãå°é£ãªããã æ€çŽ¢ãã©ã¡ãŒã¿çã§èšèªãæå®ããã»ããè¯ãã§ãã ãŸããåœç¶ã§ããæ€çŽ¢ãšãã£ãŒãã§åãLingusitcsã¢ãžã¥ãŒã«ã®å®è£
ãããããšãéèŠã§ãã ãã¹ã æåŸã«ããã¹ãã«ã€ããŠãè§ŠããŠãããŸãã ãã¹ãã¯ãäžè¬çãªæ€çŽ¢æ¹åãšåãããã«ã以äžã®çš®é¡ã®ãã¹ãã宿œããŸããã QA æ¢åã®æ€çŽ¢æ©èœãå®çŸã§ããŠãããã®ç¢ºèª è² è·è©Šéš è² è·ã«èãããããã®ç¢ºèª éžå®æã«ããçšåºŠã®æ§èœè©äŸ¡ã¯è¡ã£ãŠããããã¢ãã«çãæ¬çªã§äœ¿çšãããã®ãçšæãæ¹ããŠç¢ºèª ãªãã©ã€ã³ãã¹ã å®éã»å®æ§ã®äž¡æ¹ã§è©äŸ¡ SQ(ãµãŒãã¯ãªãªãã£)ã°ã«ãŒããšããæ€çŽ¢ç²ŸåºŠã宿§çã«è©äŸ¡ããããŒã ãååšããŸãã ãªã³ã©ã€ã³ãã¹ã ABãã¹ãã宿œ æ€çŽ¢ç²ŸåºŠãå®éçã«è©äŸ¡ ç¹å¥ãªããšã¯ããŠããŸããããæ€çŽ¢ãšã³ãžã³ã®ç§»è¡ãšããããšã§ãå
¥å¿µã«ãã¹ããè¡ããŸããã ç§»è¡çµæ äžèšã®ã¹ãããã§ç§»è¡ãé²ããçµæãç¡äºã«ç§»è¡ã§ããŸããã çŸç¶ã¯ãªãŒã¬ããã¯ã®ã¿ç§»è¡å®äºããŠãããåºåã¯ç§»è¡äžã§ãã ç§»è¡äžã§ã¯ãããã®ã®ãæ€çŽ¢ãšã³ãžã³ãçµ±äžããèªç€Ÿéçšããã¡ãªãããåŸã
ã«åºãŠããŠããŸãã ãŸãããªãŒã¬ããã¯ãšåºåã§åãæ€çŽ¢ãšã³ãžã³ã䜿çšããããšã§ãæ€çŽ¢ã«é¢ãããªãœãŒã¹ãéçŽã§ãããã§ãã çŸæ®µéã§ããåºåã®æ€çŽ¢ãšã³ãžã³ãVespaãžç§»è¡ããããã«ããªãŒã¬ããã¯ã®ç¥èŠã掻çšã§ããŠããŸãã ãŸããèªç€Ÿéçšããããšã§ãVespaã«é¢ããããšãäžå¿ã«ã¯ãªããŸãããæ
å ±æ€çŽ¢æè¡ãç¥èãèç©ãå§ããããšãã§ããŠããŸãã é£ããã£ããã€ã³ã Vespaã®ç§»è¡ã«éããé£ããã£ããã€ã³ãã玹ä»ããŸãã ãŸããèŠããªããã°ãªããªãããšãå€ããšããç¹ã§ãã ããŸãŸã§äœ¿çšããŠããABYSSãElasticserachãšã¯ã 倧ããç°ãªãæ€çŽ¢ãšã³ãžã³ã§ãããããä»çµã¿ãçè§£ããã®ã«æéãããããŸããã åã«æ€çŽ¢ãè¡ãã ãã§ããã°ãã¯ãšãªã®æžãæ¹ãèŠããã ãã§æžã¿ãŸããã å®éã«éçšãããŠããããã«ã¯Vespaã®æ§ã
ãªæŠå¿µãèŠããªããã°ãªããŸããã§ããã Vespaã®åã³ã³ããŒãã³ãäžã§ã¯ãproton, config-proxy, config-sentinel, config server, slobrok(Service Location Broker), cluster controllerãšãã£ããè€æ°ã®ãµãŒãã¹ãåäœããŠããŸãã éçšæãç¹ã«äœãããã®ãã©ãã«ãçºçããå Žåã®åå ãç¹å®ããå Žåã ããããã®ãµãŒãã¹ã®æ©èœãçè§£ããŠããå¿
èŠããããŸãã ãŸããæ¥æ¬èªã®æ
å ±ãå°ãªããšããç¹ããããŸãã æ¥æ¬ã®ãŠãŒã¶ãå°ãªããããæ¥æ¬èªã®ç¥èŠãããŸããããäžã«ãããŸããã ç¹ã«èšèªåŠçåšãã¯ãèšèªã«äŸåããéšåãå€ãã èªåã§å®è£
ããã«ããã£ãŠã¯ãã³ãŒããèªã¿èŸŒãã§è©Šè¡é¯èª€ããå¿
èŠããããŸããã ä»åŸã«ã€ã㊠Vespaãžã®ç§»è¡ã¯äžéšå®äºããŸããããç§»è¡ããã ãã§æŽ»çšã§ããŠãããšã¯ãããŸããã ä»åŸã¯ãããã«VespaãæŽ»çšããŠããäºå®ã§ãã ãŸããæ€çŽ¢ç²ŸåºŠæ¹åã«ã€ããŠã§ããã圢æ
çŽ è§£æã®æ¹åãã©ã³ãã³ã°ã¢ãã«ã®ãããªãæ¹åã ãã¯ãã«æ€çŽ¢(ANN)ã®å°å
¥ãªã©ãèããããŸãã ãšãã«ãVespaã¯éåžžã®æ€çŽ¢ãšãã¯ãã«æ€çŽ¢ãçµã¿åããããã€ããªããæ€çŽ¢ãå¯èœã§ããããã çŸåšã®æ€çޢ仿§ãç¶æãã€ã€ããã¯ãã«æ€çŽ¢ãå°å
¥ããããšãã§ãããšèããŠããŸãã ãŸãããªãŒãã¹ã±ãŒãªã³ã°ã®å®è£
ãæ€èšããŠããŸãã ã¹ã¿ã³ãã€ã§ã¯æé垯ã«ãã£ãŠæ€çŽ¢ããªã¥ãŒã ã倧ããå€ããããã ã³ã¹ããæžããããã«ã€ã³ã¹ã¿ã³ã¹å°æ°ãæé©åãããã§ãã VespaCloudã§ã¯æäŸãããŠããŸãããself-hostingã®å Žåã¯æ©èœãæäŸãããŠããªãã®ã§ã ãªãŒãã¹ã±ãŒãªã³ã°æ©èœãèªåã§å®è£
ããå¿
èŠããããŸãã ãŸãšã ã¹ã¿ã³ãã€ã§ã¯æ€çŽ¢ãšã³ãžã³ãVespaã«ç§»è¡ããŠããŸãã è€æ°ã®æ€çŽ¢ãšã³ãžã³ã䜿çšããŠããŸããããæ€çŽ¢ãšã³ãžã³ãçµ±äžããèªç€Ÿã§éçšããæ¹éãæ±ºå®ããŸããã çµ±äžåŸã®æ€çŽ¢ãšã³ãžã³ãšããŠãã¹ã¿ã³ãã€ã®æ€çŽ¢ã®ç¹åŸŽãšåèŽããVespaãæ¡çšããŸããã ä»åŸã¯ããã¯ãã«æ€çŽ¢ã®å°å
¥ãªã©ããããªã掻çšãé²ããŠããäºå®ã§ãã ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com https://blog.vespa.ai/open-sourcing-vespa-yahoos-big-data-processing/ ↩ https://blog.vespa.ai/vespa-is-becoming-its-own-company/ ↩ https://engineering.atspotify.com/2022/03/introducing-natural-language-search-for-podcast-episodes/ ↩ Search and Sushi;Freshness counts ↩ Vespaã§æ€çŽ¢çµæã®dedupeãè¡ãæ¹æ³ ↩
ã¯ããã« åããŸããŠãæ ªåŒäŒç€Ÿã¹ã¿ã³ãã€ã®SEOããŒã ã®æ¬ç°ã§ãã ã¹ã¿ã³ãã€ã§ã¯ElastiCache for Redis (ä»¥åŸ Redis ãšèšèŒ) ã® ããŒãžã§ã³3ãé·ãå©çšããŠããŸãããã 2023幎7æ31æ¥ã«ããŒãžã§ã³3ãEOLãè¿ãããããããŒãžã§ã³7ãžã®ã¢ããã°ã¬ãŒãã5æã«è¡ããŸããã 宿œããã®ã¯å幎ã»ã©åã§ãããã¢ããã°ã¬ãŒãã«äŒŽãå¿
èŠã ã£ãæé ãªã©ãã玹ä»ããŠãããŸãã æéãŸã§ã«ã¢ããã°ã¬ãŒãããªããšã©ããªãã®ã AWSããã®æ¡å
ã«ãããšãããŒãžã§ã³3ã¯æ°èŠäœæãã§ããªããªãã皌åäžã®ãã®ã¯èªåçã«6.2以äžã«ã¢ããã°ã¬ãŒããããŠããŸãããã§ãã(äžèšäžéšã¡ãŒã«ããæç²) 2022 幎 7 æ 31 æ¥ãã 2023 幎 7 æ 31 æ¥ãŸã§ - ElastiCache for Redis ããŒãžã§ã³ 3 ã€ã³ã¹ã¿ã³ã¹ã® Redis 6.2 以éãžã®ã¢ããã°ã¬ãŒãã¯ãã€ã§ãéå§ã§ããŸã [3]ã 2023 幎 5 æ 1 æ¥ä»¥é - AWS ã³ã³ãœãŒã«ãã ElastiCache for Redis ããŒãžã§ã³ 3.x.x ã€ã³ã¹ã¿ã³ã¹ãäœæããããšã¯ã§ããŸããã 2023 幎 7 æ 31 æ¥ä»¥é - ElastiCache for Redis ããŒãžã§ã³ 3 㯠ElastiCache ã³ã³ãœãŒã«ãCLIãAPIããŸã㯠CloudFormation ã§ã¯å©çšã§ããŸããã2023 幎 7 æ 31 æ¥ä»¥éã®ã¡ã³ããã³ã¹æéå
ã«ããã¹ãŠã® Redis çš ElastiCache 3.x.x ã¯ã©ã¹ã¿ãŒã Redis 6.2 ã«èªåçã«ã¢ããã°ã¬ãŒãããŸãã ãŸãã AWSå
¬åŒããã¥ã¡ã³ã ã«ãããšã5.0.5以åã®ããŒãžã§ã³ãããã®ãŸãŸã¡ãžã£ãŒããŒãžã§ã³ã®ã¢ããã°ã¬ãŒããè¡ããšãã§ãŒã«ãªãŒããŒæã®DNSäŒæ¬ã§æå€§1åã¯æ¥ç¶æãããŠããŸããŸãã ElastiCache ã¯ã©ã¹ã¿ãŒã¯ 5.0.5 ããåã®ããŒãžã§ã³ã§ã¢ããã°ã¬ãŒãã§ããŸããã¢ããã°ã¬ãŒãããã»ã¹ã¯åãã§ãããDNS äŒéäžã®ãã§ãŒã«ãªãŒããŒæéãé·ããªãå¯èœæ§ããããŸã (30 ç§ïœ1 å)ã ä»åã¢ããã°ã¬ãŒã察象ãšãªãRedisã¯ã»ãŒå
šãŠã®ã¹ã¿ã³ãã€ã®ããŒãžè¡šç€ºã®éã«å©çšãããŠããã®ã§ã1åéã®ç¬æã§ããã£ãŠããŠãŒã¶ãŒã«å€§ãã圱é¿ãäžããŠããŸãå¯èœæ§ããããŸããã ãã®ããã RedisãããŠã³ã¿ã€ã ãªãã§ã¢ããã°ã¬ãŒããã ããå¯Ÿå¿æ¹éãšããŸããã ã¢ããã°ã¬ãŒããšåãæ¿ãæ¹æ³ ããŠã³ã¿ã€ã ãªãã§åãæ¿ããå Žåã©ã®ããã«ããããšãã話ã§ãããã¢ããããŒã察象ãšãªãElastiCacheã®ãšã³ããã€ã³ãã Amazon Route 53 ã§ä»¥äžã®ããã«CNAMEèšå®ããŠããã redis-service.stanby(äŸ) -> redis.xxxx.ng.0001.xxxx.cache.amazonaws.com 瀟å
ã®åã¢ããªã±ãŒã·ã§ã³ã¯CNAMEã®ãã¹ãåãå©çšããŠè©²åœã®ElastiCacheã«ã¢ã¯ã»ã¹ãããŠããŸãã ãã®ãããæ°èŠã§ããŒãžã§ã³7ã®ã¯ã©ã¹ã¿ãæ§ç¯ãCNAMEå
ã®ãšã³ããã€ã³ããåãæ¿ããã°ãåã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãã倿ŽããããšãªãããŒãžã§ã³ã¢ãããããRedisãåç
§ããããã«åãæ¿ããããšãã§ããŸãã ãŸããElastiCacheã¯ã¹ãããã·ã§ãããã埩å
ããéã«ãšã³ãžã³ããŒãžã§ã³ãã¢ããã°ã¬ãŒãããŠã¯ã©ã¹ã¿ãäœæã§ããŸãã 皌åäžã®ElastiCacheã®ã¹ãããã·ã§ãããåãããã®ã¹ãããã·ã§ãããçšããŠããŒãžã§ã³7ã®ã¯ã©ã¹ã¿ãæ§ç¯ããããšã§ãããŒã¿ç§»è¡ã®ããã®èšå®ãããããšãªãããŒãžã§ã³ã®ã¢ããã°ã¬ãŒããè¡ããŸãã 幞ãã«ãã¢ããã°ã¬ãŒã察象ã®Redisã«é¢ããŠã¯ãèªã¿èŸŒã¿ã¯ã¹ã¿ã³ãã€ã®ããŒãžã衚瀺ããã床ã«è¡ããŸãããæžã蟌ã¿ã¯éåæã«ãªã£ãŠããäžæçã«åæ¢å¯èœã§ãããããRedisã®ã¢ããã°ã¬ãŒãäœæ¥äžã¯æžã蟌ã¿ã忢ããŠæ°ããã¯ã©ã¹ã¿ãæ§ç¯ã§ããŸããã 以äžããã¢ããã°ã¬ãŒããšåãæ¿ãæ¹æ³ã¯äžèšã®ãããªãããŒã«ãªããŸããã æé ã確èªã§ããã®ã§ã次ã¯å®éã«è¡ã£ãããšããŸãšããŠãããŸãã ã¢ããã°ã¬ãŒãããããã«è¡ã£ãããš ã¢ããã°ã¬ãŒãããããã«è¡ã£ãæé ã¯äžèšã«ãªããŸãã Redisã®ã¢ããã°ã¬ãŒãå
容ã®ç¢ºèª ããŒãžã§ã³ã¢ããããRedisã®ç«ã¡äžã è² è·è©Šéš ãªãªãŒã¹æé æžãæžããŠãªããŒãµã« æ¬çªåæ Redisã®ã¢ããã°ã¬ãŒãå
容ã®ç¢ºèª ä»åã¯Redisã®ã¡ãžã£ãŒããŒãžã§ã³ã3ãã7ãžãšäžæ°ã«4ã€ãäžããã®ã§ã¢ããã°ã¬ãŒãã®å
容ããã確èªããå¿
èŠããããŸããã äž»ã«ç¢ºèªããã®ã¯å€§ãã2ã€ã ãã©ã¡ãŒã¿ã°ã«ãŒã ã³ãã³ã ãã©ã¡ãŒã¿ã°ã«ãŒãã«é¢ããŠã¯å°éã« AWSå
¬åŒããã¥ã¡ã³ã ãèªãã§ãããŸããã ä»åã®Redisã®ã¢ããã°ã¬ãŒãã«ãããŠã¯ã¢ããªã±ãŒã·ã§ã³ã®å€æŽã¯äŒŽããªãããã远å ããããã©ã¡ãŒã¿ã®ç¢ºèªãããã倿Žãåé€ããããã©ã¡ãŒã¿ã«ã€ããŠéç¹çã«ç¢ºèªãããŸããã ä»åã¢ããã°ã¬ãŒã察象ã®Redisã¯ã¯ã©ã¹ã¿ãŒèšå®ãããŠãããããã€å©çšããŠããã³ãã³ãã GET , SET , DEL ãããªãã·ã³ãã«ãªãã®ã§ãã£ãããããã©ã¡ãŒã¿ã°ã«ãŒãã®å€æŽã«åœ±é¿ããããã®ã¯ãããŸããã§ããã ããã¯ã©ã¹ã¿èšå®ãããŠããã®ã§ããã°ãRedis6ã§ã®å€æŽç¹ã§ cluster-allow-reads-when-down : ãã©ã€ããªãèœã¡ããšãã«ã¬ããªã±ãŒã·ã§ã³ã®èªã¿èŸŒã¿ãèš±å¯ããã(ããã©ã«ãã¯èš±å¯ããªã) ã¯äžåºŠç¢ºèªããã»ããè¯ããšèããããŸãã ä»ã«ãRedis4ã®å€æŽç¹ã§ã¡ã¢ãªã溢ãããšãã«åãæåã®ãã©ã¡ãŒã¿ maxmemory-policy ã«éžæè¢ãå¢ããŠããããšããã©ã¡ãŒã¿ã®å€æŽãèŠã€ã€ã¢ããªã±ãŒã·ã§ã³ã®ããã¹ãå§¿ãšç
§ããåãããå¿
èŠããããŸãã æ¬¡ã«ã³ãã³ãã§ãããããã¯Redisã³ãã³ãã®å
¬åŒããã¥ã¡ã³ããšãã¢ããªã±ãŒã·ã§ã³ã§çšããŠããã³ãã³ããç
§ããåãããå¿
èŠããããŸããäŸãã°ã SETã³ãã³ã ã¯ããŒãžã®äžéšã«Historyããããåããããªãã·ã§ã³ãå¢ããŠãããªã©ã®å€æŽç¹ããããŸãã Terraformã§ã¹ãããã·ã§ããããããŒãžã§ã³ãããŠåŸ©å
TerraformãçšããŠã¹ãããã·ã§ããããããŒãžã§ã³ãäžããŠæ°èŠã«ã¯ã©ã¹ã¿ãäœæããæ¹æ³ã§ãã resourceã®ã¯ã©ã¹ã¿ã®èšå®ã§ snapshot_name 屿§ãããã®ã§ãããã«åŒæ°ãšããŠã»ããããŠapplyããã ãã§æ°èŠã«äœãããŸãã resource " aws_elasticache_parameter_group " " default " { name = " cache-params " family = " redis7 " } # ã¯ã©ã¹ã¿èšå®ã¯ãšã³ãžã³ããŒãžã§ã³ã«ææ°ããŒãžã§ã³ãæå® # snapshot_nameã«åŸ©å
ããã¹ãããã·ã§ããåãæå® resource " aws_elasticache_cluster " " example " { replication_group_id = " cluster-example " num_cache_clusters = 2 node_type = " cache.r6g.4xlarge " port = 6379 engine = " redis " engine_version = " 7.0 " parameter_group_name = " default.redis7 " snapshot_name = " snapshot_name " .... other } èšå®äžã«ããã£ãç¹ã¯ãTerraformãããã€ããŒã®ããŒãžã§ã³ãå€ã Error: engine_version: Redis versions must match <major>.x when using version 6 or higher, or <major>.<minor>.<bug-fix> applyæã«äžèšã®ãšã©ãŒãåºãŸãããã v5.3.0 ã® PR ã«ãŠè§£æ¶ãããã®ã§ãäžèšã®ãšã©ãŒã«ééãããTerraformãããã€ããŒã®ããŒãžã§ã³ãäžããŸãããã è² è·è©Šéš ã¢ããã°ã¬ãŒã察象ã®Redisã¯æ±äººæ€çŽ¢çµæã®è¡šç€ºãªã©éåžžã«éèŠãªéšåã§äœ¿ãããŠãããããæ¬çªåæ åã«è² è·è©Šéšãè¡ãããã©ãŒãã³ã¹äœäžãäžå
·åãèµ·ããªãã確èªããå¿
èŠããããŸããã ã¹ã¿ã³ãã€ã§ã¯æ±äººæ€çŽ¢æ©èœã«é¢ãã SLO ãèšããŠããããããããåºæºã«è² è·è©Šéšã宿œããŸããã ãªãªãŒã¹æé æžãæžããŠãªããŒãµã« æ¬çªäœæ¥ãã¹ã ãŒãºã«åé¡ãªã宿œã§ããããã«ãæ€èšŒç°å¢ã§ãªããŒãµã«ã宿œããŠããæ¬çªäœæ¥ãããããšã«ããŸããã ãªãªãŒã¹æé æžãäœæããããŒã å
ã¬ãã¥ãŒãéããŠæ€èšŒç°å¢ã§ã®ãªããŒãµã«ã«æã¿ãŸããã å®éã«æ€èšŒç°å¢ã§CNAMEåãæ¿ãããšæ³å®å€ã®äºãèµ·ããã®ã§ããªããŒãµã«ããã£ãŠããã£ããšèšããŸããå®ã¯Redisã®CNAMEãåãæ¿ããã ãã ãšããŸãåãæ¿ãã£ãŠãããªããšããäºè±¡ãçºçããŸããã çç±ã¯Redisã® Client Timeouts ã¯ããã©ã«ãã§ç¡å¶é(ã€ãŸãã³ãã¯ã·ã§ã³ãéããªã)ã ããã§ããã By default recent versions of Redis don't close the connection with the client if the client is idle for many seconds: the connection will remain open forever. è§£æ±ºæ¹æ³ã¯Redisã«æ¥ç¶ããŠããã¢ããªã±ãŒã·ã§ã³ããããã€ãçŽãããšã§æ°ãã«ã³ãã¯ã·ã§ã³ãæ¥ç¶ãã«è¡ãã®ã§è§£æ±ºããŸããã æ¬çªåæ ããšã¯ãæ¬çªåæ¥ã«ã¹ãããã·ã§ããããããŒãžã§ã³ããããRedisãç«ã¡äžããŠåœæ¥ã«åãæ¿ãäœæ¥ããã ãã§ããããã£ãããšãªãªãŒã¹æé æžãæžããã®ã§ã¹ã ãŒãºã«åãæ¿ããçµããç¡äºã¢ããã°ã¬ãŒãã§ããŸããã ããã£ãããš ã¢ããã°ã¬ãŒãã®å¯Ÿå¿ãéããŠå人çã«ããã£ãããšãåæããŸãã Redis5.0.6ãã Graviton ã察å¿ã«ãªã£ãŠãããåã¹ããã¯ã§äœã³ã¹ãéçšãå¯èœã«ãªã£ãã®ã§å°ãã³ã¹ãåæžã«è²¢ç®ã§ããŸããã Redis5.0.6以éã¯ãã¢ããã°ã¬ãŒãã«äŒŽãããŠã³ã¿ã€ã ãæå°éã«æããããã®ã§ãä»åã®ãããªå€§æããã®äœæ¥ãããªããŠãããå¯èœæ§ãåºãŠããŸããã(åè: ã¢ããã°ã¬ãŒãã«ãšé¢ããèæ
®äºé
) Redisèªäœã¯é·ã䜿çšã¯ããŠãããã®ã®ãã©ããªæ©èœãããã®ããã©ããªèšå®ãã§ããã®ããªã©è©³çްãããŸãæèããŠããŸããã§ããããä»åã®ã¢ããã°ã¬ãŒãã®å€æŽå
容ãäžéãèªãããšã§ææ§ã ã£ãéšåã«ã€ããŠçè§£ãæ·±ãŸããŸããã æåŸã« 以äžãRedis3ãRedis7ã«ã¢ããã°ã¬ãŒããã話ã§ããã ä»åã®ã¢ããã°ã¬ãŒãã§ã¯ãããŠã³ã¿ã€ã ãªãã§åãæ¿ããè¡ããŸããã ä»åã®ã¢ããã°ã¬ãŒã察å¿ã¯å人çã«Redisã«ã€ããŠãã£ãšç¥ããããšæããè¯ãæ©äŒã«ãªããŸããã åèæç® Amazon ElastiCache for Redisã®ã¡ãžã£ãŒã¢ããã°ã¬ãŒãæ¹æ³ããŸãšããŠã¿ã ããŠã³ã¿ã€ã ãªãã§ã¢ããã°ã¬ãŒãããæ¹æ³ãåèãããŠããããŸãã ãã©ã¡ãŒã¿ã°ã«ãŒãã®å€æŽå
容 ãšã³ãžã³ããŒãžã§ã³ã®å€æŽå
容 Amazon ElastiCacheã®Terraform ã¢ããã°ã¬ãŒãã«ãšé¢ããèæ
®äºé
ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
ã¯ããã« ããã«ã¡ã¯ãã¹ã¿ã³ãã€ã§æ±äººããŒã¿ç®¡çã«é¢ããããã¯ãšã³ããšã³ãžãã¢ãããŠããæ± ç°ã§ãã ã¹ã¿ã³ãã€ã¯WEBäžã«ååšãã倧éã®æ±äººãäžæ¬æ€çŽ¢ã§ãããµãŒãã¹ãæäŸããŠããããã®æ±äººç¥šã®ãã¹ã¿ã®ããŒã¿ã¯ Amazon Aurora ã䜿ã£ãŠéçšããŠãããŸãã 以äžã®èšäºã§èª¬æãããŠãããŸããã2021å¹Žã«æ±äººå蟌çŽåŸã®æ±äººæ
å ±ãæ§é åããŒã¿ãšããŠä¿åããããã« Amazon Aurora ãæ¡çšããŸããã ã¹ã¿ã³ãã€ã®æ±äººæ
å ±å蟌ã®ä»çµã¿ãäœãçŽãã話ããåºç« ã DBãšã³ãžã³ãšã㊠Aurora ( MySQL 5.7 ) ãå©çšããŠãããŸãã ã¹ãã¬ãŒãžãšã³ãžã³ãšã㊠InnoDB ãå©çšããŠãããŸãã ãããäœãçŽãããæãçµã¡ãæ±äººç¥šã®å¢å ãåçš®æ©èœã®è¿œå çã«ãã£ãŠ Aurora ã®ããŒã¿éã¯æ³å®äžã®éãã§å¢å ããŠãããããã«æ¯äŸãã圢ã§ã€ã³ãã©ã³ã¹ããå¢å ãç¶ããŠããŸããã ä»ååçç¹ãšã³ã¹ãåæžã®ããã«å®æœããæœçãšçµæã«ã€ããŠã玹ä»ããŸãã å¢å ããŠããããŒãã«ãµã€ãºã®ã°ã©ãã(1ã€ã®ç·ã1ã€ã®ããŒãã«ã®ããŒãã«ãµã€ãºã瀺ããŠããŸã) ããŒã¿éãå¢å ããŠããèŠå äžéšã®ããŒãã«ã®ããŒã¿éã倧ããå¢å ãç¶ããŠããçç±ã¯ãã¬ã³ãŒãåé€ãè¡ãããããŒãã«ã«å¯Ÿãããã£ã¹ã¯é åã®è§£æŸãã§ããŠããªãã£ãããã§ãã MySQLãMariaDBã§ã¯ OPTIMIZE TABLE ã ALTER TABLE ãªã©ã®ã³ãã³ããå®è¡ããããšã§ããã£ã¹ã¯é åãè§£æŸã§ããŸãã 1 æ±äººç¥šã¯ããªãé »ç¹ã«è¿œå ãåé€ãè¡ããããšããç¹åŸŽããããããæ±äººããŒã¿ã管çããäžé£ã®åŠçã§ã¯æ¥åžžçã«å€§éã® INSERT, DELETE ãå®è¡ãããŸãã ãã®ããæ±äººç¥šãæ±ãããŒãã«ã®ã¬ã³ãŒãæ°ã¯ããŸãå€ãã£ãŠããªãã®ã«ãããŒãã«ãµã€ãºã¯ã©ãã©ããšå¢å ãç¶ããŠããŸããã ããŒã¿ã®å¢å ã«ããæªåœ±é¿ ãŸãããŒã¿éãå¢ãããšã€ã³ãã©ã³ã¹ãïŒ storage usage çïŒãé«ããªãã ããªããDBããã®ããŒã¿ååŸé床ãé
ããªã£ãŠããŸãããµãŒãã¹ãšããŠãã¬ã¹ãã³ã¹ãé
ããªããªã©ã®æªåœ±é¿ãåºãŠããŸããŸãã DBããããŒã¿ãååŸããéã®ã€ã³ããã¯ã¹ã¹ãã£ã³ãããŒãã«ã¹ãã£ã³ãé
ããªããŸãã 2 ããŒã¿ã®ååŸã«æéããããããããµãŒãã¹ã®ã¬ã¹ãã³ã¹ãé
ããªããŸãã ããŒã¿ã®ååŸã«æéãããããããCPU䜿çšçãå¢å ããããããªãŒãã¬ããªã«ãå¢ãããã€ã³ã¹ã¿ã³ã¹ã¿ã€ããäžãããšãã£ã察å¿ãå¿
èŠã«ãªãããã«ã€ã³ãã©ã³ã¹ããäžæããŸãã OPTIMIZE TABLE ã宿çã«å®è¡ããããã«ã¯ ã§ã¯åã« OPTIMIZE TABLE ãå®è¡ããã°è¯ãã®ããšãããšãããã§ã¯ãããŸããã ãªããªãã° OPTIMIZE TABLE ãå®è¡ãããšãå®è¡æãšçµäºæã«è©²åœã®ããŒãã«ã«ã¡ã¿ããŒã¿ããã¯ããããããã§ãã ã¡ã¿ããŒã¿ããã¯äžã«ã䞊è¡ããŠSelectã¯ãšãªãå®è¡ããããšãããã¯ãããŸãã 3 ã€ãŸã宿çã« OPTIMIZE TABLE ãå®è¡ããããã«ã¯ãAurora ã®ã¡ã³ããã³ã¹æéãèšããå¿
èŠãããã 24æé皌åããŠããWebãµãŒãã¹ã§ã¯ååãšããŠåæ¢æéã¯èšããããªãã®ã§ãWebãµãŒãã¹ã¯çŽæ¥Auroraã«äŸåããªãããã«ã¢ãŒããã¯ãã£ã倿Žããå¿
èŠããããŸãã åœæã¹ã¿ã³ãã€ã§ã¯ãWebãµãŒãã¹äžã§æ±äººç¥šã衚瀺ããéã«ã¯ãã®AuroraãçŽæ¥åç
§ããã¢ãŒããã¯ãã£ã«ãªã£ãŠããŸããã ãã®ããã宿çã« OPTIMIZE TABLE ãå®è¡ããããã«ã¯ã以äžã®ããã«WebãµãŒãã¹ããã¯Auroraã«çŽæ¥äŸåããªãã¢ãŒããã¯ãã£ã«ããå¿
èŠããããŸãã äžèšã¯ã¹ã¿ã³ãã€ã®WebãµãŒãã¹ãžæäŸããæ±äººæ
å ±ãAuroraããã§ã¯ãªãDynamoDBãéããŠæäŸããã¢ãŒããã¯ãã£ã§ãã AuroraããDynamoDBãžFeederãè¡ããµãŒãã¹ãäœããAuroraãšDynamoDBéæ±äººããŒã¿ã®åæãè¡ããŸããã æ±äººæ
å ±APIã§ã¯DynamoDBã®æ±äººããŒã¿ãåç
§ããããã«ããAuroraãžã®äŸåããªãããŸããã ã¢ãŒããã¯ãã£å€æŽã®æœçãšçµæ Auroraã«äŸåããªãã¢ãŒããã¯ãã£ã«ãããšããã§ãOptimizeãããŒãã«ãå®è¡ãããšãããããŒã¿éãæžå°ããŸããã 4 ååããŒã¿åé€åŸã®ããŒãã«ã®ãµã€ãºã 宿çãªOptimizeã®å®è¡åŸã®ããŒãã«ã®ãµã€ãºã ååOptimizeåŸã«å®æçã«Optimizeãå®è¡ããããšã§ãæªäœ¿çšé åãshrinkããããB-TREEã€ã³ããã¯ã¹ã®äžŠã³ãæŽçãããçµæçã«ã¹ãã¬ãŒãžã®äœ¿çšå®¹éãæžå°ããŸããã çµæãšã㊠ã€ã³ããã¯ã¹ã¹ãã£ã³ãããŒãã«ãã«ã¹ãã£ã³ãéããªããã¯ãšãªãŒã®å®è¡é床ãäžãããŸããã ã¯ãšãªãŒã®å®è¡é床ãåäžããããšã§ãDBã«å¯ŸããŠã¯ãšãªãŒãå®è¡ããã¢ããªã±ãŒã·ã§ã³ã®äžŠå床ãäžããããšãã§ããããã«ãªããç¹ã«SELECTã¯ãšãªãŒã®åæå®è¡æ°ãæžããŸããã 䞊åå®è¡ãããã¯ãšãªãŒæ°ãæžãããšã§DBã®CPU䜿çšçãæžããããã«DBã®ã¯ã©ã¹ã¿ãŒã®å°æ°ãæžããããšãã§ããŸããã æçµçã«ã€ã³ãã©ã³ã¹ãã倧ããåæžãããŸããã ããã«ã³ã¹ããåæžããããã®æœç ã¹ã¿ã³ãã€ã®æ±äººããŒã¿ã®æŽæ°é »åºŠãèŠçŽããŠ1æ¥ã®åã蟌ã¿åæ°ãå¶éããçµæãæ±äººã®æžãèŸŒã¿æ°èªäœãçŽ2åã®1ã»ã©æžããŸããã 5 ãã®æžãèŸŒã¿æ°ãæžããæœçã«ãã£ãŠãAuroraã®ã€ã³ãã©ã³ã¹ããããã«åæžã§ããŸããã 2023幎3æã® Aurora:StorageIOUsage ãšæ¯èŒããŠã2023幎8æä»¥éã«ã¯1/3以äžã«äžãããŸããã æœçãšçµæã«ã€ã㊠ä»å宿œããæœçããŸãšãããšä»¥äžãšãªããŸããAuroraã®ã€ã³ãã©ã³ã¹ãã¯æœç宿œåãšæ¯èŒããŠçŽ55ïŒ
åæžã§ããŸããã æŽæ°é »åºŠãé«ãããŒãã«ã宿çã«Optimizeã§ããç¶æ
ã«ããã æžã蟌ã¿ãå€ãå Žåã¯ãæžã蟌ã¿ãæžããã äžèŠãªãã©ã³ã¶ã¯ã·ã§ã³åŠçãåé€ããããã©ã³ã¶ã¯ã·ã§ã³ã䜿ãã¹ããšããã§äœ¿ãã æžã蟌ã¿ã®é床ãé
ããªãããã€åé€ã§ããªããã°(InnoDBã®ãã°)ãããŸãç¶ããããã Auroraã§ã®ã³ã¹ãåæžã®é¢ã§äžçªå¹æçãªæœçã¯ãDBãžã®æžã蟌ã¿ãèªã¿èŸŒã¿ãæžããããšã§ããã Aurora:StorageIOUsage ã«æ¯äŸããŠãã³ã¹ãå
šäœã äžãã£ãŠãããŸãã åçç¹ ä»å2023幎3æãšæ¯èŒããŠå€§ããã³ã¹ãåæžãã§ããã®ã§ãããAWS Aurora(MySQL)ãæ¡çšããéã«ã¯ä»¥äžãæ°ã«ããŠããã¹ãã§ãã£ããšçæããŠãããŸãã èšèšæã«ããŒã¿éãæ£ããèŠç©ããã ãã¹ã¿ãŒããŒãã«ããã©ã³ã¶ã¯ã·ã§ã³ããŒãã«ã§ã©ããããã®ããŒã¿éã«ãªãããèŠç©ããã ã¬ã³ãŒãã®ã©ã€ããµã€ã¯ã«ãèããã ã¬ã³ãŒãã®åé€ãå€ãå®è¡ããå Žåã«ã¯ãã©ããã®ã¿ã€ãã³ã°ã§ OPTIMIZE TABLE ãå®è¡ããå¿
èŠãããã MySQLãŸãã¯MariaDBãæ¡çšããå Žåã¯ã宿çã« OPTIMIZE TABLE ã§ãããããªã¢ãŒããã¯ãã£ã«ããã æžã蟌ã¿ãå€ãã¢ããªã±ãŒã·ã§ã³ã®å Žåã¯ãI/Oã¬ãŒãã«æ¯äŸããŠæéãäžããç¶ããªãæéäœç³»ãå©çšããã éå°ãªSLOãå®ããªãã ä»åã®ã±ãŒã¹ã§ã¯é¢ä¿è
ãšèª¿æŽããããã§æ±äººããŒã¿ã®æŽæ°é »åºŠã1æ¥Nåã«å¶éããããšã§æžãèŸŒã¿æ°ãæžããããšãã§ããŸãããSLOèªäœãèŠæ±ã»èŠä»¶ã«å¯ŸããŠéå°ã«ãªã£ãŠããªããã確èªããé©åãªã¬ãã«ã«ããããšã¯éèŠã§ããã æ±äººããŒã¿ç®¡çã«é¢ããã·ã¹ãã ã®ãªã¢ãŒããã¯ãã£ãé²ãã仲éãåéããŠããŸã ä»åã®æœçã§ãæ±äººããŒã¿ã®ç®¡çã«å©çšããŠããAuroraã®è²»çšã¯ä»¥åãããåå以äžã«åæžã§ããŸãããããŸã ãŸã æ±äººããŒã¿ç®¡çåšãã®ã·ã¹ãã ã¯ã³ã¹ããåæžã§ããäœå°ããããŸãã çŸåšã¯ããcost-effectiveãªã¢ãŒããã¯ãã£ãç®æããŠãæ±äººåã蟌ã¿ã®ãªã¢ãŒããã¯ãã£ãé²ããŠãããŸãã ç®æšãšããŠã¯æŽã«åå以äžã«ã€ã³ãã©ã³ã¹ããäžããããšæã£ãŠãããŸãã ãã®ããäžç·ã«æ±äººããŒã¿ç®¡çåšãã®ã·ã¹ãã ã®ãªã¢ãŒããã¯ããé²ãã仲éãåéããŠããŸãã®ã§ãå°ãã§ãèå³ãããã°ãã²ãé£çµ¡ãã ããã ããŒã¿ã¹ãã¢ãAuroraã ããªããDynamoDBãDocumentDBãªã©ãé©åã«å©çšããããšã§ãããã³ã¹ããåæžã§ããã¢ãŒããã¯ãã£ã«ããŸãã æ¯æ¥çŽ800äžæ±äººã®åã蟌ã¿ãè¡ããå€§èŠæš¡ãªããŒã¿éãæ±ã£ãéçºãä¿å®ãéçšããŠãããŸãã èšèªã¯Java, Goã§éçºãé²ããŠãããããŒã ã§Goãã¹ããªãŒã åŠçã®å匷äŒãããªããã¿ããªã§åŠç¿ããŠããŸãã ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com ç§ã® Amazon RDS for MySQL DB ã€ã³ã¹ã¿ã³ã¹ãæ³å®ãããå€ãã®ã¹ãã¬ãŒãžã䜿çšããŠããã®ã¯ãªãã§ãã? ↩ å®éã«OPTIMIZE TABLEã®å¹æã宿ž¬ãããšããã€ã³ããã¯ã¹ã¹ãã£ã³ã§ã®ããŒã¿ååŸããOPTIMIZE TABLEã®åŸã«æ°åç§ãã0.5ç§ã«æ¹åãããŸããã ↩ AWSã®ãµããŒãã«ç¢ºèªãããšããã以äžã®è¿çãããã ããŠãããŸãããDDLæã®å®è¡ã«ã¯ã¡ã¿ããŒã¿ããã¯ã®ååŸãå¿
èŠãšãªãé¢ä¿äžãselectæã䞊è¡ããŠå®è¡ãããŠããå Žåããããã¯ãããåäœãšãªããŸãããŸããoptimizeæã¯InnoDBã¹ãã¬ãŒãžãšã³ãžã³ã®å ŽåãALTER TABLE ... FORCEãšããæãšãªããéå§ããã³å®äºæã«ããçæéãã¡ã¿ããŒã¿ããã¯ãååŸããåäœãšãªããŸããã ↩ ã¬ã³ãŒãæ°ãå€ãããŒãã«ã§ã¯Optimizeã«æ°æ¥ãããæ£åžžã«å®äºããªãåé¡ãçºçãããããããŒãã«ãäœããããŠãããŒã¿ãç§»è¡ããããšã§å¯Ÿå¿ããŸããã ↩ AWSã«ã¯ Aurora I/O-Optimizedãšãã I/O éçŽåã¢ããªã±ãŒã·ã§ã³ã®å Žåã«æéã®äžæãæå¶ã§ããæéäœç³»ããããŸãã MySQL 5.7ã§ã¯Aurora I/O-Optimizedã«ã¯å¯Ÿå¿ããŠããããMySQL 8ç³»ã«ããããšã§ãAurora I/O-Optimizedãå©çšã§ããããã«ãªããŸãã ä»åã®Auroraã§æéãã·ãã¥ã¬ãŒã·ã§ã³ããçµæãæéäœç³»ã倿Žããã«æžã蟌ã¿ãæžããæ¡ã®æ¹ãã€ã³ãã©ã³ã¹ããäžããããã®ã§ã I/O-Optimizedã¯å©çšããŸããã§ããã AWS ã Amazon Aurora I/O æé©åããªãªãŒã¹ ↩
ããã«ã¡ã¯ãã¹ã¿ã³ãã€ã§æ€çŽ¢åšãã®éçºãæ
åœããŠããé·¹åã§ãã ä»åã¯æ€çŽ¢é¢é£ã«ã€ããŠã§ã¯ãªããã¹ã¿ã³ãã€ã®æè¡è² åµè§£æ¶ã«ã€ããŠã®åãçµã¿ã«ã€ããŠã玹ä»ããŸãã æŠèŠ Stanby Tech Blogã® ã¹ã¿ã³ãã€2+1幎ã®è»è·¡ ã®èšäºã§ãå°ãã ãè§ŠããããŠããŸããã ã¹ã¿ã³ãã€ã®ã·ã¹ãã ã«ã¯è€æ°ããŒã ã§ã¡ã³ãããŠããstanby-apiãšåŒã°ããã³ã³ããŒãã³ãããããŸãã stanby-apiã¯ã¹ã¿ã³ãã€ã®Webç»é¢ã衚瀺ããããã®éèŠãªã³ã³ããŒãã³ãã§ããã æŽå²ãé·ãããšããããã³ãŒãã®è€éåãéçºäœå¶ãšã®ãã¹ãããã«ããããããã¯ãå
šäœã®éçºçç£æ§ã®äœäžãæããŠããŸããããã®stanby-apiã®è€éåããŠããŸã£ãã³ãŒãããé©åãªç²åºŠã§ã¢ãžã¥ãŒã«ã«åå²ããããšã«ãããåé¡ã®è§£æ±ºãå³ã£ããšããã®ããæ¬èšäºã®å
容ã«ãªããŸãã stanby-apiãšã¯ ãŸãæåã«stanby-apiã«ã€ããŠèª¬æããŸãã ã¹ã¿ã³ãã€ã¯Webäžã§æ±äººæ€çŽ¢ãæäŸããŠãããµã€ãã§ããã ãã®å®çŸã®ããã«ã¯ã以äžã®ãããªæ§ã
ãªæ©èœãå¿
èŠã«ãªããŸãã æ±äººã®æ€çŽ¢ åºåé
ä¿¡ äœææ
å ±ã®è§£æ ã¯ãšãªã®è§£æ ã¯ãšãªã®ãµãžã§ã¹ã å¿åæ©èœ ABãã¹ãæ©èœç ãããã®æ©èœã¯ãã¹ã¿ã³ãã€å
éšã®è€æ°ã®ã³ã³ããŒãã³ããAPIãšããŠæäŸããŠããŸãã stanby-apiã¯ããã³ããšã³ãããã®ãªã¯ãšã¹ããåãã ããã¯ãšã³ãã®åAPI矀ãé©åãªé ã§åŒã³åºãã ãããã®ããŒã¿ãçµ±åããŠããã³ããšã³ãã«è¿åŽãã圹å²ãæ
ã£ãŠããŸãã stanby-apiãæ±ããŠããèª²é¡ äžèšã§è¿°ã¹ãããã«ãstanby-apiã¯ããã³ããšã³ããžã®ã¬ã¹ãã³ã¹ãè¿ã圹å²ãæããã³ã³ããŒãã³ãã§ãããæåãããã®ããã«èšèšãããããã§ã¯ãããŸããã§ãããåææ®µéã§ã¯ãçŸåšã»ã©å€ãã®æ©èœãã³ã³ããŒãã³ããååšãããããã¯ãšã³ãã®æ©èœãçŽæ¥stanby-apiã«å®è£
ãããŠããŸãããæéãçµéããã«ã€ããã¹ã¿ã³ãã€ã®æ©èœãå¢ããstanby-apiã«ãå€ãã®å®è£
ã远å ãããŸããããããããããã®å€æŽã¯å
šäœã®ã¢ãŒããã¯ãã£ãç·åçã«æ€èšããã«è¡ãããå°æ¥ã®å±æã«åºã¥ããŠèšèšããããã®ã§ã¯ãªãã£ããããå¿
èŠãªæ©èœã段éçã«è¿œå ãããAPIãç¡ç§©åºã«æé·ããŠããŸããŸããã ããã«ãçµç¹ã®æ¡å€§ãšäœå¶ã®å€åã«äŒŽãããŒã ã®åå²ãçµ±å»åãéçºè
ã®ç°åãªã©ãããçŸåšã§ã¯ãstanby-apiã¯è€æ°ã®ããŒã ã®éçºè
ã«ãã£ãŠéçºãããç¶æ
ã«ãªããŸãããããããªãããããŒã éã®è²¬ä»»åæ
ãæç¢ºã§ãªãã£ããããåããŒã ãèªç±ã«å®è£
ããã³ãŒããããããšããã§å
¥ãæ··ãããstanby-apiã®å
šäœåãææ¡ããéçºè
ã®äžè¶³ã«ç¹ãããŸããã çµæãšããŠãstanby-apiã®éçºã«ãããŠããŸããŸãªåé¡ãçºçããŸãããå¿
èŠãªæ
å ±ã®ææ¡ã«ã¯å€ãã®æéãããããæ©èœã®éçºã«åãçµããŸã§ã«é
å»¶ãçããŸãããäžèŠãããšããããªå€æŽã§ãã£ãŠããç¡é¢ä¿ã®ãã¹ãã倱æããäºäŸãçºçããŸãããäœäººãã®éçºè
ãè€æ°ã®ããŒã ãåäžã®ã³ãŒãããŒã¹ã«å€æŽãå ãããããã³ã³ããªã¯ããçºçãããªãªãŒã¹ã¹ã±ãžã¥ãŒã«ã®ç®¡çãç
©éãšãªããŸããããã®ãããªçç±ãããstanby-apiã®éçºã¯ã¹ã¿ã³ãã€ã®æé·ã«ãããŠå€§ããªããã«ããã¯ãšãªã£ãŠããŸããã ã¢ãžã¥ãŒã«åå²ã«ãã解決 ãã®åé¡ã解決ããããã«ãstanby-apiã«å¯Ÿãããªãã¡ã¯ã¿ãªã³ã°ãããžã§ã¯ããç«ã¡äžããŸããã ãã®ãããžã§ã¯ãã§ã¯ã以äžã®ïŒã€ããŽãŒã«ãšããŠèšå®ããŸããã 絡ã¿åã£ãã³ãŒããæŽçããstanby-apiã®ã³ãŒããæ©èœããšã«ã¢ãžã¥ãŒã«ãžåå²ããããšã§ãäŸåé¢ä¿ãåé¢ããæ©èœéã®å¢çãæç¢ºã«ããããš åã¢ãžã¥ãŒã«ã«æ
åœã°ã«ãŒããå²ãåœãŠãäœæ¥ç¯å²ãéå®ã責任ãæç¢ºã«ããããš ãããžã§ã¯ããé²è¡ããéããŸãæåã«ã¢ãžã¥ãŒã«ã®å岿¹éãçå®ããŸããã ã¢ãžã¥ãŒã«ãåå²ããéãæãæ€èšãå¿
èŠãªãã€ã³ãã¯ãã©ã®åäœã§ã¢ãžã¥ãŒã«ãåãããã§ããåå²åäœãå°ãããããšä¿å®æ§ãäœäžãã倧ãããããšã³ãŒãã®è€éæ§ã®å¢å ã«ã€ãªããå¯èœæ§ããããŸããããããã¢ãžã¥ãŒã«ã®åå²åäœã«ã€ããŠã¯çµ¶å¯Ÿçãªæ£è§£ã¯ãããŸããããã®ãããžã§ã¯ããé²ããéãåããŒã ãšå®éã®ã³ãŒããæ€èšããªãããã¢ãžã¥ãŒã«ã®åå²åäœãåæããããã«ããã€ãã®æ¹éãèšããŸããã ã¢ãžã¥ãŒã«ã®åå²åäœã¯ãæ
åœããŒã ãåç¬ã§éçºã»éçšã§ããåäœãšããã æ¢ã«APIãšããŠç¬ç«ããæ©èœãåãåºãããŠããå Žåãå€éšAPIåŒã³åºãã1ã€ã®ã¢ãžã¥ãŒã«ãšããŠåå²ããã ãããã®æ¹éãå®ããããšã§ãã¢ãžã¥ãŒã«ã®åå²ã«é¢ããè°è«ãå
·äœçã«é²ããåæãåŸãéã®æéãšããŸããã æ¹éãåºãŸã£ãåŸãå
·äœçãªã¢ãžã¥ãŒã«å岿¹æ³ã決ããŸããã ã¢ãžã¥ãŒã«ã®ã€ã³ã¿ãã§ãŒã¹å®çŸ©ã«ã¯ãProtol Buffersãæ¡çšããŸããã ãããŸã§ã¯ãç¹å®ã®æ©èœã§ã®ã¿äœ¿çšãããæ³å®ã®ã¯ã©ã¹ãã¡ãœããããstanby-apiã®ã©ãããã§ãåŒã³åºãå¯èœã«ãªã£ãŠãããããæ¬æ¥é¢ä¿ã®ãªãç®æã§äœ¿çšãããŠããããšããããŸããã äŸãã°ãæ±äººæ
å ±ã衚ãJobã¯ã©ã¹ã«å®è£
ãããŠããæ±äººã®ã¿ã€ãã«ãè¡šç€ºãæŽããããã«å å·¥ããã¡ãœããããæ€çŽ¢APIãåŒã³åºããŠããã¡ãœããå
ã§äœ¿ãããŠãããšãã£ãããšããããŸããããã®ãããªç¶æ³ã§ã¯ã倿Žã®åœ±é¿ç¯å²ãç¹å®ã§ãããå°ããªå€æŽã«å¯ŸããŠã調æ»ã«æéãããã£ãŠããŸããŸãããœãŒã¹ã³ãŒããåã«ã¢ãžã¥ãŒã«ã«åå²ããã ãã§ã¯ããã®åé¡ã¯è§£æ±ºã§ããŸãããä»ãããšã³ãžãã¢ã泚æãæã£ãŠéçºããŠããŠãããããæ°ãã«å
¥ã£ãŠãããšã³ãžãã¢ããæå³ããã«ã¢ãžã¥ãŒã«å€ããã¢ãžã¥ãŒã«å
éšã®ããžãã¯ãåŒã³åºããŠããŸãå¯èœæ§ããããŸãã ããã§ãProtocol Buffersã䜿çšããŠãã¢ãžã¥ãŒã«éã§ããžãã¹ããžãã¯ãæŒãåºãããšãé²ãããšã«ããŸãããProtocol Buffersã§ã¹ããŒããå®çŸ©ããããŒã«ãçšããŠã¢ãžã¥ãŒã«åŒã³åºãã®ã€ã³ããããšã¢ãŠããããã衚ãã¯ã©ã¹ã®ã³ãŒããçæããŸãããã®ã¯ã©ã¹ã«ã¯ãæ°å€ããæååãé
åããªããžã§ã¯ãåã®ã¡ãœãããæããªãããŒã¿ã®ã¿ãå«ãŸããŸããã¢ãžã¥ãŒã«ã®å®è£
åŽãšåŒã³åºãåŽã¯ããã®ã¯ã©ã¹ã«ã ãäŸåããããã«ããããšã§ãããžãã¯ãã¢ãžã¥ãŒã«ã®å€ã«æŒãåºãŠããŸãããšãé²ãããšãã§ããŸãã ã¢ãžã¥ãŒã«ã®åå²ã®é²ãæ¹ãšããŠãã¢ãžã¥ãŒã«ãåå²ããéã«ã¯ãäžæ¬ã§å
šãŠã®ã¢ãžã¥ãŒã«ãåãåºãã®ã§ã¯ãªããæ®µéçã«é²ããããšã«ããŸãããæåã«åœ±é¿ãæ¯èŒçå°ããã¢ãžã¥ãŒã«ããã©ã€ã¢ã«ã§åãåºããã¢ãžã¥ãŒã«ã®åå²ã«ãããå®çžŸãç©ãããšã«éç¹ã眮ããŸããã ããã§åŸãçµéšã掻ãããªãããä»ã®éçºã«å¯Ÿãã圱é¿ãæå°éã«æãã€ã€ãé æ¬¡ã¢ãžã¥ãŒã«ãåãåºããŠãããŸããã ã¢ãžã¥ãŒã«åå²ã«ãã£ãŠåŸããã广 äžèšã®æ¹éã«åŸã£ãŠãããžã§ã¯ããé²ããã¢ãžã¥ãŒã«åå²ã¯çŽå幎ã§å®äºããŸããã ã¢ãžã¥ãŒã«åå²ã«ããåŸããã广ãšããŠãè€æ°ããŒã éã§ã®éçºãéåžžã«ããããããªããŸããã ãã¹ãŠã®ã³ãŒãã®æ
åœã°ã«ãŒããæç¢ºã«ãªã£ããããããæ©èœã远å ããããšããéã«ãã©ãã®ããŒã ã«çžè«ãããã°ããããäžç®ã§ãããããã«ãªããŸããã ãŸããã¹ããŒãå®çŸ©ã®å€æŽç®æã決ãŸã£ãŠããŸãã°ãã¢ãžã¥ãŒã«åŒã³åºãåŽãšã¢ãžã¥ãŒã«ã®å®è£
åŽã§äžŠè¡äœæ¥ãã§ããããã«ãªããéçºæéãççž®ãããŸããã åãã³ãŒããè§Šãããšããªããªã£ãã®ã§ãã³ã³ããªã¯ããæžå°ããªãªãŒã¹ã®ç®¡çã容æã«ãªããŸãããããŸãã«ãèª°ã®æã¡ç©ãããããåé€ã§ããŠããªãã£ã倧éã®ãããã³ãŒããåé€ã§ããã³ãŒããã¯ãªãŒã³ã«ãªããŸããã ä»åŸã«ã€ã㊠ä»åã¯stanby-apiãšããã³ã³ããŒãã³ãã®ãªãã¡ã¯ã¿ãªã³ã°ãšããŠãããã ã¢ããã®ã¢ãããŒãã§ã¢ãžã¥ãŒã«åå²ãé²è¡ããŸãããããããªããããã®ãããªèª²é¡ã¯1ã€ã®ã³ã³ããŒãã³ãã«éããããããã¯ãå
šäœã§çºçããå¯èœæ§ããããŸãããã®ãããªåé¡ãæªç¶ã«é²ããããå
šç€Ÿçãªã¢ãŒããã¯ãã£ã®ç¢ºç«ãå¿
èŠãšèããããŸãã è¿å¹Žããã€ã¯ããµãŒãã¹ãã¢ãžã¥ã©ã¢ããªã¹ãªã©ã®ã¢ãŒããã¯ãã£ãåºãæ¡çšããã€ã€ãããŸããä»åã®æ¹ä¿®ã«ãããŠãstanby-apiã¯ã¢ãžã¥ã©ã¢ããªã¹ãšãã€ã¯ããµãŒãã¹ã®äžéçãªã¢ãŒããã¯ãã£ãšãªããŸãããå°æ¥çã«å
šç€Ÿçãªã¢ãŒããã¯ãã£ãã©ã®ããã«ãªããã«é¢ããããä»åã®æ¹ä¿®ã«ããã¹ã ãŒãºãªç§»è¡ãå¯èœãšãªã£ãŠããŸãã ãŸãšã æ¬èšäºã§ã¯ãstanby-apiã®ã¢ãžã¥ãŒã«åå²ã«ãããªãã¡ã¯ã¿ãªã³ã°ã«ã€ããŠã玹ä»ããŸããã Stanbyã®éèŠãªã³ã³ããŒãã³ãã§ããstanby-apiã¯ãé·ãæŽå²ãšè€éæ§ããçç£æ§äœäžã®èª²é¡ãæ±ããŠããŸãããã¢ãžã¥ãŒã«åå²ãããžã§ã¯ãã«ãããã¢ãžã¥ãŒã«ã®æç¢ºãªåé¢ãšç®¡çäœå¶ã®æŽåãè¡ãããéçºçç£æ§ãåäžããŸãããå°æ¥ã®ã¢ãŒããã¯ãã£å€æŽã«ãæè»ã«å¯Ÿå¿å¯èœãªç¶æ
ãšãªããŸããã ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
æ ªåŒäŒç€Ÿã¹ã¿ã³ã〠QAã°ã«ãŒãã«æå±ããŠããæè°·ã§ãã æ¬èšäºã§ã¯ãã¹ã¿ã³ãã€QAã®ãã¹ãèªååã®åãçµã¿ã玹ä»ããããšæããŸãã 2023幎9æçŸåšãå°å
¥åŸ1幎åã«ãããã¹ã¿ã³ãã€ã®Webã®ãã¹ãã§ããã¹ãã·ããªãªæ°ã¯ã100å以äžãã«ãªã£ãŠããã宿œåæ°ã¯ã9000å以äžãã«ãªããŸãã ãã¹ãèªååãæšæºãšãªã£ãŠããæ¥çã®æµãã®äžã§ãã¹ã¿ã³ãã€QAã®ç®çãšè©Šè¡é¯èª€ãããä»åŸããã¹ãèªååã®å°å
¥ãæ€èšããQAã®æææ±ºå®ã®äžå©ãšãªãã°å¹žãã§ãã èæ¯ã»èª²é¡ããããªããã¹ãèªååãããã®ã ã¹ã¿ã³ãã€QAã§ã¯ãPythonãNode.jsã䜿çšããã¹ãã®äžéšãèªååããŠããŸãããæ¬èšäºã§ã¯ãµãŒãããŒãã£ã®ãã¹ãããŒã«ã®å°å
¥ã«ã€ããŠã話ãããŸãã ãã¹ãèªååããŒã«ãå°å
¥æã«ã¯ããŸãQAè²»çšã®ã³ã¹ãããŠã³ã«æ³šç®ããŠããŸããã¡ã§ããããã®å段éãšããŠå°å
¥ã«ãã£ãŠäœãå®çŸãããã®ãããã£ãããšç®æšãæ®ããããšãéèŠã§ãã ããšãã³ã¹ãããŠã³ãè¡ããªãã£ããšããŠãããã以äžã®æ©æµãåæãšããŠå°å
¥ããå Žåããã幞ããªQAã©ã€ããåŸ
ã£ãŠãããšæããŸãã ã³ã¹ãããŠã³ãäžçªäŒãããããå°å
¥çç±ã«ãªãã®ãåŠå®ãããã®ã§ã¯ãããŸããããèªååãã¹ãã®ã·ããªãªäœæãã¡ã³ããã³ã¹ã³ã¹ããèæ
®ã«å
¥ãããšãã³ã¹ãããŠã³ã¯å¿
ããã容æã«éæã§ãããã®ã§ã¯ãªãå¯èœæ§ããããŸãã QAäºç®ãæããããšãã§ããããã«ãªãããš ä»ãŸã§QAã§å®æœã§ããŠããªãã£ãç¯å²ã®äœæ¥ãè¡ããããã«ãªãããš å³ã®E2Eãã¹ãéšåã®ã³ã¹ãã«ããã¯æ°åãšããŠåºããããã§ãããç·è²éšåã¯QAããŒã å€ã«ã¯å®æãã«ããé
广§ã®å¹æã ã£ããããŸãã®ã§ãåQAæ¥åã®ããã©ãŒãã³ã¹ãæ°å€ãšããŠåºããïŒãããã¯æ°ããåãçµã¿ãåæã§ããããïŒæºåã¯ããŠãããæ¹ããããããããŸããã å
éšçãªE2Eãã¹ãã®ã³ã¹ãã«ãããåæãšãããã¹ãç¯å²ã®æ¡å€§ãå®çŸã瀺ãããšãã§ããã°ãæé·ããããŒã ãšããŠçµç¹ã®äžã§ããååšæã®ããQAãšãªãã§ãããã å°å
¥æ€èšãããMagicPod ãéžãã ãã ã¹ã¿ã³ãã€ã®E2Eãã¹ãã®èªååå°å
¥ã§ã¯ãéçºç¶æ³ãåæ ãã倧ãã以äžã®ç¹ãéæããããšèããŠããŸããã E2Eãã¹ããéçºã¿ã¹ã¯ãããQAã¿ã¹ã¯ãã«ç§»è¡ãã 以åã®ã¹ã¿ã³ãã€ã§ã¯ãéçºã¹ã¿ãããE2Eãã¹ããæ
ãèªåãã¹ããçµãã§ããŸããã QAã§ãæçµçã«E2Eãã¹ãã宿œããŠããŸããããéçºæ®µéã«ãããE2Eãã¹ãã®äžéšãå®è£
/宿œããããšã¯éçºãµã€ã¯ã«ãé
å»¶ããäžå ãšãªã£ãŠããŸããã®ã§ãéçºåŽã®ãã¹ãå
容ãMagicPodã«çµã¿èŸŒãããšã§äžèŠãªã¹ãã¬ã¹ãæãã£ãŠããã¿ã¹ã¯ãåãé€ãããšãã§ããŸããã ããŒã³ãŒãã§äœæã§ããQAå
ã ãã§å®çµã§ãã ãã¹ãèªååã®æç¶æ§ã®ç¹ãããèªåãã¹ãã®ã·ããªãªäœæã¯æè¡çã«é£æåºŠãäœããã°äœãã»ã©ããã§ãã MagicPod瀟ã®ãµããŒãã¯æåãã§ãããæ°æéã»ã©ã®æäœã§é垞䜿çšã«åé¡ãªãã»ã©ã®ã¬ãã«ã§ç¿çãã§ããããšã¯ãå°å
¥æã®ãšã£ããããšããŠéèŠã§ãã E2Eã®ãã¹ãèªååã¯ãããŠã¹ã®ããããã ãã§éæã§ããæä»£ãæ¢ã«å°æ¥ããŠãããããããã¬ãã«ã®QAã¹ã¿ããããããªãã«äœ¿çšããããšèªäœãã§ããŸãããèªç€Ÿã®éçºã¹ã¿ããã®ãµããŒããã»ãŒäžèŠãªã»ã©å
å°ã§æžãããšã¯ãQAãèªåŸçã«æŽ»åã§ããçµç¹ã«ãªãããã®å€§ããªæŽå©ãšãªããŸããã ã³ã¹ããè¯ã æ©èœãå¿
èŠåå以äžã§ããããšãç¶ç¶ããŠéçºãããŠããããšãåŸé課éå¶ã§ã¯ãªãããšãä»ãµãŒãã¹ãšæ¯èŒãå®äŸ¡ã§ããããšããªã©ç·åçã«å€æããã³ããŒããã¯ãããŠãåé¡ãªããšå€æã§ããŸããã åŸé課éå¶ã®å Žåãééçãªèšç®ãèªåãã¹ãã®äœæã宿œåæ°ãªã©æ°ã䜿ããªããã°ãããªãéšåãåºãŠããŸãã ãã¹ãåæ°ãžã®å¶éããªãMagicPodã®æéäœç³»ã¯ãQAãæãçæ³çãªãã¹ãåæ°ãå®çŸã§ããçºãééçãªæãããè§£ãæŸãããããšã¯MagicPodãæ¡çšãã倧ããªçç±ã®ã²ãšã€ãšãªããŸããã Android/iOSã¢ããªå¯Ÿå¿ 2022幎ã®å°å
¥åœæããããã€ãã£ãã¢ããªã®ãã¹ãèªååã«å¯Ÿå¿ããŠããããšãå°å
¥ã®æ±ºãæãšãªããŸããã ã³ã¹ãæããããããŠããããšãä»ãµãŒãã¹ãå©çšããå Žåã«ã¯1.5ã2åè¶
ã»ã©ã³ã¹ãããããå¯èœæ§ããã£ãããšãåŸæŒããšãªããŸããã ããããæã£ãŠãæ°ç€Ÿã®ãµãŒãã¹ãæ¯èŒãMagicPodã®ç¡æäœéšããå°å
¥ã決ããŠããŸãã æ©æµãããæå€ã«äŸ¿å©ã ã£ãæ©èœ ç»åå·®åæ¯èŒ MagicPodã§ã¯ããã£ããã£ããç»åãæåŸ
å€ãšããŠããã¹ãå®è¡æã«æ¯èŒãå·®åãæ€åº/éç¥ã§ããŸãã ã¹ã¿ã³ãã€ã§ã¯ããªãªãŒã¹ãµã€ã¯ã«ã®å
ŒãåãããQAãéããã«ABãã¹ãçã宿œããå¿
èŠããã£ãçºãæ¬çªç°å¢ãšæ€èšŒç°å¢ã§å®æçã«å®è¡ããŠãããMagicPodã¯å°å
¥æçŸ©ãé«ããããŸããã ãªãªãŒã¹åŸã®äžå
·åãæ€åºã§ãããåŠã以åã«ãç»åå·®åã§ABãã¹ãéšåã®å·®åãæããŠãããããšã§ãQAã絡ãŸãªããªãªãŒã¹å
容ãéçºâïžQAéã§ã®äºå/äºåŸã®æ
å ±å
±æ/確èªãäžèŠãšãªããŸããã çŸè¡ã®ãããã¯ããæ©æã«æ£ç¢ºã«ææ¡ã§ããããšããã€æ¬æ¥å¿
èŠãªã³ãã¥ãã±ãŒã·ã§ã³ãäžèŠãªãã®ãšããŠæè¯ããŠãããããšã¯ãQAäœæ¥ã®è² è·ã軜æžããŠããããšæããŸãã ã¡ãŒã«ãã§ã㯠å
¬åŒãµã€ãã§å€éšé£æºã®ã¡ãŒã«ãã§ãã¯ã®ææ³ã2皮玹ä»ãããŠããŸãããåŒç€Ÿã§ã¯Slackã®ãã£ã³ãã«çšã®ã¡ãŒã«ã¢ãã¬ã¹å®ã«ã¡ãŒã«ãéä¿¡ããŠããŸãã æ®æ®µäœ¿ãã®Slackã§ã¡ãŒã«ãç°¡æã«ç¢ºèªã§ããããšã¯ãã·ããªãªäœææã«ãããŠãå©äŸ¿æ§ãè¯ãã£ãã§ãã æ¥æ¬¡ã®æ€çŽ¢ãã¯ãªãã¯ãè¡ã ã¹ã¿ã³ãã€ã®ãµãŒãã¹ã§ã¯ãã¯ãªãã¯å±¥æŽãæ€çޢ履æŽããäœæãããããŒã¿ãããã®ã§ãããæ€èšŒç°å¢ã§ã¯éçº/QAã¹ã¿ãããã¡ã€ã³ã«è§Šã£ãŠããŸãã®ã§ãæäœå±¥æŽã®çµ¶å¯Ÿéãå°ãªã確èªãããã¿ã€ãã³ã°ã§ããŒã¿ããªãå ŽåããããŸããã 忥ãåœæ¥ã®äžæºåãå¿
èŠãšãªã£ãŠããã®ã§ãããMagicPodãæ¯æ¥ã決ãŸã£ãæéã«ã¢ã¯ã»ã¹ãã¯ãªãã¯ãé 匵ãã·ããªãªãäœæããããšã§ãã®ãããªäžæºåãäžèŠãšãªããä»®ã«åæ ãããªãçŸè±¡ãçºçããå Žåã«ãã©ã®ã¿ã€ãã³ã°ããçºçããã®ããé¡ãã§åå ãç¹å®ããããšã容æã«ãªããŸããã ã¡ãªããã»ãã¡ãªãããããã¡ãªããã倧ããåŒãåºã ã¹ã¿ã³ãã€ã§ã¯MagicPodã®èªåå®è¡ããæ¬çªãšæ€èšŒã®äž¡ç°å¢ã§3æéããšã«åããŠããŸãã åè¿°ã®ãä»ãŸã§QAã§å®æœã§ããŠããªãã£ãç¯å²ã®äœæ¥ãè¡ããããã«ãªãããšããšããŠå¯èœãªéãé »åºŠãé«ããŠããããã®ãšããã¹ãçµæç¢ºèªã«ãããã¿ã¹ã¯éã蚱容ã§ããç¯å²ã«åãããã©ã³ã¹ã®èœãšãæãšããŠé »åºŠã決ããŠããŸãã å¥éãæ°èŠå®è£
ã®ãã¹ãç°å¢ã§ãæåå®è¡ãè¡ãªã£ãŠãããä»ãŸã§ã¯ãã¹ãäŸé Œããšã«åºç¯ã§ã®ãªã°ã¬ãã·ã§ã³ãã¹ããE2Eãã¹ãã¯å®æœã§ããŠããŸããã§ããããMagicPodå°å
¥ã«ãããã¹ãã«ãã¬ããžãå¢å ããŸããã ã¹ã¿ã³ãã€QAãšããŠã¯ãã³ã¹ãã«ããããQAãè¡ããäœæ¥éã®æ¡å€§ãšã³ã¹ãã«ããåã®æéãä»äœæ¥ã«åœãŠãããšãäž»çŒã«çœ®ããŠããŸããã®ã§ãåœåã®ç®æšã¯æ©ã段éã§éæã§ããããšæããŸãã ãªãããã¡ãªãããšãããã¡ãªããã¯ãããŸããããå°å
¥æã®ãã¹ãã·ããªãªäœæã®ã¿ã¹ã¯éã¯å€§ããçºãç¹å¿ãªQAããŒã ã®ã¿ã¹ã¯è»œæžãç®æããŠå°å
¥ããã®ã«ãã¹ãã·ããªãªäœæãæ»ãå¯èœæ§ã¯èµ·ãããããšæããŸãããã¹ã¿ã³ãã€ã§ãå°å
¥çŽåŸã¯ãã®ç¶æ
ã«ãããŸããã QAããŒã ã®çœ®ãããŠããç¶æ³ãèæ
®ã«å
¥ããåæšãè¡ããã¹ãã·ããªãªäœæãåªå
ããããšã§æ°ã¶æã1幎åŸã«æ³åããŠããæªæ¥ãæã«å
¥ããããšãã§ãããšæããŸãã ãã¡ãªãããããã¡ãªããã享åã§ããæªæ¥ã«æã£ãŠãããŸã§ã®ããŒãããããæ£ããæããæ£ããå®è·µããããšãéèŠããšæããŸãã åçãããå°å
¥ã«åããŠæ°ãä»ããããš ã¹ã¿ã³ãã€QAã®MagicPodå°å
¥æã«è©Šè¡é¯èª€ã®äžãææ»ããçºçããç¹ã¯ä»¥äžãšãªããŸãã 端çã«ã¯ã誀ã£ãåæããå§ãŸããã¹ãäœæã¯ãã¡ã³ããã³ã¹æ§ã®æªãããç¡çšã®é·ç©ãšåããŠããŸãå¯èœæ§ãé«ãã§ãã E2Eã»ãªã°ã¬ãã·ã§ã³ã®ãã¹ãé
ç®ã¯äœãçŽãã¹ã éåžžããã¹ãé
ç®æ°ã¯æ©èœè¿œå ãšå
±ã«å³è©äžãããšãªãåæšéžæãå¿
èŠãšãªã£ãŠããŸããããã¹ãèªååã®å°å
¥ã«ããåºæ¬çã«æŽçããå¿
èŠæ§ã¯äœäžããŠãããŸãã MagicPodã®ã·ããªãªã¯ãã¹ãæé ãå€ããªããŸãã®ã§ãã©ã®ãããªãã¹ããè¡ãªã£ãŠãããã®ç¢ºèªã¯æéãèŠããŸãã®ã§ãå¥ç®¡çãããããã§ãã ãŸããæäœæ¥ã§ãã¹ãé
ç®ãåããéã«ã¯é äžåã§ã確èªã§ããã°åé¡ãªãã§ãããèªååãããã§ãã¯é ãšå®éã®ãã¹ãé
ç®ã®é çªã«éœéœ¬ãçºçããŠãããšå®è£
å
容ã远å /æ¹ä¿®ãããæã«ã¡ã³ããã³ã¹ãç
©éã«ãªããŸãã åŒç€Ÿã®å°å
¥æãçã¿ãŠããäœæ¥ã®æµããæèãããã¹ãé
ç®ã®å®æåºŠã®é«ããã¹ã ãŒãºãªãã¹ãã·ããªãªäœæãšä»¥åŸã®ã¡ã³ããã³ã¹ã³ã¹ãã®è»œæžã«ç¹ããããšããåœããåã®ããšãªãã匷ããäŒãããããšæããŸãã ãã¹ãã·ããªãªã¯å°åãã«ãã¹ã é·ããããã¹ãã·ããªãªã¯ããã¹ãçµæã®ç¢ºèªæã«ã©ã®æ©èœã§ã¢ã©ãŒããããŠããã倿ããã®ãæéã«ãªããŸãã å°åãããããã®ãåé¡ã§ãããåé·ãªãã¹ãã·ããªãªã¯ç¢ºèªãã¡ã³ããã³ã¹ãç
©éã«ãªãã®ã§ãæ©èœããšã«åºåã£ãŠé©åãªããªã¥ãŒã ã«åããŠäœæããããšãéèŠãšãªããŸãã ããããå®è·µããããšã§ãE2Eã»ãªã°ã¬ãã·ã§ã³ãã¹ãã®ç²ŸåºŠãåäžããMagicPodã®ã¡ã³ããã³ã¹æ§ãé«ãŸããŸãã å°å
¥ãæ©äŒã«ãå¯èœã§ããã°é
ç®ãèŠçŽãå·æ°ãããšè¯ãã§ãããã ç·æ¬ãããMagicPod MagicPodã§ã¯ãUIäžã®æäœãHTMLã®ç¢ºèªãå¯èœã§ãããŸãããCookieããããã¯ãŒã¯æ
å ±ã®æŽåæ§ç¢ºèªã¯è¡ãããšã¯ã§ããŸããã®ã§ããã®ç¢ºèªã¯å¥éèªååããå¿
èŠããããŸãã â metaã¿ã°ã®ç¢ºèªã¯ããŒã¿ãã¿ãŒã³ãçšããŠåããŒãžã§ç¢ºèª ãã®èªååã«éèŠããããã¯çœ®ããŠãããŠãã©ã®ãããªãã§ãã¯ãã©ã®ããã«ãã¹ãèªååãããåŠããæ£²ã¿åãããå¿
èŠæ§ããããŸãããMagicPodã®ç¢ºèªç¯å²ã¯åºç¯ã«åã³ãŸããããã®ããã³ã·ã£ã«ãæå€§éã«åŒãåºãããšã§QAã®äœæ¥ã¿ã¹ã¯ã®éçå€ã倧ããåŒãäžããŠããããµãŒãã¹ã ãšå®æããŠããŸãã é·å¹Žã«æž¡ãç¶ç¶ãããããã¯ãã®QAã§ã¯ããã¹ãèªååã®å°å
¥ã¯å¿
é ã«ãªã£ãŠãããšæããŸãããQAã®ã¿ã¹ã¯ãåŠäœã«è»œæžããŠããããšãã§ãããããããã¯ã«ããããã¿ã¹ã¯ä»¥äžã®ã¢ãŠãããããåŠäœã«åºãããšãã§ããããå°å
¥ã«å€±æããªãããã®èŠãšãªããŸãã 以äžããç°¡æãªããã¹ã¿ã³ãã€QAã®MagicPodå°å
¥ã®æŽå²ãšãªããŸãã é·æã§ãããªããæžãè¶³ããªãéšåããããŸããããä»ãåãé ãããããšãããããŸããã ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
ã¯ããã« ããã«ã¡ã¯ãã³ãŒãã¬ãŒãITã°ã«ãŒãã®è¥¿æ¬ã§ãã ã³ãŒãã¬ãŒãITã°ã«ãŒãã§ã¯ã瀟å¡ã®PCã®ç®¡çããåçš®ã©ã€ã»ã³ã¹ç®¡çãã¯ããã瀟å
ã§å©çšãããµãŒãã¹ã®å°å
¥ããµãŒãã¹éã®é£æºãªã©å¹
åºãæ¥åããããªã£ãŠããŸãã ãã®äžã§ä»åã¯ãã¿ã€ãã«ã«ãããããã«ãkickflowãšããã¯ãŒã¯ãããŒã·ã¹ãã ãšGoogleã¹ãã¬ããã·ãŒãã GoogleAppsScript ã§é£æºããã話ãã玹ä»ããããŸãã èæ¯ ã¹ã¿ã³ãã€ã§ã¯ã賌å
¥çšè°ãæ¯æãç³è«ã管çããããã®ã¯ãŒã¯ãããŒã·ã¹ãã ãšããŠkickflowãšãããµãŒãã¹ãå©çšããŠããŸãã https://kickflow.com/ kickflowã§äœæãããåçš®ãªã¯ãšã¹ãã¯ãã±ãããšããåäœã§ç®¡çããããã«ãã³ã³ãã¢ã®äžãæµããåºæ¥ç«ãŠã®ãã³ã®ããã«ãåéšçœ²ã®ãã§ãã¯ãããããªããå®äºãžãšé²ãã§ããããã¹ãŠã®ãã§ãã¯ã®å®äºåŸããªã¯ãšã¹ãã«å¿ããŠåéšçœ²ã§ç©åã®è³Œå
¥ããæ¯æãåŠçãªã©ã«é²ãã§ãããŸãã ããããã®ãã±ããã¯ãkickflowã®ãµã€ãäžã§1ã€ãã€ç¢ºèªãã§ããŸãããæ¥åãå¹ççã«é²ããäžã§ãå®äºãããã±ãããäžèЧã«ããŠGoogleã¹ãã¬ããã·ãŒããžã®æžãåºããããŠã»ãããšããèŠæãããã以åãŸã§ZapierãšããããŒã³ãŒãã§è€æ°ã®ãµãŒãã¹ã飿ºãããããšã®ã§ãããµãŒãã¹ãå©çšããkickflowã§å®äºãããã±ããã®ããŒã¿ãã¹ãã¬ããã·ãŒãã«æžã蟌ãã§ããŸããã Zapier | Automation that moves you forward äœã課é¡ã ã£ãã®ã Zapierã¯ããã°ã©ãã³ã°ã«é¢ããŠã®ç¥èããªããŠãåçš®ãµãŒãã¹ã飿ºãããããšãã§ãã䟿å©ãªãµãŒãã¹ãªã®ã§ããããã®é£æºã«ã€ããŠã¯ããã€ãã®åé¡ç¹ããããŸããã æžãèŸŒã¿æã«ãšã©ãŒãèµ·ãã£ãå Žåã察象ã®ãã±ããããŒã¿ã®åååŸã«æéããããã Zapierã¯åºæ¬çã«æå®ããã€ãã³ããããªã¬ãŒãšããŠåŠçãéå§ããŸããkickflowã§ãã±ãããæ¿èªããããšããã®ã¿ã€ãã³ã°ã§webhookãéä¿¡ããããèšå®ãããããããªã¬ãŒãšããŠZapierã§ã®åŠçãåäœãããŠããŸãããããããwebhookãåãåã£ãŠåŠçãå®è¡ããéã«ãšã©ãŒãçºçããå Žåã察象ã®ãã±ããã®åååŸã«æéãããããšããåé¡ããããŸããããã®ãããç¹å®ã®ãã±ããã«å¯ŸããŠä»»æã®ã¿ã€ãã³ã°ã§ããŒã¿ååŸãããŒã¿å å·¥ãè¡ããããã«ããå¿
èŠããããŸããã ããŒã¿ã®å å·¥ã®åé¡ Zapierã¯åºæ¬çã«ããŒã³ãŒããã©ãããã©ãŒã ã§ãããããŸããŸãªãµãŒãã¹ã®é£æºã匷åã«ãµããŒãããŸããããããkickflowã§çæãããJSON圢åŒã®ããŒã¿ãã¹ãã¬ããã·ãŒããžã®æžã蟌ã¿çšã«å å·¥ããéã«ã¯ãå€ãã®ã¹ããããèžãå¿
èŠããããŸããããŸããã¹ãã¬ããã·ãŒãã®ãã©ãŒãããã倿Žããããšããã®ã¡ã³ããã³ã¹ã«å€ãã®æéãããã£ãŠããŸããããã®ãããå€åããããŒãºã«æè»ã«å¯Ÿå¿ã§ãã飿ºæ¹æ³ã«å€æŽããå¿
èŠããããŸããã 䜿çšå¶éã®è¶
éïŒ æè©±ã§ããçŸåšã¯ã¢ããããŒãã«ãã解決ããŠããŸã ïŒ çŸåšã®kickflowã§ã¯webhookãéä¿¡ããã€ãã³ããä»»æã§éžã¹ãããã«ãªããŸãããã以åã¯å
šãŠã®ã€ãã³ãïŒå
šãŠã®ã¯ãŒã¯ãããŒã§äœæãããå
šãŠã®ãã±ããã®ã¹ããŒã¿ã¹å€æŽã察象ïŒã§webhookãéä¿¡ãããããçµæãšããŠå€§éã®åŠçãZapieräžã§è¡ãããããšã«ãªããŸãããããã«ãããå¥çŽããŠããæé䜿çšå¯èœãªåŠçåæ°ãè¶
ããŠããŸããäºæãã¬ã¿ã€ãã³ã°ã§åŠçã忢ããåé¡ãçºçããŸããã ãã®ãããªèª²é¡ã解決ããããã«Zapierã§ã®é£æºãèŠçŽãå¿
èŠããããŸããã GoogleAppsScriptã§é£æºããããã¡ãªãã ãã®ãããªèª²é¡ã解決ããããã«ã³ãŒãã§çްããåŠçãè¡ããGoogleAppsScriptïŒä»¥éGASãšè¡šèšïŒã§é£æºãããããšã«ããŸããã GASã䜿çšããã¡ãªãããšããŠã¯ä»¥äžã®ãããªãã®ããããŸãã GoogleWorkSpaceãå¥çŽããŠããå Žåç¡åã§å©çšã§ãã âè¶
éèŠ ç¬ç«ããå®è¡ç°å¢ãå¿
èŠãšããªããããéå°éå®¶ã«ãšã£ãŠæ¥åã§äœ¿çšããæ·å±
ãäœã GASã¯JavaScriptãããŒã¹ã«ãªã£ãŠãããããç§ã«ãšã£ãŠã³ãŒãã®èšè¿°ãé£ãããªãïŒéå»ã«å°ãã ãè§Šã£ãããšããããŸããïŒ ãã®ããã«GASã«ã¯å€ãã®ã¡ãªããããããŸãããå®è£
ãé²ããäžã§åæã«è§£æ¶ããªããã°ãããªã課é¡ãããã€ãèŠããŠããŸããã GASã§é£æºãé²ããäžã§èŠããŠããèª²é¡ ãããªãããªã§ãGASãçšããŠkickflowãšã¹ãã¬ããã·ãŒãã®é£æºãé²ããŠãã£ãã®ã§ãããããã€ãåé¡ããããŸããã ããŒã¿ãã©ã®ããã«ååŸããã kickflowã®webhookã¯ã¿ã€ã ã¢ãŠãã10ç§ã«èšå®ãããŠããããã®æéå
ã«ããŒã¿ã®å å·¥ãæ·»ä»ãã¡ã€ã«ã®ããŠã³ããŒããã¹ãã¬ããã·ãŒããžã®æžã蟌ã¿ãå®è¡ããã«ã¯æéãããããããŠããŸããšã©ãŒã«ãªã£ãŠããŸããŸãããã®ãããã©ã®ããã«kickflowããã¹ãã¬ããã·ãŒãã«æžã蟌ã察象ã®ãã±ããããŒã¿ãååŸããããåé¡ã«ãªããŸããã ã¯ãŒã¯ãããŒããšã«ç°ãªãé
åã®ã€ã³ããã¯ã¹ãã©ã®ããã«æå®ããã ããã¯Zapierã§ã®é£æºæããã®èª²é¡ãšéãªããŸãããkickflowã§äœæããã¯ãŒã¯ãããŒã«ã¯ãã«ã¹ã¿ã ãã£ãŒã«ãã®èšå®ãå¯èœã§ããã®å
¥åããŒã¿ã¯ãªããžã§ã¯ãã«é
åãšããŠä¿åãããŸãã Zapierã§é£æºããŠããæã¯ã"ticketData.inputs[10]" ã®ããã«ã¯ãŒã¯ãããŒããšã«é
åã®ã€ã³ããã¯ã¹ãæå®ãããŒã¿ãååŸããŠããŸããããããã§ã¯ã«ã¹ã¿ã ãã£ãŒã«ãã®é
ç®å€æŽããã£ãå Žåãã©ãã®ã€ã³ããã¯ã¹ã«ã©ã®ããŒã¿ãä¿åãããŠãããã®ç¢ºèªããè¡ãå¿
èŠãããã¡ã³ããã³ã¹ã³ã¹ããããããããã±ããããŒã¿ããä»»æã®ããŒã¿ã®ååŸæ¹æ³ãæ¹åããå¿
èŠããããŸããã æ¬¡ã®ç« ããå
·äœçã«ã©ã®ãããªæ¹æ³ãä»çµã¿ã§åé¡ãè§£æ¶ãã€ã€é£æºãé²ããŠãã£ãã説æããŸãã 課é¡è§£æ±ºãšGASã§ã®é£æºæ¹æ³ ããã§ã¯ããããå
è¿°ããZapierãGASã®èª²é¡ã«ã€ããŠã©ã®ããã«å¯Ÿå¿ãã飿ºããããªã£ããã解説ããŸãã ãŸããã¡ãã®èª²é¡ã«ã€ããŠãæ·»ä»ã®ããã°å
ã®'ç¬èªãã£ãã·ã¥ã·ã¹ãã ãäœæ'ã®æ¹æ³ãåèã«ããŸããã 課é¡1ïŒZapierïŒæžãèŸŒã¿æã«ãšã©ãŒãèµ·ãã£ãå Žåã察象ã®ãã±ããããŒã¿ã®åååŸã«æéããããã 課é¡1ïŒGASïŒããŒã¿ãã©ã®ããã«ååŸããã GoogleAppsScript(GAS)でのcacheあれこれ - 株式会社BEFOOL ブログ å®è£
æé 解説 â kickflowã®webhookã®èšå®ã§ãwebhookã®å¯Ÿè±¡ã¯ãŒã¯ãããŒãä»»æã®ãã®ãéžæããwebhookã®éä¿¡æ¡ä»¶ãã'ticket_completed' ã«èšå®ããŸãã ãã®èšå®ã«ããã¹ãã¬ããã·ãŒãã§ç®¡çãããã¯ãŒã¯ãããŒãšãæ€ç¥ãããã€ãã³ãã®çš®é¡ãéžæã§ããŸãã â¡æ¬¡ã«ãã¹ãã¬ããã·ãŒãã«webhookã§éä¿¡ããããå®äºãããã±ããã®ãã±ããçªå·ãšãã±ããã®UUIDïŒãã±ããããšã«çºè¡ããããŠããŒã¯ãªå€ïŒãã¹ãã¬ããã·ãŒãã«èšè¿°ããããã®é¢æ°ãäœæããŸãããã±ããã®UUIDã¯åŸã®åŠçã§äœ¿çšããŸã GASã§webhookãåãåãæ¹æ³ã«ã€ããŠã¯ä»¥äžã®èšäºãåèã«ããŸããã Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法 - Qiita äœæããã¹ã¯ãªãã const doPost = (e) => { const postData = e.postData.contents; const jsonData = JSON.parse(postData); // ãã±ããçªå·ãšUUIDãååŸ const ticketNumber = jsonData.data.ticket.ticketNumber; const ticketUuid = jsonData.data.ticket.id; //æžã蟌ã¿å
ã®ã·ãŒããååŸ const sheetId = PropertiesService.getScriptProperties().getProperty( 'SpreadsheetId' ) const spreadSheet = SpreadsheetApp.openById(sheetId).getSheetByName( 'å®äºæžã¿ãã±ãããªã¹ã' ); //ã¹ãã¬ããã·ãŒãã«æžã蟌㿠spreadSheet.appendRow( [ ticketNumber, ticketUuid ] ); } kickflowããwebhookã§éä¿¡ããããå®äºãããã±ããã®æ
å ±ã¯ç»åã®ããã«ã¹ãã¬ããã·ãŒãã«æžãåºãããŸãããã®åŠçã¯æ°ç§ã§çµäºããããwebhookã®ã¿ã€ã ã¢ãŠãã«é ãæ©ãŸããå¿
èŠããªããªããŸããã â¢ååŸãããã±ããã®UUIDãå¥ã®ã¹ã¯ãªããã§èªã¿èŸŒã¿ãkickflowã®APIãå©çšããŠãã±ããã®ããŒã¿ãååŸããã 䜿çšããAPIã®è©³çŽ°ïŒ kickflow REST API v1 ã¹ãã¬ããã·ãŒãããUUIDãèªã¿èŸŒãããã®ã³ãŒã //å®äºæžã¿ãã±ãããªã¹ããããã±ããã®UUIDãååŸ const sheetId = PropertiesService.getScriptProperties().getProperty( 'SpreadsheetId' ) const completedTicketsSheet = SpreadsheetApp.openById(sheetId).getSheetByName( 'å®äºæžã¿ãã±ãããªã¹ã' ); const lastRow_completedTicketsSheet = completedTicketsSheet.getLastRow(); const ticketIdList = lastRow_completedTicketsSheet > 1 ? completedTicketsSheet.getRange(2, 1, lastRow_completedTicketsSheet - 1, 2).getValues() : [] ; GASã§Kickflowã®APIãåŒã³åºãããã®ã³ãŒã //Kickflowã®APIãåŒã³åºããã±ããããŒã¿ãååŸããããã®é¢æ° function getKickflowTicket(id) { const apiUrl = `https://api.kickflow.com/v1/tickets/ ${id[1]} ` ; const apiKey = PropertiesService.getScriptProperties().getProperty( 'KickflowToken' ); const options = { 'method' : 'get' , 'headers' : { 'Authorization' : `Bearer ${apiKey} ` , 'Content-Type' : 'application/json' } } ; try { const response = UrlFetchApp.fetch(apiUrl, options); const result = JSON.parse(response.getContentText()); return result; } catch (e) { //ãšã©ãŒãã³ããªã³ã° const adminChannel = PropertiesService.getScriptProperties().getProperty( 'corporate-it_notifications' ); const message = `KickflowAPIã§ã®ãã±ããæ
å ±ååŸæã«ãšã©ãŒãçºçããŸããã \n ãã±ããçªå·: ${id[0]}\n Error: ${e} ` sendMessageToSlack(adminChannel, message); } } â£ååŸããããŒã¿ããå¿
èŠãªãã£ãŒã«ãã®ããŒã¿ãååŸããã¹ãã¬ããã·ãŒãã«æžã蟌ãçšã«å å·¥ãã ããã§ã¯ä»¥äžã®åé¡ã«å¯Ÿå¿ããããã«æ°ãããªããžã§ã¯ããšé¢æ°ãäœæããŸããã 課é¡2ïŒGASïŒã¯ãŒã¯ãããŒããšã«ç°ãªãé
åã®ã€ã³ããã¯ã¹ãã©ã®ããã«æå®ããã ã¯ãŒã¯ãããŒããšã«ããŒã¿ååŸçšã®keyPathãšåºåæã®Outputåããªããžã§ã¯ãã®é
åã§å®çŸ©ãã æšæºã§èšå®ãããŠããé
ç®ã«é¢ããŠã¯ç¹å®ã®keyãçšæãããŠãããããã¡ãã䜿çšããŸãã éå±€ãæ·±ããã®ã«ã€ããŠã¯éå±€ã®äžã®keyããé
åã§å®çŸ©ããŠããŸãã ã¯ãŒã¯ãããŒã«åãããŠè¿œå ããã«ã¹ã¿ã ãã£ãŒã«ãã«ã€ããŠã¯ãããããã£ãŒã«ãã³ãŒããå²ãåœãŠããããããã¡ãã䜿çšããŸãã // ããã¯è³Œè²·çšè°ã§äœ¿çšããŠãããã®ã®äžéšã§ã const keys_purchaseOrderRequest = [ { keyPath: [ "ticketNumber" ] , outputKey: "ticketNumber" } , { keyPath: [ "workflow" , "name" ] , outputKey: "applicationType" } , { keyPath: [ "title" ] , outputKey: "title" } , { keyPath: [ "authorTeam" , "fullName" ] , outputKey: "department" } , { keyPath: [ "author" , "fullName" ] , outputKey: "drafter" } , { formCode: "123456789" , outputKey: "contractStartDate" } , { formCode: "987654321" , outputKey: "contractEndDate" } , ] ããã§å®çŸ©ãããªããžã§ã¯ãã®é
åã以äžã®é¢æ°ã§äœ¿çšããããšã§ä»»æã®ããŒã¿ããã±ããããŒã¿ããæœåºããããšãã§ããŸãã åŒæ°ã®ticketDataã«ã¯kickflowã®APIã§ååŸãããã±ããããŒã¿ããkeysã«ã¯ã¯ãŒã¯ãããŒããšã«èšå®ããå
è¿°ã®ãªããžã§ã¯ãã®é
åãæž¡ãããŸãã ãã®é¢æ°ãéããŠä»»æã®ããŒã¿ãæå®ããkeyåã§åºåããããšãã§ããŸãã //KickflowAPIã§ååŸãããã±ããããŒã¿ããå¿
èŠãªããŒã¿ãæœåºãã颿° function extractData(ticketData, keys) { let extractedData = {} ; for ( let key of keys) { if ( 'formCode' in key) { // formField.codeã䜿ã£ãŠããŒã¿ãååŸããå Žå for ( let input of ticketData.inputs) { if (input.formField.code === key.formCode) { extractedData [ key.outputKey ] = input.value; break ; } } } else { // keyPathã䜿ã£ãŠããŒã¿ãååŸããå Žå extractedData [ key.outputKey ] = getValueByPath(ticketData, key.keyPath); } } return extractedData; } //ãã£ãŒã«ãã³ãŒããèšå®ãããŠããªãããŒã¿ã«ã€ããŠã¯keyPathã䜿çšããŠããŒã¿ã®ååŸãè¡ã function getValueByPath(obj, path) { return path.reduce((o, k) => (o || {} ) [ k ] , obj); } ãã®æé ã§ãã±ããã®ããŒã¿ãååŸããããšã§ãã¯ãŒã¯ãããŒã®ãã©ãŒãããã倿Žãããå Žåã§ãã倿Žããããã£ãŒã«ã以å€åœ±é¿ãåããããšãªãããŒã¿ã®ååŸãå¯èœã«ãªããŸããã ãããŠãGASã§ãã±ããããŒã¿ãã¹ãã¬ããã·ãŒããžã®æžã蟌ã¿çšã«å å·¥ããããšã§æ¯èŒçèªç±ã«ãªããžã§ã¯ããæäœã§ããããã«ãªããZapierã§ã®ããŒã¿å å·¥ã®åé¡ãã¯ãªã¢ãããŸããã 課é¡2ïŒZapierïŒããŒã¿ã®å å·¥ã®åé¡ æåŸã« ãããŸã§èªãã§ããã ããèª ã«ããããšãããããŸãã æ¬èšäºã§ã¯ãkickflowãšã¹ãã¬ããã·ãŒãã®é£æºã«ã€ããŠããŸããã®éçšã§å·¥å€«ããç¹ãªã©ã«ã€ããŠç޹ä»ããŸãããGASããµãŒãã¹ãæäŸããŠããAPIãæŽ»çšããããšã§ãã·ã¹ãã éã®æè»ãªé£æºãå¯èœãšãªãããšã宿ããã貎éãªçµéšãšãªããŸããã ä»åŸã¯ããããªãå¹çåã«åããŠãã·ã¹ãã ãå®éã«å©çšãã瀟å¡ãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãå¯ã«è¡ãã€ã€ã瀟å
ã®ã·ã¹ãã 飿ºãæé©åããŠããããšãç®æããŠããŸã
ã¯ããã« ã¯ãããŸããŠãããã³ããšã³ãéçºã°ã«ãŒãã«æå±ããŠãã岩é£ã§ãã ã¹ã¿ã³ãã€ ã®æéãŠãŒã¶ãŒæ°ã1000äžäººãçªç ŽããŸããïŒ(2023幎4ææ«) æ¬èšäºã§ã¯ãããªã¹ã¿ã³ãã€ã®ããã³ããšã³ãéçºã®ã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ã玹ä»ããŸãã ãªãã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ãäœãã®ã ã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ãäœæããŠéçšããã¡ãªããã¯ä»¥äžã§ãã ã³ãŒãã®å¯èªæ§ã®åäž ã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ãèŠå®ãããŒã å
šå¡ãã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ã«åºã¥ããŠéçºããããšã§ãã³ãŒãã®çµ±äžæ§ãä¿ãããã³ãŒãã®å¯èªæ§ãåäžããä¿å®æ§ãé«ãŸããŸãã ããŒã å
ã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ã®åæ»å ã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ãèŠå®ãããŠããå ŽåãããŒã å
ã§ã®ã³ãŒãã®æžãæ¹ã«ã€ããŠã®ã³ãã¥ãã±ãŒã·ã§ã³ãåæ»ã«ãªããŸããã³ãŒãã¬ãã¥ãŒãªã©ã§ã³ãŒãã®æžãæ¹ã«é¢ããŠè°è«ããéã«ãã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ãããŒã¹ã«ããŠè°è«ããããšã§ãè«ç¹ã®æŽçãä¿®æ£æ¹éã®åæã容æã«ãªããŸãã ãããžã§ã¯ãã®æ¡åŒµæ§ã®åäž ã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ãèŠå®ããããšã§ãã³ãŒãã®åå©çšæ§ãé«ãŸããŸãããŸããã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ã«åºã¥ããŠéçºããããšã§ãæ°ããªæ©èœã®è¿œå ãæ¢åæ©èœã®å€æŽãªã©ããããžã§ã¯ãã®æ¡åŒµæ§ãåäžãããããšãã§ããŸãã éçºç°å¢ Nuxt.js 2.15 Pinia 2.0 TypeScript 4.5 ESLint 7.32 Jest Storybook 2022幎11æã«Nuxt3ã®å®å®çããªãªãŒã¹ãããŸãããçŸåšããã³ããšã³ãéçºã°ã«ãŒãã§ã¯ãNuxt2ããNuxt3ãžã®ããŒãžã§ã³ã¢ãããéæé²ããŠããŸããå·çæç¹ã§ã¯ãŸã ããŒãžã§ã³ã¢ãããå®äºããŠããªããããNuxt2ã察象ãšããŸãã åºæ¬æ¹é åºæ¬çã«ã¯ Vue.jsãå®çŸ©ããŠããã¹ã¿ã€ã«ã¬ã€ã ã®åªå
床A ~ åªå
床CãŸã§ãå®ã ãã§ã«å®ããŠããªããã¡ã€ã«ã«é¢ããŠã¯å¿
é ãšããããªãã¡ã¯ã¿ãªã³ã°ã宿œããŠãã æ°èŠäœæãã¡ã€ã«ã«ãããŠã¯å
šãŠå®ãããš äŸå€çã«å®ããªããŠè¯ããã®ãããã®ã§ãããã¯åŸè¿°ãã ã¹ã¿ã³ãã€ã§ã¯ãæ¢åã®ãã¡ã€ã«ã«é¢ããŠã¯é©å®ãªãã¡ã¯ã¿ãªã³ã°ã宿œããŠããæ¹éã«ããŠãåŸã
ã«æ¹åããŠãããŸããã Vue.jsã¹ã¿ã€ã«ã¬ã€ãã®äžã§å®ããªãã«ãŒã« åäžã€ã³ã¹ã¿ã³ã¹ã®ã³ã³ããŒãã³ãå éåæããªãã®ã§ãTheããšãããã¬ãã£ãã¯ã¹ãä»ããªãããšã 蚱容ããŸã ã ãã³ãã¬ãŒãå
ã§ã®ã³ã³ããŒãã³ãåã®åœ¢åŒ ã±ããã±ãŒã¹(kebab-case)ã䜿ãããšã 蚱容ããŸãã ãã¹ã¿ã³ãã€ã§ã¯ãã¹ã«ã«ã±ãŒã¹(PascalCase)ã«çµ±äžããããšã§äžè²«æ§ãéèŠããŸããã ãã¡ã€ã«åœåèŠå .js .tsãã¡ã€ã«ã¯ã±ããã±ãŒã¹(kebab-case)ãçšãã .vueãã¡ã€ã«ã¯ãã¹ã«ã«ã±ãŒã¹(PascalCase)ãçšãã index.vueãerror.vueãdefault.vueã®ããã«Nuxt.jsã§ãã¡ã€ã«åãåºå®ã§æ©èœãæäŸãããŠããå Žåãé€ã composables/ãã£ã¬ã¯ããªã«é
眮ãããã¡ã€ã«ã¯ä»¥äžã®ã«ãŒã«ã«åŸã use-foo-bar.tsã®ããã«ãuse-ãããå§ãŸãããš ã±ããã±ãŒã¹(kebab-case)ãçšããããš æ©èœãæ³èµ·ã§ããååã«ããããš Storybookã¯{察象ã®ã³ã³ããŒãã³ãå}.stories.jsã«ãã ãã®èŸºã¯å¥œã¿ã®åé¡ã§ãããã¡ã¯ãã»ã¹ã¿ã³ããŒããç¡ãããã§ããã®ã§ãããŒã å
ã§è©±ãåã£ãŠæ±ºããŸããã Atomic Design AtomsãšMoleculesã®åºå¥ãã€ãããŸãšããŠPartsãšåŒã¶ Organismsã®ã³ã³ããŒãã³ãã¯XxxControlã®ããã«ãµãã£ãã¯ã¹ãControlã«ãã Templatesã¯Nuxt.jsã®layoutsãšã¿ãªã Pagesã¯Nuxt.jsã®pagesãšã¿ãªã Atomic Design ãšã¯ããŠã§ããã¶ã€ã³ã«ããããã¶ã€ã³ã·ã¹ãã ã®ææ³ã®1ã€ã§ãè€éãªUIãã¶ã€ã³ãç°¡åã«æ§ç¯ããããã®æ¹æ³è«ã§ãã Atoms(åå)ãMolecules(åå)ãOrganisms(ææ©äœãçåœäœ)ãTemplates(ãã³ãã¬ãŒã)ãPages(ããŒãž) ã®5ã€ã®æ§æèŠçŽ ãããªããŸãã Atomic Designã®å©ç¹ã¯ãåå©çšå¯èœã§ã¹ã±ãŒã©ãã«ãªUIã³ã³ããŒãã³ããäœæã§ããããšã§ããããã«ãããè€æ°ã®ããŒãžãã¢ããªã±ãŒã·ã§ã³ã§åãUIèŠçŽ ãç°¡åã«åå©çšã§ããããã«ãªããŸãã ãŸããå°ããªéšåãã倧ããªã³ã³ããŒãã³ããæ§ç¯ããããšã§ãä¿å®æ§ãé«ãæè»æ§ã®ãããã¶ã€ã³ã·ã¹ãã ãå®çŸã§ããŸãã äžè¬çã«ãã¢ãããã¯ãã¶ã€ã³ãé·æçã«éçšããŠããäžã§ãAtomsãMoleculesãOrganismsããããã®ã³ã³ããŒãã³ãã®å®çŸ©ãæç¢ºã«ããããšã¯éèŠã§ããããšãããŠããŸãã ããããéçšããŠã¿ããšããã«æ°ä»ãã®ã§ãããã³ã³ããŒãã³ãã®å®çŸ©ãæç¢ºã«ããã®ã¯ããªãé£ããã§ãã ãŸãããMoleculesããOrganismsãã®ãããªèãåã¿ãããªåèªã¯éŠŽæããŸããã ãã£ãŠã¹ã¿ã³ãã€ã§ã¯ããAtomsããšãMoleculesãã®åºå¥ãã€ãããŸãšããŠãPartsããšãããOrganismsããšããåŒç§°ã䜿ã£ãŠããŸããã Parts(Atoms, Molecules) components/parts/ã«çœ®ã ãã¡ã€ã«åã¯åå©çšæ§ãèæ
®ããŠç¹å®ã®ããžãã¯ãæ³èµ·ãããªãããšãæãŸãã åºæ¬çã«ã³ã³ããŒãã³ãèªèº«ã®marginãpositionãz-indexãæããªã(å©çšåŽã§ã»ãããã) åºæ¬çã«ã¹ãã/PCäž¡æ¹ã§å©çšã§ãã(ã¬ã¹ãã³ã·ã) PCå°çšã»ã¹ããå°çšã®ã³ã³ããŒãã³ããäœæããå Žåããã£ã¬ã¯ããªpc/ãsp/ãäœæããŠããã«é
眮ããã Partsã¯å
éšã§Partsã³ã³ããŒãã³ã以å€ã®å©çšäžå¯ð
ããžãã¹ããžãã¯ãæžããªã @clickã€ãã³ãã@focusã€ãã³ãã¯emitã§äžäœã«äŒãã(Controllerã§åŠçãã) ButtonãRadioãªã©ã®åºåºã³ã³ããŒãã³ãã®ãã¡ã€ã«åã¯ããªãã£ãã¯ã¹ã«Baseãã€ãã ç¶æ
ãæããªã(storeå©çšäžå¯ð
) APIã³ãŒã«äžå¯ð
Storybookãäœæããã¹ãŠã®propsãæäœã§ããããã«ãã ãããã¶ã€ããŒãCSS/HTMLã«çç·ŽããŠããå Žåããã¶ã€ããŒã«PartsãäœæããŠããããšåæ¥ãæããŸãã ããã§ãªãã£ããšããŠããå¿
ãPartsã®Storybookãäœæããã«ãŒã«ã«ããããšã§ãUIããŒãåäœã§ã®ç¢ºèªãå¯èœãšãªããŸããçµæããã¶ã€ããŒãšãšã³ãžãã¢ã®ææçéãã¹ã ãŒãºã«ãªããŸãã Controller(Organisms) components/ã«çœ®ã ãã¡ã€ã«åã¯XxxControl.vueã«ãã Xxxã®éšåã¯ããžãã¯ãæ³èµ·ãããããšãæãŸãã Partsããã®emitãåŠçãã ããžãã¹ããžãã¯ãæžã Composition APIã§æžã ã§ããã ãComposableã«ããžãã¯ãåãåºããŠãComposableã®åäœãã¹ããæžã ç¶æ
ãæã£ãŠãã(storeå©çšOKð) APIã³ãŒã«OKð Storybookã¯æžããªããŠãOK Templates layouts/ã«çœ®ãïŒNuxt.jsã®layoutsã®æ©èœãæäŸããïŒ ãã¡ã€ã«åã¯XxxLayouts.vueã«ãã ããžãã¹ããžãã¯ãæžããªã ç¶æ
ãæããªã(storeå©çšäžå¯ð
) APIã³ãŒã«äžå¯ð
Storybookã¯æžããªããŠãOK Pages pages/ã«çœ®ãïŒNuxt.jsã®pagesã®æ©èœãæäŸããïŒ ããžãã¹ããžãã¯ãæžã Composition APIã§æžã Composableã«ããžãã¯ãåãåºããŠãComposableã®åäœãã¹ããæžã ç¶æ
ãæã£ãŠãã(storeå©çšOKð) APIã³ãŒã«OKð Storybookã¯æžããªããŠãOK Composable Composableãšã¯ Vue.jsã®Composableãšã¯ãComposition APIã§æžãããåäžã®è²¬ä»»ãæã€é¢æ°ãããžãã¯ã®å¡ãæããŸãã ã¹ã¿ã³ãã€ã§ã¯composables/ãã£ã¬ã¯ããªãäœæããããžãã¯ãuse-logic-name.tsã®ããã«å¥ãã¡ã€ã«ã«åãåºããŠããŸãã äœè«ã§ãããNuxt3ã§ã¯composables/ãã£ã¬ã¯ããªå
ã®Composableã¯èªåimportãã <script setup> å
ã§å©çšã§ããŸãã Composableã«åãåºãããšã§ä»¥äžã®ã¡ãªããããããŸãã ã³ãŒãã®åå©çšæ§ã®åäž ã³ãŒããåå©çšã§ããŸããã³ã³ããŒãã³ãã§åãããžãã¯ãç¹°ãè¿ãæžãããšããªããªããã³ãŒãã®ä¿å®æ§ãæ¡åŒµæ§ãåäžããŸãããŸããéçºæéãççž®ã§ããŸãã ãã¹ãããããã³ãŒã ãã¹ãããããã³ãŒããäœæã§ããŸããããžãã¯ã®åäœãã¹ããè¡ãããããªããŸãã æè»ãªã³ãŒãæ§é ããžãã¯ãæ§é åã§ããŸããè€éãªããžãã¯ãåå²ã§ããã³ã³ããŒãã³ãå
ã®ããžãã¯ãè€éã«ãªãããšãé²ãããšãã§ããŸãããŸããã³ã³ããŒãã³ãã®æ©èœè¿œå ã倿Žã«å¯Ÿå¿ãããããªããŸãã Composableå®è£
ã¬ã€ã composables/ã«çœ®ã ãã¡ã€ã«åã¯use-logic-name.tsã®ããã«use-ããå§ãŸãããš Composableã¯Atomic Designã®PagesãšOrganismsã®ã¿ãå©çšå¯èœ ããžãã¯ãåå©çšå¯èœãªç¶æ
ã«ããŠComposition APIã§å®è£
ãã Composableã«åãåºããããžãã¯ã®åäœãã¹ããæžã åäžã®è²¬åã®åäœã§ãã¡ã€ã«ãåå²ãã Composableã®ãµã³ãã«ã³ãŒã 以äžã¯ãåçŽãªã«ãŠã³ãã¢ããããžãã¯ãå®è£
ããComposableã®äŸã§ãã import { ref } from "@nuxtjs/composition-api" ; export default function useCount() { const count = ref(0); const increment = () => { count.value++; } return { count, increment } ; } ãã®Composableã¯ãcountãšincrementãšãã2ã€ã®ããããã£ãè¿ããŸããcountã¯çŸåšã®ã«ãŠã³ããä¿æããrefãªããžã§ã¯ãã§ãããincrementã¯ã«ãŠã³ãã1ã€å¢ãã颿°ã§ãã ãã®Composableã䜿çšããå Žåã以äžã®ããã«åŒã³åºãããšãã§ããŸãã <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Count Up</button> </div> </template> <script> import { defineComponent } from "@nuxtjs/composition-api"; import useCount from './useCount'; export default defineComponent({ setup() { const { count, increment } = useCount(); return { count, increment }; } }); </script> ãã®Composableã®åäœãã¹ãã¯ä»¥äžã®ããã«æžããŸãã import { useCount } from './useCount' ; describe ( 'useCount' , () => { it ( 'increments count' , () => { const { count , increment } = useCount () expect ( count.value ) .toBe ( 0 ); increment (); expect ( count.value ) .toBe ( 1 ); } ); } ); ã³ã³ããŒãã³ãå®è£
ã¬ã€ã PrettierãESLintã§ã¯ãã§ãã¯ããããªããã³ã³ããŒãã³ãã®å®è£
ã«é¢ããã¬ã€ãã©ã€ã³ã§ãã HTMLå
ã§ <template v-if> ãå€çšããŠHTMLãå¶åŸ¡ããªã è€éãªè¡šç€ºæ¡ä»¶ã§ã¯computed()ã§æžããšã·ã³ãã«ã«ãªããäžã€ãã¹ããå¯èœã«ãªããŸãã <template v-if> ãçµã¿ç«ãŠãŠè¡šç€ºãå¶åŸ¡ããã®ã¯æ§ããŸãããã æªãäŸð
<template> <a> <template v-if="keyword">{{ keyword }}</template> <template v-if="keyword && location" > - </template> <template v-if="location">{{ location }}</template> </a> </template> è¯ãäŸð <template> <a>{{ condition }}</a> </template> <script lang="ts"> import { defineComponent } from "@nuxtjs/composition-api"; export default defineComponent({ setup() { const condition = computed(() => `${keyword}${keyword && location ? ' - ' : ''}${location}`) return { condition }; }, }); </script> v-htmlã䜿çšããŠHTMLãåã蟌ãŸãªã v-htmlã䜿çšãããšå
¥åãããHTMLããã®ãŸãŸåºåããããããXSSæ»æãåããå¯èœæ§ããããŸãããã®ãããåºæ¬çã«v-htmlã¯å©çšããŸããã å©çšããå Žåã¯ãHTMLãšããŠåã蟌ãæååã®å®å
šæ§ãæ
ä¿ãããããµãã¿ã€ãºããŸãã æªãäŸð
<template> <p v-html="htmlContent"></p> </template> <script> export default { data() { return { htmlContent: "ã<b>å¶æ¥ æªçµéš</b>ãã®ãããªæ¡ä»¶ã§ãæ€çŽ¢ã§ããŸãã" } } } </script> ã³ã³ããŒãã³ãã®name屿§ IDEãdevtoolsã®è£å©ãåããããã®ã§ãVueã³ã³ããŒãã³ãã®nameããããã£ãä»äžããŸãã è¯ãäŸð export default { name: "FooButton" } ã³ã³ããŒãã³ãã®emitã€ãã³ã ã«ã¹ã¿ã ã€ãã³ããemitãããéã®ã€ãã³ãåã¯ãã±ããã±ãŒã¹(kebab-case)ã«ããŸãã æªãäŸð
this.$emit("clickReset"); è¯ãäŸð this.$emit("click-reset"); this.$parentã¯äœ¿çšäžå¯ this.$parentã䜿ã£ãŠèŠªã«ã¢ã¯ã»ã¹ãããšåãšèŠªãå¯çµåããŠããŸãã®ã§NGã§ãã æªãäŸð
this.$parent.foo = 'bar'; Vue.filterã®äœ¿çšçŠæ¢ Vue.filterã¯Vue3ã§å»æ¢ãããã®ã§ãVue2ã®ãããžã§ã¯ãã§ãåºæ¥ãã ãVue.filterãå©çšããŸããã @clickãä»äžããŠããèŠçŽ divèŠçŽ ãspanèŠçŽ ã«@clickãä»äžããŠãããŒããŒãæäœæã«éžæã§ããªããããåºæ¬çã«@clickã¯buttonèŠçŽ ãšaèŠçŽ ã®ã¿ã«ä»äžããŸãã CSSå®è£
ã¬ã€ã ã³ã³ããŒãã³ãã® <style> ã«scopedãä»ãã Vue.jsã¯ããŒã«ã«ã¹ã¿ã€ã«ãšã°ããŒãã«ã¹ã¿ã€ã«ã®æ··åšãå¯èœã§ãããããŒã«ã«ã¹ã¿ã€ã«ã®ã¿ã«ããŸãã æªãäŸð
<style> /* ã°ããŒãã«ã¹ã¿ã€ã« */ </style> <style scoped> /* ããŒã«ã«ã¹ã¿ã€ã« */ </style> è¯ãäŸð <style lang="scss" scoped> .example { color: white; .dark { color: black; } } </style> ã»ã¬ã¯ã¿ã®ã«ãŒã« ããŒã¹ãšãªãã¹ã¿ã€ã«ä»¥å€ã§ã¯ãåºæ¬çã«ã¯Classã»ã¬ã¯ã¿ãçšãã idã»ã¬ã¯ã¿ã¯äœ¿çšããªãïŒè©³çŽ°åºŠãå¿
èŠä»¥äžã«äžããããïŒ èŠçŽ ã»ã¬ã¯ã¿ã¯äœ¿çšããªãïŒåœ±é¿ç¯å²ãèªã¿ã¥ãããªãããïŒ è©³çŽ°åºŠãäžããããªã Classã»ã¬ã¯ã¿ïŒæ®µéçšåºŠã®è©³çŽ°åºŠãäžéç®å®ãšããïŒABãã¹ãæã«äžæžããé¢åã«ãªãããïŒ ã»ã¬ã¯ã¿ã®æ°ãæžããã®ã¯ããã©ãŒãã³ã¹ã®èгç¹ãããæçš ã»ã¬ã¯ã¿å
ã§å€æ°ã¯çšããªã éè€ããèšè¿°ãé¿ãããããªã©ã®ã¡ãªããã¯ããããèšè¿°ãè€éã«ãªãã®ã§é¿ãã Classåã®ã«ãŒã« ã±ããã±ãŒã¹(kebab-case)ãçšãã åœåã¯çç¥ããªãïŒåé·ã§ã誰ãèŠãŠãåãããããããã«ããããïŒ æªãäŸð
ïŒ <div class="bkmrk"> è¯ãäŸðïŒ <div class="bookmark"> HTMLèŠçŽ ã«ååšããåœåãä»ã®èŠçŽ ã«äœ¿çšããªãïŒæ··ä¹±ãæãããïŒ æªãäŸð
ïŒ <div class="section"> ç¶æ
ã瀺ããã®ã¯ ãis-ããhas-ããªã©ãä»ãã æªãäŸð
ïŒselectedãerror è¯ãäŸðïŒis-selectedãhas-error Partsã®ã«ãŒãèŠçŽ ã«ã¯ parts-{ãã¡ã€ã«å}ã®Classåãä»ãã æªãäŸð
ïŒBaseButtonã³ã³ããŒãã³ãã®å Žå <div class="base-button"> è¯ãäŸðïŒBaseButtonã³ã³ããŒãã³ãã®å Žå <div class="parts-base-button"> 现ããèšè¿°ã«ãŒã« ã0ãã®åŸã®åäœã¯çç¥ãã æªãäŸð
ïŒ0px è¯ãäŸðïŒ0 ã«ã©ãŒã³ãŒããçç¥å¯èœãªæã¯çç¥ãã æªãäŸð
ïŒ#ffcc00 è¯ãäŸðïŒ#fc0 ã«ã©ãŒã³ãŒãã¯å°æåã«ãã æªãäŸð
ïŒ#FACB12 è¯ãäŸðïŒ#facb12 芪ããåã®ã¹ã¿ã€ã«ãäžæžãããªã CSSã®è©³çŽ°åºŠå©çšããŠã¹ã¿ã€ã«ãäžæžããã /deep/ã䜿ããªã importantã§ã¹ã¿ã€ã«ãäžæžãããªã pluginçã§å°å
¥ããOSSã®UIã«ã¹ã¿ã€ã«ãä»ããå Žåã¯ä»æ¹ãªãã®ã§OKð ãã ãå°æ¥çã«OSSã®ããŒãžã§ã³ã¢ããã«ãã£ãŠäžæžãããã¹ã¿ã€ã«ãæå³ããªããªããªãå¯èœæ§ãããã®ã§äžæžãã¯æšå¥šããªã TypeScriptå®è£
ã¬ã€ã enumã¯äœ¿çšããunionã§å®çŸ©ãã enumã¯JavaScriptãžã®ãã©ã³ã¹ãã€ã«ã®éã«ã峿å®è¡é¢æ°ãã«å€æãããã®ã§ãTree-shakingã§ããŸããã ãã®ãããenumã¯äœ¿çšããunionã§å®çŸ©ããŸãã const Color = { RED: "red" , BLUE: "blue" , GREEN: "green" , } as const ; type Color = typeof Color [ keyof typeof Color ] ; ESLintãšPrettier ESLint ãš Prettier ã¯ãã¯ã説æãããŸã§ããªããããã³ããšã³ãéçºã«ãããŠããã¡ã¯ãã¹ã¿ã³ããŒããšãªã£ãŠããŸãã Vue.jsã®ESLintãã©ã°ã€ã³( eslint-plugin-vue )ããTypeScriptã®ESLint/Prettier( typescript-eslint )ãå°å
¥ããŠèªåçã«ã³ãŒãã£ã³ã°èŠçŽããã§ãã¯ããŸãã eslintrc.jsã¯ä»¥äžãåºæ¬ãšããŠãrulesã§çްãã調æŽãããŠããŸããeslintrc.jsã®èª¿æŽãããŒã ã§è©±ãåã£ãŠåŸã
ã«èª¿æŽããã®ãè¯ãã§ãããã ãŸãããã¡ãã¡ãã«ãªã¯ãšã¹ãã§ææããã®ã¯é¢åãªã®ã§ãIDEã®èšå®ã§ESLintãPrettierã«ããæŽåœ¢ãèªåçã«ãããã¹ãã§ãã ã¹ã¿ã³ãã€ã§ã¯VS CodeãŠãŒã¶ãŒãšIntelliJ IDEAãŠãŒã¶ãŒãããŸããè€æ°ã®IDEã䜿ãããŠããå ŽåãããŒã å
ã§ããããã®IDEã®èšå®æ¹æ³ã確èªãããšè¯ãã§ãããã module.exports = { extends : [ "@nuxtjs/eslint-config-typescript" , "plugin:vue/essential" , "eslint:recommended" , "@vue/typescript/recommended" , "@vue/prettier" , "@vue/prettier/@typescript-eslint" , ] , rules: { // çç¥ } } éçšæ¹æ³ ãã«ãªã¯ãšã¹ãã®ãã³ãã¬ãŒãã«ãã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ã®ãªã³ã¯ã貌ã ãã«ãªã¯ãšã¹ãã®ã¬ãã¥ãŒèгç¹ã«ãã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ã«åŸã£ãŠããããå ãã ã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ãååšããŠããŠãéçšãããªãã£ããæå³ããããŸããã ãã«ãªã¯ãšã¹ãã®ãã³ãã¬ãŒãã工倫ãããããã«ãªã¯ãšã¹ãã®ã¬ãã¥ãŒã®ã¬ã€ãã©ã€ã³ãäœã£ãæ¹ãããã§ãããã æ
£ããŠãªãæã¯çްããææãæ²¢å±±ã§ãŠããå ŽåããããŸããã¬ãã¥ã¯ãŒã®æå³ãäŒããããããããããã¬ãã¥ãŒã³ã¡ã³ãã«ã¯ã©ãã«ãä»ããããšãæšå¥šããŠããŸãã [MUST] ïŒå¿
ã察å¿ããŠã»ãã [SHOULD] ïŒæéãããã°å¯Ÿå¿ããŠã»ãã [IMO] ïŒ èªåã ã£ãããããã [NITS] ïŒ å°ããªææç¹ãtypoãšã [Q] ïŒåãªã質å ãŸãšã æ¬èšäºã§ã¯ãã¹ã¿ã³ãã€ã§éçšããŠããã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ã®äžéšã玹ä»ããŸããã ãã¹ãŠãèŒããããŠããŸããããStorybookãJestã«ãå®è£
ã¬ã€ãããããŸãã æ¬èšäºãåèã«ãæ¯éã³ãŒãã£ã³ã°ã¬ã€ãã©ã€ã³ã®æŽåãšéçšãã¯ãããŠã¿ãŠãã ããã ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
ã¯ããã« åããŸããŠãæ ªåŒäŒç€Ÿã¹ã¿ã³ãã€ã®ãžã§ããµãŒãã¡ã€ã³ãšããããŒã ã§æ€çŽ¢ãšã³ãžã³åšãã®éçºã»æ¹åã«åãçµãã§ãã鿣ã§ãã æ€çŽ¢ãšã³ãžã³ã®æ¹åæœçã®äžç°ãšããŠã¯ãšãªãªãŒãã³ã³ããªãŒã·ã§ã³ã·ã¹ãã ã®ãªãã¬ã€ã¹ãè¡ããŸããã ãªãã¬ã€ã¹ã«åãçµãã èæ¯ãã¢ãŒããã¯ãã£ã工倫ããããšãªã©ãã玹ä»ããŠãããŸãã ã¯ãšãªãªãŒãã³ã³ããªãŒã·ã§ã³ãšã¯ ã¯ãšãªãªãŒãã³ã³ããªãŒã·ã§ã³ãšã¯ããŠãŒã¶ãŒã®å
¥åããå§ãŸãããŒã¯ãŒãããµãžã§ã¹ãããæ©èœã«ãªã£ãŠããŸãã 以äžã®äŸã§ã¯ããšã³ãžãããšããæååããå§ãŸãããŒã¯ãŒãããµãžã§ã¹ãããŠããŸãã 以éã§ã¯ã¯ãšãªãªãŒãã³ã³ããªãŒã·ã§ã³ã®ããšãQACïŒQuery Auto CompletionïŒãšç¥ããŸãã ã¹ã¿ã³ãã€ã«ãããQAC ã¹ã¿ã³ãã€ã§ã¯ãããŒã¯ãŒãæ€çŽ¢çªãšå€åå°æ€çŽ¢çªã®2ã€ã®æ€çŽ¢çªãååšããŠããŸãã ããŒã¯ãŒãæ€çŽ¢çªã§ã¯ã以äžã®ããã«æ€çŽ¢ããŒã¯ãŒãããµãžã§ã¹ãããŸãã å€åå°æ€çŽ¢çªã§ã¯ãäœæã»é§
ã®ã¿ããµãžã§ã¹ãããŸãã ãµãžã§ã¹ããããããŒã¯ãŒãã«éãããããã®ã®ãåŸè¿°ããã·ã¹ãã æ§æèªäœã«ã¯ç¹ã«å€§ããªéãã¯ãªãã®ã§ã åŸè¿°ããã·ã¹ãã æ§æçã®é
ç®ã§ã¯ããŒã¯ãŒãæ€çŽ¢çªãå€åå°æ€çŽ¢çªã®äž¡æ¹ã®è©±ãããŠãããã ãªãšæã£ãŠãããŠãã ããã QACã·ã¹ãã ãªãã¬ã€ã¹ã«åãçµãã èæ¯ ãŸãQACã·ã¹ãã ã®ãªãã¬ã€ã¹ã«åãçµãã èæ¯ããã§ãã 倧ãã以äžã®ãããªèª²é¡ããããŸããã æ§ç¯åœæã®ãšã³ãžãã¢ã瀟å
ã«æ®ã£ãŠããªã QACã·ã¹ãã ã«é¢ããããã¥ã¡ã³ãããªã QACã·ã¹ãã ã§å©çšããŠããããŒã¿ãããŒã«ã»ã©ã€ãã©ãªã®ããŒãžã§ã³ãæ§ç¯åœåã®ãŸãŸã«ãªã£ãŠãã QAC以å€ã®ããŒã¿ãåå±
ããŠããããã·ã¹ãã ã®åé¢ãã§ããŠããªã 以äžã®ããã«æãä»ããããªãç¶æ
ã§ãã æ¢åQACã·ã¹ãã ãæ¹ä¿®ããããããæ°ããäœæããªãã¬ã€ã¹ããæ¹ãå·¥æ°çã«ãå°ãªããšå€æãåãçµã¿å§ããŸããã çŸç¶ã®QACã·ã¹ãã ã®èª²é¡ çŸç¶ã®QACã·ã¹ãã æ§æã¯äžå³ã®ããã«ãªã£ãŠããŸããã ãµãžã§ã¹ãããããŒã¿ãå«ãã Elasticsearchã®ã³ã³ããã€ã¡ãŒãžãäœæãECSã«ãããã€ããããšã§QACãå®çŸããŠããŸãã ãã®ã¢ãŒããã¯ãã£ãšåè¿°ããèæ¯ã®è©³çŽ°èª²é¡ãåæãããšä»¥äžã®ãããªèª²é¡ããããŸããã  課é¡ç¹ 詳现 1 EMRã§åããã¹ã¯ãªãããã¡ã³ããããŠããªãã®ã§åããªã ããŒã¿å
ã®ãã°ã®ãã©ãŒããããEMRèªäœã®æŽæ°ããããŠããªãã®ã§EMRãåãããã«ãåãããªãç¶æ
2 èªååãããŠããªã ã€ã³ããã¯ã¹æŽæ°ãããããã€ãŸã§æåã§è¡ãå¿
èŠããã 3 Elasticsearchã®ããŒãžã§ã³ã2ç³» QACã·ã¹ãã éçºåœåã®Elasticsearchã®ããŒãžã§ã³ã®ãŸãŸã«ãªã£ãŠããã»ãã¥ãªãã£ãªã¹ã¯ãããéåžžã«å±éº 4 ããŒã¿æŽæ°ãã§ããç¶æ
ã§ã¯ãªãã®ã§ãææ°ã®æ€çŽ¢ããŒã¯ãŒãã«å¯Ÿå¿ã§ããŠããªã äŸãã°ãã³ãããšå
¥åããŠããµãžã§ã¹ãããŒã¯ãŒããäœã衚瀺ãããªã 5 ããŒã¿å
ãäžæ å€åå°ãµãžã§ã¹ãã®ããã«ã¯ãå
šåœã®äœæã»é§
ããŒã¿ãå¿
èŠã ãããããæŽæ°ãããŠããªãã®ã§åžçºæå䜵ãåç§°å€æŽã«è¿œåŸã§ããŠããªã 6 ãã°ãèœã¡ãŠããªã ãŠãŒã¶ãŒã®å
¥åããŒã¯ãŒããããã®ããŒã¯ãŒãã«å¯ŸããŠã©ã®ãããªãµãžã§ã¹ãããŒã¯ãŒããæ²åºãããçãåæããããã®ãã°ãèœã¡ãŠããªãã®ã§æ¹åæœçãåãããšãã§ããªã QACã®ã·ã¹ãã ã¢ãŒããã¯ã㣠äžè¿°ãã課é¡ãæ ¹æ¬çã«èŠçŽãããã«å
šã·ã¹ãã ã®æ§æãäžããèŠçŽããŸããã ãŸãæåã«åãçµãã ã®ã¯ãåºå¹¹ãšãªãæ€çŽ¢ãšã³ãžã³éšåã®æè¡éžå®ã§ãã QACã·ã¹ãã ãæ§ç¯ããäžã§ã®èŠä»¶ãšããŠä»¥äžã®ãããªèŠä»¶ããããŸããã ã¿ã€ã èŠä»¶ 詳现 ã·ã¹ãã èŠä»¶ ã·ã£ãŒãã£ã³ã°ã¯äžèŠã ããã¬ããªã±ãŒã·ã§ã³ãå¿
èŠ ã€ã³ããã¯ã¹ã®ããŒã¿éã¯å°ãªãïŒå€§äœ100MBã»ã©ïŒåæ£æ€çŽ¢ã¯äžèŠã ããè² è·åæ£ãèé害æ§ã®åäžãç®çãšããã¬ããªã±ãŒã·ã§ã³ãå¿
èŠãšãªã ã·ã¹ãã èŠä»¶ æå°éã®æ§æ æ€çŽ¢æ©èœãæå°éã§ãããQACãå®çŸããããã«å¿
èŠãªæ©èœãããããš ããžãã¹èŠä»¶ ãŠãŒã¶ãŒå
¥åããŒã¯ãŒããæ¥æ¬èªããªã»æŒ¢åãããŒãåã®ãããã«ã察å¿ãã äŸãã°ãããšãkããšããŒã¯ãŒãå
¥åããéã«ã¯ããæ±äº¬ããæ±æ¥ããªã©ããšãkãããå§ãŸãããŒã¯ãŒããæ²åºããã ããžãã¹èŠä»¶ è€åèªã«ãå¯Ÿå¿ ããšã³ãžãã¢ããµkããšããŒã¯ãŒããå
¥åããéã«ãããšã³ãžãã¢ã坿¥ãããšã³ãžãã¢ã坿¥ãé±äžããªã©ã®ããã«2ã€ä»¥äžã®ããŒã¯ãŒããæ²åºãããå¿
èŠããã ãããæ€çŽ¢ãšã³ãžã³ãšãã£ãŠãäžã«ã¯æ§ã
ãªæ€çŽ¢ãšã³ãžã³ãååšããŠããŸãã 瀟å
ã§ã¯ä»ã·ã¹ãã ã®æ€çŽ¢ãšã³ãžã³ãšããŠElasticsearchãå©çšããŠããå®çžŸããããŸãã ã§ãã®ã§ãäž»ã«Elasticsearchãšãã®å
éšã§å©çšãããŠããæ€çŽ¢ãšã³ãžã³ã©ã€ãã©ãªã§ããLuceneã®2ã€ã®åè£ãäžãããŸããã äžèšã®èŠä»¶ãæºããåæã§åæ€çŽ¢ãšã³ãžã³ã®ã¡ãªããã»ãã¡ãªããããŸãšãããšä»¥äžè¡šã®ããã«ãªããŸããã  ã¡ãªãã ãã¡ãªãã LuceneããŒã¹ ã»ææ°ã®Luceneã«æŽæ°ãããã ã»äžã€ã®æ©èœïŒQACïŒã«ç¹åããæ€çŽ¢ãšã³ãžã³ãæ§ç¯ã§ãã ã»ã·ã¹ãã æ§æãç°¡æœ ã»ããŒã¯ã³ãã£ã«ã¿ãã«ã¹ã¿ãã€ãºäœæã»å©çšå¯èœïŒããŒãå倿çã
ïŒ ã»ã¹ã±ãŒã«ã¢ãŠããã«ããïŒããŒã¿éãå¢ããéã«èªåã§ã¯ã©ã¹ã¿ãªã³ã°ãæ§ç¯ããå¿
èŠãããïŒ ã»APIå±€ãèªåã§äœæããå¿
èŠããã ElasticsearchããŒã¹ ã»æè»æ§ãããïŒèšå®ãªãã·ã§ã³ãè±å¯ã§ã«ã¹ã¿ãã€ãºããããïŒ ã»ããã¥ã¡ã³ããè±å¯ ã»ã¹ã±ãŒã«ã¢ãŠããããã ã»ããŒã¯ã³ãã£ã«ã¿ãã«ã¹ã¿ãã€ãºäœæã»å©çšïŒããŒãå倿çã
ïŒ ã»ææ°ã®Luceneã«ããã«å¯Ÿå¿ã§ããªãïŒElasticsearchã®ããŒãžã§ã³ã¢ãããåŸ
ã€å¿
èŠãããïŒ ã»å段ã®APIãµãŒããšElasticsearchã®ãµãŒã2å°æ§æã«ãªãã®ã§ããã³ã¹ããããã ã»QAC以å€ã®æ©èœãåããŠããã®ã§äœåãªæ©èœãååšãã ããŒã¯ã³ãã£ã«ã¿ãé§äœ¿ããã°ãããžãã¹èŠä»¶ãšããŠã¯LuceneããŒã¹ã§ãElasticsearchããŒã¹ã§ãæºããããšãå¯èœã ãšããããŸããã ã·ã¹ãã èŠä»¶ã®ä»¥äž2ç¹ã§LuceneããŒã¹ã®æ€çŽ¢ãšã³ãžã³ãæ§ç¯ããããšã«æ±ºå®ããŸããã ãã軜éãªæ§æïŒQACã«ç¹åããæ€çŽ¢ãšã³ãžã³ïŒ Elasticsearchãªã©ã®æ€çŽ¢ãšã³ãžã³åŽã®å¯Ÿå¿ãåŸ
ããã«ãææ°ã®LuceneãžæŽæ°ã§ãã 以äžã®æ±ºå®ãèžãŸããæçµçãªã·ã¹ãã ã¢ãŒããã¯ãã£ã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã INDEXã¯ãŒã¯ãããŒãšQAC-APIã®2ç®æã§Luceneãå©çšããŠããŸãã æ°ã·ã¹ãã ã¢ãŒããã¯ãã£ã®ã¡ãªãã æ€çŽ¢ãšã³ãžã³ã®ã³ã³ãã¥ãŒãã£ã³ã°ïŒä»¥äžãæ€çŽ¢ïŒãšã¹ãã¬ãŒãžïŒã€ã³ããã¯ã¹ïŒãåé¢ããã¢ãŒããã¯ãã£ã«ããŠããŸãã å
·äœçã«ã¯ ã€ã³ããã¯ã¹ãS3ã®ãããªã¹ãã¬ãŒãžã«æ ŒçŽ æ€çŽ¢æã«ã¯ãã®ã¹ãã¬ãŒãžã«æ ŒçŽãããã€ã³ããã¯ã¹ãããŠã³ããŒãããæ€çŽ¢ãèµ°ããã ãã®ãããªã¢ãŒããã¯ãã£ã«ããããšã«ãã£ãŠä»¥äžã®ããã€ãã®ã¡ãªãããèããããŸãã ã¡ãªãã 詳现 ã€ã³ãã¯ã·ã³ã°ã»æ€çŽ¢ã®ã¹ã«ãŒãããåäž CPUè² è·ã®é«ãã€ã³ãã¯ã·ã³ã°ãäžåºŠã ãè¡ãããã®ã§ãåé¢ããªããã®ãšæ¯èŒããŠã€ã³ãã¯ã·ã³ã°ã®ã¹ã«ãŒããããåäž ã€ã³ããã¯ã¹ã®ããŒãžã§ãã³ã°ãå¯èœ ã€ã³ãã¯ã·ã³ã°ããšã«ãäœæãããã€ã³ããã¯ã¹ãã¹ãã¬ãŒãžã«ã¢ããããŒãããã¿ã€ãã³ã°ã§ã€ã³ããã¯ã¹ã®ããŒãžã§ãã³ã°ãå¯èœ ãŸãã€ã³ããã¯ã¹ã®ããŒãžã§ã³ã倿Žããå¿
èŠãããå Žåãã€ã³ãã¯ã·ã³ã°ãæ€çŽ¢ã·ã¹ãã ã«åœ±é¿ãäžããããšãªãåãæ¿ããããšãå¯èœ ã¡ã³ããã³ã¹æ§ã®åäžã»ã¹ã±ãŒã©ããªãã£ã®åäž äž¡æ¹ã®ããã»ã¹ãç¬ç«ããŠã¹ã±ãŒã«ãããããšãã§ãã äŸãã°ãã€ã³ãã¯ã·ã³ã°ãè¡ãã·ã¹ãã ãã¢ããã°ã¬ãŒãããå Žåãæ€çŽ¢ã·ã¹ãã ã«ã¯åœ±é¿ã¯äžããªã æœçã®äžŠå宿œ ã©ã³ãã³ã°ããžãã¯å€æŽçã§ã€ã³ããã¯ã¹ã倿Žããå Žåãæ€çŽ¢ã·ã¹ãã ã«åœ±é¿ãäžããããšãªãã€ã³ãã¯ã·ã³ã°ãå®äºã§ããã®ã§ãããŸããŸãªæœçã®äžŠè¡çšŒåã容æã« ãã®æ€çŽ¢ãšã€ã³ãã¯ã·ã³ã°ãåé¢ããã¢ãŒããã¯ãã£ã®èãæ¹ã¯ãElasticsearchãAWS OpenSearchïŒElasticsearchããã©ãŒã¯ãããµãŒãã¹ïŒã§ãææ¡ãããŠããŸãã Elasticsearchå
¬åŒããã° AWS OpenSearchããã¥ã¡ã³ã ããããã®ã·ã¹ãã ã®è©³çް æ¬¡ã«æ€çŽ¢ãšã³ãžã³ä»¥å€ã®ã·ã¹ãã ã®è©³çްã説æããŸãã ã¯ãŒã¯ãããŒèªäœã¯ airflow ã§ç®¡çãããªã©ã極å管çããå·¥æ°ãåæžããããã«åºæ¬çã«ãããŒãžããªAWSãµãŒãã¹ãå©çšããã¢ãŒããã¯ãã£ã«ããŠããŸãã ETLã¯ãŒã¯ãã㌠以äžã®ãããªã·ã¹ãã æ§æã«ãªã£ãŠããŸãã ã¢ãŒããã¯ãã£å³å·Šç«¯ã®S3ã«æ ŒçŽãããŠãããªã¯ãšã¹ããã°ãå
ã«ãäžèšã«æããåŠçãETLã¯ãŒã¯ãããŒã§è¡ããŸãã èšå·ãªã©ã®æ€çŽ¢ã«çšããããŒã¯ãŒããšããŠã¯äžé©åãªããŒã¯ãŒããŸãã¯æåã®åé€ è¯ä¿å
¬åºã«åããNGããŒã¯ãŒãã®åé€ ã¿ã€ããšæãããããŒã¯ãŒãã®ãªã©ã€ã ãªã© å®éã«ãŠãŒã¶ãŒãå
¥åã»æ€çŽ¢ãããªã¯ãšã¹ããã°ãããšã«ãµãžã§ã¹ãããŒã¯ãŒããçæããã®ã§ãæ€çŽ¢çªã«é©åãªããŒã¯ãŒãã衚瀺ãããããã«åŠçãè¡ã£ãŠããŸãã INDEXã¯ãŒã¯ãã㌠以äžã®ãããªã·ã¹ãã æ§æã«ãªã£ãŠããŸãã äžè¿°ããETLãè¡ã£ãããŒã¿ãããLuceneã®ã€ã³ããã¯ã¹ãäœæããã¯ãŒã¯ãããŒã«ãªã£ãŠããŸãã ECSã®éšåã¯ä»ã«ãAWS GlueãAWS lambdaãšåè£ããã£ãã®ã§ãããã³ã¹ããå©çšãããLuceneã®ããŒãžã§ã³ãªã©æ§ã
ãªå¶çŽããã£ãã®ã§æ¯èŒçæè»ã«åçºããããå®è¡ã§ããAWS ECSã§æ§æããããšã«ããŠããŸãã Luceneã®ããŒã¯ã³ãã£ã«ã¿ãšèªåã®ããŒã¯ã³ãã£ã«ã¿ãé§äœ¿ããŠã®ã€ã³ããã¯ã¹æ§ç¯ããŸãã 詳现ã¯çããŸãããäŸãã°ãçè·åž«ããšããããŒã¯ãŒãã«å¯ŸããŠä»¥äžããã«edge-ngramåå²ã»ããŒãå倿ãªã©ã®åŠçãããã€ã³ããã¯ã¹ãæ§ç¯ããŠããŸãã original_text: çè·åž« suggest_text: ç çè· çè·åž« k ka kan kang kango kangos kangosh kangoshi ãã詳现ãç¥ãããæ¹ã¯ä»¥äžã®èšäºãåèã«ããŠãã ããã ã¹ã¿ã³ãã€ã¢ããã³ãã«ã¬ã³ããŒ2022åãã«æžããèšäº QAC-API 以äžã®ãããªäœ¿ãæ¹ãããŠããŸãã ãµãŒãèµ·åãšåæã«ãINDEXã¯ãŒã¯ãããŒã§äœæããLuceneã®ã€ã³ããã¯ã¹ãããŠã³ããŒããã ãŠãŒã¶ãŒã®æ€çŽ¢æååã«å¯ŸããŠãããŒãåæ€çŽ¢ããããã«Luceneã®ããŒã¯ã³ãã£ã«ã¿ãªã©ã掻çšããŠãã ãŠãŒã¶ãŒã®å
¥åæååã«å¯ŸããŠãLucene ã€ã³ããã¯ã¹ã«æ€çŽ¢ããããã ãã®éåžžã«èãæ§æã®API ã€ã³ããã¯ã¹ã®ãµã€ãºãå¹³åã§100MBã»ã©ãªã®ã§ãElasticsearchãªã©ã®ããã«ã·ã£ãŒãã£ã³ã°ãããäžå°ã®ãµãŒãã®ã¡ã¢ãªäžã«ä¹ããŠãã æ§èœ 99ããŒã»ã³ã¿ã€ã«ã§ã1.5msã»ã©ã®ã¬ã€ãã³ã·ã§ãµãžã§ã¹ãããŒã¯ãŒããè¿ããŠããŸãã ã€ã³ããã¯ã¹ã®ããŒã¿éã¯æ§QACã·ã¹ãã ãšæ¯ã¹ãŠå¢å ããŠããã®ã«ãé¢ããããæ§ã·ã¹ãã ã®15msãšæ¯ã¹ããš10åã»ã©æ©ããªã£ãŠããŸãã æ°æ§ã§å©çšããŠããããããã®æ€çŽ¢ãšã³ãžã³ã®ããŒãžã§ã³ä»¥äžã®ããã«ãªã£ãŠããŸãã æ§QACã·ã¹ãã ïŒElasticsearch 2.3.5 æ°QACã·ã¹ãã ïŒLucene 9.3.0 ããã©ãŒãã³ã¹ãäžãã£ãŠããçç±ãšããŠã¯ä»¥äžãèããããŸãã ãµãŒãã®CPUã³ã¢æ°ã2åã«ãªã£ã æ§ã·ã¹ãã ã§ã¯2vCPUã«å¯ŸããŠãæ°QACã·ã¹ãã ã§ã¯4vCPUã«å¢ããã ãµãŒãã«ã¯AWS ECSãå©çšããŠããããå©çšã§ããRAMãµã€ãºãšã®é¢ä¿ã§CPUã³ã¢æ°ã2åã«å¢ãããŠããçµç·¯ããã QACã ãã§äœ¿ãããããã«ãªãã®ã§ã·ã³ãã«ã«ãªã¯ãšã¹ãæ°ãæžã£ã æ§ã·ã¹ãã ã§ã¯ãQACã®çšé以å€ã§ãå©çšãããŠããã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ãQACã®çšéã ãã§äœ¿ããããã«ãªã£ã LuceneãçŽæ¥å©çšããããšã§ãã¬ã¹ãã³ã¹ãè¿ããŸã§ã®åŠçéãæžã£ã æ§ã·ã¹ãã ã§ã¯Elasticsearchã«ã«ã¹ã¿ã ãã©ã°ã€ã³ãçµã¿èŸŒãã§QACãå®çŸããŠããã®ã§ãåŠçã倿°èµ°ã£ãŠãã éçš äžèšã§èª¬æããŠãã ETLã»INDEXã¯ãŒã¯ãããŒãQAC-APIã®ãããã€å
šãŠãå
šèªåã§è¡ã£ãŠããã®ã§ãåºæ¬çã«éçšå·¥æ°ã¯ããããªãããã«ãªã£ãŠããŸãã ãŸãã€ã³ããã¯ã¹ã®æŽæ°é »åºŠã¯ä»¥äžè¡šã®ããã«ãªã£ãŠãããæ¯æ¥ææ°ã®QACãµãžã§ã¹ãããŒã¯ãŒãã衚瀺ã§ããããã«ãªããŸããã ã€ã³ããã¯ã¹æŽæ°é »åºŠ: ãã€ãªãŒ ã€ã³ããã¯ã¹ããŒã¿å
ïŒéå»1æ¥åã®ãã°ãã è©äŸ¡ æ°ã·ã¹ãã ãžã®ãªãã¬ã€ã¹å®æœã倿ããããããQACã®è³ªããšããµãŒãã¹å
šäœãžã®åœ±é¿ãã®2è»žã§æ§ã·ã¹ãã ãšã®æ¯èŒè©äŸ¡ãè¡ããŸããã QACã®è³ª QACã·ã¹ãã ã®å質ã¯ãã§ããã ããŠãŒã¶ãŒå
¥åã®æéãçããŠãæå³ããæ€çŽ¢ããŒã¯ãŒãã衚瀺ã§ããŠããããšããšèšãããšãã§ããŸãã ãããèšãæãããšã€ãŸãã ããŠãŒã¶ãŒã®æ€çŽ¢çªãžã®å
¥åæ°ãå°ãªãã衚瀺ãããQACãµãžã§ã¹ãããŒã¯ãŒãã®ã¯ãªãã¯ãå¢ããŠããããšã äžèšãæ§æããææšã以äžã®2ã€ã®ææšã«ãªã£ãŠããŸãã QACãµãžã§ã¹ãããŒã¯ãŒãã®ã¯ãªãã¯ç QACãµãžã§ã¹ãããŒã¯ãŒãã®ã«ãã¬ããž ãµãŒãã¹å
šäœãžã®åœ±é¿ QACã·ã¹ãã ã®è³ªã ãã§ã¯ãªããã¹ã¿ã³ãã€ã®ãµãŒãã¹å
šäœã«ãšã£ãŠã©ã圱é¿ãããã®ãã確èªããå¿
èŠããããŸãã ã¹ã¿ã³ãã€ã§ã¯äž»ã«æ±äººã¯ãªãã¯ãšå¿åãææšãšããŠè¿œã£ãŠããã®ã§ä»¥äž2ã€ã®ææšã確èªããŠããŸãã QACãµãžã§ã¹ãããŒã¯ãŒããã¯ãªãã¯ããåŸã®æ±äººç¥šã¯ãªãã¯ç QACãµãžã§ã¹ãããŒã¯ãŒããã¯ãªãã¯ããåŸã®æ±äººç¥šå¿åã¯ãªãã¯ç ä»åŸã®å±æ QACã·ã¹ãã ãå·æ°ããããšã§QACã®ãã°ãèœã¡ãããã«ãªããåæããããšãå¯èœã«ãªã£ãããšã§ãä»åŸã以äžã®ãããªæ¹åãèããããããã«ãªããŸããã ãŠãŒã¶ãŒããã®ãã£ãŒãããã¯ãã©ã³ãã³ã°ã«çµã¿èŸŒã ãŠãŒã¶ãŒå±æ§ã«ãã£ãŠè¡šç€ºããQACãµãžã§ã¹ãããŒã¯ãŒãã倿Žãã ã€ã³ããã¯ã¹ã®ããŒã¿éã倧ããããŠãããåºç¯å²ã®ãŠãŒã¶ãŒå
¥åã«å¯ŸããŠQACãµãžã§ã¹ãã§ããããã«ãã æåŸã« 以äžãQACã·ã¹ãã ãªãã¬ã€ã¹ã®æŠèŠãã玹ä»ããŸããã ä»åã®ãªãã¬ã€ã¹ã§ã¯ãElasticsearchãªã©ã®åäžã®ãœãããŠã§ã¢ã䜿ããã«ãAWSã®æ§ã
ãªã¯ã©ãŠããµãŒãã¹ãçµã¿åãããŠæ€çŽ¢ã·ã¹ãã ãæ§ç¯ããŸããã AWSã®æ§ã
ãªã¯ã©ãŠããµãŒãã¹ãçµã¿åãããŠæ€çŽ¢ã·ã¹ãã ãæ§ç¯ããããšã«ãã£ãŠã以äž4ç¹ããã®æ§æããšã£ãã¡ãªããããªãšèããŠããŸãã ããããåŠçãããããšã«ç¹åãããµãŒãã¹ãå©çšã§ããããã«äœãæ©èœã远å ãããæãªã©ã®ã«ã¹ã¿ã æ§ãé«ã äœãäžå
·åããã£ããšãã«ãããããã®ã¯ã©ãŠããµãŒãã¹äžã§è§£æ±ºããã ãã§çšŒåäžã®ã·ã¹ãã ã«åœ±é¿ãªã ãŸãã©ãã§äœãåå ã§äžå
·åãçºçããã®ãç¹å®ãããã ãããŒãžããµãŒãã¹ã®ãããéçšå·¥æ°ãå°ãã ãŸãå人çã«ã¯ãæ¢åã®OSSã®æ€çŽ¢ãµãŒããå©çšããã®ã§ã¯ãªãLuceneãçŽæ¥äœ¿ãããšã§ãæ€çŽ¢ãšã³ãžã³ãžããæ·±ãç¥èãšæè¡ã®ç¿åŸãã§ãè¯ãçµéšãã§ããŸããã åèæç® Elasticsearchå
¬åŒããã° AWS OpenSearchããã¥ã¡ã³ã airflowå
¬åŒããã¥ã¡ã³ã ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
ããã«ã¡ã¯ãDataPlatformã°ã«ãŒãã«æå±ããŠããå°æ± ã§ãã DataPlatformã°ã«ãŒãã§ã¯ã ãâãã°èšæž¬ãšéçšãæ¯ããããŒã¿åºç€æ§ç¯ïŒããŒã¿åºç€æŽåïŒ ãâå¿
èŠãªããŒã¿æœåºåã³ã¢ãã¿ãªã³ã°ç°å¢ã®æŽåïŒããŒã¿åæç°å¢æŽåïŒ ãâ課é¡è§£æ±ºã«ãããããŒã¿æŽ»çšã®æ¯æŽïŒããŒã¿æŽ»çšãœãªã¥ãŒã·ã§ã³ïŒ ã®3ã€ãæ±ã«ãããŒã¿ã®åã§ã¹ã¿ã³ãã€ã®æé·ãæ¯ããŠããŸããïŒçžã®äžã®åæã¡ïŒ ä»åã¯ã2022幎4æã«ãªãªãŒã¹ããç°¡æçµ±èšã¢ãžã¥ãŒã«ã®äžã§ å°åå¥çµŠäžã³ã³ãã³ãã«ãããçµ±èšå€ãããŠãŒã¶ãŒã®èæèŠã«å¯ŸããŠé«ããã ãšããäºè±¡ã«å¯Ÿãããã®è§£æ±ºãŸã§ã®åãçµã¿ãã玹ä»èŽããŸãã ç°¡æçµ±èšã¢ãžã¥ãŒã«ãšã¯ スタンバイ ã«ãããŠã æ±è·è
ã«èªåãåãããå Žæã®çµŠäžã®ç¶æ³ã«ã€ããŠã® åèæ
å ±ãæäŸããã³ã³ãã³ãã§ãã ä»åæ¹ä¿®å¯Ÿè±¡ãšãªã£ãå°åå¥çµŠäžã³ã³ãã³ããšã¯ã ãšãªã¢ããšã®çµŠäžæ
å ±ã以äžã®ããã«ãŸãšããã³ã³ãã³ãã§ãã äºã®çºç«¯ 2022幎ãå€ãçµããã«å·®ãæãã£ãããæ¥ 1ã€ã®æèŠãåœã³ã³ãã³ãéçºããŒã ã®å
ã«å¯ããããã ã絊äžã³ã³ãã³ãã®ãå¯å±±çã®æ£ç€Ÿå¡å¹Žåã500äžè¿ãã®ã¯é«ããããããïŒã 瀟äŒäººçµéšãé·ããããå¯å±±çåºèº«ã®ç€Ÿå¡ããã ã£ãã 確ãã«ãæ¥æ¬å
šäœã§ã®å¹³å絊äžã436äžåïŒåèïŒä»€åå
å¹Žå æ°éçµŠäž å®æ
çµ±èšèª¿æ»ïŒãªã®ã§ã èªç€Ÿæ±äººããŒã¿ãå
ã«éèšããŠããæ£ç€Ÿå¡ã®å¹Žåãšã¯ããã å°æ¹éœåžã«ããŠã¯é«ãããæã¯åŠããªãã ïŒå¯å±±çã®çæ§ããããªããïŒ ãŸããåå°åã§å
±éã®éèšæ¹æ³ãçšããŠãã以äžã å¯å±±ç以å€ã®å°åã§ãåæ§ã®äºè±¡ãçºçããŠãããšããã°ã ã¹ã¿ã³ãã€ã¯ãŠãŒã¶ãŒã«å®æ
ãšããé¢ããæ
å ±ãäŒããŠããããšã«ãªãã ããã®ãŸãŸã§ã¯ãã¹ã¿ã³ãã€ã®æ
å ±ã®ä¿¡é Œæ§ãæãªãããã ãããã屿©æã®äžã察çã®æ€èšãå§ãŸã£ãã 解決ãŸã§ã®ã話 解決ã«è³ããŸã§è°è«ãéãæ¬¡ã®ãããªããã»ã¹ã§é²ããã ã1. çŸç¶ã®éèšæ¹æ³ã®ç¢ºèª ã2. åé¡ç®æã®ç¹å® ã3. æ¹åæ¡ã®æ€èš ã4. æ°å€è©äŸ¡ ãŸããçŸç¶ã®éèšïŒåå°åããšã®äžå€®å€ãç®åºããïŒãšããããžãã¯ã確èªããã Group Byã§å°åå¥ã«äžå€®å€ãç®åºããããšããéèšããžãã¯ã§ããç¹ã«åé¡ã¯èŠåœãããªãã£ãã éèšæ¯éå£ãæŒããŠããã®ã§ã¯çæ§ã
ãªã¢ãããŒãã詊ã¿ãããã解決ã«è³ããæéã ããéãå»ã£ãã åæ»æã«æ¯é
ããããã£ãŠããããæ¥ãã¡ã³ããŒã®äžäººãã€ã¶ãããã ãèæã£ãŠãªããããïŒã æã
ãåãçŽãããã«ååãªäžèšã ã£ãã ãã®äžèšããã£ããã«ãæã
ã¯ãèæåœ¢æãã«ã€ããŠã®èå¯ããåã¹ã¿ãŒããåã£ãã 2022幎ãç§ãæ·±ãŸãããšããææã®ããšã ã£ãã ããæºæµãžããèæåœ¢æã®ããã»ã¹èå¯ãšæé©ãªéèšå¯Ÿè±¡ã®æ€èšã æ®å¿µãªããæã
ã®åšèŸºã«ã¯ããèæãã«ã€ããŠåŠè¡çã«ç²Ÿéãã人éã¯ããªãã æããããã®åéã®æç®ãèªãã§ãæããæéãªãã®åç©«ã¯é£ããã ããã ããã§æ£æ»æ³ã§ã®ã¢ãããŒãã諊ããèªèº«ã®çµéšãåºã«å€§èã«ä»¥äžã®ãããªä»®èª¬ãæã¡ç«ãŠãŠã¿ãã ãæ¥ã
èŠèãããå€ãåºã«èªèº«ã®äžã«çµ±èšããã·ã¥ããŒããæ§ç¯ããããããèæãšããŠå®çããã ã ãã®ä»®èª¬ãåºã«éèšå¯Ÿè±¡ãšããŠæé©ãªå€ã¯äœããæ€èšãã ããã§ã¯ ãæ¥ã
èŠèãããå€ãšã¯æãé »åºŠã®é«ãå€ãããªãã¡æé »å€ã ãšèããäºãšããã ãããŸã§ã§ãéèšã®æµããæ¬¡ã®ããã«æ±ºãŸã£ãã ã1. åæ±äººã®çµŠäžã®æé »å€ãæ±ããã ã2. ãã®å€ãããšã«ãåå°åã®äžå€®å€ãéèšããã ã ããããã§ãŸã1ã€æ°ããªåé¡ã«ã¶ã€ãã£ãã æé »å€ãæ±ããã«ã¯ååžã®æ
å ±ãå¿
èŠã«ãªãããã¹ã¿ã³ãã€ãä¿æããŠããåæ±äººã®çµŠäžããŒã¿ã¯æå€§å€ãšæå°å€ãããªã ïŒãã®ã©ã¡ããã®ã¿ã®å ŽåãããïŒã åã³ãã¡ã³ããŒã®èŠæ©ã®æ¥ã
ãå§ãŸã£ãã ãããŠè§£æ±ºãž ãå¯Ÿæ°æ£èŠååžãšæå°€æšå®æ³ã ãããããã°ãæåŸã®ååžã¯ã©ã®ãããªåœ¢ç¶ã«ãªãã®ãïŒã ãã®ãããªçåãæ±ããåçåŽåçãå
¬éããŠãã 所得の分布状況 ãçºã æ¬¡ã®æ°ã¥ããåŸãã ãæé »å€ãäžå€®å€ããã ãã¶å·Šã ãããšãäœãæ¹ã«äžå®é床ã¯ãããã©ãé«ãæ¹ã«æç¢ºãªé床ããªãããããå¯Ÿæ°æ£èŠååžãããªããïŒ ã çµ±èšåŠã«é¢ããæžç±ã«ããå¯Ÿæ°æ£èŠååžã®äºäŸãšããŠå¹ŽéæåŸãæããããŠããã æŽã«å¯Ÿæ°æ£èŠååžã¯æ£èŠååžåæ§ã«åçæ§ãæããã®ã§ãåè¿°ã®åçåŽåçãå
¬éããŠããçµ±èšã®åºãšãªã åäŒæ¥å
ã®çµŠäžååžããŸãå¯Ÿæ°æ£èŠååžãšèããããã ããããåºã«ã以äžã®ä»®èª¬ãç«ãŠãã ãåæ±äººã®å任絊ã®ååžããŸãå¯Ÿæ°æ£èŠååžã«è¿äŒŒã§ããã ããã§å床ãåæ±äººã®çµŠäžã®ç®åºæ¹æ³ã確èªããæãæ£èŠååžãåæãšããæé »å€ã®ç®åºæ¹æ³ãšãªã£ãŠããã å¯Ÿæ°æ£èŠååžã®æé »å€ã«ä¿®æ£ããã°ãéèšå€ã®æ¹åãèŠèŸŒãŸãããåé¡ã¯ã確çå¯åºŠé¢æ°ãæ±ããæ¹æ³ã ã å¯Ÿæ°æ£èŠååžã®ç¢ºçå¯åºŠé¢æ°ã®åŒã¯ä»¥äžã®éãã ããªãã¡ãæšæ¬åæ£ïŒÏã®2ä¹ïŒãšæšæ¬å¹³åÎŒã®æšå®éãåºããã°ç¢ºçå¯åºŠé¢æ°ã®å°åºã¯OKã ã æšå®éã®å°åºæ¹æ³ãšããŠã¯ãæªç¥æ°ã颿°ã®åŒã®è¡šã«åºãŠããäºãš 埮åèšç®ïŒå°é¢æ°ã®å°åºïŒãé£ãããªãäºããã æå°€æšå®æ³ ã䜿ãããã ã æçµçã«ãåæ±äººã®çµŠäžã®ç®åºåŒã¯ã以äžã®ããã«ãªã£ãã æŽã«ã絊äžã®æå€§å€ãæå°å€ã®ããããããèšå®ãããŠããªãæ±äººã«ã€ããŠã¯éèšå¯Ÿè±¡ããå€ãçã® éèšå¯Ÿè±¡ã®èª¿æŽãå ããŠãæ¹ä¿®ãå®äºããã çµæ åæ±äººã®çµŠäžã®ç®åºæ³ã®ä¿®æ£ã«å ãã ããã§ã¯ãæ€èšŒçµæã®äžéšã玹ä»ããã éœéåºç æ¹ä¿®åäžå€®å€ æ¹ä¿®åŸäžå€®å€ ãïŒåèïŒæ¿åºçµ±èš å¯å±±ç 4,500,000 2,983,194 2,879,000 çŠå³¶ç 4,750,000 2,965,504 2,965,504 ãã®äžéšã«éãããå
šè¬çã«äžå€®å€ãæ¹ä¿®åãšæ¯ã¹ãŠçŸå®çãªå€ã«è¿ã¥ãäºã確èªããã æ¬æ¹ä¿®ã«ãã£ãŠãæèŠãšå€§ããã¯ãããªãçµ±èšå€ãæäŸåºæ¥ãããã«ãªã£ãã è©³çŽ°ã¯æ¯éãå®éã«ã¹ã¿ã³ãã€ã§åããããšãªã¢ãå
¥åãã æ€çŽ¢åŸè¡šç€ºãããæ±äººäžèЧããŒãžã®æäžéšã«è¡šç€ºãããæ¬ã³ã³ãã³ãããã®ç®ã§èŠãŠããã ãããã æåŸã« æ¬æ¡ä»¶ã®é£ãã㯠æèŠçãªå
容ãèšç®æ©ã§æ±ãã圢ã«èœãšã蟌ãäº ã«å°œããã çµ±èšã¯äººéã®èª€ã£ãæèŠãæã蟌ã¿ãæé€ããŠç©äºã倿ããããã«äœ¿ãå Žåããããã ä»åã¯ã人éã®æèŠå€ãæ£ãšããŠæèŠçãªå
å®¹ãæ°åŒã§è¡šçŸãã èšç®æ©ã§æ±ãã圢ã«èœãšã蟌ããšããã¢ãããŒããåã£ãã ä»åæ±ãå€ã«ã€ããŠã¯ãããçšåºŠå¹Žéœ¢ãéããæ¹ã®æèŠå€ãæ£ããããã«æãããããã ã ãŸãã䜿ããããŒã¿ã®éãå°ãªãã£ãäºãé¢é£ã®å°éç¥èãäžè¶³ããŠããäºã解決ãå°é£ã«ããã ãã®ç¹ã«ã€ããŠã¯ãä»ãããã®ãæåŒ·ã®æŠåšããšéãçŽã仮説æèã§ä¹ãåã£ãã ä»åŸããäººã®æèŠã«å¯ãæ·»ãçµ±èšãšè£æ£ããçµ±èšãäžæã«äœ¿ãåã倧èãªä»®èª¬ãããšã« å¿
èŠã§ããã°ä»ã®æ°åŠåéã®ç¥èŠãæŽã«ç€ŸäŒç§åŠãå¿çåŠãšãã£ãä»ã®åŠååéã®ç¥èŠã掻çšã㊠ããŒã¿ã«ææãäžãããŠãŒã¶ãŒã«ãã䟡å€ã®ããæ
å ±ãæäŸããŠããããã è£è¶³ ããã§ã¯ã¹ããŒãªãŒäžã«ç»å Žããçµ±èšçšèªã«ã€ããŠç°¡åã«è§£èª¬ããã æ£èŠååžãšå¯Ÿæ°æ£èŠååž ãŸãæ£èŠååžã«ã€ããŠç°¡åã«èª¬æããã ãã®ååžã¯èªç¶çã瀟äŒçŸè±¡ã®å€ãã§çŸãã確çååžã§ããã å¹³åå€ÎŒãäžå¿ãšãªããæšæºåå·®Ïãåºããã®åºŠåãã衚ãã å°ã確çå¯åºŠé¢æ°ãšã°ã©ãã¯ä»¥äžã®ããã«ãªãã æ¬¡ã«å¯Ÿæ°æ£èŠååžã«ã€ããŠèª¬æããã ãã®ååžã¯ãæ£èŠååžã«åŸãã©ã³ãã ãªå€æ°ã®å¯Ÿæ°ãåŸãååžã§ã ç¹åŸŽã¯æ£ã®å€ãåãããšãšæªã¿ãããååžã§ãã æ¬èšäºã§æ±ã£ãããã«çµæžåŠã®åéã§åå
¥ååžã衚ãã®ã«çšããããä» éèåéãçæ
åŠãå»çåéãªã©ã§äœ¿çšãããäŸãã°ãçµæžæé·çãçç©çš®ã®äœãµã€ãºååžãªã©ã衚ãã®ã«äœ¿çšãããã å°ã確çå¯åºŠé¢æ°ãšã°ã©ãã¯ä»¥äžã®ããã«ãªãã ã æåŸã«ãæ£èŠååžãšå¯Ÿæ°æ£èŠååžã®äœ¿ãåãã«ã€ããŠèª¬æããã äžã®äžã«ã¯ã å¹³åå€ããã®ãã€ã¢ã¹ïŒãºã¬ïŒãåã®åœ¢ã§ãããäºè±¡ãšç©ã®åœ¢ã§ãããäºè±¡ ãååšãããããã®äºè±¡ã«å¯ŸããŠå€§ãŸãã«ä»¥äžã®ãããªäœ¿ãåããšãªãã ãâå¹³åå€ããã®ãã€ã¢ã¹ããåã®åœ¢ã§ãããå Žå(x=ÎŒ+Σε)ïŒæ£èŠååž ãâå¹³åå€ããã®ãã€ã¢ã¹ããç©ã®åœ¢ã§ãããå Žå(x=ÎŒÃΠε)ïŒå¯Ÿæ°æ£èŠååž ãŸããå¹³åå€ã«å¯ŸããŠãã€ã¢ã¹ãåã®åœ¢ã§ãããäºè±¡ã®äŸãšããŠ å·¥å Žã®ã©ã€ã³ã§è£œé ããã補å寞æ³ã«ã€ããŠèããã ããã¯ãèšèšã®çãå€ïŒ=å¹³åå€ïŒã«å¯Ÿãå å·¥ã«äŒŽã誀差ãåã®åœ¢ã§ãããã±ãŒã¹ã®äŸã§ãã 補å寞æ³ã®ååžã¯æ£èŠååžããããããããã 補é ã®çŸå Žã§ã¯ãããã©ã€ã³ãã©ãã ãæ±ºããããèŠæ Œå
ã§è£œé åºæ¥ãŠãããã å³ãææšãšããŠå·¥çšèœåææ°ïŒ(èŠæ Œäžé - èŠæ Œäžé) / 6Ã補å寞æ³ã®æšæºåå·®ïŒã çšãããããã¯è£œå寞æ³ã®ååžãæ£èŠååžã§ããããšãåæãšããææšã§ãã ãã1ã€ã®äŸãšããŠå¹³åå€ã«å¯ŸããŠãã€ã¢ã¹ãç©ã®åœ¢ã§ãããäºè±¡ãèããã ãã®å ŽåãçããŒã¿ã§ååžãæããšæ£èŠååžãšæ¯ã¹ãŠå³ã«è£Ÿéã®åºãååžãšãªãã ä»åæ±ã£ã幎åã¯ãããåºæºå€ã«å¯ŸããŠåè·ã®å®çžŸåã³çµéšå¹Žæ°çã«å¿ããŠäœåãšãã ãã€ã¢ã¹ãããã£ãŠãããšèããããã ïŒãã®èŸºãã®ç¥èŠããæã¡ã®æ¹ãããã£ããã£ãããæ¯éæããŠããã ãããã§ããïŒ å°ã察æ°å€æãæœããå€ã®ååžã¯æ£èŠååžã«ãªãã ïŒå¯Ÿæ°å€æã«ãã£ãŠç©ã¯åã«å€æãããçºïŒ æå°€æšå®æ³ 確çå¯åºŠé¢æ°ã«ããããã©ã¡ãŒã¿æšå®ïŒä»åã®å Žåãæ£èŠååžãå¯Ÿæ°æ£èŠååžã«ãããÏãÎŒã®æšå®ïŒãè¡ãæ¹æ³ã®1ã€ãšããŠã ä»å䜿çšããæå°€æšå®æ³ãããã ãã£ãã説æãããšæ³å®ãã確çå¯åºŠé¢æ°ãåºã«å°€åºŠé¢æ°ãå®ãããã®é¢æ°å€ïŒå°€åºŠïŒãæå€§ãšãªããšãã® ãã©ã¡ãŒã¿å€ãæå°€æšå®éãšããŠæ±ããããšãã£ãæµãã«ãªãã 詳ããã¯ä»¥äžåèæç®ãåèã«ããŠããã ãããã åèæç® âçµ±èšåŠå
¥éïŒæ±äº¬å€§åŠ æé€åŠéš çµ±èšåп宀 ç·šïŒ âæ¥æ¬çµ±èšåŠäŒ å
¬åŒèªå® çµ±èšæ€å®ïŒçŽ å¯Ÿå¿ çµ±èšåŠïŒæ¥æ¬çµ±èšåŠäŒ ç·šïŒ â仮説æè BGCæµ åé¡çºèŠã»è§£æ±ºã®çºæ³æ³ ïŒå
ç°åæ èïŒ ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
ããã«ã¡ã¯ãã¹ã¿ã³ãã€ã§Quality AssuranceïŒä»¥äžQAïŒãæ
åœããŠããæšœäºã§ãã æã
QAã°ã«ãŒãã¯ãããã¯ãã®å質ãå®ãé«ããååšãšããŠãæ¥ã
ã®å質æ¥åãæ¹åããããã«ããŒã¿ã掻çšããŠããŸãã ããã§ã¯ããŒã¿ã®æŠèŠãšå®éã®æŽ»çšäºäŸãã玹ä»ããŠãããŸãã ã¹ã¿ã³ãã€ã®ãããã¯ãéçºãšQAäœå¶ ã¹ã¿ã³ãã€ã§ã¯ãæ±äººæ€çŽ¢ãšã³ãžã³ãã¹ã¿ã³ãã€ãã®Webã»Native Appã®æ±è·è
åããµãŒãã¹ã«å ããæ±äººå
¥çš¿ãåºå管çãªã©ã®äŒæ¥åããµãŒãã¹ãéå¶ããŠããŸãããµãŒãã¹ããšã«æ
åœéçºã°ã«ãŒããæ±ºãŸã£ãŠãããå€ãã®ã°ã«ãŒãã¯1é±éã2é±éåäœã®ã¢ãžã£ã€ã«éçºã§äœæ¥ãé²ããŠããŸãã 察ããQAã°ã«ãŒãã¯6åã§ãè€æ°éçºã°ã«ãŒãããã®æ€èšŒäŸé Œãå¹çããããªãå¿
èŠããããŸãããç¹å®ã®ã¡ã³ããŒã«æ€èšŒãåã£ãŠããªããããæ€èšŒã®æ¹åãã€ã³ãã¯ãªããããäžé·æçã«ç¢ºèªããŠããäžã§ãããŒã¿ã掻çšã§ããªãããšèããŸããã å®éã«ãã£ãããš æ€èšŒæ¥åå
šäœã®ããŒã¿ãååŸ å
ã
ã¯æ¬çªéå®³ãæ€åºäžå
·åã®ã¿ãéèšããŠããŸããããæ€èšŒæ¥åå
šäœãæããããããã«ããŒã¿ååŸç¯å²ãåºããŠããŸãã çŸåšååŸããŠããããŒã¿çŸ€ ãã»æ¬çªé害 ãã»æ€åºäžå
·å ãã»æ€èšŒäŸé Œ ãã»äœæ¥å·¥æ° ãã»æ¥åç¥è ããŒã¿å
ã¯JiraãZubeãSlackãªã©ãã©ãã©ã§ããããããGoogle ã¹ãã¬ããã·ãŒãã«éçŽåŸãããŒã¿ã®æçµå å·¥ãããŠãLooker Studioãžããã·ã¥ããŒããšããŠåºåããŠããŸãã å³1ïŒLooker Studioä»®æ³ããŒã¿åºåäŸ ææ¬¡ã®æ°å€æ¯ãè¿ãäŒãéå¬ ããã·ã¥ããŒãã¯æ¥ã
ãããŒã¿ã®æ¥å€åããªãããçºçããåºæ¥äºã«ãã£ãŠã©ã®ããŒã¿ãå€ãã£ããã確èªããŠããŸãã ãŸããæ¯æé ã«å
æã®æ°å€æ¯ãè¿ãäŒã宿œããŠããŸããQAã¡ã³ããŒå
šå¡ãæãããã®æã®åºæ¥äºãå¿ããã®èæãªã©å®æ§çãªçŽ æãšãå®éã«åºãæ°å€ã®å®éçãªçŽ æãç
§ããåãããŠãæèŠäº€æãè¡ããŸãã äŸãã°ãä»æã®æ¬çªé害ãå€ãã®ã¯ãªããããæ¥ã«æ®äžå
·åãå¢ããã®ã¯ãªããããè€æ°äººã§è©±ãããšã«ãããããã®èгç¹ãæŒããŠãããããã®æ©èœã®äžå
·åãå€ãåºãŠããããå·®ã蟌ã¿ã®æ¡ä»¶ã§åªå
床ãäžãã£ãããªã©ãããå€ãã®èŠç¹ã§æãã宿œè
ãæ€èšŒäžã«æããæããå
šå¡ã§å
±æã§ããŸãã å ããŠãéå»ããŒã¿ãå
ã«ããã®ææã¯æ€èšŒäŸé Œãå¢ãããã现ãããã®ã¯å
ã«åãæãã£ãŠããããããã®èгç¹ã§äžå
·åãå¢ããŠããŠããããèšè𿮵éã§ã¯ãªã¢ã«ããŠãããããšãã£ãçŽè¿ã®äœæ¥ã«ã€ããŠè©±ãåããããããããŒã¿ã®äžæç¹ã«ã€ããŠè°è«ããŸãã æ°å€æ¯ãè¿ãäŒå
ã§è§£æ±ºããªãã£ãçåã»èª¿æ»äºé
ã¯Next ActionãšããŠæ
åœã決ããäžæç¹ãæç¢ºã«ãªãããã«åªããŸãã ããŒã¿æŽ»çšäºäŸ äºäŸ1ïŒå¿ããã¡ãŒã¿ãŒ QAæ¥åã®å¿ããã¯ãèªåãã¡ã®æèŠãå¯èŠåããããšããå§ãŸããŸãããæ¡ä»¶ã®ããªã¥ãŒã ïŒé£æåºŠã¯ãã¹ããŒãªãŒãã€ã³ããšããŠæ°å€åããŠããŸãã çŸåšã¯ãã¹ãèšèšçµäºæã«èšèšæ
åœè
ããã€ã³ããã€ããæ€èšŒçµäºåŸã«QAã¡ã³ããŒå
šå¡ã§ãã€ã³ãã®èŠçŽããããæ¹æ³ãæ¡çšããŠããŸãã ãã®å¿ããã¡ãŒã¿ãŒã«ããããå
æã¯äœã ãå¿ããã£ãããæ¥é±ã¯å¿ãããªãããããå¯èŠåã§ããããã«ãªã£ãŠããŸãããèªåãã¡ã®æèŠã§æããŠãããã®ãä»ã®äººã«ãããã圢ã«ã§ããããšã§ãå
±éèªèãæãŠãããã«ãªããŸããã å³2ïŒå¿ããã¡ãŒã¿ãŒã®åºåäŸ äºäŸ2ïŒæ¥åç¥èã·ãŒã QAã¡ã³ããŒã¯æ
åœããéçºã°ã«ãŒãã»ã·ã¹ãã ãåºå®åãããåŸåã«ãããç¥èŠãå±äººåããŠããç¶æ
ã§ããã åã·ã¹ãã ã«å¯ŸããŠæ€èšŒã«å©çšããã¹ãã«ãäžèЧåããã©ã®ã¹ãã«ã身ã«ã€ããã®ããæ¯æãã§ãã¯ããŠããŸããã¹ãã«ã¯ãXXãã°ã®ååŸããXXã·ã¹ãã ã®ââæäœããXXã·ã¹ãã ã®ãã¹ãé
ç®äœæãã®æ§ã«åãããŠããŸããã¹ãã«ç¿åŸã®æšç§»ã远ãããšã§ãèªåèªèº«ã®æé·ãQAã°ã«ãŒãå
šäœã®å€åã確èªãããããªããŸãããããã®æ¡ä»¶ã¯AãããšBãããè¯ãããããã®ç¥èãå±äººåããŠããããå匷äŒã§å
±æãããããªã©ãæ¡ä»¶å²ãæ¯ããæè²æŠç¥ãç«ãŠããããªããŸããã å³3ïŒæ¥åã¹ãã«ã·ãŒãã®åºåäŸ äŸãã°ãå·Šå³ã®Aããæ¥åç¥èãèŠãŠã¿ããšã4ææç¹ã§æ±äººäœæãµãŒãã¹ã®ç¥èã¯ïŒã§ãã æ±äººäœæãµãŒãã¹ã«é¢ããã¹ãã«ã¯ãæ±äººç®¡çã®ã·ã¹ãã æäœãã¡ã€ã³ã«ãªããŸãããã®æã¯è€æ°ã¡ã³ããŒãåæ§ã®ç¶æ
ã§ãããç¹å®ã¡ã³ããŒã«ç¥èŠãåã£ãŠããããšãããããŸããã ããã§ãã³ãºãªã³ã®å匷äŒã宿œãããŸãã¯å©çšé »åºŠã®é«ããæ±äººäœæãã¹ãã«ãååŸããŠããããŸããããã®ã¹ãã«ãèµ·ç¹ãšããŠãæ±äººç·šéããäŒç€Ÿäœæããšæ¬¡ã®ã¹ãã«ã身ã«ã€ããŠããã12æã«ã¯æ±äººäœæãµãŒãã¹ã ãã§ãªããäŒæ¥åããµãŒãã¹ã®ã¹ãã«ã䌞ã°ãããšãã§ããŸããã ãŸããå³å³ã®QAããŒã æ¥åç¥èã§ã¯ãåäººã®æ¥åç¥èãç·åããå€ãèŠãŠããŸãã4æããå³è©äžãããšãªã£ãŠããã°ã©ãã§ããã9æã¯äººå¡å
¥æ¿ã«ãããäžãã£ãŠããŸã£ãŠããŸãã ãã®ãããªå ŽåãçŽè¿ã¹ãã«ãç¿åŸããã¡ã³ããŒãæããåŽã«åãããšã§ãæ°èŠã¡ã³ããŒã®ãã©ããŒã¢ãããšæããåŽã®ç¥èã®å®çãå³ã£ãŠããŸãããçµæãšããŠã以åã¯5ã¶æéïŒ4ã8æïŒãããŠéããæ°Žæºã«ã4ã¶æéïŒïŒã12æïŒã§è¿ã¥ãããšãã§ããŸããã ããŒã¿æŽ»çšã«ããå€å æ€èšŒå·¥æ°ã®æ¡å€§ãšäžå
·åæ€åºã®å¢å ããŒã¿æŽ»çšãå§ããŠ3幎ãçµéããããããææããããã®ãèŠããŠããŸããã 3幎åã«æ¯ã¹ãQAã¡ã³ããŒã®å
šå·¥æ°ã«ããããã¹ãå·¥æ°å²åãäžæåŸåã«ããããšãããã£ãŠããŸãããããã¯QAæ¥åã®æ¬è³ªã§ãããæ€èšŒäœæ¥ã«å²ããæéãå¢å ããŠããããšã瀺ããŠããŸãã ãããŸã§ã¯ãæ®æ®µæ
åœããªãã·ã¹ãã ã®æ€èšŒã宿œããéãéœåºŠã€ã³ããããè¡ã£ãããç¥èŠã®ããã¡ã³ããŒã仿¥åãšäžŠè¡ããŠå
šé¢ãµããŒãããããããŠããŸãããçŸåšã¯åãµãŒãã¹ã®ç¥èŠãäºåã€ã³ãããããŠãããããå¿ããã¿ã€ãã³ã°ã§ã®èª¬æå·¥æ°ãççž®ã§ããåã¡ã³ããŒãå²ãæ¯ãããæ¡ä»¶ã«éäžã§ããããã«ãªã£ãŠããŠããŸãã å·¥æ°å
šäœãèŠãŠããäžäººåœããã®çšŒåæéãå¢ããããã§ã¯ãªãããšãããå·¥æ°ãæãã€ã€ãæ€èšŒã«å²ãæéãå¢ãããŠãããšèšãããã§ãã å³4ïŒãã¹ãå·¥æ°å²åã®åºåäŸ ãŸããæ€åºäžå
·åæ°ãçå®ã«å¢ããŠããŸãã ãã¡ãã¯1æ¡ä»¶ã«ã€ãå¹³åäœä»¶ã®äžå
·åãæ€åºããŠããã®ããç®åºããã°ã©ãã§ããäžå
·åå
容ã粟æ»ãããšãããéå»ã«ç¥èäžè¶³ã§æ€åºã§ããªãã£ãäžå
·åã®å¢å ã«ãããå
šäœã®æ€åºæ°ãåŒãäžããŠããå¯èœæ§ãé«ããšããããŸããã QAã¡ã³ããŒãæã€ç¥èãæå³çã«åºããŠããããšã§ãå¿
èŠãªç¥èã芳ç¹ãæã£ãŠæ€èšŒã«ãããããšãã§ããŠãããšèããããŸãã å³5ïŒäžå
·åæ€åºçã®åºåäŸ ä»åŸã®éæ æ°ããªèª²é¡ãçºçããæãããŒã¿ã掻çšããããšã§ã客芳çãªèŠç¹ã§ãNext Actionãèãããã³ããåŸãããšãã§ããŸããããããŸã§ç®ã«èŠããªãã£ãå¿ãããé 匵ãã»ç¥èãå¯èŠåããææã®å
±æãã§ãå§ããŠããŸãã ä»ã¯ãŸã QAå
éšã§ã®æŽ»çšã«çãŸã£ãŠããããŒã¿ããä»åŸã¯ãããã¯ãé¢ä¿è
ãããã«ã¯å
šç€Ÿçãªåè³ªææšãžãšæè¯ããŠãããããšèããŠããŸãã ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
æ ªåŒäŒç€Ÿã¹ã¿ã³ãã€ã§ãããã¯ããªãŒããŒãåããŠããäžéã§ãã ãã¹ã¯ã©ã å°å
¥ãããã©ãéçºãäžæãåããªãããããã§è¯ãã®ãããããªãããã¹ã¯ã©ã éçºã§ãå°ãã®æ¹ãå€ãã®ã§ã¯ãªãã§ãããããåã®æå±ããããŒã ãã¹ã¯ã©ã ãäžæ ããããã«èŠããã ææããããŸããã ã¹ã¯ã©ã ã¬ã€ã ã£ãŠå®ãã¹ãããšãæžããŠããã ãã§ãéçšæ¹æ³ãŸã§ã¯æžããŠãªããã§ããããå°ãªããšããã®ãããã¯æŒãããŠããã°ãã¹ã¯ã©ã èµ€ç¹ãã«ã¯ãªãããè»éã«ä¹ãããããªãããªããšããéšåããäŒãããŸãã ã¹ã¯ã©ã ãšã¯ åãåœåããã§ããããã¹ã¯ã©ã ã¯èª€è§£ããããããã¬ãŒã ã§ããã¹ã¯ã©ã ã¬ã€ããããããšãããããåçŽã«ãã®ã¬ã€ãã©ã€ã³ãå®ã£ãŠããã°è¯ãã®ã ãªããšãªããã¡ãªæ°ãããŠããŸãã ããããã¹ã¯ã©ã ã¯ã çŸç¶ãçŽ æ©ãæ£ç¢ºã«ææ¡ãã課é¡ãçãåºããã¬ãŒã ã¯ãŒã¯ ãã§ããå°ã
ä¹±æŽã«èšãã°ãç®æšãšçŸç¶ã®ã®ã£ãããå
šéšèŠããåããã®ã£ãããè§£æ¶ããããšã§åé²ããŠããããšãããã¬ãŒã ã¯ãŒã¯ã§ããå°å
¥åŸãåžžã«ããŒã å
šå¡ã®åªåããªãéãæãç«ã¡åŸãªãäžçãªã®ã§ãã ãããããæ ãæãšãªãã¹ã¯ã©ã ã¬ã€ãã«èšèŒãããŠããããšãšãã£ãŠããåºæ¬çãªã¹ã¯ã©ã ã€ãã³ããã¹ã¯ã©ã ã«ãããèãæ¹ã䟡å€èгã«é¢ããããšãããã§ãïŒãã ããå¿çåŠãè¡ååŠãããã£ãããšè£ä»ããããçè«ïŒãåœç¶ãç°å¢ãç°ãªãããŒã ããã¬ãŒã ã¯ãŒã¯ã䜿ãã®ã§ãå¯äžã®æ£è§£ãšãªãã¹ã¯ã©ã ã®åœ¢ããããŸããïŒãééã£ã圢ãã¯å®ãããããã§ããïŒã ã¹ã¯ã©ã ã¬ã€ããšãããšãäžè¬çã«ã¹ã¯ã©ã ã€ãã³ãã圹å²å®çŸ©ã«ç®ãè¡ããã¡ã§ããïŒåèªèº«ããã§ããïŒãå®ã¯ããã«èšèŒãããŠãããèãæ¹ããã¹ã¯ã©ã ã®æåŠã«ããã£ãŠããããšã¯ããŸãç¥ãããŠããªããããããŸããã 以åãè€æ°ã®äŒæ¥ã§ã¹ã¯ã©ã å°å
¥æ¯æŽããŠããå€éšã³ãŒãã«äŒºã£ããšãããã¹ã¯ã©ã ãããŸãæ©èœããªãã±ãŒã¹ã®ãã¡ãæãå€ãçç±ãããã® ãèãæ¹ãã®èªèãæã£ãŠããªãããš ãã ããã§ãã ãããããèãæ¹ãéšåãéèŠãªã®ã¯ãã¹ã¯ã©ã éçºãããŒã 掻åã§ãããããŒã ã§å©ãåãããšãåæã«äœãããŠãããã¬ãŒã ã¯ãŒã¯ã§ããããã§ããããäŸãã°ãã¹ããªã³ãå
ã®ãã±ãããæ©ãã«å®äºããã¡ã³ããŒãããããä»ã«å°ã£ãŠããã¡ã³ããŒã®éçºãµããŒãã«åã£ãããPOã®æéãåããªãå Žåã«éçºã¡ã³ããŒããã±ããã®äœæãŸã§è¡ãªãããšãªã©ãã»ãã«ãè²ã
ããããŸãã ãŸãã«ã¹ããŒãã®ããã«ã1ã€ã®ç®æšã«åãã£ãŠããŒã ãååããŠè¡ã掻åã¯åãªãæ©æ¢°çãªä»çµã¿ã ãã§ã¯ãªãããèãæ¹ãããããããã€ã³ããã¹ã¿ã³ã¹ãèã«ãªã£ãŠããŸãã ç®ç·ã®ããéãéçºããŒã åœæãåã®æå±ããŠããã¹ã¯ã©ã ããŒã ã¯ãããããå¥ã®æ¹åãåããŠããç¶æ
ã§ããã ïŒåœæã®èª²é¡ã¡ã¢ïŒ ã¹ããªã³ãå
ã®ãã±ããéæçã«å¯Ÿããæž©åºŠå·®ãçãŸããŠããŸã£ãŠãã åã
人ã§éçºã®é²ãæ¹ããããå®ãã¹ãéšåãšåŠ¥åéšåã®éããªã©ãæç¢ºã«ãããªããŸãŸå±äººçã«é²ãã§ããŸã ã¬ããçã®æ¯ãè¿ãã®å Žã§ãäœãæ¯ãè¿ãã°ãããããããªãç¶æ
ã§ãçµæçã«äœãåºãªã 仿ãã°ãã¿ã¹ã¯ããµãã¿ã¹ã¯ã®ã¹ããªã³ãå
å®äºã®æèã培åºã§ããŠããããéçºã¡ã³ããŒãããããã®ç¶æ³ãææ¡ã§ããããããããååãããããªäŒè©±ãã§ããŠããªããšããç¶æ
ã§ããã ãäºãæåŸ
ããããšãç°ãªããããéçºäžã®ã¹ãã¬ã¹ãå¢ããŸãããããŠç®ã«èŠããªãã¹ãã¬ã¹ã¯ããã倧ããªæºãšãªããææªã®å Žåãã¹ã¯ã©ã ããŒã ã®åŽ©å£ã«è³ã£ãŠããã§ãããã 幞ããããŒã ã®åŽ©å£ãšãŸã§ã¯è³ããŸããã§ããããããã©ãŒãã³ã¹çã«ã¯âèµ€ç¹âã§ãããããŒã å
ããããªãã§ã¹ã¯ã©ã ãã£ãŠããã ã£ãïŒããšããåããããåºãã»ã©ã§ãã ãã®ç¶æ³ãæéãã¹ããããŒã å€éšã®ã³ãŒãïŒç€Ÿå
ã®ã¢ãžã£ã€ã«ã³ãŒãïŒã®åããåããæ¹åã«ç§»ããŸãããå
·äœçã«ã¯ãéçºã®ãèãæ¹ããçµ±äžãããã¯ãŒã¯ãè€æ°åè¡ããŸãããé±1åçšåºŠã§1â2æéã1ã¶æçšåºŠãããäž»ã«ä»ãã説æãã2ã€ã®èãæ¹ãããŒã ã¡ã³ããŒå
šå¡ã§çè§£ãè§£éããã¯ãŒãã³ã°ã¢ã°ãªãŒã¡ã³ãåãããšããæŽ»åã§ãã ã¯ãŒãã³ã°ã¢ã°ãªãŒã¡ã³ããäœã£ãŠçµããïŒã§ã¯æå³ããªãã®ã§ãããŒã ã§ã®åãæ±ºããæ¥ã
ã®ãç¿æ
£ã«ããããããããã«æ°ã¶æã®æéããããŸããã çµæãéçºããŒã ã®é°å²æ°ãçç£æ§ã¯èµ€ç¹ãè±ããã©ããããçµç¹ãšããŠæ¬¡ã®ãã§ãŒãºã«é²ãã å°è±¡ãæãŠãŸãããã¹ããªã³ãå
ã®ãã±ãã鲿çãSlackã®ã³ãã¥ãã±ãŒã·ã§ã³éãæ®æ®µäº€ãããã話é¡ã®æ°ããããŠäœãããã¬ããã¹ãã¯ãã£ãã«ãã課é¡åºãããã©ã€ã®å®è·µãæ¯ãè¿ããŸã§ã®ãµã€ã¯ã«ãå¢ããããšã«é©ããŠããŸãã課é¡ä»¥å€ã«ãã¹ããªã³ãå
ã§ãè¯ãã£ãåãçµã¿ããä»ç®åããã®ã§ããããã®éãåœæããæ¯èŒãããš3,4åéãã®ã§ã¯ãªãã§ããããã ã¹ããªã³ããäžæãåããããªå€§ãããä»çµã¿ãæ°ãã«äœã£ãããã§ã¯ãªãã§ããåçŽã«ãèãæ¹ããçµ±äžããã ãã§ãã ãã®å®è·µãéããŠãæ¹ããŠã¹ã¯ã©ã ã¡ã³ããŒã§ãèãæ¹ããçµ±äžããããšã®éèŠæ§ãèªèããŸããããèãæ¹ããããã«ããŒã ã§åæããæµžéãããå®è·µãããããããæåã®ç§èš£ã§ãããšèããŠããŸããããŒã ã®ã«ã«ãã£ãŒã«ãã£ãŠtipsãã«ãŒã«ã®éããæ»²ã¿åºãã¯ãã§ãããããŸãé¢çœããšãããªãã ãããªãšããæ°ãããŸããå眮ããé·ããªããŸãããã以äžã«ãŠãã¹ã¯ã©ã ã§âèµ€ç¹âã«ãªããªãããã®ãéèŠãªèãæ¹ã2ã€ã玹ä»ããŸãã ïŒïŒã¹ã¯ã©ã ã®çè« 1ã€ç®ã¯ãã¹ã¯ã©ã ã¬ã€ãã§ãã¹ã¯ã©ã ã®çè«ã»ã¹ã¯ã©ã ã®äžæ¬æ±ããšããŠæ±ãããŠããèãæ¹ã§ããäž»ã«ãInspectionïŒæ€æ»ïŒããAdaptationïŒé©å¿ïŒããTransparencyïŒéæåïŒãã®èŠçŽ ããæããŸãã å°ãåã¿ç ããš ã»åžžã«çŸç¶ã«å¯ŸããŠèªåãã¡ã®ããã¹ãç¶æ
ãåžžã«ã¢ããããŒããïŒæ€æ»ïŒ ã»çŸç¶ãšããã¹ãå§¿ãžã®å·®åãåãç¶ããåªåãããŠããããšïŒé©å¿ïŒ ã»ããããæ£ããç¶æ³å€æãè¡ããããã«ã掻åãå¯èŠåãããïŒéææ§ïŒ ãšããã®ãã¹ã¯ã©ã ã®äŸ¡å€èгã§ãã ã€ãŸããšãããç®æšã«å¯ŸããŠçŸç¶ã¯ã©ã®ãããªç¶æ
ãªã®ãããã®ã®ã£ãããåããããã«äœãã§ãããããæããã«ãªã£ãŠããããšãããžãã¹ã·ãŒã³ã§ããç®ã«ãããããªãAs-isãTo-beãTo-doãã®ãã¬ãŒã ã¯ãŒã¯ãšåããããªèãæ¹ã§ããã ã€ãŸããã¹ããªã³ãå
ã®ããããæŽ»åã«ãããŠç®æšãèšå®ãããçŸç¶å·®åã«å¯Ÿãã仮説ãæã¡ãïŒå¯èœãªãïŒèšæž¬ãããå
¬éããããªã©ãåžžã«æ¯ãè¿ããç¶æ
ãäœãç¶ããªããšãããŸãããäŸãã°ãã±ããã«ã¯ãå®äºåºæºïŒAcceptance CriteriaïŒãã®ãããªæç¢ºãªãŽãŒã«ãèšãããã¹ããªã³ãå
ã§æ¶åããã¹ããŒãªãŒãã€ã³ããèšæž¬ããŠãããã¹ããªã³ãå
ã§çšæã§ããäœæ¥æéãæããã«ãããªã©ã該åœããŸãã åã®ããŒã ã§ã¯ã1ã€ç®ã®ãèãæ¹ããšããŠãã®ã¹ã¯ã©ã ã®çè«ãçè§£ããããšããã¹ãããããå§ãŸããŸããã ïŒïŒã¹ã¯ã©ã ã®äŸ¡å€åºæº ãã1ã€ã¯ã5ã€ã®ã¹ã¯ã©ã ã®äŸ¡å€åºæºãCommitmentïŒç¢ºçŽïŒããFocusïŒéäžïŒããOpennessïŒå
¬éïŒããRespectïŒå°æ¬ïŒããCourageïŒåæ°ïŒãã§ãã ããã ãã§ãååãªã±ãŒã¹ããããããããŸããããåã®ããŒã ã§ã¯ããå°ãã¢ã¯ã·ã§ã³ã«èœãšã蟌ã¿ããã£ãã®ã§ã以äžã®ããã«ã¹ããªã³ãã®ã¯ãŒãã³ã°ã¢ã°ãªãŒã¡ã³ããšããŠèšå®ããŸãããæ°ãå€ããŠãå®ãã¥ããã®ã§ããŸãã¯3ã€ã«çµã£ãŠããŸãã ãã€ã³ãã¯ã第äžè
ãèŠãŠã客芳çã«è©äŸ¡ã§ããå
容ãã©ãããã§ãã â»åèâ ïŒmiroã§ã®ã¯ãŒã¯ã·ã§ããã®ã¢ãŠãããã â»åèâ¡ïŒmiroã§ã®ã¯ãŒã¯ã·ã§ããã®ã¢ãŠãããã ãããŸã§ãäžèšã¯åã®ããŒã ã®ã«ã«ãã£ãŒãèª²é¡æããæ»²ã¿åºãŠããè§£éã§ãããäžäŸã§ããä»ããŒã ã§å®æœããã°å¥ã®è§£éããããšæããŸãã 以äžãç°¡åã§ã¯ãããŸãããã¹ã¯ã©ã ã®èµ€ç¹å¯Ÿçã«å¿
èŠãª2ã€ã®ãèãæ¹ããã玹ä»ããŸãããã¹ã¯ã©ã ã§éåæãæãããããã±ãããããããããã¯ãããžã§ã³ãããããã¡ã³ããŒã®ç®ç·ã¯ãã£ãŠãããïŒããæèããŠã¿ãŠãã ããã èµ€ç¹ãè±ããä»ãå人çã«ã¯ãé¢ãã£ãŠããã¡ã³ããŒå
šå¡ãçãçãããŠããããæ¥œããã§ãããããåžžã«æèããããã«ããŠããŸãã ãŸãšã ã¹ã¯ã©ã ã¯ãçŸç¶ãçŽ æ©ãæ£ç¢ºã«ææ¡ãã課é¡ãçãåºããã¬ãŒã ã¯ãŒã¯ãã§ãã å人æã§ã¯ãªããããŒã 掻åã§ããããšãå¿ããªã ã¹ã¯ã©ã ã¬ã€ãã®ãã¹ã¯ã©ã çè«ãã䟡å€åºæºããããŒã ã§è§£éãããèãæ¹ããçµ±äžããããšãèµ€ç¹å¯Ÿçã«æå¹ åèè³æ ã¹ã¯ã©ã ã¬ã€ãæ¥æ¬èªçïŒ2020å¹ŽïŒ https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf  ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com
æ ªåŒäŒç€Ÿã¹ã¿ã³ãã€ã§ãããã¯ããªãŒããŒãåããŠããäžéã§ãã ãã¹ã¯ã©ã å°å
¥ãããã©ãéçºãäžæãåããªãããããã§è¯ãã®ãããããªãããã¹ã¯ã©ã éçºã§ãå°ãã®æ¹ãå€ãã®ã§ã¯ãªãã§ãããããåã®æå±ããããŒã ãã¹ã¯ã©ã ãäžæ ããããã«èŠããã ææããããŸããã ã¹ã¯ã©ã ã¬ã€ã ã£ãŠå®ãã¹ãããšãæžããŠããã ãã§ãéçšæ¹æ³ãŸã§ã¯æžããŠãªããã§ããããå°ãªããšããã®ãããã¯æŒãããŠããã°ãã¹ã¯ã©ã èµ€ç¹ãã«ã¯ãªãããè»éã«ä¹ãããããªãããªããšããéšåããäŒãããŸãã ã¹ã¯ã©ã ãšã¯ åãåœåããã§ããããã¹ã¯ã©ã ã¯èª€è§£ããããããã¬ãŒã ã§ããã¹ã¯ã©ã ã¬ã€ããããããšãããããåçŽã«ãã®ã¬ã€ãã©ã€ã³ãå®ã£ãŠããã°è¯ãã®ã ãªããšãªããã¡ãªæ°ãããŠããŸãã ããããã¹ã¯ã©ã ã¯ã çŸç¶ãçŽ æ©ãæ£ç¢ºã«ææ¡ãã課é¡ãçãåºããã¬ãŒã ã¯ãŒã¯ ãã§ããå°ã
ä¹±æŽã«èšãã°ãç®æšãšçŸç¶ã®ã®ã£ãããå
šéšèŠããåããã®ã£ãããè§£æ¶ããããšã§åé²ããŠããããšãããã¬ãŒã ã¯ãŒã¯ã§ããå°å
¥åŸãåžžã«ããŒã å
šå¡ã®åªåããªãéãæãç«ã¡åŸãªãäžçãªã®ã§ãã ãããããæ ãæãšãªãã¹ã¯ã©ã ã¬ã€ãã«èšèŒãããŠããããšãšãã£ãŠããåºæ¬çãªã¹ã¯ã©ã ã€ãã³ããã¹ã¯ã©ã ã«ãããèãæ¹ã䟡å€èгã«é¢ããããšãããã§ãïŒãã ããå¿çåŠãè¡ååŠãããã£ãããšè£ä»ããããçè«ïŒãåœç¶ãç°å¢ãç°ãªãããŒã ããã¬ãŒã ã¯ãŒã¯ã䜿ãã®ã§ãå¯äžã®æ£è§£ãšãªãã¹ã¯ã©ã ã®åœ¢ããããŸããïŒãééã£ã圢ãã¯å®ãããããã§ããïŒã ã¹ã¯ã©ã ã¬ã€ããšãããšãäžè¬çã«ã¹ã¯ã©ã ã€ãã³ãã圹å²å®çŸ©ã«ç®ãè¡ããã¡ã§ããïŒåèªèº«ããã§ããïŒãå®ã¯ããã«èšèŒãããŠãããèãæ¹ããã¹ã¯ã©ã ã®æåŠã«ããã£ãŠããããšã¯ããŸãç¥ãããŠããªããããããŸããã 以åãè€æ°ã®äŒæ¥ã§ã¹ã¯ã©ã å°å
¥æ¯æŽããŠããå€éšã³ãŒãã«äŒºã£ããšãããã¹ã¯ã©ã ãããŸãæ©èœããªãã±ãŒã¹ã®ãã¡ãæãå€ãçç±ãããã® ãèãæ¹ãã®èªèãæã£ãŠããªãããš ãã ããã§ãã ãããããèãæ¹ãéšåãéèŠãªã®ã¯ãã¹ã¯ã©ã éçºãããŒã 掻åã§ãããããŒã ã§å©ãåãããšãåæã«äœãããŠãããã¬ãŒã ã¯ãŒã¯ã§ããããã§ããããäŸãã°ãã¹ããªã³ãå
ã®ãã±ãããæ©ãã«å®äºããã¡ã³ããŒãããããä»ã«å°ã£ãŠããã¡ã³ããŒã®éçºãµããŒãã«åã£ãããPOã®æéãåããªãå Žåã«éçºã¡ã³ããŒããã±ããã®äœæãŸã§è¡ãªãããšãªã©ãã»ãã«ãè²ã
ããããŸãã ãŸãã«ã¹ããŒãã®ããã«ã1ã€ã®ç®æšã«åãã£ãŠããŒã ãååããŠè¡ã掻åã¯åãªãæ©æ¢°çãªä»çµã¿ã ãã§ã¯ãªãããèãæ¹ãããããããã€ã³ããã¹ã¿ã³ã¹ãèã«ãªã£ãŠããŸãã ç®ç·ã®ããéãéçºããŒã åœæãåã®æå±ããŠããã¹ã¯ã©ã ããŒã ã¯ãããããå¥ã®æ¹åãåããŠããç¶æ
ã§ããã ïŒåœæã®èª²é¡ã¡ã¢ïŒ ã¹ããªã³ãå
ã®ãã±ããéæçã«å¯Ÿããæž©åºŠå·®ãçãŸããŠããŸã£ãŠãã åã
人ã§éçºã®é²ãæ¹ããããå®ãã¹ãéšåãšåŠ¥åéšåã®éããªã©ãæç¢ºã«ãããªããŸãŸå±äººçã«é²ãã§ããŸã ã¬ããçã®æ¯ãè¿ãã®å Žã§ãäœãæ¯ãè¿ãã°ãããããããªãç¶æ
ã§ãçµæçã«äœãåºãªã 仿ãã°ãã¿ã¹ã¯ããµãã¿ã¹ã¯ã®ã¹ããªã³ãå
å®äºã®æèã培åºã§ããŠããããéçºã¡ã³ããŒãããããã®ç¶æ³ãææ¡ã§ããããããããååãããããªäŒè©±ãã§ããŠããªããšããç¶æ
ã§ããã ãäºãæåŸ
ããããšãç°ãªããããéçºäžã®ã¹ãã¬ã¹ãå¢ããŸãããããŠç®ã«èŠããªãã¹ãã¬ã¹ã¯ããã倧ããªæºãšãªããææªã®å Žåãã¹ã¯ã©ã ããŒã ã®åŽ©å£ã«è³ã£ãŠããã§ãããã 幞ããããŒã ã®åŽ©å£ãšãŸã§ã¯è³ããŸããã§ããããããã©ãŒãã³ã¹çã«ã¯âèµ€ç¹âã§ãããããŒã å
ããããªãã§ã¹ã¯ã©ã ãã£ãŠããã ã£ãïŒããšããåããããåºãã»ã©ã§ãã ãã®ç¶æ³ãæéãã¹ããããŒã å€éšã®ã³ãŒãïŒç€Ÿå
ã®ã¢ãžã£ã€ã«ã³ãŒãïŒã®åããåããæ¹åã«ç§»ããŸãããå
·äœçã«ã¯ãéçºã®ãèãæ¹ããçµ±äžãããã¯ãŒã¯ãè€æ°åè¡ããŸãããé±1åçšåºŠã§1â2æéã1ã¶æçšåºŠãããäž»ã«ä»ãã説æãã2ã€ã®èãæ¹ãããŒã ã¡ã³ããŒå
šå¡ã§çè§£ãè§£éããã¯ãŒãã³ã°ã¢ã°ãªãŒã¡ã³ãåãããšããæŽ»åã§ãã ã¯ãŒãã³ã°ã¢ã°ãªãŒã¡ã³ããäœã£ãŠçµããïŒã§ã¯æå³ããªãã®ã§ãããŒã ã§ã®åãæ±ºããæ¥ã
ã®ãç¿æ
£ã«ããããããããã«æ°ã¶æã®æéããããŸããã çµæãéçºããŒã ã®é°å²æ°ãçç£æ§ã¯èµ€ç¹ãè±ããã©ããããçµç¹ãšããŠæ¬¡ã®ãã§ãŒãºã«é²ãã å°è±¡ãæãŠãŸãããã¹ããªã³ãå
ã®ãã±ãã鲿çãSlackã®ã³ãã¥ãã±ãŒã·ã§ã³éãæ®æ®µäº€ãããã話é¡ã®æ°ããããŠäœãããã¬ããã¹ãã¯ãã£ãã«ãã課é¡åºãããã©ã€ã®å®è·µãæ¯ãè¿ããŸã§ã®ãµã€ã¯ã«ãå¢ããããšã«é©ããŠããŸãã課é¡ä»¥å€ã«ãã¹ããªã³ãå
ã§ãè¯ãã£ãåãçµã¿ããä»ç®åããã®ã§ããããã®éãåœæããæ¯èŒãããš3,4åéãã®ã§ã¯ãªãã§ããããã ã¹ããªã³ããäžæãåããããªå€§ãããä»çµã¿ãæ°ãã«äœã£ãããã§ã¯ãªãã§ããåçŽã«ãèãæ¹ããçµ±äžããã ãã§ãã ãã®å®è·µãéããŠãæ¹ããŠã¹ã¯ã©ã ã¡ã³ããŒã§ãèãæ¹ããçµ±äžããããšã®éèŠæ§ãèªèããŸããããèãæ¹ããããã«ããŒã ã§åæããæµžéãããå®è·µãããããããæåã®ç§èš£ã§ãããšèããŠããŸããããŒã ã®ã«ã«ãã£ãŒã«ãã£ãŠtipsãã«ãŒã«ã®éããæ»²ã¿åºãã¯ãã§ãããããŸãé¢çœããšãããªãã ãããªãšããæ°ãããŸããå眮ããé·ããªããŸãããã以äžã«ãŠãã¹ã¯ã©ã ã§âèµ€ç¹âã«ãªããªãããã®ãéèŠãªèãæ¹ã2ã€ã玹ä»ããŸãã ïŒïŒã¹ã¯ã©ã ã®çè« 1ã€ç®ã¯ãã¹ã¯ã©ã ã¬ã€ãã§ãã¹ã¯ã©ã ã®çè«ã»ã¹ã¯ã©ã ã®äžæ¬æ±ããšããŠæ±ãããŠããèãæ¹ã§ããäž»ã«ãInspectionïŒæ€æ»ïŒããAdaptationïŒé©å¿ïŒããTransparencyïŒéæåïŒãã®èŠçŽ ããæããŸãã å°ãåã¿ç ããš ã»åžžã«çŸç¶ã«å¯ŸããŠèªåãã¡ã®ããã¹ãç¶æ
ãåžžã«ã¢ããããŒããïŒæ€æ»ïŒ ã»çŸç¶ãšããã¹ãå§¿ãžã®å·®åãåãç¶ããåªåãããŠããããšïŒé©å¿ïŒ ã»ããããæ£ããç¶æ³å€æãè¡ããããã«ã掻åãå¯èŠåãããïŒéææ§ïŒ ãšããã®ãã¹ã¯ã©ã ã®äŸ¡å€èгã§ãã ã€ãŸããšãããç®æšã«å¯ŸããŠçŸç¶ã¯ã©ã®ãããªç¶æ
ãªã®ãããã®ã®ã£ãããåããããã«äœãã§ãããããæããã«ãªã£ãŠããããšãããžãã¹ã·ãŒã³ã§ããç®ã«ãããããªãAs-isãTo-beãTo-doãã®ãã¬ãŒã ã¯ãŒã¯ãšåããããªèãæ¹ã§ããã ã€ãŸããã¹ããªã³ãå
ã®ããããæŽ»åã«ãããŠç®æšãèšå®ãããçŸç¶å·®åã«å¯Ÿãã仮説ãæã¡ãïŒå¯èœãªãïŒèšæž¬ãããå
¬éããããªã©ãåžžã«æ¯ãè¿ããç¶æ
ãäœãç¶ããªããšãããŸãããäŸãã°ãã±ããã«ã¯ãå®äºåºæºïŒAcceptance CriteriaïŒãã®ãããªæç¢ºãªãŽãŒã«ãèšãããã¹ããªã³ãå
ã§æ¶åããã¹ããŒãªãŒãã€ã³ããèšæž¬ããŠãããã¹ããªã³ãå
ã§çšæã§ããäœæ¥æéãæããã«ãããªã©ã該åœããŸãã åã®ããŒã ã§ã¯ã1ã€ç®ã®ãèãæ¹ããšããŠãã®ã¹ã¯ã©ã ã®çè«ãçè§£ããããšããã¹ãããããå§ãŸããŸããã ïŒïŒã¹ã¯ã©ã ã®äŸ¡å€åºæº ãã1ã€ã¯ã5ã€ã®ã¹ã¯ã©ã ã®äŸ¡å€åºæºãCommitmentïŒç¢ºçŽïŒããFocusïŒéäžïŒããOpennessïŒå
¬éïŒããRespectïŒå°æ¬ïŒããCourageïŒåæ°ïŒãã§ãã ããã ãã§ãååãªã±ãŒã¹ããããããããŸããããåã®ããŒã ã§ã¯ããå°ãã¢ã¯ã·ã§ã³ã«èœãšã蟌ã¿ããã£ãã®ã§ã以äžã®ããã«ã¹ããªã³ãã®ã¯ãŒãã³ã°ã¢ã°ãªãŒã¡ã³ããšããŠèšå®ããŸãããæ°ãå€ããŠãå®ãã¥ããã®ã§ããŸãã¯3ã€ã«çµã£ãŠããŸãã ãã€ã³ãã¯ã第äžè
ãèŠãŠã客芳çã«è©äŸ¡ã§ããå
容ãã©ãããã§ãã â»åèâ ïŒmiroã§ã®ã¯ãŒã¯ã·ã§ããã®ã¢ãŠãããã â»åèâ¡ïŒmiroã§ã®ã¯ãŒã¯ã·ã§ããã®ã¢ãŠãããã ãããŸã§ãäžèšã¯åã®ããŒã ã®ã«ã«ãã£ãŒãèª²é¡æããæ»²ã¿åºãŠããè§£éã§ãããäžäŸã§ããä»ããŒã ã§å®æœããã°å¥ã®è§£éããããšæããŸãã 以äžãç°¡åã§ã¯ãããŸãããã¹ã¯ã©ã ã®èµ€ç¹å¯Ÿçã«å¿
èŠãª2ã€ã®ãèãæ¹ããã玹ä»ããŸãããã¹ã¯ã©ã ã§éåæãæãããããã±ãããããããããã¯ãããžã§ã³ãããããã¡ã³ããŒã®ç®ç·ã¯ãã£ãŠãããïŒããæèããŠã¿ãŠãã ããã èµ€ç¹ãè±ããä»ãå人çã«ã¯ãé¢ãã£ãŠããã¡ã³ããŒå
šå¡ãçãçãããŠããããæ¥œããã§ãããããåžžã«æèããããã«ããŠããŸãã ãŸãšã ã¹ã¯ã©ã ã¯ãçŸç¶ãçŽ æ©ãæ£ç¢ºã«ææ¡ãã課é¡ãçãåºããã¬ãŒã ã¯ãŒã¯ãã§ãã å人æã§ã¯ãªããããŒã 掻åã§ããããšãå¿ããªã ã¹ã¯ã©ã ã¬ã€ãã®ãã¹ã¯ã©ã çè«ãã䟡å€åºæºããããŒã ã§è§£éãããèãæ¹ããçµ±äžããããšãèµ€ç¹å¯Ÿçã«æå¹ åèè³æ ã¹ã¯ã©ã ã¬ã€ãæ¥æ¬èªçïŒ2020å¹ŽïŒ https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf  ã¹ã¿ã³ãã€ã®ãããã¯ããçµç¹ã«ã€ããŠè©³ããç¥ãããæ¹ã¯ãæ°è»œã«ãçžè«ãã ããã www.wantedly.com