Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

初めに

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

アドベントカレンダーの最終日なので最近作っていたサイトを公開してみました。
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:

sibakenY
大学卒業後Ruby, Ruby on Railsを勉強しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away