星期日, 三月 15, 2009

自动添加WCF服务访问点

class Program { static void Main(string[] args) { ContractDescription cd = ContractDescription.GetContract(typeof(IFileDownloader)); BasicHttpBinding basicHttpBinding = new BasicHttpBinding(); basicHttpBinding.MaxReceivedMessageSize = 10067108864; basicHttpBinding.TransferMode = TransferMode.Streamed; basicHttpBinding.MessageEncoding = WSMessageEncoding.Mtom; //WSHttpBinding basicHttpBinding = new WSHttpBinding(); ServiceEndpoint endpoint = new ServiceEndpoint( cd, basicHttpBinding, new EndpointAddress("http://localhost:8889/FileTransfer/")); ContractDescription mexCd = ContractDescription.GetContract(typeof(IMetadataExchange)); ServiceEndpoint mexEndpoint = new ServiceEndpoint( mexCd, MetadataExchangeBindings.CreateMexHttpBinding(), new EndpointAddress("http://localhost:8889/FileTransfer/mex")); System.ServiceModel.ServiceHost host = new System.ServiceModel.ServiceHost(typeof(FileTransferImpl)); host.Opened += (a, b) => Console.WriteLine("Service Opened."); ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); host.Description.Behaviors.Add(smb); host.AddServiceEndpoint(endpoint.Contract.ContractType, endpoint.Binding, endpoint.Address.ToString()); host.AddServiceEndpoint(mexEndpoint.Contract.ContractType, mexEndpoint.Binding, mexEndpoint.Address.ToString()); host.Open(); foreach (ServiceEndpoint ep in host.Description.Endpoints) { Console.WriteLine(ep.Address.ToString()); } Console.ReadLine(); } }




string addressRoot = "http://localhost:8000/";

WSHttpBinding customBiding = new WSHttpBinding();
customBiding.Security.Mode = SecurityMode.Message;
customBiding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity(m_AuthConfig.DnsIdentity);

m_Host = new ServiceHost(m_RemoteManager, new Uri(addressRoot));

ServiceEndpoint endPoint = m_Host.AddServiceEndpoint(typeof(IRemoteMonitorManager), customBiding, "");
endPoint.Address = new EndpointAddress(new Uri(addressRoot), identity);

ServiceMetadataBehavior metadataBehavior;
metadataBehavior = m_Host.Description.Behaviors.Find();
if (metadataBehavior == null)
{
metadataBehavior = new ServiceMetadataBehavior();
m_Host.Description.Behaviors.Add(metadataBehavior);
}

metadataBehavior.HttpGetEnabled = true;

m_Host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "MEX");
m_Host.Description.Behaviors.Add(GetServiceCredentials());
m_Host.Open();

星期四, 十一月 29, 2007

IBM小型机的发展史

IBM 发布了第一台基于RISC(精简指令集计算机)架构的原型机。早在上世纪70年代初,基于IBM 科学家 John Cocke的发明,RISC的理念大大简化了计算机操作指令,加快系统运行速度,使得计算机性能得到大幅度提升。
1980:
  IBM 发布了第一台基于RISC(精简指令集计算机)架构的原型机。早在上世纪70年代初,基于IBM 科学家 John Cocke的发明,RISC的理念大大简化了计算机操作指令,加快系统运行速度,使得计算机性能得到大幅度提升。如今,RISC架构已经广泛应用于众多工作站和UNIX服务器系统中,并被看作是未来主流的计算架构。
1990:
  IBM 推出基于RISC系统、运行AIX V3的新产品线RS/6000(现在称为IBM eServer p系列)。该系统架构后来被称为POWER(POWER1),意为�强RISC性能优化(Performance Optimization With Enhanced RISC)架构。
1991:
  IBM和苹果、摩托罗拉公司达成一系列合作协议,内容包括:推出支持苹果 Macintosh个人电脑与IBM网络相连的全新产品;推出面向PC机和低成本工作站的RISC架构PowerPC处理器;形成一个开放的系统环境,保证IBM AIX和苹果Macintosh软件程序在两家公司设计的RISC系统中都能运行。此外,开放的系统环境包括其他一些技术协议。
1993:
  IBM 推出可升级的POWER并行系统,这是第一款采用RS/6000技术,基于微处理器的超级计算机。在该系统中,IBM 首次应用多处理器技术,可将复杂密集的任务进行分解,大大加快了计算机的运算速度,开创了业界先河。
  IBM和摩托罗拉公司推出PowerPC 601处理器,该处理器是与苹果共同开发的。PowerPC上集成280多万个晶体管,主频为50 MHz。
  IBM 发布了66 MHz 的POWER2 处理器,首先应用于RS/6000系统。
1994:
  IBM 推出可升级的POWER并行系统 2 (Scalable POWERparallel,SP2)。美国康乃尔理论研究中心配备了SP2超级计算机,运行速度高达1360亿次/秒。欧洲粒子物理学实验室(CERN)采用一款64节点、运行AIX系统的IBM SP2,速度位于欧洲前列。
  IBM 成功研发出新一代PowerPC 604处理器,其强大的处理性能在批量生产的处理器产品中处于领先地位。IBM 技术人员还推出了业内最快的"无损"数据压缩芯片,每秒钟能处理40 MB数据。7月,IBM 交付第一百万个PowerPC 601 处理器。
  IBM发布首个基于Power 架构的嵌入式控制器PowerPC 403GA。
1995:
  PowerPC64位RISC处理器开始应用于IBM AS/400 操作系统中。
  8月,苹果公司推出首款基于Power架构的笔记本电脑 PowerBook 500,它采用IBM的 PowerPC 603e 处理器。
1996:
  IBM 推出全新的32位POWER2超级芯片(P2SC),主频达135 MHz ,首先应用于RS/6000系统。基于POWER2 架构的P2SC采用了高密度CMOS技术,单个芯片上集成1500万个晶体管。
1997:
  IBM"深蓝"超级计算机在经过多局较量后,击败了国际象棋冠军Garry Kasparov。"深蓝"是一款32节点的IBM RS/6000 SP计算机,处理器采用32位P2SC,运行AIX操作系统。在比赛期间,"深蓝"的平均运算速度为每秒1亿2600万步。目前,这台超级计算机被安放在美国华盛顿特区的史密森国家博物馆内。
  IBM 为美国国家宇航局提供一款32位的PowerPC微处理器,其运算速度可达每秒3500万次,主要用于火星探测计划。经过洛克希�马丁实验室改造后,最终形成可抗辐射的RAD 6000芯片,植入火星登陆车Sojourner Rover内部的计算机系统中。
1998:
  由IBM和美国劳伦斯利弗莫尔国家实验室共同研发的"蓝色太平洋"超级计算机问世。这台计算机采用PowerPC 604处理器,主频高达332 MHz,系统包含176个节点,最高运算速度为每秒3.9万亿次(比一般台式电脑快1.5万倍),存储容量超过 2.6 TB (是普通PC机的8万倍)。"蓝色太平洋"一秒钟内的计算量相当于一个人使用计算器连续计算6万3千年的总和。
  IBM 推出世界上第一组基于铜的微处理器 PowerPC 740/750,工作频率为 400 MHz。由于使用了铜芯片技术,处理性能提高了近1/3。
  全新64位POWER3 处理器将POWER2 架构(P2SC) 与PowerPC 架构相结合,并对技术应用进行了优化。POWER3 的最高运算速度可达每秒200万次,比"深蓝"所采用的POWER2 超级芯片快出一倍多。
  IBM 公布了首个基于Power的嵌入式系统芯片(SoC)内核。不久之后,PowerPC 405 内核也将同其他IP相结合,形成嵌入式SoC微处理器和基于Power的特定应用集成电路(ASIC)解决方案。
1999:
  IBM 研究院投资1亿美金开发一种新型的Power架构超级计算机。这种名为"蓝色基因"的计算机峰值速度超过1 Peta FLOP,比当时最快的超级计算机高出500倍。它将被用来模拟复杂蛋白质的折叠。
  自正式推出铜芯片一年后,IBM 交付了第一百万个铜技术PowerPC 芯片。
  6月,IBM 发布了第一个基于405内核的系统芯片PowerPC 405GP。下半年,IBM 即推出了再下一代嵌入式PowerPC内核。
  IBM与任天堂公司共同宣布了一项价值10亿美元的技术协议,IBM将为任天堂的下一代家庭游戏机GAMECUBE提供�强版PowerPC 芯片。新产品性能将超出任何其他家庭游戏系统,为玩家呈现更佳的图像效果和更逼真的动作画面。
  IBM 勾画了一项雄心勃勃的战略——向通信行业供应芯片,首先将其芯片技术卖给Cisco Systems公司,同时采取若干步骤向那些生产制造交换机、路由器和其他通信设备的公司展示IBM在供应微处理器和其他部件方面的突出能力。
2000:
  IBM 宣布将高速PowerPC 处理器与电视机顶盒(STB)组件一起整合到一个"单芯片系统"上,从而在系统性能、价格和设计等方面为机顶盒厂商带来竞争优势。该单芯片系统拥有众多的先进应用,并能帮助三星等公司灵活应对不断变化的客户需求。
  IBM 将RS/6000更名为IBM eServer p系列。
2001:
  IBM 新一代超机计算机"ASCI White"在美国劳伦斯利弗莫尔国家实验室投入使用,运算速度高达每秒12.3万亿次,主要用于模拟核爆炸试验。作为美国国家核安全管理局 (NNSA)提高战略运算能力计划(ASCI)的组成部分,该系统强大的运算能力可以在不到1分钟时间内处理地球上每个人发出的一次互联网操作请求。
  在经过5年潜心研发后,IBM推出世界上最强大的UNIX服务器—eServer p690("Regatta")。新系统基于先进的POWER4处理器,集成了多项主机技术。由多台p690服务器连接而成的超级计算机拥有1000多个 POWER4处理器,能够完成最为复杂的运算任务。
  索尼电脑娱乐公司(SCEI)、IBM和东芝共同宣布了多项计划,为在新兴宽带时代使用的设备进行领先芯片架构的研发。产品代号为"Cell"的新的微芯片采用世界上最先进的研究技术和芯片制造技术,采用比0.10微米还小的工艺——比人的头发细1000倍。这样将制造出比IBM深蓝超级计算机还要强大,耗电很低,能够以超高速度接入宽带互联网的消费者电子设备。
2002:
  IBM 推出64位PowerPC 970处理器, 这款高性能产品可应用于普通台式机、入门级服务器等多种环境中。64位的PowerPC 970芯片基于POWER4服务器架构,采用独特的单指令多数据流(SIMD)单元,拥有超强处理性能。此外,它还采用了"Elastic I/O"内部总线结构,这是业界最快的处理器总线之一。
  IBM 推出速度更快的POWER4+ 。截至2003年,POWER4+ 已经应用于全部pSeries产品线。
  IBM 推出32路eServer iSeries 890服务器,其处理性能为 i840的两倍,采用1.3 GHz POWER4 处理器,单个芯片上集成了1亿7400万个晶体管。
  纽约州州长George Pataki和IBM董事长兼首席执行总裁Sam Palmisano联合宣布了先进的IBM 300mm半导体设备生产线的开通。这条生产线是IBM微电子业务的重要扩展,它的主要目的是通过高端芯片代工制造服务和IBM的定制和标准芯片产品,满足客户对IBM领先芯片技术不断�长的需求。
  IBM 推出嵌入式PowerPC 440GP 和PowerPC 440GX 处理器,主要运行嵌入式网络和存储应用。PowerPC 440GX拥有TCP/IP负载加速功能,在全部的5项EEMBC基准测试中得分均高于任何其它的"单芯片系统"处理器。
2003:
  IBM 宣布一个有关32位嵌入式PowerPC 内核的公开授权计划。
  IBM和苹果公司联手推出世界上第一款64位台式机处理器—PowerPC G5,工作频率达2.0 GHz。苹果公司称新的Power Mac G5电脑是"世界上最快的个人电脑"。
  IBM 宣布推出划时代的"Blue Gene/L"原型机。这款超级计算机尺寸仅相当于30英寸彩电大小,它的问世将为科学界和IT业发展带来深远影响。最终版"Blue Gene/L"超级计算机将于2005年诞生,占地面积相当于半个网球场,总共包含65536个节点(PowerPC)和64个机架,预计其峰值速度将达到360 Tera Flops。
  IBM 宣布eServer pSeries 630将采用POWER4+ 处理器。等到eServer pSeriesp615发布后,POWER4+ 已经应用于全部pSeries产品线。
  IBM 推出首款采用64位PowerPC技术的刀片服务器BladeCenter JS20,扩大了客户的选择范围,提高投资回报率,实现快速经济的计算性能扩展。
  IBM 推出全新的PowerPC 750GX。与 PowerPC 750相比,新产品的二级缓存扩大了一倍,由原先的512KB变为1MB。
2004:
  IBM宣布开发出一种制造低功耗、高性能微处理器的新方法,首次把绝缘硅(SOI)、应变硅和铜制程三种技术工艺结合在一起。64位PowerPC 970FX成为首款采用新技术生产的处理器产品,并在业内评选中荣获大奖。
  IBM 交付第4000台eServer p690服务器,该产品基于POWER 架构,是世界上最受欢迎的UNIX服务器。
  IBM宣布POWER5处理器并推出备受关注的基于POWER5处理器的第一款系统eServer i5。年底,IBM又推出了eServer p5-520和p5-550 Express。基于IBM POWER5微处理器,这些服务器为客户提供了源自大型主机的技术和性能,从而为中型公司提供适合他们预算的价格和配置。
2005:
  IBM开始大量生产IBM eServer p5-510服务器,这款服务器的设计初衷是将POWER5的性能和领先的虚拟化能力带入到入门级UNIX和Linux服务器。
  IBM首次推出四款新的UNIX系统,包括IBM System p5-550Q、p5-520、p5-550和p5-505,它们均采用新的POWER5+微处理器技术,瞄准中小企业客户。
  IBM预先展示了经过升级的高密度POWER5+ IBM p5-575超级计算机的预发布版。
2006:
  IBM System p5 595是世界上最强大的服务器,保持着每秒400万次交易的世界记录。该款服务器具有多达64个POWER5+微处理器内核,使用IBM最初为游戏机开发的Dual Stress技术。Dual Stress技术能够同时拉伸和压缩硅,这样可以提供更高的处理器性能和更高的能效。
  IBM推出8款新的IBM System p5服务器,其中包括几款基于当时最快的POWER5+处理器的服务器。另外,公司还宣布新的IBM System p5 570在16个内核的系统中创下了新的交易处理性能记录。
  道琼斯指数选择IBM System p5 570服务器作为其全球指数和平均指数,如:道琼斯工业平均指数的计算平台。
2007:
  IBM首次推出POWER6——有史以来最快的微处理器, 同时推出一款充分利用了该芯片在节能和虚拟化技术方面重大突破的新型超高性能服务器——IBM System p570。新型System p570是业界第一款同时囊括四大UNIX基准测试速度记录的服务器。
  新推出的双核POWER6处理器的速度为4.7 GHz,是其上一代POWER5处理器的2倍,但运行和散热所消耗的电能基本相同。这意味着客户可以使用新的处理器将性能提高100%或将能耗减半。POWER6处理器的速度几乎是HP服务器产品线所使用的最新HP Itanium处理器的3倍。
  新的IBM System p570服务器中的POWER6芯片是第一款在硬件上进行十进制浮点计算的微处理器内置的十进制浮点运算能力能够为企业运行复杂的税收、金融和ERP程序带来巨大的优势

在DLL中使用资源

在讨论关于动态链接到MFC的DLL的模块状态问题之前,先来看一个例子。本例可以通过如下步骤来完成:
1)在VC菜单中File->New新建一个命名为DLLShared的MFC AppWizard的工程,下一步选择Regular DLL using shared MFC DLL。
2)在工程中添加一个对话框资源,其ID为:IDD_ABOUTBOX。并在resource.h之中将IDD_ABOUTBOX 的数值改为100。
3)在DLLShared.cpp中定义如下函数:
void ShowDlg()
{
CDialog dlg(IDD_ABOUTBOX);
dlg.DoModal();
}
4)在DLLShared.def文件中的EXPORTS语句中添加一行:ShowDlg,以导出ShowDlg函数。
5)编译生成DLLShared.dll和DLLShared.lib。
继续使用上面的Use工程,将前面生成的DLLShared.dll和DLLShared.lib两个文件复制到工程的Debug目录内,并将
extern "C" __declspec(dllexport) void ShowDlg();
#pragma comment(lib,"debug/DLLStatic")
这两行改为:
void ShowDlg();
#pragma comment(lib,"debug/DLLShared")
编译并运行Use.exe。点击按钮,这次你看到了什么?对,没错,这次弹出的是Use.exe的关于对话框。将上述例子的DLL类型换成MFC Extension DLL(using shared MFC DLL)也会出现相同的问题。
为什么会出现上面的问题?这是因为在使用了MFC共享库的时候,默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。虽然我们调用的是DLL中的函数来显示DLL中的对话框,并且对应的对话框模板是存储在DLL中的,但MFC仍旧在主应用程序也就是Use.exe中寻找相应的对话框模板。由于在DLL中所定义的对话框资源ID与主应用程序中所定义的关于对话框的资源ID相同,所以MFC就把主应用程序中的关于对话框显示了出来。如果二者不同,则MFC就认为DLL中所定义的对话框资源不存在,dlg.DoModal会返回0,也就是什么都不会显示。
那么如何解决上述问题呢?解决办法就是在适当的时候进行模块状态切换,以保证具有当前状态的模块是我们所需要的模块从而使用正确的资源。MFC提供了下列函数和宏来完成这些工作:
AfxGetStaticModuleState:这是一个函数,其函数原型为:
AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );
此函数在堆栈上构造AFX_MODULE_STATE类的实例pModuleState并对其赋值后将其返回。在AFX_MODULE_STATE类的构造函数中,该类获取指向当前模块状态的指针并将其存储在成员变量中,然后将pModuleState设置为新的有效模块状态。在它的析构函数中,该类将存储在其成员变量中的指针还原为存贮的前一个模块状态。
AFX_MANAGE_STATE:这是一个宏,其原型为:
AFX_MANAGE_STATE( AFX_MODULE_STATE* pModuleState )
该宏用于将pModuleState(指向包含模块全局数据也就是模块状态的AFX_MODULE_STATE结构的指针)设置为当前的即时作用空间中(the remainder of the immediate containing scope)的有效模块状态。在离开包含该宏的作用空间时,前一个有效的模块状态自动还原。
AfxGetResourceHandle:这个函数的原型为:
HINSTANCE AfxGetResourceHandle( );
该函数返回了一个保存了HINSTANCE类型的、应用程序默认所加载资源的模块的句柄。
AfxSetResourceHandle:这个函数的原型为:
void AfxSetResourceHandle( HINSTANCE hInstResource );
该函数将hInstResource所代表的模块设置为具有当前状态的模块。
通过使用上述四个函数或宏就可以正确的在动态链接到MFC的DLL中切换模块状态。接下来我们将通过修改上面出现问题的那个例子来介绍如何使用上述四个函数或宏。先来看看Regular DLL using shared MFC DLL类型:
在上述例子的第三步的ShowDlg函数的第一条语句前加上如下语句(要确保该语句在函数实现的第一行):
AFX_MANAGE_STATE(AfxGetStaticModuleState());
之后重新编译生成DLLShared.dll和DLLShared.lib,并将这两个文件重新拷贝到Use工程的Debug目录内。这次编译生成Use.exe并运行,点击按钮,可以看到弹出的时我们在DLL中所加入的那个对话框,而不再是Use.exe的关于对话框了。
通过上面的讲解,相信你已经知道该语句的作用了。在函数ShowDlg的第一行加上这么一句后,每次调用DLL的应用程序使用该函数的时候,MFC库都会自动切换当前模块状态,这样就保证了资源读取的正确性。
AFX_MANAGE_STATE(AfxGetStaticModuleState());是自动切换当前模块状态,也可以通过使用AfxGetResourceHandle和AfxSetResourceHandle来手动切换当前模块状态。具体使用方法如下:
在上述例子的第三步的ShowDlg函数的第一条语句前加上如下语句(要确保该语句在函数实现的第一行):
HINSTANCE save_hInstance = AfxGetResourceHandle();
AfxSetResourceHandle(theApp.m_hInstance);
在调用对话框成功之后,也就是dlg.DoModal();之后,添加:
AfxSetResourceHandle(save_hInstance);
这种方法在进入ShowDlg函数之后,通过AfxGetResourceHandle来获得并保存当前状态模块的句柄。然后获得DLL模块的句柄theApp.m_hInstance(当然,也可以使用GetModuleHandle函数来获得DLL模块的句柄),并使用AfxSetResourceHandle函数来将其设置为当前状态状态。最后在调用对话框成功之后再用恢复AfxSetResourceHandle资源句柄,将当前模块状态恢复。
这样做有些麻烦,但是有一点好处是可以在完成使用资源的任务之后就可以立即恢复资源句柄。而AFX_MANAGE_STATE(AfxGetStaticModuleState());的方法只能等函数的作用空间结束之后才恢复资源句柄。由于可执行文件必须重画工具条等原因,因此建议只要有可能就必须恢复资源句柄,否则可能会遇到许多问题。比如说,如果用户移动DLL的对话框,而此时资源句柄仍然为DLL的资源,那么程序就会崩溃。最好的恢复句柄的时机在对话框响应WM_INITDIALOG消息的时候,因为这时对话框的模板等已经读出了。
对于MFC Extension DLL(using shared MFC DLL)类型的MFC DLL,切换当前模块状态的方法与Regular DLL using shared MFC DLL类型的MFC DLL所使用的方法很相似,这里不再举例实现。二者不同的地方如下:
在MFC扩展DLL中使用AFX_MANAGE_STATE(AfxGetStaticModuleState());时,会产生如下错误:
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dllextend.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in dllextend.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dllextend.obj
因此在MFC扩展DLL中需要将AFX_MANAGE_STATE(AfxGetStaticModuleState());换成AFX_MANAGE_STATE(AfxGetAppModuleState());才能正确切换当前模块状态。
在MFC扩展DLL中使用AfxGetResourceHandle和AfxSetResourceHandle的方法与在Regular DLL using shared MFC DLL类型的MFC DLL中所使用的方法相同。并且,DLL模块的句柄可以通过MFC提供的DlgextentDLL这个结构的hModule成员来获得。即使用AfxSetResourceHandle(DlgextentDLL.hModule);语句。
当然,对于动态链接到MFC的DLL,也可以在调用该DLL的MFC应用程序中使用AfxGetResourceHandle和AfxSetResourceHandle两个函数来切换当前状态模块。该DLL模块的句柄可以用GetModuleHandle函数来获得。在此不再赘述。

星期三, 三月 07, 2007

SQL学习笔记(转)

SQL

1 1. 一张表不能同时和复数张表外连接。

2只有当同一张表的多个连接条件均为外连接时,外连接才起作用。

3同一张表的多个外连接条件中,只要一个不满足条件,该表的记录则为空。

4使用集合函数的SQL中,可用HAVING指定集合后结果的条件。

例:SELECT x,SUM(i) FROM A GROUP BY x HAVING SUM(i) > 100

5排序操作中,NULLSQLSERVER中被作为最小值,在ORACLE DB2中被作为最大值。

ORACLE9i中,可用NULLS FIRST,NULLS LAST来改变NULL 记录的位置。

例:SELECT * FROM foo ORDER BY a DESC NULLS LAST

6WHERE条件中的子查询,会与主表中的记录逐条匹配,因此效率低下。

7INSERT ALL(*ORACLE)可以同时登录多条记录,可以同时登录多张表。

语法中SELECT 是必须的。例:INSERT ALL INTO foo VALUES(1,2) INTO

foo VALUES(3,4) SELECT * FROM DUAL

INSERT ALL

WHEN a < 10000 THEN

INTO bar1

ELSE

INTO bar2

SELECT a,b FROM foo

8(*ORACLE) 符合条件的记录存在时更新,不存在时登录。

MERGE INTO bar USING foo ON (foo.a = bar.a)

WHEN MATCHED THEN UPDATE SET bar.b = foo.b,bar.c = foo.c

WHEN NOT MATCHED THEN INSERT(bar.a,bar.b,bar.c)

VALUSE(foo.a,foo.b,foo.c)

9. SELECT FOR UPDATE OF 锁记录

SELECT * FROM foo ,bar WHERE foo.a = bar.a AND bar.b = abc FOR UPDATE

OF foo.a NOWAIT

10. LOCK TABLE 锁表

11. 记录集合差运算MINUS,只取得主表中,从表中没有的记录。

例:SELECT a FROM foo MINUS SELECT a FROM bar

12. 记录集合交集运算INTERSECT ,取出两张表中都存在的记录。

例:SELECT a FROM foo INTERSECT SELECT a FROM bar

13. 字符串连接运算符:

例:SELECT 姓名 '(' 性别 ')' FROM 个人信息

星期五, 十月 06, 2006

JPEG格式

JPEG格式
6.3.1 简介
微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分。正序存放就是
高字节存放在前低字节在后,而逆序存放就是低字节在前高字节在后。例如,十六进制
数为A02B,正序存放就是A02B,逆序存放就是2BA0。摩托罗拉(Motorola)公司的微处理
器使用正序存放,而英特尔(Intel)公司的微处理器使用逆序。JPEG文件中的字节是按照
正序排列的。
----------------------------------------------------------------------------
----
JPEG委员会在制定JPEG标准时,定义了许多标记(marker)用来区分和识别图像数据及其
相关信息,但笔者没有找到JPEG委员会对JPEG文件交换格式的明确定义。直到1998年12
月从分析网上具体的JPG图像来看,使用比较广泛的还是JPEG文件交换格式(JPEG File
Interchange Format,JFIF)版本号为1.02。这是1992年9月由在C-Cube Microsystems公
司工作的Eric Hamilton提出的。此外还有TIFF JPEG等格式,但由于这种格式比较复杂
,因此大多数应用程序都支持JFIF文件交换格式。
JPEG文件使用的颜色空间是CCIR 601推荐标准进行的彩色空间(参看第7章)。在这个彩色
空间中,每个分量、每个像素的电平规定为255级,用8位代码表示。从RGB转换成YCbCr
空间时,使用下面的精确的转换关系:
       Y = 256 * Ey
      Cb = 256 * [ECb] + 128
      Cr = 256 * [ECr] + 128
其中亮度电平Ey和色差电平ECb和ECb分别是CCIR 601定义的参数。由于Ey的范围是
0~1,ECb和ECb的范围是-0.5~+0.5,因此Y, Cb和Cr的最大值必须要箝到255。于是
RGB和YCbCr之间的转换关系需要按照下面的方法计算。
(1) 从RGB转换成YCbCr
YCbCr(256级)分量可直接从用8位表示的RGB分量计算得到:
       Y =   0.299 R + 0.587 G  + 0.114 B
     Cb = - 0.1687R - 0.3313G  + 0.5   B + 128
    Cr = 0.5 R - 0.4187G - 0.0813 B + 128
需要注意的是不是所有图像文件格式都按照R0,G0,B0,…… Rn,Gn,Bn的次序存储样
本数据,因此在RGB文件转换成JFIF文件时需要首先验证RGB的次序。
(2) 从YCbCr转换成RGB
RGB分量可直接从YCbCr(256级)分量计算得到:
     R = Y                 + 1.402 (Cr-128)
      G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
      B = Y + 1.772 (Cb-128)
在JFIF文件格式中,图像样本的存放顺序是从左到右和从上到下。这就是说JFIF文件中
的第一个图像样本是图像左上角的样本。
6.3.2 文件结构
JFIF文件格式直接使用JPEG标准为应用程序定义的许多标记,因此JFIF格式成了事实上
JPEG文件交换格式标准。JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0
xFF。每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个
标记:
SOI  0xD8            图像开始
APP0 0xE0            JFIF应用数据块
APPn 0xE1 - 0xEF    其他的应用数据块(n, 1~15)
DQT  0xDB           量化表
SOF0 0xC0            帧开始
DHT  0xC4           霍夫曼(Huffman)表
SOS  0xDA           扫描线开始
EOI  0xD9            图像结束
为使读者对JPEG定义的标记一目了然,现将JPEG的标记码列于表6-05,并保留英文解释

表6-05 JPEG定义的标记
Symbol
(符号)
Code Assignment
(标记代码)
Description
(说明)
Start Of Frame markers, non-hierarchical Huffman coding
SOF0
0xFFC0
Baseline DCT
SOF1
0xFFC1
Extended sequential DCT
SOF2
0xFFC2
Progressive DCT
SOF3
0xFFC3
Spatial (sequential) lossless
Start Of Frame markers, hierarchical Huffman coding
SOF5
0xFFC5
Differential sequential DCT
SOF6
0xFFC6
Differential progressive DCT
SOF7
0xFFC7
Differential spatial lossless
Start Of Frame markers, non-hierarchical arithmetic coding
JPG
0xFFC8
Reserved for JPEG extensions
SOF9
0xFFC9
Extended sequential DCT
SOF10
0xFFCA
Progressive DCT
SOF11
0xFFCB
Spatial (sequential) Lossless
Start Of Frame markers, hierarchical arithmetic coding
SOF13
0xFFCD
Differential sequential DCT
SOF14
0xFFCE
Differential progressive DCT
SOF15
0xFFCF
Differential spatial Lossless
Huffman table specification
DHT
0xFFC4
Define Huffman table(s)
arithmetic coding conditioning specification
DAC
0xFFCC
Define arithmetic conditioning table
Restart interval termination
RSTm
0xFFD0~0xFFD7
Restart with modulo 8 counter m
Other marker
SOI
0xFFD8
Start of image
EOI
0xFFD9
End of image
SOS
0xFFDA
Start of scan
DQT
0xFFDB
Define quantization table(s)
DNL
0xFFDC
Define number of lines
DRI
0xFFDD
Define restart interval
DHP
0xFFDE
Define hierarchical progression
EXP
0xFFDF
Expand reference image(s)
APPn
0xFFE0~0xFFEF
Reserved for application use
JPGn
0xFFF0~0xFFFD
Reserved for JPEG extension
COM
0xFFFE
Comment
Reserved markers
TEM
0xFF01
For temporary use in arithmetic coding
RES
0xFF02~0xFFBF
Reserved
JPEG文件由下面的8个部分组成:
(1) 图像开始SOI(Start of Image)标记
(2) APP0标记(Marker)
① APP0长度(length)
② 标识符(identifier)
③ 版本号(version)
④ X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)
⑤ X方向像素密度(X density)
⑥ Y方向像素密度(Y density)
⑦ 缩略图水平像素数目(thumbnail horizontal pixels)
⑧ 缩略图垂直像素数目(thumbnail vertical pixels)
⑨ 缩略图RGB位图(thumbnail RGB bitmap)
(3) APPn标记(Markers),其中n=1~15(任选)
① APPn长度(length)
② 由于详细信息(application specific information)
(4) 一个或者多个量化表DQT(difine quantization table)
① 量化表长度(quantization table length)
② 量化表数目(quantization table number)
③ 量化表(quantization table)
(5) 帧图像开始SOF0(Start of Frame)
① 帧开始长度(start of frame length)
② 精度(precision),每个颜色分量每个像素的位数(bits per pixel per color comp
onent)
③ 图像高度(image height)
④ 图像宽度(image width)
⑤ 颜色分量数(number of color components)
⑥ 对每个颜色分量(for each component)
ID
垂直方向的样本因子(vertical sample factor)
水平方向的样本因子(horizontal sample factor)
量化表号(quantization table#)
(6) 一个或者多个霍夫曼表DHT(Difine Huffman Table)
① 霍夫曼表的长度(Huffman table length)
② 类型、AC或者DC(Type, AC or DC)
③ 索引(Index)
④ 位表(bits table)
⑤ 值表(value table)
(7) 扫描开始SOS(Start of Scan)
① 扫描开始长度(start of scan length)
② 颜色分量数(number of color components)
③ 每个颜色分量
ID
交流系数表号(AC table #)
直流系数表号(DC table #)
④ 压缩图像数据(compressed image data)
(8) 图像结束EOI(End of Image)
表6-06表示了APP0域的详细结构。有兴趣的读者可通过UltraEdit或者PC TOOLS等工具软
件打开一个JPG图像文件,对APP0的结构进行分析和验证。
表6-06 JFIF格式中APP0域的详细结构
偏移
长度
内容
块的名称
说明
0
2 byte
0xFFD8
(Start of Image,SOI)
图像开始
2
2 byte
0xFFE0
APP0(JFIF application segment)
JFIF应用数据块
4
2 bytes
  length of APP0 block
APP0块的长度
6
5 bytes
  "JFIF"+"0"
识别APP0标记
11
1 byte
  <Major version>
主要版本号(如版本1.02中的1)
12
1 byte
  <Minor version>
次要版本号(如版本1.02中的02)
13
1 byte
  <Units for the X
and Y densities>
X和Y的密度单位
units=0:无单位
units=1:点数/英寸
units=2:点数/厘米
14
2 bytes
  <Xdensity>
水平方向像素密度
16
2 bytes
  <Ydensity>
垂直方向像素密度
18
1 byte
  <Xthumbnail>
缩略图水平像素数目
19
1 byte
  <Ythumbnail>
缩略图垂直像素数目
  3n
  < Thumbnail RGB bitmap>
缩略RGB位图(n为缩略图的像素数)
      Optional JFIF extension APP0 marker segment(s)
任选的JFIF扩展APP0标记段
  ……
  ……
 
  2 byte
0xFFD9
(EOI) end-of-file
图像文件结束标记

星期三, 九月 20, 2006

图片渐渐显示(遂点谈入)

第一步:把如下代码加入<body>区域中
<SCRIPT FOR=window EVENT=onLoad LANGUAGE=vbscript>
image1.filters.item(0).apply()
image1.filters.item(0).transition = 12
image1.Style.visibility = ""
image1.filters(0).play(2.0)
</SCRIPT>


第二步:把如下代码加入<body>区域中
<img src="swimming.gif" border=5 id="image1"
style="visibility:hidden; FILTER:revealTrans(Duration=4.0, Transition=23);">

实现图片的无缝循环滚动

解决思路:
一个设定宽度并且隐藏超出它宽度的内容的容器demo,里面放demo1和demo2,demo1是滚动内容,demo2为demo1的直接克隆副本,通过不断改变demo1的scrollTop或者scrollLeft达到滚动的目的,当滚动至demo1与demo2的交界处时直接跳回初始位置,因为demo1与demo2一样,所以分不出跳动的瞬间,从而达到"无缝"滚动的目的。

具体步骤:
1.向上滚动。

<base href="http://www.yezigu.com">
<div id=demo style=overflow:hidden;height:100;width:90;
background:#214984;color:#ffffff>
<div id=demo1>
<img src="images/flash8.gif">
<img src="images/link/flashempire.gif">
<img src="images/linklogo/shlogo.gif">
<img src="images/link/deskcity.gif">
<img src="images/linklogo/5dmeng.gif">
<img src="/Upload/2005-09/logo.gif">
<img src="images/link/flashskylogo.gif">
<img src="images/link/5dlogo88.gif">
<img src="/Upload/2005-09/link.gif">
</div>
<div id=demo2></div>
</div>
<script>
var speed=30
demo2.innerHTML=demo1.innerHTML //克隆demo1为demo2
function Marquee(){
//当滚动至demo1与demo2交界时
if(demo2.offsetTop-demo.scrollTop<=0)
demo.scrollTop-=demo1.offsetHeight //demo跳到最顶端
else{
demo.scrollTop++
}
}
var MyMar=setInterval(Marquee,speed)//设置定时器
//鼠标移上时清除定时器达到滚动停止的目的
demo.onmouseover=function() {clearInterval(MyMar)}
//鼠标移开时重设定时器
demo.onmouseout=function(){MyMar=setInterval(Marquee,speed)}
</script>

2.向下滚动。

<base href="http://www.yezigu.com">
<div id=demo style=overflow:hidden;height:100;width:90;
background:#214984;color:#ffffff>
<div id=demo1>
<img src="images/flash8.gif">
<img src="images/link/flashempire.gif">
<img src="images/linklogo/shlogo.gif">
<img src="images/link/deskcity.gif">
<img src="images/linklogo/5dmeng.gif">
<img src="/Upload/2005-09/logo.gif">
<img src="images/link/flashskylogo.gif">
<img src="images/link/5dlogo88.gif">
<img src="/Upload/2005-09/link.gif">
</div>
<div id=demo2></div>
</div>
<script>
var speed=30
demo2.innerHTML=demo1.innerHTML
demo.scrollTop=demo.scrollHeight
function Marquee(){
if(demo1.offsetTop-demo.scrollTop>=0)
demo.scrollTop+=demo2.offsetHeight
else{
demo.scrollTop--
}
}
var MyMar=setInterval(Marquee,speed)
demo.onmouseover=function() {clearInterval(MyMar)}
demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>

3.向左滚动。

<base href="http://www.yezigu.com">
<div id=demo style=overflow:hidden;height:33;width:500;
background:#214984;color:#ffffff>
<table align=left cellpadding=0 cellspace=0 border=0>
<tr>
<td id=demo1 valign=top>
<img src="images/link/flashempire.gif">
<img src="images/linklogo/shlogo.gif">
<img src="images/link/deskcity.gif">
<img src="images/linklogo/5dmeng.gif">
<img src="/Upload/2005-09/logo.gif">
<img src="images/link/flashskylogo.gif">
<img src="images/link/5dlogo88.gif">
<img src="/Upload/2005-09/link.gif">
<img src="images/flash8.gif">
</td>
<td id=demo2 valign=top></td>
</tr>
</table>
</div>
<script>
var speed=30
demo2.innerHTML=demo1.innerHTML
function Marquee(){
if(demo2.offsetWidth-demo.scrollLeft<=0)
demo.scrollLeft-=demo1.offsetWidth
else{
demo.scrollLeft++
}
}
var MyMar=setInterval(Marquee,speed)
demo.onmouseover=function() {clearInterval(MyMar)}
demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>

4.向右滚动。

<base href="http://www.yezigu.com">
<div id=demo style=overflow:hidden;height:33;width:500;
background:#214984;color:#ffffff>
<table align=left cellpadding=0 cellspace=0 border=0>
<tr>
<td id=demo1 valign=top>
<img src="images/link/flashempire.gif">
<img src="images/linklogo/shlogo.gif">
<img src="images/link/deskcity.gif">
<img src="images/linklogo/5dmeng.gif">
<img src="/Upload/2005-09/logo.gif">
<img src="images/link/flashskylogo.gif">
<img src="images/link/5dlogo88.gif">
<img src="/Upload/2005-09/link.gif">
<img src="images/flash8.gif">
</td>
<td id=demo2 valign=top></td>
</tr>
</table>
</div>
<script>
var speed=30
demo2.innerHTML=demo1.innerHTML
demo.scrollLeft=demo.scrollWidth
function Marquee(){
if(demo.scrollLeft<=0)
demo.scrollLeft+=demo2.offsetWidth
else{
demo.scrollLeft--
}
}
var MyMar=setInterval(Marquee,speed)
demo.onmouseover=function() {clearInterval(MyMar)}
demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>

提示:关于循环滚动的原理,光看本例代码的话可能会觉得枯涩难懂,那样的话可以运行下面修改过的代码,注意滚动条和背景颜色的变化:

<base href="http://www.yezigu.com">
<div id=demo style="overflow-x:hidden;overflow-y:scroll;
height:100;width:90;background:#214984">
<img src="images/flash8.gif">
<img src="images/link/flashempire.gif">
<img src="images/linklogo/shlogo.gif">
<img src="images/link/deskcity.gif">
<img src="images/linklogo/5dmeng.gif">
<img src="/Upload/2005-09/logo.gif">
<img src="images/link/flashskylogo.gif">
<img src="images/link/5dlogo88.gif">
</div>
<script>
function Marquee(obj,speed){
with(obj){
innerHTML=["<div>","</div><div style=’background:green’>","</div>"].join(innerHTML)
onmouseover=function(){clearInterval(MyMar)}
onmouseout=function(){
MyMar=setInterval(function(){
with(obj)
scrollTop+=(scrollTop<=lastChild.offsetTop?1:-lastChild.offsetHeight)},speed)}
fireEvent("onmouseout")
}
}
Marquee(demo,30)
</script>

星期四, 九月 14, 2006

親ウィンドウの中央にダイログを表示

CenterWindow(); //親ウィンドウの中央にダイログを表示

星期五, 九月 08, 2006

MFC窗口中各控件的上下层次的设置


BOOL SetWindowPos(
const CWnd* pWndInsertAfter,
int x,
int y,
int cx,
int cy,
UINT nFlags
);

  • wndBottom

  • ウィンドウを Z オーダーの一番下に置きます。このCWnd が最上位のウィンドウの場合、
    ウィンドウの最上位ステータスは失われます。
    システムでは、このウィンドウをほかのすべてのウィンドウよりも下に置きます。

    将窗口(控件也是窗口)置于Z坐标的最下层

  • wndTop

  • ウィンドウを Z オーダーの先頭に置きます。

    将窗口(控件也是窗口)置于Z坐标的最上层

  • wndTopMost

  • ウィンドウを最上位でないすべてのウィンドウの上に置きます。ウィンドウは、非アクティブになったときも、最上位の位置を保持します。

    始终最上层

  • wndNoTopMost

  • ウィンドウを最上位でないすべてのウィンドウの先頭に再配置します (つまり、一番手前のすべてのウィンドウの後ろに置きます)。
    ウィンドウが既に非最上位ウィンドウとなっているときは、このフラグは無効です。



    BOOL ModifyStyle(
    DWORD dwRemove,
    DWORD dwAdd,
    UINT nFlags = 0
    );


    窗口中各控件的描画顺序
    top的最先描画
    bottom的最后描画
    导致控件的消息响应和显示矛盾

    可以通过以下方法的设置解决
    GetDlgItem(IDC_SCREEN_SWITCH_BACK)->SetWindowPos(&wndBottom, 0, 0, 50, 592, SWP_SHOWWINDOW);
    GetDlgItem(IDC_SCREEN_SWITCH_BACK)->ModifyStyle(0, WS_CLIPSIBLINGS, 0);