Cの標準ライブラリ

C言語のお勉強をする必要が出てきたので、手元にあるC言語の本から線形リストのソースを写経してコンパイル通そうと思ったら、stdlib.hとかがなくてコンパイル通らないっぽい。
でもHello Worldはできたから、stdio.hは読めてるっぽいんだよなぁ...
Spotlightで調べたらstdlibもstdioも見当たらない...
Macなのが原因かなぁ... gccクリーンインストールってのやらないとダメかなぁ...
と、本末転倒な結果に...

スコープ

変数のスコープってあるじゃないですか。
プログラミングやる始めると勉強するアレ。
教科書や理屈では、スコープは極力狭い方が良いというのはわかってるんですが、
「なんで?」となるとちゃんと答えられないなぁ... と(その程度のプログラミングスキルなんだよなぁ...)

スコープは極力狭くして、意図しないところでいつの間にか変数が上書きされるのを防ぐ、っていう名目があると思うのですが、実際、仕事場ではグローバル変数だけで書かれた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は使えている様子。

思い出したように

思い出したように更新するのだけど、

自作のプログラムのファイル名とか、変数名とかに一貫性がないよなぁ...... と思い至った。唐突に。

単語をアンダースコアで区切るとか、大文字で区切るとかあるじゃないですか。

あれがまずごちゃごちゃ。

そして適当にhogeとかfugaとかpiyoとかtmpとか付け出す始末。

もう何年も変わってないなーと。

自分なりの命名規則を確立すべきだよなー...

プログラミングで一番大事なのは名前をつけるところ、と言われたりもするしね!!

という事を唐突に思いついたのでした。おしまい。

そういえば

先日、会社でPythonの文法ググってたら、自分のこのブログがひっかかった。
何故かすごく焦ったけど、2年くらい前の記事見て、
「あー、そういえばこうやったなー」と感じて、
ブログに書いといてよかったと思うと同時に成長してないんだな、と感じた。

Perlを頑張ると言ったな、あれは嘘だ。

昨年はPerlを勉強するとかぬかしたけど、やはり学生の時に慣れ親しんだ、Pythonをもう少しさくっと使えるようにしよう、という新年から一ヶ月たった時点の決意。
Perlワンライナーでもう少し色々できるようになりたいなー、というレベル。

perl -ne 'print if /hoge/../fuga/' input.file

とか、grepだけでは対応できないのに使うようになってきた。

そんな感じ。

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

こんな感じで、ちゃんとシミュレーションはできてそう。
論理合成って本当にできるのかな...もう少し遊ぶか...