35
Hamamatsu.rb #30 @jacoyutorius 1388日木曜日

Hamamatsurb#30

Embed Size (px)

Citation preview

Page 1: Hamamatsurb#30

Hamamatsu.rb #30@jacoyutorius

13年8月8日木曜日

Page 2: Hamamatsurb#30

Hamamatsu.rbついに30回ですね

13年8月8日木曜日

Page 3: Hamamatsurb#30

ということで、

今回はキリがいいので

13年8月8日木曜日

Page 4: Hamamatsurb#30

お前らのハマルビへの

出席率を調べてみた

13年8月8日木曜日

Page 5: Hamamatsurb#30

13年8月8日木曜日

Page 6: Hamamatsurb#30

全32回中、28回出席しました

13年8月8日木曜日

Page 7: Hamamatsurb#30

使ったものChart.jsRails4.0rails runnerGemNokogiriHashie::MashATND API

13年8月8日木曜日

Page 8: Hamamatsurb#30

Chart.js

ちょっと前にはてぶ等で話題に

13年8月8日木曜日

Page 9: Hamamatsurb#30

サンプルを触ってみた

使うの簡単

シンプル(オプションも少なめ)

けど、シンプルすぎて使い道なくない?

13年8月8日木曜日

Page 10: Hamamatsurb#30

が!!

13年8月8日木曜日

Page 12: Hamamatsurb#30

なにこれ、カッコいい・・・///

13年8月8日木曜日

Page 13: Hamamatsurb#30

Rails4

特に意味はない

4らしい機能も使ってないですね

rails runnerで定期的にデータ収集

crontabはまだ未設定

13年8月8日木曜日

Page 14: Hamamatsurb#30

rails runner

ちょっとコツが要るみたい

13年8月8日木曜日

Page 15: Hamamatsurb#30

class Cron::EventFeed def self.get_event endend

lib/cron/event_feed.rb

$rails runner Cron::EventFeed.get_event

13年8月8日木曜日

Page 16: Hamamatsurb#30

どういうことなの(´・ω・)?

event_feed.rb => ●

eventfeed.rb => ×

13年8月8日木曜日

Page 17: Hamamatsurb#30

ATND API

“Hamamatsu.rb”をキーワードに検索

ただ、参加者のリストは各イベントページをスクレイピングする必要が

=> Nokogiri

13年8月8日木曜日

Page 18: Hamamatsurb#30

Nokogiri::HTML.parse

parseでHTMLを取得

取得したHTMLはcssセレクタかXPathでタグを検索

13年8月8日木曜日

Page 19: Hamamatsurb#30

Nokogiri::HTML.parse

html = Nokogiri::HTML.parse(open(event_url))path = '//*[@id="members-join"]/ol/li/span/img'

html.xpath(path).each do |member| //参加者のアイコンのURLをとるend

13年8月8日木曜日

Page 20: Hamamatsurb#30

XPathXPathはSelectorGadjetっていうブックマークレットか、

Chromeデベロッパーツールを使うと色々捗る

というか書き方のルールちゃんと知らない

13年8月8日木曜日

Page 21: Hamamatsurb#30

Webページのスクレイピングは楽しい!

13年8月8日木曜日

Page 22: Hamamatsurb#30

あとは取得した参加者をカウントするだけ

ActiveRecordでの集計はまだ慣れない

SQL一発で済ませたい気持ちでいっぱいに

13年8月8日木曜日

Page 23: Hamamatsurb#30

@summary = Participant.group("name").order("name").count

@images = {}Participant.select("name, image").uniq("name").each do |row| @images[row.name] = row.imageend

controllers/SummaryController

13年8月8日木曜日

Page 24: Hamamatsurb#30

=> {“yuto”=>”28”, ...}

=> {"yuto"=>"http://a0.twimg.com/profile_images/1557771225/facebook.jpg", ...}

controllers/SummaryController同じKeyを持った2つのHashを作る

{名前 => 参加回数} , {名前 => アイコン}

13年8月8日木曜日

Page 25: Hamamatsurb#30

controllers/SummaryController

@summary.each_pair do |name,count|

name => “yuto”

count => 28

@images[name] => “http:// ...”

end

片方のハッシュのキーでもう片方にアクセス

13年8月8日木曜日

Page 26: Hamamatsurb#30

あんまイケてない気もする

ActiveRecordで一発でとれるんだろうか・・・

controllers/SummaryController

13年8月8日木曜日

Page 27: Hamamatsurb#30

Hashを合成できる

ブロックでValueの判定方法を渡す

h1 => {:a => “hoge”}

h2 => {:a => “foo”}

h1.merge(h2){¦k,v1,v2¦ v1 + v2}

=> {:a => “hogefoo”}

Hash#merge

13年8月8日木曜日

Page 28: Hamamatsurb#30

@summary = Participant.group("name").order("name").count images = {}Participant.select("name, image").uniq("name").each do |row| images[row.name] = row.imageend

@summary.merge!(images){|key, v1, v2| {:count => v1, :image => v2} }

Hash#merge

13年8月8日木曜日

Page 29: Hamamatsurb#30

@summary.each_pair do |name,data|

name => “yuto”

data[:attend_count] => 28

data[:image] => “http://...”

end

片方のハッシュのキーでもう片方にアクセス

Hash#merge

13年8月8日木曜日

Page 31: Hamamatsurb#30

ハッシュの要素に対しメソッドへアクセスするがごとく、アクセスできる

Hashie::Mash

require “hashie”

h = Hashie::Mash.new({:key =>“value”})

h.key = “value”

13年8月8日木曜日

Page 32: Hamamatsurb#30

読み方わからん。

Hashie::Mash

13年8月8日木曜日

Page 33: Hamamatsurb#30

Hashie::Mash

@summary.each_pair do |name,data|

name => “yuto”

data[:attend_count] => 28

data[:image] => “http://...”

end13年8月8日木曜日

Page 34: Hamamatsurb#30

Hashie::Mash

@summary.each_pair do |name,data|

name => “yuto”

data.attend_count => 28

data.image => “http://...”

end13年8月8日木曜日

Page 35: Hamamatsurb#30

感想

わざわざCronで実行する必要なさげ

今回はどこにもデプロイしてませんが、バックエンドからフロントまで一通りできるようになりたい

13年8月8日木曜日