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
Clojureに入門してHTTPサーバーをつくってみた話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Shunsuke Tadokoro
January 31, 2017
Technology
1.1k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Clojureに入門してHTTPサーバーをつくってみた話
第十八回 渋谷JavaのLT資料です。
Shunsuke Tadokoro
January 31, 2017
More Decks by Shunsuke Tadokoro
See All by Shunsuke Tadokoro
ある日「Webエンジニアなら、Webサーバーは作れますよね」と言われたら? ~ 3つのJVM言語で作って学ぶ
todokr
2
590
Onboarding Process for Scala Team
todokr
0
2.1k
Running Scala on AWS Lambda in a Snappy Way
todokr
7
4.7k
Scalaでつくる ちょっとしたCLIツール
todokr
0
1.1k
新しいプログラミング言語の学び方 HTTPサーバーを作って学ぶ Java, Scala, Clojure
todokr
29
21k
わかる!Java to Clojure
todokr
6
1.9k
Scala絵文字ライブラリに Macroなどを導入してみた
todokr
0
1.5k
emojiconに行ってきました
todokr
2
840
Scalaリファクタリング入門「大改造!静的ビフォー・アフター」
todokr
3
1.3k
Other Decks in Technology
See All in Technology
AIがコードを書く時代、人間は何を保証するのか———馬場さんと考える、開発者に求められる新しい責任と価値 - TECH PLAY
netmarkjp
0
330
WEBフロントエンド研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
730
オートマトンと字句解析でRoslynを読む
tomokusaba
0
120
AIエージェントがあれば技術書なんてすぐ書けるでしょ→無理でした
watany
6
1.1k
BigQuery を検索ソースとした AI Agent の作り方って 〇〇 通りあんねん
satohjohn
0
140
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
53k
QAと開発の両側から進める AI活用 -QAプロセスAI支援ツールキットと Inner Loop / Outer Loopの取り組み-
legalontechnologies
PRO
2
360
QAタスクをスキル化したいときに考えること
aomoriringo
0
130
AIツールを導入しても生産性はあがらない? カオナビが直面した 3つの壁と乗り越え方。/ Overcoming 3 Barriers to AI-Driven Productivity at kaonavi
kaonavi
0
460
現場をAIで動かす「フィジカル AI」の組み込み設計の考え方【SORACOM Discovery 2026】
soracom
PRO
0
150
全社でのソフトウェアサプライチェーン攻撃対策をやってみた with Takumi Guard
z63d
0
330
セキュリティ研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
31
25k
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Are puppies a ranking factor?
jonoalderson
1
3.7k
How STYLIGHT went responsive
nonsquared
100
6.2k
30 Presentation Tips
portentint
PRO
1
360
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
670
Google's AI Overviews - The New Search
badams
0
1.1k
Building Adaptive Systems
keathley
44
3.1k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
920
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Claude Code のすすめ
schroneko
67
230k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
430
Transcript
$MPKVSFʹೖͯ͠ )551αʔόʔΛͭͬͯ͘Έͨ ौ୩+BWB !UPEPLS ָ͘͠
ా ॴ ॣ ༎ ! U P E
P L S w ג ࣜ ձ ࣾ Ϗ ζ Ϧ ʔ ν ελ ϯόΠ ࣄ ۀ ෦ α ʔ ν ί Ξ ν ʔ Ϝ w 4 D B M B M J B O w & N P K J O F F S
4DBMBº&NPKJͳϥΠϒϥϦΛͭ͘Γ·ͨ͠
ΑΖ͓͘͠ئ͍͠·͢
͓ͳ͢͠Δ͜ͱ w ͜ͱͷൃ w ͭͬͨ͘)551αʔόʔʹ͍ͭͯ w )551αʔόʔʁ w ϦΫΤετ͔ΒϨεϙϯε·Ͱ w
·ͱΊ w )551αʔόʔΛͭͬͯ͘ΈͯΑ͔ͬͨ͜ͱ w $MPKVSFʹೖͯ͠Α͔ͬͨ͜ͱ
͜ͱͷൃ
ʮ)551αʔόʔΛ࡞Δձʯ w ࣾͷ༗ࢤʹΑΔϥϯνษڧձ w ʮ8FCΞϓϦͭ͘Γ͍ͨʂʯ ʮͲͷϨϕϧͰͭ͘Δͷʁʯʮαʔόʔ͔Βͭ͘Δͷ͔ʁʯ w 2JJUBɺ4UBDL0WFSqPXFUDݟͪΌͩΊ w ͏ݴޠͷυΩϡϝϯτ3'$ɺଞݴޠͰͷ࣮ݟ͍͍ͯ
w ʮ5̋,*0ܕΤϯδχΞཆॴʯ
ཱ͔ͪͩΔ͍ͭ͘ͷน w ιέοτͬͯͳΜͰ͔͢ʁ ˠάάͬͯిٿ͔͠ग़ͯ͜ͳ͍ w ը૾͕දࣔͰ͖ͳ͍ ˠόΠφϦͳΜ͔ͩΒ0VUQVU4USFBN8SJUFSͬͪΌμϝ w NVMUJQBSUGPSNEBUB ˠCPVOEBSZʢσʔλͷ۠ΓจࣈྻʣΫϥΠΞϯτ͕ܾΊΔ
4DBMB൛4JNQMF)5514FSWFS
ࠓͷ৽ଔࢀՃͯ͠ γʔζϯ
ࣗ࠶$MPKVSFͰͭ͘Δ͜ͱʹ w ϙʔϧɾάϨΞϜʹ᱐͞Εͨ w ʮ&NBDTͬͯΔͷʹ-JTQॻ͍ͨ͜ͱͳ͍ΜͰ͔͢ʁʯͱઞΒΕͨ w ΞϯαΠΫϩϖσΟΞ͕ͳΜ͔͔ͩͬͨ͢͝
IUUQBOTBJLVSPQFEJBPSHXJLJ-*41
IUUQBOTBJLVSPQFEJBPSHXJLJ-*41
IUUQBOTBJLVSPQFEJBPSHXJLJ-*41
ͭͬͨ͘)551αʔόʔʹ͍ͭͯ
None
)551αʔόʔʁ w MPDBMIPTUͷҙͷϙʔτͰػ w 5$1ଓɺ)551ϦΫΤετΛड͚औΔ w )5.-ը૾ͳͲΛ)551Ϩεϙϯεͱͯ͠ฦ͢
ϦΫΤετ͔ΒϨεϙϯε·Ͱ w DPSFDMK w SFRVFTUDMK w SFTQPOTFDMK
DPSFDMK w ΞϓϦέʔγϣϯͷΤϯτϦʔϙΠϯτ w ҙͷϙʔτͰଓΛͪड͚ɺϦΫΤετ͝ͱʹιέοτੜ w ιέοτੜҎ߱ͷॲཧผεϨουͰ࣮ߦ
+BWB $MPKVSF (defn -main [] (let [address (InetSocketAddress. 3000) server-socket
(ServerSocket.)] (.bind server-socket address (int backlog)) (while true (let [socket (.accept server-socket)] ... class SimpleHttpServer { public static void main(String[] args) { InetSocketAddress address = new InetSocketAddress(3000); ServerSocket serverSocket = new ServerSocket(); serverSocket.bind(address); while (true) { Socket socket = serverSocket.accept(); ... ϦΫΤετ͝ͱʹιέοτੜ
SFRVFTUDMK w ιέοτͷ*OQVU4USFBNΛSFBE͠ɺ )551ϦΫΤετͱͯ͠ύʔε w ϦΫΤετͨͩͷ.BQͱͯ͠දݱ
$MPKVSF (let [stream (FileInputStream. file)] (take-while #(not= -1 %) (repeatedly
#(.read readable)))) +BWB InputStream stream = new FileInputStream(file); try { int b = stream.read(); while(b != -1){ // Ωϟετͯ͠ྻʹ٧ΊΔͳͲ } } catch (IOException e) {} *OQVU4USFBNΛ࠷ޙ·ͰSFBE͢Δ
SFTQPOTFDMK w ϦΫΤετΛݩʹɺϑΝΠϧΛόΠτྻ w ιέοτͷ0VUQVU4USFBNʹ)551Ϩεϙϯεͱͯ͠XSJUF
$MPKVSF (str "HTTP/1.1 200 OK" CRLF "Content-Length: " XXX CRLF
"Content-Type: " YYY CRLF) +BWB String resTxt = "HTTP/1.1 200 OK" + CRLF + "Content-Length: " + XXX + CRLF + "Content-Type: " + YYY + CRLF; จࣈྻͷ݁߹
·ͱΊ
)551αʔόʔΛͭ͘Δޮ༻ w Ұ࣍ใʹ͋ͨΕΔΑ͏ʹͳΔ +BWBEPDɺ3'$ɺ&$."ɺFUD w ΠϯλʔωοτͷΈ͕ݟ͑ͯ͘Δ ιέοτɺΧʔωϧɺ5$1ɺ)551ɺFUD ʮेʹൃୡͨ͠ςΫϊϩδຐ๏ͱݟ͚͕͔ͭͳ͍ʯ w ଞͷϛυϧΣΞͷதʹڵຯΛ࣋ͭ
ࠓ%#Λ࡞ͬͯΈ͍ͨ
$MPKVSFʹೖͯ͠Α͔ͬͨ͜ͱ w ؔྗͷ্ ߴ֊ؔແݶϦετɺԆධՁ͕ۙʹ w εϨουϓʔϧΛҙࣝ͢ΔΑ͏ʹ HPͱUISFBEͬͯԿ͕ҧ͏ʁˠछྨಛੑΛؾʹ͢ΔΑ͏ʹͳͬͨ w ঢ়ଶΛͲ͏ѻ͏ʁ00WT$MPKVSFXBZ $MPKVSFͰʮΞΠσϯςΟςΟʯͱʮঢ়ଶʯΛΓ͢
ൺֱ͢Δ͜ͱͰ͓ޓ͍͕ΑΓ໌֬ʹ
IUUQTBZBUPQHJUIVCJPDMPKVSFCFHJOOFS
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ