このブログを検索

2021/07/29

tera termマクロでshow tech-support取得するときの問題

 cisco機器の show tech-supportをいくつも取るというケースがよくある。

そのとき tera termのマクロを作って自動化しようとしたが、

いろいろとうまくいかないことがある。


今回対応したのは以下の2点である。


1.ログの自動取得ができない。

2.意図しないところで中断してしまう。


1. ログの自動取得ができない

tera termマクロではログ取得のコマンドがあるが、tera term自体の設定でログを自動取得する設定にしている場合、ひと手間かけないと設定によるログ取得が優先されてコマンドによるログ取得ができない。

多分そうだろうな、とは思っていたのだが、自動取得されたログを使えばいいのでそのままにしていたのだが、やっぱりログファイル名を「hostname_show_tech-support」とかにしたくて調べたら簡単にできた。

logを取得するコマンドは logopenである。

logfilenameという変数にログファイル名が設定されているとき、

logopen logfilename 0 0

とすればよい。二つのゼロの引数は、binary flagとappend flagである。

0 0 の場合asciiモードで上書きである。


そして、このコマンドを実行したときにすでにログが取得されている場合、

つまりtera termの設定でログの自動取得が有効になっている場合、

このコマンドは実行されないようである。


tera termの設定を変更して自動ログ取得を無効にすることはしたくない。

この場合、loginfoというコマンドを使うと、現在のログ取得状態がわかる。

loginfo logname

このように実行するとlognameに現在取得中のログファイル名が格納され、

 resultにログ取得時のフラグが格納される。

そしてログが取得されていない場合は resultに -1 が格納される。


だから、自動取得している場合に任意の名前でログを取得しなおしたければ、

loginfoコマンドを実行してresultが -1 でなければ、logcloseしてからlogopenすればよいのである。



2. 意図しないところで中断してしまう

これは常識なのかもしれないが...

私はいつもtera termマクロでコマンドを実行するとき、以下のようにしている。

sendln 'show version'

wait '#'


これでほとんどの場合はうまくいくのだが、show tech-supportでこうすると、

途中で終わってしまう。

なぜなら show tech-supportの結果の中に # が含まれているからだ。

show tech-supportでなくても、コマンド実行結果の途中に # が含まれるコマンドを実行すると、そこで wait '#'が機能してしまい、次の処理へ進んでしまう。


私はこの対策として、10秒待ってから任意の文字列をsendlnし、

その文字列をwaitするということをしていた。


これで大体の場合、うまくいった。

しかし、最近その方法がうまくいかないケースがあった。

show tech-supportの取得中に数十秒程度待つ状態がおこる機種があって、

10秒待って任意の文字列を送る、というのが機能しなかったのだ。


じゃあ60秒待てばよいかというと、そうしたら他の機種で余計な待ち時間が発生することになる。


そこで以下のように対応した。

まず、接続する装置はホスト名で指定することにする。

そのために、hostsファイルにホスト名とIPアドレスの対応を記載する。


macroではプロンプトを表示してホスト名を入力するようにする。

そして、入力したホスト名+"#"を変数に格納し、その変数をwaitする。

hostname = 'router01'

my_prompt = hostname

strconcat my_prompt '#'


sendln 'show tech-support'

wait my_prompt





2021/07/08

TOEIC

以下は私が今まで受験したTOEICの結果である。()内はListeningとReadingの得点


1997 57th 695 (370, 325)

1998 64th 800 (385, 415)

2001 84th 800 (425, 375)

2002 91st 805 (420, 385)

2013 178th 835 (445, 390)

2019 243rd 745 (375, 370)

2021 270th 895 (440, 455)


初回から2013年までは得点はあまり上がりもしないが下がりもしなかった。

2019年に受けた時は、しばらく受けてなかったけどちょっと受けてみるか、

と軽い気持ちで臨んだら前回から90点もさがり、歴代最低から2番目の得点となってしまった。


テスト内容が多少変わったのと、最近はTOEIC対策の参考書やサイト、アプリなどが増えてきて、受験生のレベルもあがっている。

今回改めて確認して気づいたのだが、得点があがっていた2013年までの結果も、percentile rankを見ると少しずつ下がっていた。


今回は前回の結果を払拭すべく1か月半ほどけっこう対策をして臨み、

なんとかそこそこの結果をだせた。あと5点で900点だった。

900点なんか夢の数字だったのだが...


TOEIC800点くらいを取ると、英語が得意な人に分類されるようになり、

英語のドキュメントやメールを読んだり書いたりするのを頼まれるようになったりしたが、

その時感じたのは、日本人の英語力の低さ、苦手意識、「英語アレルギー」とでもいうべきものは相当なものがあるということだった。


英語は中学生、高校、大学と必須の科目であるのに、社会人になった私の周囲には本当に基本的なことも理解できない人がたくさんいた。


私には、彼らは外国語を理解することはあまり本質的な重要な事ではないと考えているように見えた。


「日本に住んで日本人同士でコミュニケーションできれば英語は必要ない」

「誰かに翻訳や通訳を頼めばよい」

「本質を理解していれば英語がわからなくてもなんとなく話は通じる」

「あの人は英語は得意だけど専門知識はない(アタマが悪い)、私は英語が苦手だが専門知識はある(英語ができないだけでアタマは良い)」

「英語を使う環境にいれば誰でも英語はわかるようになる(自分だって外国で暮らせば英語なんかしゃべれるようになる)」

「将来自動翻訳機や翻訳サイトが発達して外国語を勉強する必要などなくなる」


というような考えがあるために英語を勉強しようとしない、使おうとしない。


私が初めてTOEICを受験した1997年は、インターネットがようやく一般人に普及し、それまでは実験的だったり紙に書いてあったものをそのままネットに移していたようなコンテンツがだんだんインターネットならではの内容となり、つまり、情報が情報として実用的になってきたくらいの状況だった。

まだiPhoneはなく、私は確か携帯電話も持っていなかった。

パソコンは自宅に持っていてインターネットは見ていたが、

ニュースを見る、メールの送受信をする程度だった気がする。


今みたいにSNSもないし(似たようなものはあったかもしれないが少なくとも私は使っていなかった)、

なんでもかんでもgoogle検索、という時代でもなかった。


今確認したが2ちゃんねるが1999年、facebookもミクシィも2000年代になってから、

twitterはその後だ。

Amazonは1995年ごろ始まっていて大きなニュースにもなっていたが、私は「本なんか本屋で買えばいいじゃん」と思っていて全く使っていなかった。

私のホームページ(ブラウザを開くと最初に表示されるページ)はYahoo!JAPANであった。


それから24年経った。


確かに翻訳サイトの精度は向上した。

自動翻訳機やアプリも出てきた。


しかし、英語を自分で読まなければならない機会、読んだ方がいい機会はあまり減っていないどころか、むしろ増えたようにさえ思う。


海外の出来事はすぐに日本語に翻訳されて報道される。

しかし今や、ニュースソースはだれもが直接参照することができる。

アメリカ大統領がtwitterで発言し、それを誰もがリアルタイムに読める時代である。


それなのにわざわざ誰かが翻訳するのを待つ必要があるのか。

現代はもはや「ソースを直接読んだ方がいい」というより、「なぜわざわざ翻訳するのか」

という時代なのである。


さて、本題はここからである。

茂木健一郎という人が、twitterでTOEICに対して否定的な発言をしていた。

私は「またか」と思った。

たしか2013年に受験した日、当時この人をfollowしていた私は、彼が「今日もTOEICなどという無駄な試験を受けに行く人がいるのか」みたいなことをツイートしているのを、自分のiPhoneで見たのだ。


当事者だから、そのことはよく覚えていた。

私もTOEICの特殊性は理解している。

実質日本や韓国辺り限定の試験であるとか、難易度としては非常に低いとか、

英語のネイティブスピーカーは存在すら知らないとか、

留学するような人はTOEFLというもっと高度な試験を受けるのだとか。

TOEFLも1回受けたことがあって、その時には確かにTOEICなんか子供だましだみたいに感じた。


しかし、その後も受験し続けた。

周囲でもTOEICのスコアは重要な指標とされていた。


先ほど述べたように、日本人の英語に対する拒否感は強烈なのである。

シェークスピアだとか論文だとかを読むなんて到底できないレベルなのである。


そういう人たちにとっては、TOEICの点数を励みに英語力を向上させて、少しずつ高度な英文に触れるようになっていくことに意味があるのである。


いまにして思うとTOEIC800点程度で「英語が得意な人」だと思っていたのは恥ずかしいことだったが、TOEICをきっかけに私は英語に興味を持ち、少なくとも苦手意識を持つことはなかった。完全にわからない発言や文章に対しても、理解しようという態度で接することができた。


TOEICが日本人が学校で受ける試験と決定的に違うところはそのスピードと量である。

TOEICは、じっくり考えることが許されない試験である。

頭を使ってはいけないのである。頭を使うと時間が足りなくなる。聞き逃す。

そういう風に作られている。


そして英語を理解するにはそれが必要である。

一言一句を吟味して辞書を引いてどの語を使うべきか迷う、そういうことも大切なことではあるが、外国人である我々が馬鹿正直にそうやって英語に対していたらいつまでたっても使えるようにならない。


TOEICによって、「英語を英語として理解する」という非常に重要な態度が身につく。

スピーキングやライティング以前の問題である。


茂木さんは数年前、twitterでお笑い芸人が政治的な発言をしないみたいなことを発言して、ワイドナショーで松本人志の前でそれを謝罪(そんなに堅苦しいものではないが)したことがある。


そんなに深い考えや固い信念を持って発言する人ではないのだ。


さらにもっと前に、確かyoutubeでだったと思うが、

何人かでMacとWindowsの話をしていてWindowsを全面的に否定する発言をして

その場にいた西和彦を憤慨させたのを見たこともある。


彼は自分は天才で凡人には理解できない独特の考えを持っていると思っているフシがある。

だから誰かが気分を害するとか反発を受けるということを考えずに、あるいは、それを見込んで、好き勝手なことを言う人なのだ。



2021/07/05

pythonでexcelファイルの正規表現置換をする

 excelの内容を正規表現で置換したかった。

ある列に、数字をカンマで区切った内容を入れてあるのだが、

最後がカンマで終わっている場合、カンマを取りたい。


たとえば、


123, 124, 222, 234

333, 444, 555, 666,

111, 222, 333


みたいな場合、2行目の666, のカンマをとって

333, 444, 555, 666

としたい。


pythonの正規表現は使ったことがあり、

最初は

resut = pattern.match(",$",s1)

という風にしたのだが、なぜかマッチしない。

findallを使ったらマッチした。


置換はもっとスマートな方法があるかもしれないが、

最後の一文字を落とす、という風にした。


###########################
import glob
import os
import openpyxl
import re
import sys


pattern = re.compile('.*,')


bookname = sys.argv[1]

newbook = sys.argv[2]

wb = openpyxl.load_workbook(bookname,data_only=True)

ws = wb[u"Sheet1"]

#print(ws.cell(row=1, column=1).value)


for row in range(1000):
	c1 = ws.cell(row=row+1, column=9)
	if c1.value is None:
		pass
	else:
		s1 = str(c1.value)
		result = re.findall(r",$",s1)
		if result:
			print(str(s1[:len(s1)-1]))
			s2 = str(s1[:len(s1)-1])
			c1.value = s2

wb.save(newbook)
wb.close
##################################

列は9列目(「I列」)を固定で指定。

ファイル名と保存ファイル名は引数で指定

python rep.py filename1 filenmae2