Pistolfly のすべての投稿

Software Engineer in Tokyo, Japan

Mac OS Xでobjdump、ldd

objdumpは、MacPortsでbinutilsをインストールすると、gobjdumpという名前で同等のものが使用できる。(頭にgが付く。)

$ sudo port install binutils

インストールされたコマンドを確認。

$ port contents binutils
Port binutils contains:
  /opt/local/bin/gaddr2line
  /opt/local/bin/gar
  /opt/local/bin/gc++filt
  /opt/local/bin/gelfedit
  /opt/local/bin/gnm
  /opt/local/bin/gobjcopy
  /opt/local/bin/gobjdump
  /opt/local/bin/granlib
  /opt/local/bin/greadelf
  /opt/local/bin/gsize
  /opt/local/bin/gstrings
  /opt/local/bin/gstrip
(以下略)

lddの代わりは、otool -L

$ otool -L /bin/ls
/bin/ls:
	/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
	/usr/lib/libutil.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)

screenコマンド

エスケープキャラクタ(コマンド文字)を変更するには

デフォルトだとC-aだが、これだと行頭への移動にC-aが使えなくなってしまう。
変更するには、~/.screenrcに

escape ^Zz

と指定する。(上記では、エスケープキャラクタをC-z、C-zを入力するためのキーシーケンスをC-z zに設定している。)

スクロールする

<コマンド文字> esc または <コマンド文字> [ でコピーモードにすると、viと同じキーシーケンス(C-b、C-f)でスクロールできる。
コピーモードから抜けるには、escキーを押す。

スクロールバック行数を増やす

コピーモードではviと同じキーシーケンスでスクロールできるが、デフォルトではバックスクロールできる行数は100行。これを増やすには、~/.screenrcに

defscrollback 10000

などと設定する。

文字化け対策

UTF-8モードでscreenを動作させるため、~/.bashrcなどに以下のaliasを設定しておくとよい。

alias screen='screen -U'

screenのmanページより

       -U   UTF-8 モードで screen を動作させる。このオプションは、ユーザの端末が UTF-8 エンコードされた文字を理解し、また送信してくることをscreen に伝える。また新規ウィンドウのデフォルトエンコーディングが 'utf8' になる。

現在のエンコーディングは、<コマンド文字> i で分かる。
例: C-z i (コマンド文字がC-zの場合)

       C-a i
       C-a C-i     (info)        現在のウィンドウに関する情報を表示する。

RVMが動作するようにするためには

screen上でRVMが切り替えられない。
RVMが動作するようにするには、~/.screenrc に

shell -${SHELL}

RVM: Ruby Version Manager - RVM inside Screen
USING SCREEN EXAMPLE part1

'xterm-256color': unknown terminal type.

Mac OS X Lion のターミナルで、Ubuntu(8.04 LTS)を操作していたら、
'xterm-256color': unknown terminal type.
というエラーが発生。

# top
'xterm-256color': unknown terminal type.

■解決方法
Ubuntuに、ncurses-term パッケージをインストールする。

# aptitude search ncurses-term
p   ncurses-term                    - Additional terminal type definitions
# aptitude install ncurses-term

'xterm-256color': unknown terminal type. | Erik Osterman

ActiveRecord::RecordNotSaved - before_save problem

ActiveRecordのクラスで、before_* コールバック がfalseを返すと、以降の処理がキャンセルされてしまうから、saveもされなくなる。
Rubyのメソッドは最後に評価された式が返り値になるから、うっかりコールバックがfalseを返してしまい、saveで変更が保存されず、「どうしてなのか?」とはまることがある。
そういう時は明示的にメソッドを
true
で終わるようにする。
after_* コールバックがfalseを返す場合も、以降のコールバックがキャンセルされてしまう。

If a before_* callback returns false, all the later callbacks and the associated action are cancelled. If an after_* callback returns false, all the later callbacks are cancelled. Callbacks are generally run in the order they are defined, with the exception of callbacks defined as methods on the model, which are called last.

Sketchpad - Dan Sketcher's personal blog » Blog Archive » ActiveRecord::RecordNotSaved - before_save problem

追跡ブランチを作成する

リモートブランチを追跡するブランチ(tracking branch)を作成する

git branch [branch] [remotename]/[branch]
git checkout -b [branch] [remotename]/[branch]

例:origin/serverfix を追跡するローカルブランチsfを作成してチェックアウト。

$ git checkout -b sf origin/serverfix

既存のローカルブランチにリモートブランチを追跡させる

既に手元にあるローカルブランチを、リモートブランチの取り込み先に設定したい場合や、追跡する上流のブランチを変更したい場合。

現在のブランチ

git branch -u [remotename]/[branch]

ローカルブランチを指定

git branch -u [remotename]/[branch] [branch]

例:現在のローカルブランチにorigin/masterを追跡させる。

$ git branch -u origin/master

例:ローカルブランチsfにorigin/serverfixを追跡させる。

$ git branch -u origin/serverfix sf

3.5 Git のブランチ機能 - リモートブランチ

cronでRVMのRubyを使う

現在のRVMでは、以下の方法では、
line 2: rvm: command not found
というエラーになります。
今はもっとよい方法があるので、以下をご覧ください。
cronでRVMのRubyを使う

RVMで複数のRuby環境がある場合に、Railsアプリケーションのためのcronをどうするか? Rubyのパスはフルパス指定すればいいが、gemがRVMのgemを見に行かないのが問題。RVM環境でcronを実行する必要がある。

  1. crontabでrvmのrubyを使う - 橋本詳解
  2. RVM and cron in production
  3. rvm+railsなアプリケーションをcronで動かす - sanojimaru.com

1.の方法にしてみた。
以下のような感じ。

cron用スクリプト

/home/pistolfly/app_dir/cron/delete_sessions.sh

source /home/pistolfly/.rvm/scripts/rvm
rvm use 1.8.7 > /dev/null
cd /home/pistolfly/app_dir
ruby script/runner -e production "ActiveRecord::SessionStore::Session.delete_all(['sessions.updated_at < ?', 1.day.ago])"

cronの設定

$ crontab -e
*/10 * * * * sh /home/pistolfly/app_dir/cron/delete_sessions.sh