东方红魔乡修改器资源网上发布了供应产品,可以修改产品信息吗,怎么修改?

小站会根据您的关注,为您发现更多,
看到喜欢的小站就马上关注吧!
下一站,你会遇见谁的梦想?
欢迎参加东方博宜软件开发工程师培训!&&课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&&咨询热线:8、(闫老师)&网址:&咨询QQ:
常州软件开发——Access教程:随机抽取数据库中的记录
欢迎参加东方博宜软件开发工程师培训!&&课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&&咨询热线:8&&网址:&咨询QQ:&
里有5条记录,随机抽取4条。code--------------------------------------&%'-------------------------数据库连接-----------------------Set objConn = Server.CreateObject("ADODB.Connection")objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" &_"Data Source=" & Server.MapPath("data.mdb")objConn.Open'-------------------------数据库连接-----------------------
'-------------------------检索数据-----------------------strSQL = "SELECT id,DataColumn FROM DataTable" 'Sql语句,检索数据库Set objRS = Server.CreateObject("ADODB.Recordset")&&& '创建记录集objRS.Open strSQL, objConn, 1, 1&&'执行检索Count=objRS.RecordCount&&&'得到记录总数Item=4&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& '显示记录数'-------------------------检索数据-----------------------'-------------------------------------------------------------------------------redim a(Item, 2),t(Count)'定义2数组,数组a用来储存记录,数组t用来删选记录'---------------------------------------'初始数组数值,目的为了插入数据以后和此值做比较for each j in t&&& j=0next'---------------------------------------'---------------------------------------' 随机抽取记录号Randomize timer&& '初始化随机数生成器for j=1 to Item&&& k=int(rnd*Count+1) '从总数里面随机取一条记录&&& do while t(k)&&0&&&&&&&&&&&&&&&& '判断是否记录是否已经在数组中&&&&& k=int(rnd*Item+1)&&& loop&&& t(k)=1&&& '第k条记录被选中next'--------------------------------------j=1:i=1'定义下标'--------------------------------------' 循环选取数据集objRS中的部分记录存放到数组中Do While Not objRS.Eof&& if t(j)=1 then&&& a(i,1)=objRS("id")&&&&&&&&&& '记录id&&& a(i,2)=objRS("DataColumn") '记录内容&&& i=i+1end ifj=j+1objRS.MoveNextLoop'--------------------------------------'-------------------------------------------------------------------------------'----------------------------显示内容--------------------for i=1 to ItemResponse.write "序号"&a(i,1)&"&br&"Response.write "内容"&a(i,2)&"&p&"next'----------------------------显示内容--------------------'---------------------------'释放资源objRs.Closeset objRs=nothingobjConn.Closeset objConn=nothing'---------------------------%&Dataid&&& DataColumn--------------------------1&&&&&&& a2&&&&&&& b3&&&&&&& c4&&&&&&& d5&&&&&&& e// 的话只需要newID()就行了,但来说,它本身不提供newID()这个方法
常州JAVA软件培训——在 Server Core 2008 R2 上安装 SQL Server 2008 R2
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
咨询QQ:这几天在搭建一个测试环境,需要一台&&2008 R2 的虚拟机,为了减少对资源的占用,gOxiA 打算在 Server Core 2008 R2 上安装 SQL Server 2008 R2,查阅了微软的官方资料&,可结果令人惋惜:&SQL Server 2008 R2 is not supported on&&Server 2008 SP2 Server Core or&&Server 2008 R2 Server Core installations.&!& & & &虽然是明确说明了 SQL Server 2008 R2 不支持在 Server Core 上安装,但是由于现在的 Server Core 2008 R2都已经支持&&框架和 PowerShell,并满足 SQL Server 2008 R2 的基本需求,那么要在 Server Core 2008 R2 上安装 SQL Server 2008 R2 应该不是一件难事。& & & &gOxiA 事先准备好了一台已经加入到 AD 的 Server Core 2008 R2 虚拟机,之后载入 SQL Server 2008 R2 的安装光盘镜像文件(ISO),并运行 Setup.exe,随即安装程序提示我要启用 .NET&&核心角色,单击确定继续。
& & & &随后出现了 .NET Framework 3.5 SP1 安装失败的错误提示。看来是安装程序的脚本不能很好的支持 Server Core 2008 R2 环境,接下来就只能手工安装这些组件。
& & & &在命令行提示符下键入如下指令:dism /online /enable-feature /featurename:NetFx2-ServerCore /featurename:ServerCore-WOW64 /featurename:NetFx3-ServerCore-WOW64 /featurename:NetFx2-ServerCore-WOW64 /featurename:NetFx3-ServerCore /featurename:MicrosoftWindowsPowerShell注意:/featurename: 的参数区分大小写。
& & & &由于 gOxiA 还要使用 IIS,为此还执行了如下的命令:dism /online /enable-feature /featurename:IIS-ApplicationDevelopment /featurename:IIS-Server /featurename:IIS-WebServerRole /featurename:IIS-IIFilter /featurename:IIS-ISAPIExtensions /featurename:IIS-NetFxExtensibility /featurename:IIS-NET /featurename:IIS-ASP& & & &在完成相关组件的准备工作之后,再次执行 Setup.exe 进行 SQL Server 2008 R2 的安装,这次成功的出现了 SQL Server 2008 R2 的安装中心界面。随后的操作就不再单独介绍。如果大家对如何使用命令行来安装 SQL Server 2008 R2 感兴趣,那么可以参考:
& & & &在 SQL Server 2008 R2 完成安装后,由于 Windows 防火墙的原因,我们暂时还无法远程访问或管理 SQL Server 2008 R2,必须对相关配置进行设置。& & & &首先,我们要启动 SQL Server 2008 R2 的 TCP 支持,为此执行下面的操作步骤:
在命令行提示符键入 regedit,并按下回车键,启动编辑器;
定位到 HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\10_50.MSSQLSERVER\MSSQLServer\SuperSocketNetLib\Tcp,找到 Enable 并将其值改为 1。
完成注册表修改后使用 net stop mssqlserver && net start mssqlserver 命令行重新启动 SQL Server 2008 R2。
& & & &在为 SQL Server 2008 R2 成功启动 TCP 连接支持后,我们还需要对 Windows 防火墙做相应的配置,以允许外部访问本机的 TCP 1433 端口,为此我们执行如下命令行:netsh advfirewall firewall set rule group="Windows 远程管理& new enable=yesnetsh advfirewall firewall add rule name="SQL Server TCP 1433& dir=in action=allow protocol=tcp localport=1433& & & &现在,我们便可以通过远程计算机对运行在 Server Core 2008 R2 上的 SQL Server 2008 R2 进行管理和访问了。此外,我们前面还安装有 IIS,因为是 Server Core 环境,所以要方便地管理 IIS 也需要通过远程管理,配置 IIS 的远程管理功能可以参考:& & & &再次声明,微软并不支持在 Server Core 上安装 SQL Server 2008 R2,所以因此引发的将不受微软任何的支持。
常州JAVA软件培训——开源虚拟化技术KVM六问六答
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
咨询QQ:如今市面上有很多虚拟化技术,要为你的云项目选择一个合适的虚拟化平台还真是个艰巨的任务。以下几个关于开源虚拟化KVM常见的问题解答,希望能帮助你。  KVM是什么?  KVM (Kernel-based Virtual Machine,基于内核的虚拟机) 是下 x86平台上的全功能虚拟化,包含一个可加载的内核模块 kvm.ko提供和虚拟化核心架构和规范模块。使用KVM可允许多个包括Linux和每个虚拟机有私有的硬件,包括网卡、磁盘以及图形适配卡等。  由于KVM在性能、扩展性与安全等方面的优势,成为企业级的经济高效的虚拟化开放解决方案。红帽将KVM作为首选的虚拟化平台,IBM将KVM作为最佳虚拟化开放技术,参与KVM技术开发,涉及性能、安全和云计算等广泛领域。  如何获取KVM?  购买Linux版本获得KVM。很多Linux发行版本都内置有KVM,包括红帽企业Linux 5.4及以上版本,SUSE Linux Entrise Server 11 SP1及以上版本,Canonical Ubuntu 10.04 LTS及以上版本。如果想虚拟运行Linux的,或者虚拟运行Linux与服务器的话,该购买方法最合适。  将KVM作为独立hypervisor购买。KVM与Linux的组合进行了优化,并拆开成交付hypervisor的模块。红帽企业虚拟化RHEV使用的就是这种方式。此种获取方式适合云环境,或者适合运行Windows服务器的(大型)环境。  KVM使用的存储类型有哪些?  KVM的存储选项有多种,包括虚拟磁盘文件、基于文件系统的存储和基于设备的存储。  为实现KVM存储管理,可以使用LVM(Logical Volume Manager)和创建存储池。当系统创建KVM虚拟机的时候,默认使用虚拟磁盘文件作为后端存储。安装后,虚拟机认为在使用真实的磁盘,但实际上看到的是用于模拟的虚拟磁盘文件。这一额外的文件系统层会降低系统速度。  当然,基于磁盘镜像的虚拟磁盘并非全无益处,磁盘文件系统可以很轻松地用于其它的KVM虚拟化宿主机。但是如果您希望优化KVM虚拟化性能,最好考虑其它的存储方式。  如何运行KVM?  RHEL 6现在支持基于KVM管理程序。KVM的抽象层&&称为libvirt&&运行KVM网络,管理员能够在libvirt的配置文件中定制虚拟机连接并追踪网络设备。  在libvirt中运行KVM网络有两种方法:网络地址转换(NAT)和桥接网络。网络地址转换是默认方法,桥接网络仅对非常特殊的基础设施有意义。  对大多数管理员来说,最好从理解KVM网络在默认安装中如何工作开始。如果想创建定制安装,通过学习导航用于网络地址转换的NAT配置文件,同样可以熟悉相关设置。例如,你可以创建多个允许你改变不同虚拟机之间的网络流量的NAT接口。  如何管理KVM?  首先是单个资源的基础虚拟化管理,有开源的虚拟化工具集libvirt,通过命令行接口提供安全的远程管理,可管理单个系统。  然后是管理全部运行KVM的多个服务器,有两种:用Red Hat Enterprise Virtualization-Management,即RHEV-M(管理多个RHEV-H系统)和IBM Systems Director VMControl(管理多个RHEL系统)。  最后有IBM Tivoli产品与开源虚拟化项目oVirt,为主机和子机提供高级功能,包括高可用性热迁移存储管理系统调度等。  如何提升KVM使用性能?  如果在主机上使用KVM,通常会激活数个客户,而且这些操作系统经常运行相同的OS,这意味着大量的内核页面被多次加载。通过应用KSM(kernel samepage merging,内核同页合并),许多虚拟机可以使用相同数量的启动。  在RHEL 6和Fedora 14中,KSM默认是打开的。KSM通过两个服务:ksmd和ksmtuned实现,这两个服务在系统初始化时自动启动。管理员应该判断他们的环境并决定保持KSM处于运行状态还是关闭它。
常州JAVA软件培训——使用设计模式构建通用数据库访问类
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
 在应用程序的设计中,的访问是非常重要的,我们通常需要将对数据库的访问集中起来,以保证良好的封装性和可维护性。在中,数据库的访问,对于微软自家的SqlServer和其他数据库(支持OleDb),采用不同的访问方法,这些类分别分布于System.Data.SqlClient和System.Data.OleDb名称空间中。微软后来又推出了专门用于访问数据库的类库。我们希望在编写应用系统的时候,不因这么多类的不同而受到影响,能够尽量做到数据库无关,当后台数据库发生变更的时候,不需要更改客户端的代码。
  这就需要我们在实际开发过程中将这些数据库访问类再作一次封装。经过这样的封装,不仅可以达到上述的目标,还可以减少操作数据库的步骤,减少代码编写量。在这个方面,微软为我们提供了Application Block,但是,可惜的是目前只支持。这里,介绍一种在实际应用中得到了非常好的效果的实作策略&&笔者编写的sharp框架中的数据访问结构。Factory是使用的主要方法。
  我们先来看看Factory的含义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。我们这里可能会处理对多种数据库的操作,因此,需要首先定义一个操纵数据库的接口,然后,根据数据库的不同,由类工厂决定实例化哪个类。
  下面,我们首先来定义这个访问接口。为了方便说明问题,我们在这里只列出了比较少的方法,其他的方法是很容易参照添加的。
public interface Data
{ DatabaseType DatabaseType{} //数据库类型 IDbConnection DbConnection{} //得到数据库连接 void Open(); //打开数据库连接 void Close(); //关闭数据库连接
 IDbTransaction BeginTransaction(); //开始一个事务 int ExecuteNonQuery(string commandText); //执行Sql语句 DataSet ExecuteDataset(string commandText);//执行Sql,返回DataSet}
  因为,DataAccess的具体实现类有一些共同的方法,所以,先从DataAccess实现一个抽象的AbstractDataAccess类,包含一些公用方法。然后,我们分别为Sql Server、Oracle和OleDb数据库编写三个数据访问的具体实现类:
public sealed class&DataAccess : AbstractDataAccess{ &&//具体实现代码。}
public class OleDbDataAccess : AbstractDataAccess{ &&//具体实现代码。}
public class OracleDataAccess : AbstractDataAccess{ &&//具体实现代码。}
  现在我们已经完成了所要的功能,下面,我们需要创建一个Factory类,来实现自动数据库切换的管理。这个类很简单,主要的功能就是根据数据库类型,返回适当的数据库操纵类。
public sealed class DataAccessFactory{ private DataAccessFactory(){} private static PersistenceProperty defaultPersistenceP public static PersistenceProperty DefaultPersistenceProperty {  get{return defaultPersistenceP}  set{defaultPersistenceProperty=} }
public static DataAccess CreateDataAccess(PersistenceProperty pp){ DataAccess dataA switch(pp.DatabaseType) {  case(DatabaseType.MSSQLServer):   dataAccess = new MSSqlDataAccess(pp.ConnectionString);     case(DatabaseType.Oracle):   dataAccess = new OracleDataAccess(pp.ConnectionString);     case(DatabaseType.OleDBSupported):   dataAccess = new OleDbDataAccess(pp.ConnectionString);     default:   dataAccess=new MSSqlDataAccess(pp.ConnectionString);    } return dataA}
public static DataAccess CreateDataAccess(){ return CreateDataAccess(defaultPersistenceProperty);}
  好了,现在,一切都完成了,客户端在代码调用的时候,可能就是采用如下形式:
PersistenceProperty pp = new PersistenceProperty();pp.ConnectionString = "server=127.0.0.1;uid=pwd=;database=N";pp.DatabaseType = DatabaseType. MSSQLSpp.UserID = &sa&;pp.Password = &&;DataAccess db= DataAccessFactory.CreateDataAccess(pp)db.Open();&&//db.需要的操作db.Close();
  或者,如果事先设定了DataAccessFactory的DefaultPersistenceProperty属性,可以直接使用
DataAccess db= DataAccessFactory.CreateDataAccess()方法创建DataAccess实例。
  当数据库发生变化的时候,只需要修改PersistenceProperty的值,客户端不会感觉到变化,也不用去关心。这样,实现了良好的封装性。当然,前提是,你在编写程序的时候,没有用到特定数据库的特性,例如,Sql Server的专用函数。
  以上,介绍了一种通用数据库操作类的实现设计方法,希望能够对大家有所启发。
常州JAVA软件培训——AJAX初学:IE缓存页面的问题
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
咨询QQ:& 做一个项目用到Ajax,开始觉得挺好,后来发现一个问题,例如删除一项,恢复之后就不能再接着删除,必须要等一段时间,后来知道是IE缓存的问题。&&&  AJAX缓存页面是一个刚接触AJAX的人一定会遇到的问题,造成这个问题的关键性人物又是IE...&&&  在网上找了好多资料后,总结一下&&&  1:在AJAX请求的页面后加个随机函数,我们可以使用随机时间函数&&&&  在JavaScript发送的URL后加上t=Math.random() ,当然,不是直接把t=Math.random()拷贝到URL后面,应该像这样:URL+"&"+"t="+Math.random();&&&&  2:在XMLHttpRequest发送请求之前加上XMLHttpRequest.setRequestHeader("If-Modified-Since","0")&&&  一般情况下,这里的XMLHttpRequest不会直接使用,你应该可以找到这样的代码&&&XXXXX.send(YYYYYY);&&&  那么,就把它变成&&&XXXXX.setRequestHeader("If-Modified-Since","0");&&XXXXX.send(YYYYYY);&&&  第二种方法感觉挺好。&
常州JAVA软件培训——SCM项目背景与开发思路
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
一、开发背景目前市面上的进销存系统主要存在以下问题:1.不同行业,甚至同一行业不同物料的属性差异很大,在开发过程中往往需要根据不同行业的特性,进行定制化开发,主要原因在于物料管理系统的灵活性和可扩展性不足;2.虽然的目的是要达到&物流、资金流、信息流三流合一&的目的,但大多数系统在分析层面和设计层面(尤其是设计层面)对于&物流、资金流&的设计缺乏足够的重视,造成在信息流的不畅,虽然在实现层面采用大量的代码来实现上述功能,但由于设计方面的缺陷,只能是治标不治本;3.不同企业的业务流程不同,对于同一单据的处理流程不尽相同,现有系统在设计和实现中往往采用功能配置的方法加以实现。功能配置的方法虽然能够实现流程的定制功能,但往往需要大量代码维护复杂的业务逻辑,在业务流程需要扩展或者系统功能发生扩展的时候,不便于系统的快速升级。
为解决上述问题,需要从设计层面入手,精心构思和设计系统,使之具有更好的可扩展性、适应性等,满足不同行业的业务需求。
二、设计思路本系统的设计思路主要有以下几点:1.物料为核心:通过对物料及物料属性的抽象,并充分考虑企业在采购、销售以及统计等方面的需求,构造灵活、健壮的物料管理系统,使之能够满足不同行业、不同物料的编码管理及业务需求;并在此基础上进一步发展,使之在设计层面能够满足物流追踪的需求;2.两点一线,三方监控:通过对业务的对象化分析,拆离财务功能在业务过程中的紧耦合关系,使之成为业务过程中的第三方力量,达到&业务过程两点一线,财务功能第三方监控&的目的,一方面使得业务的灵活性能够得到保证,另一方面,在实现&物流、资金流和信息流三流合一&的同时,还能够保证三流的互相监督作用;3.状态机:在业务流转中,采用状态机原理,实现单据状态的灵活可配置性,其优点主要表现在降低实现(编码)层面的复杂性。
图1、状态机示意图
4.M结构:根据多年经验,利用现有的MVC架构(),并进一步扩展控制层,使得系统具有更高的灵活性和可扩展性;5.多语种:利用Struts的优势,只需要编写不同语种的属性文件,就可以轻松实现多语种功能,满足企业国际化的需要;6.相对独立的权限系统:分离权限系统的主要目的在于使得系统更加灵活,以便于企业扩张和重组时,尽量通过修改权限配置来满足企业的需求,尽可能少地修改代码;&
常州Java软件培训——用sql语句动态的创建access表
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
网址:& 用sql语句动态的创建表的代如下!
&%& nowtime = now()&tablename = cstr(year(nowtime))+\"_\"+cstr(second(nowtime))&response.write tablename  &db_path = \"test.mdb\"&Set conn= Server.CreateObject(\"ADODB.Connection\")&connstr = \"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"&Server.MapPath(db_path)&conn.Open connstr&Set rs = Server.CreateObject (\"ADODB.Recordset\")&sql = \"create table \"& tablename &\" (id integer primary key,name text,Birthday datetime)\"&rs.Open sql,conn,2,3&%&
常州JAVA软件培训——C++ 并发编程的一种思维
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
愈发紧迫的挑战现今,单台机器拥有多个独立的计算单元已经太常见了,这点在的上表现尤为明显,据 AMD 的一张
服务器路线图显示,服务器处理器的核心数将在 2013 年达到 20 颗之多。合理的利用&&资源已是一个不得不考虑的问题。不少&&程序员依然使用着多线程模型,但是对多线程的掌控并不是一件容易的事情,开发中容易出错、难以调试。有些开发者为了避免多线程带来的复杂度而弃用多线程,有些开发者则另投其他语言阵营,例如 Erlang。其实我们还有其他的选择,Theron 就是其中之一。&什么是 Theron?Theron 是一个用于并发编程的 C++ 库(http://www./),通过 Theron 我们可以避免多线程开发中各种痛处,例如:共享、线程同步。Theron 通过 Actor 模型向我们展示了另一种思维。什么是 Actor 模型?Erlang 因为其优秀的并发特性而被大家所关注,而其并发特性的关键之一就是在于其采用了 Actor 模型(http://c2.com//wiki?ErlangLanguage)。与 Actor 模型相对应的模型则是我们在面向对象编程中使用的 Object 模型,Object 模型中宣扬,一切皆为 Object(对象),而 Actor 模型则认为一切皆为 Actor。Actor 模型中,Actor 之间通过消息相互,这是其和 Object 模型的一个显著的区别,换而言之 Actor 模型使用消息传递机制来代替了 Object 模型中的成员方法调用。这样做意义重大,因为相对于成员方法的调用来说,消息的发送是非阻塞的,它无需等待被调用方法执行完成就可以返回,下图显示了此种区别:
A::a() 调用了 objB.b(),此时 A::a() 必须等待 B::b() 的返回才能继续执行。在 Actor 模型中,对应的做法是 Actor A 向 Actor B 发送消息并立即返回,这时候 Actor A 可以继续执行下去,与此同时 Actor B 收到消息被唤醒并和 Actor A 并行执行下去。Theron 中的每个 Actor 都会绑定一个唯一的地址,通过 Actor 的地址就可以向其发送消息了,每个 Actor 都有一个消息队列。从编码者的角度看来,每实例化一个 Actor 都创建了一个和 Actor 相关的&线程&(非系统级的线程)。每个 Actor 总是被单线程的执行。总结来说 Theron 的并发特性的关键就在于:每个 Actor 在属于自己的单个&线程&中执行,而多个 Actor 并发执行。Hello Theron在谈及更多内容之前,我们先来看看 Theron 的一个简单的范例,借以获得一个最直观的印象。在 http://www./ 可以到 Theron 的最新版,Theron 提供了 makefile 便于 gcc 用户编译,同时其也为&&用户提供了 Visual Studio solution 文件 Theron.sln 用于构建 Theron。编译 Theron 很容易,不会有太多的障碍,需要注意的是构建 Theron 需要指定依赖的线程库,Theron 支持三种线程库:std::thread(C++11 标准线程库)、Boost.Thread 和&&threads。使用 makefile 构建时,通过 threads 参数指定使用的线程库(更为详细的信息参考:http://www./index.?t=page&p=gcc),使用 Visual Studio 构建时,通过选择适当的 Solution configuration 来指定使用的线程库(更为详细的信息参考:http://www./index.php?t=page&p=visual studio)。下面我们来看一个最简单的范例:#include &stdio.h&#include &Theron/.h&#include &Theron/Actor.h&// 定义一个消息类型// 在 Theron 中,任何类型都可以作为一个消息类型// 唯一的一个约束是消息类型的变量能够被拷贝的// 消息按值发送(而非发送它们的地址)struct StringMessage{
char m_string[64];};// 用户定义的 Actor 总需要继承于 Theron::Actor// 每个 Actor 和应用程序的其他部分通信的唯一途径就是通过消息class Actor : public Theron::Actor{public:
inline Actor()
// 注册消息的处理函数
ReterHandler(this, &Actor::Handler);
// 消息处理函数的第一个参数指定了处理的消息的类型
inline void Handler(const StringMessage& message, const Theron::Address from)
printf("%sn", message.m_string);
if (!Send(message, from))
printf("Failed to send message to address %dn", from.AsInteger());
} };int main(){
// Framework 对象用于管理 Actors
// 通过 Framework 构建一个 Actor 实例并持有其引用
// Actor 的引用类似于 、 等语言中的引用的概念
// Theron::ActorRef 采用引用计数的方式实现,类似于 boost::shared_ptr
Theron::ActorRef simpleActor(framework.CreateActor&Actor&());
// 创建一个 Receiver 用于接收 Actor 发送的消息
// 用于在非 Actor 代码中(例如 main 函数中)与 Actor 通信
// 构建消息
strcpy(message.m_string, "Hello Theron!");
// 通过 Actor 的地址,我们就可以向 Actor 发送消息了
if (!framework.Send(message, receiver.GetAddress(), simpleActor.GetAddress()))
printf("Failed to send message!n");
// 等到 Actor 发送消息,避免被关闭主线程
receiver.Wait();
return 0;}这个范例比较简单,通过 Actor 输出了 Hello Theron。需要额外说明的一点是消息在 Actor 之间发送时会被拷贝,接收到消息的 Actor 只是引用到被发送消息的一份拷贝,这么做的目的在于避免引入共享内存、同步等问题。 Theron 的消息处理 前面谈到过,每个 Actor 都工作在一个属于自己的&线程&上,我们通过一个例子来认识这一点,我们修改上面例子中的 Actor:: Handler 成员方法:inline void Handler(const StringMessage& message, const Theron::Address from) {
while (true)
printf("%s --- %dn", message.m_string, GetAddress().AsInteger());#ifdef _MSC_VER
Sleep(1000);#else
sleep(1);#endif
}}此 Handler 会不断的打印 message 并且带上当前 Actor 的地址信息。在 main 函数中,我们构建两个 Actor 实例并通过消息唤醒它们,再观察输出结果:Hello Theron! --- 1Hello Theron! --- 2Hello Theron! --- 2Hello Theron! --- 1Hello Theron! --- 2Hello Theron! --- 1Hello Theron! --- 2Hello Theron! --- 1......这和我们预期的一样,两个 Actor 实例在不同的线程下工作。实际上,Framework 创建的时候会创建系统级的线程,默认情况下会创建两个(可以通过 Theron::Framework 构造函数的参数决定创建线程的数量),它们构成一个线程池,我们可以根据实际的 CPU 核心数来决定创建线程的数量,以确保 CPU 被充分利用。线程池的线程是以何种方式进行调度的?如下图:
接收到消息的 Actor 会被放置于一个线程安全的 Work 队列中,此队列中的 Actor 会被唤醒的工作线程取出,并进行消息的处理。这个过程中有两个需要注意的地方:
对于某个 Actor 我们可以为某个消息类型注册多个消息处理函数,那么此消息类型对应的多个消息处理函数会按照注册的顺序被串行执行下去
线程按顺序处理 Actor 收到的消息,一个消息未处理完成不会处理消息队列中的下一个消息 我们可以想象,如果存在三个 Actor,其中两个 Actor 的消息处理函数中存在死循环(例如上例中的 while(true)),那么它们一旦执行就会霸占两条线程,若线程池中没有多余线程,那么另一个 Actor 将被&饿死&(永远得不到执行)。我们可以在设计上避免这种 Actor 的出现,当然也可以适当的调整线程池的大小来解决此问题。Theron 中,线程池中线程的数量是可以动态控制的,线程利用率也可以测量。但是务必注意的是,过多的线程必然导致过大的线程上下文切换开销。
一个详细的例子
我们再来看一个详细的例子,借此了解 Theron 带来的便利。生产者消费者的问题是一个经典的线程同步问题,我们来看看 Theron 如何解决这个问题:
#include &stdio.h&#include &Theron/.h&#include &Theron/Actor.h&const int PRODUCE_NUM = 5;class Producer : public Theron::Actor{public:
inline Producer(): m_item(0)
ReterHandler(this, &Producer::Produce);
// 生产者生产物品
inline void Produce(const int& /* message */, const Theron::Address from)
int count(PRODUCE_NUM);
while (count--)
// 模拟一个生产的时间#ifdef _MSC_VER
Sleep(1000);#else
sleep(1);#endif
printf("Produce item %dn", m_item);
if (!Send(m_item, from))
printf("Failed to send message!n");
// 当前生产的物品编号
int m_};class Consumer : public Theron::Actor{public:
inline Consumer(): m_consumeNum(PRODUCE_NUM)
RegisterHandler(this, &Consumer::Consume);
inline void Consume(const int& item, const Theron::Address from)
// 模拟一个消费的时间#ifdef _MSC_VER
Sleep(2000);#else
sleep(2);#endif
printf("Consume item %dn", item);
--m_consumeN
// 没有物品可以消费请求生产者进行生产
if (m_consumeNum == 0)
if (!Send(0, from))
printf("Failed to send message!n");
m_consumeNum = PRODUCE_NUM;
int m_consumeN};int main(){
Theron::ActorRef producer(framework.CreateActor&Producer&());
Theron::ActorRef consumer(framework.CreateActor&Consumer&());
if (!framework.Send(0, consumer.GetAddress(), producer.GetAddress()))
printf("Failed to send message!n");
// 这里使用 Sleep 来避免主线程结束
// 这样做只是为了简单而并不特别合理
// 在实际的编写中,我们应该使用 Receiver#ifdef _MSC_VER
Sleep(100000);#else
sleep(100);#endif
return 0;}
生产者生产物品,消费者消费物品,它们并行进行,我们没有编写创建线程的代码,没有构建共享,也没有处理线程的同步。这一切都很轻松的完成了。
代价和设计
和传统的多线程程序相比 Theron 有不少优势,通过使用 Actor,程序能够自动的并行执行,而无需开发者费心。Actor 总是利用消息进行,消息必须拷贝,这也意味着我们必须注意到,在利用 Actor 进行并行运算的同时需避免大量消息拷贝带来的额外开销。
Actor 模型强调了一切皆为 Actor,这自然可以作为我们使用 Theron 的一个准则。但过多的 Actor 存在必然导致 Actor 间频繁的通信。适当的使用 Actor 并且结合 Object 模型也许会是一个不错的选择,例如,我们可以对系统进行适当划分,得到一些功能相对独立的模块,每个模块为一个 Actor,模块内部依然使用 Object 模型,模块间通过 Actor 的消息机制进行通信。
Theron 的未来
Theron 是个有趣的东西,也许你没有使用过它,你也不了解 Actor 模型,但是 Actor 的思想却不新鲜,甚至你可能正在使用。目前来说,我还没有找到 Theron 在哪个实际的商业项目中使用,因此对 Theron 的使用还存在一些未知的因素。还有一些特性,诸如跨主机的分布式的并行执行是 Theron 不支持的,这些都限制了 Theron 的使用,不过作者正在积极的改变一些东西(例如,作者表示会在今后添加 Remote Actors)。无论 Theron 未来如何,Theron 以及 Actor 模型带来的思想会让我们更加从容面对多核的挑战。
常州JAVA软件培训——oVirt项目:开源KVM虚拟化管理
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
2012年初,IT专家们就预测随着虚拟化管理行业的整合,异构hypervisor支持与提供更全面的产品那是必须滴。许多企业会运行多个hypervisor环境,这些都会多hypervisor管理工具的需求。&
  由于开源虚拟化技术KVM的高可扩展性、高性能、高安全等优势,已逐渐成为企业级hypervisor。很明显,要部署一个成熟的虚拟化环境,仅仅有hypervisor还是不够的。虚拟化管理越来越重要,既能同时管理主机与子机,以便拥有在多个上开启并管理虚拟机的关键功能,还要有高可用性与虚拟机热迁移等高级功能。&
  oVirt项目是一个开放的虚拟化项目,提供基于的虚拟机管理控制平台,oVirt是KVM开源管理程序,该虚拟机支持主流的x86,并允许用户在其上运行及。无论是一台主机上的几个虚拟机,还是管理数百台主机上的成千个虚拟机。因此,oVirt专门面向那些基于linux系统的KVM虚拟化人群,为主机和客户机提供特性丰富且功能强大的服务器虚拟化管理系统,具体包括高可用性、实时迁移、存储管理、系统调度管理等。&
  2011年11月,红帽、IBM、英特尔、思科、Canonical、NetApp与SUSE赞助成立oVirt社区。其目的是创建一个有活力的开源社区,涵盖虚拟化管理堆栈各个层级,包括hypervisor、管理、图形用户界面、API等,提供一个功能丰富的服务器虚拟化管理系统。为了保持公平,社区的管理是透明的,沿袭的是Apache与等项目的机制。因此oVirt成为各种开放虚拟化项目的保护伞。&
  红帽向oVirt社区贡献了自己的虚拟化管理软件,IBM则捐出了Memory Overcommit Manager。如今,oVirt已是一个全面的生态系统,该系统能够按照已经定义好的发布进度提供功能完备的集成平台,包括经设计和测试之后能够共同工作的众多组件。&
  最近,oVirt社区发布了第二个正式版本oVirt 3.1,其中包括几个重要的更新。现在的安装脚本支持HTTP/HTTPS代理配置;oVirt Engine支持使用远程PostgreSQL数据服务器,还支持使用Red Hat Directory Server与IBM Tivoli Directory Server进行用户认证。此外,在存储、虚拟化与方面都有重大突破。例如,支持热快照、网络适配器热插拔,以及支持从虚拟机访问外部宿主的LUN。&
  同样由红帽、IBM、英特尔等厂商在2011年五月成立的开放虚拟化联盟OVA,它与oVirt有着明显的区别。OVA主要侧重市场,推广围绕着KVM的开放虚拟化,而oVirt侧重社区与技术,专注于开放虚拟化解决方案的虚拟化管理与其他层级的堆栈。&
  现在,oVirt为用户及开发者互助提供了重要场所,并且第一个倡议提出了真正开放和全面的数据中心虚拟化管理。 据悉,第七个oVirt研讨会将于2013年三月在上海举行,由英特尔主办。
常州JAVA软件培训——XML定制超越传统界限的开放XML
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
 美国联邦地方法院的法官裁定,得克萨斯州微软违反了一个相关专利的案件,微软侵犯了一个小的加拿大公司i4i所持有的专利的判决似乎成为了威胁微软和开源社区的潜在因素。
  作为裁决,微软被禁止"销售,提供销售,和/或进口或进入美国任何侵犯和未来的Word的产品有能力开放.DOCX或.DOCM文件( '一个XML档案' )其中载有的自定义XML 。 "微软被允许在60天的时间内来清除掉微软Word 2003和Microsoft Word 2007中侵犯i4i的专利的这两个假定。
  这起诉讼也可能会影响到开源社区,尤其是基于XML的OpenFocument格式( ODF格式)在开放的替代品的电子表格,文字处理和其他生产力应用。虽然XML是一种公共领域格式, ODF格式并不违反"自定义XML "中详述i4i的专利,但也存在即将发布的ODF1.2版本的格式可能有法律障碍,因为它理应包含的XML定制超越传统界限的开放XML 。
  尽管政府已经宣布了判决,但微软仍有几个可以逃脱i4i0诉讼的方法。
  首先,微软可以简单地删除或禁用违规代码,这将使目前版本的Word能够出售。它还可以使用自己的技术进行替代,。 8月4日,美国专利和商标局颁发的微软7571169专利,其中描述了一个"存储在一个单一的XML文件的文字处理文件可以操纵的,这一软件可以读取XML 。 "通过将这一软件插入无论目前或未来版本的Word将使它们可能绕过裁决。
  即使有了这个技术,微软处理针对它的裁决,目前的花费也接近3亿美元。在一份声明中对eWeek杂志访问时,一位微软发言人表示,该公司打算上诉,这可能会持续多年。
  一位分析师认为, i4i专利技术很快就可以所取代微软自己的XML专利技术。
  "我的快速采方案的是: i4i是一个制造XML的Word插件的相当小的公司,是能做到这一点的4~5个供应商中的一个,这是微软继续添加XML功能到Word 的过程中的一个微软" IDC的分析师Melissa&ster在一封电子邮件中写道。 "我不能评论i4i专利侵权索赔的有效性,但微软肯定是一个有吸引力的诉讼目标, 因为他非常非常财大气粗。 "
  "对于Open.org来说,事实刚好相反"Webster说。
  实际上,尽管开源社区可以确保未来的版本的ODM不包括任何将其放置在违反i4i的专利问题上的代码,但由于一些含糊不清的属性,社区也将屏蔽其代码以避免潜在诉讼。
  这一裁决可能是i4i的一个早期胜利,但有迹象表明,这一问题可能会持续很多个月。
常州JAVA软件开发——Linux 用户进程向系统中断调用过程传递参数
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
咨询QQ: 关于用户进程向系统中断调用过程传递参数方面,Linux系统使用了通用寄存器传递方法,例如寄存器ebx、ecx和edx。这种使用寄存器传递参数方法的一个明显优点就是:当进入系统中断服务程序而保存寄存器值时,这些传递参数的寄存器也被自动地放在了内核态堆栈上,因此用不着再专门对传递参数的寄存器进行特殊处理。这种方法是Linus当时所知的最简单最快速的参数传递方法。另外还有一种使用Intel&提供的系统调用门(System Call Gate)的参数传递方法,它在进程用户态堆栈和内核态堆栈自动复制传递的参数。但这种方法使用起来步骤比较复杂。  另外,在每个系统调用处理函数中应该对传递的参数进行验证,以保证所有参数都合法、有效。尤其是对用户提供的指针,应该严格地进行审查,以保证指针所指的区域范围有效,并且具有相应的读写权限。
常州JAVA软件培训——USB设备的Bulk模式驱动程序设计
欢迎参加东方博宜软件开发工程师培训!&&课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&&咨询热线:8&&网址:&咨询QQ: 摘要 本文介绍了USB设备Bulk模式程序的设计。该设计使用FIFO消息队列、信号量机制和定时器中断机制,可在不同的中实现。文中所用到的程序体系结构对于实现不同USB设备进行Bulk模式通讯是通用的。
  关键词 USB;Bulk模式;驱动设计
  通用串行总线(USB)是一种串行接口,具有自动配置能力和良好的兼容性,从而简化了计算机与外设的连接,被计算机外设制造商广泛采纳。USB总线标准由1.1版升级到2.0版后,传输率由12Mbps增加到了480Mbps,更适宜于高速数据传输。USB设备支持打印机、扫描仪、等外设时,由于这些外设与主机间传输的数据量大,要求驱动程序采用Bulk模式进行高速数据传输。
  USB设备驱动的整体结构
  USB设备驱动的整体结构包括如下五个主要部分:USB应用程序接口、USB设备驱动函数、USB中断服务程序、USB回调接口程序、USB标准事件处理程序。
图1 USB设备驱动程序的整体结构
  USB应用程序接口
  USB应用程序接口主要功能是对USB驱动器进行软硬件初始化、打开端口、关闭端口、读端口、写端口和端口控制操作。当设备驱动器装入系统设备表时,I/O系统就调用该应用程序接口。
  USB应用程序接口的一个例程所包含的函数:
  &USB_init( ) -- USB端口驱动函数的安装和初始化、硬件配置。
  &USB_open( ) -- 打开USB端口。
  &USB_close( ) -- 关闭USB端口。
  &USB_read( ) -- 对USB端口进行读操作。
  &USB_write( ) -- 对USB端口进行写操作。
  &USB_ioctl( ) -- 对USB设备进行I/O控制操作。
  USB设备驱动函数
  1、USB_init()-- 初始化USB端口
  USB_init函数初始化特定USB端口驱动器,进行软硬件配置。
  初始化步骤如下:
  (1) 将USB设备驱动器安装到I/O系统设备表中。
  (2) 获取USB控制器使用的中断号。
  (3) 获取各端口所需的系统资源,包括、信号量和消息队列。
  (4) 初始化USB驱动器数据结构与USB端口状态寄存器。
  (5) 启动USB标准事件处理程序。
  (6) 启用控制端口0和USB中断最小支持集。
  2、USB_open()-- 打开USB端口
  USB_open函数允许应用程序打开一个USB端口,选择DMA数据传输方式。
  执行打开调用的典型步骤如下:
  (1) 如果不是默认的控制端口0,要检查端口状态是否为"CONFIGURED"。
  (2) 如果不允许多次打开,要确认端口还没有打开。
  (3) 确认端口对当前选择的接口有效。
  (4) 选择DMA传输,设置DMA控制器使用该端口的FIFO作为目的地址。
  (5) 设置端口为打开状态。
  3、USB_close()-- 关闭USB端口
  USB_close函数允许USB应用程序关闭一个端口,并关闭DMA通道。
  执行关闭调用的典型步骤为:
  (1) 关闭DMA通道,放弃端口对DMA控制器的使用。
  (2) 设置端口为关闭状态。
  4、USB_read()-- 对USB端口进行读操作
  USB_read函数允许USB应用程序从输出端口或控制端口读取数据。
  调用读函数的典型步骤为:
  (1) 设置端口号、类型和方向。
  (2) 确认端口处于打开状态。
  (3) 设置端口信号量,避免多次调用。
  (4) 调用readDMA( ) 进行DMA写操作。函数内执行步骤为:
   (a) 启动DMA从端口接收FIFO的读操作,将数据从端口传送到内存。
   (b) 等待DMA完成中断。(DMA中断向端口消息队列发送一条消息表示数据传输完成。)
   (c) 重复进行(a)~(c)步骤直至接收到全部数据或USB主机结束传输。如果USB控制器检测到短包中断或零字节包,或者出现等待超时,则停止DMA传送,并转(d)步骤执行。
   (d) 向USB主机发送一个零字节包,完成控制状态步骤。
  (5) 释放端口信号量。
  (6) 返回接收到的字节数或错误信息。
  5、USB_write()-- 对USB端口进行写操作
  USB_write函数允许USB应用程序写数据到输入端口或控制端口。
  执行写调用的典型步骤为:
  (1) 确认端口号、类型和方向。    (2) 确认端口处于打开状态。
  (3) 获取端口信号量,避免多次调用。
  (4) 调用writeDMA( )进行DMA写操作。函数内执行步骤为:
   (a) DMA将内存数据传送到目标端口的FIFO,并等待DMA完成中断。
   (b) 若从接收FIFO接收到USB主机的一个零字节包,或者出现等待超时,则退出并返回传输的字节数。
   (c) 重复执行(a)~(c)步骤直至全部数据传输完毕时,转(d)步骤执行。
   (d) 强制向USB主机发送最后的零字节包或短包用来结束传输过程。
  (5) 如果是控制端口,等待来自USB主机的零字节包,完成控制状态步骤。
  (6) 释放端口信号量。
  (7) 返回传输的字节数或错误信息。
  6、USB_ioctl()-- 对USB设备进行I/O控制操作
  USB_ioctl函数设置端口状态寄存器并执行I/O端口控制功能。
  USB应用程序根据控制对象不同分别调用提供应用程序控制USB接口的能力的controlIoctl()和epIoctl()函数。controlIoctl()函数执行USB控制器整体I/O出控制功能。epIoctl()函数执行个别USB端口的I/O控制功能。。
  1) controlIoctl( ) -- 控制器控制函数
  controlIoctl()函数对USB控制器进行控制操作。执行I/O功能之前获取USB控制器信号量,避免多次调用影响正在传输数据的端口。完成I/O操作后释放信号量。
  USB控制器应支持的控制功能包括:
  &支持远程唤醒功能。
  &设置USB端口进入/退出挂起状态。
  &复位USB端口。
  &设置USB控制器消息队列等待超时。
  &为DMA选择端口FIFO。
  &允许/禁止可选中断。
  &读取帧时间戳起始位。
  &进行枚举测试。
  &返回接口、备用接口和当前USB端口配置状态。
  2) epIoctl() -- 端口控制函数
  epIoctl()函数对端口进行控制操作。执行I/O功能之前获取USB控制器信号量,避免多次调用影响正在传输数据的端口。完成I/O操作后释放信号量。
  端口应支持的控制功能包括:
  (1) 获得USB端口状态。
  (2) 设置USB端口进入/退出阻塞状态。
  (3) 设置USB端口消息队列等待超时。
  USB中断服务程序
  USB控制器产生单一中断,多个端口共享。每个端口产生ACK、NACK/ERROR中断。输出端口产生接收零字节包或短包中断。控制端口0接收设置包时产生中断。USB控制器产生USB事件中断,如帧起始(SOF)、挂起、恢复和复位。
  USB中断服务程序执行下列步骤:
  (1) 识别发生了USB中断的类型。
  (2) 清除中断产生的条件。
  (3) 读USB状态寄存器,获取当前配置、接口或帧起始时间戳状态信息。
  (4) 向USB控制器消息队列或回调函数的接收消息队列发送一条消息。
  USB标准事件处理程序
  USB器初始化后,启动USB标准事件处理程序负责处理枚举过程和异步USB事件。
  事件处理程序使用控制端口0,直到完成枚举过程。当USB应用程序处于非活动状态时,除控制端口0以外端口均不可访问。事件处理程序在端口0上执行控制操作,响应USB标准请求,并负责通知USB应用程序枚举完成和接口活动状态,USB事件通过回调接口传递到USB外设应用程序。当对USB端口枚举操作完成,USB应用程序就可打开并使用USB端口。
  处理一个USB任务的执行过程为:
  (1) 读取USB控制器消息队列。
  (2) 如果接收到设置包,则调用标准请求处理函数。
  (3) 如果接收到事件,则调用USB事件处理函数。
  (4) 确定当前状态和有效配置/接口。
  (5) 更新USB控制器和端口数据结构。
  (6) 重复(1)~(5)步骤。
  USB回调接口程序
  回调应用程序接口是向应用程序提供反馈信息的一种接口,包括向应用程序通知USB事件的消息,如复位、配置改变、接口改变、挂起、恢复和帧起始。使用USB的应用程序要以下列方式回应这些消息:
  (1) 复位 关闭端口,等待枚举测试。
  (2) 配置改变 关闭端口,按新配置打开端口。
  (3) 接口改变 关闭端口,从新接口打开端口。
  (4) 挂起 进入低功耗模式。
  (5) 恢复 退出低功耗模式。
  (6) 帧起始 执行应用程序规定的处理。
  本文提供了进行USB端口Bulk模式驱动程序设计的过程,实现在USB接口设备与Host主机之间进行高速数据传输,对于嵌入式环境以及多线程环境下的USB设备的高速数据传输同样适用。
常州JAVA软件培训——JBI-Java 实现 SOA 的标准途径
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
咨询QQ:  本文简短地阐述了即将到来的与 SOA (面向服务体系)规范及 ESB (企业服务总线)基础架构有关的 JBI (&业务集成)标准。正在广泛寻求解决 B2B 以及 EAI (企业应用集成)所存在问题的方案。这些方案不同于基于 JMS 手段的面向消息中间件技术和&&服务技术。  面向服务体系  SOA (面向服务体系)是近期推动应用和业务集成领域产生巨大飞跃的新技术之一。 SOA 定义了一系列详尽的体系规范、范例和实现应用程序间进行松散耦合交互的最佳准则。  SOA 基于定义明确的接口,促进多个应用程序间的松散耦合交互。服务的实现是独立的,且不依赖上下文信息以及其他服务的状态。服务间数据交换主要基于文本类型的格式,使用基于标准的消息模型。服务自身并不知道服务提供者和服务消费者之间传输级的通讯交互。  尽管不是强制要求,当今大部分流行的基于 SOA 的系统都利用了 Web 服务以及近似技术为服务间交互提供必要的管道管理。 WSDL ( Web 服务定义语言)扮演了主要的通讯模型角色; SOAP 扮演了消息承载协议、 HTTP 扮演了传输协议。当然,这并不意味着你必须利用上述技术实现基于 SOA 的系统。另外,有些术语之前就已经存在了,所以很多企业已利用类似的体系实现了系统的松散耦合交互。不管怎样,主要的不同点在于我们现在已经有标准协议、工具集和了,使面向服务体系更健全。  SOA 原则与面向对象范式、原则有着显著不同。主要不同在于服务间交互的接口被定义了更多面向数据的行为。一个孤立的服务也许会采用面向对象原则和技术,但是,服务之间的交互很少采用这些手段。相反,这些接口更适合于基于文档的交换。面向对象的行为是绑定数据,而面向服务从行为中分离数据。  企业服务总线  ESB (企业服务总线)为面向服务体系提供了基础架构。通过设计工具定义服务间交互和规则, ESB 为部署和发现服务提供了运行时环境。    在 ESB 的世界中,服务不会直接彼此交互。& ESB 运行时&作为一个仲裁者在服务间松散的耦合它们。& ESB 运行时&将实现协议绑定、消息传输、消息处理,等等。  一个服务总线将包括下列关键项:  &为服务提供传输绑定  &定义和发现已部署服务  &在服务间基于规则的路由和编排消息  &包括文档传递在内的增值服务等  大部分的 ESB 提供商基于自己的 SOA 提议来开放标准和技术,包括多种 Web 服务标准和协议。他们提供多种调用服务的传输绑定,包括 HTTP 、 FTP 以及 JMS 等等。大部分 ESB 用户利用 WS-BPEL ( Web 服务的业务流程执行语言)来了解已部署服务之间是如何实现业务流程的。 ESB 提供商同时也提供服务质量特性,包括容错、故障转移、负载平衡、消息缓冲等等。  Java 业务集成  JBI ( Java 业务集成)的提出是基于面向服务体系提倡的方法和原则,为了解决 EAI 和 B2B 若干问题的 Java 标准。当前版本( 1.0 )是 2005 年 8 月通过的 JSR ( Java 规范需求) 208 定案。商业和开源界都欢迎 JBI 成为他们 ESB 产品的集成标准。  基于仲裁者体系  JBI 定义了基于插件方式的架构,以便服务能融入& JBI 运行时&环境。 JBI 提供了详细的接口,使服务能与& JBI 运行时&环境交互。这些服务要为& JBI 运行时&环境暴露接口,以便& JBI 运行时&环境为服务路由消息。& JBI 运行时&环境在部署在 SOA 环境中的服务间扮演仲裁者的角色。    在同一 JVM 中,& JBI 运行时&核心主要包括如下组件:  &组件框架:组件框架把不同类型的组件部署到& JBI 运行时&。  &归一化消息路由器:归一化消息路由器利用标准机制实现服务间消息交换。  &管理框架:管理框架基于 JMX 进行部署、管理以及监控& JBI 运行时&中的组件。  组件模型  JBI 在& JBI 运行时&环境中定义了两种组件:  服务引擎组件:该组件负责实现业务逻辑和其他服务。服务引擎组件在其内部可使用多种技术和设计模式。服务引擎组件可提供数据传输和转换这种简单的基础服务,也可实现像 WS-BPEL 实例一样复杂的业务处理。  绑定组件:绑定组件主要为已部署服务提供传输级绑定。绑定组件有多种类型:  &利用标准传输协议与外部系统进行远程通讯。  &使已部署服务能在同一个 JVM 内部相互调用。  &服务间可使用标准的 WS-I ( Web 服务协同工作组织)规范通讯。  JBI 的关键是分离服务引擎和绑定组件,以便业务逻辑不被下面的具体细节所干扰。这种方式促进了体系的灵活性和可扩展性。绑定组件和服务引擎组件在 JBI 内部都可以是服务提供者和 / 或服务消费者。  绑定组件和服务引擎组件为& JBI 运行时&提供接口以便从& JBI 运行时&接收消息。同样的,它们也利用 JBI 提供的接口来和& JBI 运行时&通讯。  消息传输模型  JBI 利用消息传输模型分离服务提供者和服务消费者之间的耦合。消息传输模型利用了 WSDL 。 WSDL 用于描述暴露的服务引擎组件和绑定组件的业务处理。另外, WSDL 也用于定义抽象服务处理的传输级绑定。  JBI 架构中一个关键组件是 NMR (归一化消息路由器,也译作&正规消息路由器&)。 NMR 基于 WSDL 提供了主要的消息传输中枢, NMR 为部署在& JBI 运行时&中的服务引擎组件和绑定组件间的消息传递提供松散耦合。服务需要有聚合业务处理的接口,每个业务处理由零个或多个消息组成。而一个接口有一个或多个传输级绑定。  & JBI 运行时&利用归一化格式描述消息。一个归一化消息由以下部分组成:  &消息属性  &消息有效载荷  &消息附件  利用 NMR , JBI 规范为服务提供者和消费者的消息交换提供标准接口。 NMR 支持服务生产者和消费者之间单向模式和服务响应模式的调用。  管理  JBI 利用 JMX 实现运行时的服务安装、配置和监控。服务必须实现 JBI 接口集,以便这些服务在 JBI 环境中是可管理的。 JBI 环境必须提供一套 JMX MBeans 实现& JBI 运行时&的管理。  & JBI 运行时&环境允许服务引擎组件和绑定组件的相关操作如下:  &安装组件:使组件接口可使用归一化消息路由器。  &安装 artefact 组件:这将允许已部署的 artefacts 组件获得与已安装组件同样的机能。例如,可以部署一个&连接服务&来提供具体的连接。  启动、停止服务以及进行相关服务分组。  JBI 为组件及 artefact 组件定义了标准的部署描述符以及打包模型。  角色  JBI 为基于 JBI 的端到端 EAI&定义了如下角色:  &引擎开发者:引擎开发者提供遵循 NMR 和管理约束的服务引擎组件。  &绑定开发者:绑定开发者提供遵循 NMR 和管理约束的绑定组件。  &JBI 环境提供者: JBI 环境提供者为& JBI 运行时&使用&&1.4 或&&1.4 或更新的平台提供支持。  &J2EE 平台提供者: J2EE 平台提供者把& JBI 运行时&作为提供应用程序服务的一部分。  &JBI 应用程序开发者: JBI 应用程序开发者利用服务引擎组件、绑定组件以及 JBI 环境构建 JBI 应用程序。
常州JAVA软件开发——SQL Server 数据类型
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
咨询QQ:1.&的数据类型数据类型是数据的一种属性,表示数据信息的类型,任何一种计算机语言都定义了自己的数据类型。当然,不同的程序语言都具有不同的特点,所定义的数据类型的各类和名称都或多或少有些不同。SQLServer 提供了 25 种数据类型:  &Binary [(n)]  &Varbinary [(n)]  &Char [(n)]  &Varchar[(n)]  &Nchar[(n)]  &Nvarchar[(n)]  &Datetime  &Smalldatetime  &Decimal[(p[,s])]  &Numeric[(p[,s])]  &Float[(n)]  &Real  &Int  &Smallint  &Tinyint  &Money  &Smallmoney  &Bit  &Cursor  &Sysname  &Timestamp  &Uniqueidentifier  &Text  &Image  &Ntext(1) 二进制数据类型二进制数据包括 Binary、Varbinary 和 Image  Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。  Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存存储的大小是 n + 4 个字节。  Varbinary[(n)] 是 n 位变长度的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储的大小是 n + 4个字节,不是n 个字节。  在 Image 数据类型中存储的数据是以位字符串存储的,不是由 SQL Server 解释的,必须由应用程序来解释。例如,应用程序可以使用BMP、TIEF、GIF 和 JPEG 格式把数据存储在 Image 数据类型中。(2) 字符数据类型字符数据的类型包括 Char,Varchar 和 Text  字符数据是由任何字母、符号和数字任意组合而成的数据。  Varchar 是变长字符数据,其长度不超过 8KB。Char 是定长字符数据,其长度最多为 8KB。超过 8KB 的ASCII 数据可以使用Text数据类型存储。例如,因为 Html 文档全部都是 ASCII 字符,并且在一般情况下长度超过 8KB,所以这些文档可以 Text 数据类型存储在SQL Server 中。(3) Unicode 数据类型Unicode 数据类型包括 Nchar,Nvarchar 和Ntext  在 Microsoft SQL Server 中,传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。在 SQL Server安装过程中,允许选择一种字符集。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用Unicode数据类型,是使用非 Unicode 数据类型所占用大小的两倍。&  在 SQL Server 中,Unicode 数据以 Nchar、Nvarchar 和 Ntext 数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用Nvarchar 字符类型,这时最多可以存储 4000 个字符。当列的长度固定不变时,应该使用 Nchar 字符类型,同样,这时最多可以存储4000 个字符。当使用 Ntext 数据类型时,该列可以存储多于 4000 个字符。(4) 日期和时间数据类型日期和时间数据类型包括 Datetime 和 Smalldatetime日期和时间数据类型由有效的日期和时间组成。例如,有效的日期和时间数据包括&4/01/98 12:15:00:00:00 PM&和&1:28:29:15:01AM 8/17/98&。前一个数据类型是日期在前,时间在后一个数据类型是霎时间在前,日期在后。在 Microsoft SQL Server中,日期和时间数据类型包括Datetime 和 Smalldatetime 两种类型,Datetime所存储的日期范围是从 1753 年 1 月 1 日开始,到9999 年12 月 31 日结束(每一个值要求 8 个存储字节)。 Smalldatetime所存储的日期范围是 1900年 1 月 1日 开始,到 2079 年 12 月 31 日结束(每一个值要求 4 个存储字节)。  日期的格式可以设定。设置日期格式的命令如下:  Set DateFormat {format | @format _var|  其中,format | @format_var 是日期的顺序。有效的参数包括 MDY、DMY、YMD、YDM、MYD 和 DYM。在默认情况下,日期格式为MDY。  例如,当执行 Set DateFormat YMD 之后,日期的格式为年 月 日 形式;当执行 Set DateFormat DMY 之后,日期的格式为日 月有年 形式(5)数字数据类型数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数整数由正整数和负整数组成,例如 39、25、0-2 和 33967。在 Micrsoft SQL Server 中,整数存储的数据类型是 Int,Smallint和 TinyintInt 数据类型存储数据的范围大于Smallint 数据类型存储数据的范围,而Smallint 类型存储数据的范围大于Tinyint 类型存储数据的范围。使用 Int 数据狗昔存储数据的范围是从 -2 147 483 648 到 2 147 483 647(每一个值要求4个字节存储空间)。使用 Smallint 数据类型时,存储数据的范围从 -32 768 到 32 767(每一个值要求2个字节存储空间)。使用Tinyint 数据类型时,存储数据的范围是从0 到255(每一个值要求1个字节存储空间)。  精确小娄数据在 SQL Server 中的数据类型是 Decimal 和 Numeric。这种数据所占的存储空间根据该数据的位数后的位数来确定。  在SQL Server 中,近似小数数据的数据类型是 Float 和 Real。例如,三分之一这个分数记作。3333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。(6)货币数据表示正的或者负的货币数量 。在 Microsoft SQL Server 中,货币数据的数据类型是Money 和 SmallmoneyMoney数据类型要求 8 个存储字节,Smallmoney 数据类型要求 4 个存储字节。(7)特殊数据类型特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有3种,即 Timestamp、Bit 和 Uniqueidentifier。  Timestamp 用于表示SQL Server 活动的先后顺序,以二进投影的格式表示。Timestamp 数据与插入数据或者日期和时间没有关系。  Bit 由 1 或者 0 组成。当表示真或者假、ON 或者 OFF 时,使用 Bit 数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。  Uniqueidentifier 由 16 字节的十六进制数字组成,表示一个全局唯一的。当表的记录行要求唯一时,GUID是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。2. 用户定义的数据类型用户定义的数据类型基于在 Microsoft SQL Server 中提供的数据类型。当几个表中必须存储同一种数据类型时,并且为保证这些列有相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。例如,可定义一种称为   postal_code 的数据类型,它基于 Char 数据类型。  当创建用户定义的数据类型时,必须提供三个数:数据类型的名称、所基于的系统数据类型和数据类型的可空性。(1)创建用户定义的数据类型创建用户定义的数据类型可以使用 Transact-SQL 语句。系统存储过程 sp_addtype 可以来创建用户定义的数据类型。其语法形式如下:  sp_addtype {type},[,system_data_bype][,'null_type']  其中,type 是用户定义的数据类型的名称。system_data_type 是系统提供的数据类型,例如 Decimal、Int、Char   等等。 null_type 表示该数据类型是如何处理空值的,必须使用单引号引起来,例如'NULL'、'NOT NULL'或者'NONULL'。  例子:  Use cust  Exec sp_addtype ssn,'Varchar(11)',"Not Null'  创建一个用户定义的数据类型 ssn,其基于的系统数据类型是变长为11 的字符,不允许空。  例子:  Use cust  Exec sp_addtype birthday,datetime,'Null'  创建一个用户定义的数据类型 birthday,其基于的系统数据类型是 DateTime,允许空。  例子:  Use master  Exec sp_addtype telephone,'varchar(24),'Not Null'  Eexc sp_addtype fax,'varchar(24)','Null'  创建两个数据类型,即 telephone 和 fax(2)删除用户定义的数据类型  当用户定义的数据类型不需要时,可删除。删除用户定义的数据类型的命令是 sp_droptype {'type'}。  例子:  Use master  Exec sp_droptype 'ssn'  注意:当表中的列还正在使用用户定义的数据类型时,或者在其上面还绑定有默认或者规则时,这种用户定义的数据类型不能删除。3.&的字段类型说明  以下为SQL SERVER7.0以上版本的字段类型说明。SQL SERVER6.5的字段类型说明请参考SQL SERVER提供的说明。
字段类型描述
bit0或1的整型数字
int从-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型数字
smallint从-2^15(-32,768)到2^15(32,767)的整型数字
tinyint从0到255的整型数字
decimal从-10^38到10^38-1的定精度与有效位数的数字
numericdecimal的同义词
money从-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的货币数据,最小货币单位千分之十
smallmoney从-214,748.8.3647的货币数据,最小货币单位千分之十
float从-1.79E+308到1.79E+308可变精度的数字
real从-3.04E+38到3.04E+38可变精度的数字
datetime从日到的日期和时间数据,最小时间单位为百分之三秒或3.33毫秒
smalldatetime从日到日的日期和时间数据,最小时间单位为分钟
timestamp时间戳,一个宽度的唯一数字
uniqueidentifier全球唯一标识符GUID
char定长非Unicode的字符型数据,最大长度为8000
varchar变长非Unicode的字符型数据,最大长度为8000
text变长非Unicode的字符型数据,最大长度为2^31-1(2G)
nchar定长Unicode的字符型数据,最大长度为8000
nvarchar变长Unicode的字符型数据,最大长度为8000
ntext变长Unicode的字符型数据,最大长度为2^31-1(2G)
binary定长二进制数据,最大长度为8000
varbinary变长二进制数据,最大长度为8000
image变长二进制数据,最大长度为2^31-1(2G)
常州JAVA软件开发——Linux 系统安装CentOS 5.x与多重引导小技巧
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
&distributions越来越成熟,所以在安装方面也越来越简单。虽然安装非常简单,但是刚才前一章所谈到的基础知识还是需要了解的,包括MBR、partition、boot loader、mount、software的选择等数据。这一章鸟哥的安装定义为"一台练习机",所以安装的方式都是以最简单的方式来处理的。另外,鸟哥选择的是CentOS 5.x的版本来安装。在内文中,只要标题内含有(Option)的,代表是鸟哥额外的说明,你应该看看就好,不需要实践。
常州JAVA软件培训——Windows键盘事件监控原理及应用 [
欢迎参加东方博宜软件开发工程师培训!&&课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&&咨询热线:8&&网址:&咨询QQ:
的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种反调函数(HOOK)的功能。这种挂钩函数(HOOK)类似扩充中断程序,挂钩上可以挂接多个反调函数构成一个挂接函数链。系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交还控制权或将消息传递给下一个挂接函数以致最终达到窗口函数。WINDOW系统的这种反调函数挂接方法虽然会略加影响到系统的运行效率,但在很多场合下是非常有用的,通过合理有效地利用事件的挂钩函数监控机制可以达到预想不到的良好效果。
  一、在键盘事件上挂接监控函数的方法WINDOW下可进行挂接的过滤函数包括11种:
  WH_CALLWNDPROC窗口函数的过滤函数WH_CBT计算机培训过滤函数WH_DEBUG调试过滤函数WH_GETMESSAGE获取消息过滤函数WH_HARDWARE消息过滤函数WH_JOURNALPLAYBACK消息重放过滤函数WH_JOURNALRECORD消息记录过滤函数WH_MOUSE过滤函数WH_MSGFILTER消息过滤函数WH_SYSMSGFILTER系统消息过滤函数WH_KEYBOARD键盘过滤函数其中键盘过滤函数是最常用最有用的过滤函数类型,不管是哪一种类型的过滤函数,其挂接的基本方法都是相同的。
  WINDOW调用挂接的反调函数时总是先调用挂接链首的那个函数,因此必须将键盘挂钩函数利用函数SetWindowsHookEx()将其挂接在函数链首。至于消息是否传递给函数链的下一个函数是由每个具体函数功能确定的,如果消息需要传统给下一个函数,可调用API函数的CallNextHookEx()来实现,如果不传递直接返回即可。
  挂接函数可以是用来监控所有线程消息的全局性函数,也可以是单独监控某一线程的局部性函数。如果挂接函数是局部函数,可以将它放到一个.DLL动态链接库中,也可以放在一个局部模块中;如果挂接函数是全局的,那么必须将其放在一个.DLL 动态链接库中。挂接函数必须严格按照下述格式进行声明,以键盘挂钩函数为例:
  int FAR PASCAL KeyboardProc( int nCode,WORD wParam,DWORD lParam) 其中KeyboardProc为定义挂接函数名,该函数必须在模块定义文件中利用EXPORTS命令进行说明;nCode决定挂接函数是否对当前消息进行处理;wParam和lParam为具体的消息内容。
  二、键盘事件挂接函数的安装与
  在程序中可以利用函数SetWindowsHookEx()来挂接过滤函数,在挂接函数时必须指出该挂接函数的类型、函数的入口地址。
  SetWindowsHookEx(iType,iProc,hInst,iCode) 其中iType为挂接函数类型,键盘类型为WH_KEYBOARD,iProc为挂接函数地址,hInst 为挂接函数链接库实例句柄,iCode为监控代码-0表示全局性函数。
  如果挂接函数需要将消息传递给下一个过滤函数,则在该挂接函数返回前还需要调用一次CallNextHookEx()函数,当需要下载挂接函数时,只要调用一次UnhookWindowsHookEx(iProc)函数即可实现。
  如果函数是全局性的,那么它必须放在一个.DLL动态链接库中,这时该函数调用方法可以和其它普通.DLL函数一样有三种:
  1.在DEF定义文件中直接用函数名或序号说明:
  EXPORTS WEP @1 RESIDENTNAME InitHooksDll @2 InstallFilter @3 KeyboardProc @4 用序号说明格式为:链接库名.函数名(如本例中说明方法为KEYDLL.KeyboardProc)。
  2.在应用程序中利用函数直接调用:
  首先在应用程序中利用LoadLibrary(LPSTR "链接库名")将动态链接库装入,并取得装载库模块句柄hInst,然后直接利用GetProcAddress(HINSTANCE hInst,LPSTR "函数过程名")获取函数地址,然后直接调用该地址即可,程序结束前利用函数FreeLibrary( )释放装入的动态链接库即可。
  3.利用输入库.LIB方法利用IMPLIB.EXE程序在建立动态链接库的同时建立相应的输入库.LIB,然后直接在项目文件中增加该输入库。
  三、WINDOWS挂钩监控函数的实现步骤
  Windows挂钩函数只有放在动态链接库DLL中才能实现所有事件的监控功能。在.DLL 中形成挂钩监控函数基本方法及其基本结构如下:
  1、首先声明DLL中的变量和过程;
  2、然后编制DLL主模块LibMain(),建立模块实例;
  3 、建立系统退出DLL机制WEP()函数;
  4 、完成DLL初始化函数InitHooksDll(),传递主窗口程序句柄;
  5 、编制挂钩安装和下载函数InstallFilter();
  6 、编制挂钩函数KeyboardProc(),在其中设置监控功能,并确定继续调下一个钩子函数还是直接返回WINDOWS应用程序。
  7 、在WINDOWS主程序中需要初始化DLL并安装相应挂钩函数,由挂接的钩子函数负责与主程序;  
  8 、在不需要监控时由下载功能卸掉挂接函数。
  四、WINDOWS下键盘挂钩监控函数的应用技术
  目前标准的104键盘上都有两个特殊的按键,其上分别用WINDOW程序徽标和鼠标下拉列表标识,本文暂且分别称为Micro左键和Micro右键,前者用来模拟鼠标左键激活开始菜单,后者用来模拟鼠标右键激活属性菜单。这两个特殊按键只有在按下后立即抬起即完成CLICK过程才能实现其功能,并且没有和其它按键进行组合使用。
  由于WINDOWS系统中将按键划分得更加详细,使应用程序中很难灵活定义自己的专用快捷键,比如在开发.IME等应用程序时很难找到不与WORD8.0等其它应用程序冲突的功能按键。如果将标准104键盘中的这两个特殊按键作为模拟CTRL和ALT等专用按键,使其和其它按键组合,就可以在自己的应用程序中自由地设置专用功能键,为应用程序实现各种功能快捷键提供灵活性。正常情况下WINDOWS键盘事件驱动程序并不将这两个按键的消息进行正常解释,这就必须利用键盘事件的挂钩监控函数来实现其特定的功能。其方法如下:
  1、首先编制如下一个简单动态链接库程序,并编译成DLL文件。
#include "windows.h" int FAR PASCAL LibMain(HANDLE hModule,UINT wDataSeg, UINT cbHeapSize,LPSTR lpszCmdLine); int WINAPI WEP(int bSystemExit); int WINAPI InitHooksDll(HWND hwndMainWindow); int WINAPI InstallFilter(BOOL nCode); LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam); static HANDLE hI // 全局句柄 static HWND hWndM // 主窗口句柄 static int InitCalled=0; // 初始化标志 static HHOOK hKeyH FARPROC lpfnKeyHook=(FARPROC)KeyH BOOL HookStates=FALSE; int FAR PASCAL LibMain(  HANDLE hModule,  UINT wDataSeg,  UINT cbHeapSize,  LPSTR lpszCmdLine)  {   if (cbHeapSize!=0) UnlockData(0);   hInstance = hM   return 1;  }  int WINAPI WEP (int bSystemExit)  { return 1;}  int WINAPI InitHooksDll(HWND hwndMainWindow)  { hWndMain = hwndMainW   InitCalled = 1;   return (0);  }  int WINAPI InstallFilter(BOOL nCode)  { if (InitCalled==0) return (-1);   if (nCode==TRUE) {    hKeyHook=SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)lpfnKeyHook,hInstance,0);    HookStates=TRUE;   } else {    UnhookWindowsHookEx(hKeyHook);    HookStates=FALSE;   }   return(0);  }  LRESULT CALLBACK KeyHook(int nCode,WORD wParam,DWORD lParam)  {   static BOOL msflag=FALSE;   if(nCode$#@62;=0) {    if(HookStates==TRUE){     if((wParam==0xff)|| file://WIN3.X下按键值      (wParam==0x5b)||(wParam==0x5c)){//WIN95下按键值        if((i==0x15b)||(i==0x15c)){ file://按键按下处理        msflag=TRUE;        PostMessage(hWndMain,0x7fff,0x1,0x3L);       } else if((i==0xc15b)||(i==0xc15c)){//按键抬起处理       msflag=FALSE;       PostMessage(hWndMain,0x7fff,0x2,0x3L);     }    }   }  }  return((int)CallNextHookEx(hKeyHook,nCode,wParam,lParam)); }
  该程序的主要功能是监控键盘按键消息,将两个特殊按键Micro按下和抬起消息转换成自定义类型的消息,并将自定义消息发送给应用程序主窗口函数。
  2、在应用程序主函数中建立窗口后,调用InitHooksDll()函数来初始化动态链接库,并将应用程序主窗口句柄传递给链接库,然后调用InstallFilter()函数挂接键盘事件监控回调函数。
  InitHooksDll(hIMEWnd); file://初始化DLL
  InstallFilter(TRUE); file://安装键盘回调函数
  3、在应用程序主窗口函数处理自定义消息时,保存Micro按键的状态,供组合按键处理时判断使用。
switch (iMessage) {  case 0x7fff: file://自定义消息类型   if(lParam==0x3L){//设置Micro键的状态   if(wParam==0x1) MicroFlag=TRUE;   else if(wParam==0x2) MicroFlag=FALSE; }
  4、在进行按键组合处理时,首先判断Micro键是否按下,然后再进行其它按键的判断处理。
case WM_KEYDOWN: // 按键按下处理
if(MicroFlag==TRUE){//Micro键按下
if((BYTE)HIBYTE(wParam)==0x5b){
//Micro+"["组合键
......//按键功能处理
} else if((BYTE)HIBYTE(wParam)==0x5d){
//Micro+"]"组合键
......//按键功能处理
  5、当应用程序退出时应注意下载键盘监控函数,即调用InstallFilter(FALSE)函数一次。
  6、利用本文提供的方法设置自己的应用程序功能按键,在保证程序功能按键不会与其它系统发生冲突的同时,有效地利用了系统中现有资源,而且在实现应用程序功能的同时灵活应用了系统中提供的各种功能调用。
常州JAVA软件培训——忘记phpmyadmin密码的修复方法
欢迎参加东方博宜软件开发工程师培训!&&课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&&咨询热线:8 &网址:&咨询QQ:今天调试程序,发现phpmyadmin的密码忘记了,进不去后台。可以用以下方法修复密码:  如果你为bugfree单独设置过用户,而又忘记了&root账号密码的话,可以通过下面的方式来解决:  1. 停掉mysql的服务。  2. 以无认证模式启动mysql  d:greenampmysqlinmysqld-nt &skip-grant-table  3. 更改mysql的密码  mysql& use mysql  mysql& Update user SET password=password('123456') Where user='root';  mysql& FLUSH PRIVILEGES;  mysql& exit  4.停掉mysql,然后再正常启动mysql就可以了。
常州java软件培训——破解/汇编学习笔记
欢迎参加东方博宜软件开发工程师培训!&&课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&&咨询热线:8&&网址:&咨询QQ:1.循环,用得比较多,也是加密/验证常用的MOV EAX,DWORD PTR SS:[EBP-4] CALL XXXXXXXX
//这一般是取长度TEST EAX,EAX
@@Loop:JBE XXXXXXXX
//长度为0,不做循环 MOV EDX,1
//从第一个开始:程序MOV ECX,DWORD PTR SS:[EBP-4] MOVZX ECX,BYTE PTR DS:[ECX+EDX-1] //取一个字符......
//其它操作,各人有异...INC EDX
//取下一个DEC EAX
JNZ @@Loop
//下一轮&2.取无效地址?
在处理中,经常看到有类似LEA ECX,DWORD PTR DS:[ECX+ECX*2]的句子.心想,怎么可能,这样访问不会出错吗?
不会,原来LEA不会访问地址后才取地址,而是直接取,呵呵,其实这个只是用来做运算:ECX = ECX * 3;&
常州JAVA软件培训——PHP中在字符串中查找某个字符
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
中查找字符有substr()和strstr两个函数来处理,我没事情自己想写个简单的算法,能够从一个字符串中找出一个字符是否存在.代码如下:&?php$str = "aaa";$substr = "a";function check_str($str, $substr){& for ( $i=0; $i&strlen($str); $i++ )&{&& if ($substr == $str[$i])&& {&&&&&&& }&& else&& {&&&&&&&& }& }&}?&
常州JAVA软件培训——超级负载均衡
欢迎参加东方博宜软件开发工程师培训!&
课程特色:课程讲师、上课案例均来自软件公司,课程采用校企合作的模式展开,培养企业需要的软件开发工程师,学校保障学员就业!&
咨询热线:8&&
现有系统中存在的问题:
1. 慢连接、瞬时访问慢。
如果后端新增加机器,cache命中率低,因此响应速度慢,但是能连接上且不超时。如果ui持续访问就会把ui夯住。
如果后端模块某一台机器响应较慢。如果前端持续访问就会被夯住。
能断断续续响应请求,不过速度很慢。造成ui夯住。
3. 混合部署。
多个模块在同一机器上,项目影响。
4. 机器权重。
老机器,性能差;新机器,性能彪悍。因此他们应该承载不同的压力。
5. 跨机房冗余。
后端对cache依赖很高的模块,因为采用的是一致hash算法,如果挂掉一台机器,对另外的机器cache命中率冲击很大。因此希望将对这个机器的请求均衡到另外一个机房。
6. 和c使用同样的策略。
现在php和c希望能使用的策略实际上是有很大的一致。为了避免重复开发,php和c希望采用同样的负载均衡库。
要解决的问题:
设计思路:
1. 根据均衡策略计算出的均衡值对Server进行逆序排序。
2. 负载选择。对步骤1排序后的Server按以下顺序进行选择:
a、按连接失败概率进行选择。
注:横轴代表失败次数,纵轴代表选择的概率。
Cconn:一段区间内失败次数
f(Cconn):连接概率,取值范围在(0,100]
站长在关注

我要回帖

更多关于 东方红魔乡修改器 的文章

 

随机推荐