トップ 最新

ただのにっき

2005-11-20(日) [長年日記]

はやぶさ、タッチダウンせず(か?)

どうも、松浦晋也のL/Dが、世界的にはやぶさ関連ニュースのポータル化しているっぽいなぁ。というのも、先日のTrackBackをたどってきたとおぼしき、日英翻訳サイトからのrefererがあるからなんだが。やっぱ、本家からのアウトプットが乏しいよなぁ。貧乏の壁は厚い。

今朝の降下に関する記者会見の、詳細なレポートも、やはりL/Dから。ターゲットマーカーは着地したが、本体は地表すれすれをウロウロしただけでタッチダウンには至らなかったようだ。くそー、応援がちょっと足らんかったか! 残念だけど、満身創痍なのに自律でここまでやれれば、たいしたもんだよなー。はやぶさはたいしたロボットだ。

願わくば高温のダメージが少なくて、25日の再降下にチャレンジできますように。

Tags: hayabusa

Alexa Web Information Service (AWIS)を使ってみようとしてほぼ挫折中

ふとした気の迷いで、AlexaのWeb Serviceを使ってみようと思い、いじってみたんだけど、うまくいかない。一定回数以上のクエリから有料になるため、一風変わった認証システムが組み込まれているんだけど、そこをうまく通過できないっぽい。Amazon Web Services Request Authenticationというのがそれなんだが:

  • HMACを使ってdigestを計算し、base64でエンコードする
  • ハッシュ関数はSHA1を使用
  • digest用のキーは、AWS共通のsecret keyを使用する
  • digest用の値は、サービス名(AlexaWebInfoService)、オペレーション、タイムスタンプを連結した文字列
  • タイムスタンプはXML SchemaのdateTime形式

まず、HMACの計算をどうするのかわからず、調べてみたらOpenSSLに入ってるらしい。が、例によってドキュメントが見つからない。Ruby使いの宿命だ。甘んじて受け入れよう(全肯定かよ)。OpenSSL::HMAC::digestに、SHA1のインスタンス、キー、値の3つの引数を渡すと、公開されているJavaのサンプルと同じ値を返すようになったので、これでいいんだろう。たぶん(ここからしてすでに怪しい)。

で、楽なRESTインタフェースを選ぶことにして、まずは呼び出し用のURLだけを生成するクラスをこんな感じで作った:

require 'openssl'
require 'base64'
require 'cgi'

class Alexa
   BASE = 'http://awis.amazonaws.com/onca/xml'
   SERVICE = 'AlexaWebInfoService'

   def initialize( access_key_id, secret_access_key )
      @access, @secret = access_key_id, secret_access_key
   end

   def url_info( url, response_group = 'Rank' )
      ope = 'UrlInfo'
      ts = timestamp
      sig = signature( ope, ts )
      awis = BASE.dup
      awis << "?Service=#{SERVICE}"
      awis << "&AWSAccessKeyId=#{@access}"
      awis << "&Operation=#{ope}"
      awis << "&Url=#{url}"
      awis << "&ResponseGroup=#{response_group}"
      awis << "&Timestamp=#{ts}"
      awis << "&Signature=#{sig}"
   end

private
   def timestamp
      ts = Time::now::utc::strftime( '%Y-%m-%dT%H:%M:%SZ' )
   end

   def signature( operation, timestamp )
      digest = OpenSSL::HMAC::digest( OpenSSL::Digest::SHA1::new, @secret,
               "#{SERVICE}#{operation}#{timestamp}" )
      CGI::escape( Base64::encode64( digest ).chomp )
   end
end

こんな感じで使う:

alexa = Alexa::new( アクセスキー, シークレットキー )
puts alexa.url_info( 'sho.tdiary.net' )

表示された長いURLをブラウザに貼ると、指定したURLに関するアクセス統計情報が得られる……はずなんだけど、帰ってきたのはこんなエラー:

<?xml version="1.0" encoding="UTF-8" ?>
<UrlInfoResponse xmlns="http://webservices.amazon.com/AWSAlexa/2005-07-11">
  <OperationRequest>
    <RequestId>066697A3WVFSXYM29S4D</RequestId>
    <Errors>
      <Error>
        <Code>AWS.NotAuthorized</Code>
        <Message>The identity contained in the request is not authorized
        to use this subscription id.</Message>
      </Error>
    </Errors>
  </OperationRequest>
</UrlInfoResponse>

「not authorized」って言われてもなぁ……。事前になにか、おまじないが必要なんだろうか。

といった感じで、今日は時間切れ。AWISは人気がないらしく、Web上にもほとんど情報がない。とほほ。