Posts for: #Quarkus

quarkus のアプリ開発が楽しくなってきた

4時に寝て8時に起きた。昨日は久しぶりに夜更しして quarkus の調べものをしてた。新しいものを学ぶのはおもしろい。

ストレッチ

今週末は本当は実家に帰る予定だったのが、台風による雨で田んぼのコンディションがよくないので断念した。日曜日の夜、田んぼ仕事を終えて筋肉痛のところにストレッチしてもらう予定は変わってしまった。今日の開脚幅は開始前155cmで、ストレッチ後160cmだった。いつもは朝測っているのが夜になるので数値はよくなかった。とはいえ、あまり規則正しく寝てないわりには体調がよい。気候が涼しいせいかな。トレーナーさんに来週はもう10月ですよと言われて9月は過ぎさるのが早いと改めて思った。

quarkus アプリケーションと認可フロー

昨日の続き。お昼前ぐらいからずっと quarkus のアプリケーション開発をしていた。なんやらかんやらで3日間ずっと bolt や quarkus のソースやドキュメントを読んでいた。徐々に理解度が増えてきて、できることも増えてきて楽しくなってきた。web 系だと di に google/guice を使うものも多いけど、エンタープライズ系だと cdi なのかなぁとか思ってた。わからんけど。以前にも cdi のドキュメントを読んで関心があった。cdi は本当によく出来ていると思う。一方で難し過ぎて、そこまでコンテキストを厳密に管理する必要があるアプリケーションもそうないのかもなぁとは思ってた。今日 quarkus でアプリケーション開発していてドキュメントを読みながらやってみたところが次になる。

だいたい雰囲気は理解できてきたので backlog の Authentication & Authorization に書いてある oauth2 の Authorization Code Grant のフローを実装していた。access token の取得と refresh はできたのでこれを db に保存するのを明日以降にやってみる。

quarkus のビルド環境に手間取った

1時に寝て7時に起きた。休みだとやっぱりだらだらしてしまうな。

bolt for java on quarkus

昨日の続き。スクラッチから quarkus のアプリケーションの設定を gradle で行う。quarkus の上で slack apps としてのコマンドとイベントの振る舞いだけ確認した。

私は新規に開発する java アプリケーションは gradle を使うようにしている。これは java のよくないところだろうけれど、言語コミュニティが提供するパッケージマネージャやビルドツールがないから複数のツールが乱立している。maven から gradle に緩やかに移行していくのかな?と私は考えていたけれど、昔からあるライブラリのビルドツールを変更するのは労力に見合うメリットがないのか、maven も依然としてずっと使われ続けていくのかもしれない。maven と gradle の両対応という保守コストは、この先しばらく java コミュニティが抱えていく保守コストと言えるのかもしれない。quarkus はさらに独自の Quarkus CLI というビルドツールを提供している。そのため、ビルドのための設定だけで quarkus cli, maven, gradle の3つの方法があり、ドキュメントにもそれぞれの設定方法が書いてある。これを保守する方も使う方もややこしくて大変だなぁという印象を受けた。

BUILDING QUARKUS APPS WITH GRADLE をみながら次の maven cli で作った gradle プロジェクトのテンプレートをみながら build.gradle の設定をした。

$ mvn io.quarkus.platform:quarkus-maven-plugin:2.12.3.Final:create \
    -DprojectGroupId=my-groupId \
    -DprojectArtifactId=my-artifactId \
    -Dextensions="resteasy-reactive,resteasy-reactive-jackson" \
    -DbuildTool=gradle

あと私は設定ファイルを yaml で管理したいので次の拡張も追加した。gradle タスクでも定義されていて次のように実行する。

./gradlew addExtension --extensions="quarkus-config-yaml"

この cli がやっていることは基本的に dependencies に次の1行を追加するだけ。

dependencies {
  implementation 'io.quarkus:quarkus-config-yaml'
  ...
}

設定ファイルを yaml から読み込めるようになると初期設定は次のようになる。

$ vi app/src/main/resources/application.yaml 
quarkus:
  http:
    port: 3000
  log:
    level: INFO
    category:
      "com.slack.api":
        level: DEBUG
      "tutorial.bolt.sample":
        level: DEBUG
  package:
    type: uber-jar

開発サーバーは次のようにして起動する。

$ ./gradlew quarkusDev

quarkusDev enables hot deployment with background compilation, which means that when you modify your Java files or your resource files and refresh your browser these changes will automatically take effect. This works too for resource files like the configuration property file. The act of refreshing the browser triggers a scan of the workspace, and if any changes are detected the Java files are compiled, and the application is redeployed, then your request is serviced by the redeployed application. If there are any issues with compilation or deployment an error page will let you know.

https://quarkus.io/guides/gradle-tooling#dev-mode

hot deployment 機能のおかげでソースや設定ファイルを変更すると自動的に反映される。他の言語なら普通の機能かもしれないけど、java でもそういう仕組みが普通になったんだなと思って感心した。変化に付いていけない開発者のような気持ちになった。

slack apps 開発に着手

0時に寝て6時に起きた。あまりうまく眠れなかった。

bolt for java

slack apps を開発するためのフレームワークとして bolt と呼ばれる高レベルのフレームワークが提供されている。このフレームワークは slack sdk を使って作られていて、slack apps の開発が簡単になるようにユーティリティが提供されている。The Bolt family of SDKs によると、javascript, python, java 向けに提供されている。以前 bizpy でも slack アプリ開発のチュートリアルの勉強会をしたことがある。そのときは bolot for python を使っていた。

一度触ったことがあったので bolt がどういうものかはすでに知っている。その java 版を使って slack apps を作ってみようと取り組み始めた。まずはチュートリアルを一通りやってみようと次のリポジトリでやってみた。

チュートリアルの内容を動かすだけならすぐできた。次に java の waf は何を使おうかを調べてた。Supported Web Frameworks によると、次の4つがある。

  • spring boot
  • micronaut
  • quarkus undertow
  • helidon se

さらに slackapi/java-slack-sdk#modules をみると、次の2つも追加されている。どちらも kotlin 向けのフレームワークらしい。

  • http4k
  • ktor

それぞれのフレームワークの説明を読んだり、この機に kotlin をやってみることも検討してみた。長期間の保守を前提にすると、一時的に触るだけの言語を使うのもどうかな?と思うところはあってやはり java でやることにした。spring boot はお仕事でよく使っていてどういうものかを理解しているので選択するなら他の3つのどれか。

Quarkus was created to enable Java developers to create applications for a modern, cloud-native world. Quarkus is a Kubernetes-native Java framework tailored for GraalVM and HotSpot, crafted from best-of-breed Java libraries and standards. The goal is to make Java the leading platform in Kubernetes and serverless environments while offering developers a framework to address a wider range of distributed application architectures.

https://quarkus.io/about/

いま kubernetes に好印象をもっていることもあり、この説明を読んで quarkus を選択することに決めた。そんなことをつぶやいていたら、せらさんからいくつかアドバイスをいただけた。slack について何かをつぶやくと100%返信がくる (ソースは私の経験) 。感謝。

java アプリケーションを実行可能なバイナリにコンパイルする機能を graalvm が提供している。graalvm ではこのバイナリのことを native image と呼んでいる。quarkus は java の web アプリケーションフレームワークであり、graalvm を使って native image を作ることも考慮して設計されている。コンテナでデプロイすることを想定したフレームワークと言える。残念ながら slack sdk が使っているライブラリである gson はリフレクションを多用していて、それが graalvm とは相性が悪いだろうという話しで現時点では native image 化は難しいみたい。たしか native image でリフレクションを使うには使っている箇所を設定にすべて列挙しないといけなかった気がする。リフレクションのような動的に用いるものと静的な設定は相性が悪く、がんばれば特定のバージョンで動くものは設定できるかもしれないけど、ライブラリのようなものでバージョンアップに追随するのはしんどいという話しなのかなと思う。