お花が綺麗で嬉しかったのかな?

想像をしないで聞くのって、難しい。

娘が「お花が綺麗だったんだよ」って言うのを聞いて(あぁ、綺麗なお花を見て、嬉しい気持ちになったんだな)って思ったけど、実は「それで、悲しくなった」と考えているのかもしれない。

自分の想像は、そんなふうにして、簡単に入りこんでしまう。だから、「事実」を聞いたときには、そこから相手の気持ちを想像するんじゃなくて、できるだけ、相手の口から気持ちを説明してもらうようにしたいなと思っている。

「お花が綺麗だったんだね。それで、どういう気持ちになったの?」「この前、枯れちゃったお花のことを思い出して、悲しくなったの」「そっか。悲しい気持ちになったんだね」

娘だと、実際にはあんまり気にしなくても大丈夫なんだけど、大人の場合は、あんまり表に出てこないし、相手も気を遣っているので、何枚か奥に気持ちが隠れてたりする。

気持ちを言葉で直接聞いたとしても、結局、それが気持ちを素直に表してるかというと、分かんないけど、自分の想像を紛れ込ませてしまうよりは、相手の言葉を受け止める方が、良いかなと思ってる。

自分用メモ:遊び用 GKE + Ingress + SSL

2019-07-30 追記

色々勉強しようと思って、クラスター削除しちゃいました!作ったり削除したりしてみる。

追記終わり

ほんとうにただの自分用のメモだよ。何となく個人用にGKEのクラスターを持っといてもいいかなと思ったので作ることにした。ドメイン代のけて、月3000円くらいで済むのかな?GKEクラスターが1000円弱、ロードバランサーが2000円ぐらい?Javaのアプリを動かすにはちょっとメモリが少ないかなぁという気もするけど。とりあえず満足。

## GKEクラスターを作る

えいのうさんのを読みながら作った。

blog.a-know.me

Google Cloud SDKを最初はapt-getで入れてみたんだけど、やっぱりダウンロード版にしとこと思ったから、入れ直した。

## ドメイン

そういえば、Google Domainsにdevドメイン持ってたなと思い出したので、Ingressを作ってマッピングすることにしてみた。

cloud.google.com

DNSのAレコードを登録してIPアドレスが引けるようになったから、アクセスしてみようと思ったら、devドメインってSSLじゃないと使えないんだった。あぁ。

## 証明書

Let's Encryptを使うんかなぁと思ってたらGoogle-managed SSL certificatesってのがあるっぽいから、一旦さっき作ったIngressをdeleteして、やってみた。裏側はLet's Encryptを使ってて、それをGoogleが管理してくれる仕組みみたいね。便利。

cloud.google.com

10分ぐらい待ったら、証明書のステータスがFailedNotVisibleになって、えーってなってたらDNSSECをOnにしないといけないみたいなのを見つけたから、Google DomainsからOnにして、もっかい作り直したらいけたや。

❯ curl https://gke.shiiba.dev/
Hello, world!
Version: 1.0.0
Hostname: helloweb-76bc56cf57-56d2f

(∩´∀`)∩ワーイ

## リソース

gist.github.com

伝えるふりかえり、聞くふりかえり

お。久しぶりの日記だ。

## 毎日のふりかえり

最近サポートしてる人と、一日の終わりに毎日2人でふりかえりをすることにした。話を聞こうと思って。そのふりかえりをしながら、そういえば、ふりかえりのときってその対象がチームでも個人でも「伝えることを中心にするとき」と「聞くことを中心にするとき」とがあるなぁってふと思った。

## 伝えるふりかえり

何か気づきが得られたら良さそうだなって思うときは、伝えるふりかえりになることが多い。

相手やチームから出てきた意見を元にして「あなたたちにはこんなに良い部分がありますね」とか「実はこれだけお互いに感謝してることが分かりましたね。じゃ、それを共有する場をもっと持ったら良さそうですね」とか「自分たちはまだまだだって言ってますけど、先月に比べてこんなに良くなってますね」って伝えたり。

課題の場合も、意見を元に少し深堀りして「その課題の本当の原因は、ここにありそうですね」とか「その課題に対しては、こういうやり方がありますけど試してみますか?」って伝えたり。

次にどういう風に行動すれば、その人たちに何か新しいものが見えてくるかを、伝えるような感じかなぁ。

## 聞くふりかえり

それに対して、相手やチームの中に答えを探しにいくときは、聞くふりかえりになることが多いかな。

ひとつずつ、相手の言葉をゆっくり待って、そこに対して問いかけて、相手の心の中を一緒に探検する感じ。「そっか、そう思ったんだね。じゃあ、そう思ったのはどうしてかな?」「なるほど、それは良かったね」とか。「そのとき取った行動は良かったね」とか。「じゃあ、次はどうしようと思ってるとかあるの?」とか。このときは、解決策を探そうとするより、気持ちに寄り添って、一緒にうろうろしてみたいな。という気持ち。

意識してるのは事実を否定しないこと。「そういう気持ちになった」という事実や、「そういう行動をとった」という事実を否定しないこと。ただ、これ、自分でかなり意識してそういうモードにしてないと「自分だったらこう考える」って言ってしまってダメ。気をつけたい。

## いずれにしても

伝えるふりかえりも、聞くふりかえりも、相手の言葉を聞くことから始まるので、聞くことが一番大切よなー。と思いながら、娘のとりとめもない話を「うんーうんー」って言いながら聞いてる。

MicronautでPetClinicを実装してNative Image化したら300msくらいで起動したーはやいー

Spring PetClinic をSpringの代わりに Micronaut を使って実装してみた。

github.com

PetClinicなので単純なHelloWorldじゃなくて、ThymeleafとかJPA(Hibernate)とかDIとかを使ってるんだけど、GraalVM のNative Imageでビルドしたら200-400msくらいで起動する。はやいー。

この画像だと324msで起動してる:

Screen Capture

全部実装したわけじゃなくて結構まだぐちゃぐちゃしてるけど、基本的な機能は動くようにしておいた。

## 使い方

Native Imageじゃない場合から

### 1. git cloneして

git clone https://github.com/bufferings/micronaut-petclinic.git
cd micronaut-petclinic

### 2. PostgreSQLを起動して

このPetClinicはPostgreSQLを使う。Docker Composeでデータも用意しておいたのでこれでデータ入りのPostgreSQLが立ち上がる:

docker-compose up

### 3. アプリを実行

./mvnw compile exec:exec

### 3-2. JARを使いたかったらこう

./mvnw package
java -jar target/micronaut-*.jar

### 4. PetClinicにアクセスする

http://localhost:8080/

JARファイルだと僕のノートPCだとだいたい5秒くらいで起動するかな。

## Native Image化

じゃ、Native Imageを作ろう

MicronautがGraalVMのNative Imageのビルドを色々サポートしてくれてるので、このPetClinicもNative Imageとしてビルドして実行できるようにしといた。

./mvnw package && docker build -t micronaut-petclinic .

10分くらいかかるから ☕ 飲みながら待ってる。メモリも4GBくらい使うから、OOMで落ちるときはDockerに対するメモリの割り当て見てみてね。

で、こんな感じで起動する:

# Docker for Mac or Windows
export HOST_NAME=host.docker.internal
# Linux
export HOST_NAME=172.17.0.1

docker run --rm -p 8080:8080 -e JDBC_URL=jdbc:postgresql://${HOST_NAME}:5432/petclinic micronaut-petclinic

300msぐらいで起動するよー (๑•̀ㅂ•́)و✧

まだまだGraalVMもMicronautもこれからって感じだけど、楽しみだなー!

肯定感を持って成長していって欲しい

娘達を見てて、「まだだ!まだ足りない!掛け算はできたけど、割り算はまだ知らないだろう?」って言って育てるよりも「すごい!できた!天才!だが、僕らには大きな目標がある!だから次は割り算やろう!」って言って育てたいと思っている。

何かができなくても「どういうことだ!これ、もう習っただろう?」とか言わずに「ほう・・・今回の相手は手強かったな!仕方がない。次は倒せるようにしておこう!」って言って育てたいと思っている。

だから、それと同じことを、チームと接するときにもやりたいなと思う。できたことをほめる。目的地を共有する。次に進む一歩を一緒に考える。これだけのことなんだけど、娘達に対しても、チームに対しても、そう接するのは、なんか難しい。もっと褒めたい。

あ、ビルド終わった。じゃ!

MicronautでPostgreSQLのリアクティブアクセスをネイティブ化できた

きしださんの記事を見て

nowokay.hatenablog.com

このときはMicronautを使ってもネイティブ化できなかったみたいだけど、今のバージョンならできるんじゃないかなと思ってやってみたら、できたよ。ちょっとごにょっとしたけど。

バージョンはこんな感じ。GraalVMは1.0.0のRC15:

❯ mn --version
| Micronaut Version: 1.1.0
| JVM Version: 1.8.0_202

❯ sdk current java

Using java version 1.0.0-rc-15-grl

コードはここに置いといた。あ、しまった。ネイティブイメージもpushしてしまった。まいっか。

github.com

じゃ、やったことを順番に書いておく。

## アプリを生成

postgres-reactivegraal-native-image をつけてCLIアプリを生成。

❯ mn create-cli-app micronaut-postgres-reactive \
        --features postgres-reactive,graal-native-image

graal-native-image をつけとくと、ネイティブ化用のライブラリーと設定ファイルがついてくる。

具体的には build.gradle にこの2つが入ってくるのと

    annotationProcessor "io.micronaut:micronaut-graal"
    ...
    compileOnly "com.oracle.substratevm:svm"

META-INFの中に

src/main/resources/META-INF/native-image/micronaut.postgres.reactive/micronaut-postgres-reactive-application/native-image.properties

ってファイルが作られてて(長い・・・プロジェクト名を短くすれば良かったな)

内容はこうなってる

Args = -H:IncludeResources=logback.xml|application.yml \
       -H:Name=micronaut-postgres-reactive \
       -H:Class=micronaut.postgres.reactive.Application

## PostgreSQLコンテナ

こんな感じのDocker ComposeでPostgreSQLを用意した。 docker ってディレクトリに入れといた。

docker-compose.yml

db:
  image: postgres:11.2-alpine
  ports:
    - "5432:5432"
  environment:
    - POSTGRES_PASSWORD=mypass
    - POSTGRES_DB=mydb
  volumes:
    - "./initdb.d:/docker-entrypoint-initdb.d"

initdb.d の中にはコンテナを初回起動したときに実行されるSQLを入れて:

CREATE TABLE IF NOT EXISTS users (
  id SERIAL,
  first_name VARCHAR(30),
  last_name VARCHAR(30),
  CONSTRAINT pk_user PRIMARY KEY (id)
);

INSERT INTO users VALUES (1, 'James', 'Carter') ON CONFLICT DO NOTHING;
INSERT INTO users VALUES (2, 'Helen', 'Leary') ON CONFLICT DO NOTHING;
INSERT INTO users VALUES (3, 'Linda', 'Douglas') ON CONFLICT DO NOTHING;
INSERT INTO users VALUES (4, 'Rafael', 'Ortega') ON CONFLICT DO NOTHING;
INSERT INTO users VALUES (5, 'Henry', 'Stevens') ON CONFLICT DO NOTHING;
INSERT INTO users VALUES (6, 'Sharon', 'Jenkins') ON CONFLICT DO NOTHING;

あとコンテナのPrefixを指定したかったので .env も置いといた。

COMPOSE_PROJECT_NAME=micronaut-postgres-reactive

ほんで、起動しとく

❯  docker-compose up

## CLIアプリの実装

これはきしださんのそのまま。DBの情報は少し違うけど。

application.yml

postgres:
  reactive:
    client:
      port: 5432
      host: localhost
      database: mydb
      user: postgres
      password: mypass
      # maxSize: 5

インデントが変なのは、Issueあげといた

https://github.com/micronaut-projects/micronaut-profiles/issues/148

MicronautPostgresReactiveCommand.java

    @Inject
    PgPool client;
    public void data() {
        client.rxQuery("select * from users")
            .map(rowSet -> {
                List<String> result = new ArrayList<>();
                PgIterator ite = rowSet.iterator();
                while(ite.hasNext()) {
                    Row row = ite.next();
                    result.add(row.getString("first_name"));
                }
                return result;
            })
            .blockingGet()
            .stream()
            .forEach(System.out::println);
    }

で実行すると

❯ ./gradlew assemble
...

❯ java -jar build/libs/micronaut-postgres-reactive-0.1.jar
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
James
Helen
Linda
Rafael
Henry
Sharon

OKだね。じゃ、ネイティブ化してみよう

❯ native-image --no-server -cp build/libs/micronaut-postgres-reactive-0.1.jar

## ビルド失敗

Netty周りのエラーが出た。 Unsafe とかのやつ。あれー?なんでだろう?この前見たとき対応入ってたのになー:

bufferings.hatenablog.com

と思ってよく見てみたら、Nettyのネイティブ化用設定が入ったライブラリーがないやないか。入れてみるか。

    compile "io.micronaut:micronaut-http-server-netty"

そしたらビルド通ったや。うーん。

## んで実行!

しても何も出力されない…あれー。なんでだろう?って見てたら。これか…さっきの native-image.properties

Args = -H:IncludeResources=logback.xml|application.yml \
       -H:Name=micronaut-postgres-reactive \
       -H:Class=micronaut.postgres.reactive.Application

エントリーポイントが Application になってるからこれをこう書き換えて:

Args = -H:IncludeResources=logback.xml|application.yml \
       -H:Name=micronaut-postgres-reactive \
       -H:Class=micronaut.postgres.reactive.MicronautPostgresReactiveCommand

ビルドし直したら動いたー

❯ ./micronaut-postgres-reactive
James
Helen
Linda
Rafael
Henry
Sharon

うーん。なんかちょっとイマイチな感じもあるけど。まぁ、動いたからいっかな。

役割分担

後輩たちが、(後輩にとって)新しい技術を導入してて、「動きました!テストも大丈夫でした!バッチリです!」って言ってリリースする。動くんだし、バッチリなんだし、全然問題ない。良いと思う。

のだけど、それを見ながら(たぶん公式ドキュメントの細かいところとか、運用するときに知ってたら楽になることとかは、チェックしてないだろうなぁ)って思って、自分でそういうところが気になるのでチェックしてしまう。

チェックしながら、適当に役に立ちそうなこととか大切そうなことをピックアップしてドキュメントに書き起こしたら「ハンズオンしようか」って言って伝えたりする。そしたら「とても便利な機能があるんですね」とか「ここは気をつけないと危なそうですね」とか言ってくれて僕は満足する。

後輩が、もう一歩踏み込んで調べても良いのになと思わないこともないけど、でも、自分だとそこでそれだけの自信を持ってリリースできないだろうなと思ったり、そんなに嬉しそうにリリースしたりできないだろうなって思ったりして、羨ましかったりする。かっこいいよなー。

まぁ、役割分担ってことだな。