2012/07/26


キモトの関係で自分が発言したときに通知が欲しいですね


https://twitter.com/bulkneets/statuses/222928161023868929
作りましょう!
#!perl
use strict;
use warnings;
use utf8;
use Config::Pit;
use AnyEvent::Twitter::Stream;
use Growl::Any;
use YAML::Syck;

my $icon = 'https://api.twitter.com/1/users/profile_image?screen_name=bulkneets';
my $growl = Growl::Any->new(appname => "キモトwatcher"events => ["ヤバイ"]);

my $done = AnyEvent->condvar;

my $config = pit_get("api.twitter.com"require => {
    consumer_key        => 'consumer key on twitter',
    consumer_secret     => 'consumer secret on twitter',
    access_token        => 'access token on twitter',
    access_token_secret => 'access token secret on twitter',
});

binmode STDOUT":utf8";

my $streamer = AnyEvent::Twitter::Stream->new(
    consumer_key    => $config->{consumer_key},
    consumer_secret => $config->{consumer_secret},
    token           => $config->{access_token},
    token_secret    => $config->{access_token_secret},
    method          => 'filter',
    follow          => '3523861',
    on_tweet        => sub {
        my $tweet = shift;
        #warn Dump $tweet;
        #warn $tweet->{source};
        if ($tweet->{source} =~ 'キモト') {
            my $text = $tweet->{text};
            $growl->notify("ヤバイ""キモト"$text$icon);
            warn $text;
        }
    },
    on_error => sub {
        my $error = shift;
        warn "ERROR: $error";
        $done->send;
    },
    on_eof => sub {
        $done->send;
    },
);

$done->recv;
Windows の Growl For Windows でも動作します。
AnyEvent::Twitter::Stream の follow にスクリーンネームを渡していて少しハマったのは内緒。
token をどうやって取得するかは、プログラマなら知ってるはずなので頑張って下さい。
キモトwatcher
イベントで魚拓を取るも良し、メールするも良し、お役立て下さい。
Posted at by



2012/05/30


ソーシャル化したbit.lyの恥ずかしいリンクの消し方 - ぼくはまちちゃん!(Hatena)

こんな記事がありました! Big Sky :: bit.ly がソーシャルに生まれ変わって、皆とっても恥かしい事になる...

http://d.hatena.ne.jp/Hamachiya2/20120530/bitly
既に800件以上あるのでやってられなかったの巻。
今年もYAPC::Asiaは盛り上がりそうですね。僕行った事無いけど...
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
use Config::Pit;
use JSON;

my $config = pit_get('bit.ly'require => {
    username => 'username on bit.ly',
    password => 'password on bit.ly',
});

my $req = HTTP::Request->new(
    POST => 'https://api-ssl.bitly.com/oauth/access_token');

$req->authorization_basic(
    $config->{username},
    $config->{password},
);

my $ua = LWP::UserAgent->new;
$ua->env_proxy;

my $res = $ua->request($req);
my $access_token = $res->decoded_content;

my $offset = 0;

my $base_url = "https://api-ssl.bitly.com";
my $url = "$base_url/v3/user/link_history?access_token=$access_token&limit=100";
while (1) {
    my $history = from_json $ua->get("$url&offset=$offset")->decoded_content;
    my @items = @{$history->{data}->{link_history}};
    last unless scalar @items;
    for my $item (@items) {
        unless ($item->{private}) {
            my $link = $item->{long_url};
            print "$link\n";
            #$res = $ua->get(
            #    "$base_url/v3/user/link_edit"
            #    ."?access_token=$access_token&link=$link&edit=private"
            #    ."&private=true");
        }
    }
    $offset += 100;
}
コメント外したらprivateになる予感。
試したこと無いので誰か試して...
あとsleep入れた方がいいと思うよ(最初から入れろコラ)。
Posted at by



2012/05/18


逆FizzBuzz問題 (Inverse FizzBuzz) - 猫とC#について書くmatarilloの雑記

逆FizzBuzz問題 (Inverse FizzBuzz) General | Inverse Fizzbuzz - just another scala quant を日本語にしました。 ちなみに...

http://d.hatena.ne.jp/matarillo/20120515/p1
逆FizzBuzzって、オートマトンなので正規表現を使うと楽に出来るはず。 #!perl
use strict;
use warnings;
use Test::More;

sub inv_fizzbuzz {
  my ($fz$n$pat) = (''1join ',*?'@_);
  while (1) {
    $fz .= $n % 15 > 0 ?
             $n % 3 > 0 ?
               $n % 5 > 0 ?
                 ',''buzz,''fizz,''fizzbuzz,';
    if ($fz =~ /,($pat)/) {
      my $rhs = $1;
      my $lhs = substr($fz0index($fz$rhs) + 1);
      $lhs =~ s/(fizz|buzz)//g;
      $rhs =~ s/(fizz|buzz)//g;
      $lhs = length($lhs);
      $rhs = $lhs + length($rhs||'');
      return [$lhs$rhs];
    }
    $n++;
  }
}

is_deeply(inv_fizzbuzz('fizz'), [33]);
is_deeply(inv_fizzbuzz('buzz'), [55]);
is_deeply(inv_fizzbuzz('fizz''buzz'), [35]);
is_deeply(inv_fizzbuzz('buzz''fizz'), [56]);
is_deeply(inv_fizzbuzz('fizz''fizz''buzz'), [610]);
is_deeply(inv_fizzbuzz('fizz''fizz'), [69]);
is_deeply(inv_fizzbuzz('fizz''buzz''fizz'), [36]);
is_deeply(inv_fizzbuzz('fizzbuzz''fizz'), [1518]);

done_testing;
追記1
Vimだとこうか?
functions:inv_fizzbuzz(...)
  let [fz, np= [''1join(a:000',\{-}')]
  while 1
    let fz .= n%15>0?n%3>0?n%5>0?",""buzz,""fizz,""fizzbuzz,"
    let m = matchstr(fz, p)
    if len(m) > 0
      let lhs = len(split(fz[:stridx(fz, m)-1], ','1))
      return [lhs, lhs + len(split(m, ','1))-1]
    endif
    let n += 1
  endwhile
endfunction

追記2
ちょっと改良。方針は変わってない。
#!perl
use strict;
use warnings;
use Test::More;

my $gs = 'AAFAABAFAAAFABAAFAAAZ';

sub inv_fizzbuzz {
  my ($fz$n$pat) = (''1,
    join('A*?'map({fizz=>'F'buzz=>'B'fizzbuzz=>'Z'}->{$_}, @_)));
  my $m;
  while (1) {
    $fz .= $n % 15 > 0 ?
             $n % 3 > 0 ?
               $n % 5 > 0 ?
                 'A''B''F''Z';
    last if length($fz) > length($gs) * length(@_);
    if ($fz =~ /^.*($pat)$/) {
      my $rhs = $1;
      my $lhs = substr($fz0rindex($fz$rhs) + 1);
      $m = [$lhs$rhsif !defined($m) || length(@{$m}[1]gt length($rhs);
    }
    $n++;
  }
  return [] unless $m;
  
  my ($lhs$rhs) = @{$m};
  $lhs = length($lhs);
  $rhs = $lhs + length($rhs||'') - 1;
  return [$lhs$rhs];
}

is_deeply(inv_fizzbuzz('fizz'), [33]);
is_deeply(inv_fizzbuzz('buzz'), [55]);
is_deeply(inv_fizzbuzz('fizz''buzz'), [910]);
is_deeply(inv_fizzbuzz('buzz''fizz'), [56]);
is_deeply(inv_fizzbuzz('fizz''fizz''buzz'), [610]);
is_deeply(inv_fizzbuzz('fizz''fizz'), [69]);
is_deeply(inv_fizzbuzz('fizz''buzz''fizz'), [36]);
is_deeply(inv_fizzbuzz('fizzbuzz''fizz'), [1518]);
is_deeply(inv_fizzbuzz('fizzbuzz''fizz'), [1518]);
is_deeply(inv_fizzbuzz('buzz''buzz'), []);

done_testing;
vimスクリプト版はkoronさんが書いてた。
koron/zzub-zzif-vim ツキ GitHub
https://github.com/koron/zzub-zzif-vim
Posted at by