昨天jjgod同学写了一篇“homebrew — Mac OS X 下新的软件包…

昨天jjgod同学写了一篇“homebrew — Mac OS X 下新的软件包管理工具”的文章。homebrew前一段时间就看到有人说不错,看了jjgod同学写的文章才明白它好在哪里。

不过安装的时候遇到了一个问题:

-bash: /usr/local/bin/brew: /usr/bin/ruby^M: bad interpreter: No such file or directory

其实主要原因就在于这个^M。它说明这个文件使用了windows的line ending,也就是/r/n,在*nix下面它就会造成问题。查了一下遇到这种问题最简单的方法是

cat /usr/local/bin/brew | tr -d '\015' > /usr/local/bin/brew

安装后我发现homebrew已经包括的软件还不算多,不过无侵入的方式我非常喜欢。我现在包管理机制用的是macports,不过所有的ruby依赖我都没有安装,我基本上只macports管理git-core, mercurial, python,似乎转到homebrew问题也不算大。而且homebrew由于把bin都link到/usr/local/bin,所以和macports及fink共存应该很容易,可以留给你很长的切换时间。

最近在纠结买个什么样的手机,因为现在用的老婆淘汰下来的曾经掉在牛奶里的Moto …

最近在纠结买个什么样的手机,因为现在用的老婆淘汰下来的曾经掉在牛奶里的Moto V3实在是很难用。考虑了很久iPhone 3Gs/3G,发现4k – 5k的价格实在不是我能够接收的,而且它们能够实现的大部分功能用iPod touch 2已经可以实现了(我已经拥有它1年+)。然后就考虑了下火的厉害的HTC G1/G3,2k-3k的价格我也觉的有点过,而且体积上也不招人喜欢。所以静下来想想我到底需要手机给我什么功能:

  • 打电话,发短信,最好待机时间比较长,3-5天比较好吧
  • 能用Twitter
  • 最好能访问邮件,或者有备忘的功能
  • 可以和Mac的Address同步联系人信息,能够和iCal/Google calendar同步calendar信息
  • 其实也没有什么别的期待了,最好能阅读Google reader,但是一定要离线cache图片。这个功能我用iPod touch里面的Byline已经很满足了,并不需要手机一定提供该功能
  • 体积不要太大,放在裤子口袋里不要太鼓
  • 便宜,丢了不要让我太心疼

可是,这样的手机存在么?我一直在想,那些2xx元的古老的洋垃圾黑莓能支持Twitter么?那些MTK的山寨机能支持Twitter么?如果能凑合用,我就考虑买它了。

听理发的师傅说,洗发水是碱性的,会刺激头皮。让头皮容易出油的朋友更脱发。但是头皮…

听理发的师傅说,洗发水是碱性的,会刺激头皮。让头皮容易出油的朋友更脱发。但是头皮的油多需要洗头,最好保证每天洗头。所以两者的矛盾需要护发素来解决,理发师父说护发素是弱酸性的,可以保养头皮。因为我一直觉得护发素滋养头发是胡说,按理发师傅说的保养头皮听起来倒是还有那么一点道理。所以准备尝试一下。

Gmail的快捷键? j, k: 选择上一封或者下一封邮件 o: 打开邮件 e…

Gmail的快捷键?

  • j, k: 选择上一封或者下一封邮件
  • o: 打开邮件
  • e: 存档
  • # (Shift + 3): 删除
  • r: 回复
  • u: 回到列表页
  • c: 创建新邮件
  • g + i: 回到inbox

我发现p2主题的快捷键也是非常相似的,这样的话,以后web应用的快捷键就有了约定。

如果感兴趣的话,Gmail的快捷键列表在此

今天写这个,就说说常见的有未提交修改,但是马上要去修改一些别的东西,如何建立所谓…

今天写这个,就说说常见的有未提交修改,但是马上要去修改一些别的东西,如何建立所谓“临时分支”。

在Git里面,这个叫stash,是一个线性堆栈

git stash

而后你的修改会被放在stash里面,可以多次提交,它们被线性的保留在堆栈里面

git stash apply

这个会用后进先出的方式将修改恢复为本地修改,而后你可以选择去提交了。

在HG也就是Mercurial里面,有更强大一些的叫做q的东西

hg qnew -f filename.diff -m "your coments" //创建一个q,并给它命名为filename.diff(同时这也是diff文件的名字)
hg qnew ...
hg qpop //可以将一个q弹出来
hg qpush //又把它推回去
hg qapplied //看看哪些q目前被应用了
hg qseries //看看一共创建了哪些q
hg qfold //合并两个q
hg qfinish -a//将已经应用(applied)的q转换为check-in的版本。

HG这一套比较复杂,主要原因是Git和HG两者哲学不同。Git推荐你用轻量级的本地branch功能,而hg推荐你用基于hard-link的local branch配合q来实现并行开发。

Git里面还有一个非常先进的东西,叫做interactive rebase gi…

Git里面还有一个非常先进的东西,叫做interactive rebase

git rebase -i HEAD~5

然后会打开一个$EDITOR,你可以编辑前面5次(也就是~5,可以改为你需要的值)的提交,你可以选择保留–pick,修改–edit,合并–squash,或者删除(删除一行提交信息就可以)。

这可以进一步鼓励你频繁的使用git提交。

Python中的method_missing和*get*钩子方法族

刚才实验了一下,发现Python里面声明类的时候是否选择继承objects还是有很大区别的。只有继承了objects,才可以使用钩子方法如’__get__’, ‘__set__’, ‘__getattr__’, ‘__getattribute__’这些方法。也就是说这些有用的钩子方法是所谓的new object里面的东西。今天我在项目的代码里面尝试了一下类似Ruby method_missing的写法,实验在Python里面加点元编程的东西。发现很相似的三个方法’__get__’, ‘__getattr__’, ‘__getattribute__’方法区别挺大。注意,一定要继承object才可以享用三个钩子方法。

  • 访问对象方法的时候首先会访问’__getattribute__’,它是访问类里面所有属性的时候都要经过的方法,包括创建对象的时候访问’__init__’, ‘_meta’这些都回经过’__getattribute__’访问。如果你什么异常都不抛出,它就不会访问’__getattr__’方法。
  • 如果’__getattribute__’方法抛出’AttributeError’,那么会继续尝试访问’__getattr__’方法。再有异常抛出,那么这个类就没有钩子再接住异常了。所以从这个角度来说它的工作方式非常相似于Ruby的method_missing。
  • 我本以为’__getattr__’是系统内建函数hasattr(object, property)优先访问的方法。不过实验证明,实际上还是先走’__getattribute__’后走’__getattr__’的。也就是说hasattr这样的函数没有优先绑定’__getattr__’。
  • ‘__get__’方法是用来监视自己的类作为其它类的成员的时候被访问的钩子。对应的是’__set__’,是相应属性被赋值时的钩子。这个方法与’__getattr__’和’__getattribute__’完全不是一会儿事。刚才看《Python核心编程一书》完全没有解释清楚。《How-To Guide for Descriptors》这篇文章对解释’__get__’帮助很大,有兴趣可以看看,不过我倒是没有想到什么是合理的应用场合。

我目前还没有调用方法的method_missing,目前只是访问一些属性。我们实际处理的是一个可以直接用属性名读取/修改对象里面的持久化json属性的方法,就是类持有一个{‘property’: ‘value’}的json文本属性,我们就可以直接用Model.property访问和修改里面的方法,而不用特别的去生命json结构过来。是一个在Python中做meta programming的尝试。

测试刚才说的几个*get*方法的测试如下:

# -*- coding: utf8 -*-
import unittest

class A(object):
    def __init__(self):
        print 'init A'

    def __get__(self, *args):
        print '__get__ A', args

    def __set__(self, *args):
        print '__set__ A', args

class B(object):
    a = A()
    
    def __init__(self):
        print 'init B'

    def __getattr__(self, *args):
        print '__getattr__ B', args

    def __getattribute__(self, *args):
        print '__getattribute__ B', args
        raise AttributeError

    def __get__(self, *args):
        print '__get__ B', args

    def __set__(self, *args):
        print '__set__ B', args

class MeTest(unittest.TestCase):
    def test_simple(self):
        b = B()
        print b.a
        b.a = A()
        b.c
        hasattr(b, 'e')

前两天被身边的朋友嘲笑我用的bash在按Tab自动完成的时候不能忽略大小写。所以…

前两天被身边的朋友(他用csh)嘲笑我用的bash在按Tab自动完成的时候不能忽略大小写。所以就造成你键入do就不能自动联想到”Downloads”,有的时候你不得不ls一下看看是否有大写的文件夹。Google下发现bash其实是支持忽略大小写的。在Mac下修改~/.inputrc,加入:

set completion-ignore-case On

然后重启一下Terminal,就开始支持大小写通配了。其实这里解释的是我看到的最清晰的:http://www.macosxhints.com/article.php?story=20070831153033300。Bash使用了readline,而readline的配置就在~/.inputrc,里面还有很多配置,有兴趣可以研究一下。注意,上面那个方法在10.5以后的OSX才生效,10.4以前的版本设置方法不同,大家自己Google吧。

想给爸爸买一个笔记本。爸爸主要是看书,所以我在选择超轻薄移动本本,目前比较看好的…

想给爸爸买一个笔记本。爸爸主要是看书,所以我在选择超轻薄移动本本,目前比较看好的都是Intel今年一直偷偷在推的SU系列超低电压CPU的亚本本。SU系列CPU性能比Atom要一些,而且它没有使用陈旧945M芯片组搭配(现在的Z系列Atom也不再搭配945M。

对于低价本本,我一直比较迷Acer的,而不喜欢Asus的。目前Acer的Timeline系列是我最看好的CULV笔记本系列,各方面都很匀称。有3810T、4810T、1810T,其中13和11.6的两个系列是我瞄准的主要目标,都使用了1366×768分辨率的LED LCD,我有点怕给爸爸用文字比较小。不过从品质上来说这才是我比较喜欢的样子。

所以瞄准了这么几款,我再仔细衡量一下哪个更好

  1. Acer 3810T, 13.3, 1366×768, 1.6kg, 3999
  2. Acer 1810T, 11.6, 1366×768, 1.5kg, 4299
  3. Acer AOD150, 10.5, 1024×600, 1.2kg, 2199
  4. Acer A751h, 11.6, 1024×600, 1.25kg, 2950

这么写完以后我感觉似乎要性能和屏幕就要Acer 3810T(Intel SU3500),否则就买个Acer A751h(Intel Z520)好了。