mattintosh note

田舎エンジニア物語 〜In Search of the Lost My Private Key〜

macOS 上の Wine で FontSmoothingGamma を検証する

0x3e8 (1000) 〜 0x898 (2200) まで 400 刻みでテスト。なお、初期値の 0x0 は 0x578 (1400) と同じとして扱われる。

等倍

f:id:mattintosh4:20190529112015p:plain
"FontSmoothingGamma"=DWORD:0x000003e8 (1000)

f:id:mattintosh4:20190529111739p:plain
"FontSmoothingGamma"=DWORD:0x00000578 (1400)

f:id:mattintosh4:20190529112703p:plain
"FontSmoothingGamma"=DWORD:0x00000708 (1800)

f:id:mattintosh4:20190529112145p:plain
"FontSmoothingGamma"=DWORD:0x00000898 (2200)

部分拡大

f:id:mattintosh4:20190529112233p:plain
"FontSmoothingGamma"=DWORD:0x000003e8 (1000)

f:id:mattintosh4:20190529112322p:plain
"FontSmoothingGamma"=DWORD:0x00000578 (1400)

f:id:mattintosh4:20190529112845p:plain
"FontSmoothingGamma"=DWORD:0x00000708 (1800)

f:id:mattintosh4:20190529112409p:plain
"FontSmoothingGamma"=DWORD:0x00000898 (2200)

macOS - テキストエディット

f:id:mattintosh4:20190529114144p:plain
macOS - テキストエディット

f:id:mattintosh4:20190529114249p:plain
macOS - テキストエディット

0x4b0 (1200) 相当くらいかな?🤔

その後

FT_LOAD_TARGET_XXXXX とか弄ってみて macOSアンチエイリアスに近くはなった(FT_LOAD_TARGET_XXXXX が効いているかどうかはわからない)。次回のリリースに反映させる予定。

f:id:mattintosh4:20190529232201p:plain

なお、Wine の FontSmoothingGamma に関するソースは 4.0.1 時点では下記の通り。

dlls/gdi32/freetype.c

static struct font_gamma_ramp *get_font_gamma_ramp( void )
{
    static const WCHAR desktopW[] = { 'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\',
                                      'D','e','s','k','t','o','p',0 };
    static const WCHAR smoothing_gamma[] = { 'F','o','n','t','S','m','o','o','t','h','i','n','g',
                                             'G','a','m','m','a',0 };
    const DWORD gamma_default = 1400;
    struct font_gamma_ramp *ramp;
    DWORD  i, gamma;
    HKEY key;

    ramp = HeapAlloc( GetProcessHeap(), 0, sizeof(*ramp) );
    if ( ramp == NULL) return NULL;

    gamma = gamma_default;
    if (RegOpenKeyW( HKEY_CURRENT_USER, desktopW, &key ) == ERROR_SUCCESS)
    {
        if (get_key_value( key, smoothing_gamma, &gamma ) || gamma == 0)
            gamma = gamma_default;
        RegCloseKey( key );

        gamma = min( max( gamma, 1000 ), 2200 );
    }

    /* Calibrating the difference between the registry value and the Wine gamma value.
       This looks roughly similar to Windows Native with the same registry value.
       MS GDI seems to be rasterizing the outline at a different rate than FreeType. */
    gamma = 1000 * gamma / 1400;

    for (i = 0; i < 256; i++)
    {
        ramp->encode[i] = pow( i / 255., 1000. / gamma ) * 255. + .5;
        ramp->decode[i] = pow( i / 255., gamma / 1000. ) * 255. + .5;
    }

    ramp->gamma = gamma;
    TRACE("gamma %d\n", ramp->gamma);

    return ramp;
}

ローカルとかプライベートネットワークでもういい加減 ssh-keygen -R したくない

最近は仮想環境を使ったり、おうちに Raspberry Pi をたくさん設置して SSH で作業することも多くなりましたよね。

SSH で接続先が増えた時に困るのがフィンガープリントの問題です。例えば VirtualBox でゲスト OS に NAT 経由で localhost:22222 で接続出来るようにしたりしますが、ゲスト OS を入れ直すと ssh-keygen -R をしなきゃいけないんですね。Raspberry Piraspberrypi.local で接続しますが、まぁ microSD をよく初期化するのでその度に ssh-keygen -R を叩かされるわけです。特に面倒なのが AWS で EIP 固定で検証用にインスタンをスガンガン作り直したりとかですね…。

グローバルなところは置いといてローカルでホストが変わったとわかりきってるところに ssh-keygen を叩きたくないので私は ~/.ssh/config にこう書いてますというだけの話です。

~/.ssh/config

Host localhost *.local 192.168.*
    StrictHostKeyChecking no
    UserKnownHostsFile    /dev/null

上記は一例ですがこのように書いておくと、

  • localhost
  • *.local(例えば raspberrypi.local など)
  • 192.168.*(例えば 192.168.1.11 など)

に対してホストのチェック(初めて接続する時に聞かれる yes/no のアレ)を行わなくなります。また、ホスト公開鍵を ~/.ssh/known_hosts ではなく /dev/null に保存します。つまり保存しません。何言ってんだ。

この状態で接続してみましょう。Warning: Permanently added 'XXXXXXXX' (ECDSA) to the list of known hosts. は毎回出ますが出るだけです。

Terminal

$ ssh -p22222 localhost
Warning: Permanently added '[localhost]:22222' (ECDSA) to the list of known hosts.

ご利用は計画的に…😇

macOS での Wine の日本語設定(2019年版)

昔書いた記事が古くなったので改めてまとめておきます。

  • Homebrew 2.1.3
  • MacPorts 2.5.4
  • WineHQ Binary 4.0.1

さくっと設定したい人

これが一番手っ取り早い方法です。下記のコードを最後の改行までしっかりコピーして Terminal.app に貼り付ければ完了です。お疲れさまでした。

Terminal

iconv -f UTF-8 -t CP932 <<! | LANG=ja_JP.UTF-8 wine regedit -
REGEDIT4

[HKEY_CURRENT_USER\\Control Panel\\Desktop]
"FontSmoothingType"=dword:00000002

[HKEY_CURRENT_USER\\Software\\Wine\\Fonts\\Replacements]
"MS UI Gothic"="ヒラギノ丸ゴ ProN W4"
"MS ゴシック"="ヒラギノ丸ゴ ProN W4"
"MS Pゴシック"="ヒラギノ丸ゴ ProN W4"
"MS 明朝"="ヒラギノ明朝 ProN W3"
"MS P明朝"="ヒラギノ明朝 ProN W3"
!

FontSmoothingType の違いについては下記の画像を参考にしてください。

f:id:mattintosh4:20190527224730p:plain
"FontSmoothingType"=dword:00000001

f:id:mattintosh4:20190527224822p:plain
"FontSmoothingType"=dword:0000002

以下は Wine に興味がある方のみ引き続きお読みください。


日本語を含むレジストリデータを regedit.exe に渡す場合、以下のことを守る必要があります。例えば REGEDIT4 が書いてない場合、regedit.exe はデータを読み込みません。また、文字コードを CP932 にしていても Wine が LANG=ja_JP.UTF-8 以外(例えば LANG=en_US.UTF-8)で実行されると正しくデータが登録されません。

実際の Windows 10 のレジストリエディタを確認しましたが、REGEDIT4Windows Registry Editor Version 5.00 に変わり、文字コードも UTF-16LE のようでした。この方法が Wine の方で使えるかはいまのところ確認していません。

system.reg や user.reg を直接編集したい人

system.reg や user.reg(以下、user.reg としてまとめて説明します)はアスキーテキストになっているので文字列型値(REG_SZ)に直接日本語を書くことができません。例えばレジストリエディタで HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements というキーに文字列値として名前が「MS UI Gothic」でデータが「ヒラギノ丸ゴ ProN W4」という設定をしたとします。

f:id:mattintosh4:20190527211837p:plain
Wine - Registry Editor

この場合、user.reg には下記のように登録されます。

user.reg

[Software\\Wine\\Fonts\\Replacements]
"MS UI Gothic"="\x30d2\x30e9\x30ae\x30ce\x4e38\x30b4 ProN W4"

Wine のフォント設定を紹介しているサイトでは「この文字をコピーして貼り付けてください」と説明しているのを見かけますがこれだとアレンジが効かないんですよね。そもそもエスケープされた文字の元がなんだったのかもわからないので不安です。ここではちゃんと自分で日本語から設定を作成して user.reg の形式に合うように変換する方法を紹介します。

まず、テキストエディタで設定を作ります。user.reg の書式は下記のようになっています。ダブルクォートなどの規則をしっかり守りましょう。

"名前"="データ"

私がよく使う HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements に設定するスタンダードな設定は下記の通りです。

レジストリ.reg

"MS UI Gothic"="ヒラギノ丸ゴ ProN W4"
"MS ゴシック"="ヒラギノ丸ゴ ProN W4"
"MS Pゴシック"="ヒラギノ丸ゴ ProN W4"
"MS 明朝"="ヒラギノ明朝 ProN W3"
"MS P明朝"="ヒラギノ明朝 ProN W3"

これを iconv に通しますが、--unicode-subst オプションを使って \xhhhh で出力されるようにします。

Terminal

/usr/bin/iconv -f UTF-8 --unicode-subst="\x%04x" -t ISO-8859-1 レジストリ.reg

Result

"MS UI Gothic"="\x30d2\x30e9\x30ae\x30ce\x4e38\x30b4 ProN W4"
"\xff2d\xff33 \x30b4\x30b7\x30c3\x30af"="\x30d2\x30e9\x30ae\x30ce\x4e38\x30b4 ProN W4"
"\xff2d\xff33 \xff30\x30b4\x30b7\x30c3\x30af"="\x30d2\x30e9\x30ae\x30ce\x4e38\x30b4 ProN W4"
"\xff2d\xff33 \x660e\x671d"="\x30d2\x30e9\x30ae\x30ce\x660e\x671d ProN W3"
"\xff2d\xff33 \xff30\x660e\x671d"="\x30d2\x30e9\x30ae\x30ce\x660e\x671d ProN W3"

あとはコピーして貼ればいいんじゃないかな。

(余談)Linux の場合

Linuxiconv には macOS のような --unicode-subst オプションは無いが、uconv--to-callback escape-c を使えば \uhhhh 形式で出てくるのでこれを sed で変換する。

Terminal

uconv -f UTF-8 --to-callback escape-c -t ISO-8859-1 <<! | sed 's/\u/\x/g'
"MS UI Gothic"="VL Pゴシック"
"MS ゴシック"="VL ゴシック"
"MS Pゴシック"="VL Pゴシック"
!

16進数部は大文字でも小文字でも user.reg は気にしなくてよい。

"MS UI Gothic"="VL P\x30B4\x30B7\x30C3\x30AF"
"\xFF2D\xFF33 \x30B4\x30B7\x30C3\x30AF"="VL \x30B4\x30B7\x30C3\x30AF"
"\xFF2D\xFF33 \xFF30\x30B4\x30B7\x30C3\x30AF"="VL P\x30B4\x30B7\x30C3\x30AF"

rundll32.exe に INF を渡して登録する

面倒過ぎるのであまりおすすめしません。下記のファイルに説明が書いてあります。

https://github.com/mattintosh4/osx-wine-inf/blob/master/osx-wine.inf

FontSmoothingType の違い

macOS で Xcode の要らない SDK を消して空き領域を増やす

Xcode 使ってますか?最近は Command Line Tools なんてものがあるので Xcode.app をわざわざ入れる必要がなくなりましたよね(最近って言うほど最近ではない)。私は人様に配布するものを作っているので Xcode.app のお世話になっています。

この Xcode.app ですが、インストールすると約 5 GB くらいになります。32-bit のコンパイルもするので xcode-selectXcode 9.x 系と Xcode 10.x 系を切り替えて使うんですが、両方合わせると 10 GB を超えます。

Xcode.app には様々なプラットフォームに応じたツールが入っています。以下は 9.2 の場合です。

  • AppleTVOS.platform
  • AppleTVSimulator.platform
  • MacOSX.platform
  • WatchOS.platform
  • WatchSimulator.platform
  • iPhoneOS.platform
  • iPhoneSimulator.platform

この中で私が使うのは MacOSX だけです。なので要らないプラットフォームは毎回削除してます。(xip コマンドに exclude 的なオプションがありそうな気もするがマニュアルには解凍の -x オプションすら載っていない)

まずは MacOSX.platform 以外のプラットフォームディレクトリを探します。

Terminal

find /Applications/Xcode.app -type d -name "*.platform" \! -name "MacOSX.platform"

出てくるのものは下記の通りですが、私は AppleTV も iPhone も AppleWatch も開発しませんので消します。

Result

/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform
/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform
/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/Developer/Platforms/AppleTVSimulator.platform
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/Developer/Platforms/iPhoneSimulator.platform

削除前の容量を確認しておくと Xcode 9.2 で 5.7 GB でした。

Terminal

$ du -sh /Applications/Xcode.app
5.7G    /Applications/Xcode.app

削除は find コマンドの結果を xargs コマンドに渡して rm コマンドで削除するだけです。

Terminal

find /Applications/Xcode.app -type d -name "*.platform" \! -name "MacOSX.platform" | sudo xargs rm -rf

削除前は 5.7 GB でしたが 1.4 GB まで減りました。かなりの減量ですね。

Terminal

$ du -sh /Applications/Xcode.app
1.4G    /Applications/Xcode.app

xcodebuild コマンドで SDK を確認すると macOSSDK だけになりますが問題なく使えます。

Terminal

$ xcodebuild -showsdks
macOS SDKs:
        macOS 10.13                     -sdk macosx10.13

「メインでは Xcode 10.x 系を使っているんだけどたまに Xcode 9.x 系使いたいんだよなぁ…」という時に 9.x 系の不要な SDK を削除しておくと容量を無駄に喰わなくて済みます。

Manjaro Linux を使い始める

先日、研修講師をやってたときに使ったノート PC を初期化することにした。今日の DistroWatch のランキングでは MX Linux が 1 位だったけどちょっとデザインがイマイチかな。というかもう KDE になれすぎて GNOME 系は物足りない。Kubuntu にも少し飽きてきたのでまた Arch を使うことにして Manjaro をチョイス。メモリ消費量は Firefox を起動して 1 GB 前後。Yakuake が標準で入ってて助かる。

f:id:mattintosh4:20190523232728p:plain
Manjaro Linux

日本語入力設定

私の基本的なロケールen_US.UTF-8 で、文字入力だけ日本語です。

以下のパッケージをインストールしておきます。KDE だが GTK 系も入れておかないと FirefoxGoogle ChromeChromium といったアプリケーションで日本語が入力できない。

  • fcitx
  • fcitx-gtk2
  • fcitx-gtk3
  • fcitx-mozc
  • fcitx-qt5
  • kcm-fcitx
sudo pacman -S fcitx fcitx-mozc fcitx-gtk2 fcitx-gtk3 fcitx-qt5 kcm-fcitx

インプットメソッドの設定で Mozc を追加しておく。左欄に英語しか出てこない場合や Mozc が出てこない場合は下にあるチェックボタンを外すと出てくるはず。

f:id:mattintosh4:20190523234018p:plain
Input Method

~/.xprofile に下記のように書いておく。デスクトップ環境にログインしたときに自動的に読み込まれる。この設定がないと fcitx はウィンドウを補足できない。/etc/environment に記述しておく方法もあるがこちらの方がユーザごとに任意に設定ができる。

export XMODIFIERS=@im=fcitx
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx

一旦ログアウトするか再起動して Kate などの KDE アプリケーション、Firefox などの GTK アプリケーションで日本語が入力できれば OK。ウィンドウを切り替えたときに画面端のキーボードアイコンが Mozc のアイコンに変わらない場合は ~/.xprofile のスペルミスなどが考えられる。fcitx-diagnose環境変数が正しく設定されているか確認するとよい。


fcitx の設定なんてしょっちゅうやるものではないので軽くネットを徘徊したときに見つけたけど下の二つは設定方法が間違ってますね。(片方は Manjaro 公式 Wiki っぽいのでちゃんとして欲しいというか本家の Arch Wiki があんなに丁寧に書いてるのになぜここで間違ったことを書くのか…)


さてメモリ 4 GB しかないけど何しようかな…(´・ω・`)