ずいぶん前にOppai-Detectの精度向上っぷりをtwitterで見せてもらって、やべー使いてーなどと思っていたんですが、いつの間にか公開されてたので、クライアント側でプロキシ動作するフィルタを書いてみました。おっぱい見れません><
全く何言ってんのかわかりませんがたまに'きほーんーてーきー'とか'そウCてーもぅUだーCta-'とか言い出して吹きます。
ソースは以下。
最近Perl書いてない上に眠れないのでやってみた。
while(<>){s/[^a-z]//g,print if($a=$a?1:/^O/)}$ perl hoge.pl mgen.gbk | wc
0 1 580074
$ head -1 mgen.gbk
LOCUS NC_000908 580074 bp DNA circular BCT 15-OCT-2004
$
今日の夕飯は彼女と地元で。テーブルに案内されるとテーブルクロスの代わりに紙がしいてあり、何故か置いてあったクレヨンを掴んだウェイトレスが「本日このテーブルを担当させて頂きます○○と申します」などと言って自分の名前をテーブルに書くのだ。これはなかなかインパクトが強くておお、と思った。
しかし紙とクレヨンがあると、人間何か描いてしまうものである。あんぱんまんやらオバQやらを二人で落書きするのに飽きると、そこはやっぱりコードを書く事に。彼女曰く「1..100のフィボナッチ数列をプリントするコードを書け」
hyukiさんとotsuneさんあたりの間で話題に上っていたので触ってみた。Perlソースコード整形ツール。
OS Xにインストールするには、officialのsourceforgeからUnix向けパッケージを持って来て
$ perl Makefile.PL && make && sudo make install
$ perltidy hoge.pl -o tidy.pl
$str = do $ARGV[0];for(0..$ARGV[1]){
my $line = &MakeASentence($str);
print $line;
print "\n" if($line =~ /¥.$/);
}sub MakeASentence{
my $str=shift;
my @hash_array = @{$str->{hash}};
my $data = $str->{data};
my $sentence_seed = $hash_array[int rand($#hash_array)];
# print $sentence_seed , "\n";my @sentence = split /_/, $sentence_seed;
my $ret_sentence = undef;
for my $hinshi (@sentence){
my $seed = rand();
my $ratesum = 0;
for my $a (keys %{$data->{$hinshi}}){
$ratesum += $data->{$hinshi}->{$a}->{rate};
if($ratesum > $seed){
$ret_sentence .= $a;
last;
}
}
}
return $ret_sentence;
}
$str = do $ARGV[0];for ( 0 .. $ARGV[1] ) {
my $line = &MakeASentence($str);
print $line;
print "\n" if ( $line =~ /¥.$/ );
}sub MakeASentence {
my $str = shift;
my @hash_array = @{ $str->{hash} };
my $data = $str->{data};
my $sentence_seed = $hash_array[ int rand($#hash_array) ];# print $sentence_seed , "\n";
my @sentence = split /_/, $sentence_seed;
my $ret_sentence = undef;
for my $hinshi (@sentence) {
my $seed = rand();
my $ratesum = 0;
for my $a ( keys %{ $data->{$hinshi} } ) {
$ratesum += $data->{$hinshi}->{$a}->{rate};
if ( $ratesum > $seed ) {
$ret_sentence .= $a;
last;
}
}
}
return $ret_sentence;
}
母親に以前脳トレとDSを買い与えたのだが、すっかりはまったのか、自分で大量にソフトを購入するようになった。その中に"レイトン教授と不思議な町"と言うものがある。一見逆転裁判のような推理系のようだが、推理を要する部分など全く無く、全面、これパズルとなぞなぞである。
で、今日。
もの凄く暇だった僕は手に取って始めてしまった訳だ、レイトン教授を。んでホイホイと今5時間で80程謎を解いた所なのだけれど、もうさっきから20分ぐらいある問題で詰まっている。曰く「16リットル、9リットル、7リットルの瓶があり、16リットルの瓶にはいっぱいに水が入っている。これを16リットルと9リットルの瓶に8リットルずつに分けて欲しい」と言った内容だ。
残念ながら僕はこの手の問題がもの凄く苦手である。はっきり言って諦めた。
諦めたので力技で解いてやろうと思っていそいそとPowerBookを取り出した。
my $a = {
0 => {
max => 16,
now => 16
},
1 => {
max => 9,
now => 0
},
2 => {
max => 7,
now => 0
}
};
my $i = 1;
while($a->{0}->{now} != 8 or $a->{1}->{now} != 8 ){
my $x = int rand 3;
my $y = int rand 3;
while($a->{$x}->{now} == 0){
$x = int rand 3;
}
while($y == $x or $a->{$y}->{now} == $a->{$y}->{max}){
$y = int rand 3;
}
my $move = ($a->{$y}->{max} - $a->{$y}->{now} > $a->{$x}->{now}) ?
$a->{$x}->{now} :
$a->{$y}->{max} - $a->{$y}->{now};
$a->{$x}->{now} -= $move;
$a->{$y}->{now} += $move;
print $i++, " : $a->{$x}->{max} => $a->{$y}->{max}\n";
}
...全然答えが返って来ない。
Web::Scraper
スクレイピングとかしょっちゅうやってる気がするけど最近なかなかネタがなかったので使わず仕舞いだった。
今日ちょっと思いついた事があったので使ってみるよ。
#!/usr/bin/perl
use strict;
use URI;
use Web::Scraper;
use Data::Dumper;my $articles = &GetArticles(shift);
print Dumper($articles);sub GetArticles(){
my $url = shift;
my $asahi_list = scraper {
process 'ul.list>li',
'articles[]' => scraper{
process 'li>a', url => '@href';
};
result 'articles';
}->scrape(URI->new($url));
my @articles = ();
map{ push @articles, &GetArticle($_) } @{$asahi_list};
return \@articles;
}
sub GetArticle(){
my $str = shift;
my $url = 'http://www.asahi.com'.$str->{url};
my $title = $str->{title};
my $asahi_article = scraper {
process 'h1#cap', title => 'TEXT';
process 'p#date', date => 'TEXT';
process 'div.kiji', content => 'TEXT';
result qw/title date content/
}->scrape(URI->new($url));$asahi_article->{url} = $url;
return $asahi_article;
}
perl hoge.pl http://www.asahi.com/national/list.html > hoge.txt
これまじですごく使い易い。覚えておくべき。
# 朝日の記事は後々何かに使う。
先日サービスにアクセス解析を付けることになり、リファラの集合を束ねて欲しいと言われた。つまり、あらゆるURLから同じblogのものであるとか、同じニュースサイトであるとかをグルーピングして欲しいと言う事だ。これって結構ややこしい。
イメージ的には
http://polog.org/0.php
http://polog.org/1.php
http://polog.org/2.php
http://polog.org/index.php
http://polog.org/archives/cat1/
http://polog.org/archives/2007/02/
てな訳で僕のアイデアとしては、まっとうなblogサービスならrel="alternate"でrss付いてる筈なので、その中身をパースしてルートディレクトリをチェックすれば良い。authorも分かるしアクセス解析を閲覧するユーザには分かり易い。そして以降同じrssのurlを見ているページはまとめてしまえば良い。
などと言ったんだけどもう面倒くさいから第一階層(http://hoge.com/hoge/)でまとめようと言う話になってしまった。そんな。
前置きが長くなったけど以上のアイデアを実行するPerlコードを書いた。
use LWP::Simple;
use strict;
my $url = $ARGV[0];
$url =~ m%(http://[^/]+)(/.*/)?%;
my $domain = $1;
my $base = $1.$2;
my $html = get($url);
if($html =~ m%<link rel="alternate".+?type="application/(?:atom|rss)¥+xml".+?href="(.+?)".*?>%){
my $rss_url = $1;
$rss_url = ($rss_url =~ m%^http:%) ? $rss_url :
($rss_url =~ m%^/%) ? $domain. $rss_url :
$base.$rss_url;
my $rss = get($rss_url);
my $author = ($rss =~ m%<dc:creator>(.+?)</dc:creator>%) ? $1 :
($rss =~ m%<author>[^<]*?<name>(.+?)</name>[^<]*?</author>%) ? $1 :
'';
my $home = ($rss =~ m%<link>(.+?)</link>%) ? $1 :
($rss =~ m%<link rel="alternate".+?type="text/html".+?href="(.+?)".*?>%) ? $1 :
'';
my $title = ($rss =~ m%<title>(.+?)</title>%) ? $1 : '';print "$title, $author, $home¥n";
}
% perl hoge.pl http://blog.goo.ne.jp/hachitori/e/6cef002082f319664aa186b391a8dd51
sablog 18, hachitori, http://blog.goo.ne.jp/hachitori
風邪で朦朧としているので乱文失礼。
(追記)
title足した。
きょうじん君作ったよー。
pologの狂人日記を形態素でばらしてマルコフにし、そこから自動で短文を再構築してtwitterに投稿するbotを書きました。
記念すべき初の発言:
「イイ?と言うのです。」
きょうじんくんかわいい!
(追記)
昨日眠かったので適当すぎるw もうちょい詳しく書きます。
狂人日記から本文を抜き出した後、Mecabで形態素解析して、さらに文脈をテーブルで表現するために確率付きマルコフモデルに落とします。この場合各状態は単語になって、ある単語の次にどの単語が来るかが全て確率付きの状態遷移で表現できる。で、さらに文を開始する単語のセットを持つ。
以上で準備は終わり。Data::Dumperでダンプしておく。
あとは最初の単語群からから始まって句点で終わるようにマルコフを辿るコードを書いて、帰ってきたやつをNet::Twitterでupdateさせて終わり。
そんで30分に一度cronさせてましたが、意外とuzいので1時間に1回にします。
AM2:00からAM7:00ぐらいは寝かしといたほうが良いかな?
と言う訳で可視化したよ!
negipoから2stepsまでのfriendsをeXpandaで可視化しました。ラベルの大きさはノードの次数になってます。amachangとHamachiya2でかすぎワロタ。
これまでのみちのり
Twitterを可視化するアプリ作ろう!
↓
Net::Twitter書き換えた。ぼくてんさい!
↓
Twitter API結構遅いやん。。でもめげずに実装!
↓
eXpandaめちゃんこ遅いやん。。
↓
アプリ諦め
↓
Cytoscapeで座標だけ取ってeXpandaに突っ込む。
↓
もう凝った可視化する気力neee..←いまここ
(追記)
そういや考察してなかった。
座標計算のCircularアルゴリズムは連結度の高いノードを近くに配置するので、Hamachiya2とamachangを同時にAddしているユーザは非常に多い。miyagawaとdankogaiも同様である。これはamachang達が主にネット関連の言語ギークで、miyagawaとdankogaiがPerl mongerであることに起因するのではないか。中央の円上に配置されているユーザは上記4人のいずれかのうち2人以上のfriendsなので、僕と同様ネットで遊びまくってるnerdsな可能性が高い。
そんじゃ泳ぎに行って来ます。
暇だったらからtwitterの可視化でもしようと思ってid/screen_nameからfriendsとfollowers取得出来るようにNet::Twitter書き換えた
56,57c56,58
< my ( $self ) = @_;
< my $req = $self->{ua}->post($self->{apiurl} . "/followers.json");
---
> my ( $self , $id ) = @_;
> my $p = ( defined $id ) ? "?id=$id" : "";
> my $req = $self->{ua}->post($self->{apiurl} . "/followers.json" . $p);
63,64c64,66
< my ( $self ) = @_;
< my $req = $self->{ua}->post($self->{apiurl} . "/friends.json");
---
> my ( $self, $id ) = @_;
> my $p = ( defined $id ) ? "?id=$id" : "";
> my $req = $self->{ua}->post($self->{apiurl} . "/friends.json" . $p);
(追記)
ごめん仕様書ちゃんと読んでなかった。
本家API仕様書
Parameters:
id. Optional. The ID or screen name of the user for whom to request a list of friends. Ex: http://twitter.com/statuses/friends/12345.json or http://twitter.com/statuses/friends/bob.rss
と言う訳で最終的なパッチはこれ。
63,64c63,65
< my ( $self ) = @_;
< my $req = $self->{ua}->post($self->{apiurl} . "/friends.json");
---
> my ( $self, $id ) = @_;
> my $path = ( defined $id ) ? "/friends/$id.json" : "/friends.json";
> my $req = $self->{ua}->post($self->{apiurl} . $path);
(さらに追記)
show(あるユーザのステータス取得)してくれるモジュール無かったんで書き足したよ。
sub show {
my ( $self, $id ) = @_;
return if not defined $id;
my $req = $self->{ua}->post("http://twitter.com/users/show/$id.json");
return ($req->is_success) ? JSON::Any->jsonToObj($req->content) : undef;}
ブックマークしなかったのでどこだか失念したけれど、「飛行機の移動時間は割と長大な講演を聞くのに良い」と書いている人がいたので、そういやYAPCの動画すげー勢いでアップされてたし電車の中とかで見たら勉強になるんじゃね、と思って全部download->iPod用に変換するスクリプトを書いてみた。
OS X前提。
前もってMiMMS(ストリーミングビデオダウンローダ)とffmpeg(エンコーダ)をインストールする必要がある。
んで
#!/usr/bin/perluse strict;
use LWP::Simple;my $url_base = 'http://www.i-revo.jp/yapcasia/archive/';
for my $num (1..43){
my $html_num = sprintf "%02d", $num;
my $html_content = get($url_base . $html_num . '.html');
my @wvx = $html_content =‾ m%param name="filename" value="(http://.+?.wvx)"%;
next if ($wvx[0] eq '');
my $wvx_content = get($wvx[0]);
my @wmv = $wvx_content =‾ m%ref href = "(mms://.+?.wmv)"%;
`mimms -o YAPC-$html_num.wmv $wmv[0]`;
`ffmpeg -y -i "YAPC-$html_num.wmv" -title "YAPC-$html_num" -bitexact -vcodec mpeg4 -s 320x240 -r 29.97 -b 768 -acodec aac -ac 2 -ar 48000 -ab 64 -f ipod "YAPC-$html_num.MP4"`
}
(追記)
iSquintの最新バージョンならwmv3通るらしいからもうそれでいいやー。今晩はダウンロードしっぱなしで寝ようっと。
(さらに追記)
"つhttp://tokyo2007.yapcasia.org/sessions/videocast.xml"って言われた><
google-code-prettyfyを入れてみたのでテスト。
内容はeXpandaのサンプルスクリプト。
#!/usr/bin/perl use warnings; use strict; use eXpanda;
# eXpanda Demo Script No 8
# "Visualizing Social network."my $str = do 'sns_net.str';
bless $str, 'eXpanda';### Analysis ####
$str->Analyze(
-method =>"degree",
);### Initialize graphics ####
$str->Apply(
-object => 'node:graohics:fill',
-value => '#d39800',
);$str->Apply(
-object => 'node:graohics:w',
-value => '15',
);$str->Apply(
-object => 'edge:graohics:stroke',
-value => '#c3d825',
);$str->Apply(
-object => 'edge:graohics:width-stroke',
-value => '#c3d825',
);### Apply Score to Graohics ###
$str->Apply(
-object => 'node:graohics:fill',
-from => 'node:score:degree',
-value => {'#f39800' => '#e2041b'},
);$str->Apply(
-object => 'node:graohics:w',
-from => 'node:score:degree',
-value => {'15' => '40'},
);### Output ###
$str->out("sample08.svg",-no_node_label=>1,);
ページ毎に必要な箇所、情報の形式が違うので毎ページ全部書き直してるんだけど、長年の研鑽のためか(だって5年間パーサ書いてたようなもんだもんな)1ページあたり実装に10分かからないのは良いとして、
<p><a href="/wiki/%E8%96%AC%E5%91%B3" title="薬味">薬味</a> <a href="/wiki/%E8%96%AC%E7%BC%B6" title="薬缶">やかん</a> <a href="/wiki/%E9%A3%B2%E8%8C%B6" title="飲茶">飲茶</a> <a href="/wiki/%E6%9C%89%E6%A9%9F%E8%BE%B2%E7%94%A3%E7%89%A9" title="有機農産物">有機農産物</a></p>
スーパー便利。
cpan
要は正規表現の最適化。
こういうコード生成・最適化的なモジュールは何かにつけ重要だよね。コードを出力するコードを利用。でもRailsとか使ってるとDRYすぎてオレすげー感がうすまるのも事実。
まあ一番重要なのはサービスの中身っすよ。
特にパーマンとひろゆきとかに言いたいんだけどさあ、このエントリーで書かれてるコード、絶対日本語で説明されるより早く理解出来ると思わない?
終わってるかな俺。
WWW::Mechanizeを今まで知らなかったのは悔恨の極みと言わざるを得ない。ブラウザ上で操作を行う場合、フォーム一つとっても大量の情報を送っていたりするので、それをプログラム的に管理しようとするとすげー面倒くさいのだ。WWW::Mechanizeはそう言った面倒臭さを一切排除した超リッチなLWP::UserAgentラッパーだと言える。
参考
これが2004年の記事なんだよなあ。すげえ。
まあこれが如何に凄いかはナウな話じゃないので置いといて、とりあえず自分に必要そうなGREEの日記をバックアップをするコードを書きました。GREEってば日記をエクスポートする機能がない上にblogをGREE日記に登録するとそれまで書いてたレコードが消えるんだよな。2年前の話だけど、それ。
てな訳でソースはこちら。
なんかMechanizeの凄い所を全然使ってないように見えるのは日本語の正規表現に挫折したから。わからん。¥Q¥Eでかこみゃいいんじゃねえのか。あとどうせならパーサ作ってTTとか使ってみてMovable Typeとかにインポート可能なエクスポート形式にするとかやろうかなあと考えてましたがもう眠いので普通に保存するだけだよ!
超絶中途半端なエントリーですが明日早いので寝ますオヤスミー!
やっとマトモに使ったよPlagger。とあるサークルでMixiのコミュニティを連絡板代わりに使っているんですが、更新見に行くの面倒すぎって方がいたのでぼくもぼくも!と思い勉強がてら。
と言う訳で覚え書きです。そのものズバリな情報が無かったので。
デフォルトのCustomFeed::Mixiは書き込み内容が取得出来ないので、公開されてるパッチをpatch <してやってから、$Mapのハッシュに
HogeBbs => {
start_url => 'http://mixi.jp/list_bbs.pl?id=******',
title => 'Hogeコミュニティ最新書き込み',
get_list => 'parse_list_bbs',
get_detail => 'dummy',
get_detail_bbs => 'get_view_bbs',
get_detail_event => 'get_view_event',
get_detail_enquete => 'get_view_enquete',
},
plugins:
- module: CustomFeed::Mixi
config:
email: hoge@hoge.org
password: password
fetch_body: 1
show_icon: 1
feed_type:
- HogeBbs
- module: Publish::Feed
config:
format: RSS
dir: /home/you/public_html/feeds
filename: hoge_mixi.rss
*/30 */1 * * * /home/you/local/bin/plagger -c /home/you/local/lib/plagger/hoge_mixi.yaml
% crontab .crontab
ところでPlagger入れた当初の目的すっかり忘れてたんですが、大体似たような機能だったんで同様に達成出来ました。こちらは非公開w
そういやPlaggerコミュはいってねーや。どうしよ。
プログラミング言語の話です。
ねぎぽは基本的にPerlerです。このところRubyを触る必要性にかられていてその為にはてブしてたサイトがあるんだ。
新しいプログラミング言語を習得するための15の方法
今日30分ぐらい時間が出来たのでいくつか組もうと思った。ざっと見た所文字列操作は使うだろうし多くて良し、配列操作もいいけどやけに数値処理が多いなみたいなことを考えつつ、書きはじめてみていきなり詰まった挙げ句驚愕の事実に気づいた。
課題1. 無限ループ内に1,2,3,...を出力させ、このループを特定のキー入力で止める。
・・・キーボードイベントってPerlでどう見るの?
Perl/Tkでそう言うの昔組んだことあるけど、えーと、無理だろこれ。ねぎぽはPerlの習得を諦めました。
誰かRubyでやってよこれ。
thelaughingman.net
画像解析で写真に写っている顔を認識して、攻殻機動隊の笑い男をオーバーラップさせるサービスサイト。OpenCVでこんなモジュールを作ってくれた人がいてから4日でサービスイン。この記事とか昨日の時点で読んでいたので「誰か作るだろうなあ」とはうっすら思ってはいたものの、ちょっとこれは予想を超えて面白いツールです。
個人的に一番笑ったのはuran/po/hmtが映ってる写真を放り込んだらhmtだけ認識されなかったこと。おいしいなあ。ずるいなあ。
(追記)
もうだめだー笑いが止まらないww
hmt神のお言葉も頂きました:
0:09 このサイト
0:10 やちえさんの暴言より傷つくんですけどw
パーマンはすげえ奴だ。10段階で言うと8ぐらい。でもあんまりPerlで遊んだことの無い、職業Perlerでもある。そんな訳でお前迷路でも作れと、何も考えずに課題を与える俺でした。
一瞬で作ってきやがった。
こいつはマジですげえ。10段階で言うと9ぐらい(10はラリー・ウォール)。
と言う訳で、自分だけで楽しむのは勿体ないのでwebで閲覧出来るようにしました。
meiro (c)p-man
ソースが欲しい人はパーマンから直接貰って下さい。
いや、すげえ。
Plaggerの新しいトピックなんて数ヶ月出ていない状況ですが、自由に使えるサーバも手に入ったことだし、また必要にかられたのでとりあえずインスコしてみることにしました。
dreamhostはsudo出来ないことに留意しながら、まずはcpanのインストール。
DreamHost で CPAN を使う方法
最高です。殆どこのままで行けましたが、シェルがcshなのでこんな感じにPATHとPERL5LIBを設定。
setenv PATH $HOME/local/bin:$PATH
setenv PERL5LIB $HOME/local/lib/perl5/5.8.8:$HOME/local/lib/perl5/site_perl/5.8.8
okok。でとりあえずcpanシェルに入って。
install Plagger
...
AVIF/Time-Duration-1.04.tar.gz : make_test NO
DCLINTON/Cache-Cache-1.05.tar.gz : make_test NO
RICKM/DateTime-Format-Strptime-1.0700.tar.gz : make_test NO
ABH/XML-RSS-1.22.tar.gz : make_test NO
ok ABW/Template-Toolkit-2.18.tar.gz : install NO
OLAF/Net-DNS-0.59.tar.gz : make_test NO
KELLAN/DateTime-Format-W3CDTF-0.04.tar.gz : make_test NO
DROLSKY/DateTime-0.36.tar.gz : make_test NO
DROLSKY/DateTime-Format-Mail-0.30.tar.gz : make_test NO
DROLSKY/DateTime-Locale-0.33.tar.gz : writemakefile NO '/home/.mewler/negipo/local/bin/perl Makefile.PL' returned status 512
うーん。
えい。
force intall Plagger
ポチ(ほんとはダメです)。
で、インストールのチェックの為に適当なサンプルを動かしてみました。
Plaggerはじめました
cacheがどうたら言ってたけどgmailをチェック。okok :D
便利さを見るのはこれからですが、とりあえずまともに動いたので感動エントリを投稿してみました。
ちょっと必要にかられてflickrのダウンローダを作ってみました。ダウンロードしたら拡張子変えてちょ。
Perlの実行環境とFlickr::API::Photosetsが必要で、あとflickr API keyは自分で取得して下さい(要flickrアカウント)。
動作仕様としては (1)フォトセット全部 (2)あるユーザの写真全部 (3)あるユーザのあるタグの写真全部 をインポート可能です。
使い方はこんな感じ:
% ./flickrdown.pl --key [your-api-key] --url http://www.flickr.com/photos/goodgrief/tags/Glamour/ --dir ./down --limit 100
or
% ./flickrdown.pl -k [your-api-key] -u http://www.flickr.com/photos/goodgrief/
or
% ./flickrdown.pl -k [your-api-key] -u http://www.flickr.com/photos/goodgrief/sets/1396354/
url指定するだけなのはクレヴァかも。
ソースのパラメータ初期化の所書き換えれば--keyは指定しなくてok。
eXpanda: an Integrated Platform for Network Analysis and Visualization
ネットワーク解析・可視化の為の統合プラットフォーム
Instruction movie