rails

並列処理でActiveRecordを使う

※ドキュメントを読みながらこんなもんかな?とやってみたやつなので問題あるかもしれません。何かあればコメント頂けると嬉しいです。例えば、DBからデータを取り出して逐次メールを送信する場合。 よく知られているようにメールの送信はコネクションの確立…

ActionCacheについてきっちり理解する

FragmentCache等に比べ、活用されることの少ないActionCacheですが、正直よく理解してないという方も多いのではないだろうか。Rails 2.1のActionCacheのコードをざっと眺めて、簡単に特徴をまとめたいと思う。 「ActionCacheはフィルタ」 ActionCacheは、「…

こんなキャッシュ機能が欲しい

パラメータ(クエリストリング)を考慮したアクションキャッシュが欲しい。 あるのかな? ないのならつくろうかな。

タグのバージョニング

acts_as_versionedは、モデルのバージョニングを手軽に実現できるプラグイン。 acts_as_taggable_on_steroidsは、タグを手軽に実現できるプラグイン。 併用したとき、モデルのバージョンを戻すと同時にタグもその時点のものに戻したいと思うのが人情というも…

Filterクラスをつくってみる

class SampleFilter def initialize(options) # オプションのせっていなどなど end def before(controller) end def after(controller) controller.response.body.gsub!(/hoge/, 'fuga') end end class ActionController::Base #:nodoc: def self.sample_bef…

携帯絵文字をPCで表示するためのフィルタをつくってみた

id:darashiさんが開発している、Railsで携帯向けアプリケーションを構築する時に便利なRailsプラグイン「Jpmobile」の機能を拡張するプラグインです。Jpmobileにおいて、携帯の絵文字はUnicodeの私的領域にマッピングされます。そしてアクセスがあるとユーザ…

ページキャッシュで画像をキャッシュ

こういう方法もあるけど・・・ActionController::Caching::Pages#cache_page(caches_pageでafter_filgerに登録されるメソッド)を使えばurl_forで工夫したりする必要ないよ。(Rails 2.1.0でのみ確認) require 'qrcoder' class CodeController < ApplicationC…

Rails2.1

変更点多いですね・・・。今つくってるの2.0.2から移行しようとおもったけど、使ってるプラグイン関連の挙動が怪しくなったのでやめました。

ActiveResourceが遅い→JSONならパースが速いよ

きっかけ ネットワーク越しだし、速度が出ないのはまぁいいんだけど、それにしたって遅い。 具体的にはXMLのパースが遅い、遅すぎる。 なんとかならぬか。どうやらXMLSimpleがボトルネックらしい。 JSON使った方がましかなぁ。 パーサの速度比較 同じデータ…

Rails2.0.2のjavascript_include_tagのcacheはRailsがルート以外(/appとか)で動いてるとバグる

タイトルの通り。 たとえば、mongrel_clusterなんかをつかってて、 prefix: /railsとかやってて、アプリのURLが http://taslam.example.jp/sampleなんかになってると、javascript_include_tag(*, :cache => 'cache')の動作がおかしくなる。Railsのソースを追…

has_many :throughな関連テーブルでの検索について

関連テーブルでカテゴリみたいな多対多の関連を実装したとき、一番安易なのはとのかくJOINで全部連結しちゃう方法だけど、これだと重そうだ。なるべく連結の規模が小さくて拡張しやすそうなSQLを考えてる。SQL素人の癖に。いろいろ試してみたけどこんな感じ…

エントリ毎に認証するユーザを変更する

そのままだとモデル毎に接続を設定することになるが、これでは複数のユーザがそれぞれのアカウントで接続して、それぞれの権限でエントリを編集するといったことはできない。コードを追ってみたところ、エントリの更新などの際にはActiveResource#connection…

ActiveRecord::Base#to_xmlをキャッシュ

to_xmlが遅いので適当に作ってみた。developmentモードではキャッシュ無効。 ただし memcache-clientが必要。 :builderオプションが渡されたときは、キャッシュを使わない。(Entry.find(:all).to_xml とか) Rails 2.0.2でしか試してない。 無保証。 インス…

いまさらActsAsVersioned

やっぱり便利ですね。 既存のアプリにインストール script/plugin install acts_as_versionedモデルにacts_as_versionedを追記。 class Entry < ActiveRecord::Base acts_as_versioned end マイグレーションを追加。 require 'entry' class CreateEntryVersi…

ActiveResourceでWSSE認証

Basic認証以外に対応させるの例として、WSSE認証。 require 'digest/sha1' require 'base64' class ActiveResource::Connection::WSSE < ActiveResource::Connection private def authorization_header if @site.user || @site.password { 'Accept' => 'appl…

Basic認証以外に対応させる

HTTPリクエストヘッダに認証情報を付加する場合(WSSEとか)。 ソースを追ってみるとActiveResource::Connection#authorization_headerをオーバーライドしてやれば良い様だ。 # Sets authorization header; authentication information is pulled from crede…

ActiveResourceを試すための準備。

RESTって? http://yohei-y.blogspot.com/2005/04/rest_23.html:REST入門 ActiveResourceって? RESTアーキテクチャでいうところのリソースをActiveRecordと同様のインタフェースで扱うためのマッパ。 TwitterAPIをActiveResourceで TwitterのAPIでRailsのAc…

受信メールをRailsのコントーラに受け渡すスクリプト

Railsアプリでメールを受信して処理 ActionMailer::Base.receive(STDIN.read) とかやる 受信のたびに起動とか重いよ! SMTPサーバとRailsアプリのサーバが違うと面倒 ってことで、コントローラで処理させるための簡単なスクリプトを書いた。使うことに以下の…

JpMailerプラグイン

これはなに? ActionMailer:Baseのサブクラス。 日本語のPC用のメール及び携帯電話用のメールを送る際に便利かなぁというもの。 動作環境 Ruby 1.8.6 ActionMailer 2.0.x gettext/railsと共存できません([http:/d.hatena.ne.jp/taslam/20080311/1205830007:…

gettext/railsと共存

gettext/rails.rb内で、ActionMailer::Base#create!を変更している影響でこのままでは正しいメールを送信できない。 とりあえず以下のように、メソッドチェインからgettext/rails.rbでの拡張を外せば動く。 require 'gettext/rails' class ActionMailer::Bas…

携帯サイトをStylesheetでカラフルに

いろいろめんどくさいのでjpMobileプラグインを使う。 DOCTYPEやらがキャリア毎に違うのでキャリア毎に用意して、切り替える。 Content-typeは「application/xhtml+xml」にする。 携帯キャリア毎にlayout切り替え class Mobile::Base < ApplicationControlle…

ActiveRecord::Base#update_attributeはvalidationチェックを回避する

るびまにも書いてあるし、さんざん既出だろうけど、ちょっとハマったので念のためメモ。 user.update_attributes(:name => '') # => false user.update_attribute(:name, '') # => true

IEで「Web ページの有効期限が切れています」と表示されるのを回避

HTTPレスポンスヘッダでキャッシュコントロールを指定してやればよい。 class ApplicationController < ActionController::Base before_filter :cache_control private def cache_control headers['Cache-Control'] = 'private, max-age:300' headers['Expir…

STIではvalidates_uniqueness_ofがややこしい

Rails 1.2.6 class RealEstate < ActiveRecord::Base validates_uniqueness_of :name end class Building < RealEstate end class Land < RealEstate end building1 = Building.new(:name => 'test') building1.save # => true building2 = Building.new(:na…

定期的に処理を実行する

http://d.hatena.ne.jp/technohippy/20070807 を参考に、Railsでインストールした。cronのように定期的にワーカーを立ち上げ、処理させることもできる。config/backgroundrb_schedules.yml # ラベル(わかりやすい名前を) sample_runner: # 対象のワーカー…

AP4Rの連載読みながらやってみた。。。が『Mysql::Error: Lost connection to MySQL server during query: ROLLBACK』

非同期処理が必要になったところで、gihyo.jpに「AP4R,Rubyで非同期メッセージング」という記事をみつけた。 やってみた。でも、第3回 SAF機能とテストサポートによる安心非同期 (3/5)で、記事の通りに動かない・・・ class AsyncShopController < Application…

STIでのトラブル

acts_as_cachedは便利だが、モデルで継承(STI)を使っている場合、扱いに注意必要。たとえば、 class RealEstate < ActiveRecord::Base acts_as_cached end class Land < RealEstate end class Building < RealEstate end ってモデルがあって、 # インスタ…

「クレイジー」なキャッシュ

yoshitetsuの日記:acts_as_cachedを使うを参考に導入してみた。 @categories = Category.get_cache(:all) do Category.find(:all, :order => 'index') end ブロックを渡すと、ブロックの戻り値をキャッシュします。 # acts_as_cached.rb # key はget_cacheの…

timed_fragment_cache

Railsは重い! これは事実。大規模なフレームワーク、高度な抽象化は重いもの。 キャッシュを活用しないとやってられません。でも、キャッシュ使ってると思うのが、失効処理の複雑さ。 Sweeperを使うったって、モデルの変更で失効させないといけないところが…

render :partial をやめて高速化

Erubisは高速さがウリのeRuby処理系らしい。るびまを参考に導入してみた。 Erubis の Preprocessing 機能を使って Ruby on Rails の View 層を高速化するここにあったpartial展開ヘルパを少し書き換えて以下のようなヘルパを使っている。 # Erubis # render …