• Oozie web console(我的版本是oozie-client-2.3.2-cdh3u3)显示的时间是GMT,换成本地时间显示会更好些.

    研究了一个晚上找到了一个解决办法,修改oozie-console.js这个文件即可,可以参考这个patch: oozie-console-localtime.patch:

    改完后保存刷页面效果:

     

     

  • iOS ANE编译问题续2012-03-10

    Tag:ios

    上一篇blog中提到了

    "如果.a 需要和ANE连编,在Objective-c的代码里最好不要使用@try @catch 代码,否则会在链接的时候会出现下面的错误."

    上周这个问题的到了解决,解决的办法很简单,在编译ipa的时候,指定iOS SDK的目录即可,如果是命令行编译,如下:

    IPHONE_SDK="/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk"

    adt ..... -platformsdk "${IPHONE_SDK}"

    更多的编译设置可以参考这里: iOS5 support for AIR/Using external SDKs to package apps

  • 近期的总结 - [原创]2012-02-18

    Tag:ios git gerrit

    很久没写博客了,虽然成天的瞎忙,但是也不能成为理由,还是要坚持写.

    由于近期工作中开始了iOS方面的业务,我也投入了更多的时间在iOS开发的学习上.

    自从组里来了一个iOS大拿,学习的进度快了很多,有问题也可以请教了. 最让我吃惊的是我们在开始做第一个App项目的时候,他设计的架构完全没有使用Interface Builder开发UI,全部的UI都使用代码完成,完全颠覆了我从书上看到的,收获很大,感谢之.

    最近完成了一个iOS数据收集SDK,因为要同时提供给Flash应用使用,所以进行了ANE的封装,在封装ANE时遇到的问题,分享一下:

     

    1. 如果.a 需要和ANE连编,在Objective-c的代码里最好不要使用@try @catch 代码,否则会在链接的时候会出现下面的错误.

    Undefined symbols:

      "_objc_terminate", referenced from:

    发现这个原因是偶然间想到_objc_terminate很可能是@finally 代码块里的,就修改了SDK里所有的@try @finally写法,结果接连接成功了.

    而具体的原因,我还不清楚,在stackoverflow和adobe 的官网上都提这个问题,目前还没有回复.

    2. 最好同时编译armv6和armv7两个版本

    ANE对armv6的支持较好,一般的代码编译不会出问题;而ANE目前对armv7的支持仿佛有问题,在链接的过程中可能会出现各种警告,如果有警告,那即使打包成功了,但是在运行时也可能会崩溃. 

     

    目前团队的人马渐渐多了起来,我们也尝试了Gerrit的Code Review,在所有的Java工程开始启用了Code Review,目前看效果还不错,但是更重的开发任务还在后边,可能会有更复杂的情况发生,需要持续地关注和投入.

    对基于Git的开发流程,我以前很喜欢git flow这个工具,但是在使用Gerrit的时候,我们全面倒向了repo这个简单又强大的工具.

    Git flow稍显复杂,以前多次在团队内部推进也没效果,而repo一推动,大家就自然地接受了,正应了最近看完的<软件框架设计的艺术>中提到的"无绪",我很赞同作者提出的这个词,在今后的产品设计,开发方面要多下功夫了.

     

  • 使用Guice吧 - [原创]2011-10-05

    Tag:java Guice

    最近在选择合适的IoC框架,在项目中试用了一下Guice,感觉良好.

    国庆节前花了一下午的时间浏览了Guice的文档,又用了一天时间用Guice实验自己想要实现的各种目标,包括Guice和Spring MVC的集成,一切都还算顺利,有了结果,也基本上坚定了使用Guice构建服务框架以及整个系统的服务层的IoC框架的决心.

    说起来,相对于Spring IoC,我更喜欢Guice IoC,而Guice最吸引我的特性有:

    1. Module

    这一点深受当年使用Tapestry5的影响,当时对Tapestry 5 IoC强大,简洁,服务模块化的配置方式就非常地喜欢,而Guice在这方面同样做得很好(Tapestry 5 IoC的一些很好的想法就是从Guice借鉴的). 基于Module的配置方式,为我们提同了一种服务发布的途径,比如API的作者可以提供一个Module,其他的开发者使用该Module即可,从某种意义上说,这可以强制要求开发者进行面向服务的开发和接口定义.

    2. 无XML

    所有的配置都使用Java代码实现,这对于重构等还是很方便的,而且使用Guice作为IoC容器,在配置上也会更简单和直观.

    3. 专注IoC

    Guice只提供IoC框架,使用它可以方便地构建独立的应用服务(非Web的),也可以和其他Web MVC Framework集成使用.和Spring Framework相比,Guice显得更轻,也能够更轻松地适应各种应用场景,而Spring显的更重一些了,要达到我的想要的目标还需要自己做额外的开发工作.

    Guice+Spring MVC,应该是个不错的组合,呵呵. 总的来说,Guice非常值得一用.

     

  • 由于工作的原因,需要连接Juniper SSL VPN,Juniper提供给Linux的版本是32位(32位的so,需要32位的jvm...),对于64位的Ubuntu来说一切都是那么的不着调.

    Google了很长时间,多数的解决方案是是安装32位的运行库,32位的firefox,32位的jvm,模拟出一个32位的环境. 但是碰巧找到的这个文档Using Juniper Network Connect on Ubuntu,解决算是比较简单的. 使用作者提供的脚本(一个名为junipernc的shell脚本,可以从http://mad-scientist.net/junipernc下载),可以不需要浏览器也可以登陆VPN了.但是我在使用的时候仍然遇到了问题,当程序运行起来后,在日志中总是可以看到下面的日志:

    ncsvc[p6866.t6866] dsclient.info --> GET / (authenticate.cpp:162)

     

    ncsvc[p6866.t6866] dsclient.info <-- 404  (authenticate.cpp:194)

     

    反复了几次后,怀疑是用户验证的URL不对(因为看到了404错误). 将junipernc脚本中的调用NC.jar的那行修改一下:

    echo "$password" | "$JAVA" -jar "$_ncpath/NC.jar" -h "$HOST" -u "$USER" -f "$CERT" -r "$REALM" || ok=false

    改为:

    echo "$password" | "$JAVA" -jar "$_ncpath/NC.jar" -h "$HOST" -u "$USER" -f "$CERT" -r "$REALM" -U https://xxxx || ok=false

    可以看到,增加了-U参数,这个参数是用于登录校验的URL,一般是登录Web时提交登录信息表单的URL地址.

    这时后再重新尝试登陆,一切都正常了.

  • 今天想用aMule从verycd上下载些东西,但是自把Ubuntu重装后,无论是在Firefox还是在Chrome下,都识别不了ed2k链接了,只能手动地复制到aMule中后再下载.

    实验了google到的各种对浏览器的设置方式,但是仍然不起作用,这样碰到有很多下载资源的时候会让我变的很没有耐心.

    简单看了一下aMule的文档,它使用/usr/bin/ed2k这个程序解析ed2k协议的,并将结果写到~/.aMule/ED2KLinks当中,然后aMule会读取这个文件,并将内容载入到下载列表中.

    这样的话写个脚本处理即可,amule_verycd.sh:

    #!/bin/bash
    if [ $# -eq 0 -o  -z "$1" ];
    then
            echo "Usage:$0 "
            exit 1
    fi
    url=$1
    
    echo "add the ed2k link form $url to the amule queue."
    
    curl "$url" | grep 'ed2k="' | gawk -F \" '{print $2}' | xargs ed2k
    

     

    例如: ./amule_verycd.sh http://www.verycd.com/topics/2900981/ 

     

  • Gerrit2.2.0安装手记 - [原创]2011-09-18

    Tag:git

    在项目中部署Gerrit了,相比Gitosis,Gerrit提供了更强大的权限控制,而且提供了成熟的代码review流程,虽然现在还用不到review的机制,但是在一段时间后考虑引入开发流程中,因此Gerrit更适合现在以及将来我们的需求.

    详细的安装步骤可以参考Gerrit的文档,我只将所所遇到的问题分享一下,以下安装基于LDAP和MySql.

    1. LDAP

    * 配置LDAP的时候需要了解连接LDAP时是否需要验证,如果需要则应该配置username和password这俩个选项,一般可以向LDAP管理员询问得知.

    2. MySql

    * 如果使用MySql数据库,请使用InnoDB引擎,MyISAM引擎在初始化数据库时会由于索引超过1000字节失败

    * 如果要支持中文,数据库编码设置为UTF-8,在配置MySql数据库时使用JDBC方式进行配置,不要使用内置的MySql模式进行配置

    * JDBC Url加上?useUnicode=true&characterEncoding=UTF-8,可以正确识别中文

    一点使用的建议:

    * 进入系统后,去掉Anonymous Users组的所有权限

    * 可以先不使用review流程,将项目的access配置修改为可以向原生的git一样直接push到master分支,可以避免初期使用的难度,等将来需要的时候再进行调整

  • 最近读过的书&反思 - [原创]2011-09-03

    Tag:

    离职后在家休息将近一个月了,除了陪闺女玩,基本上都在看书,总结一下:

    <UNIX环境高级编程> 和 <UNIX网络编程>

    这两本书刚工作的时候看过,后来一直做Java方面的开发,对书中讲的内容几乎都忘光了,这回先把这两本书重读了一遍(没有全部读完,例如SCTP方面基本上跳过了).这么些年的工作积累了不少的问题,在看书的时候发现多数问题在书中都讲到了,比如我以前没弄清楚的CLOSE_WAIT和TIME_WAIT,在书中有非常清晰的描述. 如果在工作中涉及到Linux/Unix,无论是否需要写C程序,这两本书应该读读,常备着.

    <启示录>

    要做出用户喜爱并且能够给公司带来价值的产品,我觉得不论是产品还是技术这本书都应该看看.作为技术人员,这本书给我最大的收获是设计产品的思路和原则,对于和产品同事的沟通会很有帮助.

    <浪潮之巅>

    这书无需多言,好评如潮的一本书,开阔眼界.

    <深入理解Java虚拟机>

    看完后同样收获很大,特别是第8章虚拟机字节码执行引擎.如果以前看过<深入Java虚拟机>,看这本书会更好理解.

     

    看书之余,我也在反思自己.

    其实在离职的时候我都没有想好我下一个工作应该做什么,我就想先休息休息,而我身上的那股浮躁气仍然很重.

    看到其他公司的技术团队有成就,技术氛围好,我就向往;看到他人去创业,我也向往;有时想踏踏实实做一个技术工程师,有时却更想带一帮弟兄一起拼搏,各种纠结加浮躁...

    先说说我反思的结果吧.

    我近3年的目标是成为一名合格的架构师,虽然我工作近10年了,也开发设计过一些成功的项目和产品,但我觉得自己离目标还差的很远.

    为了这个目标,我先要求自己做到以下两点,一步一步地前进:

    1. 不出意外的情况下不频繁地换工作 

    除了在一家公司干了3年多,其他的工作都不到两年. 我没有因为薪水的问题换过工作(我没有向领导申请过加薪,呵呵),也没有因为和同事相处不好换工作(我待过的地方一般对我还是认可的,还有过二进宫的情况,呵呵).我以前换工作的原因基本上都是想在技术上能够学到更多的东西,做的东西更有挑战,但事实是在一家公司如果没有3年左右的积累,这些都很难做好.

    2. 技术力求更上一层楼

    a. 坚持写代码,这个不用多说,无论作为技术管理,还是开发工程师,架构师,都应该持续地写代码.我认为架构师或者是技术管理者,对技术的感觉只能是在编码的过程中不断地实践和积累,光看都不一定管用.

    b. 坚持学习c/c++,这些年一直专注于Java,c/c++一直薄弱的环节,这个课要补上

    c. 坚持学习算法,虽说工作中用到的不多,即使用多数情况也是用现成的类库(这方面托java的福了),但是做为一个优秀的工程师这是基础,不是所有的问题都有现成的类库可用.

    d. 坚持读书学习,这个我做的还不错

    3. 管理好自己的时间

    以前我的生活基本被工作和学习占满了,给家人留的时间太少,搞的自己内疚而且还会影响工作和学习. 

    对于这次工作的选择,我希望我能够将自己的浮躁给压下去,踏踏实实地做事,一点一滴地积累,多分享,多沟通,多生活.

  • TCP TIME_WAIT CLOSE_WAIT - [原创]2011-08-24

    Tag:

    最近重读《Unix网络编程》,终于搞明白了两个问题:

    TIME_WAIT: 

    1. 主动发起关闭的一方最终会进入TIME_WAIT状态

    2. TIME_WAIT会持续一段时间,一般是2MSL,其目的是为了实现TCP全双工连接的终止,并允许老的重复分节从网络中消逝

    CLOSE_WAIT:

    1. 被动关闭的一方进入CLOSE_WAIT状态

    2. CLOSE_WAIT的意思是等待应用进程调用close()

  • Java 7被发现含有严重bug - [转载]2011-07-30

    Tag:

    今天想试验一下JDK7,碰巧在Solidot上看到了一篇 Java 7被发现含有严重bug,顺便看了看外文的Don’t Use Java 7, For Anything.

    就像文中说的,除非你的程序里没有循环,否则应该暂停应用JDK7,本来想把我电脑上的jdk升级的,决定还是等update 2出来再换.