• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析
 

最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析

on

  • 1,682 views

最近つくったrecent_zombies

最近つくったrecent_zombies
Perlで始めるTwitterタイムライン分析

Statistics

Views

Total Views
1,682
Views on SlideShare
1,681
Embed Views
1

Actions

Likes
2
Downloads
1
Comments
0

1 Embed 1

https://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析 最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析 Presentation Transcript

    • 最近つくった recent_zombies Perlで始めるTwitterタイムライン分析 2013-02-01 Xtone Ltd. ピザ会 Aki / @nekoruri
    • 夜中に地震が起きる
    • とりあえずTwitterに 書き込む
    • _人人人人人人人人人_> 人がいっぱい! <  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
    • 可視化市民、幸福は義務です
    • recent_zombies• 自分のTLで直近N分に発言した人を数える – 要するに「今TLに居る人」の数 – Twitter API: User Streams で漏らさず取得 https://dev.twitter.com/docs/streaming-apis/streams/user – 可視化というぐらいでグラフ表示 – だいたい2時間ぐらいで作った – とりあえず、直近5分と直近30分で運用 – githubで公開 https://github.com/nekoruri/recent_zombies
    • 出力例直近5分直近30分
    • 出力例直近5分 地震で跳ね上がったけど Twitterごと落ちた\(^o^)/直近30分
    • つくりかた• Perl製83行• 偉大なるCPANライブラリ – AnyEvent::Twitter::Stream – Net::GrowthForecast• 割り切った仕様 – アクセストークンは自分で取得 – 既に建ってるGrowthForecastを利用
    • イベント駆動• AnyEvent::Twitter::Stream – TwitterのUser Streamsを追いかける – 1件ごとにコールバックが呼ばれる – ツイートの発言日とuser.idを記録• AnyEvent->timer – 1分毎にコールバックが呼ばれる – 直近60秒、300秒のuser.idの数を数える – GrowthForecastに投げる Net::GrowthForecast++
    • 実際のソースコード#!/home/masa/perl5/perlbrew/perls/perl-5.16.1/bin/perluse strict;use warnings;use AnyEvent::Twitter::Stream;use Net::GrowthForecast;use Time::Piece;use List::MoreUtils qw(uniq);use Data::Dumper;require config.pl;our ($consumer_key, $consumer_secret, $token, $token_secret);my $gf = Net::GrowthForecast->new(host => localhost, port => 5125);
    • while(1) { my $done = AnyEvent->condvar; my $streamer = AnyEvent::Twitter::Stream->new( consumer_key => $consumer_key, consumer_secret => $consumer_secret, token => $token, Twitterに接続 token_secret => $token_secret, method => userstream, timeout => 45, on_tweet => sub { my $tweet = shift; tweetが来たら save_tweet($tweet); }, save_tweetを呼ぶ on_error => sub { my $error = shift; warn "ERROR: $error"; $done->send; }, エラーやStreamsが切れたら on_eof => sub { 次のループで再接続 $done->send; }, ); my $timer; $timer = AnyEvent->timer( after => 0, 60秒ごとに interval => 60, cb => sub { update_gfを呼ぶ update_gf(); }, ); $done->recv; イベント待ち開始}
    • my %tweets;sub save_tweet{ my $tweet = shift; return unless $tweet->{text}; 時刻をunixtimeに my $ts = Time::Piece->strptime($tweet->{created_at}, "%a %b %d %H:%M:%S %z %Y"); $tweets{$ts->epoch}{$tweet->{user}{id}}++;}sub update_gf 1秒毎にuser_idを保存{ my $now = localtime->epoch; my $delete_period = 300; # 古いキーを削除 foreach my $old_key (grep { $_ < $now - $delete_period } keys(%tweets)) { delete $tweets{$old_key}; } 古すぎるデータは削除 #last60 my @last60_users = uniq( map { keys $tweets{$_} } grep { $now - 60 <= $_ } (keys %tweets)); $gf->post( twitter, recent_zombies, last60, scalar @last60_users); #last300 my @last300_users = uniq( map { keys $tweets{$_} } grep { $now - 300 <= $_ } (keys %tweets)); $gf->post( twitter, recent_zombies, last300, scalar @last300_users);} user_idをuniqして数えて GrowthForecastに投げる
    • 幸せなUser Streams生活を!
    • おわり