-
Java 常量值修改后不起作用
几个月之前,一位朋友很郁闷地找我,说 Java 做的网站调整了一个参数,本地测试没有问题,但是 commit 代码之后在服务器上 check out,就不起作用。 我通过 svn 看了一下两个版本的差异,发现朋友修改的是一个 static final 的变量,情况就开始明了了。检查一下,使用该常量的地方是在另一个 Java 文件的另一个类中,因为该文件没有被修改,所以没有重新编译生成新的 .class 文件。而 Java 编译器编译的时候,是直接把常量的值编译进 byte code 里的,运行时不会再有变量引用。删除这个过时的 .class 文件重新编译,一切都正常了。 Eclipse 使用的是自带的 Java 编译器,所以它编译的细节处理会跟 Sun 的(现在成 Oracle 了)有所区别。或者是因为 Eclipse 编译时是 Debug 的模式吧。 对新手来说,一不小心掉进这个陷阱,可能花好久才能挣扎出来……
-
Google TV
Google 正式推出了 Google TV 的首页,今秋发布,不知道跟 Apple TV 之间会有怎样的好戏。它提供一个开放平台,开发者可以为它开发应用。 我觉得不管这两位大佬如何,一大堆山寨 TV 肯定会如雨后春笋,在中华大地上涌现……
-
乡下经历──办理护照流程
我户口在老家,所以办护照得回老家公安局出入境管理处。回去之前我打电话询问流程,被告知户口迁回去不足十年,必须先拿着身份证户口本回去让他们发协查。 另外我身份证号码在他们系统里查不到──一年多了,每次去银行都会被盘问,然后说要上报给公安局。我们纳税完了办个必需证件还得另外交钱,闹到最后还是个假证…… 8月2日,回到老家派出所解决假证的问题,给拍了个照片,把资料传上去,县公安局马上可以查到资料了(不过到现在银行还是查不到,看来不是一个系统,同步的延迟是很大的)。再到县公安局让发协查,一个警员说早知道这样你打个电话让我们查不就行了。于是我又回北京了。 大约一周后,打北京市出入境管理处电话(他们好像有个客服系统,所以还比较容易打),过了一会回电话说协查已经回复。我就问县公安局,答复未收到,让我问保定市。当时下午4点半,我打过去,有人接起来,说已经下班了。第二天我又打保定市协查管理的电话,被告知根本没有我协查的任何记录!!于是我又告诉县公安局让他们帮忙重发协查。 对了,协查就是因为户口迁回去时间不够长,怕你在外地有什么前科或者禁止出境的情况,用传真发一个协查函到上一个户口所在地公安局,让对方协助查历史。协查的时间是10个工作日,但是不能保证。这就是信息化的程度,我就不多想了。 8-16日,接到保定电话,说要给我发函,但是没有地址怎么发啊,于是我把我当时在北京的住址告诉他,总算发出去了。 大约8-25日左右,打电话到县公安局查到协查已经回复了,终于证明我是清白的。感觉就像当年派出去当间谍被抓咬掉舌头也不招供回来后被怀疑不能说话无法辩解最后终于洗清冤屈,我泪流满面。 但是此时县出入境有个同志生孩子去了,负责管理协查的同志因为眼睛做手术不能上班,我只好继续等。 9-1日,出入境还是只有一人上班,我不能等了,回去办。花了一下午时间,把护照连同港澳通行证一起办了。 9-13日,港澳通行证到了公安局,过了几天,护照也到了。家人帮我取回,正好中秋节到了,我回家亲自把这珍贵的护照拿了回来。祖国,你不用这么挽留我,其实我也不想离开你…… 有遗漏的总结一下: 协查是查外地的历史,本地的怎么办?去派出所开个证明,说明你没有违法违纪行为,没有练过功夫,没有参加过邪教组织,历史北京清白。 申请护照虽然要你交200大洋,还是要填写“正当”原因的,要写去哪个国家,如果是商务还要公司给证明(落后地区规定,听说有的地方还要在银行存3万块钱)。不知道旅游是不是简单点。 根据身份证号在公安系统查到的信息,必须有照片,必须与户口本上的一致,这个事先最好联系户口所在地出入境管理处让他们帮忙查。 身份证跟户口本不一致没关系。比如我拿上个户口所在地签发的身份证。 办港澳通行证,会问你要哪些签注,注意划一个勾就是50或100大洋,我当时要了最多的,一年两次香港,一次澳门,一年内要是没去就浪费了。 跟我一样情况的,早点准备办护照吧,准备好一场恶仗,折腾几个月。人生苦短,多出去走走,见见世面。万一哪天要出国,再想办就来不及了。那些在大城市读大学的同学最好趁现在办个护照。 不过总是有些好的转变的,这次在县公安局出入境的警察态度就一直很好,事先没有想到。
-
《盗梦空间》与编译器
前阵子去看盗梦空间,本来我迷迷糊糊没看太明白还好,我看电影经常看不懂。但是等到结束,有观众开始鼓掌叫好,我就顿时感觉很郁闷──为啥他们看懂了我却不行! 这几天突然由这个联想到编译器。你写的代码是要生成代码的代码──code generator. 写 code generator 的时候,你不仅要考虑你的 generator 能否正常运行,更重要的任务是生成的汇编代码能否正确运行,能否正确地使用有限的寄存器,尤其是在递归调用等复杂的情形中。现在写一个复杂语言的编译器,code generator 之前更基础的 lexer/parser 也不可能手写, 所以想象一下 lexer generator/parser generator (如 lex/yacc), 也是一个重重梦境的情形。这一切对我们这些新手来说是那么不稳定和难以捉摸,有时候你都搞不清楚自己是在哪一层,就到了“游离状态”,但是对那些造梦高手,都是手到擒来的事了。 建议对编程有兴趣的人,都找个编译原理的经典书籍读一下,这非常锻炼编程方面的思维能力。我比较推荐的是龙书──编译原理、技术与工具 (Compilers: Principles, Techniques, and Tools)。我当时看的是1986年的第一版,历经20年,一些基础理论仍然没有过时,不过在06年有了第二版,现在国内有影印版可以购买。突然想起以前就写了一篇介绍的文章“Purple Dragon Book”。再次提醒,珍爱生命,远离中译本 (也许翻译得不差,但是翻译总是会有不可避免的误差),感受原著的魅力,看这些造梦高手如何将高超的技艺传授给你!
-
京东换货经历
前阵子在京东订购了一台飞利浦榨汁机,本来填好了让他们只双休日送货,因为不是公司地址。可是星期一的时候,送货的师傅给我打电话说送来了,我犹豫了一下,为了早点享受到新鲜的果汁,就奔回家来收货,并且习惯性地没有开箱就签字让师傅走人了。迫不及待地开箱要榨汁,拿出来的时候呆了──机器上面透明的硬塑料盖子破裂了,真是暴力物流啊!赶紧打电话给送货师傅,他很淡定地让我直接打客服吧。 于是我就打客服,客服帮我报了返修,我上网去查,地址还是家里的。为了让他们尽快取走,我把机子带到公司,然后打客服让帮忙改成公司地址,之后因为网上显示还是家庭住址,又打客服确认了一下。可是第二天有快递打电话给我,说要取件,在我家楼下……于是我打电话给客服。到了晚上,客服回复说没办法,只能把这个返修单子关掉重新来。 这次我自己在网上填了返修,第二天,快递来取件,第四天,收到了换回来的新榨汁机。这次我可要认真检查了,不过送货的人说我必须先在那个确认完好的单子上签字才能开箱验货,比较奇怪。整个过程在返修单的页面上都可以跟踪,每一步都会更新(见下图),让人感觉比较踏实,而且总体来说速度挺快的。此前我还很担心京东会做个鉴定,说是我弄坏的之类的,去网上搜京东换货相关的评论。客服跟我说,安排上门取件就说明肯定可以换货了,收回的货入库之后就会发新的。 有了这次教训,以后一定要先验货再放人了……不得不说京东的服务还是很不错的,这个都签字确认完好了,还真没法说是不是我在说谎呢。要是在淘宝买的东西,就真的完蛋了。网上有不少评论说京东换货效率低之类的,我觉得倒是非常高效。不过建议京东能要求快递员主动开箱验货,减少这些周折。 总之,现在可以喝上新鲜的果汁了……
-
更新了一下 Flickr Markdown (Greasemonkey)
Flickr 的新界面上线已经有一段时间了,我之前写的生成 Flickr Markdown 链接代码的 Greasemonkey 脚本已经失效,于是刚刚更新了一下。 新版的界面明显优化了很多,重点突出,尤其是分享不需要跑到一个新的页面了,就在照片页面即可获取各种尺寸的分享代码,非常之方便。我本来想给 HTML/BBCode 旁边再加一个选项的,可是不太熟悉 YUI,也不知道删掉官方的 event handler 加上自己的能不能行得通(执行先后次序问题),于是就来了个简单粗暴的,直接把 HTML 代码替换成 Markdown (想要 HTML 代码的话,只需禁用 Greasemonkey). 效果如下: 安装请到 userscripts.org (昨晚这网站挂了一会,nginx server 返回500错误): Flickr markdown code
-
JavaScript 字符串连接
记得几年前想做前端,去腾讯面试,有人问我在 JavaScript 中,大量字符串的连接应该怎么做效率最高。当时我不知道怎么回答,甚至根本没想过这个问题,对方告诉我应该用 Array 的 join 方法,这一点我一直记着。不过今天看到了这篇文章: High-performance String Concatenation in JavaScript 一开始觉得自己一直以来的认识完全被颠覆了,还在 gtalk 上找了好几个朋友问。不过看到文章后面,发现对于 IE 7 及更低的版本,array join 仍然比加号快上数百倍。 在国内,IE 6 仍然是最主流浏览器,所以……
-
百度开放平台
在百度搜一下“坦克大战”试试──第一屏右侧是推广链接,左侧是一个样式非常特殊的框,里面是搜到的一些游戏,这个框就属于所谓的“百度开放平台”,又名“框计算”。它把用户牢牢的框住,在这里点一个游戏即可在本页面玩,根本不需跑到游戏站点去了,详情、新窗口打开都仍旧是百度的页面。流量不再流向游戏网站,给游戏提供者的唯一好处就是有几处指向首页的链接。 有几个值得思考的问题,大家自己细细揣摩吧: 4399 和 7k7k 为什么愿意这么做?如果没有这个框,他们本有可能在此处占据一个好的位置,获得精准的流量 搜“北京到沈阳机票”看看,用户可以直接在一个醒目的搜索表单直接提交到各大机票预订、搜索网站。这个问题该反过来问,百度为什么愿意这么做?它显然会降低左侧“推广位”和右侧广告的 CTR 这个开放平台对百度是好事还是坏事?是远见卓识还是鼠目寸光?
-
被 Apache 的 MaxClients 困住了
今天在一个 Apache 上通过 mod_fastcgi 开了 redmine,使用的时候发现访问速度非常之慢,打开一个页面一般需要十几秒,开始以为是网速的问题,但是同一台服务器上其它的网站访问非常快。 最开始以为是 rails 或者 mysql 的性能问题,但是打开 production.log 看了一眼,发现它们加起来一般占用仅几十毫秒的时间。Firefox 状态栏一直在显示正在加载,到底在干什么?用 “tail -f” 查看 apache 的 access_log,看到每次打开一个 redmine 页面,加上图片、javascript、CSS 一共有十个左右的请求,但是它们大概分成三波,两波之间有5秒左右的间隔。这时猛然想起以前因为内存不足,在 apache 配置文件加了几个限制,直接导致这种现象的就是 MaxClients 2 当时几乎没有人访问 Apache,所以我把几个相关的数字都调得特别低,但是 redmine 这样的 rails 程序,光 prototype 带的 JavaScript 文件就一大堆,每个页面都要全部加载,即使只有一个人访问也会出现等待。这时 error_log 里应该会出现错误: [error] server reached MaxClients setting, consider raising the MaxClients setting 从这个角度看,减少每个页面包含的 JavaScript/CSS/图片文件数量也是减轻服务器压力的重要途径,毕竟降低了连接数。
-
没有干净的餐馆
餐馆的卫生是谁都避免不了的问题。在大学时代,食堂里就时常爆出饭菜里吃出老鼠、蟑螂之类的新闻,而吃到头发、钢丝球残渣之类就是家常便饭了,现在有时候午餐的盒饭里发现头发,我就把那一块挖掉接着吃,已经有一定免疫力了。随便想想就可以回忆起一些这样的事。 几年前在保福寺桥那儿的财智大厦下面一家类似呷哺呷哺的火锅店吃东西,最后还剩一片生菜,我也饱了,就夹起来端详了一下,竟然发现一条超级肥大的青虫!正因为那青虫太大,我过了几年还记得。那家店过了不久倒闭了,不过肯定不是因为卫生问题。 半年前去吃号称是“最好吃的羊蝎子”的芦月轩,没发现怎么好吃,却吃出了一根很恶心的毛发。 几个月前在武圣路的义盛和,点了一盘日本豆腐做的什么菜,一个穿西服的(估计是比普通服务员级别高一点的,大堂经理之类的吧)给端上来放桌上。其时他一手拿个汤匙,一手拿着一只笔,把笔插入了菜中。在我们惊讶的目光中,这家伙神速将笔抽回,“哎呀,幸亏没插进去!”哥们,天下武功,无坚不破,唯快不破,不过你的武功还没那么高强,虽然快了点,我还是能看得见的。后来他就说重做吧,我当时缺个心眼,让他把菜断走了。过了一会又空手跑回来在我们旁边装腔作势地拿对讲机喊:“刚才那个××豆腐重做了吗?……啊,回锅了?我不让你重做的吗?”真恶心。你要不来这一招“此地无银三百两”,我说不定还相信你是个正经人。 最近早上上班经常去公司旁边的永和大王吃早餐,开始觉得挺好的,要是住处附近有这么一个吃早餐的地方就好了。不过最近越来越觉得卫生也不怎么样。今天早上的豆浆快喝完的时候,往杯底看了一眼,发现许多褐色的渣滓粘在底部,不知道是什么东西,看来他们连杯子都不好好洗。服务员看了就把杯子扔进清洗的房间,说给我换一杯。得了,我已经恶心饱了,还喝啊。 我觉得饭菜里掉进头发还算正常些,我自己做饭有时候也会发现头发。现在的餐馆也普遍不戴头罩、口罩。但是碗筷碟子一定得洗干净,起码别有明显的脏东西。餐馆里做饭洗碗的人也是什么样的都有,我感觉大致可以分三种: 自己吃饭就比较在意卫生,并且推己及人 自己吃饭不在意卫生,并且推己及人 自己吃饭在意卫生,但是觉得不用在意别人的卫生 这些只是看见的,看不见的还多着呢。咱们还是尽量自己家里做着吃吧,起码知道里面放的是什么。另一方面,开销上也能节省点。咱是年轻白领,白得锃亮,没有灰色收入,是社会最底层。