CPANといいCRANといいパッケージガイドが立て続けにでますな。
このながれでPyPIやHackageも出ないかなぁ
CPANといいCRANといいパッケージガイドが立て続けにでますな。
このながれでPyPIやHackageも出ないかなぁ
splitの第二引数を与えると分割数を指定できる
>>> "test.tar.gz".rsplit('.') ['test', 'tar', 'gz'] >>> "test.tar.gz".rsplit('.',1) ['test.tar', 'gz']
perlだとこんな感じか(re.plで確認)
$ split /\./, "test.tar.gz" $VAR1 = 'test'; $VAR2 = 'tar'; $VAR3 = 'gz'; $ split /\./, "test.tar.gz", 2 $VAR1 = 'test'; $VAR2 = 'tar.gz';
perlでrsplit相当のことやるにはどうすんだろか?
さくらのVPSにperlbrew+cpanm+plaggerって入れてて
Base class package "DateTime" is empty. (Perhaps you need to 'use' the module which defines that package first.) at /home/kzfm/plagger/lib/Plagger/Date.pm line 3
というエラーが出ていてなんだかなぁと思ったらシェバンだった
#!/usr/bin/env perl
で解決
19032011 perl
05032011 perl
htmlをロードした後にgetJSONでJSON取ってくるようになっているので3秒ほど待たせてある。WWW::Mechanize::Firefoxの$mech->synchronize使えばいいのかなと思ったんだができなかったためにやっつけでsleepさせたのであとでちゃんと調べる。
use WWW::Mechanize::Firefox; use Web::Query; use Encode; my $mech = WWW::Mechanize::Firefox->new(); $mech->get('http://blog.kzfmix.com/404'); sleep(3); my $q = Web::Query->new_from_html($mech->content); $q->find('.tags a')->each(sub { my $i = shift; printf "(%d) %s\n", $i+1, encode('utf-8', $_->text); });
で、タグの名前がリスト表示される
(1) AIR (2) AMOP (3) Android ... (218) 電子工作 (219) 静岡 (220) 高山
そもそもここらへんから始まった話で、最初は他の言語にもmechanizeの実装あるからそれ使えばいいんじゃないのかなぁという助言で終わるかなと思っていたのだけど、対象のサイトのhtmlみたらjavascript使いまくって組み立てられていた。で、そういう場合にスクレイピングするにはどういう方法があるのか色々調べて勉強になったので個人的には満足だけど、あのおじさんにはできない仕事であることが判明した。ということはあの人達丸投げしてくんのかな?
というか丸投げする気が満々だったので、いちおうどういう目的でどういう事をやろうとしていて、どこら辺が技術的に難しいと考えてるのか資料にまとめて事前に送れば会議に出るか考えてやる、って返答しといたけど、絶対やらんと思うなぁ(昔からそうだったし)。
設計も実装もテストも行わないシステム部の社員が存在したり、
wwwwって笑い事じゃないなぁ。
javascriptでDOM操作しまくっているサイトをスクレイピングする作業が発生しそうなのだけどWWW:Mechanizeではできないらしくて、ちょっと調べてみた。
すぐに思いついたのはWWW::Seleniumなんだけど使ったことないなぁ。で、CPAN探したらWWW::Mechanize::Firefoxを見つけたのでインストールして使ってみた。
僕のブログの404ページはページがロードされると、AjaxでtagのJSONをゲットしてきて表示するようになっているので、そのページのスナップショットを撮ってみた
きちんとjavascriptを解釈している
use WWW::Mechanize::Firefox; my $mech = WWW::Mechanize::Firefox->new(); $mech->get('http://blog.kzfmix.com/404'); my $rect = { left => 150, top => 0, width => 500, height => 400, }; sleep(3); my $png = $mech->content_as_png(undef, $rect); open my $fh, '>', 'page.png' or die "Couldn't save to 'page.png': $!"; binmode $fh; print {$fh} $png; close $fh;
それから当たり前だがアクセスログのUser-Agentは
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
とFirefoxのものとなる。
というわけで、WWW::Mechanize::Firefoxを使ってスクレイピングをすればjavascriptでDOMを組み立ててるサイトやAjaxで通信しているサイトでもいけそうな気がしている。その後はWeb::QueryでDOMいじりをすればよさそうだ。
FrePanをいまさら知った。LDRでフィードを購読するようにしといた。
planetってのは要するに、幾つかのサイトで出力しているfeedを束ねて1つのfeedとして再配信する仕組みですよ。
単にまとめサイトか?って言われるとあれなんだけど、複数の視点つまりfeedを束ねることでみえてくる流れのようなものがあって面白い仕組みだなぁと。
ふと、富士市議(およびチャレンジャー)のfeedを束ねたくなってさくっと束ねてみた。
で、気がついたんだけど30代のチャレンジャーってブログじゃなくてtwitterメインだったりするのね。それはいいんだけど、twitterのRSSだとつぶやきごとにエントリにされちゃうのでtwilogみたいな一日分おまとめサービス使ってくんないかなぁ。
と思った。ちなみにここらへん見てる
あと、ちょっとよくわからないのが、街頭演説って自分らの世代にリーチすんのかな?と。僕的にはtwitterのログを配信したりブログを読んだりするほうが考えさせられる。
入門的な内容。3章のKeyGraphの話とパトリシア・トライの話が面白かった。KeyGraphで極大連結な部分グラフを求めるのに、igraphに適当な関数はないのだろうか?地道に辺を切ってみて連結かどうか再帰的に探索するしかないのかなぁ。
4,5章は知っている内容だったのでさっと読んだ。Knuth-Morris-Pratt法やBoyer-Moore法 はMAWPにperlでの実装方法が載っているので、読むべし。MAWPも読んで楽しい本です。
Wiki Bookを読みながら、面白いなと思った部分。
> my Int $x;
Int()
> $x = "1"
Type check failed for assignment
> $x = 1
1
Haskellっぽくかける
> multi sub fib (Int $n where { $n < 3 }) { 1 }
> multi sub fib (Int $n) { fib($n - 1) + fib($n - 2) }
> fib(10) #55
終了条件を最初に決めて、あとは再帰させてみた。
> multi sub mysum (@a where {@a == 0}) {return 0}
> multi sub mysum (@a) {@a[0] + mysum(@a[1..(@a-1)])}
> mysum 1..10 #55
$^で
> for (@myArray) { say $^a + $^b; }
3 # 1+2
7 # 3+4
11 # 5+6
リスト内包表記っぽい。それともScalaっぽい?
> gather for 1..10 {take $_ if $_ % 3 == 0} # 3 6 9
こんな感じにもできる
> gather for 1..10 {take 1..$_,"\n"}
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
朝からPerl6の実装のひとつのRakudo Starを入れて遊んでた。
$ ./perl6
> for 1..5 { .say }
1
2
3
4
5
無限リスト
> for 1..Inf { .say }
1
2
3
...
20092
20093
20094
Segmentation fault
週末にもう少し触ってみよう。