2013年12月25日 星期三

ADS_origin_converter v2

今天下午發佈ADS origin converter v2

新增下列功能:
一、原本是進入一個prompt讓使用者輸入檔名,使用者試用的經驗表示這實在是太弱了,在windows下最好的使用方式:把要轉換的檔案拖到exe檔上面。
測試之後發現,在windows上把檔案拖到exe檔上面,等同將被拖的檔案路徑當成argv參數傳入,因此程式改為輸入參數為要修改的檔名即可。

二、支援多變數檔案:
之前的版本只支援單變數的狀況,這次則加入多變數的狀況,ADS記錄多變數的狀況如下:
sweepvar1 ... sweepvar_n-1 sweepvarn ... data
var1_1 ... varn-1_1 varn_1 ... data_1_1
var1_1 ... varn-1_1 varn_2 ... data_1_2
var1_1 ... varn-1_1 varn_3 ... data_1_3
...
var1_1 ... varn-1_1 varn_m ... data_1_m

sweepvar1 ... sweepvar_n-1 sweepvarn ... data
var1_1 ... varn-1_2 varn_1 ... data_2_1
var1_1 ... varn-1_2 varn_2 ... data_2_2
var1_1 ... varn-1_2 varn_3 ... data_2_3
...
var1_1 ... varn-1_2 varn_m ... data_2_m
新版的會以前幾個變數產生tital name,例如在上述狀況,最主要的index是sweepvarn,不斷重複的則是data,上述的狀況會產生為:
sweepvarn tital1 tital2 …
varn_1 data_1_1 data_2_1 …
varn_2 data_1_2 data_2_2 …
varn_3 data_1_3 data_2_3 …
...
varn_m data_1_m data_2_m ...

產生的第一個tital會是:
sweepvarn 之後則是
sweepvar1=var1_1,sweepvar2=var2_1, …sweepvar_n-1=varn-1_1
好像不好看懂,總之就是tital會是第二-n個變數的數值。

目前有一個已知難防的bug是,顯示的變數名稱不能有空白在裡面,因為斷詞是以空白為基準(好像也沒有更好的斷詞方試),有空白的變數名稱會造成tital產生錯誤,目前無解。只能要使用者不用掃有空白的變數名稱,例如:
I_Proble[0, ::]

安裝方式: 在下方github頁面,選”Download As zip”,解壓後直接將檔案拖到ADSToOrigin.exe上面即可。

--

本程式公開所有程式源碼,請見github,請眾位大神鞭小力一點>_<
https://github.com/lc85301/ADSToOrigin

2013年12月19日 星期四

應用git stash 於多分枝之版本控制

本文是要說明git中stash指令的應用,基本需要先知道git 基本的add, commit,以及branch的功能。

使用git進行版本控制,branch是相當重要的功能,一般會建議要開發一個新的功能,就要先分出一個新的branch,開發好新的功能後再merge到master的版本內。
編按:雖然話是這麼說啦,可是筆者在實作時通常還是一個master branch一直commit下去XD。
當分枝一多的時候,就會出現一些問題,例如在一個分枝中修改到一半的內容,例如:「雷射彈幕」,這時有些點子想要切到另一個分枝中修改其他內容,但這個「雷射彈幕」的功能還沒達到可以commit的等級,就需要stash來暫存目前修改的內容。
--

下面是git stash的相關操作環境範例: 我們有個master branch跟開發中的feature branch,現在在feature branch中開發一個新的feature,加入並commit "featurefile"這個檔案
$ git checkout feature
$ git commit featurefile  <-注意一般是不這麼寫的,這裡是為了說明方便。
some modification on featurefile
$ git checkout master
這時候我們會得到一個:
error:
Your local changes to the following files would be overwritten by checkout: featurefile Please, commit your changes or stash them before you can switch branches.
Aborting
因為切到master branch會清掉已修改的內容,而git不會輕易讓你這麼做。

這時候就要先stash(暫存)它,stash有點像commit,不過沒有commit這麼正式,使用:
git stash (save)
git stash list
git stash pop
git stash drop
save: 存入一個暫存,可以不打,git stash預設
list: 列出目前有的stash
pop: 取出暫存
drop: 刪掉暫存

在這裡我們就直接git stash,這時候會看到所有還沒commit的修改都已經消失,用git stash list會看到:
stash@{0}: WIP on feature: ef9d050 feature initial commit
這裡重要的是“0”這個數字,這是stash的index;另外”feature initial commit”則是這個stash是這在哪個commit中分支出來的。
Git stash時還可以加上message來取代上面的ef9d050 feature initial commit這段
git stash save “this is temporary stash of master commit”
不過這在stash量很少的時候大概不太需要用到。

現在我們已經可以切回master的branch了。在master進行修改後,同樣不想commit的內容也可以用stash進行暫存,這時候git stash list會變成
stash@{0}: WIP on master: e194f69 master initial commit
 stash@{1}: WIP on feature: ef9d050 feature initial commit
分別標示了從master和featurecommit中暫存的內容。

--
要取出stash的內容,我們用git stash pop,這預設會取出stash index 0的內容,如果要取出其他stash的內容,就要用例如:
git stash pop stash@{1}
在後面打上stash完整名稱。
取出其他index的內容相當重要,像在例子中,如果我們先切回feature branch,再pop出在master branch中記錄的stash,這個效果和pull是類似的,若是有衝突的檔案就會要求merge,會很麻煩,個人是不建議在這種狀況下進行merge,畢竟當初就是不想記錄下來才用stash,現在要是merge就記錄進去了。

 如果要刪掉已經存入的暫存就用
git stash drop
刪去就行。

 祝大家git stash愉快

2013年12月15日 星期日

mex編譯環境設定


mex是matlab提供的編譯器,可以在matlab編譯外部的c/cpp(也許還有fortran =w=?)程式,可以用matlab的方式把資料塞給外部程式,回傳資料也可以用matlab收下來。

幹嘛沒事叫外部程式,用matlab寫不就好了?據同學強強林的說法是編外部的cpp code會跑得比較快,實際情形是如何其實作者也是啊哈哈不是很清楚。

最近因為修課的關係需要用到matlab mex,就順手編了一下,把過程記錄一下:

--

因為mex是用其他編譯器來編譯,因此要先設定系統的c/cpp編譯器

如果是Unix/MacOS的話,大概都已經裝了gcc/g++了,在matlab內打mex -setup,應該可以看到選項;windows的話請看參考資料一,這部分沒有研究。
這裡會遇到一個問題是,matlab未必支援最新版的gcc/g++,要看你的matlab版本
我是2012a版支援到gcc 4.4.6,偏偏我用archlinux,套件幾乎都會升到最新(4.8.2),這時候matlab就會回報用了太新版本的gcc。

解決方式是安裝舊版的gcc/g++ 如果是archlinux的話可以用AUR安裝,其他發行版應該有自己的解決方式。
因此先重編了4.4.6,桌電上50MB的檔案我編了快1hr …(結果筆電用-j8下去編跑得桌電快lol)

--

接著要設定gcc版本,在matlab安裝路徑(我的是/opt/MATLAB/R2012a)下有bin/mexopts.sh,把裡面的gcc/g++都換成舊版的
# C++keyName: GNU C++
# C++keyManufacturer: GNU
# C++keyLanguage: C++
# C++keyVersion:
CXX='g++' <-換掉這行g++ → g++-4.4
CXXFLAGS='-ansi -D_GNU_SOURCE'
CXXFLAGS="$CXXFLAGS -D_FILE_OFFSET_BITS=64"
CXXFLAGS="$CXXFLAGS -fPIC -pthread"
CXXLIBS="$RPATH $MLIBS -lm"
CXXOPTIMFLAGS='-O -DNDEBUG'
CXXDEBUGFLAGS='-g'

我是archlinux就是換成gcc-4.4/g++-4.4,其他發行版我不是很確定舊版裝好是像這樣加個版號,還是要把本來的gcc替代掉
接著在matlab裡面輸入
$mex -setup
代入舊版的gcc/g++,之後mex就可以正常使用囉。

參考資料:
1. http://www.physik3.gwdg.de/tstool/HTML/node9.html
2. archlinux AUR gcc44
https://aur.archlinux.org/packages/gcc44/