Ruby

廃止されるかもしれないautoloadの代わりを用意する

Rubyのautoloadは廃止されるかもしれないので、代わりの方法を用意しておきたい。 Rubyにはconst_missingというヤバいメソッドがある。このメソッドは未定義の定数にアクセスした時、NameErrorが発生する前に処理をフックする事ができる。superを呼べばその…

Rubyのautoloadって無くなるの?

Rubyにautoloadという機能がある。 autoload :Hoge, "hoge.rb" と書いておくと、定数Hogeが最初に使用された時にhoge.rbがrequireされる。Rubyのクラスは定数に入っているので、Hogeクラスの定義をhoge.rbに書いておくだけで、Hogeクラスの遅延ロードができ…

Rubyのlオプションがつらい

Rubyのnまたはpオプションは標準入力からテキストを読み込み、行ごとに-eで指定したRubyスクリプトに渡して処理を行う。 $ echo "123" | ruby -pe "" 123 さらにlオプションを付けると行末の改行コードを削除してから処理を行うのだが、chomp!じゃなくてchop…

Gemfile.lockってバージョン管理すべき?

Gemを作ってるなら管理すべきでない、アプリを作ってるなら管理すべき、だそうです。 When developing a gem, use the gemspec method in your Gemfile to avoid duplication. In general, a gem’s Gemfile should contain the Rubygems source and a single…

他の言語に慣れた人がRubyを使ったときにつまずきがちな点

あと4つは募集中です他の言語というかJavaしか知らなかった昔の自分がつまづいたような気がする点を4つ メソッド名がJavaと違いすぎる 慣れるしかない…Java "hoge ".trim(); Ruby "hoge ".strip ダメなうらわざ、やったら負け class String alias :trim :st…

has_many throughなデータの関連付けをするビューの書き方

Ruby on Railsのお話です。has_many で through な多対多のデータを扱うときの関連付けを行う方法。たとえば、以下のようなActiveRecordで class Book has_many :book_genres has_many :genres, :through => :book_genres end class BookGenre belongs_to :b…

nginx + passengerでBasic認証

nginx + passengerで、/admin以下のみBasic認証しようとnginx.confに以下の記述をしましたが、/admin以下にアクセスすると全てNot Foundになってしまいました。 server { listen 80; server_name example.com; root /var/www/example.com/rails/public; pass…

OSX 10.7 Lion で Rails と MySQL

MacBook Air買いました。そしてLionでRails開発環境を作成していきなりハマるwrubyはrvmで1.8.7、railsは2.3.11、gemは1.3.5というちょっと古い環境。まずMySQLデータベースサーバ。MySQLのサイトにおいてある10.6用64bit版のdmgが普通に使えるようだ。イン…

rails.vim で html5 のタグをハイライト

rails.vim v4.3を入れてもerbの編集ではhtml5のタグをハイライトしないが、以下の手順でhtml5タグを認識させることができた。~/.vim/ftplugin/html.vimを作るかダウンロードしてくる syn keyword htmlTagName contained article aside section header footer…

Rails3のpath_parameters

Rails2.3.8 class TestController < ApplicationController def index Rails.logger.info(request.path_parameters[:action]) => "index" Rails.logger.info(request.path_parameters["action"]) => "index" Rails.logger.info(request.symbolized_path_para…

RailsでTimeとDateを比較すると9時間ずれる

先日、Railsアプリで、ある日付の午前0時から有効になるという処理を書いたが、0時に有効にならず、9時まで有効にならないというバグに遭遇した。原因は以下のコードのように、モデルの enabled_from に対応するDBのカラムはDATE型であるのに、Date型ではな…

sort_byとsort

["2-5", "1-10", "2-1", "3-3", "1-3"].sort => ["1-10", "1-3", "2-1", "2-5", "3-3"] そうじゃなくて、ハイフンの前の数字の昇順→ハイフンの後ろの数字の昇順で並んで欲しい。そんなときはブロック引数を使う。 ["2-5", "1-10", "2-1", "3-3", "1-3"].sort…

クロス集計

クロス集計の表をCSVとして吐き出す class CrossTabulater DELM = "," def initialize @items = {} @headers = {} end attr_writer :x_sorter attr_writer :y_sorter def add(x_axis, y_axis, raw_data) if not @headers.key? y_axis @headers[y_axis] = 1 e…

Railsのマイグレーションを作るときは

Railsのmigrationを作るときの注意点、 複数テーブルにわたる変更でもテーブル単位でmigrationを複数作る。 例えば、あるカラムを新しいテーブルに移行したいなら createテーブル → データ移行 → 元テーブルからremove_columnという3つのmigrationを作る。 …

Railsっぽいコードの書き方

ゆるーいRubyネタActiveRecord の belongs_to :hoge みたいな宣言的なコーディングって何かカッコイイすよね。あんな感じでクラスで何か宣言するコードが書けるとRubyコーディングがもっと楽しくなるんじゃない?とか思ったので、ためしに produces で宣言し…

シナトラさん

イケてるWeb系Rubyistの間で話題の超簡単フレームワークSinatraを試す。 Sinatraを使ってみる インストール $ gem install sinatraapp.rb (ファイル名は任意で) を作成 require "rubygems" require "sinatra" get "/" do "Hello, Sinatra!" end 実行 $ ruby …

RSpecを使ってみた感想

RSpecを使う前は、assert_equalがshouldになっただけでTest::Unitと同じだろ?と思っていたのだが、使ってみると全く別物だと感じた。その違いは何かというと Test::Unitは、メソッド毎に、各状態における振る舞いを確認するもの RSpceは、ある状態における…

処理が同じ俺定義Getter Setterを自動生成する

Rubyはattr_accessorとか書くとプロパティが作れるわけだが、これはインスタンス変数を読み書きするだけ。それ以上の動作をさせたい場合は自分でメソッドを定義する必要がある。しかし名前が違うだけで処理内容が同じプロパティが沢山あったら超面倒くさい。…

rack

$ sudo gem install rackhello.rb require 'rubygems' require 'rack' class Hello def call(env) [200, {"Content-Type" => 'text/plain'},["Hello World!"]] end end hello.ru require 'hello' run Hello.new 実行(rack up) $rackup hello.ruhttp://loca…

RailsでMySQL/Rubyが動いてなかった

MacのRailsを2.2にアップデートしたらRailsが動かなくなってしまった。 LoadError (dlsym(0x1445a40, Init_mysql): symbol not found - /opt/local/lib/ruby/gems/1.8/gems/mysql-2.7/lib/mysql.bundle): /opt/local/lib/ruby/gems/1.8/gems/mysql-2.7/lib/m…

==メソッド

self==(other) self と other が等しければ真を返します。 デフォルトでは equal? と同じ効果です。 このメソッドは各クラスの性質に合わせて再定義するべきです。マニュアル的には==メソッドはオーバーライド推奨らしいです。オブジェクトが同一の値かどう…

空文字チェック

http://itpro.nikkeibp.co.jp/article/COLUMN/20081125/319810/ http://d.hatena.ne.jp/Yoshiori/20081202/1228193692 どう書く?という話題は定期的に上りますね。状況にも因るので一概にどれが正解とは言えないと思いますが、Webアプリなら私もcommonsのSt…

find_by_sql

hogeとfugaが多対一のとき、ActiveRecord#find_by_sqlでhogeを取得する hoges = Hoge.find_by_sql(["SELECT * FROM hoges INNER JOIN fugas ON hoges.fuga_id = fugas.id WHERE fugas.code = ?", "0003"])inner joinを使ってデータを取得したとき、joinする…

Windowsでgem updateしたら動かなくなった

WindowsにActiveScriptRubyを入れ、gem update --systemし、gemコマンドを実行すると「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」といわれて動かなくなりました。gemコマンドの本体は C:\Program Files\ruby-1.8\bin\g…

Passengerでbasic/digest認証

Apache+mod_rails環境で、公開時は認証不要の画面だが、テスト中なのでアクセス制限のためにbasic/digest認証を使用したい。httpd.confのDirectoryディレクティブにRailsのpublicディレクトリを指定してBasic認証を設定すると、Railsのpublicディレクトリに…

ruby-openidを使ってmixiで認証するテスト

MixiがOpenIDプロバイダになったので、遊んでみようと思った。mixiなら大抵アカウント持ってるし、友達に勧める時でもマイミクシィという繋がりがあるので、OpenIDを使ってもらう心理的抵抗が他のプロバイダよりちょっと低いかな、と思う。まずOpenIDの仕組…

RubyCGIの警告

今更な話なのだが、Ruby 1.8のCGIクラスの警告の話。ruby には String#[]というメソッドがあって hoge = "HOGE" puts hoge[0] # => "72" みたいに指定インデックスの文字のコードを取得出来る。でもCGIでパラメータから取得した文字列の場合 hoge = cgi["h…

MacPortsでapache2でpassenger

暇な休日なのでpassengerとredmineで遊ぶことにしたまずMacPortsでApache2をインスコ $ sudo port install apache2 libtool: compile: unable to infer tagged configuration libtool: compile: specify a tag with `--tag' make[3]: *** [unixd.lo] Error 1…

Wavesを

Ruby Wavesをインストールしてみたが、その先じっくり腰を据えて試す時間がなくて寂しい。デスマーチや過剰な残業がよくないのは、技術で遊ぶ勉強する時間がなくなってしまうことだな。新しいおもちゃ技術に触れる時間が足りないとプログラマは腐ってしまう…

acts_as_list

順番の制御が楽にできるらしいRailsのacts_as_listだがupdateのコストが高そう… class Hoge < ActiveRecord::Base belongs_to :grouping acts_as_list :scope => :grouping_id end acts_as_listのソース def increment_positions_on_lower_items(position) a…