星期一, 7月 31, 2006

Windows2003 遠端桌面連線

Windows2003有兩種遠端控制方式
1.遠端桌面連線
2.Terminal Server

遠端桌面連線就類似VNC一樣,將Server的display和keyboard, mouse 重導到遠端的pc,讓你可以控制Server

Terminal Server則是提供一個Windows 2003的service給每一個Client,讓每一個client好像可以有自己的Windows 2003一樣。


可以看出 遠端桌面連線,同一時間僅能有一個user連入。
Terminal Server則不限。

所以MS在Terminal Server上有加入License,依照提供的連線數收費。
所以啟動Terminal Service比較麻煩,還要啟動Terminal License Server。

遠端桌面連線就比較容易設定了,
2003server已經將Client端的安裝程式準備好,在 C:\Windows\system32\Clients\TsClient。

help上說明直接把這個folder開放,讓client pc能讀取,安裝。

星期六, 7月 29, 2006

Flac - encoding

因為拿到的格式是ape,沒有方便的播放器(其實是因為他的codec不是opensource.)。
所以要換成其他格式..
先用ape 的程式解成wav檔(size很大)。
再到flac去download win32版的,包含tool 跟front end。但是front end好像是用VB寫的..所以要VB runtime跟MSCOMCTL.OCX。
但是installer沒有含這兩個,所以要自己download (如果system李沒有的話)
http://download.microsoft.com/download/5/a/d/5ad868a0-8ecd-4bb0-a882-fe53eb7ef348/VB6.0-KB290887-X86.exe
http://members.home.nl/w.speek/download/MSCOMCTL.ZIP
這樣就可以run flac front end了。

雖然flac installer 在install 的過程中會要求這,要求那的...例如..會要你去download winamp。
但是結果winamp還是不能play flac..

最後還是用flac.

從wav到flac...size大概是1/2...奇怪,沒有很小..不是應該是要1/4嗎?

星期五, 7月 28, 2006

糟糕...亂搞的結果...

以為blogspace是一個backup網站,結果不是,現在慘了...

try .. blogspace 中文?

post via ftp...

OK嗎?

reseal - Part II

上次說完XPe 為甚麼需要reseal這個動作,還有需要的component。
現在來看看FBReseal.後的動作。

FBreseal 可以在任何時候執行。

執行fbreseal 後會馬上return,好像沒發生任何事。
但是要等一下(約30 sec),出現"fbreseal complete" 對話盒,要求reboot。

做完 reseal 後本來就只能 resboot。

reboot,但是要注意,一旦關機,要在他開機前馬上把電源關掉。

這時候就可以把那個reseal的hd image ghost起來了。

如果讓他boot,他會出現"Prepare Windows start"的畫面,一下子,然後進入Desktop的藍色畫面,之後好像當機一樣(但是游標還可以動),約2 min後 開機完成。

可以用 ipconfig/all 看看SID (就是HostName)變成OEM-XXXXXXX了。
而且每一台的SID的XXXXX都會不一樣。

ToDo List..

  • CG - Stream Server - playing video on ...
  • installing Windows 2003 on upstair's 4-way server
  • setup a CE building environment on Server
  • setup a XPe building environment on Server

使用NTLDR boot DOS

目標是要做到這樣啦,不知道能不能…
先看這一篇 http://www.bcpl.net/~dbryan/ntfs-dual-boot.html
說得很清楚,大意就是:
同一顆hd create兩個primary partition (用spfdisk或其他linux上常用的partition tools)。
第一個primary partition format成ntfs,安裝XP。
第二個pimary partition format成fat16,安裝dis。
這樣,只要改變active partition,就可以決定用xp還是dos開機。
然後用debug取出dos那個partition的boot sector,存成一個檔案,
把檔案copy到xp那一個partition去,ntldr要用這個檔案來 boot dos那一個partition。
修改xp parition中的boot.ini,加入一行dos的選項。

ghost 2003 seems using xpe..

以前try過,要256M RAM才能run的ghost 2003,今天又拿來try一次(屈服了engineer的"download式開發法"),發現,boot cd 好像是進入 xpe呢。

星期三, 7月 26, 2006

complain - about tool's version and ghost...

純compain!!

用ghost作為deploying的工具,但是ghost是run在dos下的。所以要準備兩個system : xp for accessing pendrive and network.
and
dos : for recover ghost image.

而且ghost那個還要準備好hd space,讓ghost hd時有存放空間。所以ghost那個還要讓Xp那個能access到,這樣才能將image送出?

天哪,作embedded system的know-how竟然是在這些一關卡一關的environment上,而且還是因為這些跛腳的environment和腦殘tools間互相對不起來....

這麼麻煩也就算了,竟然...一大堆都是用 8.0 壓的image到後來竟然用 9.0 來壓。
8.0又不能解9.0的image...然後..deploy的data都是內涵8.0的ghost。

是怎樣?

而且都不是有license的(有license的是ghost 2003跟ghost 10.0)。

真是煩透了,這跟技術有任何關係? 還是在考驗 誰比較熟大陸的download site?
超級無聊。

作MS的東西就是麻煩,困難點也就是tool而已,因為一堆不清楚的架構和framework,所以要找到對應的tools,實際developement tools中又甚麼都沒有。要另外找。

對應實際configure image的動作(一堆mouse click)的困難度,好像know-how都在"去那裡找這些3rd party tools 和讓他們能run" 上頭。

用ghost有甚麼好處? backup disk image有一些opensource的tool可以用,可以在linux下使用。linux下也ready一堆pendrive, network connection的function。甚至fat 的tool也有。

更不用說好好的ghost 8.0幹嘛改9.0 ? 有任何好處? ( show-off "我找到free的9.0 ?" )

真不是software engineer的態度..
.

Cloning XPE Image - Reseal

Windows 系統都很奇怪的需要一個unique name和 security ID (SID)。
這個SID在XPE中是由FBA在系統第一次boot時產生的。

而FBA只有在第一次boot時會執行,

也就是說,把boot完後的disk image cloning下來。會造成所有clone的系統有相同的SID。

但是拿FBA執行前的image來clone,就代表所有clone的機器第一次開機時,都需要跑一段很長的FBA。

以上兩種方法,都很不合算。

為此,XPE提供了一個component : System Cloning Tool (在Software -- System -- System Service -- Base )

最重要的就是"reseal"這個function.

reseal 就是通知運行中的XPE把系統準備好,修改成可以cloning的狀態。

然後,developer可以控制下reseal 命令的時間:

XPE把FBA的動作分成1200個階段。 讓你讓你決定在哪一個stage下reseal command。
但是這也是說好玩的,你只能設0或是1200,否則在FBA時會crush
設成 0 的時候代表在FBA作任何動作之前就下reseal命令。這也代表沒下。
所以這個設定變成沒用。
這就是奇怪的地方,實際用途與表面意義相差180度
實際上設為stage 0是要配合FBRESEAL.EXE這個command。
FBRESEAL這個command可以讓development在系統boot up,的任何時間(當然,是在FBA後)下reseal的命令。
所以developer可以對boot up的系統作一些額外的application安裝,設定。然後再執行reseal command。把image freeze and prepare for cloning。讓cloning的system也包含這些設定。
所以設為0原意為無用,實際卻有大用....Orz
下完fbreseal後就要關機了,然後用Ghost 將image ghost起來。
FBRESEAL的command format如下:
FBRESEAL [-autologon | -keepall | -keepdomain | -keepmounted | -keepnet | -keepuser]

autologon - 維持autologon的狀態

TUX magazine is going be be Not-free

今天收到一封通知的EMail...
This week you'll notice a change in TUX. It will move from being a
free digital magazine to a paid one. Your current complimentary
subscription will be extended for 12 issues (expiring after the
July 2007 issue). That being said, this is just a note to let you
know what's happening -- there's nothing at all you need to do
today. Your free subscription will continue to be delivered to you
as you had originally requested.

When your subscription does expire, we will send you a notice
offerring you an opportunity to renew at our paid rate of just
$9.95/12 issues. In addition, since you've been a long-time (and
apprecited!) loyal subscriber, we'll make certain to offer you a
very special gift if you do decide to renew at that time. Again
though, there's nothing for you to do today. Your free subscription
to TUX will continue through July 2007.

We started TUX in 2004 because we felt strongly it was a needed
publication within the Linux community (many of our Linux Journal
readers would write in asking for exactly this, and truthfully, many
of our own staff members wanted to learn more about their Linux
desktops also). We invested revenues from our other publication,
Linux Journal, to make it possible. We've seen it as a labor of
love. Today, however, 15 issues later, we need to turn TUX into a
self-supporting publication and that's why we are asking for our
readers' help.

We promise to put more heart and effort into TUX with this
conversion. In the coming months, you can expect several new topics
and article series introduced by TUX Editor Kevin Shockey.

Please let us know how we can make TUX better for you. We strongly
encourage your feedback and suggestions; please send to..
大意是說..感謝你對TUX支持,過去TUX是由LJ的熱心支援,所以能免費訂閱。
現在,TUX要收錢了,但是由於你過去對TUX的支持,將免費再送你一年,到2007 July。

之後,會通知您將要過期了,並且提供你一年12其9.95美金的優惠。


TUX其實做得蠻不錯的,跟LJ有很好的市場區隔。一個近技術,一個近使用。
但是最近LJ上的技術文章漸漸變少了,漸漸向TUX靠近,不曉得是因為換了主編,還是Linux真的越來越容易了?
我以前以為TUX就是LJ從投稿文章中,選出比較近使用者的部份,集合成的一份雜誌。所以不用收錢。

但現在看來...大概Linux和OpenSource越來越靠近一般大眾,這一類型的讀者也越來越多,所以TUX收錢也有利基存在。


還是不錯啦,看到OpenSource的相關產業可以賺錢。我們才會有雜誌可以定,不然,向以前的天充一樣...多可惜。

星期二, 7月 25, 2006

google maps, Wikipedia - about this WWIII

Google Maps和維基百科真是不錯。

幾分鐘 就能瞭解最近的以巴衝突。(雖然好像已經打了幾十年..)。

  • 原來 沒有 "巴勒斯坦" 這個國家呀,"巴勒斯坦" 和 "以色列+黎巴嫩" 的地區是重疊的。(Google Maps查到的地區就是...但是沒寫出Palestine)
  • 原來 這次實際上,就是以色列和黎巴嫩在打。
  • 原來 以色列的四周都是阿拉伯人,也就是他們所謂的"異教徒"的國家。
  • 原來 現在還有爭議的地區就是 以色列和黎巴嫩邊界的Shebaa Farms地區(Wikipedia也有地圖)。
  • 原來 巴勒斯坦原來和以色列各佔50%的土地,後來巴勒斯坦發動戰爭想驅逐以色列,結果大敗,以色列把所有土地都拿下,造成巴勒斯坦不見。雙方戰爭不斷。
    -- 這部份也有人說是以色列實行擴張政策,所以四次挑起戰端。
  • 原來 看起來好像就是以色列四周的阿拉伯國家都在資助黎巴嫩和巴勒斯坦,希望把猶太人趕出去,美國人則資助以色列,希望藉此從阿拉伯地區的石油獲得好處。
  • 原來 巴勒斯坦人現在好像就是在"加薩走廊"的地方成立自治區。
大概就是這樣... 至於誰對誰錯...這個就說不清了...歷史淵源已久..

EWF : Enhance Write Filter - what XPE differ from XP

Enhance Write Filter (EWF) 是XP Embedded獨有的機制(和XP相比)。
他的功能是在所有的file io (類似Linux的VFS)中,加上一個Filter,分離read, write的動作。
並且可以控制這個read write動作。

例如 : 控制所有write到hd的動作到ram 中,這樣HD的內容就永遠不會被改變。
同時,在作read時,要將RAM一併考慮,將HD + RAM = final 的動作做出來。

這樣就可以做到 : 將所有執行時期的hd 更動,都留存在ram中。而讓其上的application沒有感覺。
當system reboot後,所有RAM的資料都會消失,所以系統還是維持在hd最初的install狀態。
這個在Linux上,可能用cramfs,解開到RAM。或是區分出需要保護和不需要保護的folder,安排到hd或ramfs中。可以作更細的調整。
當然,也可以做到像EWF一樣,完全保護的功能:一些LiveCD就是這樣。
EWF除了保護hd,將所有modification排除。還可以暫時將這個功能關閉,將RAM sync到HD(MS叫commit)。

要使用EWF,要將"Enhance Write Filter"加入target中。
要管理EWF,要將"EWF Manager Console application"加入target中。
要使用有利用到EWF的application,要把"Enhance Write Filter API"加到target中。

Enhance Write Filter有幾個參數要設定,和你要使用的EWF 模式有關。

最基本的就是設成RAM Overlay。

Overlay Type : RAM

就是像上面提到的一樣,將 modification 存到RAM中,不要對HD作修改。
其他可以設定 Overlay Type : DISK,是另外create一個partition,將修改存到disk中。

EWF Partition Size in KByte 就是在將Overlay Type設定為DISK,要使用多大的partition來存放修改的部份。
所以OverlayType:RAM時,這一項就可以設成0。

Start EWF Enabled : 第一次啟動就要將EWF啟動起來?

啟動後,可以用ewfmngr來控制/檢查ewf。
ewfmngr.exe在 c:\windows\system32
ewfmngr  partition  -command

partition - 就是ewf保護的partition,例如C:, D:
command - 就是要對partition的動作,如disable, enable, commit,

啟動後,開啟CMD,到c:\windows\system32..
ewfmngr c:
會顯示出目前C:上ewf的狀態,ENABLE或是DISABLE,
還有Boot Cmd ,代表下次開機時,給ewf的comand。
ewfmngr  c:  -enable
可以將Boot Cmd設定為ENABLE。這樣下次開機時,EWF就會開啟。
同理,用 "-disable"的話,下次開機ewf就會關閉。

ewf的開/關只有在開機時能夠設定。系統運行中 無法改變。下完command後要reboot才會生效。

所以來看看 -commit 命令..

commit命令有點類似 sync,就是將RAM的部份synch到hd中。
假設系統ewf是enable...
1.modify 1
2.-commit
3.modify 2
然後reboot, modify 1 和 2 都會sync回hd。跟你下commit的時間無關(因為commit只能在boot時動作)。

更詳細一點說明,commit動作會在poweroff時將ram sync回hd。
也就是說,commit後,把電源拔掉(不循正常關機步驟),所有modify也不會sync回hd。

還有.. -nocmd ,是將ewf的boot command清除,所以不管commit前後有多少modification,下了 - nocmd後,因為boot command是 No Cmd,所以所有資料在reboot後也不會sync回hd。

.... 上面這一點是很迷惑的地方.


還有,即使使用RAM overlay,照理overlay 不會使用到HD。但是ewf還是會需一塊約32k的partition (Neil甚至說最好保留2M),據TS說明,這是一些RAM Block的pointer 的set。指向那些RAM overlay。

所以在create partition時,要預留一些unpartitioned space讓ewf使用。
同時因為一個HD有4個primary partition的限制,所以也不能把partition都create光。要留一個給ewf用。

查ewf會在protect的partition後面create一個system id 45的小partition。

所以XPe boot後的HD,用XP disk manager看會看不到system id 45那一個partition,導致刪除不掉,用partition Magic和Norton disk partitioner也一樣。

------ spfdisk 可以看到。

Some Helping Utility for building XP Embedded

使用XP Embedded 和Linux最大的差異是: 內容隱晦不明,工具東缺西缺。

像要將3rd party driver安裝進入target image,竟然要分析安裝的步驟。

因為 3rd party 可能為了方便使用者,或是怕被發現他的application是用VB寫的,通常會用一些花錢買的install wrapper包起來,變成一個Setup.exe。
讓你只能行那個Setup.exe,同時祈禱希望他不會惡搞你的registry, ini。(像在install file中發現ctor.dll這個被列為spyware的dll是怎樣...)

XP E的 component editor,是將driver, application包裝成component的工具,利用這個工具,才能管理你的target image,否則,開發XPE的動作就會變成"安裝XP"一樣的無聊沒知識。

但是 component editor在包裝driver時,又只懂得 inf檔。又沒又說明 component designer是怎麼動的(一切都是menu. button..按來按去)。

怎麼辦? 找 driver 廠商提供另一個格式的安裝檔?
這應該是最好的方法了,本來,作為一個供應商,應該會為他的客戶提供這樣的服務。

但是

在有些時候就行不通,例如..公司一直延遲付款(甚至不付)。或是...

怎麼辦?

這時就需要一個tool,幫忙 "監視" driver的安裝動作,然後看看能不能自己寫個inf。讓component editor轉成component.

這就是一個 -- "費心隱藏起來 再費心打開來" 的例子。

浪費的都是engineer的生命,這些沒營養的東西 - engineer 費心的把installation process包裝隱藏,tool programmer費心的寫一個installation monitor工具。 embedded engineer費心的去找到這些東西...

像Linux就不會,即使沒有提供source, Makefile 讓user install from source,所提供的安裝動作都是script file,哪些file會裝到哪裡,清清楚楚,即使有以.o release的module,也會清楚的列出。drive就是driver,不用費心再搞一些無關的躲貓貓...



扯了這麼多。其實要說的是,因為這樣,msdn有一頁,專門說一些building XP embedded需要的一些tools,在 http://www.microsoft.com/china/MSDN/library/Mobility/embedded/WXdnxpesplxpe3rdparty.mspx?mfr=true

有志浪費生命的工程師,可以去看看.... (我就有去看 Q_Q )

星期一, 7月 24, 2006

XPE : Minlogon - login automatically with system user

上次說到XP的boot process中,最後交給 Winlogin

Winlogon 就是使用者login程式,同時管理有關"權限"的問題。
在XPE的target designer中,需要選login program:
Minlogon
Winlogon
Winlogon就是標準的login prompt,Minlogin是小型,縮減版的login promt。
因為小,所以有些限制,可以參考MSDN有關Minlogon的說明: http://www.microsoft.com/china/MSDN/library/Mobility/embedded/USdnxpesp1XPEMinLogon.mspx?mfr=true

  1. Minlogon永遠不會出現login prompt,MinLogon永遠以System User的權限自動login。
  2. Minlogon不具有user account管理功能,所以不支援filesystem的權限管理欄位,同時也不具有login domain的能力。
  3. Minlogon的開機時間少10-15sec,footprint也比較小。
  4. 當選定Explorer Shell作為Minlogon的default system shell時,因為Explorer會include Winlogon的所有元件,所以這個情況下,footprint並不會比較小。
    ..實際上,選用Minlogon,再選Explorer Shell作system shell時,dependency check會自動將Winlogon加進去,造成兩個login program需要disable一個的情況,所以...一定要用Minlogon時,不可以用explorer Shell作System Shell....有點蠢...

看起來好像很糟,其實並不會,因為沒有了user , administrator account,所以network的hacker要攻擊也無處攻擊。

XPE中提供了一個Minilogon MACRO,選用這個MACRO (預先定義好的一組compoment),可以做出約15M的小image。

Minlogon最好配合"Custom Shell Component",自訂開機時 UI。這一部份在MSDN的另一頁有說明: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xpehelp/html/xetskcreatingcustomshellcomponent.asp

Research,, and waiting to be bought..

DigitalTime
http://tech.digitimes.com.tw/ShowNews.aspx?zCatId=417&zNotesDocId=BA5700E75CC621F9482571AA00561F32
.....剛回來時在一家超級大廠做新產品的開發,不過後來因為大廠對於新產品的決策舉棋不定而離開。再一次,Scott感受到的又是心態的問題。

 這些大老闆的確試著想從製造轉往創新研發發展,不過因為長期以來沒有什麼累積,基礎實在太薄弱。而且研發和製造是不同的故事,製造可以在短時間內做出規模,帶來收益;但是研發不是一蹴可幾,時程和成果也不是全然能夠掌控的。當老闆對著研發專才問起回收的問題,而且這種事一而再再而三地重演時,戲就唱不下去了。

 這就是心態的問題,台灣的產業界被大環境驅使,不得不轉型時,心態上究竟是不是ready面對研發的種種面向,包括它是個砸下銀彈不知道成果何時出現的事業,或者投資下去的報酬率難以預估,或者科技研發人才究竟要多少,才足以做出自己想要的樣子來,面對這些問題,大老闆們 ready了嗎?

 即使有遠見、有心的老闆們下定決心了,面對台灣欣欣向榮的股票市場,面對投資大眾的不斷質疑,面對股價亳不留情的波動,面對媒體常常自以為是的大肆批評,老闆們,承受得住嗎?
果真被千哥猜到。

各公司漸漸都不需要RD了,自己投資太麻煩,風險也太大,到不如在需要時再買個不錯的公司,來得保險又快速。

C++ GUI Programming with Qt 4


Qt 3那本已經出了好一陣子,但是Qt SDK opensource 版是Qt 4的,
現在Qt 4終於出了。

Trolltech 7/17 公佈的。
這本是基於Qt4.1 的內容來說明。
內含新的Appendix:
  • Item View Classes
  • Creating Plugins
  • Embedded Programming
  • Introduction to C++ for Java and C# Programmers

天瓏已經有在賣了..

http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=0131872494&sid=31577


最近Tolltech 還release一個mobilephone的Qt platform。含一個x86的emulator,可以download image 下來。配這一本書,應該不錯。

颱風 - 凱米

資料都是中央氣象局的..
中度,結構緊密型,速度很慢17km/hr.


可以看出,通過北部的機率很小...
....我可沒說 想放假甚麼的....

星期日, 7月 23, 2006

wavpack : hybrid

wavpack,和flac一樣,一個opensource, 無損的音樂縮格式。
那位甚麼又要開發一個一樣功能的opensource 軟體?
差別是:他是用hybrid的方法,

所謂hybrid就是,他將壓縮後的資料分為兩部份: lossy + correction。

lossy,就像他的名字一樣,是一個壓縮比大,有損的結果。
correction ,就是補正lossy file的對應資料。

所以lossy + correction 就可以 ....這句話不知道怎麼寫..

星期六, 7月 22, 2006

這個布丁也好吃的

默默..

1970年時,德國的作者就預知了將來社會的模樣,所以寫下這樣一本書。
不過這小小的一本書 也沒有辦法挽回 世界的潮流..

30年後,灰衣人果然佔領了世界...
所以我們這些可憐的工程師,就要每天待在公司,雖然跟家人住在一起,一天中也見不到幾次面,主管一天到晚說 "我們已經比人晚起步了,怎麼可以比人還不努力呢?"

市面上一些 XX週刊,X下雜誌,每次報導一些 XX的成功人士,都會提到他們都有一段 每天睡在公司的日子,將生命都貢獻給公司...

其實,這些人成功,最大的功勞應該歸功於他們的家人,願意犧牲自己的生活,那些成功人士一點都不值得尊敬。他們只是 灰衣人的忠實顧客罷了..

灰衣人的顧客越多,社會也就越來越糟糕..
.

蠻好喝的健酪 藍莓

星期五, 7月 21, 2006

XP Boot Process

這一篇寫的剛剛好 (不太多也不太少)

BIOS -- read MBR of harddisk,將控制權交給MBR的code。
disk MBR -- read MBR of active partition,將控制權交給他。
partition MBR -- 去自己partition的root 中找 ntldr 這個程式。把控制權交給他。
ntldr 進入protect mode,找到boot.int,依照內容決定要到哪裡去load kernel。

當boot XP時,ntldr會找到Ntdetect.com去偵測系統硬體,然後依照boot.int的內容找到partition,到 Windows/System32去load kernel: Ntoskrnl.exe 和必要的dll : Hal.dll。
控制權交給Ntosknl.exe

Ntosknl.exe啟動後,啟動Winogon.exe,
Winlogon.exe啟動Lsass.exe (Local Security Administration)。
顯示Windows歡迎畫面。
顯示login dialog

Need Some Space for EWF

NL 說FDISK DOM時,要預留2M的空間給EWF。

使用磁碟管理 create partition,NTFS 檔案系統,啟動壓縮。設定使用中。
將build好的image copy到 DOM的partition。
因為啟動壓縮,所以ntdlr 要將壓縮取消。
其他的folder, file都照co。

這樣就完成了XPe的 boot dom。
可以拿來開機了。


但是這樣的DOM,第一次開機時,會自動執行"First Boot Agent",大概會花30 min。才會完成所有 target DOM 建制步驟。

開機... XP 畫面 .. 淡藍色 w mouse 約20sec .. First Boot Agent progress bar...

TAP.EXE : different result in differnet environment

TAP是XPe提供,用來偵測target system hardware device的tool。
但是,同樣的target board,run不同的OS,有沒有裝週邊,都會造成不一樣的結果。
也就是說,上面run Win2000, XP prebuild environment,XP,..etc。
執行TAP.EXE,得到的device.pmq會不一樣。

同時,
系統有沒有install driver也會不一樣。
有沒有插上週邊也會不一樣。

所以要得到tagret system比較標準的device.pmq,最好在上面install XP,並且把實際會用到的週邊(touch panel, wifi, camera...)都裝好,然後 run TAP.EXE。

...還真是莫名奇妙的開發步驟呀....

why Reiser4 is not in the kernel

還特地建了一個網頁來說明

結果是因為 kernel developer 們認為code 還不夠stable呀.

大概是說. 因為2.6是一個stable kernel develop phase,所以放進去的code必須要有一定程度的stable。讓user能安心使用。

而Resier4 因為是一個build from the ground (從頭開始寫)的file system,所以 雖然已經寫了很久,已經算是堪用,但是還是不夠stable,必須要更compiant with vfs 。所以沒有merge into 2.6。

據說以前的經驗,很多 buggy code在merge into kernel source後,code mantainer debug的動力就降低了,所以kernel developer 希望藉著延後merge的動作,促使 Reiser4 的programmer更快速的debug,讓他進入stable階段。

另外 還說,這是一個open source的世界呀,即使main kernel developer沒有把他納入,但是,如果有人覺得他夠好,已經可以用了,大可自己加上patch,推出自己的distribution,而他如果真的夠好的話,就會有更多的distribution加入。 最後 kernel developer也必定會加入他。 open source 社群是一個自由民主的社會。

星期三, 7月 19, 2006

DirectX 2006/6 download path

因為MS的WGA,所以一些東西都不能download了,下面是 directx 9.0c 2006/6版本的下載位置

http://www.softwarepatch.com/windows/directx.html


其實也不確定是不是真的是2006/6的,ms網站上最新的version寫的是 DX. 2006/7



很麻煩。
但是VIA很奇怪,做了有加速功能的chip,卻又不公開使用的介面。..

keroro mp3 player



不知道是哪裡出的Keroro Mp3 player....

愚蠢! 原來是Power的問題

覺得奇怪,好像ps2的power輸出不夠,開機接上mouse,就開不了機。
有時候接上keyboard也開不了機。

更扯的是,開完機後,一按mouse,竟然就reset,不然就是blackscreen,系統沒反應。
把kvm 加上adaptor後,有好一點。

之後和Leo借了Power (server的),OK。一切都沒問題,接上CDROM也OK。
比較一下兩個power:

+12V : 4A 16A
-12V : 0.3A 0.8A
-5V : 0.2A ?
+5VS : 1.5A 2A
+5V : 14A 21A
+3.3V : 7A 18A
.難是兩個都是200W的呢。

Site Memo : chroot.org : Taiwan Hacker's org

原來台灣也有hacker org。http://www.chroot.org/
網站裡有很多漂亮的文章喔(pdf檔),台灣的hacker果然是比較頻平易近人的。:)

圖因為..
Down for Maintenance
Blogger is temporarily unavailable due to planned maintenance.
This maintenance will last one hour from 5 pm to 6 pm (PDT)
所以下次再貼囉。

為甚麼hacker網站都要是黑底綠標,紅Title ?
沒有粉色 系的hacker網站?
(真的有的話,看起來應該會更噁心吧...:P)

星期二, 7月 18, 2006

fotocom cd 350 - usb hd box - sucks


到pchome定了這個 嵩剛 usb 2.0 hd box,特價 999 (但也不是最便宜的hd box)。

今天收到,晚上接上 hd後,還ok,只有說 "不知名的partition",所以我把所有partition都刪除,重新create一個,然後format......超慢....到46%的時候,hd 停了,又動,好像power接觸不良一樣,然後,就沒動靜了。

hd好像沒過電一樣。

我按了按面板的button,沒反應。
換一科hd,也一樣。

只好到pchome去留言了..

真差,連這樣low tech的東西也作成這樣,早知道就買一些4, 500 便宜的就好。

寫下來,希望以後 要買的人,能搜尋到這一篇 作為參考。 Q_Q..

還有保佑我一樣在pchome買的kvm 能撐久一點呀....拜託拜託...

C3VCM6 - VIA C3/C7 mini-ATX

C3VCM6,用的chipset是CLE266,
VIA的site : http://www.via.com.tw/en/products/chipsets/c-series/cle266/


C3VCM6沒有完全follow 這一個system diagram,沒有用內建的MAC。
SuperIO跟AudioCodec也不一樣。



北橋:8623/CE
Socket 370
內含Apollo Pro266T
Graphic--功能好像蠻強的..
南橋:8235/CD
有100M ethernet - 但是板子沒用
USB2.0 root x 3 (port x6)
HSP Modem
DirectSound compatible audio controller
RTC w RAM
5 PCI master - 板子只有一個slot
Audio:ALC655
NIC: RTL8100C
MultiIO: ITE8705F/GX
driver download: http://www.viaarena.com/default.aspx?PageID=2

CLE266 VGA driver for XPE SP2 : http://www.viaarena.com/default.aspx?PageID=420&OSID=24&CatID=2500&SubCatID=101
8235 Audio Codec for XPE SP2:
http://www.viaarena.com/default.aspx?PageID=420&OSID=24&CatID=2540&SubCatID=104


使特林引擎,3500 NT -- 真想買

Stirling Engine是一個很古老的外燃機是引擎,從他的卡諾圖來看,他的效率是最好的(也就是"不可逆"性最小)。 可惜他的尺寸和power一直都作不起來--- 要產生足夠使用的動力的, size會變得很大。
所以,一直以來都是內燃機的天下。

但是Stirling Engine還是一個很cool的東西,聲音小,緩慢的動作,任何熱源都可以作為燃料(因為是外燃機碼嘛)。

大學上了熱力後,就很喜歡這個引擎,當初還寫了一篇報告。真想自己作一個試試...

果然,出現了這個...






這個東西 是日本"大人科學"系列...台灣有代理...真想買呀...@_@

turn on ATX Power without using Mainboard.

from Panks blog

ATX Power 的 Connector, 將兩個●接腳用迴紋針接觸一下即可

面對接頭,卡榫朝上示意圖
□□□●●□□□□□
□□□□□□□□□□
.

星期一, 7月 17, 2006

不要在註冊時留下任何個人資料..

咕嚕美食網已經因為管理者經營不善倒閉了,
本身網站的架構只是簡單的模組,這幾年完全沒有去注意資料安全管理;
只是以營利為目的,後來老闆還因為破產和積欠地下錢莊債務而跑路.........@@
所以盡量不要因為一些網路活動而留下自己的個人資料。
.......
所以說呀.... 那些要輸入身份證字號的網站,你又怎會知道他沒有這一天?

Skype Protocol has been cracked

這一篇(http://www.voipwiki.com/blog/?p=16)寫的。
中國的一個公司做的,已經實際可以運作,作者已經可以跟他們implement的code通話。
據說,他們將不會支援Skype's Super Node technology,也就是說,不會當其他user的relay。

因為Skype在中國是不合法的(?還是說不受歡迎?),所一這個reverse engineering的動作在中國並不違法,反而還可能大受鼓勵。

同時,瞭解了protocol後,中國地區更可有效的block skype。


厲害的應該是Skype的作者吧,他每次都可以在技術失效錢 先將他賣出,skype在去年已經賣給eBay了,他的前一個p2p 軟體也在被告前賣出。

Code大概部會像DVD john那樣release出來吧,不然,就會有一大堆真的skype mobile phone(or TV)了。

星期日, 7月 16, 2006

keroro - 全員敬禮..



妹妹 特地送的,非賣版布偶... 全員敬禮!!

billing machine run Windows

前幾天到新店去,要繳停車費時,竟然出現...



因為有游標出現,我就移動一下,順便 點亮兩下....竟然打開了..@_@
(奇怪,收費機的操作沒有螢幕按鍵呀,幹麼要裝touch screen,而且聯driver都裝上了?)。




所以真的項TS說的: 沒用的東西就不要裝,裝得月多,漏洞越多..

還好他沒裝IE,不然以後就有人到停車廠去"免費上網"。

啊!!! 我應該拍一張正常動作的螢幕才對....

find source site with netselect-apt

在google搜尋一下就有說明了。
netselect-apt testing
後面testing就是你要的?
可以是stable, testing.

我執行, stable的結果是:
# the main Debian packages.
deb http://ftp.tiscali.be/pub/debian/ stable main contrib
# Uncomment the deb-src line if you want 'apt-get source'
# to work with most packages.
# deb-src http://ftp.tiscali.be/pub/debian/ stable main contrib

# the non-US Debian packages.
deb http://debian.nctu.edu.tw/debian-non-US/ stable/non-US main contrib
# Uncomment the deb-src line if you want 'apt-get source'
# to work with most non-US packages
# deb-src http://debian.nctu.edu.tw/debian-non-US/ stable/non-US main contrib

testing的結果是..
# the main Debian packages.
deb http://mirror.aarnet.edu.au/debian/ testing main contrib
# Uncomment the deb-src line if you want 'apt-get source'
# to work with most packages.
# deb-src http://mirror.aarnet.edu.au/debian/ testing main contrib

# the non-US Debian packages.
deb http://linux.cdpa.nsysu.edu.tw/debian-non-US/ testing/non-US main contrib
# Uncomment the deb-src line if you want 'apt-get source'
# to work with most non-US packages
# deb-src http://linux.cdpa.nsysu.edu.tw/debian-non-US/ testing/non-US main contrib

unstable的結果是..
# the main Debian packages.
deb http://mirror.pacific.net.au/debian/ unstable main contrib
# Uncomment the deb-src line if you want 'apt-get source'
# to work with most packages.
# deb-src http://mirror.pacific.net.au/debian/ unstable main contrib

# the non-US Debian packages.
deb http://ftp.tku.edu.tw/OS/Linux/distributions/debian/non-US/ unstable/non-US main contrib
# Uncomment the deb-src line if you want 'apt-get source'
# to work with most non-US packages
# deb-src http://ftp.tku.edu.tw/OS/Linux/distributions/debian/non-US/ unstable/non-US main contrib


奇怪,很少台灣的feed site...

moto網站建議把這幾個source list file save在 /etc/apt中,真正的source.list用link 指定到其中之一,比較方便。

netselect-apt會根據apt 設定,所以如果apt有設定proxy,netselect-apt也會經過proxy

retrieve another character encoding archieve

用Windows就是麻煩,有些zip檔是其他語系的,所以解不開。
只好借用Linux。

先傳到linux上,用unzip解開。
如果可以 cd 進去的,就ok,也可以rename folder name (用putty copy-paste 輸入foldername)。
如果不能cd 進去的,就要copy到apache www data folde,用browser 來看。
然後用 wget 192.168.x.x/[unzipped foldername] -r -nd 來抓
-r 是recursive的意思
-nd 是說不要聯foldername也建立,否則又進不去了

星期六, 7月 15, 2006

delete unqualified named folder in Windows

很重要的,趕快記下來。

有些用zip 解開的檔案會有一些奇怪的字,導致沒法delete....

再這 http://www.shsh.ylc.edu.tw/~taichis/wp/20060705/446 有寫方法..

在cmd 下用 dir/x 顯示8.3 檔名,然後 del 那個8.3格式的檔名,就可以刪掉

Full Read-Write Linux NTFS Driver : OpenSource

7/14 linux-ntfs-dev anounce ntfs-3g的ntfsmout 跟libntfs 已經測試完成。


很有趣的的是anouncer說,因為他要去北極探險了,所以,雖然可能還有些問題,他還是先release好了 ,以防萬一。

http://sourceforge.net/mailarchive/forum.php?thread_id=23836054&forum_id=2697

有full installtion instruction.

星期五, 7月 14, 2006

some problem about QCOM



使用便宜的 主機板,配上QCOM的usb wifi。
結果一些機器常常發生QCOM的Wifi MAC Address 讀取 0xFFFFFF的狀況...(9/600)



查QCOM wifi dongle上有一顆AT46,大概是MAC Address的EEPROM吧..

Th 1 先生說,EEPROM的I/O pin腳要接pull high,否則power up時,mcu的pin腳或許會有不規則波形,影響到EEPROM,導致EEPROM被reset或修改(10000隻猴子在type writer上亂打,有機會會剛好打出一本 莎士比亞全集)。

QCOM當然是不會給線路圖囉,實際上 QCOM當初的contact windows也已經離職了。

所以,只好請Eng自己量一下...

LEO用全域搜尋法,用三用電錶量2,3,4 pin是否和哪一個 device是短路的....

目前 LEO量測出... DI pin 有一個電阻到VCC,但是沒有焊...@_@ ... (costdown 到這個程度 ???)

LEO 繼續量VCC , DI, power up的暫態時序。

星期四, 7月 13, 2006

more .. about Marketing..

「三星品牌做了三十多年,但是真正的轉機就是在手機,三星手機的高檔的形象與產量,把三星品牌形象整個翻過來,」李焜耀提高語調地說。
這個不知道是個人的觀點,還是有甚麼依據?

明基將獲得西門子在GSM、GPRS以及3G等領域內的領先關鍵專利技術,同時還有西門子2000多人的研發團隊。相對 於明基手機目前800人的研發團隊而言,這絕對是如虎添翼,對此,李焜耀也毫不掩飾內心的欣喜:“這些研發人員平均工作經驗超過10年,如果我們自己來培 養的話,5年都不夠!
”沒有想到...工作經驗多,所以薪水也多...

其中,一一三名為研發人員,與研發相關的部門也有二十八名員工裁撤,換句話說,此次裁員有超過一百四十名、將近五一%是研發人員。屬於PM功能的Category Management部門,計畫裁減八十二名,至於中央功能部門也將有五十四個職位遭到刪減。

相對於九個月前明基董事長李焜耀對於德國研發團隊能力讚不絕口,BenQ Mobile卻持續縮減德國研發人員,據了解,持續裁撤德國研發人力,是將成本高昂的德國研發基地,逐步移往成本相對低廉的台灣與中國計畫的一部分,也讓BenQ Mobile今年將減少約二成的產品開發計畫。
所以,最後這些研發人員都被裁了,剩下一些有"就業保證"的,在保證過期後也會走路。

本來 一份錢一分貨,東西好,研發時間就會長。
不然,就找些design house 的solution 兜一兜,設計一個炫的殼,不就最快最省錢?

西門子的RD都走路後,BenQ的手機大概還是和以前一樣吧....

星期三, 7月 12, 2006

boot CE on VMWARE via SBOOT

因為vmware的NIC : PCNet32 不在CE的bsp 中,所以要用Serial Port來download image。

Follow Tutorial : CEPC 的部份,作boot disk。

因為沒有Floppy,所以follow上一篇,download vfd (virtual floppy disk),create一個image : floppy B。
follow tutorial ,將cepc boot install在floppy B。

在作好的 cepc boot floppy 中有readme (其實就是DOS boot disk)。說到Serial Boot 使用sboot作bootloader,只會用 IO Address : 0x2F8 作download,所以要先將VMWARE的serial port,在bios set中設定為 0x2F8。

Platform builder,將CEPC BSP的OS build好,設定 serial download:

Target -- Connectivity -- Download (Serial : 選一個port) -- Setting (8-N-1, NO FLOW CONTROL).
下面 transport也一樣設 Serial,選一個 port。

選Attache Device -- 出現一個waitting request的dialog.

VMWARE使用floppy開機,floppy用剛剛用vfd做好image。
開機後,出現item選項,選 boot from sboot。

看看platform builder的waiting request dialog有沒有動靜,,,要等2-3分..開始有download.. 2%..
很慢,整個image (41M) download完約要52min.

download完後就開始執行啦(在platform builder的debug output window可以看到 loading dll的log。

完成

剛開始發生問題的幾點是..
  • sboot只會使用 0x2F8 port作image download polling,所以要變更VMWARE serial port iobase
  • platform builder的target-connectivity的serial port setting,default是hardware flowcontrol。要改為沒有flow control
  • 進入sboot後,會出現jmp to 0x?????然後就好像當機,要等一陣子(2~3min),platform builder的request dialog才會出現progress bar。
  • 完成download後,VMWare是black screen,看了platform builder的debug output才確定還在run

Virtual Floppy Disk : VFD - Opensource software

一個使用file作為floppy image的driver。可以在windows 中顯示出 floppy disk 。
可以用在很多沒有floppy的系統上 (現在還有機器有floppy的嗎?)。

download後 解開,執行 vfdwin.exe (gui介面),或 vfd.exe (console介面) 進行安裝和設定。

INSTALL
START
Driver0 - Change (Assign Driver Letter : B)
Driver0 - Open (ImageFile : ?, File, Create)


檔案管理員就可以看到Floppy B了。

bootloader for CE x86 platform

CE在x86上可以用的bootloader有很多種(依照他所在的位置和功能)
  • 在 BIOS的flash上,取代BIOS的 : romboot
  • 在 HD (floppy?)的MBR:bios loader
  • 在 HD (floppy?) root partition中:loadcepc.exe
在platform builder的help中都有描述,但是安排的很亂,用find功能找keyword比較容易。

星期二, 7月 11, 2006

Debian Sarge Testing.. support VMWARE share USB

剛剛發現 Debian Sarge Testing 可以支援VMWare的USB 裝置。
也就是說,在VMWARE中 安裝Debian Sarge Testing,插入USB裝置時,在VMware的USB裝置中會出現,也可以選disable。

所以就可以用拇指碟啦。

以前沒有upgrade到testing的話,不行這樣用。

CE 5.0 Platform Builder - some idea...

CE 5.0 的 Platform Builder是一個IDE,包含 :
  • Configure and build CE OS : 選擇BSP和kernel, User Component組合成一個OS image。
  • SDK generator : 根據制定好的OS build出一個SDK,讓eMVC的programmer可以用這個SDK來開發程式。
  • Emulator : 一個x86的emulator,可以test run image和 run application
  • Simple Project manage : user application 簡單的create, build
debug是用remote debug的觀念,load image也是。
在 "非emulator"的環境時,要實做bootloader (floppy),然後用ethernet來作remote image download,remote application debugging.

.... 試試 CEPC 有沒有可以用VMWare來run..
Google了一下,原來很多人都有這樣的想法,但是因為VMWare的ethernet card是AMD的PCnet ,CE沒有支援。

VMWare的Linux下lspci 出現 ethernet card是 PCnet32 79C970.
所以到AMD的網站去download,AMD PCnet有兩種 PCNet PCI和PCnet-Home.
PCNet PCI是100Mb,PCNet-Home是for embedded system,只有10Mb。

Linux sourcecode中 driver/net下pcnet32.c 可以看到 PCNet PCI和Home都是用這一個source。

AMD的網站可以download到PCNet-Home的driver source,但是是for CE 2.1的

所以? 從Linux Driver,參考 Home的Driver和CE Help中Migration Driver from ???
.


Something about platform builder : build process

當使用Build OS - Buils and Sysgen時,會用Build.exe作build的動作。

Build.exe 搜尋folder內是否有..
  • dirs這個file,如果有的話,到dirs所寫的目錄作一樣的操作
  • sources這個file。,如果有的話,呼叫Nmake 來build sources所指的sources files。
以上動作完成,Build.exe將所有source file build成一個exe file或是ddl file或是lib file。最後所有的exe, lib, dll都會被放在%_PROJECTROOT%\Oak 下


Build Run-Time Image的動作分為以下部份:
  • Compile Phase
  • Sysgen Phase
  • Release Copy Phase
  • Make Run-Time Image Phase
以上步驟完成以下動作:
  • Generate Header file
  • Link Modules
  • Copy Modules to Release directory
  • Generate run-time image
Platform build中大部分的source code都已經compile成static link library了,除非你修改sourcecode,否則不需要re compile這些code。

所有plateform build的library和3rd party提供的sourcecode會被整合在一個run-time image檔: Nk.bin。

Compile Phase
將sourcecode compile成static library,將 .rc 檔compile成 .res,並且依照localize的設定作轉換。
Sysgen
根據Catalog的內容SET/CLEAR Sysgen的變數,這個動作是由 Cesysgen.bat 完成的 (這個file在project folder的Oak/Misc下。
噁...emulator 停掉了,要reboot Windows 才行...

CE Platform Builder Installation

先安裝CE 5.0 Platform Builder,會安裝platform builder和CE System。
同時會有一個選項是Test Code - 會得到比較多的CE source code,需要額外的license。
所以要額外的$$才可以拿到多一點的source code
安裝是可以安裝,直接勾選"Install to HD"
安裝時會詢問SN,所以要先準備好。

完成後,按"F1",出現help document。
Welcome to Windows CE 5.0 -- Tutorials -- 有三個Tutorial,沒有硬體的時候用Emulator試試。
很詳細...step by step..
Platform -- Setting -- Build Option中有一個"Enable Full Kernel Mode":Thread 是要run在User Mode還是Kernel Mode,在Kernel Mode的話,kernel會省略掉security checking,所以performance會比較好(一點),但也因為如此,system被惡意軟體攻擊的機會也比較大。

Set Active Project 要選debug,才會有debug message。

"Build and Sysgen" : 開始build target。
..很久...但是有log,有一段會停止log,看起來幾乎像是完成一樣..但是還沒有,status bar右邊可以看到"building"的指示...可以用來辨別是否build 完成..很久... 3.0G +2GRam 竟然還要 30 min.
完成後,接著作Emulator download image and testing.....一個小時了,還在build...

Target -- Connectivity Options -- Kernel Service Map --
Download : Emulator
Transport : Emulator
Debugger : KdStub
...懶得寫了..都是一些奇怪的東西...

Target -- Attach Device 就可以看到Emulator開啟,剛剛的image download到emulator上,開始執行。

完成,不run的時候,從Target -- detach device就可以停止。

星期一, 7月 10, 2006

不好吃 : 辣白菜拉麵


  • 沒有白菜...Q_Q
  • 跟那個韓國辣味麵味道一模一樣
  • 麵是很粗那種,不太好吃

Porting FlashPlyer to Linux : a real hard thing.

因為實在太多人要flash player了,所以google了一下,看到這一篇..據說是flash player的desginer (programmer) 的blog "Porting the Flash Player to "alternative platforms" : 其中的一段..
...真他媽的難,比porting到OSX難多了。Porting一個console的program到Linux所作的是一堆瑣碎的事,Porting media application到Linux 簡直就是惡夢。
從sound support開始,我們要考慮很多sound standard(ALSA, OSS, aRTs, ESD, etc),GUI/Windows Framework也是一堆(X11,QT,GTK, copy and past.etc),然後是IME(如果linux真有這種東西的話..),font support更是全面性的問題,其他還有很多 分枝 出來的標準。
還有...要不要考慮PowerPC, x86-64 ?
所以困難點之一 就是因為Linux是完全的多樣化OS,不像OSX跟Windows一樣,有統一的介面。
接著提到實做部份..
...Linux的compiler是gcc,所以原source code中以intel compiler style寫的MMX 指令部份會完全不能用。現在的flash player執行速度可以接受,主要就是在MMX 的code。如果將MMX的code改由C來作,效能會減少50%。....
哇!接著就是sample code,真正的sample code,說明一段code,intel notation,轉到C,然後是AT&T(gcc) notation, SSE,甚至是PowerPC的AltVel,

最後,....
看過以上的說明,如果你覺得還好...那,你就是Macromedia目前急切需要的人了,我們找Linux的programmer有好一陣子了(但是到現在還是沒有找到適合的,..我猜他們都到Google去了吧..),最好,他們還是在家中工作的coder,因為這工作需要每天和Macromedia的team合作。
如果你覺得不錯,就快來吧 (還真的附有申請的link..)。你不請可以在Linux上作些有趣的是,甚至 還有薪水拿喔


所以flash player還真是一個"訂做"的繪圖平台,也大概是這樣,才可以用最小的資料,達到最漂亮的圖型展示,所以,才會有這麼多人為了單純的追求"炫"而使用他。

不過,也可以看出 如果有圖形加速功能的機器,大概就可符合flash player的需求,只是需要重新寫"大量"的code吧!

星期五, 7月 07, 2006

How do that know the real marketsize ?

競爭對手愛爾達科技董事長陳怡君就直言,「去年(收費網路影音服務)整體市場規模才二億五千萬元,今年至多成長到三億五千萬元,他們說的『數字』幾乎不可能出現。」
這些人好厲害,都知道市規模是多少,還知道成長的限制,不知道是怎麼調查來的...

星期四, 7月 06, 2006

X protocol - begin

X Windows 由Server經由socket 聽取 client 的 request,在螢幕上繪圖。
X Server除了負責螢幕的繪圖動作,同時還負責mouse, keyboard的輸入,將這些輸入動作經由socket利用event傳給 client。

X Sever太大了,所以拿nanaX 的code來看。配合 "X Windows System Protocol"

srvmain.c 的 GsSelect( ) 中的GsHandleClient( ) 負責從stream中讀取command,parse and execute.

GsHandleClient 中 的nxReq 就是Request : ref protocol "Request Format"
typedef  struct {
BYTE8 reqType; // opcode
BYTE8 hilength;
UINT16 length;
} nxReq;
reqType : opcode , 128 ~255 reserved for extension.
extension 的定義不在X protocl 的core protocol定義中。

hilength - length 合併成一個24 bit的data,代表request packet的length (這個跟X protocol 講的好像不一樣,X protocol用一個16 bit的欄位代表,單位是4 bytes)。

ref /usr/X11R6/include/X11/Xproto.h 有類似的宣告:
typedef struct _xReq {
CARD8 reqType;
CARD8 data;
CARD16 length B16;
} xReq;
接下來 Xproto.h 就宣告"Request codes",定義了1~127 的Code Name (Operation)。

這127個 operation 就是X Server提供的core protocol (?),可以對照pdf sect.9 的內容,解釋每個operation的動作和argument。

從這裡可以看到XServer提供的功能都是很基本的 。
--- 從Wiki上查到。X protocol 能一直維持 128個,不被增加的原因是X Server的設計理念: "如果不是 非他不可, 否則不用把他加進來"。



效能瓶頸大概有兩部份:
  1. Client/Server架構,decode/decode和透過socket傳輸,比較花時間。
  2. X Server本身提供的command很少。沒有辦法利用到hardware加速功能。
command的部份,大概就是靠extension 來補足(就是 request 中 Type > 128 的地方?)。

Client/Server架構就....不知道要怎麼解決了...

北韓如何挽回經濟,賺取外匯?

嗯,就是買大量的石油,黃金期貨,
然後試射飛彈......

devfs is gone

在 http://www.kroah.com/log/2006/06/29/#2006_06_29 看到,kernel 正式將devfs 的支援移除了 ( http://article.gmane.org/gmane.linux.kernel.commits.head/82801 )。

因為udev 更好的原因(?)。

對embedded system來說,devfs 不錯,不用手動建dev node,也不用寫script。所以root image建起來比較簡單。

但是這個"簡單"卻是由"修改device driver"來完成的,用devfs的話,以前的 driver都要修改。
還有麻煩的 device name問題,要統一。
大概是這個原因,所以不適合在desktop以上的大(相較於embedded)系統吧。

LDD 這本書還有說明devfs呢,看來,只有在 2.4的 kernel會有用了。也還好。因為為了size的關係,一些小embedded 用linux的還是 2.4。


實際devfs也挺麻煩,拿到driver都要改 ---- 除非他原來就有support (到現在沒看到過..)。

星期三, 7月 05, 2006

Success - Shutdown Windows, in C++ with ExitWindowsEx

以下是Code:
// shutdown.cpp : main project file.

#include "stdafx.h"

using namespace System;
using namespace System::Runtime::InteropServices;


[DllImport("kernel32.dll")]
extern "C" int* GetCurrentProcess(void);

[DllImport("advapi32.dll")]
extern "C" int OpenProcessToken(int* ProcessHandle,unsigned long DesireAccess, int** TokenHandle);

typedef struct _LUID {
unsigned long LowPart;
long HighPart;
} LUID, *PLUID;

[DllImport("advapi32.dll")]
extern "C" int LookupPrivilegeValue(char* lpSystemName, char* lpName, PLUID lpLuid);

typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid;
unsigned long Attributes;
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;

typedef struct _TOKEN_PRIVILEGES {
unsigned long PrivliegeCount;
LUID_AND_ATTRIBUTES Privileges[1];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

[DllImport("advapi32.dll")]
extern "C" int AdjustTokenPrivileges(int* TokenHandle, int DisableAllPriviliges, PTOKEN_PRIVILEGES NewState,
unsigned long BufferLength, PTOKEN_PRIVILEGES PreviousState,
unsigned long ReturnLength);

[DllImport("kernel32.dll")]
extern "C" unsigned long GetLastError(void);

[DllImport("user32.dll")]
extern "C" int ExitWindowsEx(unsigned int uFlags, unsigned long dwReason);

const int SE_PRIVILEGE_ENABLED = 0x00000002;
const int TOKEN_QUERY = 0x00000008;
const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
char *SE_SHUTDOWN_NAME = "SeShutdownPrivilege";

const int EWX_LOGOFF = 0x00000000;
const int EWX_SHUTDOWN = 0x00000001;
const int EWX_REBOOT = 0x00000002;
const int EWX_FORCE = 0x00000004;
const int EWX_POWEROFF = 0x00000008;
const int EWX_FORCEIFHUNG = 0x00000010;


int main(array<System::String ^> ^args)
{
int* hToken;
TOKEN_PRIVILEGES tkp;


if( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) {
Console::WriteLine(L"Failed!!\n");
return 0;
}

LookupPrivilegeValue(0,SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);

tkp.PrivliegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, 0, &tkp, 0, (PTOKEN_PRIVILEGES)0, 0);

if(GetLastError() != 0){
Console::WriteLine(L"Error!\n");
return 0;
}

if(!ExitWindowsEx(1,0)){
Console::WriteLine(L"ExitFail\n");
return 0;
}



Console::WriteLine(L"Hello World");
return 0;
}
執行後就會關機了,但是power不會off,會到..."現在可以自行關機了..."

不知道是甚麼問題....是不是argument 沒有加上 POWEROFF - 0x08 ?

的確,ExitWindowsEx 的argument使用
EWX_SHUTDOWN | EWX_FORCE | EWX_POWEROFF
就會自動poweroff了

More on Shutdown

這一篇msdn是Shutdown的步驟 :

BOOL MySystemShutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

// Get a token for this process.

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );

// Get the LUID for the shutdown privilege.

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Get the shutdown privilege for this process.

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);

if (GetLastError() != ERROR_SUCCESS)
return FALSE;

// Shut down the system and force all applications to close.

if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,
SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
SHTDN_REASON_MINOR_UPGRADE |
SHTDN_REASON_FLAG_PLANNED))
return FALSE;

return TRUE;
}
但是是用SDK 寫的。

要找一找這些typedef的原型是甚麼...
可以用Visual Studio , New 一個Win32App,加入API Name,就可以用 Go to Definition .. 到declaration 的地方
Visual Studio 和 CodeWarrior, SourceInsight 不一樣,
不需要build project就可以做到cross-ref edit(browse)
winbase.h
HANDLE GetCurrentProcess( ) : kerne32.dll

BOOL OpenProcessToken ( // int
HANDLE ProcessHandle, // void*
DWORD DesiredAccess, // unsigned long
HANDLE* TokenHandle // void**
) : advapi32.dll

winbase.h

BOOL LookupPrivilegeValue : ( // int
LPCTSTR lpSystemName, // wchar_t
LPCTSTR lpName, // wchar_t
PLUID lpLuid // ----- structre
) : advapi32.dll

typedef struct _LUID {
DWORD LowPart; // unsigned long
LONG HighPart; // long
} LUID, *PLUID;


win
BOOL AdjustTokenPrivileges( // int
HANDLE TokenHandle, // void
BOOL DisableAllPrivileges, // int
PTOKEN_PRIVILEGES NewState, // --- structure
DWORD BufferLength, // unsigned long
PTOKEN_PRIVILEGES PreviousState, // --- structure
PDWORD ReturnLength // unsigned long
) : advapi32.dll

typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount; // unsigned long
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; // --- structure, ANYSIZE_ARRAY = 1
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid; // --- structure - prev
DWORD Attributes; // unsigned long
} LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;

winbase.h

WINBASEAPI
DWORD // unsigned long
WINAPI
GetLastError() : kernel32.dll

winuser.h

BOOL WINAPI ExitWindowsEx( // int
UINT uFlags, // unsigned int
DWORD dwReason // unsigned long
) : user32.dll

這麼多typedef ,怎麼找 @_@....

利用Visual Studio來找... Create一個Win32 Form App.
到sourcecode...按右鍵就有 - Goto Definition.

在windef.h中有定義

HANDLE : void*
BOOL : int
DWORD : unsigned long


...其實直接在Visual Studio中用 Go to Definition..反覆 就可以到 type definition的地方。

.NET and COM : Interoperability

原來COM就很難用,又發明.NET。在中間加一層 CLR,讓code經由這一層來run。

再 設計一個機制,讓這一層的code可以使用以前不需經過CLR的code。

發明一個名字 : Interoperability.

然後,出一本 1600頁的書來說明要如何作這事 !!!!!

有人真的一一將這些MS憑空發明的東西學會,當他覺得OK,可以作些事,抬起頭來...MS又發明的一個東西 X@#$ ....

More about Interop in Managed , Unmanaged C++

上一篇不能動,應該說是沒效,系統不會shutdown。
所以從基本開始。

原來這種呼叫以前SDK 的DLL的動作叫 Interop.
MSDN 這一篇有範例跟說明 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcwlkSysimportAttributeTutorial.asp

第一段: 從Managed Application 呼叫 Unmanaged Code.

範例是呼叫 User32.dll的 MessageBox
#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;
// for DllImportAttribute

namespace SysWin32
{
[DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = CharSet::Unicode)]
int MessageBox(void* hWnd, wchar_t* lpText, wchar_t* lpCaption,
unsigned int uType);
}

int main( )
{
SysWin32::MessageBox( 0, L"Hello world!", L"Greetings", 0 );
}
DllImport用來告訴compiler有個function在User32.dll中。
EntryPoint說名function的進入點,如果沒寫,default就是與function同名。
CharSet 會讓呼叫時依據執行平台的內容 呼叫MessageBox或是MessageBoxW。
之後就是copy MessageBox的 declaration..並且加上 extern "C"

但是我用VC++ Express + Platform SDK 2003 Server build上面的example,會出現Unicode沒定義的錯誤。
把 CharSet = Unicode改為 CharSet=CharSet::Unicode後就OK了。
follow 這一篇
Specify a Character Set,用CharSet.Unicode,結果出現 mscorlib.dll::interopService::CharSet 沒有 . 動作,所以改為CharSet::之後就自動出現幾個Charset property 可以選了 :)


這一篇有個更簡單的..
呼叫User32.dll的 GetSystemMetrics
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;

value class Win32 {
public:
[DllImport("User32.dll")]
static int GetSystemMetrics(int);

enum class SystemMetricIndex {
// Same values as those defined in winuser.h.
SM_CXSCREEN = 0,
SM_CYSCREEN = 1
};
};

int main() {
int hRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CXSCREEN) );
int vRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CYSCREEN) );
Console::WriteLine("screen resolution: {0},{1}", hRes, vRes);
}
.這一篇是structure argument的例子 kernel32.dll的 GetSystemTime.
一樣,先宣告GetSystemTime argument的structure。
但是原WORD keyword已經不支援,所以要改成short。

#include "stdafx.h"

using namespace System;
using namespace System::Runtime::InteropServices;

typedef struct _SYSTEMTIME {
short wYear;
short wMonth;
short wDayOfYear;
short wDay;
short wHour;
short wMinute;
short wSecode;
short wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;


[DllImport ("kernel32.dll")]
extern "C" void GetSystemTime(SYSTEMTIME* pSystemTime);


int main(array<System::String ^> ^args)
{
SYSTEMTIME *pSystemTime = new SYSTEMTIME();
GetSystemTime(pSystemTime);
Console::WriteLine("Current Month is {0}", pSystemTime->wMonth);
return 0;
}
和原來文章的code不一樣的的方式,WriteLine的argument有用__box prefix,compile時出現 error : __box需要 /clr : oldstyle,所以我就把他拿掉了。

同樣一篇,接著是"Dealing with String,似乎可以解決uncode的問題..(因為他直接使用MessageBoxW):
#include "stdafx.h"

using namespace System;
using namespace System::Runtime::InteropServices;

[DllImport("user32.dll")]
extern "C" void MessageBox(int hWnd, char* lpText, char* lpCaption, unsigned int uType);

int main(array<System::String ^> ^args)
{
MessageBox(0,"Hi There!","888",0);
Console::WriteLine(L"Hello World");
return 0;
}
和原Example不一樣得的方式 MessageBox argument char* 在example是String *,但是compile出現System::String cast問題,參考前一個例子,用wchar_t代,結果出現 char[10]不能轉換成 wchar,才改用char *。

執行結果,即使使用中文String也ok,所以大概是可以吧。


所以使用Win32API的方式大概是..先找到API所在的DLL,再找到API的prototype。
將原Win32 SDK的argument type name改為Managed C++ typename (where is the conversion table ?)。
就可以直接使用了。

星期二, 7月 04, 2006

Shutdown Windows in VC++ 2003 with CLR

Shutdown的API是 ExitWindowsEx( ),屬於user32.dll

.NET中要使用dll 要先用 dllimport

只有在msdn sample code中找到C#的example

然後在這一篇中提到Managed C++中使用 DLL 的方法:

所以修改一下,大概是..
加上
using namespace System::Runtime::InteropServices;
[DllImport("user32.dll", EntryPoint="ExitWindowsEx") ]
extern "C" bool ExitWindowsEx( int flg, int rea );
取代prototype 宣告。和
const int  EWX_LOGOFF    = 0x00000000;
const int EWX_SHUTDOWN = 0x00000001;
const int EWX_REBOOT = 0x00000002;
const int EWX_FORCE = 0x00000004;
const int EWX_POWEROFF = 0x00000008;
const int EWX_FORCEIFHUNG = 0x00000010;
作flash const宣告。

然後就可以在source code中使用
    ExitWindowsEx (EWX_POWEROFF | EWX_FORCE , 0x00030001 );
.!!在NT 以上系統不能這樣作,要先取得適當權限後才行。
好像還有3個 Win API要call ...目前只有找到C#的example..
http://www.chinaaspx.com/comm/dotnetbbs/Go.aspx?Forum_ID=6&id=73121&PPage=1&Action=next

^ and gcnew : not MS specific, a New C++ standard

上次我以為 ^ 和 gcnew 是MS 自創的,結果是我自己太孤陋寡聞...

有個新的東西叫 Managed C++,但是語法和C++差異太大,所以又有Managed C++ Extension和C++/CLI ,讓Managed C++繼續有C++的語法。

這兩個東西 :^ 和gcnew 就是C++/CLI的語法。

gcnew和 以前的new類似,但是gcnew 是managed,也就是說,有類似 java 的garbage collection,不用programmer操心什麼時候要delect。

為了和new出來的object有所區別,gcnew 出來的object reference就用 ^ 代替 *。

google了一下,出現了一堆... Stan Lipman竟然離開BellLab進入MS了....實際上Managed C++,Managed C++ Extension和C++/CLI 甚至.NET 好多地方都混用...不知道真正的差異在哪...目前好像只有MS的compiler有支援C++/CLI,其他都沒有(gnu也沒有)....ECMA standard是free的...

Software Engineer的功課真是寫不完呀....Q__Q

Oreilly 這一篇文章有說明 Managed C++

some googling about anubis gates

彈簧腿傑克
彈簧腿傑克(Spring Heeled Jack)英國民間傳說於維多利亞時代的人物。最早的紀錄據稱是在1837年,之後從倫敦到雪菲爾和利物浦都有目擊報告,從倫敦郊區和英格蘭中部向外擴散,1850年至1880達到高峰。
一般相信其消失於1904年。許多宣稱已確定他的身分,但無一能釐清真相,因此依舊無法解釋。
科律治 Samuel Taylor Coleridge ?

威廉‧艾希布雷斯 William Ashbless

拜倫

狼人

SerialPort Class in .NET Framework - finally

聽說在.NET framework 2.0終於有SerialPort Class了,
所以不用再去用甚麼CreateFile,或是用一些奇怪廠商的OCX,dll..

以下是sample code,從http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=229270&SiteID=1 copy來的
The following is very simple example of how to user SerialPort in C++.

using namespace System;
using namespace System::IO::Ports;

int main(array<System::String ^> ^args)
{
SerialPort^ serialPort = gcnew SerialPort(
L"COM1",
9600,
Parity::None,
1,
StopBits::One);

serialPort->>Open(); // 這一行Example忘了寫。
serialPort->WriteLine("Hello World");
serialPort->Close();
return 0;
}
這個example必須要在CLR下才能執行( File--New Project -- CLR console)。
Microsoft 真是軟體工程師的惡夢呀。
雖然稱作是C++,但是卻多了一個 ^ operator。而且還非要用不可。
如果真的大家都要這樣惡搞,那要ANSI協會幹嘛?

大概是希望讓programmer認為..." 反正已經不是C++了,既然要重學,而且學只有microsoft支援的變種C++,那不乾脆就學C#好了。 "

Visual C++ Express

全名是Visual C++ 2005 Express Edition
不是Visual C++ .NET Express
不是Visual C++ 2006 Express

原來用CLR 寫的Form Application 就是 .NET 呀。

Form Application 屬於 .NET Framework 中的一個類別庫。(class library ?)

.NET framework = Common Language Runtime + Class Library.

Common Language Runtime
好像是一個有JIT功能的VM。藉由這個VM run的code叫managed code。

古老的code可以藉由load 這個VM來執行(呼叫?) 已經寫好的managed code function。
Class Library
大概就是一些寫好的component,好像只能由CLR這個VM來執行...不能像以前的DLL, COM, OCX等直接link
夠奇蹟,Console.WiteLine(S or L 竟然不一樣,如果用S,compile時要加上/clr。

可以將class compile成dll,使用的program (client)只要include dll進來 (用 using "..\CompCs.dll"),不用再準備 header file。

所以Windows Form application compile出來的大概就是CLR用的byte code。
所以只能有CLR支援的function囉?
能不能直接呼叫Win32 API呢?

星期一, 7月 03, 2006

VC Express and Platform SDK

VC Express 只能build console program 和使用 CLR 的FORM designer 程式。
安裝platform SDK後,就可以呼叫Win32SDK(因為有header file和libary了),注意,是SDK喔,也就說 Charles Petzold那一本書的寫法。

以下是 VC++ Express FAQ

ffmpeg : probe - mpegts

static int mpegts_probe(AVProbeData *p)
{
const int size= p->buf_size;
int score, fec_score;
#define CHECK_COUNT 10

if (size < (TS_FEC_PACKET_SIZE * CHECK_COUNT))
return -1;

score = analyze(p->buf, TS_PACKET_SIZE *CHECK_COUNT, TS_PACKET_SIZE, NULL);
fec_score= analyze(p->buf, TS_FEC_PACKET_SIZE*CHECK_COUNT, TS_FEC_PACKET_SIZE, NULL);

if(score > fec_score && score > 6)
return AVPROBE_SCORE_MAX + score - CHECK_COUNT;
else if(fec_score > 6)
return AVPROBE_SCORE_MAX + fec_score - CHECK_COUNT;
else
return -1;
}

很奇怪...
analyze是...
static int analyze(const uint8_t *buf, int size, int packet_size, int *index)
{
int stat[packet_size];
int i;
int x=0;
int best_score=0;

memset(stat, 0, packet_size*sizeof(int));

x=0;
for(i=0; i<size; i++){
if(buf[i] == 0x47){
stat[x]++;
if(stat[x] > best_score){
best_score= stat[x];
if(index) *index= x;
}
}
x++;
if(x == packet_size) x= 0;
}
return best_score;
}
.裡面有一個偉大的用法??state[]這個local array 可以用argument packet_size最為array size。

這個analyze( )的功能是?

Visual Studio Express - installtion

主要是講VC而已。

  • download VC.IMG,用rar解開,run setup。
  • 安裝完後,說要裝platform sdk,所以去download 2003 server platform sdk (可是我只是要寫XP的application,,有差嗎?)。
    download psdk時要小心,除非你的adsl很快,否則不要download install那一頁1.多M那個program,他會用網路安裝,要follow page link 到 Full download那一頁,download 12個CAB檔下來再裝,比較保險。
    download下來的cab檔要自己一一解開,再run setup
  • 安裝完畢..接著是很奇妙的設定修改動作,follow getting start with VC express..
    • 把platform sdk的bin, include, lib 都加到visual studio的path中
      開啟 Tool-Option-Project and Solutions - VC++ Directories.
      在右邊Show directory for :
      • 在bin 加入platform sdk /bin folder的path
      • 在include加入include
      • 在lib加入lib
    • 把user gui library dll加入 project dependency
      修改 Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults 的 corewin_express.vsprops 把
      AdditionalDependencies="kernel32.lib"
      改成
      AdditionalDependencies="kernel32.lib  user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib  ole32.lib oleaut32.lib uuid.lib"
    • 這一段有奇怪,有一篇有寫,有一篇沒寫,就是把 C:\Program Files\Microsoft Visual Studio 8\VC\VCWizards\AppWiz\Generic\Application\scripts\1033的default.js中
      LinkTool.AdditionalDependencies = "kernel32.lib $(NoInherit)";
      comment掉(有兩個地方出現)。
    • enable win32 application wizard : 修改 \Microsoft Visual Studio 8\VC\VCWizards\AppWiz\Generic\Application\html\1033\AppSetting.htm的 441 - 444 行,comment掉
      // WIN_APP.disabled = true;
      // WIN_APP_LABEL.disabled = true;
      // DLL_APP.disabled = true;
      // DLL_APP_LABEL.disabled = true;
      ..
接者就可以開始測試 Wizard -- File - New Project - 選Win32, console 或GUI(sdk)。build,就可以run了。

選CLR的話,可以build .NET的program。使用form designer。

但是很奇怪的是...以上在win2000 build出來的code竟然不能再XP上run ...

星期日, 7月 02, 2006

The Anubis Gates (捏他)

阿努比斯之門,果然是 非好看的科幻(應該說是奇幻)小說。

劇情非常複雜,有需多支線,但彼此都緊密的連結在一起,

重要的是,整個故事又跟很多歷史事件相連(因為本來就是個有關時光旅行的故事嘛)。

除了巫術這一點(但是使用的也不過分),就只有時間之門這個奇幻設定了。所以內容一點也不牽強。

以下紀錄一下故事內容:
19世紀埃及巫師為了將英國人趕出埃及,所以用巫術召喚anubis神附身,企圖將地獄之門打開,卻意外開啟了一連串的時間之門。同時召喚者也成為有附身能力的狼人。

20世紀的癌正末期富商研究歷史發現巫術與時間之門的巧合性,進而找出利用時間之門回到過去的方法。

富商聘請當時的歷史學者一同回到過去,學者被當時巫師的地下團體抓住,無法跟隨其他人回到現代。

當時倫敦出現的長毛狼人原來就是當初施術失敗的狼人巫師。利用附身能力,不斷和被害人交換軀體。

富商和一位學者舊識再度進入19世紀,原來富商想利用狼人協助他將癌症末期的身體換掉。

學者與其舊識相遇,但兩人被狼人交換身份,學者身在舊識的身軀中。而狼人則以學者身份向富商談判。

巫師創造拜倫分身,控制分身,企圖引起應國內亂,再召喚火神引起大火。計畫被學者破壞,學者與拜倫成為朋友。

富商與狼人結盟,在英國累積財富,但最後兩人被一位狼人附身過的受害者的女友所殺。

學者消滅巫師的組織,最後以另一身份留在19世紀英國。

以上只是大約的劇情內容,實際書中有更多枝節巧合,讓整個故事結構非常緊密,各因果關係毫無牽強之處。大概是因為他是奇幻小說,所以作者有更多使用的工具吧。

唯一看起來的缺憾大概是編排,在同一章節中換段落或場景時,應該要多一些空白,或是加上直線比較好。否則要看一段之後才會感覺到。

網誌存檔