2007年3月2日

论剑归来(一)

应朋友邀请,周六早从上海出发往杭州参加阿里巴巴网侠大会。同行四人,有锐道的macro chen、杨光(还是我师弟)、移动的王伟旭(特长是linux和网络安全,也是中国linux推广的先驱)。一路上,言谈甚欢。老庄给我们订的票,他一早肠胃有恙,仍然坚持把票送到火车站,之后去吊盐水,下午又出现在会场。确实精神可嘉,建议阿里巴巴颁发“最佳精神奖”。

到杭州已是中午,错过了上午大会。下午Robbin进行Java技术展望和RoR实现REST的演讲,既然是朋友,肯定是要捧场的。Robbin旁征博引,以其深厚的技术功底和对新技术的敏锐洞察赢得了听众。

晚上一堆人去聚会,各路豪杰纷至:有阿里巴巴的,有自己创业的,有技术大牛,还有媒体(Infoq),出版社(博文的周总领3员大将赴会)。大家互换名片,认识的不免寒暄几句,不认识的也很快就熟捻了,还不时有“原来你就是×××”的惊呼,原来网上就“互通心曲”,只是一直没机会认识罢了。

席间觥筹交错,具体内容暂且不表,只说一件令我感受颇深之事。一个阿里巴巴的员工表现出对公司的无比忠诚,讲起公司的奖惩制度,说是一个员工的绩效不仅跟所在项目相关,还与部门、其它部门甚至整个公司的业绩相关。所以只要是对公司有利的事情,即使与自己现在的工作无关,他们也会去做。按常理来说,这有点不公平,我只能努力做好自己的事情,而如果别人不努力,我就是白做。但如果大家都努力,又变成了共赢。

这里让我讲一个简单的博弈问题,就是“囚徒困境”。AB两个同犯被抓,因为没有其它任何证据和证人,只能让2人分别交供。如果AB都矢口否认,那么两人无罪释放。如果A承认,B不承认;A是坦白从宽,判1年;B抗拒从严,判5年,反之亦然。如果2人都承认,ok证据确凿,各判2年。如果2人都是理性人,且没有互通消息,按照博弈,每个人的最优解就是承认,也就是各判2年。其实对2人真正有利的就是打死不承认然后都无罪释放,而这种状态在理性人的假设下是很难实现的--除非有一个教父,一直灌输他们不要出卖同伙。

马云就是这个“教父”!

卡内基有篇文章,我总结成一句话就是:用崇高的理想打动别人。据说马云一直是以个人魅力及“创造中国电子商务的明天”类似的理想,激励员工的。有了统一的企业文化,员工都不计较个人得失,努力奋进,最终企业和所有员工取得共赢,这绝对是摆脱“囚徒困境”的典型案例。

话说回来,阿里巴巴能让你感受到团队的力量,一群精英在一块做很有价值的事情,对每个人也是很好的锻炼。个人认为,如果有吃苦耐劳的打算,眼光放长远点,又没有其它方面的束缚,阿里巴巴的确是不错的选择。(得向阿里巴巴收代言费,呵呵!)

第二天听了多场论道,主要是SAAS,搜索,分词方面。结合阿里巴巴的战略,我把几点融合起来讲一下。这个下篇再细细道来。

 

 

posted @ 2007-05-21 20:35 pesome 阅读(1097) | 评论 (1)编辑 收藏

sitemesh的问题及解决

再说 sitemesh 的问题,同样是做 openfans 网摘功能出现的。做好了 IE 插件,有 fans 反馈说弹出页面太大,这也难怪,用了 sitemesh head footer 都在页面上,想缩小页面,肯定得把 head footer 都去掉,做个干净点的。既然用了 sitemesh 肯定是希望最方便的搞定这个,而不用动任何逻辑(包括页面逻辑)。这个好办,文档里有说,通过在 sitemesh.xml 中增加

< mapper

           
class = " com.opensymphony.module.sitemesh.mapper.ParameterDecoratorMapper " >

           
< param name = " decorator.parameter "  value = " decorator "   />

           
< param name = " parameter.name "  value = " confirm "   />

           
< param name = " parameter.value "  value = " true "   />

       
</ mapper >

就能搞定,这样只需要使用参数如 saveSnippet.html?decorator=simple&confirm=true ,就能让它使用指定的 decorator 。然后做一个去掉 head footer 只保留必要的 js css 引用的 simple.jsp 页面,同时在 decorator.xml 中配

< decorator name = " simple "  page = " simple.jsp " ></ decorator >

就应该可以搞定。

但怎么测,就是不使用这个 simple decorator 。没办法,只好跟进 sitemesh 源码中去调试,进入 ParameterDecoratorMapper 类,它继承了 AbstractDecoratorMapper 类,然后有一个 init 方法一个 getDecorator 方法。各打一个断点, init 方法在 tomcat 启动就会执行,也正常初始化了, getDecorator 方法却始终不调用,一时想不出办法。看到篇文章说不自己写 sitemesh.xml 而使用自带的 com/opensymphony/module/sitemesh/factory/sitemesh-default.xml 也可以,于是备份并删除我写的 sitemesh.xml ,居然成功了。为什么我写的就不行呢?差别一是我的简化了很多,只有

< mapper

    
class ="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper" >

           
< param  name ="config"  value ="${decorators-file}"   />

       
</ mapper >

和刚加的

ParameterDecoratorMapper ,二就是顺序,我的 ParameterDecoratorMapper 放在了 ConfigDecoratorMapper 后面,会不会是顺序原因呢,调换一下,果然成功了。问题是解决了,原理呢?再花点时间跟一下代码了解下原理,原来使用了 Factory ,它会调用各个配置的 Mapper init 方法,并放入 map 中,然后到时选择一个 Mapper ,如果符合条件就使用,否则继续往下找。这里就有了顺序的问题,因为我在 decorator.xml 中使用了
<decorator name="default" page="default.jsp">

        
<pattern>/*.html</pattern>

    
</decorator>

,这样如果 ConfigDecoratorMapper 放在前面,他就先找这个 Mapper ,一看 saveSnippet.html?decorator=simple&confirm=true ,符合 pattern 啊,就使用它了,另一个 ParameterDecoratorMapper 根本得不到机会,所以也进不了它的 getDecorator 方法。换了顺序就是它先进去,所以执行,其它的 url 也是先找它,但不匹配,就又交给 ConfigDecoratorMapper 了。呵呵,问题也解决了,对 sitemesh 的认识又进了一步。

posted @ 2007-03-11 22:54 pesome 阅读(2956) | 评论 (0)编辑 收藏

中文问题的解决

这次给 openfans 做网摘功能,主体程序倒是很快就写完了,另外要做个 IE 插件,却碰到了不少问题。 IE 插件其实很简单,就是用 js 获得页面的标题、 url 和选择的内容,然后通过弹出窗口,将其送到服务器。这里就有中文的问题了,开始使用 escape ,如 escape(title) 形式, request.getParameter 碰到中文就为 null ,网上搜了一通,说是可以通过 java 编码搞定,但拿到就为 null 了,还怎么换编码?忙活了好几个小时,又是 alert ,又是 document.write ,看上去也没什么问题。不 escape ,直接在浏览器中输入带中文的 url ,拿到的不为 null 了,拿到后,通过 new String(str.getBytes("ISO-8859-1"), "UTF-8"); 还真显示正常了。但用 window.open 又出乱码了。看到文章说还有 encodeURIComponent 方法可用,就试了下,把 escape 换成 encodeURIComponent 居然搞定了,服务端还是得用 new String(str.getBytes("ISO-8859-1"), "UTF-8") 进行处理。注意这里用的 tomcat ,它的默认编码就是 "ISO-8859-1" ,如果改了编码程序也得做相应的改动了。

posted @ 2007-03-11 22:51 pesome 阅读(1003) | 评论 (0)编辑 收藏

hibernate native sql的小技巧

为了性能考虑,使用了 native sql 。因为需要分页,需要 2 sql ,一个获取 list 一个取得总数。获取 list 很好写:

 

 1 private  List getListByNativeSQL( final  Class cls,  final  String sql)  {
 2
 3         return  (List) getHibernateTemplate().execute( new  HibernateCallback()  {
 4
 5             public  Object doInHibernate(Session session)
 6
 7                    throws  HibernateException  {
 8
 9                return  session.createSQLQuery(sql).addEntity(cls).list();
10
11            }

12
13        }
);
14
15     }

16

 

获取总数查了下 hibernate reference, 试了几次才明白用法 :

 1 private  BigInteger getCountByNativeSQL( final  String sql)  {
 2
 3         return  (BigInteger) getHibernateTemplate().execute(
 4
 5                new  HibernateCallback()  {
 6
 7                    public  Object doInHibernate(Session session)
 8
 9                           throws  HibernateException  {
10
11                       return  (BigInteger) (session.createSQLQuery(sql).uniqueResult());
12
13                   }

14
15               }
);
16
17     }

18

这里的

sql 是“ select count(*) 开头的”。这里大家可能要问,为什么要使用 BigInteger ,因为如果用 uniqueResult() 默认就返回 BigInteger ,而 BigInteger cast Integer 会出错。那么如果我就是要返回 Integer 呢,可以通过下面的办法实现:

 1 private  Integer getCountByNativeSQL( final  String sql)  {
 2
 3         return  (Integer) getHibernateTemplate().execute(
 4
 5                new  HibernateCallback()  {
 6
 7                    public  Object doInHibernate(Session session)
 8
 9                           throws  HibernateException  {
10
11                       return  (Integer) (session.createSQLQuery(sql).addScalar( " count " , Hibernate.INTEGER).uniqueResult());
12
13                   }

14
15               }
);
16
17     }

18

大家注意粗体的部分,这里是给一个

alias 赋予类型,那么 sql 就需要变成以 ”select count(*) as count ” 开头了。

posted @ 2007-03-02 10:52 pesome 阅读(5221) | 评论 (2)编辑 收藏

<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

公告

主要记录作者在学习java中的每一步足迹。除非特别说明,所有文章均为本blog作者原创,如需转载请注明出处和原作者,如用于商业目的,需跟作者本人联系。
欢迎大家访问:

常用链接

留言簿(16)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

java技术

人间百态

朋友们的blog

搜索

最新评论

阅读排行榜

评论排行榜