Bye Bye 2010

广播里有人说,趁着2010还在,想想还有神马要和他说的,抓紧啦。于是想了想,嗯,还是写点总结吧。

  1. 告别老东家,投奔豆瓣,同时也有了一把layoff的体验,从此步入职场经验丰富人员行列。
  2. 告别纸上谈兵,迎接各种大规模应用,于是虽然发现///的Plex和汇编磨练没什么意义,但思路上还是可以借鉴的。
  3. 告别无序,学习gtd,emacs+org+remeber的组合还是挺高效的。
  4. 告别大E,艰难入手小4,和黄牛斗争的路还很漫长啊……
  5. 告别FMA,没什么后继者,在空守的时候,总是觉得,自己是不是已经老了……

另外,人生大事的仪式终于是完成了,于是不论从法律上还是传统上,可以光荣作为已婚人士迎接11年了。

总结最后一般还是要写一下新年希望的,于是我看了看去年的,很悲催的发现,上年的期望还是没有实现,为什么时间过得那么快呢…… 所以继续copy去年的愿景,但是这回是必须要做到的!

解决Xcode莫名崩溃的问题

前面的一篇博文里面我提到了我的Xcode每次开启必然会报错崩溃的问题。报错信息如下:

Uncaught Exception:
  -[NSCFArray length]: unrecognized selector sent to instance 0x2006354a0

这事在网上寻觅许久未果,本来就想算了的。突然最近有同事发现Mail也会这样莫名其妙的崩溃,在多方尝试下,发现只要关掉公司的vpn就没事了,进而又发现只要不使用vpn推送的DNS信息就可以了。于是自然就想到难道这就是导致我的Xcode罪魁祸首,一试,果然如此,我勒个去 = =

员外前阵子发了一个关于Snow Leopard诡异的DNS问题的文章,里面也提到了这个问题,所以这是雪豹自己的bug。可是,DNS服务是必须要用的,如果自己加Hosts,必然会有更新不及时的情况,那怎么办呢? 所以在关闭DNS推送后,还需要做点手脚才行。

Magic是由resolver来完成的,具体使用可以参考man 5 resolver。这儿就只说应用了。

# /etc/resolver/x.com
nameserver 10.10.10.10
nameserver 8.8.8.8

这样就为x.com的子域指定了使用这两个DNS来解析。嗯,尝试的顺序是从上往下的,最多支持3个DNS,如果有不连接VPN的时候,别忘了在DNS最后加上一个公网可用的DNS,免得在这种情况下不能访问。

OK,如此手术一番,Xcode终于活了。

做了个豆瓣RT的油猴脚本

友问有没有什么插件能够快速转发广播里的“我说”,我想,这个用油猴是最简单的了,于是顺手写了一个,需要的童鞋自取吧。

由于不知为啥油猴的require标记无效,所以还是用了网上找的在油猴中使用jQuery的办法,土就土点吧,反正能用了。

现在只在首页及下面的分页有效,有其他需求的,比如到某人的miniblog页面下去RT暂时就不做了,取id忒麻烦……

// ==UserScript==
// @name           douban rt
// @namespace      www.douban.com
// @include        http://www.douban.com/
// @include        http://www.douban.com/?*
// ==/UserScript==

// Add jQuery
(function(){
    if (typeof unsafeWindow.jQuery == 'undefined') {
        var GM_Head = document.getElementsByTagName('head')[0] || document.documentElement,
            GM_JQ = document.createElement('script');

        GM_JQ.src = 'http://img3.douban.com/js/packed_jquery.min1.js';
        GM_JQ.type = 'text/javascript';
        GM_JQ.async = true;

        GM_Head.insertBefore(GM_JQ, GM_Head.firstChild);
    }
    GM_wait();
})();

// Check if jQuery's loaded
function GM_wait() {
    if (typeof unsafeWindow.jQuery == 'undefined') {
        window.setTimeout(GM_wait, 100);
    } else {
        letsJQuery(unsafeWindow.jQuery);
    }
}

// All your GM code must be inside this function
function letsJQuery($) {
    $(function(){
        $.grep($(".mbtr"), function(e, i){
            if ($(e).find("span.pl").text().lastIndexOf("说:") > 0) {
                $(e).find(".quote").append('<a href="##" class="j_dbrt">RT</a>');
            }
        })});
    $(".j_dbrt").live("click", function(){
        $($("#db-talk").find("textarea").focus()[0]).val($(this).parent().parent().text().replace(/ [^ ]*\s+RT$/, ''));
        return false;
    });
}

Updated 上传到userscripts了,有兴趣的去安装吧 http://j-lite.net/r/douban_rt

一点福利

于一个月的时间都没有更新blog,给订阅我这个闲话小博的童鞋们来点福利,内容是apple最近发布的iLife 11。总共是2.9G,分5个卷,带多国语言支持,有兴趣的童鞋可以去下了,但就我用下来的感觉是,变化不大…… 当然我是个只用iPhoto放幻灯片的主 = =|||

  Part1
  Part2
  Part3
  Part4
  Part5

折腾的十月份

吧,眼睛一眨,十月份居然就已经过去了…… 然后我居然没有写一篇博,对此我感到相当震精。所以赶紧写个月记一则,动动筋骨。

这是个瞎折腾的一个月,各种各样的事情压在身上,发现面对高压,我已然不知所措了。遂决定需要好好的管理一下自己的时间了,终于也就捧起了一直说要看的gtd。作为emacs党,自然会想到使用emacs来完成这件神圣而艰巨的使命。使用23.2自带的org-mode和remember-mode配合,基本上能够满足我所需要的所有gtd的功能。不过发现对于我这样长时间盯着电脑专注于做寥寥的几件事的人来说,gtd的分类基本属于不可用,但聊胜于无,反正C-c C-c用起来还是挺顺畅的,而且加了tag的规整的org文件会让人不由的产生一种自我很专业的感觉 XD。 这段时间按照gtd的路子走下来,还确实是有点效果,各位觉得个人时间管理有点这样那样的问题的话,可以考虑试一下。

国庆回了一趟上海,呆了2天,为了看世博。去了我才知道这不愧是中国的SB会,人山人海的,一共看了3个馆,好看程度依次是中国馆 > 日本馆 > 德国馆。由于SB的原因,在那小月月来沪的日子里居然没有去外滩与其照会一下实在是让我感到遗憾哪。

月中去了一趟金山岭长城,当我阔别20余年再次踏在这古代奇迹上,我为我新买就被各种悲剧划伤的球鞋表示无比的悲痛。总的来说,景还是不错的,要险有险,要景有景,人也不多,不似SB会。可惜去的早了些,红叶率还不算太高,不过也算是赏过红叶了。话说从我来北京我就听说了这么一个传说,相传情侣一起爬过香山后,十有九分,所以我是一直没去过香山的,也没看过红叶,这次也算是补全了吧。

10月最后悔的事就是没有在iPhone4大陆刚上市时就去店里排队了。结果整个十月的空闲时光便都耗在了刷iPhone4的预定名额和辱骂黄牛这两件毫无意义的事情上了。结果到最后也没刷上,直到最近apple在线商店第二轮出货才终于给订上,换个手机还真是艰难啊。另外,突然发现我也不知不觉成为了苹果的拥笃了,入了不少apple的玩意儿,其中键盘就入了三(G5一个,G6两个……),算上给老婆订的Touch4,我的iPhone4,之前的MB和iPod,好吧,我啥时候堕落的呢 = =

嗯,这篇流水账差不多就这样吧。最后请教一下,现在我只要一开Xcode,就会报如下的错误:

Uncaught Exception:
-[NSCFArray length]: unrecognized selector sent to instance 0x2006354a0

重装过N次Xcode了,Xcode4 preview4也试过,机器都重装过,都是如此,搞得现在相当郁闷。如果有哪位童鞋知道这是怎么一回事,诚请赐教 orz

Django 1.2.3 released

吧,上周临行前Django升级到1.2.2,当时立刻就作了更新,想着可以安份一阵子了,结果DSF居然趁着我们在青岛happy的时候,发布了1.2.3……

本次更新主要是给1.2.2擦屁股,解决如下问题:

  • 1.2.2更新的CSRF语句处理非ASCII响应存在问题。
  • 1.2.2更新后部分表单,特别是admin中的用户编辑表单出现问题。
  • 1.2.2打包时包依赖不正确(我汗= =|||)

好吧,下面是更新时间,更新Django请猛击这里,更新文档请猛击这里。更新完了的和不想更新的,洗洗睡吧。

Django 1.2.2 released

Django发布了一个新的安全更新。这次修改主要解决自1.2引入的CSRF防御系统的安全漏洞,新引入的{% csrf_token %}由于对cookie的依赖过于明显,攻击者可以比较容易的通过修改cookie内容达到XSS攻击的目的。

由于这部分功能是在Django 1.2引入的,所以只对trunk和1.2.X版本有影响。如果你正在使用的Django是你hack过的版本,你可以参考changeset13698(for trunk)或者changeset13699(for 1.2)来修改你正在使用的Django。当然,如果没做啥改动,那么还是直接更新成新的release版本1.2.2比较方便了 XD

另外,毕竟这是一次新的release,我把django-doc也更新了一下,有需要的童鞋可以去这个地址下载最新编译好的html文档。

回顾

有一阵子没更新了,突然发现这个博客也开了有一年了,一周年的时候没写点东西真是后悔啊 >。<

这一年来,写了171篇文章。想当初建博本来是想弄个自己的技术博客的,结果小统计一下,居然大部分都是我的胡言乱语,技术类的大概 50% 都算不上吧…… 还有翻译的东西,当时热情很高,还专门开了个分类,事实证明还是三分钟热度而已……

从访问上来说,排除我自己的访问,每日uv也就20-30左右,这和我基本没怎么做过宣传还是有关系的,不过本来基本都是些随笔的东西,所以一直也没觉得有必要做 SEO 。倒是去年随便评论了一下uliweb把limodou给引了过来,给博客带来了大量浏览。所以要想吸引网友的注意力,会制造话题还是很必要的技能。

自己做事也真是比较拖了,早就准备把这个博客程序重构一下,页面也重新设计一下,在一周年的时候来个大换血的,结果一会儿这事一会儿那事,眼睛一眨,叶都黄了。现在还是用的1.1的Django,如果现在准备重构的话,粗略估计也得10月份开工了,再算上页面重新设计的话,今年感恩节还不知道能不能赶上了。呵呵,争取吧。

反正最近是比较忙的,博客的更新估计也会比较少,一切等过了9月份吧。

话说新的touch已经发布了,基本参数和iPhone 4差不多,还是很有吸引力的,就不知道国内什么时候有货。不过我更关心iPhone 4的供货,正好有朋友9月中旬去HK,不知到时能不能给我带回一个来。但愿吧……

解决svn一直报Error validating server certificate的问题

在主要还是用svn做版本控制,而为了代码在传输过程中的安全性,如果能有HTTPS,我还是会尽量选择用HTTPS。可是最近有一个问题很烦人,由于公司的证书问题,svn在做ca认证的时候发现有错,于是就出现了如下错误提示:

Error validating server certificate for 'https://xxxxxxx':
 - The certificate is not issued by a trusted authority. Use the
   fingerprint to validate the certificate manually!
 - The certificate hostname does not match.
Certificate information:
 - Hostname: xxxxxxx
 - Valid: xxxxxxx
 - Issuer: xxxxxx
 - Fingerprint: xxxxxxxxx
(R)eject, accept (t)emporarily or accept (p)ermanently? 

照理直接按p就可以让svn以后忽略这个问题了,但是很奇怪,即便摁了p,下次操作时还是会提示同样的错误,让人无法蛋定。

在默默忍受了这个问题许久之后,今儿在home列目录时突然发现,咋这么多root的目录,其中就有.subversion,我每次的操作都没有记录,难道就是因为这个导致权限不足无法保存设置么……于是立刻chown了一下,问题果然解决,我勒个去……

总结教训,下次再发现啥软件设置无法保存的情况,先检查检查配置文件或目录的权限再说。不过,话说,这svn也不提示啥的,太无良了 = =|||

Python解析巨型XML

久没有更新博客了吧,主要是最近比较忙,到了新的环境需要学习的东西还挺多的,像我这么好学的人当然就一心扑在学习进步的道路上了。不过既然我都登上来了,那就写写最近碰到的一个case吧。

事情是需要处理一个客户提供的数据源,格式是xml。要说处理xml,在Python的世界里首先还是会先想到lxml吧。不过这次的情况有点特殊,这个xml的大小比较bt,gzip压缩后大小1.9G,未压缩状态11G…… 所以,通常用lxml建立element tree的方法是不行了。这点本人已亲身尝试,本以为服务器16G的内存应该够用,结果从开始时内存就迅速飙升,最后悲剧,本人向System Administrator掩面表示很傻很天真。

继续阅读