Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

java

Kotlinからお手製Javaライブラリを呼んでる人のためのJSpecify入門

これはKotlin Advent Calendar 20242日目の記事です。前日は id:take7010 さんの「KotlinとOpenAI APIで領収書の情報を抽出する」でした。 先日Kotlin愛好会オンラインでJSpecify入門について話しました。JSpecifyについては3年前のJJUG CCCでも話しましたが…

Javaで覚えておくと便利かもしれないクラス・インタフェース7つ

Twitterでこれ↓が流れてきて、あれーあのクラスは無いんだー、まぁ最低限と言われると違うかもなー。と思うのがあったので便乗。 nowokay.hatenablog.com java.util.Objects recordの導入で不要になってきたメソッドも多いが、引数の検証などでまだ出番があ…

エコシステムにビルドツールがたくさんあるのは悪いことではない

JavaやNodeJSには多数のビルドツールがあります。ものによってはビルドツールではなくタスクランナーとかワークフローとか名前が付いてるかもしれませんが些細なことです、ここでは以下のようなツールのことをまとめてビルドツールと呼びます: Apache Ant A…

JVMにおけるServiceLoaderとjavaagent

本エントリーはJava Advent Calendarシリーズ2の19日目です。 qiita.com OpenTelemetryの自動計装機能を調べていたら、 ServiceLoader とjavaagentを活用した実装になっていました。これ前知識がないと魔法に見えるやつだなって思ったのですが、 ServiceLoad…

SLF4JとLogbackは2023年末現在で積極採用していいよ

2年前のブログが未だにブクマされるので、念のため掲題の件について書いておきます。 端的に書くと、あのブログで挙げた懸念事項が解消されたのでどんどん使うと良いと思います。 SLF4J v2の安定版がリリースされた 良かったですね。ちなみにv2.0.9から slf4…

プログラミング言語が抱える課題を解決するには言語を乗り換えるのが一番いい、かもしれない

この記事は集まれKotlin好き!Kotlin愛好会 vol.47の懇親会でちょっと触れた内容を、膨らましてブログ用にまとめ直したものです。 注意点として、Java用静的解析OSSの開発保守を長年やってきたJavaプログラマがKotlinに乗り換えて1年経ったころに書いている…

Threaddump, JFR, JMC周りの知識のアップデート

久々に古い知識を整理していて、けっこう更新されているものが多いのでここにまとめる。 JDK Mission Control (JMC) JMCはOracleのウェブサイトからダウンロードできる。 標準ではOS標準のロケールが利用される。UIを日本語化する場合は jmc.ini で user.lan…

オブジェクト指向か関数型か、という話題に私達はどう接するべきか

私がコードを書くときには「オブジェクト指向でいくか、それとも関数型か?」みたいなことはほとんど気にしていません。特にオブジェクト指向については人によって定義から違うこともままあるため、この手の議論がとても遠回りになることも多いと感じます。 …

「非nullのint配列」をアノテーションで表すのは `@NonNull int[]` ではない

正解は int @NonNull [] です。な、なんだってー! 本当です。Java言語仕様書にも記載がありますが、配列を修飾する場合は [] の手前にアノテーションを書く必要があります。JVM仕様書に記載の例のほうがわかりやすいかもしれません: @Foo String[][] // A…

--add-exportsをMaven/Gradleで使う

--add-exports なんてオプションは使わないに越したことはないのですが、依存先ライブラリの都合でどうしても必要という私のような人のためのメモ。 ポイントは javac だけでなく javadoc ないし java (テスト実行)コマンドに対するオプション提供も必要と…

JJUG CCC 2021 FallでLT参加してきました

JJUG CCC 2021 FallにてJSR305に代わる静的解析用標準アノテーションの策定を目指す活動について紹介しました。スライドは以下からご覧いただけます: speakerdeck.com 2021年11月24日更新:動画はJJUG公式から公開いただいています: www.youtube.com 以下…

GitPodでJavaプロジェクトを開発する

GitHub Codespacesがなかなか個人向けに来ないので、changelog.comで宣伝していたGitPodを試しています。 どうも公式のJava向けの説明が古いようで、既にDeprecatedになっているtheiaを前提としているため、調べたことをメモしておきます。 最新のJavaを使う…

MRJAR (Multi-Release JAR)を使っているOSS一覧

GitHub - RoaringBitmap/RoaringBitmap: A better compressed bitset in Java Arrayの一部範囲を比較するメソッドを使う GitHub - rfscholte/LdapDnsProvider LDAPパッケージの変更を吸収 GitHub - meterware/simplestub: A library for creating simple tes…

SLF4JとLogbackは2021年現在では積極採用しない方が良い(2023年12月 追記)

SLF4JとLogbackの中の人はここ数年活発ではないのでLog4j2などを代わりに使いましょう。 SLF4Jの活動は最近活発ではない SLF4JはVCSとしてGitHubを利用しています。最後の変更が2020年2月、最後のリリースが2019年12月となっていることからも、あまり活発で…

JJUG CCC 2021 Springでバイトコードの話をしました

JJUG CCCで聞きたい内容を募集— ゴールドシップと同誕の方のトダ (@Kengo_TODA) 2021年3月2日 ということでJava8〜16におけるバイトコード生成の変化について、先日開催されたJJUG CCCで喋ってきました。 動画をYoutubeにて配信していただいているので、よろしけ…

JavaのRecordでは配列を使わないほうが良いという話

配列使うとmutableになるから使うべきではない、というのに加えて。生成される hashCode() と equals(Object), toString() が配列を考慮しない実装になっているため、JavaのRecordでは配列を使わないほうが良いようです。 検証コード 生成される hashCode() …

「ドメイン駆動設計入門」付録のGradle向け解釈

ITエンジニア本大賞2021で紹介されていた「ドメイン駆動設計入門」(以下、本書と呼ぶ)が、DDDを学ぶ上でわかりやすかったです。一応他のDDD本も数冊読んではいたのですが、どうしてもユビキタス言語や境界づけられたコンテキストなど”場合による”ものが頻…

技術書「JavaのビルドとCIのキホン」を公開しました

zenn.dev がホットなのでフォロワーの皆様にアンケートを取った結果、「JavaのビルドとCIのキホン」が5票を獲得したので書きました。 私が書くなら何を読んでみたいですか— 達者でな (@Kengo_TODA) September 20, 2020 書籍はこちらです。 zenn.dev zenn.dev…

マイクロサービス時代のアプリケーションサーバ実装について

4年前の下書きが出てきたので、供養のために置いておきます。 SpringOne Platform 2016のKeynoteとSessionを、特にProject Reactor周りについて確認した。 https://www.youtube.com/watch?v=Xm-KjMY_Z_w http://www.slideshare.net/SpringCentral/going-reac…

CompletableFutureの何が嬉しいか、そしてReactorへ……

そうですね。例えば2つのクエリをDBに投げて結果を合成する、みたいなことを書いてみると実感しやすいです。Statementをcloseする処理ももちろん書くのです。— 達者でな (@Kengo_TODA) March 14, 2020 DBにクエリを2つ投げて合成する処理 例えばユーザーIDか…

Javaライブラリを配布する際のログ周りにおける配慮と実践 2020

この記事は、2013年に書いた記事を現状に合わせてアップデートするものです。結論から言うと、当時から id:miyakawa_taku さんがおっしゃっていた「APIは依存に含めて良い」を支持するものです。あるいは無難にバージョン 1.7.30 を使っておきましょう。 blo…

JavaウェブアプリプロジェクトにJavaScript/TypeScriptなどの静的アセットをどう配置するか

以前のJavaウェブアプリ開発では、JavaScriptをはじめとした静的アセットはsrc/main/webappディレクトリに配置するのが普通だった。そこに置くことでmaven-war-pluginのようなビルドシステムが.warファイルの中に突っ込んでくれる。この挙動は今でも変わらな…

Javaプロジェクトにおけるリリース周りの手法あれこれ

考慮する点 成果物のデプロイ ビルドの成果物(artifct)をアップロードすること。アップロードと公開は分けて考えることに注意。デプロイ先にはいくつか候補がある: GitHub Packages (旧GitHub Package Registry) Maven Central Repository Docker Hubなど…

Gradle用のGitHub Actions勘どころ

GitHub Actions のベータ版が個人リポジトリの方に来ているので、色々と試しています。使っているテンプレートプロジェクトと実アプリケーションプロジェクトから、いくつか事例を紹介します。 なお各種単語の定義が公式サイトにあるので、いちど目を通すこ…

selenium-jupiterを試した

JUnit 5にTemporalyFolderに相当する機能がなかったため、自分のプロジェクトでは長らくJUnit4を使っていました。しかし5.4でTempDirが来たため、徐々にJUnit5に置き換えています。 その過程でSelenideを使った統合テストをJUnit5に置き換えたのですが、sele…

Gradleプロジェクト用semantic-releaseプラグインを書いた

Gradle用のsemantic-releaseプラグインはJavaでsemantic-releaseを再実装したものしか無かったので、TypeScriptで書いたものを作りました。 github.com ./gradlew publish を叩くだけのシンプルなものですが、CI周りの設定はGradle側に寄せてあるはずなので…

Java屋がsemantic-releaseに思うこと

最近Java周りでもsemantic-releaseの利用機会が増えています。Gradle pluginとMaven pluginが生まれ、特に後者はyarn*1で実行されるため既存のプラグインとも組み合わせやすく、JavaScriptと比較しても遜色ない状態と言えそうです。 2019年3月時点で、Java特…

SpotBugsプラグインを元にしたSonarQubeプラグインを実装する方法

SpotBugsプラグインの実装方法には公式ドキュメントがありますが、SpotBugsプラグインをSonarQube上で実行するための手法はまだ固まっていません。最近Guava Migration HelperのSonarQubeプラグインのリリースに動いているので、要点をまとめておきます。 So…

JJUG CCC 2018 SpringにてSpotBugsの話をします

月末に開催されるJJUG CCC 2018 SpringにてSpotBugsの話をします。タイトルは「SpotBugs 3.1.xの現状と内部実装が抱える問題」、20分枠のセッションとなります。 追記 タイムテーブルが公開されました。午前11:25〜11:45にLブースでお待ちしています。

Maven3電子書籍の利用され具合(2017年)

ほそぼそと続けているMaven3の入門書「Maven3のはじめかた」ですが、最近はprh入れたり、リポジトリの適当すぎた説明を修正したりといった微修正を行っています。 www.gitbook.com で、意外にも年間2万人のユニークユーザがついたようです。以下が2016年12月…