メール転送できない、と思ったら、パーミッションだった

2009/12/18 15:27:09
カテゴリ:Web > Server

会社のメール、ずーっとメール転送が出来てませんでした。
いっくらWebmin(Usermin)から設定しても、何しても、まったく駄目でした。

「手動で設定しよう」と、「.forward」を直書きしたりもしたんですが、駄目でした。

そんなこんなで2年。

たまたま、自分のユーザーディレクトリのパーミッションが、
何故か「757」になっていたので「?」と思いつつ、「755」に設定。

そしたら、メール転送も復活しました。

要するに同一サーバ上の他人が改変できるところに置いた
「.forward」は、生きない、ということですね。

他にも同様の設定ファイルもあるんでしょうねぇ。恐い恐い。

っていうか、新管理者!何やったんだ!?

[PHP]: You don't have permission to access /php/php.exe/index.php on this server. => Windowsで、PHP4のCGIモードが動かないのは、Apacheのバージョン

2008/08/27 20:05:19
カテゴリ:Web > PHP

結論から言うと、Windows上にインストールした「Apache2.2 + PHP4.4.9」では、"CGIモード"はおろか"モジュールモード"でも動きませんでした。
で、Apacheを、「2.2」から「2.0」にバージョンダウンさせたら、"CGIモード" も "モジュールモード" も、難なく動作しました。

PHP5では「php5apache2_2.dll」があるんでモジュールモードのときは"httpd.conf"からこいつをロードしてあげればいいわけですが、PHP4.4.9には「php4apache2_2.dll」がありません。
「php4apache2_2.dll」をダウンロードできるサイトを紹介しているブログもいくつかありましたが、該当するファイルは削除されてしまったようでしたので、「Apache2.0」へのバージョンダウンで対応。

なんでこんなことで、今日一日はまってたか、と言うと・・・

普通、PHPでシステム組むときに共有サーバなんて使いませんよね。
でも今回はお客さんの都合(稟議がどうたら、とか、決済がどうたら、とか)で「どうしても現在借りてるホスティングサーバで」と押し切られ、 当然と言えば当然ですが共有サーバのPHPはCGIモードで、モード切り換えも不可。
しかもPHPは、「PHP4」とのこと。

んで、CGIモードで動くテスト環境を作ろう、として「はまった」わけです。

具体的には、

Apache 2.2.9 (apache_2.2.9-win32-x86-no_ssl-r2.msi)
PHP 4.4.9 (Windows Binaries)

で普通にXPにインストール。
で、Apacheまでは普通に動作確認して、PHPの設定をCGIモード用に、httpd.confで、

ScriptAlias /php/ "c:/php4/"
AddType application/x-httpd-php .php .html
Action application/x-httpd-php "/php/php.exe"

として、Apache再起動して、"http://localhost/index.php"にアクセスしたら、

Forbidden
    You don't have permission to 
        access /php/php.exe/index.php on this server.

になっちゃいました。

ちゃんと、「php.exe/index.php」で実行しようとしてる、ってことは"CGIモード"で動こうとはしてるってこと?
と思いながらも、「環境変数が~!」とか、「MIMEタイプが~!」とか、「ディレクトリは"/"か"¥"か~!」とか、さんざっぱら試行錯誤したあげく、 ググってるうちに前述の「php4apache2_2.dllじゃないと動かないっぽい」という情報にたどりつき、 「要するに、Windows上でApache2.2にPHP4.4.9を入れなければいいだけじゃん?」という結論に達したわけです。

あ~、めんどかった。
他にも共有サーバの落とし穴がありそうで怖いです。
頼むからうちで借りてるサーバに引越してくれ~!

[JavaScript]: IEでは、"id"や"name"属性の値をオブジェクト名には使えない

2008/08/13 12:30:34
カテゴリ:Web > JavaScript

大したネタではないんですが、「へ~」っと思ったのでエントリー。

要するにタイトルのままなんですが、

<input type="text" id="hoge" />

みたいなのに対して、JavaScriptで、

hoge = document.getElementById('hoge');

と、ID名と、オブジェクト名を同じにすると、IEではエラーになります。
自分は Firefoxでデバッグなんですが、Firefoxでは普通に動いてたので、
IEで動作確認したときに戸惑いました。

横着せずに、hogeObjみたいにちゃんと名前付けなさいよ、と
神様が言ってるんでしょうね。

ちなみに、"name"属性も同じでした。
他のブラウザは確認してませんが、まぁ、それほどの問題でもないので、パス、です。

[PHP]: 404で、リダイレクトPHP

2008/07/28 11:48:37
カテゴリ:Web > PHP

とあるウェブサイトのリニューアルで、次のような問題がありました。

  1. リニューアル後、リニューアルするページと、しないページがある。
  2. リニューアルしないページの中には、ディレクトリ構成だけが変わる箇所がある。
  3. ということは、各ページからのリンク付けで、「旧ページのままなのに、ディレクトリ(URL)だけ変わるところがある、ということ。

みたいな、整理するだけで面倒だなぁ、という問題です。
で、こういう時って.htaccessで、

Redirect permanent /old/ http://www.example.com/new/

とかやる訳ですが、これだと、ディレクトリ配下の全ファイルがリダイレクトされてしまいます。
今回は、リダイレクトさせたいファイルと、させたくないファイルが有るわけです。
(諸般の事情により・・・。まぁ、色々ありますよね。)
じゃあ.htaccessで、個別のファイルに指定すればいいじゃん、と言われそうですが、これがまた大量で。。。
しかも動的なページも有ったりして。

で、1時間考えた末、PHP、5行で解決しました。
どうしたか、と言うと、

  1. リンク付けは古いまま維持
  2. 古いリンク付けで飛んでくるディレクトリに、「404 Not Found」向けのページを設定し、そのページをPHPで作る。
    具体的には、
    ErrorDocument 404 /404.php
    
    みたいにする。
  3. 404.php 内で、どんな古いURLでアクセスしようとしているかを取得
  4. 新しいURLに変換。
  5. 新しいURLのHTMLファイルが存在するかチェック。
  6. 存在したら、そのページへリダイレクト。存在しなかったら、404のメッセージ(「見つかりません」、とか)を表示。

としました。
404.php内で書いたPHPの内容は、

<?
//どこのURLにアクセスしようとして404になったかを取得
$redURL = htmlspecialchars($_SERVER["REDIRECT_URL"]);

//新しいURLに変換
$path = str_replace( '/old/', '/new/', $redURL );

//該当するパスのファイルが有ったらリダイレクト
if ( file_exists( $path ) ) {
   header("Location: ".$path);
   exit;
}
?>
<html>
・・・
以下、「見つかりません」のHTML文書。
</html>

これで、
・旧リンクのまま維持するページは、そのまんま。
・ディレクトリ構成を変更しちゃったページは、404経由で、リダイレクト。
と、処理を分けることができました。

こんな、意味不明なソースは残したくないんですが、完全リニューアルまでの暫定処置として採用しました。
これで、泣いてたデザイナー兼コーダーの子の作業が、3日分は節約できたんじゃないか、と。

1時間、本気でPHPを書けば数十行~数百行は書けるんでしょうが、
1時間悩んで、PHP5行で解決して、手間を数日分省けた、ってのが、
「ああ、プログラムって、こういうことのために有るんだよな」と感慨にふけった日でした。

[PHP]: JavaScriptで「escape」された文字列をデコードする関数「unescape」

2008/07/22 15:42:47
カテゴリ:Web > PHP

と言いつつ、実はJavaScript、というよりActionScript関連です。

最近 Adobe Airの、とあるツールを作ってます。
ASは、Flashのオーサリング専門でやってる人間に任せてるんですが、
自分は彼の作ったAirアプリから、サーバーサイド(PHP)に送信されるデータの処理を担当してます。

で、そのAirアプリから送信されるデータの取り合いをXMLにしたんですが、
文字化け防止のために、エンコードして送ってくれました。
それ自体は問題ないんですが、何に変換してくれたかというと、JavaScriptにしかない「escape」関数を使ってくれました。 (やっぱりASの関数は、基本JavaScriptなんですよね。)

うぅ、PHPには「unescape」無いんだよー、「encodeURI」使って欲しかったよー、
つっても彼は本当にFlashしか知らないので、仕方がありません。
このままでどーにかならないものか、と調べてたら、ちゃんとデコーダを作ってくれた人が居ました。

「unescape(PHP)関数 Javascript版escape日本語POST対応」で紹介されてる、
PHPマニュアルの、「utf8_encode」のページの「User Contributed Notes」の中の1人 。

おぉ、すばらしい!
なんか、

文字列に"-"(ダッシュ)が含まれると、それ以降が抜けるらしい。

Lupin's Weblog: PHP: Javascriptのescapeに対応したunescape関数のバグ

というバグもあるらしいので、こちらも参照してみて下さい。

何にせよ助かりました。

使い方も簡単ですね。
記載されてるfunctionを定義して、

$str = unescape($str);

で、デコードされます。

[PHP]:PHPファイルを保存に行っちゃうのは、Firefoxのキャッシュでした

2008/07/22 11:06:16
カテゴリ:Web > PHP

ローカルで開発して、サーバにアップすると動かない、ってことは良くあります。
今回は、「.htaccess」で、

AddType application/x-httpd-php .php .html

な設定のサイトだったんですが、最初にアップした時、「.htaccess」をアップし忘れて、
HTML(実体はPHP)ファイルをブラウザがダウンロード(保存)しに行きました。
(Firefoxでは、「Firefox Document」として保存しようとします。)

んで、忘れてた「.htaccess」をアップしたんですが、一向にPHPとして処理されません。
そこで格闘1時間。
Apacheの設定変えたり、PHPのバージョンやら環境やらチェックしたり・・・

もういい加減いやになってきたころに、他のブラウザで見てみたら、普通に動いてました。
なんじゃこりゃ、ってんで、Firefoxの該当するページのキャッシュを消したら、無事解決。

ちゃんと動いてないページでも、キャッシュってされてるんですねぇ。あぁ、脱力。。。

[Server]:DNSを「外出し」したら、動作を確認するのに手間取りました

2008/07/04 18:44:30
カテゴリ:Web > Server

社内に、10年くらい前に会社が引き受けて設置したらしいWebサーバと、DNSサーバがあります。 まだ会社が小さく(今でも充分小さいけど)、幼かったころ(今でも全然成長してないけど)の遺産です。

一応UPSが付いてるんですが、ビルごと停電の時とか、当然止まってます。 サイトが小規模、ユーザーさんもライトユーザー、ということで今まで放置していたんですが、さすがによろしくないんじゃないかということで、外出しすることにしました。

サーバ管理者がメインで作業してるんですが、デザイナがほとんどの我が社では「プログラミングが出来る理系」ってだけで、この辺の作業のお鉢が回って来ます。

で、しゃーないのでやりました。 最近のホスティング会社の設定画面は、簡単ですねぇ、なんて設定したはいいんですが・・・

動作確認ができない・・・

新しいWebサーバのApacheに、移植したいドメインのバーチャルドメイン追加して、そのドメインのドキュメントルートにデータをアップして、DNSの設定を新しいWebサーバのIPアドレスに設定して、、、待ちました。
DNSの設定は、情報が浸透するまで時間がかかります」とは良く聞きますが、設定して、どんだけ待っても新サーバの情報を見に行ってくれない。
ひたすら古いWebサーバを見に行く。(稚拙だけど、新旧それぞれ、ちょっとだけ表示するテキストを変えたんですよ。)

なぜ?
と思いながらも家に帰って、家から見たら、ちゃんと変わってる!
なぜ?
会社のDNSサーバだけ仲間はずれにされてるの?
ん?
会社のDNSサーバ!?

そうか!
会社から見てるときは、ルータの外に出ないで、ローカルで直接社内DNSを見に行ってるわけか。 それで今回設定した社外のDNSの設定が、社内からは反映されないのか。
なるほろ。
でもこんなんじゃ面倒ですねぇ。

で、サーバが良く分からないなりに、調べたので、以下にメモ。

方法1.外部の関係ないところに設置した、ドメインチェックフォームで確認する

要は、外から見ればいいってことで、こういうフォームを作りました。 こんなの他所にいくらでも有りますけど、まぁ何事も自分でやってみる、ってことで。

で、今回のドメインも、ちゃんと移設先のサーバで稼働していることが確認できました。

方法2.nslookupで調べる

いろいろググッたら、「nslookup」とか「dig」とかのコマンドで調べる方法がありましたが、Windowsのプロンプトから使えるのは「nslookup」だけだったので、これでやってみました。
仮に、条件を以下とします。

調べたいドメイン:www.example.com (新IP:aaa.aaa.aaa.aaa/旧IP:bbb.bbb.bbb.bbb)
社外に新設のDNS:ns.example-new.net (IP:ccc.ccc.ccc.ccc)
ローカルのルータ:local.router (IP:192.168.0.1)

んで、コマンドプロンプトで、「nslookup」と打つと、

>nslookup
Default Server:  local.router
Address:  192.168.0.1

と帰ってきます。
ここで、調べたいドメイン「www.example.com」と打つと、

> www.example.com
Server:  local.router
Address:  192.168.0.1

Non-authoritative answer:
Name:    www.example.com
Address:  bbb.bbb.bbb.bbb

となりまして、やっぱり古いサーバのIPで見に行ってます。
でもここで、ネームサーバを設定してあげることができるので、「server」で新設のネームサーバを設定してあげます。

> server ns.example-new.net
Default Server:  ns.example-new.net
Address:  ccc.ccc.ccc.ccc

> www.example.com
Server:  ns.example-new.net
Address:  ccc.ccc.ccc.ccc

Name:    www.example.com
Address:  aaa.aaa.aaa.aaa

これで、「ns.example-new.net」では「www.example.com」に対して、新しいIPアドレス「aaa.aaa.aaa.aaa」が引き当てられているのが見れました。

でも、サーバ素人な自分的には、どうもこの内容よりも、「1.」の方が感覚的で、「OK!大丈夫!」な感じが得られました。

[MT4]:アーカイブページで表示される年月表示を変える

2008/07/01 12:34:30
カテゴリ:Web > MovableType

やっとGoogle君にも引っかかる様になってきて、検索結果を見て忘れ物に気付きました。
アーカイブページ!!!
テンプレートがあるからページ自体はあるのに、まったく手をつけてなくて、CSSの抜けた、まぁなんとも殺風景なページが存在しておりました。

ま、ご愛嬌ってことでさっそくテンプレートを編集(デフォルトをカスタマイズしただけですけど)。
でも一点気に食わない。

月別アーカイブへのリンクのタイトルが「2008年6月」みたいになってます。
個人的には、「2008.06」にしたい。
つまり、右の画像みたいにしたい、ということです。

きっと、<mt:ArchiveTitle />の属性をいじればいいのかな~、と思いきや、そんな属性は存在しません。
まぁ当然といえば当然
(タイトルなんですもんね。アーカイブ自体の持ってるプロパティならなきにしも・・・とは思いますが。)

で、どうやったかと言うと、単純でした。

<mt:ArchiveTitle />

のところを、

<mt:ArchiveDate format="%Y.%m" />

にするだけでした。
つまり、このアーカイブ(月別)に含まれるエントリーが「何年何月から始まるのか」を表示してしまえばよかった、ということですね。
めでたし、めでたし。

[F1]:Williams という哲学 - 2009年を見据えて

2008/06/25 15:00:28
カテゴリ:F1

F1キンダーガーデンで、面白い記事を見つけました。

欠席したサム・マイケルの代わりに、技術部門の最高責任者であり、チームの創立時代から信頼を寄せられているパトリック・ヘッドが陣頭指揮を取った。彼が指示したのは「とにかく最高速を高くしろ」だった。

・・・中略・・・

そこで最高速に振ったマシンでデータを取る。それをガレージで構えるサム・マイケルに届ける。ウィリアムズは、そこで集積したデータを24日から始まるシルバーストンのテストに投入するのではないか。

F1キンダーガーテン:ウィリアムズのレース哲学に期待!?

なるほど。高速サーキット連戦に対する戦略の可能性、ですか。
現代F1において、1レースをある意味捨ててテストする、ってのは勇気が要りそうですが、目先の成果ではなく先を見た成果を追えるのも、安定したスポンサーを確保しているWilliamsならではじゃないでしょうか。
(SuperAguri消滅前は、全戦テストみたいでしたが・・・)

だけど自分には、高速サーキットへの対策だけではないような気がします。
ずばり、対2009年!

みなさんご存知の通り、来年はダウンフォース量を制限されるわけですが、
必然的にメカニカルグリップと、ストレートスピード+ストレートエンドでのブレーキングのスタビリティーが重要になってきます。
記事中にあった「Williamsの得意なサーキットがモナコやカナダ」、というのは公道を利用したサーキットでスリッピーなわけで、 そこが得意ということはメカニカルグリップは及第点と考え、「ストレートスピード+ブレーキングのスタビリティー」に焦点を絞ってきたんではないでしょうか。

長年、良い時も悪い時も、常に技術屋・レース屋として開発し続けてきたWilliamsだからこそ、
目先の成果を追わず「継続」開発での将来のコンストラクターチャンピオンを見据えているからこそ、
そしてプライベーターだからこそ(プライベートテストし放題とは行かないからこそ)、
実戦をテスト、というか「実験」の場にしてしまったのだとしたら・・・

そう考えられたら、かっこいい! そして渋い!

でも、この今回のレースペースに対する分析、Williamsだからこそ、ですね。
他のチームだったら、「遅い!」の一言で終わっちゃいそうです。

[FMS]:Flash Media Server 2 の Debug Mode 設定

2008/06/24 17:31:12
カテゴリ:Web > Flash (FMS, AS)

FMS2の コンソール(fms2_console)を利用すると、サーバーサイドスクリプトのtrace内容とかをデバッグできますが、Shared Objectsの中身もデバッグできるみたいです。
「Veiw Applications」タブの中で、アプリケーションを選択後、「Shared Objects」タブを選択すると、Shared Objectの一覧が表示されます。

でも、個別のShared Objectを選択すると、

Failed to make a debug connection, please check that the application is in debug mode

とエラーが出て、中身が見れません。
「debug mode」かどうか確認、と言われても、そんなことスクリプトで設定できるのかな? と、数少ない書籍(しかも、FCS向け)を熟読するも、そんなことはどこにも書いてません。

FMS関連の情報は、ググってもなかなか情報が無いので、仕方なくFlash Media Serverのリソースをひたすら検索したら、わかりました。

基本的に、デフォルトではデバッグ不可になっていたようです。
「デバッグモードか確認しろ。」じゃなくて、「デバッグの設定が true になってるか確認しろ。」と言ってくれれば、早かったのにorz

で、許可する方法ですが、「Application.xml」という設定XMLファイルで行います。
Application.xmlは、「インストールディレクトリ /conf/_defaultRoot_/_defaultVHost_」の中にあります。
サーバ丸ごとデバッグを許可するなら、こいつの

<AllowDebugDefault>false</AllowDebugDefault>

を、「true」にして、サーバ再起動。

特定のアプリケーションだけ許可するなら、Application.xmlを、そのアプリケーションディレクトリにコピーして、同様に編集するだけ。
サーバの再起動が面倒だったので、アプリケーションをリロードだけで行けるかな?
と思ったけど、反映されませんでした。
でも、「明日でいっか。」と放っておいて、ブラウザからのテストのコネクションも全部切断、コンソールも終了、で他の仕事して、また戻ってきたら有効になってました。

何がトリガーなのか不明ですが、まぁOKってことで。