プログラマでありたい

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

周回遅れで、SSDベースの新しいAmazon EBSの話

 少し前ですが、AWSのサービスに重大なアップデートがありました。ストレージサービスであるEBSに新しいサービスラインナップが追加され、General PurposeというSSDベースのサービスが利用できるようになりました。すでにyoshidashingoさんが色々考察しているので改めてまとめる必要もないですが、自分の中の整理のためにまとめてみます。

EBSのラインナップと価格体系 2014/06~



 今回追加されたのは、General Purpose(gp2)です。従来のスタンダードEBSはMagneticという名前になり、Provisioned IOPSは、io1という略称になりました。


 東京リージョンで利用例

サービス名 ベースラインIOPS Max IOPS 価格体系
General Purpose (SSD) 3(IOPS)×GB 3,000(burst) $0.12 1 か月にプロビジョニングされたストレージ 1 GB あたり
Provisioned IOPS (SSD) 100~4,000の間で指定したIOPS 4,000 0.142 : 1 か月にプロビジョニングされたストレージ 1 GB あたり
0.114 : 1 か月にプロビジョニングされた IOPS あたり
Magnetic
旧スタンダードEBS
40~200IOPS ? $0.080 : 1 か月にプロビジョニングされたストレージ 1 GB あたり
$0.080 /100 万 I/O リクエスト

選択のポイント



 今回追加されたGeneral Purpose(gp2)を考える上で一番のポイントは、IOPSの性能が確保したEBSの容量×3IOPSとなっている点です。100GBの場合は、100×3で300IOPSです。EBSの最大サイズである1TBの場合は、1,000×3で3,000IOPSになります。これ以外にも、gp2にはバーストという考え方があります。例えば、gp2で100GBの場合は、300IOPSがベースラインになります。バーストは、短期的(最大30分)に3,000IOPSまで利用できる機能です。この2つの前提で、gp2とProvisioned IOPS(io1)のどちらを使えば良いのか、ケースごとに考えてみます。

ケース1 1,000IOPS利用したい場合
gp2 334GB以上を選択すると、ベースラインが1,000IOPS。金額は、月額$43.12。4,500円弱
io1 GB×$0.142+1,000(IOPS)×$0.114。334GBと仮定したら、金額はGB×$47.42+$114。15,000円超。
gp2の方がお得

ケース2 3,000IOPSを利用したい場合
gp2 1,000GBを選択すると、ベースラインが3,000IOPS。金額は、月額$120。12,000円強
io1 GB×$0.142+3,000(IOPS)×$0.114。1,000GBと仮定したら、金額は$142+GB+$342。50,000円弱。

結論



 io2がコスト的にメリットが出るケースは非常に少ないです。少ないストレージ容量で、高IOPSが必要なケースのみです。今後の価格改定にもよりますが、gp2を使った方が有利なケースが殆どです。何か価格設定が間違っているようで、非常に気になります。バーストについては、別途検証してみたいです。


See Also:
Amazon Elastic Load Balancing (ELB)の内部構造および拡張・障害時の動き
AWSのEBS Provisioned IOPSからEBSについて妄想する
結構知らないAmazon EBSの細かい話。主にEBSのネットワークの構造について


参照:
Amazon Web Services ブログ: 【AWS発表】新しいSSDベースのElastic Block Storage
料金 - Amazon Elastic Block Store (EBS ) EC2用ブロックストレージ | アマゾン ウェブ サービス(AWS 日本語)
Amazon EBSのGeneral Purpose(SSD)雑感→3000PIOPSの100GB(io1)より3000IOPS Infiniteの1000GB(gp2)のほうがおトク! - yoshidashingo

RubyでWebスクレイピングの話をしてきました。第1回Webスクレイピング勉強会@東京

 ちょっと間が空きましたが、第1回Webスクレイピング勉強会@東京に参加して、LT枠でRubyでWebスクレイピングの話をしてきました。



 今まで全く参加したことがないレイヤーの勉強会だったので、新しい発見があり非常に勉強になりました。スクレイピングのAPIであるkimonoimportioなど、全く知らないサービスに出会えました。私は趣味でスクレイピングをしているのですが、本職としてやっている方のノウハウや悩みどころを聞けて参考になりました。

 また、資料中に書いているのですが、現在Rubyでクローラーを作る本を書いています。一応全編書き終えてるので、夏頃に出ればなぁという状況です。そして、東京に異動することになりました。勉強会に参加しやすくなるので、色々な所に顔をだしてみたいと思っています。

 ちなみに第2回Webスクレイピング勉強会@東京にも登壇予定です。ブログやサイトから、ヘッダーやフッター、サイドバーなどを除いて本文だけ抽出するにはどうするのというテーマで、20分ほど話す予定です。


参照:
第1回Webスクレイピング勉強会@東京 (全3回) - Qiita
2014/06/22 第1回Webスクレイピング勉強会@東京 #東京スクラッパー - Togetterまとめ
第1回Webスクレイピング勉強会@東京に参加してきました - 夜はいよいよ冴えたのだ。

発表者資料
オープンデータのためのスクレイピング
Webスクレイピング勉強会@東京 オープニングトーク (第1版) #東京スクラッパー
ScrapyとPhantomJSを用いたスクレイピングDSL
Webスクレイピングの基礎知識 #東京スクラッパー
CasperJSを使って任意のWebサイトを電子書籍化する方法
渡る世間は自然言語ばかり #東京スクラッパー
オープンデータのためのスクレイピング

See Also:
オープンソースのRubyのWebクローラー"Anemone"を使ってみる - プログラマになりたい
Capybara-DSLのはなし - プログラマになりたい
複数並行可能なRubyのクローラー、「cosmicrawler」を試してみた - プログラマになりたい
開発用プロキシ、「CocProxy」が便利 - プログラマになりたい
iTunesのランキングを毎日自動で取得する その1 - プログラマになりたい
Rubyのtwitterライブラリで、Twitter Streaming APIが扱えるようになっていた - プログラマになりたい


Rubyによるクローラー開発技法

Rubyによるクローラー開発技法

Spidering hacks―ウェブ情報ラクラク取得テクニック101選

Spidering hacks―ウェブ情報ラクラク取得テクニック101選

新幹線のWifiは、どうやってつながるのか?或いは、なぜ遅いのか?

f:id:dkfj:20140604102324j:plain


 東海道新幹線の東京~大阪間で提供されているWifiサービス。スマフォのテザリングが規制によって使えない時に、今でも使っています。しかし、御存知の通り遅いのです。あと、何故、東京~大阪間しか使えないのか。微妙に疑問に思っていました。答えは、すべて通信方式にありました。

 ずばり、LCX(同軸漏洩ケーブル)の余った帯域を、客用に開放しているだけだからです。同軸漏洩ケーブルとは、同軸ケーブルを使った通信方式です。同軸ケーブルから意図的に信号を漏らすことにより、ケーブルの周辺だけ通信できるという方式です。その方式ゆえにトンネル内でも通信できます。実際、もともとの用途は、新幹線の業務用の通信用です。それ以外にも、新幹線内の公衆電話等でも利用していたようです。
 そして、東海道新幹線では、そこを通る通信をデジタル化しています。デジタル化に伴い、ある程度帯域が余ったの、Wifiサービスとして提供しているのです。

 しかし、無限の帯域が余っている訳ではありません。新幹線1編成あたり最大2MBpsとのことです。1両ではないです。1編成です。のぞみであれば、16両編成で700席くらいあるわけです。そのうち%の人が使っているか解りませんが、2MBpsを分け合う訳ですよ。遅いのはあたりまえです。

 ということで、新幹線の中ではネットを使わない時間の過ごし方をするのが吉でしょう。


電波とアンテナが一番わかる (しくみ図解)

電波とアンテナが一番わかる (しくみ図解)

Rubyのtwitterライブラリで、Twitter Streaming APIが扱えるようになっていた

 久々に@sferikによるTwitterのAPIを使ってみると、いつの間にかTwitter Streaming APIも取得できるようになっていました。Twitter Streaming APIは、APIの中でも異色のもので、ひたすらパブリック・タイムラインを取得するといったものです。4年ほど前に出た当初は、かなり話題になって色々な人がタイムラインを取得して分析していました。かく言う私も、AWSのEC2上で動かして、1年ほどTwitterの呟きを取得して遊んでいました。ちょうど4年前はワールドカップがあり、日本の試合がある度にTweet量が爆発して、プログラムも爆発していました。細かい数字は忘れましたが、無料で使える数%に絞ったAPIのうち日本語だけに絞っても、月数千万件レベルでデータがあったと思います。
 そんなこんなのTwitter Streaming APIですが、当時はサードパーティ製のライブラリもなく自前でNet::HTTPやEventMachineを組み合わせて取得しました。それが、ライブラリ1つで簡単に出来るようになっているんですね。ありがたい限りです。

Twetter Streaming APIのサンプルコード



 一番簡単なTwetter Streaming APIのサンプルコードです。APIキーを取得して、環境変数にセットしておけば使えます。

require 'twitter'

config = {
  :consumer_key => ENV['TWITTER_API_KEY'],
  :consumer_secret => ENV['TWITTER_API_SECRET'],
  :access_token => ENV['TWITTER_ACCESS_TOKEN'],
  :access_token_secret => ENV['TWITTER_ACCESS_TOKEN_SECRET']
}
client = Twitter::Streaming::Client.new(config)
client.sample do |tweet|
  if tweet.is_a?(Twitter::Tweet)
    #日本語の呟きだけ表示
    puts tweet.text if tweet.lang == "ja"
  end
end

Twetter Streaming APIのデモ



まとめ



 これだけでは面白くないので、次はAWS Kinesisと組み合わせてみようかと思います。当時も、突発的に大量のデータが飛んできた時の処理能力などで困っていました。今だとKinesisとバックエンドのサーバを組み合わせたら何でもできそうですね。


See Also:
RubyでTwitter Streaming APIを使ってみる
Twitter Streaming APIのJSONの構造

参照:
sferik/twitter · GitHub

RubyのHTTPS通信で、OpenSSL::SSL::SSLErrorが出たら?

 Mac OSのバージョンアップする度に出しているような気がするのが、RubyのHTTPS通信でのエラー。ルート証明書が見つからなくてエラーがでます。

/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/net/http.rb:918:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)


 そんな場合は、まずはRubyの慌てず騒がずNet::HTTPがどこに証明書を探しにいっているかを確認します。

$ ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
"/etc/openssl/cert.pem"


 指し示された場所に、あるのでしょうか? 

$ ls /etc/openssl/cert.pem
ls: /etc/openssl/cert.pem: No such file or directory

 ないですね。OSをバージョンアップすると、何故か消えるっぽいです。


 フォルダ作って、証明書をダウンロードします。

$ sudo mkdir /etc/openssl
Password:
$ cd /etc/openssl/
$ sudo wget http://curl.haxx.se/ca/cacert.pem
--2014-05-17 17:10:23--  http://curl.haxx.se/ca/cacert.pem
Resolving curl.haxx.se... 80.67.6.50, 2a00:1a28:1200:9::2
Connecting to curl.haxx.se|80.67.6.50|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 250283 (244K)
Saving to: 'cacert.pem'

100%[======================================>] 250,283      214KB/s   in 1.1s   

2014-05-17 17:10:25 (214 KB/s) - 'cacert.pem' saved [250283/250283]
$ sudo mv cacert.pem cert.pem


 解決!!

OpenSSL::SSL::SSLError



 このエラーは、当然ながらWindowsでも起こりえます。Macの場合と同様に、デフォルトパスの場所にファイルを配置すれば、問題は解決します。それでは、Windows rubyの場合は、デフォルトの証明書のパスは、どこでしょう?RubyInstallerで入れた場合は、次のようになっていました。

>ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
"C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0l/ssl/cert.pem"

 ダメだ。このフォルダは作れない。誰だよ、Luisって!!そういう場合は、環境変数でしています。

>set SSL_CERT_FILE=C:\Ruby200\cacert.pem

 解決!!

RubyでAmazon Product Advertising APIを再び使ってみる

 ちょっと必要になって、再びAmazonのProduct Advertising APIを触ってみました。このAPIは、Amazon謹製のAPIで、商品検索や個別商品情報の取得が出来ます。元々このAPIの名前は、Amazon アソシエイト Web サービスといって、AWSと呼ばれていました。クラウドの方のAWSが出る前の話ですね。その後、クラウドの方がAWSという名称になり、こちらのAPIの名前がProduct Advertising APIに変わっています。
 ちなみに、Amazon Web サービスというサービス名は、現在もクラウドのAWS単体を指すのではなく、AmazonがAPIを使って提供しているサービス全体を指す言葉のようですね。ややこしいけど、全く必要としない豆知識でした。

Product Advertising APIを操作するRuby Gemを選ぶ



 Product Advertising APIは、過去の名称のものも含めて何度かメジャーバージョンアップしています。そして、古いバージョンのものは、一定期間後に使えなくなり気がついていないアプリ開発者の大絶滅を繰り返しているという歴史があったと思います。そんな理由があるので、古いライブラリが打ち捨てられることも多く、イマイチどのライブラリがメジャーなのか解りづらいところです。
 そんな中でGitHubをサクッと検索してみると、上位にくるのは下記の3つです。

  1. GitHub - jugend/amazon-ecs: Amazon Product Advertising Ruby API
  2. GitHub - completelynovel/amazon-product-advertising-api: A nice rubyish interface to the Amazon Product Advertising API, formerly known as the Associates Web Service and before that the Amazon E-Commerce Service.
  3. GitHub - hakanensari/vacuum: Amazon Product Advertising API client


 1つ目のAmazon ECSについては、5年前に記事を書いた時点から生き残っている古株です。その割には、最近でもメンテナンスされています。2つ目のAmazon Product Advertising APIについては、その名もズバリの名前でええのかよという感じですが、もうメンテナンスされていません。最後のvacuumについては、何でその名前を選んだという名称です。作り自体は、Product Advertising APIの薄いラッパーで手軽で使いやすいです。作られたのも最近で、比較的メンテナンスされています。上手くいけば、ちょっと複雑化しているAmazon ECSの対抗馬になると思いますが、名前からAmazon関係のライブラリと気が付かれることもないので、メジャーになりにくいのではと思います。

 そんな訳で、またAmazon ECSを利用します。インストールは、Gemで一発です。

$ gem install amazon-ecs
Fetching: amazon-ecs-2.2.5.gem (100%)
Successfully installed amazon-ecs-2.2.5
Parsing documentation for amazon-ecs-2.2.5
Installing ri documentation for amazon-ecs-2.2.5
Done installing documentation for amazon-ecs after 0 seconds
1 gem installed

Amazon ECSでProduct Advertising APIを操作する



 Product Advertising APIのサインアップがされているという前提で、アクセス・キーとシークレット・アクセス・キーは取得済みの前提とします。ちなみに、これらのキーは、AWSのマスターキーと同じで、かつProduct Advertising APIはIAMアカウントで操作できません。結構危険なので、両方使う人は別のアカウントを作る方がよいでしょうね。
 さて、下記のプログラムが、Amazon ECSを利用して一覧検索と個別商品取得をした例です。基本的には、item_searchメソッドとitem_lookupを覚えていれば事足ります。あとは、レスポンスをppなりで確認しながら弄れば大丈夫でしょう。

require 'amazon/ecs'
require 'pp'

Amazon::Ecs.options = {
  :associate_tag => 'sampleapp-22', 
  :AWS_access_key_id => ENV['AWS_ACCESS_KEY'], 
  :AWS_secret_key => ENV['AWS_SECRET_ACCESS_KEY']
}

#商品検索
res = Amazon::Ecs.item_search('ruby', :country => 'jp')
res.items.each do |item|
  puts item.get('ItemAttributes/Title')
end

#個別商品の詳細表示
res = Amazon::Ecs.item_lookup('B00JXEFT6Y', :response_group => 'Small, ItemAttributes, Images', :country => 'jp')
pp res


## 商品検索 item_searchメソッド
 商品検索のメソッドの実装は以下のとおりです。思いのほか、シンプルです。まぁ基本的には、Amazon Product Advertising APIに値を送っているだけです。optsに何を渡すかは、APIの方を見ないと解りません。

    # Search amazon items with search terms. Default search index option is 'Books'.
    # For other search type other than keywords, please specify :type => [search type param name].
    def self.item_search(terms, opts = {})
      opts[:operation] = 'ItemSearch'
      opts[:search_index] = opts[:search_index] || 'Books'
      
      type = opts.delete(:type)
      if type 
        opts[type.to_sym] = terms
      else 
        opts[:keywords] = terms
      end
      
      self.send_request(opts)
    end

 まずOperationですが、このメソッドを利用すると勝手にItemSearchが指定されます。このAmazon ECSは、幾つかあるAPIのOperationのうちで、3つだけ実装しています。ItemLookupとItemSearch,BrowseNodeLookupです。APIには、下記の通り9つの機能が幾つかあります。商品検索系とカート系の機能ですね。
http://docs.aws.amazon.com/AWSECommerceService/latest/DG/CHAP_OperationListAlphabetical.html

  • BrowseNodeLookup
  • CartAdd
  • CartClear
  • CartCreate
  • CartGet
  • CartModify
  • ItemLookup
  • ItemSearch
  • SimilarityLookup

 ItemSearchのAPIの仕様は以下のURLのとおりです。
http://docs.aws.amazon.com/AWSECommerceService/latest/DG/ItemSearch.html
オプションの値を、ハッシュ配列に格納して送ることが可能です。例えば、著者指定で検索する例です。

opts = {
  :country => 'jp',
  :author => '北方謙三'
}
res = Amazon::Ecs.item_search('三国志', opts)
res.items.each do |item|
  puts item.get('ItemAttributes/Title')
end


## 商品取得 item_lookupメソッド
 個別商品の取得は、item_lookupメソッドを利用します。商品を一意に識別するために、ASIN(本の場合だと、ISBN)を利用します。
http://docs.aws.amazon.com/AWSECommerceService/latest/DG/ItemLookup.html

# Search an item by ASIN no.
def self.item_lookup(item_id, opts = {})
  opts[:operation] = 'ItemLookup'
  opts[:item_id] = item_id
    
  self.send_request(opts)
end    


## その他のOperationの利用
 Amazon ECSで実装されている以外の、Operationを利用する場合は、send_requestメソッドを利用します。Optionの値を詰め込んで、send_requestメソッドを呼び出します。send_requestメソッドの中身が何をやっているかと、タイムスタンプを付けて、リクエスト用のURLに変換して送ってくれています。まぁ、それだけやってくれれば充分だなぁという作りです。カートなども、これを使えば実装できます。

    # Generic send request to ECS REST service. You have to specify the :operation parameter.
    def self.send_request(opts)
      opts = self.options.merge(opts) if self.options
      
      # Include other required options
      opts[:timestamp] = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")

      request_url = prepare_url(opts)
      log "Request URL: #{request_url}"
      
      res = Net::HTTP.get_response(URI::parse(request_url))
      unless res.kind_of? Net::HTTPSuccess
        raise Amazon::RequestError, "HTTP Response: #{res.code} #{res.message}"
      end
      Response.new(res.body)
    end


## まとめ
 商品の情報をまとめて取得しようと、久々に使ってみました。やはりAmazonはAPIがしっかり設計されているので使いやすいですね。


See Also:
RailsでProduct Advertising APIを扱うAmazon ECSを使う


参照:
http://docs.aws.amazon.com/AWSECommerceService/latest/DG/Welcome.html


5/6まで! Kindle本 ゴールデンウィーク セールのお勧め本/買った本

 今知ったのですが、Kindle本のゴールデンウィークセールが開催中です。期間は、2014/5/6まで。つまり今日までです。ざっと見ましたが、全部で164冊とすぐに選べる分量でした。その中で、私が買った本、お勧めする本などを紹介します。

全面改訂 超簡単 お金の運用術 [Kindle版]



 山崎元さんのお金の運用術のKindle版です。紙の本の初版持っていましたが、既に手元にないのと全面改訂と書いているので、買い直しました。山崎さんの運用術は、実は凄いオーソドックスで、銘柄や個別のファンドを追い求めるというスタイルではないです。インデックス・ファンドを、比率を注意して買いなさいという話です。そして、どのような比率で買えば良いのかという考え方を指し示しています。一度、読んでおくと基本が身につくので、かなりお勧めの著者の一人です。あとは、うそ臭い投資術をぶった切っているのも良いですよ。
¥821⇒¥250の70%オフ
全面改訂 超簡単 お金の運用術

全面改訂 超簡単 お金の運用術

稲盛和夫の実学 [Kindle版]



 京セラの創業者の稲盛和夫さんの実学。はるか昔、就職する前に読みました。これも手元にないので、改めて買い直します。社会人になって、仕事の経験を積んだ上で、稲盛さんの哲学がどう響くか楽しみです。「働き方」は、たぶん読んだことがないです。
¥566⇒¥228の58%オフ
稲盛和夫の実学

稲盛和夫の実学

¥1,512⇒¥400の74%オフ
働き方

働き方

お金のIQ お金のEQ ― 世界の幸せな小金持ちが知っているお金の法則 [Kindle版]



 本田健さんの本。今まで読んだことがあるかどうかは不明。一時期読み漁ってた時代があるので、読んでるかもしれません。本田健さんは、不労所得で稼ぐとは何かというテーマを、色々な事例をあげて紹介しています。こういった視点は大事だと思います。
紙版絶版⇒¥50
お金のIQ お金のEQ ― 世界の幸せな小金持ちが知っているお金の法則

お金のIQ お金のEQ ― 世界の幸せな小金持ちが知っているお金の法則

MEDIA MAKERS―社会が動く「影響力」の正体 (宣伝会議) [Kindle版]



 新しいメディアの形を模索しつづける田端さんの著書。これも読んだことがないので、この機会に読んでみます。最近、本の形というのを考え続けていますが、Kindleを始めとする電子出版がメジャーになってきて、劇的に変わっていると思います。本の書き方、編集/出版社の役割と。次の姿を考えるヒントにしてみたいですね。
¥1,728⇒¥450の74%オフ
MEDIA MAKERS―社会が動く「影響力」の正体 (宣伝会議)

MEDIA MAKERS―社会が動く「影響力」の正体 (宣伝会議)

沈没船が教える世界史 (メディアファクトリー新書) [Kindle版]



 タイトル買い。面白かったら書評書きます。
¥799⇒¥310の61%オフ
沈没船が教える世界史 (メディアファクトリー新書)

沈没船が教える世界史 (メディアファクトリー新書)

  • 作者: ランドール・ササキ(水中考古学者)
  • 出版社/メーカー: KADOKAWA / メディアファクトリー
  • 発売日: 2012/10/15
  • メディア: Kindle版
  • この商品を含むブログを見る

鋼の錬金術師1巻 (デジタル版ガンガンコミックス) [Kindle版]



 Kindleで手元においておこうかなぁと思って。
¥432⇒¥216の50%オフ
鋼の錬金術師1巻 (デジタル版ガンガンコミックス)

鋼の錬金術師1巻 (デジタル版ガンガンコミックス)

サクッと読める!「脳」の話



 評判良いみたいなので、買ってみます。
サクッと読める!「脳」の話

サクッと読める!「脳」の話

涼宮ハルヒの憂鬱 (角川スニーカー文庫) [Kindle版]



 今まで読んだことなかったので、読んでみたいです。
¥562⇒¥250の56%オフ
涼宮ハルヒの憂鬱 (角川スニーカー文庫)

涼宮ハルヒの憂鬱 (角川スニーカー文庫)


 Kindleは、セールがあれば一通り目を通してまとめ買いするのがよいですよ。


参照:
Kindle本 ゴールデンウィーク セール