Jinjin's profile试试看PhotosBlogListsMore Tools Help

Blog


    September 24

    Style



    By Scott Schuman

    流浪汉大叔身着灰蓝色靴子,还有搭调的袜子,手套和眼镜框

    This shot isn't about fashion - but about someone who, while down on his luck, hasn't lost his need to communicate and express himself through style.



    September 08

    涨价了

    涨了,真涨了,早上出门买早餐,牛奶,一块二到了一块三,烧饼加鸡蛋,一块三变一块四
     
    August 24

    五年了

    吱一声,对,我还在

    稻香

    稻香 jay chou☆
    ☆摩杰座 jvr☆
    ☆词曲 jay 编曲 micel lin☆
    ☆永爱杰伦☆支持正版☆
    www.feiyes.net☆lizaixing制
    ☆music.☆.
    对这个世界如果你有太多的抱怨
    跌倒了就不敢继续往前走
    为什么人要这么的脆弱堕落
    请你打开电视看看
    多少人为生命在努力勇敢的走下去
    我们是不是该知足
    珍惜一切就算没有拥有
    还记得你说家是唯一的城堡
    随着稻香河流继续奔跑
    微微笑小时候的梦我知道
    不要哭让萤火虫带着你逃跑
    乡间的歌谣永远的依靠
    回家吧回到最初的美好
    ☆music.☆.
    不要这黱容易就想放弃
    就像我说的
    追不到的梦想换个梦不就得了
    为自己的人生鲜艳上色
    先把爱涂上喜欢的颜色
    笑一个吧功成名就不是目的
    让自己快乐快乐这才叫做意义
    童年的纸飞机
    现在终於飞回我手里
    所谓的那快乐
    赤脚在田里追蜻蜓追到累了
    偷摘水果被蜜蜂给叮到怕了
    谁在偷笑呢
    我靠着稻草人吹着风唱着歌睡着了
    哦哦午后吉它在虫鸣中更清脆
    哦哦阳光洒在路上就不怕心碎
    珍惜一切就算没有拥有

    还记得你说家是唯一的城堡

    随着稻香河流继续奔跑

    微微笑小时候的梦我知道

    不要哭让萤火虫带着你逃跑

    乡间的歌谣永远的依靠

    回家吧回到最初的美好☆.
    稻香.☆^-^☆.
    August 23

    三年了

    到O记三年了,留个脚印。
    感谢辛迪,感谢熊,感谢一起奋斗过的同志们,祝我们永远年轻。。。
    April 25

    Autumn Day

     
    Lord: it is time. The summer was immense.
    Let thine shadows upon the sundials fall,
    and unleash the winds upon the open fields.
    Command the last fruits into fullness;
    give them just two more ripe, southern days,
    urge them into completion and press
    the last bit of sweetness into the heavy wine.
    He who has no house now, will no longer build.
    He who is alone now, will stay alone,
    will awake in the night, read, write long letters,
    and will wander restlessly along the avenues,
    back and forth, as the leaves begin to blow.
                             Rainer Maria Rilke
                                   (tr. Cliff Crego)
    April 01

    you look really tired

    刚才在电梯遇到一个啤酒肚叔叔,对我说 You look really tired. 这几天不规律的睡眠和饮食让我体力大减,而且时不时胃痛,已经不止有一个人对我说 You look really tired. 今天的探险就是以胃痛结束。
     
     

    四月一日

    四月一日,东京,天气晴朗
    今天这边就剩我一个人了,Vivian mm 家里装宽带,不能陪我, Lingaraj gg 也飞回去了,可怜我孤苦伶仃一人。
    刚才有点小晃,不知道是错觉还是又有小地震。
    抄了份地图,背上相机,找樱花去。
    祝我好运吧,能找到回来的路。
    March 08

    三八

    今日三八,公司头一次给女员工放假半天
     
    早晨到公司,mail server down
    主啊,让mail server 跑起来吧,我宁愿牺牲半天假期
     
    中午,mail server 正常
    我果然要牺牲半天假期了,收到邮件下午有 concall
     
    February 02

    Microsoft computer scientist missing after solo sailing trip (Jim Gray)

    The U.S. Coast Guard is searching for a prize-winning computer scientist who failed to return from a quick trip to the Farallon Islands on Sunday.
     
    Well-known in Silicon Valley, Gray won the A.M. Turing Award in 1998 for his seminal contributions to database and transaction processing research.
    December 13

    foosball

    公司走廊里多了一台 foosball table, 哈哈,以后可以每天玩了。上次在HQ见识了俱乐部冠亚军的风采,并有幸得到Bin Liang同志的亲传,名师出高徒,虽然我还不会玩,不过已经自认为是高徒啦
    November 12

    感冒了

    虽然不确定是不是流感,不过同志们还是和我保持距离的好。。。
    November 10

    小企鹅

    就是这只小企鹅,让redhat的股票在Oracle open world 的最后一天暴跌
    October 20

    突然发现。。。

    早上浏览 Oracle Beehive Client, 看到主页上的总部图片,忽然发现这张图片和我前几天拍的照片取景角度十分相似。
    上周几天到了下午四点钟就开始困乏,于是某天下午拿着相机溜出办公室,绕着湖边晒太阳,拍了几张办公楼的照片,唯有这张入眼些,就贴在了blog上。不过那天多云,天空没有主页图片那般湛蓝,还有,拍图片的那人似乎要比我高些。。昨天刚受成哥打击,说我身高没有优势(成哥说话较为含蓄,其原意便是说身高处于劣势)。。。
     今天天气不错,下午再去拍一张,向后退退估计效果会好些。
    October 12

    感受黑色大奔

    八卦一下,一如既往nice+洒脱的Cindy姐改开黑色大奔了。
    August 23

    两年了

    进O公司整整两年了
    纪念一下
    June 08

    没有变量和循环的语言 冒泡泡续

    XSLT是一种 functional programming language,函数被当作语言中的第一等公民,在这里只关注功能的定义而不是代码的执行次序,于是在 Imperative programming 中极重要的 loop 消失了,而且所谓的 variable 也变的了一旦定义便不可改变,这还叫作变量么?
     
     
    没有了循环,没有了可变量,一个原本简单的数组遍历该怎么实现呢?
     
     
    还是冒泡泡中的那个老问题,从一个正整数数组中找出最大值。
     
     
    若是在 Imperative programming language 中,我们可以设指针来遍历数组,设变量来记录每次的最大值:
    int returnValue = 0;
    for(int i=0; i<a.length;i++){
    if(int[i]>returnValue)
    returnValue=int[i];
    }
     
     
    可是在变量不可变,循环不可用的XSLT中呢?recursion with parameters.
     
     
    定义一个template,参数一为数组,参数二是最大值。每次进入 template 先判断参数一是否为空,若是则返回参数二;若否则递归,求出数组第二位至最后一位中的最大值,然后与参数二比较,返回二者中的最大值。
    <xsl:template name="getMaximum">
      <xsl:param name="nodes"/>
      <xsl:param name="max"/>
      <xsl:choose>
        <xsl:when test="not($nodes)">
          <xsl:value-of select="number($max)"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:variable name="aNode" select="$nodes[1]"/>
          <xsl:call-template name="getMaximum">
            <xsl:with-param name="nodes" select="$nodes[position( ) > 1]"/>
            <xsl:with-param name="max">
              <xsl:choose>
                <xsl:when test="number($aNode) &gt; number($max) or string($max) = 'NaN'">
                  <xsl:value-of select="$aNode"/>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:value-of select="$max"/>
                </xsl:otherwise>
              </xsl:choose>
            </xsl:with-param>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
     

     

    在XSLT中,一般的问题可以通过 xsl:for-each, xsl:apply-template 在特定的节点集上执行 select,当遇到标准XSLT不能解决的问题时,recursion 便是一个很好的选择。

     

    June 06

    冒泡泡

    比起 XSLT 1.0, 2.0 的功能强大了很多,尤其是新特性 grouping,遇到对条目分类计算的问题,三五行代码就能搞定。比如有一份图书列表,按作者对书目归类
    <xsl:for-each-group select="book/author" group-by="author/@name">
     ...
    </xsl:for-each-group>
    要在归类的同时做些简单运算,还有现成的函数可以用,例如 求和 sum, 计算条目个数 count ...
     
    问题来了,求和,计算条目个数都有现成函数,那求最大最小值,还有平均值这些类似的基本信息呢?
     
     
    能简则简,是懒人们的一贯追求。
     
    首先,用 avg(), min(), max() 直接试试。 报错,通不过。
     
    不死心,上 w3.org 查查,是不是拼写不对? avg 倒是找到了,min 和 max 没有踪影。
     
    还是不死心,上 w3schools 上看看 Functions Reference。 这里倒是声称 Functions on Sequences 包括 avg(), min() 还有 max(), 要求 XPath 2.0, XQuery 1.0 和 XSLT 2.0。 看来方法是有的,只是我的环境不支持。
     
     
    还是自己动手,丰衣足食吧。
     
    最简单的,先用 xsl:sort 排序,然后取首位。写起来挺简单,两行代码,可为了取个极值就对整个数列排序,是不是有点兴师动众?看看复杂度吧,不知道 xsl:sort 内部是怎么实现的,单从对排序算法的常识来看,搞不好有可能会是O(N2) 。现在数据量小还好说,以后用了分布式,操作类型再多些,弊端就露出来了。
     
    sort不行,换个XPath语句,<xsl:value-of select="$nodes[not($nodes &lt; .)]"/>,Select all nodes for which there is no node less than its value. 看看性能,又是O(N2) .
     
     
    老老实实,写个算法吧。想起了数据结构课程当中最简单排序算法,冒泡排序,去掉循环,用它来求极值不错,只要 n-1 次关键码比较, 容易实现,性能又好,就它了。吭哧吭哧,写完了,一试,还真不错。换几组数据再试试,不对啊,为什么有的时候正确有的时候就会错的莫名其妙?左看看,右看看,哦,每次求出的最大值都是以 9 打头的那个。原来默认的模式是字符比较。加上 number(..) ,一切OK啦!
     
    冒了一个泡泡
     
    May 19

    常用开源协议的详细解析(zz)

    常用开源协议的详细解析
     
    开源在今天的软件业已经很普遍,但开源是否意味着使用者可以对开源后的代码为所欲为呢?答案是否定的。开源运动同样有自己的游戏规则和道德准则。不遵行这些规则不但损害开源运动的健康发展,也会对违规者造成名誉和市场上的损失,更可能陷入法律纠纷和赔偿。


    现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种。我们在常见的开源协议如BSD, GPL, LGPL,MIT等都是OSI批准的协议。如果要开源自己的代码,最好也是选择这些被批准的开源协议。


    这里我们来看四种最常用的开源协议及它们的适用范围,供那些准备开源或者使用开源产品的开发人员/厂家参考。


    BSD开源协议


    BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。


    但“为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:


    1. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。


    2. 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。


    3. 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。


    BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。


    Apache Licence 2.0


    Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:


    1. 需要给代码的用户一份Apache Licence


    2. 如果你修改了代码,需要再被修改的文件中说明。


    3. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。


    4. 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。


    Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。


    GPL


    我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。


    GPL协议的主要内容是只要在一个软件中使用(“使用”指类库引用,修改后的代码或者衍生代码)GPL协议的产品,则该软件产品必须也采用GPL 协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。


    由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。


    其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。


    LGPL


    LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。 LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。


    但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。


    GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品。


    P.S. 随手写写,是因为跟客户交谈的时候发现很多人其实对开源有完全错误的理解,特别是开源协议。很多人认为只要是开源,就意味着随便用,随便改都可以。


    dlee补充:


    这些知识 Linux Fans 大多比较清楚,因为经常使用开源软件,每天下载源代码,编译、测试、安装是常事。这些问题在各个 Linux 论坛上也早已经是老生常谈,但是有些 Java Fans 以及大多数 M$ 平台的开发人员几乎一无所知。我在这里一般不会谈跟 Java 关系不大的内容。既然 Charlesxp 想谈谈,我也补充一下。


    首先,软件有两种分类方法:


    商业软件 vs. 免费软件


    商业软件:软件是要卖钱的。


    免费软件:软件不卖钱,出于兴趣开发,可以随便使用。


    开源软件 vs. 私有软件


    开源软件:软件的源代码是公开的,可以在遵守某种 license 的条件下加以修改。


    私有软件:软件的源代码不公开,用户仅仅只能得到软件的二进制版本。


      从上面的两种区别我们可以看出,开源软件和商业软件不是对等或对立的关系,开源软件同样也可以卖钱。但是给了你源代码,你如果没有一定的功力也未必能看懂。而且用户常常不具备相应的能力(没有从事过软件开发),仅仅想要使用软件的功能。既然这样,开源对于这类用户还有何意义呢?开源可以保护这类用户免于陷入厂商设置的锁定陷阱。因为提供了全部源代码,只要用户能找到有能力维护这些代码的人或公司,他就可以持续发展这些代码的功能。这个人或公司不一定是最初卖软件给他的那一家。用户不会在大部分功能用的好好的,某个关键功能无法使用的时候,买家告诉他,你希望获得的这个功能在我们的下一版本中有,但是你必须支付我们 10w$ 升级费我们才可以提供。这个就叫做厂商锁定。如果软件不是开源的,用户没有办法做出选择,上了贼船后想下来可就难了。所以开源的商业软件对于保护用户自己的利益是非常重要的。用户可以获得真正的安全,而且更体现了软件的本质就是一种高级的服务。


      那么有人会担心,这样做究竟能不能赚到钱?你能不能赚到钱要看市场和需求有多大。只盯着厂商锁定一种方式来赚钱其实是一种短视的行为。现在国内大部分软件开发商都不重视维护和服务,仅仅靠卖软件本身的 copy 和 license 来赚钱,用户感觉不到自己是上帝,怨声载道。其实用户所需要的还是长期的维护和服务。所以这样的软件如果真能把服务做好,用户是会非常欢迎的。既然经过分析预计会有很大的需求,从长期看,我相信肯定是可以赚到钱的。


      还有一类软件:共享软件。这类软件不是开源的,但是有免费的版本可以使用。如果你用的很爽,良心发现了,可以把钱汇给作者。如果希望作者提供服务,也可以找他谈。国内很有名的 FoxMail 就是这类软件。但是对于用户最有价值的一类软件,其实还是开源的商业软件。


      开源软件卖的是长期的服务,不是软件本身的 copy。不是所有的软件都有可能卖服务,也不是所有的用户都需要服务(这个问题我们以后可以讨论)。但是一个大型企业或者重要的政府机关,假设使用了 JBoss+MySQL 这种组合,长期的服务是非常必要的(至少出了事情可以找到一个替罪羊)。你问这个问题就说明你没有多少企业应用的经验,不知道 IBM 这些公司的商业模式就是建立在 IT 服务的基础之上的。开源软件提供了一个新的组合,对于更好地做好这种服务非常有帮助。实际上,IBM 的解决方案中就包括了大量开源的成果。HP 做的方案也有采用 JBoss 的,为了得到长期的服务,HP 和 JBoss 专门签订了长期合作的协议。


        中国国内由于市场容量的限制,以及用户缺乏信息化的经验,对于软件长期服务的重要性认识不足,因此总是只看到软件本身的售价,给了一些夫妻店竞相压价钻空子的机会。但是必须承认,这并不是一种良性竞争的状态。最终还是要走到切实为用户做好服务的道路上来的。服务是值钱的,不是免费的。你去路边的理发馆随便理个发,5 块钱,出来以后仍然蓬头垢面。你去高级发廊做头,500 块,但是你得到了按摩等各种服务(不要联想引申),身心得到了放松,出来以后精神焕发。你只盯着路边的理发馆,但是仍然有别人愿意去高级的发廊。


      当然,真正要做好服务,对于技术等各方面的能力要求是非常高的。这种要求不是随便哪个夫妻店就能够达到的。


    robbin补充:


      Richard Stallman是GNU创始人和GPL的创造者,Stallman开发的比较著名的GPL软件包括GNU GCC和GNU Emacs。其中Emacs在Stallman独立开发的早期也是卖钱的。Stallman定的Emacs售价为每份150美元。


      因此请记住: 开源软件不等于免费软件。