Your SlideShare is downloading. ×
  • Like
最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

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

  • 1,286 views
Published

最近つくったrecent_zombies …

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

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,286
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
1
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 最近つくった recent_zombies Perlで始めるTwitterタイムライン分析 2013-02-01 Xtone Ltd. ピザ会 Aki / @nekoruri
  • 2. 夜中に地震が起きる
  • 3. とりあえずTwitterに 書き込む
  • 4. _人人人人人人人人人_> 人がいっぱい! <  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
  • 5. 可視化市民、幸福は義務です
  • 6. 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
  • 7. 出力例直近5分直近30分
  • 8. 出力例直近5分 地震で跳ね上がったけど Twitterごと落ちた\(^o^)/直近30分
  • 9. つくりかた• Perl製83行• 偉大なるCPANライブラリ – AnyEvent::Twitter::Stream – Net::GrowthForecast• 割り切った仕様 – アクセストークンは自分で取得 – 既に建ってるGrowthForecastを利用
  • 10. イベント駆動• AnyEvent::Twitter::Stream – TwitterのUser Streamsを追いかける – 1件ごとにコールバックが呼ばれる – ツイートの発言日とuser.idを記録• AnyEvent->timer – 1分毎にコールバックが呼ばれる – 直近60秒、300秒のuser.idの数を数える – GrowthForecastに投げる Net::GrowthForecast++
  • 11. 実際のソースコード#!/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);
  • 12. 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; イベント待ち開始}
  • 13. 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に投げる
  • 14. 幸せなUser Streams生活を!
  • 15. おわり