年も終わるので2019年を振り返る
今入っている会社が正式に立ち上がった記念すべき年なので,今年何やってきたを振り返ってみる.
社内でやっていることが何もかもクリティカルな話なのでなんもアウトプットできなくて悲しいという.
今まで一生やらんだろというものをあれもこれもやる羽目になって学部レベルの教養というのは大事だなという気持ちになった一年であった.
微分幾何
弊社はHaskellで数値計算のソルバを作っている.数値計算に関して完全に素人だったが,気がついたらこのソルバのコアの部分の開発を担当になっていたため急遽,微分幾何と数値計算の勉強をすることに.というのもこのソルバが微分幾何に密接に関わっている(正確に言うと離散微分幾何)からである.幾何に全く興味がなかったため,微分幾何に関してはほとんどなんも知らない(多様体の基礎レベル)という状況であったので,微分形式の幾何学(森田)や計量微分幾何学(松本),幾何学シリーズ(坪井)などで勉強してなんとなーくわかる程度の知識をつけた.物理的な応用の部分は主に幾何学とトポロジー(中原)で勉強した.その後は離散微分幾何周りの論文をひたすら読んで,ソルバの理解に励む毎日であった.論文にない部分は当然自分で考えて形式化しないといけないので大変だったが,やりがいがあり非常に楽しかった.ソルバの実装を通して微分幾何の理解も深まるという現象があり,実践(?)は大事.シンプレクティック幾何周りもやるかと思って古典力学の数学的方法(アーノルド)も買ったが,現状使ってないのでちょっと読んで積読になっている.経験として,論文読むときにわからんときは大体微分幾何の部分が難しいということがわかっており,微分幾何なんもわからんという気持ちが強くなっていっている.
一通り理解した後で幾何学から物理学へ(谷村)が出たときにはこれが速く欲しかったと泣いてしまった.
数値計算
弊社のソルバは特殊すぎて一般の数値計算の手法で参考になる部分は限らているのだが,やはり数値計算の知識ゼロではなかなか厳しいのでこちらも一から勉強した.数値計算の常識(伊理・藤野)程度の知識はあったので,こちらは遅延学習という感じで,わからないことがあったら数値流体力学(H. K. Versteeg & W. Masalasekera)やはじめてのCFD(棚橋),流体力学の数値計算法(藤井)を参照するという形にしていたが,結局読むことに.インターネットで拾える数値計算のPDF -> はじめてのCFD -> 流体力学の数値計算法 -> 数値流体力学の流れで読むと理解が進んで良かった.最近発見したが,The Finite Volume Method in Computational Fluid Dynamics (Darwish & Moukalled) がすごく丁寧に書いてあり,OpenFOAMの話もバリバリのってるので,初心者にとてもよさそうであった.有限要素法に関しては,計算力学(竹内・樫山・寺田)で勉強して鈍器として非線形有限要素法を持ってるくらいである.
やはりこういったソルバを作るのが初めてな上,特殊であるゆえに,境界条件で1ヶ月溶かし,非構造の扱いの難しさに泣き,移流スキームを落とし込むのに死んだ.乱流周りに関してはなんとなくでLESをやっているだけだし,衝撃波捕獲スキームとかで衝撃波みたりしたいので,ここらへんもちゃんと勉強していきたいところである.目下趣味として非構造のFVMソルバを作りつつ,Riemann Solvers and Numerical Methods for Fluid Dynamics (Toro)を読んでいる.
数値計算周りのとても良いところは,数学と違って工学の趣が強いので,本をパラ見してもなんとなく言ってることがわかるという点で,仕事しながら勉強するをしている身としてはかなり助かる部分であった.多分来年あたりには乱流と衝撃波で苦しんでいると思うので有識者の人々はぜひ教えてください.
Haskell
Haskellのプロが入ってきてくれたので,コードがどんどんHaskellっぽくなっていき,大変勉強になった.数値計算屋としてはHaskellとはいえある程度以上速くないといけないので,Haskellの高速化周りを勉強しようとし,Haskell High Performance Programmingを読んだり,GHCの最適化周りの論文を読み漁ったり,STGの論文やドキュメント読んだり,System FCの論文を読んだりしていた.最終的にはCore dumpを読めんとなーっとなったが,なんとなくは読めるものの確証に至らないprefixなどが多く,GHCのコードを読むしかないなとなっていたが,他の勉強や仕事で手がつかずあまり読めていない.結局多分こういう書き方ならこの最適化が走るはずだがプロファイルとるかに落ち着いてしまった.
型レベルプログラミングは,話題に上がるような手法はすべて使われているのではという疑いがあるほどアグレッシブに行われているので,かなり知識がついた.やはり業務でやると勉強効率が段違いだな感じる.
プライベートではhsjoihs氏とともにGHC Documentの和訳かれこれ一年がぐらいしているのだが,僕が時間がとれないようになってしまったのでなかなか進んでいない.論文とは違って若干砕けだ英語だったりするので,英語の得意な彼との翻訳作業はかなり勉強になった.ドキュメントの内容自体も,和訳するほど読み込むとこんな仕様あったんかなどがあるので,人々にもおすすめしたいところである.後少しで一番ヘビーな拡張の部分の和訳が終わるので,来年は時間取りたいなぁと思うものの,仕事の状況如何なので厳しい気持ちである.翻訳当時は8.6.3が最新であったが,悲しいことに8.8.1がでてしまった.
業務Haskellで辛いところも思う存分味わった.Haskellはエコシステムが貧弱で,GHCiデバッガは型レベル自然数とかを使うとまともに動かないわ,人々が推すhaskell ide engineは大規模プロジェクトだと全然まともに動かないわと散々なめに合う.hieに関しては最近改善されてなんとなく動くようになっているので感動したが,ビルドにクソ時間がかかるのとストレージ圧迫するのが辛いところ.デバッガに関しては割と致命的で,ビルドに1時間かかるのにprintfデバッグを強いられるとしょうもないデバッグで一日取られるとかザラである.そんなんだから実用的じゃないとか言われるんだぞ.
型レベルプログラミングバリバリ,Overlappling Instancesバリバリの実装をすると,一見うまく行くのだが,Instanceの解決がどうなるか判断するのにインポートしているモジュールすべての情報を把握している必要があり,気軽にInstance追加したらよくわからん型エラーが出たり,インスタンス解決が想定通りに行かなかったりと辛い.Overlapping Instancesはアンチパターンかもしれない(要出典)というのが最近の認識である. また,あるデータ型AがBを包含している際に型クラスのインスタンスを流用したいみたいなのが現状THでも使わない限りできないのでとてもつらい.Row Polymorphismのproposalがあるので,それに期待したいところである.
Rust
某氏から実践Rust入門いただき,入門することに.実践Rust入門の構成が神がかっており,初学者が飽きないような章構成になっており感動した.Rustの進化が速すぎて多少古くなってしまっているが,おすすめできる本である.
これでRustに入門しつつ,趣味でメッシャーを作っている.というのも,Gmshというとても便利なメッシャーがあるのだが,とても便利なのだが,控えめに行っても地獄みたいなコードをしている上,シングルスレッドでメモリバカ食いという特性を持っているためなんとかしたいという気持ちが出てきたため,地道に作成ししている.それにともなって,世の中の自動メッシュ技術の論文をいろいろ読んだりしている.ここらへんはいろいろな会社の飯の種であったりするので,あんま良さげな論文がないので,Gmshのコードを読みながらそれの元論文を探すという地道な作業でインプットを重ね,Rustで試すみたいなことをしている.自動メッシュ有識者の方々がいればぜひご教授いただきたい.
ゲーム
SEKIROがもうこれ以上のアクションゲームは出ないなというレベルの神ゲーだった.
その他
趣味で集合論を始めてみたはいいものの,なかなか時間が取れず,Kunenが3章読み終わったところで終わっていたりと,数学に関しては連続して時間がとれないので進捗が芳しくない(微分幾何に時間が吸われたとも言う).同僚に音楽オタクがおり,バッハの沼にはめられ,対位法の本とかも息抜きにたまに読み,フルートを始めた.フルートは最大の壁,息が続かないが現れ,運動をなにかはじめるかという気持ちになっている.
アプデで毎回何かがぶっ壊れるのでArch linuxからNixOSに環境を変えた.非常に面白いOSで,普段は普通のlinuxであるが,何もかもをnix言語で設定できるというのが面白い.nixopsを使った数値計算のクラスタ環境づくりを趣味でやっている.OpenFOAMがやっとビルドできるようになったので近々共有したい.
辛かったこと
仕事は裁量の塊みたいな感じで,営業の状況を聞いてどの機能がいつまでに必要だからこうするみたいなのは全部自分で決める感じになっている.担当領域に関しては自分以上に詳しい人間がいないので,結構なプレッシャーでやりがいもあるが大変というのがある.一番つらいのは,どんなに頑張っても自分は天才にならないし,時間は伸びないということ.ひたすらに勉強して発想や参考にできるできごとのストックをひたすらためていくしかないという気持ちになっている.
来年やりたいこと
GHC Core解説
Nixで数値計算のDevOps環境を作る
乱流,衝撃波の勉強
微分幾何のさらなるトピックの勉強
メッシャーを完成させる
SGL完読
Kunen完読
余談
弊社は世の中に存在しない,数値計算HPCクラスタのベストプラクティスをぶちたててやるぜというアツい気持ちを持ったインフラのプロを募集してます.助けてくれる方は@Lugendreまで