
- TOP
- ã¿ã°äžèЧ
- Android
Android
ã€ãã³ã

ãã¬ãžã³
æè¡ããã°
Webãã¢ããªã±ãŒã·ã§ã³éçºã«ãããŠãã¢ã¯ã»ã·ããªãã£ããããŠãŒã¶ãŒè£å©ããšããèšèãèããšãçããã¯ã©ãæããã§ããããããéèŠã ãšã¯ããã£ãŠããããã©ãéçºã³ã¹ãããããããäžéšã®ãŠãŒã¶ãŒã®ããã®ç¹å¥ãªå¯Ÿå¿ããšãã£ãã€ã¡ãŒãžãæã€æ¹ãå°ãªããªããããããŸããã ããããæè¡çãªèгç¹ããã¢ã¯ã»ã·ããªãã£ã®æ§é ãçŽè§£ããšãããã«ã¯ãšã³ãžãã¢ã«ãšã£ãŠãåççã§ãçŸããã¢ãŒããã¯ãã£ãååšããŸãã çµè«ããèšããšãã¢ã¯ã»ã·ããªãã£å¯Ÿå¿ãšã¯ããŠãŒã¶ãŒã®ããã®ç¹å¥ãªUIããŒãããäœããããšã§ã¯ãããŸããã ããŠãŒã¶ãŒãå©çšããŠããç°å¢ïŒOSããã©ãŠã¶ãªã©ïŒããšãã¢ããªã±ãŒã·ã§ã³ããæ£ããããŒã¿ã飿ºããæ©ã¿å¯ãããšã§åããŠæç«ããä»çµã¿ ãªã®ã§ãã ä»åã¯ãã¢ã¯ã»ã·ããªãã£ã®ã¯ããã®äžæ©ãšããŠãç°å¢ãšã¢ããªã®æ¡æãã«ã€ããŠè§£èª¬ããŸãã ãŠãŒã¶ãŒãæ¯ãã匷åãªæŠåšïŒãç°å¢ãã®æ¯æŽæè¡ ã¢ã¯ã»ã·ããªãã£ãèããäžã§å€§åæãšãªãã®ããããžã¿ã«ç°å¢ãžã®ã¢ã¯ã»ã¹ãæ¯ããä»çµã¿ã®å€§åã¯ãç°å¢åŽãã«ãã§ã«çšæãããŠããããšããããšã§ãã çŸä»£ã®OSïŒiOSãAndroidãWindowsãmacOSïŒãWebãã©ãŠã¶ã«ã¯ããŠãŒã¶ãŒã®å€æ§ãªç¹æ§ïŒèŠèŠãèŽèŠãéåæ©èœãèªç¥ãªã©ïŒãè£å©ããé«åºŠãªæ©èœãæšæºæèŒãããŠããŸãããããã¯å€§ãã2ã€ã®ã¬ã€ã€ãŒã«åããããŸãã ãŠãŒã¶ãŒãšãŒãžã§ã³ãïŒãã©ãŠã¶ãªã©ïŒïŒ ãºãŒã ãæåãµã€ãºãžã®å¯Ÿå¿ãããŒããŒãæäœãªã©ã衚瀺ãæäœã調æŽããæ©èœã æ¯æŽæè¡ïŒAssistive TechnologyïŒïŒ ã¹ã¯ãªãŒã³ãªãŒããŒïŒVoiceOver / TalkBack çïŒãã¹ã€ããã³ã³ãããŒã«ãªã©ãOSã®APIãéããŠããã€ã¹ã®æäœãçŽæ¥çã«è£å©ããæ©èœã ãŠãŒã¶ãŒã¯èªèº«ã®ç¶æ³ã«åãããŠããããã®æ©èœãONã«ãããèšå®ã調æŽãããããŠãWebã«ã¢ã¯ã»ã¹ããŠããŸããã€ãŸãããŠãŒã¶ãŒããå·®ãåºããããæ¡æã®ããã®æãã¯ããã§ã«ç°å¢åŽã«çšæãããŠããã®ã§ãã ãã ããã¢ã¯ã»ã·ããªãã£ã®ãã¹ãŠãç°å¢åŽãèªåã§æ
ã£ãŠãããããã§ã¯ãããŸãããã¢ããªã±ãŒã·ã§ã³èªèº«ããååãªã³ã³ãã©ã¹ãã®ç¢ºä¿ããã©ãŒã«ã¹é åºã®ç®¡çãé©åãªèŠåºãæ§é ãªã©ã責任ãæã£ãŠèšèšããç°å¢åŽãšæ£ããé£åããå¿
èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³åŽã®åœ¹å²ïŒæ
å ±ã®ãªã¬ãŒã𿡿 ãŠãŒã¶ãŒãã¹ã¯ãªãŒã³ãªãŒããŒãONã«ããŠããã°ãã©ããªWebãµã€ãã§ãå®ç§ã«é³å£°ã§æäœã§ããã®ã§ããããïŒ çãã¯ãNoãã§ãã ã©ããªã«ç°å¢åŽïŒãã©ãŠã¶ãæ¯æŽæè¡ïŒãåªç§ã§ããã¢ããªã±ãŒã·ã§ã³åŽããä»ãç»é¢ã«äœã衚瀺ãããŠããŠãã©ã®ãã¿ã³ãæŒããã®ãããšããæå³æ
å ±ïŒã»ãã³ãã£ã¯ã¹ïŒãäŒããŠããªããã°ãæ¯æŽæè¡ã¯æ£ããæ©èœããŸããã Webã®äžçã§ã¯ãæžããã³ãŒãã¯ä»¥äžã®ããã«æ
å ±ãäŒéããŠãŠãŒã¶ãŒã«å±ããŸãã 1. Webã¢ã㪠(HTML / CSS / JavaScript)    â 2. ãã©ãŠã¶ (ãŠãŒã¶ãŒãšãŒãžã§ã³ã) â»DOMããªãŒãšåæã«ãã¢ã¯ã»ã·ããªãã£ããªãŒããæ§ç¯ Â Â Â â 3. OSã®ã¢ã¯ã»ã·ããªãã£API    â 4. æ¯æŽæè¡ (ã¹ã¯ãªãŒã³ãªãŒããŒãªã©)    â 5. ãŠãŒã¶ãŒ ãã©ãŠã¶ã¯ç»é¢ãæç»ããDOMããªãŒãšã¯å¥ã«ãæ¯æŽæè¡åãã®è£åŽã®ããŒã¿æ§é ã§ãããã¢ã¯ã»ã·ããªãã£ããªãŒããçæããŸããïŒâ»Chrome DevToolsã®ãAccessibilityïŒãŠãŒã¶ãŒè£å©ïŒãã¿ããªã©ã§å®éã«ç¢ºèªããããšãã§ããŸãïŒã HTMLã¯ããã®ã¢ã¯ã»ã·ããªãã£ããªãŒãæ£ããæ§ç¯ããããã®ãæç€ºæžããªã®ã§ãããã®ãªã¬ãŒãéåãããããç°å¢ãšæ£ããæ¥ç¶ïŒæ¡æïŒããããšãããããšã³ãžãã¢ã®åœ¹å²ã§ãã Microsoftãµã€ãã®ã¢ã¯ã»ã·ããªãã£ããªãŒ Webããã³ããšã³ãã«ããããæ©ã¿å¯ããã®å
·äœäŸ å
·äœçã«ãç°å¢ã𿡿ããããšã¯ã©ãããããšããå®åã§ãããã¡ãªã¢ã³ããã¿ãŒã³ãšæ¹åäŸãèŠãŠã¿ãŸãããã 1. é©åãªHTMLã¿ã°ã䜿ãïŒã»ãã³ãã£ã¯ã¹ã®äŒéïŒ NGïŒ <div onClick={submit}>éä¿¡</div> èŠèŠçã«ã¯ãã¿ã³ã«èŠããŠãããã©ãŠã¶ã«ã¯ãbuttonãšããŠã®åœ¹å²ïŒRoleïŒããäŒãããŸããããã®çµæãã¹ã¯ãªãŒã³ãªãŒããŒã§ãã¿ã³ãšããŠèªèãããªãã ãã§ãªããTabããŒã«ããããã©ãŒã«ã¹ç§»åãããEnter/SpaceããŒã«ãããæšæºçãªããŒããŒãæäœããäžå¯èœã«ãªããŸãã OKïŒ <button onClick={submit}>éä¿¡</button> <button>ã¿ã°ã䜿ãããšã§ããã©ãŠã¶ãæã€æšæºçãªã»ãã³ãã£ã¯ã¹ãšããŒããŒãæäœã¢ãã«ãå©çšã§ããç°å¢ãšã®æ¡æãã¹ã ãŒãºã«æç«ããŸãã 2. ãã©ãŒã ã®å
¥åæ¬ã«ã©ãã«ãçŽä»ããïŒé¢ä¿æ§ã®äŒéïŒ NGïŒ <span>ãååïŒ</span><input type="text" /> èŠèŠçã«ã¯ãååã®å
¥åæ¬ãã§ãããæ¯æŽæè¡ãå
¥åæ¬ã«ãã©ãŒã«ã¹ããéãåã«ãããã¹ããç·šéããã¹ãããšããèªã¿äžãããããäœãå
¥åãã¹ããåãããŸããã OKïŒ <label for="name">ãååïŒ</label><input type="text" id="name" /> <label> ã® for 屿§ãš <input> ã® id ãçŽä»ããããšã§ãããã¯ãååã®å
¥åæ¬ã ããšæç¢ºã«äŒãããŸããããã«ãã©ãã«ã®æåãã¯ãªãã¯ããŠãå
¥åæ¬ã«ãã©ãŒã«ã¹ãåœããããã«ãªããããŠã¹ãŠãŒã¶ãŒã®æäœæ§ãåäžããŸãã 3. ã¢ã€ã³ã³ãã¿ã³ã«æå³ãæãããïŒãã ãARIAã¯èšç»çã«ïŒ NGïŒ <button><img src="search-icon.png" /></button> æ¯æŽæè¡ã¯äœã®ãã¿ã³ãå€å®ã§ããŸããã OKïŒ <button aria-label="æ€çŽ¢"><img src="search-icon.png" alt="" /></button> aria-label ãªã©ãä»äžããããšã§ãæ
å ±ãè£ãããšãã§ããŸãã ãæ³šæã ãã ããW3Cã«ã¯ãARIAã®ç¬¬äžååïŒThe First Rule of ARIA UseïŒããšãããã®ããããŸããããã¯ãæšæºHTMLã§è¡šçŸã§ããå Žåã¯ããŸãæšæºHTMLã䜿ãããšããã«ãŒã«ã§ããARIAã¯äžèœè¬ã§ã¯ãªãã誀çšãããšæ¯æŽæè¡ãæ··ä¹±ãããããããããŸã§HTMLã®è£å©ãšããŠå©çšããŸãããã 4. ãã©ãŒã«ã¹ãèŠããããã«ããïŒããŒããŒãæäœã®æ
ä¿ïŒ NGïŒ *:focus { outline: none; } ãã¶ã€ã³äžã®çç±ã§ãã©ãŒã«ã¹ãªã³ã°ïŒæ ç·ïŒãæ¶ããŠããŸããšãããŠã¹ã䜿ããããŒããŒãã§æäœããŠãããŠãŒã¶ãŒã¯ãä»ãç»é¢ã®ã©ãã«ããã®ãããå
šãåãããªããªããŸãã OKïŒ :focus-visible æ¬äŒŒã¯ã©ã¹ãªã©ã掻çšããããŒããŒãæäœæã®ã¿ãã©ãŒã«ã¹ãªã³ã°ã衚瀺ããããã¹ã¿ã€ãªã³ã°ãããç°å¢ããã®ã¢ã¯ã»ã¹çµè·¯ãèŠèŠçã«é®æããªãããšãéèŠã§ãã ãç°å¢ããšãã¢ããªãã®æ©èœããªãŒããŒã©ããããé å ããã§äžã€ãå®è·µçãªèгç¹ãä»ãå ããŸããOSããã©ãŠã¶ã®æšæºæ©èœãšãã¢ããªã±ãŒã·ã§ã³ãç¬èªã«æäŸããæ©èœã¯ã 圹å²ããªãŒããŒã©ããïŒéè€ïŒããŠããé å ãååšããŸãã äŸãã°ãèªæ²»äœã®ãµã€ããªã©ã§ããèŠããããæåãµã€ãºå€æŽïŒå€§ã»äžã»å°ïŒãã®ãã¿ã³ã§ãã æåã®æ¡å€§ã¯ãæ¬æ¥ãã©ãŠã¶ã®ãºãŒã æ©èœãOSã®èšå®ã§è¡ããŸãããããããã¹ãŠã®ãŠãŒã¶ãŒãç°å¢ã®èšå®æ¹æ³ã«ç¿çããŠããããã§ã¯ãªããããã¢ããªåŽããããŠç¬èªã®UIãæäŸããç°å¢åŽã®æ©èœããå Žåã«ãã£ãŠã¯è£å®ãããŠããã®ã§ãã ããã§èª€è§£ããŠã¯ãããªãã®ã¯ããã¢ããªåŽã§ç¬èªã«ãã¿ã³ãäœã£ããããç°å¢åŽã®èšå®ã¯ç¡èŠããŠããããšããããã§ã¯ãªãããšã§ããç¬èªã®æåæ¡å€§ãã¿ã³ãäœã£ããããšãã£ãŠããã©ãŠã¶ã®æšæºãºãŒã æ©èœã䜿ã£ãæã«ã¬ã€ã¢ãŠãã厩ããŠããŸã£ãŠã¯æ¬æ«è»¢åã§ãã éèŠãªã®ã¯ãã¢ã¯ã»ã·ããªãã£æ©èœã远å ããããšä»¥äžã«ãæ¢åã®ç°å¢ã®æ©èœããå£ããªããããšããŠãŒã¶ãŒããã©ãŠã¶ã®æšæºãºãŒã æ©èœã䜿ã£ããšããŠããã¬ã€ã¢ãŠããç Žç¶»ããã³ã³ãã³ããå©çšã§ãããããªãWebæ¬æ¥ã®å
ç¢ã§ã¬ã¹ãã³ã·ããªèšèšãæ±ããããŸãã ãŸãšãïŒæ
å ±ããæšæºçãªåœ¢ãã§å
¬éããã ã¢ã¯ã»ã·ããªãã£å¯Ÿå¿ã®æ žå¿ã¯ããã¢ããªã±ãŒã·ã§ã³ãæã€æ
å ±ããOSãæ¯æŽæè¡ãçè§£ã§ããæšæºçãªåœ¢ã§å
¬éããããšãã«å°œããŸãã ãŠãŒã¶ãŒã䌞ã°ããæïŒæ¯æŽæè¡ããã©ãŠã¶ã®èšå®ïŒã«å¯ŸããŠãã¢ããªã±ãŒã·ã§ã³åŽããããã£ãããšæãæ¡ãè¿ãïŒããŒã¿ãæ£ããæž¡ãïŒããããããšã³ãžãã¢ã«ãããã¢ã¯ã»ã·ããªãã£å¯Ÿå¿ã®çé«ã§ãã ææ¥ããã®éçºã§ããã²ä»¥äžã®ãæåã®äžæ©ãã詊ããŠã¿ãŠãã ããã ããŒããŒãã ãã§æäœããŠã¿ãïŒ ããŠã¹ã眮ããTab ããŒãš Enter / Space ããŒã ãã§ãèªåãäœã£ãã¢ããªã®äž»èŠãªæ©èœã䜿ããã確èªããã ããŒã«ã§ç£æ»ããŠã¿ãïŒ Chromeã®Lighthouseããaxe DevToolsãªã©ã®ãã©ãŠã¶æ¡åŒµæ©èœã䜿ã£ãŠãèªåã®ããŒã«ã«ç°å¢ã®ã³ãŒãããã§ãã¯ããŠã¿ãã ãç°å¢ããšãã¢ããªãã®ããŒã¿é£æºãçµå®ãããšããæžããã³ãŒãã¯ãã匷åºã§ãæ¬åœã«å€ãã®äººã«å±ããœãããŠã§ã¢ã«ãªããŸãããã²ããã©ãŠã¶ãOSãšã®å¯Ÿè©±ããæèããå®è£
ãçã蟌ãã§ã¿ãŠãã ããã ã芧ããã ãããããšãããããŸãïŒ ãã®æçš¿ã¯ã圹ã«ç«ã¡ãŸãããïŒ åœ¹ã«ç«ã£ã 圹ã«ç«ããªãã£ã 0人ããã®æçš¿ã¯åœ¹ã«ç«ã£ããšèšã£ãŠããŸãã The post ã¢ã¯ã»ã·ããªãã£ã¯ãç°å¢ããšãã¢ããªãã®æ¡æã§ãã ãWebã®æ§é ããçŽè§£ããšã³ãžãã¢ã®åœ¹å²ã first appeared on SIOS Tech Lab .
ã¯ããã« # GFXBenchãšããGPUãã³ãããŒã¯ãœãããåãäžããã·ãªãŒãºã®3åç®ã§ãã ååãŸã§ã§æ°ããAndroidããŒãžã§ã³ã§å®è¡ãè¡ããŸããã ä»åããã¯å€ãAndroidããŒãžã§ã³ã§ã®å®è¡ã詊ã¿ãŠã¿ãŸãã ãœãŒã¹ã³ãŒãæºå # ååãŸã§ã®APKãã¡ã€ã«ãå€ãAndroidããŒãžã§ã³ã§å®è¡ãããšãšã©ãŒãçºçãïŒè©³çްã¯åŸè¿°ïŒãã³ãããŒã¯å®è¡äžå¯ã§ããã ãšã©ãŒåå ãããœãŒã¹ã³ãŒããä¿®æ£ããŠåé¿åºæ¥ãªããæ€èšããŠã¿ãŸãã ä¿®æ£æ¹é # ä¿®æ£æ¹éãè²ã
ããããšæããŸãããä»åã®åæãšããŠAndroid SDKããã³NDKããŒãžã§ã³ãJavaåŽã®èšå®ã¯å€æŽããªãã§é 匵ã£ãŠã¿ãäºã«ããŸããã 以äžååãŸã§ã®èšå®ãåæ²ããŸãã Path Version Description Location build-tools;35.0.0 35.0.0 Android SDK Build-Tools 35 build-tools/35.0.0 cmdline-tools;latest 16.0 Android SDK Command-line Tools (latest) cmdline-tools/latest ndk;28.0.12674087 28.0.12674087 rc2 NDK (Side by side) 28.0.12674087 ndk/28.0.12674087 platform-tools 35.0.2 Android SDK Platform-Tools platform-tools platforms;android-35 1 Android SDK Platform 35 platforms/android-35 platformBuildVersionCode='35' compileSdkVersion='35' minSdkVersion:'21' targetSdkVersion:'35' ãããèšå®ã®å
ã§ä¿®æ£æ¡ãèããŠãããŸãã å®è¡æã®ãšã©ãŒãšä¿®æ£æ¡ # æåã¯å®è¡æã®ãšã©ãŒã®çç±ãèš³ããããªãã£ãã®ã§ãããæŽçãããšä»¥äžã®3ã€ã®æ§ã§ããã AndroidããŒãžã§ã³ 8 â 7 ã®å£ commons-io ã java.nio ã«äŸåããŠããŠããã§ NoSuchMethodError ãå®è¡æã«çºçããŸããã E AndroidRuntime: Caused by: java.lang.NoSuchMethodError: No virtual method toPath()Ljava/nio/file/Path; in class Ljava/io/File; or its super classes (declaration of 'java.io.File' appears in /system/framework/core-libart.jar) E AndroidRuntime: at org.apache.commons.io.IOCase$$ExternalSyntheticApiModelOutline0.m(D8$$SyntheticClass:0) ã»ã»ã» AndroidããŒãžã§ã³ã«ãã java.nio ãµããŒãå¯åŠãåå ã§ãããããããã®ãšããã§ java.nio ã䜿ã£ãŠããªãããŒãžã§ã³ã«ããŠã¿ãŸãã Apache Commons IO ã®Dependenciesæ
å ±ãããããããŒãžã§ã³ã 2.6 ãŸã§äžããã°ããæ§ãªã®ã§ããããŠã¿ãŸãã AndroidããŒãžã§ã³ 7 â 6 ã®å£ cannot locate symbole "__fread_chk" ãšããåé¡ãå®è¡æã«çºçããŸããã W Runner : Failed to preload lib: dlopen failed: cannot locate symbol "__fread_chk" referenced by "/data/app/net.kishonti.gfxbench.v50105.corporate-1/lib/arm/libgfxbench40_gl.so"... E (Error) ã§ã¯ãªã W (Warning) 衚èšãªã®ã§æåã¯èŠéãããŠããã®ã§ããããããã¯ãªãã£ã«ã«ã§ããã ãããäœããã€ãã£ãåŽã®ã©ã€ãã©ãªããŒãžã§ã³ãäžããæ¹æ³ãããã°ãããšæãããŸããæ¢ããš ANDROID_NATIVE_API_LEVEL ãšããå®çŸ©ãèŠã€ãã£ãã®ã§ãå
ã®å€ 24 (Android7.0) ãã 21 (Android5.0) ãšäžããŠã¿ãŸãã AndroidããŒãžã§ã³ 6 â 5 ã®å£ requestPermissions() ã§ NoSuchMethodError ãå®è¡æã«çºçããŸããã E/AndroidRuntime(22812): java.lang.NoSuchMethodError: No virtual method requestPermissions([Ljava/lang/String;I)V in class Lnet/kishonti/testfw/app/MainActivity; or its super classes (declaration of 'net.kishonti.testfw.app.MainActivity' appears in /data/app/net.kishonti.testfw.app-1/base.apk) ãã®ã¡ãœãã㯠APIã¬ãã«23 (Android6.0) ãããªã®ã§ãã®ããŒãžã§ã³ããæå¹ãªèšè¿°ã«ä¿®æ£ããŸãã ä¿®æ£ # 以äžã®ä¿®æ£ããŸãšãããããã§ããAndroidçš å
¬åŒæé ãžã®ãã©ã¹å ãšãªããŸãã --> Warning 以äžã®ãããã¯çè
ã®ç°å¢ã«ãããäžäŸã§ãããé©çšã¯ èªå·±è²¬ä»» ã«ãŠãé¡ãããããŸããïŒã©ã€ã»ã³ã¹çã®è©³çŽ°ã¯ èšäºæ«å°Ÿ ã«èšèŒããŠããŸãïŒ ãªããåã
åé©çšããããã frameworks/cudaw/CMakeLists.txt ïŒCUDAããããã¹ã®èšå®ãä¿®æ£ïŒã®å
容ãå«ãŸããŠããŸãã diff --git a/app_android/benchui-lib/build.gradle b/app_android/benchui-lib/build.gradle index ceb9dbaa..534663bf 100644 --- a/app_android/benchui-lib/build.gradle +++ b/app_android/benchui-lib/build.gradle @@ -24,7 +24,7 @@ android { dependencies { implementation('com.google.code.gson:gson:2.10.1') - implementation('commons-io:commons-io:2.15.0') + implementation('commons-io:commons-io:2.6') implementation('de.greenrobot:greendao:2.1.0') implementation project(':testfw') diff --git a/frameworks/cudaw/CMakeLists.txt b/frameworks/cudaw/CMakeLists.txt index 0cc4a30e..710b4519 100644 --- a/frameworks/cudaw/CMakeLists.txt +++ b/frameworks/cudaw/CMakeLists.txt @@ -13,7 +13,9 @@ add_library(cudaw STATIC if(ANDROID) execute_process( - COMMAND cp -rL /usr/local/cuda/include ${CMAKE_CURRENT_SOURCE_DIR}/include/nvidia + COMMAND ${CMAKE_COMMAND} -E copy_directory + "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/include" + ${CMAKE_CURRENT_SOURCE_DIR}/include/nvidia RESULT_VARIABLE COPY_RESULT ) if(NOT COPY_RESULT EQUAL 0) diff --git a/frameworks/testfw/android/testfw-app/build.gradle b/frameworks/testfw/android/testfw-app/build.gradle index a4edba77..59e41cbf 100644 --- a/frameworks/testfw/android/testfw-app/build.gradle +++ b/frameworks/testfw/android/testfw-app/build.gradle @@ -45,7 +45,7 @@ android { } dependencies { - implementation("commons-io:commons-io:2.11.0") + implementation("commons-io:commons-io:2.6") implementation project(':testfw') implementation project(':platform-utils') diff --git a/frameworks/testfw/android/testfw-app/src/main/java/net/kishonti/testfw/app/MainActivity.java b/frameworks/testfw/android/testfw-app/src/main/java/net/kishonti/testfw/app/MainActivity.java index 808b4a47..89c53e1d 100644 --- a/frameworks/testfw/android/testfw-app/src/main/java/net/kishonti/testfw/app/MainActivity.java +++ b/frameworks/testfw/android/testfw-app/src/main/java/net/kishonti/testfw/app/MainActivity.java @@ -38,7 +38,9 @@ public class MainActivity extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 2); + if (android.os.Build.VERSION.SDK_INT >= 23) { + requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 2); + } mDetailView = (TextView) findViewById(R.id.detailView); mDetailView.setMovementMethod(new ScrollingMovementMethod()); diff --git a/frameworks/testfw/android/testfw-lib/build.gradle b/frameworks/testfw/android/testfw-lib/build.gradle index d0e757b1..37dc1bcf 100644 --- a/frameworks/testfw/android/testfw-lib/build.gradle +++ b/frameworks/testfw/android/testfw-lib/build.gradle @@ -27,5 +27,5 @@ android { dependencies { implementation('com.google.code.gson:gson:2.10.1') - implementation('commons-io:commons-io:2.15.0') + implementation('commons-io:commons-io:2.6') } diff --git a/scripts/build-3rdparty.sh b/scripts/build-3rdparty.sh index 26e1cce7..c72e0d73 100644 --- a/scripts/build-3rdparty.sh +++ b/scripts/build-3rdparty.sh @@ -28,7 +28,7 @@ fi : ${CONFIG?"not set"} # set default values -: ${ANDROID_NATIVE_API_LEVEL:="android-24"} +: ${ANDROID_NATIVE_API_LEVEL:="android-21"} : ${ENABLE_CLANG:="false"} : ${USE_WAYLAND:="false"} diff --git a/scripts/build.sh b/scripts/build.sh index 8e501d7a..a34fb2a7 100644 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -385,7 +385,7 @@ case $PLATFORM in fi RENDER_API=${OVERRIDE_RENDER_API:="${RENDER_API}"} COMMON_OPTS+=" -DRENDER_API=${RENDER_API}" - COMMON_OPTS+=" -DANDROID_NATIVE_API_LEVEL=24" + COMMON_OPTS+=" -DANDROID_NATIVE_API_LEVEL=21" PROJECTS="frameworks/platform-utils $PROJECTS frameworks/testfw" COMMON_OPTS+=" -DOPT_SWIG_JAVA=1 -DLIBRARY_OUTPUT_PATH_ROOT:PATH=${TFW_PACKAGE_DIR}" ãã«ãå®è¡ # å€ãAndroid端æ«ã§ãåäœããæ§ã« android-arm64-v8a android-armv7a 䞡察å¿ã®ãŠãããŒãµã«APKãšããŠãã«ãããŠã¿ãŸãã åã
åã®ç°å¢å€æ°ãèšå®ã®åŸã å
¬åŒæé ãã«ãã¹ã¯ãªãã2çš® ã®ä»£ããã«ä»¥äžã®ã¹ã¯ãªãã ãå®è¡ããŸãã ïŒç°å¢å€æ°ã®å
ã PLATFORM, CONFIG, APPLICATION_TYPE ã¯ãã®shå
ã§åèšå®ãããŸãïŒ scripts/build-multiarch-apk.sh --> Information åã
åã®Androidçšå
¬åŒæé ã«ã¯èŒã£ãŠããªãã®ã§ãããGitHub workflowæé ã§ã¯Androidçšã«ãã®ã¹ã¯ãªããã§ãã«ãããŠããæ§ã§ããããã®æåã§ãã ããã©ã«ãã ãš android-armv7a android-x86 android-arm64-v8a android-x86-64 ã®4çš®é¡åãã«ããããŸãã android-armv7a android-arm64-v8a ã®2çš®é¡ã ãã§è¯ããã°ä»¥äžã®æ§ã«å®è¡ããŸãã PLATFORMS="android-armv7a android-arm64-v8a" scripts/build-multiarch-apk.sh apkãµã€ãºãšãã«ãæéãåæžãã广ããããŸããç¹ã«ãã«ãæéã®åæžå¹æã倧ããã§ãã ãã«ããæåãããšããã«ãã®ã³ã³ãœãŒã«ãã°ã§è¡šç€ºããããã£ã¬ã¯ããªã« gfxbench-5.1.5+corporate.apk ãã¡ã€ã«ãåºæ¥äžãããŸãã ãããã« # ä»åã¯GFXBenchãå€ãAndroid端æ«çšã«ãã«ãããŠã¿ãŸããã æ¬¡åã¯å®éã«å€ãAndroid端æ«ã§å®è¡ããã³ãããŒã¯ã¹ã³ã¢ã枬ã£ãŠã¿ãŸãã ã©ã€ã»ã³ã¹ããã³å
責äºé
# æ¬èšäºã«æ²èŒããŠãããã«ãä¿®æ£ããããåŒçšããŠãããã«ãæé ã¯ãBSD 3-Clause Licenseã®ããšã§å
¬éãããŠãã Kishonti-Opensource/gfxbench ã®ãœãŒã¹ã³ãŒãããã³ããã¥ã¡ã³ãïŒ doc/gfxbench_gl_android_build.txt ïŒãå©çšã»åŒçšãããã®ã§ãã Original Copyright: (c) 2005â2025 Kishonti Ltd. License: BSD 3-Clause License ããã¥ã¡ã³ãã®æš©å©ã«ã€ããŠ: èšäºå
ã§åŒçšããŠããå
¬åŒãã«ãæé ã®ããã¹ãã®èäœæš©ã¯ãåèäœè
ã§ããKishonti Ltd.ã«åž°å±ããŸãã ãå
責äºé
ã æ¬èšäºã«æ²èŒããŠããããããæé ã¯ãç¹å®ã®æ€èšŒç°å¢ã«ãããçŸç¶ã®ãŸãŸïŒAS ISïŒã®ãã®ã§ããããã®æ£ç¢ºæ§ãå®å
šæ§ãä¿èšŒãããã®ã§ã¯ãããŸããã ãããã®é©çšããã«ãã®å®è¡ã«ããçããçŽæ¥çã»éæ¥çãªæå®³ã«ã€ããŠãçè
ããã³æ ªåŒäŒç€Ÿè±èµã¯äžåã®è²¬ä»»ãè² ããŸãããå
容ãååã«ã確èªã®äžããèªèº«ã®è²¬ä»»ã«ãããŠãå©çšãã ããã
ããã«ã¡ã¯ãã¢ãã€ã«ã¢ããªéçºéšã® Yao ã§ãã Web ãµã€ãã® URL ãšã¢ã¯ã»ã¹èªèšŒæ
å ±ãæž¡ããšããµã€ããã¯ããŒã«ã㊠API 仿§ãéçæããCompose MultiplatformïŒCMPïŒã® Android/iOS ã¢ããªãèªåçæããŠãåãµã€ããšã®ã¹ã¯ãªãŒã³ã·ã§ããæ¯èŒã§æ€åãŸã§è¡ãââãããªããŒã«ã« AI ãã€ãã©ã€ã³ãäœããå®éã«èªç€ŸãµãŒãã¹ KINTO ã®ã¹ããŒãžã³ã°ç°å¢ãåãã¢ããªã«å€æããŠã¿ãŸãããçµè«ããèšããšã ã¢ããªãã¡ãŒã¹ãã¯ãã¯ãäºç®ã®åé¡ã§ã¯ãªããããŒã«ãã§ãŒã³ã®åé¡ ã§ããæ¬èšäºã§ã¯ãã€ãã©ã€ã³ã®èšèšãçæãããã¢ãŒããã¯ãã£ãå®éã®ã³ãŒããåãµã€ããšã®äžŠåæ¯èŒã¹ã¯ãªãŒã³ã·ã§ãããŸã§ããã®å
šå·¥çšã玹ä»ããŸãã ãã®èšäºã§ãããããš Web ãµã€ãã¯ãããèªäœã 仿§æž ïŒããŒãžãšãããŒïŒ+ ãã¹ãããŒã¿ ïŒå® API ãã©ãã£ãã¯ïŒ+ åãå
¥ãåºæº ïŒã¢ãã€ã«ã¹ã¯ãªãŒã³ã·ã§ããïŒã§ãã ããŒã«ã« AI ãã€ãã©ã€ã³ããã¯ããŒã« â 仿§ã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã° â ã³ãŒãçæ â ã¹ã¯ãªãŒã³ã·ã§ããç
§åæ€åããéã«ãŒãã§åã ææïŒ16 ç»é¢ã®ä»æ§åãP0 ã® 4 ç»é¢ããšã³ãããŒãšã³ãå®è£
ãAPI 31 ãªãã¬ãŒã·ã§ã³çæã ãã¹ã 107 æ¬å
šã°ãªãŒã³ ãAndroid ãšãã¥ã¬ãŒã¿ãŒ + iPhone ã·ãã¥ã¬ãŒã¿ãŒã§åäœ DTO ã¯é²ç»æžã¿ JSON ããæ©æ¢°çã«å°åºãã ããã¯ãšã³ããæ³åã§è£ããªã ãªãã©ã€ã³ãã¢ïŒRecorded ã¢ãŒãïŒã¯åäžã® Ktor ã¯ã©ã€ã¢ã³ãã MockEngine ã«èŒãæ¿ããã ãã§ã ãããã¯ã·ã§ã³ã®ããŒã¹çµè·¯ããã®ãŸãŸéã :::message alert æ¬èšäºã®ãã€ãã©ã€ã³ã¯ èªç€Ÿãµã€ã ïŒèªèšŒæ
å ±ãšæš©å©ãèªåãæã€ãµã€ãïŒã倿ããããã®ãã®ã§ããä»ç€Ÿãµã€ãã®ã¹ã¯ã¬ã€ãã³ã°ã«äœ¿ããã®ã§ã¯ãããŸãããã¯ããŒã«å¯Ÿè±¡ã¯ãã¹ãŠèªç€Ÿã®ã¹ããŒãžã³ã°ç°å¢ã§ãã ::: 1. ãªãã¢ããªãã¡ãŒã¹ãã¯é¿ããããªãã®ã ãŸãããŒã¿ãããæ¥æ¬ã§ã¯ãã¹ããŒããã©ã³ã§ã€ã³ã¿ãŒããããå©çšããå人ã®å²åã 2016 幎㮠57.9% ãã 2025 幎ã«ã¯ 74.3% ãžäžæããåæéã« PC 㯠58.6% â 45.6% ã«äžèœããŸããïŒ ç·åç éä¿¡å©çšååèª¿æ» ïŒã å©çšæéã®å·®ã¯ããã«é¡èã§ããå
šå¹Žä»£ã®ã€ã³ã¿ãŒãããå¹³åå©çšæéïŒå¹³æ¥ïŒã¯ã¢ãã€ã«æ©åšã 116.8 å/æ¥ ã«å¯ŸããŠããœã³ã³ã¯ 50.0 å/æ¥ ãš 2 å以äžãäŒæ¥ã«ã¯ 133.5 å vs 23.6 å ãš 5 åè¶
ãŸã§éããŸãïŒ ç·åçæ
å ±éä¿¡æ¿çç ç©¶æã什å6幎床 æ
å ±éä¿¡ã¡ãã£ã¢ã®å©çšæéãšæ
å ±è¡åã«é¢ãã調æ»ã ïŒã ããã«ã¹ããŒããã©ã³ã®äžã§ã¯ããŠãŒã¶ãŒã¯ãã©ãŠã¶ã§ã¯ãªãã¢ããªã®äžã«ããŸããç±³åœã®æäººã¯ã¢ãã€ã«ã®ã€ã³ã¿ãŒãããå©çšæéã® çŽ 9 å² ãã¢ããªã«è²»ãããŠããŸãïŒ eMarketer ïŒã ç±³åœåžå Žã§ã¯ããã®è°è«ã¯ 10 幎以äžåã«æ±ºçããŠããŸãã Instagram ïŒé·å¹ŽãWeb çã¯é²èЧå°çšã ã£ã Uber ïŒWeb ã¯ã©ã€ã¢ã³ãã¯ã¢ããªãåãããªã端æ«åãã®è»œéãã©ãŒã«ãã㯠Venmo ïŒ2018 å¹Žã«æ±ºæžæ©èœã Web ãµã€ãããäžžããšæ€å» ããã·ã¥éç¥ã¯ãªãã³ã·ã§ã³ã®çåœç·ãããŒã ç»é¢ã®ã¢ã€ã³ã³ã¯ãã©ã³ãã®æä¹
çãªé£å°ãOS çµ±åïŒæ±ºæžã»çäœèªèšŒã»ãŠã©ã¬ããã»å
±æã·ãŒãïŒã¯åœç¶ã®åæããã¡ãã§ã¯ããµãŒãã¹ã«ã¢ããªããèŠããã©ããããåã人ã¯ããããŸããã ãPWA ã§ããã®ã§ã¯ïŒããšããåè«ã«ã¯å
ã«çããŠãããŸããWeb Push ã¯ç¢ºãã«ååšããŸãïŒiOS ã 16.4 ããããŒã ç»é¢è¿œå æžã¿ã® Web ã¢ããªã«éæŸïŒãããŠãŒã¶ãŒããŸãããŒãžãæåã§ãã€ã³ã¹ããŒã«ãããå¿
èŠããããé
ä¿¡ã®ä¿¡é Œæ§ã OS çµ±åã®æ·±ãããã€ãã£ãããã·ã¥ã«ã¯é ãåã³ãŸããã10 幎çµã£ãŠãã®ã£ããã¯éãããŸãŸã§ããªãã³ã·ã§ã³ã®åè² ã¯äŸç¶ãã€ãã£ãåŽã§æ±ºãŸã£ãŠããŸãã 2. ã§ã¯ããªãçãã£ãŠããªãã®ã å€å
žçãªã³ã¹ãè¡šãæ®é
·ã ããã§ãã é
ç® å
容 ãã¶ã€ã³å·¥çš ã³ãŒããæžãåã«ãWeb ã®äœéšãã¢ãã€ã«åãã«åèšèš ã³ãŒãããŒã¹ à 2 Swift ãš Kotlin ã§åããããã¯ããäºåºŠå®è£
ããŒã à 2 2 çš®é¡ã®ã¹ãã«ã»ããã§æ¡çš ããžãã¯ã®äºéå åããã°ãäºåºŠçŽããåãæ©èœãå¥ã
ã®ææã«åºãã仿§åããäŒè°ãæ°žé ã«ç¶ã ãã®äžã« QA åå¢ + ã¢ããªã¹ãã¢éçš æ¬åœã®æ¥æã¯ v1 ã§ã¯ãããŸããã v1 以éã®ãã¹ãŠã®æ©èœããæ°žé ã«äºåºŠãã€ãªãªãŒã¹ããã ããšã§ãããã®ç¹°ãè¿ã課çšãããWeb ã§ååããå
éãããæ¢å®æ¹éãžãšç¡¬åãããŠããŸããã 3. èšç®åŒãå€ãã 2 ã€ã®æè¡ æè¿ 2 ã€ã®ããšãèµ·ãããããäºãã«å¢å¹
ãåã£ãŠããŸãã AI ãåŽåã³ã¹ããæ¶ããã ãšãŒãžã§ã³ãã¯æ¢åã® Web ãµã€ãââã¬ã³ããªã³ã°æžã¿ããŒãžãã¹ã¯ãªãŒã³ã·ã§ãããå® API ãã©ãã£ãã¯ââãèªã¿åããã㮠蚌æ ããã¢ããªãæžããããã«ãªããŸãããWeb ãµã€ãã¯ãã§ã«ä»æ§æžã§ãããã¹ãããŒã¿ã§ããåãå
¥ãåºæºã§ããããšã¯èª°ããèªãã ãããšãŒãžã§ã³ãã¯ç²ããã«èªã¿ãŸãã CMP ãäºéåã³ã¹ããæ¶ããã 1 ã€ã® Kotlin ã³ãŒãããŒã¹ãã Android ã¢ããªãš iOS ã¢ããªãçãŸããŸããããã¹ãŠã®æ©èœãäºåºŠãªãªãŒã¹ãããçšã¯ãèŠåŸã§ã¯ãªã æ§é ã«ãã£ãŠæ¶æ»
ããŸãã ããã§æ±ºå®çãªã®ã¯ AI åŽã®åœ¢æ
ã§ããéæ³ã®ããã³ãã 1 çºã§ã¯ãªãã ã¯ããŒã« â 仿§ã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã° â 仿§ããã³ãŒãçæ â ã¹ã¯ãªãŒã³ã·ã§ããã§ç
§åæ€å ãšãã ãã€ãã©ã€ã³ ã§ããããšã以éã¯ãããå®ãµã€ãã«é©çšããèšé²ã§ããããã®åã« 2 ã€ã®èšèšå€æââãªã ããŒã«ã« ãªã®ãããªã CMP ãªã®ãââãçä»ããŸãã 4. ãªããããŒã«ã«ãAI ãã€ãã©ã€ã³ãªã®ã ã¯ã©ãŠãåã®å€æ SaaS ãäžå¯èœãšã¯èšããŸããããããŒã«ã«ãéžãã çç±ã¯ 2 ã€ãã©ã¡ããã¢ãã«æ§èœãšã¯ç¡é¢ä¿ã§ãã â æš©éãšèªèšŒæ
å ±ãããŒã«ã«ã«çãŸãã 䜿ãã®ã¯ç°å¢å€æ°ããèªãèªèšŒæ
å ±ã ãïŒgitignore æžã¿ã® .env ãš Playwright ã®ãã°ã€ã³ç¶æ
ïŒãä»åã¹ã³ãŒãã«å
¥ãã 16 ç»é¢ã¯ãã¹ãŠå
¬éããŒãžã§ãã»ãã·ã§ã³ãªãã§ãå°éã§ããŸãïŒäžéšã®ãã¹ã«ã¯å¥ç³»çµ±ã®ã¢ã¯ã»ã¹å¶éãããã£ãŠããããã¡ãã®èªèšŒãæž¡ããŠããªãã®ã§åŸè¿°ã® 401 ã«ãªããŸãïŒã瀟å€ã«é ãã倿ã¯éããèªåã®ã©ãããããã§åããªã ãã ã®ç€Ÿå
ããŒã« ã§æžã¿ãŸãã å¢çãæç¢ºã§ãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ïŒä»å㯠Claude CodeïŒã»ã¹ã¯ãªããå®è¡ã»èªèšŒæ
å ±ã¯ããŒã«ã«ã ã¢ãã«ã¯ã¯ã©ãŠããªã®ã§ããŒãžå
容㚠API ãµã³ãã«ã¯ãã·ã³ãé¢ããŸã ãã¯ããŒã«å¯Ÿè±¡ã¯äŒå¡ãšãªã¢ãå«ãŸãªãå
¬éçžåœã®ããŒãžã«éããAPI ãã°ã¯ãã¹ãã³ã°æžã¿ã§ãã â¡ ããŒã«ã«ã®ã¢ãã€ã«éçºç°å¢ã«ãã®ãŸãŸç¹ããã XcodeãAndroid SDKããšãã¥ã¬ãŒã¿ãŒãåããã·ã³ã«ããã®ã§ã ã¯ããŒã« â 仿§ â ã³ãŒãçæ â ãã«ã â ã¹ã¯ãªãŒã³ã·ã§ããæ€åã 1 åã®å®è¡ã§éããŸã ãåããã€ãã©ã€ã³ããšãã¥ã¬ãŒã¿ãŒãæäœããŠæ®åœ±ããåãµã€ããšäžŠã¹ãå·®åã P0/P1/P2 ã«åé¡ãæ·±å»ãªãã®ã¯ã«ãŒãå
ã§ä¿®æ£ïŒiOS ã®æäœã¯çŸç¶æåïŒãã¯ã©ãŠãã§ãããªãã2 ã€ã® OS ã®ãã«ãããŒã«ãã§ãŒã³ãšããã€ã¹ãã¡ãŒã ãèªåã§æ±ããããšã«ãªããŸãã ããŒã«ã«ãã©ãããšã¯ç¬ç«ããããã€ãã©ã€ã³èªäœã®æ¹éã 2 ã€ã 蚌æ ã§ãã£ãŠãæšæž¬ã§ã¯ãªãã Playwright ãåéããã®ã¯ ã¬ã³ããªã³ã°æžã¿ ã® 60 ããŒãžââHTMLãã¹ã¯ãªãŒã³ã·ã§ããã å® API ãã©ãã£ã㯠ïŒãã¹ãã³ã°æžã¿ãµã³ãã«ïŒã仿§ã¯ããããå°ãããŸãã ææç©ã¯å¥çŽããã§ãŒãºã¯ã²ãŒãã åãã§ãŒãºã¯ææç©ãæžãåºããŠããæ¬¡ãžïŒ artifacts/ â spec/ â app/ â report/ ïŒã決å®çã«å®è¡ã§ããå·¥çšã¯ãšãŒãžã§ã³ãèªèº«ã®ã¹ã¯ãªããã§ãåã²ãŒãã人éãèŠãŸãã :::message ãã€ãã©ã€ã³ã®éåïŒ ããã¯ãšã³ããæ³åã§è£ããªãã ãã©ãã£ãã¯ã§èŠ³æž¬ãããªãã£ããã£ãŒã«ãã¯ãååšããªãã ::: 5. ãªã Compose Multiplatform ãªã®ã ç§ã¯ KMM ã®æä»£ãã KMP / CMP ã远ããããŠããŸããïŒ ãããŸã§ã«æžããèšäºã¯ãã¡ã ïŒãä»åã¿ãŒã²ããã« CMP ãéžãã çç±ã¯ 3 ã€ã§ãã äžè²«æ§ã KMP ã®ããŒã¿å±€ãšãã¡ã€ã³å±€ã 1 ã€ã§äž¡ OS ã«ä»ããã®ã§ãiOS ãš Android ã®ããžãã¹ããžãã¯ã¯ ä¹é¢ãããããªã ãå®è£
ã 1 ã€ããã¹ãã¹ã€ãŒãã 1 ã€ã ããã§ãã å¹çã 2 åã§ã¯ãªãçŽ 1 åã®å·¥æ°ãv1 ã§ãããã以éã®ãã¹ãŠã®æ©èœã§ãã1 ããŒã ã§äž¡ã¹ãã¢ã«åºè·ã æ§èœã Android ã§ã¯ââæ¥æ¬ã¯ããŠããäžçã®ã¹ããã®éåã§ãââCompose 㯠Google ã Android ã®æšæº UI ããŒã«ããããšããŠæäŸããŠãããã®ãã®ãã®ã§ããã¡ãŒã¹ãããŒãã£ã¢ããªãšåã ART äžãåãæç»ãã€ãã©ã€ã³äžã§åããŸããã€ãŸã CMP ã¢ããªã® Android åŽã¯ã ãã©ãããã©ãŒã æšæºã®å€ã«å¥ã®ã¬ã³ããªã³ã°å±€ãç©ã¿ãŸãã ïŒCompose èªèº«ã¯ View ããªãŒã§ã¯ãªãèªåã®ã³ã³ããžã·ã§ã³ãæç»ããŸããããã®å
㯠Android ã®ã°ã©ãã£ãã¯ã¹ã¹ã¿ãã¯ã§ãïŒãiOS ã§ã¯ CMP ã Skia ã§æç»ããŸãââç¬èªãšã³ãžã³ãç©ããšããç¹ã¯ä»ã®ã¯ãã¹ãã©ãããã©ãŒã ãã¬ãŒã ã¯ãŒã¯ãšåãã¢ãŒããã¯ãã£äžã®è³ãã§ãââããKotlin/Native ãå
±æã³ãŒãããã·ã³ã³ãŒãã«ã³ã³ãã€ã«ããAndroid åŽã¯æšæºããŒã«ãããã®ãŸãŸãä»åãã³ãããŒã¯ãåã£ãããã§ã¯ãªãã®ã§åªå£ã¯æèšããŸãããã Android åŽã§è¿œå ã®æç»å±€ãèè² ããªã ãšããæ§é äžã®å·®ã¯æ®ããŸãã ã¹ã©ã€ãã«åãŸããªããå®åã§å¹ãçç±ïŒ æ¢åããŒã ã«ã¯ Android åŽãã¿ãåç¶ã Compose ã¯ãã§ã« Android ã®æšæºãCMP ã¢ããªã® Android ååã¯ãããŸã® Android ãšã³ãžãã¢ã忥ããèªããæ
£çšçãªãã€ãã£ãã³ãŒããFlutter ã¯å
šå¡ã« Dart ä¹ãæããèŠæ±ããŸãã æ®µéå°å
¥ã§ããã ããŒã¿å±€ã ãã®å
±æããUI å
šäœã®å
±æãå¯ãæ¢åãã€ãã£ãã¢ããªãžã®åã蟌ã¿ã SwiftUI/UIKit ãšã®çžäºéçšãå¯ãç§»è¡ã®éçã§ãã£ãŠãå
šé¢æžãçŽããããããªãã°ãã§ã¯ãªãã äž¡é£å¶ã®ãã¡ãŒã¹ãããŒãã£ãæ¯ããã CMP 㯠JetBrains 補ãGoogle 㯠KMP ãå
¬åŒãµããŒãããèªç€Ÿãããã¯ã·ã§ã³ã§äœ¿çšãïŒ Google Docs ãæ¡çšæžã¿ ãWorkspace ä»ã¢ããªã远éäžïŒãandroidx ã® KMP çïŒLifecycle / ViewModel / Room / DataStoreãNavigation ã® CMP ç㯠JetBrains 管çïŒãåºè·ãCMP ã® iOS 察å¿ã¯ 2025 幎 5 æã1.8.0 ã§ stable å°é ããã©ãããã©ãŒã ã®ææè
ãšèšèªã®çã¿ã®èŠªãåãã¹ã¿ãã¯ã«åæããŠããââæ¬¡ã® 10 å¹Žã®æè³å
ã瀺ããã以äžãªãã·ã°ãã«ã§ãã ãã©ãããã©ãŒã API ã«çŽæ¥ã¢ã¯ã»ã¹ã expect/actual ã§ Keychain / EncryptedSharedPreferences ããã€ãã£ãã«åŒã¶ãåŸ
ãããããã©ã°ã€ã³å±€ãªãã ã¹ã¿ãã¯å
šäœã 1 èšèªã Kotlin ã§ç«¯ãã端ãŸã§ãKtor ã§ããã¯ãšã³ããŸã§ãæ¡çšåžå ŽãããŒã«ãã§ãŒã³ãæçã ãããŠæ¬èšäºå
šäœã貫ãçç±ãããã§ãã :::message CMP 㯠AI ã³ãŒãçæã®çæ³çãªã¿ãŒã²ããã§ããã 匷ãåä»ããããåäžã³ãŒãããŒã¹ã§ã¯ãã³ã³ãã€ã©ããšãŒãžã§ã³ãã®å
šåºåã«å¯Ÿããç¡æã®æ€èšŒåšã«ãªãã kotlinx.serialization ã® DTO ã¯èšé²æžã¿ JSON ããæ©æ¢°çã«å°åºã§ããã1 åã®çæãå
šãã©ãããã©ãŒã ãã«ããŒãããAI ãš CMP ã¯è¶³ãç®ã§ã¯ãªã æãç® ã§å¹ãã ::: 6. ã±ãŒã¹ã¹ã¿ãã£ïŒKINTO ã¹ããŒãžã³ã° â åã CMP ã¢ã㪠6.1 ãã€ãã©ã€ã³å
šäœå 5 ãã§ãŒãºãåãã§ãŒãºã¯ææç©ãæžãåºããŠããæ¬¡ãžé²ã¿ããã§ãŒãºéã«äººéã®ã¬ãã¥ãŒã²ãŒãããããŸãã CRAWL â ãµã€ããã¢ãã€ã«éçºã®ãªãã¡ã¬ã³ã¹ã«å€ãã 1 ããŒãžã 4 ã€ã®ææç©ãšããŠèšé²ããŸãã ã¢ãã€ã«ïŒ390Ã844 @2xãiPhone UAã isMobile / hasTouch ïŒãšãã¹ã¯ãããïŒ1440Ã900ïŒã®ãã«ããŒãžã¹ã¯ãªãŒã³ã·ã§ããã networkidle åŸã® ã¬ã³ããªã³ã°æžã¿ DOM ããã®ããŒãžãå®éã«å©ãã APIããããŠåãšã³ããã€ã³ãã®ã¬ã¹ãã³ã¹å®äœãã¢ãã€ã«åŽãå€æã®æ£è§£ããŒã¿ã§ãPhase 5 ã®æ€åã§ãåãç»åãšäžŠã¹ãŸãã ãµã€ãã®ã¢ãã€ã«è¡šç€ºããã®ãŸãŸèšèšæžã«ãªã ã®ã§ããã¢ãã€ã«åãã«äœãçŽããå·¥çšãæ¶ããŸãã API ã¯ããŒãžåäœã§èšé²ããŸãã åãšã³ããªã«ãã©ã®ããŒãžãåŒãèµ·ããããããä»ãã®ã§ãç»é¢ â å¿
èŠããŒã¿ â ãšã³ããã€ã³ããæ©æ¢°çã«ç¹ãããŸãïŒèŠç©ãã·ãã¥ã¬ãŒã·ã§ã³ã® ?step=1&memberType=corporate&term=7&bonus=0 ã car-models/{carCode}/selectable-contract ãå©ãããšããç²åºŠã§ïŒãå€ãåããŒã¯ã³ã«çœ®ãæããã¬ã¹ãã³ã¹åœ¢ç¶ïŒ float / iso8601 / url / null ïŒãä¿åããããã DTO ã®åä»ãã®æ ¹æ ã«ãªããŸããå®äœãµã³ãã«ã¯ãšã³ããã€ã³ãããšã«æå€§ 3 ä»¶ãããã·ã¥ã§éè€æé€ââè€æ°ãµã³ãã«ã®åéåããã©ã®ãã£ãŒã«ãã nullable ãããæ±ºããåããã¡ã€ã«ãåŸã§ MockEngine ã®ãªãã¬ã€ãšå¥çŽãã¹ãã«ã䜿ãããŸãã URL ããã³ãã¬ãŒãåããŠç»é¢ãæ°ããŸãã ãã¹ 1 ã»ã°ã¡ã³ããã€ãèå¥åããããã®ãåã«ç³ãã ãã§ãã function templatize(pathname: string): string { return pathname.split("/").map((seg) => { if (/^\d+$/.test(seg)) return "{id}"; if (UUID_RE.test(seg)) return "{uuid}"; // CAR-0000003908 â {carCode}ãGRD-⊠â {grdCode} if (PREFIXED_CODE_RE.test(seg)) return `{${seg.split("-")[0].toLowerCase()}Code}`; if (isOpaqueToken(seg)) return "{token}"; return seg; }).join("/") || "/"; } ããã§ååããŒãžã¯æå€§ 3 ã€ã³ã¹ã¿ã³ã¹ã ã蟿ãã°æžã¿ã60 ããŒãžã¯ 58 ãã³ãã¬ãŒãã«æŽçãããŠãããã 16 ç»é¢ã®åè£ã«ãªããŸããããŒãžããšã® outlinks ã¯ããã²ãŒã·ã§ã³ã°ã©ãã«ã img / table / iframe /ç¹°ãè¿ãã«ãŒãã®æ§é ã·ã°ããã£ã¯ã³ã³ããŒãã³ãäžèЧã«ãåç
§ãããŠãã CSS ãšãã©ã³ãã¯å®ãã¡ã€ã«ãšããŠååŸããŠãã¶ã€ã³ããŒã¯ã³ã«åããŸãã Phase 2 ã§ããµã€ãã¯æ©æ¢°å¯èªãªå¥çŽã«å€ãããŸãã app-spec.json ã® 16 ç»é¢ããããã«ããœãŒã¹ URLã»åªå
床ã»ã³ã³ããŒãã³ãã»å¿
èŠããŒã¿ã»æç€ºçãªã¢ãã€ã«é©å¿ãã©ã³ãäžããããŸããæ¬ä»¶ã®ããã«ãµã€ãããã§ã«ã¬ã¹ãã³ã·ãå¯Ÿå¿æžã¿ãªãããã®é©å¿èšèšã¯ã¢ãã€ã«ãã¥ãŒããŒãã®ã¯ããŒã«çµæããçŽæ¥å°åºããã ãã€ãã©ã€ã³ã«åžåãããŸã ã { "id": "Home", "priority": "P0", "components": ["TopBar", "HeroCarousel", "CarCard", "SectionHeader", ...], "dataNeeds": ["CarouselSlide", "RecommendedCarList", "CorpContent", ...], "mobileAdaptation": "Hero carousel â HorizontalPager with page indicator, 16:9 slides using the imageUrl_x2 asset. The desktop 3-column grid collapses to 2 columns ... 51 images on this page: everything below the first two sections must be lazily loaded via AsyncImage." } 念ã®ããè£è¶³ãããšããã®æç²ã¯ å®ãã¡ã€ã«ã®ãŸãŸã§ãæ£ãã仿§ã§ã¯ãããŸãã ã 16:9 slides ãšããæšªé·åæã誀ãã§ãCMS ãå®éã«é
ä¿¡ããŠããã®ã¯æ£æ¹åœ¢çŽ æã§ããã6.4 ã§è§Šããã¬ã¿ãŒããã¯ã¹äžå
·åïŒå®è£
㯠16:10 ã®æ ã«ãªã£ãŠããŸããïŒã®æ ¹ã£ãã¯ããã®äžè¡ã§ãã仿§ãã®ãã®ãæ€åã«ãŒãã®æ€æ»å¯Ÿè±¡ã ãšããããšã§ãã API å¥çŽã¯èšé²ãã©ãã£ãã¯ããåæãã OpenAPI ã§ããã®ããšããã¡ã€ã«èªèº«ãããããŒã§å®£èšããŠããŸãã info: title: KINTO (staging) â reverse-engineered API description: |- Reverse-engineered from real traffic captured in artifacts/api-log.json. Nothing here is invented: every schema is the union of observed samples, a field missing from any sample is nullable. No mutation endpoints exist in this spec: the crawl observed GET traffic only. :::message ãã®ä»æ§ã¯èªèº«ã®ã«ãã¬ããžã®ç©Žãæ£çŽã«èšé²ããŠããŸããååŸã§ããã®ã¯ 60 ããŒãžã§ããããšã¯å¥ã« 12 ã® URL ã¯ååŸã§ããŸããã§ããââ404 ã 6ãã¢ã¯ã»ã¹å¶éã«ãã 401 ã 6ïŒ /kinto_one/lineup/ ãš SUBARU ç³»ã4 ç« ã§è§Šããå¥ç³»çµ±ã®èªèšŒãå¿
èŠãªãã¹ã§ãïŒãååŸã§ããªãã£ããã®ã¯ãæªååŸããšããŠä»æ§ã«æ®ãããã®ç»é¢ã«ã¯æãåºããŠããŸããã ::: ãã¶ã€ã³ããŒã¯ã³ãåã蚌æ åºæºã§ããè²ã»ã¿ã€ãã°ã©ãã£ã»äœçœã¯ãµã€ãã® 24 åã® CSS ãã¡ã€ã«ïŒ2.3MBïŒããåºçŸé »åºŠé ã«æœåºãWCAG ã³ã³ãã©ã¹ãæ¯ã¯ èšç® æžã¿ããã©ã³ãã«ã©ãŒãã¢ãã€ã«ã§ AA ãæºãããªãç®æã«ã¯ãããŒã¯ã³ãã¡ã€ã«ãã¢ã¯ã»ã·ãã«ãªä»£æ¿è²ãçšæããŠããã¹ããžã®äœ¿çšã匷å¶ããŸãã 6.2 çæãããã¢ãŒããã¯ã㣠Clean Architecture + MVIããã¹ãŠ commonMain ã§ãã æŒãããã¹ããã€ã³ã㯠1 ã€ã ãã :::message Recorded ã¢ãŒãã¯ã¢ãã¯å®è£
ã§ã¯ãªãã 第äºã®ã³ãŒããã¹ã¯ååšããªããåãçææžã¿ ApiClient ãåã JSON èšå®ãåãããããŒãäž¡ã¢ãŒãã§åããKoin ãå·®ãæ¿ããã®ã¯è¶³å
ã® Ktor ãšã³ãžã³ã ãã ::: ã¡ã«ããºã ã®å
šæãããã§ãã single<HttpClientEngine> { val config: AppConfig = get() when (config.dataMode) { DataMode.Recorded -> recordedEngine(get()) // MockEngine replaying the crawl DataMode.Live -> platformHttpEngine() // OkHttp / Darwin } } ã€ãŸããªãã©ã€ã³ãã¢ã¯ ãããã¯ã·ã§ã³ã®ããŒã¹çµè·¯ããã®ãŸãŸéããŸã ãå®ãã€ããŒããããŒã¹ã§ããªã DTO ã¯ãã©ã€ããµãŒããŒçžæãšãŸã£ããåãããã« Recorded ã¢ãŒãã§ã倱æããŸãã ãã 1 ã€ãã©ããªã³ãŒãã¬ãã¥ãŒã§ãæè·ããããã£ããŒã«ïŒãªã¯ãšã¹ãã«åèŽãããµã³ãã«ããªããšãããªãã¬ã€ãšã³ãžã³ã¯ç©ºã® 200 ã§ã¯ãªã 501 ãè¿ããŸããæ²é»ã®æåãèš±ããšãå®éã«ã¯äœãæµããŠããªãç»é¢ããå®è£
æžã¿ãã«èŠããŠããŸãããã§ãã ããžãã¹ããžãã¯ã¯ 100% commonMain ã expect/actual ã¯æ¬åœã«é¿ããããªãç®æïŒã»ãã¥ã¢ãªããŒã¯ã³ä¿å â Keychain / EncryptedSharedPreferencesããã©ãããã©ãŒã HTTP ãšã³ãžã³ïŒã«ã®ã¿çŸããåç®æã«çç±ãããã¥ã¡ã³ãåãããŠããŸãã 6.3 AI ãçæãã CMP ã³ãŒãã®å®ç© DTO ã¯å°åºããããã®ã§ãå¹»èŠã§ã¯ãªãã è»çš®ã«ã¿ãã°ã®ãšã³ããã€ã³ãã¯ãCMS 颚å³ã®æ··æ²ãšããããŒãã³ã°ã®ãã£ãŒã«ãã 80 åä»¥äžæã€ãªããžã§ã¯ããè¿ããŸãããžã§ãã¬ãŒã¿ãŒã¯èšé²æžã¿ãµã³ãã«å
šäœã®åéåãåããŸããå
šãµã³ãã«ã«ååšãããã£ãŒã«ãã¯é nullãã©ãã 1 ã€ã§ãæ¬ ããŠããã°ããã©ã«ãå€ä»ã nullableã @Serializable data class CarCatalogEntryDto( val name: String, // in every sample â required @SerialName("fuel_label") val fuelLabel: String? = null, // absent in some â nullable @SerialName("year3_bonus0m_taxin") val year3Bonus0mTaxin: String, // ⊠80+ fields, mechanically derived from recorded JSON ) ãã®ã¯ã©ã¹ãåãã§ææžããã人éã¯ããŸãããæžãå¿
èŠããããŸããã§ããââãããŠãã©ã®ãã£ãŒã«ãã æšæž¬ ãããŠããŸãããå€å®ã¯ãã® 1 è¡ã ãã§ãã // ãã®ãã£ãŒã«ããçŸãããªããžã§ã¯ãæ° === 芳枬ãããªããžã§ã¯ãæ° ã®ãšãã ã required const req = (s.propSeen?.get(k) ?? 0) === s.seen; ãã€ãã©ã€ã³ã®åçã¯ããã«åçž®ãããŠããŸãïŒ èšé² â å
šãµã³ãã«ã®åéå â å â ã³ãŒã ãã©ã®ç¢å°ãã¢ãã«ã®å€æã§ã¯ãªãã¹ã¯ãªããã®èšç®ãªã®ã§ãåãèšé²ãå
¥ããã°åã DTO ãåºãŸããã¢ãã«ã®ä»äºã¯ããã®æ©æ¢°çãªåºåã®äžã«ç»é¢ãçµãããšã ãã§ãã API é¢ã¯åä»ãã§ãèªåã®åºèªã«æ£çŽã çæãããã¯ã©ã€ã¢ã³ãã®å
šé¢æ°ããã©ã®èšé²æžã¿ãªã¯ãšã¹ãç±æ¥ããããã¥ã¡ã³ãåããŠããŸãã /** * Contract terms and bonus-payment options available for a car model * Recorded as: GET /api/price/v1/web/car-models/{carCode}/selectable-contract */ suspend fun getSelectableContract(carCode: String): ApiResult<SelectableContractDto> = runCatchingApi { client.get(hosts.main + "/api/price/v1/web/car-models/$carCode/selectable-contract") .bodyOrThrow() } ãã¹ãŠã®ç»é¢ãåãåºå®ã® MVI 圢ç¶ã sealed 㪠Intent ãå
¥ãã StateFlow ãåºãŠãããã²ãŒã·ã§ã³ã¯ã¯ã³ã·ã§ããã® Effectã sealed interface HomeIntent { data object Load : HomeIntent data class CarClicked(val car: CarSummary) : HomeIntent // ⊠} class HomeViewModel( private val getHomeFeed: GetHomeFeedUseCase, private val hosts: ApiHosts, ) : ViewModel() { private val _state = MutableStateFlow(HomeUiState()) val state: StateFlow<HomeUiState> = _state.asStateFlow() fun onIntent(intent: HomeIntent) { /* exhaustive when */ } } ãã®åäžæ§ã¯çŸåŠã§ã¯ãªãã ç»é¢çæãå®å
šã«äžŠååã§ããçç±ãã®ãã® ã§ããããŒãã»ããã²ãŒã·ã§ã³ã°ã©ãã»å
±æã³ã³ããŒãã³ããå¥çŽãšããŠã³ããããããåŸã¯ãç¬ç«ãããšãŒãžã§ã³ãã 1 ç»é¢ãã€åŒãåããããŸãã å¥çŽãã¹ããããã¹ãŠãçŸå®ã«éä»ãã«ããã ã¯ã©ã€ã¢ã³ããšåæã«çæããããªãã¬ãŒã·ã§ã³ããšã« 1 æ¬ã ãã¹ãŠã® èšé²æžã¿ãµã³ãã«ããããã¯ã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãã«éããŸãã /** Contract terms and bonus-payment options â 3 recorded sample(s). */ @Test fun `getSelectableContract parses every recorded sample`() = runTest { val results = ContractTestEnv.forEachSample("getSelectableContract") { env -> env.api.getSelectableContract(carCode = SAMPLE_CAR_CODE) } // ãµã³ãã« 0 ä»¶ã®ãŸãŸç·ã«ãªãäºæ
ãé²ããä»¶æ°ã¯çææã« KDoc ãšåãå€ã§åã蟌ãŸãã assertTrue(results.isNotEmpty(), "no recorded sample was replayed") assertEquals(3, results.size, "recorded sample count changed") results.forEach { assertTrue(it is ApiResult.Success, "failed to parse: $it") } } ä»¶æ°ã®ã¢ãµãŒãã¯ãããšããä»ãè¶³ããä¿éºã§ã¯ãããŸããã forEachSample ã空ãªã¹ããè¿ããšââãªãã¬ãŒã·ã§ã³ ID ã®ç¶Žãã 1 æåééããã ãã§èµ·ãããŸãââ forEach ã¯äœãæ€èšŒããã«éã£ãŠããŸããã107 æ¬ã°ãªãŒã³ããäœãæå³ããªããªããŸããçæåšã¯ãµã³ãã«æ°ãç¥ã£ãŠããã®ã§ããã®æ°ããã¹ãã«çŒã蟌ã¿ãŸãã ãã¹ãç°å¢ã¯æå³çã«ãããã¯ã·ã§ã³ã®ãªããžã§ã¯ãã䜿ããŸãââæ¬ç©ã®ã¯ã©ã€ã¢ã³ããã¡ã¯ããªãæ¬ç©ã® JSON èšå®ãæ¬ç©ã®ãªãã¬ã€ãšã³ãžã³ãã¹ã€ãŒãå
šäœïŒçæå¥çŽãã¹ã + mapper + ååž°ïŒã§ 107 ãã¹ãã倱æ 0 ãéä»ãã«ããŠããã®ã¯èšé²ãããçŸå®ãªã®ã§ãåŸæ¥ã©ã€ã API ããããã°ã次ã®åã¯ããŒã«æã«åãã¹ã€ãŒããæãŸããŸãââæ¬çªã¯ã©ãã·ã¥ã§ã¯ãªãã èµ€ããªã£ããã¹ã ãšããŠã 6.4 Web vs ã¢ããªã䞊ã¹ãŠæ¯èŒ æ€åã«ãŒã㯠Android ãšãã¥ã¬ãŒã¿ãŒïŒAPI 35ã1080Ã2400ïŒäžã§ã¢ããªèªèº«ã®ããã²ãŒã·ã§ã³ãæäœããå®è£
æžã¿ç»é¢ãæ®åœ±ããŸããå
šå·¥çš Recorded ã¢ãŒããªã®ã§ãã©ã€ã API ã«ã¯äžåºŠããªã¯ãšã¹ããåºããŠããŸããïŒç»åã ãã¯ãµã€ãã® CDN ããèªã¿èŸŒã¿ãŸãïŒã åãã¢ã¯åãµã€ããšã»ã¯ã·ã§ã³åäœã§ç
§åããŸããäžã® 4 æã§å®éã«ç¢ºèªã§ããã®ã¯ãããŒã ã®ããŒããŒã³ããŒãš CTAãPICK UP ã»ã¯ã·ã§ã³ã®å® CMS ãããŒïŒåŸè¿°ã® iOS ã¹ã¯ãªãŒã³ã·ã§ããã§ã¯ 14 æã¶ãã®ããŒãžã€ã³ãžã±ãŒã¿ãŒãèŠããŸãïŒãã©ã€ã³ã¢ããã® TOYOTA / LEXUS ã¿ããšã«ããŽãªããããè»çš®è©³çŽ°ã®æé¡æéãšçŽæç®åŠãèŠç©ãã®ãã©ã³éžæãšäžéšåºå®ãµããªãŒããŒã§ããå·®å㯠P0/P1ïŒã³ã³ãã³ãæ¬ èœãæ§é ã»ããã²ãŒã·ã§ã³ç ŽæïŒâ ã«ãŒãå
ã§ä¿®æ£ãP2ïŒãã¯ã»ã«ã¬ãã«ã®ç£šã蟌ã¿ïŒâ èšé²ããšåé¡åŠçããŸãã ãã®ã¹ã¯ãªãŒã³ã·ã§ããã¯å·®åãæ£çŽã«åããŠããŸããããŒã ã®ããŒããŒã¯ãåãµã€ãã§ã¯èæ¯ããžã¥ã¢ã«ã«åååçã®è£
食ã€ã©ã¹ããèŒã£ãŠããŸãããã¢ããªåŽã¯ã³ããŒãš CTA ã ãã®ããã¹ããããã¯ã«ãªã£ãŠããŸããè£
é£ŸçŽ æãã¯ããŒã«ã®ææç©ããæ©æ¢°çã«åãåºããªãã£ãããã§ãçŸæç¹ã§ã¯æ¢ç¥ã®å·®åïŒ8 ç« ã® P2 ãªã¹ãïŒã§ãã ã«ãŒããå®éã«æ©èœããäŸã 1 ã€ãããŒã ã®ã«ã«ãŒã»ã«ã¯åœåãããŒã 16:10 ã®æ ã«ã¬ã¿ãŒããã¯ã¹è¡šç€ºããŠããŸããããCMS ãå®éã«é
ä¿¡ããŠããã®ã¯ 630Ã630 ã®æ£æ¹åœ¢çŽ æã§ãããã¹ã¯ãªãŒã³ã·ã§ããæ¯èŒã§çºèŠ â ä¿®æ£ â åæ®åœ± â è§£æ¶ã :::message ã¹ã¯ãªãŒã³ã·ã§ããå
ã®æéã»çŽæã»ãã£ã³ããŒã³è¡šèšã¯ã 2026 幎 8 ææç¹ã®ã¹ããŒãžã³ã°ç°å¢ã®å
容 ã§ããå®éã®ãµãŒãã¹ã®æéãåæ±å
容ã¯å€ãããŸããææ°ã®æ
å ±ã¯ KINTO å
¬åŒãµã€ã ãã確èªãã ããã ::: ãããŠåãã³ãŒãããŒã¹ãã ç»é¢ã³ãŒãã®è¿œå ãŒã ã§ 2 ã€ç®ã®ãã©ãããã©ãŒã ã«ä¹ããŸãã  6.5 æ£çŽãªæ°åããã¯ã¹ é
ç® å®çžŸ 仿§ã«ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ãããç»é¢æ° 16 ïŒåªå
床ã»ã³ã³ããŒãã³ãã»å¿
èŠããŒã¿ã€ãïŒ çŸæç¹ã§ãšã³ãããŒãšã³ãå®è£
æžã¿ã®ç»é¢æ° 4 ââP0 ã»ããïŒHomeãLineupãCarDetailãEstimate çæããã API ãªãã¬ãŒã·ã§ã³æ° 31 ã4 ãã¹ã暪æââãã¹ãŠ GETããã¥ãŒããŒã·ã§ã³ã¯èŠ³æž¬ããããæ³åã§è¶³ããŠãããªã ãã¹ãïŒå¥çŽ + mapper + ååž°ïŒ 107 æ¬ãå
šã°ãªãŒã³ åäœç°å¢ Android ãšãã¥ã¬ãŒã¿ãŒ + iPhone ã·ãã¥ã¬ãŒã¿ãŒââã©ã€ã API äžäœ¿çšãç»åã®ã¿ãµã€ãã® CDN ããèªã¿èŸŒã¿ æ€åäžã®ã©ã€ã API ãžã®æ¥è§Š äžåºŠããªã ïŒç»åååŸã®ã¿ CDN ã«ã¢ã¯ã»ã¹ïŒ :::message alert ã»ãã¥ãªãã£ã«é¢ãã 3 ã€ã®æ±ºå®ïŒ DTO ã¯èšé²ããŒã¿ããã®ã¿å°åºïŒããã¯ãšã³ããæ³åã§è£ããªãïŒ ãã¥ãŒããŒã·ã§ã³ç³»ãšã³ããã€ã³ãã¯ãä»®ã«èŠ³æž¬ãããŠãçæ + ã¢ãã¯ã«ãã¬ããžãŸã§ãæç€ºçãªæ¿èªãªãã«ã©ã€ããµãŒããŒãžã¯æããªã èªèšŒæ
å ±ïŒã¹ããŒãžã³ã°ãžã®ã¢ã¯ã»ã¹èªèšŒãäŒå¡ãã°ã€ã³ã§ã¯ãªãïŒã¯ gitignore æžã¿ã®ç°å¢ãã¡ã€ã«ã«ã®ã¿ååšããå®è¡æã«ç°å¢å€æ°ãšããŠèªã¿èŸŒããã³ãŒãã«ãã¢ãã«ã®ã³ã³ããã¹ãã«ãå
¥ããªã ::: 7. AI ãä¿¡é Œã§ãããã®ã«ããå·¥åŠïŒãã¢ã®æåã§ã¯ãªãïŒ ã¢ãã«ã®èœåã¯å¿
èŠæ¡ä»¶ã§ãã£ãŠãå忡件ã§ã¯ãããŸãããå®éã«éããæ¯ããã®ã¯ããã®åšããåºããå·¥åŠã§ããã åºå®ã¢ãŒããã¯ãã£ãšããå¥çŽã Clean Architecture + MVIãKoinãKtorãCoilââçæã®åã«æ±ºå®æžã¿ããšãŒãžã§ã³ãã¯å³èã§åœ¢ãçºæãããæ¢ç¥ã®åœ¢ã«äžèº«ãåãããã ããææç©ã¯ã¬ãã¥ãŒå¯èœã§ã倱æã¯èšºæå¯èœã æäœæ¥ããã¹ã¯ãªããã æ±ºå®çã«å®è¡ã§ãããã®ã¯ãã¹ãŠããšãŒãžã§ã³ããæžããŠèªåã§ãããã°ããã¹ã¯ãªãããã¹ã¯ãªãŒã³ã·ã§ããååŸã¹ã¯ãªããããã¢ããªã®ã³ãŒããšåãããã€ãã©ã€ã³ã®ç£ç©ã å
šã³ãããã«ã²ãŒãã iOS ã¿ãŒã²ããã¯å
šã³ãããã§ã³ã³ãã€ã«å¿
é ââã¯ãã¹ãã©ãããã©ãŒã ã®è
æã¯æåŸã§ã¯ãªãæ°åã§æãŸãã 1 ç»é¢ = 1 ã¿ã¹ã¯ = 1 ã³ãããã 䞊ååã¯å
±æå¥çŽïŒããŒããããã²ãŒã·ã§ã³ãã³ã³ããŒãã³ãïŒã®ã³ãããåŸã«ã®ã¿è§£çŠã æ€åã¯äºåŸã§ã¯ãªãã«ãŒãã®å
åŽã«ã 人éãã¬ãã¥ãŒããåã«ããšãŒãžã§ã³ãã®ã¹ã¯ãªãŒã³ã·ã§ããã¯åãµã€ãã®ã¹ã¯ãªãŒã³ã·ã§ãããšå¯Ÿæ±ºãæžãŸããŠããã ãã® 5 ã€ã®æ ¹åºã«ããå§¿å¢ã¯ 1 ã€ã§ãã :::message çæã¹ãããã¯ä¿¡é Œããªãââå
å²ããã æ±ºå®çã«ã§ãããã®ïŒã¹ã¯ãªãããã³ã³ãã€ã«ã²ãŒããå¥çŽãã¹ãïŒã¯ãã¹ãŠæ±ºå®çã«ãããšãŒãžã§ã³ãã®èªå·±æ¡ç¹ã«ããã¹ã¯ãªãŒã³ã·ã§ããæ¯èŒã¯ããã¹ãŠã®ã²ãŒãã§äººéãåã¬ãã¥ãŒããã ::: 8. éçããæ£çŽã« 16 ç»é¢äž 12 ç»é¢ã¯ãŸã ãã¬ãŒã¹ãã«ããŒã ç»é¢åäœã§ç·åœ¢ã«ã¹ã±ãŒã«ãã äœæ¥ ã§ãã£ãŠãäžçºã®éæ³ã§ã¯ãªãã åã蟌ã¿ã³ã³ãã³ã ïŒåç»ãå°å³ããµãŒãããŒãã£ãŠã£ãžã§ããïŒã¯ãã¬ãŒã¹ãã«ã㌠+ expect/actual ã®ç§»è¡ãã©ã³ã©ãŸããå
±éã³ãŒãã« WebView ãšããéãéã¯ãªãã èŠãç®ã®æ¢ç¥ã®å·®åïŒP2ïŒã ã¯ããŒã«ã§ååŸã§ããªãã¢ã€ã³ã³çŽ æãšããŒããŒã®è£
食ã€ã©ã¹ãããã©ã³ããŠã§ã€ãã®æ©åŸ®ãèŠç©ãç»é¢ã¯åºå®ããŒã¶ãã® content inset ããªããäžç«¯ã®ã³ã³ãã³ããé ããŸãïŒ6.4 ã®ã¹ã¯ãªãŒã³ã·ã§ããïŒãiOS ã®ãžã§ã¹ãã£ãŒã®è³ªæã¯å®æ©æ€èšŒãå¿
èŠã ã¯ããŒã«ãæããã®ã¯ããããŒãã¹ã ãšã©ãŒç¶æ
ãæ·±ãããŒãžããŒã·ã§ã³ãããŒãœãã©ã€ãºãA/B ããªã¢ã³ãã¯èšé²ã«å«ãŸããªãã èªã¿åãå°çšã 31 ãªãã¬ãŒã·ã§ã³ãã¹ãŠ GETãäŒå¡ãšãªã¢ã¯ã¹ã³ãŒãå€ãèŠç©ãã®ãä¿åããæ¬¡ãžããã¢ããªå
ã§ã¯æžã蟌ãŸããéžæå
容ãç©ãã URL ã§åãµã€ãã«åŒãæž¡ããŸãââ ãªããã®ã¯æ³åã§è£ãã web ã«æ»ã ããã©ã³ã¶ã¯ã·ã§ã³ç³»ã¯æ¬¡ãã§ãŒãºã§ãå€ãã®ãããã¯ãã«ãšã£ãŠã¯ãã¡ããé£ããååã é©çšç¯å²ã¯èªç€Ÿãµã€ãã®ã¿ã èªèšŒæ
å ±ãšæš©å©ãèªåãæã€ãµã€ãåãã®éå
·ã§ãã£ãŠãä»ç€Ÿãããã¯ãã®ã¹ã¯ã¬ã€ãã³ã°éå
·ã§ã¯ãªãã 9. ããŒããããã«ãšã£ãŠã®æå³ ã³ã¹ãæ²ç·ã¯å転ããŸããããã€ãŠã¢ããªåã§æãé«ãã€ããéšåââã¢ãã€ã«åãã¶ã€ã³ïŒãµã€ããã¬ã¹ãã³ã·ãçãæã€å ŽåïŒããã€ã©ãŒãã¬ãŒããäºéã®ããŒã¿å±€ã仿§åããã®ç¶æââããããŸãæãå®ãéšåã§ãã人éã®åŽåã¯æ¬åœã«å€æãèŠãå Žæã«éäžããŸãïŒã©ã®ç»é¢ã P0 ãããã©ã³ãã¯äœãèŠæ±ããããäœã Web ã«æ®ããã çŸå®çãªããŒã åïŒ ãšã³ãžã㢠1 人 + ãã€ãã©ã€ã³ ã§ãäž¡ãã©ãããã©ãŒã ã§åãã¬ãã¥ãŒå¯èœãªãã«ãã«å°éïŒæ¬èšäºã®ç¯å²ã§ã¯ P0 ã® 4 ç»é¢ãŸã§ãæ®ã 12 ç»é¢ã¯åãæé ã®å埩ã§ãïŒããã€ãã£ãã®ã¹ãã·ã£ãªã¹ãã¯æåŸã® 10%ïŒãžã§ã¹ãã£ãŒã®è³ªæãåã蟌ã¿ãã¬ã€ã€ãŒãã¹ãã¢åãã®ç£šã蟌ã¿ïŒã§åæµãã2 ããŒã ã§ 1 幎ããšã¯ãŸã£ãã奿¬¡å
ã®äºç®äŒè©±ã§ãã ãŸãšã ã¢ããªãã¡ãŒã¹ãã¯ãäºç®ã®åé¡ã§ããããšãããã ããŒã«ãã§ãŒã³ã®åé¡ ã«ãªããŸããã ããªãããã§ã«éçšããŠãããã® Web ãµã€ãã¯ãå®ã¯ 3 ã€ã®ãã®ãå
ŒããŠããŸãã 仿§æž ïŒããŒãžãšãããŒïŒ ãã¹ãããŒã¿ ïŒå® API ãã©ãã£ãã¯ïŒ åãå
¥ãåºæº ïŒã¢ãã€ã«ã¹ã¯ãªãŒã³ã·ã§ããïŒ AI ãã€ãã©ã€ã³ã®ä»äºã¯ãã® 3 ã€ãèªã¿èŸŒãããšã ããCompose Multiplatform ã®ä»äºã¯ããã®çµæããã¹ãŠã®ç«¯æ«ã§åããããšã ãã ãããã¯ãã®å±
å ŽæãšãŠãŒã¶ãŒã®å±
å Žæã®ããã ã®è·é¢ã¯ãããŸã幎åäœã§ã¯ãªã æ¥åäœ ã§ããåãã«ãããŸãããã åèãªã³ã¯ ç·åç éä¿¡å©çšåå調æ»ïŒä»€å7幎調æ»ïŒ ç·åçæ
å ±éä¿¡æ¿çç ç©¶æ 什å6幎床 æ
å ±éä¿¡ã¡ãã£ã¢ã®å©çšæéãšæ
å ±è¡åã«é¢ãã調æ»ïŒæŠèŠïŒ eMarketer â Mobile Internet: Average Time Spent in the US, App vs. Browser JetBrains â Compose Multiplatform 1.8.0: iOS Is Stable and Production-Ready Android Developers Blog â Android's Kotlin Multiplatform announcements at Google I/O and KotlinConf 25 WebKit â Web Push for Web Apps on iOS and iPadOS















