Ruby

Ruby で to_yaml するときは、改行コードを LF で統一する。

Ruby 付属の YAML モジュールは、下のような動作をする。文字列を直接 to_yaml した時だけでなく、配列やハッシュの値だった場合も同じ。 "\r"をto_yamlしてloadするとnilになる。 "010\r"をto_yamlしてloadすると8になる。 "010\n"をto_yamlしてloadすると"…

Gemのパスを動的に変える方法。

Gem.pathにunshiftしただけではうまくいかない。ソースを見ながら試行錯誤して、以下でrequireできるのを確認した。 Gem.path.unshift("/path/to/your/local/gem") Gem.source_index.spec_dirs = Gem::SourceIndex.installed_spec_directories Gem.refresh …

RubyでハッシュをパラメータにしてHTTPリクエストを送信する。

以下の3つのことをまとめて実行するメソッドを書いた。 Hashからクエリー文字列作成。 URLのパース。 Basic認証。 response = http_request("get", "http://www.example.com/search", {:id => 123, :name => "koseki"}, "user", "pass") みたいにして使う。 …

gemをホームディレクトリにインストールしない設定。

gem installでsudoを付け忘れると~/.gem/以下にgemがインストールされてしまう。予想外なgemを参照していたりして気持ち悪い。 アンインストール --install-dirを付ける。 $ gem uninstall activerecord --install-dir ~/.gem/ruby/1.8gemの一覧を得る方法は…

erbのタグをエスケープするには <%% とパーセントを2つ書く。

erbでerbを出力したいことがたまにあるのでメモ。 <%% escaped %>閉じるほうは2つ書く必要なし。<% %>の中に%>を書きたい時は閉じるほうの%を2つ書く。以下例。 $ irb >> require "erb" => true >> ERB.new("<%% test %>").result => "<% test %>" >> ERB.ne…

GmailのSMTPサーバを使ってメールを送信する。

gistにsendgmail.rbを足しました。smtp.gmail.comでメールを送ります。 http://gist.github.com/86778 Rubyで日本語のメールを送る。 - こせきの技術日記

Railsのバリデーションについて。

バリデーションの階層 ActiveRecord::Validations::ClassMethods の一番上にバリデーション方法の階層について書いてある。高レベルな順に、 validates_presence_of :firstname みたいなやつ。modelのクラスレベルで呼ぶ。 validates_each クラスメソッドの …

RubyでSkypeのシェルを作る。

Mac用。rb-skypemacをインストール。 $ sudo gem install rb-skypemac以下を保存。 #! /usr/bin/env ruby require "rubygems" require "rb-skypemac" require "readline" include SkypeMac while buf = Readline.readline("skype> ", true) if buf == "help"…

Rubyで日本語のメールを送る。

なるべく少ないライブラリで正しい日本語のメールを送る方法について。 結論 先に結論から。 require "nkf" require "net/smtp" def sendmail(from, to, subject, body, host = "localhost", port = 25) body = <

文字列をCDATAで出力するメソッド。

文字列をCDATAに変換。 def cdata(str) str = str.to_s.gsub(/\]\]>/, "]]]]>") return "" end Railsのhelperでブロック内をCDATAで出力する。application_helper.rbなどに追加。 def cdata(&block) src = capture(&block) src = src.to_s.gsub(/\]\]>/, "]]…

MacPortsでRuby 1.8.6と1.8.7を切り替えられるようにした。

MacPortsにruby186が追加されていました。今年の1月に追加されたようです。 New port - lang/ruby186, Ruby at version 1.8.6 for those who need it for compatibility reasons (not heavily tested) Changeset 45292 for trunk/dports/lang/ruby186 – MacP…

Ruby cursesで日本語が文字化けする。

Rubyの標準ライブラリcursesでUTF-8の日本語が文字化けする。Rubyのバージョンは、MacPortsで入れた1.8.6。 #! /usr/bin/env ruby require "curses" Curses::init_screen Curses::setpos(5,5) Curses::addstr("テスト") Curses::getch Pythonだと日本語も表…

固定の文字列が先頭にあるかを調べる場合、String#indexより正規表現の方が早いらしい。

require 'benchmark' n = 1_000_000 str = ('a'..'z').to_a.to_s str += ('A'..'Z').to_a.to_s str = str * 100 x = "abc" Benchmark.bm do |x| x.report("regexp") { n.times { str =~ /^abc/ ? "t" : "f" } } x.report("index") { n.times { str.index("ab…

RedClothはmarkdownの出力には使えない?

markdownにはBlueClothを使えばいいみたいなんだけど。RedClothの3.0.4、4.0.1で確認。 require 'rubygems' # gem 'RedCloth', '< 4.0.0' require 'redcloth' require 'bluecloth' [RedCloth, BlueCloth].each do |c| puts c.to_s + " " + "-" * 60 puts c.n…

Rakeのruleの使い方、pathmapの使い方について。

ソースの拡張子を変えて出力する例。CSVファイルからSQLファイルを出力する。 require 'csv' SRC = FileList["*.csv"] SQL = SRC.ext('sql') # 拡張子を変えたFileListを生成。 task :default => SQL rule ".sql" => ".csv" do |t| # ruleでタスクの自動生成…

1.8でArray.shuffle

http://ja.doukaku.org/46/lang/ruby/ http://www.google.com/codesearch?q=sort_by%7Brand%7D&hl=ja array.sort_by{rand} sort_byはブロックを評価した結果を<=>で比較して昇順にソートする。

MySQL + ActiveRecord でシーケンス番号を生成。

MySQLとActiveRecordでsequenceみたいなことをする方法。LAST_INSERT_ID()を使う。ここらへんを参考に。 http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html#function_last-insert-id モデルを生成。 $ ./script/generate model xxx_sequen…

DateTime に月、日、時、分、秒を足す。

DateTimeに秒を足す方法がなかなか見つからなくて苦労した。結局ActiveSupportのソースから探した。Rationalを足せば良い。 require 'date' t = DateTime.now # 1ヶ月後 t >> 1 # 1日後 t + 1 # 1時間後 (1/24日後) t + Rational(1, 24) # 1分後 (1/1440日後…

シングルクォートと%q記法のバックスラッシュの動作について。

シングルクォートと%q記法内のバックスラッシュは、バックスラッシュとクォート文字をエスケープする。 記法 エスケープ対象 シングルクォート \と' %q!...! \と! %q(...) \と(と) %qではバックスラッシュがシングルクォートに効かないので、以下の2つが同じ…

ActionMailerで、メールのヘッダもビューに書けるようにする。

以下はRails 1.2.3の話。2.0でどうなってるかは知らないです。もっと良くなってるかも。概略 From: info@example.com To: <%= @user.email %> Bcc: admin@example.com Subject: <%= @user.name %>さんにお知らせです。 Content-Transfer-Encoding: 7bit <%= …

ActiveRecordを外す時はActionWebServiceも外す必要がある。

上の記事で、 config.frameworks -= [ :active_record ] と書きましたが、これだとActiveRecordがロードされてしまいます。一緒にActionWebServiceも外す必要がありました。 config.frameworks -= [ :active_record, :action_web_service ] 以下のようにして…

Rails 1.2.x でActiveRecordを使わない方法。

RailsでActiveRecordを使いたくない場合、config/environment.rbに config.frameworks -= [ :active_record ] と書く方法が以前から紹介されていました*1。……が、これは手元の1.2.6でエラーになります。どうやら1.2.1からActiveRecordを外せなくなっていたよ…

Rubyのsetterメソッドは特別扱いされる。

Rubyのsetterメソッドの振る舞いを理解していなくて、ちょっとビックリしたので。まずはsetterの基本から。 def abc=(a) puts "abc setter" end abc = 123 これは何も表示しません。abc = 123はローカル変数abcを定義しています。 def abc=(a) puts "abc set…

Dir.chdirはブロックを渡して一時的にpwdを変えられる。

Rubyは、こうできたらいいのに、と思ったことが当たり前のように出来たりして嬉しい。例えば、あるディレクトリ以下のエントリーを再帰的に取得する場合。 Dir.glob(dir + "/**/*")とするのが間違っている気がして、何で引数を2つ取ってDir.glob(dir, "**/*"…

Manifest.txtの更新にはpatchを使うとよいらしい。

Hoeでgemを作る時に、パッケージに含まれるファイルの一覧をManifest.txtに記述する必要がある。これを自動で更新するにはどうしたらいいのか調べた。最初は、 http://d.hatena.ne.jp/Seasons/20071118/1195311057 http://d.hatena.ne.jp/yoshioo/20070320/1…

Rubyのバージョンを出力する。

--version みたいなフォーマットで。 puts "ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE} patchlevel #{RUBY_PATCHLEVEL}) [#{RUBY_PLATFORM}]" railsはscript/aboutでバージョンの一覧を見ることができる。 $ ./script/about About your application's envi…

render メソッドは、コントローラとビューで動作が違う。

Ruby on Rails の render メソッドは、コントローラとビューで動作が違う。 ActionController::Base#render ActionView::Base#render の2つは動作が異なる。 *.rhtml やヘルパーから呼ばれるのが、ActionView の render。 ActionView の render は、結果の文…

PATHを減らすとrubyscript2exeが速くなる。

http://www.erikveen.dds.nl/distributingrubyapplications/rails.htmlを参考に、RailsのExe化を試し中。 $ gem install tar2rubyscript $ gem install rubyscript2exe で必要なものは揃う。 rubyscript2exeの実行中に、 Copying files... で止まってみえる…

ドキュメントルート、ポート番号を指定してWebrickを起動する。

サンプルそのままだし大した話じゃないんだけど。 $ webrick . 8080みたいにして起動。カレントディレクトリがドキュメントルートになる。開発環境で手軽にウェブサーバ立ち上げられるとすごく便利です。 #! /usr/bin/env ruby require 'webrick' (document_…

HTTPリクエストヘッダをダンプ

p request.envrequestのクラスはActionController::CgiRequest。ActionController::AbstractRequestを継承。 actionpack-1.13.3/lib/action_controller/cgi_process.rb actionpack-1.13.3/lib/action_controller/request.rb