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年12月31日 星期三

Self extract loader

以下說明一個較為粗糙的自解檔寫作方式。完成品分為三個部分,啟動器,分隔識別字,以及被包起來的本體,也就是說是二個檔案硬接在一起,中間用一個字串當分隔。
本體程式為了方便,我用一個簡單的shell script做範例,在真實狀況可以是任何檔案。檔名為start.sh。
#! /bin/sh
echo 'Hello, world!'
分隔識別字我使用字串"__METAMAGIC__",magic number[!]請挑選很難重複的字串。
接下來就是關鍵的啟動器了:
#include <fstream>
#include <string>
#include <list>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <cstdlib>

int main( int argc, char * argv[] ) {
    using namespace std;
    ifstream fin( argv[0], ios::binary );

    if( fin.is_open() ) {
        list< char > self;
        copy( istreambuf_iterator< char >( fin ),
              istreambuf_iterator< char >(),
              back_inserter( self ) );
        fin.close();

        string magic( "!_METAMAGIC__" );
        magic[0] = '_';
        list< char >::iterator result = search( self.begin(), self.end(), magic.begin(), magic.end() );
        if( result == self.end() ) {
            cerr << "Can not find piece!" << endl;
        } else {
            advance( result, magic.length() );
            ofstream fout( "/tmp/injection", ios::binary );
            if( fout.is_open() ) {
                copy( result, self.end(),
                      ostreambuf_iterator< char >( fout ) );
                fout.close();
                list< char >().swap( self );
                system( "chmod a+x /tmp/injection && /tmp/injection && rm -f /tmp/injection" );
            } else {
                cerr << "Can not write `/tmp/injection\'!" << endl;
            }
        }
    } else {
        cerr << "Can not open " << argv[0] << "!" << endl;
    }

    return 0;
}
首先以二進位的方式讀取自己,並存到容器內:
copy( istreambuf_iterater< char >( fin ),
      istreambuf_iterator< char >(),
      back_inserter( self ) );
istreambuf_iterator是讀取輸入緩衝區的迭代器,使用copy演算法把內容一字不漏地複製進容器內。
接著要找分隔字了,這裡就要一點技巧:
string magic( "!_METAMAGIC__" );
magic[0] = '_';
不直接使用"__METAMAGIC__"是因為字面常數會被放到text區段,如此一來會被干擾識別字搜尋。
接著就可以愉快的使用STL找字串了:
list< char >::iterator result = search( self.begin(), self.end(), magic.begin(), magic.end() );
如果找不到就會回傳self.end(),這裡先假設它找得到,就直接寫入:
advance( result, magic.length() );
ofstream fout( "/tmp/injection", ios::binary );
if( fout.is_open() ) {
    copy( result, self.end(),
          ostreambuf_iterator< char >( fout ) );
    fout.close();
因為search回傳的是"__METAMAGIC__"字串的開頭,所以要用advance用來把迭代器往前推,讓它指向第二段檔案開頭。輸出檔放在/tmp下是因為這裡通常是任何人皆可使用。
list< char >().swap( self );
這行只是為了把list裡的空間釋放,對程式本身來說可有可無。如果啟動器本身會執行很久,那麼釋放不必要的部分也許比較好。
最後再執行它,就完成了:
system( "chmod a+x /tmp/injection && /tmp/injection && rm -f /tmp/injection" );
之後編譯它:
g++ -O3 -o sfx sfx.cpp
Do something evil--把二段程式黏起來:
echo -n '__METAMAGIC__' | cat sfx - start.sh > inject
之後執行inject就可以看到:
$ ./inject
Hello, world!
這種方式不免讓人聯想到某些病毒的入侵方式--在看似正常的檔案內插入攻擊代碼,利用自己製作的shell或其他程式[?]的bug,解出攻擊碼並執行。
當然這個啟動器是肥了點,因為完全只用C++內建的標準工具,惡意的啟動器通常都只有幾K而己。

2008年12月24日 星期三

第一張棄選單

KDE 4.2 snapshot packages for Debian

就像這篇所提到的,Debian因為龜毛政策沒辦法在官方套件庫中納入KDE 4.2的Beta套件,於是我們的神--Debian Qt/KDE Maintainers就自己開了一個非官方的套件庫,提供勇者們方便地嚐鮮KDE 4.2,以及bug回報。
這個套件庫事先聲明,期望不要太高,因為它們的品質並沒有符合官方的標準[?],更新週期大約是每週一次,不過這也不保證,反正他們有空就會更新。
用Debian到現在我大概可以理解為什麼有人說Debian對開發者很不客氣....光是看那堆打包者守則就快暈了,想要讓套件進unstable還要測試好一段時間,就連KDE 4.1.0也沒有完全進入unstable,而4.1.3還在experimental,搞不好就會直接被將來的4.2.0蓋掉,進不了unstable。
其實unstable+experimental就己經能夠滿足一般桌上使用的需要了,可想而知Debian對穩定的龜毛程度...

2008年12月18日 星期四

KomiX v0.0.1 released!

簡單的說是拿來看漫畫用的。
簡介:
  • 可開啟檔案或資料夾,支援直接拖放
  • 空白鍵或是滑鼠左鍵可平滑捲動
  • F11鍵或滑鼠中鍵可切換全螢幕
  • Esc鍵或點擊系統工具列圖示可隱藏,再點一次圖示可復原
  • 跳頁預覽
  • 提供「自由縮放」、「符合頁寬」、「符合頁高」、「符合視窗」等四種縮放模式
平台:
  • Linux
  • Windows XP / Windows Vista
編譯需求請參閱源碼內文件。
疑難排解:
Q1:提供的執行檔無法執行。
A1:請至Microsoft下載Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)並安裝。
Q2:為何沒有XX(Windows x64, FreeBSD, MacOS, ...)平台版本?
A2:請自行編譯。
Q3:圖示很醜。
A3:えぇ?それ、自信作だけど…

2008年12月11日 星期四

Uninstall using CMake

CMake基於某些理由並沒有在Makefile裡提供uninstall這個target,但是提出了另一個做法:把所有安裝的檔案路徑記錄到一個叫install_manifest.txt的檔案裡,之後利用xargs rm -vf < install_manifest.txt就可以反安裝了。
不過安裝時更改的設定檔要怎麼辦啊....

2008年12月5日 星期五

終於編好KDE4.2 trunk

昨天終於把KDE 4.2編好了,Oxygen的華麗度又往上翻了一級。Debian package有的bug消失了一些。不知道為什麼沒辦法自動切成scim-bridge。Kopete少了MSN支援。AmaroK還是一樣有點腳殘。K3B現身,雖然我還沒試過。無法使用桌面特效,不過倒是因此速度提昇不少:P。
書唸不完作業沒寫完的我到底在幹麻啊....

2008年12月3日 星期三

焦慮

幹!我好弱!真煩....

KDE 4.2 Beta1 well not appear in Experimental

總之,4.2 Beta1不會出現在Experimental裡,因為一放到裡面就會把4.1.3蓋掉,為了不把原本的穩定版蓋掉就要讓它進Unstable,但是Unstable要等到Testing釋出成為Stable後才會接受4.1.3,而Testing什麼時候變Stable?當它準備好的時候!= =

2008年11月29日 星期六

爛比喻 

直接說七個成人就好了,關王建民屁事啊!(王建民:[超幹]躺著也中槍!)。然後沒事又扯營養午餐幹麻?= =

2008年11月27日 星期四

我的記憶力就跟狗屎一樣(2)

上次不知道哪個人問我為什麼要在純抽象類別[?]上強制宣告一個純虛擬解構式[?],我一時忘記原因了。
今天寫到另一個專案時才想到,那是因為C++預設的解構式是非虛擬的,使用預設的版本可能會出錯。
寫出程式的當下都會覺得理所當然,但是三個月後它就會變成莫名其妙的咒文。

2008年11月23日 星期日

我的笑點真的很低

以下是摘自Debian Multimedia Packages的FAQ:
Q.How many people are working on debian-multimedia ?
A. Two. Thibaut Varene for ia64, alpha, hppa, powerpc and ppc 64 archs and myself for i386, amd64, sparc and powerpc archs.
高手果然是孤獨的嗎?那麼多套件才兩個人維護...
Q. Why a so ugly background color ?
A. Because I hate white background. Otherwise my second prefered color is orange. You have the choice...
如果真的改成橘色背景的話,我大概會用Stylish把它改掉吧XD

2008年11月20日 星期四

狂気の劉傑

沒想到我工藤新一竟然會被綁架
看來這次遇到的是個慣犯
為了怕我逃跑
居然把我扒得只剩下內褲
他該不會有戀童癖吧
不過沒關係
我的小YYYYYG腰帶加長有緊急救援
城之內
像你這種軟腳蝦的決鬥者
沒有資格參加我台灣娛樂集團所舉辦的
殺你全家
砍你手腳
怪獸卡大賽
我的童負就靠阿笠博士你了
我工籐新一不能大便真是苦惱

2008年11月16日 星期日

Signal/Slot and template in Qt

Qt的特點就是提供了Signal/Slot機制來提供一個thread-safe的物件溝通功能。
GUI的事件連結通常是用call back機制,也就是元件本身提供可監聽的事件類型,由使用者提供若干函式註冊給這些事件,讓事件發生時會自動喚起使用者自訂函式。JavaScript使用的DOM便是典型例子。
而Signal/Slot的運作方式則是讓使用者在元件上自訂signal[?]和slot[?]。使用者可以在任何執行點上發射signal,而slot則可以和參數相同的任意signal連結。
Qt這麼設計的好處在於它很靈活,事件觸發的種類不再受限於事件模型;在任何執行點上皆可發射signal,也就是說也可以在slot裡再發射另一個signal,甚至於連結時也不只能夠在signal和slot間綁定,還可以使用在signal和signal之間,多對多的連結就更不在話下。
像這種明顯就超出了C++語言範圍的功能,其實作方式就帶來了一些缺點。這個機制大量地依賴一種Meta-Programming的技術,Qt稱之為Meta-Object System;自訂signal/slot時,需要使用moc這個Qt內附的外部工具,先parse類別的宣告,把signal和slot轉成字串,額外定義signal和meta-object處理的code,存成另一個原始檔,再和原本寫好的原始檔連結再一起,才能正常連結。
好了,我想各位看倌看出一個問題點了:moc要求類別的宣告和定義要分開,但是C++能支援分散template編譯的compiler少之又少。這是第一個問題。
另一個問題是,meta-object底層的實作方式是把類別和方法的名稱轉成字串,然後再做一些有點骯髒的處理,這很明顯地和template的具現化方式互相衝突。
因此如果想在template class上使用signal/slot機制的話,必須要先在non-template class宣告signal/slot,再宣告一個template class去繼承它。不過如果連signal/slot的參數都要模版化,要作的手術會更複雜些。

2008年11月7日 星期五

Change Splashy theme on Debian

# splashy_config -s <theme>
# update-initramfs -u
不更新initrd.img的話,開機時還是會使用預設畫面。欲查詢initrd.img內容可看:
# mkdir -p /tmp/initrd
# cd /tmp/initrd
# cat /boot/initrd.img | gzip -d | cpio -i
# find . -name splashy
後記:
前幾天更新的新版會在更改主題之後提示使用者更新initramfs...= =

2008年11月3日 星期一

真糟糕

現在只要伺服器上沒有SubVersion或Git我就不會寫程式了...囧。要同步其他地方寫的code實在太煩了。
故事通常是這樣的:
我在A電腦上的Linux一時興起寫了個程式出來,之後又重開機到Windows Vista上測試跨平台,隔天出門臨時興起又用B筆電的Windows新增功能,再重開機到Linux上之後發現bug,又修正自己犯下的愚蠢錯誤,拿著編譯好的程式到公用電腦上執行發現缺少動態連結檔,遠端連回去下載檔案,成功執行後發現Windows XP好像和Windows Vista不一樣,又回家去改,開了幾個虛擬機器編譯測試...(無窮迴圈)

2008年11月1日 星期六

好Java, Java的奧妙之處就在...

public int function()[] {}
public int[] function() {}
同義。
沒了嗎?還有!
int[][] i;
int[] i[];
int i[][];
神哉javac!

Git pull conflict

如果在用git-pull時出現訊息:
error: Entry '<whatever>' not uptodate. Cannot merge.
有兩個選擇,一個是放棄本地修改(git-reset,git-checkout),另一個就是送交本地更動(git-commit),這樣git-merge才會正常運作。
果然SubVersion和Git的工作邏輯就是不一樣啊...

SVG真有趣

今天在增加KomiX的功能時,缺了Logo[?],只好自己臨時生了一個出來。
先試用了Krita 2.0 Beta2 (1.98),不過真的不是很穩,用了幾分鐘就砍掉了。不是很想用GIMP的情況下,想起了還有Inkscape。使用情況良好,而且預設存檔類型就是SVG,不是用自己的特定格式。
XML果然是超完整的標記語言,連圖檔都可以用XD
只是不同電腦上看起來不太一樣就是了。算了,沒差XD

2008年10月27日 星期一

並不是寫中文就看得懂

今天室友問了我一個問題:
Microsoft Access 是屬於何種資料庫?
  1. 網狀式
  2. 關聯式
  3. 分散式
  4. 物向導向
當下猜出是關聯式資料庫,室友又問差在哪裡,於是我查了維基百科,發現這真是個難以回答的問題。
首先它寫了這段說明:
關聯式資料庫,中國中國大陸稱作關係數據庫,是建立在關聯模型基礎上的資料庫,借助於集合代數等數學概念和方法來處理資料庫中的資料。現實世界中的各種實體以及實體之間的各種聯繫均用關聯模型來表示。
然後我點了關聯模型來看解釋:
關聯模型的基本假定是所有資料都表示為數學上的關聯,就是說n個集合的笛卡兒積的一個子集,有關這種資料的推理通過二值(就是說沒有NULL)的謂詞邏輯來進行, 這意味著對每個命題都沒有兩種可能的求值: 要麼是真要麼是假。資料通過關聯演算和關聯代數的一種方式來操作。
關聯模型允許設計者通過資料庫規範化的提煉,去建立一個信息的一致性的模型。訪問計劃和其他實現與操作細節由DBMS引擎來處理,而不應該反映在邏輯模型中。這與SQL DBMS普遍的實踐是對立的,在它們那裡性能調整經常需要改變邏輯模型。
基本的關聯建造塊是域或者叫資料類型。元組是屬性的有序多集(multiset),屬性是域和值的有序對。關聯變數(relvar)是域和名字的有序對(序偶)的集合,它充當關聯的表頭(header)。關聯是元組的集合。儘管這些關聯概念是數學上的定義的,它們可以寬鬆的映射到傳統資料庫概念上。表是關聯的公認的可視表示;元組類似於行的概念。
關聯模型的基本原理是信息原理: 所有信息都表示為關聯中的資料值。所以,關聯變數在設計時刻是相互無關聯的: 反而,設計者在多個關聯變數中使用相同的域,如果一個屬性依賴於另一個屬性,則通過參照完整性來強制這種依賴性。
阿鬼,你還是說英文吧,看不懂啊!

2008年10月20日 星期一

Blu-ray sets for Debian "Lenny"

"號稱"每次釋出stable都會打破某些紀錄的Debian,這次要做的事情是...使用Blu-ray XD。
Debian在Lenny上有超過25000個套件,分別給13個不同的平台使用,全部合起來有414片CD,64片DVD。由於有這麼龐大的套件庫,他們決定推出Blu-ray來裝下所有套件。
不過其實不用每片都下載啦...真期待Lenny釋出。

2008年10月16日 星期四

囧問答

問題:
  1. 請問在賽跑中,你超越了第二名,會變成第幾名?
  2. 承上,如果超越最後一名,會變成第幾名?
  3. 啞巴去買牙刷,跟老闆比刷牙的手勢買到牙刷,那麼瞎子要買太陽眼鏡要怎麼做?
解答:
  1. 第二名。
  2. 無解(線性跑道)或無限多解(環狀跑道)。
  3. 跟老闆說"我要買太陽眼鏡"

2008年10月14日 星期二

2008年10月13日 星期一

ひぐらしのなく頃に 絆 預告片

事實上這在半年前就出現了...現在又翻舊貨出來是因為室友聽到這首歌很興奮要跟我神歌。
P.S.: 在剛看到歌手時一直覺得很眼熟,仔細回想才想到,いとうかなこ就是唱School Days鮮血の結末的片尾曲悲しみの向こうへ的人。

AmaroK 2 crashs kded4

簡單地說,因為AmaroK新的版本設定的全域熱鍵和KDE4上記錄的版本衝到,同一個鍵盤輸入會映射到一個以上的動作,因此kded4這支daemon會立即crash,導致只要開啟AmaroK2就會讓所有的快速鍵失效。
解決方法在上述網址。此bug己修復,應該會在下一個tag釋出。
不過修正這個bug的人在最後說"Don't know how that happens but it happened." ... 看來是卡到陰?XD

2008年10月4日 星期六

Konqueror is also a man-viewer

剛剛才發現,原來Konqueror可以在網址列輸入: man:vim等關鍵字來查詢man pages,而且因為是網頁版,所以網頁連結和man pages連結都會變成超連結。
用了這麼久了現在才知道= =

2008年9月13日 星期六

我的記憶力就跟狗屎一樣

上次去COSCUP 2008時,被學長認出來,可是我對他們完全沒印象....我想應該是過去有修過同一堂課吧。不過我自認為是很低調的,可見得學長們的記憶力不錯。(囧)
前幾天去demo的時候,也被研所的學長認出來,當時我是在客運上問他台北車站的方向。如果在客運上那次是第一次見面的話,那的確是很好的記憶力....不過聽學長的口氣好像是他上車就記得我是誰....所以我想應該是之前在lab就有遇過。
總結來說我對人的記憶力很差,臉和名字經常是連不起來的,如果總交談時間沒超過十分鐘的話,下次見到我可能就忘了(汗)
所以如果在街上碰到我而我沒打招呼的話,不是因為我不想理你,而是因為我腦殘= =。

2008年9月9日 星期二

真煩

老家電腦一直有隨身碟病毒衝進來....掃都掃不完。最後用Linux的LiveCD開機把可疑檔案全刪光。還好它不會破壞文件。
話又說回來,搞成這樣的又不是我,我幹麻這麼累啊....

2008年9月7日 星期日

每次都是隨身碟先中招

今天要來燒光碟時[?],發現自動播放的選項變成了8tss2gwq.bat,Well...這實在太明顯了!
平常不要用自動播放/執行,你的人生會平順一點。
點進去隨身碟一看,發現每個資料夾後方都被加了.exe的副檔名,但是圖示還是資料夾。仔細觀察可以發現,資料夾不會有內容預覽,檔案大小也是固定的。
顯示副檔名可以幫助你辨認檔案類型。
在路徑列上輸入原本資料夾的路徑,發現之前的資料夾並沒有消失,由此可知此病毒並沒有破壞資料,只有修改資料夾屬性為隱藏/系統而已。使用cmd輸入指令dir /ah可以看到多出了8tss2gwq.batautorun.inf
冷靜!先確認自己的情況才有得救。
接下來?也沒什麼特別的,我用Panda ActiveScan線上掃毒把它清掉了,再用命令列把資料夾的屬性改回來....

全家就是你家

昨天在學校的全家躲雨,買了一點東西就到裡面的休息間坐著,這時店裡播放的音樂突然換首,熟悉的音樂出現了....是Inner Universe
坐下來打開laptop,不經意地瞄了一下柱子,發現上面寫著「本店提供無線上網」....然後這裡的廁所是坐式馬桶,更重要的是還有衛生紙!

2008年9月4日 星期四

連這也要不一樣

VC9的shared_ptr是放在<memory>裡,gcc則放在<tr1/memory>。gcc也可以在原本的<memory>裡找到shared_ptr,但是它不會放在tr1這個namespace底下。
你們就不能合作一點嗎?= =

我不懂

為什麼裝完IE7要重開機?為什麼裝完VS9 SP1要重開機?

2008年9月2日 星期二

『真・恋姫†無双』發售情報

真・恋姫†無双
由於我沒在逛C洽版,可能這是大OP了。不知道梗的人再可以看一下前作:
恋姫†無双
一代的劇情....其實也沒什麼好劇情的,不過還是大略講一下:主角是個普通的學生,某一天意外被拉進異世界,在那裡似乎是他熟悉的三國時代,只不過所有武將都變成女的?!然後一個少年的後宮就此展開....夠老梗吧?
簡單的說,戀姬無雙是屬於角色類的,可攻略角色很多,幾乎全部都可攻略,角色的人設也有下過功夫,每個都相當有特色,音樂也有茶太的加持。當年可說是大陣仗的重量級作品。
不過這種類型的缺點是,角色雖多,但是分給每個角色的單一劇情就會很短。好啦,袁紹的搞笑流浪之旅是很好笑啦,還有貂嬋和趙雲的蝴蝶假面....
我沒說這類型的不好,畢竟人家擺明了就是要惡搞,認真你就輸了,只是對我來說真的....
續作在官網上看起來,新增的要素除了新增很多武將之外,還可以選擇三國其中一國當主線,我想新增武將的目的之一就是為了平衡主線的角色。
不過對我來說很明顯就是想出來再噱錢的....太超過了
跟戀姬無雙比起來,個人還是比較喜歡同時期推出的いつか、届く、あの空に,至少它是唯一一個我攻完還是因為它龐大的設定而無法寫心得的作品!XD

自婊是很正常的現象

有一天Rob Jcobs正在review以前的程式碼時,看到了以下的片段:
// NOTE: Please think twice before changing the next line of code ;-D
// Store float binary in char array
*((unsigned int*)(&x[4])) = *((unsigned int*)(&value));
他給他同事看了這段程式碼,並且一致認為這行程式碼就算會動,可能還是會讓你下地獄。他認為他當初一定是忘了教訓寫出這段code的人了,因此他去翻閱Subversion上的記錄,想找出到底是誰寫出這種鬼東西。
$ svn log
r3 | rjacobs | Thu, 18 Jul 2002 18:03:46 -0500 | 10 lines
r2 | rjacobs | Mon, 15 Jul 2002 17:47:57 -0500 | 1 line
r1 | rjacobs | Mon, 15 Jul 2002 17:40:08 -0500 | 34 lines
Whoops.(天啊)
結果當時寫下這行程式碼的真兇就是他自己。
其實如果回頭去看自己大一大二時寫出的程式,我也會自婊下去吧XD

Hans Reiser依殺妻罪名判刑十五年

Hans Reiser是誰呢?他就是Linux界有名的檔案系統:ReiserFS的作者。
ReiserFS很優越的地方是它處理小檔案的速度遠遠超過ext系列,大檔案的速度也不差。
不過最近殺妻官司纏身之後,ReiserFS便被戲稱為KillerFSMurdererFS,同時Reiser4的開發進度也龜速進行。
這個故事告訴我們,geek不一定只會在網路上犯罪....

Setting up mutt

2008年8月30日 星期六

設計和實作一樣麻煩

昨天睡前試了一下把boost::regex改成QRegexp,結果很不幸地發現該模組的架構會因此而更動。
原本是把各個式子存成匿名空間全域常態變數,再在成員函式裡使用boost::match;但是由於QRegexp是個有狀態行為的物件,它不能成為常態變數,於是我只有兩個選擇:一是讓它成為私有實體成員,每次建構實體都重新建構一次,缺點是物件會變大,但是它會是多緒安全物件;一是讓它成為私有靜態成員或是匿名空間全域變數,好處是不會額外佔用空間,壞處是它不具有多緒安全。
我想其他的模組也有可能會遇到相同狀況....

2008年8月29日 星期五

一些要注意的事

和學弟聊過之後發現的事:
  • 目前使用的Smart Pointer並不安全
  • 應該可以把Boost完全拔掉,直接使用Qt
  • 如果Loki再出現奇怪的問題的話,Object Factory和Singleton就自己寫,把Loki拔掉
  • 字串可能全部用std::wstring或是QString取代

目前的TODO list

  • 線代期末考
  • MyNote修正
  • Khopper告一段落,轉向FFMpeg
  • KomiX暫時停止開發
  • 系上網頁討論
明明沒做什麼事又很想睡覺....

我快爆了

原本只是想用個APE decoder,怎麼到後來變成在幫FFMpeg做code review 和 debug? = =

2008年8月25日 星期一

Install apache2 worker MPM and PHP support on Debian

Apache有幾個不同的實作版本,比較主要的是perfork和worker,主要的差異就是,prefork版是用預先fork child的模型[?],而worker提供多緒實作模型。理論上有多緒會讓它的效能好很多,但是prefork版還是有較為穩定的優勢。
不幸的是Apache的PHP模組並不提供多緒安全的保證,因此要改用CGI來提供PHP功能。但是設定有點麻煩就是了。

2008年8月18日 星期一

2008年8月10日 星期日

Google的效率也未免太好了

剛剛用jquery khtml hide當關鍵字查,竟然找到了我不到二小時前push到GitHub的blog code patch!
大概是GitHub的pagerank太高了吧....

jQuery's bug on KHTML?

才剛轉職沒幾天就疑似碰到bug...概述如下:
var temp = $( '#dome1' ).hide();
alert( temp.css( 'display' ) );     // none
$( '#dome2' ).after( temp );
alert( temp.css( 'display' ) );     // block or inline ( default style )
var temp = $( '#dome1' ).css( 'display', 'none' );
alert( temp.css( 'display' ) );     // none
$( '#dome2' ).after( temp );
alert( temp.css( 'display' ) );     // none
簡單地說如果使用hide,那麼在經過DOM的插入動作以後style會消失,但是直接使用css指定卻不會。這個錯誤在Safari和Konqueror上都會出現,但是Konqueror更嚴重,因為不只是插入的元素會失效,連被插入的元素也會失效。
在網路上搜尋的結果,發現了這個ticket,如果bug根源是一樣的話,可能要等1.3釋出才會修正吧?可是奇怪的是使用他的test case我無法重現bug....

2008年8月9日 星期六

換裝

今天發神經把所有原本用Prototype的JavaScript全部重寫成jQuery。jQuery的code長度果然有比Prototype短,不過某些功能還是沒辦法替換就是了,比方說少了Hash,我就只好自己弄了個類似的功能,但是標籤雲的random shuffle就沒了....現在標籤的順序是固定的。
但是我明明記得jQuery很小的啊...怎麼一看就變成五十幾K...

2008年8月1日 星期五

聲優的糟糕雜談

以下的內容,看得懂的人自己知道就好了....排序只是依照我想到的順序而已,沒有什麼規則。
青山ゆかり:經常被分到ツンデレ的角色,可是其實我不是很喜歡她講話的語調,好像卡東西在喉嚨裡的感覺。不過最近在「ファンタジカル」、「ツンデレでヤンデレな幼馴染 小鳥遊双葉さんとHなことをするゲーム」我倒是見識到她詮釋「壞掉」角色的功力....真的很有迫力!
安玖深音:經常被分到妹系角色。注意到她應該是在「夜明け前より瑠璃色な」的朝霧麻衣吧;在アトリエかぐや的「幼なじみと甘~くエッチに過ごす方法」之後就列入追蹤名單了(笑)
北都南:之前的年產量冠軍,算是實力派的吧?基本上演技沒什麼侷限,蘿莉到御姐,文靜到活潑都有演過。第一次遇見應該是「妹汁」,之後讓我印象比較深刻的是 「君が主で執事が俺で」的上杉美鳩和「遥かに仰ぎ、麗しの」的風祭みやび吧。本人是關西人,所以平常是關西腔的,但是她配過有關西腔的角色不多。
一色ヒカル:現在產量贏過北都南的聲優,實力也不差。不過配過的角色很少讓我有印象的。知道她是在「姉汁」的白川涼子和「智代アフター」的坂上智代吧。
木村あやか:就是萌啊!聲音真的有萌到我。第一次在「Gift」聽到藤宮千紗的聲音就決心要追了XD。不過她也不僅限於萌角,像是「朝凪のアクアノーツ」裡的無口角色,「Dies iras」的腹黑魔女都詮釋得不錯。
佐本二厘:其實之前我一直把她定位在弱気角色,大概是受到了「遥かに仰ぎ、麗しの」的八乙女梓乃和「MagusTale」的アリシア影響吧。不過後來玩了「Dies iras」發現她其實找對角色還滿有特色的,而且最近才發現原來「処女はお姉さまに恋してる」的厳島貴子和「はぴねす!」的渡良瀬準也是她....看來太小看她了。
榊原ゆい:少數唱配俱佳的聲優。幾乎只要她當女主角就一定會讓她唱OP和ED,對她有印象是在「Chu×Chuアイドる」之後吧。
成瀬未亜:萌系聲優。之所以特地提到她是因為她同時也是個插畫家,還有幫公司的作品畫過插圖:P。首次聽到是在「姉汁」的性轉換路線XD,萌化主人公實在太好笑了!
其他還有很多....想到再說吧。

裡外不是人

以上的新聞我看到的事情是:
  1. 預載Vista的電腦有56%會被降回XP
  2. 使用過Vista的人有53%並不認為比XP好用
  3. 消費者希望有選擇權,但事實上他們只在意XP
這則新聞並沒有指出第一點和第二點提到的族群交集程度,假設有一半好了,那就代表有另一半的人實際上用沒多久,甚至只是因為大家都說Vista很難用才降級回去。而使用過Vista的人,也不知道所謂的使用過是多久,三個月?三星期?三天?三小時?不好用的理由也沒寫出來。
不過我其實不是要婊統計數據的問題[?],我只是想問,Vista被人所排斥到底是為什麼?效能不彰?UAC很煩?很難破解?因為別人都排斥所以它一定不好?或是因為它和XP不一樣?
效能不彰...這個沒什麼好說的,認為Vista不是重量級OS的人要不是家裡很多小朋友就是搞不清楚狀況。
UAC很煩嗎?來聽聽以前的人是怎戰XP的安全性的,使用者直接就是Admister不安全,所以Vista弄了個UAC來惹惱使用者[?],然後又被戰它太囉嗦。sudo[?]就沒被人戰過它很囉嗦。
很難破解,這....不是理由吧?
然後就是先入為主的印象,這其實還滿不公平的,沒用過一個東西怎麼可以批它不好用?就像我幫人挑電腦,她一看到是Vista的就說不要,她要XP。問她為什麼,因為大家都說很難用,可是她其實沒用過。好啦,反MS陣營的人可能很爽,這下MS終於臭名遠播了,可是其實沒有;把句子大家都說Vista很難用,所以我要用XP,換成大家都說Linux很難用,所以我要用XP,或是大家都說FreeBSD很難用,所以我要用XP,如何?更何況他們拒絕了Vista之後,要的還是XP,而不是其他作業系統。
至於和XP介面不一樣....對我個人來說,其實是不太像理由的理由。單純的上網打字是改多大?不過就是幾個資料夾換位置罷了,而且也不是藏在找不到的地方,有很嚴重嗎?軟體很多不能用,我想這點Joel先生寫的火星人的耳機婊得比我更清楚。微軟內部偶而會分成兩派,一派是理想主義者,主張所有bug都應該修掉,向標準合攏[?],另一派是實用主義者,主張兼容性才是王道,客戶如果有不能看的網頁或是不能用的軟體才是災難。微軟最後的政策是向哪邊靠就不是重點了,反正修bug,走標準的話,一堆舊的元件不能正常工作,大家會婊它;如果走兼容性,又有人跳出來說微軟都自己玩自己,司馬昭之心。不然你們是想怎樣啦!因為它叫微軟所以它欠婊就對了。
然後選擇權這回事,我也覺得很可笑。從來沒人說你一定要選Windows啊!你對預裝的政策不滿,其實你可以找沒有預裝的電腦。微軟政策怎樣是它家的事,對它不爽你可以拒買,不是很喜歡那種在用Windows還在婊Windows怎樣怎樣,Unix-like如何如何好的人。
如果對世界不滿的話,就改變自己。如果不想的話,就封著自己的耳目。再不願意的話....
by 草薙素子 攻殼機動隊
這應該不算護航文吧?XD
嘴砲我倒是承認= =

神哉奇摩

後記: 效率還真快啊...不到一天就移除了。

2008年7月31日 星期四

如何讓你的程式更難理解(3)

char * strcpy( char * dst, const char * src ) {
    char * tmp = dst;
    while( *dst++ = *src++ );
    return tmp;
}

2008年7月23日 星期三

Self initialization

int i = i;
這樣做gcc竟然沒問題....
再來看看C++的例子:
struct Test {
    Test() : i_( 0 ) {
        std::cout << "Default constructor" << std::endl;
    }
    Test( const Test & rhs ) : i_( rhs.i_ ) {
        std::cout << "Copy constructor" << std::endl;
    }
private:
    int i_;
};
int main() {
    Test a( a );
    return 0;
}
可以看到只印出一個Copy contructor出來....而內部的變數是未定義的。

2008年7月22日 星期二

カルタグラ ~ツキ狂イノ病~

Demo movie.
選官網的Demo來放而不是遊戲OP的原因是,Demo才有大部分登場角色的畫面,OP反而比較少。
舞台是設定在二戰結束後的日本,正在復原的那段時間;當時上野地區正為了連續獵奇殺人事件鬧得沸沸揚揚。主角高城秋五則在這個當兒被前輩有馬一磨委託幫忙,任務內容卻不是破案,而是尋人事件。
但是委託人的尋人目標竟是秋五以前曾交往過的舊情人上月由良
然後一段充滿血腥,偏執,病態,狂亂的愛情故事就此拉開序幕。
其實這個遊戲的結局除了True Ending以外,其他的結局都很爛...只有和菜初音的結局算是Normal Ending,七七楼子都是Bad Ending,而其他根本無法歸類的就別提了。
以下不直接講劇情,而是以人物別來描述。
上月和菜
尋人任務的妥託人,是上月由良的雙生妹妹。在很小的時候就因為想要演戲,不顧家人的反對而離家出走[?]....到她母親的娘家[?]。但是留在家裡的姊姊由良卻在她離家的這段時間失蹤了,因為家人根本不想把她找回來,所以她硬是拗來專家幫忙找人。
本身是個很天真活潑的女生,相當有演戲的天份,可是平常素性是個表裡如一的....笨蛋,神經很大條,對人完全沒有惡意,也不會懷疑別人,幾乎和任何人都能打成一片;算是整個遊戲裡最陽光的角色。她對自己沒什麼起伏的胸部有一點自卑感= =
不過其實劇情的發展很難看出她到底是什麼時候喜歡上秋五的,感覺就像一見鐘情又像日久生情....[?]
在她的Normal Ending中,故事在快要揪出幕後主使者的時候被一連串突來的事件打亂,所有的證據和線索都付之一炬。大魔王和灰色殺人鬼都沒被抓到,最後以「上月由良死亡」結案。然後和菜就出國深造演技,二人之間依然用書信往來。但是最後畫面中出現的疑似和菜的女人到底是....!
初音
在妓院雪白[?]工作的小女孩。因為年紀還太小不能下海,所以目前是打雜的。
在很小的時候就跟秋五很要好,對秋五來說她就像乾妹妹一樣的存在。內向但是很堅強的女孩子,對於自己即將到來的命運[?]表現出一種淡然接受的態度,就算老鴇雨雀說她不想下海也可以,不過她還是堅持要下海工作以報答雨雀的養育之恩。
雖然平常不太會表達自己的意見不過在秋五跟其他女人親近時還是會鬧彆扭XD,只是秋五一直以為她只是對不純異性交遊排斥...= =
在初音的結局裡,最後秋五在初音下海之前把她帶離了雪白,辭了私家偵探這種危險的工作轉職為教師,由良的搜索也轉交給了好友冬史,自己完全退出了那種刺激的生活。
但是在這之後就沒有再和雪白的任何人取得聯絡,冬史也在一段時間後失去了消息[?],和菜則是去了國外。秋五自分離之後再也沒見過她們。[?]
他們每年依然會去掃乙羽的墓,兩人之間有了名為桜的女兒,從此過著平靜的生活。
高城七七
秋五的親生妹妹。從名字來看應該是老七吧?[?]頭腦異常良好的天才少女[?],本人自稱「我的頭腦是以資料一旦輸入就絕對不會忘記的方式構成的」。
非常繞舌,非常自我中心,凡事皆以自己的興趣和好奇心行動,完全不在意他人眼光,包括秋五。行動能力也是一等一,在自己獨力調查的情況下還能拿到只有警方才能拿到,甚至連警方都拿不到手的資料,從被害人肢體的照片到兇手使用的密室鑰匙都在她的守備範圍內。
本身幾乎沒有任何道德觀念,還可以對吃人肉的兇手投以尊敬的眼光,而且不斷公言這世上自己唯一愛上,能夠讓她「興奮」的人就只有秋五;幸好她的興趣不會讓她去殺人,不然應該是最難對付的對手。
基本上整個遊戲有在認真推理的人應該也只有七七了吧....秋五除了四處喇塞都不知道在幹麻....在True Ending中也是由她來擔任陰謀揭穿者。
但是故事如果走到她的結局卻會很淒慘。秋五先在地下密室被兇手之一砍掉了一隻腳,然後被當成狗一樣養,最後在飢餓到快死的時候終於吃了凜的人肉[?],跨越了他心中「人之所以為人」的界限,而且還是雪白中和他感情最好的凜。之後秋五在精神上就壞掉了。
雖然之後秋五被七七救了出來,但是失去了一隻腳又精神崩潰的秋五幾乎成為廢人了。雖然如此,七七對秋五的執著依然不變,還強暴了沒有行動能力倒在床上的秋五。故事就以兩人脱離常軌的關係做結束。
附帶一提,如果是和菜或是初音的路線,她會很自信地認為隨時都可以把秋五搶回來,而不會採取動作;True Ending她會插手是因為她看不慣秋五被人矇在鼓裡還不自知。

綾崎楼子

綾崎楼子
以前曾經因為遺產爭奪問題而受秋五保護的小女孩。長大以後和七七是同學,同時得知了秋五是七七的兄長之後便積極追求秋五。
本身是身家非常大的大小姐,混血兒,氣品高雅,但是如七七所說的,她其實很淫亂[?]。撒嬌功力一流,如果有玩到她的路線就可以體會到這一點了。
很可惜的是,無論如何她一定會因為太接近秋五,受到某人的嫉妒而被殺害,死狀還很淒慘,腹部大量出血,被柵欄插進雙眼掛在學校大門口。
要是走到了楼子路線,一開始的甜蜜期過完就會在楼子被殺之後急轉直下,秋五被當成犯人逮捕,受到各種慘無人道的刑求,到後來連秋五也想認罪了。
但是就在快認罪之前警方卻收到上層命令把他留在牢裡,沒人看守他也沒給他飯吃。
一開始他還對死去的楼子發誓要活著出去找到兇手,但是後來還是餓到什麼都忘了,只求能活下去。
然後在恍惚中看到了一個惡夢,裡面有沒頭的乙羽在白雪裡亂晃,還有己經上吊自殺的章魚燒老頭[?]和他說話[?],最後秋五就被活活餓死在牢裡。

蒼木冬史

蒼木冬史
獨眼獨臂,銀髮紅眼,皮膚白晰的美女,可惜平常就沒什麼表情,也不太愛說話。本身是上野勢力最大的黑社會的菁英幹部之一,不知道什麼因緣和以前當警察的秋五變成摯友。善用的武器是勾棍,近身戰可說是無敵。
外表和性格讓人很難接近,只有和菜很輕易地就跟剛見面不久的她成為好友。冬史做事豪爽,乾脆,其實某方面來說,她比秋五還要有男人味[?],而且不知道為什麼對味噌有異常的執著。
遊戲中的武打場面幾乎都是交給冬史解決,每次危急時都是她衝出來救人....在True Ending裡也被某人看出她其實也對秋五抱著一點情愫,只是隱藏得很好罷了。

凜
在雪白裡工作的妓女,非常開朗,人際關際很好,因此也是不錯的情報來源;如小貓般的特質和獨特的口調受到很多玩家的喜愛。和秋五之間是一種友達以上,類似兄妹,戀人未滿的關係[?],但是因為自己的身份而沒有打算把關係繼續發展下去。
她跟難搞的乙羽是好友,在乙羽慘死之後也隨著劇情發展而領便當了。

乙羽

乙羽
出場一兩次就領便當的角色,就算CV是北都南也不會給人太深的印象= =。

小雪,芹

被乙羽當成妹妹照顧的雙胞胎,比初音大一點,最近才剛下海。因為太痛苦而入信千里教,沒想到千里教卻把她們獻給高官和有錢人當洩慾人偶。
乙羽因為跟蹤她們發現了千里教的真相慘遭滅口。小雪和芹也因為不能讓她們回去看到和菜讓眾人發現千里教教主的身份而被滅口。

雨雀

雨雀
白雪的老鴇,兼任情報販子。和一般老鴇的印象不同,她為人非常海派,講義理人情,也待手下的姐妹們如家人一般。不知道為啥收留了秋五當米蟲。

祠堂時子

祠堂時子
千里教幹部。是前任教主[?]和信徒之間的孩子;從小就被母親灌輸了千里教教義,所以她其實可說是千里教最忠實的信徒。
但是她其實從頭到尾都被玩弄在股掌之間。劇情發展到最後也是必死。

上月由良

灰色的殺人鬼。
只因為瞳色和常人不同而被所有人岐視,包括自己的親生父親。少女時期就被父親上月慶一郎交易給某機構去當藥物實驗的白老鼠,精神被折磨到無法實驗時才被放回來。只有遇到秋五是她唯一的救贖,但是秋五也因為徵召[?]而離開了她。
於是她就只能閉關在陰暗的房間裡,慢慢把她心裡的各種感情發酵成最強烈最單純的感情--對秋五的愛,對和菜的恨。
其實在故事一開始就很容易猜到她跟連續獵奇殺人事件有關,因為開頭畫面就有個女人在埋屍體....
她可以說是整個遊戲裡最純粹,也是最強烈的角色。
她的愛,讓她辛苦佈了那麼久的局,又為了要和和菜交換身份還不惜弄傷自己的眼睛[?],只為了讓秋五照顧她一星期。
她的恨,讓她下令殺了凜和楼子,尤其是和菜,明明和她只有瞳色不同,卻擁有所有她所失去的一切:朋友,家人,夢想,和情人秋五,因此她最痛恨的人就是和菜。
在最後True Ending中,七七揭穿所有陰謀後,由良挾持了和菜,和菜卻叫秋五殺了她,她願意用自己的生命換取姐姐的幸福。不過由良當然受不了這種「施捨」,正當她憤怒地要下殺手之際,被秋五開槍擊中。
由良最後中彈時的那聲怒吼可說是悲痛至極,因為自己最愛的人竟為了保護自己最恨的人而對她開槍....
最後以由良昏迷不醒作結。之後的故事在Fan disc裡才會補完。
整體來說這部作品的推理性質嚴重不足,主角根本沒在推理[?],事件都是自然發生,不然就是被七七揭穿。
戀愛描寫部分也不夠,因為根本看不出來各女角是什麼時候對主角發生好感,也看不出來主角有什麼特別的優點。
不過人物刻劃和氣氛的營造倒是不錯,畫風我很喜歡,音樂也有很高的水平,只要不把它當成推理劇來看應該就不會失望。
其實本作並不會很陰沉,Innocent Grey社的幽默總是會顯現在奇妙的地方,比方說聲音測試的地方,他們說的內容是在玩接龍,還有不知道存在意義為何的章魚燒老頭....

2008年7月19日 星期六

When the slices happen?

C++在物件導向的多型部分有一種現象,叫做slice,中文叫做切割。它指的是當你試圖把衍生類別的物件轉交給基礎類別時,衍生部分被永遺地遺棄,只剩下基礎類別屬性的情形。
slice的發生絕對是令人不快的,因為它有可能會造成資源洩漏,也有可能造成不確定行為,更糟的是它的發生不會讓編譯器發生警告!
那麼什麼時候會發生slice?
假設我們有個類別叫Base,一個類別Derived繼承Base,下面是會slice的例子:
void function( Base );
Base b;
Derived d;

b = d;            // slice
function( d );    // slice
之所以會slice的原因是,b = d觸發了Base & Base::operator =( const Base & ),而function( d )[?]觸發了Base::Base( const Base & )
在這兩個函式裡,Derived物件被upcast成Base物件[?],然而在Base類別的函式不可能知道Derived類別要如何被正確的複製,於是它不知道的部分就被遺棄了。
如果改成下列形式,就不會發生slice:
void function( const Base & );
Base * b;
Derived d;

b = &d;
function( d );    // slice
因為指標的指定不會喚起建構式和解構式以及指定運算子[?],而reference同樣也不會。
現在你可以知道為什麼多型物件經常以指標型式出現,以及call by const reference被推薦的原因之一了。

Visual C++ 2008 Express does not include tr1

微軟有出增強包來加上tr1的實作,但是只能用在要錢的版本上,Express版是不能用的。
所以可憐的VC用戶只能額外使用Boost的實作品加上一個namespace alias來使用tr1...
後記:
微軟已在 8/11/2008 釋出了Visual Studio 2008 SP1,適用於所有語言的所有版本。

Torvalds又在嘴砲

果然是嘴砲神手。

2008年7月18日 星期五

Pass C++ vector as a C-sytle array

通常C的陣列都會要求像是int *之類的prototype,如果從C++的std::vector<int>要傳給那樣的函式,要怎麼辦呢?
由於std::vector保證元素的記憶體區塊是連續的,因此你可以用:
  1. &(*v.begin())
  2. &v[0]
  3. &(v.front())
來拿到陣列第一個位置,而對C來說也可以正確存取。
不過這不代表你可以用這種方式來取代原本的operator [],因為你會失去安全性。
為什麼不直接用v.begin()?因為它回傳的是iterator,std::vector<T>的實作並不保證它的iterator一定等效於T*,它只保證iterator一定可以Random Access,而T*只是其中一種實作法。
我個人會比較喜歡&v[0],因為還滿直覺,也符合C的風格。
其實我以前就知道std::vector是連續儲存,可是直到別人講起之前我都沒想到可以這樣做= =
果然知道和理解是有差異的。

Khopper v0.0 prealpha

git clone git://repo.or.cz/Khopper.git
git checkout v0.0_prealpha
主要功能:音樂轉檔
目前只接受CUE Sheet的分割。
需要Qt4和Loki,目前是直接call外部程式,需要人手改成內建功能。
有任何問題可以直接跟我聯絡。

根本就是地下爆彈工廠嘛

還好不是在我這裡,半夜被吵起來還以為是雷聲,補個淦!

2008年7月17日 星期四

KDE 4.1 真的準備好了嗎?

這幾天更新了KDE 4.1 RC1,沒想到這是在release前最後一個milestone了。而且根據官網的說法,還是有一些問題有待解決;但是距release的2008/07/29只剩約半個月....
進入RC階段也同時凍結了所有功能,只接受bug fix,但是我認為目前KDE 4的問題應該不只bug那麼單純。文中也提到KDE 4.1如果使用nVidia的驅動程式會有效能上的問題[?],還要再和nVidia官方協調....我看很拼啦。
為什麼我覺得KDE 4.1不只需要bug修正?因為該死的網路設定模組幾乎沒移植到KDE 4上!然後Dolphin的大檔預覽問題也沒修正,多媒體模組沒了AmaroK加持一整個虛掉一半,Plasma的widget能正常動的也不知道有幾個,再來是最鳥的,整個KDE 4的文字反白區都有機會吃掉已選取文字!
最差的狀況就是還要再等4.2(爆)

Purge all configuration of removed packages

# aptitude purge ~c

2008年7月16日 星期三

Git用法簡介

git真的不錯....只是1.4和1.5功能未免差太多= =
BTW,剛剛發現repo.or.cz出現了標籤雲功能了....

KDE4 Application Cleanup

一些對KDE3 -> KDE4的軟體過渡建議[?],不過似乎有點過時,某些部分己經被推翻了[?],但是還是值得一看。
由此也可以看出他們對plasma和solid的執著程度...

2008年7月14日 星期一

Linux Distribution Chooser

透過一連串簡單的問題來找出最適合你的Linux發行版。英文其實除了專有名詞之外也沒什麼難的,再不然就忍受一下簡體吧。
附帶一提,我測出來的結果,頭二個match到的是Debian和Kubuntu,所以應該是很準吧XD[?]

2008年7月11日 星期五

甘道夫可能是教授的十大理由

  1. 甘道夫看起來很老,許多教授也是。
  2. 甘道夫的穿著很容易辨認,許多教授也是。
  3. 甘道夫常說出意味深長的話,許多教授也是。
  4. 甘道夫的話難以理解,許多教授也是。
  5. 甘道夫總能讓你捲入艱難的旅行,許多教授會把你抓進一個叫研究室的地方,所以也差不多。
  6. 就算這樣,甘道夫其實很猛,許多教授也是。
  7. 甘道夫有不為人知的過去,許多教授也是。
  8. 甘道夫神出鬼沒,許多教授也是。
  9. 甘道夫會跑圖書館,許多教授也是。
  10. 甘道夫會大喊:「You can not pass!!!」,許多教授也是。
老梗了,不過再看到還是滿好笑的。:P

2008年7月10日 星期四

做簡報要注意

Life after Death by PowerPoint
這是在一個描述投影片有多無趣的短片之後的小型說明,非常台肯。
因為看到友站 - Zeroplex的文章,臨時去翻了這個舊影片來回味一下。
不要以為字數多圖表多就代表演講內容好,你以為在做講義啊?這是口語傳播耶!
演講的重點不是在show你準備了多少東西,而是讓所有人都知道你在講三小!

顯示卡似乎爆了....

剛剛直接破圖當機,之後開機都是花螢幕...真是禍不單行= =

2008年7月8日 星期二

妓者

剛剛在新聞上看到50珍骨折,妓者訪問陳幸瑜的畫面:
...
「所以(50珍)不是跌倒喔?」
「沒有啦!她又不會走路怎麼會跌倒?
...
後記: 後來逛笨版的時候果然有人先貼了,還附上新聞網址
...
「腳骨折會不會影響身體?」
「廢話腳骨折當然會影響身體,你腳骨折看看會不會影響?」
...
你管子連結

五十幾分有比較威嗎?

穩當的PSP最後調分從4X加到5X....這樣有比較威嗎?差幾分就及格反而讓人X在心裡口難開!

2008年7月7日 星期一

2008年7月5日 星期六

我真的不太清楚為什麼會中毒

前幾個禮拜搬家的時候不小心摔壞了一顆80G的硬碟,而Linux就灌在那顆硬碟上....所以現在桌機只剩下Windows。
這幾天忙著備份資料的時候[?],心血來潮去線上掃了一下病毒,因為我的Windows照慣例是不裝防毒軟體的。掃毒結果出現了19個檔案被感染....可是每個都是cookie XD。
所以其實我不太清楚為什麼有人可以三個月就中一次毒,也搞不太清楚中毒之後要怎麼辦....

2008年7月4日 星期五

突然發現

我好像會有意無意把別人的話惡意曲解再表達出來....真是噁心的個性。

2008年7月3日 星期四

2008年6月30日 星期一

收到Mozilla的紀念T恤

其實上個月就收到了,只是一直到現在才想到。這個活動是在期限內讓自己的Add-ons跟FX3相容的開發者就可以得到一件記念T恤。
對啦,我做的套件只是拿來自high的啦,怎樣?= =
而且其實我常常婊FX3 XD

All pass又飛了

這次裁在PSP手上....我看我可能到畢業都不會All pass了吧。
DD過了...教授加了總分15分[?],不過因為我加分後的總分是75....所以只是拉平均而己。但是真的要真心感謝我的室友...因為我作業都抄他的(汗)。
其他的像SP和OS...沒過我可能會很不爽吧,尤其是SP期末幾乎都我做的...日文從來沒想過會被當掉,結果果然是所有科目最高分。
平均可能還是在六七十分吧...

2008年6月29日 星期日

Why don't they like the "keyword expansion" in VCS

如CVS或是Subversion等版本控制系統都有一個"關鍵字替換"功能,就是如果你在source code裡加入了像是$date$或是$author$等字眼,又打開了關鍵字替換功能,那麽$date$會被展開為最後送交的時間戳記,$author$會被展開為送交這份文件的使用者名稱。其他還有更多關鍵字,端看使用的程式和版本。
聽起來很棒,不是嗎?你可以在文件裡自動加上版本管理資訊,每個人看了都一目了然。
不過很多人不是這麼想的,我們來看看嘴砲名人Linus Trovalds怎麼說
大致上提到的缺點有這些:
它會擾亂merge或是diff工具的行為,因為每次的送交,keyword expansion都會改變,這就導致了VCS每次都要紀錄這些改變,有時候conflict就會發生。想想看你要處理的conflict竟然不是發生在程式碼而是在註解裡的關鍵字吧,心情肯定不會太愉快。
對於二進位檔案[?]來說,keyword expansion是不該發生的。然後你就要小心哪些檔案不該使用keyword expansion。
在VCS裡,這些送交資訊可以很輕易地用log或是info之類的功能查到,而且更詳盡。而當你把source code拿出VCS時,把資訊寫在檔案裡或許是有道理的[?],但是這個工作應該是交給VCS之外的軟體去做,因為它是在拿掉VCS資訊時才做的事。
綜合以上理由,Torvalds老大才會說關鍵字替換是一種弱智的行為,還好他的名字叫Linus Torvalds。

2008年6月27日 星期五

只是想提醒一下

如果我的MSN稱號是寫GNU/Linux,通常代表我在Linux底下。不要叫我做一些很難在Windows以外的地方做的事...我不是高手,不會弄那個。

小畫家明明就很好用

不過是畫幾張圖表罷了幹麻用什麼影像衝擊還是影像商店啊。

現實是殘酷的

動作慢就是會被聰明又動作快的人搶先...
音樂轉檔器才剛開始work就有人作出類似的東西了...看來我自己硬幹還是太慢。這下只能盡量朝完美去做了...

2008年6月26日 星期四

噗哈哈

剛剛找到了PP -ピアニッシモ- 操リ人形ノ輪舞[?]的載點啦~~XD
加上之前載到的カルタグラ〜ツキ狂イノ病〜[?]...嘿嘿嘿...
PS: 我也有和み匣,科科
接下來應該只要等殻ノ少女就全套了吧:P
謎之音: 宅氣権現?

目前的TODO list

  • subversion branch說明文件
  • 熟悉jQuery
  • Khopper持續working,尋找有志同士
  • 報名網站工讀
  • KomiX持續working
  • 準備移駕民雄
  • 準備英檢
  • 準備研究所
  • 處理掉硬碟問題
  • 處理laptop的synaptic問題

突然覺得

我寫專業性的文章都沒什麼人鳥我...
謎之音:因為你不夠專業啊

2008年6月25日 星期三

Pure Virtual Destructor

在virtual function中比較特殊的就是virtual destructor,因為它不會被override,而是被壓進一個stack,先執行derived class的destructor。 因此若要宣告一個pure virtual destructor,它依然不能缺少定義:
/// @file interface.hpp
// ...
class Interface {
    // ...
    virtual ~Interface() = 0;
    // ...
};
// ...
/// @file interface.cpp
// ...
Interface::~Interface() {}
// ...
Reference

Media Player Control DOM for IE

MSDN
簡體

2008年6月21日 星期六

Active Intel wireless cards on Debian Sid

在Debian Etch上裝Intel 3945ABG的驅動需要額外安裝ipw3945的module,但是在lenny之後[?]己經轉移到iwlwifi上,而在kernel 2.6.24及2.6.25之後都己經內建這個模組,所以其實只缺firmware,只要安裝firmware-iwlwifi即可正確驅動....
之前還笨笨地一直在sid上編ipw3945 = =[?]

2008年6月20日 星期五

CrashFox 3

剛剛終於可以在Windows底下用Firefox 3了;因為在Linux底下的IceWeasel不停地crash,下載回來的Firefox 3沒有Qt theme,也不能連網路,就趁著要在Windows上編Qt 4.4.0的機會來試一下正式版。
因為Firefox非常依賴個人設定檔,所以為了方便起見我都是用Portable Firefox。試用的感想是,讓我想砍人的!它不停地讀寫磁碟,我看隨身碟的LED燈這輩子都沒閃得這麼高興過,打個字也頓,開網頁也頓,捲卷軸也頓,回一篇文章我可以花十分鐘。
用完之後我就砍了,前後應該不到二十分鐘吧。
我是不知道Mozilla在想什麼啦,我只知道我開個瀏覽器搞得和開BT一樣,這還是第一次我看網頁的速度瓶頸是在瀏覽器上,而不是網路速度。

2008年6月11日 星期三

阿母的復仇

剛剛看到我媽的離線訊息,她把我的名字打錯了,而且兩個字都錯;突然想起來我小時候都會把我媽名字裡的寫成。君子報仇,三年不晚,何況她等了四倍的時間!XD

2008年6月9日 星期一

台肯

http://www.ptt.cc/bbs/Gossiping/M.1212993378.A.5EF.html 大推
5. Bill Gates等世界大企業老闆都是大學沒畢業

答: 他們在沒讀書的時候已經在創業了, 不是像你們那樣成天混吃等死,

    他們知道他們在幹什麼, 他們有目標. 你不念書那你把你的目標告訴我

nice is nice!

在KDE4的KTorrent放久了會把記憶體吃光的情形,只要在選單命令前加上nice,就可以降低它的優先權,就不會再發生記憶體爆炸了:P

2008年6月6日 星期五

git compress tarbell script - in Python

#! /usr/bin/env python
#-*- coding: utf-8 -*-

import sys, os, bz2, time, optparse

BASE = os.path.basename( os.getcwd() )
TIMESTAMP = time.strftime( '%Y%m%d' )

def main( args = None ):
    if args is None:
        args = sys.argv
    parser = optparse.OptionParser( usage='usage: %prog [options] ' )
    parser.add_option( '-s', '--spec', type='string', dest='spec', help='explicitly sets version string' )
    parser.add_option( '--prefix', type='string', dest='prefix', help='string that before version' )
    parser.add_option( '--postfix', type='string', dest='postfix', help='string that append to timestamp' )
    parser.add_option( '-q', '--quiet', action='store_false', dest='verbose', help='be vewwy quiet (I\'m hunting wabbits)' )
    parser.set_defaults( verbose=True )
    opts, args = parser.parse_args( args=args[1:] )
    if len( args ) < 1:
        parser.print_help()
        return 1

    fileName = '%s-%s.%s' % ( BASE if opts.prefix is None else opts.prefix, args[0] if opts.spec is None else opts.spec, TIMESTAMP )
    if opts.postfix is not None:
        fileName += '-' + opts.postfix
    rData = os.popen( 'git archive --format=tar %s --prefix=%s/ %s' % ( '--verbose' if opts.verbose else '', fileName, args[0] ) ).read()
    cData = bz2.compress( rData )
    fout = open( '%s.tbz2' % fileName , 'wb' )
    fout.write( cData )
    fout.close()
    if opts.verbose:
        print "== compression ==\nbefore:\t%d\nafter:\t%d\nrate:\t%f%%" % ( len( rData ), len( cData ), 100.0 - ( 100.0 * len( cData ) / len( rData ) ) )
 
    return 0

if __name__ == '__main__':
    sys.exit( main() )

我真的覺得Python太好用了....還有我一直沒在做正事= =

2008年6月5日 星期四

git compress tarbell script

#!/bin/sh

if [ $# -lt 1 ] ; then
    echo >&2 "usage: `basename $0` <branch>"
    exit 1
fi

FILE=`basename $PWD`-$1-`date +%Y%m%d`

git archive --format=tar "--prefix=$FILE/" --verbose $1 | bzip2 -fv > "$FILE.tbz2"

KomiX

Main Page: KomiX
git clone git://github.com/legnaleurc/komix.git
License: GPLv2 or later
這是一個看漫畫用軟體,使用Qt4寫成,支援平台為Windows和Linux,且支援Unicode。

Feature

  • 按下空白鍵可依序在圖的四個角落平滑移動,並在需要時換頁。
  • 可開啟檔案或資料夾(未來加入壓縮檔支援,以及網路fetch功能)
  • F11切換全螢幕模式
  • 支援拖拉式開檔
  • Esc縮小至工具列
緣起:
其實只是我超流斷線之後想看漫畫卻剛好沒有合適軟體,隔天它就出現在我的硬碟裡了;然後也順便試作一下Qt的功能。
暗!快要期末考了!
Modified [2008/11/01]
本作品己使用C++改寫,舊版己不再維護。

2008年6月1日 星期日

閃亮亮的KDE4 on Debian

昨天為了完整的amd64系統又重灌了一次,加上全新的KDE4,然後成功裝上了VirtualBox 1.6.0,真是爽!今天早上又找到了w64codecs,看來又可以暫時黏在Linux上一陣子了XD
當Windows不能連BT和驢子,遊戲又能用VirtualBox開,那實在不太有理由再去開它了...

2008年5月30日 星期五

Install nVidia driver on Debian amd64

因為沒有提供amd64的nvidia module套件,所以必須要自己編譯。
# aptitude install nvidia-kernel-source nvidia-kernel-common
# m-a a-i nvidia
# aptitude install nvidia-glx
基本上不太會有編譯失敗的問題。

2008年5月27日 星期二

Loki

如果你正在為設計範式煩惱的話,一定要試試看Loki
裡面包含了Object Factory、Singleton Pattern、Abstract Factory、Vistor Pattern...etc
只要把你自己的class放到template裡,就可以輕鬆達到這些範式的效果!

2008年5月22日 星期四

超幹!

難怪這幾天我的Debian Sid和Kubuntu 8.04收到了openssh的更新,不過沒看到這篇我還真不會去檢查伺服器的openssh。

2008年5月15日 星期四

分級制度

前幾天室友在想要怎麼對女生的外貌分級時,我想到一個以前不知道在哪看過的分級方法:
  1. 天使芭比
  2. 粉紅芭比
  3. 金鋼芭比
  4. 金鋼
  5. 金鋼王
  6. 金鋼怪
  7. 金鋼魔
  8. 無敵鐵金鋼
第三個之後都怪怪的就是了....

2008年5月11日 星期日

Sorry....

教授說如果我再不積極一點可能最後沒有成果可以demo....
其實我只是一直忘記有專題這回事....
雖然錯一樣在我身上= =

2008年5月4日 星期日

JJTree筆記

  1. 每個Production都是一個SimpleNode物件。
  2. SimpleNode類別實作Node介面。
  3. 可以在Production裡用jjtThis變數存取這個Node。
  4. SimpleNode物件可以使用dump成員函式來印出parsing tree。
  5. 如果沒有特別指定,SimpleNode預設會是Prodution的名稱。
  6. 可以設定MULTI=true來為每個Production生成自己的Abstract Syntax Tree Node。
  7. 承上,這時每個Production如果沒有特別設定,類別名稱是AST接上Production的名字。
  8. AST類別在預設情況下是繼承SimpleNode。
  9. NODE_EXTENDS選項可以設定一個使用者自訂類別讓SimpleNode繼承它
  10. NODE_CLASS選項可以設定一個使用者自訂類別讓它繼承SimpleNode,而所有的AST類別都會改為繼承這個類別。
  11. 但是NODE_EXTENDS被標示為棄用,在未來的版本可能被消除;而NODE_CLASS則尚未釋出。
  12. 加入VISITOR選項可以使用Visitor pattern走訪整個AST。
  13. Visitor會自動生成一個介面,要做的只是根據不同的AST節點需要寫出不同的實作即可。
  14. VISITOR_DATA_TYPE可以設定Visitor的引數型態,避免downcast的使用。
  15. VISITOR_RETURN_TYPE可以設定Visitor的回傳型態。
  16. 然而以上兩個選項都尚未正式釋出。

2008年4月30日 星期三

Super Cow Powers

應該很多人都已經知道這個東西了
反正也不是最近才出現的東西
如果在使用aptitude時打錯指令, 或是使用-h的話
它會出現說明, 而最下面那行是: "這個 aptitude 無超級牛力"
而如果使用apt-get -h時
最下面那行是: "This APT has Super Cow Powers."
超級牛力是啥?
下指令
apt-get moo
就會知道了
aptitude更有趣
請依序下這樣的命令
aptitude moo
aptitude moo -v
aptitude moo -vv
aptitude moo -vvv
aptitude moo -vvvv
aptitude moo -vvvvv
....
大概有六到七層左右(可能會因版本而有差異)
PS: aptitude的文字互動模式裡有踩地雷遊戲
Reference

2008年4月25日 星期五

我錯了

教授: CA啊,你看起來寫程式沒問題,可是怎麼期中考考成這樣啊?
我:   喔...因為我直到前一天晚上還在玩刺客教條....

2008年4月24日 星期四

衛生紙要丟馬桶?

前幾天看到新聞時才發現,原來我每次把衛生紙丟到馬桶在國外是常態XD
不過其實我會這麼做的動檵很單純....就是因為家裡的廁所垃圾桶不一定會裝好垃圾袋,然而我每次都是方便完了之後才發現沒垃圾袋,這時候就會丟到馬桶裡沖掉....反正量少的話也不至於塞住,之後就養成習慣了。
隔了二天發文結果是大便文....

2008年4月21日 星期一

Generate HTML form source code

剛剛找到了一個叫GLOBAL的東西,可以把source弄成比較好追蹤的形式。
安裝完之後,使用:
$ gtags
就會生成四個tag檔,包含源碼資訊,然後再用:
$ htags
就可以生成一個HTML的資料夾,裡面就是source的網頁格式。定義之間有連結,可以很快找出來。
其他有很多細節選項,自己讀文件吧。

2008年4月19日 星期六

我真的很會拖稿

事實上下面這篇是在半年多前就寫完了,而且只剩下HTML沒打上去。然而當時想說過一會兒再貼出來,沒想到一會兒會是以月來計算。
其實其他還有很多文章都是打完或是打到一半就腰斬的....

Enable SSL on Apache 2.2 at Debian Etch

安裝環境: Debian Etch
需要套件: apache2 openssl ssl-cert
有的文章會叫你去安裝apache-ssl,不過這是1.3的套件,另外一些文章會叫你執行apache2-ssl-certificate,不過這個也已經不包在2.2裡了。
所以說本文的目的是留個紀錄,確保以後我還記得怎麼弄HTTPS。
安裝需要的套件:
# apt-get install apache2 openssl ssl-cert
產生SSL根憑證:
# openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/apache.pem -keyout /etc/apache2/apache.pem
這會產生有效期限一年的RSA key,路徑可以自己決定。
接下來會有一段設定根憑證發行資訊的問題,適當的填一下就好了。
-----------
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Debian
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
-----------
這樣產生出來的根憑證會有警告,因為發行的組織[?]並沒有被公共認可。不過取得認可是要錢的....自己看著辦吧。
為了安全起見,請設定一下private key的權限:
# chmod 600 /etc/apache2/apache.pem
通常apache2已經有編好SSL模組了。所以只要把可用模組link到已用模組就好。
# cd /etc/apache2/mods-enabled/
# ln -s ../mods-available/ssl.* .
因為預設只監聽port 80,你還要讓它監聽port 443,所以更改/etc/apache2/ports.conf,加入:
LISTEN 443
然後到/etc/apache2/sites-available/,修改VirtualHost的設定。我假設你沒有做太複雜的VirtualHost。
直接把原本的設定複製一份出來,然後分別改成:
NameVirtualHost *:80
NameVirtualHost *:443
之後在NameVirtualHost *:443的區段裡加入這兩行:
SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem
然後重新啟動Apache2就好了。記得自己打開443的防火牆。

2008年4月14日 星期一

Qt的543....

在暑假的時候就一直有這種感覺了,最近在逃避現實(?)的時候又有這種強烈感覺....
覺得它很神奇也可能是我程式寫太少了吧。
首先是它編譯的方式,必須要先用qmake產生.pro檔[?],然後再根據.pro檔生成Makefile,也可以用來生成VC用的專案檔。當然這也不算啥新鮮事,古早的autoconf和automake就是在做這檔事。
然後呢被C或C++摧殘過的人都知道一件事:Pointers are EVIL.
但是Qt卻反其道而行,在傳參數的時候卻大量使用指標,建構物件也幾乎都是使用指標和new,但是你卻很少看到需要自己delete的情形。這是因為Qt仰賴一種委派機制,把自己的生命週期交給上層物件管理,當上層物件被釋放時,自己才被釋放。
Well,其實這對GUI的設計來說還滿合理的,但是當你new一堆物件卻沒delete時,心裡總是會毛毛的XD[!]
被學院派教過C++的人應該也聽過,macros也是一個應該在C++裡極力避免使用的東西,但是Qt也是有很多很神奇的macros,像是Q_OBJECT, SIGNAL, SLOT等等...SIGNAL和SLOT甚至可以把函式轉成字串,再透過meta programming達成事件連結的功能....
缺點就是通常要到執行期才會發現signal或slot的錯誤。[?]
Meta Programming也是一個特色....前述的Q_OBJECT的功用就是用在這裡,總之它會根據macro另外產生出cpp檔,以達成signal/slot機制。
比較討厭的是它會強制要把介面和實作分離,而且不能用在template class上。
而它在事件的驅動部分,使用的就是signal/slot方式。簡單的說,每個類別都可以有若干signal和slot,signal用來發送事件,slot則是接收事件後的動作。你可以將任意兩個物件的signal和slot連結起來,而且不限定為一對一的連結。
這和callback有點不同,callback會讓物件有若干監聽函式,比方說onClick之類的,然後把你要觸發的動作包成一個函式傳進去。callback的做法比較簡單明瞭,但是有其限制。比方說現在你想要對一個按鈕元件監聽它的文字是否改變,這時候除非該物件有提供這個監聽函式,或是一定有某個事件會和它同時發生,否則很難監聽這個事件。
signal/slot機制則沒有這個困擾,因為類別的signal和slot函式都是可以自己擴充的,甚至可以在slot函式裡再發射signal出去。對於C++來說,唯一的缺憾就是,對類別擴充函式的唯一方法,就是繼承,這在很多時候不是那麼的方便。
附帶一提,Kate果然是KDE的爪牙XD[?]

2008年4月13日 星期日

Something about Aptitude

在Debian系的Linux系統中,文字介面的套件管理可能大家都習慣用apt-get了,但是其實aptitude才是它的前端介面。而aptitude若在不給參數的情況下使用,就會進入互動模式,就像是用文字介面構成的視窗一樣,而且支援一定程度的滑鼠操作。
不過其實重點是,選單裡的Action(動作)->Play Minesweeper(玩掃雷遊戲)...
真是傑作。

2008年4月7日 星期一

新增標籤雲展示

參考這個做出來的
不過我有自己再用prototype.js改寫一些東西(主要是hash)的部分。
等code進入穩定期再發佈寫法。
先去上課=.=b

2008年4月6日 星期日

Recover the key binding to KSnapShot in KDE4

在System Settings -> Input Actions裡
把KHotKeys的daemon啟用就可以讓快速鍵重新回來
按下PrintScreen又會自動呼叫KSnapShot抓圖程式
之前遇到不方便的地方都是自己去適應....但是果然還是要自己把它修掉比較好啊
....誰叫現在KDE 4這麼buggy....

2008年4月5日 星期六

2008年4月4日 星期五

Input method in Kubuntu 8.04

KDE4這次有很奇怪的特性,就是在textbox裡不能切換輸入法,可是在inputbox可以,這點困擾我很久了。
剛剛解決了之後才發現原來我一直在繞遠路= =
不多說,直接跳結果。
先編輯/etc/X11/xinit/xinput.d/scim-bridge這個檔案,把判斷scim-bridge的plugin是否存在的路徑從qt3改成qt4,然後再用im-switch -c把當前輸入法改為scim-bridge,隨後重啟X即可。
好像太簡潔了XD

補血

純粹是為了補上一篇靠北文的血而已。
這個作品是繼FORTUNE ARTERIAL之後拆的,沒想到會連續拆到二個以吸血鬼為題材的作品。
主題曲個人加分很大,後來找歌詞的時候發現有人拿這首歌去做灼眼のシャナー的MAD,可惜做得不怎麼樣就是了(笑)
附帶一題,這部是我看過第一部女主角心理強度比男主角還沒出息
然後也是第一部後日談會分兩段整人的作品

不蘇胡

連續三天踩到二個雞肋作品....有點讓我想婊人。
畫風都OK,音樂表現也不錯,人設也很好,但是都敗在劇情路線上,結束的時候還有:啊?這樣就沒啦?的感覺。其中一部甚至是男配角的戲份差點蓋過女配/主角,搞屁啊?我管你聲優是不是綠川光,我寧願和榊原ゆい之類的女角多一點劇情,支線和主線的輕重根本沒分清楚啊!靠!明明很好發揮的人設就這麼被做爛了,這才是令我覺得最可惜的地方....
看來春假還是乖乖地寫作業好了....

2008年4月1日 星期二

助教真仁慈

Compiler作業助教說如果不用regex底下的matcher和matches就可以加五分,但是我實在不想為了那五分bouns去浪費生命自己實作一個match,就直接用String::matches去比對字串。
結果那五分還是加上去了....理論上來說String的matches就是用regex那個package去實作的說,助教真是好人....

2008年3月31日 星期一

一些有用的說明

W3M其實還滿好用的

之前都是用lynx,今天心血來潮用了一下w3m,發現它不只支援滑鼠,還支援滑鼠右鍵選單,滑鼠滾輪也可以用。雖然不支援框架頁,但是會讓你選要看哪一個框架。下拉式選單也有做出來....缺點就是有時候畫面會有殘餘,畫面上連結很多時會很亂。

Debug Assembly Language With GDB

gcc -S blah.c                   # if you want generate from C
as blah.s --gstabs -o blah.o    # --gstabs enables debug flags
gcc blah.o -o blah              # link object file
gdb blah                        # now you can debug it

2008年3月25日 星期二

Dependency walk

很多程式編譯出來後都會有動態連結程式庫[?]的執行期依頼。在UNIX-like下可使用ldd查詢:
$ ldd <PROGRAM>
或是在Windows下也有Dependency Walker可以用[?]
另外,也可以檢查原始碼對header的依賴,但是目前只知道gcc可以:
$ gcc -M <SOURCE>
這會出現很詳細的列表,包括平常看不到的standard header,所以也提供了簡化版:
$ gcc -MM <SOURCE>
通常這個功能是用在Makefile的撰寫上。

2008年3月7日 星期五

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。

2008年1月31日 星期四

防火牆修復

在遠端登入時如果不小心把防火牆搞爛了,可是非常麻煩的事,因為你很有可能無法再次遠端登入來修復防火牆;所以前幾天用python寫了個程式,在伺服器完全斷線時可以先讓防火牆恢復正常。
#! /usr/bin/env python
# -*- encoding: utf-8 -*-

import os, time, sys

def connect_test( *sites ):
        for site in sites :
                if os.system( "wget --tries=2 --timeout=120 -O - %s >/dev/null 2>&1" % site ) == 0 :
                        return True
        return False

flog = open( '/var/log/firewall_fix.log', 'a' )
timestamp = time.strftime( '%Y/%m/%d %H:%M' )

if connect_test( 'http://www.google.com/' ):
        print >> flog, "%s\tSuccess and do nothing.\n" % timestamp
else:
        try:
                if os.system( 'iptables-restore <%s >/dev/null 2>&1' % sys.args[1] ) != 0 :
                        raise OSError
                else:
                        print >> flog, "%s\tFirewall fixed. ( Use `%s'. )\n" % ( timestamp, sys.args[1] )
        except ( IndexError, OSError ):
                os.system( 'iptables -F' )
                for chain in [ 'INPUT', 'OUTPUT', 'FORWARD' ] :
                        os.system( "iptables -P %s ACCEPT" % chain )
                print >> flog, "%s\tFirewall fixed. ( Flush all. )\n" % timestamp

flog.close()

中間的連線測試其實滿dirty的[?],不過目前想不到其他更好的辦法。
噢,對了,Linux only。
2008/2/08 edited. Few code changed.

2008年1月30日 星期三

/dev/null的用處

在一個程式裡呼叫其他程式時,難免會有一些訊息跑出來,而當你不希望它出現時,可以利用I/O redirect導向到/dev/null裡。簡單地形容就是....垃圾筒。

2008年1月28日 星期一

getch()的POSIX實作

#include <stdio.h>
#include <termios.h>

char getch(void) {
        char buf = 0;
        struct termios old = {0};
        if (tcgetattr(0, &old) < 0)
                perror("tcsetattr()");
        old.c_lflag &= ~ICANON;
        old.c_lflag &= ~ECHO;
        old.c_cc[VMIN] = 1;
        old.c_cc[VTIME] = 0;
        if (tcsetattr(0, TCSANOW, &old) < 0)
                perror("tcsetattr ICANON");
        if (read(0, &buf, 1) < 0)
                perror ("read()");
        old.c_lflag |= ICANON;
        old.c_lflag |= ECHO;
        if (tcsetattr(0, TCSADRAIN, &old) < 0)
                perror ("tcsetattr ~ICANON");
        return (buf);
}

int main() {
        char key;
        printf("Press 'x' to exit...\n");
        while((key=getch()) && (key != 'x'))
                printf ("you pressed %c\n", key);
        return(0);
}

Reference

直接觀看封裝/壓縮過的檔案

Unix-like的紀錄檔通常在經過一定時間後就會壓縮為gz檔,為此可以使用如下的指令直接閱讀,不需要真正解開成一個檔案:
gzip -cd file.gz | less
如果壓縮過之前還被封裝過,就要換個程式:
tar -ztf file.tar.gz | less
於是,再一次地我們要發揮程式設計員的美德之一:懶惰。
每次都要打那些指令太煩了,所以我寫了一個bash shell,名叫xless[?],自己根據檔案類型展開。
#! /bin/bash

if [ $# -eq 1 ] ; then                          # 只接受一個參數
        if [[ $1 =~ '\.tar\.gz$' ]] ; then      # 以regex過濾*.tar.gz
                exec tar -ztf $1 | less
        elif [[ $1 =~ '\.gz$' ]] ; then         # 再過濾*.gz
                exec gzip -cd $1 | less
        else
                echo 'Invalid filename.'
        fi
else
        echo 'Must takes one argument.'
fi
然後再把這個檔案改成可執行檔,export到PATH裡,就可以隨時取用了。

Copy Right真絕....

剛才為了要寫一個能在Windows[?]下控制防火牆的程式,但是測試用的code竟然不能用,因為它需要netfw.h,而之前下載的Windows® Server 2003 SP1 Platform SDK裡沒有包含;仔細看一下文件才發現這已經不是最新的Platform SDK,而且也不會再更新了,目前最新的是Windows® Server 2003 R2 Platform SDK,無奈的是它要通過WGA認證才能下載。
其實我也不是在說微軟怎樣,只是這樣會讓我的compile-time需求又多上一筆....

2008年1月27日 星期日

詭異的execv

昨天在寫Linux的系統程式時發現了一件很詭異的事....
那就是execv的prototype竟然是int execv( const char *path, char *const argv[]);
根據這篇的描述,char * const的意思是char的const指標,也就是說雖然有保護到指標,但是沒有保護到pointee的字元
而且雖然非const轉型到const是合法的,但是反向操作很危險。
真想知道它這麼定的理由= =

2008年1月18日 星期五

如何讓你的程式更難理解(2)

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>

#include <boost/lambda/lambda.hpp>

using namespace std;
using namespace boost::lambda;

int main( int argc, char * argv[] ) {
    vector< size_t > v;

    copy( istream_iterator< size_t >( cin ), istream_iterator< size_t >(), back_inserter( v ) );

    sort( v.begin(), v.end(), _1 > _2 );

    for_each( v.begin(), v.end(), cout << _1 << '\n' );

    return 0;
}
以上和以下同義:
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

template< typename T > inline bool gt( T a, T b ) { return a > b; }

int main( int argc, char * argv[] ) {
    size_t temp;
    vector< size_t > v;

    while( cin >> temp ) {
        v.push_back( temp );
    }

    sort( v.begin(), v.end(), gt< size_t > );

    for( size_t i = 0; i < v.size(); ++i ) {
        cout << v[i] << '\n';
    }

    return 0;
}
簡單地說,先從輸入串流讀入一串數字存入陣列,再反序排序,最後全部印出來。
首先仔細地檢視我們要什麼。事實上輸入的動作只要從串流複製一份資料到陣列裡即可,因此使用algorithm的copy和iterator的功能就可以達成目的。
至於排序,預設是遞減排序,其他排法必須要另外再寫一個比較函式。因此這裡使用Boost的lambda函式來減少多餘的宣告。lambda function就是一個臨時的匿名函式,不少高階語言都有,但是C++目前的標準函式庫沒有;Boost是C++標準委員會所擴充的函式庫,基本上很有希望加入為新的標準。
最後是輸出;其實這裡用copy也可以,只是這樣就很難在項目之間插入空白或換行,因此使用algorithm的for_each加上lambda functor。
不要問我為什麼使用using namespace...這只是示範....
 

2008年1月16日 星期三

2008年1月14日 星期一

La Fonera花轟了

不知道為啥只要La fonera想移植就會卡到陰,昨天reset鍵按了五秒左右,就回到出廠值了。
詭異的是default gateway變成192.168.182.1,而且沒辦法由這個位址連線回去更改設定....
我應該找誰呢?(攤手)

2008年1月10日 星期四

災難啊....

我已經不知道從何說起了....在FreeBSD上搞了快十個小時的東西,在Debian上三秒解決;只能說我對FreeBSD不熟吧....寒假再去玩它。
總之感謝Zeroplex的友情贊助。

pkgdb rebuild

在FreeBSD上用
# pkgdb -F
時出現了要我重新整理的提示,google了一下發現這似乎是主幹的bug,在某個分支有修復的樣子。
# setenv PORTS_DBDRIVER bdb1_hash
# setenv PKG_DBDRIVER bdb1_hash
設定以上的環境變數就可以解決,問題似乎是出在btree的結構上,換成hash就解決了。
接下來就是愉快的portupgrade...不過還真他XX的久。

2008年1月7日 星期一

蠢事

星期六有人要我調整防火牆,但是新的規則一直加不進去,於是我想乾脆重來算了,下了指令:# iptables -F....然後才想起來我是用ssh登入....
這種蠢事跟學弟ssh回去下# ifdown eth0一樣白爛,但是更慘,因為小組專案的Subversion檔案庫在那台伺服器上....
因為過了下午五點,然後星期日沒人進得了機房,專案驗證停擺,連我的blog也受到影響= =[?]
這個故事告訴我們,永遠不要用ssh玩網路!= =

2008年1月4日 星期五

pointer和cv修飾詞

大家可能都很習慣用類似const char *這種東西了,在傳遞C-style字串時經常會用到,用意是不要更改到字串內容。不過其實在多層指標時,因應const的位置,狀況還可以更複雜。
首先必需要有的概念是,const TYPETYPE const等義的。
舉例:
const int a = 1;       // a的值永遠為1
int const b = 2;       // b的值永遠為2
const int const c = 3; // 編譯期錯誤,冗餘的cv修飾飼
第二個觀念是,cv修飾詞修飾的是它左邊的型別。
如果它本來就在最左邊,可以用上面的規則代換成TYPE const
舉例:
int x = 4;
int y = 5;
const int * cip = &x;    // 指向const的指標
int const * icp = &x;    // 如前段所述,icp和cip其實是同一種型別
int * const ipc = &x;    // 因為const的左邊是pointer,故它其實是const指標

*cip += y;               // 失敗,因為指向的空間被修飾為const
*icp += y;               // 失敗,理由同上
*ipc += y;               // 正確,指向的空間並沒有被修飾為const

cip = &y;                // 正確,指標本身並不是const
icp = &y;                // 正確,理由同上
ipc = &y;                // 失敗,指標本身是const
當然也可以合起來宣告成int const * const icpc,這樣指標本身不能更改,其指向的空間也不能更動。
最後一個,在指標有多層的時候,解析是由右往左展開。這個比較複雜一點,一樣還是舉例比較快:
const char * const * argv;
const char * test = "Hello, world!";
const char * const temp[] = { "abc", NULL };

argv = temp;         // 正確,最右邊的*沒有cv修飾,因此最上層的argv可以更改為其他指標
argv[0] = test;      // 失敗,右邊第二個*有cv修飾,所以*argv的取值是不能更改的
argv[0][0] = 'd';    // 失敗,最後的char也加了const,是故陣列中的字元不能更改
以下是小應用:
int EXECVP_POSIX( const std::vector< std::string > & args ) {
    const char * * argv = new const char * [ args.size() + 1 ];
    for( size_t i = 0; i < args.size(); ++i ) {
        argv[i] = args[i].c_str();
    }
    argv[args.size()] = NULL;

    return execvp( argv[0], argv );
}
用意是把vector<string>轉為系統函式通用的const char * const *。
Edited: 2008/07/22
修正code。
事實上如這篇所述,POSIX的prototype是怪怪的。