$30 off During Our Annual Pro Sale. View Details »

Clojureに入門してHTTPサーバーをつくってみた話

 Clojureに入門してHTTPサーバーをつくってみた話

第十八回 渋谷JavaのLT資料です。

Shunsuke Tadokoro

January 31, 2017
Tweet

More Decks by Shunsuke Tadokoro

Other Decks in Technology

Transcript

  1. $MPKVSFʹೖ໳ͯ͠
    )551αʔόʔΛͭͬͯ͘Έͨ
    ौ୩+BWB
    !UPEPLS
    ָ͘͠

    View Slide

  2. ా ॴ ॣ ༎ ! 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

    View Slide

  3. 4DBMBº&NPKJͳϥΠϒϥϦΛͭ͘Γ·ͨ͠

    View Slide

  4. ΑΖ͓͘͠ئ͍͠·͢

    View Slide

  5. ͓͸ͳ͢͠Δ͜ͱ
    w ͜ͱͷൃ୺
    w ͭͬͨ͘)551αʔόʔʹ͍ͭͯ
    w )551αʔόʔʁ
    w ϦΫΤετ͔ΒϨεϙϯε·Ͱ
    w ·ͱΊ
    w )551αʔόʔΛͭͬͯ͘ΈͯΑ͔ͬͨ͜ͱ
    w $MPKVSFʹೖ໳ͯ͠Α͔ͬͨ͜ͱ

    View Slide


  6. ͜ͱͷൃ୺

    View Slide

  7. ʮ)551αʔόʔΛ࡞Δձʯ
    w ࣾ಺ͷ༗ࢤʹΑΔϥϯνษڧձ
    w ʮ8FCΞϓϦͭ͘Γ͍ͨʂʯ

    ʮͲͷϨϕϧͰͭ͘Δͷʁʯʮαʔόʔ͔Βͭ͘Δͷ͔ʁʯ
    w 2JJUBɺ4UBDL0WFSqPXFUD͸ݟͪΌͩΊ
    w ࢖͏ݴޠͷυΩϡϝϯτ΍3'$ɺଞݴޠͰͷ࣮૷͸ݟ͍͍ͯ
    w ʮ5̋,*0ܕΤϯδχΞཆ੒ॴʯ

    View Slide

  8. ཱͪ͸͔ͩΔ͍ͭ͘΋ͷน
    w ιέοτͬͯͳΜͰ͔͢ʁ

    ˠάάͬͯ΋ిٿ͔͠ग़ͯ͜ͳ͍
    w ը૾͕දࣔͰ͖ͳ͍

    ˠόΠφϦͳΜ͔ͩΒ0VUQVU4USFBN8SJUFS࢖ͬͪΌμϝ
    w NVMUJQBSUGPSNEBUB

    ˠCPVOEBSZʢσʔλͷ۠੾Γจࣈྻʣ͸ΫϥΠΞϯτ͕ܾΊΔ

    View Slide

  9. 4DBMB൛4JNQMF)5514FSWFS

    View Slide

  10. ࠓ೥ͷ৽ଔ΋ࢀՃͯ͠

    γʔζϯ΁

    View Slide

  11. ࣗ෼΋࠶౓$MPKVSFͰͭ͘Δ͜ͱʹ
    w ϙʔϧɾάϨΞϜʹ᱐͞Εͨ
    w ʮ&NBDT࢖ͬͯΔͷʹ-JTQॻ͍ͨ͜ͱͳ͍ΜͰ͔͢ʁʯͱઞΒΕͨ
    w ΞϯαΠΫϩϖσΟΞ͕ͳΜ͔͔ͩͬͨ͢͝

    View Slide

  12. IUUQBOTBJLVSPQFEJBPSHXJLJ-*41

    View Slide

  13. IUUQBOTBJLVSPQFEJBPSHXJLJ-*41

    View Slide

  14. IUUQBOTBJLVSPQFEJBPSHXJLJ-*41

    View Slide


  15. ͭͬͨ͘)551αʔόʔʹ͍ͭͯ

    View Slide

  16. View Slide

  17. )551αʔόʔʁ
    w MPDBMIPTUͷ೚ҙͷϙʔτͰ଴ػ
    w 5$1઀ଓɺ)551ϦΫΤετΛड͚औΔ
    w )5.-΍ը૾ͳͲΛ)551Ϩεϙϯεͱͯ͠ฦ͢

    View Slide

  18. ϦΫΤετ͔ΒϨεϙϯε·Ͱ
    w DPSFDMK
    w SFRVFTUDMK
    w SFTQPOTFDMK

    View Slide

  19. DPSFDMK
    w ΞϓϦέʔγϣϯͷΤϯτϦʔϙΠϯτ
    w ೚ҙͷϙʔτͰ઀ଓΛ଴ͪड͚ɺϦΫΤετ͝ͱʹιέοτੜ੒
    w ιέοτੜ੒Ҏ߱ͷॲཧ͸ผεϨουͰ࣮ߦ

    View Slide

  20. +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();
    ...
    ϦΫΤετ͝ͱʹιέοτੜ੒

    View Slide

  21. SFRVFTUDMK
    w ιέοτͷ*OQVU4USFBNΛSFBE͠ɺ

    )551ϦΫΤετͱͯ͠ύʔε
    w ϦΫΤετ͸ͨͩͷ.BQͱͯ͠දݱ

    View Slide

  22. $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͢Δ

    View Slide

  23. SFTQPOTFDMK
    w ϦΫΤετΛݩʹɺϑΝΠϧΛόΠτྻ΁
    w ιέοτͷ0VUQVU4USFBNʹ)551Ϩεϙϯεͱͯ͠XSJUF

    View Slide

  24. $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;
    จࣈྻͷ݁߹

    View Slide

  25. ·ͱΊ

    View Slide

  26. )551αʔόʔΛͭ͘Δޮ༻
    w Ұ࣍৘ใʹ͋ͨΕΔΑ͏ʹͳΔ

    +BWBEPDɺ3'$ɺ&$."ɺFUD
    w Πϯλʔωοτͷ࢓૊Έ͕ݟ͑ͯ͘Δ

    ιέοτɺΧʔωϧɺ5$1ɺ)551ɺFUD

    ʮे෼ʹൃୡͨ͠ςΫϊϩδ͸ຐ๏ͱݟ෼͚͕͔ͭͳ͍ʯ
    w ଞͷϛυϧ΢ΣΞͷத਎ʹڵຯΛ࣋ͭ

    ࠓ೥͸%#Λ࡞ͬͯΈ͍ͨ


    View Slide

  27. $MPKVSFʹೖ໳ͯ͠Α͔ͬͨ͜ͱ
    w ؔ਺ྗͷ޲্

    ߴ֊ؔ਺΍ແݶϦετɺ஗ԆධՁ͕਎ۙʹ
    w εϨουϓʔϧΛҙࣝ͢ΔΑ͏ʹ

    HPͱUISFBEͬͯԿ͕ҧ͏ʁˠछྨ΍ಛੑΛؾʹ͢ΔΑ͏ʹͳͬͨ
    w ঢ়ଶΛͲ͏ѻ͏ʁ00WT$MPKVSFXBZ

    $MPKVSFͰ͸ʮΞΠσϯςΟςΟʯͱʮঢ়ଶʯΛ੾Γ཭͢

    ൺֱ͢Δ͜ͱͰ͓ޓ͍͕ΑΓ໌֬ʹ


    View Slide

  28. IUUQTBZBUPQHJUIVCJPDMPKVSFCFHJOOFS

    View Slide

  29. ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ

    View Slide