スコープ
変数のスコープってあるじゃないですか。
プログラミングやる始めると勉強するアレ。
教科書や理屈では、スコープは極力狭い方が良いというのはわかってるんですが、
「なんで?」となるとちゃんと答えられないなぁ... と(その程度のプログラミングスキルなんだよなぁ...)
スコープは極力狭くして、意図しないところでいつの間にか変数が上書きされるのを防ぐ、っていう名目があると思うのですが、実際、仕事場ではグローバル変数だけで書かれたPerlのスクリプトとかがガンガン使われてたりするわけで、実際動いてるんだから問題ないんだよなぁ...と。
で、その動いているスクリプトを見様見真似で他の人はスクリプト書いていくわけで...
仕事場で使っているPerlが長くても100行程度のスクリプトだから、スコープ意識しなくてもバグをはらむ事は少ないとも思うので、別にいいのかなぁーとも思うけど、「Perlでの業務経験があります(キリッ」と言ったのに「my?使ったことありません(ドヤァ」とかなったら恥ずかしいような気もするなぁ...と。
とか色々考えるけど、周りにPerlの文法を教えられるほど経験はないし、自分で書くときは世の中の標準から離れないようにしていきたいなぁ...と思ったところで思考が終わりましたとさ。
ヒストリをとるための
仕事でunixをよく使うので、使ったコマンドをファイルに落とすためのスクリプトを書いた。久々にpython 2.Xで。
aliasに
alias his = "history|tail -2 |head -1|tee -a" his his
とかで一つ前の入力hisに追加していってもいいんだけど、つい勢いでlsとかpwdとかしようものならとれなくなるので、入力にコマンドを与えると直近のそのコマンドを落としてくれたり、引数で何個としていするとその分とってきてくれるようなのを書いた。
課題はまだまだあるけど、とりあえずアップ。
(pythonのソースコードのアップとか久しぶりだよ、いつぶりだよ...)
#!/usr/bin/python #get_his.py import sys import getopt import re def help(): sys.stderr.write("unix> python get_his.py\n") sys.stderr.write(" options: -c <unix command> : a command to use as a history.\n") sys.stderr.write(" -n <int> : <int > used recently.\n") sys.stderr.write(" -s <word> : searching <word> and output.\n") sys.stderr.write(" PRIORITY: -s > -c\n") sys.stderr.write(" ### OSUSUME: alias his ='./get_his.py \!* |tee -a $!$'\n") sys.exit() if __name__=='__main__': try: opts,args=getopt.getopt(sys.argv[1:], "hc:n:r:s:", ["help", "command=", "num=", "recently", "seach="]) except getopt.GetoptError: sys.stderr.write("Invalid option.\n") help() num=0 command="" recently="" search="" for o,a in opts: if o in ("-h","--help"): help() if o in ("-c", "-command"): command=a if o in ("-n","--num"): recently=int(a)+1 if o in ("-s", "--search"): search=a totallineno=0 line=[] for stdin in sys.stdin: line.append(stdin.rstrip()) line.reverse() line.pop(0) if search != "": num_com=1 for i in range(len(line)): if re.search(search, line[i]): print line[i] num_com+=1 if recently == "": break elif num_com == recently: break elif command != "" : num_com=1 for i in range(len(line)): item=line[i].split() if command==item[2]: print line[i] num_com+=1 if recently == "": break elif num_com == recently: break elif recently != "": for i in range(1,recently): print line[i] else : print line[num]
alias his = "history|python get_his.py \!*|tee -a \$"
aliasに上記を追加。
unixコマンドの最後の引数のファイル名でダンプするので、his -n 10とかしたら、10というファイル名にヒストリが保存されることになるのが不満。
his -c ln -n 10 his
で、直近のlnコマンドを10個hisファイルに落としたりとか、
his -s hoge -n 10 his
で、直近のhogeを含むヒストリをhisファイルに落とすとかできる。
機能的な課題は前述の通り、最後の引数のファイル名に落とすので、ミスタイプすると変なファイル名に落としてしまったりしてしまう点。
コーディング的には、なんか階層が深い気がする。書き方が冗長。getoptよりも良いモジュールが最近の流行(らしい?)ので、流行についていけてない。などなど挙げたらキリがない。
そんな感じで、今年ももうすぐ半年が過ぎようとしてるけど、当初の宣言通り、まだpyhonは使えている様子。
icarus-verilog使ってみた
シミュレーション結果が出るところまでは動いたのでまとめでも...
半加算器とテストベンチをverilogで書いてiverilogに食わせる。
#半加算器 ha.v module ha(a,b,s,c); input a,b; output s,c; assign s=a^c; assign c=a&b; endmodule
#半加算器haのテストベンチ ha_tb.v `timescale 1ns/1ns module ha_tb; reg a,b; wire s,c; ha ha_i(.a(a), .b(b), .s(s), .c(c)); initial begin $dumpfile("out.vcd"); $dumpvars(0,s); end initial begin a=1'b0; b=1'b0; #10 a=1'b1; #10 b=1'b1; #10 a=1'b0; #10 $finish; end endmodule
書き方が綺麗なのかどうかは置いといて、iverilogで特殊なのはたぶんテストベンチの方の$dumpfileと$dumpvars。
$dumpfile(シミュレーション結果の出力ファイル)、$dumpvars(シミュレーション開始時間, シミュレーション出力信号名)と書く。
iverilogの実行は
$ iverilog -o ha.vpp -s ha_tb ha_tb.v ha.v $ ./ha.vpp
iverilogの-oオプションで指定したファイルを実行すると$dumpfileで指定したファイルが作られる。
実行結果(out.vcd)を抜粋すると
#0 $dumpvars 0! $end #10 1! #20 0! #40
こんな感じで、ちゃんとシミュレーションはできてそう。
論理合成って本当にできるのかな...もう少し遊ぶか...