Hatena::ブログ(Diary)

円高

2006-05-23

[]超極める!PHPを読んでみた。

まだ座談会の部分しか読んでないんだけど、その会話の中で

最近一部のブログで話題になったのに、array_push()とarray[]とどっちが早いと言う話があって、その人はベンチマークを取るのにApache Benchでスピード計ってたんですよ。こんなのコマンドライン使えばいいじゃん!と思った。

コマンドラインって、案外便利ですよ。

と言うのがあってどきっとした。

そいえば私もこれを書いてApache Benchで計ってたなと。たぶん私の事を指してたりするのかな。。。

http://d.hatena.ne.jp/jazzanova/20060221/1140512722

PEAR::Benchmark_Timerとかの存在は知ってたんですけどね、どうも面倒だったのと昔から使ってるApache Benchをついつい使ってしまいます。


この座談会で何故Apache Benchを使ってはいけないかも書かれていて

Apache Bench(ab)を使ってしまうと、HTTPプロトコルの処理時間など本来計測したいものではない時間まで含んだものを比較することになってしまうため、場合によっては全く無意味な結果になってしまうかもしれない。

なるほど。

それが分かっていればPEAR::Benchmark_Timerを使ってましたね。


ちょっと思ったのがやはりこういうのって周囲にプログラムの分かる人、優秀な人がいるかどうかってのがかなり影響しているのかなと*1

いや、結構その手の意見って良くブログとかで見るんで何となくは分かってますけど、実際にこういうのを体験するとでかいなぁ。

古い話しになりますが、昔某ソフトウェア開発会社で働いていたんですがその時はバリバリVBを使って開発してました。

んで、ある時ダイヤルアップで外部サーバに接続しそのサーバ内のデータを拾ってくると言う処理が必要になったので、私は何故か難しく考え物凄く冗長なプログラムを書いてました。

それを見たスーパーハカーな人が

ダイヤルアップで接続したPCをネットワークドライブにすれば簡単にデータ取ってこれるじゃん」

と一言。

これだけじゃなくもっと様々な事をその人から教わったんですが、身近に凄腕のプログラマとかプログラム関係の話しを出来る人がいるかどうかって物凄く大事ですね。

私の会社はプログラマが私1人で、他の社員は営業か運営担当しかいないので必然的にこういう話も出来ません。

それに何か新しい事をやろうとなると、自社で開発するのではなく外部に丸投げする感じなので、なかなか開発の仕事が出来なかったりします。

会社的にもプログラマ?何それみたいなスタンスなもんで、凄く居辛いと言うか。

プログラマがぶいぶい言ってるPHPな会社に転職してみようかな。

ちなみにPHPで開発・運営した物としてはこんな感じ

*1:とりあえず自分の勉強不足はおいておく

2006-03-28

[]Service_Hatenaを使ってみた。

http://pear.php.net/package/Services_Hatena/

http://hetena.com/

PEPrの段階から見てたんだけど、id:secondlifeさんが試してたので私もって事で。

とりあえず日本語の文章中のキーワード自動リンクするのを試してみた。

<?php
require_once 'Services/Hatena.php';
$str = '頭が良くなるのは大変だが、頭が良いように見せかける方法はある。';
$hatena = Services_Hatena::factory('Autolink');
$results = $hatena->execute($str);
if (PEAR::isError($results)) {
    die ($results->getMessage());
}
var_dump($results);
?>

これを実行すると

missing the result.

むぅ。日本語は駄目なんでしょうかね。

もうちょっと色々試してみます。


追記

どうやら、ただパラメータとして渡した文中にキーワードが1つも無かったからエラーになったっぽい。

↓こんな感じにしたらだいじょぶだった

<?php
require_once 'Services/Hatena.php';

$str = 'キーワードに自動リンク';
$hatena = Services_Hatena::factory('Autolink');
$results = $hatena->execute($str);
if (PEAR::isError($results)) {
    die ($results->getMessage());
}
var_dump($results);
?>

結果

string(247) "キーワード自動リンク"

こんな感じ。

キーワードが無いとエラーになってしまうのは、仕様なんでしょうか。

ちょっと気持ち悪いかもです。


追記:18:04

キーワードが無くてもエラーにならないみたいです。

自分の環境の所為かもなので、ちょっと色々見てみます。


追記:18:35

今気付いた。

Dependencies:

  • PHP Version: PHP 4.0.0 or newer
  • PEAR Package: PEAR 1.4.0b1 or newer
  • PEAR Package: PEAR 1.3.0 or newer
  • PEAR Package: Services_OpenSearch 0.0.1 or newer
  • PEAR Package: XML_RPC 1.1.0 or newer
  • PEAR Package: HTTP_Request 1.3.0 or newer

エラーが出る環境PHP5じゃん。。。

初歩的な所ですね。ご迷惑お掛けしました。

PHP4.3な環境とPHP5な環境の両方で開発やってるとたまにわけ分からなくなります。。。

2006-02-21

[]array_pushは遅い?

両者を1万回ずつループさせてベンチマークとってみたら、array_pushの方が10倍ぐらい遅い…。 確かに、マニュアルにも「1つだけ要素を追加するならarray_pushは使わないほうが良い」と書いてあったが、まさかこんなに違うとは…。 これからは気をつけよう…。 なお、上記のベンチマーク自体はPHP4.3.11上で確認。

while(denpa) 仮設営。

とあったのでとりあえず試してみました。

PHPのバージョンは5.0.4です。古くてすいません。

今回使用したプログラムは下記の通り。引用元のを若干変更しました。

array1.php

$foo = array();
for ($i=1;$i<10000;$i++) {
	array_push($foo, $i);
}

array2.php

$foo = array();
for ($i=1;$i<10000;$i++) {
	$foo[] = $i;
}

このプログラムをapachebenchでリクエスト数を1000、同時実行ユーザ数を10にして実行。

まずarray1.php(array_push)の結果

Concurrency Level:      10
Time taken for tests:   28.703693 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      176176 bytes
HTML transferred:       0 bytes
Requests per second:    34.84 [#/sec] (mean)
Time per request:       287.037 [ms] (mean)
Time per request:       28.704 [ms] (mean, across all concurrent requests)
Transfer rate:          5.99 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    37  278 305.1    230    6615
Waiting:       37  277 304.8    229    6614
Total:         37  278 305.1    230    6615

次にarray2.php($foo[]=)の実行結果

Concurrency Level:      10
Time taken for tests:   19.891626 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      176000 bytes
HTML transferred:       0 bytes
Requests per second:    50.27 [#/sec] (mean)
Time per request:       198.916 [ms] (mean)
Time per request:       19.892 [ms] (mean, across all concurrent requests)
Transfer rate:          8.60 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1  12.2      0     166
Processing:    29  195  82.9    185     981
Waiting:        0  192  78.3    183     981
Total:         30  197  81.5    185     981

接続時間で結構な差が出てますね。

array_pushを使用した場合は最大6615、平均で278、標準偏差が305.1

対して$foo[] =の場合は最大981、平均197、標準偏差が81.5

最大で6.7倍ですかね。

平均で1.4倍。

2005-11-05

[]徹夜明け

いや、眠い眠い。徹夜は30に近くなってくると結構きついね。瞼が重いよ。

さて、最近sledgeやらCatalystやらRubyやらCakePHPやらで「10分で作る○○」ってのが流行ってるようで何か楽しそうだなぁと傍から眺めてました。


ただ、それもちょっと寂しいのでPHPのフレームワーク「Ethna」を使って「10分で作るEthnaアプリ」ってのでもやってみようかと思いましたが、どうせはてな界隈じゃ受けないだろうなと思い個人的に仕事の合間ににぽたんさんと同じようなブックマークを作ってみたわけです。


まぁ、何分かかったか時間は計ってませんが。

とりあえず何に使うと言うわけでもなくこのまま封印で。

後でEthna、Mojavi、Maple等のPHPフレームワーク達を使ってそれぞれ同じアプリを作ってみてその手順とかどんな感じかとかをこっそりうpしてみようかな。


であこのまま仕事を続けつつ時折ブックマークに勤しみます。

2005-09-30

[]個人的メモ

MySQL4.0.24からMySQL4.1.11に変更。

構造・データはそのまま移行。

default_caracter_setはujisで。

携帯向けプログラムはsjisで作成しているが、今までの4.0.24ならmb_convert_encodingでujis→sjisで問題なく表示されたが、4.1.11では全て「???」となる。

PC用プログラムがujis、携帯向けがsjisなのでmy.cnfの設定をいじれない。

その為、DB接続後に下記のクエリを投げる。(PEARのDB.phpを使用している)

$query = "SET NAMES ujis";

$res =& $db->query($query);

これで文字化け解消。

以下独り言。

  • 4.1からcp932がサポートされていてsjisの文字化けが収まった気がする。
  • またキャラクタセット変数が増えた関係でちょっと楽しくなった。
  • サッカー好きな影響でいまだに「Ajax」をアヤックスと読んでしまう。 開き直ってこのままアヤックスで行こう。

2005-08-24

[]むぅぅぅ

携帯からhoge@hogehoge.comにメールを送ってパイプ経由でデータを受け取り解析するプログラムを作ってるんだけど、どうも上手くいかなくて悩んでる。

処理としては

  • 送信元メアド抽出
  • Subject抽出
  • 添付ファイル名抽出
  • 添付ファイル保存

とかなりシンプル。

実際ファイル名抽出までは普通に正規表現だけで取れるんで問題ないんだけど、最後の

  • 添付ファイル保存

がうまくいかない。

au、vodafone、FOMAじゃないDoCoMo端末からのメールは↓のようなフォーマット

From XXXXXXXXXXXXX@ezweb.ne.jp Wed Aug 24 22:06:55 2005
Received: from nm14omta029.ezweb.ne.jp (nmoPF22.ezweb.ne.jp [219.125.149.152])
        by hogehoge.com (XXX.XXX.XXX.XXX) with SMTP id j7OD6qeu027420
        for <XXX@hoge.com>; Wed, 24 Aug 2005 22:06:53 +0900
From: XXXXXXXXXXXXX@ezweb.ne.jp
To: XXX@hoge.com
Subject: 5555
Message-ID: <200508241306476070080067CR8C@nm14imap028.ezweb.ne.jp>
Date: Wed, 24 Aug 2005 22:06:47 +0900
Mime-Version: 1.0
Content-Type: multipart/mixed;boundary="----=_NextPart_00014"

------=_NextPart_00014
Content-Type: text/plain;charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit




------=_NextPart_00014
Content-Type: image/jpeg;
 name="050824_1710~01.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="050824_1710~01.jpg"

/9j/4QJURXhpZgAATU0AKgAAAAgACwEOAAIAAAAPAAAAkgEPAAIAAAAIAAAAogEQAAIAAAAFAAAA
qgESAAMAAAABAAEAAAEaAAUAAAABAAAAsAEbAAUAAAABAAAAuAEoAAMAAAABAAIAAAEyAAIAAAAU
AAAAwAITAAMAAAABAAIAAIdpAAQAAAABAAAA1MSlAAcAAAAuAAACHgAAAAAwNTA4MjRfMTcxMH4w
MQAAS0RESS1TTgBXMzFTAAAAAABIAAAAAQAAAEgAAAABMjAwNTowODoyNCAxNzoxMDoyMAAAFYKa
AAUAAAABAAAB1oKdAAUAAAABAAAB3ognAAMAAAABAFAAAJAAAAcAAAAEMDIyMJADAAIAAAAUAAAB
5pAEAAIAAAAUAAAB+pEBAAcAAAAEAQIDAJIEAAoAAAABAAACDpIHAAMAAAABAAIAAJIIAAMAAAAB
AAAAAJIJAAMAAAABABAAAKAAAAcAAAAEMDEwMKABAAMAAAABAAEAAKACAAQAAAABAAAA8KADAAQA
AAABAAABQKQBAAMAAAABAAAAAKQCAAMAAAABAAAAAKQDAAMAAAABAAAAAKQEAAUAAAABAAACFqQG
AAMAAAABAAAAAKQMAAMAAAABAAAAAAAAAAAAAABkAAAM5AAAABwAAAAKMjAwNTowODoyNCAxNzox
MDoyMAAyMDA1OjA4OjI0IDE3OjEwOjIwAAAAAAAAAAAKAAAAAAAAAApQcmludElNADAzMDAAAAAF

↓がFOMAのフォーマット

From XXXXXXXX@docomo.ne.jp Wed Aug 24 22:11:18 2005
Received: from docomo.ne.jp (mail121.docomo.ne.jp [203.138.203.195])
        by hogehoge.com (8.13.3/8.12.9) with SMTP id j7ODBGLN027437
        for <XXXX@hoge.com>; Wed, 24 Aug 2005 22:11:17 +0900
Date: Wed, 24 Aug 2005 22:11:14 +0900 (JST)
From: XXXXXXXX@docomo.ne.jp
To: XXXX@hoge.com
Subject: 11111
Message-ID: <IMTd14810a37dc871N1U@docomo.ne.jp>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="mimemk00"
Content-Transfer-Encoding: 7bit

--mimemk00
Content-Type: image/jpeg;
 name="200508042311000.jpg"
Content-Transfer-Encoding: base64

/9j/4AAQSkZJRgABAgAAAQABAAD//gAMAAAAAAAAAAAAAP/AABEIASABYAMBIQACEQEDEQH/2wCE
AAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkO
Dw0MDgsMDAwBAgICAwMDBgMDBgwIBwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM
DAwMDAwMDAwMDAwMDAwMDP/EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKCwEAAwEBAQEB

両方共

上部

空行

中部

空行

下部(本文)

に分かれてるんで

function body_split($data) {
        $part = split("\r\n\r\n", $data, 3);
        $part[1] = ereg_replace("\r\n[\t ]+", " ", $part[1]);
        return $part;
}

みたいな感じで3つのデータに分けて本文を取得しようとしてるんだけど、何故か改行コードを判別出来てないようでさっぱり3つに分かれてくれない。

        $part = split("\r\n\r\n", $data, 3);

を、

        $part = split("^$", $data, 3);

に変えても全く駄目。

何故改行コードで分割してくれないんでしょ。

不慣れなSELinux使ってるからってわけじゃないだろうし…

ちなみに言語はPHPです。

改行コードで分割してくれないもんだから別の手段も使えずでまじで躓いてます。

Help Me!!!

一応環境を

Apache2.0

PHP4.3.11

OS:Linux

ターミナルで鯖にログインしてviで編集しとります。

こんな感じ