maeshimaの日記

メモ書きです

メタプログラミングRubyのイディオム

メタプログラミングRubyでは、説明しやすくするために、各テクニックにそれぞれ名前を付けている。最初覚えるのは面倒だけど、覚えるとこれは必要な儀式だったんだなと思える。というわけでメモ。 動的ディスパッチ sendを使って動的にメソッドを利用するこ…

メタプログラミングRuby 1章

あるメソッドが定義されているかどうか調べる hoge.methods.grep /re/ のように、Enumerable#grep を使うと正規表現で調べられるので便利 オープンクラス 標準クラスにメソッド追加すると、既存のメソッドとかち合う危険性があるので、基本的にはよっぽどの…

Rails 3.1 の mass assignment

attr_accessible に :as オプションが付けられるようになったらしい。 class Project < ActiveRecord::Base attr_accessible :name, :as => :admin end のようにすると、 @project.update_attributes(params[:project], :as => :admin) のように、変更側で同…

モデル内で自分のテーブル名を返すメソッド

ActiveRecord::Base#table_name

windowsとlinuxのファイルシステム比較

Geekなぺーじ : Linuxにデフラグが無い理由

RSpecの新しい仕様

最近の記法は結構知らないので復習したい。 最近話題のRSpecのプレゼンの中で知らなかったこと - takihiroの日記

3.1.0.beta1の action_dispatch/url_for.rb のコメントの意訳

ActionDispatch::Routing モデルとかでURLを生成したい場合は、ActionController::UrlForを見るといい。 知ってると思うけど ActionController::Base#url_for はリンクを生成する。link_to や url_for は水面下で ActionController::UrlFor、特に ActionCont…

gem which

インストールしているgemのパスを表示するコマンド 例 gem which rails 参考 requireされいているRubyスクリプトを見つけて編集する方法 - Hello, world! - s21g

html2hamlでerbファイルをhamlに変換するワンライナ

ruby -e 'Dir.glob("**/*.erb").each {|file| system %Q! html2haml #{file} #{file.sub("erb", "haml")}!}'

eval(statements, binding, file, line)

第二引数で束縛を指定できる 第三引数と第四引数で、エラー時のスタックトレースで表示するファイルと行数を指定できる

TOPLEVEL_BINDING

トップレベルのスコープの束縛が入っている組み込み定数。

irbのネスト

irbの中でirbを使う(ネストする)ことができる。このとき、コンテキストは引数に渡したオブジェクトのコンテキストに変わる。 ruby-1.9.2-p180 :001 > s = "hoge" => "hoge" ruby-1.9.2-p180 :002 > irb s ruby-1.9.2-p180 :002 > reverse => "egoh"

複数行の文字列

普通にダブルクォートで複数行の文字列を扱うことが出来る。普通複数行にまたがる文字列を使いたいときはヒアドキュメントを使う。 puts "hoge fuga" 実行結果 hoge fuga

rvm wrapper

rvm wrapperは指定した ruby と gemset でrubyを実行できるコマンドを生成する。passengerとかで使われてる。 rvm wrapper 1.9.2@hoge fuga とすると、1.9.2 で gemset hoge の状態で実行できるコマンドが生成される ./rvm/bin/fuga_ruby ./rvm/bin/fuga_irb…

javascript_include_tagは複数の引数をとれる

一つだけかと思ってた>< javascript_include_tag "common.javascript", "/elsewhere/cools" # => <script type="text/javascript" src="/javascripts/common.javascript"></script> <script type="text/javascript" src="/elsewhere/cools.js"></script>

load

loadの第二引数にtrueを指定すると、第一引数で指定したファイルの実行時に無名モジュールを作成して定数の衝突を避ける。 requireの違い require は同じファイルは一度だけしかロードしませんが、 load は無条件にロードします。また、require は拡張子 .rb…

キーバインドを設定する関数 define-key と global-set-key の違い

define-key global-map global-set-key global-set-keyは単にdefind-keyをラップしているとのこと。この二つに大きな差はないらしい。何がグローバルセットキー`の違いは`と`を定義キーのグローバルマップは、`Emacsで

sudo-ext.elがうまく動かない件

3ヶ月前にsudo-ext.elがうまくいかない><というエントリを書いたら、id:rubikitch さん、id:handlename さんからアドバイスをいただきました。ありがとうございます!!!Macでsudo-ext.elを使う場合 - handlename::blog sudo-ext.elがうまく動作しない場…

ActionView::Helpers::TextHelper

Railsはかゆいところに手が届くなー。メモ truncate(text, *args) textが:lengthで指定した文字数より大きかった場合に、:lengthで指定した文字になるまで切り詰めて、:omission(デフォルトは"...")を末尾に付ける。これどうせバイト単位で日本語だとうまく…

はじめる!Cucumber第7〜9章

シナリオアウトライン 検証シナリオのおおよその流れ(アウトライン)自体は同じまま、複数のデータの組み合わせをテストするための機能。 "シナリオ"を"シナリオアウトライン"に変更する "bob"とか"alice"のようなデータ類を""のように<>を使った文字列に変更…

ログ削除のrakeコマンド

log配下の*.logのサイズを0にするrakeコマンド rake log:clear

RailsCasts - Testing JavaScript with Jasmine

Railscasts - Testing JavaScript with Jasmineを見て。jsのユニットテスト環境 jasmineについて。基本的にRspecライクな書き方でjavascriptのユニットテストを実行することができる。すごく使えそう!!! rake jasmine でサーバ立ち上げてアクセスするとテ…

はじめる!Cucumber第6章

基礎は終わったのかも。主にシナリオをリファクタリングするテクニックについて。 背景 背景を使うと、各シナリオで共通の箇所を一箇所にまとめることに出来る。これってフィーチャ内の全てのシナリオで共通なのかな?→共通のようだ 複数のステップを呼び出…

seeds.rbについて雑感

seeds.rbはmigrationにデータを変更するコードを書くのをやめよう!という思想が入ってるらしいけど、データの初期化はともかく、運用途中でデータを変更するのは結構めんどそう。マスタデータ変更系でもseeds.rb使った方が良いんだろうかRails 2.3.4で追加…

elispの関数

やさしいEmacs-Lisp講座の第三章に出てくる関数をざっとまとめたメモ。 移動境界の検査 bobp ポイントがバッファ先頭にあればt,なければnilを返す eobp ポイントがバッファ末尾にあればt,なければnilを返す bolp ポイントが行頭にあればt,なければnilを返す …

auto_link

Rails3.0.6ではauto_linkの脆弱性が修正されたらしい。auto_linkは文字列中にあるURLやメールアドレスにaタグ付けて返すメソッド。あんまり使わないから忘れがちなんだけどこの際覚えよう。 post_body = "Welcome to my new blog at http://www.myblog.com/.…

空文字をカラムに代入したときの挙動

textやstringのカラムに空文字代入して保存したときにnilになるのか空文字になるのかよくわかってなかった。空文字代入のときは空文字が保存されるみたいね。integerや datetime は空文字代入したら nil になる(当たり前だけど)。

Enumerableその1

メモ Enumerable#cycle object.to_a.cycle と同じ Enumerable#drop オブジェクトの最初の n 個を捨てた配列を返す。非破壊的。Enumerable#firstと対をなすメソッド ary = [1, 2, 3] ary.drop(2) #=> [3] ary #=> [1, 2, 3] Enumerable#drop_while ブロック内…

BBモバイルポイントに接続

ずーっとつながらなくて諦めていたのだけれど、今日ローカルのDNSを使うように設定(127.0.0.1)していたのを削除してみたらつながった。 追記 firefoxだと認証ページへ遷移しない。chromeだといけた

ASCIIcasts - Decent Exposure

ASCIIcasts - “Episode 259 - Decent Exposure”を読んで。decent_exposureという、コントローラでインスタンス変数に値をセットする部分を簡単にするgemについての記事。 def show @article = Article.find(params[:id]) end のような、コントローラ中に書く…

セグメンテーション違反

アクセスが許可されていないメモリ上の位置、もしくは許可されていない方法でメモリ上の位置にアクセスしようとするときに起こる 参考 セグメンテーション違反 - Wikipedia

Redisの特徴

キーバリューストア LIST, Set(重複のない集合), SORTED SET(ソート済みの集合), HASH(連想配列)が扱える. 基本はインメモリだけどディスクでも使える。ただしいまのところディスク使うと不安定 参考 ニコニコ生放送に見る Redis 活用ノウハウ:第1回 インメ…

bundle install --local

rubygems.orgに接続せずに、vendor/cacheを使うオプション

正規表現の後方参照

なんかこんがらがるのでメモ 正規表現中で参照したい場合は\1,\2,\3... 正規表現後で参照したい場合は$1, $2, $3...

Paperclipのstyleの記述方法

resizeだけ指定したいときは文字列だけでいい has_attached_file :avatar, :style => {:large => "640x640>"} 拡張子を指定しないといけないときは配列 has_attached_file :avatar, :style => {:large => ["640x640>", "jpg"]} ハッシュでもいい。ハッシュだ…

ImageMagickの引数

メモ options size 画像の幅と高さ pseudo-image formats canvas 前はxcで指定していたらしい?sizeやdepthで指定した画像を作る。canvas:red や canvas:#FF0000といった形で色を指定する。指定しないとwhiteになる。sizeを指定しないと1ピクセルの画像にな…

jQuery.fn.end(), jQuery.fn.map()

忘れないためにメモ jQuery.fn.map() - maeshimaの日記 jQuery.fn.end() - maeshimaの日記 jQuery.extend - maeshimaの日記

git describe --contains

git

git describe --contains 渡されたコミットを含むタグを使ってコミットに名前を付けるコマンド describe --contains を何のために使うのか、も知っておくと良いですね。「あの機能が入ったこのコミットは、どのリリースに入っているのかな」つまり「どのリリ…

PaperClip::ClassMethods#has_attached_file

ドキュメントの意訳。has_attached_fileはクラスにファイル用の属性を追加する。通常はどこかに置いてあるファイルか、もしくはユーザがアップロードしたファイル。その属性はPaperclip::Attachementオブジェクトを返す。これによってファイルをモデルの普通…

datetime形式の入力を厳密にチェックしたい場合

datetime形式のパラメータは params[:hoge][:date(1i)], params[:hoge][:date(2i)], params[:hoge][:date(3i)] のように分かれてくる。このパラメータをmass assignmentでdatetime形式のカラムの属性に代入すると、railsが気を利かせて解釈してくれてDateTim…

ActiveRecored::Base#save!についての雑感

これまでActiveRecored::Base#save!を多用してたけど、複数のモデルを一度に保存する場合、save!だと一つの「モデルのバリデーションしか行われない→エラーメッセージが一部しか表示されない」という弊害があるな。そういうときはsaveメソッドを使うといいね…

after_validation

validateの後に実行されるコールバック。validate中にエラーチェックに引っかかる項目があっても実行される。エラーをチェックする条件が複雑なものを別メソッド(やモジュール)に出して、validationするタイミングは同じにしたいようなときに使える・・・と…

migration中に変更したカラムを使いたい場合

ActiveRecord::Base#reset_column_informationを実行して、カラムの情報を一度リセットしないとエラーになってしまう。下記のソースはrailsのドキュメントからの引用。 class CreateJobLevels < ActiveRecord::Migration def self.up create_table :job_leve…

今週のRailscasts - Decent Exposure

Railscasts - Decent Exposureを見て。下記のような、よくコントローラ中に書かれる、インスタンス変数にオブジェクトを代入する処理をまとめてかけてDRYにするgem。 @articles = Article.all ざっと見た感じではなかなか使えそうな気がした。コントローラを…

yasnippetのコマンドとファイルの内容

yas/new-snippet 新しいsnippetの登録。今居るbufferからsnippetを保存するのに適切なディレクトリを選択してくれて、snippet-modeで新しいファイルを開く。 yas/find-snippets 定義用のディレクトリを開く yas/visit-snippet-file 今居るバッファから定義を…

ediff

デフォルトで使えるemacsでのdiff。今日初めて使ってみたけどなかなか便利に使えた。 M-x ediff-buffers M-x ediff-files とかで対象を二つ選ぶ。nやpで次の差分に移動。ただデフォルトだとediff実行するたびに新しいframeが作られて面倒。下記のようにする…

今いるバッファのsnippetを見る

!!! M-x yas/visit-snippet-file (今いるバッファのスニペットから選ぶ)もしくは M-x yas/find-snippets (スニペットのディレクトリから探す) http://d.hatena.ne.jp/kiwanami/20110224/1298526678 もっとyasnippet使いこなしたい! yasnippet - maeshim…

y

script/console中でyamlに変換してくれるメソッドらしい。script/console - うんたらかんたらRuby - Rubyist

git pullしたときにできるmergeコミット

git

merge(pull)したときに、fast-forwardマージじゃない場合、「mergeしたコミット」が作られる。 このpullしたときにmergeしたコミットが作られるのってどうにかできないのかな。入門Gitメモ chapter 5 - maeshimaの日記

validates_uniqueness_ofを付けるときにはDBのindexにもunique制約つけるべき

メモ。validates :uniquenessはuniquenessを保証しないのでDBにindexをつけましょう!