特に何も無いが・・・

2010年2月6日 土曜日 23:51:46 by 会長(マリオネット)
カテゴリ: Linux, どうでもよい, やってみた, 近況報告 / タグ: ,

会計の品の無いタイトルを下に沈めるために書き込みする週末エセブロガーかいちょです。(ここまで書いて、即公開。へへへ、下に沈めオッパイ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

「す」と入力しようとしたら左手がずれて「あう」と入った。あう。


コメントはまだありません »

オープンソースとおっぱいAWK

2010年1月28日 木曜日 23:22:23 by kano
カテゴリ: 未分類

会計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件のコメント »

リンク張りと、独り言

2010年1月16日 土曜日 21:43:56 by 会長(マリオネット)
カテゴリ: Linux, おしらせ, 近況報告 / タグ: ,

どーも。休日夜の会長です。なあに、皆さん楽しければコメントなんて要らねえ。

とは言え、忙しい中でも会の目標「とりあえず千人」を常に気にかけるわたくしといたしましては、なんとしてもサイトに人を引っ張り込むべく、地道に活動を続けております。
(「とりあえず千人」って、とっても高い目標のような気がする・・・)

ということで、地味に自分のサイトにリンクを張りました。
でも自分のサイト、研究者を引退してから来る人が減ってしまったので、あまり役に立たんと思います。

ついでに、最近サーバ遊びをしてなかったので、壊れたということで会社からもらった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サービスは存在していたわけでして、全然不思議なことではありません。

なんでこんなにマシンパワーが必要になってしまったんでしょうね。
そんなことを考えてキーボードを叩き、カミさんから白い目で見られる夜でございました。
(と、締めようとしたら、カミさんもネットサーフィンしてる・・・)


コメントはまだありません »

BASICインタプリター

2010年1月1日 金曜日 22:02:25 by kate
カテゴリ: Linux, bash, シェルスクリプト

第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件のコメント »

私の生態

2009年12月27日 日曜日 11:04:16 by 会長(マリオネット)
カテゴリ: どうでもよい, 近況報告 / タグ: ,

皆様、会長です。友の会忘年会、ご出席ありがとうございました。存続が疑問視されているこのブログにも顔を出してくださいっ!

さて、忘年会の席で言った「世界中に浸透していく掲示板」の要件を書くつもりでしたが、ショックなことがあったので、報告します。

一昨日、帰宅直後、子供が「とうさん」と言ってこんなものを見せてくれました。

妻の悪意が感じられる

妻の悪意が感じられる

犯人はカミさんに決まっているので問い詰めると「子供がとうさんとうさんウルサイので描いてあげた。」との返答。続けて「家ではこの4パターンの行動しかない」とのこと。

・・・まあ、最近は家事をサボり気味なのでそう言われても仕方ないかもしれない。が、この絵のタッチには人を小馬鹿にしたものを感じるのは当事者の私だけでしょうか?

大正時代の風刺絵かい

大正時代の風刺絵かい

今年の前半は家でパソコンを開かないようにしていたのですが、ここ最近、いろいろ事情があってパソコンをいじることが多くなっていたのでちょっとやめよーかなと思った出来事でした。

・・・そしたら、このブログどうなるんだろ???


1件のコメント »

Pocket WiFiを買ってしもうた

2009年12月13日 日曜日 22:06:01 by 会長(マリオネット)
カテゴリ: どうでもよい, 近況報告 / タグ:

皆様、日曜の夜をいかがお過ごしでしょうか?
毎度おなじみ、週末会長モノローグの時間がやってまいりました。

現在、パーソナリティーの喋り方に突っ込みを入れながらJ-WAVEを聞いて書いております。

表題のように、emobileのPocket WiFiを購入してしまいました。販促のネーチャンに聞くまでこれが何なのかさっぱり理解できなかったのですが、要は携帯無線ルータです。パソコンから無線LANでこいつにアクセスして、こいつがemobileと常時接続するという仕組みです。

ということで、普通のemobileと違って、使うときはカバンやコカンに忍ばせて、無線接続して使います。ということで、パソコンからは何も出っ張らず、出っ張るのはカバン、乃至はコカンです。アンテナが人体と接していると、ラジオみたいに通信が安定するかもしれませんので、コカンでなくてもズボンのポケットに入れて使うのが正解かもしれません。しかしまあ、世のモバイル野郎はさらに局部に電磁波を浴びることになるわけですが、大丈夫だろか?

下半身に身につけるデバイス。これが本当の(自粛)

速度は、まあまあそこそこなんですが、二人以上で同時に使えたり、linuxから簡単に使えたりと、なかなか重宝しそうです。今度の友の会飲みで、PC持ち込んだ人全員で接続してみると面白いかもしれません。

明日、電車の中でテストをヤッてきます。報告はまた来週!執筆途中のロボット展については、また再来週!それでは!

091213_1309~01

【サービスカット】帰り際、金ピカのCOACHのバックに執着する幼児。すまん。お父さんはこれから月5000円支出が増えるのでムリだ。ていうか最初からムリだ。


コメントはまだありません »

ホームページ更新しました。

2009年12月8日 火曜日 14:04:54 by kano
カテゴリ: 未分類 / タグ: , ,

takafu3くんの、「シェルとり」を「お題と投稿」コーナーに掲載しました。かわいらしい作品じゃあないですか。
http://usptomonokai.sakura.ne.jp/odai.00001.html
ちなみにtakahu3さんは、先日会計Kの策略にはめられて、河口湖でフルマラソンを走るという、罰ゲームに等しい仕打ちをうけたのにも関わらず、シェルをしっかり投稿してくれました。いい人だ!!

しかし、なさけない話ですが、ホームページ更新担当のKは、CGIが書けないため、いちいちHTMLを手打ちで更新しているのですが、これじゃ更新に時間がかかりすぎて、運用に耐えられません…。
どなかた、簡易なシェルだけで動くCMSとか、おすすめのものがありましたら、教えてくださいませ。


コメントはまだありません »

久々登場の副会長です。

やっと、新規会員の皆さんのユーザを追加しまして。
4ヶ月近くお待たせした方も居たのではなかろうかと。

結構、手間のかかる作業なんです。一人ひとり違うアイコンを出すようにするためには、アイコンを作らなければなりませんし、作ったアイコンがかぶらないようにしないといけません。
既に相当かぶってます。

でも、これで、役割は果たしました。
みなさん、良いお年を。


2件のコメント »

友の会サイトリニューアル

2009年11月30日 月曜日 19:18:27 by 会長(マリオネット)
カテゴリ: どうでもよい / タグ:

どぅお~も、会長です。ロボット展の話の途中ですが臨時ニュウスです。

会計兼HTML係様が友の会のサイト(このブログではなくて誰も見やしなかった公式サイト)をリニューアルしました。

文字が数十倍増えました。これからアラサガシをします。


コメントはまだありません »

国際ロボット展に行ってきた

2009年11月28日 土曜日 22:27:52 by 会長(マリオネット)
カテゴリ: 近況報告 / タグ: , , ,

どうも。かいちょうdeath。もう、このブログは私のモノローグですな・・・
もうすこし会員様に簡単にいたずら書きしてもらう仕組みを考えないといけません。いけませんだけではいけませんが。

会自体は、じわじわと勢力拡大中ですのでご心配なく。

本題。
今日はカミさんの仕事のお供と子供の散歩を兼ねて国際ロボット展@有明に行ってきました。会の皆さんも会計のK氏以外は理系野郎なんで興味があると思い、レポートします。

PB280230

図1:整列!溶接!強力伝!

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

PB280260

図2:実用型ピタゴラスイッチ

質問魔(図3)を置いて、気楽にうろうろしたところ・・・

衝撃の次回へ!(単に眠いので打ち切って後日書くだけ。)

PB280175

図3:システムとAGV間の通信方式と実装について細かく質問して説明担当者を困らせる母子


コメントはまだありません »