AdWords - java.lang.RuntimeException: Abstract keyValue without superclass

在 AdWords API 的开发中遇到这样的 Exception,总是让人感到很迷惑——Google 为什么把它的服务器内部错误直接给我们看呢?按理说应该告诉我们到底我们的输入数据错在哪里……

今天在调用 updateCriteria 的时候又遇见了这个错误,经过一番搜索之后,在这里找到了答案:

http://groups.google.co.uk/group/adwords-api/msg/3a311805b76e37f4

哦,原来是因为我没有加 “criterionType” 这个属性。Criterion 有两个 subclass —— Keyword 和 Website,没有 criterionType 的话,Google 就不知道我们要操作的是哪一种类型了。

关键是 adwords4r 的 examples 太少,没有覆盖 API 的全部,在调用 addCriteria 的时候,很自然地把例子里地代码复制过来改改就好了,但是 updateCriteria 的时候,就没有例子可供参考了。而 Google 给的文档中,并没有将 criterionType 列在 “Required fields” 之中(大概该文档倾向于给使用 Java client 的人看吧)。

另外,我觉得在添加关键词的时候指定 criterionType 是合理的,但是在 update 的时候,Google 根据我们提供的 id 和 adGroupId,已经完全可以确定该 criterion 的 type 了,为什么还要我们来指定呢?

无所谓,既然是这个导致的问题,我们就注意一下,加上这个属性吧……

SEO 的技术含量

现在几乎是个人都知道 SEO 这个词,尽管可能这些人中有的连这三个字母分别代表什么都不知道。那些给企业做垃圾网站的公司旗号中肯定包含一条 SEO,而很多传统企业的老总也慢慢地知道 SEO 这玩意对它们很有用。在办公楼的楼道里经过,也时不时听到有人在讨论 SEO – “哎呀,SEO 上不去,怎么整啊……” 曾经见过一张名片,title 是“智者”,自称是互联网、航空航天、SEO 的专家。

在这样的环境下,我就得到一种印象,SEO 大概是互联网上最没有技术含量的东西了,打着 SEO 旗号的,全都是骗钱的。尤其是那些根本不懂互联网的人,还沾沾自喜地提一下 SEO 以炫耀自己对互联网地独到理解,真是让人反胃。

直到最近我才发现 SEO 原来可以很有技术含量 —— 不过上述地那些人做的事除外。搜索引擎技术是很复杂的技术,非常有技术含量,因此针对搜索引擎所做的 SEO,自然也应该有一定技术含量。最早期最弱智的 SEO 方法如关键字堆砌、隐藏字符等等,现在应该已经被认为是垃圾技术,当然了,国内大部分 SEO 高手还在使用。

SEO 应该从全局考虑,最好地引导搜索引擎(最终是引导执行搜索的用户)找到你网站上他们想要的最合适的内容,给搜索的各方带来最高的效益。最初级的做法就是想尽一切办法不惜作弊来提高排名、吸引流量。但是用户到了网站上大多数情况下都会觉得内容很不相符,很快跑掉。这种方法仅对色情网站有效。流量来了只是第一步,转化率才是重点。

还有个简单的例子,一个网站的首页可能有了很高的排名(或许比如 Page rank 非常高),而内页对于搜索引擎来说权重比较低,于是用户搜索很多关键词,网站的首页都排在前面,真正跟这个关键词更相符的页面可能出不来,这也是失败。如何在网站的众多页面中合理分布权重,让最相符的内容排在第一位,这也是重点。

搜索引擎肯定会越来越聪明,产品本身还是最重要的,SEO 只是起个辅助、指导的作用。做 SEO 的兄弟们,有点技术含量好吧……

兔死狐悲

当 twitter 火起来的时候,国内的创业者们争相模仿。今年,twitter 的影响力越来越大,twitter 的克隆者们似乎又觉得更大的机遇来了,于是有新的竞争者加入克隆的行列,老的也纷纷重整旗鼓,准备大干一场。

然而机遇中却暗藏着灾难的诱因,尤其在这样的多事之秋,最终饭否成了出头鸟。

众多的 twitter 们肯定没有一家庆幸竞争者的倒下,而是兔死狐悲的感受。这年头,事情做不大就没前途,做大了又不行。不过有些例外,像校内网、开心网这些专门让无聊的人更无聊,让愚蠢的人更愚蠢的,恰是被 Big brother 所喜欢,尽管有时候会冒出一点事端,只要它们主动地自宫一下就没事了。

鸡被杀了,猴子们怎么办啊……

Purple Dragon Book!

计算机系的同学一定听说过“龙书”吧?编译原理的经典之作 – Compilers: Principles, Techniques, and Tools. 很幸运,我们当时的课本就是它。

刚才和同学聊到编译原理的好书还有“虎书”和“鲸书”时,他提醒我龙书已经出来第二版了 – Compilers: Principles, Techniques, and Tools (2nd Edition),让我比较吃惊。2006年出的,那时已经毕业了。做毕业设计的时候,老师就提到后来发展的许多新技术,龙书中都是看不到的,让我看虎书。现在应该好了:

Every chapter has been completely revised to reflect developments in software engineering, programming languages, and computer architecture that have occurred since 1986, when the last edition published.

关于“龙书”,这里有一个词条,原来之前还有一本绿龙书,出版于1977年。不到10年,红龙书出来了,而现在的紫龙书时隔20年才出来。看到定价请不要害怕,国内已经有影印版。

看这本书以及另一本讲计算机体系结构的书的时候,给我印象最深的是,这些作者可以把如此深奥、晦涩、难懂的知识这么流畅地传授给你,让你感受不到门槛。他们不仅是科学家,还是教育家,他们写书的时候不仅要自己懂,而且要考虑如何让读者懂。而国内的作者们,肚子里本来就没东西的就不用说了,有些学术水平比较牛,写出的书看起来却不相称,许多感觉是在给自己打草稿。

另外提醒大家,千万不要看那些糟蹋原著的中文译本。与其花时间在猜测那些蹩脚甚至错误的翻译文字上,不如花点时间学好英文,去看原著。

Twitter

最近忙起来了,想想以前自己天天盯着 twitter 玩,真是太无聊了。看看现在 twitter 上依旧活跃的好友们,他们也一定比较无聊。Twitter 就是一个无聊的人聚集的地方,要说 twitter 已经形成了它的 ecosystem,那它完全以这些无聊的人为基础,他们是最终的消费者。

无聊的人在 twitter 上表现着动物最无法改变的本性,炫耀。就像公鸡炫耀打鸣的响亮,公狗拼命抬高腿撒尿一样。甚至把无聊当作一种资本来炫耀——比如我在 twitter 上最近的几个 status. 说得太过激了,哈哈。

这几天脑子里有时候还会不时蹦出一两句想在 twitter 上闲扯的话,不过又懒得上去发了。做点正事吧,何必那么无聊。

使用英文版本网站的好处

前几天,Charles 抱怨 subversion 的客户端版本不兼容问题搞得他很烦。因为 TortoiseSVN 的最新版本在 working copy 中记录的是 1.6 的 svn client metadata 格式,而 NetBeans 使用的是他自己安装的 CollabNet 版本的 1.5.6,因此用 TortoiseSVN 更新了一下 working copy,NetBeans 就无法操作了。

Charles 坚持他在 collab.net 上看到的最新版本就是 1.5.6,然而我去看的时候,明明是已经有 1.6 版本的。我没太注意过 subversion 跟 CollabNet 到底是啥关系,反正是非常非常紧密的关系,不可能 svn 出了1.6 而 CollabNet 没有对应版本的(CollabNet 应该是主导作用的,它网站上下载的版本按理说应该是完全一样,虽然我从来没用过它的版本)。一番思考之后,Charles 终于发现了原因——他被重定向到了中文站,哈哈。

这个故事告诉我们,有英文站尽量用英文站,不要图省事用中文版本,除去读到错误翻译的风险,你还有可能因为翻译的延迟而误事。Google 的产品也是一样,新特性都最先在英文版里尝试。

Charles 说使用中文被 Collab 鄙视了,我又想到了 skype,中国人被鄙视得更加彻底,访问 skype.com 直接被重定向到 tom.com(肯定是根据 IP 判断地理位置),然后给你个贴了小广告的版本。去广告的最简单办法是访问 http://www.skype.com/intl/en/

学好英文吧!多一种语言,多好多机会!

Google 搜索对语言的理解

前几天我 Google 了一下 “at&t 语音合成”,惊奇地发现 AT&T Labs Text-to-Speech: Demo 的页面竟然排在第一位,而这个页面上没有任何中文字符,显然,Google 知道我想找的语音合成就是 TTS.

不禁让人感叹其强大。要是说难度,倒是也不大,只需要用它自家的 translator 翻译一下即可,甚至更简单的,后台准备一个匹配表。

不过简单归简单,做到这一点还是要花不少力量的。我本来应该输入英文查找的,不过现在输入了中文就直接找到了我需要的页面,很舒服。

不过今天回家再搜这个关键字,AT&T的页面已经排到第二位了。

从踢到挨踢

新闻:

四川足球新星身价太高无人问津 21岁无奈退役转行IT

从踢到挨踢的转变,对他来说应该是一个很大的挑战。

不过还好,他还年轻,挨踢多了,还可以通过踢来发泄……我一个朋友就说,IT 民工还是有很多人把踢作为生活中发泄的方式的。

设想一下网络身份的高效管理及利用

使用网络服务的目的,应该是利用它们高效、及时地交流有用的信息,获取和分享知识,能够结交到志同道合的朋友也是非常好的事情。

前阵子有不少朋友加了我 Gtalk. 最近我也在不断地通过 Google reader 中朋友们的分享扩大自己订阅的范围,新加了不少优秀 blogger 的 RSS. 很多人会在 blog 上留下自己的 twitter 帐号,我如果发现有价值就会 follow. 另外 Fenng 当前正在进行他的每日推荐一位推友计划,也让我收获不少。

问题

现在一个比较烦恼的问题是,这些人在不同的网站有不同的身份,没有一种机制很好很方便地将它们关联起来。举个不太恰当的例子,Fenng 的 blog 叫做 “DBA notes“,而 twitter 账户名就是 Fenng. 当然了,Fenng 的名气比较大,一般不会搞混的,并且 blog 的 RSS 输出中也包含了作者名,所以说举这个例子不是太恰当。对于普通人,可能就很难讲两个账户关联起来。有时候在 twitter 上看到一条引人注目的 tweet,都想不起来这是谁,还得到他的 twitter 主页去看,如果上面有 blog 链接还好。有时候某人接连几个月没有更新 blog,猛然更新一下,在 Google reader 里是很陌生的感觉,假如 blog 里没有个 about 页面,说不定还真想不起来这是谁。对了,我也希望把 Flickr 的账户也关联一下。

我虽然关注 web 发展比较多,但是真正在使用的服务还是很少的,现阶段主要也就是 Gtalk, Google reader, twitter. 那些重度 SNS 用户,可能同时在使用的还有 Facebook, LinkedIn… 一大堆,我就懒得列出来了,对于这些人来说,这么多种服务上的朋友们肯定重叠的几率特别大,但是到底有几个朋友的行踪是自己熟悉的呢?twitter 上有位朋友发了一句话,我希望能够以最快的方式知道他是谁,我以前对他的看法,他还在网络上其它什么地方发布有价值的信息。

friendfeed 我用得不多,但是感觉它不能解决我的问题,我似乎没有选择的余地,要么订阅他的全部,要么什么都不要。目前我在 Gmail contacts 里整理了一些联系人,有的怕忘记,在 notes 字段里写一段描述。仅此,并不是很方便,我几个月可能用到一次。

设想

最近似乎老是听到有人谈 “CRM”,地铁里也时不时有哥们聊这个。我就很惭愧了,我知道它的字面意思,却不知道自己对它的理解在什么程度。这里我就以自己粗浅的理解来类比一下。商家需要管理客户的信息,要知道客户什么时候在自己这里消费,抛开隐私问题不谈,他们甚至想知道你在别的地方消费了什么,每天都在干嘛,从而提供更好的服务(也就是诱导再次消费,获取更多利润)。在线下交友的时代,朋友关系用脑子管理就行了。我知道邻居或者同事张三在哪儿工作,闲暇时间喜欢干嘛,过些天要到哪儿去旅游。然而通过网络结交的朋友(或者是关注的人,可能这一类更多),动辄数十上百,大脑就不够用了。于是我们是不是也应该模仿 CRM,来个网络关系管理呢?因为面对的就是网络,没有线下的流程,肯定会比 CRM 更流畅、更方便。

其基础肯定是一个类似 Gmail contacts 的东西,传统的地址、电话号码也很重要。在这里应该可以给每个联系人关联其 Email, twitter, blog, facebook 等任意账户(链接),可以加自己的备注(以评论的方式最好,一条一条分开)。如果仅仅做到这一步,简直是太容易了,Gmail contacts 差不多已经是这样了。不知道是不是已经有这样的专门产品,我就懒得去找了。

最关键的,是怎么让用户为这些朋友定义好的账户关联实时地发挥作用。我能想到的一些情景:

  • 查看邮件时,界面右侧可以显示发件人最近的 blog 更新、最新的 tweet
  • 在 Gtalk gadget 中聊天,可以显示为对方关联的信息
  • 查看某 twitter 用户首页,可以显示为对方关联的信息。甚至可以将 twitter 网站上的所有头像改造成 flickr 那样,悬浮并点击时获取数据。
  • 在 Google Reader 中阅读时,可以根据地址栏中的 feed url 获取关联的信息
  • Facebook, flickr, 只要是浏览器中可以访问的个性化服务,都可以加上上述的功能

具体的实现方式呢,可以视情况而定。比如界面比较空闲的,可以直接显示一些详细信息(blog post, tweet, photos…)。像 Google Reader 这种满屏都是内容还嫌地方小,就应该找个地方显示一个小图标,点击之后再显示详细信息,具体显示什么,用户都可以定制。

只要提供了 API,这些都不是难事。Greasemonkey 或者 Firefox addon 都可以比较方便的实现这些功能。

也许现在已经有这样的产品,只是我太闭塞了没有发现?呵呵,如果没有的话,建议有空的人能够实现类似的东西。我的想法比较杂乱,不过也许将来我会整理一下思路,自己做这么个东西……

在虚拟的网络中把握住现实的东西,才不会迷失自己。

如何知道 receiver 何时读取邮件?

今天收到一封邮件,该 sender 每封邮件都要求回执,让人很是厌烦,我依旧习惯性地选择“否”。正好无聊,就想,能否在对方不知情的情况下知道他何时读取了我发给他的邮件呢?

想到的一个办法是,在邮件中插入一个长宽都是 1px 的透明图片,例如:

[code lang="html"][/code]

当用户的 mail client 试图显示这张图片的时候,my.host.com 上的这个 get_dummy.php 就可以记录下用户的 IP 地址以及图片显示的时间,这是关键。然后就可以 302 redirect 到真正的图片。

假如每个 mail client 都无条件地显示图片,那么这个阴谋就得逞了。我甚至想到可以做一个服务,在我这里填写你的邮件地址,获取一个图片代码。当该图片被请求时,我会发邮件给你,告诉你请求该图片的 IP 以及时间。这样,把这个图片代码嵌入你发给别人的邮件中,你就知道他什么时候看到邮件的了。我还想到邮件服务商本身提供这样的服务是最具有优势的……

不过这只是个想法,很不现实:

  • 有些 mail client 不支持 HTML 格式
  • 别的我不了解,Gmail 默认是不显示邮件中的图片的
  • It’s evil!!