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'] のアンダーバーが抜けていたのを修正.

2008年11月30日日曜日

Java Festa 2008 に行ってきた♪

Java Festa 2008 に行ってきた.寝坊して,セッションをふたつしか聞けなかったという,まじでダメ人間だったけどな.本当に,予約したのにこんなんで本当に申し訳ない.

さて,聞けたセッションについて,簡単に感想.

○「今が旬」GlassFish を召し上がれ

GlassFish ネタだった.名前は知ってるけど,触ったことないや〜ってかんじだったんで,興味津々で聞いた.実際,プレゼンも面白かったし,ねこび〜んの話とか織り交ぜてて,ナイスなプレゼンだった.

内容は,GlassFish を導入する利点とかがメインかな.インストールやら管理やらが簡単そうで良さげだった.といっても,全然 Java EE わかんないんだよねwwwDWRっていうがあることが知れたのが,発見だったw本筋と関係ないwwwJava EE のお勉強をそのうちしたいなと思っているので,機会があったら使ってみようと思う.

○Cloud Computing - Google App Engines
Google App Engines これは技術として,めちゃくちゃ面白いと思う.Google のインフラを使った(なんと,BigTable が使えるのだ!)Web アプリケーションが作れる.ハードウェアやらなんやらのインフラは完全に Google まかせで,準備された API を使って開発するだけってかんじ.現状の開発言語は Python.開発は,ローカルで開発して,専用のスクリプトでアップロードってかんじみたいだった.

質問タイムに,質問してくれた人には Google のTシャツあげるよって行ったから,Tシャツ欲しくてダメダメな質問を投げたwプレゼンしてる方が,Mac OS X 用のランチャーを使ってたので,「コマンドラインからのアップロードとかできないんですか?」って質問した.正直,できないってことが考えられないんだけどね.あの質問をした人がこの Blog を書いてる人間なのでよろしく.

で,貰ったよ〜.こんなTシャツ♪

サイズのとこに,150って書いてあって,すっげぇ小さいwとりあえず,部屋着になりそうだw

で,ゲットしたぜって顔で帰宅途中にもうちょっとましな質問を思いついてしまったorz気になるのが「現状では,プリミティブな API(といってもバックグラウンドで動いているインフラからしたら,十分に抽象化されているけどね.)だけを提供しているが,今後より開発が簡単になるようなフレームワークを Google として提供する予定はあるのか?」ということ.まあ,おそらくそれは,Google はそこまでしないと思うけどね.プレゼンの中で,Python のライブラリのほとんどをそこで使えるよって行っていたので,いまある財産を有効に使って,ユーザグループでの活性化を期待してるんだと思った.

有意義だったなぁ.Python の勉強もかねて,遊んでみるのもいいかもね.

2008年11月23日日曜日

MAMP のインストール方法

MAMP について.PHP の言語ネタをやろっかなぁとか思ってるので,その環境づくりのためにね♪

1. MAMP にアクセス.
2. Download Now をクリック.

3. 左側の MAMP のアイコンをクリックしてダウンロード.

4. ダウンロードした MAMP_1.7.2.dmg をダブルクリック.
5. Agree をクリック.

6. MAMP フォルダをアプリケーションフォルダにドラッグアンドドロップしてコピー.

7. アプリケーション>MAMP>MAMP を起動する.

こんなかんじ.基本的にデフォルトのままでいこうと思う.次のエントリから,PHP 言語入門というかんじで,いわゆるこうやったら動く系の話ではなくて,プログラミング言語としての基本的な話をしていく予定.

追記(2008年11月22日):
XHTML と共存させるためにちょっと設定を変更.アプリケーション>MAMP>conf>php5>php.ini をテキストエディットなどのテキストエディタで開いて,76行目の
short_open_tag = On

を
short_open_tag = Off

に変更しよう.こうすることで,<?xmlの部分でエラーが発生することを防げる.

覚えておかなくてもいいが,PHP では,<?phpという風にして,ここから PHP のスクリプトの記述ですよということを示す.その代替として,<?でもいいようになっている.しかし,XHTML では,<?xmlから始まる XML 宣言を先頭につけるので,PHP のスクリプトを処理するプログラムが,そこが PHP のスクリプトであると勘違いしてエラーを出してしまうのだ.それを防ぐために,この設定をしたわけ.

ついでに,エラーを表示するために,277行目の
display_errors = Off

を
display_errors = On

に変更しよう.PHP の勉強をするときには,この設定をしておいたほうが,エラーが画面に表示されるのでわかりやすいと思う.ただし,実際に運用する環境ではエラーが画面に表示されないようにすること.セキュリティの問題があるからね.

設定を変更したら,MAMP を再起動しよう.

2008年11月15日土曜日

AppleScript 入門 林檎なスクリプト言語♪

結構前から,AppleScript の言語ガイドを読んでたんだけど,いまいちしっくりこないんだよね〜.やっぱり,英語圏の人にわかりやすいようなシンタックスだからなのかなぁ.そして,いつも書いてる階乗と FizzBuzz を書いてみたんだけど,あまり AppleScript らしくないんだよね.ちゃんと理解していないけど,オブジェクトとかもあるみたいだし,もうちょっと遊んでみようと思う.

階乗のプログラムはこんなかんじ.
--
-- factorial.applescript
--
on factorial(n)
if n ≤ 0 then
return 1
else
return factorial(n - 1) * n
end if
end factorial

factorial(10)

FizzBuzz はこう.(イベントログに出力してる.)
--
-- fizzbuzz.applescript
--
repeat with i from 1 to 100
if i mod 3 = 0 and i mod 5 = 0 then
log "FizzBuzz"
else if i mod 3 = 0 then
log "Fizz"
else if i mod 5 = 0 then
log "Buzz"
else
log i
end if
end repeat

なんとなくわかるかなw≤は,alt+<で入力できるよ.<=で代替もできるけど,スクリプトエディタで実行すると自動的にそれに書き換えられるねぇ.

参考文献:
AppleScript Language Guide