brainf*ck講座第三回 - ポインタのインクリメント -
連日更新のbrainf*ck講座第三回。
for文(while文など)に行く前に、ポインタのインクリメントについて。
ポインタの詳しいお話は他に譲るとして、
ポインタとはかなり簡単に言うと、メモリ上の場所(番地)を指すものです。
例えば、
| NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
このように8個の箱があるとしましょう。
この箱はメモリ上にある領域と思って下さい。
すべての箱の中身はNULLです。
前回の話しで言うと「0」という値が入っています。
この、0〜7までの数字がポインタだと思っていいです。
brainf*ckでは、ポインタの初期値は0です。
赤い部分が現在のポインタの位置です。
ですので、前回の「+」の羅列はすべて0番の箱に対して操作をしていました。
この状態から「+」を3つ書くと
箱は
+++
このようになります。
| 3 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
今まで0番の箱を指すていたものが、1番の箱を指すようになります。
ポインタのインクリメントは「>」です。
+++>
| 3 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
ポインタのデクリメント「<」を入れると、1減るので、下記のようになります。
+++><
| 3 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+++><>++
| 3 | 2 | NULL | NULL | NULL | NULL | NULL | NULL |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
このようにポインタをインクリメントしながら値を操作する事で、
複数の値をメモリ上に保持する事ができます。
一般的なプログラミング言語で言うところの、変数の役割ですね。
今回のコードをC言語で書くと
というところでしょうか。
#includeint 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」とはヘッダ開始を表すコードです。
とすると、二回インクリメントされるので、「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までの合計値を求めるプログラムを書きなさいという問に対し、
と書いているような感じです。
#includeint main() {
int total=0;total = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
printf("%d",total);
return 0;
}
実際に上のような問があった場合、回答はいろいろあると思いますが、
のように書くのがスマートでしょう。
#includeint 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バイトを入力してポインタが指す値に代入する
- [・・・ポインタが指す値が0なら対応する]の直後までジャンプする
- ]・・・ポインタが指す値が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停止(後ほど考える)