OPML2Twitterをつくってみた – よくきたblog

まずplnet.最近で言うとaboutmeっぽいやつですけどずいぶん前からあります. ようするに自分のいろんなCGM系コンテンツがある人がそれらのRSSなどのフィードを用いて1箇所にまとめちゃいなYO!!ってサービスです.

(中略)

- OPMLを取得する - simplexmlで解析し,フィードURL群を束ねる - XML_Feed_Parserでエントリ群の題名,URL,日付を取得する - エントリをTwitterに送る,とりあえず複数エントリある場合の送信は2分間隔でおこなう.

よくきたblogで上鍵さんがPlnetを利用して最新エントリをTwitterに送るスクリプトを公開してくださってます。

OPMLのアイコンがかわいいという理由だけでOPML出力してたんですが(言い過ぎですが)初めて使われた気がして感動しました。それと同時にバグも見付かって上鍵さんには直でPlnetのTracにわざわざTicketを入れて貰いました。

なんでRSSじゃなくてOPMLなのかというとエントリのURLが元の記事じゃなくてPlnetのパーマリンクになるからなんですな。RSSにそれっぽい語彙があったらそのURLも忍ばせたいもんです。

それとさり気なくPHP5を使ってるのがショック。PlnetはPHP4なのでUbuntuでの開発が面倒になりつつあります。(家のDebianで開発してる)simplexmlとかXML_Feed_Parserとか便利そうですね・・・。

Martin Albisetti » Blog Archive » PHP4 not available in Feisty

PHP4 is not in Feisty Fawn’s repositories at all and has been completely replaces by PHP5.

Ubuntu 7.04で遂にPHP4が消えたーーーっっっ!!

まいったなこりゃ。

PHPでクロージャ

$ cat closure.php
<?php
function get_adder() {
    static $count = 0;
    return create_function('', 'return ++$count;');
}

$adder = get_adder();
echo call_user_func($adder);
echo call_user_func($adder);
echo call_user_func($adder);
$ php closure.php
111

・・・に、失敗!

そもそも“正しいパフォーマンス改善”とは何なのか。

要するに勘で良いとされることを手当たり次第やるんじゃなくて、原因に基づいて対策をしたい。

前回のとこのzionicさんのコメントとエントリが参考になりました。

zionicの日記

wa(I/O Wait)は0なので、とりあえず無視する。us(User Space)がやたら高い。基本的にはCPU食いすぎ、と考えてよいと思われる。

色々対策したい部分はあるけれど、兎に角CPUを食わないようにしなきゃいけない!

エントリにあるようにeAcceleratorが効きそう。構文解析しない分CPUの負荷は減るはず。

手元の環境で試してみました。

$ sudo apt-get install php4-dev
$ wget 'http://bart.eaccelerator.net/source/0.9.5/eaccelerator-0.9.5.tar.bz2'
$ tar jxf eaccelerator-0.9.5.tar.bz2
$ cd eaccelerator-0.9.5
$ phpize
Configuring for:
PHP Api Version:         20020918
Zend Module Api No:      20020429
Zend Extension Api No:   20050606
$ ./configure --enable-eaccelerator=shared --with-php-config=/usr/bin/php-config
$ make
$ sudo make install
Installing shared extensions:    /usr/lib/php4/20020429/ 
$ sudo vi /etc/php4/apache2/php.ini
[eaccelerator]
zend_extension="/usr/lib/php4/20020429/eaccelerator.so" 
eaccelerator.shm_size = "32" 
eaccelerator.enable = "1" 
$ mkdir /tmp/eaccelerator
$ chmod 0777 /tmp/eaccelerator

apache2-utilsのApache BenchでeAccelerator有り/無しで測ってみた。

eAccelerator無し:

$ sudo ab -c 5 -n 100 http://plnet/komagata/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking plnet (be patient).....done

Server Software:        Apache/2.2.3
Server Hostname:        plnet
Server Port:            80

Document Path:          /komagata/
Document Length:        21964 bytes

Concurrency Level:      5
Time taken for tests:   35.508370 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      2235600 bytes
HTML transferred:       2196400 bytes
Requests per second:    2.82 [#/sec] (mean)
Time per request:       1775.418 [ms] (mean)
Time per request:       355.084 [ms] (mean, across all concurrent requests)
Transfer rate:          61.48 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   79 281.9      0    1781
Processing:   318 1669 2986.9    680   20417
Waiting:        0  750 1461.3    366    8742
Total:        318 1748 3033.9    701   20417

Percentage of the requests served within a certain time (ms)
  50%    701
  66%    899
  75%   1125
  80%   1651
  90%   5874
  95%   8144
  98%  12675
  99%  20417
 100%  20417 (longest request)

eAccelerator有り:

$ sudo ab -c 5 -n 100 http://plnet/komagata/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking plnet (be patient).....done

Server Software:        Apache/2.2.3
Server Hostname:        plnet
Server Port:            80

Document Path:          /komagata/
Document Length:        21964 bytes

Concurrency Level:      5
Time taken for tests:   18.760849 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      2236800 bytes
HTML transferred:       2196400 bytes
Requests per second:    5.33 [#/sec] (mean)
Time per request:       938.042 [ms] (mean)
Time per request:       187.608 [ms] (mean, across all concurrent requests)
Transfer rate:          116.41 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0       1
Processing:   520  928 596.4    859    6521
Waiting:      241  637 590.1    553    6212
Total:        520  928 596.5    859    6522

Percentage of the requests served within a certain time (ms)
  50%    859
  66%    925
  75%    978
  80%    996
  90%   1122
  95%   1227
  98%   1832
  99%   6522
 100%   6522 (longest request)

Requests per secondが2.82 [#/sec] → 5.33 [#/sec]で倍近くに増えてる。これは良さそうだ。

昨日の1時頃、Plnet.jpに入れてみました。

graph_image.png

あんまり変ってないな・・・。

あと気になる点はmysqlのslow-queryがバリバリ出てるとこ。しかしtopでmysqlは全然あがってこないのでCPUに関係無いと思う。それともmysqlが遅いとそれに関係したapacheがCPUを使うってことがあるのかな?

いちおうtop:

top - 11:51:08 up 190 days,  3:46,  1 user,  load average: 9.55, 7.71, 5.17
Tasks:  67 total,   2 running,  65 sleeping,   0 stopped,   0 zombie
Cpu(s): 85.1% us, 14.9% sy,  0.0% ni,  0.0% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:    971496k total,   757916k used,   213580k free,    52888k buffers
Swap:  2000084k total,    51384k used,  1948700k free,   536868k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
24948 www-data  15   0 53868  15m  47m S  1.0  1.7   0:00.49 apache2
24883 www-data  15   0 56740  17m  47m S  0.6  1.9   0:01.81 apache2
24815 www-data  16   0 54360  18m  47m S  0.3  1.9   0:01.22 apache2
    1 root      16   0  1504  420 1352 S  0.0  0.0   0:13.74 init
    2 root      34  19     0    0    0 S  0.0  0.0   0:00.14 ksoftirqd/0
    3 root       5 -10     0    0    0 S  0.0  0.0   0:00.00 events/0
    4 root       5 -10     0    0    0 S  0.0  0.0   0:00.00 khelper
   15 root       5 -10     0    0    0 S  0.0  0.0   3:40.75 kblockd/0
   51 root       5 -10     0    0    0 S  0.0  0.0   0:00.00 aio/0
   50 root      15   0     0    0    0 S  0.0  0.0   6:45.89 kswapd0
  187 root      25   0     0    0    0 S  0.0  0.0   0:00.00 kseriod
  293 root      15   0     0    0    0 S  0.0  0.0  17:48.87 kjournald
  554 root      15   0     0    0    0 S  0.0  0.0   0:00.03 kjournald
  555 root      15   0     0    0    0 S  0.0  0.0   9:14.08 kjournald
  556 root      15   0     0    0    0 S  0.0  0.0   3:44.86 kjournald
  557 root      15   0     0    0    0 S  0.0  0.0   5:29.24 kjournald
  711 root       6 -10     0    0    0 S  0.0  0.0   0:00.00 ata/0
  712 root      23   0     0    0    0 S  0.0  0.0   0:00.00 scsi_eh_0
  713 root      23   0     0    0    0 S  0.0  0.0   0:00.00 scsi_eh_1
  761 root      15   0     0    0    0 S  0.0  0.0   0:00.00 khubd
 1819 daemon    15   0  1612    4 1440 S  0.0  0.0   0:00.00 portmap
 2182 root      16   0  2260  432 2092 S  0.0  0.0   1:13.34 syslogd
 2185 root      17   0  2444    4 1344 S  0.0  0.0   0:00.07 klogd
 2193 root      16   0  2628  232 2192 S  0.0  0.0   0:00.08 rpc.dracd
 2223 Debian-e  16   0  5128  312 4752 S  0.0  0.0   0:00.85 exim4
 2229 root      15   0  2240    4 2084 S  0.0  0.0   0:00.00 inetd
 2246 daemon    16   0  1684   48 1520 S  0.0  0.0   0:00.00 atd
 2249 root      16   0  1764  228 1576 S  0.0  0.0   0:01.59 cron
 2260 root      17   0  1500    4 1336 S  0.0  0.0   0:00.00 getty
 2261 root      17   0  1500    4 1336 S  0.0  0.0   0:00.00 getty
 2262 root      16   0  1500    4 1336 S  0.0  0.0   0:00.00 getty
 2263 root      16   0  1500    4 1336 S  0.0  0.0   0:00.00 getty
 2264 root      16   0  1500    4 1336 S  0.0  0.0   0:00.00 getty
 2265 root      16   0  1500    4 1336 S  0.0  0.0   0:00.00 getty
21946 root      16   0 11728  912 7792 S  0.0  0.1   0:02.78 miniserv.pl
 1952 root      16   0 11872  216 7792 S  0.0  0.0   0:00.00 miniserv.pl
17964 root      16   0  3468  336 3092 S  0.0  0.0   0:43.35 sshd

関連:

こないだちょろっと書いてたsplume(スプリューム)がテレビ東京のワールドビジネスサテライトで紹介されてた。

この記者会見の後、セミナーみたいのがあってそれにエントリーしてたんですが、仕事のスケジュールが厳しくて行けなかった・・・。

以前、会社でデモを見せてもらってすごく面白いと思いました。SplumeがSecond LifeやHomeと決定的に違う点は、“仮想空間がHTTPとその上のVRML2.0(の拡張)というオープンで標準的な仕様で作られてること”これはネットゲームの延長の閉じた仮想世界とはかなり話が違う。

TVでは仮想世界を企業が作ってリンクすることが出来るというふうに紹介されていたけど、HTMLでホームページを作るみたいに誰でも3D空間を作ってリンクできる。提唱者の人はネット全体を仮想空間に変えようっていう妄想野望を持ってるに違いない。

PHPでVRMLを出力していたエリアもあったので永久ループみたいな空間とか再帰的な空間とかもできるんだと思うと面白い。

デモの後で、

「10年ぐらい前に見た時はVRMLは現実的には使えなさそうな動きとかだったんですが、技術的にはどんな変化があったんですか?」

という質問をしたんですが、

「何も無い。世の中のCPUと通信速度が上がったのでまともに使えるようになった。」

と言っていたのが面白かった。

VRMLでリンクされた空間で面白かったのが、URLに地理的な位置関係があるところ。例えば、

「http://p0t.jp/foo.html の道をまっすぐ行くと http://yahoo.co.jp があるけど十字路を左に行くと http://google.co.jp がある」

みたいな感覚があるということ。非常に楽しいURIの可視化方法だと思う。既存の3DオーサリングツールもVRMLに対応してるのがあるからGoogle Earthを丸ごとエクスポートとか簡単なんじゃなかろうか。

実際に空間を歩いてて別ドメインに行ってもURL欄を見ていなければほぼ気付かないぐらいスムーズ。隣接した空間は先読みしてるんだと思う。

「HTTPベースということは空間にBasic認証かけて入ろうとするとパスワード聞いてくる、みたいなこともできるんですか?」

って聞いたら、

「そういうダイアログは作ってないが、基本的には可能」

と言っていた。HTTPベースというのは楽しい。

唯一気になるのがクライアントが独自ブラウザだということ。これはプラグインかもしくはFlashで出来たら素晴らしいな。

追記:

“日本版Second Life”とは言わせない――「splume」とは - @IT

 スプリュームは専用ブラウザの機能をInternet ExplorerなどのWebブラウザで実現するプラグインや、仮想空間内の三次元グラフィックスを開発できるオーサリングツールも開発中で、オーサリングツールは今夏にも提供開始するという。

開発中だそうです。すばらし。

ref: Splumeの技術面はココ ref: 3Dデスクトップと仮想空間

俺の腐ったPCが1BP30M(1ブルースクリーンパー30ミニッツ)状態になったのでWindows XPを再インスコ。(Vista買ったけどいろいろ動かないから消したとか省略)

plnet.jpのソースをチェックアウトして来れる状態になるまでかなりロスった。退会機能とバグをいくつか修正。

plnet.jpはPHPのMojaviで出来てるんですが、あらゆるところで糞かったるい。フレームワークをあんまり改造するのは厭だし、かといっていまさらRailsに置き換えるとかいったらNetscape並みにJoelに怒られる気がして出来ません。

Do You PHP はてな – Amazon Web Servicesを使ってISBN-13からASINを取得するPHPプログラム

結城浩のはてな日記でPerl版を書いていらっしゃったので、PEAR::Services_Amazon 0.7.0を使ってざっと作ってみました。

いずびん から えいすん へ変換。(Amazon.co.jpの人はこう言ってた)

Django study disc2
Django study disc2 posted by (C) komagata

ウノウで行われたDjango勉強会 Disc 2に行ってきました。

※おれのPython & Djangoはこの状態

id:mopemopeさんによる「Ajaxがらみのプレゼン(仮)」

うくくの人。RJSのDjango版でDJS。PythonやDjangoのところは難しくてわからないとこがいっぱいあった。Middlewareでいろいろ実装するっていのが楽しそう。レイヤーごとにきちんと分けるのがPython流なのかな。

MiCHiLUさんによるDjangoでBlog作成

reStructuredTextって初めて知りました。Pythonでメジャーな書式なんですな。Blogとか結構書きやすそう。

ueBLOGの上村さん監督「寺子屋」

おれの様なDjango難民と詳しい方がペアになってDjango再入門 RandomNoteを作るをやる。これは初心者にはうれしかった!Python & Djangoへの親しみがアップ。

しかもおれはこれ書いた本人の上村さんとペアで直接教わりました。ツイてる!

やってみると中身はRailsとは全然違くていたるところがPython流。むしろRails以後に変わってしまった利用者の要望を満たしたために同じようなことが出来るようになってる感じでした。

いろんなフレームワークを見るのは自分の引き出しが増えてとてもいいことだと思いました。

id:perezvonさんによるLeuchtturmのデモとステートフルなフレームワークのデモ

LeuchtturmはBasecampクローン的なものだそうでオープンソースになったら便利だなーと思いました。 ステートフルなフレームワークの方はPHPのPiece Frameworkと同じような形で面白そうでした。

masatoさんがSchemeのKafuaとの違いを指摘していました。有限状態マシンの理想を追うには継続とか無いと難しいのかな?

ステートレスかステートフルかっていうのは考えちゃいました。そもそもステートフルが基本だったのになんでREST(reSTじゃなくて)とか、ひいてはその実装でWWWとか出来たんだろう?ネットワークをベースにデータに重きを置いて振る舞いは軽くしようってだけかな?

とにかく行ってよかった。勉強になりました!

Debian Etchがそろそろリリースされるそうです。4.0って何かいいスね。

主な変更点はこんな感じです。

  • gcc4.1がデフォルトに
  • X.Orgがデフォルトに
  • APTに暗号化とパッケージの検証がサポートされる

あとはグラフィカルな新しいDebian-Installerも素敵です。

気になるパッケージのバージョンはこんな感じです。

Perl5.8.8
PHP4.4.4
PHP5.2.0
Python2.4.4
Ruby1.8.2
Apache2.2.3
MySQL5.0.30
PostgreSQL8.1.5
lv4.51

lvはどうでもいいか。

サーバ用途は断然Debianですが、最近ではデスクトップはUbuntuの方が情報を見つけやすいですね。(特にブラジル発が多くないスか?)

GUIのインストーラーはホント、様々なプラットフォームをサポートしつつよくぞ完成したなあって感じです。痛みに耐えてよく頑張った。感動し(略

アップデートするときは作法をもう一度確認しよう。

関連リンク

ふつkell勉強会やってきました。

発表者がインストールしたことない、おとといふつkellを買ったばかり。参加者もHaskellとAsk himの違いがわかってないなど、マイナス地点からのスタート。

プロジェクタで単にふつうのHaskellのコードを一個一個入力してみて、コンパイルして、実行するというスタイルでやったんですが、グデグデになるかと思ったら、「これは何がうれしいのか」とか「ここをこう変えたらどうなる?」とか言いながら意外とちゃんと勉強になるなーという感じでした。

1章のインストール(みんな始めて)と2章のhello.hs(Hello, World!)とかtail.hsとかをやって、3章のさわりを少しやりました。

みんなの意見や疑問:

  • cs < getContentsの””<”“が良く分かんない
  • ghciのAAがかわいい
  • UNIXのコマンドが練習問題になってるのは楽しい
  • 高階関数は何がうれしいのだろう
  • PHPのarray_mapは高階関数なのかどうか

まだ全然わかってないんですが、実際に動かしてみると、

「話してみるとそんなに悪い奴じゃない。」

みたいな親近感を全員が持てたことが良かった。

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門