Skip to main content

Writing an Interpreter in Go

· 12 min read

統計解析のためにRのコードを書く機会があったのだけど、 これまで「お行儀のいい」言語に慣れていた身からすると、 dplyrで活用されているメタプログラミングのようなもの(いわゆるnon-standard evaluationと呼ばれている奴ら)の 識別子とデータがコード上で厳密に区別されずにごちゃ混ぜになっている「柔らかさ」には強い違和感を覚えた。

どうなっているのか訳が分からないと感じたが、一方でこれも結局のところコンピューターで動いているわけだから、 この振る舞いにも厳密なセマンティクスが存在していることには違いない。 Rの文法は一見すると、常識的な手続き型言語のような見た目をしているが、その内部はSchemeのようなLisp系言語に近いようである。 また別のところでRのメタプログラミングやtidyverseの非正格評価についても整理したいと思っているが、 そんな不思議言語に触れ(ざるを得なかっ)たことをきっかけに、言語処理系の中身への興味が再燃した。

パーサーの書き方や、クロージャーがどう実装されるのかとか、そういうことを理解するには 作ってみるのが一番手っ取り早いだろうということで、 Writing an Interpreter in Goという本を読んでみた。 僕の理解度には適切なレベルで、とても面白く読み進めることができた。

せっかくなので、この本の内容について、自分の理解を整理するためにも、 感想をまとめておくことにする。

xaringanで快適RMarkdownスライドショー

· 8 min read

ちょっとした資料をスライド形式で提示する必要が出てきた時、データから生成した図表や数式が簡単に埋め込めると便利である。

PowerPointなどのツールだと、数式や図表の埋め込みが面倒である。また、テキストベースだと、差分の管理や使い回しもしやすいように思われる。

そこで、RMarkdownを使ってスライドを作成してみることにしたのだが、そのためのパッケージが何種類か存在する:

  • ioslides:RMarkdownに標準搭載。Google I/O 2012用に作られたwebベースのスライドテンプレートを元にしたもの。シンプルで見栄えは良いが、カスタマイズ性が乏しい
  • slidy:RMarkdownに標準搭載。
  • beamer:RMarkdownに標準搭載。ブラウザベースではなく、TeXをバックエンドにしてPDFを生成する。
  • revealjs:高機能だがやや記述が冗長。
  • xaringan:個人が作成したもので、RMarkdownに組み込まれている上の2つと比べると開発の持続性は怪しいし、マイナーだが、高機能でインストールするだけでMathJaxの数式などもまともに使える。内部的にremark.jsを使用している。

それぞれ試した結果、xaringanを使ってみることにしたが、マイナーで使い方についての資料が少ないので自分なりのbest practiceを備忘録としてここにまとめておく。

UT SSL-VPNを便利に使うブックマークレット

· 6 min read

UT specificな話題で恐縮ですが、学生向けに大学が提供しているSSL-VPN Gatewayというサービスがあります。これを利用すると外部から学内ネットワーク経由でウェブを閲覧することができ、出版社のページから本来学内からしか利用できない論文のフルテキストを取得したり、その他、大学が契約しているデータベースを自宅から利用することができます。コロナ禍で大学へ行く機会が減少している今では特に役立つ便利サービスかと思います。

ただ、このサービス、使いにくい点がありました。プロキシ外の世界から中の世界に直接移動する手段がなく、毎回サービスにログインしてポータルサイトから望みのサイトへリンクを辿る必要があったのでした。例えば、ウェブを彷徨っていてたまたま見つけたこの論文の本文を読みたい、という時、いちいちサービスへログインして(使いにくい)ポータルサイトからPubMedなどのデータベースに移動し、再度望みの論文を検索し、出版社のページにアクセスする、という手順を踏んでいたのです。

この一手間が地味に面倒だったので、今閲覧しているページをSSL-VPN Gateway経由に飛ばすブックマークレット(懐かしい響きです!)を作ってみました。これで論文収集が捗りますね!(ただし、読むとは言っていない。)

javascript:void(location.href.indexOf(',DanaInfo=') !== -1 ? null : (location.href = 'https://gateway2.itc.u-tokyo.ac.jp/'+ (location.pathname.lastIndexOf('/') !== -1 ? location.pathname.substring(1, location.pathname.lastIndexOf('/')+1) : '')  + ',DanaInfo=' + location.hostname + (location.protocol === 'https:' ? ',SSL+' : '+') + (location.pathname.lastIndexOf('/') !== -1 ? location.pathname.substring(location.pathname.lastIndexOf('/')+1) : '') + location.search))

これをブラウザのお気に入りに登録しておき、出版社の論文ページなどを開いた状態でこのブックマークレットを起動すると、同じページをUTのSSL-VPN Gateway経由で開くことができます。サービスに未ログインの場合はログイン画面が表示されて、ログイン後にもとのページにリダイレクトされます。すでにGateway経由でアクセスしている場合は何も起きません。

幾何分布

· 4 min read

ポケモンGoをやっていると、伝説ポケモンのレイドバトル後のゲットチャレンジで何度良い投球をしたつもりでも逃げられてしまったり、わざマシンを何度使ってもループして目的の技を引き当てることができなかったりすることがあり、 なんて運が悪いんだ、と思うことがある。

運営がおかしな操作を加えているなどという陰謀論は置いておき各試行で成功率は一定で独立なベルヌーイ試行になっているとして、chance levelと比べてどれだけ運が悪いのかを考えてみる。

Zoteroで文献管理

· 4 min read

文献管理ソフトは数あるが、無料・クロスプラットフォームで、データベースだけでなく文献ファイルそのものを複数のPC間で同期できるものが望ましい。

これらの要件をすべて満たすものとしてZoteroを利用することにしたので、使い方を忘れないようにまとめておく。