カラー絵文字パッチ制作の経緯

カラー絵文字パッチを制作した時間的経緯をざっくり記録のため書き出しておきます。

2017/11/26 19:30 頃に vim/vim へ pull request を出したカラー絵文字パッチが、 わずか3時間半のうちにマージされました。 制作に関わったのは mattn さん、k-takata さんそして私の3人で、 超優良な品質のパッチという自負はありましたが、 それでもこの短時間でのマージはまったく予想しておらず、 望外のことに喜びと達成感もひとしおです。

ではその余韻の残るうちに、 この色付き絵文字対応パッチ制作の時間的経緯を ログを掘り返して書き記しておきましょう。 本来は Vim アドベントカレンダーのほうにも使えるネタなんですが、 まぁそちらには別のやつを考えましょうってことで。

あ、メッチャ長いんで要注意。

前日譚

まず以前から mattn さんは色付き絵文字を出したいと表明していました。 先日行われた VimConf 2017 でも言っていましたね。 そして VimConf 2017 開催が明けて7日に Direct2D でカラー絵文字を表示するサンプル を紹介してくれました。

そこから片手間での研究が始まります。 Win10で動くのか。 古めのVCやMinGWでコンパイルできるのか。 Vim との描画方式の違いをどうやって吸収するのか。 自分がベースを書いたとは言え、DirectX対応のコードとかすっかり忘れてましたね。 そのときに mattn さんとやりとりしてたダイレクトメッセージで 私がこぼした愚痴がこちら。

やべぇ。なんでこんなツライんだ
最近golangで甘やかされてる身には、COMはつらい。

2017/11/21

そして事態が動き始めたのは 11/21 の 00:18。 僕が唐突に vim-jp の slack に #color-emoji という公開チャンネルを作りました。 とりあえず invite したのは mattn さんと k-takata さんだけ。 ちなみに k-takata さんはナンノコッチャ分からない状態だったと思う。 で、大まかな方針と作業手順と各種資料を確認。 ふるさと納税でカニを注文する mattn さん。

01:32 には私が 絵文字の表示を確認するためのスクリプト を作りました。 がこのあと迷走。 ヘッダーが見つからないとかVS2017が必要とか幾つか勘違いも錯綜しだす。 夜中だからね、しょうがないね。

寝て同日の11時頃。 冴えた頭で方針の再検討。 DirectX で文字を描くにはお手軽な方法と、 Vimで使ってるちょっと高度だけど大変な方法の2つがあって、 とりあえず前者でカラー絵文字を出すことを優先することに。

昼は仕事しているので実作業は夕方以降。

2017/11/22

日付は変わって22日の 00:27 の私の発言がこちら。

[00:27] ダメだ…なんもうまくいかねぇw
[00:33] これは根本的なところをまちがえているくさい

そして僕は 最初のサンプル に立ち返って実験を重ねることに。 あ、その時にわかった技術的なネタはまた別の機会に。

一方で mattn さんは 01:10 くらいに

完全にバグってるんだけど

ということで絵文字が出せないことはないというを示すスクショが。 しかしこの時点ではまだまだ先が見通せないまま、 問題点の洗い出しと解決法の議論が続く。 いや実はこれは後の最後の一歩になるんですけどね。

そして僕は大きな間違いに気がついた。 詳細を説明はしませんが、一言で言えば「Vimは標準的なWin32アプリではない」。 そこに気がつけば話は簡単。 02:14 には Vim でカラー絵文字を表示した最初のサンプルが。 そそくさと手元のコードを koron/vim に突っ込んで差分を共有。 その時の差分がコチラ。 で、作業はこのまま僕のレポジトリで最後まで進行してしまった。

明けて 9時頃から残課題を共有。 その後、仕事を終えて 21 時あたりから活動再開。 とりあえず Vim が使ってる GDI API を列挙してみたりした。 僕は描画速度を気にしだしていた。 ただでさえ DirectX の描画が遅いのに、 絵文字を出すことでさらに遅くなっていたのだから目も当てられない。 22時くらいには高速化の方法論が確立してた。 そして運命の23時

[23:06] やった
[23:06] 爆速になった。

まだまだバグってるけどメッチャ速くなったのがこの コミット

2017/11/23

明けて 23日 の 00:43。 このあたりから頼りになる k-takata さんが本格始動。

同日 12 時くらいから、 github に project を作って issue を登録していく。 この時点ではバグはありながらも爆速でカラー絵文字が表示できている状態。 そして koron/vim に mattn, k-takata さんをコラボレーター登録。 めんどいんで二人の成果を自分のブランチに ダイレクト push してもらおうという算段。 coflict しても綺麗に解消してくれると信じられるからこそのあらわざ。

12:40 の会話

Ken Takata [12:40] ただ、どちらかというと、カラー絵文字よりも高速化の方が有用な気もしなくもないw

KoRoN [12:40] そう。この高速化は、僕にとってはライフチェンジングですわ。
なんだかんだ、DirectXを常用してない最大の理由だったので。
ただ、どうせなら両立させたいですよねぇw

16:48 の会話

KoRoN [16:48] case文にbreak書き忘れてるwww

Ken Takata [16:48] Golang病

18時の時点で高速化に伴うバグはほぼ取れてて、 あとは mattn さんによる最初の方法でのカラー絵文字対応を残すのみ。

21:49 にほぼ完成して push してもらう時の会話

mattn [21:49] permission denied

KoRoN [21:49] うえ?

mattn [21:49] あー、inviteを受けてなかったw

KoRoN [21:49] w
[21:49] よくできてんな github

22時あたりからは機能的な完成に伴い完全に浮かれてる。 僕はコードの整理・リファクタリングにかかり、 mattn さん k-takata さんは細かな動作チェックや、 コンパイラ対応などのリリースエンジニアリングが始まる。 が、ここから二日半かかったわけなので、リリースエンジニアリング超重要。

2017/11/24

僕が出した超ケアレスミスなバグを直したりしつつ リリースエンジニアリングが進行していく。 僕の近々の課題は VC10 でコンパイルすることだった。 詳細は別の機会があれば。

1:30 くらいには VS2015 でコンパイルできていた。 VS2015 は appveyor でも使っているコンパイラ。 この時僕は就寝中。

明けて 9時台の発言より

KoRoN [09:21] そう。僕も、昨日ヘッダーみるまでは IDWriteFactory = IDWriteFactory1 → IDWriteFactory2 だと思ってたw

MSのバージョンニングにはいつも惑わされるw

そしてこのあたりからカリカリのチューニングに。 GDI と DirectX の描画を両立させつつ理論上の最高速度を追い求めることに。 あとはフォントとオプションの組み合わせでいくつか問題が…

Ken Takata [14:42] 常用のgvimをこれに差し替えた。

まだ開発中なのにw

僕は仕事と銭湯とうたた寝から 23:34 に復帰。

2017/11/25

バグ取り、チューニングとメンテしやすいコードの両立の模索が続く。 なんだかんだで 5時くらいまでやっていたらしい。

12時くらいから復帰。 ビットマップフォントのフォールバック方法を模索。 一度大幅な変更を試みたがあまりよくなく、後に別の方法を採用。 結果的に元のコードよりも責任分解点が明確になり、整理されて良かった。

Ken Takata [16:15] gui_dwrite.cpp の中に書いてあるこのURL http://msdn.microsoft.com/en-us/library/windows/desktop/dd941783(v=vs.85).aspx リンク切れでつらい。

KoRoN [16:15] なんでMSのサイトはURLかわるんですかね

ほんと MS さん、なんとかしてください。 ただこれはサンプルコードへのリンクなんだけど、 後に Github に移ってる ことが判明。 やるやん Microsoft !

mattn [21:54] 現在のステータスってどんなのでしょう?

KoRoN [21:55] えっと、フォントによってDWriteが表示ができない件を、gui_w32.cからgui_dwrite.cpp の責任に変更して、gui_w32.c の見た目をすっきりさせているところです。

22時位からフォントのキャッシュに着手。 23:43 くらいに、理論上キャッシュの効果が最も出るテストケースで、 わずかながらもしかし人間でも観測可能な効果を確認。 ここらへんがチューニングの損益分岐点であると判断。

2017/11/26

ここから最終段階に。 デバッグ用のコードの削除、細かい表記の微調整、 ドキュメントと詰めていく。

KoRoN [01:03] とりあえず僕の方からはもうないので、なにかあったら入れちゃってください。明日のどこかでPRだします~

すでにやりきった感。

9時くらいから、ドキュメントのレビューとか。 Vim の :set spell と k-takata さんの慎重な reading が冴え渡る。 マジ助かりました。

11:29 appveyor でのビルド成功を確認。

12 時以降は k-takata さんによる最後の微調整が続く。

18 時から僕は PR のためのエモい英作文。 なんかちゃんと書くの久しぶりな気がする。

19:11 ついに PR 作成 。やりきった。やりきったよ。

mattn [19:11] インパクトデカイしすぐマージされそうな気がする。

22:39 マージ された。

KoRoN [22:39] はやいw

Ken Takata [22:42] 早くても数週間は掛かると思ってたんだがwww

mattn [22:43] すごいww

おわりに

ということで、以上がカラー絵文字パッチ制作の顛末でした。

KoRoN [22:53] じゃ、僕お風呂入ってくるから。出たら読みたいから、それまでに記事書いといて(無慈悲

mattn [22:54] すごいwww

mattn [23:10] 明日書きます。今日は初校の修正を…

とりあえず僕はブログ記事書いたんで、あとは mattn さん書いてください。