Archive for the ‘ruby’ Category

Rails On Amazon Web Service [amazon-ecs]

Monday, February 8th, 2010

Rails上でAmazon Web Serviceを利用してみる。
「amazon-ecs」という素晴らしいgemライブラリがあったので、すぐにデータ取得までいけました。
素敵です。

手順① amazon-ecsのインストール

以下のコマンドをかますだけです。

gem install amazon-ecs

手順② amazon-ecs設定

config/enviroment.rbに以下の行を追加します。
secret_keyとaccess_keyはAmazon Web Servie登録後に取得できます。
secret_keyがないとエラーがでて取得できません。

require ‘amazon/ecs’

Amazon::Ecs.options = {
:aWS_access_key_id => “your_aWS_access_key”,
 :secret_access_key => “your_secret_access_key”
 :associate_tag => “stepfeed-22″,
:country => :jp
}

各種キーは以下のようにページにあります。↓
amazon

手順③ データ取得

基本的には手順①②を終えればRailsアプリ上でどこでも取得できます。

★一番シンプルなクエリ↓

res = Amazon::Ecs.item_search(”Rails”)

★ジャンルを絞る場合はこんな感じ (ex: ジャンル[Grocery]で絞り込み)

res = Amazon::Ecs.item_search(”Rails”, {:search_index => “Grocery”})

★デフォルトだと最低限のデータしか受け取れない。そのため、取得データ量を調整します。

res = Amazon::Ecs.item_search(”Rails”, {:response_group => ‘Large’})

★もちろん並べ替えもできます。

res = Amazon::Ecs.item_search(”Rails”, {:sort => ‘titlerank’})

※ジャンル一覧
['All','Apparel','Automotive','Baby','Beauty','Blended','Books','Classical','DVD','Electronics','ForeignBooks','Grocery','HealthPersonalCare','Hobbies','HomeImprovement','Jewelry','Kitchen','Music','MusicTracks','OfficeProducts','Shoes','Software','SportingGoods','Toys','VHS','Video','VideoGames','Watches']

※Response_group一覧
["large", "medium", "small"]

■参考サイト

http://amazon-ecs.rubyforge.org/doc/
http://docs.amazonwebservices.com/AWSEcommerceService/2005-10-05/PgDatamodelAttributes.html#Books
http://brass.to/blog/rails_with_amazon_web_service.html
http://d.hatena.ne.jp/willnet/20090716/1247737270
http://www.zo-i.com/project004cpro01/amazon-api%E3%81%8B%E3%82%89%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%96%E5%BE%97.html

[RubyOnRails] 自サイトのドメイン名を取得する方法

Tuesday, October 6th, 2009

こんな方法が、、
知らなかった。

request.raw_host_with_port

ドメイン名とポートを取得してくれます。

まぁ滅多につかうもんでもないけど。。

【Rails2.3.4】 ./script/plugin install git://github.com/rails/country_select.git

Tuesday, September 29th, 2009

今更ですが、

Rails2.2からcountry_selectメソッドがなくなりました。

なんでrails2.2以前からバージョンあげた場合は、別途用意されているプラグインを入れてください。

./script/plugin install git://github.com/rails/country_select.git

[Ruby1.9 on Rails] マルチバイト文字列でエラー : incompatible character encodings: UTF-8 and ASCII-8BIT

Tuesday, July 7th, 2009

前回の続き
http://b.ruyaka.com/2009/07/06/ruby19-gem-install-mysql-ではまる/

なんかgem install mysqlでMySQL/Rubyはインスートルできたんですが、
どうやらMySQL/Rubyがruby1.9の「M17N」に対応していない模様。
おかげて、データベースから取り出した文字列は全て「ASCII-8BIT」になってしまいます。

マルチバイト文字列を入れるとASCII-8BITとUTF-8がぶつかりエラーが発生します。
「incompatible character encodings: UTF-8 and ASCII-8BIT」

ほんと困りました。

調べてみたところ解決方法は2通り発見。

① MySQL/Rubyではなく、M17Nに対応しているRuby/MySQLを入れる (ややこしい)
② Rails上で「force_encoding(”UTF-8″)」で無理やり「UTF-8」に変更する。

①の「Ruby/MySQL」はtmtmsさんが作成してくれてました。
RubyコンパイルされているRuby/MySQL 3.0.0がでています。
ただ、アルファ版というのと、いくつか不安な部分もあったので今回は②番で対応することに。

②の変更点
ちょっと強引ですが、read_attributesの部分で文字列がきたら強制的に「UTF-8」になるように変更。
一応これでエラーはでなくなりました。

上記はActiveRecord周りの文字コードの対応ですが、
テンプレートのほうも対応するようにしてあげる必要があるようです。

vendor/rails/actionpack/lib/action_view/renderable.rb: 69行目

これでなんとか対応完了。
かなり強引ですが、他もっと簡単なやり方があると教えていただけると助かります。

以下、参考サイト
http://groups.google.co.jp/group/rubyonrails-talk/browse_thread/thread/45cf95921c8fe21f
http://74.125.155.132/search?q=cache:LMULoqmE-SMJ:d.hatena.ne.jp/tmtms/20090201/1233499176+%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%97%E3%81%9F%E6%96%87%E5%AD%97%E5%88%97%E3%81%AF%E3%80%81%E5%85%A8%E9%83%A8+ASCII-8BIT+%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99&cd=2&hl=ja&ct=clnk&gl=jp&lr=lang_ja&client=firefox-a
http://e-words.jp/w/M17N.html
http://d.hatena.ne.jp/tmtms/20090322/1237719050
http://d.hatena.ne.jp/xibbar/20090126/1232946944
http://qwik.jp/asakusarb/56.html

[Ruby1.9] gem install mysql ではまる

Monday, July 6th, 2009

そろそろ各ライブラリも1.9に対応してきたので。rails開発もruby1.8から1.9に移行。
今までのテストでも処理によるけど確実に2倍以上は早くなっている。
このまま1.8だとなにかと不安です。
ruby1.9・rubygems・railsなどのインストールは順調に進んだが、mysqlのインストールではまる。


結論から言うと、
  「gemでインストールされるmysqlのバージョンが古いまま」
なのが原因でした。

なので1.9の場合は、直接本家にインストールしてあげる必要があるそうです。

エラー内容

以下、実行すれば解決。

[Rails] ruby 1.9.1 VS ruby 1.8.7

Sunday, June 14th, 2009

Railsでruby1.9と1.8って実際にどれくらいパフォーマンスに差があるんだろうか。
ということで簡単なテストを試してみる。

単純にrubyの1.9と1.8でScaffoldで生成した一覧ページを測定してみる。
一覧に登録した件数は5件です。

Ruby1.8

Ruby1.9

結果

1秒あたりのリクエスト数はruby1.9のほうがほぼ1.5倍の多くリクエストをこなせるということになる。
かなりシンプルなテストなのでこれを根拠にすることはできないが、もっと複雑にシステムになればなるほど
より顕著に差ができるのではないのかなと思います。

・ruby1.8
  → 20.80 request / sec

・ruby1.9
  → 30.50 request / sec

[Ruby] Sinatra

Thursday, April 23rd, 2009

Rubyフレームワークといえば、誰もが「Ruby On Rails」と答えるでしょうが、
そんな中、Railsではない素敵なフレームワークを発見しました。

用途してはRailsは至れり尽くせりで嬉しいけどちょっとしつこいよね。ってな時でしょうか。

超軽量Rubyフレームワーク 「sinata」
http://www.sinatrarb.com/

サイトのトップを見ただけでどれだけ軽量なのかがわかります。

[Sinatra]環境構築

gemを一発かますだけ。

[Sinatra]Hello World

HelloWorldわずか5行。

hello.rb

[Sinatra]勿論テンプレートも分けれます

viewsフォルダを作成
views/index.erb

[Sinatra]レイアウトも作成可能

views/layout.erb

これはかなりシンプルでいいかも。
Passengerにも対応しているようです。
静的なサイトであればRailsからSinataに乗り換えてもいいと思いました。

[Ruby] クローラー作成 スクレイピング scrape

Wednesday, April 22nd, 2009

久々にRubyでクローラー作成。
クローラー先は内緒で。
素敵にライブラリがあるので一瞬でデータを取ってこれちゃいます。

まずはgemでscrapiをインストール

rubyファイルを作成。Scrape用のクラスを作成してみます。

scrape_site.rb

[RMagick] ImageList プロパティ一覧

Wednesday, March 11th, 2009

RmagickのImageListプロパティ一覧

詳細はこちら
http://studio.imagemagick.org/RMagick/doc/imageattrs.html

使用しそうなやつ。

[RMagick] ネットワーク経由で画像の送信

Tuesday, March 10th, 2009

ネットワーク経由で画像の送信してみる。
経緯としては、
今、画像用のAPIを開発しようとしていて、
ネットワーク経由で画像データをどうやって渡そう。ってとこからはじまりました。
作業自体はシンプルですが、一応自分用に書き留めておくことにしました。

使用する言語は表題通りRMagickです。
RMagick Reference
http://studio.imagemagick.org/RMagick/doc/

ネットワークはHTTP/HTTPSでの送信になります。

流れとしては以下な感じです。
①[Client] 画像データ取得&加工
②[Client] 画像データ送信
③[Server] 画像データ受信
④[Server] 画像データ解析&保存

検証

①【[Client] 画像データ取得&加工】

Railsコンソールで試しているのでデフォルトで入っているrails.pngを使用します。

②【[Client] 画像データ送信】
次にhttpで送信してみます。
そのまま上記のコンソール上でhttpで送信します。
open-uriを使えば楽チンです。
試しにパラメーター「?image=」にいれてみます。
ただ、readデータそのままだと文字化け引き起こして送信できないので
Base64変換する必要がある。さらにBase64だと”+”や”/”が問題を起こす事もあるので
さらに URI.escapeをしてあげる。
Base64変換 → URI.escapse

※HTTP圧縮
実際に送信する時は、httpクライアントにヘッダーで圧縮アルゴリズムを使用してサイズを縮小する必要があります。
ほとんどのWEBブラウザでは自動的に付加するが、プログラムクライアントではされていない。
HTTP圧縮用ヘッダー
Accept-Encoding: gzip,compress

③【[Server] 画像データ受信】 & 【[Server] 画像データ解析&保存】
サーバー側ではimageパラメーターで渡されてきたデータを取得&解析します。
基本的には、送信時の逆の流れを行えばいいので、
URI.decode >> Base64.decode64(params[:image])
という事になります。
解析したファイルにリサイズなどの処理を加えたいので、そのままRMagickに渡します。

基本的な流れ。

あとは上記にリサイズなどの処理を追加すればよいのかなと。