brainf*ck講座第三回 - ポインタのインクリメント -

連日更新のbrainf*ck講座第三回。
for文(while文など)に行く前に、ポインタのインクリメントについて。
ポインタの詳しいお話は他に譲るとして、
ポインタとはかなり簡単に言うと、メモリ上の場所(番地)を指すものです。
例えば、

NULLNULLNULLNULLNULLNULLNULLNULL
01234567

このように8個の箱があるとしましょう。
この箱はメモリ上にある領域と思って下さい。
すべての箱の中身はNULLです。
前回の話しで言うと「0」という値が入っています。
この、0〜7までの数字がポインタだと思っていいです。
brainf*ckでは、ポインタの初期値は0です。
赤い部分が現在のポインタの位置です。
ですので、前回の「+」の羅列はすべて0番の箱に対して操作をしていました。
この状態から「+」を3つ書くと


+++
箱は
このようになります。
3NULLNULLNULLNULLNULLNULLNULL
01234567
ここで、ポインタをインクリメントすると、
今まで0番の箱を指すていたものが、1番の箱を指すようになります。
ポインタのインクリメントは「>」です。

+++>
3NULLNULLNULLNULLNULLNULLNULL
01234567
このようにポインタの位置が一つ右に移動します。
ポインタのデクリメント「<」を入れると、1減るので、下記のようになります。

+++><
3NULLNULLNULLNULLNULLNULLNULL
01234567
もう一度ポインタをインクリメントし、さらにそのポインタの指す値を2回インクリメントしましょう。


+++><>++
32NULLNULLNULLNULLNULLNULL
01234567
0番目の箱の値が3になったまま、1番目の箱の値が2になりました。
このようにポインタをインクリメントしながら値を操作する事で、
複数の値をメモリ上に保持する事ができます。
一般的なプログラミング言語で言うところの、変数の役割ですね。
今回のコードをC言語で書くと

#include

int main() {
int mem[8];

mem[0] = 3;
mem[1] = 2;

return 0;
}

というところでしょうか。
C言語でもポインタを使って書けばいいという話ですが、
ポインタを使うほどでもないということです。

brainf*ck講座第二回 - 基本 -

好評(?)だったbrainf*ck講座第一回 - 導入 - に続きまして第二回。
ここでは基本について簡単に解説します。

詰まる所brainf*ckはポインタの操作だけでいろいろやってしまおうという言語です。
この言語を理解する事は、ポインタを理解する事に限りなく等しいと言えます。

ポインタの説明は他に譲るとして、brainf*ckの基本の基本。
「+」と「-」について。
「+」はポインタが指す値をインクリメントする。
これはどういう事かと言いますと、
今、ポインタは「0番の箱」を指しているとします。
その「0番の箱」には初期値として「0」が入っています。
「1番の箱」があったとしても初期値は「0」です。
brainf*ckのプログラムで、


+
とすると、「0番の箱」に入っている「0」という値をインクリメントするので、
「0番の箱」は「1」という値になります。
ここで、1というのは何を表すかと言いますと、
ASCIIコード表を見て頂いて、10進コードの「1」を確認して下さい。
「SOH」となっています。「SOH」とはヘッダ開始を表すコードです。

  1. +

とすると、二回インクリメントされるので、「0番の箱」は「2」という値になります。
2はASCIIコード表によると「STX」テキスト開始を表します。

では、「A」にするにはどうすれば良いでしょうか?
さきほどの表で確認すると、「A」は10進コードで「65」になります。
という事は、素直にbrainf*ckで書くと


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
と、「+」が65個になります。
これで、「0番の箱」は「A」という値になりました。
これをどうやって確認するかと言いますと、
「.」を書くと、ポインタの指す値を出力するとありますので、
このように書けば良いのです。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
こうすると、「A」と出力されます。

ここで、このコードを実行してみたいと思うでしょう。
世の中には便利なページがたくさんあります。
当然、brainf*ckを実行できるページもあります。
Javascript Brainfuck Interpreter / Debugger
このツールの使い方の説明は置いときまして、
Program:と書いてあるフォームに、上記brainf*ckのプログラムを書いて、
右にある「Run」というボタンを押すと、
下にあるOutput:という場所に結果が出力されます。
さて、「A」が表示されましたでしょうか?

次は「-」の説明ですが、
これは「+」が理解できれば簡単です。
「+」がポインタが指す値をインクリメントする事に対して
「-」はポインタが指す値をデクリメントします。
「+」を66個書いて「-」を1個書けば、
それは「+」を65個書いた事と同じになり、
「A」になります。


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-.
いかがでしょうか?「A」が出力されたでしょうか?

今回はごくごく基本(というか力技)でbrainf*ckのコードを書いてみました。
C言語で、1〜10までの合計値を求めるプログラムを書きなさいという問に対し、


#include

int main() {
int total=0;

total = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
printf("%d",total);
return 0;
}

と書いているような感じです。
実際に上のような問があった場合、回答はいろいろあると思いますが、


#include

int main() {
int total=0;

for (int i = 1; i <= 10; i++) {
total += i;
}
printf("%d",total);
return 0;
}

のように書くのがスマートでしょう。

という事で、次回はfor文のような命令を解説したいと思います。
と思ったけど、先にポインタのインクリメントを説明しないと。。

brainf*ck講座第一回 - 導入 -

brainf*ckというプログラミング言語をご存知でしょうか?
プログラマなら一度は話に聞いた事があるのではないでしょうか。

席指揮にはbrainfuckという名前ですが、名前的に問題があるという事で、
brainf*ckと表記します。読み方は「ブレインファック」。

brainf*ckはどのようなプログラミング言語かと言いますと、
下記に示す8つの命令のみで構成された言語です。
俗に言う難読言語というものです。

  1. >・・・ポインタをインクリメントする
  2. <・・・ポインタをデクリメントする
  3. +・・・ポインタが指す値をインクリメントする
  4. -・・・ポインタが指す値をデクリメントする
  5. .・・・ポインタが指す値を出力する
  6. ,・・・1バイトを入力してポインタが指す値に代入する
  7. [・・・ポインタが指す値が0なら対応する]の直後までジャンプする
  8. ]・・・ポインタが指す値が0でないなら、対応する[にジャンプする

ちなみに筆者が認定した三大難解言語は、
brainf*ck、whitespace、Befungeです。
機会があれば他の言語も解説します。

で、実際にbranf*ckでHello,worldを出力するプログラムは下記になります。


+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.

パッと見たところは何が何やらわかりません。
しかし、これもしっかりと読めば理解ができるのです。

というわけで次回以降からbrainf*ckの解説をしていきたいと思います。

eAcceleratorのインストール

ずいぶん前にeAcceleratorのインストールを行ないました。
その時のメモ。
eAccelerator0.9.6をインストールしました。
その時の最新版に適宜読み替えて下さい。
phpのパスなども環境により異なると思いますので、
適宜自分の環境に合わせて下さい。


# wget http://downloads.sourceforge.net/project/eaccelerator/eaccelerator/eAccelerator%200.9.6/eaccelerator-0.9.6.tar.bz2
# bzip2 –dc eaccelerator-0.9.6.tar.bz2 | tar xvf –
# cd eaccelerator-0.9.6
# /usr/local/php5/bin/phpize
# ./configure –enable-eaccelerator=shared –with-php-config=/usr/local/php5/bin/php-config
# make
# make install

以下はphp.iniの設定


extension=eaccelerator.so
eaccelerator.shm_size="64"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

サーバ構築まとめ

さて、前々回、前回とサーバ構築のお話を書いてきましたが、
今回はとりあえず最終回。
クライアントPCからsshでログインできるようになるまでをまとめてみました。

・BIOSの設定でbootの順番をCD(DVD)を1番目にしておく(一応)
・CDを入れて起動。CentOSのインストール画面が出ています。
・キーボードタイプの選択で109が無かったのでjp106ってやつを選択(間違えてるかも)
・後はガイドに従ってすすめていくだけ。
・一通りインストールが終わるとCDを取り出して再起動。
・Windowsでいうようこそ画面になるので、rootでログイン
・ここからコマンド画面です


# vi /etc/sysconfig/network-scripts/ifcfg-eth0
編集する
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
HWADDR=00:0A:0B:0C:0D:0E

# /etc/init.d/network restart
ネットワーク再起動

# /etc/init.d/iptables stop
iptables停止(後ほど設定)

# setenfoce permissive
SELINUX停止(後ほど考える)

# /etc/init.d/sshd start
sshd起動

これで大丈夫だと思います。
これからはapacheとかMySQLとかPHPとかの話になっていくと思います。