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

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

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


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


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

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

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

で解決

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

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

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


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

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

WWW::Mechanize::Firefox

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;

404

それから当たり前だがアクセスログの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サイトを作った

planetってのは要するに、幾つかのサイトで出力しているfeedを束ねて1つのfeedとして再配信する仕組みですよ。

単にまとめサイトか?って言われるとあれなんだけど、複数の視点つまりfeedを束ねることでみえてくる流れのようなものがあって面白い仕組みだなぁと。

ふと、富士市議(およびチャレンジャー)のfeedを束ねたくなってさくっと束ねてみた。

で、気がついたんだけど30代のチャレンジャーってブログじゃなくてtwitterメインだったりするのね。それはいいんだけど、twitterのRSSだとつぶやきごとにエントリにされちゃうのでtwilogみたいな一日分おまとめサービス使ってくんないかなぁ。

と思った。ちなみにここらへん見てる

あと、ちょっとよくわからないのが、街頭演説って自分らの世代にリーチすんのかな?と。僕的にはtwitterのログを配信したりブログを読んだりするほうが考えさせられる

ProductName さすが!と言わせる Plagger徹底攻略術
蒲生 睦男
シーアンドアール研究所 / 2310円 ( 2009-01-22 )


「情報検索アルゴリズム」を読んだ

入門的な内容。3章のKeyGraphの話とパトリシア・トライの話が面白かった。KeyGraphで極大連結な部分グラフを求めるのに、igraphに適当な関数はないのだろうか?地道に辺を切ってみて連結かどうか再帰的に探索するしかないのかなぁ。

ProductName 情報検索アルゴリズム
北 研二,津田 和彦,獅々堀 正幹
共立出版 / ¥ 3,570 ()
在庫あり。

  • 第1章 序 章
    • 1.1 情報検索のモデル
    • 1.2 情報検索の分類
  • 第2章 情報検索の適用と評価
    • 2.1 情報検索の適用例と関連技術
    • 2.2 情報検索システムの評価尺度
    • 2.3 情報検索用テスト・コレクション
  • 第3章 索引語の抽出と重み付け
    • 3.1 索引語の抽出
    • 3.2 索引語の重み付け
    • 3.3 単語分布モデルに基づく重み付け
    • 3.4 KeyGraphによるキーワード抽出
  • 第4章 ベクトル空間モデルに基づく文書検索
    • 4.1 線形代数の基礎
    • 4.2 ベクトル空間モデル
    • 4.3 適合性フィードバック
    • 4.4 潜在的意味インデキシング
    • 4.5 潜在的意味インデキシングの関連技術
    • 4.6 高次元スパース行列の処理
  • 第5章 文字列照合に基づく全文検索
    • 5.1 文字列照合問題
    • 5.2 文字列照合問題の単純な解決法
    • 5.3 Knuth-Morris-Pratt法
    • 5.4 Boyer-Moore法
    • 5.5 Aho-Corasick法
    • 5.6 マシンACの動的構成法
  • 第6章 索引を用いた全文検索
    • 6.1 特徴ベクトルを用いた全文検索
    • 6.2 転置ファイルを用いた全文検索
    • 6.3 パトリシア・トライを用いた全文検索
    • 6.4 パトリシア・トライの圧縮

4,5章は知っている内容だったのでさっと読んだ。Knuth-Morris-Pratt法やBoyer-Moore法 はMAWPにperlでの実装方法が載っているので、読むべし。MAWPも読んで楽しい本です。

ProductName Mastering Algorithms With Perl
Jon Orwant,Jarkko Hietaniemi,John MacDonald
Oreilly & Associates Inc / ¥ 3,002 ()
通常2~4週間以内に発送

Rakudo Starを触ってみた

Wiki Bookを読みながら、面白いなと思った部分。

型チェックしてくれる

> my Int $x;
Int()
> $x = "1"
Type check failed for assignment
> $x = 1
1

multi method dispatch

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

Placeholder Arguments

$^で

> for (@myArray) { say $^a + $^b; }
3  # 1+2
7  # 3+4
11 # 5+6

gather take

リスト内包表記っぽい。それとも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 

Rakudo Starを入れた

朝から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

週末にもう少し触ってみよう。

ProductName Einstieg in Perl 6
Alvar Freude
Addison Wesley Verlag / ¥ 4,393 ()
近日発売 予約可