スクリーンショットを撮るアプリ2016年02月04日 20:17

グラフを出したり、処理結果を表示したりした時に、それを比べたい時がある。パラメータをいろいろ変えて、試してみているんだけど、さっきと比べてどう違ったのか?
そんな時に、スクリーンショットを撮って比べていた。

Windows だと、PrintScreen キーを使って、スクリーンショットを撮ることができるけど、撮ったスクリーンショットは、クリップボードに記憶されるので、ペイントとかに貼り付けて見ていた。[alt]+[PrtScn] で撮って、ペイントを立ち上げて、[ctl]+[v] で貼り付けて・・・面倒くさい。

「スクリーンショットを自動的に保存!」 みたいなソフトはあるんだけど、結局その画像を開かないといけないし・・・

スクリーンショットを撮ったら表示だけしてくれるソフトがないかと探したんだけど見つからない。そんなことするやついないのかなぁ・・・
自分で作ればいいんだけど、ウィンドウズのアプリはむかーし、Delphi で作って以来。コンソールアプリは作るけど、UI系は面倒だし、キーイベントのフックとかどうやればいいか分からないし・・・と落ち込んだんだけど、落ち込んでいても始まらないので、

アプリを作ってもらった。作ったんじゃなくて、作ってもらった。

ワンコイン(500円)でいろいろと願い事を聞いてくれるってサービス、ココナラ

bootstrap さんってかたにお願いした。アプリのプログラミングしてる人ならチャチャっと書けちゃうんですね、こんなのが。

で、出来たのがこちらになります。

(ログインしろって言われるけど、気にせず×押してからダウンロードしてね。)

すごいよ、[alt] + [PrnScn] だけでウィンドウのスクリーンショットが撮れて、新しいウィンドウに表示されるよ。これは便利!

ココナラのサービスもだけど、こんなアプリが簡単に書けちゃうなんてかっこいいよね~

Julia でヒストグラム2016年02月02日 19:30

話は前後するが、Julia でヒストグラム表示をやってみたのでメモ

イメージの読み出しが load() になった。読み出すと Image 構造体に読み込まれるので、その中から data() で画像データのみを取り出す。取り出した data は、RGB 構造体の配列なので、reinterpret () で UInt8 の配列に変換する。これで、3 x 横 x 縦 サイズの UInt8 の配列に取り出せる。
さらに、RGB に分離する。前記 UInt8 配列のうち、1次元目はR/G/B をあらわしているので、R のみ取り出すには [1,:,:] を指定する。このままでは3次元の配列なので2次元にするために、先頭の次元を squeze で削除する。これでやっと2次元の R が取り出せる。(結構面倒くさい)

続いてヒストグラム生成。2次元のままだと(所望の)ヒストグラムが取れないので、reshape で1次元に並び替える。squeeze とは違うので注意(前述の次元削除も reshape で出来ないこともないけど)。
これでやっとヒストグラムが取れる。hist(v, e) の書式で、v はヒストグラムを取るベクトル(1次元の配列)。e は幅指定で、-1:255 で 0から255の範囲をヒストグラム化。1番目の範囲は、-1より大きく、0以下。255番目の範囲は245より大きく、255以下が含まれる。
ちなみに、-1:16:255 でヒストグラムの幅を16ずつとかに出来る。edge と 分布が返ってくる。

ヒストグラムが出来たので、グラフに描いてみる。ここでは、描画パッケージとして Winston を使用。
Histogram() でグラフのオブジェクトを作成、FramedPlot() は、描画用のウィンドウの作成。add() で、ウィンドウにグラフオブジェクトを追加。これでヒストグラムが表示される。

やってみてわかったのだが、UInt8 のまま hist() を呼ぶと動作がおかしい。* 1.0 で Float64 に変換しているのはそのため。理由は不明・・・
UInt8 のままで画像処理をするといろいろ面倒なので、最初に RGB 変換時に Float に変換したほうがいいかも知れない。

# image 読み込み
using Images
img= reinterpret(UInt8,data(load("SleepingCat.bmp")))
red  = squeeze(img[1,:,:], 1)
green= squeeze(img[2,:,:], 1)
blue = squeeze(img[3,:,:], 1)

# Histogram 生成
data1d= reshape(green, length(green)) * 1.0
(edges, counts)= hist(data1d, -1:255)

# Winston の機能
using Winston
h= Histogram(edges, counts)
p= FramedPlot()
add(p, h)

Julia で2進数、16進数2016年01月15日 19:16

久しぶりに Julia に関してのメモ

データ圧縮関係の処理をしようと思い、2進数や16進数変換を調べたが、意外と書かれている情報が少ない。
http://julialang.org や http://rosettacode.org/ あたりを見てまとめたのでメモしておく。

10進数や16進数の文字列に変換するには、C言語と同じ感じで @sprintf() で出来る。2進数への変換はこれではできないが、関数 bin() が用意されている。dec()、hex() もあるので、これを使ったほうが見やすいかも。
文字列から数値への変換は、parse() という関数が用意されている。引数に "0b00110010"や "0x32" と書いてもいいし、何進数かを示す数値を付加してもいい。
まとめると下記のとおり。
(8進数もあるけど使わないので省略・・・)

2進数10進数16進数
定数a= 0b110010a= 50 a=0x32
定数から変換bin(a)dec(a)
@sprintf("%d",a)
hex(a)
@sprintf("%x",a)
長さ指定bin(a,16)dec(a,4)
@sprintf("%04d",a)
hex(a,4)
@sprintf("%04x",a)
文字列から定数へparse(Int16,"0b110010")
parse(Int16,"110010",2)
parse(Int16,"50")
parse(Int16,"50",10)
parse(Int16,"0x32")
parse(Int16,"32",16)

文字列に関しても分かってきたので、そのうち書く予定。

CVC 実行方法と処理速度2015年08月27日 18:38

CVC をコンパイルしたので、これを使ってシミュレーションしてみる。
CVC には、インタープリターモードとコンパイルモードがある。

インタープリターモード(+interp)
・すぐに実行
・途中で止められる
・止まった時点でのレジスタ値、メモリ値などが見られる
・続きから実行できる

コンパイルモード
・コンパイルして実行ファイルが出来る→実行
・途中で止めたら終わり

それぞれ上のような特徴があるが、最も大きな違いは実行速度にある。
コンパイルして実行する場合、インタープリターモードで実行するよりも10倍速い。冗談ではなく、10倍速い
コンパイルにかかる時間もわずかなので、インタープリターモードを使う意味はほとんどないと言えよう。内部のレジスタ値はVCDファイルにダンプしておけば見ることが出来るし。
試しにちょっと実行とか、ちょっと文法チェックなどの場合くらいしか使い道がないだろう。もちろん、時間のかからないシミュレーションであれば、インタープリターモードだけでも十分ではあるが。

主要な実行フラグを示しておく
基本型cvc64 mytest.vmytest.v をコンパイルし、cvcsimという実行ファイルが出来る
-f入力ファイルリスト指定cvc64 -f mylist.txtVerilogファイルを列挙したテキストファイルを使用
-o出力ファイル名指定cvc64 -o mytest mytest.vこの場合、mytest という実行ファイルが出来る
-O最適化cvc64 -O mytest.vコンパイル時間が伸びるが実行は速くなる
+2state2値処理cvc64 +2state mytest.v内部処理を4値(0/1/x/z)ではなく2値(0/1)で行う
若干速くなる
+nbaoptノンブロッキング最適化cvc64 +nbaopt mytest.vノンブロッキング代入直前の遅延を無視して高速化
+dumpvarsVCD出力cvc64 +dumpvars mytest.v内部ノードをVCDファイルに出力
Verilogファイルの変更は不要

詳細は、 http://www.tachyon-da.com/cvc-resources/ の Quick Start Guide を参照のこと。

試しにシミュレーションにかかった時間を比較してみる。
詳しくは明かせないが、ちょっとしたIP
modeflag分:秒
インタープリタモード+interp40:29
コンパイルモード3:36
コンパイルモード-O3:33
コンパイルモード+2state3:03
(参考)Cadence IES1:15

Verilator にちょっと古いベンチマークがあるが、だいたい合っている感じ。
http://www.veripool.org/wiki/veripool/Verilog_Simulator_Benchmarks
以上。

CVC verilog simulator コンパイル2015年08月26日 18:53

Verilog のシミュレータでCVCというのを見つけた。
http://www.tachyon-da.com/

個人的には Veritak が使いやすくていいのだが、System Verilog には未対応だし、大きなシミュレーションは難しい。(SystemVerilog対応版も菅原さんが地道に開発を進められている)
フリーソフトでは、icarus が有名だが、いかんせんシミュレーションが遅い。
Verilator は速いみたいだけど、最上位をC++で書かないといけないし、ちょっと癖がありすぎる感じ。まあ、一番上は、クロックとリセット、終了判断だけにして決まった記述にすればいいのでチャレンジしようかと思っていた矢先ではあるが・・・

とりあえず、CVCをダウンロードしてインストール(というかコンパイル)してみたのでメモに残す。

環境は、CentOS7 (minimal)。

0) まずは、必要なパッケージの準備。
 ダウンロードしたファイルを解凍するための bzip2、コンパイルのための make と gcc、CVC が使用する zlib をインストール。
yum install bzip2
yum install make
yum install gcc
yum install zlib zlib-devel
make するときに、カレントディレクトリを参照できるように、パスを追加。
PATH=$PATH:.
これでコンパイルの準備完了。

1) 適当なディレクトリにファイルをダウンロード
 open_src_cvc_700c_tar.bz2 というファイル名だった。

2) ファイルを展開
tar xvf open_src_cvc_700c_tar.bz2
 open-src-cvc-700c というディレクトリが出来る。

3) open-src-cvc-700c/src に移動して make する
cd open-src-cvc-700c/src
make -f makefile.cvc64
 問題なければ、src ディレクトリに cvc64 という実行ファイルが生成される。

4) 動作確認
 検証用のシミュレーションを通してみる。
 cvc64 を /tmp ディレクトリにコピーして、open_src_cvc_700c/tests_and_examples/install.test ディレクトリにある inst_test.sh と inst_test_interp.sh を実行
cp cvc64 /tmp
cd ../tests_and_examples/install.test
inst_test.sh cvc64
inst_test_interp.sh cvc64
2つのテストでそれぞれ
>>>> Install test completed (this should be only message printed).
と表示されれば成功。
inst_test_interp.sh は、インタープリターモードなので時間がかかる。ちなみに引数の cvc64 は、ファイル名ではなく単なるフラグらしい。
最終的に必要なのは、この cvc64 という実行ファイルだけ。パスの通った適当なディレクトリに置いておけばいい。

詳細は、http://www.tachyon-da.com/cvc-resources/を参照のこと。