mixiボイスからはてなブックマークできる、連携機能をでっち上げました

本日はてなよりアナウンスがあった、
Twitter のつぶやきからブクマできる連携機能
http://hatena.g.hatena.ne.jp/hatenabookmark/20091022
に触発されて、mixiボイスからブクマするのを勢いで適当に作ってみました。



以下コード

#!/usr/bin/perl 

use strict;
use warnings;

use AnyEvent::Impl::Perl;
use AnyEvent;
use WWW::Mixi::Scraper;
use WebService::Hatena::Bookmark::Lite;
use Config::Pit;
use Date::Calc;

my $hatena_conf = Config::Pit::pit_get('http://www.hatena.ne.jp');
my $mixi_conf   = Config::Pit::pit_get('http://mixi.jp');


my $mixi = WWW::Mixi::Scraper->new(
    email    => $mixi_conf->{email} , 
    password => $mixi_conf->{password} ,
    mode     => 'TEXT'
);

my $org_post_time = $ARGV[0] || join('', map{ sprintf( "%02d", $_); } Date::Calc::Today_and_Now() );

my $cv_timer = AnyEvent->condvar;
my $timer; $timer = AnyEvent->timer(
    after   => 0,
    interval => 60,
    cb   => sub {
        my @echo_list = $mixi->list_echo->parse();

        if( _is_bookmark_post( $echo_list[0]->{comment} ) &&
            _is_new_post( $echo_list[0]->{'time'} )       ){

            # post to hatena bookmark
            _post2hatena( $echo_list[0]->{comment} );
        }
    },
);

$cv_timer->recv;

sub _is_new_post{
    my $post_time = shift;
    $post_time ||= 0;

    if( $post_time > $org_post_time ){
        $org_post_time = $post_time;
        return 1;
    }
    else{
        return 0;
    }
}

sub _is_bookmark_post{
    my $comment = shift;

    $comment ||= '';
    return $comment =~ /B\!/;
}

sub _post2hatena{
    my $comment = shift;

    my( $str , $url ) = split( /B!/, $comment);

    my $hatena = WebService::Hatena::Bookmark::Lite->new(
        username => $hatena_conf->{username} , 
        password => $hatena_conf->{password}
    );

    return $hatena->add(
        url     => $url,
        comment => $str
    );
}


以下が実験結果。
mixiで発言する
[
はてブで確認する
[


なんか出来ているように見えます。


とりあえず勢いすぎた反省ポイント。
・AnyEvent意味ない。
はい、、使ってみたかっただけです。
ここのところの流れに追いつきたいと思いつつ、触る機会を作れてなかったので、無理矢理です。
gihyo.jpで連載されている内容(http://gihyo.jp/dev/serial/01/modern-perl/0013)を参考にさせていただき、書いてみました。
別にこれならwhileでループすればいいと言われたら何も言えません。


・毎回スクレイピングしている
はい、、RSSフィードでも吐く形式にすれば良かったんですが、ちゃんと勉強します><
これのせいで、posttimeをずっと保持しておいて、それより最新だったら、なんて比較もしてます。お恥ずかしい限り。


もしくはmixiボイスにAPIでもあれば、一番ラクだったのに(多分、今はないハズ)


※ちなみに

$mixi->list_echo->parse();

$mixi->recent_echo->parse();

に変えると、マイミク全員のボイスをブクマできます。(だから何だ!)


今回も勢い余って痛さだけが残る形に終わってしまいました・・・

『4Gbpsを超えるWebサービス構築術』読了

4Gbpsを超えるWebサービス構築術

4Gbpsを超えるWebサービス構築術


昼休みにご飯食べながら読むという進め方だったせいもあって、かなり時間かかりましたが読み終わりました。


ライブドアが誇る技術が幅広く書かれているとの事でしたが、その内容は。


■Chapter1 Webサービスの概要と要素技術
タイトル通り、Webサービスというものの歴史とその概要についての章。
Webエンジニアとしてはアイスブレイクと捉えられないとちょっとマズいかもしれません。



■Chapter2 キューイング
負荷分散のよくある一つの解決策、キューイングによる後回し。
僕も普段から考えている場所だけあって、凄くすんなり読めました。
逆に言うとGearmanとTheSchwartzの概要説明に終始していたので、もうちょっと
ライブドアなりの工夫みたいなものが知りたいと思ったりしました。


ちょっと話がそれますが、YAPC::Asia2009でも思いましたがやっぱりこの
キューイングはトラフィックが多いサイトではもはや必須対応なのかと。
もともと使っていたsix apartをはじめ、livedoorでも(malaさんセッションより)、
はてなのコーポレートトラックでもTheSchwartzを使っているらしきことが
伺えたので各社でどんな感じなのかなーと改めて興味が沸きました。




■Chapter3 DBキャッシング
来ました、memcached。今の職場ではこれがないなんて想像出来ない。。。
そんな11211ポートに住まう偉大なシステムですが、確かに前の職場で普通のサイトを
運営する分にはむしろどんなもんかすら触る機会すらなかった。
ここでは導入の前提となるWebアプリにおけるDBのボトルネックの部分も
解説されているので、それも合わせて読みたいところ。
そして、書かれていますが便利な上に導入するデメリットがほとんどない
というのがmemcachedのいいところだと思います。


と言いつつ、僕もプロジェクトの関係上ガリガリ使えてる訳ではない、、、
引っかかるところなんかが書かれても良いかと思いましたが、まぁそういうノウハウは
ネット上に溢れているという割り切りで、それはそれでよいと思います。




■Chapter4 HTMLキャッシング
この辺からは個人的に名前と概要は知っているけど、使った事とかはあんまりない
という部分になってきます。
Squidなんかはまさにその典型。confファイルの例まで書かれているんですが、
リアクションが出来ない自分。同時に説明の図の中にある箱の数が飛躍的に増えてきます。




■Chapter5 検索サービスの技術
この本は全体的に章の最初というか導入だったり・前提だったりの説明が明瞭
に感じましたが、この章の「検索」という項目の前提となる検索方式・言語解析の仕組み
の部分に触れていたのが非常にわかりやすかったです。
この章も社内ではそれに特化して研究している人がいたりするので、自分が
あんまり触れてない。。




■Chapter6 入出力パフォーマンス
恥ずかしながら、Blackholeエンジンについて無知でした、、
そんなんを読み進めていくと、この章はタイトルから察する事が出来るように
内容が複合的。前の章の技術なんかも含まれてきます。
特に気になったのが「最終出力に近い部分でのキャッシュ」。理由まで読んでみると
確かに納得ですが、やはり細かい運用という意味ではちょっと聞いてみたいなと
思う部分があったりしました。
あとCache::Memcached::Managedはこれまた知りませんでした。あとで読みます、、




■Chapter7 分散ストレージ
タイトルはストレージとなってますが、物理的な話のみならず運用するモジュール
の部分にも踏み込んでます。
最初がNFSから始まったことに歴史を感じますし、そこから現在まで試行錯誤で
運用されているという事に実績を感じます。




■Chapter8 モバイルの技術
ここは他とはちょっと毛色が変わって、日本のモバイル事情を浅く広く紹介。
またまた弊社の話ですと、モバイルもある程度切り分けがされているので
普段それ程触れられてません。なのでちょっと遠めから眺める視線で読ませて
いただきました。
内容的にはYAPC::Asia2009のkazeburoさんのセッション内容を合わせて
確かめると良いのではないでしょうか。




■Chapter9 ネットワークを取り巻く技術
自分が一番弱いところ、低いレイヤーの話はホントにダメです。
ここは多分何度も読み直した方がいいな、、、
ここら辺は知識として知っておくだけではなく、実際に動かさないと真の理解には
繋がらないんだろうなとつくづく感じます。
1台のサーバーすら運用せず、ネットワークを学ぶのがそもそもの間違いな気がしているので
そろそろroot権限のあるようなレンタルサーバー借りるか、自鯖を立てるか
しなければと思いました。




■Chapter10 Webサービスの性能評価
大規模サービスにおいて必要なのは、新技術の投入。ただそれよりも現状のチューニング。
と感じさせる、これだけは・まずはこれからやるべし、っていう内容。
もしMySQLのEXPLAIN構文を知らない人がいたら絶対読んでおいた方がいいです。



■まとめ
やっぱり自分が何を知っていて、何を知らないかが凄く良くわかりました。
アプリケーションで意識するmemcachedなんかは普段触っているので、
すっと頭に内容が入ってくるし、キューイングの部分なんかは正直物足りませんでした。
逆に後半になってくると、若干くじけそうな程知らない事が多すぎる。。。
所詮自分はイチアプリプログラマーに過ぎないんだなと痛感させられました。


とてつもない巨大サイトでなくていいので、この10分の1のトラフィックのサイトを
こういう技術を使って作ってみたいなと思いました。
今の会社ではなかなかそういう事がしにくいのが難点ですけどね、、


ただ、僕のようにプログラマーな人が「エンジニア」になるのに何が足りないのか
検定試験的に読むのにはオススメな1冊でした。著者の方々、執筆ありがとうございました。

YAPC asia 2009 まとめて感想

一応業務の一環で来ているので、会社用にレポートを書かないといけないのだけど、
数多あるまとめサイトとスピーカー本人様達のエントリを集めればそれで十分すぎると思ったので、とりあえず私的感想から。


◎前夜祭
yokohama.pm出張版。
・なにより自分が喋れなくて残念。準備不足でした。次回のyokohama.pm通常版ではまた何か喋れるよう今からネタ仕込んでおかねば。


ざざっと書くと
・acotiesさん: AnyEvent的ななにか(仮)
AnyEventとは何か、がホントに軽くわかった気がする。2週間くらいしか触ってないと言っていたのでスゲー


・spiritlooseさん: Schenker - DSL for quickly creating web applications in Perl
記述量の少なさが半端ない。最近思う事は他言語を知っている人は皆凄い。


・kawanetさん: YAPC::Europe 2009(ポルトガル)参加報告
海外のYAPCではトーク聞くのと同じ位BOFが重要。今回終わってみて確かに
そうだと思った。会場移動しまくりで疲れたし。


・k-z-hさん: PerlのWAF今昔
非常によくまとまった話でした。


amachangさん: Web的ななにか
HTML5の話。DOMとは違う木構造とか初めて知った。JSですぐデモるあたりはさすがamachangだと思った。
本編には来ていなかったようで、懇親会とかで話したかったのに残念・・・


・sugyanさん: 全裸でワンライナー(仮)
全裸イナー!一番ウケてました。1行野郎としての男気を感じました。


・nekokakさん: SmokerっていうぷらっがぶるWAFをつくってみたよ!
それPla」の一言で片付いてしまう動きが直前に発生しつつも、使いやすいと言われているものを使ってサクっと実際に作ってしまうあたりは見習わなければと思った。


・junichiro x btoさん: PHP的な何か(仮)
すみません、外にシュウマイ食いに行ってて聞いてませんでした><


・yusukebeさん: エロサイト管理者の憂鬱2
これほど感想の書きにくいトークもなかなかないけど、内容はともあれやっている事は凄かった。
世界は広い?/狭い?





YAPC本編
このペースで書いていくと終わらなそうなので、本編は省略・・・
それこそ皆書いてるしね。

でも、一番印象に残ったのはmiyagawaさんとtokuhromさんの1日目のPSGIのセッション。
とんでもない勢いで進んでいるプロジェクトだけど、もうまとまりつつあるって。。。
HTTP::Engineを元に再構成しつつ、既に作成されたアプリについては手を加える必要がないフォローつき。
PSGIは仕様
Plackは実装
この前提重要。とりあえず引き続きwatchしていこうと思います。


あとはコーポレートトラックも多くの企業が「自社でのperlの使い方」風なセッション内容になっていて、JPAが目指すperlの啓蒙という意味で良かったのはないかと。six apartの使用ツール群の紹介がおもしろかった。


今回一番関わりが深かったのが、id:nekokakさんの「Qudo」のセッション。
自分も開発をお手伝いさせてもらっているものだったので、どういった反応が出るか結構ドキドキしてた。


フタを開けてみると、同時間のセッションがどれも魅力的だったため思ったより人少ない^^;
かと思いきや、質問タイムにはdanさんやyappoさんから質問来たり。どれも的確な内容でした。


セッション終了後に、Lin You-Anさんさんからの英語の質問にあたふたしつつ、ちょうど僕も
欲しいと思っていた複数ジョブの一括管理(っぽい事だと思う)機能を求められたりしていて、これは発表して正解だったというか、宿題がたくさん出来て良かったと思いました。
最近あんまり触ってなかったので、これを期にちょいちょいコミットしようとモチベーション上がりました。


懇親会ではもっと色んな人と話たいと思いつつ、道半ばでした。それでも
退職された元同僚の方々
yokohama.pmでお世話になっている方々
などなどをはじめ、1日目のLTでイカしたマイク持ちをしていたkamipoさんなんかとも
お話させていただき楽しかったです。


さて、来年こそは自分がトーク出来るようになってみたいなと思います。
LTこそヘタな事が出来ない場だとわかったので、本編で。
id:precuredaisukiさんとも話してましたが、やっぱりちゃんと喋ろうとすると20分くらい
使いますよね、という考えにも至極納得しました。


今回、実は2日目のmiyagawaさんのLTに向けて、手元のCPANモジュールをアップしておいたのですが、
どうやらあのトークの最中にアップしないと意味なかったみたいですね、、、
唯一参加している気分になれるかもと淡い期待をしてましたが、残念でした。。




なにはともあれ,lestrratさんをはじめ運営者の方々(ボランティアの方含め)お疲れさまでした。
次回も楽しみにしています。

WebService-Hatena-Bookmark-Lite-0.01 をリリースしてみました

前回githubにコミットしたモジュールをCPANに登録してみました。


http://search.cpan.org/~masartz/WebService-Hatena-Bookmark-Lite-0.01/


うっかりCPAN Authorになってしまった訳ですが、、、
アカウントはちょっと前に作っておいたものの登録はしてない状態だったのでようやくです。


ホントはshipitを使う予定だったのに、途中で詰まってしまい、始めてですしせっかくなので旧来手法でtar ballを味わい深くuploadしました。
実際に反映されるまでは半信半疑でしたが、登録されちゃったみたいです。


CPAN Testers の項目では約1/4の割合で盛大にコケているのですが、
これは依存モジュールのXML::Atom側のインストールの時にさらにそれ自身の依存(Datetime.pm)等のuseで発生している模様。


ただXML::AtomMakefile.PLを拝見すると、ちゃんと featuresでそれらのモジュールのインストールは促しているので、問題ないのではないかと、、、正直どうした方がいいかわからないのが本音です。。。


なにはともあれ、ひとまず様子を見てみます。
そんな事している間にも別のモジュールのPODを書くという英語レッスンが。


とりあえずバージョンを上げる際には
WEBSERVICE_HATENA_BOOKMARK_TEST_USERNAME」とやたら長くしすぎた
テスト用の環境変数は縮めます。

はてなブックマークAtomAPI用のPerlインターフェースを作ってみた

最近社内のIRCにおいて、URLつきで投稿するとリスト化して管理してくれる
botが作られてました。タグやコメントも管理出来てとてもよく出来ているので
気になったニュースとかを貼って共有するなんて感じで使っています。


ただ、情報の格納先が結局社内のサーバーに置いてしまうので、家で見ようとすると
いったんブラウザで開いてはてぶする必要があります。


出来れば、適当なはてなアカウント作っておいて、
botがそのアカウントのブクマに追加する → 皆でそのアカウントのパーソナルフィードを読む
みたいな感じにしたらいいかなーと妄想してました。


んで、はてぶのAPIのIFを調べたら以外になかったりしました。。。


ということで作ってみました。
http://github.com/masartz/p5-webservice-hatena-bookmark-lite/tree/master


「::Lite」をつけたのは逃げと、コミット直前にnaoyaさんのプロダクトで
こんなものを見つけてしまったため、自重しました。
http://github.com/naoya/perl-hatena-bookmark/tree/master


使い方はSYNOPSISの通りなのですが、

my $bookmark = WebService::Hatena::Bookmark::Lite->new(
    username  => $username,
    password  => $password,
);

### add
my $edit_ep = $bookmark->add(
    url     => $url,
    tag     => \@tag_list,
    comment => $comment,
);

### edit
@tag = ( qw/ kaka tete /);
$com = 'edit comment';

$bookmark->edit(
    edit_ep => $edit_ep,
    tag     => \@tag ,
    comment => $com  ,
);
### delete
$bookmark->delete(
    edit_ep => $edit_ep ,
);


editとdeleteする時には、addした時の返却値になってるEditURIのエンドポイントを
渡す必要がありますです。


別な方法としては、

my $feed = $bookmark->getFeed();

XML::Atom::Feedオブジェクト形式でフィードが取れます。

my @entries = $feed->entries;

で各エントリがXML::Atom::Entryオブジェクトの配列で取れるので、該当のエントリに対して

my $edit_ep = $bookmark->entry2edit_ep( $entry );

でEditURIのエンドポイントを取得してください。


という方法で出来るはずです。たぶん。

yokohama.pm #4に参加してきました

昨日はyokohama.pm #4に参加してきました。
http://yokohama.pm.org/2009/03/yokohamapm-4.html


個人的には前回に引き続き、5分枠のスピーカーとして
喋らせてもいただき、非常に有意義でした。

http://www.slideshare.net/masartz/memcache-queue
※発表の時はspork使ったんですが、資料公開出来る
適当なサーバーがないのでパワポで作った叩きを整形してアップしました。

http://masartz.github.com/prezentation/yokohamapm-4/start.html
githubでこんな使い方出来るなんで知りませんでした、、、
id:dannさんがこの形で公開していたので参考にさせていただきました。


◎発表の反省点
・時間短すぎ
 正確な時間はわかんないんですが、ひょっとしたら4分もかかってなかった疑惑。。
 リハーサル段階では6分位かかってて、どうしようと思ってたのに・・・
 結構早口で喋って時間余ってたので下手こいたな。


・デモしょぼかった
 スクリプトの中身見せておけば良かったかなと。。
 まぁプロダクトのSynopsisに書いてあるものなので詳細はそちらで。




◎皆様の発表
id:lestrratさんやid:dannさんの発表はかなりのボリュームを20分たっぷり使ってて見ごたえ十分でした。
他言語を見てそれをPerlに持込んで来るっていうのは一回り視点が広くてカッコえぇ。
id:nekokakさんが発表されていた「Qudo」。「きゅーどぅ」ではなく、「くどー」ということで正式名称がFIXしたのが最大の収穫でした。




◎オレオレモジュール祭り
自分を含めて今回はオレオレなモジュールの公開が目立ったなと^^;
自分の痛さっぷりがうまくカモフラージュされたのが幸いでしたと勝手に思ってます。
今回は毎回ある他言語のプレゼンがなかったですね。あれはあれで、次回は復活してほしかったり。
幹事のid:clouderさんが「4回も続くと思わなかった」なんて言っておりましたが、ぜひぜひ次も楽しみにしてます。


関係者皆様、お疲れ様でした。

【小ネタ】githubでcloneとforkを間違えてしまったとき

昨日ひさびさにgithubを触り、followしている方のプロジェクトを見ていたら、ソースを落としたくなりました。


前提:単純にソースを見たい、プロジェクトを追いかけたいというだけならば、watchしてcloneすればOKです


が、何を間違えたか、ついforkを押してしまい、めでたく自分のプロジェクト一覧に人様のプロジェクト(をforkしたやつ)が追加されました。。。


あわてて消そうにも、消し方わかんねー
って事で一晩放置していたのですが、今見たらあっさり見つかりました。


という訳で以下手順

  1. 自分がforkしたプロジェクトのトップに移動( ex : ttp://github.com/masartz/hoge/tree/master )
  2. グローバルメニューの「admin」をクリック
  3. Administrationの「Delete This Repository…」をクリック
  4. 「Delete Repository」をsubmit


消えましたか?


これで、僕のような3流エンジニアが1流なハッカーのプロジェクトをforkして「こいつ開発すんのか!?」といった痛い視線を浴びずに済みます。
めでたし、めでたし。