Xcode4をvimのキーバインドで!

XcodeVimキーバインドで操作できないかな・・・とか,思っていたら神出現!
Vimキーバインドにしてくれるプラグインがありました.
Nothing But Programming - Software

環境

インストール

XVim_lite.zipをダウンロードします.
『$(HOME)/Library/Application Support/Developer/Shared/Xcode/Plug-ins』の下にzipファイルを移動させて,解凍します.
(Plug-insディレクトリがない場合は作ってください)
Xcodeが起動している場合は,再起動してください.
これで,Vimキーバインドで操作できるようになりました!


まだ,使える機能は少ないですが・・・無意識にh,j,k,lで移動しようとか,:wで保存しようとして「プギャー!」となってしまったり・・・「なんでVimキーバインドじゃないんだ!」と不満を持っている人にはとてもお勧めできます.

Pryのインストール

irbと同様にREPL環境を提供してくれるものにPryがあります.
なにやら,Ruby界では人気が出ているようで・・・早速インストールです.

環境

pryのインストール

pryはgemからインストールできます.
pry-docというドキュメントともついでにインストールしてしまいましょう.

$ gem install pry pry-doc

使い方

$ pry 
[1] pry(main)>

irbと同じように使えます.
結果が色付きだったり,irbではできないこともできるみたいです.

詳しくは,Rubyistよ、irbを捨ててPryを使おう - TIM Labsを参考にしてみてください.

irbコマンドでpryが起動するように

.zshrcなどに下記を追加するとよい.
追加したら「source .zshrc」で設定を反映させればOKです.

alias irb='pry'

rbenvのインストール

なにやら,rvmよりも扱いやすいrubyのバージョン管理ツール『rbenv』なるものがあるようです.
ちょっとインストールしてみました.

環境

rvmのアンインストール

rvmと競合するおそれがあるみたいなので,サクっとアンインストールします.

$ rvm implode

アンインストールが終わったら,.bashrcや.zshrcに書かれている設定を消してください.
私は,.rvmrcも残っていたので,それも削除しました.

rbenv のインストール

rbenvのインストールです.
Homebrewからインストールできるようです.
ruby-buildも必要みたいなので一緒にインストールして下さい.

$ brew install rbenv
$ brew install ruby-build

パスを通す

このままでは,rbenvというコマンドが使えないのでパスを通します.
使っているシェルの設定ファイル(.bashrcや.zshrcなど)に下記を追加します.

export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"

source では設定が反映されないみたいなので,ターミナルを再起動してください.

  • rbenvでRubyをインストール

rbenv install をしようとしたらgccがないと怒られました.
Lionさんからgccを扱わなくなったためですね,

$ rbenv install 1.9.0-p0

ERROR: This package must be compiled with GCC, and we
couldn't find a suitable `gcc' binary on your system.
Please install GCC and try again.

As of version 4.2, Xcode is LLVM-only and no longer
includes GCC. You can install GCC with these binary
packages on Mac OS X:

https://github.com/kennethreitz/osx-gcc-installer/downloads

BUILD FAILED

メッセージに書いてあるとおり,
https://github.com/kennethreitz/osx-gcc-installer/downloads からGCCのパッケージをダウンロードして,インストールしてください.

再度,インストールとデフォルト指定します.

$ rbenv install 1.9.3-p0
$ rbenv global 1.9.3-p0
$ rbenv rehash

確認

$ which ruby
/Users/ユーザ名/.rbenv/shims/ruby

となっていれば上手く設定ができてます.


さて,rvmと比べてどうだろうか?

Drag & Drop UpTeX で文字化け

Drag & Drop UpTeX を使って,PDFファイルを作ったら文字化けが!!
はい,オプション忘れていました.(3時間ぐらい悩んだんですよね)

$ platex xxx.tex
$ dvips -Phira xxx.dvi
$ ps2pdf xxx.ps

dvipsを使うときは -Phira オプションの付け忘れに気をつけましょう.

演算子の優先度と副作用について

C言語はかなり長い間お付き合いをしているが,演算子の優先度と副作用あたらりがどうやら怪しいらしい.
ポインタ並に難しいのではないかと思う,今日この頃です.
とりあえず,簡単に自分的まとめ


演算子の優先度

演算子 結合規則
() [] -> . ++ --(後置) 左から右
! ~ ++ --(前置) + -(符号) * &(アドレス) (type) sizeof 右から左
* / % 左から右
+ - 左から右
<< >> 左から右
< <= > >= 左から右
== != 左から右
& 左から右
^ 左から右
左から右
&& 左から右
|| 左から右
? : 右から左
= += -= *= /= %= &= ^= |= <<= >>= 右から左
, 左から右

この表は覚えておいて損はないのですが・・・一つ疑問.

後置演算子が優先度高いってどういうことなんだ?

int i = 0,sum;
sum = i++;

とかあった場合,どの段階でiの値が増加するかと言うと,;が来る前までに増加します.
つまり,sumには増加するまえのiの値が入り,その後にiが1増えるという.
・・・なんか表を見てると納得いかない.

ちなみに前置演算子の場合は

int i=0, sum;
sum = ++i;

だと,iの値が増加してからsumに代入されます.
これは,納得なんですよね.
だって,前置演算子の方が表を見る限りでは優先度が高いですからね.


これはどうなるのでしょうか?

int i = 0, a[3];
a[i] = i++;

私の環境では,a[0]にiの値が入ってから,iが1増加しました.
ちなみに,コンパイラによって動作は変わります.
つまり,iの値が増加してから,a[1]に値が入る場合があるかもしれないということです.
前置・後置演算子副作用を発生させやすいのです.(う〜ん,難しくなってきた)


次の場合のsumの値はどうなるのでしょうか?

int sum, i =0;
sum = ++i * ++i * ++i;

私の環境では,「12」でした.
おそらく,左と真ん中の「++i」が1づつ増えてから掛け合わされて,右の「++i」が1増えてから左と掛け合わされたものかと・・・.(何言ってるのかさっぱりになってきた)
ちなみに,これもコンパイラによって結果が変わります.


今まで演算子の優先順位と副作用についてかるーく説明しましたが,ここで重要なポイント!

優先順位と結合規則によって式の意味はきまります.
しかし,どういう順番で計算されるかは,わかりません!!

なんじゃそりゃ!!!
優先順位と結合規則はあくまで「目安」であって,計算はその値になるように適当にやられてるっぽいです.
(ある意味すごいのかも?)

・・・C言語恐るべし

rails s で「WARN TCPServer Error: Address already in use - bind(2)」エラー

Rails サーバを起動しようとしたらエラーがでました。
こんな感じです。

$ rails s
=> Booting WEBrick
=> Rails 3.1.3 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-01-12 13:49:02] INFO  WEBrick 1.3.1
[2012-01-12 13:49:02] INFO  ruby 1.9.3 (2011-10-30) [x86_64-darwin11.2.0]
[2012-01-12 13:49:02] WARN  TCPServer Error: Address already in use - bind(2)
Exiting
/Users/shiori/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/utils.rb:85:in `initialize': Address already in use - bind(2) (Errno::EADDRINUSE)
	from /Users/shiori/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/utils.rb:85:in `new'
	from /Users/shiori/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/utils.rb:85:in `block in create_listeners'
	from /Users/shiori/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/utils.rb:82:in `each'
	from /Users/shiori/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/utils.rb:82:in `create_listeners'
	from /Users/shiori/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/server.rb:82:in `listen'
	from /Users/shiori/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/server.rb:70:in `initialize'
	from /Users/shiori/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:45:in `initialize'
	from /Users/shiori/.rvm/gems/ruby-1.9.3-p0/gems/rack-1.3.5/lib/rack/handler/webrick.rb:10:in `new'
	from /Users/shiori/.rvm/gems/ruby-1.9.3-p0/gems/rack-1.3.5/lib/rack/handler/webrick.rb:10:in `run'
	from /Users/shiori/.rvm/gems/ruby-1.9.3-p0/gems/rack-1.3.5/lib/rack/server.rb:265:in `start'
	from /Users/shiori/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands/server.rb:70:in `start'
	from /Users/shiori/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands.rb:54:in `block in <top (required)>'
	from /Users/shiori/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands.rb:49:in `tap'
	from /Users/shiori/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands.rb:49:in `<top (required)>'
	from script/rails:6:in `require'
	from script/rails:6:in `<main>'

これの原因なのですが、どこかでWEBrickを使用していたりすることが原因みたいです。
自分の場合は、Rubyサーバが動いていたことが原因でした。
・・・起動した覚えがないんだけどな。

プロセス確認は次のようにしてみましょう。

$ lsof -i:3000                                                                                                
COMMAND  PID   USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
ruby    2181 shiori    9u  IPv4 0x11ba7338      0t0  TCP *:hbci (LISTEN)

WEBrickだと、Ruby関係が多いので次でも確認ができます。

$ ps -af | grep ruby                                                                                          
  501  2181  2111   0  2:02PM ttys001    0:03.27 /Users/shiori/.rvm/rubies/ruby-1.9.3-p0/bin/ruby script/rails s

プロセスをkillしてあげれば問題なく動きます。

kill -9 2181

参考
http://d.hatena.ne.jp/is0me/20100108/1262946770