日々精進

新しく学んだことを書き留めていきます

2010-06-01から1ヶ月間の記事一覧

Webmockでresponseを指定していないURLへのアクセスがあった場合のエラーメッセージがおかしい

IT

Webmockを使って愉快な単体テストを書いたのですが、どうもエラーメッセージがおかしいです。 ※Webmockについての説明は↓を参照。ももんがさんいつもお世話になってます。 POST可能なRubyのNet::HTTP偽装テストライブラリWebMock+ - きたももんががきたん。 …

factory girlで多対多の関連を作る

IT

factory girlで多対多の関連を作る際にどうしてもうまくいかなくて困りました。 結果として以下のようにするとうまくいきました。 factories.rb Factory.define :image do |f| f.url {Factory.next(:image_url)} f.blog_article_id 1 f.training_data_regist…

factory girlでwrong number of argumentsエラー

IT

railsでfixtureの代わりに使われるfactory girlを使おうとすると、以下のエラーが発生。 ArgumentError: wrong number of arguments (0 for 1) この原因はfactory girlでテストデータを作成しようとしているモデルクラスが引数0のinitializeメソッドを持って…

railsのtimezoneについての誤解

IT

environment.rbに以下の行を追加すると時刻が日本時間になります。 config.time_zone = 'Tokyo' が、コレを追加した後でDBの中を見てみると、時刻がUTCのままではないか。つまり、DBに書き込んだ時刻が実際の時刻より9時間前の時刻になっている。 おかしいな…

mechanizeで文字化け

IT

※mechanizeのバージョンは1.0.0です。 ○問題 mechanizeでhtmlをparseすると文字化けすることがあります。 ○原因 ・mechanizeは内部的にnokogiriを使っている ・(おそらく)nokogiriはKconvを使って文字コードを変換している ・(おそらく)webから取得したH…

Mysqlに大きなデータを保存するとパフォーマンスが悪化する

IT

以下のようなテーブルを作ったところ、テーブルの総行数が1000行程度でもクエリの実行に数秒かかるようになってしまいました。 テーブル名:image カラム名: url name file #数百KB程度のデータが入る thumbnail↓の記事などを見て大きなデータを保存してい…

テスト時に実行したくないメソッドを切り替える方法2

IT

方法2.特異メソッドを定義する class Target def initialize @inner_target = InnerTarget.new end def foo open("http://yahoo.co.jp/") end end describe TestingTarget do before(:all) target = TestingTarget.new def target.foo return File.open("y…

テスト時に実行したくないメソッドを切り替える方法

IT

ネットワークやDBにアクセスするコードは単体テスト時には実行したくないですよね。 そういうコードをテスト環境で切り替える方法はいくつかありますが、一番お手軽な方法はメソッドを上書きする方法です。 方法1.サブクラスでoverride class Target def f…

RSpecでテスト

IT

RSpec使い始めの頃にプライベート変数の値をどうやってテストするかで悩んだことがありました。 色々調べた結果、instance_evalを使えば↓のようにテストできると判明。 @test_obj.instance_eval("@field").should == 1 これは便利・・・だけど、このメソッド…

書籍PDF化時Tips2−iPad等でページめくりを速くする方法

IT

iPadでPDFを読んでいる時に高い解像度で保存したPDFだとページめくりに5秒ぐらいかかっていらっとすることがあります。 そんな場合はacrobat(acrobat readerは不可)を使ってPDFを圧縮しましょう。手順は以下。 1.acrobatのメニューの文書→OCRテキスト認識…

書籍PDF化時Tips−ファイル名変更効率化

IT

ブックスキャンのようなPDF化サービスを利用してファイル名変更サービスを利用しない場合、ファイル名が時刻になっているので自分で変更する必要があります。 その際に、ファイル名変更を効率化する方法を紹介します。 1.PDF-XChange Viewerをインストール…

mechanizeで取得できないリンク

IT

mechanizeで目的のページのリンクを取得しているときに、どうしても取得できないリンクがありました。 agent.page.search("a").each do |link| ... end ↑のようにすべてのaタグを抜き出してもその中に目的のリンクがない。 agent.page.links.each do |link| …

スクレイピング

IT

最近mechanizeを使ってガリガリとスクレイピングをするコードを書いているわけですが、抜き出したいHTML要素のXPathを簡単に調べる方法があったのでご紹介。 XPathを実行する際のお勧めplugin - goinger的日記 ↑のサイトに書いてあるとおりなので読んでみて…

文字コード入門

IT

昨日紹介した問題は発生してからすぐに原因の見当がついた。 最近↓の本を読んだお陰です。プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)作者: 矢野啓介出版社/メーカー: 技術評論社発売日: 2010/02/18メディア: 単…

rubyで二バイトコード

IT

rubyは.NETに比べて文字コードの問題が起こりやすい気がします。 オープンソースに共通する問題かも知れませんが。 世界のいろんな人がいろんな文字コードを前提としてコードを書いてるからでしょうか。 mechanizeの単体テストである要素のinner_htmlを取得…

mechanizeで単体テストをする際の注意

IT

昨日紹介した方法で単体テストをする場合、以下のことに気をつける必要があります。 ・テスト用のHTMLファイルの文字コードはEUC-JPでなければいけない Shift-JISでもUTF8でもmechanizeがうまくパースしてくれません。 EUC-JP以外を使うとWebからHTMLを取得…

mechanize単体テスト3

IT

昨日の続き。 昨日のコードを書くと以下の現象が起こります。 ・リクエストがrewriteされる http://google.com/docs → http://localhost/docs のようにドメインがすべてlocalhostになる。 ・「BASE_DIRで指定したパス+/htdocs」がhttp://localhost/に対応付…

mechanize単体テスト2

IT

昨日の記事で紹介した方法で単体テストを行おうとしたけど、何故かmechanizeがうまくHTMLをパースしてくれない。 mechanizeのソースコードを読むとmechanize用の単体テストコード&ヘルパーがあった。 あ、このヘルパーを使わせてもらえばいいじゃん。 envir…

mechanizeの単体テスト

IT

mechanizeはWebサイトのスクレイピングを行うライブラリなのでネットワークに依存しています。 ↓のサイトは自動単体テスト時にネットワーク経由でHTMLを取得するのではなく、ローカルのファイルから取得する方法を紹介しています。 「ローカルの HTML をサー…

RSpec

IT

今更ながらRSpecを本格的に使い始めました。↓の記事などを参考にしています。 Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編) 単体テストコードを書いていてよく問題になるのがDBやネットワークへの依存をどの…

railsでバッチ処理

IT

railsでバッチ処理を書く場合、一番メジャーな手段はscript/runnerを使うことっぽいのでとりあえずこれを使ってみます。 他にもrufus-schedulerというgemもあるっぽい↓ rufus-scheduler という、ちょっとかわいそうな子 情報が少ないし、今回はパスしました。…

Mysql::Error: MySQL server has gone away

IT

rubyのhttp://anemone.rubyforge.org/を使ってcrawlerを作成中にエラーに見舞われました。 Webからダウンロードした画像をMySQLに保存しようとしたら以下のメッセージが表示されました。 Mysql::Error: MySQL server has gone away 早速エラーメッセージで検…

ブックスキャン、キャンセルできず

IT

6月から始まったプレミアムサービスを利用しようと思ったが、 先日申し込んだ200冊のスキャン依頼をキャンセルしないと依頼冊数が多くなりすぎる。 そこでブックスキャンにキャンセルを頼んでみたが、断られてしまった。。 また、ご依頼頂きましたものは、シ…

ブックスキャンプレミアムサービス開始

IT

トップページで宣伝してないからあまり公にするとまずいのかも知れませんが、 またブックスキャンのサービスがひっそりと拡充しました。 プレミアム特典は以下 ・Amazonや楽天ブックスなどのあるゆるサービスから、管理番号をダンボールにマジックで記載する…