首都圏を走るJRの電車で通勤通学してるとイヤでも覚える↓の図 https://www.jreast.co.jp/map/pdf/map_tokyo.pdf 大学生の頃に横浜線で通学していて、「苗字みたいな駅多いな〜」って思ってたことがあり、これをみながら打線組んだりしていた。 今回は思いつ…
想定ケースとして、mysqlを使ったアプリケーション開発をしているとして、こんな compose.yml を用意している場合を考える。 db: container_name: awesome-db image: mysql:8.4 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: awesome_root_passwo…
こういうサービスを作った。 hatebu-webhook.jskmt.workers.dev 何ができるか はてなブックマークの公開ブックマークを定期的に監視し、変更があったら任意のURLにWebhookでPOSTする。 検知できるイベントは以下の3種類。 new - 新規ブックマーク追加 tag_ch…
こういうライブラリを作った。 packagist.org PHPでResult型が必要な理由 PHPの標準的なエラーハンドリングは例外に依存している。ただ、例外ベースのアプローチにはいくつか問題がある。 まず、例外は関数シグネチャに現れない。function getUser(int $id):…
お悩み echscheduleを利用してECS Scheduled Taskの管理をしているのだが、configのymlファイルにはrevisionを指定して起動することができるかどうかはわからない。少なくともymlの項目としては存在していない region: us-east-1 cluster: clusterName rules…
直近でGoogle Tag Manager(GTM)をReact Routerで作ったSPAにいれる作業をやっており、 繰り返しやることになりそうなので書き殴りメモ。 react-gtm-moduleのインストール GTM呼び出し用関数の定義 React Routerのページ遷移時にpageviewイベントを発火する R…
最近、仕事で開発しているKotlinアプリケーションでDatadogに送信されるログが崩れるという問題に遭遇し、原因を調べていくと巨大なスタックトレースによるものだった。 やったことなどメモしておく。 問題の背景 Spring WebFluxベースのWebアプリケーション…
valibotでフォームバリデーションを実装しているとして、ある程度はデフォルトのスキーマを使っていくことで表現できるのだが、それでも満足できない場合はカスタムスキーマを作るしかない。 カスタムスキーマを作るのは超簡単。 valibot.dev こんな感じで、…
タイトルの通り。 kotlinのヒアドキュメントを使うときのあるあるパターンで、こんな感じに文字列を宣言できる。 val longText = """ 長めの文章を いい感じにトリミングしてくれる とっても便利な関数 他の言語にも実装されてほしいな """.trimIndent() ヒ…
kotlin-retryはkotlin-resultの作者が作った関数のリトライの処理を提供するライブラリである。Scalaで開発していたときに大好きなSoftwaremil製のretryを利用していたので似たようなものとして気に入っている。 このライブラリは作者の意向として、関数が例…
Kotlin 2.0.20がリリースされた。 その中で注目すべき機能の一つがこれ。 Data class copy function to have the same visibility as constructor この待望の機能について詳しく見ていく。 従来の問題点 まず、以下のようなdata classを考えてみる。 data cl…
AWS Lambda上で実行するNode.jsアプリケーションをTypeScriptで開発しているとき、TypeScriptのトランスパイルをどのように行うかがポイントであるが、AWS SAMを利用しているならば template.yml ファイル内にesbuildの設定を記述することで sam build 時に…
自作したライブラリがJVM用のビルドしかできなかったのと、昨今のKMP化していきましょうの流れを汲み取ってやってみたので、わすれないためにその記録をメモっておく。 コミットは↓の通り。 少し余計なものが入ってるけど settings.gradle.kts と build.grad…
この記事は検索エンジンプロダクトを一緒に開発してた同窓会 Advent Calendar 2023 の3日目。の代打です。 第二子出産に立ち会うまでのもどかしい待ち時間で心を落ち着けるために書いている。日本語がぐっちゃぐちゃかもしれない。 さて、現在の仕事ではKotl…
このようなジェネリクスがある関数やクラスがあるものとする。 fun <T> foo(): T = TODO() class Bar<T> (val value: T) これらの関数やクラスのコンストラクタを関数オブジェクトとして扱いたいとき、このように :: を付与して KFunction1<T> のような値を宣言したい</t></t></t>…
Scalaでいうcollect的な関数がほしいことがあって、このような関数を実装してみた。 fun <A, B> List<A>.collect(vararg patterns: Pair<(A) -> Boolean, (A) -> B>): List<B> = this.mapNotNull { a -> patterns.firstOrNull { (condition, _) -> condition(a) }?.let {</b></a></a,>…
composeしてたりECS使ってるとサービスディスカバリしたりblue/greenデプロイをするための前提としてコンテナのヘルスチェックを行うことが多い。 個人的には、デプロイ成否の条件にも使えたりするので、webサーバなどコンテナでデーモンを実行するときはヘ…
注: これが正解かはわかっていない 一度にいくつかのe2eテストを高速に実行する目的で並列にしたくて、かつブラウザのコンテキストつまりCookieなどをテスト間で共有したくない場合がある。 たとえば、並列実行したい2つのテストがそれぞれwebサービスのログ…
出来そうだなと思ったのでお試し。 Minimal Cake PatternといえばScalaにおけるDIの実装パターンの1つで、コンパイル時に依存性を解決でき、DIコンテナ使ってるときにやりがちなDI用アノテーションのつけ忘れて実行時エラーが起きるみたいなことが無いのが特…
たとえばコンポーネントライブラリを作ろうとしていて、そのコンポーネント内で特定の画像ファイルをbackground-imageで埋め込みたいというケースを考える。 このとき、画像をどうやってパッケージに含めるか、とか、ライブラリ利用側でのパス解決がうまいこ…
こういうクラスがあり、newする時にエラー型を明示して Either<IllegalArgumentException, Email> が返却されるようにしたいとする。 class Email(val address: String) { init { require(address.contains("@")) { "Invalid email address" } } } とすると、このように書くことが多いのだが、</illegalargumentexception,>…
KotestでTable Driven Testをサポートしているシンタックスがあるのでそれを使えば良い。 JUnitでもやっている例はあるけど、Kotestの方がデータ型の用意が不要だったりするのと、テストの可読性が高そうにみえる(好みの範疇)。 また、Table Drivenにテスト…
部分適用するために以下のようなExtensionを用意しておくと便利。 fun <A, B, C, T> Function3<A, B, C, T>.partial(a: A): (B, C) -> T = {b, c -> invoke(a, b, c)} 例えば以下のような引数を3つ取る関数の場合だとこのようになる。 fun example(foo: Int, bar: String, baz: Long)</a,></a,>…
この記事は以下のブログの翻訳記事で、著者の許諾のもと翻訳しています。翻訳過程で機械翻訳を活用しており、原典と翻訳を十分に照らし合わせて内容が正しいことを確認しておりますが、細かいニュアンスなどが気になる場合は原典をご確認ください。また、誤…
よくあるケースとして、入力値に対してバリデーションを行いすべて評価してから結果を返したい場合がある。 たとえばこのようなPerson型があったときに、 class Person private constructor(val name: Name, val age: Age) ① name は空文字を許さない ② age …
過去にjOOQのRecord型から値を取り出すときに、一旦nullableをArrow.ktのOption型に変換してから合成すると良いよ的な書き方をしたんだけど、 jsoizo.hatenablog.com 同じくArrow.ktのnullable DSLでもっとスッキリ書けるとわかったので改めて。 以下のよう…
Kotlin Confがはじまった!!! キーノートではKotlin 2.0に追加される言語仕様が発表された。 blog.jetbrains.com 個人的には好きなKEEP段階の機能であるContext Receiverがついに正式なリリースを迎えることになりそうで嬉しい一方で、Kotlin 2.0まで待たない…
よくつかっているIterableの自作extensionを紹介します - Speaker Deck で以下のようなコードを紹介した。 fun <A, F, S> Iterable<T>.partitionMap( predicate: (A) -> Boolean, transformFirst: (A) -> F, transformSecond: (A) -> S ): Pair<List<F>, List<S>> = this.fold(Pair(</s></list<f></t></a,>…
社内でラップバトル的な感じで情報共有をする会があるのだが、その場で "ScalaのpartitionMapがKotlinのIterableにはなくて不便だからextension書いた" 的な話をした。 反応も多少あったので調子に乗ってArrow-ktにissue切ってPRだしたら無事に取り込まれた…
scalaでいうcollectFirst的なやつが欲しいなーと思っていたところ、 firstNotNullOfOrNullっていうやーつがメソッド名だけ読んで理解するのが困難だがcollectFirst的に使えて便利だったのでメモ。 シグネチャは以下通り public inline fun <T, R : Any> Iterable<T>.firstNo</t></t,>…