drkcore

2012/01/24 20:35:28

Joose(Javascript版のMoose)

sof見てたら見つけた。

名前からして、MooseのJavascript版ですね。マニュアルはあるけど、モダンPerl入門でperlのサンプルから理解する方がいいような気がする。

ProductName モダンPerl入門 (CodeZine BOOKS)
牧 大輔
翔泳社 / 2940円 ( 2009-02-10 )


買ったまま放置してあるMOPの本も読まなければいけない。

ProductName The Art of the Metabobject Protocol
Gregor Kiczales
The MIT Press / 4007円 ( 1991-07-30 )


2011/09/27 22:44:03

Javaデータ構造とアルゴリズム基礎講座

アルゴリズムの勉強のしかたに載っていて、java度の低い自分には丁度よいかもと思い即買いしたのだけど、自分にはちょっと基礎的すぎた(どういうライブラリがあるかとリングバッファの実装が役に立ったけど)。

ProductName Java データ構造とアルゴリズム基礎講座
長尾 和彦
技術評論社 / 2709円 ( 2008-12-26 )


アルゴリズムイントロダクションを買うべきだったな。

ところでperlでアルゴリズムを学ぶなら迷わずMAWPを選択するべきでしょう。

ProductName Mastering Algorithms With Perl
Jon Orwant
Oreilly & Associates Inc / 2553円 ( 1999-07 )


日本語版がでてもおかしくないくらいの良書だと思う。

2011/06/04 23:27:10

WWW::Mechanize::FirefoxとWeb::QueryでAjaxのサイトをスクレイピングする

第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

凡ミスでここまでは行かなかった。カナシス

2011/04/14 07:48:01

Perl CPANモジュールガイドはPerl界のミシュランガイド

これを読めばPerlグルメまちがいなしですね。Perlの経験がある程度あれば、モジュールを組み合わせて素敵なコードを紡ぎ出すという新たな楽しみを見いだせるようになるでしょう。

ProductName Perl CPANモジュールガイド
冨田尚樹
ワークスコーポレーション / 2730円 ( 2011-04-08 )


個人的には表紙が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のお手軽さは素晴らしいですね。

2011/04/08 20:33:14

rcsbから結晶構造データをダウンロードするコマンドをPythonで

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;

ProductName Bioinformatics Programming Using Python
Mitchell L. Model
Oreilly & Associates Inc / 5119円 ( 2009-12-23 )


2011/04/07 20:12:12

Rパッケージガイドブック

CPANといいCRANといいパッケージガイドが立て続けにでますな。

ProductName Rパッケージガイドブック
岡田 昌史
東京図書 / 3990円 ( 2011-04-09 )


ProductName Perl CPANモジュールガイド
冨田尚樹
ワークスコーポレーション / 2730円 ( 2011-04-08 )


このながれでPyPIやHackageも出ないかなぁ

2011/04/04 20:51:39

pythonのsplit

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相当のことやるにはどうすんだろか?

2011/03/25 04:02:42

PlaggerでBase class package "DateTime" is empty

さくらの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

で解決

2011/03/19 19:31:19

「Perl CPANモジュールガイド」を予約した

Perl使いだったら即予約しないとあかんよね

ProductName Perl CPANモジュールガイド
冨田尚樹
ワークスコーポレーション / 2730円 ( 2011-04-08 )


これはかなり楽しみな一冊

2011/03/05 09:37:52

WWW::Mechanize::FirefoxとWeb::Queryを組み合わせてみた

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って笑い事じゃないなぁ。