会計の品の無いタイトルを下に沈めるために書き込みする週末エセブロガーかいちょです。(ここまで書いて、即公開。へへへ、下に沈めオッパイAWK!)
ということで、行を稼ぐためにどうでもよいニュースをだらだら書きます。
どうでもよいニュース1
私のx32とUbuntu9.10の相性がどーも良くないです。視覚効果をオンにすると画面がとても淫らなことになってしまいます。オフにしてもシステムモニタがしつこい嫌がらせをしてきます(top使えば済む話だが)。
友の会のお兄様方どしたらよいのでしょか?
<<ここに淫らな画像を貼り付ける予定だが、下記のようにアップできず・・・>>
どうでもよいニュース2
友の会のNさんから誘われていた今日(土曜)のパーティーをド忘れ。今思い出す。ごめんなさい・・・。慣れない営業をするつもりだったんだが・・・
これはどうでもよくないですね。すんませんでした。
どうでもよいニュース3
なぜか私のサイトから某大手書籍販売サイトに接続して、たっかい英語の学術書を三冊も買ってくれた人現る。きっと私の失踪(?)を不憫に思った研究者だらう。
「あなたのコンバージョン 300.00%」
おお、一発三中・・・って、まだクリックしたの一人かい。
悲しいが、HTMLをぺたっと貼り付けた元は取ったぞ。
昔、「ギャラガ」というインベーダゲームのようなゲームで「最初の一発で二匹射殺して即死ぬと的中率200%になる」という、人生において無意味だが小学生大興奮な裏技があったな・・・
どうてもよいニュース4
このブログ、私のUbuntu 9.10 on x32から画像がアップできないことを発見したんdeathが、悪いのは9.10だろか?OSのせいな訳無いんで、ブラウザ(FireFoxもChromeもダメ)か、ブログだろ。
どうでもよいニュース5
「す」と入力しようとしたら左手がずれて「あう」と入った。あう。
コメントはまだありません »
会計K@USP友の会です。
春が近づいてきて、そろそろ新しいPCほしいの虫がうずきだしています…。
告知が3つ!
1.オープンソースカンファレンスにUSP友の会が出展します
2.オープンソースカンファレンスにUSP研究所も出展&セミナー開催します
3.女子bash部ブログを立ち上げてみた!
=======================================================
1.オープンソースカンファレンスにUSP友の会が出展します
「オープンソースカンファレンス」出展のお知らせです。
USP友の会では、新しい試みとして、2月26日、27日に開催される
オープンソースカンファレンスに出展をすることになりました。
http://www.ospn.jp/osc2010-spring/
※オープンソースカンファレンスとは:
オープンソース関連のコミュニティ、企業がブースを出展したり、セミナーを行ったりする
オープンソースの一大イベントです。
会場は明星大学 日野キャンパス 26号館(多摩モノレール 「中央大学・明星大学駅」下車)、
USP友の会では、ブースを出して、これまでにお題として作ったシェルスクリプトの展示などを行う予定です。
みんな遊びにきてけれ!どうぞよろしくお願いします!
========================================================
2.オープンソースカンファレンスにUSP研究所も出展&セミナー開催します
また、USP研究所でも、今回は協賛として、ブース出展とセミナー開催することになりました。
26日13時から、USP研究所の當仲さんが、
「生産性が一挙に向上!シェルスクリプトによる基幹システム構築手法『ユニケージ』への招待」という
タイトルの講演を行う予定です。
今回はユニケージ開発手法の技術の概要紹介だけでなく、
オリジナルシェルの「ush」紹介、排他制御の手法、並列処理コマンドなど、
最新の技術研究トピックについても披露する予定です。
セミナーは事前登録制になっています。
参加希望の方は、オープンソースカンファレンスのホームページから
登録してください。
===========================================================
3.女子ブログを作ってみました!
オープンソースカンファレンスの打ち合わせをしたときに、
女子が書くBASHブログがあればかなり需要が高かろうという話をされて、
とりあえず勢いでブログだけは作りました。(なかみはまだ)
http://d.hatena.ne.jp/chinjyu/
まだ内容を決めていないのですが、
どこかで萌え萌えなイラストでも書いてもらって
貼り付けられたらいいなと思っています。
誰か美しい萌え絵をかける絵師さんとお知り合いの方がいたら、紹介してくださいな。
# 以下雑談。
# 先日、出版社時代の先輩に会ったときのお話。
# 私が勤めていたころ(10年前ぐらい!)のその会社は、まだ硬派なパソコン書出版社だったのですが、
# 先般某ライトノベルの会社と合併し、すっかりライトノベルと萌え漫画が売り上げの大半を占めるように…。
# そこで働いている先輩に、今の仕事の話をしたら、「UNIX/Linuxも萌えで宣伝したら売れるよ!」
# 「AWKの本も、表紙に萌え絵を書いてもらって『おっぱいAWK』とかやったら、売れまくるよ!」って言われて、
# ちょっとその気になってしまっている私…。
# なんだよ「おっぱいAWK」って…。
後半若干暴走してしまっていてすみません。
以上、告知と独り言と妄想でした…。
1件のコメント »
どーも。休日夜の会長です。なあに、皆さん楽しければコメントなんて要らねえ。
とは言え、忙しい中でも会の目標「とりあえず千人」を常に気にかけるわたくしといたしましては、なんとしてもサイトに人を引っ張り込むべく、地道に活動を続けております。
(「とりあえず千人」って、とっても高い目標のような気がする・・・)
ということで、地味に自分のサイトにリンクを張りました。
でも自分のサイト、研究者を引退してから来る人が減ってしまったので、あまり役に立たんと思います。
ついでに、最近サーバ遊びをしてなかったので、壊れたということで会社からもらったNASにlinuxを入れて自宅のサーバの引越しもしました。多少、ハードディスクに不良セクタがありましたが、全然壊れてませんでしたよ・・・
今使ってるThinkPad x32も、学生が壊したと言って廃棄手続きしたのを私が拾ってなおして使ってるものです。現在、全く問題なく動いています。
みなさん、物は大切に使ってください!
ところでNASって、PCなのね・・・。スペックはこんな感じです。
processor : 0
vendor_id : CentaurHauls
cpu family : 6
model : 9
model name : VIA Nehemiah
stepping : 8
cpu MHz : 532.000
cache size : 64 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr cx8 mtrr pge cmov pat mmx fxsr sse up rng rng_en ace ace_en
bogomips : 1066.56
clflush size : 32
power management:
cpu MHz : 532.000
おお、三桁だ。でもapacheはちゃんと動いてます。
よくよく考えてみれば、もっと周波数の低い時代から大量アクセスを捌いていたwebサービスは存在していたわけでして、全然不思議なことではありません。
なんでこんなにマシンパワーが必要になってしまったんでしょうね。
そんなことを考えてキーボードを叩き、カミさんから白い目で見られる夜でございました。
(と、締めようとしたら、カミさんもネットサーフィンしてる・・・)
コメントはまだありません »
第4回友の会でお披露目したBASICインタープリターです。マルチステートメントや文字列変数などがない初期の文法なので実用性はありません(って言うより、BASICってだけで実用性はないでしょうけど)が、シェルスクリプトでBASICインタープリターが書けるということ自体に意味があるということで、、、
さすがに浮動小数点演算はシェルだけでは実行できないのでperlを計算エンジンとして使っています。perlを使わない整数BASICもありますが、そちらは別記事で投稿します。
リストの貼り付け方法が分からなかったので、テキストとして貼り付けました。どなたかリストの貼り付け方を教えてください。
#!/bin/bash
set -f
if [ x"$1" == x'-' ]; then
((debug++))
shift
fi
error_at()
{
local i
IFS=""
echo " $line" >&2
IFS=" "
if ((pos >= 0)); then
echo -n " " >&2
for ((i = 0; i < pos; i++)) do
if [ x"${line:i:1}" == x$'\t' ]; then
echo -n $'\t' >&2
else
echo -n " " >&2
fi
done
echo "^" >&2
fi
exit 1
}
error()
{
echo "$*" >&2
error_at
}
syntax_error()
{
error "syntax error${@:+: $@}"
}
invalid_symbol()
{
pos=$sym_start
syntax_error "$@"
}
panic()
{
echo "internal error at: ${source[pc]}" >&2
exit 1
}
isspace()
{
[[ x"${line:pos:1}" == x[$' \t'] ]]
}
isdigit()
{
[[ x"${line:pos:1}" == x[0-9] ]]
}
isalpha()
{
[[ x"${line:pos:1}" == x[a-zA-Z] ]]
}
isalnum()
{
[[ x"${line:pos:1}" == x[a-zA-Z0-9] ]]
}
func_list__=(
"abs 1 arith abs"
"int 1 arith int"
"sqr 1 arith sqrt"
"exp 1 arith exp"
"log 1 arith log"
"sin 1 arith sin"
"cos 1 arith cos"
"atan2 2 arith2 atan2"
"tan 1 tan -"
"asin 1 asin -"
"acos 1 acos -"
"atan 1 atan -"
"rnd 1 rnd -"
)
isfunc()
{
local f
for f in "${func_list__[@]}"; do
if [[ "$f" == "$1 "* ]]; then
sym=func
symval="$f"
return
fi
done
false
}
get_num()
{
local dig=0
sym=num
symval=0
if [[ -n "$1" && "${line:pos:1}" == [+-] ]]; then
((pos++))
fi
while isdigit; do
dig=1
((pos++))
done
if [[ "${line:pos:1}" == . ]]; then
sym=fnum
((pos++))
fi
while isdigit; do
dig=1
((pos++))
done
if ((!dig)); then
invalid_symbol "invalid number"
fi
if [[ "${line:pos:1}" == [eE] ]]; then
sym=fnum
((pos++))
if [[ "${line:pos:1}" == [+-] ]]; then
((pos++))
fi
if ! isdigit; then
invalid_symbol "invalid number"
fi
while isdigit; do
((pos++))
done
fi
symval=${line:sym_start:pos - sym_start}
}
get_ident()
{
local start=$pos
while isalnum; do ((pos++)); done
symval=${line:start:pos-start}
}
get_string()
{
local c
symval=
((pos++))
while c=${line:$((pos++)):1} && [ -n "$c" ] && [ x"$c" != x'"' ]; do
case "$c" in
$'\t')
symval="$symval\\0011";;
' ')
symval="$symval\\0040";;
'\')
symval="$symval\\0134";;
*)
symval="$symval$c";;
esac
done
}
get_sym()
{
while isspace; do ((pos++)); done
sym_start=$pos
case "${line:pos:1}" in
'')
sym=eol
return 1;;
[0-9])
get_num
return;;
[a-zA-Z])
get_ident
case $symval in
let|if|then|else|for|to|step|next|goto|on|gosub|return|print|input|randomize|dim|rem|stop|mod|and|xor|or)
sym=$symval
return
esac
if isfunc $symval; then return; fi
sym=ident
return;;
[-+*/\(\)=\;:,])
sym="${line:pos++:1}"
return;;
'<')
case "${line:$((++pos)):1}" in
'='|'>')
sym="${line:pos-1:2}"
((pos++));;
*)
sym="${line:pos-1:1}"
esac
return;;
'>')
case "${line:$((++pos)):1}" in
'=')
sym="${line:pos-1:2}"
((pos++));;
*)
sym="${line:pos-1:1}"
esac
return;;
'"')
get_string
sym=string
return;;
*)
syntax_error
esac
}
unget_sym()
{
pos=$sym_start
}
expect()
{
if ! get_sym || [ x"$sym" != x"$1" ]; then
case "$1" in
ident) sym=identifier;;
num) sym=number;;
*) sym="$1"
esac
invalid_symbol "$sym expected"
fi
}
get_linenum()
{
expect num
if (((num = $symval) <= 0)); then
unget_sym
error "invalid line number"
fi
}
get_subscr()
{
local expr
get_expr $1
subscr=(1 "${expr[@]}")
while get_sym && [ x"$sym" == x',' ]; do
get_expr $1
subscr=("${subscr[@]}" "${expr[@]}")
((subscr[0]++))
done
if [ x"$sym" != x')' ]; then syntax_error; fi
}
expr_fact()
{
local n
if ! get_sym; then syntax_error; fi
case "$sym" in
+) expr_fact;;
-) expr[${#expr[@]}]='U-'; expr_fact;;
'(') expr_top; expect ')';;
num|fnum)
expr[${#expr[@]}]='CONST'; expr[${#expr[@]}]=$symval;;
ident) expr[${#expr[@]}]=VAR
expr[${#expr[@]}]=$symval
if get_sym && [ x"$sym" == x'(' ]; then
get_subscr 0
expr=("${expr[@]}" "${subscr[@]}")
else
unget_sym
expr[${#expr[@]}]=0
fi;;
func) symval=($symval)
n=${symval[1]}
expr=("${expr[@]}" FUNC "${symval[@]}")
if ((n == 0)); then
if get_sym && [ x"$sym" == x'(' ]; then
expect ')'
else
unget_sym
fi
else
expect '('
while ((--n > 0)); do
expr_top
expect ','
done
expr_top
expect ')'
fi;;
*) invalid_symbol;;
esac
}
expr_term()
{
local idx=${#expr[@]}
expr_fact
while get_sym && [[ x"$sym" == x[*/] || x"$sym" == x'mod' ]]; do
expr=("${expr[@]:0:idx}" "$sym" "${expr[@]:idx:${#expr[@]}}")
expr_fact
done
unget_sym
}
expr_smpl()
{
local idx=${#expr[@]}
expr_term
while get_sym && [[ x"$sym" == x[-+] ]]; do
expr=("${expr[@]:0:idx}" "$sym" "${expr[@]:idx:${#expr[@]}}")
expr_term
done
unget_sym
}
is_rel_op()
{
case "$sym" in
'='|'<>'|'<'|'<='|'>'|'>=')
return 0
esac
return 1;
}
expr_rel()
{
local idx=${#expr[@]}
expr_smpl
while get_sym && is_rel_op; do
expr=("${expr[@]:0:idx}" "$sym" "${expr[@]:idx:${#expr[@]}}")
expr_smpl
done
unget_sym
}
expr_and()
{
local idx=${#expr[@]}
expr_rel
while get_sym && [ x"$sym" == x'and' ]; do
expr=("${expr[@]:0:idx}" "$sym" "${expr[@]:idx:${#expr[@]}}")
expr_rel
done
unget_sym
}
expr_xor()
{
local idx=${#expr[@]}
expr_and
while get_sym && [ x"$sym" == x'xor' ]; do
expr=("${expr[@]:0:idx}" "$sym" "${expr[@]:idx:${#expr[@]}}")
expr_and
done
unget_sym
}
expr_top()
{
local idx=${#expr[@]}
expr_xor
while get_sym && [ x"$sym" == x'or' ]; do
expr=("${expr[@]:0:idx}" "$sym" "${expr[@]:idx:${#expr[@]}}")
expr_xor
done
unget_sym
}
get_expr()
{
local subscr
if (($1)); then
expr=(EXPR)
expr_top
expr[${#expr[@]}]=EXPR_END
else
expr=()
expr_top
fi
}
get_let()
{
expect ident
statement=(LET VAR $symval)
if get_sym && [ x"$sym" == x'(' ]; then
get_subscr 1
statement=("${statement[@]}" "${subscr[@]}")
expect '='
elif [ x"$sym" == x'=' ]; then
statement[${#statement[@]}]=0
else
invalid_symbol
fi
get_expr 1
statement=("${statement[@]}" "${expr[@]}")
}
get_if()
{
get_expr 1
expect then
get_linenum
statement=(IF "${expr[@]}" $num)
if get_sym && [ x"$sym" == x'else' ]; then
get_linenum
statement[${#statement[@]}]=$num
else
statement[${#statement[@]}]=-1
fi
}
get_for()
{
local var expr1 expr2
expect ident
var=$symval
expect =
get_expr 1
expr1=("${expr[@]}")
expect to
get_expr 1
expr2=("${expr[@]}")
if get_sym && [ x"$sym" == x'step' ]; then
get_expr 1
else
unget_sym
expr=(EXPR CONST 1 EXPR_END)
fi
statement=(FOR $var "${expr1[@]}" "${expr2[@]}" "${expr[@]}")
}
get_next()
{
if ! get_sym; then
statement=(NEXT 0)
elif [ x"$sym" != x'ident' ]; then
invalid_symbol "identifier expected"
else
statement=(NEXT 1 $symval)
while get_sym && [ x"$sym" == x',' ]; do
expect ident
statement[${#statement[@]}]=$symval
((statement[1]++))
done
unget_sym
fi
}
get_goto()
{
get_linenum
statement=(GOTO $num)
}
get_on_go()
{
local n=1 idx
get_expr 1
get_sym
case "$sym" in
goto) statement=(ONGO);;
gosub) statement=(ONGSB);;
*) invalid_symbol "goto or gosub expected"
esac
get_linenum
statement=("${statement[@]}" "${expr[@]}" 0 $num)
idx=${#statement[@]}
while get_sym && [ x"$sym" = x',' ]; do
get_linenum
statement[${#statement[@]}]=$num
((n++))
done
unget_sym
statement[idx - 2]=$n
}
get_gosub()
{
get_linenum
statement=(GOSUB $num)
}
get_return()
{
statement=(RETURN)
}
get_print()
{
statement=(PRINT)
while get_sym; do
if [ x"$sym" == x'string' ]; then
statement[${#statement[@]}]=STRING
statement[${#statement[@]}]="$symval"
else
unget_sym
get_expr 1
statement=("${statement[@]}" "${expr[@]}")
fi
if get_sym && [[ x"$sym" == x[,\;] ]]; then
statement[${#statement[@]}]="$sym"
else
unget_sym
break
fi
done
}
get_input()
{
statement=(INPUT)
if get_sym && [ x"$sym" == x'string' ] ; then
statement[${#statement[@]}]=STRING
statement[${#statement[@]}]="$symval"
expect ';'
else
unget_sym
fi
while :; do
expect ident
statement[${#statement[@]}]=VAR
statement[${#statement[@]}]=$symval
if get_sym && [ x"$sym" == x'(' ]; then
get_subscr 1
statement=("${statement[@]}" "${subscr[@]}")
get_sym
else
statement[${#statement[@]}]=0
fi
if [ x"$sym" == x'eol' ]; then
return
elif [ x"$sym" != x',' ]; then
invalid_symbol
fi
done
}
get_randomize()
{
get_expr 1
statement=(RANDOM "${expr[@]}")
}
get_dim()
{
statement=(DIM)
while :; do
expect ident
statement[${#statement[@]}]=VAR
statement[${#statement[@]}]=$symval
if get_sym && [ x"$sym" == x'(' ]; then
get_subscr 1
statement=("${statement[@]}" "${subscr[@]}")
get_sym
else
statement=(${statement[@]} 1 EXPR CONST 10 EXPR_END)
fi
if [ x"$sym" == x'eol' ]; then
return
elif [ x"$sym" != x',' ]; then
invalid_symbol
fi
done
}
get_rem()
{
statement=(REM)
pos=${#line}
}
get_stop()
{
statement=(STOP)
}
get_statement()
{
if ! get_sym; then return; fi
case "$sym" in
ident) unget_sym; get_let;;
let) get_let;;
if) get_if;;
for) get_for;;
next) get_next;;
goto) get_goto;;
on) get_on_go;;
gosub) get_gosub;;
return) get_return;;
print) get_print;;
input) get_input;;
randomize) get_randomize;;
dim) get_dim;;
rem) get_rem;;
stop) get_stop;;
*) invalid_symbol
esac
if get_sym; then invalid_symbol; fi
}
parse_line()
{
local linenum lastlnum=0
pos=0
get_linenum
if (((linenum=num) <= lastnum)); then
pos=$sym_start
error "line number is less than or equal to previous line"
fi
lastnum=$linenum
get_statement
((program_$linenum = nlines))
((linenum_$nlines = linenum))
program[nlines]="${statement[*]}"
source[nlines++]="$line"
}
parse()
{
nlines=1
program[0]=''
while read line; do parse_line; done
pos=-1
}
caliculate()
{
echo "$@" >&8
read value <&9
}
cvt_int()
{
caliculate "int($@)"
}
func_arith()
{
local fn=$1 args=(${@:2})
if ((${#args[@]} != 1)); then panic; fi
caliculate "$fn(${args[0]})"
}
func_arith2()
{
local fn=$1 args=(${@:2})
if ((${#args[@]} != 2)); then panic; fi
caliculate "$fn(${args[0]},${args[1]})"
}
func_tan()
{
local fn=$1 args=(${@:2})
if ((${#args[@]} != 1)); then panic; fi
caliculate "sin(${args[0]})/cos(${args[0]})"
}
func_asin()
{
local fn=$1 args=(${@:2})
if ((${#args[@]} != 1)); then panic; fi
caliculate "atan2(${args[0]}, sqrt(1 - ${args[0]} * ${args[0]}))"
}
func_acos()
{
local fn=$1 args=(${@:2})
if ((${#args[@]} != 1)); then panic; fi
caliculate "atan2(sqrt(1 - ${args[0]} * ${args[0]}), ${args[0]})"
}
func_atan()
{
local fn=$1 args=(${@:2})
if ((${#args[@]} != 1)); then panic; fi
caliculate "atan2(${args[0]}, 1)"
}
func_rnd()
{
local fn=$1 args=(${@:2})
if ((${#args[@]} != 1)); then panic; fi
caliculate "rand(1)"
}
div0()
{
caliculate "$1 == 0"
if ((value)); then
error "division by 0"
fi
}
exec_expr()
{
local vstk ostk vp=0 op=0 o id d expr fn1 fn2
if [ x"${stmt[pc_s++]}" != x'EXPR' ]; then panic; fi
while :; do
o="${stmt[pc_s++]}"
case "$o" in
CONST)
caliculate ${stmt[pc_s++]}
vstk[vp++]=$value;;
VAR|FUNC)
id="${stmt[pc_s++]}"
d="${stmt[pc_s++]}"
if [ $o == FUNC ]; then
fn1="${stmt[pc_s++]}"
fn2="${stmt[pc_s++]}"
ostk[op++]=$fn2
ostk[op++]=$fn1
fi
ostk[op++]=$d
ostk[op++]=$id
ostk[op++]=$o
if ((d > 0)); then
while ((--d > 0)); do ostk[op++]=push; done
continue
fi;;
U-)
ostk[op++]=${stmt[pc_s-1]}
continue;;
[*/+\-=\<\>]|mod|'<>'|'<='|'>='|and|xor|or)
ostk[op++]=${stmt[pc_s-1]}
ostk[op++]=push
continue;;
*) panic
esac
while ((op > 0)); do
o="${ostk[--op]}"
case "$o" in
VAR) id="${ostk[--op]}"
((vp -= d = ostk[--op]))
var_check 0 $id $d ${vstk[@]:vp:d}
eval "vstk[vp++]=\${var_val_$var_idx[var_subscr]}"
continue;;
FUNC) id="${ostk[--op]}"
((vp -= d = ostk[--op]))
fn1="${ostk[--op]}"
fn2="${ostk[--op]}"
eval "func_$fn1 $fn2 \"\${vstk[@]:vp:d}\""
vstk[vp++]=$value
continue;;
push) continue 2;;
U-) expr="-${vstk[vp-1]}"; ((vp++));;
'/') div0 ${vstk[vp-1]}
expr="${vstk[vp-2]} / ${vstk[vp-1]}";;
mod) div0 ${vstk[vp-1]}
expr="${vstk[vp-2]} % ${vstk[vp-1]}";;
[\*+\-=\<\>]|'<='|'>=')
expr="${vstk[vp-2]} $o ${vstk[vp-1]}";;
'<>') expr="${vstk[vp-2]} != ${vstk[vp-1]}";;
and) expr="${vstk[vp-2]} & ${vstk[vp-1]}";;
xor) expr="${vstk[vp-2]} ^ ${vstk[vp-1]}";;
or) expr="${vstk[vp-2]} | ${vstk[vp-1]}";;
*) panic
esac
((vp--))
caliculate "$expr"
vstk[vp-1]=$value
if ((vp <= 0)); then panic; fi
done
if ((op <= 0)); then break; fi
done
if [ x"${stmt[pc_s++]}" != x'EXPR_END' ] \
|| (( op != 0 || vp != 1)); then
panic
fi
value=$vstk
}
calc_subscr()
{
local i n=$1 args=(${@:2})
if ((${#args[@]} != n || ${#subs[@]} != n)); then panic; fi
var_subscr=0
for ((i = 0; i < n; i++)) do
cvt_int "${args[i]}"
if ((value < 0 || value > subs[i])); then
error "subscript out of range: $id"
fi
((var_subscr = (subs[i] + 1) * var_subscr + value))
done
}
var_check()
{
local i subs=() force=$1 id=$2 dim=$3
if ((!(var_idx = var_idx_$id) || force)); then
if ((!var_idx)); then
((var_idx_$id = var_idx = ++nvars))
var_name[var_idx]=$id
fi
var_dim[var_idx]=$dim
if ((force)); then
for ((i = 0; i < dim; i++)) do
cvt_int "${@:i+4:1}"
subs[i]=$value
done
else
for ((i = 0; i < dim; i++)) do
subs[i]=10
done
fi
var_subs[var_idx]=${subs[@]}
elif ((var_dim[var_idx] != dim)); then
error "dimension mismatch: $id"
else
subs=(${var_subs[var_idx]})
fi
calc_subscr $dim ${@:4}
}
assign()
{
var_check 0 "${@:2}"
eval "var_val_$var_idx[var_subscr]=$1"
}
exec_let()
{
local val i d
if [ x"${stmt[1]}" != x'VAR' ]; then
panic
else
d=${stmt[3]}
pc_s=4
for ((i = 0; i < d; i++)) do
exec_expr
val[i]=$value
done
fi
exec_expr
assign $value ${stmt[2]} $d ${val[@]}
((pc++))
}
exec_if()
{
local num
pc_s=1
exec_expr
cvt_int $value
if (((num = value ? stmt[pc_s] : stmt[pc_s + 1]) <= 0)); then
((pc++))
elif (((pc = program_$num) <= 0)); then
error "line number $num missing"
fi
}
exec_for()
{
local val
for_stack[for_sp++]=${stmt[1]}
for_stack[for_sp++]=$((pc + 1))
pc_s=2
exec_expr
val=$value
exec_expr
for_stack[for_sp++]=$value
exec_expr
for_stack[for_sp++]=$value
var_check 0 ${for_stack[for_sp - 4]}
eval "var_val_$var_idx=$val"
((pc++))
}
exec_next()
{
local id_list id step v
if ((for_sp < 4 )); then
error "next without for statement"
elif ((stmt[1] > 0)); then
id_list=(${stmt[@]:2:${stmt[1]}})
else
id_list=${for_stack[for_sp - 4]}
fi
for id in ${id_list[@]}; do
while ((for_sp >= 4)) && [ ${for_stack[for_sp - 4]} != $id ]; do
((for_sp -= 4))
done
if ((for_sp <= 0)); then
error "invalid loop variable: $id"
fi
var_check 0 $id
step=${for_stack[for_sp - 1]}
eval "caliculate \"\$var_val_$var_idx + $step\""
eval "var_val_$var_idx=$value"
eval "v=\$var_val_$var_idx"
caliculate "$step > 0 && $v > ${for_stack[for_sp-2]}" \
"|| $step < 0 && $v < ${for_stack[for_sp-2]}"
if ((value)); then
((for_sp -= 4))
else
pc=${for_stack[for_sp - 3]}
return
fi
done
((pc++))
}
exec_go()
{
local npc=$((pc + 1))
if (((pc = program_${stmt[1]}) <= 0)); then
error "line number ${stmt[1]} missing"
elif (($1)); then
((sub_stack[sub_sp++] = npc))
fi
}
exec_ongo()
{
local npc=$((pc + 1))
pc_s=1
exec_expr
cvt_int $value
if ((value <= 0 || value > stmt[pc_s])); then
((pc++))
elif (((pc = program_$((stmt[pc_s + value]))) <= 0)); then
error "line number ${stmt[pc_s + value]} missing"
elif (($1)); then
((sub_stack[sub_sp++] = npc))
fi
}
exec_return()
{
if ((sub_sp <= 0)); then
error "return from outside subroutine"
fi
((pc = sub_stack[--sub_sp]))
}
exec_print()
{
local nl=1
for ((pc_s = 1; pc_s < ${#stmt[@]}; )) do
case "${stmt[pc_s++]}" in
EXPR) ((pc_s--))
exec_expr
echo -n $value
nl=1;;
STRING) echo -en "${stmt[pc_s++]}"
nl=1;;
',') echo -en "\t"
nl=0;;
';') nl=0;;
*) panic
esac
done
if ((nl)); then echo; fi
((pc++))
}
exec_input()
{
local i d var val
pc_s=1
if [ x"${stmt[pc_s]}" == x'STRING' ]; then
((pc_s++))
echo -en "${stmt[pc_s++]}"
fi
while [ -n "${stmt[pc_s]}" ]; do
if [ x"${stmt[pc_s++]}" != x'VAR' ]; then
panic
else
var=${stmt[pc_s++]}
d=${stmt[pc_s++]}
for ((i = 0; i < d; i++)) do
exec_expr
val[i]=$value
done
fi
echo -n '? '
read value </dev/tty
assign $value $var $d ${val[@]}
done
if ((pc_s < ${#stmt[@]})); then
panic
fi
((pc++))
}
exec_random()
{
pc_s=1
exec_expr
caliculate "srand($value)"
((pc++))
}
exec_dim()
{
local id d i subs
pc_s=1
while [ x"${stmt[pc_s++]}" == x'VAR' ]; do
id=${stmt[pc_s++]}
d=${stmt[pc_s++]}
subs=()
for ((i = 0; i < d; i++)) do
exec_expr
subs[${#subs[@]}]=$value
done
var_check 1 $id $d ${subs[@]}
done
if ((pc_s < ${#stmt[@]})); then
panic
fi
((pc++))
}
execute()
{
for ((pc = 1; pc < ${#program[@]}; )) do
stmt=(${program[pc]})
line="${source[pc]}"
case $stmt in
LET) exec_let;;
IF) exec_if;;
FOR) exec_for;;
NEXT) exec_next;;
GOTO) exec_go 0;;
GOSUB) exec_go 1;;
ONGO) exec_ongo 0;;
ONGSB) exec_ongo 1;;
RETURN) exec_return;;
PRINT) exec_print;;
INPUT) exec_input;;
RANDOM) exec_random;;
DIM) exec_dim;;
REM) ((pc++));;
STOP) pc=${#program[@]};;
*) panic
esac
done
}
if [ -n "$1" ]; then
exec <$1
fi
parse
if ((debug)); then
for ((i = 1; i < ${#program[@]}; i++)) do
printf "%5d " $((linenum_$i))
echo ${program[i]}
done
fi
TMP=/tmp/$$
mkdir $TMP || { echo "cannot create temp dir: $TMP" >&2; exit 1; }
trap 'rm -rf $TMP' 0
chmod 700 $TMP
mknod $TMP/a p
mknod $TMP/b p
perl -ne 'print STDERR eval() + 0, "\n"' <$TMP/a 2>$TMP/b &
exec 8>$TMP/a
exec 9<$TMP/b
execute
8件のコメント »
皆様、会長です。友の会忘年会、ご出席ありがとうございました。存続が疑問視されているこのブログにも顔を出してくださいっ!
さて、忘年会の席で言った「世界中に浸透していく掲示板」の要件を書くつもりでしたが、ショックなことがあったので、報告します。
一昨日、帰宅直後、子供が「とうさん」と言ってこんなものを見せてくれました。

妻の悪意が感じられる
犯人はカミさんに決まっているので問い詰めると「子供がとうさんとうさんウルサイので描いてあげた。」との返答。続けて「家ではこの4パターンの行動しかない」とのこと。
・・・まあ、最近は家事をサボり気味なのでそう言われても仕方ないかもしれない。が、この絵のタッチには人を小馬鹿にしたものを感じるのは当事者の私だけでしょうか?

大正時代の風刺絵かい
今年の前半は家でパソコンを開かないようにしていたのですが、ここ最近、いろいろ事情があってパソコンをいじることが多くなっていたのでちょっとやめよーかなと思った出来事でした。
・・・そしたら、このブログどうなるんだろ???
1件のコメント »
皆様、日曜の夜をいかがお過ごしでしょうか?
毎度おなじみ、週末会長モノローグの時間がやってまいりました。
現在、パーソナリティーの喋り方に突っ込みを入れながらJ-WAVEを聞いて書いております。
表題のように、emobileのPocket WiFiを購入してしまいました。販促のネーチャンに聞くまでこれが何なのかさっぱり理解できなかったのですが、要は携帯無線ルータです。パソコンから無線LANでこいつにアクセスして、こいつがemobileと常時接続するという仕組みです。
ということで、普通のemobileと違って、使うときはカバンやコカンに忍ばせて、無線接続して使います。ということで、パソコンからは何も出っ張らず、出っ張るのはカバン、乃至はコカンです。アンテナが人体と接していると、ラジオみたいに通信が安定するかもしれませんので、コカンでなくてもズボンのポケットに入れて使うのが正解かもしれません。しかしまあ、世のモバイル野郎はさらに局部に電磁波を浴びることになるわけですが、大丈夫だろか?
下半身に身につけるデバイス。これが本当の(自粛)
速度は、まあまあそこそこなんですが、二人以上で同時に使えたり、linuxから簡単に使えたりと、なかなか重宝しそうです。今度の友の会飲みで、PC持ち込んだ人全員で接続してみると面白いかもしれません。
明日、電車の中でテストをヤッてきます。報告はまた来週!執筆途中のロボット展については、また再来週!それでは!
【サービスカット】帰り際、金ピカのCOACHのバックに執着する幼児。すまん。お父さんはこれから月5000円支出が増えるのでムリだ。ていうか最初からムリだ。
コメントはまだありません »
takafu3くんの、「シェルとり」を「お題と投稿」コーナーに掲載しました。かわいらしい作品じゃあないですか。
http://usptomonokai.sakura.ne.jp/odai.00001.html
ちなみにtakahu3さんは、先日会計Kの策略にはめられて、河口湖でフルマラソンを走るという、罰ゲームに等しい仕打ちをうけたのにも関わらず、シェルをしっかり投稿してくれました。いい人だ!!
しかし、なさけない話ですが、ホームページ更新担当のKは、CGIが書けないため、いちいちHTMLを手打ちで更新しているのですが、これじゃ更新に時間がかかりすぎて、運用に耐えられません…。
どなかた、簡易なシェルだけで動くCMSとか、おすすめのものがありましたら、教えてくださいませ。
コメントはまだありません »
久々登場の副会長です。
やっと、新規会員の皆さんのユーザを追加しまして。
4ヶ月近くお待たせした方も居たのではなかろうかと。
結構、手間のかかる作業なんです。一人ひとり違うアイコンを出すようにするためには、アイコンを作らなければなりませんし、作ったアイコンがかぶらないようにしないといけません。
既に相当かぶってます。
でも、これで、役割は果たしました。
みなさん、良いお年を。
2件のコメント »
どぅお~も、会長です。ロボット展の話の途中ですが臨時ニュウスです。
会計兼HTML係様が友の会のサイト(このブログではなくて誰も見やしなかった公式サイト)をリニューアルしました。
文字が数十倍増えました。これからアラサガシをします。
コメントはまだありません »
どうも。かいちょうdeath。もう、このブログは私のモノローグですな・・・
もうすこし会員様に簡単にいたずら書きしてもらう仕組みを考えないといけません。いけませんだけではいけませんが。
会自体は、じわじわと勢力拡大中ですのでご心配なく。
本題。
今日はカミさんの仕事のお供と子供の散歩を兼ねて国際ロボット展@有明に行ってきました。会の皆さんも会計のK氏以外は理系野郎なんで興味があると思い、レポートします。

図1:整列!溶接!強力伝!
国際ロボット展は毎年ビッグサイトで開催されています。バリバリ現場で使用されているロボット(図1)やアバンギャルドな装置(図2)が中心の展示会です。企業が主体で真剣にやっているので、かなり硬派で見ごたえがあります。

図2:実用型ピタゴラスイッチ
質問魔(図3)を置いて、気楽にうろうろしたところ・・・
衝撃の次回へ!(単に眠いので打ち切って後日書くだけ。)

図3:システムとAGV間の通信方式と実装について細かく質問して説明担当者を困らせる母子
コメントはまだありません »