c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

docker-compose の ephemeral container (kubectl alpha debug) っぽいやつ

Kubernetes に於いて debug する爲に cluster 内に突如 container を立てたく成ったならば kubectl run 〜 --restart=Never で立てられる。既に在る container 内に入りたければ kubectl exec 〜 でよく、Pod 内に container を立てたければ、今は ephemeral container と云ふ仕組みが有って kubectl alpha debug 〜 で出來る。

kubernetes.io

ところで手元の開發環境は相變はらず docker-compose である。既に立ってゐる container に入りたければ docker-compose exec 〜 でよい。docker-compose では cluster と Pod は同じものである。cluster 或いは Pod 内に conatiner を立てる操作は docker-compose run --rm 〜 であるが、その container の定義は docker-compose.yml に書かねばならず、面倒だ。docker-compose の作る network 内に container を立てられればよいのであるから、docker--network option で出來るのである。

docker-compose の作る network の名は、普通は ${DIRECTORY}_default である。docker network ls で調べてもよい。example/docker-compose.yml を起動してゐたとすると example_default だ。これを指定して、

docker run -it --network example_default --rm my_debug_image bash

これで何でも出來る。ん? 今何でも(

普段使ひの shell script を Clojure (Babashka) で書き換へた

Babashka は 10 ms 程度で起動する Clojure の runtime だ。Clojure を GraalVM で native code に compile し、shell script 使ひに便利な Clojure の標準 library と Java の class とを殘して削り、便利な library を幾つか加えたものである。66 MB に迄削ってある。

github.com

Haskell is good for scripting language ヾ(〃l _ l)ノ゙ 以來、日用 script はなるべく Haskell で書いてきた。これらを Babashka で書き直した。

github.com

Clojure の標準 library は私としては覺え易いし、Babashka は加えて JSONcurl が library として有り便利だ。

Clojure で日本の祝日を引く library を作った

Clojure で日本の祝日を引く library を作った。

github.com

既に同様の library が Java に在る (holiday-jp/holiday_jp-java) が、今囘のものは JVM で動く Clojure だけではなく、Erlang VM (BEAM) 上で動く Clojerl、.NET で動く Clojure CLRJavaScript に transpile される ClojureScript に對應した。これが Java 版には無い特徴だ。祝日の data は holiday-jp/holiday_jp を使ってゐる。

holiday-jp/between で二つの日附の間に在る祝日を引ける。

(is (= [{:date #inst "2019-11-23T00:00:00.000-00:00"
         :week "土"
         :week_en "Saturday"
         :name "勤労感謝の日"
         :name_en "Labor Thanksgiving Day"}
        {:date #inst "2020-01-01T00:00:00.000-00:00"
         :week "水"
         :week_en "Wednesday"
         :name "元日"
         :name_en "New Year's Day"}]
       (holiday-jp/between #inst"2019-11-22" #inst"2020-01-02")))

他に holiday-jp/holiday?holiday-jp/on を實裝した。

複數の Clojure 實裝に對應するには、Clojure に reader conditionals と云ふ仕組みが有りこれを使ふ。

clojure.org

何故作ったのか、一つは個人的な練習の爲であるが、一つは Elixir で作ってゐた application を Clojerl に移植してゐ、それに使ふ爲だ。library を作ると責務が明らかに成る爲、test を明解に書けて好い (Library を作ると云ふ開発手法)

昔に Elixir で同等の library を作った (今でもメンテしてる!)。

github.com

Clojure のも暫く使へたら holiday-jp org へ移そうかと思ってゐる。

Clojerl の Slack client を書いた

Erlang の好い感じの Slack client が無かったので書いた、のだが Clojerl で書いたので Erlang からは使へない。

github.com

README に書いた通り gen_event bahaviour を書けば Slack と會話出來る。

(ns example-bot.handler1)

(erlang.core/behaviours gen_event)

(defn init [{:keys [name] :as args}] #erl[:ok args])

(defn handle_call [_ state] #erl[:ok :ok state])

(def handle_event
  (fn* ([#erl[:receive-msg #as(msg #erl{"channel" channel "text" text "type" "message"})]
              #as(state #erl{:name name})]
         ; Handle msg here.
         #erl[:ok state])
       ([_ state]
         #erl[:ok state])))

gun を使って WebSocket で繋いでゐる。であるから WebSocket が通る通信路が要る。

github.com

Elixir には好い Slack client が在るので其れを使ひませう。

github.com

Clojerl で Erlang/OTP behaviour

behaviour (英國英語) は Java の interface に似て、module に指定の函數が實裝してゐなければ警告又は error を出す機能だ。Clojerl にも、無くても困らないが有ると嬉しい。

document には当然 (なんで当然?) 無い。GitHub repository の examples にも無い。Clojerl の test code に在った。

github.com

(ns example.server)

(erlang.core/behaviours gen_server)

; implementations here

これだけである。