• 昨天老婆在家带璐子苦闷,于是我团购了两张电影票,晚上准备带她和璐子去看一场欢乐无脑动画片。结果换票时合适场次的动画片已经没了,只好将就看一部《匆匆那年》。

    放心,我不是来影评的。因为璐子一直咿咿呀呀不肯睡,老婆看了一小时后不得已抱着璐子出去逛商场了。我坐立不安地再坚持了半个小时,终于在这一类打着80后回忆但其实跟我的青春轨迹毫无关碍的剧情下离开。我离开影院,看到老婆在场外抱着璐子对灯光指指点点,那一刻幸福莫名地就涌上心头,于是赶紧从老婆手中接过毛茸茸的璐子,狠狠亲上几口,然后回家。

    毫无关碍,回家的路上我就想,这言过其实了。当女主角方茴在高考结束的party上痛哭说自己考砸了人生完蛋了的时候,我难道没有想起自己曾经那些深陷考试分数的心境?是的,无论是当年的学霸还是学渣,变老的我们都已经不再在乎那些浮云般的考试,哪怕它叫什么高考。但我无法否认自己曾如此在乎过它们,如今又视如敝屣。

    说到底,在对待这些东西上,我跟剧中渣男背叛初恋方茴的行为并无二致,只不过渣男明显后悔了,而我嘛只痛悔自己浪费青春如斯,并下定决心要让璐子不必重蹈覆辙。

     

    所以长大就是一个不断鄙视自己过去的事情?

     

    这就是我一早被自动吸尘器吵醒后再难入眠,索性爬起,打开已经封尘两年的blog的原因。我要写下一个回答:不。

    豆瓣的确是个神奇的地方,总是有人能凭我的网名在那找到我,然后私信:

     

    请问您是否是短篇历史小说《素描三国》的作者? 
    我是百度贴吧三国吧的准小编,觉得您的文章《五丈原上》较为符合我们近期打算制作的吧刊。 
    不知道您近期会不会上豆瓣,希望您能授权我们使用您的这篇文章。”

     

    请问潘大角《永远的三国》这篇,网上的版本是你OCR的吧?它原发哪里啊?谢谢

     

    这两封私信相隔甚远,但如果不是潘海天当年那篇《永远的三国》,我恐怕也不会展开自己幼稚做作的模仿,在文学青年的道路上越走越远最终死路一条。

    我真的很高兴很感动我曾尝试写过的那些小说,它们大多行文拙劣,充斥着浓浓的应试作文味道和措词。但我不仅热爱它们存在于我的人生,我甚至同时怀念当年所有一起读过它们的人,给我评价和建议的人,远甚于一些仅仅欣赏我能考试名列前茅的老师。

    这就是那些不会逝去的东西,它们鲜活地生存着,即使已经没有文字,它们也渗入了我的代码,我的产品,我的UI/UE设计,我读书时的每次欢笑,我看电影时的每次触动,我行走在下班路上,古典大师的旋律于心间悄然泛起的瞬间。

    我依然缅怀着史铁生,想念着柴可夫斯基,还有高三深夜被窝里读得难以自禁的沈从文。我记得高考前的某个假期我读完《秦腔》然后在校园里一个人默默走了好久,也记得清晨从宿舍爬起来,听到小约翰斯特劳斯的春之声响彻校园操场。这些记忆,一直都活着,这些才是我的青春。

    所以即使18岁之后又逝去了10年,日常我不可能再听小约翰斯特劳斯的作品,也不会读贾平凹的新作,我依然在看科幻片一次次向《太空漫游2001》致敬而演奏《蓝色多瑙河》时深感温暖,看菲利普迪克的作品时莫名联想起贾平凹笔下的怪诞。

    每天早上醒来,当我睁开眼,与老婆打第一个照面,心底一些感情会开始蔓延。这些感情,让我小学后记住了一个女孩,让我高考前无比思念和忧伤,也同样让我拥抱和亲吻面前的妻子,并在上班的间隙想起她的容颜,莞尔一笑。

     

    这些不会逝去的,让我明白我在命运面前是多么幸运和得宠,因此我得以无畏。

  • 2012-11-24

    别了640 - [杂文碎字]

    今晚决定开始着手把整个工作环境都转移到新的笔记本中,才突然想起我的这个博客,想起六年多前我很兴奋地拿到崭新的Dell 640m,装好xp配上炫目的桌面+图标,然后拍照放到这里。

    如今我仍在敲打着六年前的键盘,有两个按键已经处于半残废状态,承托手掌的位置处也早已磨得掉漆发黄、污垢重重。笔记本的显示器转轴好像一年前就断裂了,于是我一直是用一个铁架子支撑着才能使用。

    我突然在这台笔记本上猛烈地感受着青春老去的力度,想想四年半前我和它独处的三个月时光换来实践上第一次觉醒,想想三年前我带着它坐在往天津的火车上忐忑不安和之后短暂的北漂,想想两年前我毫无畏惧开始一个庞大的计划又无疾而终,想想一年前我终于完成了一点表达然后到今天仍然想要更多。

    我总是喜欢用“表达”这个词。我觉得艺术的本质就是表达,而没有什么不是艺术只在于你是否有表达的欲望。

    所以我不会,将来也不会用微博的方式来诠释什么真正的心情。即使过了沉默的一年,当我回到这里,提起笔,开始写点什么时,我仍然觉得一切都在。我手上敲打的这块键盘无可挽回地将沉默在我房间的角落里,但我的手指会继续行走于另一块Dell的键盘上和屏幕前,物非人是。

    我相信贝多芬对他弹过的、老去的钢琴,也不可避免总有一点念想。

  • 适逢辛亥百年,今年看南都看得特别过瘾,因为上面常常会出现大版大版关于反思辛亥的系列文章,一路看下来确实收获良多。今天发现FT中文网(一个神奇的没有被墙的网站)也毫不示弱,打出的子弹一片一片的,所以把网址集结如下,供有兴趣者参考:

    http://www.ftchinese.com/story/001041040

    http://www.ftchinese.com/story/001041129

    http://www.ftchinese.com/story/001041075

    http://www.ftchinese.com/story/001041131

  •     今日看南都(http://gcontent.oeeee.com/0/da/0daf2855c770bf6e/Blog/dce/024408.html),被文章最后引用的Jobs的话触动:
        “不要受制于教条,这无异于活在别人思维的结果之中。不要让旁人的意见掩盖了自己内心的声音。而最重要的是,要敢于随心而动,相信自己的直觉。你的心,你的直觉,已经知道你想成为什么样的人。其他一切都是其次。”

        所以说,为什么马克思的理想是正确的?因为每个在生命中领略过劳动创造之美的人,都会坚信如上的观点,Jobs不是第一个,也绝不是最后一个。

        最后想说,关于苹果或Jobs,以及关于世上无数的成就,无论是科学还是艺术,人和人之间的观点总会有所不同,人在生命不同阶段的观点也可能会大相径庭。但这些不同是无关紧要的,重要的是你是否知道你在那些自认为或高或低的成就中真正收获了什么,这些收获是如何帮你度过生命中的难关的,又是如何让你的生活更贴近你的内心的。

        其实争论不难,赞美不难,凭空感动不难,不屑一顾更是不难,难的是去劳动、去生活。

        谨以此告诫好争好辩的自己。

  •     前些天和小瓜去珠海中大校区转了一圈,感觉还可以,只不过仍然是典型的内地大学风格,景色是有的,但就是缺少free的感觉。

         有趣的事情发生在我们准备离开校区往公交站的路上,我们被一个中大学生(后面称为A)骑车截住问英语语法问题,从Only if的倒装开始问了好几个,n年没看语法,我就派小瓜上阵抵挡……然后A得知我是学计算机的,于是又掏出各种编程语言的问题……A介绍自己是08年中大网络学院毕业的,一直找不到工作,现在心急火燎想掌握找工作的能力,于是仍在中大厮混。

         然而杯具的是,在接下来至少半小时的答疑解惑中,我发现A的计算机基础近乎全无,他所有的问题都停留在C++或JAVA的表面语法问题。A不仅说不出任何编程的实际经验,而且A的结论是C++太简单了,JAVA真tmd复杂……在我很愧疚地把小瓜晾在一旁一段时间后,我终于失去了耐心,狠狠地告诉他:掌握计算机语言的所有窍门就是编程编程再编程。临走还扔给他一道长整数运算的题目。不过看他恍惚困惑离开的样子,我估计未来依然杯具。

         不知道为什么,我如今有时候想起A,就会更努力和耐心地去解决无论多么detail的问题。

  • 关于Android开发实在是有太多太多东西可以写了(很多在网上都找不到),但是又没心情在工作中途停下来详细写那么多东西,所以在这里简单、凌乱地写下目前想到的一些地方(不断更新,想到就加),等完工后有空写个Effective Android系列来帮助程序猿们少走弯路。

    (1)JAVA的static初始化次序是按照语句顺序,在使用单件模式时特别要注意这点。

    (2)DrawingCache机制的剖析和正确使用。

    (3)Animation机制的剖析和各种改造与hook。 以及如何让animation最流畅(该问题的细节估计比大多数人知道的要复杂)。

    (4)软键盘隐藏\显示的完美控制。

    (5)EditText的擦除手势+点击对软键盘隐藏\显示的控制

    (6)ListView全面向下兼容的scrollBy效果(android 2.3及才开始提供的动画滚动指定距离的效果)

    (7)程序向下兼容的设计

    (8)单点缩放手势

    (9)WP7多种独家动画效果和控件的山寨指南

    (10)一个基于skia的矢量图系统

    (11)一个高效的Bitmap管理类

    (12)边缘手势设计

    (13)一个完美的AutoScrollTextView(过长的文字会来回移动,否则保持TextView的观感)

    (14)一个倒置的ListView实现(即ListView是按Bottom对齐,这个可能懒得写,因为最终没用上)

    (15)android消息循环、布局机制带来的各种注意事项

    (16)如何完美退出App(既保持Activity进行finish时的流畅切换动画,又保证所有资源被彻底释放)

    (17)iOS级平滑的滑动效果实现(包括惯性、自动归位)

    (待续……)

  •     没有我想象中的完美,瑕疵不少,但不知道为什么,一股伤感萦绕心头,于是你没有什么不能宽容的。

        本来买好了电子票,结果到了才发现唯一的一场竟然是在VIP厅,电子票不能用。背对着身后汹涌的变形金刚迷,来不及骂娘,我咬咬牙掏出了70块。提早10分钟进场,却愕然发现电影已经开始了。后来又进来了两人,于是三人包场享受了这很有可能成为影片告别的放映。

        戏里戏外的心境是如此一致,人们在忧伤中付出和歌唱。

        http://www.ftchinese.com/story/001039689

  • 1. 在2.1以下版本,如果对某ViewGroup进行setDrawingCacheEnabled(true),则该ViewGroup中任何child的动画都将无法显示(或者说只刷新了第一帧,然后就不刷新了)。在2.1及以上版本无此问题

    原因:对比2.0和2.1版本的View源码,可以发现在buildDrawingCache这一方法的最后一段有改动:

    2.0源码:

                mPrivateFlags |= DRAWN;

                // Fast path for layouts with no backgrounds
                if ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) {
                    if (ViewDebug.TRACE_HIERARCHY) {
                        ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW);
                    }
                    mPrivateFlags &= ~DIRTY_MASK;
                    dispatchDraw(canvas);
                } else {
                    draw(canvas);
                }

                canvas.restoreToCount(restoreCount);

                if (attachInfo != null) {
                    // Restore the cached Canvas for our siblings
                    attachInfo.mCanvas = canvas;
                }
                mPrivateFlags |= DRAWING_CACHE_VALID;

    2.1源码:

                mPrivateFlags |= DRAWN;
                mPrivateFlags |= DRAWING_CACHE_VALID;

                // Fast path for layouts with no backgrounds
                if ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) {
                    if (ViewDebug.TRACE_HIERARCHY) {
                        ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW);
                    }
                    mPrivateFlags &= ~DIRTY_MASK;
                    dispatchDraw(canvas);
                } else {
                    draw(canvas);
                }

                canvas.restoreToCount(restoreCount);

                if (attachInfo != null) {
                    // Restore the cached Canvas for our siblings
                    attachInfo.mCanvas = canvas;
                }

    也就是mPrivateFlags |= DRAWING_CACHE_VALID;这一句位置的错误导致了2.1以下的bug。为什么呢,你只要debug跟踪一下便会明白,在dispatchDraw这一方法中,特别有一段代码来处理child要进行animation的情况。当child要进行animation,则会把parent进行invalidate(),使parent会不断刷新。而2.0的代码中,parent的invalidate虽然执行了,但其效果又被最后一句mPrivateFlags |= DRAWING_CACHE_VALID给抹去了,故而产生了上述的bug情况。