20081009

[解法]windows下確認另一個程式已執行完畢含前景偵測

[解法]windows下確認另一個程式已執行完畢含前景偵測
作者:
Aeon Linn
http://aeon.tw
aeonlinn@gmail.com

問題:
在用delphi開發應用軟體時,
需執行另外一支exe程式,並等待exe程式執行完畢之後進行下一步驟;
此時應採用winodows sdk來處理,
意味著這種處理可以在其他windows下的程式語言中產生作用:如C++

解法:
針對另一支程式anotherprog.exe執行後視窗標題為Anotherprog 1.0的範例
1.
//用此方法等待程式啟動
hProg:THandle;
hProg:=ShellExecute(Application.Handle, 'open', 'anotherprog.exe',nil, nil, SW_SHOWDEFAULT);
WaitForSingleObject(hProg, INFINITE);
//do next....
2.
//用程式視窗標題取得程式是否在運行中
hwnd_TEMP:=Findwindow(nil,'Anotherprog 1.0');
3.
//用程式視窗標題取得程式是否在前景
GETWINLIST;
nhww:=GETWINID('Anotherprog 1.0');
//---------------------------------------------------
//取得前景運作中的視窗程式清單
public sg1: TStringGrid;
//---------------------------------------------------
procedure TForm1.GETWINLIST;
var
 Buffer : Array[0..99] of char;
  h1:HWND;
 dwProcess1: DWORD;
 cnt:DWORD;
 szModName:array [0..255]of char;
 hProc:THandle;
 hMod: HMODULE;
 i:integer;
 strtmp:string;
begin
 i:=0;
 while i begin
  sg1.Rows[i].Clear;
  inc(i);
 end;
 h1:=GetforegroundWindow;
 GetWindowText(h1,Buffer,100);
 h1:=GetNextWindow(h1,GW_HWNDNEXT);
 i:=0;
 while h1>0 do
 begin
  h1:=GetNextWindow(h1,GW_HWNDNEXT);
  if not (IsWindow(h1) and IsWindowVisible(h1)) then continue;

  GetWindowText(h1,Buffer,100);

  GetWindowThreadProcessId(h1, @dwProcess1);
  hProc:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, dwProcess1);

  if (hProc)<>0 then
  begin
   FillChar(szModName, SizeOf(szModName), 0);
   EnumProcessModules(hProc, @hMod, SizeOf(hMod), cnt);
   if GetModuleFileNameEx(hProc, hMod, szModName,sizeof(szModName))<>0 then
   begin
    strtmp:=UpperCASE(string(szModName));
    sg1.RowCount:=i+1;
    sg1.Cells[0,i]:=Buffer;
    sg1.Cells[1,i]:=strtmp;
    if pos('.EXE',strtmp)>0 then sg1.Cells[3,i]:='1';
    if pos('IEXPLORE',strtmp)>0 then
    begin
     sg1.Cells[3,i]:='0';
    end;
    sg1.Cells[2,i]:=inttostr(h1);
    inc(i);
   end;
   CloseHandle(hProc);
  end;
 end;//while
end;

//取得特定程式或視窗代碼,若不存在則回傳0
function TForm1.GETWINID(strFN:string):integer;
var
 nR:integer;
begin
 nR:=sg1.Cols[0].IndexOf(strFN);
 if nR<0 then
  result:=0
 else
  result:=strtoint(sg1.Cells[2,nR]);
end;

4.
hwnd_TEMP為0的狀態表示程式已執行結束
hwnd_TEMP為0且nhww為0表示程式在背景執行(被主程式遮蔽)
hwnd_TEMP為0且nhww不為0表示程式在前景執行中

附註:
1.若有疑問或建議請不吝來信指教
2.所附的程式碼在取用時需作修改,這方面請別問我:)

#

20080925

[成長]每天3個EWI就無愧此生

[theme] [成長]每天3個EWI就無愧此生
[date/time] 20080924.1106
[author] Aeon Linn
[contents]

  延續前一篇「如何更有效率的生活」
  http://aeon.tw/BLOG/Blog.asp?id=91
  
  那篇文章中我提出工作當量的觀念。
  為了容易記憶,設定一個縮寫:
  EWI,equivalent of working item.
  
  哪!工作當量這種東西,就是把抽象的工作執行成果的公因數進行一種具象化的動作。
  每天忙、茫、盲的工作、生活下,你可曾焦慮過自己不曉得是否有在浪費人生?如何知道自己確實的活過了?如何知道自己正確地朝向設定的目標邁進?
  
  工作當量的計畫表可以幫助你。
  
  每個人的工作當量或許不同,對某甲而言,將三十塊磚頭從前庭搬到後院就是一個工作當量,對某乙而言,卻可能是五十塊甚至一百塊磚頭才算。
  同一個人在三十歲的工作當量和五十歲的工作當量也有所不同。
  是要因人而異、因時而異而有所調整。
  
  每個人能專注的工作主題數量也略有不同。
  但是總體上,若以一週為檢討的時間區間,那麼一週之內同一個工作主題所能配置的工作當量數目最好不要超過六個,如果超過六個,就要考慮提高工作當量的內容。
  這樣做的目的是為了避免在相同主題下支付太多精力、勞力而產生倦怠感,一旦倦怠感產生,這個工作主題的完成度就堪虞了。
  
  每週甚至每天可以彈性調整工作當量的配置,視心情喜好和事情的輕重緩急進行調整,而督促自己努力而不懈怠的,是看到工作當量表上被塗黑的格子增加了,為了趕在一週結束之前完成既定的工作當量總數,往往會有驚人的進度超前效果。
  格子翻成實心時的那種圖像化的、顯而易見的成果,所帶來的回饋,是一種正面而積極的循環。
  我開始使用,並且在我開始使用的瞬間跟您分享,希望您也能獲益!
  有任何問題或建議,也隨時歡迎來信交流、指教。
  
  每天三個EWI,則無愧此生!
  Don't idle away! 3 EWI per day!

  
#

20080924

[成長]如何更有效率的生活

[theme] [成長]如何更有效率的生活
[date/time] 20080923.1922
[author] Aeon Linn
[contents]

  多年來的專案管理經驗,讓我體會一個重要的道理,專案這種東西,效率重於一切,而效率的定義,就是在一定的時間點之前完成一定量化的目標。
  好的,我知道用專案管理來破題會有點抽象。
  
  那從兩句成語來說:「持之以恆、奮力不懈。」
  
  很多人都會把這兩句話放在國小、國中甚至高中作文的內容裡,但是如何去執行,誰知道呢?所以最終對多數人來說,這兩句話只是一種口號!
  其實想要做到,需要相當的技巧,坊間為了達到時間管理、目標管理,產出了各式各樣的理論,更誇張的有集結成冊的。
  其中較著名的,是所謂的GTD(Getting Things Done),我也花了兩個工作天的時間去研讀,但是很抱歉,這並不實用,套句愛因斯坦的老話,真理通常很簡單,最淺顯的道理才是最真實的道理。
  
  那麼,到底要如何生活得更有效率?如何去進行這種日積月累的功夫?
  
  經過半年的生活實踐之後,我發現我個人的執行能力大概是一週十七個工作當量,所謂的工作當量,意味著一個工作主題的項目,相當於一次不停歇的五千公里長跑、三十分鐘的游泳、整理書房……。
  此外,一個星期內最大可能的工作主題大約可以承受到五個,每個主題所能支持的最大當量是六個。
  所以我在20080923這天,做了一個23週的工作計畫表,將我所能承受的十七個工作當量分週別配置在最關注的五個工作主題中。
  然後我將這個表放在我的網站上,非常『光明磊落』的公佈出來,相當於把我今後23週之內的工作效率揭示在無特定對向的網際網路上。
  http://aeon.tw/sbs/misc/yroutinewk.htm
  每日每日的把我完成的工作當量從空格轉為實心格子,然後企圖提昇我每週的當量,當然,我關注的主題是什麼,我不會明說,但是我會做。
  
  Actions speak louder than words.
  
#

20080917

[解法]錯誤ASP0104:80004005

症狀:
上傳文件到 Windows 2003 server + IIS 6.0 服務器的時候遇到下列錯誤:
請求對象錯誤 ASP 0104 : 80004005 操作被禁止

原因:
IIS6.0 禁止上傳超過 200kB 的文件。因此要修改 IIS 的默認設置.

解決方法
打開位于 C:\Windows\System32\Inetsrv 中的 metabase.XML,并修改 AspMaxRequestEntityAllowed 為需要的值(例如 51200000,50MB)。
此值視整體網站用途調整。

注意:
在編輯文件前如果沒有停止 IIS 服務,則無法保存修改后的文件,
若想在iis運行的時候修改其配置文件,則打開iis管理器,打開internet信息服務屬性面板,勾選「允許直接編輯配置數據庫,允許在iis運行時編輯iis配置數據庫配置文件」

20080911

[意寓]幼兒的退化行為與成人的懷舊心態

[theme] 幼兒的退化行為與成人的懷舊心態
[date/time] 20080910.1513-1630
[issue] aeon
[privacy] low
[author] Aeon Linn
[contents]

  有些幼兒,明明已經會走路了,卻喜歡在地上爬,已經會自己吃飯了,卻硬要家長餵食;應該會說話了,卻仍是含糊不清,這種種表現,就是幼兒的退化行為。
  為什麼會出現這種「退化行為」呢?心理衛生學家認為,當孩子使用種種方法都得不到老師或父母的關注或愛后,他們的這種「退化行為」反而輕而易舉地得到老師和父母的關注和愛。
  
  相對於幼兒的退化行為,成年人突然間開始喜歡聽懷舊歌曲,開始看青年時期看過的電影,這種行為是否也可以算是另一種型態的退化呢?
  
  然而,何以如此?為何會如此!
  
  經過一整個下午內心的自省與查照之後,深深以為,這純粹是現實生活上遭受到挫折與不如意,讓自己想要逃避現實,遁入沒有責任,純粹玩樂的心態。
  是現實上沒有足夠充裕的資源去進行富創造性的休閒活動,導致心靈的不滿足、空虛,引發對未來的恐懼,更進一步體現在執行力上的耗弱。
  
  凡此種種,都是一種警兆!
  
  過去的,終究是過去的。
  擁有廣大支持的美國影集,星艦迷航系列,一直在強調並推廣一種精神,生命,在探索、在發展更新的事物。
  
  而在台灣地區成長的人們,或多或少都背誦過兩句話:
  「生命的意義,在創造宇宙繼起之生命;
   生活的目的,在增進人類全體之生活。」
  
  所以,奮起啊,為了不辜負自己的生命,為了不辜負前人留下的文化與種種心血結晶,蓄積著充沛的能力、懷抱著積極的理想的吾輩,讓我們奮起吧!讓我們將那些種種的懷舊拋在身後,繼續去寵愛去豢養自己心中的渴望,勇敢的去迎向未來,勇敢的去接受更多挑戰、去體驗更多新奇的經驗與感動、去創造更多美好的回憶。
  
#

20080818

[解法]asp如何判斷讀檔讀到的是big5或utf-8

有的時候,就算找得到解法也未必能立刻就手,
還需要稍微測試並修改一下!

下段的程式是針對伺服器端讀檔時,分析讀出來的文字檔是否為純BIG5編碼,
如果判斷摻雜了非BIG5的編碼,則須以utf-8再讀一次,
現在中文前台的揭示普遍使用utf-8!
至於簡體碼的玩法大致相同,
此段程式為我實作「極簡個人檔案管理網頁」遭遇到的難題!
由於上傳的文字檔使用的編碼有big5/utf-8兩種,
全面轉檔再上傳不合效益,所以在伺服器端加上這個
在讀出檔案時自動偵測檔案內容編碼而決定是否切換編碼的功能。

應用面上若有問題歡迎來信問我!

function isBIG5(tmpstr)
' check A140~A1FE 全形符號, A440~C67E 常用字, C940~F9D5 次常用字
session.codepage=950
Dim lngAsc
for k=1 to 240
strChar=mid(tmpstr,k,1)
lngAsc = Asc(strChar)
if len(hex(lngAsc))<3 then
IsBig5=true
else
IsBig5 = (lngAsc >= &hA440 And lngAsc <= &hC67E )
If Not IsBig5 Then IsBig5 = (lngAsc >= &hC940 And lngAsc <= &hF9D5)
If Not IsBig5 Then IsBig5 = (lngAsc >= &hA140 And lngAsc <= &hA1FE)
end if
if Not IsBig5 then exit for
next 'k
session.codepage=65001
end function 'isBig5

前一版本請參考

20080812

[衍道]道德經辨解:帛與簡

[衍道]道德經辨解:帛與簡
[經解] 神閑子
[日期] 20080811
[原文]

讀老子的困難之處,在於手上所能取得的原文的完整性與正確性,多數人手上的文本,是受到後人展轉傳抄、承訛襲謬時摻入了自己的想法的成品,因此與那位曠世的哲人老子的原意或者有些偏離。

七十年代在湖南馬王堆漢墓出土帛書老子。之後,一九九三年,湖北省荊門市南部的郭店一號楚墓出土了一批為數七百三十枚的有字竹簡。簡上抄刻了十六種古藉,其中包括三組老子(以竹簡形制區分,今天稱為《老子》簡甲本,簡乙本和簡丙本)。

由於竹簡老子的年份可追溯至戰國中期,其成書年代,較帛書老子更為久遠,於是這下好玩了,以帛書老子為宗著書立說的一派瞬間沒了底氣,可以說之前沸沸漡漡的有憑有據的一些校正,在瞬間有被挨了一刮子耳光的感覺。

然後著書立說的、注釋的,開始交詰攻訐,本著當初注釋的原則而逐字逐句的反覆推敲。

但是,我想說的是……這又如何?
難道帛書老子一出,之前譯註的那些人的就錯了嗎?難道簡書老子一出,用帛書老子譯註的人就錯了嗎?

不會有錯的,世間原本就沒有善惡對錯的分別,老子說了,「有美斯有惡」,這個說法不管多少個版本的老子都不會被修正,為何不會被修正,因為最貼近道的道理是不容易被扭曲的。

相對的,被曲解、被錯置,被填入、串入後人註解的那些版本,難道就不能看了嗎?那也不至於,根據過往的經驗,看得懂的,就是看得懂,那些累綴的、額外的糟粨,打從一開始,就不會進入真正敞開胸懷去擁抱老子的人的眼裡。

舉例說明,一個剛燒製完成的陶碗,是碗;一個掉入泥漥裡裹滿污泥的陶碗,是碗;一個埋藏地下數百年的陶碗,還是碗;只要這碗沒有摔碎,就仍是碗,即使摔成碎片了,遇到熱忱更加深厚的人,他仍會說那是碗!

老子的真意不會因為不同的注釋而產生分歧,相對錯誤的注釋,並不會扯遠「渴望求道」的道路,所以,真的想瞭解天道的人,隨便抓一個版本都可以看,當然,如果碰巧拿到一本被相對貼近道的人注釋過的版本,就會更快入門了。

這麼說吧,註解老子道德經的相對較快的法門,是先把「道法自然」深刻的放在心中,然後去揣摩文字間的真意,老子寫這道德經的唯一目的,就是要傳道,將千年前的他跟這個無形無狀卻又實實在在的東西接觸過後的感想,好好的傳授給我們。

道德經的每一篇,都只是道的枝蔓,道的形象,多看一篇,少看一篇,不會有很大的差別,若說有差別,差別僅在於對道的體悟的快慢而已。

如果「道」真的如同老子所說的那麼神妙!那麼,無所不在的道,自然也會存在於抄錯的老子、曲解的老子甚至其他諸子百家學說之中。