2017年10月22日(日)に秋葉原で開催された技術書典3というイベントに一般参加しました。買ったものの感想をメモっておきたいと思います。

技術書典は「技術書」専門の同人イベントであり、ニコニコ超会議と併設開催された「超技術書典」も含めると今回で4回目の開催となります。

以下、買ったものの一部の感想を書きます。サークルリスト順です。

『Goならわかるシステムプログラミング』『定理証明手習い』 – ラムダノート株式会社

サークルリスト順なので最初に企業枠となります。

『Goならわかるシステムプログラミング』は Web 連載を書籍にしたものです。ただし目次を見ると分かりますが、全体的に再構成と加筆がされているみたいでした。

『定理証明手習い』は “The Little Prover” の和訳 (中野先生監訳)。まだちゃんとは読んでいませんが、主張がプログラムとして与えられるので、プログラムを式変形して 't (真を表す値) にしてみよう、という形で主張を証明していくようです。LISP ベースです。実際に手を動かしながら読むのが良さそうなので、これは紙媒体じゃなくて電子書籍として買った方が良かったかも……と今パラパラめくりながら思いました。

『Progmatic Opal』 – みさきとミギー

Opal という Ruby から JavaScript へのトランスパイラを使って遊ぶ本。実際に実用アプリを作ることを通して使い方を概観できる。個人的にこういうトランスパイラは、何故それがあると便利なのかという視点が大事だと思っていて、たとえば OCaml から JavaScript へのトランスパイラである BuckleScript には「OCaml の型システムを活用できる」などのメリットがあります。この点に関して Opal はどうなのかというと、Opal のドキュメントには

Why does Opal exist?

To try and keep ruby relevant in a world where client-side apps are making javascript the primary development platform.

と書いてあって、「Rubyist が嬉しい」以上の大きな理由は無いっぽいなあという感じです。もちろん実用上は既存の Ruby コードが再利用できるという話があるのだと思いますが、JavaScript 側の仕様の関係上 Opal にも制限があるようで (参考1, 2)、このあたりは実際に使ってみないと Ruby で書くメリットがよく分からないなあと感じました。

『解説 Embedded Interpreters』 – team scomber

@eldesh さんによる StandardML 解説シリーズの4冊目。DSL を実装する上で、multi-stage programming 的なことができるようにして遊ぼうという本。以下、序文からの引用です。

一見面白みのないよくある DSL 用の embedded/projection ペアと呼ばれるコンビネータを組み上げて少しずつ拡張していくと、意外な機能拡張ができたり、高速化ができたり、SML では実行不可能な関数が評価できてしまったりします。

ところでこの本を読んでいて、OCaml で exception E of 'aexception E of _ と書いて例外を多相にしようとしてもエラーになることに気づきました。Polymorphic exception を素直に許すと、例外をデコンストラクトするときに型が何でもよくなっちゃうのが良くないみたいです。怖いなあ。

対して StandardML では限定的な polymorphic exception が exception E of 'a の形で書けます (“The Definition of Standard ML (Revised)” の 4.6節 “Scope of Explicit Type Variables” などで述べられています)。「限定的な」と書いたのは制限があるからで、たとえばトップレベルにおいて exception E of 'a と定義するのはエラーになります。”ML for the working programmer” の第8章には以下のように書いてありました。

When a polymorphic exception is declared, ML ensures that it is used with only one type, just like a restricted value declaration. The type of a top level exception must be monomorphic and the type variables of a local exception are frozen.

実際に使ってみる例を挙げてみます。

使用例1 (SML):

(* SML/NJ 110.81 で動作確認 *)
fun newdyn () =
  let exception E of 'a in
    (E, fn (E a) => a)
  end;
end;

(この関数がどう嬉しいかは今回の同人誌に書いてありました。)

使用例2 (SML):

Finitely-branching な木の上で DFS する関数です。

(* SML/NJ 110.81 で動作確認 *)
datatype 'a tree = Node of 'a * 'a tree list;
(* dfs : ('a -> bool) -> 'a tree -> 'a option *)
fun dfs p (t : 'a tree) =
  let
    exception Return of 'a;
    fun auxdfs (Node(value, children)) =
      if p value then raise (Return value)
      else foldl (fn (t, _) => auxdfs t) NONE children;
  in
    auxdfs t handle Return value => SOME value
end;

(このプログラムはケンブリッジ大学の講義資料にあったものを少し改変したものです。)

補足 (OCaml):

なお、上で挙げた SML の例みたく型変数のスコープがローカルなら、OCaml でも以下のように書くことができます。

(* OCaml 4.05.0 で動作確認 *)
(* newdyn : unit -> ('a -> exn) * (exn -> 'a) *)
let newdyn (type t) () =
  let exception E of t in
  let embed x = E x in
  let proj (E x) = x in  (* この行でパターンマッチの warning が出るので本当は対処しないといけない *)
  (embed, proj)

関連

『進捗大陸02』 – 進捗大陸

表紙がかっこいい本です。この本には3つ独立した記事が載っていました。それぞれについて感想を書きます。

自作言語 Rill と WebAssembly – @yutopp

Rill (文鳥言語) のバックエンドに WebAssembly を追加したという話。Rill のライブラリが libc に依存しているのでそこを何とかする必要があって、何とかしていたのがつらそうな感じでした。Emscripten にはブラウザ環境用の musl (軽量libc互換ライブラリ) が含まれているというのが知見。

再帰を持つ関数型言語の符号解析 – @youxkei

『進捗大陸01』に掲載された抽象解釈の記事の続き。前回に引き続き、関数型言語っぽいトイ言語で書かれた式の符号(プラス・マイナス)を解析する話ですが、前回と違って再帰関数が言語機能に含まれています。再帰部分を処理するために最小不動点をとっているので、健全性の証明が少し大変そう。

証明付き分散システムを作ろう! – @amutake

分散システムの実装・検証をするために作られた Coq 上のフレームワークである Verdi の紹介と、実際に Raft というプロトコルが Verdi によって検証された際にどのような形だったのかの解説が載っています。Coq 自体の説明から丁寧に入っていて、全体的に読みやすかった && 面白かったです。

『Unity Graphics Programming』 – Indie Visual Lab

Unity を使った 3D CG の技術解説本。全部で10章、計175ページと、力の入った厚い本でした。まだ全然読めていないです。目次はこんな感じ。

  1. Unity ではじめるプロシージャルモデリング
  2. ComputeShader 入門
  3. 群のシミュレーションの GPU 実装
  4. 格子法による流体シミュレーション
  5. SPH 法による流体シミュレーション
  6. ジオメトリシェーダ―で草を生やす
  7. 雰囲気で始めるマーチングキューブス法入門
  8. MCMC で行う3次元空間サンプリング
  9. MultiPlane PerspectiveProjection
  10. ProjectionSpray の紹介

TODO: 読む。

『Super Mario Maker プログラミング入門』 – @norakyuuri

スーパーマリオメーカーで論理回路を組み立てる指南書。表紙が特殊加工でザラザラになってて手触りが良かったです。内容は、AND や OR、半加算器や全加算器だけの解説にせず、最後にマルバツゲーム AI (?) の解説を入れてくるところが新奇だなあと思いました。マルバツゲームだとそもそもの状態数が少ない上、手番を固定するなどの手抜きをすることで現実的な状態数まで減らせるので、あとはそれをマリオメーカーで実装するという形になっていました。

マルバツゲームの動作はこんな感じです: http://www.nicovideo.jp/watch/sm31156135

『可視化法学』 – へその緒

第1号と第2号の2冊が頒布されていました。どちらも内容は、法律間の参照関係をビジュアライズするというもの (2冊で載っている分野が違う)。e-gov から条文を持ってきて処理することで参照関係をグラフにし、Gephi という可視化ツールに投げて絵にしてもらう、という形。冊子には分野ごとに絵が載っていて、その解説が書かれていました。参照関係が分かれば法律が理解しやすくなるのかどうかはよく分かりませんが、それはそれとして生成された図を見るのは楽しいです。こういうのは書籍ならではかもしれません。

法学的な内容に IT で立ち向かおうという話はロマンがあって好きです。たとえばドイツでは法律が GitHub にあるという話とか、(昔の?)法律エキスパートシステムの話とか。調べていたら、知財周りの統計情報を処理して可視化している企業があったり、契約内容を精査して粗を見つけるシステムを売っている企業があったりして、ちゃんと調べればもっとありそうで楽しそうだなと思いました。

『Paper Robotics』 – MPM

ほぼ紙だけで二足歩行ロボを作ろう!という内容の冊子。技術書典では初回から連続してロボット勢のサークルがいくつか出展なさっていて、楽しいです。本音を言うともっと増えてほしいのですが、あくまで技術書を売るイベントなので難しいのかもしれませんね。本題の紙ロボットは下の動画のように動きます。凄い。紙で作るロボットは最近だとかみロボット研究室あたりが面白いなあと思っていたのですが、この二足歩行ロボには技術力の塊で殴られた感触があって楽しかったです。

http://www.geocities.jp/kikousya290821/newmpm.htm

『ROS ではじめるホビーロボット #06』 – こそこそ団

Intel Edison + ROS + 3D プリンタで作ってきたかわいい自作ロボットの連載です。2017年をもって Intel Edison が終売になるニュースが最近流れていたのでどうなるのかなあと思っていたのですが、ちょうどその内容も入っていました。技術書典の会場に作成中のロボットがちょこんと座っていて、かわいらしかったです。(写真を撮っておけば良かった!)

そうそう、個人的に趣味でロボットをしたいと思いつつも、工学的な知識が足りずにいつも足踏みしているので、製作とか制御まわりの初心者本があれば教えてください。そろそろ LEGO Mindstorms から抜け出したい。

まとめ

というわけで、初回の技術書典、技術書典2に引き続き、3回目の参加でした。今回はイベント当日に台風が来るというスケジュールであったため、運営さんお疲れ様でしたという感想です。独自作成の整理券とウェブアプリを使った人数調整、会場混雑を見越した休憩所の設置、QRコードを用いた電子後払い決済システムの導入など、良いアイディアがたくさん実装されていて凄かった。それではまた次回。