DDD@H 8FCαʔϏεʹ%#͕͋Δ w ͱΓ͋͑ͣ)Ͱྑ͍͔ʜ w .Z42-8PSL#FODIͰ࡞ͬͨ%%-͕ྲྀͤͳ͍ʂ w ϩʔΧϧͷ.Z42-͕ݹ͍ɻCSFXVQEBUFʂ w ͍VQHSBEFͩͬͨ w %PDLFS ͱ͔͍͏ͭͰ .Z42-Λಈ͔͢ͷ͕ φ͍ΜͰ͔͢Ͷ w IFSPLV1PTUHSF42-ͳΜͩͬͨ
DDD@H 8FCαʔϏεʹը໘͕͋Δ w ͱΓ͋͑ͣదʹCPPUTUSBQͰ࡞Ζ͏ʂ w ΄͏΄͏ɺ4FNBOUJD6*ͷ΄͏͕ΠϚυΩͬΆ͍Β͍͠ w ςϯϓϨʔτΤϯδϯʁ࣌41"Ͱ͠ΐ w ੜ$44ਏ͍͔Β4BTTʹ͠Α͏ w 8FCQBDL CBCFMMPBEFS ͳʹͦΕ͓͍͍͠ͷʁ w EJW͕தԝʹدΒͳ͍
DDD@H 4DBMB w +BWBͱͷ૬ޓӡ༻ੑ w γʔϜϨεͳݺͼग़͠ɺ+BWBඪ४ϥΠϒϥϦͷ࠶ར༻ w ؆ܿੑ w লུՄೳͳߏจɺܕਪɺڧྗͳඪ४ϥΠϒϥϦ w நͷߴ͍ίʔυɺ৽੍͍͠ޚߏจΛఆٛͰ͖Δදݱྗ w 8IBUͷڧௐɺ)PXͷӅณ w ੩తܕ͚ w ݕূՄೳੑɺϦϑΝΫλͷ͢͠͞ɺυΩϡϝϯτੑ
DDD@H ࠓճ༻ҙͨ͠)551αʔόʔ w ىಈ͠ɺMPDBMIPTUͷಛఆͷϙʔτͰ)551ϦΫΤετΛͪड͚Δ w ରԠ͢Δ)551ϦΫΤετϝιου(&5ͷΈ ͦΕҎ֎ͷϝιου(&5ͱΈͳ͢ w QVCMJDσΟϨΫτϦΑΓ্ͷ֊ͷϦΫΤετʹ 'PSCJEEFOΛฦ͢ w Ϧιʔεͷ.*.&֎෦ϑΝΠϧͰઃఆͰ͖Δ w ϦΫΤετΛϒϩοΫ͠ͳ͍ʢϚϧνεϨουʣ w ,FFQ"MJWF͠ͳ͍ɻίωΫγϣϯDMPTF͢Δ w )551$BDIF͠ͳ͍ɻฦ͞ͳ͍
DDD@H 4PDLFUͷѻ͍ // αʔόʔιέοτͷੜ val serverSocket = new ServerSocket(8080) while (true) { // ଓΛͪड͚Δɻଓ͞ΕΔ·ͰϒϩοΫ val socket = serverSocket.accept val in = s.getInputStream val out = s.getOutputStream ... } 4JNQMF)UUQ4FSWFSTDBMBʢൈਮʣ
DDD@H 4PDLFUͷѻ͍ʹֶ͍ͭͯΜͩ͜ͱ w 4FSWFS4PDLFUΦϒδΣΫτΛੜ͠ɺ ΫϥΠΞϯτ͔ΒͷଓΛBDDFQUͰͪड͚Δ w 4PDLFUΦϒδΣΫτʢΫϥΠΞϯτιέοτʣ͔Β *O0VUQVU4USFBN͕औಘͰ͖Δ w *OQVU4USFBN͔Β)551ϦΫΤετΛ3FBE͠ɺ 0VUQVU4USFBNʹ)551ϨεϙϯεΛ8SJUF͢Δ
DDD@H ύλʔϯϚον w +BWBͷTXJUDIจʹࣅ͍ͯΔ͕ɺΑΓॊೈͰڧྗ w ʹҰக͢Δ͔͚ͩͰͳ͘ɺܕߏͰذ 0 match { case 0 => "Zero" // "Zero" case _ => "Other" } List(1, 2, 3) match { case List(_, x, _) => x // 2 case _ => -1 } 1 match { x: Int => s"$xInt" // 1Int x: String => s"$xString" x => s"$x???" }
DDD@H ύλʔϯϚον w ਖ਼نදݱΦϒδΣΫτʹରͯ͠Ϛονͤ͞ΒΕΔ val pattern = "(.+)/(.+)/(.+)".r //.rͰregexܕ "2017/11/18" match { case pattern(y, m, d) => s"${y}${m}݄${d}" case _ => "???" }
DDD@H 0QUJPOܕ requestLine match { case pattern(method, path, version) => Some(Request(method, path, version)) case _ => None } w +BWBͰ͍͏0QUJPOBM w 4PNFͱ/POF͔ΒͳΔܕ w ͕͋Δ͔ͳ͍͔͔Βͳ͍ঢ়ଶΛද͢ w ͕ଘࡏ͢Δ͔ͷνΣοΫΛڧ੍Ͱ͖Δ
DDD@H 5SZXJUI3FTPVSDFT try (InputStream in = new FileInputStream(file)) { // Կ͔ϦιʔεΛѻ͏ॲཧ } // try۟Λൈ͚ͨΒclose w USZ۟Λൈ͚ͨΒࣗಈͰDMPTF w ରKBWBJP$MPTFBCMF
KBWBMBOH"VUP$MPTFBCMFͷ࣮Ϋϥε
DDD@H -PBO1BUUFSO w ʮआΓͨΒฦ͢ʯΛ࣮֬ʹߦ͏ w ੍ޚߏͷΑ͏ʹݟ͔͚࣮ͤͯϝιου val reader = new BufferedReader(...) using(reader) { r => // readerΛͬͨԿ͔ͷॲཧ } // ϒϩοΫΛൈ͚ͨΒreaderclose͞Ε͍ͯΔ
DDD@H -PBO1BUUFSO using(socket) { s => val in = s.getInputStream val out = s.getOutputStream val request = parser.fromInputStream(in) val response = request.map(handleRequest) response.foreach(_.writeTo(out)) } 4JNQMF)UUQ4FSWFSTDBMBʢൈਮʣ
DDD@H JNQMJDJU8IBUͱ)PXͷ w )PX͕ڊେʹͳΔͱɺίʔυͷຊདྷͷҙਤ͕ຒΕͯ͠·͏ w JNQMJDJUͷେ͖ͳϞνϕʔγϣϯ)PXͷӅณ w 8IBUͱ)PXΛ͢Δ͜ͱͰɺతΛతʹࣔ͢͜ͱ͕Ͱ͖Δ val values: Seq[(String, Option[Int])] val sorted = sort(values)( tuple2Comparator( stringComparator, optionComparator(intComparator))) val sorted = sort(values) // implicit
DDD@H จࣈྻ݁߹ w ϨεϙϯεʢΦϒδΣΫτϚοϓʣ͔Β )551ϨεϙϯεϔομΛΈཱ͍ͯͨ public class Response { public final Status status; public final String contentType; public final int contentLength; public final byte[] body; }
DDD@H w $MPKVSFͰจࣈྻͷ݁߹Ͱͳ͘TUS w ՄมҾɺ4ࣜͳΒͰ TUS (+ "hoge" "fuga") ClassCastException java.lang.String cannot be cast to java.lang.Number clojure.lang.Numbers.add (Numbers.java:128) (str "hoge" "fuga" "piyo") // => hogefugapiyo
DDD@H )551αʔόʔΛ࡞ͬͯݴޠΛֶ΅͏ w %#ը໘Λ༻ҙ͢Δखؒͳ͘ɺखܰʹ։ൃ͕࢝ΊΒΕΔ w 8FC։ൃʹඞཁͳཁૉʹͦͦ͜͜Ұ௨Γ৮ΕΒΕΔ w จࣈྻૢ࡞ɺೖग़ྗɺฒྻॲཧͳͲ w ࠷ॳ͘͠ߟ͑͗͢ͳ͍ɻ ॳΊ͔Βߟ͑ํΛࠜຊతʹม͑Δඞཁͳ͍ w طʹ͍ͬͯΔ͜ͱͱEJGGΛͱͬͯΈΑ͏ w ͦͷݴޠͷੈք؍ΛΔख͕͔Γ͕ͦͷEJGGʹ͋Δ͔