エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

Java19事前調査

Javaの新バージョンリリースの時期になってきたので、調査内容まとめる

JDK 19

公式サイト

JDK 19

Java19追加機能

405: Record Patterns (Preview) 422: Linux/RISC-V Port 424: Foreign Function & Memory API (Preview) 425: Virtual Threads (Preview) 426: Vector API (Fourth Incubator) 427: Pattern Matching for switch (Third Preview) 428: Structured Concurrency (Incubator)

環境準備

sdkmandで入れ替え

$ sdk install java 19.ea.36-open

詳しい使い方は、過去記事で suzaku-tec.hatenadiary.jp

機能検証

405: Record Patterns (Preview)

JEP 405: Record Patterns (Preview)

本文のサマリーをDeepLかけた結果

概要

レコードパターンを使って、Javaプログラミング言語を強化し、レコード値を分解する。レコードパターンとタイプパターンをネストすることで、強力で宣言的、かつ複合的なデータナビゲーションと処理を可能にする。これはプレビュー言語の機能である。

試し実装

本文を読んだ感じ、キャスト後の値のアクセスが楽になるような感じらしい。

とりあえず、試し実装

public class Java19_405 {

  record Point(int x, int y) {}
  enum Color { RED, GREEN, BLUE }
  record ColoredPoint(Point p, Color c) {}
  record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}

  public static void main(String[] args) {
    Rectangle r = new Rectangle(new ColoredPoint(new Point(1, 2), Color.RED),
                            new ColoredPoint(new Point(2, 4), Color.GREEN));
    printUpperLeftColoredPoint(r);
  }

  static void printUpperLeftColoredPoint(Rectangle r) {
    if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {
         System.out.println(ul.c());
    }
  }
}

実行方法は、以下の通り

$ javac --enable-preview --release 19 Java19_405.java
$ java --enable-preview Java19_405

注目してほしいのは、if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr))のあたり。
次の行で、直接ulにアクセスできるようになっている。

前までは、Rectangleのrからアクセスしてたけど、その必要性がない。

所感

VBAにあるwith~endと似たようなものだと感じた。
何か、問題を抱えてそうな気がしないでもないんだが、どうなんだろう?
switch式が書いてあったが、あまり有効さを見いだせてないので、一旦スルー

JEP 422: Linux/RISC-V Port

本文のサマリーをDeepLかけた結果

JDKをLinux/RISC-Vに移植する。

開発に影響なさそうなので、スルー

JEP 424: Foreign Function & Memory API (Preview)

本文のサマリーをDeepLかけた結果

JavaプログラムがJavaランタイム外のコードやデータと相互運用するためのAPIを導入する。外来関数(JVM外のコード)を効率的に呼び出したり、外来メモリ(JVMが管理していないメモリ)に安全にアクセスすることで、JavaプログラムはJNIの脆さや危険性なしにネイティブライブラリの呼び出しやネイティブデータの処理を行うことができるようになるAPIです。本APIはプレビュー版です。

環境準備するのが難しいので、試し実装なし

所感

JNIの実装は、何回か経験がある。
面倒くさいってことしか記憶にない。
もうちょい寝かしておこう。。。

JEP 425: Virtual Threads (Preview)

JEP 425: Virtual Threads (Preview)

本文のサマリーをDeepLかけた結果

Java プラットフォームに仮想スレッドを導入します。仮想スレッドは、高スループットの並列アプリケーションを書き、維持し、観察する労力を劇的に削減する軽量なスレッドです。このAPIはプレビュー版です。

所感

実装内容に影響はなさそう。
この対応が入ることで、StreamAPIのスレッド生成のコストが下がるのだろうか?
ところどころにStreamAPIってあるので、影響あると思うが、有識者に話聞かないと理解できなさそう。

JEP 426: Vector API (Fourth Incubator)

JEP 426: Vector API (Fourth Incubator)

本文のサマリーをDeepLかけた結果

ベクトル計算を表現するAPIを導入し、サポートするCPUアーキテクチャ上で最適なベクトル命令に実行時に確実にコンパイルし、同等のスカラー計算を上回る性能を達成する。

所感

ベクトル計算のAPIか。。
おそらく、背景には機械学習とかが影響してるんだろうな。。。
すぐ試すのは難しそうだったのでスルー

JEP 427: Pattern Matching for switch (Third Preview)

JEP 427: Pattern Matching for switch (Third Preview)

三回目のプレビューなので、スルー

JEP 428: Structured Concurrency (Incubator)

JEP 428: Structured Concurrency (Incubator)

本文のサマリーをDeepLかけた結果

構造化並行処理のためのAPIを導入することにより、マルチスレッドプログラミングを簡素化する。構造化並行処理は、異なるスレッドで実行される複数のタスクを一つの作業単位として扱うことで、エラー処理やキャンセル処理の効率化、信頼性の向上、観測性の強化などを実現する。本APIはインキュベーティングAPIである。

実験機能なので、スルー

雑感

実験機能が多い。
そこまで開発影響あるものはないが、実験機能は、試すための準備が面倒なものが多い。

実験機能は、どこかでスキを見て、ちゃんと試したい

2022/08/22週 気づきと振り返り 眠れぬ夜が続く

業務こなしての問題・気づき

障害対応で気をつけること

挙動確認する場合は、状態を完全にリセットした状態でやる。 特定条件のときにだけ、まともに動くケースがありうるので、状態をリセットするのは重要 結合テストのバグ対応したのだが、ローカルでの挙動確認を中途半端な状態でやってしまったため、バグが完全に対応できておらず、無駄な時間を作ってしまった。。。

きれいな状態で動作確認すること、ものすごく大事

趣味開発での問題・気づき

intellijのterminalのvim操作でescキーでフォーカスが移る。。。

https://youtrack.jetbrains.com/issue/IDEA-269281

intellijでgit操作するプラグインを使っているのだが、intellijをアップデートしたら動かなくなったので、ターミナルで操作することになった。
gitコマンドは、知っているので難なくできたが、gitコメント書き終わったあとに編集モード終了しようとしてescキー押そうとしたら、ターミナルからフォーカスが移ってしまい、パニクってしまった。。。
最初見たとき、"はぁ?"と"なんで?"を連呼していた気がする。
1時間くらい悩んだ結果、フォーカスが移ってることに気づき、キーバインドを変えて対応した。

マジで焦る。

その他雑記

気になったもの

ArchUnitってのが、最近気になった。
個人開発しているやつが大きくなってきたので、そろそろアーキテクチャ守られてるかチェックしたいって願望がでてきた。
スキ見て入れて使ってみたい。

いくつか事例は見たことあるが、ふ~ん止まりなので、試してみたい。

【読書ノート】現代病「集中できない」を知力に変える 読む力 最新スキル大全

読んだ理由

RSSリーダー作っているのでアイディアのインプットとして読んだ

まとめも

読むべきものの選別

偏りが強いメディアを見抜くポイント

  1. 出来事を単純化して断言してたら危険
  2. 社会は複雑。
  3. 純化されていたら、意図的に情報が抜かれている可能性大
  4. 対立を煽っている
  5. 敵が居たほうが思考誘導しやすい。
  6. 敵を作っている記事は偏りやすいので注意
  7. 強いワードが含まれている
  8. 強い言葉は、よっぽどな局面じゃないと使われない
  9. 使っている=良識から外れている可能性大
  10. 名証言などソースが不明
  11. 「専門家によると」「関係者によると」は、証言として不十分
  12. 専門家なのに匿名は、専門家ではない
  13. 陰謀論が書かれている
  14. 荒唐無稽な話
  15. ソースがないのなら、ただの妄想
  16. 誰も知らない隠された真実を根拠にしている
  17. 公開されてない情報で真相を語る=陰謀論
  18. 正解に過剰に偏っていないか?
  19. 正解に見える後出しじゃんけんになってないか?
  20. 結果と要因を逆転させても、成立するか見てみる

SNS

SNSの落とし穴

  • 人間関係で流れる情報が決まってくる
  • 人間経由で怪しい情報が入ってくるので、否定しづらい側面がある
  • 情報の分断が起きやすい
  • オルタナティブ・ファクト = もう一つの真実
  • ポスト・トゥルース = 真実のあと
  • 真実よりも信条で沿っていれば信じてしまう
  • エコーチェンバーを作りやすい
    • 閉鎖的環境に同類が集まると、信念の増幅が起きる
    • 忠告が効かなくなる
    • 疑念がアイデンティティの崩壊の恐怖でかき消される
    • サンクコストの呪縛を引き起こし安い

SNSへの対策

  • 人間関係用SNSと情報収集用SNSを使い分ける
  • スルー能力を身につける

新聞の落とし穴

  • 扱う分野は公平でも、解説は公平ではない
  • 背景を読み取る力が必要
  • 社会部は、特に薄っぺらで表面的
    • 知識<足で稼いだ経験
  • 入り口としては使えるが、深く理解するのには適さない

ネットは何を見るか

プッシュ情報

  • 受動的にもらえる情報

問題点

  • 情報量が多い
  • 良質な情報を見失う可能性大

プル情報

  • 能動的にもらう情報

情報を選べるので、良質な情報を取捨選択する必要性がある

RSSリーダー

  • 己のためになるかの選択眼が基準
  • カテゴライズが必須
    • カテゴライズできていたほうが、どういう目的の情報をみているのか理解しやすい

有料メディア

有料だからといって質のいい記事をだしているところは、ほぼない。

有料メディアを選ぶポイント
  • 専門家の知識
    • 本物の専門家は忙しい
    • テレビは切り取りがあるので消極的
    • メディアの専門性
  • 特異な視点
  • 深い取材や分析

SNSをどう使いこなすか

  • ツイッター
    • 人間関係の情報は拾わない
    • 承認欲求が高いツイートをする人は注意(リツイートやいいねに目がくらんでいる人には要注意)
    • フォロー判断基準
      • ツイートのリアクションを確認
      • 専門用語使っているか
      • 専門家の見地からコメントしているか
        • 省庁のウェブサイトである程度事前知識をつけてから内容を見比べる
      • プロフィール内容
      • 乱暴な言葉使いの有無
      • たくさんの専門家の中でどう評価されているかを見る
    • 専門家リストを作る
      • 信頼できる専門家は、信頼できる専門家と繋がってる可能性が高い
      • 専門家との繋がりより、タレントや政治家、社会活動家と繋がりが強い人を信頼するのは危険

感想

専門家のリストは、試してみようと思った。
比較的、ツイッターが押されていた。ツイッターの機能を搭載するのは、ありかもしれん。

乗ってたやつを自作しているRSSリーダーに食わせたが、失敗する。。。
改良の余地あり。。。

情報の取捨選別は、だいたい考えとあっていた。
自分がどのような背景のある媒体が題している情報化は、あまり考慮してなかったので、今後はそこに気をつけたい。

やっぱり、アンテナを広げるしかないんだなって読んでいて感じた。
読んでいて思ったのは、オールドメディアは、より偏りが強くなっていくだろうと感じた。あと、SNS系は、スルーする力がないと疲弊しそう。。。

【翻訳&お試し】Implement NodeJS Logging like a Pro!

きっかけ

技術系のサイト見てて目に入ったから、試してみたくなった。
あと、個人開発しているやつでロギングどうしようか悩んでいるから

開発環境

vscodeの情報そのまま

バージョン: 1.69.2 (system setup)
コミット: 3b889b090b5ad5793f524b5d1d39fda662b96a2a
 日付: 2022-07-18T16:12:52.460Z
Electron: 18.3.5
Chromium: 100.0.4896.160
Node.js: 16.13.2
V8: 10.0.139.17-electron.0
OS: Windows_NT x64 10.0.19043

typescript

$ tsc --version
Version 4.7.4

対象サイト

Implement NodeJS Logging like a Pro! - DEV Community

ざっくり言うと、node.jsで一番有名なwinstoneの紹介をしている。

お試し

適当にプロジェクト作成

$ npm init -y
$ tsc --init

winstoneをインストール

$ npm i winston

サンプル実装

主な使い方としては、createLoggerでロギング用のインスタンスを作って、そのメソッドでエラーログとかを吐き出すらしい。

// logger.ts
import { createLogger, format, transports } from "winston";

const logger = createLogger({
  format: format.combine(format.timestamp(), format.json()),
  transports: [
    new transports.Console(),
    new transports.File({ level: "error", filename: "errors.log" }),
  ],
});

export default logger;

↑のやつがロギング用の初期化をしているだけ。
以下、サイトの説明内容をdeepLで翻訳した結果。

format -> どのような形式にするかを指定します。ここでは、JSON形式でタイムスタンプを含むログを取得するように指定しています。
transports -> ログの保存先を指定します。エラーログをerrors.log fileというファイルに保存するように定義しました。

次に、作ったロガーを利用して、実際に出力してみる。
今回は、エラーログの定義だけしているので、エラーログを出してみる。

// index.ts
import logger from "./logger";

logger.error("Something went wrong");

実行

コンパイルして実行してみる。

$ npm run tsc
$ node src/index.js 
{"level":"error","message":"Something went wrong","timestamp":"2022-08-07T15:02:34.743Z"}

コンソールログに出力があり、index.jsが置いてるフォルダに、errors.logが出力されるはず。
中身は、コンソール出力されたやつと同じ

// errors.log
{"level":"error","message":"Something went wrong","timestamp":"2022-08-07T15:02:34.743Z"}

感想

とりあえず、今回は触ってみただけ。
サイトには、まだ紹介あったけど、沼る気がしてきたので、深追いはしてない。
個人開発しているやつに入れ込むときに、もっと詳しく調べる予定。
なんとなくだけど、出力場所とかモードの切り分けで、悩む気がしている。。。

参考

Implement NodeJS Logging like a Pro! - DEV Community

作成したソース

GitHub - suzaku-tec/winston-sample

Electron代価のTauriの開発環境作って動かしてみる

経緯

環境準備

  1. rustインストール
  2. https://www.rust-lang.org/tools/install/ から落としてきて入れる
  3. 入れたら rustup 最新化しておく
  4. nodeインストール
  5. nvm使って最新のやつを入れた
  6. create-tauri-app をnodeインストール後に入れておく
  7. C++ build toolインストール
  8. https://visualstudio.microsoft.com/ja/visual-cpp-build-tools/ から落としてくる

全部やり終わったときの状況

$ rustc --version
rustc 1.62.1 (e092d0b6b 2022-07-16)

$ node -v
v18.6.0

サンプル動かす

create-tauri-appをインストールする。npm install -g create-tauri-appで入れた。
任意のフォルダで yarn create tauri-app を実行する。※yarnは、既にインストール済みの想定。

何個か聞かれるけど、基本的にデフォルトでOK
ただ、Which create-react-app template would you like to use? って聞かれたら、使いたい言語選べばいい。
俺は、create-react-app (Typescript)を選んだ。

すべて終わると、以下のメッセージが出るので、言われるがまま実行する。

    $ cd tauri-app
    $ yarn tauri dev

初回にパッケージのインストールが走るので長いが、実行できたら、reactのロゴが回転した画面が出てくるはず。

困った事

yarn tauri devしたときに、ウィイルススキャンが走って、buildのexeがウイルス判定されて、回避方法にかなり迷った。。。
もう、面倒くさいから、開発用のフォルダをスキャン対象外にした。

感想

まだ、開発してないが、スタートラインには立てた。。。
electronは、色々苦戦していたので、どれだけ開発が楽なのか、チャレンジしたい。

参考

Rust によるデスクトップアプリケーションフレームワーク Tauri | 豆蔵デベロッパーサイト

Rust によるデスクトップアプリケーション開発環境構築 with Tauri - Qiita

Tauri デスクトップアプリ開発のはじめ方。 - programwiz.org

nodist から nvm-windows へ移行

経緯

以下のエラーが出てきて、理由を調べると、どうもシンボリックリンクが機能してないのが問題らしい。
nodistはメンテされてないようなので、これを機にnvm-windows に移行しようと思い、記事を書くに至る。

$ npm update -g
npm ERR! code MODULE_NOT_FOUND
npm ERR! Cannot find module '@npmcli/arborist'
npm ERR! Require stack:
npm ERR! - C:\Program Files (x86)\Nodist\npmv\8.13.2\lib\commands\update.js
npm ERR! - C:\Program Files (x86)\Nodist\npmv\8.13.2\lib\npm.js
npm ERR! - C:\Program Files (x86)\Nodist\npmv\8.13.2\lib\cli.js
npm ERR! - C:\Program Files (x86)\Nodist\npmv\8.13.2\bin\npm-cli.js

環境

windows 10

作業内容

Nodistのアンインストール

  1. Nodistアンインストール
  2. アプリとしてNodistを削除
  3. Nodist インストール先フォルダの削除
  4. global installしてると、残るみたい。。。
  5. C:\Program Files (x86)\Nodistを削除した
  6. npm-cache フォルダの削除
  7. C:\Users\<ユーザー名>\AppData\Roaming\npm-cache を削除
  8. 環境変数の削除
  9. npm/node関連の設定を削除。pathにあるやつも消しておいた

nvm-windowsのインストール

  1. インストール
  2. https://github.com/coreybutler/nvm-windows/releases から nvm-setup.exe をダウンロードしてインストール(windows向け)
  3. インストール確認
  4. nvm versionを実行して、バージョン情報と使い方が出てくればインストール成功

node.jsインストール

  1. nvm list available インストール可能なものを調べる
  2. nvm install <バージョン> でインストール
  3. nvm use <バージョン> で切り替え可能

感想

注視してないと、いざ、使うときに苦労するってのを実感した。

参考

nodistでnpmを8.3.1にするとおかしくなる – Everyday Pieces ::

2020 年ではもう使えない Nodist はアンインストールする (Windows)

nvm-windowsでNode.jsバージョン管理 - Qiita

【翻訳】JavaScript Visualizer

経緯

目に止まって、内容見たら、新しい発見があったので、残す

元記事

JavaScript Visualizer - DEV Community

翻訳

DeepL翻訳より

もしあなたがJavaScriptがどのように動作するかに興味があるなら、私はこのオンラインJavaScriptツールをお勧めします、それは実行時のすべてのステップを視覚化します
このサイトの定義済みプリセットを読み込むだけで、または自分のコードをコピー&ペーストして、実行のステップを見ることができます 。
それは完全に無料です。以下をクリックして試してみてください。

感想・雑記など

リンク先のやつは、jsのプロセスの実行内容が、ビジュアライズされたツールのようだった。
開発で利用してるソースを貼るのは無理だが、ローカルでも動かせるっぽいので、準備できればローカルでも使えそう。

サンプル試していて気づいたのは、setTimeoutの実行タイミングが、思ってたのと違った。
promiseのやつもだけど。
setTimeoutは、一連の処理が終わった後にタスクが組まれるという事実を、初めて知った。
なんとなく、該当行を実行したときに、時間の計測が始まるのだと思っていたが、違うらしい。。。

jsの非同期系の処理は、あらためて、鬼門だと思いました。

実行タイミングに引っかかったら、これを使ってみるのもありかもしれない。