サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
デスク環境を整える
download-takeshi.hatenablog.com
前回のエントリで案内した通り、perlの本文抽出モジュール「HTML::Feature」を全面的に作り直し、リリースしました。すでにCPANにも反映されています。今回の改修で、抽出精度が向上し、且つ全体的にも高速化がなされました。ヤタ! HTML::Feature - Extract Feature Sentences From HTML Documents http://search.cpan.org/~miki/HTML-Feature/ 以下、簡単に新機能をご紹介します。 エンジンモジュールを直列に並べる 従来からコアとなるエンジンモジュールについては、任意のものに置き換えることができるようになっていました。デザパタでいうと「Strategyパターン」です。 version 3.00 からは、任意の個数のエンジンを好きな順番で直列に並べられるようになりました。 例えば全く異なる抽出方
2年ほど前にHTML::FeatureというPerlの本文抽出モジュールを書きました。 こいつはブログやニュース記事から「本文らしき箇所」を適当に推測して抽出してくれるモジュールでして、リリースした当時はライバルもいなかったので、ブログなどでは結構反応がよかったです。外国の方も何人か使ってくれたりして、それなりに充実感のあるモジュールでした。 しかし、昨年HTML::ExtractContentが出現してからは、すっかりその地位を奪われ&忘れられた感がありました。作者としては「ま、いっか」的なノリだったのですが、最近になって急に「本文抽出界での復権を目指し全面リメイクを敢行するよ!」と思うに至りました。 改善方針 方針ってほどの方針ではありませんが、 - サイトごとに定義できる部分はすなおに定義する - アルゴリズムに頼りすぎない - google adsenceの人気にあやかる - 全体
なぜか突然プライオリティキューの実装方法を知りたくなってしまい、C++のSTLを少しだけ勉強しました。 C++は入門書を何冊か読んだ程度なんで、ド素人ですが、頑張ってSTL書いてみました。 #include <iostream> #include <queue> #include <map> class MyData { private: int age_; std::string name_; public: MyData(std::string name, int age){ age_ = age; name_ = name; } ~MyData(){ } int age() { return age_; } std::string name() { return name_; } }; struct CompareMyDataGreater { bool operator() ( M
CPANにあがってるApp::Daemonというのを試してみたくて、cpanコマンドでインストールしようとしたらエラーが出てしまいました。Proc::ProcessTableという依存モジュールの関連でこけてるようです。 エラーログをチェックしてみたら「undefined symbol: pthread_once」とか言ってるよ。。。だるいな〜、あきらめよっかな〜、と思ったんですがググッたらすぐ答えが見つかりました。 https://www.webgui.org/bugs/tracker/10021 Solution Summary Downgraded Proc-ProcessTable from 0.45 to 0.44 due to bug in perl module. 最新版である0.45を0.44にダウングレードすればいいらしい。 ふーん。じゃ古いやつをインストールすっか、とい
夜中の3時半過ぎですが、久しぶりになんか書こうと思います。 ちょっと前にmixiのfujisawaさんという方がすごくナイスなソフトウェアをリリースしてくれました。 「軽量データクラスタリングツールbayon」 http://alpha.mixi.co.jp/blog/?p=1049 今までにもCLUTOというすごく高精度なクラスタリングツールがありましたが、こいつはライセンス的にちょっとイケズな感じでした。そこにbayonがスーパーマンのように登場してくれました!「商用利用OKだよ」ということで、仕事の上での悩みが解決しました。本当にありがたいことです。 さてさて、早速使ってみたいんですが、ブログに書くのにちょうどいい題材がなかったので、以前に自分が書いたエントリからデータを持ってくることにしました。 「芸能人の相関関係を探ってみるスクリプト」 http://d.hatena.ne.jp
FlashのXMLSocketサーバ「Hoppy」をリリースしました。 Hoppy - Flash XMLSocket Server http://github.com/miki/Hoppy/tree/master githubにあげてあります。そのうちCPANにも反映されると思います。 HoppyはFlashのXMLSocketサーバのperl実装です。いわゆるプッシュ型のwebアプリケーションを簡単に実装することを目標としたTCPサーバです。 内部はperlのPOEによるイベントドリブンな実装なので、POEの知識がある方であれば、かなり柔軟にサーバの振る舞い自体を変更したり拡張したりすることができます。逆にPOEを知らない人でも、いくつかの決めごとに従うだけで、簡単に機能を搭載していく事ができます。 基本的な決めごと Hoppyはある程度の「決めごと」を前提とした、汎用的で拡張可能なX
ベイジアンフィルタとかベイズ理論とかを勉強するにあたって、最初はなんだかよくわからないと思うので、 そんな人にお勧めのサイトを書き残しておきます。 @IT スパム対策の基本技術解説(前編)綱引きに蛇口当てゲーム?!楽しく学ぶベイズフィルターの仕組み http://www.atmarkit.co.jp/fsecurity/special/107bayes/bayes01.html いくつかの絵でわかりやすく解説してあります。 自分がしるかぎり、最もわかりやすく親切に解説してる記事です。数学とかさっぱりわからない人はまずここから読み始めるといいでしょう。 茨城大学情報工学科の教授のページから http://jubilo.cis.ibaraki.ac.jp/~isemba/KAKURITU/221.pdf PDFですが、これもわかりやすくまとまってます。 初心者でも理解しやすいし例題がいくつかあ
ちょっとした実験をしてみました。芸能人の相関関係を機械的に探索してみます。 具体的には「○○というタレントと関係が深い芸能人は?」といった、芸能人にフォーカスした類似検索みたいな実験です。 技術的には「潜在的意味インデキシング」(Latent Semantic Indexing)といった手法を使います。 これは普通は自然言語処理の世界で使われるテクニックですが、なにも言語だけでなく他のデータ素材でも面白い結果が得られるかもしれないので、やってみようという試みです。 以下に大まかな手順をまとめます。 wikipedia から有名人のリストを抽出 それらの有名人リストについて、一人ずつ「誰と関連が深いか」を集計。具体的には有名人個々のwikipediaのページ中に、先ほど抽出しておいた人名リストとマッチする人名がどれだけ掲載されているかをピックアップしていきます。 上記の方法で有名人の間の相関
久々のエントリです。 Locality Sensitive Hashing を perl で使うためのモジュールを書いてみました。Algorithm::LSHと名付けました。 先ほどDeveloper ReleaseとしてCPANにあげましたが、反映されるまで時間かかるので、興味ある方はcodereposからみてください。 Algorithm::LSH CPAN: http://search.cpan.org/~miki/Algorithm-LSH/ coderepos: http://coderepos.org/share/browser/lang/perl/Algorithm-LSH 超アルファバージョンな状態ですが、そのうちgithubにもupする予定。 そうそう、そう言えば WEB+DB PRESS Vol.49 にレコメンドエンジンの特集があって、その中に偶然にもLocality
POE::Component::RemoteTailというものがありまして、これは昨年の夏前後に何となく遊びで作ってCPANに上げていたモジュールです。 POE-Component-RemoteTail - tail to remote server's access_log on ssh connection http://search.cpan.org/~miki/POE-Component-RemoteTail リモートのアクセスログをtail -fするようなイメージで、それを何台でも同時にノンブロッキングなイベントとしてPOEに取り込む、といった類いのものなんですが、自分としては「そこそこ便利なものつくったかな」と思ってたんですが、ブログに書いてみてもまったく反応なし、という悲しみの作品でした。。。 ところが今頃になって、意外なことに国外から改善要望みたいなのが来たので、ちょっとび
ここのところ色々と忙しくてブログ更新できなかったんですが、久しぶりに時間がとれたので、ここ最近でCPANにうpしたモジュールをいくつか紹介しようと思います。 さてさて、みなさん、サーバのアクセスログなどをリモートの環境からtailしたい。しかも同時に何台もtailしたい。そんなとき、どうしますか? 「そんなの ssh -A SERVER "tail -f ACCESS_LOG" でいいんじゃね?」 そうですね。それで十分なんですが、このtail -f で流れてくる情報を「ノンブロッキングなイベントループ」の中に取り込むようなプログラミングをしようとすると、実はちょっと工夫が必要になります。 例えば tail -f xxxx > outfile みたいにファイルシステムに書き出しつつ、別のプロセスでそのファイルを非同期に取り込んでイベントループとしてハンドリングする、、とか。 それはそれで、
id:naoyaさんやたつをさんなどの超有名人な方々が以前から実施されている「IIR輪読会」というものがありまして、どうやら今回は第18章の "Matrix decompositions and latent semantic indexing"を輪読したようです。 http://d.hatena.ne.jp/naoya/20090208 http://chalow.net/2009-02-08-2.html Latent Semantic Indexingとは、通称LSIとかLSA(Latent Semantic Analysis)とかいいますが、日本語だと「潜在的意味インデキシング」なんて呼びますね。 簡単に言ってみると でっかいマトリックス(数万×数万とかの行列)をたとえば「数百×数万」ぐらいにまで、ぎゅぎゅっと横に押しつぶすように圧縮してみると、あら不思議、のこった行列はとても意味
Kamaitachi の追っかけ記事の第5回目です。 いいかげんねちっこく人のソースを追いかけるのもいかがなものか、と感じつつも、id:ZIGOROuに励ましてもらったので、もう少し続けます。 さて今回はKamaitachi::IOStreamを攻めます。 Kamaitachi::IOStreamとはRTMPストリームのreader/writerです。 主立った役割としてはこんな感じ。 Socketに入ってきたデータはKamaitachi::IOStreamのBufferにpushされる Bufferに入ったデータはget_packet()により適切なBytes数がread()される read()では適宜バイナリをunpack 逆にwrite()ではデータをAMFのカタチにserializeしてからsocketに書き込む またIO−Bufferのための操作用のメソッド(spinとか)が色々
1昨日のことですが、SocialWeb-japanの第1回勉強会に行ってきました。 SocialWeb-japanとはagektmrが音頭をとって立ち上げた「OpenStack(OpenIDやOAuth, OpenSocial, PortableContacts, etc.)やFacebookを中心とした、ソーシャルウェブにまつわる技術の情報交換、勉強会のためのコミュニティ」です。 昨年12月に出来たばかりですが、現在google groupで参加人数178名と、それなりの活気をもったコミュニティに成長しています。今後のwebのあり方を考える上で、色々な意味で注目に値するコミュニティに発展していくのでは!?と密かに期待をよせております。 さて、そのSocialWeb-japanの第1回勉強会がDeNAの会議室にておこなわれた訳ですが、実は当日夕方に急用ができてしまい、だいぶ遅刻してしまった
Flash Media Serverで使われているRTMPプロトコルのことを知りたくてOpenSourceFlashにのってる「Mick’s Breakdown of RTMP」を訳しながら自分でも試してみました。 まずはRTMPサーバを動かしているサーバでtcpdumpしてみてます。 tcpdump -s 1600 -x -i eth0 src port 1935 ちなみに、ここで動かしてるRTMPサーバはKamaitachiです。 サンプルとして提供されているチャットサーバを起動しているサーバでのtcpdumpの結果は以下のようなものとなりました。(説明しやすくするために色をつけています) 0x0000: 4500 004a 5f2d 4000 4006 221d c0a8 0164 0x0010: cae5 2c72 078f f7fc 483c d4e8 2a1c 2f1d 0x0
ちょっと間が空いてしまいましたが、Kamaitachiのコードリーディング第3弾です。 今回はユーザセッションを管理するKamaitachi::Sessionを見て行きます。 ですがその前に、Kamaitachiについて改めておさらいしますよ。 Kamaitachiとは、typesterさんとid:hide-Kさんが鋭意開発中のperlによるRTMPサーバの実装( =~ Flash Media Server)です。Danga::SocketやMooseといったperl界隈では有名な先進的モジュールを駆使したオープンソースプロダクトです。また話題のgithubで開発が公開されているあたりもニクいですね。 そんなオシャレなKamaitachiに触れてみようと、old typeなperlプログラマであるダウンロードたけし(寅年)が、突然入門日記を書き始めてしまったが、2回書いたところで放置じゃん
前回に引き続きperlのRTMP実装であるKamaitachiのコードリーディングです。 今回はKamaitachi本体のソースコードを見ていきます。 lib以下のモジュールファイルの構成 [miki@vmware kamaitachi]$ tree lib lib |-- Kamaitachi | |-- IOStream.pm | |-- Packet | | `-- Function.pm | |-- Packet.pm | |-- Service | | |-- AMFHandler.pm | | |-- AutoConnect.pm | | |-- AutoConnectACL.pm | | |-- Broadcaster.pm | | |-- ChildHandler.pm | | |-- ConnectionHandler.pm | | |-- Core.pm | | |--
Kamaitachiとは、typesterさんが鋭意開発中のperlによるRTMPサーバの実装( =~ Flash Media Server)です。 RTMPサーバのオープンソース実装としてはRed5やWowza、RubyIzumiなどが知られていますが、「perl使いだったらKamaitachiだよ!」ということで、年の瀬の忙しい中、家族の冷たい視線に刺されつつKamaitachiに入門してみようと思います。 Kamaitachi とは まずは周辺情報の整理から。 Kamaitachiの紹介サイト http://bm11.kayac.com/project/kamaitachi/ 作っている人 id:typester id:hide-K typesterさんのブログ http://unknownplace.org/memo/search?q=kamaitachi ソース http://g
最近人気のgithubを試してみました。 gitさわるの初めてだったのでインストールするところから書いて行きます! まずはgitのインストール 触ってるサーバがCentOS 5.1なので、yumってみることにしました。 /etc/yum.repos.d/CentOS-Base.repo に以下を追記。 [dag] name=Dag RPM Repository for Redhat EL5 baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag gpgcheck=1 enabled=1 gpgkey=http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txtあとはyumでインストールするだけ。 [miki@server ~] yum install gitラクチンでした。 git
会社で隣の席にすわってるKさんから「DBIでexecuteする時に色々な値をbindするじゃないですか。その後で実際に投げられたSQL文を引っ張ってくる方法ないんですか?」と質問されちゃいました。 そう言えばDBIx::Classとかだと環境変数でなんかセットするんだったけど、素のDBIの場合どうするのかな?と思って調べてみました。 DBIの長い長いドキュメントをずーっと読み進んで行くと、下の方に「TRACING」というセクションがありまして、そこにヒントが隠されてました。 どうやらTrace Flagsで「SQL」と指定すると標準エラーにトレース情報が出力されるみたいです。 具体的にはこれでいいみたい。 $dbh->{TraceLevel} = "3|SQL"; これでSTDERRにバコバコっとトレース情報が出力されて行きます。 STDERRの中に、実際に投げられたSQL文も含まれている
mysql5.1もようやくStableになったことですし、うれしいので話題のQ4Mをインストールしてみました。 今回はソースからコンパイルしてみました。 以下、その際のインストールメモです。 今回インストールするのは各々このバージョンです。 * mysql-5.1.30.tar.gz * q4m-0.8.3.tar.gz mysqlのインストール まずは mysql-5.1.30 です。適当にコンパイルしてください。 configreに渡すオプションは用途によって色々代わると思いますが、今回はこんなパラメータでconfigureしました。 $ ./configure \ --prefix=/usr/local/mysql \ --libexecdir=/usr/local/mysql/bin \ --sbindir=/usr/local/mysql/sbin \ --with-charse
数週間前の話になりますが、「はてブのリニューアル会見」の記事を読んでいたところ、はてブにも「自動カテゴライズによる記事分類」の機能が搭載されるとか。。。 同じようなタイミングで「似たようなモノ」というか「ほぼ同じようなモノ」を作っていたので、すごーくインスパイアされてしまいました。ジュワ〜。(アドレナリンの放出音) 数週間たってもいまだ興奮冷めやらぬ状態なので、今日はその件について書いてみようと思います。 Lingua::JA::Categorize - a Naive Bayes Classifier for Japanese document. http://search.cpan.org/~miki/Lingua-JA-Categorize-0.00001/ 「はてブのパクリ」ではありません。「ベイジアンによる日本語テキスト分類器」を「簡単に作る」ことを目的としたモジュールです。 も
データマイニングを行う際に、適当な2つの変数にどれだけの相関関係があるのか確かめたくなったとします。 それらのデータはいわゆる「名義尺度」なデータ(地域別の野球チームの好き嫌いなど)だとしましょう。 名義尺度なデータ間における連関係数と言えば「クラメール係数」。 これをぱっと算出してくれるモジュールが欲しくなったので書いてみました。 Statistics::Associations - Calculates Association Coefficients of Nominal Scale. http://search.cpan.org/~miki/Statistics-Associations/ 使い方はこう。 use strict; use Statistics::Associations; my $asso = Statistics::Associations->new; my $m
1つ前のエントリで「特徴語を抽出するモジュール」のことを書いたらそこそこ好評だったみたいなので、調子に乗ってもう1本モジュールを紹介しておきます。 Lingua::JA::Expand - word expander by associatives http://search.cpan.org/~miki/Lingua-JA-Expand/ Expandってあたり、命名センスないのがバレバレですが、、 これは何をするものかと言うと、任意のキーワードを適当な数の関連語セットに膨らませてくれるモジュールです。 使い方と結果サンプル 使い方はこうです。 use strict; use Lingua::JA::Expand; my $str = 'ラーメン'; my $exp = Lingua::JA::Expand->new; my $result = $exp->expand($str); #
情報検索の分野でよく使われるアルゴリズムで「TF/IDF」というものがあります。 ドキュメントの中から「特徴語」を抽出する、といったような用途でよく使われています。 TF/IDFアルゴリズムのくわしい解説はこことかここを見てください。 今回はこのTF/IDFの計算を「簡単」に実現するためのperlモジュールをCPANに上げましたので、ご紹介します。なまえはLingua::JA::TFIDFといいます。 Lingua::JA::TFIDF - TF/IDF calculator based on MeCab. http://search.cpan.org/~miki/Lingua-JA-TFIDF TF/IDF実装の困りどころ TF/IDFの実装を試みた方であればわかると思うのですが、実際にやろうとすると、TF(Term Frequency)の計算はなんら難しくありませんが、IDF(Inve
ダブル配列なTrie構造を実装するためのライブラリであるDartsを試してみました。 DartsはMeCabの作者として知られる工藤 拓氏の作品で、もともとMeCabに組み込まれていたDouble-Arrayのコード部分を、工藤氏が改めてリパッケージしてものだそうです。 なおDartsそのものはC++ライブラリなので、これを他の言語から使うにはバインディングが必要となります。perlから使うにはCPANにText::Dartsというモジュールがあがっているので、これを使わせてもらいます。 なおText::Dartsは、これまた有名なid:dankogai氏の作品です。 で、これらを試してみたのですが、結論から言うと Dartsを使うには Text::Darts 0.03は現時点でDarts0.32に対応していないっぽい。makeでコケる。なのでDarts0.31を使うべし。 Dartsに付
名前のまんまですが、ApacheのアクセスログからHTTP::Requestオブジェクトを作るモジュールをCPANにうpしておきました。 http://search.cpan.org/~miki/HTTP-Request-FromLog-0.00001/ 利用用途ですが、開発環境と商用環境が分かれているような場合に、商用環境のサーバに流れてくるトラヒックを開発環境のマシンにも流してやりたい!というようなケースを想定しています。 単純な発想ですが、商用環境のaccess_logからHTTP::Requestオブジェクトを再生して開発環境のマシンに投げてやれば、一応それっぽいことはできるかなと。 ちなみに内部のエンジン(ログをparseする部分)はデフォルトだとParse::AccessLogEntryというCPANモジュール使ってますが、ここは自由に差し替え可能です。 なので「うちのログフォ
最近久しぶりにCometとかFlashのXML-Socketとかを調べています。 Cometといえばチャットに代表されるように「テキストや画像の配信」が頭に思い浮かびますが、 今回はjsonpで任意のイベントを送り込む例として「サーバにアクセスしている人のブラウザを好き勝手に動かしてみる」という、やや怪しげなサンプルを書いてみました。 仕組みはこんな感じ。 サーバはPOEで動作します。HTTPの受け口とコマンドラインを受け付ける口を持っています。 クライアント側からはjqueryを使ってXHRなlong_pollセッションを張っておきます。 サーバからは任意のタイミング(コマンドラインを受け付けたタイミング)でjsonpを送ってやります。 クライアントは受け取ったjsonpによってあらかじめロードしておいたいくつかの関数のうち、どれかがキックされる というような構成です。 実際にどうなるか
今まで知らなかったんだが、HTTP::Request::AsCGIというのを使うとテストとかにスゴく便利らしい。 というわけで、早速いくつかのブログを見ながら触ってみた。 use strict; use HTTP::Request; use HTTP::Request::AsCGI; use CGI; use Data::Dumper; # HTTP::Requestオブジェクトを作っておく my $url = "http://localhost/test?key1=value1&key2=value2; my $req = HTTP::Request->new("GET", $url); # AsCGIでcgi環境を作る my $c = HTTP::Request::AsCGI->new($req)->setup; my $q = new CGI; # クエリーパラメータを出力してみる
次のページ
このページを最初にブックマークしてみませんか?
『download_takeshi’s diary』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く