Showing posts with label note. Show all posts
Showing posts with label note. Show all posts

2008-06-25

Head First Design Pattern in C++

最近要開始唸 Head First Design Pattern... 裡面都是JAVA程式碼:P

雖然JAVA是我最早學的語言,不過最近偏向用C++ @@"

JAVA寫起來是很好看沒錯...不過user要裝VM才能用實在是有點麻煩,而且速度也稍慢,GUI介面也與OS原生的有點不搭...

離題了...

http://sourceforge.net/projects/hfdp-cpp/ 這裡有人把 Head First Design Pattern中的 code 改成 C++,可以參考看看。不過不看這個直接看書應該就能寫出 C++ code,畢竟設計模式可是不分語言的。

2008-05-17

狼與犬

小時候玩動物棋,狗可以吃掉狼。童話故事也說牧羊犬可以擊退狼。但是最近看了一部電影,裡面的狼跟狗很像,或者是說裡面的狗跟狼很像...又勾起我的好奇心。

Anyway.. 狗跟狼有什麼不一樣? 查了學名才知道,原來狗就是狼,兩者是同一種生物,交配所生的的狼狗,仍具有生育能力。

同樣的情形出現在金魚身上,之前看到電視節目說金魚是由鯽魚演化而來,是演化的例子。但是,令人疑惑的是,物種的演化現在應該沒有實例才是...。

因此我又查了兩者的學名,果然跟狗一樣,金魚就是鯽魚,兩者是同種生物,可以交配產生有生育能力的後代。

這兩個例子可以看出一個演化的難題:在自然環境雜交的情況下,基因的變異,應該是比人工育種的情況下更難保留。那麼,既然經過長期人工育種造成變異,也無法產生新種生物,在自然環境豈非更不可能產生新物種?

回想起之前動物園的河口鱷跟尼羅河鱷的區分事件,我又查了維基百科,發現兩者學名不同,所以是不同種生物,沒記錯的話,這表示兩者是不能交配的。即使兩種生物差別不大。

這個例子可讓人想到物種演化的另一個難題:假設一個新物種誕生了,他能夠繁衍後代嗎?

這情況類似鱷魚,很相似卻不同種,而無法交配產生後代。除非同時產生同種一公一母,但機率太低,可以說是不可能的。

兩個難題為獨立事件,機率相乘,自然演化出新物種的機率,將會低於不可能乘以不可能。

Reference

http://en.wikipedia.org/wiki/Dog
http://en.wikipedia.org/wiki/Wolf
http://en.wikipedia.org/wiki/Carassius_auratus
http://en.wikipedia.org/wiki/Crucian_carp

2008-04-20

C++ Vector Iterator

vector 新增/刪除元素會導致 iterator 失效,此時不該再對其 iterator 做 dereference ,否則產生 runtime error。

使用 list 可保證 iterator 不失效,但 iterator 前後關係仍會改變。此外 list 不支援像 aList[i] 這樣直接用 index 存取其中的元素。

2008-04-18

C++ Dynamic 3D Array

WoW!

#include <iostream> int main(void){ int i=6,j=5,k=4; int ****threeDimensionArr;// 4 stars! for 3D threeDimensionArr = new int ***[i]; for(int i_i=0; i_i<i; ++i_i){ threeDimensionArr[i_i] = new int **[j]; for(int j_i=0; j_i<j; ++j_i){ threeDimensionArr[i_i][j_i] = new int *[k]; for(int k_i=0; k_i<k; ++k_i){ threeDimensionArr[i_i][j_i][k_i] = new int(i_i*j_i*k_i); std::cout << *threeDimensionArr[i_i][j_i][k_i]<<"\t"; } std::cout << std::endl; } std::cout << std::endl; } //free memory for(int i_i=0; i_i<i; ++i_i){ for(int j_i=0; j_i<j; ++j_i){ for(int k_i=0; k_i<k; ++k_i){ delete threeDimensionArr[i_i][j_i][k_i]; } delete [] threeDimensionArr[i_i][j_i]; } delete [] threeDimensionArr[i_i]; } }

C++ Array of References?

It's legal to get reference of dynamical allocated object:

std::vector<double> *vec = new std::vector<double>(5); std::vector<double> &vec0Ref = *vec;

Use it:

#include <iostream> #include <vector> int main(){ size_t *n = new size_t; std::cin >> *n; std::vector<double> *vec = new std::vector<double>[*n]; // No error when vec is Pointer to Nothing! (*n == 0/1) // It is dangerous using dynamic array... std::vector<double> &vec0Ref = vec[0]; std::vector<double> &vec1Ref = vec[1]; double *a = new double; std::cin >> *a; vec0Ref.push_back(*a); //runtime-error when *n <= 0 std::cout << vec0Ref[0] << std::endl; vec1Ref.push_back(*a); //runtime-error when *n <= 1 std::cout << vec1Ref[0] << std::endl; }

Note:

會想到要拿到動態物件的 reference,是因為想要在物件建立後使用 array of references 取代 array of pointers ,用來放 sorting 的結果或做 mapping。但發現 It's illegel!

reference 並不能用來作為 array 或 container 的元素。基本上,reference 並不是物件,因此沒有辦法複製它,或改變其內容(指reference本身);其意義只是物件的別名。在JAVA/C#中的意義又不太一樣了;reference 感覺像是 const pointer。

當我們要對已存在的數個物件做 mapping,sorting 之類的動作,只能使用 array of pointers 來避免複製物件。之前會想要使用 reference 是因為書上說使用 reference 比 pointer 自然,也錯把 reference 視作 const pointer。(以前學JAVA= =)然而在這種情況下,使用 array of pointers 才是合理且正確的用法。

Another Test:

#include <iostream> int main(){ //existing objects int a=1, b=2; int arr[2] = {a,b}; // correct //error: declaration of `refs' as array of references int &refs[2] = {a,b}; //error! //array of pointers to integer int *ptrs[2] = {&a,&b}; // correct //reference of arr[2] int (&ref)[2] = arr; // correct //pointer to arr[2] int (*ptr1)[2] = &arr; // correct //assign "array" to "pointer to array" int (*ptr2)[2] = arr; // error! //pointer to first element of array int *ptr3 = arr; // correct std::cout <<"arr="<<arr<<" arr[1]="<<arr[1]<< std::endl <<"ref="<<ref<<" ref[1]="<<ref[1]<<std::endl <<"ptr1="<<ptr1<<" *ptr1="<<*ptr1 <<" (*ptr1)[1]="<<(*ptr1)[1]<<std::endl <<"ptr3="<<ptr3<<" ptr3[1]="<<ptr3[1]<<std::endl; std::cout <<"sizeof(arr)="<<sizeof(arr)<<std::endl <<"sizeof(ref)="<<sizeof(ref)<<std::endl <<"sizeof(ptr1)="<<sizeof(ptr1)<<std::endl <<"sizeof(*ptr1)="<<sizeof(*ptr1)<<std::endl <<"sizeof(ptr3)="<<sizeof(ptr3)<<std::endl; }
將錯誤去掉後的執行結果:
arr=0012FF5C arr[1]=2 ref=0012FF5C ref[1]=2 ptr1=0012FF5C *ptr1=0012FF5C (*ptr1)[1]=2 ptr3=0012FF5C ptr3[1]=2 sizeof(arr)=8 sizeof(ref)=8 sizeof(ptr1)=4 sizeof(*ptr1)=8 sizeof(ptr3)=4

可見 array of reference 不合法。

此外,雖然 ptr3 跟 arr 幾乎等效,ptr3 其實還是 pointer to int(arr[0]) 而非 array name。而 ptr1 是 pointer to arr,因此*ptr1 就是 arr。

2008-04-13

C++ Dynamic Array Test

Note:

The elements of a dynamically allocated array can be initialized only to the default value of the element type. The elements cannot be initialized to separate values as can be done for elements of an array variable.

To initialize elements,

method 1:

std::cin >> n; std::vector<int> **vec = new std::vector<int> *[n]; for (int i=0;i<n;i++) //initialize each vector vec[i]=new std::vector<int>(i); // use first vector vec[0]->push_back(something);

method 2:

std::cin >> n; // vectors are initialized by default constructor std::vector<int> *vec = new std::vector<int>[n]; for (int i=0;i<n;i++) // change size of each vector (vec+i)->resize(i); // equivalent to vec[i].resize(i) // use first vector vec[0].push_back(something);

2008-04-12

C++ Array and Reference Test

這幾天在學C++,對arrayreference的用法做個測試。

#include <iostream> #include <string> void test(std::string (&str)[2]){ std::cout << sizeof(str) << " " << sizeof(std::string); } int main(){ size_t n; std::cin >> n; size_t m = 2; const size_t o = 3; std::string *testStrArr1 = new std::string[n];// correct std::string testStrArr2[n]; // wrong in VC++, correct in gcc, wrong in ISO C++ std::string testStrArr3[2] = {"hello","hi"}; // correct std::string testStrArr4[m]; // wrong in VC++, correct in gcc, wrong in ISO C++ std::string testStrArr5[o]; // correct test(testStrArr1); // wrong test(testStrArr2); // wrong test(testStrArr3); // correct test(testStrArr4); // wrong test(testStrArr5); // wrong [3]->[2] }

正確的那行會印出: 8 4

2006-12-29

Scilab: Root Locus, Transfer Function Analysis

昨天考完控工...結論是...又爆了一次...
最後一題 Root Locus還畫錯= =|

所以,今天就來說一下怎麼用 Scilab畫 Root Locus,題目就是昨天寫錯的那一題。

Problem

Transfer Function
題目沒給,也不需要
Characteristic Equation
1 + KL(s) = 0
L(s)=(s+5)^2 / s^3

Solve in Scilab

要建立"s"的多項式,一個好方法是:先產生一個只有一個根在0的多項式,也就是 s。
s = poly(0, "s"); //s 是以"s"為變數名稱,只有一個根在 0 的多項式
然後再用 s來產生更複雜的多項式。

以本題來說,就是:
L = (s+5)^2 / s^3

如何?簡單吧= =
接下來需要將多項式轉換成線性系統(Linear System),我還沒研究好這是什麼...
sysL = syslin('c',L)
'c' 是連續的意思(continuous system)

接下來就可以畫圖了,只要一個指令:
evans(sysL, 50)
50是指畫到 K=50,可以任意更改。

如果你覺得圖怪怪的,那你有認真唸書。怪在實數軸跟虛數軸的單位長度不同,要打開圖形選項中 Aspect標籤裡的 isoview選項即可。

And...

我們也可以畫 Bode, Nyquist, Nichols 等圖形,方法如下:

Bode Plot
Assume that L(s) is a transfer function.
bode(sysL)
Nyquist
nyquist(sysL)
Nichols
black(L)
//誰能告訴我為何叫 black?
//還有 Nichols Plot 是什麼我也不知道XD

2006-12-20

Scilab 複數運算

因為今天把工程計算機借給了某評審,導致我回家沒計算機用,事前沒想到會這樣...所以就打開Scilab來算啦!試了好久,做一下筆記。

表示虛數的 i, j,在 Scilab中用%i表示,首先要知道這個。

舉個例,我們要算某 Transfer Function T= R/[R + 1/(sC)]

令 R= 4.7KΩ, C= 0.01μF,並令 s= jω求 f= 1kHz的 Frenquency Response,這樣在Scilab中的算式就是:
T=4700./(4700+1./(%i.*2.*%pi.*1e3.*0.01e-6))

接著算Transfer Function的相移(複數平面的角度),用atan()函數來算:
atan(imag(T),real(T))

換算成度數:
atan(imag(T),real(T)).*360./%pi

atan()的第一個參數是虛數部份,第二個才是實數,要注意。real()跟imag()就是取實部跟虛部的意思。

2006-12-17

How to Compile wxWidgets in Windows Using MinGW

Download

wxWidgets
wxWdigets 2.8.0 is used in this post. Enter the "Download" page of this site, then download wxMSW source archieve.
MinGW
Enter the "Download" page, then download MinGW-5.0.2.exe or newer version in the "Proposed" section.

Inatall

Execute files you just downloaded. Inatall step by step. Be sure that make tool and C/C++ compilers selected when installing MinGW.

Add path [MinGW Directory]\bin to Path variable.

Change directory to [wxWidgets Directory]\build\msw

Enter mingw32-make -f makefile.gcc UNICODE=1 SHARED=0 BUILD=release MONOLITHIC=0

Now we can compile sample programs using the same command. The output binary file will be in the gcc_mswu subdirectory.

Reference

This post is just a note for myself

2006-12-13

OpenOffice.org 2.1 Is Released!

From http://www.openoffice.org/

OpenOffice.org 2.1 is recommend for all users, as it represents a significant improvement over all previous versions. Among other things:
  • Multiple monitor support for Impress
  • Improved Calc HTML export
  • Enhanced Access support for Base
  • Even more languages
  • Automatic notification of updates

We also have more extensions. Developers everywhere are invited to write extensions. To learn more, visit our Extensions Project.

OpenOffice.org 一直是我的愛用軟體。我也有裝 MS Office XP,比較起來OpenOffice.org真的比較好用,對Unicode的支援也好很多。新版的MS Office我沒用過無法比較。

相容性的問題,OpenOffice.org 輸出成 MS Office的格式後用MS Office開啟,格式不會跑掉。然而用OpenOffice.org開啟MS Office製作的檔案時還是會走樣。這是不是代表同一種格式有不同的寫法?= =

所以如果要開別人用MS Office製作的檔案,就用微軟免費的viewer吧。

PowerPoint Viewer 2007
http://www.microsoft.com/downloads/details.aspx?FamilyID=048dc840-14e1-467d-8dca-19d2a8fd7485&DisplayLang=en
Word Viewer 2003
http://www.microsoft.com/downloads/details.aspx?FamilyID=048dc840-14e1-467d-8dca-19d2a8fd7485&DisplayLang=en
Excel Viewer 2003
http://www.microsoft.com/downloads/details.aspx?FamilyID=c8378bf4-996c-4569-b547-75edbd03aaf0&DisplayLang=en
Visio Viewer 2007
http://www.microsoft.com/downloads/details.aspx?FamilyID=d88e4542-b174-4198-ae31-6884e9edd524&DisplayLang=en

2006-11-20

Ubuntu 6.10 edgy 新手用 firefly 字型設定

Step 1: Install "AR PL New Sung" Font

首先我們要安裝螢火飛新宋字型,這個字型在小字型時是用點陣字,所以看起來很清楚不會糊糊的。我們利用最易用的 apt-get 來安裝,不用打指令。

打開 "系統"->"管理"->"Synaptic套件管理程式"。搜尋 "ttf-arphic-newsung" ,或是慢慢自己找順便安裝喜歡的軟體XD。找到後在上面按右鍵選擇"標記為安裝",再按工作列的"套用",就裝好了。很簡單吧......= =a。接下來你可以直接在"系統"->"偏好設定"->"字型"裡面選擇剛剛裝好的到 AR PL New Sung 字型來用。但我們在這裡沒有要這樣作。

Step 2: Add "AR PL New Sung" Font List

在沒有安裝AR PL New Sung字型之前,Ubuntu就可以顯示中文字了,但是你會發現在偏好設定的字型中設定的是 Sans 跟 Monospace,那是因為原本的中文字型已經加入 Sans, Serif 跟 Monospace 的行列了,我們也要對AR PL New Sung字型做這樣的設定。

我們要修改 /usr/share/language-selector/fontconfig/zh_TW 這個檔案。如果你使用別的語言環境就修改你所使用的那一個,這裡的是中文(台灣)的設定檔。開啟終端機,輸入 sudo gedit /usr/share/language-selector/fontconfig/zh_TW

聰明的你應該知道怎麼改了:將 <family>AR PL New Sung</family>排到 <family>serif</family>
<family>sans-serif</family>
<family>monospace</family>
下面的 prefer list中。另外上面的 MingLiu, PMingLiu, 細明體, 新細明體的對應字型也可以改成"AR PL New Sung"。

Step 3: Set fontconfig

原本在 /etc/fonts目錄下應該要有個 language-selector.conf 符號連結到/usr/share/language-selector/fontconfig/zh_TW,這樣 /etc/fonts/fonts.conf 才會被 /usr/share/language-selector/fontconfig/zh_TW 更新。某些應用程式是看/etc/fonts/fonts.conf的內容來決定字型,例如 FireFox 就是。不過我的Ubuntu 6.10沒有 language-selector.conf 這個連結,大概大家都沒有,所以一樣在終端機下輸入:
sudo ln -s /usr/share/language-selector/fontconfig/zh_TW /etc/fonts/language-selector.conf

如果出現連結已存在,那先移除它:
sudo rm /etc/fonts/language-selector.conf
再重新執行上一個指令做連結即可。

最後我們要讓設定生效,輸入 sudo fc-cache -vf,就大功告成了,唬呼~

Note:

其實最後我測試的結果...發現AR PL New Sung根本不用裝了...只要做第3個步驟就行了。內建的 uming 字型似乎已有清楚的點陣字。已有大家可以試試看= =a

reference

2005-11-16

What is "metrics"?

讀計組時用英漢字典查了metrics這個字。出現的卻是:

metrics
韻律學; 作詩法 [google]

只好去查wikipedia:

Metrics

Metrics are a system of parameters or ways of quantitative assessment of a process that is to be measured, along with the processes to carry out such measurement. Metrics define what is to be measured. Metrics are usually specialized by the subject area, in which case they are valid only within certain domain and cannot be directly benchmarked or interpreted outside it. Generic metrics, however, can be aggregated across subject areas or business units of an enterprise.

Metrics are used in several business models including CMMI. These measurements or metrics can be used to track trends, productivity, resources and much more. Typically, the metrics tracked are key performance indicators.

2005-10-10

整張網頁抓圖

因為很多網頁比我螢幕高...想要抓下來介紹。用我本來用的Hello,就只能抓其中一部分。

所以去找了一下,發現這個HyperSnap可以自動滾動網頁來抓圖。

設定方法是到HyperSnap的Capture選單裡的Capture Settings裡的Capture標籤裡,把Auto-scroll window during Window Capture這個核取方塊打勾。

抓圖只要把HyperSnap開起來,按下Ctrl+Shift+w,滑鼠移到要抓圖的視窗,到空白的地方會出現一個向下的箭頭,點擊滑鼠左鍵就會開始自動滾動抓圖。

<拿我的Blog做一下示範>

不過HyperSnap好像不是免費軟體...等試用期過了再看看。再去找一下有沒有免費的好了...

2005-09-04

用DC當視訊


DCasWebCam. Originally uploaded by jieNew.

我弟今天搬到宿舍去(上大學了),他電腦裡的電視卡就由我接收啦。於是我就來試試看用相機的TV-OUT接到電視卡的INPUT來當視訊用。很早以前就想試試看了XD,聽說畫質比一般視訊好很多!!

可是接下來...發現...相機TV-OUT的連接線不見了= =....前後兩台相機的都不見...是怎樣...囧rz

以前舊相機那條不見後,我就去看過這種線的價錢,一條居然要好幾百= = 所以沒買。後來新相機也有TV-OUT所以有附,想不到又弄丟了...orz

那條線是3.5mm接頭轉三個梅花接頭,分別是黃色接頭影像輸出,還有紅白兩聲道。這種線我只知道數位相機有在用而已= =

= =..........................怎麼辦怎麼辦....

結果我很天才的拿3.5mm轉紅白RCA接頭的那種線來試,就是很普通接喇叭的那種線。因為......看起來很像= =||。

連接線一邊插數位相機,一邊接電視卡黃色 RCA 的 Video In...試了白色...沒訊號...紅色!......成功了!XD

畫質讚阿,跟一般的webcam比起來就像是沒近視比近視1000度!缺點是...相機很貴..不敢開太久= =|||...會燙= =