nDiki : XML::RSS

2005年5月16日 (月)

はてなブックマーク上の最新ブックマークnDiki

自分でタグ付けできないのでどうなのかと思っていたはてなブックマークであるが、気がつけば登録したブックマークももうすぐ1500。

タグ付けできない部分は、検索機能である程度カバー。 お気に入り機能のおかげで旬のネタ収集もできる。 なんだかんだいっても、さすが「はてな」という感じ。

日々登録しているブックマークを活用したいということで RSS を利用して、nDiki に表示してみることにした。 出勤前のちょっとした時間で Perl スクリプトとしてささっと実装。

  • ローカルPCで以下の作業を行うスクリプトを書く
    1. LWP::Simple を使用して RSS を取得
    2. XML::RSS で parse() したあと、items から HTMLフラグメントを生成
    3. nDiki のフッタに挿入
  • cron で1時間毎に
    1. 上記スクリプトを走らせ、フッタファイルを書き換え
    2. フッタファイルを UnisonWeb サーバアップロード

という形で実現。

  • DiKicker にはフッタファイルに別のファイルをインクルードする機能がないので、フッタを書き換えてしまえ。
  • サーバに XML::RSS を入れるのが面倒なので、ローカルPCでやってしまえ。どうせブックマークが更新されるのは、そのPCを使っている時だけだから。

という手ぬきであっさり実装。

[ 5月16日全て ]

2005年10月30日 (日)

はてなブックマーク上の検索結果を nDiki

5カ月ほど前はてなブックマーク上の最新ブックマークnDikiサイドバーに表示するようにしてみた。

今回は nDiki のキーワード別のページに、はてなブックマークからそのキーワードで検索されたブックマークを表示する機能を追加してみた。

取得する対象RSSが多くなり、さすがに前回みたいにローカルPCで処理して定期的にアップロードという形では無駄が多すぎるのでちゃんとサーバ上で処理するようにした。

URI::Fetch + Cache::FileCache + XML::RSS を用いて実装。 キャッシュ期間は1日に設定。キーワードページを最初にアクセスした際にははてなブックマークからのフィード取得があるので、ちょっと時間がかかるが2度目のアクセス以降キャッシュを使っている間はそれほど余計な時間はかからないはず。

自分のWeb日記とブックマークの組み合わせだと当然扱うネタが近いので、きちんと関連する情報が表示されるはずだ。 他の検索サーバのRSSフィードを利用する事も考えてはいるけど、しばらくはこれでいいかな。

[ 10月30日全て ]

2006年6月10日 (土)

Plagger のインストールが大変なので XML::RSSRSS から JavaScript コードへ変換するスクリプトを自作

一昨日社内メイン Wiki のレイアウトを変更してサイドバーを設けたので、徐々に増えてきた社内 Blog の ヘッドラインをそこに表示することにした。

最初は Plagger を使ってみようと思ったのだが、依存 CPAN モジュールが多くて CPAN.pm を使ってもなかなかインストールが終わらない。

ということで今回は Plagger を見送って、XML::RSS でちょちょっと aggregator を自作して済ますことにした。

基本的には nDiki 用に書いた「はてなブックマーク上の最新ブックマークを表示するためのコード(2005年5月16日)」をちょっと修正して利用。 HTML フラグメントを生成するかわりに、JavaScript IncludeJavaScript ファイルを生成するように変更した。

これで社内 Blog が読まれる回数も増えるかな。

[ 6月10日全て ]

2007年11月9日 (金)

Twitter ステータスを nDiki サイドバーに表示

公式の Flash 版 Twitter badge をこのページのサイドバーに表示していたが、以下の点でちょっと不満だった。

  • 「Flash, Just Me」: 自分のみのステータスを表示できるが、1度に1つのみ。キャッシュの関係で古い情報が表示されがち。
  • 「Flash, With Friends」: 自分のみのステータスを表示できない。
  • 「HTML/JavaScript」: JavaScript ファイル読み込みなので、Twitter 側が重いとページのその先のレンダリングが止まってしまう。

「自分の過去のステータスを一覧的にサイドバーに表示する」のがしたいことなのだが、ちょっとマッチしない。 ということで Twitter から RSS フィードを取ってきて、サイドバーに表示することにした。

使ったモジュールは URI::Fetch + XML::RSS + Date::Parse。 それとユーティリティとして WiKicker::HTML と WiKicker::URI。

  1. cron で定期的に Twitter から RSS フィードをとってきて、Perl スクリプトで HTML フラグメントに変換。
  2. DiKicker が読み込む(サイドバーを含む)フッタファイルに挿入。

と簡単に実装してみた。機能的には概ね満足。

今後は L:〜 や URL自動リンク化、キーワードの自動リンク化を適宜したい。

[ 11月9日全て ]

2008年3月13日 (木)

Flickr写真を自動的に Twitter アイコンにする

2週間ほど前にtwitterfeed で Flickr に写真をアップロードしたら自動的に Twitter にタイトルと URL をポストするようにしたのだが、これだと写ツみたいに画像そのものはポストされず今一歩なので、写真自体を自動的に Twitter アイコンアップロードするようにしてみた。

流れは以下:

  1. cron で定期的に FlickrRSS フィードをフェッチする (URI::Fetch + XML::RSS)。
  2. 新しい写真アップロードされていたら(最新の写真が変化していたら)、RSS フィード中のサムネイル画像 URL を抜き出して画像をダウンロードする (URI::Fetch)。
  3. 正方形に crop。それからころころ Twitter アイコンを変えると誰だかわからなくなるので、決まった画像 (今のところ自分の写真)を重ねる (ImageMagick / PerlMagick)。
  4. Twitterアップロードする(アップロードスクリプト)。

例えば今日 VQ1005 で撮影して Flickrアップロードした写真を自動的に加工させたものがコレ。

image:nDiki/2008/03/Twitter-icon-2008-03-13.jpg

なんか偽中継のような嘘臭さがあるけれど、まあだいたいアップロードした写真は自分が実際にその場にいたのだから、あながちでもないんじゃないか。

[ 3月13日全て ]

2008年8月5日 (火)

Twitter への書き込みを自動的に Skype ムードメッセージに設定する for Windows

半年ぐらい前に Skype for LinuxTwitter への書き込みを自動的に Skype ムードメッセージに設定するスクリプト(記事)を作って cron で 10分毎に更新するようにした。

Windows BOX 上 Skype を使っている時も同様にできるように、Skype4COM を使うバージョンも書いてみた。 D-Bus ではなく Skype4COM を使うようにすることと、Skype4COM にはシフト JIS の文字列を渡すようにすること以外はほとんど同じ。

Skype4COM の DLL を登録し、Skype が起動している状態で以下の Perl スクリプトを実行。

 #!/usr/bin/perl

 use strict;
 use warnings;
 use Win32::OLE;
 use URI::Fetch;
 use XML::RSS;
 use Date::Parse;
 use Encode;

 my $id = '自分の Twitter ID';

 my $time = time;
 my $fetch_response
   = URI::Fetch->fetch(
               "http://twitter.com/statuses/user_timeline/$id.rss?dummy=$time")
   or die URI::Fetch->errstr;
 my $rss = XML::RSS->new;
 $rss->parse($fetch_response->content);
 die 'no items' if @{$rss->{items}} == 0;
 my $item = $rss->{items}->[0];
 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)
   = localtime(str2time($item->{pubDate}));
 my $title = $item->{title};

 my $mood
   = sprintf("$title [%02d/%02d %02d:%02d]", $mon + 1, $mday, $hour, $min);

 $mood = Encode::encode('shiftjis', $mood);

 my $skype = Win32::OLE->new('Skype4COM.Skype');
 $skype->Client->Start unless $skype->Client->IsRunning;
 my $profile = $skype->CurrentUserProfile;
 $profile->{MoodText} = $mood;

インストール済みだった ActivePerl 5.8.8.822 で動作を確認(ちなみに現時点での最新は ActivePerl 5.10.0.1003)。なお URI::FetchXML::RSS、Date::Parse(TimeDate) は標準では入っていないので PPM パッケージでインストール。

タスク スケジューラで10分毎に上記のスクリプトを wperl.exe で実行するように設定。 これで Windows 上でもさえずりをムードメッセージに設定できるようになった。

[ 8月5日全て ]

2010年5月11日 (火)

今日のさえずり: ボタンを使わず手で開くこともできます

2010年05月11日

  • 10:11 新しい人がきた。ロルバーンを使っていることに注目。
  • 12:06 398幕の内弁当 398円。 (@ ファミリーマート神田佐久間町店) http://4sq.com/biJuCj
  • 12:10 エクスポート機能追加してくれるということなので Cashbook 再開。foursquare の書式対応されて使い勝手がアップしていて嬉しいな。 http://bit.ly/5CYr2C
  • 12:34 TwitterRSS フィードが XML::Parser 通すとエラーになるのは、FeedBurner からの投稿の twitter:source 中の URL かな。
  • 12:43 Twitter RSS フィードを XML::RSS に食わせる前に http://bit.ly/cF3mJg の & を & に置換するというやっつけ対応。 #Perl
  • 12:45 あ、1つ前の tweet、URLbit.ly されちゃうし & amp ; は & になっちゃうしで全然わけわからなくなってしまった。
  • 14:53 「PROSOLID μ はワンプッシュオープンボタンを使わないで開けていると閉じなくなっちゃうから止めて」っていうのが会社で定説になっているけれどどうなの。取扱説明書見ると「ボタンを使わず手で開くこともできます。」って書いてあるけど。
  • 14:59 ああ、C++ で基底クラスのコンストラクタから仮想関数呼んでも派生クラスのは呼ばれないんだったよね。 #cpp #cplusplus
  • 15:57 小学生の時、小学校に北欧のどっかの国の人が視察だがなにかにきてなんかお土産に食べ物をおいていってくれたんだけれど不味かったなあというあいまいな思い出。
  • 18:27 Twitter ステッカーのためにリバティーンズ マガジン No.01 買うかちょっと迷っている。 http://bit.ly/cVTxeB
  • 19:01 LIBERTINES編集部 @lbtns に follow された。これは買えということですね? http://bit.ly/cVTxeB
  • 19:29 さて、そろそろ眼鏡をとりにいこう。
  • 19:49 3000字のレポートお題が出ているんだけれど @as_tone と「フルフル 22 tweets でいけちゃうじゃん」という結論に至った。
  • 20:07 久しぶりに電車座席定員オーバーに遭遇(5/4)。
  • 20:15 I'm at メガネの愛眼 アトレ恵比寿店 (日本, 渋谷区). http://4sq.com/cixML5
  • 20:31 ちょっとフレームに傷があったので交換してもらうことになった。オアズケ。
  • 20:55 現物みた。本誌面白そうだけど、ステッカーは予想よりチープだった。 RT @Naney: Twitter ステッカーのためにリバティーンズ マガジン No.01 買うかちょっと迷っている。 http://bit.ly/cVTxeB
  • 20:59 そういえばさっき Xperia で咄嗟に自局番号確認できなかった。どうやるんだ。
  • 21:01 設定の中に発見。
  • 22:52 明日返す本1冊読みきった。読書メモする時間今日ないので気になったページを Xperia で撮って Evernote に放りこんどいた。
  • 22:56 Evernote for Androidカメラだと Xperia の照明が点けられないのが惜しい。標準のカメラアプリで撮ってから Evernote に放りこんだ。
  • 23:43 メンズパパウォッシュするつもりがダヴになってた。
[ 5月11日全て ]

2013年1月16日 (水)

はてなブックマークのフィードをフィルタし IFTTTソーシャルメディアでシェア

リンクを複数のソーシャルメディアでシェアする仕組みを持ってなくて、そういう時は個別に投稿している。でも公開範囲とか細かく設定したい時以外はサクッと一発で終わらせた方がクールだ。あと今までほとんど Twitter ではリンクのブックマーク的シェアしていなかったんだけれど、まあ今後はちょっとしてもいいかなと。

ということで仕組み作り。はてなブックマークから Twitter 連携・外部サイト連携するのが国内的王道かな。でも他の人のリンク踏むとブックマーク先に飛んだりブックマークエントリーページに飛んだりっていう体験があってちょっとそういうの嫌だったりする。

代替案としては Facebook を一次投稿先にして IFTTT で他へ流す方法が思いついた。IFTTT 的に quick trigger になるのでタイムラグが無いのが良い。そのかわり非公開以外のリンク投稿について全て trigger してしまうようなのでちょっと怖い。URL・ページタイトル・コメントを IFTTT 側で分けて取れるのでいいんだけどね。

あとは Buffer を一次投稿先にして直接あるいは IFTTT で流す案も検討した。時間をばらしたい人はいいけどそうでない場合はあまり良くない。あとページタイトルは取得してくれない。

ということでやはりリンクの共有としては、はてなブックマークが便利なんだなぁ。PC からでも Android 端末からでもいけるし。なので一次投稿先ははてなブックマークに決定。全体公開ものをここにブックマークしているので、垂れ流れていくのも問題なし。ただ前述した点があるので、実際の連携にははてなブックマークの機能を使わないで、フィードを IFTTT に読ませて撒くことにした。

ただ IFTTTはてなブックマークにつけたコメント部分をフィードから読みとれない。ということでちょこちょこっと Perl でフィルタを書いた。

 #!/usr/bin/perl

 use warnings;
 use strict;

 use CGI;
 use LWP::UserAgent;
 use XML::RSS;

 my $ua = LWP::UserAgent->new;
 my $response = $ua->get('http://b.hatena.ne.jp/はてなID/rss');

 my $rss = XML::RSS->new;
 $rss->parse($response->content);

 foreach my $item (@{$rss->{items}}) {
   my $description = $item->{description};
   $item->{title} = $description if defined $description;
 }

 my $query = CGI->new;
 print $query->header('application/xml; charset=utf-8');
 print $rss->as_string;

サーバに XML::RSS が入ってたのでそれを使った感じ。IFTTT からは15分に1回ぐらいのアクセスのはずなので、まあこんなもんで。エラー処理も端折り。

はてなブックマークにつけたコメントは IFTTT でエントリのタイトルとしてとれるようになるので、それを使うように。Facebook に投げる場合はページのタイトルは Facebook が自前で取得してくれるので使わないので、フィードではタイトルを上書きしてしまって問題ない。

ページのタイトルを取得しないソーシャルメディア向け(Twitter とか)には

 foreach my $item (@{$rss->{items}}) {
   my $description = $item->{description};
   $item->{title} = '“' . $item->{title} . '”';
   $item->{title} = $description . ' / ' . $item->{title}
     if defined $description;
 }

と、タイトルとコメントをはてなブックマーク書式っぽくしてタイトルに設定してあげる。あとは IFTTT でいい感じに流してもらうと。

[ 1月16日全て ]

About

Naney Naneymx

Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。

※本サイトの内容は個人的見解であり所属組織とは関係ありません。

Process Time: 0.023213s / load averages: 0.45, 0.43, 0.42