‘编程学习’ 分类下的所有文章
20109 月10

最封闭的开源系统:Android的八宗罪

  你以为 Android 是开放的吗?Google 采用了一系列的控制手段来保证每一部 Android 手机上都有它指定的软件和硬件规格。然而,他们同时又利用 Android SDK 里面的 Apache 许可证来大肆鼓吹 Android 是开放的。

  没错,Google 的移动平台是当前最聪明的利用开源来驱动商业议程的实现。但在我们深入探讨这个为什么之前,我们先说说为什么 Android 的成功和开源并没有什么关系吧。

  是什么成就了 Android

  虽然早期饱受质疑,Google 的 Android 移动平台已经在移动行业得到了营运商和手机厂商的广泛支持,仅剩固执的诺基亚。Android 从 08 年的一款机型发展到 10 年的 50 多款,发展之快让绝大多数的业内观察家们吃惊。

  Android 的成功和开源毫无关系。它的成功依靠下列三个主要因素:

JAVA手机网[www.cnjm.net]  - 苹果. 这点看起来很奇怪,Android 竟然是靠它的主要对手发家的?让我来分析下。在 iPhone 空前绝后的成功以及苹果对网络营运商傲慢苛刻的态度下,营运商们迫切的在寻找一种更便宜的选择。因此这些第一层最大的营运商们开始积极的用 Android 来开发手机给那些买不起 iPhone 的用户,更重要的是,他们不需要每卖一部手机就给 Apple 300 欧元以上的回扣。

  - 全世界的营运商们迫切希望自己鹤立鸡群. Android 给他们提供了一个统一的软件平台。他们可以很方便的定制自己想要的系统,而且花费的代价也很低(3 个月的时间,这个比 SavaJe 12 个月以上的定制周期要短很多)。对大型的营运商来说,Android 也降低了他们在智能手机软件方面的投资。这也是为什么大多数的 Android 手机项目背后都是营运商和 OEM 厂商的组合。

JAVA手机网[www.cnjm.net]  - 高通. 这个市值 100 亿美元的芯片厂商对 Android 的崛起功不可没。手机开发产商可以直接拿高通已经为 Android 集成好的方案,在 9-12 个月的时间内向市场上推广。(相比起来摩托罗拉的 CLIQ 花了 16 个月,而 HTC G1 则花费了 2 年多的时间)。除了高通,我们还有 TI 的 OMAP3 平台(摩托罗拉 Droid/Milestone 基于此方案)。ST Ericsson 和 Broadcom 也在做 Android 的集成方案。 JAVA手机网[www.cnjm.net]   换句话说,在 Android 手机上,大多数的 OEM 预算花在了定制方面。而 Symbian 的绝大部分预算花在无线通信的移植和硬件整合上了(Symbian 2001 年所做决定的结果)。总的来说,Android 使 OEM 厂商可以大幅削减研发预算,把钱花在定制这个刀刃上。当然我们不能忘记 Android 是免费的。这个免费让众多厂商激动不已。

  话说回来,Android 用开源来做市场宣传,非常成功的搅乱了整个行业,导致了诺基亚对 Symbian 的收购以及 Windows Mobile 的全面崩溃(不过译者觉得 iPhone OS 4 的多重任务机制的发布让 WP7 真正成了杯具帝)。不过更重要的是,利用开源的名号和 Google 的魅力,Android 吸引了成千上万的开发者,虽然 Android 并不能让开发者们赚到很多钱,而且 Android 手机的数量不到苹果产品的十分之一(连支持收费的国家都比苹果少6倍)。

  在开源的面纱后面

  让人更惊讶的是 Android 到底有多封闭,尽管外面包裹着 Google“不作恶”的口号和 Apache 授权许可证模式。借用亨利福特在 Model-T 相关的书里的一句话:“任何人都可以自由挑选 Android 的颜色,只要那是黑色”(anyone can have Android in their own colour as long as it’s black)。Android 是一个绝好的商业案例——展现一家公司是如何用开源来赢得关注和社区参与,而且同时保持一个非常严密的商业运作。

JAVA手机网[www.cnjm.net]  Google 是如何控制着每台 Android 手机里采用什么服务、软件和硬件的?这个搜索巨人建立了一套很完善的控制管理系统。为了挖掘更多的信息,我们花了两个月,和很多与 Android 有着紧密联系的内部人士进行了讨论。我们发掘出的事实让人震惊。从宏观方面说,Google 控制 Android 手机构成以下八宗罪:

  1. 私有分支. Android 有多个私有分支,这些只给几个特定合作伙伴,往往是那些开发 Android 的 OEM 厂商,而且这些只提供给需要知道的人。这些私有分支比已经公布的 SDK 要超前起码 6 个月,也是 OEM 厂商可以保持竞争力的关键。而公开的 SDK 则是为第三方应用提供私有分支里发布的最新功能。

  2. 封闭的评估流程. 所有的代码评估员似乎都是 Google 员工,也就是说从社区提交的代码只有 Google 才有权力决定是否接受。而且 Google 内部还流传着“并非此处发明”的一种思考文化,他们觉得 Google 员工写的代码是天下无敌。随便问任何一个给 Android 提交过补丁的人,你会得到一样的答复:几乎没有什么提交被 Google 接受,而被拒绝的时候往往没有任何理由和解释。

  3. 进化的速度. Google 对 Android 的创新的速度是移动行业内绝无仅有的,他们在 18 个月里发布了四个大版本。想在 Android 上面做文章的 OEM 厂商只得紧跟 Google 的步伐(这里想起了移动杯具的OMS),不然就跟不上新功能的发布和 bug 修复。Nexus One、Droid、G1 和其它带有 Google体验应用的手机给 Google 提供了创新的测试场。

  4. 不完善的软件. 用公开的 SDK 并不能完整的建造手机。缺少的几个关键的部份包括无线通信的集成模块、国际化语言包、营运商信息包以及闭源的 Google 应用,比如 Market、Gmail 和 Gtalk。虽然 Cyanogen 可以自己定制 ROM,但里面包含的那些应用没有授权,所以不能发布在商业用途的 Android 手机上。

  5. 闭门的开发者社区. Android Market 是唯一一个拥有超过四万个程序并和每个手机 OEM 厂商都签有合约的 android 程序商店。这个限制很要命,因为没有一个 OEM 厂商愿意发布没有 Market 的 Android 手机(天朝是另类)。当然,在 Market 上发布应用是个非常简单的事情,没有什么审批的步骤,这个和苹果的 AppStore 刚好相反。

  6. 反分化合约. 外界几乎不清楚原来 OHA 的成员都签署了反分化的合约。但这个合约更可以被理解为不能发布没有通过 CTS 兼容测试的手机。(下面细说 CTS)(译者注:貌似中国移动已经被踢出 Android 的私有分支,是不是因为他们建立的 OMS 违反了这个协定呢?)

  7. 保密的发展蓝图. Android 的发展蓝图是很杯具的,到目前为止,公开发布的发展蓝图还停留在 2009 年的第一季度。如果想要看到内部的发展蓝图,你需要 Google 的赐福.

  8. Android 商标. Google 掌握着 Android 的注册商标和冠名权。任何想用 Android 品牌的厂商都需要得到Google的授权。简单的说:进 Google 的门,或者没有门。如果你要自己做 Android 分枝,你就全部靠自己了,比如你需要中国移动那么大的公司。

  Android 的传奇中还有个大篇章:CTS(兼容测试组),也就是 Google 一套测试 Android 手机是不是达到 Google 的标准。根据我们的线人消息,CTS 不仅仅测试软件的 API 部份,它还包括性能测试,硬件功能,设备设计,UI 用户界面需求,和机内打包的服务。CTS 决定了你可以添加额外功能,但不能从最基础的配置中削减功能。除了 CTS 以外,OEM 厂商还要和 Google 签订授权合同,这样他们才能打包 Google 的服务,比如 Gmail、YouTube 等等。

  CTS 限制了 OEM 定制弱化版 Android 手机的想法(译者注:山寨的机会啊!MTK、中微星,年底发布些低端 Android 手机吧!)。这也大大限制了 Android 开拓低端市场的能力。CTS 和向前兼容 4 万多个应用的事实,极大的挑战着 Google 想占领智能手机市场2位数的市场份额目标。这些限制,还有 Google 与 OEM 亦敌亦友的合作关系,使得 OEM 圈内掀起了建立 Android 基金的讨论。

  Google 的终极目标

  手握 Android,Google 的目标是为自己产生收入的服务提供一个稳定的平台。在当前,这个广告生意。但未来,Google 的目标在语音服务(几十亿没有数据服务的用户)和 Google Checkout(比如变成移动领域的 visa 卡)。但不管 Google 的终极目标是什么,我们应该意识到 Android 和 Windows Mobile、Mac OSX 或 PalmOS 相比,并没有开放多少。Android 是用开源来驱动商业议程的最聪明的案例之一。Android 骨子里并没有我们潜意识里所灌输的那么多不作恶思想。

20108 月26

一家公司发展的胡言乱语

终于一天早上,睁开极不情愿被睁开的眼睛,厌倦了文档、厌倦了没完没了的BUG、需求反复、项目延期,做出一个极为重要的决定:自己干。忽悠到2个人,于是创业开始。

第一个项目时间很紧张,是经过层层外包转包而来,尽管利润微薄,但是3个人在一起非常开心,我们做持续集成、做自动化测试,所有问题都经过集体讨论解决,很累,但每个人都很努力,因为大家的目的都是一致的。终于,项目按时完成,我们拿到自己挣到的第一笔钱。

由于第一个项目完成的很不错,我们很快接到了第二个项目,第二个项目比较大,公司很快又招了好几个人,公司的规模扩充到10人左右,因为只有一个项目,大家还是在一个项目组中共同努力,每个人都比较开心,尽管有些时候,也会为一些编程问题发生争吵,不过现在这还不是一个问题。我们很敏捷,第二个项目也完成的很好。

一年之后,公司发展顺利,已经扩大到50人左右,可以同时进行多个项目了。我们按照项目组建团队,每个团队都是全功能团队,包括了业务分析、程序员、测试和项目经理。项目经理对整个项目负责,同时向我汇报工作。我不再参加编程,因为我现在很忧愁:上个月,因为没有项目,那帮程序员天天聊QQ,这真让我苦闷!这个月突然又有了好几个项目,靠,那帮程序员不够用了!项目经理向我抱怨要增加人手。这种忧愁的生活让我生活像坐过山车,不踏实。我已经将自己的全部精力投入到市场和销售中去,我需要有市场计划,但是这个好像不受我的控制。不管怎么样,稳定的项目来源是我最关注的,我决定多找些市场和销售人员。

不过开发这块还是让我很放心的,每个项目组都很敏捷,每个项目组都很独立,没有争吵。但是也存在问题,因为项目来源很杂,基本上是只要赚钱就要做,所以所用的技术也很杂,java\c#\ruby\groovy\php,这对有些程序员来说是好事,扩大了他们的视野,但是也有些程序员很不喜欢,因为他们认为太泛,要不停的学习,他们喜欢找一门语言专下去。同时,我也发现了另外一些问题,就是项目质量也会受到技术的影响,其中就有个java的项目,因为是swing,很多人不熟悉,结果项目发生了延期。我很生气,找到了该项目的项目经理,项目经理很委屈:为什么我们什么项目都接,都不能选择性的接吗?这又回到了市场的原因,我们还远未强大到选择接项目的地步。同时,项目组之间产生了互斥的关系,项目经理们都很不愿意就技术问题互相帮助,A项目组以前有人做过PHP,B项目组现在做PHP,当B项目组需要帮组时,A项目组以工作忙进行了拒绝。就这个问题,我找一些骨干成员进行了讨论,决定成立相应的开发社区,这是个虚拟组织,定期组织相关的技术培训,这个组织跨越项目组的界限。但是后来我又发现,其实这样的效果也不是很好,技术积累很有限,一些项目做得相当初级,关键原因还是技术太杂,人员变动太大。这时,我决定找个专职的HR,从入职入手,只找符合公司标准的人才,要尽量找到聪明的程序员,为此,每次面试,我都尽量参加。

不管怎么说,除去市场和销售,我还是感到满意的。现在公司按照项目组建项目性团队,每个团队都是全功能团队,这样最重要的好处就是解决了工作中的工作相依性,BA\Dev\QA都在一个项目组中,有任何问题都可以进行非正式的沟通,这样如果需求有任何变化,整个项目组能够非常容易的进行调整,同时,通过将客户拉入项目,一方面能够迅速的进行反馈和拥抱变化,另一方面,客户也会承担一定的项目风险。

又一年过去了,公司取得了进一步的成功,这次的成功来自于市场,由于我们在电信行业进行了一系列成功的项目,使得我们的软件在电信行业小有名气,这时我做出了一个重要的决定:公司性质的转型,由项目性公司转为行业公司,我们只做电信相关的项目,同时技术栈也固定为c++和java。这样的好处是很明显的,首先就是通过进入细分行业,项目的来源比较稳定了,二来我们也比较容易的积累业务和技术。

同时,我发现了一些问题:项目规模开始扩大,有项目经理向我抱怨,他根本没有办法同时管理20多个人的项目团队,除去客户之外,他每天的工作就是在听组员汇报、处理冲突,忙不过来。我意识到,当项目组主要采取有机结构和非正式沟通时,项目管理者根本管理不过来超出20人的团队。同时,因为电信企业都拥有相同的业务背景和标准,他们的需求都非常相似,处于不同项目组的BA私下里经常沟通,互相请教问题,因为电信一系列的标准化,所以对BA也提出了要求,他们需要了解电信的这些业务和标准,而不是什么都去问客户。这样,很快,我将所有的BA都从项目组里抽出来,组成了单独的需求部门,项目经理的管理人数减少了,BA们可以聚集在一起解决问题,并对相似的问题进行整理,编写文档,业务知识能够很容易积累。但是这样做也有成本,就是Dev需要找BA确定需求,这样割裂了原有的工作相依性,但是因为需求比较稳定,Dev和BA的沟通成本尽管上升,但是总的次数减少了,这是我希望看到的。很多时候,BA通过文档与Dev沟通,这并没有想象中的那么坏,需求的稳定将这个坏处减少了,同时,项目经理总是可以组织BA和Dev不定期进行非正式沟通。

因为技术栈和需求稳定,我开始独立出单独的产品部,将通用的功能和底层技术栈进行封装。我开始重视文档,我要求产品部尤其重视文档和代码注释,文档在于产品部与项目部的沟通大部分要依靠文档,在不能进行非正式沟通的情况下,文档是唯一的选择,同时,文档在需要长期维护的代码里也非常关键,尽管结对,但是我不能认为每个人都能对所有代码都很熟悉,同时,项目规模的扩大,必然要划分模块组,结对也只是限定在模块组内,即只要有部门的划分,则必然需要文档来沟通!尽管很多人相信代码是最好的文档,但是很多人也忘记了一个很重要的前提,即好的代码才是最好的文档,我更愿意相信由于种种管理因素(部门之间的隔阂、成员之间水平的差异、进度)的影响,代码必然是逐渐腐化的,所以,在代码水平做不到很好时,就必须有文档,必须有注释!

公司继续发展,项目规模越来越大,我按照模块对项目进行了划分,每个模块对应于一个开发小组,每个小组一个负责人员,他们向项目经理负责,项目经理向我负责,同时项目部门依赖于产品部门。部门之间的沟通通常情况下依赖文档,由我统一进行两个部门之间的协调。

终于,发生了一件很严重的事情,交付的项目出现了一个严重的BUG,这让我很生气,开始追究责任,最后发现BUG出现在两个开发小组之间的一个接口约定,于是文档的要求进一步严格了,同时,公司成立了独立的质量保证部,对交付的项目进行统一测试。很自然,为了激励测试部的积极性,我规定按发现BUG的数量发放测试部的奖金。

于是,我发现,项目中到处都是文档、开发人员与QA对立严重,代码质量以安全第一,不愿重构,这一切,都是我当初最反感的。我怀念起最开始的日子。于是,我开始找敏捷咨询,通过外部力量进行部分的改进。。。。

很明显,我个人所理解的全功能团队(即所有成员都在一个部门里)将变得不太可行,而必然会产生某种形式的分组,不管是正式的还是非正式的,这种分组而产生的沟通成本可以认为是管理成本的一部分。@ronghao  JavaEye

20108 月18

UCenter忘记创始人密码的解决方法

修改data/config.inc.php文件

找到UC_FOUNDERPW,UC_FOUNDERSALT分别改成一下的字符串:

define(‘UC_FOUNDERPW’, ‘047099adb883dc19616dae0ef2adc5b6’); define(‘UC_FOUNDERSALT’, ‘311254’);

修改完后,创始人密码变为:123456789

别忘记修改密码。:)

20108 月14

网站变灰代码

祖国多灾多难,希望网站变灰的次数越少越好。。

html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); }
20108 月13

安装软件提示没有找到盘符或“My Pictures”中含有无效的字符的解决办法

1、开始—运行—输入regedit—打开注册表

2、F3,在弹出的框里输入“My Pictures”或盘符,搜索

3、检查搜索到的“My Pictures”或盘符的值路径对不对

4、修改值路径为正确可访问的路径,OK。

PS:一般ghost系统特别是xp容易出这个问题,有些软件改变了其路径,之后电脑又进行了ghost还原。

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随浏览器窗口大小变化

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

    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);
    }
20107 月31

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

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

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

    20107 月29

    buffalo ajax 实现表单提交

    前台代码

    
    
        
        test
        
        
        
    
    
    
        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);
            }
        }
    
    
    test
    
    
    
      

    id:   name:   age:  memo:  

    后台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使用说明

    源代码

    
    
    
    LeftMenu
    
    
    
    
        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 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 += "";
                        }
                        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";
            }
        }
     
    
        
    
    
    

    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文件,加入 代码。

    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         net.buffalo.web.servlet.ApplicationServlet    

                buffalo         /buffalo/*    

    1. 需要引入的jar包为:

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

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

    1. 编写需要调用的业务类。 如:
    2. 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";
       }

      }

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

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

    下面为前台调用

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

         

    1. 编写调用js代码

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

      
          var endPoint = "/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) {
     }
    }
    
       
    
    

                     消息

     信箱
     待办
            Buffalo ajax 最新版下载地址:http://buffalo.sourceforge.net/download.html