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) = ('', 1, join ',*?', @_);
  while (1) {
    $fz .= $n % 15 > 0 ?
             $n % 3 > 0 ?
               $n % 5 > 0 ?
                 ',': 'buzz,': 'fizz,': 'fizzbuzz,';
    if ($fz =~ /,($pat)/) {
      my $rhs = $1;
      my $lhs = substr($fz, 0, index($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'), [3, 3]);
is_deeply(inv_fizzbuzz('buzz'), [5, 5]);
is_deeply(inv_fizzbuzz('fizz', 'buzz'), [3, 5]);
is_deeply(inv_fizzbuzz('buzz', 'fizz'), [5, 6]);
is_deeply(inv_fizzbuzz('fizz', 'fizz', 'buzz'), [6, 10]);
is_deeply(inv_fizzbuzz('fizz', 'fizz'), [6, 9]);
is_deeply(inv_fizzbuzz('fizz', 'buzz', 'fizz'), [3, 6]);
is_deeply(inv_fizzbuzz('fizzbuzz', 'fizz'), [15, 18]);

done_testing;
追記1
Vimだとこうか?
function! s:inv_fizzbuzz(...)
  let [fz, n, p] = ['', 1, join(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($fz, 0, rindex($fz, $rhs) + 1);
      $m = [$lhs, $rhs] if !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'), [3, 3]);
is_deeply(inv_fizzbuzz('buzz'), [5, 5]);
is_deeply(inv_fizzbuzz('fizz', 'buzz'), [9, 10]);
is_deeply(inv_fizzbuzz('buzz', 'fizz'), [5, 6]);
is_deeply(inv_fizzbuzz('fizz', 'fizz', 'buzz'), [6, 10]);
is_deeply(inv_fizzbuzz('fizz', 'fizz'), [6, 9]);
is_deeply(inv_fizzbuzz('fizz', 'buzz', 'fizz'), [3, 6]);
is_deeply(inv_fizzbuzz('fizzbuzz', 'fizz'), [15, 18]);
is_deeply(inv_fizzbuzz('fizzbuzz', 'fizz'), [15, 18]);
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