odeの開発メモ日記

プログラマーやってます。今までの道のり ポケコンbasic→C(DirectX5 ネットやろうぜ)→Perl(ちょろっと)→Java→C#→Ruby→Android(Java)

rails

rails3.1で大きいデータ(csv等)をストリーミングで出力する方法

はじめに 管理画面等で膨大なデータをcsvで落としたい時等に そのままDBから文字列を作って返すと反応がないままタイムアウトになると思います。(なんせ全部メモリに落とすのだから) こういう場合の回避方法(2パターン) db等にリクエストをキューイングし…

ActiveModelにある程度機能を組み込んだベースクラス

更新履歴 2011/9/28 rails3.1対応 2011/6/27 ActiveModelImplの継承の継承したクラス対応。 2011/6/23 リリース 概要 ActiveModelを使うとDBに保持しないモデルが作れます(ある程度ActiveRecord互換の機能が動く) ただしそのままでは簡単に使えなそげ。機…

rails2.3.8のXSSプラグインでlink_toの表示テキストがサニタイズされない問題直ってました

<%= link_to "<b>あいうえお</b>", :action => :index %> 2.3.8+XSSプラグインの結果 <b>あいうえお</b> 2.3.5+XSSプラグインの結果 あいうえお bタグが適用されてます (ちなみにlink_toの問題を把握してない人のために言うと、XSSプラグイン関係なく2.3.5以前のrailsでも…

ActiveRecordのDBコネクションの接続切れと再接続について。reconnectオプションは危険だなーとかも

ActiveRecordは基本ずっと接続をはりっぱなしにします。なので長時間接続をはりっぱなしにするため タイムアウト等で接続がきれると問題がでます。 MySQLでDBの接続がきれるタイミング 状況別 Railsの場合 HTTPリクエストのあるたびに接続が切れてないかを確…

MySQLでDBの接続がきれるタイミング

接続がきれるタイミング(環境によってはもっとあるでしょうが) MySQLのtimeout my.cnfのwait_timeout デフォルト値は8時間 SLBを経由してDB接続している場合はSLBのtimeout ipvsadm --set tcp tcpfin udp (set connection timeout values) デフォルト値は5…

composite_primary_keysのバグ修正で思ったこと。

見たくもないレガシーDBにアクセスする用事があるんですよこれが。(あー触りたくない) railsでは使うことのない複合プライマリキーが使われてたので これに対応するためにプラグインのcomposite_primary_keysを使いました。 ただちょいとバグがありで、rai…

classをカスタマイズするために再定義じゃなくてaliasしないとだめな場合がある話

当たり前といえば当たり前なaliasの挙動の話です。 わかってたはずなのに、とある状況だと気づかなかったのでメモります。 今回はまった部分は以下の部分の修正 ・railsでdb保存した場合に自動でcreated_at列に現在の時間が入る機能。 これををレガシーDBの…

rubyのバージョンアップでcapistranoの設置がうまくいかなくなった

最近rubyを1.8.6p369にアップしたんですが capistrano2.5.5+ruby1.8.6p369 だと複数の設置先がある場合に固まりました。 (パスワード入力までいかなかったり、パスワード入れれてもその後で固まったり。設置先が1箇所の場合は問題なくできました) rubyをr…

railsバッチの作り方

作り方 例えば検索インデックス登録用バッチとしてcreate_search_indexというバッチを作る場合 ファイル構成 app/ batch/ ← このフォルダを追加 create_search_index/ create_search_index_batch.rb - railsバッチを定義する create_search_index.sh.sample …

capistranoで複数のデプロイをしたい場合

設置の単位を分けたい場合があります。 例えばステージングと本番環境(プロダクション)や、ウェブアプリとバッチ等です。 やり方 deploy.rbファイルを用途別に作成する。 config/deploys/staging_web.rb(ステージングweb) config/deploys/production_web.r…

capistranoでssh越しのサーバーに設置する場合

sshでgatewayに接続した後、そこを踏み台として他のpc(Webサーバー,DBサーバー等)に繋いで作業する場合があると思います。 (設置先が自社サーバーではなく、外部のサーバーを使う場合やレンタルサーバー等で仮想環境を使用している場合等でしょうか) capis…

セッションがタイムアウトしてる状態でpostした場合

セッションをdbに格納してる場合は注意しないといけなそうです。例えば検索フォームを表示したままで放置して その後タイムアウトしてるのに検索をした場合(postする) InvalidAuthenticityTokenになりました。 挙動 セッションのストア先により動作が変わ…

willcomの高速化サービスでIP spoofing attackエラー

問題 rails2.1のサイト(リバースプロクシ使用)をwillcomの高速化サービスのプロクシ(フロントプロクシ)を使うと IP spoofing attack?! というエラーになってしまいました。 (恐らくこのエラーを出すようになったのは2.1からっぽい。) 理由 ソースをお…

単純にメンテナンス画面を出したい場合

routesで切り替えられます。(本当は上流のリバプロとか、アプリに機能を組み込むのがいいと思いますが。簡易的な技ということで)routes.rbの上のほうに下記追加(上に書くのは一番最初に判定してもらうため) #map.connect "*anything", :controller=>"mai…

クッキーを使わないでリクエストパラメータ(params)でセッションIDを渡す場合

諸事情でセッションIDがクッキーで渡されなく、リクエストパラメータ(クエリーストリングやpost等) で渡される場合がたまーにあります。 (外部アプリとの連携をする場合等に発生するケースが多いかなと思います。) こういう場合はsessionメソッドで:cook…

dbのマスタースレーブに対応するためにacts_as_readonlyableを使ってみる

日本最大規模のrailsを使ったサイトのクックパッドで改良して 使ってるとのことなので、そこそこ使えるのだろうとのことで 改良するの覚悟でチャレンジしてみました。下記がオフィシャルページ?(ただのblogの1ページだけども) http://revolutiononrails.…

mysqlでのdbのマスタースレーブに対応するのは厳しいねぇ。

先にいうと、あることはあるけど メンテされてなくて最新のrailsでは動きませんでし。 そのうち使えるようになるだろうと信じてのメモ書きです。 急いで使うなら自分で作るか、改良する必要になります。 magic multi connections findする際にモデルの頭に接…

thinでswfを扱う場合

前書き publicフォルダにswfをおいた場合に thinだとcontent-typeがtextになってしまうようです。 これだと携帯でのflash表示が失敗するので(mimeが違うとau,softbankは見れないっぽい。docomoは無視して表示するみたいだが) そのためflashのmimeをきちん…

セッションの自動延長

前書き セッションはご存知のとおりリクエストがないと一定時間で消えてしまいます。 けどページによってはタイムアウトの時間をとても長くしたい場合があります。 例えばお絵かきツールで大作を描いたり。。メール文面入力ページで緻密に計算されたラブレタ…

cache_fuのconfについて。memcached.yml

(ちなみに全部の説明はありません。適当にピックアップしました。) #trueにするとsessionの格納先がmemcacheになります。 sessions: trueかfalse #セッションのmemcacheサーバーを別にしたい場合は指定する。 #一緒でいい場合はfalseを指定(デフォルト) …

セッションの格納先をmemcacheにする。

やり方 memcache-clientのgemをインストール(追記あり) gem install memcache-client 追記(2008/11/20) rails2.1からはmemcache-clientが同梱されていました。(rails2.0にはなかったです) なのでgemのインストールは不要になりました。activesupportの中に…

acts_as_paranoidで関連を扱う場合

acts_as_paranoidとはモデルを論理削除できるようにするrailsプラグインです。 簡単な使用では問題ないのですが 関連を使った場合には消したデータを見てしまう可能性がありました。 やりたいこと 例として学校クラスと生徒クラスがあったとして 学校を削除…

ActiveRecordで発行するSQLのログをDBに保存する方法

管理ページのSQL(更新系のUPDATEやINSERT等)を保存しておきたい要望があるだろう。 (管理者の操作ログを詳細にとる代わりの代替案として等) そんなときのやり方です。 ActiveRecordのソースを見た限りそういった機能はなさそうだったので ActiveRecordの…

ActiveRecordのコールバックでのトランザクション

下記のようにUserを作成した際に コールバックでLogを自動的に作る場合において トランザクションの範囲がどうなるかが気になった。 def class User def after_create UserLog.new.save! end end 実行結果ログ SQL (0.000301) BEGIN User Create (0.000586) …

名前空間付きコントローラーでの問題

たいていのサンプルだとコントローラーは1フォルダに全部作られているが、管理画面や、ユーザー画面ごとにフォルダ分けしたいとこだろう。 一応作れるみたいで、ちょいとつまづいたのでメモしときます。 (rails2.1.1で確認) URL:XXX/u/indexにおいて XXX_co…