【Ruby】部分文字列を取得する、文字列操作の世界

メソッドの呼び出し元メソッドをを取得する方法を探していたのですが、

http://stackoverflow.com/questions/5100299/how-to-get-the-name-of-the-calling-method

puts caller[0][/`.*'/][1..-2]

というような表記がありました。実際うまく取得できるのですが、

[/`.*'/][1..-2]

はなにをあらわしているんだろう。。。
正規表現を文字列インデックスとして使ってるんでしょうかね。

ということで調べてみました。

# 正規表現をインデックス値とすることで、部分文字列が取得できる
str[/regexp/]
# => 文字列から正規表現にマッチした部分文字列を切り出す

'piyoPiyo'[/Pi/]
# => 'Pi'
# Rangeオブジェクトをインデックス値とすることで、部分文字列が取得できる
'12345'[0..3]
# => '1234'

'12345'[0..-1]
# => '12345'

'12345'[0..-2]
# => '1234'

知ってると便利ですね(∩´∀`)∩ワーイ

# 今年の4月からずっとPHPを触ってたのですが、ようやく最近Rubyを触れるようになってきました。
# たのしい!

【Rails】ajaxアプリをデバッグする(better_errorsを使い込む)

みなさまbetter_errorsは使っておりますか?
例外で止まったところのローカル変数等のを保持してくれた上で、
ブラウザ上でirbのようにコマンドを打って処理実行も行えるgemです。
さながら、CやJavaのデバッガで「ブレーク」させたような使い勝手で、
わたしは手放せなくなっています。

一点の不満は、ajaxでリクエストを投げたときにエラーが発生しても止まってくれない点、、、だったのですが、

http://localhost:3000/__better_errors

のように、__better_errorsにアクセスすれば、直前のエラー状態を確認できるそうです!
これはajaxデバッグが捗る!!!!!(∩´∀`)∩ワーイ

(バグ出さないほうが捗るわけですが、それはまた別のお話♫)


参考URL:
https://github.com/charliesome/better_errors/issues/17

【Ruby】どこでメソッド定義されているかを調べる

Railsをはじめて触ったとき

3.days

のように書けてしまうので驚いた方も多いのではないでしょうか。

Rubyでは、自分のソースコードの好きなところで

class Numeric
  # Numericクラスにfoobarメソッドを追加する
  def foobar
    p 'foobar'
  end
end

3.foobar
=> "foobar"

のように、基本クラスを拡張できてしまいますので、どこでメソッド定義されているのか探すのが大変です。

そこでRubyでは、Method#owner(), Method#source_location()という定義情報にアクセス出来るメソッドが用意されています。
それでは「3.days」がどこで定義されているか調べてみましょう。

m = 3.method(:days) # Methodオブジェクトが返却される
m.owner #  定義されているクラス
=> Numeric 
m.source_location # [パス, 行番号]という配列 
=> ["/path/to/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.8/lib/active_support/core_ext/numeric/time.rb", 49]

※source_locationはRuby1.9以降のメソッドです
ということで情報が得られたので、activesupportさんが基本クラスを拡張してることがわかったので、そのソースを読んでいけば良いです(*´ω`*)


他人のソースを読むときなどに、
「このメソッド、どのクラスで定義されているのかな」
とか、
「このメソッドが定義されている場所はどこかな、ソースコード上のどこで定義されているのかな」
と思った時に思い出すと幸せになれます。

Rubyでは、JavaEclipseのようにGUIで簡単に探す方法がなくて大変ですね。。)

参考URL:
http://ruby-doc.org/core-1.9.3/Method.html

【Ruby】(bundlerを使った)gemの作成・運用・公開

よーしパパgemを作って公開しちゃうぞー( ー`дー´)キリッ(←)
なときの備忘録です。

gemを作るワークフローにはさまざまなモノがあり、作成ライブラリもいくつかあって複雑に感じやすいと思いますが、
下記のbundlerを使う方法が一番シンプルで分かりやすいと思います。

(1)gemのプロジェクトを作る

$ bundle gem gem_name #基本となるファイルが作られる


(2)gemspecファイルを、空気を読みつつ直す

(3)version.rb を編集する
※同一バージョンででgemを再度公開しようとするとエラーが出ますので、
gem公開のたびにバージョンをインクリメントする必要があります。

(4)gemfileの作成

$ rake build

(5)ローカル環境へのインストール

$ rake install

(6)gemの公開

$ rake release


作ったgemをメンテしていく場合は、
(4)〜(6)
をやると良いです。

参考URL:
http://ja.asciicasts.com/episodes/245-new-gem-with-bundler

【heroku】プロセス管理コマンドあれこれ

よく使うものを、忘備録としてまとめます。特にワーカープロセスは時間課金・有料ですので、こまめに操作したほうがお財布にやさしいです(´・ω・`)

$ heroku ps # 起動しているプロセスを確認する
$ heroku ps:scale worker=1 # ワーカープロセスを1つにします。
$ heroku restart worker.1  # 1番目のワーカープロセスを再起動します。
$ heroku ps:scale worker=0 # ワーカープロセスを0にします。お財布のために大事!

$ heroku logs -p worker -t #ワーカープロセスのコンソールログを見る

【Heroku】任意のプロセスを再起動する

「Delayed Jobsが暴走しているっtっっっt(;ω;)再起動しなければっっt」なんて時のためのメモです。

普通に「heroku restart」 してしまうと、rails側も再起動されてしまうんですよね。
今回の方法は、任意のプロセスのみ再起動させる方法です。

まず、起動しているプロセスを確認します。

$ heroku ps

=== web: `bundle exec rails server -p $PORT`
web.1: up for 15h
web.2: up for 15h

=== worker: `bundle exec rake jobs:work`
worker.1: up for 15h

worker.1 のみを再起動します。

$ heroku restart worker.1
Restarting worker.1 process... done

これでおkです。

herokuでは、下記のタイミングで自動的に再起動してくれます。
・コードをデプロイしたとき
・configを変更したとき
・add-onを変更したとき
・メモリをたくさん使ったとき(512MBを3回だそうです)

なので、普段は再起動を意識する必要はないかと思います。
参考URL:
https://devcenter.heroku.com/articles/ps#process-restarts
https://devcenter.heroku.com/articles/dynos#automatic-restarts