type t (* void *)

関数型言語や英語学習の事とか。

OCaml: RWOを読み進めるためのOCaml設定

20150426加筆 RWOの説明を書いた
20150422加筆 より細かく書いた

20150909加筆 以下の内容はDebian 7向けに書かれており古いです! Debian 8ではより簡単にopamをインストール出来るようになっています! 下の記事では重複する部分は書きませんでしたが、インストール方法については下の記事が最新です。

no-maddojp.hatenablog.com

なんかちょっとだけOCaml環境構築が面倒みたいな話があったので、構築手順を書く。
大体確かめられた手順なのでよいはず。

Emacsのインストールまで解説しますが、RWOを読み始めるにあたりエディタの設定は必ずしも必要ではありません。
楽しんで下さい。

続きを読む

インターネットの闇を支える技術

別にインターネットの闇の話ではなくて私が最近導入して便利だったものをつらつら書きます。

QuickTab

Google Chromeの拡張。Tabの切り替えをC-qで実現する。
これでタブの位置関係とかどのウインドウにあるかとかをいちいちグラフィカルに見ずに住むようになった。 chrome.google.com

余談ですがこれを入れると操作感がEmacsのバッファだな、という気持ちになります。

Authy

play.google.com

二段階認証アプリ。Google Authenticatorなどと比較して複数の端末でセキュリティ情報を共有できるのが選んだポイント。
旅行のときに自分の携帯電話を落としてしまい、電話番号に来る2段階認証が全くできなくなって

にログインできずアバーとなった経験からこれにしました。
電話番号認証ほんま社会的に弱い。

もちろん複数端末に機密情報を入れるのは紛失したときにそれが漏れ出るリスクを上げているわけですが、 モバイル端末紛失からの自分の情報にアクセスする権限を失うほうが影響がでかい気がします。

Mendeley

https://www.mendeley.com/library/

PDFとか読んだ文献管理が無理になってきたのでPDF系は全部これに押し込むようになりました。
Google Chromeプラグインをいれると今見ているPDFをスムーズにインポートできます。

JIS配列セパレートキーボード

www.archisite.co.jp

結構癖のあるセパレートキーボード。JISではこれしかセパレートないと思います。
デフォルトの設定だと使いにくい(十字キーが打てない、Fnキーも十字キーも右側にあるってどうなんだ)。

私は

  • 左側の使わない無変換キーにFnをわりあてて
  • 左上の半角全角/Escを入れ替えて、FnなしではEscを入力するように

くらいのカスタマイズで使ってます。ホームポジションのまま十字キーが使えて便利。
あんまレイヤーを切り替えてガシガシみたいな使い方はしてないです。

ヘルシオホットクック

www.sharp.co.jp

予約調理が便利。 冷凍カット野菜 + カット済みの鶏肉を放り込んで限界筑前煮を量産することができる。

Type-C USBとあれそれつなぐやつ

Switchように買いました。これのおかげで専用のドックがなくてもHDMIで画面接続できてかつ イーサネットで有線接続できます。

HDMIさせてもモニタ出力には必ず電源ケーブルが必要なのね

f:id:no_maddojp:20190314010727j:plain

横長ディスプレイ

こういうの。

https://www.amazon.co.jp/%E3%80%90Amazon-co-jp%E9%99%90%E5%AE%9A%E3%80%91LG-%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC-%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4-29UM59-P-29%E3%82%A4%E3%83%B3%E3%83%81/dp/B06ZZJDMTC/ref=sr_1_30?ie=UTF8&qid=1552493390&sr=8-30&keywords=PC%E3%83%A2%E3%83%8B%E3%82%BF&th=1

横長ディスプレイは作業領域が本当に広くて、こういうのが1つあればデュアルモニターとかにしなくていいと思う。 おすすめは更に業務用にUSBハブになるやつ。

耳栓+イヤーマフ

ドラッグストアで売っているようなシリコン耳栓とAmazonで適当に買ったイヤーマフが 仕事に集中するのに便利です。 すごくひとりごとの多い人の近くで働くときにも安心。

隣でゲームの話とかしてても全部遮ってくれるようになるよ。 でも何か話しているというところまでは消音できないです。

Dアニメストアのモバイルアプリ

電車通勤中ずっとアニメ見とる。 東京電車内の治安が最悪でアニメでも見てないとやってられない。

私の家の共同アンテナは地上波の番組を一切受信できなくなったので主なアニメ見る手段です。

SATYSFi雑感

最近文章のためにずっと書いてる。 感触としてはかなり現状これでやっていくのはチャレンジングだと感じる。

Emacsのメジャーモードほしい

現状gfnさんが配布されているsatysfi.elがある

github.com

実装を見ると define-generic-mode で作られているシンプルなモードで、 キーワードハイライトが動作する感じ。 自動インデントとかかっこいい目の機能はない(と思う)。

私はこれ以外にカッコの対応が取れないときびしいので smartparen-mode を使っている。

github.com

<>の対応を取るためには、以下の設定を書いておくと良い感じがする。

(sp-local-pair 'fundamental-mode "<" ">")

書くときに困ること

Syntax Error or Lexer Error. 各括弧のによって何が起きるのかSATYSFi Bookを読んで把握したほうが良い。 プログラミング言語としてのSATYSFiはかなり特殊な言語だと思う。

文脈に依存したlexer

何を書くとLegalであるかというのは現在のコンテキストによって変わる。 そのコンテキストはどういう時に変化するかというと、各括弧によって変化する。

ソースコードのコメントにそのことが書いてある。

  (*
   * The SATySFi lexer is stateful; the transitions are:
   * | to \ from |program|block |inline|active |  math  |
   * |-----------|-------|------|------|-------|--------|
   * |  program  | (   ) |      |      | (   ) | !(   ) |
   * |           | (| |) |      |      | (| |) | !(| |) |
   * |           | [   ] |      |      | [   ] | ![   ] |
   * |  block    | '<  > | <  > | <  > | <     | !<   > |
   * |  inline   | {   } | {  } | {  } | {     | !{   } |
   * |  active   |       | +x ; | \x ; |       |        |
   * |           |       | #x ; | #x ; |       |        |
   * |  math     | ${  } |      | ${ } |       | {    } |
   *
   * Note that the active-block and active-inline transitions are one-way.
   *)

github.com

トップレベルはprogram stateから始まる。 demo.satyを順に見ていくと、

  • document関数の関数適用
    toplevelはdocument型の値を返す式を書く
  • (| によってprogramを受理する状態に遷移(変わらないが)。StackにStateをPushする
    • { によってinline stateに遷移、それをStack Push
      inline stateのときには地の文を書くことが出来る
    • \SATySFiのようなものはコマンド。コマンドはどういう時にセミコロンが必要なのか悩んだけど基本必要、コマンドの引数に{}があるときには書かない(書いたらエラー)
    • } でinline stateを抜ける
  • ………
  • '< はprogram stateからblock stateに遷移する
    • block stateは段落の塊みたいなinline-block型を持つ式を書く
    • +p は段落を作るためのコマンド
      • { でinline modeに遷移

.........

みたいなメンタルモデルを持たないといけない。 基本的には上の表の括弧で決まるから、わからなくなったら直前の開き括弧を探しに行くと良い気がする。

状態Lexerウウーみたいな気持ちになったけど、本質的に組版で地の文を書きつつプログラマブルな要素を書きたいとなると何でも書ける地の文の世界とプログラムの世界を状態で分けるのが自然な気がしてきた。

Syntax ErrorとかLexer Errorが出たらなんかこの状態でできないことしとらんかということを真っ先に考えたほうが良さそう。

// 今の理解なので間違ってたら教えてください。。。。まだ3週間くらいしか書いてないので

雑感

最近Latexを書きつつSATYSFiを書いていると頭が混乱してきます。 段落を書くのが +p { ... } で書くのと、line break 2つで切れ目と見て段落を形成するのはどっちが楽だろう。。。。。

LatexとSATISFIはソフトウエアとしての歴史が違うのでツールチェインで 比較してもしょうがないのだけどやはり色々辛いです。 けどもDSLのフロントエンド実装のことを無限に考えられて楽しいです。 Syntax Error, Lexer Errorのところを何とかする方法考えて遊んでいます。。

Emacsで自動インデントできるのメジャーモード作りたいんだけど、SMIEとか言う奴が全くわからないでいます。。。。。

追記:

私も少しはフロントエンドのコードを書いていたからわかるんですがわかりやすいエラー出力のために言語処理系がフロントエンドを変更してクソデカ lexer or parserになっていくのを見ると、この辺を諦めてスパっと行くのも開発者の労力削減のためにやむを得ないという気持ちになります。

GCCのパーサー定義とか見ると本当に地獄で、こんなものを1人プロジェクトでメンテ出来るわけがありません。 しかしそれでは書く方が辛さがあるので、いい感じの折衷案みたいなものが見いだせると嬉しいですね。。。