一日の結構な時間をEmacs上で過ごし、一日Twitterのログを眺めているような気がするので、コマンドライン上で動くTwitterクライアントを探していました。そんな中yanbeさんが作ったクライアントを発見しました。
これはよいと使っていたのですが、チルダとかを含む文字があるとエラーを吐いて止まってしまうという事態になっていました。現在はそれが解消されたと書いてあるのですが、僕の環境(Vine Linux)で新しいコートがなぜか動かないw。で、自分でいじればいいのかと思ったりもしたもののpythonしばらく触ってないから分からないorz。
というわけでPerlで作ることにしました。
そのままだと日本語通らないとかいろいろあったのですが、こっちはperlだったので何とか。元のやつはYAMLとか*1使ってあったりしたんですけど、とりあえずそういう高級そうなのは排除w。
「読み書きをどうやって同時にやればいいんじゃい」とか思って、python側のコードを眺めてみるとrunとか書いてあったので「ああ、スレッドね」と理解。しかし、Javaでもスレッドほとんど知らなくてPerlではやったこともないw。とまあ、そんな状況で書いてみました。とりあえず実現したい環境はできたからいいっちゃいいのか。
#!/usr/bin/perl use strict; use warnings; use Net::Twitter; use threads; use Jcode; my $twitter = Net::Twitter->new( username => "username", password => "password", ); my $thread_read = threads->new(\&friends_timeline); my $thread_write = threads->new(\&update); $thread_read->join; $thread_write->join; sub friends_timeline { my $twitt_id = 0; while(1){ my $res = $twitter->can("friends_timeline")->($twitter); @{$res} = reverse @{$res}; my $counter=0; for(@{$res}) { if($_->{id} > $twitt_id){ print(Jcode::convert($_->{user}{screen_name}, 'euc-jp'),": ",Jcode::convert($_->{text}, 'euc-jp'),"\n"); } $counter++; if($counter == 20){ $twitt_id = $_->{id}; } } sleep(52); } } sub update { while(my $text = <STDIN>){ my $res = $twitter->can("update")->($twitter, Jcode::convert(\$text, 'utf8')); print "Updated:",Jcode::convert(\$text, 'euc-jp'); } }
送り出す側の文字コードと読む側の文字コードをいちいち変更しないといけないのが、ちょっと嫌な感じ。
*1:これって何て読むの?