Linux デスクトップでの IntelliJ (Java) フォント環境改善


## 背景

Linux デスクトップ (Ubuntu) で IntelliJ を利用するとフォントが汚ない問題を解決したい。

百聞は一見に如かず。このスクリーンショットの通りエディタ部分のフォントのレンダリング(アンチエイリアス)が微妙なのがわかると思います。

![NormalJava.png](https://qiita-image-store.s3.amazonaws.com/0/10526/a3902023-bc65-84cd-b562-af56cadd2f40.png)


利用している JRE は Oracle 純正。

```bash
$ java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
```

この記事に従って改善すると、以下のスクリーンショットのようにアンチエイリアスが改善されます。

![CustomBuild.png](https://qiita-image-store.s3.amazonaws.com/0/10526/0ea9259c-d98e-39cd-74ec-569985f59f7e.png)


## 解決策

**IntelliJ 同梱の JRE を利用する。以上。**

張り切って記事を書こうとして確認していたら、いつの頃からか IntelliJ 同梱の JRE がカスタムビルド版になっていて、何もしなくてもフォントの質が改善されていました。

2016.2.4 同梱の JRE で既に改善されていることを確認しています。

正式版を普通に落としたら同梱されています。EAP 版を落とすときは、no-jdk 版ではなくて JRE が bundle されている通常の tar.gz を選択してください。

![EAP-2016.2.png](https://qiita-image-store.s3.amazonaws.com/0/10526/3941537c-1beb-a90d-eea6-ea3c41d4274e.png)


## tuxjdk

これだけではあまり意味がないので、自分で OpenJDK にパッチをあてて、改善する方法を説明します。[Apache JMeter](http://jmeter.apache.org/) など Java の GUI アプリを利用するときには引き続き有効な手法です。

fontconfig サポートを含む OpenJDK のパッチセットに [tuxjdk](https://github.com/tuxjdk/tuxjdk) があります。

### 日本語環境でのビルド

基本的に README に従うだけで簡単にビルドできるのですが、日本語環境ではそのままビルドできないので、ロケールを調整して実行する必要があります。

具体的には `get_source.sh` 実行で `hg` のメッセージが英語であることに依存しているので、ロケール関連の環境変数で英語メッセージになるように調整します。

```bash
LANGUAGE=en_US.UTF-8 LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 bash get_source.sh 
```

上記に書き換えたビルドプロセスは以下の通り。チェックアウトするバージョン `$HGTAG` は IntelliJ 同梱版と合わせて `jdk8u112-b04` としています。[revision log](http://hg.openjdk.java.net/jdk8u/jdk8u) では2016/9/30 時点の最新タグは `jdk8u122-b01` なので、どのバージョンを利用するかはお好みで。

```bash
# clone tuxjdk:
git clone 'https://github.com/tuxjdk/tuxjdk.git'
# clone openjdk:
HGTAG='jdk8u112-b04'
hg clone 'http://hg.openjdk.java.net/jdk8u/jdk8u' $HGTAG
cd $HGTAG
LANGUAGE=en_US.UTF-8 LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 bash ./get_source.sh
bash ./common/bin/hgforest.sh checkout $HGTAG
# run helper script to apply tuxjdk onto openjdk sources:
../tuxjdk/applyTuxjdk.sh
# tuxjdk applied, now we can create external build folder:
mkdir ../build
cd ../build
# and run configure script with your favourite options:
bash ../$HGTAG/configure --with-milestone=b04 --with-update-version=112 --with-user-release-suffix=tuxjdk

# then make images:
make JAVAC_FLAGS=-g images
# now wait until the build is complete, and go see the images:
ls images/j2sdk-image
ls images/j2re-image
```

### TLS ルート証明書の更新

OpenJDK のルート証明書は空っぽなので、Oracle JDK のルート証明書で置き換えましょう。そのままだと TLS 通信時に証明書の verify error が発生してしまいます。

以下は Ubuntu の場合。

```bash
$ cp /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts \
  images/j2re-images/lib/security
```

### 起動する JRE を指定

大概の Java アプリには起動用のシェルスクリプトが用意されていると思います。そのシェルスクリプトの流儀に従って、カスタムビルドした JRE/JDK を利用するようにしてください。

例えば IntelliJ の場合は `bin/idea.sh` の冒頭で `IDEA_JDK` 変数に JRE のルートディレクトリを指定すれば OK です。

```bash
IDEA_JDK=/path/to/custom/j2re-image
```


## Infinality

これで Java の GUI アプリも、他の GTK や QT アプリケーション同様に、フォントが freetype でレンダリングされるようになります。

Linux デフォルトのレンダリングスタイルが気になる場合は、[Infinality](https://github.com/bohoomil/fontconfig-ultimate) という freetype2 のカスタム版があります。Infinality はフォントのヒンティング情報を使うかどうか等、フォントレンダリングのパラメータを調整することで、OSX 風ボッテリ表示から Windows 風スッキリ表示まで、好みのレンダリングスタイルを指定できます。(実際に OSX や Windows などのパラメータセットが用意されています)

Ubuntu なら [PPA](https://launchpad.net/~rjvbertin/+archive/ubuntu/infinaltimate) が用意されているので、infinality 版 freetype と fontconfig をインストールしてください。

後はスタイルを選択するだけです。

`/etc/fonts/fontconfig-infinality-ultimate/infinality-settings-explained.sh`

上記ファイルを元に `.bash_profile` 等で設定してください。`USE_STYLE` という変数に好みのスタイルを定義します。上記ファイルから抜粋した選択可能なスタイルの説明部分です。

```bash
#################################################################
#
# Set the USE_STYLE variable below to try each example.
# Make sure to set your style in /etc/fonts/infinality.conf too.
#
# Possible options:
#
# DEFAULT       - Use above settings. A compromise that should please most people.
# OSX           - Simulate OSX rendering
# IPAD          - Simulate iPad rendering
# UBUNTU        - Simulate Ubuntu rendering
# LINUX         - Generic "Linux" style - no snapping or certain other tweaks
# WINDOWS       - Simulate Windows rendering
# WINDOWS7      - Simulate Windows rendering with normal glyphs
# WINDOWS7LIGHT - Simulate Windows 7 rendering with lighter glyphs
# WINDOWS       - Simulate Windows rendering
# VANILLA       - Just subpixel hinting
# CUSTOM        - Your own choice.  See below
# ----- Infinality styles -----
# CLASSIC       - Infinality rendering circa 2010.  No snapping.
# NUDGE         - CLASSIC with lightly stem snapping and tweaks
# PUSH          - CLASSIC with medium stem snapping and tweaks
# SHOVE         - Full stem snapping and tweaks without sharpening
# SHARPENED     - Full stem snapping, tweaks, and Windows-style sharpening
# INFINALITY    - Settings I use
# DISABLED      - Act as though running without the extra infinality enhancements (just subpixel hinting).

USE_STYLE="DEFAULT"
```