文韬's profile菠萝的天空PhotosBlogListsMore Tools Help

Blog


    September 03

    Closure

    Martin Fowler    http://martinfowler.com/bliki/Closure.html

    Closure

    design 8 September 2004 Reactions

    As there is a growing interest in dynamic languages, more people are running into a programming concept called Closures or Blocks. People from a C/C++/Java/C# language background don't have closures and as a result aren't sure what they are. Here's a brief explanation, those who have done a decent amount of programming in languages that have them won't find this interesting.

    Closures have been around for a long time. I ran into them properly for the first time in Smalltalk where they're called Blocks. Lisp uses them heavily. They're also present in the Ruby scripting language - and are a major reason why many rubyists like using Ruby for scripting.

    Essentially a closure is a block of code that can be passed as an argument to a function call. I'll illustrate this with a simple example. Imagine I have a list of employee objects and I want a list of those employees who are managers, which I determine with an IsManager property. Using C#, I'd probably write it like this.

      public static IList Managers(IList emps) {
        IList result = new ArrayList();
        foreach(Employee e in emps)
          if (e.IsManager) result.Add(e);
        return result;
      }
    

    In a language that has Closures, in this case Ruby, I'd write this.

    def managers(emps)
      return emps.select {|e| e.isManager}
    end
      

    Essentially select is a method defined on the Ruby collection class. It takes a block of code, a closure, as an argument. In ruby you write that block of code between curlies (not the only way). If the block of code takes any arguments you declare those between the vertical bars. What select does is iterate through the input array, executes the block of code with each element, and returns an array of those elements for which the block evaluated as true.

    Now if you're a C programmer you probably think "I could do that with a function pointer", if you're a Java programmer you probably think "I could do that with an anonymous inner class", a C#er would consider a delegate. These mechanisms are similar to closures, but there are two telling differences.

    The first one is a formal difference, closures can refer to variables visible at the time they were defined. Consider this method

    def highPaid(emps)
      threshold = 150
      return emps.select {|e| e.salary > threshold}
    end
      

    Notice that the code in the select block is referring to a local variable defined in the enclosing method. Many of the alternatives to closures in languages that don't have real closures can't do that. Closures allow you to do even more interesting stuff. Consider this function.

    def paidMore(amount)
      return Proc.new {|e| e.salary > amount}
    end
    

    This function returns a closure, indeed it returns a closure whose behavior depends on the argument sent into it. I can create such a function with and assign it to a variable.

    highPaid = paidMore(150)
    

    The variable highPaid contains a block of code (called a Proc in Ruby) that will return whether a tested object has a salary greater than 150. I might use it like this.

    john = Employee.new
    john.salary = 200
    print highPaid.call(john)
      

    The expression highPaid.call(john) calls the e.salary > amount code I defined earlier, with the amount variable in that code bound the to the 150 I passed in when I created the proc object. Even if that 150 value went out of scope when I issue the print call, the binding still remains.

    So the first crucial point about closures is that they are a block of code plus the bindings to the environment they came from. This is the formal thing that sets closures apart from function pointers and similar techniques.(Java's anonymous inner classes can access locals - but only if they are final.)

    The second difference is less of a defined formal difference, but is just as important, if not more so in practice. Languages that support closures allow you to define them with very little syntax. While this might not seem an important point, I believe it's crucial - it's the key to make it natural to use them frequently. Look at Lisp, Smalltalk, or Ruby code and you'll see closures all over the place - much more frequently used than the similar structures in other languages. The ability to bind to local variables is part of that, but I think the biggest reason is that the notation to use them is simple and clear.

    A good case in point is what happened when ex-Smalltalkers started in Java. Initially many people, including me, experimented with using anonymous inner classes to do many of things that we'd done with blocks in smalltalk. But the resulting code was just too messy and ugly so we gave up.

    Like any term in software there is a lot of blur about the exact definition of closure. Some people say that the term only applies to an actual value that includes bindings from its environment, such as the value returned by highPaid. Others use the term 'closure' to refer to a programming construct that has the ability to bind to its environment. This debate, an example of the TypeInstanceHomonym, is usually carried out with the politeness and lack of pedantry that our profession is known for.

    I use closures a lot in Ruby, but I don't tend to create Procs and pass them around. Most of the time my use of closures is based around CollectionClosureMethods similar to the select method I showed earlier. Another common use is the 'execute around method', such as when processing a file.

    File.open(filename) {|f| doSomethingWithFile(f)}
    

    Here the open method opens the file, executes the supplied block, and then closes it. This can be a very handy idiom for things like transactions (remember to commit or rollback) or indeed anything where you have to remember to do something at the end. I use this extensively in my xml transformation routines.

    Such use of closures is actually much less than what people in the Lisp and functional programming worlds do. But even with my limited uses I miss them a lot when programming in languages without them. They are one of those things that seem minor when you first come across them, but you quickly grow to like them.

    March 19

    Moonlight Shadow

    The last that ever she saw him carried away by a moonlight shadow
    He passed on worried and warning carried away by a moonlight shadow
    Lost in a river last saturday night far away on the other side
    He was caught in the middle of a desperate fight
    And she couldn't find how to push through

    The trees that whisper in the evening carried away by a moonlight shadow
    Sing a song of sorrow and grieving carried away by a moonlight shadow
    All she saw was a silhouette of a gun far away on the other side
    He was shot six times by a man on the run
    And she couldn't find how to push through

    I stay, I pray, I see you in heaven far away
    I stay, I pray, I see you in heaven one day

    Four A.M. in the morning carried away by a moonlight shadow
    I watched your vision forming carried away by a moonlight shadow
    Stars moved slowly in a silvery night far away on the other side
    Will you come to talk to me this night?
    But she couldn't find how to push through

    I stay, I pray, I see you in heaven far away
    I stay, I pray, I see you in heaven one day

    Caught in the middle of a hundred and five
    The night was heavy and the air was alive
    But she couldn't find how to push through
    Far away on the other side. The night was heavy and the air was alive
    But she couldn't find how to push through
    She couldn't find how to push through, how to push through (Repeat)
    October 22

    2007年10月20日,HO1120,成都至上海的航班上

         2007年10月20日,HO1120,成都至上海的航班上
         今天终于离开了生我养我的家乡-四川,23年了,第一次离开四川去寻找属于自己的世界,一直以来我都认为我是生性好动的,讨厌平淡安逸的生活,喜欢漂泊与挑战,就像每年的旅行一样,期望去发现能刺激我的元素。记得八年前当我第一次来到上海时,那天的天很蓝,蓝的超出了我的想象(四川盆地感觉随时都是雾蒙蒙的,特别是成都),蓝天下整个现代化的都市使我相当震撼,繁华、高节奏、竞争与机会,充满了那么多能刺激我的元素,那时我就知道总有一天我会回到这里的。从高考的失败,到毕业后的犹豫,今天我终于决定出发了,1800公里,2小时40分钟的航程,我的人生一定会从今天开始改变。
         现在飞机是不是在绝恋妹妹生活的城市上空喃?嘿嘿
         一直以来都想离开成都,但是当今天真正离开时,我发现还是很舍不得,熟悉的街道、亲人、朋友,还有我深爱的人,这一切都将远离,今天家人给我送别时我发现我居然有点想哭的冲动,o(∩_∩)o...还好拒绝了所有朋友的送别,不然真的哭了就丢脸了。其实时间还是过的蛮快的,都已在成电工作一年了,当时应聘成电时的场景都还历历在目,7个部门领导的面试感觉就像在审犯人一样,当然袁主任还是那么的和蔼、有魅力,:-)。在成电一年收获还是蛮大的,认识了一些朋友,关键还有电信小妹哦,^_^
         还有20分钟就要到上海了,本来还有很多要写的,只有等下飞机后继续了,飞机即将降落,我的梦想即将起飞,fighting,nothing is impossible.
    March 22

    add sequence

    interface Selector {
       boolean end();
       object current();
       void next();
    }
     
    public class Sequence
       private Object[] obs;
       private int next=0;
       public Sequence(int size){
           obs=new object[size];
       }
       public void add(object x) {
           if(next < obs.lenght) {
              obs[next] = x;
              next++;
              }
       }
       private class SSelector implements Selector {
          int i = 0;
          public boolean end() {
              return i == obs.lenght;
          }
          public object current() {
              return obs[i];
          }
          public void next() {
             if(i < obs.lenght) i++;
          }
       }
     
       public Selector getSelector() {
           return new SSelector();
       }
       public static void main(String[] args) {
          Sequence s = new Sequence(10);
          for(int i = 0; i<10 ; i++)
             s.add(Integer.toString(i));
          Selector sl = s.getSelector();
          while(!sl.end()) {
              System.out.println(sl.current());
              sl.next();
          }
       }
    }

    Hibernate

    Hibernate是一个免费的开源Java包,它使得与关系数据库打交道变得十分轻松,就像您的数据库中包含每天使用的普通Java对象一样,同时不必考虑如何把它们从神秘的数据库表中取出(或放回到数据库表中)。它解放了您,使您可以专注于应用程序的对象和功能,而不必担心如何保存它们或稍后如何找到它们。
      
      大多数应用程序都需要处理数据。Java应用程序运行时,往往把数据封装为相互连接的对象网络,但是当程序结束时,这些对象就会消失在一团逻辑中,所以需要有一些保存它们的方法。有时候,甚至在编写应用程序之前,数据就已经存在了,所以需要有读入它们和将其表示为对象的方法。手动编写代码来执行这些任务不仅单调乏味、易于出错,而且会占用整个应用程序的很大一部分开发工作量。
      
      优秀的面向对象开发人员厌倦了这种重复性的劳动,他们开始采用通常的“积极”偷懒做法,即,创建工具,使整个过程自动化。对于关系数据库来说,这种努力的最大成果就是对象/关系映射(ORM)工具。
      
      这类工具有很多,从昂贵的商业产品到内置于J2EE中的EJB标准。然而,在很多情况下,这些工具具有自身的复杂性,使得开发人员必须学习使用它们的详细规则,并修改组成应用程序的类以满足映射系统的需要。由于这些工具为应付更加严格和复杂的企业需求而不断发展,于是在比较简单和常见的场景中,使用它们所面临的复杂性反而盖过了所能获得的好处。这引起了一场革命,促进了轻量级解决方案的出现,而Hibernate就是这样的一个例子。
      
      Hibernate的工作方式
      
      Hibernate不会对您造成妨碍,也不会强迫您修改对象的行为方式。它们不需要实现任何不可思议的接口以便能够持续存在。惟一需要做的就是创建一份XML“映射文档”,告诉Hibernate您希望能够保存在数据库中的类,以及它们如何关联到该数据库中的表和列,然后就可以要求它以对象的形式获取数据,或者把对象保存为数据。与其他解决方案相比,它几乎已经很完美了。
      
      由于本文只是一篇介绍性的文章,所以不会引入构建和使用Hibernate映射文档的具体例子(我在《Hibernate: A Developer's Notebook》一书的头几章中已经介绍了一个例子)。此外,在网上和Hibernate的在线文档中,还可以找到一些不错的例子,请参见下面的“其他信息”部分。它实际上相当直观。应用程序对象中的属性以一种简单而自然的方式与正确的数据库结构相关联。
      
      运行时,Hibernate读取映射文档,然后动态构建Java类,以便管理数据库与Java之间的转换。在Hibernate中有一个简单而直观的API,用于对数据库所表示的对象执行查询。要修改这些对象,(一般情况下)只需在程序中与它们进行交互,然后告诉Hibernate保存修改即可。类似地,创建新对象也很简单;只需以常规方式创建它们,然后告诉Hibernate有关它们的信息,这样就能在数据库中保存它们。
      
      Hibernate API学习起来很简单,而且它与程序流的交互相当自然。在适当的位置调用它,就可以达成目的。它带来了很多自动化和代码节省方面的好处,所以花一点时间学习它是值得的。而且还可以获得另一个好处,即代码不用关心要使用的数据库种类(否则的话甚至必须知道)。我所在的公司就曾有过在开发过程后期被迫更换数据库厂商的经历。这会造成巨大的灾难,但是借助于Hibernate,只需要简单地修改Hibernate配置文件即可。
      
      这里的讨论假定您已经通过创建Hibernate映射文档,建立了一个关系数据库,并且拥有要映射的Java类。有一个Hibernate“工具集”可在编译时使用,以支持不同的工作流。例如,如果您已经拥有Java类和映射文档,Hibernate可以为您创建(或更新)必需的数据库表。或者,仅仅从映射文档开始,Hibernate也能够生成数据类。或者,它可以反向设计您的数据库和类,从而拟定映射文档。还有一些用于Eclipse的alpha 插件,它们可以在IDE中提供智能的编辑支持以及对这些工具的图形访问。
      
      如果您使用的是Hibernate 2环境,这些工具鲜有提供,但是存在可用的第三方工具。
      
      使用Hibernate的场合
      
      既然Hibernate看起来如此灵活好用,为什么还要使用其他的工具呢?下面有一些场景,可以帮助您做出判断(或许通过提供一些比较和上下文,可以有助于鉴别非常适用Hibernate的场合)。
      
      如果应用对于数据存储的需要十分简单??例如,您只想管理一组用户优先选择??您根本不需要数据库,更不用说一个优秀的对象-关系映射系统了(即使它也如Hibernate这般易于使用)!从Java 1.4开始,有一个标准的Java Preferences API可以很好地发挥这个作用。(在ONJava文章中可以找到有关Preferences API的更多信息。)
      
      对于熟悉使用关系数据库和了解如何执行完美的SQL查询与企业数据库交互的人来说,Hibernate似乎有些碍手碍脚,这就像带有动力和自动排挡的快艇车会使注重性能的赛车驾驶员不耐烦一样。如果您属于这种人,如果您所在的项目团队拥有一个强大的DBA,或者有一些存储过程要处理,您可能想研究一下iBATIS。Hibernate的创建者本身就把iBATIS当作是另一种有趣的选择。我对它很有兴趣,因为我们曾为一个电子商务站点开发了一个类似的系统(其功能更为强大),而且从那时到现在,我们已经在其他环境中使用过它,尽管在发现Hibernate之后,在新项目中我们通常更喜欢使用Hibernate。您可以认为,以SQL为中心的解决方案(比如iBATIS)是“反向的”对象/关系映射工具,而Hibernate是一个更为传统的ORM。
      
      当然,还有其他的外部原因会导致采用另外的方法。比如,在一个企业环境中,必须使用成熟的EJB架构(或者其他的一些非普通对象映射系统)。可以为提供自己的数据存储工具的平台量身定做代码,比如Mac OS X's Core Data。使用的可能是像XML DTD这样的存储规范,而它根本不涉及关系数据库。
      
      但是,如果您使用的是富对象模型,而且想要灵活、轻松且高效地保存它(无论您是否正要开始或已经决定使用关系数据库,只要这是一个选择??而且存在可用的优秀免费数据库,比如MySQL,或可嵌入Java的HSQLDB,它就应该始终是一个选择),那么Hibernate很可能就是您理想的选择。您可能会惊讶于节省的时间之多,以及您将会多么地喜欢使用它。
      
      其他信息
      
      Hibernate项目有大量的在线文档,可以帮助您找准方向,快速开始使用。
      
      权威性的参考资料是Hibernate in Action,作者是Christian Bauer和Gavin King,都是Hibernate的创建者。该书全面而基础地讲述了Hibernate包的功能和正确的使用方法。
      
      阅读我的书Hibernate: A Developer's Notebook,也是一种快速上手的好方法。它直接但详细地讲述了如何在Java项目中设置Hibernate,以及如何使用它的一些最重要的功能。其中的代码示例普遍基于Hibernate和HSQLDB的早期版本,所以如果您想不加改动地使用它们,需要使用这两种软件的正确版本。无论如何,基本的概念是正确的,而且我希望能够尽快地针对Hibernate 3更新本书。
      
      另一本有趣的书是Better Faster Lighter Java,作者是Bruce Tate 和Justin Gehtland。书中给出了一些实用方法,可以以合理的方式完成实际的项目,这也是它流行的原因之一。它在如何评估和使用(或否决)可用的Java技术方面给出了合理建议,并作为正确方法的例子提到了Hibernate和Spring。
      
      最后,“Working with Hibernate in Eclipse”(它预先提到了更强大的新的alpha版的Hibernate 3工具)中详细讲述了如何将一个叫做Hibernate Synchronizer的Eclipse插件与Hibernate一起使用。
    March 17

    答案(仿佛更抽象)^_^

        class begin
        {   
            static void Main()
            {
                //初始化生日集合         
                生日集合 srjh=new 生日集合();
                srjh.Add(new 生日类(3,4));
                srjh.Add(new 生日类(3,5));
                srjh.Add(new 生日类(3,8));
                srjh.Add(new 生日类(6,4));
                srjh.Add(new 生日类(6,7));
                srjh.Add(new 生日类(9,1));
                srjh.Add(new 生日类(9,5));
                srjh.Add(new 生日类(12,1));
                srjh.Add(new 生日类(12,2));
                srjh.Add(new 生日类(12,8));
              
                //开始工作流
                工作流.BEG(srjh);           
                System.Console.Read();
            }   
        }
    //工作流
        class 工作流
        {
            /**//*    开始结点
             *     ↓
             *    结点A:如果我不知道的话 →结点X:小明知道(该节点分支略)
             *     ↓
             *    结点B:小强肯定也不知道
             *     ↓
             *    结点C: 小强说:现在我知道了
             *     ↓
             *    结点D:小明说:哦,那我也知道了
             *     ↓
             *    结束结点
             *
             */
         
            public static void BEG(生日集合 obj)
            {
                if(obj !=null)
                {  
                    A(obj);//下一结点
                }
            }
            //结点A:如果我不知道的话
            private static void A(生日集合 obj)
            {
                生日集合 jh=AI.小明分析(obj);
                if(jh.Count==0)
                {
                    B(obj); //下一结点
                }
                else
                {
                    //小明可以光凭月知道的集合
                    //该节点分支略
                }
            }
            //结点B:小强肯定也不知道
            private static void B(生日集合 obj)
            {
                //得到小强光凭日期就能知道的集合
                生日集合 小强知道的集合=AI.小强分析(obj);
                //小明之所以知道小强肯定不知道,
                //是因为小明知道的月份不是小强光凭日期就能知道的
                        
                生日集合 排除的集合=new 生日集合();
                foreach(生日类 temp in 小强知道的集合)
                {
                    foreach(生日类 tp in obj)
                    {
                        if(temp.月==tp.月)
                        {
                            排除的集合.Add(tp);
                        }
                    }
                }
                集合操作.排除(obj,排除的集合);
                C(obj);//下一结点
            }
       
            //结点C: 小强说:现在我知道了
            private static void C(生日集合 obj)
            {
                生日集合 小强知道的集合=AI.小强分析(obj);
                D(小强知道的集合); //下一结点
            }
            //结点D:小明说:哦,那我也知道了
            private static void D(生日集合 obj)
            {
                生日集合 小明知道的集合=AI.小明分析(obj);
                END(小明知道的集合);//下一结点
            }
            //完成结点:
            private static void END(生日集合 obj)
            {
                //完成,输出到屏幕
                foreach(生日类 temp in obj)
                {
                    System.Console.WriteLine(temp.月.ToString() +"-" +temp.日.ToString());
                }
            }
        }
        //功能扶助类
        class 集合操作
        {
            public static void 排除(生日集合 s,生日集合 v)
            {
                foreach(生日类 temp in v)
                {
                    s.Remove(temp);
                }
            }
        }
       
        class 生日类
        {
            public int 日=0;
            public int 月=0;
            public 生日类(int y,int r)
            {
                日=r;
                月=y;
            }
        }
       
        class 生日集合:System.Collections.ArrayList
        {
            public void 添加(生日类 v)
            {
                this.Add(v);
            }
            public void 移除(生日类 v)
            {
                this.Remove(v);
            }
        }
        class AI
        {
            public static 生日集合 小明分析(生日集合 v)
            {
                //AI,如果有维一的月份,则小明能确定
                //月份为1到12
                生日集合 jh=new 生日集合();
                int n=0;//记数器,如果n=1表示有
                for(int i=1;i<=12;i++)
                {
                    生日类 x=null;
                    foreach(生日类 temp in v)
                    {
                        if(temp.月==i)
                        {
                            n=n+1;
                            x=temp;
                        }                  
                    }
                        if(n==1)
                        {
                            jh.Add(x);
                        }
                    n=0;
                }
                return jh;
            }
            public static 生日集合 小强分析(生日集合 v)
            {
                //AI,如果有维一的日,则小强能确定
                //日为1到31
                生日集合 jh=new 生日集合();
                int n=0;//记数器,如果n=1表示有
                for(int i=1;i<=31;i++)
                {
                    生日类 x=null;
                    foreach(生日类 temp in v)
                    {
                        if(temp.日==i)
                        {
                            n=n+1;
                            x=temp;
                        }   
                    }
                    if(n==1)
                    {
                        jh.Add(x);
                    }
                    n=0;
                }
                return jh;
            }
        }

    张老师的生日??

    小明和小紅都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小紅,张老师问他们知道他的生日是那一天吗?
    3月4日 3月5日 3月8日 6月4日 6月7日
    9月1日 9月5日 12月1日 12月2日 12月8日
    小明说:如果我不知道的话,小紅肯定也不知道
    小紅说:本來我也不知道,但是现在我知道了
    小明说:哦,那我也知道了
    请根据以上对话推断出张老师的生日是哪一天
    March 09

    创业者们的十大迷思

    作者: Ron Garret
    我最近成了一名风险投资人,所以经常可以遇到一些创业者[1]在创业时常犯的错误。为了避免一遍又一遍的重复说教,我想把这些错误在这里做一个总结:

    迷思一:一个好想法就可以让你赚大钱

    事实是好想法对于商业成功既不是充分条件也不是必要条件。微软应该算是获得商业成功的典型,但是在它的整个发家史上却找不到一个完全独创的“好想法”。事实上微软正式通过模仿对手的想法并在竞争中打败对手而一步步发展壮大的。Google确实有一些独创的,像Page Rank,Ad-words,廉价机器集群等。但是这些没有一个是由Larry和Sergey想出来的。这并不是说Larry、Sergey和Bill不够聪明,实际上他们三个比任何人都要犀利。但如果你认为他们只是有一天突然有了一个灵感接着就发财了,那只能说你是痴人说梦。

    迷思二:东西做出来自然会有人用

    有时候事实确实如此。Google就是个好例子。但是像Google这样的公司只是凤毛麟角,更多的公司生产的产品因为这样或者那样的原因卖不出去。我自己就有这样的惨痛经历。那是我在1993年创建的第一家公司,名字叫FlowNet。它同时也是一种新的高速局域网通讯设备的名字。10M的传输速度是当时的标准,但FlowNet提供高达500M的传输速度。在后来的五年中FlowNet一直都是拥有最佳性价比的网络设备。它甚至提供了一个内建的可保证画面质量的视频流媒体服务。如果FlowNet能够得以流行全世界,今天的视频流媒体将比现在的状况要好得多。

    但是尽管FlowNet在技术层面上可以打败任何竞争者,它却在商业上遭受了巨大的失败。我们连一块也没有卖出去。原因很简单:它与局域网标准不兼容。如果当时我们做足功课,做些市场调查,我们就会知道兼容性即使不是致命的也将会是个大问题。那样我们就不会把自己数以万计的美元浪费在专利申请和样片生产上了。

    迷思三:如果你不申请专利,别人会偷走你的想法

    事实上没有人会对你的想法有兴趣,除非你的想法被证明是成功的,但那时对于偷学者为时已晚。即是说真的有人对你的想法非常认同,但是他聪明的话自然会选择跟你合作,如果不是,他做什么都是威胁不到你的。

    有时候专利还是有点用的:它会让投资人感觉很保险。但我强烈建议你自己来处理专利申请,通过一些学习你可以做得比专利申请代理商做得更好,而且可以节省一大笔钱。

    迷思四:你的看法很重要

    事实上你和你的合伙人对你们产品的看法没有任何意义,重要的是客户会怎么看待你们的产品。我们很自然的会假设,如果你和你的伙计们都认为你们的产品很好,那么其他成千上万的人们也会这样认为,事情有的时候是这样,但大多数的时候不是。原因是你是如此的聪明可以设计出这么好的产品,那么你跟那些产品的使用者是不一样的。相对于你,你的客户们要更为平庸一些,他们的口味也会更为平庸一些。如果你的产品是为了迎合那些会在乎你自己在乎的那些东西的人的话,你的用户群将会非常小。

    迷思五:盈利模式都是假的

    就像迷思二一样,有时候这也是事实。像Carl Sagan常说的“预言是失败的艺术”。你永远也无法知道你的生意会赚多少钱,也无法知道要花多少钱去占领市场。需要盈利模式的理由是让你自己做一个全面的思考,并让自己确信投资将会得到回报。如果你经过计算发现,即使只是要保持不亏损你的用户群也必须比现在的市场大十倍,那么你也许就需要重新考虑了。就像艾森豪威尔说的,计划一无是处,但作计划却不可或缺。

    以此为基础,很多创业者们都会犯一个典型的错误。他们常这样说“只要我们占有哪怕是1%的市场份额,我们也会赚大钱”。这样的说法直接暴露出你没有仔细的分析过用户的需求。你也许同样会说“100个客户中至少会有一个客户买我们的东西吧(或者坦白地说,这一点也不能肯定)”。这样想根本无法增强自信心。

    迷思六:懂得的知识比认识的人重要

    你一直都拒绝否认这一点。从小到大,你都相信聪明比什么都重要,你也不会相信妈妈所说的“学会与他人相处比学习成绩更重要”。
    事实是-人际关系比知识要来的重要。这并不是说聪明、有学问没有用。你的学识一定程度上决定了你会被推荐给“谁”。但最终,你认识并信任,更重要的是信任你,的人会比你的学识对你的前程有更大的决定性作用。商业活动是异常复杂的。没有任何一个人有可能具有完成一个商业决定所需要的所有知识和经验,所以精明的人们会把他们的权力下放给其他人。而当他们选择下放的对象是,首先想到的就是他们认识并信任的人。
    <此处略去一段关于C程序员和Lisp程序员的对比>

    迷思七:博士头衔很有用

    实际上拥有博士头衔只能证明你不是低能儿。从我的经验看来,拥有博士头衔只会对获得商业成功产生负面影响。因为在学业上获得成功的方式与在商业上获得成功的方式恰好相反。在学业上,你的同僚决定你的成功,在商业上,你的顾客决定你的成功,而你的顾客,基本上可以肯定的说,不会是你的同僚。

    迷思八:我需要500万作为启动资金

    事实上除非你是做硬件的,否则你根本就不需要任何的启动资金。Paul Graham 说过很多关于这方面的内容,我就不展开了,之说几句:你不需要启动资金,但你必须愿意自己做。你必须自己实现自己的想法,没有人会为你去做,也没有人会出钱雇人为你去做。原因很简单:如果你都不愿意为你想法的商业潜能而放弃你的休息时间,为什么别人要用他们辛苦赚来的钱为此冒险。

    迷思九:有好的想法是我的计划中最重要的部分

    事实上好想法基本上没有任何意义,重要的是:

    1. 谁是你的顾客
    2. 他们为什么要买你的产品
    3. 你的团队有些什么人
    4. 有哪些风险

    迷思十:没有竞争对手再好不过

    如果你所处的行业没有竞争对手,最有可能的理由是,它根本就不能赚钱。这个世界上有60亿人口,几乎完全没有可能还存在一个没有任何人发觉的有利可图的市场。

    最好的消息莫过于你的竞争对手都很菜。绝大部分的公司都运作的不是特别好。他们制作赝品、欺骗顾客、他们的员工都很傻冒。你总是可以很容易的找到市场机会,进入,然后打败竞争者。你并不想要没有竞争对手,你想要的是差的竞争对手,放心,他们多得是。

    额外奖励,迷思十一:上市会让我开心

    如果创业的过程让你厌倦,你大概是不会成功的。它是如此艰难,如果你不能从中找到乐趣,它会让你筋疲力尽。即使你通过肮脏的交易变得富有,当你回首往事的时候也只是会惋惜青春的流逝。古董和跑车带来的快乐是短暂的。只有一种快乐是可以用钱买到的:就是当你作为投资人听一个小伙子兴奋的向你讲述他新鲜的商业计划。

    所有这些都可以总结成一句话:重要的是客户。商业成功的不只是一个好想法,好想法到处都是。商业成功是需要有一个好想法、组织一个好团队、把想法做成好产品、最终把它卖给客户。很简单,也很复杂。

    祝你好运!

    January 28

    许下一个愿望!

          很久没回来了,首先,许下一个愿望,我坚信一定会实现的!!!^_^
          明天省公司的培训不能迟到,还是早点休息吧......
    December 15

    一杯咖啡一本书

          一杯咖啡一本书,听着喜欢的音乐,很久都没这样惬意过了,突然发现看书是件多么幸福的事,最近还是有点忙,聚餐,加班,常常回家都很晚了,昨天的球赛都推了,好不容易才挤出点时间来看下书,进度太慢了,快两周了才读完了第一部分,下周开始一定要抓紧,时间不多了.以前在学校经常静不下心来读书,现在工作后都觉得以前浪费了太多的时间,该是成熟的时候了,果儿疯狂的加着班,小猪在宜宾不分昼夜的干着,old man在上海打天下,咪也在成都开始了新的工作,就连最爱晃的坦克都成熟多了,还有那个der也在为考试而奋斗,我?也找到了自己的方向,有自己想学的东西,随兴而学,很惬意,就是这样的时间太少~~^_^,喜欢坐在窗台上看书的感觉.
         rails的核心:惯例重于配置(至少看完第一部分我是这样认为的),这样做确实很大的提高了开发效率,但是灵活性何在?What is Agile?Let's go on.下周开始:building an application
         明天的演唱会~~
        
     
    December 04

    The Architecture of Rails Application

          NO.1  MVC ( models,views,and controllers )
                model:负责维持应用程序的状态,数据的容器,数据的监护者.
                view:负责生成用户界面,显示数据.
                controller:负责协调整个应用程序的运转,接收事件,与模型进行交互,并将合适的视图展示给用户.
                rails的MVC框架:
                   "组装"的过程默认地按照人们的命名惯例来进行,因此一般情况下你不需要编写任何外部的元数据配置信息,rails-"惯例重于配置".
                rails应用程序:请求---路由组件----判断发送到应用程序的什么部分及解析请求---action(in controller)
      
          NO.2  active record:rails model support
                关系模型与OO模型的协调(对象关注的是数据和操作,数据库关注的是值的集合):
                      1.以数据库为中心组织程序;2.以程序为中心组织数据库
                ORM(object/relational mapping):封装
                      ORM库可以将数据库表映射到类,将记录映射到对象,将字段映射到对象的属性,类方法用于执行表级别的操作,实列方法则用
                于执行针对单条记录的操作.
                      active record是rails所采用的ORM层,其完全遵循ORM的模型,其特别的是它的配置方式:它根据人们常用的命名惯例提拱了
                有意义的缺省配置,将需要开发者编写的配置量降到了最低.
     
          NO.3 action pack:the view and controller(在rails中对视图和控制器的支持捆绑在这个组件中)
                rails中动态内容由模版生成:1.ERb(embedded ruby):将ruby代码片段嵌入到视图的HTML代码中.
                                                2.构建器风格(builder-style)的视图.
                      
     
     
     
               
     
    December 03

    Agile Web Development with Rails

       Rails 是一个MVC框架(Model-View-Controller)
         Rails设计核心:DRY(Don't Repeat Yourself) and convention over configuration.
         Rails is Agile
         Dave喜欢Rails的10大理由:
         1.将敏捷带到了web开发中.
         2.我也可以-像那些酷小孩们一样-创建优美的web页面.
         3.它让我专注于"如何创建应用程序",而不是"如何玩一个框架".
         4.尽管应用程序不断成长,也会一直保持可维护性.
         5.对于客户不断提出的新要求,我可以更多地说"YES".
         6.测试是内建的(并且很简单),因此我们可以更频繁地进行测试.
         7.即时的反馈:编辑代码,点击"刷新"按钮,就可以在浏览器里看到变化.
         8.元编程使我可以在很高的层面上编程.
         9.代码生成让我能够更快地开始.
         10.没有XML.
    July 17

    真的很累~~~~哎~~~

           不知不觉中离开学校以有大半个月了,送走了四年的朋友,开始了新的生活,但突然觉得身心都很累,哎!!!!!!!!!!!
           明天正式开始上班了,不想那么多了,努力工作,自己过开心就对了
           妹,终于从海南回来了,1年没见面了,明天一定要带她去吃好吃的,那个猪估计又晒黑了吧
           Zzzzz~~~~~~
    April 10

    回家

         昨天:
                早上:一早起来带上两大包衣服回家了,我确实是够懒的,HOHO,每次都是没衣服换了才回家洗衣服,现代化的东西就是好啊,丢进洗衣机40分钟就OK了。
               下午:去看小猪了,看到他那肿的冬瓜般的大腿觉得确实有点对不起他的,要是他受伤后的第2天不再拖他去打球或许就不是今天这样了,哎,也只能说他太跳的了,现在膝盖内打了一个螺丝进去,估计以后再回篮球场的可能性很小了,哎,本来准备6月回学校和他打一个月球然后一起去深圳的,现在只有他看的份了~~~~
                晚上:老爸终于回来了,去西昌呆了一个月,今天看见他突然觉得老了很多,人瘦了,也晒的很黑,工作应该是很辛苦的!晚上和老爸聊了好久,少有的这么融洽,后来说到摄影上,教了我好多他自己总结的经验,好想有一部自己的单反相机!
          姑爹摔伤了,从4米多高的车皮上掉了,没有骨折已经是不幸中的万幸了,晚上去他家看他,郎哥他们都来了,好久没一家人这样一起团聚过,半年后我离开四川这样的机会更少了,一定要珍惜啊!
         今天:陪小白看房,累啊,这两天太阳太跳了,热!白他们家也快搬成都来了,以后大家的聚会肯定会是在成都了,自贡不知好久能再回去?
         未来几天:要上班了,HOHO
         睡觉~~~~~~~~~~~~
    April 06

    留一个愿望让自己想象

    歌曲:隐形的翅膀
    歌手:张韶涵 专辑:潘朵拉

    每一次
    都在徘徊孤单中坚强
    每一次
    就算很受伤
    也不闪泪光
    我知道
    我一直有双隐形的翅膀
    带我飞
    飞过绝望
    不去想
    他们拥有美丽的太阳
    我看见
    每天的夕阳
    也会有变化
    我知道
    我一直有双隐形的翅膀
    带我飞
    给我希望
    我终于
    看到
    所有梦想都开花
    追逐的年轻
    歌声多嘹亮
    我终于
    翱翔
    用心凝望不害怕
    哪里会有风
    就飞多远吧
    隐形的翅膀
    让梦恒久比天长
    留一个
    愿望
    让自己想象
     
    这两天疯狂的爱上了这首歌,一遍又一遍的放着,喜欢她的声音,喜欢这歌词~~~好久没发现喜欢的歌了,HOHO
    March 30

    莲花

          好久没回来了,听着这音乐仿佛都已很陌生,APPLE和CAT老说我BLOG上简直没写什么,最气人的就是神兽竟然说我写的简直就像小学生写的,其实好多次我开开BLOG准备写点什么,但总是听听音乐便一笑而过,或许我本身就不适应写日志吧,总喜欢把事情埋藏在自己的心里,一个人独自去享受她
          莲花都已买了好久,一直没有时间来看,刚好前天我八里的小窝外有人搭丧火,带上莲花逃离火场。我并不怕死人,只是看着此情此景,想起已故的人,未免有些伤感!
         APPLE给我说过莲花里面写到了墨脱,雅鲁藏布大峡谷之中的一个世外桃圆,记得大2时看过一本自助游书是这样介绍墨脱的:“作为一个徒步爱好者应该去走一次墨脱,走过这段生与死之间的旅途,生命都将得到升华!”
         带这期盼,我翻开了莲花,第一次看安尼的书,确实叹服她的文字艺术,把一段艰辛的旅程写的是如此的美,故事本身很美,叛逆的内河与成功而孤独的善生都是如此的有个性,本想把这书当作一本游记来看,结果随着故事的推进我又再一次的深陷其中,我很喜欢内河,叛逆,有个性,做自己想做的事,我也很想像她那样做自己想做的事,但现在的我又缺乏迈出这一步的勇气。看书的中途好多次我都不想再看下去,我想要是我突然像内河那样消失,或许我的朋友能理解我,但我们父母喃?他们是一定不会理解的,会为我担心,牵挂,我爱他们不能让他们担心,男人应该事业有成,这也曾是我的梦想,但我又向往内河那样的生活,做一个随意的旅行者,用照片记录下路上的点滴。看书的过程中我一直在想这一问题,后来看到书末庆邵说:“获得独立的经济基础便可以盾世界。”我知道这未来几年我会为我的遁世而努力!马上就四月了,不能再堕落了,努力找工作,做好毕业设计,FIGHTING!
          看来我还是不适合看小说,每次看完之后都要陷入自我构思的场景之中,我应该是理性的,但我知道我内心是感性的,哎```
          下次回来又不知是什么时候了,我还是习惯一笑而过~~~
         
    February 22

    成都好冷啊!!

           这几天不知怎么的,天气好冷哦,今早还看到出了点太阳,中午就阴下去了。
           天空也很阴沉,就像我最近的心情一般,今天一大早迎着太阳出门,运气还不错。先去公司把毕业设计的章盖了,结果还有意想不到的收获,胡老师同意old man去公司实习,这样有人天天陪我上下班挤公交车了,HOHO!
           设计的事落实了之后,老爸带我去找房子,他叫上了他的2个从小耍到大的朋友,看着他们3个,我想到了今天的我们,今后我们之间又会是什么样?让时间去见证一切吧。找房到还顺利,一个把小时就搞定了,在科大东门出去,步行20多分钟吧,骑车也就几分钟吧,远是远了点,不过价钱到还不错,又不用中介费,可以节约好大一笔开支了,嘿嘿~~~~~这个周末搬家!
          
    February 21

    生活~~~~~

          最近比较烦~~~~~~~~~只是想发泄一下!!!!!!!!!!!!
          有很多重要的事情还等着我做去,有更需要关心的人需要我去关心。我一定会坚持的!
          Fighting!菠萝