デーモンがコンソールを汚したら行けないだろうという話な訳で、こいつを黙らせます。
klogdのオプションに”-c 4″を加えます。
# vi /etc/sysconfig/syslog
KLOGD_OPTIONS=”-c 4 -x”
syslogを再起動します。
# service syslog restart
参考サイト
iptablesのログをコンソールに表示させない
コンソール画面に[IPTABLES INPUT]等のログが出てきてウザイ件 « こま切れblogの詰め合せ
デーモンがコンソールを汚したら行けないだろうという話な訳で、こいつを黙らせます。
klogdのオプションに”-c 4″を加えます。
# vi /etc/sysconfig/syslog
KLOGD_OPTIONS=”-c 4 -x”
syslogを再起動します。
# service syslog restart
参考サイト
iptablesのログをコンソールに表示させない
コンソール画面に[IPTABLES INPUT]等のログが出てきてウザイ件 « こま切れblogの詰め合せ
数百人分のディスククオータの設定を一括して書き換えたかったため簡単なスクリプトを書きました。
これぐらいだったらbashで書くべきだったかな^^;
#!/usr/bin/perl
##########################################
# ディスククオータ一括設定変更スクリプト
##########################################
use utf8;
use strict;
use warnings;
# /homeからユーザ一覧を取得するコマンド(egrepで除外するユーザを書いておく)
my $home_list_cmd = 'ls -1 /home | grep -E -v "(exclude_user|source_user|lost\+found|aquota.user)"';
# クオータ設定をコピーするコマンド(設定元になるユーザを書いておく)
my $edquota_cmd = 'edquota -p source_user -u ';
# 実行
foreach my $user (split(/\n/, `$home_list_cmd`)){
my $cmd = $edquota_cmd . $user;
my $rs = `$cmd`;
}
5年以上もLinux系サーバと戯れときながら今更過ぎますが、これからのLinuxユーザの事を考えVIコマンドの簡単な使い方をメモしておきます。はっきり言ってVIの機能を語り尽くせば本が一冊書けるレベルの量です。O’ReillyでもVIの書籍が出ています。VIを熟知したい人は是非書籍を買ってください。
マウスやカーソルキーがキーボードに存在しない時代、UNIX全盛期に作られ非常に長い時間UNIXとともに進化してきたシンプルかつ強力なテキストエディタです。そしてVIを参考に機能を拡張したものがVIMです。基本的にVIMはVIコマンドとして使えるのでVIとして解説します。
・他のエディタと異なり基本的にUNIX系OSに標準で入っている
・UNIXの書籍や解説サイトでは非常に高い割合でVIを用いて設定など解説している
・リモート操作時に接続が不意に切れてもEmacsの様にプロセスが暴走しない
“$や%や#”はシェル上であるという表示です。各自環境に合わせて読んでください。
起動方法
$ vi ファイル名
上記を実行すると”ノーマルモード”で起動します。
※ 全角文字をファイル名に用いるのは文字化けの元です。半角英数を使いましょう。
※ 白文字をファイル名に用いるのは混乱の元です。アンダースコアを使いましょう。
記述方法
ノーマルモードから”i”キーを押す事により”挿入モード”となり文字入力が可能になります。
ノーマルモードに戻りたい場合は”ESC”キーを押します。
保存方法
ノーマルモードより”:w”を入力し”Enter”キーを押します。
終了方法
保存後に終了する場合は”:wq”を入力し”Enter”キーを押します。
保存せず終了する場合は”:q!”を入力し”Enter”キーを押します。
※ ファイルを編集する前には必ず元のファイルをバックアップする癖を付けましょう。
※ ファイルを編集する時は必ず編集したらこまめに保存する癖を付けましょう。
”u”キーを押すと直前の操作を取り消す事ができます。
※ 現代の一般的なエディタとは異なり挿入モードもコマンド単位として戻ります。
ファイルの先頭に移動
削除したい文字にカーソルを合わせ”g”キーを2回押すと先頭に移動する事ができます。
ファイルの最後に移動
削除したい文字にカーソルを合わせ”shift”キーと”g”キーを同時に2回押すと最後に移動する事ができます。
”:set number”を入力し”Enter”キーを押します。
表示を消す場合はノーマルモードより”:set nonumber”を入力し”Enter”キーを押します。
”:カーソルを移動させたい行数”を入力し”Enter”キーを押します。
”:/検索ワード(正規表現使用可能)/”を入力し”Enter”キーを押します。
検索結果は”n”キーを押すことにより次を検索できます。
個々に置換
”:/検索ワード(正規表現使用可能)/置換後の文字/”を入力し”Enter”キーを押します。
カーソルのある行全てを置換
”:/検索ワード(正規表現使用可能)/置換後の文字/g”を入力し”Enter”キーを押します。
ファイル内全て再帰的に置換
”:%s/検索ワード(正規表現使用可能)/置換後の文字/g”を入力し”Enter”キーを押します。
ノーマルモードからの文字削除
削除したい文字にカーソルを合わせ”x”キーを押すと文字を削除する事ができます。
ノーマルモードからの行削除
削除したい文字にカーソルを合わせ”d”キーを2回押すと文字を削除する事ができます。
”:e ++enc=文字エンコーディング”を入力し”Enter”キーを押します。
先ほど公開した日本語化版Kali LinuxのISOについてKali LinuxのISOのカスタム方法について日本語のサイトでまとめられているところがなかったので公式のISO作成方法(英語)を元にKali Linuxの日本語版のISO作成方法について簡単にメモしておきます
作成に関してはKali LinuxのVMWare版を使用すると効率的に作業できるかと思います
必要なパッケージをインストールします
# apt-get install git live-build cdebootstrap kali-archive-keyring
GITからISO作成の各種パラメータなどが書かれたものをクローンします
# git clone git://git.kali.org/live-build-config.git
クローンしたディレクトリに移ります
# cd live-build-config
シンボリックを作っていないとエラーが出るので作っておきます
# ln -sf wheezy /usr/share/live/build/data/debian-cd/kali
以上が初期設定です。下記より自分の好みに合わせた設定を行うために各種ファイルを作成します
カスタムする際にインストールする必要のあるパッケージリストを作成します
# vi config/package-lists/package-add.list.chroot
# japanese IME ibus ibus-anthy uim uim-anthy # Japanese Font fonts-ipafont ttf-vlgothic # Japanese Man manpages-ja manpages-ja-dev # Japanese Doc doc-linux-ja-text doc-linux-ja-html # Japanese Browser iceweasel-l10n-ja # Browser Flash Plugin flashplugin-nonfree # VPN network-manager-openvpn-gnome network-manager-pptp-gnome # Editor gedit
Skypeなど追加したいパッケージがapt-getで提供されておらずdebパッケージで存在する場合は下記のディレクトリに投げ込んでおくとビルド時に自動でインストールされます
# ls config/package-lists/packages/
日本語表示、日本語入力に関する設定を行うシェルスクリプトを作成します
# vi config/hooks/japanese-config.chroot
#!/bin/sh
echo "*****************************************************"
echo "* changing locale.gen japanese config file......... *"
echo "*****************************************************"
sed -e 's/# ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/g' /etc/locale.gen > /tmp/locale.gen_jp
mv -f /tmp/locale.gen_jp /etc/locale.gen
echo "new /etc/locale.gen"
cat /etc/locale.gen
echo "*****************************************************"
echo "* changing default locale japanese config file..... *"
echo "*****************************************************"
{
echo "# File generated by update-locale"
echo "LANG=ja_JP.UTF-8"
} > /tmp/locale_jp
mv -f /tmp/locale_jp /etc/default/locale
echo "new /etc/default/locale"
cat /etc/default/locale
echo "*****************************************************"
echo "* changing keyboard msp japanese config file....... *"
echo "*****************************************************"
{
echo "# KEYBOARD CONFIGURATION FILE"
echo ""
echo "# Consult the keyboard(5) manual page."
echo "XKBMODEL=\"pc105\""
echo "XKBLAYOUT=\"jp\""
echo "XKBVARIANT=\"\""
echo "XKBOPTIONS=\"\""
echo ""
echo "BACKSPACE=\"guess\""
} > /tmp/keyboard_ja
mv -f /tmp/keyboard_ja /etc/default/keyboard
echo "new /etc/default/keyboard"
cat /etc/default/keyboard
echo "*****************************************************"
echo "* changing im-config config file................... *"
echo "*****************************************************"
im-config -n uim
echo "new /etc/X11/xinit/xinputrc"
cat /etc/X11/xinit/xinputrc
※ このスクリプトは作成中のシステムが入っているディレクトリに”chroot”されている状態で実行されます
カレントディレクトリを移動します
# cd ../
ISO作成やBOOTに関するパラメータの設定をコマンドにて叩きますが今回はConfigオプションが長かったりで毎回打つのは面倒なのでシェルスクリプトに書いておきます
# vi make_iso.sh
#!/bin/sh
# ディレクトリを移動します
cd live-build-config
# 前回のビルド内容が残っていると面倒なので一度クリアします
lb clean
# ブートに関する設定をconfigのオプションに追記して設定します
lb config \
--bootappend-live "\
boot=live \
noconfig=sudo \
username=root \
hostname=kali \
locales=ja_JP.UTF-8 \
keyboard-model=jp106 \
keyboard-layouts=jp \
persistence \
noeject \
"
# ISOファイルの作成を開始します
lb build
シェルスクリプトに実行権を与えます
# chmod 755 make_iso.sh
ISOファイル生成を実行します
# ./make_iso.sh
※ 最初に行うビルドはかなり時間がかかります。当方の環境では3~4時間ほどかかりました。
その他設定の仕方を調べたい場合はDebian Live Manualを参照してください。なお、多くの日本語サイトではバージョンの古いlive buildを使ったカスタム法が紹介されていますがパラメータや設定ファイルの名前や書式に互換性がなかったりするのでご注意ください
RaspbianはRaspberry Piに適した素晴らしいLinuxですがGUIが不要な用途だったりすると
不要なパッケージがあまりにも多く含まれていると感じたり
ほかのデスクトップ環境のディスクイメージを作りたいと考える人もいるかと思います
そこで、自分の用途に合わせたディスクイメージの作り方をメモしておきます
必要な物
・Raspberry Pi
・Raspbianの入ったSDカード
・空のSDカード
・カードリーダライタ
Raspbianの入ったSDカードで起動し
空のSDカードにディスクイメージとなる環境を作ります
SDのパーティション削除とジオメトリの設定
$ sudo fdisk /dev/sda
Command (m for help): p Disk /dev/sda: 1990 MB, 1990197248 bytes 241 heads, 63 sectors/track, 256 cylinders, total 3887104 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sda1 * 63 3886847 1943392+ b W95 FAT32 Command (m for help): d Selected partition 1 Command (m for help): x Expert command (m for help): h Number of heads (1-256, default 241): 255 Expert command (m for help): s Number of sectors (1-63, default 63): 63 Expert command (m for help): c Number of cylinders (1-1048576, default 256): 各自計算したシリンダ数 Expert command (m for help): r Command (m for help): p Disk /dev/sda: 1990 MB, 1990197248 bytes 255 heads, 63 sectors/track, 241 cylinders, total 3887104 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
シリンダ数の計算
SDカードの容量 / 255 / 63 / 512 = シリンダ数
例) 1990197248 / 255 / 63 / 512 = 241
割り切れない数値は切り捨てます
Windowsパーティション’/boot’の作成 (64MB)
$ sudo fdisk /dev/sda
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-3887103, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-3887103, default 3887103): +64M
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): c
Changed system type of partition 1 to c (W95 FAT32 (LBA))
Command (m for help): a
Partition number (1-4): 1
Command (m for help): p
Disk /dev/sda: 1990 MB, 1990197248 bytes
62 heads, 62 sectors/track, 1011 cylinders, total 3887104 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 133119 65536 c W95 FAT32 (LBA)
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
Linuxパーティション”/”の作成 (残りの容量全部)
$ sudo fdisk /dev/sda
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 2):
Using default value 2
First sector (133120-3887103, default 133120):
Using default value 133120
Last sector, +sectors or +size{K,M,G} (133120-3887103, default 3887103):
Using default value 3887103
Command (m for help): p
Disk /dev/sda: 1990 MB, 1990197248 bytes
40 heads, 6 sectors/track, 16196 cylinders, total 3887104 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 133119 65536 c W95 FAT32 (LBA)
/dev/sda2 133120 3887103 1876992 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
必要なパッケージのインストール
$ sudo apt-get install dosfstools debootstrap git-core ca-certificates
フォーマット
$ sudo mkfs -t vfat -v -c -F 32 /dev/sda1
$ sudo mke2fs -t ext4 /dev/sda2 -m 1
SDカードに作成したパーティション/を/mntにマウントしてdebootstrapを使いDebianをインストール
$ sudo mount -o defaults,noatime /dev/sda2 /mnt/
$ sudo debootstrap –exclude=ed,nano –foreign –arch armel wheezy /mnt http://ftp.jp.debian.org/debian
必要なファイルをコピー
$ sudo cp /etc/inittab /mnt/etc/inittab
$ sudo cp /etc/hosts /mnt/etc/hosts
$ sudo cp /etc/fstab /mnt/etc/fstab
$ sudo cp /etc/network/interfaces /mnt/etc/network/interfaces
rootユーザで/mntをchrootし疑似的にLinuxを触る
chrootするとsudoコマンドは使えないためrootユーザになっておく必要があります
作業中は一応、ヒストリーに履歴が残ってしまうようなので残らないようにしておきます
debootstrapを実行させるとマウントしていた/procがアンマウントされるようなので再度マウントします
$ sudo su –
# export HISTSIZE=0 HISTFILESIZE=0
# chroot /mnt
# mount -n /proc
# export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# /debootstrap/debootstrap –second-stage –no-resolve-deps
# mount -n /proc
リポジトリの追加
これは標準のDevianのリポジトリを追加していますが面倒ならRaspbian側のファイルをコピーしても問題ありません
# vi /etc/apt/sources.list
# See sources.list(5) for more information, especialy # Remember that you can only use http, ftp or file URIs # CDROMs are managed through the apt-cdrom tool. deb http://http.us.debian.org/debian stable main contrib non-free deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free deb http://security.debian.org stable/updates main contrib non-free # Uncomment if you want the apt-get source function to work #deb-src http://http.us.debian.org/debian stable main contrib non-free #deb-src http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
アップデートとアップグレードの実行とその他、各自必要なパッケージのインストール
ここで好きなパッケージをインストールしておくことで用途に合わせたディスクイメージを作成することができます
# apt-get update
# apt-get upgrade
# apt-get install console-common console-setup console-data console-tools \
keyboard-configuration locales ntpdate ntp lua5.1 vim ssh sudo syslog-ng usbutils
ユーザの作成とsudoグループへの追加
この時にpasswdコマンドを使用しrootユーザのパスワードを設定することもできます
# adduser pi
# gpasswd -a pi sudo
chrootでの作業とrootでの作業の終了
# exit
# exit
起動時にeth0を有効化させる設定
$ sudo vi /mnt/etc/network/interfaces
auto lo eth0 iface lo inet loopback iface eth0 inet dhcp allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp
/bootとモジュールのコピー
$ sudo mount /dev/sda1 /mnt/boot
$ sudo cp -rp /boot/* /mnt/boot
$ sudo cp -rp /lib/modules/* /mnt/lib/modules
カーネルとモジュールのアップデート
$ sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update
$ sudo chmod +x /usr/bin/rpi-update
$ sudo ROOT_PATH=/mnt BOOT_PATH=/mnt/boot rpi-update
SDカードをアンマウント
$ sudo umount -l /mnt
シャットダウン
$ sudo shutdown -h now
SDカードを引き抜き、SDカードのイメージを作成すればオリジナルディスクイメージの完成です。
イメージ作成はWin32 Disk Imagerなどを使用すると簡単かもしれません
最後に作成したSDカードをRaspberry Piに接続し電源を入れ、正常に起動するするかを確認してみてください。
参考URL
覚書的な何か » Blog Archive » Raspberry PiでまっさらなDebianのインストール
Debian Linux for Raspberry Pi – GreenLeaf
Raspberry piにDebian squeezeをインストールする – もぐてっく
fdiskでフォーマットする – Android on Beagle
Bashの文字の処理について気になり調べていたところ
Bashの面白い仕様を見つけたので投稿します。
# C=’A’
# echo $((${C}+1));
1
# echo ${C};
A
# echo $((1+1));
2
# C=1
# echo $((${C}+1));
2
#
変数Cに文字Aを代入する
変数Cに1を足し結果を標準出力を行うと1が返る
変数Cを標準出力するとAが返る
数字1に1を足し結果を標準出力を行うと2が返る
変数Cに数字1を代入する
変数Cに1を足し結果を標準出力を行うと2が返る
変数内の文字に対する足し算はエラーを出さず完全に無視するようです。
PerlでLWP::UserAgentを使い、HTTPSサイトへ接続を行いコンテンツを取得してくるプログラムを書く必要が出てきて、色々調べて書いたのですが情報が錯綜していたりで結構ハマったのでソースコードを載せておきます。
今回わけあったりでコンストラクタ側でProxyの情報を保持していなかったりしますが、そこはお好きに改変してお使いください。
#########################################################
#
# LWP::UserAgentを使ったHTTPS接続
#
#########################################################
use utf8;
use strict;
use warnings;
{
package ProxyWebGet;
use LWP::UserAgent;
# コンストラクタ
sub new {
my ($class, @args) = @_;
my %args = ref $args[0] eq 'HASH' ? %{$args[0]} : @args;
my $self = {%args};
# オプション項目
$self->{ac_timeout} ||= 10; # プロキシ接続時のタイムアウト(秒)
return bless $self , $class;
}
# ホストとポート番号に対してProxy接続を行う
# 引数にホストとポート番号と接続先URLを指定する
sub proxy_connect {
my $self = shift;
my $proxy_host = shift; # ホストを受け取る
my $proxy_port = shift; # ポート番号を受け取る
my $target_url = shift; # 接続先URL
# ホストとポート番号をLWP::UserAgentで利用できる形式に整形する
my $http_proxy = 'http://' . $proxy_host . ':' . $proxy_port;
$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL';
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
$ENV{HTTPS_PROXY} = $http_proxy;
$ENV{HTTPS_VERSION} = 3;
# LWP::UserAgentのインスタンスの生成
my $ua = LWP::UserAgent->new(
timeout => $self->{ac_timeout} # オプションにタイムアウト時間を指定
);
# ヘッダーにUTF-8を含む場合エラーが出るため解析しない
$ua->parse_head(0);
# 整形したProxyを指定
$ua->proxy(['http'], $http_proxy);
# 指定されたURLへ接続する
# FTP等のプロトコルに接続を行った場合
# コネクションが維持されるため強制的に破棄する
my $res = "";
eval{
local $SIG{ALRM} = sub{die "timeout"};
alarm($self->{ac_timeout}); # タイマー設定
$res = $ua->get($target_url); # URLへ接続しコンテンツを取得
alarm(0); # タイマー解除
};
# ステータスコードが正常である場合、コンテンツを返す
my $result = $res->is_success() ? $res->content() : "";
return $result;
}
}
{
# sub main
my $pwg = ProxyWebGet->new();
print $pwg->proxy_connect(
'000.000.000.000',
'0000',
'https://ja.wikipedia.org/wiki/'
);
}
学校やレンタルサーバなどではセキュリティーを意識してかデフォルトパーミッションが600や700に設定されていたりする場合がある。非常に良い設定であると思うが、普段からサーバを触る機会の多い自分からすれば普通にファイルを作成すれば他のユーザから閲覧される可能性があるのは百も承知な訳で煩わしいだけである。そのためこちら側でデフォルトパーミッションを変更したいと思う。
変更自体は簡単で”~/.bash_profile”の中に”umask 022″を追記すればファイルは644・ディレクトリは755で作成される。
面倒な場合やコマンドが叩ける環境であるならば下記のコマンドを実行すればよい。
$ echo “umask 022” >> ~/.bash_profile
ワケありましてBrainf*ckを書くことになりBashでこんなものを書く人は少ないかもなと思いながら実装してみました。
とりあえずWikipediaで公開されている”Hello, world!”は実行出来ます。
色んなところで公開されている”FizzBuzz”も試した限りでは動作しているようです。
#!/bin/bash
############################################################################
#
# メモ
#
# このソースコードは私のサーバにて一般公開しております
# 公開先: https://www.orsx.net/archives/4469
#
# Bashは明確にローカル変数であることを宣言しなければ
# 全てグローバル変数となるが・・・・
# とりあえず初期化する関数を定義すれば追いやすくなるかもしれないとかと
# べ、別にこんなもの無くても問題ない。。。
#
# 言語によっては最後に標準出力した値を返り値として返す物があったりするため
# 癖で関数の最後には必ず明的にreturnしてあるが・・・
# べ、別にこんなもの無くても問題ない。。。
#
# ちなみに、変数は下記のようになっている
# ・グローバル変数は大文字
# ・ローカル変数は小文字
#
############################################################################
# 使用するグローバル変数を明的に初期化する
function initialize() {
# 変数
TEXT_SRC=""
CODE_LEN=0
CODE_PTR=0
BUFF_PTR=0
BUFF_LEN=0
# 配列
CODE=()
BUFF=()
return
}
# EOF(CTRL+D)が来るまで読み続け改行は無視する
# グローバル変数SRCにソースコードを格納する
function readstring() {
local line
while read line
do
# 文字列連結 連結演算子は存在しない
TEXT_SRC=$TEXT_SRC$line
done
# returnは数字しか返せない
return
}
# 標準入力で1文字だけ受け取る
function readchar() {
local line
read line
# 文字を数字に変換
BUFF[${BUFF_PTR}]=$(printf "%d" "'${line:0:1}")
return
}
# ASCIIコードからアルファベットを表示する
function echochar() {
echo ${BUFF[${BUFF_PTR}]} | awk '{ printf("%c", $0); }'
return
}
# 初期化されていない配列の要素を使おうとする前に初期化して拡張する
# これによりバッファーの長さを制限しなくて良くなる
function expansion() {
if [ ${BUFF_PTR} -gt ${BUFF_LEN} ]
then
BUFF_LEN=$((BUFF_LEN+1))
BUFF[${BUFF_LEN}]=0
fi
return
}
# ソースコードをグローバル配列CODEに一文字ずつ格納する
function tokenizer() {
# トークンを格納する配列の添字を数える
CODE_LEN=$((${#TEXT_SRC}-1))
# 文字列から一文字ずつトークンを取り出し配列に追加していく
local i
for i in $(seq 0 ${CODE_LEN})
do
CODE[${i}]=${TEXT_SRC:${i}:1}
done
return
}
# BUFF_PTRがな0ら対応する']'まで直後までジャンプする
function left_jumper() {
if [ ${BUFF[${BUFF_PTR}]} -eq 0 ]
then
local loop_ptr=1
while [ ${loop_ptr} -ne 0 ]
do
CODE_PTR=$((CODE_PTR+1))
case ${CODE[${CODE_PTR}]} in
'[')
loop_ptr=$((loop_ptr+1));;
']')
loop_ptr=$((loop_ptr-1));;
esac
done
fi
return
}
# BUFF_PTRがな0ら対応する'['の直後までジャンプする
function rite_jumper() {
if [ ${BUFF[${BUFF_PTR}]} -ne 0 ]
then
local loop_ptr=1
while [ ${loop_ptr} -ne 0 ]
do
CODE_PTR=$((CODE_PTR-1))
case ${CODE[${CODE_PTR}]} in
']')
loop_ptr=$((loop_ptr+1));;
'[')
loop_ptr=$((loop_ptr-1));;
esac
done
fi
return
}
# 意味解析を行い実行する
function execute() {
while [ ${CODE_PTR} -le ${CODE_LEN} ]
do
case ${CODE[${CODE_PTR}]} in
'>')
BUFF_PTR=$((BUFF_PTR+1));;
'<')
BUFF_PTR=$((BUFF_PTR-1));;
'+')
BUFF[${BUFF_PTR}]=$((BUFF[${BUFF_PTR}]+1));;
'-')
BUFF[${BUFF_PTR}]=$((BUFF[${BUFF_PTR}]-1));;
'.')
echochar;;
',')
readchar;;
'[')
left_jumper;;
']')
rite_jumper;;
* )
local message="Unknown Token! : ";
echo $message${CODE[${CODE_PTR}]};
break;;
esac
expansion
CODE_PTR=$((CODE_PTR+1))
done
echo "";
return
}
initialize # 初期化
readstring # 入力受付・プリプロセッサ
tokenizer # 構文解析
execute # 意味解析・実行
実行方法
直接標準入力で渡すかもしくは
適当なファイル例えば”script.bf”のようなファイルにソースコードを書き込み下記のように実行することができます。
# cat script.bf | brainfuck.sh
2013/05/07 追記
Bashでは”文字”に対して足し算を行えないようなので
文字入力時に整数型に変換するように”,”の処理を修正しました。
データベースにIPアドレスを格納する時は整数型にしたほうがブロックで検索出来たりと後々取り扱いが楽だったりするので変換する変換方法を書いてみる
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
my $addr_i = &addr_s_to_i("192.168.1.1");
my $addr_s = &addr_i_to_s($addr_i);
print "INTEGER:" . $addr_i . "\n";
print "STRING :" . $addr_s . "\n";
# IPアドレスを文字列型から整数型に変換
sub addr_s_to_i {
my $addr = shift;
# "."ごとに8bitずつ区切りそれを2進数に変換し配列に入れる
my @addrs;
foreach my $addr_split (split('\.', $addr)){
push(@addrs, sprintf("%08b", $addr_split));
}
# 区切った2進数を連結する
my $bin = join('', @addrs);
# 2進数を10進数に変換
my $result = oct('0b' . $bin);
return $result;
}
# IPアドレスを整数型から文字列型に変換
sub addr_i_to_s {
my $addr = shift;
# 10進数を32bitの2進数に変換
my $bin = sprintf("%032b", $addr);
# 2進数を8bitごとに区切り10進数に変換し配列に入れる
my @addrs;
foreach my $addr_split ($bin =~ m/.{8}/g){
push(@addrs, oct('0b' . $addr_split));
}
# "."ごとに区切り連結する
my $result = join('.', @addrs);
return $result;
}
実行結果
INTEGER:3232235777
STRING :192.168.1.1
最近のコメント