Pryで過去の実行結果にアクセスするには、_out_ 変数を配列のように使うことができます。

   1  [1] pry(main)> "Hello, " + "world!"
   2  => "Hello, world!"
   3  [2] pry(main)> _out_[1]
   4  => "Hello, world!"
   5  [3] pry(main)> _out_[-1]
   6  => "Hello, world!"

同様に、_in_ 変数を配列のように使って入力文字列にアクセスできるようです。

   1  [6] pry(main)> _in_[1]
   2  => "\"Hello, \" + \"world!\"\n"

posted by Png genki on Tue 6 Mar 2012 at 11:35

Xcodeのバージョンアップをしてから、/Developer ディレクトリがなくなり /Applicationsの下に引っ越したようなので、 xcodebuildコマンドが動かなくなりました。

   1  Error: No developer directory found at /Developer. Run /usr/bin/xcode-select to up
   2  date the developer directory path.

xcode-selectコマンドで新しい場所を教えて上げる必要があるようです。

   1  xcode-select -switch /Applications/Xcode.app

これでok.

posted by Png genki on Mon 27 Feb 2012 at 16:44

.rvmrc ファイルを置いておくと自動的に使用するRubyのバージョンを切り替えられるので便利ですが、デプロイ先で利用する場合に毎回 .rvmrc を信頼するか Yes/No? と聞かれるのが自動化と相性が良くないので、

   1  % cd /path/to/.rvmrc
   2  % rvm rvmrc trust

しておくとその後何も聞かれなくなります。

posted by Png genki on Tue 13 Dec 2011 at 09:15

バックグラウンドジョブの一覧は

   1  % jobs

で得ることができますが、そのままではPIDがわかりません。

   1  % jobs -p

とやると PID を含めた結果が得られます。

posted by Png genki on Wed 26 Oct 2011 at 02:41

以下のようにメソッド引数のデフォルト値を設定すれば、 呼び出す時に省略することができます。

   1  def foo(a = nil)
   2    a
   3  end
   4  
   5  foo #=> nil
   6  foo("test") => "test"

では、引数が省略されたかどうか判別するにはどうすればいいでしょうか。 以下のようにすれば判別が可能です。

   1  def foo(a = (a_default = true) && nil)
   2    [a,a_default]
   3  end
   4  
   5  foo #=> [nil, true]
   6  foo("test") #=> ["test", nil]

Rubyの引数のデフォルト値は、式を記述でき、省略された場合だけ評価されるのでそれを利用できます。

posted by Png genki on Tue 9 Aug 2011 at 04:54

昔は mysql_retry_lost_connection というものがあったのですが、最近 (Rails-2.3以降) は config/database.yml の中で

   1  production:
   2    reconnect: true

とやるだけで、接続が切れた場合に再接続してくれるようです。 まあ、ここまで用意するならデフォルトでそうなってても良いと思うんですけどね。

posted by Png genki on Sat 11 Jun 2011 at 07:06

結構長いことredmineを使ってるのですが、wikiのサイドバーを作れることに最近気が付きました。

作り方は単純で Sidebar という名前のページを作ればok. サイドバーに入れる場合、見出しは h3 が良さそうです。

posted by Png genki on Fri 3 Jun 2011 at 04:56

iftopコマンドを使うと、特定のインターフェイス/ポート番号における通信量を調べることができます。

ローカルのポート1234への通信量を調べる例:

   1  iftop -i lo -B -f "dst port 1234"

転送されるデータ量を測定してチューニング、使ってるか使ってないかわからないサーバプロセスの発見などに使えます。

ubunut/debianなら、

   1  # apt-get install iftop

でインストールできます。

posted by Png genki on Tue 31 May 2011 at 06:23

bundlerを使うとRubyアプリケーションごとに閉じたgemの依存関係を構築できるので、gemのバージョンの違いや環境ごとの違いで悩まされることが減ります。 これは非常に便利なのですが、rakeやunicornのようにコマンドをインストールするgemの場合、

   1  % bundle exec unicorn

のように、bundle execを介して実行する必用があって面倒です。 しかし、rvmを使えばこれを賢く解決できます。

比較的新しめのrvmとbundlerが必用になるので、 あらかじめ最新版をインストールしておいてください。

まず、以下のように適当なアプリケーション名などでgemsetを作ります。

   1  % rvm gemset create foo-app

作成したgemsetは

   1  % rvm gemset use foo-app

のようにしてアクティベートできます。新規に作成したgemsetの中身は こんな感じになっています。

   1  % gem list
   2  
   3  *** LOCAL GEMS ***
   4  
   5  bundler (1.0.2)
   6  rake (0.8.7)

bundler-1.0.2はちょっと古いので、gem udpateして最新のbundlerにします。

この状態であらかじめ用意しておいたGemfileに従ってgemをインストールします。

   1  % bundler install --system

これで foo-app gemset にはGemfileで指定したgem群が入った状態になり、rake, unicornなどのコマンド群もrvmがいい感じに取り計らってくれます。 あとは、rvm gemset use xxx を使えば適宜必用なgem環境を切り替えることができます。

ただ、アプリケーションが複数ある場合に、頻繁にgem環境を切り替えるのは面倒です。 アプリケーションのrootディレクトリに .rvmrc というファイルを作って

   1  rvm use ruby-1.8.7-p302@foo-app

のように記述しておいておくと、cd した時にrvmが勝手にgemsetを切り替えてくれます。これで完璧ですね!

Bye bye gem hell!

posted by Png genki on Sat 28 May 2011 at 21:49

Rubyはメソッド定義内で begin/end が無くても直接rescueやensureを記述できますが、これは無駄な記述を減らす上でとても魅力的な文法だと思います。

   1  def foo
   2    puts "hello world :-)"
   3  rescue
   4    puts "something wrong :'-("
   5  end

この書き方のまま、所定回数だけretryしたい場合、retry回数を覚えておくカウンタ変数を用意する場所に困ったりするのですが (ローカル変数として定義すると、retry後に再初期化されてしまいますからね) 以下のように引数として用意しておくと、methodが定義するブロックよりも外側のライフタイムを持つので、retryカウンタとして使えます。

   1  def foo(bar = 0)
   2    puts bar
   3    raise 
   4  rescue
   5    bar += 1
   6    retry if bar < 10
   7  end
   8  
   9  foo

実行した結果は以下の通り

   1  0
   2  1
   3  2
   4  3
   5  4
   6  5
   7  6
   8  7
   9  8
  10  9

posted by Png genki on Sat 28 May 2011 at 01:29 with 1 comment