JJUG CCC 2024 Fall ( #jjug_ccc ) - セッション資料の一覧

JJUG CCC 2024 Fall に参加しました!

JJUG CCC への登壇もなんと4回目。いい加減慣れてきた頃…、と思ったのですが全然そんなことなかったです。この1ヶ月ぐらいあーでもないこーでもないと構成を考えて書き直して図を追加してというのをずっと繰り返していました。そんな苦労が詰まっていた本日の登壇だったのですが、Twitter(現・X)の感想を見る限りでは好評だったようで、とても嬉しいです!

今回面白いなーと思ったところは、セッション内で「この点については、〜さんのセッションで話していましたね」みたいな話がちょくちょく出ていたことです。自分のセッションでもジェネリクスについてはなぎせさんのセッションを参照してくださいという話をしましたし、阪田さんからは indy については前回の私と桜庭さんのセッションをという話が、また桜庭さんのセッションでも私の今日のセッションについても触れられていました。なんだかいろん人との繋がりみたいなのが見えて面白かったです!


さて、最後にいつものを。

今回、残念ながら時間がかぶってしまって参加できなかったセッションがいっぱいあったので、あとで読むために現時点で発表者の方が公開されている資料一覧をまとめしました。1
(あとで JJUG CCC 2024 Fall のページにもリンクが載るかもしれませんが、とりあえず自分の方で調べました)

10:00

11:00

12:00

13:15

14:15

15:30

16:30

過去記事


  1. 発表者のお名前は敬称略とさせていただきました。

Zenfone8 で VoLTE が無効になって通話できない場合の対処方法

私が使っている Zenfone8 で、なぜかデータ通信はできるのに通話ができなくなっていることに気づきました。 よくみたら、ステータスバーから VoLTE のアイコンが消えていました。

つまり、なぜか VoLTE が使えなくなっているのが原因のようです。
それで色々調べた結果、電話アプリで *#*#8070#*#* にダイヤルしたら解決しました!

対処方法

英語の ASUS サポートのページに対処方法の記載がありました。ROG Phone 5, Zenfone 8 で共通の事象のようです。
[Phone] ROG5 series , ZenFone8 series can't enable VoLTE | Official Support | ASUS Global

翻訳しておきます。


  1. お住まいの地域、アカウント、SIM カードが VoLTE サービスをサポートしているかどうかをキャリア確認
    (訳注:日本では、データ通信専用SIMでなければ大丈夫なハズ)
  2. 電話機で VoLTE 機能が有効になっているかどうかを確認
    1. 設定 > ネットワークとインターネット > インターネット を開く
    2. SIM の隣りにある 設定アイコン(⚙️) をタップ
    3. VoLTE の項目をオンにし、優先ネットワークの種類 で4Gを含むものを選択( "2G/3G/4G/5G" など)
  3. 手順 1 と 2 を実行しても VoLTE アイコンがステータス バーに表示されない場合は、デフォルトの電話アプリを開いて *#*#8070#*#* にダイヤル

このあと、接続試験用の番号(通話無料)に電話して音声が聞こえれば大丈夫です。

この対象機種は、以下のとおり。

  • ROG Phone 5 (ZS673KS)
  • ROG Phone 5 Pro (ZS673KS)
  • ROG Phone 5 Ultimate (ZS673KS)
  • ROG Phone 5S (ZS676KS)
  • ROG Phone 5S Pro (ZS676KS)
  • ZenFone 8 (ZS590KS)
  • ZenFone 8 Flip (ZS672KS)

上記の FAQ では、機種名を指定して書かれていました。ということは、これらの機種固有のバグみたいです。

検索すると、同様の事象でハマってる人が結構いるので、この情報は日本語の ASUS ページにも載せてほしいですね…。

JJUG CCC 2024 Spring ( #jjug_ccc ) - セッション資料の一覧

JJUG CCC 2024 Spring に参加しました!

JJUG CCC への登壇も3回目。今回は、なんと桜庭さんと二人でのセッションでした。1 登壇中は、だんだん余裕がなくなってだいぶテンパってしまい、会場の反応を見れていなかったのですが、その後の反応を伺う限り二人での話が良かったということを聞いて安心しました。また次も登壇できるようにネタを考えます!

セッションは色々聞いた中でも、FFMでJITコンパイラを作ってみたがとても面白かったです。アセンブラはほとんど理解できなかったのですが、わからないけどやってみたいと思ったそんな内容でした。Java 関連のセッションなのに機械語アセンブラの話がメインになるなんて、本当にすごい…。


さて、最後にいつものを。

今回、残念ながら時間がかぶってしまって参加できなかったセッションがいっぱいあったので、あとで読むために現時点で発表者の方が公開されている資料一覧をまとめしました。2
(あとで JJUG CCC 2024 Spring のページにもリンクが載るかもしれませんが、とりあえず自分の方で調べました)

10:00

11:00

12:00

13:00

14:00

15:15

16:15

17:15

LT

過去記事


  1. めっちゃご迷惑をおかけしました…。
  2. 発表者のお名前は敬称略とさせていただきました。

JJUG CCC 2023 Fall ( #jjug_ccc ) - セッション資料の一覧

JJUG CCC 2023 Fallに参加しました!

前回よりも参加者が大幅に増えて、ワイワイと盛り上がった中でいろんな話が聞けて楽しかったです!
特に、一足先に次回の Java 22 でリリース予定の Foreign Function & Memory API と String Template の話があって、使えるようになるのが楽しみになりました。

あと、今回「バイナリビューアを使ってクラスファイルを読んでみよう!」というテーマで登壇しました。
思ったよりもたくさんの人に聞いてもらえて、そして楽しんでいただけたようで、嬉しかったです。前日まで、これ分かりにくいけどどうしたら…と悩みながら内容を練った甲斐がありました。
準備は大変でしたが、また機会があれば頑張ります!


さて、最後にいつものを。

今回、残念ながら時間がかぶってしまって参加できなかったセッションがいっぱいあったので、あとで読むために現時点で発表者の方が公開されている資料一覧をまとめしました。1
(あとで JJUG CCC 2023 Fall のページにもリンクが載るかもしれませんが、とりあえず自分の方で調べました)

10:00

11:00

13:00

14:00

15:15

16:15

17:15

過去記事


  1. 発表者のお名前は敬称略とさせていただきました。

JJUG CCC 2023 Spring ( #jjug_ccc ) - セッション資料の一覧

JJUG CCC 2023 Spring に参加しました!

今回、なんとJJUG CCC 参加9年目にして初登壇してきました。色んな人から「えっ、初?」って言われましたw1
セッションは、javap を使ってクラスファイルを読んでみよう という、ややマニアックな内容です。頑張って調べた内容を色々詰めたので、javap を使ったことがある人にも使ったことがない人にもなにか得られるものがあったとしたら、幸いです。

ちなみに、このセッションではバイトコードについては時間の関係もあって簡単に触れただけだったのですが、ちょうど David Buck さんの "Java Bytecode Crash Course" がバイトコードについての話だったので、両方を聞いた方にはちょうどよかったんじゃないかなと思います。

今回からはオンライン&現地開催となりましたが、やっぱり現地で色んな人と会えて話ができるのは楽しいですね。 普段は Java について話す機会がなかなかないので、コミュニティの楽しさを感じられた一日でした。

今回会えなかった方も、また次の機会にぜひお話できればと思います!


さて、最後にいつものを。

今回、残念ながら時間がかぶってしまって参加できなかったセッションがいっぱいあったので、あとで読むために現時点で発表者の方が公開されている資料一覧をまとめしました。2
(あとで JJUG CCC 2023 Spring のページにもリンクが載るかもしれませんが、とりあえず自分の方で調べました)

9:30

10:00

11:00

13:00

14:00

15:00

16:15

17:15

18:15

過去記事


  1. 実は、今まで JJUG CCC ではライトニングトークしかしていませんでした。
  2. 発表者のお名前は敬称略とさせていただきました。

JJUG CCC 2022 Fall ( #jjug_ccc ) - セッション資料の一覧

JJUG CCC 2022 Fall に参加しました!

オンライン開催も、今回で4回目。
今回はスタッフとして参加1して、ちょっとだけ司会をしました。スムーズに進行できていたら幸いです。

今回、特によかったなーと思ったのが、完成度の高いもちださんのセッション。
まさかのバーチャルお嬢様の声でセッションが始まり、最後にはみなさんの感想ツイートが「~ですわ」になっていたのは面白かったですw
内容も Virtual Thread に関してはこれみれば一通り理解できるという充実度で、しかも動きもついて分かりやすい内容でした。あとで動画が公開されたら真っ先にみてみるといいかと思います!

あと、数村さんの コンテナ環境でのJava技術の進化 で紹介されていた Container Restore In Userspace (CRIU) が気になりました。
プロセスを止めて再開する技術ですが、Java でもできないか検討されているという事。今後どうなっていくのか楽しみです。

さて、次回は JJUG CCC 2023 Spring。オフラインで、もっと人が集まれるようにするかも?とのこと。
オンライン開催も定着してきたとはいえ、以前のオフラインのお祭り感も好きです。なので、ぜひ会場でお会いしましょう!2


さて、最後にいつものを。

今回、残念ながら時間がかぶってしまって参加できなかったセッションがいっぱいあったので、あとで読むために現時点で発表者の方が公開されている資料一覧をまとめしました。3
(あとで JJUG CCC 2022 Fall のページにもリンクが載るかもしれませんが、とりあえず自分の方で調べました)

10:00

11:00

12:30

13:30

15:00

16:00

17:00

  • A: Maven Puzzlers / Andres Almiray
  • B: Persistence made easy with Jakarta Data & NoSQL / Otavio Santana
  • C: Helidon Reactive vs. Blocking (Níma) / Mitia Alexandrov
  • D: PostgreSQL, The Time-Series Database You Want / Chris Engelbert

過去記事


  1. スタッフ参加・一般参加という言い方を個人的にしていたんですが、もしかしてこれってコミケ用語…?
  2. LTを用意しなきゃかな…
  3. 発表者のお名前は敬称略とさせていただきました。

Jextract を使って、Java から libcurl を使ってみる

Jextract に libcurl を呼び出すサンプルがありました。これを試しに動かしてみました。 (まだ PreviewForeign Function & Memory API を使います)

ちなみに、ほかにも以下のライブラリを使うサンプルが置いてあります。

ディレクト 実行するライブラリ
cblas OpenBLAS(行列演算ライブラリ)
lapack LAPACK (数値解析ソフトウェアライブラリ)
libclang Clang の C インタフェースライブラリ
libcurl cURL(データ転送ライブラリ)
libffmpeg FFmpeg(動画・音声の記録・変換・再生ライブラリ)
libgit2 Git(バージョン管理)
libjimage ImageJ(画像処理ライブラリ)
libproc /proc インターフェイス
lp_solve lp_solve(混合整数線形計画法のソルバー)
opengl OpenGL(2次元/3次元コンピュータグラフィックスライブラリ)
readline Readline(コマンドライン対話ライブラリ)
sqlite SQLite(データベース)
tcl Tcl(ユーティリティモジュール)
tensorflow TensorFlow(機械学習ライブラリ)
dlopen 動的リンクを行うローダー
time C言語標準ライブラリの time

また、Python3 スクリプトを実行するサンプル、Go との相互呼び出しを行うサンプルもおいてあります。

前置き

Jextract とは

jextract is a tool which mechanically generates Java bindings from a native library headers. This tools leverages the clang C API in order to parse the headers associated with a given native library, and the generated Java bindings build upon the Foreign Function & Memory API.

jextract は、ネイティブ ライブラリ ヘッダーから Java バインディング機械的に生成するツールです。このツールは、clang C API を利用して、特定のネイティブ ライブラリに関連付けられたヘッダーを解析し、生成された Java バインディングForeign Function & Memory API に基づいて構築されます。

README.md

Foreign Function & Memory API とは

Introduce an API by which Java programs can interoperate with code and data outside of the Java runtime. By efficiently invoking foreign functions (i.e., code outside the JVM), and by safely accessing foreign memory (i.e., memory not managed by the JVM), the API enables Java programs to call native libraries and process native data without the brittleness and danger of JNI. This is a preview API.

Java プログラムが Java ランタイム外のコードやデータと相互運用できる API を導入します。外部関数 (つまり、JVM の外部のコード) を効率的に呼び出し、外部メモリ (つまり、JVM によって管理されないメモリ) に安全にアクセスすることにより、APIJava プログラムがネイティブ ライブラリを呼び出し、ネイティブ データをもろくて危険なJNIを使わずに処理できるようにします。 これはプレビュー API です。

Introduction

また、先日の JJUG ナイトセミナーの資料も併せてごらんください。 JEP 424 Foreign Function & Memory API を試しに使ってみました! - Speaker Deck

今回動かすコード

jextract の samples/libcurl/CurlMain.java 引数の URL にアクセスして、取得した内容を標準出力に流すプログラムです。

import java.lang.foreign.MemorySession;
import java.lang.foreign.SegmentAllocator;
import static java.lang.foreign.MemoryAddress.NULL;
import static org.jextract.curl_h.*;
import org.jextract.*;

public class CurlMain {
   public static void main(String[] args) {
       var urlStr = args[0];
       curl_global_init(CURL_GLOBAL_DEFAULT());
       var curl = curl_easy_init();
       if(!curl.equals(NULL)) {
           try (var session = MemorySession.openConfined()) {
               var url = session.allocateUtf8String(urlStr);
               curl_easy_setopt(curl, CURLOPT_URL(), url.address());
               int res = curl_easy_perform(curl);
               if (res != CURLE_OK()) {
                   String error = curl_easy_strerror(res).getUtf8String(0);
                   System.out.println("Curl error: " + error);
                   curl_easy_cleanup(curl);
               }
           }
       }
       curl_global_cleanup();
   }
}

手順

下準備(jextract のコンパイル

Ubuntu 22.04 で作業しました。 WSL2 上でも同じはず。 Mac の場合は README.md を参照。

apt で必要なものをインストールします。

  • Gradle 実行用の Java 171
  • jextract のコンパイルに必要な LLVM, clang
  • サンプルの実行に必要な libcurl (with OpenSSL)
sudo apt update
sudo apt install -y openjdk-17-jdk llvm-dev libclang-14-dev libcurl4-openssl-dev

JAVA_HOME を設定します。

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

続いて、Java 19 を準備します。 どのディストリビューションでも構わないですが、今回は https://jdk.java.net/19/ のものを使用しました。

cd $HOME
curl -LO 'https://download.java.net/java/GA/jdk19/877d6127e982470ba2a7faa31cc93d04/36/GPL/openjdk-19_linux-x64_bin.tar.gz'
tar xf openjdk-19_linux-x64_bin.tar.gz

jextract をコンパイルします。

git clone git@github.com:openjdk/jextract.git
sh ./gradlew -Pjdk19_home=$HOME/jdk-19/ -Pllvm_home=/usr/lib/llvm-14 clean verify

ところが、エラーになりました。

> Error: the path /usr/lib/llvm-14/lib/clang/14/include does not exist

どうやら、パスが違うみたいです。パッチを当てます。

diff --git a/build.gradle b/build.gradle
index 1e8b620..c1b3cd7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -20,7 +20,7 @@ if (clang_versions.length == 0) {
     throw new IllegalArgumentException("Could not detect clang version." +
             " Make sure a ${llvm_home}/lib/clang/<VERSION> directory exists")
 }
-def clang_version = clang_versions[0]
+def clang_version = clang_versions[1]

 def jextract_version = "19"
 def jmods_dir = "$buildDir/jmods"

改めて実行します。

sh ./gradlew -Pjdk19_home=$HOME/jdk-19/ -Pllvm_home=/usr/lib/llvm-14 clean verify

今度はうまくいきました。

BUILD SUCCESSFUL in 38s
8 actionable tasks: 8 executed

jextract コマンドにパスを通しておきましょう。

export PATH=`pwd`/build/jextract/bin:$PATH 

サンプルの実行

まずは、jextract で curlバインディング用クラスを生成します。

cd samples/libcurl
jextract -t org.jextract -lcurl /usr/include/x86_64-linux-gnu/curl/curl.h

これで、 org/jextract 配下にクラスが作られます。 (ちなみに、上記のコマンドに --source を付与すれば、クラスのソースコードが作られます)

それでは、いよいよサンプルの実行です!

java --enable-native-access=ALL-UNNAMED \
    --enable-preview --source=19 \
    -Djava.library.path=/usr/lib/x86_64-linux-gnu CurlMain.java \
    'http://www.example.com/'

うまくいけば、がーっと html が流れてきます。

Note: CurlMain.java uses preview features of Java SE 19.
Note: Recompile with -Xlint:preview for details.
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
(略)

まとめ

Java からいろいろなライブラリを呼べるようになって、Java の可能性が一気に広がった感じがします。


  1. Gradle がまだ Java 19 未サポートなので別のバージョン (Java 17) をここでインストールしています。