2012/01/24 20:35:28
Joose(Javascript版のMoose)
sof見てたら見つけた。
名前からして、MooseのJavascript版ですね。マニュアルはあるけど、モダンPerl入門でperlのサンプルから理解する方がいいような気がする。
買ったまま放置してあるMOPの本も読まなければいけない。
sof見てたら見つけた。
名前からして、MooseのJavascript版ですね。マニュアルはあるけど、モダンPerl入門でperlのサンプルから理解する方がいいような気がする。
買ったまま放置してあるMOPの本も読まなければいけない。
アルゴリズムの勉強のしかたに載っていて、java度の低い自分には丁度よいかもと思い即買いしたのだけど、自分にはちょっと基礎的すぎた(どういうライブラリがあるかとリングバッファの実装が役に立ったけど)。
アルゴリズムイントロダクションを買うべきだったな。
ところでperlでアルゴリズムを学ぶなら迷わずMAWPを選択するべきでしょう。
日本語版がでてもおかしくないくらいの良書だと思う。
第1回 静岡ITPro勉強会 インフラ部で発表してきた。デモが動かなかったのは、名前がダサいという理由で電車の中でhtmlのファイル名を変えたせいでした、アホ過ぎる。
ま、こんな感じのファイルを用意します。AjaxでATNDのAPIにアクセスして今日の参加者を表示するっていうやつです。
<!DOCTYPE html> <html> <head> <title>ajaxtest</title> <script type="text/javascript" src="jquery-1.6.1.min.js"></script> </head> <body> <button id=ajax name="atnd">クリックするとユーザー一覧を表示します</button> <div class=users></div> <script> $("button#ajax").click(function(){ $.getJSON('http://api.atnd.org/events/users/?event_id=16076&format=jsonp&callback=?', function(data){ var items = []; $.each(data.events[0].users, function() { items.push('<li>' + this.nickname + '</li>'); }); $('<ul/>', { 'class': 'userlist', html: items.join('') }).appendTo('div.users'); }); }); </script> </body> </html>
これをスクレイピングするにはWWW::Mechanize::Firefoxを使って
use WWW::Mechanize::Firefox; use Web::Query; use Encode; my $mech = WWW::Mechanize::Firefox->new(); $mech->get('http://localhost:8000/'); $mech->click({ xpath => '//button[@name="atnd"]', synchronize => 0 }); sleep(2); #print $mech->content; my $q = Web::Query->new_from_html($mech->content); $q->find('li')->each(sub { my $i = shift; printf "(%d) %s\n", $i+1, encode('utf-8', $_->text); });
実行するとこんな風に出力されるはずです。
(1) secondarykey (2) ando_ando_ando (3) となか (4) yukio.47 (5) Kaz110 (6) tatsuya.ueda (7) taji_314159265 (8) kzfm (9) non
凡ミスでここまでは行かなかった。カナシス
これを読めばPerlグルメまちがいなしですね。Perlの経験がある程度あれば、モジュールを組み合わせて素敵なコードを紡ぎ出すという新たな楽しみを見いだせるようになるでしょう。
個人的には表紙がCPANの世界観をとてもよく表現していて素敵だと思った。
一通り読んでみて、興味深かったモジュール群。
最近コマンドラインのツールを作ることが多いのでそういう作業を楽にするようなモジュールに偏っているかも。
モジュールガイドなので継続的にアップデートされると嬉しいですが、ここらへんは書籍の限界ですかね。
perl使いは是非手元に置いておくといいと思います。
せっかくなのでこの前書いたファイル監視スクリプトをFilesys::Notify::Simpleを使って書きなおしてみた。
use Filesys::Notify::Simple; my $watcher = Filesys::Notify::Simple->new(['.']); while(1) { $watcher->wait(sub { for my $event (@_) { next unless $event->{path} =~ /\/([\w\d]+)\.rst$/; print "### ", $event->{path}, " ###\n"; system("make html"); } }); }
余談だが、Mac::FSEventsを内部的に使ったらmacbookではクラッシュしたのでpm-uninstallでアンインストールした。
簡単にuninstallできたり、更新できたりとcpanmのお手軽さは素晴らしいですね。
pdbgetというpdb-idを引数にとって構造データをまとめてダウンロードするコマンド使っていたんだけど、ちょっと前のサーバリプレースでPDBのミラリング環境が失われたので使えなくなってた。こういうの致命的だよなとは思うが今時はネットワークが太いので別にミラリングする必要性はあまりないのかな?でも遅いよなぁ。
とりあえず、自分用に。プロキシ使いたいのでFancyURLopener
import urllib import sys pdblist = sys.argv[1:] proxies = {'http': 'http://[hostname]:[port]/'} opener = urllib.FancyURLopener(proxies) for pdbid in pdblist: f = opener.open('http://www.rcsb.org/pdb/files/%s.pdb.gz' % pdbid.upper()) data = f.read() with open('%s.pdb.gz' % pdbid.upper(),'wb') as wf: wf.write(data)
ちなみに初代はperlで書いてあった。これいつ書いたんだろう?多分7,8年よりは前だと思うんだよなぁ。
use strict; use Net::FTP; die "usage:$0 [pdb_id] ...\n" unless @ARGV; my $ftp = Net::FTP->new("[hostname]", Debug => 0) or die "Cannot connect to [hostname]: $@"; $ftp->login("pdb",'pdb') or die "Cannot login ", $ftp->message; $ftp->binary(); for my $pdbid (@ARGV){ $pdbid =~ tr/[A-Z]/[a-z]/; my $pdbdir = substr($pdbid,1,2); my $pdbfile = "pdb" . $pdbid . ".ent.gz"; $ftp->cwd($pdbdir) or warn "Cannot change PDB directory ", $ftp->message; $ftp->get($pdbfile) or warn "$pdbfile : ", $ftp->message; $ftp->cwd('..') or warn "Cannot change PDB directory ", $ftp->message; } $ftp->quit;
Bioinformatics Programming Using Pythonsplitの第二引数を与えると分割数を指定できる
>>> "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
で解決
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って笑い事じゃないなぁ。