使用正则表达式过滤不包含某子字符串的单词

昨天在学院版上看到有人发帖问,标题里的内容就是帖子里问题的核心。举个例子来说,就是给一堆单词,匹配所有不包含某字符串的单词。比如要求剔除aa,那么对于单词aab, abc, abca, abaac,就匹配abc, abca。
问题似乎很简单,但我从来没用过逆向匹配。有限状态自动机很容易就可以画出来,但怎么转化成正则表达式倒是忘得一干二净。最后google了半天,发现一个博客给出了正确答案(目前能想到的都验证通过):\b((?!aa)\w)+\b
这个表达式挺不好理解的。(?! pattern)是负向预查(negative look ahead),放在\w前面显然不是和\w进行组合。需要把表达式拆开来看,比如\b(?!aa)\w(?!aa)\w(?!aa)\w\b,这么来看就比较好理解了。首先不可以以aa开头,然后每个单个字符后都不能跟aa,直到结尾。这么就基本把aa给堵死了。
另外,如果支持negative look behind的话(Javascript不支持),应该也可以写作\b(\w(?<!aa))+\b。

远程opensusue无法使用home, end

用了opensusue当服务器两个月,碰到一个小麻烦的问题就是使用putty SSH登录上后,BASH里无法使用HOME和END进行行首和行尾的定位。原本以为是putty的问题(以前用的都是Secure Shell),今天正好想到这个问题google了一把,发现是opensusue的问题,参见这里
我用的是opensusue10,配置文件都是/etc/inputrc,但行数有些不同,我的是90-91行,把下面的代码注掉就OK了:

#”\e[1~”:       history-search-backward
#”\e[4~”:       set-mark

Tomcat启动地址解析错误

贴log:
SEVERE: Protocol handler pause failed
java.net.UnknownHostException: NEOSTA: NEOSTA
at java.net.InetAddress.getLocalHost(InetAddress.java:1474)
at org.apache.jk.common.ChannelSocket.unLockSocket(ChannelSocket.java:484)
at org.apache.jk.common.ChannelSocket.pause(ChannelSocket.java:283)
at org.apache.jk.server.JkMain.pause(JkMain.java:681)
at org.apache.jk.server.JkCoyoteHandler.pause(JkCoyoteHandler.java:153)
at org.apache.catalina.connector.Connector.pause(Connector.java:1073)
at org.apache.catalina.core.StandardService.stop(StandardService.java:563)
at org.apache.catalina.core.StandardServer.stop(StandardServer.java:744)
at org.apache.catalina.startup.Catalina.stop(Catalina.java:628)
at org.apache.catalina.startup.Catalina$CatalinaShutdownHook.run(Catalina.java:671)
关键词:UnknownHostException, JK
原因在google的第一个,虽然上面说的是AIX,但也适用于普通Linux:RHEL5原装的GCJ太山寨了,记得在启动tomcat前要指定JAVA_HOME。

一个人人(校内)应用的想法

一个星期前坐车时想到的。应用的功能很简单,就是帮助求职人群找到笔友、面友。
添加应用的用户可以创建一个活动,比如参加宣讲会、笔试、面试,并对这个活动添加评论(如笔经、面经)。其他人也可以添加评论形成互动。
搜索是一个比较重要的功能,相对于BBS上发帖寻同路人的行为,更有效率。
开发上,可以使用appspot进行部署,但appspot经常会被墙,或者是自己出了问题。自己Host的话要考虑流量和服务器的负载。
营收上可以在上面放adsense,虽然没几个钱。
只是个想法,暂时没什么时间实现,看这个周末有没有空搭一个架子出来。校内的文档很糟糕,支离破碎的。如果有人看到这个想法并打算尝试的话,自便。我也希望看到这个应用的上线。现在校内上关于求职的应用几乎没有。

A Tricky Problem of IBM Directory Server v6.1

I’ve been tortured by this LDAP server for a few days and finally get over it. The scenario is based on Windows XP.
To get IDS running, you have to remove any DB2 instances you installed before. It seems that it can only work with the DB2 instance it provides. For a pre-installed DB2 V9.5 instance, the IDS will report that “GLPSRV064E Failed to initialize be_config”. Secondly, when you create your LDAP instance, use your main OS account (the one you use to log in the system). Otherwise you may get errors like ‘cannot write to slapd.pid’.

软件工程已死?

注:本文是一篇译文,原文为著名的博客作家Jeff Atwood在其博客codinghorror上发表。原文链接在这里。我订阅的英文博客不多,主要就是Jeff Atwood和Joel Spolsky。凑巧的是,两个人还合伙办了一个网站,stackoverflow,一个技术类的问题网站,高质量的回答不少,不像某网站都是”顶”、”接分”之类。
我一向认为,对软件项目加注过多的控制和度量本身完全没有意义。说的就是你,PSP/TSP,看谁呢。A/FR,这些真正代表了什么?哦,他们就是一些数字,真的不代表什么。我们总希望开发过程更加透明,让领导们可以对进度一目了然,并可以控制项目。但实际上他们什么也做不了,只能盯着越来越近的项目期限拼命催促程序员加班。软件真的是一门工程吗?也许开发一个公司的主页是吧,但更多的时候,软件开发就像大型手工作坊。前阵子有一本书叫做《走出软件作坊》,可我怎么看软件开发就像手工作坊呢?
对于软件开发,我个人主张从实践入手。大公司先不谈,对于深陷软件危机的小作坊,就像文中提到的这篇文章所言,别去追什么流程,做好SCM,CI和Tracking,这才是他们看得见摸得着的有效招数。而这些东西,都有很好的开源软件。而日常的控制,做一个Scrum Daily就足够了。
小愤了一把,下面是译文:
当我读到Tom Demarco这篇在IEEE杂志上发表的新文章(pdf)的时候,被彻底雷到了。你也来看看:

我一本早期有关度量的书:, Controlling Software Projects: Management, Measurement, and Estimates [1986] ,在许多需要协同的软件项目的度量工作和计划方面起了一些帮助。我不断反思,书中的建议在当时是否正确,在现在是否还有用,并且这些度量是否还是成功的软件开发所一定要拥有的?我现在的答案分别是不,不,还是不。
我逐渐意识到,软件工程的时代一去不复返了
软件开发现在是而且将来也总是带有一些实验性质的。虽然实际的软件构建并不一定都是实验,但概念上总是。这是我们现在所关注的地方,我们也一直都在关注这点。

如果你被雷焦了,别害怕。我也是。如果想缓解一下读过上面摘要的心情,我强烈推荐扫一扫两页的原文
Tom DeMarco是当前软件工业立最受尊重的权威之一,合著有大作《人件》以及很多软件项目管理类的经典像《与熊共舞》。从Tom这么一位有才干、经验和影响力的大牛这么直接的说软件工程已死
嗯,就像基努里维斯说过,whoa
事情很严重,吓死人。
不过,这对我来说也是种释然。压在我胸口的大石头终于被拿走了。我可以宣布最近五到十年来作为一个软件开发者逐渐意识到,我们干的是手工艺,不是工程。我可以大声地、不愧疚地、胸有成竹地这么宣布。
我认为Jole Spolsky,我的合伙人,最近也有类似的顿悟。他在How Hard Could It Be?: The Unproven Path里这么写道:

对于如何开发软件,我自己有非常强烈的主见,但我通常不说出来。这是件好事,因为随着组织逐渐成型,基本上所有的原则都会被抛弃。
不管这意味着什么,我始终要找到答案。我废弃了七个有关业务和软件工程的原则,没什么坏事发生。我过去是不是太过于小心了?也许我打算尽量不莽撞一点因为这仅仅是我的一个编外项目而不是主业。这次的经验告诉我们,当你在构造一个全新的软件时,可以考虑把那些警告都扔一边去。

是的,我还可以再列出一堆关于你现在手头项目细节的软件工程警告出来:类型(性命攸关,显然),规模(Google那样大的,很自然的),受众(每天好几百万,明显),等等。
但我不打算这么做。
DeMarco似乎在说的–至少,我就是这么说的–控制永远是软件开发项目里遥不可及的幻影。如果你想推动你的项目,唯一靠谱的办法就是练就一身更好的软件开发功夫,更好的技艺和职业素质。
天天渴望着修炼技艺,构建对他们自己意义重大的软件的人们,也许就是会取得最后成功的人们。一起成功的还有他们的软件。
其他所有的东西都是扯淡。

Adding HTTP response header in j_security_check

In WebSphere, the login stuff is handled by the /j_security_check servlet if configured to use federated repository, which is at the top of the WAS invocation chain and there’s on way to intercept the invocation in web.xml. But the login module (which is based on JAAS, Java Authentication & Authorization Service) itself provides a full mechanism of interception and chaining. Besides the open standard JAAS, IBM also develops an proprietary extenstion mechanism named TAI(Trust Association Interceptor). Advanced authentication in WebSphere Application Serveris a good article about this along with a full example. And it’s the main source of this wiki page. It is strongly recommended to read the above link if you want to find out more. Another good reference is the IBM redbook “Websphere Application Server V6.1 Security Handbook”.
WebSphere defines 4 system login configuration that are used in specific siturations related to security:

  • WEB_INBOUND
  • RMI_INBOUND
  • RMI_OUTBOUND
  • DEFAULT

The picture above shows a simplified view of the authentication flow for the WEB_INBOUND configuration:
Web_INBOUND flow
So our custom login module can be placed at the bottom of the chain.
The custom login module can use callbacks to obtain information relevant to the authentication from the envirnoment. In our case, we need to obtain an HttpServletResponse instance in order to populate the P3P header attirbute. There are several callbacks that are available for WEB_INBOUND:

  • NameCallback
  • PasswordCallback
  • WSCredTokenCallbackImpl
  • WSTokenHolderCallback
  • WSServletRequestCallback
  • WSServletResponseCallback
  • WSAppContextCallback

There’s an demostrative example of populating P3P headers in the attachments. There are a few tips while developing and deploying the module:

  • The java version of the byte code should be compliant with WebSphere runtime environment
  • The WebSphere jar file which contains the WSServletResponseCallback lies in WS_ROOT/runtimes/com.ibm.ws.admin.client_6.1.0.jar
  • The output class file should be packed in a jar file and placed in WS_ROOT/lib/ext for WebSphere can reach it globally

Deploy

  1. A similar procedure is also presented in http://www.ibm.com/developerworks/websphere/techjournal/0508_benantar/0508_benantar.html with snapshots.
  2. Open your WebSphere Administrative Console -> Security -> Secure administration, applications, and infrastructure
  3. In the “Authentication” fieldset on the right, follow “Java Authentication Authorization Service” -> “System Logins” -> “WEB_INBOUND” -> “JAAS Login Modules”
  4. Click on “New” button, then input the classname of your custom login module. In this case is “demo.P3PAfterLoginModule”. Check “Use login module proxy”. Save the custom module.
  5. You can adjust the order of the execution of your custom modules. Since our module is intended for the last one, it is not necessary to do this step.
  6. Flush your modification to the configuration file and restart WebSphere.

iBatis中得到数据库自动生成值的方法

iBatis使用SqlMapClient.insert()执行插入语句,这个方法返回一个Object,代表插入的主键值。但如果想得到这个值,必须在<insert>元素中进行另外的配置。在iBatis中文文档的20页中有提到,也可以直接搜索”selectKey”。
主键值的获取支持两种方式,前获取和后获取,如中文文档中例子写的那样。前获取需要把selectkey元素放在前面,后获取反之。



    
        SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
    
    insert into PRODUCT (PRD_ID,PRD_DESCRIPTION)  values (#id#,#description#)



    insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
    
        SELECT @@IDENTITY AS ID
    

DB2的资料比较少,我试了很多次才搞出来,类似于SQL Server,对于使用了IDENTITY的Column:


	INSERT INTO PRODUCT  (PRD_DESCRIPTION) VALUES (#description#)
	
		SELECT distinct IDENTITY_VAL_LOCAL()  AS ID FROM PRODUCT
	

keyProperty属性必须对应于SQL语句中SELECT出来的Column Alias,在本例中均为“id”

windows和linux下安装redmine

前日觐见老板,拿到一个任务:给学院的实训系统搞一个像模像样的demo。功能有项目生命周期管理(要求有需求、设计、实现和测试阶段),角色权限控制(老师和学生),wiki,issue tracking,计划,时间记录等等不一而足。因为时间比较紧,月底就要拿出来,老板也建议我在一个现有的开源项目管理工具的基础上进行修改。

回头立马在网上找资料。google上搜,很多都是广告和软文,不靠谱。维基上的这个页面倒是很不错。以前老板要我就apis调查工具的时候就看过。最后就功能和开发两个方面遴选,有四个候选者:

project.net:老牌强队,有丰厚的历史底蕴,获得多种省优部优荣誉。页面上的六大功能都占全了,Java开发,正好我最熟悉。嗯,一号种子。

trac:功能简单易用,虽然不多但基本足够。没有历史包袱,以前曾经多次部署,也有改造的经验,Python开发。二号种子。

redmine:开起来挺不错的工具,功能比较贴心。有一些自定义的功能,很有潜力。RoR开发,显然是新同学。三号种子。

apis改造:持外卡参赛,最熟悉,功能也还行,唯独缺少wiki。非种子选手。

首先淘汰掉的是apis。在项目管理工具中,wiki的功能还是很重要的,可偏偏wiki的实现比较麻烦,虽然有现有的wiki引擎,可是想到要驱动hibernate,改造数据库的事情就头大。界面其实也不是很好看,呵呵。

第二个毙掉了trac。无奈功能不够丰富,界面也不够好看。

剩下project.net和redmine PK。虽然project.net使用Java开发我最熟悉,但正因为我最熟悉,所以知道Java做的网站修改起来不是一般的费事,相对于php,python,ruby这些脚本语言自然不用说,连和ASP.NET相比,也占不到什么便宜。要找到一个功能的逻辑所在基本上都要花掉好几分钟在配置文件、页面文件和Java代码里刨。在看project.net的介绍时发现其致命伤:数据库仅支持Oracle。直接退出了PK。

先上几张redmine的截图:

问题列表,加了subtask插件

编辑问题:

论坛系统 .png

日历功能:

test.png

代码评审插件

论坛系统 - - xforum4j-xforum4j.ipr - Diff - 实训系统.png

下面简单介绍下Windows下redmine的安装步骤(一台服务器,一台本机开发)。另外我安装的时候是按照这篇文章的指导,译言上的,居然原文还是日文。

首先安装ruby/gem/rails。Windows下首选InstantRails,无需配置直接上手,缺点就是一些gem的版本比较低,比如rails似乎只有2.1.1,而代码库中的redmine(0.9.x)要求2.2.2以上的rails。不过最新稳定版的redmine-0.8.4可以直接用。

把下载的redmine解压到InstantRails的rails_apps目录。在config目录下新建一个database.yml文件,内容如下:

production:
   adapter: mysql
   database: redmine
   host: localhost
   username: redmine
   password: redmine
   encoding: utf8

如果是0.9.x的版本,需要在config/environment.rb里添加ession_key_secret:

config.action_controller.session = { :session_key => "_myapp_session", :secret => "some secret phrase of at least 30 characters" }

接下来添加MySQL的数据库的内容。InstantRails可以从I -> Configure -> Database (via phpMyAdmin)。打开SQL窗口,输入如下语句:

create database redmine character set utf8;
grant all privileges on redmine.* to redmine@localhost identified by 'redmine';

建立数据库之后是导入初始数据,使用I -> Rails Applications -> Open Ruby Console打开设置了环境变量的命令行窗口:

>cd redmine
>rake db:migrate RAILS_ENV="production"
>rake load_default_data RAILS_ENV="production"

第二个rake任务会要求选择一个默认语言。之后就可以启动Rails了。InstantRails默认启动Mongrel服务器。

>ruby script\server -e production

这时候就可以使用浏览器访问http://localhost:3000/,默认帐号建有admin:admin

另外,Windows下除了使用命令行启动Rails服务之外,还可以参考robbin的这篇文章使用Apache+mod_proxy+Mongrel部署Rails服务。

===================Linux和Windows的分割线====================================

Linux下,对于ruby/gem/rails,编译安装/apt-get/yum自便,国内用户看哪个速度快就用哪个。由于Linux主要作为服务器使用,不太可能采用Windows下命令行启动服务器的方式来跑服务,因此需要把ruby服务挂到某个Web服务器上,比如Apache和Lighttpd。下面仅介绍使用mod_rails(Phusion Passenger)来使用Apache跑Rails的配置。

mod_rails的安装文档在这里,并不复杂。只需要:

gem install passenger
passenger-install-apache2-module

后一步会告诉你把Apache的几行配置代码给拷贝到Apache的配置文件里,形如:

LoadModule passenger_module ...
PassengerRoot ...
PassengerRuby ...

Apache的配置文档在这里,部署RoR程序的部分在这里。部署是通过虚拟主机的方式来弄。具体就不多说了,用Linux部署的同学看看文档就会了。

评论:看到这篇文章末尾的提及的感想,不得不说说redmine强大的插件系统。感想里说到的事件跟踪管理和图表的不足,都有插件来解决这个问题,这些插件也有可能在以后被纳入主程序的功能中。而code_review这个插件非常适合实训系统中教师浏览学生的作业代码的工作。从这几天对RoR的接触来看,不得不承认Ruby开发Web系统的确是如鱼得水,相同水平的Ruby和Java程序员之间的生产率差几倍并不奇怪。以插件经常要用到的AOP而言,Rails的alias_method_chain的扩展使用起来非常优雅;使用Ruby的mixin特性来扩展原来的功能也是恰到好处。

p.s. 今天忽然想到,以后找工作会不会直接整个python或者ruby的活?虽然现在这两门语言的经验还很不足,但兴趣浓厚。