馬場を用いたコマンドラインにおけるクロジュールの利用



通常のclojureコード- libplやコマンドラインでbabashkaで実行できますhere )

導入


私は決して学ばなかったBash それで流暢に十分によく.私がすぐに使用した基本的なbashのものを超えて何かを必要とするならばPython コマンドラインスクリプトで.
私は現在、私のclojureシンプルなサーバーを再度実装していますIntegrant 図書館.この新しいバージョンでは、CSV、AWSのDynamoDB、およびPostgresの3つのデータストアを実装しました.私はすでに開発データをダイナモ(Pythonを使用して)にインポートを実装していたBabashka 開発データをPostgresにインポートするには、bashを使ってスクリプトを実行するときに、Pythonをクロージャと置き換えることができるかどうか試してみてください.
スクリプトは私のClojure git ディレクトリ内のrepopostgres .

馬鹿とは


Babashka 「スクリプトのためのクロジュール」です.Babashkaの作成者として.Michiel Borkent , Babashkaホームページの中で言います:「Babashkaの後の主な考えは、あなたがそうでなければbashを使う場所で、クロジュールを活用することです」Babashkaを使用してClojureコードを実行するとき、スクリプトはJVMバイトコードにコンパイルされず、Clojure言語の特定のコア名前空間を実装するネイティブバイナリランタイムで実行されます.したがって:
  • あなたがプログラミングタスクを実行する必要がある場合、起動時の問題ではない-使用してclojure JVMに.
  • あなたがスクリプトと高速起動のためのclojureが必要な場合は重要です-使用Babashka.
  • Babashkaホームページは良い説明を提供していますDifferences with Clojure .

    Babashkaの開発


    Babashkaとのきちんとしたことは、あなたのClojureプロジェクトの一部としてあなたのBabashkaスクリプトを開発することができるか、独立しているが、あなたの大好きなClojure IDEを使っていることです.上の写真はClojure IDEでクロジュアコードを見せています.Cursive . ディレクトリにPostgresデータベースにデータをインポートするpostgres , だから私は次の余分なパスを私のdeps.edn :
     :postgres {:extra-paths ["postgres"]}
    
    
    それから、プロジェクトの他のクロジュールコードの一部としてクロジュールのコードを開発することができます.Babashkaを使用してコードを実行しているか、Clojure IDE RPL(ファイルを使用しているとき)に、我々がClojureコードで知っているようにBabashkaに旗であなたのClojureコードを走らせるように言う短いbashスクリプトを最初に作りましょうrun-bb-load-data.sh ):
    #/bin/bash
    
    export POSTGRES_PASSWORD=simpleserver
    export RUNNING_BB=TRUE
    bb bb_postgres.clj
    
    
    フラグはRUNNING_BB 上記エクスポート.
    クロゼアコードでは、トップレベルのフォーム(run-me) 名前空間でbb_postgres.clj ):
    (defn run-me
      "Loads data only if running from babashka script which sets the environment variable.
      We don't want the repl to load the data when reloading the namespace.
      In repl experimentation use the rich comment below."
      []
      (let [running-bb? (System/getenv "RUNNING_BB")]
        (if (= running-bb? "TRUE")
          (import-data))))
    
    (run-me)
    
    
    すなわち、名前空間replを再ロードするとき、コードは実行されます、しかし、旗がセットされないならば、それは実際に何もしません- Babashkaを使用してコードを実行しているならば、それはコードを輸入します.この理由は、私がクロージャのワークフローの一部として名前空間を再ロードするとき、データのインポートが起こらないことです.データのインポートやその他の機能をテストするための開発目的のためにrich comment ファイルの最後に
    (comment
      (def data-dir "dev-resources/data")
      (get-raw-products data-dir 2)
      (get-product-groups data-dir)
      (do
        (delete-products!)
        (delete-product-groups!))
      (vals (get-users data-dir))
      (load-users (vals (get-users data-dir)))
      (import-data)
      (db-get-all-product-groups)
      (db-get-all-products)
      )
    
    
    The comment ブロックはここでreplが再読み込み時にこのコードを実行しないようにするためです.コメントブロック内の関数コールは、特定の順序で追加された実験です.REPLで開発するとき、典型的なclojureトリックで評価されるために、私は個々にこれらの形のどれでも送ることができます.

    馬場使用例


    私は、私が現在シェルスクリプトでClojureを使うことができるという考えが本当に好きです.もちろん、私はBabashkaなしでシェルスクリプトでClojureを使うことができました、しかし、JVMの上に小さなClojureスクリプトを始めることは特定の罰をしますClojure’s slow start — what’s inside? アレキサンダーYakushevによって、それについて詳しく知るために).Babashka - Babashkaブーツライトニング高速でそうでない:
    λ> time bb '(println "Hello world!")'
    Hello world!
    
    real    0m0.006s
    user    0m0.003s
    sys 0m0.003s
    
    
    BABASKAを使った個人用スクリプトの使用例はおそらく、Babashkaを使ってPostgresデータベースにデータをインポートするようにしました.
    (defn run-sql [command]
      (sh/sh "psql" "--host" "localhost" "--port" "5532" "--username=simpleserver" "--dbname=simpleserver" "-c" command))
    
    (defn insert-product-group! [product-group]
      (println "Inserting product-group: " product-group)
      (let [[id name] product-group
            command (str "INSERT INTO product_group VALUES ('" id "', '" name "');")]
        (run-sql command)))
    
    (defn load-product-groups [product-groups]
      (doseq [pg product-groups]
        (insert-product-group! pg)))
    
    (defn get-product-groups [data-dir]
      (let [raw (with-open [reader (io/reader (str data-dir "/product-groups.csv"))]
                  (doall
                    (csv/read-csv reader)))
            product-groups (into {}
                                 (map
                                   (fn [[item]]
                                     (str/split item #"\t"))
                                   raw))]
        product-groups))
    
    (defn import-data []
      (let [data-dir "dev-resources/data"
            product-groups (get-product-groups data-dir)]
    ;...
        (load-product-groups product-groups)
    ;...
    
    
    すなわち、CSVを解析して、データを変換して、それから変換されたデータで若干のプログラムを呼ぶ、おそらく何が返されて、他のものをするかについて読んでください.このようなことは、普通の古いbashを使って行うことができましたが、bashを使って他のプログラムを呼び出すことができます.
    もう一つのアドホックな例.私は、私のブログにどのように多くの異なったカテゴリーがあるかについて疑問に思っていました.もちろん、私はJekyll生成サイトをチェックすることができました、しかし、我々がBabashkaを使ってこれを解決する方法を見ましょう:
    λ> grep -ohP 'category:.*\[.*\]' _posts/*.md | bb -i '(into #{} (flatten (map #(drop 1 (re-matches #"category:.*\[(.*)].*" %)) (vec *input*))))'
    #{"devops" "clojure" "aws" "linux" "iac" "azure" "kubernetes" "writing" "psychology" "ml" "gcp" "languages" "well-being" "finance" "metosin"}
    
    λ> grep -ohP 'category:.*\[.*\]' _posts/*.md | bb -i '(count (into #{} (flatten (map #(drop 1 (re-matches #"category:.*\[(.*)].*" %)) (vec *input*)))))'
    15
    
    
    私は決してツールを学ぶことを悩まなかったgrep , sed or awk 適切に、基本的なbash +の非常に基本的なgrepで何かをすることができないならば、私はすぐにPythonに変わりました.多分今のBabashkaとクロジュールを使用する.

    どのように、私はこの運動でBabashkaスクリプトを使用しますか?


    Babashkaを使って開発データをPostgresデータストアにロードしました.開発中、カスタムPostgresイメージを構築し、Just データストアを起動するためのレシピJustfile ):
    # Start local postgres
    @postgres:
        cd postgres && ./run-docker-compose.sh
    
    
    The run-docker-compose.sh Postgres Dockerコンテナを起動し、スキーマを作成し、最後に呼び出します./run-bb-load-data.sh Postgreresデータストアにデータを読み込みます.
    #!/usr/bin/env bash
    
    echo "NOTE: Remember to destroy the container if running again!"
    echo "Starting docker compose..."
    docker-compose -p ss-postgres -f docker-compose-setup-local-postgres.yml up -d
    sleep 5
    echo "Creating Simple Server schemas..."
    ./create-schema.sh
    sleep 1
    echo "Loading data..."
    ./run-bb-load-data.sh
    sleep 1
    docker logs -f ss-postgres_postgres_1
    
    

    シェルスクリプトでのクロジャ


    最後にいくつかのLinuxシェルスクリプトを行うときにPythonとclojureを比較しましょう.
    容易両方の言語は非常に簡単で、あなたがそれらを使用している場合に動作するように高速です.Pythonスクリプトの開発はかなり高速です.Clojureとの作業は1つの追加プラスしています:あなたはclojure replを使用することができます.
    ライブラリのサポート:Python勝.Pythonでスクリプトを書いているときには、いくつかのAWSライブラリを使うのがいいでしょう.table_importer.py - AWSboto3 ライブラリ)Babashkaのためのライブラリのサポートはもちろん、大規模ではありませんがclojure.core また、いくつかの追加ライブラリBabashka built-in namespaces - そのページに目を離してください、多分、Babashka図書館支持は将来的に成長しています!
    したがって、ライブラリのサポートはPythonと同じくらい良いかもしれません.しかし、私は本当にlocloureを愛しています、そして、私がClojureを使っているアプリを実行しているならば、それはBabashkaを使っている若干のアドホックスクリプトをすることに本当に良いです.

    結論


    私のツールボックスに別のスクリプトツールを持っているといいです.Babashka . Babashkaのおかげで、私がPythonの代わりにクロジャイルを私の好みのスクリプト言語として使い始めるならば、時間はわかります.少なくとも、この運動の中で、Babashkaは本当によくやりました.
    作家は、クラウドプロジェクトでclojureを使ってMetosinで働いています.あなたがフィンランドでClojureプロジェクトを始めることに興味があるならば、または、あなたはフィンランドでClojureトレーニングを得ることに興味があります.
    カリマルティラ
  • LinkedInのカーラマルティラのホームページ