2010年12月28日 星期二

在Linux下計算程式行數

find . \( -name *.cpp -or -name *.h -or -name *.c \) -type f -exec cat {} \; | wc –l

看起來有點長。

簡單地說,就是使用find, 利用name找出所有cpp、h、c副檔名的檔案,cat出來,然後轉給wc去計算行數。

find很好用,但是容易讓不熟悉的人退卻;有機會再來寫一篇簡介find的基礎用法。

2010年12月15日 星期三

簡述 Linux Kernel source 管理

安裝

首先,要先有一份kernel source,到 http://www.kernel.org/pub/linux/kernel/v2.6/ 目錄下抓你要的版本。例如,你想要抓 2.6.34 的 kernel source,就打

> wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.tar.bz2

注意,在這個目錄下,有兩種檔案;linux開頭的是完整的source,patch開頭的,就只是patch,之後要做升級動作時用得到patch檔。

這個地方由於我們是要抓source,所以選擇linux-2.6.34.tar.bz2,而不是patch-2.6.34.tar.bz2。

抓下來後,先到 /usr/src/kernels 目錄下。

> cd /usr/src/kernels

接著,將剛剛抓下來的 kernel source 解開。

> bzip2 -dc linux-2.6.XX.tar.bz2 | tar xvf -

然後,就可以看到螢幕狂跑;解完後,打個 ls ,就可以看到 linux-2.6.34 的目錄,cd 進去,再 ls ,就可以看到完整的 kernel source 乖乖躺在你的硬碟裡了。

patch

patch有兩種,一種是2.6.x的patch,一種是2.6.x.y的patch。

2.6.x的patch,例如,想從2.6.34 patch至2.6.35,到http://www.kernel.org/pub/linux/kernel/v2.6/ 目錄下抓 patch-2.6.35.tar.bz2

> wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.35.tar.bz2

假設放在 /usr/src/kernels 目錄下;接著,進行 patch 動作

> bzip2 -dc ../patch-2.6.35.bz2 | patch –p1

然後就可以看到又是一堆訊息跑出來,告訴你更新了哪些檔,跑完後,你的 kernel source 就變成 2.6.35 了,所以,最好改一下目錄名。

> cd ../; mv linux-2.6.34 linux-2.6.35

若要從2.6.34升到2.6.36,也必須乖乖地先patch至2.6.35,再patch至2.6.36。

至於2.6.x.y的patch,方法跟2.6.x的一樣,不同的是,不需要一步一步漸增式的慢慢patch上去,而是一次到位即可。

例如,想從2.6.34 patch至2.6.34.5,只要直接抓2.6.34.5的patch,做一次即可,不用再做2.6.34.1、2.6.34.2、2.6.34.3、2.6.34.4、2.6.34.5這麼多次。

但是,若是要從2.6.34.2 patch成2.6.34.5,則必須先reverse至2.6.34,再patch至2.6.34.5。如下:

> patch –p1 –R < ../patch-2.6.34.2

> patch –p1 < ../patch-2.6.34.5

上面的 –R ,就是指 reverse。

 

文件可參考kernel source內的README及Documentation/applying-patches.txt兩個檔。

以上,報告完畢。

2010年6月23日 星期三

CentOS + Linux kernel 2.6.3x

如果直接抓Linux Kernel (2.6.31以上) 回來,使用make oldconfig的方式做出來的image,開不了機的話,可以試著修改兩個地方。

  1. 打開.config,找到CONFIG_SYSFS_DEPRECATED_V2的字串,改成=y
  2. 將initrd解開,打開init這個張,會看到dm_region_hash被insmod了兩次,把後面那次拿掉

重新開機,可以動的話,恭喜恭喜。

2010年5月10日 星期一

5/8, Sat, 富貴角半日遊

每次到墾丁,都會造訪台灣極南點,第一次到極南點,是剛與女友在一起沒多久,兩個人坐統聯到高雄 (因為票價最便宜 XD),然後再租車開到墾丁;當初剛拿到駕照不過半年,實際上路經驗只有爸爸陪在旁邊開過幾次。

後來有問女友,你知道我剛考到駕照半年沒幾次上路經驗,就讓我載這麼遠一段路,不會怕嗎?女友很篤定地回答不會。

接著再問,那妳知道我那時候其實邊開邊抖的要死嗎?女友回答:那就會怕了。

 

不過今天重點,不在極南點,也不在回憶過去。雖然千里迢迢地跑到極南點好幾次,近在咫尺的台灣最北點竟然還沒去過。於是,今天成行了。

台灣的極北點在富貴角,最明顯的地標,就是富貴角燈塔。

據北海岸及觀音山國家風景的網頁簡介,清乾隆27年(西元1762年),荷蘭人法倫泰在《新舊印度誌》中,將富貴角記為「hoek」,意為海岬,後人採其譯音稱「富基角」,日治時期則更名為「富貴角」。

首先,為什麼台北會出現在新舊印度誌中,不知道;再來,hoek 怎麼會發音成富基,不知道。

同樣地,今天不是來上語言課,也不是來上歷史課,以上問題不討論。

富貴角其實不難找。一路開到淡水,沿著台二線一直走,經過三芝,過了白沙灣後,沒多久會看到左手邊有往富基漁港的叉路,彎進去,過楓林大橋,右手邊有叉路,轉過去就可以看到停車場了。

車子停好後,路邊一個大牌子,寫著「台灣最北端。富貴角燈塔」,一看就知道該往哪兒走。

富貴角路標

沿著步道走進去,沒多遠就看到海邊,底下就是著名的石槽景觀。沙灘上有一排排的竹子,似乎是攔砂籬。做什麼用?攔砂用的…

攔砂籬

原來這個地方是個非常著名的攝影景點,老梅石槽。不過是來拍海邊綠色的石槽,不是拍攔砂籬。這次只在步道上走走,沒到沙灘上,下次有機會再來拍。

據解說牌上面的說明,那個是綠色礁岩海岸,成因是藻類附著在火山岩上,死去後殘骸會硬化成一層薄薄的石灰質,新的藻類趴上去繼續長,這樣一層一層長上去,就堆疊成我們現在看到的藻礁了。

石槽 步道上看石槽

 

石槽解說牌 解說牌,可以清楚看到石槽長啥樣

 

再往前走一小段,馬上就可以看到海邊出現很多顆有稜有角的石頭,解說牌再次出現。這些石頭稱為風稜石,是從大屯山噴發下來的安山岩塊,經由東北季風長期挾帶細沙吹襲,造成平坦的蝕面,風向改變,就會形成尖銳的稜角。真像是大自然的切割工,不過別人切的是鑽石,東北季風切的是安山岩。

其實這一整路,滿滿的都是風稜石,要視而不見還挺難的。

風稜石 風稜石

 

另外,步道兩旁還有許多植物,不過大部份都叫不出名字。

不知道植物_01 不知名小花

 

不知道植物_02

不知名葉子

 

不知道植物_03

不知名… 花椰菜?!

 

再往前走一段路,終於看到富貴角燈塔冒出頭來了。興奮地往前跑去,在燈塔旁開開心心地照相,終於,台灣最南點和最北點我們都去過了。

最北點 攝於燈塔旁,最北點

 

富貴角燈塔

富貴角燈塔,禁止進入

 

富貴角燈塔門牌 全台最北門牌,富貴角燈塔的門牌號碼

 

在富貴角燈塔照完相後,眼前有兩條叉路,一條左邊的柏油路,不知道到哪,右邊的繼續靠海邊走,看來像是步道的延伸,選擇繼續往右邊的路走。

右邊的路,海邊仍然滿滿的都是風稜石,往前一小段,可以遠遠地看到白沙灣。走了一段路以後,從步道的另一頭出來,接到富基漁港。

從步道另一頭出來後,似乎是個停車場,還在開玩笑說應該要停這裡比較近,馬上就看到了標示,一個人坐在旁邊,原來是要收費的。

富基漁港漁船 富基漁港漁船

 

由於富基漁港的黑名如雷貫耳,完全不考慮在這裡吃東西;往前直走,在遇到左上右下的叉路時,走左邊的單行道,逆向也沒關係,因為是走路的。

往前再走一段路,可以看到楓林大橋,往左邊叉路轉上去就回到停車的地方了。

很輕鬆的步道,慢慢走的話,全程走完大概一小時可以搞定,地形起伏也不大;以後有空可能還會再來走走吧。

富貴角空照圖

富貴角周邊空照圖

2010年5月9日 星期日

花蓮三日遊 – 5/3 Day III, 溯溪。太魯閣。歸途

今天早上安排快樂的溯溪行程。

八點十分,車子就出現的飯店門口。車上已經有五個人,包含兩個教練,一個教練的同學,還有兩個同樣也是今天溯溪的朋友,其中一位還是外國人,不過聽不太懂他們講話的內容,原來他們是從荷蘭來的,並不是講英文;幸好其中有一位是台灣人,可以翻譯。

到了目的地後,開始換裝,穿上防寒衣、救生衣、防滑鞋、頭盔,開始有溯溪的感覺了。一開始先熱身,把身體弄溼,雖然天氣不錯,但畢竟還是五月初的日子,碰到水還是覺得冷,但很神奇地,過了一會兒,似乎又不那麼冷了,可能是防寒衣發揮了作用。

接下來,我們是來溯溪,不是來登山的,所以都挑溪裡的路走,還有一些仰著跳水、進小瀑布等路線,吃水是免不了的,不過有救生衣護身,安全性倒是沒什麼問題。

到了最後,會有個稍微有點高度的跳水,荷蘭人很勇敢地一馬當先跳下去,我跟在後面助跑準備跳的時候怯場了,縮回來深呼吸一口氣,再度助跑往前衝,跳下去的過程只有一個感想:怎麼這麼久還沒落水啊。

整體來說,溯溪很好玩,沒有想像中累,路程也比想像中短很多,有穿救生衣,不會游泳也沒關係;為了避免透露太多,讓大家失去興緻,這裡就不描述太多細節了。

跳水 最後的跳水

 

溯完溪後,中餐原本要到舊愛新歡去吃,結果沒開;於是決定,把網路上找到的在地人小吃通通吃一遍,不過不知道是不是時間太早,不是找不到就是沒開,結果只吃了山東餡餅,炸蛋蔥油餅,買了兩個菠蘿麵包,不過留到了晚上才吃。

解決完午餐後,路上隨便挑了間曾記,買了幾盒麻糬回家當伴手禮做個交代,在蘇花公路前,臨時又轉進太魯閣逛逛。

太魯閣今天的遊客很驚人,尤其是在長春祠,十幾輛的遊覽車把整條路塞得滿滿的,全部都是大陸旅遊團。記得以前來過幾次,最多人的時候,還不及今天的四分之一。

砂卡礑步道 砂卡礑步道

 

長春祠 長春祠

 

原本想到燕子口走步道,不過只看到了一大片落石,步道似乎封閉了。回來看新聞才知道,前兩天大片落石,還有人被砸傷了。

下午五點多,時間晚了,準備回家。

回程路上,看到一男一女走在路上,其實在上燕子口時,就看到他們了;把車停了下來,問他們要到哪裡,女的回答說太魯閣牌樓,請他們上車後,女友開始跟他們聊起天來;原來女的是新加坡人,男的是印尼人,他們在日本認識,約好一起到台灣來玩。沒想到公車的時間似乎沒算好,車子載上去了,卻沒有公車下來,只好用走的;男的不太會講中文,幾乎都是女的在聊天。

開到過了長春祠後,在路邊又看到一個人背著大背包在走路,自然地又停了下來問,這個人也是從外國來的,要到砂卡礑步道;先把他載到砂卡礑後,心想砂卡礑已經離有人煙的地方不遠了,提醒他天要黑了,注意安全,便載著一男一女回到太魯閣牌樓。

到了太魯閣牌樓,沒看到有公車的蹤跡;問了他們的目的地,知道要到花蓮後,乾脆直接載到新城火車站,讓他們往南坐一站就可以到花蓮市。不巧今天已經要回家了,如果早一天遇到,還可以直接載他們到花蓮市。

放下了兩個人後,踏上蘇花公路,踏上歸途。

花蓮三日遊 – 5/2 Day II, 賞鯨。糖廠。螢火蟲

早上起床後,暈船的感覺退去許多,但喉頭仍然還是有東西卡住的感覺。吃完早餐後,趕緊乖乖地先服用暈船藥。

昨天匆匆忙忙地 check-in 後,又匆匆忙忙地趕往石梯漁港,回來後又匆匆忙忙地躺平,完全不知道千禧山莊附近的景色。早上到陽台往海邊看,千禧山莊離海邊只有一小段距離,今天陽光很大,風也不小,看著海浪上上下下,已經不會有不適感了。可惜早上仍要匆匆忙忙地再度趕往石梯漁港,如果是來悠閒地度假的,到海邊走走也許也很不錯。

千禧 千禧山莊陽台景色

 

到了石梯漁港後,今天人也是不少,其中也有不少人昨天晚上也有參加夜釣,都很勇敢,沒被昨晚的暈船症狀嚇退。

海鯨號報到處海鯨號報到處 

 

九點一到,全部的人被帶到二樓做簡報,乖乖地聽完後,再回到碼頭,穿上救生衣,一行人又快快樂樂地準備出海了。

海鯨號 海鯨號

 

今天坐的是比較大台的海鯨號,有上下兩層,昨天晚上在下面那一層吐的很開心,今天決定到上面那層坐。在簡介時,有提到船的最前方有鏢旗魚的鏢台,講解人員還特別強調那是 VIP 座,只有四個,一上船就有幾個小孩子和媽媽很開心地搶了鏢台的位置坐;此時心裡很壞心地在講著,半小時後看你們是坐著還是躺著。

果然,不用半小時,鏢台人員就全數換人,原本那群已經乖乖地吐完躺在椅子上休息,到下船前都沒再起來過。

不過後來換上去的那群很猛,全程坐在鏢台聊天,面不改色。中間我有到船首位置站兩分鐘,頭就開始暈了,趕緊再回到二樓。

一出海,船長就開始搜尋海豚的蹤跡。今天天氣很好,運氣卻不怎麼好;遠遠地看到有海豚的身影,船開過去後,卻又消失無蹤。船往南開了一個多小時,看到了鬼頭刀、飛魚、海鳥,就是沒看到海豚。

在回程的路上,船長突然轉向,過一下子,就有人大喊看到海豚了。一開始只有四隻,距船一段距離,過不了多久,突然出現一群海豚,就在船的周圍游來游去,到最後是一群在船首旁游,不過我的攝影技術不好,沒有一次抓到海豚跳出水面的畫面。

據解說人員說,這次我們遇到的海豚,名字叫「熱帶斑海豚」。本來是想看到一大群海豚會躍出水面還會旋轉的,不過那似乎是飛旋海豚才會這麼做,這次並未看到。

很幸運地,這次賞鯨完全沒有不適感。

海豚 這已經是最清楚的一張了

 

下午沒有排行程,可以悠閒地亂逛。

吃完午餐後,先到石梯坪走走。今天石梯坪一樣有很多遊客,來來去去。站在大石頭上,看著別人釣魚,想到昨天的夜釣,似乎沒有那麼害怕了;也許下次有機會,會再來嘗試一次。

石梯坪石雕 石梯坪不知名石雕

 

石梯坪釣客石梯坪釣客

 

下午,準備回花蓮,短的路程可以由台十一線原路回去,但我們選擇從瑞港公路,循著秀姑巒溪回到台九線,再往北走;一個原因是想在長虹橋看看泛舟的人們,不過很可惜,時間太晚,似乎都已經收工了;第二個原因,是因為嘴饞,想到光復糖廠吃冰。

到了光復糖廠,人潮比東部海岸多出許多,連買冰都要排隊,不過幸好,排了幾分鐘就排到了;我點了一個巧克力甜筒,女友則是點了忘了名稱,只記得有白蘭地的甜筒。甜筒的脆餅很脆,很好吃。

花蓮糖廠 花蓮糖廠白蘭地甜筒

 

採甘蔗機 光復糖廠採甘蔗機

 

晚上回到花蓮市區後,先到飯店 check-in ,行李丟著,馬上又出發開始晚上的閒逛行程。

首先,先到了七星潭,七星潭今晚的遊客不多,天空飄了一點小雨,兩個人很溫馨地在七星潭慢慢地散步,這就是所謂的幸福吧。

接下來,很開心地到自強夜市覓食;先吃了廟東蚵仔煎,女友建議是不是要先點一份一起吃,等一下再吃棺材板,最後還是決定一人點一份;沒想到看起來似乎不特別大的蚵仔煎,吃完以後,竟然已經有一點飽了;接著當然是要去吃棺材,以前都是吃蔣氏棺材板,這次想試試法氏棺材板;不知是不是已經被蚵仔煎餵飽了,覺得以前記憶中的蔣氏比較合胃口;吃完棺材板,當然要再來一分妙不可言的飲料… 但肚子已經完全被撐飽了,飲料下次再來吧。

廟東蚵仔煎 廟東蚵仔煎

 

晚餐解決後,約晚上七點多,時間還早,兩個人又決定去鯉魚潭看螢火蟲。一到了鯉魚潭遊客中心,外面意外地停了不少台車子;車子停好後,走到遊客中心裡,看到了有人在帶團解說,本著鄉民看熱鬧的本領,神不知鬼不覺地混入人群中;原來是鯉魚潭遊客中心舉辦的鯉魚潭深度旅遊活動,今天的主題是夜賞螢火蟲,有人帶路,還 A 到了兩頂帽子,幸運幸運。

走在晚上的鯉魚潭步道很舒服,走了沒多久,就看到一群一群的螢火蟲出來見客了。人家在求偶,當客人的我們應當盡量不要去打擾牠們。中間雖然有些遊客一看到螢火蟲就忘了自己是誰,拿著手電筒猛照,不然就是伸出手要去抓;幸好大家都還是文明人,經旁人稍微提醒後,大部份都能克制自己的行為。

晚上九點多,我們準備要離去時,還有遊客剛要來,看來鯉魚潭也是個知名的賞螢地點。

明天就要回家了,心裡還是想繼續在花蓮待下來。

2010年5月7日 星期五

花蓮三日遊 – 5/1 Day I, 粉鳥。朝陽。夜釣

早上八點半,從台北出發。

台北到花蓮的路已經走了好幾次了,其中一次還是騎腳踏車。這次有點不太一樣,以往都是直接殺到花蓮,這次則是在途中選了兩個點短暫停了一會兒。

第一站是粉鳥林,很漂亮的沙灘。從蘇澳出發,在蘇花的第一個山的下坡,山腰處有座小廟,有個涼亭,往山腳下看,可以看到一片沙灘,那就是粉鳥林。

東澳是個不大的聚落,街道的中央右手邊有個警察局,對面有間便利商店,從便利商店旁的路開進去,一直走就可以到沙灘了。

沙灘很乾淨,看不到什麼垃圾;往左邊的半山腰上看,可以看到剛剛走過來的蘇花公路,右邊則可以看到烏石鼻躲在山的後面。

粉鳥林沙灘

稍作停留後,起身繼續出發。在路口的便利商店,紅綠燈旁立有一個牌子,指示若要通過,請壓在路面的「S」標誌上。把車子開到「S」標誌上後,以為紅綠燈會自己切換,過了一會兒,看到對面警察局內,有警察探頭出來,看了一下,然後再走進去,接著就變綠燈了。和女友在車上笑著判斷,有可能是壓到 S 標誌後,會通知警察局,然後警察出來看路況,在適當的時候按下鈕變成綠燈。

往前翻過一座山後,就到達南澳了。以前在這兒頂多只是到7-11買個東西吃,到南澳車站上個廁所;這次廁所還是要上的,除此之外,也到了路過好幾次卻從來沒進去過的建華冰店吃了一碗紅豆牛奶冰,夠甜,我喜歡甜的東西。

吃完冰後,前往尋找朝陽步道的地點。在南澳的街上,往朝陽路轉進去直直開,會先穿過朝陽社區,沒多久就到了朝陽漁港。漁港不大,漁船也不多,倒是假日的遊客不少。

走上堤防後,右手邊同樣有一片小沙灘,沙灘上插著幾支釣竿,看起來似乎跟當天晚上夜釣的釣竿一樣。還有一條不知道是做什麼用的小船,真的很小;在堤防上可以看到烏石鼻的另一面。

朝陽漁港

在堤防上散完步後,回到停車的地方,在公車站牌的對面找到了朝陽步道的入口點,看來要繞一圈得花一段時間,其實今天的行程有時間表,六點以前必須到石梯漁港夜釣,在這之前還必須先到千禧山莊check-ing,於是決定直接跳過這個景點,留待下次再來。

到達花蓮後,事先搜集的資料,石梯漁港那附近地點較偏僻,怕晚上肚子餓找不到東西吃,就到了花蓮的家樂福買一些糧食預備;事後證明,這根本是多此一舉,晚上夜釣整個吐翻天,食物完全派不上用場。

女友在台北時,已經先買了兩顆暈船藥,但這次旅程會有兩次坐船的機會,一次是今天晚上的夜釣,一次是明天早上的賞鯨,兩個人共需四顆,於是在往石梯漁港的路上,經過豐濱時,又買了兩顆暈船藥備用。

原本一直擔心會路過千禧山莊沒注意到,在過了長虹橋以後,眼睛就不停地往路邊搜尋,在過了北回歸線紀念碑後,右手邊一個大牌子,裡面一棟大建築物,即是千禧山莊,要錯過還不大容易;大約五點二十分的時候,到了千禧山莊,匆匆忙忙地 check-in 後,就趕緊往石梯漁港出發。

海鯨號的報到處很好找,在石梯漁港的入口處就有很明顯的標誌,順著走就會到碼頭和報到處了。碼頭有一隻很大的… 不知道是鯨魚還是海豚的石像,底下寫著「賞鯨發源地」。

賞鯨發源地

 

六點整,很準時地,開始行前解說,說明釣竿的用法,網子的用法,還有救生衣的穿法跟注意事項,重要的是,到了海上以後,請把平常的身份卸下,把自己當做是漁民。接著,一群人就開開心心地上船了。

出海了

一開始還很興奮地聊天,很開心地左看右看。船開了幾十分鐘後,到達今天的釣場,船停了下來,此時慢慢地感覺到有些暈船了。很快地,我成了今天全船第一個吐的人,暈船藥吃了完全沒有效果。過不了多久,全身似乎開始冒冷汗,連坐在船邊都覺得很困難,於是把釣竿交給女友一個人,自己跑到椅子上去躺了。

躺了沒多久,睜開眼睛看了一下,發現身邊多了許多人,原來大家也陸續暈船了。

原來在暈船是這麼難受的感覺,完完全全地躺平,一坐起來,噁心的感覺馬上就湧上來,把今天原本就吃不多的東西吐光後,還是一直想吐。

終於,在不知道躺了多久以後,船準備回航了。

也不知道開了多久,有感覺船慢慢地進港;等船靠岸後,一踏上陸地,還是一樣不舒服;船東準備了宵夜,稀飯無限吃,和飛魚乾一條;實在是沒什麼胃口,勉強自己吞了幾口稀飯,再咬了幾口飛魚乾;飛魚乾很好吃,第二天賞鯨的時候,知道這是龍船長燻的。

在吃東西的過程中,原本是朝著港口坐的,看到了上下搖動的船,人雖然在陸地上了,噁心的感覺馬上就又湧了上來,趕緊把視線移向陸地。

吃東西的時候,跟女友聊了一下,才知道原來她在我躺平後沒多久也暈船了,自己一個人在船邊吐了幾次,又一直聞到汽油的味道,很不舒服。但是從頭到尾沒聽她抱怨過一句,為什麼要帶她來這裡受苦,直到今天還沒聽到她抱怨。很棒唷!我的女友,是個很乖的乖小孩。

暈船的感覺真的很難受,有一股衝動,要到櫃台把明天早上的賞鯨行程退掉。

上船前把 GPS 打開記錄軌跡,發現原來在夜釣的過程中,船靜止時,被海流帶了一段不短的距離,大約往北一公里多。下圖即是航跡圖,原來我們離岸邊並不遠,大約五公里左右。

夜釣航跡 

吃完宵夜後,開著車慢慢地回千禧山莊,躺在床上完全不想動,勉強起來洗個澡後,咚地一聲躺在床上就睡死了,時間大概才十點多而已。

2010年4月20日 星期二

將數字將成 QString 的方法

如果要將一個數字轉成 QString class,可以使用下列用法:

int i = 127;
QString str;
str = QString::number(i, 10);

其中,number的第二個參數指的是幾進位,如果沒填,預設是十進位。

這個用法我已經用了又忘好幾次了,筆記一下。

2010年4月18日 星期日

記載 MP3 的資訊 -- ID3v1

打開檔案總管,對著一個MP3檔案按下右鍵→內容,在跳出的視窗選摘要,切到進階,可以看到演出者、專輯標題、年份、曲目、類型、標題、註解等資訊;同時,使用大部份的MP3播放器,也可以看到這些資訊。

mp3_info

 

這些資訊可以由數種方式帶在MP3的檔案內,其中,最簡單的方式,即是ID3 v1。

ID3v1有兩種版本,ID3v1及ID3v1.1版;不同之處,在於1.1多出了可紀錄track number的功能。

ID3v1的資訊帶在檔案的最後面,128 bytes 的地方。使用UltraEdit或是PSPad或任何可以觀看十六進位的編輯器,開一個MP3檔,移到檔案的最後,可以看到記載ID3v1的資訊。

放在檔案最後面,最大的好處在於,當使用者決定要新增或移除ID3v1的全部資訊時,只要將最後128 bytes做加入或移除動作即可;如果放在檔案開頭,則需要對整個檔案的內容做移動的動作。

mp3_info_2

ID3v1

下表即是ID3v1的結構圖。

‘TAG’ 3 bytes
標題 30 bytes
演出者 30 bytes
專輯名稱 30 bytes
年份 4 bytes
註解 30 bytes
歌曲類型 1 bytes

 

ID3v1以‘TAG’ 三個字元起始,後面接著30 bytes的歌曲名稱,30 bytes的演出者,30 bytes的專輯名稱,4 bytes 的年份,30 bytes的註解及 1 bytes的歌曲類型。連同 TAG ,共 128 bytes 大小。

因此,實作上非常容易,只要fopen一個檔案,fread最後128 bytes的資料,判斷前三個bytes的內容是不是 TAG 三個字元,即可知道是否帶 ID3v1 的資訊;接著,再依照上表,就可以分別讀出所需的資訊。

 

ID3v1.1

如前所述,1.1 版新增了track的資訊;但1.1考慮到向後相容,且ID3v1無任何空間,也無任何保留的欄位可供利用,要怎麼做才不會導致原有的ID3v1無法運作?

首先,需先說明,在ID3v1裡,未填資料的地方,需填上0;例如,演出者為 ‘Vivaldi’,共七個字元,剩下的 23 bytes,均需填0。

這裡採用的作法,是將註解的30 bytes,挪出最後 2 bytes 記載 track number;這 2 個 bytes 的第一個 bytes 必須要為 0,後一個 bytes 則記載 track 的資訊;因此,只要註解的第 29 bytes 不為 0,即無 track 存在的可能性;但第 29 個 bytes 為 0,接著必需檢查第 30 個 bytes,如果不為 0,這個就是 track 的資訊。

 

下圖為ID3v1及ID3v1.1的圖示。

id3v1_blocks id3v1.1_blocks

 

可以看出,v1.1的Comment較短,且新增了Album track的欄位;差別即在於此。

如需更詳細的資料,可以至 http://www.id3.org 查閱。

2010年4月15日 星期四

PuTTY 按下 Ctrl-S 畫面凍結的解決方法

常發生這種情況:使用 PuTTY 連到工作站,開了 vim 寫程式,寫到一半很自然會想存檔,很自然地就按了 Ctrl-S,然後整個視窗就停住了!只好含著淚開另一個視窗把 process kill 掉...

其實這是 PuTTY 一個好用的功能,當在 compile 或跑程式的時候,log 拼命地跑出來,這時想把畫面停下來,看看 log 訊息,就可以按下Ctrl-S,整個畫面就會凍結住;等看完後,要讓畫面回復正常,只要再按下 Ctrl-Q 就可以了。