2021-01-01から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以降の解析結果をViolationsツールで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では足りないケースがあった。 メモリを増やしたりできないか調べたところ、簡…

Switch版ビーチバレーガールしずく3の攻略メモ

唐突なゲーム記事。 最近Switchで配信された G-MODEアーカイブス36 ビーチバレーガールしずく3 世界大会編 。 ガラケー版が出た当時は、シナリオ分岐条件など、攻略方法などがまとまったサイトがあったような気がするが、今検索してみてもパッと出てこないの…

Gitをv2.31以降に更新したら、SourceTreeのターミナルでGit Bashが開かなくなった

ChocolateyでインストールしたSourceTreeとGit for Windowsを使っている。 SourceTreeで便利しているのが、プロジェクトを開いた状態で「ターミナル」アイコンをクリックすると、そのプロジェクトのディレクトリをルートとしてGit Bashを開いてくれる機能。G…

Spring Data JPAのRepositoryでクエリを自動生成するためのメソッド命名規約

Spring Data JPAで、 JpaRepository を継承したリポジトリインターフェースに対し、特定の命名規則でメソッドを宣言しておくと、 @Query アノテーションなど書かなくても処理を自動生成してくれる。 で、その命名規則、単純な検索処理であれば findAllByXxxI…

Spock v1.3でPowerMockを使う

Spock + Mockitoでユニットテストを書いているときに、finalなクラスをモック化したくなったので、PowerMockを導入。 JUnit 4で使う時と同様、 @RunWith(PowerMockRunner) しただけでは実行時にエラーがでてしまったので、SpockでPowerMockを使う方法をメモ…

Windows 10 Homeでタスクバーに天気と温度が表示されるようになったので消す

サブ機で使っているSurface Pro 7、Windows Updateをしたところ、タスクバーに天気と温度が表示されるようになった。 ホバーでニュースも出てきたりするが、使わないので消す方法をメモ。 要約 タスクバーの、何も表示されていない空き部分を右クリック メニ…

使用すべきでない用語と包括的な用語、およびホワイトボックス/ブラックボックスの置き換えは必要か調べた

社内のドキュメントを読んでいた時に、用語について引っかかった。 まず、「ホワイトリスト」と「ブラックリスト」が使われていた。 これらは前者に肯定的、後者に否定的、すなわち差別的な意味が含まれるため、「Allow List」と「Deny List」、日本語では「…

Android版Google Chrome v91で、グループ化せずにタブを開くメニューを復活させる

Android版Google Chromeがv91になり、以前の記事で使っていたフラグが使用できなくなった。 また、新しいタブを開くとグループ化される状態が復活し、リンクをロングタップしても「新しいタブをグループで開く」しか表示されず、またしてもグループ化せずに…

Javadocから作成したXMLを読み込み、クラスと突き合わせてファイル出力してみる

typescript-generatorプラグインでJavadocからTSDocを生成したのち、XMLを直接読み込んだらいろいろできそうだなと思いついた。 Enumの値のJavadocと、フィールドで設定された値を出力したい場合があり、試してみたらできたのでメモ。 やりたいこと 実装例 J…

typescript-generatorプラグインでJavadocからTSDocを生成するとWindows環境でエラーとなった

前回の続き。 JavadocからTSDoc変換をできるようにしたが、運用しているとJavadoc出力時にエラーが出る場合があったのでメモ。 Windowsでエラーが発生する 振り返り Windowsでエラーが発生する 特定の端末で「docletクラスcom.github.markusbernhardt.xmldoc…

TestCafeでPage Object Patternを試してみる

前回、TestCafeでもPage Modelという名前でPage Object Patternが使えそうなことを調べた。 ちょっと試してみようと思ったのでメモ。 環境 TestCafe v1.14.0。 インストールにはNode.js v14.16.1、およびYarn v1.22.5を使用。 Page Object Patternとは ペー…

権限設定を実装するため、Javaで使える認可ライブラリについて調べた

アカウントまたはグループに権限設定して、もろもろの属性に応じたアクセス制御を行うことになった。 システム管理者が参照・作成・更新・削除といった権限を含むロールを作成 システム管理者がトップレベルのリソース(ルートディレクトリ的なもの)を作成 シ…

毎回忘れる海外の全文検索SaaSサービスの名前「Algolia」と、ざっくり全文検索サービス紹介

GitLabの全文検索に使われていたり、Firebaseの全文検索に推奨されている、SaaSの全文検索サービスの名前を毎回忘れるのでメモ。 Algolia です。 2021/3/28現在では、公式ページの利用会社ロゴにSlackがあるなぁ。 使ってみたとかではなく、全文検索の話題の…

typescript-generatorにプリミティブ型を必須プロパティ(non null)にするオプションが追加されていた

以前書いた記事の段階では、 typescript-generator で requiredAnnotations を指定すると、プリミティブ型のフィールド/GetterについてもOptional Properties(null設定可能)扱いとなっていた。 2021年3月の更新で、プリミティブ型をまとめて必須(非null)にで…

typescript-generatorプラグインでJavadocからTSDocを生成する

以前調査したtypescript-generator、その後もパラメーター調整しながら使用しているが、困ったのがヒアドキュメント。 Java側ではJavadocでクラスやプロパティの説明を書いているが、生成したTypeScriptのインターフェース定義ファイルにはデフォルトだと出…