"ブラウザで「今すぐ」gemを読み込む方法" 大阪Ruby会議03での登壇資料です。 https://rubykansai.github.io/osaka03/
当日使用したデモページはこちら https://lnit.github.io/ruby-wasm-synthesizer/wave/
ϒϥβͰʮࠓ͙͢ʯHFNΛಡΈࠐΉํ๏େࡕ3VCZձٞ!MOJ@5ϧχ
View Slide
ࣗݾհw5XJUUFS 9*%!MOJ@5wډॅ౦ژwग़Վࢁwࠓͻ͞ͼ͞ʹؔʹؼ͖͍ͬͯͯ·͢
͓͠͝ͱ .FE1FFSαʔόʔαΠυϦʔυΤϯδχΞ ۀ༰ SBJMTOFX͔ΒσϓϩΠอक·ͰରԠ ୂ͕ෆ͍ͯ͠Δࣄۀʹೖͬͯ ͳΜ͔ྑ͍ײ͡ʹՐফ͠Λͯ͠ϦϦʔε ศར͞Μঢ়ଶʂ
ͭͬͨ͘ͷ ϒϥβͰ3VCZΛ͏ͱʜͨͷ͍͠ʂʂʂ SVCZXBTNήʔϜΛެ։ͨ͠Γ͍ͯ͠·͢
SVCZXBTN͓͞Β͍
SVCZXBTNͱ ϒϥβ্Ͱ3VCZ͕ಈ͘ ͦͷଞ8FC"TTFNCMZϥϯλΠϜͰ3VCZ͕ಈ͘
3VCZ,BJHJ͓͞Β͍IUUQTTQFBLFSEFDLDPNMFETVOMPBEHFNGSPNCSPXTS
8BTNͰHFN͑Δ͔ $47:".-ͳͲͷHFN͑Δ ಉࠝ͞ΕͨGVMMCVJME൛͕ެ։͞Ε͍ͯΔ SEQBSUZHFN͑ͳ͍ ˞ࣗྗͰϏϧυ͢Ε͑Δͷ༗ ͰHFN͍͍ͨΑͶʂʂʂ
+BWB4DSJQUͷྺ࢙ʹֶͿ +BWB4DSJQUಉ͡Λ๊͍͑ͯͨ OQNͷύοέʔδΛ OPEFKTϒϥβͲͪΒͰ͍͍ͨ
+BWB4DSJQUͷྺ࢙ʹֶͿ /PEFKT +BWB4DSJQUʹNPEVMF͕࣋ͪࠐ·Εͨ #SPXTFSJGZ શͯͷґଘ+4ΛϑΝΠϧʹ·ͱΊΔ *NQPSUNBQT ໊લͱύε 63-Λඥ͚ͮͯϩʔυͰ͖ΔΑ͏ʹ
Ξϓϩʔνํ๏" #VOEMJOHͯ͠εΫϦϓτΛϑΝΠϧʹ·ͱΊΔ# ࣮ߦ࣌ʹύεͷඥ͚Λ༻͍ͯ୳͠ʹߦ͘
Ξϓϩʔνํ๏" #VOEMJOHͯ͠εΫϦϓτΛϑΝΠϧʹ·ͱΊΔ# ࣮ߦ࣌ʹύεͷඥ͚Λ༻͍ͯ୳͠ʹߦ͘w #Λ࠾༻ͯ͠SFRVJSF@SFMBUJWF SFRVJSFͳͲͷ ࣮ΛਐΊ͍ͯ͘ʜw ͱ͍͏ͷ͕3VCZ,BJHJͷ͓Ͱͨ͠ɻ
ͦͷޙͷ 3VCZ,BJHJGPMMPXVQ SFRVJSF@SFMBUJWF͕ಈ͘Α͏ʹͳͬͨͱͷ͜ͱIUUQTTQFBLFSEFDLDPNMFETVOSVCZEPUXBTNOJHVBOTVSVKJOCVCBPHBP
ͦͷޙͷ ࠓޙଓใ͕དྷΔʜ͔ʜʁ
͓͞Β͍ɹ͓ΘΓ
ࠓͷ͓
ϒϥβͰʮࠓ͙͢ʯHFNΛಡΈࠐΉํ๏
Ξϓϩʔνํ๏" #VOEMJOHͯ͠εΫϦϓτΛϑΝΠϧʹ·ͱΊΔ# ࣮ߦ࣌ʹύεͷඥ͚Λ༻͍ͯ୳͠ʹߦ͘w ʮࠓ͙͢ʯಡΈࠐΉͳΒʲϓϥϯ"ʳͳͷͰʁ
3VCZίʔυΛ#VOEMJOH͍ͨ͠
SCϑΝΠϧΛ·ͱΊ͍ͨNBJOSCMJCSCMJCSCCVOEMFESC
ૄ݁߹ͳڥʹͳΔͷͰCVOEMFESCSVCZXBTN ϒϥβެࣜఏڙ Ϗϧυ൛ඞཁͳHFN
ҰॹʹͬͯΈΑ͏ʂ
ґଘ͕͔ؔΕʜNBJOSCʘSFRVJSFʗMJCSC
,FSOFMDBMMFS@MPDBUJPOT όοΫτϨʔεΛऔಘͰ͖Δϝιου
,FSOFMDBMMFS@MPDBUJPOT SFRVJSF࣌ʹDBMMFS@MPDBUJPOTΛऔಘ͢Ε ґଘ͕ؔΘ͔ΔͷͰʁ
,FSOFMDBMMFS@MPDBUJPOT SFRVJSF࣌ʹDBMMFS@MPDBUJPOTΛऔಘ͢Ε ґଘ͕ؔΘ͔ΔͷͰʁ SFRVJSFΛվͯ͠ॲཧΛՃ͠Α͏ʂʂ BMJBT@NFUIPE QSFQFOE
BMJBT@NFUIPE SFRVJSFϝιουʹผ໊Λ͚͓ͭͯ͘ ৽SFRVJSF͔ΒچSFRVJSFΛݺͿ͜ͱͰSFRVJSFΛ֦ு
QSFQFOE SFRVJSFΛ্ॻ͖ͭͭ͠TVQFSͰݩͷڍಈΛݺͼग़͠
SFRVJSFͷґଘ͕ḷΕΔ SFRVJSFKTPOͷྫ
/&95SFRVJSF@SFMBUJWF
SFRVJSF@SFMBUJWFͷ MJC CBTFSC NPEVMFTSC SFRVJSF@SFMBUJWF ݱࡏͷϑΝΠϧ͔Βͷ૬ରύεͰSFRVJSF͢ΔSFRVJSF@SFMBUJWFNPEVMFTSC
SFRVJSF@SFMBUJWFͷ MJC CBTFSC NPEVMFTSC QBUDISC QBUDISCͰSFRVJSF@SFMBUJWFΛॻ͖͑ΔͱʁSFRVJSF@SFMBUJWFNPEVMFTSC
SFRVJSF@SFMBUJWFͷ MJC CBTFSC NPEVMFTSC QBUDISCSFRVJSF@SFMBUJWFNPEVMFTSC
SFRVJSF@SFMBUJWFͷ MJC CBTFSC NPEVMFTSC QBUDISCSFRVJSF@SFMBUJWFNPEVMFTSCDBOOPUMPBETVDIfiMF
SFRVJSF@SFMBUJWFͷ SFRVJSF@SFMBUJWF ݱࡏͷϑΝΠϧ͔Βͷ૬ରύεͰSFRVJSF͢Δ ୯७ͳΦʔόʔϥΠυͩͱڍಈ͕มΘͬͯ͠·͏ʂ ͜·ͬͨ🤔
ઌਓʹֶͿ SVCZMJCTZOUBY@TVHHFTUDPSF@FYUSCSFRVJSFछʹBMJBT@NFUIPE͍ͯ͠Δ
ઌਓʹֶͿ SFRVJSF@SFMBUJWFʜʁݺͼग़͠ݩͷઈରύεରύεΛΈཱͯ
SFRVJSF@SFMBUJWFḷΕΔʂ
͜ΕͰ3VCZϑΝΠϧͷґଘ͕ؔྻڍͰ͖Δʂ
࣮ࡏͷHFNͰࢼ͢
࣮ࡏͷHFN ͓WJDUPSHFN
SFRVJSFΛḷΔ
ඪ४ϥΠϒϥϦল͘GPSXBSEBCMFඪ४ఴͳͷͰCVOEMFෆཁ
ґଘݩͱґଘઌͷه͕ྃ
ιʔείʔυΛల։ϑΝΠϧʹCVOEMFྃʂ
ϒϥβ͔Βϩʔυ )5.-ʹߦॻ͚ͩ͘ʂ
🎉ಈ͍ͨʂ🎉
3VCZͷ#VOEMFʁ
ͱ͍͏༁ʹ͍͔ͳ͍
ఢSFRVJSF͚ͩʹඇͣ
'JMFSFBEಈ͔ͳ͍ ෦Ͱ3VCZεΫϦϓτҎ֎Λࢀর͍ͯ͠Δ ύε͕ಈతʹมΘΔͷͰల։Ͱ͖ͳ͍
ղܾ๏ +4Ͱ'FUDIͯ͠ɺXBTNͷϑΝΠϧγεςϜʹ อ͓࣋ͯ͘͠ͱಈ͘ʂ
🎉ࠓͦ͜ಈ͍ͨʂ🎉
%FNP
SVCZXBTNTZOUIFTJ[FS
%FNP%FNPIUUQTMOJUHJUIVCJPSVCZXBTNTZOUIFTJ[FSXBWF
SVCZXBTNTZOUIFTJ[FS෦ղઆ
3VCZͰԻΛ໐Β͢
8FC"VEJP"1* 8FC"VEJP"1* Σϒ্ͰԻΛѻ͏ͨΊͷڧྗͳγεςϜΛఏڙ Իͷ߹ɺಛघޮՌ ΤίʔͳͲͳͲ͕Ͱ͖Δ BVEJPλάΑΓߴػೳ
8FC"VEJP"1* +BWB4DSJQUͰ͏߹ɺ "VEJP$POUFYUͷΠϯελϯε͕ඞཁʹͳΔ ͔͠͠ɺ3VCZ্ͰOFX͕Ͱ͖ͳ͍ʂconst ctx = new AudioContext();
3VCZͰAOFXA͢Δ +4FWBMΛ͏͜ͱͰ+4ͷΠϯελϯεΛऔಘՄೳ OFXແ͍͜ΕͰճආՄೳ@ctx = JS.eval('return new AudioContext')
3VCZͰAOFXA͢Δ ͜ͷSVCZXBTNWͰղফ͞Εͯ FWBMͳ͠ͰOFXͰ͖ΔΑ͏ʹͳΓ·ͨ͠ʂ@ctx = JS.global[:AudioContext].new
3VCZͰܗΛੜ͢Δ
ϧʔϓΛճͯ͠पظͷ͏ͱͳΔྻΛੜ
3VCZͰܗΛੜ͢Δ"VEJP$POUFYU͔ΒԻόοϑΝΛੜͯ͠ʜܗσʔλΛॻ͖ࠐΊྃ
ͷߴ͞Λඳը ઌఔల։ͨ͠7JDUPSͷίʔυͰܗΛՄࢹԽ
ԻݯΛ࠶ੜ"VEJP$POUFYU͔ΒԻݯΛ࡞ग़ྗʹͭͳ͛Δ࠶ੜ͢ΕԻ͕໐Δʂ
LFZEPXOΛर͏LFZEPXOΠϕϯτΛरͬͯΩʔʹԠͨ͡ԻΛ໐Β͢ʂ
Ի֊Λͭ͘Δ
8FC"VEJPͰԻ֊ EFUVOFϓϩύςΟΛࢦఆ͢ΕՄೳ Ի্ͷԻΛग़͢ʮʯΛࢦఆ PDU্ͷԻΛग़͢ʮʯΛࢦఆ ୯Ґʮηϯτʯ ηϯτˠԻҧ͍ υˠυ
8FC"VEJPͰԻ֊ ͔ΜͨΜʂ LFZ͝ͱͷԻ֊Λه͓͍ͯͯ͠ EFUVOFʹઃఆ͢Δ͚ͩʂ
,FZೖྗ,FZCPBSE ΩʔϘʔυ 1$ͰΩʔϘʔυ ָثΛ࣮ʂ ͜ͷ伴൫WJDUPS
ϑϧ3VCZͰ͍Ζ͍ΖͰ͖Δʂ
͓ΘΓʹ
͓ΘΓʹ ґଘؔΛల։ͯ͠HFNͷίʔυΛ·ͱΊͯΈͨ ϒϥβͰHFN͕͏͘͝ʂʂ ͔͠͠ɺᘳʹ·ͱΊΔͨΊʹ՝͕ଟ͍ ಈతʹGFUDIͰ͖ͨํ͕خ͍͜͠ͱ͕ଟͦ͏
ະରԠͷ՝ BVUPMPBE DPOTU@OBNF GFBUVSF ఆDPOTU@OBNFΛ࠷ॳʹࢀরͨ࣌͠ʹ GFBUVSFΛ,FSOFMSFRVJSF ͪ͜Β͢Δඞཁ͕͋Γͦ͏
ະରԠͷ՝ ͜͏͍͏͍͜͠SFRVJSF['Alice', 'Bob', 'Eve'].each do |klass_name|k_down = klass_name.downcase.internrequire "modules/#{k_down}"end
ϒϥβͰ3VCZΛ͏ͱͨͷ͍͠ʂ
એʂ ࠓޙͷొஃ༧ఆ দߐ3VCZձٞʢʣ SVCZXBTNͰ࡞ͬͨͷͨ͘͞Μ ,BJHJPO3BJMT ۚ 5VSCPͰਝʹαʔϏεΛ্ཱͪ͛Δ
ΤϯδχΞ৬ͷํɹੵۃ࠾༻தʂҰॹʹϝυϐΞͷࣄۀΛ৳͍͖͍ͯͨ͠ΤϯδχΞͷํɺ͓͓ͪͯ͠Γ·͢ʂςοΫϒϩάIUUQTISNPTDPQBHFTNFEQFFSKPCTϦʔυΤϯδχΞʢαʔόʔαΠυʣ ΤϯδχΞհIUUQTFOHJOFFSNFEQFFSDPKQ IUUQTUFDINFEQFFSDPKQٻਓ ϒϩά