﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>北大青鸟中博</title>
	<atom:link href="http://blog.zbitedu.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.zbitedu.com</link>
	<description>中博人自己的博客</description>
	<pubDate>Wed, 19 May 2010 23:37:49 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Chrome OS局限于上网本 难以替代桌面系统</title>
		<link>http://blog.zbitedu.com/?p=1411</link>
		<comments>http://blog.zbitedu.com/?p=1411#comments</comments>
		<pubDate>Wed, 19 May 2010 23:37:49 +0000</pubDate>
		<dc:creator>superman</dc:creator>
		
		<category><![CDATA[IT信息]]></category>

		<guid isPermaLink="false">http://blog.zbitedu.com/?p=1411</guid>
		<description><![CDATA[     Chrome OS被Google当成日后能够克敌制胜的武器，公司CEO埃里克·施密特(Eric Schmidt)曾不止一次的公开表示Chrome OS是20年来首款威胁微软的操作系统。近日，他强调Chrome OS系统有望成为继Windows和Mac之后的第三大操作系统平台。如此给自家产品贴金，引得一片哗然。基于Chrome OS的上网本尚未推出，该操作系统并未经过市场考验，埃里克·施密特何以放言业界第三。
     如果Chrome OS为第三，那么，Linux的位置如何摆放？众所周知，Chrome OS是基于Linux内核的全新操作系统。施密特的言论引起了网友们强烈的反对和不满。
     在开发初期，Google Chrome OS是一个为上网本设计的轻量级开源操作系统，使用Chrome OS的上网本预计将在2010年下半年开始销售。而Chrome OS选择上网本作为PC终端的切入点属不得已而为之。
     Google依靠广告来盈利，上网本并不是实施该战略的理想平台。因为上网本的屏幕太小了，用户还要很不情愿地接受一个事实——Google的广告还要显示在这个本来已经很小屏幕上。但Google的战略不得不靠上网本来实施，因为Google暂时还没有足够实力把Chrome浏览器安装到主流的操作系统上，现在IE和firefox已经占有半壁江山了。
     所以Chrome OS目前只能局限于上网本，谷歌Chrome OS是基于网络的操作系统，它还无法与微软的Windows相抗衡。
     兼容第三方软件是微软Windows操作系统今天取得巨大成功的原因。几十年来，微软一直对第三方软件持欢迎态度，由于Chrome OS基于互联网，可以肯定，这款操作系统将兼容基于互联网的应用程序。
     虽然谷歌进军操作系统的想法无可非议，但是其策略却过于冒进，由于无线基础设施和网络应用尚未完善，所以用Chrome OS来完全替代桌面系统的方式难以奏效。放弃大量桌面软件，将损失巨大。
     谷歌的理念非常极端：没有桌面软件，只通过网络实现一切功能。有人评价Chrome OS就像是一款改良版的浏览器。
     Chrome OS所提供的功能将更少，甚至比性能低下的上网本还少。例如，网络应用无法处理微软Word文档，无法同步iTunes曲目库，也无法使用Photoshop编辑图片。由于键盘和屏幕尺寸较小，因此搭载Chrome OS的上网本并不适合Photoshop和Word等办公软件。
     谷歌的想法是：放弃过去十几年来我们早已习惯的计算体验，用谷歌浏览器来解决一切吧。
     但市场研究公司Interpret战略和分析副总裁迈克尔·加藤伯格(Michael Gartenberg)对如今的电脑市场现状给出了无比睿智的总结：“当前的多数用户都在寻求两种方式的融合：丰富的桌面应用，以及符合意愿的网络应用。”
     他还补充道：“关于用户有可能会放弃丰富的桌面应用，而完全通过网络浏览器来处理日常运算的争论已经是老生常谈，这永远不会实现。”
     谷歌大胆的创新精神值得提倡，但是仅仅依靠Chrome OS来代替应用软件实现全部功能的理念很冒进。
     科技博客Mashable编辑本·帕尔(Ben Parr)所说：“这是一种思维的转变，旨在让网络与电脑享有同等地位。”但是由于当前的无线网络以及基于网络的应用存在一定的制约，所以目前看来这还有些过于理想化，至少还需要几年时间才能实现
     暂且不提那些是排名前三的操作系统。面对独霸天下的微软windows系列的垄断，Chrome OS变得成熟强大富有竞争力，谷歌还需要下很大的功夫。
]]></description>
			<content:encoded><![CDATA[<p>     Chrome OS被Google当成日后能够克敌制胜的武器，公司CEO埃里克·施密特(Eric Schmidt)曾不止一次的公开表示Chrome OS是20年来首款威胁微软的操作系统。近日，他强调Chrome OS系统有望成为继Windows和Mac之后的第三大操作系统平台。如此给自家产品贴金，引得一片哗然。基于Chrome OS的上网本尚未推出，该操作系统并未经过市场考验，埃里克·施密特何以放言业界第三。</p>
<p>     如果Chrome OS为第三，那么，Linux的位置如何摆放？众所周知，Chrome OS是基于Linux内核的全新操作系统。施密特的言论引起了网友们强烈的反对和不满。</p>
<p>     在开发初期，Google Chrome OS是一个为上网本设计的轻量级开源操作系统，使用Chrome OS的上网本预计将在2010年下半年开始销售。而Chrome OS选择上网本作为PC终端的切入点属不得已而为之。</p>
<p>     Google依靠广告来盈利，上网本并不是实施该战略的理想平台。因为上网本的屏幕太小了，用户还要很不情愿地接受一个事实——Google的广告还要显示在这个本来已经很小屏幕上。但Google的战略不得不靠上网本来实施，因为Google暂时还没有足够实力把Chrome浏览器安装到主流的操作系统上，现在IE和firefox已经占有半壁江山了。</p>
<p>     所以Chrome OS目前只能局限于上网本，谷歌Chrome OS是基于网络的操作系统，它还无法与微软的Windows相抗衡。</p>
<p>     兼容第三方软件是微软Windows操作系统今天取得巨大成功的原因。几十年来，微软一直对第三方软件持欢迎态度，由于Chrome OS基于互联网，可以肯定，这款操作系统将兼容基于互联网的应用程序。</p>
<p>     虽然谷歌进军操作系统的想法无可非议，但是其策略却过于冒进，由于无线基础设施和网络应用尚未完善，所以用Chrome OS来完全替代桌面系统的方式难以奏效。放弃大量桌面软件，将损失巨大。</p>
<p>     谷歌的理念非常极端：没有桌面软件，只通过网络实现一切功能。有人评价Chrome OS就像是一款改良版的浏览器。</p>
<p>     Chrome OS所提供的功能将更少，甚至比性能低下的上网本还少。例如，网络应用无法处理微软Word文档，无法同步iTunes曲目库，也无法使用Photoshop编辑图片。由于键盘和屏幕尺寸较小，因此搭载Chrome OS的上网本并不适合Photoshop和Word等办公软件。</p>
<p>     谷歌的想法是：放弃过去十几年来我们早已习惯的计算体验，用谷歌浏览器来解决一切吧。</p>
<p>     但市场研究公司Interpret战略和分析副总裁迈克尔·加藤伯格(Michael Gartenberg)对如今的电脑市场现状给出了无比睿智的总结：“当前的多数用户都在寻求两种方式的融合：丰富的桌面应用，以及符合意愿的网络应用。”</p>
<p>     他还补充道：“关于用户有可能会放弃丰富的桌面应用，而完全通过网络浏览器来处理日常运算的争论已经是老生常谈，这永远不会实现。”</p>
<p>     谷歌大胆的创新精神值得提倡，但是仅仅依靠Chrome OS来代替应用软件实现全部功能的理念很冒进。</p>
<p>     科技博客Mashable编辑本·帕尔(Ben Parr)所说：“这是一种思维的转变，旨在让网络与电脑享有同等地位。”但是由于当前的无线网络以及基于网络的应用存在一定的制约，所以目前看来这还有些过于理想化，至少还需要几年时间才能实现</p>
<p>     暂且不提那些是排名前三的操作系统。面对独霸天下的微软windows系列的垄断，Chrome OS变得成熟强大富有竞争力，谷歌还需要下很大的功夫。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zbitedu.com/?feed=rss2&amp;p=1411</wfw:commentRss>
		</item>
		<item>
		<title>微软状告杭州电脑经销商：悄悄买6台电脑验盗版</title>
		<link>http://blog.zbitedu.com/?p=1408</link>
		<comments>http://blog.zbitedu.com/?p=1408#comments</comments>
		<pubDate>Wed, 19 May 2010 23:35:45 +0000</pubDate>
		<dc:creator>superman</dc:creator>
		
		<category><![CDATA[IT信息]]></category>

		<guid isPermaLink="false">http://blog.zbitedu.com/?p=1408</guid>
		<description><![CDATA[
     预装系统软件，让顾客买了电脑马上能用，这已是电脑销售的一项基本服务。
     昨天早上8:45，西湖区法院开庭审理一起计算机软件侵权案，杭州一家电脑经销商因为这项“服务”，被美国微软公司告上法庭。
     微软公司诉称，被告是三星笔记本电脑浙江省总代理，2009年12月，微软公司发现被告在销售的三星笔记本电脑中，存在预装盗版软件的情况。
     2009年12月23日、12月30日、2010年1月15日，微软公司委托调查人员与杭州钱塘公证处的公证员在被告处买了6台不同型号的笔记本电脑，经鉴定，6台电脑里预装的多款软件为盗版，涉案的软件类型包括Windows XP操作系统、Microsoft Office 2003办公软件等。
     昨天法庭上，微软公司律师当庭出示了这几台电脑，并现场作了演示。
     微软公司认为，作为这些软件的著作权享有者，公司的权益受到了严重损害，请求法院判令被告停止侵权，销毁盗版软件安装工具，删除安装的侵权软件，并索赔61万余元。
     被告提出异议，认为微软公司无权鉴定盗版软件，否则就是既当运动员又当裁判员，鉴定报告应该由国家知识产权权威部门出具。
     双方激烈辩论两小时。
     法官宣布休庭，择期宣判。
     近年来，微软公司加大了对盗版软件的打击力度，1995年以来，微软分别在北京、上海、广东等地提起过一系列侵权诉讼。
      2003年下半年，微软公司向杭州市版权局投诉了60多家企事业单位以及百家网吧，盗用Windows操作系统软件。
     为此，杭州市版权局曾对13个区(县)市所有网吧进行清理整顿，向涉嫌使用盗版软件的网吧发出限期整改通知，要求网吧中安装的系统全部正版化。
     2009年，杭州市政府和微软公司签署战略合作备忘录，微软致力于为杭州市政府打造中国最佳“知识产权保护城市”贡献自己的力量，杭州市政府承诺将加大知识产权保护力度，鼓励政府、企业及消费者使用正版软件。
 
]]></description>
			<content:encoded><![CDATA[<div class="f14">
<p>     预装系统软件，让顾客买了电脑马上能用，这已是电脑销售的一项基本服务。</p>
<p>     昨天早上8:45，西湖区法院开庭审理一起计算机软件侵权案，杭州一家电脑经销商因为这项“服务”，被美国微软公司告上法庭。</p>
<p>     微软公司诉称，被告是三星笔记本电脑浙江省总代理，2009年12月，微软公司发现被告在销售的三星笔记本电脑中，存在预装盗版软件的情况。</p>
<p>     2009年12月23日、12月30日、2010年1月15日，微软公司委托调查人员与杭州钱塘公证处的公证员在被告处买了6台不同型号的笔记本电脑，经鉴定，6台电脑里预装的多款软件为盗版，涉案的软件类型包括Windows XP操作系统、Microsoft Office 2003办公软件等。</p>
<p>     昨天法庭上，微软公司律师当庭出示了这几台电脑，并现场作了演示。</p>
<p>     微软公司认为，作为这些软件的著作权享有者，公司的权益受到了严重损害，请求法院判令被告停止侵权，销毁盗版软件安装工具，删除安装的侵权软件，并索赔61万余元。</p>
<p>     被告提出异议，认为微软公司无权鉴定盗版软件，否则就是既当运动员又当裁判员，鉴定报告应该由国家知识产权权威部门出具。</p>
<p>     双方激烈辩论两小时。</p>
<p>     法官宣布休庭，择期宣判。</p>
<p>     近年来，微软公司加大了对盗版软件的打击力度，1995年以来，微软分别在北京、上海、广东等地提起过一系列侵权诉讼。</p>
<p>      2003年下半年，微软公司向杭州市版权局投诉了60多家企事业单位以及百家网吧，盗用Windows操作系统软件。</p>
<p>     为此，杭州市版权局曾对13个区(县)市所有网吧进行清理整顿，向涉嫌使用盗版软件的网吧发出限期整改通知，要求网吧中安装的系统全部正版化。</p>
<p>     2009年，杭州市政府和微软公司签署战略合作备忘录，微软致力于为杭州市政府打造中国最佳“知识产权保护城市”贡献自己的力量，杭州市政府承诺将加大知识产权保护力度，鼓励政府、企业及消费者使用正版软件。</p>
<p> </p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.zbitedu.com/?feed=rss2&amp;p=1408</wfw:commentRss>
		</item>
		<item>
		<title>5月Tiobe编程语言榜单出炉 苹果势力彰显</title>
		<link>http://blog.zbitedu.com/?p=1403</link>
		<comments>http://blog.zbitedu.com/?p=1403#comments</comments>
		<pubDate>Tue, 18 May 2010 23:36:57 +0000</pubDate>
		<dc:creator>superman</dc:creator>
		
		<category><![CDATA[Java技术]]></category>

		<guid isPermaLink="false">http://blog.zbitedu.com/?p=1403</guid>
		<description><![CDATA[       Tiobe周末发布了5月份编程语言排行榜，和上月相同，C语言仍然占据着第一的宝座，而四年来一直独占鳌头的Java本月也还是屈居第二。 C++、PHP、Visual Basic、C#、Python、Perl、Delphi的排名与上月相同，分居第3至9位。
　　值得一提的是，尽管增幅仅为0.08%，但是Object-C首次进入排行版前十榜单，“这很了不起，因为自从2001年6月开始TIOBE排名以来，仅有13个主流编程语言进入前十。”Object-C流行的一个主要原因是，它是唯一一个可以为iPhone或iPad编写应用程序的语言。从编程语言的角度来看，Object-C（诞生于1986年）并没有提供什么新的功能。
]]></description>
			<content:encoded><![CDATA[<p>       Tiobe周末发布了5月份编程语言排行榜，和上月相同，C语言仍然占据着第一的宝座，而四年来一直独占鳌头的Java本月也还是屈居第二。 C++、PHP、Visual Basic、C#、Python、Perl、Delphi的排名与上月相同，分居第3至9位。</p>
<p>　　值得一提的是，尽管增幅仅为0.08%，但是<strong>Object-C首次进入排行版前十榜单</strong>，“这很了不起，因为自从2001年6月开始TIOBE排名以来，仅有13个主流编程语言进入前十。”Object-C流行的一个主要原因是，它是唯一一个可以为iPhone或iPad编写应用程序的语言。从编程语言的角度来看，Object-C（诞生于1986年）并没有提供什么新的功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zbitedu.com/?feed=rss2&amp;p=1403</wfw:commentRss>
		</item>
		<item>
		<title>JAVA中的main函数详细讲解</title>
		<link>http://blog.zbitedu.com/?p=1399</link>
		<comments>http://blog.zbitedu.com/?p=1399#comments</comments>
		<pubDate>Tue, 18 May 2010 23:35:22 +0000</pubDate>
		<dc:creator>superman</dc:creator>
		
		<category><![CDATA[Java技术]]></category>

		<guid isPermaLink="false">http://blog.zbitedu.com/?p=1399</guid>
		<description><![CDATA[       JAVA中的主函数是我们再熟悉不过的了，相信每个学习过JAVA语言的人都能够熟练地写出这个程序的入口函数，但对于主函数为什么这么写，其中的每个关键字分别是什么意思，可能就不是所有人都能轻松地答出来的了。我也是在学习中碰到了这个问题，通过在网上搜索资料，并加上自己的实践终于有了一点心得，不敢保留，写出来与大家分享。
　　主函数的一般写法如下：
　　public static void main(String[] args){…}
　　下面分别解释这些关键字的作用：
　　(1)public关键字，这个好理解，声明主函数为public就是告诉其他的类可以访问这个函数。
　　(2)static关键字，告知编译器main函数是一个静态函数。也就是说main函数中的代码是存储在静态存储区的，即当定义了类以后这段代码就已经存在了。如果main()方法没有使用static修饰符，那么编译不会出错，但是如果你试图执行该程序将会报错，提示main()方法不存在。因为包含main()的类并没有实例化(即没有这个类的对象)，所以其main()方法也不会存。而使用 static修饰符则表示该方法是静态的，不需要实例化即可使用。
　　(3)void关键字表明main()的返回值是无类型。
　　**(4)参数String[] args，这是本文的重点。
　　第一、程序使用者可以在命令行状态下向某个类传递参数。看下面的例子：
　　public class ArgsDemo {
　　public static void main(String[] args) {
　　String str = new String();
　　for (int i = 0; i &#60; i++)&#62;
　　System.out.println(args[i]);
　　str += args[i];
　　}
　　System.out.println(str);
　　}
　　}
　　使用javac ArgsDemo.java命令生成ArgsDemo.class文件;然后使用“java ArgsDemo 参数一 参数二 参数三 …”的格式向ArgsDemo类传递参数。该示例程序将首先输出参数，然后输出所有参数的和。比如java ArgsDemo a b c,将得到这样的输出：
　　a
　　b
　　c
　　abc
　　需要注意的是，如果这里的循环条件不是i &#60;5，则在命令行中输入的参数必须是5个，否则将会报错，错误类型为：&#60;&#62;
　　Exception in thread “main” java.lang.ArrayIndexOutOfBoundException:3
　　at ArgsDemo.main(ArgsDemo.java:5)
　　第二、可以在另一个类中向包含main()的类传递参数，如下例：
　　public class A {
　　public static void main(String[] args)
　　{
　　for(int i=0;i &#60; p&#62;
　　System.out.println(args[i]);
　　}
　　}
　　public class [...]]]></description>
			<content:encoded><![CDATA[<p>       JAVA中的主函数是我们再熟悉不过的了，相信每个学习过JAVA语言的人都能够熟练地写出这个程序的入口函数，但对于主函数为什么这么写，其中的每个关键字分别是什么意思，可能就不是所有人都能轻松地答出来的了。我也是在学习中碰到了这个问题，通过在网上搜索资料，并加上自己的实践终于有了一点心得，不敢保留，写出来与大家分享。</p>
<p>　　主函数的一般写法如下：</p>
<p>　　public static void main(String[] args){…}</p>
<p>　　下面分别解释这些关键字的作用：</p>
<p>　　(1)public关键字，这个好理解，声明主函数为public就是告诉其他的类可以访问这个函数。</p>
<p>　　(2)static关键字，告知编译器main函数是一个静态函数。也就是说main函数中的代码是<a class="fllink" href="http://storage.chinabyte.com/" target="_blank">存储</a>在静态存储区的，即当定义了类以后这段代码就已经存在了。如果main()方法没有使用static修饰符，那么编译不会出错，但是如果你试图执行该程序将会报错，提示main()方法不存在。因为包含main()的类并没有实例化(即没有这个类的对象)，所以其main()方法也不会存。而使用 static修饰符则表示该方法是静态的，不需要实例化即可使用。</p>
<p>　　(3)void关键字表明main()的返回值是无类型。</p>
<p>　　**(4)参数String[] args，这是本文的重点。</p>
<p>　　第一、程序使用者可以在命令行状态下向某个类传递参数。看下面的例子：</p>
<p>　　public class ArgsDemo {</p>
<p>　　public static void main(String[] args) {</p>
<p>　　String str = new String();</p>
<p>　　for (int i = 0; i &lt; i++)&gt;</p>
<p>　　System.out.println(args[i]);</p>
<p>　　str += args[i];</p>
<p>　　}</p>
<p>　　System.out.println(str);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　使用javac ArgsDemo.java命令生成ArgsDemo.class文件;然后使用“java ArgsDemo 参数一 参数二 参数三 …”的格式向ArgsDemo类传递参数。该示例程序将首先输出参数，然后输出所有参数的和。比如java ArgsDemo a b c,将得到这样的输出：</p>
<p>　　a</p>
<p>　　b</p>
<p>　　c</p>
<p>　　abc</p>
<p>　　需要注意的是，如果这里的循环条件不是i &lt;5，则在命令行中输入的参数必须是5个，否则将会报错，错误类型为：&lt;&gt;</p>
<p>　　Exception in thread “main” java.lang.ArrayIndexOutOfBoundException:3</p>
<p>　　at ArgsDemo.main(ArgsDemo.java:5)</p>
<p>　　第二、可以在另一个类中向包含main()的类传递参数，如下例：</p>
<p>　　public class A {</p>
<p>　　public static void main(String[] args)</p>
<p>　　{</p>
<p>　　for(int i=0;i &lt; p&gt;</p>
<p>　　System.out.println(args[i]);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　public class B {</p>
<p>　　public static void main(String[] args)</p>
<p>　　{</p>
<p>　　c = new A();</p>
<p>　　String[] b = {&#8221;111&#8243;,&#8221;222&#8243;,&#8221;333&#8243;};</p>
<p>　　c.main(b);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　首先定义一个class A，在A中定义一个main()函数，在该函数中输出参数args。然后定义一个classB，在B中初始化一个A的实例c，然后向c传递参数，并且调用 c的main方法打印出传入的参数值。输出结果如下：</p>
<p>　　111</p>
<p>　　222</p>
<p>　　333</p>
<p>　　由于main()函数是静态函数，即不需要实例化也能使用，所以B使用下面的写法也能完成相同的功能：</p>
<p>　　public class B {</p>
<p>　　public static void main(String[] args)</p>
<p>　　{</p>
<p>　　//A c = new A();</p>
<p>　　String[] b = {&#8221;111&#8243;,&#8221;222&#8243;,&#8221;333&#8243;};</p>
<p>　　A.main(b);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　总结：参数args的主要作用是为程序使用者在命令行状态下与程序交互提供了一种手段。此外在其他类中直接使用main()函数，并传递参数也是可行的，虽然这种方法不太常用，但毕竟为我们提供了一种选择。</p>
<p>　</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zbitedu.com/?feed=rss2&amp;p=1399</wfw:commentRss>
		</item>
		<item>
		<title>RIA之战 微软欲借开源策略后来居上?</title>
		<link>http://blog.zbitedu.com/?p=1396</link>
		<comments>http://blog.zbitedu.com/?p=1396#comments</comments>
		<pubDate>Mon, 17 May 2010 23:46:16 +0000</pubDate>
		<dc:creator>superman</dc:creator>
		
		<category><![CDATA[.Net技术]]></category>

		<guid isPermaLink="false">http://blog.zbitedu.com/?p=1396</guid>
		<description><![CDATA[        近10年以来，人们一直在试图寻找一个更好的Web开发的解决方案。最初是HTML和CSS，后来又有了AJAX和Web 2.0。但是因为HTML模型是基于页面的模型，缺少客户端智能机制，所以到目前为止基于HTML的Web 应用程序对完成复杂应用方面始终跟不上步伐，整体的用户体验效果与桌面应用程序仍然有差距。
　　微软和Adobe作为Web应用领域的两大巨头，主要是采用为Web应用程序植入插件的方式来巩固Web战略。近日，在美国旧金山举行的开源大会(Open Source Business Conference)上，微软在“Web为平台”专家讨论会上宣布了针对社区群体的RIA新开源策略，将公开其RIA技术Sliverlight 的源代码。难道是巨人转性，还是另有隐情?开源策略在微软RIA战役中扮演什么样的角色?
　　一.开源RIA将引导微软走向开源时代
　　(1)RIA将成为互联网的主流
　　在互联网诞生的时候，大家都在琢磨怎么把信息通过网络主动发布出去，出于共享信息的简单目的，一种快速小型超文本语言(HTML)被创建了。历经了多次的修改和完善，众多与Internet相关的技术纷纷出现，从DHTML、XML到Java Applet、SWT、AJAX、Flash等，这些技术有些是平行发展，有些是一脉相承。但毫无例外的都追求着一个共同的目标，就是更加强大、更高效反应、更加灵敏和更精彩的可视化特性的互联网程序。
　　也就是说，在过去几年中，Web开发人员一直想构建一种比传统HTML更丰富的客户端，要实现比用HTML实现的接口更加健壮、反应更加灵敏和更具有令人感兴趣的可视化特性。这时，RIA技术出现了，它允许我们在互联网上以一种像使用Web一样简单的方式来部署富客户端程序。RIA是一种互联网应用程序， RIA目前在很多地方既指富互联网应用系统，又指富互联网应用系统的开发技术，我们也可以将其理解为下一代互联网的应用程序。
　　那么，RIA将来会成为互联网的主流么?这是一个只有一个答案的问题，那就是“会”。因此，一场新的技术战争已经悄然在RIA领域打响了。毫无疑问，Adobe的Flash是RIA技术领域中最具优势的选手，但是微软借助Silverlight技术正在改变这种情况。例如，Silverlight可以运行在所有Web浏览器上，而不仅仅是微软的IE浏览器;而且Silverlight还采用了打破微软多年老规矩的开源策略。
　　(2)微软开放Silverlight源码，向开源社区示好
　　一直对开源吝啬、不感冒的微软居然也一反常态地对开源社区示好，公开其RIA技术Sliverlight 的源代码，是巨人转性还是另有隐情呢?这当然不能仅仅只用巨人转性来解释，也不是仅仅是因为 Adobe 宣称将开放其用于 Flex RIA环境下的软件开发包代码的回应。据有关专家分析，微软公布Silverlight技术的部分源代码，以此表示对开源组织的友善态度，目的是为了籍此吸引开发社区的关注，更好地同Adobe展开竞争，更是其欲称霸Web平台领域的一种新姿态。因为居于 RIA 开发工具领先地位的 Adobe，也正希望借开放其 Flex 部分源码来巩固优势，而作为挑战者的微软想要赶上 Adobe，当然也必须要借助开源来吸引开发者使用 Silverlight。
　　微软此举从策略上来讲，可称为是实现在网络领域的一次飞跃。当然，开源并没有微软以前想的那么可怕，让Silverlight开源反而将更有好处：它将极大地扩展 Silverlight 的市场，以最快的速度普及。当 Silverlight足够普及时，微软必定会看到更多的新利益。实际上，微软的许多对手都是携着开源的力量来与微软竞争的，如Google 携开源势力强势入侵微软的多个传统强势领域，开源的 Firefox 又在不断抢占微软 IE 的市场份额，而这次 Adobe Flex RIA也打起了开源的主意，微软终于坐不住了，也破天荒地宣布 Silverlight 的开源策略。对于未来的展望，我们有理由相信只要微软尝到了 Silverlight 开源的甜头，微软就可能会尝试更多的开源计划，这也可能会成为使微软加入开源阵营的一个起点。
　　二.为什么微软RIA需要采用开源策略?
　　在RIA市场中，选用哪家的工具，一直不是最关键议题，重点是在于开发者是在哪一个RIA生态环境中。因为为了确保RIA可与内部的核心系统相连结，一个认同某个RIA生态环境的企业决策主管，极可能会下达或建议开发人员选择哪家的开发RIA工具。在这样的状况下，可以预见对RIA生态环境的认识和习惯将会成为Web开发决策的关键因素。
　　据Forrester公司的分析师表示，在RIA市场上两大巨头Adobe和微软各具优势。Flash先入为主，目前已经有了一个很大的市场，Flash技术已经应用于90%左右的PC上。微软想要拉拢这些真正的市场推动者则要花上不小的力气，而微软在RIA技术Silverlight上应用开源策略正是出于拉扰这些市场推动者的考虑。那么，为什么微软Silverlight 的发布与推广需要采用开源策略呢?
　　(1)Web开发者需要培训
　　从用户体验的角度来说，我们甚至还没有发挥出HTML的全部潜力。因此，大部分开发者认为基于标准的Web开发还大有潜力可挖，通过加强设计者与开发者的联系，Web产品的用户体验可以得到很大的提升。目前大部分Web应用还不能令人满意，但是这个问题并不完全归咎于浏览器的非标准实现，更多的是因为设计和开发者本身对Web技术的掌握还不到位。
　　一般来说，Web设计者往往感性些，通常是半技术性人员，喜欢定期购买和升级软件产品。而开发者则更理性，是纯技术性人员，卖给他们工具非常困难。和多数工程师一样，开发者通常更喜欢自己创建工具，或者使用免费提供的开源工具。开发者之所以更接受开源，是因为开源可以让他们控制自己使用的工具。因此，微软只有通过开源的方式才有望追赶Adobe。
　　(2)做大RIA市场规模，需要更广泛的协作
　　Adobe已推出多年的Flash技术与Flex工具是公认比较成熟的RIA解决方案，拥有绝大部分的市场占有率优势;而微软推出的Silverlight技术是挟程序开发领域的优势，进入网页应用市场。但为让RIA市场更为蓬勃发展，则需要建立起更广泛的RIA生态体系，这意味着微软不能只依赖设计人员或开发人员等单一族群。所以，通过开源策略可让RIA的开发人员和设计人员迅速理解RIA内部运行机制。因为就技术人员来说，开源可以极大的提高人员的技术水平，通过对开源的学习可以以最快的速度对很多基本的东西加以理解。
　　另外，开源技术的灵活性可使得它能够比专有解决方案更易于添加更多自由和个性化的功能。这是因为开源技术的开发、测试和发布过程完全是透明的，同时提供的源代码及完善的文档，有助于开发者清楚地了解开源技术的工作原理和实现方法，也更容易得到质量更好的实现方案。这就保证了开源技术除功能上不逊于封闭源代码的方案外，还具有更高的灵活性，以及更低的采购和使用成本。因此，开源能对整个RIA开发生态环境的技术发展起到极大的推动作用。
]]></description>
			<content:encoded><![CDATA[<p>        近10年以来，人们一直在试图寻找一个更好的Web开发的解决方案。最初是HTML和CSS，后来又有了AJAX和Web 2.0。但是因为HTML模型是基于页面的模型，缺少客户端智能机制，所以到目前为止基于HTML的Web 应用程序对完成复杂应用方面始终跟不上步伐，整体的用户体验效果与桌面应用程序仍然有差距。</p>
<p>　　微软和Adobe作为Web应用领域的两大巨头，主要是采用为Web应用程序植入插件的方式来巩固Web战略。近日，在美国旧金山举行的开源大会(Open Source Business Conference)上，微软在“Web为平台”专家讨论会上宣布了针对社区群体的RIA新开源策略，将公开其RIA技术Sliverlight 的源代码。难道是巨人转性，还是另有隐情?开源策略在微软RIA战役中扮演什么样的角色?</p>
<p>　　<strong>一.开源RIA将引导微软走向开源时代</strong></p>
<p>　　(1)RIA将成为互联网的主流</p>
<p>　　在互联网诞生的时候，大家都在琢磨怎么把信息通过网络主动发布出去，出于共享信息的简单目的，一种快速小型超文本语言(HTML)被创建了。历经了多次的修改和完善，众多与Internet相关的技术纷纷出现，从DHTML、XML到Java Applet、SWT、AJAX、Flash等，这些技术有些是平行发展，有些是一脉相承。但毫无例外的都追求着一个共同的目标，就是更加强大、更高效反应、更加灵敏和更精彩的可视化特性的互联网程序。</p>
<p>　　也就是说，在过去几年中，Web开发人员一直想构建一种比传统HTML更丰富的客户端，要实现比用HTML实现的接口更加健壮、反应更加灵敏和更具有令人感兴趣的可视化特性。这时，RIA技术出现了，它允许我们在互联网上以一种像使用Web一样简单的方式来部署富客户端程序。RIA是一种互联网应用程序， RIA目前在很多地方既指富互联网应用系统，又指富互联网应用系统的开发技术，我们也可以将其理解为下一代互联网的应用程序。</p>
<p>　　那么，RIA将来会成为互联网的主流么?这是一个只有一个答案的问题，那就是“会”。因此，一场新的技术战争已经悄然在RIA领域打响了。毫无疑问，Adobe的Flash是RIA技术领域中最具优势的选手，但是微软借助Silverlight技术正在改变这种情况。例如，Silverlight可以运行在所有Web浏览器上，而不仅仅是微软的IE浏览器;而且Silverlight还采用了打破微软多年老规矩的开源策略。</p>
<p>　　(2)微软开放Silverlight源码，向开源社区示好</p>
<p>　　一直对开源吝啬、不感冒的微软居然也一反常态地对开源社区示好，公开其RIA技术Sliverlight 的源代码，是巨人转性还是另有隐情呢?这当然不能仅仅只用巨人转性来解释，也不是仅仅是因为 Adobe 宣称将开放其用于 Flex RIA环境下的软件开发包代码的回应。据有关专家分析，微软公布Silverlight技术的部分源代码，以此表示对开源组织的友善态度，目的是为了籍此吸引开发社区的关注，更好地同Adobe展开竞争，更是其欲称霸Web平台领域的一种新姿态。因为居于 RIA 开发工具领先地位的 Adobe，也正希望借开放其 Flex 部分源码来巩固优势，而作为挑战者的微软想要赶上 Adobe，当然也必须要借助开源来吸引开发者使用 Silverlight。</p>
<p>　　微软此举从策略上来讲，可称为是实现在网络领域的一次飞跃。当然，开源并没有微软以前想的那么可怕，让Silverlight开源反而将更有好处：它将极大地扩展 Silverlight 的市场，以最快的速度普及。当 Silverlight足够普及时，微软必定会看到更多的新利益。实际上，微软的许多对手都是携着开源的力量来与微软竞争的，如Google 携开源势力强势入侵微软的多个传统强势领域，开源的 Firefox 又在不断抢占微软 IE 的市场份额，而这次 Adobe Flex RIA也打起了开源的主意，微软终于坐不住了，也破天荒地宣布 Silverlight 的开源策略。对于未来的展望，我们有理由相信只要微软尝到了 Silverlight 开源的甜头，微软就可能会尝试更多的开源计划，这也可能会成为使微软加入开源阵营的一个起点。</p>
<p>　　<strong>二.为什么微软RIA需要采用开源策略?</strong></p>
<p>　　在RIA市场中，选用哪家的工具，一直不是最关键议题，重点是在于开发者是在哪一个RIA生态环境中。因为为了确保RIA可与内部的核心系统相连结，一个认同某个RIA生态环境的企业决策主管，极可能会下达或建议开发人员选择哪家的开发RIA工具。在这样的状况下，可以预见对RIA生态环境的认识和习惯将会成为Web开发决策的关键因素。</p>
<p>　　据Forrester公司的分析师表示，在RIA市场上两大巨头Adobe和微软各具优势。Flash先入为主，目前已经有了一个很大的市场，Flash技术已经应用于90%左右的PC上。微软想要拉拢这些真正的市场推动者则要花上不小的力气，而微软在RIA技术Silverlight上应用开源策略正是出于拉扰这些市场推动者的考虑。那么，为什么微软Silverlight 的发布与推广需要采用开源策略呢?</p>
<p>　　(1)Web开发者需要培训</p>
<p>　　从用户体验的角度来说，我们甚至还没有发挥出HTML的全部潜力。因此，大部分开发者认为基于标准的Web开发还大有潜力可挖，通过加强设计者与开发者的联系，Web产品的用户体验可以得到很大的提升。目前大部分Web应用还不能令人满意，但是这个问题并不完全归咎于浏览器的非标准实现，更多的是因为设计和开发者本身对Web技术的掌握还不到位。</p>
<p>　　一般来说，Web设计者往往感性些，通常是半技术性人员，喜欢定期购买和升级软件产品。而开发者则更理性，是纯技术性人员，卖给他们工具非常困难。和多数工程师一样，开发者通常更喜欢自己创建工具，或者使用免费提供的开源工具。开发者之所以更接受开源，是因为开源可以让他们控制自己使用的工具。因此，微软只有通过开源的方式才有望追赶Adobe。</p>
<p>　　(2)做大RIA市场规模，需要更广泛的协作</p>
<p>　　Adobe已推出多年的Flash技术与Flex工具是公认比较成熟的RIA解决方案，拥有绝大部分的市场占有率优势;而微软推出的Silverlight技术是挟程序开发领域的优势，进入网页应用市场。但为让RIA市场更为蓬勃发展，则需要建立起更广泛的RIA生态体系，这意味着微软不能只依赖设计人员或开发人员等单一族群。所以，通过开源策略可让RIA的开发人员和设计人员迅速理解RIA内部运行机制。因为就技术人员来说，开源可以极大的提高人员的技术水平，通过对开源的学习可以以最快的速度对很多基本的东西加以理解。</p>
<p>　　另外，开源技术的灵活性可使得它能够比专有解决方案更易于添加更多自由和个性化的功能。这是因为开源技术的开发、测试和发布过程完全是透明的，同时提供的源代码及完善的文档，有助于开发者清楚地了解开源技术的工作原理和实现方法，也更容易得到质量更好的实现方案。这就保证了开源技术除功能上不逊于封闭源代码的方案外，还具有更高的灵活性，以及更低的采购和使用成本。因此，开源能对整个RIA开发生态环境的技术发展起到极大的推动作用。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zbitedu.com/?feed=rss2&amp;p=1396</wfw:commentRss>
		</item>
		<item>
		<title>Windows Azure入门：使用Queue Storage</title>
		<link>http://blog.zbitedu.com/?p=1393</link>
		<comments>http://blog.zbitedu.com/?p=1393#comments</comments>
		<pubDate>Mon, 17 May 2010 23:44:19 +0000</pubDate>
		<dc:creator>superman</dc:creator>
		
		<category><![CDATA[.Net技术]]></category>

		<guid isPermaLink="false">http://blog.zbitedu.com/?p=1393</guid>
		<description><![CDATA[      本文将会介绍如何使用Queue Storage。Queue Storage提供给我们一个云端的队列。我们可以用Queue Storage来进行进程间的相互通信(包括运行在不同机器上的进程之间的通信)。一个使用Queue Storage经典的场景是，在一个Web应用程序中，用户通过表单递交给服务器数据，服务器收到数据后将进行处理，而这一处理将花费很多时间。这种情况下，服务器端通过Queue Storage可以把用户递交的信息存储在队列中，后台再运行一个程序从队列中取得数据进行信息的处理。以往如果程序时运行在Windows操作系统上，那么我们可以使用MSMQ来做类似的工作。而Queue Storage的出现为我们提供了另一种选择。特别是在非Windows操作系统上，我们依然可以使用Queue Storage的REST API来很方便地使用它。　　
       为了方便.NET开发人员，我们在SDK中提供了Microsoft.WindowsAzure.StorageClient类来帮助发送REST请求。
　　步骤一：创建解决方案和项目
　　由于我们要在本地模拟环境下测试Queue Storage,首先，请确保Development Storage的管理器程序已经启动。我们可以找到管理器的进程手动启动或者让Visual Studio帮助我们启动他。
　　右击工具栏中Development Fabric的图标，选择”Show Development Storage UI”。弹出如下图所示的窗口：
　　我们要关注的是Service management中Queue所在的一行。要确保Status为Running。
　　确认完毕后启动Visual Studio，并且新建两个Console项目。我们将演示如何在一个Console程序中往Queue Storage中添加信息然后另外一个Console程序如何读取并处理信息。
　　步骤二：添加SDK程序集引用
　　在两个Console项目中均添加对C:\Program Files\Windows Azure SDK\v1.1\ref\Microsoft.WindowsAzure.StorageClient.dll的引用。该路径为SDK默认安装路径，如果你不能在这个路径中找到Microsoft.WindowsAzure.StorageClient.dll请从SDK安装路径中寻找。
　　步骤三：添加代码
　　首先在两个项目中的Program.cs中均引用命名空间：

using System.Threading;
　　using Microsoft.WindowsAzure;
　　using Microsoft.WindowsAzure.StorageClient;


 
　　　　然后在其中一个项目(为了叙述方便，后面称之为Client项目)的Main方法中加入如下代码，我们将用它来向Queue Storage中添加信息。

static void Main(string[] args)
　　{
　　var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
　　var queueStorage = storageAccount.CreateCloudQueueClient();
　　// 检查名为helloworldqueue的队列是否被创建，如果没有，创建它
　　var queue = queueStorage.GetQueueReference(&#8220;helloworldqueue&#8220;);
　　queue.CreateIfNotExist();
　　Console.WriteLine(&#8220;Client is running&#8230;&#8220;);
　　while (true) {
　　// 插入数据到队列中
　　queue.AddMessage(new CloudQueueMessage(string.Format(&#8220;client sent information: {0}&#8220;,DateTime.UtcNow.ToString())));
　　// 每次插入数据后线程休息3秒
　　Thread.Sleep(3000);
　　}
　　}


接着在另外一个项目(为了叙述方便，后面称之为Server项目)的Main方法中加入如下代码，我们将用它来从Queue Storage中读取信息和进行处理。

static void Main(string[] args)
　　{
　　var [...]]]></description>
			<content:encoded><![CDATA[<p>      本文将会介绍如何使用Queue Storage。Queue Storage提供给我们一个云端的队列。我们可以用Queue Storage来进行进程间的相互通信(包括运行在不同机器上的进程之间的通信)。一个使用Queue Storage经典的场景是，在一个Web应用程序中，用户通过表单递交给<span style="color: #000000;">服务器</span>数据，<span style="color: #000000;">服务器</span>收到数据后将进行处理，而这一处理将花费很多时间。这种情况下，<span style="color: #000000;">服务器</span>端通过Queue Storage可以把用户递交的信息存储在队列中，后台再运行一个程序从队列中取得数据进行信息的处理。以往如果程序时运行在Windows<span style="color: #000000;">操作系统</span>上，那么我们可以使用MSMQ来做类似的工作。而Queue Storage的出现为我们提供了另一种选择。特别是在非Windows<span style="color: #000000;">操作系统</span>上，我们依然可以使用Queue Storage的REST API来很方便地使用它。　　</p>
<p>       为了方便.NET开发人员，我们在SDK中提供了Microsoft.WindowsAzure.StorageClient类来帮助发送REST请求。</p>
<p>　　步骤一：创建解决方案和项目</p>
<p>　　由于我们要在本地模拟环境下测试Queue Storage,首先，请确保Development Storage的管理器程序已经启动。我们可以找到管理器的进程手动启动或者让Visual Studio帮助我们启动他。</p>
<p>　　右击工具栏中Development Fabric的图标，选择”Show Development Storage UI”。弹出如下图所示的窗口：</p>
<p>　　我们要关注的是Service management中Queue所在的一行。要确保Status为Running。</p>
<p>　　确认完毕后启动Visual Studio，并且新建两个Console项目。我们将演示如何在一个Console程序中往Queue Storage中添加信息然后另外一个Console程序如何读取并处理信息。</p>
<p>　　步骤二：添加SDK程序集引用</p>
<p>　　在两个Console项目中均添加对C:\Program Files\Windows Azure SDK\v1.1\ref\Microsoft.WindowsAzure.StorageClient.dll的引用。该路径为SDK默认安装路径，如果你不能在这个路径中找到Microsoft.WindowsAzure.StorageClient.dll请从SDK安装路径中寻找。</p>
<p>　　步骤三：添加代码</p>
<p>　　首先在两个项目中的Program.cs中均引用命名空间：</p>
<div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; border: windowtext 0.5pt solid;">
<div><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Threading;</p>
<p>　　</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Microsoft.WindowsAzure;</p>
<p>　　</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Microsoft.WindowsAzure.StorageClient;</p>
<p></span></div>
</div>
<p> </p>
<p>　　　　然后在其中一个项目(为了叙述方便，后面称之为Client项目)的Main方法中加入如下代码，我们将用它来向Queue Storage中添加信息。</p>
<div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; border: windowtext 0.5pt solid;">
<div><span style="color: #000000;">static void Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)</p>
<p>　　{</p>
<p>　　var storageAccount </span><span style="color: #000000;">=</span><span style="color: #000000;"> CloudStorageAccount.DevelopmentStorageAccount;</p>
<p>　　var queueStorage </span><span style="color: #000000;">=</span><span style="color: #000000;"> storageAccount.CreateCloudQueueClient();</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 检查名为helloworldqueue的队列是否被创建，如果没有，创建它</p>
<p>　　var queue </span><span style="color: #000000;">=</span><span style="color: #000000;"> queueStorage.GetQueueReference(</span><span style="color: #800000;">&#8220;</span><span style="color: #800000;">helloworldqueue</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);</p>
<p>　　queue.CreateIfNotExist();</p>
<p>　　Console.WriteLine(</span><span style="color: #800000;">&#8220;</span><span style="color: #800000;">Client is running&#8230;</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);</p>
<p>　　</span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">true</span><span style="color: #000000;">) {</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 插入数据到队列中</p>
<p>　　queue.AddMessage(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> CloudQueueMessage(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.Format(</span><span style="color: #800000;">&#8220;</span><span style="color: #800000;">client sent information: {0}</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">,DateTime.UtcNow.ToString())));</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 每次插入数据后线程休息3秒</p>
<p>　　Thread.Sleep(</span><span style="color: #800080;">3000</span><span style="color: #000000;">);</p>
<p>　　}</p>
<p>　　}</p>
<p></span></div>
</div>
<p>接着在另外一个项目(为了叙述方便，后面称之为Server项目)的Main方法中加入如下代码，我们将用它来从Queue Storage中读取信息和进行处理。</p>
<div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; border: windowtext 0.5pt solid;">
<div><span style="color: #000000;">static void Main(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)</p>
<p>　　{</p>
<p>　　var storageAccount </span><span style="color: #000000;">=</span><span style="color: #000000;"> CloudStorageAccount.DevelopmentStorageAccount;</p>
<p>　　var queueStorage </span><span style="color: #000000;">=</span><span style="color: #000000;"> storageAccount.CreateCloudQueueClient();</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 检查名为helloworldqueue的队列是否被创建，如果没有，创建它</p>
<p>　　var queue </span><span style="color: #000000;">=</span><span style="color: #000000;"> queueStorage.GetQueueReference(</span><span style="color: #800000;">&#8220;</span><span style="color: #800000;">helloworldqueue</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);</p>
<p>　　queue.CreateIfNotExist();</p>
<p>　　Console.WriteLine(</span><span style="color: #800000;">&#8220;</span><span style="color: #800000;">Server is running&#8230;</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">);</p>
<p>　　</span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)</p>
<p>　　{</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 从队列中读取一条信息</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 收到信息后可以根据收到的信息做处理，为了演示方便我们这里只是把信息显示出来</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 在云端发送消息后这条消息将对于后续的请求不可见，但是并未被删除。我们需要显示删除它。</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 否则在一段时间后该消息将重新可见。这一设计的好处是确保了所有消息都能够被处理。</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 如果程序在收到消息后处理消息前就异常终止了那么数据依然在一段时间后可以被重新处理。</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 详情请参考MSDN文档</p>
<p>　　var message </span><span style="color: #000000;">=</span><span style="color: #000000;"> queue.GetMessage();</p>
<p>　　</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (message !</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)</p>
<p>　　{</p>
<p>　　Console.WriteLine(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.Format(</span><span style="color: #800000;">&#8220;</span><span style="color: #800000;">Message retrieved: {0}</span><span style="color: #800000;">&#8220;</span><span style="color: #000000;">, message.AsString));</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 处理完数据后必须显示删除消息</p>
<p>　　queue.DeleteMessage(message);</p>
<p>　　}</p>
<p>　　</span><span style="color: #000000;">//</span><span style="color: #000000;"> 每次读取数据后线程休息3秒</p>
<p>　　Thread.Sleep(</span><span style="color: #800080;">3000</span><span style="color: #000000;">);</p>
<p>　　}</p>
<p></span></div>
</div>
<p>　　步骤四：观察并分析代码</p>
<p>　　步骤三中的代码中，首先我们通过CloudStorageAccount.DevelopmentStorageAccount来说明我们使用的本地的Development Storage自带账户而不是真正的云端存储服务账户。(如果要用真实账户可以使用</p>
<p>　　CloudStorageAccount.Parse(&#8221;DefaultEndpointsProtocol=https;AccountName=[用户名];AccountKey=[密码]&#8220;);</p>
<p>　　//DefaultEndpointsProtocol=https可以改成DefaultEndpointsProtocol=http表示用HTTP而不是HTTPS</p>
<p>　　来实例化对象)然后通过该账户类来实例化一个Queue客户端类。这两步是使用SDK中StorageClient程序集来调用Queue Storage服务的必要步骤。</p>
<p>　　Client项目中的代码相对简单。大约每隔3秒向Queue Storage中插入一条数据。Server端的项目中我们则大约每隔3秒从Queue Storage中读取一条数据。处理完毕后将之删除。对于为什么必须在读取后显示删除的问题请参考注释部分。</p>
<p>　　步骤五：运行程序</p>
<p>　　先运行Client程序然后运行Server个程序。如果一切正常，你将会看到Server项目的Console程序输出收到的消息：</p>
<p>　　注意由于是本地模拟，Client和Server程序需要要在同一台机器上运行。但是如果使用真实账户的话，Client和Server程序就可以跨越机器进行通信了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zbitedu.com/?feed=rss2&amp;p=1393</wfw:commentRss>
		</item>
		<item>
		<title>索尼酝酿推平板电脑对抗iPad 重心仍在电子书</title>
		<link>http://blog.zbitedu.com/?p=1390</link>
		<comments>http://blog.zbitedu.com/?p=1390#comments</comments>
		<pubDate>Sun, 16 May 2010 23:48:23 +0000</pubDate>
		<dc:creator>superman</dc:creator>
		
		<category><![CDATA[IT信息]]></category>

		<guid isPermaLink="false">http://blog.zbitedu.com/?p=1390</guid>
		<description><![CDATA[
     近日，索尼信息技术产品部门高级副总裁Mike Abary在旧金山j接受采访时表示：“不只是苹果的原因，几年前我们就已经开始考虑研发平板机了，因为它可以创造一些市场机会。”
     索尼方面进而表示，正在考虑研发一款平板机PC，但是他们需要进一步观察消费者对平板机的热情。
     Abary说：“苹果已经为业界开了个好头，我们现在可以根据iPad的销量更好的判断市场的接受程度，只有确认存在大量的市场需求，索尼才会推出自己的平板机。”
    从Abary的表态来看，索尼应该不会跟随苹果、惠普、戴尔等其它厂商一样迅速推出自家的平板机。索尼目前正集中于电子书阅读器市场，进一步缩小其电子书与亚马逊Kindle的销量差距。
     苹果iPad用了28天销量就突破了100万，这让不少制造商感到推出平板机的必要性。不过从目前的已知消息来看，索尼还要进一步观察找出足够的证据显示市场对平板机的需求。
]]></description>
			<content:encoded><![CDATA[<div class="f14">
<p>     近日，索尼信息技术产品部门高级副总裁Mike Abary在旧金山j接受采访时表示：“不只是苹果的原因，几年前我们就已经开始考虑研发平板机了，因为它可以创造一些市场机会。”</p>
<p>     索尼方面进而表示，正在考虑研发一款平板机PC，但是他们需要进一步观察消费者对平板机的热情。</p>
<p>     Abary说：“苹果已经为业界开了个好头，我们现在可以根据iPad的销量更好的判断市场的接受程度，只有确认存在大量的市场需求，索尼才会推出自己的平板机。”</p>
<p>    从Abary的表态来看，索尼应该不会跟随苹果、惠普、戴尔等其它厂商一样迅速推出自家的平板机。索尼目前正集中于电子书阅读器市场，进一步缩小其电子书与亚马逊Kindle的销量差距。</p>
<p>     苹果iPad用了28天销量就突破了100万，这让不少制造商感到推出平板机的必要性。不过从目前的已知消息来看，索尼还要进一步观察找出足够的证据显示市场对平板机的需求。</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.zbitedu.com/?feed=rss2&amp;p=1390</wfw:commentRss>
		</item>
		<item>
		<title>乔布斯与博客撰稿人辩论 称苹果做法动机纯洁</title>
		<link>http://blog.zbitedu.com/?p=1387</link>
		<comments>http://blog.zbitedu.com/?p=1387#comments</comments>
		<pubDate>Sun, 16 May 2010 23:46:56 +0000</pubDate>
		<dc:creator>superman</dc:creator>
		
		<category><![CDATA[默认]]></category>

		<guid isPermaLink="false">http://blog.zbitedu.com/?p=1387</guid>
		<description><![CDATA[
     北京时间5月16日早间消息，据国外媒体报道，美国科技博客ValleyWag撰稿人里安·泰特(Ryan Tate)周六通过电子邮件与苹果CEO史蒂夫·乔布斯(Steve Jobs)就创新和开放等问题进行了激烈的辩论。乔布斯在邮件中表示，苹果做法的动机是纯洁的。
     与此前曝光苹果下一代iPhone原型机的科技博客Gizmodo一样，ValleyWag也是Gawker Media旗下博客。以下为泰特和乔布斯邮件往来的部分内容：
泰特：
     如果鲍勃·迪伦(Bob Dylan)现在只有20岁，那么他对你们公司会有什么样的感觉？他是否会认为iPad完全与变革无关？变革意味着自由。
乔布斯：
     是的。是保护你的隐私数据不被程序窃取的自由，是使你的电池不被程序破坏的自由，是使你免于色情内容的自由。这些正在改变，而PC行业的传统人士会认为他们的时代已经逝去。就是这样。
泰特：
 当微软试图让所有人都采用Win32应用程序接口(API)编写程序时，这是否是技术问题？Adobe这样做，你是否感到高兴？
你们有机会设定新平台未来的发展方向，包括新的手机和平板电脑平台，这是未来的平台。看见与以往一样的报复性做法，我感到很失望。
或许我的说法有一些尖刻，因为我不认为这是技术问题。你们在强加你们的道德准则，例如在色情内容方面，在“商业机密”方面，在技术纯洁性方面。苹果自身使用翻译层和中间API。Objective C和Windows版iTunes是这一方面的尝试。任何编写过代码的人都知道中间API的强大功能和重要性。
我不希望苹果的政策影响我同事的工作。我认为，法庭对此将有最终的解释。我对此感到担忧。
乔布斯：
你获得的信息不准确。没有人去影响其他人。你相信了许多错误的博客报道。
微软有权在他们的平台上施加任何规则。如果人们不喜欢，他们可以去其他平台上编程，一些人是这样做的。他们也可以收购其他平台，也有人这样做。
对我们来说，我们只是尝试带来并维护我们所希望的用户体验。你可以不同意我们的做法，但我们的动机是纯洁的。
另一方面，你做了什么伟大的工作？你是否创造了什么，还是只是批评他人的工作，并贬低他们的动机？
 
]]></description>
			<content:encoded><![CDATA[<div class="f14">
<p>     北京时间5月16日早间消息，据国外媒体报道，美国科技博客ValleyWag撰稿人里安·泰特(Ryan Tate)周六通过电子邮件与苹果CEO史蒂夫·乔布斯(Steve Jobs)就创新和开放等问题进行了激烈的辩论。乔布斯在邮件中表示，苹果做法的动机是纯洁的。</p>
<p>     与此前曝光苹果下一代iPhone原型机的科技博客Gizmodo一样，ValleyWag也是Gawker Media旗下博客。以下为泰特和乔布斯邮件往来的部分内容：</p>
<p><strong>泰特：</strong></p>
<p>     如果鲍勃·迪伦(Bob Dylan)现在只有20岁，那么他对你们公司会有什么样的感觉？他是否会认为iPad完全与变革无关？变革意味着自由。</p>
<p><strong>乔布斯：</strong></p>
<p>     是的。是保护你的隐私数据不被程序窃取的自由，是使你的电池不被程序破坏的自由，是使你免于色情内容的自由。这些正在改变，而PC行业的传统人士会认为他们的时代已经逝去。就是这样。</p>
<p><strong>泰特：</strong></p>
<p> 当微软试图让所有人都采用Win32应用程序接口(API)编写程序时，这是否是技术问题？Adobe这样做，你是否感到高兴？</p>
<p>你们有机会设定新平台未来的发展方向，包括新的手机和平板电脑平台，这是未来的平台。看见与以往一样的报复性做法，我感到很失望。</p>
<p>或许我的说法有一些尖刻，因为我不认为这是技术问题。你们在强加你们的道德准则，例如在色情内容方面，在“商业机密”方面，在技术纯洁性方面。苹果自身使用翻译层和中间API。Objective C和Windows版iTunes是这一方面的尝试。任何编写过代码的人都知道中间API的强大功能和重要性。</p>
<p>我不希望苹果的政策影响我同事的工作。我认为，法庭对此将有最终的解释。我对此感到担忧。</p>
<p><strong>乔布斯</strong>：</p>
<p>你获得的信息不准确。没有人去影响其他人。你相信了许多错误的博客报道。</p>
<p>微软有权在他们的平台上施加任何规则。如果人们不喜欢，他们可以去其他平台上编程，一些人是这样做的。他们也可以收购其他平台，也有人这样做。</p>
<p>对我们来说，我们只是尝试带来并维护我们所希望的用户体验。你可以不同意我们的做法，但我们的动机是纯洁的。</p>
<p>另一方面，你做了什么伟大的工作？你是否创造了什么，还是只是批评他人的工作，并贬低他们的动机？</p>
<p> </p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.zbitedu.com/?feed=rss2&amp;p=1387</wfw:commentRss>
		</item>
		<item>
		<title>Java对数函数及Java对数运算</title>
		<link>http://blog.zbitedu.com/?p=1384</link>
		<comments>http://blog.zbitedu.com/?p=1384#comments</comments>
		<pubDate>Sun, 16 May 2010 02:15:21 +0000</pubDate>
		<dc:creator>superman</dc:creator>
		
		<category><![CDATA[Java技术]]></category>

		<guid isPermaLink="false">http://blog.zbitedu.com/?p=1384</guid>
		<description><![CDATA[　　Java对数函数的计算方法非常有问题，然而在API中却有惊人的误差。但是假如运用了以下的方法，用Java处理数字所碰到的小麻烦就可以轻而易举的解决了。
　　Sun的J2SE提供了一个单一的Java对数方法——double java.lang.Math.log(double)，这很轻易使用。请看如下代码：
　　double x = Math.log(5);
　　等价于：x = ln 5 或 x = loge5，即以e为底的自然对数。
　　假如你想使用Java来计算机对数，算底不同的对数又该如何做呢？很遗憾，我们还没有办法计算以10为底或以2为底的对数。但是它们却是在计算Java对数时用的最多的。要想解决这个问题，需要使用数学和对数方程：
　　logx(y) =loge(x) / loge(y)，换底公式
　　这只需一段简单的Java程序来实现对数的运算：
　　package com.generationjava.math;
　　public class Logarithm {
　　static public double log(double value, double base) {
　　return Math.log(value) / Math.log(base);
　　}
　　}
　　使用Java对数函数计算100的以10为底的对数就变为非常简单了：
　　double log = Logarithm.log(100, 10); // log is 2.0
　　512的以2为底的对数是：
　　double log = Logarithm.log(512, 2); // log is 9.0
　　下面的两个简单的Java对数运算方法也都是很有用的：
　　static  public double log2(double value) {
　　return log(value, 2.0);
　　}
　　static public double log10(double [...]]]></description>
			<content:encoded><![CDATA[<div class="STYLE1">　　<span style="color: #0000ff;">Java</span>对数函数的计算方法非常有问题，然而在API中却有惊人的误差。但是假如运用了以下的方法，用<span style="color: #0000ff;">Java</span>处理数字所碰到的小麻烦就可以轻而易举的解决了。</div>
<p>　　Sun的J2SE提供了一个单一的Java对数方法——double java.lang.Math.log(double)，这很轻易使用。请看如下代码：</p>
<p>　　double x = Math.log(5);</p>
<p>　　等价于：x = ln 5 或 x = loge5，即以e为底的自然对数。</p>
<p>　　假如你想使用Java来计算机对数，算底不同的对数又该如何做呢？很遗憾，我们还没有办法计算以10为底或以2为底的对数。但是它们却是在计算Java对数时用的最多的。要想解决这个问题，需要使用数学和对数方程：</p>
<p>　　logx(y) =loge(x) / loge(y)，换底公式</p>
<p>　　这只需一段简单的Java程序来实现对数的运算：</p>
<p>　　package com.generationjava.math;</p>
<p>　　public class Logarithm {</p>
<p>　　static public double log(double value, double base) {</p>
<p>　　return Math.log(value) / Math.log(base);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　使用Java对数函数计算100的以10为底的对数就变为非常简单了：</p>
<p>　　double log = Logarithm.log(100, 10); // log is 2.0</p>
<p>　　512的以2为底的对数是：</p>
<p>　　double log = Logarithm.log(512, 2); // log is 9.0</p>
<p>　　下面的两个简单的Java对数运算方法也都是很有用的：</p>
<p>　　static  public double log2(double value) {</p>
<p>　　return log(value, 2.0);</p>
<p>　　}</p>
<p>　　static public double log10(double value) {</p>
<p>　　return log(value, 10.0);</p>
<p>　　}</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zbitedu.com/?feed=rss2&amp;p=1384</wfw:commentRss>
		</item>
		<item>
		<title>Java语言中的ClassLoader与Package机制</title>
		<link>http://blog.zbitedu.com/?p=1381</link>
		<comments>http://blog.zbitedu.com/?p=1381#comments</comments>
		<pubDate>Sun, 16 May 2010 02:13:30 +0000</pubDate>
		<dc:creator>superman</dc:creator>
		
		<category><![CDATA[Java技术]]></category>

		<guid isPermaLink="false">http://blog.zbitedu.com/?p=1381</guid>
		<description><![CDATA[　    为了深入了解Java的ClassLoader机制，我们先来做以下实验：
　　package java.lang;public class Test {　public static void main(String[] args) {　char[] c = &#8220;1234567890&#8243;.toCharArray();　String s = new String(0, 10, c);}}
　　String类有一个Package权限的构造函数String（int offset， int length， char[] array），按照默认的访问权限，由于Test属于java.lang包，因此理论上应该可以访问String的这个构造函数。编译通过！执行时结果如下：
　　Exception in thread &#8220;main&#8221; java.lang.SecurityException:Prohibited package name:java.lang　at java.lang.ClassLoader.defineClass(Unknown Source)　at java.security.SecureClassLoader.defineClass(Unknown Source)　at java.net.URLClassLoader.defineClass(Unknown Source)　at java.net.URLClassLoader.access$100(Unknown Source)　at java.net.URLClassLoader$1.run(Unknown Source)　at java.security.AccessController.doPrivileged(Native Method)　at java.net.URLClassLoader.findClass(Unknown Source)　at java.lang.ClassLoader.loadClass(Unknown Source)　at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)　at java.lang.ClassLoader.loadClass(Unknown Source)　at java.lang.ClassLoader.loadClassInternal(Unknown Source)
　　希奇吧？要弄清为什么会有SecurityException，就必须搞清楚ClassLoader的机制。
　　Java的ClassLoader就是用来动态装载class的，ClassLoader对一个class只会装载一次，JVM使用的ClassLoader一共有4种：
　　启动类装载器，标准扩展类装载器，类路径装载器和网络类装载器。
　　这4种ClassLoader的优先级依次从高到低，使用所谓的“双亲委派模型”。确切地说，假如一个网络类装载器被请求装载一个java.lang.Integer，它会首先把请求发送给上一级的类路径装载器，假如返回已装载，则网络类装载器将不会装载这个java.lang.Integer，假如上一级的类路径装载器返回未装载，它才会装载java.lang.Integer.
　　类似的，类路径装载器收到请求后（无论是直接请求装载还是下一级的ClassLoader上传的请求），它也会先把请求发送到上一级的标准扩展类装载器，这样一层一层上传，于是启动类装载器优先级最高，假如它按照自己的方式找到了java.lang.Integer，则下面的ClassLoader 都不能再装载java.lang.Integer，尽管你自己写了一个java.lang.Integer，试图取代核心库的java.lang.Integer是不可能的，因为自己写的这个类根本无法被下层的ClassLoader装载。
　　再说说Package权限。Java语言规定，在同一个包中的class，假如没有修饰符，默认为Package权限，包内的class都可以访问。但是这还不够准确。确切的说，只有由同一个ClassLoader装载的class才具有以上的Package权限。比如启动类装载器装载了java.lang.String，类路径装载器装载了我们自己写的java.lang.Test，它们不能互相访问对方具有Package权限的方法。这样就阻止了恶意代码访问核心类的Package权限方法。
　　为了深入了解Java的ClassLoader机制，我们先来做以下实验：
　　package java.lang;public [...]]]></description>
			<content:encoded><![CDATA[<p>　    为了深入了解<span style="color: #0000ff;">Java</span>的ClassLoader机制，我们先来做以下实验：</p>
<p>　　package java.lang;public class Test {　public static void main(String[] args) {　char[] c = &#8220;1234567890&#8243;.toCharArray();　String s = new String(0, 10, c);}}</p>
<p>　　String类有一个Package权限的构造函数String（int offset， int length， char[] array），按照默认的访问权限，由于Test属于java.lang包，因此理论上应该可以访问String的这个构造函数。编译通过！执行时结果如下：</p>
<p>　　Exception in thread &#8220;main&#8221; java.lang.SecurityException:Prohibited package name:java.lang　at java.lang.ClassLoader.defineClass(Unknown Source)　at java.security.SecureClassLoader.defineClass(Unknown Source)　at java.net.URLClassLoader.defineClass(Unknown Source)　at java.net.URLClassLoader.access$100(Unknown Source)　at java.net.URLClassLoader$1.run(Unknown Source)　at java.security.AccessController.doPrivileged(Native Method)　at java.net.URLClassLoader.findClass(Unknown Source)　at java.lang.ClassLoader.loadClass(Unknown Source)　at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)　at java.lang.ClassLoader.loadClass(Unknown Source)　at java.lang.ClassLoader.loadClassInternal(Unknown Source)</p>
<p>　　希奇吧？要弄清为什么会有SecurityException，就必须搞清楚ClassLoader的机制。</p>
<p>　　<span style="color: #0000ff;">Java</span>的ClassLoader就是用来动态装载class的，ClassLoader对一个class只会装载一次，JVM使用的ClassLoader一共有4种：</p>
<p>　　启动类装载器，标准扩展类装载器，类路径装载器和网络类装载器。</p>
<p>　　这4种ClassLoader的优先级依次从高到低，使用所谓的“双亲委派模型”。确切地说，假如一个网络类装载器被请求装载一个java.lang.Integer，它会首先把请求发送给上一级的类路径装载器，假如返回已装载，则网络类装载器将不会装载这个java.lang.Integer，假如上一级的类路径装载器返回未装载，它才会装载java.lang.Integer.</p>
<p>　　类似的，类路径装载器收到请求后（无论是直接请求装载还是下一级的ClassLoader上传的请求），它也会先把请求发送到上一级的标准扩展类装载器，这样一层一层上传，于是启动类装载器优先级最高，假如它按照自己的方式找到了java.lang.Integer，则下面的ClassLoader 都不能再装载java.lang.Integer，尽管你自己写了一个java.lang.Integer，试图取代核心库的java.lang.Integer是不可能的，因为自己写的这个类根本无法被下层的ClassLoader装载。</p>
<p>　　再说说Package权限。Java语言规定，在同一个包中的class，假如没有修饰符，默认为Package权限，包内的class都可以访问。但是这还不够准确。确切的说，只有由同一个ClassLoader装载的class才具有以上的Package权限。比如启动类装载器装载了java.lang.String，类路径装载器装载了我们自己写的java.lang.Test，它们不能互相访问对方具有Package权限的方法。这样就阻止了恶意代码访问核心类的Package权限方法。</p>
<p>　　为了深入了解Java的ClassLoader机制，我们先来做以下实验：</p>
<p>　　package java.lang;public class Test {　public static void main(String[] args) {　char[] c = &#8220;1234567890&#8243;.toCharArray();　String s = new String(0, 10, c);}}</p>
<p>　　String类有一个Package权限的构造函数String（int offset， int length， char[] array），按照默认的访问权限，由于Test属于java.lang包，因此理论上应该可以访问String的这个构造函数。编译通过！执行时结果如下：</p>
<p>　　package java.lang;</p>
<p>　　public class Test {</p>
<p>　　public static void main(String[] args) {</p>
<p>　　char[] c = &#8220;1234567890&#8243;.toCharArray();</p>
<p>　　String s = new String(0, 10, c);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　Exception in thread &#8220;main&#8221; java.lang.SecurityException:</p>
<p>　　Prohibited package name:</p>
<p>　　java.lang</p>
<p>　　at java.lang.ClassLoader.defineClass(Unknown Source)</p>
<p>　　at java.security.SecureClassLoader.defineClass(Unknown Source)</p>
<p>　　at java.net.URLClassLoader.defineClass(Unknown Source)</p>
<p>　　at java.net.URLClassLoader.access$100(Unknown Source)</p>
<p>　　at java.net.URLClassLoader$1.run(Unknown Source)</p>
<p>　　at java.security.AccessController.doPrivileged(Native Method)</p>
<p>　　at java.net.URLClassLoader.findClass(Unknown Source)</p>
<p>　　at java.lang.ClassLoader.loadClass(Unknown Source)</p>
<p>　　at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)</p>
<p>　　at java.lang.ClassLoader.loadClass(Unknown Source)</p>
<p>　　at java.lang.ClassLoader.loadClassInternal(Unknown Source)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zbitedu.com/?feed=rss2&amp;p=1381</wfw:commentRss>
		</item>
	</channel>
</rss>
