2008/11/29

[軟體] 用 Linux Kernel 的 Kbuild 來建立一個選單

在 Linux 上面要 make kernel 並不是一件很簡單的事情,常常我們都要調查一堆的選項才能很順利的「開始」 config 核心,然而這只是麻煩的開頭而已,接著下來,我們就要對數以千計的選項勾選,打上 yes or no , include or module 的選擇。這些個選擇題如果是在 console 底下用一個一個問的話,大概可以問上一兩個小時沒有問題,還好 Linux Kernel 的開發小組搞了一個 KBuild 的小玩意兒來玩,讓我們可以很快又很簡單的像下面的圖片裡面一樣,快速達成 config 的目標。



不過,這麼好玩的東西,怎麼會只能在 Kernel 底下使用呢?當然也就有人開始想要把這個小玩意兒套用在別的工作上面,像是一堆模組在 console 底下可以套用選擇的時候,如果有這樣的東西可以拿出來玩,該有多好?

筆者接著要介紹的,就是 Kbuild 的一個簡單的範例:
KBuild 需要的部份主要有三個部份:
* script/ # 主要軟體
* Config.in # 設定檔
* Makefile # make 文件檔

Makefile 的部份:
KCONFIG := script/kconfig
CONFIG_IN := Config.in

all: .config

.config:
$(MAKE) menuconfig

$(KCONFIG)/mconf:
$(MAKE) -C $(KCONFIG)

menuconfig: $(KCONFIG)/mconf
@$(KCONFIG)/mconf $(CONFIG_IN)


Config.in:
# General Options
menu "General Options"

config DL_DIR
string "Packages Directory"
default "$(PWD)/dl"
endmenu


再來就是把 kernel 裡面的 script 目錄打包過來就都到齊了。

config 模組再來要使用,就可以很簡單的用 make 來解決。

[Linux] Gnome 底下修改「位置」的名稱

四元 的部落格裡面有看到一點修改位置的改法,實際上用不到登入登出,在 Ubuntu-tweak 裡面也有可以修改的地方,不過還是不需要用到專門裝個軟體來處理這件事情。

實際上只要:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
unset LC_ALL

把 locale 換成 en_US 或其它英文語系,再執行:
xdg-user-dirs-gtk-update
就可以了。

這個位置其實也是 nautilus 裡面的書籤,實體位置放在:
$HOME/.gtk-bookmarks
長像是:
file:///home/anton/Documents
file:///home/anton/Music
file:///home/anton/Pictures
file:///home/anton/Videos
file:///home/anton/Desktop/Doc Doc

2008/11/27

[Linux] Ubuntu 底下編譯 ebtables 失敗

因為工作上的需求,所以要修改 ebtables ,就自已先用 apt-get source 下載 ebtables 的 source 下來 compile 。結果在 ebtables 還沒有修改的情況下就不能 compile 。

錯誤訊息是:

  /usr/bin/ld: ebtables: hidden symbol `__stack_chk_fail_local' in /usr/lib/libc_nonshared.a(stack_chk_fail_local.oS) is referenced by DSO
  /usr/bin/ld: final link failed: Nonrepresentable section on output
  collect2: ld returned 1 exit status


這邊 有看到解答:
在 gcc/g++ compile code 的時候沒有加上 -shared flag ,所以後來的 libebtc.so 會出問題。

另外 ubuntu 上面 init.d 也不會是在 /etc/rc.d/ 底下, config 的部份也有搞錯。
這邊包的很馬虎。(小抱怨一下)
--
附上可以 compile 的 Makefile patch:
make 時請下 make LD=gcc


--- Makefile.orig 2008-11-28 15:29:24.000000000 +0800
+++ Makefile 2008-11-28 15:28:44.000000000 +0800
@@ -11,8 +11,8 @@
MANDIR:=/usr/local/man
BINDIR:=/usr/local/sbin
ETCDIR:=/etc
-INITDIR:=/etc/rc.d/init.d
-SYSCONFIGDIR:=/etc/sysconfig
+INITDIR:=/etc/init.d
+SYSCONFIGDIR:=/etc/default
DESTDIR:=

CFLAGS:=-Wall -Wunused
@@ -85,7 +85,8 @@

.PHONY: libebtc
libebtc: $(OBJECTS2)
- $(LD) -shared -soname libebtc.so -o libebtc.so -lc $(OBJECTS2)
+# $(LD) -shared -soname libebtc.so -o libebtc.so -lc $(OBJECTS2)
+ $(LD) -shared libebtc.so -o libebtc.so -lc $(OBJECTS2)

ebtables: $(OBJECTS) ebtables-standalone.o libebtc
$(CC) $(CFLAGS) $(CFLAGS_SH_LIB) -o $@ ebtables-standalone.o -I$(KERNEL_INCLUDES) -L. -Lextensions -lebtc $(EXT_LIBSI) \
@@ -152,13 +153,14 @@
tmp2:=$(shell printf $(SYSCONFIGDIR) | sed 's/\//\\\//g')
tmp3:=$(shell printf $(PIPE) | sed 's/\//\\\//g')
.PHONY: scripts
-scripts: ebtables-save ebtables.sysv ebtables-config
+#ebtables-config
+scripts: ebtables-save ebtables.sysv
cat ebtables-save | sed 's/__EXEC_PATH__/$(tmp1)/g' > ebtables-save_
install -m 0755 -o root -g root ebtables-save_ $(DESTDIR)$(BINDIR)/ebtables-save
cat ebtables.sysv | sed 's/__EXEC_PATH__/$(tmp1)/g' | sed 's/__SYSCONFIG__/$(tmp2)/g' > ebtables.sysv_
install -m 0755 -o root -g root ebtables.sysv_ $(DESTDIR)$(INITDIR)/ebtables
- cat ebtables-config | sed 's/__SYSCONFIG__/$(tmp2)/g' > ebtables-config_
- install -m 0600 -o root -g root ebtables-config_ $(DESTDIR)$(SYSCONFIGDIR)/ebtables-config
+# cat ebtables-config | sed 's/__SYSCONFIG__/$(tmp2)/g' > ebtables-config_
+# install -m 0600 -o root -g root ebtables-config_ $(DESTDIR)$(SYSCONFIGDIR)/ebtables-config
rm -f ebtables-save_ ebtables.sysv_ ebtables-config_

$(MANDIR)/man8/ebtables.8: ebtables.8



--
參考連結:
ebtables 的官網文件

2008/11/24

[Linux] SVN 跑 http 加上 MySQL auth

這個方案只差一個 https 就可以變成我心中最麻煩的 svn 方式了。
不過麻煩的還不在這裡,最麻煩的地方,在這台機器架在 FC5 上面。
(O.S 如果是 FC 晚近的版本,至少軟體差異不會那麼大咩~)
在 auth mysql 裡面的 param 改了好幾次的樣子,每個版本都不大一樣,使用前後﹑更新的時候都要特別小心。

步驟:

1. a2enmode 把 auth_mysql ﹑ subversion 都 enable 起來。
2. mysql 跑起來。 # default db 我設到 http_auth
3. 加入 mysql auth table # 我把 UserTable 跟 GroupTable 都設在一起
drop database http_auth;
CREATE DATABASE http_auth;
USE http_auth;

CREATE TABLE `clients` (
`username` varchar(25) NOT NULL default '',
`passwd` varchar(25) NOT NULL default '',
`groups` varchar(25) NOT NULL default '',
PRIMARY KEY (`username`),
KEY `groups` (`groups`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
use http_auth;
INSERT INTO `clients` VALUES ('anton', encrypt('1234'), 'admin');

3. /etc/init.d/mysql start # 啟動 MySQL
4. vi /etc/httpd/conf.d/subversion.conf 加入:
<Location /svn>
DAV svn
SVNParentPath /home/svn
SVNListParentPath on
AuthzSVNAccessFile /home/svn/svn.authz
AuthName "SVN Repository"
AuthType Basic
AuthMySQLEnable On
AuthMySQLHost "localhost"
AuthMySQLPort 3306
AuthMySQLUser "id"
AuthMySQLPassword "password"
AuthMySQLDB "http_auth"
AuthMySQLUserTable "clients"
AuthMySQLGroupTable "clients"
AuthMySQLNameField "username"
AuthMySQLPasswordField "passwd"
AuthMySQLPwEncryption crypt
AuthMySQLAuthoritative On
require valid-user
</Location>

5. /etc/init.d/httpd restart # apache 再啟動
6. 寫個 chpasswd 的 php script。

這樣 svn 就可以順利使用 http 連線了。 (而且改密碼就直接在 mysql 裡面改了)
* 對了,要小心 mysql encrypt function 是 "encrypt" 不是 "crypt" 喔。

--
附上我的 Ubuntu 8.10/apache2.2.8-1ubuntu0 的 config:
# 這個版本的 mysql auth 是寫在 auth_mysql.conf 裡面,用 Auth_MySQL_info hostname mysql_id mysql_pass 來連的。
# 感覺比較簡潔有力。
# 至於 AuthUserFile 為什麼兩邊設不一樣... 這是我實際運作後的結果,還不知道為什麼上面不能設到 null 去。
<Location /svn>
DAV svn
SVNParentPath /home/svn
SVNListParentPath on
AuthType Basic
AuthName "Subversion repository"
AuthBasicAuthoritative Off
AuthMySQL_DB "http_auth"
AuthMySQL_Password_Table "clients"
AuthMySQL_Group_Table "clients"
#setting authfile to /dev/null stop apache error log
AuthUserFile /dev/null
AuthzSVNAccessFile /home/svn/svn.authz
Require valid-user
</Location>


--
參考網頁:
* mod_auth_mysql
* http 認證使用 mysql

[軟體] Ubuntu 8.10 更新 VirtualBox 2.0.6 失敗

一早打開電腦,我的 VirtualBox 就跟我提醒說要更新版本了。想說, VirtualBox 又要更新了啊?不知道什麼時候才會更新到 opengl 的支援的部份? 算了,這個功能還是慢慢等好了,反正已經有了眉目,應該不會等太久的。

結果下載下來之後,不疑有它有就直接安裝了。
結果就跑出來:
* Look at /var/log/vbox-install.log to find out what went wrong
馬上去 Google 找 VirtualBox 更新失敗的情況:
這邊 也有看到幾乎是一模一樣的回報。(別看了,這篇是什麼外國人寫的,不是英文﹑俄文﹑義大利文﹑荷蘭文﹑泰文我就連找人幫忙都不行了~) <-- 這邊好像是講出來現的~

再回去看 VirtualBox download 的官網查看,果然發現問題的徵結點: (好啦,其實是我自已沒注意~)
原來, VirtualBox 自動下載的是: virtualbox-2.0_2.0.6-39765_Ubuntu_hardy_i386.deb
但是我的系統根本不是 hardy 啊~
所以再下載 正確 的版本下來更新就好了。

真糟,我太相信自動下載了~

而且,明明看 ChangeLog,跟 Linux 有關的部份,就那麼一點點而已...:

* Linux/Solaris/Darwin hosts: verify permissions in /tmp/vbox-$USER-ipc
* Linux hosts: fixed assertion on high network load (AMD64 hosts, fix for Linux distributions with glibc 2.6 and newer (bug #616)
* Linux hosts: don’t crash during shutdown with serial ports connected to a host device
* Linux additions: fixed compilation of vboxvfs.ko for 64-bit guests (bug #2550)


這次的更新,一點都不建議做上。

2008/11/20

[Programming] 犯錯 + BUG ==> PHP5 計時亂掉

這個問題應該是只發生在 php5 上面的問題。

話說一個 php 計時的 script 發生了多了八個小時的問題,所以開始追蹤這個 bug ,結果發現到:
$ echo $TZ

$ cat /etc/php5/cli/php.ini|grep timezone
; Defines the default timezone used by the date functions
;date.timezone =
$ cat /etc/timezone
Asia/Taipei
$ echo "<? echo date_default_timezone_get(); ?>"|php
Asia/Chongqing

哇勒?!我明明系統設 Taipei 啊?幹嘛給我丟到對岸的中國去?這個應該是 php 的臭蟲吧?

再下
$ echo "<? echo time()%86400; ?>"|php
6210

... (恍然大悟) time() 回復的是 UTC 的時間。所以如果你是用 time() 來計算時間,在使用時就要注意,不能和帶有時區的函式一起使用。像是如果 time() 和 strftime 混用,那麼你計算出來的時間就會相差 8:00 (台灣的時差)。

2008/11/18

[Kernel] Procfs Hello World

Linux Kernel Module Programming 這邊有簡單的 kernel module 教學跟範例的部份,感覺還蠻簡單就可以入門的。

配合之前讀的 Linux 核心開發指南做的簡摘,就可以做為入門的一個記錄了。

中斷

程序的建立

程序的排程

系統呼叫

核心同步

--
順便一提,
proc_root undeclared 的問題在這邊 有提了一下,簡單的說,先把這個變數改做 NULL 來處理就可以。
不過我還不清楚為什麼要這樣。

另外 2.4 的 kernel 的部份也可以參考 Wilson 老大翻譯的文章。

2008/11/17

[軟體] UNLiu 目前進度

年中換了工作,所以 這篇 裡頭說的計畫,又受到了不少的耽擱。不過現在總算又有點眉目的感覺了。

因為沒有足夠的資源,所以我用上 gtalk 的機器人,讓它可以接受查詢/新增/刪除的指令,用這樣的方式來從事 UNLiu 表格的製作,其實是非常克難的了。

不過現在總算又可以開始了。


--
相關網頁:
Wiki 記錄

2008/11/13

[軟體] 特效照片

上次提到一個 MyMagic的網站可以玩一些特效,現在再來一個 Funia 也是類似的自訂特效照片網站,蠻有趣的地方當然還是在於你可以很簡單的上傳照片,它會自動幫你找出照片裡面的人臉加到一些照片裡面變成有趣的特效。以下是一個例子:

2008/11/12

[Linux] 在 Linux 底下 extract iso 檔

在 Linux 底下 Extract ISO 檔案大部份的人都會直接 mount xxx.iso -o loop /mnt/cdrom1 再進去把檔案拖出來之類的。

不過這個動作在沒有 root 權限的時候,就會不能達成;於是有很多其它 solution 開始跑出來...
像是用 Kiso ﹑或 file-roler 之類的。不過這兩種方式都需要 X 上面執行才可以,所以如果沒有 X 的環境,還是沒辦法達成。

這支 perl script 可以很方便的達成這個目的,(不是小弟所寫,請別誤會)
./isodump.pl xxx.iso 就可以達成。

--
參考連結:
Linux 上處理 iso 檔(英)

[Linux] Ubuntu 8.10 改用 xfce (追加 network manager)

話說 Ubuntu 8.10 釋出,預設是使用 gnome 這個 Window Manager 當作它的桌面系統在執行。不過我當然不會對 gnome 這隻大腳執行的速度感到滿意。歷史告訴我們,愈大的東西,跑起來有威力,但是當然也要消耗掉相當大的資源。在我的 laptop 上面跑的東西本來就不少了,我自然不會想要一直接受一個怪獸在那邊跑。所以我又跑去用了別的 WM 。

一開始就跑 fvwm-crystal 這個小而輕快的 wm ,不過 fvwm 很久沒有再什麼更新了,所以對於 X 的一些功能上的更新配合的程度就顯得不太好,像是我很需要的 applet 跟 dual monitor 的功能都沒有辦法配合,所以我只能把它再收回我的壓箱裡面。

接著,我就跑去試 xfce 這隻小老鼠。誠如它的 logo 所代表的, xfce 跑起來的效能比 gnome 要好上很多,在 dual monitor 的表現上面甚至比 gnome 還要簡單,也可以配合 gnome 的程式來使用,所以在操作上面如果你習慣了 gnome 就"幾乎"不會有什麼問題。(XD 這句話會不會說的太早?)

問題就這樣跑出來了:
我在使用 xfce 的時候,也需要用到 gnome 上面的 network manager 這個 applet,不過在 xfce 的 panel 上面按了半天(發現到 xfce 的 panel 原來支援使用 gnome-panel 的 applet 了耶,真方便,這樣 gnome 有的, xfce 也可以有了~)… 按了半天,找不到 network manager ,只看到 network monitor ,這兩個 applet 是不一樣底!!!



這個 applet 要配合 gnome applet 使用,所以要在 xfce 的 panel 上面點:
Add New Item -> XfApplet (Display Gnome applets in the panel) -> notification area 把這個先加上來,才會有效果。

接著用 xfce4-autostart-editor 再追加 xfce 啟動的時候,要啟用 nm-applet ( gnome 是用 nm-applet --sm-disable ,沒有 manpage ,不確定這個 --sm-disable 用法是做什麼的,不過既然 gnome 預設下這個,那我們就 follow 就好了~)

這樣 xfce 啟動的時候,就會有 network-manager 在你的 panel 上正常工作,要切換 wired network 還是 wireless 就很方便了。

--
參考連結:
Ubuntu 上面跑 xfce 的截圖
Ubuntu 上面跑 fvwm-crystal

--
附註:
用了 compiz 的效果再用 import -window root 抓圖會有問題,所以我改用 gimp 來抓圖。

[Linux] SVK 在 Ubuntu 8.10 底下不能用

我的 svk 在升級到 ubuntu 8.10 之後就不能用。

deb 相依性的問題,所以無法安裝。

Launchpad 看到有相同的 bug report ,所以特別留心注意了一下,結果看到已經有 unstable 的 deb 跑出來了。

結論是安裝 unstable 的 libfile-temp-perlsvk 的包裝,再 apt-get -f install 就暫時先湊合著吧。

我也不想用 unstable 的東西,不過還沒看到有問題,所以勉強先用著,有問題再說吧。

2008/11/07

[Programming] urlencode

這邊應該是作為 這裡的備份
今天在整理我的 wiki 的時候才發現以前寫的筆記有不少東西已經不見了,怕再消失,所以把 source 也丟一份在這邊:
static char*
urlencode(char *s, int len, int *new_len)
{
unsigned char *from, *start, *end, *to;
unsigned c;
unsigned char hexchars[] = "0123456789ABCDEF";

from = s;
end = s + len;
start = to = (unsigned char *) malloc (3 * len + 1);
while (from < end)
{
c = *from;
if (c == ' ')
{
*to = '+';
to ++;
}
else if (
(c < '0' && c != '-' && c != '.') ||
(c < 'A' && c > '9') ||
(c > 'Z' && c < 'a' && c != '_') ||
(c > 'z'))
{
to[0] = '%';
to[1] = hexchars[c >> 4];
to[2] = hexchars[c & 15];
to += 3;
}
else
{
*to++ = c;
}
from ++;
}
*to = 0;
if (new_len)
{
*new_len = to - start;
}
return (unsigned char *) start;
}


這個 code 我有再依自已習慣的 code style 整理過。
話說,從退伍到現在,自已的 code style 變化不少。

[Linux] Edimax 6204 玩弄記錄(1)

Edimax 是一間專門在做 Wireless AP 的公司。它所生產的這款 6204 的產品是開放源始碼的產品,所以我們可以在這裡 下載到它部份的源碼。 (當然不會是全部啦,因為它自已寫的獨立 code 是不用公開的部份,所以這包 source code 還是不完全的東西),不過我們還是可以從這邊得到不少的參考資訊。

簡單整理如下:
1). unzip file into: EdiEngBR6204Wg_1.48.bin

2). dd if=EdiEngBR6204Wg_1.48.bin of=edi1.lzma bs=34836 skip=1

3). lzma d edi1.lzma edi1.out

4). dd if=edi1.out of=edi1.ext2 bs=2162688 skip=1

5). mount -o loop edi1.ext2 /mnt/disk (point to your local mount point).


按上面的方式就可以很順利的拆解 Edimax 的 firmware 得到它的 root disk (binary) 來參考架構。(呃... 開完了就知道,好像沒有寫的很好,不過硬體的部份還不錯用說,所以下個目標要來搞一下新的 firmware )

--
參考網頁: Edimax 破解記錄

[Windows] 好用的小工具: AutoHotKey

做為一個 Linux 的愛好者,轉移到 Windows 上面的時候,往往難以適應 Windows 調整快捷鍵的方式,所以 google 了一下,結果發現很多人愛用的 "Auto Hot key"。不多說,就來給一個範例說明如何使用 Auto Hot key 來...