きり丸の技術日記

技術検証したり、資格等をここに残していきます。

SpringのInterceptorでGETメソッド以外を拒否するようにコードで表現する

※ 特に見どころはありません。 業務都合にて、「アプリケーションをメンテナンスモードに切り替えても、参照系APIだけは参照できるようにしたい。更新系APIは拒否したい。」との要望が出てきました。 そもそも、「そんなこと可能?」ということを素振りした…

リンク先の目的の段落を開いたり、強調した状態のURLのパーツ(URIフラグメント)

URLに記述していてもサーバにデータは送らない箇所があり、それをURIフラグメントと呼びます。具体的には次のURLのうち、#以降の#:~:text=nainaistarを指します。 https://nainaistar.hatenablog.com/#:~:text=nainaistar URIフラグメントは、リンク先のWeb…

文字列結合でも日付を数字ではなく目的のフォーマットで表示する(MM/DD)(Excelとスプレッドシート両方とも可)

Excelとスプレッドシートの両方でも活用できる方法です。 「04/18」と表示したい場合、セルの書式設定を変更して目的のフォーマットで表示するのが一般的だと思います。 しかし、「【日報】きり丸 04/18」のような固定文言 + 今日の日付をCONCAT関数を使用し…

Node.jsで記述されたPlaywrightの実行環境をDockerで用意する

職場でE2EツールとしてPlaywrightを使用しており、ソースコードをPythonで書いています。そのときのPlaywrightの環境構築手順はこちら。 ただ、Playwright単体はどの言語で書かれても問題ないものの、どうしてもテストライブラリ等のエコシステムは言語によ…

Javaで期間と期間を比較して重複チェックする

よくある内容の記事ですので、特別な内容はありません。私が迷わないようにするための記事です。 日付と日付を比較することは簡単ですが、日付の開始日と終了日をまとめた期間と期間を比較して、重複があることをチェックするのはたいへんです。なお、次の式…

Recursionの有料会員を使用した感想

Recursionというアメリカ発のオンラインでプログラミング、コンピュータサイエンスを学べるサービスがあります。今回の記事では、Recursionを有料会員を使用した感想を記載します。 結論だけ記載すると、非常に良質な学習ができてよいサービスだと感じました…

【障害メモ】PythonのSQLAlchemyを使用したテストコードで参照系処理を2回実行したら2回目で不具合発生

掲題の事象が発生しました。結論を出すと、ただの私の認識誤りです。ただ、よくある内容ですので、二度目が発生しないようにメモします。 Pythonと記載していますが、同様の条件が揃えば他のライブラリでも発生しうる内容です。JavaのMyBatisでも似た事象は…

JavaScript(TypeScript)のMapでgerOrElseと同等の動きを簡潔に書く

JavaだとMapのvalueを取得する際に、取得できなかった場合のデフォルト値を返すgetOrElseメソッドが用意されていますが、JavaScriptにはありません。今回の記事では、その同等の挙動を簡潔に書けるようにします。 環境 TypeScript 4.7.4 CodeSandboxで検証 …

Javaでストラテジーパターンを素振りする

ストラテジーパターンというGoFのデザインパターンが良いコード悪いコードでも紹介されていたので、素振りします。 自分の言葉で上手な言語化ができていないので、メリットは参考情報や良いコード悪いコードの購入、または別の方の記事を参考にしてください…

JavaのStaticメソッドをMockitoでモックする(ネストしたメソッドも値を返すようにする)

Javaのオープンチャットに「staticメソッドをMockitoでモックして値を返したい。NestするとNullが返るので、それを回避したい」という要望があったので、素振りしました。 環境 SpringBootStarterTestを基本としています。 Java 17 org.springframework.boot…

【小ネタ】Claspで連携したGoogle スプレッドシートを開く

環境 GitHub Codespaces @google/clasp 2.4.1 前提 .clasp.jsonファイルのparendIdにスプレッドシートのIDが記載されていること。(create claspで作成された.clasp.jsonであること) { "scriptId": "GASエディタのID", "rootDir": "./src", "parentId": [ "…

Javaのラムダ式(Stream API)で複数キーでCollectors.groupingByする

JavaのStream APIにて、複数キーでCollectors.groupingByする方法を記載します。 環境 Java 17 対応 前提として、次のrecordの項目を元に、Collectors.groupingByをします。 public record Book(String id, String language, int year, String salesTerritor…

Javaのラムダ式(Stream API)でNullableな項目にCollectors.groupingByする

Javaのラムダ式(Stream API)にて、Collectors.groupingByというグルーピングしてくれるメソッドがあります。ただし、このメソッドの引数はNonNullである必要があり、万が一Nullが混ざってしまうとNullPointerException: element cannot be mapped to a nul…

【GitHub Actions】npmのpackage.jsonをアップデートするPull Requestを作成する

package.jsonのライブラリバージョンを、現在推奨されているバージョンまでアップデートする方法を探していました。そんなに多用するものではないので、GitHub Actionsでなんとかできないか探したのがこちらの記事です。 環境 taichi/actions-package-update…

Gradleでマルチモジュールにしている状態から別モジュールのテストコードを共有する

テストのセットアップメソッドや、ファイルからドメインを生成するメソッド等々の便利メソッドを作るとします。マルチモジュールの場合、基本的にはプロダクトコードしか依存しないので、テストの便利メソッドは共有しません。 今回の記事では、テストコード…

【設計論】文字列だと単純にラップした型でも便利

ちょっとポエム寄りのお話です。 プリミティブ型をラップした型を作成することは、対象の業務を表現できることがメリットです。たとえば、主キーのIDが文字列だった場合に、次の制約があった場合でもプリミティブ型では伝えられません。 頭文字3桁がシステム…

メソッド呼出回数によって返却値を変更する(正常と例外)【JavaのMockito】

Mockitoを使用して、モックにしたメソッドの呼出回数によって正常な値と例外を返却する方法を残します。 環境 Java 17 org.mockito.junit.jupiter 4.0.0 ユースケース 1 対応 次の現在日付を返却するメソッドをモックにします。 public interface OffsetDate…

Dockerで起動していたAPIにlocalhostで接続できなくなった

※ この話はDocker固有の話ではありません。雑文です。 1週間前まで正常に動いていたのに、急に動かなくなったのでびっくりしました。 環境 Windows 11 結論 localhostがIPv6の::1に変換されていた。 状態 Dockerでローカル環境を構築していた localhostでDoc…

Javaでメソッド参照を使ったまま、ラムダ式で条件否定をする(Predicate.not)

私はラムダ式での可読性を上げるため、メソッド参照を使用することが多いです。ただ、メソッド参照を使用したまま条件否定する方法を知らなかったため、無名関数を使用して条件を否定していました。または、内部で条件否定をしたメソッドを別に用意している…

PythonでJSONを比較したい(I want assert JSON by Python)

環境 Python 3.9 ユースケース PythonでAPI開発を行い、レスポンスのJSONを比較したい。 次のJSONが等価であることを期待する。 { "id": 100, "name": "kirimaru" } { "name": "kirimaru", "id": 100 } できていないこと ソート順を無視したJSONの配列の比較…

Javaで日付の差が何ヵ月かを計算する。あまりは切り上げる (LocalDate, ChronoUnit)

閏年等を考慮しだしたら混乱したのでメモ残します。 環境 Java 17 対応 対応自体は簡単で、ChronoUnit.MONTHESで月の差分を取得できます。今回は、1ヵ月に満たない日付がある場合は切り上げるので+1するだけです。 LocalDate start; LocalDate end; ChronoUn…

Pythonでインスタンスが自作型ではなく、組込み型(built-in types)であることを判別する(isinstance)(primitive types)

Pythonにて処理する際のインスタンスが組込み型(built-in types)であることを判別したかったのですが、簡単にはできませんでした。もし、簡易にできるようになったら、教えてください。 なお、組込み型(built-in types)とは、Pythonが定義しているstr, i…

Lombokで自動生成されるGetterのprefixを変更したかった(Accessor prefixが使いたかった)

うまくいかなかったことのメモ。 環境 IntelliJ IDEA 2021.3.3 (Ultimate Edition) 2022/05/07時点 きっかけになったツイート なるほど。APIでyyyymmddのフォーマットを期待するrequest date型を用意してたけど、そこからlocaldateに変換するときにメソッド…

IntelliJ IDEAのLive Templatesでよく使うコードを登録して生産性アップする(テストのNestedクラスを生成する)

IntelliJ IDEAでは「Generate code」という機能があります。「Alt + Insert」等のショートカットキーで呼び出すことができます。 この機能を呼び出すと、「@Test」「@BeforeEach」等々のよく使用されるコードが生成されます(公式によると、このよく使用する…

Javaでnull様等のnullという文字列を埋める(String#formatted)

以前にMessage.formatを使用して、null様のnullという文字列を埋める方法を調べました。 Java15にて新しくStringにformattedメソッドが増え、null様のnullという文字列を埋める方法が新しくできるようになりました。内部的に使用しているFormatterクラス自体…

使用していないDockerイメージ等々をコマンドで一掃する(docker system prune -a -f --volumes)

全消しするオプションも含めたコマンドを次に記載します。 docker system prune -a -f --volumes 環境 Docker Docker version 20.10.13, build a224086 解説 docker system pruneだとイメージ、コンテナ、ネットワークを削除します。ただし、イメージに関し…

自分がよく使うオプション含めたGitコマンド集

自分が使っているGitコマンドを纏める記事。「Gitでこういうことできる!」よりも「Gitをこう使っている」の方が個人個人の使い方の属性が出て面白いんじゃないかと思って、書きました。なお、cherry-pickとかの頭いいコマンドは知りません。 コマンドではな…

Java 8以降、Javaで文字列の日付存在チェックする(閏年でないときの閏日チェック)(Check leap day)

JSON等でデータのやりとりをする時には、直接日付型を渡すことができません。文字列で渡す必要があります。 ただし、日付に関しては閏年が存在するため、単純な正規表現では文字列の異常値を検出できません。 今回の記事では、Javaで文字列の日付が存在する…

ReadOnlyなDocker環境のPytestを実行するとNo such file or directoryが発生した

pytestの起動時に失敗するので、原因を把握するのに時間がかかってしまいました。 環境 Docker Docker version 20.10.13, build a224086 Docker Compose docker-compose version 1.29.2, build 5becea4c Windows Macだと発生しない事象のようです 前提 Docke…

IntelliJ IDEAでmasterブランチをrebaseしようとしたらprotectedされていた【Git操作】

小ネタ。 普段、自分のリポジトリを操作する際には、IntelliJ IDEAのIDE操作でGit操作し、RebaseやSquashでコミットログをきれいにしています。ただ、IntelliJ IDEAではデフォルトでmasterブランチをRebaseやSquashをできないように制御しています。 今回の…