[雑記] FINAL FANTASY XII LIGHTNING EDITION購入

FINAL FANTASY XIII LIGHTNING EDITION

FINAL FANTASY XIII LIGHTNING EDITION

 待望の「ファイナルファンタジー13 ライトニングエディション(PS3同梱版)」が昨日、届きました。見た目はカッコイイ! でもやたらでかいです。ちなみにソフトはまだ未プレイです。

[雑記] TV購入

TV購入

 以前から検討していた地デジ対応テレビをついに購入。買ったのは「Sony BRAVIA KDL-32F5」。

 地デジやBS放送などについてまったく知識がなく、分配器と分波器についてビックカメラ店員に説明してもらいました。そんなこんなでようやく設置完了。14インチ韓国製液晶テレビから切り替えたので、ものすごい綺麗さ。。。なんかむしろ目が痛くなるorz

 でもこの大画面(私にとっては)でやるゲームは大した迫力があります。まもなくPS3同梱版のFF13が届くので、非常に楽しみです♪

【JIC ミニアンケート】半数以上が「Google 日本語入力」を利用

グーグルは12月3日、日本語入力ソフト「Google 日本語入力」を無料にて公開した。ネット上では、“マニアックなワードも収録されていて便利”“使い勝手がいい”など、早くも「Google 日本語入力」を賞賛する声が挙がっており、評価は上々のようだ。

では、公開から10日ほど経った今、すでに利用しているという人はどれほどいるのだろうか。

インターネットコムは、japan.internet.com の読者に対し「Google 日本語入力」についてミニアンケートを実施、それによると、半数以上(56.7%)がすでに「Google 日本語入力」を利用していることがわかった。

なお、3割(31.5%)も「使ってみたい」と回答しており、「使ってみたいと思わない」としたのは約1割(11.8%)と少数だった。

現在 IME と言えば、マイクロソフトの Microsoft IME や、ジャストシステムの ATOK などが主流だが、今後「Google 日本語入力」が、その位置に取って代わる日は来るのだろうか。

元記事:http://japan.internet.com/wmnews/20091214/6.html
japan.internet.com Webマーケティング より引用

 快進撃の「Google日本語入力」! …まだ試してないですorz

[Web Service][Tools] Google 日本語入力

日々是遊戯:「藤崎詩織」や「怒首領蜂」も一発変換――意外にゲームマニアだった「Google日本語入力」先生に萌える (1/5) - ITmedia Gamez

 凄いので帰ったら是非使ってみようと思う。備忘録。

[WordPress] Amazon アソシエイト についてのまとめ

Amazon アソシエイト を始める

 「Amazon アソシエイト(Associate)」とはいわゆるAmazonによる”アフェリエイト”サービスです。”アフェリエイト”とは登録した人が自分のサイトなどで商品を紹介し、その紹介を経由して商品が売れた場合、その紹介者に企業からお金が入るというサービスです。ぶっちゃけ企業の手先ですw
 人気サイトなどを運営されている方の場合、どんどんお金が入るらしく、有名サイト様ですと、たまに還元サービスなどを実施して、いつも利用してくれる人たちに商品をプレゼント!…なんてことまでしているみたいです。

還元サービスしている神サイト様例

  • ラノベの杜
  • 徒然なる日々の中で : アフィリエイト還元企画 第二弾
    •  ※注意 いつもしているわけではありません。

       と、いいつつも、このサイトがそんなに人気のあるサイトではありませんし、商品を買ってもらえるほど信頼性のあるサイトではありませんので、私自身は収入を得られるつもりは毛頭ありません=私は還元しませんw
       今回やってみようと思ったのは、ただ興味を持ったからです。”Amazon ECS”で使用するためにアフェリエイトを行う為のアソシエイトIDを持っているんですが、そのID宛てに「今回の成功報酬は0円です」とかってメールがやたらくるので、ちょっと興味を持ってやり方を調べてみました。

      Amazon アソシエイト の公式機能まとめ

       Amazon アソシエイトの公式サイトを眺めていましたが、どうやらAmazonのサイトで商品単位やウィッシュリストなどでタグを生成してくれるので、それを貼り付ければいいようです。早速やってみます。

      リンク&バナー : 商品リンク

       好きな商品へのリンクを作成できる。表示する要素や色なども選べるし、テキストのみも可能。しかし、よく見ますね、これ。。。

      リンク&バナー : 検索結果へのリンク

       Amazonでの検索結果を貼り付けるバージョン。下のリンクの内容が鼻に付くのは勘弁してくださいm(_ _)m

      エラリー・クイーンの洋書

      リンク&バナー : バナーリンク

       好きなカテゴリへのバナーリンクを作成できる。これはゲームのバナーリンクです。

      リンク&バナー : イージーリンク

       大きさだけを選んでAmazonのバナーを表示する機能。これもよく見ますね。

      ウェジット - Amazonおまかせリンク(R)

       ウェジットも結構ある。ウェジットはたくさん貼り付けると重いので、その中から一つサンプルで配置。サイトにそぐう商品を紹介してくれるウェジットらしい。いったい、どんなものがひょうじされるやら。。。


       なるほど、よく見たことがあるものばかりで、どれだけ普及しているかが伺い知れます。さて続いてWordPress用のAmazon アソシエイト機能を調査してみます。

      WordPress においての Amazon アソシエイト

       これについてはこちらの参考サイトをご覧ください。

      参考サイト様

       見ての通り、全部同じサイト様です。こちらの一連の記事を読むと、WordPress のプラグインはよっぽどのことがない限り使わない方がいいことがわかります。私も習ってプラグインは使わないことにします。

      他のアフェリエイト

       他のサイトのアフェリエイトで有名なのは、やっぱり”Google Adsense“や”楽天アフェリエイト“でしょうか。この辺もそのうち調査してみたいですね。

[Ruby on Rails]楽天WEBサービスの503エラーについて

 先日から楽天WEBサービスから利用している楽天APIで商品検索を実行すると以下のようなエラーが発生する問題が起きています。

503 Service Unavailable

 このエラー自体はよく見かけるエラーですが、少し前から頻発してました。この件についての公式リリースはこちらです。

RWS開発日記 — 503エラーに関するお問合せについて - 楽天ウェブサービスの開発・運用チームのブログ -

 こちらのリリースを読むと、どうやら1秒間に1リクエスト以上実行すると503エラーとなり、しばらくは利用できなくなる…ということらしいです。まぁその仕様変更自体はしかたがないので、リクエスト実行前に1秒停止するロジックを追加し、1秒に1回以下に絞ってみました。

    options_query_encoded = URI.encode(options_query)

    # URI.encodeでは'=+'が変換されないので、手動で置換する
    options_query_encoded = options_query_encoded.gsub(/=\+/,'=%2B')

    search_request_url = "#{@request_url}?#{@developer_id_query}#{@affiliate_id_query}#{options_query_encoded}
    &operation=ItemSearch&version=2009-04-15".gsub!("\n","").gsub!(" ","")
    @search_request = search_request_url

    #2009/11/13 リクエストの回数制限対応
    sleep 1

    xml_result = open(@search_request)

 しかしやっぱり503エラーになってしまいます。しょうがないので解決するまで一時的に楽天APIの使用を停止することにしました。…まったく勘弁してください。

[Ruby on Rails]全文検索(フリーワード検索)を無理やりやってみる

全文検索をやりたくなった

 私の蔵書管理ソフトでは全文検索に対応していません。ただ Ruby on Rails で全文検索を探すと”Tritonn”とか”Hyper Estraier”とか、よくわからないプラグインが出てきました。これらを勉強するのがなんとなく嫌だったので、ごり押しでできないものかと考えました。

 本来の全文検索とは言いがたいかもしれませんが、入力された検索語句をスペースで区切って、それらすべてを OR 条件で結べばそれっぽいものになると考え、やってみることに。

 とりあえず変更前の状況はこんな感じです。

#検索文字列を取得
@keywords = params[:keywords]

#where句を取得
title_cond = 'title like :title or other_title like :title '

#パラメータを取得
keyword = '%' + @keywords + '%'

#SQL実行
@books = Book.paginate :page => params[:page],
                   :per_page => 10,
                   :conditions => [title_cond, {:title => keyword}],
                   :order => "id"

 この状態だと検索語句として入力した文字列がそのまま当てはまる本しか拾えません。これを全文まがいにしてみます。

#検索文字列を取得
@keywords = params[:keywords]

#where句を取得する変数の初期化
title_cond = ''

#パラメータを取得するハッシュ配列の初期化
hTitle = Hash::new

#検索文字列を半角・全角スペースで区切る
for word in @keywords.split(/ | /)

  #空欄は条件に含めない
  if word != '' then

    #2回目からは先頭に"or"をつける
    title_cond += 'or ' if title_cond != ''

    #パラメータ変数を含むwhere句の取得
    title_cond += 'title like :title' + i.to_s + ' or other_title like :title' + i.to_s + ' '

    #パラメータハッシュ配列にパラメータを追加
    hTitle[('title' + i.to_s).intern] = '%' + word + '%'

    #パラメータ変数のインデックスをカウントアップ
    i += 1
  end
end

#SQL実行
@books = Book.paginate :page => params[:page],
                   :per_page => 10,
                   :conditions => [title_cond, hTitle],
                   :order => "id"

 特に困ったのが、:condtions に動的な複数の引数を設定する方法です。ハッシュ配列を指定してあげればいいことはわかっていましたが、Paginate 内でハッシュ配列のkeyの呼び出し方が文字列ではなくシンボルだったので、ハッシュ配列のKeyはシンボルを指定しなければいけません。しかし動的にシンボルを使用する方法がわからず悪戦苦闘しました。なんとか intern メソッドを発見して解決しました。

 予想よりも時間がかかりましたが、解決できてよかったです。

[Ruby on Rails] amazon-ecs が Amazon Product Advertising API の署名認証に対応していること (2)

前回の記事

でめ備忘録 » [Ruby on Rails] amazon-ecs が Amazon Product Advertising API の署名認証に対応していること


“amazon-ecs”が署名認証対応していることについての訂正

 先日、投稿した記事では rubygem の”amazon-ecs”が署名認証に対応しているということを書きました。確かに対応はしています。しかし、私の使用していたバージョン(0.5.3)では対応されていませんでした! 対応されているバージョンは“0.5.5″以降です。お詫びして訂正させていただきます。

“amazon-ecs”のバージョンアップ

 さてさくっと謝罪したところで(反省なし)、さっそく”amazon-ecs”のバージョンアップと入りましょう。 CORESERVER ではリモートでのgemのインストールが止められてしまいます。
参考:でめ備忘録 » [Server] [Ruby on Rails] さくらインターネットからCORESERVERへRailsアプリを移動する (2)
 ですので、今回もダウンロードしてローカルからインストールします。いろいろ調べたところ、バージョンアップと共にインストールしなければいけないものがいくつかありましたので、それらも一緒に記述しておきます。

wget http://rubyforge.org/frs/download.php/60727/rubyforge-1.0.4.gem
wget http://rubyforge.org/frs/download.php/56871/rake-0.8.7.gem
wget http://rubyforge.org/frs/download.php/61757/hoe-2.3.3.gem
wget http://files.rubyforge.vm.bytemark.co.uk/ruby-hmac/ruby-hmac-0.3.2.gem
wget http://rubyforge.org/frs/download.php/60602/amazon-ecs-0.5.6.gem

gem install --local rubyforge
gem install --local rake
gem install --local hoe
gem install --local ruby-hmac
gem install --local amazon-ecs

 とりあえずこれで正常に動作するようになりました。ただ、以前より格段に重くなったような。。。仕方ないといえば仕方ないですが。。。

[Ruby on Rails] amazon-ecs が Amazon Product Advertising API の署名認証に対応していること

この記事には続きがあります。
でめ備忘録 » [Ruby on Rails] amazon-ecs が Amazon Product Advertising API の署名認証に対応していること (2)


Amazon ECS で 400 Bad Request Error

2009年8月4日。Amazon ECS を使用した Rails の蔵書管理システムを実行したところ、以下のような表示になりました。

Amazon::RequestError
HTTP Response: 400 Bad Request

これを見て、そーいえばなんか Amazon からメールが来てせっつかれていたなぁ~と思い出しました。でも英語のメールとか読む気が起きなかったので、他人任せにしようとネットを検索して、以下のサイトを参照させていただきました。

Amazon Product Advertising API (認証対応) | Diaspar Journal

ソースとかを読むと、要するに REST でデータを取得してくる際に”Secret Key”を追加しろ、ということらしい。
理屈はわかりましたが、私は gem のツール”amazon-ecs”をそのまま使用しているので、こちらのソースを修正しなければいけないということになります。…めんどい。
で、誰かやってないかなぁ~とネットを調査したところ、こちらのサイトを発見しました。

amazon-ecsに署名認証をつけるようにした - おもしろWEBサービス開発日記

こちらの方が”amazon-ecs”を修正してくださっているそうです。おおすばらしい! ぜひともパクらせていただきましょう!!
…ん? github? 最近、 Rails 市場に触れていなかったので、よくわかりませんでしたが、どうやらパッチとかを公開しておける場所らしい。ここから Download してインストールするのかぁ…なんか嫌な予感が。。。

Killed

案の定、CORESERVER では github からインストールしようとすると削除されてしまいました。

参考: でめ備忘録 » [Server] [Ruby on Rails] さくらインターネットからCORESERVERへRailsアプリを移動する (2)

さてさてどうするか。 github のローカルからのインストール方法を調べるか。。。

amazon-ecs について考えてみる

考えてみたところ、今回の秘密キーの認証ですが、昔 .NET で Amazon ECS を使用していたときは当然のように指定していました。そーいやなんで Rails だといらないのかなぁ~と不思議に思っていたんですが。。。そして気がついたのが、“amazon-ecs”は認証に対応していないのか、ということです。
調査してみたところ…やっぱり”amazon-ecs”は秘密キーに対応していました!! 少なくとも私が使用している”amazon-ecs 0.5.5″では既に対応されていました。

RubyForge: Amazon ECS: Project Info

使用方法は以下の通り。

config/environment.rb

require 'amazon/ecs'
Amazon::Ecs.debug = true
Amazon::Ecs.options = {
  :aWS_access_key_id => "自分のアクセスキー",
  :associate_tag => "自分のアソシエイトID",  #省略可
  :country => :jp,
  :aWS_secret_key => "自分の秘密キー" #←追加
}

なんとか無事に動くようになりました。よかったよかった。


2009/08/15 訂正

amazon-ecs のバージョンが間違っていました。
署名認証に対応しているバージョンは2009年7月18日リリースの 0.5.5 です。

amazon-ecs CHANGELOGより引用

0.5.6 2009-07-21
----------------
* Update parameter value encoding to support special characters

0.5.5 2009-07-18
----------------
* Sign request

この記事には続きがあります。
でめ備忘録 » [Ruby on Rails] amazon-ecs が Amazon Product Advertising API の署名認証に対応していること (2)

[Ruby on Rails]RoRで楽天ウェブサービスを利用してみる

楽天ウェブサービスの存在を知る

 以前、私はRoRの蔵書管理(書だけではありませんが・・・)システムを作成し、そのシステムにAmazon ECSを設定し、未購入商品の最安値情報を自動的に取得して、目標価格を下回った場合にアラートを出してくれる機能を作成しました。

 このシステムは以前から楽天情報の取得も視野に入れていたのですが、非公式ウェブサービスしかなかった為、とりあえず保留にしておきました。

 しかし最近調査したところによると、既に正式サービスが開始されていて、十分使用に耐えられる状態になっているとのことでした。と、いうわけでさっそく使ってみました。

公式サイト:【楽天ウェブサービス】RAKUTEN WEBSERVICE

楽天APIの使い方

 RoRで楽天APIを使用しているサイトが見つからなかったので、Rubyでの使い方を紹介しているこちらのサイトを参考にさせていただきました。

Rubyで楽天APIを使う - asotech

 しかしこちらのコードをそのまま利用すると、ソートパラメータに"最安値順:+itemPrice"などを指定した場合に、"+"が変換されず、上手い具合に検索結果を返してくれません。なのでかなりごり押しでその部分を修正してみました。

require "rubygems"
require "rexml/document"
require "open-uri"

class RakutenItemSearch
  attr_reader :search_result

  def initialize(developer_id=nil, affiliate_id=nil)
    if developer_id
      @developer_id_query = "developerId=#{developer_id}"
    else
      return nil, "Developer IDをセットして下さい"
    end

    @affiliate_id_query = "&affiliateId=#{affiliate_id}" if affiliate_id
    @request_url = "http://api.rakuten.co.jp/rws/2.0/rest"
  end

  def item_search(options=nil)
    # "type"としてkeyword、genreIdのいずれかを指定
    if ["keyword", "genreId"].include?options[:type]
      options_query = "&#{options[:type]}=#{options[:query]}"
    else
      return nil, "keyword, genreIdのいずれかを\"type\"にセットして下さい", ""
    end

    options_query += "&shopCode=#{options[:shopCode]}" if options[:shopCode]
    options_query += "&hits=#{options[:hits]}" if options[:hits]
    options_query += "&page=#{options[:page]}" if options[:page]
    options_query += "&minPrice=#{options[:minPrice]}" if options[:minPrice]
    options_query += "&maxPrice=#{options[:maxPrice]}" if options[:maxPrice]
    options_query += "&availability=#{options[:availability]}" if options[:availability]
    options_query += "&field=#{options[:field]}" if options[:field]
    options_query += "&carrier=#{options[:carrier]}" if options[:carrier]
    # sorting type
    if options[:sort]
      if ["+affiliateRate","-affiliateRate","+reviewCount","-reviewCount",
        "+itemPrice","-itemPrice","+updateTimestamp","-updateTimestamp","random"].include?options[:sort]
        options_query += "&sort=#{options[:sort]}"
      else
        return nil, "ソート方式が不正"
      end
    end

    options_query_encoded = URI.encode(options_query)

    # URI.encodeでは'=+'が変換されないので、手動で置換する
    options_query_encoded = options_query_encoded.gsub(/=\+/,'=%2B')

    @search_request = "#{@request_url}?#{@developer_id_query}#{@affiliate_id_query}#{options_query_encoded}
    &operation=ItemSearch&version=2009-04-15".gsub!("\n","").gsub!(" ","")

    xml_result = open(@search_request)
    @search_result, return_text = xml_to_array(xml_result)
    return @search_result, return_text
  end

  def xml_to_array(xml_result)
    doc = REXML::Document.new xml_result
    doc.elements.each("Response/header:Header/Status") do |status|
      unless status.text == "Success"
        return_text = status.text
        unless doc.elements["Response/header:Header/StatusMsg"]
          return_text += " " + doc.elements["Response/header:Header/StatusMsg"].text
        end
        return nil, return_text
      end
    end

    result = Hash.new
    doc.elements.each("Response/Body/*") do |ele|
      result[:count] = ele.elements["count"].text.to_i
      result[:page] = ele.elements["page"].text.to_i
      result[:first] = ele.elements["first"].text.to_i
      result[:last] = ele.elements["last"].text.to_i
      result[:hits] = ele.elements["hits"].text.to_i
      result[:carrier] = ele.elements["carrier"].text.to_i
      result[:pageCount] = ele.elements["pageCount"].text.to_i

      result[:item] = Array.new
      ele.elements.each("Items/Item") do |item|
        result[:item].push({:itemName => item.elements["itemName"].text,
          :itemCode => item.elements["itemCode"].text,
          :itemPrice => item.elements["itemPrice"].text.to_i,
          :itemCaption => item.elements["itemCaption"].text,
          :itemUrl => item.elements["itemUrl"].text,
          :affiliateUrl => item.elements["affiliateUrl"].text,
          :imageFlag => item.elements["imageFlag"].text.to_i,
          :smallImageUrl => item.elements["smallImageUrl"].text,
          :mediumImageUrl => item.elements["mediumImageUrl"].text,
          :availability => item.elements["availability"].text,
          :taxFlag => item.elements["taxFlag"].text,
          :postageFlag => item.elements["postageFlag"].text.to_i,
          :creditCardFlag => item.elements["creditCardFlag"].text,
          :shopOfTheYearFlag => item.elements["shopOfTheYearFlag"].text,
          :affiliateRate => item.elements["affiliateRate"].text,
          :startTime => item.elements["startTime"].text,
          :endTime => item.elements["endTime"].text,
          :reviewCount => item.elements["reviewCount"].text,
          :reviewAverage => item.elements["reviewAverage"].text,
          :shopName => item.elements["shopName"].text,
          :shopCode => item.elements["shopCode"].text,
          :shopUrl => item.elements["shopUrl"].text,
          :genreId => item.elements["genreId"].text
          })
      end
    end
    return result, ""
  end
end

 修正した箇所は以下の通りです。

  • RESTのURIから"=+"を"=%2B"に無理やり置換した
  • バージョンを1.10から2.0に変更
  • RoRではputが使えないので、エラーメッセージは第二戻り値として返すように変更した

 使い方は以下の通りに

search = RakutenItemSearch.new("DEVID","AFFID")

options = {
:type => "keyword",
:query => "激安",
:hits => 10,
:sort => "+itemPrice",
:carrier => 0,
:availability => 0,
:field => 0,
}

result, error_message = search.item_search(options)

#エラーメッセージを出力
if error_message != ""
  flash[:notice] = error_message
else
  #取得後の処理を記述
end

 とりあえずこんな感じで

[Oracle Master] Oracle Master Database Silver DBA 11g 教科書の問題

Oracle Master Bronze 11g の取得

 昨日、「Bronze DBA 11g」に合格し、以前に取得した「SQL基礎Ⅰ」と合わせて、晴れて「Oracle Master Database Bronze」資格を取得しました。

 PG稼業も5年目となりましたが、未だに資格とは縁がなく、初めて取得した資格なので何気に嬉しかったです。

 で、その勢いのまま次の「Silver DBA 11g」試験を受けることにしました。

Oracle Master Silver 11g の現状

 「Silver DBA 11g」は2008年9月に始まったばかりの試験です。教材も問題集はあるものの、教科書がまだ発売されていません。

 しかし勢いづいている私は、「ORACLEフリーク」のみんなの受験記を参考に、10gの黒本教科書と、インプレスの問題集を購入し、いざ勉強を始めてみました。今考えればもっと確認しておけばなぁ~と思い悩むしだいです。

10gと11gの違い

 とりあえずこちらをご覧ください。

 テスト内容チェックリストの欄を比較してみるとお分かりいただけるかと思いますが、今回は大幅に出題範囲に変更があります!

 とはいえ、内容がそこまで変わっているかといえばそうではない。。。と勝手に考えていたんですが、インプレスの問題集をやっていると、11gの新機能についての記述が大変多いことに気づきました。また、そういうものに限って、『詳しい説明がほしいぐらいに理解しづらい』んですorz (ex.マルチブロックサイズ)

 私としては正直、11g Silver を検討されている方には 10g 教科書をオススメできません。

追記:C社について

 CCNAやMCP、Oracleなど資格試験の取得に大きな貢献を果たしているC社の問題集ですが、「ORACLEフリーク」を参照するに、Silver 11gについてはあまり効果を発揮していないようです。

 でもまぁ考えてみれば、まだ始まったばかりの試験ですし、きっと『バイトが間に合っていない』のではないでしょうか?

 もしC社を検討されている方がいらっしゃいましたら、教科書ともども、もうしばらく待ったほうがいいかもしれません。

 …ちなみに、2009年4月21日現在、C社のHPにアクセスできません。昨日はアクセスできましたし、whois検索でもなくなっているようので、ドメイン更新でも忘れたのでしょうか?w