lldb-rust を使うときの注意と問題

Ubuntu 16.04 標準で apt install lldb したときに入る lldb-3.8 とあわせて rust-lldb 使うと,breakpoint の設定が関数名経由でできない(ソースコードの行数指定によるbreakは可能).さらに,すべてのstep out 実行がstep in実行になる.これは非常に不便.lldb-4.0 とあわせて使うと,これらの問題は解決した.

しかし,lldb-4.0 のバイナリは libedit (readline の BSD 版)が有効になっていないようで,補完が効かなくなる.lldb-5.0 でも同じ状態だった.ビルドするしかないのだろうか... bugs.launchpad.net

Coursera Algorithm Part I を受講し終えた

Algorithms, Part I | Coursera を受講していて,先日無事に完了した.全体的に課題がかなり歯ごたえがあって,よい勉強になった.この講義は,全体的に応用を強く意識した説明がなされる.そのため,応用指向の人(わたしとか)に興味が持てる構成となっており,幅広い Software engineer の皆様にお勧めできる内容だと感じた.

講義中で一番面白いと感じたトピックは, Left-leaning Red-black tree の話である.Left-leaning Red-black tree は本講義のビデオに出てくる Robert Sedgewick 先生の発明で,より simple に Red-black tree を実装できるというもの.Red-black tree は非常に便利データ構造で,Self-balancing binary tree の中でも性能が安定している(insert, delete, search が log(n) で実行可能な)データ構造である.その性能の安定性から,ファイルシステムで利用されている他,C++ STLJava Collection など標準ライブラリにも幅広く利用されている.その Red-black tree が simple に書けるのはとても魅了的だと思った.というのも,Red-black tree の self-balancing の部分は特に複雑で,正しく実装するのは大変だからだ .ところが,少し調べたところLeft-Leaning Red-Black Trees Considered Harmfulという記事が見つかった.この記事では,Left-leaning Red-black tree の性能上の弱点や,利点として主張されている simplicity について疑わしいという主張がなされている.なかなか美味しい話はないものだ.

この手の「有用だが正確に作成することが難しいアルゴリズム・データ構造の単純化」や単純化による副作用の研究は,(分散合意アルゴリズムでいうところの Paxos made simple,Raft にあたると思うのだけど)非常に重要なので,もっと進むとよいと思った.アルゴリズムの実用性を上げる上で重要であるし,一昔前のquick sort の性能解析の話などを彷彿とさせるので熱い.

いもす法

幅の重なりを取得する問題を解いている過程で,いもす法を覚えた.これは便利で速い.

ハーフマラソンを完走した

ハーフマラソンは3回目.今年は5-8kmを数回→10km→14.5km→21km(本番)と練習を組んだ.全く練習しなかった前回と比べ,タイムはかなり改善した.次は1時間55分を切ることを目標にしたい.

Mac OS X 上に rustfmt を install しようとした際にコンパイルエラーが発生する問題の回避法

要約

Mac OS X にて,homebrew を使って rust をインストールしていると,cargo install rustfmt を実行した際に失敗する. これは,homebrew 経由でインストールした rust コンパイラが,予期せぬ LC_ID_DYLIB の値を渡されるために発生する. この問題の回避方法は,homebrew 経由でインストールした rust を一旦アンインストールし,rustup 経由で rust をインストールした上で,cargo install rustfmtを実行し直すことである(2017/6/4現在).

経緯

rustfmt があることを知って,早速インストールしようとしたら失敗した.

$ rust install rustfmt
...(中略)...
   Compiling env_logger v0.4.3
error: proc-macro derive panicked
   --> /Users/ozawa/.cargo/registry/src/github.com-1ecc6299db9ec823/rustfmt-0.8.4/src/config.rs:213:18
    |
213 |         #[derive(Deserialize, Clone)]
    |                  ^^^^^^^^^^^
...
329 | create_config! {
    | - in this macro invocation
    |
    = help: message: proc_macro::__internal::with_parse_sess() called before set_parse_sess()!

error: failed to compile `rustfmt v0.8.4`, intermediate artifacts can be found at `/var/folders/59/5_yyjdc92zzfjsvrhz46x2mc0000gn/T/cargo-install.EsADzsGoPlu6`

コンパイルエラーの内容で検索をしたところ以下の github issue を発見. github.com

github.com

上記コメントを見て,rustup 経由で rust の再インストールを行うことで,正常に動作させることができた:

$ cargo install rustfmt
...(中略)...
   Compiling env_logger v0.4.3
    Finished release [optimized] target(s) in 269.78 secs
  Installing /Users/ozawa/.cargo/bin/cargo-fmt
  Installing /Users/ozawa/.cargo/bin/rustfmt