CompletableFutureの備忘録

CompletableFutureの使い方をよく忘れるので備忘録。 Memo staticメソッド completedFuture CompletableFuture<U> completedFuture(U value) CompletableFuture.completedFuture("OK") supplyAsync CompletableFuture<U> supplyAsync(Supplier<U> supplier) Completab</u></u></u>…

WiresharkでHTTPSを復号化する

Wiresharkでhttps通信を復号化するときの備忘録。 今回はMacOSのChromeとlocalhostのnginxでhttpsの通信をする。 準備 証明書 mkcertでlocalhostの証明書と秘密鍵を用意する。コマンドを実行するとlocalhost.pemとlocalhost-key.pemが作成されるので、これを…

PrometheusのHTTP Service Discoveryを試す

PrometheusのHTTP Service Discoveryを試したときのメモ。 準備 Prometheus DockerのPrometheusとNode exporter2台を使う。 prometheus.yml global: scrape_interval: 30s scrape_configs: - job_name: prometheus static_configs: - targets: ['host.docke…

MongoDBのクエリの備忘録 (Element)

準備 使用するMongoDBはこちらと同じ。 MongoDB Shellで接続して、マニュアルと同じテストデータを挿入する。 test> db.inventory.insertMany([ ... { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] }, ... { item: "notebook", qt…

MongoDBのクエリの備忘録 (Array)

準備 使用するMongoDBはこちらと同じ。 MongoDB Shellで接続して、マニュアルと同じテストデータを挿入する。 test> db.inventory.insertMany([ ... { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] }, ... { item: "notebook", qt…

jfrコマンドの備忘録

Memo 準備 JFRファイルのサイズを大きくしたいので、大量のJFRイベントを書き込むデモアプリを用意する。 Main.java import java.time.LocalDateTime; import jdk.jfr.Category; import jdk.jfr.Description; import jdk.jfr.Event; import jdk.jfr.Label; i…

MongoDBのクエリの備忘録 (Comparison, Logical)

準備 Docker ComposeでMongoDBを起動する。 % docker compose up -d compose.yml services: mongo: image: mongo:6.0 restart: always ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: user1 MONGO_INITDB_ROOT_PASSWORD: xxxx MongoDB Shel…

JacksonでJSONを別の階層のプロパティにマップする

具体的にはJacksonでMapにデシリアライズできるJSONを、こんなクラスにマップしたいときの備忘録。 { "key1": "value1", "key2": "value2", ... } public class Response { private Map<String, String> map; } Mapに@JsonUnwrappedは使えないので、@JsonAnySetterを使う。シ</string,>…

Javaアプリのメモリリークを調べる

JavaアプリのメモリリークをPrometheusとJDK Flight Recorderを使って調べるときのメモ。 準備 ソースコード メモリリークがあるSpring Bootのデモアプリ。 build.gradle plugins { id 'org.springframework.boot' version '2.6.7' id 'io.spring.dependency…

Wiresharkで任意のHTTP Headerでフィルターする

Wiresharkで任意のHTTP Headerでフィルターしたいときの備忘録。 HTTPのフィルターが用意されている場合 X-Forwarded-ForヘッダーのようにHTTPのフィルターが用意されている場合は、リファレンスに記載されているFIELD NAMEを指定すればフィルターできる。 H…

Javaのasync-profilerを試す

Javaのasync-profilerを試したときのメモ。 (IntelliJ IDEA Ultimateでも試せるが、今回はツールを直接実行する) 準備 async-profiler ここからasync-profilerをダウンロードする。 実際には、ダウンロードしたファイル含まれているprofiler.shを使う。 検…

GradleでSpring Bootをビルドしたときのjarファイル

Spring Boot 2.5からGradleでビルドすると *.jar と *-plain.jar の2つが生成されるようになったので、これらについてのメモ。 Demo Spring InitializrからGradle Projectを選択してプロジェクトを作成する。(ArtifactなどのProject Metadataはデフォルト…

JavaのSortedSet

JavaのSortedSetについての備忘録。 HashSetなどの通常のSetは要素比較にオブジェクトのequalsを使うが、TreeSetなどのSortedSetは要素比較にcompareTo(またはcompare)を使う。そのため、SortedSetにComparatorを設定している場合は、要素比較の結果がHashSe…

JacksonとLombokの組み合わせ

JacksonとLombokの組み合わせについての備忘録。 ソースコード plugins { id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = JavaVersion.VERSION_11 repositories { mavenCentral() } dependencies { annotationProcess…

JavaのOOMのコマンドラインオプション

JavaのOOMのコマンドラインオプションについての備忘録。 ソースコード OOMが発生するソースコード。 public class Main { public static void main(String[] args) { byte[] buff = new byte[Integer.MAX_VALUE]; } } Demo 今回はOpen JDK 17を使う。 % sdk…

JFRでdirect memory statisticsを見る

JDK 15からdirect memory statisticsのJFR eventが追加されたので試したときのメモ。 準備 ソースコード Nettyで確認したいので、Spring WebFluxを使う。Spring InitializrからWebFluxのプロジェクトを作成して、RestControllerを追加しただけ。 build.gradl…

Homebrewで過去のversionをインストールする

Homebrewで過去のversionのpackageをインストールしたいときの備忘録。 以前はGitHubのcommit URLを指定してbrew installできていたが、この方法は使えなくなったので、代わりにbrew extractコマンドを使う必要がある。 手順 自分のtapがない場合は作成する…

JDK Flight Recorderのイベントを作る

JDK Flight Recorder (JFR) のイベントを作ったときのメモ。 準備 JDK Misson Control (JMC) ここからダウンロードしてインストールする。 ソースコード import java.util.concurrent.TimeUnit; import jdk.jfr.Category; import jdk.jfr.Description; impor…

Spring BootのFlightRecorderApplicationStartupを試す

Spring Boot 2.4 (Spring Framework 5.3) から追加されたFlightRecorderApplicationStartupを試したときのメモ。 追記 このバグがあるので、Spring Boot 2.4.7 (Spring Framework 5.3.8) 以降を使ったほうがいい。 https://github.com/spring-projects/sprin…

Spring BootでRedis Cacheのmetricsを収集する

Spring Boot 2.4からRedis Cacheのmetricsが収集できるようになったので試してみた。 ソースコード build.gradle plugins { id 'org.springframework.boot' version '2.4.1' id 'io.spring.dependency-management' version '1.0.10.RELEASE' id 'java' } gro…

RxJavaの備忘録(flatMap, concatMap, concatMapEager)

このメソッドのように、別スレッドで動く処理を呼び出したときのflatMap, concatMap, concatMapEagerの違いについての備忘録。 plugins { id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { mavenCe…

JITWatchを試す2

前回はJITWatchのデモアプリを使ってHotSpotログファイルを作成したので、今回はソースコードを書いて試してみた。 手順は前回と同じ。 https://hirakida29.hatenablog.com/entry/2020/06/06/235407 準備 ソースコード build.gradle plugins { id 'java' id …

JUnit5とSpockを同じプロジェクトで使う

JUnit5の環境でSpockを使いたいときのメモ。 追記 Spock 2.0からはJUnit5で動作するので、JUnit4の設定は不要。 https://spockframework.org/spock/docs/2.0/release_notes.html ソースコード build.gradle plugins { id 'org.springframework.boot' version…

Spring Data RedisのテストにTestcontainersを使う

Spring Data RedisのRedisTemplateのテストにTestcontainersを使いたいときのメモ。 ソースコード build.gradle plugins { id 'org.springframework.boot' version '2.4.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } grou…

Spring BootのWebClientのテストにSpring Cloud ContractのWireMockを使う

Spring BootのWebClientのテストにSpring Cloud ContractのWireMockを使ってみたときのメモ。 (ちなみに、RestTemplateのテストで使えるMockRestServiceServerはWebClientをサポートしていなかった) ソースコード build.gradle plugins { id 'org.springfr…

GradleでJNIを試す

GradleでJNIを試したときのメモ。 ソースコード % tree . . ├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src ├── hello │ └── c │ ├── com_…

JITWatchを試す

OpenJDKでJITWatchを試したときのメモ。 準備 JDK AdoptOpenJDK 11 HosSpotを用意する。今回はSDKMANでインストールする。 % sdk install java 11.0.9.hs-adpt % sdk use java 11.0.9.hs-adpt hsdis (HotSpot disassembler) AdoptOpenJDKのソースコードをダ…

GradleでJava 14のプレビュー機能を試す

GradleでJava 14のプレビュー機能を試したときのメモ。 Gradleは6.3以降を使用する。 Gradle 6.3 Release Notes IntelliJ IDEAでJava 14を使う場合は、2020.1以降を使用する。 Java 14 and IntelliJ IDEA | The IntelliJ IDEA Blog ソースコード build.gradl…

GraalVMのNative Imageを試す

GraalVMのNative Imageを試したときのメモ。 ソースコード public class HelloWorld { static { System.out.println("Static initialization"); } public static void main(String[] args) { System.out.println("Hello world!"); } } Demo DockerのGraalVM…

Spring BootでRxJava2を使う

Spring Boot 2はRxJava2をサポートしているので、Spring MVCとSpring WebFluxどちらでも、Controllerの戻り値にFlowableなどを指定できる。 ソースコード dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation…