posts - 34, comments - 2158, trackbacks - 1, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2011年5月13日

sql语句又叫ad hoc sql, ad hoc是拉丁语,意思是for this,可以翻译为“按每一次情况的办理”
存储过程就是stored procedure, 简写为sp
ORM就是对象-关系映射,比如Hibernate

大多数的.NET程序都是会围绕sql服务器展开,经常要面临在这些技术间进行选择。所以我们需要来理解这些技术的本质。

一,演变
  刚开始的时候,只有sql语句,即可以用交互模式一句一句执行, 也可以用批模式执行,多行sql语句一次提交执行。
  很快人们发现用批模式执行的一堆sql语言可以用过程的形式,事先存放到数据库里面,这就变成了存储过程。
  随着面向对象技术的成熟,从程序中可以自动生成sql语句,这就是ORM
 

二,性能
  很多人会说存储过程比sql语句性能好,其实这个说法并不精确。
 如果我们把一堆sql,以批的方式一次送入到服务器,那么服务器,会对这一堆sql进行缓存,当下一次再度执行的时候,就好像调用一个”匿名“的存储过程一样。
在这种情况下,性能差不多。
  但是,如果我们不注意,很有可能,把可以一次提交的sql,变成了多次提交,甚至是每个循环做了一次提交,那么性能就很差了。
  也就是说如果使用sql,只要写法得当,性能和sp区别不大。
  同样的道理,ORM的性能取决于ORM的Sql生成算法, 和用户使用的时候,对生成算法的控制,比如利用好Lazy laoding等,在某些情况下,甚至可以不通过sql,毕竟没有sql比最优化的sql还要快。

三,可维护性

  可维护性是选择sql,sp,orm最主要的因素。
  这里面有点”玄“,因为不同的场景会得出不同的结论,俗称“It depends"
  刚开始的时候,sql的维护性看起来是最差,因为它往往散布在程序的每个角落。而存储过陈都放在数据库中,有清晰接口。
  但是如果我们做一次重构,情况居然会颠倒过来。
  首先,存储过程完全可以照搬到C#中,sp的名字直接变成method的名字,sp的参数表直接变成method的参数表,(其实就是Command模式)。
  其次,把这些methdod放到一个文件或者文件夹中。(所谓的DAL层,如果喜欢层的话)
  通过这个重构,我们获得了以下的好处,

  1,首先是过程的调用和过程的定义放到了一起,修改起来比较方便。IDE都有定义跳转功能。
  2,过程的调用和定义同时进行版本控制,不会出现不匹配的情况。减少了sp的参数表和调用的不匹配,包括拼写,类型,参数次序
  3,单元测试非常方便

  当然sp也有存在的价值,比如所谓的安全性,后面会提到。比如友好的调试环境,对于中小型项目,和初级程序员来说,也是很好的选择。
 
  ORM则将可维护性提升身到了一个新的高度,它试图将sql屏蔽起来,在操作对象的同时,自动就把数据库的事情给办了。
  ORM有两种模式,一种是ActiveRecord, 一种是Datamapper,前者从数据库中读取定义,后者在程序中定义。不过由于前者往往用migration来生成数据库,其实也是定义在程序里面的。好的ORM都有"leaking"的设计,也就是留了个”后门“,让你有机会用sql来控制。
 
  微软的linq从某个角度类说,也是一种ORM, 它的设计思想可能是因为它觉得写sql语句比写c#代码效率高,所以提供直接在C#中写sql语句的机制,再自动生成真正的sql。不过,ORM真正价值在于它可以在恰当的时候,完全抛弃sql,比如比如读用cache,写用queue。而微软的linq,完全是“无厘头”的风格,在O中用R的写法,难道是RRM, 唯一的好处只是锁定程序和程序员在微软的平台上。

 三,安全性

  对企业来说,安全性有的时候比性能更重要,由于存储过程在数据库上多加了一道屏障,所以很多企业会把存储过程作为首选。
  ORM可以说是安全性最差的, 因为只有到程序运行起来,你才能知道,会产生什么样的sql。
  但是保证安全有许多方法和方面,比如部署前的测试, 数据库的备份,对表的权限的设置。等。用sp来保证安全,只是多个选项中的一个。
  在startup型企业中,高级程序员往往起到主导作用, 所以他们会不犹豫的选择ORM。
  在传统企业中,如果DBA或者技术主管比较强势,往往会采用sp。

posted @ 2011-05-13 15:34 栖山 阅读(2770) 评论(30) 编辑

2011年4月6日

javascirpt是和C#有着相当不同的语言,C#是面向类的静态编程语言(这里暂不考虑C# 4.0添加的动态特性),而javascript是面向对象的函数式编程语言。
虽然C#和javascript差别很大, 但是我们还有可能利用已经掌握的技能来加速对新技能的掌握。

 一、javascirpt面向对象特性。
 C#是面象类的。它通过“2步法”来获得一个可以操做的对象。首先通过class关键字来定义一个类,然后通过new关键字获得一个对象。这包含了以下几层意思。
1,首先我们需要定义一个对象的结构,这就是类
2,我们通过这个结构,赋予状态来获得一个对象(或者叫实例对象)
3,在使用new关键字的时候,系统会调用一个构造函数,来给对象赋予一个初始状态。
总结: C#需要先决定对象的结构,然后再决定对象的状态, 并且在决定了对象的状态后,不允许再改变对象的结构。所谓的“2步法”就是先结构,后状态。且有了状态后,结构不允许再发生变动。

 javascript可以采用“1步法”,也就是说决定结构和状态的操作在同一个步骤内完成。
  例如 cat.color="while", 这个操作在给对象添加了一个叫color(颜色)的结构的同时,赋予了"white"(白色)这个属性。而上面这个操作是在程序的任何地方使用的。
 由于使用“1步法",类的存在就没有了意义。只要我们有了一个对象,我们就可以随时随地给对象同时添加结构和状态,或者叫属性和赋值。(如果硬要套上类的概念的话,那么javasciprt里面的类是不停地在变化的)
 在C#中new关键字是产生一个对象唯一手段,在javascript中new关键字只是产生一个对象的2个方式中的一种。
第一种产生一个对象的方式是使用“{}"操作符。
 baby={};
 singer={name:"张学友“,sex: "男“}
第1个对象没有什么结构,第2个对象有名有性。以后我们还可以添加其他属性。
到这里你也许会问,有了那么方便的产生对象的“{}"操作符,为什么还需要 new关键字呢?
利用new关键字,可以调用一个函数(即构造函数,或者叫constructor)来完成构建对象的动作,从而获得“2步法“的效果。
比如
function Person(name,sex) {
  this.name=name;
  this.sex =sex;
}
 singer=new Person("张学友",”男")

这里虽然看上去和c#的写法很象,似乎采用了“2步法“,Person函数定义了结构,new语句赋予了状态。但是这个“2步法“和C#的“2步法“有所区别,因为它的"2步“不是很严格的“2步”。

如果我们把构造里面的语句注释掉,换成:
function Person(name,sex) {
 // this.name=name;
 // this.sex =sex;
}
singer=new Persion()
singer.name="张学有"
singer.sex="男“

最后得到的singer对象和前例得到的singer对象完全相同。
我们可以自由的把定义结构的第一步,移出构造函数,仍然使用“1步法“来获得等价的效果。
由于javascript可以随时通过“1步法”同时添加结构和状态, 因此使用“{}"还是使用“new"来产生新对象,可以按照实际需求来自由选择了(很free吧)。

二,javascript的继承。
由于javascript的对象构建采用了“1步法“,同时添加结构和状态, 所以javascript的继承也是“同步”的,同时继承结构和状态。
在C#中,是通过类来继承,并且只继承结构,不继承状态,这个继承通过父类来实现。而在javascript中需要同时继承结构和状态,因此是通过对象来继承了。
因此C#是面向类的语言,javascript是面向对象的语言(同时继承结构和状态)。
一个比较标准的说法是javascript通过prototype来实现继承。其实所谓prototype就是父对象(和C#中的父类相对应)。子对象继承父对象的所有结构和状态(前提是自己对应的结构和状态不存在)
这里有一个学习上的难点,就是一个对象并不直接通过prototype属性连接到它的父对象,而是通过constructor属性的prototype对象,间接的连接到它的父对象。
代码表示如下:
function Monkey() {
}
function Person() {
}
singer=new Person();
Person.prototype=new Monkey()

Person.prototype.constructor= Person

//  assert_true singer.constructor == Person   也就是说singer对象有一个constructor属性指向了Person,而Person再通过prototype属性指向 new Money()对象

喜欢刨根问底的人一定会问,为什么一个子对象不能直接有一个prototype属性来直接指向父对象呢?
其实这是可以的,例如在Firefox中,每一个对象都有一个__proto__属性指向它的父对象。(但是这个属性是不建议用户使用的)
那为什么其他浏览器不这么做呢?而要通过constructor(构造函数)来间接的连接到父对象呢。其实这是有充分理由的,是一个精心的设计。
如果每个对象可以直接连接到父亲对象,那么会出现一个非常混乱的情况,如果我们随时在父对象通过“1步法”同时添加属性和状态,随时会被子对象继承。如果出错了,那么我们需要检查整个程序来找到造成麻烦的那句话。这显然不是个好的设计。

那么该怎么办呢?
通过上面的例子,我们知道通过构造函数,我们可以获得2步法的效果,因此我们把父对象连接到子对象的构造函数的prototype属性上,并且定一个“君子协定”,凡是需要添加属性,都放到构造函数中,这样我们只要检查构造函数,就可以知道子对象继承了哪些结构(注意,状态的继承不受限制,因为构造函数是2步法中的第一步,决定结构)。

由于要给prototype赋值一定要借助于构造函数,因此就“不动声色的,诱导性的“,让你很“自然地“使用“2步法“来完成继承工作,让代码组织性更好。但是由于是“君子协定”,你如果在构造函数外添加结构,也完全做得到,不过也许会在某些情况下造成一些大小麻烦。
有朋友也许会问,本来都是对象很好理解,扯出来函数,反而迷糊了。其实函数就是对象。如果对这个事实感觉很难理解。我们可以试试采用下面的说法。
世上本来没有函数,都是对象。不过有一种对象比较特殊,它有一个非常特殊的属性“()”,使用这个属性,需要省略“."这个操作符,例如是“Person()"而不是“Person.()",这个属性不象 singer.name属性直接输出一个状态,比如“张学友“,而是能够通过它内部隐藏的一段代码,完成一个计算,并且在“()”中可以添加一些参数,从而对它内部代码的运行施加影响。由于它是一个对象,所以其他对象能够出现的地方,它也能出现。最后我们把这种对象称为函数。而它也让函数式编程成为了可能。

至此,你有没有发觉javascript的面向对象是那么的优雅,灵活和简洁呢?那个初看起来很难懂的prototype的设计,其实蕴含了设计者的良苦用心。
而javascript的函数式编程更将这种美发挥到了极致,简直是惊为天人。(这个另文再说)。

另外通过学习javascript,既可以对C#的静态特性有更好的理解。也有助于对c# 4.0添加的动态特性的进一步学习(虽然我对c#的动态特性并不看好,主要原因是同时包含静态和动态特性反而让程序员难以取舍。这也是Java对动态特性一直比较抗拒的原因)。

posted @ 2011-04-06 14:53 栖山 阅读(1632) 评论(12) 编辑

2011年3月2日

 在我第一次看到愤怒的小鸟这个游戏的时候,就对它物理模拟的效果赞叹不已。在一次园子中的评论中,几位园友对小鸟的技术不屑一顾。实在看不下去了,当时我谈了一些自己的看法,但也没有深究下去。今天看到一条新闻,就顺藤摸瓜做了一下调查研究,下面把一些调查结果和大家分享一下。
这是新闻的链接http://www.cnbeta.com/articles/136109.htm)

  让我很吃惊的是,小鸟的物理引擎不是小鸟游戏开发公司的原创,而是一个开源的物理引擎,名叫Box2D

  这个引擎起源于2006年的GDC大会上的一个物理碰撞的教程,随后发布为开源项目。最初的演示就是一堆箱子。(这里是一个项目原型的截图,http://www.box2d.org/screenshots.html)
  看到这些图,我真的很吃惊,这几乎就是一个小鸟游戏的很粗略的示意图。难怪Box2D的作者会对小鸟公司表示不满。
  在2008年3月6日,2.0版正式引入“持续碰撞检测”(continuous collision detection)。这是我最欣赏的一个特性,而小鸟游戏的开发是在2009年。也就是说这个2.0版本让小鸟游戏直接成为了可能。
  同时这个引擎也被移植到了XNA平台,这样在Windows Phone 7上,小鸟也可以运行了。

  下面是Box2D的全部特性。

(有几个个特性看上去非常有技术含量。我不是做游戏的,很多特性我也不知道什么意思)

Collision
    * Continuous collision detection
    * Contact callbacks: begin, end, pre-solve, post-solve(接触回调函数)
    * Convex polyons and circles.
    * Multiple shapes per body(多形状实体)
    * One-shot contact manifolds (击打接触,是为小鸟设计的?)
    * Dynamic tree broadphase
    * Efficient pair management
    * Fast broadphase AABB queries(这个是什么?)
    * Collision groups and categories

Physics

    * Continuous physics with time of impact solver
    * Persistent body-joint-contact graph
    * Island solution and sleep management
    * Contact, friction, and restitution
    * Stable stacking with a linear-time solver (这个是什么?)
    * Revolute, prismatic, distance, pulley, gear, mouse joint, and other joint types
    * Joint limits, motors, and friction
    * Momentum decoupled position correction
    * Fairly accurate reaction forces/impulses (比较精确的力反馈)

System

    * Small block and stack allocators
    * Centralized tuning parameters
    * Highly portable C++ with no use of STL containers

结论:

  1,愤怒的小鸟是一个非常有技术含量的游戏,不过这个技术含量更多来源于它的开源物理引擎,当然小鸟的创意也是成功非常重要的因素。
  2,开源里面有大量等待发掘的金矿,只要我们勇于探索,也许有一天我们也能有非常有创意的产品出现。
  3,虽然我是用我的经验和审美来直觉体验小鸟的深刻技术内涵,不过多一点调查总是有好处的。可以收获更多的知识和经验
  4,如果我们使用了开源项目,应该表示出对原作者足够的尊重, 而愤怒的小鸟在这一个点上显然做得不够好。

 

posted @ 2011-03-02 13:08 栖山 阅读(5962) 评论(56) 编辑

2011年1月7日

网络小教室是第一个按照Web 3.0原则设计的网站。目前所有的功能基本都已经实现,现在把基本的功能设计贴出,供大家讨论。
网络小教室共有两种角色,教师和学员。
教师通过出题,来引导学生学习。每个教室都有一个主题,例如Linux小教室。
那么他的域名就是 linux.xiaojiaoshi.com,如果是javascript主题,那么就是javascript.xiaojiaoshi.com

教师可能出如下的一道题

 
    利用ls -l readme.txt 显示readme.txt的权限如下
    rwxr-xr-- root mysql
    请详细说明上面的含义。

学生A的回答可能说下:

    r表示读,w表示写,x表示执行,-表示没有权限,文件的用户拥有者是用户root,文件的组有者是mysql   

学生B的回答可能如下:

    rwx表示有读,写,执行的权限
    r-x表示有读,执行的权限,没有执行权限
    r--表示有读权限,没有写,执行权限

然后每个学生都可以都可以对其他学生的答案进行评价和投票,教师可以根据自己的喜好评出最佳答案。

也许你看到这里会说:“这不就是百度知道吗?“

很象,但是本质上完全不同。就好象微博和博客的区别,绝对不是140个字的区别。
百度知道,提出问题的人是低端,而回答问题的人是高端,而在小教室提出问题的人是高端,回答问题的人是低端。

 

那么网络小教室和传统的教室有什么区别呢?
传统的教室,同学之间不能互相查看答案,而网络小教室鼓励互相查看答案,并可以对各自的答案作出评价。
传统的教室,需要老师对每一个学生的答案进行批改,而小教室鼓励学生之间互相批改。教室可以选择最典型的答案进行评论。

网络小教室有比较完善的积分和奖章体系。

例如: 回答一个问题可以获得10分,回答的问题获得别人的1个好评可以获得一个铜牌。

网络小教室有比较完善的标签系统。

例如在linux教室里面,可能有"文件“,”文件夹“,"权限“等标签,

网络小教室非常依赖于教师的质量,因此它非常尊重教师的作用,将最大程度上让利于教师。

教师可以租用,甚至买断教室,而网站本身按照Web 3.0的原则,以云服务商的身份提供服务。

如果,你积累了很多有价值的知识,那么通过网络小教室的途径将他传递出来,你不仅能获得声望,更能获得实际的收益。
而对广大的新手来说,有机会通过小教室,用最低的成本学到前辈的知识。而且也有机会享受网站的收益。

没错,因为学生也是用户,所以学生和老师可以同样用积分获得网站的股份。








 

    

posted @ 2011-01-07 15:34 栖山 阅读(791) 评论(3) 编辑

2011年1月4日

Web 1.0 是由网站向用户发布内容,所有的内容由网站制作,内容版权归网站所有。
  代表性的网站有新闻网站(新浪,搜狐), 视频网站(土豆,优酷)
Web 2.0 是由用户产生内容(User Generated Content),俗称UGC,内容版权归网站所有。
  代表性的网站有人人网,百度贴吧,新浪微博等

  那么什么是Web 3.0呢?我构想了我的web3.0网站的准则。
  Web 3.0就是用户产生内容,同时用户拥有内容(User Owned Content),俗称UOC。
  Web 3.0和 Web 2.0的巨大区别在于。Web 3.0 网站打破了用户和网站的收益的不平衡性。
 
 下面说明一下Web 3.0的基本原则。

 
  1,网站的所有股份分为三份,三分之一为用户股,三分之一为员工股,三分之一为风投股。
  2,用户按照自己的积分,来确定自己所占用户股的比例,如果所有的用户积分为1万分,你的积分为1000分,那么所占的股份比例就是3.3%
  3,用户的股份在公司被整体收购或上市前不能变现,但是可以参与广告收入的分成,比例为三分之一。
  4,网站的某个部分可以作为云设施租用给用户,用户可以用股份来支付费用。
  5,网站的管理,制作人员(包括程序员,设计师,市场人员)占有三分之一的员工股。
  6,员工股在公司被整体收购或者上市前不能变现,但是可以参与广告收入的分成,比例为三分之一。
  7,员工不能租用网站设施,但是可以获得在网站中植入自己的应用的权利(类似于外接网站)
  8,在公司被整体收购或者上市前,风投的股份不能超过三分之一
  9,是否被收购或者上市,由用户,员工,风投共同投票决定。

  我设计的这个Web 3.0蓝图的可以为程序员和设计师创造出更多的就业机会,也避免了网站店大欺客的现象。同时能大大提高风投的命中率。
  在Web 3.0时代, 用户有机会成为真正意义上的上帝。  

  遵循Web 3.0原则的第一个网站的编码已经接近尾声。希望在春节期间能推出。
  在推出之前也会出一些博客介绍相应的情况。
  虽然这样的尝试,很有可能会失败,我相信这会是一个趋势。如果真的成功了,那么就成为一个中国式创新了。

   真心希望能让程序员都富裕起来。

posted @ 2011-01-04 20:06 栖山 阅读(4696) 评论(36) 编辑

2011年1月3日

摘要: 在linux中一切都是文件(文件夹和硬件外设是特殊的文件),如果有可能尽量使用文本文件。文本文件是人和机器能理解的文件,也成为人和机器进行交流的最好途径。由于所有的配置文件都是文本,所以你只需要一个最简单的编辑器就可以修改。即使是2进制执行文件,也会附上源代码。 这就是Linux的基本哲学,也是开源的基本精神。GNU/Linux的最终发展就是跨越人和机器之间的界限。 (比较:Windows中的一切也都是文件,大多都是微软格式编码过的2进制文件,而配置文件也往往都是进行2进制编码的,甚至成果物都是2进制编码的, 比如doc文件,你需要使用微软的API才能完成修改。微软将数据和程序同时二进制化的做阅读全文

posted @ 2011-01-03 21:45 栖山 阅读(1799) 评论(25) 编辑

2010年12月27日

摘要: “If you can't explain it simply, you don't understand it well enough” Albert Einstein 有很多关于Linux的书籍,博客。大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多人望而却步。未入其门就路过了。 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语言来介绍Linux背景和动机。 就如同...阅读全文

posted @ 2010-12-27 22:47 栖山 阅读(14268) 评论(38) 编辑

2010年12月13日

摘要: 看了园子中的一篇奇文, 《重构者的20种死法》。居然有20多个人推荐。我顿时有了放下手头工作,写一篇博文的动力。首先来看一个事实,百度,谷歌,腾讯的程序员们的工资是一般程序员的2,3倍,高级程序员的工资可能是5倍以上。国外创业企业的软件开发者由于可以拿到股份,收入可能有百倍之多。这是为什么呢?他们的电脑性能最多比我们的好50%吧。他们的工作时间可能还要比我们少。他们的人体构造和我们也没有任何区别。...阅读全文

posted @ 2010-12-13 18:11 栖山 阅读(12220) 评论(170) 编辑

2010年11月29日

摘要: 说明1:对点击“推荐“的朋友表示感谢,博客园有没有可以看到是谁推荐的功能呢?说明2:对所有的评论朋友表示感谢,即使是批评意见也很有价值。说明3:是这个系列的第一篇,忍不住放入太多内容,导致重点不突出,等有时间把文章重构成2-3篇说明4:题目中的Hacker是特指编程技术超牛的程序员。而不是指黑客,由于中文把Hacker翻译成了黑客所以导致了混淆。 黑客又被称为黑帽黑客(Bl...阅读全文

posted @ 2010-11-29 18:41 栖山 阅读(3672) 评论(73) 编辑

2010年11月27日

摘要: 一点说明:之所以叫不能说的秘密,并非因为保守,而是因为告诉一般人,他非但理解不了,还有可能要取笑你。所以有自尊的Hacker往往只传自己信得过的人,以免自讨没趣。于是很多东西就逐渐成为了不能说的秘密。所以这个Hacker传说系列也是一个尝试,仅供参考。 一个Hacker相对于程序员来说有着超过100倍的惊人效率。并非是由于他们的智商超过一百倍。而在于他们掌握了程序员没有掌握的"魔法"。重量级秘密之...阅读全文

posted @ 2010-11-27 13:47 栖山 阅读(6021) 评论(119) 编辑