ruby撰写的日志

I love duck typing

看到SMN上一个朋友的签名是:哥注入的不是接口,是类。

突然想到了以前做Java开发的时候往事。那会的框架最火的非spring莫属,而Spring所强调的就是IoC和面向接口编程。

思想是很好,也确实能解决很多问题。但是对开发人员的体力消耗却实在太大了。

没事就编写一堆的接口和抽象类,然后再写实现类。那些个只有方法声明的接口和抽象类让我不止一次的觉得实在是太傻了。

可是,对于强类型语言,想面向接口编程,还必须这么的写。但总归还是很不爽。

换用Ruby后好多啦,根本不需要那些个摆设般的接口和抽象类。只要你的对象有别人需要的方法,那么就放心大胆的传入就好了。啥时候想换个其他的对象,只要一样有这个方法,那就完事大吉。目标程序根本不会知道你偷偷滴已经进行了乾坤大挪移。

这就是Duck Typing,让人舒服编程的鸭子类型。哈哈

胸围与罩杯

男同学,请回答我。胸围与罩杯是一回事不?如果不是,区别是什么?是不是胸围越大,罩杯就一定也越大呢?

要是女同学,你就找个男同学问一下。

好吧,你有答案了吧。我猜八成的男人一般都不会太清楚这俩到底是不是一回事,区别在哪里。至少我认识相当一部分男人(包括曾经滴我自己)一直以为胸围有多长罩杯就有多大。

其实呐,根本8是这样子滴。就让百度告诉你。

胸围指人体胸部外圈的周长。

from http://baike.baidu.com/view/54963.htm

罩杯的尺寸则由其深度决定。乳房最高点的乳围(三围之一)减去乳房下围一圈的长度,AA 7.5cm A 10cm B 12.5cm C 15 cm D 17.5cm E 20 cm F 22.5cm G 25cm H 27.5cm I 30cm ,两种罩杯间的尺寸则以够长的背扣来解决。

from http://baike.baidu.com/view/426973.htm

由此可见,胸围和罩杯不是一回事,也并非胸围越大,罩杯也越大(相信很多小正太/宅男都有或有过这种错误滴认知)。两个是蛮有差别滴。而且根据这两个定义可以推理。罩杯比较大的女性的胸围肯定在某一个区间,胸围过大或者太小的女性一般来说更难达到C,D等高级CUP。这个推理如果有人不理解,自己慢慢琢磨哈。俺就不解释老。咔咔,或者实在琢磨不明白多多观察。

————————- 俺是坨华丽滴分割线 —————————

好了,啰啰嗦嗦的一大堆,这下不能算俺标题党了吧。开始进入正题,上面那一段主要是想表明,在日常生活中,往往有些概念大家很容易就认为是一致的或相似的,可真正仔细看一下,发现其实还有很大区别的。那么在程序中往往也有很多地方,总感觉是一样的东西,但其实表现来却不是一回事。据个例子吧。

今天hideto同学遇到的一个bug就是,DB中对于某个column的定义,约束这个varchar不能超过222个,而在Rails中与之对应的ActiveRecord对象也声明了这个validation,超过222个就报错。可经过实际测试,发现如果使用英文或数字的话,程序是没错的。如果夹杂了一些汉字,那么发现,还没到222个字符。Rails就报错了。但实际上,数据库是可以插入滴。

问题很简单,字符编码问题。DB中是用的utf-8。而Rails中,AR的那个validates_length_of 中的size没有考虑宽字符的情况。所以, 类似“我love你”.size 返回的就是8,而我们希望得到的是6.

问题很快查明了,自然就容易解决了。可是我突然之间觉得这个小地方还是挺值得玩味的。

自打工作以来一直做的java,而Java天生就是对Unicode支持的,所以在Java的世界,是没有这种情况的,我也一直没仔细思考过,直到遇到了ruby。ruby可不是天生unicode。所以在ruby中,一个中文字符的size就会是2.想得到1,那好吧,请require jcode. 并且调用jsize,而不是size。

只不过是因为字符集的问题,就需要不同的两套方法。在我看来,Matz身为日本人,本应该把这个问题考虑的更加完善一点滴。

和size一模一样的那个方法叫length。最一开始,我觉得真的好方便,ruby真滴好灵活诶。但日子久了,我开始觉得,其实这两个关键字是大有学问滴。只是,好像我接触的语言中并没有区分过两者之间的关系,都当成一样的了。我个人认为这其实很不合适。

size,应该是描述大小,也就重量(质量)的。比如一块蛋糕,比如一件T-shirt。

而length,是描述长度的,比如一条皮带……

所以,这两个其实是不一样的。而对于一个String类来说,这两个方法也应该具有不同的含义。也许你立刻想问一个问题:字符串也就有长度的信息,字符串能有什么重量(质量)啊。那么不好意思,你想当然的错了。YOU ARE WRONG, VERY WRONG!!~~~

字符串的重量,就是字符串在物理的寄存器中所占用的bit。这就是字符串的重量。

所以你看,如果能够把size和length的定义更加清楚一些那么也许就能够避免很多问题。

比如在ruby中,我们需要判断这个字符串的长度,那么就需要length这个方法。但也有时候,我们有个binary string,这时候我们并不会去care他的长度,因为没什么意义。我们这时候care的是这个字符串的大小,比如要大于0.5K,小于2M之类的。这时候就要用到size了。

也许有人认为如果照着我的建议,会使得代码概念混淆加重,但我觉得即便是如果出现这种事,那么肯定也是惯性使然,如果让一个没有程序经验的人直接告诉他size和length是不同的定义。我想他应该不会产生混淆的感觉。特别我越是动态的语言,基础库的特性一定要更加的把握好,力图更加精准,清晰。这样子,才能更友好的方便上层应用与扩展。

按照我刚才的定义,在unicode的语境中,两个方法返回的数字应该是保持一致的。但即便一致,我想如果一门语言能够分清楚和说清楚两者的不同含义,那么好处也是大大的。因为即便你以unicode来存储,即便目前每个字符都可以用一个unicode码来表示。难保将来不出现一门火星语,对吧。如果到时候unicode的16byte空间又无法描述一个火星文了,那么那会就又要混乱了。

所以,我衷心的期望在各种语言中,别再将size和length视为一个方法的两种表达方式。而是让他们各司其职,发挥各自应有的作用。

当然,这八成只能算奢望,好吧,那么就让我期望如果我这辈子要发明一门语言的话,一定要将size与length区别开来。

永远不能忘记 — ”胸围太大并一定值得庆幸喔,也许那胖妞滴CUP只有A“~~~~

好了,现就这样。其实这种类似的小地方,我觉得还是蛮好玩和值得讨论滴。比如我前阵子就曾在公司邮件中聊了把空字符串”与nil滴区别。这个嘛,也许将来会再写一篇。只不过得先想到一个闪亮滴标题才行喔。

PS:这年头,标题党不容易啊。

用上了自己写的BLOG系统

嗯,周末无事,想了想N久前就打算自己写BLOG系统的事儿,觉得还是说做就做吧。毕竟,业余时间在家老看美剧也挺无聊。 然后这个周末,花了几个小时,做成了现在这个样子就丢上来了。 现在blog.ranxiang.com还是原来的MT系统。而ranxiang.com已经是俺自己写滴老。哈哈 分页,tags,评论,Feed输出。 简单的功能都已经有了,不过还是有很多不完善的地方就是了。比如现在右边tag could点的话就会报错-_-### 还有页面也很简陋,而且后台也丑陋滴要死。 不过这些都没关系啦,慢慢滴做嘛。我觉得一launch人就会变得有动力,所以我宁愿把这么简陋的程序就放网上去。 时间花费的稍微久了点,其实ruby端很快就写完了,估计就十几分钟的事情。很多时间花在别的方面了。 比如这个挨千刀的CSS,哎哎。实在太折磨人了,好在最后我决定就抄MT的那个模板好了。然后进度这才开始一点点的加快。 还有就是将原来的数据导入现在的库的时候,因为乱码也稍微费了点周折。 本来想着,部署到dreamhost上也许会费一番力气,没想到挺速度的一会就弄完了。 不过和MT相比,发现dreamhost上静态文件和动态文件的速度简直不是一个级别啊。所以我也要给俺滴BLOG系统加上静态化的选项。 嗯哈,心情还是比较happy滴,现在想做滴事情好多啊,HOHO,看来以后晚上是有的忙活了。嗯,生命嘛,充实点好。 噢噢,讲了大半天,忘记说了,俺做滴BLOG系统叫rxblog,哈哈,在googlecode上开源呢,地址是

http://code.google.com/p/rxblog/

。当然,目前的代码惨不忍睹,目前也没啥测试,您就表较真了。且等着俺慢慢打磨,也弄出来一个媲美MT,Wordpress的blog哈。嗯,俺滴信心是和俺滴小宇宙一样滴强大滴。谢谢 还有,目前俺在feedsky上的feed还是抓的blog.ranxiang.com, 因为ranxiang.com俺自己写的这个程序还处在进度不稳定状态,俺可不好意思撑爆你的rss reader。Hmmm… 就这样,争取下周更新一个版本…

嘿嘿,有兴趣滴同学可以上 ranxiang.com 看看哈,体验下Dreamhost上,rails程度有多’速度’

A New Start, A Better Start!!~~~~~

    明天,我就要加入一家新的公司,新的团队老。在家憋了3个多月,终于放出来了。
    从此以后,主要滴开发语言将由单纯滴Java,变成Rails和JavaScript。终于摆脱了繁琐滴JavaEE,即将面对滴是一个全新滴未知滴世界。我对此充满了好奇。
    Rails现在可以说走到现在,已经证实了自己,被越来越多的单位与企业用作商用。而JavaScript由于其本身的广泛性,以及AJAX的推动。已经被很多人看成了the next big thing。我对于解释性语言滴兴趣也越来越浓。相信这份工作能给我带来很多的乐趣,并使我成长。
    今天去了趟家旁边的书店,本来打算买《Ruby Cookbook》,结果刘同学说公司已经有了,关于这方面的图书以后都可以请求公司提供。嗯!~~~~~~这个消息真滴是太好了,我一直很希望呆在这样的企业。因为能让自己感觉到开发人员受到了重视。在书店逛来逛去,想找《AJAX模式与最佳实践》,可惜没有。然后挑了两本别的《Beyond Java》和《Head First设计模式》。后者是什么珍藏版,其实就带了一副海报而已。海报里面画满了各式样的模式,以及超浓缩但确不太难懂的概括。
    给PSP充满了电,COPY了一些电子书,音乐;给准备拿到公司放着的书写上了自己的名字,放到了包里。
    嗯,好几个月没有去工作了,现在的心情仿佛跟以前放暑假盼着开学般。期待着新的同事,团队,以及要做的事情。
    我相信对于我来说,这又将是一个新的开始,更好滴开始。我会认真滴工作,并为着自己的理想加倍努力着。

PS: 最后滴最后,我红着粉嘟嘟滴小脸,再次感谢刘同学滴推荐。8然,像我介种高中毕业证都米有滴小孩,怎么能找到自己满意滴工作咧。

Ubuntu 7.10 Released!~!~~~~~~~

恩,7.10正式版终于出来了。

我是下午4点左右吧,从google reader得到的消息,然后下载,安装。8点左右的时候安装完毕,然后又从网上安装了中文包。然后美滋滋滴出去溜达了。

半夜再上来,准备开始设置开发环境。结果发现Ubuntu官方服务器基本上都不行了。通过apt安装任何东西,都提示timeout。哎哎,看来fans都已经得到了消息~~~~~

下了份ruby源码,打算自力更生,丰衣足食。结果想起来,基本的编译环境还没装呢。既然如此,那就算了吧,我可不想越弄越麻烦。还是等等好了。

简单惆怅了一下,突然想起来,我可以自己装个Java,然后玩会JRuby呗,也是一样滴。这还是比较轻松滴

哎,我本本上那fuck的A卡,Ubuntu 7.10默认集成了Compiz Fusion,可我依然只有望洋兴叹啊。虽然我可以通过xgl手动支持。但是还是懒得费那事了。酸酸滴说一句:那都素一朵浮云!~!~~~~~~~

很高兴滴看到Ubuntu发展的越来越兴旺。很好,很强大!