トップ(最新) | <前

nDiki : Perl

Perl

Naneyがよく使用しているプログラミング言語。 この nDiki を提供している DiKickerPerl で記述されている。

ちなみに ``Perlプログラミング言語を指し、``perl はその実装を指す(perlfaq1)。

ライブラリ

WindowsPerl

PerlGUI

スポンサード リンク

Related term

2007年11月18日 (日)

Google Analytics から TSV エクスポートしてキーワード詳細をチェック このエントリーを含むはてなブックマーク

Google Analytics で得られるキーワード情報で遊んでみようと思い、ちょっとその辺り触ってみた。

キーワードレポートを表示した後、Web ブラウザで今表示しているページの URL に末尾に&limit=50000 を追加 (公式ブログ参照)した URL のページを表示させて、次にエクスポートから TSV 形式でレポートを取得。

で、簡単なスクリプトで処理してキーワードを眺めてみた。

Google Analytics のページ上だと、現在このサイトのキーワード1位は「スーベレーンm400」。 ここにあがってくるのはキーワードの組み合わせによる順位なので、一旦バラしてみる。

そうすると結果はperlが1位。 最近そっち系の記事は減っているのだけれど、いちおうまだまだ主にコンピュータ関連のキーワードで検索されているようである。

個別に見てみると「-楽天」「-楽天市場」「-rakuten」「-yahoo」「-amazon」「-2ch」あたりもちらほら見かける。 検索結果の上位が通販ページで占められて、なかなか欲しい情報に辿りつけないことも実際多い。それらをうまく外したいという思惑だろう。 ちなみに自分は主要な通販サイトやオークションサイト を CustomizeGoogle でフィルタリングしてしまっている。

not 演算子って自分のサイトでどの語が嫌われてリーチしなかったかわわからない(当然アクセスしてこないから統計にあがらない)から、共有できると面白いとは思うんだけれどもな。

それと Google Analytics のエクスポートは API はないのかな。メールで定期的に送ってもらうことはできるので、設定すれば自動的にローカルでスクリプトにかけることはできるといえばできるのだけれど、こちらから簡単に取りにいければもっと嬉しい。

スポンサード リンク


[ 11月18日全て ]

2007年12月19日 (水)

初めての PerlC MAGAZINE このエントリーを含むはてなブックマーク

12月18日に Perl v5.10.0 がリリースされた。 1987年12月18日にリリースされた 1.000 (perlhist(1) より) から数えて20年目にあたるリリースである。

思い起こしてみると、自分が初めて Perl を知ったのは C MAGAZINE 1991年9月号の 特集フィルタ系言語研究,Part3 Perl入門 (前田薫氏) だったと思う。

当時は PC-88VA2 を使っていて、DOSエクステンダ版を試した記憶がある。 動いたような動かなかったような。

当時は UNIX 系システムは全く触れたことがなく、スクリプト言語もほとんど知らなかったので $ とか @ にはめまいを感じたものだ。

まさかあの Perl が今の自分にとって、第1プログラミング言語になるとは思ってもみなかった。


[ 12月19日全て ]

2007年12月27日 (木)

今日のさえずり - それ多分 Gmail spam フォルダの中 このエントリーを含むはてなブックマーク

naney:2139517973

  • 09:33 MovaTwitter の設定がリセットされていた(ように見える)。再設定。[mb]
  • 09:53 原付兄ちゃんが、点滅している信号を渡っている人に「赤になります。ご注意ください。轢きますよ。」と淡々と警告してた。L:秋葉原[mb]
  • 10:06 原付の人ちょっとヤバい感じだった (暴力的とかいうのではなくて、ちょっといってるような)。 *Tw*
  • 10:07 出社したらオフィスの玄関を入ってすぐのオブジェにイルミネーションが。誰? (社長ではないらしい) *Tw*
  • 12:00 Perl の statement modifiers (if/unless/while/until/foreach) に慣れると、C# とかで if 文とか書くのかったるい。 *Tw*
  • 12:32 社長がいっていた「報告メールがまだ」、それ多分 Gmail spam フォルダの中 (同じメールがこの間 spam フォルダに入ってた)。 *Tw*
  • 13:08 NUnit 2.4.5 インストール。 *Tw*
  • 18:37 NUnitデータベースの CREATE/DROP テスト書いていてどうもうまくいかないと思ったら、Npgsql がデフォルトで接続プールしてて DROP を阻止していた模様。 *Tw*
  • 18:39 オフィスの皆が忘年会に出発したので静寂がおとずれた。 *Tw*
  • 19:11 [mixi] おすすめマイミクシィ巡回してみた。友達の友達が友達になるかというとどうかな。 http://indies.mixi.jp/recommend.pl
  • 23:55 の分の年賀状印刷完了。

[ 12月27日全て ]

2007年12月29日 (土)

Twitter ベイジアンフィルタプロキシ このエントリーを含むはてなブックマーク

Twitter で following が増えてくるにつれて、タイムラインに目を通すのが大変になってきた(という程きちんと見ている訳ではないが)。 さっとタイムラインをなめて面白そうな情報をピックアップしたい時は、「おはよう」とか「風呂入った」とか「トイレ」とかは除外して読みたい(そういう書き込み自体は嫌いじゃないのだが、人生はあまりにも短い)。

Twit や P3:PeraPeraPrv では NG ワード指定ができて、それらを含むステータスは表示しないようにできるのだが、Twitter の書き込みは揺らぎが激しすぎて指定しきれないという弱点がる。

ということでベイジアンフィルタでフィルタリングしてみることにした。

自前で Twitter クライアントを作る気はないので、proxy の形でさっと実装してみた。

 #!/usr/bin/perl

 use strict;
 use warnings;

 use HTTP::Proxy;
 use HTTP::Proxy::BodyFilter::complete;

 my $proxy = HTTP::Proxy->new(port => 8088);
 $proxy->push_filter(response => HTTP::Proxy::BodyFilter::complete->new,
                     mime     => 'application/xml');
 $proxy->push_filter(response => Bsfilter->new,
                     mime     => 'application/xml');
 $proxy->start;

 {

   package Bsfilter;

   use File::Temp qw/tempfile/;
   use XML::XPath;
   use base qw(HTTP::Proxy::BodyFilter);

   sub filter {
     my ($self, $dataref, $message, $protocol, $buffer) = @_;
     return unless defined($$dataref) && $$dataref ne '';
     eval {
       my $xml = XML::XPath->new(xml => $$dataref);
       my @nodes = $xml->findnodes('/statuses/status/text/text()');
       return unless @nodes;
       for my $node (@nodes) {
         my $text = $node->getNodeValue;
         if (is_NG($text)) {
           $node->setNodeValue("[NG] $text");
         }
       }
       $$dataref = qq(<?xml version="1.0" encoding="UTF-8"?>\n);
       $$dataref .= $xml->get_context->toString;
       utf8::encode($$dataref);
     };
     if ($@) {
       warn $@;
     }
   }

   sub will_modify { 1 }

   sub is_NG {
     my ($text) = @_;

     my ($fh, $filename) = tempfile();
     utf8::encode($text);
     print $fh $text;
     close($fh);
     my $result
       = system(
       "bsfilter --homedir ~/.twitter-bsfilter --ignore-header --auto-update $filename"
       );
     unlink($filename);

     return !$result;
   }
 }

@ HTTP proxy の作成

PerlHTTP proxy を作ろうとして真っ先に思い浮かんだのは POE だけれど、ちょっとヘビーなので今回は HTTP::Proxy をチョイス。 もともとフィルタリング HTTP proxy を作ることを念頭に置いた Perl モジュールなので今回の目的にぴったり。

1つはまった点といえば、filter の呼び出しがレスポンス全てを取得してからではなく一部分ずつの呼び出しになるところ。その仕様に気がつくのにちょっと時間がかかってしまった。 例えば XML 形式のレスポンスをフィルタしようとしても、普通に HTTP::Proxy を使うと XML の一部ずつがフィルタに渡されるため、XML のパースがうまくいかない。

これについては HTTP::Proxy::BodyFilter::complete を使うことで、まとめてフィルタに渡せるようになった。

@ レスポンスの処理

Twitter のタイムライン取得については P3:PeraPeraPrvXML 形式で取得しているので、そのタイプのレスポンスをフィルタするようにした。

XML::XPath でステータス部分を抜き出して NG 判定し、NG であれば先頭に [NG] を追加する。 これで Twitter クライアント側で [NG] を NG ワード指定すれば、表示されないようにすることができる。

@ bsfilter による NG 判定

NG 判定は普段メールspam フィルタとして使っている bsfilter を使った。 単純に system 関数で呼び出して結果を取得するだけ。

今回は対象がメールではないので --ignore-header を指定。また自動的に学習するように --auto-update を指定。 それと普段メールのフィルタリングに使っているのとは bsfilterデータベースを別にしたいので、--homedir も指定しておく。

@ NG と非 NG の学習。

NG ワードを twitter-NG.txt に、非 NG ワードを twitter-clean.txt に書いて以下のコマンドを実行。

 bsfilter --add-clean --ignore-header --homedir ~/.twitter-bsfilter twitter-clean.txt
 bsfilter --add-spam --ignore-header --homedir ~/.twitter-bsfilter twitter-NG.txt
 bsfilter --update --homedir ~/.twitter-bsfilter

自分の環境 (Debian GNU/Linux sid)では、UTF-8 で書いておいて問題なかった。

@ フィルタリングしてみる

あとは先の proxy を起動し、P3:PeraPeraPrv でプロキシとして localhost:8088 を指定すれば OK。

タイムラインを取得するたびに bsfilter が動いて NG なステータスには [NG] が挿入される。

@ フィルタリングの精度

これについては、まだまだチューンの必要ありかな。

  • 事前の学習データが少ない。
  • --auto-update していることもあり、最初に NG 判定が多いとそちら側に強化されすぎる。
  • 毎回 bsfilter を呼んでいるため、同じステータスが何度も学習される。

まだ使える精度まで上がってないけれど、教師データを増やせばそれなりにいけるかもしれない。

proxy の枠組ができたので、(@~は抜いてから bsfilter に渡すとか、前後の文脈も含めるとか)いろいろ試して遊べそうではある。 別に bsfilter にこだわらず、正規表現による判定などをしてもよいし。

この辺り P3 は Java で書かれているので、プラグインを書いて拡張できるよう将来になると面白いなと思ってみたり。


[ 12月29日全て ]

2008年2月25日 (月)

Twitter への書き込みを自動的に Skype ムードメッセージに設定する このエントリーを含むはてなブックマーク

Linux for SkypeSkype APID-Bus を使ってアクセスすることができる。 Debian GNU/Linux sid 上の Skype for Linux 2.0.0.43 で、Perl スクリプトから自動的にムードメッセージを更新するようにしてみた。

Skype が起動している状態で以下のスクリプトを実行する。

 #!/usr/bin/perl

 use strict;
 use warnings;
 use Net::DBus;
 use URI::Fetch;
 use XML::RSS;
 use Date::Parse;

 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("[%02d/%02d %02d:%02d] $title", $mon + 1, $mday, $hour, $min);
 my $bus      = Net::DBus->session;
 my $service  = $bus->get_service('com.Skype.API') or die;
 my $invoker  = $service->get_object('/com/Skype') or die;
 my $response = $invoker->Invoke('NAME twitter2skypemood');
 die $response if $response ne 'OK';
 $response = $invoker->Invoke('PROTOCOL 5');
 die $response if $response ne 'PROTOCOL 5';
 $response = $invoker->Invoke("SET PROFILE MOOD_TEXT $mood");

image:nDiki/2008/02/Skype-API-auth.png

のようなダイアログが表示されるので、「この選択を記憶する」をチェックして、はいを選択。

そうすると RSS フィードとしてとってきた 自分の Twitter メッセージが、Skype のムードメッセージに表示される。自分の環境では日本語も問題なく表示される。

うまくいったので cron で定期的に更新するようにしてみた。

Skype API 面白いかも。

@ 追記


[ 2月25日全て ]

2008年3月6日 (木)

今日のさえずり - 京都小学校のコンピュータ室にいったら、Squeak が このエントリーを含むはてなブックマーク

@ 2008年03月05日

naney:2311864816

@ 2008年03月06日

  • 11:33 そういえばこの間京都小学校のコンピュータ室にいったら、Squeak がインストールされていた。使っているのか?
  • 12:53 オートペディアしてみた。 http://tinyurl.com/3ygonk
  • 14:18 サーバ上で svnadmin create してみたが何故か終了しない。何度かやっても駄目。バージョン上げてみるか。
  • 14:34 Subversion 1.3.0 から 1.4.5 (Red Hat Linux 8.0 用バイナリ) にあげたら、すんなり svnadmin create できるようになった。
  • 17:00 そうか C# って既にあるクラス名と同じ名前空間名を作れないのか。Perl の package と同じつもりでいたので、名前考え直しだ。
  • 18:20 昨日のお昼に注文した VQ1005 の注文確認メールがようやくきて一安心。

[ 3月6日全て ]

2008年3月13日 (木)

TwitterアイコンPerl スクリプトで更新する このエントリーを含むはてなブックマーク

API 経由では Twitterアイコンを変更できなさそうなので、WWW::Mechanizeアイコン画像をアップロードする Perl スクリプトを書いてみた。

 #!/usr/bin/perl

 use strict;
 use warnings;
 use WWW::Mechanize;

 die "no file name" if @ARGV == 0;
 my $file_name = $ARGV[0];

 my $name     = 'ユーザ名';
 my $password = 'パスワード';

 my $mechanize = WWW::Mechanize->new();
 $mechanize->get('http://twitter.com/');
 die unless $mechanize->success;
 $mechanize->submit_form(form_number => 1,
                         fields      => {
                                    username_or_email => $name,
                                    password          => $password});
 die unless $mechanize->success;
 $mechanize->follow_link(text => 'Settings');
 die unless $mechanize->success;
 $mechanize->follow_link(text => 'Picture');
 die unless $mechanize->success;
 $mechanize->submit_form(
                      form_number => 1,
                      fields => {'profile_image[uploaded_data]' => $file_name}
 );
 die unless $mechanize->success;

[ 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日全て ]

2008年8月15日 (金)

今日のさえずり - 泣きながら 100g 少なくなったアタックを買った このエントリーを含むはてなブックマーク

@ 2008年08月12日

  • 12:26 家から水羊羹もってくるの忘れた。
  • 20:10 「ダーリンは外国人」の新しいバージョンの車内放送見た。前から本読んでみたいと思ってる。[mb]

@ 2008年08月13日

  • 10:33 水やりを頼まれているイチゴがげんなりしている。マズイ。
  • 19:45 泣きながら 100g 少なくなったアタックを買った。さくっとスプーンとかどうでもいい。[mb]

@ 2008年08月14日

  • 11:22 早弁する。
  • 19:36 これからイトーヨーカドーに寝間着買いに行く。[mb]
  • 19:51 寝間着買った。半袖長ズボンいいのがなかったので、半袖半ズボンで妥協した。[mb]

@ 2008年08月15日


[ 8月15日全て ]

2008年11月18日 (火)

MAILPIA による Twitter リプライチェック このエントリーを含むはてなブックマーク

リプライのチェックは Twitter 検索での「@自分」検索結果 + MAILPIA にしていた。しかし夏ぐらいから Twitter 検索Twitter API仕様変更であまり検索がヒットしなくなってしまいリプライをメールで受信できなくなってしまった。

まだ使ったことないけど「あらったー!」も取りこぼしがあるらしいし、replies API を使うクローズドアルファバージョンは登録受付終了中。

とりあえず replies.atom をさらす Perl CGI スクリプトを作って、それを MAILPIA に読ませることにした。 骨子はこんな感じのみ(実際には一応パスワード暗号化して保存しておいたりしている)。

 use CGI;
 use LWP::UserAgent;

 my $url = 'http://twitter.com/statuses/replies.atom';
 my $query = CGI->new;
 my $user_name = 'myusername';
 my $password = 'mypassword';

 my $ua = LWP::UserAgent->new;
 $ua->credentials('twitter.com:80', 'Twitter API', $user_name, $password);
 my $response = $ua->get($url);

 print $query->header('application/atom+xml; charset=utf-8');
 print $response->content;

これを設置した URLMAILPIA に登録して出来上がり。

@ Twitter Search

考えてみたら Twitter 公式の検索があるんだっけ。 日本語検索が駄目駄目なので使っていないけれど、リプライ検索には使える。

新しいリプライもすぐひっかかるようなので Twitter Search + MAILPIA の方がいいな。 パスワードサーバにおいておかなくても良いし。

……と思ったらフィードの title にリプライした人の名前が入っていないな (author に入っている)。これだと MAILPIA からのメールに名前がはいらないかもしれない。

ま今回は自作スクリプト経由にしておくか。


[ 11月18日全て ]

スポンサード リンク

■よく検索されるキーワード

提案書(75) torrent(69) perl(61) 書き方(45) 充電式カイロ(43) windows(38) x31(36) 使い方(32) linux(32) cvs(25) アジェンダとは(25) usb(25) thinkpad(23) 静電気(21) サンプル(20) 口コミ(20) ヨドバシ(20) アジェンダ(20) 画像(19) debian(19) ubuntu(19) mp980(18) f-01a(18) 手帳(17) tc-1(17) 秋葉原(16) ssh(16) subversion(16) グッズ(16) a6(15) 壁紙(15) ほぼ日手帳(15) c#(14) ダイソー(14) svn(14) 交換(14) インストール(13) 加湿器(13) firefox(12) ノート(12) 無印(12) 日本語(12) wiki(12) ganttproject(12) デロンギ(11) 方眼(11) ヨドバシカメラ(11) デザイン(11) nikkor(11) 設定(11) 作り方(11) dropbox(11) af(10) terastation(10) memcached(10) レビュー(10) カバー(10) カイロ(10) 2009(10) 除去(10) nikon(10) tortoisesvn(10) クラリチン(9) ガントチャート(9) 動画(9) ポメラ(9) ご査収(9) rcs(9) モジュール(9) n-01a(9) フィルム(9) 写真(9) システム手帳(9) edition(9) porter(9) xp(8) imap(8) 4c(8) docomo(8) ミニ6穴(8)

この日記のはてなブックマーク数 Add to Google RSS

Process Time: 15.311022s / load averages: 0.11, 0.27, 0.35
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)