
ãã©ãŠã¶ã®æ¡åŒµæ©èœã¯ãå€ãã®äººã«æãããŠãããŠããŒã¯ãªçŸè±¡ã§ãããœãããŠã§ã¢é åžã®ä»ã®æ¹æ³ã«ã¯ãã¯ã©ã€ã¢ã³ãéšåããæš¡å£ãããããã®åæ§ã®ã¡ã«ããºã ããããŸããã ããšãã°ãEvernoteãã¹ã¯ãããã¯ã©ã€ã¢ã³ã-ãã©ã³ãã倧ããããããšã¯ã§ããŸãããããŒã¯ããŒããäœæããããšã¯ã§ããŸãã-äžéšãã€ããªãã¡ã€ã«ãšäžéšCSSããããã³ã°ããå Žåã®ã¿-ã¯ã©ã€ã¢ã³ãã®ãšãã£ã¿ãŒã¯Webãã¯ãããžãŒã䜿çšããŸãã æè¿ã®ç§ã®Googleæ€çŽ¢ã¯æ¬¡ã®ããã«ãªããŸãã

ããã€ãã®æ¡åŒµæ©èœããããŸã-ããŒã¯ããŒããç»åä»ãã®2ã€ã®ãã¬ãã¥ãŒïŒã¡ã€ã³ãã¬ãã¥ãŒãšããŒãžïŒãJSãªãã§ããŠã¹ããããªã³ã°ããŠãã¬ãã¥ãŒãiframeã«èªã¿èŸŒã-ããã«ããèªã¿èŸŒã¿ãéããªããã¹ã¯ãªãããªãã§åäœãããµã€ãã確èªããæ®ãã®ãã¹ãŠãç解ããã®ãé¢çœãã¢ãã¡ãŒã·ã§ã³ã¯çŽç²ãªã¹ã¿ã€ã«ã§äœæãããŸãã ãŸãããããã®æ¡åŒµæ©èœã¯ã¹ãã¢ããæ€åºããã³ã€ã³ã¹ããŒã«ãããŸãã-ã¹ã¯ãªãŒã³ã·ã§ãããšäœããã®ã»ãã¥ãªãã£ãã§ãã¯ããããŸã-ã€ãŸããåãµã€ã/ãµãŒãã¹ã¯ã¢ããªã³ãæé»çã«ååšããç°å¢ã«ååšããŸãã 人æ°ã®ãããµãŒãã¹ãã©ããäžå¿«ãªå Žåãã³ãã¥ããã£ã¯ãè€æ°ã®ãµãŒãã¹ããã®ããŒã¿ã1ã€ã®ããŒãžã«è¡šç€ºããããšãã«ãmeshapãŸã§å€æŽãè¡ããŸãã DOMãµãŒãã¹ã®ææè ãŸãã¯CSSã¯ã©ã¹åãå€æŽãããšã 誰ãã®ã¯ãŒã¯ãããŒãå£ãå¯èœæ§ããããŸã ã
userscryptãšuserstyleã®ãããã§ããµã€ãã®å€èŠ³ãšæ©èœãå€æŽããããšãã§ããŸã-ç§ãã¡ã®å€ãã¯ãæ¥åžžäœ¿çšãµãŒãã¹çšã«ç¬èªã®ã«ã¹ã¿ã ã·ã£ãŒãããŒãæã£ãŠããæ¹ã楜ããå ŽåããããŸãã ããšãã°ãMacã§ã¯ãäœè ãæ°ãã€ããªããã°Finderãæãããããšã¯ã§ãããããŒãèšå®ã®ããã®ãµãŒãããŒãã£ã®ãããã³ã°ãæ©èœããªããªãããšã確èªããŸããã ãã©ãŠã¶ã®ãã¹ãŠããªãŒãã³ãœãŒã¹-ããŸããŸãªèšèªããã€ããªã«ã³ã³ãã€ã«ã§ããWebAssemblyãåŸ ã€ãŸã§ã
æ°å¹ŽåãFirefoxã®æåã®æ¡åŒµæ©èœãå®è¡ããŸãããYandexãä»ãã翻蚳è ã¯ããŸããã§ããã DOMããŒãžãè©°ãŸãããªãããã«ãã·ã¹ãã ã®ãããã¢ãããŠã£ã³ããŠã«ç¿»èš³ã衚瀺ããŸããã

ããŸããããŸããã ããŒã¯æã8kãŠãŒã¶ãŒãå°ãè¶ ããŠãã°ã©ãã£ãã¯ã¹ã®æžå°-æ¡åŒµæ©èœãæ©èœããªããªã£ãFirefox 57以éïŒ

é·ãéæ¢ããŠããŸããã§ããããä»æ¥ã¯å€ããã©ãŠã¶ã§100人ãšæã£ãŠããŸããã ãã®çµéšã®è¯å®çãªè©äŸ¡ãšè¯ãã¬ãã¥ãŒãåæ©ä»ããè¿œå ããŸããã

ãã®æ¡åŒµã¯ãéå¶å©ã®å人çãªããããããžã§ã¯ãã§ãã-瀟å ã®ã€ã³ãã¥ããŒã¿ãŒã®æåã®çµéšãšæ¡åŒµã¯åæ¥çã«æåããã¯ãã§ãã 補åã®äžå¿ã«ããã®ã¯ãå©çšå¯èœãªæé«ã®é³å£°ããããã¹ããžã®çæãµãŒãã¹ã§ããAmazon Pollyã§ãã Googleã¯æè¿ãåæããªãªãŒã¹ããŸãããWaveNetã¯åºåã®äººã®ããã«èãããŸããããå®éã«ã¯å質ãæªãã 4åãé«äŸ¡ã§ããã
ããã¯ãšã³ãã®æåã®ããŒãžã§ã³ããŸãã¯ããŒã«ã«ãã·ã³ã®æåã®ãããã¿ã€ãã¯ããã«ãã€ã³ãµãŒããŒäžã®Pythonã§äœæãããŸããïŒå¿ èŠãªå Žåã¯ããã¬ãŒã ã¯ãŒã¯ã«é²ãåã«ãã«ãã€ã³ãç¥ãããšã¯èå³æ·±ãã§ãïŒã äž»ãªãåé¡ãã¯ãããã¹ãããã£ã³ã¯ã«åå²ããããšã§ãã-1,500æåã®å¶éïŒãã¹ãŠã®ããã¹ãèªã¿äžãAPIã«ã¯ã»ãŒåãå¶éããããŸãïŒã æåã®ãããã¿ã€ãã¯æ°é±éã§å®æããŸããã
ã»ãšãã©ãã¹ãŠã®æºåãæŽã£ãŠããããã«èŠããŸãã-ãŸããUIããµã€ããä»ã®ãã®ããããŠå€ãã®ãŠãŒã¶ãŒãããã§ãããã
ã¡ã€ã³ã®ã¿ãŒã²ãããã©ãããã©ãŒã ã¯ãæããã«äººæ°ã®ããGoogle Chromeã«ãªããŸããã 圌ã¯èªåã®WebExtensionsãã©ã®ããã«æ©èœããããç 究ãå§ããŸããã æçµçã«ã¯ããã®ãã©ãŒãããããµããŒããããŠããFirefox 57ã«ç»å Žããã°ããã§ããããšãããããŸãããã€ãŸããChromeãšFirefoxãããã«ã¯Operaã®Edgeã§ãã³ãŒãã1ã€æžãããšãã§ããŸãã ãããŒãç§ã®å€ãæ¡åŒµæ©èœã¯Firefoxã§ããæ©èœããŸããã§ããããçŸåšã¯ããŒãžã§ã³57ãŸã§ã§ããæè¿ãGoogle Chromeã®æ¡åŒµæ©èœãéçºããããšããããªããä»æ¥ã®Firefoxã§åäœããå¯èœæ§ãé«ãã§ãã ãããŠãæ¡åŒµæ©èœã®äœè ãããã«ç ©ããããªãã£ããšããŠã-ã¢ããªã³ã¢ãŒã«ã€ããChromeã¹ãã¢ããããŠã³ããŒãããŠFirefoxã«ã€ã³ã¹ããŒã«ã§ããŸã-ç§ã¯ãFirefoxã®60ããŒãžã§ã³ãããWebExtensionsã®å®è£ ãå®å®ããå€ãã®åäŸãã¡ã®åé¡ãåãé€ãããšèšããã§ãããã
æåã¯ããããããããã¢ããUIã§ãµãŠã³ããåçããŸãã-ããã¯æ¡åŒµãã¿ã³ãã¯ãªãã¯ããŠã€ã³ã¿ãŒãã§ã€ã¹ã衚瀺ããããšãã«è¡šç€ºãããŸããããã®ãŠã£ã³ããŠãéãããšããã«è¡šç€ºãããŸã-ãã®éåžžããŒãžã¯ã¡ã¢ãªããã¢ã³ããŒãããããµãŠã³ãã®åçãåæ¢ããŸãã OKãããŒãžã¹ããŒã¹ããåçããŸã-ããã¯åé¢ãããäžçãšåŒã°ããDOMã®ã¿ãæ¡åŒµæ©èœã䜿çšããŠããŸããããªãªãžã³ã¯æ¡åŒµæ©èœã®ãŸãŸã§ãïŒèšå®æã«ããŒãžãžã®ã¢ã¯ã»ã¹æš©ãèŠæ±ããªãå ŽåïŒã é³ãã¯ããŒãºããšã¯ã¹ãã³ã·ã§ã³ã§åçãããŸããããããã§å®éã«ã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒãç¥ã£ã-ç§ã¯ã¡ãã£ã¢ã§åçããŸããã§ãã-ããã¯ã¡ãã£ã¢èŠçŽ ãã©ãããæ¥ãã®ããæ確ã«ç€ºããŠããããšãå€æããŸããã ããªãããã¬ã€ã§ãã3çªç®ã®å Žæ-èæ¯/ã€ãã³ãããŒãžãæ®ã£ãŠããŸãã åæ¡åŒµæ©èœã«ã¯3ã€ã®ãããŒãžãããããã¡ãã»ãŒãžãšéä¿¡ããŸãã ã€ãã³ãããŒãžãšã¯ãæ¡åŒµæ©èœãå¿ èŠãªå Žåã«ã®ã¿ã¡ã¢ãªå ã«ååšããããšãæå³ããŸããããšãã°ãã€ãã³ãã«å¿çïŒã¯ãªãã¯ïŒããæ°ç§éåç¶ããã¢ã³ããŒãããŸãïŒService Workerãšåæ§ïŒã Firefoxã¯ãããŸã§ã®ãšãããããã¯ã°ã©ãŠã³ãããŒãžã®ã¿ããµããŒãããŠããŸã-æ¡åŒµæ©èœã¯åžžã«ããã¯ã°ã©ãŠã³ãã«ãããŸãã ã€ã³ã¹ããŒã«ãããŠãããã¹ãŠã®æ¡åŒµæ©èœã確èªããŸãããã€ãã³ãã«æ©èœçã«åå¿ããã ãã§ãããæãæåãªãã®ã¯Evernote Clipperã§ãã ç§ã¯ãããæåŠããããšã¯ã§ããŸããããã€ã³ã¹ããŒã«åŸããã©ãŠã¶ã¯æããã«é ããªããŸãã éããŠãããã¹ãŠã®ããŒãžã«å€ãã®ã³ãŒããåã蟌ã¿ãŸãã ããããããã¿ã³ãã¯ãªãã¯ãããšãã®å¿çãéããªããŸãããã°ããŒãã«ãã¬ãŒãã³ã°ã¯ãããæ£åœåããªããšæããŸãã ç§ã¯ããã«ã€ããŠæžããã
圌ãã¯ãããªãã®ãã©ã€ããŒããªGoogleããã¥ã¡ã³ãã«ããã³ãŒããããŒãžã«æ¿å ¥ããŸã-æ¡åŒµæ©èœãåããåããŒã±ãããã¬ã€ã¹ã«ã¯ãèªåããã³æåã®ã»ãã¥ãªãã£ã³ãŒããã§ãã¯ããããŸãã ç§ãç解ããŠããããã«ãChromeã§ã¯ããã§ãã¯ã¯èªåçã«è¡ãããŸã-人ã ã¯èŠåã ããèŠãŠãFirefoxã¯åžžã«èŠãŸã-ãããŠæã ç§ã¯ããã°ã§ãã®ããžã·ã§ã³ã®æ°ãããã©ã³ãã£ã¢ãæ¢ããŠããåºåãèŠãŸãã Opera-ãã«ããåçŸããæ¹æ³ã®èª¬æãšãšãã«ãéçºè åãã®ã³ãŒããæ·»ä»ããå¿ èŠããããŸãã Operaã®äžè¬çãªåé¡-ã¬ãã¥ãŒã¯éåžžã«é ããäŸãã°ãç§ãã¡ã®æ¡åŒµæ©èœã¯æ°ã¶æéåŸ ã¡è¡åã«ãããŸãã-ãããŠãŸã åºãå»ã£ãŠããŸããã ããã«ãããããããããæ¥ãOperaã®èª°ããã¢ããªã³ã®ã»ãã¥ãªãã£ããã§ãã¯ãå§ããŸãã-åéãããã¢ãŒã«ã€ãã®ããã·ã¥ãç§ãæäŸããã¢ãŒã«ã€ãã®ããã·ã¥ãšç°ãªãããã赀信å·ãåºããŸããã
Chromeã¹ãã¢ã§ã¯ãæ°ãæéã®æ¡åŒµæ©èœãåé€ããèããããçç±ã«ã€ããŠæšæºçãªã¡ãŒã«ãéä¿¡ããŸãã-補åã®èª¬æããããŸããã§ããã ç§ãã¡ã¯åœŒãã«æçŽãéããã³ã«ãããã«ã¯é»è©±ãããŸããã

Edgeã¯ããã€ãã®ããã«-äœããåäœããŸããã§ãããã devtoolsã¯éãã ãWindowsãã¬ãªãªãŒã¹ãã«ããè©Šã¿ãŸãã-åãããšã¯StackOverflowã«å°ããŸãã -çãã¯ãããŸããã
ãµãŠã³ããåçããŠãæ¡åŒµæ©èœã®ã¢ã³ããŒãã劚ããããªããšããåé¡ã«çŽé¢ããŸãã-ããã¯ãã°ãåŒãèµ·ãããé¢çœãåé¿çãæžããŸããïŒ
function _doNotSleep() { if (audioCurrent) { setTimeout(_ => { // only some http request, neither console.log() nor creating obj fetch(chrome.runtime.getURL('manifest.json')); _doNotSleep(); }, 2000); } }
䞊è¡ããŠããµãŒããŒåŽã§äœæ¥ãè¡ãããŸããã éçºè ã§ãããã¡ã³ã¿ãŒã¯ïŒãã®ãããžã§ã¯ãã§ã¯ã³ãŒããäœæããŸããã§ãããïŒãåŸæ¥ã®ãµãŒããŒã®ä»£ããã«ããŒã¿ããŒã¹ïŒAmazonã®NotOnlySQLïŒããã³Lambdaã«DynamoDBã䜿çšããããã«èª¬åŸããŸããã ä»æ¥ãç§ã¯ã©ã ãã楜ããã§ããŸã-ãããã¯ä»®æ³ãã·ã³ïŒRed HatããŒã¹ã®Amazon LinuxïŒã§ãããã€ãã³ããç§ã®å Žåã¯Amazon API GatewayãééããHTTPãªã¯ãšã¹ãã§å®è¡ãããŸãã ä»æ¥ãæãåºãã®ã¯é¢çœãã§ãããæåã¯ã©ã ããEC2ã§ã¯ãªãããšãç解ããŠããªãã£ããšãã«ãPythonãµãŒããŒã䜿çšããŠHTTPãåŠçããããšããŸããããã²ãŒããŠã§ã€APIãä»ããŠã©ã ããã€ã³ã¿ãŒãããã«æ¥ç¶ãããŠããããšãããããŸãã-ã€ãŸããåãªã¯ãšã¹ãã«å¯ŸããŠåå¥ã®ãµãŒãã¹ãã³ã³ãããŒãåŒã³åºãããšãããããŸããã HTTPã«å ããŠãã©ã ãã¯ä»ã®ã€ãã³ãïŒããšãã°ãããŒã¿ããŒã¹ã®æŽæ°ãS3ãžã®ãã¡ã€ã«ã®è¿œå ïŒã§èµ·åã§ããŸãã è² è·ãæ°çŸåã«å¢å ããå Žå-æ°çŸã®ã©ã ããåæã«èµ·åãããå Žå-ã¹ã±ãŒã©ããªãã£ã¯ããã®ãã¯ãããžãŒã®ã»ãŒã«ã¹ãã€ã³ãã®1ã€ã§ãã ã©ã ãã®å¯¿åœã¯æ倧5åã§ãã ã³ã³ããã¯åžžã«1ã€ã®ãªã¯ãšã¹ãã®ã¿ãåŠçããã³ã³ããã¯æ¬¡ã®ãªã¯ãšã¹ãã«èªåçã«åå©çšãããå Žåãšãããªãå ŽåããããŸãã ããã¯ãã¹ãŠéçºã¹ã¿ã€ã«ã«å°ãå€åããããããŸãã ã¹ããŒãã¬ã¹-ããŒããã©ã€ãïŒåã®ã¬ãã€ãïŒã¯äžæãã¡ã€ã«å°çšã§ãïŒã©ãããããã®ããŒããã©ã€ããã¹ããŒãã¬ã¹ã§ããå¿ èŠããããããŒã¿ã®æ倱ã«ãã被害ãæå°éã«æããããããã«é·ãéçããŠããŸãã-ã¯ã©ãŠãå ã®ãã¹ãŠã®ç¶æ ãgitã®èšå®ïŒã ã³ã£ããããŸããããä»ã§ã¯ãã®ãããªå°ããªè£œåã«æ¢ã«åæ°åã®ã©ã ãã䜿çšãããŠããŸãã ãããã®ãã€ã¯ããµãŒãã¹ãåé¢ãããšãã³ãŒããç°¡åã«ãªããŸãããã®ãªã¹ãç»é¢ã¯ãã€ã¯ããµãŒãã¹å šäœã§ããããã®ã³ãŒãç»é¢ã¯2çªç®ã®ç¬ç«ãããã€ã¯ããµãŒãã¹ã§ãã ã«ãããªã³ã°ã倱ãããšãè¯ãçç±ãç解ããŠããŸãã

ã©ã ãã¯äººæ°ãåããŠãããGoogle CloudãšMicrosoft Azureããã³Openstackã«ã¯ç¬èªã®é¡äŒŒç©ããããŸãã ãã¡ãŒã ãŠã§ã¢ã¯èªåçã«æŽæ°ãããŸã-ã»ãã¥ãªãã£ã®æŽæ°ãšPythonã®æŽæ°ã¯ç¬èªã«è¡ãããŸãã ä»ã®ãããžã§ã¯ãã§ã¯ããµãŒããŒã®ç€Ÿå ã§ãŸãLambdasãæ€èšããŸãã å人çãªãã€ã¯ããããžã§ã¯ãã®åé¡ã«ã€ããŠã¯ãã©ã ãã¯æ°ã»ã³ãã®è²»çšããããããåªããŠããŸããããšãã°ãæã«äžåºŠèªåçã«äœããéå§ããå¿ èŠãããå Žåãã©ã ãã¯è¯ã解決çã«ãªããŸãã é«è² è·ã®å ŽåãEC2ã®ã³ã¹ãã¯äžãããŸãããã¹ã±ãŒãªã³ã°ããã®ä»ã®ã¡ã³ããã³ã¹ã«åé¡ããªãå Žåã§ãã
DynamoDBã¯æ©èœããŸãããããã«ã€ããŠèšãããšã¯äœããããŸããïŒããŒã¿ããŒã¹å šäœã¯ãããæ°ã¡ã¬ãã€ãã§ãïŒã 圌ãã¯èªåçã«ã¹ã±ãŒãªã³ã°ããããšãçŽæããŸãã ããŒã¹ã¯äººæ°ããããããããšãã°èŒžåºçšã®å€ãã®æ¢è£œããŒã«ããããŸãã ããã«ãããšãã°ãPostgresãéãåã«-API Gatewayãä»ããŠDynamoDB APIã«çŽæ¥æ¥ç¶ã§ããŸã-äžéLambdaãªãã§ãã€ã³ããã¯ã¹ããã³ããŒãã«åã®ã¬ãã«ã§ã¢ã¯ã»ã¹ããªã·ãŒãèšå®ã§ããŸãã ãŠãŒã¶ãŒã¡ãŒã«ïŒããŒãã«ããŒïŒã¯æ€èšŒæžã¿ã®ããŒã¯ã³ããååŸãããŸã-ã²ãŒããŠã§ã€APIèªäœã以äžããã§ãã¯ããŸãïŒ

Lambdaã䜿çšããã«HTTPãšã³ããã€ã³ããäœæããå ŽåãApache Velocityæ§æã䜿çšããŠãAPIãå«ãAmazonãµãŒãã¹ãžã®å ¥åãªã¯ãšã¹ããèšè¿°ããåºåæ§é ãå€æŽã§ããŸããããšãã°ãããŒã¿ããŒã¹ãæŽæ°ããŸãã
#set( $unixtime = $context.requestTimeEpoch / 1000 ) { "TableName": "history", "UpdateExpression": "SET isNew = :isNew, updated = :updated", "ExpressionAttributeValues": { ":isNew": {"BOOL": $input.body}, ":updated": {"N": "$unixtime"} }, "Key": { "email": {"S": "$context.authorizer.claims.email"}, "utc": {"N": "$input.params('id')"} } }
ã²ãŒããŠã§ã€ããšã¯ã¹ããŒããããšãããã®ã³ãŒãã1è¡ã§ä¿åããããšã³ããã€ã³ãã«é¢ããä»ã®æ å ±ãšæ··åãããšã¯ã¹ããŒãããšã«è¡ã®äžŠã¹æ¿ããå€æŽãããå¯èœæ§ããããŸã-Gitaã§æ··ä¹±ã圢æãããããããã®ãããªã³ãŒãã®å€æŽã远跡ããã®ã¯ããå°é£ã§ãïŒ

æ¡åŒµãŠã£ã³ããŠãéããã³ã«ããªã¯ãšã¹ããããµãŒããŒãã«éä¿¡ãããŸã-å±¥æŽãšã¹ããŒã¿ã¹ïŒãªã¹ãã³ã°ãããŠãããã©ããïŒãåæãããã-ã²ãŒããŠã§ã€APIãDynamoDB HTTP APIã«çŽæ¥ã
æ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããéã«ã¢ã¯ã»ã¹èš±å¯ã¯å¿ èŠãããŸãã-çŸåšã®DOMãæäœããŠãµãŒããŒã«éä¿¡ããã ãã§ããã°ïŒã¢ã¯ã»ã¹èš±å¯ããªããŠããå ¬éæã«ã©ã®ã»ãã¥ãªãã£ã¹ãã£ã³ãæ¢ããŠããããæšæž¬ã§ããŸãïŒããããã¯å¿ èŠãããŸããã èªèšŒã®ããã«èŠªãµã€ããšéä¿¡ããããã®ã¢ã¯ã»ã¹èš±å¯ãå ¥åããå¿ èŠããããšæããŸãã-ããããããŸããããŸãã-Amazon Cognitoããid_tokenãèŠã€ãããªãå ŽåããŠã£ã³ããŠãéããšãAPI Gatewayã«ãªã¯ãšã¹ããè¡ããããšããã¢ã€ãã¢ãæãä»ããŸãã-> state_on_tokensããŒãã«ããã§ãã¯ãããLambda ïŒãããããã°ãããŒã¯ã³ãè¿ãããããŒãã«å ã®ãã®ã¬ã³ãŒããåé€ãããŸãã
HTMLããã®ããã¹ãã¯ãµãŒããŒïŒLambdaäžïŒã§ã®ã¿åãåºãããŸãããããã«ããããã©ãŠã¶ãŒããã³æåããããã¹ã/ HTMLãåä¿¡ãããšãã«åäžã®ãã€ã¯ããµãŒãã¹ã䜿çšã§ããŸãã 人æ°ãåºãŠè² è·ãå¢ãããšãã¯ã©ã€ã¢ã³ãïŒã©ã€ãã©ãªããããŸãïŒã§ããã¹ããåãåºãããšãå¯èœã«ãªããããé«éã«åäœããå¯èœæ§ããããŸãã
ããã¹ããšHTMLã¯ä¿åãããåä¿¡ãããµãŠã³ãã®ã¿ãS3ã«ä¿åããŸãã åãŠãŒã¶ãŒã«ã¯ç¬èªã®ãã©ã«ããŒããããŸãã èšäºãè¿œå ãããšããåãããã·ã¥ãæã€ãµããã©ã«ããŒããããã©ããã確èªããããå Žåã¯ãµãŠã³ããåå©çšããŸãã 2ã€ã®åäžã®èšäºãè¿œå ããããšã¯å¯èœã§ãããããããå°æ¥ãããã·ã¥ãäžèŽããå Žåã«èŠåããã§ãããã
ããã¹ããè¿œå ãããèªãã ãããæ¡åŒµæ©èœã«ã€ããŠã¯ãå人ã®ããããã£ã¹ããã£ãŒããšåæããã®ãè«ççã§ããããšã«åæããŸãã-ãã¡ãããç§ãèªåã§ãµãŒãã¹ãè¡ãã®ã§ããã®ãããªæ©èœãå¿ èŠã§ãã ä»æ¥ã®æé«ã®mp3ã«å ããŠãããå¹æçãªaacã䜿çšã§ããããšãå€æããŸãããAndroidã¯4çªç®ã®ããŒãžã§ã³ãããããåçããŸãã 1ãæã®éã圌ã¯oggãã£ã³ã¯ãåäžã®ãã¡ã€ã«ã«ã¹ãããããããŸããŸãªæ¹æ³ã§å¿ãããffmpegãlibavããã®ä»ãè©ŠããŠãAmazonãšãããžã§ã¯ããã°ãã©ãã«ãŒã«å¯Ÿå¿ããŸãã-é³ã¯æ¬ é¥ã§å€æããŸããã ç§ã¯å¥œããªããã«ãæå°éã®ãœãªã¥ãŒã·ã§ã³ã§åæ¢ããŸãã-å人çãªãã®ã¯ãããŸãã-1ã€ã®ãã€ããªããã°ã©ã ã¯oggãwavã«ãã³ãŒããïŒ oggdec ïŒããã€ãã®2çªç®ã¯aacããšã³ã³ãŒãããŸãïŒ fdkaac ïŒ -Pythonã¯ã·ã§ã«ã³ãã³ããå®è¡ããŸãïŒ
f'''cd /tmp; curl {urls} | /var/task/oggdec - -o - | /var/task/fdkaac -m5 - -o {episode_filename} --title="{title_escaped}" --artist='Intelligent Speaker' --album-artist='Intelligent Speaker' --album='Intelligent Speaker' --genre='Podcast' --date='{date}' --comment='Voiced text from {url_article or "email"}' '''
--commentsã«ã¯ãå ã®ããŒãžãžã®ãªã³ã¯ããããŸãïŒããã¹ããã¡ãŒã«ã§éä¿¡ãããªãã£ãå ŽåïŒ -iOSã§ã¯ãçµã¿èŸŒã¿ã®ããããã£ã¹ããã¬ãŒã€ãŒããªã³ã¯ã®èåŸã«ãããã®ãç°¡åã«è¡šç€ºã§ããããšãããããŸãã ã
ãŠãŒã¶ãŒãèšäºãè¿œå ããããšããåçãåãåã£ããšã-å®éããŠãŒã¶ãŒãããŠã¹ãåçãã¿ã³ã«ç§»åããŠããéã«ãHTMLããããã¹ããååŸãããã®ããã¹ãã®ããã·ã¥ïŒãªã³ã¯ãšããŠæ©èœããŸãïŒãè¿ããŸãã-ãµãŠã³ãã¯åæããããŸãŸã§ãã ç§ãèšäºãèŽãå§ãããšããããããé³å£°ã¯ããã¹ãå šäœã«å¯Ÿå¿ããŠããªãã£ãã®ã§ãå·»ãæ»ãäžã«åŸ ããªããã°ãªããªãå ŽåããããŸãã ãµãŠã³ãã®æåŸã®ãã£ã³ã¯ãã¬ã³ããªã³ã°ããåŸããã®ãã§ãŒã³ã§å¥ã®Lambdaãèµ·åãããŸããããã«ãããããããã£ã¹ãçšã®m4aãçæããããã£ãŒãxmlãã¡ã€ã«ãå€æŽãããŸãã
ã©ã ãã«ã¯ããã€ããŒããå¥ã®ã©ã ãã«è»¢éããéã®å¶éããããŸã -ããã128ãããã€ãã§ãã äŸå€ãã³ãã©ãæžããŸãã-å¥ã®äžç¶ãã±ããã䜿çšããŠããã¡ã€ã«ã®ããã·ã¥ããµãŠã³ãåæã©ã ãã«éä¿¡ããŸã;ãã±ããã¯ã1æ¥ã§ãã¡ã€ã«ãåé€ããããªã·ãŒã§æ§æãããŸãïŒæå°å€ïŒã
é³ããšã³ã³ãŒãããããã«Amazon Elastic Transcoderãæ€èšããŸããããããã®é³ã¯éçãããã¬ãŒãã§ããåŸãããªãããšã«é©ããŸãã-ãããŠãããè¯ãå§çž®ã®ããã«åçã欲ããã£ãã§ãã 圌ã¯ãµããŒãããæçŽãæžããŸãã-ãã®ãããªåºæ¬çãªãªãã·ã§ã³ããªããã©ãããŠå¥ã®å Žæã«ããããŸãã¯ç§ãäœããç解ããŠããªãã£ãã®ã§ããããïŒ åœŒãã¯ããšã³ã³ãŒãã£ã³ã°ã¯æ¬åœã«éçã§ãããšçããŸããïŒ

倧éã®ããã¹ããããå ŽåïŒ5åéã®å®äŸ¡ãªã©ã ãã§ã¯äžååãªå ŽåããããŸãïŒããããã£ãŠãæ倧CPUãèšå®ããŸã-äžåºŠã«6æéããšã³ã³ãŒãããã®ã«ååã§ãã
åãŠãŒã¶ãŒã¯Evernoteã®ãããªã€ã³ããŠã³ãé»åã¡ãŒã«ãæã£ãŠããŸã-é»è©±ã§é¢çœãèšäºã衚瀺ãããŸã-ã¡ãŒã«ããã°ã©ã ã調ã¹ãŠãªã³ã¯ãŸãã¯ããã¹ããïŒä»»æã®ããã°ã©ã ããïŒç§ã®ã¢ãã¬ã¹ã«éä¿¡ããããããã£ã¹ãã§ããã°ã©ã ã«åãæ¿ããŸã-æ°ãããšããœãŒãã¯ãã§ã«ããã«ãããŸã-ãã¬ã€ãéå§ããã²ããç¶ããŸãéªã®äžã§ããã«ã ããã¯ãRSSããã®æ°ããæçš¿ããšã«ã¡ãŒã«ãéä¿¡ãããµãŒãããŒãã£ã®ãµãŒãã¹ã䜿çšã§ããããšãæå³ããŸããããã¯ãããããã£ã¹ããšããŠããã°ã賌èªã§ããããšãæå³ããŸãã ãã®æ¡åŒµæ©èœã¯ãŸã æºåž¯é»è©±ã§ã¯æ©èœããŸããããã ããAndroidã®Firefoxããã³YandexBrowserã¯æ¡åŒµæ©èœããµããŒãããŠããŸããããã¿ã³ãæ©èœããªãUIã®ã¿ã衚瀺ãããŸãã ãŸãã¯ãiOSåãã®ããã°ã¬ãã·ãWebã¢ããªããã€ãã£ãããã°ã©ã ã®ããã«åŠçãããã®ãåŸ ã¡ãŸãã çä¿¡ã¡ãŒã«ã¯ãã§ã«ãã®ãããªæ©èœãæäŸããŠããŸãããéä¿¡ãããã¡ãŒã«ã«ã¯ãŸã ãªã³ã¯ããããŸãã
ã¯ã©ã€ã¢ã³ãã§æ€çŽ¢ãå®è£ ãããšãã«ãChromeã®èŠåã«ééããŸããã éåé·æéå®è¡ãããJavaScriptã¿ã¹ã¯ã«ã¯xxããªç§ããããŸãã ã ãŸããããã§ã¯äœãããã£ãããšåããããæ¹å€çã§ã¯ãªãã倧äžå€«ãç§ã¯æã£ãŠãçŸããChromeãããã¡ã€ã©ãŒãç 究ããããšã«ããã

å€ãã®æäœãåæç»ããããé ããªããŸãã
å¿ èŠãªããŒãã®ã¯ã©ã¹ããã£ã«ã¿ãªã³ã°ããã³å€æŽãããšããããçºçããããšãããããŸããã
search.addEventListener('keyup', function() { for (const node of nodes) if (node.innerText.toLowerCase().includes(this.value.toLowerCase())) node.classList.remove('hidden'); else node.classList.add('hidden'); });
ããŠãããªãã¯äœãã§ããŸããããããã倧ãããªã¢ãããŒããè©Šã¿ãããã«ç§ã«æ瀺ããããŸããïŒ
search.addEventListener('keyup', function() { const nodesToHide = []; const nodesToShow = []; for (const node of nodes) if (node.innerText.toLowerCase().includes(this.value.toLowerCase())) nodesToShow.push(node); else nodesToHide.push(node); nodesToHide.forEach(node => node.classList.add('hidden')); nodesToShow.forEach(node => node.classList.remove('hidden')); });
ããå€ãã®æäœãããå€ãã®ã³ãŒãããããäœæ¥ãã¯ããã«é«éã«ãªããŸããã

ããã§ã¯ãå®éã«ãã©ãŠã¶ãŒãå®è¡ããæäœãã¯ããã«å°ãªãããšãããããŸãã
補åãéçºããéã®æåã®æ±ºå®ã®1ã€ã¯ãåé€åŸã«ãã£ãŒãããã¯ãã©ãŒã ã衚瀺ããããšã§ãã éåžžã®Googleãã©ãŒã ã䜿çšïŒ

ãµã€ã/çéžã泚æããŸãã-圌ãã®ããŒããã©ãªãªã¯ãããã§ããã ããããä»ã®äººãç§ãã¡ã®ãµã€ãããã£ãããšãå€æããŸããïŒ

䌌ããããªè£œåã1ã€ãããŸãããç§ãšããŒã±ãã£ã³ã°æ åœè ã¯ããµã€ããžã®ã¡ã€ã³ãªã³ã¯ãæ©èœããªãç¶æ ã§åœŒã®Webãµã€ããç¬ããŸããã ããã§ãç§ãã¡ã¯ãã®èšèšã§æ°ã¶æéçããŸããã 次ã«ãã¡ã³ã¿ãŒã¯å¥ã®ããŒã ã«å¥ã®ãµã€ãã泚æããããšã«ããŸããã

ãããçŸåšã®å€èŠ³ã§ãã å®ç§ã§ã¯ãããŸããããæ¹åããå¿ èŠããããŸãããã¢ãžã£ã€ã«ã¢ãããŒãã奜ãã§ããæåã«äœããã®æ¹æ³ã§ãããè¡ãã次ã«æ¹åãè¡ããããããå°ãæ¹åããŸãã äœãæ¹åã§ããã®ãããããªãããã§ãã ãã®èšäºãæžãçç±ã®1ã€ã¯ããã£ãŒãããã¯ãåŸãããã§ãã
Larryããã®ãã£ãŒãããã¯ã¯æ¬ç©ã§ãã圌ã¯è£œåïŒãŸãã¯Amazonã®å£°ïŒããšãŠãæ°ã«å ¥ã£ãã®ã§ã圌ã®æ°ããæ¬ã«ããŽãä»ããŸããã 人ã ãæ ¡æ£ïŒèšäºãæžããããè³ã§èªãã§ç°ãªãè§åºŠããæãããšãïŒããã£ã¹ã¬ã¯ã·ã¢ã«ã€ã³ããªãžã§ã³ãã¹ããŒã«ãŒã䜿çšããŠããããšã«é©ããŸããã ããšãã°ãã¢ã¡ãªã«ã®ã³ãŒããããä»ããæè©ãèãã®ã¯çŽ æŽããããšããæè¬ã®æçŽãå±ããã
ãã¹ãã£ã³ã°ã®ããã«ããµã€ãã¯ããšããšGitHubã«ãã£ãŠéžæãããŸãã-ç§ã¯ãã§ã«ãã¡ã€ã³ãè¿œå ããæ©èœã䜿çšããŠéçãµã€ãã§äœæ¥ããçµéšããããŸããã ããããå€æããããã«ãSSL蚌ææžã䜿çšããŠãã¡ã€ã³ãGithubã«ä¿æããããšã¯äžå¯èœã§ãã ä»æ¥ã¯æ¢ã«å¯èœã§ãã ïŒä»æããïŒã2017幎ã«GitLabã«ç§»è¡ããŸããã ç§ã®äººçã§æåã®ciãæžããŠããµã€ãã1ã€ã®ãã©ã«ããŒããå¥ã®ãã©ã«ããŒã«ã³ããŒãããããã«ããªããã°ãªããŸããã§ãã-éçããŒãžãæ±ãæå°ã®ããã»ã¹ã§ãã ãã®ïŒæ³šæããŠãã ããïŒciã¯åžžã«æ©èœãããšã¯éããŸãã-GitLabã®åé¡ããããŸãããäžè¬çã«ã¯æºè¶³ããŠããŸãããæè¿ããã®ãããªå€ãããŽãããããšãããããŸãã

ãããŒããã®ã«ãªã¹ãæ§ã¯ãã³ãã¬ãŒããããç§ã«ãšã£ãŠæ¥œããã§ã

LastPassã¯æé©ãªããŒãžã§ã³ã瀺ããŸãã

ããŒãããŸã å€ãããŽãæã€ããã®æ¡åŒµåã¯ãããŸãããïŒ ç§ã¯åæ§ã® ãžã§ãŒã¯ãèŠãŸããã
ä»æ¥ããµã€ãã®CIã¯ããšãããHTML / CSS / JSãçž®å°ããŸã-ç§ã¯é·ãéãã®ãã¹ããã©ã¯ãã£ã¹ãå®è£ ããããšæã£ãŠããŸããããéåžžã¯æ°ã«ããŸãã-ããåªå 床ã®é«ãã¿ã¹ã¯ããããŸãã çž®å°åŸ-ãã¡ã€ã«ããšã«gzã¢ãŒã«ã€ããäœæãããŸã-ãã®ç¡æã®éçãã¹ãã£ã³ã°ã§ãContent-EncodingïŒgzipãåŸãããŸãããGoogleãããããäžäœã«ã©ã³ã¯ä»ãããããŠãŒã¶ãŒãããéãéãããšãé¡ã£ãŠããŸãïŒãããŠGitlabãããã«è²ããªãããã§ãïŒã
Ciã¯ããã«ããããªãã·ã³ã°æ¡åŒµæ©èœïŒãããã£ã±ãŒã·ã§ã³ããã³HTTP POSTïŒçšã«ãäœæãããŠããŸãã ããŒã«ã«ã§æåã§èµ·åããŸã-Gitæ¡åŒµæ©èœãååšãããµãŒããŒã«ãã蟌ãããšãã§ããŸã-ç§ãã¡ã®å Žåã¯VSTSã§ããããããŸã§ã®ãšããå¿ èŠã¯ãããŸããã ãµã€ãã¯ãµãã¢ãžã¥ãŒã«ã«ååšããŸã-ãããã1ã€ã®ãªããžããªãæã€äŸ¡å€ããããŸããããµã€ãã«å±ããªãã³ãŒããHitlabã«éãå¿ èŠã¯ãªããšèããŸãã-ããã«ãciãèµ·åããããã«ãªããŸããããç¹å®ã®ãã©ã³ãã«ããã·ã¥ãããšãã«ã®ã¿åéãããããã«ãµã€ããæ§æããããšã¯å¯èœã§ãã
æ¡åŒµUIã®æåã®ããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸããã

ãã®åŸãã¡ã³ã¿ãŒã¯ãã¹ã¿ãžãªãéåžžã®ãã¶ã€ã³ãäœæãããšè¿°ã¹ãŸããã

ããè¯ããã®ãå¿ èŠã ãšæããŸããã
ãããªã¢ã«ãè©ŠããŠã¿ãããšã«ããŸãã-åºæ¿ã®ãªãé¡ã®ãªãããšã«å察ãããã©ãŠã¶ã®äžéšã®ããã«æããããŸããããã¯ãèŠèŠã¹ã¿ã€ã«ãåãäŒç€Ÿã®ãã®ã§ãããããChromeã¹ãã¢ã§æ³šç®ãããå¯èœæ§ãé«ãŸããšæããŸãã ä»æ¥ã¯ããã¹ãŠãåãã§ãããšããæå³ã§ã¯ãªããšããããšããã§ã«èª¬æããŠããŸãã ä»æ¥ã®çµæïŒ

ãã®è£œåã®ç¹åŸŽã¯ãèªã¿ãããããã¹ããèªã¿ãããã¢ãŒããšããŠæ€åºããã ãã§ãªããæ¡ç¹çšã«ããã¹ããå·§åŠã«èª¿æŽããããšã§ã-ããšãã°ãããã¯ããŒã ãæ¥ä»ãåŒçšç¬Šãç°ãªãã€ã³ãããŒã·ã§ã³ã§èªãŸãããšãã«ã³ã¡ã³ãããªãŒãèãã®ã䟿å©ã«ãªãããã«ããŸãã ãŸã èšç»äžã§ããRedditããå§ããäºå®ã§ãã ãããããã§ã«éçºã®åæ段éã§ãHTMLèžççšã®ã©ã€ãã©ãªã®æ©èœãååã§ã¯ãªãããšãæããã«ãªããŸãã-ããšãã°ã[1]ã¯ããã«[1]ã®ãŸãŸ[2]ãã®ãããª[3]éšå[4]ã¯ãGoogle Docã¯ãŸã£ããåãäžããããŸããã§ããïŒããããç§ã¯æ»ã«ãããšæããŸããïŒ Chromeã¹ãã¢ã§ãµããŒãããŠããŸãïŒã 解決ç-ãŠã£ãããã£ã¢ã®å ŽåãGoogle Docã®å Žåã¯APIã䜿çšãããŸã-éžæããããã¹ããšããã¥ã¡ã³ãå šäœãååŸããããã®ããªãããŒãªã³ãŒã-ãã¹ãŠã®Googleãã©ã€ããžã®ã¢ã¯ã»ã¹èš±å¯ããŠãŒã¶ãŒã«æ±ããªãããã«ããŸãã ç§ãã¡ã¯ä»ã®å€æ°ã®äººæ°ãµã€ããéžæãããããã®èªæžããã§ãã¯/é©å¿ããŸããã
ããŒã±ãã£ã³ã°æ åœè ã®ã¡ã³ã¿ãŒã¯ããœãŒã·ã£ã«ãããã¯ãŒã¯ã®ããããã°ã絶察ã«å¿ èŠã ãšå€æããŸããã ç§ã¯éçãªããã¬ãŒãæ¢ãå§ããŸãã-é床ãã·ã³ãã«ããå®ããã»ãã¥ãªãã£ã®ããã éçãžã§ãã¬ãŒã¿ãŒã®è£œåãšããŠã®ã¿èªåçšã«ããã°ãéããå Žåããã¹ãŠã®æçš¿ã¯Gitaã«ä¿åãããŸãã ç§ã®èŠªåã
Goãèªãã åŸãé«éå®è¡ãšããããçš®é¡ã®æé©åãæ°ã«å ¥ã£ããããæå°éã®ãã¹ãã§ããHTTP GETãäœæããŸãããLambdaã®æ¹ãéãåäœããã°ãŒã°ã«ã®ãã³ãããŒã¯ã¯é«éã§ããããšãããããŸããã 次ã®ãã€ã¯ããµãŒãã¹ã¯æ¢ã«Goã§èšè¿°ãããŠããŸã-ä»ã§ã¯Pythonã®ä»£ããã«ã¡ã€ã³ã®ãµãŒããŒèšèªã«ãªã£ãŠããŸãã ã³ãŒãããã©ãŒãããããããã®çµã¿èŸŒã¿ã®ãgo fmtãããŒã«ã®ååšãæ°ã«å ¥ã£ãŠããŸããã¿ãããããŸããã誰ããæ°ã«å ¥ã£ãŠããŸãã JSONæååããªããžã§ã¯ãã«å€æããã«ã¯ãäºåã«æ§é ãèšè¿°ããå¿ èŠããããŸã-PythonãšJSã®åŸãä¿¡ããããªãããã«èŠããŸãã-ãªãã§ããïŒ é åãŸãã¯ã¹ã©ã€ã¹ã«containsïŒïŒã¡ãœããããªãããšã¯ããã«ããããã«ãªãããšãå€æããŸãã-ããããªãºã ãæè¿ããŸããããã®ãããªåºæ¬çãªããšã®ããã«ç¬èªã®ã«ãŒããèšè¿°ããå¿ èŠãããå Žåãããã¯æ¬åœã«æ£ããèšèªèšèšã§ããïŒ Go before Pythonã®ãã®ä»ã®å°ããªæ¬ ç¹-Lambdaãžã®ãããã€ã¯ã³ããŒãããå®è¡å¯èœãã¡ã€ã«ã§ã-ããšãã°ã6ã¡ã¬ãã€ãã§æ°ãããã€ãã®ã³ãŒãã§ã¯ãªãïŒæ°ç§åŸ ã€å¿ èŠããããŸãïŒãããã«å€ãã®ã³ãŒãïŒæœè±¡åã¬ãã«ãäœãå ŽåããããŸãããåäœããŸãïŒã ã³ã³ãã€ã«ãããã³ãŒããå®å šã§ãã-ã©ã³ã¿ã€ã ã§ãšã©ãŒãå°ãªãã3.5ã§Pythonã§åãæžãã-èšèªã¯åã§é«éã§ããïŒPythonã®åã¯æ€èšŒã®ã¿ãç®çãšããŠããŸãïŒãããç解ãããããå®å šã§ãã Golangã«ã¯ãæé»çãªã€ã³ã¿ãŒãã§ã€ã¹ãä»ããããã¯ã¿ã€ãã³ã°ã®é¡äŒŒç©ããããŸããæ£ââããã¡ãœãããããã°ããªããžã§ã¯ãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã«é©åããŸãã
ç§ã¯èããŸãã-ãªãGoã§Javaã奜ãã§ã¯ãªãã®ã§ããïŒ ç§ã¯èªåã§ãã¹ãããŸããã§ããããã©ã ãã§ã¯ã³ãŒã«ãã¹ã¿ãŒããé·ããªãããšãèªã¿ãŸããã ãã¶ããä»ã®ãã¹ãŠã®ã©ã ããæããä¿ã¡ãJavaã䜿çšããã©ã ããæžãããšãã§ããŸãã ãã¯ãããžãŒã«é£ã³ä¹ãã®ã¯å¥œãã§ã¯ãªããçŸåšã®ã¹ã¿ãã¯ãããæ·±ãããŠæ¹åãããã®ã§ãããããã§ã¯Goã®ã¹ããŒãã«å ããŠãæ¥çã«ããå šäœçãªè¯å®çãªè©äŸ¡ãšãLamdesãããããµããŒãããŠãããããAmazonã¯ãã¹ãŠã®SDKãGoã§äœæããŸãã-ããã¯ãã¯ãããžãŒã§ã競åäŒæ¥ãã-移è¡ã¯äŸ¡å€ããã£ãã ç§ãã¡ã®å°ããªäŒç€Ÿã§ã¯ãå¥ã®ãããžã§ã¯ãã§ãPythonããGoã«åãæ¿ããŠããŸãã
Goããã ãå°ãã³ããŒããããšã¯å°ãäŸåãããããè¯ã ããšããã¹ããŒãã¡ã³ãã®1ã€ã奜ãã§ããããããç§ã®ã¢ãããŒã®1ã€ã§ããã€ãŸãã5è¡ç¯çŽããããã«ã©ã€ãã©ãªã匷æããªãããã«ããŠããŸãã ç§ã®ãæ°ã«å ¥ãã®æ¡åŒµæ©èœã®1ã€ã«ã¯639ã®äŸåé¢ä¿ããããæ³åã§ããŸãã

æ¡åŒµæ©èœã®åæ段éãããã³ã³ããã¹ãã¡ãã¥ãŒããåçããããšãå¯èœã§ãããåçäžã¯ããã£ã³ã¯ãååŸã«äžæåæ¢ããŠå·»ãæ»ãããšãã§ããŸããã

ããããUIãæ©èœãæãªãããšã«ãã䟿å©ã«ããããšã決å®ãããŸãã-ãµãã¡ãã¥ãŒã®ä»£ããã«ãããŒãžãŸãã¯åŒ·èª¿è¡šç€ºããããªã¹ããè¿œå ããã¢ã€ãã ã1ã€ã ãã«ãªããŸããã

ãã®æ±ºå®ã¯å°é£ã§ããããã¡ã€ã³ã¹ããŒãªãŒã¯åŸã§èãããã«ããŒãžãè¿œå ãããã®ãšèããŠããŸãããããã«èãããšãã§ããŸããæ¡åŒµãŠã£ã³ããŠãéããŠåçããã ãã§ãã
ããªããèŠãããšãã§ããããã«ãããŽãå€æŽãããŸãã-ãµã€ãã®ãããã¿ã€ãã³ã°äžã«ã女ã®åã®ãã¶ã€ããŒã¯ãã£ãããå ¥ããŸãã-ãã®æ£æ¹åœ¢ã¯ãªãŠã ãããç§ãã¡ã«ããèŠããŸããã
ãã¹ãïŒSeleniumã¯æ¡åŒµãŠã£ã³ããŠãéãããšãã§ããªããããã¯ãªãã¯ãšscikit-imageã§pyautoguiãšçµã¿åãããŠäœ¿çšââããäºæ³ãããã€ã¡ãŒãžãšçŸåšã®ã€ã¡ãŒãžãæ¯èŒããŸããç§ã¯ããããã£ãããšããããŸãããé¢çœãã§ã-ãã®æ¹æ³ã§CSSããã¹ãã§ããŸãã
äžå¹ŽäžïŒããã³ãã以åïŒããã¹ãŠã®ã³ãŒããWimeã§æžããŸãããããã®çŽ æŽããããšãã£ã¿ãŒã«ã€ããŠããã«åŠã³ãŸããã Wimaãæ¬åœã«çç£çã ãšæãããšããæ¥ãŸããããœãããŠã§ã¢ã®éæ³ã®å¹³åãããããç¹ã§ãç§ã«ãšã£ãŠãWimã¯æé«ã®éšåãæ§æããæ¥çã®ç¹åŸŽãšãªã£ãŠããŸããç¬èªã®ã¹ã¿ã€ã«ããããŸãããããŠãããã¯å€ãã®å Žæ-sshã©ãã§ã-ã«äºåã«ã€ã³ã¹ããŒã«ãããŠãããäœæ¥ç°å¢ã¯äŸ¿å©ãªãŸãŸã§ãAndroidã§ããã®ãŸãŸäœ¿çšã§ããŸãããã©ã°ã€ã³ã¯æ©èœãæ¡åŒµããæè¿ã§ã¯éåæäœæ¥ããµããŒããããŠããŸãããªã³ã¿ãŒã¢ãã©ã€ã¶ãŒã以åã®ããŒãžã§ã³ã®ã®ããã®ãã³ã¯ãèŠãæ©èœããªãã¡ã¯ã¿ãªã³ã°ïŒãã¹ãŠã®å Žæã§é¢æ°ã®ååãå€æŽïŒãã³ãŒãã®ããã¯ããŒã¯ãã«ã©ãŒããã¯ããã®è²ã§åŒ·èª¿è¡šç€ºãããã©ãã§ãæã-ç§ã¯å€éšã®ããã€ãã®ã¢ãã¿ãŒã®ã€ã³ããªãžã§ã³ãIDEAã§èŠããŠããŸããã³ãã¹ããŒã®çªã®çœããã¬ãŒã ãåãé€ãããšã¯äžå¯èœã§ããããã³ããäœææã®ããã¥ã¡ã³ããå€éšãŠãŒãã£ãªãã£ãšã®çµ±åãªã©ãããæŽç·Žããããã©ã°ã€ã³ãèŠãŸããããWimã«ã¯éåžžã«å€ãã®ããšãé ãããŠããŸã-éžæããããã¹ããžã®å€éšã³ãã³ãã¯ãããšãã°æåæ°ãèšç®ããããã«ç°¡åã«å®è¡ã§ããŸãïŒwcïŒãŸãã¯éžæããããã¹ãã®ç¿»èš³ïŒtransïŒã Wimã§äœããã§ããªããšããèŠæ ãäœåºŠãè³ã«ããŸããããå®éã«ã¯å¯èœã§ãããŸãã察å¿ãããã©ã°ã€ã³ã䜿çšããŠSalesforceã§äœæ¥ããæ©äŒããããŸãã -ãªã¢ãŒããµãŒããŒã§WimããçŽæ¥ãã¹ããå®è¡ããŸããã誰ããWimãŸãã¯Emaxã§åããŠãããšèãããšããã©ã®ããã«ããªãŒãã³ã°ãšããŠèªèããããèŠããŠããŸãããããã¯ç§ã«ãèµ·ãããŸãããè©ŠããŠã¿ãããšã¯ãå§ãããŸãããåºæ¬çãªæäœæ¹æ³ãç解ããã«ã¯æéãããããŸãããã«ããæã«å ¥ããã«ã¯æéãšåŽåãå¿ èŠã§ãã
Chromeã¹ãã¢ã§ã®ä»æ¥ã®åæïŒ

12æãã2æãŸã§ã®æé·çã®å€å-ããªãŒãèªããã¹ãŠã®èšèªã«æ¡åŒµæ©èœã®ããŒã«ã©ã€ãºãè¿œå -ããšãã°ããã©ã³ã¹ã®åé¡ã«ã€ããŠã¯ãä»ã§ã¯é«ããªã£ãŠããŸãããµã€ããããŒã«ã©ã€ãºããŠãåãå¹æãåŸããããšæããŸãããµã€ãçµ±èšïŒ


ææåºåã¯ãããŸãããããªãŒã¬ããã¯ãã©ãã£ãã¯ã®ã¿ã§ãããæé·ã¯èšç»ãããäœããªããŸããã6人ãæé¡6.99ãã«ã§ç³ã蟌ã¿ãŸãããããããæéã®çµéãšãšãã«ãæ°ã¯å¢ãå§ããŸããã©ãæããŸããïŒ
ããã¯ç§ã®å¹Žã®ç©èªã§ãã