2006年4月アーカイブ

Kazuhoさんが作られた Lingua::JA::Summarize を TT から使うためのモジュールを作成してみた。


使い方はシンブルで、
[% USE summarize = Lingua.JA.Summarize("ここにsummarizeしたいテキスト") %]
[% FOREACH keyword = summarize.keywords %]
[% keyword %]
[% END %]
こんな感じです。
また下記のように keywords にオプションもハッシュリファレンスで渡せるようになってます。
[% USE summarize = Lingua.JA.Summarize("ここにsummarizeしたいテキスト", { maxwords => 10 }) %]
Lingua::JA::Summarize はいろいろ使い道が考え付くので今後期待ですね。まだCPANには上がってないですが、今後上げる予定はあるのかなー? ちなみに Template::Plugin::Lingua::JA::Summarize は Lingua::JA::Summarize が CPAN に上がったら、その後に上げようと思っています。
私的なものばかりですが、いつも忘れていろんなサーバに探しに行くので、メモっておこうと思って書きました。 他にお勧めがあったら教えてください。
  1. 同名のファイルを開いたとき Switch to buffer などでファイル名がわかりやすく見えるようになる設定
  2. (require 'uniquify)
    (setq uniquify-buffer-name-style 'post-forward-angle-brackets)
    これを設定するとファイル名が同名だった場合にそのファイル名の後ろに file.txt<foo> file.txt<bar> といった感じで一階層上のディレクトリ名がでるようになります。もしその階層のディレクトリ名も同じだったら、もう一階層上のディレクトリ名も出て、違いがわかるまでディレクトリ名が出るようになります。

  3. HTMLなどのコーディングで META タグにあるコーディングで保存されないようにする設定
  4. (delete 'sgml-html-meta-auto-coding-function auto-coding-functions)
    METAタグに charset="Shift_JIS"なんて書いてあったりすると、そのエンコーディングで保存しようとするんですが、それを無視する設定です。※環境によっては動かないという報告が…。

  5. 選択部分を一気にインデントにする indent-region のキーバインドの設定
  6. (global-set-key "\C-x\C-i" 'indent-region)

  7. find-fileのファイル名補完で大文字小文字を区別しない設定
  8. (setq completion-ignore-case t)
    追記
    もしくは、
    (setq read-file-name-completion-ignore-case t)

  9. shebangが付いているファイルのパーミッションを保存時に +x にしてくれる設定
  10. (add-hook 'after-save-hook 'my-chmod-script)
    (defun my-chmod-script() (interactive) (save-restriction (widen)
     (let ((name (buffer-file-name)))
      (if (and (not (string-match ":" name))
               (not (string-match "/\\.[^/]+$" name))
               (equal "#!" (buffer-substring 1 (min 3 (point-max)))))
         (progn (set-file-modes name (logior (file-modes name) 73))
                (message "Wrote %s (chmod +x)" name)
        ))
    )))

  11. 画面上下の端の外にスクロールしたときの移動量を1にする設定
  12. (setq scroll-step 1)

  13. 対応する括弧をハイライト表示させる設定
  14. (show-paren-mode t)

  15. 選択されたリージョンを色付きにしてわかりやすくする設定
  16. (transient-mark-mode t)

  17. emacsのVCでバッファの履歴を引き継ぐための設定(→参考:ひげぽんのブログで知って以来使ってる)
  18. ;; checkin 後に実行される関数をフック
    (add-hook 'vc-checkin-hook
              '(lambda ()
                  (setq buffer-undo-list higepon-san)))
    
    ;; checkin 前に実行される関数をフック
    (add-hook 'vc-before-checkin-hook
              '(lambda ()
                 (setq higepon-san buffer-undo-list)))

  19. pcl-cvsのcvs-examineを一発で呼出すキーバインドの設定
  20. (global-set-key "\C-xe" 'cvs-examine)


GNU Emacsデスクトップリファレンス
デブラ キャメロン Debra Cameron 日本ルーセントテクノロジー
オライリー・ジャパン (1999/06)
売り上げランキング: 115,172
おすすめ度の平均: 2.5
1 オンラインドキュメントがあれば十分
4 GNU Emacsコマンドリファレンス

入門GNU Emacs
入門GNU Emacs
posted with amazlet on 06.04.26
デボラ キャメロン エリック レイモンド ビル ローゼンブラッド Debra Cameron Eric Raymond Bill Rosenblatt 福崎 俊博
オライリー・ジャパン (1999/09)
売り上げランキング: 67,142
おすすめ度の平均: 5
5 明快な語り口調で・・・

こないだ VMWare Player を導入したんだけど、どうも1、2日ずっと使ったり、ノートで使ってるのでスリープしたり再開したりを繰替えしていると Load Average が上ってるわけでもないのに動きがもっさりしてきてしまう。。。

なにが悪いんだろうか。ちなみにディストリビューションは ubuntu を入れてるんですが、そのせいなのかなぁ。

VMWare Player を再起動すると直る。colinu だとそんなことなかったのにな。戻すかどうかもうちょっと使ってから考えよう。

あのモジュールでしたいことは、まさに「それPlaggerでやればいいんじゃね?」で実現できることでした。。。
#みやがわさんにヒントもらいますた。thanx!

やりたいこと(1つのファイルにフィードを吐き出す)は、Plagger の SmartFeed という機能を使って実現できます。
やり方は、まぁいろいろあるのですが、一番シンプルなのは下記。

  - module: SmartFeed::All

  - module: Publish::Feed
    rule:
      expression: $args->{feed}->id eq 'smartfeed:all'
    config:
      format: Atom
        dir: /home/yoshiki/public_html/feed
        title: foo
このように rule で id が smartfeed:all の記事をまとめて Publish すればいいわけです。なんでこれでできるかというと、SmartFeed::All プラグインをロードしておけば smartfeed 処理のプロセスの中で、すべてのエントリを1つの Plagger::Feed にまとめてくれて、そのフィードの id に smartfeed:all という名前を付けてくれます。で、最後の Publish するときに id が smartfeed:all のフィード(つまりすべてのエントリをまとめたフィード)のみを吐き出してくれるという仕組みです。

その他にも下記のように Rule::FeedAttr とかで id が smartfeed:all のやつを Publish とかもできます。また、SmartFeed::All を使ってるのが前提ですが Rule::FeedType で type が smartfeed のやつって指定でもできなくはないです。

  - module: SmartFeed::All

  - module: Publish::Feed
    rule:
      - module: FeedAttr
         attrs:
           name: id
           value:
              - smartfeed:all
    config:
      format: Atom
        dir: /home/yoshiki/public_html/feed
        title: foo
今まであんま近寄らなかった SmartFeed という機能を改めて知ったある日の夜でした。。。
追記:これ使わなくても同じ機能は実現できます→http://clouder.jp/yoshiki/mt/archives/000671.html 1つのファイルに吐き出したかったので作った。P::P::P::Feedとマージするのは微妙…。とりあえず自分用ということで。
package Plagger::Plugin::Publish::OneFeed;

use strict;
use base qw( Plagger::Plugin );

our $VERSION = 0.01;

use XML::Feed;
use XML::Feed::Entry;
use XML::RSS::LibXML;
use File::Spec;

# xxx ugh
$XML::Feed::RSS::PREFERRED_PARSER =
    $XML::RSS::LibXML::VERSION >= 0.16 ? "XML::RSS::LibXML" : "XML::RSS";

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

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

    # check filename
    $self->conf->{filename} or $context->error("No specify filename in config");

    # check dir
    my $dir = $self->conf->{dir};
    unless (-e $dir && -d _) {

        mkdir $dir, 0755 or $context->error("mkdir $dir: $!");
    }
}

sub publish_feed {
    my($self, $context, $args) = @_;
    for my $e ($args->{feed}->entries) {
        my $entry = XML::Feed::Entry->new($self->conf->{format} || 'Atom');
        $entry->title($e->title);
        $entry->link($e->link);
        $entry->summary($e->body_text);
        $entry->content($e->body);
        $entry->category(join(' ', @{$e->tags}));
        $entry->issued($e->date) if $e->date;
        $entry->author($e->author);
        push @{ $self->{__entries} }, $entry;
    }
}

sub finalize_feed {
    my($self, $context) = @_;
    my $conf = $self->conf;

    # generate feed
    my $feed = XML::Feed->new($conf->{format} || 'Atom');
    $feed->title($conf->{title} || "Plagger Feed");
    $feed->link($conf->{link});
    $feed->modified(Plagger::Date->now);
    $feed->generator("Plagger/$Plagger::VERSION");

    for my $entry (sort { $b->issued cmp $a->issued } @{$self->{__entries}}) {
        $feed->add_entry($entry);
    }

    # generate file
    my $filepath = File::Spec->catfile($conf->{dir}, $conf->{filename});
    my $xml = $feed->as_xml;
    utf8::decode($xml) unless utf8::is_utf8($xml);
    open my $output, ">:utf8", $filepath or $context->error("$filepath: $!");
    print $output $xml;
    close $output;
}

1;

__END__

=head1

Plagger::Plugin::Publish::OnFeed - republish RSS/Atom feeds as one file

=head1 SYNOPSYS

  - module: Publish::Feed
    config:
      format: RSS
      dir: /home/yoshiki/plagger/feed
      filename: my_feed.rss

=head1 CONFIG

=head2 format

Specify the format of feed. C<Plagger::Plugin::Publish::OneFeed> supports
the following syndication feed formats:

=over 4

=item * Atom (default)

=item * RSS

=back

=head2 dir(require)

Directory to save feed files in.

=head2 filename(require)

Filename to be used to create feed files.

=head1 AUTHOR

Yoshiki KURIHARA

=head1 SEE ALSO

L<Plagger>, L<XML::Feed>

=cut

firefox1.5.0.2.gif
Firefox の ver 1.5.0.2 がリリースされたみたいです。こんな更新アラートが出た。あれ、これって前からあったっけか…。

ちなみに、自分の入れてる機能拡張でバージョンアップにともなって使えなくなったのは keyconfig だけでした。でもこれはイタイ…。他に同じようなことできるものがあるか探してみるか。

使用している機能拡張はこれ↓
Tab Mix Plus
Super DragAndGo
Mouse Gestures
PrefButtons
Web Developer
Google Toolbar for Firefox
Download Statusbar
SwitchProxy Tool
bbs2chreader
Sage

Google Calendarが公開されたっぽ。
こないだ30boxes.comに乗り換えたばかりですがなにか?

でもiCal形式で統一されてるから移行は大丈夫だと思ふ。
うん、たぶん大丈夫。

と思って30boxesからiCal形式で出力したものをインポートしたらUTF-8なのに文字化けてる…。Googleの呪いですか。

まららんのやつを見てて、最初に設定されてるやつに追加で他のタグも入力したいなぁと思ったのでプロンプトを出してタグを入力できるようにしたブックマークレット。
ほぼパクりです(オイ

post toread

「USERNAME」のところだけ書き換えてご使用ください。またデフォルトのタグが toread になってますが、それも toread と書いてあるところを変えれば他のものにできます。ってまららんの作る奴に比べると不親切だな…。自分で変えろメソッド。

CPANの画像はリファラがsearch.cpan.org以外だと表示されないようです。
id:nipotanに聞いたらリファラを見てるらしい。知らなかったお。

試しにリファラを送らないで見てみてください。

% wget http://search.cpan.org/s/img/cpan-10.jpg
--23:55:32--  http://search.cpan.org/s/img/cpan-10.jpg
           => `cpan-10.jpg'
Resolving search.cpan.org... 216.52.237.135, 84.45.18.237
Connecting to search.cpan.org|216.52.237.135|:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
23:55:33 ERROR 403: Forbidden.

Exit 1

にぽたんの星の秘密とか弾さんのcompuri.plを見る限り、昔は見えていた模様…。いつから見えなくなったんだろうか。そしてなぜ見えなくしたんだろうか。

この二大ブログ(?)からのリファラがものすごかったからそうしたんだろうか?

typesterさんのCLONでコメントにFlickrの認証を使ってるんだけど、これいいね。顔写真まで出ちゃうのね。

今さらだけど、FlickrのAPIキー取得したりしていじってみたがよくできてるな。

下記に詳しい説明がありますので興味のある方はどうぞ。
http://www.machu.jp/diary/20051101.html
http://www.flickr.com/services/api/auth.howto.web.html

もう作ってる人いるっぽいが、あとでMT用のコメント認証プラグインを作る。

Engadget JapaneseというサイトのHTMLに書いてある日本語を euc-jp とか utf-8 にしたいのだけど、方法がわかりません。

ここのサイトのHTMLの meta を見ると charset="iso-8859-1" だということがわかります。ふむふむと思って見てみてもエンティティになっているっぽく「&#26684;&#23433;」こんな感じになっています。実際これをHTMLで書くと下記のようになります。

「格安」(←実際にはHTML内で「&#26684;&#23433;」こう書いてます)

このように「格安」とブラウザ上には表示されます。。。うーむ。どうやってこのエンティティをeuc-jpやutf8にするのかと小一時間。

use Encode;
use HTML::Entities;

print decode('iso-8859-1', decode_entities('&#26684;&#23433;')), "\n";

こんな感じにしてutf-8にしてみようと、やってみたりしたのですが、「Wide character in subroutine entry at /usr/lib/perl/5.8/Encode.pm line 166.」となってしまいます。。。

まだ調査途中なのですが、煮詰まったのでエントリを書いてみるテスト。もうちょと調査してみます。

Tue Apr 11 02:18:44 2006 追記
コメントでmiyagawaさんに教えてもらいました。decode_entitiesした時点でUnicodeになっているので、あとは utf-8 で出力したければ、encode('utf-8', decode_entities('&#26684;&#23433;')) したらよいようです。ちなみに euc-jp にしたけりゃ encode('eucjp', decode_entities('&#26684;&#23433;')); です。

Unix系のOSをいじっていて、突然キー入力ができなくなって ^q で元の入力状態に戻るというような現象にみまわれたことはないだろうか。そんな現象になるのはたいていフロー制御の stop モードになっていることが原因らしい。気付かない間に ^s を押してフロー制御の stop モードになっているのだろうと思う。

この現象になっている端末で emacs を使おうものなら、^x^sで保存ができなくなってしまうのだ。コワー。(まぁその場合でも^xsで一応保存はできるのだが)

ちなみに ^sが stop モードに割当てられているかどうかは、コマンドラインで

% stty -a

とやると確認できると思う。ちなみに ^q は start に設定されているはずである。^s で stop、^q で start とフロー制御をやるらしい。でもこんな状態になっていると emacs が満足に使えないので、自分は苦肉の策で、

% stty stop ''

として対応しました。これで ^s を押しても stop モードにはなりません。
でもこれって正しい解決法なんでしょうか…。

教えてエラい人!

YAPC::Asia 2006 ではてなおやさんが言っていた、Capistrano(旧SwitchTower)を使ってみようと思い、インスコして使ってみた。

あくまで Ruby 初心者が感じた感想ですが、元々 Capistrano は Ruby on Rails 用にできているため、素で Perl のプロジェクトには使えなそう。使うには Ruby でごにょごにょ書いてなんとかする力が必要そうです。

英語のページを見ればだいたい使い方はわかるけど、日本語での説明ページはあまりないようだ。参考にしたのは下記のページ達です。

http://manuals.rubyonrails.com/read/chapter/97
http://kawara.homelinux.net/pukiwiki/pukiwiki.php?SwitchTower

ということで、現状すぐに導入っていうのは難しそう。
Perl のデプロイツールを探してみたがいいのはなさそう。作れってことか!

Extractor に RSS と JSON の出力機能を追加しました。

使い方は簡単で、今まで「http://extractor.47objects.com/url?url=対象の URL 」とやってコメント一覧を見ていたと思いますが、この「/url?url=対象の URL 」の部分を「/rss/url?url=対象の URL 」もしくは「/json/url?url=対象の URL 」とするだけで各形式に変換されたリストが出力されます。

たとえば、今まで Extractor(http://extractor.47objects.com/) というページに対するコメントは下記のようなURLで見ていました。

http://extractor.47objects.com/url?url=http%3A%2F%2Fextractor.47objects.com%2F

これを RSS 形式ならば、↓

http://extractor.47objects.com/rss/url?url=http%3A%2F%2Fextractor.47objects.com%2F

JSON 形式ならば、↓

http://extractor.47objects.com/json/url?url=http%3A%2F%2Fextractor.47objects.com%2F

とするだけでそれぞれ形式でリストが出力されます。

出力される内容ですが、RSS は del.icio.us の RSS と同形式になっています。JSON に関しては下記のような形式になっています。

  • url
  • ブックマーク対象のページのURL
  • extractor_url
  • ExtractorのURL
  • comments
  • 各コメントのリスト
    • aggregator
    • 取得対象のソーシャルブックマークサービス名
    • creator
    • ブックマークしたユーザ名
    • date
    • ブックマークされた日付
    • tag
    • 付けられたタグをスペース区切りにしたもの
    • description
    • コメント内容

サービスの性質上、最初のアクセスに関してだけはコメントを集めてくるために多少ロード時間がかかると思いますが、1度ロードしてしまえば、1時間はキャッシュされますので早いと思います。

利用方法ですが、気になるページの RSS を RSS リーダーや Bloglines などに登録して新着のコメントを調べるとか、JavaScriptなどを使って自分のブログがブックマークされたらそのコメントを表示するとかいろいろとありそう。

ってまぁ、はてダもdel.icio.usもRSSを吐いてるので、それを使えばいいって話はおいといて…。一緒になってることに意味があると。。。

key: |
  this is example
  this is example

ってやるみたい。

ちなみに今一番知りたいのは、YAMLファイルで上の方で定義した値を下の方で使いたい場合どうするか。教えてエロい人!

foo: 1
bar: 2
baz: ***←ここでfooとかbarの値を使いたい。例えば 123 を表現したいとか。「$foo _ $bar _ 3」とかできないのかなと

Google AdSense をこのブログに貼って苦節1年、初めての振り込みがありました!
初めて振り込みがあったということでおいくらぐらいなのかは想像がつくと思います…。
有名なアルファなんとかさん達のに比べたら、まさに雀の涙級ですが、やっぱり嬉しいです!

ちなみにこのブログでGoogle AdSenseを貼っているのはサイドバーとパーマリンクなんですが、クリック率が多いのはサイドバーみたいです。個々の記事よりもサイドバーのを押す方が多いってのは意外っちゃ意外。サイドバーはページを表示したとき小さい画面だと下に隠れることも多そうだけどなぁ。

最近なかなかブログを書いてないので、できる限り毎日1エントリ書いてみようかと思う。
技術ネタだけだとネタが尽きそうなので日々の生活についても書いてみようかな…。

あるプログラムを作っていて Storable の retrieve を使おうと思ったらなんか変。
あれ…と思って小一時間プログラムを眺めていたら Class::DBI の retrieve を呼んでいた…。

にゃろめ。

検索

広告

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.12