空繰再繰

Data::Cloud released.

Data::Cloudをリリースしました。

タグクラウドやワードクラウドのためのUtility moduleであるData::Cloudをリリースしました。

http://search.cpan.org/perldoc?Data::Cloud

どういうモジュールかって言うと、単語の個数をカウントしたり、単語の個数を元に等級分けするとかそういう感じのモジュールです。

大体こんな感じ。


use Data::Cloud;
use Perl6::Say;

# インスタンスを作る
my $cloud = Data::Cloud->new;

# 文字列を単語に分解するtokenizer
my $parser = MyTokenizer->new;

# 入力ソース
my $source = q{なんらかの文章};

# テキストを単語に分解して個数を数える
for my $word ( $parser->parse( $source ) ) {
    $cloud->increment( $word );
}

# 単語に等級をつける
my $resource = $cloud->rating( rate => 5 );

require YAML;
print YAML::Dump( $resource );

CPANにはTag Cloudを生成するモジュールが見つけただけで、

  • HTML::TagCloud
  • HTML::TagCloud::Sortrable
  • HTML::TagClouder
  • Data::CloudWeight
  • WWW::CloudCreator

これだけあるんですが、どいつもこいつもHTMLを生成するモジュールばっかりで、純粋に単語の個数を数えたり、等級分けするためのモジュールがなかったため、作ってみた次第。(まあ単に見つからなかっただけかも知れなくもないけど)

というか。確かtypesterさんの、

いろいろあるけどなんでどれもこれもHTML作っちゃうんだろう。もっとシンプルなのほしい。hashで返してくれればいいよ。

引用元 : unknownplace.org - 2007/11/14

というぼやきがきっかけで作り始めたんだと思った。この辺りうろ覚えだけど。

まあ今日リリースになったのは、作り始めたはいいけど、途中で放置してて、昨日今日でようやく完成させたんでリリースにいたったという感じ。放置しすぎです><

まあ何かここをこうした方がいいとかここがおかしいとかあればパッチ送るなりなり連絡なりしてください。あとcodereposで管理してるんで、一緒に開発するのもありです。

それなりのPerl使いになるための参考書

Perlをマスターするための参考書

最近{xxx}-users.jpが竹の子のように生えてますが、それに便乗してPerl使いになるための参考書を紹介してみる。

で、ぶっちゃけた話、

初めてのPerl タイトル 初めてのPerl
作者 ランダル・L. シュワルツ
価格 ¥ 3,780
発売元 オライリージャパン
発売日 2003-05
ISBN/ASIN 4873111269
続・初めてのPerl 改訂版 タイトル 続・初めてのPerl 改訂版
作者 Randal L. Schwartz
価格 ¥ 3,360
発売元 オライリー・ジャパン
発売日 2006-10-21
ISBN/ASIN 4873113059
オブジェクト指向Perlマスターコース―オブジェクト指向の概念とPerlによる実装方法 タイトル オブジェクト指向Perlマスターコース―オブジェクト指向の概念とPerlによる実装方法
作者 ダミアン コンウェイ
価格 ¥ 6,510
発売元 ピアソンエデュケーション
発売日 2001-02
ISBN/ASIN 4894713004

の三つをこなせば、Perlを大体書けるようになると思います。といかまあ、自分はこの三冊を使ってPerlを一通りマスターしたわけですが。

で、この後のレベルアップに、

Perlベストプラクティス タイトル Perlベストプラクティス
作者 Damian Conway
価格 ¥ 4,515
発売元 オライリー・ジャパン
発売日 2006-08-24
ISBN/ASIN 4873113008
実用Perlプログラミング タイトル 実用Perlプログラミング
作者 サイモン カズンズ
価格 ¥ 3,360
発売元 オライリージャパン
発売日 2006-03
ISBN/ASIN 487311280X
Perlクックブック〈VOLUME1〉 タイトル Perlクックブック〈VOLUME1〉
作者 トム クリスチャンセン
価格 ¥ 5,145
発売元 オライリージャパン
発売日 2004-09
ISBN/ASIN 4873112028
Perlクックブック〈VOLUME2〉 タイトル Perlクックブック〈VOLUME2〉
作者 トム クリスチャンセン
価格 ¥ 3,780
発売元 オライリージャパン
発売日 2004-09
ISBN/ASIN 4873112036
Perlプログラミング救命病棟 (Programmer’s foundations) タイトル Perlプログラミング救命病棟 (Programmer’s foundations)
作者 ピーター・J・スコット
価格 ¥ 3,129
発売元 翔泳社
発売日 2005-09-06
ISBN/ASIN 4798109401
Perl Hacks ―プロが教えるテクニック & ツール101選 タイトル Perl Hacks ―プロが教えるテクニック & ツール101選
作者 chromatic
価格 ¥ 3,150
発売元 オライリー・ジャパン
発売日 2007-01-23
ISBN/ASIN 4873113148

が参考になるんじゃないかなーと。ちなみにPerlクックブックは持ってませんが。

まあ僕の場合はPlaggerの野良プラグインを書いた結果レベルアップしたので、実際にモジュールなりフレームワークのプラグインを書くなりするのも手かもしれません。あ、けどよっぽどのことがない限りCatalystのプラグインは書かない方がよさげ。disられます。

まあPerlの基本を押さえるんだったら上記の三冊、その後のレベルアップは下記の六冊か、実際にPerlを読み書きするのが良いと思います。

あと正規表現マスターしたかったら記法(軽量マークアップ言語)パーサ作ってみるのがいいよ!大まかな正規表現の使い方がばっちりになります。あとHTMLべた書きしないことのすばらしさがわかるようになります。

ざっとですが、Perl本は大体この辺り押さえておけばいいんじゃないかなーと思います。あとは実際にコード書く。これ鉄則。

まあPerlをマスターする上で何かの参考になれば幸いです。

HTMLをMarkdownに変換する

Markdownから変換したHTMLをもう一度Markdownに戻す方法。

Tumblrでは記法としてMarkdownを使えたりするんだけど、API経由では元のMarkdownが取得できず、HTMLに変換されたものしか取れないので、仕方なくHTMLをMarkdownに戻す方法を模索してみた。

んで、以下のコードで大体元のMarkdownに戻せると思う。

use strict;
use warnings;

use HTML::WikiConverter;
use HTML::Entities qw( decode_entities );

my $html = q{Markdownから変換されたHTML};

my $converter = HTML::WikiConverter->new(
    dialect => 'Markdown',
);

my $source = $converter->html2wiki( $html );
   $source = decode_entities( $source );
   $source = "\n${source}\n";
   $source =~ s{\n[`]([\s\S]+?)[`]\n}{
        my $match = $1;
           $match = "\n$match\n";
           $match =~ s{\n}{\n    }g;
           $match =~ s{^\n*|\s*$}{}g;
           $match .= "\n";
           "\n$match\n"
    }gse;

print $source;

動作にはHTML::WikiConverterHTML::WikiConverter::Markdownが必要。引数なんかは各モジュールのPODを参照。

HTML::WikiConverter + HTML::WikiConverter::Markdownで一発変換できるかと思ったんだけど、整形済みテキスト(pre要素とcode要素で囲まれたテキスト)が元に戻せなかったので正規表現で置換してる。

あと実際に使ってるコードでは出力される構文が気に喰わないとかなんとかで、HTML::WikiConverter::Markdownを継承して部分的に書き換えて使ってるけど。

Moose.pmを使わない方が良いケース

PerlのMooseを使わない方が良い場合。

Moose.pm使うと色々と便利なんだけど、

  1. 大量にインスタンスを作成する場合
  2. 実行速度が速くなければならない場合

には使わない方がいいのかなぁと考えている。

パフォーマンス云々に関してはdannさんのエントリが参考になるとして、実際に使ってみた感じではNode treeを作成するクラスなんかでは使わない方がいいかと。

ぶっちゃけた話、今の所開発が止まってる自作記法のText::Nyarlaxで要素クラスを作るときにMooseを使ってたわけだけど、結構遅かったように思う。まあParse::RecDescentのコンパイルも関係してるだろうけど。

あとまあ、例えば共通のインターフェイスを持つクラスとそれを保持するクラスを作成する場合なんかには、Moose使うとだいぶ楽ができると思う。ただまあそのときに__PACKAGE__->meta->make_immutableした方がいいみたいだけど。

まあ自分の中でMoose使うときに注意点はこんなもんかなぁと。Mooseは結構面白いので使えるときには使って行きたいなぁと思う。自分はMooseのソース読めないけどw

エントリは以上。あと実に一ヶ月ぶりにこのBlog更新した。無貌断片の方はまあぽつぽつと更新してるけど。

Perlでレキシカル変数を外部からいじる方法

Perlでレキシカル変数を外部のスコープから変更するTips

外部スコープからレキシカル変数の値を変更する、という普通んなことしねーよな変態なことをやりたかったので、やる方法をだいぶ前に調べたことをまとめてみる。

結論から言えばPadWalkerを使えばできる。

使い方はまあこんな感じ。細かいことはPOD見れば分かるので説明は省略。

use strict;
use warnings;

use PadWalker qw( peek_my );
use Perl6::Say;

{
    my $x = 'foo';
    say $x; # 'foo'

    &magic();
    say $x; # 'bar'
}

sub magic {
    my $vars = peek_my(1);
    ${ $vars->{'$x'} } = 'bar';
}

で、まあ何でレキシカル変数を外部から書き換えるとか変態的なことがしたかったかというと、blosxomのプラグインの設定をプラグインファイル自体を書き換えずに変更したかったから。要するにプラグインの設定を外部ファイルに一まとめにしたかったって言う。

blosxomのプラグインは設定がpackageの直下myで定義されてるので普通は外から変更できない。で、最初peek_myでできるかと思ってたんだけど、色々やってみても結局できなかった。

んで、どうしたもんかとやっていたうちに、peek_sub使えばできるんじゃね?というのを思いついて、実際に試してみたらできちゃったという。大体こういう感じでできた。

package foo;

my $confA = 'AAA';
my $confB = 'BBB';

sub start {
    return 1;
}

package bar;

use PadWalker qw( peek_sub );

my $start_sub   = foo->can('start');
my $vars        = peek_sub( $start_sub );

${ $vars->{'$confA'} } = 'BBB';
${ $vars->{'$confB'} } = 'BBB';

どういうことかと言うと、$confA,$confBpackage直下で定義されてるので、関数start内のスコープからでも参照できる。んで、peek_sub関数のスコープ内のレキシカル変数を取得することができるので、レキシカル変数を参照できるスコープを持つCODE referenceを取得し、そのCODE referenceからpeek_subを使ってレキシカル変数を取得できるというわけ。言葉にするとややこしい気がしないでもないけど、コード見れば大体分かると思う。

まあそういうことが分かったのでまあプラグインの設定を外部ファイルに切り出すプラグインはできたもののblosxomいじりが途中で止まってるので公開してなかったりする。もうちょっといじってCodeReposに上げる予定はしてるけど。

どうも嘘書いてたっぽい

今日気付いたんだけど、上記の方法ではサブルーチンで参照していない変数は参照できないもよう。

どうしたもんかな、これ。

なんか久しぶりに空繰再繰更新した。もうちょっと更新頻度上げたい。

Page 1 of 54: 1 2 3 4 5 6 7 8 9 >>