千呼萬喚,投稿結果終於出來了,漫長一個多月的等待真難熬。
過去畢業的學長好像都沒看到有投沒上的,讓我真害怕我會不會開先例。
現在心情終於可以放鬆。
記得那時看到第一個審查委員的審查建議,一度還以為上不了了,準備要吃小書書請的傷心野宴。好在最後還是通過審查。
完成畢業條件中很重要的關卡,現在就剩下碩士論文了,希望能順利畢業!
還有我碩二的好朋友們,GoGoGo~~~
2008年1月31日 星期四
(2008-01-31) Paper accept
Fields in interface
所有field宣告在interface,都會是static和final。在Java SE5前,由於沒有enum,所以都會用interface來宣告一組constant,例:public interface Days {
int
MONDAY = 1, TUESDAY = 2, WEDNESDAY =3,
THURSDAY = 4, FRIDAY = 5, SATURDAY =6, SUNDAY =7
}
2008年1月30日 星期三
Thinking in JAVA
上大學後,常常一時衝動想學什麼,就買了一本厚厚的原文書,然而,真正有讀完的卻是少之又少,常常就都只看了前面幾章,就變成裝飾品了。
子曰:「無欲速,無見小利。欲速,則不達;見小利,則大事不成。」
的確,人不可能什麼都會,什麼都只會皮毛,那就等於什麼都不會。所以,決定從我比較有興趣的地方開始著手。
我對於寫程式非常有興趣,總想自己也能開發什麼大的程式,然而,想到自己的程設能力,只能搖搖頭。學過C、C++、JAVA,但我真的不太敢跟別人說我會這些語言,說來漸愧。
與其想學這麼多語言,卻只碰到皮毛,不如,先專攻於某一個語言。以前,上課時,老師們總說學會一個語言,要學其它就很容易了,雖然我到現在還是不太相信這句話。
之前一直在想究竟要會哪種語言,對於出社會後會比較有幫助。但現在想通了,當你身上一個武器都沒有的時候,想這些是沒用的。
在自己的書堆中決定從JAVA著手。好巧的是手中恰有那本據說是JAVA書中的聖經之一《Thinking in JAVA》。不過,我用眼睛就看的出來了,厚厚的一本,一千多頁。
很多人說書不是一頁一頁從頭讀到尾。但我自己覺得每個人都有自己一套的讀書方式,而我就是那種會把書從第一章一頁一頁翻下去看的那種人。要我跳著看,實在是很痛苦。
最後,給自己的一句話:「我一定會看完的!」
@Override
Java SE5新增一個@Override的註記。用處是避免把Override寫成Overload。例:class Animal {
void walk() {
System.out.println("Walk");
}
}class People extends Animal {
String name;
@Override int walk() {
System.out.println(name + "walks");
return 1;
}
}
由於在People的walk函式前加入了@Override,所以應該要Override父類別的函式,但Animal並沒有int walk(),所以編譯時就會出現錯誤。
2008年1月29日 星期二
IEEE 754
IEEE 754定義了浮點數的表示方法,目前也廣泛被使用。IEEE有四種格式來表示浮點數:
Single-precision (32-bit)
Double-precision (64-bit)
Single-extended precision (≥ 43-bit)
Double-extended precision (≥ 79-bit)
常用的為Single-precision和Double-precision,以下就介紹這兩種表示方法
IEEE 754浮點數表示型式,有三個欄位,分別是sign、exponent、fraction,如下圖:
Sign:一個bit,1為負數,0為正數
Exponent:指數部份
Fraction:小數部份
Single-precision的Exponent為8 bits、Fraction為23 bits
Double-precision的Exponent為11 bits、Fraction為52 bits
為了讓指數部份,可以調到最負的指數能為00....002和最正的指數為11..112,所以指數都要加一個偏移值。Single-precision的偏移值為127,Double-precision的偏移值為1023。將實際的指數加上偏移值才是真正填入Exponent欄位的值。
為了讓fraction能用更多的bit來表示,fraction已隱含開頭的1(Leading 1),所以浮點數要用IEEE 754格式,必須先做正規化,讓開頭為1。
下面就舉簡單的例子 (以Single-precision為例):
將十進位-0.75用IEEE 754 single-precision來表示
首先將-0.75轉換成二進位
-0.11
正規化,讓開頭為1
-1.1 x 2^-1
計算exponent的值,將-1加上偏移值127
Exponent = -1 + 127 = 126
所以我們就得到這三個欄位的值:
負數,所以Sign = 1
Exponent = 12610 = 011111102
Fraction = 1
整個表示出來如下:
1 01111110 10000000000000000000000
2008年1月28日 星期一
使用Bluetooth
介紹如何用gnome-bluetooth套件,透過bluetooth來傳送檔案。
首先,假設系統已安裝了bluez utilities,且藍芽已經啟動。
安裝gnome-bluetooth套件
# apt-get install gnome-bluetooth
在桌面按右鍵選擇新增啟動圖示
名稱隨便填,如Bluetooth傳送檔案
Command填入gnome-obex-send
圖示隨便選一個喜歡的
之後,若要傳送檔案,則將檔案拖曳至此,即會跳出視窗,來選擇要傳送至哪個裝置。
2008年1月27日 星期日
Enumerated Types
Java SE5多了列舉(ENUM)型別,讓我們更方便使用。使用關鍵字enum。
enum有很多有用的function。它的toString()可以顯示每一個enum實體的名稱。ordinal()可以指出enum宣告的次序。還有一個static values()可以用來將enum constants轉換成陣列。例:public enum Card {
HEART, DIAMOND, CLUB, SPADE
}public static void main(String[] args) {
for(Card c : Card.values())
System.out.println(c + " " + c.ordinal());
}
執行結果如下:HEART 0
DIAMOND 1
CLUB 2
SPADE 3
Variable-length argument lists
JDK 5.0新增了Variable-length argument lists (Varargs)的功能,如同printf一樣,可以接受不定長度的參數列。其實Varargs的處理方式就是利用陣列。例:
public void printArray(String[] args) {
for(String str : args)
System.out.print(str + " ");
下例則使用Varargs的方式:
public void printArray(String... args) {
for(String str : args)
System.out.print(str + " ");
}
這兩種方式看起來相似,但Varargs可提供更多的功能。
簡化codeprintArray(new String[]{"one", "two"});
呼叫要宣告一個字串陣列printArray("one", "two");
利用Varargs則不須要再宣告陣列
此外,Varargs可以傳入零個參數。
2008年1月26日 星期六
大強台中一日遊
自從大強考上交大後,就很難有機會能見到他了。之前在台中還蠻常一起出遊的,印象最深刻的就是騎機車上合歡山了。
今天特別從新竹搭火車過來,說要一起聚個餐。
大強找了位於中港路上鋤燒這一間店。一開始我還以為是燒烤之類的,反正沒吃過,就去了。
由於沒訂位,所以大約等了十五分鐘才排到我們。原來,不是燒烤而是壽喜燒。
阿,一樣沒吃過,看了一下介紹,寫道:
壽喜燒的煮法是隔著鑄鐵鍋加熱,先將黑糖炒過再加入柴魚及特殊配方熬煮,冷卻後加入醬油將美味留在醬汁中。食用烹煮到最後較鹹,所以湯是不喝的。壽喜燒也被日本人稱為「沒有湯的火鍋」。
但我吃完的感覺,總覺得就是一直在吃牛肉就是了。
天公不作美,吃完後,外面下起傾盆大雨。不過還好,旁邊就是SOGO,我們就到了那晃了一下,消磿一下時間。
外面雨停了,看時間還早,於是決定去看場電影。一開始是決定去新光三越看,但到了那邊,都沒有看到劇情的介紹,所以就改到老虎城。
其實也沒有什麼特別想看的電影,挑來挑去,結果選了國家寶藏2這部上映很久的片子來看。
感覺劇情很普通,美國版的柯南。
看完電影吃完晚餐,大強又坐火車回新竹了~
2008年1月25日 星期五
Application Binary Interface (ABI)
Application Binary Interface (ABI)其實就是定義了一個標準,讓Binary code能在不同的電腦上可攜(Portability)。由基本的Instruction set加上作業系統的Interfaces組成。 (ABI)的發展,是用來促進在相同的CPU下所發展的應用程式,在不同的作業系統下,都能做到Binary Code相容。例:
同屬於 Intel x86 版本的執行檔能夠自由的在Windows NT/2k/XP之間執行。
vi/vim設定Tab鍵空格數
寫程式常用Tab鍵來縮排,讓程式更具可讀性。
然而vi/vim的Tab預設為8個空格,若要改變Tab的空格數,有兩種方法。
第一種:
進入vi/vim後,在Last Line Mode中輸入set tapstop=4
Tab空格數就會變成4,然而只套用於目前設定。
第二種:
將set tapstop=4寫進~/.vimrc裡,則每次開啟vi/vim就會套用這個值。
signal
某有事件發生時就會發出signal通知Process,而Process就必須來處理這些signal。
signal可以由Process到另一個Process,或是由Kernel到Process。
我們可以自行定義signal handler來處理各個不同的signal。
系統雖有signal()的function來讓我們指定signal對應的signal handler。然而,由於沒有統一的標準,所以各家UNIX實作上會有所不同,會造成相容性的問題。所以POSIX規範要使用sigaction()這個function。然而sigaction()使用上較signal()複雜。
2008年1月24日 星期四
無不散的筵席
渭城朝雨浥輕塵,客舍青青柳色新。
勸君更盡一杯酒,西出陽關無故人。
今天,有人問我說:「建霖走了耶,會不會難過阿?」
我笑著回答說:「不會阿!反正我們都住台北,要見面還不容易。」
然而,真的是如此嗎?
昨天,還在一起有說有笑,一起打電動。
今天,實驗室卻已不見他的蹤影。這次是真的畢業了。
雖然心理早已有準備,但真正發生時,還是承受不了離別的痛。
對我來講,建霖是我在研究所最好的朋友。
因為我推甄的研究所就是自己的學校,所以我很早就參與了實驗室的Lab與Group Meeting,也因為如此,讓我更早就認識了建霖。
若要說是什麼時候開始變熟的,我還記得有一次的Group Meeting,我到了實驗室後才被告知原來Group Meeting改時間了,那時我對實驗室的人都不熟,我忘了是建佑還是建霖,總之有一個人叫我留下MSN。於是,建立了溝通的管道。第一次和建霖出遊我也還記得,那時聽完在台北辦的IPv6研討會的時候,一起坐了捷運到淡水去,還吃了阿給,而且還找了老半天才找到。
對我來說,建霖在我研究所的這個階段裡,幫助了我很多,不管是生活上還是學業上。當初若沒遇見建霖,現在的我,又是怎樣?
每當我遇到難題的時候,總是找建霖求救。
每當要去大買家的時候,第一個就想到找建霖。
每當要出去吃飯的時候,至少建霖都會和我去吃。
現在呢?遇到難題的時候,不再能像以前一樣,轉身就喊「建霖」了。
天下無不散的筵席,遲早總是會各奔東西。
心裡雖然不捨,但我們總是要學習面對,人生就是這麼一點一滴的成長。
雖然肉麻了點,但還是要說一句話:
「建霖,能認識你真好!」
祝你在未來人生的旅途上,能過的多彩多姿。
2008年1月23日 星期三
滑鼠發明者
最早發明滑鼠是一位美國人Dr. Douglas C. Engelbart。
原始的滑鼠是電子機械式加上一個大的滾球,當它在一個平面滾動時就可以計算其位移量,再透過電子訊號傳至電腦。
然而目前的滑鼠已經被光學滑鼠所取代。光學滑鼠主要包含三個元件,LED、小型黑白照相機、簡單的光學處理器。LED會發射光束照射在平面上,照相機就會以一定的速率拍下相片,連續的相片就會送給處理器,處理器比較圖片的差異來決定滑鼠的移動。
我想,當初滑鼠的發明者,一定沒想到會變得如此普及。不過我對他講的一句話,覺得蠻有趣的。
I got the idea for the mouse while attending a talk at a computer conference. The speaker was so boring that I started daydreaming and hit upon the idea.
2008年1月21日 星期一
獨立思考
雖然上大學後,對於寒暑假漸漸不感到興奮,但多少還是有些期待,至少可以回家去,逃離書本。
升上研究所後,變成什麼時候放寒暑假都不知道了,並不是研究生沒寒暑假,而是感覺天天都是寒暑假。
為什麼要讀研究所?
一貫的標準答案是「培養獨立思考的能力!」
起初對這個答案體會不是很深,但一年多了,感受愈來愈深。
我是不清楚別間實驗室是如何,至少我感受到的是如此。
讀研究所想學到多少東西,完全取決於自己的手上。
大學雖然讀了四年,但總覺得就只是修很多課,很多東西都只是學到的皮毛,課程就結束了,幾乎每本書都教不到一半吧。說實在,我真的不清楚我大學四年究竟學了什麼,也許是太混的關係吧。
升上研究所後,才發現自己有多麼弱,世界是如此的大!學業成績再高又如何呢?
我很慶幸當初選擇了這間實驗室,除了整個氣氛外,老師的指導方式蠻適合我的。
我喜歡自由的學習、快樂的學習。學習不應該是強迫的。
「吾生也有涯,而知也無涯。以有涯隨無涯,殆已」
2008年1月20日 星期日
手動新增使用者
在新增使用者部份,我們可以使用useradd指令來建立,非常方便,但也可以用手動的方式來建立:
假設要建立一個新的使用者,帳號為newuser,群組為newgroup,uid為600,gid為800
1. 先建立newgroup這個群組,所以我們就去修改/etc/group的檔案,在最後一行加上
newgroup:x:800
2. 執行grpconv,這個指令能比對/etc/group和/etc/gshadowt檔案,將/etc/group出現的group卻沒在/etc/gshadow出現的群組對應過去
# grpconv
3. 修改/etc/passwd,來建立新的使用者名稱,在最後一行加上 (家目錄設為/home/newuser shell為bash)
newuser:x:600:800::/home/newuser:/bin/bash
4. 執行pwconv,這個指令用來比對/etc/group和/etc/shadow檔案,將/etc/passwd出現的帳號名稱卻沒在/etc/shadow出現的帳號對應過去
# pwconv
5. 為newuser設定密碼,在此使用passwd指令
# passwd newuser
6. 建立家目錄,將/etc/skel/*複製到我們家目錄裡,/etc/skel/裡包含環境設定檔等,如.bashrc
# cp -a /etc/skel /home/newuser
7. 更改剛才複製過來檔案的擁有者和群組擁有者
# chown -R newuser:newgroup /home/newuser
如此便大功告成!
2008年1月19日 星期六
fgets
fgets是C語言的一個函式,從檔案串流讀入指定長度的字串,它是包含在stdio.h裡。函式prototype如下:
char* fgets(char *string, int length, FILE * stream)
當讀到一個換行字元時,fgets函式就會終止。長度的參數包含字串最後的null字元。因此,若要讀入N個字元,則長度的參數要給N+1。串流一般用在stdin,或是用fopen開啟的一個File *串流。
下面為一個簡單的例子,從鍵盤讀入字串,並以每行不超過二十個字印出。
int main() {
int length = 20;
char string[length + 1];
while((fgets(string, length + 1, stdin)) != NULL)
puts(string);
return 0;
}
vi/vim編輯時回到Shell
當我們在用vi/vim編輯檔案時,若暫時需要回到外面的Shell執行一些工作,可以在Last Line Mode下輸入以下指令
:sh
如此,便暫時跳回Shell的畫面,若要返回vi/vim,則執行exit即可。
# exit
簡易的Samba架設
Samba可以讓Windows主機可以用網路芳鄰來存取我們要分享的資料,以下就以Debian為例,快速架設一個Samba server:
先安裝samba
# apt-get install samba
編輯設定檔(/etc/samba/smb.conf)
# vim /etc/samba/smb.conf
任何人都可以存取
workgroup = WORKGROUP # 視Windows群組為何
security = share # 任何人都可以直接存取
guest account = nobody # 使用nobody的帳號
接著設定欲分享的資料夾
[share]
comment = Share # 共享資料的文字說明
path = /home/howard/share # 共享資料的路徑
guest ok = yes # 無需認證(須security = share)
writable = no
share modes = yes
接著,重新執行
# /etc/init.d/samba reload
除了純分享外,也可以設定認證機制
security = user
但要先建立samba的使用者帳號及密碼, 例:
# smbpasswd -a howard
如此便需擁有帳號及密碼才能存取分享的資料。
2008年1月17日 星期四
2008年1月15日 星期二
2008年1月13日 星期日
instanceof
instanceof是用來判斷一個reference是不是屬於某一個類別或介面的函式。例:
System.out.print(new String() instanceof Object);
結果會回傳印出true,因為String是Object的子類別,所以函式會回傳true。
2008年1月12日 星期六
Jpcap - 封包存入檔案或從檔案讀出
抓到封包後,除了即時處理外,也可以將封包存入檔案中,之後,再從檔案中讀出封包內容做處理。
存入檔案
先利用JpcapWriter.openDumpFile()開啟一個欲存入的檔案,再用writePacket()的函式寫入檔案,例:
JpcapCaptor jc = JpcapCaptor.openDevice(…);
JpcapWriter writer = JpcapWriter.getOpenDumpFile(jc, "capture.pkt");
for(int i=0; i<10; i++)
Packet pkt = jc.getPacket();
writer.writePacket(pkt);
}
writer.close();
讀出檔案
利用JpcapCaptor.openFile()來讀取檔案,例:
JpcapCaptor jc = JpcapCaptor.openFile("capture.pkt");
while(true) {
Packet pkt = jc.getPacket();
if(pkt == null || pkt == Packet.EOF)
break;
System.out.println(pkt);
}
jc.close();
(2008/01/11) 建霖、威廷畢業了
2008年1月10日 星期四
早睡早起
上學期結束後,因為學分都已經修完了,所以幾乎每天都是晚睡晚起,大約是凌晨兩點多睡,中午起床。
記得剛上大學的時候還都是十一點就寢,聽著光禹的夜光家族入眠,或許是因為我住的宿舍收不太到飛碟電台的訊號,所以漸漸地,就寢時間愈來愈晚。但現在沒課的結果,就是不斷地睡。
上大學後,讓我覺得最大的不同就是幾乎都可以睡到自然醒,跟高中時每天六點起床差太多了。畢業後,很難有機會可以天天睡到自然醒,當然要好好把握。
然而,我的睡眠時間感覺好像不太健康,所以這幾天都試著十二點左右就寢,大約早上八、九點起床。早起的感覺果然不一樣,多了份早餐,還可以多做許多事,希望能繼續維持下去囉。
2008年1月9日 星期三
Jpcap - 抓封包
抓封包前,須先指定要用哪張網路介面卡,我們可以利用JpcapCaptor.openDevice()來選擇。
public static JpcapCaptor openDevice(NetworkInterface interface, int snaplen, boolean promisc, int to_ms)
throws java.io.IOException
interface - 指定網路卡,可用getDeviceList()來取得
snaplen - 封包最大的長度
promisc - 是否將網路卡設定成promisc模式
to_ms - processPacket的timeout值
有兩種抓封包的方法
- callback
- one-by-one
使用callback的方法,必須先實作PacketReceiver這個interface。
PacketReceiver定義一個receivePacket(),我們必實作這個方法。
class PacketPrinter implements PacketReceiver {
public void receivePacket(Packet packet) {
System.out.println(packet);
}
}
接著就可以用processPacket()或loopPacket()來抓封包。
這兩個差別是在於processPacket()是non-blocking而loopPacket()是blocking的方式。
public int processPacket(int count, PacketReceiver handler)
public int loopPacket(int count, PacketReceiver handler)
count指的是要抓多少封包,-1則是一直抓。
one-by-one的法就是一個封包一個封包抓。
public Packet getPacket()
同時我們也可以設定filter來過濾我們想要抓取的封包。
public void setFilter(java.lang.String condition, boolean optimize) throws java.io.IOException
condition - 所要過濾的條件,和tcpdump的filter設定一樣,例如要抓ICMPv6的封包:
setFilter(icmpv6, true);
2008年1月8日 星期二
Jpcap - 列出系統的網路介面資訊
JpcapCaptor.getDeviceList()可以取得主機上的所有網路介面的資訊,以陣列NetworkInterface[]回傳。藉由這個陣列可以取得網路卡名稱、IP位址等資訊。
NetworkInterface[] interfaces = JpcapCaptor.getDeviceList();
for(int i = 0; i < interfaces.length; i++)
System.out.println(i + ": " + interfaces[i].name + "(" + interfaces[i].description +")");
System.out.println("Datalink: " + interfaces[i].datalink_name + "(" + interfaces[i].datalink_description + ")");
System.out.print("MAC: ");
for(byte b : interfaces[i].mac_address)
System.out.print(Integer.toHexString(b & 0xff) + ":");
System.out.println();
for(NetworkInterfaceAddress addr : interfaces[i].addresses) {
System.out.println("Address: " + addr.address);
}
}
輸出結果如下:
0: eth1(null)
Datalink: EN10MB(Ethernet)
MAC: 0:17:31:25:6f:ed:
Address: /140.120.15.173
Address: /fe80:0:0:0:217:31ff:fe25:6fed
以下略
2008年1月7日 星期一
編譯多個source code
將函式的prototype的宣告以及一些constant的定義寫在另一個header檔是程式常用的技巧。自行定義的header必須以雙引號include進來,如:
#include "selfdefined.h"
至於如何編譯多個source code,以下以GNU C compiler gcc作說明:
假設有以下檔案:main.c selfdefined.c selfdefined.h
# gcc -c main.c selfdefined.c
會產生兩個object file
# gcc -o main main.o selfdefined.o
連結兩個object file產生main的執行檔
如果後來main.c做了更改,我們只須重新編譯main.c即可
# gcc -o main main.c selfdefined.o
2008年1月5日 星期六
24歲了
原子結構
基本粒子
原子(atom)是由原子核(atomic nucleus)和電子(eletron)構成,而原子核是由中子(neutron)與質子(proton)所組成。
事實上,所有的基本粒子可以由兩種型態的粒子構成:
- 夸克(quark)
- 輕子(lepton)
每一種型態的原子可以由電子數及質子數來和其它的元素作區別。例如氫原子有一個質子和一個電子,而氦原子則有兩個質子、兩個中子和兩個電子。
原子序
所有元素可以依照原子序排列在化學週期表上,而原子序就等於原子核裡的質子數,在一個平衡狀態的原子裡也等於電子數。
電子能階
原子核外有一層一層的能量軌域,電子只能繞行在某個軌域上,離原子核距離較近的電子,其能量比離原子核距離遠的電子還要低。每個離散的距離(軌域),可以對應到某一個能階(Energy level)。每個能階都能視為一種Shell,每一個Shell都有最大可允許的電子數量。可以用以下的式子來計算:
Ne = 2n^2
Shell 1: 2(1)^2 = 2 (可容納2個)
Shell 2: 2(2)^2 = 8 (可容納8個)
...
每一層都要填滿才能到下一層,因此只有Valence shell不必完全填滿。
價電子 (Valence Electrons)
離原子核愈遠的電子擁有較高的能量,因此位於最外層的Shell的電子最不被原子核束縛。最外層的Shell又稱為Valence shell,而在Valence shell的電子則稱為價電子。
離子化 (Ionization)
當一個原子吸收到能量,如熱能或光能,則電子的能量會提昇。因為價電子擁有較高的能量且較不被原子核束縛,所以他們很容易跳到更高的軌域。因為價電子已在最外層,所以當取得足夠的能量時,便會完全脫離原子核束縛。而由於失去一個電子,則此時原子的質子數變大於電子數而帶正電。這種失去價電子的過程稱為離子化,而帶正電的原子稱為陽離子。脫離原子核的價電子稱為自由電子,當一個自由電子失去能量且掉入另一個原子的Valence shell,則這個原子會變成帶負電,稱陰離子。
2008年1月2日 星期三
迴圈小技巧
從PTT上看到別人的小技巧,和大家分享一下。
若程式裡的迴圈是用來計數的話
ex.
for(i = 0; i <= n; i++)
s = s + i;
可以做以下的修改
for(i = n; i; i--)
s = s + i;
如此,編譯成組合語言時,會少一個cmp的指令。
修改後的組合語言,會用jne來判斷,若i變成0,會將flag設為0。
小技巧的確是能將效率提升,然而卻可能讓程式變的不可讀,有利有弊。最佳的情況當然是compiler夠聰明的話,程式寫作就可以輕鬆多了。
2008年1月1日 星期二
跨年 - 迎向2008
以往的跨年總是待在家裡,不然就是待在宿舍。然而,這次和以往不同,和一群國中的好朋友一起迎接2008。阿佑、小武、蒜督、昱銓、我以及兩位小武的朋友如芬、詒真(如果沒記錯的話!)
寒冷的夜晚,當然少不了火鍋,於是找了一間吃到飽的火鍋店大吃一頓。阿佑剛好是元旦寶寶,蒜督原來準備了小禮物送給了他,令人驚奇的是,我也有一份,雖然離生日還有幾天才會到,感覺整個心都熱了起來。
吃完火鍋都快十一點了,再晚就看不到101煙火了,於是就先去接小武的兩個朋友,然後就前往辛亥隧道旁的一座山前進。時間一分一秒的流逝,最後我們就把目的地改在辛亥路三段上,這個路口也是擠滿了人,看來應該也是不錯的地點。時間是十一點四十五分。
五、四、三、二、一,Happy New Year!101煙火一開始的瞬間真是漂亮,現場看和電視看就是不太一樣,不過,美中不足的是後來的煙火都被煙遮住了。
看完煙火後,小武提議要到五股憲兵學校後面的一座山看夜景,所以又開始了長途的旅程,冷死我了。費盡千辛萬苦終於到了,可惜沒相機,不能拍下來。
回到家的時候已經四點多了,今年的跨年真是特別!