Posts Tagged ‘Ruby’

1 | No Comments | 11月 12th, 2009

 amazon web services が署名が必要になって、名前も amazon Product Advertising API とかなってたので、コードを変更しなきゃと思ってサンプルページ見たけど、途中に描かれている値が間違っているみたいだ…。

サンプルリクエストに署名を行うためのステップ 【amazonヘルプ】 の、Version=2009-03-31 という文字列が、正しくは Version=2009-01-06 みたいです。

下記のサイトを参考にしました。下記のページだと、ヘルプページと最終出力は同じなのに、入力値が違う!って気づいたので、合わせてみたらちゃんと出来ました。

require 'hmac/sha2'
require 'base64'
 
def genreate_hash(original_url)
  url_string = original_url.split('&').sort.join('&')
  string = ['GET', 'webservices.amazon.com', '/onca/xml', url_string].join("\n")
  Base64.encode64(HMAC::SHA256.digest('1234567890', string))
end

上記で original_url を

"Service=AWSECommerceService&AWSAccessKeyId=00000000000000000000&Operation=ItemLookup&ItemId=0679722769&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Version=2009-01-06&Timestamp=2009-01-01T12%3A00%3A00Z"

とすれば、

Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=\n

が出力されます。

なお、サンプル通りの文字列でやると、url_string が

"Service=AWSECommerceService&AWSAccessKeyId=00000000000000000000&Operation=ItemLookup&ItemId=0679722769&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Version=2009-03-31&Timestamp=2009-01-01T12%3A00%3A00Z"

となって、

EDWJ1+VXQhAtPDKQ0f+wpaFQcBVDJyTIpDP7BZgxMiA=\n

が出力されます。

1 | No Comments | 7月 26th, 2009

Windows の Ruby で、Thread 内で新規プロセスを立ち上げようとすると、Thread 内で全体の動作を止めてしまうらしい。たとえば、

Thread.new do 
  `something.exe`
end

とやってみると、`something.exe` の処理が終わるのを待っているようだ。

Windows+Rubyで外部プロセスを立ち上げる時の注意 にまさにその情報が載っていた。Windows は、Windows::Process 等を使う必要があるみたいです。

require 'rubygems'
require 'win32/process'
require 'windows/synchronize'
require 'windows/process'
require 'windows/handle'
 
include Windows::Synchronize
include Windows::Process
include Windows::Handle
 
t = Thread.new do 
  Process.create('app_name' => 'something.exe')
end
puts "hello!"
t.join

のようにしたら、プロセス生成してもそこで止まることは無くなりました。

未分類 | No Comments | 5月 20th, 2009

RailsのActiveRecordで、save! とかすると保存に失敗したとき例外を投げてくれる。例えば、User.create!(params[:user]) とかして、失敗すると、ActiveRecord::RecordInvalid を投げてくれるのだけど、エラーをどうやって取るのか調べたのでメモ。

よくある例で、ユーザが作れたら index へ遷移して、作れなかったら new で再入力させるという場合。

createを使う場合

def create
  if @user = User.create(params[:user])
    flash[:notice] = 'ユーザ作成しました'
    redirect_to :action => 'index'
  else
    # ここでは、@user.errors でエラーが取れる
    render :action => 'new'
  end
end

create!を使う場合

def create
  @user = User.create!(params[:user])
  flash[:notice] = 'ユーザ作成しました'
  redirect_to :action => 'index'
rescue ActiveRecord::RecordInvalid => e
  # @user は nil になっているので、 @user.errors でエラーが取れない。
  render :action => 'new'
end

としたとき、create! で例外が飛んでいるので、当然 @user は nil となってます。なので、rescue 句の中で @user.errors ではエラーが取れません。

調べたところ、e.record で、ActiveRecord の例外を発生させたインスタンスが取れるようです。

def create
  @user = User.create!(params[:user])
  flash[:notice] = 'ユーザ作成しました'
  redirect_to :action => 'index'
rescue ActiveRecord::RecordInvalid => e
  # e.record に Userクラスのインスタンスが入ってる。
  @user = e.record
  render :action => 'new'
end

たとえば、View内で

< %= error_messages_for :user %>

とかしたい場合は、@user = e.record として置けばエラーが楽に表示出来て良い。

未分類 | No Comments | 5月 12th, 2009

OSXを使って、rubyでtokyotyrant使ってみた。

インストール

tokyocabinet

最新版を公式サイトから落としてくる。現時点での最新は、1.4.20だった。

% curl -O http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.20.tar.gz
% tar xvzf tokyocabinet-1.4.20.tar.gz
% cd tokyocabinet-1.4.20
% ./confiruge --prefix=/usr/local
% make 
# make install
tokyotyrant

同様に、最新版を公式サイトのtokyotyrantのパッケージ一覧から落としてくる。現時点での最新は、1.1.26だった。

% curl -O http://tokyocabinet.sourceforge.net/tyrantpkg/tokyotyrant-1.1.26.tar.gz
% tar xvzf tokyotyrant-1.1.26.tar.gz
% cd tokyotyrant-1.1.26
% ./confiruge --prefix=/usr/local
% make 
# make install
tokyocabinet Ruby用API

同様に、最新版を公式サイトのRubyAPIの一覧から落としてくる。現時点での最新は、1.23だった。

% curl -O http://tokyocabinet.sourceforge.net/rubypkg/tokyocabinet-ruby-1.23.tar.gz
% tar xvzf tokyocabinet-ruby-1.23.tar.gz
% cd tokyocabinet-ruby-1.23
% ruby extconf.rb
% make 
# make install
tokyotyrant Ruby用API

同様に、最新版を公式サイトのRubyAPIの一覧から落としてくる。現時点での最新は、1.5だった。

% curl -O http://tokyocabinet.sourceforge.net/tyrantrubypkg/tokyotyrant-ruby-1.5.tar.gz
% tar xvzf tokyotyrant-ruby-1.5.tar.gz
% cd cd tokyotyrant-ruby-1.5
# ruby install.rb

tokyotyrantサーバを起動してみる

% sudo /usr/local/sbin/ttservctl start
Starting the server of Tokyo Tyrant
/usr/local/sbin/ttservctl: line 49: ulimit: open files: cannot modify limit: Invalid argument
Executing: ttserver -port 1978 -dmn -pid /var/ttserver/pid
Done

なんかエラーが出るので、/usr/local/sbin/ttservctl の49行目を見てみる。

48
49
50
if [ -n "$maxcon" ] ; then
   ulimit -n "$maxcon"
 fi

maxcon という変数を見てみると

21
22
23
dbname="$basedir/casket.tch#bnum=1000000"
maxcon="65535"
retval=0

ulimit がエラーらしいが、ulimit がよく分からない。適当に数字を maxcon=6000 とかしたらエラー消えたけどいいのか…?

というわけで、無事起動。

接続

シェルから接続する場合は、tcrmgr というコマンドを使うらしい。

値の設定

tcrmgr set {host} {key} {value} という書式でセットする。name というキーに、CHU といれるならば、

tcrmgr set localhost name CHU
値の取得

tcrmgr get {host} {key} という書式でゲットする。name というキーの値を取得するならば、

tcrmgr get localhost name

とりあえず、起動して動いているようだ。

未分類 | No Comments | 8月 18th, 2008

 よりよい家計簿を目指して、RubyAMFを使ってみる。Rails + Flex3.0 でやろうと。

インストール(Rails側)

$ script/plugin install --force http://rubyamf.googlecode.com/svn/trunk/rubyamf/

設定

 インストールすると config/rubyamf_config.rb が出来るので、ここで設定を行う。

無視したいフィールドがあったら、下記のように指定する。

ClassMappings.ignore_fields = ['created_at','created_on','updated_at','updated_on']

ActionScript側で、変数名をキャメルにするかアンスコ区切りにするか。

ClassMappings.