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
Scalaでつくる ちょっとしたCLIツール
Search
Shunsuke Tadokoro
April 18, 2019
Technology
0
800
Scalaでつくる ちょっとしたCLIツール
Sample code repository:
https://github.com/todokr/scala-cli-samples
Shunsuke Tadokoro
April 18, 2019
Tweet
Share
More Decks by Shunsuke Tadokoro
See All by Shunsuke Tadokoro
ある日「Webエンジニアなら、Webサーバーは作れますよね」と言われたら? ~ 3つのJVM言語で作って学ぶ
todokr
2
450
Onboarding Process for Scala Team
todokr
0
1.3k
Running Scala on AWS Lambda in a Snappy Way
todokr
7
4k
新しいプログラミング言語の学び方 HTTPサーバーを作って学ぶ Java, Scala, Clojure
todokr
28
18k
わかる!Java to Clojure
todokr
6
1.7k
Scala絵文字ライブラリに Macroなどを導入してみた
todokr
0
1.2k
Clojureに入門してHTTPサーバーをつくってみた話
todokr
3
990
emojiconに行ってきました
todokr
2
660
Scalaリファクタリング入門「大改造!静的ビフォー・アフター」
todokr
3
1.2k
Other Decks in Technology
See All in Technology
【shownet.conf_】AI技術とUX監視の応用でShowNetの基盤を支えるモニタリングシステム
shownet
PRO
0
250
サーバレス基盤で Gemini の性能を引きだすアーキテクトを構築した話
antonnion
0
110
FastAPIでのasync defとdefの使い分け
takashi1029
6
1.7k
Strong Skipping Mode によってrecompositionはどう変わったのか
mikanichinose
0
110
仮想化って何だろう
shkoga
0
140
【shownet.conf_】ネットワークテストの最適化と利便性の追求
shownet
PRO
0
220
【shownet.conf_】ShowNet 2024 ~ Inter * Network ~
shownet
PRO
0
360
ITエンジニアとして知っておいてほしい、電子メールという大きな穴
logica0419
1
270
AI時代のアジャイル開発(XP祭り2024版) / Agile Development in the AI Era in XPJUG
takaking22
13
3.3k
【インフラエンジニアbooks】30分でわかる「AWS継続的セキュリティ実践ガイド」
hssh2_bin
1
320
Making Linux sucks less
ennael
PRO
0
430
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
2
200
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
29
1.4k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
25
640
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
23
1.7k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.4k
Teambox: Starting and Learning
jrom
131
8.7k
From Idea to $5000 a Month in 5 Months
shpigford
380
46k
Clear Off the Table
cherdarchuk
91
320k
Designing for humans not robots
tammielis
248
25k
The Mythical Team-Month
searls
218
43k
How To Stay Up To Date on Web Technology
chriscoyier
786
250k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
36
1.7k
What's in a price? How to price your products and services
michaelherold
243
11k
Transcript
4DBMBͰͭ͘Δ ͪΐͬͱͨ͠$-*πʔϧ !UPEPLS ָ͘͠
୭ͩ ాॴॣ༎!UPEPLS ٻਓݕࡧΤϯδϯ8FCΫϩʔϥɺࠂ৴γεςϜɺ ࠂϩάج൫ɺ0QFO*%$POOFDUೝূɺ3%#.4͓Ҿӽ͠
None
4DBMB w +BWBͱͷ૬ޓӡ༻ੑ w γʔϜϨεͳݺͼग़͠ɺ+BWBඪ४ϥΠϒϥϦͷ࠶ར༻ w ؆ܿੑ w লུՄೳͳߏจɺܕਪɺڧྗͳඪ४ϥΠϒϥϦ w
நͷߴ͍ίʔυɺ৽੍͍͠ޚߏจΛఆٛͰ͖Δදݱྗ w 8IBUͷڧௐɺ)PXͷӅณ w ੩తܕ͚ w ݕূՄೳੑɺϦϑΝΫλͷ͢͠͞ɺυΩϡϝϯτੑ
4DBMBΛձࣾͰ͍͍͚ͨͲ Ͳ͏ͨ͠Β͍͍ͩΖ͏ʁ ձࣾͷٕज़తํͱ͔ɺϝϯόʔͷख़࿅ͱ͔ɺϓϩμΫτॻ͖͠ͱ͔
4DBMBΛձࣾͰ͍͍͚ͨͲ Ͳ͏ͨ͠Β͍͍ͩΖ͏ʁ ձࣾͷٕज़తํͱ͔ɺϝϯόʔͷख़࿅ͱ͔ɺϓϩμΫτॻ͖͠ͱ͔ ·͍ͣ·͠ΐ͏ʂ ͍͖ͳΓϓϩμΫτʹಋೖ͢Δͷେมɻ ͳͷͰɺ·ͣݸਓͰ݁͢ΔۀʹͬͯΈͯɺ ʮΑ͔ͬͨΑʂʯʮ໘ന͍Αʂʯͱڭ͍ͯ͘͠ͷ͕Α͍͔͠Ε·ͤΜɻ
4DBMBͬͯɺͦͦ͜͜େ͖ͳ ϓϩμΫτ͚ͳΜ͡Όͳ͍ͷʁ 5XJUUFSͱ͔"QBDIF4QBSLͱ͔ΞυςΫͱ͔
4DBMBͬͯɺͦͦ͜͜େ͖ͳ ϓϩμΫτ͚ͳΜ͡Όͳ͍ͷʁ 5XJUUFSͱ͔"QBDIF4QBSLͱ͔ΞυςΫͱ͔ ͪΐͬͱͨ͠εΫϦϓτΛ ॻ͘ͷʹ͍͍ײ͡Ͱ͢ (*U)VCͷτϨϯυΛݟΔͱɺ͔֬ʹࢄγεςϜϏοάσʔλɺ ػցֶशܥͷϓϩμΫτ͕ଟ͍Ͱ͢ɻ ͕ɺͪΐͬͱͨ͠ίʔυΛॻ͍ͯαοͱಈ͔͢͜ͱ࣮ಘҙͳΜͰ͢ɻ
r.BSUJO0EFSTLZ -FY4QPPO BOE#JMM7FOOFST 5IFOBNF4DBMBTUBOETGPSlTDBMBCMFMBOHVBHFz ʜ :PVDBOBQQMZ4DBMBUP BXJEFSBOHFPGQSPHSBNNJOHUBTLT GSPNXSJUJOHTNBMMTDSJQUTUPCVJMEJOHMBSHFTZTUFNT
4DBMBେֻ͔ΓͳϓϩμΫτΛ࡞Δͷʹద͍ͯ͠ΔݴޠͰ͕͢ɺ )BDLZͳߦdेߦͷ εΫϦϓςΟϯάे շదʹͰ͖·͢
4DBMBେֻ͔ΓͳϓϩμΫτΛ࡞Δͷʹద͍ͯ͠ΔݴޠͰ͕͢ɺ )BDLZͳߦdेߦͷ εΫϦϓςΟϯάे շదʹͰ͖·͢
# %FNPOTUSBUJPO5JNF .BSLEPXOΛࣼΊಡΈ͢Δ
TDBMBJP4PVSDF w ϩʔΧϧϦϞʔτͷϑΝΠϧಡΈॻ͖ʹศར w ςΩετϑΝΠϧΛߦ୯ҐDIBS୯ҐͰJUBSBUJWFʹ ॲཧͰ͖ΔͷͰɺϑΝΠϧαΠζ͕େ͖ͯ҆͘৺ w HFU-JOFTͯ͠ίϨΫγϣϯϝιουͰΩϝΔͳͲ
# %FNPOTUSBUJPO5JNF εΫϨΠϐϯάΛͬͯΈΔ
4USJOH*OUFSQPMBUJPO w จࣈྻϦςϥϧͷલʹTΛ͚ΔͱɺมΛల։Ͱ͖Δ val price = 1000 s"Price is $price"
// => Price is 1000
5SJQMF2VPUF "Hello triple quote!\nHello stripMargin!" """Hello triple quote! Hello stripMargin!"""
"""|Hello triple quote! |Hello stripMargin!""".stripMargin w վߦΛؚΉจࣈྻΛຒΊࠐΉʹɺΛ͏ w ΠϯσϯτΛଗ͑ΔʹΠϯσϯτจࣈ c ͱTUSJQ.BSHJOΛ͏
4USJOH*OUFSQPMBUJPOͱ5SJQMF2VPUF val response = s"""HTTP/1.1 ${status.value} |Date: ${rfc1123Formatter.format(now)} |Server: SimpleScalaHttpServer
|Content-Type: $contentType |Content-Length: ${body.length.toString} |Connection: Close | |""".stripMargin ͪΐͬͱͨ͠ςϯϓϨʔτΤϯδϯΈ͍ͨʹ͏͜ͱ
$-*πʔϧʹͯ͠ ͬ͞Γ͗͢͠͡Όͳ͍ʁ ύΠϓͱ͔ͰΨϯΨϯͭͳ͍ͰαΫαΫಈ͔͍ͨ͠ΜͰ͚͢Ͳɻ
$-*πʔϧʹͯ͠ ͬ͞Γ͗͢͠͡Όͳ͍ʁ ύΠϓͱ͔ͰΨϯΨϯͭͳ͍ͰαΫαΫಈ͔͍ͨ͠ΜͰ͚͢Ͳɻ ࣮ߦՄೳͳόΠφϦΛੜ͠ αΫαΫಈ͔͢͜ͱͰ͖·͢ 4DBMB/BUJWF(SBBM7.ͷ4VCTUSBJU7.Λ͍ɺ (PͷΑ͏ʹ࣮ߦՄೳͳόΠφϦΛੜ͢Δ͜ͱՄೳͰ͢ɻ +7.ͷىಈΛͨͣʹαΫαΫಈ͔͢͜ͱ͕Ͱ͖·͢ʂ
IUUQXXXTDBMBOBUJWFPSHFOW
# %FNPOTUSBUJPO5JNF .BSLEPXOࣼΊಡΈΛ4DBMB/BUJWFͰߴԽ
·ͱΊ w 4DBMBΛࣄͰ͓͏ʂ w ·ͣݸਓͷۀͰ݁͢ΔൣғͰͬͯΈΑ͏ʂ w 4DBMBεέʔϥϒϧͳݴޠʂ w େ͖͍ϓϩμΫτɺখ͞ͳεΫϦϓτ͍͍ײ͡ʂ w
εΫϦϓςΟϯάʹศརͳػೳΛ͓ͬͯ͜͏ʂ w TDBMBJP4PVSDF w 4USJOH*OUFSQPMBUJPO w 5SJQMF2VPUF w ࣮ߦՄೳͳόΠφϦΛੜ͢Δ͜ͱͰ͖ΔΑʂ w αΫαΫಈ͍ͯɺͦͷ··νʔϜʹڞ༗Ͱ͖Δʂ w མͱ݀͋͠Δ͔ΒؾΛ͚ͭΑ͏ʂ
5IBOLZPV Some(question) match { case Twitter => "@todokr" case
GitHub => "@todokr" case Facebook => "shunsuke.tadokoro" case _ => invokeDynamic }