perlのスレッドでIPアドレス逆引き

昨日の続き

use strict;
use warnings;
use Socket;
use threads;
use threads::shared;
use Thread::Queue;

my $thread_num =10;
my %cache : shared;
my $DataQueue = Thread::Queue->new();

for (0..$thread_num){threads->create(\&getaddress);}

while(<DATA>){
  chomp;
  $DataQueue->enqueue($_);
}
for (0..$thread_num){$DataQueue->enqueue(undef);}

$_->join for threads->list;

sub getaddress {
  while(my $DataElement = $DataQueue->dequeue()){
    my $address;
    if ( $cache{$DataElement}){
      print "[cache] ",$cache{$DataElement},"\n";
    }
    else {
      ($address) =  gethostbyaddr(inet_aton($DataElement),AF_INET);
      if ($address){
            print "$address\n";
            {
              lock %cache;
              $cache{$DataElement} = $address;
            }
      }
      else {
            {
              lock %cache;
              $cache{$DataElement} = $DataElement;
            }
            print $DataElement, "\n";
      }
    }
  }
}
__DATA__
222.228.235.193
157.113.18.68

これで結構オッケーなんだけど、アクセスログだとIPアドレスが連続してるのでキャッシュされてない且つ逆引き出来ないアドレスが続いてるとすべてのスレッドがそのアドレスを問い合わせにいってしまって遅かったりする。

どれかのスレッドが問い合わせ中のアドレスは問い合わせにいかないというような処理を入れたくなったけど、どういう風にしたらよいのかわからない。

perlでスレッド処理

javaの入門書を読んでいたら突然スレッド処理が気になりだした。そういえばどう書くにスレッド処理の問題あったな。

あった。

  • ログを順次読み取り処理する部分を,データを共有しつついかに並列化するか

pythonだとthreadingとかtwisted使った解答があって参考になった。というかtwistedは興味があるけどよくわからん。今度また改めて。で、thread使ったperlの解答がなかったので少し考えてみた。初めてのthreadプログラミング。

use strict;
use warnings;
use Socket;
use threads;
use Thread::Queue;

my $DataQueue = Thread::Queue->new();
my $thr1 = threads->create(\&getaddress);
my $thr2 = threads->create(\&getaddress);
my $thr3 = threads->create(\&getaddress);
my $thr4 = threads->create(\&getaddress);

while(<DATA>){
  $DataQueue->enqueue($_);
}
$DataQueue->enqueue(undef);
$DataQueue->enqueue(undef);
$DataQueue->enqueue(undef);
$DataQueue->enqueue(undef);
$thr1->join();
$thr2->join();
$thr3->join();
$thr4->join();

sub getaddress {
  while(my $DataElement = $DataQueue->dequeue()){
    my ($address) =  gethostbyaddr(inet_aton($DataElement),AF_INET);
    print "$address\n" if $address;
  }
}
__DATA__
74.6.16.244
203.104.98.219
219.111.208.65

ログの順次読み取りはThread::Queueをつかってキューに突っ込みつつそれぞれのスレッドがdequeueをしながら必要なデータをとってくようにすればよさげだけど、終了のさせ方がいまいちアレ。これだとスレッド生成の数だけundefをqueueに突っ込まないと終わらないですよな。

あとキャッシュを共有化してDNSサーバの負荷を軽減させないといけない。ロックかけないといけないのかな。perlthrtutあたりをじっくり読む必要があるな。

ProductName WEB+DB PRESS Vol.42
相馬 純平
技術評論社 / ?円 ( 2007-12-22 )


WEB+DB PressのPerlスレッドプログラミングのところもかなり参考にした。というかこの号は色々読みどころが多くて好きだ。

はんだー x はんだー

近所のホームセンターでハンダーライセンスゲット。

はんだごて買ってきた。あとワニ口クリップの小さいやつ。

しかし、フルカラーのLEDは売ってなかった。単色じゃなくてフルカラーのが欲しいのよ。

フルハウスを見はじめた

英語が鬼門だなぁと長いこと思ってたのだけど、これじゃいかんなと、最近まじめに取り組んでる。

で最近U隊長がフルハウスをみるんやとか言い出して、DVDを買った。

ProductName フルハウス -ファースト・シーズン- コレクターズ・ボックス [DVD]

ワーナー・ホーム・ビデオ / 6243円 ( 2005-08-26 )


で、これがまた笑いどころが分からないことが多いのでガヤがもどかしい。

MeadowでECB

Weboo! Returns.のスナップショットをみてたら、なんじゃこりゃ便利そうだと思い調べたらECBというらしい。

しかもMeadowだとネットインストールできるし。

ECB

うーん快適そう。

かかかかかかーめー(死亡)

家にサウンドロップが幾つかあったので、Gainerから鳴らしてみるという。事前の調査で要は3Vにすればいいんでしょ?と軽い気持ちでチャレンジ。

今回分解されたのはこのカメハメ波。

1206255937

カバーをはずすと基盤。

1206255926

上の方にある基盤のショートをさせる位置で鳴る音が変わるらしい。これをGainerと対応付けてキーボードかなんかで制御してやるのがゴール。 が、ハンダとか工具がないので、とりあえずは、USBの電源から音が鳴るようにすればいい。Gainerの出力が5Vだから、200kの抵抗を間にかませばいいと思うんだけど丁度いいのがないから320kの抵抗かましてつないだら音がなったけどなんか変。

か か か かめ かめ

とか断続的に音は鳴るんだけど、、、

とかいいながらいじってたらそのうち音が鳴らなくなってしまった。

いろいろ調べたらコンデンサをかますらしいんだけど、よくわかりませぬ。ブックオフか図書館でもいって電子工作関係の本を漁る必要があるな。

あと、みのむしクリップとかもないと配線できなくて困るなぁ

openidが気になったので調べてみた

突然、無性に気になって仕方がなくなったので。

OpenIDの仕様と技術を一通り読んだ。連載は分かりやすかったが、 第5回がちょっと理解できていないのであとでもう一度。あと、自分で実装してみないと本当に分かったんだか、分かったつもりになってるだけなのか分からないよねってことで、このblogのurlをvoxにdelegateするようにしてみた。

で、bloggerにテストコメントしてみた

openid_test

上が、kzfm.vox.comで下がblog.kzfmix.com。なんかユーザー名がblogとなっていて気持ち悪い。yahooのopenidだと長い文字列の羅列でさらにアレな感じが漂っていた。

そしてdrkcoreもCatalyst::Plugin::Authentication::Credential::OpenIDを入れてopenidでコメントできるようにいじる。


ところで、openidってのは、urlに人格っていうかヒトっぽいものの個性みたいのがくっついてるから面白いのかなーなんて思うのですよ。だからイントラでの使用ってのはちょっと想像しにくいですな。例えば顔もあわせたことのない巨大な企業とかで、大多数がイントラブログを書いてる状況とかだと有効なのかななんて思うのだけど。そういう認識でいいのだろうか。

それから、研究シーンとかだと、論文業績を個人ごとに集めたurlをpubmedなり出版社なりがopenidにしといたうえで、ヒトの論文にコメントできるようなサービスを構築すればいいのにと思ったり。結局もうちっとパブリックな査読のシステムとか必要なんじゃないの?とか思うことが多かったりとかするし。

雑誌にIFつけるんじゃなくて個々の論文に対するIFみたいなものつけないと駄目だよねとか思っているので、コメントする側のバックグラウンドとかはっきりしてれば、なんか面白そうな気がするけどねー。

抜天でランチ

知り合いが結婚して横浜のほうに移るので送別会を兼ねたランチを。

中国広東料理 抜天

円卓で個室なので子供連れにはかなり便利。

1206255946

前菜三種盛りとフカヒレのスープ

1206255935 1206255948

大根のマーボ炒めと鶏の唐揚げ

1206255944 1206255950

炒め物(忘れた)とエビチリ

1206255941 1206255957

麺と最後は杏仁豆腐で〆

1206255955 1206255931

福梅でうどん

犬のワクチン接種とか餌を買うために三島のほうまで出向いたので、昼は久しぶりに長泉駅前の「福梅」といううどん屋さんによった。

1206255927

待っている間はお絵かきタイム。娘はこのポータブルお絵かき先生があるとあまりぐずらないのでよい。500円でゲットしたにしてはもう一年以上使い続けている。

タラの芽、こごみ、ふきのとうの天麩羅と冷やしきつねうどん。 1206255929 1206255933

おろし生姜がいいアクセントになっていて美味。

で、帰りにU隊長のお目当てのパン屋に寄る。ここも駅となりで福梅のすぐ近くにある。

1206255953 1206255939