詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

『圏論の歩き方』が難しかったので『Basic Category Theory for Computer Scientists』を読んだ

先日ウィッシュリストから『圏論の歩き方』を贈ってもらいました。圏論を使っているさまざまな分野の若手研究者がオムニバス形式でその紹介をするというもので装丁も可愛らしくとっつきやすそうな感じ(という甘い考えはすぐに砕かれますが)。

圏論の歩き方

圏論の歩き方

圏論の歩き方

この本は「まえがき」がよくて、

この本は[……]

  • 情報処理能力をはるかに超えた量の情報の洪水と,
  • トライ・アンド・エラーの機会

という,[圏論という数学の]コトバを習得するうえで有益だと思われる二つのことに力点を置いた「圏論の入門書」,ということになります。

[……]

まず,決して最初から一つ一つ完全に理解していこうとしないでください.[……]むしろ,わからないこと・わかることの間から,ご自分なりの「圏論観」を作っていただきたいのです.なので,最初はともかく,この本の最後まで流し読んでみてください

(強調は原文ママ)

とある。つまり圏論が応用されている現場を(すぐには理解できなくとも)目の当たりにすることで圏論という道具の気持ちを理解するための一助としましょう、というもの。この志には読む側も勇気づけられますね。

オムニバス形式ではあるものの章を追うごとに圏論の新しい知識がつけ加えられるようになっており、その点に関して不親切さはない。自分にとって興味深い計算機科学は最初のほうに出てくるが、他にも物理とか論理学とか、生物まででてきてそれぞれのトピックもよく分からないながらも面白そうで次々ページをめくりたくなってしまう。各章の終わりに座談会形式で補遺があるのもよく、この会話も圏論の気持ちというものの理解につながりそうな感覚がある。

最後には「圏論のつまづき方」という章もあって親切で、教科書的な本によっては難しい、カジュアルな方法による理解をうながしていて、ははあなるほどと思うことも多い。

とはいえ読んでみた感想は先ほどの志にもかかわらずやっぱり難しくて、圏論も各々の分野もよく分かっているとはいえない自分としてはどちらの側からもアタックしづらいという気分になった。せっかく面白そうなのにその面白さを十分に味わえてない悲しさがある。

Basic Category Theory for Computer Scientists

そこに折りよく、10年ほど前に買ったこの本を部屋の段ボール箱から発見して、真面目に読み直してみることにした。

Basic Category Theory for Computer Scientists (Foundations of Computing)

Basic Category Theory for Computer Scientists (Foundations of Computing)

型システム入門』の著者によるもので、ペーパーバックで150ページほどと薄くて取りかかるには気楽。今だとKindle 版も出ているらしい。

この本ではコンピューターサイエンスを学ぶ学部生向けに、圏論の基礎的な知識をイチから解説している。4章から構成されていて、1章と2章では圏そのものからはじまって、product、limit、cartesian closed category、functor、natural transformation、adjoint といった圏論における基礎的な道具の定義と具体的な圏における実例をみることができる。以降の3章では単純型つきラムダ計算だとか領域論だといった計算機科学の分野において圏論が用いられている例が簡単に紹介され、4章は参考文献のリストになっていて、ほんとうに簡素な入門書という感じ。

この本によると universal element、adjoint、representation が圏論の重要な登場人物であるらしいがそのうち前者2つまでは本書でよく紹介されていて、最後ひとつはごくわずかに触れられているのみだった。ちなみにプログラマが圏論を知るきっかけになることの多いモナドについての話はぜんぜん出てこない。

個人的には年初の真面目さで練習問題に取り組んだのがよくて、やはり手を動かさないと自分の中でイメージというのは作られないなと実感した。あまりに単純な例なのだろうけど、集合とそれらの間の写像のなす圏 Set と、半順序集合を圏とみなしたもの、を具体的に考えるとイメージがつきやすかった。

今は『Category Theory for Computing Science』という PDF が無料で公開されているらしいので、こちらを読むのがいいのかもしれませんね(と今 Amazon のレビューを見て知った……)。較べてみると本は薄くて高いな。

読んでみて

面倒がらずに手を動かしてみるもので、あらためて『圏論の歩き方』を読みなおしてみると、無意識に飛ばしながら読んでいたところが読めるようになっている。「右随伴が極限を保存する」みたいな言明とその証明のスケッチも読める(気がした)のは嬉しかった。可換図を通じてもろもろの概念の具体的なあらわれを自分で書いてみたことで、具体的な応用での感覚をつかめるようにも思う。

教科書的な本はもちろんきっちりと語るべきことを語り、定義や性質だけでなくその動機を示してくれることも多いのだけど、それでも独りで読んでいると、広大な土地に放り出されてどっちを向いているのかも分からないような感覚に襲われることがある。そんなとき、『歩き方』みたいに、インフォーマルな形でその眺めを示してくれる本があると補完できそうですね(しかし、全部読み返したわけではないけど、分からんままのところも多いと思う)。

sbt で Vim のスワップファイルが watch されるのを抑制する

Scala の話。sbt~compile とかしてるときに Vim で新しいファイルを編集しはじめるとコンパイルが始まってなんだこりゃとなることがある。いまいちまとまった情報がないのでここに記しておく。

こういう場合 watchSources というキーに変更を加えてやるとよい。

グローバルに適用するために、~/.sbt/0.13/global.sbt などのファイルに以下のように記述する:

watchSources ~= {
  _.filterNot {
    f =>
      f.isDirectory ||
        """^\..*\.sw.$""".r.findFirstIn(f.getName).isDefined
  }
}

場合によっては ~/.sbt/0.13.9 以下に配置する必要があるかもしれない。

~=

どういう訳かはわからないけれど 0.13.x 系のドキュメントには ~= の説明がない。0.12.x 系には載っている。

More Kinds of Setting — sbt Documentation

参考

2015年に作ったもの20点(セルフレビューつき)

いちおう振り返っておかないと 2016 年を迎えられないという心持ちになったので、全部ではないけど列挙する。また、作ってブログに書いたけど自分では使ってません、というのも無責任なので、現在自分で利用中かどうかも添える。

go-typeswitch-gen (Go、コマンドラインツール)

Go で reflect パッケージを使わずにジェネリックな関数を実現する - 詩と創作・思索のひろば

ステータス: 便利に使用中

tsgen というコマンドを含んでいる。知られてないと思うけどこれは非常に便利なツールで、tsgen scaffold で空の type switch を展開できる。つまり:

// node は interface go/ast.Node の変数
switch node := node.(type) {
}

の case 文を全てフィルインしてくれる。go/ast ユーザである自分には必需品。使い方に癖があるのでこの機能だけ切り出して別ツールにしたい。

Pocket Expose(Go、ウェブサービス)

Pocket の未読フィードを秘密の URL で公開するウェブサービスを作った - 詩と創作・思索のひろば

ステータス: 使っていない

Pocket の未読を他サービスと連携するために専用のURLでRSSを配信する。現在とくに連携したいものがないので使っていない、はず(知らないうちに使っているかもしれない)。アクセスログを見たところ他の人が使っているような感じもある。

gore(Go、コマンドラインツール)

コード補完もできる Go の REPL「gore」を作った - 詩と創作・思索のひろば

ステータス: 便利に使っている

Go のちょっとしたコードを試したいときに大変よい。とにかく便利。

goquickfix(Go、コマンドラインツール)

Go でコードを書く時のかゆいところに手が届く goquickfix というのを書いた - 詩と創作・思索のひろば

ステータス: 使っている

gore のスピンオフ。たまに使うが日常的にではない。使ってないのはエディタ連携してないからって気がする。goquickfix はソースコードを変更する際、後から戻せるような変更しか行わないのだけど、取り消し不可な変更を導入するオプションがあってもいいかも(使ってない変数を消すとか)。

lgtm.sh(シェルスクリプト)

秒速でLGTMするコマンド - 詩と創作・思索のひろば

ステータス: 便利に使っている

このエントリを書きはじめたときにはまったく意識にのぼってなかったけど、これ一番使っている気がする。lgtm -c -m がシェルのヒストリに大量にある。-c でクリップボードにコピーできるようになりました。OSX 限定。Pull Request お待ちしております。

hub-pr(Go、コマンドラインツール)

オレ流 Pull Request 作業フロー - 詩と創作・思索のひろば

ステータス: ときどき使っている

hub-pr checkout の補完が微妙に遅い気がするのでなんとかなりたいけど zsh の補完はよくわからない。

go-cli(Go、ライブラリ)

go-cli: ドキュメントとともにコマンドラインツールを作る - 詩と創作・思索のひろば

ステータス: あまり使っていない

そもそもサブコマンドがある CLI ツールをあんまり書いてないからってのもある。

google-apps-script.d.ts(TypeScript、型定義ファイル)

Google Apps Script の TypeScript 型定義ファイルを作った - 詩と創作・思索のひろば

ステータス: 使っている

DefinitelyTyped にマージされた。Google Apps Script を書くときはこれがないとやってられない。

Mackerel API でホスト名を補完(いろいろ)

Mackerel + peco + zsh でコマンドラインにホスト名を補完する - 詩と創作・思索のひろば

ステータス: 使っている

仕事でかなり使っている。自分と環境が違う人にとって利用しやすい形になっていないので俺得ってかんじだった。

gobump(Go、コマンドラインツール)

gobump で Go プロジェクトのバージョニングをおこなう - 詩と創作・思索のひろば

ステータス: 使っている

ghq のプルリクエストをマージしたら自動でバージョンが上がってすげー、と思った。仕組みは以下の記事をご覧ください:

Go プロジェクトのバージョニングとリリースを CI で自動化する - 詩と創作・思索のひろば

Goの簡易ベンダリングシェルスクリプト(シェルスクリプト)

シェルスクリプトで Go の簡易ベンダリング - 詩と創作・思索のひろば

ステータス: 使っていない

Godep を使いたくなくて書いただけのやつ。最近 gb を使って気に入ってるので vendoring が公式サポートされるまでは gb でいいかなとか思ってる。

go-sqlf(Go、ライブラリ)

Go のシンプルかつ明快な SQL クエリビルダ go-sqlf - 詩と創作・思索のひろば

ステータス: 使っている

まあ SQL が発行される箇所は明快になっているのがよい。速度があまり出ないのがネックではある。jmoiron/sqlx でも良いかな? って最近は思っているけど試せていない。

go-readrows(Go、ライブラリ)

https://github.com/motemen/go-readrows:embd

motemen/go-readrows · GitHub

ステータス: あまり使っていない

go-sqlf と組み合わせて、SQL で引いてきたカラムを struct にマッピングする。あまり複雑なウェブアプリケーションを書かないので出番はそんなにない。

adsense-report-menubar(Electron)

Electron で AdSense のレポートをメニューバーから確認できるアプリを書いた - 詩と創作・思索のひろば

ステータス: 使っている

ログイン時に起動されるようにしてるので自然と使っている。Dimension と Metric の組み合わせを登録できたら便利そう。

Kak(Electron)

motemen/Kak · GitHub

ステータス: たまに使っている

Electron 製のシンプルなテキストエディタ。アプリ化せずに npm start で使っている……。日本語を書くときに利用してる。このエントリもこれで書いている。単に游ゴシックで日本語が書きたかっただけ。縦書きも対応したいのだけど表示がおかしくなるので止まってる。

gas-slack-log-spreadsheet(Google Apps Script)

Slack のログを自動で Google Spreadsheet に保存する - 詩と創作・思索のひろば

ステータス: 使っている

自動起動されるようになってるので全然触ってはいない。ときどきエラーが起こるようだけどパーマネントなものではないようなので放置している。

goreadme(Go、コマンドラインツール)

motemen/goreadme · GitHub

ステータス: たまに使っている

Go のパッケージから README ファイルを生成するツール。ドキュメントからいい感じに作ってくれるのでドキュメントを書くモチベーションにもなるはず。go-sqlf の README とかこれで生成した気がする。ライブラリじゃなく実行可能ファイル向けの README をどうするかがうまく決められていなくて停滞中。すべてをカバーするのは難しそうにもおもう。

gompatible(Go、コマンドラインツール)

motemen/gompatible · GitHub

ステータス: あまり使っていない

ほんとに使い出がでてくるのはウェブサービス化してからかなと思っている。このあいだの GoCon で発表したので紹介エントリを書きます。

goiferr(Go、コマンドラインツール)

goiferr で Go のエラー処理コードを自動挿入する - 詩と創作・思索のひろば

ステータス: たまに使っている

これも goquickfix と同様エディタ連携してないのがいけないな。ファイル全体を書き換えるのではなく「この行に続くコードを生成」というモードがあるとより良さそう。

humr(node、コマンドラインツール)

任意の入力を human-readable にする humr ってツールを書いた - 詩と創作・思索のひろば

ステータス: たまに使っている

たまにしか使ってないのはログを tail する機会がないだけだから!これはとても便利なはずなので機会が増えたらカスタマイズしつつ使っていきたい。


だんだん面倒になってコメントが雑になってしまった。見栄をはっているだけかもしれないが、予想していたより使い続けているものが多くてまあまあ実りある一年だったようにも思う。他人に使われているものがどれだけあるかはわからないけど……。

分かってはいたけど Go ばっかり、ツールばっかりの一年だった。2016 年は分野を広げ・深めていきたい。

はてなで一緒に働きませんか?