真・ドルヲタを支える技術
TRANSCRIPT
真・ドルヲタを支える技術@nipotan
アツい夏、TIF の夏
• TOKYO IDOL FESTIVAL
• http://www.idolfes.com/
• TOKYO IDOL FESTIVAL(トウキョウ・アイドル・フェスティバル)は、2010年より開催されている日本のアイドルイベントである。略称はTIF(ティフ)。女性アイドルグループを中心に50組以上の女性アイドルが参加する。参加アイドルの数では日本最大規模のアイドルイベントである。 (出典: Wikipedia)
TIF 2012
• 8/4, 8/5 の二日間
• 10 ステージ、111 組 732 名のアイドル(土曜は 9 ステージ)
• 2012 年の目玉は SKE48
お気に入り
• お気に入りのアイドルを見たい!
• タイムテーブルを見よう
• http://www.idolfes.com/2012/timetable/
WTF
• 画像かよ!!
否
• iPhone, Androidで見ると
• http://www.idolfes.com/2012/sp/
タイムテーブル
• もっと検索しやすく
• やっぱ iCal
iCal 系 CPAN モジュール
• http://search.cpan.org/search?query=ical&mode=all
iCal 形式
• テキストベースだから何となくわかるね
• 適当なイベントを作って、iCal で export
してみよう
形式• iCal の形式
BEGIN:VCALENDARMETHOD:PUBLISHVERSION:2.0X-WR-TIMEZONE:Asia/TokyoX-WR-CALNAME:カレンダー名X-WR-CALDESC:説明 (イベントデータ)END:VCALENDAR
形式• イベント
BEGIN:VEVENT : :END:VEVENT
形式• イベントの見てもよくわからんデータ
UID:ランダム文字列SEQUENCE:0STATUS:CONFIRMEDTRANSP:OPAQUE
形式• イベントの見りゃわかるデータ
DTSTART:開始日時 (%Y%m%dT%H%M%SZ)DTEND:終了日時 (%Y%m%dT%H%M%SZ)SUMMARY:イベントのタイトルLOCATION:場所DESCRIPTION:説明
Let’s Scrapeuse strict;use warnings;use Web::Scraper;
my $tif = scraper { process 'section', 'event[]' => scraper { process 'time', 'time' => 'TEXT'; process 'div > h4', 'title' => 'TEXT'; process 'div > p', 'performer' => [ 'HTML', sub { s{\<br\s*\/>\s*}{\n}g }, ]; };};
URL
• $date は 0804 か 0805
• $stage は hot とか green とか doll とかmy $url = "http://www.idolfes.com/2012/sp/time${date}_${stage}.html";
ステージ名• ちゃんと正式名称がある
• 場所に使えるmy %stages = ( hot => 'HOT STAGE', green => 'GREEN OASYS', doll => 'DOLL FACTORY', fantastic => 'FANTASTIC THEATER', wonder => 'WONDER FUTURE PLANET', smile => 'SMILE GARDEN', sky => 'SKY STAGE', secret => 'SECRET COURT', fresh => 'FRESH FIELD', welcome => 'WELCOME MARQUEE', greeting => 'GREETING SQUARE',);
greeting
• 自由すぎる
• http://www.idolfes.com/2012/sp/time0804_greeting.html
ステージ名• greeting はパス…
my %stages = ( hot => 'HOT STAGE', green => 'GREEN OASYS', doll => 'DOLL FACTORY', fantastic => 'FANTASTIC THEATER', wonder => 'WONDER FUTURE PLANET', smile => 'SMILE GARDEN', sky => 'SKY STAGE', secret => 'SECRET COURT', fresh => 'FRESH FIELD', welcome => 'WELCOME MARQUEE',# greeting => 'GREETING SQUARE',);
開始時刻と終了時刻• そもそも iCal の日時は UTC
• DateTime でちゃんと取り扱おう
開始時刻と終了時刻• 時刻の形式
• HH:MM~HH:MMmy($from_time, $to_time) = split /\x{ff5e}/, $event->{time};
開始時刻と終了時刻• 罠その 1
• 8/4 の HOT STAGE
• http://www.idolfes.com/2012/sp/time0804_hot.html
開始時刻と終了時刻• 罠その 2
• 8/4 の FANTASTIC THEATER ほか
• http://www.idolfes.com/2012/sp/time0804_fantastic.html
% perl -MDateTime -e'DateTime->new(hour => 24)'The 'hour' parameter ("24") to DateTime::new did not pass the 'an integer between 0 and 23' callback
開始時刻と終了時刻• 罠その 3
• 8/4 WELCOME MARQUEE 9:45~10:00
• http://www.idolfes.com/2012/sp/time0804_welcome.html
• 通常 vs ここだけ
開始時刻と終了時刻• 時刻の形式
• HH:MM~HH:MMmy($from_time, $to_time) = split /[\x{ff5e}\x{301c}]/, $event->{time};
出演ユニット• イベントタイトルと出演者が別の場合
• performer に
iCal のデータ形式• 75 文字で改行させないといけない
• 続く次の行は空白かタブではじまる
• \ は \\ に
• 改行は \n に
• , は \, に
iCal で安全な形式sub ical_safe { my $str = shift; $str =~ s/\\/\\\\/g; $str =~ s/\n/\\n/g; $str =~ s/,/\\,/g; my @rounded = (); while ($str =~ s/^(.{1,75})//) { push @rounded, $1; } return join("\n ", @rounded);}
最終的に
• https://gist.github.com/3282049
取り込んだ例
• DEMO
まとめ• User-Agent を iPhone は意外に盲点
• Web::Scraper やっぱり便利
• 何事も CPAN に頼らない
• アイドル別のほうが高まれる
• http://www.amazon.co.jp/dp/B008OI71MK
糸冬了
• QUESTIONS?