2012年4月26日木曜日

Ruby on Rails + RSpec 画像アップロードのテスト方法

画像をformからアップロードする時のバリデーションテストをどうするか?
という話をメモしておきます。
[環境]
CentOS6.2
Rails 3.2.2
Ruby 1.9.3-p125


(1)テスト対象のModel

前回に引き続き
簡易blog(食べたもの記録)アプリの記事本体部分を想定。
Modelの名前はDiningとします。
app_root/db/migrate/[date]_dinings.rbより抜粋すると
class CreateDinings < ActiveRecord::Migration
  def change
    create_table :dinings do |t|
      t.date :date      #日付
      t.string :time   #「朝」「昼」「夜」が入る
      t.string :menu #「食べたもの」
      t.integer :price  #「お値段」
      t.string :shop   #「店」
      t.string :place  #「店の場所」
      t.integer :evaluetion #1~5の5段階評価
      t.string :impression #感想
      t.string :ctype    # 写真が指定されている時写真のcontent_type
      t.binary :photo  #写真

      t.timestamps
    end
  end
end

写真データを直接DBに格納するモデルです。 ここでは ・画像ファイルのcontent-typeが画像で無い時バリデーションエラーになること をテストしていきます。

(2)テスト

app_root/spec/model/dining_spec.rbより抜粋
describe "写真(photo)" do
    it "content-typeが画像の時バリデーションエラーが発生しないこと" do
      @dining.data = Rack::Test::UploadedFile.new(Rails.root.join("test/fixtures/test.jpg"), "image/jpeg")
      @dining.should be_valid
    end
    it "content-typeが画像以外の時バリデーションエラーが発生すること" do
      @dining.data = Rack::Test::UploadedFile.new(Rails.root.join("test/fixtures/test.jpg"), "image/text")
      @dining.should be_valid
    end
  end

Rack::Test::UploadedFile.new()が仮想アップロードファイルをテストするためのメソッドで 第1引数にテスト画像,第2引数にcontent-typeを設定します。

(3)バリデーションの実装

テストがでけたので。 app_root/app/model/dining.rbにバリデーションを実装していきます。
#coding:utf-8
class Dining < ActiveRecord::Base

#中略

  validate :file_invalid? #写真のバリデート

  def data=(data)
    self.ctype = data.content_type
    self.photo = data.read
  end

  def file_invalid?
    if !self.photo.nil? then #写真が指定されてる時
      ps = ['image/jpeg', 'image/gif', 'image/png']
      errors.add(:photo, 'は画像ファイルではありません') if !ps.include?(self.ctype)
     end
  end

end
テスト/実装コードにもある通りフォーム側で画像をアップロードする時に、 直接model上のカラムである:imageではなく、:dataという仮のパラメータにセットして アップロード時に:ctypeと:imageを:dataから抽出してセットしている点が注意が必要。 form側では
<%= f.label :data, "写真" %> <%= f.file_field :data %>
という記述でアップロードフォームを実現しています。

2012年4月20日金曜日

スカパー!e2とひかりTVを比較検討した。

というわけで。
CS放送契約を検討中でして、現住居(都内の賃貸ワンルーム)の環境では
スカパーe2(スカパーHDはアンテナ立てられず断念)とひかりTVが選択肢になりました。
そこでスカパーe2の16日間無料とひかりTVの2ヶ月無料キャンペーンを利用して
両者のサービスを体験し、比較した結果をメモしておきます。

スカパー!e2

必要なもの

・CS110度対応アンテナ または フレッツTV
アンテナは無料でつけてくれるキャンペーンが今やってるそうです。
うちの場合はマンションの共聴設備で対応してました。

料金

月490円 + 基本パック3,570 円 + オプションチャンネル (Jリーグをみるなら2,580円)

メリット

・Jリーグ全試合生で見られるオプション有(スカパーのみ)
・テレビ内蔵のEPGが使える為動作・視聴予約が軽快(AQUOS使ってます)

デメリット

・(ひかりTV比で)料金が高い。
・別途レコーダーが無いと録画不可
・成人系ch無し


ひかりTV

必要なもの

・光Bフレッツ回線
・IPv6対応ルータ

料金

・月2,625円(テレビざんまいプラン) + チューナーレンタル料 525円 + オプションチャンネル
・月3,675円(おねうちプラン) + チューナーレンタル料 525円 +オプションチャンネル(テレビに加えてビデオのいくつかが見放題)

メリット

・外付けHDD取り付けで録画可能。
・オンライン録画予約可(スマホ/PCから可能なので撮り忘れが減る)
・料金安
・囲碁・将棋チャンネルがある(ただし2012年後半にはスカパー対応予定)
・成人系chがある(メリットかどうか)

デメリット

・Jリーグは諦めないといけない。
・UIがかなりもっさり。
単体で使うとマシかもしれないですがテレビ内蔵EPG等と比較するとさすがに重い。
NetFront(UIブラウザ)のせいなのか、STBのスペックがたりてないのか。
・番組表の見通しが悪い
縦の視認性が4時間分しかないので録画しておきたい番組があるかどうかガイド誌みたほうが早い
・リモコンショートカットが全画面視聴中に効かない
裏番組表表示中でないとショートカットできないのもちょっとイライラ


まとめ

・ひかりTV(テレビざんまい)+スカパー!e2 Jリーグパックが贅沢ながら個人的には満足度を最大化できる組み合わせな気がします。(がJパックの方は諦めるかもしれません。)
・人がこの調べ物してひかりTVのSTB申し込んだ直後にSonyが3波対応のnasne出してきたのでスカパーに乗り換えるかもしれません。
・ビデオ見たいならhuluのが安いしよさそう
・おうちでえろえろなものを見たい人はひかりTV一択です

2012年4月13日金曜日

Rails3.2 + RSpecで楽しいTDD(ModelのValidationテスト)

というわけでModelのバリデーション機能をテストしていきます。

[環境]

CentOS6.2
Rails 3.2.2
Ruby 1.9.3-p125

(1)テスト対象のModel

簡易blog(食べたもの記録)アプリの記事本体部分を想定。
Modelの名前はDiningとします。
app_root/db/migrate/[date]_dinings.rbより抜粋すると

class CreateDinings < ActiveRecord::Migration
  def change
    create_table :dinings do |t|
      t.date :date      #日付
      t.string :time   #「朝」「昼」「夜」が入る
      t.string :menu #「食べたもの」
      t.integer :price  #「お値段」
      t.string :shop   #「店」
      t.string :place  #「店の場所」
      t.integer :evaluetion #1~5の5段階評価
      t.string :impression #感想
      t.string :ctype    # 写真が指定されている時写真のcontent_type
      t.binary :photo  #写真

      t.timestamps
    end
  end
end

写真データを直接DBに格納する荒っぽいモデルですが利用者が1人ということでご勘弁を。 このモデルに対して
1.必須パラメータが空の時バリデーションではじかれること
2.必須で無いパラメータが空の時バリデーションではじかれないこと
3.長さの最大長があるものに関しては境界値動作が正しいこと
を確認するためのコードを書いていきます。

(2)テストデータの準備
app_root/spec/fixtures/dinings.ymlに以下の内容のテストデータを準備します。
#coding:utf-8
valid:
  date: 2012-03-22
  time: "朝"
  menu: "おうどん"
  price: 290
  shop : "おにやんま"
  place: "五反田"
  evaluetion: 4
  impression: "おいしい"
  ctype : "image/jpeg"
  photo:
 
ここではバリデーションに引っかからないようなデータを用意しておきます。
(3)テストコードの実装
app_root/spec/models/dinings_spec.rb
にテストコードをバリバリ書いていきます。
#coding:utf-8
require 'spec_helper'

describe "Dining バリデーションテスト" do

  fixtures :dinings #テストデータを設定
  before(:each) do #全テスト実行前の共通動作
    @dining = dinings(:valid) #dinings.ymlの (valid:)で指定されているデータを設定
  end
  it "dateが空の時:エラーが発生すること" do
    @dining.date = ""
    @dining.should_not be_valid #be_validで無いことを確認する
  end

さてこれでテストを実行すると(sporkはたちあげておいて下さい)
$ rspec --drb --drb spec/models/dining_spec.rb

バリデーションコード書いてないので失敗(日付が空だけどbe_valid)します。 4.テストを通すコードの実装
というわけでテストを通すコードを書いていきます。
app_root/app/model/dining.rb
#conding:utf-8
class Dining < ActiveRecord::Base
  validates :date,
    :presence => true #dateは空を許さない
end

これでテストを再度実行すると無事テストが成功。
というようなサイクルで
テストコード→実装→テスト通った嬉しいを繰り返していくと
段々緑色が見える度に脳内麻薬が出てコード書くのにboostがかかるのでおすすめです。
あと赤色が緑にならないと気持ち悪くて寝られなくなる。
次回は写真アップロードテストのやり方あたりをメモしておきます。

2012年4月12日木曜日

Rails3.2 + RSpecで楽しいTDD(導入編)

さて、標題にはTDDと書いてますが実際にはコード書いてからテスト書いてたりしてます。

手元でちまちま書いてるアプリもさすがにテストも無しではいかんだろうということで
まずは手元にあるコードのカバレッジが100%となるテストを書き、
その後次に何か乗っける時からはテストから書いていきたいと思います。

というわけで今回はテスト環境の導入編から。
この記事で前提とする環境は
・CentOS6
・Ruby on Rails 3.2.2
・Ruby 1.9.3 p-125
・MySQL
となっています。

(1)テストに必要なGemの導入
app_root/Gemfileに以下の記述を追加
gem 'rspec-rails'
gem 'simplecov', :require => false
#gem 'simplecov-rcov', :require => false
gem 'spork'

'rspec-rails'は文字通りRailsでRSpecテストを行うためのGem
'simplecov'はカバレッジ計測の為のGem(rcovはRuby 1.9系列では使用できない為)
'simplecov-rcov'はカバレッジレポートをrcovと同等の形で出力するためのgemで
Jenkins先生の出番がある人以外はいらないと思います。
sporkはTwiwt:Blog / jugyo : spork でサクサク RSpec on Rails3
こちらを参照。テストを高速に実行しまくる為に導入します。そして
$ bundle install

ここまでが済んだ状態で既存のものに対するテストのひな形を作る場合は
$ rails g rspec :controller hoge hage ...

てな感じで実行してみると(hoge,hageは自分が作ったコントローラ名)
app_root/spec/以下に自動生成されたテストケースのひな形ができると思います。

(2)テストの準備
1.sporkを起動する
テスト実行用のサーバーことsporkを起動します。
最初の1回のみ以下の設定が必要です。
$ spork --bootstrap

終われば
$ spork 

で起動。
2.カバレッジ計測処理の追加
app_root/spec/spec_helper.rbの先頭に以下の記述を追加
require 'rubygems'
require 'spork'

Spork.prefork do
end

Spork.each_run do
end

require 'simplecov'
require 'simplecov-rcov'
SimpleCov.start 'rails'



(3)テスト実行

$ rspec --drb spec/model/user_spec.rb

とこんな感じで実行できます。

$ rspec --drb spec/*

とかでまとめて実行も。
カバレッジは app_root/coverage/index.html
を見るとわかりやすく表示されていると思います。
次はmodelのバリデーションテストの書き方をメモしておこうと思います。

2012年4月4日水曜日

Ruby on Rails3.2でログイン機能を実装する。

というわけで。
簡易なブログアプリを作っていて、記事の投稿・編集・削除はログインした管理者のみで行いたいので
Rails3.1で追加された認証関連機能を使ってログイン機能をつけました。

参考にしたエントリー
ASCIIcasts - “Episode 270 - Rails 3.1の認証機能"

以下作業メモ
[環境]
CentOS6.2
Ruby 1.9.3(p125)
Ruby on Rails 3.2.2

1. Gemfileにbcryptrubyを追加
Gemfile内のgem 'bcrypt-ruby', '~>3.0.0~のコメントアウトを外した上で
bundle install

2.ユーザmodelの作成
$ rails g model user name:string password_digest:string
$ rake db:migrate

※password_digestのカラム名は変更してはいけない
/app/model/users.rbにhas_secure_passwordを追加
class User < ActiveRecord::Base  
  has_secure_password  
end  
3.管理アカウントの追加 とりあえずユーザアカウントは管理用アカウント1つでいいので、新規登録画面はつけずに直接DBに追加
$rails c
User.create!(:name => "admin", :password => "hoge", :password_confirmation => "hoge")
本来はpasswordなんてカラム無いのでエラーになるはずがこれで登録できている (DB上にはハッシュ化された値で登録されている)
4.ログイン機能実装 ・まずはコントローラの生成
$rails g controller sessions
・ログインフォーム(app/view/sessions/new.html.erb)

Log in

<%= form_tag sessions_path do %>
<%= label_tag :name, 'login name' %> <%= text_field_tag :name, params[:name] %>
<%= label_tag :pass, 'password' %> <%= password_field_tag :pass , params[:pass]%>
<%= submit_tag "ログイン" %>
<% end %>
・ルートの追加 config/routes.rbに以下を追加
resources :sessions do
  end
・コントローラ処理実装 app/controller/session_contoroller.rb ログインに成功したらトップヘリダイレクト 失敗したら同じフォームを再描画
def index
      render "new" 
  end
  def create
    user = User.find_by_name params[:name]
    if user && user.authenticate(params[:pass])
      session[:user_id] = user.id
      redirect_to root_path
    else
      flash.now.alert = "Invalid"
      render "new" 
    end
  end
  def destroy
    session[:user_id] = nil
    redirect_to root_path
  end
5.ビュー用ヘルパーメソッドの定義 ビューからログインユーザを参照できるようにする app/controller/application_contoroller.rb
class ApplicationController < ActionController::Base
app/controller/application_contoroller.rb
  protect_from_forgery

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end

  helper_method :current_user
end
6.ビューにログイン機能へのパスを追加
<% if current_user == nil %>
  <%= link_to "ログイン", sessions_path %>
<% else %>
  <%= link_to 'ログアウト', session_path(current_user.id), :confirm => 'ログアウトしますか?', :method => :delete %>
<% end %>
こんな感じでログインされてなければログイン表示・ログインしていればログアウト表示に切り替える。
あとは同様にログイン中のみ新規作成等を行えるようにしていけば目的は達成できた。
しかし簡素に書けて便利ですね。

2012年4月3日火曜日

CentOS6.2 + Rails 3.2.2 + Passenger+nginx環境構築メモ

とりあえずモダンな環境を試してみたいミーハー心で環境を構築
Rails 3.2.2をインストール済みの環境にpassenger+nginx環境を構築する際の
作業内容メモ
[環境]
CentOS6.2
rubyは

1. Passengerをインストール

$ gem install passenger


2.nginxのインストール
$ rvmsudo passenger-install-nginx-module

標準では/opt/nginx/に入る。

3.nginxの設定
/opt/nginx/conf/nginx.confに以下を追加

user = hoge; #適宜変更
server {
        listen       80;
        server_name  localhost;
        root /opt/my_app/public;   #追加
        passenger_enabled on;       #追加
        rails_env development;      #追加
        charset utf-8;             #追加
...
最初rails_envがproductionモードに標準でなっていることに気づかず、
手元で作っているアプリがnginx起動後に403やらなんやらで起動できなくハマりました。

4.nginx起動スクリプトの設定
/etc/init.d/にnginxを作成し
RedHatNginxInitScriptの中身を貼り付ける

nginx="/usr/sbin/nginx"
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
はそれぞれ
nginx="/opt/nginx/sbin/nginx"
NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"
に変更

5.起動確認
httpdを停止してから
nginx="/usr/sbin/nginx"
/opt/nginx/sbin/nginx -s
http://localhost/にアクセスするとrailsの初期ページが無事表示。
環境も表示されてます。

微妙にハマったけれども
お試しで作ってる簡易ブログアプリが無事動作。

2012年3月26日月曜日

Peercastハッカソンで一発芸を披露してきました


というわけで。
普段からどっぷりつかっているpeercastでハッカソンが開催される
ということで一発芸を披露してきました。
レギュレーションは3/24(金)21:00-3/26(日)18:00までに
なんか作るというもの。
せっかくRails勉強したのでなんかやってみようかと思いましたが
2.5日で完成させられる気がしなかったので温存してたアイデアである
普段から愛してやまないマナカナでゲームを作ってみました。
[ゲーム]
http://telegnosis.sakura.ne.jp/manakana/
(怒られたら消します)
[発表用メモ]
http://telegnosis.sakura.ne.jp/manakana/ref/img0.html

・実装したもの
○コンボシステム。3コンボから段々と画像が小さくなり5コンボからはランダムで
マナボタンとカナボタンが入れ替わります。
○ハイスコア。PHPでテキストに吐き出してるだけですが世界記録がみられます。
○BGM機能。HTML5のaudioタグ使ってみました。
・実装してないもの
○ランキング機能。設置環境のDBの関係で。
・作ってて初めて知ったこと
○HTML5の<audio>タグの音再生はスマートフォンのマナーモードとかお構いなし。
これautoloadだったら迷惑だなぁ。




○発表会
スライドによる普通のLTっぽいレベルの高い発表から
ひたすらウインドウが動くアプリのデモまで
カオス極める内容で腹筋が鍛えられるほど笑いました。
カオスの片鱗は こちら から。
最近は便利なサイトが多くて助かり申す。

○まとめ
・一発芸は絵が大事
・プリキュア勢v.s.将棋勢という新たなアングルが発生したお祭り。
主催のぷろぐれさん楽しいイベントありがとうございました。

2012年3月20日火曜日

Ruby on Rails3 アプリケーションプログラミング(山田祥寛)学習日記(5)

間が開いたものの続き。
第6章コントローラ開発から。
リクエスト処理では基本的なアップロードフォームとアップロードされたバイナリデータをDBに格納するケース。
レスポンス操作、状態管理(クッキー・セッション管理)、フィルタ、
全体共通な挙動を定義するためのApplicationコントローラについて、
ひと通りコードを叩いて動きを確認。
残りがルーティングとテストそしてjavascript(Ajax連携)なんでこれが終わったらなんか
お試し的なものを書いてみよう。
そして環境をUbuntuからCentOSにしよう(謎

2012年3月14日水曜日

Ruby on Rails3 アプリケーションプログラミング(山田祥寛)学習日記(4)

続き。
第5章モデル開発

ここではデータベースアクセスに関するいろいろなこと。
特に5.4.2 attr_protected/attr_accessibleメソッドは
github の mass assignment 脆弱性が突かれた件
にもあるようについ最近話題になったRailsアプリケーションの脆弱性になりやすいとこだそうなので実際コードをかきながら確認。
他にトランザクション・オプティミスティック同時実行制御について
ふむふむとコードを書きながら読み込む。
とりあえずデータのCRUDに関してはできるようになったはず。
次回は6章コントローラ開発から。

2012年3月12日月曜日

Ruby on Rails3 アプリケーションプログラミング(山田祥寛)学習日記(3)

3章Scaffolding機能によるRails開発の基礎
4章ビュー開発

基本的に機能の説明なので流してよみつつ気になるものについては実際に書いてみて確認。
メモ
・部分テンプレートの命名規則は 「_名前.html.erb」
・P91 rake db:drop:allは rake db:dropで良さそう
・データベースの初期化は rake db:reset
・特定のモデルを更新する為にはform_forのが手っ取り早い。

全く無関係ながらvim の NERD-TreeプラグインとRails.vimの連携が非常に便利でした。

2012年3月11日日曜日

Ruby on Rails3 アプリケーションプログラミング(山田祥寛)学習日記(2)

2章Ruby on Railsの基本から

本書の記述と異なっていた点

P49 2.4.5 フィクスチャによるテストデータの純美
本文

rake db:fixtures:load FIXTURES=books.yml

books.ymlの.ymlまでは不要らしい

rake db:fixtures:load FIXTURES=books

で解決。

その他のメモ
sqlite3がdbconsoleでエラーを吐く。
hoge@ubuntu:~/work/railbook$ rails dbconsole
SQLite header and source version mismatch
2011-06-23 19:49:22 4374b7e83ea0a3fbc3691f9c0c936272862f32f2
2012-01-16 13:28:40 ebd01a8deffb5024a5d7494eef800d2366d97204

エラーメッセージを検索する限り sudo ldconfigで解決するはずがまったく解決しない。ぐぬぬ。
対処どうすればいいんだろう。

2012年3月10日土曜日

Ruby on Rails3 アプリケーションプログラミング(山田祥寛)学習日記(1)

というわけでrails事始めとしてRuby on Rail3 アプリケーションプログラミング(著:山田祥寛)を上から順番に追っていく
お勉強日記。

[環境]
(作業側)
Ubuntu11.10
ruby1.9.3
rails 3.2.2
ほんとうに最初からなんでのんびり。

[1]インストール
いろいろなところで書かれているので省略
[2]アプリケーションの作成
rails new testApp
[3]動かしてみる
rails s
/home/ゆーざ/.rvm/gems/ruby-1.9.3-p125/gems/execjs-1.3.0/lib/execjs/runtimes.rb:50:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
うおーなんじゃこりゃ。色々調べる。
アプリケーション直下のGemfileの
# gem 'therubyracer'
のコメントアウトを外して
budle install
を実行。再びrails s。動いたっぽいので。http:/localhost:3000/にアクセス。お、ページ出た出た。
意外にハマってしまったので今日はここまで。
次回はコントローラってなんぞ?ぐらいから。

2012年3月8日木曜日

BingAPIを使用した画像検索(2)_Rubyでかく自動ZIPでくれスクリプト

ゆーすけべーさんのおっぱい収集スクリプトに触発された
自動ZIPでくれスクリプト第2回。

画像検索APIを叩いて帰ってきたJSONデータの例が↓(公式ドキュメントより)
-------------------------------------------------------------------------------------------------
{
   "SearchResponse":{
      "Version":"2.0",
      "Query":{
         "SearchTerms":"xbox site:microsoft.com"
      },
      "Image":{
         "Total":92,
         "Offset":0,
         "Results":[
            {
               "Title":"Microsoft Deutschland GmbH auf der CeBIT 2006.",
               "MediaUrl":"http:\/\/www.microsoft.com\/germany\/presseservice\/images\/pressemappen\/cebit2006\/Xbox-360_5.jpg",
               "Url":"http:\/\/www.microsoft.com\/germany\/presseservice\/service\/pressemappen\/cebit2006.mspx",
               "DisplayUrl":"http:\/\/www.microsoft.com\/germany\/presseservice\/service\/pressemappen\/cebit2006.mspx",
               "Width":3259,
               "Height":3264,
               "Thumbnail":{
                  "Url":"http:\/\/ts2.images.live.com\/images\/thumbnail.aspx?q=2847678867077&id=b3ba5b922c04d322d937275335c8cf75",
                  "ContentType":"image\/jpeg",
                  "Width":159,
                  "Height":160,
                  "FileSize":2624
               }
            },
...

getしたい画像データがどこに入っているかというと
"MediaUrl" ここ。

というわけでMediaUrlが.jpg or .jpegだったらDLしてきてローカルに保存。200件終わったらまとめてzipにする。
zipに固める為gem install rubyzipしておく
rubyでの実装は 橋本商会 いかにしておっぱい画像をダウンロードするか〜2012 をRubyで書いた様をパクリ参考にさせて頂きました。
--------------------------------------------------------------------------------------------------------------------
# -*- encoding: utf-8 -*-
require 'rubygems'
require 'open-uri'
require 'json'
require 'uri'
require 'kconv'
require 'zip/zipfilesystem'

APP_ID = '' #APPIDは別途取得
API_URI = 'http://api.bing.net/json.aspx'


dir = './img/'
Dir.mkdir dir unless File.exists? dir

page_count = 0
dl_count = 0
query = "Yukie Nakama"

loop do 
 if page_count == 4 #50 * 4 DLしたら打ち止め
  break
 end
 url = API_URI + '?' + 
  "AppId=" + APP_ID + "&" +
  "Version=2.2&Market=ja-JP&Sources=Image&Image.Count=50&Image.Offset=" + URI.encode((page_count * 50).to_s) +
  "&Adult=off&Query="+ URI.encode(query.to_s)

 search_result = JSON.parse(open(url).read.toutf8)

 search_result['SearchResponse']['Image']['Results'].each do |entry|

  if /\.jpe?g$/ =~ entry['MediaUrl'] then #jpg or jpegを拾う
   dl_count += 1
   file_name = dl_count.to_s + ".jpg" #ファイル名は 数字 + jpg
   path = "#{dir}/#{file_name}" 
   puts "No #{dl_count}:Start"

   begin #imgをDLしてローカルに保存
    img = open(URI.encode entry['MediaUrl']) 
    img.close
    puts "DL Success"
    File.rename(img.path, path)
   rescue
    puts "DL Fail"
    next
   end
  else
   next
  end
 end
 page_count += 1
end
#画像DLここまで
#zipで圧縮
Zip::ZipFile.open("./#{query}.zip", Zip::ZipFile::CREATE) do |zip|
 Dir.open(dir).each{|f|
  next if f == "." or f == ".." #ディレクトリの下のみが対象
  f = File.expand_path(f,dir)
  zip.add(File.basename(f), f)
 }
end
#DLしたファイルの削除
Dir.open(dir).each{|f|
 next if f == "." or f == ".." #ディレクトリの下のみが対象
 f = File.expand_path(f,dir)
 File.unlink(f)
}
Dir.rmdir(dir)



これでYukie Nakama.zipができて生活がはかどった。

クエリを変えれば壁紙収集ぐらいはできるのかな。

2012年3月7日水曜日

BingAPIを使用した画像検索(1)

[目標]

Bingの画像検索APIで画像を検索し、その検索元画像をダウンロード後ZIPにまとめる

「ZIPでくれ」ならぬ「ZIPでやる」

[やったこと]

○Bing 開発者登録

 https://ssl.bing.com/webmaster/developers/appids.aspx から登録しApplicationIDを取得

APIの叩き方をふむふむと読む。

○JSONライブラリのインストール

> gem install json

○APIを叩いてみる 

 

# -*- encoding: utf-8 -*-
require 'open-uri'
require 'json'
require 'uri'
require 'kconv'

APP_ID = ''#Bingで登録したアプリケーションID
API_URI = 'http://api.bing.net/json.aspx'

query = "仲間由紀恵"
url = API_URI + '?' +
"AppId=" + APP_ID + "&" +
"Version=2.2&Market=ja-JP&Sources=Image&Image.Count=50&Image.Offset=0&Query="+
URI.encode(query.to_s)

dat = JSON.parse(open(url).read.toutf8)
#とりあえず検索結果を吐き出す
File.open("./result.txt", "w") do |f|
  f.puts dat
end
無事検索結果のJSONが取得できた。

次はここから画像の元URLをたどり画像をDLすることを目標。

2012年3月6日火曜日

Ubuntu11.10をインストールしてコードを書きだす前にやったこと(2)


前回の続き
[Vim plugin]
quick-run :vim上で即座に実行
neocomplcache:補完用
インストール方法は
新卒さん向け、速攻でプログラミングをマスターできるvimプラグイン「quickrun」
そろそろしっかりvimを使う。vimでRubyのコーディングをするためにを参考にさせて頂きました。

[ruby]
Rubyのインストール
  1. ソースコードのダウンロード .http://www.ruby-lang.org/ja/downloads/ から1.9.3-p125を取得
  2. 解凍。tar zxvf ruby-1.9.3-p125.tar.gz
  3. インストール
cd ruby-1.9.3-p125/
./configure
make
         su(Ubuntuはインストール時にrootのパスワードが設定されてないのでsudo su - で設定しておく)
         make install
    4.   $ ruby -v
 ruby 1.9.3p125 (2012-02-16 revision 34643) [i686-linux]
 irb(main):001:0> p "Hello world!"
"Hello world!"
=> "Hello world!"
とりあえず実行環境は整った。

2012年3月5日月曜日

Ubuntu11.10をインストールしてコードを書きだす前にやったこと(1)

Ruby なるものをかじってみたいと思いRuby環境を構築するまでのメモ

[環境]

VMware Player 4.0.2

OS:Ubuntu11.10

 

[エディタ]

vim派なのでvimのインストールから

  1. sudo apt-get install vim-gnome
  2. インストール完了後gnomeを叩くと3`.
  3. (gvim:3869): Gtk-WARNING **: module_path にはテーマ・エンジンがありません: "pixmap",

    (gvim:3869): Gtk-WARNING **: module_path にはテーマ・エンジンがありません: "pixmap",

    (gvim:3869): Gtk-WARNING **: module_path にはテーマ・エンジンがありません: "pixmap",

    (gvim:3869): Gtk-WARNING **: module_path にはテーマ・エンジンがありません: "pixmap",
  4. sudo apt-get install gtk2-engines-pixbuf で解決
  5. しかしgvim起動してもどうにも動かない...なぜ?
  6. https://forums.ubuntulinux.jp/viewtopic.php?id=12237で解決。.bashrcに gvim(){ /usr/bin/gvim -f "$@" & true; }を追加。
  7. 無事起動。.vimrcやらは省略。

次回はプラグインやらなんやらの設定から。vimのインストール1つでここまで手間取ると思わなかった。