sendmail

不正アクセスの試みが絶えない。 とりあえずftpdは起動しない。 sshdとsendmailは止めるわけにはいかない。

外部からのmailは転送できてlocalhostがダメってどういうことだ?

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl


これがデフォルトなのですが、ポート番号を変え、さらに外部のメールを転送するために以下の様にしました。

DAEMON_OPTIONS(`Port=587,Name=MTA')dnl


しかしこうすると、外部のメール(つまりパソコンのメールソフトから送信する)は可能なのですが、サーバにsshでログインして

echo aiueo|mail root


とかやると、送信できないのです。 デフォルト設定に戻すとローカルの送信は可能になりますが外部から送信できない。 ローカルでも外部からも送信できる方法はないのだろうか? ローカルでmailコマンドを実行すると port 25になっているのか? mailコマンドでポート番号を指定する方法があるのか・・・? わからない!

とりあえず外部からメールを送る必要はないので、デフォルト設定に戻した。タダ不思議なのは、以前は両方できてたはずだということ。 それがbugzillaをインストールしてbugzillaからメールを送ろうとしたらできず、 あれと思って外部から送信したらそれもできなかった。 メールクライアントで認証設定を追加したら送れるようになった。 何も変えていないはずなのに・・・

/etc/mail/authinfo


を作成する方法が紹介されていた・・・しかしこのファイルはデフォルトでは存在しない・・・587にポートを変更するから特別な設定が必要なのか・・・ メンドクサイ・・・そもそもなんで25を587に変えたんだっけ・・・ たしか25では送信できなかったからだ・・・ 別に25が587に変わったから何だって言うんだ・・・スパマーが587に来たら同じ事じゃないのか・・・わけがわからん・・・

sendmailの設定( sendmail.mc → sendmail.cf )でポートをデフォルト(25)にし、iptablesでも25を開けているのに、 どうしても port 25が開かないのである。 サーバにsshで入って telnet localhost 25 とやればsendmailに接続できるのだが自宅のPCからはできず、nmapしてみると25が開いていない。サーバでnetstatした結果は 25 と 587以外に違いはないようだが・・・sendmailの設定とiptables以外に、ポートを制限する設定があるのだろうか?

25が開かないのはおそらくさくらのVPSの仕様(?)なのでしょう。 正確には「25が開かない」のではない。サーバでは開いているが、その手前でブロックしているのではないでしょうか。ルータかなんかで。本当はブロックしてはいけないはずですが、まあ25を使うのは危険のようだからそれはよしとしましょう。そして 587を使うとローカルからメールが送信できない理由は、どうもmailコマンドを使った場合認証しないからのようです。

echo test|mail root


とやったときに、アクセスするのはローカルのsendmailなのですが、ここで認証をしていないので送れないのです。外部のPCのメールソフトで「送信サーバには認証が必要」を設定しないようなものです。 mailコマンドで認証させる方法をman mailとかネットで検索してみましたがどうもないようで、それをさせるのが authinfoファイルを使うやり方のようです。ここにユーザ名とパスワードを設定するようです。

BlackBerryが欲しい

BlackBerryが欲しい。iPhone4Sを使っていて、特に不満というわけではないのだが、docomoの端末を1台持っておきたいのである。今はdocomoもauもsoftbankも、「スマホ」をメインにしていて、電車のなかでもタッチパネルの端末を持った人だらけだ。でも「スマホ」は1台で十分だ。androidの端末を買ってみてiPhoneと比較してみたい気もするが、わざわざカネを出して買う気まではない。

以前からBlackBerryはいいなと思っていた。使ったことはないのだが、外観と、なによりQWERTY配列のキーボードが魅力だった。普通の携帯電話(私は「ガラケー」などという言葉は死んでも口にできない。「スマホ」もカッコつきでぎりぎり許容範囲だ)を使っていた時に、インターネットを利用したいのが主な理由で小さなPCを持ち歩きたいとずっと思っていた。しかしPCはどんなに小さくても大きすぎ、バッテリーの持続時間も短く、ACアダプターが必要だったりした。Linux Zaurusを買って見たが、1日で使用に耐えないことがわかった。iPhone3GSを買って、ほとんど私の欲求不満は解消された。心配していたタッチパネル上の仮想キーボードの感度がすばらしかったからである。

ところが最近、いやな傾向が見え始めた。それは、インターネットのサイトやサービスが「スマホ対応」を始めたことである。そもそもどうして「スマホ」が登場したかと言えば、携帯電話で無理やり利用していたインターネットの閲覧性や操作性を向上させることが一番であっただろう。つまり、「PCと同じようにインターネットを利用したい」ということだった。

携帯電話でも、「PCサイトビューアー」などというものが登場していたがやはり携帯電話の画面とキーボードでは限界があった。iPhoneを使い始めた時、flashが動かないとかいろいろと制限はあったが、ほとんどのサイトがPCとほぼ変わらず利用できることに感激し満足した。ところが最近、多くのサイトがiPhone対応もしくは「スマホ」対応を始めてしまった。サイトによっては適切な文字の大きさになって読みやすかったりするのであるが、一番困るのは、「スマホ対応サイト」では、PCで利用する時にはあるメニューやボタンの一部が省略されている場合があることだ。これは非常に腹立たしい。

そもそも、WWWというのは利用する端末を選ばないものなのである。パソコンだってOSも違うし解像度も言語も違うのだが、同じサイトを閲覧することができる。それは、サイトが各OSや言語に対応するようにしているのではなく、サイトもPC(ブラウザ)も仕様にのっとって相手のハードウェアを問わずに使用できるようにしていたのである。利用者の端末によってサービスを変えるのはよいことだと思っているのだろうが、わたしには余計なおせっかいである。

そして最近思うのは、やっぱり「スマホ」のインターネット利用にはまだまだ無理があるということである。それはiPhoneでも言えることである。というより、今までのWEBサイトが、余計な画像、動画、アニメーションなどを使いすぎていたのである。チラチラする広告もそうである。多くの人が携帯電話でインターネットを利用し始めた時、必要なものはそのなかのほんのちょっとの「ことば」つまり文字情報であるのだと気付いたはずだ。

それがカタチをとってサービスとなり世界中に広まったのがtwitterである。私はtwitterでインターネットの原理を再確認したような気がした。最近おこなわれているサイトの「スマホ対応」も、余計なものをけずって文字だけを表示している。画像、動画、音声などはリンクとして付加され、どうしてもという場合だけ参照すればよい。私はもう、インターネットで「マルチメディア」を利用することに全然魅力を感じなくなっている。文字だけでいい。動画はテレビでいい。

というわけで、もう一台端末を持つならBlackBerryと考えているのである。BlackBerryの現行機種は9780とかいうもので、来年に9900という新機種が出る予定のようであるが、これはタッチスクリーンに対応しているようだ。BlackBerryも「スマホ」化の流れにのみこまれつつある。

そもそもBlackBerryが「スマホ」のはしりだったのだが、いまや「スマホ」とは「タッチスクリーンかどうか」であるかのようになってしまった。「スマホ」にやや食傷気味なのだが、「電話とメールで十分」というところにはもう戻れない。動画やゲームはいらないがtwitterとブログとニュースくらいを利用する必要はある。となると、やっぱりBlackBerryでしょう。

winny

winny開発者の無罪が確定したそうだ。このことについて、有名な大学教授でアルファブロガーな人などが、日本が技術的に遅れをとって大変な損失であったなどと言っているのを読んだ。

細かいことや厳密なことはメンドクサイからいつものように結論から言うが、もしwinny開発者が逮捕されずにwinnyがあのまま利用されていたとしても、それが世界をリードするような技術に発展することなどなかったであろう。

ただ、もはや止めることのできない違法コピーの蔓延が今よりちょっと早く進んだだけであっただろう。開発者も、利用者も、P2Pとかクラウドとか、技術的なこともそれが生むビジネスなんかにも全く興味はなかったはずだ。

私はwinnyを開発した人間も、それを利用した人間も軽蔑している。そしてそれは、開発者が有罪か無罪かなどということとは全く関係のないことである。

さくらのVPSにbugzillaをインストールする

なんのために・・・?

ダウンロードは ftp.mozilla.gr.jp から。 ftpコマンドで。 bug-ja-2.20-ja.4+-final.tar.gz を落す。 一番新しいやつ。 anonymousでログインする方法がわからず調べる。ユーザ名のプロンプトでanonymousと入れ、パスワードはメールアドレスを入れる。tar xzvf で解凍し、QUICKSTART というファイルにインストール方法が書いてある。 bugzillaはperlで書かれている。 ./checksetup.pl というスクリプトがあって必要なものがあるかをチェックしてくれる。 perlのモジュールとか。 "not found"となったモジュールをインストールしていく。 モジュールインストールはこれ。

perl -MCPAN -e shell


optionalとあるが、GDも入れる。 グラフ表示などができるのだろう。 ぜひ欲しい。 が、install GDとやると....

cpan[5]> install GD
Running install for module 'GD'
Running make for L/LD/LDS/GD-2.46.tar.gz
Fetching with LWP:
ftp://ftp.riken.jp/lang/CPAN/authors/id/L/LD/LDS/GD-2.46.tar.gz
Fetching with LWP:
ftp://ftp.riken.jp/lang/CPAN/authors/id/L/LD/LDS/CHECKSUMS
Checksum for /root/.cpan/sources/authors/id/L/LD/LDS/GD-2.46.tar.gz ok

CPAN.pm: Going to build L/LD/LDS/GD-2.46.tar.gz

Notice: Type perl Makefile.PL -h for command-line option summary.

**UNRECOVERABLE ERROR**
Could not find gdlib-config in the search path. Please install libgd 2.0.28 or higher.
If you want to try to compile anyway, please rerun this script with the option --ignore_missing_gd.
(以下略)


となる。 libgdをインストールしてください、と言っている。 これはモジュールではないので、yumでインストールする。(調べてわかった)

yum install gd-devel


gd-develのインストールが終わったので cpanで install GDをやるがインストールできない。 cpan shellを一回抜けて起動しなおしたらinstallできた。 perlのモジュールチェックはOKになったが、そのあとが進まない。

Couldn't do defparams.pl: そのようなファイルやディレクトリはありません at Bugzilla/Config.pm line 133.
Compilation failed in require at ./checksetup.pl line 460.
BEGIN failed--compilation aborted at ./checksetup.pl line 460.


defparams.ja.pl

defparams.en.pl

というファイルがあるが、defparams.pl はない。 ja.plを .plとしてコピーしてみるがダメ。

cp defparams.ja.pl defparams.pl
cp l10nmes.ja.pl l10nmes.pl


進んだ。mysqlに接続できない、となって止まる。mysqlが起動していない。

service mysqld start


そして、以下を設定

$ mysql -uroot -p
Enter password:
mysql> GRANT ALL PRIVILEGES ON *.* TO bugs@localhost IDENTIFIED BY ‘password’ WITH GRANT OPTION;
mysql> flush privileges;
mysql> quit;


それから、localconfigに以下を設定

$db_user = 'bugs';
$db_pass = 'password';


localconfigというファイルは自動で作成されるようなのだがされなかったので、 上記の設定のみをviで書いて保存し、 checksetup.pl を実行したらいろいろと設定が書き込まれた。

apacheの設定を追加してapacheを再起動し、index.cgiを表示してみるが、エラーが出ていて殺風景な、スタイルシートが読み込めてないようなページが表示されている。ヘンだなとおもいつつアカウントを作ってみるが、メールが送信されない。以前はできていたはずのメール送信自体ができなくなっている。

なんかグダグダになってしまった。 コントロールパネルにログインできなくなったりする。 パスワードも間違っていないはずなのに。sshからrebootする。メールで問い合わせしようといろいろやっているうちにコントロールパネルにも入れた。やっぱりしょせんはVPS、いろいろ不具合があるのだろうか。

以下を参考に(というかそのままマネして)インストールができた。3.0.3-ja.7

www.nbrains.net/php/pukiwiki/index.php?Setup%2FBugzilla

何件かVPSに関して悩んでいることを登録してみる。が、日本語が化けたりする。トップページをカスタマイズしたいなと調べていると、3.4がリリースされたという情報が。2009年に。入れなおすか・・・ 本家は4.0.2だった。別のディレクトリに入れなおす。perlモジュールなどはもう入れてあるから、./checksetupが一発でできて、パスワードを設定し、.htaccessもコピーするだけでインストールできた。同じDBを使っているから登録したbugがそのまま表示される。・・・今回はそれでいいのだが、別のバグを管理する場合はuserを変えればいいのかな?

自分だけで使うなら英語でかまわないのだが、本当はこれを仕事で使いたい。「サーバ立ててbugzillaインストールすれば使えますよ、僕にやらせてください。」なんてね。日本の会社じゃ、やっぱり英語だと「えー英語なの・・・?」となってしまうから。

日本ではmantisの方がよく使われているようだ。 私は両方使ったことがあるがbugzillaの方が全然よかった。 というか、いままで使ったbtsでまともなものはbugzillaだけだと思っているくらいである。

原因不明のハングアップ

パソコンがときどきハングする。10秒くらいか。起動しないこともある。

なんどかオフ・オンするが治らず。 いらないアプリをアンインストールする。 bitcometで落したいらないファイルを削除する。 デフラグする。 デスクトップにある余計なファイルを消す、または移動する。

タスクマネージャーなどで観察する。CPU使用率が上がっているように見えるがよくわからない。 電源を落してフタを開け、エアダスターを吹き付ける。 つい最近やったはずなのだが・・・ メモリを抜いてさしなおす。暖かい。 HDDのケーブルを抜いてさしなおし、位置も直す。 DVDドライブのケーブルを抜く。 CPUファンにエアダスターを吹き付ける。かなりホコリがでる。

電源を入れると、治った。いろいろやったので断言できないが、多分、CPUファンのホコリだと思う。 以前にも似たようなことがあった気がする。 

ハングというのは、パソコンの動作がすべて止まってマウスを動かしてもカーソルが動かなくなる状態。 音もでなくなるが、ダダダダダ・・・となることもある。 しばらく待つと動きだす。 これを不定期に1分くらいの間隔で繰り返す。 イヤでしょ?

iPhone3GSと4S

iPhone4Sを使って1ヶ月ほどたつ。

その前は3GSを2年くらい使っていた。重い。持ちにくい。画面はキレイ。重い。3GSと4Sの重さの差は5gらしい。

3GSの時は、ずっとパソコンを使ってマウスを持っていた手でiPhoneを持つと『軽いな』といつも感心していたものだ。今はズシっと来る。気軽に使えない。裏までガラス張りになって、裸のまま机に置く気にならない。

3GSは裸で使っていたが4Sにはケースを付けた。ところがケースをつけるとポケットにスルっと入らない。

自宅に帰るとWifiでは使える3GSと4SとiPadを枕元で充電している。寝る前とか夜中に起きたときとか朝起きたときには、だいたい3GSを手に取り、twitterを見る。今はtwitterがあればほとんどほかには何もいらない。そもそもiPhone 3GSを買ったのもtwitter端末として買ったようなものだった。3GSの画質は確かに4GSにはっきりと劣るが、twitterの使用には全く問題ない。動作が遅いように感じるのも、ほんの少しだ。

3GSを使っていて4Sにしようかと迷っている人は、我慢すべし。

機種変すると、iPhoneが一個余ってしまいます。iPhoneはこれ以上進化のしようがないんじゃないだろうかと思わせる。だが、きっと10年も経てば、『こんなにゴツかったのか』と思うようになるんだろうな・・・

ルータにシリアルポート経由アクセスするperlスクリプト

perlを使ってルータの設定をするのはよくやっていたが、全部telnetで、シリアルポートを使ったことがないのに気付いた。
Win32::SerialPort
を使う。

ppm install Win32::SerialPort
をやって、以下、サンプル。

use strict;
use Win32::SerialPort;

my $ob = new Win32::SerialPort('COM1') || die;

$ob->user_msg(1);
$ob->error_msg(1);

$ob->baudrate(9600);
$ob->parity("none");
$ob->parity_enable(1);
$ob->databits(8);
$ob->stopbits(1);
$ob->handshake('rts');

$ob->write_settings;

$ob->write("\n");
sleep 1;
my $result = $ob->input;
print $result;


$ob->write("en\n");
sleep 1;
my $result = $ob->input;
print $result;

$ob->write("enable\n");
sleep 1;
my $result = $ob->input;
print $result;


$ob->write("conf t\n");
sleep 1;
my $result = $ob->input;

print $result;

$ob->write("hostname donguri\n");
sleep 1;
$result = $ob->input;
print $result;

$ob->write("end\n");
sleep 1;
$result = $ob->input;
print $result;

$ob->write("reset\n");
sleep 1;
$result = $ob->input;
print $result;

$ob->write("y\n");

undef $ob;


sleepして結果を表示しているところはダサいですね。 ここはteratermの waitのようにしたいところですが、そのやり方は後で調べる。 とりあえずserialポートで入出力ができるというサンプルです。

プロンプト待ちバージョン。
use strict;
use Win32::SerialPort;
use Time::HiRes;

my $ob = new Win32::SerialPort('COM1') || die;

$ob->user_msg(1);
$ob->error_msg(1);

$ob->baudrate(9600);
$ob->parity("none");
$ob->parity_enable(1);
$ob->databits(8);
$ob->stopbits(1);
$ob->handshake('rts');

$ob->write_settings;

$ob->are_match('>','#','word:');
$ob->lookclear;

&waitfor("\n",">");
&waitfor("en\n","word:");
&waitfor("enable\n","#");
&waitfor("conf t\n","#");
&waitfor("hostname otanko\n","#");
&waitfor("end\n","#");
&waitfor("reset\n",'(y/n)');

$ob->write("y\n");

undef $ob;

sub waitfor{
    my($output_string,$prompt_to_wait)=@_;
    my $gotit = "";

    $ob->are_match($prompt_to_wait);
    $ob->write($output_string);

    until ("" ne $gotit) {
        $gotit = $ob->lookfor;
        die "aborted\n" unless (defined $gotit);
        sleep 0.1;
    }

    my ($match, $after) = $ob->lastlook;
    printf "%s%s",$gotit,$match;

}


$ob->are_match("hoge1", "hoge2", ...)


という風にして、特定の文字列を待つことができる。複数指定できる。 waitfor というサブルーチンを作って、入力するコマンドと、期待するプロンプトを指定して実行する。

$ob->lookfor で、are_matchで指定した文字列が来るのを待つ。

sleepは1秒未満で待ちたいので Time::HiRes を使う。

$ob->lastlook で、マッチした文字列を取得できる。 この例では are_matchを1個しかしていないので確認する必要はないが、 複数していした場合はどの文字列にマッチしたのかを知ることができる。 これでだいぶ使えるでしょう。 あとは、期待したプロンプトが帰ってこなかったときにタイムアウトするようにすれば完璧。

refererによる文字コードの違い

検索エンジン経由で来たアクセスについては、検索語を即時ツイートするようにしているのだが、EZから来たものだけツイートされない。 それは、ツイートする前にしていた以下の処理が原因だった。

$unescaped = Encode::decode('utf8', $unescaped);


無条件にutf8でデコードしていたのだがEZはshif-tjisを使っている。 というわけでEZのときだけshift-jisでデコードし、それ以外はutf8でデコードするようにした。

ちなみにrefererによる動作を確認するには以下のようなスクリプトを使う。

use LWP::UserAgent;
use strict;
use warnings;

my $url = "http://sample.com/cgi-bin/test.cgi";
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => "$url");

$req->referer("http://ezsch.ezweb.ne.jp/search/?sr=0101&query=aiueo%20%95a%93I");
my $res = $ua->request($req);
if($res->is_success){
    print $res->content;
}else{
    print $res->status_line;
}


bing, yahoo, googleはブラウザから検索すればいいのだがauの携帯がないのでEZの場合はこれを使った。 そこで気付いたのだがezschのquery文字列は短い。これがshift-jisのメリットか。

$req->referer に設定しているのは、実際にアクセスがあったログのHTTP_REFERERである。