今日は中秋の名月です。天気も良さそうです。中国は祝日でお休みになりますが,日本は通常営業です。中国の習慣に倣って,月餅を頂きました。

今日は中秋の名月です。天気も良さそうです。中国は祝日でお休みになりますが,日本は通常営業です。中国の習慣に倣って,月餅を頂きました。
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
ベクトル演算をサポートしているCPUに向けてベクトル演算をサポートするAPIを提供するものである。
Java 15から「非推奨」とされていたRMIアクティベーション機能,具体的にはjava.rmi.activation
パッケージが削除されています。
Java 15からプレビューとして含まれていたシールクラスが正式に導入されました。内容については過去の記事をご参照ください。
実験的なコンパイラAOT(ahead-of-time)コンパイラとJIT(Just-in-time)コンパイラが削除されています。AOTコンパイラはJEP 295で導入されたものです。またJITコンパイラはJEP 317で導入されたものです。
セキュリティマネジャーに関連するほとんどのクラスとメソッドが非推奨となっています。また実行時にセキュリティマネジャーをインストールしようとしたり,コマンドラインでセキュリティマネジャーを有効にしようとすると警告メッセージが出力されます。
SecurityManagerTest.java:5: 警告:[removal] java.langのSecurityManagerは推奨されておらず、削除用にマークされています
SecurityManager manager = new SecurityManager();
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
Java 17がリリースされました。今回リリースされたJava 17はLTS(Long Term Support)版です。主な変更点を紹介していきます。
浮動小数点数の計算でオーバーフロー等が起こる場合に,CPUによって計算結果が異なってしまう現象を避けるために,常にIEEEの規格に準拠した計算を行うようにするものである。この問題が発生するのは,SSE2命令セットをサポートしていないCPU(Pentium Ⅲ以前)のマシンということなので,影響を受ける環境は少ないと思われる。
PRNGという新たな疑似乱数生成器を導入し,既存の乱数生成器も含めて統一的なインタフェースを提供する。java.util.random.RandomGeneratorというインタフェースが導入されている。さらにこれを継承したSplittableRandomGenerator,JumpableRandomGenerator,LeapableRandomGenerator,ArbitrarilyJumpableRandomGenerator,StreamableGeneratorというインタフェースが提供されている。
新しいmacOSのグラフィックAPIであるMetalに対応させたものである。
Appleがx64アーキテクチャからAArch64への移行を進めていることに対応して,AArch64へ対応するためのものである。
Java AppletのAPIが非推奨となりました。以下のクラス/インタフェースを使用するとコンパイラが警告を出すようになっている。
--illegal-access
オプションによって可能であったJDK内部のAPIを利用することが不可能となっている。
GitHubから間もなくリリースされるOpenJDK 17のソースコードをダウンロードして,ビルドしてみました。ビルド方法に書かれている通りに実行すればよいのですが,かなり多くのライブラリが必要なので,何度もconfigureをくり返すことになりました。
動作確認をすると,きちんとバージョン情報が表示されました。
本日,税務署から電話がありました。税務調査かと思い,一瞬緊張しましたが,消費税の任意の中間申告が期限から遅れて申告されていたので,納税された金額を還付すると言われました。とりあえず,税務署の職員さんがそう言うのだから納期に遅れてしまったのだろうと思い「わかりました」と応じて一旦電話を切りました。その後,国税庁のWebページで確認すると,任意の中間申告は対象期間が1月から6月で,申告は対象期間の末日の翌日から起算して2月以内ということでした。つまり,6月末の翌日である7月1日から起算して2月後の8月末まででした。税務署に電話をして確認すると,その通りということで,無事に受理して頂きました。
https://www.nta.go.jp/taxes/shiraberu/taxanswer/shohi/6611.htm
これで還付されてしまったら,国税不服審判所に不服申立をするところでした。
サーバーに限れば広く使われているLinux OSだが,個人やSOHOなどで導入可能なセキュリティソフトの選択肢はあまりない。大手のセキュリティソフトベンダもLinux向けの製品を出してはいるものの,大規模ユーザ向けのものが多く,小規模事業者や個人には手がだせない。
以下の製品は無料または,比較的安価であり,1台から導入可能で,個人でも導入できる。
ESETはスロバキアの企業が開発したセキュリティソフトである。キヤノンITソリューションズが代理店となっている。同社の価格表によると,新規ライセンスが年間20,000円,更新ライセンスが年間10,000円となっている。
価格表 https://eset-info.canon-its.jp/business/file_security/price.html
Dr.Webはロシアの企業が開発したセキュリティソフトで,日本語でのサポート対応を行っている。年間3,410円で利用できる。
Comodo Antivurus for LinuxはComodo社が開発したセキュリティソフトで,無料で使用できる。英語の情報に頼ることにはなるが,無料とは思えないクオリティである。
https://www.comodo.com/home/internet-security/antivirus-for-linux.php
ClamAVは無料で利用できる。メールサーバ用に開発されたもののようである。誤検知が多かった印象を持っている。公式の日本語情報はないため,英語のドキュメントを読む必要がある。
Linux版のセキュリティ対策ソフトDr.Webを導入してみました。ロシアの会社が開発したものですが,日本にも拠点があり,日本語でサポートを受けられます。価格も年間3410円と安価です。
[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”