RSS 2.0 Feed

Friday, May 19, 2006

wordpress一直没解封,就在dreamhost买了空间, 正在配置dreamhost的空间,设置好后就不再更新博客堂的Blog,同时正在考虑是否加一个关于sql server和.net的wiki,最近对容弘千先生的风雨估衣街比较感兴趣,也有可能用这个空间放风雨估衣街。

本来想选择Web4Life,只是Web4Life需要setup fee,不过传说DH的服务不好。

在博客堂开通的第一天就申请了帐号,十分感谢博客堂,感谢创始人开心就好以及博客堂的管理团队。

 

posted @ | Feedback (19) |

Tuesday, March 28, 2006

Windows Live Developer Center
http://msdn.microsoft.com/live/default.aspx

现在什么都带Live了,试了很多带Live的域名,都被注册了,还是没赶上潮流呀

Mashup 是什么呢

根据wikipedia的解释(http://en.wikipedia.org/wiki/Mashup
代表两类目前流行的东西:一是一种音乐风格 ; 二是所谓Mashup web application hybrid , 指把多个不同的支持web api的应用堆叠成为新型web服务

Mashup Camp 在美国是由一群geek发起的技术+idea聚会, 详细可以参考:http://www.mashupcamp.com/ 

canvas for IE

http://groups.yahoo.com/group/canvas-developers/message/180
看起来好像很美,

Drawing Graphics with Canvas
http://developer.mozilla.org/en/docs/Drawing_Graphics_with_Canvas

demo
http://redsquirrel.com/dave/play/ajaxtrains.html

八卦:
最浪费的域名,看看就知道了,
http://down.com/,另外,dell一万美金的电脑已经卖完了

posted @ | Feedback (3) | Filed Under [ Dot Net ]

Thursday, February 16, 2006

开源的CMS基本上是php的天下,选择时主要看

授权模式,不过很多人不关心这个
插件和模版的数量,开发社区是否活跃。有更多的人参与你才能源源不断地获得资源
中文的支持
系统需求,支持那些数据库,这会影响对空间的选择
扩展性,不过不是所有的人都有能力和兴趣自己做扩展
 
Mambo 曼波 
http://www.mamboserver.com/
http://www.mambors.org/
http://www.mamboforge.net

中文站点:
http://www.mambochina.net/
http://www.mambo.cn
 
Mambo是一个老牌的opensource建站程序,获得过“最佳开源方案”,“年度最佳自由软件项目”等很多奖, 国外比较热门,但是在中国不够

热,中文支持比较弱,中文资源相对来说不够多。
   
Joomla 逐浪
http://www.joomla.org/

中文站点:
http://www.mambo.cn/
http://www.joomla.org.cn/

Mambo的分支,Mambo核心开发团队另起炉灶的产品。,2005年度最佳Linux开放源码系统奖
 
(八卦来自bbs.joomla.org.cn)

曼波开源核心开发团队致社区的公开信

致社区的公开信
--曼波开源核心开发团队

越来越多的人关注曼波开源项目,曼波商会 ( Mambo Foundation Inc *) 应运而生,它的初衷是为了更好的发展曼波。

我们,曼波核心开发团队,一致认为:

1、所谓开源项目,是致力于开发一个免费的和开放源码的软件的人们,组成一个团队而服务社会的行为。

2、开源项目体现协作精神,并享受协作过程带来的乐趣。它存储社区的信息反馈,提供好的管理,允许商业机构放心地投资于它的开发。

开源项目对任何人都敞开大门,欢迎那些能贡献价值和愿意在社区一起工作的人加入。

我们,曼波开发团队,认真关注曼波商会及其和社区的关系。我们坚信,曼波的未来,应该由使用者的需求以及开发者的能力所掌握。然而,

曼波商会却受Miro公司所控制,因此商会同社区之间的自由协作将变得不再现实。

1、曼波商会组建之初,并没有听取曼波核心开发团队们的意见。我们、社区成员,对曼波的管理和未来的发展方向,没有任何的发言权。由开

发团队组成的曼波筹委会和 Miro 公司的代表,联合组成曼波商会,并成立第一届理事会。但 Miro公司的CEO Peter Lamont完全将商会置于自

己的控制之下,在没有和开发团队的两名代表,Andrew Eddie和Brian Teeman商议的情况下,擅自任命了理事会成员。

2、尽管Lanmont先生向曼波筹委会许诺把Mambo的版权转移给商会,但Miro公司现在拒绝这么做。

我们将要做的是:在GNU规范下继续开发和改善这个获多项大奖的开源软件。我们希望Miro公司及曼波商会一路走好,很遗憾,我们不能够再和

他们继续合作。

我们听取了软件自由法律中心关于这次事件的建议,将很快就近期发展计划发布更多的信息。

2005年8月17日,曼波开发团队:

Andrew Eddie
Emir Sakic
Andy Miller
Rey Gigataras
Mitch Pirtle
Tim Broeker
Alex Kempkens
Arno Zijlstra
Jean-Marie Simonet
Levis Bisson
Andy Stewart
Peter Russell
Brad Baker
Brian Teeman
Michelle Bisson
Trijnie Wanders
Rey Gigataras
Shayne Bartlett
Nick Annies
Johan Janssens

The name Joomla! is a phonetic spelling for the Swahili word "Jumla", which means "all together" or "as a whole"
Swahili -- 斯瓦希里人,穆斯林民族中的主要一支,居住在东非从索马里到莫桑比克的沿海和岛屿上。斯瓦希里语作为坦桑尼亚官方语言的斯

瓦希里班图语,在东非或中东非被广泛地用作通用交际语言。


drupal
http://drupal.org/

Drupal模块功能一览
http://www.verydummy.com/drupal_demo/node/8

一些Drupal中文网站供参考
http://www.todaylog.com/node/44

PhpNuke
http://www.phpnuke.org/

中文站点:
http://www.postnuke.cn/
http://www.postnuke.ws/

老牌的CMS工具了,最早的php cms工具,用户很多,能找到很多phpnuke搭建的中文站点。最新的版本是7.9,功能很丰富,社区也很活跃。

postnuke
www.postnuke.com

中文站点:
http://www.postnuke.cn

phpnuke的分支,目标是在更少代码,更少的服务器负担,更多模版地情况下实现phpNuke的功能,Postnuke在显示上和php-nuke非常相似,但

是postnuke功能更多。


XOOPS
http://sourceforge.net/projects/xoops
http://www.xoops.org/

中文站点:
http://xoops.org.cn/

PostNuke的分支,最近很流行,插件很多,中文支持得也不错,模块组合的能力强大,wordpress,osCommerce, ipb等很多工具都可以整合成

为XOOPS的模块。

(www.xoops.org.cn/)
XOOPS - eXtensible Object Oriented Portal System, 面向对象的可扩展门户系统
XOOPS 框架稳定灵活,适应于web2.0 的各类功能的开发与集成,目前已经实现各类 RSS/ATOM 资源管理,集成 WordPress 等著名blog系统和

各类wiki管理系统,并实现与 Flickr, Delicious, Technorati 等社会资源的互动。

xaraya
http://www.xaraya.com/

中文站点:
http://zh.xaraya.com/

xaraya也是nuke系列发展起来的,基本摆脱了Nuke架构的束缚,架构上兼具 PostNuke/Drupal的优点,评价很高,模块开发潜力大,但是汉化

进展缓慢

更多的可以查看
www.opensourcecms.com

dotnetnuke用过一段时间,已经决定放弃继续使用了。

签名:
开源的力量是无穷的

posted @ | Feedback (21) | Filed Under [ 拥抱变化 ]

Saturday, December 17, 2005

release notes

http://nunit.com/testweb/index.php?p=releaseNotes&r=2.2.4

依然不习惯vs 2005自动生成的测试代码,以为很贴心,很细致,代码实际上太多太乱了。

还是简单的几行代码就晚上测试看着比较顺心。

posted @ | Feedback (3) | Filed Under [ Dot Net ]

Tuesday, December 13, 2005

如果要找一个和我们的UI层设计最类似的open soure软件的话,那应该是

http://www.myxaml.com/

作者曾经在codeproject上发表过一系列关于declare programming的文章,对我们的启发很大,不过xaml和作者的专栏很久更新了。

另外从作者这里学到的是

Property Events和Property Pool

 

posted @ | Feedback (3) | Filed Under [ Dot Net ]

Friday, December 09, 2005

每天一段郭德刚,祛火消痰防寒,相声回归现实,设计也倒退到以前

面向对象往回走,削减对象之间的关系,变成各自独立的实体。比如company和order,order不再是company的一个属性,order和company各自独立,对外提供服务。
company.getorder的职责迁移到order,order.getorderby(order.companyid)

framework简化,不再无所不包,只是把各个模块连接起来,提供objectfactory,MessageBus,模块间数据传递等基本功能。

web页面,asp.net提供了很大的便利,但是也有不方便的地方,从page control再回到font control,所有的事件处理都统一成action,动态生成webcontrol,或者干脆放弃一些webcontrol,不过一些数据绑定数据控件还是要利用它们的强大功能

数据库访问,在很多情况下,activeobject模式简单,而且用起来很方便,在很多不是很复杂的情况下能充分发挥出优点来。

对于代码,什么设计原则都不是重要的,最重要的是可测试,有了测试做基础,才有了不断改进,不断变化的可能性。

posted @ | Feedback (1) | Filed Under [ 拥抱变化 ]

Saturday, September 24, 2005

修改不需要编译,用户现场只用记事本或者查询分析器就完成用户的需求对客户来说有吸引力。

可以做编辑器,让BA来控制流程和逻辑

借助用sql或者xsl,可以方便的修改和转换。

posted @ | Feedback (11) | Filed Under [ Dot Net ]

Monday, September 19, 2005

Download details IEDevToolbar

试用了一会儿,确实为开发带来一些便利。

官方介绍:

Overview

The IE Developer Toolbar provides several features for deeply exploring and understanding Web pages.

-- Explore and modify the document object model (DOM) of a web page.
-- Locate and select specific elements on a web page through a variety of techniques.
-- Selectively disable Internet Explorer settings.
-- View HTML object class names, ID's, and details such as link paths, tab index values, and access keys.
-- Outline tables, table cells, images, or selected tags.
-- Validate HTML, CSS, WAI, and RSS web feed links.
-- Display image dimensions, file sizes, path information, and alternate (ALT) text.
-- Immediately resize the browser window to 800x600 or a custom size.
-- Selectively clear the browser cache and saved cookies. Choose from all objects or those associated with a given domain.
-- Choose direct links to W3C specification references, the Internet Explorer team weblog (blog), and other resources.
-- Display a fully featured design ruler to help accurately align objects on your pages.
The Developer Toolbar can be pinned to the Internet Explorer browser window or floated separately.
 
上一个随笔中Singleton第二个练习题的答案为1,2,那么为什么是不是创建了一个实例呢?

posted @ | Feedback (1) | Filed Under [ Dot Net ]

Tuesday, September 13, 2005

单例模式

 

使用对象时最基本的事情就是要首先创建对象的实例,一般情况下,这是一件极其简单的事情,就是用new运算符来创建某个对象的实例,简单的人们都不想提及。然而有时候你会发现创建对象的实例也不是那么简单。

 

比如有一些类,在整个程序运行期间只允许一个实例,或者我们说如果有多个实例存在程序逻辑会变得难以控制,很可能遭遇错误,比如对程序所需要的资源如连接池之类的做集中管理。

 

或者从逻辑上讲,在整个程序运行期间可以只有一个实例,当然也可以创建多个实例,这对程序逻辑没有影响,但是实施强制单一对象实例的代价要远低于带来的收益。

 

全部强制对象单一机制有些多余,我们要比较实施强制措施的代价,而不同的实施方案代价和收益是不同的。

 

最原始方案的就是全局变量,程序开始运行时初始化这个全局变量,代码中每一个使用该类的地方都引用这个全局变量。

 

全局变量一个缺点是有些对象实例实际上很可能根本不会用到,而初始化又恰恰要花点时间。没有办法做到延迟加载,当然有聪明的人会说一样可以实现延迟加载,设置一个函数,每次通过这个函数来获得这个全局变量的引用,在函数里面会判断该全局变量的状态,如果没有初始化才作初始化的动作。实际上根本的缺点在于当这样的情况变得越来越多的时候,逻辑变得很复杂,代码变得难以控制,职责变得很不明确。

 

那么我们开始重构,将类的单一实例以及类初始化的职责封装起来,然后提供一个全局的访问点让其他的代码能够访问到这个单一的类的实例。简单的实现方式可能如下:

public sealed class Singleton

{

        static Singleton instance = null;

        private Singleton () {}

        public static Singleton Instance()

        {

                if (instance==null) {instance = new Singleton (); }

                return instance;

        }

}

 

这里把Singleton类的构造函数设置为private是为了其他类不能直接用new方法来创建多个Singleton的实例并使用它,而是提供了一个全局的访问接口Instance()方法,其他的代码只能通过访问Instance方法来获得一个Singleton类的实例。在Instance()中会判断instance是否已经创建,如果没有创建的话才去创建一个实例出来。

 

练习题:为什么instance要声明为static类型的变量。

 

简单测试之后发现可以Singleton类这样的设计实现了我们的意图,那么我们再检查Singleton的代码

如果多个线程同时调用Instance()方法,而这时instance还没有被创建,这时会怎么样呢,怎样保持线程同步?

 

我们可以对Singleton做一点改造,用lock来强制线程同步

public sealed class SingletonLock

{

    static SingletonLock instance=null;

    static readonly object padlock = new object();        

    private SingletonLock() {}

    public static SingletonLock Instance()

    {

        lock (padlock)

        {

            if (instance==null) {instance = new SingletonLock();}

            return instance;

        }

    }

}

 

每次强制线程同步是很耗费资源的,而实际上只有第一次访问Instance()才需要强制线程同步以确保只创建一个实例,那么可以在锁定线程之前先判断instance是否为null,如果为null才调用lock锁定线程。

public static SingletonLock Instance()

{

    if(instance==null)

    {

        lock (padlock)

        {

            if (instance==null)

            {

                instance = new SingletonLock();

            }

        }

    }

return instance;

}

 

javac#Singleton模式提供了天然的支持,于是我们有了更简单的实现方法。

public class Singleton

{

private static Singleton instance = new Singleton();

    private Singleton(){}

    public static Singleton Instance()

    { return instance; }

}

 

static Singleton instancestatic关键字确保instance在被载入AppDomain时被初始化,而且不会有多线程的困扰。这样在访问Instance()方法时,instance必定是已经创建好的,这样的代价就是失去了延迟加载的特性。

应该是the static field initializers are executed at an implementation-dependent time prior to the first use of a static field of that class.

 

应用Singleton模式会有哪些代价呢,首先实现Singleton模式类的Singleton特性不能被子类天然继承,因为私有变量instance和公共方法Instance()都是静态的,而且基类的构造函数是private的。另外一点就是不透明,调用者知道自己在使用一个Singleton类,需要通过Instance()方法来获得实例。

 

《敏捷软件开发 原则、模式与实践》中介绍了Monostate模式,Monostate模式使用静态变量来实现多个实例共享数据,这样多个类的实例使用起来像一个实例一样,Monostate的代价一方面在于多次创建对象并且销毁会有性能方面的损失,一方面将一个类改造成遵循Monostate模式的类比较麻烦。

 

Singleton强制结构单一,防止创造出多个对象实例,Monostate强制行为单一,所有的实例表现得像一个对象。

 

练习题:

1

以前论坛经常有人争论全是静态函数的Library和遵循Singleton模式的Library孰优孰劣,静态函数的Library有什么缺点?

 

2

CreateSingleton()instance.GetResource()的返回值分别是什么

 

public sealed class Singleton

{

        static Singleton instance = null;

        private int sequence = 0;

 

        private Singleton()

        {

        }

 

        public static Singleton Instance()

        {

                if (instance==null)

                {

                        instance = Initialize();

                }

                return instance;

        }

 

        public int GetResource()

        {

                CreateSequence();

                return sequence;

        }

 

        private static Singleton Initialize()

        {

                System.Threading.Thread.Sleep(200);

                return new Singleton();

        }

 

        private void CreateSequence()

        {

                sequence = sequence + 1;

        }

}

 

public void TestSingleton ()

{

        ThreadPool.QueueUserWorkItem(new WaitCallback(CreateSingleton));

        ThreadPool.QueueUserWorkItem(new WaitCallback(CreateSingleton));

}

 

public void CreateSingleton(object o)

{

        SingletonNotThreadSafeConsuming instance = SingletonNotThreadSafeConsuming.Instance();

        instance.GetResource();

}

posted @ | Feedback (8) | Filed Under [ 拥抱变化 Dot Net ]

Monday, September 12, 2005

Template Method使用了对象继承,而继承是一种很强的对象和对象之间的耦合关系,底层模块还是依赖于高层模块,比如子类要知道哪些abstract method要重写,哪些hook method可以做扩展,哪些基类资源可以利用。

 

strategy模式使用对象之间的组合关系来代替继承,进一步减弱高层模块和底层模块之间的依赖,让底层独立于高层,使其完全符合更符合DIP的原则, 这样底层代码不需要了解高层代码是怎么工作的,高层也不需要知道底层的实现细节,

相对于Template Method模式来说strategy模式革命的更彻底一些。

 

还拿Report来作一个简单的例子。

Report的输出可以是Html格式的,可以是Word格式的,也可以是PDF格式的,我们可以定义一个Interface:IReportPublisher,在IReportPublisher中定义高层模块和低层模块之间的调用协议。(或者说Contract

 

Interface IReportPublisher {public void Publish()}

 

HTMLReportPublisher : IReportPublisher

WordReportPublisher : IReportPublisher

PDFReportPublisher : IReportPublisher

 

Report

{

      Public void GenerateReport()

{

     

      reportPublisher = MyContext.GetService()

      reportPublisher.Publish(reportData)

     

}

}

 

当然实现strategy模式也有代价,将Template Method改造成strategy模式后,架构中层次变复杂了,一些Template Method模式原有的特性就没有办法利用了,比如子类可以调用基类一些资源。

 

应用任何一种模式都会有代价,学习模式时,明白为什么这么做比明白怎么实现更重要,了解模式带来的收益的同时也要了解你要付出的代价。模式也是一直随着技术的发展在发展的,有些模式在慢慢消亡,有些新的模式出现,有些模式被新的编程语言天然支持,有些模式的形式发生了变化,Gof的《设计模式》里的一些观点现在来说已经是有些过时了。

 

strategy模式和Template Method模式的对比还体现了面向对象的另一个思想,解决对象之间的协作问题应用对象组合优先于对象继承。在面向对象的初期,人们非常看重对象继承,继承一个类,就可以重用该类的代码,把很多类的代码抽取到一个基类中就可以去掉代码重复,创建一个子类,改变一点点就能创造出一个能实现新功能的类出来,通过继承我们可以建立完整的软件结构分类,每一层都可以重用该层以上的代码,这看起来很美好,到后来人们才慢慢发现继承非常容易被过度使用,而过度使用带来的收益比代价要高的多,所以我们减少对继承的使用,用组合和委托来代替继承。

 

strategy模式和Template Method模式都面对一个问题,在运行时怎么创建某个子类或者某个实现了某个interface的类的实例,那就涉及关于创建对象实例的模式:Singleton模式和Factory模式。

posted @ | Feedback (0) | Filed Under [ 拥抱变化 Dot Net ]

Friday, September 09, 2005

template method模式和strategy模式

 

template method模式和strategy模式都是关注对象的行为的,按照依赖倒置的方法来分离抽象和具体的实现,但是两者的实现方法不同。template method模式应用了面向对象中继承的思想,而strategy模式则应用了委托的思想,从template method模式和strategy模式中也可以看到面向对象世界中abstract类和interface的异同。实际上这两种模式我们经常会用到,只是可能没有意识到而已。