2010年9月30日木曜日

Nintendo 3DS の発売日が明らかに

本日待ちに待った任天堂カンファレンスが開かれました。
Nintendo 3DS は2011年2月26日(土)に25000円で発売されます。
残念ながら年内発売とはなりませんでしたし、
価格は想定の範囲内の高いほうでした。
寒い中並ぶのは辛いですから発売日購入じゃなくてもいいかと。

それはともかく、新しい情報で個人的にいろんな意味で興味があるのは

  • ARゲームズ内蔵

  • バーチャルコンソール

  • 2GBのSDカード同梱

  • ダウンロードコンテンツの本体間移動が可能っぽい

  • 歩数計

  • Wii Connect 24 っぽい通信

  • Wii のような情報管理


といったところでしょうか。
ちなみに本体と同時購入したいソフトはマリオカートです。

2010年9月29日水曜日

新ウィルコム定額プランGS

昨日 HYBRID W-ZERO3 の販売再開について書きましたが、
なんと3Gのキャリアがドコモからソフトバンクに変わっています。
その名も「新ウィルコム定額プランGS」だそうです。
よく見ると案内メールにも書いてありましたが気付きませんでした。
そういえばソフトバンクが親会社になりましたからね。
プランが変更されたことによるコストの増減はありませんが、
エリアがねぇ…

2010年9月28日火曜日

HYBRID W-ZERO3 販売再開

HYBRID W-ZERO3 が10月8日(金)より販売再開されるようです。
au IS01 と b-mobile WiFi + b-mobile SIM U300 (365日)
を手に入れてしまい、
PHSデータ通信CFカードの解約手続き途中の私にとっては
既にどうでもいいこととなってしまいましたが、
心待ちにしていた方もいらっしゃるのではないでしょうか。

なお、ウィルコムストアでは9月28日(火)の朝9時から予約受付開始ということです。

2010年9月23日木曜日

DMC-GH2

私の所有する一眼カメラLUMIX GH1
正常進化版GH2が発表されました。
LCDモニタがタッチパネル化するなどの
G2化もしっかりされています。
強化点は数々ありますが、
そのなかで私が惹かれたのが
撮っている映像をそのままHDMIで出力してくれる機能です。
それからG2からあった動画撮影中の静止画記録機能に
写真優先と動画優先の2種類の挙動を
選択可能になったのはなかなか使えそうです。
なんだか知りませんがレンズが結構そろってきているので
ボディだけ買うのもありかと思っていますが、
それより先に広角レンズがほしいので
しばらくは指をくわえてみていようかと。

そして、注目は3D立体視を実現する
交換レンズH-FT012への対応です。
このレンズに対応するのはGH2とG2だけということで、
残念ながら私には役に立ちません。
もっとも、3Dテレビは買う予定が全くなく、
撮影しても見られなければ宝の持ち腐れですから。

2010年9月22日水曜日

ストレージサーバ - その8 - SVNのコミットメール送信対応

ソースコード管理に関して、
誰かが変更を加えたときメールで通知してくれるとありがたいので対応します。
最初に以下のコマンドを実行し、nkf をインストールします。
# emerge 'nkf'
メールサーバには送信専用の"ssmtp"を利用していますが、
今のままだと受信拒否されるサーバがあるので変更を加えます。
# vi /etc/ssmtp/ssmtp.conf
で設定ファイルを開き、
FromLineOverride=YES
を追加します。
なお、メールを送信するときの送信元(Fromヘッダ)のドメイン部は、
"mailhub"で指定しているメールサーバ(インターネット側)のDNS登録内容(MXレコード等)と矛盾がないようにしなければなりません。
さもないとメールが受信拒否される可能性があります。
ソースコード管理サーバsvnで更新(コミット)の情報を生成したり、
それをまとめたRSSを生成したいので以下を実行します。
# cd /usr/local/bin
# touch svn_rss
# touch svn_rss_item
# touch svn_xml
# chmod 755 svn_rss
# chmod 755 svn_rss_item
# chmod 755 svn_xml
これらスクリプトのソースコードは最後に記述します。
ソースコード管理の各領域(ここでは'*'であらわす)において以下を実行します。
# cd /mnt/storage/svn/*/hooks
# touch post-commit
# chmod 755 post-commit
これらpost-commitのソースコードは最後に記述します。
ソースコード管理サーバsvnで、
更新(コミット)をメール通知させるには前節の作業と合わせて以下を実行する。
# cd /usr/local/bin/
# touch svnlog2txt.php
# touch svn_update_info
# touch svn_update_mail.php
# chmod 755 svnlog2txt.php
# chmod 755 svn_update_info
# chmod 755 svn_update_mail.php
ソースコード管理の各領域(ここでは'*'であらわす)において、
"/mnt/storage/svn/*/hooks/post-commit"の最後に以下の行を追加して完了です。
svn_update_info "$REPOS" "$REV" "$web" | svn_update_mail.php "$repname" "$REV" $group
最後にスクリプトの内容を記述します。
# more /usr/local/bin/svn_rss
#!/bin/sh

if [ "X$1Y" = "XY" ];
then
        echo "set first argument as <repository path>." 1>&2
        exit 1
fi
if [ "X$2Y" = "XY" ];
then
        r=`svnlook youngest "$1"`
else
        r="$2"
fi
if [ "X$3Y" = "XY" ];
then
        count=0;
else
        count=$(($3-1));
fi

repname=`echo "$1" | sed -e 's/.*\/\([^\/].*\)/\1/'|awk -F/ '{print $1}'`

echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
echo "<rss version=\"2.0\">"
echo "<channel>"
echo "<title>svn [$repname] on hoge</title>"
if [ "X$4Y" != "XY" ];
then
        echo "<link>$4</link>"
fi
echo "<language>ja</language>"
d=`date "+%a, %d %b %Y %H:%M:%S %z"`
echo "<pubDate>$d</pubDate>"
echo "<description>the committing information of [$repname].</description>"

for rev in `seq $r -1 $(($r-$count)) | sed -e '/^0$/,$d'`;
do
if [ "X$4Y" = "XY" ];
then
        svn_rss_item "$1" "$rev"
else
        svn_rss_item "$1" "$rev" "$4"
fi
done

echo "</channel>"
echo "</rss>"

# more /usr/local/bin/svn_rss_item
#!/bin/sh

if [ "X$1Y" = "XY" ];
then
        echo "set first argument as <repository path>." 1>&2
        exit 1
fi
if [ "X$2Y" = "XY" ];
then
        r=`svnlook youngest "$1"`
else
        r="$2"
fi

d=`svnlook date -r "$r" "$1" 2> /dev/null` || exit 1
d=`echo "$d" | sed -e 's/^[^ ]* \([^ ]* [^ ]*\) (\(.*\))$/\2 \1/' 2> /dev/null`
a=`svnlook author -r "$r" "$1" 2> /dev/null` || exit 1
echo "<item>"
echo "<title>Revision $r</title>"
echo "<pubDate>$d</pubDate>"
echo "<author>$a</author>"

if [ "X$3Y" != "XY" ];
then
        echo "<link>$3/$r.xml</link>"
fi

echo "<description><![CDATA["
svnlook log -r "$r" "$1" 2> /dev/null | svnlog2txt.php 2> /dev/null
echo "----------------------------------------"
svnlook changed -r "$r" "$1" 2> /dev/null
echo "]]></description>"
echo "</item>"

# more /usr/local/bin/svn_xml
#!/bin/sh

if [ "X$1Y" = "XY" ];
then
        echo "set first argument as <repository path>." 1>&2
        exit 1
fi
if [ "X$2Y" = "XY" ];
then
        r=`svnlook youngest "$1"`
else
        r="$2"
fi

repname=`echo "$1" | sed -e 's/.*\/\([^\/].*\)/\1/'|awk -F/ '{print $1}'`

d=`svnlook date -r "$r" "$1" 2> /dev/null` || exit 1
d=`echo "$d" | sed -e 's/^[^ ]* \([^ ]* [^ ]*\) (\(.*\))$/\2 \1/' 2> /dev/null`
a=`svnlook author -r "$r" "$1" 2> /dev/null` || exit 1
echo "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>"
echo "<item>"
echo "<title>svn [$repname] revision $r</title>"
echo "<pubDate>$d</pubDate>"
echo "<author>$a</author>"
echo "<description><![CDATA["
svnlook log -r "$r" "$1" 2> /dev/null | svnlog2txt.php 2> /dev/null | nkf -Ws
echo "]]></description>"
echo "<files>"
svnlook changed -r "$r" "$1" 2> /dev/null | sed -e 's/^\([^ ]*\) *\(.*\)$/<file
status="\1">\2<\/file>/'
echo "</files>"
echo "<diff><![CDATA["
svnlook diff -r "$r" "$1" 2> /dev/null
echo "]]></diff>"
echo "</item>"

# more /mnt/storage/svn/*/hooks/post-commit
#!/bin/sh
REPOS="$1"
REV="$2"
web="<生成するドキュメント類の置き場所(ディレクトリ)のURL>"
htdocs="<生成するドキュメント類の置き場所(ディレクトリ)のパス>"
group="<ユーザ管理に利用するldapのouの名前>"
repname=`echo "$REPOS" | sed -e 's/.*\/\([^\/].*\)/\1/'|awk -F/ '{print $1}'`
svn_rss "$REPOS" "$REV" 20 "$web" > $htdocs/news.rss
svn_xml "$REPOS" "$REV" > $htdocs/$REV.xml

# more /usr/local/bin/svnlog2txt.php
#!/usr/bin/php
<?
        while(!feof(STDIN)){
                $in="#".fgets(STDIN);
                $i=1;
                $out="";
                while(1){
                        $j=strpos($in,'?\\',$i);
                        if($j==FALSE){
                                $out.=substr($in,$i);
                                break;
                        }
                        $out.=substr($in,$i,$j-$i);
                        $val=substr($in,$j+2,3);
                        $out.=sprintf("%c",intval($val)&0xff);
                        $i=$j+5;
                }
                fputs(STDOUT,$out);
        }
?>
# more /usr/local/bin/svn_update_info
#!/bin/sh
if [ "X$1Y" = "XY" ];
then
        echo "set first argument as <repository path>." 1>&2
        exit 1
fi
if [ "X$2Y" = "XY" ];
then
        r=`svnlook youngest "$1"`
else
        r="$2"
fi

if [ "X$3Y" != "XY" ];
then
        echo "feed : $3/news.rss"
        echo "detail : $3/$r.xml"
fi

d=`svnlook date -r "$r" "$1" 2> /dev/null` || exit 1
d=`echo "$d" | sed -e 's/^[^ ]* \([^ ]* [^ ]*\) (\(.*\))$/\2 \1/' 2> /dev/nul`
a=`svnlook author -r "$r" "$1" 2> /dev/null | nkf -Wj` || exit 1
echo "date : $d"
echo "author : $a"
echo
echo "changed files :"
svnlook changed -r "$r" "$1" 2> /dev/null | nkf -Wj
echo
echo "log :"
svnlook log -r "$r" "$1" 2> /dev/null | svnlog2txt.php  2> /dev/null | nkf -Wj

# more /usr/local/bin/svn_update_mail.php
#!/usr/bin/php

<?
$title="svn [".$argv[1].":".$argv[2]."]";
$body="svn [".$argv[1]."] is updated to revison #".$argv[2].".\r\n\r\n";
$from="From: hoge@hoge.com\r\nContent-Type: text/plain; charset=\"ISO-2022-JP\"\r\nContent-Transfer-Encoding: 7bit";

$out="";
while(!feof(STDIN)){
        $in=fgets(STDIN);
        $out.=$in;
        $out.="\r\n";
}
$body.=$out;

$ldap=ldap_connect("hoge");
if(!$ldap){
        echo "Could not connect to ldap server.<br/>";
        exit;
}
if(!ldap_bind($ldap,"cn=root,o=hoge,c=com","<パスワード>")){
        echo "Could not bind to ldap server.<br/>";
        exit;
}

if($arvg[3]=="")
        $env_group="test";
else
        $env_group=$arvg[3];

$entries=ldap_search($ldap,"ou=".$env_group.",o=hoge,c=com","(objectclass=organizationalPerson)",array("cn","mail"));
for($entry=ldap_first_entry($ldap,$entries);$entry!=false;$entry=ldap_next_entry($ldap,$entry)){
        $value=ldap_get_attributes($ldap,$entry);
        if($value["mail"][0]!="")
                mail($value["mail"][0],$title,$body,$from);
}

ldap_unbind($ldap);
?>

2010年9月17日金曜日

ストレージサーバ - その7 - プロジェクト管理サーバ

tracでプロジェクトの管理をします。
以下を実行します。
# ACCEPT_KEYWORDS="~x86" USE="mysql apache2 ldap sqlite" emerge www-apps/trac
# cd /mnt/storage
# mkdir trac
# chown apache:apache trac
# emerge www-apache/mod_python
# vi /etc/apache2/httpd.conf
LoadModule python_module                 modules/mod_python.so
を追加します。
以下のように対話式に実行します。
# trac-admin /mnt/storage/trac/project1 initenv
Project Name [My Project]> project1
Database connection string [sqlite:db/trac.db]>
Repository type [svn]>
Path to repository [/path/to/repos]> /mnt/storage/svn/project1
Templates directory [/usr/share/trac/templates]>
以下を実行します。
# cd /mnt/storage/trac
# chown -R apache:apache sandbox
# ACCEPT_KEYWORDS="~x86" emerge www-apps/trac-webadmin
# cd /mnt/storage/trac/sandbox
# vi conf/trac.ini
でファイルの最後に
[components]
webadmin.* = enabled
を追加します。
# trac-admin /mnt/storage/trac/project1 permission add anonymous TRAC_ADMIN
でユーザanonymousに管理権限を与えます。
# vi /etc/apache2/httpd.conf
でファイルの最後に
<Location /trac/project1>
        SetHandler mod_python
        PythonHandler trac.web.modpython_frontend
        PythonOption TracEnv /mnt/storage/trac/project1
        PythonOption TracUriRoot /trac/project1
        AuthType Basic
        AuthName "hoge-trac-project1"
        AuthLDAPURL ldap://localhost/ou=project1,o=hoge,c=com?cn
        require valid-user
</Location>
を追加します。
なお、バックアップは
# trac-admin /mnt/storage/trac/project1 hotcopy /tmp
で可能です。
ウェブブラウザからこのサーバに対しhttpsで
"trac/project1"にアクセスできるようになります。

2010年9月16日木曜日

為替介入

ついに政府・日銀が円売りの為替介入に動きました。
っていうか動くの遅すぎ。
結果前日比で2.5円程円安に振れました。
一ヶ月前の水準です。
やはり瞬間的にはきっちり結果が出ますね。
明日はゆり戻しも考えられますが、
間髪いれず介入すれば流れが変わるかもしれませんね。
近々に88円ぐらいまで戻ると個人的にはうれしいのですが…

2010年9月15日水曜日

ストレージサーバ - その6 - ソースコードバージョン管理サーバ

WebDAV+svnでソースコード等のバージョン管理を行います。
以下を実行します。
# USE="apache2" emerge dev-util/subversion
# vi /etc/conf.d/apache2
でAPACHE2_OPTS 変数に"-D SVN -D SVN_AUTHZ"を加えます。
リポジトリproject1を作成するため以下を実行します。
# cd /mnt/storage/
# mkdir svn
# chown apache:apache svn
# svnadmin create /mnt/storage/svn/project1
# cd /mnt/storage/svn
# chown -R apache:apache project1
# vi /etc/apache2/modules.d/47_mod_dav_svn.conf
で以下の内容をファイルの最後に追加します。
        <Location /svn/project1>
                DAV svn
                SSLRequireSSL
                SVNPath /mnt/storage/svn/project1
                AuthType Basic
                AuthName "hoge-svn-sandbox"
                AuthLDAPURL ldap://localhost/ou=project1,o=hoge,c=com?cn
                Require valid-user
        </Location>
svnクライアントからこのサーバに対しhttpsで
"svn/project1"にアクセスできるようになります。

2010年9月14日火曜日

ペイオフ

初のペイオフ発動となりました。
貧乏人の私には大して関係ないといいたいところですが、
外貨預金は保護対象にならない場合があるので気をつけたいところです。

2010年9月10日金曜日

ストレージサーバ - その5 - ldap管理webアプリ

ストレージサーバのユーザ管理のための
ldapが管理データを操作するwebアプリを作成します。
以下を実行します。
# cd /mnt/storage
# mkdir webapp
# chown apache:apache webapp
# cd webapp
# mkdir user
# cd /var/www/localhost/htdocs/
# ln -s /mnt/storage/dav/user user
# cd /mnt/storage/dav/user
# mkdir top
# cd top
# touch init.php
# touch index.php
# touch term.php
# cd ..
# mkdir group
# cd group
# touch group.php
# touch init.php
# touch term.php
# touch user.php
# touch useradd.php
# touch userdel.php
# touch useredit.php
# touch usernew.php
ここで、
/mnt/storage/webapp/user/top/*.php
/mnt/storage/webapp/user/group/*.php
の各ファイルの内容については最後に記します。
httpdで公開する各ディレクトリ毎にアクセス管理ができるのですが、
例えば、project1 と project2 を作成する場合について説明します。
以下を実行します。
# cd /mnt/storage/webapp
# chown -R apache:apache user
# cd /mnt/storage/dav
# mkdir user
# cd user
# ln -s ../../webapp/user/top/index.php index.php
# ln -s ../../webapp/user/top/init.php init.php
# ln -s ../../webapp/user/top/term.php term.php
# mkdir project1
# cd project1
ここで
# vi .htaccess
で内容を以下のようにします。
SSLRequireSSL
AuthType Basic
AuthName "hoge-project1-user"
AuthLDAPURL ldap://localhost/ou=project1,o=hoge,c=com?cn
require valid-user
続いて以下を実行します。
# chmod 600 .htaccess
# ln -s ../../../webapp/user/group/group.php group.php
# ln -s ../../../webapp/user/group/init.php init.php
# ln -s ../../../webapp/user/group/term.php term.php
# ln -s ../../../webapp/user/group/user.php user.php
# ln -s ../../../webapp/user/group/useradd.php useradd.php
# ln -s ../../../webapp/user/group/userdel.php userdel.php
# ln -s ../../../webapp/user/group/useredit.php useredit.php
# ln -s ../../../webapp/user/group/usernew.php usernew.php
# echo '' > env.php
project2 についても同様に以下を実行していきます。
# cd ..
# mkdir project2
# cd project2
ここで
# vi .htaccess
で内容を以下のようにします。
SSLRequireSSL
AuthType Basic
AuthName "hoge-project2-user"
AuthLDAPURL ldap://localhost/ou=project2,o=hoge,c=com?cn
require valid-user
以下を実行します。
# chmod 600 .htaccess
# ln -s ../../../webapp/user/group/group.php group.php
# ln -s ../../../webapp/user/group/init.php init.php
# ln -s ../../../webapp/user/group/term.php term.php
# ln -s ../../../webapp/user/group/user.php user.php
# ln -s ../../../webapp/user/group/useradd.php useradd.php
# ln -s ../../../webapp/user/group/userdel.php userdel.php
# ln -s ../../../webapp/user/group/useredit.php useredit.php
# ln -s ../../../webapp/user/group/usernew.php usernew.php
# echo '' > env.php
以下を実行してパーミッションを整えます。
# cd /mnt/storage/dav
# chown -R apache:apache user
最後になりますが、各スクリプトのソースは以下になります。
# more /mnt/storage/webapp/user/top/init.php
<?
        $ldap=ldap_connect("hoge");
        if(!$ldap){
                echo "Could not connect to ldap server.<br/>";
                exit;
        }
        if(!ldap_bind($ldap,"cn=root,o=hoge,c=com","<パスワード>")){
                echo "Could not bind to ldap server.<br/>";
                exit;
        }
?>
# more /mnt/storage/webapp/user/top/term.php
<?
        ldap_unbind($ldap);
?>
# more /mnt/storage/webapp/user/top/index.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>User control</h1>
<?
        require("init.php");
?>
<?
        $entries=ldap_search($ldap,"o=hoge,c=com","(objectclass=organizationalUnit)",array("ou"));
?>
<table border="1">
<tr><th>group</th><th>> </th></tr>
<?
        for($entry=ldap_first_entry($ldap,$entries);$entry!=false;$entry=ldap_next_entry($ldap,$entry)){
                $value=ldap_get_values($ldap,$entry,"ou");
                printf("<tr><td>%s</td><td><a href=\"./%s/group.php?group=%s\">go</a></td></tr>\n",$value[0],$value[0],$value[0]);
        }
?>
<?
        require("term.php");
?>
</table>
</body>
</html>
# more /mnt/storage/webapp/user/group/init.php
<?
        $ldap=ldap_connect("hoge");
        if(!$ldap){
                echo "Could not connect to ldap server.<br/>";
                exit;
        }
        if(!ldap_bind($ldap,"cn=root,o=hoge,c=com","<パスワード>")){
                echo "Could not bind to ldap server.<br/>";
                exit;
        }
        require("./env.php");
?>
# more /mnt/storage/webapp/user/group/term.php
<?
        ldap_unbind($ldap);
?>
# more /mnt/storage/webapp/user/group/group.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        $entries=ldap_search($ldap,"ou=".$env_group.",o=hoge,c=com","(objectclass=organizationalPerson)",array("cn"));
?>
<table border="1">
<tr><th>user</th><th>
<?
        printf("<a href=\"./usernew.php?group=%s\">",$env_group);
?>
new</a></th></tr>
<?
        for($entry=ldap_first_entry($ldap,$entries);$entry!=false;$entry=ldap_next_entry($ldap,$entry)){
                $value=ldap_get_values($ldap,$entry,"cn");
                printf("<tr><td>%s</td><td><a href="./user.php?group=%s&user=%s\">edit</a></td><td><a href=\"./userdel.php?group=%s&user=%s\">del</a></td></tr>\n",$value[0],$env_group,$value[0],$env_group,$value[0]);
        }
?>
<?
        require("term.php");
?>
</table>
</body>
</html>
# more /mnt/storage/webapp/user/group/user.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        $entries=ldap_search($ldap,"cn=".$_GET["user"].",ou=".$env_group.",o=hoge,c=com","(objectclass=organizationalPerson)");
        $entry=ldap_first_entry($ldap,$entries);
        if($entry==false){
                echo "No user.<br/>";
                exit;
        }
        $value=ldap_get_values($ldap,$entry,"cn");
?>
<form action="./useredit.php" method="post">
<?
        printf("<input type=\"hidden\" name=\"group\" value=\"%s\">",$env_group);
        printf("<input type=\"hidden\" name=\"cn\" value=\"%s\">",$value[0]);
?>
<table>
<?
        printf("<tr><th>cn</th><td>%s</td></tr>",$value[0]);
        $value=ldap_get_values($ldap,$entry,"sn");
        printf("<tr><th>sn</th><td><input type=\"text\" name=\"sn\" value=\"%s\" /></td></tr>",$value[0]);
        $value=ldap_get_attributes($ldap,$entry);
        if($value["mail"]["count"]>0){
                $value=ldap_get_values($ldap,$entry,"mail");
                $mail=$value[0];
        }
        else
                $mail="";
        printf("<tr><th>mail</th><td><input type=\"text\" name=\"mail\" value=\"%s\" /></td></tr>",$mail);
?>
<tr><th>userPassword</th><td><input type="password" name="pass"></td></tr>
<tr><th align="right">(confirm)</th><td><input type="password" name="pass1"></td
></tr>
</table>
<input type="submit" value="OK">
</form>
<?
        require("term.php");
?>
</body>
</html>
# more /mnt/storage/webapp/user/group/useradd.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        if($_SERVER["REMOTE_USER"]!="root"){
                echo "root user only can.<br/>";
                exit();
        }
        if($_POST["pass"]!=$_POST["pass1"]){
                echo "password error.<br/>";
                exit();
        }
        $p=exec("slappasswd -s ".$_POST["pass"]);
        $data["objectclass"]="organizationalPerson";
        $data["cn"]=$_POST["cn"];
        $data["sn"]=$_POST["sn"];
        $data["userPassword"]=$p;
        $data["mail"]=$_POST["mail"];
        $r=ldap_add($ldap,"cn=".$_POST["cn"].",ou=".$env_group.",o=hoge,c=com",$data);
        if($r==true){
                echo "OK.<br/>";
        }
        else{
                echo "error.<br/>";
        }
?>
<?
        require("term.php");
?>
</body>
</html>
# more /mnt/storage/webapp/user/group/userdel.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        if($_SERVER["REMOTE_USER"]!="root"){
                echo "root user only can.<br/>";
                exit();
        }
        $r=ldap_delete($ldap,"cn=".$_GET["user"].",ou=".$env_group.",o=hoge,c=com");
        if($r==true){
                echo "OK.<br/>";
        }
        else{
                echo "error.<br/>";
        }
?>
<?
        require("term.php");
?>
</body>
</html>
# more /mnt/storage/webapp/user/group/useredit.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        if(($_SERVER["REMOTE_USER"]!="root")&&($_SERVER["REMOTE_USER"]!=$_POST["cn"])){
                echo "authentication error.<br/>";
                exit();
        }
        if($_POST["pass"]!=$_POST["pass1"]){
                echo "password error.<br/>";
                exit();
        }
        if($_POST["pass"]!=""){
                $p=exec("slappasswd -s ".$_POST["pass"]);
                $data["userPassword"]=$p;
        }
        $data["sn"]=$_POST["sn"];

        $entries=ldap_search($ldap,"cn=".$_POST["cn"].",ou=".$env_group.",o=hoge,c=com","(objectclass=organizationalPerson)");
        $entry=ldap_first_entry($ldap,$entries);
        if($entry==false){
                echo "No user.<br/>";
                exit;
        }
        $value=ldap_get_attributes($ldap,$entry);
        if($value["mail"]["count"]==0){
                $dummy["mail"]="";
                ldap_mod_add($ldap,"cn=".$_POST["cn"].",ou=".$env_group.",o=hoge,c=com",$dummy);
        }
        $data["mail"]=$_POST["mail"];

        $r=ldap_modify($ldap,"cn=".$_POST["cn"].",ou=".$env_group.",o=hoge,c=com",$data);
        if($r==true){
                echo "OK.<br/>";
        }
        else{
                echo "error.<br/>";
        }
?>
<?
        require("term.php");
?>
</body>
</html>
# more /mnt/storage/webapp/user/group/usernew.php
<html>
<head>
<title>User control</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?
        require("init.php");
?>
<h1>User control - <? echo $env_group ?></h1>
<?
        $entries=ldap_search($ldap,"ou=".$env_group.",o=hoge,c=com","(objectclass=organizationalPerson)",array("cn","sn","userPassword"));
        $entry=ldap_first_entry($ldap,$entries);
        if($entry==false){
                echo "No user.<br/>";
                exit;
        }
        $value=ldap_get_values($ldap,$entry,"cn");
?>
<form action="./useradd.php" method="post">
<?
        printf("<input type=\"hidden\" name=\"group\" value=\"%s\">",$env_group);
?>
<table>
<tr><th>cn</th><td><input type="text" name="cn"></td></tr>
<tr><th>sn</th><td><input type="text" name="sn"></td></tr>
<tr><th>mail</th><td><input type="text" name="mail"></td></tr>
<tr><th>userPassword</th><td><input type="password" name="pass"></td></tr>
<tr><th align="right">(confirm)</th><td><input type="password" name="pass1"></td
></tr>
</table>
<input type="submit" value="OK">
</form>
<?
        require("term.php");
?>
</body>
</html>

2010年9月9日木曜日

ストレージサーバ - その4 - ミドルウェアのセットアップ

ストレージサーバにミドルウェアのセットアップします。
ここでは基本となる
  • httpサーバ
  • ldapサーバ
  • PHPエンジン
  • MySQLデータベースサーバ
  • tftpサーバ
について記述します。

最初にhttpサーバを設定します。
ディレクトリ構成は以下のようにします。
  • バージョン管理のdav
  • 公共用のpub
  • 一次作業用のtmp
  • tftpサーバで公開するtftp
  • 特定ユーザのみログインできるproject1

以下を実行します。
# USE="ldap" emerge -pv www-servers/apache
# USE="ldap" emerge www-servers/apache
# echo "ServerName 10.19.59.191" >> /etc/apache2/httpd.conf
# vi /etc/conf.d/apache2
APACHE2_OPTS="-D DEFAULT_VHOST"
APACHE2_OPTS="-D SSL -D SSL_DEFAULT_VHOST -D DAV -D DAV_FS -D LDAP -D AUTH_LDAP"
に変更します。
以下を実行します。
# chmod 777 /mnt
# chmod 777 /mnt/storage
# cd /mnt/storage
# mkdir dav
# chown apache:apache dav
# chmod 777 dav
# cd dav
# mkdir pub
# chown apache:apache pub
# chmod 777 pub
# mkdir tmp
# chown apache:apache tmp
# chmod 777 tmp
# mkdir project1
# chown apache:apache project1
# chmod 777 project1
# cd /mnt/storage/dav
# mkdir tftp
# chown apache:apache tftp
# chmod 777 tftp
# vi /etc/apache2/httpd.conf
で以下のように修正。
<Directory />
    Options FollowSymLinks
    AllowOverride None
    AllowOverride All
</Directory>
<Directory />
    Options FollowSymLinks
#    AllowOverride None
    AllowOverride All
</Directory>
に変更します。
またファイルの最後に
Alias	/dav/pub		"/mnt/storage/dav/pub"
Alias /web/pub "/mnt/storage/dav/pub"
Alias /dav/tmp "/mnt/storage/dav/tmp"
Alias /web/tmp "/mnt/storage/dav/tmp"
Alias /dav/project1 "/mnt/storage/dav/project1"
Alias /web/project1 "/mnt/storage/dav/project1"
Alias /dav/tftp "/mnt/storage/dav/tftp"
Alias /web/tftp "/mnt/storage/dav/tftp"

<Location /dav/pub>
DAV on
SSLRequireSSL
</Location>

<Location /web/pub>
Options Indexes
SSLRequireSSL
</Location>

<Location /dav/tmp>
DAV on
SSLRequireSSL
</Location>

<Location /web/tmp>
Options Indexes
SSLRequireSSL
</Location>

<Location /dav/project1>
DAV on
SSLRequireSSL
AuthType Basic
AuthName "hoge-project1"
AuthLDAPURL ldap://localhost/ou=project1,o=hoge,c=com?cn
require valid-user
</Location>

<Location /web/project1>
Options Indexes
SSLRequireSSL
AuthType Basic
AuthName "hoge-project1"
AuthLDAPURL ldap://localhost/ou=project1,o=hoge,c=com?cn
require valid-user
</Location>

<Location /dav/tftp>
DAV on
SSLRequireSSL
</Location>

<Location /web/tftp>
Options Indexes
SSLRequireSSL
</Location>
を追加します。
以下を実行します。
# rc-update add apache2 default
# /etc/init.d/apache2 start

認証のためのldapサーバを準備します。
以下を実行します。
# cd /etc/openldap
# slappasswd
# vi slapd.conf
で以下のように設定します。
database	bdb
suffix "o=hoge,c=com"
rootdn "cn=root,o=hoge,c=com"
rootpw {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ここで rootpw の値は
# slappasswd -s <パスワード>
の結果です。
また先頭に
allow bind_v2
を追加します。
以下を実行します。
# echo 'dn: o=hoge,c=com' > /tmp/hoge.ldif
# echo 'objectClass: organization' >> /tmp/hoge.ldif
# echo 'o: hoge' >> /tmp/hoge.ldif
# ldapadd -x -h localhost -D "cn=root,o=hoge,c=com" -w <パスワード> -f /tmp/hoge.ldif
# rm /tmp/hoge.ldif
# cd /var/lib/
# mv openldap-data /mnt/storage/
# ln -s /mnt/storage/openldap-data openldap-data
# rc-update add slapd default
# /etc/init.d/slapd start
続いてPCでここからBrowser282b2.zipをダウンロードしてlbe.jarを実行します。
これからldapの管理はこちらから行うことにします。
entry は領域を organizationalUnit で、
その領域にアクセスできるユーザを organizationalPerson で作ります。
なお、organizationalUnit の ou 属性が領域名、
organizationalPerson の cn 属性がユーザIDで、
sn 属性にフルネームをローマ字で、
userPassword 属性にパスワードをハッシュ値で入れておきます。

今度はPHPエンジンをインストールしましょう。
以下を実行します。
# USE="cli apache2 mysql gd jpeg png gif ldap" emerge dev-lang/php
# vi /etc/conf.d/apache2
でAPACHE2_OPTS 変数に"-D PHP5"を加えます。
# vi /etc/apache2/httpd.conf
DirectoryIndex index.html index.html.var
DirectoryIndex index.html index.html.var index.php
に変更します。
以下を実行します。
# /etc/init.d/apache2 restart
# echo '' > /var/www/localhost/htdocs/phpinfo.php
# emerge dev-db/mysql
# rc-update add mysql default
# /usr/bin/mysql_install_db
# /etc/init.d/mysql start

ldapについては後で修正した部分があり、
今思えばミスではあるが、
実はユーザ管理に使っている"organizationalPerson"要素には"mail"属性が含まれていませんでした。
今更"inetOrgPerson"に変えるのも面倒なので、
"organizationalPerson"に無理やり"mail"を追加しています。
まず、
# vi core.schema
でファイルを開き、"organizationalPerson"の定義部分
objectclass ( 2.5.6.7 NAME 'organizationalPerson'
        DESC 'RFC2256: an organizational person'
        SUP person STRUCTURAL
        MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $
                preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $
                telephoneNumber $ internationaliSDNNumber $
                facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $
                postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l
) )
を探します。ここの最後から2番目の行の最後に" $ mail"を追加し、
                postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l $ mail
とします。また、最後のほうにある
attributetype ( 0.9.2342.19200300.100.1.3
        NAME ( 'mail' 'rfc822Mailbox' )
        DESC 'RFC1274: RFC822 Mailbox'
        EQUALITY caseIgnoreIA5Match
        SUBSTR caseIgnoreIA5SubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
を先の"organizationalPerson"の定義部分よりも前に移し、
元の部分はコメントアウト(各行の先頭に'#'を追加)します。
最後に
# /etc/init.d/slapd restart
で、ldapサーバを再起動します。

MySQLデータベースサーバをインストールします。
以下を実行します。
# /etc/init.d/mysql stop
# cd /var/lib
# mv mysql /mnt/storage/
# ln -s /mnt/storage/mysql mysql
# /etc/init.d/mysql start

最後にtftpサーバと、
その公開ディレクトリにDAV経由でアクセスできるようにします。
以下を実行します。
# cd /etc/xinetd.d
# touch tftp
# chmod 644 tftp
ファイル"/etc/xinetd.d/tftp"を編集して以下の内容とします。
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = apache
server = /usr/sbin/in.tftpd
server_args = /mnt/storage/dav/tftp
}
ファイル"/etc/xinetd.conf"の
only_from       = localhost
の行をコメントアウト(先頭に'#'を追加)します。
以下を実行します。
# /etc/init.d/xinetd start
# rc-update add xinetd default

2010年9月8日水曜日

DNSSEC

JPゾーンのDNSSEC対応日程が出てきました。
署名の開始が2010年10月17日、
署名鍵の登録受け付け開始および提供が2011年1月16日だそうです。

DNSSECというと世界中に散らばるネームサーバから
DNSリゾルバが名前解決する際に
SSLで内容の正当性を担保しようという仕組みで、
一般のユーザにとっては特に関係ないはずです。
DNSサーバを自力運用してドメインを管理していたり、
あるいは各クライアントにDNSサービスを提供している場合に
関係ありということになると思います。
私もJPドメインを1つ運用しているので、
いずれは対応させないといけないのでしょうが、
BINDをインストールしなおす必要があるので面倒です。
まあ、数年は対応しなくても問題ないでしょう。

そういえば、メールサーバに Sender ID を設定をしていますが、
これが本当に役に立つようになるのはいつになるのでしょうか。

2010年9月7日火曜日

ストレージサーバ - その3 - OSインストール

ストレージサーバを構築するに当たりOSをインストールします。
私の大好きなGentoo Linuxを使いますが、
情報が古いので気をつけてください。
また、IPアドレス等は適宜読み替えてください。

install-amd64-minimal-2007.0.iso でCDブートすると、
途中キーボードの種類をたずねられるので接続しているキーボードに合わせて選択ます。
一般的な日本語(106)キーボードなら"22"(jp)を選択する。
立ち上がったら以下を実行します。
# ifconfig eth0 192.168.0.100 broadcast 192.168.0.255 netmask 255.255.255.0 up
# route add default gw 192.168.1.1
# echo 'nameserver 192.168.1.1' >> /etc/resolv.conf
# passwd
# /etc/init.d/sshd start
これ以降はssh経由でのリモートログインが可能なので
そちらで操作することをお勧めします。
ちなみにアクセスするときは
$ ssh root@192.168.0.100
とする必要があります。

さて、パーティションを切ります。
# cfdisk /dev/sda
を実行し以下のように設定することにします。
   Name        Flags      Part Type  FS Type          [Label]        Size (MB)
------------------------------------------------------------------------------
   sda1        Boot        Primary   Linux                              131.61
   sda2                    Primary   Linux swap / Solaris              2048.10
   sda3                    Primary   Linux                            31445.25
   sda5                    Logical   Linux                            32769.52
   sda6                    Logical   Linux                            32769.52
   sda7                    Logical   Linux                            32769.52
   sda8                    Logical   Linux                            32761.30
以下を実行ます。
# mke2fs /dev/sda1
# mkswap /dev/sda2
# swapon /dev/sda2
# mke2fs -j /dev/sda3
# mke2fs -j /dev/sda5
# mke2fs -j /dev/sda6
# mke2fs -j /dev/sda7
# mke2fs -j /dev/sda8
# tune2fs -c 0 -i 0 /dev/sda1
# tune2fs -c 0 -i 0 /dev/sda3
# tune2fs -c 0 -i 0 /dev/sda5
# tune2fs -c 0 -i 0 /dev/sda6
# tune2fs -c 0 -i 0 /dev/sda7
# tune2fs -c 0 -i 0 /dev/sda8
# mount /dev/sda3 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/sda1 /mnt/gentoo/boot
# mkdir /mnt/gentoo/usr
# mount /dev/sda5 /mnt/gentoo/usr
# mkdir /mnt/gentoo/home
# mount /dev/sda6 /mnt/gentoo/home
# mkdir /mnt/gentoo/var
# mount /dev/sda7 /mnt/gentoo/var
# mkdir /mnt/gentoo/opt
# mount /dev/sda8 /mnt/gentoo/opt
以下のコマンドで時刻を確かめておきます。
# date
時計があっていなければ date コマンドで時刻を合わせます。
以下を実行ます。
# cd /mnt/gentoo
# wget ftp://rsync4.jp.gentoo.org/GENTOO/releases/amd64/2007.0/stages/stage3-amd64-2007.0.tar.bz2
# wget ftp://rsync4.jp.gentoo.org/GENTOO/releases/amd64/2007.0/stages/stage3-amd64-2007.0.tar.bz2.DIGESTS
# md5sum -c stage3-amd64-2007.0.tar.bz2.DIGESTS
# tar jxfp stage3-amd64-2007.0.tar.bz2
# wget http://gentoo.gg3.net/snapshots/portage-latest.tar.bz2
# wget http://gentoo.gg3.net/snapshots/portage-latest.tar.bz2.md5sum
# md5sum -c portage-latest.tar.bz2.md5sum
# tar jxf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr
/mnt/gentoo/etc/make.conf を
# nano -w /mnt/gentoo/etc/make.conf
で開き、
CFLAGS="-O2 -pipe"
CFLAGS="-march=nocona -O2 -pipe"
へ変更。
MAKEOPTS="-j3"
を追加。
# mirrorselect -i -o >> /mnt/gentoo/etc/make.conf
を実行するとサーバリストが表示されるので、Japanなものをとりあえずすべて選択。
以下を実行します。
# cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf
# mount -t proc none /mnt/gentoo/proc
# mount -o bind /dev /mnt/gentoo/dev
# chroot /mnt/gentoo /bin/bash
# env-update
# source /etc/profile
# export PS1="(chroot) $PS1"
# emerge --sync --quiet
# echo 'en_US ISO-8859-1' >> /etc/locale.gen
# echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen
# echo 'ja_JP.EUC-JP EUC-JP' >> /etc/locale.gen
# echo 'ja_JP.UTF-8 UTF-8' >> /etc/locale.gen
# echo 'ja_JP EUC-JP' >> /etc/locale.gen
# locale-gen
# cp /usr/share/zoneinfo/Japan /etc/localtime
# USE="-doc symlink" emerge gentoo-sources
# cd /usr/src/linux
# make menuconfig
でカーネルのカスタマイズができるので
Processor type and features  --->
Processor family (Intel Core2 / newer Xeon)  --->
/dev/cpu/microcode - Intel CPU microcode support
Device Drivers  --->
Multi-device support (RAID and LVM)  --->
  RAID support
    RAID-0 (striping) mode
    RAID-1 (mirroring) mode
のように変更します。
以下を実行します。
# make && make modules_install
# cp arch/x86_64/boot/bzImage /boot/kernel-2.6.22-gentoo-r5
# find /lib/modules/2.6.22-gentoo-r5/ -type f -iname '*.o' -or -iname '*.ko'
# echo 'raid0' >> /etc/modules.autoload.d/kernel-2.6
# echo 'raid1' >> /etc/modules.autoload.d/kernel-2.6
/etc/fstab の内容を
# nano -w /etc/fstab
を実行して以下のように変更します。
/dev/sda1               /boot           ext2            noauto,noatime  1 2
/dev/sda3               /               ext3            noatime         0 1
/dev/sda2               none            swap            sw              0 0
/dev/cdrom              /mnt/cdrom      audo            noauto,ro       0 0
/dev/sda5               /usr            ext3            noatime         0 2
/dev/sda6               /home           ext3            noatime         0 2
/dev/sda7               /var            ext3            noatime         0 2
/dev/sda8               /opt            ext3            noatime         0 0
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec    0 0
none                    /proc           proc            defaults        0 0
/etc/conf.d/hostname の内容を
# nano -w /etc/conf.d/hostname
を実行して
HOSTNAME="localhost"
HOSTNAME="hoge"に変更します。
/etc/conf.d/domainname の内容を
# nano -w /etc/conf.d/domainname
を実行して
DNSDOMAIN="hoge.com"
を追加する。/etc/conf.d/net の内容を
# nano -w /etc/conf.d/net
を実行して
config_eth0=( "192.168.1.100 netmask 255.255.255.0 brd 192.168.1.255")
routes_eth0=( "default gw 192.168.1.1" )
を追加します。
# nano -w /etc/hosts
を実行して
127.0.0.1       localhost
の行を
127.0.0.1       hoge.hoge.com   hoge     localhost
に変更します。/etc/conf.d/keymaps の内容を
# nano -w /etc/conf.d/keymaps
を実行して
KEYMAP="us"
の行を
KEYMAP="jp106"
に変更します。/etc/conf.d/clock の内容を
# nano -w /etc/conf.d/clock
を実行して
CLOCK="UTC"
の行を
CLOCK="local"
に変更します。
以下を実行します。
# rc-update add net.eth0 default
# echo "tts/0" >> /etc/securetty
# passwd
# emerge syslog-ng
# rc-update add syslog-ng default
# emerge vixie-cron
# rc-update add vixie-cron default
# rc-update add sshd default
# emerge grub
/boot/grub/grub.conf の内容を
# nano -w /boot/grub/grub.conf
を実行して以下のように変更します。
default 0
timeout 10
serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console
title=gentoo
root (hd0,0)
kernel /boot/kernel-2.6.22-gentoo-r5 root=/dev/sda3
/etc/inittab の内容を
# nano -w /etc/inittab
を実行して
s0:12345:respawn:/sbin/agetty 9600 ttyS0 vt100
を追加(コメントアウト)し、
ca:12345:ctrlaltdel:/sbin/shutdown -r now
ca:12345:ctrlaltdel:/sbin/shutdown -h now
に直します。
以下を実行します。
# grep -v rootfs /proc/mounts > /etc/mtab
# grub-install /dev/sda
# exit
# cd
# umount /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo/boot
# umount /mnt/gentoo/usr /mnt/gentoo/home /mnt/gentoo/var /mnt/gentoo/opt
# umonnt /mnt/gentoo
# reboot
ブート時にCDは取り出してHDDからブートさせます。
以下を実行ます。
# useradd -m -G users,wheel -s /bin/bash ttanimu
# passwd ttanimu
# emerge app-editors/vim
# emerge app-arch/dump
# emerge sys-fs/mdadm
# rc-update add mdadm default
# cfdisk /dev/sdb
を実行し以下のように設定します。
ただし、FS Type の Linux raid autodetect の値は fd です。
   Name        Flags      Part Type  FS Type          [Label]        Size (MB)
------------------------------------------------------------------------------
   sdb1                    Primary   Linux raid autodetect           209999.63
   sdb2                    Primary   Linux raid autodetect           110070.70
# cfdisk /dev/sdc
を実行し以下のように設定します。
   Name        Flags      Part Type  FS Type          [Label]        Size (MB)
------------------------------------------------------------------------------
   sdc1                    Primary   Linux raid autodetect           209999.63
   sdc2                    Primary   Linux raid autodetect           110070.70
以下を実行します。
# mknod /dev/md1 b 9 1
# mknod /dev/md2 b 9 2
# mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# mdadm --create --verbose /dev/md2 --level=0 --raid-devices=2 /dev/sdb2 /dev/sdc2
# mke2fs -j /dev/md1
# mke2fs /dev/md2
# tune2fs -c 0 -i 0 /dev/md1
# tune2fs -c 0 -i 0 /dev/md2
# cd /mnt
# mkdir storage
# mkdir backup
# emerge mail-mta/ssmtp
# echo 'MAILADDR admin@hoge.com' >> /etc/mdadm.conf
/etc/ssmtp/ssmtp.conf の内容を
# vi /etc/ssmtp/ssmtp.conf
を実行して
mailhub=mail
の行を
mailhub=192.168.0.1
に変更します。/etc/fstab の内容を
# vi /etc/fstab
を実行して
/dev/md1                /mnt/storage    ext3            noatime         0 2
/dev/md2                /mnt/backup     ext2            noatime         0 2
の2行を追加します。以下を実行します。
# reboot
RAIDのフェールセーフの動作を確認しておきたければ、
# cat /proc/mdstat
でmd1(raid1)のresyncが100%になるまで待ち、
# mdadm /dev/md1 --fail /dev/sdb1
を実行してRAID1にわざと障害を起こして
"admin@hoge.com"宛てに通知メールが届くことを確認します。
その後
# mdadm /dev/md1 --remove /dev/sdb1
# mdadm /dev/md1 --add /dev/sdb1
を実行し回復させ、
# cat /proc/mdstat
でmd1(raid1)のrecoveryが100%になるまで一応待ち、完了です。

2010年9月3日金曜日

デジタルWOWOWキャンペーン

いろいろと都合があって未だにアナログを見ているWOWOWですが、
9月30日までにデジタルに乗り換えると
3波デジタル外付けチューナのDT300が特別価格で手に入れられます。
録画のことも考え、RD-S1004KDMR-BW680を入手してからと思っていましたが、
地デジはPS3+torne、BSはLT-H91DTV
環境的にはダブル録画可能なので、
この機会にデジタルに乗り換えるのもありかと思っているところです。

2010年9月2日木曜日

b-mobileWiFi キャンペーン

b-mobileWiFib-mobileSIM U300 12カ月パッケージを購入すると
月額換算で2755円を18ヶ月使えるキャンペーンが始まりました。
かなり魅力的です。
本当はMiFi2372の方がほしいんですが、
実質2万円程度の差があることになりますからね…
悩みどころです。

2010年9月1日水曜日

家電エコポイント延長?

家電エコポイントが来年3月末まで延長
という方向になっているようです。
全く恩恵にあずかれておらず、
しかも今後もその予定がない私からすれば
あまり関心はないのですが、
とにかく消費の先食いでないことを祈るばかりです。

内需拡大の策が終わるのと時を同じくして、
外需がこの円高で悲惨なことになっているので、
応急処置としてのエコポイント延長は
方向性は間違っていないと思いますが、
永遠に続けるわけにもいかず
出口はどうするつもりなのでしょうか。

この分だとエコカー補助金も延長するかもしれないので、
そうしたら車の買い替えでもして景気に貢献しますか。