文章标签 ‘学习’

module OutputHelper
def print_line(msg)
print msg + “\\n”
end
end

class SayHello
include OutputHelper
private :print_line
def initialize(name, &sayHello)
@name, @sayHello = name, sayHello

if @sayHello == nil
@sayHello = proc { |msg| print_line msg }
[...]

2007年8月22日15:27 | 6 条评论
分类: Ruby
标签: , ,

今天看到railschina论坛上一篇贴子在讨论在Ruby中,puts str是不是等于print str + “\n”。因为一位同学做了实验,在irb中,在多线程环境下使用puts似乎有问题,有的时候字符串和换行的顺序会乱,而用print就没有问题,所以得出结论,认为puts是不等于print + “\n”的。又有人提出质疑,因为做了另外的实验,在非irb环境下,puts和print都没有问题,所以认为多线程问题只是主观臆测,有可能是irb的问题。甚至还有人写信给Dave,结果Dave也没有给出明确的答复~
正好手头上有Ruby的源代码,所以翻出来看了一下,在io.c中,明确的写明了Ruby中ios.puts方法的实现:

VALUE
rb_io_puts(argc, argv, out)
int argc;
VALUE *argv;
VALUE out;
{
int i;
VALUE line;

/* if no argument given, print newline. */
if (argc == 0) {
[...]

2007年8月21日22:18 | 没有评论
分类: Ruby

在来到新公司之前,对于Windows编程实在不熟悉,更别说VC++中的Resource的实现了。工作的时候,同事提到了StringTable实现本地化的问题。当时我也很模糊,说不出个准确答案。周末回家研究了两天,算是搞明白了。
先说说我之前比较困惑的几个问题:

在编译完成的二进制文件中,StringTable到底是按照什么方式存储的,简单说,就是按照什么编码方式存储的?
Windows已经支持了Unicode,为什么在VC++的StringTable Editor中,还要选择语言?
如果使用了Unicode,怎么有的时候,应用程序还会出现乱码?
如果是Unicode编码,那么是按照什么格式存储的,UTF-8,UTF-16?

当然,对于这些问题,可能对于一些牛人来说不算什么,都是很简单的问题。不过,对于我来说,还是很麻烦的,因为网上没有很直接解释这些问题的文章,最终还是自己一点一点研究出来的。
首先,需要复习和学习一些知识:
在计算机诞生的初期,操作系统只支持最多256个字符,就是著名的ASCII字符集。但是随着计算机在世界上各个国家的发展,本地化的需求越来越多,256个字符明显不够,就有一些国家发明了自己的字符集,也可以说是编码标准,不过这些编码方式都是只考虑自己国家的语言(当然不会有一个国家为了发展自己的科技,还要替别人着想),比如,ISO-8859-1,GB2312等等,在Windows里面,这类编码的体现就是我们熟悉的Code Page。在VC++中,Code Page是使用数字来代表的,比如:936是简体中文Code Page,1256是阿拉伯语言的Code Page。这样显然不爽,随着计算机的普及,Code Page会越来越多,并且很多Code Page可能相差不多,但是为了支持相应的用户,应用程序(包括操作系统)就不得不对之提供支持,这大大提高了软件的成本。终于,一些软件业的巨头决定做一件一劳永逸的事情,就是创造一个字符编码方式,能支持世界上所有的字符,这个字符集编码叫做Unicode。它设计可以支持11万多的字符,被认为足够放下世界上已知的所有字符(其中,中文字符占了2万多,英文只占52个)。而我们经常看到的UTF-8,UTF-16,UTF-32都是Unicode的一种存储方式。
言归正传,回答自己的四个问题:

从Windows2000开始,Windows已经完全支持了Unicode,所以StringTable在二进制文件(*.dll、*.exe)中确实是以Unicode编码存储的。
在StringTable Editor中,之所以要为StringTable选择相应的语言,是因为StringTable Editor中不是以Unicode存储的,而是基于Code Page编码存储的。所以必须对自己的StringTable选择正确的Code Page,否则系统将不能正确处理。因为在编译的时候,VC++的Resource Compiler会自动调用MultiByteToWideChar这个API,将字符串从Code Page编码方式转化为Unicode,如果Code Page选择不正确,那么转换也就必然不正确了。
出现乱码一个原因是操作系统不支持Unicode,比如Windows98之前的版本。或者是没有将默认编码设置为Unicode。
在Windows中都是使用UTF-16来存储Unicode的。UTF-16正好是两个字节,也就是我们使用的WCHAR类型。

需要说的是,StringTable Editor不是使用Unicode来存储,是因为历史原因。早期的VC++是不支持Unicode的。

2007年5月21日23:32 | 没有评论
分类: Windows

设计模式,实际上是一些很标准的算法解决方案,如果对于一个很常见的问题,一个人使用了设计模式中的方法解决,当别人看代码的时候,也会很爽快。而如果没有,那看代码的人就会很疑惑,问题明明可以很明确的使用某种设计模式解决,那为什么原来是这样的呢?是不是有什么tricky的地方,不得不这样写?无形中延长了时间,并且增加了维护时出问题的机会。
我觉得知道各个模式所表达的算法实现各个设计模式所需要的算法还算容易,而明确的知道什么时候该用什么模式就比较难了。我也经常写出自己后悔的代码来:在写过代码后,review的时候,突然发现,其实可以用更好的方法解决问题。这就是refactoring的作用了吧。呵呵。
二、Singleton, Builder, Prototype模式
这三个模式仍然是关系到对象创建的,但这三个模式特点都很明确,比较容易找到适应的情形。再来讲三个故事:
1、从前,有一个小姑娘叫“春”(这是我高中的时候,一个同学作文中经典的句子,很难忘记~)。我们叫她“春姑娘”吧。有一天她在海边散步的时候,见到了一个油灯,上面写着“Singleton”,小姑娘很好奇,就轻轻摸了一下这些字,突然从灯里面出来了一个灯神,他跟小姑娘说:“谢谢你帮我解除了咒语,我现在自由了。只要你拿着这个灯,什么时候叫一句‘Singleton’,我都会出来。” 小姑娘有些犹豫,我不会喊来坏蛋吧?这个灯我又不熟悉。灯神大笑,这个灯叫“Singleton”,所以每次出来的都只能是我,不会是别人的。甚至替身都不会有。小姑娘高兴的回家了。
2、其实,小姑娘在家里很苦。受到继母的虐待。每天都要做饭,洗衣服,挑水,天不亮就要干活,一直要干到深夜。这天晚上,终于干完了活,睡觉之前,她把灯神交出来,想跟他聊聊天。因为她找不到别人聊天了,能找到的只有这个向她承诺过的灯神了。她把她的苦恼都跟灯神说了,灯神很同情她。(其实,这个灯神就是天界众神派来帮助小姑娘的)临走的时候,送给小姑娘一口锅,上面写着Builder这个单词。小姑娘不解,我现在还有锅啊。灯神说,这个锅是天界众神使用的锅,它的最大特点就是不用人干预就可以做出饭菜。你只需要按照这个菜谱往锅里放进原料,盖上盖子,等一会再打开,就是香喷喷的饭菜了。说着给了小姑娘一本菜谱。

2007年3月18日16:29 | 5 条评论
分类: Development

最近在重新学习C++,也在看公司产品的代码,深切体会到一个大型的项目如果没有很好的代码设计,会为维护带来过大的成本。我想说的代码设计,并不是产品层次的设计,而是developer在写程序的时候,如何设计自己实现功能所使用的编码方式和模式。这就是为什么我突然决定复习设计模式了。我看设计模式还是在大学,虽然多少还有些印象,但真正能拿起来用的就那么几种经常用到的。但设计模式是针对不同问题的不同best practice,所以如果有一种不知道,就可能在coding的时候走弯路,甚至走错路。
我希望能把我复习的过程写成一系列的文章,而且不想用代码和类图来说明,因为这些东西在所有介绍设计模式的书里面都很多,我只想把我复习的心得和问题写出来。难免有错误,希望任何人指出。:)
一、Factory, Abstract Factory, Factory Method模式
这三个模式都跟Factory这个词有关系,所以都是用来创建对象的模式。我最初看到这三个模式的时候,真是有点晕,都是factory,有什么区别呢?在什么时候需要用哪个呢?
先来讲三个故事:
1、一个匪徒,我们叫他Mr. Pattern,为了要实施对一个银行进行抢劫,需要买一支武器。但他不知道买什么,所以他来到了一家叫”WeaponFactory”的武器店。他说了他想要武器后,营业员说,我们这里有A系列手枪、B系列手枪、A系列自动步枪、B系列自动步枪甚至还有Z系列火箭筒,你想要什么就去相应的柜台交钱,然后就可以拿到货了。
2、还是这个Mr. Pattern,他决定不在”WeaponFactory”买了,因为那里武器全都摆在一起,太多了,导致店铺太大,根本就没办法逛,而且据说后来因为无法再扩大营业面积最终倒闭了。这次他来到了一个叫“AbstractWeaponFactory”的店。他这回多了个心眼,透着窗户看了看,恩,这回里面不是很乱,好像店里面就摆了一个系列的产品。他不知道这个系列是不是他需要的,抱着试试看的想法,他踏入了店门。突然,一阵眩晕,等再清醒过来,看到面前摆的都是C系列的产品:手枪、步枪等等。这时,一位美丽的导购小姐走过来,对Mr. Pattern说:“感谢您的光临,我们已经根据您的需求和所处的环境,将您自动传送到我们的C系列子店中,在这里您可以买到所有您需要的产品”。Mr. Pattern幸福的晕过去。

2007年3月17日18:40 | 没有评论
分类: Development