跳至主要内容

博文

Learning Scala

Scala 是一种多范式的编程语言,设计初衷是要整合面向对象编程和函数式编程的各种特性。Scala 运行于 Java 平台(Java 虚拟机),并兼容现有的 Java 程序。它也能运行于 Java ME, CLDC 上。 Scala is a general purpose programming language designed to express common programming patterns in a concise, elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages, enabling Java and other programmers to be more productive. Code sizes are typically reduced by a factor of two to three when compared to an equivalent Java application. Scala 解释器类似于 Unix Shell,它允许用户以交互的方式输入表达式。在命令行中执行 `scala` 命令可以进入 Scala 解释器。 Welcome to Scala version 2.9.2 (Java HotSpot(TM) Client VM). Type in expressions to have them evaluated. Type :help for more information. 如果想要在解释器中跨行输入语句,只要一行行键入。如果输入到一行的结尾还没有结束,解释器将会在下一行自动回显一个 `|` 符号提示等待输入。用户如果发现一些错误而希望终止输入,可以连续键入两次回车取消当前的输入。如果需要离开解释器,只需要输入 `:quit` 或是 `:q` 即可。 有的时候,如果需要在命令行交互中得到更为详尽的提示信息,例如对过期函数调用的提示,或是对于未检查警告的解释,可以在启动 scala 的时候传入参数。 scala -unchecked -deprecation tag: scala

Scrum 培训心得(二)

前面说了Scrum的迭代范围, 再来看看人――Scrum的参与者。 涉及到Scrum流程的角色包括PIG和CHICKEN。 Scrum Master和Team算是猪;Product Owner和Stakeholders算是鸡。 在Daily Scrum Meeting中 猪可言 鸡难语~ 每日花15分钟围成一圈站着开Scrum Meeting,是促成团结增进和谐的良方。 一般建议每个scrum team不超过7个人, 如果scrum的团队比较大,可以拆分为若干个team。 这种情况下就需要召开scrum of scrums。 也就是每个team的master或是lead要开一个会。 在老师的ppt中甚至展示了一种超大团队的meeting方式―― scrum of scrums of scrums,当然,这只是theoretically speaking... 在迭代过程中,如果用户的需求发生了改变,要考量impact, 如果小修改可以立即执行,但是如果影响到当前的sprint,尽量应当放到下一次sprint中加入。 原则上一旦sprint的范围确定就不宜修改。

Scrum 培训心得(一)

Scrum定义scope有这么几个范围:Project、Release和Sprint。 首先,product owner拥有整个product的vision,他可以是来自客户方的代表,亦或是自己的产品经理。 product owner可以回答关于产品需要的特性、特性优先级等问题。 整个scrum team需要先整理出product backlog。 第二步,scrum team根据能力――capacity,也就相当于朴素的人月概念, 从product backlog中挑选出优先级最高的user stories构成第一个release。 定义release scope的阶段也成为sprint 0 在每个release中,再定义有多少个sprint,大的epic先拆分为合理的user story, 类似的,再将user story细化为task,并估算story point,assign给team member。 估算story point有很多种方法,有一种是planning poker, 扑克的玩法是通过多人估值,分别解释最大值和最小值,在取得共识的前提下再次出牌估值, 直到最终达成大部分的一致。貌似挺民主的做法。 不过印度老师说公司不采用这种方式,残念了…… 因为它的精度不是很高,ADM采用一种estimator,从以往的项目中进行估算。 选择user story的时候有一个顺序问题――优先选取难度最大而价值也最大的user story, 其次选取价值高难度一般的;接下来是价值低难度也低的,最后才选择价值低而难度高的。 这种选取顺序是有道理的,因为一开始就尝试完成风险最高而价值也最大的user story, 可以最早地将潜在的风险给暴露出来,这样万一出现了难以解决的问题可以及早客户沟通。 而反过来,价值最低风险又高的user story放在最后,也有好处, 这样客户可以选择是否在最终的sprint抛弃这个功能。

Scrum 培训心得 (引子)

公司内部做了三天培训,请了一位印度老师介绍Agile/Scrum。 趁着还没有忘记,赶快整理一下思路~ 故事源于 Agile Manifesto 。一群大牛聚在某个motel里头琢磨出的宣言…… Individuals and interactions over processes and tools Working software over comprehensive documentation Customer collaboration over contract negotiation Responding to change over following a plan That is, while there is value in the items on the right, we value the items on the left more. 敏捷方法包含了很多内容,如eXtreme Programming、Crystal、FDD什么的。 当然,Scrum是其中被广泛运用的一个分支,主要定义了一种开发的方法论。 相较于传统的瀑布模型,敏捷更愿意拥抱变化, 因此change requirements如果impact不大的话在scrum中是可以迅速被接受的。 敏捷方式开发并不意味着开发周期一定比传统的方式短,不过质量应该更好。 据说有研究表明,同样周期的项目开发,敏捷方式的产品质量要明显占优。

一道题・了解补码多一些~

Java的开发面试题里面经常爱问关于primitive types的范围之类的问题,例如一个short能表达的整数值范围是多少,诸如此类的。这种题型的目的是看看程序员对于Java Fundamental到底了解多少,实际上有的刁钻问题甚至连老鸟都能蒙住…… 看到一道蛮有意思的基础问题,贴出来一起学习一下: int min = 0x80000000; // minimum integer int opp = -min; // get opposite number int sum = min + opp; 问min, opp, 和sum求出来是多少? 首先要明确一点,对于32bit的整形int而言,0x80000000所表示的是多少? 因为最高位是符号位(sign),所以最大的int所代表的是0x7FFFFFFF,换算为十进制(decimal)也就是2147483647。 根据补码的定义,最小的32bit int应该是0x80000000,因此换算为十进制的值就是-2147483648. 在Java中,如果用int来存储这个MIN的相反数,得到的还是它自身。看起来这个结果很无厘头,1的相反数是-1;2的相反数是-2;为什么到了最大的负数这里它的相反数就是它自身呢?? 为什么为什么为什么…… 原因在于 补码 计算相反数。先取反,再加一。 0x80000000 -> 0x7FFFFFFF -> 0x80000000 所以就得到了上面的结果——min的相反数还是自身。 因此,  (0x80000000) = -0x80000000 = -2147483648 有了上面的结果,最后一个求和的结果就相对容易理解了。 两个最小整数相加之后,结果溢出了,最后所能够得到的sum就是0。

Synergy Between Spring AOP and AspectJ

synergy (synergies) If there is synergy between two or more organizations or groups, they are more successful when they work together than when they work separately. (BUSINESS) Much has changed in the AOP framework landscape in the past few years. There has been some housecleaning among the AOP frameworks, resulting in some frameworks merging and others going extinct. In 2005, the AspectWerkz project merged with AspectJ, marking the last significant activity in the AOP world and leaving us with three dominant AOP frameworks: AspectJ ( http://eclipse.org/aspectj ) JBoss AOP ( http://labs.jboss.com/portal/jbossaop/index.html ) Spring AOP ( http://www.springframework.org ) Since this is a Spring book, we will, of course, focus on Spring AOP. Even so, there's a lot of synergy between the Spring and AspectJ projects, and the AOP support in Spring 2.0 borrows a lot from the AspectJ project. In fact, the <aop:spring-configured /> configuration element takes advantage of AspectJ...

如何在 Eclipse WTP 内配置 Tomcat 的 Multiple Hosts

在开发Tomcat上的WebApp的时候,服务器上部署了几个webapp分别用Virtual Hosts映射到几个不同的domain,例如: www.mydomain.com wap.mydomain.com soapapi.mydomain.com 在服务器上操作的时候是通过Apache Httpd的config文件中设定Virutal Host,并采用JK2协议转发到Tomcat 5.5中。所以在Tomcat的server.xml中也要有对应的Host配置。 然而当我在Eclipse内通过WTP部署程序的时候,是没有办法创建多个Host的config的。通过Server视图中的右键菜单"Add or Remove Projects.."只能够在已有的默认Host内添加新的Context。于是我手动编辑这个server.xml文件,实现以下的双Host: <Host appBase="webapps" autoDeploy="true" name=" www.mydomain.com "   unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">   <Context docBase="myweb" path="" reloadable="true"     source="org.eclipse.jst.j2ee.server:myweb" crossContext="true"/> </Host> <Host appBase="webapps" autoDeploy="true" name=" soapapi.mydomain.com "   unpackWARs="true" xmlNamespaceAware=...