星期六, 3月 28, 2009

損壞

發生的事太多了,我還是用這個標題好了...

MacBook 變壓器 和 Logitech MX1000 相繼損壞,前者在保固期內,不然是2900(沙鍋貴的變壓器啊...Orz),至少要等五個工作天以上...我現在是借 efang 以前的電腦灌 ubuntu 打的,最近學校網路又不穩,我沒有 MacBook 就像武功全廢一樣,但是我下禮拜還要講簡報給學弟妹聽,還有作業要交啊 XD

MX1000 也是死狀其慘,有一天就給你宣告不治,送修說,這個出廠超過三年,不保了喔,但是我只買了兩年多啊啊啊啊(但是我沒有發票...Orz) ,只好再買一隻新的滑鼠了,目前是買了 MX1100 其實我還蠻想知道它是五年保還是三年保,有人知道要怎麼查嗎XD
其他小壞掉的東西就不勝枚舉了...Orz


---
不過最近書倒是看的不少,很開心 :)

星期二, 3月 24, 2009

How to set background image in LaTeX

如何在 LaTeX 中設定一份文件的背景圖片? 如果是Word的話,我在以前的 blog 有提過如何解決。如果是 LaTeX 呢?
答案是,wallpaper package,其實還蠻簡單的,估計寫這個package的人蠻有prefix的概念XD。
首先,把這個package包進來\usepackage{wallpaper}其實我們只有兩種指令,一種是
\CenterWallPaper
\TileWallPaper % 背景看不到邊喔 XD
\TileSquareWallPaper
\ULCornerWallPaper % upper left
\LLCornerWallPaper % lower left
\URCornerWallPaper
\LRCornerWallPaper
\ClearWallPaper
另外一種,就是上述全部在前面加上This,代表只對目前這一頁有效XD


舉個例子來說好了,如果我們寫\CenterWallPaper{0.25}{background} % 背景圖放在正中間,圖的size 為原圖的 0.25其他的用法,可以參考原廠文件


---
原本以為很難,看來是我錯了XD

星期一, 3月 23, 2009

「淺談排版系統 Typesetting System」簡報釋出

廢話不多說,連結在此
簡報 (pdf)
Handout (pdf)
若有問題,歡迎指教指正,至於.tex 的 source code 暫不釋出(因為寫的很難看XD),如果有需要可私下來信索取XD 希望能對排版有基本的認識。


---
禮拜三要講第一次,不知道會怎麼樣XD

星期四, 3月 19, 2009

紀念


第一次用 Synopsys Design Version + UMC 90nm Library 合出電路圖,紀念一下。
現在可以理解ycma說的 "layout 才需要大螢幕啊。" 我在筆電上使用就頗痛苦的XD


---
不過看到這樣子的圖產生還是很爽 XD

星期二, 3月 17, 2009

Sara Bareilles - Love Song


最近蠻喜歡聽的一首歌


Head under water
And they tell me to breathe easy for a while
The breathing gets harder, even I know that

You made room for me, but it's too soon to see
If I'm happy in your hands
I'm unusually hard to hold on to

Blank stares at blank pages
No easy way to say this
You mean well, but you make this hard on me

I'm not gonna write you a love song
'Cause you asked for it
'Cause you need one, you see
I'm not gonna write you a love song
'Cause you tell me it's make or breaking this
If you're on your way
I'm not gonna write you to stay
If all you have is leaving
I'mma need a better reason to write you a love song today
Today

I learned the hard way
That they all say things you want to hear
My heavy heart sinks deep down under you
And your twisted words, your help just hurts
You are not what I thought you were
Hello to high and dry

Convinced me to please you
Made me think that I need this too
I'm trying to let you hear me as I am

I'm not gonna write you a love song
'Cause you asked for it
'Cause you need one, you see
I'm not gonna write you a love song
'Cause you tell me it's make or breaking this
If you're on your way,
I'm not gonna write you to stay
If all you have is leaving
I'mma need a better reason to write you a love song today

Promise me you'll leave the light on
To help me see with daylight, my guide, gone
'Cause I believe there's a way you can love me because I say

I won't write you a love song
'Cause you asked for it
'Cause you need one, you see
I'm not gonna write you a love song
'Cause you tell me it's make or breaking this
Is that why you wanted a love song
'Cause you asked for it?
'Cause you need one, you see
I'm not gonna write you a love song
'Cause you tell me it's make or breaking this
If you're on your way
I'm not gonna write you to stay
If your heart is nowhere in it
I don't want it for a minute
Babe, I'll walk the seven seas when I believe that there's a reason to
Write you a love song today
Today


---
不過現場的聲音比較沙啞 XD

星期一, 3月 16, 2009

Rebegin

希望一切能夠重新開始,這學期的目標只是想好好當一個學生。


---
希望能達成

星期三, 3月 11, 2009

2008 Turing Award

今年 Turing Award 發佈之後,ycma 特別來信告知,因為他知道我對 programming language 特別有興趣。今年繼2006年 Frances E. Allen 以第一位女性得到 Turing Award 之後,

2008 的 Turing Award 得主為 Barbara Liskov !!

特將 ycma 轉寄的信節錄於下

ACM has named Barbara Liskov the recipient of the 2008 ACM A.M. Turing Award for her contributions to practical and theoretical foundations of programming language and system design, especially related to data abstraction, fault tolerance, and distributed computing. (yen3 註: 以查 wiki 得到的資料,這邊的特別指定的領域,幾乎都是首先開創。)

Liskov revolutionized the programming field with groundbreaking research that underpins virtually every modern computer application for both consumers and businesses. Her achievements in programming language design have made software more reliable and easier to maintain. They are now the basis of every important programming language since 1975, including Ada, C++, Java, and C#. (yen3 註: 這邊提到的語言我只有 Ada 不會耶,不過這不重要啦 XD)

Liskov heads the Programming Methodology Group in the Computer Science and Artificial Intelligence Laboratory at MIT, where she has conducted research and has been a professor since 1972. (yen3 註: 讀到這邊抽了一口涼氣,讓我想到現在中研院院士,領導自由軟體鑄造場,但是我忘了名字了...Orz)


那麼我又節錄一下,Liskov 女士在 wiki 上的資料

Liskov has led many significant projects, including the design and implementation of CLU, the first programming language to support data abstraction; Argus, the first high-level language to support implementation of distributed programs; and Thor, an object-oriented database system. With Jeannette Wing, she developed a particular definition of subtyping, commonly known as the Liskov substitution principle. She leads the Programming Methodology Group at MIT, with a current research focus in Byzantine Fault Tolerance and distributed computing. (yen3 註: 真的只能對 Liskov 女士以 pioneer 來形容,到現在仍持續研究,真的很很讓人佩服。)


---
感謝老師提供此訊息,不然我可能還不知道 XD


Josh Ko 對我說 Liskov 女士著名的 Liskov Substitution Principle: 這邊有簡介

星期一, 3月 09, 2009

Intstall git plug-in in Eclipse


其實我也不會,參考自這篇文章才會的 "Chris Cruft: Eclipse Git plugin installation",詳細說明安裝方法,Eclipse git plug-in 在Linux, Mac OSX底下問題不大,如果是Windows的話就要裝Cygwin,我是在Mac OS下試的,在 Eclipse 3.4.2 下測試,以下是不像翻譯的翻譯 XD


  1. 從網站中抓回檔案,在command line 底下輸入git clone git://repo.or.cz/egit.git

  2. 會抓完一個資料夾,在 Eclipse 中,把這個資料夾裡的專案匯入,方法為File >> Import >> General >> Existing Projects into Workspace >> 選擇該資料夾 >> 確定全部都的project都有被選取到即可下一步(原文寫八個,其實更多)

  3. 把匯入的專案全部build一次Project >> Build All

  4. 再把compile好的專案匯出,於是選取這些匯入的專案然後File >> Export >> Plug-in Development >> Deployable plug-ins and fragments目的資料夾選取你的Eclipse 安裝資料夾,匯出後重新開啟 Eclipse

  5. 重新開啟後對某個專案按右鍵 >> Team >> Share Project 應該就可以看到git的相關東西了,之後的設定也是從這個地方(藏的好隱密啊...Orz),或者是從File >> Import >> Git >> Git Repository直接使用現成的git repository也是一個不錯的方法

---
have fun!

星期六, 3月 07, 2009

我與 JK flip-flop 的愛恨情仇

在我大二上的時候,我曾經修過一門課為「數位電路」,用的課本是 Digitial Design by M. Morris Mano。看過這本的人都知道,這本對於JK flip-flop做了非常多的描述與應用,然而這也是我苦難的開始。

因為我完全不懂 JK flip-flop 怎麼用...Orz

老師上課講的我也聽不懂,可見應該是我上課不認真,後來我自己一個人盯著這本課本看,我終於懂了 digital design 這本書想要傳答什麼,其實還蠻簡單的

得知題目的input, output, state, next state(這邊可能會有兩個步驟) -> 寫成 truth table -> 使用 k-map 化簡 -> 寫出每一個 output signal& next state signal 的 boolean algebra -> 畫電路 -> 故事結束

那跟 JK flip-flop 有什麼關係? 因為課本很多都是用它當例子,要懂的話就大概得懂 JK flip-flop,這對當初沒什麼概念的我而言真的蠻痛苦,不過硬是幹到會,之後我就拋棄了 JK flip-flop了,設計上一律使用 D flip-flop (為什麼,看看兩者的功能就知道了XD)。沒有它我可能學不會數位電路,但是有了它,我學數位電路好痛苦...Orz。

在禮拜五的時候,ycma 在上 Computer Arthmetic 幫我們複習基本的 IC Design 時,說了

不要使用 JK flip-flop,晶圓廠也只提供 D flip-flop 的 library 讓你使用,它只是功能看起來比較炫,其實並不好最佳化

我聽到,想到了我以前有點痛苦的往事XD,於是我就問啦,那麼為什麼會有 JK flip-flop,ycma 又說話了 XD

因為這本書是在四十年前寫的,IC Design 尚未自動化,如果插麵包版的話,JK flip-flop 能省下比較多的電路,但是在這個年代,自動化電路設計時,我們會希望元件越簡單越好,因為越簡單越容易最佳化。

其實話說到這邊,已經讓我了解非常多的事了,也果真是隔行如隔山...

這個學期幫忙老師在灌EDA Tool準備上課使用時,使用的是「國家晶片設計中心」所提供的軟體(聽說每個都很貴...), ycma 更是打趣的說,在台灣學硬體的人比較沒空寫 blog XD,呃,我之前是很少找到硬體的blog是沒錯,不過這大概也跟我只下軟體開發的關鍵字有關係,我想有空,我會寫一寫在這個學期的學習經驗

---
其實也沒什麼愛恨情仇的 XD

星期四, 3月 05, 2009

一般人怎麼帶著筆電趴趴走 XD?

一般狀況下,我會很粗略的把帶筆電分成幾種。

專業筆電背包,我知道有這種人,但是我只在Mobile01上看到過 XD。

塞到一般背包裡,這就是我目前的現況,塞到背包之前,我有買一個筆電保護套,塞到背包裡,兩隻手空空,還算蠻方便,不過efang一直嫌我的背包太醜 XD。

用手拿筆電包,這比較常見於中距離移動。

用手拿原廠送的筆電袋,這常見於女生,常會看到女生拿的大包小包,男生也不少,原廠筆電袋好是好,只是大了些。

通常會塞到背包裡的大部分都是男生,因為現在時下的女生大部分都是用側背袋(我不知道那怎麼稱呼),在yahoo拍賣很常見,通常,載重能力也不高(就算高也要考慮到人的單肩負載能力 XD),所以女生通常會考慮後面幾種,男生也會拿筆電袋,因為現在時下的流行也是側背一個袋子,如果要背筆電,其實會較不方便些。但是男生比較耐操,所以問題不大 XD?

所以資訊的發達 + 時下流行 => 女生拿著大包小包

大部分的狀況下,買筆電就是考慮攜帶性,但是再考慮自己攜帶的方法,帶著筆電趴趴走其實是一個很有趣的問題 XD,就算是買eeePC,側背也是很重的。

而且帶筆電要考慮整體的攜帶性方案的話,通常就不得不考慮 "看,這龐大的變壓器",所以MacBook的變壓器我就很喜歡,相較於其他牌的變壓器,算小又好帶(不過很貴...Orz),還有攜帶性滑鼠之類的。當然,另外一種解決方案是,買高級一點的手機,但是這就要看買筆電是為了什麼。如果買小筆電的功能和高級手機功能重覆時,高級手機或許也是一個不錯的方案 XD?

買筆電手機和買電視不同的地方在於,電視買完插上去就能看了,但是買筆電手機,可能還要買一堆有的沒有的,買東西的時候,也要把這些隱形成本算進去,不算倒也不會有損失,只是可能會不方便些 ?

順帶一提,我不喜歡包膜,也不太喜歡保護貼,這會影響我用東西的手感,反正我買了,我就沒有要再賣出去的打算,我會和我的傢伙產生革命情感,所以就我而言,我可以忍耐有點歲月的痕跡,東西,用的爽就好 XD。

---
通篇來說,都是廢話XD

改變

這個世界,正以超乎我想像的速度在改變,而我正在努力的越活越回去,因為,我要完成想要完成的事。

到底,我對於這個社會價值還剩下什麼呢,或許一點也無吧(笑)。

---
雜感。

星期一, 3月 02, 2009

Music Top 30 - frequency


第一名是「First Love - 宇多田光」,這不是我聽的,這是efang用我ipod聽了一個學期的成果,還遠遠的超過第二名XDXD。

第二名是「Announcement Service Public - Linkin Park」,是因為這首歌本來就很短,所以可以在短時內聽許多次,而這個排行榜中,前30名,Linkin Park佔了最多席次,原因也蠻簡單的,剛拿到MacBook的那段時間,我幾乎都在聽Linkin Park,後來聽其他的歌比較多,所以在15~30的時候,呈現多樣化。

如果不是有First Love這首歌,我還真的不知道原來ipod連播放次數都會同步。

---
最大贏家: efang

星期六, 2月 28, 2009

考試

昨天托Josh Ko的福,在他房間睡了一晚,睡的甚好,免於隔天早上要很痛苦的爬起來XD,他也帶了我吃了四餐,非常感謝他,欠了好大一個人情啊...Orz 雖然我還是沒有考好,雖然出的題目是略簡單,不過沒有念我相信也不會改變太多事,寫這篇只是為了提醒自己不要忘記感謝人而己,哈哈。


Josh 以後請你吃好吃的啊XD


---
非常單純的記錄

星期三, 2月 25, 2009

最近

快要考試了,不過我大概也沒救了,就多多少少念一點嘍。開學三天了,看見了很多以前看不見的事,面對許許多的事,不否認壓力很大,但是相對而言話也會很少。靜靜的,什麼都沒有改變。

efang在這幾天的陪伴下辛苦她了,也得容忍我的任性及壞脾氣。

學習,有時候真的應該單純一點,其實我還蠻想寫 「LaTeX 的中文方案討論: cwTeX, XeLaTeX, XeLaTeX + xCJK, XeLaTeX + fontwarp」 這標題的文章,或許等心情好再來寫,或許也不會有人想看 XD?

最近想到一個很好玩的事,以前啊,不會用linux的時候,總覺得那些把command line用的很神,隨便打一打都會有東西出來,是一件很酷的事(efang也這樣子覺得),現在會了,並不覺得神奇,進化到,如果有任何錯誤,知道怎麼解決就很厲害了。但是也不是每件事都會這樣子覺得,我還是覺得會寫C/ C++,會用LaTeX 編排文件是一件很酷的事,雖然我自己只能說知道基礎,但是對於會用這種複雜又美麗的東西,我還是深深感覺到很有趣,這大概只有情感根據而沒有理論根據XD。

跟Josh Ko聊天聊了很多很有趣的事,不過我想跟他一樣,留到大學總回顧再來提,我的人生跟他是截然不同的路,但是都很有趣,哈哈哈。

---
keep going

星期一, 2月 23, 2009

新學期

不知道會迎接怎麼樣的變化,這是我最需要沉潛的一年。

或許可以好好念書研究的一個學期可以在這個學期實現,課表暫時不確定,雖然跟ycma說好要接unix programming 的助教,但是不知道要拿什麼課來補剩下的三學分XD。

一切,才正要開始

---
平靜


2009/02/25
因為課程相衝的關係,應該不會當助教了,但是還是協助架設主機,但由於EDA tool的關係,我可能得灌Fedora,而不是我比較熟悉的Ubuntu,其實最想灌FreeBSD XD。

星期四, 2月 12, 2009

亂入的藝術

首先,我要感謝蔡學墉先生的熱情回信,對於一個平凡學生是受到了莫大鼓舞,我會試著去做的。

在我大學以前認識人我很喜歡裝熟,pigtail和Josh Ko就是這樣子認識的,其實很多人都是這樣子的認識的,是好事嗎? 見仁見智。

在上大學之後,我變的比較沒有這麼主動去認識人(但是還是很主動XDXD),到大二之後,由於自己長期寫blog,所以認識網路上的人,我自認為我還是蠻主動的。在網路上的blogger大部分都還蠻善良且好客,我不是什麼知名blogger,有人留言時,我會很開心(指正也會,只要不是亂罵一通),所以對我而言。

去別人的blog留言給予打氣或問問題變成要相當小心,不然其實跟亂入沒什麼兩樣。

大概是因為這樣子認識日落的,他也是一很好的人,他也常來這邊留言,很感謝他嘍。當然,也不是每次都會有人理我的,我可以理解心情。在很久以前,我曾經寄信給某x大教授詢問一些問題,結果就石沉大海了XD 其實這對我而言反而比較正常,因為如果很忙,誰會理我啊XDXD。

不過其實,在網路上認識一些很厲害的人也是一件很開心的事,jserv, walkingice, c9s,僅止止是認識,其實不知道熟不熟耶,但是很開心,有很多很有趣的事可以學習。

---
亂入XD

星期二, 2月 10, 2009

小常識

最近亂想的時候,發現自己以前寫的程式碼不夠好。
如果我想寫入binary file,可能會這樣子寫

boost::array<unsigned int, 512> data;
std::ofstream outfile(filename.c_str(), std::ofstream::out | std::ofstream::binary);
outfile.write(static_cast<char*>(static_cast<void*>(data.c_array())), sizeof(unsigned int)*data.size());
其實寫入的那行,寫成
outfile.write(reinterpret_cast<char*>(data.c_array()), sizeof(unsigned int)*data.size());
至於為什麼,我不想多講,我只是想證明我沒看書而己...Orz

---
看了也要記得啊...Orz

星期五, 2月 06, 2009

最近

想了很久,還是不知道自己要寫什麼(笑)

考試近了,自己很混其實自己很清楚,上學期又沒有做到什麼事,有一種重新把整個人解構的感覺。總而言之,現在總算是平靜下來了,對於接下來的事,平常心吧。只是還是會手很癢想寫程式,現在應該積極的列清單,等考完試之後,把想寫的程式寫一寫,哈哈哈。

其實很感謝爸媽對我的容忍,一般的小孩如果跟我一樣混,可能早就被打死了XD 其實,不管如何,只想做最好的自己,因為我就是一個很普通的yen3(到底父母知不知道我的blog呢XD?)。

這一陣子台灣的經濟壞到連我都有感覺(我不是一個有什麼感覺的人),或許,真的應該重新評估我未來的方向了,我不是什麼專業人士,我只是一個想要好好學習做研究寫寫程式的人。

想一想,自己都大四了,還是什麼都不會,甚感汗顏,還是一次只能專心做一件事,這或許就是我的致命傷吧,如果我可以一次專心做兩件事就好,不過現在的我仍然是做不到的。可見我還是不會分配時間。

這篇非常沒有架構XD 就隨性寫寫吧XD

---
還真是XD

星期三, 1月 21, 2009

有關File I/O的兩三事(3) - XML

拖了好久了,是該做一個尾聲啦XD

XML(wiki),這個我從大一就知道但是從來都不知道在幹麻的東西XD(要說也蠻簡單的,就是一堆tag和value所組成的XD),後來寫程式的時候陸續遇到,才發現了很多很重要的東西。XML本身並不難,規範也很清楚,那麼最有趣的問題。

有趣問題: XML到底能夠拿來幹麻 XD?

如果能夠搞清楚拿來幹麻,我想XML才會表現出其重要的意義,XML的目的只有一個,傳遞資訊,也就是說,A告訴B一些訊息,重點是,A要用怎麼樣的方法? 今天人類在溝通的時候,用語言傳遞訊息真的是一件很神妙的事,但是相對而言,電腦並沒有這麼聰明。

那麼XML怎麼傳遞,大部分的比較後期的高階程式語言都具備有XML Parser(C++ Standard沒有...Orz),parser出來有什麼tag name對應什麼tag value,是一件非常快速的事,那麼跟binary file差在那裡? XML非常的彈性,基本上對方只要知道你的tag就可以抓出值了,不用去記得你所傳遞的message format為何(普天同慶,你可以不用算第幾個bytes了XD),如果你在對方的要求之外又多寫了好幾個tag,他parser到略過即可,其實也不用太管你XD。說穿了XML還是需要file format(要知道的話,可以看看DTD),只是這個format比較彈性。

回到binary tree的例子,如果照著(2)的話,我們可能會寫出這樣子的XML

<nodelist>
<node number="1">
<value>1</value>
<left number="2" />
<right number="3" />
</node>
<!-- a lot of nodes -->
</nodelist>

可是在XML上,我們的binary tree可能會有更彈性的寫法,例如說

<rootnode>
<value>1</value>
<left>
<value>2</value>
<left> ...</left>
<right> ...</right>
</left>
<right>
<value>3</value>
<left> ... </left>
<right> ... </right>
</right>
</rootnode>

在這樣子的XML中,寫出相對應的程式,可以邊parser邊建樹,也不限定是binary tree,只要是tree就行了XD 如果在第二個例子中,可能沒有搞好,我們就得重來了,但是在這邊,從binary tree變成B tree似乎較為容易

但是XML不是沒有缺點,雖然彈性,但是有兩個主要的缺點

  • 檔案肥大
    算算剛剛的tree佔了幾個byte就知道了XD 有一好沒兩好,這是躲不掉的
  • 需要parser
    parser不是壞事,重點是如果想要在XML中找到一筆資料,你大概就知道問題在那裡了XD,還有,parser大量資料時,電腦並不如你所想像來的快XD,真的嗎,來試試這個3+2郵遞區號 XMLXD。

File I/O並不如所想像中來的難,但是要搞到好,及搞到快,並不是這麼容易,binary file具有快速及省空間的優點,但是XML在擴充上的驚人彈性抑是一個不錯選擇,但是這兩種方法都端看你怎麼設計format,這才是困難之處,給你再好的工具,用了過差的設計方法,還是有可能讓程式若入一個讓人驚訝的神奇事件中XD。

順帶一提,何謂直接寫,如果今天我要寫入一串數字,我就在檔案中寫了這種神妙方法

1 2 3 4 5 6 7

這種方法大概在一般的資訊系大一學生看見,如果要寫成績處理系統可能會更常見XD 所謂的方法沒有絕對的好壞,自己試一試就知道了XD

---
唬爛結束XD

星期五, 1月 16, 2009

有關File I/O的兩三事(2) - Binary FIle

有趣問題: 電腦的資訊是由0和1組成,當塞了一堆0和1時,電腦如何得知要執行什麼動作?

這個問題從我學電腦的第一年到現在為止都是一個很有趣的問題XD 我在大學才給了一個自己比較滿意的解答,我所認為的答案是,Instruction Set Architecture(ISA) 會解釋比較基本的答案,也就是說,只要塞入一道道的instructions,電腦就會依序執行,當然,這中間還有很多事要做,我們就暫時略過。

有趣問題: 電腦如何判斷且讀取一個檔案?

這個問題其實更有趣,最常見的方法是,判斷副檔名。當然,如果自己把副檔名改掉,而電腦就會用另外一個程式來開啟時,當然我們不確保能打的開XD 那麼怎麼讀取? 通常每個File都會有一個header,而每個header有其固定的format,例如說我這學期處理過的wav file,讀取了前面這麼多bytes之後,我們才能判斷如何讀取接下來的資料(於是就有許許多多的file format document需要閱讀XD)。

那麼我們回到(1)的有趣問題,我們要怎麼寫入一個binary tree? 假設我們把每個node data structure如下(以下以C++為例)。

typedef struct _node{
unsigned int node_number;
unsigned int data;
unsigned int left_number, right_number;
struct _node* left; /* 理論上不用寫入檔案XD */
struct _node* right; /* 理論上不用寫入檔案XD */
}Node;

那麼當我們在C++中寫入Node array時,可能是這樣子寫的

    std::size_t list_size = 20;
Node* list = new Node[list_size];
/* ... */

std::ofstream outfile;
outfile.open("test.out", std::ofstream::out | std::ofstream::binary);
outfile.write(static_cast<char*>(static_cast<void*>(list)), sizeof(Node)*list_size);
當然,寫進去的檔案在linux下嘗試用more觀看時,應該會看到一堆亂碼XD

可是這樣子寫入我們會有一個問題,root node number為何,而總共又有幾個node,方法也很簡單,我們也一併寫入file,於是我們現在的File Format就變成

0~34~7...
total node sizeroot node numbernode data

所以我們的寫入檔案的方法就變成...

    unsigned int root_number;
std::size_t node_size;
std::size_t list_size = 20;
Node* list = new Node[list_size];

std::ofstream outfile;
outfile.open("test.out", std::ofstream::out | std::ofstream::binary);
outfile.write(static_cast<char*>(static_cast<void*>(&root_number)), sizeof(unsigned int));
outfile.write(static_cast<char*>(static_cast<void*>(&node_size)), sizeof(std::size_t));
outfile.write(static_cast<char*>(static_cast<void*>(list)), sizeof(Node)*list_size);
於是我們就把檔案寫完啦,那麼讀檔的時候,我就不另外寫啦(用std::ifstream XD)。


那麼這樣子的設計缺失在那? 第一個是,我們一定要寫入root node number嗎? 其實可以不用,如果在設計list時,我們強制把list[0]設為root,我們就不用另外寫入檔案(因此省了4 byte),第二個是,total nodes的數目只能是2^32-1個,其實非常大,足以應付一般日常生活所需,但在數學模型上,還是不能支援無限多個是有點可惜的事。

那麼這樣子寫入檔案有什麼好處? 答案是,非常的快以及容易撰寫(不論是讀取或寫入),而且,其實每個node size是固定的(24 bytes),也就是說,可以配合seekp, seekg任意跳及讀取,大部分的狀況,如果資料不夠大會一次讀進來,如果資料很大的時候,我們會利用buffered I/O來讀取,或者是跳到檔案某處只讀取我們所需要的資料(有時候,你只會需要檔案的某個部分。),至於讀進來之後要做什麼事,這就不是我要關心的了XD。

---
下回繼續分解XD