看到Fenng同学共享了自己的书柜的照片,我也想把我的书柜照个像放上去。
这几年买书也上万了,当然不都是计算机的书,还有很多闲书 
经典的技术书籍占了我的书柜的绝大部分区域。还有一些漫画书,大都是大学时代留下来的。 
一些放不下的书就随手放在转角的书柜里。 
为书花钱大都值得,不过技术书容易过时,处理的时候又舍不得。即使是好书,它也会对你的移动性产生不良的影响,搬家的时候这些东西可是太沉了。
you are coming a long way…
看到Fenng同学共享了自己的书柜的照片,我也想把我的书柜照个像放上去。
这几年买书也上万了,当然不都是计算机的书,还有很多闲书 
经典的技术书籍占了我的书柜的绝大部分区域。还有一些漫画书,大都是大学时代留下来的。 
一些放不下的书就随手放在转角的书柜里。 
为书花钱大都值得,不过技术书容易过时,处理的时候又舍不得。即使是好书,它也会对你的移动性产生不良的影响,搬家的时候这些东西可是太沉了。
我们招聘美工的过程中,有一道题:“一个UI的Hifi prototype,客户感觉系统有些压抑,希望修改一下这个设计”。前面两个面试者我们都让他当场做,可是结果不理想,主要原因是他们不习惯Mac下的Photoshop或者Fireworks。所以第三个面试的时候,我们让她回家试试。结果让我很失望,主要原因是美工的思路不对。她修改了不少细节,修改了几个按钮的设计,加上了水晶的反光,修改了Tab设计,加上了玻璃的风格,可是她无视了对比度过低造成的界面太灰的问题,也无视了排版的一些基本的禁忌(比如一致性)。
我非常认同的一句话是对于美工的日常设计90%都是排版工作。那么我列出我对这个作业的考察点:
它们的优先级是60%,30%,10%,也就是说排版和颜色最为重要。
这不是一个系统的想法,并不适用于美工的日常工作,我主要强调做这样事情的一个思路,美工需要用自己的工具来引导客户。
代码重构(Code Refactoring)是一个编程的术语:在保留原有的功能的情况下改变计算机程序代码让其容易被修改为适应变化、增加可读性或者简化结构。这个实践对于产生高质量程序非常重要,而且这种想法不仅限于编程概念,也完全可以用在生活上。我的blog里面也会经常用到这个词(重构我人生),所以今天我决定就把生活的记录工具blog给重构一下
对于程序员朋友,这里插播一个问题,我发现中文的wikipedia对于代码重构(Code Refactoring)的定义非常的不准确,摘抄如下:
代码重构指对软件代码做任何更动以增加可读性或者简化结构而不影响输出结果。软件重构需要借助工具完成,重构工具能够修改代码同时修改所有引用该代码的地方。在极限编程的方法学中,重构需要单元测试来支持。
为什么呢?因为martin folwer使用的定义和英文wikipedia这个一致:
Code refactoring is the process of changing a computer program’s code to make it amenable to change, improve its readability, or simplify its structure, while preserving its existing functionality.
中文解释里面所说的重构需要借助工具完成支持纯属放屁。而且遗忘了重构的一个目的是为了让代码易于维护那么就没有说明重构的经济意义。所以,大家看看我上面那个翻译如何?一起修改一下我去修改一下wikipedia的条目。
回到我要说的blog重构的话题。我现在的blog使用的是Wordpress,但是再往前推我还在Live Space和BlogJava写Blog。但是那个时候没有使用Tag来管理blog post,所以都使用了很复杂的分类(Directory),再后来我把Live Space的blog通过MSN Space mover迁移到了现在你阅读的这里,所以那些目录也就都被迁移过来了。
所以多分类Category是我第一个要重构的地方。原因在于分类最早的设计是一个严格的树形结构,也就是分类是一个逐级缩小范围的概念,它适合于自上而下的查找。比较常见的就是传统电子商务网站的目录和网站的树形导航。但是这两年大家发现很多人的阅读习惯并不是这样的,尤其对于blog这样的形式。blog我们分成两种场景来分析分类的使用:
啰嗦了半天,其实行动很简单。我需要把现在复杂的Category转换为Tags,还有添加新的简单分类“Tech.技术”和“NoneTech.非技术”。在Wordpress里面这个很简单,因为在wordpress里面Tag和Category实际上是同样的东西,但支持不同的显示方式。在wordpress的后台的Manage->Categories下面有一个category to tag converter的链接进去选择你想要转换的Category然后转换一下就OK了。一个简单的操作以后这些Category就都不见了。那么所有的文章就都跑到Uncategoires下面了。我好需要重新做一下分类,这是个体力活……不过我使用了Wordpress的客户端来实现。
那么下一步就是重构blog的下一个话题,选择一个客户端工具来更新你的blog。我试用了ecto和MarsEdit,它们是mac下两个有名的blog客户端,它们对blog的管理功能都差不多,但是编辑方式不一样,其中ecto的编辑器是所见即所得的,而MarsEdit是一个直接写HTML源码然后预览的界面。我对HTML烂熟,所以用MarsEdit没有困难。大家可以根据自己的需求选择,它们都是需要交注册费的。试用客户端的好处就是不用忍受浏览器的崩溃,不用忍受网络闪断造成的提交失败,不用因为写post时间太久而session过期,可以方便的存在本地,可以在离线的方式下修改/添加blog post,这些功能可以帮助你频繁的写blog,而不是每次都需要准备很久来登陆->新建post。我其实已经试用了几天Ecto了,比较满意,但是Ecto的试用版不能选择取回条目的数量(不知道注册以后是否可以?),所以对于修改分类这样的任务来说MarsEdit才可以修改我全部的项目。
在整理blog post的时候,我发现我这里有很多以前留下的Twitter聚合内容,我把它们都删掉了。以前我曾经想把micro blogging(微博客)的内容也放到blog里面,可是我发现有了FriendsFeed这样的工具以后我就不需要用blog来聚合了,这样是一种明显的Bad smell-重复。冰云同学批评过我聚合Twitter,他说的很对,现在我本人也很反感聚合Twitter,有这种行为的人的blog一律退订。
上面说的这些就是今天重构的实践,之前我还做过几个实践:保持只有一个blog服务(不需要同时使用Space和blogjava),如果不满意BSP(Blog service provider),那就自己买空间架一个Wordpress。定时备份你的Blog,并且最好有工具让你的blog可以转移成中立的源文件(如SQL、XML),方便以后迁移,选择BSP也可以以这个为标准。
最后总结一下我提到的重构blog的几个实践:
如果以后还有其它重构行为我还会更新这个post。今天已经好累了 -。。-
工具就是进行生产劳动时所使用的器具。工具的目的在于提高生产劳动的效率。感慨于一些真正的Geek的blog,我也想了一些工具对于我的重要意义,用来作为下一段的目标。
人家说工欲善其事必先利其器,还有磨刀不误砍柴工,实际上在说明工具对提高工作效率真的非常有意义。
今年的我,上游离于前端开发和后端开发之间,同时我还要在两个不同的团队(ThoughtWorks Studio的Cruise和Mingle两个产品开发团队)之间切换,所以对于我来说频繁的需要Context Switch(工作环境切换)。两个团队所使用的技术也不同。
我想对于一个强悍的程序员(最近比较崇拜的delphij、hdcola、云风等神人)来说做这样的环境切换也许还是可以的。可是对于我这个不善于multi-task工作的人来说,马上让脑子适应不同环境,熟练使用不同的工具就成为了一个挑战。
所以,结果是,这一年中,我基本上对于这些工具很少深入学习,基本上就是凑合着使用,如果没有通用的快捷键我就懒得去翻手册学习了。结果就是使用HG的queue功能(超级有用的qnew、qrm、qpop、qpush系列)的时候经常把自己搞崩溃(今年居然有和李彦辉教授在pair的时候搞丢了2个小时内的修改,相当丢人),所以后来在使用HG的时候异常小心,生活在心理阴影下面。而对于Git,我居然完全没有使用过stash功能(和HG的queue类似)。昨天胡凯还问我是否用过bisect,是一个折半查找坏提交的功能(在HG和Git里面有等价的功能),我完全没有使用过。因为这些精巧的基于命令行的源代码控制工具对于程序员来说非常之重要,从这个角度体现了我对于工具的不求甚解达到了什么程度。突然想到梅兰芳里面十三燕那个很棒的台词“输不丢人,怕才丢人”,用不好工具没事,但是害怕学习用工具那就是很丢人的问题了。
那么自我分析的结果就是,由于环境切换,我缺少了专注,形成了对学习环境中的工具的恐惧,最后影响了我的工作效率。
下面的内容用来自勉,分析一下工具对于我到底有多么的重要(也就是说这个是我使用和学习工具中比较Happy的部分)。对于还没有注意到工具重要性的朋友,可以关注一下,看看是否有所借鉴。
下面要分析一下我做的不好的地方,迎来跟踪我的改进:
暂时先准备写到这里,其它的关于工具的话题我会另开post来总结。(最后更新于2008年12越21日)
因为是feedburner的feeds,所以我就转过来。
Concurrency is a Myth in Ruby
Concurrency introduces parallelism into our applications, and threading is, of course, one way to achieve concurrency. But it turns out that in Ruby, this relation is not transitive: execution parallelism is not the same thing as threading. In fact, if you’re looking for parallelism in your Ruby application, you should be looking at process parallelism instead. So why is that?
Ruby under the covers: Global Interpreter Lock
To understand what’s going on, we need to take a closer look at the Ruby runtime. Whenever you launch a Ruby application, an instance of a Ruby interpreter is launched to parse your code, build an AST tree, and then execute the application you’ve requested – thankfully, all of this is transparent to the user. However, as part of this runtime, the interpreter also instantiates an instance of a Global Interpreter Lock (or more affectionately known as GIL), which is the culprit of our lack of concurrency:
Global Interpreter Lock is a mutual exclusion lock held by a programming language interpreter thread to avoid sharing code that is not thread-safe with other threads. There is always one GIL for one interpreter process.Usage of a Global Interpreter Lock in a language effectively limits concurrency of a single interpreter process with multiple threads — there is no or very little increase in speed when running the process on a multiprocessor machine.
Deciphering the Global Interpreter Lock
To make this a little less abstract, let’s first look at Ruby 1.8. First, a single OS thread is allocated for the Ruby interpreter, a GIL lock is instantiated, and Ruby threads (‘Green Threads‘), are spooled up by our program. As you may have guessed, there is no way for this Ruby process to take advantage of multiple cores: there is only one kernel thread available, hence only one Ruby thread can execute at a time.
Ruby 1.9 looks much more promising! Now we have many native threads attached to our Ruby interpreter, but now the GIL is the bottleneck. The interpreter guards itself against non thread-safe code (your code, and native extensions) by only allowing a single thread to execute at a time. End effect: Ruby MRI process, or any other language which has a Global Interpreter Lock (Python, for example, has a very similar threading model to Ruby 1.9) will never take advantage of multiple cores! If you have a dual core CPU, you’ll have to run two separate processes.
JRuby is, in fact, the only Ruby implementation that will allow you to natively scale your Ruby code across multiple cores. By compiling Ruby to bytecode and executing it on the JVM, Ruby threads are mapped to OS threads without a GIL in between – that’s at least one reason to look into JRuby.
Process parallelism
The implications of the GIL are surprising at first, but it turns out the solution to this problem is not all that complex: instead of thinking in threads, think how you could split the workload between different processes. Not only will you bypass an entire class of problems associated with concurrent programming (it’s hard!), but you are also much more likely to end up with a horizontally scalable architecture for your application. Here are the steps:
- Partition the work, or decompose your application
- Add a communications / work queue (Starling, Beanstalkd, RabbitMQ)
- Fork, or run multiple instances of you application
- Not surprisingly, many of the Ruby applications have already adopted this strategy: a typical Rails deployments is powered by a cluster of app servers (Mongrel, Ebb, Thin), and alternative strategies like EventMachine, and Revactor (equivalents of Twisted in Python) are gaining ground as a simple way to defer and parallelize your network IO without introducing threads into your application.
虽然本文是介绍Ruby1.8、1.9和JRuby对线程的不同实现。但是却清晰的解释了线程安全的意义,还有为什么MRI(或者同样使用GIL的CPython)需要使用多进程模型部署。再延伸我们可以知道Apach上面的Mod_rails(Passenger和Ruby Enterprise Edition)还有Mod_python的神奇之处,他们都hack并实现了使用fork让进程共享内存。最后本文还同样引出了为什么传统Ruby和Python应用只有使用多进程才可以利用多个CPU,还有为什么Twisted和EventMachine使用了单进程单线程+event IO的模型。
最近很迷陈绮贞,买了国内能买到的几张正版专辑。
前一段时间把Mingle的svn用git-svn在本地clone了一个git repository,不过后来非常奇怪的是git svn的时候提示命令找不到了。没有在意。
今天需要用git svn rebase一下这个repository,所以到处搜索为什么?最后发现了问题在于我使用macports安装的git-svn,但是升级的时候却使用了git install,结果造成了系统中安装了两个配置不同的git-core包,而包含git-svn的却没有被激活。
执行
tin@tw-dell:git_mingle >port installed The following ports are currently installed: … git-core @1.6.0.2_0+bash_completion+doc+svn git-core @1.6.0.2_0+doc (active) …
就是说+svn的git-core目前没有激活,那么好办了。
tin@tw-dell:git_mingle >sudo port deactivate git-core @1.6.0.2_0+doc —> Deactivating git-core 1.6.0.2_0+doc tin@tw-dell:git_mingle >sudo port activate git-core @1.6.0.2_0+bash_completion+doc+svn —> Activating git-core 1.6.0.2_0+bash_completion+doc+svn
其中先deactivate现在激活的git-core,再activate+svn版本的git就OK了。 如果你还没有安装,这样安装:
sudo port install git-core+svn+bash_completion+doc
–EOM–
托同事从香港给带了iPod touch 2,好兴奋的拿到了这个iPhone的替代品。因为我一直以来很像有一个像样的掌上设备可以有空做做开发,而iPhone/touch可以说是不二之选,因为从艺术的眼光上看他们很完美(起码我这么看)。而且多点触摸带来的交互革命激发了我作为UE边缘认识的兴趣。
iPod touch 2多了录音功能,所以也可以配合fring实现skype通话,不过前提是你需要购买带mic的耳机,目前似乎只有Apple原装的,要220港元,好贵,所以暂时还没有出手买这个。但是机身先下手了。是从国美(香港)买的,因为很多retail的地方都售空了。
现在的iPod包装实在是简单,连说明书都没有,只有一个简单的开箱指南,还有一个基本的连接iTunes的说明,仅此而已,不过倒是这样就够了,因为可以把你的眼球固定在touch上,让你自己好奇的去探索。我觉得激发用户的探索意识是很好的一种让用户产生沉浸感的营销方式,而且从苹果一向的交互设计理念上来说,他们非常注重启发式探索,并且尽量让你本能的达到自己所期待的结果,这个正是交互设计的重点所在。
那么不废话这么多,上图。图是上周一晚上照的,最近生活节奏太快,现在才抽空出来显摆^____^
InfoQ上面的一篇文章《构建的可伸缩性和达到的性能:一个虚拟座谈会》
http://www.infoq.com/cn/articles/scalability-panel
这篇文章很好,给了你很多做可伸缩性的线索,记录下这些点滴。推荐感兴趣的人去InfoQ阅读原文。
我在想,我为什么和老婆去澳大利亚旅游。我们旅行的意义是什么?
记得今年我读了阿兰德波顿的旅行的艺术,里面探讨的就是旅行的意义。我记得书中说旅行是为了验证什么或者逃避什么。那么我们去澳大利亚是验证什么或者逃避什么呢?其实在去之前我并没有问我自己这个问题。
我很怕在熟悉的人面前出丑,但是到了陌生的环境我感觉我就自由了。这种现象在幼儿园的时候就有了,爸爸来接的时候我都特别乖,特别的沉默,但是爸爸走了我就怂恿身边的小伙伴们做坏事,气老师。这些其实我也记不清除了,是爸爸和我说的,老师抱怨过,我记忆中就是身边的男孩女孩都特别听我的,而且我记得做得最好的就是我能够让他们在做了坏事以后不说是我让做的,所以我一直以为我是非常安全的。不过,实际上是怎样我也不知道,我所认为和我所记得的都是在那个年龄的心智范围以内的。
去了澳大利亚这么远的国家我就不怕出丑了,我就又可以自信的做自己想做的了。自信,不怕出错,感觉很自由,就像回到了童年。回到童年是非常快乐的事情,因为童年在我的记忆里是个太快乐的年龄段了。那个时候搜索所有的记忆也只有两件害怕的事情,一个是“从山上掉下来”一个是“杀人”,其实都是梦境。梦境里面梦到过很多次和爸爸一起爬山,爸爸总是爬在我的前面,而我跟在后面,我们爬的是笔直的峭壁,我非常害怕,但是最后还是掉下去了,身上会感受到失重的感觉,非常可怕,因为我是个恐高的人,我能做的就是呼叫我爸爸,呼叫,大声的呼叫,最后我醒了,自觉的下地去撒尿。嗯,这个恐高症的梦原来就是意味着我要撒尿了。另外一个是在上了小学的时候会做的梦,我会杀掉Turtle同学(是我的发小,最好的朋友(之一)),一般就是用铅笔戳死或者用手攥死。这种梦很离奇,因为杀人以后Turtle同学就神奇的消失了,而且我每次都没有看到我杀掉他的细节,只是强烈的知道我杀了他,然后就是好害怕,开始想念我的好朋友,开始害怕蹲监狱,害怕见不到爸爸妈妈,最后几乎都是哭醒的,不过哭醒以后我发现我没有哭,甚至眼睛里面没有湿润,爸爸妈妈也没有听到我哭。这个梦大概是说那个时候我在意的这些人吧,我怕失去最好的朋友,怕失去爸爸妈妈。那么这两个噩梦就是所有了,其余的记忆都是那么的鲜艳。
澳大利亚就是这么一个鲜艳的国度,鲜艳的要命,就像有生命要从那鲜艳的颜色里边爆发出来,都咄咄逼人的让你目眩。它让我想起了我的童年,我可以和我的老婆撒娇。我终于可以拉着一个漂亮的小姑娘的手一起在大街上面看到所有的东西都兴奋的大呼小叫了。小的时候我不好意思和女孩子说话,实际上在幼儿园的时候我还是和小女孩说话的。但是上了小学以后我发现女孩不能欺负,因为会被老师和父母加倍责备。还有就是我对女孩的身体感觉很神秘,很像偷偷看看,但是又不敢偷偷看,所以干脆不如不看、不听、不想,那么当然也就不说了,所以那个时候开始不怎么和女孩子说话了。但是内心里面我也想和一个打扮的漂亮的有大眼睛长头发的小姑娘一起拉拉手的,直到二十多年以后我的这个梦想才实现。这次去澳大利亚似乎就是让我牵着我漂亮的小姑娘走到了童年,我得到了我一直想要却从来没有得到的东西。我的老婆就是最爱的女人,但是她也是一个童年的伙伴,我在童年直到青年都不认识她,但是现在拉着她的时候她看起来还是一个小女孩,非常可爱,有小圆鼻子,大眼睛,漂亮的细眉毛,薄而细的嘴唇,脸上有几个小小的祛斑,耳朵又小又圆很俏皮,所以她就是我小小的女神。我曾经梦到过很多次,小的时候,我在胡同里面玩的时候,她也在某条胡同里面玩着,我在一刹那,想到了她,她也感知到了我。拉着我亲爱的女神,走在童话的街道上面,我感觉好幸福,就好像我喜欢的摄影画册,浪漫的街头,带有颗粒感的画面,我们傻傻的微笑。为什么会想到摄影画册,是因为悉尼的阳光是那样的赤裸的闪耀,穿过各种神奇的大树小树投射在我们的身上和脚下,光影就这样交错在一起,和我们的身体和空气交织。我喜欢有光影的空气,这种空气可以滋润你的心情,让心情被热带的潮湿空气软化。悉尼的空气我很怀念,那是一种湿润和凉爽的空气,水滴像是水晶的雾摩擦着你的皮肤,闪烁的广从水晶里面渗透到身体里面,身体的内部都被水和光射透了,感觉就像在天堂一样。光非常强烈,感觉心情非常神圣。童年、女孩、颜色、光影、神圣,实际上这是我从宫崎骏的动画里面读到的一些关键字。正巧上周和爱人看了《悬崖上的金鱼公主》,我很强烈的知道,即使是在童年,我也知道我要的是什么样的世界,什么样的女孩,什么样的生活。似乎这个电影就是记录的我们在澳大利亚作为一对结了婚的恋人的感受,那种童年的幸福感的回归。
童年不怕什么,我回到了童年,所以我活得了2周的自由,这种自由是一个多彩的调色板,我们可以肆无忌惮的使用颜色。在那里很自由,即使没有那么多的钱住很好的旅馆,没有那么多的钱去吃正餐,没有那么多钱享受遍历出租车,可是我们可以享受愿意往哪个方向走就向哪个方向走的自由。我们可以放纵的用中文说一些肉麻的话,却不用担心有人会在意,我们就像风一样在城市里面穿梭,我们还可以相信我们是透明的。我们不会给城市留下什么印记,我们只求城市给我们留下一个快乐的印记。这种感觉非常的自由。
这是我旅行的最大意义。
这次还圆了另外一个梦,我看到了动物世界里面最多彩的珊瑚礁。我是一个看颜色上瘾的人,在动物世界里面给我最大震撼的就是大堡礁,那里有最神奇的颜色。记得小的时候我学过很多年的绘画,其中最自豪的就是在最初的配色课程上面老师总是夸奖我,那个时候就是在一个鱼的轮廓上面填充颜色,鱼身上的鳞是相同的几何图形,你可以发挥的想像让它变得五颜六色。那个时候的我很自由,所以我会按照我的心的方向去填充,所以我就有了漂亮的的图画。但是在后来那些灰色的学习会话的岁月里面我却只记得我错过了变形金刚,我错过了太多太多的周六晚上才有的动画片,就是因为我要去学习画画。所以在后来我在绘画方面没有任何发展,现在不过就是比从来不画画的人能画出圆润一些的线条,其它的所有技能都退化了。大堡礁就在我的面前的时候我又捡起了对颜色的那种自由的饥渴,我感觉我又可以自由的享受颜色带来的兴奋了。生物选择使用绚烂的色彩绽放自己的生命!所以颜色就是生命的象征,我喜欢颜色,实际上是因为我喜欢我们的生命!我在水中不停的呼唤我的亲爱的老婆,喊出不知道名字的鱼的名字,拿起活着的蓝色海星给她摸,我非常喜欢给我身边的朋友讲生物知识。虽然现在我的生物知识已经不如小学生了,但是我依然可以享受讲解那些不清楚的记忆里面的知识的快感,分享知识在任何时候都可以给你快乐。亲爱的老婆也非常兴奋的听我胡乱编造出的各种介绍,并且认真的问问题。浸泡在颜色中,享受分享快乐的幸福,这是大堡礁给我的。
在丹特里特的雨林里面,我们还划了独木舟,和亲爱的人一起冒险。水是透彻的,因为透彻,所以我就不会恐惧。一直认为密西西比河是可怕的淡水河,因为淡水里面总有奇怪的张牙舞爪的水中生物。但是在丹特里特的清澈小溪中,没有未知,所有的东西都浸泡在透明的水下,所以我不用鼓起勇气就可以用双脚去接触小溪的鹅卵石,却一点都不担心有奇怪的水中生物。我们可以看到好笑的王八和小鱼在水里游泳。
我的感情就随着这样的旅行得到了释放,得到了慰籍。我想这就是旅行的意义吧。