RealAudio 格式整理

RealMedia 雖然算是我們的合作夥伴, 但是我還是要吐槽他們格式紊亂! 我知道 Wiki 上有做整理, 不過有時忽然又會忘記下哪一個 keyword 才找得到, 乾脆整理在自己的網站上吧!

 

Format 格式名稱 技術 特性 對應 player
RA1     一說就是 RA2-LBR  
RA2-LBR lpcJ IS54,VSELP 過時, 14.4 kbps  
RA2-HBR 28.8 G.728,LD-CELP 過時, 28.8 Kbps  
RA3 dnet Dolby AC3-like 過時  
RA4        
RA5 sipr Sipro ACELP 過時 Real Voice
RA6 cook Cook 1-2 CH RealPlayer G2
RA7        
RA8-LBR cook Cook,Gecko2 12~64 Kbps RealPlayer G2
RA8-HBR atrc Sony ATRAC3 >64 kbps,過時  
RA9 raac MPEG LC-AAC    
RA10-LBR cook Cook,Gecko2 5.1 CH, 12~128Kbps RealOne Player
RA10-HBR racp MPEG HE-AAC 128~800 Kbps RealOne Player
RA10 ralf RA lossless   RealOne Player

 

[note] RealOne player is backward compatible to RealPlayer G2.

使用 Awk 的小筆記

因為需要把 link 出來的執行檔切到 .bss section 為止, 以便做成比較小的載入檔, 所以我們一直需要一個把大檔案切小的功能. 反正 .bss 是不需要初值的, 根本不用儲存那一塊.

原先我們的公用 makefile 是比較陽春的, 為了吃進參數方便, 在 makefile 中 run-time 去編譯一個 c++ 的小程式, 以便在 Linux 和 Cygwin 的環境都可以用.

不過最近遇到問題了, 假如某台 Linux server 不適合灌 development tool chain, 那根本就不能 make 了. 為了解決這個問題, 我決定用 gawk 來做它.

Gawk 來自 AT&T 的 awk, 加了 G 字頭之後, 就表示它是 Gnu 家族的 freeware 成員. 另外還有個 Nawk, N 字頭表示 New (新版).

Gawk  沒有型別定義, 變數可能是 string, 也可能是 number,  完全看場合而定. 它可以寫成一行文 gawk {}, 或是讀一個批次檔來執行 gawk -f batchfile.

因為一行文已不符合我的需求, 所以我這次是用檔案.

x = $1

就把參數 1 抓進來了. $2 表示參數 2, 依此類推. 但是 $0 表示一整行的所有參數.

那第二行怎麼辦呢?

用 getline, getline 之後, 原來的 $0, $1,…就都變成與下一行的對照關係了.

依據這樣的參數, 就可以計算出真正需要的 file size 有多大.

不過另外有一個問題. Gawk 有三角函數的計算能力, 我卻找不到計算 16 進位的加減法功能? 這時當然是上網找打手. 在 http://os.cqu.edu.au/cgi-bin/info/info2html.cgi?(gawk)Strtonum%20Function 有現成的 sting 到 number 轉換程式.

Gawk 是可以呼叫 function 的:

x = abs($1)

function abs(str)

{

}

因為 awk 沒有型別,  所以 function 的參數就直接是 variable. 我引用的這個網址使用了很漂亮的 index 技巧, 有興趣的人可以參考這個寫法.

if ((k = index(“abcdef", c)) > 0)

 k += 9

如此就把輸入 c = a, k = 9+ 1 (1 是 index = 1) 的計算給求出來了.

Gawk 還可以呼叫 system() 函數, 有這個功能就可以在 Gawk 裡面做很多事情. 總之, 這樣就可以把我要的 file size 計算出來了.

那麼怎麼砍檔案呢? 網路上有各式各樣的講法. 有人說可以寫一個 truncate function、有人說可以用 (c)split、有人說可以用 cut.  

split 會產生一大堆相同 size 的檔案, 而且也只適合於 text (line-based) 的文檔.

Binary 檔的切割, 用 cut 也不正確. 如果用 cut –help 去看, 就知道 cut -b 並不是要 cut 幾個 byte 出來, 而是每行 cut 這麼多 bytes!

所以用 head 或是 tail 才對, 他們才是適合切割 binary 檔的.

head -c 1000 BigFile > SmallFile

這樣就行了, 那個 1000 就用 gawk 來幫忙算. 如此即可以免去即時編譯 c++ 的困擾.

gawk 的使用手冊可以參考這個網址, 我都是用到多少才去了解多少, 沒手冊還真是不行.

http://www.grymoire.com/Unix/Awk.html

Shell Script in Makefile

不知道大家有沒有試圖在 Makefile 裡面寫個 shell script 呢?

打個比方來說, 如果這是一個 script

read -p “key in your name: " yourname

echo -e “Your Name is: " $yourname

隨便貼到一個 shell.sh, 然後執行, 保證很順利.

不過呢, 把這兩行貼到 makefile 之後就變樣了.

首先, 第二行不認識第一行的 yourname 了….

Why? 要 export 嗎?

不是!

因為 makefile 裡面的指令, 每一行是單獨在一個 sh 裡面執行的, 所以第二行當然不認識第一行的 yourname 囉!

解決之道是, 加上一個 ‘\’, 表示這兩行希望用同一個 shell.

read -p “key in your name: " yourname    \

echo -e “Your Name is: " $yourname

 

然而, 肯定還是失敗啦! 因為, 因為第一行裡面的 yourname 是經過求值的, 所以第二行要用 $$yourname 來取值. 這樣就會對了!

read -p “key in your name: " yourname    \

echo -e “Your Name is: " $$yourname

對了, 還要分號. 因為分號可以讓這行指令告一段落.

 

read -p “key in your name: " yourname ;   \ 

echo -e “Your Name is: " $$yourname;

如果有 do 迴圈, 分號的位置如下:

for d in logic ui; \

do \

  echo $$d/*.java; \

done > $@

這個簡單的撇步不懂的話, makefile 就會寫不好. 詳情請參閱 O’Relly 出版社的 “GNU Make 專案開發工具" 第三版的 page 100, “接續太長的命令".

說真的, 真本書超讚. 不過我沒有心情去一頁一頁地看它, 所以暫時不會有它的讀書心得跟大家報告. 或許想到哪裡, 寫到哪裡吧.

戰戰兢兢 手動更新 WordPress 2.7.1

不知道為甚麼? 我不能自動更新 wordpress 了. 手動更新本來是必然的, 但是自從有了自動更新功能之後, 我已經把手動更新架站軟體的技能忘光了…

每次按下 autio upgrade  的按鈕, 它就會出現 time out, 說甚麼 3 秒或是 2 秒鐘之內只收到 X out of Y bytes 之類的. 上網查了好一陣子都沒有結果. 最後終於看到有人提到去改 wp-admin/include/file.php 的 444 行. 把 timeout 從 30 改成 600 秒之類的. (抱歉! 這位大哥, 我忘了您的 blog 位置, 不再有那個 error message 後, 就 google 不到了.) 改過之後, 顯然還是有一些問題, 畢竟我的 time out 幾乎是秒殺, 不是 30 秒.  所以還是得去試試手動更新.

唯一講得比較清楚的網址是 wordpress 本尊, 可惜那是英文的. 我雖然懶得看, 又怕漏掉哪一步, 然後就倒站了… 所以只好歸納一下做法, 中文的程序如下.

1. 先把 apache 停用, 大家先不要動. 等效就是停用外掛等功能.

2. 把新版 wordpress 抓回來, 解壓縮成另外一個目錄, 如 wordpress_2.7.1 之類的.

3. 把舊版的 wordpress 的 wp-include 和 wp-admin 兩個目錄殺掉.

4.  要確定 wp-config.php 這個檔案不會被蓋掉, 即新版的檔案不同名, 預設是叫做 wp-config-sample.php 之類的.

5. 把新版的蓋過舊版的內容, 其中 wp-content 下面的 plugin 和 theme 才能覆蓋舊版. 不然就倒站了.

6. 啟動 apache server.

7. 進入 網址/wordpress/wp-admin 或 網址/wp-admin, 重新設定. 不過我好像不用做這一步也 OK.

參考網址: http://codex.wordpress.org/Upgrading_WordPress, 英文版最大的缺點就是: 雖然 step by step 往下講, 但是提醒特別注意 wp-content 這個目錄的事情卻放在 step 1 的 note, 如果已經把檔案移除了, 才看到這一行豈不是要吐血???

uClibc v.s. glibc

這兩個 C library 的異同, 網路上已經有很多論述. 不過我看大部分的網頁都是翻譯或轉貼 uclib 的官網, 這麼一來, 大家都只會看到 uclibc 的優點, 不會嗎?

http://www.uclibc.org/downloads/Glibc_vs_uClibc_Differences.txt

不過點進去看之後, 它的描述還頗為公正.

uClibc 自稱比較小而精簡, 把一些功能刪掉了.

所以缺點包括不保證跨平台、不提供 database (libdb)、NSS (DNS 與網路認證)、libresolv (做甚麼的? 找 IP 嗎?)、libnsl (yellow page、Network  Information Service)、語言的支援 (locale)、對 long double 的支援較低、對 encryption 支援度較低 (libcrypt)、綁定 Linux 的 ‘struct stat’ 架構與 kernel type、沒有 aio 或 clock、shm (做什麼的? 簡諧運動??? 哈!).

根據由儉入奢易的原則, 把 uClibc 的程式 porting 到 glibc 是容易的, 反之則難.

對了, uclibc 不適合用於有 MMU (memory manage unit) 的環境. 在動態連結的時候, 一定是用 glibc, 不然只能用到 simple MMU 的功能, 也就是 physical memory 和 virtual memory 是一一對應的.

Glibc 由 GNU 提供, 適合各種硬體平台.

uClibc 是針對 uC LInux C 開發的.