Category: 未分类

  • 四号线不到北京西站……

    国庆回家,我一个朋友帮买的9月30号晚上的火车票,我们分头往西站走。

    当时风声比较紧,天天超载去西站的一辆公交车也不敢跑了。不过天无绝人之路,四号线不是开通了么,正好也让我沐浴一下春风,分享改革开放三十年伟大成就,于是我计划先乘十号线,再换四号线到达西站。

    四号线的地图给我的感觉,下面向东突出的部分就是北京西站,我也从来没有仔细辨认过那个字。之前坐火车去广东,跟旁边的人聊天,还说四号线就是通北京西站,他们还附和说是呢,后来看都是托……

    我悠哉游哉上了四号线,感觉挺不错,就是那么凉快的天,空调温度还开那么低,我冷倒也罢了,社会主义也禁不住你这么糟蹋啊。有点奇怪国庆前夕去西站的人怎么那么少,不过别想太多了,有座位真好。朋友打电话过来说你还有心情绕北京转圈啊,我不急,地铁又不堵车。

    到了“北京×站”,我一下车,经过那个大柱子之后,又忍不住退回来,因为感觉柱子上的站名写错了。四处张望一番,发现到处写的都是“北京南站”,我一下懵了,一边往站外跑一边给朋友打电话——如果我为祖国牺牲了,你就一个人回家吧。此时距列车发车还有半小时,我也不清楚南站离西站到底有多远。骑三轮车的看我着急,说送到西站40块,真黑,我心里想,车票才二十几块,大不了明天再买一张,也不助长不正之风!这时开过来一出租车,司机师傅想进南站接个叫车的人,绕了好几圈都没找到进去的办法,正好拉着我一路顺风到了西站,我又一路狂奔拒绝出示身份证终于赶上了火车。

    一个半小时后到达保定,住了一夜,第二天一早吃了一个半驴肉火烧,赶到人山人海的汽车站,设法挤上汽车,被超载和破烂不堪的公路折磨到家。

    回到北京后上网看,果然又很多人认为四号线是通北京西站的……

  • Windows 7 截图工具快捷键

    Windows 7 新的一个小工具程序是截图工具,虽然还是比较鸡肋,但终归可以自选区域了。

    不过有些时候,用它来截图的话,切换到截图工具的窗口,要截图的东西却已经没了,比如说上篇文章里的百度输入框自动提示。

    这时候有个快捷键就解决问题了。我看到网上好多人在问截图工具的快捷键是什么,似乎大家都觉得 Windows 的帮助文档很没用。我在帮助里很快查到了 Ctrl+PrtScn,试了一下,果然可以。

  • Linux date 命令获取某日期的前一天

    最近需要写个 shell script,给定一个日期参数,它要得到该日期的前一天,然后做剩下的事。执行的时候就是这样:

    [code lang=’text’]
    # ./foo.sh 2009-03-01
    [/code]

    初看,这个问题有些棘手。最原始的办法是写个比较繁琐的函数,知道每个月分别是多少天,还要处理一下闰年的情况——这也有点太繁琐了,呵呵。

    稍微看一下 date 命令,就发现利用它可以很方便的写出一个非常 stable 的函数。date 可以通过 -d 指定一个日期,然后用指定的格式输出。-d 不仅可以接受 “2009-03-01″ 或者 yesterday 这样的格式,还可以接受一个从 1970 年开始至今的秒数,当然也可以指定日期输出这样的秒数。如:

    [code lang=’text’]
    # date +%s
    1252591191
    # date -d @1252591191 +%F
    2009-09-10
    [/code]

    这样,事情就变得很简单了。先用 date 命令将该日期转换成秒数,减去一天的秒数 86400,然后再转化成正常易读的日期格式,就可以了,不需要考虑复杂的大小月以及闰年问题。以下是简单的例子:

    [code lang=’bash’]
    #!/bin/sh

    function get_day_before {
    seconds=`date -d $1 +%s`
    seconds_yesterday=$((seconds – 86400))
    day_before=`date -d @$seconds_yesterday +%F`
    echo $day_before
    }

    get_day_before $1
    [/code]

    最后,必须支持一下这个 World Calendar。它非常有规律,非常容易记忆,季度、月份、星期完美地吻合在一起。

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