Rubyちょうたのしい日記

2006-08-17

delete_ifの逆 14:54 はてなブックマーク - delete_ifの逆 - Rubyちょうたのしい日記

 って無いのかな。「trueを返したものだけ残す」っていう。

 「絞り込む」みたいな動詞で

selectselect2006/08/18 13:05Enumerable::select

kusigahamakusigahama2006/08/18 13:10あーEnumerableの方にあったんですね。非破壊rejectがヘルプに無くて変だなーとは思ってたんだけど。なるほど。ありがとうございます。

2006-08-16

Plaggerを眺める (3) 11:29 はてなブックマーク - Plaggerを眺める (3) - Rubyちょうたのしい日記

 /examples/yapcvideo.yaml を手にとってみる。

# Generate videocast feed (RSS 2.0) from archive.org search result page

plugins:
  # Subscribe to the archive.org tag search page
  - module: Subscription::Config
    config:
      feed:
         - url: http://www.archive.org/search.php?query=subject:%22yapc%22

  # Upgrade entry body to fulltext
  - module: Filter::EntryFullText

  # Find Enclosures from entry body by looking for links to mov/mp4 files
  - module: Filter::FindEnclosures

  # Issue HEAD requests to found enclosures to know HTTP Content-Length
  - module: Filter::HEADEnclosureMetadata

  # Create RSS 2.0 feed out of those enclosures
  - module: Publish::Feed
    config:
      format: RSS
      dir: /vh/tokyo.yapcasia.org/htdocs
      filename: video.xml

 まぁ、大体素直に読み下せる。

 共通のデータ形式があって、それを扱う複数のモジュールがあって、順繰りに式を適用していくと。

Publish::Feed(
  {
    :format => 'RSS',
    :dir: '/vh/tokyo.yapcasia.org/htdocs',
    :filename: "video.xml"
  },
  Filter::HEADEnclosureMetadata(
    Filter::FindEnclosures(
      Filter::EntryFullText(
       Subscription::Config({ url => 'http://www.archive.org/search.php?query=subject:%22yapc%22' })
      )
    )
  )
)

 みたいな。……いやもっと綺麗に書けるだろうけど(配列とinjectか)。

 FindEnclosuresがちょっと良くわかんない。mov/mp4を落としてくるという話だと思うんだけど。"by looking for"って「探す」だっけ。エンクロージャってなんだ。囲い(をすること), へい, 垣根, 匡体…… Plagger内用語なのか。

 設定ファイル的な意味では全部設定ファイルなのか。Convention over Configurationと。

 /assets/plugins/Filter-EntryFullText/には、例えば以下のslashdot_jp.yamlのようなファイルが沢山ある。

# upgrade http://slashdot.jp/slashdotjp.rss
author: Tatsuhiko Miyagawa
handle: http://slashdot.jp/.*?article\.pl\?
extract: (<div class="introtext">.*?</div>).*?(<div class="bodytext">.*?</div>)?
extract_capture: body more
extract_after_hook: $data->{body} .= $data->{more} if $data->{more}

 /lib/Plagger/Plugin/Filter/EntryFullText.pmがこれを読んでるのかな。


Plaggerを眺める (4) 11:43 はてなブックマーク - Plaggerを眺める (4) - Rubyちょうたのしい日記

 コードそのものではなくデータファイルを使う理由はなんだろう。コード断片を値として使う部分もあるようだけど。だから主従関係。対象を絞ることによる定型句の削除。これで柔軟性は十分だという判断。「流れるデータはどんなものか」を知りたい。Filter::BreakEntriesToFeedsなんてのもあるくらいだし……これを見てみればいいか。

package Plagger::Plugin::Filter::BreakEntriesToFeeds;
use strict;
use base qw( Plagger::Plugin );

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

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

    for my $entry ($args->{feed}->entries) {
        my $feed = $args->{feed}->clone;
        $feed->clear_entries;
        $feed->add_entry($entry);
        $feed->title($entry->title)
            if $self->conf->{use_entry_title};
        $context->update->add($feed);
    }

    $context->update->delete_feed($args->{feed});
}

1;

 短い。

 とてもそうは見えないけど、これはperlにおけるクラスの定義だった筈で、registerとbreakはBreakEntriesToFeedsクラスのメソッドと。

 registerがcontext付きで呼ばれ、contextに対しregister_hookで自分&'update.feed.fixup'のタイミングで自分::breakを呼んでくりゃれと登録と。

 break内は、まーそんな感じであると。

 しかしregister_hookは意外だなぁ。プラグインさんが自分で指定するのか。単純にmoduleを指定した順かと思った。


Plaggerを眺める (5) 11:50 はてなブックマーク - Plaggerを眺める (5) - Rubyちょうたのしい日記

 lib/Plagger/Plugin/内には以下のフォルダがある。

Aggregator
Bundle
CustomFeed
Filter
Notify
Publish
Search
SmartFeed
Subscription
UserAgent
Widget

 果たす役割が異なり、多分それぞれにテンプレートがあって、渡されるものが違ったりする、のかな。

 Notify::SSTPはpublish.feedにregister_hookされている。中身は、SSTP/1.4書式のsstp.ttにargs->feed->entryを埋め込み、9801に投げるという予想通りのもの。あとcontext->logを呼んでる。

Plaggerを眺める (6) 14:07 はてなブックマーク - Plaggerを眺める (6) - Rubyちょうたのしい日記

 Plaggerを「使う」のにPerlの知識は必要ない。対応サイトを増やすにしても正規表現が使えれば十分。なので、インストーラとドキュメントがあれば普及してしまいそう。YAMLを吐く上手いGUI皮があれば、かなり遠くまで届くだろうと思う。もっともまだ普及させる段階ではなく遠慮なく仕様変更して完成度あげてみたいな話をどっかで聞いたような。コードからはこれまで個別にちょいちょいと作っていた諸々をまとめあげようという意志を感じる。

 でだ。私の欲しいものは何か。

 諸々Ruby製があれば自分で何かするのに楽ではある。

 エントリにコメントをするための情報が欲しいな。urlだけでもsocialbookmarkには十分だけど。

 Publish/以下はテンプレートを使った出力? でWidget以下には http://b.hatena.ne.jp/append を呼ぶ  HatenaBookmark.pm なんてのがあったりするな。

 ばくみくみたいなのつくれるかしら

 つまり色んな人が各サイトのPlagger向け共通APIを作れるようになってるわけだ。Pluginとして。

 共通データ形式としてfeedとentryを持って。