長い前書き
さて、最近日本で静かなClojureブームが起こっています(要出典)。少し前にあった勉強会でも、50人弱の参加がありClojureという言語を学ぶ人が増えてきたという印象です。
ちなみに直近だと次はこの勉強会です。
clj-ebisu #1
長い前書き
さて、最近日本で静かなClojureブームが起こっています(要出典)。少し前にあった勉強会でも、50人弱の参加がありClojureという言語を学ぶ人が増えてきたという印象です。
ちなみに直近だと次はこの勉強会です。
clj-ebisu #1
#Fsharpを勉強したログ
学習に役立ちそうなサイトをいくつか見つける。
これはコミュニティ主体かな
Microsoftのガイド
弊社ではマイクロサービスでサービスを開発しています。その中には当然のようにありとあらゆるプログラミング言語(例えばKotlinとかRust, Go lnagなど)で書かれたAPIが存在しています。そして最近流行りのClojureで書かれたAPIも当たり前のように存在しています。
それぞれのAPIは基本的にはHTTP通信によってコミュニケーションしているわけですが、その際にひとつだけ気をつけておかないといけないことがあります。それは命名規則です。といってもそんなに難しい話ではなく、シンプルにURLのパスやJSONのキーをlowerCamelCaseにしておきましょう、というだけです(注意: あくまでも弊社の内部での約束事として)。Clojureでは一般的に変数や
#Clojure #Duct
#clojure #ataraxy
仕事でClojureのプロジェクトをはじめるとき、ここ数年はDuctを素直に使うケースが多い。そうなってくると自然とルーティングライブラリもAtaraxyを使うことが増えるんだけど(reititでいいじゃん、という意見はとりあえず受け付けてません><)、Clojureに不慣れな同僚(複数名)から「読み方がパッと分からない…」というフィードバックをもらうことがあるので、簡単に逆引き的
Clojure Advent Calendar 2018の12/4枠の穴埋め記事です。穴埋めなので、過度な期待はしないで読んでください。
最近、Ductを利用してアプリケーションを書いていて、モックを使ったテストで色々と考えることがあったので少し書いてみる。ちなみにサンプルはDuctを使って書いたけど、根本的にはIntegrantの話です。
以下のような状況に遭遇してしまったので調べていた。
以前、二畳半堂さんがハマっていた問題と根本的なところは同じ。
https://blog.nijohando.jp/post/clojure-duct-component-init/
で、結局なんでこれは依存関係として認められないのか調べていたら、コミットコメントにいきついた。
https://github.com/weavejester/integrant/commit/411cbbf219d72d918fa9f01efef514dca6734693
clojure.specは僕が改めて書かなくてもathosさんやカマイルカさんがいろいろと素晴らしい発表をしているので、改めて僕が書く必要はないと思っていたんだけど、Clojureそのものに不慣れな人たちはまだ使い方が伝わっていないようだったので簡単にどう活用すればいいか書いてみようと思う。
clojure.specは大きく3つの使い方がある
ドキュメントの内容を補完する
開発やテストのときにspecによるチェックを行う
Integrantのおっかけやってたら、面白い変更があったので簡単に紹介。
0.7.0-alpha1 (2018-01-24)
Added refset
function and tags
Added prep
function and associated prep-key method
Added key-comparator
function
昨日の話。
Ductでは幾つかのモジュールが提供されていて、これらのモジュールは初期設定値を持っている。そして、これらの値は当然ユーザー側の設定ファイル(config.ednなど)によって上書きすることができる。
ただし、以下のような場合には単純に上書きすることができない。
duct-module.ednがDuctのデフォルトの設定ファイルで、config.ednがユーザー側の設定ファイルだということにする(実際のDuctにはduct-module.ednなどという設定ファイルはないが、説明のため簡略化させてもらう)。これは:same-site
の値を外したくて、このように記述している。
悩ましい問題らしいので、ここで少し書くことにします。ちなみにComponentを利用していても、問題としては似たようなものなので適当に読み替えてください。
基本的には以下の2パターンがあると思います。
すべてのRingハンドラーをコンポーネントとして扱う
ルーター部分までをコンポーネントにして、Ringハンドラーはただの関数として扱う
すべてのRingハンドラーをコンポーネントとして扱う
近頃、ライフサイクル管理を行うライブラリとして、Integrantが注目を集めています(要出典)。
実際のところはDuct使いたいから仕方なく覚えたい、とか、James Reevesが作ったから、とか、そのあたりが大きいのかもしれませんが…。何はともあれ、現時点で日本語による解説がないので簡単に説明しようと思います。
インストール
いつも通りプロジェクトの依存ライブラリとして追加します。現在の最新バージョンは0.6.1
。
デフォルトでなってた。便利。
lein duct setup
すると作られる。
https://github.com/duct-framework/duct/blob/945ffb5fb32787e20b87875624adb464a705e550/lein-duct/resources/leiningen/duct/dir-locals.el
ref. cider-ns-refreshのタイミングでシステムを再起動したい
Ductのboundariesあたりの話だけど、Ductにしか使えない話ではないので切り出して説明します。
一般的なアプリケーションを作っている場合、外部のシステムというのは必ず存在しています。それはミドルウェアの形をしていたり、連携しないといけないAPIの形をしていたり様々な形で私たちの目の前に現れます。
このときに役立つのがboundariesという考え方です。文字通り境界ということです。
ちなみにこの考え方を取り込もうとした話は、一度書いたのですがそのときはプログラムを半自動生成したところに主眼を置いたのであまり説明していませんでした。
フラクタルヘアが活かすClojureを開発したつよい人
#clojure
できるだけシンプルなものを選ぶ
シンプルとイージーは違う
シンプルなものは組み合わせやすいのと応用が効きやすい
このあたりはある程度経験を積むことによって判断ができるようになる
マクロより関数、関数よりデータ
日本語でClojureを勉強している方は、孔雀本を読まれた方が多いとは思います。孔雀本は原著がClojure1.3のときのものなので、(当然と言えば当然ですが)その後追加された機能などの説明がありません。とはいえClojureは後方互換性を大変重要視している言語なので、1.3の知識があれば十分Clojureのコードを読んだり書いたりすることはできます。
しかし、既にClojureのバージョンはそろそろ1.9を向かえようとしています。1.3から1.9の間の変更点を押えたいと思う方は沢山いると思います。そこで簡単にそれぞれのバージョンでの変更を押さえるための参照を紹介します。
Clojureを書く人のこと
#clojure
http://arachne-framework.org/
#clojure #webアプリケーションフレームワーク
同僚氏の古い記事をうっかり見つけてしまって、そういえば昔そういうのが流行ったときがあったなーと思ったのと、最近core.asyncをもう少し使いこなせるようになりたいと思っていたところだったので、練習がてら書いてみる(core.asyncそのものというよりはその周辺技術ではあるので、アレですが)。
同僚氏の記事: redux-sagaでズンドコキヨシ
#Clojure
https://github.com/r0man/inflections-clj
#Clojure #Ataraxy
ルーティングを書いているとうっかりパスが被ってしまうことがあります。そんなことなくない?って思うかもしれませんがあります。例えば以下の例。
期待した結果は[:article/show-latest-article]
でしたが、結果は[:article/show-article]
となりました。上のような式を評価しても場合によっては、期待した通り [:article/show-latest-article]
が返ってくることもあるかもしれません(ちなみに上記の例だと確実に[:article/show-article]
が返っ
#clojure #ataraxy
#CIDER #Clojure
cider-print-quota
の値を適当なサイズに小さくしてしまう。Spacemacsだとこんな感じ。
自分の普段使ってるEmacsではちゃんと設定してたけど、ペアプロマシンとかには設定してなくてわりとうっかりやって、Emacsが応答しなくなることがあるのでメモ。
僕みたいに、しょっちゅうC-c C-p
としちゃう人は必須だと思う。
ちなみにこのオプションはCIDER 0.21のときに追加されたもの。
のメモ的なものです。
間違いなど指摘があればまで。
Clojureについて知りたい方
Clojureのリンクを見れば良いかもしれないです。
Clojureを仕事で使いたい方
ここ数年、年末年始のふりかえりと抱負みたいなのを書いてなかった。理由は自分のやってること/やりたいことが1年の中で激しく変わる可能性があるし、実際変わるからあまり意味をなさないと思ったからだ。事実、2019年の下半期を見渡しても、HTTPサーバーをGolangで書こうとしたり、mustacheを再実装しようとしたり、大きく余暇の時間の使い方が変わってる。
しかしながら、色んなことに手を出しているのも、何かしら考えがあったり、自分の中に燻っているものがあるからだと思うので、改めて2019年に行ったことをふりかえり、2020年の大きな方針だけでも決めることにした。
昨日はRingの依存関係からclj-timeが外れたという話をしました(ClojureでWebアプリケーションをつくるときに、Joda-Timeに依存しないようにする)。
今日はRingがどうやってclj-timeの依存関係を剥がしたのか解説をしたいと思います。
Ring 1.7.1以前にclj-timeはどう利用されていたのか
まずは以前のRing(1.7.1以前)はどのようにclj-timeを利用していたのかを見ていきます。以下のコードがclj-timeに依存していた部分です。何をしているかというと非常に単純で、wrap-cookies
が引数に取るオプション:max-age
, :expires
にJoda-Timeのインスタンスが渡されることを期待しています(もしくは整数値、文字列)。
Java界隈では当然のようにJoda-Timeへの依存度が下がっていると思うんですが、Clojure界隈ではどうでしょう。あなたのお手元のプロジェクトはJoda-Timeに依存していないと言えますか?
今日はそんな話を少しだけさせてほしいです。
何故、Joda-Timeに依存してはいけない?
依存していても問題ない、と言えば問題ないです。ですが、JSR-310(Date and Time API)がリリースされたJava 8以降を使っていれば、あえてJoda-Timeを使う必然性はありません。
#Clojure
https://github.com/henryw374/cljc.java-time
#Clojure
https://github.com/dm3/clojure.java-time
#Clojure #juxt
https://github.com/juxt/tick
#Clojure
興味深い
https://clojureverse.org/t/clojure-web-server-performance/4516
#ClojureでWebアプリケーションを作ってみる
これからClojureで初めてのWebアプリケーションを作成していきましょう。作っていく上であまりにも普段使わなかったり、見ないようなものだとどういう機能が必要か想像もつかないと思いますので、このシリーズではブログアプリ作っていくことにします。ブログアプリというとログイン機能があって、記事の一覧が見れて、記事を作成、編集、削除することができれば、世の中にあるブログと遜色ないようなものが出来
#Clojureでリバーシを作ってみる
何はともあれClojureプロジェクトを用意してみます。ターミナルからLeiningenを使って、新しいプロジェクトを作成します。
以下のようなプロジェクトが作られたことを確認できたら準備は完了です。
次からは早速、リバーシの土台を作っていきます。
-> Clojureでリバーシを作ってみる - Part2 Clojureで盤面と石をどう表現するか