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
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
2k
Running Scala on AWS Lambda in a Snappy Way
todokr
7
4.7k
Scalaでつくる ちょっとしたCLIツール
todokr
0
1.1k
新しいプログラミング言語の学び方 HTTPサーバーを作って学ぶ Java, Scala, Clojure
todokr
28
20k
わかる!Java to Clojure
todokr
6
1.9k
Scala絵文字ライブラリに Macroなどを導入してみた
todokr
0
1.5k
emojiconに行ってきました
todokr
2
830
Scalaリファクタリング入門「大改造!静的ビフォー・アフター」
todokr
3
1.3k
Other Decks in Technology
See All in Technology
なぜ Platform Engineering の土台に Kubernetes を選ぶのか
r4ynode
1
540
protovalidate-es を導入してみた
bengo4com
0
160
10倍の生産性を実現するAI駆動並列エージェントのすべて
kumaiu
4
1.3k
脆弱性対応、どこで線を引くか
rymiyamoto
0
330
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.9k
Dario Amodi『Policy on the AI Exponential』を理解する
nagatsu
0
210
地球に⽣きるAI —GeoAIと「中間領域」— / AI Living on Earth — GeoAI and the “Intermediate Layer” —
ykiyota
0
170
やさしいA2A入門
minorun365
PRO
10
1.6k
SIer20年! 培ったスキルがスタートアップで輝く時
shucho0103
0
820
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
610
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
250
AmazonRoute 53ではじめてのドメイン取得!HTTPS化までの道のりを整理してみた
usanchuu
3
120
Featured
See All Featured
Designing Powerful Visuals for Engaging Learning
tmiket
1
410
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
The Cult of Friendly URLs
andyhume
79
6.9k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
Being A Developer After 40
akosma
91
590k
Building Applications with DynamoDB
mza
96
7.1k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
Un-Boring Meetings
codingconduct
0
310
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
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
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ