Ruby
Rubyのautoloadは廃止されるかもしれないので、代わりの方法を用意しておきたい。 Rubyにはconst_missingというヤバいメソッドがある。このメソッドは未定義の定数にアクセスした時、NameErrorが発生する前に処理をフックする事ができる。superを呼べばその…
Rubyにautoloadという機能がある。 autoload :Hoge, "hoge.rb" と書いておくと、定数Hogeが最初に使用された時にhoge.rbがrequireされる。Rubyのクラスは定数に入っているので、Hogeクラスの定義をhoge.rbに書いておくだけで、Hogeクラスの遅延ロードができ…
Rubyのnまたはpオプションは標準入力からテキストを読み込み、行ごとに-eで指定したRubyスクリプトに渡して処理を行う。 $ echo "123" | ruby -pe "" 123 さらにlオプションを付けると行末の改行コードを削除してから処理を行うのだが、chomp!じゃなくてchop…
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…
あと4つは募集中です他の言語というかJavaしか知らなかった昔の自分がつまづいたような気がする点を4つ メソッド名がJavaと違いすぎる 慣れるしかない…Java "hoge ".trim(); Ruby "hoge ".strip ダメなうらわざ、やったら負け class String alias :trim :st…
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で、/admin以下のみBasic認証しようとnginx.confに以下の記述をしましたが、/admin以下にアクセスすると全てNot Foundになってしまいました。 server { listen 80; server_name example.com; root /var/www/example.com/rails/public; pass…
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 v4.3を入れてもerbの編集ではhtml5のタグをハイライトしないが、以下の手順でhtml5タグを認識させることができた。~/.vim/ftplugin/html.vimを作るかダウンロードしてくる syn keyword htmlTagName contained article aside section header footer…
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アプリで、ある日付の午前0時から有効になるという処理を書いたが、0時に有効にならず、9時まで有効にならないというバグに遭遇した。原因は以下のコードのように、モデルの enabled_from に対応するDBのカラムはDATE型であるのに、Date型ではな…
["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のmigrationを作るときの注意点、 複数テーブルにわたる変更でもテーブル単位でmigrationを複数作る。 例えば、あるカラムを新しいテーブルに移行したいなら createテーブル → データ移行 → 元テーブルからremove_columnという3つのmigrationを作る。 …
ゆるーい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を使う前は、assert_equalがshouldになっただけでTest::Unitと同じだろ?と思っていたのだが、使ってみると全く別物だと感じた。その違いは何かというと Test::Unitは、メソッド毎に、各状態における振る舞いを確認するもの RSpceは、ある状態における…
Rubyはattr_accessorとか書くとプロパティが作れるわけだが、これはインスタンス変数を読み書きするだけ。それ以上の動作をさせたい場合は自分でメソッドを定義する必要がある。しかし名前が違うだけで処理内容が同じプロパティが沢山あったら超面倒くさい。…
$ 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…
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…
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にActiveScriptRubyを入れ、gem update --systemし、gemコマンドを実行すると「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」といわれて動かなくなりました。gemコマンドの本体は C:\Program Files\ruby-1.8\bin\g…
Apache+mod_rails環境で、公開時は認証不要の画面だが、テスト中なのでアクセス制限のためにbasic/digest認証を使用したい。httpd.confのDirectoryディレクティブにRailsのpublicディレクトリを指定してBasic認証を設定すると、Railsのpublicディレクトリに…
MixiがOpenIDプロバイダになったので、遊んでみようと思った。mixiなら大抵アカウント持ってるし、友達に勧める時でもマイミクシィという繋がりがあるので、OpenIDを使ってもらう心理的抵抗が他のプロバイダよりちょっと低いかな、と思う。まずOpenIDの仕組…
今更な話なのだが、Ruby 1.8のCGIクラスの警告の話。ruby には String#[]というメソッドがあって hoge = "HOGE" puts hoge[0] # => "72" みたいに指定インデックスの文字のコードを取得出来る。でもCGIでパラメータから取得した文字列の場合 hoge = cgi["h…
暇な休日なので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…
Ruby Wavesをインストールしてみたが、その先じっくり腰を据えて試す時間がなくて寂しい。デスマーチや過剰な残業がよくないのは、技術で遊ぶ勉強する時間がなくなってしまうことだな。新しいおもちゃ技術に触れる時間が足りないとプログラマは腐ってしまう…
順番の制御が楽にできるらしい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…