• 适逢辛亥百年,今年看南都看得特别过瘾,因为上面常常会出现大版大版关于反思辛亥的系列文章,一路看下来确实收获良多。今天发现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情况。

  • 传说中的 Excel终结者 诞生了,据江湖谣言,此物可以拯救四大审计师于加班的水深火热之中。

    你心动了吗?

  • 1、往res/drawable或color文件夹添加东西后(比如一个定义ColorStateList或StateListDrawable的xml),记得把工程rebuild,否则容易出现id被添加但文件本身却未被编译的奇怪问题(会出现FileNotFoundException)。

    2、StateListDrawable的mutate方法有bug,其源代码(1.6)如下:

        @Override
        public Drawable mutate() {
            if (!mMutated && super.mutate() == this) {
                final int[][] sets = mStateListState.mStateSets;
                final int count = sets.length;
                mStateListState.mStateSets = new int[count][];
                for (int i = 0; i < count; i++) {
                    mStateListState.mStateSets[i] = sets[i].clone();
                }
                mMutated = true;
            }
            return this;
        }

        可见mStateListState.mStateSets[i] = sets[i].clone();这句并未考虑sets[i]为null的情况。而大部分时候,你只会声明某些常用状态(比如state_pressed),未声明的状态皆为null,因此该mutate方法会出错。

    3、如何自定义CheckBox

        StateList中的state_checked这个状态是如何被一个View使用上的?带着这个问题粗略看了下CompoundButton的源码后,发现这涉及到对view的internal state机制的完整理解。目前先把这个理解放到一边,单纯讨论下我希望对自己的View在StateList定义中用上这个state_check该如何做:

        方法一:继承CompoundButton这个抽象类,于是你就得到了一个具备state_checked这一状态的自定义View了。

        方法二:直接使用CheckBox这个类。CheckBox的源码说明,其仅仅是一个CompoundButton+一个CheckBox的Style定义:

      name="Widget.CompoundButton.CheckBox">
       
    <item name="android:background">@android:drawable/btn_check_label_backgrounditem>
       
    <item name="android:button">@android:drawable/btn_checkitem>

        因此你使用时用自己定义的style替换之,或者直接把background和button属性给修改掉,就能不受内置style的影响了。

     

    4. 关于在父子控件之间传递State状态的两个方法:

    父获得子State:setAddStatesFromChildren

    子获得父State:setDuplicateParentStateEnabled

    如果这两个同时被设置了,那么你将得到异常。

     

    5. XML中用的那些常量到底被android放在哪?

    放在android.R.attrs里,于是放弃XML吧,一律用code定义之。