‘编程学习’ 分类下的所有文章
20108 月11

IPV4 vs IPV6 的技术秘密

IP(Internet Protocol,Internet协议)是互联网的支柱,它已经有近20年的历史,第一个正是发布的规范在RFC 791中只有简短的45页,定义了IP属于网络层协议,1991年,IETF确定了目前我们正在使用的IP协议版本,即IPv4,但现在已经完全停止开发了.新的IP版本叫做IPng(Next Generation,下一代IP协议)或IPv6,这个版本经历了漫长的讨论和反复的修改,1994年IETF终于明确了IPv6的方向,IPv6的主 要目的是解决IPv4中存在的问题,IPv6除了具有IPv4具有的功能外,还消除了IPv4的局限性,它们之间既有相同点,又有不同点.

当你部署 IPv6时,在IPv4时代学到的知识仍然有用.IPv6和IPv4之间差异主要体现在五个方面:寻址和路由、安全、网络地址翻译、管理工作量和对移动设备的支持.此外,IPv6还包括一个重要的特征:一套从IPv4迁移和过渡到IPv6的计划.

自1994年以来,已经发布了超过30个IPv6的RFC文档.改变IP协议意味着要改动许多上层协议和约定,从DNS和应用程序如何存储IP地址,到数据报如何在以太网、PPP、令牌环、FDDI和其它媒介上发送和路由,再到程序员如何调用网络函数都将会发生一些变化.IETF也不会疯狂到让大家一夜之间全部切换到IPv6,因此IETF也开发了IPv4和IPv6共存的标准和协议,如IPv4隧道里走IPv6,IPv6隧道里走IPv4,在同一个系统上长时间运行IPv4和IPv6(双堆栈),以及在各种环境中混合和匹配这两个协议.

Internet协议v4(IPv4)

Internet协议v4(IPv4)是Internet协议的第四个版本,它是第一个得到广泛部署的版本,和IPv6一起,它们是基于标准的 Internet网络互连方法的核心.IPv4仍然是目前部署最广泛的互联网层协议,IPv4的详细定义可参考IETF发布的RFC 791,它取代了早期定义文档RFC 760.IPv4是一个用于链路层包交换网络的连接协议,如以太网,它以尽力模式运行,因为它不能保证信息能100%传递,也不能保证按正确的顺序传输,更不能避免重复传输.IPv4未包含错误控制和流量控制机制,如果通过数据报头中的校验和方法发现数据被损坏,数据将被抛弃,包括数据完整性在内,均通过上层传输层协议解决,如传输控制协议.IPv4使用32位寻址方法,总共包含4294967296个有效地址,IPv4有四种不同的地址类型:A、B、C 和D.

有类别IP寻址

最初,IP地址被分为两部分,地址的高八位代表网络标识符,剩下的地址表示主机标识符,最大可以创建256个网络,人们很快就发现这样设计满足不了需要,为了克服这个限制,对高八位地址进行了重新定义,创建了一套网络类别,这就是后来著名的有类别网络,总共定义了五个类别:A、B、C、D和E,A、 B和C网络标识符长度不一样,剩下的地址部分用于标识主机,这意味着每个不同的网络类型可容纳的主机数目也不一样,D类地址表示多播地址,E类地址是未将来的应用程序保留的(译者注:有了IPv6,它还会被用到吗?).

无类别寻址

无类别寻址有三个基本类别.

• 子网

子网划分是一组技术,您可以使用这组技术来高效地划分单播地址前缀的地址空间以便在组织网络的子网间进行分配.单播地址前缀的固定部分包括前缀长度和前缀长度之前的位,这些位都具有定义的值.单播地址前缀的可变部分包括前缀长度之后设置为 0 的位.子网划分就是利用单播地址前缀的可变部分来创建更高效的地址前缀(浪费较少的可用地址),分配给组织网络的子网.最初定义 IPv4 的子网划分是为了更好地利用 A 类和 B 类 IPv4 公用网络 ID 的主机位.当您为 IPv4 网络 ID 划分子网时,您会在 IPv4 地址的层次结构中定义一个额外的层次.子网网络 ID 具有“网络 ID/子网 ID/主机 ID”层次结构.在您为网络 ID 划分子网后,每个子网网络 ID 都是一个子网(或具有“网络 ID/主机 ID”层次结构的网络 ID)的新地址前缀.

• 可变长子网掩码(VLSM)

可变长子网掩码(VLSM)是根据子网需要给它分配IP地址资源的一种方法,思科支持的IP路由协议,OSPF、双IS-IS、BGP-4和 EIGRP均支持无类别或VISM路由.历史上,EGP协议依赖于IP地址类型定义和真实交换的网络号(8,16或24位域),而与IP地址(32位号码)无关.RIP和IGRP交换的网络和子网号在32位域中,网络号、子网号和主机号之间的差别是一个约定问题,不用在路由协议中交换,现在用的一些协议要么使用一个前缀长度(地址中的连续位数),要么每个地址带有子网掩码来指出32位域中的哪一部分是需要路由的地址.在思科工程中经常可以见到需要使用可变长子网掩码的例子,在工程建设时通常有多个配置了FDDI和以太网接口的交换机,并做了编号以便每个交换子网可以支持62台主机,实际上,每个子网可能只会连接15-30台物理主机(打印服务器,工作站,文件服务器等),但许多工程也需要ISDN或帧中继供家庭办公用户使用,它们也需要一个单独的子网,这些家庭办公用户通常有一两个路由器和一个X终端或工作站,他们可能还有一台PC或苹果电脑也需要连网,因此,通常需要为他们配置支持6台主机的子网,还有一些用户需要配置支持14台主机的子网,点到点连接通常是不需要编号的.

• 无类别域间路由(CIDR)

使用超网时,靠无类别域间路由是减少路由表条目的数量,1993年左右,第一次引入了无类别域间路由,它的目的也是为了实现超网,超网允许路由聚合,CIDR引入了前缀标记,也叫做CIDR标记,前缀/CIDR标记现在在三种无类别IP寻址情况下使用:划分子网,VLSM/不同规模的子网和 CIDR/超网.

原IP地址类型由CIDR取代,相比之下,基于类型的方案被称为有类别的域间路由.CIDR的主要优势是允许对任意地址空间进行重新分区,因此可以给用户分配更小或更大的地址块,CIDR给Internet赋予了层次感,它将Internet分为国际ISP和国内ISP,然后又进一步细分为区域 ISP,区域ISP又再细分为本地ISP,本地ISP又再分为区,通过CIDR创建的这种分级结构由IANA(Internet Assigned Numbers Authority,互联网地址分配机构)和它的区域互联网注册管理机构(Regional Internet Registries,RIR)监管,管理全球互联网地址的分配,每个RIR维护一个可匿名搜索的WHOIS数据库,提供IP地址分配信息,从这些数据库查询出来的信息在众多根据IP地址进行地理定位的工具中扮演着核心角色,分级路由进一步按地理路由分解,在地理路由中,整个地址又被分成多个块,例如,一个块表示美国,一个块表示欧洲,一个表示中东,一个表示亚洲等等.

IPv4的局限性

从上世纪80年代开始,人们就意识到IPv4的地址即将耗尽,这是当初设计时未曾预料到的,这也是引入 有类别网络,创建CIDR寻址的驱动因素,尽管采取了这些措施,IPv4地址的消耗速度仍然让人惊讶,目前有两种较权威的估计,一种预测是2010年,也就是今年,IPv4地址将被用光,另一种预测是2012年才会用光.IPv4地址的耗尽主要原因是Internet用户,使用Internet连接的移动设备,以及连接Internet的ADSLmodem或有线modem的爆炸式增长,迫使我们开发和采用IPv6作为替代解决方案.

Internet协议v6(IPv6)

IPv6也就是著名的IPng,即所谓的下一代IP协议,它是被广泛使用的第二个Internet协议版本,它的设计目标是将IPv4逐渐过渡到IPv6,而不是一下子全部消灭掉IPv4,因此保留了IPv4的兼容性,从IPv4到IPv6的主要变化是:

▶扩展了路由和寻址能力:IPv6将IP地址规模从32位扩大到了128位,支持更多层次的寻址水平,更大的可寻址节点数,以及更简单的地址自动配置;

▶通过给多播地址增加一个“范围”域,多播路由的可扩展性得到了改进;

▶定义了一种新地址类型,叫做“任播地址”,它可以识别节点集,发送到任播地址的数据包可以传递给其中任一节点,在IPv6源路由中使用任播地址允许节点控制通信流的路径;

▶简化了报头格式:有些IPv4报头字段被删除或称为可选部分,减少数据包处理成本,让IPv6报头的带宽成本尽可能低.虽然IPv6地址长度是IPv4的4倍,但IPv6报文的头部长度只有IPv4报文头部长度的2倍;

▶改进了对可选项的支持:改进后IP头可选项经过编码后可更有效地进行转发,对可选项的长度限制也更宽松,为今后引入新的可选项提供了极好的灵活性;

▶服务质量(QoS)功能:增加了数据包标记功能,通过标记知道数据包属于哪个特定的通信流;

▶身份验证和隐私保护能力:IPv6包含了提供身份验证,数据完整性和保密等扩展的定义,虽然是扩展,但它们属于IPv6的基础组件;

▶IPv6由两部分组成,基础的IPv6报头和IPv6扩展头.

IPv6的优点

有了巨大的地址空间后,ISP有足够的IP地址分配给客户,甚至每个设备都可以拥有自己的IPv6地址.NAT(网络地址转换)已成为处理IP地址短缺得力的技术,但遗憾的是,许多Internet应用程序在NAT下都不能正常工作,如NFS,DNS和集团会议应有,此外,NAT也是企业对企业直接网络连接的障碍,需要进行复杂的地址转换才能让通信变得可靠,但它的扩展性很差,很容易出现单点故障,显得非常脆弱.

IPv6地址空间扩展的目标之一是让NAT技术边缘化,改善网络的连通性、可靠性和灵活性.IPv6在Internet上重新建立透明的端到端通信,由于IPv6地址长度较长,显得比较笨重,很多人看到那一长串地址都会头晕.IPv6的第二个主要目标是减少人们管理和配置系统的时间,因为IPv6 可以执行无状态自动配置,结合LAN MAC地址,加上网络路由器提供的前缀(不需要DHCP),可以确保创建一个唯一的IP地址.

当然,DHCP仍然有它的用处,如DNS服务器,不过需要支持DHCPv6,IPv6也给两个端点提供了一个中间地带,如SLP(Service Location Protocol,服务定位协议)协议,这可能使网络管理员的工作变得更加轻松.高带宽多媒体和容错应用是IPv6的第四个主要目标,多媒体应用可以利用多播的优势:可以将一个数据报传输到多个接收者.虽然IPv4也有多播功能,但它们是可选的,不是每个路由器和主机都支持,使用IPv6时,多播是必需的,前面已经提到,IPv6还增加了一种新的服务类型“任播”,与多播类似,任播有一个发送和接收数据包的节点组,当一个数据包发到一个任播组时,只会传输到组中的一个成员,这项新功能特别适合于容错环境,如Web服务器,DNS服务器.

另一方面,在IPv6上架设VPN(虚拟私有网络)是支持QoS的,IPv6支持IPv4相同的QoS功能,包括DiffServ标记,以及新的 20位通信流字段,IPv6的第五个主要目标是VPN.新的IPsec安全协议,ESP(封装安全协议)和AH(身份验证头)是附加到IPv4的,而 IPv6内置了这些协议,这意味着在IPv6世界中建设和部署网络时,保护网络的安全将会变得更加容易.

下面用一张表简单地对比一下IPv4和IPv6,以便加深理解.

IP(Internet Protocol,Internet协议)是互联网的支柱,它已经有近20年的历史,第一个正是发布的规范在RFC 791中只有简短的45页,定义了IP属于网络层协议,1991年,IETF确定了目前我们正在使用的IP协议版本,即IPv4,但现在已经完全停止开发了.新的IP版本叫做IPng(Next Generation,下一代IP协议)或IPv6,这个版本经历了漫长的讨论和反复的修改,1994年IETF终于明确了IPv6的方向,IPv6的主要目的是解决IPv4中存在的问题,IPv6除了具有IPv4具有的功能外,还消除了IPv4的局限性,它们之间既有相同点,又有不同点.当你部署 IPv6时,在IPv4时代学到的知识仍然有用.IPv6和IPv4之间差异主要体现在五个方面:寻址和路由、安全、网络地址翻译、管理工作量和对移动设备的支持.此外,IPv6还包括一个重要的特征:一套从IPv4迁移和过渡到IPv6的计划.

自1994年以来,已经发布了超过30个IPv6的RFC文档.改变IP协议意味着要改动许多上层协议和约定,从DNS和应用程序如何存储IP地址,到数据报如何在以太网、PPP、令牌环、FDDI和其它媒介上发送和路由,再到程序员如何调用网络函数都将会发生一些变化.IETF也不会疯狂到让大家一夜之间全部切换到IPv6,因此IETF也开发了IPv4和IPv6共存的标准和协议,如IPv4隧道里走IPv6,IPv6隧道里走IPv4,在同一个系统上长时间运行IPv4和IPv6(双堆栈),以及在各种环境中混合和匹配这两个协议.

Internet协议v4(IPv4)

Internet协议v4(IPv4)是Internet协议的第四个版本,它是第一个得到广泛部署的版本,和IPv6一起,它们是基于标准的 Internet网络互连方法的核心.IPv4仍然是目前部署最广泛的互联网层协议,IPv4的详细定义可参考IETF发布的RFC 791,它取代了早期定义文档RFC 760.IPv4是一个用于链路层包交换网络的连接协议,如以太网,它以尽力模式运行,因为它不能保证信息能100%传递,也不能保证按正确的顺序传输,更不能避免重复传输.IPv4未包含错误控制和流量控制机制,如果通过数据报头中的校验和方法发现数据被损坏,数据将被抛弃,包括数据完整性在内,均通过上层传输层协议解决,如传输控制协议.IPv4使用32位寻址方法,总共包含4294967296个有效地址,IPv4有四种不同的地址类型:A、B、C 和D.

有类别IP寻址

最初,IP地址被分为两部分,地址的高八位代表网络标识符,剩下的地址表示主机标识符,最大可以创建256个网络,人们很快就发现这样设计满足不了需要,为了克服这个限制,对高八位地址进行了重新定义,创建了一套网络类别,这就是后来著名的有类别网络,总共定义了五个类别:A、B、C、D和E,A、 B和C网络标识符长度不一样,剩下的地址部分用于标识主机,这意味着每个不同的网络类型可容纳的主机数目也不一样,D类地址表示多播地址,E类地址是未将来的应用程序保留的(译者注:有了IPv6,它还会被用到吗?).

无类别寻址

无类别寻址有三个基本类别.

• 子网

子网划分是一组技术,您可以使用这组技术来高效地划分单播地址前缀的地址空间以便在组织网络的子网间进行分配.单播地址前缀的固定部分包括前缀长度和前缀长度之前的位,这些位都具有定义的值.单播地址前缀的可变部分包括前缀长度之后设置为 0 的位.子网划分就是利用单播地址前缀的可变部分来创建更高效的地址前缀(浪费较少的可用地址),分配给组织网络的子网.最初定义 IPv4 的子网划分是为了更好地利用 A 类和 B 类 IPv4 公用网络 ID 的主机位.当您为 IPv4 网络 ID 划分子网时,您会在 IPv4 地址的层次结构中定义一个额外的层次.子网网络 ID 具有“网络 ID/子网 ID/主机 ID”层次结构.在您为网络 ID 划分子网后,每个子网网络 ID 都是一个子网(或具有“网络 ID/主机 ID”层次结构的网络 ID)的新地址前缀.

• 可变长子网掩码(VLSM)

可变长子网掩码(VLSM)是根据子网需要给它分配IP地址资源的一种方法,思科支持的IP路由协议,OSPF、双IS-IS、BGP-4和 EIGRP均支持无类别或VISM路由.历史上,EGP协议依赖于IP地址类型定义和真实交换的网络号(8,16或24位域),而与IP地址(32位号码)无关.RIP和IGRP交换的网络和子网号在32位域中,网络号、子网号和主机号之间的差别是一个约定问题,不用在路由协议中交换,现在用的一些协议要么使用一个前缀长度(地址中的连续位数),要么每个地址带有子网掩码来指出32位域中的哪一部分是需要路由的地址.在思科工程中经常可以见到需要使用可变长子网掩码的例子,在工程建设时通常有多个配置了FDDI和以太网接口的交换机,并做了编号以便每个交换子网可以支持62台主机,实际上,每个子网可能只会连接15-30台物理主机(打印服务器,工作站,文件服务器等),但许多工程也需要ISDN或帧中继供家庭办公用户使用,它们也需要一个单独的子网,这些家庭办公用户通常有一两个路由器和一个X终端或工作站,他们可能还有一台PC或苹果电脑也需要连网,因此,通常需要为他们配置支持6台主机的子网,还有一些用户需要配置支持14台主机的子网,点到点连接通常是不需要编号的.

• 无类别域间路由(CIDR)

使用超网时,靠无类别域间路由是减少路由表条目的数量,1993年左右,第一次引入了无类别域间路由,它的目的也是为了实现超网,超网允许路由聚合,CIDR引入了前缀标记,也叫做CIDR标记,前缀/CIDR标记现在在三种无类别IP寻址情况下使用:划分子网,VLSM/不同规模的子网和 CIDR/超网.

原IP地址类型由CIDR取代,相比之下,基于类型的方案被称为有类别的域间路由.CIDR的主要优势是允许对任意地址空间进行重新分区,因此可以给用户分配更小或更大的地址块,CIDR给Internet赋予了层次感,它将Internet分为国际ISP和国内ISP,然后又进一步细分为区域 ISP,区域ISP又再细分为本地ISP,本地ISP又再分为区,通过CIDR创建的这种分级结构由IANA(Internet Assigned Numbers Authority,互联网地址分配机构)和它的区域互联网注册管理机构(Regional Internet Registries,RIR)监管,管理全球互联网地址的分配,每个RIR维护一个可匿名搜索的WHOIS数据库,提供IP地址分配信息,从这些数据库查询出来的信息在众多根据IP地址进行地理定位的工具中扮演着核心角色,分级路由进一步按地理路由分解,在地理路由中,整个地址又被分成多个块,例如,一个块表示美国,一个块表示欧洲,一个表示中东,一个表示亚洲等等.

IPv4的局限性

从上世纪80年代开始,人们就意识到IPv4的地址即将耗尽,这是当初设计时未曾预料到的,这也是引入 有类别网络,创建CIDR寻址的驱动因素,尽管采取了这些措施,IPv4地址的消耗速度仍然让人惊讶,目前有两种较权威的估计,一种预测是2010年,也就是今年,IPv4地址将被用光,另一种预测是2012年才会用光.IPv4地址的耗尽主要原因是Internet用户,使用Internet连接的移动设备,以及连接Internet的ADSLmodem或有线modem的爆炸式增长,迫使我们开发和采用IPv6作为替代解决方案.

Internet协议v6(IPv6)

IPv6也就是著名的IPng,即所谓的下一代IP协议,它是被广泛使用的第二个Internet协议版本,它的设计目标是将IPv4逐渐过渡到IPv6,而不是一下子全部消灭掉IPv4,因此保留了IPv4的兼容性,从IPv4到IPv6的主要变化是:

▶扩展了路由和寻址能力:IPv6将IP地址规模从32位扩大到了128位,支持更多层次的寻址水平,更大的可寻址节点数,以及更简单的地址自动配置;

▶通过给多播地址增加一个“范围”域,多播路由的可扩展性得到了改进;

▶定义了一种新地址类型,叫做“任播地址”,它可以识别节点集,发送到任播地址的数据包可以传递给其中任一节点,在IPv6源路由中使用任播地址允许节点控制通信流的路径;

▶简化了报头格式:有些IPv4报头字段被删除或称为可选部分,减少数据包处理成本,让IPv6报头的带宽成本尽可能低.虽然IPv6地址长度是IPv4的4倍,但IPv6报文的头部长度只有IPv4报文头部长度的2倍;

▶改进了对可选项的支持:改进后IP头可选项经过编码后可更有效地进行转发,对可选项的长度限制也更宽松,为今后引入新的可选项提供了极好的灵活性;

▶服务质量(QoS)功能:增加了数据包标记功能,通过标记知道数据包属于哪个特定的通信流;

▶身份验证和隐私保护能力:IPv6包含了提供身份验证,数据完整性和保密等扩展的定义,虽然是扩展,但它们属于IPv6的基础组件;

▶IPv6由两部分组成,基础的IPv6报头和IPv6扩展头.

IPv6的优点

有了巨大的地址空间后,ISP有足够的IP地址分配给客户,甚至每个设备都可以拥有自己的IPv6地址.NAT(网络地址转换)已成为处理IP地址短缺得力的技术,但遗憾的是,许多Internet应用程序在NAT下都不能正常工作,如NFS,DNS和集团会议应有,此外,NAT也是企业对企业直接网络连接的障碍,需要进行复杂的地址转换才能让通信变得可靠,但它的扩展性很差,很容易出现单点故障,显得非常脆弱.

IPv6地址空间扩展的目标之一是让NAT技术边缘化,改善网络的连通性、可靠性和灵活性.IPv6在Internet上重新建立透明的端到端通信,由于IPv6地址长度较长,显得比较笨重,很多人看到那一长串地址都会头晕.IPv6的第二个主要目标是减少人们管理和配置系统的时间,因为IPv6 可以执行无状态自动配置,结合LAN MAC地址,加上网络路由器提供的前缀(不需要DHCP),可以确保创建一个唯一的IP地址.

当然,DHCP仍然有它的用处,如DNS服务器,不过需要支持DHCPv6,IPv6也给两个端点提供了一个中间地带,如SLP(Service Location Protocol,服务定位协议)协议,这可能使网络管理员的工作变得更加轻松.高带宽多媒体和容错应用是IPv6的第四个主要目标,多媒体应用可以利用多播的优势:可以将一个数据报传输到多个接收者.虽然IPv4也有多播功能,但它们是可选的,不是每个路由器和主机都支持,使用IPv6时,多播是必需的,前面已经提到,IPv6还增加了一种新的服务类型“任播”,与多播类似,任播有一个发送和接收数据包的节点组,当一个数据包发到一个任播组时,只会传输到组中的一个成员,这项新功能特别适合于容错环境,如Web服务器,DNS服务器.

另一方面,在IPv6上架设VPN(虚拟私有网络)是支持QoS的,IPv6支持IPv4相同的QoS功能,包括DiffServ标记,以及新的 20位通信流字段,IPv6的第五个主要目标是VPN.新的IPsec安全协议,ESP(封装安全协议)和AH(身份验证头)是附加到IPv4的,而 IPv6内置了这些协议,这意味着在IPv6世界中建设和部署网络时,保护网络的安全将会变得更加容易.

下面用一张表简单地对比一下IPv4和IPv6,以便加深理解.

/wp-content/uploads/auto_save_image/2010/08/050902LNv.jpg
表1 IPv4与IPv6的对比

文/51CTO

20108 月10

开源的JS JAVA工作流设计器

XiorkFlow  这个设计器UI还是不错的,可以自动生成XML文件,只是节点和连接线如果能双击弹出窗口设置相关属性就好了,没办法,只能进行二次开发了。。:(

谁有更好的开源工作流设计器吗?

下载地址:http://www.pudn.com/downloads78/sourcecode/java/detail298487.html

其他不多述了,自己下了部署下,可以看看效果。

20108 月5

JS获取URL传递的参数值

function GetQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
        var r = window.location.search.substr(1).match(reg);
        if (r != null)
            return unescape(r[2]);
        return null;
    }
20108 月3

DIV+CSS常用属性定义说明

.toptab {
    min-width:60px;/*最小宽度*/
    _width:60px; /*实现min-width兼容 IE6*/
    overflow: hidden;/*不出现滚动条*/
    float:left;/*左浮动*/
    padding:2px 6px 0 6px;/*定义元素内边框,上右下左*/
    margin:0 10px 0 0;/*定义元素外边框,上右下左*/
    text-align:center;/*文本居中对齐*/
    height:22px;
    line-height:22px; /*两个高度一致,使文本上下垂直居中 */
    font-size: 12px;/*文字大小*/
    background-color:#ffffff;/*元素背景颜色*/
    color: #333333;/*文字颜色*/
    font-weight: normal;
    text-decoration: none;/*不出现下划线*/
}

ps:内联(display:inline;)属于行布局,其特性是在一行里进行布局,不能设置宽高

20108 月1

JS 实现DIV随浏览器窗口大小变化

以下是宽度变化的示例,高度也可参考:

<script type="text/javascript">
    function initWidth() {
        var bodyWidth = document.compatMode == "BackCompat"?document.body.clientWidth:document.documentElement.clientWidth;
        document.getElementById("Content").style.width = bodyWidth - 180;
    }
    initWidth();
    if (document.attachEvent) {
        window.attachEvent('onresize', initWidth);
    } else {
        window.addEventListener('resize', initWidth, false);
    }
</script>
20107 月31

本站顺利升级至 WordPress 3.0.1 简体中文版(下载)

安装完3.0.1英文原版之后,使用3.0简体中文语言包替换对应文件即可。

  • WordPress 3.0.1 英文原版:zip下载
  • WordPress 3.0 简体中文语言包:zip下载
  • ..

    20107 月29

    buffalo ajax 实现表单提交

    前台代码

    <html>
    
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gbk">
        <title>test</title>
        <LINK href="/wi/css/oa/blue/menu.css" type=text/css media=screen rel=stylesheet>
        <script language="javascript" src="/wi/script/prototype.js"></script>
        <script language="javascript" src="/wi/script/buffalo.js"></script>
    
    </head>
    <script language="javascript">
        var endPointTop = '/wi/buffalo';
        var waitingImg = '/wi/images/oa/loading.gif';
        var loadingImg = '/wi/images/oa/loading.gif';
        var userId = 'superadmin';
        var deptId = '0001';
        function test() {
            try {
                var user = Buffalo.Form.formToBean("form1", "modules.sys.Sys_user", true);
    
                var buffalo = new Buffalo(endPointTop);
                buffalo.remoteCall("desktopService.test", [userId,user], function(reply) {
                    var str = reply.getResult();
                    alert(str);
                });
            } catch (ex) {
               //   alert(ex);
            }
        }
    </script>
    <body style="margin: 0; padding: 0; overflow: auto; " marginwidth="0" topmargin="0" leftmargin="0" marginheight="0">
    <a href="#" onclick="test();">test</a>
    
    <form id ="form1">
    
      <p>id:<input name="id" type="text" id="id">
    
      name:<input name="name" type="text" id="name">
    
      age: <input name="age" type="text" id="age">
    
     memo: <input name="memo" type="text" id="memo">
    
      </p>
    
    </form>
    
    </body>
    </html>

    后台bean

    public class User {
    
        private int id;
    
        private String name;
    
        private int age;
    
        private String memo;
    
        public User() {
    
        }
        //结合数据库操作可以添加 rs.getString 、get、set 方法
    }

    执行类

    public class desktopService {
        public int test(String userId, Sys_user obj) {
    
            return 1;
        }
    }

    buffalo缺点

    实测过程中发现,buffalo实现form表单元素绑定是一对一的,form里包含多余的元素会报错。

    20107 月27

    buffalo+list+ul+li 实现Ajax多级菜单

    Buffalo ajax使用说明

    源代码

    <html>
    
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gbk">
    <title>LeftMenu</title>
    <LINK href="css/menu.css" type=text/css  media=screen rel=stylesheet>
    <script language="javascript" src="script/prototype.js"></script>
    <script language="javascript" src="script/buffalo.js"></script>
    </head>
    <script language="javascript">
        var endPointTop = '/${globals_sys_basename}/buffalo';//globals_sys_basename应用根目录
        var waitingImg = '/${globals_sys_basename}/images/oa/loading.gif';
        var loadingImg = '/${globals_sys_basename}/images/oa/loading.gif';
        var userId = '$!{user.getLoginname()}';
        var deptId = '$!{user.getUnitid()}';
        var alreadyOpenTableId = null;
        var hrefBaseValue = null;
         //HTTP://WWW.WIZZER.CN
         function getUl(e) {
            for (var i = 0; i < e.childNodes.length; i ++) {
                if (e.childNodes[i].nodeName.toUpperCase() == "UL")return true;
            }
            return false;
        }
        function subMenu(e, menuId) {//动态增加下级菜单
            if (getUl(e))return;
            try {
                var buffalo = new Buffalo(endPointTop);
                buffalo.remoteCall("desktopService.getSubMenu", [userId,menuId], function(reply) {
                //desktopService.getSubMenu ajax调用后台方法,传递用户名、一级栏目ID
                    var str = reply.getResult();//返回ArrayList对象或List对象
                    if (str.length>0) {
                        var ulElem = document.createElement("ul");
    
                        var temp = "";
                        ulElem.className = "MenuLevel2";
                        ulElem.ID = "MENU_" + menuId + "S";
                        ulElem.style.display = "";
                        for (var i = 0; i < str.length; i++) {
                            temp += "<li id='MENU_"+str[i].id+"' class='level2' onclick=\"subMenu(this,'" + str[i].id + "');menuClick(this);\" ><div>";
                            if (str[i].ext3 != null && str[i].ext3 != "") {
                                temp += "<img src='/$!globals_sys_basename/private/Icons/" + str[i].ext3 + "'>";//小图标
                            }
                            temp += "" + str[i].name + "</div></li>";
                        }
                        ulElem.innerHTML = temp;
                        e.appendChild(ulElem);
                    }
                });
            } catch (ex) {
            }
    
        }
    
        function closeMenu() {
            if (alreadyOpenTableId == null) return;
            alreadyOpenTable = document.all(alreadyOpenTableId);
            if (alreadyOpenTable.childNodes.length > 1){
                targetTable = alreadyOpenTable.childNodes[1];
            }else{return;}
            targetTable.style.display = "none";
            alreadyOpenTableId = null;
        }
        function menuClick(e) {
            var currentTableSrc = e;
            if (currentTableSrc.id != alreadyOpenTableId && currentTableSrc.id!=alreadyOpenTableId+"0001") closeMenu();
    
            targetTableId = currentTableSrc.id + "S";
            if (e.childNodes.length > 1){
                targetTable = e.childNodes[1];
            }else{targetTable=null;}
            if (targetTable == null)return;
            if (targetTable.style.display == "none") {
                targetTable.style.display = '';
                alreadyOpenTableId = currentTableSrc.id;
            } else {
                targetTable.style.display = "none";
            }
        }
     </script>
    <body style="margin: 0; padding: 0; overflow: auto; " marginwidth="0" topmargin="0" leftmargin="0" marginheight="0">
    
        <ul id=MenuUl>
    
          #foreach($obj in $list)//使用模板语言循环出第一级菜单
    
        <li  id="MENU_$!{obj.getId()}" onclick="subMenu(this,'$!{obj.getId()}');menuClick(this);"><div>#if(${obj.getExt3()})<img src="/$!globals_sys_basename/private/Icons/$!{obj.ext3}">#end $!{obj.getName()}</div>
    
        </li>
    
        #end
            </ul>
    
    </body>
    </html>

    menu.css样式表 

    body {
    	background: #d8edfc;
    	font-size: 12px;
    	font-family: 宋体;
    	scrollbar-base-color: #dbecf8;
    	scrollbar-arrow-color: #2a8ed1;
    	scrollbar-track-color: #bdddf2;
    	scrollbar-3dlight-color: #2886c5;
    	scrollbar-darkshadow-color: #2886c5;
    	scrollbar-face-color: #dbecf8;
    	scrollbar-shadow-color: #dbecf8;
    	margin: 1px;
    	border: 3px solid #4891c6;
    }
    
    
    #MenuUl {
    	list-style:none;
    	margin: 0px;
    	padding: 0px;
    	background: #d8ebf7;
    }
    
    ul.MenuLevel2 {
    	list-style:none;
    	margin: 0px;
    	padding: 0px;
    	background: #d8ebf7;
    }
    
    .level1 {
    	font-weight: bold;
    	color: #005790;
    	padding-bottom: 1px;
    
    }
    
    .level2 {
    	font-weight: normal;
    	color: #005790;
    }
    
    .level3Head {
    	font-weight: normal;
    	color: #2479b6;
    	width: 100%;
    	height: 21px;
    	padding-left: 61px;
    	padding-top: 4px;
    	background: url(images/menu_bg_head.gif) no-repeat;
    	cursor: hand;
    }
    
    .level33 {
    	font-weight: normal;
    	color: #2479b6;
    	width: 100%;
    	height: 21px;
    	padding-left: 61px;
    	padding-top: 4px;
    	background: url(images/menu_bg_3.gif) no-repeat;
    	cursor: hand;
    }
    
    .level32 {
    	font-weight: normal;
    	color: #2479b6;
    	width: 100%;
    	height: 21px;
    	padding-left: 61px;
    	padding-top: 4px;
    	background: url(images/menu_bg_2.gif) no-repeat;
    	cursor: hand;
    }
    
    .level1Style {
        /*font-size:18px;  */
    	width: 155px;
    	height: 24px;
    	background: url(images/menu_btn_bg.gif) no-repeat;
    	padding-left: 20px;
    	padding-top: 4px;
    	cursor: hand;
    }
    
    .level1SelectedStyle {
    	width: 155px;
    	height: 24px;
    	background: url(images/menu_btn_bg_selected.gif) no-repeat;
    	padding-left: 20px;
    	padding-top: 4px;
    	cursor: hand;
    }
    
    .level2Style {
    	width: 100%;
    	height: 20px;
    	background: #8ec4e9;
    	padding-left: 30px;
    	padding-top: 4px;
    	border-top: 1px solid #eff6fb;
    	cursor: hand;
    }
    20107 月24

    完美支持中文wp-cumulus标签云插件源码(无锯齿无抖动7K大小)

    1、首先安装wp-cumulus 标签Tag Cloud插件

    这个不用教了吧?:)啰嗦一下:

    参数:

    wp_tag_cloud parameters:smallest=8&largest=22&number=45

    设置最小字体、最大字体、总数量

    应用:

    若网站主题不能自动支持,可以手动编辑php文件,加入 <?php wp_cumulus_insert(); ?> 代码。

    2、使用说明

    鼠标右击下面链接,选择“另存为”(仅7K大小,效果见本站首页右下):

    /wp-content/plugins/wp-cumulus/tagcloud.swf

    上传替换网站 /wp-content/plugins/wp-cumulus/ 下tagcloud.swf文件,即可完美支持中文。

    ——以下是开发者阅读,普通用户可以略过————————————————————

    3、修改wp-cumulus源代码

    安装Adobe Flash CS4 后打开wp-cumulus源文件,按照上图步骤,选择“tag”文本框,不嵌入字符。

    4、修改Tag.as

    打开  C:\wp-cumulus\flash sources\com\roytanck\wpcumulus\Tag.as

    源代码:

    package com.roytanck.wpcumulus
    {
    
    	import flash.geom.ColorTransform;
    	import flash.filters.*;
    	import flash.display.*;
            import flash.events.*;
            import flash.net.*;
            import flash.text.*;
    	public class Tag extends Sprite {
    
    		private var _back:Sprite;
    		private var _node:XML;
    		private var _cx:Number;
    		private var _cy:Number;
    		private var _cz:Number;
    		private var _color:Number;
    		private var _hicolor:Number;
    		private var _active:Boolean;
    		private var _tf:TextField;
    
    		public function Tag( node:XML, color:Number, hicolor:Number ){
    			            _node = node;
                _color = color;
                _hicolor = hicolor;
                _active = false;
                _tf = new TextField();
                _tf.autoSize = TextFieldAutoSize.LEFT;
                _tf.selectable = false;
                _tf.antiAliasType = AntiAliasType.ADVANCED;
    	    var format:TextFormat = new TextFormat();
                format.font = "微软雅黑, Arial, 黑体";//设置字体
                format.bold = true;
                format.color = color;
                format.size = 16 * getNumberFromString(node["@style"]);
                _tf.defaultTextFormat = format;
    	    //_tf.embedFonts = true;  //是否使用字符库,这个肯定要注释掉
                _tf.text = node;
                var _loc_5:BlurFilter = new BlurFilter(5, 5, 1);
                _tf.filters = [_loc_5];
    	    var _loc_6:Bitmap = new Bitmap(null, "auto", true);
                var _loc_7:BitmapData = new BitmapData(_tf.width, _tf.height, true, color);
    
                _loc_7.draw(_tf);
                _loc_6.bitmapData = _loc_7;
                _loc_6.scaleY = 0.15;
                _loc_6.scaleX = 0.15;
    
                addChild(_loc_6);
                _loc_6.x = (-this.width) / 2;
                _loc_6.y = (-this.height) / 2;
                _back = new Sprite();
                _back.graphics.beginFill(_hicolor, 0);
                _back.graphics.lineStyle(0.6, _hicolor);
                _back.graphics.drawRect(0, 0, _loc_6.width, _loc_6.height);
                _back.graphics.endFill();
                addChildAt(_back, 0);
                _back.x = (-_loc_6.width) / 2;
                _back.y = (-_loc_6.height) / 2;
                _back.visible = false;
    			if( _node["@href"].substr(0,4).toLowerCase() == "http" ){
    				this.mouseChildren = false;
    				this.buttonMode = true;
    				this.useHandCursor = true;
    				this.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
    				this.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
    				this.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
    			}
    		}
    
    		private function mouseOverHandler( e:MouseEvent ):void {
    			_back.visible = true;
    			_tf.textColor = _hicolor;
    			_active = true;
    		}
    
    		private function mouseOutHandler( e:MouseEvent ):void {
    			_back.visible = false;
    			_tf.textColor = _color;
    			_active = false;
    		}
    
    		private function mouseUpHandler( e:MouseEvent ):void {
    			var request:URLRequest = new URLRequest( _node["@href"] );
    			var target:String = _node["@target"] == undefined ? "_self" : _node["@target"];
    			navigateToURL( request, target );
    		}
    
    		private function getNumberFromString( s:String ):Number {
    			return( Number( s.match( /(\d|\.|\,)/g ).join("").split(",").join(".") ) );
    		}
    
    		public function set cx( n:Number ){ _cx = n }
    		public function get cx():Number { return _cx; }
    		public function set cy( n:Number ){ _cy = n }
    		public function get cy():Number { return _cy; }
    		public function set cz( n:Number ){ _cz = n }
    		public function get cz():Number { return _cz; }
    		public function get active():Boolean { return _active; }
    
    	}
    
    }

    5、源代码下载

    由于本空间不支持rar文件,所以有兴趣的可以到我的CSDN地址下载:

    http://download.csdn.net/source/2571076

    6、说明

    花了一天的时间,查找了许多资料,先是官方的不支持中文,后来找到方法支持中文但是有抖动的现象,效果不好,再后来找到无抖动的swf文件,但是不开源,于是自己琢磨。。

    请保留本站链接,咱都不收费而且开源了,是吧?。。呵呵

    把一些注释、空格、再优化下代码,swf文件还可以压缩,这个需要你自己尝试了。。。

    20107 月22

    在移植不同JS框架遇到报错的问题

    一般是 $ 函数冲突造成的,例如:

    function $() {
      var results = [], element;
      for (var i = 0; i < arguments.length; i++) {
        element = arguments[i];
        if (typeof element == 'string')
          element = document.getElementById(element);
        results.push(Element.extend(element));
      }
      return results.reduce();
    }

     和

    var $ = function (id) {
    	return "string" == typeof id ? document.getElementById(id) : id;
    };

    function $(ele) {
      if (typeof(ele) == 'string'){
        ele = document.getElementById(ele)
        if(!ele){
      		return null;
        }
      }
      if(ele){
      	Core.attachMethod(ele);
    	}
      return ele;
    }

    等。。。。找出问题费了一定功夫。。:(

    20107 月20

    分享本站WordPress插件(代码高亮插件等)

    为了方便大家阅读本站分享的代码,特安装了代码高亮显示插件。

    1、Auto SyntaxHighlighter

    用于可视化编辑时插入代码

    2、Syntax Highlighter and Code Prettifier Plugin for WordPress

    用于页面显示。

    ——————————————————————————–

    另外分享本站 安装的Wordpress插件经验。对一般的站点应该比较全,够用了吧?:)

    1、Akismet     防止垃圾评论的插件,需要到官网注册key

    2、Auto SyntaxHighlighter    代码高亮–可视化编辑插件(后台)

    3、Syntax Highlighter and Code Prettifier Plugin for WordPress   代码高亮显示插件(前台)

    4、NO Revisions  禁止Wordpress版本控制功能,实现文章编号的连续,节省KEY资源

    5、Some Chinese Please!   评论必须包含中文插件

    6、Watermark RELOADED   上传图片自动加水印插件

    7、WP-Mail-SMTP   使用免费邮箱作为网站邮件服务器插件,教程:/?p=297

     8、Auto_Save_Image   自动保存远程图片插件,并可设置去掉图片链接,自动添加水印

    9、WP-PostViews   文章阅读统计插件(前台)

    10、PostViews for Admin  后台显示文章统计数(后台)

    11、WP-cumulus  非常炫的3D标签云插件,完美支持中文:/?p=482

    12、其他:分享插件、防评论中的链接被百度搜集插件等。

    20107 月19

    WordPress 上传图片功能异常,导致上传没反应

    WordPress 2.9.2 版本~安装了不知道啥插件,上传图片功能异常,导致上传没反应。

    可能是Super Image Plugin Tools版本太低造成的?

    替换一些原文件还是不能正常使用,于是升级到了Wordpress 3.0~ 搞定。

    简体中文版下载地址:http://wfans.org/blog/2010/06/wordpress-3-0-chinese-version-released/

    另外还安装了 Watermark RELOADED 水印插件,没出问题。

    20107 月19

    WordPress 如何设置QQ域名邮箱–空间禁止mail()

    测试了下站点的注册功能,发现邮件发送不了。提示空间禁止 mail() 函数~~:(

    多方查找,终于找到解决办法,现分享如下:

    1、首先开通QQ的域名邮箱功能,把域名和QQ邮箱进行绑定。

    详情访问:http://domain.mail.qq.com/cgi-bin/loginpage

    2、安装wordpress插件:WP-Mail-SMTP

    在网站后台插件里搜索Mail会找到,进行在线安装。安装完毕点setting进入设置。

    3、WP-Mail-SMTP设置如下:

    update options  搞定。

    4、Send a test Mail

    20107 月16

    JS:cookies 存、取、删除实例

    function SetCookie(name,value)
    {
    var Days = 1;
    var exp = new Date();
    exp.setTime(exp.getTime() + Days*24*60*60*1000);
    document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
    }
    function getCookie(name)//取cookies函数
    {
    var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
    if(arr != null) return unescape(arr[2]); return null;
    
    }
    function delCookie(name)//删除cookie
    {
    var exp = new Date();
    exp.setTime(exp.getTime() - 1);
    var cval=getCookie(name);
    if(cval!=null) document.cookie= name + "="+cval+";expires="+exp.toGMTString();
    }
    
    20107 月14

    Buffalo ajax实例

    Buffalo是国人开发的Ajax框架,它可以使用户在js中方便的调用java代码里的方法。

    后台配置方法:

    1. web.xml中配置相关servlet 如下:

    <!–buffalo ajax–>
        <servlet>
            <servlet-name>buffalo</servlet-name>
            <servlet-class>net.buffalo.web.servlet.ApplicationServlet</servlet-class>
        </servlet>

        <servlet-mapping>
            <servlet-name>buffalo</servlet-name>
            <url-pattern>/buffalo/*</url-pattern>
        </servlet-mapping>

    2. 需要引入的jar包为:

    加入两个jar包:buffalo-2.0.jar和commons-logging-api-1.0.4.jar(下载包里有,下载地址见文章最后)。

    注:若commons-logging-api-1.0.4.jar不加入,会抛出异常。

    3. 编写需要调用的业务类。
    如:
    1. desktopService.java

    package oa.ajax;
    
    /**
     * Created by IntelliJ IDEA.
     * User: wizzer
     * Date: 2010-7-15
     * Time: 16:08:22
     * To change this template use File | Settings | File Templates.
     */
    public class desktopService {
            public String getInfoCount(String userId,String depId){
    
                 return "0|1|2";
            }
    }
    
    

    4. 配置文件中配置业务类

     配置文件为:buffalo-service.properties  位置在classes下
     
     内容如下:
     
    desktopService=oa.ajax.desktopService
     
     多个类则配置多个: 格式 名称=业务类全名
     
     注意:js里则通过  desktopService来代替oa.ajax.desktopService类执行其中的业务方法
     
     到此后台代码结束

    下面为前台调用

    5. 在jsp中引入js文件:prototype.js 和 buffalo.js 文件

     <script type=”text/javascript” src=”js/prototype.js”></script>
     <script type=”text/javascript” src=”js/buffalo.js”></script>
     
    6. 编写调用js代码

    注意:helloService这个是配置文件中配置的名称

    <script type="text/javascript">  
          var endPoint = "<%=request.getContextPath()%>/buffalo"; 
          var buffalo = new Buffalo(endPoint);   
          var userId= "wizzer";
          var deptId = "HITS";
    
    function getEventCount() {
     try {
      var buffalo = new Buffalo(endPointTop);
    
             buffalo.remoteCall("desktopService.getInfoCount", [userId, deptId], function(reply) {
    
                    var str = reply.getResult();
                 var ary = str.split("|");
    
        document.getElementById("msg").innerHTML = "(" + ary[0] + ")";
        document.getElementById("mail").innerHTML = "(" + ary[1] + ")";
        document.getElementById("wait").innerHTML = "(" + ary[2] + ")";
             });
     } catch (ex) {
     }
    }
    
    </script>   
    
    

        
        <input type=”button” value=”Buffalo远程调用” onclick=”getEventCount();”/>
       
        消息<div id=”msg”></div>
     信箱<div id=”mail”></div>
     待办<div id=”wait”></div>
       
       
    Buffalo ajax 最新版下载地址:http://buffalo.sourceforge.net/download.html

    20107 月9

    CSS+DIV+UL+LI 实现简单下拉菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>wizzer.cn</title>
    <style type="text/css">
    <!--
    * {
    margin:0px;
    padding:0px;
    font-family:"宋体";
    font-size:12px;
    text-align:center;
    }
    body ul{
    margin:0px auto;
    }
    #mean{
    width:500px;
    margin:0px auto;
    padding:0px;
    }
    #mean li{
    float:left;
    list-style-type:none;
    width:80px;
    padding:1px;
    line-height:25px;
    }
    .a{
        background-color: #9DDFAA;
        color: #060;
        text-decoration: none;
        border: 1px solid #0C6;
        display: block;
    
    }
    .a:hover{
        color: #FFFFFF;
        background-color: #12581A;
        border: 1px solid #6AFF6A;
    }
    .list{
        width: 80px;
    
    }
    .list ul{
    margin:0px auto;
    padding:0px;
    }
    .list li{
        float: left;
        height: 18px;
        width: 80px;
    }
    .b{
        width: 80px;
        background-color: #55BF60;
        line-height:18px;
        display: block;
        text-decoration: none;
        color: #000;
        filter:Alpha(opacity=70);
    }
    .b:hover{
        background-color: #FFFFFF;
        color: #060;
        text-decoration: none;
        filter:Alpha(opacity=70);
    }
    .menu2{
        height: 26px;
        width: 80px;
        cursor:hand;
        overflow-y:hidden;
    }
    #keai{
        width:800px;
        height:50px;
        background-color:#4033D7;
        z-index:-1;
        position: absolute;
        left: 0px;
        top: 35px;
    }
    -->
    </style>
    </head>
    <body>
    <div id="mean">
    <ul>
    <li onMouseOver="this.className='menu1'"
    onMouseOut="this.className='menu2'">
    <a href="#">网站首页</a>
    <div>
    <ul>
    <li><a href="#">我的主页</a></li>
    <li><a href="#">我的空间</a></li>
    <li><a href="#">我的相册</a></li>
    <li><a href="#">我的日志</a></li>
    </ul>
    </div>
    </li >
    <li onMouseOver="this.className='menu1'"
    onMouseOut="this.className='menu2'"><a href="#">新闻公告</a>
    <div>
    <ul>
    <li><a href="#">我的主页</a></li>
    <li><a href="#">我的空间</a></li>
    <li><a href="#">我的相册</a></li>
    <li><a href="#">我的日志</a></li>
    </ul>
    </div>
    </li>
    <li onMouseOver="this.className='menu1'"
    onMouseOut="this.className='menu2'"><a href="#">产品信息</a>
    <div>
    <ul>
    <li><a href="#">我的主页</a></li>
    <li><a href="#">我的空间</a></li>
    <li><a href="#">我的相册</a></li>
    <li><a href="#">我的日志</a></li>
    </ul>
    </div>
    </li>
    <li onMouseOver="this.className='menu1'"
    onMouseOut="this.className='menu2'"><a href="#">最新推荐</a>
    <div>
    <ul>
    <li><a href="#">我的主页</a></li>
    <li><a href="#">我的空间</a></li>
    <li><a href="#">我的相册</a></li>
    <li><a href="#">我的日志</a></li>
    </ul>
    </div>
    </li>
    <li onMouseOver="this.className='menu1'"
    onMouseOut="this.className='menu2'"><a href="#">联系我们</a>
    <div>
    <ul>
    <li><a href="#">我的主页</a></li>
    <li><a href="#">我的空间</a></li>
    <li><a href="#">我的相册</a></li>
    <li><a href="#">我的日志</a></li>
    </ul>
    </div>
    </li>
    </ul>
    </div>
    </body>
    </html>
    20107 月9

    IE浏览器提示保存文件navcancl解决办法

    点“开始->运行”输入“iexplore.exe -nohome -extoff” 打开浏览器

    首先取消锁定工具栏,禁用你安装的其他第三方工具栏..

    然后打开 工具->internet选项->高级->将“SmartScreen筛选器”勾掉.

    20107 月7

    实现鼠标拖动div交换位置

    <html>
    <head>
    <title>月影</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <style>
    body {margin:0px;padding:0px;font-size:12px;text-align:center;}
    body > div {text-align:center; margin-right:auto; margin-left:auto;}
    .content{width:900px;}
    .content .left{
            float:left;
            width:20%;
            border:1px solid #FF0000;
            margin:3px;
    }
    .content .center{float:left;border:1px solid #FF0000;margin:3px;width:57%}
    .content .right{float:right;width:20%;border:1px solid #FF0000;margin:3px}
    .mo{height:auto;border:1px solid #CCC;margin:3px;background:#FFF}
    .mo h1{background:#ECF9FF;height:18px;padding:3px;cursor:move}
    .mo .nr{height:80px;border:1px solid #F3F3F3;margin:2px}
    h1{margin:0px;padding:0px;text-align:left;font-size:12px}
    </style>
    <script>
    var dragobj={}
    window.onerror=function(){return false}
    function on_ini(){
            String.prototype.inc=function(s){return this.indexOf(s)>-1?true:false}
            var agent=navigator.userAgent
            window.isOpr=agent.inc("Opera")
            window.isIE=agent.inc("IE")&&!isOpr
            window.isMoz=agent.inc("Mozilla")&&!isOpr&&!isIE
            if(isMoz){
                    Event.prototype.__defineGetter__("x",function(){return this.clientX+2})
                    Event.prototype.__defineGetter__("y",function(){return this.clientY+2})
            }
            basic_ini()
    }
    function basic_ini(){
            window.$=function(obj){return typeof(obj)=="string"?document.getElementById(obj):obj}
            window.oDel=function(obj){if($(obj)!=null){$(obj).parentNode.removeChild($(obj))}}
    }
    window.onload=function(){
            on_ini()
            var o=document.getElementsByTagName("h1")
            for(var i=0;i<o.length;i++){
                    o[i].onmousedown=function(e){
                            if(dragobj.o!=null)
                                    return false
                            e=e||event
                            dragobj.o=this.parentNode
                            dragobj.xy=getxy(dragobj.o)
                            dragobj.xx=new Array((e.x-dragobj.xy[1]),(e.y-dragobj.xy[0]))
                            dragobj.o.style.width=dragobj.xy[2]+"px"
                            dragobj.o.style.height=dragobj.xy[3]+"px"
                            dragobj.o.style.left=(e.x-dragobj.xx[0])+"px"
                            dragobj.o.style.top=(e.y-dragobj.xx[1])+"px"
                            dragobj.o.style.position="absolute"
                            var om=document.createElement("div")
                            dragobj.otemp=om
                            om.style.width=dragobj.xy[2]+"px"
                            om.style.height=dragobj.xy[3]+"px"
                            dragobj.o.parentNode.insertBefore(om,dragobj.o)
                            return false
                    }
            }
    }
    document.onselectstart=function(){return false}
    window.onfocus=function(){document.onmouseup()}
    window.onblur=function(){document.onmouseup()}
    document.onmouseup=function(){
            if(dragobj.o!=null){
                    dragobj.o.style.width="auto"
                    dragobj.o.style.height="auto"
                    dragobj.otemp.parentNode.insertBefore(dragobj.o,dragobj.otemp)
                    dragobj.o.style.position=""
                    oDel(dragobj.otemp)
                    dragobj={}
            }
    }
    document.onmousemove=function(e){
            e=e||event
            if(dragobj.o!=null){
                    dragobj.o.style.left=(e.x-dragobj.xx[0])+"px"
                    dragobj.o.style.top=(e.y-dragobj.xx[1])+"px"
                    createtmpl(e)
            }
    }
    function getxy(e){
            var a=new Array()
            var t=e.offsetTop;
            var l=e.offsetLeft;
            var w=e.offsetWidth;
            var h=e.offsetHeight;
            while(e=e.offsetParent){
                    t+=e.offsetTop;
                    l+=e.offsetLeft;
            }
            a[0]=t;a[1]=l;a[2]=w;a[3]=h
      return a;
    }
    function inner(o,e){
            var a=getxy(o)
            if(e.x>a[1]&&e.x<(a[1]+a[2])&&e.y>a[0]&&e.y<(a[0]+a[3])){
                    if(e.y<(a[0]+a[3]/2))
                            return 1;
                    else
                            return 2;
            }else
                    return 0;
    }
    function createtmpl(e){
            for(var i=0;i<12;i++){
                    if($("m"+i)==dragobj.o)
                            continue
                    var b=inner($("m"+i),e)
                    if(b==0)
                            continue
                    dragobj.otemp.style.width=$("m"+i).offsetWidth
                    if(b==1){
                            $("m"+i).parentNode.insertBefore(dragobj.otemp,$("m"+i))
                    }else{
                            if($("m"+i).nextSibling==null){
                                    $("m"+i).parentNode.appendChild(dragobj.otemp)
                            }else{
                                    $("m"+i).parentNode.insertBefore(dragobj.otemp,$("m"+i).nextSibling)
                            }
                    }
                    return
            }
            for(var j=0;j<3;j++){
                    if($("dom"+j).innerHTML.inc("div")||$("dom"+j).innerHTML.inc("DIV"))
                            continue
                    var op=getxy($("dom"+j))
                    if(e.x>(op[1]+10)&&e.x<(op[1]+op[2]-10)){
                            $("dom"+j).appendChild(dragobj.otemp)
                            dragobj.otemp.style.width=(op[2]-10)+"px"
                    }
            }
    }
    </script>
    </head>
    <body>
    <div>
            <div id=dom0>
                    <div id=m0>
                            <h1>dom0</h1>
                            <div></div>
                    </div>
                    <div id=m1>
                            <h1>dom1</h1><div></div>
                    </div>
                    <div id=m2><h1>dom2</h1><div></div></div>
                    <div id=m3><h1>dom3</h1><div></div></div>
            </div>
            <div id=dom1>
                    <div id=m4><h1>dom4</h1><div></div></div>
                    <div id=m5><h1>dom5</h1><div></div></div>
                    <div id=m6><h1>dom6</h1><div></div></div>
                    <div id=m7><h1>dom7</h1><div></div></div>
            </div>
            <div id=dom2>
                    <div id=m8><h1>dom8</h1><div></div></div>
                    <div id=m9><h1>dom9</h1><div></div></div>
                    <div id=m10><h1>dom10</h1><div></div></div>
                    <div id=m11><h1>dom11</h1><div></div></div>
            </div>
    </div>
    </body>
    </html>
    20107 月1

    收藏:魅族M8 Android内核源码和固件下载

    魅族官方提供了M8的Android内核源码,包含了完整的驱动以及说明,由于MEIZU M8的物理硬件和iPhone一样平时操作的只有1个Home键无法模拟,Android的Back、Menu以及其他因素魅族放弃了M8跑Android的计划。由于M8使用的是Samsung ARM11内核的S3C6410工作频率为667MHz,山寨厂商有一定的借鉴价值。

      有关魅族M8的ADB驱动 http://m8-android-kernel.googlecode.com/files/M8_6410_adb_driver.rar

      M8的Android编译好固件下载,刷机方法和Wince的一致,下载后直接解压放到USB Storage的根目录 http://code.google.com/p/m8-android-kernel/source/browse/bin/m8_android.rar 

      M8 for Android源码托管在Google Code上面,使用SVN工具直接提取 浏览地址 http://code.google.com/p/m8-android-kernel/source/browse/#svn/trunk 需要注意的是Android开发网发现有关Modem这块代码没有,涉及到了英飞凌的机密,不过可以看到编译好的库,直接挂上即可。

      SVN Checkout地址 http://m8-android-kernel.googlecode.com/svn/trunk

      最后是Android123找到的有关M8的移植文章网上整理的word文档,有兴趣的网友可以DIY下,不过Android开发网表示Android和M8原始的Wince比较差距较大,个人还是建议使用完善的WinCE系统,毕竟可以直播RMVB、WinCE对于M8更适合些。

      1. make menuconfig

    A. 串口改成串口3输出打印信息。
    (一) (root=/dev/nfs init=/init nfsroot=192.168.1.10:/nfs ip=192.168.1.100 console=ttySAC2,115200
    console=ttySAC2,串口2输出,必须与下面同时修改
    (二) System Type  —>S3C UART to use for low-level messages—>2
    值设成2,即串口2输出,必须与上面同时修改。

    B. Onenand驱动支持
    (一) Device Drivers  —>Memory Technology Device (MTD) support  —>OneNAND Device Support  —>
    [*]   Verify OneNAND page writes                                
    <*>   OneNAND Flash device via platform device driver
    (二) onenand的支持
    从贺超提供的linux2.6.27包drivers\mtd\onenand目录复制s3c6410.h,s3c_onenand.c,s3c_onenand.h提供对三星onenand的支持
    (三) Makefile修改
    drivers\mtd\onenand\Makefile文件最后添加一行:onenand-objs = s3c_onenand.o,编译s3c_onenand.o,连接进内核。
    (四) 在arch\arm\mach-s3c6410\mach-smdk6410.c中
     
    static struct platform_device pmem_gpu1_device = {
     .name = “android_pmem”,
     .id = 1,
     .dev = { .platform_data = &pmem_gpu1_pdata },
    };
    #endif
    的后面添加代码:
    /*add by liuyihui 2009-08-21*/
    /*
    *添加onenand驱动支持
    */
    /* OneNAND Controller */
    /* OneNAND flash controller */
    #define S3C64XX_PA_ONENAND     (0x70100000)
    #define S3C64XX_SZ_ONENAND     SZ_1M
    static struct resource s3c_onenand_resource[] = {
     [0] = {
      .start = S3C64XX_PA_ONENAND,
      .end   = S3C64XX_PA_ONENAND + S3C64XX_SZ_ONENAND – 1,
      .flags = IORESOURCE_MEM,
     }
    };
    或者替换新的代码:
     arch\arm\plat-s3c64xx\devs.c,
    linux/arch/arm/mach-s3c6400/include/mach/map.h
    struct platform_device s3c_device_onenand = {
     .name    = “onenand”,
     .id    = -1,
     .num_resources   = ARRAY_SIZE(s3c_onenand_resource),
     .resource   = s3c_onenand_resource,
     .dev.platform_data = &s3c_nand_mtd_part_info
    };
    /*add end*/
    在数组static struct platform_device *smdk6410_devices[] __initdata = {的最后添加:
     &s3c_device_onenand /*add by liuyihui 2009-08-21*/
    (五) 分区表修改:使userdata从0x0a000000开始
    文件linux/arch/arm/plat-s3c/include/plat/partition.h中:
     
            {
                    .name  = “cache”,
                    .offset  = MTDPART_OFS_APPEND,
                    .size  = (67*SZ_1M)+0x1000000,//orig:(67*SZ_1M)/*modified by cefanty 2009-08-21*/
            },
     
    (六) 修改drivers\mtd\onenand\generic.c
    复制drivers\mtd\onenand\generic.c替换掉。
     

    C. Device Drivers  —>Input device support  —>  []   Keyboards  —>
    (一) 暂时去掉键盘支持,因为键盘占用了GPK14口,GPK14口在M8是USB供电开关的GPIO,拉高才能用USB

    D. Device Drivers  —> [*] USB support  —>  <*>   USB Gadget Support  —>
    (一) <*>   USB Gadget Drivers (Ethernet Gadget (with CDC Ethernet supp
    (二) Ethernet Gadget (with CDC Ethernet support)             
    (三) [ ]       RNDIS support
    (四) d.1)选择Ethernet Gadget (with CDC Ethernet supp,用于把M8模拟成网卡,实现nfs挂载系统。同时去掉RNDIS support支持,因为ubuntu下没有驱动支持。
    (五) drivers\usb\gadget\s3c-udc-otg-hs.c修改为USB使用外部晶振
     
    //writel(0x20, S3C_USBOTG_PHYCLK); /*commented by liuyihui 2009-08-24*/
    writel(0x00, S3C_USBOTG_PHYCLK);  /*00:USB使用外部晶振。modified by liuyihui 2009-08-24*/

    2. 驱动移植和修改

    A. LCD驱动移植
    i. drivers\video\Kconfig,搜索config FB_S3C_LTS222QV,在后面添加如下选项
    config FB_S3C_LMS340KC01
     bool “LMS340KC01”
     —help—
     TBA
    ii. 添加驱动:drivers\video\samsung\s3cfb_lms340kc01.c
     
    a) 复制刘奕辉开发的s3cfb_lms340kc01.c驱动到目录drivers\video\samsung\
    b) 在drivers\video\samsung\Makefile文件最后添加内容:
    obj-$(CONFIG_FB_S3C_LMS340KC01) += s3cfb_lms340kc01.o
    iii. 修改drivers\video\samsung\s3cfb_fimd4x.c,在函数s3cfb_set_gpio最后注释代码,添加:
     

    #if 0/*commented by liuyihui 2009-08-24*/
     /* module reset */
     if (gpio_is_valid(S3C64XX_GPN(5))) {
      err = gpio_request(S3C64XX_GPN(5), “GPN”);

      if (err) {
       printk(KERN_ERR “failed to request GPN for ”
        “lcd reset control\n”);
       return err;
      }

      gpio_direction_output(S3C64XX_GPN(5), 1);
     }

     mdelay(100);

     gpio_set_value(S3C64XX_GPN(5), 0);
     mdelay(10);

     gpio_set_value(S3C64XX_GPN(5), 1);
     mdelay(10);

     gpio_free(S3C64XX_GPF(15));
     gpio_free(S3C64XX_GPN(5));
    #endif

    /*add by liuyihui 2009-08-24*/
    /*
    *打开M8 LCD需要用到的GPIO口
    */
    #if 1 //M8 GPIO set hight
     /* module reset *///LCD_nRESET_SHIFT/*4*/
     if (gpio_is_valid(S3C64XX_GPQ(4))) {
      err = gpio_request(S3C64XX_GPQ(4), “GPQ”);

      if (err) {
       printk(KERN_ERR “failed to request GPQ for ”
        “lcd reset control\n”);
       return err;
      }
      gpio_direction_output(S3C64XX_GPQ(4), 1);
     }
     mdelay(100);
     gpio_free(S3C64XX_GPQ(4));

     /* module reset *///LCD_nSS_SHIFT/*5*/
     if (gpio_is_valid(S3C64XX_GPQ(5))) {
      err = gpio_request(S3C64XX_GPQ(5), “GPQ”);

      if (err) {
       printk(KERN_ERR “failed to request GPQ for ”
        “lcd reset control\n”);
       return err;
      }
      gpio_direction_output(S3C64XX_GPQ(5), 0);
     }
     mdelay(100);
     gpio_free(S3C64XX_GPQ(5));
      
     /* module reset *///LCD_MOSI_SHIFT/*7*/
     if (gpio_is_valid(S3C64XX_GPQ(6))) {
      err = gpio_request(S3C64XX_GPQ(6), “GPQ”);

      if (err) {
       printk(KERN_ERR “failed to request GPQ for ”
        “lcd reset control\n”);
       return err;
      }
      gpio_direction_output(S3C64XX_GPQ(6), 1);
     }
     mdelay(100);
     gpio_free(S3C64XX_GPQ(6));
     
      /* module reset *///LCD_MOSI_SHIFT/*7*/
     if (gpio_is_valid(S3C64XX_GPQ(7))) {
      err = gpio_request(S3C64XX_GPQ(7), “GPQ”);

      if (err) {
       printk(KERN_ERR “failed to request GPQ for ”
        “lcd reset control\n”);
       return err;
      }
      gpio_direction_output(S3C64XX_GPQ(7), 1);
     }
     mdelay(100);
     gpio_free(S3C64XX_GPQ(7));
     
     /* module reset *///LCD_CLK_SHIFT/*8*/
     if (gpio_is_valid(S3C64XX_GPQ(8))) {
      err = gpio_request(S3C64XX_GPQ(8), “GPQ”);

      if (err) {
       printk(KERN_ERR “failed to request GPQ for ”
        “lcd reset control\n”);
       return err;
      }
      gpio_direction_output(S3C64XX_GPQ(8), 1);
     }
     mdelay(100);
     gpio_free(S3C64XX_GPQ(8));

    #endif

     return 0;
    }
    /*add end*/
    c) 
    iv. 修改drivers\video\samsung\s3cfb_spi.c,在函数s3cfb_set_gpio最后注释代码,添加:
     
    在代码#elif defined(CONFIG_PLAT_S3C64XX)后面添加:

    #define MEIZU_M8
    #ifdef MEIZU_M8
    #define S3C_FB_SPI_CLK(x) (S3C64XX_GPQ(8 + ( 4)))
    #define S3C_FB_SPI_MOSI(x) (S3C64XX_GPQ(7 + (4)))
    #define S3C_FB_SPI_CS(x) (S3C64XX_GPQ(6 + (4)))
    #else
    #define S3C_FB_SPI_CLK(x) (S3C64XX_GPC(1 + (ch * 4)))
    #define S3C_FB_SPI_MOSI(x) (S3C64XX_GPC(2 + (ch * 4)))
    #define S3C_FB_SPI_CS(x) (S3C64XX_GPC(3 + (ch * 4)))
    #endif

    B. 触摸屏移植
    drivers\input\touchscreen:synaptics510_i2c.c,synaptics510_i2c.h,Makefile,Kconfig
          
    C. 按键移植
    覆盖如下文件:目录drivers\input\keyboard\下的:gpio_keys.c
     

    3. Busybox在Android上的使用

    To build busybox
    • Download the latest version of busybox from the following website. At the time of writing the latest version was v.1.13.3.
    http://www.busybox.net
    • Extract the busybox source:
    tar jxf busybox-1.13.3.tar.bz2
    • Configure busybox by running menuconfig
    cd busybox-1.13.3/
    make menuconfig
    • In menuconfig set the following options
    Busybox Settings –> Build Options –> Build Busybox as a static binary (no shared libs)  –  Enable this option by pressing “Y”
    Busybox Settings –> Build Options –> Cross compiler prefix  –  Set this option equal to “arm-none-linux-gnueabi-”
    Busybox Settings –> Installation Options –> Don’t use /usr  –  Enable this option by pressing “Y”
    Linux Module Utilities  —>  [ ] Simplified modutils 这项不能选,否则insmod 驱动模块加载会提示找不到*.ko驱动文件的路径
    • Export path to where the cross-compiler is located on the host, for example:
    export PATH=/opt/arm/arm-2007q3/bin:$PATH
    • Build busybox
    make
     
    Installing Busybox
    ________________________________________
    To install busybox in the target file-system
    • Create a /bin directory in the target file-system. For example:
    mkdir /<path-to-android-fs>/bin
    • Copy the busybox binary to the /bin directory in the target file-system
    cp busybox /<path-to-android-fs>/bin
    •  Install the busybox command line tools on the target by executing the following commands:
    cd /bin
    ./busybox –install
     
    Make the Busybox shell the default shell
    ________________________________________
    To make the busybox shell the default shell, edit the file “init.rc” in the target file-system as follows:
    • Edit the console service so that it runs the busybox shell and not the default shell by replacing:
    service console /system/bin/sh
    With:
    service console /bin/sh
    • Add the path of the busybox command line tools to the system path variable by replacing:
    export PATH /sbin:/system/sbin:/system/bin:/system/xbin
    With
    export PATH /bin:/sbin:/system/sbin:/system/bin:/system/xbin

    Android cupcake 1.5版移植

    1. 在Android挂载SD移植

    cupcake 1.5版需要改写下列文件。

    A.    编译mountd,并在文件系统中启动这一服务。

       修改 system/core/mountd/Android.mk文件,开放最后一行

        # disabled – we are using vold now instead
        # include $(BUILD_EXECUTABLE)
        为:

        # disabled – we are using vold now instead
        include $(BUILD_EXECUTABLE)

    B.     增加 安装mountd.conf 文件

          修改 system/core/rootdir/init.rc文件

       释放下两行:

         service mountd /system/bin/mountd
              socket mountd stream 0660 root mount
    C.     修改  system/core/rootdir/Android.mk 文件, 增加 etc/mountd.conf \,如下:

        copy_from := \
           etc/dbus.conf \
           etc/init.goldfish.sh \
           etc/mountd.conf \
           etc/hosts
    D. 修改根文件系统的system\etc \mountd.conf文件:
    block_device    /dev/block/mmcblk0

    20106 月28

    触摸屏全屏浏览器(可定时关机) C#2005 源代码

    1、星期一至五,会按设定时间关机,你可以在出现关机提示时点取消(倒计时30秒);
    2、星期六日,启动程序即提示关机,无操作则自动关机,若点取消,还会在设定的时间再一次提示关机(倒计时30秒);
    3、按*号后输入密码,退出程序回到桌面;
    4、参数设置:找到安装目录下的SystemConfig.xml文件,其中starturl为起始网页地址;returntime为多久无操作返回起始网页(单位:分钟);offtime为每天关机时间;exitkey为退出程序的密码;
    5、软件需要.NET2.0环境,环境安装包有些大,就不上传了,请到 http://www.microsoft.com/downloads/details.aspx?FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=zh-cn 下载

    开源地址:http://code.google.com/p/full-screen-touch-browser/

    可以通过本站下方的EMAIL与作者交流~:)