Leopard下如何让你的sudo不需要输密码

在Snow Leopard的Terminal里面用sudo的时候总是需要输入密码,而在单位的FreeBSD服务器上则不需要。我觉得从安全角度来说这个密码用处不大,有了反而会浪费时间。

搜索了一下,发现要这样做

修改/etc/sudoers文件(记得sudo vi它,存的时候要w!),去掉这一行前面的#号:

%wheel ALL=(ALL) NOPASSWD: ALL

然后执行下面命令,记得将your_username替换为你的用户名:

sudo dscl . append /Groups/wheel GroupMembership your_username

从此就不需要在sudo的时候输入密码了。

Cassandra的一致性级别

翻译Cassandra文档中的一段。

写一致性级别Write

ZERO
不保证一致。写操作在后台异步执行。除非CASSANDRA-685 修正,否则当太多写错作排队的时候,buffer会膨胀,后果很坏。
ANY
(需要0.6的Cassandra)保证至少写入到1个节点中,包括示意(hinted)的接收者。
ONE
保证写操作在回复客户端前至少已经进入1个节点的commit log和memory table。
QUORUM
保证写操作在回复客户端前至少被写入到 (<复制因数> / 2 + 1)个节点中。
ALL
保证写操作在回复客户端前已经被写入到 <复制因数> 个节点中。任何节点如果没有响应,则操作失败。

读一致性级别别Read

ZERO
不支持,因为没有意义。
ANY
不支持,应该使用ONE来代替。
ONE
将会返回第一个有响应结果的节点返回的数据。在使用ConsistencyLevel.ONE的时候,一致性检查永远是在后台线程中来修复一致性问题。这意味着如果开始的读取得到了旧数据时后续的调用可以返回正确的数据(这叫做读取修复 read repair)
QUORUM
查询所有的节点,一但绝大多数复制节点返回了结果,返回具有最新的时间戳的纪录。其余复制节点的结果会在后台进行检查。
ALL
查询所有的节点,一但所有复制节点返回了结果,返回具有最新的时间戳的纪录。任何节点如果没有响应,则操作失败。

The Perfect Is the Enemy of the Good

The perfect is the enemy of the good. The best is the enemy of the good. – Voltaire

Nothing is perfect and waiting for the perfect moment or killing yourself trying to ensure that every thing your hand touches is done perfectly is a sure way to not get anything done at all.

Getting caught up in the idea that your desk, work bench, house, or office must be in perfect shape for you to really get stuff done can just as easily result in getting nothing done. Learn to recognize what’s good enough.

Perfectionism kills me.

回复一位敬佩的前端工程师kejun的一篇博文,更好的标注UI规格 我能理解作为前…

回复一位敬佩的前端工程师kejun的一篇博文,更好的标注UI规格

我能理解作为前端工程师为什么希望这样标注,但是这些标注的实用价值很低,原因如下:

  1. 这些标注都是“文档”,或者说“契约”。过度详细的契约对产品的实现没有帮助。敏捷宣言里面说可用的软件重于完备的文档。
  2. 之所以会产生这些文档,沟通是问题。如果前端和Graphical designer不在一个团队,就会希望通过契约解决沟通问题,这样只能让沟通更低效。而且在这篇文章中所说的标注的方式的区别,是因为Graphical designer和前端工程师的“语言“不通,解决方法就是更加紧密的坐在一起工作,但是指望两个人用同样的思想沟通是不现实的。
  3. 精确到像素的设计(Hifi prototype)真的应该精确到像素么?敏捷软件开发是迭代的。产品应该可以持续的release,每个release前都有验收和验证,对于像素级别的精确如果在验收的时候能够发现,说明这个精确到像素的设计是有意义的,那么我们才需要花更多的时间去优化它。否则它也许是可以忍受的。所以,预先设计的过程中的精确到像素的约定不如退而求神似,这样对迭代也更加有利。

“Three Times a Lady” is a 1978 single …

“Three Times a Lady” is a 1978 single from the funk/soul band the Commodores, from their 1978 album Natural High. It was produced by James Anthony Carmichael and the Commodores and it was the most popular track of the album.

In an appearance on The Early Show on June 12, 2009, Richie said he was inspired to write it by a comment his father made about his mother. Reportedly his father said to his mother “I love you. I want you. I need you. Forever” hence the three times. It became the Commodores’s first Billboard Hot 100 number-one hit, topping the chart for two weeks on August 12, 1978. [2]. It was also the only Motown song to reach the Top 10 that year. The song also spent three weeks at #1 on the adult contemporary chart. It was one of only a few Motown singles to reach the top spot in the UK. In the years since the Commodores had started in 1974 it has been one of their most emotional songs since “You Don’t Know That I Know” from the album Caught in the Act in 1975.

The original Commodores’ version of the song was included as the final track on Lionel Richie’s greatest hits compilation album Back To Front, released in 1992.

http://en.wikipedia.org/wiki/Three_Times_a_Lady

Macbook pro的DVD刻录失败,清除灰尘后修复

这两天要用我的MBP(Mid 2009 MC118)刻录一张DVD却总是失败,告诉我使用的DVD盘片不兼容,或者刻录速度太快(我试验了1, 2, 4, 8都不行),让我尝试其它品牌的盘片。但是之前我用的威宝的日产DVD-R一直没有这个问题,所以查看了一下system.log,发现报错的内容是这样的:

Disk Utility[378]: Disk Utility: Burn to DVD-R (TYG02) media in MATSHITA DVD-R   UJ-868 (KB19) via ATAPI failed with error 0x8002006D and sense (3/73/03 Medium Error, Power calibration area error).

Google到了很多信息,讨论的很复杂,大意就是光驱坏掉了,或者锁了区码。看到了这篇比较有用Can’t burn DVD’s with a MacBook Pro?,说先试试清理尘土。

然后就打开了MBP后盖在光驱的几个角和缝的地方用皮老虎吹了一下(如果你的嘴很有力且不乱喷吐沫星子,那么也可以用嘴吹,但是这样很危险……),尘土还是挺多的。而后开机刻录就好了。

ADSL被联通(北京网通)的“京城时讯”劫持!

最近发现我访问一些站点的时候(如昨晚访问www.apple.com的时候)我发现页面弹出广告,但问题是apple.com的英文网站是不可能弹出中文广告的。

网通“京城时讯”弹出广告的截图

今天我又重现了这个问题,仔细看了下出问题的原因,页面的url没有变,dns也是正常的。应该只是http请求被劫持。可恨的是它不是注入式的劫持(也就是将广告的代码插入到</body>之前,而是使用了非常简单的iframe劫持,这种初级的劫持手段会造成很多网站访问不正常。可恨的是,在这样的劫持下你的个人隐私就完全没有保证了。代码是这样的:


<html>
<meta http-equiv='Pragma' content='no-cache'><head><title></title>
<script LangUage='JavaScript'>
try{var tmp=parent.window.location.href}catch(e){window.location.reload();}
</script>
</head>
<frameset framespacing=0 border=0 rows='*,0' frameborder=0 onload="window.lxmainframe.location='http://61.172.192.88/city/index.html?url='+window.location;"><frame name='lxmainframe' src='about:blank' scrolling='auto'><frame name='lxblankframe' src='about:blank' scrolling='no'></frameset>
</html>

作为一个mac user,我显然不是中病毒了。google一下也发现很多人都遇到了“京城时讯”的绑架。我刚才给10010打电话投诉,还好虽然停机保号但是可以拨10010。先是被转到网络部,让我自己到www.jcxinxi.com自己注销,让我挂电话。我马上试验,发现根本找不到她说的登录的地方,让她们告诉我详细注销步骤,她让我等了有3分钟左右才告诉我需要点那个“会员注销”。然后我又继续让她转接专门负责投诉的“上级”,那个上级向我解释了“给我看广告是为我好,这个服务是免费赠送以后”,我只能告诉他我办包年服务的时候的单子上面没有说网通可以免费赠送给我这个服务的时候才客气的让我留下联系方式说再联系。我知道这种事情“don’t blame the people, blame the game.”,所以我接受人家的电话服务。把这倒霉的该死的差劲ADSL服务Blame到底,投诉到底!

我投诉的时候提了几个理由:

  1. 联通在没有最终用户许可的情况下私自给我绑服务。
  2. 你们嵌入网站的iframe的方式直接造成很多网站访问不了。
  3. 给我看商业广告,jcxinxi可以从后向商户收费。侵犯了我这个最终用户的利益。尤其是我是有偿使用ADSL服务且我从来没有同意接收广告。
  4. 你们窃取我的HTTP Request是严重的侵犯我的隐私。
  5. 你们影响了我访问网站的显示效果,也是对第三方利益的侵犯。

周六日重构OpenParty App中发现的一些问题

Open Party App是我们在为OpenParty开发的新网站,上面集成了会员注册报名参加活动等功能。我们把他放在Google Code上面以开源crowd sourcing的方式开发。Django我是业余水平,在这个项目里面继续磨练。上周末正好有空开发,顺便重构了一下代码,我把其中发现的一些bad smell纪录下来,给和我们一样的Django业余团队参考。

  1. {% ifequal event.is_upcoming 1%}

    这是错误的,本意是{% if event.is_upcoming %},因为它本身就是个Boolean

  2. <a class=”gray_link”>看看谁参加了活动</a>

    gray_link是一个为样式命名的css class,但是css class的名字应该是一个结构语义的东西。也就是说css class应该是What it is而不是How it looks like。可以命名为<a class=”who-participated”>看看谁参加了活动</a>

  3. views.py里面return render_to_response(‘core/topic.html’, locals(), context_instance=RequestContext(request))

    使用locals()我上次就发过邮件,这样做是不好的。因为locals会鼓励你创建很多没有意义的本地变量,将它们一股脑的传递到template。造成template里面由很多的判断逻辑,但是这些逻辑本身应该是在models层搞定的。当你从template重构这些晦涩复杂的判断逻辑的时候,你会发现问题可能就出在views.py里面那一个locals()。没错,我说的就是topics.html这个模版,看看判断是否可以投票的那部分逻辑,实在是太复杂了,我不得不给他写测试,花了不少的时间重构。在模版里面你总是会思考一些措辞和样式的问题,而忘记了分支逻辑的复杂,这种代码经常是有很多的bug的,而且它们非常难于维护和修复。一定要将这种复杂度封装在model层并进行测试才可以。

  4. 没有意义的判断

    我看到很多if model.is_accepted == True: return True; else: return False这样的代码。我是在不理解为什么可能出现这样的代码……请注意这个和错误1差不多,都属于非常坏的重复代码。

  5. 测试

    请注意,我们没有赶时间。我们不太需要临时性的代码,要随时注意代码的可维护性,因为我们是一个团队。测试就是代码的文档,请注意尽量尝试测试先行,如果不行也注意让你的model得到充分的测试。当你发现Event和Topic这两个Model的创建需要费这么多的周折的时候,你是否发现你的Model抽象有问题?你是否有重构的冲动,将它们的创建行为变得更简单。

  6. 命名

    is_arranged这样的命名可能不太容易理解,注释上面写的是”’该话题是否已经加入到活动,并且活动尚未开始”’。那么如果keep stupid的话我觉得,is_arranged_in_coming_event是不是更容易理解呢?

    is_shown,注释”’该话题所属活动是否正在进行或已经结束”’,这个就很难理解了。因为你看到“应该显示”这样一个名字的时候,知道后面的意思是活动正在进行或结束了么?is_arranged_event_started_or_closed也许更容易理解?

这都是一些重构建议,有一部分问题我已经重构过了。大家都在参加OpenParty的Coding Dojo,一起持续重构吧!

在Mac下的Pydev里面几个常用的快捷键 Cmd+e切换tab,配合输入tab…

在Mac下的Pydev里面几个常用的快捷键

Cmd+e
切换tab,配合输入tab文件的名字的前几个可以快速在上下文中切换tab
Cmd+d
删除本行
Cmd+Option+上
复制本行一次(Duplicate this line)
Cmd+Shift+R
快速打开文件,注意没有通配符也不是smart匹配……
Cmd+Shift+F11
Rerun,常用在运行当前的单元测试
Cmd+Option+r

Rename refactory,重命名重构,非常实用。不过少数情况下这个重构不安全,注意diff
Cmd+Shift+O
自动import,缺点是它会搅乱你精心设计的import顺序,不在乎的朋友非常方便,可以让你的coding工作变得非常流畅。不过如果你开启auto import以后这个快捷键就不需要了,但是auto import的副作用就是它经常import那些明明不需要import的东西,如self、len它都会傻傻的import。
Cmd+Shift+F
在当前Folder搜索,前提是你在文件浏览部分选中了一个Folder

刚才写了一个识别网站charset的正则,因为目前写一个网页抓取的工具,里面对中…

刚才写了一个识别网站charset的正则,因为目前写一个网页抓取的工具,里面对中文url做encoding的时候需要先识别页面的编码,可惜UrlEncoding没有强制使用UTF-8编码,真是烦人。下面是一个python下的正则表达是的字面文本。

r'<meta.*(?:(?:charset\s*=\s*["|\']?)|(?:charset.*content\s*=\s*["|\']\s*))([\d|\w|\-]+)[;|"|\'|\s]'