2005年08月23日

はてな、モバイルサイトにCAモバイルの『Seaftyy』を採用

はてな、モバイルサイトにCAモバイルの『Seaftyy』を採用 :: SEM R

『SeafTyy』の導入によりサイト検索の機能追加を行うと同時に、『SeafTyy』に「はてな」の辞書検索を追加し、『SeafTyy』を導入しているサイトから同機能を利用できるように提供する。

iYappoで検索したときに内部的にはてなキーワードを検索して、該当キーワードがあったらはてなに飛ばす仕組みをやろうと思ってたけど
勝手にやると激しく怒られそうだから問い合わせ窓口探してたけど、よくわかんなくて頓挫してたら先にこされてしまったorz

他にもはてなモバイル系ネタは妄想してるけど、こっちは個人だからきっとむりぽorz

Posted by Yappo at 15:37 | Comments (0) | TrackBack

Yappoの中の業務メールを大公開(らんどん摩倶)

Message-Id: <20050823.102325.88506398.ko@yappo.ne.jp>
In-Reply-To: <03cf01c5a6f3$79f4d780$0801a8c0@iga7da33269f0f>
References: <03cf01c5a6f3$79f4d780$0801a8c0@iga7da33269f0f>
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Subject: Re: お問い合わせ
From: dcs@yappo.ne.jp
To: ubukata@randonmag.com, ogawa@randonmag.com
Date: Tue, 23 Aug 2005 10:23:25 +0900 (JST)
X-Mailer: Mew version 3.3 on Emacs 21.3 / Mule 5.0 (SAKAKI)
やあ (´・ω・`)

ようこそ、バーボンハウスへ。
このURL( http://www.google.co.jp/search?hl=ja&q=%E3%82%89%E3%82%93%E3%81%A9%E3%82%93%E6%91%A9%E5%80%B6&btnG=Google+%E6%A4%9C%E7%B4%A2\
&lr=lang_ja
)
はサービスだから、まず読んで落ち着いて欲しい。

うん、「また」なんだ。済まない。
仏の顔もって言うしね、謝って許してもらおうとも思っていない。

でも、この返信メールを見たとき、君は、きっと言葉では言い表せない
「ときめき」みたいなものを感じてくれたと思う。
殺伐としたSPAM(&詐欺?)業界の中で、そういう気持ちを忘れないで欲しい、そう思って
このメールに返信したんだ。


じゃあ、注文を聞こうか。


From: 営業課  生方 佳奈 <ubukata@randonmag.com>
Subject: お問い合わせ
Date: Mon, 22 Aug 2005 17:28:30 +0900

> 管理人様
> お忙しい所申し訳ありません。
>
> 私、広告代理店を勤めさせて頂いてます、
> 【らんどん摩倶】営業の生方と申します。
>
> この度、御サイト様に広告枠をお借りしたく、
> お問い合わせさせて頂きました。
>
> お忙しいとは思われますが、ご検討可能で御座いま
> したら、ご返信頂けるでしょうか。
> ご返信の際、料金システム等の詳細もお伝え頂ける
> とお話が早いと思います。
>
> 取り急ぎとはなりましたが宜しくお願いいたします。
>
> ┌─────────────────────┐
>     代理の杜 【らんどん摩倶】
>      営業課 生方 佳奈
>  E-MAIL: ubukata@randonmag.com
> └─────────────────────┘


Posted by Yappo at 10:39 | Comments (0) | TrackBack

2005年08月19日

ACCで垣間見た はてなブックマークの効果

そんなこんなのACCですが
実は先週の土曜日から公開していて、ある種の実験をしていたのですよね。
はてなブックマークに自演ブックマークしただけで、どんだけ人が見に来るのかな?と
エントリ数は
はてなブックマーク(51)
del.icio.us(13)
となっとります。1470.netのほうにも数件あるぽいです。
で、13:52分現在

[today:74 | total:2404 counter by File::CounterSS]

となっているので、トップページPVが賞味6日で2400件になることが出来た、という事がわかります。
これもネタしだいなんでしょうけどね。
告知方法がこれだけなのにそこそこのトラフィックが集まってるので、スパマーにばれたら大変なことになりそうね。


なので頑張ってください、はてなの中の人。
色々防御手法はあるし、めんどいけど既存の抜け道とか塞げばよいはず。

Posted by Yappo at 14:11 | Comments (0) | TrackBack

統計的手法?で人気がでるURLを予測するサイトを作った

はてなブックマーカーランキング - Ceekz Logs

国内のソーシャルブックマークは、はてながシェアトップだと思うのですが、そのユーザーのがんばり度をランキングにしてみました。

をみて何か物足りないなぁと思ってたわけですよ。

そう、がんばってる人のランキングが見れるんなら、その頑張る人達の集めたクリップを見たい!
小難しくいうと「人気の出るURLをいち早く察知する事が出来る人たちから、より多くブックマークされるURLは人気が出やすい」という理論を実践するサイトがあると面白そうって事で
Alpha Clipper Clips(以下ACC)なんてサイトを作ってみました。
やっていることは単純で、その日の内にアルファクリッパーに多くクリップされているURLをランキングして並べているだけです。

それだけじゃつまらないので、各URLに対して予測人気指数という指標を設けて、はてなブックマークのユーザーの中で人気が出そうなURLを早い段階で察知出来る仕組みも作りました。
数値の元ははてブでのホスト名の偏り - Ceekz Logs

以下が、はてなブックマークの人気エントリーのホスト名ランキングです。人気エントリーとは、以前からの定義どおり、20以上のオープンユーザーがブックマークしているエントリーです。

のデータを拝借しつつ、下記の条件を元に算出しています。

  • URLがはてなブックマークの人気URLへの掲載がされやすいかの割合

  • ACCがURLを検知してからの経過時間(鮮度)

  • URLをクリップしているアルファクリッパーの人数


要約すると「はてなブックマークのベイジアンフィルタ」って感じでしょうか。
過去の実績から人気になりやすいURLの特徴と、過去の実績から人気になりやすいURLを見つけることが得意な集団のコラボレーション(はてなブックマーク限定)
で、実際面白そうな記事が上位に食い込んでますね、IT系に偏りすぎだけど。

本家はてなとの差異は、こっちのは当日出たURLは当日中でしかランキングをしないので、前日などの超人気URLなどで新鮮な面白URLが埋もれないって事でしょうか。
人気になりそうなURLをいち早く発見するサイトっていうポリシーの方向なので。

実装方法ですがHatena Bookmarker Rankingを、5:30,17:30に巡回して当日の上位IDをかき集めます。
そして、かき集めたIDのatom feedを20分毎にとってきてDBにデータを格納しています。
後は、表示するだけです。

tagsの作成はHTML::TagCloudを使いました。
あとなんだろ、初めてClass::DBIを使ってみたのですが本当に生産性があがる感じですな、パフォーマンスは知らないけど。

あ、なんとなくrss/atomは吐いてないです。

Posted by Yappo at 14:06 | Comments (0) | TrackBack

2005年08月17日

Class-DBI-0.96の自動キャッシュではまった

先週末に、Apache2+mod_perlな環境で新しいサイト作ってたのです。
せっかくだから、今まで触ったことの無いClass::DBI使おうと思って0.96入れたわけですよ。0.96。
そしたらなんかupdateしたレコードの値が変わらないんです。もうお前ら150円やる宇和なにうぃげfせrtfぎゅひじょkpl
今までは独自にO/Rマッピングしてたんだけど、たまには一般的なのでも使ってみようということで使い出したです。

そのサイトは、Webアプリ側はとあるテーブルのカウント数値を元にしてソートをかけてランキング表示をして、バックエンドでカウントの数値を更新しています。
しばらく動かしていたら、ソート結果は意図したとおりだけど、表示されるカウント数値が更新されなくなりました。
なんとなくデータキャッシュされてそうだなぁと思いClass::DBI.pmやらIma::DBI.pmのソースを調べて

Data::Table->search_hoge()->{_data};

なコードでキャッシュされていないデータを取得できる事を発見して、汚らしいけどこれでしのいだ。
めんどくさいから追求しなかったの。

そしてついさっき
のみまくし日記 - Class-DBI-0.96(1792) - TokuLog!


で、原因は判明。
Class::DBI の Version 0.96 以後では、オブジェクトの生成にキャッシュが効くのが原因でした。
Primary Key が同じオブジェクトは、キャッシュされるのです。

やっぱりキャッシュ機構が入っていたのね。
$Class::DBI::Weaken_Is_Available = 0;

を書いておけばキャッシュ機構がOFFになるみたい。

しっかし、クエリを投げてデータも取ってきてるのにキャッシュしてるのかな。。。変な実装。。。
apache2+mod_perlな環境だけなのか何なのかも謎
同じプロセス内ではキャッシュが生き続ける感じなのかしら。

てか、一年前からの既出ネタの可能性大なのか。。。ぐぐっても対処法わからんかったorz
MFPM::Class::DBI

Posted by Yappo at 21:15 | Comments (2) | TrackBack

ほりえもんでんせつ

20せいき しゃちょうになる
2004ねん きゅうだんおーなー
2005ねん こっかいぎいん
2006ねん だいじんになる
2007ねん じみんとうそうさい
2008ねん そうりだいじんになる
2009ねん そしてでんせつへ

Posted by Yappo at 11:44 | Comments (0) | TrackBack

2005年08月14日

祭り


最後

Posted by Yappo at 16:15 | Comments (0) | TrackBack

富岡の大祭り





これぞ日本の夏

新川一丁目交差点にて
水は京橋消防団提供

Posted by Yappo at 11:58 | Comments (0) | TrackBack

2005年08月10日

File::Storage::Stat - statな場所にデータ格納するモジュールと軽量カウンタ

事の発端はたつをさんのくっつきカウンター

ファイルのタイムスタンプをカウンターとして使用しています。エコかつロバ
ストかな、と (どうだろう...あやしいな)。

今までよく見てなかったんだけど、先日よく見てみたら激しく面白い手法じゃないですか!

よく考えると、ファイルのタイムスタンプを使わなければ1ファイルあたり64ビットのデータも格納できる事に気づいた。
くっつきカウンターは、純粋に数値データだけを保存しているけど文字列だって8バイト分も格納できるよね
って事で、fileのatimeとmtimeにそれぞれ4バイトずつの任意の数値若しくは文字列を格納できる汎用的なストレージマネージャーを実装してみました。

File::Storage::Stat です。
使い方は、数字データだったら

use File::Storage::Stat;
my $fss = File::Storage::Stat->new({FilePath => 'filepath'});
$fss->set(100, 1000);
my($a, $b) = $fss->get;

文字列だったら
use File::Storage::Stat;
my $fss = File::Storage::Stat->new({FilePath => 'filepath', Type => 'char'});
$fss->set('保存', 'save');
my($a, $b) = $fss->get;

こんな感じで使えます。
文字列に限ってはサイズオーバーすると空文字になります。

利点としてはfile openせずにデータの格納を行うため、複数のプロセスが同時にアクセスした場合でもデータ破損は最悪免れます。
どんなタイミングであれ、何かしらのデータが残るはず。
atomicでは無いのですが、ある程度大雑把なデータを高負荷状態でread/writeする時なんかでも使えるかな?とも思います。
まさしくくっつきカウンターを作ったりする時ですよ!

って事なので、File::Storage::Statを使ったくっつきカウンターもどきを簡単に作れるモジュールも作ってみました。
File::CounterSS です。

use File::CounterSS;
my $c = File::CounterSS->new({DirPath => '/tmp/kcount', Id => 'id'});
my ($day, $total) = $c->count;

こんなコードで、本日のカウントとトータルカウントが取れます。
他にも、時間別、週別、月別、年別や、今年と去年、今週と先週などのパターンでも取れます。
ただし、過負荷状態では正確なカウントは取れないとは思います。
ロック処理も何も入っていないので、基本的には超軽量カウンターになるでしょう。

次はFile::Storage::Statの有用な使い方を考えないとな。

※注意 くっつきません。カウントの手法がもどきなだけです。

Posted by Yappo at 22:43 | Comments (4) | TrackBack

2005年08月09日

WebService::SyncSBS::D2H 正式版 - del.icio.usとはてなブックマークの同期

以前del.icio.usとはてなブックマークの同期を取るモジュールにて公開したWebService::SyncSBS::D2Hを
両方のサービスのデータ間で同期を取れるようにしました。
自分が言いだしっぺで実装してもらったのに一月も放置しとりました。。。

ただし、はてな側のタグに制限がいくつかあるので完璧なタグの同期は取れません。
はてな側に登録できそうなタグのみ同期させて、残りはコメント欄に追記です。

あと、はてなのAtom Feed中のdc:subjectがうまく出ていないエントリもあるようなので、D2H側で吸収しています。


<entry>
<title>YappoLogs: Xangoというクロウラーフレームワークを使ってみる</title>
<link rel="related" type="text/html" href="http://blog.yappo.jp/yappo/archives/000275.html" />
<link rel="alternate" type="text/html" href="http://b.hatena.ne.jp/yappo/20050808#530961" />
<link rel="service.edit" type="application/x.atom+xml" href="http://b.hatena.ne.jp/atom/edit/530961" title="YappoLogs: Xangoというクロウラーフレームワークを使ってみる" />
<issued>2005-08-08T10:41:16+09:00</issued>
<author>
<name>yappo</name>
</author>
<id>tag:hatena.ne.jp,2005:bookmark-yappo-530961</id>
<summary type="text/plain">[xango] [robots]</summary>
<dc:subject>perl</dc:subject>
</entr>

こんな感じ

ついでにCPANにあげときました
SBSは他にも色々有るので、将来性を考えると名前空間をしっかり考えなきゃいけないところでしょうが
変な所で前に進まないのも嫌なので、えいやっと放り投げてみたテスト

Posted by Yappo at 16:25 | Comments (0) | TrackBack

PowerEdge850がDellみたい

デュアルコアなP4の搭載が可能で8G間でのDDR-2 SDRAMが乗るE7230チップだそうだ。
価格は$749~だそうで、$2000くらいの構成を選ぶ感じになるかな。
早速人柱になってみるか

むしろ一台あたり10万以下の構成がたくさん欲しいわけだが。

Posted by Yappo at 11:04 | Comments (0) | TrackBack

2005年08月06日

ドリアンが芽を出した



庭に変な物体が生えてたから何だろうと思って掘ってみたら、春先にうえたドリアンの種がからっぽになってたから、どうやらドリアっぽい。

Posted by Yappo at 16:46 | Comments (0) | TrackBack

枝豆



枯れた

Posted by Yappo at 16:20 | Comments (0) | TrackBack

Xangoというクロウラーフレームワークを使ってみる

Xango

XangoはPerlで書かれた汎用クローラーフレームワークです。
イベント型フレームワークPOEを使用することにより高速なクローリングが可能です。
実装にもよりますが、単一プロセス内でインデックシングや文字コードの変換等の処理を
同時に行うアプリケーションでも1秒に5~8 URL、1時間で 18000 ~ 22000 URLの処理が行えます。

ドキュメントはperldocのみっぽいので、日本語の情報を残す意味で使い方のメモをば。
相当端折って書いてます。

Xangoを使ったクロウラーを書くには、制御用のにPOEセッションを作る必要があります。
Xangoを制御するためのモジュールを適当な名前で作っておくのがスマートかと思います。

とりあえずセッション作成を行う処理を書きます


sub spawn
{
my $class = shift;
my %args = @_;
my %heap = (
);
POE::Session->create(
heap => \%heap,
package_states => [
$class => [
qw(_start _stop),
qw(retrieve_jobs apply_policy prep_request),
qw(handle_response finalize_job),
]
]
);
}

こんな感じです。

次にAliasの設定です。ユーザー側のセッション名はhandlerをつけると事になっているので、Aliasをこれに設定しておきます。


sub _start
{
my($kernel) = @_[KERNEL];
$kernel->alias_set('handler');
}

sub _stop
{
my($kernel) = @_[KERNEL];
$kernel->alias_remove('handler');
}

次は、URLリストの取出しです。
XangoがURLリストの取得が必要だと判断した時にretrieve_jobs()を呼び出しますので、URLのリストを返します。
訪問先URLリストが無ければundefを戻せばおk


sub retrieve_jobs
{
print "retrieve_jobs: $count\n";
$count++;
#return undef;
return ({
uri => 'http://example.jp/',
my_var => $count,
my_other_var => $count,
},{
uri => 'http://2.example.jp/',
my_var => $count,
my_other_var => $count,
}
);
}

ハッシュリファレンスの配列として戻します。
my_varやmy_other_varのように、ユーザー側独自の値も設定できます。
こお処理はDBからURLを引っ張ってくるとかそんな事をします。


次に、Xangoが訪問先のURLにアクセスを行うべきかを問い合わせます。
robots.txtに基づくアクセス制御や、同一ホストに連続でアクセスすることを防止する処理を書く感じです。


sub apply_policy
{
my($kernel, $job) = @_[KERNEL, ARG0];

#$job->{uri}

#$kernel->post('broker', 'finalize_job', $job); #deny
$kernel->post('broker', 'send_fetcher', $job); #any
}


$job->{uri}にURLが入っています。
okならsend_fetcherを、だめならfinalize_jobを呼び出します。
この処理を忘れると正常に動きません。


次に、HTTPリクエストを実行する直前に呼ばれる処理です。


sub prep_request
{
my($kernel, $job, $req) = @_[KERNEL, ARG0, ARG1];
}

$reqHTTP::Requestのオブジェクトになっています。


いよいよ、取得したデータを処理するフェーズです。


sub handle_response
{
my($kernel, $job) = @_[KERNEL, ARG0];
#$job->{http_response}
# $kernel->post('broker', 'finalize_job', $job);
}

$job->{http_response}HTTP::Responseオブジェクトになっています。
もし、Xangoの挙動がおかしいときはfinalize_jobを呼び出してみてください。
svnバージョンだと必要でした。

最後に、HTTPリクエストの後処理です。必要だったら書いてください。


sub finalize_job
{
my($kernel, $job) = @_[KERNEL, ARG0];
}

オマケとして、設定ファイル処理中にXangoから呼び出しがあります。


sub load_config
{
my($kernel, $config_filepath) = @_[KERNEL, ARG0];
}

$config_filepathは、そのまま設定ファイルのパスが入ります。
で、その設定ファイルですがYAML形式で記述をします。
詳細はperldocを見てください。
HttpComponentArgsに、POE::Component::Client::HTTPに渡す初期設定を記入できますので
UAを独自の物にしておくと良いでしょう。

HttpComponentArgs:
Agent: Xango/test
MyConfigParam: hoge

MyConfigParamの様な独自設定も記入できます。
解析は先ほどのload_configで行います。

最後に実行するスクリプトです。


use strict;
use Xango;
use Xango::Broker;
use MyHandler;

MyHandler->spawn();
Xango::Broker->spawn(conf => './conf');
POE::Kernel->run();

と、こんな感じでXangoを使うことが出来ました。
昔のバージョンだとリンク解析とかEncodeとかrobots.txtとか色々面倒見てくれた気もするけど
現在は、貰ったURLリストをPOEらしくパラレルで高速に巡回する事に徹したフレームワークになっています。(DNSキャッシュを内部で行っているというのもいい感じです。)
その分、サーバ毎のアクセス間隔やrobots.txtへの準拠はキッチリと書かないといけないですが。

POEを使ったクロウラーたんを書きたい時には重宝しそうです。
あとはXangoX::* or Xango::Ex::* なモジュールが増える事に期待。


一応、今回のファイルもあげておくテスト。
MyHandler.pm
test.pl
conf

MFPM::Xango

Posted by Yappo at 15:43 | Comments (4) | TrackBack

2005年08月04日

N901iS


ありえね

Posted by Yappo at 11:22 | Comments (0) | TrackBack