2007年01月06日


天上掉下个林妹妹
似一朵轻云刚出岫
只道他腹内草莽人轻浮
却原来骨格清奇非俗流
娴静犹如花照水
行动好比风扶柳
眉梢眼角藏秀气
声音笑貌露温柔
眼前分明外来客
心底却似旧时友

 

2006年12月31日

  话说某世界五百强化工企业新换了一批自动香皂包装机以后,经常出现香皂盒子是空的没有香皂的情况,而在装配线一头用人工检查因为效率问题不太可能而且不保险,这不,一个由自动化,机械,机电一体化等专业的博士组成的Solution队伍来解决这个问题,没多久他们在装配线的头上开发了全自动的X光透射检查线,透射检查所有的装配线尽头等待装箱的香皂盒,如果由空的就用机械臂取走。

  不巧,中国一乡镇企业生产香皂也遇到类似问题,老板吩咐线上小工务必想出对策解决之,小工拿了一个电风扇放在装配线的头上,对着最后的成品吹之,空盒子被吹走,问题解决完毕。

[引] http://www.zhangjiang.cn/bbs/2006-6/7/92949713210.html

2006年12月30日

Happy new year:)

新的一年来临了, 放假了. 我想利用这点时间, 平静地给我的2006年做个总结.

我的2006是平凡的一年, 在我的人生之中, 我不想用最最…来评价它:)

心态
    先从心态谈起吧. 那就再讲个故事吧:)
    昨天, 一个14岁的少年, 进入一家酒吧. 在开门的一刹那间, 所有的人都向他看过来. 他显得是那么的战战兢兢, 因为他在想, 别人到底是在如何看待我呢?
    今天, 一个41的男士, 西装革履, 嘴里叨着一支雪茄, 慢悠悠地步入一家酒吧. "Hey, waiter, a glass of 玛格丽特, with a little 龙舌兰, 不要加冰!" 这时, 所有的人都向他看过来, 他并不care. 此刻, 他首先会去评价这些家伙, 从来不会去想别人如何评价他.
    第一年走出校门, 本来是初生牛犊不怕虎, 但生性敏感的男生, 在舞台上会不时的心慌. 但还好, 感谢生活, 我现在已不是那样啦:)

目标
    带着一些孤独和一段精美的回忆,匆匆地走出校园. 走向一个陌生的城市. 周围多了一些优秀的人,而我的辉煌光环也不再闪光. 一个小男孩,漫无目标地走了好几个月. 还是讲个故事吧:)
    一个学生, 刚入学, 就打算考GRE, 因为他想出国, 去读哈佛的MBA. 别人都在考试前才突击一下, 在花前月下, 活得很潇洒. 他没有, 只是不断的为自己的目标努力. 四年后, 你说谁会出国呢? 只有他吧:) 因为他有目标.
还好, 我现在有了自己的目标, 活得很坦然.

工作
    他是一个很professional的人, 很有passion, 想用自己美丽的舞蹈去带动周围所有的观众. 但是, 他现在的观众都比较强, 所以, 有些人他左右不了. 有些人, 用庸俗的舞蹈来干扰他. 谈跳槽, 谈钱谈房子. 这些他也想要, 所以, 他也心情不好.
    但是, 现在, 他知道该怎么做了. 轻舞飞扬吧. 我是最好的舞者. 我不会去跳槽的,因为,对一个优秀的人来说, 好工作会去找他的, 而不会他去找好工作的. 在他的眼里, 他看工作不是工作,而是看做$,因为,只有看做自己想要的东西,他才会做得更好. 你看他工作时,眼神中闪现出$的光芒, 那种神情, 好像老虎在盯着它的猎物.
    平时, 说的好多是笑话, 真话只有自己说给自己听.

管理
    因为我的目标是想做优秀的程序员, 不喜欢管理. 所以,我一直在排斥它. 但是,经历了一些挫折后,我知道了管理的价值,并愿意接纳它. 感谢公司的training和leader,他们在我身上花了不少的精力. 现实中的人都有一丝惰性, 不愿意去organize一些事. 我是懒得要命的人, 懒得都不会长肉. 但不要让自己的智力懒惰:)
还是讲个故事吧:)
    去年冬天, 一堆人围着火堆取暖. 火在变小, 房外有一些柴火. 只要去取一些柴火, 放在火堆上, 火就会变旺. 这个大家都知道, 可是就是没有一个人愿意去做. 我等不及了, 就去取了, 但下次火变小时, 还是没有人动身, 我又去了. 再下一次, 火又小了, 我不去了, 因为, 我想, 为什么每次都是我去.
    今年冬天, 我们又在拷火. 火小了, 我还是那么主动地去了, 但是, 在走之前, 我说:"兄弟们, 火小了. 我们去取点柴火吧, 一会儿, 火就会很旺的! 这次, 我去, 呆会, iver去, 然后, 我们就这样一次次的轮流下去, 依次去取." 你说, 我是不是会去organize一些事情了呢:)
do correct thing is better than do thing correctly.
pls do right, not be right.

2006年感动我的人
1. 亲人
    每一次的电话, 都让我感到很温暖. 我还是感觉自己是个孩子, 永远都要依赖父母. 那时,我会卸下我的舞妆,不用任何演技, 去做最适合自己的角色.  爸妈, 我长大了, 真的长大了. 不用你们操心了:) 我再也不像小时一样, 去盼望自己长大, 去羡慕自己成为精明强干的人了. 因为, 我已到了那个长大的年龄.

2. 2006年的我
    很平凡,很普通的我, 却还能用自己的个性去左右自己健康地发展.

3. 西安tws公司的HR
    一份我很憧憬的工作, 一段对我很美丽的插曲. 在这去插曲中, 折射出你对一个学生的重视, 仅管事与愿违, 但你的执着, 让我很感动.

4. 魔兽比赛讲解中的稻草芭芘
    你的讲解太优美了. 那十场精典的比赛, 给我们诠释了如何是精典. 正如你说的,精典的东西是不会褪色的.

5. 整天陪我聊天的小妹妹
    也许, 以前只是同学. 但一次玩笑, 却让我很感动. 我觉得我多了一个小妹妹.

还有好多的朋友们, 但都是老朋友了, 就不用写了。例如当时top646的那6个流氓!

我继续怀抱一颗感恩的心, 去勇敢地追逐我想要的梦. 我没有绝顶聪明的大脑, 也不比你优秀, 但我会比你们更爱生活:)

在张韶含那颇有张力的隐形翅膀歌中, 总结一年中的经历, 好高兴:) 我没有隐形的翅膀, 因为, 我的翅膀, 现在就在阳光下, 好长好美!

2006年12月17日

    知道重构代码的程序员太多了, 会重构项目中其它元素的人, 还是太少. 为何你看起来那么悠闲, 主要原因是, 我还会重构流程(还有其它东西, 有这个思想就行:)).

    工程中的东西, 就要用工程学的思想去解决. 当一些东西做起来复杂时, 就要想想如何去重构流程. 让一些规律性的东西变得可管理,可控制,可重复的流程!

2006年12月10日

   当完成一件事时, 不要仅是个provider, 还要有validater. For each tasks that I have done must have a proof.  Keep this in my mind always. (其实TDD的一个主要思想就是这个. 道理是相通的.)

2006年12月05日

  今天没上班, 早上正好碰到H在线, 聊着聊着就中午.

  这期的程序员上有老刘的采访.  勇士要搏最大的浪. 现在倒也无事可做, 就只好和他一起搏浪去吧.

  唉, CSDN太挤, JavaEye太嚣闹, 而这儿就更夸张了,  两片广告肆无忌惮地在我的blog上空盘旋.  改天另寻个地方, 听说Opera的很不错, 抽空移过去.

2006年11月30日

  在会议上, R说我们现在还是不会与客户很好的交流, 主要原因是不会去想问题.
 是的, 好多时候, 摆脱不了我是一个技术人员的层次. 技术强的人, 就可能会有一种毛病: 遇到问题, 常想如何实现, 如何解决. 而不去想为什么.
 当时, 想起了一个电视剧’大长今’, 想到了长今打水给韩尚宫的情景.
 小长今被分到韩尚宫手下学做菜. 但韩尚宫因失去到好的朋友, 而一直心扉封闭, 无心收徒. 开始, 她整天要长今去打水. 打完水, 就让她倒掉再打. 别的伙伴都在别的尚宫手下, 学了好多技巧. 小长今却半点也没有学到. 可是, 优秀的长今并没有和一般的孩子一样, 而是通过打水, 表现了自己与一般人的不同, 并打开了韩的心扉. 
 一天, 小长今又按吩咐去打水, 并送到韩尚宫的房内.  韩尚宫身体不好, 要长今换一盆XX水(detail的不记得了:)). 长今问, 你不舒服吗? 因为, 从韩尚宫要的XX水中, 分析出了韩尚宫的病情.  ….

  huh, ask why first is better than just do it.

2006年11月26日

Linux Script Variables

1. When variables are used they are referred to with the $ symbol in front of them.

2. several useful variables available in the shell program:
    $$ = The PID number of the process executing the shell.
    $? = Exit status variable.
    $0 = The name of the command you used to call a program.
    $1 = The first argument on the command line.
    $2 = The second argument on the command line.
    $n = The nth argument on the command line.
    $* = All the arguments on the command line.
    $# The number of command line arguments.
    
3. The "shift" command can be used to shift command line arguments to the left, ie $1 becomes the value of $2, $3 shifts into $2, etc. The command, "shift 2" will shift 2 places meaning the new value of $1 will be the old value of $3 and so forth

4. Variable assignment
Its syntax is:
    $variable-name = variable-value

Linux Script Test Conditions


1. Its syntax is:
    test expression
It can also be implied as follows:
    [ expression ]

2. The tests below are test conditions provided by the shell:
    -b file = True if the file exists and is block special file.
    -c file = True if the file exists and is character special file.
    -d file = True if the file exists and is a directory.
    -e file = True if the file exists.
    -f file = True if the file exists and is a regular file
    -g file = True if the file exists and the set-group-id bit is set.
    -k file = True if the files’ "sticky" bit is set.
    -L file = True if the file exists and is a symbolic link.
    -p file = True if the file exists and is a named pipe.
    -r file = True if the file exists and is readable.
    -s file = True if the file exists and its size is greater than zero.
    -s file = True if the file exists and is a socket.
    -t fd = True if the file descriptor is opened on a terminal.
    -u file = True if the file exists and its set-user-id bit is set.
    -w file = True if the file exists and is writable.
    -x file = True if the file exists and is executable.
    -O file = True if the file exists and is owned by the effective user id.
    -G file = True if the file exists and is owned by the effective group id.
    file1 –nt file2 = True if file1 is newer, by modification date, than file2.
    file1 ot file2 = True if file1 is older than file2.
    file1 ef file2 = True if file1 and file2 have the same device and inode numbers.
    -z string = True if the length of the string is 0.
    -n string = True if the length of the string is non-zero.
    string1 = string2 = True if the strings are equal.
    string1 != string2 = True if the strings are not equal.
    !expr = True if the expr evaluates to false.
    expr1 –a expr2 = True if both expr1 and expr2 are true.
    expr1 –o expr2 = True is either expr1 or expr2 is true.
    
3. The syntax is :
    arg1 OP arg2
where OP is one of –eq, -ne, -lt, -le, -gt, or –ge. Arg1 and arg2 may be positive or negative integers or the special expression "-l string" which evaluates to the length of string.

4. Control and Iteration
a. if – Used to execute one or more statements on a condition.
An example:
1.  if [ ! -d /mnt ]        # be sure the directory /mnt exists
2.  then
3.        mkdir /mnt
4.  fi


b. case – Used to execute specific commands based on the value of a variable.
An example:
1.  case $NUM
2.  1)
3.     echo The number is 1
4.     ;;
5.  2)
6.     echo The number is 2
7.     ;;
8.  *)
9.     echo The number is not 1 or 2
10.     ;;
11.  esac


c. for – Used to loop for all cases of a condition. In the example below, it is used to copy all files found in /mnt/floppy to the /etc directory. The lines were numbered for reference with descriptions:
1.  for i in /mnt/floppy/*; do
2.     if [ -f $i ]; then
3.     # if the file is there
4.        filename=${i#/mnt/floppy/}
5.        echo copying $i to /etc/$filename
6.        cp -p $i /etc/$filename
7.     fi
8.  done


until – Cycles through a loop until some condition is met.
The syntax for the command is shown below:
1.  until [ expression ]
2.  do
3.     statements
4.  done


while – Cycles through a loop while some condition is met. The below example will cycle through a loop forever:
1.  while [ 1 ]
2.  do
3.     statement(s)
4.  done


Commonly used Programs in Linux Script files


1. Some programs supporting script programming:
date
expr
find
cd
ls
pwd
mkdir
rmdir
cat
cp
csplit
ln
mv
rm
split
awk
cut
diff
grep
head
line
sed
tail
uniq
touch
wc
join
paste
sort
tr
pr

Shell Capabilities


1.Redirection
    < Open as stdin
    > Open as stdout
    >> Append to the file
    | Pipe stdout into stdin

2. Builtin functions
Some Bash builtin functions used in script programs:
    alias

An example looping script


The file below is an example file which demonstrates some of the testing as talked above along with several looping and control statements.

#! /bin/bash    
# Use the bash shell to run the script
# This is an example file to take entries from the user
# entries Version 1.0 May 22, 2000
DONE=no
ENTRIES="hello bye ls 1"
while [ $DONE = no ]
do
   echo Valid entries are: $ENTRIES
   read ENTRY             # Read the variable ENTRY from the user
   case $ENTRY in
   1)
       pwd
       ;;
   hello)
       echo How are you?
       ;;
   bye)
       echo exiting…
       DONE=yes
       ;;
   ls)
       ls -al |more
       ;;
   *)
       echo $ENTRY is an unrecognized command.
       ;;
   esac
done

More Details, pls refer to the following resources:

1. Linux Script Programming
2. Linux Shell简介
3. Linux Shell 脚本入门

The followings are my recent work experience:

Do correct things is better than do things correctly.

A good software developer should have 2 hats in turn, the one is coding, the other is testing. (Note: I have heard the following story: one day, a team leader said to the team members: "In order to improve the system quality, I will take the following rule. later, I will give the baseline and at each month I will count how many bugs you have made in your codes for everyone. If the bugs above the baseline, I will decrease your salary, while under the baseline, raise your salary." Several month went, and team leader did’t add and decrease salary for anyone. Eventually a developer asked leader why he didn’t take effect the above rule. Team leader told that I have done what I had said. Ha-ha, YES! If a develop builds-in the testing, he will raised his salary in the future. It’s an understood thing.)

Communication is the most important thing!  If your pure technic is better than others, I think it’s the time to take care more about communication.

Many enterprise-systems have been developed, so I think now we should spend much more time on the communication between enterprise-systems, but not create the same wheel.
Many new ideas was born everyday. I think only learn these ideas is not enough, still know the things behind these ideas. I want to know why, then can go further.

Many opportunities are in this company. Everyday I was pushed to challenge something new, so I cannot take my time. The strict disciplines bring out some right-hand men. No pains, no gains. Correctly, but  to must make sure I am doing the correct things is the precondition.  

No Augmentum persons but just only professional persons.

Make more mistakes is not the bad things at my youth.  

In leader’s eye, who can do it is more important than what you can do.

带人要带心.

2006年03月12日

  在过去三年中,企业面临着信息、流程的整合问题,"企业门户"和"企业应用集成"一时间成了IT业内热门的课题。国内外IT厂商和开源组织顺时而动,开发了各种企业门户服务器。这些Portal服务器各自提供不同的Java API给应用系统开发商开发Portlet,应用系统开发人员不得不为不同的Portal服务器使用互不通用的API开发功能相同的Portlet。人们翘首以待,希望有一天能象编写Java Servlet那样,使用一种API编写能运行在大多数Portal服务器上的Portlet应用。

  经过近两年时间的漫长等待,2003年10月7日,Java Community Process(JCP)发布了JSR168: Portlet Specification 1.0的最终版本。

· 什么是Portal?
Portal是基于WEB的应用程序, 它将不同资源进行整合并展现给用户
通常其有如下三个特点:

a. Personalization (个性化)
b. Single sign on (单点登陆)
c. Content aggregation (内容聚合)

其中Content aggregation指的是将不同来源的信息整合到一个页面中用来让用户更方便的进行使用.
比如, 如果某客户需要进行一次商业采购,以往需要访问不同的供应商的主页得到相关信息, 但如果使用Portal将所有不同的货物供应商的商品catalog页面都整合到一个Catalog Portal页面中, 那么所有的商品信息都可以更快的进行浏览,筛选和定货, 加快了客户的商业运作效率.

· 什么是Portlet?
Portlet是一种基于WEB组件的JAVA技术, 由Portlet Container进行管理. 处理请求并动态返回页面, 可以做为Portal 的可拔插的用户界面组件.

· 什么是Portlet Container? Portlet Container用来管理Portlet的生命周期并且提供其运行所需要的必要环境. 并且为Portlet Preferences提供持久性(Persistent)存取服务.但是其不支持内容的Aggregation. Aggregation由Portal组件提供.

注: Portlet Preferences是Portlet的一个新特性,提供类似数据库的功能.但是不是用来取代数据库. 只是用来存取简单的Portlet参数配置.

· 什么是WSRP?
WSRP 是 OASIS Web Service for Remote Portlets的缩写. WSRP主要用来简化Portal对于各种资源或者程序的整合的复杂性, 可以避免编程带来的整合的复杂性. 并且Portal的管理员可以从大量的服务中选择需要的用以整和到Portal中.

· Portlet and Servlet

摘自(Portlet Specs v1.0)

相同点:
Portlets are Java technology based web components
Portlets are managed by a specialized container
Portlets generate dynamic content
Portlets lifecycle is managed by a container
Portlets interact with web client via a request/response paradigm

不同点:
Portlets only generate markup fragments, not complete documents. The Portal aggregates portlet markup fragments into a complete portal page
Portlets are not directly bound to a URL Web clients interact with portlets through a portal system
Portlets have a more refined request handling, action requests and render requests
Portlets have predefined portlet modes and window states that indicate the function the portlet is performing and the amount of real state in the portal page
Portlets can exist many times in a portal page

Portlet特有:
Portlets have means for accessing and storing persistent configuration and customization data
Portlets have access to user profile information
Portlets have URL rewriting functions for creating hyperlinks within their content, which allow portal server agnostic creation of links and actions in page fragments
Portlets can store transient data in the portlet session in two different scopes: the application-wide scope and the portlet private scope

Servlet特有:
Setting the character set encoding of the response
Setting HTTP headers on the response
The URL of the client request to the portal