2011-12-27

RX100 S7 へ Ubuntu 10.04 をインストール

FujitsuのRX100S7にUbuntu10.04 LTSをインストールした。

標準ドライバでは認識しなかったので、LSIとIntelからDriverをダウンロードした。


まずはこれ。
OS標準のドライバでRAID 1 組んだ後のディスクを認識しなかった。
で、LSI行って見つけてきた。

MegaRAID SAS Driver Ubuntu 10.04 LTS Version 5.30 (2011/12/26現在)

手順通りに従って、無事、OSのインストールができました。


次。
オンボードNICのうち、一個だけ離れているLANポートを認識しなかったので、これも、Intelさん行って見つけてきた。

Network Adapter Driver for PCI-E Gigabit Network Connections under Linux
(2011/12/26現在、バージョン1.95)

これも、手順通りに従ってコンパイルしてインストール。

無事、認識できました。

ただ、NICドライバは、カーネルのバージョンが上がる度に再コンパイルが必要なので注意。

2011-12-20

PHPセッション開始のサンプル

# セッションIDの保存は、クッキーのみを利用する。

ini_set('session.use_cookies', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.use_trans_sid', 0);


# セッション名を変更する。

session_name('SITENAME');


# 第1引数:セッションクッキーの有効時間(秒数)。0でブラウザを閉じるまで。
# 第2引数:セッションクッキーが有効なパス。供用サーバーで独自ドメインがない場合は、
#      自分が管理するディレクトリ以下に対してのみ、ブラウザからセッションクッキ
#      ーを送信させる。
# 第3引数:セッションクッキーが有効なドメイン。
# 第4引数:HTTPSでのみセッションクッキーを有効とする場合は、true とする。
# 第5引数:セッションクッキーへのアクセスはHTTPのみとし、JavaScriptからのアク
#        セスは許可しない。

session_set_cookie_params(0, '/user/', NULL, false, true);


# セッションを開始する

session_start();


# セッションハイジャック対策
# セッション固定化攻撃対策
# F5連打対策
# 前回セッションIDを再生成した日時と現在日時を比較し、一定期間(例えば20分)経過
# していたら、セッションIDを再生成する。

$_SESSION['lasttime'] = isset($_SESSION['lasttime']) 
                      ? $_SESSION['lasttime'] : 0;
$now = time();
if (($_SESSION['lasttime'] + 20 * 60) < $now) {
    session_regenerate_id(true);
    $_SESSION['lasttime'] = $now;
}

2011-12-02

kvmでゲストをコピーしたときも

kvmでゲストをコピーして新しく作ったときも、

結局はMACアドレスが変更になるだけだから、

この方法でいいんだよ。


■ vmwareのvmdkをコピーしたときは
http://chibitcpu.blogspot.com/2011/03/vmwarevmdk.html

2011-11-30

PHPで2重登録、2重ポスト、CSRF対策

こんな感じで実装できると思う。




■ input.php ... 入力画面など
<?php
//  セッションを開始する
session_start();

//  ワンタイムチケットを生成する。
$ticket = md5(uniqid(rand(), true));

//  生成したチケットをセッション変数へ保存する。
$_SESSION['ticket'] = $ticket;
?>
<html>
<head>
<title>サンプル登録画面</title>
</head>
<body>
<form action="regist.php" method="POST">
<input type="text" name="UserName" value="">
<input type="submit" value="regist">
<!--  生成したワンタイムチケットを隠しフィールドとして、
      登録処理へPOSTする  -->
<input type="hidden" name="ticket" value="<?=$ticket?>">
</form>
</body>
</html>




■ regist.php ... 登録処理など
<?php
//  セッションを開始する
session_start();

//  ポストされたワンタイムチケットを取得する。
$ticket = isset($_POST['ticket'])    ? $_POST['ticket']    : '';

//  セッション変数に保存されたワンタイムチケットを取得する。
$save   = isset($_SESSION['ticket']) ? $_SESSION['ticket'] : '';

//  セッション変数を解放し、ブラウザの戻るボタンで戻った場合に備え
//  る。
unset($_SESSION['ticket']);

//  ポストされたワンタイムチケットの中身が空だった、または、ポス
//  トすらされてこなかった場合、不正なアクセスとみなして強制終了す
//  る。
if ($ticket === '') {

    die('不正なアクセスです');

}

//  ポストされたワンタイムチケットとセッション変数から取得したワン
//  タイムチケットが同じ場合、正常にポストされたとみなして処理を行
//  う。
if ($ticket === $save) {

    echo 'Normal Access';

}
//  ブラウザの戻るボタンで戻った場合は、セッション変数が存在しない
//  ため、2重送信とみなすことができる。
//  また、不正なアクセスの場合もワンタイムチケットが同じになる確率
//  は低いため、不正アクセス防止にもなる。
else {

    echo 'Dual Posted';

}
?>

2011-11-29

PHPの配列は

こんな感じで配列を作ると、添字は順番に振られるけど、順番には並んでいない。


$arrVar = array();
$arrVar[] = "a";
$arrVar[] = "b";
$arrVar[] = "c";


なので、添え字を使って処理するときは問題ないけど、例えば配列の並び順に従って二つ以上の配列を処理するときは、ksort()使って添え字でソートしておく必要がある。

$arrVar = array();
$arrVar[] = "a";
$arrVar[] = "b";
$arrVar[] = "c";

$arrTmp = array();
$arrTmp[] = "あ";
$arrTmp[] = "い";
$arrTmp[] = "う";

ksort($arrVar);
ksort($arrTmp);

2011-11-26

オブジェクトは参照渡し

マニュアル、ちゃんと読めってね。

PHP Manual オブジェクトと参照
http://php.net/manual/ja/language.oop5.references.php

引用 ここから

オブジェクトと参照

PHP 5 でのオブジェクト指向プログラミングのポイントとしてよく言われるのは 「オブジェクトはデフォルトでは参照渡しとなります」ということです。 しかし、正確には少し異なります。 この節では、いくつかの例を用いてその誤解をといていきます。
PHP の参照は一種のエイリアスで、ふたつの異なる変数に同じ値を書き込めるものです。 PHP 5 以降、オブジェクト変数の値にオブジェクト自身は含まれなくなりました。 含まれるのはオブジェクトの ID のみで、 これを用いて実際のオブジェクトにアクセスできるようになっています。 オブジェクトが引数として渡されたり返り値となったり あるいは別の変数に代入されたりした場合、 それはエイリアスではありません。ID のコピーを保持し、 同じオブジェクトを指すようになるのです。

ここまで


2011-11-08

kvmでvmvgaドライバ

Ubuntu 10.10 でKVM環境を構築したよ。

で、ゲストでWindows XP を動かしてみた。

vgaドライバがなかったので、vmvgaドライバを入れてみた。

で、rdesktopで接続して仕事していたら、起動後3時間すると、

ゲストのCPU使用率が100%になって

にっちもさっちもいかなくなった。

最初は「何が悪いの」的な感じで、何が何だかだったけど、

最終的に、ビデオカードのモデルを「vmvga」から「vga」に戻したら、

何時間経過しても問題なくなった。

POSTと同時にGETする

formタグでPOSTと同時にGETも行うには、

<form action="./target.php?hoge=hoehoge&moge=mogemoge" method="POST">
・・・
</form>

としておけばよい。

2011-11-03

FLUSH TABLES

MySQLを使うバッチ処理組んだら

最後に

FLUSH TABLES;

を実行しましょう。

2011-10-27

date()関数は賢い

UNIXタイムスタンプについて調べていたとき、
PHPで、


date_default_timezone_set('Europe/London');
echo date('Y-m-d H:i:s', 0);


ってやったら、


1970-01-01 01:00:00


って出た。


ん?日本と9時間違うはずなのに...


で調べてみたら、Wikipedia に書いてあった。


Wikipedia 英国夏時間


1968年2月18日1時(UTC)から1971年10月31日2時(UTC)までの期間、グリニッジ標準時よりも1時間早い英国標準時(BST: British Standard Time, UTC+1)を標準時とし、通年でこれを用い、夏時間が実施されなかった。



もろ、1時間進んでたときだったのね。


で、次のコードで確認してみたら、思った通りにちゃんと出た。


//  タイムゾーンを Europe/London にする
date_default_timezone_set('Europe/London');
echo date('Y-m-d H:i:s I e P T', 0);

//  タイムゾーンを Asia/Tokyo にする
date_default_timezone_set('Asia/Tokyo');
echo date('Y-m-d H:i:s I e P T', 0);

//  タイムゾーンを Europe/London にする
date_default_timezone_set('Europe/London');
//  1971/10/31 02:00:00
$intTime = mktime(2,0,0,10,31,1971);
echo date('Y-m-d H:i:s I e P T', $intTime);

//  タイムゾーンを Asia/Tokyo にする
date_default_timezone_set('Asia/Tokyo');
echo date('Y-m-d H:i:s I e P T', $intTime);

結果はこれ

1970-01-01 01:00:00 0 Europe/London +01:00 BST
1970-01-01 09:00:00 0 Asia/Tokyo +09:00 JST
1971-10-31 02:00:00 0 Europe/London +00:00 GMT
1971-10-31 11:00:00 0 Asia/Tokyo +09:00 JST



サマータイムじゃないから、フラグも立ってない。

2011-10-25

isset()とis_null()の関係

PHPのマニュアルを見ていて、へぇーって。

■PHP Manual 付録 PHP型の比較表
http://www.php.net/manual/ja/types.comparisons.php

isset()で false が返るモノと
is_null()で true が返るモノが
同じだった。

・NULL
・宣言された直後の変数
・宣言されていない変数

2011-10-22

JavaScriptのif文

JavaScript で if() を実験してみた。

実験ソースはこれ

var objArray = {'true':true, 'false':false,
                 1:1, 0:0, '-1':-1,
                 '"1"':'1', '"0"':'0', '"-1"':'-1',
                 'NULL':null, '"js"':'js', '""':''};
for (var i in objArray) 
{
    document.write('if (' + i + ') は ');
    if (objArray[i]) {
        document.write('true です');
    }
    else {
        document.write('false です');
    }
    document.write('<br />');
    for (var j in objArray) 
    {
        if (i === j) continue;
        
        document.write('if (' + i + ' == ' + j + ') は ');
        if (objArray[i] == objArray[j]) {
            document.write('true です');
        }
        else {
            document.write('false です');
        }
        document.write('<br />');
    }
}

結果はこれ

if (true) は true です
if (true == false) は false です
if (true == 1) は true です
if (true == 0) は false です
if (true == -1) は false です
if (true == "1") は true です
if (true == "0") は false です
if (true == "-1") は false です
if (true == NULL) は false です
if (true == "js") は false です
if (true == "") は false です
if (false) は false です
if (false == true) は false です
if (false == 1) は false です
if (false == 0) は true です
if (false == -1) は false です
if (false == "1") は false です
if (false == "0") は true です
if (false == "-1") は false です
if (false == NULL) は false です
if (false == "js") は false です
if (false == "") は true です
if (1) は true です
if (1 == true) は true です
if (1 == false) は false です
if (1 == 0) は false です
if (1 == -1) は false です
if (1 == "1") は true です
if (1 == "0") は false です
if (1 == "-1") は false です
if (1 == NULL) は false です
if (1 == "js") は false です
if (1 == "") は false です
if (0) は false です
if (0 == true) は false です
if (0 == false) は true です
if (0 == 1) は false です
if (0 == -1) は false です
if (0 == "1") は false です
if (0 == "0") は true です
if (0 == "-1") は false です
if (0 == NULL) は false です
if (0 == "js") は false です
if (0 == "") は true です
if (-1) は true です
if (-1 == true) は false です
if (-1 == false) は false です
if (-1 == 1) は false です
if (-1 == 0) は false です
if (-1 == "1") は false です
if (-1 == "0") は false です
if (-1 == "-1") は true です
if (-1 == NULL) は false です
if (-1 == "js") は false です
if (-1 == "") は false です
if ("1") は true です
if ("1" == true) は true です
if ("1" == false) は false です
if ("1" == 1) は true です
if ("1" == 0) は false です
if ("1" == -1) は false です
if ("1" == "0") は false です
if ("1" == "-1") は false です
if ("1" == NULL) は false です
if ("1" == "js") は false です
if ("1" == "") は false です
if ("0") は true です
if ("0" == true) は false です
if ("0" == false) は true です
if ("0" == 1) は false です
if ("0" == 0) は true です
if ("0" == -1) は false です
if ("0" == "1") は false です
if ("0" == "-1") は false です
if ("0" == NULL) は false です
if ("0" == "js") は false です
if ("0" == "") は false です
if ("-1") は true です
if ("-1" == true) は false です
if ("-1" == false) は false です
if ("-1" == 1) は false です
if ("-1" == 0) は false です
if ("-1" == -1) は true です
if ("-1" == "1") は false です
if ("-1" == "0") は false です
if ("-1" == NULL) は false です
if ("-1" == "js") は false です
if ("-1" == "") は false です
if (NULL) は false です
if (NULL == true) は false です
if (NULL == false) は false です
if (NULL == 1) は false です
if (NULL == 0) は false です
if (NULL == -1) は false です
if (NULL == "1") は false です
if (NULL == "0") は false です
if (NULL == "-1") は false です
if (NULL == "js") は false です
if (NULL == "") は false です
if ("js") は true です
if ("js" == true) は false です
if ("js" == false) は false です
if ("js" == 1) は false です
if ("js" == 0) は false です
if ("js" == -1) は false です
if ("js" == "1") は false です
if ("js" == "0") は false です
if ("js" == "-1") は false です
if ("js" == NULL) は false です
if ("js" == "") は false です
if ("") は false です
if ("" == true) は false です
if ("" == false) は true です
if ("" == 1) は false です
if ("" == 0) は true です
if ("" == -1) は false です
if ("" == "1") は false です
if ("" == "0") は false です
if ("" == "-1") は false です
if ("" == NULL) は false です
if ("" == "js") は false です

特に、"1","0","-1"とダブルクォートで括った場合、こんな感じに評価されるので注意。
if ("1") は true です
if ("1" == true) は true です
if ("1" == false) は false です

if ("0") は true です
if ("0" == true) は false です
if ("0" == false) は true です

if ("-1") は true です
if ("-1" == true) は false です
if ("-1" == false) は false です

2011-10-20

2次元配列は表じゃない

例えば、

$arrVal = array(array('AA', 'BB', 'CC'),
                array(11, 12, 13),
                array('ab', '12', 'c4'),)

と定義した配列の場合、こんな感じの表をイメージすると思う。

+------+------+------+
| 'AA' | 'BB' | 'CC' |
+------+------+------+
|  11  |  12  |  13  |
+------+------+------+
| 'ab' | '12' | 'c4' |
+------+------+------+


でも、実際は表じゃなくてこんな感じ

+----------------------+----------------------+----------------------+
|+------+------+------+|+------+------+------+|+------+------+------+|
|| 'AA' | 'BB' | 'CC' |||  11  |  12  |  13  ||| 'ab' | '12' | 'c4' ||
|+------+------+------+|+------+------+------+|+------+------+------+|
+----------------------+----------------------+----------------------+

こんな感じで、

配列の各要素の中が配列

になっている。

PHPにそんなマニュアルがあったなんて

PHPで1年半開発してきたけど、今日、始めてこんなマニュアルがあるのに気づいた。

■PHPマニュアル
付録 PHP型の比較表
http://www.php.net/manual/ja/types.comparisons.php


==で緩やかに比較したときの、あの、わけの分からないTRUEとFALSEの評価と
is_null()、empty()、isset()の結果が一覧表で載っていた。

知らなかった...

マニュアルは、ちゃんと読みましょう。ね。



で、どうしても解せない不愉快な評価結果。

if (0 == NULL) は TRUE と評価され
if (0 == "0") は TRUE と評価されるのに

if ("0" == NULL) は FALSE と評価される。



if (FALSE == NULL) は TRUE と評価され
if (FALSE == "0") は TRUE と評価されるのに

それでもやっぱり
if ("0" == NULL) は FALSE と評価される。




証明が成り立っていない。だめだ、俺の中であり得ない。


世の中、理不尽なことばかりだ。


if ("" == NULL) は TRUE だけど

if ("" == "0") は FALSE だから
if (NULL == "0") は FALSE なんだろうか?






「仕様です」


ではなくて、この理由をご存知の方、教えてください。


2011-10-19

phpのdateとtimestamp



例によって、phpのバージョンはこれね。


$ php -v
PHP 5.3.6-13ubuntu3.1 with Suhosin-Patch (cli) (built: Aug 29 2011 23:39:16)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies


で、確認。


<?php
date_default_timezone_set('Asia/Tokyo');
echo date('Y-m-d H:i:s', 0);
?>

結果は 1970-01-01 09:00:00

ふむ。




じゃ、これは?



<?php
date_default_timezone_set('Europe/Paris');
echo date('Y-m-d H:i:s', 0);
?>


結果は 1970-01-01 01:00:00




へー。




結論。


date()は、与えられたtimestampを、タイムゾーンの日時に変換する。



これで、やっとUTCからの経過秒数っていう意味がわかったよ。

MySQLのUNIX_TIMESTAMP() と FROM_UNIXTIME()

とりあえず、MySQLのバージョンね。

$ mysql --version
mysql Ver 14.14 Distrib 5.1.58, for debian-linux-gnu (x86_64) using readline 6.2


で、ログインしてやってみた。

$ mysql -u root -p
mysql> select from_unixtime(unix_timestamp('1970-01-01 00:00:00')) from dual;
+------------------------------------------------------+
| from_unixtime(unix_timestamp('1970-01-01 00:00:00')) |
+------------------------------------------------------+
| 1970-01-01 09:00:00 |
+------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select from_unixtime(unix_timestamp('1970-01-01 09:00:00')) from dual;
+------------------------------------------------------+
| from_unixtime(unix_timestamp('1970-01-01 09:00:00')) |
+------------------------------------------------------+
| 1970-01-01 09:00:00 |
+------------------------------------------------------+
1 row in set (0.01 sec)


ん?1970-01-01 00:00:00 も 1970-01-01 09:00:00 も結果は同じ?

ちょっと待て。

mysql> select unix_timestamp('1970-01-01 00:00:00') from dual;
+---------------------------------------+
| unix_timestamp('1970-01-01 00:00:00') |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
1 row in set (0.00 sec)

mysql> select unix_timestamp('1970-01-01 09:00:00') from dual;
+---------------------------------------+
| unix_timestamp('1970-01-01 09:00:00') |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
1 row in set (0.01 sec)


両方とも「0」かよ。

じゃこれはどうかな?

mysql> select from_unixtime(0) from dual;
+---------------------+
| from_unixtime(0)    |
+---------------------+
| 1970-01-01 09:00:00 |
+---------------------+
1 row in set (0.00 sec)


マニュアルはどうなってる?

>UNIX_TIMESTAMP() に範囲外の日付を渡すと、0 が戻されます。

あぁ、そういうことね。1970-01-01 00:00:00 は「範囲外」ってことね。

納得。

2011-03-10

vmwareのvmdkをコピーしたときは

マスターイメージをインストールして、使いまわしたいときあるよね。

でも、コピーして使うと...おや?eth0がない!

そんな時は慌てずに、Ubuntuなら

# sudo nano /etc/udev/rules.d/70-persistent-net.rules
とやって、
eth0の行を削除。

そしてeth1をeth0に変更後、上書き保存して再起動!

これで無事、eth0として認識されました。


2012/10/04 追記
CentOS 5.x をコピーした場合は、
何もしなくてもよかった。
ほんとか?

ちなみに、CentOS 6.x は、Ubuntuと同じやり方でOK。

.htaccessで403を404で返す

久しぶりにリライトルールを書いたよ。 ドキュメントルートに.htaccessを置く場合の記述↓ # 403.html は実体がなくてよい。この設定をすることで、あっても使われなくなる。 ErrorDocument 403 /403.html # 独自の404ページをドキュメ...