本を読む

読書やコンピュータなどに関するメモ

P::P::Publish::TagCloud

Plagger::Plugin::Publish::TagCloudというアイデアを見たので野良試作。HTML::TagCloudにデータを渡してるだけだけど。

MYCOMジャーナルをFilter::Summarize::Japaneseでタグづけして、Publish::TagCloudにかけるとこんな感じ。

Publish::TagCloudサンプル


設定はこんな感じ。

mycomjournaltag.yaml
global:
  log:
    level: debug

plugins:
  - module: Subscription::Config
    config:
      feed:
        - http://journal.mycom.co.jp/haishin/rss/index.rdf

  - module: Filter::EntryFullText

  - module: Filter::Regexp
    config:
      regexp: s/\[IMAGE\]//g

  - module: Filter::Summarize::Japanese

  - module: Publish::TagCloud
    config:
      dir: /tmp/mycomjournal
      filename: tagcloud.html
      maxtags: 30


Publish::TagCloudはとりあえずこんな感じ
(2006.11.12追記:HTML::TagCloudのアップデートに併せて更新)。

Publish::TagCloud
package Plagger::Plugin::Publish::TagCloud;
use strict;
use warnings;
use base qw ( Plagger::Plugin );

our $VERSION = 0.01;

use Encode;
use HTML::TagCloud;
use File::Spec;

sub register {
    my ($self, $context) = @_;
    $context->register_hook(
        $self,
        'publish.feed' => \&feed,
    );
}

sub feed {
    my($self, $context, $args) = @_;

    my $conf = $self->conf;
    my $f = $args->{feed};

    my %tagcount;
    for my $e ($f->entries) {
        for my $t (@{$e->tags}){
            $tagcount{$t}++;
        }
    }

    my $cloud = HTML::TagCloud->new;
    while ((my $k, my $c) =  each %tagcount) {
        $cloud->add($k, '', $c);
    }

    my $file = Plagger::Util::filename_for($f, $self->conf->{filename} || "%i.html");
    my $filepath = File::Spec->catfile($self->conf->{dir}, $file);
    $context->log(info => "save TagCloud for " . $f->link . " to $filepath");

    open my $output, ">:utf8", $filepath or $context->error("$filepath: $!");
    print $output cloud_html_and_css($cloud, $self->conf->{maxtags} || undef);
    close $output;
}

sub cloud_html_and_css{
    (my $cloud, my $limit) = @_;

    my $html = $cloud->html_and_css($limit);

    $html =~ /line-height: (\d+)px/;
    my $size = $1;

    while($html =~ /class="tagcloud(\d+)"/g){
        my $sz = $1 + 12;
        $size = $sz if $size < $sz;
    }

    $html =~ s/line-height: (\d+)px/line-height: ${size}px/;

    $html;
}

1;

__END__

=head1

Plagger::Plugin::Publish::TagCloud - Publish feeds as TagCloud

=head1 SYNOPSIS

  - module: Publish::TagCloud
    config:
      dir: /tmp/tag
      filename: output.html
      maxtags: 10

=head1 CONFIG

=head2 dir

Directory to save csv files in.

=head2 filename

Filename to be used to create csv files. It defaults to C<%i.html>. It
supports the following format like printf():

=head2 maxtags

Numbers of tags to output.

=head1 AUTHOR

Masakazu Takahashi

=head1 SEE ALSO

L<Plagger>, L<HTML::TagCloud>

=cut

「論理で人をだます法」

 物騒な題名がついているが、アリストテレスとかフランシス・ベーコンとかの昔の論理学みたいなのを啓蒙する本。それにプラスして、各項ごとにアメリカンジョーク(?)みたいな例がついている。

 高校の倫理社会でやってた思想史の授業を思い出した。先生が面白くて、けっこう好きな授業だったなぁ。

論理で人をだます法
論理で人をだます法
posted with amazlet on 06.11.05
ロバート・A・グーラ 山形 浩生
朝日新聞社

「天牌」35巻

 麻雀劇画。
 黒流組 vs. 波城組の対決が舞台で、北岡がメイン。遼のほうのストーリーも謎の展開に。主人公は2ページしか出てこない(笑)

天牌 35 (35)
天牌 35 (35)
posted with amazlet on 06.11.05
来賀 友志 嶺岸 信明
日本文芸社

「クマムシ?!?小さな怪物」

 「最強の生物」とか「不死身」とか、あるいは「キモカワイイ」とかいわれている(らしい)クマムシを専門にとりあげた本。
 しかも、飼育日記を中心に、極端な状況じゃなくて実際の生態を見せてくれる。軽めの文章や、さまざまなイラストとで、読みやすい。中でも、著者も書いているように、マルクス夫妻のクマムシ図がカワイイ。
 アンケートハガキを見て、クマムシのヌイグルミがちょと欲しくなった。

クマムシ?!―小さな怪物
鈴木 忠
岩波書店

「Web2.0が殺すもの」

 タイトルとかうさんくさいので避けていたけど、ふと読んでみたら「案外」おもしろかった。PC9801とかパソコンサンデーとかいった話が多かったので、読み飛ばしながら30分の電車で読み終えちゃったんだけど。
 ようするに「mixiがWeb2.0なら、2ちゃんねるだってWeb2.0だろう」というようなツッコミを入れているだけの本。ただし、 AmazonのロングテールってようするにWeb2.0じゃなくてデカい倉庫じゃね?といったようなネット住民が普通に思うような考察はないので期待しないように。
 ちなみに著者は、「みんなの意見は案外正しい」を(10p程度しか)読んでないだろうなとは思った。
 5章後半で見るに、本書の結論は「テレビやインターネットばかり見てるとバカになる」ということらしい(大宅壮一インスパイヤ?)。

Web2.0が殺すもの
Web2.0が殺すもの
posted with amazlet on 06.11.05
宮脇 睦
洋泉社

「まっとうな経済学」

 「ヤバい経済学」風の書名と表紙。そして、「ヤバい経済学」の著者の片方が推薦しているオビ。
 という要素を見ると「ヤバい経済学」の二番煎じ本っぽい。が、中身の方向性はぜんぜん違った。
 本書では第3章をまるまる割いているように、市場原理のモデルが前提にあり、それを解説しているという意味でオーソドックスな経済学のモデルの一般向け解説書だと思う。
 そして希少性や情報の欠落、外部性などの「市場の失敗」を解説。ほか、「美人投票」問題やゲーム理論、中国の成長、グローバリムなどを章ごとに解説している。

まっとうな経済学
まっとうな経済学
posted with amazlet on 06.11.05
ティム・ハーフォード 遠藤 真美
ランダムハウス講談社

CustomFeed::Configでhome.impress.co.jpの新刊情報

前のエントリーに続いて、「コンピュータ系新刊情報」のPlagger化。 今度はhome.impress.co.jp。これはCustomFeed.Configでいける。

●~/lib/plagger/assets/plugins/CustomFeed-Config/homeimpress.yaml
match: http://home\.impress\.co\.jp/
extract_date_format: %Y %m/%d
extract: <tr class="S10pt"><td bgcolor="#FFCC66" align="center">(\d+/\d+)</td><td bgcolor="#B0C4DE" align="center">([^<]*)</td><td bgcolor="#F5F5DC"><a href="([^"]*)">([^<]*)</a></td><td align="right" bgcolor="#FFE4E1">([^<]*)</td></tr>
extract_capture: itemdate cat link title price
extract_after_hook: |
  $data->{date} =  Plagger::Date->now->year . ' ' . $data->{itemdate};
  $data->{body} =  join(' ', $data->{itemdate}, $data->{cat}, $data->{price});


●homeimpress.yaml
global:
  log:
    level: debug
  plugin_path:
    - ~/lib/plagger/Plugin
  assets_path: ~/lib/plagger/assets

plugins:
  - module: Subscription::Config
    config:
      feed:
        - http://home.impress.co.jp/

  - module: CustomFeed::Config

  - module: Publish::Feed
    config:
      dir: /tmp/newbook
      format: RSS
      filename: impress.xml

Plagger::Plugin::CustomFeed::cbook24

勝手RSSサービス「コンピュータ系新刊情報」をやっている。ここでは、cbook24の情報をiCalendar化するのに以前からPlaggerを使っていた。ただし、いちどRSS化をしてからHTTP経由で取得しなおすのは無駄だ。そこで、RSS化の部分もPlaggerの野良プラグインにして、一度にRSSとiCalendarの両方を生成するようにした。

2006-12-15追記:このプラグインを更新した

●Plagger::Plugin::CustomFeed::cbook24
package Plagger::Plugin::CustomFeed::cbook24;
use strict;
use base qw( Plagger::Plugin );

use Encode;
use Plagger::UserAgent;
use Plagger::Util qw( decode_content );

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'customfeed.handle' => \&handle,
    );
}

sub handle {
    my($self, $context, $args) = @_;

    if ($args->{feed}->url =~ m|^http://www\.cbook24\.com/bm_browsing\.asp|){
        $self->aggregate($context, $args);
        return 1;
    }

    return;
}

sub aggregate {
    my($self, $context, $args) = @_;

    my $url = $args->{feed}->url;

    my $feed = Plagger::Feed->new;
    $feed->type('cbook24');
    $feed->title('cbook24');
    $feed->link($url);

    my $agent = Plagger::UserAgent->new;

    my $re_next = decode('utf-8','\<a\s+href="([^"]*)">\s*次  へ&nbsp;\s*\</a>');
    my $re_date = decode('utf-8','発売日:.*?(\d{4}/\d+/\d+)');

    PAGE: {
        $context->log(info => "GET $url");
        my $res = $agent->fetch($url, $self);
        if ($res->is_error) {
            $context->log(error => "GET $url failed: " . $res->status_code);
            return;
        }
        my $content = decode_content($res);
        $content =~ s/[\r\n]/ /g;

        my $nexturl;
        if($content =~ m|$re_next|o){
            $nexturl = URI->new_abs($1, $url);
        }

        $content =~ s/.*?\<td vAlign="bottom">//;
        $content =~ s/\<td valign="top" align="right" width="150">.*$//;

        my @items = split(/\<td align="center" valign="top" width="50%">/, $content);
        foreach my $item (@items){
            $item =~ m|$re_date|o
                or next;
            my $dcdate = Plagger::Date->strptime('%Y/%m/%d', $&);

            $item =~ s|\<a href="(.*?)">(.*?)\</a>||
                or next;
            my $itemurl = URI->new_abs($1, $url);
            my $itemtitle = $2;

            $item =~ s|\</table>.*||s;
            my $desc = $item;
            $desc =~ s/\s+//g; $desc =~ s/\&nbsp;//g;
            $desc =~ s|\</tr>|\n|g;
            $desc =~ s/\<.*?>//g;

            my $entry = Plagger::Entry->new;
            $entry->title($itemtitle);
            $entry->link($itemurl);
            $entry->date($dcdate);
            $entry->body($desc);

            $feed->add_entry($entry);
        }

        if($nexturl){
            $url = $nexturl;
            redo PAGE;
        }

    }

    $context->update->add($feed);
}

1;
__END__

=head1 NAME

Plagger::Plugin::CustomFeed::cbook24 - Custom feed for cbook24 booklist

=head1 SYNOPSIS

  - module: Subecriotion::Config
    config:
      feed:
        - url: http://www.cbook24.com/bm_browsing.asp?page=0&browsing%5Ftype=comingsoon
  - module: CustomFeed::cbook24

=head1 DESCRIPTION

This plugin creates a custom feed from cbook24 book list.

=head1 AUTHOR

Masakazu Takahashi

=head1 SEE ALSO

L<Plagger>, L<http://www.cbook24.com/>

=cut


●cbook24.yaml
global:
  log:
    level: debug
  plugin_path:
    - ~/lib/plagger/Plugin

plugins:
  - module: Subscription::Config
    config:
      feed:
        - http://www.cbook24.com/bm_browsing.asp?page=0&browsing%5Ftype=comingsoon

  - module: CustomFeed::cbook24

  - module: Publish::Feed
    config:
      dir: /temp/newbook
      format: RSS
      filename: cbook.xml

  - module: Publish::iCal
    config:
      dir: /tmp/newbook
      filename: cbook.ics

「C.M.B.」3巻

 「Q.E.D.」の燈馬君のイトコという設定の榊森羅君が活躍するマンガ。本格ミステリーの手法を使ったエンターテインメントという感じで、面白い。路線としては「ロケットマン」か。

 「失われたレリーフ」は、タイトルの元になっている3つの指輪にまつわる競争の話。94~95ページがいいですよね。

 「都市伝説」は、偶然っぽいネタが論理でつながるところが面白い、新本格っぽい話。必ずしも理詰めではないんだけど、話の進めかたがとっても面白い。登場人物たちもいい感じ。

「Q.E.D」25巻

 毎回、単行本が出るのが楽しみな本格ミステリーマンガ「Q.E.D.」の新作。といっても発売から1か月弱たってしまったが。

 この巻では「宇宙大戦争」と「パラレル」の2作を収録している。前者は、おなじみになった「探偵同好会」シリーズのドタバタコメディ。後者は、特に初期によくあったような切ない結末の話。

 「余詰めなしの謎解き」や「あっと驚く伏線」は少なめの巻だが、それでも激しく面白い。

Q.E.D-証明終了- 25 (25)
Q.E.D-証明終了- 25 (25)
posted with amazlet on 06.10.09
加藤 元浩
講談社

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad