突っ走り書き

見せるほどのものでは..

コードカバレッジを品質目標にするのは悪だが、未テストコードを見つけるのには役に立つ

bliki-ja.github.io

「テストカバレッジ(コードカバレッジ)の目標値はどれくらいがいいのか?」という質問とか、コードカバレッジの高さの自慢とかを、ときどき耳にする。でも、大事なポイントを外している。コードカバレッジは、コードのテストされていない部分を発見するための有用なツールである。ただテスト自体がどれだけ良いかという指標としては、テストカバレッジはほとんど役に立たない。

.

以下の質問に「はい」と答えられるならば、おそらくテストは十分だろう:

  • 本番環境で発見されるバグはほとんどない。そして、
  • 本番環境でバグを出すことを恐れてコードの変更をためらうことがない。

説明するということ(宮台真司)

この動画の宮台先生の発言が心に残ったので書き起こした。

www.youtube.com

もともとは「そもそも論」についての話だったが、自分は「説明すること」というテーマとして聞いていた。

ドイツでは古くからこども大学というプロジェクトがあって、大学の教員が地元の小学生に自分がやっていることを伝えるっていうのをやる。 ぼくも日本でこども大学のプロジェクトを始めています。 飛騨高山とかで始めていますけども、小学校4年生に喋るのね。 そうすると、こどもに喋ることが、あるいは何も知らない人間に喋ることがいかに重要かがよくわかる。 たとえば僕たちは概念を使って喋っているけど、こどもたちは概念を知らないからセンテンスに開いて喋るわけだよ。 ところが僕たちは概念のクリシェ(決まり文句)の中で自明視していることがあるだけど、それをセンテンスに開くと意外につながらないということがわかって、説明に苦労して、そこではじめて説明する大学教員の側が気付きを得るということがあるんです。 自明性、当たり前さっていうけど、英語だと obviousness と familiarity という言葉あるのね。 自明の理だというときは obviousness、ところが familiarity というのは慣れ親しんでいるわけね。 いわば概念の自動的な連結による決まり文句っていうのは慣れ親しみなんですよ。 自明の理じゃないんだ。 だからそれをセンテンスに開いてみると、それは familiar ではあったけどね、実は obvious ではないということがはっきりわかったりするんですよ。

obviousness と familiarity という2つの単語による事象の整理がとてもしっくりきた。 たしかに、振り返ってみると、概念(専門用語と読み替えてもいいと思う)を使って説明してしまっているときがあるかも知れない。 センテンスに開いて、論理構造で説明しないといけなかったんだな。

IntelliJ の設定

基本的にはデフォルト設定のまま使う派だけど、ちょっとだけカスタマイズ

タブを消す

編集画面を少しでも広くするために。

Preferences > Editor > General > Editor Tabs > Appearance > Tab placement > None

開いているファイルにフォーカスをあてる

Project > [設定アイコン] > Always Select Opened File

キーマップで Join Lines を無効にする

IMEの切り替えと被る(Ctrl + Shift + J)ので無効にする

Preferences > Kyemap > Join Lines > Remove

プラグインを入れる

ref. 開発生産性を120%にブーストするIntelliJ IDEAのプラグイン紹介 - Retty Tech Blog

ERESOLVE unable to resolve dependency tree を直したい

gatsby の tutorial をやっていたら、npm install → npm audit fix でエラーが出た。

% npm audit fix
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! Found: type-fest@0.20.2
npm ERR! node_modules/type-fest
npm ERR!   type-fest@"^0.20.2" from globals@13.15.0
npm ERR!   node_modules/@eslint/eslintrc/node_modules/globals
npm ERR!     globals@"^13.9.0" from @eslint/eslintrc@0.4.3
npm ERR!     node_modules/@eslint/eslintrc
npm ERR!       @eslint/eslintrc@"^0.4.3" from eslint@7.32.0
npm ERR!       node_modules/eslint
npm ERR!         peer eslint@"^7.5.0 || ^8.0.0" from @babel/eslint-parser@7.18.2
npm ERR!         node_modules/@babel/eslint-parser
npm ERR!         13 more (@typescript-eslint/eslint-plugin, ...)
npm ERR!   type-fest@"^0.20.2" from globals@13.15.0
npm ERR!   node_modules/@parcel/packager-js/node_modules/globals
npm ERR!     globals@"^13.2.0" from @parcel/packager-js@2.6.0
npm ERR!     node_modules/@parcel/packager-js
npm ERR!       @parcel/packager-js@"2.6.0" from gatsby-parcel-config@0.8.0
npm ERR!       node_modules/gatsby-parcel-config
npm ERR!         gatsby-parcel-config@"0.8.0" from gatsby@4.17.2
npm ERR!         node_modules/gatsby
npm ERR!   2 more (boxen, globals)
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peerOptional type-fest@"^0.13.1" from @pmmmwh/react-refresh-webpack-plugin@0.4.3
npm ERR! node_modules/@pmmmwh/react-refresh-webpack-plugin
npm ERR!   @pmmmwh/react-refresh-webpack-plugin@"^0.4.3" from gatsby@4.17.2
npm ERR!   node_modules/gatsby
npm ERR!     gatsby@"^4.17.1" from the root project
npm ERR!     4 more (babel-plugin-remove-graphql-queries, ...)
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR! 
npm ERR! See /Users/i/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/i/.npm/_logs/2022-07-03T13_32_10_377Z-debug.log

結局これだった...

yarn 使うと治る(というか回避できる)

qiita.com

Spring Boot アプリケーションを Heroku で動かす(Docker で)

Heroku CLI のインストール

brew tap heroku/brew && brew install heroku
% heroku -v
heroku/7.60.2 darwin-x64 node-v14.19.0

devcenter.heroku.com

デプロイする

devcenter.heroku.com

注意ポイント① Spring Boot の Java の version を Heroku に教える

devcenter.heroku.com

注意ポイント② Procfile を作る

↓ とエラーが出た。

at=error code=H10 desc="App crashed" method=GET path="/" host=xxx.herokuapp.com request_id=xxx fwd="106.73.3.130" dyno= connect= service= status=503 bytes= protocol=https

原因は、./build/libs/*-plain.jar を実行してしまっているから。 実は ./gradlew build では、 以下の2つの jar が生成される。

  • ${APP_NAME}-0.0.1-SNAPSHOT-plain.jar
  • ${APP_NAME}-0.0.1-SNAPSHOT.jar

このうち、Spring Application として実行可能なのは、 plain ではないほうの ${APP_NAME}-0.0.1-SNAPSHOT.jar である。 ところが、Heroku の実行は、 ./build/libs/*.jar を実行する指定がされており、plain が実行されてしまっているっぽい。 これを防ぐため、プロジェクトのルートに Procfile を作成し、plain ではないほうの jar を起動するように設定する。

web java -Dserver.port=$PORT $JAVA_OPTS -jar ./build/libs/realworld-example-app-0.0.1-SNAPSHOT.jar