有理数の付番

概要 有理数の付番の計算しやすい定義を与えた。 はじめに 有理数 () は自然数 () と同じくらいの個数しかない(可算)というのはよく知られています。これは通常、以下のような理屈で納得されます。 のように付番することで、 は と同じくらいしかないことが…

RustのREPL "evcxr" を使ってみた

概要 evcxrはRustのパーサーとコンパイラを外部から呼び出すことでREPLを実現している。セミブラックボックス的なアプローチにも関わらずなかなかの完成度で、今後が期待できる。 evcxr evcxrは最近公開されたRustのREPL (GitHub, redditのpos)である。また…

Rustコンパイラをクラウドでビルドする備忘録(改良版)

概要 前回の改良版。 Rustコンパイラをいじっているとビルドの遅さのせいで作業に支障をきたすため、クラウドでビルドするようにしてみる。 EC2を立ち上げる Ubuntu 16.04 (HVM) の c5.4xlarge を使うことにする(結局、手元とあわせたくなったので18.04に上…

ISUCON8にRustで参加するためにしたこと

背景 ISUCONとは、与えられたWebサービスをいい感じにスピードアップするコンテストである。 いい感じに最適化すさえすれば言語は問われない。ということは、最初に提供される参照実装の書かれた言語を使うのが得策である。 複数の言語で参照実装が提供され…

Rustコンパイラをクラウドでビルドする備忘録

概要 Rustコンパイラをいじっているとビルドの遅さのせいで作業に支障をきたすため、クラウドでビルドするようにしてみる。 EC2を立ち上げる Ubuntu 16.04 (HVM) の c5.4xlarge を使うことにする。使うインスタンスの強さは財布と相談して決めることにする。…

Rustのstaticいろいろ

概要: Rustのstaticの亜種をいろいろ挙げる。 ここでは以下のように分類します。 変数 ローカル束縛 (引数、 let, match, for, if let, while let) 静的変数/定数 コンパイル時定数 (const) アイテム位置の定数 トレイトの定数 実装の定数 静的変数 (static)…

binfmt_miscの力でBOM shebangをサポートする

概要: binfmt_miscを使うとBOM shebangを擬似的にサポートできる。ただしインタプリタ側がサポートしてないと意味がない。 事の発端 Windowsのメモ帳がLF改行をサポート→でもUTF-8で保存しようとするとBOMがついて悲しい→shebangにBOMがつくと動かないのが悲…

SATySFi for Windows を作った

SATySFiはOCamlのような関数型言語とLaTeXのようなマークアップ言語をベースとする新しい組版システムです。 最近SATySFi for Windowsを作ったので紹介します。 SATySFi for Windowsとは 今まではSATySFiを試すにはLinuxかMac環境が必要で、Windowsを持って…

SATySFi用Vimプラグインを作った

タイトルの通りふと思い立ってSATySFi用のVimプラグインを作ったので紹介します。 https://github.com/qnighy/satysfi.vim SATySFi とは SATySFiはgfn氏が未踏プロジェクトとして開発している組版システムです。LaTeXのような美しい組版を、一から設計しなお…

Rustのパニック機構

概要: Rustのパニック機構は異常終了の処理を安全に行うためにある。この動作を詳しくみていく。 パニックとは何か Rustには2つの異なる例外処理機構があります。 発生源 対処方法 例 パニック プログラミングエラー 原則として捕捉しない assert!() 境界外…

Rustの関数ポインタの落とし穴

概要: Rustの関数ポインタの落とし穴について その1: 関数ポインタはクロージャとは異なる これはC/C++に慣れている人には当たり前ですが、関数ポインタ型 (fn()) とクロージャ型 (Fn()) には重大な違いがあります。それは、関数ポインタは環境をキャプチャ…

NonNull安定化記念にInternerを書いてみる

概要: NonNullが安定化され、1.25.0から使えるようになる。そこでNonNullの利用例としてInternerを実装してみた。 NonNull とは NonNull はRustにある生ポインタ型のひとつです。元々 Unique, Shared という2つの生ポインタ型でしたが、安定化を機に統合・仕…

安定化間近!Rustのimpl Traitを今こそ理解する

概要: impl Trait が安定化間近である。これはトレイトオブジェクトと似た用途を持つが、静的ディスパッチされSizedのまま使えるため効率的である。 impl Trait が安定化間近 Rustでは新規の機能はまずnightlyバージョンに「不安定機能 (unstable feature)」…

Rust libstd内での特殊化の使用例 (1.23.0時点)

概要: Rust libstd内では既に特殊化が使用されているので、特定の条件を満たすことでより効率なコードが生成される。 PartialEq<[T]> 最適化される処理: スライスの比較処理 間接的に最適化される処理: Vec<T>, str, String の比較など 条件: 内部トレイト Byte</t>…

PhantomDataまとめ

概要: PhantomData<T> には3つの異なる役割があり、多くの場合は PhantomData<fn() -> T> の形で使うのが無難である。 はじめに PhantomData<T>は特殊な型で、中身を持たないにもかかわらず、型システム上は中身を持つかのように振る舞います。幽霊型 (phantom type) と関</t></fn()></t>…

Vecと参照を同時に返す

概要: Rustでは Vec<T> とその要素への参照を同時に返すことはできないが、これを部分的に可能にするcrateはある。 やりたいこと 以下のように、 Vec<T> とその要素への参照を同時に返したい。(あるいは、こういった組を構造体に格納したい。) fn foo() -> (Vec<i32>, &</i32></t></t>…

Drop Checkerの規則をちゃんと理解する

概要: Drop CheckerはRustのボローチェッカに付属する追加の検査器で、コンパイラが自動で挿入するdrop処理の安全性を保証するためのものである。これの詳細な規則とその正当性を理解したかったので自分なりに整理した。 dropckの概要についてはRustonomicon…

SSHのホスト鍵設定

ホスト鍵とは SSHの鍵はデジタル署名用の秘密鍵であり、本人確認に使われる。いわゆるid_rsaは、ユーザー側の本人確認のために使われる。 一方、SSHサーバー側も専用の秘密鍵を所有している。これは /etc/ssh/ssh_host_{dsa,ecdsa,ed25519,rsa}_key のような…

再帰的余代数について

最近、再帰的余代数という概念について少し勉強したので、証明をまとめてPDFにした。 github.com 動機など細かいところには触れられていないが、以下のことが証明されている。 終再帰的余代数 = 始代数 Setでは、再帰的ならば整礎

WSL+Xming環境整備

WSLとXmingを組み合わせていい感じに環境整備できてきたので記録をとる。 WSLとXmingについて WSLはWindows上でLinuxのプロセスを実行する機能である。互換性は完全ではないが、多くのソフトウェアが動くようになっている。ただし、そのままではGUIは動かな…

古いRubyをビルドする

動機 現時点でRubyの最新版は2.4, サポートされているのは2.2までで、2.1以前はメンテナンス対象外である。そのような古いバージョンを動かすのは決してよいことではない。 しかし実のところ、現在でも多くのWindowsマシンで、Ruby1.8.1とRuby1.9.2p0が動作…

Rust-proofを使ってみる

概要: Rust-proofはElectrolysisと同様にRustプログラムから検証条件を抽出するが、LeanではなくSMTソルバであるZ3向けの検証条件を出力する。こちらも開発が放棄されているように見えるが現在もビルド可能である。 準備 テスト用リポジトリを準備する $ car…

Electrolysisを使ってみた

概要: ElectrolysisはRustの検証条件をLEANに出力するプロジェクトである。これを使ってみた。 Electrolysisとは Electrolysis (electrolysis: 電解) はSebastian Ullrich氏の修士研究で開発されたプロジェクトで、Rustプログラムの正当性や計算量に関する検…

Rust組込みトレイトのコヒーレンス

以下のトレイトは通常のコヒーレンス規則に加えて、特別なコヒーレンス規則が適用される。 Sized, Unsize Sized, Unsize の手動実装を与えることはできない。 Fn, FnMut, FnOnce Fn, FnMut, FnOnce の手動実装は安定版では禁止されており、 #![feature(unbox…

Rustにおける再帰的/余再帰的なトレイト選択/トレイト履行

Rustでは以下のようなプログラムはコンパイルエラーになる。 struct List<X>(Option<Box<(X, List<X>)>>); // 通常は X: Clone を仮定するが、あえて Option<Box<(X, List<X>)>>: Clone としてみる impl<X> Clone for List<X> where Option<Box<(X, List<X>)>>: Clone { fn clone(&self) -> Self { List(self.0.clone()</box<(x,></x></x></box<(x,></box<(x,></x>…

RustのRFC一覧 (~1552)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず1552までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい。 このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関…

Rustのコヒーレンス

概要: Rustの impl が定義できる型にはコヒーレンスと呼ばれる制限がある。これについて説明する。なお、この記事では特殊化がない前提で説明する。 コヒーレンス初心者のための概説 以下のように impl が重複していたり、自分のところ以外の型の impl を定…

RustのRFC一覧 (~1240)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず1240までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい。 このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関…

RustBelt試行中: get_x の一般化

RustBeltの examples/get_x.v をいじってみた。 From iris.proofmode Require Import tactics. From lrust.typing Require Import typing. Set Default Proof Using "Type". Section get_x. Context `{typeG Σ}. Definition get_x : val := funrec: <> ["p"]…

RustのRFC一覧 (~0900)

概要: RustのRFCの一覧を作ろうとしたが、あまりに多いのでとりあえず0900までで公開することにした。なお、単に全てのRFCを列挙したいならばここを見ればよい。 このRFCはRustのコミュニティーが管理しているものであり、 “RFC” の元祖であるIETF RFCとは関…