2009年1月29日 星期四

在PXA270成功編譯Qt-embedded程式

Host操作系統:Ubuntu 8.04
GCC版本:4.2.4
Target:XScale-PXA270
Cross-compiler:Cross-2.95.3
Qt/E版本:Qt-embedded-free-3.3.8、Qt-x11-free-3.3.8

1、安裝cross-compiler
1.1、Download cross-2.95.3.tar.bz2
1.2解壓縮到/usr/local/arm

[ren@host ~]$ sudo tar -jxvf cross-2.95.3.tar.bz2 -C /usr/local/arm


2、使用Qt測試GUI
2.1、Build uic & moc From QT-X11
2.1.1、Download qt-x11-free-3.3.8.tar.bz2
2.1.2、為了避免權限的問題,先把/opt的權限改為目前的使用都可以存取的權限(目前我的使用者是ren),以下指令的意思是把/opt的owner與group均改為ren

[ren@host ~]$ sudo chown ren:ren /opt

2.1.3、將下載的檔案解壓縮到/opt底下,並更名為qtx

[ren@host ~]$ sudo tar -jxvf qt-x11-free-3.3.8.tar.bz2 -C /opt
[ren@host ~]$ cd /opt
[ren@host /opt]$ mv qt-x11-free-3.3.8 qtx


2.1.4、安裝xorg-dev套件,否則會產生以下錯誤!!!!!

[ren@host ~]$ sudo apt-get install xorg-dev

2.1.5、設定參數產生Makefile

[ren@host /opt/qtx]$ ./configure

2.1.6、編譯原始碼

[ren@host /opt/qtx]$ make

在/opt/qtx/bin下會產生uic與moc這兩個等一下我們會使用到的檔案

2.2、Build QT-Embedded
2.2.1、Download qt-embedded-free-3.3.8.tar.bz2
2.2.2、將下載的檔案解壓縮到/opt底下,並更名為qte

[ren@host ~]$ sudo tar -jxvf qt-embedded-free-3.3.8.tar.bz2 -C /opt
[ren@host ~]$ cd /opt
[ren@host /opt]$ mv qt-embedded-free-3.3.8 qte

2.2.3、將剛剛編譯好的uic及moc複製到/opt/qte/bin底下

[ren@host /opt]$ cp qtx/bin/moc /qte/bin
[ren@host /opt]$ cp qtx/bin/uic /qte/bin

2.2.4、設定cross-compiler到路徑中

[ren@host ~]$ export PATH=/usr/local/arm/2.95.3/bin:$PATH

2.2.5、設定參數產生Makefile

[ren@host /opt/qte]$ ./configure -no-cups -no-stl -no-ipv6 -thread -no-gfx-qvfb -no-freetype -disable-opengl -disable-xml -disable-canvas -embedded arm -shared -xplatform qws/linux-arm-g++

2.3、在主機端編譯source code讓執行程式
2.3.1、設定PATH

[ren@host ~]$ export QTDIR=/opt/qte
[ren@host ~]$ export QTEDIR=$QTDIR
[ren@host ~]$ export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
[ren@host ~]$ export PATH=$QTDIR/bin:/usr/local/arm/2.95.3/bin:$PATH

2.3.2、Compile Xscale版本的hello
hello的程式碼

#include <qapplication.h>
#include <qpushbutton.h>
int main(int argc,char **argv)
{
  QApplication app(argc,argv);
  QPushButton hello(“Hello World!!”,0);
  hello.resize(100,30);
  QObject::connect(&hello,SIGNAL(clicked()),qApp,SLOT(quit()));
  app.setMainWidget(&hello);
  hello.show();
  return app.exec();
}

2.3.3、編譯出.pro檔

[ren@host ~]$ qmake -project

2.3.4、依.pro檔編譯出Makefile

[ren@host ~]$ qmake

2.3.5、修改Makefile,把內容為
g++改成arm-linux-g++
gcc改成arm-linux-gcc
2.3.6、編譯出執行檔

[ren@host ~]$ make (或make sub-src表示不編譯範例)


假設隨身碟掛載點是/media/usb
2.3.7、把執行檔複製到隨身碟中

[ren@host ~]$ cp -rv hello /media/usb

2.3.8、把函式庫放與字型到隨身碟中

[ren@host ~]$ cp -rv /opt/qte/lib/fonts /media/usb
[ren@host ~]$ cp -v /opt/qte/lib/libqte-mt.so.3.3.8


2.4、把隨身碟插入XScale-PXA270中
2.4.1、掛載隨身碟

[root@host ~]$ mount /dev/sda1 /mnt

2.4.2、建立QTE目錄

[ren@host ~]$ mkdir -p /opt/qte/lib

2.4.3、建立軟連結

[ren@host ~]$ ln -s /mnt/fonts/fonts /opt/qte/lib/fonts
[ren@host ~]$ ln -s /mnt/libqte-mt.so.3.3.8 libqte-mt.so
[ren@host ~]$ ln -s /mnt/libqte-mt.so.3.3.8 libqte-mt.so.3
[ren@host ~]$ ln -s /mnt/libqte-mt.so.3.3.8 libqte-mt.so.3.3
[ren@host ~]$ ln -s /mnt/libqte-mt.so.3.3.8 libqte-mt.so.3.3.8

2.4.4、設定PATH

[ren@host ~]$ export QTDIR=/opt/qte
[ren@host ~]$ export QTEDIR=/opt/qte
[ren@host ~]$ export LD_LIBRARY_PATH=$QTDIR/lib
[ren@host ~]$ export PATH=$QTDIR/bin:$PATH

2.4.5、設定滑鼠

[ren@host ~]$ cd /dev
[ren@host /dev]$ mknod psaux c 10 1
[ren@host /dev]$ ln -s psaux mouse


2.4.6、執行程式

[ren@host ~]$ /mnt/hello -qws









錯誤訊息:
1. 若有出現以下錯誤,請重新執行Build QT-Embedded步驟=>(把qte刪掉,再重編一次!!)

出現的錯誤:
../include/qstring.h: In member function 'ushort& QChar::unicode()':
../include/qstring.h:199: error: cannot bind packed field
'((QChar*)this)->QChar::ucs' to 'ushort&'

2. 注意:make的時候由於對於qt3的交叉編譯工具的gcc版本問題而導致提示如下錯誤:

../include/qstring.h: In member function 'ushort& QChar::unicode()':
../include/qstring.h:199: error: cannot bind packed field
'((QChar*)this)->QChar::ucs' to 'ushort&'

解決辦法:
打開src/tools/qglobal.h查看318-326行:
# if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
# define Q_PACKED __attribute__ ((packed))
# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4
# define Q_NO_PACKED_REFERENCE
# endif
# endif
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif

修改如下:
# if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
# define Q_PACKED __attribute__ ((packed))
# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4
# define Q_NO_PACKED_REFERENCE
# endif
+# if __GNUC__ == 4 && __GNUC_MINOR__ >= 0
+# define Q_NO_PACKED_POINTERS
+# endif
# endif
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif

打開src/include/qstring.h查看195-199行
ushort unicode() const { return ucs; }
#ifdef Q_NO_PACKED_REFERENCE
ushort &unicode() { return *(&ucs); }
#else
ushort &unicode() { return ucs; }
#endif

修改如下:
ushort unicode() const { return ucs; }
#ifdef Q_NO_PACKED_REFERENCE
ushort &unicode() { return *(&ucs); }
+#elif defined Q_NO_PACKED_POINTERS
+ ushort &unicode() { ushort& tmp = ucs; return tmp; }
#else
ushort &unicode() { return ucs; }
#endif

ps:+號表示修改的地方


參考資料:
QT/Embedded-3.3.8初步交叉編譯的完全整理
Qt/Embedded 2.3.10 到PXA270上的移植
Qt-embedded-3.2.3到PXA270上的移植
Porting QT/Embedded-3.3.6 on PXA270

2009年1月25日 星期日

透過指令修改ubuntu的網路設定

1. 設定IP
修改/etc/network/interfaces
若是要設定為DHCP以下為範例:

auto eth0
iface eth0 inet dhcp

若是固定ip則為

auto eth0
iface eth0 inet static
address 10.10.10.25
netmask 255.255.255.0
gateway 10.10.10.1

單網卡多個 IP(直接在網卡後,加上 ":n")

auto eth0:0
iface eth0:0 inet static
address [IP]
netmask [遮罩]
gateway [閘道]

auto eth0:1
iface eth0:1 inet static
address [IP]
netmask [遮罩]
gateway [閘道]

2. 設定DNS
修改/etc/resolv.conf
範例:

nameserver 168.95.1.1


3. 重新啟動network
[user@host ~]$ sudo /etc/init.d/networking restart

4. 設定 IP 位址
# ifconfig 介面 IP-位址 [broadcast 位址 ] [netmask ###]
$ sudo ifconfig eth0 163.26.183.1 broadcast 163.26.183.255 netmask 255.255.255.0

停止網路運作:停止網路介面ed0
$ sudo ifconfig eth0 down

啟動網路介面ed0
$ ifconfig eth0 up

5. 設定IP位址
ifconfig 語法為 :
ifconfig eth0 $IP netmask $NETMASK
如果你的 IP = 10.1.1.30
如果你的 NETMASK = 255.255.255.0
則你下的命令為
$ ifconfig eth0 10.1.1.30 netmask 255.255.255.0

route 設定 default gateway 語法為 :
route add default gw $GATEWAY
如果你的 GATEWAY = 10.1.1.1
則你下的命令為
$ route add default gw 10.1.1.1

請試試看以下命令 :
# 列出目前的網路卡設定狀態
$ ifconfig
# 秀出目前的 route table 表
$ route -n

[2009.04.12 補充]
6. 多張網卡ip設定
/etc/network/interface
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface

auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.20.146
netmask 255.255.255.0
network 192.168.20.0
broadcast 192.168.20.255
gateway 192.168.20.254

auto eth2
iface eth2 inet static
address 192.168.20.246
netmask 255.255.255.0
gateway 192.168.20.254


參考資料:
搞定 Ubuntu 底下的網路設定
測試網路介面 ifconfig
鳥哥
Linux 的網路連線設定

2009年1月23日 星期五

連動債 銀行逼受害人撤案和解 - 之事件感想

【記者林永富報導】「當初騙我們可100%保本,現在出事又要我們強迫簽和解書,卻只還兩成。」受到連動債之害的退休公務員宮先生,激動的控訴銀行的不當舉措說:「我的老本都沒有了,這個年還不知怎麼過!」。立委黃偉哲要求金管會、財政部等單位,對於全台十多萬連動債受害者多加協助,勿讓他們二次傷害。

黃偉哲今天為連動債受害者召開記者會,表示最近不斷接到反映,表示多家銀行最近處理連動債時,要求受害者要簽撤案同意書及所得同意書,才能較快處理。

黃偉哲不滿的表示,銀行尚未與受害者談好賠償就要求撤案,根本不合理;此外,為何賠償金明明是本金,銀行要逼簽為所得?還要扣稅,且課稅是政府的事,跟銀行有什麼關係?

台新銀行連動債自救會的鄭美瑄也指出,十幾年來都信任台新銀行理財專業知識,沒想到連動債讓她損失重大,當初理專說100%保本,且未說明這是連動債,很多老人家把退休金都投進來,根本不知買了什麼,而且因為年齡不符,被理專以兒女的名義擅自蓋章購買,如今全家都受害,有很多人甚至鬧到老來離婚家庭破碎,光是台新全省有八千多受害人。

七十多歲的宮先生則是退休金加上存款900多萬元,全投進新光連動債,而且還被理專勸說貸款,激動的說現在得了憂鬰症加上失眠,夫妻兩人不知如何過年。

此外,在一銀存款已有五十多年的蔡先生表示,最近銀行經理來到家裡談和解的事,可是只肯賠兩成,後來加到三成,「損失這麼大,銀行還要求和解撤案,實在很過分!」

對於受害者的訴求,主管機關金管會代表王允中科長表示,將全力促成銀行與客戶和解,過年後將開會討論,並籲請銀行應公平對待投資人。主管稅務的財政部賦稅署李雅晶科長指出,投資人本金收回和銀行的損害賠償不必課稅,投資人應可向銀行主張權益。
================================================================
所以,投資賺錢還是靠自己最實在,
就算是股票要交給別人去處理,也要了解一下大概的知識~
不能什麼都不知道,別人說100%就馬上把所有的錢全部加進去~

知識真的很重要!!
知識就是力量!!

嵌入式LINUX ---ARM交叉編譯toolchain的編譯 - 使用crosstool

Linux 系統下ARM Linux交叉編譯環境的建立目前流行的有三種途徑。途徑一是使用別人編譯好的開發工具鏈如cross-2.95.3.tar.bz2 arm-linux-gcc-3.3.2.tar.bz2 和arm-elf-tools-20030314.sh。其中arm-elf-tools 是專門用來編譯uclinux內核的。我們常用的是cross-cross-2.95.3,下載cross-2.95.3.tar.bz2 解壓後放到/usr/local/arm 目錄下設置下PATH即可使用這是最方便快捷的方式,缺點是cross-2.95.3 GCC版本是2.95.3,版本較低,不能編譯2.6版本的Linux內核和版本較高的u-boot。cross-2.95.3.tar.bz2一般是交叉編譯2.4的linux內核的,而arm-linux-gcc-3.3.2.tar.bz2一般是交叉編譯2.6版本的內核的。途徑二自己動手慢慢編譯,這個方法是最麻煩的,需要下載很多源文件,步驟多比較繁瑣,成功率不高,極其容易出錯,即使是經驗豐富程序員,自己編譯一套完整的工具鏈也是很難成功的。網上關於這種方法的帖子很多,有毅力有耐心和專研精神的朋友不妨試試。如果是單純為開發程序建立一個開發環境來說確實沒必要在這上面浪費過多時間了。另外一種建立交叉編譯工具的途徑是使用 crosstool-0.43來編譯,目前來說比較好的交叉編譯開發工具製作方法。下面是用crosstool-0.43製作交叉編譯工具鏈的過程。

【編譯環境】
1、Ubuntu 8.04.1
2、linux-2.6.24-19
3、gcc 4.2.4
4、target:linux-2.6.15.3

【編譯步驟】

crosstool是由美國人Dan Kegel(畢業於加(利福尼亞)州工學院)開發的一套可以自動編譯不同匹配版本gcc和glibc,並作測試的腳本程序。下載地址:

http://kegel.com/crosstool/crosstool-0.43.tar.gz

在http://kegel.com/crosstool/crosstool-0.43/buildlogs/可以看到各種CPU和GCC+Glibc版本,哪些已經編譯成功,哪些部分成功,哪些徹底失敗。



注意:系統中一般不使用超級用戶(root),需要超級用戶權限時候用sudo臨時性的提高用戶權限。
而編譯crosstool時候,強烈要求不使用root用戶,以免帶來災難性後果



具體實驗步驟:
0. 先確認有安裝以下套件bison,flex,build-essential,patch,libncurses5-dev
1. 如果你當前用戶是超級用戶(root)則請登錄成普通用戶(在我們的試驗中用user用戶)
2. 創建工作目錄並拷貝相關的軟件包

[user@host ~]$ mkdir -p $HOME/downloads

把需要用的工具包拷貝到downloads目錄中。用到的工具包如下(gcc-3.4.5-glibc-2.3.6.dat中有說明,如果您的linux環境可以上網,則後面用到的安裝腳本會自動下載需要的數

據包):
gcc-3.4.5.tar.gz
glibc-2.3.6.tar.gz
linux-2.6.15.3.tar.gz
crosstool-0.43.tar.gz
binutils-2.15.tar.gz
glibc-linuxthreads-2.3.3.tar.gz
linux-libc-headers-2.6.12.0.tar.bz2
gdb-6.5.tar.bz2

3. 解壓軟件包,並進入該目錄,查看重要的腳本文件。


[user@host ~]$ cd downloads
[user@host ~/downloads]$ tar -zxvf crosstool-0.43.tar.gz
[user@host ~/downloads]$ cd crosstool-0.43


在此目錄下可以看到有很多.sh腳本和.dat配置文件,每一個支持的處理器都有它所相應的腳本。假如選用demo-arm-softfloat.sh 就是建立目標為支持軟浮點的arm交叉編譯工具

鏈。

4. 修改要使用到的script:demo-arm-softfloat.sh
最終修改後的文件是這樣的:
demo-arm-softfloat.sh

#!/bin/sh
# This script has one line for each known working toolchain
# for this architecture. Uncomment the one you want.
# Generated by generate-demo.pl from buildlogs/all.dats.txt

set -ex
TARBALLS_DIR=$HOME/downloads // 表示下載的source code的存放目錄
RESULT_TOP=$HOME/opt/crosstool // 表示生成的cross tool的存放目錄
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++" // 表示將要生成的cross tool支持的語言
export GCC_LANGUAGES

# Really, you should do the mkdir before running this,
# and chown /opt/crosstool to yourself so you don't need to run as root.
mkdir -p $RESULT_TOP

#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.1.3.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-2.95.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.2.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest --gdb
# // 上面表示你要選cross tool的版本號!"#"起註釋功能!可以選擇一行!

echo Done.



demo-arm-softfloat.sh這個腳本在執行的時候,是執行的eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest這個批處理文件。

修改gcc-3.4.5-glibc-2.3.6.dat成以下的內容

BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.8 // 由於cross-compiler是編譯2.6.8的kernel,那麼修改LINUX_DIR=linux-2.6.8,因為,我們要用這一個

cross-compiler去編譯pxa270的linux-kernel,且其kernel為linux-2.6.8

GDB_DIR=gdb-6.5 // 另外,我們需要增加GDB的調試功能,在LINUX_DIR這一行後面增加一行
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6



5. 修改arm-softfloat.dat

KERNELCONFIG=`pwd`/arm.config
TARGET=arm-softfloat-linux-gnu
TARGET_CFLAGS="-O"
GCC_EXTRA_CONFIG="--with-float=soft"
GLIBC_EXTRA_CONFIG="--without-fp"


6. 就可以執行編譯腳本了。

[user@host ~]$ ./ demo-arm-softfloat.sh

約1個多小時後,編譯完畢。
註: 如果編譯過程遇到問題,在改正問題前,請在eval `cat arm-softfloat.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest --gdb末尾處加--nounpack表示不重新解壓

安裝包,目的是讓安裝過程繼續進行,而不覆蓋掉以前的編譯結果。



7. 在利用它編譯kernel之前還要設置環境變量,

[user@host ~]$ export PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux-gnu/bin:$PATH
[user@host ~]$ source /etc/profile

以上是在當前終端上設置環境變量,如果要添加到系統環境變量中,請在/etc/profile中export PATH之前添加如下一行:

PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux-gnu/bin:$PATH
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

在終端窗口中執行:

[user@host ~]$ source /etc/profile

下面就可以用這個交叉編譯器來編譯application和kernel了。



錯誤訊息:

錯誤一:

/home/liuwei/crosstool-0.43/build/arm-arm9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:1:1: missing terminating " character

/home/liuwei/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:2:1: missing terminating " character

/home/liuwei/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:3:1: missing terminating " character

/home/liuwei/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu/version-info.h:4:1: missing terminating " character

make[2]: *** [/home/liuwei/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-glibc/csu/version.o] 錯誤 1

make[2]: Leaving directory `/home/liuwei/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/glibc-2.3.6/csu'

make[1]: *** [csu/subdir_lib] 錯誤 2

make[1]: Leaving directory `/home/liuwei/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/glibc-2.3.6'

make: *** [lib] 錯誤 2


系統在編譯生成version.o 時候發現 version-info.h 文件有錯誤

version-info.h 位於

$HOME/crosstool-0.43/build/arm-9tdmi-linux-gnu/gcc-4.1.1-glibc-2.3.2/build-glibc/csu

打開後內容如下:

"Compiled on a Linux >>2.6.22-14-generic<< system on 2008-04-12.

"

"Available extensions:

"

" GNU libio by Per Bothner\n"

" crypt add-on version 2.1 by Michael Glad and others\n"

" linuxthreads-0.10 by Xavier Leroy\n"

" BIND-8.2.3-T5B\n"

" libthread_db work sponsored by Alpha Processor Inc\n"

" NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk\n"


錯誤內容說明:第1行 2行 3行 4行缺少符號 「 」」。

正常內容應為:

"Compiled on a Linux >>2.6.22-14-generic<< system on 2008-04-12."

"Available extensions:"

" GNU libio by Per Bothner\n"

" crypt add-on version 2.1 by Michael Glad and others\n"

" linuxthreads-0.10 by Xavier Leroy\n"

" BIND-8.2.3-T5B\n"

" libthread_db work sponsored by Alpha Processor Inc\n"

" NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk\n"

version-info.h 是由 downloads目錄下的glibc-2.3.2 源文件 glibc-2.3.2/csu/ 目錄下的Makefile 執行後生成故錯誤可能發生在Makefile中。

修改方法:

解壓 glibc-2.3.2.tar.bz2 找到glibc-2.3.2/csu 目錄下的Makefile 按如下修改


文件末尾有2處echo

echo "\"Compiled on a $$os $$version system" \

"on `date +%Y-%m-%d`.\\n\"" ;; \

改為:

echo "\"Compiled on a $$os $$version system" \

"on `date +%Y-%m-%d`.\\\\n\"" ;; \


echo "\"Available extensions:\\n\"";

改為:

echo "\"Available extensions:\\\\n\"" \

保存並重新壓縮為glibc-2.3.2.tar.bz2 覆蓋原來downloads 目錄下的glibc-2.3.2.tar.bz2,轉到crosstool-0.43目錄下從新執行 demo-arm9tdmi.sh 腳本文件。


錯誤二:

提示:configure: error: installation or configuration problem: C compiler cannot create executables.

原因是因為沒有安裝:libc6-dev,運行: sudo apt-get install libc6-dev安裝

錯誤三:
出現的結果是:
configure: error:
*** These critical programs are missing or too old: gcc
*** Check the INSTALL file for required versions.

原因是因為ubuntu8.04自帶的gcc版本太新了,不必卸載系統自帶的gcc4.2.4。去下載個gcc4.1的版本安裝一下。
然後進行:

[user@host ~]$ sudo rm /usr/bin/gcc (刪除gcc,它只是個連接文件)
[user@host ~]$ sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc (建立GCC到gcc-4.1的連接)


錯誤四:
In file included from version.c:33:
/home/skorpio/crosstool-0.43/build/powerpc-405-linux-gnu/gcc-4.1.0-glibc-2.3.6/build-glibc/csu/version-info.h:2:1: missing terminating " character
/home/skorpio/crosstool-0.43/build/powerpc-405-linux-gnu/gcc-4.1.0-glibc-2.3.6/build-glibc/csu/version-info.h:3:1: missing terminating " character
make[2]: *** [/home/skorpio/crosstool-0.43/build/powerpc-405-linux-gnu/gcc-4.1.0-glibc-2.3.6/build-glibc/csu/version.o] Error 1
make[2]: Leaving directory `/home/skorpio/crosstool-0.43/build/powerpc-405-linux-gnu/gcc-4.1.0-glibc-2.3.6/glibc-2.3.6/csu'
make[1]: *** [csu/subdir_lib] Error 2
make[1]: Leaving directory `/home/skorpio/crosstool-0.43/build/powerpc-405-linux-gnu/gcc-4.1.0-glibc-2.3.6/glibc-2.3.6'
make: *** [lib] Error 2

原來是ubuntu這傢伙搞的鬼

In Ubuntu 6.10, the default system shell, /bin/sh, was changed to dash (the Debian Almquist Shell); previously it had been bash (the GNU Bourne-Again Shell). The same change will affect users of Ubuntu 6.06 LTS upgrading directly to Ubuntu 8.04 LTS. This document explains this change and what you should do if you encounter problems.

The default login shell remains bash.

(From UBUNTU WIKI https://wiki.ubuntu.com/DashAsBinSh)

為了確認你可以在命令行下執行

[user@host ~]$ sudo rm /bin/sh (因為是soft line,所以可以直接刪掉)
[user@host ~]$ sudo ln -s /bin/bash /bin/sh


用crosstool-0.43在Ubuntu7.10下建立ARM linux交叉編譯環境
ubuntu 8.04中編譯ARM交叉平台的一點心得!
內核編譯之二:交叉編譯工具
在ubuntu下使用crosstool製作交叉編譯工具
在 Ubuntu 8.10 64bit version下用 Crosstool-0.43 建立 ARM-Linux 交叉編譯環境
Crosstool variables
在Fedora 下建立 ARM-Linux 交叉編譯環境

2009年1月22日 星期四

MOD - Messenger On-the-Drive

最近改論文的新方向~
不知道會不會太晚~

老師要我做的計畫,先trace學長的程式碼吧~
找了好久,終於找到學長的程式碼。

一開始Make有出現問題,最後ok了~
學長好像是參考I Hear U的open source去修改的~

所以,我也一同安裝I Hear U來看看~

1. 安裝MOD
還好裡面INSTALL檔案有說要安裝哪幾個套件,另外,要使用qmake;因為我的電腦裡面有qt3與qt4,所以,qmake要用qmake-qt3來取代

[user@host ~]$ qmake-qt3;make


[2009.04.15 補充]
這裡要注意的一點是,以上必需在Ubuntu 7.10之前的版本才可以運作,到了Ubuntu 8.04之後編譯就會有問題。
就在昨天,把我本來在Ubuntu 8.04運行sctp小程式拿到Ubuntu 7.10上跑,發現出現了錯誤訊息,耶~它說沒有定義SCTP_ADAPTATION_INDICATION這一個巨集。
噹噹,這個時候我就知道了,在7.10以前(包含7.10)是用SCTP_ADAPTATION_INDICATION而在8.04之後則是用SCTP_ADAPTION_INDICATION來表示。
這個時候若原始碼想要在8.04以上的版本跑,就必需要把SCTP_ADAPTION_INDICATION,替換成SCTP_ADAPTATION_INDICATION
sctp_adaption_layer_event改為sctp_adaptation_layer_event
因為,程式碼很多,有一個一勞永逸的指令
$ find drta-stable-v.1.0 -type f | xargs sed 's/SCTP_ADAPTION_INDICATION/SCTP_ADAPTATION_INDICATION/g' -i
$ find drta-stable-v.1.0 -type f | xargs sed 's/sctp_adaption_layer_event/sctp_adaptation_layer_event/g' -i


可以參考find,xargs,sed的用法

2. 安裝I Hear U
會出現以下幾個問題,Qt驗証會不過,因為,我Qt預設抓到的是Qt4,所以,在configure時,要用以下指令

[user@host ~]$ ./configure --with-Qt-dir=/usr/share/qt3

這樣就會過了,但是,要安裝I Hear U必需安裝ogg套件,直接到網路上抓吧~


[user@host ~]$ ./configure;make;sudo make install

這樣就完成安裝ogg了~再來就是安裝I Hear U
也是同樣的上面的指令啦~
完成~直接打ihu就可以執行這一個程式啦~

2009年1月21日 星期三

QtNetwork: No such file or directory

要準備跑Qt的其中一個範例程式,socket結果出現以下問題~
QtNetwork: No such file or directory

原來要在.pro檔案中加以下內容
Configuring the Build Process

Applications that use Qt's networking classes need to be configured to be built against the QtNetwork module. The following declaration in a qmake project file ensures that an application is compiled and linked appropriately:


QT += network

2009年1月20日 星期二

在ARM上執行Qt程式

耶~只是以後可能會用到,
現在先記錄下來~

參考網址:
Qtopia Core 4 Hello World 終搞定

2009年1月19日 星期一

建立者 & 談判者?!

在msn上有一個網址:測試網址


您是一個創立者/談判者

您是一個極好的朋友和工作夥伴. 您總是十分冷靜並有趣, 有奉獻精神並是個可信賴的人. 幾乎所有人都喜歡您.

您有時比較傳統. 家庭, 家人, 工作和社交都是您生活的重心. 您對您所在的社交圈很有歸屬感, 同時您對身邊的每個人都有一份責任感. 對所愛的人您會盡全力保護.

您很有管理技巧. 您富有同情心並有合作精神; 您工作努力並很有常識. 同時您也是個非常有耐心的人. 因此您可以比他人更容易完成細節繁瑣的工作.

您喜歡建立社交關係. 同時您懂得如何找到問題的解決方法讓所有人滿意.

您謹慎但不膽怯. 您很有團隊精神. 因此您總是在尋找方法讓世界更加安定.
您主要的和潛在的性格類型

* 您的主要性格類型 = 建立者
* 您的潛在性格類型 = 談判者


探索者
-探索者 - 15%
談判者
-談判者 - 30%
建立者
-建立者 - 32%
領導者
-領導者 - 24%

2009年1月14日 星期三

用gcc 自製 Library

Library可分成三種,static、shared與dynamically loaded。

1. Static libraries

Static 程式庫用於靜態連結,簡單講是把一堆object檔用ar(archiver)包裝集合起來,檔名以 `.a' 結尾。優點是執行效能通常會比後兩者快,而且因為是靜態連結,所以不易發生執行時找不到library或版本錯置而無法執行的問題。缺點則是檔案較大,維護度較低;例如library如果發現bug需要更新,那麼就必須重新連結執行檔。

1.1 編譯

編譯方式很簡單,先例用 `-c' 編出 object 檔,再用 ar 包起來即可。

hello.c

#include <stdio.h>
void hello(){ printf("Hello "); }

world.c

#include <stdio.h>
void world(){ printf("world."); }

mylib.h

void hello();
void world();




/* 編出 hello.o 與 world.o */
[user@host ~]$ gcc -c hello.c world.c
/* 包成 limylib.a */
[user@host ~]$ ar rcs libmylib.a hello.o world.o


這樣就可以建出一個檔名為 libmylib.a 的檔。輸出的檔名其實沒有硬性規定,但如果想要配合 gcc 的 '-l' 參數來連結,一定要以 `lib' 開頭,中間是你要的library名稱,然後緊接著 `.a' 結尾。

1.2 使用
main.c

#include "mylib.h"
int main() {
  hello();
  world();
}

使用上就像與一般的 object 檔連結沒有差別。

[user@host ~]$ gcc main.c libmylib.a


也可以配合 gcc 的 `-l' 參數使用

[user@host ~]$ gcc main.c -L. -lmylib


`-Ldir' 參數用來指定要搜尋程式庫的目錄,`.' 表示搜尋現在所在的目錄。
通常預設會搜 /usr/lib 或 /lib 等目錄。
`-llibrary' 參數用來指定要連結的程式庫 ,'mylib' 表示要與mylib進行連結,他會搜尋library名稱前加`lib'後接`.a'的檔案來連結。

[user@host ~]$ ./a.out
Hello world.



2. Shared libraries

Shared library 會在程式執行起始時才被自動載入。因為程式庫與執行檔是分離的,所以維護彈性較好。有兩點要注意,shared library是在程式起始時就要被載入,而不是執行中用到才載入,而且在連結階段需要有該程式庫才能進行連結。

首先有一些名詞要弄懂,soname、real name與linker name。

soname 用來表示是一個特定 library 的名稱,像是 libmylib.so.1 。
前面以 `lib' 開頭,接著是該 library 的名稱,然後是 `.so' ,接著是版號,用來表名他的介面;如果介面改變時,就會增加版號來維護相容度。

real name 是實際放有library程式的檔案名稱,後面會再加上 minor 版號與release 版號,像是 libmylib.so.1.0.0 。

一般來說,版號的改變規則是(印象中在 APress-Difinitive Guide to GCC中有提到,但目前手邊沒這本書),最尾碼的release版號用於程式內容的修正,介面完全沒有改變。中間的minor用於有新增加介面,但相舊介面沒改變,所以與舊版本相容。最前面的version版號用於原介面有移除或改變,與舊版不相容時。

linker name是用於連結時的名稱,是不含版號的 soname ,如: libmylib.so。
通常 linker name與 real name是用 ln 指到對應的 real name ,用來提供彈性與維護性。
2.1 編譯
shared library的製作過程較複雜。

[user@host ~]$ gcc -c -fPIC hello.c world.c


編譯時要加上 -fPIC 用來產生 position-independent code。也可以用 -fpic參數。 (不太清楚差異,只知道 -fPIC 較通用於不同平台,但產生的code較大,而且編譯速度較慢)。


[user@host ~]$ gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0.0 hello.o world.o


-shared 表示要編譯成 shared library
-Wl 用於參遞參數給linker,因此-soname與libmylib.so.1會被傳給linker處理。
-soname用來指名 soname 為 limylib.so.1
library會被輸出成libmylib.so.1.0.0 (也就是real name)

若不指定 soname 的話,在編譯結連後的執行檔會以連時的library檔名為soname,並載入他。否則是載入soname指定的library檔案。

可以利用 objdump 來看 library 的 soname。


[user@host ~]$ objdump -p libmylib.so | grep SONAME

SONAME libmylib.so.1

若不指名-soname參數的話,則library不會有這個欄位資料。

在編譯後再用 ln 來建立 soname 與 linker name 兩個檔案。

[user@host ~]$ ln -s libmylib.so.1.0.0 libmylib.so
[user@host ~]$ ln -s libmylib.so.1.0.0 libmylib.so.1


2.2 使用

與使用 static library 同。

[user@host ~]$ gcc main.c libmylib.so

以上直接指定與 libmylib.so 連結。

或用

[user@host ~]$ gcc main.c -L. -lmylib

linker會搜尋 libmylib.so 來進行連結。
如果目錄下同時有static與shared library的話,會以shared為主。
使用 -static 參數可以避免使用shared連結。

[user@host ~]$ gcc main.c -static -L. -lmylib

此時可以用 ldd 看編譯出的執行檔與shared程式庫的相依性
[user@host ~]$ ldd a.out
linux-gate.so.1 => (0xffffe000)
libmylib.so.1 => not found
libc.so.6 => /lib/libc.so.6 (0xb7dd6000)
/lib/ld-linux.so.2 (0xb7f07000)
輸出結果顯示出該執行檔需要 libmylib.so.1 這個shared library。
會顯示 not found 因為沒指定該library所在的目錄,所找不到該library。

因為編譯時有指定-soname參數為 libmylib.so.1 的關係,所以該執行檔會
載入libmylib.so.1。否則以libmylib.so連結,執行檔則會變成要求載入
libmylib.so

[user@host ~]$ ./a.out

./a.out: error while loading shared libraries: libmylib.so.1:
cannot open shared object file: No such file or directory

因為找不到 libmylib.so.1 所以無法執行程式。
有幾個方式可以處理。

a. 把 libmylib.so.1 安裝到系統的library目錄,如/usr/lib下
b. 設定 /etc/ld.so.conf ,加入一個新的library搜尋目錄,並執行ldconfig更新快取
c. 設定 LD_LIBRARY_PATH 環境變數來搜尋library
這個例子是加入目前的目錄來搜尋要載作的library
[user@host ~]$ LD_LIBRARY_PATH=. ;./a.out
Hello world.


3. Dynamically loaded libraries

Dynamicaaly loaded libraries 才是像 windows 所用的 DLL ,在使用到
時才載入,編譯連結時不需要相關的library。動態載入庫常被用於像plug-ins的應用。

3.1 使用方式
動態載入是透過一套 dl function來處理。

#include <dlfcn.h>
void *dlopen(const char *filename, int flag);
開啟載入 filename 指定的 library。
void *dlsym(void *handle, const char *symbol);
取得 symbol 指定的symbol name在library被載入的記憶體位址。
int dlclose(void *handle);
關閉dlopen開啟的handle。
char *dlerror(void);
傳回最近所發生的錯誤訊息。

dltest.c

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main() {
  void *handle;
  void (*f)();
  char *error;

  /* 開啟之前所撰寫的 libmylib.so 程式庫 */
  handle = dlopen("./libmylib.so", RTLD_LAZY);
  if( !handle ) {
    fputs( dlerror(), stderr);
    exit(1);
  }

  /* 取得 hello function 的 address */
  f = dlsym(handle, "hello");
  if(( error=dlerror())!=NULL) {
    fputs(error, stderr);
    exit(1);
  }
  /* 呼叫該 function */
  f();
  dlclose(handle);
}


編譯時要加上 -ldl 參數來與 dl library 連結
[user@host ~]$ gcc dltest.c -ldl
結果會印出 Hello 字串
[user@host ~]$ ./a.out
Hello

關於dl的詳細內容請參閱 man dlopen

[2009.11.29 補充]
Static link:

Compiler時,library加入程式碼
優:快
劣:佔空間

Dynamic Link:

Compiler時,不將library加入程式碼,執行程式的時後,再將 library載入程式碼,若有多個程式共用同一個library,只需載一個library進memory
優:省空間
劣:慢

Dynamic Load:

Compiler時,不將library加入程式碼,執行程式時,遇到函式,才將library載入,用完後再free出空間
優:更省空間
劣:更慢

--
參考資料:

Creating a shared and static library with the gnu compiler [gcc]

Program Library HOWTO

APress - Definitive Guide to GCC

轉錄至ptt的LinuxDev版
static link & Dynamic Link & Load

2009年1月12日 星期一

DSRC (Dedicated Short Range Communications)

DSRC 泛指所有短距離的無線通訊技術包含著不同的技術以及不同的規格,而用於交通上的5.9GHz DSRC 在MAC 與PHY 的底層協定為IEEE 的802.11p。

IEEE 802.11p(又稱WAVE;Wireless Access in the Vehicular Environment)是一個由IEEE 802.11標準擴充的通訊協定。
這個通訊協定主要用在車用電子的無線通訊上。
它設定上是從IEEE 802.11來擴充延伸,來符合智慧型運輸系統(Intelligent Transportation Systems,ITS)的相關應用。
應用的層面包括高速率的車輛之間以及車輛與5.9GHz(5.85-5.925GHz)波段的標準ITS路邊基礎設施之間的資料數據交換。
IEEE 1609標準則是以IEEE 802.11p通訊協定為基礎的高層標準。
802.11p將被用在車載通訊(或稱專用短距離通訊,Dedicated Short Range Communications,DSRC)系統中,這是一個美國交通部(U.S. Department of Transportation)基於歐洲針對車輛的通訊網絡,特別是電子道路收費系統、車輛安全服務與車上的商業交易系統等等的應用而設計中長距繼續傳播空氣接口(Continuous Air interfaces - Long and Medium Range,CALM)系統的計劃。
該計劃最終的願景是建立一個允許車輛與路邊無線接取器或是其他車輛間的通訊的全國性網絡。
這項工作是建立在其前導的 ASTM E2213-03計劃的基礎上。

因此,DSRC的下層(MAC-Layer,MAC-extension,PHY-Layer)是IEEE 802.11p,而上層(Application Layer)是以IEEE 1609為標準

參考資料:
IEEE 802.11p簡介以及802.11標準家族最新進展
IEEE 802.11p

2009年1月11日 星期日

pietty and putty

這兩個是在連往Linux與Unix常用的軟體,
而pietty的中文支援比較好,所以,我都用pietty來連Linux

似乎打字的時候不能用鍵盤右邊的數字
答:Terminal → Features → Disable application keypad mode

如何讓pietty顯示中文
答:先透過pietty連到Linux之後
工具列上的「選項」→「字型」中的字型選細明體、字集選CHINESE_BIG5。
「選項」→「字元編碼」→Unicode


[2012.04.26 補充]
記錄putty的輸出


[2012.05.17 補充]
若每一次記錄的檔名都是putty.log的話,
只會留下最後一比記錄檔,
其實,裡面已經有功能,可以讓使用都依目前的時間產生檔名,
&Y代表目前的年份
&M代表目前的月份
&D代表目前的日期
&T代表目前的時間
&H代表目前主機的名稱
例: &Y&M&D&T.log
輸出檔會是20140508205138.log
年月日時分秒
的格式。

[2014.05.08 補充]
當我要傳送F1~F5時,
發現沒有辦法傳送出去,
設定完Terminal→The Function keys and keypad
設定成Xterm R6或VT100+就可以正常送出key了。

StarUML - 配置版面

其實類別圖不應該是第一個建立的,不過,因為現在為了熟悉這一個軟體,而自己有建立好的類別,所以,先由類別圖直接來試用啦~

在建立完類別圖之後,有一些類別很多成員(attribute,function),會占滿整個版面,這個時候要拉關係,會很難拉耶~

所以,此軟體提供了一些功能,可以先讓類別的所有成員,先不顯示,那整個體積就變的很小啦~

suppress attributes:可以把所有的attribute都先隱藏
suppress functions:可以把所有的function都隱藏

Layout Diagram:可以排列所有的圖示
Auto Resize:可以依字體大小改變圖示的大小
Show Operation Signature:顯示所有的function的參數(包含輸入參數與return參數)
還有其它很好用的功能喔~都在同一列,可以去試試看~

原本這麼大~


變成這麼小~

StarUML - 建立一個類別圖

這裡有一個例子:

class DiagramItem:public QGraphicsPolygonItem {
public:
  enum {Type = UserType + 15}; // 匿名列舉
  enum DiagramType {Step,Conditional,StartEnd,Io}; // 列舉
  DiagramItem(DiagramType diagramType,QMenu *contextMenu,QGraphicsItem *parent=0,QGraphicsScene *scene=0); // 建構子
  inline int type() const; // const function且inline function且有回傳值
  QVariant itemChange(GraphicsItemChange change, const QVariant &value); // call by reference
private:
  int x;
};


前置作業:
先建立兩個類別:QGraphicsPolygonItem與其子類別DiagramItem
按左邊Generalization按紐,並由DiagramItem拉線到QGraphicsPolygonItem

一、建立第一個匿名列舉
1.對DiagramItem按右鍵Add→Enumeration,必需在右邊的Mode explorer作業,不建立名稱,並且再對它按右鍵,Add→Enumeration Literal加入Type = UserType + 15

二、建立一個名為DiagramType列舉
1.對DiagramItem按右鍵Add→Enumeration,必需在右邊的Mode explorer作業,建立的名稱為DiagramType,並且再對它按右鍵,Add→Enumeration Literal,加入四個Enumeration Literal,名稱分別為Step,Conditional,StartEnd,Io

三、建立建構子
1. 建立一個名為DiagramItem的function
2. 設定Stereotype為create:表示建構子
3. 設定參數
  (1). 對建構子按右鍵Add→Parameter, 新增一個Name為diagramType、Type為DiagramType
  (2). 對建構子按右鍵Add→Parameter, 新增一個Name為diagramType、Type為DiagramType
  (3). 對建構子按右鍵Add→Parameter, 新增一個Name為*parent、Type為QGraphicsItem、初始值為0
  (4). 對建構子按右鍵Add→Parameter, 新增一個Name為*scene、Type為QGraphicsScene、初始值為0

四、建立一個inline function且回傳值為int,又是const的function
1. 建立一個名為type的function
2. 對function按右鍵Add→Parameter, 新增一個Name為空字串、Type為int、DirectionKind為RETURN
3. 對function按右鍵Add→Tagged Values,CPP標籤下接CppConst勾選CppConst、CppMemberFunction的CppInline勾選

五、建立一個名為itemChange的function,回傳值為QVariable,參數有用到conference
1. 建立一個名為itemChange的function
2. 對function按右鍵Add→Parameter, 新增一個Name為空字串、Type為QVariable、DirectionKind為RETURN
3. 對function按右鍵Add→Parameter, 新增一個Name為change、Type為GraphicsItemChange
4. 對function按右鍵Add→Parameter, 新增一個Name為&value、Type為QVariant、對此參數按右鍵Add→Tagged Values,CPP標籤下接CppConst勾選CppConst

六、建立一個private的int型別的變數x
1. 建立一個名為x的Attribute
2. Type為int且Visiability為private

七、接下來要產生C++程式,對要產生圖型的class圖按右鍵:C++→Generate Code,然後,一直下一步,就可以產生沒有實作內容的原始碼啦~

StarUML - 套用C++ profile

經過這兩天的使用StarUML,覺得還不錯用~
但是,還是覺得畫UML圖很麻煩,但是,我深信,熟悉這個對了解架構與找出問題一定有很大的幫助~打算用這裡記錄我使用StarUML的過程~

因為,我是用C++/Qt4來寫程式,所以,要把C++ profile套用進來~

主要有兩個步驟:
一、加入C++ profile
Model→Profile
把C++ Profile加到右邊的框框

二、為了讓畫面更清爽,把Java與C#移掉
Tools→Add-In Manager
把Java與C#勾掉

筆電電池保養大法 延長電池使用壽命

相信有許多筆電的使用者,都有電池使用了一段時間,卻發現耗電的速度越來越快,但電池又屬於消耗品,原廠的公司無法提供長時間的保固,買一顆原廠電池會讓荷包大大的失血,選擇較便宜的副廠電池,又怕品質不夠穩定,因此要延長筆電電池的壽命,成為了最重要的課題。筆電的電池一般採用鋰電池,鋰電池的壽命約可作500次完全充放電,即電量從100%放電到最低電量如5%再充電到100%,或從最低電量充到100%再放電到最低電量,但要注意,一旦電池放電超過最低電量(過度放電),即電池電壓值低於3V左右,電池保護電路會把電池鎖住,不讓電池再次進行充電。

筆電裝上電池並外接電源時,無論開機或關機,都會先對電池充電,一旦充電電路偵測到電量達100%,會切換為間隔一段時間,以微電流且極短的時間對電池充電,使電池維持100%電量;若長時間不移動筆電,建議將電池電量約50%時拆下,保留50%是避免長時間沒使用電池造成電量流失超過最低電壓,使電池內控制元件以為電池已損壞,禁止電池再充電。

如果電池使用到一半,可以直接接上電源讓電池充電,因為鋰電池幾乎沒有記憶效應,不過還是建議每個月做一次完全充放電,讓鋰分子保持活性,注意充放電不是延長電池壽命的方法,如無必要不要常做此動作;攜帶筆電外出時,若至有插座的地點,如會議室、咖啡廳…等,盡可能帶變壓器使用外接電源,若電池電力未完全用完,可直接用電源對電池充電;如果你很少用電池操作筆電(放電),可藉此機會將電池放電至系統警告電量不足再接電源充電,做一次充放電。

其實筆電電池的保養方法並不難,只要在使用的時候注意一些小細節,雖然沒有辦法常保如新,但也能延長其使用壽命,千萬不要病急亂投醫,才不會因小失大!

2009年1月10日 星期六

Windows Installer CleanUp 公用程式

此軟體是微軟出的,可以協助移除安裝在windows下的軟體
網址

UML - 工具

StarUML
看起來功能還不錯,也不會像virtual visio看起來那麼複雜,免費的,但是,只能在windows下執行

ArgoUML
用java寫成的
所以可以跨平台~還在嘗試中~不過,好像有空間的限制,若太多資料,要買的

bouml
也有各式平台,但是,中文好像有問題。

UML相關網址:
UML blog
鳥毅的Blog

2009年1月9日 星期五

安裝NCTU-NS

現在正在研究如何在Fedora下安裝NCTU-NS-5…
其實本來我學linux就是由redhat開始學的,
但是,因為ubuntu特效太讚了,加上實驗室主要是用ubuntu,所以,研究所開始一直到現在就是一直用Ubuntu。

因為是第一次安裝NCTU-NS,而它的開發環境是Fedora,還是按照它的開發環境去安裝吧~

目前正在測,之後,再把過程寫出來吧~

完成了~
其實還蠻簡單的啦~

先到NCTUNS主網站下載主檔案,而我是直接用這一個下載點

那就解壓縮吧~

[user@host ~]$ tar -zxvf NCTUns-allinone-linux-2.6.25.9-f9.20080919-3.tar.gz


進入解出來的資料夾

[user@host ~/NCTUns-5.0]$ cd NCTUns-5.0


然後,就會看到一個install.sh,這是NCTUns團隊針對在fedora下寫的script。要用root的權限執行它
在安裝之前,為了要避免以下錯誤:
** **
** Install and enable rsh-server for command-console **
** **
STATE: install Xinetd Internet services daemon
STATE: The xinetd daemon is already installed.
STATE: install rsh server
STATE: The rsh server is already installed.
STATE: enable rlogin and rsh
ERROR: /etc/xinetd.d/rlogin do not exist!
ERROR: Please check if you have installed the rsh server

則要安裝rsh-server,另外要記得安裝gcc與g++喔~
在fedora中要使用普通使用者要使用sudo,必需使用透過root去設定visudo,請參考鳥哥的私房菜

[user@host ~/NCTUns-5.0]$ sudo yum install -y rsh-server gcc g++


完成之後,就正式開始安裝啦~

[user@host ~/NCTUns-5.0]$ sudo ./install.sh


就一直按Enter就ok啦~

安裝完成後,就重新開機就好啦~

而NCTSns的所有執行檔都在/usr/local/nctuns/bin下,
要執行NCTUns則必需到/usr/local/nctuns/bin中再執行以下指令

[user@host /usr/local/nctuns/bin]$ ./nctunsclient


參考資料:
在Ubuntu Linux底下安裝NCTUns
NCTUns論譠

2009年1月7日 星期三

在Ubuntu下安裝字典

記錄如何在Ubuntu下安裝字典。

[user@host ~]$ apt-cache search stardict

會顯示
sdcv - StarDict Console Version
stardict - International dictionary for GNOME 2
stardict-common - International dictionary - data files
stardict-gtk - International dictionary written in GTK+ 2.x
stardict-tools - The dictionary conversion tools of stardict
stardict-xmlittre - French Littré dictionary for stardict
stardict-english-czech - Stardict package for English-Czech dictionary

可以同時安裝多個安裝檔

[user@host ~]$ sudo apt-get install stardict*


安裝好之後就可以在 應用程式->附屬應用程式->星際譯王

但是安裝好之後沒有任何字典檔,所以請自行到網路上下載

*.tar.bz2

下載軟體後 請把他解壓縮到 /usr/share/stardict/dic/


[user@host ~]$ tar -jxvf *.tar.bz2


解壓縮的目錄應該有 *.dz *.idx *.ifo 這3個檔案

重新啟動該軟體 就可以使用了

參考資料:
[Ubuntu] 安裝 StarDict 星際譯王 以及 字典檔