2012年7月27日金曜日

[rails]vimでerbを書く時に便利なあれこれ

ul>li*3とかって書くと以下のように展開してくれるzencoding.vimがかなり便利なので、入れると良いと思います。
 
使い方
http://mattn.kaoriya.net/software/vim/20100306021632.htm 
インストール方法
http://d.hatena.ne.jp/sakurako_s/20110126/1295988873
↑のサイトに書いてある方法でMacにインストールしたら何かエラーがわらわら出て動かなかった。plugin/zencoding/と言うディレクトリも全部.vim/plugin以下にコピーしたら動いた。

2012年7月26日木曜日

[Rails]モデルがバリデーションに引っかかってないかチェックする

ActiveRecordでオブジェクトを作った後に#invalid?メソッドを実行すると、バリデーションに引っかかって無いかチェックできる。
class Person < ActiveRecord::Base
  validates_presence_of :name
end

Person.create(:name => "John Doe").valid? # => true
Person.create(:name => nil).valid? # => false
※参考サイトから引用

あと、#errorsを実行すると、バリデーションで見つかった全てのエラーを取得できる。

参考   http://wiki.usagee.co.jp/ruby/rails/RailsGuides%E3%82%92%E3%82%86%E3%81%A3%E3%81%8F%E3%82%8A%E5%92%8C%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%88/Active%20Record%20Validations%20and%20Callbacks

[Rails]ActiveRecordで代入を許すカラムを明示する

なんかscaffoldでモデルを作ったら、モデルにattr_accessibleと言うのが付け加えられていた。
 
# encoding: utf-8
class Product < ActiveRecord::Base
  attr_accessible :description, :image_url, :price, :title
end

これ何?と思って調べてみたら以下のサイトを見つけた。

 attr_accessible と attr_protected

どうも意図しないカラムに値が代入されないように制限したり(attr_protected)、代入しても良いカラムを明示したり(attr_accessible)する物っぽい。

なんか使ってみないと良く分からないから後で考えよう。

%記法

あー%{}で空白で区切った文字列を書くと、文字列の配列になるんですねぇ。
 
%w{ a b c }
#=> ["a", "b", "c"]
※このサイトの"%記法"の所参照
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fliteral.html

2012年7月24日火曜日

[Ruby]Array#group_byなんて便利そうなメソッドがあったんだへー

配列に対して#group_byと言うメソッドを実行して、ブロックで条件を渡してあげると、条件別に要素を分類してハッシュを返してくれるメソッドがあるらしい。

これは便利そう。
http://ref.xaio.jp/ruby/classes/enumerable/group_by

Arrayが持つその他のメソッドは、以下のWebサイトが参考になる。
http://www.namaraii.com/rubytips/?%C7%DB%CE%F3

[Rails]デバックをする時だけ使うメソッドやツール

Rails console

railsのディレクトリに移動してrails console(またはrails c)と打つと、irb見たいな対話実行環境が立ち上がってアプリ内で定義したモデルとかが自由に使える。

ちなみにGemfileにgem 'pry-rails'と追記してbundle installするとrails consoleがpryになる。

オブジェクトのコピーを作成

例えば、何かのオブジェクトを一覧で表示するようなviewを作っていた場合に、表示対象のオブジェクトが沢山あった場合にどんな見栄えになるか試したい時があると思う。

表示対象のオブジェクトが、簡単にデータを準備できる物なら良いんだけど、例えば、多対多の関連を持っていて中間テーブルがあるモデルだったり、関連する別のモデルをincludeしているデータだったりすると、ダミーのデータを大量に作成するのが面倒臭い。

テストコードを書くならならFactory Girlなどを使えば良いと思うんだけど、ちょっとviewの見栄えを確認する用途には向いてない。そんな時は、ダミーのデータを1つ作ってオブジェクトをコピーすると便利。

やり方は簡単で、コピーしたいオブジェクトの#copyと言うインスタンスメソッドを呼び出せば良い。#copyを実行する事でレシーバーのコピーが返却される。#copyは参照をコピーするだけで、値まではコピーしてくれないけど、とりあえず、viewの見栄えを確認するだけならこれでも役に立つ。

例えば以下のようにするとobjのコピーを100個作って返却してくれる。
しかも、#copyはObjectのインスタンスメソッドなのでほとんどのオブジェクトをコピーする事ができる。
 
def create_dummy_array(obj)
  dummy = []
  100.times do
    dummy << obj.dup
  end
  dummy
end

.all

モデル(例えばUser)に対してUser.allと言うメソッドを実行すると、全userのオブジェクトを返却してくれる。プロダクトを作る上で、全レコードが必要な事ってあんまり無いし、全レコード取得したら重たくて使えない場合が多いとは思うけど、デバックの時にはたまに便利。

.delete_all

User.delete_allでUserの全レコード削除。これもデバックの時にはたまに便利。

2012年7月23日月曜日

iPhone向けwebアプリを作るときiOSシミュレーターが便利

MacにXcodeインストールすると、こんなの↓が同梱されているので、iPhone/iPad向けのWebアプリを作っている時に便利です。


なんか、iOSシュミレータの実行ファイルはすごく深い階層にしまい込まれているので、以下のサイトを参考に探すと良いかと思います。
http://harayu.com/web-work/xcode4-3-ios-simulator-5-0

Xcode4.3以降、実行ファイルの場所が変わっていたのでメモ。

YAMLで何か継承みたいな事

rubyでプログラミングをする時に、よく使われるyaml形式について、今日初めて知った事があるので、記載する。
※yamlとは:http://jp.rubyist.net/magazine/?0009-YAML

なんかこう、仮に以下のように「developmentとproductionで大体同じ値なんだけど、productionのfugaだけちょっと値を変えたいなー」ってデータがあったとき、共通の部分を切り出したくなると思います。

 
development:
  hoge: 'common'
  fuga: 'common'
production
  hoge: 'common'
  fuga: 'production'

こう言う時に、yamlのマージと言う機能を使うと、以下のように書く事が出来ます。

 
common: &common
  hoge: 'common'
  fuga: 'common'
development:
  <<: *common
production:
  <<: *common
  fuga: 'production'                                

developmentとproductionはcommonの値を継承して、productionのfugaだけ値を上書きしてます。
便利ー

http://jp.rubyist.net/magazine/?0012-YAML
※この記事の「マージ」のあたりに詳しく書いてあります。

railsの実行モードを指定する

rails server起動時の実行モード指定

rails sでrails serverが立ち上がるけど、そこに-eで実行モードを書いてあげると、test, development(これはデフォルト), productionなど好きなモードで起動できる。
http://railsdoc.com/search#ローカルでサーバを起動(rails server)

rake db:migrateの実行モード指定

db:migrateの時とかもrake sb:migrate RAILS_EVN=testとかで実行モード指定できる。
http://akr97.com/capsule/?p=871
※「Railsの実行モード」のあたり。

その他には?

実行したいrailsのコマンド + "実行モード"とかでググるといいかも。

2012年7月20日金曜日

rubyとrailsについての情報源

興味あるテーマについてはてぶを検索してブクマ数でソートとかすると良い。
例)http://b.hatena.ne.jp/search/tag?sort=popular&q=pry

あと、このブログRubyについての情報満載で楽しい。
http://melborne.github.com/2012/07/16/ruby-methods-analysis/

RubyとRailsをデバックするときのアレ

前に書いた、最近しったRubyとRailsをデバックする時に便利なあれこれの続き。

gem 'rails-debug'

実行中のrailsアプリをbreakpointで停止させて、周辺のソースを表示したり、p 変数で変数の中身を除いたり。シンプルで便利そう。でも使った事無い。

gem 'pry'

rubyの対話実行環境です。irbがリッチになった感じ。
対話実行環境としてだけでなくデバッガとしても使えます。railsのなかにbinding.pryと言うコードを差し込むとそこがbreakpointとなってコンソールでデバックできるようになります。rails-debugとpryの使い分けは好みでしたら良いと思う。

raise

railsの任意の場所にraiseと言うコードを差し込むと、例外が発生してrailsが止まる。raiseに引数を渡してあげると、railsのエラー画面に表示されるので、手軽に確認したいときには使ってはどうか。

"!"は破壊的・非破壊的メソッド両方がある時に付ける。/コマンド・照会の分離について

以前、delete_ifって破壊的メソッドなのか…って記事を書いた。

記事の中で、
もしかして、"!"は、あくまで破壊的なメソッドと非破壊的なメソッド両方がある場合に両者を区別しやすくする時に付ける物であって、元々破壊的なメソッドしか無い場合には付けないものなのか....?
って書いたけどやっぱりそうっぽい。

どなたがどんな経緯で公開している資料か分からないけど、Rubyコーディング規約の「メソッド名」の項目に、
破壊的なメソッドと非破壊的なメソッドの両方を提供する場合、破壊的なメソッドには`!'を付ける。
って書いてあった。

ところで、本題からずれるんですけどreject!とかdelete_ifって、オブジェクトの状態を変えた上で戻り値を返すから、clean codeにのっていたコマンド・照会の分離原則に反するような気がするんだけど…

routesってCoCじゃなくね?

routesってなんか書き方よくわからんし、CoCじゃない感じがする。
routesについては何かいろんな意見があるっぽくてこんなスライドがあった。

http://www.slideshare.net/tkawa1/routesrbshibuyarb20120718

2012年7月19日木曜日

rails.vimの便利なコマンド

vimでRailsアプリを開発するときに便利なコマンド

:R

controllerの*.rbを開いている時に:Rを打つと、該当するviewを開いてくれる。
viewを開いている時に:Rを打つと、該当するcontrollerを開いてくれる。
便利。

gf

controllerでも、viewでも、モデル名にカーソルを合わせて、gfと打つと該当するモデルを開いてくれる。ちなみにgemにあるモデルとか、app/models/以下に無いモデルは開いてくれないっぽい。
gfでモデルを開いた時、これまで開いていたファイルがバッファと言う領域に行くので、戻りたい時には、バッファを切り替えると良い。

:R, gfその他について

バッファの切り替えについて

入力補完

Control + pで入力補完をしてくれる。同じファイル中で前方一致する文字列を候補として上げているらしく、すごく気が利いた補完をしてくれる訳では無いけど、長い変数名を入力する時とかに便利。

Vimでファイルの文字コード変換

なんかMac版ExcelでCSVファイルを作成したら文字コードがshift-jisになって、utf-8で保存するオプションとかも無いらしくすごく困った。

ファイルを一回Vimで開いて、文字コードを変えて保存し直したらutf-8に出来た。

読み直す
http://nanasi.jp/articles/howto/file/open-with-format.html

文字コードを指定して保存
http://nanasi.jp/articles/howto/file/save-with-format.html

最近しったRubyとRailsをデバックする時に便利なあれこれ

#pp

pと似てるけど、改行などで表示を整形してくれるのでpより見やすい。

#inspect

obj.inspectでオブジェクトの中身が文字列として帰ってくる。ほとんどどんなオブジェクトでも実行できるっぽい。

#class

obj.classでオブジェクトのclassが取得できる。どんなオブジェクトでも実行できるっぽい。

#superclass

class.superclassでクラスのスーパークラスが取得できる。クラスに対してのみ実行できるっぽい。

#caller

コードの中におもむろにcallerと書くと、callerを書いた場所がどこから呼び出されたか分かる。

tail

これlinuxのコマンドなんだけど、ファイルの末尾を指定した行数表示してくれる。railsのlogファイルとか見るときに便利。

tail -200 → 末尾200行を表示
tail -200 -f → 末尾200行を表示。追記されたらリアルタイム更新

など。grepと組み合わせるとさらに便利。

以上


2012年7月12日木曜日

[raisl]rakeのタスク一覧

rakeのタスク一覧を見つけた。
今までrake db:migrateしか殆ど使わなかったけど他にも便利な機能があった。

http://pentan.info/ruby/ror/rake_list.html

Vimでファイルの差分を取る

このコマンドで差分を取れる。普段vimで開発しているのでvim上で差分を確認しながら作業ができて便利。
:diffsplit 差分を取りたいファイル

ちなみにverticalと付けると画面を縦に分割出来る。
:vertical diffsplit 差分を取りたいファイル

http://nanasi.jp/articles/howto/diff/diff_text.html

2012年7月11日水曜日

RubyのArrayやHashにどんなメソッドがあるのか調べる

この逆引きRubyと言うサイト、RubyのArrayやHashなどよく使うクラスのメソッドなどが丁寧に解説されていてとても重宝です。

http://www.namaraii.com/rubytips/

Rubyの特異クラスって何に使うの?

はじめてのRubyを読んでいたら、"特異クラス"と言う概念が出てきました。

特異メソッドが特定のオブジェクトだけに定義されたメソッドだとしたら、
特異クラスは特定のオブジェクトためだけに定義されたクラスにあたる見たいです。
(Singleton パターンと似ているけど、特異クラスはオブジェクトを生成したで定義できる点が異なるっぽい)

それで、この特異クラスなんですが、何の役に立つのか良く分からなかったので、ちょっと調べてみたところ、こんな記事がありました。

結局、Rubyの特異メソッドって何なの?

なるほど、特異クラスは、特異メソッドを定義する時に内部的に使われているのか…
もしかしたら、特異クラスはユーザーが普通にプログラミングする時に積極的に利用するような仕組みでは無いのかなー。と、思いました。

2012年7月10日火曜日

delete_ifって破壊的メソッドなのか…

Rubyでプログラムを書く時に「仕様では無いけど慣習になっている書き方」ってあると思います。

例えば、真偽値を返すメソッドはメソッド名の最後に"?"が付く。などです。
(#blank?, #nil?)など。

こう言った慣習の一つに、「"!"が最後に付くメソッドは破壊的なメソッド」と、言うのがあります。

例えばArrayのメソッドに#rejectとと言うメソッドと#reject!と言うメソッドがあり、!が付いている方は破壊的なメソッドで、付いていない方は破壊的でないメソッドです。

こう言った慣習は分かりやすくて良いのですが、例外もあるようです。
今日、Array#delete_ifと言う"!"が付いていない破壊的なメソッドを、破壊的で無いメソッドだと勘違いしていてハマりました。

慣習は便利ですが、実際の動作も良く確認しないといけないですね。

追記:もしかして、"!"は、あくまで破壊的なメソッドと非破壊的なメソッド両方がある場合に両者を区別しやすくする時に付ける物であって、元々破壊的なメソッドしか無い場合には付けないものなのか....?

Railsでページネート

WebページのUIデザインのパターンにページネートと言うのがあります。
ページネートの例
こんな感じで、アウトプットを複数のページに分けるUIの事です。
ページネートを行う事で、ロード時間の短縮や、スクロールを減らす効果が期待できると思います。

さて、Railsにはページネートのプラグインがいくつか配布されているようです。
その中でも"kaminari"と言うgemをがメジャーなようです。
以下のWebサイトにわかりやすく使い方が書いてあったので、貼っておきます。 http://memo.yomukaku.net/entries/238

Ruby1.9で導入された新しいハッシュリテラル

ハッシュの新しい記載方法がRuby 1.9で追加されている。
今更だけど今日知った。

・新しいリテラル
今までこう書いていた物を、
 {:a=>"a", :b=>"b"}
こう書いても良くなりました
{a: "a", b: "b"}

シンプルでいい!

2012年7月9日月曜日

Railsのリファレンスはここにあります!

http://railsdoc.com/

RubyやRailsについて、代表的な書き方や注意点は書籍やブログで見つけられるけど、細かい情報やたまにしか使わないナレッジは、なかなか情報が見つけられない事があるので、そんな時はリファレンスを見ると良いんじゃないかと思います。

#{}とか

#{}とかについてgoogleで調べたい事があったけど、検索サイトは基本的に記号での検索を受け付けないので困った。
こう言った場合は、検索エンジンよりリファレンスで調べるのが良いと思った。

http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fliteral.html

RubyistのためのWebマガジン「るびま」

「るびま」と言うWebマガジンがあり、Rubyの技術的なナレッジや、Ruby関係のコミュニティ活動のレポートなどが満載なので、まだ読んでない方は読んでみるといいかもしれません。

「るびま」
http://jp.rubyist.net/magazine/?CategoryIndices

色々な記事がありますが、私はRspecについて書かれた↓の記事なんて好きです。
http://jp.rubyist.net/magazine/?0021-Rspec

RubyとRailsを中心にしたQAサイトQA@IT

何かエラーが出てハマった時に、はてなやOKWaveなどのQ&A系のサイトに載っていた情報に助けられた事って無いでしょうか?
私は良くあります。


こう言ったQA系のサイト、結構いろんなサービスがありますが、なかでも@ITが運営しているQA@ITが興味深いです。

このサイト、RubyとRailsについてのQAがかなりあるので、Ruby & Rails使いの方々は一度のぞいてみてはいかがでしょうか?

http://qa.atmarkit.co.jp/

2012年7月5日木曜日

Controllerからhelperを呼び出す方法


Railsでview作るときに便利なのがhelper.

helperを使う事で、出力を整形したりとか、urlを生成したりと言ったviewに関係が深い処理のロジックをviewから分離する事が出来る。

Railsに標準で準備されているものもあるし、自分で作る事もできる。

このhelperをcontrollerから使いたいときがある。
そんなときは、controllerでhelperをincludeすると使えるようになる。


class HogeController << ApplicationController
  include HugaHelper
  ...
end

http://yusukezzz.net/blog/archives/1482

zshをvim風のキーバインドにする

.zshrcに以下の行を追加すると、zshでvimっぽいキーバインドが使える。

bindkey -v

たとえば、ddで一行削除したり、wで単語単位でカーソル移動したり。

便利すぎわろた。

http://news.mynavi.jp/column/zsh/004/index.html

historyにある特定のコマンドをもう一回実行する方法

Linuxで、historyコマンドを使うと最近実行したコマンドの一覧が出てくる。

この時に、!と行頭にある番号を入力すると、そのコマンドが再び実行できる。



http://www.tokaido.co.jp/syoko/handyman/history.html

便利

Linuxとかでファイル内検索

find で見つけたファイルを、パイプとxargsで、grepコマンドに渡す。
find . -type f | xargs grep "keyword"
との事。
http://www.softel.co.jp/blogs/tech/archives/2561

ちなみにこの方法で検索をかける時、svnでバージョン管理しているディレクトリを検索すると、.svn/text-baseと言うsvnが内部で管理用に使っているファイルも検索に引っかかってじゃま。

そんな時はgrepに-vオプションを付けて.svnを含まない行だけをフィルタしてあげると良い。

こんな感じ。

find . -type f | xargs grep "keyword" | grep -v ".svn"

vimでインデントを一括調整する方法

[control+v]で複数行を選択した後、>>または<<でインデントを一括調整できる。

このサイトがわかりやすかった。
http://d.hatena.ne.jp/eisenbach/20091213/1260725312

rubyにおけるループの制御


break
繰り返しを中断して、ループを抜ける。

next
現在の回を飛ばして、次の回のループに移る。

redo
同じ条件で、ループをやり直す。


http://www.mapee.jp/ruby/break_next_redo.html

irbの進化版pryを使おう

rubyの対話実行環境としては、標準でirbと言うのが用意されているけど、irbの進化版であるpryのほうが便利なのでpryを使いましょう。

railsのデバックにもグーです。

詳しくは以下。

http://labs.timedia.co.jp/2011/12/rubyist-should-use-pry.html

2012年7月4日水曜日

zshの簡単おまかせ設定

zshと言うShellがあり、コマンド補完やカラー表示など色々便利なんだけど、設定が面倒くさい。

・zshの概略
http://news.mynavi.jp/column/zsh/001/index.html


昨日、oh-my-zshと言うzshの設定をひとまとめにした物があるらしいので、早速入れてみた。

・インストール方法
http://d.hatena.ne.jp/naberon/20110202/OhMyZsh
・機能
http://d.hatena.ne.jp/mollifier/20101009/p1


shellにいい感じで色がついたり、コマンドを補完してくれたり、typoを修正してくれたりと、色々便利な設定が一発で入った。

便利。

vimでRuby on Rails開発


社内でvim勉強会があり、vimでRailsアプリを開発する際に便利なpluginがたくさん紹介された。
まずは、以下のpluginをインストールして見たいと思う。

rails.vim
vim-ruby

unite.vim
  unite-rails
最近使ったファイルの一覧や、今開いているRailsプロジェクトのmodelの一覧が見れる。
  unite-outline
ファイルをアウトラインで表示してくれる

svn-diff
コミット前に変更点を表示してくれる

yank-tmp
ファイルをまたいだyank
http://d.hatena.ne.jp/secondlife/20060705/1152110844

rvmで今使っているgemがあるディレクトリを確認する

$rvm gemset name で確認できた。 参考 http://d.hatena.ne.jp/tbrook/20110303/1298497876

文字列に一致するオブジェクトを取得する

Railsを導入すると、Stringにconstantizeと言うメソッドが導入される。 このメソッドを実行した時、文字列に一致するオブジェクトが読み込まれていれば、それを返してくれる。
 "Module".constantize #=> Module
 "Array".constantize #=> Array
http://doruby.kbmj.com/yoppi_on_rails/20080226/Rails_Ruby_String_1 より

VimでRailsアプリ開発

アプリを開発する時、便利なpluginについて。

1.Rails.vim
":R"でcontrollerとviewの切り替えが可能。controllerの場合、カーソルがある位置のメソッドに対応するviewが開く。
":Rmodel モデル名"で指定したモデルのコードに飛べる。
などなど

・出来る事
http://d.hatena.ne.jp/secondlife/20061222/1166781841
・インストール方法
http://blog.cloud-covered.org/archives/89

2.vim-ruby
rubyのコードに色を付けたり、インデントしてくれたり。

・インストール方法
忘れた。

2012年7月3日火曜日

erbで余計な空白と改行を消す

erbで以下のようなコードを書くと出力されるHTMLに空白が大量に出て残念な感じになる。

erb
    <% (1..9).each do |i| %>
  • <%= i %>
  • <% end %>
出力
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
<% %>で書いた部分の改行がHTMLのソースに表示されるからだ。
<% %>では無く<% -%>と、書くと改行が消せる。

erb
    <% (1..9).each do |i| -%>
  • <%= i %>
  • <% end -%>
出力
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
ちなみに<%- %>と書くと、<%- %>の行頭にある空白を消してくれる。
<%- -%>こう言う書き方もできる。
この機能をtrim_modeと言う。

なるほどー

Macでファイル名一括置換


Macでファイル名を一括置換したかった。

NameChangerと言うやつがシンプルで使いやすかった。
画面はこんな感じ。

http://vivasoft.org/macapp/utilities/2008265/

以下のURLからダウンロード出来る。
http://www.mrrsoftware.com/MRRSoftware/NameChanger.html

Redisとは何か


 Redisって使った事無いけどどんな物なんだろう?
以下のサイトに解説が乗っていた。

http://ameblo.jp/principia-ca/entry-11197286812.html
Redisとは「remote dictionary server」から名前が付けられたオープンソースのkey-valueデータストアです。
MemcacheDB等のKVSとの最大の違いは、格納するバリューがデータ構造というところです。
つまり、リスト・セット・ハッシュなどのデータ構造で格納できるのでバリューに対してアトミックな操作ができます。
との事。

Chromeはユーザーエージェントを切り替えられる

タイトル通り。
PCでスマートフォン向け製品の動作確認をしたい時に便利。

http://f.daccot.com/2011/12/13/10234/

ちなみにMacでChorome Developer toolを起動するには、option+command+Iをおす。

RAILS_ENVは追加できる


Railsにはデフォルトでdevelopment, test, productionという実行モードがあるが、追加も出来る。
例えば、上記の3つの他にstagingを追加したりできる。

追加の仕方。
http://opentechnica.blogspot.jp/2012/01/railsenv.html