« 2010年04月 | メイン

2010年05月25日

JavaScript の読み込みによって異なるサーバのスクリプトを実行する方法

JavaScript の読み込みによって異なるサーバのスクリプトを実行する方法です。

下記英語サイトが非常に参考になりました。

Cross-domain gif request with javascript

GoogleAnalytics の手法と同じとのことなので間違いないでしょう。

上記ページより私が行いたかった方法の方が簡潔だったので書き直します。コールバックの部分とかも省いているのでレベルを下げていると考えていただいて構いません。

まず、サーバ上の JavaScript を読み込ませます。

<script src="http://domain.jp/cross.js" type="text/javascript"></script>

crossRequestSender.js は簡潔に下記のようになります。

var img = new Image();
img.src="http://domain.jp/cross.gif";

※ js と gif が異なるサーバ、と言う意味ではなく、JS読み込みタグを埋め込んでいるHTMLファイルが異なるサーバに配置されていることを想定しています。

で、http://domain.jp/ に下記のように mod_rewrite を設定した .htaccess ファイルを配置します。

RewriteEngine on
RewriteRule ^cross.gif$ /cross.php [L]

以上で cross.php が実行されます。同じ cross と言う名前を利用しましたが、js ⇒ gif ⇒ php とバトンが引き継がれていったことを確認できるかと思います。

2010年05月07日

更新日時と作成日時

MySQL での更新日時(`updated_at`)と作成日時(`created_at`)の型をどうしようか迷ってしまい、ちとはまってしまった。。。

私の結論としては下記がベストのように思っている。

まず、テーブル作成は下記のようにする。

CREATE TABLE テーブル名 (
 ・・・略・・・
`updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`created_at` datetime NOT NULL
);

で、データを作成する際は

INSERT INTO テーブル名 (
 ・・・略・・・
`created_at`
)
VALUES (
 ・・・略・・・
NOW( )
);

とし、`updated_at`は明示しない。

また、データを更新する際は

UPDATE テーブル名
SET
・・・略・・・
WHERE
・・・略・・・;

とし、同じく`updated_at`は明示しない。

するとデータ作成時は `created_at`にセットされる NOW( ) と `updated_at` に暗黙的にセットされる CURRENT_TIMESTAMP が同じ値を挿入することにはなるが、以降、データ更新時には`updated_at` は明示しなくても自動的に CURRENT_TIMESTAMP で更新し続けてくれる。

細かくてどうでも良さそうで、今までは両方 datetime にして更新日時には NOW() をセットしていたんだが、この際ケジメをつけようと思ってこだわってみた結果、こう言う結論に私は至ったのである。

異論等御意見歓迎。

ユーザのグループ変更とパーミッションの設定

下記が Linux でユーザのグループを変更する場合のコマンド。

sudo /usr/sbin/usermod -g 変更先グループ名 変更対象のユーザ名

ちなみに Linux 操作は root では行わず(SSH でも root ログイン禁止、su でもログイン出来ないようにする)なるべく sudo を使って管理者権限系の操作は行うようにします。 そうすることによって誰が操作を行ったか管理できるようになります。

後、上記コマンドもフルパスでなく、登録しておけばいいですね。alias だと自分のみになりますが、全てのユーザ用に登録する方法は覚えていません。とりあえずは良しとし、どなたか補足いただければ幸いです。

会社用のグループを作っておけば複数のユーザで同じサービスを管理できますが、その際のパーミッションはWEB システムの場合は 664 が良さそうです。

自分と自グループには読み込みと書き込み権限を、それ以外のユーザは読み込みのみの権限を付与しています。

パーミッションは用途によってもっと適切な設定があるかもしれません。