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…

Thin

Mongrelより速いRuby HTTPdらしい。http://www.rubyinside.com/thin-a-ruby-http-daemon-thats-faster-than-mongrel-688.htmlMongrelの作者はRuby界隈から逃亡したらしいので、こっちに注目しておこうか。と思ったら、これMongrelを高速化するライブラリみた…

アイアンルビー

そんな名前の競走馬がいたとは。アイアンルビー 馬 - Google 検索アイアンパイソンは居ないみたいですね〜

Rubyのクラス変数

クラス変数は@@を使って定義する。インスタンス変数と違って初期化されていないとエラーになるので嫌な感じ。 class Hoge def self.hoge= v @@hoge = v end def self.hoge @@hoge end end Hoge.hoge = "ほげ" p Hoge.hoge @@を使わずにクラスに特異メソッド…

IronRubyリリース

http://journal.mycom.co.jp/news/2007/07/24/045/index.html http://www.atmarkit.co.jp/news/200707/24/msruby.html Silverlightが急に魅力的な環境に思えてきました。リッチクライアントを作成する言語として、ActionScript、JavaFX、Rubyの中から選べる…

Rubyはかっこいい

Railsの作者は美しいコードが書けるからRubyを選んだそうだが、俺にとってのRubyは美しいというよりもカッコいい。かっこいいからRubyを使う。Railsに付属しているActiveSupportはTime等のオブジェクトに便利なメソッドを提供する。Railsユーザならご存知の…

EclipseにRuby Development Toolsを入れてみた

Ruby Development ToolsプラグインがEclipseプロジェクト管轄下のアップデートサイト(Europa Discovery)で配布されていた。この辺の事情は良く知らんが、つまりRDTプロジェクトはEclipseのサブプロジェクトになったということか。軽く試してみたがメソッド…

IronRubyリリース

http://journal.mycom.co.jp/news/2007/07/24/045/index.html http://www.atmarkit.co.jp/news/200707/24/msruby.html Silverlightが急に魅力的な環境に思えてきました。リッチクライアントを作成する言語として、ActionScript、JavaFX、Rubyの中から選べる…

マルチバイトの文字列長を取得

sizeメソッドやlengthメソッドは文字列長ではなくバイト長を取得するらしい。 p "ぬるぽ".size # => 9 UTF-8では、マルチバイト文字の2バイト目以降の上位2ビットは必ず10になるので、こんな感じで文字列長が取れるだろうか。 def utf8length(str) str.unpac…

AutoMatorのシェルスクリプトでRubyを選ぶ

デブサミのShibuya.pmイベントのAutoMatorプレゼンを見て何かやってみようと思いました。AutoMatorではシェルスクリプトを呼び出して使って色々処理をすることができます。プレゼンではPerlを使ってゴニョゴニョしていましたが、Rubyistとしては当然Rubyを使…

includeとextend

というわけでRubyのモジュールをまとめると include クラスのインスタンス全てにモジュールの実装を追加 extend 特定のインスタンスのみにモジュールの実装を追加 実装の追加であってインターフェースの追加じゃないです。モジュールを使うとモジュールとク…

includeとextendその2

前回の include は比較的どうでもいい話。includeは、クラスに対してモジュールのメソッドを追加するので、そのクラスのインスタンスすべてがモジュールのメソッドを使えるようになる。JavaScriptで言えばprototypeにメソッドをセットするようなもの。一方、…

includeとextendその1

Rubyにはモジュールという機能があり、クラスの機能を分割、再利用できます。モジュールの機能をクラスに追加するにはincludeを使います。 module Fuga def execute puts "fuga" end end class Hoge include Fuga end hoge1 = Hoge.new hoge1.execute hoge2 …

mod_rewriteでurlを書き換えるとSERVER_PORTが80になるので困った

Rubyに限った話ではないのだが、mod_rewriteでurlを書き換えてCGIを実行すると、Apacheは12080番ポートを使っているのに環境変数SERVER_PORTが80になるので困っている。rewrite条件にマッチしないようにCGIを実行すると正しく12080が得られるので、mod_rewri…

RubyのmoduleのインクルードとClassの継承

module Moge def a "moge" end end class Hoge include Moge def a "hoge" + super end end p Hoge.new.a # "hogemoge"と表示 おや、インクルードしたモジュールのメソッドにsuperでアクセスできてしまった。インクルードの実装は継承と同じなのだろうか? …

仕事でRubyを使う

http://d.hatena.ne.jp/OTTii/20061003/1159847164 Rubyを使ってて気持ちいいと感じるのは仕事で使ってないからなんだろうな。 そうかもしれない。 しかし、仕事でJava使ってるが別に嫌と思った事は無……、いや、あるある。例えば引き継ぎ等で渡されたソース…

インスタンスメソッドのアクセス制限2

Rubyのマニュアルには「privateは自クラス及びサブクラスからしか参照できません。」とあるが、正確には、自インスタンスの内部からしか参照できないような感じ。Javaでは、同一クラスであれば別のインスタンスのprivateメソッドも呼べるのであるが… public …

インスタンスメソッドのアクセス制限1

Rubyでは、オブジェクトのメンバに対するアクセス制御としてpublic、protected、privateを指定できる。Javaと同じキーワードであるが、protected、privateメソッドの挙動はJavaとはかなり違うので要注意だ。Java public どこからでも protected 同一パッケー…

クラス名からクラスオブジェクトを取得できるのか

JavaでいうところのClass.forNameにあたるモノ。Rubyで文字列からクラスオブジェクトを取得するにはどうすればいいのか。ぶっちゃけeval使えば良いんだけど… class Hoge def a p "hogehoge" end end hogeClass = eval("Hoge") hogeClass.new.a # "hogehoge"…

Rubyのクラス定義

Rubyでは、 クラスはclassキーワードで定義 インスタンスメソッドはクラス内でdefキーワードを使って定義 新規インスタンスはクラスメソッドnewで作成 newメソッドを定義する必要はない コンストラクタは定義できないが、代わりにinitializeメソッドがnew実…

RubyとJavaのsuperの違い

RubyとJavaではsuperの意味が異なっている。Javaではスーパークラスをレシーバとするためのキーワードであり、Rubyでは現在のメソッドがオーバーライドしているメソッドの呼び出しになる。 class Oya { void a(){ System.out.println("oya"); } } class Ko e…