<?xml version="1.0" encoding="utf-8" ?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" 
			xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" 
			xmlns:cc="http://web.resource.org/cc/" xml:lang="ja">
<channel rdf:about="http://ahodory.blog124.fc2.com/?xml">
<title>Kittens flewby me</title>
<link>http://ahodory.blog124.fc2.com/</link>
<description>　　　　　　　自転車と本とJS</description>
<dc:language>ja</dc:language>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://ahodory.blog124.fc2.com/blog-entry-264.html" />
<rdf:li rdf:resource="http://ahodory.blog124.fc2.com/blog-entry-267.html" />
<rdf:li rdf:resource="http://ahodory.blog124.fc2.com/blog-entry-266.html" />
<rdf:li rdf:resource="http://ahodory.blog124.fc2.com/blog-entry-257.html" />
<rdf:li rdf:resource="http://ahodory.blog124.fc2.com/blog-entry-193.html" />
<rdf:li rdf:resource="http://ahodory.blog124.fc2.com/blog-entry-78.html" />
<rdf:li rdf:resource="http://ahodory.blog124.fc2.com/blog-entry-73.html" />
<rdf:li rdf:resource="http://ahodory.blog124.fc2.com/blog-entry-71.html" />
<rdf:li rdf:resource="http://ahodory.blog124.fc2.com/blog-entry-16.html" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://ahodory.blog124.fc2.com/blog-entry-264.html">
<link>http://ahodory.blog124.fc2.com/blog-entry-264.html</link>
<title>ＴＴＬマクロメーカー</title>
<description> マクロ生成ボタンを押すと、入力シェルのテキストをTeraTermのTTLマクロにします。
右側のシェルコマンドリストにあるものがTTLマクロに変換され、
それ以外はダンプします。






var fnames = {
  tejunLines : [],
  waitPrmpts : ''
}

function makeTTL(){
  for(var i=1, pstr=[]; i 254)
      dmp += lnum +'| '+ fnames.tejunLines[i] +'\n';
        lnum++;
  }
  return dmp ? msg + dmp +'\n\n' 
 </description>
<content:encoded>
<![CDATA[ マクロ生成ボタンを押すと、入力シェルのテキストをTeraTermのTTLマクロにします。<br />
右側のシェルコマンドリストにあるものがTTLマクロに変換され、
それ以外はダンプします。
<br />
<br />
<hr size="1" />
<br />

<script defer>
var fnames = {
  tejunLines : [],
  waitPrmpts : ''
}

function makeTTL(){
  for(var i=1, pstr=[]; i<4; i++) pstr.push(document.getElementById("prmpt" +i).value);

  fnames.waitPrmpts = pstr.join("' '");
  fnames.tejunLines = document.getElementById("indatarea").value.replace(
    /\r\n/g,'\n').replace(
    /\r/g,'\n').replace(
    /\n/g,'\r\n').replace(
    /\t/g,'    ').replace(
    /'/gm,"'#39'").replace(	//'
    /^(.+)&\s*$/gm,'$1\r\n').split('\r\n');

  var headerStr = "serverIP = '"+ document.getElementById("ip1").value +"'\r\n"+
  "UserName = '"+ document.getElementById("uid").value +"'\r\n"+
  "Password = '"+ document.getElementById("pss").value +"'\r\n"+
  "UsernamePrompt = '"+ document.getElementById("uidprompt").value +"'\r\n"+
  "PasswordPrompt = '"+ document.getElementById("pssprompt").value +"'\r\n"+
  "timeout = 0\r\n"+
  "connect serverIP\r\n"+
  "wait UsernamePrompt\r\n"+
  "sendln Username\r\n"+
  "wait PasswordPrompt\r\n"+
  "sendln Password\r\n"+
  "yesnobox '実行しますか？' 'TTLmaker'\r\n"+
  "if result=0 goto endSub\r\n"+
  "wait '"+ fnames.waitPrmpts +"'\r\n"+
  ";───────────────────\r\n";

  var trailStr = "\r\n;───────────────────\r\n"+
  "\r\ngoto endSub\r\n"+
  ":yesnoSub\r\n"+
  "    yesnobox '出力結果を確認して続行してください' logNm\r\n"+
  "    if result<1 then\r\n"+
  "        goto endSub\r\n"+
  "    else\r\n"+
  "        return\r\n"+
  "    endif\r\n"+
  ":endSub\r\n"+
  "    messagebox 'TTL終了' 'TTLmaker'\r\n"+
  "    sendln 'date'\r\n"+
  "    wait '"+ fnames.waitPrmpts +"'\r\n"+
  ";    logclose\r\n"+
  ";    closett\r\n"+
  ";    end\r\n";

  document.getElementById("dumparea").value ='';
  document.getElementById("outputarea").value ='';

  var dmp = chk256bytesLine();
      dmp += chkPromptStrInline();

  if(updateDumparea(dmp)) return;

  repCom();
  updateDumparea(chkExceptLines());

  $('#outputarea').val( headerStr + fnames.tejunLines.join('\r\n') + trailStr );
  $('#outputarea').toggle().fadeIn();
  document.getElementById("outputarea").select();
}
function chk256bytesLine()
{
  var msg ="255byteを超える行は使用できません\n\n";
  var dmp ='', lnum = 1;
  for(var i in fnames.tejunLines){
    if(bLen(fnames.tejunLines[i]) > 254)
      dmp += lnum +'| '+ fnames.tejunLines[i] +'\n';
        lnum++;
  }
  return dmp ? msg + dmp +'\n\n' : '';
}
function chkPromptStrInline()
{
  var msg ="waitプロンプト文字との重複がありました。動作できません。\n";
  var dmp ='', pstr = fnames.waitPrmpts.split("' '");
  for(var i in pstr){
    lnum = 1;
    for(var j in fnames.tejunLines){
      if(fnames.tejunLines[j].indexOf(pstr[i]) >= 0)
        dmp += lnum +'|'+ fnames.tejunLines[j].replace(/'#39'/g,"'") +'\n';
      lnum++;
    }
  }
  return dmp ? msg + dmp +'\n\n' : '';
}
function chkExceptLines()
{
  var msg ="以下の行は変換できません。送信しません。\n";
  var dmp ='', lnum = 1;
  for(var i in fnames.tejunLines){
    if(/^(wait|pause|call|messagebox|yesnobox|if result|;[^;])/.test(fnames.tejunLines[i])){
      fnames.tejunLines[i] = fnames.tejunLines[i].replace(/'#39'/g,"'");
      continue;
    }
    if(/^;;;/.test(fnames.tejunLines[i]))
      dmp += lnum +"|"+ fnames.tejunLines[i].replace(/^;;;/,'') +"\n";
    lnum++;
  }
  return dmp ? msg + dmp +'\n\n' : '';
}
function updateDumparea(dmp)
{
  if(!dmp) return false;
  $('#dumparea').val( dmp );
  document.getElementById("dumparea").rows = document.getElementById("dumparea").value.match( RegExp('\n', 'g')).length;
  return true;
}
function repCom()
{
  var cmds = document.getElementById("cmadsarea").value.replace(
    /\r\n/g,'\n').replace(
    /\r/g,'\n').split('\n');

  var cmd = [], rep = '', strtejun = fnames.tejunLines.join('\r\n');
  for(var i in cmds){
    cmd = cmds[i].split(/\t+/);
    if(/^(\/\/|\s|$)/.test(cmd[0])) continue;
    switch(cmd[1]){
    case '':
    case undefined:	rep ="sendln '$1'\r\nwait '"+ fnames.waitPrmpts +"'\r\n"; break;
    case 'notsend':	rep =''; break;
    default:		try{ rep = eval(cmd[1]) +'\r\n';
                                }catch(e){
                                  updateDumparea(e.description +'\n'+cmd[1])
                                  return;
                                }
    }
    strtejun = strtejun.replace( RegExp('^ *('+ cmd[0] +'.*)\r\n','gm'), rep);
  }
  strtejun = strtejun.replace(
    /^((?!(send|wait|pause|call|messagebox|yesnobox|if result|;)).+)\r\n/gm, ";;;$1\r\n"
  );
  fnames.tejunLines = strtejun.split('\r\n');
}
function bLen(s){
	var l = s.length, b = l;
	function isWide(c){ return(0x80 <= c &&(c <= 0xff60 || 0xffa0 <= c)) }
	for(i=0; i<l; i++) if(isWide(s.charCodeAt(i))) b++;
	return(b);
}

</script>

<div id="ttlmakerbody" style="float:left">
　入力シェルのテキスト　(行頭空白行はコメントアウト)<br />
<textarea id="indatarea" name="indatarea" cols='78' rows='15' title="入力テキスト">
■ここにTTL化したいスクリプトを貼り付けます。たとえば、

#コメント1
#コメント2
av=h
cat 'cygPathRep.sh' |gawk '{print '"$a"'}' |egrep "^."
while 1
  echo ""
end
nomatchcommand
yesnobox 'これで？' 'TTLメーカー'

</textarea>
</div>
<div id="cmdslist" style="float:right">
　コマンドリスト(タブ区切り)<br />
<textarea id="cmadsarea" name="cmadsarea" cols='40' rows='15' title="コマンドリスト">
//コメント行
[#*※○●◎■□◆◇△▲▽▼]	"sendln 'echo '#39'$1'#39' >/dev/null'\r\nwait '"+ fnames.waitPrmpts +"'"

//shell
\\
\/
\$
\@
for
foreach
while
end
done
eval
source
if
endif


//bash
declare
local

//sh
fi
//csh
set

//cmd,ポプアップ有り1
znew
zmore
zless
zipinfo
zipgrep
zgrep
zforce
zfgrep
zegrep
zdiff
zcmp
zcat
ysh
yacc
xzmore
xzless
xzgrep
xzfgrep
xzegrep
xzdiff
xzdec
xzcmp
xzcat
xz
xsubpp
xsltproc
xmlwf
xmllint
xmlcatalog
xmkmf
xgettext
xdelta
xargs
wrjpgcom
wish
windres
windmc
whoami
who
which
whereis
whatis
wget
wftopfa
wc
wall
vdir
uuidgen
users
updatedb
unzipsfx
unzip
unxz
unwrapdiff
unprotoize
unlzma
unlink
unix2dos
uniq
unifdef
unexpand
uncompress
uname
umount
ul
uconv
u2d
tty
tsort
true
troff
tr
touch
tftp
tfmtodit
textcat
texindex
testrb
testlibusb
test
telnet
tee
tcsh
tclsh
tbl
tar
talk
tailor
tailf
tail
tac
sync
swig
svnversion
svnsync
svnserve
svnlook
svndumpfilter
svnadmin
svn
sum
sudoku
su
stty
strip
strings
strace
stg
stat
ssp
sprut
splitdiff
split
splint
splain
sort
soelim
smtpd.py
sleep
size
shuf
shred
shmtool
shilka
sh
setsid
setmetamode
setfacl
seq
semtool
semstat
sed
sdiff
scriptreplay
script
scandeps
s2p
runtest
runcon
run
rubyw
ruby
rsync
robohdrs
robodoc
rmiregistry
rmic
rmdir
rm
rlversion
rltest
rlcat
rl
ri
revpath
rev
renice
rename
regtool
refer
rediff
recountdiff
rebaseall
rebase
realpath
readshortcut
readlink
readelf
rdx
rdoc
rdjpgcom
rdflib
rdfdump
rdf2ihx
rdf2com
rdf2bin
rcsmerge
rcsdiff
rcsclean
rcs2log
rcs
rcp
rats
ranlib
quilt
python
pyrexc
pydoc
pwd
pv.sh
putclip
ptx
ptee
ptardiff
ptar
pstruct
psed
ps2ps
ps2pdfwr
ps2pdf
ps2epsi
ps2ascii
ps
prove
protoize
printf
printenv
printafm
pr
podselect
podchecker
pod_cover
pod2usage
pod2text
pod2man
pod2latex
pod2html
plrc
plld
pl2pm
pl
pkgdata
pinky
piconv
pic2graph
pic
pgawk
pg_config
pg
pfbtops
pfbtopfa
pf2afm
perlthanks
perlivp
perldoc
perlbug
perl
peflagsall
peflags
pdftexi2dvi
pdfroff
pdfopt
pdf2ps
pdf2dsc
pcretest
pcregrep
pbmtojbg
pathchk
patch.manifest
patch
paste
passwd
osx
ospent
ospcat
ospam
osgmlnorm
openssl
openjade
onsgmls
oldfind
oka
od
ocpp
ocamlyacc
ocamlrun
ocamlprof
ocamlopt.opt
ocamlopt
ocamlmktop
ocamlmklib
ocamllex.opt
ocamllex
ocamldoc.opt
ocamldoc
ocamldep.opt
ocamldep
ocamldebug
ocamlcp
ocamlc.opt
ocamlc
ocamlbrowser
ocaml
objdump
objcopy
nroff
nona
nohup
nm
nl
nice
ngettext
neqn
ndisasm
nasm
namei
mv
mtnopt
mtn
msta
msguniq
msgunfmt
msgtool
msgmerge
msginit
msggrep
msgfmt
msgfilter
msgexec
msgen
msgconv
msgcomm
msgcmp
msgcat
msgattrib
mount
more
mmroff
mlcscope
mktemp
mkshortcut
mkpasswd
mknod
mkhtmlindex
mkgroup
mkfifo
mkdirhier
mkdir
mkcramfs
mkcamlp4
mk_cmds
mergelib
merge
md5sum
mcookie
manpath
manlint
mandelbrot
man2html
man2dvi
man
makeinfo
makeg
makedepend
makeconv
make
lzmore
lzmadec
lzma
lzless
lzgrep
lzfgrep
lzegrep
lzdiff
lzcmp
lzcat
lsdiff
lsattr
ls
lprsetup.sh
lpr
lookbib
look
logname
login
logger
locate
lndir
ln
lkbib
link
line
libtoolize
libtool
libnetcfg
lesskey
lessecho
less
ldrdf
ld
labltk
lablgtk2
lablgladecc2
kill
jpegtran
jpegexiforient
join
jlint.sh
jlint
jikes
jbgtopbm
jar
isosize
irb
ipcs
ipcrm
ipck
ioperm.sys
ioperm
intltoolize
interdiff
instmodsh
install.manifest
install
insight
infokey
info
indxbib
indent
imake
igawk
ifnames
idle
ident
id
iconv
htpasswd2
htdigest2
htdbm2
htcacheclean2
hpftodit
hostname
hostid
histexamp
hg
hexdump
help2man
head
h2xs
h2ph
gzip
gzexe
gunzip
guilt
guile
guards
gtkdocize
gsnd
gslp
gslj
gsdj
gsbj
gs
groups
grotty
grops
grolj4
grolbp
grog
groffer
groff
grodvi
grn
grepjar
grepdiff
grep
grap2graph
gprof
gprcmd
gpr2make
gpidump
gperf
gpc
gnatxref
gnatprep
gnatname
gnatmake
gnatls
gnatlink
gnatkr
gnatfind
gnatclean
gnatchop
gnatbl
gnatbind
gnat
glpuzzle
gkill
gitk
git
gij
gfortran
gettextize
gettext.sh
gettext
getopt
getfacl
getclip
genrb
genctd
gencnval
gencat
genbrk
gdiffmk
gdc
gdbtui
gdbserver
gdb
gcov
gcjh
gcj
gccmakedep
gcc
gawk
g\+\+
g77
funzip
ftp
font2c
fold
fmt
fluid
flock
flipdiff
flex
fixmswrd.pl
fixcvsdiff
find2perl
find
filterdiff
fileman
file
fgrep
false
factor
f77
expr
expect
expand
exifautotran
etags
espdiff
erb
eqn2graph
eqn
eps2eps
envsubst
env
enc2xs
egrep
editrights
editdiff
echo
e2fsimage
dvipdf
dumpsexp
dumphint
dumper
dump
du
dprofpp
dpatch
doxytag
doxygen
dos2unix
dmalloc
dllwrap
dlltool
djpeg
distccd
distcc
dirname
dircolors
dir
dino
diffstat
diff3
diff
df
derb
dehtmldiff
ddd
ddate
dd
dbmmanage2
date
d2u
cygz.dll
cygterm.cfg
cygterm
cygstart
cygrunsrv
cygpq.dll
cygport
cygpath
cygminires.dll
cygjvm.dll
cyghttpd2core.dll
cyggit.dll
cyggcc_s.dll
cygecpg_compat.dll
cygcheck
cvsu
cvstrim
cvspurge
cvsps
cvsdo
cvsdiscard
cvsco
cvschroot
cvsbug
cvs2svn
cvs
cut
curl
ctest
ctags
csplit
csi
csh
csc
crypt
createfp
crc32
cramfsck
cpp
cpio
cpantest
cpansign
cpanp
cpan2dist
cpan
cpack
cp
corelist
conv
config_data
compile_et
comm
combinediff
column
colrm
colorgcc
colcrt
col
co
cmp
cmake
clisp
cleanlinks
cksum
cjpeg
ci
chroot
chown
chmod
chkdupexe
chicken
chgrp
checkers
chcon
chattr
cg
cdvupgrade
cdvserver
cdvpasswd
cdv
ccmakedep
ccmake
ccdoc
ccache
cc
cat
camlp4
cal
c_rehash
c\+\+
c2ph
bzr
bzmore
bzless
bzip2recover
bzip2
bzgrep
bzfgrep
bzegrep
bzdiff
bzcmp
bzcat
byacc
bunzip2
blocks
bison
binobj
bdftops
bashdb
bashbug
bash
basename
base64
banner
awk
autoupdate
autoscan
autoreconf
autopoint
automake
autom4te
autoheader
autoconf
astyle
ash
asciidoc
ascii
as
arch
ar
apropos
antic
afmtodit
addr2name.awk
addr2line
addftinfo
aclocal
a2x
a2p
	rsh
	rlogin
	rlog

//awk
print

//sh,bash変数
[A-Za-z_][A-Za-z_0-9]*=.

//TTL関数
send #10	"$1\r\nwait '"+ fnames.waitPrmpts +"'"
yesnobox	"$1\r\nif result=0 goto endSub"
	
</textarea>
</div>

<br />

<div style="float:left">

<div>
Host: <input type=text id=ip1 value='10.1.1.1' title="接続するIPアドレスまたはドメイン名" />
 Shell wait prompts: <input type=text id='prmpt1' class=prmpt size=2 value='$ ' title="行を送信後待ち受けるシェルプロンプト文字列" /><input type=text id='prmpt2' class=prmpt size=2 value='}% ' title="行を送信後待ち受けるシェルプロンプト文字列" /><input type=text id='prmpt3' class=prmpt size=2 value='? ' title="行を送信後待ち受けるシェルプロンプト文字列" />
</div>

<div><input type=text id=uidprompt size=10 value="login:" title="ユーザ名プロンプトの文字列" /><input type=text id=uid title="ログインID設定" /></div>

<div><input type=text id=pssprompt size=10 value="password:" title="パスワードプロンプトの文字列" /><input type=password id=pss ="パスワード設定" /></div>


<button id=makettl onClick="makeTTL();">マクロ作成</button>
</div>


<textarea id="dumparea" name="dumparea" cols='120' rows='2' title="">マクロ変換時に除外された行が表示されます</textarea>
<textarea id="outputarea" name="outputarea" cols='120' rows='20' title="">出力マクロデータ。
拡張子TTLのファイルにコピペしてください</textarea>

<!--script>indatarea.select();</script-->
 ]]>
</content:encoded>
<dc:subject>TTLメーカー</dc:subject>
<dc:date>2009-10-04T13:46:28+09:00</dc:date>
<dc:creator>笹部 政宏</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://ahodory.blog124.fc2.com/blog-entry-267.html">
<link>http://ahodory.blog124.fc2.com/blog-entry-267.html</link>
<title>偶数か奇数かで引用符を切り替える</title>
<description> ※引用符はASCII コードで指定すれば、下のようなことをする必要はありません。アホとハサミは使いようというか、アホにハサミを持たせてはいけませんね！というわけでTTLメーカーサンプルを見てください。複数の引用符が連なる行をTTLマクロで自動送信するの続き。1重引用符と2重引用符の両方を含むこのようなコマンド行。echo &quot;$MJ&quot; |grep 'we' |egrep &quot;[MJ]&quot;まず、先に来ない方の引用符（この例では「'」）で区切った配列にする
 </description>
<content:encoded>
<![CDATA[ ※引用符はASCII コードで指定すれば、下のようなことをする必要はありません。<br />アホとハサミは使いようというか、アホにハサミを持たせてはいけませんね！<br />というわけで<a href="http://ahodory.blog124.fc2.com/blog-category-2.html" target="_blank">TTLメーカー</a>サンプルを見てください。<br /><br /><hr size="1" /><br /><a href="http://ahodory.blog124.fc2.com/blog-entry-266.html" target="_blank">複数の引用符が連なる行をTTLマクロで自動送信する</a>の続き。<br /><br />1重引用符と2重引用符の両方を含むこのようなコマンド行。<br /><pre><span style="color:#ff0000">echo "$MJ" |grep 'we' |egrep "[MJ]"</span></pre><br />まず、先に来ない方の引用符（この例では「'」）で区切った配列にするとこうなる。 *1<br /><pre>0| echo "$MJ" |grep <br />1| we<br />2|  |egrep "[MJ]"<br /></pre>　*1: ふつうsplit関数やメソッドは区切り文字は削除して返すので、we の左右の引用符はなくなる。<br /><br />それらを、配列の区切り文字に使ったその引用符で囲むとこうなる。<br /><pre>0| 'echo "$MJ" |grep '<br />1| 'we'<br />2| ' |egrep "[MJ]"'<br /></pre>この時点で、重複しない引用符で囲っての文字列リテラルとなっている。<br />ただし、もとの文字列の 'we' の「'」はつけ直す必要がある。あとは、配列インデックスが奇数のときに、そのさらに外側を「'」には「"」で、「"」には「'」で囲んでやればいい！　*2<br /><br />先頭にteratermマクロ関数の「send」と、最後にLFの#10も加えてTTLマクロになった結果は、<br /><pre>send 'echo "$MJ" |grep '<br />send "'we'"<br />send '  |egrep "[MJ]"'<br />send #10<br /></pre><br />デモは<a href="http://ahodory.blog124.fc2.com/blog-entry-264.html" target="_blank">ＴＴＬマクロメーカー</a><br />ソースのサンプル。先にあるのが「'」なら「"」を、「"」なら「'」を返すような関数を用意しておいて、<br /><pre>function qType(s){<br />  var sq = s.indexOf("'");<br />  var dq = s.indexOf('"');<br />  if((sq == -1)&&(dq == -1)) return "'";<br />  if(sq == -1) return "'";<br />  if(dq == -1) return '"';<br />  if(sq < dq) return '"';<br />}</pre>配列で回す。<br /><pre>var q = qType(s);<br />var array_s = s.split(q);<br />var qq = (q =="'") ? '"' : "'";<br />for(var k=0; k < array_s ; k++){<br />  if(!array_s[k]) continue;<br />  if(k % 2 == 0)  rep +='send '+q+ array_s[k] +q+"\r\n";<br />  else            rep +='send '+qq+q+ array_s[k] +q+qq+"\r\n";<br />}<br />rep += 'send #10;<br /></pre><br /><br />*2: シェルでそういう使い方が必要な時があるとするならば、行の最初に見つかった引用符が後ろでネストして使われているとだめ。たとえば、「echo "$MJ" |grep 'a"$b"c'」 ]]>
</content:encoded>
<dc:subject>TTLメーカー</dc:subject>
<dc:date>2009-09-27T15:59:59+09:00</dc:date>
<dc:creator>笹部 政宏</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://ahodory.blog124.fc2.com/blog-entry-266.html">
<link>http://ahodory.blog124.fc2.com/blog-entry-266.html</link>
<title>複数の引用符が連なる行をTTLマクロで自動送信する</title>
<description> ※引用符はASCII コードで指定すれば、下のようなことをする必要はありません。アホとハサミは使いようというか、アホにハサミを持たせてはいけませんね！というわけでTTLメーカーサンプルを見てください。シェルコマンド行をTeratermマクロで自動実行するには、sendln関数に文字列を渡して記述する。echo &quot;Michael Jackson knows we sad. but we can not heal him&quot;であれば、マクロファイルには次のように書く。sendln 'echo &quot;Mich
 </description>
<content:encoded>
<![CDATA[ ※引用符はASCII コードで指定すれば、下のようなことをする必要はありません。<br />アホとハサミは使いようというか、アホにハサミを持たせてはいけませんね！<br />というわけで<a href="http://ahodory.blog124.fc2.com/blog-category-2.html" target="_blank">TTLメーカー</a>サンプルを見てください。<br /><br /><hr size="1" /><br />シェルコマンド行をTeratermマクロで自動実行するには、sendln関数に文字列を渡して記述する。<br /><pre><span style="color:#0000ff">echo "Michael Jackson knows we sad. but we can not heal him"</span></pre><br />であれば、マクロファイルには次のように書く。<br /><pre>sendln '<span style="color:#0000ff">echo "Michael Jackson knows we sad. but we can not heal him"</span>'</pre><br />ここで気をつけるのは引用符だ。<br /><pre>sendln <span style="color:#ff0000">"echo "</span>Michael Jackson knows we sad. but we can not heal him""</pre>と書くと、マクロは<span style="color:#ff0000">"echo "</span>の後ろの二重引用符を文字列リテラルの終了と解釈するので、それに続くMichael～はマクロソースとして解釈できませんという構文エラーになる。<br /><br />リテラルとはソースコード中の定数のことで、多くの言語では文字列を引用符で囲んで範囲を指定する。TTLマクロも「'」と「"」を使用するので、上の問題が起こらないように使用する。<br /><br />しかし、下のように1行内に両方の引用符が使われているケースでは、<br /><pre>MJ="Michael Jackson knows we sad. but we can not heal him"<br />echo <span style="color:#0000ff">"</span>$MJ<span style="color:#0000ff">"</span> |grep <span style="color:#ff0000">'</span>we<span style="color:#ff0000">'</span> |egrep <span style="color:#0000ff">"</span>[MJ]<span style="color:#0000ff">"</span></pre><pre>sendln <span style="color:#ff0000"><strong>'</strong></span>echo "$MJ" |grep 'we' |egrep "[MJ]"<span style="color:#ff0000"><strong>'</strong></span></pre>sendlnに渡す文字列の範囲を指定しようがなくなるので使えなくなってしまう。<br /><br />こういうときは、文字列に改行文字を付加しないもう一つの関数、sendを使って下のように書けば大丈夫だ。<br /><pre>send 'echo "$MJ" |grep '<br />send "'we'"<br />send ' |egrep "[MJ]"'<br />send #10</pre>最後の#10は改行のLFで、TeraTerm画面上では元のコマンドそのままに<br /><pre>echo "$MJ" |grep 'we' |egrep "[MJ]"</pre>と実行される。<br />しかし、こんなことを手でシコシコやっていては日が暮れてしまう。自動化する方法はないか？ということで作ってみた。面白かったのは、文字列を引用符ごとに切った配列のインデックスが偶数か奇数かどうかでsendで使うべき引用符が「'」と「"」のどっちを使うのか処理できてしまうところだった。というわけで<a href="http://ahodory.blog124.fc2.com/blog-entry-267.html" target="_blank" title="続きは次回">続きは次回</a>。<br /><br /> ]]>
</content:encoded>
<dc:subject>TTLメーカー</dc:subject>
<dc:date>2009-09-27T15:59:26+09:00</dc:date>
<dc:creator>笹部 政宏</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://ahodory.blog124.fc2.com/blog-entry-257.html">
<link>http://ahodory.blog124.fc2.com/blog-entry-257.html</link>
<title>ttler → TTLメーカーにリニューアル中</title>
<description> という、引用符が連続したりネストしているコマンドをTTLマクロで送信したい。TTLマクロファイルでsend関数ないしsendln関数にパラメタとして渡すには文字列全体を引用符で囲まなければならないが、そうすると「'」でも「&quot;」でも囲む範囲の開始と終了がずれるのでマクロエラーになる。ならばマクロファイル化するときに自動的に複数行に分解してしまおうという発想で、出力結果はこんな感じ。サンプルソースはこんな感じ。var sfs 
 </description>
<content:encoded>
<![CDATA[ <img src="http://blog-imgs-29.fc2.com/a/h/o/ahodory/ttlinputfile.png" alt="ttlinputfile.png" border="0" width="560" height="119" /><br />という、引用符が連続したりネストしているコマンドをTTLマクロで送信したい。<br /><br />TTLマクロファイルでsend関数ないしsendln関数にパラメタとして渡すには文字列全体を引用符で囲まなければならないが、そうすると「'」でも「"」でも囲む範囲の開始と終了がずれるのでマクロエラーになる。<br /><br />ならばマクロファイル化するときに自動的に複数行に分解してしまおうという発想で、<br />出力結果はこんな感じ。<br /><img src="http://blog-imgs-29.fc2.com/a/h/o/ahodory/ttl_outputsamp.png" alt="ttl_outputsamp.png" border="0" width="300" height="155" /><br /><br />サンプルソースはこんな感じ。<br /><pre>var sfs = new ActiveXObject("Scripting.FileSystemObject");<br />var s = sfs.GetFile("ab.txt").OpenAsTextStream(1);<br />var f = s.ReadAll();s.Close();</pre>　　ファイルを読んで閉じてから、<br /><pre>var q = qType(f);<br />var ar = f.split(q);<br />var arlen = ar.length;<br />if(arlen ==1) document.write(ar);<br />else{<br />  var qq ;<br />  for(var i=0; i < arlen ; i++){<br />    ar[i] = /['"]/.test(ar[i]) ? ar[i] : q+ ar[i] +q;<br />    qq = qType(ar[i]);<br />    qq = (q != qq) ? qq : q;<br />    document.write("send "+ qq + ar[i] + qq +"&lt;br&gt;");<br />    if(i == arlen-1) document.write("send #10");<br />  }<br />}<br />function qType(s)<br />{<br />  var dq = s.indexOf('"');<br />  var sq = s.indexOf("'");<br />  var iq = "'";<br />  if(sq != -1){<br />    if(dq == -1) iq = '"';<br />    else if(sq < dq) iq = '"';<br />  }<br />  return iq;<br />}</pre><br /> ]]>
</content:encoded>
<dc:subject>TTLメーカー</dc:subject>
<dc:date>2009-06-17T00:53:34+09:00</dc:date>
<dc:creator>笹部 政宏</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://ahodory.blog124.fc2.com/blog-entry-193.html">
<link>http://ahodory.blog124.fc2.com/blog-entry-193.html</link>
<title>Teratermマクロの引用符を入れ子する、について</title>
<description> 追記：下のように考えなくても引用符はASCIIコードでリテラルの引用符と重複しませんでした。&quot;なら#34、'なら#39です。マクロ文はTTLマクロメーカーで確認できます。ベクターから毎月メールでダウンロード数が送られてくるが、先月はttlerが50くらいあった。いろんな環境でテストもしていないオモチャなので、そもそも動作しないという人の方が多い気もする。当初から気になっていた点には手をいれてみた。バージョンは0.2。たとえ
 </description>
<content:encoded>
<![CDATA[ 追記：下のように考えなくても引用符はASCIIコードでリテラルの引用符と重複しませんでした。<br />"なら#34、'なら#39です。マクロ文は<a href="http://ahodory.blog124.fc2.com/blog-entry-264.html" target="_blank" title="マクロメーカーをつくりました。">TTLマクロメーカー</a>で確認できます。<br /><br /><hr size="1" />ベクターから毎月メールでダウンロード数が送られてくるが、先月はttlerが50くらいあった。<br />いろんな環境でテストもしていないオモチャなので、そもそも動作しないという人の方が多い気もする。当初から気になっていた点には手をいれてみた。バージョンは0.2。<br /><br />たとえばttlのsendlnコマンドなどに文字列を渡す場合、引用符で囲む。<br />しかし、その文字列内に同じ引用符を含む場合、そこで引用符の挟みが終了してしまい、残りの文字列が処理できないとしてエラーになってしまう。<br />またUNIXシェルでは一般に" "なら変数を展開し、' 'ならしないといった違いがある。<br /><br />通常なら' 'と" "とを使い分けて入れ子にしてこれを回避する。たとえば<pre>cat "$BIN"/aho.txt<br />cat $BIN/aho.txt |awk '{print}'</pre>　というコマンドを実行したい場合、このようにする。<pre>sendln <font color=red>'</font>cat "$BIN"/aho.txt<font color=red>'</font><br />sendln <font color=red>"</font>cat $BIN/aho.txt |awk '{print}'<font color=red>"</font></pre><br />問題は、ttlerで自動作成する場合、どちらの引用符を使うかを行から判別しなければならないところ。<br />判別方法は、行の最初に見つかった引用符がどちらかで、それと違う引用符をつけるということにした。（これまではデータを変数にいれてRegExpで一括置換していたので、これに行ループを入れなければならなくなったので遅くなってしまった）<br /><br />しかも、<pre>cat "$BIN"/aho.txt |awk '{print}'</pre>　などという行になると下のようになってもうだめぽ。<pre><font color=red>'</font>cat "$BIN"/aho.txt |awk '{print}'<font color=red>'</font></pre>そもそもttlで実行できない書き方なので、限界といえば限界かもしれない。<br /><br />ちなみにこういう場合は、一行目の改行文字をエスケープして2行に書き、<pre>cat "$BIN"/aho.txt | \<br />awk '{print}'</pre>とすれば大丈夫なはず。<br /><br /> ]]>
</content:encoded>
<dc:subject>TTLメーカー</dc:subject>
<dc:date>2009-02-07T19:34:01+09:00</dc:date>
<dc:creator>笹部 政宏</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://ahodory.blog124.fc2.com/blog-entry-78.html">
<link>http://ahodory.blog124.fc2.com/blog-entry-78.html</link>
<title>ttler.htaベクター送付</title>
<description> 機能追加はいくつか考えたものの、環境に依存するので0.01のまんま。mirrorManのときに説明書がないとダメといわれた記憶があったのだが、今回も忘れたｗ
 </description>
<content:encoded>
<![CDATA[ 機能追加はいくつか考えたものの、環境に依存するので0.01のまんま。<br /><br />mirrorManのときに説明書がないとダメといわれた記憶があったのだが、今回も忘れたｗ ]]>
</content:encoded>
<dc:subject>TTLメーカー</dc:subject>
<dc:date>2008-09-27T19:12:14+09:00</dc:date>
<dc:creator>笹部 政宏</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://ahodory.blog124.fc2.com/blog-entry-73.html">
<link>http://ahodory.blog124.fc2.com/blog-entry-73.html</link>
<title>ttler.hta 0.01版</title>
<description> とりあえずcygwinに接続して動いたもの。実行可コマンドのリスト。commands.iniファイル//cmd,ポプアップ有り1awknawkbashcat	1rm	1cd・・・タブ区切りで２つめに1を設定すると、ポップアップでマクロの続行を問い合わせ。あまちがった、とかまずいというときは「いいえ」を選択すれば、そこでマクロ終了。でこんな感じのテキストファイルを実行してsleep 2cshcat test.txtecho &quot;smp1&quot; &gt; test.txtecho &quot;smp2&quot; &gt;&gt; test.txtls -l tes
 </description>
<content:encoded>
<![CDATA[ とりあえずcygwinに接続して動いたもの。<br /><img src="http://blog-imgs-30.fc2.com/a/h/o/ahodory/ttler0010.png" alt="ttler001" border="0" /><br /><br />実行可コマンドのリスト。commands.iniファイル<pre>//cmd,ポプアップ有り1<br />awk<br />nawk<br />bash<br />cat	1<br />rm	1<br />cd<br />・・・<br /></pre>タブ区切りで２つめに1を設定すると、ポップアップでマクロの続行を問い合わせ。<br />あまちがった、とかまずいというときは「いいえ」を選択すれば、そこでマクロ終了。<br /><img src="http://blog-imgs-30.fc2.com/a/h/o/ahodory/continuePop.png" alt="continuePop.png" border="0" /><br /><br />でこんな感じのテキストファイルを実行して<pre>sleep 2<br />csh<br />cat test.txt<br />echo "smp1" > test.txt<br />echo "smp2" >> test.txt<br />ls -l test.txt<br />cat test.txt<br />rm -f cat test.txt<br />sample improper command line</pre>２回目のcatコマンドのポップアップで「いいえ」するとこんな具合<br /><img src="http://blog-imgs-30.fc2.com/a/h/o/ahodory/ttlcapture0.png" alt="ttlcapture0.png" border="0" /><br /><br />マクロファイル。「sample improper command line」の行は実行しないようにコメントアウト<pre>serverIP = '10.1.68.104'<br />UserName = 'uid'<br />Password = 'pss'<br />UsernamePrompt = 'login:'<br />PasswordPrompt = 'Password:'<br />timeout = 0<br />show 0<br />;──┐<br />;接続│<br />;──┘cygconnect<br />connect serverIP<br />wait UsernamePrompt<br />sendln Username<br />wait PasswordPrompt<br />sendln Password<br />;────┐<br />;ログ出力│<br />;────┘<br />logPath = 'C:\Users\b\Desktop\'<br />logNm = 'test.log'<br />strconcat logPath logNm<br />logopen logPath 0 0<br />settitle logNm<br />;─────┐<br />;実行前確認│<br />;─────┘<br />yesnobox '実行しますか？' logNm<br />if result=0 goto endSub<br />wait '}%' '$ '<br />sendln 'who am i;date'<br />wait '}%' '$ '<br />sendln 'sleep 2'<br />wait '}%' '$ ' '? '<br />sendln 'csh'<br />wait '}%' '$ ' '? '<br />sendln 'cat test.txt'<br />call yesnoSub<br />wait '}%' '$ ' '? '<br />sendln 'echo "smp1" > test.txt'<br />wait '}%' '$ ' '? '<br />sendln 'echo "smp2" >> test.txt'<br />wait '}%' '$ ' '? '<br />sendln 'ls -l test.txt'<br />wait '}%' '$ ' '? '<br />sendln 'cat test.txt'<br />call yesnoSub<br />wait '}%' '$ ' '? '<br />sendln 'rm -f cat test.txt'<br />wait '}%' '$ ' '? '<br />;;;sample improper command line<br />goto endSub<br />:strScanE<br />    ;wait #10<br />    recvln<br />    strscan inputstr '。'<br />    if result>1 call alertSub<br />    wait '}%' '$ ' '? '<br />return<br />:yesnoSub<br />    yesnobox '出力結果を確認して続行してください' logNm<br />    if result<1 then<br />        goto endSub<br />    else<br />        return<br />endif<br />:endSub<br />    messagebox 'TTL終了' logNm<br />    sendln 'date'<br />    wait '}%' '$ '</pre><br /> ]]>
</content:encoded>
<dc:subject>TTLメーカー</dc:subject>
<dc:date>2008-09-21T01:39:00+09:00</dc:date>
<dc:creator>笹部 政宏</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://ahodory.blog124.fc2.com/blog-entry-71.html">
<link>http://ahodory.blog124.fc2.com/blog-entry-71.html</link>
<title>ttler.hta - 画面ガラ</title>
<description> UNIXシェル環境で定期作業をする場合、Teratermマクロで自動化するのはよく見られる。ただし一時的な定例作業の場合、それをマクロファイル化する手間とのトレードが微妙になる場合がある。何回も使うわけじゃないし、かといって毎回手作業でコマンドを列挙したテキストファイルからteratermのコンソールにコピペするのも面倒、もしコマンドを列挙したファイルをそのまま自動で実行できれば。そういう場合、teratermマクロにはファ
 </description>
<content:encoded>
<![CDATA[ UNIXシェル環境で定期作業をする場合、Teratermマクロで自動化するのはよく見られる。ただし一時的な定例作業の場合、それをマクロファイル化する手間とのトレードが微妙になる場合がある。<br />何回も使うわけじゃないし、かといって毎回手作業でコマンドを列挙したテキストファイルからteratermのコンソールにコピペするのも面倒、もしコマンドを列挙したファイルをそのまま自動で実行できれば。そういう場合、teratermマクロにはファイルI/Oの関数も用意されている。<br />ただしこの場合、どんなコマンドであれ無条件に実行して突き進んでいってしまい、それが危険なケースだった場合、運用のリスクが高い。<br />それならば、実行できるコマンドをあらかじめ登録したもののみにし、それ以外の記述は全部除外してTTLマクロファイル化するようなツールがほしい、さらに、コマンド別にポップアップ表示やループ制御文を記述することができれば、幅広く使えるツールになるかも・・・<br /><br />というわけで仕事で使っているそれを汎用化しようというのがこの休みの目標。<br /><br />だが、進捗はまだ３割ほどだ。やばし。<br /><br /><img src="http://blog-imgs-30.fc2.com/a/h/o/ahodory/ttler000s.png" pbsrc="http://blog-imgs-30.fc2.com/a/h/o/ahodory/ttler000.png" class="PopBoxImageSmall" onclick="Pop(this,50,'PopBoxImageLarge');" /><br /><br />メインのとこ<pre>while(!inif.AtEndOfStream){<br />  a = inif.ReadLine().split(/\t+/);<br />  if(/^\/\/|^$/.test(a[0])) continue;<br />  g=g.replace(new RegExp(<br />       "^("+a[0]+".*)\r\n","mg"),<br />       "sendln '$1'\r\nwait '}%' '$ ' '? ' '> '\r\n"<br />     );<br />}</pre>INIファイルに<pre>ls</pre>の行があれば、<br />たとえば<pre>ls hoge<br />ls -lr hoge<br /></pre>と書いてあるファイルが<br /><pre>sendln 'ls hoge'<br />wait '}%' '$ ' '? ' '> '<br />sendln 'ls -lr hoge'<br />wait '}%' '$ ' '? ' '> '</pre>というTTLファイルを作成する。<br /><br />さて、汎用的な環境での動作確認をどうするか。最新のteratermではcygwin接続があるものの、ログイン制御とか、linuxtとかsolalisならではのコマンドとか、ああめんどくさい。予想通りのつまづきだ。 ]]>
</content:encoded>
<dc:subject>TTLメーカー</dc:subject>
<dc:date>2008-09-20T00:27:28+09:00</dc:date>
<dc:creator>笹部 政宏</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
<item rdf:about="http://ahodory.blog124.fc2.com/blog-entry-16.html">
<link>http://ahodory.blog124.fc2.com/blog-entry-16.html</link>
<title>ttlMaker.hta</title>
<description> UNIXシェルのコマンドを列挙した任意のファイルをTeraTermマクロファイルに変換するhtaを作成する。というわけでソフトの名前を決めて、ブログカテゴリを作成した。職場で作って使っているものはすでにあるものの、ソースは持ち出すことができないし、まずもって汎用環境で使用できるものとなると話は別だ。目標地点はmirrorManと同じくVectorサイトでダウンロードランキング(カテゴリ別)1ページ目そして雑誌掲載！
 </description>
<content:encoded>
<![CDATA[ UNIXシェルのコマンドを列挙した任意のファイルをTeraTermマクロファイルに変換するhtaを作成する。<br />というわけでソフトの名前を決めて、ブログカテゴリを作成した。<br /><br />職場で作って使っているものはすでにあるものの、ソースは持ち出すことができないし、<br />まずもって汎用環境で使用できるものとなると話は別だ。<br /><br />目標地点はmirrorManと同じくVectorサイトでダウンロードランキング(カテゴリ別)1ページ目そして雑誌掲載！<br /><br /> ]]>
</content:encoded>
<dc:subject>TTLメーカー</dc:subject>
<dc:date>2008-07-10T23:13:13+09:00</dc:date>
<dc:creator>笹部 政宏</dc:creator>
<dc:publisher>FC2-BLOG</dc:publisher>
</item>
</rdf:RDF>