Hatena::Groupfragments

甘くておいしいおイモだよー このページをアンテナに追加 RSSフィード

2006-10-29

あーまた貼られてる 15:22 あーまた貼られてる - 甘くておいしいおイモだよー を含むブックマーク はてなブックマーク - あーまた貼られてる - 甘くておいしいおイモだよー

誰が貼ったんでしょう。貼られる分には一向に構わないんだけど思考停止気味に自演乙とのたまう輩が可視化されてしまうことだけが気に入らない。

トラックバック - http://fragments.g.hatena.ne.jp/SweetPotato/20061029

2006-10-25

「この6・6ばかり出るサイコロは何だ!? グラサイか!?」という言葉が懐かしい 23:34 「この6・6ばかり出るサイコロは何だ!? グラサイか!?」という言葉が懐かしい - 甘くておいしいおイモだよー を含むブックマーク はてなブックマーク - 「この6・6ばかり出るサイコロは何だ!? グラサイか!?」という言葉が懐かしい - 甘くておいしいおイモだよー

http://fragments.g.hatena.ne.jp/mutronix/20061025/p2

久しくカタンやってないけど無性にやりたくなってきた。イエサブに行けばできるかな。

2006-10-21

Plagger::Plugin::CustomFeed::MelonBooks 15:49 Plagger::Plugin::CustomFeed::MelonBooks - 甘くておいしいおイモだよー を含むブックマーク はてなブックマーク - Plagger::Plugin::CustomFeed::MelonBooks - 甘くておいしいおイモだよー

【追記(11/14 13:26)】このエントリの最新版は CustomFeed::MelonBooks - SweetPotato::Plagger - Plaggerグループに移動しました。以後,こちらのエントリは更新しません。

【追々記(10/22 17:02)】同人誌,同人ソフト,同人グッズのリストに対応した。

【追記(10/22 3:28)】id:otsuneさんの指摘を受け,Subscription→CustomFeedとした。

メロンブックス通信販売のページの入荷日別アイテムリストを取得し,アイテム毎にエントリを作成するP::P::SubscriptionCustomFeedを作った。

現在は同人誌のリストしか取得していない。新入荷の同人誌が無い場合はdieになる点に注意。同人ソフトなどの他のリストの取得については時間があれば対応予定。同人誌,同人ソフト,同人グッズのリストに対応した。

Plagger/Plugin/CustomFeed/MelonBooks.pm

package Plagger::Plugin::CustomFeed::MelonBooks;

use strict;
use warnings;

use base qw( Plagger::Plugin );

use Plagger::Util;
use Plagger::Feed;
use Plagger::Entry;

use URI;
use HTML::TreeBuilder::XPath;

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

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

    my $day = $self->conf->{day} || _today(time);

    my $feed = Plagger::Feed->new;
    $feed->aggregator( sub { $self->aggregate($context, $day); });
    $context->subscription->add($feed);
}

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

    my $feed = Plagger::Feed->new;
    $feed->title("MelonBooks $day");

    $day =~ s!/!%2F!g;

    $self->_parse_items($context, $feed, $day, "%C6%B1%BF%CD%BB%EF",             1); # Dojinshi
    $self->_parse_items($context, $feed, $day, "%C6%B1%BF%CD%A5%BD%A5%D5%A5%C8", 0); # Dojin Soft
    $self->_parse_items($context, $feed, $day, "%C6%B1%BF%CD%A5%B0%A5%C3%A5%BA", 0); # Dojin Goods

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

sub _parse_items {
    my($self, $context, $feed, $arrival, $genre, $is_dojinshi) = @_;

    my $dispstart = 0;
    while(1) {
        my $uri = URI->new("http://shop.melonbooks.co.jp/tsuhan/system/list.php?RATED=18&DISPACTION=disppage&ARRIVAL=$arrival&DISPSTART=$dispstart&GENRE=$genre&DISPEMPTY=&CHGRATE=&DISPSTARTCHG=0&DISPORDER=maker&DISPPAGE=10&DISPSTYLE=desc");
        my $data = Plagger::Util::load_uri($uri);

        if($data =~ /<OPTION VALUE="(\d+)" SELECTED >/) {
            last if $dispstart != $1;
        } else { last };

        my $tree = HTML::TreeBuilder::XPath->new;
        $tree->parse($data);
        my $path = '//body//table[@bordercolor="white"]';
        my $booknodes;
        eval {
            $booknodes = $tree->findnodes($path);
        } or die $@;

        for my $item (@$booknodes) {
            $self->_add_item($context, $feed, $item, $is_dojinshi);
        }

        $dispstart += 10;
    }
}

sub _add_item {
    my($self, $context, $feed, $item, $is_dojinshi) = @_;

    my $html = $item->as_HTML('<>&');

    my ($id, $title, $circle, $tags);
    if($is_dojinshi && $html =~ m!<td bgcolor="whitesmoke" valign="middle"><.*?>(.*?)</.*?>.*?<td bgcolor="whitesmoke" valign="middle"><.*?><.*?>(.*?)</.*?>.*?<td bgcolor="whitesmoke" valign="middle"><.*?>(.*?)</.*?>.*?<td bgcolor="whitesmoke" valign="middle"><.*?><.*?>(.*?)</.*?>.*?!) {
        ($title, $circle, $id, $tags) = ($1, $2, $3, [$4]);
    } elsif($html =~ m!<td bgcolor="whitesmoke" valign="middle"><.*?>(.*?)</.*?>.*?<td bgcolor="whitesmoke" valign="middle"><.*?><.*?>(.*?)</.*?>.*?<td bgcolor="whitesmoke" valign="middle"><.*?>(.*?)</.*?>.*?<td bgcolor="whitesmoke" valign="middle"><.*?><.*?>(.*?)</.*?>.*?<td bgcolor="whitesmoke" valign="middle"><.*?><.*?>(.*?)</.*?>.*?!) {
        ($title, $circle, $id, $tags) = ($1, $2, $3, [$4, $5]);
    } else { return };

    my $link = "http://shop.melonbooks.co.jp/tsuhan/system/detail.php?RATED=18&ITEM_ID_FULL=$id";
    my $body =
        join '',
        map {
            qq!<img src="http://shop.melonbooks.co.jp/img/$id$_.gif" />!
        } ("", "a", "b");

    my $entry = Plagger::Entry->new;
    $entry->title($title);
    $entry->link($link);
    $entry->body($body);
    $entry->author($circle);
    $entry->tags($tags);
    $feed->add_entry($entry);
}

sub _today {
    my @t = localtime(shift);
    my $yyyymmdd = sprintf("%04d/%02d/%02d", $t[5] + 1900, $t[4] + 1, $t[3]);
    return $yyyymmdd;
}

1;

config.melonbooks.yaml

- module: CustomFeed::MelonBooks
    config:
      day: 2006/10/19

dayのフォーマットは%Y/%m/%dで。省略した場合は今日入荷したアイテムの情報を取得する。

スクリーンショット(Publish::Gmail

f:id:SweetPotato:20061021160745p:image

謝辞

コードはPlagger::Plugin::Subscription::Toranoana - fubaはてなを多分に参考にしました。d:id:fubaさんに感謝します。

はてなしりとり鬼門候補 03:17 はてなしりとり鬼門候補 - 甘くておいしいおイモだよー を含むブックマーク はてなブックマーク - はてなしりとり鬼門候補 - 甘くておいしいおイモだよー

はてなしりとりに限った話じゃないけど,その文字で始まる言葉が少なく,かつその文字で終わる言葉が多いような文字ほど,ターンを重ねるごとにしりとりが難しくなっていく。

はてなキーワードのうち,その文字で始まるようなキーワードが少ない文字は以下の通り。ただし小文字と「ん」は除いている。「ず」もちゃんと入っている。

その文字で終わるようなキーワードも「ず$」みたいな感じで調べられればいいんだけど無理っぽい。

ただ,旧字の「ゐ」と「ゑ」を含むキーワードはそもそも少ないので,それらで終わるキーワードは調べ尽くせた。

otsuneotsune2006/10/22 02:47定義的にSubscriptionじゃなくてCustomFeedか?

SweetPotatoSweetPotato2006/10/22 03:33> Subscription: Load subscription (list of feeds)
> CustomFeed: Parse non-RSS format
言われてみればそうですね。訂正しました。
あと,はてブコメント欄の
> 野良じゃなくちゃんと作るのならCustomFeed::Configあたりかな
の指摘ですが,取得対象のリストが複数のページに分かれているので,CustomFeed::Configでは難しいと思い,このようにしました。

fubafuba2006/10/22 11:25お、素晴らしいです。
PPS::ToranoanaがSubscriptionなのは、実店舗のフィードも含めて複数フィード生成できるからなので、これなら確かにCustomFeedですね。

2006-10-20

漫画レビューについての大手漫画サイト最適化(MCSO=Major Comic Site Optimization) 21:30 漫画レビューについての大手漫画サイト最適化(MCSO=Major Comic Site Optimization) - 甘くておいしいおイモだよー を含むブックマーク はてなブックマーク - 漫画レビューについての大手漫画サイト最適化(MCSO=Major Comic Site Optimization) - 甘くておいしいおイモだよー

  1. 文章の量を多くする
  2. 内容のスキャン画像をふんだんに使用する
  3. エロさを殊更に強調する
トラックバック - http://fragments.g.hatena.ne.jp/SweetPotato/20061020

2006-10-10

SBMの検索性能の向上と認知限界はフォークソノミーを殺す 02:59 SBMの検索性能の向上と認知限界はフォークソノミーを殺す - 甘くておいしいおイモだよー を含むブックマーク はてなブックマーク - SBMの検索性能の向上と認知限界はフォークソノミーを殺す - 甘くておいしいおイモだよー

ブクマにタグをつけるのは分類のため。分類するのは自分が将来そのブクマを探しやすくするため。少なくともタグについての自分の認識はこうだ。

だけど「将来そのブクマを探しやすく」するための手段はタグに限ったことではない。それは分類と対になる手法,検索だ。「整理するな,検索せよ」だ。

少なくとも今のはてブの検索機能は貧弱で,タグに代わるブクマ発見手段にはならない。しかし検索性能が向上した日には,はてなに関する記事に[はてな]なんてタグをつけるのがバカらしくなるだろう。

それでもブクマにタグをつけ続けるとどうなるか。いつか整理・分類しきれなくなるだろう。情報を処理する行為が苦痛になるだろう。これは認知限界からも必然だ。

かくして人々はタグ付けをやめる。多くのブクマが集まるほど,タグ付けが行われなくなるとは,フォークソノミーを夢見る者たちにとっては,なんとも皮肉なことだ。

トラックバック - http://fragments.g.hatena.ne.jp/SweetPotato/20061010

2006-10-07

太洋社コミック発売一覧のCustomFeed-Config 03:03 太洋社コミック発売一覧のCustomFeed-Config - 甘くておいしいおイモだよー を含むブックマーク はてなブックマーク - 太洋社コミック発売一覧のCustomFeed-Config - 甘くておいしいおイモだよー

最初はまんがの森新刊コミックリストのを作ろうと思ったけど,結局切り出しが楽な太洋社コミック発売一覧の方を作った。「発売日・出版社順(リスト)」および「出版社・発売日順(リスト)」のページからフィードを生成する。ただし一部のコミックについてはデータが上手く切り出せない(後述)。

まず,作者と出版社のデータを有効活用したいなあと思ったので,Seacolor's Labs.さんのP::P::CustomFeed::Configを改造し,authorとtagsが使えるようにする。これには $feed->add_entry($entry); が書かれている行の直前に以下を追加する。

$entry->author($plugin->{extract_encoding}
    ? decode($plugin->{extract_encoding}, $data->{author})
    : $data->{author}
    ) if $data->{author};
if($data->{tags}){
    my @tags = $plugin->{extract_encoding}
        ? map { decode($plugin->{extract_encoding}, $_) } @{$data->{tags}}
        : @{$data->{tags}};
    $entry->tags(\@tags);
}

そしてCustomFeed-Config/taiyosha.yaml。コミックのタイトルと巻数がエントリのタイトルになる。作者名や出版社もタイトルに入れたければ,これを適当に改造すればOK。

author: SweetPotato
match: http://www\.taiyosha\.co\.jp/comic/comic\d{4}_list(?:date|han)\.html
extract: <li>((\d{2})/(\d{2})\x{3000}{2}(.*?)\x{3000}{2}(.*?)\x{3000}{2}(.*?)\x{3000}{2}\\(\d+)).*?</li>
extract_capture: body month day publisher title author price
extract_after_hook: |
    my $year = ($url =~ qr!http://www\.taiyosha\.co\.jp/comic/comic(\d{2})\d{2}_list(?:date|han)\.html!)[0];
    $data->{date} = Plagger::Date->strptime("%y%m%d", "$year$data->{month}$data->{day}");
    $data->{body} = "<div>$data->{body}</div>";
    $data->{tags} = [$data->{publisher}];

あとはtaiyosha.config.yaml。Publishはお好みのものを。Publish::iCalはなぜか手元に無かったので試せず。

plugins:
  - module: Subscription::Config
    config:
      feed:
        - url: http://www.taiyosha.co.jp/comic/comic0611_listdate.html

  - module: CustomFeed::Config

問題は,一部のコミックについて,巻数が作者名の一部として切り出されてしまうこと。

上記のCustomFeed-Config/taiyosha.yamlは,各レコードのカラムの順番は日付,出版社,タイトル(巻数),作者,価格で,それらがそれぞれ2個の全角空白で区切られていることを前提としている。

しかし一部のレコードでは,データ入力者の不手際によるのだろうか,タイトルと巻数の間に2個の全角空白が入っている(通常は1個)。2006年11月分 発売日・出版社順(リスト)については,例えば,

11/30  リイド社  ゴルゴ13  96  さいとう たかを  \500

というレコードが存在するが,ここから切り出されるtitleとauthorは

  • title: ゴルゴ13
  • author: 96  さいとう たかを

となる。解決策は今のところ思いつかず。誰かなんとかしてくれると嬉しい。

あと,毎月configのurlを書き換える必要があり,それがちょっと面倒かも。

# IT田みつほバトンどうもです。あとでやります。

acqua_altaacqua_alta2006/10/07 03:33うわっ!あまりの対応の速さに驚きです!
感謝してもしきれません。ありがとうございます…。(つД`) 

あと、バトンは無理にとは言わないので(そろそろ旬を過ぎたような気もしますし…)。

SweetPotatoSweetPotato2006/10/07 04:14コメントありがとうございます。こんなのでよければ適宜カスタマイズして使ってやって下さい。
バトンについて,お気遣いありがとうございます。正直なところを言いますと,自分はネタが苦手な人間なのでどうしようかと思ってました(汗)。では失礼ながら,バトンのお気持ちだけ頂いて,バトンは地面に置かせていただきます。

2006-10-03

もう「ず」はええっちゅうねん 02:04 もう「ず」はええっちゅうねん - 甘くておいしいおイモだよー を含むブックマーク はてなブックマーク - もう「ず」はええっちゅうねん - 甘くておいしいおイモだよー

はてなしりとりで「ず」が出るたびに困る。必死で思いついた「ズームイン」は語尾が「ん」。

キーワード一覧 「^ず」を含むキーワード - はてなキーワードカンニングすることもできるんだけど,それじゃ面白くないしなあ。

nobodynobody2006/10/03 02:22[もずはえ] うひゃー、どうもすいません。。。まいかい「ずうとるび」というボケというか様式美みたいなのを(個人的には)想定ないし期待してたのですが、ご迷惑をおかけしてたみたいで……。というわけで、「ず」でなくしておきました。どうぞご利用くだsあい。

SweetPotatoSweetPotato2006/10/03 02:57実はそんな意図が!>様式美
何かわがまま聞いていただいてすいません……。「ず」が出る度に毎回「ずうとるび」が最初に頭に浮かんで,でも既出だからなあと悶えてたところです。
あと「き」だと「キンコーズ」で再び「ず」に戻せるのは秘密です。

トラックバック - http://fragments.g.hatena.ne.jp/SweetPotato/20061003