2011年3月30日 星期三

windows上用TortoiseSVN command line commit code

.

如果常常在windows上用TortoiseSVN commit code的話,你會發現GUI還是有其不方便的地方
找了一下如何用command line使用TortoiseSVN commit的方法

TortoiseSVN的中文說明書附錄(對,是簡中,我找過了,沒有繁中)

我用的批次檔內容如下:

"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:commit /path:"D:\vm\vbsf\ns-2.29_svn" /closeonend:2


command:commit => commit code
path:"D:\vm\vbsf\ns-2.29_svn" => 這是我要commit code的位置,請自行置換
/closeonend:2 => 如果沒發生錯誤和衝突則自動關閉對話框

closeonend的參數有下列幾種:
/closeonend:0 不自動關閉對話框
/closeonend:1 如果沒發生錯誤則自動關閉對話框
/closeonend:2 如果沒發生錯誤和衝突則自動關閉對話框
/closeonend:3如果沒有錯誤、衝突和合併,會自動關閉
/closeonend:4如果沒有錯誤、衝突和合併,會自動關閉

我將其存成批次檔(如commit_ns229.bat),然後將該批次檔拉個連結到Launchy的utility folder中
之後要commit code時,只要alt + tab叫出Launchy,然後再輸入commit_ns229,perfect,就跳出commit code的視窗
你還是要按OK,按完OK後自動commit,commit完後自動關閉,放在以前還要手動再按一次OK將該progress dialog視窗關掉

你可能要問,為什麼不能全自動commit code,而是要再按一次OK
我也想問為什麼,因為我也想這麼做
但我實在找不到選項省略那一次OK,也許他們就是這樣設計
無論如何,我已經省掉過去GUI用滑鼠操作,和按第二次OK的時間

至於update?
將 /command:commit換成 /command:update即可(add,revert也一樣)
其他細節可參造中文說明文件

.

當gdb遇到SIGKILL……

.

在ns的開發階段,執行時遇到segmentation fault是很正常的
這時gdb非常的好用
但若gdb沒法用呢?

之前用gdb debug時遇到一個case……
在戴入ns的script file後,系統會hang住,過了好一陣子後出現下列的error msg:

Program terminated with signal SIGKILL, Killed.
The program no longer exists.

然後就停了,怎樣都跑不起來
上網查了一下,也沒什麼好答案

在解問題的過程中,我有注意到,一旦開啟gdb並戴入ns的script file時,系統會變得很慢,用top看了一下,ns的mem%衝到了93%,然後virtual和res還一直在漲上去,這是怎麼一回事?ns怎會用到那麼大量的記憶體?


最後我找到了問題的所在,因為我變數initialize錯誤,導致某個class的constructor配置了巨量的變數
然後gdb為了追蹤程式,又要為ns allocate的變配置對應的變數以做追蹤的動作,顯然的,他配置的變數也不少,結果導致gdb一直一直在配置memory,然後超過os的界限,os送個kill的signal給gdb正在trace的程式(也就是ns),將他kill掉
我想,這應該是gdb無法追蹤的原因

所以,下一次若你也遇到相同的問題,可以查查看是哪裡配置了太多、太大的記憶體囉

.

2011年3月29日 星期二

拯救你的滑鼠按鍵

.

去年中,兩顆羅技火星軌跡球(一顆公司用,一顆家裡用)的按鈕陸續出問題
情況不外乎這兩個(有時候兩者都有):
1.左鍵連點
2.左鍵拖曳到一半自己會放掉
當時要求零售商幫我送修,零售商說要有發票才能幫我修……
哇勒,這兩顆快五年了,誰發票會留五年的?

打電話給羅技,沒有發票,行,以出廠日期為主(我是OK啦,不然怎麼辦)
以前一顆火星要1600,保固五年
現在一顆火星要1000,保固剩三年
很幸運的,這兩顆都是五年保固,都在保固內
自己寄出桃園龍潭,幾天後會寄回個良品給我

如果故事到這裡結束了那也還好……
最近公司用的火星左鍵又出現同樣的症狀了,才修回來不到一年就有問題是怎樣?
這次不爽了,上網查了一下,發現決定按鍵觸發機制的是微動開關
大部份都買omron的微動開關回來自己換,就是將舊的解焊,再焊上新的
可是我真的不會焊接

然後從這篇文章看到另一個solution
我選擇把蓋子打開,然後把接點磨一磨..

會產生連點或者是拖曳到一半自己會放掉
都是接點上面氧化產生的....
每次只要遇到這種的...蓋子打開,拿砂紙磨一下接點,接回去又跟新的一樣了


既然知道問題只是出在接點氧化,那就好辦了
印象中也看到有人噴接點清除劑的
但有方向就好了

我最後選擇在微動開關上噴WD-40
火星的左鍵又復活了,而且觸感變得更有彈性,非常的Q呢

看倌啊,如果只是左鍵出了上述問題又過了保固,你可以先選擇簡單的解法:噴接點清除劑或是磨接點,過程不麻煩
真的不work了再換一顆新的微動開關,你的滑鼠或軌跡球就又復活囉,在不景氣的年代,你需要更經濟的方案
(其實在survey的過程中發現,大部份都只是按鍵的微動開關出問題,這imply一件事,手上這兩顆軌跡球沒有意外,也許再戰幾十年也沒問題,只要我會焊接的話……)

.

2011年3月23日 星期三

D2000的耳罩掉下來之維修

.
這其實是我先前在別的網站的文章,現在備份回來

[前言]
暨sr80的耳罩掉下來後,Filco majestouch的某些key會double output後
發生了3c產品的第三件慘事.....那就是是D2000的的耳罩掉下來了

麻煩的是我是跟網友買的二手水貨,不知該送去哪修……
看PTT好像有人修這個花了1000元,不過那是另外一個事件(是店家沒報價就直接維修,跟本文較無關係)
Mobile01也是有人掉下來,不過他說沒差,一樣可以帶,想想也是……

一直找不到適合的縲絲起子將縲回去
最去一直在找solution,找啊找,找到D5000的mod,看了看拆解圖,看起來應該是要整個拆掉才能鎖回去
沒有D2000的拆解圖,看來只能相信它跟D5000的架構是一樣的
不過看圖片看不出耳罩跟支架相接的地方的縲絲是怎麼接的,可能要等到拆了才知道

另外,D2000的耳罩會掉下來是常態,不是偶發,奇怪的是,似乎只有D2000會,D5000不會

Head-Fi辦了一個投票,2007八月前買的D2000,縲絲鬆掉的比例為2:17(鬆掉:沒鬆掉),不過2007八月後的比例就高多了,12:11,超過一半.....…
http://www.head-fi.org/forums/f4/denon- ... ll-258528/


Head-Fi的這篇有人說他為了要將D2000換線,拆開來後發現D2000"似乎"已經修正該問題(It looks like Denon has fixed the issue of the loose screw),不過有人follow說,問題根本不在耳罩內的縲絲,所以問題還是沒解,有一個人掉了兩次,第二次要鎖回去時縲絲斷了 :ale: ,所以他現在用綁的……,另一個人是直接放一坨expoxy(這不知啥東西)……(I just put a bead of epoxy on top of the screw/nut after it fell off and it's been golden ever since. Lock-tight would probably work even better)
http://www.head-fi.org/forums/f4/denon- ... ed-332823/


另外,有人賭爛到極點,乾脆將縲絲換掉,換成長的縲絲,他說D2000原本用的縲絲非常便宜,他全換掉,有圖有真相,他說:雖然圖片中縲絲突出一截,不過他們真的很小……另外他換了mogami的線,有差(The sonic differences from stock to new.)
http://www.head-fi.org/forums/f4/denon- ... ue-344869/


目前還在考慮是要學Mobile01的那位將就著帶,還是下定決心拆掉鎖回去,亦或是,等另一邊掉下來了再修 :mad: ,還是既然都要拆了連線一起換算了……

所以,要買D2000的可能要稍微考慮這情況了
要嘛衝D5000/D7000(其實沒爬文,也許D5000也有這個issue?)
要嘛,買公司貨,縲絲鬆了就送回去鎖

買水貨的話,你就要有心理準備要有能力維修,看起來拆解不難,只是麻煩

20091123更新
後來陸續用一陣子,發現沒有上螺絲的話,D2000帶不久就會自己滑下來(就是漸漸的解體),不會突然掉下來,而是在完全分離前會有一段慢慢變形的過程
所以證明了直接帶是不行的

一氣之下想要動手維修,從大家的回文中推測縲絲上面那個圓圓的東西是蓋住(套住?)縲帽的東西,是可以拆下來的(也可以自己掉下來 = =;)
一開始的想法很簡單,若我能把螺帽拆下來,鎖螺絲這件事就變得很簡單了
不過那個圓圓的蓋子實在是蓋太緊了,跟框架間沒有間隙,加上造型是圓的加上斜角,我實在撬不下來
好吧,山不轉路轉,我決定不鎖螺絲了
我用束帶……

有圖有真相

手上沒相機,用手機拍出來就這樣了,請大家見諒
圖中藍框是原來耳罩的螺絲和耳機框架接合處,最上面的就是那個"圓圓加斜角"的蓋住螺帽的蓋子,紅框就是束帶了
之後D2000就可以正常使用了,用起來沒什麼差,不過有一次D2000被學長拿起來把玩時,束帶跑到最右邊,所以導致耳罩又掉下來了(再裝回去把束帶調到最左邊就好了)
當然,也可以多綁幾條束帶讓束帶沒有空間可以滑動,只綁一條的話,束帶會滑來滑去
不過我覺得,只有自己在用的話,綁一條束帶就夠了,滑到右邊去就再拉回來就可以了
不完美但可行的workaround,野人獻曝一下


[維修]
今天,趁著心血來潮,我就動手了,鎖回縲絲花不了多少時間,只是找工具反而花不少時間(因為心血來潮,所以沒有先準備工具)

工具:鎖眼鏡用的小縲絲起子一把

一開始其實也沒想要拍照,後來想到了不拍照沒有幫到其他人,就拿實驗室的DV來拍照,但由於已經鎖上去了,所以過程中的一些照片就少拍到了

1.如下圖,將接觸耳朵的海棉逆時鐘轉一下,海棉就會掉下來,然後如圖中的藍色圓圈的地方的縲絲,有四顆,將其鬆開後,耳罩就會和框體分離,千萬不要鬆到紅色方框中的縲絲(也是四顆),那是用來取下耳罩外殼的(耳罩外殼取下後就會看到單體),我們只是要鎖縲絲的話,取下耳罩就行了



2.將耳罩取下後,把框架轉到一個角度,就可以動用縲絲起子將縲絲鎖回框體了(圖中紅色圓圈處)



3.縲絲鎖回後長這樣



4.最後將耳罩鎖回框架,每棉裝回耳罩,大功告成

其實過程比想像中的簡單,扣掉找工具的時間,過程大概十分鍾不到
若是有人幫忙固定框體和撐開頭帶的話,將根架鎖回框體的過程會更簡單,這是因為D2000的頭帶/支架有彈性,若沒人幫忙固定(撐開頭帶/支架),左右耳會靠在一起,這樣就不是很好鎖
但一個人也是ok的啦,我就是獨立完成作業

希望能對耳罩也掉下來的同好一點幫助
另外,縲絲不見的話,應該找到同樣縲紋和大小的縲絲就可以了

20110324補充
耳罩又掉下來一次了,這次去電子材料行找螺絲,我把規格記下來了
我買了兩個
M2 x 3 (3mm)
M2 x 4 (4mm)
我最後裝的是M2 x 4

.
.

在看到電腦玩物對Firefox4.0的介紹中所下的這個註解:

Firefox 4不是完美的瀏覽器,他只是一款可以為妳而改變的瀏覽器。

我深有所感,想要脫穎而出,一定要有自己的定位
google chrome給我的感覺就是:快
但我不會想用
FireFox的plugin有很多很實用的,但其實我常用的就是ScrapBook+和同文堂
ScrapBook可以把你喜歡的網頁抓下來,存在local
而DropBox則是可以自動幫你在不同的電腦同步資料夾(免費最多可以到3G的空間)
ScrapBook+和DropBox結合,對我來說非常方便,我在各地不同的電腦,一打開FireFox加上ScarpBook,我可以看到一模一樣的,我在不同地方電腦所抓的網頁
光這個功能就沒有瀏覽器可以取代

FireFox慢,其實我不覺得 = =;
我到現在,還在用Maxthon 1.0 (要不是Windows Update會自動偷偷幫我升級IE,我連IE都在6.x)和FireFox 3.6

.

2011年3月22日 星期二

一時迷失了,就再也回不到當初

.
關於「這輩子,只能這樣嗎?」這本書
我已經看完三遍了,但我暫時還無法寫下心得
勵志的書我看過很多,但我覺得這本最能touch我
為什麼?我自己也在找,也許等我找到為什麼了,我就能寫出心得

這本書的原文書名為:Your own worst enemy
亞馬遜的評價為4.5顆星
博客來的評價也為4.5顆星
為什麼推薦這本書,兩個網站的書評有很多人寫了他的理由


在這裡我只想分享一個故事,這個故事浮現在我心理很久了


阿圓是我讀研究所認識同實驗室的同學,他是我最好的朋友之一
我們研究所時的成績都很好,也一起唸博士班
二年級時,他決定不唸了,於是去找國防役(他是國防役的最後一屆)
那時候我問他要不要留下來再跟我拼一次
不知道為什麼,那時候的我,比起最初決定讀博士班的意氣風發,當時的我狼狽的像條狗
我跟他說:不知道為什麼,現在的我對於唸博士這件事,沒有任何信心,再也沒有當初能做到任何事的信心


我忘了當初阿圓如何回答,不過也不用猜,我們這種人,所做的決定,不會是一時衝動,我的問題在問出來之前其實就已知道結果了
不過有時候我一直在想,在讀博士的這條顛跛之路,能有阿圓同行,我們會不會比較快走完

書中提到,很多人,只是一時迷失了,就再也回不到當初
當時的我,當然知道得了顏面神經麻痺對我的生活影響很大
但我沒想到對我的人生也影響那麼大
是的,一時迷失了,就再也回不到當初

到現在,臉上的肌肉雖有進步,但其實還是不自然
有時候我一直在想,是不是我顏面神經麻痺完全好的那天,就是我博士畢業的那天……

另外,按照熱血漫畫的結局,我應該要對著大海大喊:阿圓,你的畢業證書,我一起替你拿到了,這份畢業證書,是兩人份的重量~~~~~~~
(阿圓:喂喂喂,我又還沒死)
.

「這輩子,只能這樣嗎?」精進計畫的15項任務

.
「這輩子,只能這樣嗎?」我已看完三遍了,對我幫助很大

節錄書中提到的精進計畫的15項任務

1.先找樂趣,快樂是不能省的東西
2.一件夢想很久,卻沒有付諸行動的事
3.下定決心,並且堅定到不近人情
4.在洪流中學習規畫時間
5.想清楚,你到底是個什麼樣的人
6.自己有這些「弱點」嗎?
7.從現在起,別再自我設限
8.重複六千次,建立新習性
9.改變你說話的模式
10.看一看,自己進步了嗎?
11.打造一份夢想企畫書
12.訂立目標,別再「這樣就可以了」
13.失誤率不可能是「零」,擬好備用方案吧
14.使出渾身解數,選擇並完成一個計畫
15.終極大躍進

.

2011年3月21日 星期一

在ns中使用delay_bind() bind var (export var form c++ to tcl space)

.

想要將一個tcl的var和c++的var綁定(binding),按照NS by Example的範例,要在c++ clas的constructor中將想要bind的var透過bind這個function將c++的var address export到tcl space(畢竟兩個是在不同的記憶體空間)

但是ns的us manual 24.4.2中提到,在C++中使用bind()會使你創建的每個物件都消耗記憶體,若你創建許多相同的物件時,使用bind的代價太高。將bind()代換成delay_bind(),使得所需要的記憶體降到per-class level而非每個物件,從ns/object.cc參考如何binding的範例

那要如何使用delay_bind?

google了一下,其實沒有答案(中文的我就不期待了)

自己試了一下,簡單的說
1.在class對應的header file(.h)中,在protected下宣告兩個virtual function:
2.在class的實作中(.cc)實作此兩function
delay_bind_init_all的實作中,要call delay_bind_init_one() initialize tcl space的var,最後要記得call繼承者的delay_bind_init_all()
delay_bind_dispatch的實作中,要call delay_bind()來實現binding,最後同樣要記得call繼承者的delay_bindl()

我提供了一個範例(download),這個範例是從NS by Example的ex-linkage.cc改過來
可以直接放到ns的目錄中,將ex_link_delaybind.o加入Makefile的object list(OBJ_CC)中,重新make

make

再下載script file(download),同樣的,這個script file也是從NS by Example的ex-linkage.tcl改過來的,執行即可看到binding結果,結果就是在tcl中任意改var,class中對應的var也會變

ns ex_link_delaybind.tcl


大概解釋一下程式,我的C++ class為:MyAgentDelBind,繼承自Agent,該class中有兩個private data member:my_var1_、my_var2_想要跟tcl的data member連結
c++的my_var1_要跟tcl的my_var1_otcl連結
c++的my_var2_要跟tcl的my_var2_otcl連結

具體做法為
1.在class對應的header file(.h)中,在protected下宣告兩個virtual function:

virtual void delay_bind_init_all();
virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);




2.在class的實作中(.cc)實作此兩function

delay_bind_init_all()的實作如下,這裡是主要initialize tcl space的var,因為此class是繼承自Agent,所以最後要記得call agent的delay_bind_init_all()

void MyAgentDelBind::delay_bind_init_all()
{
delay_bind_init_one("my_var1_otcl");
delay_bind_init_one("my_var2_otcl");
// MyAgent inherit from Agent => remember to call the ancestor's delay_bind_init_all()
Agent::delay_bind_init_all();
}


delay_bind_dispatch的實作如下,delay_bind就是在這裡被call來做tcl space跟C++ space var的連結,因為此class是繼承自Agent,所以最後要記得call agent的delay_bind_dispatch(),如此,就完成了cl space跟C++ space var的連結,跟以前在class constructor中call binding的做法不同

int MyAgentDelBind::delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer)
{
if (delay_bind(varName, localName, "my_var1_otcl", &my_var1_, tracer))
return TCL_OK;
if (delay_bind(varName, localName, "my_var2_otcl", &my_var2_, tracer))
return TCL_OK;

// MyAgent inherit from Agent
// if delay_bind_dispatch matches none of above => remember to call the ancestor's delay_bind_dispatch()
return Agent::delay_bind_dispatch(varName, localName, tracer);
}
}


然後我在BTSim注意到,BTSim的parameters在tcl跟c++ space的var name相同,驗證了一下
確實tcl的var name可以跟c++ binding的var name同名(其實蠻理所當然的,兩個var在不同space,事實上addr也不同,也各自有自己的instance)

另一個問題是,針對export出去的var,若同時在c++ constructor給定初始值,又在script file中assign該export var,那麼結果會是怎樣?
同樣的,做了一下實驗
結果是,C++的constructor會先被執行,script file會接著overwirte該var
所以當script file有assign value時,以script file的value為準,否則,就是constructor assign的value為準

另外,delay_bind還有其他一些變化
delay_bind_bool:用來將c++的int連結到tcl的booling值 (FullTcpAgent有用到),但是實驗顯示,其連結的變數型態只能是int,只是可以在tcl裡設定true或是false而已
delay_bind_time:用來連結c++的double到tcl的time value(FullTcpAgent有用到,但型態還是dobule)
delay_bind_bw:用來連結c++的double到tcl的bandwidth value(雖沒人用到,但我試過,這個api是存在的,且有用)

.

ns節省記憶體的小技巧

.

在ns user manual 24.4.2中介紹了一些節省記憶體的小技巧:

  1. 避免trace-all:$ns trace-all $f會使得trace objects被塞到所有links,若你只想trace一個link,這個overhead是可以避免的,每個link約可節省14KB
  2. 在使用系列的var時,盡量用array:ns中的每個var都有overhead,如set n$i [$ns node]中的n$i(就像n1, n2, n3, ...),若需要系列的變數時,使用array取代,如n($si)(就像n(1), n(2), n(3), ...),那麼其實只有一個變數會被使用(即n),每個變數可以節省40+Btye
  3. 避免宣告不需要的變數:若一個物件在後面不會再用到,那麼避免為該物件取名,每個變數可省約80B,如下列會為CtrMcast的物件指定一個變數:cmcast(1),但這其實是不必要的set cmcast(1) [new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]]
    可以代換成:
    new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]
  4. 在FreeBSD上run:在FreeBSD上malloc的overhead比其他的OS小,ns2的作者們最後還是會將FreeBSD的allocator port到其他平台
  5. Dynamic binding: 在C++中使用bind()會使你創建的每個物件都消耗記憶體,若你創建許多相同的物件時,使用bind的代價太高。將bind()代換成delay_bind(),使得所需要的記憶體降到per-class level而非每個物件(我個人的解讀時,bind會使得所有物件都用到它,不管需不需要,就像global variable的宣告,而delay_bind則是當宣告的物件有用到它時,也就是宣告的物件為該class時,這時才真的宣告=>這時才秏記憶體),從ns/object.cc參考如何binding的範例
  6. disabling packet header:在大量packet的simulation中,將你simulation中不會用到的packet header取消將會大量的節省記憶體(ns default是將所有packet header打開
    可在宣告ns前(set ns [new Simulator])輸入:
    remove-all-packet-headers,將所有packet header關閉(在ns宣告前輸入才有用)
    再將需要的packet header加回來,如IP、TCP:
    add-packet-header IP TCP Flags

原文如下:

Some tips to saving memory (some of these use examples from the cmcast-100.tcl script): If you have many links or nodes:
  1. Avoid trace-all : $ns trace-all $f causes trace objects to be pushed on all links. If you only want to trace one link, there’s no need for this overhead. Saving is about 14 KB/link.
  2. Use arrays for sequences of variables : Each variable, say n$i in set n$i [$ns node], has a certain overhead. If a sequence of nodes are created as an array, i.e. n($i), then only one variable is created, consuming much less memory. Saving is about 40+ Byte/variable.
  3. Avoid unnecessary variables : If an object will not be referred to later on, avoid naming the object. E.g. set cmcast(1) [new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]] would be better if replaced by new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]. Saving is about 80 Byte/variable.
  4. Run on top of FreeBSD : malloc() overhead on FreeBSD is less than on some other systems. We will eventually port that allocator to other platofrms.
  5. Dynamic binding : Using bind() in C++ consumes memory for each object you create. This approach can be very expensive if you create many identical objects. Changing bind() to delay_bind() changes this memory requirement to per-class. See ns/object.cc for an example of how to do binding, either way.
  6. Disabling packet headers : For packet-intensive simulations, disabling all packet headers that you will not use in your simulation may significantly reduce memory usage. See Section 12.1 for detail.


.

2011年3月18日 星期五

里爾克《給青年詩人的信》

.

摘錄自「這輩子,只能這樣嗎?」

拜傳統之賜,人們傾向用最簡單的方法解決事情,越簡單越好。但很明顯的,我們要把握的是艱難的部份;適者生存的贏家,往往都能堅持到底。

.

2011年3月17日 星期四

關於"秩序"

.

以下節錄至"這輩子,只能這樣嗎?"

作者引述艾米爾的話:

「秩序」代表光和和平、內在的解放,以及對自己的完全掌控;秩序是一種力量。內心的真善美來自你對周圍與內在一切秩序的認知、接受與體悟。秩序是人類最大的需求,也是內在真我的極致表現。

.