Jan - 9th

CentOS 5にはfshが入っていなかった

Posted at 10:43 pm | Filed Under Linux, Security, Tuit

CentOS 4に入っていたfshがCentOS 5のyumでは見付からないのでどうしたのかと調べていたら、fshはPython2.4ではちゃんと動かないという問題があるのがわかった。いちおう、探すとパッチは見付かった。いまのところ問題なく動作している。

でも、製品レベルのものに使うのは無理だなあ。fshの更新はそもそも2001年から止まっている状態だし。

誰かPythonの人がいたら、ちょっくらメンテナンスしてほしいなあ。

Read More>

Jul - 4th

ホーア式・初級

Posted at 10:50 pm | Filed Under PHP, Ruby, Tuit, Work

仕事メモ。今日のミーティングはむちゃくちゃ面白かった。

=========================================
関数を2種類に分類しよう:

(1)query(accessorなど呼称多数)
(2)command(actionなど呼称多数)

*例外はある。
 constructor(初期化したり…)、utility(掟破りでもあると便利なもの)など

■queryとは
 SQLのSELECT文のように、実行されてもスタックやオブジェクトの状態に何ら影響を与えない関数

■commandとは
 実行されることで状態に何らかの影響がある(副作用がある)

逆にいえば、関数をこの分類に従って書くことで享受出来るメリットがある。

■メリット

明確なやり方でユニットテストを計画、実施することができる。

■ホーア式:pre {command} post

pre状態でcommandを実行、例外が出なければpost状態になると真、という式。

■コードで考える

関数、といってもクラスのメソッドで考えることしか思いつかなかったので、とりあえず簡単なクラスで考えてみた。

===========================================

#!/usr/bin/env ruby

class TestClass

    #query型の関数
    def testQuery
        @testValue
    end

    #command型の関数
    def testCommand
        @testValue = "これはテストです。"
    end

end

#このクラスをテストする
test = TestClass.new

#pre状態(nilになる)
puts test.testQuery

#command実行
test.testCommand

#post状態(これはテストです。になる)
puts test.testQuery

===========================================

この場合、ホーア式は

test.testQuery === nil;これがpre
    {test.testCommand;}←command
test.testQuery == 'これはテストです。';←大方の予想通りこれがpost

となる。

preとpostを定義して、command実行後にそれぞれの結果を参照すればcommandに対するユニットテストになる。

問題があるとすれば:

commandで例外が発生した場合を考慮する必要がある。
commandで無限ループになった場合、post状態にならないのでホーア式が真偽判定できない。
 *できないのだから偽、という考え方もある

ユニットテストでエラー出力レベルを上げる、無限ループはエラーとする、実行時間を仕様として決めて時間がかかりすぎるようであればエラーとする、などのルールで対応可能。

Read More>

Jun - 29th

Tuit: Javascript

Posted at 12:34 pm | Filed Under Javascript, Tuit

IE6でinputタグのname属性を書き換えようとしたらうまく動かない。createElementでname属性を指定できないので困っていたら、こんな情報が:

IE は createElement(’input’) した要素の name 属性を変更することができない。

ではどうすれば良いかと言うと、MSDN にちゃんと書かれている。
var inputElement = document.createElement (’<input type=”text” name=”i_theme” size=”20″>’);

ここ笑う(しかない)所ね。ブラウザ分けするのが面倒だが、IE6 のみの環境なら大丈夫だろう。

いや本当に笑うしかない。こういう失敗データベースはMSDN探すしかないのかな。

Read More>

May - 10th

echoとcatとfopen

Posted at 12:42 pm | Filed Under PHP, Tuit

サーバ側で受信したメールをincludeを使ってPHPのスクリプトに食わせた後、処理実行後に今度はRubyのスクリプトに渡す機能を実装したら、日本語のメールが文字化けしていた。

どうやら原因はechoだったようだ。

#!/usr/bin/env php
<?php

/**
 * echo
でJISの文字列を書き込むとおかしなことになる。
 * 再現環境LANGはja_JP.eucJPかja_JP.utf8
 **/

$str = 'これは日本語EUC-JPの文字列です。これからJISに変換します。';
$file = '/tmp/test';

//JISに変換
$str = mb_convert_encoding($str, 'JIS', 'EUC-JP');

/**
 * echoを使ってファイルに書き込んでみる
 * 失敗する
 **/ 

//echoとcat
$cmd = 'echo "' . $str . '" > ' . $file . ' | cat ' . $file;
$result = `$cmd`;

//EUC-JPに戻して表示
print('結果その1:' . mb_convert_encoding($result, 'EUC-JP', 'JIS'));

//nkfを使って表示
$cmd = 'cat ' . $file . ' | nkf -e -J';
$result = `$cmd`;
print('結果その2:' . $result);

//catのせいではない
$cmd = 'echo "' . $str . '" | nkf -e -J';
$result = `$cmd`;
print('結果その3:' . $result);

/**
 * fopenを使ってファイルに書き込んでみる
 * うまくいく
 **/ 

//fopenでファイルに書き込んでから表示
$fp = fopen($file, 'w');
fputs($fp, $str);
fclose($fp);
$cmd = 'cat ' . $file . ' | nkf -e -J';
$result = `$cmd`;
print('結果その4:' . $result . "\n");

//PHPのmb_convert_encodingが原因ではない
$cmd = 'cat ' . $file;
$result = `$cmd`;
print('結果その5:' . mb_convert_encoding($result, 'EUC-JP', 'JIS') . "\n");

?>

実行結果は以下の通り:

結果その1:K\8lEUC-JPzNs!#$+JIS^!#
結果その2:K\8lEUC-JPzNs!#$+JIS^!#
結果その3:K\8lEUC-JPzNs!#$+JIS^!#
結果その4:これは日本語EUC-JPの文字列です。これからJISに変換します。
結果その5:これは日本語EUC-JPの文字列です。これからJISに変換します。

echoを実行する前にexportでLANGをいじってみたけど無駄だった。結局、直ったのでfopenで処理することにした。

Read More>

May - 7th

XML-RPCのエラー修正

Posted at 12:38 pm | Filed Under PHP, Tuit, WordPress

オフラインエディタでこの日記を編集しようとしたら、WordPress側のXML-RPCサーバからの応答が

「XML-RPC server accepts POST requests only.」

になっているので調べてみたが、どうやらGLOBAL変数が正しく受け取れないようになっているのが原因らしい。wp-includes/class-IXR.phpに上のエラーメッセージが書かれていたので見てみると、こんなコードになっていた。

if (!$data) {
    global $HTTP_RAW_POST_DATA;
    if (!$HTTP_RAW_POST_DATA) {
        die('XML-RPC server accepts POST requests only.');
    }
    $data = $HTTP_RAW_POST_DATA;
}

理由はわからないが、ここでdieしないように

$HTTP_RAW_POST_DATA = file_get_contents(”php://input”);

これを追記して

if (!$data) {
    global $HTTP_RAW_POST_DATA;
    if (!$HTTP_RAW_POST_DATA) {
        $HTTP_RAW_POST_DATA = file_get_contents("php://input");
        if(!$HTTP_RAW_POST_DATA){
            die('XML-RPC server accepts POST requests only.');
        }
    }
    $data = $HTTP_RAW_POST_DATA;
}

ちょっとしつこくしてみたら動いた。ectoでの動作も問題なし。なんでだ!?

Read More>

Apr - 25th

Postfixのincludeでスクリプトを実行すると

Posted at 9:14 pm | Filed Under Postfix, Tuit

Subversionからコミット時にメールを飛ばして、影舞に登録するようにあれこれいじっていると、途中で影舞のウェブ画面での操作から作成される実行ファイルをPostfixのincludeに指定したら、apacheのユーザで実行されていることがわかった。なんじゃこりゃと思って調べてみると、こんな記述があった:

Postfix:
なお、Postfix では、 alias や include ファイルの所有者の権限で配送が行なわれ、そのユーザの userid がヘッダに付加されます。(リストの所有者がスーパーユーザの場合は、main.cf に記述される設定パラメータであるdefault_privs で指定されるユーザの権限で配送がなされる。)sendmail のように Trusted User の指定をする必要はありません。

なんと。確かに、配送先でユーザ側に何か処理させるなどなどの用途を考えると便利だし、スーパーユーザの場合は制限できるなら、これは理にかなった機能ではある。知らなかったなあ。

Read More>

Apr - 12th

カッコつけ

Posted at 4:02 pm | Filed Under PHP, Tuit

PHPの不思議。

<?php

print($_SERVER['HTTP_USER_AGENT']);

?>

これが正しい書き方。

でも、これでも動く。

<?php

print($_SERVER{'HTTP_USER_AGENT'});

?>

どうなのよ、これ。

Read More>

Apr - 10th

em oneをMac BookのBluetoothモデムに

Posted at 11:42 am | Filed Under Apple, Tuit, mobile

同じような記事があったけど、手元のログをまとめておく。

em one側の設定は特になさそうなので、Mac Book側の設定を。

(1)「システム環境設定」から「Bluetooth」を選択

このスクリーンショットではもうem oneは設定済み

Bluetooth

(2)「新規デバイスを設定」を選択

「続ける」を選択して2番目の画面では、とりあえず「任意のデバイス」を選んだ。

Bluetooth2

(3)em oneが検出されるので、「続ける」を選択して、Mac Bookとem oneの間でのパスフレーズを設定する。ここで設定したパスフレーズは忘れないこと。

(4)「システム環境設定」から「ネットワーク」を選択、表示は「Bluetooth」を選択

Bluetooth3-1

サービスプロバイダは適当に、アカウント名は「em」、パスワードは先程(3)で設定したパスフレーズを入力する。電話番号はなぜか「*99***1#」で。

(5)「Bluetoothモデム」タブを選択する。
Bluetooth4

モデムの機種を選択する。I-O DATA USB-CFADPで問題なく動作するので、こちらを選択。

以上で設定が完了する。「PPP」タブから「今すぐダイヤル」ボタンを選択すれば接続アシスタントが立ち上がる。

Read More>

Feb - 24th

WordPressのソースコードを眺めた

Posted at 4:36 am | Filed Under PHP, Tuit, WordPress

WordPressを使うようになって、さてそろそろ便利な拡張でもしてみるかと思ったのだけれど、中身を見てみるとなんだかとっても汚い。デザインとコードは全然分離していないし、OOのオの字もなくて、昔懐かしいfunctionの山が並んでいて、名前空間の衝突は避けられない。バージョン2.1だから、もうそれなりに時間も経っていて、しかもPHP-NukeXOOPSGeeklogなどなどのPHPで書かれたCMSの後から登場しているのだから、先達の知恵もさぞかし活用しているのかと期待していたら、とんでもない肩すかしをくらう。

普及しているのは、WordPressのホスティングサービスと、かっちょいい管理画面のUI、それにインストールがとんでもなく簡単なことが理由なのだろう。つまり、見た目重要、簡単さ重要。

何かが普及する理由というのは、見た目とライトユーザにとっての簡単さというのはとても重要みたいだ。そうでなければ、PHPだってこんなに流行しているはずがない。言語としての比較なら、誰だってRubyの方がいいと思うだろう。でも、いざ開発するとなると、PHPはかなり初期から環境構築が簡単で、HTMLで見た目をそのまま書いてしまってちょこっと機能をくっつけるだけで何やらすごそうなものがひょいと出来上がる。初心者にとってすぐに結果が見えてHTMLを知っていればすぐに取りかかれるなんてなんだかとっても素晴らしいじゃないか。

この事実は、ある種の人をいらだたせることにもなる。そりゃそうだ。理想の言語を追い求めている真面目な開発者にとって、PHPなんて邪道もいいところだ。こんな難解なコードがまかり通るなんて恐ろしい。

<?php
if("123test" == 123){
    print("OK\\n");
}else{
    print("NG\\n");
}
?>

ちなみに、上のコードの結果は型チェックが入らない「==」を使っているから「OK」になる。誰もが発狂するだろう。もちろん、「if(”123test” == ‘123′){」と書けばNGになるが。

#!/usr/bin/env ruby

if("123test" == 123) then
    print "OK\\n"
else
    print "NG\\n"
end

これなら「NG」になって全米が泣く。プログラマが余計なことを考える必要がないのが優れた言語だという価値観からすると、普通の神経ならこうでないと参ってしまうだろう。

しかし、普段仕事で開発プラットフォームになるフレームワークの開発をしている人間として参考にしようと思ったら肩すかしをくらったのであれこれ文句を書いてみたが、逆にWordPressやPHPが普及しているという事実から学ぶことも必要なのかもしれない。つまり、見た目と簡単さが重要、ということ。だから、基本的な機能としてJavascriptのエフェクトやCSSの書き出しが簡単に出来て、基本的なUIのセットを持っているフレームワークにしていかないと訴求力というかもっとはっきりいってしまえばみんなが納得する魅力はどんなに頑張っても出せないと認識するべきだ。

以前、Rubyの中の人にアホな通りすがりとして上と似たようなことを質問してみたことがあった。PHPがダメな言語だとして、では世の中の決定権を持っている人たちが、どうしてPHPなんかを選ぶと思うのか。答えはなかったが、それは名前が重要なんじゃなくて、ましてや言語が素晴らしいからでは全然なくて、想像を絶する存在であるところのライトユーザと、想像を絶するようなお気軽開発者にとっては魅力的なものがPHPには備わっているからだ。たとえよく見てみるとどうしようもないところもたくさんあったりしたとしても。

ウェブの開発ばっかりやっていてデスクトップ向けのアプリ開発の経験がない立場からいうと、Pythonのあのしょぼいウィジェットだってすごく魅力的だと自分が思うのは、それが優秀なデスクトップのアプリケーション開発者からみれば想像を絶するようなへっぽこ開発者にとってお手軽で自分でもなんだかやれそうな気がして見た目も十分満足できるような代物だったからだ。Pythonのウィジェットの可能性やその素晴らしさが存在していないかのような物言いだが、あの外観がしょぼいこと、その機能が非常に限定されていることは揺るぎない事実だ。あんなものアプリケーションじゃねえ、という意見もごもっとも。だけど、手が届きそうだというのは非常に重要で、誰もが憧れのアイドルに出会うよりもそれより見た目はちょっと劣る隣の同僚にアタックする方を選ぶのは、彼(女)が手が届きそうな存在だからに他ならない。それを、真の審美眼からすると邪道だと言い放って理想を追い続けるのは、

とっても素晴らしい。マル。

Read More>

Feb - 23rd

Linuxでロードバランサ

Posted at 2:22 pm | Filed Under Apache, Linux, Tuit

Linuxでロードバランサと題された記事が面白い。去年の夏に連載された記事が、雑誌に掲載された際にVMWareでマシン1台でシステムを組んで実験ができるパッケージが配布されるようになっていた。

いつもロードバランサとして使っているPoundを活用した場合と比較してみたいんだけど、時間が取れないので誰かやってくれないものだろうか。ログを取らないと割り切ってネットワークブートで構築するLVSのシステムは魅力的だ。

Read More>

keep looking »