ゆーすけべー (@yusukebe) さんが出版した「Webサービスのつくり方」を読みました。献本ありがとうございます!

この本は5章構成になっています。それぞれの内容は以下の通りです。
2章や3章も面白いのですが、個人的には1章、2章、5章が普段なかなか聞くことの無い話で面白かったです。Webサービスを作るときの考え方からプロモーションの方法まで、一通りまとまっていて参考になりました。特にWebサービスを自分で作ったことないけど作ってみたい、みたいな人はぜひ一度読んでみると良いと思います。
中でも興味深かったのが「いかにして大量のおっぱい画像をダウンロードするか」というコーナー。参考としてPerlのコードが載っていたので あくまで勉強のために コードの写経をしてみた、、、のですが、なぜかうまく動かず。(後でわかったのですが、認証時のパスワードが間違っていたっぽい><)
Perlは久しぶりで弄るの難しかったので、Rubyで同様の処理をするコードを書いて動作を確認してみました。無事動作しましたよ!!本の中でもおっぱい画像をダウンロードするスクリプトを見てPerlを勉強したっていう高校生の話が載ってたし、このコードを読んでそういう若者が出てくると良いですね :)
rescue節にクラスを指定しないと StandardError とそのサブクラスのエラーをキャッチしてくれるんですが、TimeoutError はInterrupt のサブクラスであって StandardError のサブクラスではないので、rescue節で明示的に指定しないとキャッチできません。ここだけ注意です〜。
あと、コードの中の YOUR_ACCOUNT_KEY の部分だけは各自置き換えてください。この値はWindows Azure Marketplaceにユーザ登録すると手に入ります。こんな感じ。

最後に印象に残った言葉をいくつか抜粋します。良い言葉や。
Shut the fuck up and write some code(ぐだぐだ言ってないでコードを書けよ、ハゲ)
そこに1,000人いたとして、アイデアを思いつくのが100人、アイデアを実現するのが10人、アイデアで成功するのが1人
車輪の再発明はしてもいいけど、仕事のときは絶対駄目だよ
There's More Than One Way To Do It(やり方は一つじゃない)

この本は5章構成になっています。それぞれの内容は以下の通りです。
1章 - 心構えと下準備
2章 - 企画
3章 - 設計
4章 - 開発
5章 - プロモーションと運用
2章や3章も面白いのですが、個人的には1章、2章、5章が普段なかなか聞くことの無い話で面白かったです。Webサービスを作るときの考え方からプロモーションの方法まで、一通りまとまっていて参考になりました。特にWebサービスを自分で作ったことないけど作ってみたい、みたいな人はぜひ一度読んでみると良いと思います。
中でも興味深かったのが「いかにして大量のおっぱい画像をダウンロードするか」というコーナー。参考としてPerlのコードが載っていたので あくまで勉強のために コードの写経をしてみた、、、のですが、なぜかうまく動かず。(後でわかったのですが、認証時のパスワードが間違っていたっぽい><)
Perlは久しぶりで弄るの難しかったので、Rubyで同様の処理をするコードを書いて動作を確認してみました。無事動作しましたよ!!本の中でもおっぱい画像をダウンロードするスクリプトを見てPerlを勉強したっていう高校生の話が載ってたし、このコードを読んでそういう若者が出てくると良いですね :)
require 'cgi'
require 'net/https'
require 'open-uri'
require 'rubygems'
require 'json'
Dir.mkdir('oppai') unless File.exist?('oppai')
account_key = YOUR_ACCOUNT_KEY
def build_params(page_count)
{
'Query' => CGI.escape("'おっぱい'"),
'Market' => "'ja-JP'",
'Adult' => "'off'", # 重要
'$format' => 'JSON',
'$top' => 50,
'$skip' => page_count * 50
}
end
page_count = 0
loop do
query_string = build_params(page_count).map {|k,v| "#{k}=#{v}" }.join('&')
req = Net::HTTP::Get.new("/Bing/Search/Image?#{query_string}")
req.basic_auth('', account_key) # パスワードは空でおk
https = Net::HTTP.new('api.datamarket.azure.com', '443')
https.use_ssl = true # httpsでアクセスするときには必須
https.verify_mode = OpenSSL::SSL::VERIFY_NONE # 証明書を確認しない
https.start do |http|
res = http.request(req)
JSON.parse(res.body)['d']['results'].each do |result|
filename = File.basename(result['MediaUrl'])
begin
open("oppai/#{filename}", 'wb') do |f|
open(result['MediaUrl']) do |image_data|
puts "Now downloading... #{filename}"
f.write(image_data.read)
end
end
rescue TimeoutError, StandardError
next
end
end
end
sleep 5
page_count += 1
end
rescue節にクラスを指定しないと StandardError とそのサブクラスのエラーをキャッチしてくれるんですが、TimeoutError はInterrupt のサブクラスであって StandardError のサブクラスではないので、rescue節で明示的に指定しないとキャッチできません。ここだけ注意です〜。
あと、コードの中の YOUR_ACCOUNT_KEY の部分だけは各自置き換えてください。この値はWindows Azure Marketplaceにユーザ登録すると手に入ります。こんな感じ。

最後に印象に残った言葉をいくつか抜粋します。良い言葉や。
Shut the fuck up and write some code(ぐだぐだ言ってないでコードを書けよ、ハゲ)
そこに1,000人いたとして、アイデアを思いつくのが100人、アイデアを実現するのが10人、アイデアで成功するのが1人
車輪の再発明はしてもいいけど、仕事のときは絶対駄目だよ
There's More Than One Way To Do It(やり方は一つじゃない)
