Author: qingbo

  • Excel: 由于本机限制,该操作已被取消,请与系统管理员联系

    这几天用 Excel,发现点击里面的链接都会出来这么一个警告:“由于本机限制,该操作已被取消,请与系统管理员联系”。要是一般的链接也就算了,关键是有个 VBA 的 addon,很多功能都是用链接实现的,出现这样的错误就基本上不可用了。

    搜索中文内容好几天,没有找到正确的解决办法,最后想想这个信息在英文的系统中会是什么样,于是在 Google 上搜到了这个页面,问题终于解决了。里面的回答每个都比中文的内容靠谱。

    我最后使用的方法是,先让 Firefox 成为默认浏览器,然后再让 IE 成为默认浏览器,问题就解决了。

    两点感想:

    1. 有时候配置编译 Linux 里面的软件,觉得遇到的问题非常难以解决。可是真遇到 Windows 里的问题,解决起来更加困难,而且这些问题一般都很弱智,很不可思议,微软给出的错误信息也很没用。
    2. 中文的内容太差了,且抄袭严重,抄袭时不加验证。
  • Windows 7 还挺不错的

    刚装了一个试用了一下,没有感觉到像 Vista 那么难用。微软总算重新站稳了脚跟,据说 Windows 7 的市场占有率已经是 Linux 的两倍,看来 Windows 依旧是桌面操作系统的统治者。

    任务栏吸取了 Mac OS 的精华,做得像模像样,不需要再像以前那样翻来翻去找不到窗口了。不过同一程序有多个窗口时,点击任务栏图标不能使该组窗口获得焦点,仍需选择某一个窗口,我觉得这一点做得不太合适,不知道其他用户是怎么想的。

    用户的主目录路径成了 C:\Users\username,这一点可以说也是 Unix 系统的经验,终于不再是繁琐的 Documents and Settings 了。Library 的概念也很不错,此外也应该还有很多我没有发现的优点,比如计算器稍微改进了一点。

    现在有了个专门的“截图工具”,比 PrintScreen 稍微强了一点点,不过仍然没有随意调整截屏选区的功能。这应该是微软怕 SnagIt 之流没饭吃吧?呵呵。这样应该围绕这个操作系统会有一个更好的生态系统,反观国内的 51、校内,这一点上就做得太不厚道了。

  • https 页面的 Ajax

    前阵子在一个大项目中做了一个小的 tool,在本机上测试完成之后,放到 production 环境中去,却发现页面上的 Ajax 功能不能使用。

    在 Firebug 的帮助下,很快就想到可能是因为 production 环境使用了 https,由于浏览器的安全限制,页面不允许随便请求 http 的页面。Ajax 请求的 url 其实就是本机的一个页面,不过因为 url 中没有写 protocol 以及 hostname,浏览器就默认是 http 了。

    我解决的办法是用 JavaScript 生成完整的 url,然后再发送请求。我测试的环境是 Firefox,不知道其它浏览器中有没有同样的问题。

  • 酒香不怕巷子深

    今天晚上跟同事们一起看电影 “UP”,挺不错,就是没吃饭,有点饿。不过电影看完的时候,又没有食欲。一个同事说想吃桂林米粉,于是就跟着一起去了。

    初到那里,看到招牌挺不起眼的,在周围繁华街景的映衬下显得格格不入。不过进去之后就感觉舒服一些了,虽然里面的布局、通向二楼的窄小楼梯让人回想起大学时代校门口的小餐馆,但是相比之下干净多了。跟风点了个酸辣笋尖米粉,先来了两碗都让给同事了,不过我在旁边看得很想吃。终于等到之后,吃起来感觉还真的挺不错,汤稍微有点辣味,但是喝下去很舒服。

    最近经常是在外面吃,还好久没遇见这样吃着好吃,吃完了也舒服的东西了。于是就上点评网写了条好评……在这里。所谓酒香不怕巷子深,这么小的店都让我给找到了——一方面也说明点评网的设计比较合理,我搜索“桂林米粉”然后按地域筛选,很快就找到它了。

    人写点评,一般是感觉特别好,就像我今天这样的,或者是感觉特别烂,比如我前一段时间在住处旁边吃那个田园鸡火锅。这是我目前在点评网贡献的仅有的两条点评……一个指标特别好的话,会不自觉地其它方面的分数;某个指标特别差的话,自然地其它的印象也好不到哪儿去。有了这样强烈的感受,分享的欲望就随之很强烈,非常希望让别人也知道这里很好或者很差,让别人赶紧来或者千万不要来。

  • AdWords API – 拯救错误很重要

    对于类似当当、京东、新蛋这样拥有海量商品目录的商家来说,全靠手工去找出针对每种商品的关键词然后上传到 Google AdWords 账户,恐怕不是特别可行。AdWords Editor 是非常优秀的软件,然而它的 scalability 有限,假设有上千万级别的关键词,即使 Adwords Editor 恐怕也无能为力。

    AdWords API 对于这样的情景再适合不过了。利用 API 可以将海量的关键词自动地上传到 AdWords,更能方便地将它们在 Google 的花费、表现跟自己的商品数据库对接,实现投入产出比的及时计算,对市场的变化作出快速反应,从线上广告的角度让利益最大化。对于如此大量的数据,仍然可以在很细的粒度上对广告做优化。

    听起来很美好,可是实际做的话,就会发现一些让我们很烦恼的问题。Google 的系统足够稳定,非常值得信赖,我们的代码也很容易写得完全正确——AdWords 的 SOAP API 很简单,照着 Google 给的例子写就可以了吧。但是,网络却不是那么稳定,即使传输是基于具有纠错能力的 TCP,只要网线一拔,再强的纠错、重传也是白搭。所以光看 Google 的例子不行,程序需要更强的生命力。

    记录足够的日志

    不管你的程序多么 robust,遇到断电也得歇菜(除非你有昂贵的保障系统保证这个概率极低),所以至少你得知道它死在什么地方了,这时 log 是必不可少的。

    此外,大批量的操作中必然会遇到一些错误,但又不必因为这些错误让任务就此停止,这样的错误就应该记录在日志中,等上传结束后供认核查。

    check before add

    这是 Google 的建议。广告创意上传之前要 check 一下,关键词也要。看到有问题的就删掉(或者加个解释传上去),然后再上传。应用了这个机制,即使你不小心尝试上传重复的关键词,也不会导致错误。

    尽量恢复错误

    最常见的问题出在网络连接上。TCP 再可靠,也终有它失败的时候。即使网线没被拔掉,在数百万的请求中,有那么一小撮出问题是很正常的。按照 Google 的例子,遇到任何异常都会退出。当你第二天早上兴致勃勃去查看昨晚开始的一个上传任务时,发现它实际上没上传几个就遇到异常退出了,可想而知会多么沮丧……

    认清这一点,我们搬过来 Google 的示例程序之后,就应该改造一下 Google 的例子。每个 SOAP 请求都可能出现连接问题导致的异常,你需要捕捉它们。一旦发现网络连接方面的一场,就让程序休息一小会再重试——简单的粗暴的方法是将执行 SOAP 请求的代码包装在一个 infinite loop 里 (例如 while true)。

    例如这个讨论:ssl broken pipe | connection reset by peer. 这个问题应该很多人都会遇到,AdWords 官方也给了不少答复,但是始终没有清晰的答案。我个人认为这大概跟 AdWords API 的实现没太大的关系,用上面的方法即可解决。

    跳过不可恢复的错误

    少数情况下,上面提到的网络异常会导致另一种情形,重试是没有意义的。即 Google 的服务器收到了你的请求(如添加了一个 ad group)并且正确处理,但是你却没有得到 Google 的 response,即无法得到该 ad group 的 id。重试的话,Google 会告诉你,名字重了。如果我们的程序够细致,这时就该跳过这个 ad group 了,如果是简单粗暴地捕捉到一切异常都重试并且是无限循环,那程序就死在这儿,并且不停的消耗 API units. 如果懒得做那么精细(不要把过多精力浪费在小概率事件上),稍微文雅一点,可以换成有限次数的循环,在 ruby 里可以:

    [code lang=’ruby’]
    10.times do

    end
    [/code]

    当然跳过的话一定要记录在 log 里。

    对于一批数十万的关键词,远渡重洋到达 Google 的服务器至少需要许多个小时甚至许多天(无数次 HTTP 请求),在这段时间内,断电、断网的几率都是有的,我前阵子比较倒霉,都遇到了。后来学精了,遇到大批量操作都事先跟相关人员确认一下电力供应和网络状况,可是仍免不了大楼网络被攻击之类的事情发生。有一次甚至是一位同事好心帮我“开机”,把正在运行任务的服务器给关了……

    做这种事本来就是压力很大的,一不小心银子就像流水一样白白花出去了,比如你买对了关键词,指错了链接 🙂 在压力很大的情况下又要面对许多的不确定因素,就更加刺激,更有挑战性了。

  • 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 的兄弟们,有点技术含量好吧……

  • 还是 ubuntu 省事

    上周在一台联想的新机器上安装 Linux,最初是用一张自定义的 CentOS 5.2 netinstall disc,结果每次 usb-driver 加载结束的时候,都出来一屏乱码然后就没动静了,此时仅仅加载了内核,什么信息都没法看。于是我猜想是不是联想的隐藏分区在作怪,可是删除了之后依旧是一样的问题。不过使用另一张 redhat installation DVD 却可以正常地安装,安装结束后,终于知道了那屏乱码是啥原因——内核 too old, 不支持这个网卡。最终,安装了内核地 headers,然后在 Intel 网站上下载了驱动的源代码,终于编译出来这个 driver,可以上网了。不过后来欲安装图形界面的时候,又发现它完全不支持附带的 21′ LCD.

    安装图形界面主要是想解决在该 server 上登录某 VPN 网络的问题。后来发现该 VPN server 提供了针对 debian 系列的 deb package 供安装,于是试试 Ubuntu,开始拿了一张 8.10 的盘,live cd 测试发现对屏幕的默认支持不太好,于是下载 9.04 刻录了一张,安装完成后,非常完美,VPN 果然可用,我只需静下心来配置我的服务器软件了。

    Linux 的桌面,折腾好了可以爽一爽,但是折腾不好的话,会让你很郁闷,还是找个省事的好,呵呵。

  • vim 为啥把人吓跑

    在 unix 环境工作难免要碰到 vim. 我倒也经常用 vim 做一些简单的编辑,但是似乎没怎么写过大段的代码。今天有人想用它来写 ruby 的时候,我帮忙去找 ruby 相关的配置,很快发现 vim 本身就带了丰富的完善的 ruby 配置,只是默认没有 enable.

    在几个 mac, linux 的系统中,我发现情况都是这样,可能是 vim 为了性能考虑?vim 安装时就带了许多的语法高亮、缩进等定义,分布在安装目录下的 plugin, indent 等目录中。只需要在你的 .vimrc 文件中加上这么一行:

    filetype plugin indent on

    vim 在打开文件中就会根据文件类型选择不同的缩进方式。试了一下 ruby 的缩进,非常棒。好像很多用户想用 vim 编辑某种语言程序时,都会在网上到处搜该语言的配置文件,拿到一个就 paste 到自己的 .vimrc 中试试,结果折腾半天也不好,遂放弃。

    刚刚在 Google Reader 里看到一篇旧文,说 vim 的配置使用自己特定的语法是个硬伤,确实。上面简单的一个命令,如果没有看过一些 vim 的文档,谁也看不出它会起什么作用。许多人尝试 vim 好多次,好多次被吓跑。第一次可能是因为它的 mode 的概念,进去都不知道怎么编辑。第二次可能就是因为不会配置—— vim 的强大就在于它的可定制性,不会定制,就不能用了。

    最后再补上几个 .vimrc 中必备的命令:
    set nocompatible
    syntax on

    还有特别为某种文件类型指定 tab 以及缩进的配置,比如 ruby 的风格:
    au FileType ruby setlocal expandtab
    au FileType ruby setlocal tabstop=2 shiftwidth=2 softtabstop=2
    au FileType ruby setlocal cindent
    au FileType ruby setlocal smartindent
    au FileType ruby setlocal autoindent

    老实说,我也是个菜鸟,不过感觉上面这些东西对新手就够了。

  • 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年才出来。看到定价请不要害怕,国内已经有影印版。

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

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