2018年にしたこと

ブログ記事を書こうとして、年が変わって一発目だったことに気づき、総括的なことをするべきかどうか考えている。3月の年度末に今年度でやればいいのでは(引き伸ばし癖)という気持ちが芽生えているからだ。

実は、10月くらいに一度総括をしようとしていて、微妙に書いた記事が下書きに残っている。何でそんな時期にしようと思ったのかというと、GitHubの緑化活動が完了したからだ。今更言うまでもなく、GitHubのユーザーページにはカレンダー的なものがあり、活動すればするほどその日の色が濃くなる。その色が緑なため、草と俗に言われている。今となっては随分前の話だが、1ヶ月程度コミットし続けたことがあり、その時「このまま1年いけるのでは?」と思ってしまったのが始まりだ。

f:id:tniina:20190107151519p:plain 図1. 10月末での状態。ハロウィンなので黄色になっているが、普段は緑だ。

1年走り切った時の記事が下書きに死蔵されている。出さないのももったいないが、長過ぎるので削らねばなるまい。まあせっかくなのでざっと思い出してみよう。

1月

未完成のGUIライブラリ(非公開)を作り始めている。いきなり放置しているレポジトリのことを思い出してしまい罪悪感が募る。

もうひとつ、収束加速法のレポジトリを作っている。外挿によって数列の極限を高速に計算するアルゴリズムだ。だが一番簡単なやつしか実装していない。よく使われているものが地味に複雑だったからだ。

GitHub - ToruNiina/kasok: converge faster.

2月

2月は主にSATySFiを触っていた。ギリシャ文字が使いたくてPullReqを送っている。またvimで自分用のシンタックスハイライトを手探りで作ったが、少し後に慣れた人がより強いものを作ってきたのであっさり乗り換えてしまった。

3月

3月はアライメント指定operator newの解説をcpprefjpに送り、マージされてcpprefjpのWorking Teamに入っている。

解説が以下の記事にある。

C++17: 動的メモリ確保とアライメント - in neuro

他に、自作ライブラリにPybind11を使ってPythonバインディングを足したりしているようだ。Pybind11はとても使いやすい。

GitHub - ToruNiina/libasd: C++11/Python3 library to read/write High Speed AFM data file

4月

4月は、2回もTOMLパーサを書いた経験をフルにつぎ込んでBoost.tomlを作り始めたようだ。TOML v0.5.0準拠でパースもシリアライズもできてC++98ですら動くTOMLライブラリは、現時点でも唯一だ。そもそもTOML0.5.0に対応しているのがこの他には拙作のtoml11と、恐らく最古参のcpptomlしかない。

GitHub - ToruNiina/Boost.toml: header-only C++(98|11|14|17) TOML v0.5.0 parser/encoder depending on Boost

5月

この月は新しいレポジトリは作っていない。主にバグフィックスや新機能に時間を割いていたようだ。

6月

6月は、非常に単純なファイル形式の画像を読み書きするライブラリを作っている。

GitHub - ToruNiina/pnm: pbm, pgm, ppm image IO for modern C++ (single header only library)

フォーマットの説明が以下の記事にある。

一番簡単な画像フォーマット - in neuro

他に、レイトレーシングのプログラムを作ろうとして放棄してしまっている(非公開)。思うにこれは、あまりよく知らないレイトレーシングという手法について最初っから綺麗な設計にしようとしたことによる失敗だと思う。想定できていなかったことがある度に設計から全部ひっくり返すことになるので、労力がかさむのだ。

多分最善手は、不格好でもいいから一度動くまで書き上げて、いくつか違うアルゴリズムを書いて、共通部分とそうでない部分を見極めてから、もう一回初めから(設計を変えて)書くことだろう。知らないものの設計は綺麗には出来ない。綺麗な設計になるかどうかは、一度動くものができてから書き直す余力があるかどうかに尽きる。

7月

この月は、SIMDを酷使する低次元ベクトル・行列ライブラリを作っている。一般のSIMDでなくベクトルと行列だけに絞ることで労力を減らし、低次元に限ることでさらに減らした。それでも作業量がすごかった。

GitHub - ToruNiina/mave: SIMD-oriented matrix and vector library for small dimension

目的は、SIMDの練習もそうなのだが、高レベルなAPIだけでSIMDレーンを使い切りたいという欲望があった。つまり、floatなら8要素同士で足し算ができるのに、3次元ベクトル同士の和では半分も使えないのはもったいない、3次元ベクトルの足し算を2回やるなら、それを一度に行えるようにしたい、というアイデアを実現している。だがそのための労力がヤバい。

実装の話はこの記事にある。

maveの中身について - in neuro

8月

この月も基本機能拡張とメンテで過ぎていった。schemeの勉強をほんの少し再開したが、あまり進んでいない。

9月

9月は外部向けの活動が多かった。まず、GitHubでのTOMLのシンタックスハイライトがv0.5.0に追従していなかったので、PullReqを送った(マージされた)。 その辺りの話はこの記事にある。

GitHubのシンタックスハイライトを直した話 - in neuro

他に、Boost.testにコンパイラが警告を出すのを修正してほしいというIssueを出した。文字コードとしてASCIIを仮定して構わないならこうやって直せる、という提案もしている。こちらは「次のリリースで直すよ」という返信を貰った。

10月

機能拡張とメンテ。

11月

この辺りから、masterのHEADを壊れた状態にしておきたくないという理由で、自分が所有しているレポジトリでも積極的にfeature branchから未来の自分にPullReqを送るようになった。また、多分振り返り記事の影響でGUIライブラリに大きく手を入れている。ライブラリと言える状態にまだなっていない(機能がなさすぎる)が……。

12月

12月には、1週間強かけてtoml11のメジャーアップデートをした。エラーメッセージが超格好良くなり、TOML v0.5.0に対応した。

GitHub - ToruNiina/toml11: TOML for Modern C++

具体的にどうなったかは以下の記事に書いてある。

最強のC++実装TOMLパーサーが完成した - in neuro

他に、Rustの練習として、書捨てのスクリプトではなくジェネリクスを使ったライブラリを作ろうとしている。非常に簡単な関数しかまだない。

RustとC++のジェネリクスの性格の差 - in neuro

所感

草を継続的に生やし始めたころは、割といけるだろうと思っていた。というのも、新しいレポジトリを作って何かを書き散らしておけば草は生えるからだ。書く題材とモチベーションさえあれば1日1コミットはそう難しいわけではない。バグフィックスとか、簡単な関数を1つ追加するくらいの粒度でコミットしてもよいのだから。

だが、最近徐々に草を生やすのが難しくなってきたように感じる。例えば、作ったライブラリに少しでもユーザーがつくと、その更新作業は難しくなる。流石にmasterブランチにポンポンコミットできないので、feature branchを作ってしっかりテストをしたい。すると、その間草が生えない! masterへマージするまでcontributionにカウントされないのだ(マージ後遡ってカウントされる)。マージする気で作っても、上手く行かなくて破棄したら草が生えず、荒れ地が残ってしまう。

今のところは開発段階のレポジトリがそれなりの数あるので草を保てているが、それらが全て同様に重くなってくると、継続が難しくなるだろう。そうなると、もっとユーザーが多いプロジェクトをもっと多く抱えてそれでも草を生やし続けている人々は本当にすごいな、という気持ちが湧いてくる。これからも可能な限り継続していきたいが、はてさて。