微分の連鎖律と関手性

最近(ここ半世紀くらい)圏論が流行りですね。しかし圏論は抽象的で、具体例や圏論の言葉を使うことによるメリットが見えないと、なかなかとっつき難いかもしれません。

この記事では、高校数学に出てくるアレが、実は圏論の言葉でスッキリ(?)表せることを見てみます。

予備知識:高校数学、若干の圏論、あとは多変数の微分の知識があればなお良い 続きを読む

SML、はじめました

動機

プログラマーの3大欲求と言えば「プログラミング言語(処理系)を作りたい」「テキストエディターを作りたい」「OSを作りたい」である。これらの欲求は定期的に湧いてきて、多くの場合は実を結ぶことなく霧消する。

そんなわけで先日、筆者にもプログラミング言語の処理系を作りたい欲求が湧いてきた。

具体的には、ML系の型推論を持った言語を作りたい。また、エフェクト推論・リージョン推論のような技法を試したい(一旦普通に処理系を作り、その後に改造してエフェクト推論やリージョン推論を試す)。

別の方向性の動機として、型のないスクリプト言語(具体的にはLua)で大きなソフトウェアを書くのがだるい。静的型のついた言語からスクリプト言語にコンパイル(トランスパイル)するやつを作りたい、というものがある。

最近はJavaScriptへトランスパイルする処理系は色々登場したが、それ以外のスクリプト言語を吐き出す処理系というのはまだ少ないように思う。

これらの動機付けが混ざった結果、「型推論のある言語からスクリプト言語へのコンパイラーを作れば良い」という結論に至った。 続きを読む

日光白根山登山

すでに8月の半ばになってしまったが、7月に行った登山について書く。

計画

今年は梅雨明けが早かった。夏山シーズンの到来だ。東京は酷暑だ。山の上に逃げるしかない。

7月中に1泊ぐらいで山に行っておきたい。関東近郊で自分が行ったことのない山として、いくつかの候補の中から今回選んだのは、日光白根山である。 続きを読む

TeXのターミナル出力がうるさい件

TeX文書をターミナルで処理させると、ターミナルに大量の出力が表示させる。

そのうち(パッケージ開発者ではない)一般ユーザーにも有益なものはほんのわずか(Undefined referenceとかOverfull hboxとか)で、大半は価値のない文字列である。一般人というのは「大量のメッセージが表示される」→「解読するのが面倒なので読まない」という思考回路で動く[要出典]ので、価値のない文字列が大量に表示されるのは有害である。(一般人はターミナルではなくTeXworksとかの統合環境を使うのでターミナルにどれだけ文字列が表示されようと関係ない、という説はある)

そこで、TeX文書の処理時に表示される文字列がなるべく少なくなるようにするにはどうしたらいいか考えよう。

なお、-interaction=batchmodeを指定すれば当然ターミナルに表示される文字列は減るが、しかしそれでは有益な情報も表示されなくなるし、何よりエラー時のメッセージもターミナルに表示されなくなってしまうので、-interaction=batchmode以外のモードで表示文字列を減らすことを考える。 続きを読む

TeX言語のトークンと値 その2:\noexpandと、挿入された\relax

我々はTeX言語を完全に理解しなければならない

我々はTeX言語を完全に理解するであろう

— David Hilbert

TeX言語をわからないまま書くのと、TeX言語を完全に理解した上で忘れるのは違いますからねぇ

— とある脚本家

前回はTeX言語について概略を説明したので、今回は堂々と(The TeXbookやTeX by Topicにも載らないような)重箱の隅をつつくことにする。記法、用語は基本的に前回に準じるが、面倒なので制御綴 \foo を表す際に四角で囲っていなかったり、文字トークンのカテゴリーコードを省略している場合がある。

一部、以前の TeXっぽいものを実装するにあたっての雑記 と内容が被っている。 続きを読む

TeX Live 2018でWindows上のTeXworksが日本語を含むファイル名を扱えない話

タイトルの件である。(実際にはTeXworksは問題の核心に1ミリも関係しないので、TeXworksを使っていないあなたもこの記事を読み物として楽しむことができる。さあ読もう)

この記事を書いている6月現在、TeX Live Managerで最新版にアップデートすれば問題は解決するはずである。

この記事では、筆者がどのようにこの問題の原因を突き止めたか、順に書き連ねていく。なお、問題の発覚と原因究明は5月初めに行ったが、TeX Liveのアップデートで対策されるようになるのを待った結果記事の公開が6月になった(筆者がよくブログ記事を下書きのままほったらかしているのとは関係ない)続きを読む

GLMのマニュアルがヘボいので自分で書き始めた

GLM — OpenGL Mathematics というC++のライブラリーがある。これはOpenGLとかで使うようなベクトルや行列の型・関数を提供してくれる。

それはいいのだが、これ、ドキュメントがヘボい。

まず公式の Manual は、ライブラリーの使い方を説明してくれるが、個々のAPIには立ち入らない。

次にDoxygenで生成された API Documentation は、個々の関数の説明をしてくれるが、(ベクトルとか行列の)型の説明が欠けている。そして、「ソースコードに飛ぶ」をやっても関数の実装は見れない(.hppはDoxygenの対象に入っているが.inlは入っていない)。関数がどういう数式を基に実装しているのか、GLMのドキュメントからはわからないのである。

まあGLMはGLSL互換を謳っているので、GLSLを知っていれば(GLSLのドキュメントを読めば)細かい説明はなくても使えるだろうという考えもあるかもしれない。それはまあそうかもしれないが、GLSLにないGLMの拡張機能に関してはそういうわけにはいかない。

たとえば、四元数に関連した mat4_cast 関数のドキュメントには

GLM_FUNC_DECL mat<4, 4, T, Q> glm::mat4_cast ( tquat< T, Q > const & x )

Converts a quaternion to a 4 * 4 matrix.

Template Parameters
T Floating-point scalar types.
See also
GLM_GTC_quaternion

とあるが、果たしてこの説明から関数の動作を予想できる人がどれだけいるだろうか?

したがって、(コピペコーディングではなく)GLMをまともに使おうとしたらGitHubのソースコードをチマチマ眺める必要があるわけだが、そんなのは辛すぎる。というか、LaTeXでもMathJaxでもいいから、数式をふんだんに使ったGLMのマニュアルが欲しい…。

というわけで、自分で書いてみることにした。

https://miz-ar.info/glm-notes/

現段階ではまだ、クォータニオン(四元数)についてちょろっと書いた程度である。筆者の必要に応じて、徐々に拡充していきたい。

なんとなく英語で書いてみているが、文法とか色々怪しいのでその辺はご容赦願いたい。

glm-notes/ 以下のURLは今後変わるかもしれないので、リンクを貼るならトップページ(https://miz-ar.info/glm-notes/)にお願いしたい。

なお、C++の関数の型は(伝統的には)戻り値の型を先に書くが、自分の書いたドキュメントでは(筆者にとっての読みやすさのため)戻り値の型は後置とする。また、引数の型の const& も省く。

おまけ

GLMとは全く関係ないが、筆者のほしい物リストほしい本リストを公開しておく。今月は筆者の誕生月である。

関連記事

OpenGL の投影行列