2008年8月2日 星期六

iconv的初體驗

最近因為公司任務的關係,我要負責弄DVB-T的東西。DVB-T對我是一個全新的挑戰,也滿有趣的。第一個遇到的問題就是EPG的亂碼。想到亂碼的解決,就是澆冷水...囧rz.....恕我開個玩笑。:-P

咳咳...在Linux的環境下,一想到轉碼,就會想到iconv!

對iconv,小弟都只聞其名、未深入體驗,這次剛好有個機會來嘗試。試著寫個簡單的小範例來轉換字串成UTF-8或是Big5。

PS:因為blogger不知道要怎麼顯示 <> 這樣的符號(會被辨試成delimiter),所以改用 "" 表示。


#include "iconv.h"
#include "string.h"
#include "stdlib.h"
#include "errno.h"

int main( int argc, char **argv )
{
iconv_t cd;
size_t in_s, out_s;

/* UTF-8 轉 Big5 */
cd = iconv_open("BIG-5", "UTF8");

char *ibuf = "我是阿信", *in_ptr;
char *obuf = NULL, *out_ptr;

in_s = strlen(ibuf);
in_ptr = ibuf;

obuf = malloc( in_s * 3 );
out_s = in_s * 3;
out_ptr = obuf;

if( cd == (iconv_t )-1 ){
fprintf( stderr, "error opening iconv \n" );
exit(1);
}

if( iconv( cd, &in_ptr, &in_s, &out_ptr, &out_s) == -1 ){
printf("errno: %s\n", strerror(errno));
}

*out_ptr = '\0';
printf("%s, %s\n",ibuf, obuf);

iconv_close( cd );
free( obuf );
return 0;
}

接下來就 gcc -Wall a.c -o a.out,開一個Big5的terminal,執行一下這個新生的a.out,就能看到轉換後的字串了。

試用過了iconv之後,花了一點時間修改dvb-apps的scan程式,利用下scan指令後,會得到正確的節目表的名稱在新產生的channel.conf檔案內了。

2008年6月21日 星期六

節約,省電的好幫手:Cpufrequtils

最近常聽到節約,省電的口號,加上七月份電費要開始上漲,省電變成每台電腦的基本功能。

今天要介紹的就是要讓您的CPU降速、降溫度的好工具:cpufrequtils。

在kernel-2.6中,已經實作了動態調整CPU clock的kernel module:cpufreq,它支援Intel/AMD的CPU,小弟的CPU是Althon Dual Core 3600+,支援CnQ,在待機時可以降下速度,溫度也會降低。

首先,先安裝適當的module,以AMD的CPU而言,採用的是powernow-k8:
modprobe powernow-k8
modprobe cpufreq_ondemand

以及相關的cpufreq module,小弟採用的是ondemand模式,接下來,請安裝cpufrequitls,修改
/etc/default/cpufrequtils

加入
ENABLE="true"
GOVERNOR="ondemand"
MAX_SPEED=1900M
MIN_SPEED=1000M

或者直接修改/etc/init.d/cpufrequtils,內容如上。重新啟動cpufrequtils
/etc/init.d/cpufrequtils restart

執行cpufreq-info

analyzing CPU 0:
driver: powernow-k8
CPUs which need to switch frequency at the same time: 0 1
hardware limits: 1000 MHz - 1.90 GHz
available frequency steps: 1.90 GHz, 1.80 GHz, 1000 MHz
available cpufreq governors: powersave, conservative, userspace, ondemand, performance
current policy: frequency should be within 1000 MHz and 1.90 GHz.
The governor "ondemand" may decide which speed to use
within this range.
current CPU frequency is 1000 MHz.

出現上述字樣就表示cpufreq已經設定成功,檢查/proc/cpuinfo,您就會發現CPU的頻率會在1G~1.9G跳動,剩下的,就是好好享受cpufreq帶給你的便利性了. :-D

PS: cpufreq支援多種policy:
performance: 全速
powersave: 以最省電的方式調整CPU clock,大部份都在最低的頻率
ondemand: 依照CPU loading的程度動態調整,撥SD/HD的影片時,會跳動的最明顯。


PS2: 還有另一套cpufreqd,它是以daemon的方式運作,設定的內容更細,還能依照ACPI來監控電池容量改變CPU頻率,由於弟只有桌上型PC,所以cpufrequtils簡單的設定方法已經符合弟的需求了。

2008年6月18日 星期三

mhddfs: join several real filesystems together to form a single larger one

FYI
http://debaday.debian.net/2008/05/25/mhddfs-join-several-real-filesystems-together-to-form-a-single-larger-one/

該軟體的是利用FUSE(User space filesystem)這個module將多顆硬碟串成一個virtual device,而非像已往的Raid,LVM的方式,

他寫入的機制很簡單,假設有三顆硬碟:A,B,C。當寫入資料時,若資料大於A硬碟所餘的大小,就會換到第二顆。同理,第三顆硬碟的操作也是如此。

另外,當它寫入第一顆時,發現還有空間太小必須換另一顆硬碟時,會搬移剛剛寫入的資料到接續有足夠大小的硬碟。

雖然機制上沒有Raid, LVM那麼有效率和安全,但不失為一個單機版合拼硬碟的方法。

目前Debian testing/unstable已經有,Ubuntu尚未納入,參考看看

2008年4月22日 星期二

Vim Plugin: enhanced-commentify

最近才慢慢地體會Vim Plugin的好處。

因為有大量註解一段文字的需要,每次用/* */一個一個打或是#if 0 #endif也不是很好。一直希望能有工具幫我實現。

現在終於有這個好東西!請先安裝 vim-addons 這個工具軟體,然後執行

vim-addons install enhanced-commentify

安裝好之後,隨便開一個.c or .cpp檔案,先進visual mode選取一段文字,然後按下

"\x" (反斜線+x)

你就會發現這些文字全部被註解掉了!要回覆的話,同樣地選取起來,再按一下"\x"就可以了。

也可以用"\c",會自動跳到下一行。

2008年4月8日 星期二

[轉貼]Autotools 和 Makefile.am 的攻略

這是在網路上找的文件,很適合初學觀念或是找指令的參考

利用 Autotools 來建立 Makefile 檔案

實戰Makefile.am

2008年4月5日 星期六

DVD authoring and Buring with Command Line

因為常常燒錄DVD Video,而我的環境都是Linux,所以就Post一下常用的寫法以免忘記。

備份DVD

先安裝vobcopy,然後再mount你的DVD光碟(可用pmount)

vobcopy -m -t "DVD Title"

然後再用 mkisofs 來建立dvd iso

mkisofs -dvd-video -udf -o dvd.iso dvd/

利用 growisofs 來燒錄光碟

growisofs -Z /dev/srcd0=dvd.iso

----------------------------------------------------直接燒錄DVD檔案的方法
growisofs -Z /dev/scd0 -dvd-video -udf dvd_dir/

2008年2月5日 星期二

針對PSP, IPOD, PS3的簡單的影片轉檔script: rip2pmp.sh

我是很愛看影片和動畫的人,之前是購入了PSP之後,展開了我對這種PMP的熱愛。拿到了PSP當然就是盡情的轉檔,常用的工具是ffmpeg和mencoder。也寫了很簡單的script來用。

最近是因為尾牙得到了一台Ipod Touch,他也支援h264的檔案,雖然螢幕(3.5inch)比PSP(4.3inch)小,但是輕薄的外型實在是愛不釋手。然而,先前用的script已經不適用Ipod了,因為兩者的Format不同,所以決定寫一個通用的script讓自已更方便使用。

rip2pmp.sh
http://people.debian.org.tw/~asho/project/rip2pmp-0.1.sh

# Usage:
# rip2pmp.sh -i input.anyformat -o output.mp4 -f [psp|ps3|ipod] -p [1|2]
#
# ex1:rip a file in one pass for psp
# rip2pmp.sh -i input.anyformat -o output.mp4 -f psp
#
# ex2:rip a file in two pass for ipod
# rip2pmp.sh -i input.anyformat -o output.mp4 -f ipod -p 2
#
# ex3: rip a file in standard h.264
# rip2pmp.sh -i input.anyformat -o output.mp4
#
# ex4: pass options to Mencoder
# rip2pmp.sh -i input.anyformat -o output.mp4 -M "-sid 0 -slang zh"


雖然這個script相當的單純,但已經符合我的使用了,未來是打算加入dvd的ripping.

2008年1月25日 星期五

dpatch的使用

最近再包套件時,發現自已對dpatch的用法漸離漸遠,所以參考了一些文章,熟悉一下。

關於dpatch的使用,在文中末段:
http://www.linuxdiyf.com/bbs/archiver/tid-62548.html

2008年1月15日 星期二

VirtualBox + Bridge + Port Forward + NAT

最近因為記憶體越來越便宜了,所以一次擴充到4G,在這麼大的記憶體下,就想要把玩一下Virtual Machine. 由於我也算是P2P的用戶,而Debian上的amule or rtorrent無支援windows的emule和utorrent的部份功能,所以我希望能用這一台主機上用VM+windows來實現P2P。

行前準備:
首先說明一下我的網路環境:

主機有兩片網卡:
eth0 接 ADSL + PPPOE,固定IP假設60.1.1.1
eth1 接 192.168.1.0 的網路做NAT
virtualbox的網路使用192.168.2.0的區段,預留給Virtualbox是使用tap0,利用bridge的功能來綁定eth1,以使得一片網片就能連接NAT和Virtualbox的網路。

需要軟體:

virtualbox
uml-utilities
bridge-utils

安裝好之後,可用Debian包裝的OSE版或是官方的版本,弟是使用官方的版本,支援的功能較多。安裝好之後,接下來是設定Debian的網路環境。

閱讀VirtualBox的文件後,主要是bridge一個網路卡,讓Guest OS能存取,在此可能使用VBoxAddIF來實現,它會增加一個vbox的網路介面。弟使用的是tun/tap。

先在/etc/network/interfaces加入tap0的敘述:

auto tap0
iface tap0 inet static
address 192.168.2.1
netmask 255.255.255.0
tunctl_user asho


記得加入使用該tap0的user,static可改成manual的選項,接下來是加入bridge的功能,如果你使用Debian的話,同樣地修改/etc/network/interfaces

iface br0 inet static
address 192.168.2.1
netmask 255.255.255.0
bridge_ports tap0


然後執行/etc/init.d/networking restart,您就會發現多了兩個tap0, br0的介面。

接下來的步驟是設定VirtualBox的Guest OS,在網路的設定中,把"附掛到"的選成主端介面,介面名稱就使用tap0,開機試試看Guest OS的網路是否有連通。成功的話,只剩下最後一個步驟了。

NAT + Port Forward
未完待續