日々常々

ふつうのプログラマがあたりまえにしたいこと。

SpringBootのちょっとした動きを確認するサンプルを作ろうと思ってから公開までにやったこと

  • 開始の mkdir : 2020-09-19T19:15:24
  • 公開の git push : 2020-09-19T19:20:53

予想は5分くらいだったので、29秒オーバー……1割以内だからセーフ。

きっかけ

普段Spring使わない@chiroitoさんがSpringBootつかってJITコンパイルを見てくれてるので、なんか助けになったらいいなと。

f:id:irof:20200919194911p:plain

actuatorってそんなこまめに触らないし、挙動どうだったかなーってすごく曖昧なまま、曖昧なこと言っちゃったので、コード書こうと思ったのです。

前置きというか脱線というか裏の主題というか

「ちょっとサンプル作ってみるかー」と思ってからどれくらいの時間でできそうかを把握しておくのは大事だと思うんです。 数ヶ月や数週間の見積もりは当て物になります。これはいくら自身の作業が予想通りだったとしても、必ず制御不能な不確定なことが起こるからです。 なので不確定なことを取り除いた「理想見積もり」とかをするわけですが、それにしても「ド忘れした」とかはあるし、いきなりネットが切れたとかも時間が長ければ長いほど起こりえます。

そう言うのはさておき、数分レベルの自分に完結する物事は、高い精度の未来予測ができると何かと便利です。 これは訓練できると思っていて、私の場合はポモドーロが有効でした。 「25分でできそうなこと」を予定して、その間の割り込みなどは無理矢理でも終わるまで遅延させる。そうすると「25分全力で突っ走った場合にできること」は見えてきます。 25分に合わせてペースを緩めるなんてしません。常に全力で突っ走ったタイムだけを見てます。そうしないと意味なくて、そうできるのは自分が使うため、と言うか自分しか使わないからなんですが。

早く終わったとかも「見積もりと現実との差分」です。この辺の私の考え方は 「遅れ」なんてないで書いてますのでよければどうぞ。タイトルに「遅れ」とかついてますが、「差分」で見れば早かろうと遅かろうと同じです。

そんな感じで、私は「自分が今どれくらいの速度で走れるか」をみるようにしています。 差分があったときは、自分がどの辺の知識が曖昧だったかとかを把握するきっかけになるので。

本題: やったこと

以前 Javaアプリケーションを作るときにまずやってること とか書きましたが、人がどのようにしてプロジェクトを最初に作成してるかってあまり情報ないですよね。 人によってまちまちだし、成果物だけみてもわからないものです。 てことでその詳細を書いてみます。

まず mkdir 、これはいいや。

次にSpringInitializrを使っての build.gradle 作成ですが、これはcurlでやります。 start.spring.ioは覚えてるのでこれは手打ちするんですが、だいたいこんな感じ。

% curl -v start.spring.io
...
< HTTP/1.1 301 Moved Permanently
...
< Location: https://start.spring.io/
...

で気を取り直して https://start.spring.io を呼び直す。これ毎回やってる無駄な手順です。毎回やるなよ私。 ちゃんとリクエストしたら次は使えるdependencyのリストが出てくれるんですが、これはまあ欲しいものがあるときに見るくらい。

% curl -v https://start.spring.io
...
To create a web project using Java 11:
    $ curl https://start.spring.io/starter.zip -d dependencies=web \
            -d javaVersion=11 -o demo.zip
...

こんな感じでサンプルを出してくれることを知っているので、これを見て「あー -d dependencies=xxx だったか」と思い出します。

あとは curl -O https://start.spring.io/build.gradle -d dependencies=web,actuatorbuild.gradle が手に入ります。 /build.gradle をつければこれだけ取れます。 -d type=gradle-project とかつけなくていい。ちなみに build.gradle 以外にもJavaのコードとかもまとめて生成してくれるんですが、解凍とかかったるいし、どうせ消すしなので、 build.gradle だけ取ってます。でもSpringInitializrで作られるのは 'io.spring.dependency-management を使うバージョン管理なので、それよりもGradle側のBOM読み込みの方が好みだったりするので、この辺りもそのうち使わなくなったり……

次にやるのはIDEに取り込み。これは idea . で開くだけ……なんだけど、の前に gradle wrapper を叩くことにはしてます。 ディレクトリには build.gradle だけがある状態なので、Gradleプロジェクトと判断してIDEAさんがいい感じにセットアップしてくれます。 gradle wrapperしておくと gradle-warpper.properties ができて、IDEAさんがそれを使ってくれるので、手元のGradleのバージョンが変わってもこのプロジェクトのビルドに影響しません。 公開するなら必須かなと。Gradle入ってない環境でも使えますしね。

IDEが立ち上がったらクラス作成。 この辺は記憶で。覚えてなかったらドキュメントを検索。なんですが、検索時はキーワード以外に site:https://docs.spring.io/spring-boot/docs/current/ をつけるようにしています。 これはSpringBoot1とか別バージョンが引っかかってくるのがかなりノイズだから……。 多分もっといい感じの検索方法はあるんですけど、これで用は足せてます。

で今回はActuatorのカスタムIndicatorで、こんなのは覚えてないのでIndicatorとかつけて検索して。 動かしたらUPしかでない。

f:id:irof:20200919201406p:plain

「あー、確かdetailsにalways指定しなきゃだ」と曖昧な記憶。これは一度でも自分でやったことなかったらドキュメントを舐めることになるかと思います。こう言うのがあるから素振り大事なんですよね。 雑にSpringのドキュメントブラウザで「details」で検索して、show-detailsを見つける。

一瞬 application.properties にしようか迷いながら application.yml を作って、プロパティ記述。

f:id:irof:20200919201922p:plain

ぱーふぇくと。今見たらこの間が11秒で出来てる……ドキュメント検索とSpringBoot再起動挟んでるにしては早いなぁ。 あ、スクショに出てますが、冒頭に書いてるように自分の時間計測のため、シェルのプロンプトに時刻を出すようにしてます。結構便利。

さてGitHubリポジトリを作成。ブラウザからやりました。hubコマンド入れてるけどこれで作ることはほぼないな……

そいやこんなアンケートもしましたので参考に。(何の参考になるかは知らない) f:id:irof:20200919202327p:plain

リポジトリ名は2秒くらい考えたけど思いつかなかったので愚直に spring-boot-actuator-sample で。 見ての通り手元のディレクトリ名は spring-boot-actuator なんですが、Actuatorを作ってるわけじゃないのにこの名前で公開はないでしょ、と言う常識的な判断が -sample をつけさせました。

リポジトリ出来たらpushして、README足して、冒頭のツイートにリプライ。

まとめ

所々引っかかりはあったんですが(actuatorの綴りをtypoしたり。存在しないdependenciesを指定したら404になるのは初めて知りました。)、概ね私の手やマシン(Java、Gradle、IDEAなど諸々)、Google検索もSpringのドキュメントと私の認識にギャップはなかったことは確認出来ました。

たまにこう言うの確認しておくのは大事だと思うんです。 自分の道具箱に入っている道具が、自分の思うように動くか。使える道具が増えてきたら尚更。