2008年12月26日金曜日

Mac OS X でシリアルコンソール #1

Mac OS X でシリアルコンソールを使おう♪林檎生活100: FreeBSD インストール用 USB メモリの作成 #2は,この布石だwOS をシリアルコンソールからインストールというのはなかなかないかもしれないけど,Cisco のルータの設定とかはシリアルコンソールからだよね.まっ,そういうときに役に立つんじゃないかな.

さて,Mac OS X でシリアル接続をするわけなんだけど,最近の Mac にはシリアルポート (RS-232C) がないっ!どの機種のどこにもないっ!ということで,物理的にポートを増やさなきゃならないので,今回は秋月電子通商FT232RL USB-RS232C変換モジュールをつかうことにする.代引き手数料込みで¥2,200ということでとってもお買い得♪


さて,こいつが手に入ったら,こいつを USB ポートに接続して終わり♪ってわけじゃないんだよなぁ.Mac OS X にはこいつのドライバが入ってないので,手動でインストールしなきゃなんない.

ということで,こっからドライバインストールの手順.

1. FTDI Chip の Web サイトにアクセス.

FTDI Chip

2. Driver をクリック.


3. VCPをクリック.


4. 下の方にスクロールし,Mac OS X 用のドライバをダウンロード.



5. ドライバをインストール.普通のアプリケーションと変わらないので,詳細は省略.

6. 再起動.

7. FT232RL USB-RS232C変換モジュールを接続.

8. ターミナルを起動して,次のコマンドを打って,/dev/tty.usbserial-???????? が増えていることを確認する.(?の部分はシリアルナンバーが入るので,ハードウェアごとに異なる.)
$ ls /dev/tty.*


以上でハードウェアの準備は完了♪次回は,Mac OS X でシリアルコンソールを使う方法について.

2008年12月25日木曜日

FreeBSD インストール用 USB メモリの作成 #2

林檎生活100: FreeBSD インストール用 USB メモリの作成 #1 の続き?作成した FreeBSD インストール用の USB メモリをちょっと改造して,シリアルコンソールからインストールできるようにしようっていうことなんだけどねw

ということで,その手順.

1. 作成した USB メモリ (/dev/da?s1a) を FreeBSD 上でマウントする.
# mount /dev/da?s1a /mnt

2. loader.conf のあるディレクトリに移動する.
# cd /mnt/boot

3. loader.conf を編集(vi もしくは ee を使ってね.)し,console から始まる行を追加する.
# vi loader.conf
.
.
.
console=comconsole

4. USB メモリをアンマウントする.
# umount /mnt


たったこれだけw

TeraTerm で確認をとった.Mac OS X からのシリアル接続はまた別の機会に♪

参考文献:
FreeBSD ハンドブック: 18.6. シリアルコンソールの設定

2008年12月24日水曜日

FreeBSD インストール用 USB メモリの作成 #1

FreeBSD を USB メモリからインストールするために,インストール用の USB メモリを作成する.今回は,FreeBSD 上で作業するので,FreeBSD がインストールされたマシンを用意してほしい.

僕は,VMware Fusion 上の FreeBSD 7.0-RELEASE で作業した.使用した USB メモリは,ELECOM の MF-BU204GWH.VMware Fusion の設定から USB デバイスを選択し,USB メモリに対応するやつ(僕が使った USB メモリの場合,Transcend series となっていた.)を有効にする.そうすると,FreeBSD に認識され,画面にメッセージが表示される.このとき表示される da?(? の部分は数字.)をきちんとメモしておこう.

さて,ここからが本題.FreeBSD 上でやっていこう.作業手順は次のとおり.

1. MBR(この説明をすると長いので,自分で調べてほしい.また,FreeBSD のブートは面白いので,そっちについてもぜひ♪)を書き込み (-B),USB メモリ全体をひとつのスライス(物理パーティション)として確保する (-I).冗長モードはいわずもがな (-v).これで,/dev/da?s1 というスライスができているはず.
# fdisk -BIv /dev/da?

2. ラベル(論理パーティション)をスライス (da?s1) 上に作成する.ラベルを書き込み (-w),ブートストラップ(FreeBSD のブートについて調べれば出てくるよ.)を書き込む (-B).これで,/dev/da?s1a というラベルができているはず.
# bsdlabel -w -B /dev/da?s1

3. da?s1a というラベルにファイルシステムを作成する.
# newfs /dev/da?s1a

4. FreeBSD のインストール用の ISO イメージをダウンロードする.
# ftp ftp://ftp3.jp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/7.0/7.0-RELEASE-i386-bootonly.iso

5. ISO イメージをマウントする.mdconfig で /dev/md0 を作成する.md0 (-u) に,ISO ファイル (-t vnode -f) をアタッチ (-a) する.そして,/dev/md0 をタイプを指定して (-t cd9660) マウント.
# mdconfig -a -t vnode -f 7.0-RELEASE-i386-bootonly.iso -u 0
# mount -t cd9660 /dev/md0 /cdrom

6. USB メモリ (/dev/da?s1a) をマウントする.
# mount /dev/da?s1a /mnt

7. ISO イメージの中身をコピーする.ディレクトリを再帰的に (-R),パーミッションをできる限り保持したまま (-p) コピーする.冗長モードはいわずもがな (-v)w
# cp -Rpv /cdrom/* /mnt

8. ISO イメージと USB メモリをアンマウントし,ISO イメージをデタッチ (-d) する.
# umount /mnt
# umount /cdrom
# mdconfig -d -u 0

こんな感じで完成♪

ためしに,DNRH-001 で起動してみた.Load Optimized Defaults を実行した状態から,Advanced BIOS Features の First Boot Device をUSB-HDD にすることで USB メモリから起動できたので,おそらくほかの PC でもいけると思う.

ほかの情報を見ると,MBR とスライスのブートセクタをゼロクリアしているものがあるが,これは必要なのだろうか?妥当性が不明だったので,今回はゼロクリアしないことにしている.

参考文献:
kishiro.com: USBメモリからFreeBSDをインストールする

追記(2009年1月18日):
disc1 をコピーする方法から,bootonly をコピーする方法に変更.この方が小さくて済む.ネットワークインストールではなく,USB メモリをメディアとしてインストールするための方法は,林檎生活100: FreeBSD インストール用 USB メモリの作成 #3を参照のこと.

2008年12月23日火曜日

DNRH-001 #1 UPS 除去 & BIOS アップデート

ざっと,写真とスクリーンショット.

1. 初期状態

2. UPS 除去(UPSの状態をモニタしているケーブルも除去)

3. BIOS は,SST だったので,VIA の BIOS Flash Utility for Windows XP でアップデート(SST じゃない場合は,参考文献参照のこと.)
VIA Technologies, Inc.: VIA EPIA PD-Series Mini-ITX Board - Downloads












ちなみに BIOS は,Load Optimized Defaults の状態にしといた.

参考文献:
usyWiki: DNRH-001

2008年12月1日月曜日

Zend Framework のための PHP 入門 #1

ということで,PHP ネタをやるよ〜.方向性は,Zend Framework の使い方を理解するために必要な PHP の文法とプログラミングテクニックを中心にやってく.すぐに実用できる内容ではないのが申し訳ない.PHP をすぐに実用できるレベルで教えるってのは,難しいことだと思う.なんというか,PHP は簡単ですぐに実用できるってのが世の中の流れだけど,僕はそう思えないんだよね.メールフォームとかアンケートフォームとかを作るだけなら簡単だけど,ログインしてなにかするようなものになってくると,それっぽいものはできてもセキュリティがしっかりしているものはできない.僕がつくってもそうなってしまうのだw

ということで,フレームワークとして Zend Framework を使うことを前提にして,それを扱う上で必要な PHP の文法を理解して,プログラミングの能力を高めることを中心にする.はっきり言って,つまらないと思うwwwだけど,これを読み終わったら Zend Framework を使う下準備が整ったというレベルに達しているように頑張るので,ぜひ読んでみてくれぃ.

前提とする知識として,HTML を読み書きでき,HTML ファイルをサーバにアップロードして公開できること.開発環境として,MAMP(林檎生活100: MAMP のインストール方法を参照.)を使用する.ほかの環境で勉強する際は,前述のエントリの php.ini の設定を読んで,その環境を設定すること.

さて,今回の内容は,PHP が何してるものかということについて.残念ながら PHP の表面を知っているだけでは,PHP を扱うのは難しい.トラブルが起きたときに何が問題で,何が問題でないかという切り分けができないからね.ということで,PHP がどんな風に動いているのかについて書いていく.

まずは,PHP が動いてない HTTP サーバ (Apache) の動きを図に表すと,こんなかんじになる.(正確に把握することではなくて,こういうふうに処理されているんだという感覚を掴んでほしい.)


1. リクエストを送信
2. HTML ファイルを読み込む
3. HTML ファイルの内容を送信

例えば,次のような HTML を書いた sample01.html というファイルを MAMP の /アプリケーション/MAMP/htdocs/sample01.html に置いたとする.(通常なら HTTP サーバにアップロードすることになる.)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>Zend Framework のための PHP 入門#1 (sample01.html)</title>
</head>
<body>
<h1>これは,sample01.html です.</h1>
</body>
</html>

そして,MAMP を起動して,ブラウザから http://localhost:8888/sample01.html にアクセスすると,「これは,sample01.html です.」と表示される.

この動作は,ユーザが localhost にある HTTP サーバに対して,(1.) sample01.html がほしいということをリクエストし,(2.) HTTP サーバが sample01.html を読み込み,(3.) ユーザに sample01.html の内容を送信していることになる.

では,PHP が入るとどうなるのか.PHP が動いている HTTP サーバの動きを図に表すと,こんなかんじになる.


1. リクエストを送信
2. PHP ファイルを読み込む
3. PHP ファイルを渡す
4. 処理した結果を返す
5. 返された結果を送信

これについても例を示そう.例えば,次のような sample02.php というファイルを前述の通りのフォルダに置く.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>Zend Framework のための PHP 入門#1 (sample02.php)</title>
</head>
<body>
<?php
echo "<h1>これは,sample02.php です.</h1>\n";
?>
</body>
</html>

そして,http://localhost:8888/sample02.php にアクセスすると,「これは,sample02.php です.」と表示される.

この動作は,ユーザが localhost にある HTTP サーバに対して,(1.) sample02.php がほしいということをリクエストし,(2.) HTTP サーバが sample02.php を読み込み,(3.) sample02.php を PHP モジュールに渡し,PHP モジュールがファイルのスクリプト部分を実行することで,echo で出力された<h1>これは〜の文字列にスクリプトが置き換えられ,(4.) その結果を HTTP サーバに戻し,(5.) HTTP サーバがユーザにその結果を送信していることになる.

単純に言えば,sample02.php の中の PHP スクリプト部分を実行して,出力された結果を置き換えたテキストデータを,ユーザに送信していることになる.PHP のやっていることの本質は,基本的にこれだけなのだ.sample02.php を sample01.html に書き換えるような作業と言っても差し支えない.それが,リクエストがあるたびに毎回行われている.この書き換えられる感覚を忘れないでほしい.

さて,これだけでは毎回同じ結果になるので,まったく意味がない.実際には,状態(これは,クライアントから送信されたデータだったり,サーバのファイルだったり,サーバの時刻だったり,クッキーだったり,データベースだったりする.)によって,振る舞い(スクリプトの出力や状態の変更.)が変わることで,Web アプリケーションが実現できている.それを図に表すと次のようになる.



この場合の例は,次のようになる.次のようなコードを記述した sample03.php というファイルを前述の通りのフォルダに置く.ソースの内容を気にする必要はまったくないからね.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<title>Zend Framework のための PHP 入門#1 (sample03.php)</title>
</head>
<body>
<?php
echo "<h1>これは,{$_GET['filename']} です.</h1>\n";
?>
</body>
</html>

そして,http://localhost:8888/sample03.php?filename=sample03.php にアクセスしてみよう.ここで注意すべきなのは,GET パラメータが付加されていることだ.filename が sample03.php ですよというパラメータが付加されている.

さらに,http://localhost:8888/sample03.php?filename=abcdefを実行してみよう.そうすると,「これは,abcdef です.」と表示されるはずだ.つまり,ユーザの入力によって動作が変わっていることがわかると思う.今回は,入力内容をそのまま表示しているだけだが,この入力内容に応じて様々な動作ができるようになる.この入力自体も HTML のフォームからの入力であったり,Flash からの入力であったりといろいろ考えられる.ただ,あくまで PHP の本質は,図に表したものだと言うことを忘れないでほしい.

ついでに,http://localhost:8888/sample03.phpでアクセスしてみてほしい.エラーメッセージ「Notice: Undefined index: filename in /Applications/MAMP/htdocs/sample03.php on line 10」とともに「これは, です.」と表示されると思う.(エラーメッセージが表示されない場合は,php.ini の設定がエラーメッセージを表示しないようになってるためだと思う.)これは,パラメータがないのに内部でそのパラメータを参照しているために表示されるエラーメッセージだ.(Notice になっているので,正確には通知メッセージかな.)こういう状況でも,エラーが出ないように,エラー処理を中でやらなければならないんだけど,今回は省略している.こういうメッセージが出るようなプログラムを組んでしまったときは,無視せずにエラーメッセージがでないようにプログラムを修正しようねw

こんなかんじで,1回目の内容は終わり.わかっていただけただろうか?1番言いたいのは,PHP のやっていることは図に表した通り単純で,ほかの周辺技術と分けて考えてほしいということ.それさえ掴めれば,必要な周辺技術の勉強をちょこっとするだけで,PHP とシームレスに連携できる.なぜなら,どんな周辺技術にしろ,そこから取得したデータを PHP で処理することは変わらないから.データを取得したあとの処理方法って,PHP をきちんと理解していればどうにかなるし,PHP を理解していなければどうにもならないのだ.

ということで,次回からは PHP の文法まわりをやっていくのでよろしく.おそらく,次回からはもっとつまらなくなると思うwww

追記(2008年12月7日):
$_GET['filename'] のアンダーバーが抜けていたのを修正.