kotlinで勉強がてら遊ぶ(Dockerも少し触る)

2024-02-20に作成

個人的にkotlinを勉強していくのでその作業記録をつけたい

前提

筆者はwebエンジニア歴10年だが内製ばっかやってる弱小
昔php + FuelPHP、今Java + spring boot、DDDをちょっとかじる
最近の新卒の子がElixir使いだったけどナニソレ?関数型プログラミング全然わからん
じゃあ遊んでみるしかないな
kotlinはjavaに似ててオブジェクト指向的にも関数型プログラミング的にも書けるらしいな、とりあえず触ろう
そのうちscala → Elixirみたいに手を広げるゾ!
そして体を壊して休職したのでこれ幸いと手を出す

やりたいこと

  • javaに近いっぽいkotlinで関数型言語を触ってみる
  • ローカルで動く適当なAPI作って見よっか
  • ついでにDockerもちゃんと触り直すか
    • あ、ちょっとまって公式の解説英語の動画なんすか
    • ドキュメント系は公式以外あんま参照したくないんだよなぁ
  • 時間空けると何がなんだかわからないね!どこかに記録残しとこうね!
  • あと前から気になってたcrieitさんを使ってみたかった
所有者限定モードのためこのボードには投稿できません ボードとは?

環境構築は昨日やったので今日はskeleton作っていきます

公式ドキュメントのチュートリアルをチラ見しながら進める

公式ドキュメント、英語でも気にしない雰囲気わかれば良し
Building web applications with Spring Boot and Kotlin

initializr使ってskeletonを取得

Creating a New Projectの項目で
Using the Initializr Websiteとコマンドライン、IntelliJ IDEA Ultimateを使う手順とかGradleじゃなくてMavenの手順とか紹介されているが、素直に一番上を使用していきます。

spring initializr

いっつも思うんだけどinitializrのzrの部分、よくzerと書いてしまうけどスペルはzrが正しいんだよな。

追加するよう言われているDependenciesは以下の通り

plugin 内容
Spring Web おなじみのMVCするやつ
Mustache 意味は「口ひげ」web テンプレートシステム 一応いれる
Spring Data JPA こちらもおなじみのJPA DBに関してはちょっとあとで自分でやりたいので今回は外しとく
H2 Database 同じく外しとく
Spring Boot DevTools これもおなじみのあれ 開発中の変更がすぐ反映されるよ

spring initializr

これでGENERATEボタンを押すと(Initializrで設定した名前).zipファイルがダウンロードされる。

作ったskeletonをintelliJで開いて編集する

公式チュートリアルではGradle解説みたいなこと言ってるのでIntelliJで開いていこう。

zip解凍してこちらに移動。

# IntelliJのデフォのディレクトリに持っていく
$ mv (解凍したtamesiフォルダ) ~/IdeaProjects

IntelliJでopenを選択し↑のディレクトリを指定。
今回入れたpluginとかmain関数とかHtmlControllerとか解説されてるけど作りたいのはAPIなので全部飛ばします。

kotlinに触るのがガチ初めてなので文法とかはとほほ先生にお世話になりつつ、書いたのがこれ。

コントローラー (jp/gooye/toy/tamesi/controller/TamesiController.kt)

```kt:jp/gooye/toy/tamesi/controller/TamesiController.kt
package jp.gooye.toy.tamesi.controller;

import jp.gooye.toy.tamesi.model.TamesiResponse
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
class TamesiController {
@GetMapping("/tamesi")
fun welcome() = TamesiResponse(message = "hello world!!")
}

リソース(jp/gooye/toy/tamesi/model/TamesiResponse.kt)
```kt:jp/gooye/toy/tamesi/model/TamesiResponse.kt
package jp.gooye.toy.tamesi.model

data class TamesiResponse(var message: String)

あ、jdkのバージョン指定とかIntelliJの設定とかgradleの導入手順とか書き忘れてるな……まあいいかjenvだけ念の為合わせとこ。
intelliJの中でターミナル開いて

$ jenv local 17.0.9

$ java --version   
openjdk 17.0.9 2023-10-17
OpenJDK Runtime Environment Homebrew (build 17.0.9+0)
OpenJDK 64-Bit Server VM Homebrew (build 17.0.9+0, mixed mode, sharing)

この2つのktファイルを追加して、intelliJの右上のぞうさんマークから実行してみる

gradle clean bootRun

gradle clean bootRun

springの起動ログが見えたら、

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.2)

 (中略)

 2024-02-21T19:05:42.670+09:00  INFO 18060 --- [  restartedMain] j.gooye.toy.tamesi.TamesiApplicationKt   : Started TamesiApplicationKt in 0.759 seconds (process running for 1.007)

curl!

$ curl localhost:8080/tamesi
{"message":"hello world!!"}

ローカルで動くとこまで行きました。
明日はいよいよDockerに触ります。


環境構築

何が どれ
PC iMac
チップ Apple M1
OS Sonoma
IDE IntelliJ IDEA (Community Edition)
パッケージ管理システム 当然!「Homebrew」だッ!
javaバージョン管理 jenv
使用言語 kotlin 1.9.22
フレームワーク spring boot
ターミナル iTerm2

Homebrewはインストールされているところから開始

各種パッケージ導入

特にバージョン違いの管理をする予定はないが手癖でいれる

$ brew install jenv

IDE

$ brew install intellij-idea-ce

JDK Apple M1に対応してるJDKを探しつつ、なぜかjava17も入れておく jenvの挙動試すの久々だったし

$ brew install java
$ brew install openjdk@17

M1向けjdkはzulu使えみたいなんあるけどbrewのページだとおkになってんだよな よくわからん

jenvいれる
公式ドキュメントを参考に

$ brew install jenv

メモ忘れたけど公式ドキュメント参考にdoctorとかして最終的にzshrcにはこれを追加

export PATH="/Users/sakamotokeika/.jenv/shims:${PATH}"
export JENV_SHELL=zsh
export JENV_LOADED=1
unset JAVA_HOME
unset JDK_HOME
source '/opt/homebrew/Cellar/jenv/0.5.6/libexec/libexec/../completions/jenv.zsh'
jenv rehash 2>/dev/null
jenv refresh-plugins
jenv() {
  type typeset &> /dev/null && typeset command
  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  enable-plugin|rehash|shell|shell-options)
    eval `jenv "sh-$command" "$@"`;;
  *)
    command jenv "$command" "$@";;
  esac
}

jenvにjdk追加

$ brew info openjdk@17
==> openjdk@17: stable 17.0.9 (bottled) [keg-only]
Development kit for the Java programming language
[https://openjdk.java.net/](https://openjdk.java.net/)
/opt/homebrew/Cellar/openjdk@17/17.0.9 (635 files, 304.9MB)
  Poured from bottle using the formulae.brew.sh API on 2024-02-13 at 18:57:08
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/o/[email protected]
License: GPL-2.0-only with Classpath-exception-2.0
==> Dependencies
Build: autoconf ✔, pkg-config ✔
Required: giflib ✔, harfbuzz ✔, jpeg-turbo ✔, libpng ✔, little-cms2 ✔
==> Requirements
Build: Xcode (on macOS) ✘
==> Caveats
For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk

openjdk@17 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

If you need to have openjdk@17 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc

For compilers to find openjdk@17 you may need to set:
  export CPPFLAGS="-I/opt/homebrew/opt/openjdk@17/include"
==> Analytics
install: 18,294 (30 days), 59,204 (90 days), 273,258 (365 days)
install-on-request: 15,800 (30 days), 49,966 (90 days), 180,903 (365 days)
build-error: 101 (30 days)

おっふXcodeないやんけ

==> Requirements
Build: Xcode (on macOS) ✘
% brew search Xcode
==> Formulae
xcode-build-server                xcode-kotlin                      xcodegen                          xcodes                            coder

==> Casks
copilot-for-xcode                 swiftformat-for-xcode             xcodeclangformat                  xcodes                            xscope

If you meant "Xcode" specifically:
Xcode can be installed from the App Store.

しゃあないAppStoreから落とすか

If you meant "Xcode" specifically:
Xcode can be installed from the App Store.

今度こそadd

$  jenv add /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home

動作確認

$ jenv versions
* system (set by /Users/sakamotokeika/.jenv/version)
  17.0
  17.0.9
  20.0
  20.0.2
  21.0
  21.0.2
  openjdk64-17.0.9
  openjdk64-20.0.2
  openjdk64-21.0.2

適当なディレクトリほって確認

$ jenv local 17.0.9

$ jenv versions
  system
  17.0
* 17.0.9 (set by /Users/sakamotokeika/dev/scala/.java-version)
  20.0
  20.0.2
  21.0
  21.0.2
  openjdk64-17.0.9
  openjdk64-20.0.2
  openjdk64-21.0.2

OK!

kotlin

$ brew install kotlin

一旦ここまで