谈Delphi中SSL协议的应用

一:SSL协议是什么?
SSL是一种加密传输协议.引用网上一段话:SSL 是Secure socket Layer英文缩写,它的中文意思是安全套接层协议,指使用公钥和私钥技术组合的安全网络通讯协议。SSL协议是网景公司(Netscape)推出的基于 WEB应用的安全协议,SSL协议指定了一种在应用程序协议(如Http、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即确保数据的完整性。

二:Delphi中如何使用SSL协议?
要使用SSL协议,有几种方法,一种是根据SSL协议文档自己实现,另外一种是调用第三方的开发库.现在一般的开发者(无论是Delphi还是VC)都是使用开源的OpenSSL库.本文的介绍都是基于OpenSSL的.
Delphi中的Indy组件本身就是支持OpenSSL的.例如,对于IdTCPClient,只需要拖一个IdSSLIOHandlerSocket控件到窗口,然后将IdTCPClient的IOHandler指向它即可.不过IdSSLOpenSSLHeaders.pas的声明比较老,是基于OpenSSL 0.9.4的,而0.9.4的DLL文件现在比较少见了.现在一般使用OpenSSL 0.9.7i.(可以打开IdSSLOpenSSLHeaders.pas,搜索版本,老版本是这样的:

OPENSSL_OPENSSL_VERSION_NUMBER = $00904100;
OPENSSL_OPENSSL_VERSION_TEXT = 'OpenSSL 0.9.4 09 Aug 1999'; {Do not localize}

0.9.4和0.9.7i的区别是0.9.4的部分函数位于ssleay32.dll中,而0.9.7i则抛弃了此DLL.网上有很多修改过的基于0.9.7i版本的IdSSLOpenSSLHeaders.pas,本文的演示代码主要是基于0.9.7i.

三:SSL客户端编程实例

使用OpenSSL之前,得先装载SSL库.直接调用Load函数即可完成:

if not uIdSSLOpenSSLHeaders.Load then //装载ssl库
begin
Application.MessageBox('装载ssl动态库失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

然后装载错误字符库和加密算法:

IdSslLoadErrorStrings;
IdSslAddSslAlgorithms; //load所有的SSL算法

然后,初始化SSL使用的协议版本和SSL上下文:

methClient := IdSslMethodClientV23;//SSL协议有多个版本,包括SSLv2,SSLv23,SSLv3和TLSv1我们这里使用v23.
if methClient = nil then
begin
Application.MessageBox('建立SSL Client所用的method失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

ctxClient := IdSslCtxNew(methClient); //初始化上下文情景.
if ctxClient = nil then
begin
Application.MessageBox('创建客户端SSL_CTX失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

上下文情景初始化完毕后,就可以进行socket通信了.首先创建一个正常的socket,连接到目的地址,然后申请一个SSL会话的环境:
sslClient := IdSslNew(ctxClient);
if sslClient = nil then
begin
closesocket(ClientSocket);
Application.MessageBox('申请SSL会话的环境失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

然后绑定套接字:
IdSslSetFd(sslClient, ClientSocket);
IdSslConnect(sslClient);
成功后就可以调用IdSslRead和IdSslWrite来读写数据了.
下面我们给出一个完整的例子,用于连接安全焦点的论坛首页.此程序用到一个Memo控件和一个按钮控件.注意:此代码没有做过多的错误处理,读者可以自行添加:

procedure TForm1.Button1Click(Sender: TObject);
const
//Url: string = 'https://www.xfocus.net/bbs/index.php?lang=cn';
Host: string = 'www.xfocus.net';
Port: Word = 443;
var
Wsa: TWSAData;
ctxClient: PSSL_CTX; //SSL上下文
methClient: PSSL_METHOD;
sRemoteIP: string;

ClientSocket: TSocket;
sAddr: TSockAddr;
sslClient: PSSL;
pServer_Cert: PX509;
pStr: Pchar;
buf: array[0..4095] of Char;
nRet: integer;
strSend: string;
begin
Button1.Enabled := False;

if WSAStartup($101, Wsa) <> 0 then //初始化Wsock32.dll,MakeWord(2,2),
begin
Application.MessageBox('初始化Winsock动态库失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

if not uIdSSLOpenSSLHeaders.Load then //装载ssl库
begin
Application.MessageBox('装载ssl动态库失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;
IdSslLoadErrorStrings;
IdSslAddSslAlgorithms; //load所有的SSL算法

methClient := IdSslMethodClientV23;
if methClient = nil then
begin
Application.MessageBox('建立SSL Client所用的method失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

ctxClient := IdSslCtxNew(methClient); //初始化上下文情景
if ctxClient = nil then
begin
Application.MessageBox('创建客户端SSL_CTX失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;


sRemoteIP := GetIPAddressByHost(Host);
if sRemoteIP = '' then
begin
Application.MessageBox('获取远程IP地址失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;


ClientSocket := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ClientSocket = INVALID_SOCKET then
begin
Application.MessageBox('创建socket失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

FillChar(sAddr, Sizeof(TSockAddr), #0);
sAddr.sin_family := AF_INET;
sAddr.sin_addr.S_addr := inet_addr(Pchar(sRemoteIP));
sAddr.sin_port := htons(Port);

if connect(ClientSocket, sAddr, sizeof(TSockAddr)) = SOCKET_ERROR then
begin
Application.MessageBox('连接远程服务器失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

sslClient := IdSslNew(ctxClient); //申请SSL会话的环境,参数就是前面我们申请的 SSL通讯方式。返回当前的SSL 连接环境的指针。
if sslClient = nil then
begin
closesocket(ClientSocket);
Application.MessageBox('申请SSL会话的环境失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

IdSslSetFd(sslClient, ClientSocket); //绑定读写套接字
if IdSslConnect(sslClient) = -1 then
begin
IdSslFree(sslClient);
closesocket(ClientSocket);
Application.MessageBox('绑定读写套接字失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

Memo1.Lines.Add(Format('SSL连接使用的算法为:%s', [IdSSLCipherGetName(IdSSLGetCurrentCipher(sslClient))]));

pServer_Cert := IdSslGetPeerCertificate(sslClient);
if (pServer_Cert <> nil) then
begin
Memo1.Lines.Add('服务端证书:');
pStr := IdSslX509NameOneline(IdSslX509GetSubjectName(pServer_Cert), nil, 0);
if pStr <> nil then Memo1.Lines.Add(Format('主题: %s', [pStr]));
pStr := IdSslX509NameOneline(IdSslX509GetIssuerName(pServer_Cert), nil, 0);
if pStr <> nil then Memo1.Lines.Add(Format('发行者: %s', [pStr]));
end
else
begin
Memo1.Lines.Add('客户端没有证书.');
end;
Memo1.Lines.Add('');

strSend := 'GET /bbs/index.php?lang=cn HTTP/1.1'#$D#$A +
'Accept: */*'#$D#$A +
'Accept-Language: zh-cn'#$D#$A +
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)'#$D#$A +
'Host: ' + Host + #$D#$A +
'Connection: Keep-Alive'#$D#$A#$D#$A;

if IdSslWrite(sslClient, @strSend[1], Length(strSend)) <= 0 then
begin
IdSslFree(sslClient);
closesocket(ClientSocket);
Application.MessageBox('发送失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

FillChar(buf, sizeof(buf), #0);
nRet := IdSslRead(sslClient, buf, sizeof(buf));
while nRet > 0 do
begin
Memo1.Lines.Add(StrPas(Buf));
FillChar(buf, sizeof(buf), #0);
Application.ProcessMessages;
nRet := IdSslRead(sslClient, buf, sizeof(buf));
end;

IdSslFree(sslClient);
closesocket(ClientSocket);
if ctxClient <> nil then IdSslCtxFree(ctxClient);
WSACleanup; //结束对WSocket32.dll调用
Button1.Enabled := True;
end;

完整代码下载地址:http://www.138soft.com/download/ssldemo_client.rar

四:SSL服务端编程实例

服务端没有什么好讲的,跟客户端不同的地方,在于初始化时需要加载证书,然后Accept后需要再用IdSslAccept关联.关于如何用Delphi生成证书文件,详见下一讲.下面直接贴代码:

var
Form1: TForm1;
g_Wsa: TWSAData;
g_ServerSocketMain: TSocket = INVALID_SOCKET;
g_ctxServer: PSSL_CTX = nil; //SSL上下文
g_methServer: PSSL_METHOD = nil;
g_DebugCritSec: TRTLCriticalSection;
g_hAcceptThread: THandle = 0;
g_Start: BOOL = False;

implementation

{$R *.dfm}

function AcceptThread(lp: Pointer): DWORD; stdcall;
var
nAddrLen: integer;
sdClient: TSocket;
sAddrs: TSockAddr;
nErrorCode: integer;
sslServer: PSSL;
pClient_Cert: PX509;
pStr: Pchar;
nRet: integer;
buf: array[0..4095] of Char;
strBody, strSend: string;
begin
Result := 0;

while g_Start do
begin
nAddrLen := sizeof(TSockAddr);
sdClient := accept(g_ServerSocketMain, @sAddrs, @nAddrLen);
if (sdClient = INVALID_SOCKET) then
begin
nErrorCode := WSAGetLastError;
EnterCriticalSection(g_DebugCritSec);
if g_Start then Form1.Memo1.Lines.Add(Format('发生错误.错误代码:%d', [nErrorCode]));
LeaveCriticalSection(g_DebugCritSec);
end
else
begin
EnterCriticalSection(g_DebugCritSec);
Form1.Memo1.Lines.Add(Format('新连接.客户端IP:%s', [inet_ntoa(sAddrs.sin_addr)]));
LeaveCriticalSection(g_DebugCritSec);


sslServer := IdSslNew(g_ctxServer); //申请SSL会话的环境,参数就是前面我们申请的 SSL通讯方式,返回当前的SSL 连接环境的指针.
if sslServer = nil then
begin
closesocket(sdClient);
Continue;
end;

IdSslSetFd(sslServer, sdClient); //绑定读写套接字

nRet := IdSslAccept(sslServer);
if (nRet = -1) then
begin
closesocket(sdClient);
IdSslShutdown(sslServer);
IdSslFree(sslServer);
Continue;
end;

EnterCriticalSection(g_DebugCritSec);
Form1.Memo1.Lines.Add(Format('SSL连接使用的算法为:%s', [IdSSLCipherGetName(IdSSLGetCurrentCipher(sslServer))]));
LeaveCriticalSection(g_DebugCritSec);

pClient_Cert := IdSslGetPeerCertificate(sslServer);
if (pClient_Cert <> nil) then
begin
EnterCriticalSection(g_DebugCritSec);
Form1.Memo1.Lines.Add('客户端证书:');
LeaveCriticalSection(g_DebugCritSec);
pStr := IdSslX509NameOneline(IdSslX509GetSubjectName(pClient_Cert), nil, 0);
if pStr = nil then Exit;
EnterCriticalSection(g_DebugCritSec);
Form1.Memo1.Lines.Add(Format('主题: %s', [pStr]));
LeaveCriticalSection(g_DebugCritSec);
IdSslFree(pStr);
pStr := IdSslX509NameOneline(IdSslX509GetIssuerName(pClient_Cert), nil, 0);
if pStr = nil then Exit;
IdSslFree(pStr);
EnterCriticalSection(g_DebugCritSec);
Form1.Memo1.Lines.Add(Format('发行者: %s', [pStr]));
LeaveCriticalSection(g_DebugCritSec);
IdSslFree(pStr);
IdSslFree(pClient_Cert);
end
else
begin
EnterCriticalSection(g_DebugCritSec);
Form1.Memo1.Lines.Add('客户端没有证书.');
LeaveCriticalSection(g_DebugCritSec);
end;


FillChar(buf, sizeof(buf), #0);
nRet := IdSslRead(sslServer, buf, sizeof(buf));
if nRet <= 0 then
begin
closesocket(sdClient);
sdClient := INVALID_SOCKET;
IdSslShutdown(sslServer);
IdSslFree(sslServer);
sslServer := nil;
end
else
begin
EnterCriticalSection(g_DebugCritSec);
Form1.Memo1.Lines.Add('客户端发送请求:'#$D#$A + StrPas(buf));
LeaveCriticalSection(g_DebugCritSec);
end;

strBody := 'Your IP is:' + inet_ntoa(sAddrs.sin_addr);

strSend := 'HTTP/1.1 200 OK'#$D#$A +
'Content-Length: ' + IntToStr(Length(strBody)) + #$D#$A +
'Content-Type: text/html'#$D#$A#$D#$A + strBody;

IdSslWrite(sslServer, @strSend[1], Length(strSend));

closesocket(sdClient);
IdSslShutdown(sslServer);
IdSslFree(sslServer);
end;
end;
g_hAcceptThread := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
sAddr: TSockAddr;
dwThreadID: DWORD;
begin
Button1.Enabled := False;

//Create a socket
g_ServerSocketMain := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if g_ServerSocketMain = INVALID_SOCKET then
begin
MessageBox(0, '创建Socket失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Application.Terminate;
Exit;
end;

//Bind Port
FillChar(sAddr, Sizeof(TSockAddr), #0);
sAddr.sin_family := AF_INET;
sAddr.sin_port := htons(StrToIntDef(Trim(Edit1.Text), 443));
sAddr.sin_addr.S_addr := INADDR_ANY;

if Bind(g_ServerSocketMain, sAddr, Sizeof(TSockAddr)) = SOCKET_ERROR then
begin
MessageBox(0, '绑定端口失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Application.Terminate;
Exit;
end;

//listen
if listen(g_ServerSocketMain, SOMAXCONN) = SOCKET_ERROR then
begin
MessageBox(0, '监听端口失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Application.Terminate;
Exit;
end;
g_Start := TRUE;
g_hAcceptThread := CreateThread(nil, 0, @AcceptThread, nil, 0, dwThreadId);
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
g_Start := FALSE;
if g_ServerSocketMain <> INVALID_SOCKET then
begin
closesocket(g_ServerSocketMain);
g_ServerSocketMain := INVALID_SOCKET;
end;

if (g_hAcceptThread <> 0) then
begin
WaitForSingleObject(g_hAcceptThread, INFINITE);
CloseHandle(g_hAcceptThread);
g_hAcceptThread := 0;
end;
end;

initialization

if WSAStartup($101, g_Wsa) <> 0 then //初始化Wsock32.dll,2.2版本可以使用MakeWord(2,2),
begin
MessageBox(0, '初始化Winsock动态库失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

if not Load then //装载ssl库失败
begin
MessageBox(0, '装载ssl动态库失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;
IdSslLoadErrorStrings;
IdSslAddSslAlgorithms; //load所有的SSL算法.

//========================== 初始化SSL Server ================================
g_methServer := IdSslMethodV23; //建立SSL所用的method.
if g_methServer = nil then
begin
MessageBox(0, '建立SSL Server所用的method失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;
g_ctxServer := IdSslCtxNew(g_methServer); //初始化上下文情景.
if g_ctxServer = nil then //创建SSL_CTX失败
begin
MessageBox(0, '创建服务端SSL_CTX失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;

if IdSslCtxUseCertificateFile(g_ctxServer, Pchar(ExtractFilePath(GetModuleName(HInstance)) + 'UserCert.pem'), OPENSSL_SSL_FILETYPE_PEM) <= 0 then //加载证书失败
begin
MessageBox(0, '加载证书失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;
if IdSslCtxUsePrivateKeyFile(g_ctxServer, Pchar(ExtractFilePath(GetModuleName(HInstance)) + 'UserKey.pem'), OPENSSL_SSL_FILETYPE_PEM) <= 0 then //加载私钥失败
begin
MessageBox(0, '加载私钥失败!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;
if not IdSslCtxCheckPrivateKeyFile(g_ctxServer) = 0 then //密钥证书不匹配
begin
MessageBox(0, '密钥和证书不匹配!', '错误', MB_ICONEXCLAMATION + MB_TOPMOST);
Halt;
end;
InitializeCriticalSection(g_DebugCritSec);
finalization
if g_ctxServer <> nil then IdSslCtxFree(g_ctxServer);
DeleteCriticalSection(g_DebugCritSec);
WSACleanup; //结束对WSocket32.dll调用
end.


完整代码下载地址:http://www.138soft.com/download/ssldemo_server.rar

实际上,稍微用心的人结合第一讲的客户端例子,已经可以写出中间人欺骗程序了.


ssldemo_client.rar

Posted in 软件开发 at March 31, 2008. by 傻猫 .    Views: 10039    No Comments

《神探狄仁杰3》经典语录大全

《神探狄仁杰3》由两个故事组成。

第一个故事《凉州案--黑衣社》讲述唐代西北大漠之中押运饷银的3000铁甲军都中了邪毒,他们押运的3000万两饷银,也不翼而飞。案情发生,狄公及时赶到,一场破获‘死亡之神’和‘地狱行动’的精彩战斗打响了。最终,真正的匪首小桃和薇儿束手就擒。

 第二个故事《邗沟案》讲述一年之内,江淮盐铁转运使官船在邗沟覆没了十多次,数百万石食盐损折,船毁人亡!武则天急召狄仁杰追查邗沟覆船大案。经过艰苦的调查和推断,所谓的邗沟覆船案,乃是江湖巨恶铁手团纠集官府及绿林各道联手策划的巨大阴谋。他们人为地造成淮北盐荒,独霸淮北盐市,牟取暴利。狄公在卧虎庄会战,识破阴谋,解决盐荒。”

 46u5ke0f0boc0003.jpg
《神探狄仁杰3》剧照。

这里面,一定有一个重大的阴谋!

恩师,学生还有一点想向您请教

这点现在还不能确定

一语中的

我有一种隐隐的感觉

真的是你

大人真乃神人也 

您是怎么知道的? 

这里的水很深啊!

总有一天会真像大白的

恩师,果然跟你推断的一样!!

那么我们可以做这样一个假设``````

大人,不好啦!
噢?

这当中定有蹊跷!

原来是这样......

捣扰了

我终于明白了~ 

难道做好人就这么困难吗??????

吃饱了撑的人不少啊! 

事情应该是这样的

果然和我想的分毫不差!

为了达成其不可告人的目的

我知道的,原比你们想象的还要多

Posted in 休闲娱乐 at March 31, 2008. by 傻猫 .    Views: 3538    No Comments

傻猫的房奴生活从今天开始

星期五下午我在房管局网站上看到水岸华庭二期要开盘了,于是给售楼小姐发了一个短信,问一下情况得到证实,另外售姐给我说房已经下来了,叫我星期一去拿,我说周一没空啊,我一会就过来拿,于是马上打了一个出租车,赶到售楼部去拿卡,快下班了,路上堵车,到售楼部都快6点咯,她们都要下班了,拿到银行卡,按揭合同,购房合同还有合同附件,看了一下,按揭在商业银行办的,还是一个张金卡,哈哈,原来传说中的房奴还是金卡呀。

一系列的麻烦事终于完了,户口本办好了,银行贷款也办好了,终于轻了一口气,忙活了快一个月,终于搞定了,没拿到卡时,心里总是七上八下的,给开发商交了那么多钱,现在只有一张收据,随便谁也会担心啊,现在好了,一切都过去了,就等着收房了,哈哈哈,一切辛辛苦苦的付出终于看到回报,现在开始供房了,每月1510,供20年,现在最大的愿望就是早日还清银行贷款,洗脱房奴身份,加油啊。

昨天下午走路去塔子山公园玩了一下午,虽然刚下过雨,还是有不少游人在里边玩,公园里放了很多花,有郁金香花,还有牡丹花,满漂亮的,上几图图给大家看看吧。

 


dsc06190.jpg

dsc06203.jpg

dsc06205.jpg

dsc06208.jpg

dsc06210.jpg

dsc06220.jpg

dsc06178.jpg

Posted in 我的生活 at March 30, 2008. by 傻猫 .    Views: 5494    6 Comments

别了,陈水扁!

    5月20日,如果没有意外,陈水扁将搬出“总统府”。在那里,他已经待了近八年。 八年,台湾这片已经充分民主,但又属于非常态民主的土地,发生了太多的事情。

  他并不甘(或许是不敢)放下手中的权力。3月19日,在重返2004年枪击案现场时,他说,他不会交棒给一个“绿卡总统”,但第二天旋即改口。美国的施压、民主体制时间一到就得走人的游戏规则,让他无法恋栈。

  “总统府”前不远处就是凯达格兰大道。这里一头连着位于中山南路的前国民党中央党部,一头连着原名“介寿馆”的“总统府”,它本是国民党连接两大权力枢纽、使党政合二为一的最短直线距离。但自从2000年以来,两大枢纽相继易手,“总统府”被陈水扁入住;为了显示彻底的“洗心革面”,2005年马英九担任党主席后,国民党中央党部已被挪出来作为公益场所。

  而凯达格兰,也从权力的通途,变为国民党人多次示威、集会的广场。街头政治,对于洋装革履、久居庙堂的国民党人是陌生的。在李登辉下台前,黑金与政治的共生结构,使他们习惯于密室内的私相授受,而非票箱检验;长期掌握政权,也使他们不知道怎样与选民打交道。

  国民党在很多地方需要向对手学习,最好的老师就是陈水扁。以三级佃农之子的苦出身,陈水扁凡事皆力争第一,1970年以第一名考入台大法律系,又以第一名从该系毕业;他曾是全台最年轻的律师,在“立委”期间,也被媒体评比问政绩效第一名;担任台北市长,又获评全台县市长第一。

  在身份上,他不仅代表着台湾人“出头天”的形象,更在于他善于选战,以凌厉的攻势、极富煽动的语言和出其不意的策略,响应选民的内心激情。

  他出身律师,工于计算,一切以胜选为目的,以至能在2000年成为民进党第一个吃到“总统”大位螃蟹的人。

  民进党教会国民党怎么运用民主选举法则。在凯达格兰,国民党人慢慢学会了怎样动员百姓,怎样使民众发声,并且使“总统府”内的那个人听到。2004年大选后,不满于选情被两颗子弹改变,连战、宋楚瑜率泛蓝民众聚集抗议,使美国多日不敢贸然发贺电恭贺陈水扁再次当选,亦使陈水扁躲在府内数日噤声。

  而习惯在街头横冲直撞、穿着草鞋的民进党人,这八年来也换上西装,开始学习做“在朝者”。但这些年来,他们从不忘草根政党的激情政治。陈水扁不忘他擅长调动民众的拿手好戏,族群牌、悲情牌屡屡打出,这是他制胜的法宝。凯达格兰,依然是民进党人的根据地。朝野不在议事厅上解决问题,而常常在街头拼人气、争高下。

  这八年,乃是民进党与国民党的近身巷战肉搏,朝野的冲突不断。

  3月23日,2008“总统”当选人马英九在面对采访时,不小心把“上任之前”讲成“如果我当选‘总统’”,不过他立即反应过来,“喔!不,我即将是‘总统’了。”

  相比马英九的反应敏捷,有论者认为,陈水扁从来没有从“总统”候选人转型为“国家领导人”。他依然习惯于以选举思维治政。

  而这,正是八年以来台湾朝野冲突的一条主要根源。 

“总统府”内的权力囚徒

  2000年,陈水扁上台之初,台湾民众曾以70%以上的支持率,期待他在施政上大有作为。他起用国民党籍人士唐飞做“行政院长”,也未尝不显示政治谦卑和朝野共治的努力。“新中间路线”也一度是他所心仪的。

  但一位北京的台湾问题专家认为,2000年的民进党并不具备执政能力,完全是因为国民党分裂,鹬蚌相争渔翁得利。实际上民进党当时没有做好执政的准备,也不具备全面执政的能力,仓促中就上阵了。

  的确,好景不长,核四风波、以及来自党内深绿团体的掣肘,加之党外批评声的刺激,他越来越回复民进党基本路线。他本是泥地里长大、权力来得太快的孩子,有着政治青春期的逆反心理。

  而当年蒋介石、蒋经国威权时代的宪政体制,规定了“总统”享有无上而广泛的权力。虽然在由威权转为民主的过程中,引入了反对党竞争机制和选举机制,但“超级总统”依然于法可依。几年下来,国民党逐渐扩张“立法院”优势,然而“总统”的行政主导权仍旧无远弗届,奈何不得。

  从派系林立的民进党杀出重围的陈水扁,早已熟稔如何运用和支配权力。在其治下,光“行政院长”,就从唐飞、张俊雄、游锡堃、谢长廷、苏贞昌再到张俊雄换了六任,其他官员更是更迭频繁。至于党内,谢长廷、游锡堃、苏贞昌等“天王”都一一掌控过党机器,他本人更是每到紧急关头,几度兼任,实行党政合一。

  他享受着超级权力带来的快感。“美丽岛受刑人”世代早已主动或被动出走,以阿扁领头的“美丽岛辩护律师群”全面掌权。三位党主席,许信良发表“同志们,我们在此分手,因为我要继续向前走”公开信,宣布脱党;施明德因路线与扁不一,主动退党;林义雄在把阿扁扶上马后,亦不管身后之事。民进党如陈文茜所言,由所谓革命理想家年代进入庸俗政客时代,又如沈君山所言,“社会在经历一场革命时,播种者和最后的收割者往往不是同一批人;两者也许在激烈的革命过程当中偶然交错、重叠,但随后,播种者上断头台,收割者俯身拾起稻穗。”

  陈水扁是那个最大的收割者。但他在权力平衡上应付自如,恰恰反映出其施政机制的失灵。朝野恶斗,使得很多民生法案被耽搁,频繁地更换行政首长,又使得很多政事难以为继。

  一位台湾专家称,陈水扁民主素养不足,仿佛明末李自成,坐上了江山很快就腐化。把民主理解成这种轮流坐庄,完全违背了民主政治的理念和基本价值。

  最要命的,是民进党快速掌权后的加速腐化。不仅频出王世坚、杜正胜、谢志伟这类的政坛“活宝”,破坏政治伦理,且民进党长期纵容这些人呆在位置上;另外,贪腐当道,更成为“扁政府”给外界的主要观感。2005年以来,陈水扁家族爆发系列弊案:扁婿赵建铭涉及台开内线交易案,扁妻涉及太平洋SOGO股权案,阿扁本人也涉及“国务机要案”,台湾“第一家庭”俨然变成掘金大户。

  虽然“深绿”还可以互相抱着取暖,虽然被基本教义绑架的人群还会“含泪投票”,但丧失创党“亲民、爱乡土”理念的民进党,已经在几次选举中被泛绿和中间选民抛弃。2005年年底全台县市长选举,民进党大败;今年元月“立委”选举,国民党斩获81席,民进党仅获27席,泛蓝掌握罢免“总统”、修“宪”之权;此次“总统”大选,谢长廷大输马英九221万票,照著名政论家胡忠信的话来说,民进党几乎“输到脱裤”。

  据台湾民调显示,此次大选,四成九以上民众认为陈水扁应为民进党败选负最大责任。台湾《联合报》就指出,“这早已超越选战技术层次等问题。……个性温和的台湾人让政治天平一面倒向国民党倾斜,恐怕只有一个结构性因素可以解释——民众要惩罚陈水扁。”

  在台北大学的江岷钦教授看来,“身为台湾之子,他没有为台湾民众谋求更多的经济民生利益,只是为了民进党的私利,采取封锁政策,让台湾人民生活,平均所得停滞不前。也正因如此,台湾的民众这次用选票选择了改变。”

  多年来,陈水扁一度无人敢于拂其锋,即便明知他已成票房毒药,但民进党天王们从来不敢大胆与其切割,因为他们是一荣俱荣、一损俱损的共生结构。

  只有他昔日的战友施明德站出来,指出他是叛党者。

  2006年9月9日,施明德发动百万人齐集凯达格兰大道,以柔性力量展开“围城之战”,仿《圣经·约书亚记》“七日倾城”故事,包围“总统府”。

  站在这个“荣耀我也羞辱我的广场”,施明德对陈水扁喊话:“从‘总统府’中警车开道,浩浩荡荡驶过广场的人啊!你也可以站到广场中央,叫一次自己的名字,再叫一次!再一次!鸡鸣以前,你可以叫三次。”在《民主进步党还是民主退步党》日记中,他说:“我可以坦坦荡荡地告诉阿扁以及民进党内的昔日战友们,我准备发起一百万的台湾人民静坐‘总统府’前,请阿扁下台,因为他已经不适任‘总统’。我将运用的战术,就是我们当年对抗国民党的战术……我将试探你们‘巩固领导中心’多年后是否已经弓马废弛,武艺荒疏?我将逼问你们,民主进步党还是民主进步党吗?在民进党即将失去昔日骁勇的此刻,……我将号召民进党内残存的党魂。我愿意事先提醒你们,我昔日的同志们,你们必须脱下西装应战。”

  倒扁不成后自囚的施明德说:“坐在‘总统府’里的那个(陈水扁)是囚犯,自囚在房里的那个(施明德)获得了自由。” 

  在坚果壳里做王

  台北市的城市布局,以忠孝路、仁义路、民权路为主干,另一大特色就是,中国没有哪个地方,会像它一样,拥有那么多以各省份或城市名字命名的道路。当年,蒋介石“勿忘在莒”,以所谓“复国”为后半生要务。虽偏居一隅,面对“湖南”、“陕西”等路,依然有坐拥天下之感。

  而这几年来,不停制造政治纷争、个性逞强的陈水扁,待在“总统府”内,与蒋介石一样,正应了《哈姆雷特》中所说的:“即便我困在坚果壳里,我仍以为自己是无限空间的国王。”

  阿扁是反蒋的。2005年初“终统”后,他改“介寿馆”为“总统府”,而早在1994年台北市长任上第一年,他就改“介寿路”为凯达格兰大道。

  与蒋介石一样,他拥有重新命名的权力。

  撤除“大中至正”匾额,改“中正纪念堂”为“台湾民主纪念馆”,并且在堂内饰满野百合,引发蓝绿冲突,连“野百合学运世代”也发动静坐,认为他玷污了野百合精神;他向军方持续施压,撤两蒋陵寝卫兵;大面积拆除、销毁蒋介石铜像,乃至“经国号”战机亦被改为“雄鹰”,桃园中正机场改为台湾桃园机场;“国军”改称“国防军”;在去蒋化运动的鼓噪下,蒋介石官邸“草山行馆”遭焚毁……

  “去中国化”运动中,“中华邮政”改为“台湾邮政”,以致某些邮路不通;将“中”字头公司一律改为“台”字头公司,以致某些公司长年累积的品牌效应大打折扣;改历史教科书,使“国父”孙中山变成“外国人”;他逢“中”必反,以至蓝营“立委”沈智能质疑,其子陈致中是否要改叫“陈致台”?

  每当外界关注其弊案或施政无力时,就有政治争议话题被抛出,以转移目标;每逢声势下挫,他即用“中国人”和“台湾人”来划分族群,强化本土本位主义。

  “当所有进步价值都消失了,‘本土牌’变成扁惟一护身符。”“大陆新娘、外籍配偶,都在这样的敌我分辨下被排除了,民进党成为狭隘的闽南沙文主义政党。”台湾《联合报》如此评论。

  而陈水扁的道路更渐趋狭窄。此次“大选”,谢苏大输马萧221万票,虽然显示绿营基本盘还在,但抹红、打大陆威胁牌已然失效,绿营仅守住高雄县、屏东县、台南县等5县市。以至于有观察人士称,陈水扁固然曾有过不少分裂族群言行,但他8年的糟糕政绩,又掩盖了族群裂痕,以至出现绿转蓝。

  而曾经有助选天王之称的陈水扁,经2008年,被证明已真正跛脚。谢长廷避其唯恐不及,他只能在3月10日,回到他的故乡台南县,用苦行的方式“走出台湾的前途”。

  他常常声称帮台湾人背着十字架,但他的身后,已经追随者日稀。

  回顾其8年执政,北京一位台湾专家认为:尽管距离人民期望很远,但陈水扁不是一点事情没做。比如小三通、春节包机。但后来又变了。越接近选举越倒退,缩回去了。

  此专家也指出,陈水扁对人权、法治精神还是有所坚持。台独基本教义派甚至想定这样一种法律,限制外省出生的人选总统。但陈水扁说这不是民主。对白色恐怖期受迫害的人给予赔偿,包括“二二八”事件,陈水扁是做了一些事情的。

  “这次选举的最大意义,就是告别陈水扁时代——将价值的错乱,将粗鄙的言行,将不能饮水思源的、国际眼光缺乏的、封锁政策的、意识形态的陈水扁隔绝在历史的记录里面。”江岷钦教授说,“他变成了一段历史,这8年的历史里,他的名字永远存在。”

  3月22日,沉默的一夜。陈水扁没有出来面对媒体。而外界却很热闹,待他卸任后,将面临“最高检”重启“国务机要费用案”庭讯。丧失刑事豁免权的他,将去往何方?

  没人能够肯定地判断他的去处。

  去年,他在高雄花费3600万新台币购置“皇苑人文首玺”豪宅。那处豪宅的门牌号,正是228。他是否依然要把自己的后半生,用“二二八事件”的悲情所包裹,才有了安全感?“人文首玺”豪宅附近有左营军港海军航空基地、寿山军区、装甲部队和空防部队,一旦紧急,他从家中密道直通顶楼只需30秒钟,并可搭乘MID500反潜机至左营军港或寿山军区逃命。

  但从法理上来看,他有可能会入狱。

Posted in 休闲娱乐 at March 28, 2008. by 傻猫 .    Views: 2552    No Comments

成都万科比周边楼盘房价平均高34.4%

 

  成都比周边楼盘房价平均高34.4%

  成都是万科在京沪深穗四大一线城市之外,“降价”风所刮到的重点二三线城市之一。与其他城市不同,成都万科主要是针对青年置业进行优惠。实际上参与万科“08青年置业计划”的成都楼盘比周边楼盘房价平均高出34.4%。

  2008年1月,万科成都全线降价被各大媒体“揭批”。尤其是位于成都蜀都大道上的万科魅力之城(查看地图)四期的电梯房,被爆料售楼处的报价4500-4600元/平方米,远远低于2007年12月前的6000元/平方米以上的价格,两个月中,同一单元楼中住宅的降幅接近30%。

  首付款的“区域”优势

  针对高达30%的降幅,万科魅力之城销售人员告诉记者,所谓总起价4500-4600元/平方米的房源,是一次性付款加上当时所有的优惠,套数不多,并不是每位买房人都能享受得到,该活动2月5日已经结束,目前楼盘均价为5000-6000多元/平方米。

  万科魅力之城此次优惠活动被称为成都万科“08青年置业计划”。万科目前在成都的版图上有万科金域西岭(查看地图)、万科魅力之城、万科金域蓝湾(查看地图)、万科朗润园(查看地图)、万科双水岸(查看地图)5个在售楼盘。据介绍,“青年置业计划”是成都万科自去年12月30日和5家银行合作推出的一个置业计划,截止时间是2月5日,凡符合条件并在其开发的万科魅力之城、朗润园等5个项目购房的首次购房人,可由万科向银行“担保”,确保能办理下只需要交两成首付款、贷款利率下浮15%的房贷,且房贷手续由万科协助办理。实际上,根据央行有关规定,凡是符合条件的首次购房人,即便不用万科“担保”,按照规定,同样能申请两成首付并享受贷款利率下浮15%的优惠利率房贷。

  带着疑问,记者对万科金域西岭周边的楼盘熙城国际(查看地图)、西锦国际(查看地图),万科魅力之城周边的FM365(查看地图)、水岸雅居(查看地图),万科金域蓝湾周边的龙湖三千里(查看地图)、蜜城等近10个楼盘进行调查了解得知,在成都,房贷趋紧的政策下发后,购房人申请房贷条件日益“苛刻”,很多楼盘即便是符合条件的首次购房人,也只能申请到三成的首付,利率也不一定能享受到下浮15%的优惠。而参加成都万科的“青年置业计划”,不仅可以确保符合条件的首次购房人能成功申请到两成首付、享受15%利率优惠,还能获赠2万元的置业基金。

  个案楼盘销售利润率达55%

  在对万科项目周边近10个楼盘调查后,《楼市》记者还发现,万科在售楼盘房价普遍高于周边楼盘。如,万科金域西岭目前均价为8200元/平方米,而周边楼盘熙城国际售价为6700元/平方米 ;西锦国际紧追万科魅力之城,均价为8000元/平方米;而优派的均价仅4300元/平方米;万科朗润园起价5260元/平方米,而与其同处温江区的尚西花郡(查看地图)均价为4800元/平方米;春江青龙湾均价则为3200元/平方米。

  “万科为房产行业龙头老大,不论是品牌影响力还是楼盘品质,进入成都这样的二线城市,在买房人的心目中都较有威信,因此,售价也相对较高”,熙城国际销售人员坦言。

  综合比较万科成都5大在售楼盘与周边楼盘,万科楼盘比周边楼盘房价平均高34.4%。由于定价较高,万科在成都的销售利润率也较高,一位不愿意透露姓名的成都业内人士向《楼市》记者透露,万科金域蓝湾土地成本约为1360元/平方米,加上建安成本以及其他费用,其销售利润率也会达到55%左右。而万科金域西岭土地成本为2295元/平方米,由于此楼盘为万科在成都建设的第一个精装修楼盘,即使含装修成本,销售利润率也会达到20%以上。

  万科“降价”背后的得与失

  正值万科在京沪深穗等城市的“降价”行动如火如荼开展之时,2月28日,万科发布公告称,在去年公开增发近100亿元的专项募集资金中,将有9.8亿元暂时不会投入到房地产开发的项目上,而是在今年8月27日前转用于补充流动资金。

  优惠促销楼盘与补充流动资金遥相呼应,万科是否出现了现金流紧张?万科降价的真正动机当仁不让成为业内探讨的热门话题。

  综合记者采访的多位业内专家及开发商观点,业内关于万科降价的观点有以下六个主要方面:一,万科发展模式和赢利模式的战略调整,万科由此前高定价的经营价值最大化向规模效益最大化转移。二,面对近期宏观调控压力,万科讨巧政府,获得好名声之时以争取日后获取保障性住房用地的有利条件。三,在房地产低迷时期降价销售以带给行业尤其是中小开发商压力,借此时机实现规模化扩张。四,在国家货币紧缩、打击囤地的大势下,加快开发速度和资金运转速度以快速回笼资金。五,在买房人观望情绪蔓延的楼市低迷期,赚得眼球效应并刺激市场购买欲。六,在王石(王石博客,王石新闻,王石说吧)“拐点”论的指引下,借机销售非优质房源以降低风险。

  万科在公开回应“降价”事件的发言中,一再强调,并非降价,只是营销。本文对五大城市的调查结果中,一个又一个关于销售利润率以及房价上涨的数据足以证明优惠打折之损失或许相对于其利润而言仅是九牛一毛。

  然而万科却得到了很多,一方面在上海、成都等地打折促销回笼资金,一方面将这些城市的土地再次揽入囊中。难怪业内人士感慨,万科看来并非不看好这些城市的市场前景而降价,否则何来动力,仅1月份就耗资29.94亿元连获4块土地。

  快速拿地、快速开发、降价回笼资金还贷款,再滚动开发,跑步前进,万科才有可能完成十年规划中1000亿销售额的目标。公开数据显示,万科在2003年、2004年及2006年获取项目的平均楼面地价,分别为1078元/平方米、1126元/平方米和1861元/平方米,而在之前的主要收购中,平均楼面成本仅910元/平方米。在合适时机、选择合适的对象更多地通过资源整合方式获取项目资源或许也是“降价”事件中万科所能得到的对其最有利的方面之一。

文章来源:http://cd.focus.cn/news/2008-03-26/447458.html

Posted in 杂七杂八 at March 26, 2008. by 傻猫 .    Views: 3073    No Comments

怎样做一个更有魅力的人

第一,以诚待人,以责人之心责己、以恕己之心恕人。对别人要抱着诚挚、宽容的心去相处,自己要抱着自我批评、愿意修改的胸怀来自省。与人交往的过程中,你怎样对待别人,别人就会怎样对待你。就像照镜子一样,你的表情和态度,可以由他人对你的表情和态度上一览无遗。你若以诚待人,别人也会以诚待你。你若敌视别人,别人也会敌视你。最真挚的友情和最难解的仇恨都是由这“反射”原理逐步造成的。因此,你想修正别人时,应该先修正你自己;你想别人以怎样的态度对待你,你就需要怎么对待别人;你想他人理解你,你要先理解他人。

第二,培养真正的友情。如果你能做到第一点,很多大学时的朋友会成为你一辈子的好朋友或知己,一起求学和寻求自身发展的路上,这段友谊弥足珍贵。不要只去找像你的人或附和你的人做朋友。良友有很多种:乐观的朋友、有智慧的朋友、脚踏实地的朋友、幽默有趣的朋友、激励你上进的朋友、提升你能力的朋友、帮你了解自己的朋友、对你说实话的朋友。大学时谈恋爱可以教你如何照顾别人,增进同理心和自控,但是一切随缘,不要为了谈恋爱而谈恋爱。

第三,学习团队精神和沟通能力。社团是微观的社会,参与社团是步入社会前最好的磨练。在社团中,可以培养团队合作的能力和领导才能,也可以发挥你专业知识。但是更重要的是做一个诚心诚意的服务者和志愿者,或者在担任学生工作时主动地承担沟通同学和老师之间的桥梁,锻炼自己的沟通能力、服务同学和老师,这些经验都很宝贵。这个学习过程也不会轻松,挫折是肯定的,但是不用灰心,大学社团里的人际交往学习是不用“付学费”的,错了可以重头来过。

第四,从周围的人身上学习。在班级里、社团中,多观察周围的同学,特别是那些你觉得交往能力和沟通能力强的,看他们是如何与人相处的,比如,如何处理交往中的冲突、如何说服他人和影响他人、如何发挥自己的合作和协调能力,甚至如何表达对他人的尊重和真诚、怎样表达赞成或者不同意,怎样不冒犯他人又充分体现自己的个性……渐渐地你会发现,注意与人交往的方法对你的人际关系也能起到意想不到的效果。每一个朋友都可以成为你的良师。观察你的每一个朋友,看看他们值得学习的地方,无论是热心、幽默、机智、博学、正直、沟通、礼貌,以他们做模范。同时,慷慨地帮助你的每一个朋友,做他们的良师和模范。

第五,培养自身的魅力。如果有些学生觉得自己没有什么特长和爱好成为自己人际交往能力提高的一个很大障碍,那么可以去选择和培养一些兴趣爱好,共同的兴趣和爱好也是与朋友建立深厚和持久感情的途径之一。很多在事业上有所建树的人并不只是会闭门读书,他们大多都会有自己的业余兴趣和爱好。我在微软亚洲研究院的同事大多都有嗜好和特长,比如绘画、桥牌、体育运动等等,不一而足。业余爱好不仅是人际交往的一种方式,还可以让自己发掘自己读书以外的能力。体育锻炼可以发挥你潜在的能力,而且很多体育项目还可以培养你和其他同学的团队合作精神。如果真的没有什么兴趣爱好,多读些好书,或者自己感兴趣的书,丰富自己的知识、帮助自己思考,因为没有什么比智慧和渊博更能增添一个人的魅力。

文章来源: 开复学生网

Posted in 我的生活 at March 20, 2008. by 傻猫 .    Views: 2679    No Comments

SQL Server Data Access Components (SDAC) v4.30(带源码)

SQL Server Data Access Components (SDAC) 是一组存取SQL Server数据库的非可视控件,今天在盒子上看到这个控件,发行版本居然都V4.3了,怎么以前没有听说过呢,据说这个比ADO效率要高很多,我还没试过,只是据说,今天装上了,已经是破解版,带源码的,先学习一下。

下载地址:Delphi盒子网站

SQL Server Data Access Components Overview

SQL Server Data Access Components (SDAC) is a library of components that provides access to Microsoft SQL Server databases. SDAC connects to SQL Server directly through OLE DB, which is a native SQL Server interface. The SDAC library is designed to help programmers develop faster and cleaner SQL Server database applications.

SDAC is a complete replacement for standard SQL Server connectivity solutions and presents an efficient alternative to the Borland Database Engine for access to SQL Server.


Related Products


Advantages of SDAC Technology

SDAC is a direct connectivity database wrapper built specifically for the SQL Server server. SDAC offers wide coverage of the SQL Server feature set and emphasizes optimized data access strategies.


Wide Coverage of SQL Server Features
By providing access to the most advanced database functionality, SDAC allows developers to harness the full capabilities of the SQL Server and optimize their database applications. SDAC provides complete support of working with SQL Server 2005 Compact Edition, Service Broker technology, the IRowsetFastLoad interface, working with metadata information, and MARS.

    SDAC Palette

Optimized Code
The goal of SDAC is to enable developers to write efficient and flexible database applications. The SDAC library is implemented using advanced data access algorithms and optimization techniques. Classes and components undergo comprehensive performance tests and are designed to help you write high-performance, lightweight data access layers.


Compatibility with Other Connectivity Methods
The SDAC interface retains compatibility with standard VCL data access components like BDE. Existing BDE-based applications can be easily migrated to SDAC and enhanced to take advantage of SQL Server-specific features. Project migration can be automated with the BDE/ADO Migration Wizard.


 

How Does SDAC Work?

SDAC allows you to connect to SQL Server through OLE DB, which is the lowest documented SQL Server interface.

SDAC connects through OLE DB through a set of COM-based interfaces. SDAC is designed to be lightweight and consists of a minimal layer between your code and SQL Server databases.

In comparison, the Borland Database Engine (BDE) uses several layers to access SQL Server, and requires additional data access software to be installed on client machines.

The BDE data transfer protocol is shown below.


BDE Connection Protocol

BDE Connection Protocol

SDAC allows you to avoid using BDE and DBLibrary.


SDAC Connection Flow

SDAC Connection Flow

Components

All editions of SDAC include the following basic components:

  • TMSConnection - lets you set up and control connections to SQL Server
  • TMSQuery - queries execution, operates record set, flexible way updating database tables
  • TMSTable - lets you retrieve and update data in a single table without writing SQL statements
  • TMSStoredProc - executes stored procedures and functions
  • TMSSQL - executes SQL statements and stored procedures, which do not return rowsets
  • TMSScript - executes sequences of SQL statements
  • TMSUpdateSQL - lets you tune update operations for a DataSet component
  • TMSDataSource - provides an interface between a SDAC dataset components and data-aware controls on a form
  • TMSSQLMonitor - allows to monitor dynamic SQL executing in SDAC based applications
  • TMSConnectDialog - allows you to build custom prompts for usernames, passwords, and servers
  • TVirtualTable - dataset stores data in memory
  • MSDataAdapter - .NET component, uses TDataSet as data source for retrieving and saving data to System.Data.DataSet

SDAC Professional Edition includes the following additional components:

  • TMSLoader - allows you to quickly load data into SQL Server databases
  • TMSDump - serves to store a database or its parts as a script and also to restore database from received script
  • TMSServiceBroker - lets you work with Service Broker technology to send and receive messages
  • TMSMetaData - allows to retrieve embracing metadata on specified SQL object
  • TMSChangeNotification - lets you react on different server side changes on-the-fly. Based on the Query Notifications mechanism of SQL Server 2005
  • TMSTransaction - lets you control distributed transactions via Microsoft Distributed Transaction Coordinator
  • TMSCompactConnection - lets you set up and control connections to SQL Server Compact Edition
  • TCRBatchMove - transfers data between all types of TDataSet descendants
Key Features

The following list describes the main features of SQL Server Data Access Components.

  • Direct access to server data. Does not require installation of other data provider layers (such as BDE and ODBC)
  • VCL, VCL.NET, and CLX versions of library available
  • Full support of the latest Microsoft SQL Server versions, including Express and Compact Editions
  • Support for all SQL Server data types
  • Disconnected Model with automatic connection control for working with data offline
  • Local Failover for detecting connection loss and implicitly reexecuting certain operations
  • All types of local sorting and filtering, including by calculated and lookup fields
  • Automatic data updating with TMSQuery, TMSTable, and TMSStoredProc components
  • Unicode support
  • Support for many SQL Server-specific features, such as MARS and bulk copy operations
  • Advanced script execution with TMSScript component
  • Support for using macros in SQL
  • Easy migration from BDE and ADO with Migration Wizard
  • Lets you use Professional Edition of Delphi and C++Builder to develop client/server applications
  • Includes annual SDAC Subscription with Priority Support
  • Licensed royalty-free per developer, per team, or per site


sdac.jpg

Posted in 软件开发 at March 19, 2008. by 傻猫 .    Views: 4959    No Comments

傻猫养龟日记:小龟搬新家了

起因:因为上次淘宝交易纠纷事件,与淘宝客服理论,对小二使用了不文明用语,最后导致货款全部退给买家,我的淘宝帐号还被封了,后来经过与小二协商,让我提交户口本相关信息,可以给我开通帐号,另外再补我200元淘宝先行赔付作为损失。

昨天发现支付宝多了200块钱,我就纳闷了,怎么来了?不会天上下馅饼吧,查看详细交易记录,原来淘宝的先行赔付到帐了,哇哈哈,于是又在淘宝买了点东西,去年在一个店里买了衣服,那里的款式还比较好看,由于以前交易过,我有VIP卡,可以打折的,于是再买了一件衣服和一条牛仔裤,共计金额不到150元,剩下的50元我就盘算着给小龟换一个大的房间了,晚上去沃尔玛给“大小S”买了一个大的家,45块吧,一个储物箱,塑料透明的箱子,昨天有养龟朋友说我的鱼缸太小了,说乌龟都不能活动开来,对龟龟的成长是不好的,换一个大的房子,这下舒服了吧。

回来的时候在路边拣了几个块鹅卵石,连同前天买的小石头一起放在里边,大概放了一盘水吧,昨天有朋友在群里说,水的深度最好是龟龟抬头可以自由呼吸空气,低头可以轻松潜入水底,我就是按这样放的水,把两个小仔仔放进去后,可欢喜了,来回爬呀爬呀,小s比较听话,就在水里来爬,大s顺着边沿角落,一个劲地想爬出来,这么宽敞的家你还不喜欢吗?我还特地给他们准备了石头,在储物箱里,一半是深水区,一半是浅水区,要游泳的时候可以潜入水里自由游,想休息了,可以爬到浅水区的半陆地休息,多舒服啊,哈哈哈,来看看照片吧,对了,昨天晚上还拍了视频的,也来看看吧。

 


dsc06153.jpg

dsc06155.jpg

dsc06156.jpg

dsc06157.jpg

Posted in 我的生活 at March 19, 2008. by 傻猫 .    Views: 2821    No Comments