Next.jsプロジェクトでTypeScriptのimportの並び順を指定する

JavaやKotlinを長く書いてきて、importの並び順、ソートはフォーマッターにお任せだった。 Next.jsをTypeScriptで書いているプロジェクトでも、Javaと同様、importの順序を統一したいと思い、設定したのでメモ。 環境 ESLintプラグインの導入 .eslintrc の記…

Amplifyで作成したLambdaにロールを付与してSESでメール送信する

前回の続き。 LambdaからSESによるメール送信を行う方法として、前回はIAMを作成し、アクセスキーを使ったが、今回はLambdaにロールを付与してみる。 環境 実装 Lambdaの作成 Lambdaへのロール付与 Lambdaの実装 GraphQL定義およびコードからの呼び出し 振り…

Amplifyで作成したLambdaからアクセスキーを用いてSESでメール送信する

Amplifyで作成したアプリケーションでメール送信をしようと思い、Lambda経由でSESを呼んでみた。 メール送信用のIAMを作成してアクセスキーを使うパターンと、LambdaにSESでのメール送信権限を付与するパターン、両方試したが、まずはアクセスキーを用いるパ…

Google Apps Scriptでプライベート関数を宣言し、「実行する関数を選択」に表示させない

GAS

Google Apps Scriptで宣言した関数が、「実行する関数を選択」に一覧表示される。 privateとして扱いたい関数については非表示にしたいと思い、調べたのでメモ。 試行錯誤 非表示になるパターン 関数名の末尾にアンダースコア クラスにメソッドとして定義 II…

AWS Amplifyでビルドに失敗する

新規プロジェクトにて、バックエンドにAWS Amplifyを使うことにした。 Gitリポジトリと連携して、開発ブランチに変更があるたびにAWS側でビルドするように設定したが、いくつかの原因でビルドに失敗したのでメモ。 環境 問題1 問題1の対応 問題2 問題2の対応…

SikuliXの画像のファイル名を指定する

久しぶりにSikuliXを触ったが、IDEで画像をキャプチャしたときに、ファイル名を指定できたのでメモ。 環境 SikuliX IDE Version 2.0.5。 画像ファイル名について SikuliX IDEで画像キャプチャすると、通常は数値のみ(おそらくエポックミリ秒)をファイル名と…

JavaのString#replaceAllによる正規表現置換でも、$1などでグループ化した文字列を後方参照できる

タイトル通りだが、チーム内の誰もできるということを知らなかったのでメモ。 replaceAllでの後方参照 Groovyの場合 Kotlinの場合 振り返り replaceAllでの後方参照 タイトル通り、第1引数の検索文字列に ( ~ ) で囲んだグループを記述し、第2引数の置換文…

Hibenateで関連エンティティが存在しない場合の例外を抑制する

JPAの実装としてHibenateを使っている。 既存のテーブルに対して、新規にエンティティクラスを追加し、 @OneToOne で関連を追加したが、関連元のフィールドがnullを設定可能になっている。 その状態で関連元のエンティティを参照すると、該当のカラムがnull…

JavaのコレクションファクトリーメソッドやGuavaのImmutableCollectionは、nullを要素に使えない

Java9で追加された List#of などのファクトリーメソッドや、Java10で追加された Collectors#toUnmodifiableList などのイミュータブルなコレクション生成をよく使っているが、nullを含んだ値を指定したら NullPointerException が発生した。 標準APIやGuava…

Spring DATA Repositoryの@Queryによる検索の戻り値を、DTOやインターフェースにする

Spring DATAのJPA Repositoryを使っているが、戻り値をJPA Entity全体ではなく、任意のフィールドだけにしたいという話があった。 単純にSQLのように SELECT フィールド, フィールド... すると Object の配列になるが、それは避けて任意のDTOやインターフェ…

DevToysの1.0.1.0から1.0.3.0への変更点

前回、DevToysについて書いた直後に、v1.0.2.0で日本語化されたりしたので、変更点をメモ。 devtoys.app 環境 変更点 多言語対応 新ツール GZip を利用した文字列の圧縮と展開 SQLフォーマッター、XMLフォーマッター チェックサム 画像フォーマット変換 Choc…

開発者向けの便利ツール集、DevToysを試してみる

窓の杜の記事を見て気になり、DevToysのツール群をひととおり試してみた。 また、Windows以外での代替アプリも調べたのでメモ。 devtoys.app 2022/2/7追記: v1.0.2.0で日本語化されたが、この記事の記述時点では未翻訳のため、ツール名などは英語で記載して…

JPAのCriteriaBuilderでRDBMSの関数を使う

DBでは数値として持った値を、左0埋めして画面に表示していたが、そこを文字列として部分一致検索させることになった。 検索はSpringのSpecificationで、動的なJPQLをCriteriaBuilderで組み立てており、RDBMSの関数を使えないか調べたのでメモ。 やりたいこ…

JPAのCriteriaBuilderのconjunctionとdisjunctionについて

SpringのSpecificationなどで、動的なJPQLをCriteriaBuilderで、Predicateを組み立てるときに使う conjunction と disjunction 、毎回どっちがどっちか忘れるのでメモ。 conjunction disjunction 振り返り conjunction AND条件の起点。SQLに解釈されると 1 =…

Spring Data JPAのSpecificationでページング時にJOIN FETCHすると例外が発生する

@OneToMany でリレーションを設定したJPA Entityに対し、Spring Data JPAのSpecificationで動的クエリを発行している。 N+1問題の回避のため、 JOIN FETCH して findAll(Specification) で検索していたが、ページングすることとなり、 findAll(Specification…

Springの@Queryに列挙型のフィールドの値を埋め込む

特定の値しか入らないテーブルのカラムに対応する列挙型を用意し、フィールドとして値を保持している。 ORMとしてはJPA Entityを使用しているが、かなり古いソースなのでEnumeratedやConvertによる列挙型のフィールドマッピングなどは行われず、単純な int …

java.util.Dateを簡単にLocalDateやLocalDateTimeに変換する

Java8から java.time が標準APIに入ったが、それ以前に書かれたソースだったり、ライブラリとの兼ね合いで、まだまだ java.util.Date を扱う機会がある。 両方扱うときに困るのが変換方法で、だいたい検索すると LocalDateTime.ofInstant(date.toInstant(), …

Kotlinでjava.io.FileをInputStream/OutputStreamやReader/Writerに変換する

Kotlinのコードレビューをしていて、java.io.File から InputStream に変換するとき、Javaっぽく Files#newInputStream を使っているコードがあった。 拡張関数で直接 File から変換できると指摘したら、知られていなかったのでメモ。 拡張関数の定義された…

Intellij IDEAでSonarLintの自動解析を抑制する

Javaでの開発時、Intellij IDEAにSonarLintプラグインを入れてSonarQubeによる解析を行っているが、Intellijのキャッシュクリアをして再起動した後などは、解析完了までCPUを全部持っていかれ、プチフリーズ状態になってしまう。 ファイル単位で手動実行でき…

Javaで画像の特定の色を透過させる

前回、アップロードされた画像の加工をJavaでやったところ、追加で「透過していない画像であれば、白背景を透過できないか」との要望が。 ちょっと試してみたところ、何とかなったのでメモ。 環境 実装 透過済みかの判定 特定の色を透過 実行サンプル 振り返…

Javaで画像の縦横比を維持してリサイズする

アップロードされた画像を特定の高さに揃える、みたいな作業をすることになった。 サムネイル画像など、表示用であればCloudinaryやimgixのような、リサイズ機能付きCDNサービスを使えばいいが、サーバー側で別途画像処理する必要があったので使えず。 Java…

Javaでバイトの単位(KB,MB,GB)をわかりやすくする

1 * 1024 * 1024 で1メガバイト、みたいなやつをよく見る。 コードレビューしていると、1000 だったり 1024 だったり、気を利かせて 1_024 と書かれていたり、たまに 124 とか 1240 とタイポしていたりと、結構揺らぎがち。また、KB/MB/GBかKiB/MiB/GiBか、…

JavaでMessageDigestにないハッシュ関数を使う

ユーザーの入力値から適当な文字列を生成する要件があった。 Javaで標準的に使えるハッシュ関数だとMD5やSHA1,2,3あたりになるが、計算速度は早いほうがいいということで、高速なハッシュ関数が使えないか調べてみたのでメモ。 環境 Javaで標準的に使えるハ…

Spockのテストコンパイルが遅いので、GradleでGroovyの増分コンパイルを有効化する

Spockでユニットテストを書いている、Gradleを使ったJavaプロジェクトがある。 Intellijでユニットテストを実行するとき、ソースコードに変更があると毎回ユニットテストのすべてのクラスがコンパイルされてしまい、実行までに2分前後のコンパイル待ちが発生…

ブラウザに保存されないサイトのパスワードをCSVファイルからインポートする

パスワードを自動保存しない設定などしていないのに、パスワードを保存するか聞かれないサイトがあった。 Firefox、Google Chrome、Microsoft Edgeなど、ブラウザを変えて試してみたが、いずれも同様。 パスワード入力欄が type="password" になっていないの…

Gradleのユニットテストを早くするためにやったこと

プロジェクト管理ツールにGradleを使ったSpring Bootプロジェクトのユニットテストを、GitLab CIのパイプラインで実行しているが、完了するのに45分程度かかっていた。 その後のデプロイなど含めると、トータル1時間程度かかってしまう。 短縮できないか調べ…

SonarQube CE v7.7以降の解析結果をViolationツールでGitHubのPRやGitLabのMRに連携する

前回の続き。 前回の記事ではSpotBugsやPMD/CPDによる解析結果をマージリクエスト(GitHubなどのプルリクエストに相当、以下MR)連携したが、業務ではSonarQube CEで静的解析をしている。 SonarQube CEの場合、v7.6まではプレビューモードで解析することで、各…

静的解析結果をGitHubのPRやGitLabのMRにコメントするViolationsツールの紹介

静的解析ツールを導入しているが、事前に解析結果をチェックしてといってもなかなか潰しきれない。 GitサーバーとしてGitLabを使っているので、マージリクエスト(GitHubなどのプルリクエストに相当、以下MR)でコードレビューを行っているが、静的解析結果をM…

Java11にしてIntellijからGradleユニットテストを実行するとcompileTestGroovyでClassNotFoundExceptionが発生する

Java8からJava11にアップデートをしたところ、Intellijからテスト実行ができなくなった。 Git Bashから ./gradlew test したり、コマンドプロンプトから gradlew.bat test すると問題なく実行できるので、Intellij起因の問題だろうと思って調べたが、かなり…

Windowsサンドボックスのメモリを増やしたり、ホストからファイル共有する方法

Windows 10 ProやEnterpriseで利用できるWindowsサンドボックス、ちょっとしたツールのお試しに便利だが、いくつかのツールを組み合わせて使いたいときに、デフォルトのメモリ4GBでは足りないケースがあった。 メモリを増やしたりできないか調べたところ、簡…