銀河の歴史がまた1ページ(日記)

Last Update (2022/05/20 09:33:31)
1997.09.06から数えて counter 番目のアクセスです。

ミラーサイト [www.ceres.dti.ne.jp] [yk.rim.or.jp]

[ホームページ] [日記] [日記ファイル一覧] [読んでいる日記] [FreeBSD] [FreeBSD LINK] [検索]

ページ内目次


■ 宇宙暦 2022.04.02

http://www.ceres.dti.ne.jp/~george/jdiaryC20401.html#20220402

2022.04.02(土) 21:57:26 ロシア vs ウクライナ戦争

ロシア vs ウクライナ戦争

開戦4日目といえば、キーフ陥落も時間の問題か?みたいな雰囲気だったけど、当時からロシアが負けると理由付きで解説していた Kamil Galeev さんの連ツイの翻訳があったので紹介。

p.s.

続きの連ツイを紹介。


■ 宇宙暦 2022.04.08

http://www.ceres.dti.ne.jp/~george/jdiaryC20401.html#20220408

2022.04.08(金) 01:06:45 Java 18 で file.encodingのデフォルトcharset が UTF-8 に ... gradle / maven コンパイル時警告やテスト結果表示が文字化け

Java 18 でfile.encodingのデフォルトcharset が UTF-8 に ... gradle / maven コンパイル時警告やテスト結果表示が文字化け

tag: java, java18, maven, gradle, windows-terminal

Windows Terminal + pwsh 上で実行した場合 gradle と maven のコンパイル時警告とかが文字化けしててつらい。

java -Dfile.encoding=COMPAT 指定すれば従来通りの動きをするらしいが、ちょっと様子見。

Windows版のjavaも環境変数LANGを見て処理変えてくれればいいのに。

ちなみに、以下のコマンドで各種システムプロパティ設定が見物できる。

java -XshowSettings:properties -version

p.s. 4/8

■Javaの臨時対策(環境変数による臨時対策)

Javaのデフォルトオプション指定は環境変数 _JAVA_OPTIONS で指定できる。

javaのコマンド側の機能。

export _JAVA_OPTIONS="-Dfile.encoding=COMPAT"

上の指定でビルド時の文字化けは直った。

とりあえずの回避策としてはコレかな。

余談だが java -jar hogehoge.jar と実行したjava単独アプリの起動時には (というか java hoge みたいに存在しないクラスを指定しての実行時にも ) コンソールに以下のように環境変数を使ったぜ!と表示が出る。

Picked up _JAVA_OPTIONS: -Dfile.encoding=COMPAT

■mavenの場合の対策 maven-surefire-plugin (pom.xmlに記載する)

さて、ウチの場合、Javaのソースコードは全部UTF-8になっている。

文字化けするのはテストコードの中でSystem.out.printlnしている所で、コンソール出力の日本語が文字化けする(テスト自体はパスする)。

テスト実行時のコンソール出力だけなんとかなれば良い。

pom.xml に書く場合は以下。 maven-surefire-pluginはテストを実行する時のplugin。 ここでJava VM に渡すオプションを指定する。


<project ....

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>

  <build>

    <plugins>

      <!-- 2022.04.08 Java 18 から file.encoding=UTF-8 がデフォルトになったが 
           テストの System.out.println の結果は Windowsの場合は SJIS で出力される前提らしいので COMPAT を指定 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.4</version>
        <configuration>
          <argLine>-Dfile.encoding=COMPAT</argLine>
        </configuration>
      </plugin>

■mavenの場合の対策 cargo-maven3-plugin (環境変数による臨時対策)

プラグインごとに対策が異なるのが泣けるw

cargo ( https://codehaus-cargo.github.io/cargo/Tomcat+10.x.html ) は、mavenの中からTomcatを起動してwarアプリを動かすplugin。

起動したTomcatのログ出力はコンソール出力されるのだが、pom.xmlに設定を書いても回避はできず、環境変数 _JAVA_OPTIONS="-Dfile.encoding=COMPAT" 指定しないと文字化けが止まらなかった。

うーむ。

■gradleの場合の臨時対策 (環境変数による臨時対策)

gradleの場合、build.gradleに書いて回避する方法はまだ発見できていない。

結局、Javaコマンド側の機能に頼って環境変数 _JAVA_OPTIONS="-Dfile.encoding=COMPAT" を設定することで回避。

export _JAVA_OPTIONS="-Dfile.encoding=COMPAT"

ウチではJavaのソースコードはUTF-8なので、build.gradleにソースはUTF-8にしてくれと書いておく。

// Javaのコンパイル時オプション。
// ソースコードのエンコーディングは UTF-8
// jdk10を使っていて jdk8 向けのバイナリを作るなら --release 8 が必須
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
    options.compilerArgs.addAll(['--release', '8'])
}

これでこちらも文字化け解消。

■全体的な感想

ビルドツールの中で(おそらく)子プロセスとしてjava.exeを起動して、System.out.printlnなどのコンソール出力をさせているヤツは普通に全滅って感じ。

コンソール出力も普通に $LANG 見て動いてくれた方が良かったんじゃ...。

■Oracle製 Windows版 java.exeのコンソール出力は cmd.exe の chcp 指定に従う (対策その2)

Oracle製 Windows版 java.exeは、 コンソール画面ウィンドウに対して cmd.exe上で chcp により設定されたコードページを読み取ってそれに従ってコンソール出力の文字コードを変動させる特殊機能が入っているようだ。

ただし、Windows 11 では、Windows Terminal 内部で実行された cmd.exe の上で実行された chcp 65001 だけが正常に動作する。

Windows 11 では、コマンドプロンプトとかWindows PowerShell 5系で使われていたコンソールウィンドウは使われなくなり、Windows Terminal の中で cmd.exe とか PowerShell.exe とか pwsh.exe が動くようになったのだが、Windows Terminal + powershell.exe + chcp 65001 とか Windows Terminal + pwsh.exe + chcp 65001 という組み合わせは文字化けを呼ぶ。

今回ウチでハマったのは Windows 11 + Windows Terminal + pwsh.exe 環境だったからのようだ。

(Windows 10なら、PowerShell 5系で使われていたコンソールウィンドウの中で動く powershell.exe から実行した chcp 65001 のコードページ設定を Oracle製 java.exe は正常に読み取ってコンソール出力を UTF-8 に切り替える。)

なお、Windows Terminal の中の cmd.exe + chcp 65001 で Windows Terminal に設定したコードページは、子孫プロセスまで有効なようで、以下のような小技が使える。

これがJava 18文字化け対策その2。

Windows Terminal 1.12 + cmd.exe + chcp 65001 しか勝たん...。

ちなみに、maven plugin の cargo:run だけは、この Windows Terminal + cmd.exe + chcp 65001 技が効かなかった。 これは 環境変数 _JAVA_OPTIONS="-Dfile.encoding=COMPAT" で文字化け回避した。

さらにちなみに、cygwinとかMSYS2で使うmintty.exeをコンソールウィンドウとして使った場合、Oracle製Java.exeはコンソール出力をSJIS固定で出力する。 (端末ウィンドウのコードページが取得できないからだろうけど、file.encodingもガン無視してSJIS固定ってなんやねんwww)

普通に環境変数 LANG 見て切り替えてくれよん。

p.s.

UTF-8表示実験するときは、フォント設定も大切。 コードページ設定が原因で文字化けしているのかフォントが足りないので表示できないのかで混乱するので。

p.p.s 4/10 追記

windows 10 のコンソールウィンドウは conhost.exe だったらしい。

一応、 Windows 11 でも 設定 -> プライバシーとセキュリティ -> 開発者向け -> ターミナル の所で、 Windows ターミナル から、 Windows コンソールホスト に設定を変更すると、Windows 10 までの標準コンソールが使用できるようになる。

しかし、上のようにして設定変更しても、 起動した conhost.exe + powershell.exe + chcp 65001 上では Java 18 の文字化けは発生する。 (この組み合わせ Windows 10 なら動いてたけどな)

ちなみに、conhost.exe + cmd.exe + chcp 65001 なら、java.exe はコードページ設定を読み取ってコンソール出力できる。

みたいな都市伝説はここから始まるのか

p.p.p.s 4/16

おおう。 F#もoutput指定無視してカレントコードページでコンソール出力するのか。 なんかMSのコーディング規約とかあるんかね。


■ 宇宙暦 2022.04.09

http://www.ceres.dti.ne.jp/~george/jdiaryC20401.html#20220409

2022.04.09(土) 15:03:53 bash 5.1 以降のブラケットペーストモードを off にする (複数の改行を含む長大なテキストをペーストした後に選択モードとなり Enter 入力が余計に必要になるのを回避する)

bash 5.1 以降のブラケットペーストモードを off にする (複数の改行を含む長大なテキストをペーストした後に選択モードとなり Enter 入力が余計に必要になるのを回避する)

tag: bash

bash 5.1 以降にデフォルトで有効になった余計な機能のようだw

回避方法は ~/.inputrc に以下のように記載する。

set enable-bracketed-paste off

または、 ~/.bashrc に書く場合は以下のように記載する。

ただ、 bash の bind は元々キーバインド編集用のコマンドなので、bashが端末に接続されていない時(scpとかで内部的に~/.bashrcが読み込まれる場合)に警告が出るのでオススメしない。

bind 'set enable-bracketed-paste off'

■ 宇宙暦 2022.04.13

http://www.ceres.dti.ne.jp/~george/jdiaryC20401.html#20220413

2022.04.13(水) 12:16:29 git sparse checkout の新型 (つーても2年前だが) (git 2.25以降)

git sparse checkout の新型 (つーても2年前だが) (git 2.25以降)

tag: git

Git 2.25以降で使用可能。Gitサーバ側の対応も必要だが2年前の記事だし今なら普通に使える。

使い方は以下。

git clone --filter=blob:none <repo>
cd <repo>
git sparse-checkout init
git sparse-checkout set <path-to-directory>

上のリンクは以前の sparse checkout の紹介記事だが、今回の新型は簡単に使えてgit tag情報も使えるので便利になった。


■ 宇宙暦 2022.04.18

http://www.ceres.dti.ne.jp/~george/jdiaryC20401.html#20220418

2022.04.18(月) 12:17:48 パリピ孔明

パリピ孔明

tag: anime

笑うわこんなんww

挿入楽曲に奇妙に力が入ってて草

ご丁寧に三国志の計略の話を前振りでやってからライブ会場で再現して見せてくれるの好き


■ 宇宙暦 2022.04.21

http://www.ceres.dti.ne.jp/~george/jdiaryC20401.html#20220421

2022.04.21(木) 17:38:06 Happy Hacking Keyboard から ロジクール K835OWB 有線 メカニカルキーボード 青軸 に変更

Happy Hacking Keyboard から ロジクール K835OWB 有線 メカニカルキーボード 青軸 に変更

久しぶりにメカニカルキーボードを使いたくなって検索したところ、以下がヒット。

ロジクール K835OWB 有線 メカニカルキーボード 青軸 クリッキー テンキーレス コンパクト メカニカル キーボード 有線 有線キーボード オフホワイト windows surface K835 国内正規品

日本語配列しか製品ラインナップが無いので日本語配列を購入。

この製品は青軸なのでかちゃかちゃ音がして楽しいww

ロジクールには赤軸の製品ラインナップもあるので、もうちょい静かなキーボードが欲しい人にはそちらをオススメ。

結構長い間英語配列を使っていたのでしばらく混乱する予定。 たぶん一番面倒なのがゲームのキー設定変更か。


■ 宇宙暦 2022.04.30

http://www.ceres.dti.ne.jp/~george/jdiaryC20401.html#20220430

2022.04.30(土) 13:59:53 1つのサーバーで複数の証明書が使える、SNI(Server Name Indication)って?

1つのサーバーで複数の証明書が使える、SNI(Server Name Indication)って?

tag: sni, ssl, tls

従来のSSL通信は、はじめにサーバー(グローバルIPアドレス)に設定されたSSLサーバー証明書に対して通信経路を確立させ、その中でデータをやり取りしているため、SSLサーバ証明書は設定された1つしか利用すること出来ないのです。 そこで登場したSNI (Server Name Indication)という技術によって、1台のサーバーでも複数のSSLサーバー証明書がドメイン名(URL)単位で利用できるようになったのです。 仕組みとしてはSSL通信時にドメイン名を通知することで、サーバー側がどのSSLサーバー証明書を利用すべきか判別するのです。

ApacheとかNginxとかを使って、1台のWebサーバ上に複数のホスト名ベースのVirtual Hostを建ててSSL/TLSを設定した際には内部でSNIが使われている。

curl でSNI(Server Name Indication)設定しているサイトにアクセスする場合には、TLSハンドシェイクの段階で接続先ホスト名を指定しなければならないので、 curl -H "Host: example.com" のようなHostヘッダ設定では対応できない。

そんな時には curl -v https://example.com/ --resolve example.com:443:XX.XX.XX.123 みたいな感じで --resolve オプションを使う。 (まだDNS設定していない時)

もしロードバランサーを使う場合には、SNIに対応しているかチェックが必要。(SNIには対応していないLBは結構あるらしいがこれに当たるとハマる。)

SNIはiOS 3.x時代とかAndroid 2.x 時代にはブラウザが対応していなかったらしいが、今なら平気だろう。


日記ファイルリスト最新100件


Copyright(c) 1996-2022 George(小濱 純). All rights reserved.
私の作成したページへのリンクはご自由にどうぞ。
このページに間違いや要望などがありましたら george@yk.rim.or.jp まで御連絡ください。
メール本文に 6020-5440-3372 とか私の 本名 を漢字で書いて頂くと、ウチのSPAMフィルタを通過できます。

[ホームページ] [日記] [日記ファイル一覧] [読んでいる日記] [FreeBSD] [FreeBSD LINK] [検索]

home: <george@yk.rim.or.jp> or <george@ceres.dti.ne.jp>
(I am using white list SPAM filter. To avoid it, please write 6020-5440-3372 in mail body. This key word is valid since 2009-06-14 until 2022-12-31.)