TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2008年2月21日 星期四

XHTML deprecated target attribute

在XHTML 1.0 Strict和XHTML 1.1中,a元素的target屬性被拿掉了,似乎是委員會的大老們覺得連結的開啟目標不該由文件本身提供,或是說使用者應該可以自己決定要怎麼打開它,所以現在是用rel和rev屬性來註明這個文件連結,但是不做任何具體影響。你可以利用rel="external"來註明這是個外部文件。
想要實現原本的功能,可以自己定義DTD或是用JavaScript。實作其實很簡單,核心如下:
var links = document.getElementsByTagName( 'a' );
for( var i = 0; links[i]; ++i ) {
    if( links[i].getAttribute( 'rel' ) == 'external' ) {
        links[i].addEventListener( 'click', function( e ) {
            e.preventDefault();    // IMPORTANT!
            window.open( this.getAttribute( 'href' ), '_blank' );
        }, false );
    }
}
Event的preventDefault是為了要阻止元素的預設行為,因為<a>在click之後一定會打開連結。
另外,我想這個JavaScript應該是不相容於IE的,不過沒關係,反正IE不支援XHTML,自然不用擔心這種XHTML才有的問題。
[Modified - 2008/02/26] Use W3C style.
[Modified - 2008/07/06] Improved loop terminate condition.

2008年2月20日 星期三

MySQL: Error 2002

剛剛在搞伺服器的MySQL,因為它一直出現ERROR 2002: Can't connect to local Mysql server through socket '/var/run/mysqld/mysqld.sock '(2),可是/var/run/mysqld裡根本沒這個檔案....
後來想到機器換了IP,就去改了my.cnf的IP位址,重新啟動mysql之後就好了;浪費了我半小時= =

instance or literal

前陣子在做JavaScript的異常處理時,意外的發現一些實體判定的問題。
考慮如下的程式:
try {
    throw( 'Exception' );
} catch( e if e instanceof String ) {
    alert( e );
}
這樣是不會捕捉到異常的,就算'Exception'這個字串可以使用String的method,就算typeof的取值是string。
接著再進一步的試驗:
var temp = [ 'test', String( 'test' ), new String( 'test' ) ];

for( var x in temp ) {
    alert( temp[x] + ', ' + typeof( temp[x] ) + ', ' + ( temp[x] instanceof String ) );
}

// test, string, false
// test, string, false
// test, object, true
可以看見只有用new才會真正用constructor建造一個實體,不加new的話似乎只是呼叫function而已。
也就是說new運算子才是產生instance,其他的都算literal。
可是要說instance和literal不一樣嗎?好像也不盡然:
String.prototype.popup = function() {
    alert( this );
};

// will alert 'test'
'test'.popup();

這次是怎麼回事

伺服器因為換辦公室結果沒人去接網路,然後連IP都換了....

2008年2月12日 星期二

Launch Opera for PCManX

因為Linux上的PCManX很難在Opera上開新分頁連結,結果又弄了個shell script:
#! /bin/bash

test $# -eq 1 || exit 1

temp=`which opera`
test -x $temp || exit 1

$temp --remote "openURL($1,new-page)" >/dev/null 2>&1 &

之後呼叫這個shell script然後把網址放第一個參數即可。

2008年2月11日 星期一

Short-circuit evaluation

不少語言在AND和OR的運算子上都有短路評算的機制,意即當評算結果已經確定時,就立刻回傳結果,停正評算。例如:
if False and f() :      // 由於評算結果一定為假,故f()不會執行
    ...
if True or f() :        // 評算結果必為真,故f()不會執行
    ...
也就是說AND只有在前方運算式為真時才會執行後方運算式,OR只有在前方運算式為假時才會執行後方運算式。
事實上shell常用的&&和||就是使用了這個特性,回想一下常用的指令:apt-get update && apt-get upgradetest -x /sbin/iptables || exit 1cd / && rm -rf *等。只是要注意的是,shell是以0為真,其他值為假。
這也是為什麼我反對把主程式宣告成void的原因之一,各位可以去試試void main的程式會回傳什麼。很多時候,判斷一個程式正常執行與否不是看執行結果,而是主程式的return值,如果使用void就很難判斷到底有沒有執行成功。

2008年2月9日 星期六

Assignment review: N queens in Prolog

/*
Generate a list [1, 2, ..., N] to L.
Permute L to Board.
Check Board if it is safe.
*/

queens( N, Board ) :- !,
                      range( N, L ),
                      permutation( L, Board ),
                      safe( Board ).

range( N, L ) :- decrease( N, Temp ),
                 reverse( Temp, L ).                                             % Generate a increasing list.
decrease( 0, [] ) :- !.
decrease( N, [H | L] ) :- N = H,
                              Next is N - 1,
                              decrease( Next, L ).

safe( [_] ) :- !.                                                                % Check if all queens are safe.
safe( [Queen | Others] ) :- !,
                            nohit( Queen, 1, Others ),
                            safe( Others ).
nohit( _, _, [] ) :- !.                                                          % Check if queens could not attack each other.
nohit( Column, Row_D, [Queen | Others] ) :- !,
                                            nohit( Column, Row_D, Queen ),
                                            Row_D_Next is Row_D + 1,
                                            nohit( Column, Row_D_Next, Others ).
nohit( Column, Row_D, Target ) :- !,
                                  Diag1 is Column + Row_D,
                                  Diag1 =\= Target,
                                  Diag2 is Column - Row_D,
                                  Diag2 =\= Target.

之後只要用queens( 4, B ).就可以列出當棋盤大小為四佾時,四個皇后不會互相攻擊的縱座標或橫座標[?]
以四佾來說,它會印出:
B = [2,4,1,3]
B = [3,1,4,2]
意即第一組解為(1,2)(2,4)(3,1)(4,3)和第二組解為(1,3)(2,1)(3,4)(4,2)。
引數的數字可以依棋盤大小任意更改。由於Prolog是採DFS的方式搜尋,太大的棋盤會跑很久。

2008年2月8日 星期五

好吧我是蠢貨

剛剛去翻了一下Shorewall的文件,真的有safe-restart的選項= =
不過我還是要避免有人不小心把iptables毀了,所以script還是要留著。

2008年2月7日 星期四

Queer Windows SDK

windows.h只有定義WINVER,可是SDK的objbase.h全部都是以_WIN32_WINNT的值和_WIN32_DCOM來打開DCOM結構,結果兩個都沒有定義。
根據這頁的介紹,WINVER和_WIN32_WINNT是差不多的,可是我不明白為什麼一個只定義WINVER,另一個只用_WIN32_WINNT,剛好錯開。
最後只好自己定義_WIN32_DCOM才能正常使用。

CJK and Hiragana characters in Unicode

CJK通用文字範圍: U+4E00 ~ U+9FFF
平假名範圍: U+3040 ~ U+309F

2008年2月6日 星期三

Order of I/O redirecting

在shell使用的I/O重導,其行為其實還有很多有趣的部分。一般常使用的就是<>,但是它們其實不只能重導stdin和stdout,重導的方向也不只有檔案或裝置而已。
<>其實前方可以加數字,就是file descripter,若不特別指明,那麼<預設會是0<>預設是1>,其中0即為stdin的file descripter,1為stdout的file descripter[?],而2就是stderr了。[?]
因此I/O重導的真正格式為:
M<N
M>N
其中M為file descripter,N為某個檔案[?]。而如果要把fd導向給另一個fd,就要用下列格式:
M>&N
其中M和N都是file descripter。
然而依然要小心一個小問題,就是重導的次序不同,效果也會有不同。
考慮以下的狀況:
$ cat > test.c
#include <stdio.h>
int main( int argc, char * argv[] ) {
    puts( "This is stdout." );
    fputs( stderr, "This is stderr." );
    return 0;
}
^D
$ gcc test.c -o test
$ ./test >output.txt 2>&1
$ ./test 2>&1 >output.txt
有趣的是,第一次在螢幕上什麼都沒顯示,而output.txt裡會找到那二個句子,但是第二次卻會在螢幕上顯示`This is stderr.',output.txt只有`This is stdout.'。表面看起來結果至少要相反才對呀?
因為第一種寫法,代表stdout先被dup2到output.txt,然後stderr才被dup2到被更改過的stdout,因此兩個都會進入output.txt。
而第二種寫法,則是stderr dup2到stdout,這時stdout還是連接在console上,不管之後stdout有沒有被更動,它就是會輸出到console,所以會變成stderr > console,stdout > output.txt。