Spring Bootでログ出力をテストするアイデア

やりたかったこと

普通ならloggerが呼び出されることをunit testで確認すればよい。

しかし、とある事情でMockMvcでリクエストを飛ばした際に意図した通りのログが出ていることを確認したかった。

やり方

標準出力にログが出ているか確認すればよい。

CapturedOutputで標準出力を拾い、そこにログが含まれることを検証する。 @ExtendedWithでテストを拡張してやればCapturedOutputは簡単に使える。

AZ-104 Microsoft Azure Administratorに合格した

試験結果

771点で無事合格した。(1000点満点中700点で合格)

再チャレンジする気力は無かったので、1発合格できてよかった・・・。

前提

  • 5年前に少しだけAzure portalは触ったことがある。(UI・サービスはかなり変わっている)
  • AWS Certified Solutions Architectを取得済で、クラウドの雰囲気はわかる。
  • 数年前にネットワークスペシャリスト試験に合格しており、ネットワークの基礎知識はある。

勉強法

Microsoft Learn

docs.microsoft.com

まずはこれ、公式の試験対策ドキュメント。試験で問われる知識が一通り書かれている。 実際にAzureを触るハンズオンも用意されており、よくできている。(トレーニング用サブスクリプションが自動的に発行され、短時間無料で使える)

まあまあボリュームがあり、私は1回だけ流し読みした。

エディフィストのトレーニン

www.edifist.co.jp

Microsoft Learnの内容を端折って教えてもらえる。 ただ、4日間のトレーニングを3日に短縮したものということもあり、内容は薄いと感じた。 このトレーニングだけでは、試験で問われるレベルの詳細なサービスの仕様は理解出来ない。 トレーニング用の30日間のサブスクリプションがもらえるので、トレーニング後に自分でハンズオンをやるのには役立つ。

私は所属企業から受講費を支給してもらえたので受講したが、自力でMicrosoft Learnを読める人は受けなくてもよいと思う。 Azureを全く触ったことがなくサインインからやり方を教えてほしい、くらいのレベル感の人ははじめの一歩として受講すると良いかもしれない。

Udemyの模試

www.udemy.com

このコースをセール中に購入した。1500円くらいだったと思う。

約40問のテストが2回分で、量は物足りない。 また、Udemyの仕様のためか、選択式の問題のみで本番で出題されることのある手順の選択・並び替え問題や、長いシナリオを読んで設問に答える問題は無い。 しかし、貴重な日本語教材かつ、本番試験ではよく似たの問題が数問出たので、購入する価値はあると思う。

Microsoft Enterprise Skills Initiative

esi.microsoft.com

所属企業のMicrosoftアカウントで、ESIというMicrosoft公式のトレーニングや模試を受けられるサービスが利用できた。 本番に近い形式の模試を受けられる。

問題は全部で200問程度用意されており、私は試験前2週間は、この模試を繰り返し解いて、試験直前には8割程の正答率になるまで暗記した。 Udemyの模試と同じく、本番試験でよく似た問題が出題されたので、利用できる人はぜひやっておくとよいと思う。

所感

  • AWS Certified Solutions Architectと同じようなもので大したこと無いだろうと受験を決めたが、AD等のMicrosoft固有な知識を多く問われ、難しく感じた。
  • すぐに変更されるであろう、Microsoft固有の知識を勉強するのが楽しくなかったので、もう受けたくない。
  • 業務でAzureを始めとしたMicrosoft製品を使っている人ならもう少し楽に合格できるのではないか。

「美容常識の9割はウソ」を読んだ

美容常識の9割はウソ

美容常識の9割はウソ

読んだ動機

肌が汚いよりきれいな方がいいと思い、エビデンスが無いことを理解しつつもそれなりに高い洗顔料や化粧水を使っている。最近、節約マイブームが来ていおり、スキンケア代を不要な出費として切り捨てるための根拠がほしかったため。

要点

  • できるだけ何もしないのが肌に一番いい
  • 今まで過剰にスキンケアをしている場合はいきなりやめると反動がでる可能性があるため、少しずつ減らすとよい
    • シンプルな石けんをよく泡立てて優しく洗う。脂質や保湿剤、クリームなどのうち1つで保護。
  • 唯一やるべきスキンケアは日焼け止めを塗ること

感想

やっぱりエビデンスなかったかー。できるだけ何もしないように減らしていこうと思う。

  • 「天然」より「人工」の方が純粋で安全
  • 角質表面が常に湿っている状態にすると角質本来のバリア機能が損なわれ、本来は必要なかったスキンケアをやり続けなければならなくなる

など、良かれと思ってやっていることが逆効果という、知見がいくつか得られて面白かった。

「窮地にいるエンジニアは、ズルい処世術で困難を突破する」を読んだ

読んだ動機

Kindleのセールになっているのが目に入り、ズルい処世術とはどんなものか気になったから

要点

  • 技術に長けるのがよいことではなく、仕事ができるのがよいこと
  • 「仕事ができる」とは、一定品質の成果が出ることだけなく、人に気に入られるかどうかという場合もある

感想

新しい発見はなかったが、全体的に同意できた。 技術がわかることではなく解決策を提供することにチャージされること、評価は主観によって決まるというのはその通りだと思う。

karabiner-elementsとM1 MacBook Airの相性が悪いので代替策を探す

問題

US配列キーボードを使っているのですが、JIS配列の「かな」「英数」キーを使った入力メソッドの一発変換は大変便利です。 私はkarabiner-elementsを使わせていただき、commandキーにかな英数を割り当てていました。

しかし、v13.1.0をインストールしているとMacを再起動やシステム終了した際にkernel panicが発生する問題あるようです。 私の環境でも同様の事象が発生しており、システム終了を選択しても勝手に再起動してしまい、クラッシュレポートが表示されていました。

私が問題を確認した環境は以下の通りです。

  • MacBook Air (M1, 2020) 8コア 8GB
  • macOS Big Sur 11.1
  • karabiner-elements v13.1.0

github.com

「現行バージョンのkarabiner-elementsはkernel触ってないからmacOSの問題だよ」というコメントもありますが、私の場合はkarabiner-elementsをアンインストールしたら問題は発生しなくなりました。

しかし、入力メソッドの一発変換はなんとか実現したいので、代替案を探します。

代替案

上記のissueでも言及されていましたが、Hammerspoonというツールでkarabiner-elementsを代替できそうです。 調べてみると、commandキーにかな英数を割り当ても実現できそう。

mac-ra.com

まさしくやりたいことのコードを公開されている方がいらっしゃったので、ありがたく参考にさせていただきやりたかったことを実現できました。

Kotlinで競プロをするTips

これは何

  • Kotlinで競プロするときに役立ったTipsを随時追記します。
  • Kotlinに関係のない競プロのTipsも含みます。

Tips

出力の高速化

大量に出力すると、場合によってはTLEします。

val ans = List(2_000_000_000) { 1 }
ans.forEach { println(it) }

出力は繰り返さず、一回にまとめるとよいです。

println(ans.joinToString("\n"))

List, Set, Arrayへの要素追加速度

プリミティブ型配列は要素の追加が速いので、使える場面では積極的に使うとよいです。MutableSetは要素追加に時間がかかるので、使い所に注意が必要です。

fun main() {
    val size = 20_000_000

    measureTimeMillis {
        val l = IntArray(size)
        for (i in 0 until size) l[i] = i
    }.also { println("$it ms") } // 35 ms

    measureTimeMillis {
        val l = mutableListOf<Int>()
        for (i in 0 until size) l.add(i)
    }.also { println("$it ms") } // 637 ms

    measureTimeMillis {
        val l = mutableSetOf<Int>()
        for (i in 0 until size) l.add(i)
    }.also { println("$it ms") } // 1550 ms
}

深い再帰に注意

関数の再帰は複雑な処理を見通しよく書けて便利ですが、スタックを使う特性上、再帰が深くなりすぎるとスタックオーバーフローを起こします。

// 木構造で自分より上の階層のnodeが持つpointを合算する (再帰)
fun dfs(current: Int, now: Long) {
    points[current] += now
    for (next in graph[current]) }
        if (depth[next] > depth[a]) dfs(next, points[current])
    }
}
dfs(0, 0) // 木が深いと実行時例外が発生する場合がある

再帰が深くなることが予想される場合は、末尾再帰の形式にするか、キューやスタックを使って単純なループ処理にするのがよいでしょう。

// 木構造で自分より上の階層のnodeが持つpointを合算する (キューを使ったループ)
val queue = ArrayDeque<Int>()
queue.addLast(0)
while (queue.isNotEmpty()) {
    val current = queue.removeLast()
    for (next in graph[current]) {
        if (depth[next] > depth[current]) {
            points[next] += points[current]
            queue.addLast(next)
        }
    }
}

2020年に使った技術

使った技術

言語

ライブラリ

  • pico-cli
  • Retrofit
  • jib

ミドルウェア

  • MySQL
    • 久しぶりにたくさんSQL書いた。
  • Redis

インフラ

  • HashiCorp系コンテナオーケストレーションツール群(Nomadなど)
    • アプリ開発者として初めて触った。
    • インフラの面倒を見てくれる人がいるのはとても楽。
    • アプリ・インフラ両方のロールを担えたのは経験としてよかった。
  • Ansible
  • AWX
  • Kibana
  • Docker
  • docker-compose
  • Kubernetes
  • OpenShift
  • Airflow

ツール

  • IntelliJ IDEA
  • iTerm2
    • 開発環境をMacに作り直したので、色々ツールを変えた。
    • その中でもiTerm2は使い勝手が良くて気に入った。

今後の課題

  • 引き続きモダンなサーバサイドの経験を積みたい。
  • フロントエンドの経験が無さすぎるので、TypeScriptとReactを個人開発で使ってみる。
  • チーム運営といったマネジメントでバリューを出せた。技術スペシャリストとして生きていくのは厳しいので、保険としてマネジメントスキルも強化したい。