在讯奇,身边一帮魔头,都是咸人,对我带来做Daily standup的小熊天天进行蹂躏。今天留下一图,其实这不算被虐待严重的情况,有很多情况下它就是个球:

Author: tin
昨天黄凯同学推荐了几款黑莓给我,包括8820, 8310, 8320。黄凯同学说…
昨天黄凯同学推荐了几款黑莓给我,包括8820, 8310, 8320。黄凯同学说它们的价格都在1k-,所以适合手头偏紧的我。搜索了一下发现实际上它们都不错,可是1k-的机器很多人都说有问题,里面估计都被动过手脚,也不知道是否可信。
而刘老爷(@nemoliu)则和我语重心长的说:“我当初想买个iPhone,可是没舍得。最后买了这个Nokia E61,用了一段时间觉得不爽。因为它不是开放系统,装软件都需要经过数字签名,所以软件很少,用起来没意思。所以,买东西最好还是一步到位,省得后悔。”
如果按照刘老爷所说,我是否还是应该考虑心仪过的iPhone 3G或者G1/G3呢?或者还有什么开放系统的手机可以选择了,前提是符合我这篇post所描述的需求。
昨天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应用的快捷键就有了约定。
今天写这个,就说说常见的有未提交修改,但是马上要去修改一些别的东西,如何建立所谓…
今天写这个,就说说常见的有未提交修改,但是马上要去修改一些别的东西,如何建立所谓“临时分支”。
在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提交。
在git里面,想修改一下刚才提交的内容,重新提交的话 git reset HEA…
在git里面,想修改一下刚才提交的内容,重新提交的话
git reset HEAD~1 git commit -m "your comment"
如果你只是想修改一下提交的注释
git commit -amend
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')