EEGããŸãã¯è³æ³¢èšé²ã¯ãè³ã®é»æ°ç掻åãç£èŠããæ¹æ³ã§ãã éåžžãè³æ³¢ã®ç 究ã§ã¯ãããã€ãã®é»æ¥µãé ã®è¡šé¢ã«é 眮ãããè³ã«äŒŽãé»æ°çŸè±¡ãèšé²ããŸãã ç»é²çµæã¯è³æ³¢ã®åœ¢ã§èšé²ãããŸãã ãããã®ããŒã¿ãå®éšãããšããã¢ã€ãã¢ã¯ãç§ã«ãšã£ãŠéåžžã«èå³æ·±ããã®ã§ããã EEGã¯éåžžå»çç®çã§äœ¿çšãããŸãããè³ã®é»æ°ç掻åã«é¢ããããŒã¿ã䜿çšããæ°ããæ¹æ³ãæäŸãããããžã§ã¯ããæè¿ç»å Žãå§ããŠããŸãã
ãã®ãããªãããžã§ã¯ãã®1ã€ãMuseã§ãã ãã®ã¯ãªãšãŒã¿ãŒã¯ãçæ³ãæããã·ã¹ãã ãçŽ250ãã«ã§è²©å£²ããŠããŸãã BluetoothããµããŒãããåªããEEGãããã»ãããå«ãŸããŠããŸãã ãã¥ãŒãºã¯å¿ãèœã¡çãããæ¹æ³ãæããã¹ãã§ããããWebãã©ãŠã¶ãŒã§ãããã»ããã®ããŒã¿ãæäœããæ¹æ³ã«æ°ä»ããåŸã«åããŠå¿ãèœã¡çããŸããã
ïŒçŠããããŠèŠã€ããããªãå Žåã¯ãã³ãŒãã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãïŒã
ãããã»ããã¯ãAndroidããã³iOSã®ã¢ããªã±ãŒã·ã§ã³ã§åäœããŸãã ããã«ããããã»ããããåä¿¡ããããŒã¿ã«åºã¥ããŠç¬èªã®ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããã©ã€ãã©ãªããããŸãã ãã ãããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã®éçºã«ã®ã¿é©ããŠããŠããã®ãœãŒã¹ã³ãŒãã¯éããããŠããŸããïŒãã®çµæãæèã®åã§WebããŒãžã管çãããšããç§ã®å€¢ã¯ãäžèŠãäžå¯èœã«æããŸããïŒã
ng-cruiseã«ã³ãã¡ã¬ã³ã¹ã«å°çãããšãã Alex Castilloã«äŒããŸããã 圌ã¯ãOpenBCI EEGãããã»ãããã©ã®ããã«Angularã«æ¥ç¶ãããã«ã€ããŠè©±ããããããã®ä¿¡å·ãèŠèŠåããŸããã ãã®ãããã»ããã¯ããªãŒãã³ããŒããŠã§ã¢ãããžã§ã¯ãã®äžéšãšããŠäœæãããŸããã ãããã¯ãã¹ãŠéåžžã«å°è±¡çã«èŠããŸãããããããã»ããããã®ããŒã¿ãæäœããã«ã¯ãNode.jsãšWebãœã±ããäžã®ãµãŒããŒã«åºã¥ããããªãè€éãªã·ã¹ãã ã䜿çšããå¿ èŠããããŸããã ãããŠãããã¯ç§ãæãã§ãããã®ã§ã¯ãããŸããã§ããã ãããããã®åŸãå€ã®ããã«ãœã³ãããã誰ããEEGãããã»ãããå«ãããŸããŸãªéçã§äœãé¢çœãããšãããããšããŸããã ãã®çµæãããã¯å®å šã«èªç¶ãªããšã§ããã®ã§ãç§ã¯èªåã®å®¶ã«çŸãããã£ã³ã¹ãã€ããããšã«ããŸããã
Magic Blueé»çã§è¡ã£ãããã«ãMuse Bluetoothãããã³ã«ãéã«ããããšããŸããã çŽ1æéãè²»ãããåŸã誰ãããã§ã«ãããè¡ã£ãŠããå¯èœæ§ãããããšã«æ°ä»ããŸããã ç§ãèŠã€ããæ©èœçªå·ã®1ã€ãæ€çŽ¢ãã Alexander Barachantã«ãã£ãŠæžãããPython ã©ã€ãã©ãªã« ã¢ã¯ã»ã¹ãã ãã®çŽ æŽãããèšäºãèŠã€ããŸããã ãã®çµæãäºæ³å€ã«ãå¿ èŠãªãã®ã¯ãã¹ãŠæã£ãŠããŸããã ãããã muse-jsã©ã€ãã©ãªãŒã®ç±æ¥ã§ãã
ããã§ãWebã¢ããªã±ãŒã·ã§ã³ããMuseãããã»ããã«æ¥ç¶ããããããéãããŠããEEGããŒã¿ãæäœã§ããããã«ãªããŸããïŒãŸããããããªãŒã¬ãã«ãå é床èšããžã£ã€ãã¹ã³ãŒããªã©ã®ããŒã¿ãèªã¿åããŸãïŒã 次ã«ããã®ã©ã€ãã©ãªã«åºã¥ããŠè¡ã£ãããšã«ã€ããŠèª¬æããŸãã
ããŒããŠã§ã¢
ã³ãŒãã«é£ã³èŸŒãåã«ããŸãMuseãããã»ããã«ã€ããŠããå°ãããç解ããŠãã ããã ããããªãŒãå èµãããããã¥ã¢ããããã³ãã®åœ¢ã§äœãããŠããŸãã ãã¥ãŒãºã«ã¯4ã€ã®EEGé»æ¥µããããŸãã ãããã»ãããè£ çãããšããã®ãã¡ã®2ã€ãé¡ã®äžãç®ã®ããäžã«ãããããã«2ã€ãè³ã®é åã«ãããŸãã ããã«ã圌女ã«ã¯ãžã£ã€ãã¹ã³ãŒããšå é床èšãããããããã»ãããè£ çããŠãã人ã®é ã®åããç¥ãããšãã§ããŸãã Museã«ã¯ïŒMicro USBãä»ããŠïŒç¬èªã®é»æ¥µã«æ¥ç¶ã§ããå¥ã®EEGã»ã³ãµãŒããããšããäºå®ãæ¬åœã«æ°ã«å ¥ããŸããã è¿ãå°æ¥ãè©ŠããŠã¿ãäºå®ã§ãã
ãã®ãããã»ããã«ã¯2ã€ã®ããŒãžã§ã³ãããããšã«æ³šæããŠãã ããã 1ã€-2014幎ã2ã€ç®-2016幎ã Bluetooth Low Energyã䜿çšãã2016ããŒãžã§ã³ã確å®ã«ã楜ãã¿ããã ããŸãã 2014ãããã»ããã¯ãã¯ã©ã·ãã¯Bluetoothã䜿çšããŠå€éšãšéä¿¡ãããããWeb Bluetoothã§ã¯äœ¿çšã§ããŸããã
Museãããã»ãããµã³ãã«2016ã AF7ããã³AF8é»æ¥µã¯é¡ã«ãããŸãã é»æ¥µTP9ããã³TP10-è³ã®è¿ã
Jetã¹ããªãŒã ãšRxJS
ã©ã€ãã©ãªãäœæãããšãã«ãçä¿¡EEGããŒã¿ã衚瀺ããæ¹æ³ãéžæããå¿ èŠããããŸããã Web Bluetoothã䜿çšããå Žåãæ°ãããã±ãããåä¿¡ããããã³ã«ã€ãã³ããçºçããŸãã åãã±ããã«ã¯ã1ã€ã®é»æ¥µããã®12åã®æž¬å®ãµã³ãã«ãå«ãŸããŠããŸãã æ°ããããŒã¿ãåä¿¡ããããã³ã«åŒã³åºãããJavaScripté¢æ°ãç»é²ããããšãèããããŸãããRxJSã©ã€ãã©ãªïŒJavaScriptçšã®Reactive Extensions LibraryïŒã䜿çšããŠãããå®è£ ããããšã«ããŸããã ããŒã¿ã¹ããªãŒã ãæäœããããã®ã¡ãœãããå«ãŸããŠããŸãã ãããã¯å€æãäœæã§ããå¿ èŠãªãã®ã¯ãããããæœåºã§ããŸãã
RxJSã®åŒ·ã¿ã¯ãã©ã€ãã©ãªãMuseãããã»ããããåä¿¡ããçããŒã¿ã®ã¹ããªãŒã ãæäœããŠåŠçã§ããäžé£ã®é¢æ°ãæäŸãããããããããªãäœæ¥ã«äŸ¿å©ãªãã®ã«å€æããããšã§ãïŒããã«è¡ããŸãïŒã
å¯èŠå
æ°ãã
muse-js â
ã©ã€ãã©ãªã«åºã¥ããŠäœãã§ããããèãããšãã«æåã«æãæµ®ãã¶ã®
muse-js â
ããŒã¿ã®èŠèŠåã§ãã å€ã®ããã«ãœã³äžã«ãã¢ã¬ãã¯ã¹ãšç§ã¯ã¢ã³ã®ã¥ã©ãŒãã¥ãŒãºãããžã§ã¯ãã«åãçµã¿å§ããŸããã ããã¯ãè³æ³¢ããŒã¿ãèŠèŠåããé ã®äœçœ®ã衚瀺ããAngularã¢ããªã±ãŒã·ã§ã³ã§ãã
ç§ã®æåã®MuseããŒã¿èŠèŠåãããã¿ã€ã
å®éãMuseãšWeb BluetoothããµããŒããããã©ãŠã¶ãŒãããã°ã ãã®ããŒãžãéããŠèªåã§ãã¹ãŠãè©Šãããšãã§ããŸãã
ãã¥ãŒãºãã¢ã³ã®ã¥ã©ãŒãã¹ã ãŒãžãŒãã£ãŒãã䜿çšããè³ã®é»æ°ç掻åã®èŠèŠå
ãã®ã¢ããªã±ãŒã·ã§ã³ã䜿çšãããšããããã»ããããã®ããŒã¿ãå®éã«ãã©ãŠã¶ãŒã«å ¥ãããšãããããŸãã ãã ããæ£çŽãªãšããããã£ãŒãã芳å¯ããããšã¯èå³æ·±ãããšã§ãããããŒã¿ã§ä»ã«äœãã§ããªããã°ããã«ç²ããŠããŸãã§ãããïŒãã ãããã®èå³ã®åªå€±ããã£ãŒãã«ã©ã®ããã«çŸãããã¯èå³æ·±ãããšã§ã...ïŒã
ç¬ãéã«
EEG蚺æäžã«å®è¡ãããæäœã®1ã€ã¯ãé éšã®ããŸããŸãªé åã®é»äœïŒé»å§ïŒã®æž¬å®ã§ãã 枬å®ãããä¿¡å·ã¯è³æŽ»åã®å¯äœçšã§ãããè³ã®äžè¬çãªç¶æ ïŒéäžã¬ãã«ãäºæããªãåºæ¿ã®æ€åºãªã©ïŒãå€æããããã«äœ¿çšã§ããŸãã
è³ã®æŽ»åã調ã¹ãè³æ³¢èšé²æ³ã«å ããŠãçŒé»äœèšé²æ³ïŒEOGïŒãªã©ããããŸãã ããã¯ãç®ã®åããæ€åºã§ããç 究ã§ãïŒæ®å¿µãªããšã«ãç§ã®ã¬ãŒã«ãã¬ã³ãã¯èŠåç¯æ£ã®å°é家ã§ãã圌女ã¯ç§ã«äœãèµ·ãã£ãŠããã®ãã説æããŸããïŒã ãã¥ãŒãºã«ã¯ãç®ã®è¿ãã®é¡ã«2ã€ã®é»æ¥µããããŸãã ïŒãããã¯AF7ããã³AF8ãšåŒã°ããŸã-EEGã10-20ïŒ ãã§é»æ¥µãé 眮ããããã®æšæºã·ã¹ãã ã«åŸã£ãŠïŒããã«ãããçŒçéåã远跡ããæ©äŒãäžããããŸãã
人éã®ç®ã åã®è§èã¯æ£ã«åž¯é»ããŠããŸãã 網èãåŸéšãè² ã«åž¯é»
è³æ³¢ã®ãHello Worldãã®é»æ¥µããã®ä¿¡å·ã䜿çšããŠãç®ã®åãã远跡ããŠãŸã°ãããæ€åºããŸãã
ã¯ããã«
ãã®ããã«åäœããŸãïŒãããã»ããããã®EEGããŒã¿ã®ã¹ããªãŒã ãååŸããŸãïŒ
muse-js
ã¯ã芳å¯å¯èœãªRxJSãªããžã§ã¯ããšããŠãã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ãæäŸããŸãïŒã 次ã«ãå¿ èŠãªé»æ¥µïŒAF7ïŒããã®ããŒã¿ã®ã¿ãéžæããŸããAF7ã¯å·Šç®ã®äžã«ãããä¿¡å·ã®ããŒã¯ãã€ãŸã絶察å€ã500ÎŒVãè¶ ãããµã³ãã«ãæ¢ããŸããããã¯ããã®ãããªããŒã¯ã®ç¬éã®é»äœã®å€§ããªå€åã瀺ããŠããŸãã é»æ¥µã¯ç®ã®è¿ãã«ãããããçŒçã®åãã«ãã£ãŠå€§ããªé»äœå·®ãçãããšäºæ³ãããŸãã
ããã¯ãŸã°ããã®ç¬éãå€æããæãæ£ç¢ºãªæ¹æ³ã§ã¯ãªããããããŸããããç§ã®å Žåã¯éåžžã«ããŸããããŸããã ããã«ãã³ãŒãã¯ã·ã³ãã«ã§ãããããããã³ãŒãã§ããããšãããããŸããïŒãããã¯ãã¹ãŠããHello Worldãã®å åã§ãïŒã
EEGããŒã¿ã®æäœãéå§ããåã«ã
muse-js
ã€ã³ã¹ããŒã«ããŸãã
npm install --save muse-js
次ã«ãã©ã€ãã©ãªãã³ãŒãã«ã€ã³ããŒãããŸãã ãã®å ŽåãAngularã¢ããªã±ãŒã·ã§ã³-Angular CLIã䜿çšããŠäœæãããéåžžã®ç©ºã®ãããžã§ã¯ãã«ã€ããŠè©±ããŠããŸãã å¿ èŠã«å¿ããŠãReactãŸãã¯Vue.jsã䜿çšããŠãã®ãã¹ãŠãåçŸã§ããŸãããã®äŸã§ã¯ããã¬ãŒã ã¯ãŒã¯ã«ç·å¯ã«ãã€ã³ããããŠããã³ãŒãã¯ã»ãšãã©ãããŸããã
次ã«ã
muse-js
ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã³ã³ããŒãã³ãã«ã€ã³ããŒãããŸãã
import { MuseClient, channelNames } from `muse-js`;
MuseClient
ã¯ã©ã¹
MuseClient
ãããã»ãããšã®å¯Ÿè©±ãæ åœãã
channelNames â
ãã£ã³ãã«åã䟿å©ãªå€èŠ³ã«ãã£ã¹ãããããã«äœ¿çšãããåãªãé åã§ãã
ã³ã³ããŒãã³ãã§ãæ°ãã
MuseClient
ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
this.muse = new MuseClient();
次ã«ãããè€éãªãã®ã瀺ããŸãããããã»ããã«æ¥ç¶ããããã®ã³ãŒãã§ãã
Web Bluetoothã§ã¯ãæ¥ç¶ãéå§ããããã«ãŠãŒã¶ãŒã®ä»å ¥ãå¿ èŠã§ãã ãã®ãããã³ã³ããŒãã³ãã«ãã¿ã³ãè¿œå ããå¿ èŠããããŸãã ãŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ããåŸã«ã®ã¿ããããã»ããã«æ¥ç¶ããŸãã
onConnectButtonClick
ã¡ãœããã«ãããã»ããæ¥ç¶ããžãã¯ãå®è£ ããŸãã
async onConnectButtonClick() { await this.muse.connect(); this.muse.start(); // TODO: }
MuseClient
ãªããžã§ã¯ãã®
connect()
ã¡ãœããã¯ããããã»ãããžã®æ¥ç¶ãéå§ããŸãã 次ã«ã
start()
ã¡ãœããã¯ãããã»ããã«ã³ãã³ããéä¿¡ããŠãEEGããŒã¿ã®åéãšã¢ããªã±ãŒã·ã§ã³ãžã®è»¢éãéå§ããŸãã
Web Bluetoothã䜿çšããŠMuseãããã»ããã«æ¥ç¶ãã
次ã«è¡ãããšã¯ã
muse.eegReadings
察象ã®
muse.eegReadings
ãªããžã§ã¯ãã§å©çšå¯èœãªEEGããŒã¿ããµãã¹ã¯ã©ã€ãããããšã§ãïŒããã¯ãäžèšã®ã³ãŒãã§
TODO
ã³ã¡ã³ããããå Žæã§è¡ãããŸãïŒã
const leftEyeChannel = channelNames.indexOf('AF7'); this.leftBlinks = this.muse.eegReadings .filter(r => r.electrode === leftEyeChannel)
ãã®ã³ãŒãã¯ãããã€ã¹ããã®EEG枬å®å€ãåãå ¥ããå·ŠçŒã®äžã«ããAF7é»æ¥µã«é¢é£ãããã®ã®ã¿ãéžæããŸãã åãã±ããã«ã¯12åã®ãµã³ãã«ãå«ãŸãããã®çµæãç£èŠå¯Ÿè±¡ã¹ããªãŒã ã®åèŠçŽ ã¯æ¬¡ã®æ§é ãæã€ãªããžã§ã¯ãã«ãªããŸãã
interface EEGReading { electrode: number; timestamp: number; samples: number[]; }
electrode
å€æ°ã«ã¯ã
electrode
ã®æ°å€ã€ã³ããã¯ã¹ãå«ãŸããŸãïŒ
channelNames
é åã䜿çšããŠããã®ã€ã³ããã¯ã¹ãé»æ¥µã«å¯ŸããŠããç解ããããããŸãïŒã
timestamp
ã«ã¯ã枬å®ãè¡ããããšãã®æž¬å®éå§ããã®çžå¯Ÿæéãå«ã¿ã
samples â
12ã®æµ®åå°æ°ç¹æ°ãå«ãé åã§ããåèŠçŽ ã«ã¯1ã€ã®EEG枬å®å€ãå«ãŸãããã€ã¯ããã«ãïŒÎŒVïŒã§è¡šãããŸãã
次ã®ã¹ãããã§ã¯ãåãã±ããããæ倧å€ãéžæããå¿ èŠããããŸãïŒã€ãŸããæ倧åºåå€ã䜿çšãã枬å®ïŒã ããã§ãRxJS
map
ãªãã¬ãŒã¿ãŒã䜿çšããŠåä¿¡ããã¹ããªãŒã ãåŠçããç®çã®å€ãååŸããŸãã
this.leftBlinks = this.muse.eegReadings .filter(r => r.electrode === leftEyeChannel) .map(r => Math.max(...r.samples.map(n => Math.abs(n))))
ããã§ãéåžžã®æ°åã®ã¹ããªãŒã ãããã®ã§ãããããã£ã«ã¿ãŒåŠçããŠã500ãã倧ããå€ã®ã¿ãã¹ãããã§ããŸãããããã®å€ã¯ç¹æ» ã«å¯Ÿå¿ããå ŽåããããããããŸãã«å¿ èŠãªãã®ã§ãã
this.leftBlinks = this.muse.eegReadings .filter(r => r.electrode === leftEyeChannel) .map(r => Math.max(...r.samples.map(n => Math.abs(n)))) .filter(max => max > 500)
ãã®æ®µéã§ã¯ãåçŽãªRxJSããŒã¹ã®ãŸã°ããæ€åºãã€ãã©ã€ã³ããããŸãããããŒã¿ã®åä¿¡ãéå§ããã«ã¯ããŸã ãµãã¹ã¯ã©ã€ãããå¿ èŠããããŸãã éåžžã®
console.log
ããå§ããŸãããã
this.leftBlinks.subscribe(value => { console.log('Blink!', value); });
ãã®ã³ãŒããå®è¡ãããšããããã»ãããè£ çããŠãããšãã«å€ãã®ãç¹æ» ãã¡ãã»ãŒãžã衚瀺ãããå¯èœæ§ããããŸããããã¯ããã®æç¹ã§å€ãã®éçãã€ãºãçºçããããã§ãã ãããã»ãããå®å šã«è£ çããããšããã«ãç¹æ» ãããšãã®ã¿ã¡ãã»ãŒãžã衚瀺ãããŸãã
ããã°ã©ã ã¯ç¹æ» ã«å¿çããŸã
ç¹æ» ãããã³ã«ãããã€ãã®ãç¹æ» ãã¡ãã»ãŒãžã衚瀺ãããå ŽåããããŸãã ãã®çç±ã¯ãç¬ãããšã«é»äœã«ããã€ãã®å€åãçããããã§ãã äžèŠãªã¡ãã»ãŒãžãåãé€ãã«ã¯ãArduinoã§ã¡ã«ãã«ã«ãã¿ã³ãæäœãããšãã«äœ¿çšããããã®ãšåæ§ã®ã¢ã³ãããŠã³ã¹ãã£ã«ã¿ãé©çšããå¿ èŠããããŸãã
ãããã£ãŠããããžã§ã¯ãã«å¥ã®æ¹åãè¿œå ããŸããçããŒã¿ãã³ã³ãœãŒã«ã«åºåãã代ããã«ãç¹æ» ãæ€åºããããšãã«å€1ãçºè¡ããæåŸã®æœåšçãªå€æŽåŸ0.5ç§åŸ æ©ãã0ãè¿ããŸããããã«ãããè€æ°ã®BlinkïŒã€ãã³ããé€å€ãããŸããèŠãããïŒ
this.leftBlinks = this.muse.eegReadings .filter(r => r.electrode === leftEyeChannel) .map(r => Math.max(...r.samples.map(n => Math.abs(n)))) .filter(max => max > 500) .switchMap(() => Observable.merge( Observable.of(1), Observable.timer(500).map(() => 0) ) );
switchMap
ã®ç§å¯ã¯
switchMap
ã§ããïŒ ãããŠã次ã®ããšãèµ·ãããŸããæ°ããèŠçŽ ãå°çãããšã
switchMap
ã¯åã®ã¹ããªãŒã ãç Žæ£ããæå®ãããé¢æ°ãåŒã³åºããŠæ°ããã¹ããªãŒã ãäœæããŸãã ãã®æ°ããã¹ããªãŒã ã«ã¯2ã€ã®èŠçŽ ãå«ãŸããŸãïŒå€1ã
Observable.of
ã䜿çšããŠããã«çºè¡ããå€0ïŒ500ããªç§åŸã«è¿ãããŸãïŒããã¡ãããæ°ããèŠçŽ ã
filter
ã©ã€ã³ããå°çããŠ
switchMap
ãåèµ·åãã 0ã®æåŸ å€ãç Žæ£ããŸãã
ããã§ããã®èŠ³å¯å¯èœãª
leftBlinks
ãªããžã§ã¯ãã䜿çšããŠç¬ããèŠèŠåã§ããŸãã ãã®ããŒã¿ã¯ãéåæãã€ãã©ã€ã³ã䜿çšããŠAngularãã³ãã¬ãŒãã«é¢é£ä»ããããšãã§ããŸãïŒ
ãã®ã³ãŒãã¯ãç¹æ» æã«ç®ã®ã¢ã€ã³ã³ãé衚瀺ã«ããŸãã 代ããã«ãCSSã¯ã©ã¹ãåãæ¿ããŠãè²ã䜿çšããããç¹æ» æã«ç®ã®ã·ã³ãã«ãã¢ãã¡ãŒã·ã§ã³åãããã§ããŸãã
ãããã«ããŠããå¯èœã§ããã°ãçç®ã ãã§ãŸã°ããããŠã³ãŒãããã§ãã¯ããããšããå§ãããŸãã
åãã¢ãããŒãã䜿çšããŠReactã¢ããªã±ãŒã·ã§ã³ãäœæããå Žåããã®ç£èŠå¯Ÿè±¡ãªããžã§ã¯ãããµãã¹ã¯ã©ã€ãããç¹æ» ãããšãã«ã³ã³ããŒãã³ãã®ç¶æ ãæŽæ°ã§ããŸãã
this.leftBlinks.subscribe(value => { this.setState({blinking: value}); });
ããã§ãã£ãïŒ ããã«ãEEGãããã»ããã®ãHello WorldãããããŸãïŒ
ãHello Worldãã«å¯Ÿå¿
ãã㧠ããã®ãããžã§ã¯ãã®ã³ãŒããèŠã€ããããšãã§ããŸãã RxJSã³ãŒãã®æºåã«ååããŠãããBen Leshã«æ·±ãæè¬ããŸãã
ãŸãšã
æ°å¹Žåããè³æ³¢èšé²ããšããèšèã¯ãç é¢ãç 究æ©é¢ã«ããã¢ã¯ã»ã¹ã§ããªããããã°ããéåžžã«é«äŸ¡ãªæ©åšã«ã€ããŠã®èããåŒã³èµ·ãããŸããã ä»æ¥ãããªããç§ã®ãããªWebéçºè ã¯ããã©ãŠã¶ãRxJSãAngularãéåžžã«æé ãªäŸ¡æ Œã®ãããã»ãããªã©ã®éåžžã®ããŒã«ã䜿çšããŠãè³ã®é»æ°ç掻åã«é¢ããããŒã¿ãæ±ãããšãã§ããŸãã
ããããEEGã¯ããªãã®ãããã¯ã§ã¯ãããŸããããæ°ããäžä»£ã®ãã¹ããŒããããã€ã¹ãããã°ã©ããŒã«ãšã£ãŠå€ãã®èå³æ·±ãæ©äŒãçã¿åºãæ¹æ³ãèŠãã®ãæ¢ããããšã¯ã§ããŸããã ãããäœæã ïŒ
芪æãªãèªè ïŒ Webéçºã§EEGãããã»ããã䜿çšããå Žåãã©ã®ãªãã·ã§ã³ãæãèå³æ·±ããææã§ããïŒ