プログラマになりたい

おっさんになっても、プログラマでありつづけたい

日本一熱いデータベース論、「理論から学ぶデータベース実践入門」

 技評さんから理論から学ぶデータベース実践入門を頂きました。ありがとうございます。
f:id:dkfj:20150224011323j:plain

著者の奥野さん



 著者は、漢(オトコ)のコンピュータ道で有名な奥野さんです。直接の面識はないものの、データベース設計に悩み調べて行き着いた先が奥野さんが出している情報ということはよくありました。そんなこともあり、心のなかで勝手にデータベースの師匠として崇めています。そんな奥野さんが扱うテーマは、MySQLではなくデータベースです。個別の製品の話ではなく、データベース理論です。実践入門と銘打っているだけあり、データベース設計の具体的なやり方、考え方が随所にあります。

何について書いているのか?



 ポイントは、説明とやり方を集めたノウハウ集ではなく、設計の考え方の指針を示している点です。例えば、ID設計の話。永遠の論争であるナチュラルキーとサロゲートキー、どちらが適切かという命題があります。それぞれの利点と問題点を上げて、どういう場合に適しているかの持論を展開しています。そこから、IDの欠陥の例として、IDの一部に意味がある場合をあげ、「CLN-CYC-0123-BL」のような製品コードを取り上げています。IDの中に複数の意味を込められまくった例ですね。思わずあるあると言いたくなる設計の失敗を、その設計が何故悪いのか論理的に説明しています。このように理路整然と問題の本質を指摘できれば、設計レビューも随分と意味があるものになるでしょう。

データベース論



 そのような感じで、データベースに関するありとあらゆるところに持論を展開しています。まだざっと目を通して興味を持ったところを拾い読みしている段階ですが、どこをとっても濃いです。じっくり考えながら読むと1ヶ月は掛かりそうな濃縮度です。
 私は今現在、それほどデータベースに関わる仕事はしていません。しかし、随分長い間、データベースと向かい合ってきました。今考えると、随分多くの間違った設計やSQLを残してきました。逆に、今でも良い設計だなぁと思えるものもあります。それらと照らし合わせながら、やっぱりそうだよねとか、そういうことだったのかと今更ながら気がつくことが沢山ありました。そういった意味で、かなり幅広く読まれるべき本の一冊だと思います。でも、入門ではないですよね。

まとめ



 ちなみに、この本を読んでいて感心したのが、よくここまで持論を書けるなという点です。自身の執筆経験から考えると、技術書で持論を書くのは中々難しいことなのです。いろいろなやり方・考え方がある中で、自分はこう考えるとハッキリ打ち出すのは、実は難しいことです。気を強くもって書かないと、誰もがそうだよね知っているよねという当たり障りない本になってしまいます。その中で、データベースという万人が扱う技術に対して、ここまで熱く持論を語れるのは奥野さんだけなのではないかなと思います。
 データベースの世界に入り込んだばかりの人も、あるいはずっと歩み続けた人も、奥野さん流のデータベース理論にまず触れてみるのがいいのではないでしょうか。たぶん自分のデータベース理論の構築につながるでしょう。時間を作って、個別のテーマを紹介しようと思います。

理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL (WEB+DB PRESS plus)

理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL (WEB+DB PRESS plus)

Capybara+PhantomJS+Nokogiriを利用してスクレイピング

CapybaraとPhantomJS、Nokogiriを利用してのクローラー・スクレイピングの紹介です。

PhantomJSとは?



f:id:dkfj:20150214123247p:plain
 PhantomJSは、ヘッドレスブラウザと呼ばれるWebKitのエミュレータです。ヘッドレスブラウザとは、GUIではなくCUIから利用できるブラウザでプログラムから呼ばれます。UIのテストツールとしてSeleniumのようなサービスがあります。Seleniumはブラウザを直接操作するので、環境依存や動作が重いといった幾つかの問題点があります。そこでよく利用されるのがPhantomJSです。Seleniumに比べて、軽量というメリットがあります。RubyからPhantomJSを扱うライブラリとして、Poltergeistがあります。

Capybaraとは?



 Capybaraは、WebシステムのUI層のテストをサポートするためのライブラリです。主にDSL機能とDriver機能があり、テストフレームワークやブラウザ&ブラウザシミュレータを透過的に扱うことができます。
f:id:dkfj:20150214123816p:plain

Nokogiriとは?



f:id:dkfj:20140415021125p:plain
 Nokogiriは、Rubyで実装されたHTML/XMLの構文解析器(パーサー)です。Rubyの構文解析器としてはデファクト・スタンダードで、スクレイピングする際の必須のツールとなっています。Rubyで実装されたクローラー・スクレイピングライブラリの大部分は、内部的にNokogiriを利用しています。使い方の詳細は、下記のリンクを参照していただければと思います。
Ruby製の構文解析ツール、Nokogiriの使い方 with Xpath

PhantomJSとCapybaraのインストール



 PhantomJSのインストールは、Windowsでは少し面倒くさいことが多いです。PhantomJSのサイトからダウンロードしてパスを通すことが必要です。Mac+HomeBrewであれば、下記のコマンドでインストールできると思います。

brew install phantomjs

 その後に、PoltergeistやCapybaraをインストールします。

gem install nokogiri
gem install poltergeist
gem install capybara

 Windowsのnokogiriのインストールはハマる確率が高いです。ビルド済みのgemをダウンロードする方をお勧めします。x86-mingw32(32ビット版)もしくは x64-mingw32(64ビット版)と書かれているものがWindowsようです。
※最近、64ビット版も提供されるようになったようですね。

スクレイピング



 下記がCapybaraとPhantomjsとNokogiriを使ったサンプルスクリプトです。

require 'capybara'
require 'capybara/dsl'
require 'capybara/poltergeist'

class Scrape
  #DSLのスコープを別けないと警告がでます
  include Capybara::DSL

  def initialize()
    Capybara.register_driver :poltergeist_debug do |app|
      Capybara::Poltergeist::Driver.new(app, :inspector => true)
    end

    Capybara.default_driver = :poltergeist
    Capybara.javascript_driver = :poltergeist
  end

  def visit_site
    page.driver.headers # => {}
    #ユーザエージェントの設定(必要に応じて)
    page.driver.headers = { "User-Agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36" }
    #リファラーの偽装(特に不要)
    #page.driver.add_headers("Referer" => "http://yahoo.co.jp")
    page.driver.headers
    visit('http://www.yahoo.co.jp')
    #スクリーンショットで保存
    page.save_screenshot('screenshot.png', :full => true)
    #within(:xpath, "//*[@id='toipcsfb']/div[1]/ul[1]") do
    #Nokogirオブジェクトの作成
    doc = Nokogiri::HTML.parse(page.html)
    puts doc.title
  end
end

scrape = Scrape.new
scrape.visit_site

ポイントとしては、次のとおりです。
・Capybara DSLのスコープを別ける
  しないと、次のように警告でますよ
  including Capybara::DSL in the global scope is not recommended!
・Nokogiriを使ってる
  Capybaraの記法に慣れていない場合は、Nokogiriを作ってしまうのも1つの手です。
  無駄が多いけど

このサンプルでは、面倒くさいのでJavaScriptによって動的に構築された部分とってませんが。。。

まとめ



 JavaScriptバリバリのサイトからスクレイピングしたい場合、PhantomJSはお勧めです。少し重いものの、Seleniumでブラウザを動かすより断然軽量です。またブラウザのインストールが不要なので、サーバサイドで動かすことも容易です。今、PhantomJSをAWS Lambdaで動かそうかなと試しています。これが出来ればかなり面白いことが出来そうですね。
 この辺りの話をまとめた、「Rubyによるクローラー開発技法」という本を出しています。ひたすらクローリングとスクレイピングしているので、何か参考になることがあればと思います。

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例


See Also:
『Rubyによるクローラー開発技法』を書きました
RubyでWebスクレイピングの話をしてきました。第1回Webスクレイピング勉強会@東京
Ruby製の構文解析ツール、Nokogiriの使い方 with Xpath
あらためてRuby製のクローラー、"anemone"を調べてみた
オープンソースのRubyのWebクローラー"Anemone"を使ってみる

バッチ処理について再考

 作業途中のメモです。バッチ処理の定義を確認しようとしてWikipediaをはじめとして幾つかのサイトをみてました。その時に目に入ったのが、下記の文章です。

利点
バッチ処理には以下のような利点がある。
・多くのユーザーがコンピュータのリソースを共有できる。
・処理をコンピュータのリソースがあまり忙しくない時間帯(多くは夜間、休日)にシフトできる。
・人間がついていなくてもコンピュータのリソースが暇にならないように最大限有効活用できる。
・高価なコンピュータをフルに活用することで費用対効果の効率向上に寄与する。

バッチ処理 - Wikipedia


 これだけみると、人件費に対してコンピュータリソースが高い時代の産物なんですよね。今は、クラウドの登場で、有り余るコンピュータリソースをほぼ自由に低コストに使える時代です。そもそもバッチ処理である必要があるか、考える必要がありますね。特に夜間バッチについて。


 東急ハンズさんは、夜間バッチを廃止したそうです。たまには立ち止まって、何故その設計になっているのか、根本のところから問い直す必要性を最近感じています。


AWS 東急ハンズの事例 AWSサミット2013


See Also:
5分で何となく解るAmazon Cognito
Lambdaで作るクローラー/スクレイピング
S3のイベント通知機能(S3 Event Notifications)に対するユースケースを考える

JAWSUG関西 特別編でS3とCloudSearchとSWFの話をしてきました

 ちょうどタイミングが合いそうだったので、JAWSUG関西で発表してきました。担当したセッションは、サービス紹介です。S3+CloudSearchとSWFの2セッションを担当しました。

Amazon S3 & Amazon CloudSearch



JAWSUG Osaka S3 CloudSearch

 一つ目は、S3 + CloudSearchです。S3の概要の他に、お気に入りの機能であるS3 Webホスティング機能のデモをしています。また、新機能の紹介としてS3イベント通知を取り上げています。
 つづいてのCloudSearchについては、CloudSearchの機能というより、そもそも全文検索エンジンとはなんぞやという話がメインになっています。全文検索エンジン周りの技術は、いろいろ追いかけてて時代があって好きなんですね。ただ構築・運用するのは面倒くさいということで、CloudSearchは素晴らしいサービスだと思います。
 発表後に気がついたのですが、ひとつあります。そもそもS3とCloudSearchを選んだ理由として、S3とCloudSearchを組み合わせると簡単にS3のオブジェクト検索を出来ますよということを言いたかったのです。完全に忘れていました。すいません。

Amazon Simple Workflow Service



JAWSUG Kansai Simple Workflow Service (SWF)

 2つ目は、Simple Workflow Service(SWF)です。これを選んだ理由は、実はAmazon Mechanical Turkの紹介をしたいがためです。Mechanical Turkは、AWSの別のクラウドです。Cloudではなく、Crowd(群衆)です。いわゆるクラウドソーシングのクラウドですね。
 そんな理由からSimple Workflow Serviceを選んだのですが、そもそもあまり触ったことがなかったのですね。ついでに覚えようと思っていたのですが、いろいろ忙殺されて時間がとれずでスライドが出来たのが当日の朝です。そういったことで、Mechanical Turkまで辿りつけずです。残念なので、次回紹介します。Mechanical Turkを使うネタは幾つか考えてあります。

まとめ



 今回の勉強会のテーマは、フルマネージドサービスでした。私自身も最近の関心事項は、いかにEC2を使わずにAWSのマネージド・サービスを利用して楽に出来るかに移りつつあります。今回紹介したサービス群は、その重要なファクターになります。資料としてまとめることで、いろいろ頭の中を整理できて良かったです。皆様も、是非フルマネージドの世界へ

See Also:
5分で何となく解るAmazon Cognito
Lambdaで作るクローラー/スクレイピング
S3のイベント通知機能(S3 Event Notifications)に対するユースケースを考える
マルチプロトコルの凄いやつ。Amazon SNS(Simple Notification Service)
Amazon SNSとSQSの素敵な関係。或いは、Jenkinsからパトライトを光らせる。
マイナー三兄弟なAmazon SNS,SQS,SESを激しくお勧めする。

参照:
JAWS-UG KANSAI特別編 「AWSを使い倒せ。AWSのフルマネージドサービス活用によるネイティブクラウドシステムへの誘い」 - JAWS-UG KANSAI | Doorkeeper

Apple TVを中心としたホームシアター・オーディオ環境の一例

 何度かブログに載せていますが、過去5年ほど家庭の映像・音楽関係の視聴環境を試行錯誤してきました。その間に、結婚したり子供が産まれたりと、いろいろとメインの利用者が変わっています。一度、ここで整理してみたいと思います。

前提としての主な視聴者



 最近、家でテレビや音楽を聞くのは、3歳の息子です。見聞きする内容は、もっぱらYoutubeの電車の映像と、子供向けの童謡やジブリ・ディズニーのテーマ曲です。後は毎週テレビでやっている機関車トーマスとチャギントンです。それ以外は1歳の娘向けに、オルゴールメロディやNHKのいないいないばあをつけるくらいです。またDVDで子供向けのタイトルが幾つかあるのですが、基本操作が面倒くさいので見ていません。嫁さんについては、Huluで映画をたまに見るくらいで、私に至っては息子に強制的に見せられるYoutubeの映像を見るくらいです。

家庭内の視聴環境



 そんな我が家の視聴者のニーズを満たす環境は、次のとおりです。

  • 東芝REGZA Z7 + タイムシフト
  • SONY ホームシアターシステム HT-CT660
  • Apple TV + Hulu
  • Mac mini
  • iPad

 接続形態は、このような形です。

f:id:dkfj:20150125170526p:plain

 図を見て貰うと解るように、いろいろな機器の連携の中心にApple TVがいます。Apple TVの便利なところは、TVとオーディオのどちらでも出力できるところと、Apple系製品から画面転送やiTunesライブラリの参照ができるところ、更にHuluの機能を組み込んでいるので文句なしです。欲を言えば、メディアサーバの機能も欲しいところですが、9割の人間には不要なのでこのままで良いでしょう。
 REGZA Z7ですが、タイムシフトというか録画機能が欲しくて、先代のテレビが壊れたタイミングで買い替えました。基本的にはテレビはみないのですが、予想以上に便利です。定期予約やタイムシフトから、子供向けの番組をちょっと見せるという芸当は、子育て世代には想像以上に便利です。忘れず録画するとか、毎回同じ時間に見るということが中々できないですからね。また、ほぼ同時期に買ったSONYのホームシアターシステムですが、イメージ的にはアンプとスピーカーが一体型になっているものです。Apple TV経由で聞いていますが、iPhoneやiPadからブルートゥースで直接音楽を流し込むということも出来ます。いずれにせよ、手軽に簡単に音楽を楽しめます。
 iPadは、ほぼ子供のYouTubeリモコンになっています。AppleTV単体でもYoutubeをみれるのですが、UI的に使いにくいので子供はもっぱらiPadを使ってYoutubeを見ています。iPadでみると姿勢が悪く近いところで見がちなので、AppleTV経由でテレビに転送して見せるようにしています。最後にMac Miniです。これは、我が家のメディアサーバとして活躍しています。(それ以外にも、ホームサーバとして活躍していますが割愛。)音楽も全部これに入れているのですが、AppleTV経由で使えば、Rometeを使えばiPhoneをリモコンとして選曲できるので便利です。iPhone/iPadのを直接流すという手もありますが、子供向けの曲などは、入れてなかったりします。
f:id:dkfj:20150125205526p:plain

家庭内の視聴環境



 改めて見直すと、マニアックな構成になっております。しかし、実際のところ視聴時間という意味では、あまり無かったりするので、単なる利便性を追求する趣味なのかもしれません。これが正解というものはないですが、また面白いものを考えてみたいですね。Mac miniがホームサーバとして常時動いているので、これにIoTの機器を何かつけて近未来の家を目指してみるのも面白いかもしれません。Enjoy!!

See Also
Mac miniを買ったった! (Late 2014 MGEN2J)
Apple TVでNAS上の動画・音楽を再生する方法
AirPlayを使って、AppleTV+AVアンプでホームオーディオ・システムを構築する話
Hulu(フールー)の契約したった。或いはAppleTVとの連携について
笑える程の凄さ!未来のテレビがここに Apple TV

Apple ハイビジョン対応 Apple TV MD199J/A

Apple ハイビジョン対応 Apple TV MD199J/A

SONY ホームシアターシステム HT-CT660

SONY ホームシアターシステム HT-CT660

5分で何となく解るAmazon Cognito

 年末年始でじっくり調べてみようと思っていたのがCognitoです。先日ようやく時間が取れて、何となく解ってきたので簡単にまとめてみます。Cognitoは、モバイル向けに設計されたユーザーアイデンティティおよびデータ同期のサービスです。主な機能としては、以下の3点です。

  • FacebookやGoogleなどのOpenID ConnectベースのIdentity Providerを利用して認証できる
  • Cognito Syncで、同一ユーザの複数の端末のデータを同期できる
  • 認証/未認証のユーザにIAM Roleを利用して、AWSリソースのアクセス制御

 上記の説明を聞いても、Cognitoの良さはさっぱり解らないと思います。私もCognitoの説明を読んでも、Facebookで認証できるのかぁくらいにしか感じませんでした。Cognito Syncの同期機能も、ほーっと思ったけど必要とする場面はどれくらいあるのだろうなぁと思いました。

Cognitoの重要性



 しかし、Cognitoのユースケースが出始めることで、ようやくCognitoの重要性が解ってきました。Cognitoの重要な機能は、安全簡単にAWSリソースのアクセス制御ができることなのだと思います。モバイル・アプリの場合、サーバサイドのプログラムのようにアクセスキーとシークレットアクセスキーを埋め込むことはできません。配布するために、アプリ内からキーを取り出される可能性があるからです。かといって、インスタンスのようにIAM Roleを発行するということも出来ません。モバイルからAWSのリソースを利用しようとすると、従来であればSecurity Token Service(STS)とToken Vending Machine(TVM)を利用して一時的な認証と認可の仕組みを構築する必要がありました。
 これ非常に面倒くさいですよね。ということで、どういうアーキテクチャが主流だったかというと、下の図のような形だと思います。

f:id:dkfj:20150119232504p:plain

 いわゆる三層構造(3Tier Architecture)です。AWSのリソースの制御はEC2側でやってしまって、モバイル側には結果をJSON等で返すだけという形です。この構成だと、当然全てのリクエスト・レスポンスがEC2を通ることになるので、この部分の性能と可用性が重要になります。必然的に、ELBやAutoScalingを利用することになります。EC2は、直接的な利用料がAWSサービスの中でも比較的高いことや、構築運用監視に人手が必要なため、コストが高くつきます。

Cognitoがもたらすアーキテクチャの変化



 では、Cognitoを利用するとどう変わるのでしょうか?EC2を経由せず、モバイルから直接AWSのリソースにアクセスする構造を簡単に実現できます。2Tier構成です。

f:id:dkfj:20150119233617p:plain

 CognitoはIAM Roleを利用して、認証/未認証のユーザにそれぞれアクセス認可を与えることができます。この未認証ユーザにもというところが味噌で、これのお陰でモバイル・アプリに簡単安全にアクセス認可する仕組みとして利用できます。事実、CognitoのIdentity Poolを作成する時に、実はIdentity Providerの設定は必須ではありません。実装面では、Cognitoの設定をしておけば、後はSDKを取り込んで少しコードを書くだけで、簡単に利用可能です。従来のようにSTS+TVMを使って独自の認証認可の仕組みを実装する必要はありません。Cognitoのウリは、安全簡単に認可の仕組みを組み込めるので、アーキテクチャすら変える力があるということです。

まとめ



 ということで、ここ最近Cognitoについて考えてきたことをまとめてみました。Cognitoは、2Tierアーキテクチャの要になると思います。ただ、まだドキュメント読んだりサンプルコードを動かしているレベルなので、今後本格的にアプリを開発し運用してみると考え方は変わるかもしれません。しかし、Lambdaが出てきたこともあり、AWSはシステムのアーキテクチャ自体を変えるような何かを考えているのではと思います。今年はそこを見極めてみたいですね。たぶんそのうちに、Node.js向けのCognito SDKもでるでしょうし。ツッコミどころあれば、ご指摘頂ければ幸いです。

See Also:
Lambdaで作るクローラー/スクレイピング
S3のイベント通知機能(S3 Event Notifications)に対するユースケースを考える


Amazon Web Servicesクラウドデザインパターン設計ガイド

Amazon Web Servicesクラウドデザインパターン設計ガイド

Amazonの在庫数とランキングの関係

 以前、「Amazonのランキングの不思議」ということで、順位付けのアルゴリズムを分析している本の紹介をしました。最近、拙著「Rubyによるクローラー開発技法」が、在庫20冊以下になり残数が表示されるようになりました。そこで、順位と在庫数を15分おきに取得して、その関係を見てみました。

生データ



 生のデータを、そのまま置きます。興味がある人は、考察してください。
データの収集には、KimonoLabsを利用しています。使い方は、こちらを見てください。

Version Date 順位 在庫 増減
2 Fri Jan 09 2015 22:25:40 GMT+0000 (UTC) 3657 16
3 Fri Jan 09 2015 22:42:26 GMT+0000 (UTC) 3763 16
4 Fri Jan 09 2015 22:58:40 GMT+0000 (UTC) 3763 17 1
5 Fri Jan 09 2015 23:14:45 GMT+0000 (UTC) 3763 17
6 Fri Jan 09 2015 23:30:43 GMT+0000 (UTC) 3888 17
7 Fri Jan 09 2015 23:46:42 GMT+0000 (UTC) 3888 17
8 Sat Jan 10 2015 00:02:55 GMT+0000 (UTC) 3888 17
9 Sat Jan 10 2015 00:18:50 GMT+0000 (UTC) 3888 17
10 Sat Jan 10 2015 00:35:19 GMT+0000 (UTC) 4118 17
11 Sat Jan 10 2015 00:51:38 GMT+0000 (UTC) 4118 17
12 Sat Jan 10 2015 01:07:24 GMT+0000 (UTC) 4118 17
13 Sat Jan 10 2015 01:23:33 GMT+0000 (UTC) 4118 17
14 Sat Jan 10 2015 01:39:34 GMT+0000 (UTC) 4474 17
15 Sat Jan 10 2015 01:55:31 GMT+0000 (UTC) 4474 17
16 Sat Jan 10 2015 02:11:40 GMT+0000 (UTC) 4474 17
17 Sat Jan 10 2015 02:27:57 GMT+0000 (UTC) 4943 17
18 Sat Jan 10 2015 02:44:21 GMT+0000 (UTC) 4943 17
19 Sat Jan 10 2015 03:00:33 GMT+0000 (UTC) 4943 17
20 Sat Jan 10 2015 03:15:48 GMT+0000 (UTC) 4943 17
21 Sat Jan 10 2015 03:31:45 GMT+0000 (UTC) 5574 17
22 Sat Jan 10 2015 03:48:01 GMT+0000 (UTC) 5574 17
23 Sat Jan 10 2015 04:04:00 GMT+0000 (UTC) 5574 17
24 Sat Jan 10 2015 04:19:48 GMT+0000 (UTC) 5574 17
25 Sat Jan 10 2015 04:35:55 GMT+0000 (UTC) 6262 17
26 Sat Jan 10 2015 04:52:17 GMT+0000 (UTC) 6262 17
27 Sat Jan 10 2015 05:08:22 GMT+0000 (UTC) 6262 17
28 Sat Jan 10 2015 05:24:27 GMT+0000 (UTC) 6262 17
29 Sat Jan 10 2015 05:40:43 GMT+0000 (UTC) 6968 17
30 Sat Jan 10 2015 05:56:21 GMT+0000 (UTC) 6968 16 -1
31 Sat Jan 10 2015 06:12:35 GMT+0000 (UTC) 6968 16
32 Sat Jan 10 2015 06:28:41 GMT+0000 (UTC) 6968 16
33 Sat Jan 10 2015 06:44:53 GMT+0000 (UTC) 7691 16
34 Sat Jan 10 2015 07:00:59 GMT+0000 (UTC) 7691 16
35 Sat Jan 10 2015 07:17:06 GMT+0000 (UTC) 7691 16
36 Sat Jan 10 2015 07:33:07 GMT+0000 (UTC) 5121 16
37 Sat Jan 10 2015 07:48:59 GMT+0000 (UTC) 5121 16
38 Sat Jan 10 2015 08:04:57 GMT+0000 (UTC) 5121 16
39 Sat Jan 10 2015 08:21:10 GMT+0000 (UTC) 5121 16
40 Sat Jan 10 2015 08:37:13 GMT+0000 (UTC) 5684 16
41 Sat Jan 10 2015 08:53:20 GMT+0000 (UTC) 5684 16
42 Sat Jan 10 2015 09:09:26 GMT+0000 (UTC) 5684 16
43 Sat Jan 10 2015 09:25:22 GMT+0000 (UTC) 5684 16
44 Sat Jan 10 2015 09:41:33 GMT+0000 (UTC) 6362 16
45 Sat Jan 10 2015 09:57:37 GMT+0000 (UTC) 6362 16
46 Sat Jan 10 2015 10:13:41 GMT+0000 (UTC) 6362 16
47 Sat Jan 10 2015 10:29:38 GMT+0000 (UTC) 7055 16
48 Sat Jan 10 2015 10:45:41 GMT+0000 (UTC) 7055 16
49 Sat Jan 10 2015 11:01:49 GMT+0000 (UTC) 7055 16
50 Sat Jan 10 2015 11:17:40 GMT+0000 (UTC) 7055 16
51 Sat Jan 10 2015 11:35:49 GMT+0000 (UTC) 7708 16
52 Sat Jan 10 2015 11:52:01 GMT+0000 (UTC) 7708 16
53 Sat Jan 10 2015 12:08:08 GMT+0000 (UTC) 7708 16
54 Sat Jan 10 2015 12:24:04 GMT+0000 (UTC) 8361 16
55 Sat Jan 10 2015 12:39:56 GMT+0000 (UTC) 8361 16
56 Sat Jan 10 2015 12:56:05 GMT+0000 (UTC) 8361 16
57 Sat Jan 10 2015 13:12:12 GMT+0000 (UTC) 8361 18 2
58 Sat Jan 10 2015 13:28:49 GMT+0000 (UTC) 8361 18
59 Sat Jan 10 2015 13:44:49 GMT+0000 (UTC) 9160 18
60 Sat Jan 10 2015 14:00:52 GMT+0000 (UTC) 9160 18
61 Sat Jan 10 2015 14:16:54 GMT+0000 (UTC) 9160 18
62 Sat Jan 10 2015 14:33:25 GMT+0000 (UTC) 10228 17 -1
63 Sat Jan 10 2015 14:49:24 GMT+0000 (UTC) 10228 17
64 Sat Jan 10 2015 15:05:42 GMT+0000 (UTC) 10228 17
65 Sat Jan 10 2015 15:21:31 GMT+0000 (UTC) 10228 15 -2
66 Sat Jan 10 2015 15:37:26 GMT+0000 (UTC) 11318 14 -1
67 Sat Jan 10 2015 15:53:18 GMT+0000 (UTC) 11318 14
68 Sat Jan 10 2015 16:09:18 GMT+0000 (UTC) 11318 15 1
69 Sat Jan 10 2015 16:25:08 GMT+0000 (UTC) 7420 15
70 Sat Jan 10 2015 16:43:41 GMT+0000 (UTC) 7420 15
71 Sat Jan 10 2015 16:59:34 GMT+0000 (UTC) 7420 15
72 Sat Jan 10 2015 17:15:48 GMT+0000 (UTC) 7420 15
73 Sat Jan 10 2015 17:31:51 GMT+0000 (UTC) 5328 15
74 Sat Jan 10 2015 17:47:53 GMT+0000 (UTC) 5328 15
75 Sat Jan 10 2015 18:03:56 GMT+0000 (UTC) 5328 15
76 Sat Jan 10 2015 18:19:23 GMT+0000 (UTC) 5328 15
77 Sat Jan 10 2015 18:35:25 GMT+0000 (UTC) 5678 15
78 Sat Jan 10 2015 18:51:21 GMT+0000 (UTC) 5678 16 1
79 Sat Jan 10 2015 19:07:34 GMT+0000 (UTC) 5678 16
80 Sat Jan 10 2015 19:23:38 GMT+0000 (UTC) 5884 16
81 Sat Jan 10 2015 19:39:28 GMT+0000 (UTC) 5884 16
82 Sat Jan 10 2015 19:55:36 GMT+0000 (UTC) 5884 16
83 Sat Jan 10 2015 20:12:03 GMT+0000 (UTC) 5884 16
84 Sat Jan 10 2015 20:28:12 GMT+0000 (UTC) 5994 16
85 Sat Jan 10 2015 20:44:04 GMT+0000 (UTC) 5994 16
86 Sat Jan 10 2015 21:00:15 GMT+0000 (UTC) 5994 16
87 Sat Jan 10 2015 21:16:22 GMT+0000 (UTC) 5994 16
88 Sat Jan 10 2015 21:32:57 GMT+0000 (UTC) 6086 16
89 Sat Jan 10 2015 21:49:44 GMT+0000 (UTC) 6086 16
90 Sat Jan 10 2015 22:06:21 GMT+0000 (UTC) 6086 16
91 Sat Jan 10 2015 22:22:34 GMT+0000 (UTC) 6086 16
92 Sat Jan 10 2015 22:38:34 GMT+0000 (UTC) 6192 16
93 Sat Jan 10 2015 22:54:31 GMT+0000 (UTC) 6192 17 1
94 Sat Jan 10 2015 23:10:38 GMT+0000 (UTC) 6192 17
95 Sat Jan 10 2015 23:26:41 GMT+0000 (UTC) 6322 17
96 Sat Jan 10 2015 23:42:44 GMT+0000 (UTC) 6322 17
97 Sat Jan 10 2015 23:58:42 GMT+0000 (UTC) 6322 17
98 Sun Jan 11 2015 00:14:45 GMT+0000 (UTC) 6322 17
99 Sun Jan 11 2015 00:31:06 GMT+0000 (UTC) 6562 17
100 Sun Jan 11 2015 00:47:02 GMT+0000 (UTC) 6562 17
101 Sun Jan 11 2015 01:03:29 GMT+0000 (UTC) 6562 17
102 Sun Jan 11 2015 01:19:27 GMT+0000 (UTC) 6562 17
103 Sun Jan 11 2015 01:35:26 GMT+0000 (UTC) 6977 17
104 Sun Jan 11 2015 01:51:29 GMT+0000 (UTC) 6977 17
105 Sun Jan 11 2015 02:07:36 GMT+0000 (UTC) 6977 17
106 Sun Jan 11 2015 02:23:48 GMT+0000 (UTC) 6977 17
107 Sun Jan 11 2015 02:39:44 GMT+0000 (UTC) 7632 17
108 Sun Jan 11 2015 02:55:41 GMT+0000 (UTC) 7632 17
109 Sun Jan 11 2015 03:11:57 GMT+0000 (UTC) 7632 17
110 Sun Jan 11 2015 03:28:05 GMT+0000 (UTC) 8493 16 -1
111 Sun Jan 11 2015 03:44:10 GMT+0000 (UTC) 8493 16
112 Sun Jan 11 2015 04:00:06 GMT+0000 (UTC) 8493 16
113 Sun Jan 11 2015 04:16:15 GMT+0000 (UTC) 8493 16
114 Sun Jan 11 2015 04:32:10 GMT+0000 (UTC) 9467 16
115 Sun Jan 11 2015 04:48:08 GMT+0000 (UTC) 9467 16
116 Sun Jan 11 2015 05:04:08 GMT+0000 (UTC) 9467 16
117 Sun Jan 11 2015 05:20:37 GMT+0000 (UTC) 9467 16
118 Sun Jan 11 2015 05:36:32 GMT+0000 (UTC) 6006 16
119 Sun Jan 11 2015 05:52:28 GMT+0000 (UTC) 6006 16
120 Sun Jan 11 2015 06:08:36 GMT+0000 (UTC) 6006 16
121 Sun Jan 11 2015 06:24:48 GMT+0000 (UTC) 6006 16
122 Sun Jan 11 2015 06:40:52 GMT+0000 (UTC) 6697 16
123 Sun Jan 11 2015 06:56:40 GMT+0000 (UTC) 6697 16
124 Sun Jan 11 2015 07:12:39 GMT+0000 (UTC) 6697 16
125 Sun Jan 11 2015 07:28:39 GMT+0000 (UTC) 6697 16
126 Sun Jan 11 2015 07:44:41 GMT+0000 (UTC) 7468 16
127 Sun Jan 11 2015 08:00:46 GMT+0000 (UTC) 7468 16
128 Sun Jan 11 2015 08:16:51 GMT+0000 (UTC) 7468 16
129 Sun Jan 11 2015 08:32:50 GMT+0000 (UTC) 8278 16
130 Sun Jan 11 2015 08:48:58 GMT+0000 (UTC) 8278 16
131 Sun Jan 11 2015 09:05:01 GMT+0000 (UTC) 8278 15 -1
132 Sun Jan 11 2015 09:21:21 GMT+0000 (UTC) 8278 15
133 Sun Jan 11 2015 09:37:41 GMT+0000 (UTC) 9218 15
134 Sun Jan 11 2015 09:53:58 GMT+0000 (UTC) 9218 15
135 Sun Jan 11 2015 10:10:25 GMT+0000 (UTC) 9218 15
136 Sun Jan 11 2015 10:26:20 GMT+0000 (UTC) 9218 15
137 Sun Jan 11 2015 10:42:27 GMT+0000 (UTC) 5988 15
138 Sun Jan 11 2015 10:59:05 GMT+0000 (UTC) 5988 15
139 Sun Jan 11 2015 11:15:12 GMT+0000 (UTC) 5988 15
140 Sun Jan 11 2015 11:31:20 GMT+0000 (UTC) 6705 15
141 Sun Jan 11 2015 11:47:14 GMT+0000 (UTC) 6705 15
142 Sun Jan 11 2015 12:03:20 GMT+0000 (UTC) 6705 15
143 Sun Jan 11 2015 12:19:20 GMT+0000 (UTC) 6705 15
144 Sun Jan 11 2015 12:35:30 GMT+0000 (UTC) 7456 15
145 Sun Jan 11 2015 12:51:37 GMT+0000 (UTC) 7456 16 1
146 Sun Jan 11 2015 13:07:34 GMT+0000 (UTC) 7456 16
147 Sun Jan 11 2015 13:23:33 GMT+0000 (UTC) 7456 16
148 Sun Jan 11 2015 13:39:53 GMT+0000 (UTC) 8291 16
149 Sun Jan 11 2015 13:55:52 GMT+0000 (UTC) 8291 16
150 Sun Jan 11 2015 14:12:09 GMT+0000 (UTC) 8291 15 -1
151 Sun Jan 11 2015 14:28:38 GMT+0000 (UTC) 9329 15
152 Sun Jan 11 2015 14:44:25 GMT+0000 (UTC) 9329 15
153 Sun Jan 11 2015 15:00:26 GMT+0000 (UTC) 9329 15
154 Sun Jan 11 2015 15:16:51 GMT+0000 (UTC) 9329 14 -1
155 Sun Jan 11 2015 15:33:02 GMT+0000 (UTC) 10570 14
156 Sun Jan 11 2015 15:49:02 GMT+0000 (UTC) 10570 14
157 Sun Jan 11 2015 16:05:13 GMT+0000 (UTC) 10570 14
158 Sun Jan 11 2015 16:21:24 GMT+0000 (UTC) 10570 14
159 Sun Jan 11 2015 16:37:27 GMT+0000 (UTC) 7222 14
160 Sun Jan 11 2015 16:53:43 GMT+0000 (UTC) 7222 14
161 Sun Jan 11 2015 17:09:52 GMT+0000 (UTC) 7222 14
162 Sun Jan 11 2015 17:25:57 GMT+0000 (UTC) 7222 14
163 Sun Jan 11 2015 17:42:17 GMT+0000 (UTC) 7853 14
164 Sun Jan 11 2015 17:58:23 GMT+0000 (UTC) 7853 14
165 Sun Jan 11 2015 18:14:25 GMT+0000 (UTC) 7853 14
166 Sun Jan 11 2015 18:30:42 GMT+0000 (UTC) 8284 15 1
167 Sun Jan 11 2015 18:46:49 GMT+0000 (UTC) 8284 15
168 Sun Jan 11 2015 19:02:59 GMT+0000 (UTC) 8284 15
169 Sun Jan 11 2015 19:18:59 GMT+0000 (UTC) 8284 15
170 Sun Jan 11 2015 19:35:11 GMT+0000 (UTC) 8521 15
171 Sun Jan 11 2015 19:51:16 GMT+0000 (UTC) 8521 15
172 Sun Jan 11 2015 20:07:31 GMT+0000 (UTC) 8521 15
173 Sun Jan 11 2015 20:23:40 GMT+0000 (UTC) 8521 15
174 Sun Jan 11 2015 20:39:44 GMT+0000 (UTC) 8633 15
175 Sun Jan 11 2015 20:55:43 GMT+0000 (UTC) 8633 15
176 Sun Jan 11 2015 21:11:51 GMT+0000 (UTC) 8633 15
177 Sun Jan 11 2015 21:28:43 GMT+0000 (UTC) 8639 15
178 Sun Jan 11 2015 21:45:39 GMT+0000 (UTC) 8639 15
179 Sun Jan 11 2015 22:01:47 GMT+0000 (UTC) 8639 15
180 Sun Jan 11 2015 22:19:06 GMT+0000 (UTC) 8639 15
181 Sun Jan 11 2015 22:36:19 GMT+0000 (UTC) 8695 15
182 Sun Jan 11 2015 22:52:26 GMT+0000 (UTC) 8695 15
183 Sun Jan 11 2015 23:08:39 GMT+0000 (UTC) 8695 15
184 Sun Jan 11 2015 23:24:53 GMT+0000 (UTC) 8695 15
185 Sun Jan 11 2015 23:40:51 GMT+0000 (UTC) 8735 15
186 Sun Jan 11 2015 23:56:57 GMT+0000 (UTC) 8735 15
187 Mon Jan 12 2015 00:13:08 GMT+0000 (UTC) 8735 15
188 Mon Jan 12 2015 00:29:17 GMT+0000 (UTC) 8735 15
189 Mon Jan 12 2015 00:45:16 GMT+0000 (UTC) 8931 15
190 Mon Jan 12 2015 01:01:36 GMT+0000 (UTC) 8931 15
191 Mon Jan 12 2015 01:17:50 GMT+0000 (UTC) 8931 14 -1
192 Mon Jan 12 2015 01:33:52 GMT+0000 (UTC) 9403 14
193 Mon Jan 12 2015 01:49:55 GMT+0000 (UTC) 9403 14
194 Mon Jan 12 2015 02:06:07 GMT+0000 (UTC) 9403 14
195 Mon Jan 12 2015 02:22:23 GMT+0000 (UTC) 9403 14
196 Mon Jan 12 2015 02:38:30 GMT+0000 (UTC) 10241 14
197 Mon Jan 12 2015 02:54:33 GMT+0000 (UTC) 10241 14
198 Mon Jan 12 2015 03:10:31 GMT+0000 (UTC) 10241 14
199 Mon Jan 12 2015 03:26:29 GMT+0000 (UTC) 10241 14
200 Mon Jan 12 2015 03:42:41 GMT+0000 (UTC) 6380 14
201 Mon Jan 12 2015 03:59:01 GMT+0000 (UTC) 6380 14
202 Mon Jan 12 2015 04:15:11 GMT+0000 (UTC) 6380 14
203 Mon Jan 12 2015 04:31:12 GMT+0000 (UTC) 7348 14
204 Mon Jan 12 2015 04:47:29 GMT+0000 (UTC) 7348 14
205 Mon Jan 12 2015 05:03:18 GMT+0000 (UTC) 7348 14
206 Mon Jan 12 2015 05:19:10 GMT+0000 (UTC) 7348 14
207 Mon Jan 12 2015 05:35:07 GMT+0000 (UTC) 8244 14
208 Mon Jan 12 2015 05:51:10 GMT+0000 (UTC) 8244 14
209 Mon Jan 12 2015 06:07:10 GMT+0000 (UTC) 8244 14
210 Mon Jan 12 2015 06:23:14 GMT+0000 (UTC) 8244 14
211 Mon Jan 12 2015 06:39:29 GMT+0000 (UTC) 9200 14
212 Mon Jan 12 2015 06:55:36 GMT+0000 (UTC) 9200 14
213 Mon Jan 12 2015 07:11:31 GMT+0000 (UTC) 9200 14
214 Mon Jan 12 2015 07:27:44 GMT+0000 (UTC) 9200 14
215 Mon Jan 12 2015 07:43:44 GMT+0000 (UTC) 10237 14
216 Mon Jan 12 2015 07:59:51 GMT+0000 (UTC) 10237 14
217 Mon Jan 12 2015 08:15:55 GMT+0000 (UTC) 10237 14
218 Mon Jan 12 2015 08:31:53 GMT+0000 (UTC) 11335 14
219 Mon Jan 12 2015 08:48:00 GMT+0000 (UTC) 11335 14
220 Mon Jan 12 2015 09:03:54 GMT+0000 (UTC) 11335 14
221 Mon Jan 12 2015 09:19:49 GMT+0000 (UTC) 11335 14
222 Mon Jan 12 2015 09:36:02 GMT+0000 (UTC) 12556 14
223 Mon Jan 12 2015 09:52:33 GMT+0000 (UTC) 12556 14
224 Mon Jan 12 2015 10:08:25 GMT+0000 (UTC) 12556 14
225 Mon Jan 12 2015 10:24:45 GMT+0000 (UTC) 12556 14
226 Mon Jan 12 2015 10:41:12 GMT+0000 (UTC) 13886 14
227 Mon Jan 12 2015 10:57:18 GMT+0000 (UTC) 13886 14
228 Mon Jan 12 2015 11:13:44 GMT+0000 (UTC) 13886 14
229 Mon Jan 12 2015 11:30:01 GMT+0000 (UTC) 15020 14
230 Mon Jan 12 2015 11:45:58 GMT+0000 (UTC) 15020 14
231 Mon Jan 12 2015 12:01:47 GMT+0000 (UTC) 15020 14
232 Mon Jan 12 2015 12:18:07 GMT+0000 (UTC) 15020 14
233 Mon Jan 12 2015 12:34:18 GMT+0000 (UTC) 16087 14
234 Mon Jan 12 2015 12:50:17 GMT+0000 (UTC) 16087 14
235 Mon Jan 12 2015 13:06:19 GMT+0000 (UTC) 16087 14
236 Mon Jan 12 2015 13:22:19 GMT+0000 (UTC) 16087 14
237 Mon Jan 12 2015 13:38:41 GMT+0000 (UTC) 17478 14
238 Mon Jan 12 2015 13:54:45 GMT+0000 (UTC) 17478 14
239 Mon Jan 12 2015 14:11:04 GMT+0000 (UTC) 17478 14
240 Mon Jan 12 2015 14:26:58 GMT+0000 (UTC) 17478 14
241 Mon Jan 12 2015 14:43:16 GMT+0000 (UTC) 19333 14
242 Mon Jan 12 2015 14:59:24 GMT+0000 (UTC) 19333 14
243 Mon Jan 12 2015 15:15:30 GMT+0000 (UTC) 19333 14
244 Mon Jan 12 2015 15:31:38 GMT+0000 (UTC) 21418 13 -1
245 Mon Jan 12 2015 15:47:48 GMT+0000 (UTC) 21418 13
246 Mon Jan 12 2015 16:03:47 GMT+0000 (UTC) 21418 13
247 Mon Jan 12 2015 16:19:55 GMT+0000 (UTC) 21418 13
248 Mon Jan 12 2015 16:35:50 GMT+0000 (UTC) 23082 13
249 Mon Jan 12 2015 16:52:10 GMT+0000 (UTC) 23082 13
250 Mon Jan 12 2015 17:08:32 GMT+0000 (UTC) 23082 13
251 Mon Jan 12 2015 17:24:25 GMT+0000 (UTC) 23082 13
252 Mon Jan 12 2015 17:40:27 GMT+0000 (UTC) 23988 13
253 Mon Jan 12 2015 17:56:32 GMT+0000 (UTC) 23988 13
254 Mon Jan 12 2015 18:12:32 GMT+0000 (UTC) 23988 13
255 Mon Jan 12 2015 18:28:53 GMT+0000 (UTC) 24181 13
256 Mon Jan 12 2015 18:45:05 GMT+0000 (UTC) 24181 13
257 Mon Jan 12 2015 19:01:22 GMT+0000 (UTC) 24181 13
258 Mon Jan 12 2015 19:17:10 GMT+0000 (UTC) 24181 13
259 Mon Jan 12 2015 19:33:13 GMT+0000 (UTC) 23793 13
260 Mon Jan 12 2015 19:49:16 GMT+0000 (UTC) 23793 13
261 Mon Jan 12 2015 20:07:33 GMT+0000 (UTC) 23793 13
262 Mon Jan 12 2015 20:24:01 GMT+0000 (UTC) 23793 13
263 Mon Jan 12 2015 20:40:14 GMT+0000 (UTC) 23193 13
264 Mon Jan 12 2015 20:56:15 GMT+0000 (UTC) 23193 13
265 Mon Jan 12 2015 21:12:19 GMT+0000 (UTC) 23193 13
266 Mon Jan 12 2015 21:28:33 GMT+0000 (UTC) 22496 13
267 Mon Jan 12 2015 21:46:02 GMT+0000 (UTC) 22496 13
268 Mon Jan 12 2015 22:04:38 GMT+0000 (UTC) 22496 13
269 Mon Jan 12 2015 22:20:33 GMT+0000 (UTC) 22496 12 -1
270 Mon Jan 12 2015 22:37:15 GMT+0000 (UTC) 21877 12
271 Mon Jan 12 2015 22:53:46 GMT+0000 (UTC) 21877 12
272 Mon Jan 12 2015 23:10:02 GMT+0000 (UTC) 21877 13 1
273 Mon Jan 12 2015 23:26:10 GMT+0000 (UTC) 21512 13
274 Mon Jan 12 2015 23:41:28 GMT+0000 (UTC) 21512 12 -1
275 Mon Jan 12 2015 23:56:37 GMT+0000 (UTC) 21512 12
276 Tue Jan 13 2015 00:11:58 GMT+0000 (UTC) 21512 12
277 Tue Jan 13 2015 00:27:06 GMT+0000 (UTC) 21512 12
278 Tue Jan 13 2015 00:43:27 GMT+0000 (UTC) 9852 12
279 Tue Jan 13 2015 00:59:29 GMT+0000 (UTC) 9852 12
280 Tue Jan 13 2015 01:14:52 GMT+0000 (UTC) 9852 12
281 Tue Jan 13 2015 01:30:16 GMT+0000 (UTC) 5918 12
282 Tue Jan 13 2015 01:45:50 GMT+0000 (UTC) 5918 12
283 Tue Jan 13 2015 02:01:19 GMT+0000 (UTC) 5918 12
284 Tue Jan 13 2015 02:17:30 GMT+0000 (UTC) 5918 12
285 Tue Jan 13 2015 02:33:41 GMT+0000 (UTC) 6536 12
286 Tue Jan 13 2015 02:49:50 GMT+0000 (UTC) 6536 12
287 Tue Jan 13 2015 03:05:55 GMT+0000 (UTC) 6536 12
288 Tue Jan 13 2015 03:21:51 GMT+0000 (UTC) 6536 12
289 Tue Jan 13 2015 03:38:03 GMT+0000 (UTC) 7348 12
290 Tue Jan 13 2015 03:54:04 GMT+0000 (UTC) 7348 12
291 Tue Jan 13 2015 04:10:09 GMT+0000 (UTC) 7348 12
292 Tue Jan 13 2015 04:26:16 GMT+0000 (UTC) 7348 12
293 Tue Jan 13 2015 04:42:13 GMT+0000 (UTC) 8247 12
294 Tue Jan 13 2015 04:58:13 GMT+0000 (UTC) 8247 12
295 Tue Jan 13 2015 05:14:17 GMT+0000 (UTC) 8247 12
296 Tue Jan 13 2015 05:30:12 GMT+0000 (UTC) 9214 12
297 Tue Jan 13 2015 05:46:06 GMT+0000 (UTC) 9214 12
298 Tue Jan 13 2015 06:02:17 GMT+0000 (UTC) 9214 12
299 Tue Jan 13 2015 06:18:25 GMT+0000 (UTC) 9214 12
300 Tue Jan 13 2015 06:34:27 GMT+0000 (UTC) 10271 12
301 Tue Jan 13 2015 06:50:23 GMT+0000 (UTC) 10271 11 -1
302 Tue Jan 13 2015 07:06:24 GMT+0000 (UTC) 10271 11
303 Tue Jan 13 2015 07:22:33 GMT+0000 (UTC) 10271 11
304 Tue Jan 13 2015 07:38:28 GMT+0000 (UTC) 11385 11
305 Tue Jan 13 2015 07:54:37 GMT+0000 (UTC) 11385 11
306 Tue Jan 13 2015 08:10:48 GMT+0000 (UTC) 11385 11
307 Tue Jan 13 2015 08:27:43 GMT+0000 (UTC) 11385 11
308 Tue Jan 13 2015 08:43:38 GMT+0000 (UTC) 6939 11
309 Tue Jan 13 2015 08:59:37 GMT+0000 (UTC) 6939 11
310 Tue Jan 13 2015 09:15:47 GMT+0000 (UTC) 6939 11
311 Tue Jan 13 2015 09:31:39 GMT+0000 (UTC) 7724 11
312 Tue Jan 13 2015 09:47:41 GMT+0000 (UTC) 7724 11
313 Tue Jan 13 2015 10:03:33 GMT+0000 (UTC) 7724 11
314 Tue Jan 13 2015 10:19:35 GMT+0000 (UTC) 7724 11
315 Tue Jan 13 2015 10:35:53 GMT+0000 (UTC) 8539 11
316 Tue Jan 13 2015 10:52:07 GMT+0000 (UTC) 8539 11
317 Tue Jan 13 2015 11:08:03 GMT+0000 (UTC) 8539 11
318 Tue Jan 13 2015 11:24:13 GMT+0000 (UTC) 8539 11
319 Tue Jan 13 2015 11:40:18 GMT+0000 (UTC) 9390 11
320 Tue Jan 13 2015 11:56:28 GMT+0000 (UTC) 9390 11
321 Tue Jan 13 2015 12:12:26 GMT+0000 (UTC) 9390 11
322 Tue Jan 13 2015 12:28:09 GMT+0000 (UTC) 10353 11
323 Tue Jan 13 2015 12:44:30 GMT+0000 (UTC) 10353 11
324 Tue Jan 13 2015 13:00:30 GMT+0000 (UTC) 10353 11
325 Tue Jan 13 2015 13:16:22 GMT+0000 (UTC) 10353 11
326 Tue Jan 13 2015 13:32:49 GMT+0000 (UTC) 11539 11
327 Tue Jan 13 2015 13:48:56 GMT+0000 (UTC) 11539 11
328 Tue Jan 13 2015 14:04:52 GMT+0000 (UTC) 11539 11
329 Tue Jan 13 2015 14:20:47 GMT+0000 (UTC) 11539 11
330 Tue Jan 13 2015 14:37:06 GMT+0000 (UTC) 13108 11
331 Tue Jan 13 2015 14:52:47 GMT+0000 (UTC) 13108 11
332 Tue Jan 13 2015 15:08:54 GMT+0000 (UTC) 13108 11
333 Tue Jan 13 2015 15:24:53 GMT+0000 (UTC) 13108 11
334 Tue Jan 13 2015 15:40:49 GMT+0000 (UTC) 14851 11
335 Tue Jan 13 2015 15:59:02 GMT+0000 (UTC) 14851 11
336 Tue Jan 13 2015 16:15:00 GMT+0000 (UTC) 14851 11
337 Tue Jan 13 2015 16:31:00 GMT+0000 (UTC) 16445 11
338 Tue Jan 13 2015 16:47:19 GMT+0000 (UTC) 16445 12 1
339 Tue Jan 13 2015 17:03:16 GMT+0000 (UTC) 16445 12
340 Tue Jan 13 2015 17:19:13 GMT+0000 (UTC) 16445 12
341 Tue Jan 13 2015 17:35:33 GMT+0000 (UTC) 17500 12
342 Tue Jan 13 2015 17:51:37 GMT+0000 (UTC) 17500 12
343 Tue Jan 13 2015 18:07:52 GMT+0000 (UTC) 17500 12
344 Tue Jan 13 2015 18:23:43 GMT+0000 (UTC) 17500 12
345 Tue Jan 13 2015 18:40:09 GMT+0000 (UTC) 17895 12
346 Tue Jan 13 2015 18:56:07 GMT+0000 (UTC) 17895 12
347 Tue Jan 13 2015 19:12:24 GMT+0000 (UTC) 17895 12
348 Tue Jan 13 2015 19:28:10 GMT+0000 (UTC) 17911 12
349 Tue Jan 13 2015 19:44:35 GMT+0000 (UTC) 17911 12
350 Tue Jan 13 2015 20:00:52 GMT+0000 (UTC) 17911 12
351 Tue Jan 13 2015 20:17:11 GMT+0000 (UTC) 17911 12
352 Tue Jan 13 2015 20:33:18 GMT+0000 (UTC) 17748 12
353 Tue Jan 13 2015 20:49:19 GMT+0000 (UTC) 17748 12
354 Tue Jan 13 2015 21:05:36 GMT+0000 (UTC) 17748 12
355 Tue Jan 13 2015 21:22:11 GMT+0000 (UTC) 17748 12
356 Tue Jan 13 2015 21:38:45 GMT+0000 (UTC) 17477 12
357 Tue Jan 13 2015 21:55:01 GMT+0000 (UTC) 17477 11 -1
358 Tue Jan 13 2015 22:11:14 GMT+0000 (UTC) 17477 11
359 Tue Jan 13 2015 22:27:47 GMT+0000 (UTC) 17276 11
360 Tue Jan 13 2015 22:43:59 GMT+0000 (UTC) 17276 11
361 Tue Jan 13 2015 23:00:04 GMT+0000 (UTC) 17276 11
362 Tue Jan 13 2015 23:16:06 GMT+0000 (UTC) 17276 11
363 Tue Jan 13 2015 23:32:15 GMT+0000 (UTC) 8058 11
364 Tue Jan 13 2015 23:48:00 GMT+0000 (UTC) 8058 11
365 Wed Jan 14 2015 00:04:06 GMT+0000 (UTC) 8058 11
366 Wed Jan 14 2015 00:20:08 GMT+0000 (UTC) 8058 11
367 Wed Jan 14 2015 00:36:24 GMT+0000 (UTC) 8525 11
368 Wed Jan 14 2015 00:52:32 GMT+0000 (UTC) 8525 11
369 Wed Jan 14 2015 01:09:16 GMT+0000 (UTC) 8525 11
370 Wed Jan 14 2015 01:25:46 GMT+0000 (UTC) 8525 11
371 Wed Jan 14 2015 01:41:39 GMT+0000 (UTC) 9207 11
372 Wed Jan 14 2015 01:57:26 GMT+0000 (UTC) 9207 11
373 Wed Jan 14 2015 02:13:40 GMT+0000 (UTC) 9207 11
374 Wed Jan 14 2015 02:29:51 GMT+0000 (UTC) 10123 11
375 Wed Jan 14 2015 02:45:48 GMT+0000 (UTC) 10123 11
376 Wed Jan 14 2015 03:19:15 GMT+0000 (UTC) 10123 11
377 Wed Jan 14 2015 03:35:18 GMT+0000 (UTC) 11319 11
378 Wed Jan 14 2015 03:51:06 GMT+0000 (UTC) 11319 11
379 Wed Jan 14 2015 04:07:24 GMT+0000 (UTC) 11319 11
380 Wed Jan 14 2015 04:23:17 GMT+0000 (UTC) 11319 11
381 Wed Jan 14 2015 04:39:23 GMT+0000 (UTC) 12585 11
382 Wed Jan 14 2015 04:55:48 GMT+0000 (UTC) 12585 11
383 Wed Jan 14 2015 05:12:22 GMT+0000 (UTC) 12585 11
384 Wed Jan 14 2015 05:28:27 GMT+0000 (UTC) 13925 11
385 Wed Jan 14 2015 05:44:25 GMT+0000 (UTC) 13925 11
386 Wed Jan 14 2015 06:00:25 GMT+0000 (UTC) 13925 11
387 Wed Jan 14 2015 06:16:45 GMT+0000 (UTC) 13925 11
388 Wed Jan 14 2015 06:32:33 GMT+0000 (UTC) 15208 11
389 Wed Jan 14 2015 06:48:27 GMT+0000 (UTC) 15208 10 -1
390 Wed Jan 14 2015 07:04:35 GMT+0000 (UTC) 15208 10
391 Wed Jan 14 2015 07:20:30 GMT+0000 (UTC) 15208 10
392 Wed Jan 14 2015 07:36:19 GMT+0000 (UTC) 16501 10
393 Wed Jan 14 2015 07:52:21 GMT+0000 (UTC) 16501 10
394 Wed Jan 14 2015 08:08:18 GMT+0000 (UTC) 16501 10
395 Wed Jan 14 2015 08:24:18 GMT+0000 (UTC) 16501 10
396 Wed Jan 14 2015 08:40:10 GMT+0000 (UTC) 8673 10
397 Wed Jan 14 2015 08:56:41 GMT+0000 (UTC) 8673 10
398 Wed Jan 14 2015 09:12:28 GMT+0000 (UTC) 8673 9 -1
399 Wed Jan 14 2015 09:28:31 GMT+0000 (UTC) 8673 9
400 Wed Jan 14 2015 09:44:42 GMT+0000 (UTC) 9655 9
401 Wed Jan 14 2015 10:00:27 GMT+0000 (UTC) 9655 9
402 Wed Jan 14 2015 10:16:26 GMT+0000 (UTC) 9655 9
403 Wed Jan 14 2015 10:32:08 GMT+0000 (UTC) 10706 9
404 Wed Jan 14 2015 10:48:08 GMT+0000 (UTC) 10706 9
405 Wed Jan 14 2015 11:04:15 GMT+0000 (UTC) 10706 9
406 Wed Jan 14 2015 11:20:13 GMT+0000 (UTC) 10706 9
407 Wed Jan 14 2015 11:36:25 GMT+0000 (UTC) 6790 9
408 Wed Jan 14 2015 11:52:17 GMT+0000 (UTC) 6790 9
409 Wed Jan 14 2015 12:25:00 GMT+0000 (UTC) 6790 9
410 Wed Jan 14 2015 12:41:19 GMT+0000 (UTC) 7548 9
411 Wed Jan 14 2015 12:57:17 GMT+0000 (UTC) 7548 9
412 Wed Jan 14 2015 13:13:01 GMT+0000 (UTC) 7548 9
413 Wed Jan 14 2015 13:29:13 GMT+0000 (UTC) 8557 9
414 Wed Jan 14 2015 13:45:02 GMT+0000 (UTC) 8557 9
415 Wed Jan 14 2015 14:01:08 GMT+0000 (UTC) 8557 9
416 Wed Jan 14 2015 14:17:16 GMT+0000 (UTC) 8557 9
417 Wed Jan 14 2015 14:33:31 GMT+0000 (UTC) 9816 9
418 Wed Jan 14 2015 14:49:32 GMT+0000 (UTC) 9816 9
419 Wed Jan 14 2015 15:05:36 GMT+0000 (UTC) 9816 9
420 Wed Jan 14 2015 15:21:32 GMT+0000 (UTC) 9816 9
421 Wed Jan 14 2015 15:37:45 GMT+0000 (UTC) 11332 9
422 Wed Jan 14 2015 15:53:45 GMT+0000 (UTC) 11332 9
423 Wed Jan 14 2015 16:09:52 GMT+0000 (UTC) 11332 9
424 Wed Jan 14 2015 16:25:39 GMT+0000 (UTC) 11332 9
425 Wed Jan 14 2015 16:41:54 GMT+0000 (UTC) 12733 9
426 Wed Jan 14 2015 16:58:01 GMT+0000 (UTC) 12733 9
427 Wed Jan 14 2015 17:13:51 GMT+0000 (UTC) 12733 9
428 Wed Jan 14 2015 17:29:55 GMT+0000 (UTC) 13714 9
429 Wed Jan 14 2015 17:45:41 GMT+0000 (UTC) 13714 9
430 Wed Jan 14 2015 18:01:31 GMT+0000 (UTC) 13714 9
431 Wed Jan 14 2015 18:17:30 GMT+0000 (UTC) 13714 9
432 Wed Jan 14 2015 18:33:54 GMT+0000 (UTC) 14293 9
433 Wed Jan 14 2015 18:49:54 GMT+0000 (UTC) 14293 9
434 Wed Jan 14 2015 19:07:22 GMT+0000 (UTC) 14293 9
435 Wed Jan 14 2015 19:23:17 GMT+0000 (UTC) 14293 9
436 Wed Jan 14 2015 19:39:13 GMT+0000 (UTC) 14293 9
437 Wed Jan 14 2015 19:55:07 GMT+0000 (UTC) 14293 9
438 Wed Jan 14 2015 20:11:38 GMT+0000 (UTC) 14293 9
439 Wed Jan 14 2015 20:27:50 GMT+0000 (UTC) 14587 9
440 Wed Jan 14 2015 20:43:55 GMT+0000 (UTC) 14587 9
441 Wed Jan 14 2015 21:00:01 GMT+0000 (UTC) 14587 9
442 Wed Jan 14 2015 21:15:53 GMT+0000 (UTC) 14587 9
443 Wed Jan 14 2015 21:32:27 GMT+0000 (UTC) 14518 9
444 Wed Jan 14 2015 21:50:25 GMT+0000 (UTC) 14518 9
445 Wed Jan 14 2015 22:06:19 GMT+0000 (UTC) 14518 9
446 Wed Jan 14 2015 22:22:18 GMT+0000 (UTC) 14518 9
447 Wed Jan 14 2015 22:39:35 GMT+0000 (UTC) 14491 9
448 Wed Jan 14 2015 22:55:37 GMT+0000 (UTC) 14491 9
449 Wed Jan 14 2015 23:11:33 GMT+0000 (UTC) 14491 9
450 Wed Jan 14 2015 23:27:27 GMT+0000 (UTC) 14491 9
451 Wed Jan 14 2015 23:43:33 GMT+0000 (UTC) 14662 9
452 Wed Jan 14 2015 23:59:36 GMT+0000 (UTC) 14662 9
453 Thu Jan 15 2015 00:15:49 GMT+0000 (UTC) 14662 9
454 Thu Jan 15 2015 00:31:50 GMT+0000 (UTC) 15165 9
455 Thu Jan 15 2015 00:48:01 GMT+0000 (UTC) 15165 9
456 Thu Jan 15 2015 01:03:55 GMT+0000 (UTC) 15165 9
457 Thu Jan 15 2015 01:19:42 GMT+0000 (UTC) 15165 9
458 Thu Jan 15 2015 01:35:50 GMT+0000 (UTC) 15921 9
459 Thu Jan 15 2015 01:51:49 GMT+0000 (UTC) 15921 9
460 Thu Jan 15 2015 02:08:00 GMT+0000 (UTC) 15921 9
461 Thu Jan 15 2015 02:23:49 GMT+0000 (UTC) 15921 9
462 Thu Jan 15 2015 02:39:48 GMT+0000 (UTC) 17038 9
463 Thu Jan 15 2015 02:55:56 GMT+0000 (UTC) 17038 9
464 Thu Jan 15 2015 03:12:06 GMT+0000 (UTC) 17038 9
465 Thu Jan 15 2015 03:27:51 GMT+0000 (UTC) 18520 8 -1
466 Thu Jan 15 2015 03:43:48 GMT+0000 (UTC) 18520 8
467 Thu Jan 15 2015 03:59:52 GMT+0000 (UTC) 18520 8
468 Thu Jan 15 2015 04:15:59 GMT+0000 (UTC) 18520 8
469 Thu Jan 15 2015 04:32:03 GMT+0000 (UTC) 18520 8
470 Thu Jan 15 2015 04:48:01 GMT+0000 (UTC) 20107 8
471 Thu Jan 15 2015 05:04:15 GMT+0000 (UTC) 20107 8
472 Thu Jan 15 2015 05:20:03 GMT+0000 (UTC) 20107 7 -1
473 Thu Jan 15 2015 05:35:57 GMT+0000 (UTC) 10032 7
474 Thu Jan 15 2015 05:52:05 GMT+0000 (UTC) 10032 6 -1
475 Thu Jan 15 2015 06:08:20 GMT+0000 (UTC) 10032 6
476 Thu Jan 15 2015 06:24:21 GMT+0000 (UTC) 10032 6
477 Thu Jan 15 2015 06:40:04 GMT+0000 (UTC) 11254 6
478 Thu Jan 15 2015 06:56:25 GMT+0000 (UTC) 11254 6
479 Thu Jan 15 2015 07:12:23 GMT+0000 (UTC) 11254 6
480 Thu Jan 15 2015 07:28:21 GMT+0000 (UTC) 4304 6
481 Thu Jan 15 2015 07:44:25 GMT+0000 (UTC) 4304 6
482 Thu Jan 15 2015 08:06:30 GMT+0000 (UTC) 4304 6
483 Thu Jan 15 2015 09:03:10 GMT+0000 (UTC) 4966 6
484 Thu Jan 15 2015 09:22:45 GMT+0000 (UTC) 4966 5 -1
485 Thu Jan 15 2015 09:38:57 GMT+0000 (UTC) 5655 5
486 Thu Jan 15 2015 09:55:39 GMT+0000 (UTC) 5655 5
487 Thu Jan 15 2015 10:15:15 GMT+0000 (UTC) 5655 5
488 Thu Jan 15 2015 10:31:12 GMT+0000 (UTC) 6384 5
489 Thu Jan 15 2015 10:47:28 GMT+0000 (UTC) 6384 5
490 Thu Jan 15 2015 11:03:28 GMT+0000 (UTC) 6384 4 -1
491 Thu Jan 15 2015 11:21:10 GMT+0000 (UTC) 6384 4
492 Thu Jan 15 2015 11:37:37 GMT+0000 (UTC) 4623 4
493 Thu Jan 15 2015 11:53:55 GMT+0000 (UTC) 4623 4
494 Thu Jan 15 2015 12:10:04 GMT+0000 (UTC) 4623 4
495 Thu Jan 15 2015 12:26:17 GMT+0000 (UTC) 5225 4
496 Thu Jan 15 2015 12:41:46 GMT+0000 (UTC) 5225 4

見えてくるもの



 観察時間である、日本時間の2015年01月10日 07時25分から01月15日 21時41分までで、在庫数は22個減って、10個増えています。単純に考えると、在庫の減は売れた数で、増は入荷した数だと思います。ただ、在庫の増については、キャンセルも考えられます。そのあたりの事情は外から見えないので、検討の対象外とします。
 そしてデータを見ていると、次の傾向が解ります。

  • 在庫の更新は、リアルタイム
  • 順位の更新は、1時間ごと。また、直前の1時間前のデータではなく、2時間前のデータが反映される
  • 休日夜間等の時間帯によって、ランクの増減幅が異なる
  • 一日に1〜2冊程度の売上で、10,000〜20,000位くらい

感想



 今回は、1冊の本を対象に在庫とランキングの関係をみていました。対象を広げて、Amazonの上位10万冊くらいのデータを定期的に取得すれば、もっと見えてくるものがありそうです。ただし、15分おきに5日ほど取得したとすれば、10万×96×5と4,800万回の取得が必要です。間違いなく怒られそうなので、自重しておきます。一度解析すれば、マーケティングデータを取得する際の推定とかに使えそうな気がしますね。

See Also
Amazonのランキングの不思議
プログラミング・レスで5分でサックリWebスクレイピング「kimonolabs」
『Rubyによるクローラー開発技法』を書きました

Amazonランキングの謎を解く: 確率的な順位付けが教える売上の構造 (DOJIN選書)

Amazonランキングの謎を解く: 確率的な順位付けが教える売上の構造 (DOJIN選書)

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例