爱国

爱国主义,今天看到三表哥博客里说的爱国主义,觉得很理性.三表哥就是这么有逻辑,这也是那么多黑猩猩喜欢他
无意说那些红桃china的朋友们,就好像我没有tag并不一定不爱国,有tag的未必就知道什么是爱国.前天我感叹msn上“闪闪红心”,扔了一句:理性一点.结果同事说:何必总是那么理性.哎..是啊,莫非是我老了跟不上时代,变得保守没激情不好玩?
刚看到合肥的学生跑到家乐福门口示威,我的妈呀…有个小姑娘居然还声泪俱下…
看来这爱国主义教育太失败了

真的要理性一点,家乐福里99.99%的东西都是中国产的,如果要抵制就干脆把所有法国人投资的公司都赶出中国 – 不现实吧。瞎搞只能被人利用。
Powered by MoFire

头脑风暴和心智图结合

又是一个关于头脑风暴和心智图的idea,发现自己很喜欢这两种方法.头脑风暴用于收集,心智图则是用来将思考结果梳理.既然两者有一定的相关性,为什么不能有一个将二者结合起来的工具呢?

场景:头脑风暴时将条目加入,然后可以直接在这些条目中组合心智图.比如我在纸上写出所有的”风暴”结果,然后在用freemind来输入,整理这些结果.现在就是想把两者结合.

有一个比较不被注意的地方,即在头脑风暴时两个条目产生的时间间隔也是有一定意义的.当多人场景时这个时间间隔表现的时互相存在激发(被激发)关系的条目,也可能是完全不相关的新的”风眼”(通常我把心智图中有子节点的节点叫做”风眼”).将这个时间间隔的信息纳入系统,有可能得到一些更有用的”元信息”.可以用来研究思维方式和思考模式.

家,而非匠

这是昨天在程序员上看到的一句话. 这句话又一次提醒我, 自己还在”匠”的老路上.
熟练使用工具有丰富的工具经验并不是”家”,最多是个工匠,千万不要想当然的以为自己已经是武林高手了.这也是我一直以来的问题,学习东西不够系统性,浅尝辄止.表面看起来知道的很多,其实虚有其表 , 有意思的是,一直以来我都很鄙视这样的人,没想到自己就是.(这里有让我想起另一个话题,人与人之间是因为太相似而互相厌恶呢?还是太不同而互相厌恶呢? -显然相不相似不是厌恶的充要条件,但应该也是必要条件之一,影响有多大?)

这个问题从上初中的时候就有了,老爸那时候经常说我做事缺乏系统性,太随意, 一直到大学毕业都经常提醒我. 但我却一直都不去改进.
想来随意性的学习和做事确实浪费了自己很多时间,本来这些时间可以做更多其它的事.

空间重新启用

在meyu上买了一块空间,目前速度还不错.推荐一下.昨天晚上一晚上终于把域名,数据库,wordpress的设置全搞定. 记录一下
1.首先上传并安装wordpress(meyu似乎不支持ssh,所以只能ftp所有的文件)
2.在meyu的管理页面设置好域名转向(添加A记录)
3.在域名注册商的网站上添加相应的A记录
4.在wordpress上设置Blog URL和wordpress URL为: zhangv.com和zhangv.com/wordpress
5.在meyu的管理页面添加wordpress的数据库
6.把之前备份的wordpress数据导入

[源码研究]jbpm中的异步Action

在jbpm中,如果action可以配置为异步执行

<action class=”ActionClassName” async=”true”></action>

如果是异步action,那么在flow执行到action所依附的节点时,会保存一个job,然后交由单独的job执行线程处理.源代

码:
GraphElement.java的executeActions方法:

if (action.isAsync()) {
ExecuteActionJob job = createAsyncActionExecutionJob(executionContext.getToken(), action);
MessageService messageService = (MessageService) Services.getCurrentService

(Services.SERVICENAME_MESSAGE);
messageService.send(job);
} else {
executeAction(action, executionContext);
}

这个job保存到数据库,并由JobExecutor去执行.

而jobExecutor在默认情况下是不会被启用的,需要手动启用或者配置为自动启动的servlet(JobExecutorServlet).
手动启动通过这个方法:

JbpmConfiguration.startJobExecutor()

还需要做的工作,在jbpm.cfg.xml里定义一个jobExecutor

<bean name=”jbpm.job.executor” class=”org.jbpm.job.executor.JobExecutor” singleton=”true” />

如果不用JbpmConfiguration应该也可以启动.做的事都是一样的,创建一个新的JobExecutor然后启动线程.只是猜测,没试过.

在3.1的数据库里是没有job的表的,升级到3.2.2后才有这个表.

关于身份认证代理的idea

昨天注册了一个网站,一定要提供一些很关键的身份资料比如身份证号码,电话号码,住址等等。每当填写这些敏感信息时候就觉得很虚,在经过上网查证后 好像没有什么“罪证”后还是很底虚的注册了。谁让现在的骗子这么多,还是多小心为好。至少也要想些“后招”以免不测。现在想起来还很虚,就算这个网站是正 规网站,万一以后数据被crack或者倒闭了没有妥善保护好,那就…..,估计现在已经被很多居心不良的人瞅上了。 ->发现自己的“心理很阴暗”,还好现在还不是什么坏人。

说这么多废话,今天就想到一个idea – 身份认证代理,也算不上是idea,因为有类似的机制。比如这些敏感信息,我放到一个专门做安全信息保管的机构(或者分放几个不同的机构),有一个统一的号码。那么当我填写这些个人敏感信息的时候就可以只提供这个号码。

这个信息保管机构要做的事:
1.验证提取信息的机构的有效性和合法性
2.在信息被误用时给个人提供法律咨询,甚至法律援助

其实这个和verisign的密钥机制差不多,只不过针对个人敏感信息。-我先告诉验证机构我是谁(私钥),然后验证机构验证我的信息,验证成功后给我一个号码(公钥),这个号码我可以提供给任何向我索要敏感信息的网站或者机构。

虽然目前的必要性不是很明显,但是等到越来越多的敏感信息放到脆弱的互联网时,就会变得很必要了。当然如果这个保管机构被crack掉也很危险但至少可以统一管理。我现在就比较担心那几个放了敏感信息的网站

路漫漫

这个星期一返香港时候又栽了.国航的飞机在起飞滑行时候,突然说刹车有问题,要返回修理.结果一等就从6点半等到10点半都没回音.只能改成第二天南航的飞机.下午就跑到浦东,晚上又跑回家.我咋这么倒霉呢.

第二天,下午很早就跑到机场,结果又因为天气不好延误,从5点一直等到7点半才起飞.晚上11点才到沙田.

上一次飞机延误是因为什么军演,所有南方所有飞机都管制,结果害的我在机场足足等了1白天,后来也是转第二天的飞机,还差点也没飞.

说到航空公司,前几天东航还因为”飞行员罢飞”闹出风波,在加上公关不利,搞得很臭.在国内似乎没有几个大的企业懂得怎么处理公共关系,包括所谓外企.一出公关危机通常就是三步走:抵赖,借口,道歉.唉,谁让中国人这么多呢,人多权利就分散了,怎么搞得过这些公司.

前天又有一个香港的低价航空公司Oasis宣布清盘,也搞得不怎么样.

Workflow建模和传统建模的区别

Workflow建模和传统建模的区别

其实无论是什么样的系统都可以看作是数据的处理,系统的功能在于如何收集数据,修改数据,显示数据,改变数据状态.在没有使用workflow引擎做系统建模时,最常见的做法是数据有n种状态,在进行数据处理是根据这n种状态的组合来决定当前数据状态,和改变数据状态如果数据状态很复杂时,这个数据状态矩阵会变的很复杂很抽象.不利于管理.
而workflow得侧重点在于流程建模,也就是数据都是有他的生命周期的,这个生命周期就是flow.将数据的状态抽离于数据本身,独立为flow.
举个例子:假设有一个很简单的面试流程,一共三轮.
传统的做法是在candidate表上加三个状态来表示某个candidate的面试进程,比如

---------------------------------------------
|name|age|1st round|2nd round   | 3rd round |
---------------------------------------------
|andy|21 |   Fail  |            |           |
|bill|27 |   Pass  |In progress |           |
|troy|33 |   Pass  | Pass       |In progress|
|will|18 |   Pass  | Pass       |   Pass    |
---------------------------------------------

对应每一轮面试都有3个状态:通过,未通过和进行中.如果比较简单的话还好,但如果有很多种阶段,而每个阶段又有多种状态,同时存在阶段之间的转化,最终这张表将变得异常复杂而很难维护.(不是骇人听闻,我们现在的项目就有一个异常复杂的活动图,都是不同状态之间的转换,一个屏幕都放不下.其实抽象出来就是矢量变换 – 如果有4种状态栏位,每种栏位有3个状态, 那么就是一堆这样的矢量(0,0,1,2),共有3*3*3*3=81个,而数据的状态就是这81个矢量的某几个的组合,而又存在不确定的初始状态时就更麻烦啦啦啦啊啊)如果用workflow来建模,这三个阶段将从数据建模中抽离出来到流程.是这样一些东西:

Flow:

start -> 1st round -> 2nd round -> 3rd round ->end4
↓             ↓            ↓
end1          end2         end3

Candidate表:

----------
|name|age|
----------
|andy|21 |
|bill|27 |
|troy|33 |
|will|18 |
----------

Flow表:

-------------------------
|candidate |   phase    |
-------------------------
|bill      |  2nd round |
|troy      |  3nd round |
-------------------------

因为andy在第一轮就fail掉了,所以流程已经结束,而will因为已经通过了所有的面试他的流程也已经结束.Flow表中之保存进行中的流程.

不知道解释的是否清楚,总之我所理解的流程建模的优势就是在于把数据的生命周期独立为流程管理,通过流程再造来增强系统的扩展性.

手机Calendar同步

有没有这样的服务,我可以下载节假日数据到手机.比如让手机的canlendar和googlecalendar同步.我现在就比较希望有这样的东西,因为每次查香港的节假日都需要google一下.这时候能不能让我的小6大显身手呢?

其实就是下载并导入一些calendar entry到手机里.比如可以选择香港的08年节假日,意大利的节假日…关键是数据和格式化…

使用springmodules启动子流程的问题

今天在整合jbpm时遇到这样一个错误can‘t create process instance when processdefinition is null
因为使用了subprocess,跟进源代码看了一下:(我用的是springmodules整合jbpm和spring)

发现子流程实例无法创建,因为没有context(JbpmContext).问题最终归结在怎样启动流程实例.原来的做法是:

ProcessDefinition pd = jbpmTemplate.getProcessDefinition();
ProcessInstance pi = new ProcessInstance(pd,variables);
pi.getRootToken().signal();

这样启动,如果没有子流程是没问题的.但是如果有了子流程,ProcessState(子流程state)会通过当前JbpmContext
去启动子流程.而上面这种做法是没有JbpmContext的!正确的做法是:

jbpmTemplate.execute(new JbpmCallback(){
public Object doInJbpm(JbpmContext context) throws JbpmException {
HashMap<String,Object> variables = new HashMap<String, Object>();
ProcessInstance pi = new ProcessInstance(jbpmTemplate.getProcessDefinition()
,variables);
pi.getRootToken().signal();
return null;
}
});

这种做法会初始化一个新的context然后启动流程.问题解决.但要注意设置subprocess的属性binding=”late”.如下:

<process-state name=”V3-sub-process” >
<sub-process name=”V3″ binding=”late”></sub-process>
<variable access=”read,write” name=”objType”></variable>
<variable access=”read,write” name=”objId”></variable>
<transition to=”tradeMatch”></transition>
</process-state>

意味着subprocess不是在初始化父流程时就初始化(findSubprocess),而是在processState.execute时候才初始化(这个时候才有context).如果不加binding=”late”,还是会有同样的错误.

另:在网上找解决方法时候发现,这个issue.貌似目前springmodules0.8不支持context外包含子流程的流程实例创建.所以做法应该是没错的.check过了,0.9也没有支持