2009年6月30日星期二

IIS下PHP的ISAPI和FastCGI比较

  在Windows IIS 6.0下配置PHP,通常有CGI、ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异。

  1、CGI(通用网关接口/Common Gateway Interface)一般是可执行程序,例如EXE文件,和WEB服务器各自占据着不同的进程,而且一般一个CGI程序只能处理一个用户请求。这样,当用户请求数量非常多时,会大量占用系统的资源,如内存、CPU时间等,造成效能低下。

  2、ISAPI(Internet Server Application Program Interface)是微软提供的一套面向WEB服务的API接口,它能实现CGI提供的全部功能,并在此基础上进行了扩展,如提供了过滤器应用程序接口。ISAPI应用大多数以DLL动态库的形式使用,可以在被用户请求后执行,,在处理完一个用户请求后不会马上消失,而是继续驻留在内存中等待处理别的用户输入。此外,ISAPI的DLL应用程序和WEB服务器处于同一个进程中,效率要显著高于CGI。

  在Windows Server 2003的IIS6下配置ISAPI方式的PHP,配置方法是,在IIS的“WEB服务扩展”中,添加一个新的WEB服务扩展,程序后缀为PHP,ISAPI程序为php5isapi.dll,然后再“环境变量”-“系统变量”中增加变量名PHPRC,数值为php.ini的路径,在Internet信息服务管理器中,选择网站或应用程序的根目录,打开目录属性页(右键选择“属性”),再选择“主目录”。点击“配置”按钮,选择“映射”Tab页。点击“添加...”,在“可执行文件”设为: c:phpphp5isapi.dll,扩展名设为.php,选择“确认文件是否存在”,然后“确定”保存设置。重启服务器即可完成PHP的配置。

  3、FastCGI是可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。传统的CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性等。

  FastCGI已经集成于IIS7,也支持IIS6,在IIS6中的安装方法可参见微软的官方文档,我这里简单翻译一下。

  先点这里下载一个32位的FastCGI extension for IIS,然后将其安装,安装后的文件应该放到system32inetsrv目录下。

  之后打开system32inetsrv目录,执行下面的语句,其中c:php为你的PHP目录,可以修改为其他数值。

  cscript fcgiconfig.js -add -section:"PHP" -extension:php -path:"c:phpphp-cgi.exe"

  在Internet信息服务管理器中,选择网站或应用程序的根目录,打开目录属性页(右键选择“属性”),再选择“主目录”。点击“配置”按钮,选择“映射”Tab页。点击“添加...”,在“可执行文件”设为: c:windowssystem32inetsrvfcgiext.dll,扩展名设为.php,选择“确认文件是否存在”,然后“确定”保存设置。

  修改php.ini文件,增加如下语句:

  fastcgi.impersonate = 1
  cgi.fix_pathinfo = 1
  cgi.force_redirect = 0

  之后打开system32inetsrv目录,执行以下语句:

  cscript fcgiconfig.js -set -section:"PHP" -InstanceMaxRequests:10000
  cscript fcgiconfig.js -set -section:"PHP" -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000

  最后,配置c:php目录的安全性,使得IIS_WPG组对于这个目录有读取和执行的权限。

  这时候,基于FastCGI的PHP就成功配置到IIS6上了。

  不过根据我自己的测试,FastCGI的性能比ISAPI的好像高不了多少,不知道Windows Server 2008下的IIS7是不是会好一些。这里是微软提供的基于内置FastCGI的IIS7安装PHP的方法。

2009年6月29日星期一

Google Trends和Google Insights

  Google Trends(谷歌趋势)发布过中文版,是Google推出的一款基于搜索日志分析的应用产品,通过这个工具可以知道某一搜索关键词在Google被搜索的频率和相关统计数据。Google Insights是Google推出的一个新服务,目前只有英文版,功能比Google Trends多一些,相当于Google Trends的升级版,主要用于市场分析等商业用途。

  Google Insights和Google Trends的区别:

  Google官方解释,Google Insights和Google Trends使用相同的数据来源,Google Insights主要面向那些研究人员或广告商的那类需要更多更高级功能的用户。

  因此我们知道,Google Trends和Google Insights由于使用同一数据来源,因此统计的结果理论上应该是相同的。

  继续昨天讨论的问题,对于“儿子”这个关键字的统计,Google Trends搜索“儿子”和Google Insights搜索“儿子”的统计的结果的确完全一致,统计曲线吻合,两者均将6月6日和6月19日做为两个峰值。

搜索“儿子”

Google Trends搜索“儿子”

搜索“儿子”

Google Insights搜索“儿子”

  对于其他关键字的搜索,两者的统计曲线也是完全吻合的,大家可以搜索一下自己所想得到的热门关键字来看看,例如“百度”、“QQ”等。

  但是,对于“儿子与情人”、“儿子母亲”等等类似的关键字,两者的统计却不尽相同。

  在Google Trends上看,之前搜索量很低,6月18号开始出现大量搜索,之后呈现不规则的曲线下降,后来还有反弹。

搜索“儿子与情人”

Google Trends搜索“儿子与情人”

  而Google Insights显示从11号开始出现“线性”增长趋势,到了17号达到顶峰,之后出现“线性”下降趋势,也就是说该关键词的搜索量按照固定比例增加,第一天10个,第二天20个,第三天30个,这种搜索现象非常奇特。

 

搜索“儿子与情人”

Google Insights搜索“儿子与情人”(全球范围)

搜索“儿子与情人”

Google Insights搜索“儿子与情人”(北京地区)

  我觉得,Google Insights对于“儿子与情人”等关键字的统计数据有很多不合理的地方。

  首先是搜索顶点,6月18号央视新闻之后,该关键词的搜索量不升反降,和Google Trends相矛盾,也不符合常识,因为6月18号之后肯定会有大量网民对其进行搜索验证的,从而带动这个关键词搜索量上升。

  其次是搜索曲线,对于“儿子与情人”等等关键字,Google Trends显示的是一条曲线,先暴增,然后下降,然后再增,较为符合常识,而Google Insights显示的是一条线性增长和下降的直线,也就是说,每天增加的搜索量按比例呈有规则的增长,并且按比例下降,特别是18号之后也没有任何波动,依旧呈现“线性”下降趋势,这显然不符合常识。

  最后,最为重要的一个证据是,单独以北京地区范围搜索“儿子与情人”,会发现其数据和全球范围Google Insights搜索“儿子与情人”的数据有极大出入,北京地区的Google Insights数据呈现完整的曲线,顶峰是6月18日,与Google Trends的曲线基本相同,北京拥有大量网络用户,并曾被匿名用户指责刷数据,但Google Insights这两个曲线明显呈现自相矛盾的地方,很明显,Google Insights对于该关键字搜索的全球数据真实性存在极大的疑问。

  因此可以看出,Google Insights对于上述几个关键词的统计结果有很多不合常识的地方,和实际情况以及Google Trends的数据有很多矛盾之处,相对来说Google Trends的统计数据更具准确性,更值得参考,做分析和判断应该以Google Trends的数据为准。

2009年6月28日星期日

谷歌被阴谋陷害之谜

  这两天看到Google Docs上有匿名人士写的一篇文章,称根据谷歌趋势和Google Insights来分析,谷歌上搜索“儿子”后出现的低俗内容都是之前人为刷关键字形成的,为了验证真伪,我也通过使用Google TrendsGoogle insights对“儿子”这个关键词进行了分析。

  根据Google Trends的显示,“儿子”的搜索量在6月17日的时候还非常低,在18日的时候就开始上扬,6月19日达到了顶峰,而央视新闻联播和焦点访谈抨击谷歌的节目正好是在6月18日晚上播出,因此“儿子”的搜索量剧增完全有可能是因为大量观众看完新闻后进行的搜索而产生的,我记得我自己当时看完新闻后就搜索过两次,相信对此关注的网民都会进行一番搜索,从而导致其搜索量的剧增。而下面的新闻引用量的增长恰好和上面的搜索量同步,说明新闻媒体也是在6月19日才大量报道这一新闻的。

谷歌真的被陷害了吗?

Google Trends上关于“儿子”的三十天搜索数据

搜索儿子

Google Trends上关于“儿子”的“搜索建议关键词”的三十天搜索数据

  支持Google的网友的主要根据是下面这张图,这也是比较令我困惑的地方,从这张图上看,的确是这几个关键字从11号开始搜索量上升,并且持续到17号,并且只有北京地区有同时搜索这几个关键词的行为。

搜索儿子

  按道理来说,Google Insights应该和Google Trends的数据是相同的,但是同样的关键字,我在Google Trends上进行查询,却是另一个结果,Google Trends显示这几个关键词在17号的搜索还是0,18号开始猛增,同时搜索城市包括北京、广州、上海三个城市,这两个系统按道理来说都是调用Google的数据中心,为什么同一个数据却出现不同的结果,这也是令我困惑的地方。

搜索儿子

  我在稍后的一篇文章中指出,Google Insights的数据真实性存在极大的疑问,使用Google Insights在全球范围内和单独在北京地区搜索该关键字,呈现出截然不同的两个结果,如下图所示。 

搜索“儿子与情人”

Google Insights搜索“儿子与情人”(全球范围)

搜索“儿子与情人”

Google Insights搜索“儿子与情人”(北京地区)

  从上图可见,单独以北京地区范围搜索“儿子与情人”,会发现其数据和全球范围Google Insights搜索“儿子与情人”的数据有极大出入,北京地区的Google Insights数据呈现完整的曲线,顶峰是6月18日,与Google Trends的曲线基本相同,北京拥有大量网络用户,并曾被匿名用户指责刷数据,但Google Insights这两个曲线明显呈现自相矛盾的地方,很明显,Google Insights对于该关键字搜索的全球数据真实性存在极大的疑问。

  因此,说谷歌搜索“儿子”的信息是“刷”出来的,并没有足够的证据,恰恰相反,反面的证据倒是不少,我在2007年2月,谷歌“搜索建议”刚刚上线的时候,我就曾经截过一幅图,下图就是那时候搜索“儿子”所产生的“搜索建议”,说明搜索这个关键词的确有些问题。

搜索儿子

2007年2月搜索“儿子”截屏

  对于新闻联播和焦点访谈的报道模式以及采访形式,很多人都很反感,因为其对于Google的不良信息有很多夸大其辞和片面的说法,并且后来还出现Google被域名劫持的事件,令大家都很气愤,但是己所不欲、勿施于人,如果我们采用CCTV的形式来反驳CCTV,甚至用一些片面或者带有倾向性的言论进行误导,这反而可能会使事情变得更糟,他们说的谎话已经够多了,如果我们也用谎话来回击他们,那和他们有什么不同呢?

2009年6月27日星期六

谷歌提供迈克尔·杰克逊正版音乐下载

  一清早,在Twitter和饭否上,就听到一个令人震惊的消息,流行音乐之王(the King of Pop)——迈克尔·杰克逊去世了。

  迈克尔·杰克逊是令我怀念的一个歌手,记得我第一次听他的歌曲,还是在八十年代,记得那时候,我在一台小小的十四寸黑白电视机上,第一次看到了Michael Jackson的MTV,听到了他的歌声,在那个娱乐极度贫乏的年代,是多么的震撼。之后,有了流行音乐、霹雳舞、摇滚等,人们的娱乐生活才开始多起来,九十年代,MJ的好歌不断推出,对于那个曾经没有多少娱乐的年代,迈克尔.杰克逊给了我们很大的惊喜,他是当之无愧的世界流行音乐之王。

  至今,我的电脑里还保留着我最喜欢Michael Jackson的几首歌Beat It、Black Or White、Dangerous、JAM、Heal The World等歌曲,我最喜欢他的专辑是《危险之旅(Dangerous)》。

  值得一提的是,谷歌中国在谷歌音乐搜索页面专门制作了“迈克尔·杰克逊”专题,这个专题囊括了迈克尔.杰克逊几十年音乐生涯中的全部24张正版音乐专辑,其中包括销售6000万张、音乐史上销售量无出其右的专辑《颤栗》(Thriller),实在是不错的好东西,喜欢怀旧的网友可以下载听一下。

Michael Jackson

  附:新闻资料——迈克尔.杰克逊(Michael Jackson)生平简介

  迈克尔·杰克逊(1958.8.29-2009.6.25)(Michael Jackson)被誉为流行音乐之王(the King of Pop),是继猫王之后西方流行乐坛最具影响力的音乐家,他开创了现代MTV,他把流行音乐推向了巅峰,他拥有世界销量第一的专辑《THRILLER》,销量达1.04亿(2006年吉尼斯世界纪录认证数据)。据2006年底统计,其正版专辑全球销量已超过7.5亿,被载入“吉尼斯世界记录大全”。他是音乐史上第一位在美国以外卖出上亿张唱片的艺术家。2006年,吉尼斯世界纪录颁发了一个最新认证:世界历史上最成功的艺术家! 他一个人支持了世界上39个慈善救助基金会,保持着2006年的吉尼斯世界个人慈善纪录,是全世界以个人名义捐助慈善事业最多的人。

2009年6月26日星期五

国内外DNS服务器地址列表

  DNS(Domain Name System)是域名解析服务器的意思,它在互联网的作用是把域名转换成为网络可以识别的IP地址。目前国内电信运营商通过使用DNS劫持的方法,干扰用户正常上网,使得用户无法访问Google、Gmail、Google AdSense、Google Maps等常用服务,昨天我介绍了使用OpenDNS的方法解决这个问题,由于OpenDNS的服务器在美国,如果使用的人多了有可能会速度变慢,因此今天我介绍一些其他国外的DNS服务器地址,供大家选择。

  通常来说,香港、韩国、日本等国的DNS服务器速度会比较快,大家可以多用几个试试,尽量选择一个自己访问最快的DNS服务器,中国的电信运营商都是流氓,DNS服务器,早换早轻松。

  港澳台DNS服务器地址

  香港:
  205.252.144.228
  208.151.69.65
  202.181.202.140
  202.181.224.2

  澳门:
  202.175.3.8
  202.175.3.3

  台湾:
  168.95.192.1
  168.95.1.1

  国外DNS服务器地址

  美国:
  208.67.222.222
  208.67.220.220
  165.87.13.129
  165.87.201.244
  205.171.3.65
  205.171.2.65
  198.41.0.4
  198.41.0.4
  198.32.64.12
  192.33.4.12
  192.203.230.10
  192.5.5.241
  192.112.36.4
  192.36.148.17
  192.58.128.30
  192.9.9.3
  193.0.14.129
  128.9.0.107
  128.8.10.90
  66.33.206.206.
  208.96.10.221
  66.33.216.216
  205.171.3.65
  205.171.2.65
  165.87.13.129
  165.87.201.244

  加拿大:
  209.166.160.36
  209.166.160.132

  英国:
  193.0.14.129

  日本
  202.12.27.33
  202.216.228.18

  韩国:
  164.124.101.31
  203.248.240.31
  168.126.63.60
  168.126.63.61

  新西兰:
  202.27.184.3

  泰国:
  209.166.160.132
  202.44.8.34
  202.44.8.2

  印度:
  202.138.103.100
  202.138.96.2

  国内各省市DNS服务器地址

  北京:
  202.96.199.133
  202.96.0.133
  202.106.0.20
  202.106.148.1
  202.97.16.195
  202.138.96.2

  深圳:
  202.96.134.133
  202.96.154.15

  广州:
  61.144.56.100
  61.144.56.101

  广东:
  202.96.128.86
  202.96.128.143

  上海:
  202.96.199.132
  202.96.199.133
  202.96.209.5
  202.96.209.133

  天津:
  202.99.96.68
  202.99.104.68

  广西:
  202.96.128.68
  202.103.224.68
  202.103.225.68

  河南:
  202.102.227.68
  202.102.245.12
  202.102.224.68

  河北:
  202.99.160.68

  福建:
  202.101.98.54
  202.101.98.55

  厦门:
  202.101.103.55
  202.101.103.54

  湖南:
  202.103.0.68
  202.103.96.68
  202.103.96.112

  湖北:
  202.103.0.68
  202.103.0.117
  202.103.24.68

  江苏:
  202.102.15.162
  202.102.29.3
  202.102.13.141
  202.102.24.35

  浙江:
  202.96.102.3
  202.96.96.68
  202.96.104.18

  陕西:
  202.100.13.11
  202.100.4.16
  202.100.4.15
  202.100.0.68

  山东:
  202.102.154.3
  202.102.152.3
  202.102.128.68
  202.102.134.68

  山西:
  202.99.192.68
  202.99.198.6

  四川:
  202.98.96.68
  61.139.2.69

  重庆:
  61.128.128.68

  成都:
  202.98.96.68
  202.98.96.69

  辽宁:
  202.98.0.68
  202.96.75.68
  202.96.75.64
  202.96.69.38
  202.96.86.18
  202.96.86.24

  安徽:
  202.102.192.68
  202.102.199.68
  10.89.64.5

  吉林:
  202.98.5.68
  202.98.14.18
  202.98.14.19

  江西:
  202.101.224.68
  202.109.129.2
  202.101.240.36

  新疆:
  61.128.97.74
  61.128.97.73

  贵州:
  202.98.192.68
  10.157.2.15

  云南:
  202.98.96.68
  202.98.160.68

  黑龙江:
  202.97.229.133
  202.97.224.68
  219.150.32.132

  海南:
  202.100.192.68
  202.100.199.8

  宁夏:
  202.100.0.68
  202.100.96.68

  甘肃:
  202.100.72.13

  内蒙古:
  202.99.224.68

  青海:
  202.100.128.68

  全球路由DNS服务器

  全球只有13台路由DNS根服务器,在13台路由服务器中,名字分别为“A”至“M”,其中10台设置在美国,另外各有一台设置于英国、瑞典和日本。下表是这些机器的管理单位、设置地点及最新的IP地址。

  名称  管理单位及设置地点    IP地址
  A INTERNIC.NET(美国,弗吉尼亚州) 198.41.0.4
  B 美国信息科学研究所(美国,加利弗尼亚州) 128.9.0.107
  C PSINet公司(美国,弗吉尼亚州) 192.33.4.12
  D 马里兰大学(美国马里兰州) 128.8.10.90
  E 美国航空航天管理局[NASA](美国加利弗尼亚州) 192.203.230.10
  F 因特网软件联盟(美国加利弗尼亚州) 192.5.5.241
  G 美国国防部网络信息中心(美国弗吉尼亚州) 192.112.36.4
  H 美国陆军研究所(美国马里兰州) 128.63.2.53
  I Autonomica公司(瑞典,斯德哥尔摩) 192.36.148.17
  J VeriSign公司(美国,弗吉尼亚州) 192.58.128.30
  K RIPE NCC(英国,伦敦) 193.0.14.129
  L IANA (美国,弗吉尼亚州) 198.32.64.12

2009年6月25日星期四

Google国际网站遭到域名劫持

  今天晚上,包括Google.com在内的绝大多数Google国际网站,例如Google.com、Gmail、Google Reader、Google Docs等,在中国部分省市均出现无法访问的情况。

  根据我的分析,这次封锁Google的方式并不新鲜,是采用域名劫持(DNS劫持)的方法,通过技术手段,将Google的各类境外域名解析到一个错误的地址,使得Google.com无法访问。前段时间,中央电视台曾经在多个栏目中指责Google,并要求其关闭境外网站搜索功能。

  经过我的测试,使用中国大陆境内的DNS服务器,例如202.96.134.133是无法正确解析出Google的IP地址,而使用境外的OpenDNS进行域名解析,就可以正确解析出Google的IP地址。如下图所示。

Google域名遭到域名劫持

  解决的方法是使用境外的域名解析服务器(DNS服务器),例如OpenDNS的服务,设置方法是,在“设置”-“网络连接”中找到宽带上网的连接,打开网络连接属性,选择Interner协议(TCP/IP)的属性页里,不要选择自动获取DNS,而要选择“使用下面的DNS服务器地址”,首选DNS服务器和备用DNS服务器分别设置为208.67.222.222和208.67.220.220,如下图所示,完成后重新连接上网,就可以摆脱服务商对我们的DNS劫持。

网络连接属性

网络连接属性

  对于Google的域名劫持,这已经不是第一次了,2002年的时候Google的域名就曾经被劫持到百度等网站,2006年的时候Google.cn被域名劫持到万网的买卖网,这次轮到Google.com了,无论是谁在幕后操纵了这次域名劫持,都会给中国互联网产生极为负面的影响,好在全球13台DNS根服务器全都放在一些法制健全的国家(例如美国、日本),因此这次针对Google的域名劫持对于国外用户没有影响。

  最后,我强烈谴责这种对于Google网站进行域名劫持的无耻行为。

  名词解释(来源于维基百科):

  DNS是域名系统 (Domain Name Server) 的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务。在Internet上域名与IP地址之间是一对一(或者一对多)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。

  域名解析的基本原理是把域名翻译成IP地址,以便计算机能够进一步通信,传递网址和内容等。

  域名劫持就是在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则直接返回假的IP地址或者什么也不做使得请求失去响应,其效果就是对特定的网址不能访问或访问的是假网址。

解决中文Google的跳转问题

  从两年前开始,中国用户在使用Google搜索中,会自动从google.com跳转到google.cn,Google官方对此的解释是,google.com跳转到google.cn是为了对中国用户提供更具有针对性的搜索服务,很多新开发的中文google服务只有在google.cn上才会体现。

  不过,由于种种原因(特别是最近发生的一系列针对google.cn的事件),用户可能并不想使用google.cn,而希望使用google.com,因为Google的跳转是根据浏览器设置的语言来跳转的,因此修改浏览器默认语言就可以禁止google.com跳转到google.cn。

  对于IE用户来说,在工具—Internet选项—常规—语言中,添加英语(美国),并将其移动到最上面,使其成为默认语言,这样就可以把IE设置成使用英语做默认语言。

  设置好后,在IE中打开www.google.com,就不会自动跳转到www.google.cn,搜索时也是一样。

  IE设置的界面如下图所示。

IE设置

  对于Firefox用户来说,在工具—选项—内容—语言选择中设置,设置方法和IE相同。设置界面如下图所示。

Firefox设置

  对于Google Chrome用户来说,在选项—中级用户选项—更改字体和语言设置—语言中修改,设置方法和IE相同。设置界面如下图所示。

Chrome设置

2009年6月24日星期三

中文分词和TF-IDF

  中文分词(Chinese Word Segmentation)指的是将一个汉字序列切分成一个一个单独的词。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。

  TF-IDF(term frequency–inverse document frequency)是一种用于信息搜索和信息挖掘的常用加权技术。在搜索、文献分类和其他相关领域有广泛的应用。

  TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF词频(Term Frequency)指的是某一个给定的词语在该文件中出现的次数。IDF反文档频率(Inverse Document Frequency)的主要思想是:如果包含词条的文档越少,IDF越大,则说明词条具有很好的类别区分能力。

  使用TF*IDF可以计算某个关键字在某篇文章里面的重要性,因而识别这篇文章的主要含义,实现计算机读懂文章的功能。

  常见中文分词开源项目:

  SCWS

  Hightman开发的一套基于词频词典的机械中文分词引擎,它能将一整段的汉字基本正确的切分成词。采用的是采集的词频词典,并辅以一定的专有名称,人名,地名,数字年代等规则识别来达到基本分词,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些小型搜索引擎、关键字提取等场合运用。45Kb左右的文本切词时间是0.026秒,大概是1.5MB文本/秒,支持PHP4和PHP 5。

  ICTCLAS:  

  这可是最早的中文开源分词项目之一,ICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan组织的评测中都获得了多项第一名。ICTCLAS3.0分词速度单机996KB/s,分词精度98.45%,API不超过200KB,各种词典数据压缩后不到3M.ICTCLAS全部采用C/C++编写,支持Linux、FreeBSD及Windows系列操作系统,支持C/C++、C#、Delphi、Java等主流的开发语言。

  HTTPCWS

  HTTPCWS 是一款基于HTTP协议的开源中文分词系统,目前仅支持Linux系统。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理,得出分词结果。HTTPCWS 将取代之前的 PHPCWS 中文分词扩展

  庖丁解牛分词

  Java 提供lucence 接口,仅支持Java语言。

  CC-CEDICT

  一个中文词典开源项目,提供一份以汉语拼音为中文辅助的汉英辞典,截至2009年2月8日,已收录82712个单词。其词典可以用于中文分词使用,而且不存在版权问题。Chrome中文版就是使用的这个词典进行中文分词的。

  基于VB/ASP的中文分词

  上面的开源项目没有给予VB和ASP的,这里提供一个简单的VB/ASP类,加上词典之后就可以进行分词了,注意这个类只供演示,其分词速度极慢不适合实际应用。

  类名为:WordSplit

Private rootTable As String

Private Function GetCount(ByVal s As String) As Long
    GetCount = InStr(1, rootTable, s)
End Function

Public Function WordCount(ByVal strString As String, ByVal strGetWord As String) As Long
    Dim k
    k = Split(strString, strGetWord)
    WordCount = UBound(k)
End Function


' 分析输入的字符串,将其切割成一个个的词语。
' <param name="s">待切割的字符串</param>
' <returns>所切割得到的中文词语数组</returns>

Public Function ParseChinese(ByVal s As String, ByVal separator As String) As String
    Dim lngLength As Long
    Dim strTemp As String
    Dim ArrayList As String
    Dim i, j

    ArrayList = ""
    lngLength = Len(s)
    i = 1
    While i < lngLength
        strTemp = Mid(s, i, 1)
        If GetCount(strTemp) > 1 Then
            j = 2
            While i + j < lngLength + 1 And GetCount(Mid(s, i, j)) > 0
                j = j + 1
            Wend
            strTemp = Mid(s, i, j - 1)
            i = i + j - 2
        End If
        i = i + 1
        'WordAdd (temp)
        ArrayList = ArrayList + strTemp + separator
    Wend
    ParseChinese = ArrayList

End Function

Private Sub Class_Initialize()
    Dim fso, templetfile, txtfile
    templetfile = App.Path + "ChineseDictionary.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txtfile = fso.OpenTextFile(templetfile, 1)
    rootTable = txtfile.ReadAll
    txtfile.Close
End Sub

  调用示例:

    strInput = "中文分词指的是将一个汉字序列切分成一个一个单独的词。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。"
    Dim strWordSplit As New WordSplit
    strSubject = strWordSplit.ParseChinese(strInput, "|")
    arrSubject = Split(strSubject, "|")
 

2009年6月23日星期二

令人“心神不宁”的网络

  小高同学终于“心神不宁”了,因为他触到了一个“霉头”,他没有想到Google在中国有如此广大的粉丝群,以及人们对于“编造新闻”的反感之强烈,最终成为了一个牺牲品。

  小高同学应该也有他自己的难言之隐,一个国有企业的实习生,一旦转正就可以获得较为稳定的收入和待遇,对于一个还没有工作的学生来说的确具有诱惑力,他为了得到一份工作,自愿或者不自愿的做了这项工作。

  或许小高同学自己也的确有这样那样的想法,对于一个受过几十年传统教育,从来没有走出过国门的人来说,思维方式很难有所突破,小高有他自己说话的自由,但仅仅代表了社会中的一小部分,无法代表大众,否则也不会出现网民群起攻击和人肉他的现象了。这也说明一个问题,新闻工作者应该采访那些真正的大众群体,客观地记录事实,让普通大众也表达自己发言的自由,才能做到新闻的客观和公正。如果一开始就设定好调子,按照预先的思路去采访,甚至要求被采访人说些什么话,这是新闻节目的大忌,如果《焦点访谈》这样原本为人们关注和喜爱节目也这么搞,无疑将使得自己的权威性、公信力大打折扣,最终沦落为一个不伦不类的二流节目。

  广大网民对于小高同学的愤怒也是有理由的,人们对于说假话是深恶痛绝的,不愿说谎的人会认为,如果姑息纵容小高这样的投机者,那么未来为了获取利益而说谎的人会越来越多,能够给诚实者留下的生存空间也会越来越少,而通过央视这样的大媒体去编造的谎话则更为恶劣,如果对这样的行为都能容忍和麻木,那么总有一天,没有一个人会说实话了。

  实际上,说句实话真的就那么难吗?

  著名学者钱理群先生曾在一次讲座上说,人说话应该有底线,这些底线依此是:一,力图说真话;二,不能说真话则应保持沉默;三,无权保持沉默而不得不说假话时则不应伤害他人。钱先生补充说,无权保持沉默而不得不说假话,若这种假话并未伤害他人,这种人可成为奴隶,尚有可同情处;但若为伤害他人而说假话,则只能称奴才,不可原谅。

  如果说谷歌中国的不良信息让小高同学心神不宁有点失实的话,那么现在,真正让小高同学心神不宁的东西已经出现了,那就是互联网。

2009年6月22日星期一

碧桂园度假村游记

  周六玩了广州长隆欢乐世界之后,晚上我们就入住顺德碧桂园度假村休息,从番禺到碧桂园度假村很快,一会儿就到了,这个度假村座落于顺德碧桂园别墅区内,环境非常好,到处都可以看到漂亮的别墅和私家泳池。

  顺德碧桂园度假村里有不少游乐设施,包括一个很大的游泳池、保龄球馆、图书室、超市、健身房等,入住客人可以免费使用一次。

碧桂园度假村

  早晨起床之后,可以在游泳池、保龄球馆、健身房等设施中任意选择,度过愉快休闲的一天。

碧桂园度假村

  度假村的设施玩够了之后,还可以去园区深处还有碧桂园农庄游玩,从度假村到农庄每十分钟有免费巴士接送,大概一刻钟时间就能达到目的地。

碧桂园度假村

  农庄的景色非常优美,湖水碧绿,杨柳青青,风景迷人。

碧桂园度假村

  一群小鸭子在湖水里游泳。

碧桂园度假村

  农场里还饲养了很多动物,这只可爱的小山羊叫“灰姑娘”。

碧桂园度假村

  农场里还有专业骑师指导,游客在骑师指导下一展骑马英姿,不过骑马是要另付费的。

  碧桂园度假村的芒果非常多,满树的芒果一堆一堆的,却没有人摘,在城市里很难看到这样的情景。

  碧桂园度假村住的这一天,感觉田园生活的确充满了乐趣,环境也非常优美,难怪很多人选择在这里养老。

2009年6月21日星期日

广州长隆欢乐世界游记

  周六和同事一起去广州番禺的长隆欢乐世界玩了一圈,感觉还不错,和深圳欢乐谷相比,广州长隆的过山车令人印象深刻,而且排队的人很少,周末人也很少,几乎半天时间就可以将大部分好玩的项目玩完,而深圳欢乐谷的项目则太多,排队动辄就是一个多小时,任何时间人都很多。

广州长隆欢乐世界

  广州长隆欢乐世界的门票和深圳欢乐谷一样,是170元,我们团体票可以打折,大概能降到100元左右。

广州长隆欢乐世界

  入口处就是十环过山车,这个过山车据说创造了游乐设备环数最多的吉尼斯世界记录,全世界只有两台(仅在英国还有一台)。

十环过山车

  这个过山车的确很刺激,转的圈数很多,感觉其刺激程度仅次于垂直过山车。

十环过山车

  十环过山车的旁边是摩托过山车,游客骑在一个类似摩托的小车上,这个过山车的加速度非常快,可惜时间太短了,惊险程度也一般。

摩托过山车

  垂直过山车非常高,有两段几乎是直上直下的,非常刺激,速度快的惊人,坐在上面如同坐在一架高速战斗机上飞行一样,令人大呼过瘾,这个过山车的另一个好处是,排队几分钟就能玩上,我就连玩了两次,感觉很爽。

垂直过山车

  激流勇进这个项目和深圳欢乐谷的同名项目几乎一模一样,但高度还不到欢乐谷的一半,小艇会载着游客慢慢爬上一个斜坡,然后急速冲下来,虽然我穿了雨衣,但冲下来的时候还是把裤子全打湿了。

激流勇进

  超级大摆锤号称“全球最大大摆锤”,塔高26米,看起来似乎不太惊险,但上去之后才会感觉到,摆的可真高啊。

超级大摆锤

  U型滑板虽然看上去也不怎么样,但的确也挺刺激的,感觉比欢乐谷的UFO要好玩。

U型滑板

  除了惊险的栏目外,还可以看到特技表演《惊爆危机岛》,里面的故事情节和打斗虽然看上去比较老套,但里面的老外表演起来还真像那么回事,挺敬业的。

惊爆危机岛

  最后节目都玩遍了,还会看到每日的巡游表演,园区的演员们纷纷赤膊上阵,这东东被“绿坝”看到一定会被全过滤掉的。

  总的来说,广州长隆欢乐世界还挺好玩的,就是设施少了点,除了上面我介绍的几个栏目外,其他的栏目比深圳欢乐谷要少的多,不想排队的话去这里玩也挺不错的。

2009年6月20日星期六

谷歌中国被停止境外网页搜索和搜索建议功能

  据新华网报道,中央电视台在昨晚的《新闻联播》及《焦点访谈》节目中指责“谷歌中国”网站存在大量淫秽色情和低俗信息内容,同时互联网举报中心对谷歌中国网站进行强烈谴责,要求其彻底清理色情信息,并建议相关执法部门依法处罚。之后,国家有关部门召见“谷歌中国”网站负责人,对“谷歌中国”网站大量传播淫秽色情内容进行执法谈话,宣布对“谷歌中国”网站的处罚措施,暂停该网站境外网页搜索业务和联想词搜索业务,并责令其立即进行整改,彻底清理淫秽色情和低俗内容。

  现在登录Google.cn,其“搜索建议”功能果然已经无法使用了,对于境外网站的搜索是否关闭目前尚不得而知,据我所知,很多国内的网站主为了避免备案,都购买和使用了国外的虚拟主机,如果Google.cn关闭境外网页搜索功能,则大量国外中文网站将失去来自Google的流量,可谓损失重大。对于Google自身来说,这也将极大冲击Google的用户搜索体验,使得原本使用Google.cn的用户转而使用Google.com或其他搜索引擎,但愿现在Google.com不会自动转向Google.cn了。

谷歌中国

  昨天的“焦点访谈”栏目也“火”了另一个人,就是那个被采访的“大学生”高也,此人在节目中声色俱厉地对谷歌中国进行了谴责,还举个他同学的例子做为证据,可惜经过网友的人肉搜索,原来此人不仅不是大学生,而且还是焦点访谈栏目组的实习人员。小高同学目前正在承受网民暴风骤雨般的攻击,已经被迫关闭自己的新浪博客和校内等网络地址,打算隐居了,这对他的人生经历也算是一个教训,早知今日,何必当初呢。

  “谨言慎行”是一种做人的美德,就像那个曾经说过“很黄很暴力”的小女孩一样,睁着眼睛说瞎话并不是一件困难的事情,重要的是,说话要负责任,特别是一个人在国家电视台这样的垄断媒体上说话,说话者的权力会被无限放大,这时候,说话人不仅仅是表达自己的声音,而且是影响电视机前的大众,这就是权力。如果你不珍惜自己的话语权,用幼稚的谎话去愚弄和欺骗大众,那么最终会被这个社会无情地惩罚。

2009年6月19日星期五

央视抨击谷歌中国存在淫秽色情信息

  今天晚上,中央电视台《新闻联播》和后面的《焦点访谈》两个栏目都重点抨击谷歌中国,声称谷歌中国存在大量淫秽色情和低俗信息,违反国家有关法律规定,严重侵害青少年身心健康。同时互联网违法和不良信息举报中心也“强烈谴责”谷歌中国传播淫秽色情和低俗信息,要求其对淫秽色情和低俗内容进行彻底清理,并建议相关执法部门依法处罚。

  这次央视和举报中心的措辞非常严厉,令人感到比较意外,做为一个经常上Google的用户,我印象中很少看到色情信息,对于色情信息过滤技术,Google有SafeSearch功能,可以从搜索结果中过滤掉大部分色情内容,但如果要求过滤掉搜索引擎上所有的色情信息,在技术上目前国内所有的搜索引擎都做不到,包括百度也做不到。

谷歌中国

  说到保护青少年,现实中的危害恐怕比网络上的要更凶猛一些,前有“习水嫖宿幼女案”,后有“邓玉娇防卫过当案”,如果从制度上能够保证再没有幼女被“嫖宿”,再没有服务生被迫“防卫过当”,这比起谴责搜索引擎过滤技术有漏洞要更为重要和紧迫一些。

  另外,如何保护自己的小孩,本来是每个家长的责任,相信大多数家长都有能力和办法管理自己的小孩,不必“保姆”们如此费心了。

  去年11月,央视新闻30分也连续两天曝光百度竞价排名中的虚假医药广告,为此,百度曾经在2009年春晚“赞助”了央视4000万元,如果央视真的那么有“社会责任感”,为啥百度交了钱就能在春晚亮相呢。这次央视吃完原告吃被告,里外通吃,又瞄上了谷歌,看来谷歌也不得不交些保护费了,在中国做企业实在不易啊。

2009年6月18日星期四

安全迁移网站的技巧

  在不同的主机上迁移同一个网站,需要一定的技巧,今天我就介绍一些同一域名下将网站从一个主机迁移到另一个主机的技巧,以避免网站因为迁移而造成不必要的损失。

  1、迁移准备

  先将原始网站的评论等更新功能关闭,接着把原始网站的文件、数据库等信息进行备份,然后下载到本地,然后将网站内容完全上传部署到另一个主机上,通过修改hosts的方法,将网站的域名指向新的IP地址,手动验证网站可以正常访问。

  2、迁移操作

  接着,选择一个访问量少的时段,例如凌晨时刻,通过修改域名DNS(Domain Name Server)的A记录实现网站的迁移,注意不要通过删除A记录然后增加一个新的A记录来实现,那样会造成短时间的网站无法访问。

  3、迁移过程

  将原有网站内容保存至少半个月的时间(但不一定需要更新),保证搜索引擎使用原来的IP地址仍然可以访问到内容,如果无法做到这一点,那也要将原始网站的完全关闭,使原有IP无法访问,切不可保持原始网站开放,访问时候却得到404错误的情况发生。

  4、迁移结束

  半个月后,可以彻底关闭原有网站的WEB服务,此时,搜索引擎大多已经可以正常访问新的网站地址了,网站迁移结束。

2009年6月17日星期三

利用U盘进行软件加密的方法

  一般的U盘不具备加密的功能,虽然U盘和加密狗外形有一些相似,但是内部完全不一样的,U盘只是一个存储器芯片和简单的附属电路,而现在的智能卡加密狗都具有一个单独的CPU或者加密芯片,可以执行相当复杂的加密算法。

  有的软件开发商有这样一种需求,就是使用U盘发布软件的同时,想要节约成本,防止U盘中的软件被复制,但又不想再购买昂贵的加密狗,因此想要把软件绑定在U盘上执行,当U盘拔下来的时候,软件就不能正常运行,和我先前介绍的绑定硬件指纹相似,使用绑定U盘的方式加密软件。

  在对软件安全不是特别在意的情况下,可以在软件中采用绑定U盘内部ID的方式来实现这种加密,先使用程序将U盘的ID读出来,然后根据这个ID生成License文件,当解密者将U盘内的文件复制到其他电脑的时候,软件执行过程中读取U盘ID失败,因此就无法校验License。

  通常情况下两个U盘的ID是不相同的,因此即使将软件复制到另外一个U盘,软件执行的时候,根据U盘ID验证License,也会出现不匹配的现象,这样就实现了软件绑定U盘的加密方式。

  需要指出的是,这种U盘加密并不算安全,大多数U盘厂商有内部量产工具,可以修改U盘的内部ID号码,这就存在了复制U盘的可能性,但对于普通用户来说,通常没有修改U盘内部ID的能力,因此也具有一定的加密性。

  这个加密方法中,读取U盘ID号的函数的VB源代码如下所示:

    Set objWMIService = GetObject("winmgmts:\.
ootcimv2")
    Set colItems = objWMIService.ExecQuery("Select * From Win32_USBHub")
    For Each objItem In colItems
        a = objItem.DeviceID
        If InStr(a, "VID") Then b = Split(a, "")
        USB_ID = b(UBound(b))
    Next
 

2009年6月16日星期二

同时更新Twitter、饭否、嘀咕和做啥

  很多微博客(如嘀咕和做啥)和第三方工具(如Hellotxt、Ping.fm)都同时提供了同步到其他微博客的服务,可以同步信息到一些主要的微博客服务,如Twitter、饭否等,但是这些工具都有一个很重要的问题,就是存在密码被盗或泄漏的风险。

  目前大多数微博客是通过用户名和密码做为参数进行认证登录,Twitter可使用OAuth协议进行认证,而这些用户名和密码存放在这些同步工具网站上,万一保存不当,就有可能会被黑客获取,带来用户帐号被盗的风险,因此,比较保险的办法是通过自己写的程序来实现微博客的自动同步功能,这样被黑客破解的可能性就小了很多。

  我这里写了一个同时更新Twitter、饭否、嘀咕和做啥等微博客的小程序,可以在自己的服务器上实现微博客同时更新功能,为了代码简单,使用时需要这几个服务使用相同的用户名和相同的密码,选中需要同步的微博客,也可勾选掉不想发布的服务,然后输入用户名和密码,发布信息后就会自动同时更新这几个微博客。

  全部源程序代码如下:

<%@ CODEPAGE=65001 %>

<%
If Request("submit")<>"" Then

 Dim xmlhttp
 Set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP")

 Response.Cookies("save_username")=Request("username")
 Response.Cookies("save_username").Expires=Date+365
 Response.Cookies("save_password")=Request("password")
 Response.Cookies("save_password").Expires=Date+365
 username = Request("username")
 password = Request("password")

 post_status = "status=" + server.URLencode(Request("updateStatus"))

 If Request("twitter") = 1 Then
  xmlhttp.Open "POST", "http://" & username & ":" & password & "@twitter.com/statuses/update.xml", False
  xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlhttp.setRequestHeader "Content-Length", Len(post_status)
  xmlhttp.Send (post_status)
  Response.Write "twitter OK." 'xmlhttp.responseText
 End If
 
 If Request("fanfou") = 1 Then
  xmlhttp.Open "POST", "http://" & username & ":" & password & "@api.fanfou.com/statuses/update.xml", False
  xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlhttp.setRequestHeader "Content-Length", Len(post_status)
  xmlhttp.Send (post_status)
  Response.Write "fanfou OK." 'xmlhttp.responseText
 End If

 If Request("digu") = 1 Then
  post_status = "content=" + server.URLencode(Request("updateStatus"))
  xmlhttp.Open "POST", "http://" & username & ":" & password & "@api.digu.com/statuses/update.xml", False
  xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlhttp.setRequestHeader "Content-Length", Len(post_status)
  xmlhttp.Send (post_status)
  Response.Write "digu OK." 'xmlhttp.responseText
 End If

 If Request("zuosa") = 1 Then
  xmlhttp.Open "POST", "http://" & username & ":" & password & "@api.zuosa.com/statuses/update.xml", False
  xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlhttp.setRequestHeader "Content-Length", Len(post_status)
  xmlhttp.Send (post_status)
  Response.Write "zuosa OK." 'xmlhttp.responseText
 End If

 Set xmlhttp = Nothing
 response.end
Else

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <meta http-equiv="Content-Language" content="zh-CN" />
 <title>更新状态</title>
<script language="javascript"> 
function countChar(textareaName,spanName)

 document.getElementById(spanName).innerHTML = 140 - document.getElementById(textareaName).value.length;

</script>
</head>
<body>
 <form method="post" action="<%= Request.ServerVariables("URL")%>">
  <p>
   <textarea tabindex="1" id="updateStatus"  name="updateStatus" rows="6" cols="40" onkeydown='countChar("updateStatus","counter");' onkeyup='countChar("updateStatus","counter");'></textarea>
  </p>
  <p>
   <label><input tabindex="2" type="submit" id="submit" name="submit" value="  发     布  " /></label>    可以输入 <span id="counter">140</span> 字
  </p>
  <p>
   <label>用户名:</label>
   <input tabindex="3" type="text" name="username" id="username" value="<%= Request.Cookies("save_username")%>" />
  </p>
  <p>
   <label>密 码:</label>
   <input tabindex="4" type="password" name="password" id="password" value="<%= Request.Cookies("save_password")%>" />
  </p>
  <p>
   <label><input type="checkbox" id="twitter" name="twitter" value="1" checked="checked"> Twitter </label><label><input type="checkbox" id="fanfou" name="fanfou" value="1" checked="checked"> 饭否 </label><label><input type="checkbox" id="digu" name="digu" value="1" checked="checked"> 嘀咕 </label><label><input type="checkbox" id="zuosa" name="zuosa" value="1" checked="checked"> 做啥</label>
  </p>
 </form>
</body>
</html>

<%
End if
%>
 

2009年6月15日星期一

在JavaScript中实现统计文本框Textarea字数

  现在流行的Twitter等微博客网站,有一个很好的用户体验,就是在文本框中输入文字的时候,会自动统计输入的字符,并显示用户还能输入的字符,在限制了140个字的微博客中,这样的小提示可以很好的增强用户体验。

  如果实现这种技术呢,我进行了一些研究,发现实现其实挺简单,几行代码就能完成输入字符统计功能,经过实际测试,其对文字的统计与Twitter等微博客的完全相同。

  使用方法是,先增加一个span,用于显示剩余的字数,然后在Textarea中,加入一个onkeydown和onkeyup的事件,调用另一段JavaScript函数,函数调用的参数为span的id和textarea的id,然后再JavaScript中使用innerHTML返回计算出来的剩余字数。

  以下是相关的JavaScript代码:

<script language="javascript"> 
function countChar(textareaName,spanName)

 document.getElementById(spanName).innerHTML = 140 - document.getElementById(textareaName).value.length;

</script> 
可以输入<span id="counter">140</span>字<br/>
<textarea id="status"  name="status" rows="6" cols="40" onkeydown='countChar("status","counter");' onkeyup='countChar("status","counter");'></textarea>

2009年6月14日星期日

从技术层面分析“绿坝-花季护航”存在的问题

  工信部日前下发《关于计算机预装绿色上网过滤软件的通知》,要求在7月1日之后在我国所有销售的个人电脑预装该软件,这个消息在网络上引起了轩然大波,网友纷纷质疑:软件是否会被强制使用?网友的隐私能否得到有效保护?软件一年的注册费用真的值4170万吗?我先前曾经对此做过一些简单的评论,今天我将从技术层面对“绿坝-花季护航”可能存在的问题再进行一些探讨。

  软件产品的质量是否合格

  从技术上将,“绿坝-花季护航”对于文字信息的审查是通过巨大的关键字库进行过滤分析的,将需要审查的文字进行分词处理,然后进行关键词对比过滤,有可能使用了TF-IDF对词频进行分析以确定文章的主要内容,进行语义分析,同时“绿坝”具有在线更新数据库功能,可以定时同步最新的关键词列表。根据已经公布的一些关键词以及网友实际测试效果来看,在很大程度上会存在“误判”的可能性,有可能会将用户浏览的正常网页或者文档误判为“有害信息”。

  对于色情图片的检测可能使用了一些开源产品,通过肤色分割模型对色情图片进行检测,设置不同的阈值会出现不同的误差率。在很多情况下会错误的将带有大量肤色的图片判断为色情图片,同时,对于黑人的色情图片却无法识别。

  总的来说,该软件在语义分析上的判断准确性,比起百度和Google的语义识别还有很大的差距。

  软件产品的价格

  工信部以每年4170万元的价格购买了“绿坝-花季护航”一年的使用许可,预计的安装量大概是一千万左右,在同类软件产品中,可谓“天价”。

  举个例子,在国家公布的中国软件行业百强之中第20位,开发企业管理软件的用友公司,一年的净利润也只有四亿多元,而且销售的大部分软件都是终身许可的。有使用期限的License通常价格极低甚至免费,做为软件行业的通用做法,一套商业软件通常会有三个月到半年左右的免费试用期,例如360安全卫士自带的NOD32杀毒软件就可以免费试用半年,在这个阶段,用户可以免费使用该软件的全部功能,超过期限后用户可自行决定是否购买该软件,这种方法可以有效避免用户退货的概率。对于装机量巨大的软件,例如腾讯QQ、迅雷等,全部都是免费使用的软件,开发商通过第三方增值服务(例如广告等)就可以获得巨大的收入。如果安装量在千万级别,相信有大量的软件厂商都会愿意免费提供政府使用。工信部在这个软件的招标过程的确令人感到疑惑。

  软件开发商的研发能力

  以中标的金惠和大正两家公司,其研发能力的确令人质疑,在国家公布的中国软件百强名单中根本找不到他们的名字,研发过程中也存在一些不规范的做法,例如未经授权使用国外开源技术等,在安全方面,很多安全公司(如奇虎江民)都发现“绿坝”存在高风险的安全漏洞,黑客可以利用这些漏洞传播病毒,中毒电脑存在严重泄密或被黑客远程控制的可能。

  我先前曾经提到过,这样一款小公司开发的软件很容易存在各种安全漏洞,在未经过广泛测试之前,冒然就安装到大量电脑客户端上,存在极大的安全隐患。一旦“绿坝-花季护航”的安全漏洞被黑客发现,那么所有安装这个软件的电脑都成为黑客的“肉鸡”(受别人远程控制的电脑),大量的“肉鸡”不但可能引发各种网络安全事故,还完全有可能重演先前“暴风影音断网”的灾难。没想到我的这些猜想这么快就被一一证实了。

  预装过滤软件的原因

  工信部原本是通过购买美国Cisco(思科公司)的入侵检测系统(IDS)和入侵防御系统(IPS)来监控和管理中国互联网,但这存在一些问题,Cisco的安全产品目前只能针对文字类型的数据包进行监控和分析,对于图像和视频显得无能为力,同时,Cisco做为一个美国公司,很难保证其产品中会不会留有后门,一旦出现战争等紧急情况,美国可以通过Cisco的产品完全控制中国的互联网通讯,这会使得中国在战争中处于极为不利的局面,而做为国产的华为中兴等公司,又不具备开发这种应对数亿网民的超大型产品的能力,因此,Cisco(思科公司)的产品不但不怕没有生意,还可以漫天要价。

  可能是出于这方面的考虑,工信部才决定通过在客户端电脑预装过滤软件的形式,来打破Cisco一统天下的局面,这种分布式技术,将大量的计算分配到了客户端的电脑上,实现了单个节点所无法实现的巨大计算能力,并在一定程度上解决了图像智能识别等问题。如果客户端的过滤软件运行良好的话,可以大为减轻电信部署的IDS和IPS的负荷,如果负荷降的足够低的话,就完全可以使用华为的同类产品进行替代,以防止未来战争期间可能出现的变数。

  可惜的是,中标的企业拿出来的软件产品实在不争气,产品质量不过关,存在着大量安全隐患,如果大规模安装的话,可能会带来更多的问题,我建议,如果政府真的要想购买软件的话,中国软件百强中任何一家民营软件企业的研发能力都比这两家强,从那些公司招标的话,不难获得真正物美价廉的软件。

2009年6月13日星期六

Facebook正式推出个性化网址

  今天中午十二点,全球最大社交网站Facebook正式推出个性化网址服务,所有六月十日之前注册的Facebook用户都可以在第一时间抢注属于自己的个性化网址。

  Facebook用户可以通过这项新服务为自己建立一个容易以及的个人网址,还可以象个人主页那样来使用他们的Facebook网页,而先前的Facebook用户网址是由一个数列构成的。Facebook的竞争对手MySpace早在2005年就推出了个性化网址服务。

  面对微博客Twitter的威胁,Facebook推出的个性化网址,不但可以提升Facebook的流量,还能帮助Facebook在与Twitter的竞争中再次获得优势。这也是Facebook针对搜索引擎进行优化的一个措施。

  在北京时间中午12:01分,Facebook的个性化网址功能准时开放,令人惊讶的是,短短三分钟Facebook就已经注册了200,000个用户名,15分钟内注册的用户高达500,000个。Facebook这么大型的社交网站,全球所有网民统计时刻登录抢注用户名,居然网页一点也不卡,速度还很快,Facebok的技术能力真的很强,Twitter要好好学学。

  我成功的注册了我自己的用户名: http://www.facebook.com/williamlong

Twitter和饭否的好友管理工具

  微博客做为社会化网络的重要组成部分,具有比传统即时通讯(IM)软件更多的优势,例如可以看到好友的好友,可以关注陌生人的信息,但这也带来另一个问题:信息过载。

  如果用户关注(Follow)的用户数非常多,那么将在短时间内接收到大量来自好友的“信息轰炸”,这显然会给降低未必可的可用性。微博客和IM不同的是,你Follow的很多人可能你并不认识,为了能更加有效的使用微博客,获得更多有用的信息,对自己的好友进行合理管理势在必然。

  我个人觉得,对于好友的管理可以遵循以下几点:

  1、关注自己认识的朋友或者同事、亲人等。

  2、关注一些知名用户,通常知名用户的关注者都非常多,名气越大,Followers越多。

  3、合理取舍,特别是那些更新频率非常高的“话痨”,如果其更新的内容没有太大价值,就删除掉。

  经过这样的好友管理,微博客的使用就会变得更为有效。

  然而可惜的是,目前流行的微博客,如Twitter和饭否等,都没有这样的好友管理工具,在好友界面中,只能看到好友的id和名称,无法看到其关注着数量和更新数量,因此,我通过研究Twitter和饭否的API,写了一个Twitter和饭否的好友管理工具,可以方便的实现上面的功能。

  此工具为开源工具,全部源代码只有20多行,对于Twitter用户来说,先输入用户名和页数,提交后即可看到显示的前100个好友,信息包含好友的id、姓名、关注者(Followers)数量、更新数量,如果要想删除一个好友,点后面的“del”按钮即可删除,点击后会转到Twitter的API服务器,需要输入用户的Twitter用户名和密码才能真正删除。

  由于Twitter对于API有每小时100次查询的限制,超过了这个次数就会封IP,因此这个工具我就不在线提供演示了,大家将下面的ASP代码复制到一个支持ASP的主机空间上运行即可。

Response.Write "<form action=" + Request.ServerVariables("URL") + " method='post'>Twitter Username:<input type='text' id='username' name='username' value='" + Request.Form("username") + "'>  Page:<input type='text' id='page' name='page' value='" + Request.Form("page") + "' size='2'> (Page>=1) <input type='submit'> </form>"
if Request.Form("username")<>"" Then
  Set xmlHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
  xmlHttp.open "GET", "http://twitter.com/statuses/friends.xml?page=" + Request.Form("page") + "&screen_name=" + Request.Form("username"), false
  xmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlHttp.send (null)
  If (xmlHttp.Status = 200) Then set root = xmlHttp.responseXML.documentElement Else Response.End
  for i=1 to root.childNodes.length
    set node = root.childNodes.item(i)
    if not node is Nothing then
      set node2 = node.childNodes.item(1)
      name = node2.nodeTypedValue
      set node2 = node.childNodes.item(2)
      id = node2.nodeTypedValue
      set node2 = node.childNodes.item(8)
      followers = node2.nodeTypedValue
      set node2 = node.childNodes.item(21)
      statuses = node2.nodeTypedValue
      Response.Write "<form action='http://twitter.com/friendships/destroy.xml?screen_name=" + id + "' method='post' target='_blank'>"
      Response.Write "id:" + id + " , name:" + name + " , followers:" + followers + " , updates:" + statuses
      Response.Write " - <input type='submit' value='del'></form> <br/>"
    end if
  next
  Set xmlHttp=Nothing
End if

  对于饭否来说,也是同样的道理,其代码和Twitter的非常类似,不过,由于饭否功能的限制,其API并不提供“更新数量”这个字段,因此列表中只显示用户的id、姓名和关注者数量,建议饭否能把“更新数量”这个字段加上去。饭否的好友管理代码如下所示,其安装和运行与Twitter的一样。

Response.Write "<form action=" + Request.ServerVariables("URL") + " method='post'>Fanfou Username:<input type='text' id='username' name='username' value='" + Request.Form("username") + "'>  Page:<input type='text' id='page' name='page' value='" + Request.Form("page") + "' size='2'> (Page>=1) <input type='submit'> </form>"
if Request.Form("username")<>"" Then
  Set xmlHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
  xmlHttp.open "GET", "http://api.fanfou.com/users/friends.xml?page=" + Request.Form("page") + "&id=" + Request.Form("username"), false
  xmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlHttp.send (null)
  If (xmlHttp.Status = 200) Then set root = xmlHttp.responseXML.documentElement Else Response.End
  for i=1 to root.childNodes.length
    set node = root.childNodes.item(i)
    if not node is Nothing then
      set node2= node.childNodes.item(0)
      id = node2.nodeTypedValue
      set node2= node.childNodes.item(1)
      name = node2.nodeTypedValue
      set node2= node.childNodes.item(9)
      followers = node2.nodeTypedValue
      Response.Write "<form action='http://api.fanfou.com/friendships/destroy/fanfou.xml?id=" + id + "' method='post' target='_blank'>"
      Response.Write "id:" + id + " , name:" + name + " , followers:" + followers
      Response.Write " - <input type='submit' value='del'></form> <br/>"
    end if
  next
  Set xmlHttp=Nothing
End if

  如果大家对这个工具还有什么意见和疑问,可以来咨询。

  更新:另外增加了一个嘀咕的好友管理,在线演示点这里,代码如下所示。

Response.Write "<form action=" + Request.ServerVariables("URL") + " method='post'>Digu Username:<input type='text' id='username' name='username' value='" + Request.Form("username") + "'>  Page:<input type='text' id='page' name='page' value='" + Request.Form("page") + "' size='2'> (Page>=1) <input type='submit'> </form>"
if Request.Form("username")<>"" Then
  Set xmlHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
  xmlHttp.open "GET", "http://api.digu.com/statuses/friends.xml?page=" + Request.Form("page") + "&friendUserId=" + Request.Form("username"), false
  xmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
  xmlHttp.send (null)
  If (xmlHttp.Status = 200) Then set root = xmlHttp.responseXML.documentElement Else Response.End
  for i=1 to root.childNodes.length
    set node = root.childNodes.item(i)
    if not node is Nothing then
      set node2 = node.childNodes.item(1)
      id = node2.nodeTypedValue
      set node2 = node.childNodes.item(2)
      name = node2.nodeTypedValue
      set node2 = node.childNodes.item(8)
      followers = node2.nodeTypedValue
      set node2 = node.childNodes.item(19)
      statuses = node2.nodeTypedValue
      Response.Write "id:" + id + " , name:" + name + " , followers:" + followers + " , updates:" + statuses
      Response.Write " - <a href='http://api.digu.com/friendships/destroy.xml?userIdOrName=" + id + "' target='_blank'>del</a> </form> <br/>"
    end if
  next
  Set xmlHttp=Nothing
End if

2009年6月12日星期五

基于JavaScript的REST客户端框架

  现在REST是一个比较热门的概念,REST已经成为一个在Web上越来越常用的应用,基于REST的Web服务越来越多,包括Twitter在内的微博客都是用REST做为对外的API,先前我曾经介绍过“基于REST架构的Web Service设计”,并给出了一些服务器端和客户端代码,随着JavaScript的广泛应用,我这里就给出一个轻量级的基于JavaScript的REST客户端框架。

  这个JavaScript客户端主要使用了XMLHttpRequest对象来实现通过HTTP对服务器操作GET、PUT、POST和DELETE以检索和修改资源。值得注意的是,由于安全方面的考虑,Javascript被限制了跨域访问的能力,因此在调用XMLHttpRequest的时候,应该注意跨域访问的问题,比如使用同一个域的动态文件做代理,或者其他方法避开跨域访问的问题。我这里给出的代码主要是根据我先前的那段代码修改过来的,其客户端JavaScript代码如下所示:

function httpGet(url, method, data) {
    var xmlhttp;
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open (method, url + "?" + data, false);
    xmlhttp.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    xmlhttp.setRequestHeader ("Content-Length", data.length);
    xmlhttp.send (null);
    if (xmlhttp.Status = 200) return xmlhttp.responseText;
}

function httpPost(url, method, data) {
    var xmlhttp;
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open (method, url, false);
    xmlhttp.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    xmlhttp.setRequestHeader ("Content-Length", data.length);
    xmlhttp.send (data);
    if (xmlhttp.Status = 200) return xmlhttp.responseText;
}

function httpPut(url, method, data) {
    var xmlhttp;
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open (method, url, false);
    xmlhttp.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    xmlhttp.setRequestHeader ("Content-Length", data.length);
    xmlhttp.send (data);
    if (xmlhttp.Status = 200) return xmlhttp.responseText;
}

function httpDelete(url, method, data) {
    var xmlhttp;
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open (method, url + "?" + data, false);
    xmlhttp.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    xmlhttp.setRequestHeader ("Content-Length", data.length);
    xmlhttp.send (null);
    if (xmlhttp.Status = 200) return xmlhttp.responseText;
}

function test() {
    document.write (httpGet("http://localhost/rest/service.asp", "GET", "do=GET"));
    document.write (httpGet("http://localhost/rest/service.asp", "POST", "do=POST"));
    document.write (httpGet("http://localhost/rest/service.asp", "PUT", "do=PUT"));
    document.write (httpGet("http://localhost/rest/service.asp", "DELETE", "do=DELETE"));
}

  我这里使用这个代码编写了一个简单的应用例子,就是管理Twitter好友的应用,大家点这里可以下载使用,因为跨域访问的问题,这段JavaScript只支持IE在本地使用。

2009年6月10日星期三

预装过滤软件的疑问

  据工信部的《关于计算机预装绿色上网过滤软件的通知》文件的通知,在2009年7月1日以后,中国境内生产销售的计算机出厂前将预装一款绿色上网过滤软件,而进口计算机在中国销售前也将预装该软件,这款软件具备拦截色情内容、过滤不良网站、控制上网时间、查看上网记录等功能。

  对于这样一款大规模预装的软件,我有一些非常疑惑的问题,从软件的功能介绍上来看,这是一款针对儿童的上网过滤软件,当浏览的含有不良信息的网站(例如色情网站)时,该软件可以自动关闭浏览器。但是,现在要求所有电脑都预装这个软件,如果用户家庭没有儿童呢?如果使用电脑的用户本身就是成年人呢?难道所有成人都要遵守儿童的标准,不能访问所谓的儿童不宜网站?

  我认为网上色情问题,对于未成年人和成年人,性质完全不一样。对于未成年人来说,保护青少年免受网络色情侵害是正确的;但是对于成年人来说,不应该和儿童采用同样的标准,必须在保护青少年身心健康与保护成年人言论自由之间找到平衡点,否则搞不好就变成限制成年人的言论和阅读自由的行为。

  对于成年人来说,在自己的电脑上看什么信息完全属于自己的私生活,只要不进行传播和复制,就属于个人的私事,有关部门不应该把管理之手伸到用户的私人空间,否则会引起大众的强烈不满,并且这本身也不符合法律规定。道德和法律本应该是严格区分的,道德是多元化的,在家浏览黄色网站,固然有悖很多人心中的道德规范,但这最多也属于个人道德的规范,并没有公共危害性,而如果某些国家部门通过这样的技术手段强行禁止成年人访问这些网站,并把这些当成自己所追求治理的理想社会秩序,这就让个人的合法权利受到这些公权力的损害,成为一种彻头彻尾的践踏私人生活空间的违法行为。

  同时,有关部门的审核标准也令人质疑,何为不良信息,审查这些不良信息的标准是什么,审查人是否有足够的知识来辨别何为不良信息,如果错误的将正常信息判断为不良信息,如何处理,如何保证合法网站的正当权益,这些都是很难控制和处理的事情。

  从另一方面将,这个软件本身的安全性就存在很大的疑问,这样一款小公司开发的软件很容易存在各种安全漏洞,在未经过广泛测试之前,贸然就安装到大量电脑客户端上,存在极大的安全隐患。一旦“绿坝-花季护航”的安全漏洞被黑客发现,那么所有安装这个软件的电脑都成为黑客的“肉鸡”(受别人远程控制的电脑),大量的“肉鸡”不但可能引发各种网络安全事故,还完全有可能重演先前“暴风影音断网”的灾难,其未来发展不得不令人感到担忧。

  后记:2010年7月13日,多家媒体报道,曾在中国内外引起强烈反对的“绿坝—花季护航”互联网内容过滤软件北京项目组因缺乏经费关闭。而位于郑州的另一项目组也在艰难维持,随时可能关张。

2009年6月9日星期二

Google发布翻译辅助系统

  据Google黑板报报道,今天,Google推出了一个新产品:Google翻译辅助系统

  该系统主要是供专业翻译人员手动翻译使用,翻译人员可以上传或指定一篇文章的地址,然后通过系统进行翻译,Google会预先使用自己的翻译系统进行翻译,然后翻译人员再进行人工校对和翻译,翻译界面上,左边为原始文章,右边为翻译后的文章,用户选中右边的文字,左边的原始文字会自动变色,除此之外,该系统还提供了翻译记忆库、术语和词汇表的上载复用机制。

  Google翻译辅助系统在机器翻译的同时,还提供了自动翻译搜索功能,使用户在编辑翻译的过程中,可以借鉴其他人翻译过的类似结果,并给予评定。最重要的是,Google翻译辅助系统在用户的编辑翻译中自动“学习”, 从而形成了一个良性循环,进而共同提高翻译的质量。

  对于中文博客来说,很多文章都是翻译国外博客的文章,那么不妨尝试一下这个系统,共同提高大家的翻译水平。

  点击访问:Google翻译辅助系统

 

电影《甜蜜蜜》观后感

  晚上看了部香港的老电影,陈可辛导演,黎明和张曼玉主演的《甜蜜蜜》,一部挺感人的爱情文艺片。

  这部电影的剧情引起了我很大的共鸣,黎小军从遥远的北方城市天津来到了南方的陌生城市“香港”,一个人漂泊在外,却认识了同样从大陆过来的李翘,同在异乡的孤独、迷茫和彷徨让他们的心离得更近。

  共同的奋斗和挫折让他们相爱了,那个磅礴大雨的夜晚,黎小军才发现,自己喜欢的可能并不是远方的爱人小婷,而是自己对面的李翘。但是他一直在逃避,逃避自己的感情。后来和李翘分手,接来了远方的爱人小婷并和她结婚,开始自己原先梦想中的新的生活。

  然而,当所有的梦想都实现的时候,黎小军却越发不安起来,这真的是他想要的爱情吗?为什么他心里牵挂的却是另外一个人。他的话越来越少,内心却在不断地挣扎,换来的是更多的痛苦和烦恼。所以,当黎小军搂着新婚妻子黯然地说,以前刚来香港的时候,要是当时你在我身边该多好啊,一句话说的多少无奈在其中。

  最终黎小军还是和小婷离婚了,独自跑到遥远的美国来逃避现实,这样的感情和背叛他承受不起,太深刻的感情,只能让人选择逃离,甚至没有勇气去面对。

  很多人说黎明在影片中的表演很木纳,我却觉得他演的很好,甚至让我产生了共鸣,因为我也有类似黎小军的一段经历,十一年前,我不也是独自一个人从遥远寒冷的北方城市来到了这个陌生的异乡深圳,同样是充满了新奇、迷茫和孤独,早先我也有着为了理想而打拼和奋斗的雄心壮志,后来才发现,原来一切都是命运,一切都是烟云。

  电影的结局,是个很童话的结局,导演可能为了迎合观众,让黎小军和李翘这一对苦命鸳鸯最终戏剧般地实现了重逢。而在现实生活中,这样的机缘巧合般的重逢真的很少,更多的却是擦肩而过的命运捉弄。

  因此,不要把你的爱人留在远方。爱她的话,就带她一起走吧。

电影《甜蜜蜜》

2009年6月8日星期一

谷歌中国高考地图发布

  据中国Google黑板报报道,谷歌中国宣布推出“谷歌高考2009”地图,人们可以在网上查询全国高校的地图,街头巷尾的饭店和银行都可看到,还可以查到学校历年的录取分数线。该地图还可以帮助网民依据自己的分数报考合适的学校。

  据介绍,“谷歌高考2009”地图可以提供全国31个省上千所大学的信息,所有数据来自于中国教育在线。网民可以在“谷歌高考2009”地图查看全国大学的分布图,了解哪些城市的大学最多,拥有优秀高等学府城市的历史等。如果打算考察某一个城市的一所学校,输入学校名称,点击放大“谷歌高考2009”地图,街头巷尾的饭店和银行都可看到。还可以点击“谷歌高考2009”地图的“卫星地图”标签,就可以看到大学校园和周边环境的卫星航拍地图,地面建筑和河流湖泊均可找到。学校的历史和地缘往往决定了分数的高低。“谷歌高考2009”地图还提供了高校的分数线查询功能。如果你希望报考人民大学,点击人民大学旁边的小泡泡,不仅可以看到人民大学的简介,了解人民大学周边的基本情况,还能查询到历年人民大学的录取分数线。

  另外,“谷歌高考2009”地图还可以帮助网民分析和比对不同的学校,筛选适合的学校和专业。Google相关人士称,假如你是一个河北的理科考生,估分在600分左右,想考广州的大学主修经济学,那么拉动左侧工具栏的“分数线范围”,“谷歌高考2009”地图将显示适合你就读的学校有四所:广州外语外贸大学、华南理工大学、华南农业大学以及中山大学。

  如果你对心仪的大学拿不定主意,可以搜索之后点击“收藏”,保存学校的数据和信息,“院校选择”栏目会出现一个曲线图,让你了解最近几年内所选择的学校的历年高考分数线,供你筛出最佳选择。

  根据网民需求热点而推出特定地图,是Google地图近年来一项颇为成功的本土化尝试。此前,Google曾推出春运地图赈灾地图情人节地图等产品。

  点击访问:谷歌高考地图 http://www.google.cn/gaokao

2009年6月7日星期日

微软Hotmail将不支持WebDAV协议

  微软宣布自2009年9月1日起,Hotmail将不再支持WebDAV协议,届时,使用Outlook Express的用户将无法再通过WebDAV协议访问Hotmail,做为替代,用户可以在Outlook Express上使用POP3来访问Hotmail邮箱

  早在去年,微软就曾计划在2008年6月30日不再支持WebDAV协议,在用户强烈要求下才决定将支持时间延长一年多时间。微软称,为了支持容量越来越大的邮箱,放弃WebDAV协议是必要的。

  集成有Outlook Express的最后一个版本操作系统是Windows XP,Windows Vista集成了Windows Mail,但不能直接访问Hotmail,希望直接访问Hotmail的用户可以使用Windows Live Mail。Windows Live Mail使用了DeltaSync。仍然希望直接访问Hotmail的Outlook Express用户可以使用POP3协议。Hotmail已于2009年3月起支持POP 3

  作为微软发布战略的一部分,Windows 7缺省情况下没有捆绑任何电子邮件客户端,但用户可以选择安装Windows Live Mail.

  微软放弃WebDAV协议对Outlook 2003/2007用户没有影响,因为这两款产品同时使用了DeltaSync协议。但老版本Outlook的用户则需要使用POP 3协议或升级到支持Office Outlook Connector的新版客户端软件。

  通过浏览器访问Hotmail或者使用Gmail接收Htomail的用户不会受到任何影响。这次变更应该不会像上次那样再遭到用户强烈反对了。

2009年6月6日星期六

百度搜索推广的广告产品

  今天,百度公司大客户部的人到我们公司,来介绍他们的百度搜索推广产品,这个产品我以前也研究过,这次则由百度的业务人员具体对这个产品进行了一番讲解,感觉了解的更深入了,以下是我对这个会议进行的一些笔记。

  1、百度搜索推广

  百度推广是一种按效果付费的网络推广方式,目前分为百度经典版和百度专业版(内部代号:凤巢)。

  百度经典版:搜索结果左侧广告,包括品牌、产品、行业相关的关键字,针对产品的目标用户。左侧广告会有“推广”字样。

左侧广告

  百度专业版:搜索结果右侧广告,覆盖产品人群的行为以及关注其他相关品牌的关键字,针对产品潜在用户。

右侧广告

  合理预算分配,提高ROI(投资回报率)

  例如,IBM对于经典版和专业版的预算比例是7:3,某保险公司投放的比例是54%和46%,该公司每月有50%的网上保险都是由百度带来,ROI大于2 .

  建议广告投放时间为,每天8点至18点,每周一至周五,月度重点投入为6月至12月。

  百度专业版(右侧广告)中,最顶部右侧为“火爆地带”栏目,中部为专业版,底部是其他相关。

  右词左跳:指的百度右侧专业版广告转到左侧第一位,并在广告上标记“赞助商链接”,右词左跳的触发条件为:左侧广告无人购买,同时右侧广告具有较高点击率和广告质量度累计,即可实现右词左跳。

右词左跳

  右词左跳会带来点击率的大幅提升。

  2、百度网盟推广

  主要将广告投放在以百度联盟为主的内容网络上,广告价格为,文字广告2毛-4毛,图片广告4毛-6毛。

  网盟推广可以有网站定向(根据行业等定向)和地域定向(根据省市网络线路定向)。

  3、百度社区推广

  包含百度贴吧、百度知道、百度百科、百度空间等社区上的广告,通过cookies对于所有搜索或使用百度的用户进行分析,基于AISAS(Attention 注意、Interest 兴趣、Search 搜索、Action 行动、Share 分享)模式,从各个方面对于消费者投放那些他所关心和注意的广告产品。例如用户在百度中搜索了“汽车”等关键词,那么在他浏览百度贴吧的时候就会在帖子右侧出现一些汽车产品的广告。

2009年6月4日星期四

微软Xbox360体感操控器震撼发布

  在周一召开的游戏盛会E3大展上,微软公布了一个令人震撼的Xbox360操控器——体感摄像头,通过摄像头和麦克风实现的3D动作识别和语音识别系统,从演示画面上来看,这种完全的体感操作具有不可思议的用户体验,很有可能成为将来最具创新意义的游戏机。

  摄像头和麦克风并不是什么新鲜设备,但通过智能识别将其取代游戏杆的确是微软的一大创新,这种创新可和当年任天堂Wii相提并论。该设备能够自动实现3D姿态感应和面部及语音识别,一旦面市即可与所有版本的Xbox 360相容,相信这将让次世代游戏机大战变得更为扑朔迷离。

  微软在会中展示体感控制的功能主要有:游戏体感操作,感应全身动态且灵敏度比Wii更强;语音辨识输入,电脑AI自动辨识执行;脸部辨识扫描开机登入;摄影扫描即时产生3D模组;X360主机体感操纵介面;多人网络视频聊天;即时衣服变装、360度即时预看;语音输入操作X360功能(开关机、播放影音)。

微软Xbox360体感操控器震撼发布

  微软Xbox 360体感操控器的推出,无疑将挑战任天堂Wii的领先地位,而对于索尼的PS3来说,则是灾难性的打击,几乎所有PS3的游戏都有Xbox 360版本,并且PS3价格又更高,又没有Xbox 360这种创意性的功能,索尼的PS3很可能会在次世代游戏机大战中首先出局。

  虽然微软在网站和搜索引擎上的表现糟糕的一塌糊涂,但这次微软演示的产品的确很有创意,对于提高用户的游戏体验具有重大意义,说不定会成为微软在游戏机市场上反败为胜的转折点。

2009年6月3日星期三

微软新搜索Bing遭质疑,可播色情视频

  距华商报消息,据国外媒体报道,旨在挑战搜索巨人Google,微软的新搜索引擎Bing(中文名必应)已经正式上线,但是一些博客和互联网安全专家迅速发现,任何人只需通过几次简单的点击,就可以在该搜索引擎内直接观看色情视频。

  为了挑战Google,微软为Bing设计了许多便捷的功能,其中包括一个“自动播放”工具,它可以让用户方便的预览视频。然而这次微软恐怕是好心办错事,因为通过该功能,用户可以在Bing上看到大量色情视频,而不用去访问那些“黑网站”。

  科技博客Loic Le Meur本周一在试用了Bing上的视频搜索功能后,发现了这个问题,他表示自己感觉像是置身于一个色情网站之中。

  微软在一份声明中表示,默认情况下Bing会过滤比较露骨的图片和视频搜索结果,但是用户对是否关闭过滤功能具有决定权;同时它还在其官方博客上介绍了如何修改相关设置。

  在其它主流搜索引擎中,诸如雅虎和Google,如果关闭了过滤功能,用户也会看到类似的视频和图片,但是它们不提供在搜索结果页面中自动播放视频的功能。

  Enough Is Enough是一家专注于在线安全性问题的非营利性组织,该组织总裁兼主席Donna Rice Hughes表示,从搜索引擎功能的角度讲,视频预览是一个非常棒的功能,但是问题是人们通过它会看到大量的色情内容。

  Hughes表示,微软和其它搜索引擎“需要完善它们的过滤搜索功能,可以选择提供密码保护功能”来让父母防止孩子访问不健康内容。

更新Twitter的方法和技巧

  Twitter做为一个广受欢迎的微博客,不仅仅在国外非常流行的微型博客,国内也有很多用户在使用它,可以通过手机短信的形式发布信息,可绑定IM即时通讯软件。所有的Twitter消息都被限制在140个字符之内,因此每一条消息都可以作为一条SMS短消息发送。你在手机上看到一条消息或在IM上接收到消息,同时Twitter个人页面上也会留下相应的消息。更新Twitter的方法非常多,我这里介绍几个最新的更新Twitter的方法。

  更新hosts的方法

  更改hosts文件应该是较好的方法之一,使用和先前的方式几乎没啥区别,具体操作是,将168.143.161.20 twitter.com一行加入到C:WINDOWSsystem32driversetchosts文件中(注:原IP168.143.162.100/128.121.146.228已失效),这时候https://twitter.com就可以正常访问了,注意是https。更新好这个hosts文件后,基本上所有的客户端软件包括twhirl、TweetDeck、TwitterFox都可正常用作,这个方法很适合通过客户端软件更新Twitter的用户。

  使用FriendFeed同步

  登录FriendFeed后绑定Twitter,然后在“Twitter发布偏好设置”中,选择“发布条目的位置:FriendFeed (在无‘抄送’框时)”,这样,在FriendFeed上手动发布一条信息时,会自动同步到Twitter,而且Twitter上用户的回复也能自动更新到FriendFeed,这个方法不好的地方在于同步的时候会自动带一个FF的链接。

  使用HelloTXT同步

  HelloTXT是一个很不错的同步微博客工具,在上面绑定Twitter后,可以直接从HelloTXT发布信息到Twitter,使用HelloTXT同步的另一个好处是,可以在一个界面上一次同步饭否、嘀咕、做啥、叽歪这几个主要的中文微博客,而同类服务Ping.FM就不支持这么多中文微博客的同步。另外,HelloTXT可以通过电子邮件、Gtalk、MSN来更新,这样就可以通过这些新的途径来更新Twitter了。

  使用Twitterfeed更新

  使用Twitterfeed绑定你的RSS,然后可以同步信息到Twitter,这从理论上看,使用任何一个支持RSS的服务(例如各类微博客、博客等),都可以自动更新到Twitter上了,不过Twitterfeed的缺点是至少有30分钟的延时。

  使用TwitterGadget更新

  在Gmail或iGoogle中,增加一下TwitterGadget小工具,即可使用其更新Twitter。这个小工具是第三方的Twitter工具。

  通过第三方Twitter API应用访问

  Dabr是一个强大的可通过手机/电脑上的浏览器访问的Twitter客户端,各项功能一应俱全,是个不错的Twitter API应用。该应用是开源的,用户可以在这里下载Dabr源代码,然后安装在任何一个支持PHP的主机上就可以使用。另外还有一些第三方网站,如iTweettwitZapTwitIQ等。

  使用QQ更新

  在国内使用QQ的人还是不少的,通过一些特殊的技巧,也可以实现从QQ来更新Twitter,方法是,注册一个嘀咕帐号,然后在QQ上加入嘀咕的机器人,接着在嘀咕中的滴神里绑定HelloTXT的同步,最后登录HelloTXT中绑定Twitter,这样就实现了通过给QQ机器人发送的消息,自动同步信息到Twitter上。

  好了,以上这些就是在目前情况下能继续更新Twitter的方法,如果你还知道什么更好的方法,请留言告诉我。我的Twitter帐号是 http://twitter.com/williamlong 。

2009年6月2日星期二

Google Chrome复选框消失缺陷

  最近几个月的时间,我在家里和公司都较多的使用Google Chrome浏览器,不少工作和学习都是在这个浏览器下使用的,在Chrome下用的多了,也有了一些自己的体验和看法,开始思考到底什么样的浏览器是最合适的,什么样的浏览器是最优秀的。

  Google Chrome的稳定性和速度给了我深刻的印象,我几乎没有碰到过Google Chrome崩溃的情况,速度在大多数情况下也很快,然而,在使用过程中,我也发现了Google Chrome的一些一直都没有解决的缺陷和问题。下面我就详细介绍一下我在使用过程中遇到的一些困惑,我测试使用的环境是Windows XP SP3系统和Google Chrome 2.0.172.28版本。

  复选框消失错误

  这是一个至今也没有彻底解决的问题,也是最令我迷惑的问题,而且这本来根本不应该成为问题。我在使用Google Chrome浏览网页的时候,经常会发现网页上的复选框(CheckBox)有时候会突然消失,如下图所示。

Google Chrome的复选框消失缺陷

  在同样环境下,启用IE或Firefox浏览网页,都不会出现复选框消失的问题。

  错误解决方案

  目前我还没有找到具体的解决方案,有人说在“我的电脑”-“属性”-“高级”-“性能”中,选择“在窗口和按钮上使用视觉样式”可以解决这个问题,但是我发现对于有些电脑来说这个设置还是无效。

Google Chrome的复选框消失缺陷

  通常出现复选框消失的情况,我会右击状态栏,点“属性”,然后直接点确定,这时候通常复选框会出现,但不能保证复选框会一直出现。

  我估计这可能是Chrome引擎存在的问题,除了这个错误之外,Google Chrome的中文页面渲染,中文最小字体支持以及对于插件扩展的支持都存在种种问题,对于一个已经诞生了9个月浏览器来说,这大概是Google Chrome依然无法成为主流浏览器的原因之一了。

2009年6月1日星期一

“开架式”软件设计是未来之路

  早期的国内应用软件产品,其扩展性都是相对较差的,尽管开发商也为此作过很多工作,包括二次开发工具包等等。主要原因就是这些应用本身框架的局限性,不具有可扩展性,在设计时我们关注的只是应用程序的实现,没有关注我们的应用应该构建在一种开放的框架上。(当然开发语言本身也有一定的局限性)

  “开架式”软件设计是基于应用程序的可扩充性提出来的,是一种软件底层架构的实现方式。他更关注应用程序底层架构的实现,与具体应用程序的实现无关,或者说具体的应用程序是构建在这种架构定义的范畴之内的。

  在这种设计思想下,我们的应用程序框架可形象比喻成书架一样,我们提供一个架子(规范),书架内容的不断丰富,就好像将不同的书(功能/插件)放在架子上一样,当然书需要满足我书架尺寸的要求。

  在这种框架下,提供的是一堆服务和资源以及调用和扩展这些服务及资源的规范,而这些服务和资源也是可扩展的,你可以在一个组件中编写一些服务和资源由框架加载并与其他的组件分享。组件的功能是由框架加载并执行,它可以访问框架提供的资源和服务,如可以访问界面元素,访问数据库、文件,调用日志服务写入日志、访问多语言信息等等。

  大概的运行时框架如下:

“开架式”软件设计是未来之路

  图中的组件A和B可理解为系统提供的组件或者应用程序功能性组件。

  其中的关键就是要提供一种机制:

  1、 保证组件可以被框架加载并运行,

  2、 将组件中包含的资源和服务注册到该框架中,

  3、 组件访问框架中的资源和服务的透明性。(也表现出组件间、组件和框架间的协作性和可访问性)。

  有了这样的应用程序框架,我们可以任意扩展应用程序的功能组件,只要他遵循框架定义的规范。我们可以新增加一个组件,可以提供新的资源和服务(如果愿意),可以访问框架中的资源和服务就好像这些都是该组件自身具有的,而组件中提供的功能可以通过配置插入到恰当的菜单或工具条供用户调用。而这些对用户是透明的,他们不知道界面中的某个功能究竟来自于那一个组件。组件和组件之间是彼此独立的离散的。

  远景:

  将产品发布成为这样一套框架(标准)和预先提供的功能组件,用户可以到网上直接下载组件进行程序的升级,用户可以根据框架定义的规范自行开发,甚至有第三方软件公司根据框架的内容和标准专门开发特有的功能,如软件对GPRS、视频会议的支持等等。也可以支持OpenSource,开放标准提供给网上大量的开发者开发功能组件,作为用户可以在网上找到需要的功能组件。这些或多或少已经是一种商业模式的问题了。

  优点:

  1、 扩展性极强,可以到甚至

  2、 因为组件和组件之间是彼此独立的离散的,带来的升级也是方便的,

  3、 程序更新只需要下载和替换相关的组件即可,

  4、 程序的架构是严密的,

  5、 架构本身的升级比较容易。

  缺点:

  1、 性能的影响。高扩展性必然以牺牲一定性能作为代价的。

  2、 功能扩展的不定性。

  3、 高度共享带来的安全性也是一个要考虑的问题。

  (注:本文为我同事杨舰的几年前的稿件,该文从项目经理的角度提出了一种新的开发框架,供大家参考)