2010-11-30

ActiveScaffoldでNestedを使ったらエラーが出たよ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのScaffoldをステキにする
ActiveScaffold
を使っています。

ActiveScaffoldは、以下のページで記載されているようにすることで管理画面をネストすることができます。
https://github.com/activescaffold/active_scaffold/wiki/API%3A-Nested

でもRails2.3で利用すると以下のようなエラーが出て利用できませんでした。
ActionView::TemplateError (undefined method `render_component' for #<ActionView::Base:0xb76b7224>) on line #39 of vendor/plugins/active_scaffold/frontends/default/views/_nested.html.erb:

調べたところ、render_componentというのが2.3では利用できないようで以下のように別途pluginを追加する必要があるようです。
script/plugin install git://github.com/ewildgoose/render_component.git -r rails-2.3

と以下のページに書いてありました。
http://code.google.com/p/activescaffold/issues/detail?id=685

これで無事にネストを利用することができるようになりました。
ステキなActiveScaffoldです。

2010-11-23

ubuntuをEee PC 1018Pに入れてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Eee PC 1018Pを持っているのですが、ハードディスクが相当あるのでいろいろマルチブートにして遊んでみようと思ったのです。

とりあえず190Gぐらいの何も使っていない領域を開放しました。

まずはお手軽にubuntuをいてみようと思ったのですが、思った以上に苦戦してしまいました。

CD-ROMなどはもう手元にないので、USBメモリを利用してインストールしようと思ったのですが、いろんなやり方を試しても
busy box
と表示されてしまいます。
このように表示した場合の対処もいろいろ検索できるのですが、どれもうまくいかず。

確証はないのですが、どうも途中でCDROMがないのに探しにいっている感じで、USBメモリを見失っているような感じです。

最終的には、コチラ
http://ubuntu10144.blog111.fc2.com/blog-entry-15.html
に書いてある方法を参考にAlternate版というものをダウンロードして
こちらを利用してLANに接続した状態で、インストーラーからネット経由で各種ファイルを取得する形でインストールを行うことでなんとか動くようになりました。

ちなみにAlternate版はコチラから取得しました。
http://ftp.riken.jp/Linux/ubuntu-iso/CDs//10.10/

とりあえずインストールが完了して、最初に動かすと無線LANも認識してくれたので、このドライバをネットからダウンロードできたらLAN接続は解除して利用しています。

2010-11-17

rubyを1.8.7から1.9.1にしてみたときのメモ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
rubyが1.8.7で
railsが2.3.5でアプリを作ったアプリをRails3も出ているこのご時勢なので
ちょっとアップデートを試みました。

Rilas3にするのは大変そうな気がしたので、
まずは、railsを2.3.5から2.3.10にアップデート。
こちらはそんなに困らずにアップデートできました。

そしてrubyを1.8.7から1.9.1にアップデートするために
rvmをインストールして複数のバージョンを利用できるようにしました。

rubyを1.9.1にアップデートするには、以下の対応を行いました。
(1)日本語対応させるためのマジックコメント追加
テストを行うと
invalid multibyte char (US-ASCII)
みたいなエラーが出てテストができない状況だったので、
とりあえず各ファイルに以下のようなマジックコメントを追加しました。
# -*- encoding: UTF-8 -*-


(2)FasterCSVの利用をCSVに変更
CSVの処理を行う部分があり、FasterCSVを利用していたのですが
1.9にはFasterCSVが普通にCSVとして組み込まれているようなので
FasterCSVの部分をCSVに置き換えました。


(3)mysqlの接続アダプターの変更
テストを行うと
incompatible character encodings: ASCII-8BIT and UTF-8
みたいなのがたくさん出てきました。
マジックコメントを入れたので日本語対応が済んでいると思ったのですが、
ActiveRecordの結果がいまいちな感じでした。

実際調べてみまたところ、アクティブレコードの出力が確かにASCII-8BITになっていました。
#ファイルで適用されているエンコーディングを出力
p __ENCODING__
Encoding:UTF-8
#アクティブレコードで取得したレコードのエンコーディングを出力
p n[:aaa].encoding
Encoding:ASCII-8BIT
#念のためソースに記載した日本語のエンコーディングを確認
p "あああ".encoding
Encoding:UTF-8

ruby 1.8.7では
gem install mysql
としてmysql用のアダプターを入れていたのですが、どうもこれはだめなようで
ruby-mysql

mysql2
を使う必要があるようです。

単純に移行するならば
ruby-mysql
の方がちゃんと互換性があるようです。
使うときは、以下のように既存を削除して追加する必要があります。
gem uninstall mysql
gem install ruby-mysql

mysql2の方が速いらしいし、Rails3ではこれをつかうっぽいので、
こっちを使ってみることにしてみました。
使うときは、以下のように既存を削除して追加する必要があります。
gem uninstall mysql
gem install mysql2

そしてconfig/database.ymlのadapterを
adapter: mysql2
とする必要があります。

ちなみにnum_rowsを使って検索件数を取得していたのですが、
mysql2にはないのでcountに置き換えました。

だいたいこんな感じで1.9.1の対応ができました。

ちなみに1.9にするとスピードもあがるとのことなので1.8.7のときと1.9.1のときの同じテストを行ったときの時間を参考までに。

1.8.7 Finished in 270.402445 seconds
1.9.1 Finished in 218.353968929 seconds

確かに速くなっています。

2010-11-10

大量のデータをActiveRecordで処理するとき

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsで大量のデータを処理するときです。

何も考えずに
User.find(:all,:conditions=>"age > 18").each do |u|
 #なんか処理
end
みたいなことをやっていました。

データが増えるとメモリがえらいことになってしまいました。

そんな時は、
User.find_each(:conditions=>"age > 18") do |u|
 #なんか処理
end
みたいにするとメモリの利用を削減できます。

以下が参考になります。
ここではRails3の説明となっていますが、2.3の新しいめのバージョンならば使えるようです。
http://wiki.usagee.co.jp/ruby/rails/RailsGuides%E3%82%92%E3%82%86%E3%81%A3%E3%81%8F%E3%82%8A%E5%92%8C%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%88/Active%20Record%20Query%20Interface#i803e697

2010-11-07

「図書ぶら」というのを作ってみました

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
図書館サイトの検索結果ページに、その本に関連する本のリストとAmazonへのリンクを追加するGreasemonkeyスクリプト「図書ぶら」というのを作ってみました。

私は、図書館をよく利用しています。
探す本がわかっているときはいいのですが、なんとなく本を探したいというときには、図書館サイトはむかないつくりになっています。
amazonさんの場合は本に関連する本を紹介してくれるので、参考にしちゃっています。
なのでそのamazonさんの関連本を図書館サイトの方にも表示させるようにしたら便利かもしれないと思い作ってみたのが「図書ぶら」です。

図書館で本を使う方は使ってみていただけるとうれしいです。

現在は、東京23区だけの対応になっていますがご要望があれば他の図書館にも対応したいと思っています。

ちなみに関連本を表示するためには、
Amazon Product Advertising API
を使っています。
その関連本が、その図書館に存在するかを調べるために
カーリル | 図書館API仕様書
を使っています。
これらのAPIはGoogleAppEngine上に作成したアプリがProxyして要求をかけています。
以下のような感じです。
図書ぶら-->GoogleAppEngine-->Amazon,カーリル

2010-11-06

GreasemonkeyスクリプトでGM_getValueをイベントで使おうとしたら

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Greasemonkeyスクリプトを最近、いじってあそんでいます。
GM_getValueというデータを永続化しておくことができるGreasemonkeyの関数があるのですが、
これをクリックイベントの中で使おうとしたら

Error: Greasemonkey access violation: unsafeWindow cannot call GM_getValue.

とエラーが出てしまいました。

イベントの中で普通にこのように書くとダメなのです。
 var value = "bar";
 GM_setValue("foo", value);

でも、以下のように書くとOKになります。
  var value = "bar";
  setTimeout(function() {
    GM_setValue("foo", value);
  }, 0);
setTimeoutでくくればOKなようです。なぜかはよくわかりません。

ちなみに
http://wiki.greasespot.net/0.7.20080121.0%2B_compatibility
に書いてありました。