2007/04/30

erlang その1

erlangという関数型言語のプログラミング言語を使ってみる。
getting started を見ながらやってみることにする。
http://www.erlang.org/

起動するにはコマンドラインから
# erl
と入力する。

何か計算をさせてみる。
# 1 + 2.
3
と表示される。最後のピリオドはC++でいう;に相当するようだ。

括弧で優先順位をきめられる。
# (1+2)*5.
15

erlシェルを終了したいときはCtrl+Cを押すと
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
と表示されるので、aを押すと終了する。

今度はファイルにソースを書いて、コンパイルしてから使ってみる。
[tut.erl]ファイルの中身に次のように書く。

-module(tut).
-export([double/1]).
double(X) -> 2*X.

そして、
# c(tut).
{ok,tut}
でコンパイル完了。
使うには、
# tut:double(50).
100
とすると、結果に2倍された値が表示される。
ところで、

-module(tut).
-export([double/1]).
double(x) -> 2*x.

つまり、Xをxに書き換えるとコンパイルが通らない。
チュートリアルの後の方に書いてあるが、
変数の先頭の文字が大文字か小文字かによって意味が変わるようだ。

今度は再帰。ループが使えないのでその代わりに使うようだ。
ためしに、1からXまでの値を足すプログラムを書いてみる。

-module(tut1).
-export([sum/1]).
sum(1)->1;
sum(X)->X+sum(X-1).

重要なのは、3行目のsumの定義の最後を;にすること。
もし.を使うとsumの定義が終了して、4行目で再定義されてしまうことになり、
コンパイルエラーになる。

さて、実行してみると、
# tut1:sum(10).
55
で、あってる。

今度は、このファイルに関数powを追加してみる。

-module(tut1).
-export([sum/1, pow/2]).
sum(1)->1;
sum(X)->X+sum(X-1).
pow(X,1)->X;
pow(X,Y)->X*pow(X,Y-1).

コンパイルして実行してみる。
# tut1:pow(2,8).
256

おそらく意外とC++とかでは面倒なことになりそうな2^1024を計算してみる。
# tut1:pow(2,1024).
17976931348623159077293051907890247336179769789423065727343008115773267580
55009631327084773224075360211201138798713933576587897688144166224928474306
39474124377767893424865485276302219601246094119453082952085005768838150682
34246288147391311054082723716335051068458629823994724593847971630483535632
9624224137216

合ってるのかどうかわからんが、たぶん正しいのだろう。
多倍長整数があるのはこういうときは便利だ。

今度はAtomsとかいうデータ型を使ってみる。
tut2.erlファイルを作って、次のような内容を記録する。
単位系を光年←→パーセクへ変換する関数である。

-module(tut2).
-export([convert/2]).
convert(L, parsec)->L/3.26;
convert(P, lightyear)->P*3.26.

# c(tut2).
{ok,tut2}
# tut2:convert(3, parsec).
0.920245
# tut2:convert(3, lightyear).
9.78000

第2引数の値によって、関数の呼ばれる部分が変わるということのようだ。
で、その第2引数が数字ではなくて、atomだということだろう。

次はTuplesだ。
値をひとまとめにして扱おうということだ。C++でいう構造体に似ているかな。
ここでは数字を単位と一つにまとめて処理してみる。
<tut3.erl>
-module(tut3).
-export([convert_length/1]).
convert_length({L, lightyear})->{L/3.26,parsec};
convert_length({P, parsec})->{P*3.26,lightyear}.

で、実行。
# c(tut3).
{ok,tut3}
# tut3:convert_length({3,parsec}).
{9.78000,lightyear}

計算できてる。無論、tupleの要素の位置を逆にしても同じことができる。
<tut3b.erl>
-module(tut3b).
-export([convert_length/1]).
convert_length({lightyear, L})->{parsec, L/3.26};
convert_length({parsec, P})->{lightyear, P*3.26}.

実行すると、
# c(tut3b).
{ok,tut3b}
# tut3b:convert_length({parsec,3}).
{lightyear,9.78000}
となって、逆にしてもOK。

次はListsだ。listは[]で囲む。
tupleと違って、サイズを変えられる。C++でいうとstd::listかな。
例えば、
# [First | TheRest] = [1,2,3,4,5,6,7].
[1,2,3,4,5,6,7]
# First.
1
# TheRest.
[2,3,4,5,6,7]
な風になる。|はリストの最初の要素と後の要素をわける。
コンマを使うと、要素ごとに分けられる。
# [First, Second | TheRest] = [1,2,3,4,5,6,7].
[1,2,3,4,5,6,7]
# First.
1
# Second.
2
# TheRest.
[3,4,5,6,7]

ちなみ、この2つの例を連続していれると、文句を言われる。
つまり、最初に定義したFirstを次の定義のFirstで上書きしていると。
定義済みの変数の消し方がわからんので、ここではerlを再起動して例を試した。

次に、リストの長さを求める関数を定義する。
<tut4.erl>
-module(tut4).
-export([list_length/1]).
list_length([])->0;
list_length([First|Rest])->1+list_length(Rest).

使ってみる。
# c(tut4).
./tut4.erl:4: Warning: variable 'First' is unused
{ok,tut4}
# tut4:list_length([1,2,3,4,5]).
5
警告がでたが、問題なく動作するようだ。
要素にatomを使ってもOK.
# tut4:list_length([a,b,c,d,e,f]).
6

ついでに文字列はどうなるかみてみる。
# tut4:list_length(["a","b"]).
2
""が何を意味するのか読んでいるチュートリアルの現時点では不明だが、
なにかの値として見てはくれているようだ。

# ["a","b"].
["a","b"]
ただ、リストの内容が表示されるだけ。

# [97,98].
"ab"
なんと、文字コードとして解釈してくれるようだ。
でも["a","b"]のときは気をきかせて"ab"と表示してくれるわけではないようだ。

============================
今回はこの辺で終了。

状態!?

<引用>
「新・闘わないプログラマ No.487」
http://www.amy.hi-ho.ne.jp/~lepton/program/p4/prog487.html
「状態」というのを理解して、それに応じた操作ができない人もいるので、「状態」を出来る限り作らないようなユーザーインターフェースが必要なのでは
</引用>

なるほど。
同じキーにたくさん機能を割り当ててると難しいわけか。
んで、避けようとすると、HDDレコーダのリモコンのように
余計わけ分からん状態になるってことだ。

多機能にすると、ボタンの数を増やすか「状態」を使って
1つのキーにいろんなことをさせんといかんわけで。

んー、要はシンプルに作るべきだってことだ。

Debian 4.0で遊ぶ その1

Debian 4.0 r0をインストールしてみた。
以下、そのログ。あんまり参考にはならないかも。

とりあえず、
http://www.debian.org/CD/netinst/
に書いてある方法で進める。

(1)ダウンロードするのは
debian-40r0-i386-netinst.iso
で、これをCDに焼く。

(2)CDからブートして、画面が表示されたらEnterを押す。
しばらく待つと、インストーラが立ち上がる。
今回使ったCDドライブはUSB接続のもの。

(3)まず言語を選ぶ。

(4)さらにキーボードの種類を選ぶ
すると、CDの検査が始まり、続いて追加コンポーネントのロードが始まる。

(5)ネットワークインターフェイスが複数あるため、
選択画面が出てくる。
Marvell Technology Group Ltd. 88E8053 PCI-E Gigabit Etherne
と表示されているものを選択。
DHCPでネットワークを検索し始める。
が、LANをつないでいない!ので見つからず。
そのまま「続ける」ボタンを押す。

(6)どうするか選択肢がでてくる。
・ネットワークの自動設定を再試行
・DHCPホスト名付きでネットワークの自動設定を再試行
・ネットワークを手動で設定
・今ネットワークを設定しない
3番目を選ぶ。

(7)IPアドレス、サブネットマスク、ゲートウェイ、ネームサーバーアドレスを設定。
若干、待つと、次の設定画面が現れる。

(8)システムのホスト名を入れる画面がでてくるので、
好きな名前をいれる。

(9)ドメイン名を入れる画面がでてくるので、
適当なのを入れる。

(10)ディスクのパーティショニングが画面が出てくる。ここでは
「ディスク全体を使い、暗号化LVMをセットアップする」を選択した。

(11)ディスクのパーティショニングするディスクを選択する。

(12)パーティショニング機構の選択画面になる。
ここでは、「すべてのファイルを1つのパーティションに」を選択

(13)ディスクへの変更をHDDに書き込むかの最終確認画面が出てくる。
「はい」を選択。

(14)HDDへアクセスするためのパスワードを設定する。
たぶん暗号化LVMを選んだためと思われる。

(15)ファイルシステムを書き込む前の確認画面が表示される。
/bootパーティションのみ通常のext3で、
残りはなぜかhda5_cryptに割り当てられている。
なぜにhda5なのかは分からない。
とにかく、「パーティショニングの終了とディスクへの変更の書き込み」を選択

(16)確認画面がでるので「はい」を選択

(17)Rootパスワードを要求される。

(18)ユーザー名の入力する

(19)新しいアカウントのユーザー名を入力する

(20)ユーザーのパスワードを設定する

(21)「ベースシステムをインストールしています」と表示され、
インストールが始まる。

(22)パッケージマネージャの設定で、
ネットワークミラーを使うかどうかを聞かれる。
「はい」を選択

(23)アーカイブミラーを選択

(24)ftp.jp.debian.orgを選択

(25)HTTPプロキシを設定する。とりあえず空でいく。
ミラーを検査していますと表示される。

(26)正しくないアーカイブミラーですと表示され、
画面が赤くなる。
どうやらネットワークに接続できていないようだ。

(27)設定をもどって、DHCPを使うように変更し、リトライ。

(28)debianパッケージ利用調査に参加しますか?
には「いいえ」。どっちでもよいと思うけど。

(30)ソフトウェアの選択では
デスクトップ環境, ウェブサーバ, 標準システムにチェック

(31)ネットワークからいろいろとダウンロードが始まる。項目数は700程度。
待つ
待つ
待つ
・
・
・
・
・
・
・
・
まる1日かかった… 。狭帯域なもので(w

(32)インストールが始まると、途中で使用する画面の解像度が聞かれる。

(33)途中でX関連の設定で失敗した。
ディスプレイの接続が切れていたせいかもしれない。

(34)やり直しを前回と同じ、
 デスクトップ環境, ウェブサーバ, 標準システムにチェック
実行すると、またダウンロードが始まった。
どうやら、前回ダウンロードできてなかった部分を落としているようた。
ファイルを取得しています xx/78 となっていて、78個落とす必要があるようだ。
待つ
・
・
・
こんどは1〜2時間待ち…

(35)ハードディスクへGRUBをインストール

(36)インストールの完了画面が表示される。
ので、CD-ROMをドライブから抜いて、「続ける」ボタンを押す。
すると、再起動が始まる。

ようやくインストール終了。
これからいじっていく予定。

2007/04/28

HDD 500GB

またHDD(HD-HC500U2)を買ってきた。25800円だった。

前回と同じく、箱の背面に緑色の丸いシールが、側面には赤い丸いシール貼ってある。
しかし今回はさらに、箱の上部に赤い丸いシールと四角い朱色(オレンジ色?)のシールが貼ってある。

以前の調査と同様、HDDのプロパティを見ると、
 WDC WD50 00AAKS-00TMA0
と書いてある。
たぶん、これ↓
http://www.wdc.com/jp/products/products.asp?driveid=301&language=en

ちなみに初期のFAT32フォーマットでは容量が499,983,122,432バイト。
NTFSでフォーマットしなおしたところ、500,105,216,000バイトとなり、
ちょっと増えた。

2007/04/25

ボッコロの日

今日はボッコロの日だ。イタリアはヴェネチアの習慣だそうで。

2007/04/24

ニュース

エリツィン大統領が死去とのこと。
いつ大統領をやめたのか忘れたが、時が進んでるのを感じるな。