2007年4月17日 星期二

fork, pthread, and signals的基本用法

UNIX程式設計中,學會forksignal的運用,算是相當基本的功夫。 fork()signal經常運用在daemonGuard這一類常駐程式,另外像a4c.tty/yact/chdrv這些中文終端機程式也有用到,一般如Mozilla/Apache/Squid等大程式幾乎都一定會用到。

雖然在UNIX下的程式寫作,對thread的功能需求並非很大,但thread在現代的作業系統中,幾乎都已經存在了。pthreadLinux上的thread函數庫,如果您要在Linux下撰寫多線程式,例如MP3播放程式,熟悉pthread的用法是必要的。pthreadsignal都可以用一大章來討論。在這裏,我只談及最簡單及常用的技巧,當您熟悉這些基本技巧的運用後,再找一些專門深入探討pthreadsignal程式寫作的書籍來研究。這些進階的寫法,用到的機會較少,將層次分明,學習速度應該會比較快。



程式分歧fork()


fork()
會産生一個與父程式相同的副程式,唯一不同之處在於其process id(pid)

如果我們要撰寫Guard程式,或是例如網路伺服器,需要多個行程來同時提供多個連線,可以利用fork()來産生多個相同的行程。


函數宣告

pid_t fork(void);
pid_t vfork(void);

返回值:

-1 :
失敗。
0 :
副程式。
>0 :
將副程式的process id傳回給父程式。


Linuxfork()vfork()是相同的東西。


範例一: fork.c

在這個範例中,我們示範fork()的標準用法。

#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"

void main(void)
{
pid_t pid;
printf("hello\n");
pid = fork();
switch (pid) {
case -1: printf("failure!\n"); break;
case 0: printf("I am child!\n"); break;
default: printf("my child is %d\n",pid); break;
}
for (;;) { /* do something here */ }

}


編譯:

gcc -o ex1 fork.c

執行結果:

./ex1 &

hello

my child is 8650

I am child!

我們可以見到,使用fork(),可將一個程式分岐成兩個。在分歧之前的程式碼只執行一次。


檢驗行程:


ps | grep ex1


8649 p0 R 0:40 ./ex1

8650 p0 R 0:40 ./ex1


8649
是父程式的pid8650則爲副程式的pid
您會需要用到"killall ex1"來殺掉兩個行程。


範例二: daemon.c


UNIX中,我們一般都利用fork(),來實作所謂的"Guard程式",也就是DOS所謂的"常駐程式"。一般的技巧是將父程式結束,而副程式便成爲"Guard" 這個範例中,示範一般標準daemon寫法。


#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"

void main(void)
{

pid_t pid;
pid = fork();
if (pid>0) {
printf("daemon on duty!\n");
exit(0);
} else
if (pid<0)>


編譯:

gcc -o ex2 daemon.c

執行結果:

./ex2

daemon on duty!

I am the daemon!

接下來每三秒鐘,都會出現一個"I am the daemon!"的訊息,這表示您的程式已經"長駐"在系統中了。

檢驗行程:

ps | grep ex2

8753 p0 S 0:00 ./ex2

注意到在範例一中,我們下的指令爲"./ex1 &",而在範例二中爲"./ex2",沒"&"符號。


範例三: lock.c


許多的時候,我們希望"Guard"在系統中只有一個,這時候會需要用到pid lock的技巧。如果您注意到/var/run目錄中的內容,您會發現到有許多的*.pid檔,觀看其內容都是一些數位,這些數位其實就是該行程的pid


#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"

void main(void)
{
FILE *fp;
pid_t pid;

exit(-1);
}

act.sa_handler = quit;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGTERM,&act,NULL);
sigaction(SIGHUP,&act,NULL);
sigaction(SIGINT,&act,NULL);
sigaction(SIGQUIT,&act,NULL);
sigaction(SIGUSR1,&act,NULL);
sigaction(SIGUSR2,&act,NULL);

for (;;) {sleep(3);}

}

編譯:

gcc -o ex1 lock.c

執行

./ex1

daemon on duty!

送信號


我們先找出該Guard程式的pid

PID=`cat /var/run/lock.pid`

接下來利用kill來送信號

kill $PID

Receive signal 15


程式將會結束,並且/var/run/lock.pid將會被刪除掉,以便下一次daemon再啓動。注意到如果quit函數內,沒有放exit(),程式 將永遠殺不掉。


接下來送一些其他的信號試試看。

./ex1

PID=`cat /var/run/lock.pid`

kill -HUP $PID


Receive signal 1


您可以自行試試

kill -INT $PID

kill -QUIT $PID

kill -ILL $PID
.
.
.

等等這些信號,看看他們的結果如何。

信號的定義


/usr/include/signum.h中有各種信號的定義

#define SIGHUP 1 /* Hangup (POSIX). */

#define SIGINT 2 /* Interrupt (ANSI). */

#define SIGQUIT 3 /* Quit (POSIX). */

#define SIGILL 4 /* Illegal instruction (ANSI). */

#define SIGTRAP 5 /* Trace trap (POSIX). */

#define SIGABRT 6 /* Abort (ANSI). */

#define SIGIOT 6 /* IOT trap (4.2 BSD). */

#define SIGBUS 7 /* BUS error (4.2 BSD). */

#define SIGFPE 8 /* Floating-point exception (ANSI). */

#define SIGKILL 9 /* Kill, unblockable (POSIX). */

#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */

#define SIGSEGV 11 /* Segmentation violation (ANSI). */

#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */

#define SIGPIPE 13 /* Broken pipe (POSIX). */

#define SIGALRM 14 /* Alarm clock (POSIX). */

#define SIGTERM 15 /* Termination (ANSI). */

#define SIGSTKFLT 16 /* ??? */

#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */

#define SIGCHLD 17 /* Child status has changed (POSIX). */

#define SIGCONT 18 /* Continue (POSIX). */

#define SIGSTOP 19 /* Stop, unblockable (POSIX). */

#define SIGTSTP 20 /* Keyboard stop (POSIX). */

#define SIGTTIN 21 /* Background read from tty (POSIX). */

#define SIGTTOU 22 /* Background write to tty (POSIX). */

#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */

#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */

#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */

#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */

#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */

#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun).*/

#define SIGPOLL SIGIO /* Pollable event occurred (System V). */

#define SIGIO 29 /* I/O now possible (4.2 BSD). */

#define SIGPWR 30 /* Power failure restart (System V). */

#define SIGUNUSED 31


函數宣告:

Signal Operators

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signum);

int sigdelset(sigset_t *set, int signum);

int sigismember(const sigset_t *set, int signum);


Signal Handling Functions


int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);

int sigprocmask(int how, const sigset_t *set, sigset_t*oldset);

int sigpending(sigset_t *set);

int sigsuspend(const sigset_t *mask);


Structure Signal Action

struct sigaction {
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}


2007年4月16日 星期一

typedef的特殊用法

Question:
typedef void (*A)(B);
A C=D;
這樣子是把(*A)(B)定義為void嗎??


Answer:
這個叫做函式指標
一般在 typedef 時形式是這樣
typedef 回傳型態 (*定義名稱)(傳入型態1, 傳入型態2...)

所以你上面的「typedef void (*A)(B);」
當中的 B 應該是一種形態
這意思是說
「將一種指向不需要回傳(回傳型態是 void )
且需要傳入一個 B 型態(物件)作為參數的函式指標
稱之為 A 指標」

後面的「A C=D;」就是說
宣告一個 A(指標) ,名稱為 C
且將 D(函式的位址) 存入 C 當中

在使用時只要使用
C(傳入參數)即可
功能和 D(傳入參數) 是完全一樣的

範例:
typedef void (*HANDLE_LED_FUNC)(BOARD_LED_NAME ledName, BOARD_LED_STATE ledState);
「將一種指向不需要回傳(回傳型態是 void )
且需要傳入一個
BOARD_LED_NAME ,BOARD_LED_STATE型態(物件)作為參數的函式指標
稱之為
HANDLE_LED_FUNC指標」


HANDLE_LED_FUNC gLedHwFunc[MAX_VIRT_LEDS];

宣告一個
HANDLE_LED_FUNC(指標) ,名稱為 gLedHwFunc
在使用時只要使用
gLedHwFunc(傳入參數)即可


2007年4月9日 星期一

完整聲望指南

出處: http://bbs.ngacn.com/read.php?tid=893042&fpage=1
總述:TBC 新聲望多多,比舊世界的聲望好沖但也不是江湖傳聞隨隨便便就崇拜的。至於舊世界的聲望,那已經是比浮雲還浮雲,一點用處也沒剩下了。
銀月城(Silvermoon City/埃克索多(Exodar
部落和聯盟對應的新主城聲望。TBC之前的2.0版就出現了,大家可以提前在大戰場裏面交東西刷。尊敬以後在各自對應的營地裏10%折扣,再之後唯一的用處就是舊種族想騎鴕鳥/大象用的。兩種新坐騎都蠻帥,還不能通過戰場徽記換,想要的或者有收集癖的,開始屯符文布吧。人家NPC都知道,銀月城布匹軍需官直接就說“其實你就是想要我們的鳥吧”。另外,我血精靈從170作任務,半片布沒捐,現在是差1000崇拜。所以如果練個其他種族的新號,從小跑過去作任務也是一種方法。

P.S.
這裏抱怨一句,銀月城確實是玻璃渣心血之作,全城兩個旅店,兩個拍賣,兩個銀行,遍地都是信箱,又漂亮幹什麽都還方便;相比之下埃克索多就麻煩,還亂,你說你就算迫降了,一艘宇宙船怎麽還不如人家一座土城便利啊。
鬼魅之地(Ghostland/血霧島(Bloodmyst Isle
血精靈和德萊尼各自的12-20級區域,其實聲望的名字是這兩個地方的城鎮名,不過我都忘了 OTZ 沒啥好說的,做個任務給三四千,把所有任務作完,滿打滿崇拜。在不同級別的聲望可以買些裝備。最後崇拜了是個耐力+7的披風和一把不錯的雙手劍,18級的小人兒用起來還是蠻爽的,所以有不少其他族的小號也跑過來刷。總之就是從小教育你聲望的重要性和不可避免性 OTZ

外域聲望
薩爾瑪(Thrallmar/ 榮耀堡(Honor Hold
聯盟和部落在地獄火平原的前線基地,也是60級玩家進入地獄火之後接觸的第一支聲望,同時也是我個人列爲四大聲望之一的重要的一組。
獲取方法:
-
相關任務,主要集中在地獄火平原,一直有效;
-
擊殺地獄火堡壘附近副本外的普通獸人怪,友善後不再給聲望;
-
擊殺地獄火要塞,血熔爐副本內部的怪,尊敬後不再給聲望;
-
擊殺破碎大廳,英雄模式地獄火副本群內的怪,一直有效;
-
5 枚地獄火平原PVP徽記(獲取方法見地域篇)可以換取一道具,使用後可以增加在地獄火副本群內打怪獲得的經驗5%,聲望25%,持續30分鐘。
刷之最速指南:
不做任務,一邊PK一邊埋頭砍怪直到友善;友善以後把攢的PVP徽記全換了上面提到的聲望道具然後刷要塞/血熔爐直到尊敬(加起來大概跑45次副本);尊敬以後開始做所有的任務,全收了能有尊敬一半多。68+ 以後刷破碎大廳直到崇敬(還是儘量用聲望25%的道具,在第一個Boss 臨死前用效率最好);想沖崇拜的繼續刷破碎大廳或者英雄地獄火副本。比較噁心,因爲要忍住很多剛到外域的任務不做。對於喜歡研究劇情或者裝備比較落後的玩家來說跳過薩爾瑪/榮耀堡的任務不是好的選擇。好在地獄火平原雙方各自有另外一個營地,對應銀月城/埃克索多的聲望,也不是完全行不通。
獎勵:
崇敬是必要的,因爲這個聲望崇敬了才能買鑰匙下地獄火副本群的英雄模式。崇拜了是一把長柄,一把單手斧,一把法傷單手劍,大家就各自看著辦了。

塞納裏奧遠征軍(Cenarion Expedition)
塞納裏奧議會派往外域的遠征部隊,因爲兩地相隔太遠溝通不便,所以逐漸自成一家(啥?塞納裏奧議會崇拜?Sorry,我們這裏不買賬)。依然是以悲天憫人,以拯救大自然爲己任的德魯伊爲主。四大聲望之一。
獲取方法:
-
相關任務,分佈五大區,一直有效;
-
擊殺遍佈贊加沼澤的納迦普通怪,友善後不給聲望;
-
擊殺奴隸圍欄,沼澤洞穴副本內的怪,尊敬後不給聲望;
-
上交10個未識別的植物(Unidentified Plants)給塞納裏奧避難所的NPC,可重復,一組250聲望,未識別的植物贊加沼澤的所有怪隨機掉落,尊敬後不給聲望;
-
上交一組未識別的植物時會獲得一包植物,一般是零碎草藥,其間很小幾率會出一個未分類的族群(Uncatalogued Species),拿去再上交可換500聲望,一直有效;
-
擊殺蒸氣大廳,英雄模式盤牙副本群內的怪,一直有效;
-
上交盤牙護甲(Coilfang Armament),需要先完成蒸氣大廳的一個任務,可重復,蒸氣大廳和英雄模式盤牙副本裏的納迦怪小幾率掉落,不綁定可交易,一直有效。
刷之最速指南:
四大聲望裏最容易的一個:沖進贊加沼澤無視塞納裏奧避難所的任務,一邊做各自陣營兩個營地的任務一邊砍納迦,攢未識別植物(所有贊加的怪都掉)。友善以後開始上交植物,如果遇到未分類的算你好運(我交了七八組就遇到一次),同時開刷奴隸圍欄和沼澤洞穴(看你植物攢了多少,我兩個副本一共跑了三次就尊敬了)。尊敬以後開始做任務,贊加沼澤,刀刃山,地獄火平原,泰羅卡森林,虛空風暴都有遠征軍的任務點。所有任務做完正好夠尊敬到崇敬。想沖崇拜的繼續刷蒸氣大廳/英雄盤牙副本/交盤牙護甲。
獎勵:
崇敬是必要的,因爲這個聲望崇敬了才能買鑰匙下盤牙湖泊副本群的英雄模式。有不少+自然抗裝備的圖紙。有獵人會喜歡的高dps 彈藥。治療一個布衣帽子一個單手,但都跟同級別的副本掉落差不多。崇拜是一把彪悍的野德雙手錘和一個治療副手。

孢子人(Sporeggar
贊加沼澤的小蘑菇人,生的可愛,活的可憐,基本贊加是個東西都能欺負他們。一開始跟玩家是不友善,要刷到中立以後才能接任務。
獲取方法:
-
相關任務,通共就三,不過要中立才能獲得;
-
上交成熟的孢子囊(Mature Spore Sac)和蘑菇巨人捲鬚(Bog Lord Tendril),可重復,蘑菇巨人掉落,友善後不再給聲望;
-
上交發光蘑菇(Glowcap),可重復,贊加沼澤遍地都是,隨便撿,友善後不再給聲望。
-
擊殺蘑菇巨人(Bog Lord, Fungal Giant)和沼澤怪(Marsh Lurker/Dredger),崇敬後不再給聲望;
-
擊殺血麟納迦(Bloodscale)兩種各12個,可重復任務,友善後獲得,一直有效;
-
上交豐滿的孢子(Fertile Spores)和紅木槿(Sanguine Hibiscus),友善後獲得,可重復,前者由沼澤行者(Marsh Walker)掉落,後者在沼澤洞穴副本中掉落/拾取。一直有效;
刷之最速指南:
非常容易的一個聲望,殺蘑菇巨人本身就給聲望,還能交孢子囊和捲鬚。不要交發光蘑菇,因爲這是用來買該聲望獎勵的貨幣(“我看到你們用又亮又圓的金屬片作交易,我們孢子人也是這樣,不過我們用又亮又圓的蘑菇”)。友善以後做任務,殺納迦,下副本都可以。崇拜以後還有個護送任務,一個蘑菇巨人替孢子人打抱不平,讓你跟著它一起去砍納迦,很搞笑。
獎勵:
裝備一般,不過有幾樣有趣的東西:一個寵物食物的食譜,喂了可以提升寵物戰鬥力,術士寵物都能吃,非常OTZ。一個使用減仇恨的披風和一個減仇恨藥水的配方,特定情況下會有用。

麥格哈(Mag'har / 苦雷尼(Kurenai
納格蘭平原上對應部落和聯盟的兩支聲望。麥格哈是沒有受過任何污染的棕皮獸人的聚集地;苦雷尼則是一群尚保存著自我意識的破碎者(The Broken)在亂世中的避難所。
獲取方法:
-
相關任務,集中在納格蘭,麥格哈在地獄火有少量任務;苦雷尼在贊加有少量任務,一直有效;
-
擊殺納格蘭的食人魔和破碎者,一直有效;
-
上交黑曜石念珠(Obsidian Warbeads),10 500聲望,可重復,念珠所有納格蘭食人魔怪隨機掉落,一直有效;
刷之最速指南:
刨去劇情不說,不是很重要的聲望。而且所有加聲望的方法都是從中立到崇拜一直有效,所以沒什麽技巧,想怎麽沖怎麽沖吧。我個人光做任務,不刷怪不刷念珠現在是尊敬一半。幾點注意事項:
-
念珠同時可以用來沖虛空財團的聲望,玩家需要在兩者之間作一下取捨;
-
麥格哈一開始對部落玩家是不友善,需要完成地獄火平原的一個系列任務,“發現”了這群隱居的獸人後,才會變成中立並給玩家提供任務。同樣苦雷尼一開始與聯盟玩家也是不友善;
-
麥格哈無論劇情還是獎勵都分量最重的任務鏈,需要完成所有其他麥格哈任務,包括某個野外的護送任務和某個協助惡魔獵手打擊燃燒軍團的任務鏈後,才會在歌亞母親老人那裏接到。該任務鏈途中某幾步還會獎勵沙塔爾(Sha'tar)的聲望,並最終觸發著名的薩爾前往納格蘭事件。
獎勵:制皮圖紙,高級箭袋,一般的藍裝。崇拜以後可以購買高大威風的外域羚羊(Talbuk)坐騎。不過該坐騎也可以通過在哈爾拉PK,用哈爾拉戰鬥徽記來買(看你愛走PVP路線還是PVE路線了)。

P.S.
這裏插幾句劇情,話說德萊尼人分三種。身心健全的是德萊尼(Draenei),現在基本都在埃克索多,也就是玩家;身心被摧殘的一點人格都不剩,完全退化萎縮的是失落者(Lost Ones),意思就是一點救都沒有跟動物差不多了。加在中間的叫破碎者(The Brokens),這幫傢夥身心剛剛開始崩潰,有點神志不清舉止瘋狂被害妄想,但好歹還算有人性人格。TBC裏他們經常以中立NPC的身份出現。但他們有個毛病就是內部經常出叛徒(沒辦法,精神狀態不穩定),動輒把自己的族人賣給蛋軍或者燃燒軍。盤牙湖泊的奴隸圍欄副本說的就是他們,裏面到處是被納迦奴役的破碎者。第一個Boss就叫叛徒門努(Mennu the Betrayer),臨死前會感歎一句“Ideserve this”(我…活該如此),讓人頗爲唏噓。而Kurenai(德萊尼語中“被救贖者”的意思),則是一群比較有良知,希望在這個到處把他們當怪物的世界上尋一處謀生之地的破碎者,因此我翻譯他們叫“苦雷尼”,算是形容他們命運坎坷吧。

哈爾拉(Halaa)
不是聲望,不過提到了納格蘭就說說。該城在被己方陣營掌握的情況下會出售裝備。需要哈爾拉戰鬥徽記和哈爾拉研究徽記兩種貨幣。戰鬥徽記就是在哈爾拉攻防戰中擊殺對方玩家獲取,只要你伺服器上的人夠嗜血而且大家能聽話組成Raid(各自爲戰很沒效率),很容易入手;研究徽記是20份奧舒岡水晶樣本(Oshu'gun Crystal Sample)換1個。而樣本則是納格蘭的所有生物隨機掉落。我沒有刷,做了所有納格蘭的任務總共得了4個研究徽記。好在裝備一般需要戰鬥徽記多,研究徽記就要12個。最貴的羚羊坐騎要20個研究徽記。哈爾拉出售的都是PVP向的裝備。

虛空財團(The Consortium
前文提到的宇宙地精。虛空人,造型很帥,走起來帶殘像,名副其實的拉風。虛空人自己的歷史也是爛賬一大筆。簡單說有點像太空版銀色黎明:虛空人的家園被某宇宙怪獸(類似術士藍胖子的生物)入侵,家破人亡。原先的領導層Ethereum開始復仇計劃,結果復仇無果自己先跟血色十字軍似的神志不清六親不認了。兩撥勢力從中反叛出來。一幫繼續復仇計劃但保持頭腦清醒,The Protectorate;另一幫徹底放棄國仇家恨開始唯利是圖,就是財團,The Consortium(靠,這幫虛空人的設定可以自己獨立成一個遊戲了)。財團在外域最大的計劃是挖掘奧舒岡,這座位于納格蘭的獸人族聖山在財團眼裏是“宇宙中已知最大的整塊鑽石,無價之寶”。
獲取方法:
-
相關任務,集中在納格蘭和虛空風暴,一直有效。
-
上交象牙(Pair of Ivory Tusks),3250聲望,可重復,象牙由納格蘭的野生象掉落,友善後不給聲望;
-
上交奧舒岡水晶碎片(Oshu'gun Crystal Shards,跟哈爾拉那個不一樣),10250聲望,可重復,碎片由奧舒岡附近的虛空人掉落,友善後不給聲望;
-
上交黑曜石念珠,可重復,一直有效;
-
上交紮克斯徽記(Zaxxis Insignia),可重復,由虛空風暴的財團敵對虛空人掉落,一直有效;
-
擊殺奧金頓的魔力墓穴(Mana-tombs)副本裏的怪,尊敬後不給聲望;
-
擊殺英雄模式魔力墓穴副本裏的怪,一直有效;
刷之最速指南:
到友善太容易了,在納格蘭打象牙(掉率100%,野象不多但也不少),或者在奧舒岡周圍屠虛空人,秒到友善(財團是狡詐的,納魯人政治上施加壓力阻止他們挖掘奧舒岡,於是他們自己不動手但放任其他競爭對手去挖,等人家挖了以後再雇用玩家去搶過來 OTZ)。友善以後就比較麻煩了。念珠和徽記的掉率都一般,效率不高,而且念珠還和麥格哈/苦雷尼的聲望衝突。魔力墓穴是過渡性質的,人氣不如五大副本。作任務也就是到尊敬多一點。剩下的路就只能靠毅力刷了。
獎勵:
主要是各類珠寶學圖紙,裁縫的珠寶袋圖紙和獵人的彈藥袋都比較容易入手。其他沒有太值得一提的裝備或者道具。崇拜以後是布衣帽子,副手匕首和物理dps項鏈。
(更新)當玩家完成了納格蘭的財團任務並與財團聲望達到友善後,玩家會被承認爲“財團員工”並與每月初收到財團發來的薪水——內容是隨機寶石若干,聲望越高自然薪金越好~
關於王子:WOW裏面的“公主”一般都很衰,但“王子”一般都很拉風。財團首領,虛空貴族,星際王子哈拉馬德(Nexus-Prince Haramad)就是又一位有型的王子。這傢夥兩次登場都是以全息影像的方式,因爲他仇家太多,輕易不肯露面(初次見面的時候他跟玩家說:“如果你是來殺我的,請拿號排隊”OTZ)。如果說地精給人的感覺是暗巷裏的奸商,那麽王子和財團給人的感覺就是有派頭的黑幫,不做小生意只做大買賣(人家畢竟是以宇宙爲舞臺的)。哈同學派頭大,在虛空風暴這種不毛之地給自己造了座熱帶大溫室裏面還帶空中花園;手段狠,競爭對手,另一位星際王子沙法(Nexus-Prince Shaffar,魔力墓穴的總Boss)說殺就殺了;但關鍵時刻還是有大義。玩家完成了一套系列任務,幫他取得了他夢寐以求的一塊擁有強大法力的納魯聖水晶後,玩家的無私(廢話,我也不想給可我留著也沒用啊)感動了王子。這個時候恰巧血精靈的刺客追隨殺到要奪取水晶,哈同學通過傳送門唯一一次在遊戲中華麗登場將衆人秒殺。隨即在玩家感化下決定捨棄小我成全大我把水晶歸還納魯人,並正式加入到對抗軍團和某蛋的陣營中來(這就是坦匹斯特要塞拱廊區的鑰匙任務)。

沙特拉斯城聲望組
前面說的,一個破城裏擠著四個聲望,還偏偏是特別重要的四個。
奧多爾(Aldor / 占卜者(Scryer
對立的兩個陣營,類似淒涼的半人馬,只能選擇其一(有更改的方法,不過非常麻煩,基本上選了就是一輩子的事情了)。奧多爾是一群德萊尼祭祀,當年沙特拉斯被屠城的時候他們躲了起來,在感應到納魯降臨後,他們又回到了沙特拉斯。占卜者直譯是“占卜者”,他們是在沙特拉斯重建後凱爾王子派來攻城的血精靈精英部隊,但在城下卻集體放下武器倒戈——因爲他們獲知了凱爾的陰謀,覺得只有納魯和聖光才是拯救血精靈一族的出路。兩派都很忠心納魯,但互相看不順眼:奧多爾覺得占卜者有叛徒的前科信不過;占卜者則受不了奧多爾總以正統納魯信徒的調調自居。奧多爾主要集中力量打擊燃燒軍團,占卜者則集中力量打擊阿蛋的血精靈軍團。
獲取方法:
-
相關任務,集中在沙特拉斯城,虛空風暴和暗月峽谷,一直有效;
-
上交火翼紋章(Firewing Signet / 基爾加丹之印(Mark of KilJaedan),分別對應占卜者 / 奧多爾的聲望,分別出自低等級(68以下)的血精靈和軍團惡魔。可重復,尊敬後不給聲望;
-
上交陽怒紋章(Sunfury Signet / 薩格拉斯之印(Mark of Sargeras),分別對應占卜者 / 奧多爾的聲望,分別出自高等級(68以上)的血精靈和軍團惡魔。可重復,一直有效,68級以上才可以接;
-
上交奧術寶典(Arcane Tomes / 惡魔護甲(Fel Armament),分別對應占卜者 / 奧多爾的聲望,分別出自高等級(68以上)的血精靈和軍團惡魔。掉率低,可重復,一直有效;
刷之最速指南:
首先要做卡德加的一個任務(很簡單,就是跟著NPC逛整個沙特拉斯城,聽它介紹該城的歷史人文),然後在兩個陣營裏面做一個選擇(終身大事啊),才能去各自的區域接任務。沒有對應的副本。從中立到尊敬就交火翼/基爾加丹印,63級上下的血精靈/惡魔掉,30%左右吧,1個給25聲望,可以11個交也可以1010個交。尊敬以後開始做任務同時交陽怒/薩格拉斯印,68級上下的血精靈/惡魔掉。奧術典和惡魔甲得掉率蠻低,不過一個就是350聲望。總之一邊刷怪一邊花錢買吧。
-
血精靈一開始就與占卜者友善;德萊尼一開始就與奧多爾友善。其他種族起始雙方都是中立;
-
所有聲望物品都不綁定,可以拿去換去賣去扔拍賣行。最好的方法是找一個相反陣營的朋友兩個人互相換各取所需。
-
上交奧術典/惡魔甲除了給聲望外,還給一個該陣營的貨幣;尊敬以後可以拿該貨幣去換各種牛X的肩膀附魔(所以這兩樣東西格外值錢);
-
每增加自陣營的聲望,會減少對方110%的聲望,同時增加沙塔爾(Sha'tar50% 的聲望(例:+100占卜者聲望 -110 奧多爾聲望 +50 沙特爾聲望);
-
選擇了某一陣營後去沙塔拉斯城的對方陣營區或者暗月峽谷的對方陣營營地會被遍;
-
改陣營的方法:在貧民區雙方各自有一個NPC,即使仇恨了也可以對話得到一個可重復任務:每8個泰羅卡森林的蜥蜴眼睛換250該陣營的聲望,一直可以重復做到該陣營恢復中立爲止。不過你之前沖的聲望也就廢了,非萬不得已慎之慎之啊。
獎勵:
既然是二選一,自然雙方各有擅場,而且因爲是大聲望組,所以獎勵多多。建議大家還是根據自己的狀況分析研究,我也會在今後補完自己的心得研究。粗略概括的話:占卜者偏PVP,奧抗自然抗裝,Tank;奧多爾偏PVE,火抗暗抗裝,物理dps

沙塔爾(Shatar
意思是“生於聖光”(Born from Light),沙塔爾是一群來到外域的納魯人。他們是沙特拉斯城(意思是“聖光之居所”)的重建者和領導者,占卜者和奧多爾一同效忠的物件。外域對抗燃燒軍團和蛋軍的所有種族大聯盟的精神核心。該組是四大聲望之一。
獲取方法:
-
相關任務,泰羅卡森林的一小撮,以及部落納格蘭長線任務中的幾步,還有坦匹斯特要塞拱廊區鑰匙的任務線,一直有效;
-
所有占卜者/奧多爾的可重復任務可以給50%的沙特爾聲望,但尊敬之後就不給了;
-
擊殺坦匹斯特要塞群的三副本中的怪,普通或英雄,一直有效;
刷之最速指南:
比較難的一組聲望。一邊沖占卜者/奧多爾的聲望一邊沖沙特爾的聲望。尊敬以後開始做任務,全做了尊敬一半(部落的話還多些),然後開始跑坦匹斯特三副本,一趟大概1500聲望左右,拱廊區難一些給的聲望也多一些。跑45 趟也就崇敬了。
獎勵:
崇敬是必要的,因爲這個聲望崇敬了才能買鑰匙下坦匹斯特要塞副本群的英雄模式。崇拜以後是一把無敵單手大奶錘和一枚無敵物理dps大戒指。

貧民區(Lower City
沙特拉斯城的下層城區,來自外域四面八方五花八門的種族的難民們聚集在這裏避難謀生。比起沙特爾的神聖不可侵犯,占卜者/奧多爾的勾心鬥角,貧民區又是另外一番景象。雖然戰火摧殘的痕迹很重,不過劫後餘生的人們還是在努力生存,玩家的任務就是幫他們打點大大小小的各種事務。可別小看,該聲望是四大聲望最後的一個。
獲取方法:
-
相關任務,集中在沙特拉斯城和泰羅卡森林,一直有效;
-
上交阿拉可瓦羽毛(Arakkoa Feathers),可重復,泰羅卡森林的鳥人們掉落,尊敬後不再給聲望;
-
擊殺奧金頓系統的塞泰克大廳和奧金頓墓室副本裏的怪,尊敬後不再給聲望;
-
擊殺暗影迷宮,英雄模式奧金頓副本群內的怪,一直有效;
刷之最速指南:
比較難的一組。一邊屠泰羅卡森林的鳥人——羽毛掉率不錯但30個才250聲望—— 一邊下賽泰克大廳和奧金頓墓室這兩個地方。兩個都是小副本,只有倆Boss 掉落也是過渡性質的,人氣不高隊伍不好組。熬到尊敬以後開始做任務,全收了又是一半多,然後一直刷暗影迷宮到崇敬,崇拜。
-
上交30個羽毛除了換聲望外,還隨機給幾個卷軸,幾瓶藥水和一件綠裝。
獎勵:
崇敬是必要的,因爲這個聲望崇敬了才能買鑰匙下奧金頓副本群的英雄模式。裝備都一般,商業技能圖紙不少。
時之守護者(Keepers of Time
時空之穴裏面的青銅龍軍團,由諾茲多姆的兒子安多姆(Andormu)和女兒諾莎麗(Nozari)領軍,爲了維護歷史的正確性,跟吃飽了沒事幹不知從哪里鑽出來的無限龍軍團(Infinite Dragonflight)作戰。
獲得方法:
-
任務,兩個副本各自一個,不過一個給5000,一個給8000
-
擊殺兩副本裏的怪,一直有效;
刷之最速指南:
非常直線型的結構,刷就是了。其實很簡單,兩個任務做完基本就尊敬一半了,再跑個34 趟就差不多。
獎勵:
這個聲望崇敬了才能買鑰匙下時空之穴副本群的英雄模式。不過因爲目前沒有任何Raid的鑰匙任務線跟時空之穴的英雄模式挂鈎,所以沒有被我列爲四大聲望之一。崇拜了有個減仇恨的飾物
安多姆和諾莎麗兄妹分別有兩種人形態:血精靈正太蘿莉和血精靈帥哥美眉。問題在於這兩種形態四個人會同時出現,分別代表他們各自的過去與未來,確實能給人造成很強烈的時空錯位感。

沙之鱗(Scale of the Sands / 紫之眼(Violet Eye
兩個Raid對應聲望,合一塊說了。前者是青銅龍王諾茲多姆的老婆索瑞多米(Soridomi)領導的青銅龍的又一分支(龍就是牛啊,一家子人分出三支聲望來),專門負責保護海加爾之戰這一段歷史;後者則是達拉然法師的秘密組織,責任是監視卡拉贊和麥迪文的動向。
聲望獲取方法:海加爾鑰匙任務完成後可以達到友善,再要繼續估計是砍海加爾副本裏的怪;後者是刷卡拉贊。都是沒啥技巧的直線型刷。
獎勵:前者目前就知道有紫色的箭/彈藥;後者有四套戒指,像當初諾茲多姆子嗣那樣,每到一個聲望級有一個升級版。紫之眼尊敬以後卡拉贊內部的鐵匠NPC 就會提供修理服務,每次Raid 修裝備就容易多了。

虛空之翼(Netherwing / 灰舌死誓(Ashtongue Deathsworn
兩個暫時沒完成的聲望。虛空之翼是聚集在暗月峽谷的虛空龍族的聲望,通過完成一個中等長度的連鎖任務(見地域篇暗月峽谷),玩家可以與該聲望組達到中立。
灰舌死誓是駐紮在暗月峽谷,由阿卡瑪(AkamaTFT戰役中登場英雄)率領的伊利丹的破碎者軍團。(劇透警報)主要的任務是看守被囚禁的瑪維-影歌(Maiev ShadowsongTFT著名SM女)。玩家通過系列任務可以發現阿卡瑪只是爲了保全族人而表面上與蛋效忠周旋,暗地密謀策劃解放外域所有破碎者的大計。
這兩個聲望暫時都沒有直接獎勵,但前者據說今後會跟虛空龍坐騎的PVE 獲取方法挂鈎(PVP獲取方法是競技場季賽冠軍);後者估計將來打入黑暗神廟與蛋巔峰對決的時候會有所幫助。

2007年4月3日 星期二

初期衝聲望的心得

rep計畫的第一站是在沼澤區鳥點 或是 hh西北邊那個達尼TEMPLE區
這兩個是達尼相關REP 沒用處 但是好解EXP肥
等到62可以輕鬆打Orc提升HH Rep的時候 在副本外面打到Friendly
才進去副本內耕那個6000Rep
Rampart沒有Wipe快速推完一趟大約750
BF沒有Wipe快速推完一趟大約800
人類可以更多
把等級壓在65之前達到這個目標後
從Honor開始解所有的HH REP任務 人類絕對爆表 其他種族保留

CE rep
收集所有的Part 白色小花圖樣 mob隨機掉落 Herb可以收割到
360個後開始類似晨光麥任務
可以開出一個接任務的物品 一個+500
運氣好開出12個你就可以直接Honor
然後CE相關任務可以解光不用保留 剛好rep +12500 到達revered
另外沼澤西邊湖中小島上有個蝦人 任務怪殺一次+7
好像可以殺到滿

2007年3月29日 星期四

巨集:變羊術

不變換目標變羊術
/focus [target=focus,noexists] target; [target=focus,dead] target
/cast [target=focus] Polymorph
如果原本的focus不存在或已經死亡,則設定目前的目標為focus。
對你的focus放polymorph。


/cast [harm] 變形術
/stopmacro [noharm]
/p 把%t變羊了,別打他!
對敵意目標施放變形術,如果不是敵意目標就不會說下面那句話

巨集:施放任何治療

如果目標是友善的,對目標放Flash Heal,如果不是就對目標的目標放Flash Heal
/cast [help] Flash Heal; [target=targettarget] Flash Heal

進階版
/cast [help, combat] Flash Heal; [help, nocombat] Greater Heal;
[target=targettarget, help, combat] Flash Heal; [target=player] Greater Heal
1. 如果目標是友善的且你在戰鬥中,對目標放Flash Heal
2. 如果目標是友善的且你不在戰鬥中,對目標放Greater Heal
3. 如果目標的目標是友善的且在戰鬥中,對目標的目標放Flash Heal
4. 如果以上都不成立則對自己放Greater Heal



/cast [help] 真言術:盾; 恢復; [harm] 心靈震爆
如果目標友善就上盾,如果沒辦法上盾(非隊友)就上恢復,如果兩個都不行又是敵意目標\
,就心靈震爆

巨集:一個快速鍵有2個功用

一個快速鍵有2個功用:

/cast [button:1] 造水術
/use [button:2] 魔法晶水

/castsequence [button:1] 製造法力紅寶石, 製造法力黃水晶, 製造法力翡翠
/userandom [button:2] 法力紅寶石, 法力黃水晶, 法力翡翠

/cast [button:1] 祕法智慧
/cast [button:2] 祕法光輝

How to update DSP code and line driver

此文章已被加密

2007年3月21日 星期三

中永和之歌

永和有中和路 中和有永和路
永和有永和路 中和有中和路
中和的中和路有接永和的中和路
永和的永和路沒接中和的永和路
永和的中和路有接永和的永和路
中和的永和路沒接中和的中和路


永和有中正路 中和有中正路
永和的中正路用景平路接中和的中正路
永和有中山路 中和有中山路
永和的中山路就直接接上中和的中山路
永和的中正路接上了永和的中山路
中和的中正路卻不接中和的中山路


中和中和路永和永和路
永和中和路中和永和路
中和中山路永和中正路
永和中正路中和中山路**

**重複兩次

2007年3月2日 星期五

How to Release

偶而會忘記的Linux指令

1.壓縮檔案:
tar -zcvf 檔名.tar.gz 目標目錄/檔案
2.解壓縮bz2檔案
Linux下,tar jxvf *.tar.bz2
3.搜尋keyword
grep -r keyword 指定目錄/* | more
4.在Linux下比對檔案的內容
diff -urN 檔案1 檔案2 |grep "keyword"
5.make時除了在螢幕印出訊息 也印到log檔案
make PROFILE=profile檔 2>&1 |tee log檔




MSDOS懶得開新的一篇 直接擺這

1.設定Routing
route ADD 要連過去的IP MASK 255.255.255.255 Gateway
ex.
route ADD 172.16.2.199 MASK 255.255.255.255 192.168.1.1

2007年1月15日 星期一

TR069的Patch步驟

此文章已被加密

繼續閱讀功能


文章出處:http://tomky.blogspot.com/2006/11/blogger-beta.html


最開始最開始,請一定要備份你的範本!不然出了事就很麻煩了。請點選「下載完整模版」來備份,一旦出問題即可以上傳以回復至原來的範本。

首先,我們要將要隱藏的文章部分的CSS設定為不顯示,並將所需要的JavaScript置入,請將以下的code放到範本的head區裡面:

<b:if cond='data:blog.url == data:blog.homepageUrl'>
<style type='text/css'>
.post #hiden{
display:none;
}
</style>
<script type='text/javascript'>
function has_id_hiden(postid) {
var elm = document.getElementById(postid);
var nodelist=elm.childNodes ;
var i=0;
while(i != nodelist.length){
if (nodelist.item(i).id=='hiden')
return true;
i++;
}
return false ;
}
</script>
</b:if>

在此請先存檔一次,如果順利過關表示你的code是沒問題的。
接著請按下「展開小裝置範本」,一般人會想要放的位置應該是文章內文的最後面吧?如果是,請在裡面尋找類似的code

<p><data:post.body/></p>


在找到以後,請將他改成以下的code:(其中中文的部分是可以自由修改的喔^^


<p>
<div expr:id='"doc_"+data:post.id'>
<data:post.body/>
</div>
<b:if cond='data:blog.homepageUrl == data:blog.url'>
<script type='text/Javascript'>
if(has_id_hiden('doc_<data:post.id/>')==true) {
document.write("<a expr:href='data:post.url' title='
繼續閱讀'>繼續閱讀</a>");
}
</script>
</b:if>
</p>

基本上,這樣就完成囉!請儲存以後去看看你的Blog有沒有正常運作囉!

如果是新手但仍賞光採用我的code的人,在放入這些code以後,在撰寫文章時只要將想隱藏的部分用hiden標記給夾起來,在首頁就不會出現囉:

要顯示的部分
<div id='hiden'>
要隱藏的部分
</div>

雖然可能已經過時了,但仍希望所有的舊Blogger使用者都能藉此快速的轉換到Beta版來,享受一下即時發布的爽度!如果以後有空,我會寫一篇關於新舊版範本的比較和注意事項,如果有空,如果有空

ps. 以上的code是假設你只有在"首頁"需要這個功能,如果你希望在Label下也有這樣的功能的話,請將所有的<b:if cond='data:blog.url == data:blog.homepageUrl'>改成<b:if cond='data:blog.pageType == "index"'>即可。

2007年1月13日 星期六

在Linux下顯示中文

登入後修改 .bash_profile
加入:
LANG=zh_TW.big5
LC_TIME=C

系統訊息即可顯示中文

2007年1月5日 星期五

重起inetd

http://ohaha.ks.edu.tw/


kill -1 `cat /var/run/inetd.pid`


透過'cat /var/run/inetd.pid'來取得該服務的Process ID。
並藉由送出 -1 (數字)參數將程序重新啟動。


詳細說明:
很多書籍都沒有說明為什麼要用這個指令。泡泡為初學者說明一下
1.首先,每一個目前正在服務的程序,都會有一個數字編號,稱之為Process ID
這些服務中的程序會產生一個檔案,預設存放在 /var/run 這個資料夾中
並將其所目前擁有的Process ID 寫入這個檔案。

2.透過cat這個察看檔案內容的指令,可以察看 /var/run/inetd.pid 的內容。
也就是 cat /var/run/inetd.pid 。

3.透過kill 這個送出訊息給服務中的程序。
語法: kill 參數 PID
常用的參數有兩個。