Amazon SimpleDBのConsistentReadを指定してみる
SimpleRecordというSimpleDB専用のActiveRecordクローンを試しているときに登録したはずのデータが取得できない現象が頻発しました。
POSTでデータ登録 -> Redirect GETで登録したデータを取得して表示しようとしたら、データが取得できてない!という流れです。
これはEventually Consistentが働いている現象なんだなーと思いました。(取得するデータが最新の状態である保証がない)
SimpleDBは今年の2月に取得するデータが最新の状態であることを保証するオプション「ConsistentRead」が追加されていました。
が、SimpleRecordもその中で使われているawsもConsistentReadは未対応のようです。
なので無理矢理ConsistentReadを使うように変えてみました。
aws-2.3.9/lib/awsbase/right_awsbase.rb
def self.sign_request_v2(aws_secret_access_key, service_hash, http_verb, host, uri) fix_service_params(service_hash, '2') # select a signing method (make an old openssl working with sha1) # make 'HmacSHA256' to be a default one service_hash['SignatureMethod'] = 'HmacSHA256' unless ['HmacSHA256', 'HmacSHA1'].include?(service_hash['SignatureMethod']) service_hash['SignatureMethod'] = 'HmacSHA1' unless @@digest256 #FORCE ConsistentRead service_hash['ConsistentRead'] = 'true' # select a digest digest = (service_hash['SignatureMethod'] == 'HmacSHA256' ? @@digest256 : @@digest1) # form string to sign canonical_string = service_hash.keys.sort.map do |key| "#{amz_escape(key)}=#{amz_escape(service_hash[key])}" end.join('&') string_to_sign = "#{http_verb.to_s.upcase}\n#{host.downcase}\n#{uri}\n#{canonical_string}" # sign the string signature = escape_sig(Base64.encode64(OpenSSL::HMAC.digest(digest, aws_secret_access_key, string_to_sign)).strip) ret = "#{canonical_string}&Signature=#{signature}" # puts 'full=' + ret.inspect ret end
この
service_hash['ConsistentRead'] = 'true'
一行を追加です。
これでConsistentReadできているようです(たぶん)
クエリーごとに指定できるようなのがほんとはええわな。
Eventually Consistentなデータストアを使う開発では気をつけよう。
AWS Toolkitをためしてみた
AWS Toolkitを使うと、Eclipse上でインスタンスの管理をしたり、Putty経由でサーバーに接続したり、Tomcatクラスタ環境を自動で作ってWebアプリをデプロイしたりできます。
Google AppEngineの開発っぽくEclipseから直接EC2へデプロイできる!これはかなりよさそうです。
設定は簡単なはずですが、ローカルにインストールが必要なTomcatはサーバーを追加するときにダウンロードしてインストールした方がよさそうです。たぶん。自分のローカルにインストール済だったTomcat(現在の最新の6.0.26)を指定していたら、AWSのTomcatが立ち上がらなかったです。
Eclipseからダウンロードすると6.0.14が入りました。
使い方はこのあたりが参考です
ATNDのイベントをメール通知するアプリをGoogle AppEngine(Python)でつくった
できること
キーワードを登録しておくと、そのキーワードに引っかかるイベントがあったらGmailで通知し続けます。あとからイベントをGoogle Calendarに登録することができます
いまのところ動いているところ
経緯
これからやりたいこと
OAuthを使ってtwitterにイベントがあったことをつぶやかせる
目下困ったこと
テストがまったくない。テストの書き方がピンときていない。
新しいヘッドフォンを頼んだ
クレジットカードのポイントが失効し始めてきてたので、なんか選ぼうとしたらヘッドフォンがあって、Amazonで評価が高かったから選びました。期待してます。
マランツmarantz 高音質インイヤー・ヘッドフォン イヤホンHP101 marantz(マランツ) 売り上げランキング : 10974 おすすめ平均 Amazonで詳しく見る by G-Tools |
NODAMEは終わっていなかった
のだめ終わってなかったんですね・・
番外編となってますが、23巻の続きだし、主人公は千秋先輩だし、ふつうに続いてますね。
日本編が好きだったので、この続き方はうれしい。
のだめカンタービレ(24) (KC KISS) 講談社 2010-04-26 売り上げランキング : おすすめ平均 Amazonで詳しく見る by G-Tools |
Chromium OSをビルドしてみた
Chrome OSのオープンソース版のChromium OSです。
この本に書いてあるビルド手順を参考にしました。
けど、変更が激しいらしく、本の内容と若干違ってます。Web上のドキュメント見た方がいいです
Google Chrome OS ~最新技術と戦略を完全ガイド~ | |
インプレスジャパン 2010-03-24 売り上げランキング : 7966 Amazonで詳しく見る by G-Tools |
10分でコーディング
10分でコーディングをやってみました。
10分でできなかったし、なんかセンスないです。出直します。。
def kubaru(cnt, tramp) tramp = tramp.split(//) limit = tramp.size/cnt sets = "" rtn = [] cnt.times do |c| tramp.each_with_index do |e, i| sets << e if i % cnt == c end rtn << sets[0...limit] sets = "" end rtn end
ruby-1.8.7-p248 > kubaru(3,"123123123") => ["111", "222", "333"] ruby-1.8.7-p248 > kubaru(4,"123123123") => ["12", "23", "31", "12"] ruby-1.8.7-p248 > kubaru(6,"012345012345012345") => ["000", "111", "222", "333", "444", "555"] ruby-1.8.7-p248 > kubaru(4,"111122223333") => ["123", "123", "123", "123"] ruby-1.8.7-p248 > kubaru(1,"012345012345012345") => ["012345012345012345"] ruby-1.8.7-p248 > kubaru(6, "01234") => ["", "", "", "", "", ""] ruby-1.8.7-p248 > kubaru(2, "") => ["", ""]