All About ACS: IBM i Access Client Solutions 5250で画面レイアウトが崩れる

# ACS の 5250 表示で画面レイアウトが崩れる

ACS の 5250 表示で画面レイアウトが崩れるケースが発生しています。こんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/a6be66ba-e3e6-de40-f274-6a157ffcbf3c.png)

入力項目が下線に対して正しくないだけでなく、ちょっと見にくいですが、縦にそろっているはずのピリオドが揃っていません。

# IBM は Java の動きによるもので ACS では対応できないと文書で表明

これに対して IBM から文書が出ました。

[Why does IBM i ACS 5250 emulator character alignment vary with different versions of Java?](https://www-01.ibm.com/support/docview.wss?uid=ibm10888563)

ACS は 画面描画を Java に任せているので ACS では対応できない、Java 側での対応が必要とのことです。

>  the IBM i Access Client Solutions (IBM i ACS) 5250 Emulator does not have direct control of this behavior, so any code changes address this would have to be pursued with the Java provider. 

# 発生条件
下記の3つの条件が重なるとき、発生するのを確認しています。ただし、これ以外にも発生する可能性はあります。

## ACS で「フォント拡大縮小」を「はい」にしている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/5de54c96-6254-435e-9e3b-84497b27a6ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/fabaf279-5d0c-1b79-540c-93587e601d89.png)

## Windows のディスプレイで拡大縮小が100%でない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/d7ad7a23-a47a-6151-9032-0074c778ddb5.png)

## Java が 9 以上

**2020-04-25 追記:フォントによってはJava 8でも発生します。下部に追記しました**

Java 8 では発生しません。Oracle/Open問わず Java 9 以降で発生します。
Java 9 から Windows のディスプレイで拡大縮小への対応するようになりました。前項の発生条件を考えると、このHiDPI対応が完全でないのかもしれません。

[Windows HiDPI Graphics support](https://bugs.openjdk.java.net/browse/JDK-8073320)

# 回避方法
上記の条件で発生しているのであれば、どれか一つを変えてやれば、回避できます。

## ACS で「フォント拡大縮小」を「いいえ」にする

ただし、横がスカスカになったりします。

## ACS で「固定フォント」を「はい」にする 2020-04-25 追記

ただし、セッションウインドウのサイズを変えても、文字の大きさが変わらなくなります。

## Windows のディスプレイで拡大縮小が100%にする

Windows環境全体の変更であり、高解像度の環境では他のアプリケーションの表示・文字が小さくなりすぎるかもしれません。

## Java を OpenJDK 系の Java 8 にする

Java プロバイダーによっては OpenJDK ベースのJava 8 を長期サポートしているものもあります。
例えば [AdoptOpenJDK](https://adoptopenjdk.net/support.html) の場合、少なくとも2023年9月まで Java 8 をサポートすると言っています。
ただし、[こちら](https://qiita.com/6onoda/items/a6cc3a4700c0705521b6)で呼べたように、横向き用紙に画面印刷やJPS印刷ができません。

## Oracle 8 を使う

一番制約のない回避策はOracle 8 を使うことです。
Oracle が有償化したのは新規ダウンロードで、以前にダウンロードしたものは使い続けられるそうです。
セキュリティが心配なら、Oracle と有償サポート契約を結ぶこともできます。
下記の方法で、古いJavaの安全度を高めることもできます。

[Java を ACS 専用にして安全にする](https://qiita.com/6onoda/items/1e63dfc76bc9b0f6f140)


# 2020-04-25 追記: Oracle Java 8 でもフォントによっては発生することを確認
Oracle Java 8 でもフォントによっては発生することを確認しました。

Monospaced や MSゴシックなど標準的なフォントを使っている場合、Java 8 では発生せずに Java 9 以降で発生するため、Java 9 以降であることが条件のひとつと思っていましたが、フォントによっては Oracle Java 8 でも発生することが確認しました。

問題のフォントは Google と Adobe が共同で行っているオープンなフォントの中で漢字が使え DBCS:SBCS の幅が 2:1 の等倍フォントである「Noto Sans CJK Nono JP」です。
[Google Noto Fonts](https://www.google.com/get/noto/) から「JP」で検索される「Noto Sans CJK JP」のなかの NotoSansMonoCJKjp-Regular.otf を導入してテストしました。

ACS 1.1.8.4 を Oracle Java 8 u201 で動かしています。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/ca79f64c-e5d3-f1e2-e8bb-53891d8d337d.png)

フォント設定は、こちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/696509d2-7c42-5868-483d-fe6e16b71b31.png)

ディスプレイ設定で 150% の拡大を設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/965b9327-7241-c5e9-b8a1-bc77f2939340.png)

WRKACTJOB のプロンプトで見ると、レイアウトの崩れが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/7863249a-0e12-cdc5-f810-80f4db723bc1.png)


今回の場合、下記の回避策では**改善されません**でした。

* ACS の「フォント拡大縮小」を「いいえ」に設定
* Windows のディスプレイ設定で 拡大縮小を 100% に設定

改善されたのは、下記の設定です。この場合、ディスプレイ設定で 拡大縮小が 150% に設定されていても改善されました。
ただし、セッションウインドウのサイズを変えても、文字の大きさが変わらない設定です。

* **「固定フォント」を「はい」に設定**

***
2019-07-12 [Java を ACS 専用にして安全にする](https://qiita.com/6onoda/items/1e63dfc76bc9b0f6f140)の情報とリンクを追加
2020-04-25 Java 8での発生を追記。回避策として固定フォントの利用を追記
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***