2015/04/21

32bit 版 xv6 を Yosemite で動かす

諸処あって xv6 を Mac で動かしたのでそのログとかをつらつらと。
元々は Vagrant 経由で Virtual Box の VM に構築しようかと思っていたんだけれど、 nested VM できないっぽいので Mac で qemu 動かしました。

環境

  • Mac OS X Yosemite 10.10.3
  • Homebrew 0.9.5

必要なもののインストール

  • brew install homebrew/versions/gcc49
    • クロスコンパイラが必要なのでそのビルドに必要な gcc-4.9 を入れる
  • brew install qemu
    • qemu で xv6 を動かすので必要。
  • brew tap altkatz/gcc_cross_compilers
  • brew install --with-all-targets gdb
    • xv6 が .gdbinit を自動で吐くので gdb で debug するのが入れる。
    • --with-all-targets を付けないと i386 とかの symbol が読めない。
  • brew install i386-elf-gcc i386-elf-binutils
    • i386 な elf をサポートした gcc と binutils。
    • 各コマンドの prefix に i386-elf- って付く。

インストールしたものの各バージョンメモ

  • gcc 4.9.2
  • qemu 2.2.1
  • gdb 7.9
  • i386-elf-gcc 4.9.2
  • i386-elf-binutils 2.23

xv6 の起動

xv6 を落としてくる。
  • git clone git://pdos.csail.mit.edu/xv6/xv6.git
Makefile をちょっと書きかえて
TOOLPREFIX = i386-elf-QEMU = qemu-system-i386
にする。
コマンドとかは
  • make qemu
    • xv6 が起動する。
    • ls とかできる。
  • make qemu-gdb
    • xv6 が gdb で debug できる状態で起動する。
    • 同じディレクトリで gdb って打つだけで attach する。
    • どうやら .gdbinit を勝手に吐いてくれてるっぽい。便利。
っぽいです。

参考文献

2015/04/13

pry-rails がマルチバイト文字を含むヒストリを追加できない現象の対症療法

Rails Console で 'ほげ' とかのマルチバイト文字を入れると、ヒストリへの書き込みができなくて落ちる問題にぶちあたったので対症療法と調べたログ。

環境

  • OSX 10.10.3
  • rbenv 0.4.0
  • ruby-build 20150319zf
  • ruby 2.2.1
  • rails 4.2.0
  • pry 0.10.1
  • pry-rails 0.3.3

問題

日本語を含むコマンドを rails console で打つと以下のエラーで rails console が落ちる。

たぶんこれを踏んでる。

history.rb の save_to_file でどうやら保存できない模様

$ Pry.history.instance_eval {def hoge line; binding.pry end; @saver = method :hoge}
$ にほんご
$ Pry.history.instance_eval {@saver = method :save_to_file}
とかして無理矢理に pry で pry に割り込む。
そしたら line が ASCII-8bit になってるっぽい。
ので正しいエンコーディングに変換してしまえば保存できた。
.pryrc に書くとすると


とか。

これでヒストリへの保存時に落ちなくなったけれど、プロンプトはやっぱりおかしいまま。
どこか根幹の原因があるっぽい。
pry と pry-rails と rails の console 回りを軽く読んだけれど、 encoding 回りを触ってるのは見付けられなかったのでとりあえずの対症療法としてブログにまとめる。

読んでる時にちょっとおもしろかったものとか

  • Rails::Configuration に attr_accesor :x とかがあった。このパッと見 x が何か分からない感。
  • Pry.REPL#start ってメソッドがあって、 repl の loop を始めるメソッドらしいんだけれど
    • prologue
    • Input の handling
    • ensure epilogue
  • とかしていてなんかネーミングセンス良いなー、とか

根幹の原因

対症療法は分かったんだけれど、根幹の原因が分からないなー、ブログに書くかー、と思って再現する最小限の Gemfile を書いてたら、どうやら pry-rails そのものが問題じゃなくて rb-readline と組み合せるとダメみたい。
ちなみに再現する Gemfile は以下。

そのうちまた調べるかなー。