2009-01-01から1年間の記事一覧

SUM/MAX/MIN/AVG を GROUP BY の条件で使う

下記のような感じで記述する。 report_collection = ProductReport.aggregate( # grouping key :product_id, :date, # summary target :amount.sum, :tax.sum, # condition :date => (start_date .. end_date) ) # => [ # [1, '2009-12-14', 100, 10], # [1,…

Integer から Enum への変換表を取得する

こんな感じで OK だった。 class TargetModel include DataMapper::Resource property :status, Enum[:born, :live, :dead] end TargetModel.properties[:status].type.flag_map # => {1 => :born, 2 => :live, 3 => :dead} 蛇足ながら、Symbol から数値への…

論理削除(ParanoidDateTime)がされているデータを参照する

Model の with_deleted メソッドの block 内で参照を行う。 target_model = TargetModel.with_deleted { TargetModel.get(2) } 複数の Model をまとめて、 with_deleted なモードで扱いたいんだけど、そういうのはないみたい。

extend に相当するもの(class に method 追加)

DataMapper::Model.append_extensions(ModuleName)

include に相当するもの(instance に method 追加)

DataMapper::Resource.append_inclusions(ModuleName)

全ての model で module を取り込む方法。

一つ一つの model で include とか extend とか書くのはかっこ悪いので、全ての model で自動で取り込むように設定する。

使用感

自宅でも spec が動作するようになった! Park Place 動作も十分速い!!

手順

必要な gem を入れる merb が動作している環境では、sqlite3-ruby, activerecord, activesupport, camping があれば良いらしい。http://d.hatena.ne.jp/rabbit2go/20100427/1272376003 を参照して、必要な gem を install する。なお、markaby については、…

実現方法

Park Place は DB(SQLite) にデータを保存している。 このデータを作成するディレクトリを /tmp にすることで、MacBook の再起動毎にデータを消すことを実現する。 データが毎回消えるため、自分で Park Place に登録したユーザーも削除されるが、代わりに最…

Park Place の使用上の問題を解決する

AMAZON S3 を使った開発をしているので、テスト用の S3 モドキとして Park Place を使っている。が、これには今 2 つの問題がある。 遅い。特に spec が。 動作しているマシンが遅いのかも? データを一切消していないからかも? 社内でしか動かない。 よって…

さらに spec の実行を速くする

MySQL のデータを RAM Disk 上に置いて 3 倍の速度を達成したわけだが、さらなる高速化を考えた。 遅いところ 経験上、fixture を何度も読込んでいると遅いことがわかっている。fixture を before(:each) ではなく、before(:all) で読み込むようにすれば、回…

Mix-in の中で before :save を仕掛ける

Mix-in を include しても before :save などに、 Hook を仕掛けることができない。 before は module が定義される時に通常の method として実行されるが、そのモジュールには :save というメソッドは存在しないためである。 module が対象の model に incl…

spec の中で Controller の object を無理矢理生成する

Mock を活用してテストをする場合、 spec の中で Controller の object を無理矢理生成して、直接 method を呼んでテストを行いたい場合がある。でも Controller#new は、一つの引数を要求している。このような時は、Controller#new に Merb::Test::RequestH…

スクリプトは何を行っている?

MySQL のデータディレクトリ(data)を、 data.backup に rename。 RAM Disk device を指定容量で作成。 newfs でファイルシステムを RAM Disk を format。 HFS+ は使用不可能だった。 RAM Disk をマウント。 rename 後の MySQL のデータディレクトリ(data.bac…

性能はどの程度上がった?

HDD: 1110 sec RAM Disk: 366 secちょうど 3 倍まで性能が上がった。 CPU メータを監視していると、片コアが 100% にまで行くようになった。 ほぼ理想的な状態で満足。

手順

初回のみ行うこと 1. MySQL のインストールパスを調べる。 OSX で MySQL の公式サイトで配布されているバイナリをインストールしている場合は、 /usr/local/mysql になる。 わからなければ locate user.MYI で検索すると出てくるかもしれない。 2. MySQL イ…

MySQL を RAMdisk 上で動かす

spec の実行に極端に時間がかかるようになったため、 MySQL を RAMDisk で動かすことを考えた。spec 専用にしか動かしていない MySQL だったら、永続化なんて不要だし。

Hash の key を symbol でも文字列でもアクセス可能にする

Hash の key はなるべく symbol でアクセスするのが cool だと思う。しかしながら、JSON.parse とかで生成された Hash は、key が文字列で生成されているもんで、使い勝手が悪い。 extlib は Mash という Hash もどきの class を使ってこれを実現している。 …

BBコードを使う

BB コードの説明は下記を参照。私は知らなかった。 http://ja.wikipedia.org/wiki/Bbcode ruby では次の gem が見付かる。 $ gem search -r bbcode *** REMOTE GEMS *** bbcode (0.0.1) これを使おうとソースコードを参照してみたら、ファイルの雛型だけで中…

ruby-debug で任意の箇所を通過後に debugger を起動

ちょっとした Tips です。ruby-debug はデバッガを起動したい任意の箇所に debugger と書くだけで起動できるので大変便利です。 しかしながら、自動テストコードでテストを実行中のコードを停止する場合、同じコードが何度も何度も呼ばれるため、 何度も何度…

branch を切る

svn copy で branch を作成 branch は通常の svn copy にて行います。 $ svn copy trunk branches/bug_no514 branch を作成したら、 branch の project1/lib に移動して svn info を確認してみると、 branch の project1/lib は trunk の common を参照して…

事前の準備

branch を切りやすい構成にする。 相対パスで branch を切りやすくするためには、以下のような構成にします。 trunk project1 project2 common branch tags milestone1 project1 project2 common milestone2 project1 project2 common 逆の project1, projec…

svn:externals が設定されている状況で簡単に branch を切る

svn

svn の branch は svn copy だけで簡単に作成できますが、厄介なのが外部項目の参照(svn:externals)です。 svn 1.4 までは、この外部項目が絶対パスでしか指定できなかったため、 branch を切った後は、svn:externals の再設定が必要 branch から trunk に m…

ローカル変数とインスタンス変数の参照・代入

今知ったのだけど、 Ruby はこういう動きをします。 class Foo attr_accessor :val def bar val # => 123 end def zot val # => 123 val = 456 val # => 456 end end foo = Foo.new foo.val = 123 foo.bar # => 123 foo.zot foo.val # => 123 メソッド中で最…