Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
モダンWebシステム開発
Search
Naoya Ito
April 21, 2015
Technology
20k
132
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
モダンWebシステム開発
Qcon Tokyo2015 での発表スライド
Naoya Ito
April 21, 2015
More Decks by Naoya Ito
See All by Naoya Ito
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
4.2k
Haskell を武器にして挑む競技プログラミング ─ 操作的思考から意味モデル思考へ
naoya
13
4.6k
Haskell でアルゴリズムを抽象化する / 関数型言語で競技プログラミング
naoya
21
7.9k
Functional TypeScript
naoya
19
6.9k
TypeScript 関数型スタイルでバックエンド開発のリアル
naoya
77
38k
シェルの履歴とイクンリメンタル検索を使う
naoya
16
6.8k
20230227-engineer-type-talk.pdf
naoya
91
87k
関数型プログラミングと型システムのメンタルモデル
naoya
63
110k
TypeScript による GraphQL バックエンド開発
naoya
29
37k
Other Decks in Technology
See All in Technology
長期運営で肥大化したExcelマスターデータの解消に向けた移行事例
gree_tech
PRO
0
320
dbt in Microsoft Fabric
ryomaru0825
0
180
安全性・開発速度・ユーザー体験の あいだで考える 事業会社のプロダクトセキュリティ
mixi_engineers
PRO
0
100
ハッカソンで入賞した話 @ Findy LT
asari194617
0
1.5k
35分でわかるEffective Platform Engineering
nwiizo
5
610
【書籍出版記念】 10周回って、エージェント開発は RAGがすべてだった。〜RAGの歴史と開発現場で見えた実践知〜
akiratameto
18
6.7k
LLM・AIエージェントシステムベストプラクティス
shibuiwilliam
6
1.6k
国家プロジェクトを支える「さくらONE」 大規模LLM開発におけるGPU障害を乗り越えるクラスター運用戦略
gpuunite_official
0
260
AIに持続⼒を与える 判断の⻑期記憶設計
eiei114
1
670
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
4
26k
AI時代に、人は何を、どう学ぶのか #pbl_pub / What and How Do We Learn in the AI Era?
takaking22
1
240
2026-08-15 JAWS-UG 茨城 #16 Secrets ManagerにおけるSecret値の管理(Terraformの場合) / Secrets Manager Secrets
masasuzu
0
550
Featured
See All Featured
The Limits of Empathy - UXLibs8
cassininazir
1
610
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
350
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Building the Perfect Custom Keyboard
takai
2
850
Practical Orchestrator
shlominoach
191
12k
Technical Leadership for Architectural Decision Making
baasie
3
520
Product Roadmaps are Hard
iamctodd
55
12k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
280
30 Presentation Tips
portentint
PRO
1
380
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
540
Producing Creativity
orderedlist
PRO
348
40k
Transcript
Ϟμϯ8FCγεςϜ։ൃ /BPZB*UP ,BJ[FO1MBUGPSN *OD 2$PO50,:0
,BJ[FO1MBUGPSN͔Βདྷ·ͨ͠
ຊۀᲔ৫ϚωδϝϯτͰ͢ ϚΠφϏͰϚωδϝϯ τஊٛ࿈ࡌத
ຊͷͷྲྀΕ • ࡢࠓݸਓతʹؾʹͳͬͨΞʔΩςΫνϟɾ ύϥμΠϜ • ͦΕΒ֓؍ΛݟͭͭʮϞμϯ8FCγες ϜʯͷΛߟ ڞ௨ͨ͠Կ͔͕ݟ͍ͩͤ Δ͔ɺ൱͔
Ϟμϯʮεέʔϥϒϧʯͷཁ • ΫϥυωΠςΟϒ – յΕ͘͢ɺ'BJMVSF͘͢͠ɺԣʹεέʔ ϧ
Πϯϑϥ • *OGSBTUSVDUVSFBT$PEF – $IFG "OTJCMF • *NNVUBCMF*OGSBTUSVDUVSF • ίϯςφܕΫϥυ
– %PDLFS • એݴతͳγεςϜཧπʔϧ – 5FSSBGPSN 3PBEXPSLFS
ΞϓϦέʔγϣϯ • .JDSPTFSWJDFT • 3FBDU • 'VODUJPOBM3FBDUJWF1SPHSBNNJOH
݁ͱͯ͠Կ͕ݴ͍͍͔ͨ • ࡢࠓͷΞʔΩςΫνϟύϥμΠϜͷഎޙʹ͋ ΔςʔϚʮঢ়ଶʯʮґଘؔʯͱͲ͏ઓ͏ ͔ ͕ɺଟ͍ • ྑ͍ύϥμΠϜɺΞʔΩςΫνϟͦ͜ʹճ Λ͍࣋ͬͯΔ
Ϟμϯͱ͍͏͔ɺܭࢉػ ͷྺ࢙͕ͣͬͱͦ͏͍͏ ͷ͔
*OGSBTUSVDUVSFBT$PEF
*OGSBTUSVDUVSFBT$PEF • ϓϩϏδϣχϯάϑϨʔϜϫʔΫ – $IFG – 1VQQFU – "OTJCMF
αʔόʔͷʮঢ়ଶʯ ґଘؔ • ͋Δೲ͞Εͨ3BJMTαʔόʔ – 9݄9ʹ%/4ΩϟογϡΛઃఆͨ͠ – :݄:ʹϓϩηεΛνϡʔχϯάͨ͠ –
;݄;ʹSVCZͷόʔδϣϯΛ্͛ͨ – ŋŋŋ ͍Ζ͍Ζ܁Γฦ͠ • ͜ͷαʔόʔʹৼΓʹΞϓϦΛσϓϩΠ – Ռͨͯ͠σϓϩΠਖ਼͘͠ऴΘΔͷ͔
$IFG αʔόʔͷ͋Δ͖ঢ়ଶ Λએݴతʹهड़͢Δ
ঢ়ଶ͕ίʔυʹͳΕ͋Δ͖ঢ়ଶ ͷऩଋࣗಈԽͰ͖Δ
ঢ়ଶΛهड़͢Δ • ϓϩϏδϣχϯά'8ΛͲ͏ݟΔ͔ – ηοτΞοϓͷࣗಈԽ ŋŋŋ͜Εݶఆత – ຊ࣭ŋŋŋঢ়ଶͷ એݴతͳ هड़ ͦΕ·Ͱهड़͞Ε͍ͯͳ ͍͕ͨΊʹϓϩάϥϜ͔
ΒऔΓѻ͏͜ͱ͕Ͱ͖ͳ ͔ͬͨͷ
Ͳ͔ͬͰݟͨͧ • #VOEMFS – εΫϦϓτݴޠʹ͓͚ΔϥΠϒϥϦͷґଘؔ ͋Δ͋Δ
#VOEMFSҎલ • HFNJOTUBMMGPPCBS – άϩʔόϧͳྖҬʹΠϯετʔϧ – ΞϓϦέʔγϣϯͷಈ࡞ʹඞཁͳHFN͕Կ ͔໌ࣔతʹ͔Βͳ͍ – HFN͕૿͑Δ㱺ϑΝΠϧγεςϜΛίϐʔ ͢ΔҎ֎ͷํ๏ͰڥΛ࠶ݱ͢Δͷ͕ࠔʹ
#VOEMFS
#VOEMFSޙ • ঢ়ଶͷ એݴతͳ هड़ – ඞཁͳHFNΛ(FNpMFʹએݴ – ಉ͡ߏΛ࠶ݱՄೳʹ • ϕετϓϥΫςΟε – /PEFͷOQN
1FSMͷDQBOpMF
ͱ͍ɺ*OGSBTUSVDUVSFBT$PEF • ͜Ε·Ͱҙࣝ͞Εͯ͜ͳ͔ͬͨʮঢ়ଶʯʮґଘؔʯ Λهड़͢Δ • ႈੑ ͖ͱ͏ੑ – ͋Δૢ࡞Λճߦͬͯෳճߦͬͯ݁Ռ͕ಉ͡Ͱ͋Δ͜
ͱ 8JLJQFEJB – ಉ͡ߏͷϊʔυΛ͍ͭͰ࠶ੜ࢈Ͱ͖Δ ݁ՌɺյΕ͘͢ɺԣʹ εέʔϧ͢Δڥʹద߹
αʔόʔཧNFFUT(JU • αʔόʔͷঢ়ଶ͕ͯ͢ίʔυͰهड़Ͱ͖ ͨͳΒɺ(JUͰཧ͢Εྑ͍
ΠϯϑϥNFFUT(JUIVC ΠϯϑϥQVMMSFRVFTUɺίʔυϨϏϡʔ
ΠϯϑϥΛςετŋŋŋ4FSWFSTQFD
NBTUFSʹมߋ QVMMSFRVFTU͕ NFSHF͞ΕΔ $JSDMF$*͕ͦΕ Λݕͯ͠ɺίʔυ Λ(JU)VC͔Βऔಘ &$ʹରͯ͠ $JSDMF$*͔Β$IFG
ద༻ มߋ͕ө͞Ε Δ Πϯϑϥ$*ΛىʹσϦόϦʔ
3PBEXPSLFS hosted_zone "winebarrel.jp." do rrset "winebarrel.jp.", "A" do
ttl 300 resource_records( "127.0.0.1", "127.0.0.2" ) end rrset "winebarrel.jp.", "MX" do ttl 300 resource_records( "10 mx.winebarrel.jp", "10 mx2.winebarrel.jp" ) end end $ roadwork -‐-‐apply %/4ϨίʔυΛએݴతʹ هड़
5FSSBGPSN resource "aws_instance" "dev001_foobar_net" { ami
= "ami-‐xxxxxxxx" instance_type = "t2.micro" key_name = "xxxxxxxxxxxxxxxx" security_groups = ["sg-‐xxxxxxxx"] subnet_id = "subnet-‐xxxxxxxx" tags { Name = "dev001.foobar.net" Role = "common" Service = "operator" Env = "dev" } } $ terraform apply Πϯϑϥ Πϯελϯε ωοτϫʔΫ ߏΛએݴ తʹهड़
NBTUFSʹมߋ QVMMSFRVFTU͕ NFSHF͞ΕΔ $JSDMF$*͕ͦΕ Λݕͯ͠ɺίʔυ Λ(JU)VC͔Βऔಘ "84ʹରͯ͠ $JSDMF$*͔Β
SPBEXPSLFS UFSSBGPSNΛద༻ มߋ͕ө͞Ε Δ (JU)VCͰཧ͠$*Ͱద༻
એݴతͳγεςϜཧπʔϧ • 5FSSBGPSN3PBEXPSLFSŋŋŋϓϩϏδϣ χϯά'8ͱൃಉ͡ – ঢ়ଶΛએݴతʹهड़ – ݁ՌɺϓϩάϥϚϒϧ͔ͭಉҰͷϫʔΫϑϩʔʹ
ঢ়ଶΛ͏·͘ѻ͏ • ঢ়ଶΛ͏·͘ѻ͏ͱ༷ʑͳԸܙ – ࠶ݱՄೳੑ ϙʔλϏϦςΟ – ςελϏϦςΟ – Ϋϥυͷద߹ – ΑΓϓϩάϥϚϒϧʹ ͬ͘͟Γݴ͏ͱ
ʮεέʔϥϒϧʯ
*NNVUBCMF *OGSBTUSVDUVSF
ঢ়ଶΛཧ͠ͳ͍ • ϓϩϏδϣχϯά'8ঢ়ଶΛదʹهड़͢Δ ͜ͱΛࢦͨ͠ – ·ͣ·͢ޭͨ͠ • ͦͦঢ়ଶΛཧ͠ͳ͍ͱ͍͏ߟ͑ํͳ͍ ͷ͔
– 㱺*NNVUBCMF
*NNVUBCMF*OGSBTUSVDUVSF • %JTQPTBCMF$PNQPOFOUT • ෆมͳɺঢ়ଶΛ࣋ͨͳ͍ɺഇغՄೳͳ
*NNVUBCMFͱ͍͏ߟ͑ํ • ϓϩάϥϛϯάͰѻΘΕΔ֓೦ – ʮ*NNVUBCMFͳσʔλߏʯ – جຊతʹ ྑ͍࡞๏ ؔܕϓϩάϥϛϯά ʹ͓͚Δࢀরಁ໌ʹ ܨ͕Δߟ͑ํ
#MVF(SFFO%FQMPZNFOU
)FSPLV )FSPLVHJUQVTI͢Δຖɺ৽͍͠ڥ ίϯςφ Λ࡞Γɺݹ͍ڥΛغͯΔ
5SBWJT$* 5SBWJT$*ςετΛ࣮ߦ͢ΔͨͼɺίϯςφΛ࡞ΓऴΘͬͨΒغͯΔ
*NNVUBCMFΛ੍ʹ • มߋŋŋŋغͯͯ৽͍͠ͷΛ༻ҙ͢Δ – ݁ՌతʹɺΑΓغͯ͘͢ɺΑΓ࠶ݱ͢͠ ͍γεςϜʹ յΕ͘͢ɺԣʹεέʔ ϧ͢ΔڥʹΑΓద߹
*NNVUBCMFʙΛࢧ͑Δٕज़ ίϯςφ
%PDLFS
None
https://speakerdeck.com/jbeda/containers-at-scale
*NNVUBCMF ʮΞϓϦέʔγϣϯίʔ υʯ͕Քಇ͢Δॴ
ύλʔϯ • ϞμϯΠϯϑϥʹ͓͚Δঢ়ଶͷѻ͍ – ঢ়ଶΛهड़͠ཧՄೳʹ͢Δ – ෆมΛલఏʹɺঢ়ଶΛཧ͠ͳ͍ • มߋŋŋŋݹ͍ഁغɺ৽͍͠ͷΛ༻ҙ ಘΒΕΔͷ εέʔϥϏϦςΟ
.JDSPTFSWJDFT
.JDSPTFSWJDFT • Ұ࿈ͷখ͞ͳαʔϏεͰͭͷΞϓϦέʔγϣ ϯΛ։ൃ͢Δख๏ – ಠཱͨ͠খ͞ͳίϯϙʔωϯτ͕)551"1*Ͱ௨৴ – 㲈40"ɺͨͩ͠6/*9ͷσβΠϯʹ͍ۙ
source: Scaling with Microservices and Ver6cal Decomposi6on h:p://dev.o:o.de/2014/07/29/scaling-‐with-‐microservices-‐and-‐ver6cal-‐decomposi6on/
ͳͥ.JDSPTFSWJDFT • ϞϊϦγοΫͰͬͯ͘ΔͱͭΒ͍ – UZQP͢ͷʹશମϏϧυσϓϩΠ – ͋ͦ͜มߋͨ͠Β༧֎ͷͱ͜Ζ͕յΕͨ – "1*͚ͩεέʔϧ͍ͤͨ͞ͷʹશ෦ల։
• ಠཱͨ͠։ൃɾσϓϩΠαΠΫϧΛ֫ಘ͍ͨ͠ – ૄ݁߹ – ৫ͷಠཱੑΛߴΊΔ See Also: "Microservices"を読んだ h:p://deeeet.com/wri6ng/2014/09/10/microservices/
.JDSPTFSWJDFTͷΞϓϩʔν • ӨڹൣғΛہॴԽ͢Δ – 㲈ঢ়ଶΛؔ͋Δ෦͚ͩʹӅṭ͢Δ ͜Εܧଓతʹอक͍ͯ͠ ͘γεςϜʹ͓͚Δʮঢ় ଶʯͷऔΓѻ͍ͷઓུͱ ݴ͑Δ
.JDSPTFSWJFTͱ*NNVUBCMF *OGSBTUSVDUVSF • .JDSPTFSWJFTԽʹΑͬͯͻͱͭͷγεςϜ୯Ұͷ ׂͷίϯϙʔωϯτʹ • %PDLFSͳͲͷίϯςφΤϯδϯ୯Ұͷׂͷίϯ ϙʔωϯτ͕ڠௐಈ࡞͢ΔઃܭΛલఏ – º'BUͳ%PDLFSΠϝʔδ
– ˓ҰͭͷׂΛ୲͏%PDLFSΠϝʔδ .JDSPTFSWJDFTʹΑΓঢ়ଶ ͷӨڹൣғΛہॴԽ͠ɺͦ ͷΠϯϑϥෆมͳͷͱ ͠ɺಠཱੑΛߴΊΔ
ಘΒΕΔͷ • ίϯϙʔωϯτͷಠཱੑ – ։ൃαΠΫϧ – σϓϩΠαΠΫϧ – ͦΕ͚ͩͰεέʔϦϯά Γ ʮεέʔϥϒϧʯ
3FBDU
3FBDU
3FBDUKT • 'BDFCPPL • ࠒʹൃද • +BWB4DSJQUͷ7JFXϥΠϒϥϦ • ࠒ͔Βʹ
K2VFSZ ໋ྩతͳ%0.ૢ ࡞ίʔυ܈
%0.ૢ࡞ • %0.ૢ࡞ͷ͠͞ – %0.͕ঢ়ଶΛ͍࣋ͬͯΔ – άϩʔόϧ – ඇಉظ • ໋ྩతͳίʔυ ͍ͭɺͲ͔͜Βॻ͖ ͑ΒΕΔ͔Θ͔Β
ͳ͍ঢ়ଶΛؒҧ͍ͳ ͘ཧ͠ͳ͚Εͳ Βͳ͍
3FBDU σʔλϞσϧͷ ঢ়ଶʹมߋΛ௨ એݴతʹఆٛ͞ Εͨ%0.ߏ͕ Α͠ͳʹ࠶ඳը
એݴత • ໋ྩత – $16ʹର͢Δ໋ྩͷखଓ͖Λॻ͘ – ίϚϯυΛ༩͑Δ • એݴత
– ࣮ݱ͍ͨ͜͠ͱͦͷͷΛهड़͢Δ – ͋Δ͖ঢ়ଶΛఆٛɺؔੑͷهड़FUD see also: 宣言的プログラミングの「宣言的」って? h:p://d.hatena.ne.jp/sh-‐2/20091006/1254847253 ᐆດ͔ͭ૬ର తͳݴ༿Ͱ͋Δ ͷͷ
3FBDU໋ྩతˠએݴత • ໋ྩతͰ͋ͬͨ7JFXͷΈཱͯ %0.ૢ࡞ Λɺ એݴతͳύϥμΠϜʹ • ʮσʔλϞσϧʹมߋ͕͋ͬͨΒ%0.Λؙ͝ ͱߋ৽ʯ –
αʔόʔαΠυ – ඇޮͳ෦7JSUVBM%0.͕ղܾ ϑϩϯτΤϯυ6*։ൃΛɺ αʔόʔαΠυͱಉ͡ ߽తϓϩάϥϛϯάελ Πϧʹ͢
7JSUVBM%0. • 3FBDUͷόοΫΤϯυʹ͋Δ %0.ߏΛநԽͨ͠σʔλ ߏ • σʔλϞσϧͷঢ়ଶมԽʹ߹Θ ͤͯ7JSUVBM%0.ͷલޙͷ EJ⒎Λࢉग़ •
ੜ%0.࠶ඳըΛࠩͷ͋ͬͨ Օॴ͚ͩߦ͏ source: React’s diff algorithm h:p://calendar.perfplanet.com/2013/diff/
3FBDU͕ୡͨ͜͠ͱ • 6*։ൃʹ͓͚Δঢ়ଶཧ͔Βͷղ์ • ൃ໌ – 7JSUVBM%0. – εςʔτϨείϯϙʔωϯτΛ࣮ݱ͢Δσʔ λϑϩʔ
'MVY
'MVY • 3FBDU7JFX͚ͩ • 'MVYϞσϧ 4UPSF ΛؚΊͨΞϓϦέʔ γϣϯશମͷΞʔΩςΫνϟ – ॲཧͷهड़ॴΛఆΊΔ
– σʔλϑϩʔΛఆΊΔ • ΠϕϯτͷґଘؔͷෳࡶੑΛղফ – ΠϕϯτσʔλϑϩʔͷํΛҰํ௨ߦʹ͢Δ
3FBDU/BUJWF • 3FBDUͱಉ͡࡞๏ͰJ04"OESPJE • -FBSO0ODF 8SJUF"OZXIFSF
None
'31 'VODUJPOBM3FBDUJWF 1SPHSBNNJOH
ϦΞΫςΟϒϓϩάϥϛϯά • ͱͱҎԼͷΑ͏ͳ֓೦ – σʔλͷྲྀΕΛ௨ͯ͡มߋΛൖ – σʔλͷྲྀΕʹԠ – 㱺ΠϕϯτۦಈɺΦϒβʔόʔɺ"DUPSɺ'VUVSF •
ٛͷɺڱٛͷŋŋŋ͕͋Δ – ֦େղऍ͠Α͏ͱ͢ΔͱͲ͜·Ͱ͍͚Δ ཁҙ – ݸਓతʹ'31ͷจ຺Ҏ֎Ͱ͋·Γݴٴ͠ͳ͍Α ͏ʹ͍ͯ͠Δ
ʮ3FBDUJWFͬΆ͍ʯͱ • σʔλϑϩʔΛએݴతʹѻ͏ – σʔλͷؔੑΛએݴతʹද͍ͯ͠Δ͔ source: Reac6ve Programming in JavaScript
h:p://ahomu.github.io/s/150221-‐frontrend_conference/#39
'VODUJPOBM3FBDUJWF 1SPHSBNNJOH • ؔܕ ϦΞΫςΟϒ • )BTLFMMˠ$ -*/2ˠ3Y • ͦͷޙ
– 3Y+BWB – 3FBDUJWF$PDPB – 3Y+4 #BDPOKT –
ྫ ͱԡ͢ͱ Λԡ͢ͱ
໋ྩతʹॻ͘ • ΧϯλมΛ༻ҙ • ॳظΛඳը • Ϙλϯ͕ԡ͞ΕͨΒΧϯλΛ ͯ͠࠶ඳ ը •
Ϙλϯ͕ԡ͞ΕͨΒΧϯλΛͯ͠࠶ඳը
None
σʔλϑϩʔʹண͢Δ + + + + ·ͣɺ ϘλϯͷΫϦοΫΠϕϯτΛ࣌ܥྻʹԊͬͯྲྀΕͯ͘ΔϦετ ετϦʔϜޙड़ ͱߟ͑Δɻ ΠϕϯτετϦʔϜΛྲྀΕΔͱΈͳͤΔ
+ + + + ϚΠφεϘλϯಉ༷ʹߟ͑Δ -‐ -‐
+ + + + ϘλϯΠϕϯτɺ ͢Δ͜ͱɻ Ώ͑ʹͱ͍͏ʹม 5SBOTGPSN ͯ͠ΈΔ 1
1 1 1
ϘλϯΠϕϯτɺ͢Δ͜ͱɻ Ώ͑ʹͱ͍͏ʹม 5SBOTGPSN ͯ͠ΈΔ -‐ -‐ -‐1 -‐1
1 1 1 1 -‐1 -‐1 1 1 1 1
-‐1 -‐1 ;ͨͭͷΠϕϯτඇಉظʹࠞͬͯ͟ಧ͘ͷͰ͋Δ Ώ͑ʹೋͭͷετϦʔϜΛϚʔδ͢Δ
1 1 1 1 -‐1 -‐1 1 1 2 0
1 2 Ϛʔδ͞ΕͨετϦʔϜΛɺҰͭલͷͱͷࢉज़݁Ռʹม
1 1 2 0 1 2 ͕มԽ͢Δຖʹը໘Λ࠶ඳը ෭࡞༻
'31XJUI#BDPOKT
+ + + + Bacon.fromEvent(plusButton, 'click')
+ + + + -‐ -‐ Bacon.fromEvent(minusButton, 'click')
+ + + + 1 1 1 1 plusClickStream.map(1)
-‐ -‐ -‐1 -‐1 minusClickStream.map(-‐1)
1 1 1 1 -‐1 -‐1 1 1 1 1
-‐1 -‐1 plusStream.merge(minusStream)
1 1 1 1 -‐1 -‐1 1 1 2 0
1 2 bothStream.scan(0, (x + y) => x + y)
1 1 2 0 1 2 counterBus.onValue( /* ը໘ඳը */)
ͳΜ͔ͩΘ͔ͬͨΑ͏ͳ Θ͔Βͳ͍Α͏ͳŋŋŋ
ࠓճͷจ຺Ͱݴ͑ ண͖͢ʮετϦʔϜʯ
source: Reac6ve Programming in JavaScript h:p://ahomu.github.io/s/150221-‐frontrend_conference/#39
ඇಉظσʔλετϦʔϜ • શͯͷσʔλϑϩʔΛετϦʔϜͱͯ͠ѻ͏ – ୯Ұͷɺෳͷɺ1SPNJTF • ετϦʔϜΛϦετͱΈͳ͢ • Ϧετૢ࡞㱺ؔܕͷΠσΟΦϜͰૢ࡞Ͱ͖Δ •
ؔܕ – એݴత – ୈڃߴ֊ؔ – ࢀরಁ໌͔ͭ෭࡞༻Λආ͚Δ ہॴԽ͢Δ
ࢥߟͷྲྀΕ • ʮ࣌ؒͱڞʹมԽ͢Δͷσʔλܕ͕ཉ͍͠ʯ • 㱺ετϦʔϜΛಋೖ • 㱺Πϕϯτඇಉظॲཧ·ͰετϦʔϜʹ – ʮ͋Εɺશ෦ετϦʔϜͰѻ͑Δ͡Όͳ͍ ʯ
• 㱺શͯΛ౷Ұ͞ΕͨετϦʔϜͱ͍͏ΠϯλϑΣʔεͰ • 㱺ϦετΏ͑ʹؔܕͷΠσΟΦϜɺύϥμΠϜ – ʮϦετૢ࡞Ͱ͢ΔͳΒؔܕ͕Ԡ༻Ͱ͖Δ͡Όͳ͍ʯ • 㱺෭࡞༻Λආ͚ͨએݴతͳهड़ • 㱺ࢀরಁ໌ঢ়ଶཧ͔Βͷղ์
"OESPJEJ04Ͱ3FBDUJWF • 3Y+BWB3FBDUJWF$PDPBͷྲྀߦ • ͨͩ͠ɺ'31Λਖ਼໘͔Βಋೖ͢ΔͷͰͳ͘ศརͳϥ ΠϒϥϦͱͯ͠ݶఆతʹಋೖ͢Δͱ͜Ζ͔Β࢝ΊΔྫΛ Α͘Έ͔͚Δ – ศརͳίϨΫγϣϯૢ࡞ϥΠϒϥϦͱͯ͠ –
.77.ͷσʔλόΠϯσΟϯά࣮ͱͯ͠
·ͱΊ
τϨʔυΦϑ ྫ • *OGSBTUSVDUVSFBT$PEFֶशίετ • *NNVUBCMF*OGSBTUSVDUVSFڥߏஙίετ • .JDSPTFSWJDFTϞϊϦγοΫΑΓܥશମͷෳࡶੑ૿ ͢
• 3FBDUKTίʔυྔ૿͑Δ • '31ֶशίετ
εέʔϥϒϧŋŋŋঢ়ଶΛͲ͏ѻ͏͔ • എܠ – ࣌ͷཁ • ΫϥυωΠςΟϒ • ඇಉظͳΞϓϦέʔγϣϯ •
࣌ؒͱڞʹԿ͔ͱෳࡶԽ͍͢͠8FCγεςϜ • ࢧతͳϑΝΫλʔঢ়ଶͷѻ͍ – Ӆṭ – એݴతʹهड़ – *NNVUBCMF େنτϥϑΟοΫ ͔ͩΒɺͱ͍͏ͩ ͚Ͱͳ͘ͳ͖ͬͯͯ Δ
·ͱΊ • ۙݸਓతʹணͨ͠τϨϯυΛΈͨ – *OGSBTUSVDUVSFBT$PEF – *NNVUBCMF*OGSBTUSVDUVSF – .JDSPTFSWJDFT –
3FBDU – 3FBDUJWF1SPHSBNNJOH • ෳࡶੑͷରࡦͱͯ͠ͷঢ়ଶཧख๏ʹύλʔ ϯ͕ݟ͍ͩͤΔ
13࠾༻ͯ͠·͢ ʮ,BJ[FO࠾༻ʯͰݕࡧɻڵ ຯ͋Δ͚ͩͰՄɻͦͷ ߹8BOEUFEMZͰ