P::P::Publish::TagCloud
Plagger::Plugin::Publish::TagCloudというアイデアを見たので野良試作。HTML::TagCloudにデータを渡してるだけだけど。
MYCOMジャーナルをFilter::Summarize::Japaneseでタグづけして、Publish::TagCloudにかけるとこんな感じ。
設定はこんな感じ。
mycomjournaltag.yaml
Publish::TagCloudはとりあえずこんな感じ
(2006.11.12追記:HTML::TagCloudのアップデートに併せて更新)。
Publish::TagCloud
MYCOMジャーナルをFilter::Summarize::Japaneseでタグづけして、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
「論理で人をだます法」
物騒な題名がついているが、アリストテレスとかフランシス・ベーコンとかの昔の論理学みたいなのを啓蒙する本。それにプラスして、各項ごとにアメリカンジョーク(?)みたいな例がついている。
高校の倫理社会でやってた思想史の授業を思い出した。先生が面白くて、けっこう好きな授業だったなぁ。
高校の倫理社会でやってた思想史の授業を思い出した。先生が面白くて、けっこう好きな授業だったなぁ。
「天牌」35巻
麻雀劇画。
黒流組 vs. 波城組の対決が舞台で、北岡がメイン。遼のほうのストーリーも謎の展開に。主人公は2ページしか出てこない(笑)
黒流組 vs. 波城組の対決が舞台で、北岡がメイン。遼のほうのストーリーも謎の展開に。主人公は2ページしか出てこない(笑)
「クマムシ?!?小さな怪物」
「最強の生物」とか「不死身」とか、あるいは「キモカワイイ」とかいわれている(らしい)クマムシを専門にとりあげた本。
しかも、飼育日記を中心に、極端な状況じゃなくて実際の生態を見せてくれる。軽めの文章や、さまざまなイラストとで、読みやすい。中でも、著者も書いているように、マルクス夫妻のクマムシ図がカワイイ。
アンケートハガキを見て、クマムシのヌイグルミがちょと欲しくなった。
しかも、飼育日記を中心に、極端な状況じゃなくて実際の生態を見せてくれる。軽めの文章や、さまざまなイラストとで、読みやすい。中でも、著者も書いているように、マルクス夫妻のクマムシ図がカワイイ。
アンケートハガキを見て、クマムシのヌイグルミがちょと欲しくなった。
「Web2.0が殺すもの」
タイトルとかうさんくさいので避けていたけど、ふと読んでみたら「案外」おもしろかった。PC9801とかパソコンサンデーとかいった話が多かったので、読み飛ばしながら30分の電車で読み終えちゃったんだけど。
ようするに「mixiがWeb2.0なら、2ちゃんねるだってWeb2.0だろう」というようなツッコミを入れているだけの本。ただし、 AmazonのロングテールってようするにWeb2.0じゃなくてデカい倉庫じゃね?といったようなネット住民が普通に思うような考察はないので期待しないように。
ちなみに著者は、「みんなの意見は案外正しい」を(10p程度しか)読んでないだろうなとは思った。
5章後半で見るに、本書の結論は「テレビやインターネットばかり見てるとバカになる」ということらしい(大宅壮一インスパイヤ?)。
ようするに「mixiがWeb2.0なら、2ちゃんねるだってWeb2.0だろう」というようなツッコミを入れているだけの本。ただし、 AmazonのロングテールってようするにWeb2.0じゃなくてデカい倉庫じゃね?といったようなネット住民が普通に思うような考察はないので期待しないように。
ちなみに著者は、「みんなの意見は案外正しい」を(10p程度しか)読んでないだろうなとは思った。
5章後半で見るに、本書の結論は「テレビやインターネットばかり見てるとバカになる」ということらしい(大宅壮一インスパイヤ?)。
「まっとうな経済学」
「ヤバい経済学」風の書名と表紙。そして、「ヤバい経済学」の著者の片方が推薦しているオビ。
という要素を見ると「ヤバい経済学」の二番煎じ本っぽい。が、中身の方向性はぜんぜん違った。
本書では第3章をまるまる割いているように、市場原理のモデルが前提にあり、それを解説しているという意味でオーソドックスな経済学のモデルの一般向け解説書だと思う。
そして希少性や情報の欠落、外部性などの「市場の失敗」を解説。ほか、「美人投票」問題やゲーム理論、中国の成長、グローバリムなどを章ごとに解説している。
という要素を見ると「ヤバい経済学」の二番煎じ本っぽい。が、中身の方向性はぜんぜん違った。
本書では第3章をまるまる割いているように、市場原理のモデルが前提にあり、それを解説しているという意味でオーソドックスな経済学のモデルの一般向け解説書だと思う。
そして希少性や情報の欠落、外部性などの「市場の失敗」を解説。ほか、「美人投票」問題やゲーム理論、中国の成長、グローバリムなどを章ごとに解説している。
CustomFeed::Configでhome.impress.co.jpの新刊情報
前のエントリーに続いて、「コンピュータ系新刊情報」のPlagger化。 今度はhome.impress.co.jp。これはCustomFeed.Configでいける。
●~/lib/plagger/assets/plugins/CustomFeed-Config/homeimpress.yaml
●homeimpress.yaml
●~/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
●cbook24.yaml
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*次 へ \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/\ //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ページがいいですよね。
「都市伝説」は、偶然っぽいネタが論理でつながるところが面白い、新本格っぽい話。必ずしも理詰めではないんだけど、話の進めかたがとっても面白い。登場人物たちもいい感じ。
「失われたレリーフ」は、タイトルの元になっている3つの指輪にまつわる競争の話。94~95ページがいいですよね。
「都市伝説」は、偶然っぽいネタが論理でつながるところが面白い、新本格っぽい話。必ずしも理詰めではないんだけど、話の進めかたがとっても面白い。登場人物たちもいい感じ。
「Q.E.D」25巻
毎回、単行本が出るのが楽しみな本格ミステリーマンガ「Q.E.D.」の新作。といっても発売から1か月弱たってしまったが。
この巻では「宇宙大戦争」と「パラレル」の2作を収録している。前者は、おなじみになった「探偵同好会」シリーズのドタバタコメディ。後者は、特に初期によくあったような切ない結末の話。
「余詰めなしの謎解き」や「あっと驚く伏線」は少なめの巻だが、それでも激しく面白い。
この巻では「宇宙大戦争」と「パラレル」の2作を収録している。前者は、おなじみになった「探偵同好会」シリーズのドタバタコメディ。後者は、特に初期によくあったような切ない結末の話。
「余詰めなしの謎解き」や「あっと驚く伏線」は少なめの巻だが、それでも激しく面白い。