Edited at

いろんな情報を収集するサイトをRailsで作成した。


初めに

本日はクリスマスですね。

アドベントカレンダーの最終日なので最近作っていたサイトを公開してみました。

latest.png

http://demo-sibakeny.info/home/top

なぜか今javascriptがうまく機能しないところがあります。


サイトの内容

まずどういったサイトかというと様々なサイトをスクレイピングして情報を収集して情報が更新されていたらその記事のタイトルとurlを取得するといった感じです。


このサイトを作ろう思った経緯

このサイトを作ろうと思った経緯ですが正直今いろんな情報があふれていてそれを集めるには自分でググっていかなきゃいけないと思います。

その手間を省くために例えばニュースであればいろんなニュースサイトの最新記事の情報を集めてそのサイトへのリンクを張ることでグーグルで調べる手間が省けるだろうし世の中で起きていることがわかりやすくなると思ったからです。


こんな感じのサイト

サイト名はLaNLibです。

latest2.png

基本的に10分ごとにいろんなサイトを巡回して更新されていたら情報を取得しています。

また日本語だけでなく英語の記事も集めていて最終的には世界的な動向を確認できるようにもなればなと思っています。


サイトを作るうえで工夫したこと

サイトを作るうえで工夫したことはwheneverの設定です。

とりあえずコードをどうぞ…


schedule.rb

set :environment, "development"

set :output, { :error => "log/cron_error.log" }
set :path, "/mnt/c/users/owner/desktop/appname"

Dir.chdir('/mnt/c/users/owner/desktop/appname/lib/tasks')
Directories = Dir.glob("*")
methods = []
Directories.each do |drc|
File.open("#{drc}") {|f|
data = f.read
@classname = data.to_s.match(/Tasks::(.+?)\r/)[1]
datas = data.scan(/def self\.(.+?)\r/)
datas.flatten!
datas = datas.map {|d| [@classname.chomp,d.chomp]}
methods << datas
}
end

methods.flatten!(1)

every 10.minutes do
methods.each do |method|
eval "runner 'Tasks::#{method[0]}.#{method[1]}'"
end
end


これ何をしているのかというとlib/tasksの中にスクレイピングをするメソッドを定義していてるのですがそれをwhenever --update-crontabをするときにファイルの中身を読み込んでクラス名とメソッドを取得して自動的に反映されるようにしています。

なぜこんなことをしたかというと既に50個近くのスクレイピングのタスクがありそれをひとつずつ

runner Tasks::CrawlData.method

みたいにするのは気が遠くなるからです。

これによって自動的に反映されるため楽ですしスペルミスもないです。


evalは便利

今回アプリを作っていく中でevalがとても便利であることがわかりました。

メタプログラミングに関してはまだよくわかっていないですがこれからもっと勉強して書けるコードの幅を増やしていきたいなと思います。


おわりに

今日はクリスマスですね。

世の中は友達をワイワイしている中で自分は家でひとりプログラミングで遊んでいました。

ですが不思議と悪くないというかプログラミングで楽しく過ごせたクリスマスでした。

おわり:snowman2: