Chen Yangjian's Blog

Carpe diem - Seize the day

装修

| Comments

每每听亲戚、同事、同学、朋友说起,装修总是很累人的。如果不想把事情与期望全部托付给装修公司,而后闭着眼睛祈祷一切顺利,以及入住之后什么麻烦也没有,那么你的折腾之路就此开始。从最开始的勘测,到最后的打扫,中间穿插着无数中间商、打工仔、销售,每个人都虎视眈眈,一旦你有所懈怠,就冷不丁咬上一口。“怎么水泥还没送来?”,“我要的地砖不是这个啊”…… 装到纠结处,拿着手机狂骂,工头跑到你上班的地方讨薪,都是有可能的。

然而我毕竟还没有亲历过,如果可以,我可真不想在这种境况下去发挥自己的创造力、大局观和指挥若定。何况我根本没有。在我看来,努力花数月时间去达到水泥工、木匠、电工、设计师等多年工作所取得的能力,是一项近乎不可能的任务。真的去做的过程中,恐怕也会不停的回头想,恨当初……

为什么想住着舒服就得把各种地板的板材、优缺点、价位、是否有货、各地打折情况都得了解一遭?

然而,无论这东西再麻烦,恐怕也抵不上如今社会中彼此的不信任。市场缺乏规范、技工缺乏培训、大家都是口面不一,还有什么好说的?谁都知道这东西烦,谁都不愿意撒手交给第三方,几乎没有人相信装修公司会尽力把事情做好。住进去就发现地漏贴高了,住俩月发现墙裂了,住一年发现门轴越来越不行了,住两年地砖起来了。跟装修公司急吧,人说当初他们也是外包的,恐怕现在找施工单位都找不到了,你信么?闷头回家,打开越来越响的门,走过越来越破的地砖,穿过破裂的墙,借到开发商的电话,“因为有住户反映房屋倾斜,请各住户先暂避一段时间。” 得,还有谁靠得住?

所以今天看到天涯上 1W5 装修 139 平的神人着实让我叹为观止了一番,更重要的是装修效果还不错,挺有范儿。

谨以此祝愿我尚未开始的装修一切顺遂,大家欢喜。

卢广仲

| Comments

知之不多,就晓得他初出茅庐就得了金曲奖的最佳新人和作曲两个大奖,有段时间反复听他的《100种生活》(可试听),后来也没再关注。

今天不小心看到这个,实在太可乐了。

左撇子吉他手 Jovan Milenkovic

| Comments

今天在优酷上晃悠,看到上面这个视频。这哥们长得可真像陈冠希…… 左手拨弦的吉他手比较少见貌似,或者是我孤陋寡闻了。貌似王若琳也是左撇子吉他手,某日看到八卦说小时候其父还特地从某吉他作坊重金打造一把云云。

在 MySpace 的视频比较全,这里就转帖一个翻弹 Andy McKee 的 Rylynn: Rylynn

Guava Libraries

| Comments

Google 近日发布了个增强 Java 1.6 的库,叫做 Guava Libraries,涵盖语言基本、输入输出流、网络通信等方面。让我想到了 Apache 的 commons 库,以前用过 commons.io 和 commons.net,用来处理 Servlet 里头的文件上传和通过 FTP 完成文件传输。

Guava 与它的区别是,顾名思意,有的地方就不再是 Java 了。此外,只面向 Java 1.6,可应用于平台如 Google App Engine、Android 等。可喜的是,改善的都是我所喜闻乐见的。

Guava 还在很初期的阶段,官方的介绍【PDF】也很简洁,不过它指出来的 Java 语言中某些差强人意的地方挺有意思。例如 String 的 split 方法:

小测试:”,a,,b,”.split(“,”) 的返回值是…

“”, “a”, “”, “b”, “” null, “a”, null, “b”, null “a”, null, “b” “a”, “b” None of the above

答案是以上皆否,返回的是 "", "a", "", "b",只有末尾的逗号被忽略掉了。于是 Guava 里头提供了一个字符串切割的类(Spliter)。

Splitter.on(',').trimResults().omitEmptyStrings().split(" foo, ,bar, quux,")

如今把成员方法串起来很流行呀。

记账小应用更新

| Comments

gainorspend

欢迎试用

用 django 的方式重写了一下,MVC 结构清晰点,方便以后扩展用。其实也没重写这么夸张,就是把原先的两个 RequestHandler 的子方法都调调出来,写成函数吧了。actions.py -> views.py,无他。因为东西本来就不多。

写法大部分套用官方的说明,以及 django_example。此外,有个开源项目叫做,google-app-engine-django,提供目前被阉掉的 auth、session 等,做大应用的,不妨看看。

app engine 自带的是 django 稳定版(0.96)。shortcuts 里头木有 redirect,照抄一个新版本的就是了。我更懒,直接

def _redirect(to):
    return HttpResponseRedirect(to)

就在我倒腾 django 的这几天,django 的作者写了篇文章《Snakes on the Web》,对 django 的发展前景表示悲观,质疑 WSGI 是否已经完成历史使命,展望未来十年,怀疑自己是否还能继续用 python,以及什么时候才能有真正的多线程。不过,对于 django 目前的情势,他还是表示乐观,敏捷 web 开发,django 还是很能胜任的。只要你的网站不会在某一天突然变成 Twitter。跟风评论者纷纷表示余等已开始转向 Haskell、Erlang、Closure 云云,我也在想要不要尝试下看看。

不过,目前为止,一切安好。

Perl: See Brainfuck

| Comments

前些天,有好事者号召大家说说什么编程语言最适合做什么:let’s see what languages are best for what.(很不错,推荐一看)

不幸的是 Perl 的评论是这样的:

Perl - see brainfuck

Perl - when you need something to start working ASAP and don’t want any lip from the compiler. …and want a slew of silent runtime bugs instead.

时隔多日,今天老大突然又让我解析一些存储过程(Stored Procedure),不过都是些轻活,不需要解析 SQL,只要把文件头的注释和某几句话去去掉,就是了。麻烦的是需要把原先的文件划分重新搞,按 schema 归类。自然就像用散列来做,弄个类似

('schema_one' => ('sp1', 'sp2'), 'schema_two' => ('sp3', 'sp4'))

的结构。这才发现 Perl 的散列的值只能是 scalar。介绍到 a hash of lists 的 perldoc 自己也笑了:

One of the most important new features in Perl 5 was the capability to manage complicated data structures like multidimensional arrays and nested hashes. To enable these, Perl 5 introduced a feature called `references’, and using references is the key to managing complicated, structured data in Perl. Unfortunately, there’s a lot of funny syntax to learn, and the main manual page can be hard to follow.

Perl 的语法确实太乱了…… 括号可以省略;条件语句可以倒置;continue 叫做 next;else if 不好好写,写成 elsif;还有两个万恶的变量叫做 $ 和 @;string 的比较(eq, ne, lt, …)跟整形的比较操作符(==, !=, <, …)居然是不一样的,如果不小心用了,连个错误信息都没有;最离谱的是,函数的参数与返回值是不需要显式说明的(当然,这不确切,准确说是,参数是需要写到函数体当中,而返回值则是函数体最后一句的返回值,如果不幸那一句没有返回值,那就得显式得在末尾写上变量。折腾来折腾去,省了一个 return)。

用不着这么标新立异吧?

再说回到如何在 perl 里头实现复杂数据结构。一般情况下,知道如何取地址(\%, \@, \$)和根据地址取值(%{}, @{}, ${})也就够了。如下:

$aref = \@array; # $aref now holds a reference to @array
@list = @{$aref}; # @array now restores the value of @array.

Larry Wall 觉得这样不够好玩,同时他还觉得 [] 和 {} 不能只用来做索引操作符(定义数组和散列时,默认用得是括号),-> 操作符他也没有用上。于是就有了这样的代码:

$aref = [1, 2, 3];
print $aref->[2]; # 3

头大了没有?

Google App Engine 继续

| Comments

记一下最近遇到的一些问题和解决办法。

简洁 URL:都到了传说中的 post web 2.0 时代了,你不会还不知道简洁 URL 吧?例如:https://developer.mozilla.org/en/Canvas_tutorial 其后的 Canvas_tutorial 即是传入的参数。django 默认就是的,为我所知的一些 PHP 做的内容管理系统,也是的。因为 PHP 默认不是动态 URL(传入 /post/245,PHP 会去 post 目录下寻找名为 245 的文件),所以 CMS 之一 drupal 的的实现方式是将所有的后缀 URL 都作为参数 p 的值,即改成:/?p=/post/245。而 django 我就不知道了…… 唉,离题好远。其实我要说的是,Google App Engine 也是可以 fancy URL 滴,URL 正则表达式里头把需要作为参数的部分括起来,在相应的 RequestHandler 类里头,实现相应的 get,就是了。例如:

('/tag/(.*)', TagAction),


class TagAction(webapp.RequestHandler):
    def get(self, tag):
        print tag;

中文 URL:中文 URL 在协议里头是要被转换掉的,所以在 RequestHandler 里头如果直接拿来用的话会有问题。需要先用 urllib.unquote 转回来,再 decode 到项目本身使用的编码。例如:

tag = unicode(unquote(tag), 'utf-8')

函数动态召唤:以前写 PHP 的时候,经常会写出类似 “$foo = ‘funcname’; $foo()” 的代码,因为在应用到原本需要用 switch 场景的时候,实在很方便。所以在 python 里头自然也想这么写,办法很多,参考这里。除了 eval(),本质上大同小异,eval() 的话,少用为妙。例如:

some_object.__getattribute__('method_name')()

哈希表(dictionary)的排序:首先,哈希表是无序的!我们能做的只是把键取过来,现行排序,而后再根据排序好的列表去访问原先的哈希表。例如,根据值排序:

def sort_by_value(data):
    tags = data.keys()
    if len(tags) == 0:  return []
    tags.sort(lambda x,y: -cmp(data[x], data[y]))
    return tags

简洁的主键:这里说的是 Google App Engine 的数据模型。例如,定义一个 Tag,则除了自定义字符串以外,GAE 还会自动分配一个主键,可以通过访问该数据模型类的子函数 .key() 来获取,如 instance_of_tag.key()。但是直接拿来用产生的字符串很难看,类似 agtnYWlub3JzcGVuZHIOCxIGUmVjb3JkGPKrAQw。其实该类(指通过 .key() 获取来的 Key 类)附带了个函数叫做 .id()。所以,通常 instance_of_tag.key().id() 一下,取得一个整形数字,就比较好看了。自然也可以根据 id 获取数据,代码如下:

Spending.get(db.Key.from_path(Spending.kind(), spending_id))

废话这么多,其实永远不如自己看代码研究实际。

白银帝国

| Comments

原作叫做《白银谷》,搜“天成元 银号”的时候不小心看到影评一篇,揭露了《白银帝国》的矫情。

导演想探究的东西估计她自己都没理清楚,史诗?为人?晋商的义?儿子父亲与继母的不伦三角恋?奴才跟人才的本质区别?都有涉及却却显得没有重点,做了盘地三鲜,扮作讨喜,茄子、青椒、土豆,大家欢喜。然而却起个名字叫酸辣土豆丝。让我大呼上当。唤作《康三与他的银子们》反而更为妥帖…… 或者《我和继母不得不说的故事》

笑点一:佣人跟老爷说,太太找洋大夫做手术,不能生养。老爷一脸惊恐,外加几分困惑,“切……了?”

笑点二:下人对老爷说,“续弦吧”;老爷很正经,“唉……就依你”

笑点三:老爷抱出一个小孩子来,得意地对自己留着两撇小须的儿子康三说,“我能做的也就是这些了……”

郭富城终于没再有类似《雷霆战警》里头对王力宏喊的,“你不要屎,你千万不要屎”的台词,本片是配音的?

说宅门里头的爱情故事的话,推荐《庭院里的女人

鼻炎

| Comments

毕业之后诸事顺遂,没啥特别牛掰的,也没啥特别不爽的。大四以来的轻度抑郁经过1年多的调整,也差不多已经抛在脑后。当然,难免有些不如意的事情留在那里让我时不时想起来,时不时后悔一番。这很好,证明我还不没有反社会倾向。虽然确实朋友不多,不喜搅基交际,有的时候还撒谎,但是还好时刻顶着三个代表,左手毛主席思想,右手邓小平理论,腰间别着八荣八耻,有着一刻随时随地都要捶胸顿足一番的心。像我这样的,干不出什么为害国家人民的事情来的。

然而就有一个不爽,我的鼻子。

在马季的《五官争功》里头,姓鼻单名一个子的王金宝同学争功的时候说到个重点。这鼻子闹个鼻窦炎流个鼻涕什么的,连带眼睛、嘴巴、耳朵全没一个好受的。此番话深刻的突出了马老师的段落大意,五官是个整体。而我的鼻子作为整体的一份子,不仅没有一条内裤、一张卫生纸都有的责任心,居然还隔三岔五的就流清涕、打喷嚏(冒着把眼睛打出来的危险),实在是让人忧心。

鼻炎算是平民顽疾,米国最近的某项调查,患者有五千万之巨。鼻炎影响到的不仅是鼻子,咽、喉、眼、耳朵都会有不同程度的病症。鼻子一堵,耳朵听起来不对劲,只能用嘴巴呼吸(冷空气吸入易引发哮喘),等等。参考百度过敏性鼻炎症状列表:

  • ①眼睛发红发痒及流泪
  • ②鼻痒,鼻涕多,多为清水涕,感染时为脓涕
  • ③鼻腔不通气,耳闷
  • ④打喷嚏(通常是突然和剧烈的)
  • ⑤眼眶下黑眼圈(经常揉眼所致)
  • ⑥经口呼吸
  • ⑦嗅觉下降或者消失
  • ⑧头昏,头痛

上述症状我占了大半,于是跑去校医院看,医生曰:“过敏性鼻炎”。给开了两种药,抗过敏药开瑞坦、鼻腔喷剂伯克纳。前者没啥效果,后者杠杠的。只是后来胃又闹点小不爽,伯克纳的说明书上说胃溃疡什么的禁用,就很怕死的没敢再用。除去各种各样的用药之外,有一个办法支持的人颇多,盐水洗鼻。成本低,木有副作用,就是需要坚持。

今日鼻炎突然加重,一包纸巾半个下午用掉只剩半包,清水鼻涕却依然故我,长流不止。万般无奈下,再度上网科普自己,又觉得自己的症状更像是血管运动性鼻炎(可能又名神经性鼻炎,不确定)。症状上,跟过敏性鼻炎大同小异,鼻流清涕、狂打喷嚏、流眼泪、鼻子堵等等。有个区别就是,血管运动性鼻炎(Vasomotor rhinitis)一般没有季节性,四季都有可能发作,春秋季温差变化大时症状明显;20岁之后开始发作,而过敏性鼻炎基本在儿童时就有症状(并可能伴随哮喘);还有就是,女的比男的明显要多(唯一一个于我情况相左的)。

Vasomotor rhinitis appears to be significantly more common in women than men, leading some researchers to believe hormones to play a role. In general, age of onset occurs after 20 years of age, in contrast to allergic rhinitis which generally appears before age 20. Individuals suffering from vasomotor rhinitis typically experience symptoms year-round, though symptoms may exacerbate in the spring and fall when rapid weather changes are more common.

不管怎么说,我确定我得了鼻炎了…… 什么时候去整个吸鼻器、记得去锻炼、规范作息、饮食有度、才是正途。

Godfather Revisited

| Comments

有名的电影总是围绕着你不散,IMDB TOP 250豆瓣百部最佳电影、等等,总会时不常地在你的屏幕上、在你的身边、手机短信、邮件中阴魂不散地冒将出来,敦促你去看你没看过的,重温已经看过的。

昨天晚上得闲,找出很久以前从某个浙大校友那边买来的《教父》三部曲,又看起来。多年以前我初次听说这三部电影的时候,伴随它们的无数流言、评论、八卦,如今也都又在我脑海里头浮现。比如著名的科波拉家族(让我想到肯尼迪家族)、比如为证明自己抛开家族影响而改名的 Nicolas Cage、比如所谓方法派演技所谓大起大落而浪子回头的 Al Pacino,比如做戏子不讨喜当导演却惊人的 Sofia Coppola(在三部中都有出现,在终结篇扮演 Mary Corleone)。

而如今的重温,只不过是对以上记忆的召唤与加固,除了这些我还有什么要感慨?西西里又如何吸引人?来自意大利的导演(教父三部曲的导演 Francis Ford Coppola;《天堂电影院》、《海上钢琴师》的导演Giuseppe Tornetore)如何能拍电影?有着西西里烙印的米国电影的配乐是如何出彩?

小子不才,道不出心中这些微感想,参考良莠不齐的豆瓣热评把。

另八卦,《教父III》筹拍之初,Mary Corleone 原本由 Wyona Ryder 扮演;《教父II》是大片续集中少有的再获奥斯卡最佳电影的。