最近经常要在psql里输入很长很长很长很长的sql…要问有多长?答:很长,join多的都可以把hash-join temporary file搞到 “no space left on device” 的长…… ,然后蛋疼的case就是你写到很长的时候突然想修改句子中间的某个部分,注意是中间,不是开头也不是结尾,而你的光标还在行末朝你一闪一闪的… 你恨不得那时用鼠标能够点一下,但是很可惜这里是terminal,鼠标单击基本处于屏蔽状态;光标一个一个左移那是在考验你的毅力和忍耐力,你要时刻保持警惕不然就会漂移过头(一般此时容易睡着,所以那时我就很淡定的喝几口水,等光标移到后一般就可以去续杯了……);后来想到可以一个一个word的移啊,怎么这么傻… 由于bash默认是emacs的key binding,查了一下往前和往后移一个word的shortcut key是Meta-f和Meta-b,查这些花了1分钟不到,但是接下来2个多小时我一直在找这个Meta key…… 后来终于总算被我一个一个这么排列组合试出来了…… 做梦也没想到竟然是ESC… 可以想象一下同时按esc和b来往后移一个word的那种发自内心的不协调。 不过,最后还是顺利解决了(不然就没有标题,亦没有此文了),Terminal.app提供了一个选项帮助用户map option (就是alt) 到meta key,esc虽然还是meta,但显然我们更喜欢用大拇指去按alt (编者注:只要玩warcraft的人都知道用大拇指去按alt查看生命值那是多么重要的操作,哈哈) 最后附图一张,以作纪念:
说谎
media downloaded from google.cn music 说谎 - 林宥嘉 是有过几个不错对象 说起来并不寂寞孤单 可能我浪荡 让人家不安 才会 结果都阵亡 我没有什麽阴影魔障 你千万不要放在心上 我又不脆弱 何况那算什麽伤 反正爱情不就都这样 我没有说谎 我何必说谎 你懂我的 我对你从来就不会假装 我哪有说谎 请别以为你有多难忘 笑是真的不是我逞强 我好久没来这间餐厅 没想到已经换了装潢 角落那窗口 闻得到玫瑰花香 被你一说是有些印象 我没有说谎 我何必说谎 你知道的 我缺点之一就是很健忘 我哪有说谎 是很感谢今晚的相伴 但我竟然有些不习惯 我没有说谎 我何必说谎 爱一个人 没爱到难道就会怎麽样 别说我说谎 人生已经如此的艰难 有些事情就不要拆穿 我没有说谎 是爱情说谎 它带你来 骗我说 渴望的有可能有希望 我没有说谎 祝你做个幸福的新娘 我的心事请你就遗忘
狮子座
亚洲大哥ktv的最爱 -> 七月份的尾巴 media downloaded from google.cn music 狮子座 - 曾轶可 一个人的时候 不是不想你 一个人的时候 只是怕想你 一个人的时候 如果下起了雨 也会学你把伞 丢到一边 七月份的尾巴 你是狮子座 八月份的前奏 你是狮子座 相遇的时候 如果是个意外 离别的时候 意外的看不开 七月份的尾巴 你是狮子座 八月份的前奏 你是狮子座 相遇的时候 如果是个意外 离别的时候 意外的看不开 死性不改 偏偏不该用力的去爱 短发女人 也可以性感和可爱 人山又人海 别错过那一个等待 试一试去爱 伤害也比悲哀来的爽快 就这一次 我不想做一个歌颂者 如果可以 你也可以为我写首歌 请你别问 魔蝎座是几月份呢 请你别说 只有友谊才能万万岁
Update 38: 人不可以貌相
1. 海水也许可以斗量,但人绝对不可以貌相;有些人看上去不傻,其实很傻;有些人看上去很傻,其实也的确很傻;有些人不傻,却装的很傻;有些人很傻,不用装也很傻。反正不管傻不傻,装不装,貌相不可取,看人要看心。 这里反复强调的涵义在于说明我从来不以貌取人,希望大家不要以讹传讹,也希望大家不要以貌取我,点点点…… 2. 上面这么傻不啦唧的一绕,顿生联想,想到以前刘罗锅电视剧的结尾曲,歌词蛮有意思:故事里的事,说是就是不是也是;故事里的事,说不是就不是是也不是。平时多留心一下,你会发现其实并不是只有咱们伟大p.a.r.t.y喜欢讲故事哦~ 3. 我到现在还没搞清韩寒那杂志叫独唱团还是合唱团的,就是这样,不过同标题理,杂志亦不可以貌名,不管它是合唱还是独唱,只要唱了,并且是个团,那就凑活。 4. 据说过几天植物大战僵尸要出2了,本人第一反应:”不相信“,瞧,这已然成为忽悠成性,流言蜚语满天飞下可怜人们的本能反应,不禁再次感叹下达尔文200年前的伟大,如果你没有上面这个反应,请千万别担心,因为显然你也正在进化中… 还指不定哪个更适呢…… 好了,不废话,pvz 2,maybe next week,期待中…… 5. 关于starcraft 2:download好的可以联系我(我找你拷),没有down好的下周一可以联系我(我拷给你),非诚勿扰…… 6. 请再凝视一下标题,没有奖品,谢谢大家…
光辉岁月
media downloaded from google.cn music 光辉岁月 - Beyond 钟声响起归家的讯号 在他生命里 彷佛带点唏嘘 黑色肌肤给他的意义 是一生奉献 肤色斗争中 年月把拥有变做失去 疲倦的双眼带着期望 今天只有残留的躯壳 迎接光辉岁月 风雨中抱紧自由 一生经过彷徨的挣扎 自信可改变未来 问谁又能做到 可否不分肤色的界线 愿这土地里 不分你我高低 缤纷色彩显出的美丽 是因它没有 分开每种色彩 年月把拥有变做失去 疲倦的双眼带着期望 今天只有残留的躯壳 迎接光辉岁月 风雨中抱紧自由 一生经过彷徨的挣扎 自信可改变未来 问谁又能做到 … … 今天只有残留的躯壳 迎接光辉岁月 风雨中抱紧自由 一生经过彷徨的挣扎 自信可改变未来 问谁又能做到
InfoQ文章推荐:年度绩效考评是一个“彻头彻尾的谎言”
我就贴个地址,我不多说话: http://www.infoq.com/cn/news/2010/07/performance-appraisal as always,评论和文章一样精彩,百家争鸣,集思广益才是解决问题的好方法,真理永远是越辩越明的,so… enjoy~
Bash variable unset or empty?
前几天开发遇到的诡异问题,最后总结下来就是标题所描述的case,怎么判断一个bash的variable到底是unset (undefined)还是set (defined)了只是正好是empty (“”)呢? 为了避免环境不同以及软件版本不同造成更大的confusion,这里先统一一下环境,以下命令或script都在如下环境下运行: [cc lang=”bash” nowrap=”false”] $ uname -a Darwin mac.local 10.4.0 Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386 i386 [/cc] [cc lang=”bash”] $ bash –version GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0) Copyright (C) 2007 Free Software Foundation, Inc. [/cc] [Source of the confusion: “ -z “] 第一个solution是test的-z,也是confusion产生的根源。 test的manual这样解释-z: [cc lang=”bash”] NAME test, [ – condition evaluation utility SYNOPSIS test expression [ expression ] DESCRIPTION -z string True if the length of string is zero. [/cc] 想来它的意思是指-z判断的是variable定义了只是正好是zero length (“”),有实例为证: [cc lang=”bash”] $ foobar=”” $ [[ -z $foobar ]] && echo “foobar is empty” foobar is empty $ foobar=”awesome” $ [[ -z $foobar ]] || echo “foobar is $foobar” foobar is awesome [/cc] 故事本该到此结束,但是IBM developerworks的一篇文章打破了和谐,文章里面有一个例子: [cc lang=”bash”] if [ -z “$myvar” ] then echo “myvar is not defined” fi [/cc] 言下之意就是-z是undefined,由于文章较老(01 Apr 2000, April Fools’ Day? ),必须先实践一下才可决断,将信将疑的试了把: [cc lang=”bash”] $ unset foobar $ [[ -z $foobar ]] && echo “foobar is not defined (unset)” foobar is not defined (unset) $ [[ -z $XXX_foobar ]] && echo “not defined (unset)” not defined (unset) [/cc] 于是,如你所见,confuse产生,以至于接下来google到的任何信息都变的不太可信…… [拨开云雾见天日] 其实前面我说-z是source of the confusion略欠公平,真正的culprit其实是bash的option:nounset . [cc lang=”bash”] $ set -o allexport off braceexpand on emacs on errexit off errtrace off functrace off hashall on histexpand on history on ignoreeof off interactive-comments on keyword off monitor on noclobber off noexec off noglob off nolog off notify off nounset off onecmd off physical off pipefail off posix off privileged off verbose off vi off xtrace off [/cc] 如上可见,默认的nounset是off的,那究竟nounset是什么意思呢,man bash告诉了我们真相只有一个: [cc lang=”bash” nowrap=”false”] SHELL BUILTIN COMMANDS set [–abefhkmnptuvxBCHP] [-o option] [arg …] … … -o option-name … … nounset Same as -u. … … -u Treat unset variables as an error when performing parameter expansion. If expansion is attempted on an unset variable, the shell prints an error message, and, if not interactive, exits with a non-zero status. … … [/cc] 原来默认bash里面undefined的variable就是empty string,必须explicitly的声明set -o nounset或者set -u才能让unset的variable报错,test的-z确实就如man test所说只检验是否是zero length的string(IBM developerworks上的文章果然是April Fools…),只是bash default的undefined variable恰好就是empty string。 [cc lang=”bash”] $ set -u $ unset foobar $ [[ -z $foobar ]] && echo “foobar is not defined (unset)” -bash: foobar: unbound variable $ [[ -z $XXX_foobar ]] && echo “not defined (unset)” -bash: XXX_foobar: unbound variable [/cc] [cc lang=”bash”] $ set -o nounset $ foobar=”” $ [[ -z $foobar ]] && echo “foobar is empty” foobar is empty $ foobar=”awesome” $ [[ -z $foobar ]] || echo “foobar is $foobar” foobar is awesome [/cc]
TextMate's magic: bundles, customized commands, snippets and macros recording
之前尝试过一段时间macvim后又转回了TextMate,想来我还是一个比较visual的人。都说“真正的程序员”都是用vi或是emacs的,不过有时候看着东西想用鼠标点却不能点,必须脑子里去想一下命令或是什么shortcut有时是不是也太隔靴搔痒了,这和五笔输入法其实很类似,重码少很高效很快速,但中断思路… 就是这么一个道理。 不过用久了也确实不排除熟能生巧的,所以我也对上面那句所谓的名言没有任何意见,比如退出vim的:q我基本不用思考 :) 好了闲话又扯远了…… [Bundles] bundle应该是TextMate里名气最大的了,如果你熟悉eclipse的话,bundle其实和eclipse的plugin很像,虽然textmate也有plugin但bundle的应用显然要更为广泛,之于历史,特性,比较之类的请交给google,这不是我们这儿的focus。 一般TextMate一个release都会built-in一堆广泛使用并口碑较好的bundle,好的bundle很多以至于我本人从来是都是觉得bundle太多太眼花了,其实真正经常用到的bundle就这么几个,于是bundle的更新倒是成了更大的问题,好在TextMate继承了*nix的传统,会优先读取user home下的bundle,问题的解决于是变的异常之trivial。 以TextMate的ruby on rails bundle为例,安装只要几行命令: [cc lang=”bash” nowrap=”false”] mkdir -p ~/Library/Application\ Support/TextMate/Bundles cd ~/Library/Application\ Support/TextMate/Bundles git clone git://github.com/drnic/ruby-on-rails-tmbundle.git “Ruby on Rails.tmbundle” osascript -e ‘tell app “TextMate” to reload bundles’ [/cc] 下次更新只要git pull一下然后tell textmate to reload bundles就万事大吉了。 [Commands & Snippets] Command和Snippet是Bundle里面真正工作的unit,按照我个人的理解,snippet是textmate自己internal的解释执行,而command则是借助外部命令,因此command也比snippet相对更为强大,因为我们可以用ruby,python,perl,bash甚至php来进行文本处理,最后一点让command比snippet强大成为必然,那便是command最后执行的结果不但可以作为literal的text insert到editor中去,甚至也可以作为snippet而insert,想象一下… so powerful! 这里只举一个简单的例子,比如我最近写php code老是对每一行最后的“;”诟病不少,不是忘了就是觉得老是要移到行末然后append那个分号很stupid,于是一个模仿以前eclipse对java code的分号处理的command应运而生,本质上就是我在这一行随便哪个位置敲一个”;”,如果行末没有分号的话就直接append到行末,如果已经存在就把光标移到最后方便我敲回车换行… Command本身的code用ruby实现,并bind到”;”这个key,scope的话只针对source.php: [cc lang=”ruby”] #!/usr/bin/env ruby line = STDIN.read.rstrip.gsub(‘$’, ‘\$’) if(line =~ /;$/) print line else print “#{line};” end [/cc] [Macro] 这个就不详细介绍了,vim也支持,本质上是一样的,有时候会发现有些特性用command或是snippet实现有点麻烦,但用macro处理则突然柳暗花明了,也举一个简单的例子,还是以eclipse里面missing的feature为例,比如duplicate line down和duplicate line up,或者switch line up和switch line down,textmate对这些支持的不全面也不好,不过用macro录好并bind到熟悉的shortcut key后,一切又恢复井然有序了,record完后的duplicate line up如下: [cc lang=”ruby”] moveToBeginningOfLine: moveToEndOfLineAndModifySelection: copy: moveUp: playMacroWithOptions: deleteBackward: paste: [/cc] 不用过分关心macro的内容,不过我们也可以发现macro里面其实还可以再调用macro(playMacroWithOptions:),这让macro本身更增添了一份灵活。
Update 37: 世界杯后遗症
1. 后遗症之一:晚上睡不着,早上起不来…… 2. 后遗症之二:开始打实况,此举属于找replacement; 3. 后遗症之三:对foosball突然产生浓厚兴趣,注意这里是“突然”; 4. 后遗症之四:就是在时刻关注自己哪些举动属于后遗症; 5. 好了不说后遗症了,话说最近开发频繁用到SQL,真是哪壶不开提哪壶,遂决定恶补之,amazon上选秀搜SQL,第一轮第一顺位属于“Teach Yourself SQL in 10 minutes”,国内亦有中文版,即是大家熟悉的“SQL必知必会”,一瞥书名“哇,10 minutes”,于是奋不顾身点开来看,浏览了下reviews,扫描了下menu,还“click to look inside”了下,马上下意识看下时钟,wokao,15 mintues过去了…… 6. 不要迷恋章鱼哥,哥只是个传说…… 7. 世界上先有阴谋,才有阴谋论,注意这里不是鸡和蛋的关系,而是鸡妈妈和鸡宝宝的关系,鸡巴爸在一旁表示情绪稳定.