2006年12月10日星期日

软件盗版的产业链

  在中国这样的国家,开发软件是一件痛苦的事情,因为除了和同行之间相互竞争之外,还要和另外一个对手——“盗版”来竞争,使得软件开发商精力分散,并付出很多不必要的成本。而盗版做为一个特殊产业,在中国这个特殊国情下,也逐渐形成一个成熟的产业链。

  利益催化,盗版产业链成熟

  软件盗版的产业链目前已经日趋成熟,并开始朝规模化、大型化发展,抢占了大部分低端用户的市场,软件开发商不得不面临这样的怪圈:产业发展前景虽好,面临的问题却是赚钱难。

  软件开发商的前期投入和成本是非常高的,如果产品出来后被大量盗版,必然会导致开发成本无法收回,形成的效应就是产业规模萎缩,开发商不愿意进入这个行业。

  为了防止软件被盗版,软件开发商必须使用比较高级的“软件加密技术”,例如“软件加密锁”,使得破解变得困难,而整体软件成本不会提高太多,而在盗版行业,也有一批人专门从事复杂的付费加密狗破解,通过破解加密狗进行牟利,而中国的法律恰恰没有规定破解加密狗是非法的,比如在百度上搜索“加密狗破解”,竟然有好几个破解网站堂而皇之地做起了竞价广告,显然百度也是认为加密狗破解没有违反中国法律,因此干起了坐地分赃的角色。

  没有无法破解的软件,这些专业人士破解出加密狗后,就将相关的破解软件出售给盗版渠道,盗版渠道再进行规模化生产通过各种渠道(比如盗版光盘)大量销售盗版软件从中牟利。而目前中国打击盗版是通过打击这个产业链的最末端来实现,很难想象,抓几个卖盗版光盘的民工会对这个产业链有什么影响,这也是中国打击盗版十多年,却越打击,盗版行业却越兴旺的主要原因。

  打击盗版,应从源头开始

  软件开发商的能力一般都是有限的,即使使用了复杂的加密编程算法,也会被专业人士破解,而这些破解人士处于半公开的环境,法律没有限制他们,开发商也拿他们没办法,这时候就需要政府相关部门在这里多进行一些努力了,我们目前看到的是,这些“专业软件破解”可以在百度做竞价广告,其网站也通过了信息产业部的备案(陕ICP备06003050号),这也是一个很大的嘲讽。

  我们的信产部也应该有所作为了,关闭了那么多“有害信息”的网站,却偏偏不关这些搞盗版的网站,增加就业机会也不是这么增加的。当然,用什么样的方法来解决盗版问题,这在认识上有很大的不同,相关的管理部门还有很多更“重要”的事情要做,软件开发商也应该督促一下当地管理部门,让其明确观念,最终在反盗版的问题上做出明确的决定。

2006年12月9日星期六

百度博客搜索的收录

  百度博客搜索发布后,引起了很多人的讨论,其中对于百度博客搜索的收录问题存在不少争论,我这里就说一下我关于百度博客搜索的收录问题的看法。

  有人说百度博客搜索没有收录独立域名博客,只收录BSP服务商的,我不认为是这样的,至少我看到有一些独立域名博客是被收录,只是收录的非常少而已,这里我怀疑,可能百度在区分一个站点到底是网站还是博客遇到技术问题,因此大家可以手动将自己的RSS地址提交过去,看看百度是否会收录,如果还不收录,那就是百度自己的问题了。

  百度博客搜索的另外一个收录问题是,百度给于“百度空间”过分大的权值了,以至于搜索结果的大部分内容都是“百度空间”的内容,这对于用户搜索体验来说是一大伤害,无怪乎shunzawflasher都觉得认为“百度博客搜索”叫“百度空间搜索”更为恰当。

百度博客搜索

  对于百度博客搜索Google博客搜索的收录内容的数字化对比,我这里进行了一些整理。

收录量对比 地址 百度博客搜索 Google博客搜索
百度空间 hi.baidu.com 847,000 2,142
Google Blogger blogspot.com 0 102,682,823
MSN Spaces spaces.live.com 800,000 140,499,552
新浪博客 blog.sina.com.cn 900,000 140,499,552
博客网 bokee.com 768,000 5,261
BlogBus blogbus.com 291,000 5,926
DoNews blog.donews.com 215,000 6,512
搜狐博客 blog.sohu.com 608 2,268
网易博客 blog.163.com 7,060 2,829

  从上面的数据列表可以看出,百度对于Google Blogger的收录量竟然是0,这点比较夸张,同时也可以看出,百度博客搜索可能在避免和Google博客搜索正面竞争,对于一些Google收录较少的国内BSP进行大量收录,而对于Google收录很多的MSN和新浪等并没有收录更多。并且百度可能只收录中文信息,对于英文内容不进行收录。

  总而言之,对于博客搜索这样一个新领域,百度还有很长的路要走。

2006年12月8日星期五

百度博客搜索服务正式发布

  刚刚推出百度搜藏进军网络书签领域没多久,今天,百度正式推出百度博客搜索服务,正式进军博客搜索市场,用户可以通过这个服务迅速找到中文博客更新的内容。这个服务的推出也完善了百度目前的搜索体系。

  用过Google Blog Search,对于百度博客搜索会很容易掌握,因为两者实在太像了,百度也提供“按时间排序”和“按相关性排序”,也提供搜索结果的RSS订阅,界面和Google很像。

  同Google一样,百度博客搜索可以使用site:DomainName来查询收录量,通过对一些关键词的搜索测试,我发现目前情况下百度博客搜索收录的页面比Google Blog Search少,只有一个网站例外:百度空间,百度对于百度空间的收录量比Google要多四百倍。另外提一点,如果你发现自己的博客没有被百度收录,可以点这里来提交信息。

  百度博客搜索查询Traceback的方法和Google有些不一样,百度使用domain:DomainName来查询,而Google使用link:DomainName命令。搜索完后,可以点右边的RSS来订阅搜索结果。

  百度声称是第一家推出博客搜索的中文搜索引擎服务商,从我个人使用来看,目前和Google的博客搜索甚至奇虎的博客搜索还有很大的差距。

百度博客搜索

2006年12月7日星期四

百度和Google的编程接口比较

  百度和Google做为知名的搜索引擎,有非常丰富的搜索资源信息,很多人都希望编写程序调用搜索引擎的宝贵数据,昨天我写的那个程序是调用百度的搜索接口,为什么使用百度的呢,这中间其实也是有原因的。

  我最开始打算调用Google的接口,Google本身也提供了Google SOAP Search API供程序员调用,一天可以进行一千次搜索调用,由于API是通过Web Service提供的,因此最佳调用是通过Java调用,然而不知何故我调试时候,搜索英文没问题,搜索中文就老报数组溢出错误。

  由于我的调用程序需要访问Access数据库,因此我还是打算使用VB来编写,通过VB直接访问Google的搜索页面,于是我就很快写了一个通过VB直接调用Google查询的程序,一运行,发现竟然失败了,这令我很惊讶,因为我去年六月曾经也写过类似的调用程序,少量的直接调用Google搜索,当时是可以成功的。而现在调用失败,说明此功能已经被完全禁止。出现的错误界面如下所示。

Google禁止的界面

  其中的信息提到一个地址,就是“适用于个人的Google服务条款”,其中有一条:“不得执行自动查询 :未经 Google 事先明确许可,不得将任何形式的自动查询发到 Google 系统。请注意,‘自动查询’包括通过使用软件向 Google 发送查询来确定搜索不同内容时网站的 Google 排名。”

  这一条也就禁止用户编写程序直接调用Google,而必须通过类似Google SOAP Search API这样的接口来调用,每天查询次数被限制为1000次以下。

  然而我通过同样的原理调用百度搜索引擎的时候,却发现调用完全正常,百度可以返回正确的搜索结果,虽然有时候搜索结果里会带有竞价广告。我尝试增加调用频率,在短时间内进行五千次以上的程序搜索,发现程序依旧工作正常,百度依旧会返回查询结果。

  搜索引擎开放程序直接调用,的确方便了很多程序员,这样,即使百度不提供类似Google的API,我们也可以编程访问其搜索资源。

  当然,我也猜测,百度这样做也不一定真的是为了造福大众,因为百度以前曾经推广过一些搜索插件程序,类似紫光拼音输入法也会绑定百度的插件,因此会存在大量通过客户端程序而不是浏览器对于百度的访问,而百度对这方面很难进行判断识别,因此就开放了应用程序的直接调用搜索。而Google没有推广过类似的客户端插件,因此为了节省服务器资源,索性就完全关闭了客户端的直接调用。

  客户端的这种调用,对百度来说也是有一定压力的,如果大家滥用这些资源,那么百度也有可能会学Google一样关闭客户端的直接调用,因此不可滥用资源,例如我昨天提供的程序就限制了每次最多只能进行500次查询,以免对搜索服务器造成过大负载。

2006年12月6日星期三

防止文章被复制的网络分析软件

  很多Blogger都遇到过自己文章被其他人非法复制的情况,为了让大家能快速将恶意转载者找出来,我根据搜索引擎的一些原理,利用百度搜索引擎的数据,开发了一个可以自动分析查找那些对自己有“实质伤害”的复制人的地址。

防止文章被抄袭的网络分析软件

  这是一个独立的可执行的程序,完全免费,基于ACCESS数据库,目前支持Z-Blog系统,其实支持其他ASP的Blog修改也很简单,有需要的可以联系一下我。(注:其他Blog程序的使用方法:先建立一个Access文件,然后建立一个表,表名为blog_Article,表中增加字段log_ID和log_Title,log_ID为自动编号,log_Title为文章标题,然后将你Blog上的文章标题都复制过来,一篇文章对应一条记录,只复制标题即可,然后在本程序中选择这个数据库)

  数据挖掘我是直接通过调用搜索引擎来实现的。原先打算使用Java下调用Google SOAP API来实现,不过不知什么原因,Google SOAP API搜索英文没有任何问题,一搜索中文就报数组超界,不知道什么原因。只好去调用百度的搜索引擎。

  百度的搜索引擎没有API,不过我还是有办法间接调用的。调用的时候发现中文的确没有什么问题,也没有错误,很顺利就调通了程序。

  我目前搜索的时候,采用了“实质伤害”这个概念,因为目前文章转载的情况会非常多,每一个都去处理会很麻烦。因此我们只去寻找情况恶劣的即可。这个可以通过搜索引擎排名来实现。只寻找那些转载地址对于原文影响最坏的。

  这个程序使用起来很简单,先选择数据库文件,再选择Z-Blog系统,然后填写你自己的域名,点搜索即可开始执行。搜索完成后会自动生成一个名为list.txt的文件,就是搜索结果。此程序对于部分标题的文章会有误判,最好文章标题个性化浓一些。软件的界面看起来不是很好,因为我没有美工嘛。

  点击下载软件:转载文章搜索器

2006年12月5日星期二

申请Google AdSense for Feeds

  今天从困兽那里听到一个消息,说“Google已经开始接受AdSense for Feeds申请,只要你的网站 feed 订阅数在100以上,并且拥有 AdSense 帐户,就可以参加 AdSense for feeds (BETA)。申请地址:https://services.google.com/ads_inquiry/aff 。”

  我对此很感兴趣,于是也点击上面的链接申请,显示的页面是英文的,我选择填写自己的信息后提交,大概几分钟后,收到Google发来的一封邮件,内容如下:

  Thank you for your interest in AdSense for feeds.

  Unfortunately, we're unable to accept your application for the program at this time. Because AdSense for feeds is currently in beta, we're unable to accept all applicants into the program. If we're able to extend our service to you in the future, we'll be sure to let you know.

  自动被拒了。看来,中文Blog申请Google AdSense for Feeds还是有困难的,估计这个服务还是只对英文用户开放的。至少等英文用户使用稳定后,才可能考虑中文用户。

  大家有兴趣也可以去申请试试,看看能否申请成功。

2006年12月3日星期日

通过Web Service调用Google SOAP Search API

  我曾经介绍过“使用Axis开发Web Service程序”的一些步骤,做为一个更有特色的应用范例,本次我将介绍使用Axis通过Web Service调用Google SOAP Search API,实现Google搜索、Google快照、Google拼写这三项功能,包括示例源代码。

  一、环境配置

  首先,没有Java开发环境的,需要安装一下环境,点这里查看《Java开发环境的详细配置方法》,其实,本示例安装JDK 1.42以及Eclipse 3.2就可以了。

  二、将Apache Axis相关包文件放在WEB-INFlib目录下

  从Apache的主页上下载Axis包文件,复制到lib目录下。

  三、申请Google SOAP Search API license key

  要使用Google的服务,必须要有“license key”,如果你有Gmail帐号,点这里就可以申请license key,这个license key是一段很长的字符串,每个key可以支持每天1000次的Google搜索。

  四、下载WSDL文件,生成客户端Java代码

  WSDL文件的下载地址参见:http://api.google.com/GoogleSearch.wsdl

  生成客户端代码的批处理文件如下:

set Axis_Lib=D:workspace estWEB-INFlib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=D:workspace estsrc
set Package=com.google.api
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% GoogleSearch.wsdl

  最后会生成下列代码文件:

DirectoryCategory.java
GoogleSearchBindingStub.java
GoogleSearchPort_PortType.java
GoogleSearchResult.java
GoogleSearchService.java
GoogleSearchServiceLocator.java
ResultElement.java

  五、编写程序,调用Google SOAP Search API

  在上面那个包下,编写你自己的Java程序,就可以调用Google SOAP Search API.目前可以使用的Google服务有:网页搜索,网页快照,拼写检查这三个。

  Java示例代码如下,请使用前将clientKey替换为你自己的。替换后直接运行即可得出结果。

package com.google.api;

import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;

public class ClientGoogle {

  public static void main(String[] args) throws ServiceException,
    RemoteException {
    String clientKey = "kkkkkkkkkkkkkkkkkkkkkkkkkkey";
    GoogleSearchServiceLocator service = new GoogleSearchServiceLocator();
    GoogleSearchPort_PortType gsp = service.getGoogleSearchPort();

    //Google Search API
    GoogleSearchResult searchResult = gsp.doGoogleSearch(clientKey,
        "www.williamlong.info", 0, 10, false, "", false, "", "latin1",
        "latin1");
    System.out.println("Google Search Results:");
    System.out.println("======================");
    ResultElement results[] = searchResult.getResultElements();
    for (int counter = 0; counter < results.length; ++counter) {
      ResultElement result = results[counter];
      String returnResult = "('" + result.getTitle() + "','"
          + result.getURL() + "','" + result.getSnippet() + "')";
      System.out.println("Return Result");
      System.out.println(returnResult);
    }

    //Google CachedPage
    byte[] cachedBytes = gsp.doGetCachedPage(clientKey,
        "http://www.williamlong.info/");
    System.out.println("Cached page:");
    System.out.println("============");
    String cachedString = new String(cachedBytes);
    System.out.println(cachedString);

    //Google SpellingSuggestion
    String suggestion = (String) gsp.doSpellingSuggestion(clientKey,
        "williamlong");
    System.out.println(suggestion);

  }

}

  当然,你也可以不使用Apache Axis,Google自己也提供了一个API包可以做为客户端调用,下载地址参见这里

  最后声明一下,Google SOAP Search API是属于实验产品,每个license每天最多只允许搜索一千次,其许可协议注明不能使用于商业模式的网站,而对于个人研究来说,每天一千次的搜索也就足够了。

  相关专业名词解释:

  Web Service:是一种革命性的分布是计算技术。它使用基于XML的消息处理作为基本的数据通讯方式,消除使用不同组件模型、操作系统和编程语言的系统之间存在的差异,使异类系统能够作为计算网络的一部分协同运行。开发人员可以使用像过去创建分布式应用程序时使用组件的方式,创建由各种来源的Web服务组合在一起的应用程序。由于Web服务是建立在一些通用协议的基础上,如HTTP(Hypertext Transfer Protocol, WWW服务程序所用的协议),SOAP(Simple Object Access Protocol,简单对象访问协议),XML,WSDL(Web Services Description Language,Web服务描述语言),UDDI(Universal Description,Discovery,and Integration,通用描述发现和集成协议)等,这些协议在涉及到操作系统、对象模型和编程语言的选择时,没有任何倾向,因此Web服务将会有很强的生命力。

  SOAP:是“Simple Object Access Protocol”的缩写,SOAP是消息传递的协议,它规定了Web Services之间是怎样传递信息的。简单的说,SOAP规定了:

  1. 传递信息的格式为XML.这就使Web Services能够在任何平台上,用任何语言进行实现。

  2. 远程对象方法调用的格式。规定了怎样表示被调用对象以及调用的方法名称和参数类型等。

  3. 参数类型和XML格式之间的映射。这是因为,被调用的方法有时候需要传递一个复杂的参数,例如,一个Person对象。怎样用XML来表示一个对象参数,也是SOAP所定义的范围。

  WSDL:是“Web Services Description Language”的缩写。WSDL是Web Services的定义语言。当实现了某种服务的时候(如:股票查询服务),为了让别的程序调用,必须告诉大家服务接口。例如:服务名称,服务所在的机器名称,监听端口号,传递参数的类型,个数和顺序,返回结果的类型等等。这样别的应用程序才能调用该服务。WSDL协议就是规定了有关Web Services描述的标准。

  UDDI:是“Universal Description, Discovery,and Integration”的缩写。简单说,UDDI用于集中存放和查找WSDL描述文件,起着目录服务器的作用。

  XML:(eXtensible Markup Language,可扩展标记语言)是Internet上数据表示和数据交换的新标准。它是ISO(International Organization for Standardization,国际标准化组织)的SGML(Standard for General Markup Language,通用标记语言标准)的一个简化子集。XML关注信息本身,是Web上表示结构化信息的一种标准文本格式。与传统的注重页面信息显示的HTML(Hypertext Markup Language, 超文本链接标示语言)相比,关注于内容的XML具有以下诸多优点:良好的可扩展性,语言简单有效,可自行定义标记;内容与形式的分离,主要刻画数据内容,不考虑显示效果;有严格的语法要求,便于分析统一和与数据库信息转换;便于传输,为纯文本形式,可通过Http协议直接传输,可跨越防火墙;等等。XML的出现和发展对于Internet和Intranet产生了巨大的影响。