20081029

[解法]MSN messenger漏訊息的經驗解

[解法]MSN messenger漏訊息的經驗解
作者:
Aeon Linn
http://aeon.tw
aeonlinn@gmail.com

[問題]
MSN常駐在伺服器上,
幾乎24/7不停機,
某天,突然間發現自己回應的訊息都不曾被收到,
特別再開一台機器,訊息對傳,
發現伺服器上的messenger只能收不能送
版本8.5.1302.1018

[解法]
1.使用第二個帳號同時登入
可以,但是要讓清單上的朋友都轉移過來是相當消耗資源的一件事。

2.重新安裝
問題仍然存在

3.
使用MSNEDIT之類的patch程式對messenger做一次修改。
有效,原因不明,但是有效。

[感想]
這是博克誌寫過的一篇最沒有技術養分的解法了。

20081027

[解法]CBB3.08:使文章發表日期不為亂碼

[解法]CBB3.08:使文章發表日期不為亂碼
[author] Aeon Linn, http://aeon.tw

Xoops經過許多人前仆後繼的使用,
這幾年來已經越臻成熟,

甚至可以在短短三小時之內設定好一台Xoops網站,

但是呢,
很多細節部份如果真要吹毛求疵的話,
倒還是不少,
畢竟這不是一個純粹的商業軟體,
很多都是不知名的程式設計師憑著熱忱、或者一股意氣寫出來的東西,
所以有些小地方看不順眼的,
還要使用者自己除錯一下下。

比方說手上較為可用的CBB討論區3.08繁體版,
將大部分的問題排除,並且設定為UTF-8版本,
然後在發文時,
卻愕然發現發表文章有亂碼。
亂在發表時間日期上。
仔細一查,今天、昨天這幾個中文字在過程中並不顯示。

我對php實在不挺熟,
但是我對c還略知一二;
所以隨手追到了newbb_formatTimestamp這支函式,
看來是伺服器端轉來轉去的過程中把中文搞丟了,
怎麼辦?

最省力氣的解法就是最佳解!

將該函式預設的$format="c"
改成 format="mysql"

……問題解決了,
雖然沒有今天、昨天等等有趣的戳記。
但是可以正常的用年月日標示,畫面清楚,可用……就好。

20081016

[教學]自組電腦的散熱與降噪

[theme] 自組電腦的散熱與降噪
[date/time] 20081015.0929
[author] Aeon Linn, http://Aeon.tw
[contents]

  相當廉價地購入了一台小電腦,在覺得撿到便宜之餘,更訝異的是該電腦的「寂靜」,根本就只有很輕微的風吹的聲音,這對常常在深夜寫程式或者寫作的我來說,是非常難能可貴的。
  找出監控程式,發現這台小電腦的系統溫度竟然還相對偏低,更是讓我讚嘆,於是我開始動心起意,想好好的改造一下正在運轉中的主機。
  
  電腦的噪音源自於三大部份,電源供應器、系統風扇及CPU風扇、硬碟。
  
  電源供應器(PowerSupplyUnit,PSU)的風扇是取決於廢熱的多寡,這方面若是估算整體系統的耗電量不多,建議不要聽從門市人員的「建議」,買差不多夠的供應器就夠了,硬碟一顆、光碟機一顆加上整套478以下等級主機板的耗電量大約是200W以內綽綽有餘,所以真正良心的建議是買個200W以下的供應器,偏偏市面上總是一堆好大喜功、不明所以的推崇大供應器的穩定性。
  我採用的是80W的小供應器,風扇幾乎無聲,這點可以忽略不計。
  
  至於內部的其他風扇則要看監控軟體中主機板溫度(通常為北橋晶片溫度),和CPU工作溫度而定,一般常態負載狀況下要維持在42度以下為宜,高負載頂多多個4~5度;要盡量讓風扇的轉速和主機的工作溫度取得平衡,高轉速的風扇其實並沒有一定必要性,如果不幸預設高轉速風扇,可以購買風扇調速控件來串接。
  另一種較常出現的可能是風切聲,主要出現在機殼設計不良上,如果打開機殼發現風扇運轉時沒有聲音,蓋上機殼卻有聲音,這就是風扇運轉時的空氣流動在機殼的各種縫隙中發出像是吹口哨一樣的聲音,這點參考新入手的小電腦的內部作法,用鼓風扇處理,鼓風扇的好處是它發出的聲音是低頻音,就算較差的,也比較不會被人耳排斥成噪音,此外風流的方向一定,可以強迫吹定向,就直接取消了風切;另一個作法是自治導流罩,也是一種方法,但是材質和工時相形之下較不划算。
  
  第三種是硬碟的高頻音,硬碟在高效能運轉時,特別是有點年紀的硬碟,會發出高頻音,硬碟廠商有提供降噪程式,犧牲部份性能來處理,事實上我們並不需要那麼強悍的性能,所以啟用AMM是很合理的,我所採用的硬碟首選是IBM/HITACHI,相較於讓我深惡痛絕的、毀損我80G不能送保固資料的五年保固8MBCache液態軸承WD硬碟、和早期有過抓不到經驗的SG硬碟,HITACHI硬碟確實是值得廣泛配置而且衷心推薦的牌子。
  
  還有沒說到的第四種可能,就是機殼因振動引起的共振,最近出廠的機殼都像紙一樣薄,如果內部結構設計不良,或者機殼卡榫不精確,就會有部件的共振,很吵,最好的建議是換個機殼,萬不得已就自己壓重物或者添加螺絲在關鍵處鎖緊一點吧。
  
  此次調整,僅僅換了鼓風扇之後就安靜多了,聲音甚至低到不特別注意就會被忽略的程度,很高興,所以發文分享。#

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.所附的程式碼在取用時需作修改,這方面請別問我:)

#