Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Swiftに適したサーバーアーキテクチャを再考して実装までしてみる
Search
Yuki Takei
December 19, 2016
Technology
2.9k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Swiftに適したサーバーアーキテクチャを再考して実装までしてみる
Yuki Takei(noppoMan) @Tokyo-Server-Side Swift Meetup#5 Dec, 19, 2016
Yuki Takei
December 19, 2016
Transcript
96 slides
Swiftʹదͨ͠αʔόʔΞʔΩςΫ νϟΛ࠶ߟ࣮ͯ͠·Ͱͯ͠ΈΔ Yuki Takei(noppoMan) @Tokyo-Server-Side Swift Meetup#5 Dec, 19, 2016
TSSS Meetupɺ ͳΜͱͿΓͷ։࠵Ͱ͢ʂ
ࣗݾհ
Swift͕OpenԽ͔ͯ͠Βɺ ৭ʑͳϥΠϒϥϦΛ࡞ͬͯެ։͍ͯ͠·͢ɻ
OSS • Slimane -> Web Framework • Skelton -> Event
Driven HTTP Server • Suv -> Async Net, I/O Platform (libuv based)
Slimaneͷ։ൃணख͔Βૣ͍͜ͱʹ͏1 (࠷ۙ͋·Γͬͯͳ͍ͷͰ͕͢ɺɺ)
͔ͭͯɺSwift͕ຬʹLinuxͰಈ͔ͣ
Server-Side-SwiftͷΩʔϓϨΠϠʔͨͪϑϨʔϜϫʔΫͳͲ ͷେ෦ΛࣗલͰ࡞͍ͬͯ·ͨ͠ɻ
͔͠͠
Swift3͕ϦϦʔε͞ΕͯɺServer SideͰSwiftͷඪ४APIΛੵ ۃతʹ͍ͬͯ͜͏ͱ͍ͬͨྲྀΕʹͳ͖͍ͬͯͯ·͢ɻ
ͦ͜ͰɺࠓͷServe Side Swiftʹదͨ͠ αʔόʔΞʔΩςΫνϟͱҰମͲΜͳͷͳͷ͔ʁ
ͦΕΛࣗͳΓʹ࠶ߟ͠ɺ࣮ͯ͠Έ·ͨ͠ɻ ͱ͍͏͓Ͱ͢ɻ
·ͣɺࠓճͷൃදͷωλͱͳΔϥΠϒϥϦͷ͝հͰ͢
None
• Swift3͕ඪ४Ͱఏڙ͢ΔAPIΛੵۃతʹͬͨωοτ ϫʔΫϥΠϒϥϦ • ϑϨʔϜϫʔΫͰͳ͘ɺ͋͘·ͰωοτϫʔΫϓϩ άϥϛϯάڥ • جຊతʹಉظI/OͷAPIΛఏڙ (callbackΛۃྗഉআ) •
ඇಉظϓϩάϥϛϯάಠࣗͷAPIΛར༻͢Δ(ޙड़) • ݱࡏHTTP(S)ɺTCPͷServer/ClientͱIP(v4, 6)Λఏڙ Prorsumͱʁ
ͰૣɺSwiftʹదͨ͠αʔόʔΞʔΩςΫνϟͱԿͳͷ͔ ୳͍͖͍ͬͯͨͱࢥ͍·͢ɻ
ͦͷલʹɺͲΜͳछྨͷαʔόʔΞʔΩςΫνϟ͕͋ͬͨͷ͔ɺ ͓͢͜͠͞Β͍Ͱ͢ɻ
දతͳαʔόʔΞʔΩςΫνϟ • ϚϧνεϨουϞσϧ • ϚϧνϓϩηεϞσϧ • Πϕϯτۦಈ • ϋΠϒϦουϞσϧ
ϚϧνεϨουϞσϧ main process worker thread worker thread worker thread client
client client thread ϦΫΤετຖʹthreadΛ࡞Γ(࠷ۙPool͕ओྲྀ)ɺͦͷthread্ͰϦΫΤετΛࡹ͘ɻ ϓϩηεͱҧ͍ϝϞϦΛڞ༗Ͱ͖ΔɻʢϩοΫʹΑΔഉଞ੍ޚඞਢʣ C10K͕ʹͳͬͨɻ thread thread
ϚϧνϓϩηεϞσϧ ਤϚϧνεϨουʹࣅ͍ͯΔ͕ɺϓϩηεΛϑΥʔΫͯ͠ϝϞϦۭؒΛ͚Δɻ ϑΥʔΫͨ͠ϓϩηεͰϦΫΤετΛࡹ͍͍ͯ͘ɻ ࢠؒͷ௨৴υϝΠϯιέοτΛ͏ main process worker process fork worker
process worker process client client client fork fork
ΠϕϯτۦಈϞσϧ γϯάϧίΞ্ʹΠϕϯτϧʔϓΛ࡞͠ɺιέοτϑΝΠϧγεςϜ ͷॻ͖ࠐΈ࣌ʹΠϕϯτ(callback)ΛൃՐ͢ΔɻγϯάϧίΞͷͨΊɺ ϨʔείϯσΟγϣϯdeadlockΛؾʹ͢Δඞཁ͕ແ͍͕ɺϚϧνίΞ Λ׆͔͢͜ͱ͕ग़དྷͳ͍ɻC10KΛղܾͨ͠ main process select, epoll, kqueue
client client client
ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳͷΞʔΩςΫ νϟΛΈ߹Θͤͨͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔ෆ໌) Node.jsͰClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker
worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client
͜ͷɺSlimanelibuvϕʔεͷͨΊɺNode.jsͱશ͘Ұॹͷ Πϕϯτۦಈ+WorkerProcessϞσϧΛ࠾༻͍ͯ͠·ͨ͠ɻ
ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳͷΞʔΩςΫ νϟΛΈ߹Θͤͨͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔ෆ໌) Node.jsͰClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker
worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client
ϋΠϒϦοτϞσϧ Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳͷΞʔΩςΫ νϟΛΈ߹Θͤͨͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔ෆ໌) Node.jsͰClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ master client worker
worker uv_loop uv_loop uv_loop passing fds passing fds fork fork client ͜ΕͰ͢Ͷ
ͰɺProrsumͱ͍͏ͱʁ
ProrsumͷΞʔΩςΫνϟΛඥղ͘લʹɺ ·ͣSwiftͷඇಉظI/Oฒྻॲཧͷํ๏ΛֶͿඞཁ͕͋Γͦ ͏Ͱ͢
SwiftͰɺiOSͳͲͰUIඳըΛࢭΊͯ͠·͏Α͏ͳॏ͍ॲཧΛ ॻ͘ࡍʹɺGCDͱ͍͏APIΛ͍͔ͬͯͨͱࢥ͍·͢
Grand Central Dispatch(GCD) • DispatchQueue • DispatchSource • DispatchGroup •
DispatchSemaphore ௨ৗΞϓϦέʔγϣϯதʹهड़͢ΔεϨουཧ༻ͷίʔυΛɺ γεςϜϨϕϧͰ࣮ͨ͠ͷ (By Apple ฒߦϓϩάϥϛϯάΨΠυ) https://developer.apple.com/jp/documentation/ConcurrencyProgrammingGuide.pdf දతͳͷҎԼʁ
ཁɺThreadͷཧฒྻϓϩάϥϛϯάθϩ͔Β࣮ ͢ΔͱେมͳͷͰɺγεςϜଆʢLinuxͰ͋ΕϥΠϒϥϦ ଆʣͰ࣮ͨ͠ͷΛɺϓϩάϥϚʹ͍͘͢ఏڙ͠· ͢Αͱ͍͏ͷɻ
Dispatch Queue • λεΫΛqueuingͯ͠ɺ͋ΔThread্Ͱඇಉظ/ಉظత ʹ࣮ߦ͢Δ͜ͱ͕ग़དྷΔAPI • mainQueue, GlobalQueueɺϢʔβʔ࡞Queueʹ͔ ΕΔ •
SerialͱConcurrentͷattribute͕͋Δ • queueʹରͯ͠༏ઌॱҐͷίϯτϩʔϧ͕Մೳ • ҰͭͷQueue࣮ߦྃ·ͰϒϩοΫ͞ΕΔ
Dispatch Queue Serial Task Task Task Task Task queue.async {}
Concurrent Task Task Task Task Task Task Task Task queue.async {} executing waiting balancing
Dispatch Source • ϑΝΠϧهड़ࢠͳͲΛࢹͯ͠ɺԿ͔ͷΠϕϯτ ΛػʹొࡁΈͷcallbackΛݺͼग़ͨ͢ΊͷAPI • ΠϕϯτυϦϒϯͳϓϩάϥϛϯά͕ॻ͚Δ • OSґଘͳඇಉظؔΛ͏·͘ϥοϓͯ͘͠Εͯ ͍Δ(libevʹ͍ۙ)
• ίʔυΛಡΜͩΒɺMacͰkqueueΛͬͯ ϑΝΠϧهड़ࢠΛࢹ͍ͯͨ͠
Dispatch SourceͰࢹՄೳͳͷͷҰ෦ • Timer • Signal • FileSystem • Socket
• MemoryPressure
ͨͱ͑ɺϑΝΠϧͷॻ͖ࠐΈΛݕͯ͠ɺϓ ϩάϥϜΛ࠶ίϯύΠϧ͢ΔΑ͏ͳϓϩάϥϜͳ Ͳ͕؆୯ʹॻ͚ΔΑ͏ʹͳΓ·͢ɻ (LinuxͰݱঢ়epoll͍ͬͯͳ͍ͨΊɺKituraࣗલͰepoll Λॻ͍ͯ·ͨ͠স)
͜͜·ͰநԽ͞ΕͨAPI͕͋ΔͷͰɺ GCDΛ׆͔ͨ͠ΞʔΩςΫνϟ͕SwiftͰྑͦ͞͏Ͱ͢
ͦΕΒΛ౿·͑ɺࠓճܾ·ͬͨΞʔΩςΫνϟ͕ͪ͜Β
ProrsumͷαʔόʔΞʔΩςΫνϟ DispatchSource + DispatchQueueΛͬͨ Πϕϯτۦಈ + WorkerThreadͷϋΠϒϦοτϞσϧ main thread DispatchSourceͰɺ
listeningSocketΛࢹ Queue Queue Queue Queue Queue Queue Queue Queue Queue client DispatchQueue(concurrent) nonblocking I/O blocking I/O
GCDʹΑΓɺΠϕϯτۦಈϞσϧͷϚϧνίΞΛ׆͔ͤͳ͍ Λ1ϓϩηε͚ͩͰղܾͰ͖·ͨ͠ɻ (CPUΛ͍Ε͍ͯͳ͍ͱ͍͏ผ͕·ͩ͋Δ…)
·ͨɺγϯάϧϓϩηεͱ͍͏͜ͱͰ Slimaneʹൺͯϓϩηεཧඇৗʹ؆୯ʹ
͔͠͠ɺ·ͨ৽ͨͳ͕ൃੜ
SlimaneશͳΠϕϯτۦಈαʔόʔͩͬͨͷͰɺɺ
None
CallBack Hell!!
None
callbackͷ • ͦͦSwiftඪ४ͰඇಉظύϥμΠϜʹऑ͍ (Promise FutureɺAsync/Await͕ݴޠػೳʹͳ͍) • ΤϥʔϋϯυϦϯά͕͍͠(callbackຖʹΤϥʔॲཧ͕ඞཁ) • try catchͱ૬ੑѱ͍
• ॥ࢀরΛ࡞Γ͍͢ʢΩϟϓνϟϦετΛॻ͖ΕΔʣ • return͠Εͯcallback͕2ճݺΕΔ • @escapingͱ͔ɺ(T)->Voidͱ͔Կճॻ͘ͷ໘
͔͠͠ɺɺ
GCDɺඇಉظॲཧͷ݁ՌΛblockͰड͚औΔͱ͍͏Ξ ϓϩʔνΛ࠾༻͍ͯ͠·ͨ͠ɺɺ ʢͱ͍͑ɺ͜ΕʹΑΓɺϨʔείϯσΟγϣϯͳͲΛ͋·Γؾʹ͠ͳͯ͘ྑ͘ͳ Γ·͢ɻʣ
block = callback
·ɺ·͔͞ww
None
None
͑ɺ݁ہwww
ͪΐͬɺͯΑ͒
SwiftͰαʔόʔॻ͘ͷ͖͋ΒΊΑ͏͔ͳ… ) DispatchGroupDispatchSemaphore Ͱ͋ΔఔcallbackΛແ͘͢͜ͱग़དྷ·͢
ͨͩɺΈ͞ͳΜࢥ͍ग़͍ͯͩ͘͠͞ɻ
ඇಉظͷϑϩʔ੍ޚΛcallbackҎ֎Ͱղܾͨ͋͠ͷݴޠΛ
None
……….
GoݴޠͩΑʔ
Goݴޠͱ GoϓϩάϥϛϯάݴޠͷͻͱͭɻGoogleʹΑͬͯ։ൃ ͞Ε͓ͯΓ[4]ɺઃܭʹϩϒɾύΠΫɺέϯɾτϯϓιϯΒ ͕ؔΘ͍ͬͯΔɻ ओͳಛͱͯ͠ɺܰྔεϨοσΟϯάͷͨΊͷػೳɺ PythonͷΑ͏ͳಈతܕ͚ݴޠͷΑ͏ͳϓϩάϥϛϯάͷ ༰қੑɺͳͲ͕͋ΔɻGoॲཧܥͱͯ͠ίϯύΠϥͷΈ͕ ։ൃ͞Ε͍ͯΔɻ Wikipedia, Go
(ϓϩάϥϛϯάݴޠ)ΑΓ
Goݴޠͷฒߦ/ฒྻॲཧ GoݴޠͰGoroutineΛͬͯɺฒߦ/ฒྻॲཧΛ࣮ݱ͍ͯ͠·͢ɻ ฒߦ(Concurrent) ฒྻ(parallel)
Goroutine GoroutineෳThread্ʹଟॏԽ͞ΕͨCoroutineͷΑ͏ͳಈ࡞Λ͢Δɻ Ұͭͷgoroutine͕͍࣌ؒϒϩοΫ͢Α͏ͳؔͰɺผͷgoroutineʹhand off͠ ͯॲཧΛଓߦ͢ΔͨΊɺCPUΛ༨ΒͤͣʹޮతʹϓϩάϥϜΛ࣮ߦͰ͖Δ G1 G2 G3 G4 G5
sleep(1) G6 G4 G5 sleep(1) G6 G8 G4 G7 G9 thread1 thread2 thread3
Channel GorotuineThreadؒΛ·͍ͨͰ࣮ߦ͞ΕΔͨΊɺGoroutineಉ࢜ͰҰͭͷมΞΫ ηε͢ΔͱRace Condition͕ൃੜͯ͠͠·͏ɻ ͦΕΛ͙ͨΊʹɺGoͰChannelͱ͍͏ػೳ͕ఏڙ͞Ε͓ͯΓɺͦΕΛͬͯ Λૹड৴͢Δ G1 G2 G3 send
send send main thread receive Channel
ίʔυ ͜ͷϓϩάϥϜͷ݁ՌɺHello WorldͱWorld HelloͷͲͪΒ ͔ʹͳΓ·͢
goroutineͰ͔֬ʹthreadΛͬͨฒྻॲཧʢඇಉظॲཧʣ ͕ߦΘΕ͍ͯΔ͜ͱ͕Θ͔Γ·ͨ͠ɻ
None
ඇಉظͰ͋ΔͷʹɺίʔυͱͯಉظతͰ͢ΑͶɻ
ͳͥͳΒɺChannelͷૹड৴ϒϩοΫ͞ΕΔ͔ΒͰ͢ɻ
= ChannelΛͬͨഉଞ੍ޚͰ͢Ͷ
DispatchQueueThreadϕʔεͰͨ͠ɻ
ͱ͍͏͜ͱʂ
Goroutine+ChannelͷΠϯλʔϑΣʔεΛ͑ɺ SwiftͰඇಉظॲཧ͕ಉظతʹॻ͚ͦ͏Ͱ͢ɻ (Context switchOSଆͰ͕͢..)
ͦ͜ͰɺProrsumʹGoroutineͱChannelͷΑ͏ͳػೳΛ࣮͠ ͯΈ·ͨ͠
None
None
None
None
ChannelʹΑΓɺϓϩάϥϚDispatchQueueؒͷͷڞ༗࣌ ʹɺഉଞ੍ޚ͔Β։์͞Ε·͢
• ݱঢ়ͨͩͷDispatchQueue.asyncͷΤΠϦΞε • serial͔ɺconcurrent͔࣮ߦ࣌ʹબՄೳ • GoͷΑ͏ʹϒϩοΩϯάॲཧΛۭ͖εϨουʹ context switch࣮ͤͯ͞ߦ͢ΔΑ͏ͳ࠷దԽ͞ Ε͍ͯͳ͍ •
ThreadϕʔεͳͷͰɺGoroutineΑΓͪΖΜ Ϧιʔεͷރׇૣ͍ Prorsumͷgo()ʹؔͯ͠
• ࣮MutexLockΛͬͨ୯ͳΔδΣωϦοΫͳڞ༗ϝϞϦ • lock͕͔͔ΔͨΊɺ͍ա͗ͨΒੑೳྼԽ͢Δ • BufferLinkedListͰ࣮͞Ε͍ͯΔ • Buffer capacityΛӽ͑ͯૹ৴͢Δͱthrow͢Δ •
Goͱҧ͍ɺtry catchͰΤϥʔͷัଊ͕Մೳ • Processؒͷ௨৴Ͱ͖ͳ͍(ErlangͷActorͳͲͱશ ʹผ) ProrsumͷChannelʹؔͯ͠
ͰɺProrsumͰΞϓϦέʔγϣϯΛॻ͍ͯɺGCDͱChannel ͷΈ߹Θ͕࣮ͤ༻తͳͷ͔ݟͯΈ·͠ΐ͏
ࠓճɺJSON-RPC ServerΛॻ͍ͯΈ·ͨ͠
None
ಈ࡞σϞ
ιʔείʔυͷղઆ
ؾʹͳΔύϑΥʔϚϯε
ࠓճɺGoɺKituraɺNode.jsͦͯ͠Prorsum ͰϕϯνϚʔΫରܾΛͯ͠Έ·ͨ͠ɻ
Benchmarking Request/sec 0 17500 35000 52500 70000 Prorsum Kitura Go
1.7 HTTP Server Express 14,769 64,768 17,144 29,436 ɾwrk -d 30s -t 4 -c 20 ɾResponded with the 10 length of random JSON array ɾMachine: MacOS Sierra, 8 logical cores, 8GB RAM
• Go͗͢ (´ʀωʀʆ)ŲƄƂŕ • KituraͱExpressϑϨʔϜϫʔΫͳͷͰɺ͜ͷϕϯν ϚʔΫࣗମશʹFairͰͳ͍ • Prorsum2Ґͱ͍͏݁Ռ͕ͩɺϦΫΤετͷread/writeΛ ϊϯϒϩοΩϯάʹ͢ΕɺGOʹ͏গ͠ബͦ͠͏ •
Node.jsͱಉҎ্ͳύϑΥʔϚϯεɺ΄΅Swiftඪ४Ͱ ग़Δ • ࠓճ࠶ߟͨ͠ΞʔΩςΫνϟɺҰԠޭʁ ײ
࠷ޙʹ
swift-server/work-groupʹͯҎԼͷϥΠϒϥϦΛ Swiftඪ४Ͱ͑ΔΑ͏ʹ༷ࡦఆதͰ͢ɻ • RFC 7230-7235(HTTP/1.1) • RFC 6455 (WebSocket) •
RFC 7540(HTTP/2.0) • TCP/IP(v6,v4), UDP including I/O • TLS/Encryption https://github.com/swift-server/work-group
• ͓ͦΒ͘ݱߦͷϑϨʔϜϫʔΫެࣜαʔόʔAPI ʹ͔ͬͬͯ͘Δͱࢥ͍·͢ɻ • ؤுͬͯࣗ࡞ͯ͠ɺެ͕ࣜग़ͨλΠϛϯάͰ࣌ ؒͷແବʹͳΔՄೳੑ͕͋Γ·͢ɻ • ಛʹTLSHTTPपΓRFCଟྔͰɺ࣮ෳࡶ ͳͨΊ·Ͱʹ݁ߏͳ͕͔͔࣌ؒΓ·͢ɻ
3rd partiyͷϥΠϒϥΛԼखʹ૿͢ΑΓɺServer- Work-GroupͷٞʹࢀՃͯ͠ɺ͍͍ඪ४ϥΠϒϥϦΛ ࡞͍ͬͯ͘΄͏͕ݐઃతͰ͢ɻ (ͦͯ͠ɺૣ͘ຊ൪αʔϏεͰ͑ΔΑ͏ʹ…
ProrsumHTTPTLSपΓɺެࣜ൛ʹReplace͢Δ༧ఆͰ͢ɻ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ
More Decks by Yuki Takei
See All by Yuki Takei
VAR モデルによる OSS プロジェクト同士が生存性に与える 影響の分析
noppoman
0
580
Server Side Swift の個人的な利用シーン
noppoman
2
680
Serverless Server Side Swift
noppoman
2
1.7k
Practical Hexaville(ja)
noppoman
0
560
実践Server Side Swift
noppoman
13
4.5k
Server Side Swiftを使った サービス開発とその運用を考える
noppoman
4
1.5k
Swift3 Framework Slimane and Server Side Swift (ja)
noppoman
2
2.4k
About Deploying and Process Management for Slimane
noppoman
2
520
Server Side Framework Slimaneの紹介
noppoman
1
1.3k
Other Decks in Technology
See All in Technology
内製アプリとClaudeスキルのセキュリティチェック、 Backlogの課題で回しています。
ayaka_egaaa
0
180
Context != Context: One window, many lifecycles (AI Native DevCon, Nov 2026)
birgitta410
0
130
プロダクションコードにおける encoding/json から encoding/json/v2 へのスムーズな移行
sansantech
PRO
1
410
うちなーぐちが認識できるなら、秋田弁もいけるはず!? Amazon Transcribe方言チューニング検証
ryouto715
1
170
Gifu WordPress Meetup #200 に向けて、私たちには何ができるだろうか?/ 2026-11-07 Gifu WordPress Meetup
torounit
0
290
Datadog の権限統制 〜Org 統合に向けて調べた注意点 / JDDUG-Meetup_24
visional_engineering_and_design
1
120
LLM 基盤と kagent v0 を全部 k8s に入れてみた / Deploy both LLM and kagent v0 in k8s
kota2and3kan
0
190
81天的 AI Agent 軟體開發團隊治理實務分享
regionbbs
0
160
BALLAS Technology Deck
ballas_inc
0
590
業務でAWSをあまり使っていない私が、AWSへのモチベを保つ方法
smt7174
0
190
狙われているAPIの脆弱性!今こそ手をつけるべき根本的な対策とは?
nagix
0
130
AI時代に求められる優秀なTechLeadの振る舞い
pospome
11
16k
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Building Adaptive Systems
keathley
44
3.3k
Abbi's Birthday
coloredviolet
5
11k
Amusing Abliteration
ianozsvald
1
390
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
900
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
660
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.2k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k