日々精進

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

2010-01-01から1年間の記事一覧

プログラミングコンテストチャレンジブック演習「迷路の最短路」

IT

今回のお題はこちら。 ゴール地点の最短経路の長さのみ答えればいいんですが、デバッグのために探索済みの範囲の最短経路も表示するようにしてます。 今回は多次元配列の初期化方法を↓のブログで新しく学びました。 http://d.hatena.ne.jp/octech/20051014 …

プログラミングコンテストチャレンジブック演習「lake counting」

IT

今回のお題はこちら 今回はまった点は以下。 ・Rubyでは、改行を挟んで文を続けたい場合は「\」を改行前に打つ 普段C#とか書いてたら忘れますな。。 $lake = [ ["W", ".", ".", ".", ".", ".", ".", ".", ".", "W", "W", "."] \ ,[".", "W", "W", "W", ".", …

プログラミングコンテストチャレンジブック演習「部分和問題」

IT

今回のお題はこちら $ary = [1, 2, 4, 7] #input K = 15 #input def dfs(i, sum) return sum == K if i == $ary.length return true if dfs(i + 1, sum) return true if dfs(i + 1, sum + $ary[i]) return false end if dfs(0, 0) puts "YES" else puts "NO"…

プログラミングコンテストチャレンジブック演習「くじ引き」2

IT

前回の答えのbinarySearchを再帰呼び出しを使って書き直してみました。 でもあまりすっきりしない。むう。 このお題を解いている時に知ったんですが、RubyのArrayに標準で付いている検索メソッド(Index)は線形探索で実装されているらしいです。 http://d.h…

プログラミングコンテストチャレンジブック演習「くじ引き」

IT

今回のお題はこちら $kuji = [1, 2, 3, 4, 10, 30, 2] N = $kuji.length - 1 m = 100 def GetAllKcKdConbination() kujiSubset = Array.new for i in 0..N for j in i..N kujiSubset.push($kuji[i] + $kuji[j]) end end return kujiSubset.sort end def bina…

プログラミングコンテストチャレンジブック演習「ants」

IT

今回のお題はこちら。 これは蟻がぶつかったときにお互い影響なくすり抜けたと見なしても問題ないことに気付けるかどうかがポイントですね。俺はわかりませんでした。。 L = 10 #input $ants = [2, 6, 7] #input $minTime = 2147483647 $maxTime = 0 $ants.e…

プログラミングコンテストチャレンジブック演習「三角形」2

IT

三角形を作れるかどうかは3辺のうち小さい2辺の合計が大きい1辺より大きいことを確認するだけでいいなということに気付いたので 前回のコードを以下のように書き直しました。 めっちゃシンプルになった!こういうときすごく嬉しいですね。 lengths = [10, 2,…

プログラミングコンテストチャレンジブック演習「三角形」

IT

ご無沙汰しています。 久々に勉強の成果など書き連ねていこうと思います。 まずはプログラミングコンテストチャレンジブックの演習をこなしていきます。 言語はRubyを使用します。 今回のお題はこちら lengths = [10, 2, 3, 4, 5] #input lengths.sort!{|a, …

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 という、ちょっとかわいそうな子 情報が少ないし、今回はパスしました。…