ããã«ã¡ã¯ãAndroidãšã³ãžãã¢ã®ã¯ã( @ haru2036 )ãšã·ã£ã ïŒ @arus4869 ïŒã§ãïŒ ç§ãã¡ã¯2023幎6æ8-9æ¥ã«ã¢ã¡ãªã«åè¡åœãµã³ãã©ã³ã·ã¹ã³ã§éå¬ããã droidcon San Francisco 2023 ã«åå ããŠããŸããã ååã®ã€ãã³ãå ±åç·šã«åŒãç¶ããå®éã®ã»ãã·ã§ã³ã玹ä»ããŠãããããšæããŸãã tech.timee.co.jp ç¹ã«æ°ã«ãªã£ãã»ãã·ã§ã³(haruç·š) Mobile Feature Flags and Experiments at Uber ã¯ããã«åãäžããã®ã¯Uberã®Mahesh HadaãããšArun Babu A S Pããã«ããUberã§ã®Feature Flagéçšã«é¢ããã»ãã·ã§ã³ã§ãã Uberã§ã¯å€§éã®Feature FlagãExperimentalãªFeatureã管çããããã«ç¬èªã®Feature Flagèªåçæãªã©ã®åãçµã¿ãè¡ã£ãŠããããã§ããããã£ãFlagã®Fetchãããã¿ã€ãã³ã°ããµãŒãã¹ã®æ§è³ªäžã倧ããäœçœ®æ
å ±ãå€åãããšãããªã©ç¹æ®ãªãã®ããããšããããšã§ããïŒæ¥æ¬ããæž¡èªããŠããã°ããã®ç§ã®ç«¯æ«äžã§ããããããªã¬ãŒãšããFlagã®Fetchãèµ°ã£ãŠããã ãªãããšè¬ã®å®æãæã¡ãªããèããŠããŸããïŒã ãŸãããããã£ãFlagã«ãã£ãŠåé¡ãèµ·ããæã«ã§ããéãæ©ãããŒã«ããã¯ããããã«FCMãçšããŠç·æ¥ããŒã«ããã¯çšã¡ãã»ãŒãžãéä¿¡ããŠãããšãã話ãèããæã¯ãªããªãè¡æãåããŸããã ã¿ã€ããŒã§ãFirebase Remote Configãªã©ã䜿ã£ãFeature Flag管çãè¡ã£ãŠããã®ã§ããããããšã¯æ¡å€ãã«å€§èŠæš¡ã§å³ææ§ã®é«ã管çãè¡ãããŠããŠãããã ãªãšæããŸããã äžèšã®ç·æ¥ããŒã«ããã¯ã®è©±ãªã©ãäžçã§å±éããŠãã倧ããªãµãŒãã¹ãªãã§ã¯ã®ææ³ãç¥ãããšãã§ããã»ãã·ã§ã³ã§ããã Unlocking the Power of Shaders in Android with AGSL and Jetpack Compose 次ã«åãäžããã®ã¯Rikin Marfatiaããã®AGSLãJetpack Composeã§äœ¿ãã»ãã·ã§ã³ã§ãã AGSLã¯Androidäžã§å©çšã§ããã·ã§ãŒãèšèªã§ãGPUã䜿çšããŠç»é¢ãæç»ããããšãã§ããŸãã ç§ã¯è¶£å³ã§Unityãªã©ã§ã·ã§ãŒããæ±ã£ãŠããã®ã§ããããããšãã䌌ãèšæ³ã®AGSLãçšããããšã§èŠèŠçã«ãªãããªUIãå®çŸããããšãã§ããããã§ããã å®éã«ãã¢ãšããŠç޹ä»ãããŠããUIã¯ãã¿ã³ãé»çã®ããã«å
ã£ãããåçã®ã£ã©ãªãŒã®åãæ¿ãæã«è²åå·®ãçºçããããªã©ã®ãšãŠã掟æãªè¡šçŸã§ãããããããComposeäžã§ç°¡åã«å®çŸã§ããããšã«æåããŸããã AGSLã«ã€ããŠã¯ãã¡ãâ developer.android.com Reimagining text fields in Compose æåŸã«åãäžããã®ã¯Googleã®Zach Klippensteinããã«ããJetpack Composeã«ãããTextFieldã®æãç«ã¡ãšããããã«ã€ããŠã®ã»ãã·ã§ã³ã§ãã å€ãã®ãããã¯ããšåæ§ã«ãMVPããå§ããŠãŠãŒã¶ãŒã¹ã¿ãã£ãç¹°ãè¿ããªããéçºããŠãã£ããããªã®ã§ããããããŸãå€ãã®ãããã¯ããšåæ§ã«çŸåšã§ã¯æè¡çè² åµã貯ãŸã£ãŠããŠããŸã£ãŠããããã§ãã ããã§ããããè§£æ¶ãã¹ã倧ããAPIã倿ŽããBasicTextField v2ãéçºããŠããããã§ãããŠãŒã¶ãŒã¹ã¿ãã£åå è
ãåéäžã ãïŒãšã®ããšã§ããåå ããŠã¿ãããªãã Googleã§ã®Composeéçºã®èå°è£ãšãTextFieldã®æªæ¥ãåæã«ç¥ãããšãã§ããäžç²ã§äºåºŠçŸå³ããã»ãã·ã§ã³ã§ããã speakerdeck.com ç¹ã«æ°ã«ãªã£ãã»ãã·ã§ã³(syamç·š) 次ã«syamãç¹ã«æ°ã«ãªã£ãã»ãã·ã§ã³ã玹ä»ããŠãããŸãïŒ Navigating the Unknown: Tips for Efficiently Learning a New Codebase ADAM GREENBERGããã«ããã»ãã·ã§ã³ã玹ä»ããŸãã æ°ããã³ãŒãããŒã¹ãçè§£ãããã®ç¥èãæŽ»çšããããã®å
·äœçãªææ³ãšæŠç¥ã«ã€ããŠæ·±ãæãäžããã»ãã·ã§ã³ã§ããã ADAM GREENBERGãã ã¯ãèªèº«ã®çµéšãåºã«ãã³ãŒãããŒã¹ã®çè§£ãããã¥ã¡ã³ããŒã·ã§ã³ã®äœæããããŠãã®ç¥èã®å
±æãšãã3ã€ã®äž»èŠãªã¹ããããäžå¿ã«ã話ãããŠããŸããã 以äžã«ã»ãã·ã§ã³ã§è§ŠããïŒã€ã®éèŠãªã¹ãããã«ã€ããŠè§ŠããŸãã 1. ã³ãŒãããŒã¹ã®çè§£ æ°ãããããžã§ã¯ããæ¢åã®ã³ãŒãããŒã¹ã«åãçµãéçºè
ã«ãšã£ãŠãã³ãŒãããŒã¹ã®çè§£ã¯éåžžã«éèŠãªã¹ãããã§ãããã³ãŒãããŒã¹ã®çè§£ãä¿é²ãããããã«ã¯ã¢ãŒããã¯ãã£å³ã®äœæããããã°ããŒã«ã®äœ¿çšãªã©ãéèŠã§ãããšè©±ããŠããŸããã 2. ããã¥ã¡ã³ããŒã·ã§ã³ã®äœæ ããã¥ã¡ã³ããŒã·ã§ã³ãããããšã¯ãåŠãã ããšæ¯ãè¿ã£ãããä»ã®äººã
ãšå
±æããããã®éèŠãªã¹ãããã§ãããšèª¬ããŠããŸããã¢ãŒããã¯ãã£å³ã®äœæãéèŠãªæ©èœã®èª¬æãç¹å®ã®ã³ãŒãã¹ããããã®èª¬æãªã©å¿
èŠã«å¿ããŠããã¥ã¡ã³ããŒã·ã§ã³ããå¿
èŠããããšè©±ããŠããŸããã 3. ç¥èã®å
±æ ä»ã®éçºè
ãèªåã®ç¥èãå©çšããã³ãŒãããŒã¹ããã广çã«å©çšããããã®éèŠãªã¹ãããã§ãããã®ã¹ããããããŒã å
šäœã®çç£æ§ãšå¹çãåäžãããåã
ã®éçºè
ãèªèº«ã®çè§£ãæ·±ããã®ã«åœ¹ç«ã€ãšè¿°ã¹ãŸããã ãã®ã»ãã·ã§ã³ã¯ãæ°ããã³ãŒãããŒã¹ã广çã«çè§£ãããã®ç¥èãæŽ»çšã»å
±æããããã«å€§äºãªãã€ã³ããã話ãããŠããŸããã ã¡ããã©åãã¡ã®ããŒã ããªã³ããŒãã£ã³ã°ãå
±éèªç¥ããšãããã®READMEãäœæããŠããããšããããåœããåã®ããšãããããŸããããæ¹ããŠèãããšãã§ããã®ã§ãã®ã»ãã·ã§ã³ã¯æçšã§ããã Find your way with GoogleMap() {} 次ã¯ã BRIAN GARDNERããã«ããã»ãã·ã§ã³ã玹ä»ããŸãã ãã®ã»ãã·ã§ã³ã§ã¯ããã®å¯èœæ§ãå
·äœçã«ç€ºãããã«ããããã®è¡šç€ºãããŒã«ãŒã®è¿œå ããããŠã¯ã©ã¹ã¿ãªã³ã°ãšãã£ãåºæ¬çãªæ©èœãã©ã®ããã«ç°¡åã«å®è£
ã§ããã®ããåŠã³ãŸããã ç¹ã«å°è±¡çã ã£ãã®ã¯ã倧éã®ããŒã«ãŒãå¹ççã«è¡šç€ºããããã®ã¯ã©ã¹ã¿ãªã³ã°æ©èœã§ããããŒã«ãŒã®æ°ãå¢ãããšãå°å³ãæ··éãããŠãŒã¶ãŒãç¹å®ã®ããŒã«ãŒãèŠã€ããã®ãé£ãããªããŸããããããã¯ã©ã¹ã¿ãªã³ã°ã䜿çšããããšã§ãè¿æ¥ããããŒã«ãŒãäžã€ã®ã¯ã©ã¹ã¿ãšããŠè¡šç€ºã§ããå°å³ã®èŠããããšããã©ãŒãã³ã¹ãåäžãããããšãã§ãããšã®ããšã§ãã ãŸãããã®ã»ãã·ã§ã³ã§ã¯ãå
·äœçãªå®è£
æ¹æ³ã確èªããããã®ãœãŒã¹ã³ãŒããæäŸãããŸããã JetpackComposeã®GoogleMapã䜿çšããéã«ããã€ã泚æç¹ãè¿°ã¹ãŠããŸããã ã¯ã©ã¹ã¿ãªã³ã°ã«ã€ããŠã®æ³šæç¹ãšããŠãMarkerãClusteringå
ã§äœ¿çšããªãããã«ãšã®èŠåãããããã¯ã IllegalStateException ãåŒãèµ·ããå¯èœæ§ãããããã§ãã ãŸããããã©ãŒãã³ã¹ãåäžã®ããã« MapsInitializer.initialize(context, MapsInitializer.Renderer.LATEST) ã䜿çšããŠãææ°ã®ã¬ã³ãã©ãŒãå©çšããããšãæšå¥šããŠããŸããã ããã«ãPaparazziãã¹ãã§ãç¹ã«ãã¬ãã¥ãŒã¢ãŒãã§ã®æ©æãªã¿ãŒã³ãå©çšããŠãã¬ã€ã¢ãŠããä¿æããããã®Boxãè¿ããšè¯ããšã®ããšã§ããã ANRåé¡ã«ã€ããŠãè§ŠããããŠããŸããããå
·äœçãªè§£æ±ºçã¯èãåããªãã£ãã®ã§ã調ã¹ãŠã¿ããããªãšæããŸãã ã¡ããã©GoogleMapåšããã³ã³ããŒãºåããŠããæã ã£ãã®ã§ããšãŠãæãé£ãã£ãã§ãã ã»ãã·ã§ã³ã¹ã©ã€ã speakerdeck.com ãœãŒã¹ã³ãŒã github.com Animating content changes with Jetpack Compose æåŸã« KINNERA PRIYA PUTTIããã«ããã»ãã·ã§ã³ã玹ä»ããŸãïŒ Jetpack Compose for Desktopã䜿ã£ãŠã¹ã©ã€ããäœã£ãŠãããéæã«ã¢ãã¡ãŒã·ã§ã³ãåãããããã¬ãŒã³ããŒã·ã§ã³ã§ããïŒ KINNERA PRIYA PUTTIãã ã¯èªèº«ã®å®è·µãèžãŸããUIã¢ãã¡ãŒã·ã§ã³ãããé
åçã«ããããã®åçš®ã¢ãã¡ãŒã·ã§ã³ãã¯ããã¯ã«ã€ããŠèªã£ãŠãããŸããã 以äžã«ã»ãã·ã§ã³ã§ç޹ä»ãããæ³šç®ãã¹ããã¯ããã¯ã«ã€ããŠè§ŠããŠãããŸãã 1. CrossFadeã«ããã³ã³ãã³ãéã®åãæ¿ã æ°æ§ã®ç»é¢ãèŠçŽ éã®ãã©ã³ãžã·ã§ã³ãæ»ããã«ããCrossFadeã¯ããŠãŒã¶ãŒãã¢ããªã®äœ¿çšäžã«æããéåæã軜æžããããã®éåžžã«éèŠãªèŠçŽ ã§ãã圌ã¯ããããããã«èªç¶ãªãŠãŒã¶ãŒäœéšãçããã«ã€ããŠèªã£ãŠããŸããã 2. animateContentSizeã«ããã³ã³ãã³ããµã€ãºã®ã¢ãã¡ãŒã·ã§ã³å ã³ã³ãã³ãã®ãµã€ãºã倿Žããå¿
èŠãããå ŽåãanimateContentSizeãçšãããšãã®å€æŽããªãããã«ãªããŸããããã¯ããŠãŒã¶ãŒãèªç±ã«ã³ã³ãã³ãã®ãµã€ãºã調æŽã§ããããã«ããããã®éèŠãªã¹ãããã§ãããšåœŒã¯ææããŠããŸããã 3. åçš®UIèŠçŽ ã«å¯Ÿããã¢ãã¡ãŒã·ã§ã³ã®è¿œå ãªã¹ãã詳现ç»é¢ãããã²ãŒã·ã§ã³ããã¯ãŒãããã ã·ãŒãããã€ã¢ãã°ãªã©ã®UIèŠçŽ ã«ã¢ãã¡ãŒã·ã§ã³ã远å ããããšã§ããŠãŒã¶ãŒãã¬ã³ããªãŒãªUIãå®çŸããæ¹æ³ã«ã€ããŠå
·äœçã«èªãããŸããã ãã®ãã¬ãŒã³ããŒã·ã§ã³ã¯ãJetpack ComposeãæŽ»çšããŠããŠãŒã¶ãŒã«ãšã£ãŠäœ¿ãããããé
åçãªUIã¢ãã¡ãŒã·ã§ã³ãåµåºããããã®éèŠãªãã€ã³ããæäŸããŠããŸããã æã
ã®ããŒã ãUIéçºã«ãããã¢ãã¡ãŒã·ã§ã³ã®æŽ»çšã«åãçµãã§ããããã®ãããªæ°ããªèŠç¹ãã¢ã€ãã¢ãåŸãããããšã¯éåžžã«ææçŸ©ã§ããã ãŸãšã ä»åã¯ã»ãã·ã§ã³ã®å
容ãããã€ãæç²ããŠç޹ä»ãããŠé ããŸããã ãããã詳ããå
å®¹ãæµ·å€ã«ã³ãã¡ã¬ã³ã¹ã®æ§åã«èå³ãæã£ãŠããã ããããã«ãžã¥ã¢ã«é¢è«ã§ã話ãããããšãã§ããŸãã®ã§æ¯éäžåºŠã話ãããŸãããïŒ product-recruit.timee.co.jp
ã¯ããã« ããã«ã¡ã¯ãAndroidãšã³ãžãã¢ã®ã¯ã( @ haru2036 )ãšã·ã£ã ïŒ @arus4869 ïŒã§ãïŒ ç§ãã¡ã¯2023幎6æ8~9æ¥ã«ã¢ã¡ãªã«åè¡åœãµã³ãã©ã³ã·ã¹ã³ã§éå¬ããã droidcon San Francisco 2023 ã«åå ããŠããŸããã ã¿ã€ããŒã§ã¯ KaigiPass ãšããã«ã³ãã¡ã¬ã³ã¹åå è£å©å¶åºŠãããããã®æµ·å€åå 第äžå·ãšããŠç§ãã¡ãåå ããŠãã圢ã«ãªããŸãã ç§ãã¡ãéçºã»éå¶ããŠãã ã¿ã€ã㌠ã¯ãã¯ãŒã«ãŒãããå©çšããããã«ã¢ãã€ã«ã¢ããªãå¿
èŠäžå¯æ¬ ãªãµãŒãã¹ãšãªã£ãŠããããã®éçºã«é¢ããç¥èŠãåºãåŸãããã«åå ããŠããŸããã ããã¯äŒæ¥ãéãŸããµã³ãã©ã³ã·ã¹ã³ã§ã®ã«ã³ãã¡ã¬ã³ã¹ã¯å
容ãããã§ããæ
å ±ã®æ°é®®åºŠãšããããæå³ã§ãè¯ãåºæ¿ã«ãªãããšãŠãææçŸ©ãªçµéšãããããšãã§ããŸããã äŒå Žã®ããã äŒå Žãšãªã£ãã«ãªãã©ã«ãã¢å€§åŠãµã³ãã©ã³ã·ã¹ã³æ ¡ã¯ãå»åŠåéãäž»ã«ãªã£ãŠããããã§ãã«ã³ãã¡ã¬ã³ã¹ã»ã³ã¿ãŒã®ããé£ã«ãªãããªã»ã³ã¿ãŒã®ãããªãã®ããã£ããããŸãããããèšã£ãæå³ã§ã¯ãœãããŠã§ã¢ã®ã«ã³ãã¡ã¬ã³ã¹äŒå ŽãšããŠã¯çµæ§ç°è²ãªã®ã§ã¯ãªãã§ããããã ãŸããåœå
ã®ã«ã³ãã¡ã¬ã³ã¹ãšæ¯ã¹ãŠã¹ãã³ãµãŒã®å±€ãçµæ§éããšããææ³ãæ±ããŸããã åœå
ã«ã³ãã¡ã¬ã³ã¹ã§ã¯å€ãã®å ŽåAndroidãã©ãããã©ãŒã äžã§ãµãŒãã¹ãå±éããŠããäºæ¥äŒç€Ÿãã¹ãã³ãµãŒãããŠããã±ãŒã¹ãå€ãã®ã§ããããããšæ¯èŒãããšSentry, Bitrise, DataDogãªã©ã»ãšãã©ã®äŒç€Ÿãäºæ¥äŒç€Ÿã«å¯ŸããŠéçºããµããŒããããµãŒãã¹ãæäŸããŠããäŒç€Ÿã ã£ãã®ãè峿·±ãã£ãã§ãã https://twitter.com/arus4869/status/1666885385597898752?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1666885385597898752%7Ctwgr%5Eb44440b405611dde3ca583c63950f1096c7d8b21%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.notion.so%2Ftimee%2Fd5096f7c9c0647b2a036b7393917e7b7 My first time abroad was #dcsf23 and it was really good. Thanks to the very helpful sessions and kind people! pic.twitter.com/MhtTpYF2ms — ã¯ã (@haru2036) 2023幎6æ10æ¥ å®éã«ããŒã¹åºå±ããŠããæ§ã
ãªäŒç€Ÿã®ããã«ãã£ãããã ããŸããã droidcon sanfransiscoTã·ã£ãã¯å
¥å Žè
ç¹å
žã§ã¿ããªããããã¿ããã§ãïŒ ãããéŽäžãå€ãå°è±¡ã§ããã ã©ãã®äŒç€Ÿã®ã¹ããã«ãŒãè¯ãã£ãã®ã§ãããdroidconã¹ããã«ãŒãäžã§ãå¬ããã£ãã§ã ãŸããäŒå Žã§ã¯äžæ¥ãéããŠé£äºã飲ã¿ç©ãæäŸãããŠããã®ã§ãããå
šãŠå±å€ã§æäŸãããŠããåå è
ã®æ©ãã®å Žãšãªã£ãŠããŸãããç§ïŒã¯ãïŒãæã¯é¡ãããã®ãµã€ãºãããã¯ãã¯ããµã³ãããããªããã³ãŒããŒã飲ãã§ããŸããïŒç¬ïŒ ã©ã³ãã®æéã®å±å€ã§ã¯èŠç¥ãã¬äººã§ã掻çºã«è©±ããããŠçãäžãã£ãŠãããšãããå€ããç§ãåããŠäŒãæ¹ãšã話ãããããšãå€ãã£ãã§ãã å®éã®ã»ãã·ã§ã³ã®å
容ã«ã€ããŠã¯åŸæ¥æçš¿ããã»ãã·ã§ã³å
容線ãã芧ãã ããïŒ tech.timee.co.jp åããŠã®æµ·å€ã«ã³ãã¡ã¬ã³ã¹ã«åå ããŠã¿ãŠ ä»ååããŠæµ·å€ã«ã³ãã¡ã¬ã³ã¹ã«åå ããŠã¿ãç§ãã¡ã§ããããå°è±¡çã ã£ãã®ã¯å
è¿°ã®ã¹ãã³ãµãŒã®éãã ãã§ã¯ãããŸãããã»ãã·ã§ã³èªäœã®å
容ããå
šäžçã§ãµãŒãã¹ãæäŸããŠããUberã®ãããªäŒæ¥ã«ããå®éã®å®è£
ã®è§£èª¬ããAndroidãšãããã©ãããã©ãŒã èªäœãæäŸããŠããGoogleèªèº«ã«ãããã¬ãŒã ã¯ãŒã¯èªäœã«ã€ããŠã®è§£èª¬ãä»åŸã®äºå®ã®çºè¡šãªã©ãäžæ¬¡æ
å ±ã«çŽæ¥è§ŠããŠããæèŠããšãŠã匷ãã€ãã³ãã§ããã ãŸããæ¥æ¬ã§ãããã®äžã§âªïžâªïžäœ¿ã£ãŠãæ¹ã©ã®ãããããã£ããããŸãããïŒããšè³ªåããçºè¡šè
ã®æ¹ã¯å€ãã§ãããä»åã®ã€ãã³ãã§ã¯ããã«å€ãã®ã¹ããŒã«ãŒãããèšã£ã質åãæãããããããŠããŸããã ãŸããçµæ§ãªç¢ºçã§ãžã§ãŒã¯ãæãã§ããã¹ããŒã«ãŒãå€ãããã®èŸºãã®è©±è¡ã¯èªåãçºè¡šããéã«ãèŠç¿ããããªããšæããŸããã ãŸããä»åã®ãã¬ã³ããšããŠå€ãã»ãã·ã§ã³ããã£ãã®ã¯Jetpack Composeã«é¢ãã話é¡ã§ããã¯ãäžçäžã®Androidéçºè
ãèå³ãæã£ãŠãããããã¯ãªãã ãªãšæããŸããã ããŸã ãã£ãããµã³ãã©ã³ã·ã¹ã³ã«è¡ã£ãã®ã§ãè¿ãã«ããããã€ãã®ãšãŠãè¡ãããã£ãå Žæã«è¡ã£ãŠããŸããïŒ Computer History Museum (ããŠã³ãã³ãã¥ãŒ) è奮ã®ããŸã建ç©ã®åçãæ®ãå¿ããŸããâŠâŠ ã³ã³ãã¥ãŒã¿ã«é¢ãã人ãªã人çã§äžåºŠã¯ãã²è¡ã£ãŠãããããComputer History Museumã念é¡ããªã£ãŠããããšãã§ããŸãããããã°ããèšç®å°ºãªã©ã®éå
·ããå§ãŸããã³ã³ãã¥ãŒã¿ç§åŠã®ç¶ãšåŒã°ããŠããã¢ã©ã³ã»ãã¥ãŒãªã³ã°ãè§£èªãããšãã°ãæå·æ©ã®å®æ©ããGUIãåããŠæèŒããã³ã³ãã¥ãŒã¿ã§ããXerox AltoãiPhoneã®ãå
ç¥æ§ãšèšããªãããªãNewton MessagePad, ãããŠ2021幎ã«çºå£²ãããã°ããã®AIçšè¶
巚倧ããã»ããµãCerebras Wafer Scale Engine 2ãªã©ã³ã³ãã¥ãŒã¿ã®å§ãŸãããçŸåšã«è³ããŸã§ã®ãšããã¯ã¡ã€ãã³ã°ãªã³ã³ãã¥ãŒã¿ãã¡ã倿°åèµãããŠããŸããã åšããå°ãæ£çããã ãã§Googleã®ããŽãå
¥ã£ã建ç©ã ããã®ãšãªã¢ã«è¿·ã蟌ãã§ããŸãã®ã§ããããã·ãªã³ã³ãã¬ãŒïŒãšããæãã®å Žæã§ããã Twitter Xæ¬ç€Ÿ åœæã¯ããã®çæ¿ãå€ãããšã¯æããŸããã§ããããTwitterã®çæ¿ãå€ããåã«èŠãããšãã§ããŠããã£ãã§ãïŒ ãŸãšã ä»åã®æµ·å€ã«ã³ãã¡ã¬ã³ã¹ãžã®åå ã§ã¯ãåž°åœããŠããã«ã³ãŒãããŒã¹ã®æ¹åã«æŽ»ãããæ
å ±ãããããããã®Androidãåãå·»ãæ
å ±ãŸã§ã®å¹
åºãç¥èŠãã¡ã ãã§ã¯ãªããå®éã«ãã®å Žã«ããããšã«ãã£ãŠåŸãããèæèŠã®ãããªãã®ãæµ·å€ã®éçºè
ãšã®æ°ããåºäŒããªã©ã絶察ã«ãã®å Žã«ããªããšåŸãããªããã®ãããããæã¡åž°ã£ãŠããããšãã§ãããšæããŸãã ãŸããã¿ã€ããŒã§ã¯äžç·ã«ãµãŒãã¹ãæé·ãããŠããæ¹ãåéããŠããŸããããå°ãã§ãèå³ãæã£ãŠããã ããããã«ãžã¥ã¢ã«é¢è«åãä»ããŠãããŸãã®ã§æ¯éäžåºŠã話ãããŸãããïŒ product-recruit.timee.co.jp
ããã«ã¡ã¯ããããã³ã°é åã§ããã¯ãšã³ããšã³ãžãã¢ãããŠãããœãã²ã§ ( @pokohide ) ã§ãã ååã¯Rails edgeã§CIãåãå§ãã話ã玹ä»ããŸããã tech.timee.co.jp ä»åã¯ãå®éã«åŒç€Ÿã§CIãRails edgeã§åãå§ããäºã§èŠã€ãããšã©ãŒã®äŸã玹ä»ããŠãããŸããèšäºå
¬éæç¹ïŒ2023幎7æïŒã®ããŒãžã§ã³ã¯äžèšã®éãã§ãã $ ruby -v ruby 3.2.2 (2023-03-30 revision e51014f9c0) +YJIT [aarch64-linux] $ rails -v Rails 7.0.6 ActiveRecord::DangerousAttributeError object_id is defined by Active Record ãã®ãšã©ãŒã«é¢ããåèèšäºã¯ãã¡ãã§ãã euglena1215.hatenablog.jp äžéšã®ã¢ãã«ã§ object_id ãšããã«ã©ã åãå®çŸ©ããŠãããã以äžã®ãããªãšã©ãŒãçºçãããã®ã¬ã³ãŒããçæããŠãããã¹ããè»äžŠã¿èœã¡ãŸããã ActiveRecord::DangerousAttributeError: object_id is defined by Active Record. Check to make sure that you don't have an attribute or method with the same name. # /usr/local/bundle/gems/factory_bot-6.2.1/lib/factory_bot/decorator/new_constructor.rb:9:in `new' # /usr/local/bundle/gems/factory_bot-6.2.1/lib/factory_bot/decorator.rb:16:in `send' ... Objectã¯ã©ã¹ã§ããªãŒããŒã©ã€ãããããšäºæãã¬åœ±é¿ãäžãããã¡ãœããåãšåãååãå©çšã§ããªããªã£ãããã§ããã object_id ã«éãã dup , freeze , hash , class , clone ãªã©ãå©çšã§ããªããªãã®ã§ãããã£ãã«ã©ã åã䜿ããªãããã«ããå¿
èŠããããŸãã ãã®ãšã©ãŒã¯ object_id ã object_identifier ãšãªããŒã ããäºã§å¯Ÿå¿ããŸããã Rails7.0.5.1ããã® create_association ã®æåå€åã«ãããšã©ãŒ å··ã§è©±é¡ã®create_associationã®æå倿Žã«ãããšã©ãŒã§ããæ¢åã¬ã³ãŒããååšããå Žåã«ãŠããŒã¯å¶çŽã«ããããªããŒã·ã§ã³ãšã©ãŒãçºçãããšãã£ãŠãã¹ãã±ãŒã¹ããããŸãããããã¡ãã®ãã¹ããèœã¡ãŸãããRails edgeãåãå§ããé ã¯Rails v7.0.4ã ã£ãããããã®ãšã©ãŒã«ééããŸããã Rails v7.0.5.1ãã create_association ã®æåããå¥ã
ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§insertããŠããdeleteããããããåäžãã©ã³ã¶ã¯ã·ã§ã³ã§deleteããŠããinsertãããã«å€ãããŸããããã®åœ±é¿ã«ãããDBã®ã¬ã³ãŒãã«äŸåããããªããŒã·ã§ã³ïŒäŸïŒ validates_uniquness_of ïŒãå¹ããªããªããŸããããã®æåå€åã«é¢ããå
容ã¯ãã¡ãããåèãã ããã blog.willnet.in parser gemãå©çšããŠcreate_associationã®åŒã³åºãç®æã調æ»ãã圱é¿ç¯å²ãäžã€ãã€ç¢ºèªãå¿
èŠãªç®æã«æ¡ä»¶æã远å ãããªã©ããŠå¯Ÿå¿ããŸããã æ¢ã«ãªãªãŒã¹ãããŠãã倿Žã§ã¯ãããŸãããRails edgeã§CIãåãå§ããããšã§æ©æã«åé¡ãçºèŠã§ããcreate_associationåé€ããåã«æ€èšŒãæãæ°ãããªãã·ã§ã³ã®ææ¡ãrails/railsãžã®PR *1 ãéããŠè¡ããªã©ããŸããã NoMethodError: undefined method `reading_role' for ActiveRecord::Base:Class Rails7.1ãã ActiveRecord::Base.reading_role ããªããªãããããã®èšè¿°ãè¡ã£ãŠããç®æã®ãã¹ããèœã¡ãŸããã irb(main): 002 : 0 > ActiveRecord :: Base .reading_role { " severity " : " WARN " , " message " : " DEPRECATION WARNING: ActiveRecord::Base.reading_role is deprecated and will be removed in Rails 7.1. \n Use `ActiveRecord.reading_role` instead. \n (called from xxxxx) " } => :reading irb(main): 003 : 0 > ActiveRecord :: Base .writing_role { " severity " : " WARN " , " message " : " DEPRECATION WARNING: ActiveRecord::Base.writing_role is deprecated and will be removed in Rails 7.1. \n Use `ActiveRecord.writing_role` instead. \n (called from xxxxx) " } => :writing ãã®åé¡ã«é¢ããŠã¯å
ã
åºãŠããWarningã®å
容ã«åŸãã ActiveRecord.reading_role ã代ããã«äœ¿ãäºã§å¯Ÿå¿ããŸããã partialsã«ã€ã³ã¹ã¿ã³ã¹å€æ°ãlocalsãšããŠæž¡ãæåãåé€ãããããšã«ãããšã©ãŒ åŒç€Ÿã§ã¯è«æ±æžïŒPDFïŒãçæããããã« ActionController::Base#render_to_string ãçšããŠHTMLæååãååŸããŠããŸãããã®åŠçã®äžã§partialsã«ã€ã³ã¹ã¿ã³ã¹å€æ°ãlocalsãšããŠæž¡ããŠããŸããããããã§ãšã©ãŒãçºçããŸããã ä»ãŸã§WarningãåºãŠããå
容ã§ã¯ãããŸãããRails7.1ããã€ã³ã¹ã¿ã³ã¹å€æ°ãlocalsã§æž¡ããªããªã£ãããã§ã *2 ã ã€ã³ã¹ã¿ã³ã¹å€æ°ã§ã¯ãªãããŒã«ã«å€æ°ãšããŠæž¡ãããšã§å¯Ÿå¿ãäºå®ããŠããŸãã before_type_castã®è¿ãå€ã®åãå€ãã£ãããšã«ãããšã©ãŒ # create_table :posts, force: true do |t| # t.integer :foo, default: 1, null: false # end class Post < ActiveRecord :: Base enum foo : { x : 1 , y : 2 } end Integeråã§Enumãå®çŸ©ããŠããã«ã©ã foo ãæã€ã¢ãã«ã®ã¬ã³ãŒãã«å¯Ÿã㊠record.foo_before_type_cast ã§åç
§ãããšãå
ã
ã®ç°å¢ã§ã¯Integeråã§è¿ã£ãŠãããã®ããRails edgeç°å¢äžã§ã¯Stringåã§è¿ãããã«ãªã£ãããèœã¡ãŠãããã¹ãã±ãŒã¹ãèŠã€ããŸããã record = Post .new( foo : :x ) # æ€èšŒåœæã®ç°å¢(Rails v7.0.6) record.foo_before_type_cast => 1 # Rails edge record.foo_before_type_cast => " 1 " ä»åã®ãšã©ãŒãåçŸããã³ãŒã *3 ãçšæãã git bisect *4 ãå©çšããŠäºåæ¢çŽ¢ã§æåãå€ãã£ããã³ãããã調æ»ããŸããããã®åŸã®ã³ããããPRã远ã£ããšãããrails v7.1ããDBã®åã§å€ãååŸãã *_for_database ã远å ãããŠããããšã«æ°ã¥ããããããã®å®è£
ãããã¯ããŒãããŠäœ¿ãããã«ä¿®æ£ããããšã§å¯Ÿå¿ãè¡ããŸããã # frozen_string_literal: true case Rails :: VERSION :: STRING when /^ 7 \. 0 / # 以äžã®å®çŸ©ãèªã¿èŸŒãããã«äœãããªãã when /^ 7 \. 1 / # v7.1 ã«ã¯å«ãŸããŠããããèªã¿èŸŒãŸãªãã return else # v7.2 以éã§åé€ãå¿ããªãããã«äŸå€ãæããã raise ( ' Consider removing this patch ' ) end module ActiveRecord module AttributeMethods module BeforeTypeCast # refs: https://github.com/rails/rails/pull/46283 def read_attribute_for_database (attr_name) name = attr_name.to_s name = self .class.attribute_aliases[name] || name attribute_for_database(name) end end end end æåŸã« ä»åã¯ãRails edgeã§CIãåãããšã«ãã£ãŠèŠã€ããå°æ¥åããªããªãã³ãŒãã®æ©æçºèŠããã®å¯Ÿå¿ãåå ã«ã€ããŠã®ç°¡åãªè§£èª¬ãè¡ããŸããããŸã玹ä»ããããŠããªãã§ããããšã©ãŒã ãã§ãªãRails 7.2ããã®å»æ¢äºå®ãç¥ãããWarningãããã€ã確èªã§ããŸããã Rails edgeå°å
¥åœåã¯112åã®ãã¹ãã±ãŒã¹ãèœã¡ãŸããããåŸã
ã«å¯Ÿå¿ãè¡ãªã£ãŠããèœã¡ããã¹ãã±ãŒã¹ã¯22ä»¶ã«ãŸã§æžããŸããããããã£ã掻åãç¶ç¶ããããšã§RubyãRailsã®ã³ãã¥ããã£ã®é²åã«è¿œéã§ããã®ã§åŒãç¶ãé 匵ã£ãŠããããšæããŸãã ã¿ã€ããŒã§ã¯äžç·ã«ãµãŒãã¹ãæé·ãããŠããæ¹ãåéããŠããŸããããå°ãã§ãèå³ãæã£ãŠããã ããããã«ãžã¥ã¢ã«é¢è«åãä»ããŠãããŸãã®ã§æ¯éã話ãããŸãããïŒ product-recruit.timee.co.jp *1 : https://github.com/rails/rails/pull/48643 *2 : https://github.com/rails/rails/commit/8241178723d02123734a1efd01c12b9fda2f4fea *3 : https://gist.github.com/pokohide/b310ea180e7de0467360c96debbb8363 *4 : https://git-scm.com/docs/git-bisect
ããã«ã¡ã¯ãã¿ã€ããŒã®ããŒã¿çµ±æ¬éšããŒã¿ãµã€ãšã³ã¹ïŒä»¥äžDSïŒã°ã«ãŒãæå±ã®å°é¢ã§ãã ä»åã¯DSã°ã«ãŒããMLãã€ãã©ã€ã³æ§ç¯æã«æŽ»çšããŠããVertex AI Pipelinesãå¹ççã«éçºããããã®åãçµã¿ã玹ä»ããããšæããŸãïŒ Vertex AI Pipelinesãšã¯ Vertex AI Pipelines ãšã¯ãGoogle CloudãæäŸããŠããMLãã€ãã©ã€ã³ããµãŒããŒã¬ã¹ã«æ§ç¯ã»å®è¡ã§ãããµãŒãã¹ã§ãã Vertex AI PipelinesãæŽ»çšããããšã§ãäžèšã®ãããªããŒã¿ãBigQeuryããååŸããç¹åŸŽéã®äœæã»ããŒã¿ã»ããã®åå²åŸãã¢ãã«ãåŠç¿ãããããªML ãã€ãã©ã€ã³ãæ¯èŒç容æã«æ§ç¯ã§ããŸãã Vertex AI Pipelinesã§æ§ç¯ããMLãã€ãã©ã€ã³ã®ãµã³ãã« Vertex AI Pipelinesã®æŽ»çšäºäŸãšæããããæ¹åç¹ ã¿ã€ããŒã®DSã°ã«ãŒãã§ã¯ãäžèšã®ãããªML ãã€ãã©ã€ã³ãVetex AI Pipelinesã§éçºã»éçšããŠããŸãã ã¯ãŒã«ãŒã«å¯ŸããŠãããããã®åéãåºåãããã€ãã©ã€ã³ ã¯ã©ã€ã¢ã³ãã®é¢è±ãäºæž¬ãããã€ãã©ã€ã³ åçš®KPIãäºæž¬ãããã€ãã©ã€ã³ ML ãã€ãã©ã€ã³ãæ§ç¯ããŠããäžã§ã以äžã®ãããªæ¹åç¹ãæããããŠããŸããã ãã€ãã©ã€ã³ã®ãªããžããªã®ãã£ã¬ã¯ããªæ§æããCI/CDãå
±éåããã Google Cloudäžã§ã®åŠçãå
±éåãããã䜿ãããã圢ã§åŠçãåŒã³åºããããã«ããã åãã€ãã©ã€ã³ã«å¿
ãå
¥ã蟌ãå¿
èŠãããKubeflow Pipelines *1 ã®èšè¿°ãå
±éåããã Vertex AI Pipelinesãå¹ççã«éçºããããã®åãçµã¿ æãããã課é¡ã«å¯ŸããŠãDSã°ã«ãŒãã§ã¯ä»¥äžã®3ã€ã®åãçµã¿ãè¡ãªã£ãŠããŸãã 1. Vertex AI Pipelineséçºçšã®ãã³ãã¬ãŒããªããžããªã®æ§ç¯ cookiecutter ã䜿çšããŠããã€ãã©ã€ã³éçºã«é¢ãããã£ã¬ã¯ããªããCI/CDã«çšããyaml, shell scriptãçæããŠããããã³ãã¬ãŒããäœæããŸããããã€ãã©ã€ã³ã®éçºéå§æã«ãã®ãã³ãã¬ãŒããå©çšããŠããŸãã äžèšã®ããã«cookiecutterã³ãã³ãã§ãããžã§ã¯ããçæãããããžã§ã¯ãåã»ãããžã§ã¯ãã®èª¬æã»Pythonã®ããŒãžã§ã³ã»äœæè
ãå
¥åããããšã§ãéçºçšã®ãã³ãã¬ãŒããçæãããŸãã $ cookiecutter [éçºçšã®ãã³ãã¬ãŒããªããžããªã®ãã¹] > project_name [project_name]: > project_description []: > python_version [3.10.1]: > author [timee-dev]: # Vertex AI Pipelineséçºçšã®ãã³ãã¬ãŒã . âââ .github â  âââ PULL_REQUEST_TEMPLATE.md â  âââ workflows â  âââ CI/CDã®yamlãã¡ã€ã« âââ .gitignore âââ Makefile âââ README.md âââ pyproject.toml âââ src â  âââ pipeline_template â  âââ components â  â  âââ component â  â  âââ ãã€ãã©ã€ã³ãæ§æããã³ã³ããŒãã³ãã®ãœãŒã¹ã³ãŒããšDockerfile â  âââ pipelines â  â  âââ ãã€ãã©ã€ã³ãã³ã³ãã€ã«ãå®è¡ããããã®ãœãŒã¹ã³ãŒã â  âââ pyproject.toml âââ tests âââ ãã¹ãã³ãŒã 2. Google Cloudã®åŠçãéçŽãã瀟å
ã©ã€ãã©ãªã®æ§ç¯ Google Cloudã®Pythonã©ã€ãã©ãª ãã©ããããŠãBigQueryã§ã®ã¯ãšãªå®è¡ã»ã¯ãšãªçµæã®DataFrameåã»ããŒãã«ã®æžã蟌ã¿ããCloud Storageã«ããããã¡ã€ã«ã®I/OåŠçãªã©ãè¡ãã瀟å
ã©ã€ãã©ãªãæ§ç¯ããŠããŸãããã¡ãã®ç€Ÿå
ã©ã€ãã©ãªã¯ãDSã°ã«ãŒãå
šäœã§ä¿å®ã»éçšãè¡ãªã£ãŠãããããŒãžã§ã³ç®¡çãšãããã€ã®èªååãããäžã§ãArtifact Registryã«ãã©ã€ããŒãããã±ãŒãžãšããŠçœ®ããŠå©çšããŠããŸã *2 ããã®ç€Ÿå
ã©ã€ãã©ãªã«é¢ããŠã¯ãVertex AI Pipelinesã«éããVertex AI WorkbenchãCloud Runãªã©ãä»ã®Google Cloudã®ãµãŒãã¹ã§ã®å®è£
ã§ã掻çšãããŠããŸãã ç°¡åãªå©çšäŸãšããŠãSQLãã¡ã€ã«ã®ã¯ãšãªãå®è¡ããŠã pd.DataFrame ãšããŠååŸããåŠçã玹ä»ããŸãã # 瀟å
ã©ã€ãã©ãªããBigQueryé¢é£ã®åŠçããŸãšããŠããã¯ã©ã¹ãimport from [瀟å
ã©ã€ãã©ãªå].bigquery import BigQueryClient # project_idã«Google Cloudã®ãããžã§ã¯ãåãsql_dirã«SQL fileãæ ŒçŽããŠãããã£ã¬ã¯ããªåãæå® bq_client = BigQueryClient(project_id=PROJECT_ID, sql_dir=SQL_DIR) # test.sqlå
ã§Jinjaãã³ãã¬ãŒãã§å®çŸ©ãããŠãããã©ã¡ãŒã¿ãŒãquery_paramsã§åãåããã¯ãšãªã®å®è¡çµæãpd.DataFrameãšããŠåãåã test_df = bq_client.read_gbq_by_file( file_name= 'test.sql' , query_params= dict (loading_start_date=LOADING_START_DATE, loading_end_date=LOADING_END_DATE), ) -- SQL_DIR/test.sql DECLARE LOADING_START_DATE DEFAULT ' {{ loading_start_date }} ' ; DECLARE LOADING_END_DATE DEFAULT ' {{ loading_end_date }} ' ; SELECT * FROM `project_id.dataset_id.table_id` WHERE event_data BETWEEN LOADING_START_DATE AND LOADING_END_DATE 3. Kubeflow Pipelinesã«ãããŠå
±éåã§ããåŠçãéçŽãã瀟å
ã©ã€ãã©ãªã®æ§ç¯ ã³ã³ããŒãã³ãéã®ã¢ãŒãã£ãã¡ã¯ãã®åãæž¡ãã»Cloud Stargeãžã®I/OåŠçããyamlã§å®çŸ©ãããã³ã³ããŒãã³ãã®æ
å ±ãååŸããŠããåŠç *3 ãªã©ãè¡ãã瀟å
ã©ã€ãã©ãªãæ§ç¯ããŠããŸãããã¡ããDSã°ã«ãŒãå
šäœã§ä¿å®ã»éçšãè¡ãªã£ãŠãããããŒãžã§ã³ç®¡çãšãããã€ã®èªååãããäžã§ãArtifact Registryã«ãã©ã€ããŒãããã±ãŒãžãšããŠçœ®ããŠå©çšããŠããŸãã å©çšäŸãšããŠãåŠç¿ããŒã¿ãåãåãããããç¹åŸŽéãšã¿ãŒã²ããã«åå²ããã³ã³ããŒãã³ãã«ãããã¢ãŒãã£ãã¡ã¯ãã®åãæž¡ãã»Cloud Stargeãžã®I/OåŠçã®å®è£
ã玹ä»ããŸãã # pipeline_name/components/component_name/src/main.py from dataclasses import dataclass import pandas as pd from [瀟å
ã©ã€ãã©ãªå].artifacts import Artifacts from [瀟å
ã©ã€ãã©ãªå].io import df_to_pickle @ dataclass class ComponentArguments : train_dataset_path: str @ dataclass class OutputDestinations : x_train_path: str y_train_path: str def main (args: ComponentArguments) -> pd.DataFrame: train_dataset = pd.read_pickle(args.train_dataset_path) x_cols = [ 'x1' , 'x2' ] y_col = [ 'y' ] X_train, y_train = train_dataset[x_cols], train_dataset[y_col] return X_train, y_train if __name__ == '__main__' : # ã¢ãŒãã£ãã¡ã¯ãã®ãã¹ãååŸ artifacts = Artifacts.from_args(ComponentArguments, OutputDestinations) # ã€ã³ããããšãªãã¢ãŒãã£ãã¡ã¯ãã®ãã¹ãåãåããmain颿°ãå®è¡ X_train, y_train = main(artifacts.component_arguments) # ãã€ãã©ã€ã³ã®ã¢ãŒãã£ãã¡ã¯ãã管çããCloud Storageã®ãã±ãããžpickle圢åŒã§X_train, y_trainãæžã蟌ã df_to_pickle(artifacts.output_destinations.x_train_path, X_train) df_to_pickle(artifacts.output_destinations.y_train_path, y_train) åãçµã¿ããæããã¡ãªãã äžã§æããåãçµã¿ãéããŠãã°ã«ãŒãå
šäœã§æããŠããäž»ãªã¡ãªããã玹ä»ããŠãããŸãã éçºã®ã¹ããŒããäžãããç¹ã«ãã€ãã©ã€ã³ã®ãã³ãã¬ãŒããçšæãããŠããäºã§ãéçºã®ååã倧å¹
ã«éããªããŸããã ãã³ãã¬ãŒããã©ã€ãã©ãªãéããŠããã¡ã€ã«æ§æãåŠçã«å
±éç¥ãããã®ã§ãã¡ã³ããŒéã§ã®ã¬ãã¥ãŒããããããªã£ãŠããã åå¥ã«éçºããåŠçã瀟å
ã©ã€ãã©ãªã«è¿œå ããŠããããšã§ãã°ã«ãŒãå
šäœã®è³ç£ãšããŠèç©ããŠããã å±äººåãããŠããã³ãŒããæžã£ãŠããã®ã§ãæ°èŠã¡ã³ããŒã®ãã£ããã¢ããããæããªãã ä»å玹ä»ããåãçµã¿ä»¥å€ã«ããMLãã€ãã©ã€ã³ã®ãœãŒã¹ã³ãŒãã®ã¢ããªãåãªã©DSã°ã«ãŒãã§ã¯åžžã«ç€Ÿå
ã®MLOpsåºç€ã匷åºã«ããŠããæŽ»åãç¶ããŠããŸãïŒ Weâre Hiring! ã¿ã€ããŒã®ããŒã¿çµ±æ¬éšã§ã¯ããšãã«åãã¡ã³ããŒãåéããŠããŸãïŒïŒ product-recruit.timee.co.jp *1 : Kubeflow Pipelines SDK ã§å®è£
ãããã€ãã©ã€ã³ãVertex AI Pipelinesã§åäœãããŠããŸã *2 : Artifact Registryã®ãã©ã€ããŒãããã±ãŒãžãPoetryã§æ±ãæ¹æ³ã¯ ãã¡ã ãåèã«ãªããŸã *3 : Kubeflow Pipelinesã«ããããã€ãã©ã€ã³ã®å®çŸ©ãã¡ã€ã«ã§äœ¿çšããŸã
DREã°ã«ãŒãã® ç³äº ã§ãã å
æ¥ãšãã£ãŠããããã°ããåã§ãããTechmeeãšããã€ãã³ãã§çç£æ§ã«ã€ããŠãã€ã«ã®èšæž¬ãããŠãããäžå®ã«æããåãçµã¿ãããŠãããšãã話ããããŠé ããŸãã ã https://timeedev.connpass.com/event/275750/ www.youtube.com ããã¯DREã°ã«ãŒãå
ã®çç£æ§ãç¶æãã=äžå®ä»¥äžã®ã¢ãŠãããããåºããç¶æ
ãäœãåºãããã®åãçµã¿ã§ããã ããããçç£æ§ãšããã°ãå€ãã¯ã³ãŒãéã§èšæž¬ãããŠãããããª(æããã³ãŒãéã¯è¯ãææšã§ã¯ãããŸããã)ãã®ãä»ã§èšãã°fourkeysãšãã£ããããªãã®ã§ãã©ãã ãã¢ãŠããããã«ç¹ãã£ãŠãããã倧åã«ãªããŸãã ç§ã®æå±ããDREã°ã«ãŒãã§ã¯ãäž»ã«è²ã
ãªããŒã¿ãœãŒã¹ããããŒã¿ãæœåºãã䟿å©ã«åæããããç¶æ
ã«ããããšã«è²¬ä»»ãæã€ãšåæã«ãããŒã¿åºç€ã®éçšãæ
åœããŠããŸãã ãã®ãããç§éã®ã°ã«ãŒãã¯ããšãããä»ã®åæè
ã®çç£æ§ãäžããããšã«è²¬ä»»ãæã£ãŠãããªããšãããŸããã ä»åã¯DREã°ã«ãŒãã§å§ãŸã£ãfourkeysã«ããçç£æ§ã®èšæž¬ãšä»åŸã®å±æã«ã€ããŠæžãããŠããã ãããšæããŸãã åæãšããŠfourkeys ä»åã®èšæž¬ã«åœãã£ãŠã¯fourkeysãããŒã¹ãšããŠèããããšã«ããŸããã ããã«ã€ããŠã¯æžç±ãè²ã
ãªçºè¡šè³æãªã©ãæŒããã°ã«ãŒãå
ã§å匷äŒãªã©ãéããŠããçšåºŠå
±éçè§£ãåŸãŠæã
ã®èšããããã®ã«å¯ŸããŠãŸãã¯ããã§ãã£ãŠã¿ããããšããåæãåŸãããããã§ãã æã
ãèããçç£æ§ã«ã€ããŠã¯åŸè¿°ããŸãããåæãšããŠã®fourkeysã¯ä»¥äžã®æ¬ãè³æãªã©ãèªãã§ããã ãããšçè§£ãé²ãããšæããŸãã State of DevOps 2021 https://services.google.com/fh/files/misc/state-of-devops-2021.pdf (2022ããããŸããããã©ãŒã å
¥åãå¿
èŠãªãããããªãã¯ã«å
¬éãããŠãããã¡ãã貌ã£ãŠããŸã)ã ãšãªãŒã DevOps ããŒã ã§ããããšã Four Keys ãããžã§ã¯ãã§ç¢ºèªãã https://cloud.google.com/blog/ja/products/gcp/using-the-four-keys-to-measure-your-devops-performance ç¶ç¶çããªããªãŒã®ãœãããŠã§ã¢å·¥åŠ https://bookplus.nikkei.com/atcl/catalog/22/12/01/00531/ DREã°ã«ãŒãã®èããçç£æ§ã®å®çŸ© æã
DREã°ã«ãŒãã¯ç€Ÿå
åãã®ããŒã¿åºç€ãæäŸããã°ã«ãŒãã§ãã ã€ãŸããçç£æ§èšæž¬ã®å¯Ÿè±¡ã1ã€ã®ããŒã ã«éãããšã¯éãããäœãªãè€æ°ã°ã«ãŒãã®æŽ»åãå
šãŠçµãã£ãŠ1ã€ã®æ©èœæäŸãå®äºãããšããã±ãŒã¹ãå€ããããŸãã äŸãã°ãæ°èŠããŒã¿ãã€ãªã蟌ã¿ã¢ããªã³ã°ããäžã§ããã·ã¥ããŒããæäŸããããšããã±ãŒã¹ã§ã¯ãDREã°ã«ãŒãã ãã§ãªããã¢ããªã³ã°ãæ
åœããBIã°ã«ãŒãã絡ãã§ããŸãããã®ãšããDREã°ã«ãŒããæ
åœããã¹ããŒãžã³ã°åŠçãŸã§ãå®äºãããšããŠã䟡å€ãæäŸã§ããŠãããšèšããã§ããããïŒããã§ã¯ãªããããŒã¿ã®åã蟌ã¿ãã¹ããŒãžã³ã°åŠçãã¢ããªã³ã°ãããã·ã¥ããŒãåã®ãã¹ãŠãå®äºããŠäŸ¡å€ãæäŸã§ããŠãããšèšãããšèããŠããŸãã ãã®ãããéçºã¯ãã¡ããã§ããããã®2ã°ã«ãŒãã®é£æºãã¹ã ãŒãºã«æµããããšãéèŠãªèŠçŽ ã§ããããã®ç¹ãæ¹åã®å¯Ÿè±¡ãšãªã£ãŠããã¯ãã§ããäŸãã°ãããããã¥ã¡ã³ããè¶³ããªããŠBIã°ã«ãŒããã¢ããªã³ã°ã«å
¥ããªãã®ã§ããã°ãããã¹ã ãŒãºã«æäŸããã¹ãã ããäŸé Œå
å®¹ãææ§ã§ãã¢ãªã³ã°ã«æéããããããããªããããæ¹å察象ãããããŸããã ã€ãŸããã¹ã«ãŒããããšããŠã¯çµµã«ãããšä»¥äžã®å
šäœã§èšæž¬ã»æ¹åãè¡ãå¿
èŠããããšèããŠããŸãã ãŸããåã«é床ã ãã远æ±ããŠããŸããšé害ãèµ·ãããŸããä»çµã¿ã«ãªã£ãŠããŸããããŸããã ãã®ãããåæã«å®å®æ§ã®ææšãšããŠé害ãèšæž¬ããå¿
èŠãããã®ã§ãããããŒã¿åºç€ã®å Žåã·ã³ãã«ã«ãããã€ã«ãã倱æãèšæž¬ããã°ããããšãããšããããããšã§ããªããã©ãããŠãããŒã¿ãœãŒã¹åŽã®å€æŽãªã©ã«ãããäœãããŠãªãã®ã«å£ããããšããããšãçºçããããšãå€ããããŸãã ãã®ããããèæ
®ããŠå®è£
ãèããŠããå¿
èŠããããŸãã å®è£
å®è£
ã¯ä»¥äžã®æ§ã«ãªããŸããã åºæ¬çã«DORAãå
¬éããŠãããŠããå®è£
ã䜿ããGithubäžã®å¶ã¿ãBigQueryäžã«åéããŠããŸãã ãããã€åšãã«ã€ããŠã¯ã ã»ãšãã©ã®ãªããžããªã¯main mergeæã«ãããã€èªååãããŠããã®ã§ãããŒãžããããã€ã®ä»£æ¿ææšãšããŠæ¡çšãã é害ã¯çŸåšNotionäžã®ãã¹ãã¢ãŒãã DBã§ç®¡çã§ããŠããã®ã§ããããåŒã£åŒµã£ãŠãã ãšããããšã«ããŠããŸãã çŸæç¹ã§ã¯éåžžã®fourkeysãååŸã§ããããã«ããŠããŸãããä»åŸã¯äžè¿°ããéãã®ãªãŒãã¿ã€ã ãNotionäžã«ããããã¯ãã°ãªã©ãšé£æºãããŠååŸããŠããäºå®ã§ãã èå¯ãšä»åŸã«ã€ããŠ çŸæç¹ã§ã¯ã»ãŒçŽ ã®fourkeysãååŸã§ããç¶æ
ã§ãã æåã«èšãããã£ããã®ãããããšããä¹é¢ãããç¶æ
ã§ãããããã§ãããã€ãã®ç€ºåãåŸãããšãã§ããŸããã äŸãã°ãdbtã®ãªããžããªã§DREã°ã«ãŒãã®ãªãªãŒã¹é床ã¯ååæ©ãã®ã§ãããããŒã¿ã®ã¢ããªã³ã°ãè¡ãBIã°ã«ãŒãã¯ããªãã®æéãããã£ãŠãããªã«ã課é¡ããããããªããšãç¹å®ã§ããŸããã ããã«ã€ããŠã¯ãã¢ãªã³ã°ãè¡ã£ãŠãããå®éã«ã¡ã³ããŒéã§ã¢ããªã³ã°ã«ã€ããŠã®ç¿ç床ãåææ¡ä»¶ã®çè§£ãªã©ã®å·®ãããããã«ãã¬ãã¥ãŒã§å€§ããªæéãããã£ãŠããããšãããããŸããã ãŸããåœããåã§ããDREã°ã«ãŒãã ãšããŠãæå³ããŠå€§ããPRãåºããšããŒãžãŸã§ã®æéãå§åçã«äŒžã³ãŠããããšãããããŸãã ã©ã¡ããæ
åœããŒã¹ã§ã¯çè§£ã®ããããšãšæããŸãããå
·äœçãªæ°å€ãšããŠèŠããŠãããšè°è«ã®ä¿äžã«ãäžãããããã解決ã«åããŠåãããããªãã®ã§ã·ã³ãã«ãªfour keysã§ãæå³ã®ããå¯èŠåãªã®ã§ã¯ãªãããšæããŸãã ãã ããã¯ãããã§ã¯æåã«æžãããããªèª²é¡ã¯èŠããŠããªãéšåã¯ããã®ã§ãå°ããã€ã¢ããããŒãããŠããããšã³ãããŒãšã³ãã®fourkeysãæž¬ããããã«ããŠããçç£æ§ã®é«ãããŒã¿åºç€ãå®çŸããç€ã«ããŠãããã°ãšæã£ãŠããããã®ãããã¯ãŸãããã°çã§çºè¡šã§ããã°ãšæã£ãŠããŸãã ãããã« æã
DREã°ã«ãŒãã¯ããŒã¿åºç€ãæäŸããè£æ¹ã®éšéã§ã¯ãããŸãããããŒã¿ã䜿ã£ãæ¥åã®çç£æ§ãæå€§åããããã«æ¥åã«åãçµãã§ããŸãã ãããã£ã話ã«èå³ããããå°ãã§ãæ°ã«ãªã£ãæ¹ã¯ãæ°è»œã« ã«ãžã¥ã¢ã«é¢è« ã«ç³ã蟌ã¿ããã ãããšå¬ããã§ãã
ããã«ã¡ã¯ããããã³ã°é åã§ããã¯ãšã³ããšã³ãžãã¢ãããŠãããœãã²ã§ ( @pokohide ) ã§ãã å·ããäžè¯ã¯ãããŸããçãªã¿ã€ãã«ã§ãããåãããŸãã ä»åã¯ã¿ã€ããŒãæ¬çªéçšããŠããRailsã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠRails edgeã§CIãåãããã«ãªã£ã話ã玹ä»ããŸããç¿é±ã«ã¯ããèŠã€ãããšã©ãŒç·šïŒä»®ïŒãããšé¡ããŠãå®éã«åŒç€Ÿã§èŠã€ãããšã©ãŒã®äŸã玹ä»ããŠãããŸããèšäºå
¬éæç¹ïŒ2023幎7æïŒã®ããŒãžã§ã³ã¯äžèšã®éãã§ãã $ ruby -v ruby 3.2.2 (2023-03-30 revision e51014f9c0) +YJIT [aarch64-linux] $ rails -v Rails 7.0.6 åŒç€Ÿã§ã¯RubyãRailsãç©æ¥µçã«ææ°ããŒãžã§ã³ã«ãããæŽ»åãããŠããŸããä»åã®èšäºã¯Railsã«é¢ããŠã§ãããRubyã®ã¢ããã°ã¬ãŒããåæ§ã«è¡ã£ãŠããŸããéå»ã«ã¯Ruby3.2ã«ããYJITãæå¹åã«ããèšäºãå
¬éããŠããã®ã§èå³ãããã°ããäžèªãã ããã tech.timee.co.jp Rails edgeãšã¯? ChatGPTã«èããŠæ¥œãããŠã¿ãŸããã ãã®èšäºã§ã¯ChatGPTãšåæ§ã« rails/rails ã®mainãã©ã³ããæãããšãšããŸãã Rails edgeã¯ãå®å®çã§ã¯ãªãéçºçãªã®ã§ä»¥äžã®ãããªç¹åŸŽããããŸãã å°æ¥ã®ãªãªãŒã¹ã§å©çšå¯èœã«ãªããããããªãæ°æ©èœãå«ãŸããŠãã æ£åŒãªãªãŒã¹ãããŠããªãæ¢ç¥ã®ãã°ä¿®æ£ãå«ãŸããŠãã å®å®çã§ã¯ãªãããŸã è©äŸ¡ãããŠããªãæ©èœããã°ãå«ãŸããŠããå¯èœæ§ããããããæ¬çªç°å¢ã§äœ¿çšããéã«ã¯æ³šæãå¿
èŠã§ããGitHubã§ã¯ãæ¯é±æ¬çªç°å¢ã§äœ¿ãRailsãedgeã«ã¢ããããŒãããŠããããã§ã *1 ã ãªãRails edgeã§CIãåãã®ã ã¿ã€ããŒã§ã¯ãRubyãRailsã®ã³ãã¥ããã£ã®é²åã«ç¶ç¶çã«è¿œéããããšã§ãé«éåãæ©èœè¿œå ãªã©ã®æ©æµãåãããŠãŒã¶ãŒã«æå€§éã®äŸ¡å€ãæäŸããŠãããããšèããŠããŸãã Rails edgeã§ã¯ãå°æ¥ã®ãªãªãŒã¹ã§å©çšå¯èœã«ãªãæ°æ©èœãäºåã«æ€æ»ã§ãããããæœåšçãªåœ±é¿ã確èªããããšãã§ããŸãããŸãããã°ãäºææ§ã®åé¡ãæ©æã«çºèŠãã解決çãèŠã€ããããšãå¯èœã§ãããã®ä»ã«ããææ°ã®æ©èœãä¿®æ£ã«é¢ããŠäœãããã°ãå®å®çãªãªãŒã¹åã«ç°è°ç³ãç«ãŠããããããšãã£ãã¡ãªããããããŸãã ãããã®å©ç¹ãèæ
®ããRails edgeã§CIãåãããšã«ããŸããã Rails edgeã§CIãåã rails以å€ã®gemã¯ãã®ãŸãŸå©çšããããããæ¢åã®Gemfileãèªã¿èŸŒã¿ãrailsã®ã¿ã rails/rails ã«äžæžãããããšã§Rails edgeçšã®GemfileãçšæããŸãã # frozen_string_literal: true # æ¢åã®Gemfileãèªã¿èŸŒã eval_gemfile File .expand_path( ' ../Gemfile ' , __dir__ ) # äžæžããããäŸåé¢ä¿ãåé€ãã dependencies.delete_if { |d| d.name == ' rails ' } # rails/railsã®ã¡ã€ã³ãã©ã³ãã«äžæžããã gem ' rails ' , branch : ' main ' , github : ' rails/rails ' 䜿çšããgemã®ããŒãžã§ã³ã倿Žãããã®ã§å°çšã®lockãã¡ã€ã«ãçšæããå¿
èŠããããŸãã BUNDLE_GEMFILE ãæå®ããäºã§æå®ããGemfileã䜿çšã§ããŸãã $ BUNDLE_GEMFILE=gemfiles/rails_edge.gemfile bundle install ããã«ããRails edgeãšä»ã®Gemãšã®äŸåé¢ä¿ãå®çŸ©ãããã¡ã€ã«ã®çšæãå®äºããŸããæ¬¡ã«ãããã®ãã¡ã€ã«ãå©çšããŠCIã§ãã¹ããå®è¡ããæºåãããŠãããŸããå®éã®èšå®ãã¡ã€ã«ãç°¡ç¥åããŠç޹ä»ããŠããŸãããªããåŒç€Ÿã§ã¯CIããŒã«ãšããŠCircleCIãå©çšããŠããŸãã version : 2.1 orbs : ruby : circleci/ruby@2.0.1 jobs : test : parameters : gemfile : type : string default : Gemfile environment : BUNDLE_GEMFILE : << parameters.gemfile >> BUNDLE_PATH_RELATIVE_TO_CWD : true docker : - image : cimg/ruby:3.2.2 steps : - checkout - ruby/install-deps : key : gems-<< parameters.gemfile >> gemfile : << parameters.gemfile >> - run : name : Test command : bundle exec rspec workflows : version : 2 workflow : jobs : - test : filters : branches : only : - master - /^rails_edge.*$/ matrix : parameters : gemfile : - "gemfiles/rails_edge.gemfile" ä»åã¯masterãã©ã³ããš rails_edge.* ãã©ã³ãã§ã®ã¿å®è¡ããããã«ããŸããã Orb - circleci/ruby ã§å®çŸ©ãããã³ãã³ãã§ãã install-deps ã§ã¯gemfileãã©ã¡ãŒã¿ãæž¡ããšæå®ããGemfileãå©çšããŠbundle installãå®è¡ããŠãããããããã®æ©æ§ãå©çšããŠããŸãã ãŸãã BUNDLE_PATH_RELATIVE_TO_CWD ãå©çšããããšã§ãGemfileã§ã¯ãªãã«ã¬ã³ããã£ã¬ã¯ããªã«å¯ŸããŠçžå¯Ÿçã«ãã¹ãæå®ããã®ã§Gemã®ç«¶åãåé¿ã§ãããã£ãã·ã¥ãæå¹æŽ»çšã§ããŸãã Rails edgeã§èœã¡ããã¹ãã«å°ãã€ãã åŸåºãã§ããä»åã®ç®çã¯ã Rails edgeã§CIãåã ãããšã§ãããå
šãŠã®ãã¹ããä¿®æ£ããããšã§ã¯ãããŸããã§ãããããã§ãä»åã¯èœã¡ããã¹ããpendingããããšã«ããŸããã skipã§ã¯ãªãpendingãæ¡çšããã®ã¯ãmainãã©ã³ãã®è¿œåŸã«ãããã¹ããæåããå¯èœæ§ãããããã§ããskipã¯ãã¹ãã®æåã»å€±æã«éãããã¹ããå®è¡ããŸããããpendingã¯ãã¹ãã®å€±ææã®ã¿ä¿çã«ããããä¿®æ£ã«æ°ã¥ãããšãã§ããŸãã 䟿å®äžãããããåºãã§ãããRails7.1ã§åããªãããšãšãããŸã§ã«çŽãããšããæå³åãã蟌ããŠä»¥äžã®ãããªã¡ãã»ãŒãžã衚瀺ããããã«ããŠããŸããããã¯é©åœã«å€ããŠããã ãã®ãè¯ãããšæããŸãã # frozen_string_literal: true module PendingIfRailsEdge def pending_if_rails_edge ' PENDING: Rails 7.1ã§åãããã«çŽã ' if Rails :: VERSION :: STRING .start_with?( ' 7.1 ' ) end end RSpec .configure do |config| config.extend PendingIfRailsEdge end 以äžã®ããã«äœ¿ããŸããããããããšã§ãã¹ãã³ãŒããgrepããæã«èœã¡ãŠããã³ãŒããããã«èŠã€ããããšãã§ããã®äŸ¿å©ã§ããããŸãã context ' foo ' , pending : pending_if_rails_edge do ... end it ' bar ' , pending : pending_if_rails_edge do ... end ããã§Rails edgeã§CIãåãããšãã§ããããã«ãªããŸããã Rails edgeçšã®lockãã¡ã€ã«ã远åŸããã masterãã©ã³ããš rails_edge.* ãã©ã³ãã§Rails edgeã§CIãåãéçšãéå§ããŠãããfeatureãã©ã³ãã§Gemã®è¿œå ãåé€ãè¡ã£ãã rails_edge.gemfile ã®æŽæ°ãå¿ããŠmasterãã©ã³ãã«ããŒãžãããããmasterãã©ã³ãã§Rails edgeã§ã®CIãfailããã±ãŒã¹ãçºçããŸããã æ¬çªç°å¢ã«åœ±é¿ããªããšã¯ããmasterãã©ã³ãã®CIãfailããŠããã®ã¯ã¢ã€ã¢ã€ããããšãããã£ããå°å
¥ããä»çµã¿ã圢骞åããŠããŸããããmasterãã©ã³ãããŒãžåã«æ°ã¥ããä»çµã¿ãå°å
¥ããŸããã å
·äœçã«ã¯ BUNDLE_GEMFILE=gemfiles/rails_edge.gemfile bundle install ãå®è¡ããŠå·®åãçºçããã°å€±æããã¹ãããã远å ããfeatureãã©ã³ãã§ãå®è¡ããããã«ããŸããã jobs : check_outdated_gemfile : parameters : gemfile : type : string docker : - image : cimg/ruby:3.2.2 steps : - checkout - ruby/install-deps : key : gems-<< parameters.gemfile >> gemfile : << parameters.gemfile >> - run : name : re-bundle install command : bundle install - run : name : check file changes command : | if [ `git diff --name-only << parameters.gemfile >>.lock` ] ; then echo 'Please run `BUNDLE_GEMFILE=<< parameters.gemfile >> bundle install`' exit 1 else exit 0 fi æåŸã« ä»åã¯Rails edgeã§CIãåãå§ããèæ¯ãå°å
¥ããæ¹æ³ã«ã€ããŠç޹ä»ããŸããã ä»åã®åãçµã¿ãéããŠãå°æ¥ã®Railsã¢ããã°ã¬ãŒãã«ãããŠééããã§ããããã°ã«æ©æã«æ°ã¥ããè¿
éãªå¯Ÿå¿ãã§ããããã«ãªããŸããããŸã GitHubã®ããã« *1 ã Rails edgeãæ¯é±åã蟌ããç¶æ
ã§ã¯ãªãã§ãããåŒãç¶ãé 匵ã£ãŠããããšæããŸãã æ¬¡åã¯ãRails edgeã§CIåãå§ããããšã§èŠã€ããåé¡ã玹ä»ããŠãããŸããèšäºå
¬éæã«ã¯å
¬åŒTwitter ( @TimeeDev ) ã§ã¢ããŠã³ã¹ããŠããã®ã§ãã©ããŒããŠããã ãããšå¬ããã§ãã ãŸããã¿ã€ããŒã§ã¯äžç·ã«ãµãŒãã¹ãæé·ãããŠããæ¹ãåéããŠããŸããããå°ãã§ãèå³ãæã£ãŠããã ããããã«ãžã¥ã¢ã«é¢è«åãä»ããŠãããŸãã®ã§æ¯éã話ãããŸãããïŒ product-recruit.timee.co.jp *1 : https://github.blog/2023-04-06-building-github-with-ruby-and-rails
ããã«ã¡ã¯ãã¿ã€ããŒã®ããŒã¿çµ±æ¬éšããŒã¿ãµã€ãšã³ã¹ïŒä»¥äžDSïŒã°ã«ãŒãæå±ã® å°æ ã§ãã ä»åã¯ãDSã°ã«ãŒãã®ã¡ã³ããŒã«ããããã®æ¬ãèããŠã¿ãã®ã§ã玹ä»ããŸãïŒ *1 ããããæ¬ãéããŠãDSã°ã«ãŒãã®é°å²æ°ããæ¥åã§æŽ»çšããã¹ãã«ã»ç¥èã«ã€ããŠãã¿ãªããã«äŒããã°ãããªãšèããŠããŸãã ããŒã¿ãµã€ãšã³ã¹ïŒDSïŒã°ã«ãŒãã®çŽ¹ä» æ¬é¡ã«å
¥ãåã«ã軜ãDSã°ã«ãŒãã®ç޹ä»ããããŠãã ããã DSã°ã«ãŒãã¯ãã¿ã€ããŒã®äºæ¥æé·ãããŒã¿ã»ã¢ã«ãŽãªãºã ã§æ¯æŽããããšãç®çãšããŠããŸãã äŸãã°ã以äžã®ãããªæ¥åãæ¥ã
è¡ãªã£ãŠããŸãã Google Cloudãå©çšããæ©æ¢°åŠç¿ãã€ãã©ã€ã³ïŒåºç€ã®éçºã»éçš ãŠãŒã¶ãŒãžä»äºãæšèŠããã¬ã³ã¡ã³ããšã³ãžã³ã®éçº å¶æ¥æŽ»åãæ¯æŽããäºæž¬ã¢ãã«ã®éçº ããžãã¹æœçã®å¹ææ€èšŒ çŸåšãå°ä»»ã»å
Œä»»ã»æ¥åå§èšã®ã¡ã³ããŒã§æ§æãããŠãããä»åŸãèŠæš¡ãæ¡å€§ããäºå®ã§ãã WebäŒæ¥ãã³ã³ãµã«äŒæ¥ãAIãã³ãã£ãŒãªã©ã§ãããŒã¿ãµã€ãšã³ãã£ã¹ã/æ©æ¢°åŠç¿ãšã³ãžãã¢ãšããŠçµéšãç©ãã§ããã¡ã³ããŒãåšç±ããŠããŸãã ç¹ã«ãæ©æ¢°åŠç¿ã·ã¹ãã èšèšãæ©æ¢°åŠç¿ã¢ãã«å®è£
ã广æ€èšŒãªã©ã«åŒ·ã¿ãããã¡ã³ããŒãæã£ãŠããŸãã DSã°ã«ãŒãããããæ¬ã®çŽ¹ä» ããã§ã¯ãDSã°ã«ãŒãã®åã¡ã³ããŒã«èãããå¿ããããããã§ããæ¬ãããæšèŠã¡ã³ããŒããã®ã³ã¡ã³ããèŒãã€ã€ç޹ä»ããŸãã ãžã£ã³ã«ãšããŠã¯ãæ©æ¢°åŠç¿ãå ææšè«ãéçºãçµç¹ã«é¢ããæžç±ãåãäžããŸãã æ©æ¢°åŠç¿ã®ããããæ¬ Rã«ããçµ±èšçåŠç¿å
¥é Rã«ãã çµ±èšçåŠç¿å
¥é äœè
: Gareth James , Daniela Witten , Trevor Hastie , Robert Tibshirani æåæžåº Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ ã«ã¹ãã©æ¬ãšããŠæå㪠ãçµ±èšçåŠç¿ã®åºç€ã ãææããèè
ãæžãããæ©æ¢°åŠç¿ã®å
¥éæžã ãçµ±èšçåŠç¿ã®åºç€ãã¯è¯æžã§ã¯ãããã®ã®å
容ã»åéããããŒãªã®ã§ãå®åå®¶ã«äžçªæåã«ãããããããã®ã¯ã³ã¬ããªãšæã£ãŠãŸãã 説æã®å¹³æããé©åã§ãããå人çã«å
¥éæžã®äžã§äžçªããããããã£ãã§ãã ãã€ãºæšè«ã«ããæ©æ¢°åŠç¿å
¥é æ©æ¢°åŠç¿ã¹ã¿ãŒãã¢ããã·ãªãŒãºããã€ãºæšè«ã«ããæ©æ¢°åŠç¿å
¥é äœè
: é å±±æŠå¿ è¬è«ç€Ÿ Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ ãã€ãºæšè«ã«ããåŠç¿ã»äºæž¬ãäžå¯§ã«æ°åŒã¬ãã«ã§è¿œãããšãã§ããè¯æžã§ãã ã®ãã¹ãµã³ããªã³ã°ãå€åæšè«ãçè«ããçè§£ãããæ¹ã«ãããããããã§ãã èªç¶èšèªåŠçã®åºç€ IT Text èªç¶èšèªåŠçã®åºç€ äœè
: 岡ïšçŽèг , èç¬ç±çŽ , éŽæšæœ€ , 鶎岡æ
¶é
, 宮尟ç¥ä» ãªãŒã 瀟 Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ èªç¶èšèªåŠçã®åºç€ããå§ãŸããè¿å¹Žã®æ·±å±€åŠç¿ããŒã¹ã®ææ³ãŸã§äžå¯§ã«è§£èª¬ããæ¬ã TransformerãBERTãGPTãªã©ãå€§èŠæš¡èšèªã¢ãã«ã®èéãæ¯ããæ°ããæè¡ã®è§£èª¬ããããåæžãšããŠã¯è²Žéã§ãã æšèŠã·ã¹ãã å®è·µå
¥é æšèŠã·ã¹ãã å®è·µå
¥é âä»äºã§äœ¿ããå°å
¥ã¬ã€ã äœè
: é¢šé æ£åŒ , é£¯å¡ æŽžäºé , æŸæ åªä¹ ãªã©ã€ãªãŒãžã£ãã³ Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ æšèŠã·ã¹ãã ã«ã€ããŠãã¢ã«ãŽãªãºã ã®è§£èª¬ã«çãŸãããäŒç»æ®µéããã¶ã€ã³ãŸã§å¹
åºãæ±ã£ãå®è·µçãªäžåã§ãã æ¬æžãææã«DSã°ã«ãŒãã§å匷äŒãéããªã©ãå®åã§éå®ããŸããïŒ å ææšè«ã®ããããæ¬ 广æ€èšŒå
¥é 广æ€èšŒå
¥éãæ£ããæ¯èŒã®ããã®å ææšè«ïŒèšéçµæžåŠã®åºç€ äœè
: å®äº ç¿å€ª æè¡è©è«ç€Ÿ Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ RCTã ãã§ãªãã芳å¯ããŒã¿ãçšããå ææšè«ã®ææ³ããããããã解説ãããå®åå®¶åãã®äžåã DSã°ã«ãŒãã§ã¯ããžãã¹æœçã®å¹ææ€èšŒãè¡ãããšãå€ããä»äºãããäžã§åºç€ã«ãªã£ãŠããŸãã DSã°ã«ãŒããšåãéšçœ²ã«å±ããBIã°ã«ãŒããå匷äŒã§æ¬æžã䜿ã£ãŠããã®ã§ãäžç·ã«ããããåŠã³ãŸããã çµ±èšçå ææšè«ã®çè«ãšå®è£
çµ±èšçå ææšè«ã®çè«ãšå®è£
Wonderful R äœè
: 髿©å°å® , ç³ç°åºåº , åžå·å€ªç¥ , 髿©åº·ä» , 髿³æ
äž , çŠå³¶ç倪æ , æŸæµŠå¥å€ªé å
±ç«åºç Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ å³è¡šã亀ãã解説ããããããããçè«ãšå®è£
ã®ãã©ã³ã¹ãè¯ããªã©ãéåžžã«æŽç·Žãããæžç±ã§ãã ã广æ€èšŒå
¥éãã§ã¯æ·±ã説æãããªãã£ãææ³ã解説ãããŠããã䜵ããŠèªãã®ãããããã§ãã éçºç³»ã®ããããæ¬ ããã¹ãPython ããã¹ãPython âã¯ãªãŒã³ã§ä¿å®ããããã³ãŒããæžã äœè
: Patrick Viafore ãªãŒã 瀟 Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ Pythonã§ä¿å®ãããããå
ç¢ãªã³ãŒããæžãããã®æ
å ±ããããŸãšãŸã£ãŠããŸãã æ©æ¢°åŠç¿ã¢ããªã³ã°ãããŒã¿åŠçãå«ãå®éšã³ãŒããæ¬çªç°å¢ã«ä¹ããŠããéã«ãæ¬æžã ããªãŒããã«ã³ãŒãã ã«ç«ã¡è¿ã£ãŠéçºãã¬ãã¥ãŒããããšãæèããŠããŸãã åäœãã¹ãã®èãæ¹/äœ¿ãæ¹ åäœãã¹ãã®èãæ¹/äœ¿ãæ¹ äœè
: Vladimir Khorikov ãã€ããåºç Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ åäœãã¹ãã®èãæ¹ãç¶²çŸ
çãã€æ·±ããŸãšããæžç±ã DSã°ã«ãŒãã§ã¯ïŒã¢ãããã¯åæã®ã³ãŒã以å€ã¯ïŒãã¹ããå®è£
ããããšã«ããŠããããã䟡å€ã®ãããã¹ãã±ãŒã¹ãã€ããããæå
ã«çœ®ããŠããäžåã§ãã ããŒã¿ãããžã¡ã³ãã30åã§ãããæ¬ ããŒã¿ãããžã¡ã³ãã30åã§ãããæ¬ äœè
: ãããã , ã¯ããã , æ ªåŒäŒç€Ÿé¢šé³å± Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ äžèº«ãèŠãç®ããããŒããã DMBOK ãç¬èªã«èŠçŽããŠãŸãšããæ¬ã DMBOKã®æ¬è³ªãç°¡æœã«ãŸãšããããŠãããïŒå€§åã®ã±ãŒã¹ã§ã¯ïŒãã¡ããåç
§ããããšã§åé¡ã解決ã§ããæ°ãããŠããŸãã ãœãããŠã§ã¢èŠç©ã 人æã®æé»ç¥ãè§£ãæãã ãœãããŠã§ã¢èŠç©ãã人æã®æé»ç¥ãè§£ãæãã äœè
: ã¹ãã£ãŒã ãã³ãã« æ¥çµBP Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ æåãªãäžç¢ºå®æ§ã³ãŒã³ïŒãããžã§ã¯ãã®é²è¡ã«äŒŽã£ãŠäžç¢ºå®æ§ãæžå°ããããšã衚ããå³ïŒãã®ååºæ¬ã ãœãããŠã§ã¢éçºã«ãããèŠç©ããã«é¢ããŠãæ¬è³ªçãªèŠç¹ãæäŸããŠãããŸãã éçºã«é¢ãããã¹ãŠã®äººã«ããããã§ããæžç±ã§ãã çµç¹ç³»ã®ããããæ¬ ãšã³ãžãã¢ãªã³ã°çµç¹è«ãžã®æåŸ
ãšã³ãžãã¢ãªã³ã°çµç¹è«ãžã®æåŸ
ãïœäžç¢ºå®æ§ã«åãåãæèãšçµç¹ã®ãªãã¡ã¯ã¿ãªã³ã° äœè
: åºæš å€§å° æè¡è©è«ç€Ÿ Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ ãšã³ãžãã¢ãªã³ã°çµç¹ã«ããã課é¡ã®è§£æ±ºæ¹æ³ã«ã€ããŠãŸãšããããæ¬ã ã¢ãžã£ã€ã«çãªæèããäžç¢ºå®æ§ã®èãæ¹ã¯ãšã³ãžãã¢ã ãã§ãªãããŒã¿ãµã€ãšã³ãã£ã¹ãã«ãšã£ãŠãéèŠãªã®ã§ãããããã§ãã æãã®ãªãçµç¹ æãã®ãªãçµç¹ââãå¿ççå®å
šæ§ããåŠç¿ã»ã€ãããŒã·ã§ã³ã»æé·ããããã äœè
: ãšã€ããŒã»Cã»ãšãã¢ã³ããœã³ , æç¬ä¿æ è±æ²»åºç Amazon ã¡ã³ããŒããã®ã³ã¡ã³ãâ ãå¿ççå®å
šæ§ãã®æå±è
ã§ãããšãã¢ã³ããœã³å士ããå¿ççå®å
šæ§ãçµç¹ã«ãããã圱é¿ã«ã€ããŠãŸãšããæ¬ã é¢é£æžç±ã¯ä»ããããããã®ã§ãããããäžåèªãã°å¿ççå®å
šæ§ã®ã³ã¢ãããããå¿çšãå¹ããšæã£ãŠããŸãã ããŒã¿çµ±æ¬éšã§ã¯ å¿ççå®å
šæ§ååŒ·äŒ ãéå¬ãããªã©ãæåã®æµžéãã¯ãã£ãŠããŸãã Weâre Hiring! ã¿ã€ããŒã®ããŒã¿çµ±æ¬éšã§ã¯ããããã£ãããããæ¬ã®æ
å ±ãæ¥ã
Slackã«é£ã³äº€ã£ãŠããããå匷äŒã宿çã«è¡ãªã£ãŠãããããŸãã åŠç¿ææ¬²ã奜å¥å¿ã®ãã人ã«ãšã£ãŠå¬ããç°å¢ã§ã¯ãªãããšãïŒæåå³åãªããïŒãã¡ã¡ã³ããŒãšããŠæã£ãŠããŸãã ã¿ã€ããŒã§ã¯ãããŒã¿ãµã€ãšã³ãã£ã¹ãããšã³ãžãã¢ãã¯ãããäžç·ã«åãã¡ã³ããŒãåéããŠããŸãïŒ product-recruit.timee.co.jp *1 : å
æ¥ãããŒã¿çµ±æ¬éšã¡ã³ããŒã®ããããæ¬ã note ã§ç޹ä»ããŸããã®ã§ãèå³ãããã°ãäžèªãã ããã
ã¯ããã« åããŸããŠãã¿ã€ããŒã®DREããŒã ïŒData Reliability Engineering TeamïŒã§ãšã³ãžãã¢ãããŠãŸããç玫ã§ãã ä»åDREããŒã ã§å®æœããå宿ã€ããŠã玹ä»ãããŠé ãããšæããŸãã DREã®ã«ã«ãã£ãŒãå°ãã§ãç¥ã£ãŠé ãããå¬ããã§ãã DREããŒã ã«ã€ããŠçŽ¹ä» DREããŒã ã§ã¯ã瀟å
ã®æ§ã
ããŒã¿ãéçŽããã¯ã¬ã³ãžã³ã°ãè¡ãã瀟å
å€ã§å©æŽ»çšã§ããåœ¢ã§æäŸããããã®ããŒã¿åºç€ãããã¯ãã®éçºã»éçšãè¡ãªã£ãŠãããŸãã ããŒã¿åºç€ã®è©³çްã«ã€ããŠã¯ãProductOwnerïŒä»¥éPOãšèšèŒïŒã®åå·ã®èšäºããåç
§ãã ããã tech.timee.co.jp ä»å¹Žã®4æã«ç§ãå«ã2人å
¥ç€Ÿããããšã§ã¡ã³ããŒã®å
¥ãå€ãããããããŒã¿åºç€ã®éçºäœå¶ãæ°ãããªããŸããã ã¡ã³ããŒã倧ããå€ãã£ãããšããããéçºãé²ããäžã§ä»ãŸã§ã®ããŒã¿åºç€ã®æŽå²çèæ¯ãæ¹åæ§ã®çè§£ã«ã¡ã³ããŒéã§å·®åãããããšã課é¡ã«ãªã£ãŠããŸããã DREããŒã ã®Missionãšå宿ã®ç®ç DREã§ã¯ããŒã ãšããŠã®Missionãå®ããŠããŸãã ããã§ããMissionãšã¯ãããžãã¹ã·ãŒã³ã§ããçšããããçµç¹ãããŒã ã®MVVïŒMissionã»Visionã»ValueïŒã®Missionã§ãçµç¹ãããŒã ã®ååšæçŸ©ãæããã¹ã䜿åœãæããŸãã Missionãå®ããŠãããŒã ãšããŠã®æç¢ºãªç®æšãããŒã ã®å
±éèšèªã«ããããšã§ãããŒã ã®åœ¹å²ã責任ç¯å²ãæç¢ºåããææã®åäžãæåã«ã€ãªããããŒã¿åºç€ãããã¯ãã®éçºãå¹ççã«é²ããããšãã§ããŸãã ãŸããMissionã¯å€éšãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãã¹ã ãŒãºã«ããããŒã ã®ã¢ãããŒã·ã§ã³ãé«ããèŠçŽ ãšããªããŸãã å
ã
ã®Missionã¯ä»¥äžã®éãã§ãã ãä¿¡é Œæ§ã®é«ãããŒã¿åºç€ãæŽåããæŽ»çšã®ããã®ç°å¢ãæäŸããã ãã ãMissionãå®çŸ©ããé ããæéãçµã£ãŠããããšããŸãããŒã æ§æã倧ããå€ãã£ãããšããããã¢ããããŒããããæ©éãé«ãŸã£ãŠããŸããã ä»ã®ããŒã ã§Missionã忀èšããããšã§ãäžè¿°ã®èª²é¡ãå«ãè§£æ¶ã§ããã®ã§ã¯ãšãã話ã«ãªããDREããŒã ã®Missionãæ±ºããã¯ãŒã¯ã·ã§ãããéå¬ããããšã«ãªããŸããã å宿ã®å
容 æ®æ®µã¯ãªã¢ãŒãã¯ãŒã¯ãå€ãããŒã ã§ãããå宿ã¯1æ¥ã ãæ±äº¬ãªãã£ã¹ã«éãŸããäŒè°å®€ã貞ãåã£ãŠå®æœããããšã«ãªããŸããã Missionãæ±ºããã«ããã£ãŠããŸãã¯ãDREããŒã ã®ååšæçŸ©ã«ã€ããŠã¡ã³ããŒãããããã¹ãã€ããã§æèŠãåºãåãããããè°è«ããªããã¯ã©ã¹ã¿ãªã³ã°ããŸããã ãã®çµæãåºã«ãMissionã®æ¹åæ§ãå°ãåºã圢ã§é²ããŸããã ãã ããã¹ãã€ããã®çµæããMissionãšãã圢ã§ãæœè±¡åºŠé«ããã¬ãŒãºãæœåºããããšã«èŠæŠããŸããã éèŠèŠããèŠçŽ ã«ã€ããŠã¯ãã¡ã³ããŒéã§èªèãæŠãæã£ãŠãããã®ã®æçµçã«Missionãšãã圢ã§ã©ã衚çŸãããã«é£åããŸããã è°è«äžã§ãå
ã
ã®Missionã«å
¥ã£ãŠãããâä¿¡é Œæ§âãšããã¯ãŒããæ¡çšããããšã«ãªããŸããã ã¿ã€ããŒã®DREããŒã ã«ãããâä¿¡é Œæ§âãšã¯ãã¹ããŒããå質ãå®å®æ§ããŠãŒã¶ããªãã£ãç·åçã«è¡šçŸãããã®ã§ããããŠãŒã¶ãããŒã¿ã婿޻çšããäžã§ãDREããŒã ã§ã¯ãããã®èŠçŽ ãç¹ã«éèŠããŠããŸãã ç¹ã«ã¹ããŒãã«ã€ããŠã¯ãããŒã¿ãçæãããŠããæŽ»çšããããŸã§ã®æéãççž®ããŠãããããšããPOã®æããããããŸãããããããªã¢ã«ã¿ã€ã æ§ãæ±ããããèŠæ±ã«å¯Ÿå¿ããŠããããã«ã枩床æã®é«ãææšã«ãªã£ãŠããŠããŸãã ãŸããé«ãâä¿¡é Œæ§âãéæããããã®ææ®µãšããŠãDataOpsãšãã芳ç¹ãå°å
¥ããããšã«ãªããŸããã DataOpsã¯ãã¬ãŒãããŒç€Ÿãæå±ããŠããæŠå¿µã§ãããŒã¿ãã€ãã©ã€ã³ã®æ§ç¯ãèªååãç£èŠããããã€ã¡ã³ãã®è¿
éåãããŒã¿å質ã®åäžãªã©ãéèŠããããšã§ãçµç¹ã®ããŒã¿ç®¡çè
ãšå©çšè
ã®éã®é£æºä¿é²ããããŒã¿ã®åéãåŠçãåæãå±éã®ããã»ã¹ãå¹çåããããã®ãã©ã¯ãã£ã¹ã§ãã ãã®ãã©ã¯ãã£ã¹ãçšããŠãâä¿¡é Œæ§âããããŒã¿åºç€ãæ§ç¯ããŠããããšãMissionãšããããšã«ãªããŸããã ãã®åŸè°è«ãé²ã¿ãæçµçã«ä»¥äžã®Missionã«æ±ºãŸããŸããã ãDataOpsãå®çŸããä¿¡é Œæ§ã®é«ãããŒã¿åºç€ãããã¯ããæäŸããã ãŸãšã æ¥é ãã®ãããªããŒã ã®æ¹åæ§ãªã©ãæ·±ãè©±ãæ©äŒãå°ãªãã®ã§ããšãŠã貎éãªæéãéãããŸããã ããŒã å
ã§Missionãå®ããããšãã§ããåãæ¹åãåããŠãããã¯ãéçºãé²ããŠããããã§ãã¡ã³ããŒéã§ã®æºè¶³åºŠãé«ããè¯ãã£ããšæããŸãã ãŸãããã以äžã«ããŒã ã§è°è«ããªãããããŒã¿åºç€ãããã¯ãã®æ§æ³ãæ¹åæ§ãPO+éçºã¡ã³ããŒéã§å
±æã§ãããšããããã®éçšã«ãšãŠã䟡å€ãããäŒã ã£ããšæããŸãã ä»åå®ããMissionãæã£ãŠããŒã¿åºç€ãããã¯ãã®æé·ãå éãããŠãããããšæã£ãŠãŸãã æåŸã«ãã¿ã€ããŒã§ã¯ãšã³ãžãã¢ã»ããŒã¿ãµã€ãšã³ãã£ã¹ããåããæ§ã
ãªè·çš®ã®ã¡ã³ããŒãåéããŠãŸãïŒ product-recruit.timee.co.jp
ããã«ã¡ã¯ã2023幎1æã«æ ªåŒäŒç€Ÿã¿ã€ããŒã«å
¥ç€Ÿããããã¯ãšã³ããšã³ãžãã¢ã® id:euglena1215 ã§ãã RubyKaigi 2023 ããšããšãææ¥ã«è¿«ã£ãŠããŸãããæ¥œãã¿ã§ããã ã¿ã€ããŒã¯ RubyKaigi ã§åããŠããŒã¹åºå±ãè¡ããŸããè³ãã¬ç¹ãããããšæããŸãããRubyKaigi ãäžç·ã«çãäžããŠãããã°ãšæã£ãŠããŸãïŒã©ãããããããé¡ãããŸãã ä»åã¯ã¿ã€ããŒãæ¬çªéçšããŠãã Rails ã¢ããªã±ãŒã·ã§ã³ã«å¯Ÿã㊠Ruby 3.2.2 ãžã®ã¢ããããŒããš YJIT ã®æå¹åãè¡ããããã©ãŒãã³ã¹ã倧ããæ¹åããããšã玹ä»ããŸãã RubyKaigi ã§ãRuby 3.2+YJIT æ¬çªéçšã«ã³ãããŒã§ãããšèšãããã®ã§ç²ã
ãšé²ããŠãã — Shintani Teppei (@euglena1215) 2023幎4æ19æ¥ åæ ã¿ã€ããŒãæ¯ããããã¯ãšã³ãã® Web API ã¯å€ãã®ã±ãŒã¹ã§ Ruby ã®å®è¡ããã DB ãããã«ããã¯ã®äžè¬ç㪠Rails ã¢ããªã±ãŒã·ã§ã³ã§ããJSON ãžã® serialize 㯠active_model_serializers ãå©çšããŠããŸãã ä»åã®éèšã§ã¯ API ãªã¯ãšã¹ããžã®ããã©ãŒãã³ã¹åœ±é¿ã®ã¿ãéèšããSidekiq, Rake ã¿ã¹ã¯ãšãã£ãéåæã§å®è¡ãããåŠçã¯éèšã®å¯Ÿè±¡å€ãšããŠããŸãã ä»å㯠Ruby 3.1.2 ãã Ruby 3.2.2 ãžã®ã¢ããããŒããš YJIT æå¹åãåæã«è¡ãããã©ãŒãã³ã¹ã®å€åã確èªããŸããããã®ãããããã©ãŒãã³ã¹ã®å€åã«ã¯ Ruby ã®ããŒãžã§ã³ã¢ããã«ããæé©åãš YJIT æå¹åã«ããæé©åã®äž¡æ¹ã®åœ±é¿ããããšèããããŸããã容赊ãã ããã çµæ 以äžã®ã°ã©ã㯠API ãªã¯ãšã¹ãå
šäœã®ã¬ã¹ãã³ã¹ã¿ã€ã ã® 50-percentile ã§ããã¢ããããŒãååŸã§ã¬ã¹ãã³ã¹ã¿ã€ã ã çŽ10%é«éåãããŠãã ããšã確èªã§ããŸããã API ãªã¯ãšã¹ãå
šäœã®ã¬ã¹ãã³ã¹ã¿ã€ã ã® 50-percentile ãªã¯ãšã¹ãå
šäœãšããŠã¯å€§ããé«éåãããŠããããšã確èªã§ããŸãããããã§ã¯ãã¬ã¹ãã³ã¹ãé
ããæéåœããã®ãªã¯ãšã¹ãæ°ãå€ãã¢ããªã±ãŒã·ã§ã³ã®è² è·ã®å€ãå ãããšã³ããã€ã³ãã§ã¯ã©ãã§ããããïŒ ããã§ãã¿ã€ããŒã® Web API ã®ãã¡2çªç®ã«åèšã®åŠçæé *1 ãé·ããšã³ããã€ã³ããžã®ããã©ãŒãã³ã¹åœ±é¿ã確èªããŸããã *2 以äžã®ã°ã©ãã¯2çªç®ã«åèšã®åŠçæéãé·ããšã³ããã€ã³ãã®ã¬ã¹ãã³ã¹ã¿ã€ã ã® 50-percentile ã§ããRuby ã¢ããããŒãã®æ°æ¥åã« GW äžã®è² è·å¯Ÿçã®ããã®ã¹ã±ãŒã«ã¢ãŠãã宿œããããšã§å€åãå°ãåããã«ãããªã£ãŠããŸãããRuby 3.1.2 ãã Ruby 3.2.2+YJIT ã«ããããšã«ãã£ãŠ 10%以äžé«éåãããŠãã ããšã確èªã§ããŸããã 2çªç®ã«åèšã®åŠçæéãé·ããšã³ããã€ã³ãã®ã¬ã¹ãã³ã¹ã¿ã€ã ã® 50-percentile å
ã
ååã«é«éãªãšã³ããã€ã³ãã ãã§ãªããã¢ããªã±ãŒã·ã§ã³è² è·ã®å€ããå ããŠãããšã³ããã€ã³ãã®ããã©ãŒãã³ã¹ãæ¹åãããŠããããšãåãããŸããRuby 3.2 ã¢ããããŒã+YJIT æå¹åã¯ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ãžã®ååå®çšçãªæã¡æãšèšããã®ã§ã¯ãªãã§ããããã ãŸãšã Ruby 3.1.2 ãã Ruby 3.2.2 ãžã®ã¢ããããŒããš YJIT ãæå¹ã«ããããšã§ãªã¯ãšã¹ãå
šäœã®ã¬ã¹ãã³ã¹ã¿ã€ã ã® 50-percentile ãçŽ10%é«éåãããŸããããŸããã¢ããªã±ãŒã·ã§ã³è² è·ã®å€ããå ããŠãããšã³ããã€ã³ããåæ§ã«10%以äžé«éåãããŠããããšã確èªã§ããŸããã Ruby 3.2âs YJIT is Production-Ready ã§ã YJIT ã«ãã£ãŠ Shopify ã 5~10% é«éåããããšèšãããŠããããšããããRuby 3.2 ã® YJIT ã¯äžè¬ç㪠Rails ã¢ããªã±ãŒã·ã§ã³ã 10%çšåºŠé«éåãããããšèããŠè¯ãã®ã§ã¯ãªãããšæã£ãŠããŸãã ããã»ã©ã®é«éåã«å°œåããŠããã ãã Ruby ã³ããã¿ãŒã®ã¿ãªãããæ¬åœã«ããããšãããããŸããã äœè«ã§ã¯ãããŸãããèªç€Ÿã§ YJIT ãæå¹åããããšã«ãã£ãŠ YJIT ãšããæè¡ãããèªåããšã«ãªããå
éšã§äœãè¡ãããŠããã®ãããã¡ããšçè§£ããããšæãããã«ãªããŸããã RubyKaigi 2023 ã§çè§£ãæ·±ããããšæããŸãã å®£äŒ åé ã§èª¬æããããã«ãã¿ã€ããŒã¯ RubyKaigi 2023 ã§ããŒã¹åºå±ãè¡ããŸããä»åã®èšäºã§ã¯ããã©ãŒãã³ã¹æ¹åã®çµæã®ã¿ç޹ä»ããŸããããã¿ã€ããŒã§ã®ãããã£ãæè¡æ¹åã«ãããåãçµã¿æ¹ãªã©è©±ãããããšã¯è²ã
ããã®ã§ããã²ããŒã¹ã§ã話ããããŠãã ããïŒ ãŸããRubyKaigi åŸ 5/16ïŒç«ïŒã«ã¯ã¹ãã³ãµãŒæ¯ãè¿ãäŒã Qiita ãããWantedly ãããšå®æœäºå®ã§ãã ãèªåã®äŒç€Ÿã RubyKaigi ã¹ãã³ãµãŒãããŠã»ãããšæã£ãŠãããšã³ãžãã¢ããã¿ãŒã²ããã«ããã¡ãã£ãšããããªäŒã§ããããããããŠèªåã¿ãŒã²ããããâŠïŒãšæãæ¹ã¯ãã²ãåå ãã ããïŒ wantedly.connpass.com *1 : åèšã®åŠçæé = å¹³åã¬ã¹ãã³ã¹ã¿ã€ã x hitsæ° *2 : æãåèšã®åŠçæéãé·ããšã³ããã€ã³ãã¯GWã®ç¹éã®åœ±é¿ã§ã¬ã¹ãã³ã¹ã¿ã€ã ã«å€åãçããæ¯èŒãå°é£ã§ãã£ãããé€å€ããŠããŸãã
ããã«ã¡ã¯ã2022幎11æã«æ ªåŒäŒç€Ÿã¿ã€ããŒã«å
¥ç€Ÿãã sinsoku ã§ãã æè¿ã¯ GitHub Actionsã® YAML ãæžãæ©äŒãå€ãã YAML ãè€éåããŠããŸããã ããããæ¥åžžçã« YAML ãè§Šã£ãŠããè·äººä»¥å€ã«ã¯ãããšèªããªãããšãå€ãã®ã§ã瀟å
ã®æ¹ã
ãèªããããã« GitHub Actionsã® YAML ã®æžãæ¹ããŸãšããããšæããŸãã ç®æ¬¡ äžé
æŒç®å ç°å¢å€æ°ïŒenvïŒ å€æ°ïŒoutputsïŒ é¢æ°ïŒworkflow_callïŒ é¢æ° + é
åïŒdynamic matrixïŒ GitHub CLIã®æŽ»çš ãŸãšã äžé
æŒç®å GitHub Actions ã«ã¯ äžé
æŒç®å ããªãããã代ããã«è«ç æŒç®å ã䜿ããŸãã - steps : - run : echo "${{ (github.ref == 'refs/heads/main' && 'production') || 'staging' }}" åè: Expressions ç°å¢å€æ° ïŒenvïŒ ç°å¢å€æ° ã䜿ãããå Žå㯠env ã§å®çŸ©ããŸãã env : TIMEE_CEO : ryo TIMEE_CTO : kameike jobs : job-env : runs-on : ubuntu-latest steps : - run : echo $TIMEE_CEO # ãã®å®è£
ã ãšçœ®æåŸã®æåå `echo kameike` ãå®è¡ãã - run : echo ${{ env.TIMEE_CTO }} ãã ãã env ã§ env ã®å€ãæå®ãããšãšã©ãŒã«ãªãã±ãŒã¹ãããã®ã§æ³šæããŠãã ããã env : DEPLOY_ENV : ${{ (github.ref == 'refs/heads/main' && 'production' ) || 'staging' }} # Unrecognized named-value: 'env'. Located at position 1 within expression: env.DEPLOY_ENV == 'production' IS_PROD : ${{ env.DEPLOY_ENV == 'production' }} jobs.<job_id>.env ã§ãåæ§ã®ãšã©ãŒãåºãŸãã jobs : job-error : runs-on : ubuntu-latest # Unrecognized named-value: 'env'. Located at position 1 within expression: env.DEPLOY_ENV == 'production' IS_PROD : ${{ env.DEPLOY_ENV == 'production' }} jobs.<job_id>.steps[*].env ã§ããã°ãšã©ãŒã«ãªããŸããããåãé局㮠env ã®å€ã¯åç
§ã§ããŸããã env : TIMEE_CTO : kameike jobs : job-env : runs-on : ubuntu-latest steps : # ãã®å®è£
ã ãš `echo "true, foo, -bar"` ãå®è¡ãã - run : echo "${{ env.IS_KAMEIKE }}, ${{ env.FOO }}, ${{ env.BAR }}" env : IS_KAMEIKE : ${{ env.TIMEE_CTO == 'kameike' }} FOO : foo BAR : ${{ env.FOO }}-bar åè: Workflow syntax for GitHub Actions 倿°ïŒoutputsïŒ æ±çšçãªååã® ç°å¢å€æ° ãå®çŸ©ãããšãäœãã® CLI ã³ãã³ãã«åœ±é¿ããå¯èœæ§ããããŸãã ãããé¿ããããã«ãoutputs ã§å€æ°ãå®çŸ©ããããšãã§ããŸãã steps : - id : var run : | echo "x=foo" >> "$GITHUB_OUTPUT" echo "y=bar" >> "$GITHUB_OUTPUT" # ãã®å®è£
ã ãš `echo "foo, bar"` ãå®è¡ãã - run : echo "${{ steps.var.outputs.x }}, ${{ steps.var.outputs.y }}" outputs 㯠env ãšéãã bash ã®åŠççµæã倿°ã«å®çŸ©ããããšãã§ããŸãã steps : - uses : actions/checkout@v3 - id : var run : | echo "terraform-version=`cat .terraform-version`" >> "$GITHUB_OUTPUT" # ãã®å®è£
ã ãš `echo "1.4.4"` ãå®è¡ãã - run : echo "${{ steps.var.outputs.terraform-version }}" åè: Defining outputs for jobs 颿°ïŒworkflow_callïŒ ã¯ãŒã¯ãããŒã®äžéšãå¥ã®ãã¡ã€ã«ã«å®çŸ©ãã颿°ã®ããã«åŒã³åºãããšãã§ããŸãã # .github/workflows/_say.yml name : say on : workflow_call : inputs : name : required : true type : string jobs : hello : runs-on : ubuntu-latest steps : - run : echo "Hello, ${{ inputs.name }}." bye : needs : hello runs-on : ubuntu-latest steps : - run : echo "Bye, ${{ inputs.name }}." äœ¿ãæ¹ã¯ä»¥äžã®éãã§ãã jobs : job-say : uses : ./.github/workflows/_say.yml with : name : kameike åè: Reusing workflows 颿° + é
åïŒdynamic matrixïŒ workflows_call ã®å
¥åã«ã¯çåœå€ãæ°åãæååãã䜿ããŸããã The value of this parameter is a string specifying the data type of the input. This must be one of: boolean, number, or string. åŒçš: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onworkflow_callinputsinput_idtype ããããå°ã工倫ããããšã§é
åãæ±ãããšãã§ããŸãã # .github/workflows/_say_multi.yml name : say_multi on : workflow_call : inputs : names : required : true type : string jobs : matrix : runs-on : ubuntu-latest outputs : names : ${{ steps.set-matrix.outputs.names }} steps : - id : set-matrix run : | names=`echo '${{ inputs.names }}' | jq -csR 'split("\\n") | map(select(. != ""))' ` echo "names=$names" >> $GITHUB_OUTPUT hello : needs : matrix runs-on : ubuntu-latest strategy : matrix : name : ${{ fromJSON(needs.matrix.outputs.names) }} steps : - run : echo "Hello, ${{ matrix.name }}." äœ¿ãæ¹ã¯ä»¥äžã®éãã§ãã job-say-multi : uses : ./.github/workflows/_say_multi.yml with : names : | ryo kameike GitHub CLI ã®æŽ»çš GitHub API ã䜿ãããšã§ããã§ãã¯ã¢ãŠãããã«ãã¡ã€ã«åãååŸããããšãã§ããŸãã job-gh-matrix : runs-on : ubuntu-latest outputs : files : ${{ steps.set-matrix.outputs.files }} steps : - id : set-matrix run : echo "files=`gh api '/repos/{owner}/{repo}/contents/.github/workflows?ref=${{ github.sha }}' --jq '[.[].name]'`" >> $GITHUB_OUTPUT env : GH_REPO : ${{ github.repository }} GH_TOKEN : ${{ github.token }} job-gh-echo : needs : job-gh-matrix runs-on : ubuntu-latest strategy : matrix : file : ${{ fromJSON(needs.job-gh-matrix.outputs.files) }} steps : - run : echo "${{ matrix.file }}" ç»åã®ããã«ãã¡ã€ã«åã®äžèЧã§äžŠåã«Jobãå®è¡ã§ããŸãã ãŸãšã YAML ãããããã§ããã ãã®èšäºãèªãã æ¹ã®åèã«ãªãã°å¹žãã§ãã ãŸããåŒç€Ÿã® GitHub Actionsããããã€ãããŒã«ã€ããŠæ°ã«ãªãããšãããã°ãããã¿ãŒã®æ¡çšããŒãžã®URLããé¢è«ã®ç³ã蟌ã¿ãã©ããïŒ
ããã«ã¡ã¯ãããã³ããšã³ããšã³ãžãã¢ã®æš«çŠã§ãã ã¿ã€ããŒã®ããã³ããšã³ãã®éçºã«é¢ãããšã³ãžãã¢ã®äººæ°ãå¢ããŠããŸããã倧人æ°ã§éçºããªããå質ãé«ãç¶æ
ã«ä¿ã€ã«ã¯ãå質ã«å¯Ÿããå
±éèªèãäœãããšã倧åã§ãã ãã®ãã³ãããŒã ã§ããã€ã³ããšã³ãã® åäœãã¹ã ã«ã€ããŠã®å匷äŒãéå¬ããŸããã testing-library ãšããããã³ããšã³ãã®ãã¹ãã«äœ¿ãã©ã€ãã©ãªãäŸã«æããå
·äœçãªææ³ãããããã¹ããå®è£
ããåã«æããŠããããææ³ã«ã€ããŠãã©ãŒã«ã¹ããŸããã ããã³ããšã³ãã§ãã¹ããããé
ç® ããã³ããšã³ãã®åäœãã¹ããé£ããããèŠå testing-library ã䜿ã£ãŠå£ãã«ãããã¹ããäœãæ¹æ³ èŠçŽ ãèŠã€ããã¯ãšãª ãŠãŒã¶ã®åäœãã·ãã¥ã¬ãŒã·ã§ã³ãã user-event èŠçŽ ã®ç¶æ
ãæ€æ»ãã jest-dom å®éã«ãã¹ããæžããŠã¿ã ãã¹ããæžããªãã±ãŒã¹ éçšãããšãã®æ³šæç¹ åäœãã¹ããäœãç®çãæç¢ºã«ãã ã¢ã¯ã»ã·ããªãã£ã®ã¬ã€ãã©ã€ã³ãå®ãã ãããã« ããã³ããšã³ãã§ãã¹ããããé
ç® ããã³ããšã³ãã§ãã¹ããããé
ç®ã«ã¯æ¬¡ã®ãããªãã®ããããšæããŸãã ãŠãŒãã£ãªãã£é¢æ°ã ããžãã¹ããžãã¯ ãæ£ããå®è£
ãããŠããããš æå³ããªãèŠãç®ã®å€æŽãèµ·ãããªãããš ãŠãŒã¶ã®åäœã«å¯ŸããŠæåŸ
ããæ£ããå¿çãè¿ã£ãŠããããš ãŠãŒãã£ãªãã£é¢æ°ã ããžãã¹ããžã㯠ã¯é¢æ°ãã¯ã©ã¹ãšããŠåãåºãããããã«å¯ŸããŠã® åäœãã¹ã ãæžãããšã«ãªããŸããåºæ¬çã«ã¯å
¥åã«å¯Ÿããåºåã確èªããåºåå€ããŒã¹ãã¹ãã§ãã¹ãããŸããã¯ã©ã¹ã§å®è£
ããå Žåã«ã¯ã¢ã¯ã·ã§ã³ã«äŒŽã£ãŠå€æŽããç¶æ
ãæ€æ»ããç¶æ
ããŒã¹ãã¹ãã䜵ããŠäœ¿ããŸãããããã¯ããã³ããšã³ã以å€ã§ãæ±ããããã¯ã§ãã æå³ããªãèŠãç®ã®å€æŽãèµ·ãããªãããšããã¹ãããå Žå㯠Visual Regression Test ïŒVRTïŒ ã䜿ããŸãã reg-suit ãªã©ã®ããŒã«ã䜿ã£ãŠã倿Žããšã®ç»åã®ãã£ããã£ãæ®ã£ãŠæ¯èŒããŸãã ãŠãŒã¶ããã¿ã³ãã¯ãªãã¯ããããªã©ã®åäœã®ãã¹ã㯠åäœãã¹ã ã§å®è£
ããããšãã§ããŸãã testing-library ãšããã©ã€ãã©ãªã䜿ã£ãŠãŠãŒã¶ã®åäœãã·ãã¥ã¬ãŒã·ã§ã³ããããšã§ã UI ã³ã³ããŒãã³ã ã®æåãæ€æ»ããŸããç»é¢äžã®è¡šç€ºã«å¯ŸããŠã¯ç¶æ
ããŒã¹ãã¹ããã API ã«ãªã¯ ãšã¹ ããéãããšã®ãã¹ãã¯ã³ãã¥ãã±ãŒã·ã§ã³ããŒã¹ãã¹ããå®è£
ããããšã«ãªããŸãã ãã¹ããããã£ãŒãšããããã®ãã¹ãã§æ€æ»ã§ããããš *1 å匷äŒã§ã¯ åäœãã¹ã ã«ãããããã³ããšã³ãç¹æã®é£ããã«ã€ããŠæ±ãããã®ã§ã3ã€ç®ã®ãããªããŠãŒã¶ã®ç»é¢äžã«è¡šç€ºãããèŠçŽ ã«å¯Ÿããåäœãèµ·ç¹ãšãããããªãã¹ããã«æ³šç®ããŸããã ããã³ããšã³ãã® åäœãã¹ã ãé£ããããèŠå äžè¬çãªãœãããŠã§ã¢ãšæ¯èŒããŠããã³ããšã³ãã«ãããŠç¹çãã¹ãç¹ã«æ¬¡ã®ãããªãã®ããããŸãã ãŠãŒã¶ãèŠçŽ ãååŸãã ãŠãŒã¶ãïŒããŠã¹ãããŒããŒãã®æäœãªã©ã®ïŒã¢ã¯ã·ã§ã³ãå®è¡ãã èŠçŽ ãå€åããããšãæ€æ»ãã ãŠãŒã¶ã®ã¢ã¯ã·ã§ã³ãªã©ã«å¿ã㊠API ãªã¯ ãšã¹ ãããã ããã³ããšã³ãã®ãã¹ããå£ããããã£ããçè§£ããã®ãé£ãããªã£ããããå Žåããšãã«ãèŠçŽ ã®ååŸãã·ãã¥ã¬ãŒãããããšã«èºããŠããããšãå€ãããã«æããŠããŸãã testing-library ã䜿ã£ãŠå£ãã«ãããã¹ããäœãæ¹æ³ testing-library ã¯ããã³ããšã³ãã®ãã¹ãã«äœ¿ãããŒã«çŸ€ã§ãã testing-library ã«ã¯æ¬¡ã®ãããªåºæ¬æ¹éããããŸãã The more your tests resemble the way your software is used, the more confidence they can give you. testing-library.com ãã®ãœãããŠã§ã¢ãå®éã«äœ¿ãããå§¿ã«äŒŒãŠããã»ã©ããã¹ãã®ä¿¡é Œæ§ãé«ããªããŸãã testing-library ã¯ããœãããŠã§ã¢ã®äœ¿ããæ¹ã«äŒŒããã¹ããäœãããããªæ©èœãæäŸããŠãããŠããŸããã©ã€ãã©ãªã䜿ã£ãŠãã¹ããå®è£
ãããšãã«ã¯ããã®èãæ¹ã«åã£ãŠãã¹ããæžãããã«å¿ãããŸãããã 以äžã§ã¯ã testing-library ãæäŸããŠããæ©èœã3ã€ç޹ä»ããŸãã èŠçŽ ãèŠã€ããã¯ãšãª äžã€ç®ã¯ãããŒãžã«è¡šç€ºãããŠããèŠçŽ ãèŠã€ããã¯ãšãªã§ããèŠçŽ ã«å¯ŸããŠåäœãããå ŽåããèŠçŽ ã®ç¶æ
ãæ€æ»ããå ŽåãããŸãã¯èŠçŽ ãèŠã€ããããšããå§ãŸããŸãã testing-library.com ã¯ãšãªã«ã¯åªå
床ãããããªãã¹ãåªå
床ãé«ããã®ã䜿ãããšãæšå¥šãããŠããŸããããšãã°ã getByRole ã¯åªå
床ãé«ãã getByPlaceholderText ã¯åªå
床ãäœãã§ãããããã¯ã©ã®ããã«æ±ºããããŠããã®ã§ããããã ããšãã°ãã©ãã«ããçå¹Žææ¥ãã§ ãã¬ãŒã¹ãã«ã ãŒã "2023-03-27" ã§ãããããªå
¥åèŠçŽ ãèŠã€ããã¯ãšãªãäœã£ãŠã¿ãŸããæ¬¡ã®2çš®é¡ã®å®è£
ã®ããããæ³å®éãã«åããŸããã // 1. ã©ãã«ããçå¹Žææ¥ãã§ããå
¥åèŠçŽ ãååŸãã screen.getByRole ( "textbox" , { name: "çå¹Žææ¥" } ); // 2. ãã¬ãŒã¹ãã«ããŒã "2023-03-27" ã§ãããããªå
¥åèŠçŽ ãèŠã€ãã screen.getByPlaceholderText ( "2023-03-27" ); 1, ã®ã¯ãšãªã¯ãã©ãã«ããçå¹Žææ¥ãã§ããå
¥åèŠçŽ ããååŸããŠããŸãã2. ã®ã¯ãšãªã¯ã ãã¬ãŒã¹ãã«ã ãŒã "2023-03-27" ã§ãããããªå
¥åèŠçŽ ããååŸããŠããŸãããŠãŒã¶ãã¢ããªã±ãŒã·ã§ã³ã䜿çšããéããããã 1. ã®ã¯ãšãªã®ãããªèãæ¹ã§èŠçŽ ãèªèããã§ãããã getByRole ã getByPlaceholderText ãããåªå
床ãé«ãçç±ã¯ããã®ãããªãŠãŒã¶ã®èãæ¹ãåæ ããããåŸåã«ããããã§ãã å¿
ãããåªå
床ãé«ãã¯ãšãªã䜿ãããšãè¯ãããã§ã¯ãªãã§ããããªãã¹ããŠãŒã¶ã®èãæ¹ãåæ ãããŠèŠçŽ ãååŸããã¯ãšãªãæžãããšã¯ãããã¹ããäœãã«æ¬ ãããªããšæããŸãã ãŠãŒã¶ã®åäœãã·ãã¥ã¬ãŒã·ã§ã³ãã user-event ãŠãŒã¶ã®åäœãã·ãã¥ã¬ãŒã·ã§ã³ããããã« user-event ãšããã©ã€ãã©ãªãæäŸããŠããŸãã testing-library.com ç¹å®ã®èŠçŽ ãã¯ãªãã¯ããããããŒããŒãã§å
¥åããããã·ãã¥ã¬ãŒã·ã§ã³ããéã¯æ¬¡ã®ããã«å®è£
ããŸãã // ãŠãŒã¶ãªããžã§ã¯ãã®çæ const user = userEvent.setup (); // ãã¿ã³ãã¯ãªãã¯ãã await user.click ( screen.getByRole ( "button" )); // å
¥åèŠçŽ ã«ãããã«ã¡ã¯ããšå
¥åãã await user. type( screen.getByRole ( "textbox" ), "ããã«ã¡ã¯" ); user.click ãå®è¡ãããšãå®éã«èŠçŽ ãã¯ãªãã¯ãããšããšåãããã«ã€ãã³ããçºç«ããŸããããã«ãã£ãŠãå®è£
è
ã¯ãã¿ã³ãã¯ãªãã¯ãããšãã«è£åŽã§ã©ã®ãããªæåãåãããããæ°ã«ããããšãªããã¹ããå®è£
ããããšãã§ããŸãã åãããã«ãŠãŒã¶ã®åäœãã·ãã¥ã¬ãŒã·ã§ã³ããæ¹æ³ã«ãåãã testing-library ã® fire-event ã䜿ã£ãå®è£
ããããŸãããã¡ãã¯ããŠãŒã¶ã®åäœãã®ãã®ã§ã¯ãªã DOM ã®ã€ãã³ããçºç«ãããæ©èœãæã£ãŠããŸãã user-event ãš fireEvent ã§ã¯ã©ã¡ãã䜿ãã¹ãã§ããããã ãŠãŒã¶ãã¢ããªã±ãŒã·ã§ã³ã䜿ãå Žåãããã®ãã¿ã³èŠçŽ ã® click ã€ãã³ããçºç«ããããããšèããã®ã§ã¯ãªãããã®ãã¿ã³èŠçŽ ãã¯ãªãã¯ãããããšæã£ãŠäœ¿ãã¯ãã§ãããããã£ãŠããã¹ãããœãããŠã§ã¢ã䜿ãããå§¿ã«äŒŒãããšãã芳ç¹ã«ãããŠã user-event ã䜿ãããšãæšå¥šãããŠããŸãããã ãã user-event ãåçŸã§ããŠããªããã©ãŠã¶ã®æåãããã€ãååšããŸãããã®ãããªæåã«å¯ŸããŠãã¹ããæžããããšãã«ã¯ fireEvent ã䜿ããšããã§ããã *2 ã èŠçŽ ã®ç¶æ
ãæ€æ»ãã jest-dom èŠçŽ ã®ç¶æ
ãæ€æ»ããæ©èœãšããŠã jest-dom ãšããã©ã€ãã©ãªãæäŸãããŠããŸãã testing-library.com jest ã®ãããã£ãŒã远å ããŠã確èªïŒAAA ãã¿ãŒã³ *3 ã«ããã AssertïŒãããããããŠãããŸãã æäŸããŠãã颿°ã®äžèЧ ãèŠããšããããããŸãããçŽæçã«ç¶æ
ã確èªã§ããããã«ãªã£ãŠããŸãã ããšãã°ãèŠçŽ ããã©ãŒã«ã¹ãããŠããããšããã¹ãããå Žåã¯æ¬¡ã®ããã«å®è£
ããŸããèŠçŽ ãã©ãããç¶æ
ã®ãšãã«ãã©ãŒã«ã¹ãããŠããããšããå®è£
ã®è©³çްã«ã¯ç«ã¡å
¥ãããèŠçŽ ããã©ãŒã«ã¹ãããŠããããšããŠãŒã¶ãèªèããã®ãšåãããã«ããã¹ããå®è£
ãããŠããããšãããããŸãã const inputElement = screen.getByRole ( "textbox" ); expect ( inputElement ) .toHaveFocus (); å®éã«ãã¹ããæžããŠã¿ã å
·äœçãªãã¹ãã®äŸãèŠãŠã¿ãŸããããæ¬¡ã®ãã㪠UI ã³ã³ããŒãã³ã ã«å¯ŸããŠãã¹ããæžããŠã¿ãŸãã ãã® ã³ã³ããŒãã³ã ã¯æ¬¡ã®ãããªä»æ§ãæºãããŸãã ã©ãã«ããŠãŒã¶åããããã¯ããŒã ããçå¹Žææ¥ãã®å
¥åèŠçŽ ããã å
¥åããŠãéä¿¡ããã¿ã³ãã¯ãªãã¯ãããšã props ã§æž¡ã submit 颿°ãåŒã°ãããå
¥åå€ã¯ãã®åŒæ°ãšããŠäžãããã ããŠãŒã¶åããçå¹Žææ¥ãã¯å¿
é é
ç®ã§ããã空æååã®ãŸãŸãéä¿¡ããã¿ã³ãã¯ãªãã¯ãããš submit ãåŒã°ãããã¢ã©ãŒãã¡ãã»ãŒãžã衚瀺ããã æ¬¡ã®ãããªäºã€ã®ãã¹ããå®è£
ããŸãã ãã¹ãŠã®å
¥åèŠçŽ ã«ããŒã¿ãå
¥åããéä¿¡ããã¿ã³ãã¯ãªãã¯ãããšãããŒã¿ãéä¿¡ãããããš ããŠãŒã¶åãã ã空æååã«ããŠãéä¿¡ããã¿ã³ãã¯ãªãã¯ãããšãããŒã¿ãéä¿¡ãããã«ã¢ã©ãŒãã¡ãã»ãŒãžã衚瀺ãããããš ãŸãã¯ããã¹ãŠã®å
¥åèŠçŽ ã«å€ãå
¥åãã submit 颿°ãåŒã³åºãããŠããããšã確èªãããã¹ããå®è£
ããŠã¿ãŸãã test ( "å
¥åããããŒã¿ãéä¿¡ããã" , async () => { // æºåãã§ãŒãº const mockSubmit = jest.fn (); render (< UserForm submit = { mockSubmit } / >); const user = userEvent.setup (); // å®è¡ãã§ãŒãº await user. type( screen.getByRole ( "textbox" , { name: "ãŠãŒã¶å" } ), "倪é" ); await user. type( screen.getByRole ( "textbox" , { name: "ããã¯ããŒã " } ), "ããã¡ãã" ); await user. type( screen.getByRole ( "textbox" , { name: "çå¹Žææ¥" } ), "2023-03-27" ); await user.click ( screen.getByRole ( "button" , { name: "éä¿¡" } )); // 確èªãã§ãŒãº expect ( mockSubmit ) .toBeCalledWith ( { name: "倪é" , nickname: "ããã¡ãã" , "birthday" : "2023-03-16" } ); } ); å®è¡ãã§ãŒãºã® await user.type(screen.getByRole("textbox", { name: "ãŠãŒã¶å" }), "倪é"); ã¯ããã¢ã¯ã»ã·ãã«ãªååãããŠãŒã¶åãã§ãããããªå
¥åèŠçŽ ã« "倪é" ãšå
¥åããããšããæå³ã§ãã 確èªãã§ãŒãºã§ã¯ã submit ãåŒã°ããŠããããšãšããã®åŒæ°ãšããŠæž¡ããããªããžã§ã¯ããæ€æ»ããŠããŸãã æ¬¡ã«ãããŠãŒã¶åãã®å
¥åèŠçŽ ã«å€ãå
¥åããã«éä¿¡ãã¿ã³ãã¯ãªãã¯ããå Žåã®ãã¹ããå®è£
ããŸãããã®ãšãã submit 颿°ãåŒã³åºããããã¢ã©ãŒãã¡ãã»ãŒãžã衚瀺ãããããšã確èªãããã§ãã test ( "ãŠãŒã¶åã®å
¥åããªããšãããŒã¿ãéä¿¡ãããªã" , async () => { // æºåãã§ãŒãº const mockSubmit = jest.fn (); render (< UserForm submit = { mockSubmit } / >); const user = userEvent.setup (); // å®è¡ãã§ãŒãº await user. type( screen.getByRole ( "textbox" , { name: "ããã¯ããŒã " } ), "ããã¡ãã" ); await user. type( screen.getByRole ( "textbox" , { name: "çå¹Žææ¥" } ), "2023-03-27" ); await user.click ( screen.getByRole ( "button" , { name: "éä¿¡" } )); // 確èªãã§ãŒãº expect ( mockSubmit ) .not.toBeCalled (); const alertTextBox = await screen.queryByRole ( "alert" ); expect ( alertTextBox ) .toHaveTextContent ( "ãŠãŒã¶åãå
¥åãããŠããŸããã" ); } ); åã®ãã¹ããšæ¯ã¹ãŠãå®è¡ãã§ãŒãºã«ãããã¯ã¢ã¯ã»ã·ãã«ãªååãããŠãŒã¶åãã§ããå
¥åèŠçŽ ãžã®å
¥åããªããªããŸããã 確èªãã§ãŒãºã§ã¯ã submit ãåŒã°ããªããªã£ãããšã確èªããŠããŸãããŸããã¢ã©ãŒãã衚瀺ããããã®ããã¹ãã«ã€ããŠãæ€æ»ããŠããŸãã ãããã®ãã¹ããããŠãŒã¶ãã¢ããªã±ãŒã·ã§ã³ã䜿ãéã®äœ¿ç𿹿³ãç¶æ
ã芳枬ããæ¹æ³ããã®ãŸãŸãã¹ãã«åæ ãããŠããã®ãããããšæããŸã *4 ã ãã®ãããªãã¹ãã¯ãèŠçŽ ã®é çªãå
¥ãæ¿ãã£ããäžéšã®å±æ§ãå€ãã£ããããŠã圱é¿ãåãã«ããã人ã«ãšã£ãŠçè§£ãããããã§ãããªãã¹ãã·ã³ãã«ãªãã¹ããå®è£
ã§ããããã«ããã² testing-library ã®æäŸããŠãã API ãçºããŠäœ¿ãæ¹ãèããŠã¿ãŠãã ããã ãã¹ããæžããªãã±ãŒã¹ ããããã¹ããæžãã UI ãæ¬¡ã®ãã㪠ããŒã¯ã¢ãã ã§å®è£
ãããŠãããšã©ãã§ããããã < p > ãŠãŒã¶å </ p > < input id = "name" /> < p > ããã¯ããŒã </ p > < input id = "nickname" /> < p > çå¹Žææ¥ </ p > < input id = "birthday" /> < div > éä¿¡ </ div > ãã®ç¶æ
ã ãšå
ã»ã©ã®ãã¹ããå®è¡ããããšã¯ã§ããªããªããŸããããšãã°ãããŠãŒã¶åããšããæåå㯠id="name" ã§ããå
¥åèŠçŽ ã®ã¢ã¯ã»ã·ãã«ãªååãšããŠèªèãããŸãããããéä¿¡ããšæžãããŠããèŠçŽ ã¯ãã¿ã³ãšããŠèªèãããŸããã ãã®å®è£
ã¯ããã¹ãå®¹ææ§ãäœããšãã以åã«ãã·ã³ãªãŒãããªãã£ãäœãç¶æ
ã«ãããŸãããã·ã³ãªãŒãããªãã£ãšã¯ãæ©æ¢°ã«ãšã£ãŠã®ã³ã³ãã³ãã®èªã¿åããããã®åºŠåãã§ããããã³ããšã³ãã®ãã¹ãã¯ãæ©æ¢°ãã³ã³ãã³ããèªã¿åã£ããæäœããããããŠãœãããŠã§ã¢ã®åäœãã·ãã¥ã¬ãŒã·ã§ã³ãããšããæ§è³ªäžããã·ã³ãªãŒãããªãã£ãé«ãã»ãããã¹ãå®¹ææ§ãé«ããªãåŸåã«ããã ããã³ããšã³ãã®ãã¹ãã®å°å
¥ã®åã«ããã·ã³ãªãŒãããªãã£ïŒã²ããŠã¯ ã¢ã¯ã»ã·ããªã㣠ïŒã®åäžãç®æããšãããšæããŸããå
ã»ã©ã®å®è£
ã¯ãããšãã°ã次ã®ããã«ä¿®æ£ããããšã§ãã·ã³ãªãŒãããªãã£ããã¹ãå®¹ææ§ãé«ãŸããŸãã < label for = "name" > ãŠãŒã¶å </ label > < input id = "name" /> < label for = "nickname" > ããã¯ããŒã </ label > < input id = "nickname" /> < label for = "birthday" > çå¹Žææ¥ </ label > < input id = "birthday" /> < button > éä¿¡ </ button > éçšãããšãã®æ³šæç¹ ãã¹ãã¯ãœãããŠã§ã¢ã®å質ã®åäžã«ãªããŠã¯ãªããªãã§ãããããèªäœããœãããŠã§ã¢ã®å質ãåäžãããéæ³ã§ã¯ãããŸããã ãœãããŠã§ã¢ã®å質ãäžãããããããªãã¹ããå®è£
ããããã«ã次ã®ãããªããšãäºåã«æ±ºããŠãããšããã§ãã åäœãã¹ã ãäœãç®çãæç¢ºã«ãã ããªããŒã·ã§ã³ãå«ãå
¥åãã©ãŒã ã® ã³ã³ããŒãã³ã ãç¹å®ã® API ãå©ã ã³ã³ããŒãã³ã ãä»ã®ããŒãžãžã®å°ç·ããã ã³ã³ããŒãã³ã ãªã©ãªã©ãå€çš®å€æ§ãª ã³ã³ããŒãã³ã ããšã«å¿
èŠã«ãªããã¹ãã¯ç°ãªããŸãã åäœãã¹ã ãäœãç®çã¯ããœãããŠã§ã¢ã®éè¡ã«å¯Ÿããä¿è·ã ãªãã¡ã¯ã¿ãªã³ã° ãžã®èæ§ãäžããŠããœãããŠã§ã¢éçºãããžã§ã¯ãã®æé·ãæç¶å¯èœã«ããããšã§ã *5 ãããããäœããã£ãŠããŠãæç¶å¯èœã§ããããšäž»åŒµãããã¯äººã«ãã£ãŠå€ãããŸãã ã©ãã ãã®ã·ããªãªãã«ããŒãããã¹ããå®è£
ããã ãœãããŠã§ã¢ãããã·ããªãªã§ä»æ§éãã«åäœããããšãæ€æ»ããã«ã¯ã©ã®ãããªãã¹ããããã ã©ãããç¶æ
ã®ãšãã"ãããã¹ãã§ãã"ãšãããã ãããã¯ãããŒã ã®ææ³ã察象ãšãªããœãããŠã§ã¢ã«ãã£ãŠåçã¯æ§ã
ã§ãããã ã«ãã¬ããž ãäžããããšãç®çãšããŠãã¹ãã倧éã«å®è£
ããŠãããããã軜èŠããŠããŸããšæè¡çè² åµã«ãªã£ãŠãã£ãããªãã§ãããã¹ãã«åãçµãåã«ããã¹ããå®è£
ããç®çããã£ããèãããããšãããã¹ãã®å®è£
ãã§ãããšæããŸãããã¡ããããããã®ããšã¯ããã³ããšã³ã以å€ã®ãã¹ãã§ãåãã§ãã ã¢ã¯ã»ã·ããªã㣠㮠ã¬ã€ãã©ã€ã³ ãå®ãã åè¿°ã®ãšããããã·ã³ãªãŒãããªãã£ãé«ãã»ã© testing-library ã䜿ã£ããã¹ããå®è£
ãããããªããŸãã testing-library ã䜿ã£ããã¹ãã®å質ãé«ããããã«ã¯ã ã¢ã¯ã»ã·ããªã㣠ã®åäžãå¿
é ãšèšã£ãŠããã§ããã *6 ã ãã ãããã¹ãã®å質ã®åäžã®ããã ãã« ã¢ã¯ã»ã·ããªã㣠ã®åäžãç®æããšãæ¬åœã«ãŠãŒã¶ã«ãã£ãŠã¢ã¯ã»ã·ãã«ãªãœãããŠã§ã¢ã«ãªããšã¯éããŸããã ã¢ã¯ã»ã·ããªã㣠ãåäžãããç®çãããããªããªã£ãŠããŸã£ãŠã¯æ¬æ«è»¢åã§ãã ããšãã°ã img ã¿ã°ã« alt 屿§ãä»äžãããšã getByAltText ã䜿ã£ãŠèŠçŽ ãååŸããããšãã§ããŸããäžæ¹ã aria-label ãä»äžãããšã getByRole ã䜿ã£ãã¯ãšãªã§èŠçŽ ãååŸããããšãã§ããããã«ãªããŸãããã¹ãã ããèãããš getByRole ã®ã»ããã¯ãšãªã®åªå
床ãé«ãã®ã§ aria-label 屿§ãä»äžããã»ããããããã«æããŸãããããã alt ãš aria-label ã§ã¯æåãããšãªããäžæŠã« aria-label ã䜿ãããšããããšã¯èšããŸãã *7 ããã¹ãã¯ãããŸã§å
éšå質ã®åäžã®ããã«å®è£
ããããã®ã§ãå
éšå質ã®åäžããã«å€éšåè³ªãæ£æããã®ã¯é¿ããã»ããããã§ãã alt 屿§ã䜿ã£ãå®è£
ã®ã»ãããŠãŒã¶äœéšããããªããšå€æãããªãã testing-library ã®ã¯ãšãªã®åªå
床ã¯ç¡èŠããŠå®è£
ãããã¹ãã§ãã ãŸãã¯ãã¹ããæ°ã«ããã«ã ã¢ã¯ã»ã·ããªã㣠㮠ã¬ã€ãã©ã€ã³ ãå®ããã®ãããã§ãããããããŠãå¶å®ããã ã¬ã€ãã©ã€ã³ ãããšã«ããå®è£
ã«å¯Ÿãããã¹ãã®å®è£
æ¹æ³ã«ã€ããŠæ€èšããŸãã ããã ã¬ã€ãã©ã€ã³ ã«æ²¿ã£ãå®è£
ã§ã¯ãã¹ããå®è£
ãã¥ãããšæãããªãã°ããŠãŒã¶ãžã®åœ±é¿ããªãç¯å²ã§ ã¬ã€ãã©ã€ã³ ãæ¹å®ããã®ããããšæããŸãã ãããã« ãã¹ãã¯ãŠãŒã¶äœéšã«åœ±é¿ãäžããŸããããéçºè
äœéšã®åäžã«å€§ããå¯äžããŸãããã£ãããã¹ããäœãã®ã ããããã广çãªãã¹ããæžããŠéçºè
äœéšãåäžããããã§ãã ä»åã¯ããã³ããšã³ãã® åäœãã¹ã ãšãã芳ç¹ã§ãããã¹ãã®æžãæ¹ã«ã€ããŠèããŸãããã VRT ã E2E ãã¹ãã§ã¯ããŸãéã£ã芳ç¹ãå¿
èŠã«ãªããŸããæ§ã
ãªãã¹ãã䜿ãããªããŸã§ã®éã®ãã¯é·ãã§ãããå°ãã¥ã€æ¹åããŠãããããã«åªåããŠããããã§ãã *1 : ç»ååŒçš: https://testingjavascript.com *2 : https://ph-fritsche.github.io/blog/post/why-userevent *3 : åäœãã¹ã ã®èãæ¹/äœ¿ãæ¹ p57-58 *4 : ã³ãã¥ãã±ãŒã·ã§ã³ããŒã¹ãã¹ãã¯ãã®æ§è³ªäžããŠãŒã¶ãç¥èŠãããŸãŸã®ãã¹ãã«ã¯ãªããªãã§ããsubmit ãåŒã°ããããšã®æ€æ»ã¯ã³ãã¥ãã±ãŒã·ã§ã³ããŒã¹ãã¹ãã§ãã *5 : åäœãã¹ã ã®èãæ¹/äœ¿ãæ¹ p6-10 *6 : https://logmi.jp/tech/articles/328087#s3 *7 : https://www.scottohara.me/blog/2019/05/22/contextual-images-svgs-and-a11y.html#images-that-convey-information
ããã«ã¡ã¯ãã¿ã€ããŒã®ããŒã¿çµ±æ¬éšã§ããŒã¿ãµã€ãšã³ãã£ã¹ããããŠããå°é¢ã§ãã ã¿ã€ããŒã®ããŒã¿ãµã€ãšã³ã¹ããŒã ã§ã¯ãããŒã¿åæãæ©æ¢°åŠç¿ã¢ãã«æ§ç¯ã«å ããŠãGoogle Cloudã䞻軞ãšããMLOpsåºç€ã®æ§ç¯ãªã©ã®æ¥åã«æ¥ã
åãçµãã§ããŸãã ãã®äžã§ãGoogle Cloudã䞻軞ãšããMLOpsåºç€ã®æ§ç¯ã«é¢é£ããŠã Google Cloud Professional Machine Learning Engineerèªå®è³æ Œ ã瀟å
å¶åºŠã掻çšããªããååŸããã®ã§ãå®éã«ããå匷ã®å
容ãªã©ã玹ä»ããããšæããŸãã ããããåéšãããæ¹ã®åèã«ãªãã°å€§å€å¬ããã§ãïŒ åéšã®åæ© çè
ã®å匷éå§æã®ç¶æ³ ååŒ·æ¹æ³ 1. æ©æ¢°åŠç¿ãããžãã¹æŽ»çšããéã®ãã¹ããã©ã¯ãã£ã¹ 1.1. Googleãèããæ©æ¢°åŠç¿ãããžã§ã¯ãã®ãã¹ãã©*1ãçè§£ 2. Google Cloudã®MLé¢é£ãµãŒãã¹ 2.1. Google Cloudã®ãµãŒãã¹ãWhizlabsã®ã³ãŒã¹*2ã«ä»å±ããŠããç·Žç¿åé¡ãè§£ããªããæŽç 2.2. Googleãèããèšèšãã¿ãŒã³ãã¢ãŒããã¯ãã£ã»ã³ã¿ãŒ*3ããçè§£ 2.3. TensorFlowé¢é£ãµãŒãã¹*4ã®æŠèŠãçè§£ 3. æ©æ¢°åŠç¿ã»çµ±èšåŠã«é¢ããç¥è 3.1. GoogleãæäŸããŠããç¡æã®æ©æ¢°åŠç¿ã³ãŒã¹*5ãäžéã鲿¬ åæ ŒåŸè²°ããCertificateãšããã«ã㣠Certificate ããã«ã㣠Weâre Hiring! åéšã®åæ© Google Cloudã®MLé¢é£ãµãŒãã¹ã»MLåšãã®ææ³ãè³æ Œå匷ãéããŠæŽçãããã£ããã MLOpsåºç€ã«ãããã¢ãŒããã¯ãã£èšèšãè¡ãããã®ã€ã³ãããããããã£ããã åŒç€Ÿã§å§ãŸã£ã è³æ ŒååŸæ¯æŽå¶åºŠ ãããæŽ»çšãããã£ããã åœæããã«åã¬ãŒããÂ¥140ãè¶
ããŠãããåéšæ$200ãäŒç€Ÿã§è² æ
é ããã®ã¯å€§å€ããããã... çè
ã®å匷éå§æã®ç¶æ³ å匷éå§æã®ç¶æ³ã«ãã£ãŠãå匷æéãå
容ãç°ãªããšæãã®ã§ã æ¬è©Šéšã«å¿
èŠã ãšæãããç¥èã»èœåã«ããããçè
ã®å匷éå§æã®ç¶æ³ã3ã€ã®èгç¹ã§å
±æããããšæããŸãã äžèšã®éããçè
ã®å匷éå§æã®ç¶æ³ã¯ãæ©æ¢°åŠç¿ã®åæç¥èãè±èªèœåã¯ããçšåºŠããããGoogle Cloudã«é¢ããç¥èã¯ãŸã æµ
ããšãã£ãç¶æ³ã§ããã Google Cloud è§Šãå§ããŠ4ã¶æããã Vertex AIäžã§ã®MLãã€ãã©ã€ã³æ§ç¯ãããéçšã§ããã®ä»ã®é¢é£ãµãŒãã¹ãäžéãçµéšããŠãã NLPãåç»åç³»ã®ãµãŒãã¹ã¯äžåºŠãè§Šã£ãäºããªã TensorFlowãšãã®é¢é£ãµãŒãã¹ã®æ·±ãç¥èã¯ãªã æ©æ¢°åŠç¿ æ°åãã3幎éããŒã¿ãµã€ãšã³ãã£ã¹ããšããŠåããŠãããäž»èŠãªMLé¢é£ã®çè«ãšãã®å®è£
ã¯èº«ã«ã€ããŠãã è±èª ä»åã®è©Šéšã§èŠæ±ãããReadingã¬ãã«ã«ã¯ãäœè£ãæã£ãŠéããŠãã ååŒ·æ¹æ³ 詊éšã¬ã€ã ã«èšèŒãããŠããå
容ãšåéšããææããã åºé¡ãããåé¡ã¯ä»¥äžã®3芳ç¹ã§åé¡åºæ¥ããšæããŸããã æ©æ¢°åŠç¿ãããžãã¹æŽ»çšããéã®ãã¹ããã©ã¯ãã£ã¹ Google Cloudã®MLé¢é£ãµãŒãã¹ æ©æ¢°åŠç¿ã«é¢ããç¥è ããããã¯ãäžã§å®çŸ©ãã3芳ç¹ããšã«å匷ããå
容ã玹ä»ãããŠé ããŸãã åç« ã§è§ŠããéãGoogle Cloudã®ãµãŒãã¹åšãã®ç¥èããŸã æµ
ãã£ãäºãããããã®ç¹ãéç¹çã«åŠç¿ããŸããã 1. æ©æ¢°åŠç¿ãããžãã¹æŽ»çšããéã®ãã¹ããã©ã¯ãã£ã¹ 1.1. Googleãèããæ©æ¢°åŠç¿ãããžã§ã¯ãã®ãã¹ãã© *1 ãçè§£ DSãMLãšã³ãžãã¢ãšããŠåããŠããæ¹ã¯ãäžåºŠã¯èªãã§ãããæ¹ãè¯ãããã§ã åºé¡ãã€ã³ããšããŠãç¹ã«æããŠãããæ¹ãè¯ã䞻匵ã¯ä»¥äžã®éãã§ã è§£ãã¹ã課é¡ã«å¯ŸããŠMLãçšãããåŠãã¯æ
éã«æ€èšãã MLãçšãã解決çãšMLãçšããªã解決çãæ¯èŒããéã¯ãæ¹åå¹
ãã³ã¹ããä¿å®æ§ã®èгç¹ããæ¯èŒãã MLã®æŽ»çšã«ã¯ãååãªéãã€å質ãæ
ä¿ãããããŒã¿ãããäºãéèŠ å®éã®åé¡ã§ã¯ãMLãçšãã解決çãšéMLãªè§£æ±ºçãéžæè¢ã«ãããå顿ã«ããå
·äœçãªèª²é¡èšå®ã«å¯ŸããŠé©åãªè§£æ±ºçãéžæãããšãã£ã圢åŒã§åºé¡ãããŸã 2. Google Cloudã®MLé¢é£ãµãŒãã¹ 2.1. Google Cloudã®ãµãŒãã¹ãWhizlabsã®ã³ãŒã¹ *2 ã«ä»å±ããŠããç·Žç¿åé¡ãè§£ããªããæŽç åãµãŒãã¹ã®ç¹æ§ãã¢ãŒããã¯ãã£ã®èšèšãçè§£ããäžã§éèŠãªèгç¹ïŒåºé¡ãã€ã³ãïŒ ããŒã³ãŒãã§å®çŸãããã®ãåŠã ããŒã³ãŒããšåé¡ã«æžããŠããå Žåã«ã¯ãGUIç³» or AutoMLç³»ã®ãµãŒãã¹ãéžæãã ã¢ããªã³ã°ã®å·¥æ°ãæããã®ãåŠã ã¢ããªã³ã°ã®å¿
èŠãç¡ããäºååŠç¿æžã¿ã®ã¢ãã«ã§äºè¶³ããå Žåã¯ãäºååŠç¿æžã¿ã®ã¢ãã«ã䜿çšã§ãããµãŒãã¹ãéžæãã å°ãªãå·¥æ°ã§ã«ã¹ã¿ã ã¢ãã«ãæ§ç¯ããå¿
èŠãããå Žåã¯ãAutoMLç³»ãµãŒãã¹ãéžæãã èªç±åºŠãé«ãããçšåºŠå·¥æ°ã®æããã¢ãã«ãæ§ç¯ããå¿
èŠãããå Žåã«ã¯ãVertex AI Workbenchãªã©ã®éçºç°å¢ç³»ãµãŒãã¹ãéžæãã Googleã®ãã¹ãã©ã«åã£ãã¢ãŒããã¯ãã£ã§æ§æã§ããŠããã åãµãŒãã¹ã®ç¹æ§ããåŸè¿°ããã¢ãŒããã¯ãã£ã»ã³ã¿ãŒããGoogleãæšå¥šããã¢ãŒããã¯ãã£ãçè§£ãã äžèšã®Google Cloudäžã®MLé¢é£ãµãŒãã¹ãšãã®æ©èœãæããŠãããšè¯ãããã§ã ããŒã¿ããŒã¹ç³» BigQuery ãã«ãããŒãžãããµãŒããŒã¬ã¹ããŒã¿ãŠã§ã¢ããŠã¹ BigTable 倧éã®ããŒã¿ããªã¢ã«ã¿ã€ã ã§åŠçããããšã«åªããŠããNoSQLããŒã¿ããŒã¹ CloudSQL My SQL, PostgreSQLçãã¯ã©ãŠãäžã§åããããã®ãããŒãžããµãŒãã¹ åæåºç€ç³» Dataflow ãªãœãŒã¹ã®ãªãŒãã¹ã±ãŒãªã³ã°ãªã©ãç¹åŸŽã«æã€ETLããŒã« Data Fusion GUIæäœã§ETLã»ELTãã€ãã©ã€ã³ãæ§ç¯åºæ¥ããµãŒãã¹ Dataproc 忣åŠçããŒã«ã§ããHadoop/Sparkã®å®è¡ç°å¢ãã¯ã©ãŠãäžã§æäŸããŠããããµãŒãã¹ Pub/Sub ãªã¢ã«ã¿ã€ã ããŒã¿ãã€ãã³ãããŒã¿ã®åã蟌ã¿ãè¡ãããã®ã¡ãã»ãŒãžã³ã°ãµãŒãã¹ éçšç³» Cloud Build CI/CDã®æ§ç¯ãå®è¡ãæäŸãããµãŒãã¹ Cloud Source Repositories Google Cloud ã§ãã¹ããããŠãããã©ã€ããŒãGitãªããžã㪠ååŠçç³» Dataprep ããŒã¿ãå¹ççã«ã¯ã¬ã³ãžã³ã°åŠçåºæ¥ããµãŒãã¹ Cloud Data Loss Prevention æ©å¯æ§ã®é«ãããŒã¿ãæ€åºãåé¡ãä¿è·ããæ©èœãæäŸãããµãŒãã¹ MLç³» Vertex AI Google Cloudã®MLé¢é£ã®ãµãŒãã¹ãçµ±åããããã©ãããã©ãŒã AutoML ç³»ã®ãµãŒãã¹ããã¡ãã«å
šãŠçµ±åããã Vertex AI Workbench, Vertex AI Data Labeling, Vertex AI Feature Storeçã®è©³çŽ°ãªæ©èœã®æŠèŠãæããŠãããšè¯ãããã§ã gcloud CLI çµç±ã§Vertex AIã®jobãå®è¡ããããã®ã³ãŒããå°ãåºé¡ãããŸã BigQuery ML SQLã䜿çšããŠãBigQueryäžã§MLã¢ãã«ãæ§ç¯ããå®è¡ã§ãããµãŒãã¹ BQMLäžã§ãµããŒããããŠããã¢ãã« ã¯æããŠãããæ¹ãè¯ãããã§ã Recommendations AI ECåãã®ã¬ã³ã¡ã³ãã·ã¹ãã ãæäŸãããã«ãããŒãžããµãŒãã¹ æé©åãããææšã«ãã£ãŠæšèŠã®ä»æ¹ãéžæåºæ¥ã Kubeflow Googleãå
¬éããŠããæ©æ¢°åŠç¿ã¯ãŒã¯ãããŒãKubernetesäžã§å®çŸããããã®OSS Pythonã§ã¯ã Kubeflow Pipelines SDK ãçšããŠMLãã€ãã©ã€ã³ãå®è£
ããäºãåºæ¥ã èªç¶èšèªç³» Speech to Text API é³å£°ããŒã¿ãããã¹ãã«å€æããAPI Text to Speech API ããã¹ããèªç¶ãªé³å£°ã«å€æããAPI Natural Language AI Natural Language API äºååŠç¿æžã¿ã¢ãã«ã«ãã£ãŠãææ
åæããšã³ãã£ãã£åæããšã³ãã£ãã£ææ
åæãã³ã³ãã³ãåé¡ãæ§æåæãªã©ãæäŸããAPI 以äžã®ãµãŒãã¹ã¯ãVertex AI AutoMLãžã®çµ±åã«äŒŽãå
¬åŒã« éæšå¥š ãšãªã£ãããåéšåœæã«ã¯åºé¡ãããŠãã AutoML Natural Language API ã«ã¹ã¿ã ã¢ãã«ã«ãã£ãŠãNatural Language APIã®æ©èœãæäŸããAPI Document AI API éæ§é åããŒã¿ã察象ã«ãããŒã¿ãç°¡åã«çè§£ãåæãå©çšã§ããããããAPI Dialogflow ãã£ããããããµãŒãã¹ãäœæã§ãããµãŒãã¹ åç»åç³» Vision AI Vision API äºååŠç¿æžã¿ã¢ãã«ã«ãã£ãŠãç»ååé¡ããªããžã§ã¯ãæ€åºãªã©ãæäŸããAPI Vertex AI Vision åç»åããŒã¿ã®åã蟌ã¿ããã¢ãã«æ§ç¯ããããã€ãŸã§äžè²«ããŠè¡ãããµãŒã㹠以äžã®ãµãŒãã¹ã¯ãVertex AI Visionãžã®çµ±åã«äŒŽãå
¬åŒã« éæšå¥š ãšãªã£ãããåéšåœæã«ã¯åºé¡ãããŠãã AutoML Vision ã«ã¹ã¿ã ã¢ãã«ãæ§ç¯ããŠãVision APIã®æ©èœãæäŸãããµãŒãã¹ AutoML Vision Edge ãšããžããã€ã¹åãã«æé©åãããã¢ãã«ã«ãã£ãŠãVision AIã®æ©èœãæäŸãããµãŒãã¹ Video AI Video Intelligence API äºååŠç¿æžã¢ãã«ã«ãã£ãŠãåç»ããã®ç©äœæ€åºãªã©ãæäŸããAPI 以äžã®ãµãŒãã¹ã¯ãVertex AI Visionãžã®çµ±åã«äŒŽãå
¬åŒã« éæšå¥š ãšãªã£ãããåéšåœæã«ã¯åºé¡ãããŠãã AutoML Video Intelligence ã«ã¹ã¿ã ã¢ãã«ãæ§ç¯ããŠãVideo Intelligence APIã®æ©èœãæäŸãããµãŒãã¹ 2.2. Googleãèããèšèšãã¿ãŒã³ãã¢ãŒããã¯ãã£ã»ã³ã¿ãŒ *3 ããçè§£ ããã«èŒã£ãŠããã¢ãŒããã¯ãã£ãšé¡äŒŒãããã®ãå®éã®åé¡ã§ãåºé¡ãããŠããŸãã åºé¡ããã圢åŒã¯ãã¢ãŒããã¯ãã£ãæ§æããäžéšãµãŒãã¹ã空çœã«ãªã£ãŠãããããã«åœãŠã¯ãŸããµãŒãã¹ãéžæãããšãã£ãæãã§ãã 2.3. TensorFlowé¢é£ãµãŒãã¹ *4 ã®æŠèŠãçè§£ åºé¡æ°ã¯å€ããªãã£ãã§ãããããã«èŒã£ãŠããTensorFLowé¢é£ãµãŒãã¹ã®ååãšãã®æ©èœã¯äžå¿æããŠãããšè¯ãããã§ã 3. æ©æ¢°åŠç¿ã»çµ±èšåŠã«é¢ããç¥è 3.1. GoogleãæäŸããŠããç¡æã®æ©æ¢°åŠç¿ã³ãŒã¹ *5 ãäžéã鲿¬ åºé¡ãã€ã³ããšããŠãç¹ã«çè§£ããŠãããæ¹ãè¯ããããªå
容ã¯ä»¥äžã®éãã§ã æ©æ¢°åŠç¿ã¢ãã« åé¡èšå®ã«å¯Ÿããé©åãªæ©æ¢°åŠç¿ã¢ãã«ã®éžã³æ¹ ç»ååé¡ã«ã¯CNNãæç³»ååé¡ã«ã¯RNNãªã© TensorFlowã§æžãããDNNã®æ§é ãèªã¿åã è©äŸ¡ææš Precision, Recall, F1-scoreã«ä»£è¡šãããåé¡åé¡ã®è©äŸ¡ææšã®å®çŸ© ç®çã«å¯Ÿããé©åãªè©äŸ¡ææšã®éžã³æ¹ äžåè¡¡ããŒã¿ã«å¯Ÿããè©äŸ¡ææšã®éžã³æ¹ ååŠç ã«ããŽãªã«ã«ããŒã¿ãžã®é©åãªååŠçææ³ã®éžæ One-hot encoding, Label encodingãªã© æ°å€ããŒã¿ãžã®é©åãªååŠçææ³ã®éžæ Min-Max normalization, Z-score normalization, Log scalingãªã© æ¬ æããŒã¿ãžã®é©åãªå¯Ÿå¿ ãã€ããŒãã©ã¡ãŒã¿ãã¥ãŒãã³ã° DNNã«ããããã€ããŒãã©ã¡ãŒã¿ãã¥ãŒãã³ã° åŠç¿çãããããµã€ãºããšããã¯æ°ãããããã¢ãŠããªã© åé¡èšå®ã«å¯Ÿããé©åãªããŒã¿å岿æ³ã®éžã³æ¹ k-fold, group k-fold, leave-one-out, time series splitãªã© éåŠç¿ãžã®å¯Ÿå¿ é©åãªæ£ååææ³ã®éžã³æ¹ Leakageãçºçãããæ¡ä»¶ã®çè§£ãšãã®å¯Ÿå¿ åæ ŒåŸè²°ããCertificateãšããã«ã㣠Certificate www.credential.net ããã«ã㣠ãã®Machine Learning Engineer VestãçãŠåºç€Ÿããã°ã瀟å
ã§äžç®ã眮ãããããšééããªãã§ãã 2幎åã«åéšããååã¯ãã¿ã³ãã©ãŒãè²°ãããããã矚ãŸããã Machine Learning Engineer Vest Weâre Hiring! ã¿ã€ããŒã®ããŒã¿çµ±æ¬éšã§ã¯ããšãã«åãã¡ã³ããŒãåéããŠããŸãïŒ product-recruit.timee.co.jp *1 : https://developers.google.com/machine-learning/problem-framing *2 : https://www.whizlabs.com/professional-machine-learning-engineer/ *3 : https://cloud.google.com/architecture/ai-ml?hl=ja *4 : https://www.tensorflow.org/resources/libraries-extensions?hl=ja *5 : https://developers.google.com/machine-learning
ããã«ã¡ã¯ãã¿ã€ããŒã®ããŒã¿çµ±æ¬éšã§ããŒã¿ãµã€ãšã³ãã£ã¹ããæ
åœããŠãã å°æ ã§ãã ããŒã¿çµ±æ¬éšã¯ãçµç¹å
ã«ãããããŒã¿å©æŽ»çšãä¿é²ãããããããŒã¿åæãäºæž¬ã¢ãã«æ§ç¯ãããŒã¿åºç€æ§ç¯ãªã©ã®æ¥åã«æ¥ã
åãçµãã§ããŸãã ä»åã éšçœ²å
ã§ãå¿ççå®å
šæ§ãã«é¢ããå匷äŒãéå¬ããŸãã ã ãã®èšäºã§ã¯ã å匷äŒã®å
容ãããšã«ããŠãå¿ççå®å
šæ§ãã«ã€ããŠè§£èª¬ ããããšæããŸãã å¿ççå®å
šæ§ãšã¯ãªã«ã ãå¿ççå®å
šæ§ããšã¯ ãã¢ã€ãã¢ã»è³ªåã»æžå¿µã»ééãã話ãããšã§ã眰ãããããã蟱ãããããããªããšããä¿¡æ¡ã®ããšã ãæããŸãã ããå°ãåã¿ç ããšãã¢ã€ãã¢ãæèŠãèšã£ãŠãåãå
¥ããããè©äŸ¡ãããç°å¢ããšè¡šçŸã§ããŸãã ãã®æŠå¿µãæå±ããã®ã¯ããŒããŒã倧åŠã®çµç¹è¡ååŠè
ã§ãããšã€ããŒã»ãšãã¢ã³ããœã³å士ã§ãã 圌女ãè¡ãªã£ãç
é¢ã®å»çãã¹ã«é¢ããç ç©¶ããå¿ççå®å
šæ§ã®æŠå¿µã®ããŒã¹ã«ãªããŸãã [ 1 ]ã ç ç©¶ã®çµæãåªç§ãªå»çããŒã ã®ã¹ã¿ããã¯æ¥é ããå°ããªãã¹ãæžå¿µç¹ãççŽã«è©±ãåã£ãŠãããå»çãã¹ãå°ãªãããšãåãããŸããã ãã®äžæ¹ã§ãåªç§ã§ãªãå»çããŒã ã§ã¯ãã¹ã¿ããã¯æ¥é ã®ãã¹ãæžå¿µç¹ãå ±åãããå»çãã¹ãçºçããŠããããšã«æ°ã¥ããŸããã ãã®åªç§ãªå»çããŒã ãæã€é¢šåã«ã圌女ã¯ãå¿ççå®å
šæ§ããšååãã€ããŸããã ãã®åŸãGoogleã®ç ç©¶ããŒã ããå¿ççå®å
šæ§ãé«ãããŒã ã¯ããã©ãŒãã³ã¹ãé«ãããšããç ç©¶çµæãçºè¡šãããšãå¿ççå®å
šæ§ã®ç¥ååºŠã¯æ Œæ®µã«åäžããŸããã çŸåšã§ã¯ãçµç¹ã«ãã£ãšãå¿
èŠãªèŠçŽ ã§ãããšåºãèªç¥ãããŠãããšæããŸãã å¿ççå®å
šæ§ãäœãçµç¹ã«ååšãã4ã€ã®ãªã¹ã¯ å¿ççå®å
šæ§ã«ã€ããŠãããå°ãè§£å床ãäžããŠè§£èª¬ããŠã¿ãŸãã ãšãã¢ã³ããœã³å士ã¯ã å¿ççå®å
šæ§ãäœãçµç¹ã«ã¯å¯Ÿäººé¢ä¿ã«ããã4ã€ã®ãªã¹ã¯ãååšãã ãšããŠããŸãã â¯â¯ã ãšæãããããªã ãªã®ã§âŠ ç¡ç¥ å¿
èŠãªããšã§ã質åã»çžè«ãã§ããªã ç¡èœ èªåã®èããèšããªãããã¹ãé ã éªé å¿
èŠã§ãå©ããæ±ãããäžååãªä»äºã§åŠ¥åãã åŠå®ç çŽ çŽã«æèŠãèšãããè°è«ãã§ããªã å¿ççå®å
šæ§ãäœãçµç¹ã§ã¯ãããã4ã€ã®ãªã¹ã¯ã®ååšã«ãããã¡ã³ããŒãææãæ±ããŠããŸã衚ã®å³åŽã®è¡åã«ã€ãªãããŸãã ãã®çµæã çµç¹å
ã®ã³ãã¥ãã±ãŒã·ã§ã³ãäžè¶³ããããã¢ã€ãã¢ãåºãªãã£ãããšãçµç¹ã®çç£æ§ãäžãã£ãŠããŸã ãšèããããŸãã å¿ççå®å
šæ§ãé«ããã¡ãªãã æ¬¡ã«ãå¿ççå®å
šæ§ãé«ãããšã©ããªå¹æãããã®ãããšãã¢ã³ããœã³å士ã®èæžã§ç޹ä»ãããŠããç ç©¶ãããšã«èŠãŠãããŸã [ 1 ]ã çµç¹åŠç¿ãä¿ããã ã¡ãªããã®äžã€ã«ãçµç¹åŠç¿ãä¿é²ãããç¹ãæããããŸãã ç
é¢ã®éäžæ²»ç宀ã察象ã«è¡ãããç ç©¶ã§ã¯ãå¿ççå®å
šæ§ãé«ãããŒã ã§ã¯ãç¥èã®å
±æããªã©ã®ããŒã ããŒã¹ã®åŠç¿ã掻çºã«è¡ãããŠããŸããããããŠãããŒã ããŒã¹ã®åŠç¿ã¯æè¡ã®æåçãšé¢é£ãããããšã瀺ãããŠããŸã [ 2 ]ã Googleã®ç ç©¶ããŒã ãè¡ã£ãç ç©¶ã§ã¯ãGoogle瀟å
ã«ãããŠããŒã ã®å¹ææ§ã«ãã£ãšã圱é¿ãäžããå åã¯å¿ççå®å
šæ§ã ãšçµè«ã¥ããããŠããŸã [ 3 ]ã ãããŠãå¿ççå®å
šæ§ã®é«ãããŒã ã®ã¡ã³ããŒã«ã¯ä»¥äžã®ãããªç¹åŸŽãããããšãå ±åããŠããŸãã é¢è·çãäœã ãããŒãžã£ãŒããè©äŸ¡ãããæ©äŒã2åå€ã ä»ã®ã¡ã³ããŒãçºæ¡ããã¢ã€ãã¢ãããŸã掻çšã§ãã å¿ççå®å
šæ§ãé«ãçµç¹ã§ã¯çµç¹åŠç¿ãä¿é²ãããçµç¹ãšå人ãé«ãããã©ãŒãã³ã¹ãçºæ®ããããšãã§ããå¯èœæ§ããããŸãã 倿§ãªã¡ã³ããŒã®ããã³ã·ã£ã«ãçºæ®ããã å¥ã®ã¡ãªãããšããŠã倿§ãªã¡ã³ããŒã®ããã³ã·ã£ã«ãåŒãåºãããšãã§ããç¹ãæããããŸãã 倿§æ§ãå°éããããã€å¿ççå®å
šæ§ãé«ãçµç¹ã§ã¯ãã¡ã³ããŒã®ããã©ãŒãã³ã¹ãé«ããªãåŸåãããããšãç ç©¶ã§æããã«ãããŠããŸã [ 4 ]ã ãã®åŸåã¯ãçµç¹å
ã®ããžã§ãªãã£ã«å±ããã¡ã³ããŒããããã€ããªãã£ã«å±ããã¡ã³ããŒã«ãã匷ãã¿ãããŸããã ããã¯ãå¿ççå®å
šæ§ã¯ãã€ããªãã£ã«å±ããã¡ã³ããŒã«ãšã£ãŠç¹ã«éèŠãªãã®ã§ããããšã瀺åããŠããŸãã å¥ã®ç ç©¶ã§ã¯ãã¡ã³ããŒãæã€å°éç¥èã®å€æ§æ§ãé«ãããŒã ãšãç»äžçãªã¡ã³ããŒãéããããŒã ã®æ¯èŒãè¡ãªã£ãŠããŸã [ 5 ]ã ç ç©¶ã®çµæãå°éç¥èã®å€æ§æ§ãé«ãããŒã ã¯ãå¿ççå®å
šæ§ãé«ãå Žåã¯åæ¡ä»¶ã®ç»äžçãªããŒã ããããã©ãŒãã³ã¹ãé«ããªãåŸåããããéã«å¿ççå®å
šæ§ãäœããšç»äžçãªããŒã ããããã©ãŒãã³ã¹ãäœããªãåŸåãããããšãããããŸããã 倿§æ§ãå°éããçµç¹ã«ãããŠã¯ãå¿ççå®å
šæ§ã䜵ããŠé«ããŠããããšã§ãåã¡ã³ããŒãé«ãããã©ãŒãã³ã¹ãçºæ®ããåå£ãã€ããããšãã§ãããã§ãã å¿ççå®å
šæ§ã®èœãšã穎 äžæ¹ã§ãå¿ççå®å
šæ§ããã é«ããã°ãããšããããã§ã¯ãªãããã§ãã ããããèœãšã穎ã¯ãå¿ççå®å
šæ§ãé«ããåªåãããçµæããããããã¬ããè·å Žãã«ãªã£ãŠããŸãããšã ãšæããŸãã ãšãã¢ã³ããœã³å士㯠ãå¿ççå®å
šæ§ã¯ããã 芪åã«ããããšã§ããããã©ãŒãã³ã¹ç®æšãäžããããšã§ããªãããã®éã§ããã ãšè¿°ã¹ãŠããŸã [ 6 ]ã ãããŠã ãå¿ççå®å
šæ§ããšãç®æšéæã«å¯Ÿãã責任æãã©ã¡ããé«ãç¶æ
ã§ããâLearning zoneâãç®æãã¹ã ãšããŠããŸãã å¿ççå®å
šæ§ãé«ããã ãã«æ³šåããã®ã§ã¯ãªããä»ã®èŠçŽ ã«ãçç®ããŠçµç¹ã®çç£æ§ãé«ããŠããããšãéèŠããã§ãã åŒçšïŒ Amy C. Edmondson, âThe Competitive Imperative of Learningâ, Harvard Business Review å¿ççå®å
šæ§ãé«ããæ¹æ³ æ¬¡ã«ãå¿ççå®å
šæ§ãé«ããæ¹æ³ã«ã€ããŠèããŠã¿ãŸãã å¿ççå®å
šæ§ãé«ãã4ã€ã®å å æ¥æ¬åœå
ã§å¿ççå®å
šæ§ãåºããæŽ»åããããŠããç³äºéŒä»ããã¯ã å¿ççå®å
šæ§ã®é«ãããŒã ãã€ããããã«ã¯ãã話ããããããå©ãåãããææŠããæ°å¥æè¿ããšãã4ã€ã®å åãéèŠ ã ãšããŠããŸã [ 7 ]ã ãããŠãããããã®å åãæºããããã«å¿
èŠãªã¢ã¯ã·ã§ã³ãæå±ããŠããŸãã å¿ççå®å
šæ§ãé«ããå å å åãæºããã¢ã¯ã·ã§ã³äŸ 話ãããã æèŠãããã£ããçã£å
ã«ãããããšãããšäŒãã å©ãåã ç©æ¥µçã«çžè«ãããçžè«ã«ä¹ã ææŠ ééãããšã¯æªããªããããããåŠã¶ããšãéèŠã ãšäŒãã æ°å¥æè¿ éããè¯ãæªãã§ã¯ãªãããã éããšããŠèªãã äžã®è¡šã§ã¯ããããã®å åãšã¢ã¯ã·ã§ã³äŸããŸãšããŠããŸãããå匷äŒã§ã¯ããå°ãå€ãã®ã¢ã¯ã·ã§ã³ã玹ä»ããŸããã æ°ã«ãªãæ¹ã¯ã ç³äºããã®èæž ãèªãã§ã¿ãŠãã ããã ã¿ã€ããŒã®ããŒã¿çµ±æ¬éšã§å®éã«åãçµãã ããš ã¿ã€ããŒã®ããŒã¿çµ±æ¬éšã§ã¯ãå¿ççå®å
šæ§ãé«ããç¬¬äžæ©ãšããŠä»åã®å匷äŒãéå¬ããŸããã ïŒãšã¯èšã£ãŠããå¿ççå®å
šæ§ã«ã€ããŠçè§£ãæ·±ãã¡ã³ããŒãã»ãšãã©ãªã®ã§ããç¥èã®å確èªããšãã£ãæãã§ãããâŠç¬ïŒ å匷äŒã®åŸåã§ã¯ãå¿ççå®å
šæ§ãããŒããšããã°ã«ãŒãã¯ãŒã¯ã«åãçµã¿ãŸããã ã°ã«ãŒãã¯ãŒã¯ã§ã¯ãå¿ççå®å
šæ§ãäžãã察å¿ãããŠããŸããã¡ãªç¶æ³ã«ãããŠãå¿ççå®å
šæ§ãé«ãã€ã€å¹æçã«åé¡è§£æ±ºã«è¿ã¥ãã«ã¯ã©ããã£ãè¡åãããã°ãããããšããããŒãã§è°è«ãè¡ããŸããã äŸãã°ã以äžã®ãããªç¶æ³ã«ããã察å¿ãåå è
ã§è°è«ããããšãã£ããã®ã§ãã ãšããåé¡ã«å¯Ÿãã解決çã«ã€ããŠããŒã ã§è°è«ããŠãããšããã¡ã³ããŒã®äžäººããã解決çãææ¡ããŸããã ããããããªãã®ãããŸã§ã®çµéšãèŠç¹ããèãããšããã®è§£æ±ºçã¯çãæªãããã«æããŸãã ãããªãšããã©ã察å¿ããã®ãè¯ãã§ããããïŒ åå è
ããã¯ã以äžã®ãããªæèŠãæãããŸããã çãæªãã£ããšããŠãããæèŠããŠãããããšãã«å¯ŸããŠæè¬ãäŒãã ã¡ã³ããŒãææ¡ãã解決çã®è»éä¿®æ£ãäžç·ã«ãã çãæªããšã¯ããããæãããã¡ã³ããŒããã®è§£æ±ºçã«è³ã£ãæèããã»ã¹ãæãäžããŠãèªèãæèã®éããçè§£ãã å¯äžçµ¶å¯Ÿã®æ£è§£ããªãåé¡ãããŒãã«è°è«ããããšã§ãèªåäžäººã§ã¯æãã€ããªã察å¿ãççŒç¹ãªã©ãå
·äœåãããææçŸ©ãªæéã«ãªã£ããšæããŠããŸãã å匷äŒãã°ã«ãŒãã¯ãŒã¯ã¯å°éã§ã¯ãããŸããã倧ããªæéãããããªãã®ã§åãçµã¿ãããã§ãããå¿ççå®å
šæ§ã«ã€ããŠèããããã«ã±ã«ãªããŸãã çµç¹ã®å¿ççå®å
šæ§ãé«ããææ®µã®ã²ãšã€ãšããŠããããã§ãã ãããã« è¿å¹Žãå¿ççå®å
šæ§ã¯çµç¹ã«ãšã£ãŠéèŠã ãšåºãèªããããããã«ãªããŸããã ããããå¿ççå®å
šæ§ã®æ
ä¿ãããçµç¹ãã€ããããšã¯å®éã«ã¯æ³å以äžã«å€§å€ã§ãã ã¿ã€ããŒã®ããŒã¿çµ±æ¬éšã¯å¿ççå®å
šæ§ãé«ãç°å¢ã ãšç§ã¯æããŠããŸãããã¡ã³ããŒãã©ãã©ãå¢ããŠãããã§ãŒãºãè¿ããŠããããšããããå¿ççå®å
šæ§ãããäžå±€æèããé«ãã¬ãã«ã§æ
ä¿ã§ããããåªåããããšèããŠããŸãã Weâre Hiring! ã¿ã€ããŒã®ããŒã¿çµ±æ¬éšã§ã¯ããšãã«åãã¡ã³ããŒãåéããŠããŸãïŒ product-recruit.timee.co.jp
ããã«ã¡ã¯ãã¿ã€ããŒéçºãã©ãããã©ãŒã ããŒã ã§æ¥åå§èšãšããŠåããŠãã å®®å ã§ãã ã¿ã€ããŒã¯ãªãªãŒã¹ãã4幎ãçµéãããããã¯ãã§ã2022幎ã®ååããäžéšé åã§GraphQLãå©çšãå§ãçŸåšå°å
¥ãé²ããŠããŸãã æ¬èšäºã§ã¯ãGraphQLããããã¯ãã«å°å
¥ããäžã§å€æã«è¿·ã£ãç®æã課é¡ã«å¯ŸããŠãã¿ã€ããŒã§ã®æææ±ºå®ãšãã®çç±ã玹ä»ããŸããåèã«ããŠããã ããã°å¹žãã§ãã GraphQLã®éžå®çç±ã«ã€ããŠã¯ãã®èšäºã§ã¯è§ŠããŸããããCTOã® @kameike ã以äžã®ã€ãã³ãã§è©³ãã玹ä»ããäºå®ã§ãããŸã åå ç³ã蟌ã¿ã¯å¯èœã§ãã®ã§ãèå³ãããæ¹ã¯ãã²åãããŠã芧ãã ããã timeedev.connpass.com ãªããæ¬èšäºã®ã¿ã€ãã«ã¯ãœãŠãŸãŠããã®ä»¥äžã®èšäºã«ã€ã³ã¹ãã€ã¢ãããŠããŸãã engineering.mercari.com GraphQLã®ãGetting Startedã®æ¬¡ã«ã¶ã€ããå£ãã«ã€ããŠå€ãèšåããŠããããããã¯ãã«å°å
¥ããäžã§éåžžã«æçšãªèšäºã§ãããåãããŠäžèªããããšããªã¹ã¹ã¡ããŸãã åæãšãªãæè¡ã¹ã¿ã㯠æè¡éžå®ã«ãããŠæ¡çšããã©ã€ãã©ãª graphql-ruby Apollo Client @graphql-codegen/cli graphql-batch rubocop-graphql, graphql-eslint ããã¯ãšã³ãã§èããããš graphql-rubyã®ããã©ã«ãã®ãã£ã¬ã¯ããªæ§é ãå€æŽ ããã¯ãšã³ãã®ãã¹ãæ¹é Application-level Interface-level Transport-level nullability ããŒãžããŒã·ã§ã³ query/mutationã«ãã£ãŠæ¥ç¶ããDBã®reader/writerã€ã³ã¹ã¿ã³ã¹ãåãæ¿ãã Datadogã«ãããªã¯ãšã¹ãã®ç£èŠ ããã³ããšã³ãã§èããããš GraphiQL Fragment Colocation Testing, Storybook ãªã³ããŒãã£ã³ã° çµããã« åæãšãªãæè¡ã¹ã¿ã㯠ãã¿ã€ããŒãã®æè¡ã¹ã¿ãã¯ã玹ä»ããŸããããã¯ãšã³ãã¯ã¢ããªã·ãã¯ãªRuby on Railsã§æ§ç¯ãããŠãããåãæãšãªãã¯ãŒã«ãŒåãã¢ãã€ã«ã¢ããªïŒSwift/Kotlin)ã»éçšäž»ãšãªãäŒæ¥åãWebã¢ããªã±ãŒã·ã§ã³ïŒRails SSR/Next.js)ã»ç€Ÿå
ã¡ã³ããŒåãWebã¢ããªã±ãŒã·ã§ã³ïŒActive Admin/Next.js)ã®3ã€ã®ã¢ããªã±ãŒã·ã§ã³ãæäŸããŠããŸãã ãã®ãã¡Webã¢ããªã±ãŒã·ã§ã³ã¯ããããNext.jsãšRails APIãå©çšããæ§æãžã®ç§»è¡ãé²ããŠããããã®é åã§å©çšããæè¡ãšããŠGraphQLãå°å
¥ããããšã«ããŸããã æè¡éžå®ã«ãããŠæ¡çšããã©ã€ãã©ãª GraphQLãå°å
¥ããäžã§ãæçµçã«æ¡çšããã©ã€ãã©ãªã¯ä»¥äžã§ãã ããã¯ãšã³ãïŒ graphql-ruby ã¯ã©ã€ã¢ã³ãïŒ Apollo Client ã¯ã©ã€ã¢ã³ãã³ãŒãçæïŒ @graphql-codegen/cli dataloader: graphql-batch linter: rubocop-graphql, graphql-eslint äžã€ã²ãšã€éžå®çç±ã玹ä»ããŠãããŸãã graphql-ruby github.com Rubyã§GraphQLãµãŒããŒãæ§ç¯ããäžã§ããã¡ã¯ãã¹ã¿ã³ããŒããšãªã£ãŠããã©ã€ãã©ãªã§ããShopifyãGitHubã§é·æçã«å©çšãããŠããã¡ã³ããã³ã¹ã®ç¶ç¶å¯èœæ§ã¯é«ããšå€æããŠããŸããã¿ã€ããŒã§ã¯ã¡ã³ããã§ããRobert Mosolgoãã *1 ã®ã¹ãã³ãµãŒãããŠããŸãã GraphQLã®ä»æ§ããã¹ããã©ã¯ãã£ã¹ã«åŸã£ãå®è£
ãããããããšãç¹åŸŽçã§ãäŸãã°ããŒãžããŒã·ã§ã³ã®ãã¹ããã©ã¯ãã£ã¹ã§ããCursor Connections *2 ã远å å®è£
ãªãã§å©çšå¯èœã§ãããã®ä»ã«ããããã¥ã¡ã³ãã®æåãããã¹ãã®æžãããããªã©ããéåžžã«äœ¿ããããã©ã€ãã©ãªã ãšæããŸãã Apollo Client github.com ããã³ããšã³ãã®GraphQLã¯ã©ã€ã¢ã³ãã«ã¯Apollo Clientãéžå®ããŸãããReactã«ãããGraphQLã¯ã©ã€ã¢ã³ãã®ä»ã®éžæè¢ã¯Relay *3 , urql *4 , graphql-request *5 ãªã©ããããŸããã以äžã®èгç¹ããApolloãéžæããŸããã ã³ãã¥ããã£ã掻çºã§ãããå©çšè
ã»ã€ã³ã¿ãŒãããã®æ
å ±ã»é¢é£ã©ã€ãã©ãªã®çš®é¡çãããã倧ãããããããããæ°å¹Žã¯å©çšãå¯èœãšæ³å®ã§ãã graphql-rubyã§ãã«ãµããŒããããŠããããApollo/graphql-rubyããããã§ç¹ã«èšå®ãªãã«å©çšå¯èœã§ãããçµ±åæã«è©°ãŸããã€ã³ããå°ãªãã ãšã¯ãããApolloãéžæããäžã§æ°ã«ãªããã€ã³ãã¯ããã€ããããŸãã æ£èŠåããããã£ãã·ã¥ããããã¯ãã®ãŠãŒã¹ã±ãŒã¹ã«å³ããŠããã®ã React Suspenseã«å¯Ÿå¿ããŠããªã *6 代æ¿ãšããŠæ¯èŒããã®ãurqlã§ãSuspenseã䜿ããã»ã·ã³ãã«ãªããã¥ã¡ã³ããã£ãã·ã¥ã»è»œéãªãã³ãã«ãµã€ãºãªã©å©ç¹ã¯ããªãå€ããã®ã®ã以äžã®çç±ããéžæããã«ããŸãã ã³ãã¥ããã£ã®å°ãããšå©çšè
ã®å°ãªãã®ç¹ã§Apolloã«å£ããæ°ããGraphQLã®ãã£ããã¢ãããå§ããã¿ã€ããŒã«ãããŠã¯ãããããªããšèãããéå¶æ¯äœãå°ããã®ãæ°ã«ãªãã Apollo, Relayã¯ææ³ãéãããããããæ®ãç¶ããã ããããurqlãæ®ãç¶ãããã©ããã«ã€ããŠã¯äžç¢ºå®æ§ããŸã é«ããšå€æãã ããªãã®ãããã¯ãã«Apollo Clientã¯å¿
èŠãªããããããªã *7 ãšããäžäŒããã®èšäºã§Apolloã®åãäžåãã«é¢ããèšåããããã(Suspense以å€ã§ïŒurqlã§å®çŸå¯èœã§Apolloã§å®çŸäžå¯èœãªããšã¯ãªããããåé¡ãåºãŠããŠããä¹ãæãã圢ã§åé¡ãªããšèãã åŸè¿°ããgraphql-codegenã¯Apolloãšurqlã®äž¡æ¹ã«å¯Ÿå¿ããŠãããããApollo Link *8 ããã£ãã·ã¥ã¹ãã©ããžãŒã®è€éãªã«ã¹ã¿ãã€ãºãªã©ã®ãããªApolloç¹æã®æ©èœãå€çšããªããã°ä¹ãæãã¯é£ãããªã ãããGraphQLã«ç²Ÿéããã¡ã³ããŒãå€ããã°ããããurqlãéžæããŠããããªãšãæããŸããã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªã«ã€ããŠã¯éçšãç¶ããªããæ€èšããããšèããŠããŸãã @graphql-codegen/cli www.the-guild.dev GraphQLãµãŒããŒããæäŸãããã¹ããŒããåºã«Reactã®ã«ã¹ã¿ã ããã¯ãTypeScriptã®åãçæããŠãããã©ã€ãã©ãªã§ããå人çã«GraphQLãå©çšãã倧ããªçç±ã®1ã€ã§ãããããã®ãããªãã§éçºäœéšã倧ããå€ããã»ã©ã ãšæã£ãŠããŸãã åçš®èšå®ãªã©ã¯åŸè¿°ã®ããã³ããšã³ãåšãã®å®è£
æ¹éã®é
ã§è©³ããè¿°ã¹ãŸãã graphql-batch github.com DataLoaderãRubyã§å®è£
ããããã®ã©ã€ãã©ãªãšããŠgraphql-batchãéžæããŸããã GraphQLã®ã¯ãšãªã§ã¯ååŸãããããŒã¿ã®ããŒãã蟿ã£ãŠå¿
èŠãªããŒã¿ãäžåºŠã«ååŸã§ããããããã°ãã°N+1ãèµ·ããŠããŸããŸãããããã©ã®ãã£ãŒã«ãã®çµã¿åãããèŠæ±ããããã¯ã¯ãšãªã«ãã£ãŠç°ãªããããActiveRecordã¢ãã«ã®associationsã®ååŸã«å¯ŸããŠåçŽã«preloadãeager_loadãè¡ãã®ã¯ç¡é§ãªèªã¿èŸŒã¿ãå¢ããŠããŸãè¯ã解決çãšã¯èšããŸããã ãã®ããã®è§£æ±ºçãšããŠDataLoaderãå©çšããé
å»¶èªã¿èŸŒã¿ãå®è£
ããŸããRubyã§ã®å®è£
æ¹æ³ãšããŠã¯ãä»åéžæããgraphql-batchãgraphql-ruby忢±ã®dataloaderã®2ã€ãéžæè¢ãšããŠäžããããã§ãã ã©ã¡ããåãããŠã¿ãäžã§ãä»åã¯graphql-batchãéžæããããšã«ããŸããã graphql-batch Shopifyãã¡ã³ããã³ã¹ããŠãããããçšåºŠæ¯ããŠãããšããããShopifyãGraphQLãå©çšãç¶ããéãã¯ã¡ã³ããã³ã¹ãç¶ããšæ³å®ã§ãã 倧å
ã®nodeå®è£
ã®dataloaderã®APIã«è¿ããä»èšèªã§ã®å®è£
çµéšããã人ã¯çè§£ãããã ãšã¯ããgraphql-rubyã®field extensionãªã©ã®è€éãªããšãããããšããå ŽåãPromise.rbã®ãã£ããã¢ãããå¿
èŠãªã®ã¯ãã¡ãªããã graphql-ruby忢±ã®dataloader åŸçºã®ããAPIãçŽæçã§äœ¿ããããå°è±¡ graphql-batchã§ã¯Promiseãªããžã§ã¯ããresolveããªããã°ãªããžã§ã¯ããæã«å
¥ããªãå Žé¢ããã£ãããçŽæ¥ActiveRecordãªããžã§ã¯ããè¿ã£ãŠããããçè§£ãããã 2021幎ãªãªãŒã¹ã§æ¯èŒçæ°ãããå
éšçã«ã¯Rubyã®Fiberãå©çšããŠããããFiberã¯ãããã°ãé£ããåé¡ãåºãŠããéã®è§£æ±ºã¯é£ããå¯èœæ§ãé«ã ä»åã¯å®å
šãåã£ãŠgraphql-batchãéžæããŸããããäœããã£ãéã®graphql-ruby忢±ã®dataloaderãžã®ç§»è¡ïŒãŸãã¯ãã®éïŒã¯é£ãããªããšããã®ãããæ«å®ã§æææ±ºå®ããŠããŸããéçšããªãã倿ãããäºå®ã§ãã rubocop-graphql, graphql-eslint github.com github.com æ°ããGraphQLãåŠã¶ã¡ã³ããŒãå€ãç°å¢ã®ãããGraphQLã®ææ³ããã¹ããã©ã¯ãã£ã¹ãåŠã¶ããã«ãåææ®µéã§LinterãçšæããŠããã®ã¯è¯ããšå€æããäžèš2ã€ãå°å
¥ããŸããã graphql-eslintã«ã€ããŠã¯parserãšããŠã®åœ¹å²ãæ
ããVSCodeäžã§graphqlãã¡ã€ã«ãæžãéã®è£å®ãæå¹ã«ãªãã®ã䟿å©ã§ãã ããã¯ãšã³ãã§èããããš ããããã¯å®è£
ãé²ããäžã§ã¶ã€ãã£ã課é¡ã«ã€ããŠããããè¿°ã¹ãŠãããŸãããŸãã¯ããã¯ãšã³ãããã graphql-rubyã®ããã©ã«ãã®ãã£ã¬ã¯ããªæ§é ãå€æŽ graphql-rubyã§ã¯generatorãä»å±ããŠããã rails generate graphql:install ã§å¿
èŠãªãã¡ã€ã«çŸ€ãçæãã以äžã®ãããªãã£ã¬ã¯ããªæ§æã«ãªããŸãã ⯠tree app/graphql app/graphql âââ mutations â  âââ base_mutation.rb âââ timee_schema.rb # Railsã¢ããªã±ãŒã·ã§ã³åããèªåã§åœåããã âââ types âââ base_argument.rb âââ base_connection.rb âââ base_edge.rb âââ base_enum.rb âââ base_field.rb âââ base_input_object.rb âââ base_interface.rb âââ base_object.rb âââ base_scalar.rb âââ base_union.rb âââ mutation_type.rb âââ node_type.rb âââ query_type.rb ãã®ã³ãŒã矀ã®ãã¡æ°ã«ãªãç¹ãããã€ããããŸããã TimeeSchemaã远å ãããå
šãŠã®ã¯ã©ã¹ã«ãããŠãåå空éãã°ããŒãã«ã«èšå®ãããŠãã typesãã£ã¬ã¯ããªã®ã¯ã©ã¹ã¯ Types::BaseArgument ãšãªããTypesã¢ãžã¥ãŒã«ã¯GraphQL以å€ã§ããã䜿ãããã¯ãã§åå空éã®ç¯å²ãåºããã ããããã®baseã¯ã©ã¹ãtypesãã£ã¬ã¯ããªã«ãã©åºãã«ãªã£ãŠãããããããã®baseã¯ã©ã¹ãç¶æ¿ããå
·è±¡ã¯ã©ã¹ããã®ãã£ã¬ã¯ããªã«è¿œå ããŠããå ŽåããèŠéããæªããªãããšãèŠèŸŒãŸãã ãã®ãã以äžã®ããã«ãã£ã¬ã¯ããªæ§æã倿ŽããŸããã ⯠tree app/graphql app/graphql âââ graphql_schema âââ arguments â  âââ base.rb âââ connections â  âââ base.rb âââ edges â  âââ base.rb âââ enums â  âââ base.rb âââ fields â  âââ base.rb âââ input_objects â  âââ base.rb âââ interfaces â  âââ base.rb âââ mutations â  âââ base.rb âââ objects â  âââ user_type.rb ... å
·è±¡ã¯ã©ã¹ã®äŸ â  âââ base.rb â  âââ mutation_type.rb â  âââ query_type.rb âââ scalars â  âââ base.rb âââ timee_schema.rb âââ unions âââ base.rb graphql_schemaãã£ã¬ã¯ããªã«ã©ããããããããã®typeããšã«ãã£ã¬ã¯ããªãçšæããŠããŸãã GraphqlSchema::TimeeSchema ãªã©ã®ã¯ã©ã¹åã«ãªããGraphQLé¢é£ã®ã¯ã©ã¹ã¯å
šãŠGraphqlSchemaããŒã ã¹ããŒã¹äžã«å«ãŸããããšã«ãªããŸãã ããã«ããå€ãããããã®ã¯ã©ã¹ãåç
§ããããšããããã£ããšãããäœããããããšæ°ã¥ããã¯ãã§ãã private_constant ãå©çšããŠæ©æ¢°çã«å¯èŠæ§ã®å¶éãã§ããŸãã ãã®ãã£ã¬ã¯ããªæ§æã§å°ã£ãããšã¯ã»ãŒãªãã£ãã®ã§ããã rails generate graphql:object ãªã©ã®graphql-rubyãæäŸããScaffoldãžã§ãã¬ãŒã¿ãŒããã®ãŸãŸå©çšã§ããªãåé¡ããããŸãããActiveRecordã¢ãã«ã«å¯Ÿå¿ãããªããžã§ã¯ãåã¯ã©ã¹ãäœãå Žåãã¢ãã«ã®attributesãããã£ãŒã«ãã®åã顿šãã³ãŒãçæããŠãããããéåžžã«äŸ¿å©ã§ãã©ãã«ã掻çšãããã§ãã ãžã§ãã¬ãŒã¿ãŒã®ãã³ãã¬ãŒãã§ Types ã¢ãžã¥ãŒã«äžã«ã¯ã©ã¹ãããæ³å®ãªã®ãåå ã§ *9 ããžã§ãã¬ãŒã¿ãŒã¯ã©ã¹ãç¶æ¿ããã«ã¹ã¿ã ãžã§ãã¬ãŒã¿ãŒãäœãããšã§è§£æ±ºã§ããŸããã # lib/generators/timee/graphql/object/object_generator.rb require ' generators/graphql/object_generator ' module Timee module Graphql class ObjectGenerator < :: Graphql :: Generators :: ObjectGenerator source_root File .expand_path( ' templates ' , __dir__ ) def create_type_file template ' object.erb ' , "#{ options[ :directory ] } /graphql_schema/objects/ #{ subdirectory } / #{ type_file_name } .rb " end # idãã£ãŒã«ãã¯GraphQL::Types::Relay::Nodeã§å®è£
ããããé€å€ãã def normalized_fields super @normalized_fields .reject! { _1.instance_variable_get( :@name ) == ' id ' } end end end end # lib/generators/timee/graphql/object/templates/object.erb <% module_namespacing_when_supported do -%> module GraphqlSchema module Objects class < %= ruby_class_name %> < Base implements GraphQL::Types::Relay::Node <% normalized_fields.each do |f| %> <% = f.to_object_field %> <% end %> end end end <% end -%> ããã«ãã rails generate timee:graphql:object MyNamespace::ModelName ã§ãªããžã§ã¯ãåã¯ã©ã¹ãScaffoldingã§ããŸãã ããã¯ãšã³ãã®ãã¹ãæ¹é ããŒã éçºã§ã¢ãŒããã¯ãã£ãå®å
šã«ã¹ã±ãŒã«ãããããã«ã¯ãå®çŸ©ããã¬ã€ã€ãŒã«å¯Ÿå¿ãããã¹ãæ¹éãçšæããŠããããšã¯éçºã¡ã³ããŒéã§ã®èªèãæããããã«æçšãšèããŠããŸããgraphql-rubyã®ããã¥ã¡ã³ãã«ã¯ä»¥äžã®3ã€ã®ã¬ã€ã€ãŒãšãã¹ãæ¹éã玹ä»ãããŠãã *10 ããããåºã«ã¿ã€ããŒã§ã®ãã¹ãæ¹éãå®ããŸããã Application-level èªå¯ãããžãã¹ããžãã¯ã®ã¬ã€ã€ãŒã§ãã ActiveRecordã¢ãã«ãPOROãªã©ã®GraphQLãšã¯å¥ã®ã¬ã€ã€ãŒãªã©ã«ããžãã¯ãæžããåäœãã¹ããæžãã®ãè¯ãã§ãããã Interface-level GraphQLã®åquery/mutationã®ã¬ã€ã€ãŒã§ãã åquery/mutationåäœã§æåŸ
ãããã£ãŒã«ããè¿ãããæ€èšŒãããã¹ããæžãã®ãè¯ãã§ãããã以äžã¯graphql-rubyã®ããã¥ã¡ã³ãã«èšèŒãããŠããåèäŸã§ãã it " loads posts by ID " do query_string = <<- GRAPHQL query($id: ID!){ node(id: $id) { ... on Post { title id isDraft comments(first: 5) { nodes { body } } } } } GRAPHQL post = create( :post_with_comments , title : " My Cool Thoughts " ) post_id = MySchema .id_from_object(post, Types :: Post , {}) result = MySchema .execute(query_string, variables : { id : post_id }) post_result = result[ " data " ][ " node " ] # Make sure the query worked assert_equal post_id, post_result[ " id " ] assert_equal " My Cool Thoughts " , post_result[ " title " ] end MySchema.execute ã«å¯ŸããŠã¯ãšãªæååãvariablesãæž¡ããæåŸ
ããã¬ã¹ãã³ã¹ãè¿ããã©ãããæ€èšŒããŠããŸãã APIå®è£
æã«ã¯åºæ¬çã«ãã®ãã¹ããæžãããšãå€ããªãã¯ãã§ãã Transport-level GraphQLãµãŒããŒã¯HTTP(Railsã®routing)ã§æäŸããŠããŸãã çé確èªã®ããã«1ä»¶ã ãrequest specãçšæããŸãããåå¥ã®query/mutationã«ã€ããŠãã¹ãããå¿
èŠã¯ãããŸããã nullability graphql-rubyã§çæããschema.graphqlãèŠããšãconnection_typeã®nodesãã£ãŒã«ããªã©ã»ãšãã©ã®ãã£ãŒã«ããnullableã§å®çŸ©ãããŠããããšã«æ°ã¥ããŸããèªèº«ã§ãã£ãŒã«ããå®çŸ©ããå Žåãããã©ã«ãã§ã¯nullableã§ãããnon-nullã«ããããã°æç€ºçã« null: false ãä»äžããå¿
èŠããããŸãã ãã®ä»æ§ãç¥ã£ãæããªãnullableãªã®ãïŒãšéåæããããŸãããnullableã§ã¯ããã³ããšã³ãã®å€ãã®ç®æã§ååšãã§ãã¯ãããªããã°ãªããªããªããç¡é§ã«ã³ãŒããè€éã«ããŠããŸããŸãã GraphQLå
¬åŒããã¥ã¡ã³ãã®ãã¹ããã©ã¯ãã£ã¹ *11 ã«ãããšãããŒã¿ããŒã¹ããã®ä»ã®ãµãŒãã¹ã«æ¯ãããããããã¯ãŒã¯ãµãŒãã¹ã§ã¯ãããŸããããªãããšã床ã
ããããã ããšè¿°ã¹ãããŠããŸãããŸãWhen To Use GraphQL Non-Null Fields *12 ãšããããã°èšäºã§ã¯ãGraphQLã¯ããŒãžã§ã³ã¬ã¹APIã®ææ³ãæã¡ãå€ãã®ããŒã ãäžã€ã®APIã«äŸåããããç Žå£ç倿Žãé£ãããªãããããã¹ããŒãã®é²åãå°é£ã«ãããããšè¿°ã¹ãããŠããŸãã ããŒã ã§ã®è°è«ã®äžãããããèæ¯ãèžãŸãã€ã€ãREST APIã§ã®ãªãœãŒã¹èšèšãšåæ§ã§ãçç±ããªãéãnon-nullã®ãã£ãŒã«ããšãããæ¹éã§é²ããããšã«ããŸãããçç±ã¯ä»¥äžã§ãã non-nullã®ãã£ãŒã«ãã«å¯ŸããŠDBããè¿åŽãããããŒã¿ãnullã§ãã£ãå Žåãgraphql-rubyããã®ã¯ãšãªèªäœããšã©ãŒãšããŠãã³ããªã³ã°ãã¬ã¹ãã³ã¹ãçµã¿ç«ãŠãŠãããããš ãããããã®ãããªç¶æ
ã¯ããžãã¹ããžãã¯ã®èŠæ±ãæºãããŠããªãããšãå€ãã¯ãã§ãnullableã«ããŠããŸãããšã§åé¡ã«æ°ã¥ããªãç¶æ³ãé²ããã äžè¬çã«non-nullããnullableã«å€æŽããæ¹ãç°¡åã§ããããã®éã¯å°é£ã䌎ããäžå¯èœãªå Žåãå€ã GitHubã®APIã§ã¯ãconnection typeã®ã»ãšãã©ãnon-nullãšãªã£ãŠãã e.g.) https://docs.github.com/en/graphql/reference/objects#organization ãããã¯ãã®ç¹æ§äžãç Žå£ç倿Žã«å¯ŸåŠããããšãé£ããããã§ã¯ãªã GraphQL APIãå€éšã«å
¬éããäºå®ããªããã¹ããŒã¯ãã«ããŒã®èª¿æŽã瀟å
ã§å®çµãã ã¯ã©ã€ã¢ã³ãã¯çŸç¶Webã®ã¿ã®ããããªã³ããã³ããªãªãªãŒã¹ãå¯èœ graphql-rubyã®å Žåãnon-nullã«ãªããã€ã³ããèšå®ãçšæãããŠãããããããå©çšããã°è¯ãã§ãã https://graphql-ruby.org/api-doc/2.0.14/GraphQL/Types/Relay/ConnectionBehaviors/ClassMethods#node_nullable-instance_method ããŒãžããŒã·ã§ã³ graphql-rubyã§ã¯æšæºã®ããŒãžããŒã·ã§ã³ãšã㊠cursor-based pagination ã®ä»çµã¿ãå°å
¥ãããŠããŸãã cursor-based paginationã§ã¯ååŸã®ããŒãžã®ã«ãŒãœã«ã®ã¿æã«å
¥ããããGoogleã®æ€çŽ¢çµæã«ãããã㪠ããŒãžçªå·ãéžæããŠçŽæ¥ããŒãžã«é£ã¶ ããšãã§ããŸããã ã¿ã€ããŒã§GraphQLãå°å
¥ããã®ã¯äž»ã«ç®¡çç»é¢ã§ããã管çç»é¢ã®ãããªãããã¯ãã§ããŒãžçªå·ã«ããæäœãè¡ããªãããšã¯å°ãå Žåãå€ãããããã1ã€ã®ããŒãžã³ã°ã¢ã«ãŽãªãºã ã§ããoffset-based paginantionãèªåã§å®è£
ããŠããŸãã äž»ã«ãããã®èšäºãåèã«ããŠããŸãã Generic page number / per-page pagination with GraphQL-Ruby · GitHub ichikawa-dev.hatenablog.jp query/mutationã«ãã£ãŠæ¥ç¶ããDBã®reader/writerã€ã³ã¹ã¿ã³ã¹ãåãæ¿ãã ã¿ã€ããŒã§ã¯Railsã®ãã«ãDBæ©èœãå©çšããŠãããããGraphQLã§ã掻çšããããã«ãªã¯ãšã¹ãã«å«ãŸããŠããquery/mutationãèå¥ããŠDBã€ã³ã¹ã¿ã³ã¹ãåãæ¿ããä»çµã¿ãgraphql-rubyã®tracerã䜿ã£ãŠå®è£
ããŸããã詳ããã¯ãã¡ãã«èšèŒããŠããŸãã zenn.dev Datadogã«ãããªã¯ãšã¹ãã®ç£èŠ GraphQLã¯åäžã®POSTãšã³ããã€ã³ãã«å
šãŠã®ãªã¯ãšã¹ããéä¿¡ããããããéåžžã®APMãå©çšãããšã³ããã€ã³ãã®ç£èŠã§ã¯é©åãªç£èŠãè¡ããŸããããã®ããgraphql-rubyã§ã¯ããªã¯ãšã¹ãããã¬ãŒã¹ãAPMãšã®çµ±åãè¡ããä»çµã¿ãçšæãããŠããŸããã¿ã€ããŒã§ã¯DataDogãå©çšããŠãããgraphql-rubyãããã©ã«ãã§DataDogãšã®çµ±åãæäŸãããŠããŸããã ããã«ãããGraphQLã®operation nameåäœã§åé¡ãã€ã€ç£èŠã§ããŸãã ããã³ããšã³ãã§èããããš GraphiQL GraphiQLã¯ãGUIã§GraphQLãæäœããããã®çµ±åéçºç°å¢ã§ããã³ãŒãè£å®ã»ã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãã»APIããã¥ã¡ã³ãã®é²èЧãšãå®éã«query/mutationãå®è¡å¯èœã§ãã graphql-rubyã§ã¯ https://github.com/rmosolgo/graphiql-rails ãååã»ããã¢ããæã«è¿œå ãããããããã䜿ãã®ãäžè¬çãããããŸããããgraphiql-railsã䜿ããšãªããšã¿ã€ããŒã®å ŽåAPIãªã¯ãšã¹ããããéã®èªå¯ããã»ã¹ãNext.jsçšã«çšæããŠãããã®ãšã¯å¥ã§çšæããªããã°ãªãããçæ³ãšã¯ãããŸããã§ããã npmã§å
¬éãããŠãã https://www.npmjs.com/package/graphiql ãæäŸããŠããReactã³ã³ããŒãã³ããå©çšã§ããããšã«æ°ã¥ãããã¡ããNext.jsäžã§å©çšããããšã§è§£æ±ºããŸãããã©ããªã¯ãšãªã§ãå®è¡ã§ããèªç±ãã¯å±éºãªãããProductionç°å¢ã§ã¯äœ¿çšã§ããªãããã«ããŠããŸãã Fragment Colocation ä»åã¯ãããžã§ã¯ãéå§æç¹ã§Fragment Colocationã®æ¹éã§é²ããããšã«ããŸãããColocationã¯ãäžç·ã«é
眮ããããšããæå³ãšã®ããšã§ãGraphQLã®Fragmentå®çŸ©ãšã³ã³ããŒãã³ããè¿ãå Žæã«çœ®ããã³ã³ããŒãã³ãã«å¿
èŠãªããŒã¿ã宣èšçã«å®çŸ©ããæ¹éãåã£ãŠããŸãã ããå
·äœçãªæŠå¿µãå®çŸæ¹æ³ã¯ãã®ã¹ã¯ã©ããã§è©³çްã«ãŸãšããããŠããŸãã zenn.dev Relayã§ã¯Fragment Colocationã âmost important principleâ ãšãããŠããŠå³æ Œãªéçšã匷å¶ãããŸãããApolloã§ã¯ãããŸã§å
ãèšèšã«ãªã£ãŠããŸãããå®éã®éçšãšããŠã¯graphql-codegenã®near-operation-file *13 ãã©ã°ã€ã³ãå©çšããããšã§éçšãå¯èœã§ããgraphqlãã¡ã€ã«ã®åéå±€ã«ã³ãŒãã»åãçæãããã¡ã€ã«ãé
眮ããŠãããŸãã以äžãcodegen.ymlã®èšå®äŸã§ãã overwrite : true schema : 'src/apis/graphql/schema.graphql' documents : - "src/**/*.graphql" generates : src/ : preset : near-operation-file presetConfig : extension : .generated.ts baseTypesPath : ~~/apis/graphql/types.generated plugins : - 'typescript-operations' - 'typescript-react-apollo' config : immutableTypes : true nonOptionalTypename : true avoidOptionals : true ~~~ çç¥ ~~~ Fragment Colocationãéçšããããšã§ä»¥äžã®ã¡ãªããããããšå€æããŠããŸãã ã¯ãšãªã®å®è¡ã¯Pageã³ã³ããŒãã³ãã»åã³ã³ããŒãã³ãã§å¿
èŠãªããŒã¿ã¯fragmentãšããŠå®çŸ©ããããã«ã«ãŒã«åãããšãååããŒãžè¡šç€ºã«å¿
èŠãªãããã¯ãŒã¯ãªã¯ãšã¹ãã1åã§çµãããã å¿
èŠãªããŒã¿ãã³ã³ããŒãã³ãã®æšªã«å®çŸ©ãããŠããã®ã§èŠéããè¯ãã»äžèŠãªå®çŸ©ã®å逿Œãã«æ°ä»ããããã»underfetching/overfetchingã«æ°ä»ãããã çæã³ãŒãã1ã€ã®ãã¡ã€ã«ã«ãŸãšããããã©ã«ãã®æ¹æ³ãšæ¯ã¹ãŠãã¡ã€ã«ãã£ã³ã¯ã®æé©åãå¯èœãããŒãžã«å¿
èŠãªã³ãŒãã®ã¿ãå«ããããšãã§ãã ref: https://blog.hiroppy.me/entry/2021/08/12/092839 課é¡ãšããŠfragmentã§variablesãå®çŸ©ã§ããªãããšã®äžéœåããmutationã®refetchQueriesãšã®çžæ§ãæªããªã©ã¯èããããŸããããããå·®ã眮ããŠãã¡ãªããã¯å€§ãããšæã£ãŠããŸãã Testing, Storybook ã³ã³ããŒãã³ãã®ãã¹ãã¯GraphQLããªããŠãå€ããããStorybookãèµ·ç¹ã«è¡ãªãæ¹éãšããŠããŸãã Fragment Colocationãå©çšããŠãããã倧åã®ã³ã³ããŒãã³ãã¯å¿
èŠãªããŒã¿ã«çžåœããpropsãæž¡ãã ãã§åé¡ãªãã®ã§èããããšã¯å°ãªãã§ããããããã¯ãŒã¯ãªã¯ãšã¹ããçºçããPageã³ã³ããŒãã³ãã§ã¯ãªã¯ãšã¹ãã®ã¢ãã¯ãæ€èšããå¿
èŠããããŸãã ã¢ãã¯ãå®çŸããããã®ã©ã€ãã©ãªãšããŠã¯storybook-addon-apollo-client *14 ãšMock Service Worker *15 ã®2ã€ãéžæè¢ãšããŠèããããŸãããããŒã ã®åŠç¿è² è·ã倧ããç¶æ³ã ã£ãããäžæŠã¯åŠç¿ã³ã¹ãã®å°ãªãstorybook-addon-apollo-clientãéžæããŸããããããGraphQLã®å°å
¥ãšã¯å¥ã®èª²é¡æããmswãå°å
¥ããåããããŒã ã§å§ãŸã£ãŠãããããããã¯mswã«èŒãæ¿ããŠãããããšèããŠããŸãã ãŸãã¢ãã¯ããŒã¿ãç°¡åã«çæããããã®ä»çµã¿ãšããŠgraphql-codegen-typescript-mock-data *16 ãå°å
¥ããŠããŸããRailsã§ãã䜿ãFactoryBotã®ããã«ç°¡åã«ãªããžã§ã¯ããçæã§ããŠããªã䟿å©ã§ããæŠèŠã¯ãã¡ãã®èšäºãçè§£ããããããšæããŸãã zenn.dev ãªã³ããŒãã£ã³ã° æåŸã«çµç¹ãžã®GraphQLã®æµžéã®ããã®ãªã³ããŒãã£ã³ã°ã«ã€ããŠç޹ä»ãããŠãã ããã ã¿ã€ããŒã§ã¯çµç¹ã®æ¡å€§ã«äŒŽã£ãŠå€ãã®èª²é¡ãçãŸããŠã¯ä¹ãè¶ããŠããŸãããçŸåšã¯æžç±ããŒã ããããžãŒãçµç¹å
ã®å
±éèšèªãšããŠæ±ãåãçµã¿ãé²ãã€ã€ãããŒã ããããžãŒãããŒã¹ã«ããŒã ã®åœ¹å²ã®åå®çŸ©ã»åå²ãé²ããŠããŸãããã®éçšã§äºæ¥äŸ¡å€ãæå€§åãç®æãè€æ°ã®ããŒã ïŒããŒã ããããžãŒã§ç޹ä»ãããŠããã¹ããªãŒã ã¢ã©ã€ã³ãããŒã ïŒã®ä»ã«ãã¹ããªãŒã ã¢ã©ã€ã³ãããŒã ãæ¯æŽããéçºãã©ãããã©ãŒã ããŒã ãç«ã¡äžããŸããã *17 éçºãã©ãããã©ãŒã ããŒã ã¯ãã¹ããªãŒã ã¢ã©ã€ã³ãããŒã ãèªèº«ã®è²¬ä»»é åã«æ³šåããããããããã«ããªã¥ãŒã¹ããªãŒã ããé ãæè¡çãªé åã«é¢ããèªç¥è² è·ã®åæžãããã·ã§ã³ãšããŠããŸãã çè
ãéçºãã©ãããã©ãŒã ããŒã ã«æå±ãGraphQLã®å°å
¥ã«åãçµãã§ããŸããããã¹ããªãŒã ã¢ã©ã€ã³ãããŒã ã解決ããã課é¡ã解決ããããã«GraphQLãå©çšã§ããŠãããã«ããã¯ãšã³ãã®query/mutationããããã³ããšã³ãã®GraphiQLã§ã¯ãšãªãããããæžãå§ããããç¶æ
ãç®çãšããŠããŸããã åãããŠåŒããŒã ã¯ããŒã ããããžãŒã§ããã€ãã€ããªã³ã°ããŒã ãšããŠã®åŽé¢ãæã¡ãGraphQLã®ã¹ãã«ãã¹ããªãŒã ã¢ã©ã€ã³ãããŒã ãç¿åŸããããã®çæçãªæ¯æŽãæ
ã£ãŠããŸãããã®ããã®æ¯æŽã®äŸãšããŠã¢ãããã°ã©ãã³ã°äŒãéå¬ãããã瀟å
èšäºã®å
å®åãå³ã£ããããŠããŸããæ¬èšäºã¯ç€Ÿå
ããã¥ã¡ã³ãã«æžãé£ããŠããå
容ãããããã¯ãåºæã®å
容ãçç¥ããŸãšãããã®ã ã£ãããããŸãã 瀟å
èšäºã®äŸ ãŸãGraphQLãå©çšããå®è£
ã§å€æã«è¿·ãæã®è°è«ãæžããããã®åå°ãšããŠã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã¬ã€ãã®å¶å®ã«åãçµãã§ããŸãããŸã é²è¡äžã§ã¯ãããŸãããç®æ¬¡ã ã玹ä»ããŸãã ç®æ¬¡ ã¹ããªãŒã ã¢ã©ã€ã³ãããŒã ãå®éã«æ©èœå®è£
ãããéçšã§åºãŠãã課é¡ã«ãã£ãŠå çä¿®æ£ãç¹°ãè¿ããŠããäºå®ã§ããæ¬æãèªã¿ããæ¹ã¯ãã²å
¥ç€Ÿããã«ãžã¥ã¢ã«é¢è«ããåŸ
ã¡ããŠããŸãã çµããã« æ¬èšäºã§ã¯ãRailsãšNext.jsãå©çšããŠãããããã¯ãã§GraphQLãå°å
¥ããéã«èããããšã玹ä»ããŸãããæŠå¿µçã®èª¬æã¯å°ãªãã«ãããå®è·µçãªå
容ã®ç޹ä»ãç®çãšããŠããŸãããçµç¹ã§GraphQLãå°å
¥ãå§ããéã«è°è«ã®åèã«ããŠããã ãããšå¹žãã§ãã ãããŸã§èªãã§ããã ãããããšãããããŸããã *1 : https://github.com/rmosolgo *2 : https://relay.dev/graphql/connections.htm *3 : https://relay.dev/ *4 : https://formidable.com/open-source/urql/ *5 : https://github.com/prisma-labs/graphql-request *6 : Apolloã§ã®Suspenseã¯ãµããŒãäºå®ã§ã¯ããããã§ãã https://github.com/apollographql/apollo-client/issues/9627 *7 : https://user-first.ikyu.co.jp/entry/2022/07/01/121325 *8 : https://www.apollographql.com/docs/react/api/link/introduction/ *9 : https://github.com/rmosolgo/graphql-ruby/blob/db26a55a639a47f1206f5f7a3bf70ebbb61aaed0/lib/generators/graphql/templates/object.erb *10 : https://graphql-ruby.org/testing/integration_tests *11 : https://graphql.org/learn/best-practices/#nullability *12 : https://medium.com/@calebmer/when-to-use-graphql-non-null-fields-4059337f6fc8 *13 : https://www.the-guild.dev/graphql/codegen/docs/presets/near-operation-file *14 : https://storybook.js.org/addons/storybook-addon-apollo-client *15 : https://mswjs.io/ *16 : https://github.com/ardeois/graphql-codegen-typescript-mock-data *17 : ã¿ã€ããŒã®ãããã¯ãçµç¹ã®å€é·ããªãããŒã ããããžãŒããã«èå³ãããæ¹ã¯ãã¡ãã®èšäºãã芧ãã ããã チームトポロジー Vol. 2 「組織をチームトポロジーで振り返るメリット」タイミー 亀田 彗 | Forkwell Press | フォークウェルプレス
ããã«ã¡ã¯ãã¿ã€ããŒã§ããã¯ãšã³ããšã³ãžãã¢ãããŠãã飿³¢ @kyo_nanba ãšç³ããŸãã ä»åã¯9æ8, 9, 10æ¥ã«éå¬ãããã¿ã€ããŒããã©ããã¹ãã³ãµãŒãšããŠåè³ããRubyKaigi 2022ã®åå å ±åã«ãªããŸãã ãããã£ãå€§èŠæš¡ã«ã³ãã¡ã¬ã³ã¹ã¯æšä»ã®æ
å¢ããããªãã©ã€ã³ã§ã®éå¬ããªããªãé£ããç¶æ³ã§ããããä»å¹Žã¯ äžéç æŽ¥åžã§çŸå°éå¬ããããšããããšã«ãªããã²åå ããããšããæå¿ãéãŸã£ãŠåå ãããŠé ãããšã«ãªããŸããã ãªãã¿ã€ããŒã§ã¯èªåéããäžè©±ã«ãªã£ãŠããæè¡ã OSS ã«å¯ŸããŠã³ã³ããªãã¥ãŒããã¹ãã³ãµãŒãªã©æ§ã
ãªé¢ããè²¢ç®ããããšãæšå¥šããŠãããä»åã®RubyKaigiåå ããã®äžç°ãšããŠç€Ÿå
åå è
ã«ã¯ç§»åè²»ã宿æ³è²»ãªã©ãè£å©ãããŠããŸããæè¬ ð ãŸãäœè«ã§ããRubyKaigiãšã»ãŒåææã«éå¬ããã iOSDC Japan 2022 ã«ã€ããŠãã¹ãã³ãµãŒãããŠãããŸããã¿ã€ããŒã®äœ¿çšããŠããæè¡ãªã©ã«èå³ãæã£ãŠé ããæ¹ã¯ãã² ãã¡ã ãã芧ãã ããã åœæ¥ã®ã¿ã€ããŒããŒã ä»åã¿ã€ããŒãšããŠåå ãããŠé ããã®ã¯ãšã³ãžãã¢ã2åïŒãã©ã¹çŸåšãæäŒãé ããŠããæ¥åå§èšã®æ¹ã1åïŒãæè¡ã«èå³ãããåå ããããšæãæããŠãããã«ã¹ã¿ããŒãµããŒãã®æ¹ã1åããããã¯ãHRã®æ¹ã2åãšããå°ãå€åçãªããŒã ã§ããã ãšã³ãžãã¢ã®åå ã¯ãã¡ãããªã®ã§ãããã¿ã€ããŒã§ã¯éçºçµç¹ãããã¹ã±ãŒã«ããŠããããã«éçºçµç¹ã®äººäºäŒç»ã»æ¡çšãæ
åœããããããã¯ãHRããšããéšçœ²ãããããã®æŽ»åãããå éãããŠããããã«ããŸãã¯ç¥ãããšããå§ããããšãæ§ã
ãªç¥èŠãåŸãæ©äŒãšããŠäžç·ã«åå é ããŸãããã«ã¹ã¿ããŒãµããŒãã®æ¹ãå«ããšã³ãžãã¢ä»¥å€ã®è·çš®ã§ããããã¯ããæ¯ããæè¡ã«èå³ãæã£ãŠããæ¹ãå€ãããã®ãã¿ã€ããŒã®è¯ããšããã®1ã€ããªãšæããŸãã ãªãããã®ãããã¯ãHRãããå¥é RubyKaigi 2022åå èšäº ãå
¬éãããŠããã®ã§ããããããã°ãã¡ããã芧ãã ããã çºè¡šã«ã€ã㊠3æ¥éæ§ã
ãªçºè¡šã«åå ãããŠé ããŸããããã©ãããšãŠãæ¿ãå
容ã®çºè¡šã°ããã§ããã çºè¡šã§åŸãæ°ã¥ãããäºãã«å
±æãããæ¹ããŠèããŠã¿ãããã«åŸæ¥ç€Ÿå
ã®åå ãã人ãã¡ãåå ã§ããªãã£ã人ãã¡ã§éãŸã£ãŠæ¯ãè¿ãäŒãè¡ã£ãã®ã§ãããã§ã¯æ¯ãè¿ãäŒã®äžã§è©±é¡ã«æãã£ããç¹ã«å°è±¡ã«æ®ã£ãçºè¡šã«ã€ããŠããã€ãç°¡åã«ç޹ä»ããããšæããŸãã Ruby meets WebAssembly Ruby meets WebAssembly - Speaker Deck ãŸãã¯äžæ¥ç®ã®ããŒããŒãã§ãã " Ruby meets WebAssembly" ã«ãªããŸãã瀟å
æ¯ãè¿ãäŒã§ãã Ruby ã§æžããããã®ãJSã« ã³ã³ãã€ã« ããWebã§è¡šç€ºãããŠãä»ã®ããã³ãã®ãã¬ã³ããå€ãã£ãŠããã®ããªããªã©å人çã«WebAssemblyã«èå³ãæã£ããããååŠè
ã®ããã°ã©ãã³ã°åŠç¿ã«ãããŠæåã®å£ãšãªãã®ã¯ãã¯ãç°å¢æ§ç¯ã§ããããã©ãŠã¶ã§åãããããšã¯è£Ÿéãåºããããã«ãéåžžã«å€§äºããªã©ããã®èŸºãã®æè¡ãããæ·±ãŸã£ãŠããããšã«å¯ŸããæåŸ
ã®å£°ãå€ãæãããŸããã TRICK 2022 (Returns) GitHub - tric/trick2022 ãã¡ãã«ã€ããŠã¯ãã¯ãèŠãç®ã® ã€ã³ã㯠ãã匷ããã¿ãŒããã«ã§å®è¡ããã Ruby ã®ããã°ã©ã ã®æååèªäœãã¢ãã¡ãŒã·ã§ã³ãããã®ã¯ããããããæåã®åçŽãªäœåãèŠãæã¯ããããã®ãäœããªãã Ruby ãåŠãŒãããªãšæã£ãããäžäœã®äœåãçºè¡šããã床ã«ãããããªãããšæãã ãã«ãªã£ãŠããŸãããããªã©ç€Ÿå
æ¯ãè¿ãäŒã§ãé©ãã®å£°ãæãã£ãŠããŸããã ruby /debug - The best investment for your productivity ãã¡ã㯠Ruby 3.1ãã忢±ãããããã«ãªã£ã debug.gem ã«ã€ããŠã®è§£èª¬ã§ãããä»ãŸã§åŒç€Ÿã§ãã䜿ãããŠããã®ã¯byebugãšpryã ã£ãã®ã§ããããã¡ãã®çºè¡šãæ©ã«ã¢ãããŒã·ã§ã³ãé«ãŸãçŸåšã§ã¯ç€Ÿå
ã§æã倧ãã Rails ãããžã§ã¯ãã® ãªããžã㪠ãdebug.gemãš irb ã«ä»£ãã£ãŠãããŸãã ã°ã«ã¡ã«ã€ã㊠RubyKaigiãšããã°éå¬å°ã®åç£ãªã©æ§ã
ãªãã®ã楜ããã®ãééå³ã§ãã äžéç ãšããã°é°»ãæŸåçã¯èšãããããªãå°å
ã®ãé
ãæµ·ç£ç©ãªã©æ§ã
ãªã°ã«ã¡ããããŸããRubyKaigiéå¬äžã¯çæã®å€©åã«ãªãããšããŸãŸãããŸããããå€ã¯æ¯èŒç倩åãèœã¡çããããšãããããããããªãåºã§å°å
ã®ã°ã«ã¡ã楜ããããšãã§ããŸããã åçãèŠãŠãããšäžéã®é£äºãæãããªã£ãŠããŸãã®ã§ã°ã«ã¡ã®è©±ã¯ãã®èŸºãã«ããŠãããŸãããã åå ããŠã®ã²ãšããš æåŸã«å°ãç§äºã§ãããç§ãååRubyKaigiã«åå ããã®ã¯2018幎ã®ä»å°éå¬ã ã£ãã®ã§å®ã«4幎ã¶ãã®RubyKaigiåå ã§ããããã®é ãšã¯æ
å¢ã®å€åãããçãäžããæ¹ã«å€å°ã®å€åã¯ãããŸãããããã£ã±ãRubyKaigiã¯å¹Žã«äžåºŠ Rubyist ãéãŸããç¥ããšãã£ãé°å²æ°ã§ãåå è
ã®ã¿ãªããããæããã¢ãããŒã·ã§ã³ã®é«ããæ¥œããã§ããæ§åããèªåèªèº«ããã£ãšã¢ãŠããããããŠãããïŒè±èªãå匷ãããïŒãšããæ°æã¡ã«ãããããŸãã æ¬¡åã¯é·éç æŸæ¬åž ã§ã®éå¬ã§ãããåŒç€ŸãšããŠãããŒã¹ãåºãããä»ã®ã¹ãã³ãµãŒããèããããšããã£ãšç©æ¥µçã«é¢ãã£ãŠããããã§ããã æåŸã«ãã®é£ããç¶æ³ã®äžã§å
¥å¿µã«æºåãè¡ãç¡äºã«äŒãæåãããäž»å¬è
ã®æ¹ã
ã«å¿ããæè¬ãç³ãäžããŸãã
ã¯ããã« ããã«ã¡ã¯ãããã³ããšã³ããšã³ãžãã¢ã®æš«çŠ @cashfooooou ã§ãã å
æ¥ã åç°å人æ°ïŒä»¥äžã t_wada ããïŒã«ã質ãšã¹ããŒãããšããããŒãã§è¬æŒãããŠããã ããŸããã ãã®è¬æŒã«ã¯ãšã³ãžãã¢ä»¥å€ã®æ¹ã
ãåå ããŠãããŸããã åã¯åŠçæä»£ã« t_wada ããã® ãã¹ãé§åéçº ã«ã€ããŠã®è¬æŒãèããããšããããããä»¥æ¥ ãã¹ãé§åéçº ãåãå
¥ããããã«ãªããŸããã ä»åã®è¬æŒã§ãããªã«ãæ°ã¥ããåŸããããšãããããªããšã¯ã¯ã¯ã¯ããªããåå ããŸããã ã¯ããã« ãããªè¬æŒã§ãã åé ã§æããããåã ç ç²ã«ãããã¡ãªãå質ããšã¯ãªã«ã å
éšå質ãç ç²ã«ãããšãã®ã¹ããŒãã®æçåå²ç¹ã¯ã©ãã è¬æŒäŒã®æ¯ãè¿ã ãšã³ãžãã¢ã®æ¯ãè¿ã ãšã³ãžãã¢ä»¥å€ã®åå è
ã®ææ³ ãããã« ãããªè¬æŒã§ãã è¬æŒã®å
容ãç°¡åã«ãŸãšããŠã¿ãŸããã t_wada ãããå
¬éãããŠãã ãã¡ãã®è³æ ããã²åèã«ããŠãã ããã åé ã§æããããåã è¬æŒã®åé ã§äºã€ã®åããæããããŸããã ãã¹ããŒããåŸãããã«å質ãç ç²ã«ããŸãããšèšããšãã®ãå質ããšã¯ïŒ å質ãç ç²ã«ããŠã¹ããŒããåŸããããçæããšéã«ã¹ããŒããåŸãããªããªããäžæãã®å¢ç®ã¯ïŒ ç ç²ã«ãããã¡ãªãå質ããšã¯ãªã«ã SQuaRE ãšããå質ã¢ãã«ã§ã¯ãå質ã倧ãããå©çšæã®å質ããšã補åå質ãã«åããŸãã å©çšæã®å質ã¯å®éã«ãœãããŠã§ã¢ãå©çšãããŠãŒã¶ã«ãšã£ãŠã®å質ãæãã補åå質ã¯ãœãããŠã§ã¢ã®éçºè
ã«ãšã£ãŠã®å質ã§ãã ããã«ãã補åå質ãã¯ãå€éšå質ããšãå
éšå質ããšã«åé¡ã§ããŸãã å€éšå質ã¯ãœãããŠã§ã¢ã®æ£ããã䜿ãããããªã©å©çšæã®å質ã«çŽæ¥åœ±é¿ãäžãããã®ã§ãå
éšå質ã¯ã³ãŒãã®èªã¿ããããçè§£ã®ãããããªã©å©çšæã®å質ã«çŽæ¥çãªåœ±é¿ãäžããªããã®ã§ãã ãã¹ããŒããåŸãããã«å質ãç ç²ã«ããŸãããšãã£ãŠç ç²ã«ããã®ã¯ãå
éšå質ãã§ããã£ãšèžã¿èŸŒããšãä¿å®æ§ãã§ãã ä¿å®æ§ãšã¯ããã¹ãå®¹ææ§ãã倿Žå®¹ææ§ããçè§£å®¹ææ§ããªã©ããæ§æãããŸãã ã§ã¯ä¿å®æ§ãšã¹ããŒã㯠ãã¬ãŒããªã ã®é¢ä¿ãªã®ã§ããããïŒçã㯠NO ã§ãã ä¿å®æ§ãé«ãŸããšéçºãããããªãã¹ããŒããäžãããŸããã¹ããŒããäžããããšã§åŠç¿ããæ©äŒãå¢ããŠä¿å®æ§ãé«ãŸãã®ã§ãã 質ãšã¹ããŒãã¯çžäºã«é«ãåãé¢ä¿ã«ããããšãããããŸããã å
éšå質ãç ç²ã«ãããšãã®ã¹ããŒãã® æçåå²ç¹ ã¯ã©ãã å
éšå質ãç ç²ã«ãããšãã¹ããŒããåŸãããã®ã¯1ã¶æä»¥å
ã ãšèšãããŠããŸãã å
éšå質ãç ç²ã«ããŠããã£ãããã ãããã¹ããŒããåŸãããªããªãã°ãåžžã«å
éšå質ã®é«ãå®è£
ãç®æããã»ããããã§ããã è¬æŒäŒã®æ¯ãè¿ã ãšã³ãžãã¢ã®æ¯ãè¿ã è¬æŒäŒã®çµäºåŸã«ãåããŒã ã§ãå質ã®é«ãçæ³çãªç¶æ
ãšã¯ãªã«ãïŒãã«ã€ããŠè©±ãåã£ãŠããããŸããã ããããŒã 㯠Miro ã䜿ã£ãŠã¢ã€ãã£ã¢ãåºãåããããã¹ãå®¹ææ§ãã倿Žå®¹ææ§ããçè§£å®¹ææ§ãã®èгç¹ã§è©±ããŸãããè¬æŒäŒãšè©±ãåããéããŠæ¬¡ã®ãããªææ³ãããã ããŸããã ããã¯ãšã³ããšã³ãžãã¢ã®æ¹ ããšããšææåãããŠãªãã£ããå質ã®é«ãç¶æ
ãã®å
±éèªèãåãããšæããŸãã æãè¿ããšããããŸã§è°è«ããããšãã«ãå質ã®é«ãç¶æ
ãã®èªèã®ãºã¬ã®ããã§ããŸãé²ãŸãªãã£ãããšããã£ããããããªããªããšæããŸããã è¬æŒäŒãèããŠå質ã«ã€ããŠããŒã ã§æ¯ãè¿ã£ãããšã§ããã®äººã¯ãããªèгç¹ãæ°ã«ããŠããã ïŒãšããæ°ä»ãã«ç¹ãããŸããã ä»åŸãããŒã ã§è°è«ãããŠãããšãã«ã¯ãã©ããã芳ç¹ããã£ãŠè©±ããŠãããããããæèããè¯ãã³ãã¥ãã±ãŒã·ã§ã³ããšããŠå質ãé«ããããšãã§ãããã§ãã ãšã³ãžãã¢ä»¥å€ã®åå è
ã®ææ³ å¶æ¥éšã®æ¹ ãã¹ããŒããšè³ªãçžäºã«é«ãåãé¢ä¿ã«ããããšãã話ã¯å¶æ¥ã«ãéãããšæããŸããã ç§éã«ãšã£ãŠã®ãã¹ããŒããéããç¶æ
ãšã¯ãå¶æ¥æŽ»åã®åæ°ãå€ããããšãã質ãé«ããç¶æ
ãšã¯ãå¶æ¥æŽ»åã«åçŸæ§ããããããšã§ã¯ãªãããšèããŠããŸãã å¶æ¥è·ã¯ã客ãããšè©±ããŠåããŠæ°ã¥ãããšãããããããã®ã§ãããå¶æ¥æŽ»åãããããã«å Žæ°ãèžãããšã¯å¿
é ã§ãã å Žæ°ãèžãã§åŸãããç¥èŠã¯ãããŒã¿ã«èµ·ãã广æ€èšŒãçµãäžã§ç€Ÿå
ã«å
±æããããã«ããŠããŸããããããããšã§èªèº«ã®å¶æ¥æŽ»åã®åçŸæ§ãé«ãããšãã« ãåããŠå¶æ¥æŽ»åããã人ã§ãæ¢ç¥ã®åé¡ãã¯ãªã¢ã§ããè§åºŠã®åäžã å·¥æ° ã®ççž®ã«ç¹ãããŸããçµæãšããŠãæªç¥ã®åé¡ã«åãçµãæ©äŒãå¢ããããšãã§ããŸãã ãã®ãå Žæ°ãããªãããåçŸæ§ãäžãããåçŸæ§ãäžããããå Žæ°ãããªããããšãã奜埪ç°ãæèããŠããããã§ããã åºå ±ã®æ¹ ãšã³ãžãã¢ã®æ¹ãã©ããªããšã«èå³ãæã£ãŠãã®ããæ°ã«ãªã£ãŠåå ããŠã¿ãŸããã ãå質ãšã¹ããŒãã®ã©ã£ã¡ã倧åãâŠããšããæ©ã¿ã解決ããŠããã£ãã§ãã ããã«ããšã³ãžãã¢ã®æ¹ã
ãåããããªæ©ã¿ãæ±ããŠãããšç¥ã£ãŠããèŠªè¿æãæ¹§ããŸããã ç§ã¯ä»äºã§åçš¿ãæžãããšãå€ãã®ã§ãããåçš¿ã®å質ã¯äººã«èªãŸããããšã§å€æãããŸãã è¬æŒå
ã§ãã¹ããŒããéãããããšã§åŠç¿ããæ©äŒãå¢ããé«å質ã«ç¹ããããšãã話ããããŸãããã èªèº«ã®ä»äºã§ã¯ãããŸãåçš¿ãæžãäžããŠããŸã£ãŠãã¬ãã¥ãŒãæšæ²ãäœåºŠããããŠããç¶æ
ãã«çœ®ãæãããããšæããŸããã æéããããŠãããèšäºãæžãããšã¯éããªãã§ããããã åŠç¿æ©äŒãå¢ãããŠå質ãé«ããããšããèãã¯å€§åã«æ®æ®µ ããã ãŠããããã§ãã ãšã³ãžãã¢ä»¥å€ã®çããã«ãããšãŠãå匷ã«ãªã£ããšèšã£ãŠããã ããŸããïŒ çããã®ææ³ã䌺ããªãããéšçœ²ãããŒã ã«ãšã£ãŠã®è³ªãã¹ããŒããå®çŸ©ããããšãã¡ã³ããŒããã®å®çŸ©ãçè§£ããŠããŠå
±æã§ããŠããããšã倧åã ãšæããŸããã ãŸããéšçœ²ã暪æããåãçµã¿ã«ã€ããŠã¯ããäºãã®è³ªãšã¹ããŒãã®å®çŸ©ã«ã€ããŠçè§£ãåããåæ¹ã®è³ªãšã¹ããŒããé«ããªããããªåãçµã¿æ¹ã暡玢ã§ãããšçæ³çã ãªããšæããŸããã ããããã¯äŒç€Ÿå
šäœã§ã質ãšã¹ããŒãã®é«ããµãŒãã¹ã®æäŸããã§ããããã«ãªãããšãç®æããŠããããã§ãã ãããã« t_wada ããããæããã質ãšã¹ããŒãããšããããŒãã§è¬æŒãããŠããã ããŸããã è¬æŒäŒã«å ããŠããŒã ã§ã®æ¯ãè¿ããè¡ã£ãããšã§ãä»åŸã®ããéçºäœéšã«ç¹ããããã§ãã ãšã³ãžãã¢ã ãã§ãªãäŒç€Ÿå
šäœã«æµžéããæåã«ããŠãããããªããšãæã£ãŠããŸãã ä»åã®è¬æŒäŒããã£ããã«ãã¿ããªã®è³ªãšã¹ããŒãã«ã€ããŠã®èãæ¹ãå€ãããŸããã æ¬¡ã¯ãã©ã®ãã質ãšã¹ããŒããåäžããããããšããæè¡çãªèª²é¡ã«ãåãçµãã§ããããã§ãã
äžå®æãªå²ã蟌ã¿ã¿ã¹ã¯ã¯èŠèœãšãããããæ¯ãè¿ãã¥ãã Slack + Notionã§ãå²ã蟌ã¿ã¿ã¹ã¯ã管çãã CSã¡ã³ããŒã¯Notionã«èµ·ç¥šåŸãSlackã§å ±å ãšã³ãžãã¢ã¡ã³ããŒã¯ãDaily Standupã§åªå
床ãã€ãçæ è·çš®ããŸããã äŸé ŒãããŒããã£ãšæŽããã â»ãã®ããã°ã¯ Cocoda ããã«å¯çš¿ãããã®ã§ãã ã¿ã€ããŒã§ããã¯ãšã³ããšã³ãžãã¢ãããŠãã edy ã§ãã ã¹ããæéã«ãã€ããã§ããã¢ããªTimeeãéå¶ããŠããŸãã timee.co.jp ãšã³ãžãã¢ãšããŠãµãŒãã¹éçºã«é¢ããäžã§ãæ¥ã
ã® ã¹ã¯ã©ã ãªã©ã§ãèšç»çã«è¡ã£ãŠããã¿ã¹ã¯ããšã¯å¥ã«ããCSãªã©å¥ããŒã ããæ¥ã«äŸé Œãããã¿ã¹ã¯ãã«å¯ŸããŠãã©ããªåªå
床ã§ãã©ã®ããã«åãåã£ãŠãããšããã®ãé ãæ©ãŸããŠããŸããã 詊è¡é¯èª€ããçµæãã¿ã€ããŒã§ã¯NotionãæŽ»çšããŠãã®ãããªãå²ã蟌ã¿ã¿ã¹ã¯ãã«å¯ŸåŠããéçšãããŒãã€ãããããŸãåãå§ããŠããŸãã ã客æ§ã®ãµããŒããããCSã¡ã³ããŒã¯ãNotionã«èµ·ç¥šåŸãSlackã®ã¯ãŒã¯ãããŒã䜿ã£ãŠãšã³ãžã ã¢ã¡ã³ã㌠ã«ãç¥ãã 起祚ãåãããšã³ãžãã¢ã¯ãã察å¿å¯èœãªãã±ããæ°ãã«å¿ããŠã察å¿ãããã©ããããåªå
åºŠãæ±ºå®ããè§£æ¶ã«åãã ä»åã¯ãCSã¡ã³ããŒãšãšã³ãžãã¢ãæ»ããã«ã€ãªããNotionãšSlackã䜿ã£ãå²ã蟌ã¿ã¿ã¹ã¯ã®éçšæ¹æ³ã«ã€ããŠããã®èæ¯ãããã»ã¹ããŸãšããŠãããŸãã ãããã¯ãã®æ¹åãããŒããäœå¶ã¥ããã«æ©ãŸããŠããPMããšã³ãžãã¢ã®æ¹ã
ã®åã«ãªãããšå¬ããã§ãã äžå® æãªå²ã蟌ã¿ã¿ã¹ã¯ã¯èŠèœãšãããããæ¯ãè¿ãã¥ãã ãããŸã§ãããµã€ãã®æ
å ±ãå€ããã倿Žããé¡ãããŸãããšãã£ãå²ã蟌ã¿ã¿ã¹ã¯ã¯Slackäžã«ã®ã¿æµããŠããŠãäŸé Œãã人ã«ãã£ãŠäŸé Œã®ä»æ¹ããããããäŸé Œã®æ¹æ³ãäžæããšã³ãžãã¢ãéœåºŠå¯Ÿå¿ããã®ã¯å€§å€ããšãã£ãç¶æ³ã§ããã éå»ã®Slackã®ã¿ã®éçšïŒ2019幎é ïŒ ã¹ã¬ããã®ä»¶æ°ããããããšããã°ãã°çºçããŠããŸããã ããã§ãã¹ããã¯æ
å ±ãæ±ãããŒã«ãšããŠNotionãæŽ»çšããããšã«ããŸããã Notionã¯æ®æ®µãããžã§ã¯ããã¿ã¹ã¯ã®ç®¡çãããã¥ã¡ã³ãããŒã«ãšããŠã䜿ã£ãŠããã®ã§ãå²ã蟌ã¿ã¿ã¹ã¯ãNotionã§ç®¡çããããšã«ã Slack + Notionã§ãå²ã蟌ã¿ã¿ã¹ã¯ã管çãã ã¿ã€ããŒã®å²ã蟌ã¿ã¿ã¹ã¯ç®¡çã¯ãNotionãšSlackã䜿ããå²ã蟌ã¿å¯èœãªãã±ããæ°ããæ±ºããŠããã±ããæ°ã®ç¯å²ã§ããã°ãå²ã蟌ã¿ã¿ã¹ã¯ã«å¯Ÿå¿ããŠãããããªæµãã«ãªã£ãŠããŸãã CSã¡ã³ããŒã¯Notionã«èµ·ç¥šåŸãSlackã§å ±å ãŸãã¯ããµããŒãã¡ã³ããŒãããããã¯ãã®äžå
·åãèŠæãNotionã«èµ·ç¥šã å²ã蟌ã¿å¯èœãªãã±ããæ°ã¯ããšã³ãžãã¢ã®è² æ
ãå²ã蟌ã¿ã¿ã¹ã¯ã®æ°ãããçŸåšã¯2é±éã§14ãšæ±ºããŠããŸãã ãã®ãããCSã¡ã³ããŒã¯æ®ããã±ããæ°ãèŠãªãã起祚ãé²ããŠãããŸãïŒå³å¯ã«ã¯ãCSã®ãªãŒããŒãããã±ããã䜿ã£ãŠã§ãè§£æ¶ãããããšãããµãã«åªå
åºŠãæ±ºããŠãããŠããŸããïŒã å²ã蟌ã¿å¯èœãªãã±ããæ°ã¯ãNotionã®èšç®æ©èœã䜿ã£ãŠã14 - çŸåšã®ãã±ããæ°ãã§ç®åºããŠããŸãã å²ã蟌ã¿ã¿ã¹ã¯ã®çš®é¡ã«ã¯ã3çš®é¡ãçšæããŠããŸãã ããŒã¿å€æŽäŸé Œ ⊠å€ãæ
å ±ã®å·®ãæ¿ããªã© 仿§ç¢ºèª ⊠ãã¿ã³ã®æèšãã©ããªããžãã¯ã§å€ãããããªã© 調æ»äŸé Œ ⊠åå ãããããªãäžå
·åã®èª¿æ»äŸé Œãªã© ãããŠãSlackã¯ãŒã¯ãããŒã䜿ã£ãŠãå²ã蟌ã¿ã¿ã¹ã¯ããšã³ãžãã¢ã«äŒéã Slackã¯ãŒã¯ãããŒã§ã¯ãæé æžãèªãã ãã©ãããšNotionã®URLãäŸé Œå
容ãç°¡æœã«äŒããŠãããããã«ã ãŸããCSã¡ã³ããŒã¯ã¢ã«ãã€ãçã¿ã€ããŒã§ã®æ¥åã«ãŸã 粟éããŠããªãæ¹ã
ãããããã äŸé Œæ¹æ³ã«ã€ããŠå
±éã®èªèãæã¡ãäŸé Œãäžå®ã®æ°Žæºã«ããããã®æé æžãçšæ ããŠããŸãã äŸé Œã®éã¯ãå¿
ããããèŠãŠããããäŸé ŒãããŠãããããã«ããŠããŸãã ããŒã¿å€æŽäŸé Œã調æ»äŸé Œã仿§ç¢ºèªã®3ãã¿ãŒã³ããããã«å¯Ÿå¿ããNotionãã³ãã¬ãŒããçšæããŠããããšã³ãžãã¢ã察å¿ããéã«å¿
èŠãªããããã£ã®å
¥å ãã§ãã¯ããã¯ã¹ ãèæ¯ãæéã®çç±ãªã©ã®èšå
¥æ¬ãèªåçæãããããã«ãªã£ãŠããŸãã ããã«ãããæ
å ±ã®æãæŒã鲿¢ãã³ãã¥ãã±ãŒã·ã§ã³åŸåŸ©åæ°ã®åæžããŸãæ
å ±ã®æšæºåã«ç¹ãã£ãŠããŸãã å ±åããäŸé Œå
容ã¯ãèŠæãå ±åãã #product_ãšã³ãžãã¢äŸé Œ ãã£ã³ãã«ã«æµããŠããŠãå¿
èŠãªå Žåã¯æ
åœãããšã³ãžãã¢ãã¹ã¬ããã§ã³ãã¥ãã±ãŒã·ã§ã³ãããããã«ãªã£ãŠããŸãã ãšã³ãžã ã¢ã¡ã³ã㌠ã¯ãDaily Standupã§åªå
床ãã€ãçæ ããããŠãNotionã«ã¯å²ã蟌ã¿ã¿ã¹ã¯ããã±ããããšã«æºãŸã£ãŠãããŸãã å²ã蟌ã¿ãã±ããã®äžèЧãåããŒãžå
ã«ãå²ã蟌ã¿ã¿ã¹ã¯ãå
¥ããããŠããŸãã ãšã³ãžãã¢ããŒã ã§ãæ¯æãã£ãŠããDaily Standupã§å¯Ÿå¿ããå²ã蟌ã¿ã¿ã¹ã¯ã決å®ããåªå
床ã䜵ããŠã€ããŠå¯Ÿå¿ãé²ããŠãããŸãã å€éšã®é¡§å®¢ã«äŸ¡å€æäŸããã¿ã¹ã¯ãçŽæãå·®ãè¿«ã£ãŠããã¿ã¹ã¯ã¯åªå
床ãé«ãããŠããã瀟å
éçšåãã§ãã£ãããææ¥ã®äº€æžãå¯èœãªãã®ã¯åªå
床ãäœãããŠãé床ã«éçºã®ã¹ã±ãžã¥ãŒã«ãå§è¿«ããªãããã«åªããŠããŸãã ãpriorityãã®ããããã£ã§ã1~5ã®5段éã§æ°åãå²ãæ¯ãã5ãæãåªå
床ã®é«ãã¿ã¹ã¯ãšããŠæ±ããããã«ããŠããŸãã äŸé Œå
容ã«ã€ããŠããã£ãšçްããææ¡ãããå Žåã¯ãSlackã®ã¹ã¬ããã§ãããšããããŠãããŸãã å®éã®ãããšãã®äŸ ãŸãšãããšã å²ã蟌ã¿å¯èœãªã¿ã¹ã¯ã®æ°ãããã±ããæ°ããšããŠæ±ºãã äŸé Œã®éã¯å²ã蟌ã¿å¯èœãªæ°ã®äžã§ãCSã¡ã³ããŒãNotionã«èµ·ç¥šããSlackã§å ±å ãšã³ãžã ã¢ã¡ã³ã㌠ãåªå
åºŠãæ±ºããŠãé©å®ã³ãã¥ãã±ãŒã·ã§ã³ ãšãããããŒã«ãªã£ãŠããŸãã ããããŠãCSã¡ã³ããŒã¯ããå²ã蟌ã¿ã¿ã¹ã¯ã®äŸé Œãããããããšã³ãžã ã¢ã¡ã³ã㌠ãçªçºçãªã¿ã¹ã¯ã«å¯Ÿå¿ããããšããªããªããŸãã ïŒãšã³ãžãã¢ã®æ¹ã
ã«ã¯å€ããããããŸããããçªçºçãªã¿ã¹ã¯ã¯ã¹ãã¬ã¹ã«ãªãããšãå€ãã®ã§ãªãã¹ãé¿ããã...ïŒã è·çš®ããŸããã äŸé ŒãããŒããã£ãšæŽããã æ®æ®µè¡ã£ãŠããæ¥åããæå±ããŠããããŒã ãç°ãªããšãã©ãããŠãããŒã ãè·çš®ããŸããã§äŸé Œããããšãåå«ã«ãªã£ãããããããäŸé Œæ¹æ³ãåãããªãã£ããããŸãã ãããŸã§ã®äºäŸç޹ä»ã§ãæ±ã£ãéããäŸé Œããã»ã¹ã®å
¥ãå£ãæ¥åžžæ¥åã§å€çšããSlackã®ã¯ãŒã¯ãããŒã«èšçœ®ããããšã§ãã¹ã€ããã³ã°ã³ã¹ããæããªããã·ãŒã ã¬ã¹ã«äŸé Œæç¶ããéå§ããããäŸé Œæ¹æ³ãåãããªããŠãã¯ãŒã¯ãããŒãèµ·åããã°æèšã«åŸã£ãŠæ
å ±ãå
¥åããã ãã§æç¶ããæžãããã«ãªããŸããã çŸåšã§ã¯ãããã«Notionã®ããããã£ã CSV ã§ãšã¯ã¹ããŒãããé廿°ã¶æã§ã©ããã£ãçš®é¡ã®äŸé ŒããªãããŠãããã® å®é çãªåæãè¡ã£ãŠããŸãã é »åºŠãåæžã§ãã å·¥æ° ãªã©ãç·åçã«å€æããå¿
èŠããã°ãšã³ãžãã¢ããªãœãŒã¹ãæäžããŠæ©èœè¿œå ãããŠããŸãã ã¹ããã¯æ
å ±ãæŽ»çšããŠæ ¹æ¬çã«å²ã蟌ã¿äŸé Œãçºçãããªããããªã¢ã¯ã·ã§ã³ãåãããã®æææ±ºå®ææã«ããªã£ãŠããŸãã ä»ã®ãããŒãæäœæ¥ãªéšåããããæ¹åã®äœå°ãããã®ã§ããã瀟å
ã®å©çšè
ã®çããã«ããçŽ æ©ã䟡å€ãå±ãããããããªãããŒã«æ¹è¯ããŠããããšæããŸãã
ããã«ã¡ã¯ãã¿ã€ããŒã§ãããã¯ããããŒãžã£ãåããŠããé«ç³ ( @tktktks10 ) ã§ãã æŠç¥ãããŒããããã®çå®ããããããã¯ãã®ææãæå€§åããããã®èª²é¡çºèŠãåªå
é äœä»ããæ¥ã
ã®æ¥åãšããŠããŸãããä»åã¯ãã®äžã§ã顧客ãšçŽæ¥é¡ãåãããããŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒããèµ·ç¹ãšããåãçµã¿ã®è©±ãããããšæããŸãã ãŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒã®ç©ã¿éãããçµç¹ã®ã¢ã©ã€ã¡ã³ããçã¿åºã ã¿ã€ããŒã§ã¯æè¿æ°ãã«å
¥ç€Ÿé ããPMMã®åœ±é¿ãããããŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒã®é »åºŠã倧å¹
ã«å¢ãããŠããŸãããã£ããã¯åã«é¡§å®¢è§£å床ãäžããããšããè³ã£ãŠã·ã³ãã«ãªãã®ã§ããããæšªæçã«ç¶ç¶ããäžã§æ¬¡ç¬¬ã«éšçœ²ã圹è·ãè¶
ããå
±éã®é¡§å®¢å *1 ïŒã»ã°ã¡ã³ãïŒãåºæ¥äžãããæè¿ã§ã¯å
šç€ŸæŠç¥ããããã¯ãããŒãããããåå¥ã®æœçã«ãåŒçšããããŸã§ã«ãªã£ãŠããŸããã äžèšã§èšãã°ãã æšªæçãªãŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒã®ç©ã¿éãããçµç¹ãšããŠé¡§å®¢åãå®çŸ©ããæŠç¥ãæœçã«æŽ»çšããŠãã話 ããšãªããŸãã 圹å²ã«ããããããåã顧客åãåãããšã§äŸ¡å€æäŸã®åæãæããŸã çµç¹å
šäœã§å
±éçè§£ã®ãã顧客åã¯ãå
šç€ŸæŠç¥ããããŒã ã¬ãã«ã®æœçå
šãŠã«ãããäž»èªãšãªããèªããšåæã®åãçµã¿ãåãæ¹åãåããæè¬ã¢ã©ã€ã¡ã³ããåããŠããç¶æ
ãçã¿åºããŸããã¢ã©ã€ã¡ã³ããåããŠããç¶æ
ã§ã¯ããããå Žé¢ã§ã³ãã¥ãã±ãŒã·ã§ã³ã³ã¹ããåæžãããä»ã ããŒã±ãã£ã³ã° ããããã¯ãéçºãã«ã¹ã¿ããŒãµã¯ã»ã¹ãŸã§ãªã©ã äžæ°é貫 ãã課é¡è§£æ±ºã«ç¹ãããŸãã ãŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒããã«ãœããåå¥å
·äœã«é¢ããèšäºã¯å€ããã®ã®ãå®éã«æ§ç¯ããéçšãŸã§ã玹ä»ããå®äŸãèŠãããæ©äŒã¯å°ãªãããã«æããä»åã¯ã¿ã€ããŒã«ãããå®éã®ã ã©ã¯ ãã£ã¹ããŸãšããŸããã *1 å³å¯ã«ã¯é¡§å®¢ãšãŠãŒã¶ãŒã®åæ¹ãååšããŸãããããã§ã¯ãŸãšãäžãããããã®åŒç§°ãšããŠ"顧客å"ïŒã»ã°ã¡ã³ãïŒã«çµ±äžããããšãšããŸã ãçµç¹ãšããŠã顧客ãçè§£ãç¶ããæå³ çµç¹ãã¹ã±ãŒã«ããŠéšçœ²ãããŒã ã®æ°ãå¢ãããšãããããã®ããã·ã§ã³ãåãçµã¿ãæ°ãã«çãŸããã§ãããããã®éçšã«ãããŠå
šå¡ã®åãå
ãæãã顧客åãäžè¶³ããŠããã°ãçãå°ããã€ç°ãªã顧客åãæã¡å§ããç°ãªãæ¹åã«åããåºããŠããŸããŸãã顧客åãæ³šå察象ããºã¬ãç¶æ
ã§ã¯ã飿ºããéã®ã³ãã¥ãã±ãŒã·ã§ã³ã³ã¹ããå¢å€§ããä»ãéšçœ²ãããŒã éã§æã«ã¯å¯Ÿç«ãçãã ããªã©ã®åé¡ãçºçããŸããåªããçµç¹èšèšã®å
ã§ã¯ãããã®æ©æŠãèµ·ãã¥ãããã®ã§ãããããã§ãå°ãªããã忥ã飿ºãšãããã®ã¯çºçããã®ãçŸå®ã§ãã ãã®ãããªãµã€ãåãé²ãç¶æ³ã§ãããããµã€ãã®äžã«ããããŒã ãå人ãã顧客åãæã¡ç«ãŠãŠããäžã
æ ¹æ¬ã®åé¡ã¯è§£æ¶ããŸããã çµç¹ãã¹ã±ãŒã«ããäžã§å人ãããŒã å士ãç¹ãæ¢ããŠé床ãèœãšããªãããã«ã¯ã圹å²ã圹è·ãè·šã圢ã§çµç¹ãšããŠé¡§å®¢ãçè§£ããæŠç¥ãåéšã®ã¢ã¯ã·ã§ã³ã«éå
ãç¶ããå¿
èŠããããŸãã 以äžãå®éã«æšªæçãªã€ã³ã¿ãã¥ãŒã®ç©ã¿éãããå
šç€Ÿå
±éã®é¡§å®¢ã»ã°ã¡ã³ããæ§ç¯ããŠãããµã€ã¯ã«ãšãåŸããã顧客ã»ã°ã¡ã³ããæŠç¥ãæœçã«éå
ããããšã§åŸãããææã®é ã§ç޹ä»ããããšæããŸãããªããã¿ã€ããŒã¯BtoCã®ãµãŒãã¹ã§ãããä»åã®åãçµã¿ã¯ toC åŽã察象ã«ãããã®ã§ãã å®éã«è¡ã£ãŠããã€ã³ã¿ãã¥ãŒã®ãµã€ã¯ã« ç¶ç¶çãªåãçµã¿ã§ãã®ã§ãµã€ã¯ã«ãšãã衚çŸã«ãªãã äžèš1~3ã®ããã»ã¹ãæ¥åžžçã«åããŠããŸã ãå
šäœãéããŠãå
·äœããæœè±¡ãèŠåºãããšãæèããèšèšã«ãªã£ãŠããŸãã 1. å
±éçè§£ãç¯ããã人ãšã€ã³ã¿ãã¥ãŒãè¡ã äž»ã«ã€ã³ã¿ãã¥ã¢ãŒ2人ã®ããã¹ã€ã³ã¿ãã¥ãŒãç¶ç¶çã«è¡ã£ãŠããŸãã1人ãäž»ãªé²è¡ãæ
åœãããã1人ãèŠç¹ããã©ããŒãããããªãµããŒããããŸããçŸåšãããã ã§é±5åã§ãã®ã§ãæ¯æ¥1åã¯ã©ããããã®ãã¢ãã€ã³ã¿ãã¥ãŒãè¡ãªã£ãŠãããããã®é »åºŠã«ãªããŸãã ãã®æã å
±éçè§£ãç¯ããã人ïŒè£ãè¿ãã°ãçè§£ã«æºããã人ïŒãååžçžæã«éžå®ããŸã ããããã¯ããããŒãžã£ã§ããèªåã¯ãæŠç¥ã®è°è«ãå¿
èŠãªå Žåçµå¶é£ãé¢é£éšçœ²ã®ã¡ã³ããŒã ããã¯ãã° ã¬ãã«ã§è§£å床ãäžãããå ŽåéçºããŒã ãšååžããããšãå€ãã§ããã ããŒã±ãã£ã³ã° éšã§ã¯æ¢åã¡ã³ããŒãæ°ããå
¥ç€Ÿããã°ããã®ã¡ã³ããŒãšãªã³ããŒãã£ã³ã°ã®äžç°ãšããŠååžããŠããŸããå®éã®é¡§å®¢ãç®ã®åã«ããŠæéãå
±æããããšã¯ãå
茪ã®äŒè°ããã¯åŸããã匷åãªå
±éçè§£ãç¯ãæ¹æ³ã§ãã ãŸããã€ã³ã¿ãã¥ãŒèªäœã«ãæ§ã
ãªãã¯ããã¯ã¯ãããŸãããåºæ¬çã«ã¯ äºå®ãèãããã«åŸ¹ããŸã ãåŸè¿°ããå
±éçè§£ãç¯ãäžã§ã䞻芳ã§ã¯ãªãäºå®ãææ¡ããŠããããšã¯éåžžã«éèŠã§ããå人çã«ã¯äžèšã® ã¢ã³ããã¿ãŒã³ é *2*3 ãªã©ã¯åèã«ãªããŸããã *2 è¯ããŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒãæªããŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒïœMizuho Kushidaïœnote *3 倱æããåŠãã ããŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒ23ã®å¿åŸïœGoodpatch Blog ã°ãããããããã° 2. ã€ã³ã¿ãã¥ãŒã§åŸãããäºå®ã«ã€ããŠèå¯ããããŠãŒã¶ãŒã®ç¹åŸŽãç°¡æœã«ãŸãšãã Tips: ãå©çšãå§ãããã£ããããçŸåšã®äœ¿ãæ¹ããä»åŸã®å©çšèŠèŸŒã¿ãã®3ç¹ãå
·äœæ§ãæã£ãŠæžãããšãå€ãã§ã ã€ã³ã¿ãã¥ãŒãçµãã£ãããã®çŽåŸãé
ããšãèšæ¶ãæ°ããç¿æ¥ãŸã§ã«èå¯ã®æ¯ãè¿ããè¡ããŸããã€ã³ã¿ãã¥ãŒã§åŸãããäºå®ãåºã«ããŠãŒã¶ãŒã®å©çšéå§æèãçŸç¶è§£æ±ºããŠãã課é¡ã解決ããããŠããªã課é¡ãªã©ã«å¯ŸããŠååããŠè§£éïŒå³å¯ã«ã¯ä»®èª¬ïŒãåœãŠãŸãã åœç¶ç°ãªã2人ãè§£éãåœãŠãã®ã§ãåæ¹èªåã«ã¯ç¡ãã£ã芳ç¹ãé£ã³äº€ããŸãããã®éçšã§ã¯ãäºãã®èгç¹ãå
±æããŠèŠæ¹ãå¢ããè§£éã®ç²ŸåºŠãäžããããšã«ãã©ãŒã«ã¹ããŸããããŠãŒã¶ãŒãèµ·ç¹ã«ããŠãäºãã®èãæ¹ãç¥ãæéã§ããããŸãã èå¯ãäžéãçµãã£ãåŸã¯ããŠãŒã¶ãŒã®ç¹åŸŽã3~4è¡ã§ç°¡æœã«ãŸãšããããŸãããã®ãŸãšããæãã®å€éèŠã§ããã2人ã§ååããŠç¹åŸŽããµãã©ã€ãºããããšã§ããã®äººã¯ããããç®çã§ã¿ã€ããŒã䜿ã£ãŠããããããšãã£ãããŠãŒã¶ãŒã«å¯Ÿããå
±éçè§£ãçãŸãããšåæã«ãåŸãããã®ææžãã¿ããšãã«ãŠãŒã¶ãŒã®é¡ãã€ã³ã¿ãã¥ãŒå
ã®äŒè©±ãã¹ããšæãåºããå
¥ãå£ã«ããªããŸãã 3. ã€ã³ã¿ãã¥ãŒçµæãéåããã顧客åãå®çŸ©ã»ã¢ããããŒããã åã
ã®ã€ã³ã¿ãã¥ãŒãšãã®èå¯ã§åŸãããæ
å ±ãã éåç¥ ã«ããããã»ã¹ã§ãã æåãããŸãšãæ¹ã¯æš¡çŽ¢ãã€ã€çã§ã€ã³ã¿ãã¥ãŒçµæããã¯ã€ãããŒãã«è²ŒãåºããŠèå¯ãéãããããŠããŸããããç·ã€ã³ã¿ãã¥ãŒæ°ã30~40åãè¶
ãå§ãããšããã§å©çšç®çãå³ã¡è§£æ±ºããŠãã課é¡ã倧ããç°ãªã顧客åã2ã€æµ®ãã³äžãããçãè
ã«èœã¡ã圢ã§ã»ã°ã¡ã³ããšã㊠èšèªå ã»å®çŸ©ãããŸãã *4 ãçµæããã·ã³ãã«ã§ãããéçšã¯æ±ºããŠäºåçãªäœæ¥ã§ã¯ãªããæ®ã©ãäŒè©±ã«ããã¯ãŒã¯ã·ã§ããçãªæéãéããŠåºæ¥äžãã£ããã®ã«ãªããŸãã ãŠãŒã¶ãŒã¹ããŒãªãŒ ãããã³ã° ãçµæã®å
±æäŒãéããŠãžã§ãå¥ã«åé¡ å©çšç®çãç°ãªããšããã®ããã€ã³ãã§ãããã¯è§£æ±ºããŠãããžã§ããç°ãªãããšãæå³ããŸããäžè¬çã«ã»ã°ã¡ã³ããšããã°è·æ¥ã幎霢ãªã©ããæãã ã¢ã°ã© ããŒã¹ã®ç©ãå€ããããããŸããããä»åå®çŸ©ãããã®ã¯è§£æ±ºããŠãã課é¡å¥ãå³ã¡ãžã§ãããŒã¹ã®ã»ã°ã¡ã³ãã§ããããããã¯ãã®4éå±€ãåãããªãã°Whyã«çžåœãããã® *5 ã§ãã ãªããäžåºŠã»ã°ã¡ã³ããå®çŸ©ãããåŸã¯ããã«ç«ã¡è¿ãåœ¢ã§æ°ããªã€ã³ã¿ãã¥ãŒçµæãç
§åããç¶ç¶çã«å
容ãçè§£ãã¢ããããŒããç¶ããŠããŸãïŒçŸåšã§ã¯éå§ãã4ã¶æã§èš100~150人çšã«ãªããŸããïŒããã®2ã€ã®ã»ã°ã¡ã³ããçµç¹å
ã®å
±éèšèªã«ãªã£ãŠãããåŸè¿°ããæŠç¥ãæœçãªã©ã®åæãšããŠå©çšãããããšã«ãªããŸãã *4 æ¬èšäºã§ã¯åãäžããŠããŸããããå®éã¯ããçšåºŠ å®é ããŒã¿ã§è£ä»ãããšããªããå®çŸ©ãé²ããŠããŸã *5 äœã®ããã«ãã«ãœããã€ããã®ã - 4ã€ã®äœ¿ãåãïœå°åä¹
çŸå / ozyozyoïœnote åŸããã顧客åã®æŽ»çšäŸãšãã®ææ ãããŸã§ã®éçšã ãããã¯ãã«é¢ããå
šãŠã®åœ¹å²ã»åœ¹è·ãååããããšã§ãå人ã§ããªãããŒã ã§ããªããçµç¹ãšããŠã顧客åãäœãäžããŠãã ã®ããã€ã³ãã§ããèªåãã¡ã§äœã£ãŠããã®ã§éœåºŠèæ¯ã説æããå¿
èŠããªãã以éã®æŽ»çšãã§ãŒãºã«ãããŠæ¢ç¥ã®å
±éèšèªãšããŠå©çšããããšãã§ããŸãã å
šç€ŸæŠç¥ãããŒããããã«ãããæ³šåã»ã°ã¡ã³ããšããŠå©çšãããããšã§ãéšçœ²ãããŒã ã äžæ°é貫 ãã課é¡è§£æ±ºã«ç¹ãã 以åãããå
šç€ŸæŠç¥ãããŒããããã¯éçšãããŠãããã®ã®ã顧客åã®èªèã¯ä»ããææ§ã§ãããéšçœ²ãããŒã ã®æœçã¬ãã«ã§ç®çã®åæ£ãèµ·ããŠããŸã課é¡ãèµ·ããã€ã€ãããŸããã仿ãè¿ããšãããŒã¿ãå
ã«ããäŒè©±ã¯å€ãã£ããã®ã®ãã€ã³ã¿ãã¥ãŒãªã©é¡§å®¢ã®Whyã«è§Šãã宿§çãªæéãå
±ã«ããæ©äŒã¯å°ãªãã£ãããã«æããŸãã æ¢ã«å
±éèšèªã«ãªã£ãŠãã顧客åãæŠç¥ã®éªšåã«å©çšãã äžæ¹ãæè¿æŠç¥ãããŒãããããã¢ããããŒããããã¿ã€ãã³ã°ã§ä»åäœãäžãã顧客åãåŒçšããããšã«å ããäºæ¥ã®æ¹åæ§ããããã¯ãããžã§ã³ãšç
§ããåãããäžã§æ³šåããã»ã°ã¡ã³ããšç®æãã¹ãæ¹åæ§ãèªããšæ±ºå®ãããŸãããããã¯ãäžé·æçã»çµç¹çãªç®ç·ã«ãããŠã 誰ãã©ããªç¶æ
ã«ãããã®ã ãã®æ¹éãç«ã£ãããšã«çžåœããŸããéããŠã®åŒ·èª¿ã«ãªããŸãããããããçµç¹çã«äœãäžãã顧客åã§ããããããã®æç¹ã§æ¢ã«é¢ä¿è
éã§å
±éçè§£ãããç¶æ
ã§ãããããã£ãŠãåŸããããã¥ã¡ã³ãã«ãã远å ã®è£è¶³ãç¿»èš³äœæ¥ãªã©ãã»ãšãã©å¿
èŠãããŸããã çµæçã«ãç²åŸæœçãããããã¯ãéçºãããŒã±ããã€ã³ãŸã§å
±éã®é¡§å®¢åãæã€ããšã§ã以åãããæ£ããé¡§å®¢ã«æ£ãããããã¯ããå±ããããã®é£æºãã§ããããã«ãªã£ãŠããŸãããéšçœ²ãããŒã ã®åã«é¡§å®¢åãšãã©ãŒã«ã¹ã決ãŸã£ãŠããããšã§ãçµç¹å
šäœã掻ããã課é¡è§£æ±ºã«ç¹ãã£ãŠããŸãã éšçœ²éã®åæãæãããšã§ããããã¯ãéçºã®åªå
é äœä»ããå¹çåãã ãã¡ãã¯ããå°ãå
·äœã«è¿ããæ¥ã
ã® ããã¯ãã° ã«å¯Ÿããåªå
é äœä»ãã®è©±ã§ãã å
±éã®é¡§å®¢åãšãã©ãŒã«ã¹ãã§ããåã¯ãããããåããŠãã顧客åãè¥å¹²ãºã¬ãŠããŠèŠç¹ãåºãããããŠããããã«ãã¹ããŒã¯ãã«ãããã®èŠæã«å¯ŸããŠéœåºŠç®ç·ã®èª¿æŽãããæãããšãå€ãã£ãããã«æããŸãããã¡ããåå¥ã®æœçã«å¯ŸããŠã³ã¹ãã®è»œããã®ããéæå®è¡ãããšãã倿ãã§ããªãã¯ãªãã§ããããã©ãŒã«ã¹ã®å®ãŸããªãè¡šå±€ã®æ¹åã ããé£ç¶ããŠããŸãããšã«ãªããŸããæ¬è³ªçãªèª²é¡ã解決ãäžé·æçãªæé·ãç®æãã«ã¯ãåäžã®ãŽãŒã«ã«å¯ŸããŠç¶ç¶çã«æ¹åã詊ã¿ã éžæãšéäž ãå¿
èŠã§ããããããããã£ãç¶æ³ã«ãªãããšã¯å¥œãŸãããããŸããã äžæ¹ãå
±éã®é¡§å®¢åãšãã©ãŒã«ã¹ã決ãŸã£ãŠããã¯èªããšæœçã¬ãã«ã®æ¹åæ§ãæãå§ãããããç®ç·ã®èª¿æŽãæãã±ãŒã¹ãããªãæžããŸããããŸãããããã¯ãéçºã«ãããçŽè¿ã®æ³šåããŒããã¹ããŒã¯ãã«ãã«çè§£ããŠãããããšã§ããã®éã¯éçºãå¿
èŠãšããªããããã¯ãå€ã§äžŠèµ°ã§ããæ¹åã«åãçµãã§ããããªã©ããããååããæ©äŒãå¢ããŠããããã«æããŸããæ ¹ã£ãã®ç®ç·ãæãããšã§ã³ãã¥ãã±ãŒã·ã§ã³ã³ã¹ããåæžãããã®ã¯ãã¡ããã以åããå¹ççãªåæ¥ãã§ããããã«ãªããŸããã éçºæã«åŒçšããããã®ã¥ããã«ãããæææ±ºå®ã®ä¿é²ã«ç¹ãã åè¿°ããåªå
é äœä»ãã«ãã€ãªãããŸããã顧客åãšãã®ãã©ãŒã«ã¹ã決ãŸã£ãŠããããšã§ã ããã¯ãã° èªäœãèªç¶ãšæµããæã£ãæ§æã«ãªããŸãããŸããããã¯ãŸã äžéšã§ããã ããã¯ãã° ãªãã¡ã€ã³ã¡ã³ãã§éçºããŒã ã顧客ã»ã°ã¡ã³ãåŒçšããããšã§ãèªåŸçã«æ©èœéçºã®æ¹åæ§ã決å®ã§ããã±ãŒã¹ãåºãŠããŸããããã ããUI/UXã¬ãã«ã®æææ±ºå®ã粟床è¯ãé«ãè¡ãã«ã¯ãããäžæ®µéå
·äœã«å¯ã£ãWhatã¬ãã«ã®é¡§å®¢åãå¿
èŠã§ãããšãæããŸãããã®èŸºãã¯æè¿åãçµã¿å§ããUXãªãµãŒãããããã¿ã€ãã³ã°ãéããŠãçµç¹ãšããŠã®ä»®èª¬æ€èšŒèœåãäžããŠãããããã€ã³ãã§ããããŸãã ä»åã®åãçµã¿ãå§ããéã«ãã£ãŠããã£ãããš æåã¯ãšã«ããéãéããããš æ£çŽãªãšãããã€ã³ã¿ãã¥ãŒéå§åœåã¯ç®çèšèšãææ§ã§ãããããã仿ãè¿ããšã 顧客解å床ãäœãç®çèšèšãææ§ã«ãªãããã€ã³ã¿ãã¥ãŒãèµ·ããã¥ããããã€ã³ã¿ãã¥ãŒãèµ·ãããªããã顧客解å床ãäžãããªãè² ã®ã¹ãã€ã©ã« ã«é¥ã£ãŠããããã«æããŸãã äžæ¹ãã²ãšãã³é¡§å®¢ã®è§£å床ãäžããã¯ããããšèªããšæ°ããªçåïŒä»®èª¬ïŒãçãŸããŸãããã®çåãè§£æ¶ããããã«æ¬¡ã®ã€ã³ã¿ãã¥ãŒãèšèšããŠâŠããšããããžãã£ããã£ãŒãããã¯ãµã€ã¯ã«ãçãŸããã°ãåŸã¯åæã«èªèµ°ããã§ãããããŸãã¯ç®çãææ§ã§ãè¯ãã®ã§ãéãéããŠã¿ãããšãããããããŸãã ã€ã³ã¿ãã¥ãŒã®åå ã³ã¹ããæããä»çµã¿ãåæã«äœã£ãããš ãã¡ãã¯ä»¥ååºããèšäºã®å
容ã«ãªãã®ã§ãããã¿ã€ããŒã§ã¯æãç«ãŠã°èª°ã§ãã€ã³ã¿ãã¥ãŒã«åå ã§ãã瀟å
ã®ä»çµã¿ãæ§ç¯ãããŠããŸããå®éã€ã³ã¿ãã¥ãŒãè¡ãã«ã¯ã€ã³ã¿ãã¥ã€ãŒã®éžå®ããå®éã®åéãè¬ç€Œã®åãæž¡ããåœæ¥ãŸã§ã®é£çµ¡ãªã©ãæ§ã
ãªé垯æ¥åãçºçããèš³ã§ãããããããã€ã³ã¿ãã¥ãŒãæ¯ããããŒã ããµããŒãããããšã§ãåå è
ã¯ã€ã³ã¿ãã¥ãŒã®ã³ã³ãã³ãã ãã«éäžã§ããããã«ãªã£ãŠããŸãã åè¿°ããããžãã£ããã£ãŒãããã¯ãµã€ã¯ã«ã«ä¹ãããã«ããã€ã³ã¿ãã¥ãŒãè¡ã人ãšã€ã³ã¿ãã¥ãŒã®èšå®ããµããŒããã人ãåé¢ããããšã¯ãä»åã®åãçµã¿ã«äžåœ¹è²·ã£ããšæããŠããŸãã ãããã« æåã¯äœæ°ãªãå§ãããŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒã§ããããä»ã§ã¯æ¡å€§ãç¶ããçµç¹ã«ãããŠé¡§å®¢ã®å
±éçè§£ãä¿ã¡ç¶ããéèŠãªããã»ã¹ãšãªããŸããã ãããã¯ããããžã¡ã³ã ã«ãããŠããå
±éã®é¡§å®¢åãäž»èªã«ãªãããšã§ãçµç¹ã§ãã®ã¥ãããããåãã€ããŠããŠããããã«æããŸãã ãšã¯ãããã¿ã€ããŒã¯æ¥æé·äžã®ãããã¯ãã§èª²é¡ããŸã ãŸã 転ãã£ãŠããŸãããã£ãšå
·äœçã«è©±ãèããŠã¿ããæ¹ããŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒã«éãããããã¯ãéçºã ãããã¯ããããžã¡ã³ã ã«ã€ããŠèå³ãããæ¹ããã¡ããã¿ã€ããŒèªäœã«èå³ã®ããæ¹ãè·çš®åãããæ°è»œã«ã話ããŸãããïŒïŒ Twitter ããDMãé ãããšå©ãããŸãïŒ
åç·š(ãã©ã³ã¶ã¯ã·ã§ã³ç¯å²ã®æå°å)ãž ã¯ããã« ããã«ã¡ã¯ãã¿ã€ããŒã®ããã¯ãšã³ããšã³ãžãã¢äžéã§ãã åç·šã§ã¯ç· ãã® ãããåŠç ã«ããã ãã©ã³ã¶ã¯ã·ã§ã³ ã®ç¯å²ãæå°åããæè¡çæ¹åãã玹ä»ããŸããã ãã©ã³ã¶ã¯ã·ã§ã³ ã®ç¯å²ã ãããåŠç å
šäœããæå°éã®ç¯å²ã«å€æŽããããšã«ããã ãããåŠç ã倱æããå Žåã«è«æ±ã¬ã³ãŒãã®åŠçãéäžãŸã§å®äºããŠããç¶æ
ãçºçããããã«ãªããŸãããåŸç·šã§ã¯ãåŠç察象ã®è«æ±ã¬ã³ãŒãã«å¯Ÿãç¶æ
ãæãããããšã§ ãããåŠç å
šäœã§ã®åªçæ§ãæ
ä¿ãã ãããåŠç ãéäžã§å€±æããå Žåã§ãå®å
šã«åŠçãåéã§ããããã«ããåãçµã¿ãã玹ä»ããŸãã ã¯ããã« ç· ãã®ãããåŠçãšã¯ çŸç¶ã®èª²é¡èªè 宿œããæœç åªçæ§ãšã¯ åªçæ§ãå®çŸããæ¹æ³ ãããåŠçãžã®é©çš éæã§ããããš ä»åŸã®èª²é¡ ã¹ã«ãŒãããåäžãšãªãœãŒã¹æé©å ãŸãšã ç· ãã® ãããåŠç ãšã¯ ãŸãã¯åç·šã®ããããã«ãªããŸãããåŒç€Ÿã®ç· ãã® ãããåŠç ã«é¢ããŠèª¬æããŸããç· ãã® ãããåŠç ãšã¯ãæåã«å®æçã«å®è¡ããããªã³ã©ã€ã³ãããã§ããäŒæ¥ãžã®å
æã®è«æ±ã確å®ãããåŠçã«ãªããŸãã å
·äœçãªç· ãåŠçãŸã§ã®ããã»ã¹ãèšè¿°ãããšä»¥äžã®éãã«ãªããŸãã äŒæ¥ãžã®è«æ±ãçºçããæ®µéã§ãè«æ±ããŒãã«ãã«ã¬ã³ãŒããäœæãããŸã æ¯ææåã®ãç· ããã® ãããåŠç ã«ããããè«æ±ããŒãã«ãã®ã¬ã³ãŒããã確å®è«æ±ããŒãã«ãã«è€è£œããããšã§äŒæ¥ãžã®è«æ±ã確å®ãããŠãããŸã ã€ãŸããç· ãã® ãããåŠç ãšã¯æåæç¹ã®è«æ±ããŒãã«ã®ã¹ãããã·ã§ãããæ®ãè¡çºã§ãããšã¿ãªãããšãã§ããŸãã çŸç¶ã®èª²é¡èªè åç·šã®æè¡çæ¹åã«ãã ãã©ã³ã¶ã¯ã·ã§ã³ ã®ç¯å²ã ãããåŠç å
šäœããæå°éã®ç¯å²ïŒã¬ã³ãŒãåäœïŒã«å€æŽããŸããããããŸã§ã¯ ãããåŠç ã®éäžã§åŠçã倱æããå Žåã«ã¯ ãã©ã³ã¶ã¯ã·ã§ã³ ã® ããŒã«ãã㯠ã«ããæ¬¡ã®2ã€ã®ç¶æ
ãæ
ä¿ãããŠããŸããã 確å®è«æ±ã¬ã³ãŒããå
šãŠäœæãããç¶æ
ãã©ã³ã¶ã¯ã·ã§ã³ ãæåããå Žåã«é·ç§»ããç¶æ
ããè«æ±ããŒãã«ãã®ã¬ã³ãŒãããã¹ãŠåŠçããã確å®è«æ±ããŒãã«ãã«éäžè¶³ãªãã¬ã³ãŒããäœæãããŠããããã®ç¶æ
ã«é·ç§»ããæã«ç¢ºå®è«æ±ããŒãã«ã«äŸåããŠããå©çšæçްç»é¢ã®è¡šç€ºãäžæã«æŽæ°ãããã 確å®è«æ±ã¬ã³ãŒãã1ã€ãäœæãããŠããªãç¶æ
ãããåŠç éå§åãŸãã¯åŠçã倱æããã«é·ç§»ããç¶æ
ã ãããåŠç ãéäžã§å€±æããå Žåã«ã¯ ãã©ã³ã¶ã¯ã·ã§ã³ ã® ããŒã«ãã㯠ã«ããåŠçéå§åã®ç¶æ
ã®ãŸãŸãšãªãã確å®è«æ±ããŒãã«ã«äŸåããŠããå©çšæçްç»é¢ã®è¡šç€ºã¯ ãããåŠç å®è¡åã®è¡šç€ºã®ãŸãŸãšãªãã ãã©ã³ã¶ã¯ã·ã§ã³ ãã¬ã³ãŒãåäœã«å€æŽããããšã§ã ãããåŠç å
šäœã§ã®ååæ§ãæ
ä¿ãããªããªãç¶æ³ãçºçããŸãããäžå³å³åŽã®å€±ææã®éããéäžãŸã§ã¬ã³ãŒããäœæãããŠããç¶æ
ãååšããããã«ãªããŸããã ãã©ã³ã¶ã¯ã·ã§ã³ ãæå°åããããšã«ããåœ±é¿ éäžãŸã§ã確å®è«æ±ããŒãã«ãã®ã¬ã³ãŒããäœæãããç¶æ
ãåºçŸããããšã«ããçããã課é¡ã¯äžèšã®éãã§ãã åŠçåéæã«éè€ããŠç¢ºå®è«æ±ã¬ã³ãŒããäœæãããåé¡ ãããŸã§ã¯ ãããåŠç ã倱æããéã«ã ãã©ã³ã¶ã¯ã·ã§ã³ ã® ããŒã«ããã¯ æ©æ§ã«ãã ãããåŠç éå§åã®ç¶æ
ã«æ»ããã倱æã®åå ãæé€åŸã«å床æåãã ãããåŠç ãåéããããšã§ããŸããããããã ãããåŠç å
šäœã§ã® ãã©ã³ã¶ã¯ã·ã§ã³ ã廿¢ããéäžãŸã§ã確å®è«æ±ã¬ã³ãŒãããäœæãããç¶æ
ãçºçããããšã§ãå床åŠçãå®è¡ãããšéè€ãã確å®è«æ±ã¬ã³ãŒããäœæãããå¯èœæ§ãã§ãŠããŸããã å©çšæçްãžã®åœ±é¿ äŒæ¥ç®¡çç»é¢ã§ã¯ãç¿æã®è«æ±äºå®é¡åã³æããšã®ç¢ºå®ããè«æ±é¡ãé²èЧããæ©èœãæäŸããŠããŸãããã®ç¿æã®è«æ±äºå®é¡ããè«æ±ããŒãã«ãã«äŸåããŠãããç· ãåŠçããããŠããªãè«æ±ããŒãã«ã®ã¬ã³ãŒãåèšã衚瀺ããããã«ãªã£ãŠããŸããäžæ¹ã§ãæããšã®ç¢ºå®ããè«æ±é¡ã¯ã確å®è«æ±ããŒãã«ãã«äŸåããŠããŸãã ãããåŠç å
šäœã«ãã㊠ãã©ã³ã¶ã¯ã·ã§ã³ ãé©çšãããŠããå Žåã¯ã ãã©ã³ã¶ã¯ã·ã§ã³ ãã³ããããããã¿ã€ãã³ã°ã§åŠççµæãããŒã¿ããŒã¹ã«åæ ãããããã ãããåŠç å®äºæã«å©çšæçްã®è¡šç€ºãäžæã«æŽæ°ãããŠããŸããããããã ãããåŠç å
šäœã® ãã©ã³ã¶ã¯ã·ã§ã³ ã廿¢ã鿬¡çã«åŠççµæãããŒã¿ããŒã¹ã«åæ ããããã«ãªã£ããããäŒæ¥ãå©çšæçްãéããã¿ã€ãã³ã°ã«ãã£ãŠç¿æã®è«æ±äºå®é¡ãå€åããåé¡ãçºçããŸããã ç· ãåŠçãšå©çšæçްç»é¢ã®ããŒãã«ãžã®äŸåé¢ä¿ ãã®ããã«åŠçãéäžã§å€±æããã±ãŒã¹ã¯ ãããåŠç ã ãã«éã£ã話ã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ã®éçºã»éçšããŠããäžã§æ§ã
ãªåå ã«èµ·å ãçºçããŸããäŸãã°ãããã°ã©ã ã®ãã°ãããŒã¿æ¬ æãç°åžžå€ãã¡ã¢ãªäžè¶³ãªã©ãæããããŸãããã®ããåŠçã倱æããå Žåã«åããŠã¢ããªã±ãŒã·ã§ã³èšèšãèããŠããå¿
èŠããããŸãã 宿œããæœç äžèšã®èª²é¡ã解決ãã¹ããç· ãã® ãããåŠç ãåèšèšããã«ãããåªçæ§ãæèããŸããã åªçæ§ãšã¯ åªçæ§ãšã¯ãããæäœã1床å®è¡ããŠããè€æ°åå®è¡ããŠãåãçµæã«ãªããæ§è³ªã®ããšãèšããŸããåªçæ§ãæ
ä¿ãããŠãããšãä»®ã«åŠçãéäžã§å€±æãããšãã«åŠçããªãã©ã€ããŠãæçµçãªçµæã1åã§åŠçãæåããå Žåãšå€ãããªãããšã«ãªããŸããä»åæ±ãç· ãã® ãããåŠç ã§ã¯ããªãã©ã€æã«åŠçæžã¿ã®è«æ±ããŒã¿ã«åºã¥ã確å®è«æ±ã¬ã³ãŒããéè€ããŠäœæãããå¯èœæ§ããããŸãããã®ããã ãããåŠç ã«åªçæ§ãæãããããšãéåžžã«éèŠãšãªã£ãŠããŸãã ãããåŠç ã«ãããŠåªçæ§ãå®çŸããæ¹æ³ã次ã«2ç¹ç޹ä»ããŸãã åªçæ§ãå®çŸããæ¹æ³ ãã§ã«åŠçãå®äºãã察象ããªãã©ã€æã«åŠçããªãæ¹æ³ ãããåŠç ã®å¯Ÿè±¡ã«æªåŠçãããã¯åŠçæžã¿ã®ç¶æ
ããããããããšã§ããªãã©ã€æã«åŠçæžã¿ã®å¯Ÿè±¡ãã¹ããããããæ¹æ³ããããŸãããªãã©ã€æã«æªåŠçã®ã¿ã察象ã«åŠçãéå§ã§ããããã ãããåŠç å
šäœã®å®äºæéãæ©ããããåé¢ãç¶æ
ã管çããå¿
èŠãããããæ¡ä»¶åå²ã®ããžãã¯ãå
¥ããªã©ã³ãŒãã®è€éããå¢ãåŸåã«ãããŸãã ãã§ã«åŠçãå®äºãã察象ãå«ããŠãªãã©ã€ããæ¹æ³ 1床ç®ã® ãããåŠç ã«ãã£ãŠåŠçããã察象ãå«ããŠåŠçããæ¹æ³ã§ããäŸãã°ãåŠçããçµæãããŒã¿ããŒã¹ã«æ°žç¶åããŠããå Žåã¯ãã§ã«ååšããŠããã¬ã³ãŒããåé€ãæ°èŠã§ã¬ã³ãŒããäœæãçŽãåŠçã1ã€ã® ãã©ã³ã¶ã¯ã·ã§ã³ å
ã§å®è¡ããŸããããããããšã§éè€ããã¬ã³ãŒãã¯äœæãããåªçæ§ãæ
ä¿ãããŸããçæãã¹ãç¹ãšããŠã¯1ã€ã²ãšã€ã®åŠç察象ã¬ã³ãŒãèªäœãåªçæ§ãæããŠããå€éšãµãŒãã¹ã«äŸåããŠããªãããšã§ãã1ãšæ¯èŒãåå²åŠçã«ããã³ãŒãã®è€éæ§ã¯åé¿ã§ããåé¢ããªãã©ã€æã«æåããåŠçã®å®è¡ãåéããå¿
èŠãããããå®äºæéãé
å»¶ããåŸåã«ãããŸãã ãããåŠç ãžã®é©çš ä»åã¯1ã®æ¹æ³ã§åªçæ§ãå®çŸããŸãããå
·äœçã«ã¯ãè«æ±ã¬ã³ãŒãã«ãç· ãåããç· ãäžããç· ãåŸãã®ç¶æ
ãæãããããšã§ç· ãåŠçæžã¿ãã©ããã®å€å®ãè¡ãããšãã§ããããšãéäžã§ ãããåŠç ã倱æããå Žåã§ããªãã©ã€ ããéã«ç· ãåŠçæžã¿ã®ã¬ã³ãŒããã¹ãããããã°ç¢ºå®è«æ±ã¬ã³ãŒãã®éè€äœæãåé¿ã§ããŸãããŸããè«æ±ããŒãã«ã«ç¶æ
ãæã€ããšã§ãç· ãåŸãã®ç¶æ
ã«é·ç§»ããéã«äŸåå
ã®å©çšæçްç»é¢ã®è¡šç€ºãåãæ¿ããã ãã§ãç· ãåŠçãéäžã§å€±æããå Žåã®ç· ãéäžã®äžéå端ãªç¶æ
ã®éé¡ãé²èЧãããåé¡ãåé¿ã§ããããã«ãªããŸããã éæã§ããããš ç· ãã® ãããåŠç ã«åªçæ§ãèæ
®ããèšèšæ¹åãè¡ãããšã§æ¬¡ã®ææãåŸãããŸããã åŠçã倱æããå Žåã«ãªãã©ã€ããŠãéè€ããè«æ±ãçºçããããšã鲿¢ã§ãã è«æ±ã¬ã³ãŒãã«ç¶æ
ãæãããããšã§ ãããåŠç ã®åŠçç¶æ
ã«äŸåããŠããå©çšæçްç»é¢ã®è¡šç€ºãå¶åŸ¡ã§ããããã«ãªã£ã 坿¬¡çãªå¹æãšã㊠ãããåŠç å
šäœã®å®äºæéã®çæåãå®çŸã§ããŸããã ãããåŠç ã倱æããéã«ãåŠçã倱æããåå ãæé€åŸã«åã«ãªãã©ã€ããã°åŠçãåéã§ããããã«ãªããçµæçã« ãããåŠç å®äºãŸã§ã®æéã®ççž®åã«ã€ãªãããŸããã ä»åŸã®èª²é¡ æåŸã«ãããããæ¹åãèããŠãã課é¡ãæç€ºããäžã§ ãããåŠç ã®æ¹åã«é¢ããèšäºã®ãç· ãããšãããŠããã ããããšæããŸãã ã¹ã«ãŒããã åäžãšãªãœãŒã¹æé©å ãããåŠç ã¯éåžžåŠçè² è·ãé«ããããµãŒããŒã®CPUãã¡ã¢ãªãªã©ã®ãªãœãŒã¹æ¶è²»ãé«ããªãåŸåã«ãªããŸããç¡éã«ãªãœãŒã¹ãå©çšã§ããã°è¯ãã§ãããéåžžã¯ã³ã¹ãå¶çŽãååšããããå©çšã§ãããªãœãŒã¹ã«ãå¶çŽãçãŸããŸããããã§åŠçæéãšãªãœãŒã¹ã®å¶çŽæ¡ä»¶ã«åºã¥ã ãããåŠç ã®ããã©ãŒãã³ã¹ããã¥ãŒãã³ã°ããå¿
èŠããããŸãããããã ãããåŠç ã®äºäŸãšããŠã以äžã®åŠçãèããŸãã ããŒã¿ããŒã¹ ããããŒã¿ãèªã¿åã ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¡ã¢ãªã§ããŒã¿ãå å·¥åŠçãã ããŒã¿ããŒã¹ãžå å·¥åŠçããããŒã¿ãæ¿å
¥ãã äžèšã®å Žåã«ãããŒã¿ããŒã¹ã®ã¬ã³ãŒã1ä»¶ããšã«Read/Writeã¯ãšãªãèµ°ããããšã倧éã®ããŒã¿éãæ±ãå Žåã«åŠçæéã®èŽåœçãªé
å»¶ãæããŸãããã®ããéåžžã¯ãããæ°ãèšå®ãäžå®ä»¶æ°ããšã«åŠçãè¡ããŸãããããæ°ã倧ããèšå®ããå Žåã¯äžåºŠã«ã€ã³ã¡ã¢ãªã§åŠçã§ããä»¶æ°ãå¢å ããããããŒã¿ããŒã¹ãšã®IOãåæžã§ãåŠçã® ã¹ã«ãŒããã ãåäžããŸãããã¡ã¢ãªã®ãªãœãŒã¹æ¶è²»ã倧ãããªããŸãã ãããåŠç ã®åŠçæéãšã¡ã¢ãªã®ãªãœãŒã¹å¶çŽãéã¿æé©ãªãããæ°ãèšå®ããŠããå¿
èŠããããŸãã ãŸãšã ãããåŠç ã®äžé£ã®æè¡çãªæ¹åã«ãããŠä»¥äžã®åŠã³ãåŸãŸããã äžè¬ç㪠ã·ã¹ãã éçº ã«ãã㊠ãã©ã³ã¶ã¯ã·ã§ã³ ã®ç¯å²ã¯æå°éã«éå®ããå¿
èŠããããä»åã®äºäŸã®ããã«ã¬ã³ãŒãã«åºç¯å²ã®ããã¯ããšãããå¯èœæ§ãããããªã³ã©ã€ã³åŠçãžåœ±é¿ãäžããã ãããåŠç å
šäœã«ããã ãã©ã³ã¶ã¯ã·ã§ã³ ã廿¢ããçµæã ãããåŠç å
šäœã®ååæ§ãæ
ä¿ãããªããªã£ããååæ§ãæ
ä¿ãããªããªã£ãããšã«ãããäŸåå
ã®å©çšæçްç»é¢ã®è¡šç€ºã«äžè²«æ§ã®ãªãç¶æ
ãçºçãããããã§ãåŠç察象ã¬ã³ãŒãã«åŠçæžã¿ã®ç¶æ
ãæãããããšã§ ãããåŠç å
šäœã®åªçæ§ãæ
ä¿ã§ããããã«ãªã£ããçµæçã«ãåŠç倱ææã®ãªãã©ã€ã容æã«ãªãç°åžžç¶æ
ããã®å埩ãè¿
éã«è¡ããããã«ãªã£ãã ä»å㯠ãããåŠç ã«ããã ãã©ã³ã¶ã¯ã·ã§ã³ ã®æ¹ååã³åªçæ§ã®èšèšã«é¢ããŠã玹ä»ããŸãããã ãããåŠç ã«ã¯ããã§ç޹ä»ããããªãã£ãæ§ã
ãªè«ç¹ããããŸãã åãã¡ã® ãããåŠç æ¹åã®æŠãã¯ããããã ïŒå®ïŒé£èŒæã¡åã tech.timee.co.jp
åŸç·š(åªçæ§ã®èšèšå°å
¥)ãž ã¯ããã« ããã«ã¡ã¯ãã¿ã€ããŒã®ããã¯ãšã³ããšã³ãžãã¢ã®äžéã§ãã ãã Gopher ããã«äŒŒãŠããšèšãããŸãã æ¬èšäºã§ã¯ææ¬¡ã§å®è¡ããŠãããç· ããã® ãããåŠç ã«é¢ããäžé£ã®æè¡çæ¹åã«ã€ããŠæ²èŒããŸããåŒç€Ÿã®ãããã¯ããã¿ã€ããŒãã¯èããäºæ¥æé·ã«äŒŽãããŒã¿éãæ¥å¢ããŠããŠããŸããããã§ä»åã¯ããŒã¿éã®æ¥å¢ãèæ¯ãšããäžé·æç㪠ãããåŠç ã®èšèšæ¹åã«ã©ã®ããã«åãçµãã§ããã®ããã玹ä»ããããšæããŸãã ãããåŠç ã«é¢ããæè¡çæ¹åã®èšäºã¯åç·šã»åŸç·šã®2éšæ§æããšã£ãŠããŸããå線㯠ãããåŠç ã«ããã ãã©ã³ã¶ã¯ã·ã§ã³ ã®æ¹åãããŒãã«ãåŸç·šã§ã¯ ãããåŠç ã«åªçæ§ã®èšèšãå°å
¥ããããšãã玹ä»ããããšæããŸãã ä»åã¯åç·šã® ãã©ã³ã¶ã¯ã·ã§ã³ ã®æ¹åãããŒãã«ã玹ä»ããŸãããã§ã«æ¬çªçšŒåããŠããã¢ããªã±ãŒã·ã§ã³ã«ãã㊠ãã©ã³ã¶ã¯ã·ã§ã³ ã®ç¯å²ã倧ããå Žåã«ã©ã®ãããªåé¡ãçºçããã®ãããããŠã©ã解決ããŠãã£ãã®ããäžå¿ã«åãäžããŸãã èªã¿æãšããŠã¯ãä»åŸããŒã¿éã®æ¥æ¿ãªå¢å ãèŠèŸŒãŸãããããã¯ãéçºã®äžé·æçãªèšèšã»éçšã暡玢ããŠããæ¹ãæ³å®ããŠããŸãããŸãèªã¿æã«è©²åœããªãå Žåã§ããçŸåšã¿ã€ããŒãã©ã®ãããªäºæ¥ãæšé²ããŠããã®ãèå³ãæã£ãŠããããããã«èšèŒããŸããã®ã§æ¯éæåŸãŸã§ãä»ãåããã ããã ã¯ããã« ãããåŠçã«ã€ã㊠ãããåŠçæ¹åã®ãã£ãã ç· ãã®ãããåŠçãšã¯ åŒç€Ÿãšç§ã®ããŒã ãæ±ã£ãŠããé å ãç· ããã®æŠå¿µ çŸç¶ã®èª²é¡èªè 宿œããæœç ãã©ã³ã¶ã¯ã·ã§ã³A ãã©ã³ã¶ã¯ã·ã§ã³B ãã©ã³ã¶ã¯ã·ã§ã³C éæã§ããããš ãŸãšã ãããåŠç ã«ã€ã㊠ããçšåºŠã®éã®ããŒã¿ãäžæ¬ã§åŠçããããšãã ãããåŠç ããšåŒã³ãéåžžã¯æ¥æã鱿¬¡ãææ¬¡ã§å®æçã«å®è¡ãããŸãããªã³ã©ã€ã³åŠç *1 ã皌åãããã¯åæ¢ããããŸãŸ ãããåŠç ãå®è¡ãããã«ãã£ãŠã ãããåŠç ã¯æ¬¡ã®2çš®é¡ã«åããããŸãã ãªã³ã©ã€ã³ããã ãªã³ã©ã€ã³åŠçãç¶ç¶ããŠçšŒåãããç¶æ
ã§å®è¡ãã ãããåŠç ã§ãããªã³ã©ã€ã³åŠçãšåããªãœãŒã¹(äŸãã°ããŒã¿ããŒã¹)ãžã¢ã¯ã»ã¹ãçºçããå Žåã¯ãªã³ã©ã€ã³åŠçãžåœ±é¿ãäžããå¯èœæ§ããããŸãã ãªãã©ã€ã³ããã ãªã³ã©ã€ã³åŠçã忢ãããç¶æ
ã§å®è¡ãã ãããåŠç ã§ããäŸãã°ãå€éã«ã¡ã³ããã³ã¹æéãèšããããšã§ã·ã¹ãã ã®ããŠã³ã¿ã€ã ã蚱容ãå®è¡ãã ãããåŠç ãèããããŸãã ä»å説æããç· ãã® ãããåŠç ã§ã¯ãªã³ã©ã€ã³ããããåæãšããŠããŸãã ãããåŠç æ¹åã®ãã£ãã åŒç€Ÿã§ã¯æ¯æåã«ç· ãã® ãããåŠç ãå®è¡ããŠããŸããå
·äœçãªåŠçå
容ã®èª¬æã¯ä»¥éã®ããŒãã«è²ããŸãããææ¬¡ã§å®æçã«å®è¡ããããªã³ã©ã€ã³ããããæ³å®ããŠãã ãããçŽ2幎åã®èšèšåœåã¯åé¡ãªã皌åããŠããŸãããããããã¯ããæé·ããã«ã€ããŠãããã®åŠçæéãé·æåããŠããŸãããåŠçæéãé·æåããã«ã€ããŠããããŸã§èŠããŠããªãã£ãåé¡ãèµ·ããããã«ãªããŸããããã®åé¡ãšã¯ãªã³ã©ã€ã³åŠçã«ãããLockWaitTimeoutãšã©ãŒã®çºçã§ããå®ã¯æ¹ååã® ãããåŠç ã§ã¯åŠçå
šäœã§ ãã©ã³ã¶ã¯ã·ã§ã³ ã貌ãå®è¡ããŠããããã ãããåŠç ã§äœæãããã¬ã³ãŒããŸãã¯å€éšããŒå¶çŽã«ãããŠå€ãç»é²ãããŠãã芪ããŒãã«ã®ã¬ã³ãŒãã«ãããŠå æã»å
±æããã¯ãè¡ãããŠããŸãããã¬ã³ãŒãã«ããã¯ããšãããŠããå Žåã ãã©ã³ã¶ã¯ã·ã§ã³ ãã³ãããããããŸã§ã®éã«ãä»ã®åŠçããããã¯ãããŠããã¬ã³ãŒãã«å¯ŸããŠã®èªã¿æžãã«åŠçåŸ
ã¡ãçºçããå ŽåããããŸãã ãããåŠç ã®ããã¯ããšãããæéãé·æåããçµæããªã³ã©ã€ã³åŠçã§LockWaitTimeoutãšã©ãŒãçºçããŠãŒã¶ãŒã«500ãšã©ãŒãè¿ãäºæ
ãçºçããŸããã ãã®åé¡ãã©ã®ãããªããã»ã¹ãçµãŠæ¹åããŠãã£ãã®ãããŸãåŒç€Ÿã®ç· ãã® ãããåŠç ã«é¢ãã説æãããäžã§ã玹ä»ããŸãã ç· ãã® ãããåŠç ãšã¯ åŒç€Ÿãšç§ã®ããŒã ãæ±ã£ãŠããé å ç· ãã® ãããåŠç ãåŒç€Ÿã§ã©ãæ¹åããŠããã®ã説æããåã«ãäºåç¥èãšããŠåŒç€Ÿåã³ãç· ããã®æŠå¿µã«é¢ããŠç°¡åã«ã玹ä»ããŸãã åŒç€Ÿã§éçºããŠãããããã¯ããã¿ã€ããŒãã¯ãåãããæéããšãåããŠã»ããæéãããããã³ã°ããã¹ãããã€ããµãŒãã¹ã§ããç§ã®ããŒã ã§ã¯å³1ã°ã¬ãŒéšåã®äŒæ¥ã»ã¯ã©ã€ã¢ã³ãã«å¯Ÿãæ±äººãåæ»ã«æ²èŒããããã®æ©èœãäž»ã«éçºããŠããŸãã çšèªèª¬æ ã¯ã©ã€ã¢ã³ã ïŒã¿ã€ããŒäžã«æ±äººãæ²èŒããäž»äœãã¯ã©ã€ã¢ã³ãã®ç®¡çç»é¢ã§ã¯ã¯ãŒã«ãŒç®¡çãåºéå€ç®¡çãªã©ã®æ©èœãæäŸããŠããã äŒæ¥ ïŒã¯ã©ã€ã¢ã³ããã¿ã€ããŒãå©çšããéã«çºçããè«æ±ã管çããäž»äœãæ³äººåäœã§ããããšãå€ããäŒæ¥ã¯è€æ°ã®ã¯ã©ã€ã¢ã³ããæã€ãäŒæ¥ç®¡çç»é¢ã§ã¯è«æ±æžãå©çšæçްé²èŠ§ã®æ©èœãæäŸããŠããã åããŒã ãæ±ã£ãŠããé åã®èª¬æ ãç· ããã®æŠå¿µ ã¿ã€ããŒã§åããã¯ãŒã«ãŒã®çµŠæã¯ã¿ã€ããŒãç«æ¿æããè¡ãªã£ãŠããŸãããã®ããæ¯ææåã®ç¹å®ã®æç¹ã§å
æåã®çµŠæããã³ã¿ã€ããŒã®ãµãŒãã¹å©çšæã確å®ããäŒæ¥ã«è«æ±ãè¡ã£ãŠããŸãããã®æ¯ææåã§è«æ±ã確å®ãããè¡çºããç· ãããšåŒã³ãŸãã ããã§ã¯ãã詳现ã«ãç· ããã§ã©ã®ãããªåŠçãè¡ãªã£ãŠããã®ãã説æããŸããã¯ãŒã«ãŒã®çšŒåã«ããå ±é
¬ã確å®ããæ®µéã§ãè«æ±ããŒãã«ãã«ã¬ã³ãŒããäœæã管çããŠããŸããæ¯ææåã®ãç· ããã® ãããåŠç ã«ããããè«æ±ããŒãã«ãã®ã¬ã³ãŒããã確å®è«æ±ããŒãã«ãã«è€è£œããããšã§äŒæ¥ãžã®è«æ±ã確å®ãããŠãããŸããç°¡åã«èª¬æãããšãç· ãã® ãããåŠç ã¯æåæç¹ã®è«æ±ããŒãã«ã®ã¹ãããã·ã§ãããæ®ãè¡çºã§ãããšæããŠãã ããã ãŸãäŒæ¥ã®å©çšæçްç»é¢ã§ã¯ç¿æã®è«æ±äºå®é¡åã³æããšã«ç¢ºå®ããè«æ±é¡ãé²èЧããæ©èœãæäŸããŠããŸããç¿æã®è«æ±äºå®é¡ã¯ç· ãåŠçãè¡ãããŠããªããè«æ±ããŒãã«ãã®ã¬ã³ãŒããåç
§ããŠããã確å®ããæã®è«æ±é¡ã¯ã確å®è«æ±ããŒãã«ããåç
§ããŠããŸãã è«æ±é¢é£ããŒãã«ãšå©çšæçްç»é¢ãšã®äŸåé¢ä¿ çŸç¶ã®èª²é¡èªè ç· ãã®åŠç察象ã§ããè«æ±ããŒãã«ã®ç¹åŸŽãšããŠãã¿ã€ããŒã®äºæ¥æé·ã«äŒŽãæ¥æ¿ã«ããŒã¿éãå¢ããŠããããšãæããããŸããç· ãã® ãããåŠç ãå®è£
ãããçŽ2幎åããæ¯èŒãããšææ¬¡ã§åŠçãã¹ãããŒã¿éã20åè¿ãã«ãªã£ãŠããããšãåãããŸãã *2 è«æ±ããŒãã«ã®ããŒã¿éæšç§» 2幎åã® ãããåŠç èšèšåœåã¯ããŒã¿éãå°ãªãã£ãããšãããã ãããåŠç å
šäœã« ãã©ã³ã¶ã¯ã·ã§ã³ ãé©çšããŠããŸãããå©çšæçްç»é¢ã®è¡šç€ºãç· ãåŠçã«ããäœæããã確å®è«æ±ããŒãã«ã«äŸåããŠãããã(å³ãè«æ±é¢é£ããŒãã«ãšå©çšæçްç»é¢ãšã®äŸåé¢ä¿ããåç
§)ã ãã©ã³ã¶ã¯ã·ã§ã³ ã®æ§è³ªãå©çšããããšã«ããæ¬¡ã®ïŒã€ã®ç¶æ
ãæ
ä¿ããŠããŸããã 確å®è«æ±ã¬ã³ãŒããå
šãŠäœæãããç¶æ
ãã©ã³ã¶ã¯ã·ã§ã³ ãæåããå Žåã«é·ç§»ããç¶æ
ã ãã®ç¶æ
ã«é·ç§»ããæã«ç¿æã®è«æ±äºå®é¡åã³ç· ãã«ãã確å®ããæã®è«æ±éé¡ã®å©çšæçްç»é¢ã®è¡šç€ºãäžæã«æŽæ°ããã 確å®è«æ±ã¬ã³ãŒãã1ã€ãäœæãããŠããªãç¶æ
åŠçéå§åãŸã㯠ãããåŠç ã倱æããå Žåã«é·ç§»ããç¶æ
ã ãããåŠç ãéäžã§å€±æããå Žåã« ãã©ã³ã¶ã¯ã·ã§ã³ ã® ããŒã«ãã㯠ã«ããåŠçéå§åã®ç¶æ
ã«æ»ããŸããç¿æã®è«æ±äºå®é¡åã³ç· ãã«ãã確å®ããæã®è«æ±é¡ã®å©çšæçްç»é¢ã®è¡šç€ºã¯ ãããåŠç å®è¡åã®ãŸãŸãšãªãã ãã®ããã« ãã©ã³ã¶ã¯ã·ã§ã³ ã«ãããååæ§ã®ç¹æ§ãå©çšããããšã§ã ãããåŠç ã倱æããå Žåã§ãåŠçéäžãŸã§ã®ç¢ºå®è«æ±ã¬ã³ãŒããäžéå端ã«äœæãããç¶æ
ã¯ååšããŸããããã®ããã確å®è«æ±ããŒãã«ã«äŸåããŠããå©çšæçްç»é¢ã®è¡šç€ºäžã®éé¡ãäžã®2ã€ã®ç¶æ
ããåãããªãããšã«ãªããŸãã ãããŸã§ ãããåŠç å
šäœã«ããã ãã©ã³ã¶ã¯ã·ã§ã³ 貌ãããšã§äžèšã®ãããªæ©æµãåããŠããŸããããæ¬¡ã®ãããªèª²é¡ãåºãŠããŸããã ãããåŠç ã®åœ±é¿ã«ãããªã³ã©ã€ã³åŠçã®ãšã©ãŒçºç ã¿ã€ããŒã¯çŸåšã¢ããªã·ãã¯ãªãµãŒãã¹ã®ããããªã³ã©ã€ã³ãããã§åŠçãå®è¡ãããšãªã³ã©ã€ã³åŠçãšåãããŒã¿ããŒã¹ã«å¯Ÿã ãã©ã³ã¶ã¯ã·ã§ã³ åŠçãè¡ãããšã«ãªããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ ã¯ãä»ã® ãã©ã³ã¶ã¯ã·ã§ã³ åŠçã®åœ±é¿ãåããªãããã«ããããã¬ã³ãŒããŸãã¯ããŒãã«ã«å¯ŸããŠããã¯ããšãããšããããŸããã¬ã³ãŒãã«å¯ŸããŠããã¯ãåãããå Žåã«ä»ã® ãã©ã³ã¶ã¯ã·ã§ã³ ããã®ã¬ã³ãŒãã«å¯ŸããæŽæ°ç³»ã®åŠçã¯åæ¢ãåŸ
ããããç¶æ³ãçºçããŸããäžå®æéããã¯ç¶æ
ãç¶ç¶ãããã¯ãè§£æŸãããªãå Žåã«LockWaitTimeoutãšã©ãŒãçºçãåŠçã倱æããŸãããã®LockWaitTimeoutãšã©ãŒãçºçãããšããŠãŒã¶ãŒãæå³ããåŠçãå®è¡ãããªãã°ãããããšã©ãŒçºçãŸã§ãŠãŒã¶ãŒã¯åŠçãåŸ
ããããŠããããšãèªç¥ã§ããªãããæå³ããªã誀æäœãè¡ããããŸããã ãããåŠç 倱ææã®åŠçå®äºæéã®é
å»¶ ãããåŠç ãéçšããŠãããšæ§ã
ãªèŠå ã«ããåŠçãç°åžžçµäºããŸããäŸãã°ãããŒã¿éã®å¢å ã«äŒŽãã³ã³ããã®ã¡ã¢ãªéãäžè¶³ãåŠçã倱æããåé¡ãè«æ±ããŒãã«ã®ããŒã¿ã«ç°åžžãªããŒã¿ãæ··åšããŠãããªã©ã§ããåŠçã倱æããå Žåã« ãã©ã³ã¶ã¯ã·ã§ã³ ã® ããŒã«ãã㯠ã«ããç· ãéå§åã®ç¶æ
ã«æ»ããããåŠçã倱æããåå ãç¹å®åŸã«ååºŠç· ãã®éå§ããåŠçãåéããå¿
èŠããããŸãããçµæçã«ç· ããå®äºãŸã§ã®æéãé·æåãäŒæ¥ãžã®è«æ±ç¢ºå®ã¡ãŒã«ãé
å»¶ããããšã課é¡ãšããŠãããŸããã 宿œããæœç ãã©ã³ã¶ã¯ã·ã§ã³ ã®ç¯å²ã ãããåŠç å
šäœããæå°éã®ç¯å²ã«éå®ããŸããã ã§ã¯ãæå°éã®ç¯å²ãšã¯ã©ãè©äŸ¡ãã¹ãã§ããããã ãã©ã³ã¶ã¯ã·ã§ã³ ã¯ã¢ããªã±ãŒã·ã§ã³ããèŠãŠäžè²«ããç¶æ
ããæ¬¡ã®äžè²«ããç¶æ
ãžé·ç§»ãããäœçšãšã¿ãªãããšãã§ããŸããããã§èšåããæå°éã®ç¯å²ãšã¯ãäžè²«ããç¶æ
ããæ¬¡ã®äžè²«ããç¶æ
ãžãšé·ç§»ããã ãã©ã³ã¶ã¯ã·ã§ã³ ã®ãã¡æå°ã®åŠçãæã€ ãã©ã³ã¶ã¯ã·ã§ã³ ã®é©çšç¯å²ãæããŸãã èšèã§å®çŸ©ãããšãããã«ãããããæ¬¡ã®äºäŸãèããŸãã è«æ±ã¬ã³ãŒãã«å¯Ÿå¿ãã確å®è«æ±ã¬ã³ãŒãã®äœæ 確å®è«æ±ã¬ã³ãŒããäœæãå®äºããå Žåã«åŠçæžã¿ã®è«æ±ã¬ã³ãŒãã管çããããã®åŠçæžã¿ãã©ã°ãæŽæ° äžèš1, 2ã®åŠçãç· ã察象æã®è«æ±ã¬ã³ãŒãã«å¯Ÿã鿬¡çã«åŠçããŠãããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ ã®æå°éã®ç¯å²ãèããã«ãããæ¬¡ã®3ã€ã® ãã©ã³ã¶ã¯ã·ã§ã³ (A, B, C)ãäŸã«èããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ A ãŸãåãã«ç¶æ
aããç¶æ
bãžã® ãã©ã³ã¶ã¯ã·ã§ã³ ã«ããé·ç§»ãèããŸããããã¯ä»ãŸã§ç· ãã® ãããåŠç ã§æ±ã£ãŠãããã¿ãŒã³ã§ããa, bã®ç¶æ
ã¯ã¢ããªã±ãŒã·ã§ã³äžèš±å®¹ãããç¶æ
ã®ããäžè²«ããç¶æ
ã§ãããšèšãããã§ãããã ããç· ãåŠçå
šäœã®åŠçã§ããããæå°ã®åŠçãæã€ ãã©ã³ã¶ã¯ã·ã§ã³ ãšã¯å¿
ãããèšããªããã§ãã ç¶æ
a: ç· ã察象æã®ç¢ºå®è«æ±ããŒãã«ã®ã¬ã³ãŒãã1ã€ãäœæãããŠããªãç¶æ
ç¶æ
b: ç· ã察象æã®ç¢ºå®è«æ±ããŒãã«ã®ã¬ã³ãŒããå
šãŠäœæããè«æ±ã¬ã³ãŒããå
šãŠåŠçæžã¿ã«æŽæ°ãããŠããç¶æ
ãã©ã³ã¶ã¯ã·ã§ã³ Aã«ããç¶æ
é·ç§» ãã©ã³ã¶ã¯ã·ã§ã³ B 次ã«ãç¶æ
cããç¶æ
dãžã® ãã©ã³ã¶ã¯ã·ã§ã³ ã«ããé·ç§»ãèããŸããc, dã®ç¶æ
ã¯ç¢ºå®è«æ±ã¬ã³ãŒãã®äœæãšè«æ±ã¬ã³ãŒãã®åŠçæžã¿ãã©ã°ã®æŽæ°ãäž¡æ¹ãšãå®è¡ãããŠãããã¢ããªã±ãŒã·ã§ã³äžèš±å®¹ãããç¶æ
ã§ãããã®ããc, dã¯å
±ã«äžè²«ããç¶æ
ã§ãããšèšãããã§ããããã«æå°ã®åŠçãæã€ ãã©ã³ã¶ã¯ã·ã§ã³ ã¯ååšããã®ã§ããããã ç¶æ
c: ããè«æ±ã¬ã³ãŒãã«å¯Ÿå¿ãã確å®è«æ±ã¬ã³ãŒããäœæãããŠããªãããã€è«æ±ã¬ã³ãŒããåŠçæžã¿ã«æŽæ°ãããŠããªãç¶æ
ç¶æ
d: ããè«æ±ã¬ã³ãŒãã«å¯Ÿå¿ãã確å®è«æ±ã¬ã³ãŒããäœæããããã€è«æ±ã¬ã³ãŒããåŠçæžã¿ã«æŽæ°ãããç¶æ
ãã©ã³ã¶ã¯ã·ã§ã³ Bã«ããç¶æ
é·ç§» ãã©ã³ã¶ã¯ã·ã§ã³ C æåŸã«ç¶æ
eããç¶æ
fãžã® ãã©ã³ã¶ã¯ã·ã§ã³ ã«ããé·ç§»ãèããŸããããã ãã©ã³ã¶ã¯ã·ã§ã³ ã«ããæå°ã®åŠçãšèšãããã§ããããããåæãšããŠç¢ºå®è«æ±ã¬ã³ãŒãã®äœæãšåŠçæžã¿ã®ãã©ã°æŽæ°ã¯äž¡æ¹ãšãåŠçãæåãããããããã¯äž¡æ¹ãšãåŠçã倱æãã¹ããã®ç¶æ
ãæ
ä¿ãããå¿
èŠãããã確å®è«æ±ã¬ã³ãŒãã®äœæã®ã¿ãåŠçãããŠããç¶æ
fã¯ã¢ããªã±ãŒã·ã§ã³äžèš±å®¹ãããŸãããããã¯äžè²«ããç¶æ
ãžã®é·ç§»ãšã¯èšããªããã§ãã ç¶æ
e: è«æ±ã¬ã³ãŒãã«å¯Ÿå¿ãã確å®è«æ±ããŒãã«ã®ã¬ã³ãŒããäœæãããŠããªãç¶æ
ç¶æ
f: è«æ±ã¬ã³ãŒãã«å¯Ÿå¿ãã確å®è«æ±ããŒãã«ã®ã¬ã³ãŒããäœæããããè«æ±ã¬ã³ãŒãã®åŠçæžã¿ã®ãã©ã°ãæŽæ°ãããŠããªãç¶æ
ãã©ã³ã¶ã¯ã·ã§ã³ Cã«ããç¶æ
é·ç§» äžã®3ã€ã®ã±ãŒã¹ããäžè²«ããç¶æ
ããæ¬¡ã®äžè²«ããç¶æ
ãžã®æå°éã®åŠçãæã€ ãã©ã³ã¶ã¯ã·ã§ã³ åŠçã¯ã ãã©ã³ã¶ã¯ã·ã§ã³ BãšãªããŸãããã®ããã«ããŠãç· ãã® ãããåŠç ã«å¯ŸããŠæå°éã® ãã©ã³ã¶ã¯ã·ã§ã³ ç¯å²ãéå®ã倿ŽããŠãããŸããã éæã§ããããš ãããŸã§1床ã®ç· ãã® ãããåŠç ã«å¯ŸããŠLockWaitTimeoutãšã©ãŒã20 ~ 30ä»¶è¿ã芳枬ããŠããŸãããã ãã©ã³ã¶ã¯ã·ã§ã³ ã®ç¯å²ãæå°éã«éå®ããããšã§0ä»¶ã«ãŸã§æå¶ããããšãã§ããŸããããããã ãããåŠç å
šäœã«ããã ãã©ã³ã¶ã¯ã·ã§ã³ ã廿¢ãããã ãããåŠç å
šäœã«ãããååæ§ãæ
ä¿ãããªããªããŸãããååæ§ãæ
ä¿ãããªããªã£ãããšã«ãããè«æ±ããŒãã«åã³ç¢ºå®è«æ±ããŒãã«ã«äŸåããŠããå©çšæçްç»é¢ã®è¡šç€ºã«åé¡ãçºçããŸãããã©ã®ãããªåé¡ãçºçããã©ã解決ããŠãã£ãã®ãåŸç·šã§è©³çްããŸãšããŠããŸãã®ã§ãæ¯éåŸç·šãã芧ãã ããã ãŸãšã ããŒã¿éã®å¢å ãèŠèŸŒãŸããã·ã¹ãã ã§ã¯ãããã«éããäžè¬ç㪠ã·ã¹ãã éçº ã«ãã㊠ãã©ã³ã¶ã¯ã·ã§ã³ ã®ç¯å²ã¯æå°éã«éå®ããå¿
èŠããããŸããä»åã®äºäŸã®ããã«ã¬ã³ãŒãã«åºç¯å²ã®ããã¯ããšãããå¯èœæ§ãããåŠçã®é
å»¶ãæãããšããããŸãã åŸç·š(åªçæ§ã®èšèšå°å
¥)ãž *1 : ãããåŠç ãšã¯å¯Ÿç
§çã«ãŠãŒã¶ãŒããã®ãªã¯ ãšã¹ ãã«å¿ããŠé次åŠçãå®è¡ã峿çã«ã¬ã¹ãã³ã¹ãè¿ãåŠçããªã³ã©ã€ã³åŠçãšåŒã³ãŸãã *2 : 瞊軞㯠ãããåŠç ãå°å
¥ãããåœåïŒ2020/4ïŒã®ææ¬¡ããŒã¿éã1ãšãããšãã®åçã衚ããŠããŸã