• 摘:(Fireshort即偶的观点,Rainking是linuxer杂志编辑的观点)

    Fireshort:

    《Struts,一个开源的MVC实现》是一篇好文章,然而,却是too old了,记忆中很久很久以前已经看过了,一google,发现是ibm dw上文章:
    http://www-128.ibm.com/developerworks/cn/java/j-struts/
    时间是2001 年 2 月 23 日!
    作为一本Linux方面的杂志,用了差不多10页来说一个Java框架,感觉像是充字数的,而且
    时效性太差。这一点从文章中struts的版本也很容易看出,明显还是struts1的,编辑都没有搞Java开发的?如果是这样,我可以代为审核,确保Java方面的文章不至于太out。不过还是建议不要大篇幅的出现只谈Java的文章。

     Rainking:

    据我所知,目前绝大多数公司在开发java程序的时候选择的jdk版本是1.4.2,很多目前还未发售的游戏(地狱之门等等)是用MFC开发的.

    out?过时?个人的态度而已.

    去年暑假候捷给我们上课的时候,用的是win98+word97.out?过时?

    超多的经典教材,多到我都懒得一个个报名字,都是上个世纪的产物,难道都out?过时?too old?

    ok,不想再讨论时限的问题,大家都明白我的意思.

    至于为何花10页的篇幅写struts,是因为1 它是开源的 2 无数读者想看开发的,技术的文章 抛砖引玉 看看读者态度而已

    Linuxer要扩展文章的类型了,以linux为主打,开源的文章也可以上,就这样

    Fireshort:

    “目前绝大多数公司在开发java程序的时候选择的jdk版本是1.4.2”这个倒是我孤陋寡闻了。
    经典的教材跟一个开发的框架没有可比性。有一句话说,总有一些东西值得我们的后代去记取,然而,却绝对不是上面这篇介绍struts1的文章。对于 Java Web开发的初学者,我宁愿他先学会基本的Servlet+Jsp,然后投入学习更好的web框架,而不是学习deprecated的struts1。后 发者要发挥后发者的优势,不要浪费时间照着别人的错误再错一次,吸取教训就可以了。

     

  • 最近,从家里(盐田区政府)去公司(水库)上班,发现多了一条线路:53路,于是欣然从208转到53。53路的座位比208的舒服多了,然而几天下来,我却从53路深刻体会到了深圳公交存在的问题。
    问题一:想宰就宰
    53路原来是全程2元(普巴1.5元),值此众多深圳老百姓对公交票价过高意见纷纷之际,竟尔毫不犹豫的借了个因头(延长线路云云),暴涨至全程9元。自由的年代,想唱就唱;垄断的集团,想宰就宰啊。不知道物价局在这里发挥了什么作用?
    问题二:每一段还是那么贵
    除了全程贵,53路每一段还是那么贵。
    这几天,在53路车上,见得最多的是乘客跟乘务员“讨论”票价的问题,听到最多的是“怎么这么贵啊,以后再也不坐这趟车了,你们这趟车怎么会有生意……”。跟238比,238只要两块,53就要收四块;跟360比,360只要三块,53就要六块……
    问题三:分段暗藏猫腻
    53路的分段点设置得也颇为奇怪,像“东湖宾馆”又是一个分段点、“三家店”是一个分段点,奇怪的是,这两个都不是什么大站点,却为何都设在那里,而不是设置在“水库”、“盐田区政府”这样的大站呢?
    看一下分段收费的算法就清楚了,以“水库”坐到“新一佳”为例。
    53的路线是这样的:东湖宾馆、水库、水库新村、怡景花园、峰景台、罗湖体育馆、西岭吓、聚宝路口、莲塘、畔山花园、长岭、胫肚、沙头角海关、三家店、沙头角邮局、新一佳
    在“水库”上车,就是算在“东湖宾馆”这个分段点上面上车,而在“新一佳”下车,则算到了“三家店”的下个段,也就是跨段,要多收一个段的费了。简单来说,就是上车的时候,不够一个段的算一个段,下车的时候,超出一个段的,再算一个段,真是好计算啊。好在电信、移动没有学会这招,不然我打50秒的电话,它说我是从18:30:30秒打起的,要从18:30:00算起,然后在18:31:20结束的,要算到18:32:00,这样就是两分钟了,呵呵
    其实53最好是在“胫肚”里设分段点了,那样几乎每个过隧道的人都是要跨段的,哈哈。
    其实有个疑问,一直不得其解,为什么要按分段来定价,定下来任意两个点的票价很困难吗?(就我所见所闻,同是SBG的车,任意两个点的票价也相差颇大,而这是很多乘客与乘务员经常发生的争执。)不要说要记住这些票价很难,就算是30个站点,也不过是30×30=90条记录,天天卖票,乘务员也会很快记住,就算记不住,也可以打印一张纸对照(看到很多新乘务员都会这招)。
     不过最好的办法还是能够像“北京”、“广州”的公交一样,票价能够降下来,全程2-3元,深圳通真的可以通“深圳”。就不知道深圳巴士集团SBG是不是真的有诚意,而不是老子天下第一,只顾自己的利益,随意定价,都拿咱老百姓当SB了
  • 2007年01月23日

    用Java进行LDAP编程的方式

    Tag:Java
    1、直接用JNDI的方式。
    shark的LDAPUserGroupManager是采用这种方式。这种方式不需要采用其他的SDK,难度较大。

    2、采用Netscape Directory SDK for Java。在sun的网站可以找到相应的开发文档:http://docs.sun.com/db/doc/816-6402-10

    3、采用jldap。jldap支持“LDIF and DSML read/write functionality and DSML web services ”。不知道Netscape Directory SDK支不支持这些特性。
    openldap上面还有JDBC-LDAP,是用JDBC的方式访问LDAP服务器。估计支持的特性更少。
  • 2007年01月17日

    CVS服务器设置指南

    Tag:Linux CVS

    第二次配置CVS服务器体会:
        1、要用清醒的头脑做事情,不然很容易犯低级错误。
        2、Linux可能比Window更像woman:出错了,你不知道哪里错,我也不会告诉你。

    首先确保系统安装有cvs:
    [root@mail xinetd.d]# rpm -qa|grep cvs
    cvs-1.11.1p1-3
    如果命令输出类似于上面的输出则说明系统已经安装有cvs,否则就需要从安装光盘中安装cvs的rpm包。

    一 创建CVS属主用户(用于管理CVS,做CVS操作):
     useradd -d  /deke/cvscore/ cvs
     chmod 771 /deke/cvscore/
    二、建立CVS仓库(初始化cvs)
    # su cvs
    $ cvs -d  /deke/cvscore/  init
    $exit
    #
    三、启动cvs服务器
      在Linux上CVS服务可以通过inetd、xinetd或tcpwrapper等来启动,其中inetd由于安全理由在许多场合已经被xinetd所取代了。这里我们使用xinetd来启动CVS服务。
    在/etc/xinetd.d/目录下创建文件cvs,内容如下:
    # default: on
    # description: The cvs server sessions;
    service cvspserver
    {
            socket_type = stream
            wait = no
            user = root
            server = /usr/bin/cvs
            server_args = -f --allow-root= /deke/cvscore/ pserver
            log_on_failure += USERID
    }
     注:
      1)pserver表示是口令认证的访问方式,这是最常用的方式,其他还有gserver,kserver,ext,如果想要更高的安全性可以使用ssh来加密口令和数据流,不过这里为了用户使用的方便,仍然选的是pserver
      2)--allow-root是指定Repository的目录,可以建立多个Repository
            3)请注意每行等号左右都有一个空格,否则无法启动服务。

    修改该文件权限:
    # chmod 644 cvs
    然后重新启动xinetd:
    # /etc/rc.d/init.d/xinetd restart
    然后察看cvs服务器是否已经运行:
    [root@mail xinetd.d]# netstat -lnp|grep 2401
    tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 7866/xinetd
    则说明cvs服务器已经运行。

    四、创建用来访问cvs的用户
    前面创建的cvs用户是cvs仓库管理用户,而为了让用户访问则还需要一个访问用户:
    # useradd cvspub
    # usermod -G cvs cvspub
    这里添加了一个用户cvspub,并且将该用户添加到cvs组中。

    五、管理cvs服务器
    CVS默认使用系统用户登录,为了系统安全性的考虑也可以使用独立的用户管理。CVS用户名和密码保存在CVSROOT目录下的passwd文件中,格式为:
    用户名:密码:系统用户
    也就是说,它把CVS用户映射到系统用户,这样我们就可以通过系统用户的权限设置来分配给用户不同的权限,而不需要让用户知道系统用户名和密码。

    注意:CVS用户不能跟系统用户重名,否则会提示没有权限之类错误。

    passwd文件默认并不存在,我们必须自己创建。文件中的密码字段使用MD5加密,不幸的是CVS没有提供添加用户名的命令,所以我们借用Apache的命令来完成这项工作:

    #htpasswd passwd username

    这个命令为username指定密码,并保存在passwd中,文件不存在时会自动创建。htpasswd命令不是为CVS而设,因此总有一些遗憾,它不能自动添加映射到的用户名,不过没关系,我们设置好密码后,自己把这部分加上。我的做法是映射到cvspub用户,如果需要映射其他的用户,请注意给相应的目录设置好权限,否则CVS用户可能无法访问源代码仓库。
    要彻底防止使用系统帐号登陆,可以编辑CVSROOT目录下的config文件,把

    代码:
    #SystemAuth=no

    这一行前面的#去掉,CVS就不会验证系统用户了,否则当用户名不在passwd文件中时,CVS会进行系统用户的验证。

    此外还必须配置读写权限,使用CVSROOT目录下的readers和writers文件进行这个工作。这2个文件默认也是没有的,没关系,自己创建就可以了。readers文件记录拥有只读权限的用户名,每行一个用户;writers文件记录拥有读写权限的用户名,也是每行一个用户。注意, readers文件比writers优先,也就是说出现在readers中的用户将会是只读的,不管writers文件中是否存在该用户。

    readers、writers有没有效果?

    六、源代码仓库的备份和移动
    基本上,CVS的源代码仓库没有什么特别之处,完全可以用文件备份的方式进行备份。需要注意的只是,应该确认备份的过程中没有用户提交修改,具体的做法可以是停止CVS服务器或者使用锁等等。恢复时只需要把这些文件按原来的目录结构存放好,因为CVS的每一个模块都是单独的一个目录,与其他模块和目录没有任何瓜葛,相当方便。甚至只需要在仓库中删除一个目录或者文件,便可以删除该模块的一些内容,不过并不建议这么做,使用CVS的删除功能将会有一个历史记录,而对仓库的直接删除不留任何痕迹,这对项目管理是不利的。移动仓库与备份相似,只需要把该模块的目录移动到新的路径,便可以使用了。
    如果不幸在备份之后有过一些修改并且执行了提交,当服务器出现问题需要恢复源代码仓库时,开发者提交新的修改就会出现版本不一致的错误。此时只需要把CVS相关的目录和文件删除,即可把新的修改提交。

  • 在用记事本之类的程序将文本文件保存为UTF-8格式时,记事本会在文件头前面加上几个不可见的字符(EF BB BF),就是所谓的BOM(Byte Order Mark)。JDK1.5之前的Reader都不能处理BOM,解析这种格式的xml文件时,会抛出异常:Content is not allowed in prolog. 据说JDK1.6已经解决了这个bug。(参考http://www.uuzone.com/blog/mao/98921.htm
    在未使用JDK1.6之前,解决办法有三:
    1、不要使用有BOM头的xml文件,就是说不要用记事本保存utf-8的xml文件,editplus就很好用;
    2、使用这位仁兄的unicodereader,可以正确处理有BOM的xml文件:
    http://koti.mbnet.fi/akini/java/unicodereader/
    3、如果是用Xerces解析器,直接传Stream给Xerces,而不是传Reader,Xerces就可以正确的处理了。总之不要用Reader就好了。