Pages

2011年4月30日 星期六

[Java] initializer blocks

在撰寫Java的class時,可以設定class成員變數的初值,然而,如果成員變數的設定需要做一些判斷才能給初值,除了在建構式內撰寫判斷之外,以下的方法可以有條件的設定初值給成員變數:

public class UncleClass
{
      int v;
      { // 直接以括號開始寫,
        //括號前沒有任何函式名!!

            //這裡寫判斷式,並設定v的初值。
      }
      public UncleClass() {;}
      // …
}

上面沒有函式名稱的括號刮住的,就是initializer blocks。寫在裡面的code會自動複製到主類別(UncleClass)的每個建構式內,蠻適合用於一個類別有很多個建構式的情況。

2011年4月29日 星期五

[x86 Processor 組合語言] PTR, offset and Stack

今天剛弄懂的一點語法,記錄下來。

以下記錄關於PTR的用法:
1.   ptr指向的位置,裡面的值可以拿出來用。例如:
      mov   ax,BYTE   ptr   Uncle
      ;可以將Uncle這個變數從offset開始取出Byte長度的值,丟給ax。
      ;Offset指向的位置,是從較低位開始。

      於是我推測,如果寫:
      push   dword   ptr   3     ;代表將3這個數字從低位數開始,
                                            ;取dword長度(也就是4個byte),推到堆疊。
                                            ;所以就是把3推到堆疊。

       如果寫:
       push   dword   ptr   offset   Uncle
       ; 代表將Uncle這個變數的位址取出,取dword長度,推到堆疊。

2.   offset跟ptr不同在於,ptr拿的是值,offset直接將某個變數的位址取出。

Stack:
1.   每次push,會減少ESP的值(每次減少4的byte數要看operand的資料大小)。所以ESP指向的記憶體位址,會隨著push越多資料而越來越小的。

2.   pushad跟popad適合分別寫在某程序的開頭跟結尾,如果此程序有更改到如EAX、ECX、EDX、EBX、ESP等等32bit的暫存器。

2011年4月28日 星期四

[Java] Applet

Java的Applet是可以在網頁上執行的程式。
Applet跟Application不同處是有public void init()、public void start();、public void stop()及destroy()四個函式。
要將Java Application改成Applet很簡單,只要做以下步驟就可以:

1.   首先,主要的類別要extends Applet。並且import java.applet.*;

2.   在此複習我之前寫的GUI程式結構:
       public class UncleClass implements ActionListener
       {
              //元件宣告區,大部分會有個frame。
              public static void main(String s[])
              {
                    UncleClass uu = new UncleClass();
              }
              public UncleClass()
              {
                  //設好屬性,add進來。
                  f.setVisible(true);  //frame f
              }
              public void actionPerformed(ActionEvent evt)
              {
                  //觸發事件處理。
              }
              //寫一些UncleClass自己的函式。

       }// UncleClass

      如此要改成Applet,需改變的地方,可以將建構式改成空函式,將原來建構式內的程式碼,移到public void init()裡面。而start()裡可以寫成:
       public void start()
       {
             super.start();
       }
       至於stop()跟destroy()可以不用寫出來。
       原來在物件宣告處定義的frame,改為定義在main裡面:
       public static void main(String s[])
       {
             UncleClass uu = new UncleClass();
             Frame f = new Frame(“FrameName”);
             uu.init();       uu.start();
             f.add(uu, “Center”);
             f.setSize(300,500);
             f.setVisible(true);
       }
       將Frame的屬性設定放在main裡面。注意如果Frame要使用BorderLayout,在init()裡面,要多一行:
        setLayout(new BorderLayout());
        在init()裡面可以加入一些元件到Frame中:
        直接寫add(ta, “Center”);,不用寫f.add(…)。
        最後加上paint函式:
              public void paint(Graphics g)
              {
                    //視窗縮放或重畫會呼叫這裡。
                    validate();
               }

3.   最後簡單寫一個html文件:
       <applet code=UnlceClass width=300 height=500></applet>
       開啟此html網頁,就可以看到Applet程式了。


        另外,validate()的作用是把Container裡面的元件再lay out出來一遍。建議在物件有add或者其他動作時都要validate一下。
        而有時視窗顯示有問題,將視窗放大縮小又變正常,此時setVisible設為true很可能可以解決此問題。

有了Applet,就可以在自己的網頁上放程式,讓大家一進自己的網站就可以按一些圖形介面了!!

                                                                        by Uncle

2011年4月27日 星期三

[Windows API] 改文字顏色跟移動游標

1.   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),色碼);
      //色碼從0~255,這個函式可以設定輸出文字的顏色跟背景,共256種組合。
      //可以寫一個簡單for迴圈,還看所有的色彩組合。

2.   以下的函式,可以移動游標到console特定的位置。
 
void gotoxy(int x, int y)
{
COORD cc;
cc.X = x;
cc.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cc);
}
 
//其中y是代表row,x代表column。(0,0)座標位置從螢幕左上方開始。 

[Matlab] 2種重要陣列用法

以下是2種要注意的陣列用法:
1.   之前有提到陣列用分號區隔不同的row。
      例如:A[0 0 1;1 0 0] =
      0 0 1
      1 0 0
2.   在陣列表示法中遇到冒號,代表"從某個位置到某個位置",冒號左右都沒有寫,代表全部的row或全部的column。例如:
       A = [0:5] = 0 1 2 3 4 5   %從0到5,兩元素間相差1(公差)。
       B = [0:2:5] = 0 2 4         %從0到5,公差為2,所以只計到4。
       C(1:5,:)             %代表row取1~5個row,column取全部的column。

2011年4月26日 星期二

[Java] 圖形介面常用物件及方法1

以下整理幾個圖形介面程式常用的物件及方法:
1.   TextArea:有捲軸,可以顯示多行文字的空白區域,可以將之設為可輸入文字,或者只能唯讀不能輸入。
2.   TextField:可以輸入單行文字的區塊。
      例如: tx = new TextField(12);   //新增一個12個columns的TextField。
3.   TextArea跟TextField都有繼承到setFont函式,可以改變字型。其使用方法為:
                      a.setFont(new Font(“新細明體", Font.PLAIN,12);
      最左的參數是字型名稱,中間的參數是style,右邊的參數是字體大小。
style有:
Font.PLAIN、Font.BOLD、Font.ITALIC、Font.BOLD+Font.ITALIC。
4.   Panel是一種container。container可以add一些物件到container內排列。排列方式有很多種,我學到的有:FlowLayout,這種排列方式是將元件由左到右,由上到下的順序排列,且不會改變元件大小。而BorderLayout則可以指定元件位置為東西南北中,且元件大小會依據位置做延伸改變。
Panel預設是FlowLayout。要更改LayoutManager時,可以用container的setLayout函式:
             p1.setLayout(new BorderLayout( ) );


5.   java.awt.*內的List,是一種container,有捲軸,裡面可存文字選項。

2011年4月21日 星期四

[x86 Processors 組語] 常用指令

(1)建立陣列:
   arr1   SWORD   10   DUP(0)   ;代表建立一個名為arr1的陣列,
                                                     ;大小為10,陣列元素型態為SWORD,
                                                    ;陣列中每個元素初始化為0
(2)   .code   ;代表code segment的開始。
(3)   main PROC   ;PROC是一個指令,main是procedure名。
       ………
        main ENDP   ;代表 main procedure的結束。
(4)   END   main   ;指出程式進入點是main,
                             ;指出最後一行被組譯的程式。
(5)   mov   esi,OFFSET   abc   ;esi存著abc的記憶體位址開頭。
(6)   call readint會從鍵盤讀進32bit signed整數,並存到eax,而call writingstring的話則會將edx指向的字串輸出到console。

[x86 Processors組語] 移除MASM32

安裝MASM32後,如果想要移除MASM32,直接在安裝MASM32的磁碟下將"masm32"資料夾移除即可,如此即為完全移除,並不會有任何登錄檔設定沒有完全移除的問題。(MASM32是file based)

2011年4月17日 星期日

[演算法] heap

(1) 建立一個heap,矩陣的index跟heap從root由上往下由左往右數的index相同。

(2) 高度定義為heap中某個node由上往下找最常路徑到達leaf所經過的edge數。

(3) 由等比數列可知,n個元素的heap其高度為floor(lg n)。因為:
2^h <= n <= 2^(h+1) – 1

(4) heap中,假設陣列index從1開始數且陣列大小為n個元素,index為floor(n/2) + 1開始的node都是leaf。所以在建立heap的時候,要從index為floor(n/2)開始的node一直到index為1的node,將每個node調整為符合max-heap或min-heap的特性。

(5) min heap可以應用在Huffman code上,剛好我這次通訊模擬作業有講到這種編碼在通訊的應用,不過我還不熟悉這種編碼的演算法,只知道此編碼可以壓縮資料。

2011年4月16日 星期六

[數學] Cantor's diagonal argument

我研究了Cantor's diagonal argument之後,我的想法是:證明Real Number不可數的過程,取對角線的目的是為了證明橫向跟縱向都不可數。

a1 = 0.a11 a12 a13 a14 a15 ...
a2 = 0.a21 a22 a23 a24 a25 ...
a3 = 0.a31 a32 a33 a34 a35 ...
a4 = 0.a41 a42 a43 a44 a45 ...
a5 = 0.a51 a52 a53 a54 a55 ...

...
...

我是覺得如果只取直的或是橫的,那麼只能證明一個方向不可數。
所以只要設計一個實數,小數點以下相對位置跟對角線方向出現的數字故意不一樣,就得證實數不可數。

[演算法] n lg n = o(n^1.26)

由 lg x < 0.26 x可看出。(x足夠大時)

2011年4月15日 星期五

[JavaScript] 初學者的心得1

終於開始踏出JavaScript學習的第一步。
這禮拜與幾個同學討論,並研究JavaScript,記錄下一些JavaScript筆記,整理如下:

1. addEventListener()是IE以外的瀏覽器在使用的(如FireFox),IE使用attachEvent()。
2. 建立一個物件:
var a = new Object(); //把Object()當成建構式來用
Object括號內可以有參數值。

如果寫:
var a = Object(); //代表把Object()當成function來用

3. prototype:函式都有prototype,我的想法是每個物件都有自己的屬性以及從prototype繼承來的屬性。自己的屬性只屬於自己才能使用,而prototype則是只要相同類別的物件都可以使用。

另外讀取某個物件的屬性時,會先從物件自己的屬性去尋找,若物件自己沒有定義這個屬性,則會去物件繼承下來的prototype去尋找有沒有這個屬性。

4. 另外今天的討論過程也提到,JavaScript的function有幾種不同的定義方式:
(1) var func1 = function() { //在此定義函式內容}
(2) function func2() {//在此定義函式內容}
(3) var func3 = new Function("a","b","alert(a+b);")

其中第(3)個大寫開頭的Function是一種建構式,括號裡面可以列出要傳遞的參數,這些參數必須是字串。最後一個參數是函式內容。
使用Function建構式可以動態的新增函式內容,我之前詢問許多同學是否有任何語言可以動態新增函式定義,根據我目前的學習,JavaScript似乎可以做到。

5. 使用toString()可以將很多種東西轉換為字串。
我自己將上面的func1、func2跟func3轉換為字串(假設func1跟func2都沒有定義任何函式內容),在JavaScript控制台下看輸出結果如下:

>func1.toString()
"function (){}"

>func2.toString()
"function func2(){}"

>func3.toString()
"function anonymous(a,b) {
alert(a+b);
}"
發現只有func2有函數名字,其原因目前我還不太清楚(我學東西特別慢...唉唉),等下一篇再記錄function相關的心得吧。

2011年4月12日 星期二

[Malab] 訊號的表示

以下記錄matlab中訊號的表示法:

(1)擁有時域範圍,先定義取樣率跟觀察範圍,利用點乘符號(".*")定出訊號:
ts = 1/40;
t = [-2:ts:4];
x = (t+2).*(t>=-2 & t<=0) + (2+2*(cos(0.5*pi*t))).*(t>1 & t<=3) + (t>3 & t<=4);

(2)如果定義訊號為
x(t) = 9, 0 <=t< (t0/3)
-5,(t0/3) <=t< ((2*t0)/3)
0, otherwise

則一樣定出取樣率、觀察範圍跟訊號:
ts = 0.0005;
t = [0:ts:t0];
x_t = [9*ones(1,t0/(3*ts)),-5*ones(1,t0/(3*ts)),zeros(1,t0/(3*ts)+1)];

其中zeros(a,b)代表製造a個row以及b個column的零矩陣。ones語法跟zeros一樣。

陣列用分號區別每個row,例如:x = [0 0 2;0 0 1],則:
x =
0 0 2
0 0 1
而用逗點或空白來區別每個column。

2011年4月11日 星期一

[Java] 圖形介面第二次總整理

以下記錄我學習到的JAVA關於圖形介面的整理:

1. import java.awt.*
這是Abstract Windows Toolkit類別庫。

2. import java.awt.event.*
在這個package裡有許多Listener和Event。

我先在此記錄使用implement ActionListener的方式,來產生event。
當撰寫implement ActionListener時,查手冊可知,ActionListener裡只有一個interface,就是actionPerformed要撰寫。

依照以下步驟來撰寫事件:

(i) 創造一個class(假設類別名稱叫做UncleClass),並讓此類別implements ActionListener。
(ii) 接著只要在這個UncleClass裡,每個物件立即會自動有addActionListener這個方法。利用這個方法可以呼叫actionPerformed來處理執行觸發的事件。

整體程式架構如下:

import java.awt.*;
import java.awt.event.*

public class UncleClass implements ActionLister
{
//這裡宣告要放在這個視窗裡的物件,如按鈕或文字等等。

public static void main(String s[])
{
UncleClass uncle = new UncleClass();
}
public UncleClass()
{
//在建構式裡面,要做的事情就是把剛剛宣告的物件,設好屬性,add進來。
//例如先new出一個按鈕Bt,設定好大小位置或文字等等屬性。
//然後將這個按鈕,用this.add(Bt)的方式,貼到這個視窗上。
//最後寫Bt.addActionListener(this);將觸發事件交給actionPerformed處理。
}

public void actionPerformed(ActionEvent evt)
{
//處理觸發事件。
}
}// class UncleClass.

//------------------------------------------------------------------------//
3. 還有一種寫法:
public class UncleClass extends Frame
{
//跟上面的寫法一樣。
//只是在addActionListener時候,寫Bt.addActionListener( new BtListener() );
}
class BtListener implements ActionListener
{
//在這裡把interface寫好。
public void actionPerformed(ActionEvent evt)
{
//處理觸發事件。
}
}

//我個人覺得比較喜歡第二種架構。