debiancdn

AWS, Content Delivery Network and Debian

カテゴリーアーカイブ: rails

railsの実装速度をあげる方法でMac買えという話があるのだがそんな気がしない件

Speeding Up Rails Development | Ruby on Rails というところでいろんな方法が紹介されているが,そのなかでMacかえという話.

Seriously, Just Buy a Fucking Mac

Just do it. Stop making excuses. I was a Windows user for about ten years but mainly because I didn’t know any better. I now work full time on a mac, both at home and at work, and there’s not a thing you could do to make me go back to Windows.

Windows simply won’t do a lot of things that you’ll want to do. Background jobs? Not a chance. Git? oh yeah, you can use msysgit but who the fuck wants to open up a separate program just to use git? Fuck off Windows. You’re slow and you suck.

Why get a mac? Rails runs faster. You can use the best text editor around, TextMate. You can install all those gems and plugins that all say: “This won’t work on Windows”.

Think getting a mac is too expensive? Get a low spec mac mini for $599. That’s what I started using and even though it’s low spec I never had a problem with it. You can use your USB keyboard, mouse and your monitor from your Windows machine. Still think it’s too much? Have a look on Amazon… Preowned Mac Mini for $350

  • まあわからなくはないのだが,railsで開発するような人でもLinuxやBSD使うのはむずかしいのか? それなら金もかからんうえに,もっと自然に使えると思うのだが..
  • TextMateもいいけど,日本語入力に難があるような..

まあなんにせよmacも安くなってきたのはいいのか.
rubypondのsemantic_form_builderはいいかんじそうなので使ってみよう.

rails2.0.2+ruby1.8.7でtestを通らなくなった.

donrailsがうごいてるdonrails.araki.netではruby1.8.5で動いているので問題ないのだが,ノートの上のsidではrubyが1.8.7にあがったようで,rails2.0.2+ruby1.8.7でtestを通らなくなった.

まずひとつ目はtruncate(/var/lib/gems/1.8/gems/actionpack-2.0.2/lib/action_view/helpers/text_helper.rb)を見てみる.

      def truncate(text, length = 30, truncate_string = "...")
        if text.nil? then return end
        l = length - truncate_string.chars.length
        (text.chars.length > length ? text.chars[0...l] + truncate_string : text).to_s
      end

どうやらtext.chars.lengthというのを中で使っていて,ruby1.8.7ではtext.chars.lengthがつかえない.これはので,text.chars.to_a.lengthとすれば回避できた.1.8.7で,Enumerable::Enumerator を返すようになったのが問題なのかな.

irb(main):001:0> "hoge".chars.length
NoMethodError: undefined method `length' for #<enumerable::enumerator:0xb7be8c70>
        from (irb):1
irb(main):002:0> "hoge".chars.to_a.length
=> 4
irb(main):003:0> "hoge".length
=> 4

というかんじ.はて.etchではどうかとおもったが,

irb(main):001:0> "hoge".chars.length
NoMethodError: undefined method `chars' for "hoge":String
        from (irb):1
irb(main):002:0> "hoge".chars.to_a.length
NoMethodError: undefined method `chars' for "hoge":String
        from (irb):2
        from :0
irb(main):003:0> "hoge".length
=> 4
irb(main):004:0> RUBY_VERSION
=> "1.8.5"

あれれ.しかしどっちにしろ"hoge".lengthですむのになんでString.charsなってんだろ.国際化対応のせいなのかなあ..よーわからん.世にはこんなパッチを出している人もいるようで. http://www.ruby-mine.de/assets/2007/12/31/ruby-19-on-rails-fixes.diff

手元ではrails2.1.0 + ruby1.8.7でやる時期がきたのかもしれない.

railsのtest時にflash[:what]を設定する

g15のためにadminとしてloginしなくても記事が書けるように新たにauthorコントローラをつくってみた.
作ったからにはtestも書いておかねばならんが,controllerの動作中でflash[:author_name]の値を使っているので,これをtestのrequestにも追加しなければならない.

しかしなかなかうまくいかなかった.まあ結局のところこんなかんじでうまくいった.

http://techno.hippy.jp/rorwiki/?HowtoFunctionalTest

質問 2: ある@flashアイテムがセットされていたら、ビューに特定のセクションが表示されることをテストしたかったら、どうやって@flashオブジェクトをセットアップすればいい? request.session[‘flash’]に値を設定してみたんだけど、うまくいかないみたいだった。

答え: リクエストはパラメータを4つ受け取って、最後がflashパラメータだ。 たとえば: get :index, nil, nil, { :what =&amp;gt; “ever” }

ということだった.

donrailsのBackgrounDRbをつかったpinngerが動かなくなっていたので修復

donrailsではBackgrounDRbをつかってgoogle等にpingをとばしている.
BackgrounDRbが1.0.3になったら,そのためのpinngerが動かなくなっていたので修復した.
ようはBackgounDRbで呼びだすPinggerWokerが内部でActiveRecordをつかってとあるmodelを呼びだしているのだが,呼びだせなくなっていた.
ようするに,lazy_load: true としてやればいいというだけのことだった.
わかってしまえば何てことはないのだがな.

BackgrounDRb – Introduction BackgrounDRb

lazy_load option should be false if you want to pass ActiveRecord model objects around, However, this option is generally not encouraged to use, because if your model makes use of some other ActiveRecord plugin and plugin is not available during load, loading of model will fail. In new version of BackgrounDRb its generally discouraged to pass model objects around, since they are harder to serialize and deserialize.

BackgrounDRb – Introduction BackgrounDRb

:lazy_load: true # load models eagerly

いろんな作業のためにPHP rails mod_proxy…

とある目的でPHPで構築されていたwebを徐々にrailsにかえていくというミッションをやっている.

  • プランA: 現pageのphpファイルをRAILS_ROOT/public以下にcopyし,phpとfcgiを両方動作させる方法.この問題点はphpとfcgiの両方動作させることができるか未知数なところ
  • プランB: 現pageのPHPはdynamicなpage生成につかわれているわけではないのでphpのレンダリング結果をどうにかして全部RAILS_ROOT/public以下に展開する.wgetかなんかすれば全部つくれるとは思うけど,ちょっとでかいかもしれない.
  • プランC: 現pageとは別の11011で別途はしらせたまま11011にmod_proxyする.安定性が問題かも.

まあ個人的にはA,B,Cの順に綺麗な解だと思っているが,どの方法にも一長一短がある.結局いろいろやったところAの方法で.

けっきょく RAILS_ROOT/public/.htaccessをこんなかんじにした.

AddHandler fcgid-script .fcgi
AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI -Indexes
DirectoryIndex index.cgi index.html index.shtml index.php

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [R]

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} \.php
RewriteRule ^(.*)$ $1 [QSA,L]

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME}/index.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME}/index.php -f
RewriteRule ^(.*)$ $1/index.php [QSA,L]

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ $1 [QSA,L]

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^(publications|admin/.*)/?$ dispatch.fcgi [QSA,L]

この最終行がちょっと気にいらないところで,けっきょくこう書かないとPHPとの共存ができないかなしいことに.

RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

にしてしまうとなぜか[L]が効かず,PHPのほうまでこの行が有効になってしまうのでありました.

とりあえずこれ以上の深追いはしないことにした.

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

rails 2.0.1とjrubyと。。

あくまでメインは仕事のためなんだが、仕事の実装がJRubyでは動かないままだったのだが、土曜にJRuby1.0.3もでたし、railsも2.0.1でたし、ってことでちゃんと動かしてみようと。が、結果から言うと、クリーンで単純なものならあっさり動き、自分がいじっているコードはそうじゃないので大変。というものであった。いっそsvnきりなおしてcleanなとこから書きなおしてやろうか。。というかんじである。

  • ActiveScaffoldはtrunkにしないとrails2.0.1では動かない。rake testの段階で詰まるのでrake testしてりゃ気がつく。
  • そういうときはsvn externalするのが常套なのだがすっかり忘れていた。
    svn propedit svn:externals vender/plugins
    

    するとeditorで

    active_scaffold http://activescaffold.googlecode.com/svn/trunk
    
  • database.ymlにsocket: でmysqlのsocketをかいてやらんと、rails2.0にしたせいかdefaultの位置がズレているようでだめだった。

まあともかくどうしてくれようか感ただようので、手でdrbあげていたところも、BackgrounDRbにしたいところだし。どうするかなあ。

とはいえ1/6と1/9とにconference締切が迫っているので本質的なところで時間が。

railsでjsとかの?以降のタイムを表示させない方法

まあ実際のとこFileの時間をみているので気にしなくていいらしい。

T氏がasset_idほにゃららがウンヌンという話になったので、Y氏が

def rails_asset_id(source)
  ENV["RAILS_ASSET_ID"] || File.mtime("#{RAILS_ROOT}/public/#{source}").to_i.to_s rescue
end

Fileの時間なのでcacheとかは問題ないんでは?消したければ

ENV["RAILS_ASSET_ID"]=""

ということでいいらしい。と、おしえてくれた。

(関係者様の都合と私の忘却力により一部改変)

ActiveScaffoldの代わりになるかと期待してstreamlinedをためしてみる

残念なことに8/1時点(trunk)のActiveScaffoldはhas_many :throughでモデル化されたものについてeditすることができていない。7/21のメールではできるよー、って話なんだができてないのでまあそこのあたりは作るかなと。

そこで0.0.6からすでに対応している、とのたまっているstreamlinedをためしてみた。ためしたのは、すでにact_as_streamlinedになっている最近のやつ。http://www-128.ibm.com/developerworks/java/library/j-cb09056/にるDWの記事をみたり、してみたのだが、

  • どうにもhas_many :throughの先をeditすることができない。
  • たとえばAuthorsモデルをいじるには controller => ‘author’ にするのが前提で、Admin::authorをつくってディレクトリの下にとじこめようとしても、/author/edit…みたいなのをlink先として作ってしまう(いちおうauthorのところは別のに変えることもできる)のでどうも気にくわない。

Bankgok timesにはRailsの記事が載っていた。

ふとプールサイドでIT記事をよんでいたらRailsの記事が。

image 

ruby1.8.6まで出てるけど1.8.5で動かすことをおすすめするとか、mac windows用One click installerがあるとかは書いてあるのだが、MVCのこととかDBのこととかは書いていない。

あろうことかコードまでもたったこれだけだがのっている。そして惜しいことにスペースが消されている。

image

そして移行のためにrake db:migrate

donrailsではながいことmigrate機能をつかってこなかった。これは

  • donrailsをはじめたころにはそんなもんなかった
  • migrateは当初sqlite、sqlite3に未対応
  • donrailsというか私はそれをつかっていた

という理由だったのだがすべて解決し、今やOracleでもMSSQLでもmigrateできてしまうのでこれを使うことにした。

最初からmigrateをつかっていればはまらなかったのだが、不幸にも私ははまるケースで、

 rake db:migrate

をすると、なんと使っていたテーブル(とその内容)が消えてしまう現象が。

いろいろ疑ったり試したりした結果、production -> developmentにcopyしてdevelopmentでmigrateしたあとでdatabase.ymlをかきかえという方法で対応することにした。

 $ mysqldump -t donrails_production > donrails-0712a.sql
 $ vi database.yml

して、developmentにdonrails_production2を追加

 $ mysqladmin create donrails_production2 

で、db作成

 $ rake db:migrate VERSION=1

テーブルがいろいろできる

 $ mysql donrails_production2 < /tmp/donrails-0712a.sql

元のデータをかきもどし。

ここまででokなのだが今回はついでにtableを一部変更してversion2にしないといかんので

 $ rake db:migrate VERSION=2

としてChangeHabtmToHmtを適用。

 $ vi database.yml

prodcutionにdonrails_production2をみるように書きかえる。

メモ:mysqldumpによるバックアップ

  • テーブルを作成させない形式でのバックアップ: mysqldump -t donrails_development

  • 通常のバックアップ: mysqldump donrails_development

というわけで終了