我适合创业吗?

http://bulo.cn.yahoo.com/blog/blog_article.php?bname=wuying_utsc&mid=223

  看了以上这篇文章后,我不由得好好考虑自己的性格到底适不适合创业。虽然心里一直都有这么一个愿望,但从现在看来,我似乎没有非常大的潜质。毕竟,创业的目的还是要获得事业上的成功。但是如果这个成功性对于某个个体来说太小的话,那也没有多大的意义。我明白创业初期肯定要遭遇失败,并且要承受住失败,才有成功走下去的可能。但如果一开始就注定要失败(虽然没有谁一开始就注定要失败,风险太大,或者说资本预期收益为零),那么创业真的那么有意义吗?如果说是为了体验一下人生,我认为,在其他岗位上同样可以历练。
  人人都想当老板,但不是人人都适合当老板。
  但我相信,至少我还是有成为创业里的合作伙伴的潜质的

重启成本控制

  就不说"很久没写blog"的话了。其实也不是没写,我最近写的blog都在我的技术blog里了。发现写读书笔记还是一个很好的习惯的说。
  记得在上海的时候还记记帐的,现在早就不记了~~看来还没有坚持的习惯啊。不过有一个原因,就是吃饭打卡我不知道要怎么记。要一顿一顿记呢?还是打卡的时候记一个数额。一次次记的话实在太麻烦,而且根本记不住。打卡的话有一个余额的问题,不过前后扣一下也就可以了。主要是发现最近成本控制有些不行了,早上算了一下回来这一个半月的钱,有点多。买书就花了300块钱,呵呵。嗯,从今天开始记:早上一个面包,一块钱~~
  下下周考试,今天 wyf居然回家了。不过想想也对,基本没什么事,项目原型也完工了。我就要等到1月底咯~没办法,回去的车票实在不菲。现在等着我的项目还有好多。
  FTP讨论班一点都不想去了。做的东西一点前途都没有。。。not creative at all

企业应用架构模式读书笔记(二) Domain Model

这个笔记主要记录一下领域模型。
第一次听说领域模型是在JavaEye的一个帖子上。 也就是那个经典的robbin总结。那时候看是一头雾水,根本不知所云,虽然当时已经是大三下半学期,开发了学院的那个CMS。从IBM回来以后,开始着手重新启动APIS的开发,同时引入了Spring框架。一些项目上的心得,再加上对APIS设计上的疑惑加在一起,重新再看那篇帖子,真是豁然开朗啊。同时也去了Martin Fowler的Bliki上看了那篇批判贫血模型的blog
其实所谓的领域模型,我在使用Hibernate的时候,就已经使用了这个模式。不过在Martin Fowler写这本书的时候,Hibernate不知道存不存在,即使存在,也肯定很不成熟吧。通过O-R Mapping,我们建立了领域模型。比如说,对于PoEAA书里那个例子来说,建立了Contract, Product, RevenueRecognition三个领域对象。这些对象之间通过引用互相联系。同时把一部分验证、计算的逻辑放在了领域对象里。非常重要的一点是,这些领域对象,或者说这些类,可以存在继承或者关联关系,也拥有多态、封装的特性。可以说把OO发挥得淋漓尽致(不过发挥过头了也不好)。先贴一张图吧,就是书里的类图。
(附带说一下,CSDN里图片上传以后的那个预览窗口里那些文字不知道为什么还保留着,根本没有用。这个FCKeditor改得不够?)
三个领域对象互相关联。同时对不同的产品,使用了不同的计算策略(Strategy模式)。
底层的数据映射模式,可以使用Data Mapper,或者是Active Record(就是RoR里的那个),前者通过另外一个类似DAO的类来处理CRUD,而Active Record在领域对象内部处理持久化。Fowler的观点好像是不需要DAO了。
另外,对x血模型我也不是很清楚。有很多种说法,就是在JavaEye上看到的,robbin说的都不一样。最典型的就是关于贫血模型了(Anemic Domain Model),根据Fowler的说法,就是把所有的Domain Logic抽到Service 层以后,只有单纯的getter和setter的领域对象模型。而充血模型(Rich Domain Model),在底层那些POJO里就包含了一部分的逻辑。但把事务处理等工作交给了Service Layer。另外还有一个胀血模型(Bloated Domain Model),是一个反模式,把所有的工作都交给了领域对象,包括事务(因为事务总是经常要涉及到其他部分)。
还有一个失血模型,英文不知道,内容也不太清楚。这是我的理解。还有另外一种说法,同样没有失血模型的描述。也是在JavaEye上,robbin总结的帖子

  1. Anemic Domain Model: Service –> DAO –> Domain Object
  2. Rich Domain Model: Service –>Domain Object <–> DAO
  3. Bloated Domain Model: Domain Object <–> DAO

如果是这样的话,其实这和Fowler所定义的的贫血好像并不一样。脑子有点被搞糊涂了,呵呵。不过我想追究这么多,搞清楚概念也没什么用。重要的是自己去实践一下,哪个好用,易于扩展、易于维护。到底是不是纯粹的OO,并没有那么重要。

JavaScript高级程序设计读书笔记(二)

终于有一本书的读书笔记写到第二篇了,呵呵~~不过这本书的第一篇读书笔记更像是速记的内容:)
1. Javascript只有public作用域,没有private,更不用说protected,另外也没有静态方法。
2. this指向的是调用该方法的对象
    obj.color = “red”;
    obj.show = function(){
       alert(this.color);    //output “red”
    }
3. 定义类的几种方法(略去最后一种,根本没看懂,而且说非常不推荐这种做法)
(1) Factory
function showColor(){
    alert(this.color);
}
function createCar(color, doors, mpg){
    var temp = new Object;
    temp.color = color;
    temp.doors = doors;
    temp.mpg = mpg;
    temp.showColor = showColor;
}

var car = createCar(“red”, 4, 23);
缺点:没有共享函数。不同的实例间可能有不同的函数调用。可以改变一个对象的函数绑定。不用new构造,不像是类(当然,只是不像)。
(2) Constructor
function Car(color, doors, mpg){
    this.color = color;
    this.doors = doors;
    this.mpg = mpg;
    this.showColor = function(){
       alert(this.color);
    }
}

var car = new Car(“red”, 4, 23);
优点:用new构造
缺点:同工厂的第一点。
(3)Prototype
function Car(){}
Car.prototype.color = “red”;
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.showColro = function(){
    alert(this.color);
}

var car = new Car();
优点:函数真正共享,不会出现不同实例之间使用不同函数的情况(指的是同一函数名的情况下,同时Javascript里不存在函数重载)。可以使用car instanceof Car
缺点:显而易见,函数共享的同时把属性也共享了,没什么比这个更糟糕的了。
(4) Mixed Constructor/Prototype
function Car(color, doors, mpg){
    this.color = color;
    this.doors = doors;
    this.mpg = mpg;
}
Car.prototype.showColor = function(){
    alert(this.color);
}

var car = new Car(“red”, 4, 23);
优点:函数真正共享,但不共享属性。不过我发现可以把属性加入prototype来实现静态的属性。也可以使用car instanceof Car
(5) Dymanic Prototype
function Car(color, doors, mpg){
    …
    if(typeof Car._initialized == “undefined”){
       Car.prototype.showColor = function(){
          alert(this.color);
        }
    Car._initialized = true;
    }
}
这个更大的进步就在于,函数的创建只有一次了。
4. 一个StringBuffer实例,通过Array.join()来实现append()。同时还有实现Array.indexOf()方法(这个Prototype.js里也有的)。前面一个用的是构造类,后面用的是prototype

企业应用架构模式读书笔记(一)

最近懂得要写写读书笔记了。平时看了一些书,看过就忘,真是坏习惯。但记在本子上又不怎么看,觉得BLOG还算个好地方。以后都记在这里吧。当然,这本书的笔记还要为技术沙龙做一些准备。
模式先不说,先把那个例子解释清楚。英文版的看起来还是有点难度的,要看两遍才知道(其实就是因为那个例子是什么意思不知道)。不过这种经典书应该是多看几遍的吧?
先把数据库表列出来
Prouducts

int id
varchar name
varchar type

Contract

int id
int product_id
int revenue
date signon

RevenueRecognition

int
contract_id
int amount
date recognizeon

有三种产品,数据库、字处理软件、电子表格软件。IBM三件套是DB2, Lotus Word, Lotus123,微软三件套大家都很了解了,不过是SqlServer, Word, Excel。产品表很好理解了。合同表里有个产品的ID,也就是说,一份合同只是一份软件(虽然听起来比较ridiculous),还有收入(估计每一份都不一样价钱吧)。比较难理解的是收确认。因为有这么一项业务逻辑:字处理软件在签合同的当天就确认收入;而电子表格是在签合同当日确认三分之一,60天后确认三分之一,90天后确认三分之一,有点像分期付款吧;数据库也分三份,当天、30天、60天。每一次确认收入都要记录在数据库里,这样可以计算在某一日前有多少已确认的收入。
服务有两项。第一项是计算某一个合同在某一天前所确认的收入。其实这靠一条SQL语句就可以办到的。第二项是向数据库里插入某项合同的确认收入条目。比如Word就插入一条,DB2就插入三条。
顺便说一说第一个模式,也是最简单的模式:Transaction Script吧。这个是初学者常用的办法,如果再高级一点,可以用上个Command模式,让所有的Script都继承一个接口。所有的业务都在一个Script里完成,包括了业务逻辑、数据库操作、甚至是事务处理。这种模式,毋宁说是反模式,成也简单、败也简单。当然做一个DEMO、或者是以后不需要扩展的程序还是可以考虑这种模式的,呵呵。

FCKEdtior初步集成

我使用的是Javascript版本+Java的。主要用Javascript, Java的只是用来参考一下源代码。
1. 拷贝文件,主要是js包里的,根目录下fckeditor.js, fckconfig.js, fckstyles.js, fcktemplates.js以及editor目录拷贝到web应用下。拷贝到哪里与以后要设置的BasePath有关系。
2. 显示代码: 在页面里包含 fckeditor.js。然后写这一段:
<script type=”text/javascript”>
var oFCKeditor = new FCKeditor(‘content’) ;
oFCKeditor.BasePath = “fckeditor/” ;
oFCKeditor.Height = 600;
oFCKeditor.ToolbarSet = “Default” ;
oFCKeditor.Value = ”;
oFCKeditor.Create();
</script>
最主要是BasePath的设置。比如你把fckeditor.js放在了http://localhost:8080/test/fckeditor/fckeditor.js,你的调用文件在http://localhost:8080/test下,你就把BasePath设成”fckeditro/”(后面要跟’/’)
3. 上传文件的设置:
(1)修改fckconfig.js里的最后几部分,如LinkUploadURL, ImageUploadURL, FlashUploadURL,改成你上传文件的地址。不管那些什么Language了。
(2)修改editor/filemanager/browser/default/frmupload.html,把那个form的action改成上传的地址。这个不知道为什么,我是找了好久才找到的。
(3)编写upload servlet。参考Java包里的那个ConnectorServlet里的doPost()方法。 主要是返回值要设对。

javascript高级程序设计读书笔记(一)

上“人机交互”课上时记的一些东西,留下来备忘。上次那个JVM书的读书笔记真的只有一篇了,因为只能在IBM里才能看到,呵呵~~
1. isFinit(Number) 判断数字是不是无穷大, isNan(..)判断是不是数字
2. parseInt(String, int), 可以解析各种进制的整数
3. Nan != NaN, typeof(null) == “object”
4. Stirng.charCodeAt(int)
5. String.slice()基本上等于String.substring,不同的是substring(3, -4) == substring(3),对于负数,substring是忽略的。
6. ===, !==
7. Array.push(), Array.pop(), Array.shift(), Array.unshift()
8. Array.splice(),可以插入、替换、删除数组中的元素
9. Global对象,很大部分全局函数是Global对象的属性
10. encodeURI(), encodeURIComponent()