JDK

Java 17 新機能(4)

JEP 412: 外部メモリと外部関数 (Incubator)

Javaランタイム外部のメモリにアクセスしたり,ネイティブ関数を呼び出すためのAPIを提供します。以前からJNIなどの方法でアクセスすることは可能でしたが,実装が大変である上にパフォーマンスにも課題がありました。より洗練されたAPIを提供しようという意図で開発されています。

  • 外部メモリの割り当て
  • 構造化された外部メモリの操作とアクセス
  • 外部リソース(リソーススコープ)のライフサイクル管理と外部関数の呼び出し

以下のプログラムではC言語の文字列の長さを返すsize_t strlen(const char *s)を呼び出します。コンパイル時には,–add-modules jdk.incubator.foreignオプションをつける必要があります。また,実行には–add-modules jdk.incubator.foreign オプションに加えて,–enable-native-access=ALL-UNNAMEDオプションもつける必要があります。

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;
import jdk.incubator.foreign.CLinker;
import jdk.incubator.foreign.FunctionDescriptor;
import jdk.incubator.foreign.MemoryAddress;
import jdk.incubator.foreign.MemorySegment;
import jdk.incubator.foreign.ResourceScope;
import jdk.incubator.foreign.ValueLayout;
public class ForeignFunction01
{
    public static void main(String[] args) throws Throwable
    {
        strlen("Hello World!");
    }
    private static void strlen(String string) throws Throwable
    {
        MethodHandle strlen = CLinker.getInstance().downcallHandle(
            CLinker.systemLookup().lookup("strlen").get(),
            MethodType.methodType(long.class, MemoryAddress.class),
            FunctionDescriptor.of(CLinker.C_LONG_LONG, CLinker.C_POINTER)
        );
        MemorySegment str = CLinker.toCString(string, ResourceScope.newImplicitScope());
        long length = (long)strlen.invokeExact(str.address()); 
        System.out.printf("Length of string \"%s\" is %d\n", string, length);
    }
}

警告:実験的なモジュールを使用しています: jdk.incubator.foreign
警告1個
WARNING: Using incubator modules: jdk.incubator.foreign
Length of string “Hello World!” is 12

JEP 414: ベクトルAPI (Second Incubator)

ベクトル演算をサポートしているCPUに向けてベクトル演算をサポートするAPIを提供するものである。

JDK

Java 17 新機能(3)

JEP 407: RMIアクティベーションの削除

Java 15から「非推奨」とされていたRMIアクティベーション機能,具体的にはjava.rmi.activationパッケージが削除されています。

JEP 409: シールクラス

Java 15からプレビューとして含まれていたシールクラスが正式に導入されました。内容については過去の記事をご参照ください。

JEP 410: 実験的なAOTコンパイラ,JIT コンパイラの削除

実験的なコンパイラAOT(ahead-of-time)コンパイラとJIT(Just-in-time)コンパイラが削除されています。AOTコンパイラはJEP 295で導入されたものです。またJITコンパイラはJEP 317で導入されたものです。

JEP 411: 削除に向けたセキュリティマネジャーの非推奨

セキュリティマネジャーに関連するほとんどのクラスとメソッドが非推奨となっています。また実行時にセキュリティマネジャーをインストールしようとしたり,コマンドラインでセキュリティマネジャーを有効にしようとすると警告メッセージが出力されます。

SecurityManagerTest.java:5: 警告:[removal] java.langのSecurityManagerは推奨されておらず、削除用にマークされています
SecurityManager manager = new SecurityManager();

JDK

Java 17 新機能(2)

JEP 406: switch文でのパターンマッチング (プレビュー)

switch文が更に拡張されている。caseラベルにクラス名を指定することで,インスタンスの型に応じて条件分岐できるようになりました。次の例ではObject型,Parent型,ChildA型のオブジェクトとnullを渡して,条件分岐させています。

コンパイルには,–enable-previewオプションと –source 17オプションをつける必要があります。

public class Switch01
{
    public static void main(final String[] args)
    {
        Object[] array = new Object[]{ new Object(), new Parent(), new ChildA(), null };
        for(Object obj : array)
        {
            switch(obj)
            {
                case null:
                    System.out.println("null");
                    break;
                case ChildA c:
                    System.out.println("ChildA class");
                    break;
                case Parent p:
                    System.out.println("Parent class");
                    break;
                default:
                    System.out.println("Other class");
            }
        }
    }
}
class Parent{}
class ChildA extends Parent{}

Other class
Parent class
ChildA class
null

更には,switchラベルに続けてboolean型の条件を続けることができるよう拡張されました。次の例ではshape変数に格納されているオブジェクトがCircleクラスの場合で,かつ,getArea()の戻り値が100を超えている場合にLarge Circleというメッセージを表示します。

public class Switch02
{
    public static void main(final String[] args)
    {
        Shape[] array = new Shape[] { null, new Circle(1), new Circle(10), new Rectangle(5, 3) };
        for(Shape shape : array)
        {
            switch(shape)
            {
                case null ->
                    System.out.println("null");
                case Circle c && c.getArea() > 100 ->
                    System.out.println("Large Circle");
                case Rectangle r ->
                    System.out.println("Rectangle");
                default ->
                    System.out.println("other");
            }
        }
    }
}
/** 図形 */
abstract class Shape
{
    /** 
     面積を返す
     * @return 面積
    */
    abstract double getArea();
}
/** 円 */
class Circle extends Shape
{
    /** 半径 */
    private double radius;
    public Circle(final double radius)
    {
        this.radius = radius;
    }
    public double getArea()
    {
        return Math.PI * Math.pow(radius,2);
    }
}
/** 矩形 */
class Rectangle extends Shape
{
    /** 幅 */
    private double width;
    /** 高さ */
    private double height;
    public Rectangle(final double width, final double height)
    {
        this.width = width;
        this.height = height;
    }
    public double getArea()
    {
        return width * height;
    }
}

null
other
Large Circle
Rectangle

JDK

Java 17の新機能(1)

Java 17がリリースされました。今回リリースされたJava 17はLTS(Long Term Support)版です。主な変更点を紹介していきます。

JEP 306: 常時厳密性を維持する浮動小数点セマンティクス復活

浮動小数点数の計算でオーバーフロー等が起こる場合に,CPUによって計算結果が異なってしまう現象を避けるために,常にIEEEの規格に準拠した計算を行うようにするものである。この問題が発生するのは,SSE2命令セットをサポートしていないCPU(Pentium Ⅲ以前)のマシンということなので,影響を受ける環境は少ないと思われる。

JEP 356: 疑似乱数生成器の拡張

PRNGという新たな疑似乱数生成器を導入し,既存の乱数生成器も含めて統一的なインタフェースを提供する。java.util.random.RandomGeneratorというインタフェースが導入されている。さらにこれを継承したSplittableRandomGeneratorJumpableRandomGeneratorLeapableRandomGeneratorArbitrarilyJumpableRandomGeneratorStreamableGeneratorというインタフェースが提供されている。

JEP 382: 新macOSのレンダリングパイプライン

新しいmacOSのグラフィックAPIであるMetalに対応させたものである。

JEP 391: macOS/AArch64 Port

Appleがx64アーキテクチャからAArch64への移行を進めていることに対応して,AArch64へ対応するためのものである。

JEP 398: Applet API削除への非推奨

Java AppletのAPIが非推奨となりました。以下のクラス/インタフェースを使用するとコンパイラが警告を出すようになっている。

  • java.applet.Applet
  • java.applet.AppletStub
  • java.applet.AppletContext
  • java.applet.AudioClip
  • javax.swing.JApplet
  • java.beans.AppletInitializer

JEP 403: JDK内部のカプセル化を強化

--illegal-accessオプションによって可能であったJDK内部のAPIを利用することが不可能となっている。

JDK

OpenJDK 17をビルド

GitHubから間もなくリリースされるOpenJDK 17のソースコードをダウンロードして,ビルドしてみました。ビルド方法に書かれている通りに実行すればよいのですが,かなり多くのライブラリが必要なので,何度もconfigureをくり返すことになりました。

make
Building target 'default (exploded-image)' in configuration 'linux-x86_64-server-release'
Compiling 1 files for BUILD_TOOLS_HOTSPOT
Compiling 8 files for BUILD_TOOLS_LANGTOOLS
Parsing 2 properties into enum-like class for jdk.compiler
Compiling 13 properties into resource bundles for jdk.javadoc
Compiling 12 properties into resource bundles for jdk.jdeps
Creating hotspot/variant-server/tools/adlc/adlc from 13 file(s)
Compiling 7 properties into resource bundles for jdk.jshell
Compiling 16 properties into resource bundles for jdk.compiler
Compiling 2 files for BUILD_JVMTI_TOOLS
Compiling 127 files for BUILD_java.compiler.interim
Compiling 402 files for BUILD_jdk.compiler.interim
Compiling 229 files for BUILD_jdk.javadoc.interim
Creating support/modules_libs/java.base/server/libjvm.so from 1064 file(s)
Compiling 185 files for BUILD_TOOLS_JDK
Compiling 2 files for COMPILE_DEPEND
Compiling 11 properties into resource bundles for jdk.jartool
Compiling 71 files for COMPILE_CREATE_SYMBOLS
Compiling 11 properties into resource bundles for jdk.management.agent
Compiling 3 properties into resource bundles for jdk.jdi
Compiling 5 properties into resource bundles for jdk.jlink
Compiling 3 properties into resource bundles for jdk.jlink
Compiling 1 properties into resource bundles for jdk.jlink
Compiling 224 properties into resource bundles for jdk.localedata
Compiling 11 properties into resource bundles for java.base
Compiling 6 properties into resource bundles for java.base
Compiling 2 files for BUILD_BREAKITERATOR_BASE
Compiling 2 files for BUILD_BREAKITERATOR_LD
Compiling 11 properties into resource bundles for java.logging
Compiling 3071 files for java.base
Compiling 89 properties into resource bundles for java.desktop
Compiling 71 files for COMPILE_CREATE_SYMBOLS
Creating ct.sym classes
Compiling 127 files for java.compiler
Compiling 18 files for java.datatransfer
Compiling 1846 files for java.xml
Compiling 10 files for java.instrument
Compiling 35 files for java.logging
Compiling 330 files for java.management
Compiling 141 files for java.net.http
Compiling 15 files for java.scripting
Compiling 5 files for java.transaction.xa
Compiling 22 files for java.smartcardio
Compiling 272 files for java.xml.crypto
Compiling 61 files for jdk.internal.jvmstat
Compiling 120 files for jdk.charsets
Compiling 406 files for jdk.compiler
Compiling 35 files for jdk.crypto.ec
Compiling 68 files for jdk.dynalink
Compiling 3 files for jdk.internal.ed
Compiling 44 files for jdk.httpserver
Compiling 64 files for jdk.incubator.foreign
Compiling 50 files for jdk.incubator.vector
Compiling 100 files for jdk.internal.le
Compiling 51 files for jdk.internal.opt
Compiling 205 files for jdk.internal.vm.ci
Compiling 30 files for jdk.jartool
Compiling 229 files for jdk.javadoc
Compiling 24 files for jdk.management
Compiling 136 files for jdk.jdeps
Compiling 1 files for jdk.jdwp.agent
Compiling 240 files for jdk.jfr
Compiling 4 files for jdk.jsobject
Compiling 15 files for jdk.management.jfr
Compiling 1806 files for jdk.localedata
Compiling 9 files for jdk.net
Compiling 2 files for jdk.nio.mapmode
Compiling 11 files for jdk.random
Compiling 33 files for jdk.sctp
Compiling 9 files for jdk.unsupported
Compiling 94 files for jdk.xml.dom
Compiling 14 files for jdk.zipfs
Compiling 15 files for java.prefs
Compiling 30 files for java.security.sasl
Compiling 106 files for java.rmi
Compiling 77 files for java.sql
Compiling 15 files for jdk.attach
Compiling 75 files for jdk.crypto.cryptoki
Compiling 1 files for jdk.internal.vm.compiler
Compiling 1 files for jdk.internal.vm.compiler.management
Compiling 40 files for jdk.jcmd
Compiling 251 files for jdk.jdi
Compiling 84 files for jdk.jlink
Compiling 11 files for jdk.jstatd
Compiling 199 files for java.naming
Compiling 95 files for jdk.jshell
Compiling 2768 files for java.desktop
Compiling 16 files for jdk.naming.dns
Compiling 8 files for jdk.naming.rmi
Compiling 16 files for java.management.rmi
Compiling 220 files for java.security.jgss
Compiling 56 files for java.sql.rowset
Compiling 31 files for jdk.management.agent
Compiling 30 files for jdk.security.auth
Compiling 16 files for jdk.security.jgss
Compiling 1 files for java.se
Compiling 18 files for jdk.accessibility
Compiling 3 files for jdk.editpad
Compiling 956 files for jdk.hotspot.agent
Compiling 64 files for jdk.jconsole
Compiling 47 files for jdk.jpackage
Compiling 8 files for jdk.unsupported.desktop
Creating support/modules_libs/java.base/libverify.so from 1 file(s)
Creating support/modules_libs/java.base/libjava.so from 59 file(s)
Creating support/native/java.base/libfdlibm.a from 57 file(s)
Creating support/modules_libs/java.base/libzip.so from 5 file(s)
Creating support/modules_libs/java.base/libjimage.so from 6 file(s)
Creating support/modules_libs/java.base/libjli.so from 8 file(s)
Creating support/modules_libs/java.base/libnet.so from 21 file(s)
Creating support/modules_libs/java.base/libnio.so from 22 file(s)
Creating support/modules_libs/java.base/libjsig.so from 1 file(s)
Creating support/modules_libs/java.prefs/libprefs.so from 1 file(s)
Creating support/modules_libs/java.instrument/libinstrument.so from 12 file(s)
Creating support/modules_libs/java.management/libmanagement.so from 9 file(s)
Creating support/modules_libs/java.rmi/librmi.so from 1 file(s)
Creating support/modules_libs/java.desktop/libmlib_image.so from 50 file(s)
Creating support/modules_libs/java.desktop/libawt.so from 72 file(s)
Creating support/modules_libs/java.desktop/libawt_xawt.so from 51 file(s)
Creating support/modules_libs/java.desktop/liblcms.so from 27 file(s)
Creating support/modules_libs/java.desktop/libjavajpeg.so from 46 file(s)
Creating support/modules_libs/java.desktop/libawt_headless.so from 26 file(s)
Creating support/modules_libs/java.desktop/libfontmanager.so from 63 file(s)
Creating support/modules_libs/java.desktop/libjawt.so from 1 file(s)
Creating support/modules_libs/java.desktop/libsplashscreen.so from 67 file(s)
Creating support/modules_libs/java.desktop/libjsound.so from 18 file(s)
Creating support/modules_cmds/java.rmi/rmiregistry from 1 file(s)Creating support/modules_cmds/java.scripting/jrunscript from 1 file(s)

Creating support/modules_cmds/java.base/java from 1 file(s)
Creating support/modules_cmds/java.base/keytool from 1 file(s)
Creating support/modules_libs/java.base/jexec from 1 file(s)
Creating support/modules_libs/java.base/jspawnhelper from 1 file(s)
Creating support/modules_libs/java.security.jgss/libj2gss.so from 3 file(s)
Creating support/modules_libs/java.smartcardio/libj2pcsc.so from 2 file(s)
Creating support/modules_libs/jdk.attach/libattach.so from 1 file(s)
Creating support/modules_cmds/jdk.compiler/javac from 1 file(s)
Creating support/modules_cmds/jdk.compiler/serialver from 1 file(s)
Creating support/modules_libs/jdk.hotspot.agent/libsaproc.so from 10 file(s)
Creating support/modules_libs/jdk.crypto.cryptoki/libj2pkcs11.so from 14 file(s)
Creating support/modules_cmds/jdk.hotspot.agent/jhsdb from 1 file(s)
Creating support/modules_libs/jdk.incubator.foreign/libsyslookup.so from 1 file(s)
Creating support/modules_libs/jdk.incubator.vector/libsvml.so from 36 file(s)
Creating support/modules_cmds/jdk.jartool/jar from 1 file(s)
Creating support/modules_cmds/jdk.jartool/jarsigner from 1 file(s)
Creating support/modules_cmds/jdk.javadoc/javadoc from 1 file(s)
Creating support/modules_cmds/jdk.jcmd/jinfo from 1 file(s)
Creating support/modules_cmds/jdk.jcmd/jmap from 1 file(s)
Creating support/modules_cmds/jdk.jcmd/jps from 1 file(s)
Creating support/modules_cmds/jdk.jcmd/jstack from 1 file(s)
Creating support/modules_cmds/jdk.jcmd/jstat from 1 file(s)
Creating support/modules_cmds/jdk.jcmd/jcmd from 1 file(s)
Creating support/modules_libs/jdk.management.agent/libmanagement_agent.so from 1 file(s)
Creating support/modules_libs/jdk.management/libmanagement_ext.so from 8 file(s)
Creating support/modules_cmds/jdk.jconsole/jconsole from 1 file(s)
Creating support/modules_cmds/jdk.jdeps/javap from 1 file(s)
Creating support/modules_cmds/jdk.jdeps/jdeps from 1 file(s)
Creating support/modules_cmds/jdk.jdeps/jdeprscan from 1 file(s)
Creating support/modules_libs/jdk.jdwp.agent/libdt_socket.so from 2 file(s)
Creating support/modules_libs/jdk.jdwp.agent/libjdwp.so from 43 file(s)
Creating support/modules_cmds/jdk.jdi/jdb from 1 file(s)
Creating support/modules_cmds/jdk.jfr/jfr from 1 file(s)
Creating support/modules_cmds/jdk.jlink/jimage from 1 file(s)
Creating support/modules_cmds/jdk.jlink/jlink from 1 file(s)
Creating support/modules_cmds/jdk.jlink/jmod from 1 file(s)
Creating jdk/modules/jdk.jpackage/jdk/jpackage/internal/resources/jpackageapplauncher from 3 file(s)
Creating jdk/modules/jdk.jpackage/jdk/jpackage/internal/resources/libjpackageapplauncher.so from 17 file(s)
Creating support/modules_cmds/jdk.jpackage/jpackage from 1 file(s)
Creating support/modules_cmds/jdk.jshell/jshell from 1 file(s)
Creating support/modules_cmds/jdk.jstatd/jstatd from 1 file(s)
Creating support/modules_libs/jdk.net/libextnet.so from 1 file(s)
Creating support/modules_libs/jdk.sctp/libsctp.so from 2 file(s)
Creating support/modules_libs/jdk.security.auth/libjaas.so from 1 file(s)
Compiling 4 files for BUILD_JIGSAW_TOOLS
Optimizing the exploded image
Stopping sjavac server
Finished building target 'default (exploded-image)' in configuration 'linux-x86_64-server-release'

動作確認をすると,きちんとバージョン情報が表示されました。

# ./build/*/images/jdk/bin/java -version
openjdk version “17-internal” 2021-09-14
OpenJDK Runtime Environment (build 17-internal+0-adhoc.root.jdk17)
OpenJDK 64-Bit Server VM (build 17-internal+0-adhoc.root.jdk17, mixed mode, sharing)
雑記

消費税の任意中間申告の誤指摘

本日,税務署から電話がありました。税務調査かと思い,一瞬緊張しましたが,消費税の任意の中間申告が期限から遅れて申告されていたので,納税された金額を還付すると言われました。とりあえず,税務署の職員さんがそう言うのだから納期に遅れてしまったのだろうと思い「わかりました」と応じて一旦電話を切りました。その後,国税庁のWebページで確認すると,任意の中間申告は対象期間が1月から6月で,申告は対象期間の末日の翌日から起算して2月以内ということでした。つまり,6月末の翌日である7月1日から起算して2月後の8月末まででした。税務署に電話をして確認すると,その通りということで,無事に受理して頂きました。

https://www.nta.go.jp/taxes/shiraberu/taxanswer/shohi/6611.htm

これで還付されてしまったら,国税不服審判所に不服申立をするところでした。

情報セキュリティ

個人/SOHOでも導入可能なLinux用セキュリティソフト

サーバーに限れば広く使われているLinux OSだが,個人やSOHOなどで導入可能なセキュリティソフトの選択肢はあまりない。大手のセキュリティソフトベンダもLinux向けの製品を出してはいるものの,大規模ユーザ向けのものが多く,小規模事業者や個人には手がだせない。

以下の製品は無料または,比較的安価であり,1台から導入可能で,個人でも導入できる。

ESET File Security for Linux

https://www.eset.com/jp/business/server-antivirus/file-security-linux/

ESETはスロバキアの企業が開発したセキュリティソフトである。キヤノンITソリューションズが代理店となっている。同社の価格表によると,新規ライセンスが年間20,000円,更新ライセンスが年間10,000円となっている。

価格表 https://eset-info.canon-its.jp/business/file_security/price.html

Dr.Web

Dr.Webはロシアの企業が開発したセキュリティソフトで,日本語でのサポート対応を行っている。年間3,410円で利用できる。

https://products.drweb.co.jp/home/linux/

Comodo Antivirus for Linux

Comodo Antivurus for LinuxはComodo社が開発したセキュリティソフトで,無料で使用できる。英語の情報に頼ることにはなるが,無料とは思えないクオリティである。

https://www.comodo.com/home/internet-security/antivirus-for-linux.php

ClamAV

ClamAVは無料で利用できる。メールサーバ用に開発されたもののようである。誤検知が多かった印象を持っている。公式の日本語情報はないため,英語のドキュメントを読む必要がある。

http://www.clamav.net/

情報セキュリティ

Linux版セキュリティ対策ソフトDr.Web導入

Linux版のセキュリティ対策ソフトDr.Webを導入してみました。ロシアの会社が開発したものですが,日本にも拠点があり,日本語でサポートを受けられます。価格も年間3410円と安価です。

https://www.drweb.co.jp/

[root]# drweb-ctl appinfo
ConfigD; 1349; RUNNING 1; Installed (ConfigD ScanEngine FileCheck Update ESAgent NetCheck StatD GateD MailD Antispam UrlCheck CloudD MeshD LinuxGUI LinuxSpider LinuxFirewall), Should run (Update), UUID: 52eef68d-78ad-4c72-8d57-d2cea838f819, created: 2021-Sep-04 21:31:31
Update; 2195; RUNNING 1


[root]# drweb-ctl log
2021-Sep-06 12:18:37 ConfigD [1349] Notice: License number 147896597, expires 2022-Sep-08 12:11:08
2021-Sep-06 12:18:37 Update [2195] Notice: Update 11.1.6.2012181656: Ready for service
2021-Sep-06 12:18:38 Update [2195] Notice: Downloaded vrpatch-56.kwo (38842 bytes)
2021-Sep-06 12:18:53 Update [2195] Notice: Downloaded vrpatch-57.kwo (35479 bytes)
2021-Sep-06 12:18:53 ConfigD [1349] Notice: Update: placed “/var/opt/drweb.com/antispam/vrpatch-56.kwo”
2021-Sep-06 12:18:53 ConfigD [1349] Notice: Update: placed “/var/opt/drweb.com/antispam/vrpatch-57.kwo”
2021-Sep-06 12:18:53 ConfigD [1349] Notice: Update: placed “/var/opt/drweb.com/drl/antispam/version2.lst”
2021-Sep-06 12:24:28 Update [2195] Notice: Downloaded vrpatch-58.kwo (35915 bytes)
2021-Sep-06 12:24:28 ConfigD [1349] Notice: Update: placed “/var/opt/drweb.com/antispam/vrpatch-58.kwo”
2021-Sep-06 12:24:28 ConfigD [1349] Notice: Update: placed “/var/opt/drweb.com/drl/antispam/version2.lst”