Tommy 碎碎念

Tommy Wu's blog

將 heartbeat 換成 pacemaker+corosync
post by tommy @ 27 三月, 2012 20:48

我用 heartbeat 應該有好幾年了, 好像有 0.x 版開始就用到現在的 3.x 版. 記得剛開始的時候, 功能不多, 不過也沒什麼問題... 現在用的 3.x 版, 最近常常碰到 standby 的機器重新開機 (應該說 heartbeat 的程式停掉再跑), 讓原本正在運作的機器的 heartbeat 突然佔用所有的 CPU, 然後一堆 log 在 ha-log 或 ha-debug 裡頭, 接著... 原本應該正常運作的 heartbeat 就停了.

由於 heartbeat 的 maillist 中看到不少人有類似的情形, 不過... 看起來似乎沒有什麼解決方法. 由於次數越來越多, 所以就想把 heartbeat 換掉. (閱讀全文)

Del.icio.us Furl HEMiDEMi Technorati MyShare
Delphi 的 utf-8 轉換
post by tommy @ 02 三月, 2012 12:39

新版的 Delphi 應該不用這麼麻煩, 據說只要直接在 AnsiString, WideString, UTF8String 之間 assign 時就會自動幫你做轉換 (沒用過, 不知道是不是真的這樣就可以).

不過... 還在用 Delphi 3/5, 所以... 只好自己來轉:

unit util_utf8;
 
interface
 
uses Windows;
 
type
UTF8String = AnsiString;
 
function AnsiToWide(const S: AnsiString): WideString;
function WideToUTF8(const WS: WideString): UTF8String;
function AnsiToUTF8(const S: AnsiString): UTF8String;
function UTF8ToWide(const US: UTF8String): WideString;
function WideToAnsi(const WS: WideString): AnsiString;
function UTF8ToAnsi(const S: UTF8String): AnsiString;
 
implementation
 
function AnsiToWide(const S: AnsiString): WideString;
var len: integer;
ws: WideString;
begin
Result:='';
if (Length(S) = 0) then
exit;
len:=MultiByteToWideChar(CP_ACP, 0, PChar(s), -1, nil, 0);
SetLength(ws, len);
MultiByteToWideChar(CP_ACP, 0, PChar(s), -1, PWideChar(ws), len);
Result:=ws;
end;
 
function WideToUTF8(const WS: WideString): UTF8String;
var len: integer;
us: UTF8String;
begin
Result:='';
if (Length(WS) = 0) then
exit;
len:=WideCharToMultiByte(CP_UTF8, 0, PWideChar(WS), -1, nil, 0, nil, nil);
SetLength(us, len);
WideCharToMultiByte(CP_UTF8, 0, PWideChar(WS), -1, PChar(us), len, nil, nil);
Result:=us;
end;
 
function AnsiToUTF8(const S: AnsiString): UTF8String;
begin
Result:=WideToUTF8(AnsiToWide(S));
end;
 
function UTF8ToWide(const US: UTF8String): WideString;
var len: integer;
ws: WideString;
begin
Result:='';
if (Length(US) = 0) then
exit;
len:=MultiByteToWideChar(CP_UTF8, 0, PChar(US), -1, nil, 0);
SetLength(ws, len);
MultiByteToWideChar(CP_UTF8, 0, PChar(US), -1, PWideChar(ws), len);
Result:=ws;
end;
 
function WideToAnsi(const WS: WideString): AnsiString;
var len: integer;
s: AnsiString;
begin
Result:='';
if (Length(WS) = 0) then
exit;
len:=WideCharToMultiByte(CP_ACP, 0, PWideChar(WS), -1, nil, 0, nil, nil);
SetLength(s, len);
WideCharToMultiByte(CP_ACP, 0, PWideChar(WS), -1, PChar(s), len, nil, nil);
Result:=s;
end;
 
function UTF8ToAnsi(const S: UTF8String): AnsiString;
begin
Result:=WideToAnsi(UTF8ToWide(S));
end;
 
end.

就是直接使用 win32 的 API 來處理.

PS. 舊的 VCL 只支援 Ansi, 所以... WideString 與 UTF8String (定義與 AnsiString 相同) 並沒有辦法正確的在 VCL 中顯示.

Del.icio.us Furl HEMiDEMi Technorati MyShare
Zint Barcode Generator
post by tommy @ 02 三月, 2012 09:57

最近試著在 Delphi 中產生 QR-Code, 找到了 zint 這東西, 也找到有人針對 zint.dll 做的 Delphi  模組. 不過... 適用的 Delphi 版本是在 D10 之後, 我們用的 D3 與 D5 (沒錯了, 很老了) 都無法直接用. (閱讀全文)

Del.icio.us Furl HEMiDEMi Technorati MyShare
Bad Behavior 已經阻擋了 136 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS