ツイートと画像から検索して両者を組み合わせるプログラムを書いています。使用したツイートの MD5 ハッシュと使用した画像の uri を保持する 2 つの配列が組み込まれているため、新しい検索の結果を使用する前にこれらをチェックするので、同じものを再度使用することはありません。
ツイートに不要な文字が含まれているかどうか、または MD5 ハッシュのセットに含まれていないかどうかを確認するために使用するコードを次に示します。
unless (/@/.match(tweet[0]) or /http/.match(tweet[0]) or /^#/.match(tweet[0]) or md5list.include?(Digest::MD5.hexdigest(tweet[0])))
ここで md5list は、このように入力されるセットです
md5list << "#{Digest::MD5.hexdigest(tweet[0])}"
しかしmd5list.include?(Digest::MD5.hexdigest(tweet[0]))
、配列が空の場合でも、常にtrueを返すようです
ここで私がどこを台無しにしているのか誰にもわかりますか? ありがとう
編集:
セットには、テキスト文字列の MD5 ハッシュが多数含まれています。このセットを検索して、ランダムな文字列のハッシュを探し、セットにまだ存在しない場合にのみコードを実行したいと考えています。
これを行うために、基本的にunless (set.include?(Digest::MD5.hexdigest("test")
、セットに含まれている場合は true を返し、含まれていない場合は false を返します。これをirbでテストしましたが、うまくいくようです
irb(main):009:0> s = Set.new
=> #<Set: {}>
irb(main):010:0> s << Digest::MD5.hexdigest("test")
=> #<Set: {"9cdfb439c7876e703e307864c9167a15"}>
irb(main):011:0> s.include?("test")
=> false
irb(main):012:0> s.include?(Digest::MD5.hexdigest("test"))
=> true
irb(main):013:0> s.include?(Digest::MD5.hexdigest("test2"))
=> false
しかし、私の実装では、常に true を返すようです。
編集
いくつか、ええと、もっと、もの。(ここに完全なコードがあります。巨大なチャンクに投稿しないようにします: https://github.com/rolandshoemaker/bleak-tweets/blob/master/bleak-tweet.rb )
これは失敗している機能です。画像を検索する必要があり、uri の md5 ハッシュがまだ imagemd5 セットにない場合にのみ、画像を取得し、何らかの処理を行ってから、uri の md5 ハッシュをセットに追加して、同じ画像が取得されるようにします。再び使用されることはありません。
def imageSearch(tag, tweet, imagemd5)
Google::Search::Image.new(:query => tag).each do |image|
unless (imagemd5.include?(Digest::MD5.hexdigest(image.uri)))
filename = String.new
open(image.uri) { |f|
File.open("current", "wb") do |file|
file.puts f.read
end
img = Magick::Image::read("current").first
img.resize_to_fit!(600, 600)
drawable = Magick::Draw.new
drawable.pointsize = 18.0
#drawable.gravity = Magick::SouthEastGravity
drawable.font_weight = Magick::BoldWeight
tm = drawable.get_type_metrics(img, tweet)
drawable.fill = 'black'
#drawable.opacity(1)
xy1 = [0, (((img.rows)*6)/10)]
xy2 = [(((img.columns)*8)/10), (((img.rows)*9)/10)]
drawable.rectangle(xy1[0],xy1[1],xy2[0],xy2[1])
drawable.draw(img)
position = xy1[1]+10
wraptext(tweet, ((xy2[0]-xy1[0])-10)/10).each do |row|
drawable.annotate(img,(xy2[0]-xy1[0])-10,(xy2[1]-xy1[1])-10,10,position += 15,row) {self.fill='white'}
end
filename = "testy." << img.format
img.write(filename)
}
puts imagemd5.include?(Digest::MD5.hexdigest(image.uri)).inspect
imagemd5 << "#{Digest::MD5.hexdigest(image.uri)}"
puts imagemd5.include?(Digest::MD5.hexdigest(image.uri)).inspect
tumblrPost(tag, filename)
File.delete(filename)
File.delete("current")
break
end
end
end
これは画像を出力し、コンソールでこれを出力します(ツイートの例を含む)
Damn this swollen ankle. Smh #injured #painful
false
true
問題は、この場合、プログラムが使用した画像が既に使用されていたものでimagemd5.include?(Digest::MD5.hexdigest(image.uri)
あるにもかかわらず、true であるべき場所で false を返していることです。