Eri's Favorites > Thoughts > Ruby
12/17
,2007

初はてブ

[ ネット | Ruby ]
初めてEri's Favoritesがはてなブックマークされたよ! Rubyで作ったリンクチェックプログラムのエントリ。 なんか、open-uriのエラー処理をしたくて本を探してる人が、それっぽいキーワードで検索したっぽい。Googleで「ruby open-uri エラー処理」で検索すると3番目に出てくる。すごいすごい。これじゃRubyのブログみたいじゃん! でも非表示だったから、だれがブックマークしたかわかんないんだよなー。知りたいなー。
9/8
,2007

みつばちふたたび&Ruby 2作目

[ おいしいもの | 料理 | Ruby | 写真 ]
あんず
和三昧
御徒町のみつばちまで、パラダイムシフトを起こした氷あんず練乳がけを食べに行きました。今日は自転車。往復6.5kmです。日傘が使えないので、日焼け止め+長そで+長ズボン。あつい。

私は氷あんず練乳がけ、けんは白玉和三昧(きなこ味の氷にごまアイス)。ああ、しあわせ♪ 練乳がかかってるところとトロトロのあんずをまとめて食べるのが最高。夏の間にもう一度来れてよかった。家用に小倉アイスも買っちゃったー♪ うふふ。

夕飯はじゅんに教えてもらった豚の塩ダレ漬け。豚肉をごま油、塩(多め)、こしょう、砂糖で1時間ほどつけて焼きました。ほんとは魚焼きグリルでやると油が落ちていいんだけど、うちにはないのでフライパンで。それでもおいしかった。

Ruby 2作目は、デイリーポータルZの全記事をライターごとに分けたページを作ります。たーのしーい。
8/21
,2007

リンクチェッカープログラム(Ruby)が完成

[ Ruby | ブログ&HP ]
Eri's Favorites の外部サイトへのリンク切れを調べるプログラムが完成しました。Rubyistの第一歩です。

あらすじ~サイトマップとおもうことのトップページをあわせると、Eri's Favorites の全ページのリストができます(A)。その全ページにある外部サイトへのリンクを自動で確認して、リンクが切れてるののリストを作ります(B)。

6/11に(A)を作ってしばらくほっていました。土曜日に再開して(B)を作ってるうちに、(A)で作ったリストに不備があるのがわかって、(A)を手直ししつつ、(B)が完成。1人じゃエラーの返し方が分からないのでそこは丸投げだけど。

そして、(A)はサイトマップとおもうことのトップページとでページ構成が違うからそのままじゃ使えないんだけど、今日はけんが早々に寝てしまったので、自力でおもうことのトップ用に作り直しました。私すごい♪

やり方は、(A1)で a.txt、(A2)で a2.txt(2つでサイト内の全ページのURL一覧)を作り、それぞれを(B)にかけて b1.txt、b2.txt(リンク切れ一覧)を作る。

(A1)サイトマップから内部リンクのリストを作る

# ライブラリ"hpricot"を使う。HTMLのタグごとにエレメンツに分ける。
require "hpricot"

# ライブラリ"open-uri"を使う。開いてHTMLを取る。
require "open-uri"

# "http://eri.cheap.jp/site_map/index.htm"を「sitemapurl」という名前にする。
sitemapurl = "http://eri.cheap.jp/site_map/index.htm"

# 「sitemapurl」をHTMLのタグごとのエレメンツに分けたもの全体を「doc」という名前にする。
doc = Hpricot(open(sitemapurl))

# 各エレメンツの中で、<a>タグで「href^=http://」のないものの全体を「list」という名前にする。
list = doc.search('a:not([@href^=http://])')

# 「list」の1つずつを「link」と呼んで、
# 「link」の中の"href"属性を抜き出したものを「href」と呼んで、
# 「sitemapurl」から見た「href」をあわせて、絶対パスのURLにしたものを出力。
list.each{|link|
href = link.get_attribute("href")
puts URI.join(sitemapurl , href)
}
(A2)おもうことのトップページから内部リンクのリストを作る

# ライブラリ"hpricot"を使う。HTMLのタグごとにエレメンツに分ける。
require "hpricot"

# ライブラリ"open-uri"を使う。開いてHTMLを取る。
require "open-uri"

# "http://eri.cheap.jp/thoughts/index.html"を「sitemapurl」という名前にする。
sitemapurl = "http://eri.cheap.jp/thoughts/index.html"

# 「sitemapurl」をHTMLのタグごとのエレメンツに分けたもの全体を「doc」という名前にする。
doc = Hpricot(open(sitemapurl))

# 各エレメンツの中で、<a>タグだけ抜き出したのの全体を「list」という名前にする。
list = doc.search('a')

# 「list」の1つずつを「link」と呼ぶ。
# 「link」の中の"href"属性を抜き出したものを「href」と呼ぶ。
list.each{|link|
href = link.get_attribute("href")

# 全てのエントリは「過去のおもうこと」で網羅できるので、「http://eri.cheap.jp/thoughts/archives.........htm」が入っている行だけ残す。
next unless /^http:\/\/eri\.cheap\.jp\/thoughts\/archives.........htm$/ =~ href

puts (href)
}
(B)リストにある全てのページにある外部サイトへのリンクを確認して、リンク切れのリストを作る

# ライブラリ"hpricot"を使う。HTMLのタグごとにエレメンツに分ける。
require "hpricot"
# ライブラリ"open-uri"を使う。開いてHTMLを取る。
require "open-uri"

# ↓「linkcheck」メソッドを定義。「linkcheck」は入力したURLが200か調べる。
def linkcheck(url)
# puts url

# ライブラリ"URI"を使う。URLをホストとパス(前後)に分ける。
uri = URI.parse(url)

# ライブラリ"Net::HTTP"を使う。ステータス(200とか404とか)を調べる。
Net::HTTP.version_1_2
begin
Net::HTTP.start(uri.host, 80) {|http|
response = http.head(uri.request_uri)

# ステータスが"HTTPOK"(200)だったら"true"、それ以外は"false"を返す。
case response
when Net::HTTPOK
return true
else
return false
end
}

# ↓エラー処理
rescue SocketError
return false
end
# ↑エラー処理
end
# ↑「linkcheck」メソッド

# ↓「href_linkcheck」メソッドを定義。
# 渡された「line」はこのメソッド内では「page」(引数)として扱う。
def href_linkcheck(page)
# URLを「page」という名前にする。
# 「page」を開いて、HTMLのタグごとのエレメンツに分けたもの全体を「doc」という名前にして、
begin
doc = Hpricot(open(page))

# ↓エラー処理
rescue OpenURI::HTTPError
puts "404 not found " + page
return
end
# ↑エラー処理

# 各エレメンツの中で、<a>タグを探して「list」という名前にする。
list = doc.search('a')

# 「list」の1つずつを「link」と呼んで、
# 「link」の中の"href"属性を抜き出したものを「href」と呼ぶ。
list.each{|link|
href = link.get_attribute("href")

# <a>の中に"href"がなかったら次の<a>に行く(繰り返しの次へ)。
next unless href
# URLに「http://」が含まれているか(/ /で囲むと正規表現)
next unless /^http:\/\// =~ href
# URLに「http://eri.cheap.jp」が含まれているか(/ /で囲むと正規表現)
next if /^http:\/\/eri\.cheap\.jp/ =~ href

# 「href」に「linkcheck」する。結果が"true"の場合は次へ。
result = linkcheck(href)
next if result

# 「link」の中に文言か画像(子children)があるので取る。
# とりあえず子の一つ目だけ取って、文字列にする(.to_sで文字列に変換)
puts " " + link.children.first.to_s
puts " " + href
}

end
# ↑「href_linkcheck」メソッドここまで

# このプログラムに対する入力(ARGF)の各行を「line」という名前にして
ARGF.each do |line|

# その「line」を表示
puts "-----------------------------------"
puts line

# 「line」の最後の「\n」を削除し、「href_linkcheck」する
href_linkcheck(line.chomp)
end
6/11
,2007

Ruby始めました

[ Ruby | ブログ&HP ]
けんがきのうとおとといRuby会議に行ってRubyづいてるからか、Rubyを教えてくれました Rubyはプログラミング言語の名前です。けんがRuby大好きなので、私の誕生石(7月)と合わせて結婚指輪の内側に入れてるの。コマンドプロンプトの黒い画面に白い文字がかっこいい。これで3割増な気がする。今日から私も!(笑)

Eri's Favorites では外部サイト(私が作ってないページ)がリンク切れしてもメンテできないから、なるべく外部へはリンクをはってなかったのね。なので、外部サイトへのリンクが切れてるか確認するリンクチェッカーを作ります。

サイトマップとおもうことのトップページをあわせると、Eri's Favorites の全ページのリストができます(A)。その全ページにある外部サイトへのリンクを自動で確認して、リンクが切れてるののリストを作ります(B)。今日はまずAの部分。あとでサイトマップを最新のに更新しよう。仕様が結構上手く決まって、すじがいいとほめられました♪

# サイトマップから内部リンクのリストを作る

# ライブラリ"hpricot"を使う。HTMLのタグごとにエレメンツに分ける。
require "hpricot"

# ライブラリ"open-uri"を使う。開いてHTMLを取る。
require "open-uri"

# "http://eri.cheap.jp/site_map/index.htm"を「sitemapurl」という名前にする。
sitemapurl = "http://eri.cheap.jp/site_map/index.htm"

# 「sitemapurl」をHTMLのタグごとのエレメンツに分けたもの全体を「doc」という名前にする。
doc = Hpricot(open(sitemapurl))

# 各エレメンツの中で、<a>タグで「href^=http://」のないものの全体を「list」という名前にする。
list = doc.search('a:not([@href^=http://])')

# 「list」の1つずつを「link」と呼んで、
# 「link」の中の"href"属性を抜き出したものを「href」と呼んで、
# 「sitemapurl」から見た「href」をあわせて、絶対パスのURLにしたものを出力。
list.each{|link|
href = link.get_attribute("href")
puts URI.join(sitemapurl , href)
}