Trade Off

supercalifragilisticexpialidocious

Two Words

看到python捕获SIGINT event的文档,上面说signal这个包里的东西的功能是set handler for asynchronous event,于是背了下这两个词——asynchronous和synchronous,简称分别是async和sync,由于这两个词比较长,我们通常都用简称,而且发音也都正好不会破坏。

asynchronous: 美 [eɪ'sɪŋkrənəs]
synchronous:  美 ['sɪŋkrənəs]

以上音标来自dict.cn

Here is a minimal example program. It uses the alarm() function to limit the time spent waiting to open a file; this is useful if the file is for a serial device that may not be turned on, which would normally cause the os.open() to hang indefinitely. The solution is to set a 5-second alarm before opening the file; if the operation takes too long, the alarm signal will be sent, and the handler raises an exception.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import signal, os

def handler(signum, frame):
    print 'Signal handler called with signal', signum
    raise IOError("Couldn't open device!")

# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

# This open() may hang indefinitely
fd = os.open('/dev/ttyS0', os.O_RDWR)

signal.alarm(0)          # Disable the alarm

Give Up Ruby

感觉中间隔了好久,最终还是把study ruby给放弃了,顺便找了个充足的理由——在没学好当下这门语言之前,不要再尝试其他的。

虽然一个coder要保持技术的敏感性与前瞻性,但频繁换编程语言实在不是一件好事,我现在仍然对于自己涉猎太多编程语言而感到烦躁,主要就是会的太多而不精,一旦用上了还真拿不出手,那种感觉很不爽!所以,暂且不要跟着《Pragmatic Programmer》中说得那样来了。

暂且这样吧。

Ajax Cache on Ie

我们发现在IE浏览器中有些ajax操作表面看起来像是没有被执行一样,但手动刷新页面后发现真的执行过了刚刚的操作,进而发现在IE下ajax操作是有cache的。

hack的解决方法就是在request中加random参数,没啥实际效果,纯粹是不让cache出现而已。当然稍好一点的做法就是在jquery(我们是用jquery的)的$.ajax中加入参数{cache: false}即可。

如果你也遇到类似的效果,先看看是不是没有把cache写成false,默认是true的。

在MacOS上配置dnsmasq

最近那个伟大的墙把我们敬爱的git大神封锁了,无奈很多代码都托管在上面,其中也不乏很多商业项目。自己的几个blog也都放在上面,倒不是因为在那里免费,而是这已然已经成为程序员们的一种生活style。

ubuntu下有个dnsmasq可以连接别的dns,这样能够避免dns污染导致上不了github的问题。相关配置不算难,下面记录一下在MacOS下的dnsmasq配置方法。

1.使用brew安装dnsmasq

brew install dnsmasq

2.修改一下dnsmasq的配置文件名字

cp /usr/local/opt/dnsmasq/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf

3.加入MacOS的启动项中

sudo cp -fv /usr/local/opt/dnsmasq/*.plist /Library/LaunchDaemons

4.加载并启动dnsmasq,如果没有出现什么错误就开始配置dnsmasq

sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist

5.配置dnsmasq,把no-resolve的注释去掉,加入server=xxx.xxx.xxx.xxx#nnnn

mate /usr/local/etc/dnsmasq.conf

server的值可以从dns.v2ex.com中找到,“#”后面的是端口号,比如v2ex那个用3389

6.重启dnsmasq

sudo launchctl stop homebrew.mxcl.dnsmasq

其实无需再执行sudo launchctl start homebrew.mxcl.dnsmasq这句了,因为你load了plist进去就已经启动了,如果此时stop的话会再自动start,所以没必要再start。要想关闭请使用unload(就修改上面的4即可)

7.把网络的dns设置成127.0.0.1,这样你才能用自己的dns服务

至此,我们的git大神就回归了。

Merge Partition Got Couldn’t Modify Partition Map Because File System Verification Failed Error

前几天需要把本机的VMware虚拟机文件拷到工作机器上用,但文件比较大,有30G,U盘不行,无线共享太慢,网线直连无奈工作机器百兆网卡不给力还是慢,分割了我的TimeMachine备份盘,但用完后再合并划分出去的分区就出问题了,提示:

Couldn’t modify partition map because file system verification failed error

此时可以Verify一下这个硬盘,如果有错误就repair,相信这里没问题的都应该可以再合并了吧,我这里还是出问题了,在提示repair complete之后出现了一个错误,好像是boot什么的错误,建议我reformat,再弄backup file,backup file too many??记不清楚了,再合并一次分区,不行的话果断erase掉,再backup,反正现在backup都用不上,趁着清理一下也好。

Gets Method in Ruby

Important: Also notice that we’re using STDIN.gets instead of plain ‘ol gets. That is because if there is stuff in ARGV, the default gets method tries to treat the first one as a file and read from that. To read from the user’s input (i.e., stdin) in such a situation, you have to use it STDIN.gets explicitly.

Ruby学习记录

在wanglei的鼓动下,我开始了探寻Ruby这款被他成为做产品的语言,同时,Ruby对我来说也是上天的安排——我的生日石就是Ruby~虽然如此,其实我早就开始了Ruby的探索,曾经买过《松本行弘的程序世界》、《Ruby变成语言》这两本很好的书,无奈当时怎么看也看不进去,就暂且放弃了,相反,更喜欢了Python。

最近的工作语言一直是Python,感觉很好,不过Ruby对我来说更显得优美一点,主要是喜欢他们的文档,非常全面,但不喜欢TA的快速变更,特别是ROR,当时买的书和网上的版本很难契合,我又不那么喜欢用低版本的ROR,学起来就痛苦一点,最终还是放弃了。

前几天看到Learn Python the Hard Way发布了3.0版,同时网站也更名为Learn Code the Hard Way,十分符合技术人士的胃口,当然用来入门还是可以的,深入的话还是得靠自己阅读更高级的书和工作实践。这个网站现在也有Ruby、C、Regex、SQL等等教程,于是在没有书的情况下,我就从这里学习Ruby了。

现在已经学了基本的puts和gets,能写超小的CLI了,不过还得学点loop什么的才可以,而且各种object的method也得熟悉,否则很痛苦:(

LESS Debug

默认less使用production的env,但有时候出现语法错误不能正常编译下去很难调试,所以一般使用development的env开发。

在引用less之前加入:

1
var less={env: "development"};

这样就让less成为development环境了。如果不行的话可以使用Chrome的console,直接给less.env赋值,这只是针对上面方法不能用的时候。赋值好后调用less.refresh(),可以让less做一次刷新,如果有错误就会在页面顶部出现。

Ie6

这几天都卡在ie6的兼容问题上了,都要上线了才想到要去用ie来看下效果,前一次看的时候没什么问题,还很欣慰,怎么会这么安全?最近用ie6、360、搜狗一看,直接无法接受了,但原网站的最大用户群就是360,现在搞不清楚360用的是不是ie6的内核,虽然它自称是ie8的内核了,但我今天下载了用仍然是ie6,然后他又会提示你可以升级到ie8内核,真是流氓啊。我们现在如果能够把网站调整到ie6下也正常显示,就基本不怕ie7、8、9了,相信不管一款软件多么垃圾,随着版本的提升,也会越来越好,要不然根本都不可能升级,也违背社会的发展啊。。。

给开源项目做贡献了

惭愧,第一次给开源项目做贡献竟然是现在,其实早就想帮着做点啥了,无奈技术能力不足,终于发现一个机会,给progit的README文档添加MacOS用户的使用方式,可惜噩梦也是这样开始的。

一开始添加了usage for macos users,commit然后push,作者和我说少一个blank line,我加了再commit和push,另一个开发者和我说你不应该多次commit,需要说清楚commit的工作而不是一味用commit修改,我改好了发现remote的版本和本地不一样,因为我是在上一个版本的基础上amend后再提交的,无奈之下我merge了remote然后commit又push,这时候作者跳出来一对一教我怎么做了,有不少细节地方需要注意,比如完全的command line可以在markdown中用tab的indent,而list的indent和tab是完全不一样的。。。又给我罗列了markdown的语法。我让他写一个正确的给我看一下,他真的就给我写了一遍,但是他给希望让别人来做这部分工作而不是自己来做,并不是自己能力不足什么的,光是在我这里付出的时间就远超编辑好几个版本的README了。这点在国内开发者的身上很难发现吧?!

最后当然是pull request被接受了:)这次经历很难得!