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

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

2008年11月10日月曜日

OpenMP 入門 #4

林檎生活100: OpenMP 入門 #3の続き.今回は,sections ディレクティブについて.

sections ディレクティブは,かなり単純.A という処理と B という処理があって,それぞれ独立しているときには両方同時にやっちゃっていいよねってことだ.

使い方は,次のようなかんじになる.

#include <omp.h>

#define N 1000

int main(void)
{
int i;
float a[N];
float b[N];
float c[N];
float d[N];

for (i = 0; i < N; i++) {
a[i] = i * 1.5;
b[i] = i + 22.35;
}

#pragma omp parallel shared(a, b, c, d) private(i)
{
#pragma omp sections nowait
{
#pragma omp section
for (i = 0; i < N; i++)
c[i] = a[i] + b[i];
#pragma omp section
for (i = 0; i < N; i++)
d[i] = a[i] * b[i];
}
}

return 0;
}


結構便利そうだが,この場合は当然セクションの計算量の多いほうに足を引っ張られるので,計算量のバランスは重要だと思う.まあ,セクションの数(今回は2つだが,独立なセクションがあれば3つでも4つでも OK.)を増やせば,あるていど均されるんだろうけど.

参考文献:
OpenMP Tutorial

2008年11月6日木曜日

MD5, SHA-1 チェックサムの確認方法

Mac OS X で,チェックサム(ハッシュ,ダイジェストとかっても呼ばれるね.)を確認する方法.たぶん,あんまり使う機会がないとは思うんだけどねw僕は,MacPorts で無理矢理インストールするために,チェックサムをいじった記憶がある.(本当は,よくないんだけどさw)

MD5 は,直感的なコマンドで OK なんだよねw
$ md5 ファイル名

SHA-1 が問題.実は,openssl というプログラムを使って,こんな風にやる.(たぶん,どの環境でもインストールされてるはず.じゃないと,ほかのソフトウェアが困るはずだから.)
$ openssl sha1 ファイル名

ちなみに,openssl でほかの規格のチェックサムも調べられる.(man openssl からの抜粋なので,詳しくは,そっちを読んでね.)
       md2       MD2 Digest
md5 MD5 Digest
mdc2 MDC2 Digest
rmd160 RMD-160 Digest
sha SHA Digest
sha1 SHA-1 Digest
sha224 SHA-224 Digest
sha256 SHA-256 Digest
sha384 SHA-384 Digest
sha512 SHA-512 Digest

base64 とかのエンコード系も調べられるみたい.DES などの暗号系も.すげぇなwちなみに,Mac OS X としての正しい使用方法は,参考文献のページに書いてるので,そっちを参考にしてね♪

参考文献:
Mac OS X: SHA-1 ダイジェストを確認する方法

2008年11月2日日曜日

iCal に祝日を追加する

最近は,iCal を使うようになった.ふと考えてみると,iCal には祝日が表示されないのだ.うーん,だれかこの情報を追加するプログラムとか作ってないかなぁとか思ったら,Apple がちゃんと準備してくれてたw

Apple のカレンダーライブラリに行って,祝祭日の中の日本をクリックするだけだね.めんどくさい人は,次のリンクをクリックすれば,iCal が自動的に開いて追加できる.

webcal://ical.mac.com/ical/Japanese32Holidays.ics

僕は,一応自動更新を「毎日」に,色を休みの日らしく「レッド」に設定したよ♪

2008年10月29日水曜日

C 言語の話#2 char *const c; って何?

C 言語について,ふと思ったことや,調べてみたことなどを書くことにした.

今回は,const について.一般的な C 言語入門書で解説される const の使い方ってこんなんだった気がする.

float circle(float r) {
const float pi = 3.14159265;

return r * r * pi;
}


この場合は,円周率 pi が定数ですよってことを示すために,const を付けていることになる.メリットは,プログラマが勘違いして関数中で代入する間違いが避けられるとかいう話になるのかな.あとは,コンパイラによって最適化されやすくなる.(まあ,いまのコンパイラは賢いから,この情報が無くても最適化してくれると思うけど.)

現実的には,const は次のように使われていると思う.(Book は typedef 宣言で宣言された本の構造体への型ってことで.構造体のような大きなサイズの変数を値渡しすると,そのコピーに時間がかかるので,アドレス渡しが基本になるからね.)

int get_isbn(const Book *book) {
return book->isbn;
}


これは,Book 型の変数へのポインタを渡しても,内部でその値が書き換えられることはありませんよってことを示している.つまり,次のような処理は許されないんだよね.

int get_isbn(const Book *book) {
book->isbn = 1234567890; // コンパイルエラー

return book->isbn;
}


これの何がおいしいかというと,ひとつは開発者側のミスが無くなることなんだ.仕様上引数の値を変更する必要が無いとわかっているのであれば,インターフェースにあたる仮引数に const を付けることによって,関数の実装で間違って代入してしまうようなことが避けられる.もうひとつは,これが公開関数だった場合,ユーザ側が安心して関数を使えること.この関数にアドレス渡ししても,その値が更新されることが無いことが保証されているからね.

最後に,タイトルにあげた質問の答え.前述の Book で考えると次のようになる.

int get_isbn(Book *const book) {
book->isbn = 1234567890; // コンパイルエラーにならない
book = NULL; // コンパイルエラー

return book->isbn;
}


つまり,book の示すアドレスの変更を不可能にするのだ.(だから,const Book *book の場合は,book = NULL; はコンパイルエラーにならない.)ちょっと見慣れないかんじだと思うので,しっくり来ないかもしれない.タイトルにまでしていてあれだけど,ほとんど使う機会はないので無視してしまっていいと思う.(僕としてはそういう認識.いや,使う機会がすごくあるという人は,コメントに書いていただけると助かる.)

もちろん,こういう書き方もある.まあ,僕は使うこと無いけど.
int get_isbn(const Book *const book) {
book->isbn = 1234567890; // コンパイルエラー
book = NULL; // コンパイルエラー

return book->isbn;
}


ということだね.参考になったかなぁ.

参考文献:
平林雅英.新ANSI C言語辞典,技術評論社,1997.

2008年10月28日火曜日

C言語の話#1 仮引数での配列添字演算子はシンタックスシュガー

久しぶりの更新で,C言語の話.最近までちゃんと知らなかったので,備忘録的にエントリにしてみた.

配列を引数にとる関数の定義は,次のようなかんじになると思う.
void f(int a[])
{
/* 処理 */
}

また,次のようにかいても問題ない.
void f(int *a)
{
/* 処理 */
}

というか,前者は後者のシンタックスシュガーでしかない.
int a[8];
a = NULL;

は,コンパイルエラーになるが,
void f(int a[]) {
a = NULL;
}

は,コンパイルエラーにならないことから理解できる.

となると,次のような2次元配列の場合が気になる.
void f(int a[][8])
{
/* 処理 */
}

これは,次の記述と同じ意味になる.
void f(int (*a)[8])
{
/* 処理 */
}

予想と違ったという人も結構いると思う.int *a[8]ではなくint (*a)[8]なのだ.ちなみに,前者は,int型へのポインタの配列で,後者は,int型の配列へのポインタだ.

さて,なんでこんなことになってんだろう.これについては,次のプログラムを見てほしい.
int a[8];
f(a);

何ら変哲のない,配列を関数に渡すプログラムだ.しかし,このとき関数に渡されるのは,本当に配列だろうか?実は,アドレスでしかない.配列として確保された領域の先頭アドレスだ.(知っていると思うけど,aと&a[0]が同じ.)つまり,配列を渡しているというわけではないのだ.

そう考えると,次のような2次元配列のときの説明も容易だ.
int a[4][8];
f(a);

渡しているのは,2次元配列の先頭アドレスである.(aとa[0]と&a[0][0]が同じ.)しかし,2次元配列であるので,列の要素数を知らなければ,2次元配列としてアクセスができないのだ.(列の要素数がわからないと,次の行がどの番地から始まるのか計算できない.)もちろん,2次元以上の多次元配列にも同様のことがいえる.

ということで,こんな風にまとめたわけだけど,間違ってそうで怖いなwC言語に超詳しい人ってざらにいるしw間違ってたら教えてください(*- -)(*_ _)ペコリ

参考文献:
B.W.カーニハン,D.M.リッチー.プログラミング言語C 第2版, 共立出版, 1989.
平林雅英.新ANSI C言語辞典,技術評論社,1997.

2008年10月26日日曜日

LaTeX に UTF-8 な TeX ファイルを食わせる方法

エンコーディングを UTF-8 にした TeX ファイルをコンパイルすると文字化けしてしまう.その解決策.

$ platex --kanji=utf8 sample.tex


というふうに,kanji オプションをつけるだけ.MacPorts からインストールした LaTeX はこれでいけた♪

2008年10月2日木曜日

iPod shuffle 買った♪

iPod shuffle を買った♪カラーは,(PRODUCT) RED♪いい.かさばらないし,かっこいいし,ほんと快適♪

唯一かさばったケーブルは,こんなふうに編んでみたw




そういや,ケーブルの材質変わった?iPhone のときも思ったんだよな.新しいからかなぁ.iPod 5G のケーブルみたいに自然に垂れ下がらない.

参考文献:
iPod情報局: 三つ編みヘッドホンコードで絡まりを追放
テド★えにっき +とらちっく: 編み編みshuffleさん

2008年9月30日火曜日

ファイルを開くときのデフォルトのアプリケーションの変更

ファイルをダブルクリックすると,そのファイルに関連づけられてるデフォルトのアプリケーションが開くよね.その設定を変更する方法について.ご存知の方がほとんどだとは思うけど,僕は忘れててググってしまったw

この設定は,ファイルの情報にある.ファイルの情報は,Finder からファイルを右クリックし,情報を見るをクリックすると出てくる次のようなウィンドウだ.



このウィンドウの「このアプリケーションで開く:」にあるアプリケーションを変更することで,そのファイルをダブルクリックしたときには,そのアプリケーションで開かれるようになる.また,「すべてを変更…」をクリックすると,類似したファイルはすべてそのアプリケーションで開かれるようになる.

というかんじ.僕の備忘録になってるねw

2008年9月29日月曜日

OpenMP 入門 #3

林檎生活100: OpenMP 入門 #2の続き.OpenMP 使って速くなるのを体感したいと思って,例題を探してきた♪

例題は,次の式に台形公式を適用して円周率を求めるというもの.



なんで求められるかはよくわかってないけど,やってみたら近似解が求められた♪そのプログラムは次のとおりで,THREADS と定義されている定数を1にしたバージョンと2にしたバージョンでそれぞれ計算してみると速度の違いがわかるはず.(もちろん,Mac Pro とかを持ってるリッチな方は,8とかにしても OK だと思う!)

#include <stdio.h>
#include <omp.h>

#define N 100000000
#define THREADS 2

int main(void)
{
int i;
long double top;
long double bottom;
long double step = 1.0L / N;
long double sum = 0.0L;

omp_set_num_threads(THREADS);

#pragma omp parallel private(top, bottom)
{
#pragma omp for reduction(+:sum)
for (i = 0; i < N; i++) {
top = 4.0L / (1.0L + (step * i) * (step * i));
bottom = 4.0L / (1.0L + (step * (i + 1)) * (step * (i + 1)));
sum += (top + bottom) * step / 2.0L;
}
}

printf("pi = %.16Lf\n", sum);

return 0;
}


ここで,reduction 句というものが初登場してる.これは,sum をそれぞれのスレッドで保持し,最後に同期するときにそれらを計算するというような指示をしている句だ.それぞれのスレッドで sum へどんどん加算し,最後にすべての sum を加算するというかんじ.reduction 句を無くすと遅くなるのがよくわかるので,試してみてほしい.

time コマンドで測定したら,次のような結果になった.音楽聞きながら(ちなみに,アーティストは capsule♪)実行という状況だったので,あまり信用できる結果ではないけどwww

・実行時間
1CPU:4.6秒
2CPU:2.4秒

・実行環境
機種:MacBook (Late 2006)
OS:Mac OS X
バージョン:10.5.5
プロセッサ:2 GHz Intel Core 2 Duo
メモリ:2 GB 667 MHz DDR2 SDRAM
GCC:4.4.0 20080801 (experimental)

およそ2倍の速度で計算できてるのがわかると思う.OpenMP で速度向上ってのが体感できるとおもうので,ぜひコンパイルして実行してみてね♪Mac Pro で実行してみたいな〜.

参考文献:
C 言語による OpenMP 入門

追記(2008年11月25日):
間違って追記した内容を修正.sum を初期化しなくていいと書いてたんだけど,間違っていた.reduction 句によって内部で準備されるプライベート変数が自動的に,加算なら0に乗算なら1に初期化されるのであって,sum のような変数は初期化されないので,やはり初期化する必要があった.

混乱を避けるため,前回の11月10日の追記は削除しました.コメントでご指摘いただきありがとうございました.

2008年9月28日日曜日

OpenMP 入門 #2

林檎生活100: OpenMP 入門 #1 の続き.OpenMP をやっていこう.今回は,for ディレクティブについてだね.正直,やってみたんだけど速くなってるかどうかわかんなかったwww

for ディレクティブってのは,そのまま for ループを並列化するためのディレクティブ.たとえば,次のような for ループを考えてもらうとわかりやすい.

for (i = 0; i < 100; i++)
c[i] = a[i] + b[i];


このループを,CPU が2つなら,それぞれの CPU に50回ずつやらせれば,2倍のスピードで計算できるよねって考え方だ.安直に分割するとこうなる.

・CPU1
for (i = 0; i < 50; i++)
c[i] = a[i] + b[i];


・CPU2
for (i = 50; i < 100; i++)
c[i] = a[i] + b[i];


これを,OpenMP でやるときに for ディレクティブを使う.for ディレクティブで書いてみるとこんなかんじになるらしい.

#include <omp.h>

#define CHUNKSIZE 100
#define N 1000

int main(void)
{
int chunk;
int i;
float a[N];
float b[N];
float c[N];

chunk = CHUNKSIZE;
for (i = 0; i < N; i++) {
a[i] = (float)i;
b[i] = (float)i;
}

#pragma omp parallel shared(a, b, c, chunk) private(i)
{
#pragma omp for schedule(dynamic, chunk) nowait
for (i = 0; i < N; i++)
c[i] = a[i] + b[i];
}

return 0;
}


これをコンパイルして実行すると,当然画面には何もでない.omp_get_num_threads() で調べてみたら,たしかにスレッド数は2になってた.うーん,速くなってんのかな?w

ディレクティブのオプションについて簡単に.

shared:スレッドの共有変数を指定している.
private:スレッドのプライベート変数を指定している.
schedule:ループをどうやって分割するかについて.引数に dynamic を指定すると,chunk サイズごとに空いているスレッドに動的に割り当てる.
nowait:for ディレクティブによって自動的に同期が取られるところで同期をとらない.

というかんじ.あってるかあやしいwいずれ書き直しになりそうな予感がする.ちゃんと本とか買って勉強した方が良さそうだなぁ.

参考文献:
OpenMP Tutorial

2008年9月25日木曜日

IEEE Computer Society の MSDN AA で追加ライセンス

IEEE Computer Society の MSDN AA からダウンロードした Windows XP Professional SP2 を2台目のコンピュータにも入れたいなと思って,MSDN AA にアクセスしたんだけど,ふたつ目のシリアル番号は取得できなかった.そういう仕様らしい.

MSDN AA の FAQ を見たら,管理者に連絡すれば,必要な分の追加ライセンスは取得できるというような内容が書いてあったので,MSDN AA のとこに書いてあったメールアドレスにメールを送ってみた.(help@〜ってアドレス.)メールの内容は,英語で「2台目のコンピュータにインストールしたいんだけど,どうしたらインストールできんの?」ってかんじw英文はかなり間違ってそうなので,ここには載せられないwww

メールを9月22日の17時くらいに送って,9月25日の1時くらいに届いた.本文(署名は抜いてる.)はこんな感じ.

Hello, 

I've issued you an additional key. You may use this to install on a second computer.

Best regards,


くわえて,MSDN AA の方からもライセンスが発行されたメールが自動的に送られてきた.内容は,新しいシリアル番号が発行されたよ.ログインして確認してみてね.ってかんじ.

当然,そのシリアル番号を使ってアクティベーションを通したら,問題なく使えるようになった.適当な英語でも全然問題なかったので,追加ライセンスがほしい人は,メールで催促しよう.有効活用しないとね♪

2008年9月24日水曜日

Boot Camp で Windows XP SP3

最近,更新してなかったなぁ.帰省とかインターンとかで,更新できなかったんだよね.

今回は,Boot Camp で Windows XP Professional SP2 をインストールして,Service Pack 3 をインストールするところでハマったことについてwもう答えがわかってる人が大半だとは思うけど,Boot Camp を2.1にアップデートしてなかったからだねwww

それに気づかずに,VMware Fusion から起動して SP3 をインストールするとかして,無理矢理解決してしまったよw

2008年9月16日火曜日

Boot Camp でのキーボードマッピング

Boot Camp で MacBook のキーボードから,PC のキーボードにしかないキー入力をするためのキーボードマッピング.「Boot Camp インストールと設定ガイド」の表をベースにしている.

○MacBook キーボード(US 配列)
Shift: shift
Ctrl: ctrl
Alt: option
Windows: command
BackSpace: delete
Delete: fn+delete
Enter: return
Enter(テンキー): enter
Ins: fn+enter
Pause/Break: fn+esc
NumLock: fn+f6
PrintScreen: fn+f11
ScrollLock: fn+f12
alt+「半角/全角」*: option+`(バッククォーテーション)

複合したキー入力はこの表から変換して,そのまま複合させれば OK.

*「半角/全角」と「`(バッククォーテーション)」のスキャンコードは同じなので,「`(バッククォーテーション)」を入力するだけで IME をオン/オフできる.しかし,キーボードが JIS 配列か US 配列かで(Windows では読み込むドライバが司っているらしい.)その動作を変えているようなので,option+`(バッククォーテーション)というキー入力が必要になるみたい.それにしても,alt+「半角/全角」とか時代を感じるねw

2008年9月15日月曜日

VMware Fusion で Age of Empires II Gold Edition

Age of Empires II やりたいなぁって思って,Age of Empires II Gold Edition を買ったんだよね.古いゲームだから,VMware Fusion 上の Windows XP でもサクサク動くでしょ〜って思ったんだよ.だけど,やってみたら重いwプレイできなくはないけどね.調べても VMware Fusion 上で Age of Empires II Gold Edition をやってみたってのを発見できなかったので,とりあえず書いておこう.

○実行環境
MacBook (Late 2006)
OS: Mac OS X 10.5.4
CPU: 2 GHz Intel Core 2 Duo
RAM: 2 GB 667 MHz DDR2 SDRAM

VMware Fusion
Version: 1.1.3
OS: Windows XP Professional
RAM: 512 MB
テーマ: Windows クラシック
視覚効果: パフォーマンスを優先する
その他: Microsoft Update でインストールできるものはすべてインストール.Windows Live OneCare 体験版をインストール.

○不具合
・ゲーム中のマウスポインタがおかしい
・動作が重い

あと,不具合ではないけど,マウスポインタが画面外に行くので,画面のスクロールが非常にやりにくいんだよなぁ.MacBook 側の解像度を合わせれば解決できそうだけどさ.

さてと,BootCamp でやるかぁ.

追記(2008年9月24日):
VMware Fusion 2.0 で実行すると普通の速度になってた.改善され模様.ただ,1024x768でプレイしようとするとうまくいかなかったので,結局 Boot Camp 上の Windows XP でやってる.Windows Vista でも試してみたけど,256色のパレットカラーがおかしくなるのか,ところどころ赤くなったりして,見た目がよくなかった.(Vista と MacBook の組み合わせでなったので,Vista だとおかしくなるのかどうかはわからない.)プレイするなら Boot Camp + Windows XP だね.

2008年8月12日火曜日

Mac OS X で OpenGL プログラミング GLUT 編

レポートからの現実逃避を兼ねて,OpenGL を Mac OS X で使う方法について書いていこう♪といっても,Mac OS X には,最初から Open GL 関係のライブラリが入ってるので,何もインストールする必要はないんだよね.OpenGL でプログラムを組むときによく使われる GLUT も最初から入ってるし.ということで,GLUT 編と題して,Mac OS X での GLUT の使い方を説明する.

さて,さっそくサンプルとなるソースを書いてみる.ウィンドウを出すだけの簡単なソース.

#include <GLUT/glut.h>

void display(void);

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutCreateWindow("Hello, world!");
glutDisplayFunc(display);
glutMainLoop();

return 0;
}

void display(void)
{
}


初期化,ウィンドウ生成,描画関数設定,イベントループってな処理手順だね.シンプルな GLUT を使ったプログラム.ただ注意してほしいのは,Mac OS X では,#include <GL/glut.h> ではなく #include <GLUT/glut.h> になっているとこ.逆に言えば,そこだけ注意すれば OK なんだよね.

で,コンパイル.今回は展開早いなぁ…….

$ cc -framework GLUT window.c


これだけwいやぁ単純.実行するとウィンドウが表示されると思う.(あと,メニューバーにいくつかのメニューが勝手に表示される.これについての詳細が不明なので,調べてわかったら書こうと思ってる.)

んー,簡単すぎるw参考文献にあげた中に,僕はまだちゃんと見てないんだけど,Mac OS X 上での GLUT のサンプルコードがあるから,それを見ればいろいろとわかるかも.(我ながら,適当だなぁ.)

参考文献:
GLUTによる「手抜き」OpenGL入門
The OpenGL Utility Toolkit (GLUT) Programming Interface API Version 3
Apple Developer Connection: GLUTBasics

追記(2008年9月29日):
参考文献のリンクミスを修正.間違って,GLUT のサンプルコードじゃなくて,GLUT ライブラリのコードにリンクしてたw

2008年8月10日日曜日

OpenMP 入門 #1

OpenMP やろうぜ!最近の CPU はマルチコアだから,「見せてもらおうか、Intel のデュアルコア CPU の性能とやらを」的なノリで始めてみた.大学の講義で,OpenMP と MPI を勉強する機会があったのが大きいけどねw

とりあえず,本家からリンクの張られている OpenMP Tutorial を読みつつ勉強してる.まあ,林檎生活的には,ソースコードとか載せつつ,僕が理解したことを書いていこうと思ってるのでよろしく.間違ってたら教えてね.

OpenMP に正式に対応したのは,4.2 あたりからだとのこと.僕の現在の環境 Mac OS X Leopard (10.5.4) では,GCC 4.0.1 と GCC 4.2.1 が入ってるみたいで,一応コンパイル環境は整っているみたい.GCC がインストールされているかどうかは,実際に次のようにコマンドを打ってみるとわかると思う.(ちなみに cc と gcc は,gcc-4.0 へのシンボリックリンクとなっている.)

$ gcc-4.0 --version
i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5484)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc-4.2 --version
i686-apple-darwin9-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5564)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$


対応するようになったのはわりと最近なので,新しいのを使えばいいことあるかなぁってことで,GCC 4.3.1 と GCC 4.4.0 20080801 をインストールしてみた.その比較とかもやっていけたらなぁと思ってる.インストールは,お約束の MacPorts で♪

$ sudo port -c install gcc43
.
.
.
$ sudo port -c install gcc44
.
.
.
$


時間がかなりかかるので注意.無理していれる必要はないと思う.バージョンはこんなかんじ.

$ gcc-mp-4.3 --version
gcc-mp-4.3 (GCC) 4.3.1
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc-mp-4.4 --version
gcc-mp-4.4 (GCC) 4.4.0 20080801 (experimental)
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$


さて,インストールして終わりってのもあれなので,上述のチュートリアルに出てくるプログラムをちょっと改造したものをコンパイルして実行してみよう.ソースはこんなかんじ.

#include <stdio.h>
#include <omp.h>

int main(void)
{
int nthreads;
int tid;

#pragma omp parallel private(tid)
{
tid = omp_get_thread_num();
printf("Hello World from thread = %d\n", tid);

if (tid == 0) {
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
}

return 0;
}


コンパイルはこう.-fopenmp をつけてコンパイルするのがポイント.

$ gcc-4.2 -fopenmp parallel_region.c


次のように実行すると,スレッドごとに自分のスレッド番号を表示し,最後にマスタースレッドだけがスレッド数を表示する.

$ ./a.out
Hello World from thread = 0
Hello World from thread = 1
Number of threads = 2
$


今回はここまで,なんか面白い例題を見つけて,このくらい性能があがりますよってやりたいなぁ.そして,8コアの Mac Pro が欲しくなるという流れになるというかんじでw

2008年8月8日金曜日

Mac OS X で GLib を使おう

最近,C 言語を使う機会がちょこちょこあったんだけど,リストとか自前で実装すんのが面倒で,適当なライブラリを探してたんだよね.それで,Mac OS X で GLib を使ってみようってことになったんだ.

GLib ってのは,The GTK+ Project で開発されているユーティリティライブラリ.UNIX を始め,Windows や OS/2,BeOS でも動くらしい.ライセンスは,LGPL になっている.

じゃ,早速インストール.MacPorts でサクッとね♪

$ sudo port -c install glib2


これで使えるようになった.GLib の動作確認とコンパイルの流れを確認するために,GLib のバージョン番号を表示するプログラムをつくってみた.ソースはこんなかんじ.

#include <stdio.h>
#include <glib.h>

int main(void)
{
printf("%u.%u.%u\n",
glib_major_version, glib_minor_version, glib_micro_version);

return 0;
}


コンパイル方法と実行結果はつぎのようなかんじ.ちゃんとバージョン番号が表示されただろうか.(pkg-config ってコマンドを使うことでコンパイルオプションを表示することができる.それをバッククォートで囲って,実行結果をコンパイルオプションとしてそのまま使ってるわけだ.)

$ cc `pkg-config --cflags --libs glib-2.0` version.c
$ ./a.out
2.16.4
$


詳しい使い方とかは,ドキュメントを見てね.詳しく説明できるほど GLib を理解していなくて,間違ったことを書くとあれなのでw

2008年8月4日月曜日

ML115 で Windows Vista 用 PC を作ろう♪

という妄想をしてみたら,次のような PC ができた.コンセプトは,Windows Vista がサクサク動いて,Devil May Cry 4 をガンガンやれる PC.(あくまで,僕の妄想なので,この構成で動かなかったとか文句言わないように.また,この構成だと動かないことを知っている人は教えてね.)

本体:ML115 ¥11,500(NTT-X Store)
CPU:Athlon 64 X2 5000+ Black Edition ¥8,862(クレバリー)
RAM:JM2GDDR2-8K ¥5,280(Amazon.co.jp)
DVD:AD-7200A-0B ¥3,748(クレバリー)
GPU:Inno3D Geforce 9600 GT OC ¥14,637(クレバリー)
SC:Sound Blaster 5.1 VX ¥1,888(クレバリー)

送料は全部無料になるように構成したので,占めて46,165円也♪僕の妄想によると,Vista のパフォーマンスのサブスコアは,全部5.0以上はいくはず.GPU は確実に5.9だと思うし,CPU も Over Clock で3.0GHzいくだろうから5.9,RAMも5.9いくのかな.HDDは謎だけど,5.0以上は行くんじゃない?

これはコストパフォーマンス高すぎだろ〜.ML115 安すぎなだけなんだけどさ.まあ,妄想が現実になると懐が非常に痛いのでやめておくけどねw

2008年8月2日土曜日

DNS の仕組み

DNS (Domain Name System) の仕組みを説明する.FreeBSD でサーバ構築するために知っておかないとならない知識なので.ちょっと自信がないけどw

DNS とは,DNS サーバ(ネームサーバ)と DNS クライアント(リゾルバ*)で構成される,ホストネームと IP アドレスを結びつけるための仕組みである.DNS は,www.example.com というホストネーム⁑をリゾルバがネームサーバに問い合わせ,192.0.2.1 という IP アドレスを取得するというように動作する.

このように,DNS の目的は非常に単純なのだ.テキストファイルに,ホストネームと対応する IP アドレスを書いておき,リゾルバからの DNS クエリ(問い合わせ)に応じて,そのテキストファイルを参照して IP アドレスを応答するだけでも目的は達成される.実際に,リゾルバはローカルに存在する hosts というテキストファイルを参照し,そこに問い合わせたいホストネームと IP アドレスの対応が書いてあれば,DNS サーバに問い合わずに,IP アドレスを取得する.

しかし,現実はそう単純ではない.ホストネームというのは星の数ほどあり,それに対応する IP アドレスすべてをテキストファイルに保持しておくのは現実的ではない.どこかで,変更があったら,すべての DNS サーバがその情報を同期することになってしまう.

したがって,DNS は分散してホストネームと IP アドレスの対応を保持するような仕組みになっているのだ.だから,DNS は複雑とか難しいとか言われている気もする…….

実際の DNS は,ドメインネームごとに特定の DNS サーバが,ホストネームと IP アドレスの対応を持つようになっている.たとえば,example.com というドメイン(領域)は,example.com のネームサーバが example.com を含むホストネーム(foo.example.com や bar.example.com など.)と IP アドレスの対応を保持するという具合だ.

なので,www.example.com の IP アドレスを知りたい!ってなったら,example.com のネームサーバに問い合わせればいい.しかし,example.com のネームサーバをどうやって知るのだろうか?これについては,次の図のような仕組みになっているのだ.ネームサーバとリゾルバの関係も一緒に理解しよう.



リゾルバは,自分のコンピュータで動いてるプログラムで,左側のネームサーバは,インターネットにつなぐときに設定したやつだ.普通は,プロバイダのネームサーバになっている.“” で表したのは,ルートだ.すべてのネームサーバは,ルートネームサーバを知っているので,まったくわからないホストネームについては,ルートネームサーバ⁂に問い合わせることになる.また,ドメインを遡って問い合わせることを再帰問い合わせという.

DNS の仕組みってこんなかんじ.ほかにも,負荷分散やセキュリティなどのための仕組みが DNS サーバに備わっているがそれについては,参考文献にあげた本を読んでねw

マスターとスレーブなどについては,BIND を使った DNS サーバの設定を説明するときに一緒にする予定♪

* ブラウザやメーラなどは,裏でこのプログラムを利用している.
⁑ 一般に,www.example.com を FQDN (Fully Qualified Domain Name) といい,www をローカルホストネームといい,example.com をドメインネームという.また,www.example.com と www のどちらもホストネームである.
⁂ 世界に13台ある.むしろ,13台しかない.そのうち1台は,日本にある.サーバの CPU は Athlon XP 1900+ だったりする.

参考文献:
Paul Albitz, Cricket Liu. 第4版 DNS & BIND, オライリー・ジャパン, 2002.

2008年8月1日金曜日

Scala 勉強会に行ってきた

札幌で開かれた Scala 勉強会に行ってきた.

Scala っていうのは,関数型かつオブジェクト指向なプログラミング言語.Java VM の上で動作する.Java のクラスを利用できたりして便利がよく,関数型の利点も使えるというもの.関数型からオブジェクト指向へアプローチすると,関数型の世界でオブジェクト指向できますよっていうかんじになるが,Scala の場合オブジェクト指向と関数型が融合しているかんじ.(僕の勝手な解釈だから怪しいな.)

詳しい話とかは,僕が解説できないので参考文献にあげたサイト(勉強会でプレゼンした方が記事を書いてるw)とか本家とかみてほしい.まあ,機会があったらこの Blog でもちょろっとやってみようかと思う.

Lift っていう Ruby on Rails みたいなフレームワークのモデルが斬新で気になったなぁ.

参考文献:
ITpro: 刺激を求める技術者に捧げるScala講座

2008年7月30日水曜日

BIND 9.4 の問い合わせの制限について

BIND 9.4.2 をいじってて,気になったことについてのメモ.

その気になったことというのは,allow-query サブステートメントなどを設定していない状態にもかかわらず,localnets; localhost; からの問い合わせにしか応答しないということについてだ.allow-query サブステートメントを設定していなければ,デフォルト値は any; になるので,どこからの問い合わせでも応答するはずなのだ.

うだうだと調べていたら,BIND 9.4 から allow-query-cache サブステートメントというものが追加され,それに伴って allow-recursion のデフォルト値が変更されたからということがわかった.いままでは,allow-recursion のデフォルト値は any; であったが,9.4 からはデフォルト値が複雑になったのだ.表にまとめてみたので,参考にしてほしい.(表のハイフンは設定なし.A,B は設定値としている.)



まあ,デフォルトの状態でもセキュアになったと考えると,いいかなぁってかんじになる.BIND の設定について理解してないことがいろいろあるので,これからも勉強しないとね.

参考文献:
Linux Square: BIND(Windows版)の"allow-query"の挙動について
BIND 9.4 Administrator Reference Manual

2008年7月21日月曜日

プログラミング Gauche

「プログラミングGauche」を買ったよ♪

そして,29ページでつまずいたよorz

郷に入っては郷に従えってことで,慣れない Emacs でプログラミングしてるんだけど,M-C-SPC が動作しない.Spotlight 切ったりしたけど,動かない.C-SPC は動くんだけどなぁ.なんでだろう.ちなみに,Mac OS X の Terminal で,標準でついてくる GNU Emacs 22.1.1 を使用してる.

.emacs ファイルはこんなかんじ.本のやつをそのまま使ってるだけで,意味は理解してない.

(modify-coding-system-alist 'process "gosh" '(utf-8 . utf-8))

(setq scheme-program-name "gosh -i")
(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)

(defun scheme-other-window ()
"Run scheme on other window"
(interactive)
(switch-to-buffer-other-window
(get-buffer-create "*scheme*"))
(run-scheme scheme-program-name))

(define-key global-map
"\C-cs" 'scheme-other-window)


わからんなぁ…….

参考文献:
Kahuaプロジェクト. プログラミングGauche, オライリー・ジャパン, 2008.

2008年7月20日日曜日

FreeBSD でサーバ構築 #5

林檎生活100: FreeBSD でサーバ構築 #4の続き.今回は,ネットワークの設定と時計を自動的にあわせるために,NTP の設定をやっていこう.

今回想定しているネットワークは,次のようなかんじ.うちのネットワーク構成は,林檎生活100: FreeBSD でサーバ構築 #1あたりに書いてあるので,参考にしてほしい.

ホストネーム:lucifer.legna.org
デフォルトゲートウェイ:192.168.1.1
IP アドレス:192.168.1.254
サブネットマスク:255.255.255.0
DNS:192.168.1.1(ルータ.DNS リレーでプロバイダの DNS へ中継してもらう.)

さて,実際の設定に入る前に,FreeBSD でよく使う設定ファイルの説明をしよう.

なんで設定ファイルが出てくるかとというと,前回の設定は,コマンドを1回実行すると変更しない限り,恒久的に効果を発揮するんだけど,今回の設定はそうじゃないからなんだ.たとえば,ネットワークの設定をコマンドで設定しても,再起動したら消えてしまうんだよね.だから,設定ファイルが必要なんだよね.

FreeBSD の設定ファイルというのは,rc.conf というファイルだ.フルパスは /etc/rc.conf になる.また,デフォルトの設定ファイルが,/etc/defaults/rc.conf にある.これを参考に,/etc/rc.conf を設定することになるが,絶対にデフォルトの設定ファイルを変更してはいけない.さらに,/etc/rc.d/ 以下には,たくさんの起動スクリプトが入っている.次のコマンドを打つとよくわかると思う.実際に,その起動スクリプトをひとつひとつ覚える必要はないし,僕も覚えていない.

$ ls /etc/rc.d/


ここで整理しよう.覚えてほしいことは次のことだ.

/etc/rc.conf - 設定ファイル
/etc/defaults/rc.conf - デフォルト設定ファイル
/etc/rc.d/ - 起動スクリプトディレクトリ(たくさんの起動スクリプトが入っている.)


まあ,たいしたことではないと思うので,大丈夫だと思う.気になることがあったら,コメントに書いてもらえれば,僕が答えられる範囲は答えるので.また,FreeBSD 用の日本語マニュアルを作るプロジェクト日本語マニュアル検索を活用しよう♪ rc.conf についてのマニュアルもあるので,ためしに検索してみるといいと思う.もちろん,英語が大丈夫であれば,次のように FreeBSD のマニュアルを直接引いてもらってかまわない.

$ man rc.conf


じゃあ,早速設定ファイルをいじりたいんだけど,もうひとつ説明しておかなければならないことがある.FreeBSD には,だいたい2つくらいのエディタしかないことだ.(ed,cat,リダイレクトなどは除外するってことでw)それは,vi (nvi) と ee だ.前者は知っている人もいるかもしれないが,おそらく後者は FreeBSD だけに存在するエディタなので,知ってたらもう僕の Blog 読む必要ないじゃんってことになってしまうw

vi 使いの僕としては,vi をオススメしたいところだけど,とまどうこと間違いなしなので,ここでは解説しないw参考文献にあげた「入門vi」を読んでみてほしい.入門の解説は,ググってもでてくると思うしw

ということで,ee を使ってみてね.Mac のテキストエディットや Windows のメモ帳が使いこなせれば使えると思うので♪起動するコマンドはこんな感じ.

$ ee ファイル名


/etc/rc.conf を編集するならこう.

$ ee /etc/rc.conf


んーあとは,テキストエディットとかメモ帳とほぼ同じ.終了とか保存は,esc か ctrl+[ で出てくるメニューで選択するかんじ.メニューが出ていない状態から,esc->a->b の順で入力すれば,保存しないで終了できる.esc->a->a の順で入力すれば,保存して終了できる.メニューとかの意味については,日本語マニュアル検索か man コマンドを使おう♪(丸投げw)

ふう,とりあえず,事前準備完了ってとこかなぁ.では,ネットワーク設定と FreeBSD のアップデート, NTP の設定をやろう.

1. ネットワーク設定
1.1. /etc/rc.conf につぎの内容を追記する.おそらく,インストール時に設定したキー配列の情報が自動的に記述されていると思う.US 配列なら keymap="us.iso" となっているし,JIS 配列なら keymap="jp.106" となっているはずだ.また,# から始まる行はコメントなので気にしなくていいし,必要であれば自分でコメントを記述しよう.

hostname="lucifer.legna.org"
ifconfig_em0="inet 192.168.1.254"
defaultrouter="192.168.1.1"


1.2. 再起動する.同じ内容をコマンドで設定してもいいんだけど,設定が正しいことを確認するため再起動しよう.もちろん,再起動が重大な影響を及ぼす環境では,コマンドで設定するんだけどね.

1.3. ping コマンドでネットワークがつながっていることを確認する.c オブションはパケットを送信する回数.指定しないと ctrl+c を入力するまで,ずーっと送り続けることになるので注意.

$ ping -c 1 192.168.1.1(ルータへの ping が通るか.)
.
.
.
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 2.869/2.869/2.869/0.000 ms(時間は環境によって変わるから無視して OK.)
$ ping -c 1 66.249.89.104(www.google.com の IP アドレスへの ping が通るか.)
.
.
.
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 18.071/18.071/18.071/0.000 ms(時間は環境によって変わるから無視して OK.)
$


1.4. DNS を設定する.ここで,/etc/resolv.conf という設定ファイルがでてくる.名前解決のための設定を記述するファイルだ.初期状態では生成されていないので注意.エディタで設定ファイルを記述し, /etc/resolv.conf というファイルを保存すれば OK.記述内容は次のようにする.

nameserver 192.168.1.1


1.5. ping コマンドで名前が解決できていることを確認する.

$ ping -c 1 www.google.com(www.google.com への ping が通るか.)
.
.
.
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 21.473/21.473/21.473/0.000 ms(時間は環境によって変わるから無視して OK.)
$


2. FreeBSD をアップデートする.
2.1. アップデートに必要なファイルをとってくる.
# freebsd-update fetch


2.2. インストールする.
# freebsd-update install


2.3. 再起動する.

3. NTP 設定
3.1. /etc/rc.conf につぎの内容を追記する.

ntpdate_enable="YES"(起動時に時計をあわせる.)
ntpd_enable="YES"(NTP サーバを起動し,定期的に時計をあわせる.)


3.2. ntpd の設定ファイル./etc/ntp.conf に NTP サーバをつぎのように記述する.ここでは,負荷分散のために Ring Server Project の NTP サーバを指定している.

server ntp0.ring.gr.jp
server ntp1.ring.gr.jp
server ntp2.ring.gr.jp


3.3. 再起動する.
3.4. NTP サーバを参照しているかチェックする.実際は,サーバ名と IP アドレスが違っているはずだけど,こんな雰囲気になっていれば OK.

$ ntpq -p
.
.
.
ring.aist.go.jp 202.234.64.222 ...
ring.atr.jp 133.186.254.117 ...
ring.sakura.ad. 113.170.74.161 ...
$


以上で設定完了♪次回は,DNS サーバの立ち上げかなぁ.

追記(2008年7月27日):
コマンドラインからサーバを起動/再起動/停止/ステータスを確認する方法.

・起動
# /etc/rc.d/ntpd start

・再起動
# /etc/rc.d/ntpd restart

・停止
# /etc/rc.d/ntpd stop

・ステータスを確認
# /etc/rc.d/ntpd status

追記(2008年12月27日):
FreeBSD のアップデートについて追記.

参考文献:
FreeBSD 用の日本語マニュアルを作るプロジェクト
Michael Urban, Brian Tiemann.標準FreeBSD リファレンス, インプレス, 2002.
Linda Lamb, Arnold Robbins. 入門vi, オライリー・ジャパン, 2002.

2008年7月18日金曜日

DELL E が気になるなぁ

DELL が EeePC などの UMPC に対抗するってんで出すという,DELL E.なんといっても,$299という値段に惹かれる.また,EeePC よりは断然デザインがいいと思うってのもある.



$299の DELL E Classic のスペックはこんなかんじみたい.ほかにも,DELL E Video とか DELL E Video+ ってのがあるとのこと.(12.1'の DELL E Slim もあるらしい.)

DELL E Classic

LCD: 8.9' 1024x600
CPU: Atom (Diamondville) 1.6GHz
SSD: 4GB
RAM: 512MB SD-RAM
重量: 1kg以下
駆動時間: 〜5時間
インターフェース: SDカードスロット,USB 2.0 x 3,マイク,音声出力、VGA出力,802.11b/g Wi-Fi



こいつに,FreeBSD いれてサーバ&ルータ化したいなぁ.4GBはちょっときついけど,まあ大丈夫かな.

最近,UMPC のバリエーションも増えてきたし,買うときは用途を明確にしたほうがいいね.DELL E の場合(Slim を除く.),完全にモバイル用途かおもちゃと考えた方がいいよね.おそらく,Windows XP を入れてネットサーフィン,メールチェック,プレゼンテーションに使うなら,Classic で十分だと思う.Skype とかも使うなら,Video だろうし.ワイアレスヘッドセットとかも使うなら,Video+ だろうね.

参考文献:
Engadget: Dell E and E Slim revealed, taking on Eee and Air in one fell swoop
Engadget Japanese: デルのミニノートは8.9インチ/12.1インチのDell E、299ドルから

2008年7月15日火曜日

iPhone 3G を購入♪

キャンセルが出て買えた♪この Blog でうだうだ書くことがないほど,iPhone ネタはほかの Blog でやられてるので,報告まで.なんか,出てないような情報を発見したら,随時書いていこうと思う.

あと,App Store で買えるスーパーモンキーボールは,名作なのでぜひやってみてほしい.

2008年7月8日火曜日

FreeBSD でサーバ構築 #4

林檎生活100: FreeBSD でサーバ構築 #3の続き.初期設定についてやるんだけど,初期設定でやることは結構いっぱいあるので,今回は,root のパスワードの設定,タイムゾーンの設定,ユーザの作成を行う.

1. ログインする.
FreeBSD/i386 (Amnesiac) (ttyv0)

login: root

(ログインメッセージ)

#


2. root のパスワードを設定する.パスワードなしってのが危険すぎるから,最初にやろう.
# passwd
Changing local password for root
New Password: (root のパスワードを入力する.入力しても何も表示されないことに注意.)
Retype New Password: (もう一度 root のパスワードを入力する.)
#


3. タイムゾーンを設定する.コンピュータは日本時間に設定されていると思うので,そのことを OS に教える.
3.1. tzsetup を実行する.
# tzsetup


3.2. コンピュータの時間は UTC に設定されていないので No を選択する.


3.3. Asia を選択する.


3.4. Japan を選択する.


3.5. JST でいいので,Yes を選択する.


3.6. date を実行し,設定が反映されたか確認する.JST という表記があれば OK.
# date
Wed Jul 9 04:09:10 JST 2008(現実の時間とあっていないのは,VMware Fusion の仕様.解決策はいずれ説明する.)
#


4. 作業用の一般ユーザを追加する.ここでは,takuya というユーザを追加する.
4.1. adduser を実行する.対話的にユーザを作成する.
# adduser
Username: takuya
Full name: TSUCHIDA Takuya
Uid (Leave empty for default): [return](UID は自動設定でいいので,何も入力しない.)
Login group [takuya]: [return](ブラケットの中のがデフォルトとして入力されるので,[return] を入力するだけで OK.)
Login group is takuya. Invite takuya into other groups? []: wheel(root になれる権限を与えるために,wheel グループにも加入する.)
Login class [default]: [return]
Shell (sh csh tcsh nologin) [sh]: tcsh(BSD なら tcsh と相場が決まってるw)
Home directory [/home/takuya]: [return]
Use password-based authentication? [yes]: [return]
Use an empty password? (yes/no) [no]: [return]
Use a random password? (yes/no) [no]: [return]
Enter password: (パスワードを入力する.)
Enter password again: (もう1度パスワードを入力する.)
Lock out the account after creation? [no]: [return]
Username : takuya
Password : *****
Full Name : TSUCHIDA Takuya
Uid : 1001
Class :
Groups : takuya wheel
Home : /home/takuya
Shell : /bin/tcsh
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (takuya) to the user database.
Add another user? (yes/no): no
Goodbye!
#


4.2. ユーザがきちんと追加されたか確認する.
# logout

FreeBSD/i386 (Amnesiac) (ttyv0)

login: takuya
Password:(takuya のパスワードを入力する.)

(ログインメッセージ)

> (# のときは root.> のとき(tcsh の場合.)は一般ユーザになる.)
> su(su は root になるためのコマンド.)
Password:(root のパスワードを入力する.)
# (ルートユーザになった♪)


というかんじ.基本的に,一般ユーザで作業できるところは作業して,root 権限が必要になったときだけ root になるべきなんだよね.

今回はここまで.説明するのは大変だなぁ.次回はネットワークの設定とかやってくよ〜.

2008年7月4日金曜日

Web Creators Vol. 80

pp. 21 転職支援金100万円争奪! インターネットウルトラクイズ100Quiz
100問正解したよ.結構大変だった.ハイスコアランキングに「タクヤ」で載ってる♪

pp. 66 サイトマップ (sitemap.xml) を作成する
Google とかで検索すると,検索結果にサイトマップがついてるのがある.あれってこうやってつくるのか.知らなかったなぁ…….
pp. 98-101. Web Design Style-UP Tips
Tips 4: リンク切れをいち早く発見したい
404 エラーページを PHP にすることで通知する仕組み.
Tips 5: 異なるバージョンの Internet Explorer で表示を確認したい
IETester
決定版になりそうな予感.
Tips 7: センスのよいボタンを簡単につくりたい
方法はいいけど,マークアップ的に好きじゃない.

2008年6月23日月曜日

学生は Adobe Flex Builder 3 を無償で使える♪

タイトルどおりで,学生は Adobe Flex Builder 3 を無償で使えるらしいってことで,実際にやってみた.

1. 登録サイトにアクセスして,名前や大学名を入力し,学生証や在学証明書をスキャンした画像を GIF 形式か PDF 形式でアップロードする.

http://www.flexregistration.com/

2. 学生と認められれば,数日中に Adobe Flex application accepted というタイトルのメールでシリアルナンバーが送付されてくる.

3. Adobe Flex Builder 3 の体験版をダウンロードしてインストールする.(日本語版で OK.)

4. Adobe Flex Builder 3 のメニューのヘルプ>Flex ライセンスの管理…をクリックし,シリアルナンバーを入力する.

というかんじ.学生の人はぜひやってみて.Flex での開発ってなかなかいいよ.Flash の開発インタフェースがあんまり好きになれなくて,Flash を避けてたんだけど,Flex だとプログラミングって感覚で開発できるからいい♪結構楽しいよ.いや〜,JavaScript でインタラクティブなフォームとかつくるより超楽だ〜.

コメント:
最初,北大の学生証をスキャンして PDF で送ったら拒否されたw日本語でも大丈夫って情報がほかの Blog に載ってたんだけどなぁ.だから,国際学生証をスキャンして GIF で送ってやった.そしたら OK だった.

2008年6月22日日曜日

FreeBSD でサーバ構築 #3

林檎生活100: FreeBSD でサーバ構築 #2の続き.FreeBSD のインストールをやってく.

1. VM を起動すると,黒い画面にいろいろと出力される.画面が青くなるまで待とう.



2. 国として Japan を選択する.


3. キーマップを USA ISO (僕の場合は,US 配列なので.) とする.適宜自分のキーボードにあわせよう.


4. ここまでくると,インストールメニューが表示されるので,Custom を選択する.Standard より Custom のほうが便利がいいので,これでインストールするのが普通なんだよね.


5. FreeBSD をインストールするためのスライス(物理パーティションにあたる.)を切るので,Partition を選択する.


6. A キーを入力し,全領域を FreeBSD 用のスライスにする.


7. Q キーを入力し,エディタを終了する.


8. ブートマネージャとして Standard を選択する.インストールする OS が FreeBSD だけだからね.


9. FreeBSD のパーティション(論理パーティションにあたる.)を切るので,Label を選択する.


10. C キーを入力して,新しいパーティションを作成する.最初はルートパーティション(/ で示される.)を作成する.


11. パーティションサイズを決定する.「512M」を入力し,ルートパーティションに512MBを割り当てることにする.


12. 作成するのは,ファイルシステム(一般的なファイルを保存できるパーティションのタイプだね.)なので,FS を選択する.


13. マウントポイントをルートにするので,「/」を入力する.


14. これでルートパーティションが作成される.また,C キーを入力し,今度はスワップパーティションを作成する.スワップパーティションというのは,仮想記憶につかわれるパーティションのこと.物理メモリの2倍作成するのが定石になっている.


15. 物理メモリが256MBなので,2倍の512MBを確保するために「512M」を入力する.


16. スワップパーティションなので,Swap を選択する.


17. スワップパーティションが作成される.


18. さらにファイルシステムを作成する.つぎのようになるように作成してほしい./var は変化するファイルを置くパーティション./tmp は一時ファイルを置くパーティション./usr は後からインストールするプログラムやマニュアルなどを置くパーティション./usr/home はユーザのファイルを置くパーティションになる.すべて作成したら,Q キーを入力して終了させる.


19. つぎに,どんなプログラムをインストールするかを選択するので,Distributions を選択する.


20. Developer を選択する.サーバ運用を考えるとこれが無難だね.


21. Ports コレクションをインストールするので,Yes を選択する.Ports コレクションについてはいずれ解説する.


22. Exit で終了する.


23. インストールメディアを選択するために,Media を選択する.


24. CD からインストールするので,CD/DVD を選択する.


25. Commit を選択し,インストールを実行する.


26. 確認のアラートに Yes と答え,インストールが実行される.



27. 設定はあとでからやるので,No を選択する.


28. 次のような手順で,インストーラーを終了させる.



29. 再起動するというアラートに Yes と答える.


いやぁ.長かったなぁ.インストール完了♪初期設定は次回っ!