2008/12/29

[軟體] Tomboy

Tomboy 是一個很好用的筆記簿軟體,簡單的說,如果你用過 Wiki 大概用 Tomboy 就沒什麼困難。不過,如果你有好幾台電腦,在電腦之間傳送筆記似乎就沒有那麼方便了。 然而 Tomboy 的開發人員還是為了這個需求設計了:「同步化筆記」的功能,簡單的說,你只要設定好一台擁有 ssh 權限的電腦就可以很簡單的同步你的筆記了。

(這邊註記, port number 寫在 hostname 之後就可以了。)

有圖為證:


設定完,在筆記簿的工具列可以找到同步化的項目,點下去就會開始同步。

2008/12/28

[閱讀] 安娜.卡列尼娜

這本書是俄國文豪托爾斯泰的大作,當然在大學的時候就有唸過了,不過今天去貓哥的蘇格貓底的時候又拿出來翻,發現自己已經把故事情節忘得一乾二淨了,所以又花了一兩個小時把整篇故事再看了一遍;順便作了一個心智圖來說明整個故事:



----
附註:
* XMind 現在可以在 Ubuntu 上面直接安裝了。
* Jedi 的心智圖軟體戰國時代一文可以大概知道「心智圖軟體」是在說什麼。

2008/12/25

[Linux] Telnet 自動登入, expect 範例, tftpput 範例

現在 console 的登入都已經用 ssh/sftp ,所以 telnet/ftp 其實蠻少人在用的。不過,我們在嵌入式 Linux 底下還是蠻常會用到 telnet/ftp 的情況,自然要用一點小技巧來讓自已的開發速度快一點,其中一個方法,就是再來利用 expect 這個 shell script 上的工具。

範例:#!/usr/bin/expect
spawn telnet 192.168.1.1
expect Login:
send root\r
expect Password:
send password\r
interact


這個工具同樣可以用到 tftp 上面,所以要寫一個簡單的 tftpput 就是長這樣:
#!/usr/bin/expect
spawn tftp 192.168.1.1
expect tftp>
send bin\r
expect tftp>
send "put $argv\r"
expect tftp>
send quit\r
interact

這樣就可以使用 tftpput FILENAME 來上傳檔案到 tftp server 上面。

其實蠻簡單的,也只少掉一些等待的時間(3~5) s,所以沒什麼重要的,後來還有很多可以再來發揮。

2008/12/17

[軟體][Linux] Google 釋出 Picasa 3.0 beta for linux

這邊可以下載官方的 picasa 3.0 beta for Linux 。

雖然跟 win32 一起釋出,不過還是有幾個地方不滿意:

1. 還是用 wine 跑的。 (不過 XIM 中文輸入法沒問題了)
2. beta version

所以... 嗯... 我的謎圖還是被輕易的找出來了。
看來我要去調一下設定了。

[軟體] Xmind 釋出 3.0.1

Xmind 是一款很好用的 MindMap 軟體,支援多平台,像 Windows, Mac , Linux 上面都可以使用,程式平台是 java 。

今天由 Xmind 送出的通知:

新的功能:
1. 增加了新的 MindMap 結構: 順時鐘方向逆時鐘方向的功能
2. 可以匯入/匯出 Xmind 2008 的檔案
3. 可以設定儲存 mindmap 的檔案路徑
5. 可以在 topic 裡面使用超連結了
6. 個人的註記圖示可以在別台電腦上面看得到了
7. 多國語言的支援 German, Janpanese,
Chinese(Simplifiled), Chinese(Traditional)
8. 新的關係連結: Zigzag 。
9. 新的註記圖示。

對我來說,那個多國語言的支持是很重要的。僅管我可以接受英文介面,不代表跟我一起 brainstorming 的同學可以接受英文介面啊~ 所以還是要有多國語言的支援才行。
(虧我之前一直看說,不是加上 -NL zh_TW 就可以上新的語言了嗎? 它的官網 FAQ 是這麼寫的沒錯~ 還跑去 K source code 說。)

另外在 feature 沒寫的,還有一樣是,現在加入了 ubuntu 的 deb 安裝支援,所以 ubuntu user 可以直接使用 deb 包裝安裝這個軟體了,不需要再用 unzip , ln -s 再哪邊拉來拉去,麻煩死了。

--

原文如下:
Release Notes
Change of version 3.0.1

New Features:
1. New Mind Map Structure: Clockwise and Anti Clockwise
2. Import XMind 2008 file.
3. Export to XMind 2008 file.
4. Map Shot: User can set a path to save.
5. Hyperlink: Users can add Local File/Folder link, and topic link(in
the same workbook) to a topic.
6. The personal markers in a map can be seen after opening the map in
another computer.
7. Multi-lingual: New languages package including German, Janpanese,
Chinese(Simplifiled), Chinese(Traditional)
8. New relationship style: Zigzag.
9. New markers.

Bugs:
1. XMind can not run on PowerPC-based Mac OS X Tiger 10.4.
2. Print dialog will be freeze sometimes.
3. Marker, legend will become ugly if printing the map.
4. Extract a Theme, and apply to a map. This theme will be lost after
reopening XMind and that file.
5. If users enable the Auto Save in XMind, open a new workbook and
edit it, then leave XMind and do other work. After a while, there will
be many "Save as" dialog.
6. Open the build-in browser, and open a website, now if there is no
response after clicking a URL inside this website, closing this
browser view will close XMind.
7. SpellCheck is in.
8. If users use XMind 3 to open an XMind 2008 file which has
wallpaper, that wallpaper can not be read.
Some other bugs fixed.

Improvement:
1. Can not open all XMind 2008 files directly.
2. Theme will be seen after uploading and exporting to images.
3. Users can drag an image into XMind as an individual topic.
4. Ctrl+Home will let users focus on Central topic and central topic
be at center.
5. Users can change the Row order in Spreadsheet easily.
6. Importing Mind Manager file performs better.
7. Hightlight the theme in current map in the theme view.
8. If a topic is near the left or right of editor, and now double
clicking or F2 to edit it, the map will jump to let this topic be
center of editor.
9. The Fishbone Chart has tapered line.
10. There is a print icon on toolbar.
11. New .deb package for Debian/Ubuntu Linux.
12. Open .xmind file directly from Share.xmind.net.
Some other improvements.

2008/12/16

[軟體] Unicode 字體看不到

參考 這邊 其實寫的蠻清楚的。
Windows

1. 下載並存取hannomH.zip此一文檔。
2. 打開hannomH.zip並把字體Han Nom A.ttf及Han Nom B.ttf存到電腦的某一個資料夾。
3. 按一下 [開始],再按一下 [執行]。
4. 輸入 %windir%\fonts,然後按一下 [確定]。
5. 按一下 [檔案] 功能表上的 [安裝新字型]。
6. 按兩下包含字體的資料夾。
7. 選取Han Nom A 及 Han Nom B兩個字體。
8. 按一下以選取 [將字型複製到字型資料夾] 核取方塊。
9. 按一下 [確定]。


linuxer 就很簡單啦,個人使用就下載字體到 $HOME/.fonts 底下再 fc-cache -vf 就可以了。

hannomH 字體下載點

其實 Unifonts.exe 也可以,在 Linux 上面跑是沒問題的,不過在 Windows 上面會修改 register 的部份,所以使用要小心。

Unifonts 載點

2008/12/15

[軟體] Xmind in Ubuntu

更新: Xmind 釋出 3.0.1 這邊可以直接使用 deb 安裝 Xmind 。

----
今天裝 Xmind 上來的時候,看到有錯誤訊息跑出來:
gnu.xml.dom.DomDomeException 看起來是 xml 在 namespace 載入的時候就沒有過了,所以應該是系統設定的關係。

回想不起來裝了哪個東西讓它不能動,只好一個一個東西從 dpkg.log 裡面找,結果看到早上還有裝 java-gcj-compat ecj-gcj (因為 eclipse 的相依的關係),只好連 eclipse 一起幹掉。結果又恢復正常了。

結論是:用 java 的 ap 要小心相依的問題。

----
參考連結:
Tsung 的在 Ubuntu 上面安裝 XMind

2008/12/12

[Linux] libbb/procps.c:15:22: error: asm/page.h: No such file or directory

這個問題在 這邊 也有被提出來。

簡單的說,就是 2.6.20 之後的 kernel 目錄有點點變動了,所以,在 compile 的時候,引用舊的結構的程式碼需要做個調整,或直接在你的 header file 裡面加上 soft link :
ln -s /usr/src/linux/include/asm/page.h /usr/include/asm/

2008/12/11

[Linux] ping: sendmsg: operation not permitted

錯誤訊息跟 這邊 看起來是一樣的,不過在處理上面有點點不大一樣。

簡單的說,今天把手邊的 ubuntu 8.04 也跟著昇級成 8.10 ,結果跑完有錯誤訊息跑出來:
ping: sendmsg: operation not permitted

結果是把 firestarter 從 rcS 裡面拿掉就好了。

嗯~ 很討厭的東西。

[Linux] iptables CHAIN 說明

Linux 底下有一個功能很強大的工具叫做「iptables」,這個工具結合了 Linux Kernel 的設計,在 user mode 底下操作,達成 netfilter 的功能。
(這句話說的有點複雜,簡單的說,就是你在 Linux 上面要擋什麼網路封包,搞什麼封包轉發的,通通都是靠這味啦~)

我寫這篇,就想把 iptables 的功能先介紹到,晚點再來解釋它跟 netfilter 的關係,以及它的親戚 ebtables 的功能。

首先是在指令操作上的幾個名詞:
TABLE﹑ CHAINS﹑ JUMP
以這個指令來說:
iptables -t nat -A POSTROUTING -j DROP

nat 就是 TABLE 名, CHAINS 就是 POSTROUTING , JUMP 就是 DROP 。

來看圖好了:


一個封包由左側進來,先判斷要不要 FORWARD 轉發,要轉發就直接出去了,不轉發就走上面的路線,由本地端來判斷要不要做路由 ROUTING 的動作,要的話就還會轉出去,不要的話當然就本地收下來了。

在 TABLE 上面負責的工作,就是 NAT 負責進出、FILTER 負責本地端的進出,跟轉發的 FORWARD ,還有就是 MANGLE 負責本地端進出的修改, NAT 進出前的修改,判定轉發後的修改。

LOCAL 所有的 CHAINS 就是 INPUT 跟 OUTPUT
FORWARD 的 CHAINS 才有 PREROUTING 跟 POSTROUTING。

JUMP 的部份,就要看各個 JUMP 支援的動作了。

--
參考連結:
iptables 入門導引

2008/12/09

[Linux] 嵌入式系統上常見的檔案系統註記

之前有寫過這篇squashfs 介紹的文章,不知道為什麼,這篇隨便寫寫的文章被排到蠻高的位置,不過 bounce rate 也很高 (真是汗顏) ,那個時候還沒想到要玩 squashfs ,只是覺得這個 fs 還蠻有意思的,所以做個書籤,記錄一下,想說以後應該會用到。只是沒想到,後來真的用上了。

首先要提出來的,是嵌入式系統上面重視的幾個特點,像是:

  • 斷電可靠度
  • 耗損平衡
  • 資料壓縮
  • 垃圾收集
  • 就地執行


斷電可靠度,在唯讀的情況下,應該都可以過關,但是 rw 的時候,不知道其它的 fs 能不能過關,意即,如果今天執行寫入動作的時候斷電了, fs 能不能在下次開機讀取的時候,仍然維持正常運作,在日誌檔、inode、目錄等結構都不用擔心會有破碎的情況。

耗損平衡則是因為 NOR/NAND flash 的特性,在寫入 0 區的時候,需要 erase block ,然而這會造成寫入壽命提早完結,固定區塊寫入次數過多的情況,所以說,需要依靠軟體的部份加以處理。(垃圾收集也是跟這個物理特性有關)

資料壓縮,主要是在 SDRAM 價格比 flash 便宜﹑及寫入更新的動作在嵌入式裝置上面其實遠遠低於讀取的情況下構成的解決方案。所以我們可以使用資料壓縮來讓嵌入式裝置在運行期間才真的解開來運作。

就地執行(XIP)的特性在 squashfs 及 jfs 上面都還沒有看到,所以這個特點我就跳過了.... (其實我還不知道什麼情況下可以 XIP)

這些功能除了就地執行之外,其它的 jffs2 都有達成目標,這應該也是 jffs2 之所以可以歷久彌新的原因之一(參考zylix666 的文章)。
再來是 squashfs 官網提到的, squashfs 只是一個 fs structure ,真正讓它可以壓的比別人小的是背後的演算法。但是在演算法的部份,因為 LZMA 在 Linux kernel 的支援還不存在,所以 squashfs 想要包進 kernel 就只好改預設演算法為 gzip ,僅管如此, squashfs + LZMA 的部份還是很多人在用。 (目前似乎是最小的組合)

另外翻到 ramfs 跟 tmpfs 的比較的部份,這兩種檔案系統的用法幾乎一樣,我只看到在使用的對象上面, ramfs 使用的是 physical ram ,而 tmpfs 則使用的是 logical 的 memory address ,所以 tmpfs 也有可能會使用到 swap (這點之前沒有意識到,換句話說, tmpfs 不見得可以「很快」。

----
參考連結:
* LZMA
* jffs2
* squashfs
* ramfs 和 tmpfs 的使用
* cramfs
* 快閃記憶體

2008/12/03

[軟體] Ubuntu 網路電視的使用 (sopcast)

來源是這邊 (only ubuntu)

= 安裝相依套件 =
sudo apt-get install qt3-apps-dev vlc build-essential

= 下載 sopcast 的函式庫 =
點我下載

用 unzip 解開它,並且進到目錄裡頭再打下列指令:
sudo cp sp-sc-auth /usr/bin/sp-sc

= 下載 GUI 的部份 =

這是 RMKOD 版的 GUI
再一次,用 unzip 解開它,同時進到目錄裡頭執行:
sudo qmakesudo makesudo make install

這樣就完成了安裝的部份,不過還有兩件事情它在文章裡頭提到的:
1. 建議在 sopcast 裡頭設定專屬的 player 用 vlc 。
2. 在 firefox 的 about:config 裡頭,新增字串,名稱是 network.protocol-handler.app.sop ,值是 qsopcast ,這樣就可以用 firefox 直接看了(?)。

第二點其實蠻難的,會用 sopcast 的網站,通常會指定 player 是 mediaplayer ,所以在 Linux 底下也很難成功,不過還是可以去看一下 link 指到哪邊,再貼出來看就是。

2008/12/01

[Google] 用 Gmail 寄信

之前寫過用 php 的 libcurl 透過 gmail 寄信 的方式(…呃,我不是故意讓名字這麼長的),不過呢,這個方式「好像」遇到 libgmailer 沒有更新的囧境了,所以我又在前一陣子跑去找了別的替代方式。

畢竟, gmail 是很好用的 mailer ,所以我的 solution 就是!! (自動背景配樂!~)

少林功夫加唱歌跳舞! ♬

... 冷掉了

#!/usr/bin/php -q
<?
function body_get_receiver($body)
{
$cols = explode("\n", $body);
for ($i = 0; $i < keyword =" substr($cols[$i]," keyword ="="" keyword ="="" ans =" strstr($cols[$i]," ans =" substr($ans," i =" 0;" ans =" substr($ans," cols =" explode(" to_name="$cols[0];" body = "" i="0;" subject =" $argv[$i+1];" fn="php://stdin" body="" fs="fopen($fn," to_address =" ($argv[1])" fs =" fopen(" attach = "" mail =" new">IsSMTP(); // set mailer to use SMTP
$mail->CharSet = "utf8";
$mail->Encoding = "base64";
$mail->From = "anton.tw@gmail.com";
$mail->FromName = "anton";
$mail->Username = "帳號@gmail.com";
$mail->Password = "密碼";

$mail->Host = 'ssl://smtp.gmail.com';
$mail->Port = 465; //default is 25, gmail is 465 or 587
$mail->SMTPAuth = true;

$mail->addAddress($to_address, $to_name);
$mail->WordWrap = 50;
if (!empty($attach))
$mail->AddAttachment($attach);
$mail->IsHTML(false);
$mail->Subject = $subject;
$mail->Body = $body;

if(!$mail->Send())
{
echo "郵件送出失敗! ";
echo "錯誤訊息: " . $mail->ErrorInfo . " \n";
return false;
}
else
{
echo("寄信 $attach 給 $to_name <$to_address> 完成! \n");
return true;
}
}

?>

使用方式,就是 echo "test" | mail xxx@gmail.com -s "subject"

裡面的 body_get_receiver 這個 function 是特別為了 mediawiki 生的。因為 mediawiki 的收信人是直接 pipe 在 mail body 裡面的,所以沒辦法知道收信人是誰的時候,就從 body 裡面拉出來,就好了。(其實還有不少例外沒處理,不過,管它的~ 我起個頭而已,後面有人想玩就接著玩唄~)

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 破解記錄

2008/10/31

[Linux] Ubuntu Atheros 無線網卡問題 (8.10) 重發

話說 10/30 是Ubuntu 8.10 釋出的日子。安小東自然不會放過這個嘗新的機會。(事實上,在這之前,安小東就已經在兩台常用的 desktop 上面趕到 8.10 beta 的版本了。)

不過,新版本自然要負上很多不穩定及安全上的風險。(小朋友不要學喔,叔叔有練過~)
所以這邊要註記一個 Ubuntu 8.10 在我的 Asus 筆電上的問題記錄:

之前在這篇已經有提過一些做法。自然也是可以下:
wget http://snapshots.madwifi.org/madwifi-trunk-current.tar.gz
tar zxvf madwifi-trunk-current.tar.gz
cd madiwifi-*
make
sudo make install

來解決問題。

不過因為 Ubuntu 8.04.x 之後已經有把 madwifi 的 module 包進來了,所以我們其實不用這麼麻煩。(還要移除舊有的,才不會衝突)
直接:
apt-get update
apt-get install linux-backports-modules-intrepid linux-backports-modules-intrepid-generic

就可以把 official 包的 restricted driver 裝進來。

這樣就可以繼續跑無線網路了。

2008/10/30

[軟體] MagMyPic

Pank 先生的網誌提到一個 MagMyPic 網站,這個網站可以上傳照片上去,加上雜誌樣的外觀,結果會像是這樣:

感覺還蠻好玩的,有興趣的人可以嘗試看看~

2008/10/28

[Linux] Autologin/自動登入的作法

這是我以前玩過的項目,所以我直接回:
參考資料在這邊:
Autologin to Xwindow
http://ubuntuforums.org/showthread.php?t=303319


簡單的描述這個流程:
* 開機完占用一個 tty ,
自動 su 成 user ,
在 .bash_profile 底下判定是那個 tty login 進來的 session 就自動 startx

這樣就完成 X 的部份,不過這個流程有安全上的顧慮,
所以要用 screensaver 來補強這個安全性比較好。

--
更新連結:
* [Linux][初學者] Windows 加灌 ubuntu 記錄
* Ubuntu 底下 event.d/tty1 respawn
exec /sbin/getty -n -l /usr/bin/autologin 38400 tty1

* FedoraCore5 底下 inittab 1:2345:once:/sbin/mingetty --autologin root tty1

2008/10/24

[Linux] USB2COM 的使用方式

yshu 這邊來的指導文章。

上文可以參考一下, 在 Ubuntu 底下會生 /dev/ttyUSB* 的 node 出來。
所以我們就用 minicom 接這個 node 就可以了。

baudrate 之類的按其需要修改,在 RTL 8186 的板子上面是
pu port /dev/ttyUSB0
pu baudrate 38400
pu escape-key Escape (Meta)
pu rtscts No


科科科,我終於可以在一台電腦上面接一堆 com port 連我的開發板了。

--

Y 拍上面的價格從 NT$ 99 ~ NT$500 不等,我這個窮小鬼用 99 塊的就好了。

2008/10/19

[Linux] Reiserfs 反刪除

簡單版:

1. dd 做備份
2. 在備份上面做 reiserfsck
3. mount 這個備份
4. 把備份 mount 起來的目錄裡面的資料 copy 出來。
5. 恢復正常

---
這兩天手癢,所以把自已的 Ubuntu 昇級到 Ubuntu 8.10 beta 的版本玩兒。
都說了是 Beta 了,所以自然有些東西要整理會不見。

我在檢視 HOME 目錄的時候看到一些已經沒在用的東西,很自然的就給它 rm -fr $name 下去,只是這一次,腦袋不靈光,竟然刪掉了近日才整理過的照片,裡頭最重要的東西,就是跟小猴子在西班牙的照片.... (!!!!!) 這樣,知道有多重要了吧?
---

廢話不多說,馬上就開始反刪除作業:為了避免影響到待救援資料的完整性,所以要馬上關掉這個使用 reiserfs 格式的 partition。還好,我當初規畫 partition 的時候,就把 HOME 跟 rootfs (/) 切開來了,所以,我可以臨時使用 root 來操作救援的動作(註);不然就只能 用 LiveCD 或著 init 1 同時 remount ro 來做了。

所以我用 root 登入之後,首先做的,就是打開一個 Terminal ,同時下達:
umount /home
可能會遇到一些困難,像是一些應用程式尚未關閉之類的,可以用 ps -ef|grep 使用者 ID 或著用 lsof 來看。

接著,我需要一個足夠存放 home 的 parition 的地方,所以拿出了隨身硬碟,把資料挪了一下,騰出 70G 的空間,接著下達
dd if=/dev/sda7 of=reiserfs.dd bs=100M conv=noerror
會下 100M 的原因是因為我記得 USB 2.0 high speed 好像是 100M 的理論值(忘了,不確定)

這個動作要做很久,做完已經是快一個小時半之後的事情了,接著要下達:
reiserfsck --rebuild-tree --scan-whole-partition reiserfs.dd
讓 reiserfsck 對這個備份檔案下達 rebuild-tree 的動作。
這個動作也會花上很多時間,約莫一個小時後,才會完成。

完成之後,我們下
mount reiserfs.dd /media/recovery -o loop
把這個檔案 mount 起來

當然,上面會有一堆垃圾跟著被復原了,幸運的話,可以在原來的位置找到我們想要的東西,不然也會在 lost+found/ 底下找到。我的例子是用
find . -iname "*.jpg"
找到我誤刪了的照片檔案, 它整個目錄都在一起,所以我的資料很快的還原了。

現在想起來還在抖~

重要的資料還是要養成備份的好習慣。

--
註: Ubuntu 上面 gdm 如果要 root 可以登入的話,預設要用 gdmsetup 打開 allow administrator to login 的選項。
參考來源:
Reiserfs FIle Undelete HowTO
Ext2/3 上的反刪除救援方式
Linux 底下劃分一堆 partition 到底有什麼好處?

2008/10/15

[Linux] Ubuntu 服務設定工具

來源是這邊

簡單的說,在 Ubuntu 上面一般會用 GUI 的服務設定工具來調整系統的服務。
不過如果不是在 X 裡面,需要設定服務的時候怎麼辦呢?有像 RedHar 底下 setup 或 chkconfig 之類的工具可以使用嗎?

答案當然是有的: // 當然也是有好答案跟壞答案
a) /etc/init.d/service
b) rcconf
c) update-rc.d etc


除了上面三個解決方案之外,還有一個「可以」的方案,就是 sysvconfig

--
參考連結: 這邊好像才是最初的來源??
# 很討厭引用不寫來源的人....

2008/10/07

[Linux] Ubuntu 8.04 不能自動 mount 隨身碟

這邊有兩個 Error 訊息:
A security policy in place prevents this sender from sending this message to this recipient, see message bus configuration file (rejected message had interface “org.freedesktop.Hal.Device.Volume” member “Mount” error name “(unset)” destination “org.freedesktop.Hal”)


org.freedesktop.hal.storage.mount-removable no <-- (action, result)


這邊 看到第一則的解決辦法,修改了之後,跟著又跑出來第二則的 error mesg。

解決辦法 當然還是有的。

不過,這一切都是愛亂搞的結果...。
(因為我搞了 autologin ,開機後不要 gdm ,自已就 startx 的結果 XD)

2008/10/06

[網頁設計] IE Fx 異同表(2)

HTML 處理
* form 物件 get method 送出的 location 在 IE 會多出一個 "?" 。
* form 物件在 action 填值 "test.htm" , firefox 會以絕對路徑 "http://gama:8080/test.htm" 儲存, IE 則以原來的 test.htm 儲存。
* js 在 IE 裡面不管是用 HttpRequest 的方式還是 script 標籤的方式都很容易被 cache ,使用時,建議不要把動態的東西放在 js 裡面,如果一定要,請加上 random string 。


對這種東西愈來愈沒什麼興趣了... 不過還是覺得其它人的反應很好笑,尤其是自以為是的人....

2008/10/03

[軟體] Skype 不安全

消息來源


 隸屬美國網路拍賣業者eBAY公司的Skype表示:「我們昨晚得知,在未讓我方知悉和未得我方同意的情況下,這項作業已經修改,我們對此極為關切。」

 該公司又說:「對於中國境內經由TOM集團伺服器傳輸的聊天訊息的隱私遭侵犯,我們深感抱歉,我們正和TOM集團緊急處理此一問題。」


意即:
Skype 很抱歉,有人光明正大直接進入他們的機器拿走你的個人資料,他之前不知道,就算知道了他也不打算怎麼樣...

2008/09/30

[Linux] Xrandr 玩 dual monitor

在 Ubuntu Linux 上面之前有玩過雙營幕的功能,不過是那時是 Nvidia/ATI 的顯卡,所以是用廠商提供的 solution ,而不是用 Linux 原生的方式在玩。後來換了 Asus X80Lseries 的筆電,這張是 intel 的顯卡,所以不能跑那樣的方式了,就找了一下,結果還是讓我找到了:



在 command line 底下可以下:
xrandr --output LVDS --mode 1280x800 --output VGA --mode 1440x900 --above LVDS

// 我的 monitor 一台是 NB 的 1280x800 ,一台是外接的 1440x900 (上下接)。

GUI 要用 grandr 這支程式來改。
不過這個方式好像還蠻多問題的,設定的時候聽說最大只能跑到 2048x2048 ~

// 不過我重開機後跑到 2560x800 (橫向接) 了。 有點囧...

2008/09/26

[網頁設計] 淺談網頁標準設計(摘要)

本篇文稿內容主要參考 hlb 的投影片,所以以下文章,不合宜將筆者當作作者,只可作為一個聽眾的整理稿。

= 參考連結 =
* 淺談網頁標準設計@交大資訊 http://hlb.yichi.org/blog/2008/09/19/246

= 為什麼要有規約? =
* 太初混亂
* 結構和 CSS 分離
* 各行其是,所以即見即所得變成了即見天曉得

= 為什麼要用 CSS ? =
* 表格的缺點
# 冗長的語法
# 不必要的定位方式
# 缺乏結構性﹑難懂難維護
# 成本的增加

= 平面設計與網頁設計屬性上的不同 =
# 頁:流
# 靜:動
# 定:變

= 我該怎麼做? =
# 符合標準
# 向後相容
# 瀏覽器即開發工具,這才是真正的即見即所得
# 驗證程式碼,自助而後人助。

= 建議 =
# 工具的選擇
# 心態的調整
# 避免疊床架屋的行為

2008/09/23

[網頁設計] IE Fx 異同表(草稿)

早上整理之前在網路上找到的資料跟自已這半年來工作上的心得,寫了一個簡表:
* Q: 無法使用 document.form_name 得到 form object ?
* A: 請用 document.formname.elements["elementname"] 或 document.forms["form_name"] 或 forms 底下順序抓取 form object
* Q: IE 的 radio 在有 onclick 的 function event 時,不會再跑出來 check 事件。
* A: 解決之道 -> 另外再做 obj.checked = true;
* Q: obj.setAttribute 時 colspan 不作用
* A: 因為 IE 的 DOM 屬性名稱是 colSpan ,大小寫需注意。
* Q: obj.setAttribute("class", "class_name"); 無作用?
* A: 因為 IE 的 class 屬性名稱是 className,大小寫請注意。
* Q: (尚未確認) window.event 在 fx 的 function 之中無法使用。
* A: 請用 function (event) 的方式傳入 event object 給 fx 的 function 使用。

* Q: IE 中 target name 是 global 且為 document.name 所使用。
* A: 請避免這個使用方式。
* Q: 在 IE 中 event.x 與 event.y 在 fx 中未定義。
* A: 請避免使用這個變數,改用 event.client.x/y 。 (這個變數在 IE/fx 底下都有定義,但是與 event.x/y 有些許不同,請注意)
* Q: IE 中 frame name 在 window.frame_name 有定義。
* A: 請使用 frames["frame_name"] 取得 frame object

* Q: childNodes 的定義在 IE 與 fx 不同, IE 不會插入空白節點, fx 使用 DOM 標準規範,childNodes中會插入空白文本節點。
* A: 可以透過 node.getElementsbytagname() 來迴避這個問題。
* Q: fx 的節點沒有定義 removenode 的 method 。
* A: 使用如下方式處理 node.parentnode.removechild(node)。
* Q: IE 中對 const 無定義。
* A: 避免使用。
* Q: fx 的 body 在 body 標籤沒有被瀏覽器完全讀入之前就存在,而 IE 則在 body 被完全讀入之後才存在。
* A: 在實現過程中請小心注意。
* Q: IE 中 input type 是唯讀屬性, fx 是可以更改的屬性。
* A: 請小心避免修改 IE 中的 input 屬性。
* Q: (未確認)在 ie 中,getelementsbyname()、document.all[name] 均不能用來取得 div 元素。
* A: 請小心避免使用這個取得方式,改用 getElementById()。

1.4 其它類

* IE 的註解 // 做 End ,不然會出錯。 Fx 可以接受沒有 End Tag

// 呵,原表格是在 Wiki 上面寫的,應該丟到 wikibooks 還是 wikipedia 上面好呢?

2008/09/10

[Linux] 畫分一堆 partition 到底有什麼好處?

// 這是我在 ptt 上面發表的文章,拿來這邊貼,還有一個用意,接著下來。

※ 引述《kadok (暗夜流星)》之銘言:
: 看過不少書
: 書中都會強調
: 如果要架一個server的話
: 硬碟規劃
: 將一些目錄分成不同Partition
: 並掛載成不同的目錄
: 是比較好的規劃
: 到底有哪些好處? 可否指教一下
: 我大概想想
: 一、chroot可以鎖在某個Partition的目錄下面
: 二、Quota可以鎖的比較細
: 三、災難發生可以損傷較小?
: 不知道我的思考方向有錯嗎?
: 請指教,謝謝

// local post

= 用途上的考量 =

我的分割表一定會把 / (root) 跟 /home 分開

如果有足夠的空間,或著有備份的需要 (像是跑 server)的話,

會再另外把 /backup 切出來

所以基本上會先考慮到的是 partition 的用途,

這樣在重灌的時候會很方便,在 /home 灌爆的時候,也不會影響到系統的運作。

如果 / 出了錯要重灌,備份也不會被影響到,平時做系統的備份也很快。

= 效能上的考量 =

在 linux 上面有很多種 fs 可以選擇,各有各的優點,

像大家都知道, ext2/3 是比較好作 undelete 的動作,但是讀寫大小檔案的效能

都沒有比其它的好,所以靜態的 backup 可以用這個 fs type。

reiserfs 在小檔上的處理比別的快,不過檔案回復就沒那麼輕鬆,

在 /home 目錄底下一堆小檔,就很適合這個 fs type。

jfs 我還沒比較過,不過聽說讀寫大檔表現不錯,我就會想切另外一個 partition

放 VirtualBox/VMWare 的 VirtualDisk 來放。

= Note =

另外還有沒提到的 xfs, cramfs, encrypted fs 等玩法,都各有各的特點,

不過我認識不夠,所以不夠格來寫下去,

還有就是在 Multi OS 的時候還要考慮到 ntfs 可以玩共享的部份,

不過有 virtualbox 之後,我就不跑 multi os 了。

--

// 這篇裡面我提到關於 filesystem 的比較的部份,最近才看到 debian official 的 filesystem comparison 的報告,所以要特別註解,上面的說法和實際還有些出入。

2008/09/05

[軟體][囧] Google browser : Chrome 有毒!!

是的,雖然我是 Google 的愛用者,但是我也不得不警告一下, Chrome 這個瀏覽器還在 Beta 版,所以很多問題在所難免。

* 像是記憶體的問題,在 Jedi 大神那邊已經被報導出來了。

* 在地址列打入 :% 的字元就會 crash 的問題,也已經報導出來了。

* 在特定情況下,會被執行惡意的軟體的問題,也已經被報導出來了。 測試 code

* 還有過長的檔名也可以 crash 掉 chrome 。測試 code

結論: Beta 是很可怕的字眼,好孩子不要亂玩 Beta 哦~
// 關燈可以看到測試工具...

2008/09/04

[軟體] Skype4Pidgin

Skype4Pidgin
呃,這個軟體蠻有趣的。先來看一下它的截圖:


看起來好像是在 pidgin 裡面跑 skype 耶~ Well ....
你如果看到我說這句話,心裡應該猜得到我接下來想說什麼了。

是的,這個軟體也許我會用下去,因為在 pidgin 裡面用 skype 的感覺還可以。不過,它在運行的時候,還是需要跑 skype ,所以看起來是在 pidgin 裡面跑了 skype ,其實只是類似 hook 的方式,去攔截 skype 的訊息而已....

這樣,資源還是浪費了,而且... trayer 那邊也還是有 skype 的 icon …

嘖,沒有很好耶... 不過有這個有趣的 plugin 的示範,應該可以拿來做為其它用途....

嘖嘖~ 修改是創新的開始。

2008/08/16

[軟體] 高橋式簡報

高橋式的簡報 在原作者的範例裡面,可以很清楚的看得出來,它的機個優點:製作簡單﹑表現明快﹑公開格式﹑易於修改等等。



最大的缺點就是: Firefox Only

Jedi 的部落格 上面老早就寫了介紹。
這邊先簡單介紹幾個高橋式簡報的用法:

0. 字型大小
SIZE::
1. 網頁標題
TITLE::
2. 章節標題
CHAPTER::
3. 對齊
ALIGN::
4. 強調
EM::
5. 原樣式
PRE::
6. 標頭
HEADER::
7. 標尾
FOOTER::
8. 計時器
TIMER::
9. 原始資料
RAW::
10. 圖
image
11. 忽視標註
IGNORE::

另外,共用的變數值可以用 GLOBAL- 開頭的字樣來定義,例如,一開始就定義 GLOBAL-ALIGN:: 或 GLOBAL-SIZE:: 等等。

這個東西拿來寫簡報投影片蠻方便的,不過還是需要一些網頁設計的常識才有辦法寫下去;另外在中日韓文字及部份功能處理上面還有 bug 沒修。

2008/08/11

[軟體] Fvwm-crystal (中文)


嘖~ 我還是老樣子。

用過 fvwm-crystal 之後,就對它念念不忘。僅管去年年尾到上個月都還是貪新,用 gnome + compiz 的效果當我的桌面。不過,總覺得 gnome 還是很肥又大,用起來真的不方便。

所以,又把 fvwm-crystal 裝了回來。同時,檢查了之前放的 fvwm-crystal 的包裝... 呃.. 好像有很多東西都不合用﹑不能用了。

所以更新了一下最簡單的 fvwm-crystal 在 Default with ACPI 這個 recipe 的 patch
my patch
晚點整理完 application 的部份再一起把整包的丟上來。

2008/08/08

[軟體][SVK] Mirroring overlapping paths not supported

記錄一下,這個問題好像出現過好幾次了,不過我都沒有去搞懂這個問題是什麼。
反正 svk 有問題就用回 svn 就好了~ XD

不過這個 error mesg 其實在說的是,你已經有別的 repo 已經 mirror 了這個位置,所以你應該做的是,再對這個位置找出來做 sync 或 cp 成 local 的 repo 之類的。

不知道為什麼這個 error mesg 要寫成: mirroring overlapping paths not supported. 這麼不直覺的說明。

2008/07/30

[Linux] Virtualbox 在 Ubuntu 裡使用 usbfs

參考連結在這邊。
不過要附帶一提的是:
1. virtualbox-ose (open source edition) 目前 stable 是到 1.5.6 的版本,所以 ose 還沒有提供 usbfs 的樣子。(我試不出來~ 哭哭)
2. virtual Sun xVM 的版本 功能比較強大 (當然跟 ose 有差了)

--
再註明阿駕先生 那邊對 usbfs 的修改:

編輯 /etc/init.d/mountdevsubfs.sh 檔案:

sudo nano /etc/init.d/mountdevsubfs.sh

找到 4x 行的 # Magic to make /proc/bus/usb work,將下面的註解拿掉:

#mkdir -p /dev/bus/usb/.usbfs
#domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,lis$
#ln -s .usbfs/devices /dev/bus/usb/devices
#mount --rbind /dev/bus/usb /proc/bus/usb

然後執行:

sudo /etc/init.d/mountdevsubfs.sh start

就可以看到 USB 的選項出現了。

2008/07/23

[Linux] Ubuntu exploits warnning.

Dan Kaminsky discovered weaknesses in the DNS protocol as implemented
by Dnsmasq. A remote attacker could exploit this to spoof DNS entries
and poison DNS caches. Among other things, this could lead to
misdirected email and web traffic.


話說最近 ubuntu Linux 的漏洞被發現的有點多,雖然說安全更新有發現比沒發現好,不過在處理上面還是容易讓人反感。

// 唔... 自已沒本事去抓漏,只能記錄一下,希望以後可以接觸到更多點東西。

2008/07/21

[軟體] Ubuntu + VirtualBox 使用 bridge mode

apt-get install virtualbox
apt-get install virtualbox-ose-modules-generic


Ubuntu 上面用 Virtual Box 蠻簡單的, apt-get install virtualbox 加上 virtualbox 的 module 就解決了。預設網路使用 NAT 模式,所以沒有什麼太大的問題,不過如果遇上跟我一樣,一定要用 bridge mode 才行的時候,就有點麻煩。

所以要註記一下下面的步驟:
apt-get install bridge-utils, uml-utilities

vi /etc/network/interfaces

# 加入
auto tap0
iface tap0 inet manual
up ifconfig eth0 0.0.0.0 up
down ifconfig eth0 down
tunctl_user anton

auto br0
iface br0 inet dhcp
bridge_ports eth0 tap0
up ifconfig eth0 up

這樣就應該可以了。

--
參考連結:
阿駕零零壹

2008/07/11

[Programming] Javascript Compress

Well,老想著 js 不知道能不能搞點新花樣,像是可以壓縮﹑加密之類的。不過後來想想就知道蠻沒意思的,一來 js 還要給瀏覽器打開,所以不可能是 one way,二來,遶路走很難比直線快。

不過還是找到了兩個有關的連結
第一個連結
第二個連結

算是在某些情況下

http://pajhome.org.uk/crypt/md5/

2008/07/09

[Programming] Javascript cached by IE

這邊 有提到解法。
簡單的說,我給的 url ,就再加上一個亂數就好了。

很簡單,不過很想說,IE 很差耶...

2008/07/01

[軟體] svn + ssh

這邊有提到一點點。
簡單的說,就是利用 ssh 的關係,來存取 svn 的 repo 。

這樣子的存取方式,不用透過 svnserve ,不用透過 http/https (webdav),可以說是最直接的存取。不過因為單純,所以 ssh 加以變化一下,透過 ssh tunnel 的方式,也可以從家裡連結放在公司 svn repo 了。
svn co svn+ssh://your.remote-server.com/home/svn/test

BTW, svk 也可以用上這個 scheme.

2008/06/29

[軟體] Tomboy



Tomboy 是 Gnome 上面很好用的筆記工具,不過我一直很期待它的 sync 工具。直到 Ubuntu 8.04 (Hardy) 出來之後,我小失望了一下,因為我的 sshfs 一直 sync 失敗,我本來以為是功能還沒寫好,因為 Addins 版本號還在 0.1 ,不過今天晚上去翻了一下它的 code ,才發現好像是可以 work 的才對啊~

再試一下,原來我的機器都躲掉 22 port 了,所以 default sync 不到。至於要跳到別的 port 的方法,有兩種:

1. 像我一樣,笨笨的用 gconf-editor 修改。
2. 直接在 sshfs 填 hostname 的地方加上 ":port_number"
像是 antonNB:2299 這樣就可以了。

之後再在哪邊都可以 sync 得到我的 tomboy 了。

2008/06/11

[Linux] Ubuntu Atheros 無線網卡問題

作個小書籤一下:Ubuntu Atheros 無線網卡問題

換 kernel 到 2.6.24-18 之後無線網卡就找不到了,不知道是怎麼回事,不過按上面的動作下去做,無線網卡就又回來了。

// (^ ^!) 好想換到有 monitor mode 的網卡上面玩哦~ 嘿嘿嘿

20080810 更新:
wget "http://snapshots.madwifi.org/special/madwifi-hal-0.10.5.6-r3698-20080604.tar.gz"
tar xfz madwifi-hal-0.10.5.6-r3698-20080604.tar.gz
cd madwifi--hal-0.10.5.6-r3698-20080604
make
sudo make install
sudo modprobe ath_pci

2008/06/04

[Programming] 程式寫作十點常見錯誤提醒

下面十點是我也常犯的程式寫作的錯誤,大部份的情況是 javascript 上面的,不過寫完了之後覺得在其它程式語言上面也適用,所以就擴大解釋條文(... 不是釋憲...):
• 不一致的 function 命名原則 (camel, c style, SVO, VSO...)
• 不一致(重複)的變數命名
• 不一致的檔案編碼(big5 or utf8) 或檔案儲存格式 (包括換行記號及 endian)
• 重複的功能 (沒有模組化﹑不能合理的 reuse)
• document.write/innerHTML 的濫用 (用 document.write 的好處是快速建立,然而卻不好維護, content 也開始混亂)
• 不一致的 indent (2,4,8 都可以,但是要一致,也不該有除了 2,4,8 以外的 tabspace/expandtab )
• function 位置的混亂 (性質相近的 function 應該放在一起)
• 多餘的註解, 中文註解
• 過度依賴工具,忽略了基本元素: css 就是做樣板的基本工具。 (了解 css 的使用方式做出來的樣板才會"簡潔有力")
• 關鍵字的符號間隔 (style)

[軟體] VIM HTML/Javascript 有 bug

最近在做網頁上面的工作,遇到了一些小問題,所以很自動的開始找這方面的解決方式:
像是我的 vim 在 HTML/javascript indent folder 上面有很明顯的失誤:



從上圖你可以看得到 javascript syntax 在第一個 function 之後就已經不正常了。
(要這樣玩,好像還不如把 syntax 關掉或 fdm 關掉了。)

看起來要多找點資料來確認 vim 的問題。
--
順帶一提,我找到了這個東東,不過是跟 vim 無關的 js libtool :
Yahoo Ui的介紹。
* 這種投影片的方式很棒。不需要 powerpoint 又很適合帶著到處跑。
* Yahoo UI 我只擔心它有沒有 browser 相容的問題。

// 不過小囧的是,它的 page 17/18 重複了,應該是少了什麼?

2008/06/02

[軟體] IE DOM 有臭蟲

很久沒有玩網頁設計了,這次的工作內容在網頁設計上面有很多牽連。一段時間沒玩,很多工具用起來都不趁手,還好我的小狐狸裡面有 firebug 可以用,所以還找得出很多問題點。不過可惜, IE 是不可能偏廢的。所以還是需要 IE Developer Toolbar 之類的工具配合,找出 IE 的問題點。像上面的截圖,其實是記錄在 IE DOM 底下 setAttribute maxlength 無效的情況,明明已經設到 5 了,不過還是會打到 n 個字元去。


沒有辦法,只好,再用上 onkeyup = function(event) {} 抓value.length 來處理這個情況,只是…真的蠻醜的。

Updated 20080605:
This is not a bug to IE DOM.
DOM In IE , it uses "maxLength" to set maximum length. However, it wont bothers firefox developers. Because it is not case-sensitive in firefox.

2008/05/27

[Programming] 我的 if else 跟別人不一樣...

因為我認為

if (condition)
{
}

如果隔很遠才看到 else
會發生意外
所以我的 else 一定跟 "}" 要接在一起
沒有人可以把他們分開

說的是,我的 code style :

if (condition)
{
# do sth
} else
{
# do sth
}


不過同事說, else 接在 "}" 後面,會讓他忽視掉 else 的存在。
靠,正好跟我相反....

[軟體] Firefox 3.0 很糟

不只是這邊有很糟的使用經驗回報,我也在體驗過 Firefox 3.0 b5 之後,放棄了 b5 (因為不明原因的常常 crash , 不管是在 Linux 還是在 Windows XP 上面都一樣)

然而最近的 3.0 rc1 釋出之後,我又跑去試了 rc1 ,結果比之前更加嚴重,令人沮喪。 crash 發生的頻率讓人不禁懷疑這個版本的釋出,是否有經過了足夠的 debug 測試。

[Linux][軟體] Git-svn 使用簡單介紹

這個 git 版本控管軟體出來一段時間了,不過因為作者是 Linus Torvalds,所以一來說,他寫 code 的功力很好,所以軟體品質不錯,二來也是因為他的名氣的關係,所以這個軟體在 Linux 上面的支援很多(??) (Win32 的 git support 很少,不過可以參考一下)

這邊要來介紹的是 git 在 svn 上面的一個過渡應用(git-svn),以及在 git 和 svn 之間的比較:
首先說明,這個應用方式的好處在於:
1. 保留 svn 的優點, svn 有一堆 properties 給我用的很高興,像 keywords 、很簡單就可以設定好的 ignore list 、 executable 、 permission、 ownership -> 所以 repo 用的是 svn 。
2. 比 svk 快。 (svk transaction 式的通訊方式,做到一半掛點會從頭再來過,如果這個 commit 一次是上 Giga 的量,掛點時,我想你會很想哭,因為記憶體也吃很多, performance 還是一樣的爛。 Git 就好多了。)
3. 分散式的 repo ,所以你可以在 local commit 了,測試完成,才 "merge" 到 server 上面。(merge 是用 svk/svn 的用詞)

用法介紹:

在開始動作之前,我們先來搞個小動作,寫一些東西到 $HOME/.gitconfig
[user]
name = Anton Yu
email = xxxx@gmail.com
[color]
diff = auto
status = auto
branch = auto
[alias]
st = status
rb = svn rebase
ci = commit -a
co = checkout

這些東西包括了 alias, 個人的 email 還有 git 的 colordiff 等等設定。

$ mkdir gtalkbot 先找個地方來放 code
再找出 svn url 來,像是
https://gtalkbot.googlecode.com/svn/trunk/
執行:
$ git-svn init https://gtalkbot.googlecode.com/svn/trunk/ gtalkbot/
$ git-svn fetch


做完你就會發現你已經有一個 .git 的目錄在這裡了,不過跟 svn 不一樣的是,它並沒有每個子目錄都放 .git ,只有這個 root dir 放了一個 .git 而已,所以你可以很輕鬆的做到 (export) 的動作,而不需要特別的指令。

更新時,請下 git rb (就會自動執行 git svn rebase)
刪除檔案,請下 git-rm $file
新增檔案,請下 git-add $file
commit ,請下 git-svn ci
commit 到 svn 底下,請下 git-svn dcommit

不過 props 在 git 底下連 "svn:executable" 都失效。 所以不建議 svn 的使用者在沒有考慮周祥之前就轉移過來這個 SCM 管理平台。畢竟它的軟體生命才剛開始而已。
--
參考指令列表:
* 指令列表
* SVN 與 git 對照表

2008/05/26

[新聞] Skype 撤回了 GPL 在德國高等法院的上訴

Skype 違反 GPL 許可證的官司 在德國法庭判決 Skype 公司敗訴之後, Skype 繼續上訴到德國高等法院去。然而,因為 skype 無法提供足夠的證據證明自已沒有違反 GPL 之後,終於在 5/12 日,Skype 宣布撤回這次的上訴,並且願意與 FSF(自由軟體基金會) 達成和解。 (消息來源)

在這場官司裡面,值得注意的是 SMC 是台灣廠商。

順便一提: Harald Welte (Linux 核心開發人員, 德國工程師) 五月剛從台灣回來,對台灣民眾的印象也是很好。不過對台灣這邊對 GPL 的不了解,應該是感覺很~ 累,要多花力氣來教。 (? 這是還會再來台灣玩的意思嘛? 歡迎啊~)

--
參考連結:
German courts convicts skype for breaching GPL
Skype respongs o Euro GPL rebuke
与Skype的违约诉讼大战 GPL再次取得胜利

2008/05/20

[Linux] Linux 上面聽 Hinet 廣播

嗯,還是習慣在 Linux 上面工作。不過聽廣播的習慣不隨著 Hinet 改版而不能收聽的最好方式:
還是回歸到看網頁上的 Hinet Radio 選單。

Linux 使用者可能會抱怨 Firefox 不能聽之類的,不過晚上在使用 opera 9.5b2 做~ 某些事情的時候,發現它解析 hinet 的 swfobject 其實是 okay 的,所以可以直接下載 opera 9.5b2 就可以順利收聽 Hinet Radio 了。

當然,這不會是我心中的最佳方案。不過,總還是一個解決方案就是。

--
更新:
PCMan 的 Hinedo看起來是不錯的解決方案。

2008/05/18

[Linux] Ubuntu LCD 亮度問題

唔,這個問題在我在新的 Asus X80L 筆電灌 Ubuntu 時發生了,情況是,每次開機 LCD 的亮度都會變得很暗,都還要另外按 FN + F6 來調整 LCD 亮度。

Ubuntu 中文論壇 上面有看到類似的問題。但很可惜,沒有答案。

所以再用英文去尋找,果然給我找到了一些線索:
1. 可能是 hal 的問題
2. 也有可能跟 kernel 有關?

不管怎樣,這不是我想花時間的地方。
所以我用 2 的方法,在 /etc/rc.local 加上一行
echo -n 8 > /proc/acpi/video/VGA/LCDD/brightness

應該這樣重開機就好了。

[Linux] SSH Key 更換作業...

Rex的 blog 這邊有寫到 "該換 ssh keys 了" 。

Debian 的通報在這邊
簡單的說就是:

SSH Key 出了很嚴重的安全問題。這個安全問題會讓 ssh 的 key 可以猜測得到。為此,我們必須更換 ssh host key 跟 private key 的部份。

host key 的部份是
rm /etc/ssh/ssh_host*
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ""
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""


private key 的部份更換跟一開始製作 private key 是一樣的。
Tsung 的部落格上還有記錄。
為了使用SSH加密傳輸且不需要輸入密碼

1.#cd /root/.ssh (進入到/root/.ssh/ 目錄下)
2.#ssh-keygen -d (產生ssh的公鑰和私鑰)
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): (產生到何處.按Enter 就可以了)
Enter passphrase (empty for no passphrase): (要不要設定passwd.避免問我們按Enter 就可以了)
Enter same passphrase again: (再按一次Enter)
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.

此時目錄下會產生公鑰id_dsa.pub和私鑰id_dsa
現在要把id_dsa.pub丟到192.168.0.2 並且更名為 authorized_keys

3.#scp id_dsa.pub 192.168.0.2:/root/.ssh/authorized_keys
root@192.168.0.2's password:
id_dsa.pub 100% |*****************************| 613 00:00

試試看 ssh 到server 應該就不用輸入密碼了
4.#ssh 192.168.0.2
#exit (記得離開)

--
參考連結:
Manually unpacking a tar ball of Debian on NSLU2
該換 ssh keys 了
Debian.org 的安全通報

2008/05/15

[Programming] True or False ??

因為觀念不好,所以在實作的時候常常會有很迷惑的時候。
譬如說,像 TRUE 跟 FALSE 是什麼情況,這應該是很簡單的常識。
但是,我卻常常搞錯。

在我的認知裡頭, 0 is false.
1 is true.
或著說 above 1 的都是 true;
不知道是哪個地方來的,所以這篇要厘清一下,不然以後會再發生。
很簡單的實作:
test = 1;
if (!test)
{
printf("1 is false\n");
} else
{
printf("1 is true\n");
}


./test
NULL is false
-1 is true
0 is false
1 is true


--
我想起來了...
// SHELL 裡面常用 0 代表 SUCCESS, 1 以上都是 ERROR_CODE 。

2008/05/12

[Linux] VMWare Server 在 Ubuntu 8.04 上面跑不起來

/tmp/vmware-config0/vmmon-only/linux/driver.c:1659: error: ‘struct mm_struct’ has no member named ‘dumpable’
make[2]: *** [/tmp/vmware-config0/vmmon-only/linux/driver.o] Error 1
make[1]: *** [_module_/tmp/vmware-config0/vmmon-only] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-16-generic'
make: *** [vmmon.ko] Error 2
make: Leaving directory `/tmp/vmware-config0/vmmon-only'
Unable to build the vmmon module.

看起來像是 VMWare 2.6.24 還沒支援到的關係。
去 google 底下找 vmware server ubuntu 8.04 就找到了答案
感謝前人種樹,讓我這個後人可以乘涼。
先做wget http://vmkernelnewbies.googlegroups.com/web/vmware-any-any-update-116.tgz
tar -zxf vmware-any-any-update-116.tgz
cd vmware-any-any-update-116

sudo ./runme.pl
sudo vmware-config.pl

最後是:
cp /lib/libgcc_s.so.1 /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1
這樣應該就可以了。

不過 http://vmkernelnewbies.googlegroups.com/web/vmware-any-any-update-116.tgz這個網址並不是一直都可以抓得到的,不確定問題點。所以怕以後抓不到,先做一個備份點

2008/05/02

[Linux] Bash 的回傳值好奇怪喔...

這邊,好像很多標準嗎?
在寫 script 的時候參考 xinted 的 script 看到了:
test -x "$DAEMON" || exit 0
*)
echo "Usage: /etc/init.d/xinetd {start|stop|reload|force-reload|restart}"
exit 1
;;

# [略]
esac

exit 0

真奇怪,如果沒有 daemon binary 存在時, return 0
如果執行參數不符合預期 return 1
如果都做完了 return 0

第一個,沒有 daemon 在的時候還有這個 script 應該是有問題才對啊.. 怎麼會 return 0 呢?我的習慣在 bash 底下是有錯誤就 return 1 以上的值,沒有錯誤才 return 0。

嘖... 反而是這種很簡單的事情在思考...

2008/04/27

[Linux] Command-no-found is a bad idea.

話說 Ubuntu Linux 有一個動作是,當你打到一個命令是不在路徑裡面的動作,就會自動去尋找這個 command 「可能」是某個套件未安裝,並提示你該安裝哪個套件來追加這個指令。然而... apt-file search 是需要時間的。所以如果有一個笨蛋常常打錯,例如我常常 exit 打成 exiz 的話,它就會在我打錯之後再花上幾秒鐘來確認我做了什麼事…告訴我, exiz 是不存在的指令。

這真的... 不是一個好主意。會用 command line 的人,應該就有 command line 的基本常識了,根本用不著這樣玩。如果真的找不到,我也會用 apt-file search filename 去找,所以,我直接 vi /usr/lib/command-not-found ,讓第一行就 exit。

這個故事告訴我們,在這件事情上面還是自由軟體好~ 起碼我可以自已去追,自已去改。

2008/04/25

[軟體] Windows 底下的 VIM

話說,最近換了工作,所以工作平台從 Linux 換成了 Windows XP ,工作環境的轉換對我來說其實有蠻多地方不方便的,雖然說是 Windows 笨笨的 GUI 用起來沒有什麼「問題」,不過「習慣」對我來說是已經很深的 Linux 作業習慣依賴,現在換到 Windows 上面,還真的有很多不「爽」的地方。

最明顯的例子是在 Linux 底下 Command Line 的回應速度是比較快的,但是在 Windows 底下,要用 Command line ,要嘛就是 cygwin 這個終究不是 GNU Software 的傢伙,用起來都是舊版的 gnu ap ,很多地方都跟現行版本不一樣 (ex: screen的中文) ,一整個不能接受,中文問題也是一堆。用 putty/pietty 連到 vm/remote 都是會慢上好幾步。

這不是重點,重點是今天要來記錄 vim 在 windows 底下的字體設定。

話說, Windows 底下也有 gvim 可以使用,可以連到 vim 的官網下載,下載時可以選擇 "Self-installing executable gvim##.exe gvim71.exe" 的版本來安裝,這個版本會裝上 GVIM ,裝好之後你會發現你很討厭它的 default 底色 (我習慣黑底白字),很討厭它的字體設定 (我近視 450~500 ,但是最近體檢竟然說我視力矯正後是 1.5 建議我重配眼鏡...這不是重點)

配色的部份可以在你的 vimrc 裡面下:
colorscheme darkblue
就可以更換配色,字體大小的部份要下
set guifont=MingLiu:h22:cCHINESEBIG5

"細明體" 不能用,還不知道不知道原因。 h22 就是 22pixel , c 後面是編碼。
要試的時候可以先換成 cANSI。

然後一樣有 global vimrc/gvimrc 的問題。

2008/04/13

[軟體] SSH 密技

本文參照這裡
SSH 是很好用的工具,要調整它,你可以先嘗試修改「一兩」個設定檔:
大家一起改,請修改: /etc/ssh/ssh_config
只改自已的,請修改: $HOME/.ssh/config

1. 平常的連線


平常我們的 ssh 連線大概是這樣下:
$ ssh user1@server1.example.com
不過現在你可以修改你的 config 變成:
Host server1
Hostname server1.example.com
User user1

然後你之後連 server1 時,就只需要下 $ ssh server1 就可以了。

如果有 dsa/rsa key 的認證授權的連法呢?


平常的連法大概是這樣:
$ ssh -i ~/.ssh/id_rsa_server2 user2@server2.example.com

不過同樣的,現在只需要修改你的 config :
Host server2
Hostname server2.example.com
User user2
IdentityFile ~/.ssh/id_rsa_server2


你就可以只要 $ ssh server2 就可以了。

那如果是 port forwarding 那種呢?


我的工作,常超時在加班,有時公司為了安全因素沒給 vpn 的帳號密碼,自已也懶得申請還要什麼安全切結之類的很煩,所以都直接自已拉 ssh port forwarding 出去,再從家裡連回來就好了,這種情況,會不會很難搞?
平常大概是這樣下:
$ ssh -L 8888:127.0.0.1:7777 -i .ssh/id_rsa_server3 user3@server3.example.com

現在一樣,在你的設定檔底下填寫:
Host server3
Hostname server3.example.com
User user3
IdentityFile ~/.ssh/id_rsa_server3
Localforward 8888 127.0.0.1:7777


回應 jserv 的"對自己好一些:談技術手冊閱讀",這篇的末尾也提醒你一下,如果有別的需求,可以去 man ssh_config 喔~~~

2008/04/12

[Programming] pidgin 的回應好奇怪...

這幾天在 gtalk 上的同學一直抱怨我的帳號常常「不小心」就離線了,今天心血來潮跑去追了一下,結果看到 pidgin 底下的回應是:
(20:11:58) jabber: Sending (ssl): <iq type='get' id='purple51e6de60'><ping xmlns='urn:xmpp:ping'/></iq>
(20:11:58) jabber: Recv (ssl)(218): <iq type="error" id="purple51e6de60" to="anton.tw@gmail.com/HomeD65FEDFF"><ping xmlns="urn:xmpp:ping"/><error code="501" type="cancel"><feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>

所以是 gtalk server 那邊回應不接受 ping 的關係嗎?那它要怎麼做 timeout 的功能?回頭看 presence 標籤裡面的 properties ,結果看到了:
<presence from="□□□101@gmail.com/Talk.v931FF9ED3B" to="anton.tw@gmail.com"><show>away</show><priority>0</priority><c node="http://www.google.com/xmpp/client/caps" ver="1.0.0.93" ext="voice-v1" xmlns="http://jabber.org/protocol/caps"/><x stamp="20080412T12:15:13" xmlns="jabber:x:delay"/><status/><x xmlns="vcard-temp:x:update"><photo>5850433266035408e7a5eb19dc39da27db689592</photo></x></presence>

所以是用 presence 裡面的 stamp (UTC time)來做 timeout 的功能嗎?
// 等下用機器人再確認一下。

--
補書籤: Pidgin開發指南

2008/04/11

[Linux] Canon iP1200 印表機在 Linux 上面怎麼用?

這邊是出處
翻譯翻簡單點,就是: 請用 iP2200 代替 iP1200 ,因為 Canon 不給 1200 的 driver。

另外要再調整一下:
$ echo "deb http://mambo.kuhp.kyoto-u.ac.jp/~takushi/ubuntu ./" >> /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get install libcnbj-2.6 bjfilter-2.6 pstocanonbj

這樣才真的印得出來。

// 買印表機,不建議買 Canon 的,要買,請先查一下型號... 還有墨水匣還有沒有在賣,一顆多少銀兩。

[軟體] OXIM 一鍵安裝

在 Linux 連線板上看到的,作文的作者跟內容如下:
作者 Maxsolar.bbs@OfO.twbbs.org (Astro v.s. Geo),
#!/bin/bash
#this is an automatic oxim installation script for debian/ubuntu users,
#please visit http://opendesktop.org.tw/demopage/oxim/
#for more detail.
#special thank for firefly.
apt-get install im-switch autoconf automake libtool build-essential debhelper libgtk2.0-dev libqt3-mt-dev libchewing3-dev libxpm-dev libxtst-dev libxft-dev fakeroot cvs -y --force-yes &&
cvs -z6 -d :pserver:anonymous@opendesktop.org.tw:/misc/cvs co oxim &&
cd oxim &&
sh autogen.sh && ln -s doc/debian &&
chmod 755 debian/rules && dpkg-buildpackage -b -rfakeroot && echo
echo "Compiling Done! Now installing OXIM on your system !"
echo ""
dpkg -i ../oxim*.deb && im-switch -s oxim -c all_ALL
echo ""
echo "Now enjoy OXIM as you wish!"


上面的動作簡單的說是:
0. apt-get install 打包的相依 (build essential 不知道有沒有相依在裡面了?)
1. cvs checkout source
2. 安裝 + im-switch

cvs 裡面的 oxim 最讓我高興的是, oxim_1.1.3 沒有辦法固定 xcin default style,到這個版本就有了。感謝上述作者,也感謝 oxim 作者 firefly 辛苦的工作。

2008/04/07

[閱讀] 人月神話書評

這篇首先要說的是「人月神話」這本好書:


做為一個程作寫作人員,總是常常在抱怨公司上面一群人在胡搞瞎搞根本沒搞清楚軟體專案的本質是什麼,總是還用二三十年前設計製作機器的概念套用在軟體設計上面。一個工程師不夠用,那就多派兩個唄。不知道,原來人月的概念在軟體專案上面不僅僅是一種不可思議的想法,簡直到了神話一般的境界。

如果您是同我一樣在程式寫作上面有興趣的朋友,推薦您來看看這本書,它會讓您更明白自已在軟體專案管理上面的缺點。如果您不是程式寫作人員,但希望加強軟體專案管理上的概念,也推薦您來讀讀這本書,簡單而清楚的文筆,讓人一看就可以發出會心的一笑,頓時就明白了,原來軟體專案是這麼一回事。

Google 圖書搜尋裡面可以很輕鬆的找到這本書,並且使用裡面的預覽方式加以閱讀好幾個章節,不會因為只有書皮,而不知道裡面到底是在說什麼。

另外旁邊的側邊欄也可以找到有在販賣這本書的書商,對於書商來說是一個蠻不錯的服務。然後會不會就此就說是圖利書商了呢?下面這張圖應該可以解決一部份我們的疑惑:

答案是:並不會。

Google 圖書搜尋和全球多間大型圖書館合作,透過 isbn 編碼的關係,可以一致的圖書編碼底下在各圖書館底下進行搜尋,就算我是一個窮小孩,我也可以很輕鬆的在圖書館裡頭找到我想要看的這本書。(沒有這本書的話,當然就是每季的建議書單囉~)

:) 小猴子回國也建議多使用這項便利又不市膾的服務。

2008/04/06

[資訊安全] 小心防毒軟體變病毒傳播軟體

上篇 flickr 的抱怨剛發表完,馬上就有人回意見到我的 blog 上面了,我查看了一下它的留言,結果看到:
呃!! 我不讓人家點,所以只留下疑似病毒/廣告軟體的網址。
SECURITY CENTER: See Please Here

總之,點擊下去之後,它就說我中了病毒 (還是 Win32 / windows 特有的病毒 的呢)




結論是,這年頭,詐騙集團還真多,千萬不要信以為真啊。

--
註: 作者用的是 Ubuntu Linux + Firefox ,Win32/Windows 病毒在上面很難發作。成功的機率趨近於 0 ,成功的人大概可以因此拿到 google summer code 大賽的獎金好幾次吧。

[Programming][Kernel] 核心中支援同步的方法

前面我們提到過競爭情形(race condition)的原因和它的解決方式。底下我們要來討論另外一種可行的方案: atomics operation (獨立完整運算)。它所提供的是一氣呵成的指令執行環境,在執行的時候不會因為其它的事務干擾而導致中斷的發生。它的情形會如同原子(atom)一般被視作為一個不可切割的整體。

整數運算


在執行 atomic 整數運算時,只能用使特殊的 atomic_t 資料型別上面。相對於直接使用 C 語言的整數型別而言,會這麼做是有理由的。首先,為了讓 atomic 函式只接受 atomic_t 型別,可以確保這類函式只能用於特定資料。同樣的,也可以避免這種資料傳給其它不是 atomic 函式來使用。其論點在,如果資料的使用過程中不能一致進行 atomic 操作的話,採用的資料又有什麼意義呢?再者,使用 atomic_t 型別資料可以確保編譯器不會自作聰明的進行最佳化的存取方式,對 atomic 運算而言,取得資料的正確位址,而不是使用位於暫存器中的分身的這一點,是相當重要的一件事情。最後,使用這個型別的資料,則可以隱藏在實作上面與平台相依的問題。

雖然在底層實作上面還是採用整數來運算,且在所有 Linux 支援的平台上面都有 32bit 的寬度限制,不過 Linux 曾為了 sparc 平台一度限定 atomic 的資料存取不能超過 24 bit。(容後再補)

atomic_t 的變數定義方式和一般沒什麼兩樣,我們也可以先為它作點初始化:

atomic_t v;
atomic_t u = ATOMIC_INIT(0);


運算的方式也很算單:
atomic_set(&v, 4); /* v = 4 */
atomic_add(2, &v); /* v=v+2 */
atomic_inc(&v); /* v=v+1 */

如果想將 atomic_t 型別轉換成為 int ,可以使用 atomic_read() 的函式。
printf("%d\n", atomic_read(&v));

Atomic 整數常用於計數器 (counter) 設計上面。用複雜的鎖定機制保護計數器過於無聊,所以核心成員採用了 atomic_inc () 與 atomic_dec() 等輕量級的函式,系統負荷也得以減低一些。
完整的函式列表可以參考: asm/atomic.h 這個檔案。

作用在位元上的 atomic


除了整數運算之外,Linux 核心也提供了一組運作在位元層次上的 atomic 運算函式。當然,這些函式都跟硬體架構無關,可以在 asm/bitops.h 底下找到相關的資訊。值得註記的是,這些函式的操作對象都是一般的記憶體位址,所使用的參數有兩個,一個是指標,另外一個則是以位元為單位的偏移量。以下是一個簡單的範例:
unsigned long word = 0;
set_bit (0, &word);
set_bit (1, &word);
printk ("%ul\n", word);
clear_bit (1, &word);
change_bit (0, &word);


註:當然,上面這些操作也有 non-atomic 的版本。可視個別需要來使用。

Spin Locks


要是每個關鍵區域的運算都是遞增運算的話,我們的工作可能就會輕鬆很多,可惜,現實往往不是這麼簡單;也因為這樣,所以我們需要一個同步運算的機制: locks。而在 Linux 核心當中,最常出現的同步鎖,就是 spin lock。這種鎖一次只能被一個執行緒所持有,如果某個執行緒嘗試爭奪 (content) 一個已經被其它執行緒所取走的 lock,它就會開始進行忙碌迴圈(kbusy loop)的情況,意同名稱中所提到的 spin 。這種空轉的機制可以確保在同一時間內只有一個執行緒可以拿得到這個鎖。了解到這點,我們必須先明白,在同步鎖的爭奪上面也同樣會導致執行緒的空轉,進而導致了系統資源上的浪費,這就是 spin lock 的本質,它只是一個輕量級的方案,長時間的執有動作,也是我們應該避免的行為。

spinlock_t mr_lock = SPIN_LOCK_UNLOCKED;
if (spin_is_locked())
{
// 等待 sleep;
} else {
spin_lock(&mr_lock);
// do sth
spin_unlock(&mr_lock);
}


這一章還有許多有趣的小節沒有在本文裡面提到,我們稍後再回過頭來檢驗。

2008/03/17

[軟體] Inkscape 0.46 釋出了

Inkscape是很好用的向量繪圖軟體,最近釋出了新版。不過官網上面也丟出了翻釋文件的統計:

zh_CN: 90%
zh_TW: 65%

真糟,等回來要再去幫忙一下才對~
--
附上連結:
autopackage
svn:
svn co https://inkscape.svn.sourceforge.net/svnroot/inkscape/inkscape/trunk inkscape

[Linux] Grub 跳到另外一個 grub 開機

這篇很簡單,可是我不會,所以做個記號一下:
我們通常是把 grub 放在 MBR 底下的,不過像是 LiveUSB 那種東西,或有其它的需求的話:
#Entry for Linux 2 bootloader
title Linux 2 on /dev/sda4
root (hd0,3)
chainloader +1


--
* 註1: 原網址:
RobMLee 提到的:
如何製作帶著走的ubuntu 7.04,需參考以下兩篇文章(兩篇都要看完):

(1) 如何把ubuntu 7.04(完整Linux系統,非Live CD)裝入隨身碟中(傻瓜必勝版)
URL: http://www.wretch.cc/blog/billypan101&article_id=8891814

(2) 把我們的 Ubuntu 7.04 USB 隨身作業系統改造成任何電腦都能開機
URL: http://www.wretch.cc/blog/billypan101&article_id=8962479

[Linux] Linux 上面的檔案救援

最近在處理檔案救援(undelete)的工作,所以找了不少軟體(R-Studio, recuvia) 來處理,不過說真的,也不知道這些軟體在做些什麼事情,所以做起來格外的心虛,畢竟是 windows 的軟體。所以最後還是去看了一下,在 Linux 底下手工的技巧:
(以下都是摘要人家的內容)

1. 先 mount -o remount,ro /dev/sda1
2. 再來 debugfs /dev/sda1
# lsdel
debugfs:lsdel
debugfs: 2692 deleted inodes found.
Inode Owner Mode Size Blocks Time deleted
164821 0 100600 8192 1/ 1 Sun May 13 19:22:46 2001
# dump /tmp/xxx.sav


或用 mi 來處理
debugfs:mi
# 把deletion time改成0(未删除),Link count改成1。改好後退出(quit)
# 再下 fsck /dev/sda1 就會跑到 lost+found/ 底下了。


一個檔案在 ext3 底下的分布情況如下:
filefrag -v icon.png
Checking icon.png
Filesystem type is: ef53
Filesystem cylinder groups is approximately 85
Blocksize of file icon.png is 4096
File size of icon.png is 25311 (7 blocks)
First block: 1003570
Last block: 1007890
Discontinuity: Block 1 is at 1003574 (was 1003570)
Discontinuity: Block 5 is at 1007882 (was 1003577)
Discontinuity: Block 6 is at 1007890 (was 1007882)


* 每一個檔案配置(至少)一個 inode 來記錄它裡面存放的資料(metadata)和 block index。小於 12 個 block 的文件,只配一個 inode ,大於的,就直接在 inode 後面再串接下一個 inode 的位置。(註~ 看不大懂,回去翻書)

換句話說,我們也可以用 dd 也可以反刪除救回檔案:
確認 block size :
tune2fs -l /dev/sda1 |grep -i 'block size'
Block size: 4096

dd if=/dev/sda1 of=xxx.sav.1 bs=4096 count=1 skip=103570
1+0 records in
1+0 records out

dd if=/dev/sda1 of=xxx.sav.2 bs=4096 count=1 skip=103574
1+0 records in
1+0 records out
... # block 數量愈多,愈麻煩...


vfat 上面的處理 (對記憶卡/flash 也有用)
dosfsck sdc1 -v -r -u filename

--
參考連結:
ext3 的檔案系統介紹
大陸的論壇討論 ext2/3 的部份
ext3的反刪除動作: 用 dd 就可以回復了
--
與本篇無關的附記:
* Ext3 的特點
日誌系統
(效能慢,但風險小)原資料和檔案內容都在提交到主檔案系統前寫入。這樣將提高穩定性但性能上有所損失,因為所有的資料都要寫入2次。這個動作是為了防止像 kernel panic 或突然斷電的情況發生時,會讓系統上的資料與索引(metadata)發生不一致的情況。

反刪除
和ext2不同,ext3將把被刪除檔案的i節點(inode)中的塊指標(block index)清除。這樣做,在(unclean)載入檔案系統後,重放日誌時,可以簡化對檔案系統的訪問。但這造成了檔案在反刪除上的難度。用戶唯一的補救是在硬碟中grep資料,並且要知道檔案的起始和結束信號。這提供了比ext2在刪除檔案上稍微高一些的安全性,或許這中安全既是優點也是缺點。

Ext3在寫入日誌時,並不做校驗比對(checksum)。如果barrier=1沒有作為載入時的參數(在檔案/etc/fstab 上的參數,或 mount 時的選項),且硬體又是無次序的寫入 buffer ,在系統 crash 時會嚴重損壞檔案系統(該選項在大多數流行的Linux發行版中都沒有被啟用,所以大多數發行版的處境都很危險。)

2008/03/13

[Linux][bash] 在 Shell 底下抓亂數的方式

rand () {
ANS=`dd if=/dev/random bs=2 count=1 2>/dev/null|hexdump -d|awk '{print $2}'`
}

rand
ANS=`expr $ANS \% 100`

這樣好像蠻直接的,不過應該沒有什麼問題。

2008/03/11

[軟體] Firefox 3.0 beta 4 釋出特點記錄

Firefox 3.0 Beta 4 包括了之前的 900 個改進點,像是在效能上的改進﹑記憶體使用量上的改善﹑當然也改善了穩定性﹑平台上的版本改善﹑操作介面更友善等等改進點,這些都會加入這次的 Beta 4 釋出裡面。

以下列出 Beta 3 ->Beta 4 的改進點:
# 新的 download manager
# 整頁縮放
# 和 Vista 的整合
# 和 Mac 的整合
# 和 Linux 的整合
(就是使用原生的布景主題,這樣看起來不會再那麼突兀)
# Location Bar 跟 Toolbar 上面的改善,現在是依據你訪問這個頁面的頻率來做自動完成的部份。(加入自動學習的功能)
# Javascript 變快。
[Improved in Beta 4!] Speed: improvements to our JavaScript engine as well as profile guided optimizations have resulted in significant improvements in performance. Compared to Firefox 2, web applications like Google Mail and Zoho Office run twice as fast in Firefox 3 Beta 4, and the popular SunSpider test from Apple shows improvements over previous releases.

# 記憶體使用量減少
[Improved in Beta 4!] Memory usage: Several new technologies work together to reduce the amount of memory used by Firefox 3 Beta 4 over a web browsing session. Memory cycles are broken and collected by an automated cycle collector, a new memory allocator reduces fragmentation, hundreds of leaks have been fixed, and caching strategies have been tuned.


這邊直接從官方下載

2008/03/10

[軟體] Gnome-terminal 跟 rxvt-unicode 哪一個比較「好」?

最近看到這篇文章 "rxvt-unicode快速上手",雖然自已以前就寫過 [Linux] URxvt 的設定不過一些疑問其實沒有仔細去追查過。 特別是 2006 年到現在,自已偏好的 term 從 rxvt 也跟著 因為使用 ubuntu 的關係,所以變成使用 gnome-terminal 。

我的問題在兩個重點:
1. rxvt-unicode 跟 gnome-terminal 誰比較快? (kconsole 不用比了,在不是 kde 的環境底下, kconsole 一定慢很多的)
我作的測試如下~
版本:
ii rxvt-unicode 8.3-1
ii gnome-terminal 2.18.2-0ubuntu1

顯示效能測試:
time cat /home/backup/Community/UNLiu/trunk/UNLiu.cin
這樣就知道 term 上面顯示完這個 cin 檔需要消耗多少時間。








 rxvt-unicodegnome-terminal
第一次real 0m9.510s user 0m0.008s sys 0m0.072s real 0m10.393s user 0m0.000s sys 0m0.064s
第二次real 0m3.084s user 0m0.004s sys 0m0.072s real 0m3.425s user 0m0.000s sys 0m0.080s
第三次real 0m2.961s user 0m0.004s sys 0m0.124s real 0m1.740s user 0m0.008s sys 0m0.100s
第四次real 0m2.512s user 0m0.008s sys 0m0.088sreal 0m3.241s user 0m0.004s sys 0m0.080s
第五次real 0m3.122s user 0m0.000s sys 0m0.052sreal 0m2.984s user 0m0.000s sys 0m0.072s


再來,要比較系統資源上的損耗,我們下一個指令就可以:
$ ps -aux|egrep "gnome-terminal|rxvt"|grep -v grep
anton 4159 0.0 9.2 186496 46824 tty1 Sl Mar07 4:07 gnome-terminal
anton 4773 1.3 1.2 11004 6104 pts/1 S 13:43 0:00 rxvt-unicode


這樣,應該可以下一個結論是:
rxvt-unicode 在系統資源上面占用比較少, gnome-terminal 在顯示上面其實跟 rxvt-unicode 差不多ㄟ.....

2008/03/07

[Programming] Pidgin 的架構

最近翻 pidgin 的新聞公告的時候才發現,原來之前還有發過 pidgin 的簡略架構圖:


If you're a developer, even a new or inexperienced developer, and you'd like to help out Open Source Software or the Pidgin project but aren't sure where to start, picking a corner of the Pidgin architecture and documenting it (with the help of the Pidgin developers!) would be a great place to get your feet wet. As a bonus, when you're done you'll have the knowledge to start writing that feature you've always wanted!

如果你是開發者,(不管是有沒有經驗的開發人員),如果你想提供一些協助給開源軟體社群,或 pidgin 專案,不過不知道怎麼開始的話,你可以在 pidgin 的架構文件上面提供幫助。這裡還有很多需要你可以幫忙的空間。當你做完的時候,你會明白,只有當你做過了,想要的 know-how 才會真的成為你所擁有的一部份。

2008/02/29

[Programming][Kernel] 核心同步導論

共享記憶體的應用程式環境裡面,資源必須加以保護以免發生同時存取的情況。即便是核心的本身也不能例外。保護共享資源的目的,在於防止不同的「執行緒 (threads of execution)」同時存取或修改同一個資源,彼此間互相覆蓋修改資料或存友到還沒完成改變的狀態。因為並行競爭的關係,而導致系統變得不穩定,又非常難以追蹤,所以在程式寫作的一開始注意一些細節是很重要的習慣。

保護的重要性


保護記憶體的重要性 -> 同交易 Transaction 的重要性(略)

同步鎖定


同步鎖定可以提供所需要的機制:作用方式等同家裡的門鎖。關鍵區域可以比喻做門後的房間。這個房間一次只能容許一個人(執行緒)進入,當人進入房間,它會將身後的房門鎖上,對共享資源完成更動才會打開門鎖,離開房間。上鎖期間,如果有另外一個執行緒前來敲門,也只能在門外等候,如果裡面的人還沒有完事,就沒有辦法進入。這就是同步鎖的重要性:它可以避免並行存取 (concurrency) 並且保護佇列內的資料完整。

並行存取發生的原因


在用戶層,同步的需求來自於核心排程器可以主動決定應用程式的執行權。因此在任何時刻,程序都可能會非自願地在關鍵區域中失去執行權,換另一個程序使用處理器。如果這個新來的程序稍進入同一個關鍵區域(假設兩個程序都是一般的執行緒,存取一樣的共享資源),就會引發競爭的狀況 (race condition)。當多個單執行緒的程序分享檔案,或單一程序碰到系統傳來的「信號 signals 」時也可能產生類似的問題;因為系統信號會在不定時刻以「非同步」方式發生,這種並行處理並不是真的同時發生,而是因為切割執行時間導致的狀況,我們在這裡稱之為「虛擬並行 - (pseudo-concurrency)」。

在能進行對稱多重處理 (symetrical multiprocessing) 的機器上面,兩組處理器可能同時執行同一份關鍵程式碼。這種狀況稱為「真。並行處理 (true concurrency)」。雖然這兩種並行處理的語意和成因都不相同,但兩者都會導致相同的競爭情況,需要加以設想保護的機制。

核心也有類似機制可能造成並行處理的情況,分別是:

  • 中斷 (interrupts)

  • softirqs 與 tasklets

  • 核心先佔 (kernel preemption)

  • 休眠與用戶層同步

  • 對稱式多重處理


可以避免中斷程式並行干擾的程式碼被稱作「 interrupt-safe (對中斷而言是安全的)」。可以避免在對稱多重處理的機器上面出現並行干擾的程式碼被稱作為 「SMP-safe (對 SMP 而言安全)」。可以避免在核心搶占執行權後出現並行干擾的程式碼則叫「 preempt-safe 」。

哪些資料是需要鎖定保護的呢?大多數全域性的核心資料結構會需要。有一個簡單明顯的判斷法則是:如果其它執行緒可以存取同一組的資料,就需要用到同步鎖。如果其它人也可以看見這筆資料,就鎖上它。要記得是鎖定資料而不是程式碼。

每當撰寫核心的程式碼的時候,你後

  • 資料是否有全域的屬性?另外一個執行緒是否也可以存取它?

  • 程序環境與中斷環境是否共享這些資料?是否在兩個不同的中斷處理程序中共用?

  • 如果程序存取這份資料時發生了執行權的轉移,取得執行權的新程序是否會存取相同的資料?

  • 目前的程序是否會在某些情況下休眠 (暫停)?如果會,共享資源會變成什流狀態?

  • 有沒有辦法避免其它程序錯誤地刪除 (釋放) 使用中的資源 ?

  • 如果別的處理器同時使用這個函式,會發生什麼事?

  • 你打算在程式裡頭做什麼?

[Programming][Kernel] 中斷與中斷處理程式(1)

中斷簡述


核心的一個工作任務是管理週邊的硬體設備,不過由於核心處理器的科技進步發展,現在的處理器通常速度都比週邊快上好幾個量級,對於一些很慢的週邊,核心發出請求之後不應該空等它的回應,等它真的完成工作之後再回來處理相關的事宜。為了達成這個目的,其中一個做法是「輪詢 (polling)」的方式,來回一個週期的檢查週邊的狀態並加以反應。但是這樣做其實很花力氣,無論週邊有沒有完成任務,核心都還要花力氣去檢查。如果可以,讓週邊主動通知核心介入的時機,核心在其它的時間完全不用花力氣去理會,顯然比上述的做法要好上很多,我們稱之為「中斷(interrupts)」。

舉例來說,當你打字的時候,鍵盤控制器會發出中斷提醒作業系統要注意:有按鍵被按下了。這些電氣訊號就是中斷訊號。收到迅號後,處理器會通知作業系統處理新進的資料,週邊相對於處理器會以非同步的方式產生中斷,意即中斷可以在任何時間點發生。因此如要在中斷發生時能立即加以處理,核心也需要能隨時被打斷才可以。

每個週邊會連結到特定的中斷,而每個中斷會對應到一個特定的數值。作業系統得以藉此判斷訊號是由哪個硬體裝置所發出,進而採用不同的應用程式來加以處理。這些數值,如同電話號碼一般,代表的是不同的線路,所以又被稱作「中斷要求線路的週邊裝置(interrupt request lines),或簡稱為 IRQ lines。像 PC 上的計時器使用的中斷就是 IRQ 0 ,而 IRQ 1 通常會是由鍵盤所使用。

中斷處理程式


核心裡面用來處理特定中斷的函式叫做「中斷處理程式 (interrupt handler)」或「中斷服務例行常式」 (interrupt service routine 簡稱做 ISR )。每個產生中斷的週邊都會跟一個中斷處理程式相連。舉例來說,核心中可能會有甲函式專責處理系統計時器的中斷,而乙函式則負責處理鍵盤所產生的訊號。其實,對於週邊來說,中斷處理程式就是「驅動程式」的一部份,放在核心當中,負責管理該項硬體。

中斷處理程式一般都是 C 函式來處理,為了讓核心可以用一致的方式來傳遞資訊,這類函式的介面必須符合特定的原型(prototype),除此之外,寫法跟一般的函式沒有什麼兩樣。與其它的函式不同的地方在於中斷發生的時候,核心會用中斷處理程式回應週邊的請求,同時,他們的執行環境很特別,叫做中斷執行環境(interrupt context),簡稱做中斷環境,這一點晚點再來做詳細的介紹。

因為中斷隨時都會發生,所以中斷處理程式會隨時執行,為了能盡快的讓被打斷的程式回工作,迅速地完成處理是一件很重要的事情。所以雖然週邊硬體會希望它的中斷要求能盡快得到滿足,但是對系統其它的部份來說,被打斷的時間要越短越好。在極簡單的情況下,中斷處理程式只需要回應硬體,我得到你的通知了,這樣就可以讓硬體回去工作。但大多的情況下並不是這樣,中斷程式往往還有很多事情要做。舉網路裝置的中斷處理程式為例:除了回應硬體之外,處理程式還得把封包由網路硬體複製到系統主記憶體上面,稍加處理之後,再把資料傳給合適的協層 (protocol stack) 或應用程式。顯然,這是很麻煩的工作。(尤其在網卡資料量愈來愈多的現代高速網卡)

2008/02/27

[軟體] Firefox 的 temp dir

蠻討厭的一個情況, firefox 在 download 時會先 create 一個 temp file 出來,這個 temp file 不見得跟 download target 同一個目錄,所以如果 download dir 有空間, temp dir 沒有空間就出了問題。
所以把 firefox 需要的 tempdir 都先找過了:

autodownload 模式用這個
pref("browser.download.dir", "/root/");
pref("browser.download.downloadDir", "/root/");
pref("browser.download.useDownloadDir", true);


extension 底下應該是用這個 (未確認)
pref("mozex.general.tmpdir","/root/");

不過呢,上述都不是我前面想用的,真正的解是在 /usr/lib/firefox/firefox 這個啟動的 script 底下 export TMPDIR=/root/,另外 download dir 如果不存在,會走到 pwd 去,所以也可以順便在 export PWD 一下。

2008/02/26

[Programming][Kernel] 系統呼叫

系統呼叫是核心程式提供的一組介面,用來與用戶層 (user-space) 中的程序互動,應用程式透過系統呼叫可以存取硬體及作業系統所提供的資源。這面扮演著郵差般的角色,讓應用程式可以對系統提出各種要求,而核心程式收到要求後會給予回應,意即滿足或拒絕這些要求。這組界面的存在讓應用程式受到約束,不能為所欲為,這也是系統之所以可以穩定的重要因素。

系統呼叫如同中間層般的存在,讓硬體及核心與用戶層得以分隔開來,在 Linux 系統底下應用程式除了 exception (例外處理) 與 trap (一種由處理器所發出,可加以截獲處理的錯誤處理方式) 只能藉由系統呼叫與核心溝通。其它型態的介面像裝置檔案 (device nodes) 或 proc 檔案系統,最終也是透過系統呼叫與核心做溝通。

用戶層的應用程式沒有辦法直接使用核心層的程式碼這是系統呼叫裡頭一個重要的原則。所以應用程式必須利用某種方式通知通知核心,同時切換到核心去執行該功能。在這邊所指的機制,就是產生軟體中斷 (software interrupt),這會讓硬體隨後產生一個異常的狀況 (exception) ,進而啟用異常處理的中介程式 (expeption handler) 來處理。

以 x86 平台為例,軟體中斷可以使用指令 $0x80 觸發,觸發後就會啟動系統到核心層,執行第 128 號程式,這個程式就是前述系統呼叫中介程式中的一員,它有一個很直覺的名字,叫 system_call() 。由於處理方式和硬體架構相關,所以採用的是組合語言的形式,放在 entry.S6 檔案裡頭。 近年來, x86 處理器加入了一個名為 sysenter 的功能。與使用 int 中斷指令相比,這個功能提供了更快速專屬的方式,可以藉由這個方式進入核心層,執行系統呼叫。這個功能很快就成為主流的一部份。然而不管系統如何呼叫中介程式,最重要的還是在用戶層用例外觸發或 trap 的方式進入核心執行的方式。

2008/02/25

[Programming][Kernel] 程序的排程

一般排程演算法都是「根據程序優先序(priority-based)」來決定排程的方式。作法是:根據程序的價值和所需的處理器時間,將程序分成不同的等級。具有較高優先序的程序會比低優先序的程序先執行,而具有相同優先序的程序則會以 round-robin (一個接一個輪流,反覆這種過程) 的方式進行排程。在某些系統中(linux 也包含在內),高優先序的程序也會取得較長的執行時段。擁有可執行時段及最高優先的可執行程序總是會優先執行。使用者與系統都可以藉改變程序的優先序來影響系統的排程行為。 (賦予 nice 值)

基於這樣的想法, Linux 提出了「以動態優先序為基礎(dynamic priority-based)」的排程方案。它的概念是說,在一開始的時候賦予程序基本的優先序,然後讓排程器藉動態改變優先序的方式,來滿足想達成的排程目標。例如,如果某程序等待 I/O 的時間遠超過實際的執行時間,則這個程序明顯屬於 I/O 密集的類型。這時,按照 Linux 的做法,跟著的動作就是增加這個程序的優先序。反之,如果某程序總是一口氣就用完它被賦予的 timeslice ,則明顯是處於處理器密集的類型,跟著,它的優先序就會機動的減少。

# (優先序 nice 值,是愈低則分配到的 timeslice 會愈多,所以上文的優先序調高用的是「增加優先序(值)」而不是「調高優先序」,主要是因為中文裡頭的「高優先」,明顯是要先做,在文中容易引起歧義,故避免之。)

[軟體] Amsn (中文問題﹑ tls 問題修正)

這篇 作者應該是叫小菜吧?... 好可愛的名字。
這篇主要是寫來記錄 amsn 在中文問題上面的處理,其實可以直接下 fixamsn.sh 來處理,就好。

不過一來 fixamsn.sh 裡面的 amsn 不是最新版,所以一安裝完就開始哀說要更新新版,二來,在我的 gusty 上面裝好了之後, tls 不會自動安裝好,手動也還是有問題。所以索性開 fixamsn.sh 出來看,在 amsn 的版本上面是用 amsn-0.97RC1.tar.bz2 ,這行如果直接換掉,後面 tls 也不會有問題,版本也不用重更新了。
diff -u fixamsn.sh fixamsn.orig.sh
--- fixamsn.sh 2008-02-25 11:15:18.000000000 +0800
+++ fixamsn.orig.sh 2008-02-25 11:12:47.000000000 +0800
@@ -160,10 +160,10 @@
wget -c $SOURCEFORGE/tcl/tk8.5a6-src.tar.gz || error_exit "Could not download Tk source code."
tar -xsf tk8.5a6-src.tar.gz
mv tk8.5a6 tk
- #amsn 0.96
- wget -c $SOURCEFORGE/amsn/amsn-0.97RC1.tar.bz2 || error_exit "Could not download aMSN source code."
- tar -xsf amsn-0.97RC1.tar.bz2
- mv amsn-0.97RC1 amsn
+ #amsn svn snap
+ wget -c http://www.amsn-project.net/amsn_dev.tar.gz || error_exit "Could not download aMSN source code."
+ tar zxvf amsn_dev.tar.gz
+ mv msn amsn

fi

#compile tcl (into /usr/local, to leave tcl 8.4 untouched)


另外值得一提的是,這個 fixamsn.sh 的作者是 Vuen ,原文發表應該是在英文版的 ubuntu 論壇上面。

這個需要註冊才能下載的 script 我上傳到我的 googlepage 底下:
fixamsn.sh

ㄟ... 一樣有 amsn 版本的問題,所以我順手上傳了我的版本比較乾脆,省的 patch 。

2008/02/22

[Programming] PHP-GTK


> PHP Warning: PHP Startup: Unable to load dynamic library
> '/usr/lib/php/modules/php_gtk2.so' - /usr/lib/php/modules/php_gtk2.so:
> undefined symbol: phpi_get_le_gd in Unknown on line 0

這邊是回說:
要嘛把 GD 從 php enable 起來(所以要重編 php),不然就是 disable 掉 php-gtk 的 GD 支援。
不過其實我的解法是:
yum install php-gd
然後重新 configure php-gtk && make && make install 就好了。

留個記錄,問題沒那麼複雜哦~

[Linux][資訊安全] 安全漏洞

除了之前 vmsplice 的漏洞之外,今天又在 milw0rm 上面看到一個 xorg-xfs的漏洞 。

這應該是在說明,個人用的 Linux Desktop ,還是要盡量縮小帳號的開放,不小心就又不知不覺給人家 root 權了。

2008/02/15

[Linux] PGP 流程及說明

先來說明一下在網路上面傳遞訊息最怕的問題是什麼:

  1. 明文傳遞的訊息內文很容易藉由各種方式取得,像是 sniffer 之類的的。

  2. 網路上的訊息難以驗證它的真實性

  3. 既使上面兩點都忽略,也難以保證這個訊息沒有被竄改過。



因為上述三點原因,所以我們通常不會在網路上面用 msn 討論重要的事情, msn 的內文傳遞沒有加密,很容易用 sniffer 就截聽下來。然而,既使是用 ssl 方式傳遞訊息,如果全程被監聽,且加密程序不夠複雜,也還是會在時間內被破解訊息。更不用說,在使用無線網路的情況下,要監聽溢漏的封包或假造封包也是很簡單的事情。

那麼我們只需做到確保不會有任何除收信人以外的第三者收到訊息訊息不會被竄改 兩點就可以確保訊息的安全傳遞,本篇 PGP 的流程及說明 就在說明問題點的解法及重要觀念:

  1. PGP 的訊息傳遞是安全的傳遞方法。

  2. 數位簽章社交認證 ﹑認證中心 是身分辨別的重要手續



PGP 的傳遞方式


前提: A(發) 跟 B(收) 都知道對方的公錀 看過對方的簽名。

A 發信時使用 B 的(數位簽章)專用加密器加密信件內文 -- 發信 --> B 用自已的私錀 自已的解密器打開信件閱讀。

這樣簡單的方法,就可以確保只有 B 能閱讀內文了嗎?顯然沒有那麼簡單,問題:
1. B 專用的 加密器(數位簽章)|解密器 怎麼來的?
2. B 如何知道這封信是 A 發的?

1. 最好的方式當然是 B 直接用手拿一隻 usb 給 A 說,裡面有我的數位簽章(加密器),你要發信的時候用這個東西加密過,就只有我能解開來看,別人拿去也沒有辦法解讀。不過還有一個方式就是透過社交方式,由其它人認識 B 的人轉交 B 的數位簽章,因為大家都認識都看過 B 的簽名,所以可以相互認證,得知這個數位簽章是不是 B 的,也就不用擔心有人假造簽章,讓你的信件沒辦法正確傳達給 B 。(當然也還有認證中心這一條線可以得到 B 的數位簽章)

2. 如何知道是 A 發的呢? 重點在於(數位簽章)加密器和(私錀)解密器的特性上面。這兩個資料分別是兩個很大的質數 p, q ,當 p 拿來加密時,只有 q 能拿來解密。當 q 拿來加密時,只有 p 能解密。也因此,在判別是不是 A 所發的信件時,我們可以把加密器跟解密器互換,用 私錀 來對信件的時間內文等特徵加密,再傳送給 B 之後,讓 B 使用 A 的數位簽章解密,只要信件內文﹑時間等特徵相符合,就可以證明是 A 所發的。

以上,傳遞安全﹑雙方驗證安全,剩下的就只有保護好你所持有的私錀跟讓大家都認識你的數位簽名了。

--
參考文件: PGP 簡介(簡中)

2008/02/14

[Linux] env 的用法

Q: #!/usr/bin/env bash 跟 #!/usr/bin/bash 有什麼不一樣?
呃... 其實我也不知道,所以我也跑去 man env 看了一下:
NAME
env - run a program in a modified environment

SYNOPSIS
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]


呃…這有看沒有懂說。

結果今天在使用的時候才明白:
bash 有的時候會放在不是 /usr/bin 底下,所以下 env bash 可以給出如果 bash 不在 /usr/bin/ 底下的情況,還能使用 bash 做 interpreter。
同樣的情況也會發生在 php/pike 的身上。

像是有的時候 php cli 不是自已裝的,script 就會寫在
#!/usr/bin/php ,可是這個 script 拿到別台機器 php cli 是放在 /usr/local/bin/ 底下的就出問題啦。
所以寫做 #!/usr/bin/env php 就可以帶來一種安全的便利。

[Programming][Kernel] 程序的建立

程序的建立


Unix 在程序的產生上採取相當獨特的作法。絕大多數系統會設計一種叫「 spawn 」的機制,為新的程序先建立起新的定址空間,之後便讀進執行檔,並開始執行它。 Unix 系統上會將這些步驟分離成兩個函式,分別為 fork() 跟 exec() 。首先說明的是: fork() 會產生一個子程序,這是當前 task 的複製品;跟父程序不同的地方只有 PID﹑ PPID﹑特定的資源(如懸滯信號)與統計資料等不會作繼承動作的東西。第二個函式則是 exec() ,這個函式會將新的執行檔載入到定址空間裡面,同時開始執行它。將 fork() 和 exec() 依序結合後,就跟大部份的作業系統上所使用的單一函式相同。

※ 「大部份的作業系統上所使用的單一函式」這是在說 像 win32 上的 system() 嗎?還是 exec() ?

Copy-on-Write


以往的作法在呼叫 fork() 時,所有的父程序所擁有的資源都會複製一份給子程序。我們在複製時可以很容易發現到,不少資源可以藉由共享的動作來讓父子程序共用;所以每一樣資源都複製的動作不旦原始也缺乏效率。更糟的是,如果緊接著的動作就是執行新的程式,所先前所作的複製就完全是畫蛇添足了。在 Linux 系統底下, fork() 會藉由「 copy-on-write 」分頁(就是寫入分頁前才進行複製的動作)這個機制來防止前面提到的這種浪費行為。 Copy-on-Write 或簡稱 (COW) 是一種延遲或完全防止資料複製的技術。父程序和子程序並非各自擁有完整的空間,而是共享單一個程序定址空間。共享的資料會預先打上特殊的標記,以確保在寫入動作發生的時候再來進行對應的資料複製;到發生寫入動作完成後,程序才可以說是「擁有不同的資料」,而在這之前,資料都是以唯讀的方式進行共享的動作。這個技術可以延遲定址空間內的資料複製,進而讓記憶體分頁寫入的動作減少,可以說是相當重要的最佳化機制,讓程序得以快速的執行,而不用在意分頁上的資源與時間浪費。

2008/02/13

[Firefox] 修改 alert 提示對話框

想把 alert 拿掉,得先把這些都處理掉。不然就要去搞 embed 底下的東西了吧?
var promptSvc = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
真麻煩。

[Programming] PHP-GTK 的中文問題

這篇一樣在做備份記錄:

PHPGTK 的中文問題除了字型找不到之外,就是 codepage 的設定而已。所以在 php.ini 底下設 php-gtk.codepage = UTF8 可以解決這個問題。
當然也可以直接下 ini_set("php-gtk.codepage","utf8");直接解決。

在 phpgtk 的 dl 問題上面,因為 extension dir 已經在 php script cli 載入前就設下去了,所以沒辦法使用 ini_set 來處理。(不過如果 extension_dir 設為空值或使用 ../../ 的話,應該是可以下絕對路徑來處理。)

更新 2008-03-07 :
phpgtk 的 api reference 看起來少了很多東西,不知道是不是因為還在 1.0 的文件的關係,現在要找 reference 都得先去
php-gtk-2.0.0alpha/ext/gtk+
底下再 grep function 出來,然後再去 GTK+ Reference 找參考。

[Programming] pttget.pl

備份~ 抓 ptt 上面文章的 perl script (從 kenwu 那邊修改的,好像有點小問題,我也忘了~)

#!/usr/bin/perl
#
# PTT BBS Board Crawler BETA 3, Powered By LiloHuang
# http://blog.roodo.com/kenwu/
# 使用 GPL V2 釋出擷取文章功能部份程式
# Last Updated: 2007/09/02
#
# Fix: 修正 guest無法登入問題
#

$|=1;
use strict;
use Net::Telnet;
use Time::HiRes qw(usleep);

system("title KUSO PTT BBS Board Crawler BETA 3");
print "########################################\n";
print "# KUSO PTT BBS Board Crawler BETA 3 #\n";
print "# Powered By LiloHuang #\n";
print "# http://blog.roodo.com/kenwu/ #\n";
print "########################################\n\n";
print "說明: 這是一個可以將 PTT BBS看板進行抓取的程式...\n";
print " 目前仍在測試階段, 還有許\多Bug與不穩定...\n";
print " 僅供測試使用, 切莫用於非法用途侵權他人文章!!\n\n";

my $host;
print "站台: \n";
print " 1. ptt.cc\n";
print " 2. ptt2.cc\n";
print "請選擇: ";
my $site = 1; #;
chomp $site;
$host = ($site eq '1'?"ptt.cc":"ptt2.cc");
mkdir("./$host") unless(-d "./$host/");
print "\nBBS 帳號: ";
my $id = "我的帳號"; #;
chomp $id;
&except("沒有輸入帳號, 程式即將關閉.") if($id eq '');
print "BBS 密碼: ";
my $pass = "我的密碼"; #;
chomp $pass;
print "看板名稱: ";
my $board = "Sodagreen"; #;
chomp $board;
&except("沒有輸入看板名稱, 程式即將關閉.") if($board eq '');
print "起始文章編號: ";
my $start = 8435; #;
chomp $start;
&except("沒有輸入起始編號, 程式即將關閉.") if($start eq '');
print "結束文章編號: ";
my $end = 8436; #;
chomp $end;
&except("沒有輸入結束編號, 程式即將關閉.") if($end eq '');
&except("結束編號 < 起始編號, 邏輯錯誤, 程式即將關閉.") if($end<$start);

my $num = $end - $start + 1;
my $esc = chr(27);
my @stack;
my $buf;
my $cnt;
my $bot;
my $rec = 0;
my $bar = '─'x39;

my %login = (
"請輸入代號" => "$id\n",
"請輸入您的密碼" => "$pass\n",
"您想刪除其他重複的" => "N\n",
"錯誤嘗試" => "\n",
"任意鍵" => "\n",
"酸甜苦辣板" => "q",
"鴻雁往返" => "q"
);

my %board = (
"任意鍵" => "\n",
);

print "\n正在登入 $host...";
&build;
while( $buf = &get ) {
if($buf =~/由於人數過多,請您稍後再來。/) {
print "線上人數過多, 自動重新連線第 ".sprintf("%3d",++$rec)." 次\r";
$bot->close;
&build;
}
&except("目前已有太多 guest 在站上") if($buf =~/目前已有太多 guest 在站上/);
&except("這裡沒有這個人啦!") if($buf =~/這裡沒有這個人啦/);
&except("密碼不對喔") if($buf =~/密碼不對喔/);
last if($buf =~/.+目前坊裡有.+?$/);
foreach (keys %login) {
&put($login{$_}) if($buf=~/$_/);
}
}
print "Done!\n";

print "進入 $board 看板...";
&put("s");
usleep(1000);
&put("$board\n");
while( $buf = &get ) {
last if($buf =~/文章選讀/);
foreach (keys %login) {
&put($login{$_}) if($buf=~/$_/);
}
}
print "Done!\n\n";

$cnt = 0;
&put("$start\n\n");

mkdir("./$host/$board") unless(-d "./$host/$board/");

while( $buf = &get ) {
last if($buf =~/文章選讀/);
push(@stack, $buf);
print "正在擷取第 ".sprintf("%3d",($cnt+1))." 篇文章...\r";
unless( $buf !~ /\Q (100%)\E/)
{
&callback($start+$cnt);
undef @stack;
last if ++$cnt==$num;
}
&put(".");
}
print "\n\n總共 $cnt 文章擷取完畢\n\n";
$bot->close;
system("PAUSE");

sub callback {
open(FH,">./$host/$board/$_[0].ans");
my @out_buffer;
my $pos = 0;
for(my $i=0;$i<=$#stack;$i++) {
my @tmp = split(/\n/, $stack[$i]);
$tmp[0]=~s/^$esc\[H$esc\[J/$i==0?"":"\n"/e;
my $linetag = pop @tmp;
if($i > 0 && $i==$#stack) {
if($i < 2) {
if($linetag=~/目前顯示: 第 (\d+)~(\d+) 行/) {
my $rexp_s = $1;
$rexp_s = $rexp_s - 1 if($stack[$i]=~/$esc\[36m$bar$esc\[m/);
foreach(@tmp) {
s/$esc\[\d+;\d+H/\n/;
$out_buffer[$rexp_s++] = $_;
}
}
}else{
shift(@tmp) if($i>0);
foreach(@tmp) {
s/$esc\[\d+;\d+H/\n/;
$out_buffer[$pos++] = $_;
}
}
}else{
shift(@tmp) if($i>0);
foreach(@tmp) {
$out_buffer[$pos++] = $_;
}
}
}

foreach(@out_buffer) {
s/$esc\[K//g;
s/\r/\n/g;
print FH $_;
}
close(FH);
}

sub put {
$bot->put($_[0]);
usleep(200000);
}

sub get {
usleep(200000);
return $bot->get( Timeout => 10000 );
}

sub error {
print "網路連線逾時或程式發生異常, 程式即將關閉!\n\n";
system("PAUSE");
$bot->close;
exit;
}

sub except {
print "$_[0]\n\n";
system("PAUSE");
exit;
}

sub build {
$bot = new Net::Telnet (
Port => 23,
Timeout => 30,
Errmode => \&error
);
$bot->open($host);
}

[Windows] 好用的小工具: AutoHotKey

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