まず全員Ruby2.0.0をインストールさせつつ、俺がRubyの色々なことを紹介したり、ライブコーディングした。
今日の資料です
Rubyそこそこ使ったことある人と全く使ったこと無い人が半々だった。
使ったことある人は前半がためになったとのこと。
ない人は後半のArrayやHashにsortやuniqやreverseなどをチェーンしていったり、mixやmaxやfindなど痒い所に手がとどくの良かったようだ。
スライドを前日からtwitterで公開していたら、@shigeyas先生からgem紹介にpryとawesome_printがあったほうがいいのでは、というツッコミがあって追加した。
「gemの使い方を調べる」のところでpryとawesome_printを使って色々調べるのも追加した。
教育体験 のせいで1時間以上のスライドでも3時間ぐらいあれば作れるようになってしまった。
実演
最後にぶっこ抜き実演をやった。ぶっこぬきはクロール・HTML解析・DBに貯めて・通知するという総合芸術で、しかも日常的に使うから不満もすぐたまって改良欲求が高くなる。
自分で愛用できるツールを作って運用メンテしていくことがプログラミング学習の早道だと思うので、ぶっこ抜きをテーマにした。
教えていた人の中にデータマイニングが好きな奴がいたので、
アニメスタッフデータベース というすごいwikiから制作スタッフが名をたくさん取ってくるクローラを書いた。お腹がすいたので完成せず終了して麺の月に行った。
役職名と名前が取得できるところまでは作った。あとは協調フィルタリングとかで便利なレコメンドwebサービス作れると思う。
ソース
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'httparty'
require 'nokogiri'
require 'kconv'
require 'awesome_print'
class AnimeWiki
def self.staffs(url)
doc = Nokogiri::HTML.parse HTTParty.get(url).response.body.toutf8
staffs = Hash.new{|h,k| h[k] = Array.new }
doc.xpath("//div[@class='main']").last.text.split(/[\r\n]/).each do |line|
next unless line =~ /^.+[::].+$/
role, names = line.split(/[::]/)
role.gsub!(/[\s ]+/,'')
names.split(/[、 ]/).reject{|i| i.empty? }.each do |name|
staffs[role].push name
end
end
return staffs
end
def self.pages
doc = Nokogiri::HTML.parse HTTParty.get("http://wiki.livedoor.jp/radioi_34/l/?order=name&on_desc=1").response.body.toutf8
pages = []
doc.xpath("//div[@class='main'] //a").each{|a|
next unless a["href"] =~ %r{^/.+}
pages.push(:title => a.text,
:url => "http://wiki.livedoor.jp#{a["href"]}")
}
pages
end
end
if __FILE__ == $0
AnimeWiki.pages.each do |page|
puts page[:title]
puts AnimeWiki.staffs(page[:url])["監督"]
end
end