Archive for 10 月, 2010

使用Dropbox备份新空间上的文件内容

星期四, 28 10 月, 2010

详情请参考月光博客这篇文章:虚拟主机安装Dropbox备份网站的教程

我这里把我操作的过程记录一下。

1. 使用putty以ssh方式登录自己的空间,主机、帐户什么的在注册完成后会得到,也就是登录cPanel的帐户。

2. 登录成功后逐行依次键入下面的命令(命令说明见月光博客的博文):
[text toolbar="false"]
wget -O dropbox.tar.gz http://www.dropbox.com/download/?plat=lnx.x86
tar -zxof dropbox.tar.gz
mv .dropbox-dist ~
~/.dropbox-dist/dropboxd &
cd ~/Dropbox
[/text]

(更多…)

完成空间迁移

星期三, 27 10 月, 2010

早上来公司发现自己博客的流量已经超出服务器提供的每月流量,本想把博客迁移到x10hosting.com免费空间避几天,谁知道这个免费空间也不正常。

无耐之下想买新的空间,在牧师@newinchina淘宝店看到Hawk Host代购只要180元/年,细问下来原来是用了6折(OFF 40%)的优惠码买的,于是自己也去注册了一个,这是在博客迁移后在新空间上写的第一篇博文。

新旧空间对比:
原空间:Byteact cPanel Dollar Hosting,每月1美元,300MB空间,每月2GB流量,cPanel,SSH被禁,1子域,1邮件,2数据库。
新空间:Hawk Host Basic Hosting,每月3.29美元(年付,用优惠码后每月2美元),3GB空间,每月30GB流量,cPanel,SSH,子域、邮件、数据库不限。

这下终于不用担心月底流量暴掉的问题了,也不用考虑把图片等附件放到免费空间的麻烦事了。

__cdecl与__stdcall

星期三, 20 10 月, 2010

__cdecl:

参数入栈顺序:从右到左,由调用者负责清栈。这是C/C++/MFC的默认调用约定。可变参数和C的函数只能用这个约定。

__stdcall:

参数入栈顺序:从右到左,由被调用者负责清栈。这是Win32 API的调用约定。

Windef.h中的宏:
[cpp toolbar="false"]
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
#define WINAPIV     __cdecl
#define APIENTRY    WINAPI
#define APIPRIVATE  __stdcall
#define PASCAL      __stdcall
[/cpp]

更多:http://blog.csdn.net/tuwen/archive/2008/03/14/2182838.aspx

设计模式学习——Factory Method(工厂方法)

星期二, 19 10 月, 2010

意图:定义一个用于创建对象的接口,让子类决定实现化哪一个类。将实例化推迟到子类。

问题:一个类需要实例化另一个类的派生类,但不知道是哪一个。Factory Method允许派生类进行决策。

解决方案:派生类对实例化哪个类和如何实例化做出决策。

参考者与协作者:Product是工厂方法所创建的对象类型的接口。Creator是定义工厂方法的接口。

效果:客户将需要派生Creator,以创建一个特定的ConcreteProduct对象。

实现:在抽象类中使用一个抽象方法(即C++的纯虚函数)。需要实例化一个被包含对象的时候抽象类的代码将引用此方法,但是不知道需要的对象是哪一个。

(更多…)

设计模式学习——Object Pool(对象池)

星期二, 19 10 月, 2010

意图:在创建对象比较昂贵,或者对于特定类型能够创建的对象数目有限制时,管理对象的重用。(比如数据库连接)

问题:对象的创建和/或管理必须遵循一组定义明确的规则集。通常这些规则都与如何创建对象、能够创建多少个对象和在已有对象完成当前任务时如何重用它们等等相关。

解决方案:在需要一个Reusable对象时, Client调用ReusablePool的acquireReusable方法。如果池是空的,那么acquireReusable方法创建一个Reusable对象(如果能够),否则,就等待直到有Reusable对象返回集合。

参与者与协作者:ReusablePool管理着Client所用的Reusable对象的可用性。Client然后在一个有限的时间段内使用Reusable对象的实例,ReusablePool包含所有Reusable对象,这样就可以对其以统一的方式进行管理。

效果:最适用于对对象的需求一直非常稳定的时候,需求变化太大会带来性能问题。ObjectPool中为了解决这一问题,限制了能够创建的对象数量。使管理实例创建的逻辑与实例被管理的类分离,可以得到内聚更好的设计。

实现:如果可以创建的对象数量有限制,或者池的大小有限制,可以使用一个简单的数组来实现池。否则,使用vector对象,负责管理对象池的对象必须惟一能够创建这些对象的对象。ReusablePool是用Singleton模式实现的。另一种变体是在Reusable对象中加一个释放方法——让它自己返回到池。

(更多…)

兲朝特色——过河(漫画)

星期二, 19 10 月, 2010

看图不说话……

设计模式学习——Singleton(单件)

星期一, 18 10 月, 2010

意图:希望对象只有一个实例,但没有控制对象实现代的全局对象。还希望确保所有实体使用该对象相同的实例,而无需将引用传给它们。

问题:几个不同的客户对象需要引用同一个对象,而且希望确保这种类型的对象数目不超过一个。

解决方案:保证一个实例。

参与者与协作者:Client对象只能通过getInstance方法创建Singleton实例。

效果:Client对象无需操心是否存在Singleton实例。这是由Singleton自己控制的。

实现:
1. 添加一个类的私有的静态成员变量,引用所需的对象(初值为null)。
2. 添加一个公共静态方法,它在成员变量为null时实例化这个类(并设置成员变量的值),然后返回该成员变量的值。
3. 将构造函数的状态设置为保护或私有,从而防止任何人直接实例化这个类,绕过静态构造函数机制。

(更多…)

设计模式学习——Template Method(模板方法)

星期一, 18 10 月, 2010

意图:定义一个操作中算法的骨架,将一些步骤推迟到子类实现。可以不改变算法的结构而重定义该算法的步骤。

问题:要完成要某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同。

解决方案:允许定义可变的子步骤,同时保持基本过程一致。

参与者与协作者:Template Method模式由一个抽象类组成,这个抽象类定义了需要覆盖的基本TemplateMethod方法。每个从这个抽象类派生的具体类将为此模板实现新方法。

效果:模板提供了一个很好的代码复用平台。它还有助于确保所需步骤的实现。它将每个Concrete类的覆盖步骤绑定起来,因此只有在这些变化总是并且只能一起发生时,才应该使用Template Method模式。

实现:创建一个抽象类,用抽象方法实现一个过程。这些抽象方法必须在子类中实现,以执行过程的每个步骤。如果这些步骤是独立变化的,那么每个步骤都可以用Strategy模式来实现。

(更多…)

设计模式学习——Observer(观察者)

星期四, 14 10 月, 2010

意图:在对象之间定义一种一对多的依赖关系,这样当一个对象的状态改变时,所有依赖者都将得到通知并自动更新。

问题:当某个事件发生时,需要向一系列变化着的对象发出通知。

解决方案:Observer将监视某个事件的责任委托给中心对象:Subject。

参与者与协作者:Subject知道自己的Observer,因为Observer要向它注册。Subject必须在所监视的事件发生时通知Observer。Observer负责向Subject注册,以及在得到通知时从Subject处获取信息。

效果:如果某些Observer只对事件的一个子集感兴趣,那么Subject可能会告诉它们不需要知道的事件。如果Subject通知Observer,Observer还返回请示更多信息,则可能需要额外的通信。

实现:让某个事件发生时需要知道的对象(Observer)将自己注册到另一个监视事件发生或自己触发事件的对象(Subject)上。事件发生时,Subject告诉Observer事件已经发生。为了对所有Observer类型的对象实现Observer接口,有时候需要使用Adapter模式。

(更多…)

设计模式学习——Decorator(装饰)

星期四, 14 10 月, 2010

意图:动态地给一个对象添加职责。

问题:要使用的对象执行所需的基本功能。但是,可能需要为这个对象将添加某些功能,这些附加功能可能发生在对象的基础功能之前或之后。

解决方案:可以无需创建子类,而扩展一个对象的功能。

参与者与协作者:ConcreteComponent让Decorator对象为自己添加功能。有时候用ConcreteComponent的派生类提供核心功能,在这种情况下ConcreteComponent类就不再是具体的,而是抽象的。Component类定义了所有这些所使用的接口。

效果:所添加的功能放在小对象中。好处是可以在ConcreteComponent对象的功能之前或之后动态添加功能。注意,虽然装饰对象可以在被装饰对象之前或之后添加功能,但对象链总是终于ConcreteComponent对象。

实现:创建一个抽象类来表示原类和要添加到这个类的新功能。在装饰类中,将对新功能的调用放在对紧随其后对象的调用之前或之后,以获得正确的顺序。

(更多…)