Skip to content

Instantly share code, notes, and snippets.

View lagenorhynque's full-sized avatar
🐬
architecting & managing

Kent OHASHI lagenorhynque

🐬
architecting & managing
View GitHub Profile
@lagenorhynque
lagenorhynque / clojure-rest-api-examples-for-minimalists.md
Last active November 11, 2022 07:03
ミニマリストのためのClojure REST API開発入門

新たなプログラミング言語に入門したら、早く実用的なアプリケーションを作ってみたくなるものです(ちなみに私 lagénorhynque🐬 は最近、Elixirに入門しました)。

コミュニティの発展とともにClojureの応用領域もますます拡大していますが、定番は何よりWeb開発ということで本記事では素早く最小構成的にREST APIを開発する方法を紹介します。

DuctLuminusなどWebアプリ開発をスムーズにするための(マイクロ)フレームワークが有名なものだけでもいくつか存在しますが、今回はHTTPサーバ抽象と基本的なユーティリティを提供するRingとルーティング機能を提供するbidiによるミニマルな実装を考えます。

サンプルコードはPythonライブラリFlask-RESTfulのドキュメントQuickstartの例を参考にし、敢えて名前空間を分割せず1ファイルにまとめる構成にしています。

@lagenorhynque
lagenorhynque / counter.clj
Last active May 25, 2019 16:18
Simple counter programs in Elixir & Clojure
user> (defn counter [init]
(let [c (atom init)]
#(swap! c + %)))
#'user/counter
user> (def c1 (counter 0))
#'user/c1
user> (def c2 (counter 0))
#'user/c2
user> (c1 2)
2
@lagenorhynque
lagenorhynque / elixir-from-a-clojurians-perspective.md
Last active December 23, 2023 11:19
ClojurianからみたElixir

ClojurianからみたElixir


(defprofile lagénorhynque
  :id           @lagenorhynque
 :reading "/laʒenɔʁɛ̃k/"
@lagenorhynque
lagenorhynque / lousy_calculator.clj
Created April 30, 2019 18:01
Typespecs in Elixir & clojure.spec in Clojure
(ns lousy-calculator
(:require [clojure.spec.alpha :as s]))
(s/def ::number-with-remark (s/tuple number? string?))
(s/fdef add
:args (s/cat :x number?
:y number?)
:ret ::number-with-remark)
@lagenorhynque
lagenorhynque / generic_size.clj
Last active May 1, 2019 05:28
Protocols in Elixir & Clojure
(ns generic-size)
(defprotocol Size
(size' [data] "Calculates the size (and not the length!) of a data structure"))
(extend-protocol Size
String
(size' [s] (count s))
clojure.lang.IPersistentMap
(size' [m] (count m))
@lagenorhynque
lagenorhynque / worker.clj
Last active April 27, 2019 15:51
Sequential vs concurrent execution in Elixir & Clojure
(ns worker)
(defn random []
(inc (rand-int 100)))
(defn sleep [n]
(println (str "sleep(" n ") started."))
(Thread/sleep n)
(println (str "sleep(" n ") ended."))
(str "result-sleep(" n ")"))
@lagenorhynque
lagenorhynque / logback.xml
Last active April 8, 2019 02:06
Logback settings for Pedestal
<configuration scan="true" scanPeriod="1 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyyMMdd HH:mm:ss} %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
</root>
@lagenorhynque
lagenorhynque / introduction-to-intellectual-property-law.md
Last active November 11, 2022 07:03
ソフトウェア開発に関わる知的財産法入門

ソフトウェア開発に関わる知的財産法入門


(defprofile lagénorhynque
  :id           @lagenorhynque
 :reading "/laʒenɔʁɛ̃k/"
user> (require '[clojure.spec.alpha :as s]
'[clojure.spec.test.alpha :as stest])
nil
user> (s/def :contact/name string?)
:contact/name
user> (s/def :contact-info/type keyword?)
:contact-info/type
user> (s/def :contact-info/email-contact-info string?)
:contact-info/email-contact-info
user> (s/def :contact-info/postal-contact-info string?)
dev> (let [count (volatile! 0)
t1 (Thread. #(dotimes [_ 1000] (vswap! count inc)))
t2 (Thread. #(dotimes [_ 1000] (vswap! count inc)))]
(.start t1)
(.start t2)
(.join t1)
(.join t2)
@count)
1577
dev> (let [count (atom 0)