随笔-47  评论-14  文章-0  trackbacks-0
  2006年8月15日
  •  

    儿子:谢谢你!昨天过母亲节请我吃饭。还送了我那么贵的u盘。这是我好久以来最开心的一回了!

  • 今天上午我在电脑上看电视剧《盛夏晚晴天》的45集,夏正朗的话我很认可,有道理。说给你看一下:一个男人在30岁之前,能有一次彻底的失败,让他一无所有,那将是一个很幸运的事情。 

  • 因为他能可以从失败中,认识失败,战胜失败,卷土重来。他可以以自己的魅力,锐不可挡的干劲来改变。

  • 在这个世界上,只有想不到的事,没有做不到的事。要敢爱、敢恨、敢错、敢当!希望你幸福、快乐、健康!

  • 我的儿子是一个诚实、善良、靠得住的好孩子。希望你在社会这所深凹的大学里,经得起风吹浪打,经得起考验。有一句话,很有哲理。就是激励自己的不是鲜花和掌声,而是挫折、失败和教训!

  • 我和你爸都是在这个世界里,最爱你的人,我们也在期盼你能照顾我们一辈子。嘿嘿、、、谢谢你,为我们奉献了很多。、

posted @ 2013-06-07 22:06 Stephen 阅读(164) | 评论 (0)编辑 收藏
 

       海尔总裁张瑞敏在序言中写到:“看德鲁克的书是一种享受,因为常常使人有茅塞顿开之感。” 的确,德鲁克的书没有任何故弄玄虚,都是实实在在的道理,尤其是这本经典中的经典,每次读过以后都有不同的感受。

       管理是一门学问,如何让管理变得卓有成效的确是一个很大的问题。很多人从做具体的事情开始走向管理岗位的时候,都会觉得有点无所适从:有些人开始抱怨时间变得不可控,尤其是可能没有机会做一些曾经让自己很有“成就感”的工作;有些人不知道如何与下属和上级打交道,不知道怎样让团队变得有效率;有些人不知道如何做决策,每次做决策不是瞻前顾后,就是武断决策。《卓有成效的管理者》这本书,恰恰给了这些人最好的答案,最佳的实践经验,这本薄薄的书,没有大费周折的阐述什么讲大道理,没有长篇累牍的讲故事,只是把这种好像很明显但又往往让我们经常想不到的道理娓娓道来。其实卓有成效的管理很简单:管理好自己的时间、学会用人和让团队有成效、做好决策。

       一、管理好自己的时间

       作为一个卓有成效的管理者要会掌握自己的时间,要合理的利用自己的时间,时间用在能产生效益的事情上。管理者必须面对四个无法避免的难题:时间往往只属于别人,而不属于自己;管理者往往被迫忙于“日常运作”,除非他们敢于采取行动来改变周围的一切;本身处于一个组织中,受组织的局限。要成为有效管理者,首先,必须知道自己的时间用在什么地方上;其次,要学会将时间整块运用;再次,管理好自己的时间,消除浪费时间的活动,统一安排可以自由支配的时间。

       二、学会用人和让团队有效率

       管理者的作用不仅是自己如何可以高效率的工作,而更重要的是如何让团队有效的工作,因为一个人再优秀也只是一个人,而一个优秀的团队的作用更是远远大于把这些人的单产累加起来,这就是为什么很多人说1+1>2的道理。从德鲁克的书中,我们明白了,让团队有效率其实很简单,就是正确的用人并发挥他们长处,然后学会自己可为团队做些什么。

       汉高祖刘邦说:“夫运筹帷帐之中,决胜千里之外,吾不如子房(即张良)。镇国家,抚百姓,给馈饷,不绝粮道,吾不如萧何。连百万之军,战必胜,攻必取,吾不如韩信。此三者,皆人杰也,吾能用之,此吾所以取天下也。”有效的管理者在用人时,不在于如何克服人的短处,而在于如何发挥人的长处。

       同时,作为一个有成效的管理者要知道自己能做些什么贡献,并且要知道能为下属做些什么贡献,才能让这些知识工作者有效的工作。重视贡献,才能使管理者的注意力不为自己的专长所限,不为其本身的技术所限,不为其本身所在的部门所限,才能看到整体的绩效,同时,也能使其更加重视团队,只有团队才是真正产生成果的地方。

       三、做好决策

       决策是非常具有风险的举动,但是如何一个管理人都需要做出各种决策,你的决策可能会影响到公司的利益和伙伴的利益、绩效及成果,这就是管理者存在的最重要的一项功能。

       卓有成效的管理者必须善于做出正确的决策,要做出决策就要有明确目标、权衡现有资源、反复推敲,反复的斟酌、落实行动、实时反馈,衡量你的决策是否正确,给你的决策留更多的调整空间和机会。

       在做决策之前要善于听取各方意见,善于使用发散性思维和收敛性思维来搜集听取各方信息;要进行大量的风险评估如果收益大于支出那么就立即执行;一旦执行就要顶住压力,处理好时间问题、处理好人际问题;重视反馈学会听取各方意见挤反馈的信息,信息中有好有坏要通盘分析,验证决策的正确性。

posted @ 2010-04-18 21:42 Stephen 阅读(295) | 评论 (0)编辑 收藏
最近同事推荐office 2007比较好用,于是装了一个,
但是在用outlook时比较麻烦,我其中的一个邮箱没办法收pop3的邮件,总提示密码错误,要求输入密码,
但是我用2003的时候是可以的,
于是我在尝试各种组合,发现outlook 2003 、foxmail,都可以从这个pop3收到邮件,
但是outlook 2007就是不可以,
于是尝试用office 2007+outlook2003来用,
结果出现的新的问题,outlook不能使用word作为邮件编辑器了,

经过尝试:
1、office 2003 与office 2007 不能在同系统共存;
2、outlook 2003 与 outlook 2007 也是同样;
3、office 2007 与 outlook 2003可以共存,但是问题是outlook2003只能使用word2003作为编辑器,而不能使用2007的;

麻烦呢,目前我暂时用的第三种方案,
关于不能收邮件的原因,目前估计是端口的问题,因为公司的网络环境比较严格,需要申请开通端口,
估计是2007验证时使用了什么不知道的端口,等有时间再网络工程师调试一下。
posted @ 2009-04-13 22:54 Stephen 阅读(801) | 评论 (0)编辑 收藏
最近总感觉事情太多,要做的事情很多,要学习的东西很多,要看的书很多,

然后准备好了以后,又没毅力做下去了,

还是执行力不够,

目标太多,就没有了方向,

要减少目标:

1、职业发展方向要确定,不能每个方面都兼顾,可以关注,但要确定一个主要的方向;
2、不能每本书都精读,没有那么多时间,计划的十本书,选两本到三本精读;
3、计划时间不能定的太长,没有约束力,要短、可达到。

工作上目标确定要少,上半年只有两个月了,如果想看到成效,必须精力集中关键项上面:

1、完成配置管理与问题管理的优化;
2、平稳接手项目组的工作,融入到项目环境中;
3、初步了解项目的业务、背景;
posted @ 2009-04-13 22:39 Stephen 阅读(195) | 评论 (0)编辑 收藏
一、学习英语

二、读十本书,完成读书笔记
图书目录:
《走出软件作坊》
《Scrum敏捷项目管理》
《IT管理知识体系》
《Head First 设计模式》
《UML宝典》
《人件》
《哲学与人生》
《web信息架构》
两本待定

三、读两个开源框架代码

四、写十篇文章(项目管理、IT管理方面)
posted @ 2009-02-15 21:29 Stephen 阅读(205) | 评论 (0)编辑 收藏
安装RAR:
sudo apt-get install rar
sudo ln -fs /usr/bin/rar /usr/bin/unrar
posted @ 2009-01-23 23:35 Stephen 阅读(179) | 评论 (0)编辑 收藏

进入vi的命令

vi filename: 打开或新建文件,并将光标置于第一行首

vi +n filename: 打开文件,并将光标置于第n行首

vi + filename: 打开文件,并将光标置于最后一行首

vi +/pattern filename: 打开文件,并将光标置于第一个与pattern匹配的串处

vi -r filename: 在上次正用vi编辑时发生系统崩溃,恢复filename

vi filename....filename: 打开多个文件,依次进行编辑

移动光标类命令

h: 光标左移一个字符

l: 光标右移一个字符

space: 光标右移一个字符

Backspace: 光标左移一个字符

k或Ctrl+p: 光标上移一行

j或Ctrl+n: 光标下移一行

Enter: 光标下移一行

w或W : 光标右移一个字至字首

b或B : 光标左移一个字至字首

e或E : 光标右移一个字至字尾

): 光标移至句尾

(: 光标移至句首

}: 光标移至段落开头

{: 光标移至段落结尾

nG: 光标移至第n行首

n+: 光标下移n行

n-: 光标上移n行

n$: 光标移至第n行尾

H: 光标移至屏幕顶行

M: 光标移至屏幕中间行

L: 光标移至屏幕最后行

0: 光标移至当前行首

$: 光标移至当前行尾

屏幕翻滚类命令

Ctrl+u: 向文件首翻半屏

Ctrl+d: 向文件尾翻半屏

Ctrl+f: 向文件尾翻一屏

Ctrl+b: 向文件首翻一屏

nz: 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

插入文本类命令

i: 在光标前

I: 在当前行首

a: 光标后

A: 在当前行尾

o: 在当前行之下新开一行

O: 在当前行之上新开一行

r: 替换当前字符

R: 替换当前字符及其后的字符,直至按ESC键

s: 从当前光标位置处开始,以输入的文本替代指定数目的字符

S: 删除指定数目的行,并以所输入文本代替之

ncw或nCW: 修改指定数目的字

nCC: 修改指定数目的行

删除命令

ndw或ndW: 删除光标处开始及其后的n-1个字

do: 删至行首

d$: 删至行尾

ndd: 删除当前行及其后n-1行

x或X: 删除一个字符,x删除光标后的,而X删除光标前的

Ctrl+u: 删除输入方式下所输入的文本

搜索及替换命令

/pattern: 从光标开始处向文件尾搜索pattern
?pattern: 从光标开始处向文件首搜索pattern
n: 在同一方向重复上一次搜索命令
N: 在反方向上重复上一次搜索命令
:s/p1/p2/g: 将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g: 将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g: 将文件中所有p1均用p2替换

选项设置

all: 列出所有选项设置情况

term: 设置终端类型

ignorance: 在搜索中忽略大小写

list: 显示制表位(Ctrl+I)和行尾标志($)

number: 显示行号

report: 显示由面向行的命令修改过的数目

terse: 显示简短的警告信息

warn: 在转到别的文件时若没保存当前文件则显示NO write信息

nomagic: 允许在搜索模式中,使用前面不带“\”的特殊字符

nowrapscan: 禁止vi在搜索到达文件两端时,又从另一端开始

mesg: 允许vi显示其他用户用write写到自己终端上的信息

最后行方式命令

:n1,n2 co n3: 将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d: 将 n1行到n2行之间的内容删除
:w: 保存当前文件
:e filename: 打开文件filename进行编辑
:x: 保存当前文件并退出
:q: 退出vi
:q!: 不保存文件并退出vi
:!command: 执行shell命令command
:n1,n2 w!command: 将文件中n1行至n2行的内容作为command的输入并执行之,
若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command: 将命令command的输出结果放到当前行

寄存器操作

"?nyy: 将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字

"?nyw: 将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字

"?nyl: 将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字

"?p: 取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字

ndd: 将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中

posted @ 2009-01-21 21:40 Stephen 阅读(251) | 评论 (0)编辑 收藏

1. 先从网上下载jdk(jdk-1_5_0_02-linux-i586.rpm) ,推荐SUN的官方网站www.sun.com,下载后放在/home目录中,当然其它地方也行。

进入安装目录
#cd /home
#cp jdk-1_5_0_02-linux-i586.rpm /usr/local
#cd /usr/local
给所有用户添加可执行的权限
#chmod +x jdk-1_5_0_02-linux-i586.rpm.bin
#./jdk-1_5_0_02-linux-i586.rpm.bin
此时会生成文件jdk-1_5_0_02-linux-i586.rpm,同样给所有用户添加可执行的权限
#chmod +x jdk-1_5_0_02-linux-i586.rpm
安装程序
#rpm -ivh jdk-1_5_0_02-linux-i586.rpm
出现安装协议等,按接受即可。

2.设置环境变量。
#vi /etc/profile
在最后面加入 
#set java environment
JAVA_HOME=/usr/java/jdk-1_5_0_02
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
保存退出。

要使JDK在所有的用户中使用,可以这样:
vi /etc/profile.d/java.sh
在新的java.sh中输入以下内容: 
#set java environment
JAVA_HOME=/usr/java/jdk-1_5_0_02
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
保存退出,然后给java.sh分配权限:chmod 755 /etc/profile.d/java.sh

3.在终端使用echo命令检查环境变量设置情况。
#echo $JAVA_HOME
#echo $CLASSPATH
#echo $PATH

4.检查JDK是否安装成功。
#java -version
如果看到JVM版本及相关信息,即安装成功!
posted @ 2009-01-21 21:33 Stephen 阅读(586) | 评论 (0)编辑 收藏
tar命令

语法:tar [主选项+辅选项] 文件或者目录
使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。
主选项:
c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。
r 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中。
t 列出档案文件的内容,查看已经备份了哪些文件。
u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。
x 从档案文件中释放文件。
辅助选项:
b 该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,系统预设值为20(20*512 bytes)。
f 使用档案文件或设备,这个选项通常是必选的。
k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。
m 在还原文件时,把所有文件的修改时间设定为现在。
M 创建多卷的档案文件,以便在几个磁盘中存放。
v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。
w 每一步都要求确认。
z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。


Linux下的压缩文件剖析

对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕。别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap。可是Linux就不同了,它有.gz、.tar.gz、tgz、bz2、.Z、.tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了。本文就来对这些常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕:)

在具体总结各类压缩文件之前呢,首先要 弄清两个概念:打包和压缩。打包是指将一大堆文件或目录什么的变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这 两个概念呢?其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你就得先借助另它的工具将这一大堆文件先打 成一个包,然后再就原来的压缩程序进行压缩。
Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法:
tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:
# tar -cf all.tar *.jpg
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
# tar -rf all.tar *.gif
这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
    # tar -uf all.tar logo.gif
这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

# tar -tf all.tar
这条命令是列出all.tar包中所有文件,-t是列出文件的意思
# tar -xf all.tar
这条命令是解出all.tar包中所有文件,-t是解开的意思

以上就是tar的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等。
1) tar调用gzip
gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。下面来举例说明一下:
# tar -czf all.tar.gz *.jpg
这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为all.tar.gz
# tar -xzf all.tar.gz
这条命令是将上面产生的包解开。
2) tar调用bzip2
bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。与bzip2相对的解压程序是bunzip2。tar中使用-j这个参数来调用gzip。下面来举例说明一下:
# tar -cjf all.tar.bz2 *.jpg
这条命令是将所有.jpg的文件打成一个tar包,并且将其用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2
# tar -xjf all.tar.bz2
这条命令是将上面产生的包解开。
    3)tar调用compress

compress也是一个压缩程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与compress相对的解压程序是uncompress。tar中使用-Z这个参数来调用gzip。下面来举例说明一下:
# tar -cZf all.tar.Z *.jpg
这条命令是将所有.jpg的文件打成一个tar包,并且将其用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z
# tar -xZf all.tar.Z
这条命令是将上面产生的包解开
有了上面的知识,你应该可以解开多种压缩文件了,下面对于tar系列的压缩文件作一个小结:
1)对于.tar结尾的文件
tar -xf all.tar
2)对于.gz结尾的文件
gzip -d all.gz
gunzip all.gz
3)对于.tgz或.tar.gz结尾的文件
tar -xzf all.tar.gz
tar -xzf all.tgz
4)对于.bz2结尾的文件
bzip2 -d all.bz2
bunzip2 all.bz2
5)对于tar.bz2结尾的文件
tar -xjf all.tar.bz2
6)对于.Z结尾的文件
uncompress all.Z
7)对于.tar.Z结尾的文件
tar -xZf all.tar.z
另外对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:
1)对于.zip
linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:
# zip all.zip *.jpg
这条命令是将所有.jpg的文件压缩成一个zip包

    # unzip all.zip
这条命令是将all.zip中的所有文件解压出来

2)对于.rar
要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux
不是免费的;然后安装:
# tar -xzpvf rarlinux-3.2.0.tar.gz
# cd rar
# make
这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:
# rar a all *.jpg
这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar 扩展名将自动附加到包名后。
# unrar e all.rar
这条命令是将all.rar中的所有文件解压出来
到此为至,我们已经介绍过linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、zip、unzip、rar、unrar等程式,你应该已经能够使用它们对.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、.Z、.tar.Z、.zip、.rar这10种压缩文件进行解压了,以后应该不需要为下载了一个软件而不知道如何在Linux下解开而烦恼了。而且以上方法对于Unix也基本有效。
本文介绍了linux下的压缩程式tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、zip、unzip、rar、unrar等程式,以及如何使用它们对.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、.Z、.tar.Z、.zip、.rar这10种压缩文件进行操作。
posted @ 2009-01-21 20:17 Stephen 阅读(274) | 评论 (0)编辑 收藏

    偶用金山毒霸的杀毒套装,今天无意中发现金山网镖中有一个访问网络的请求是C:\System32\Safeabc.exe请求的,这个文件根本不是我安装的,又不认识,豪不犹豫的禁止了,上网一查,果然是病毒,而且现在并没有杀毒工具可以查杀这个病毒,而且任务管理器也无法使用了,无论是按ctrl+shift+del还是还是在任务栏点右键,还是运行“taskmgr”都没有办法掉出任务管理器,麻烦来了。

    上网查相关资料,这个病毒好像还会自动下载木马病毒,很危险的说,好在金山毒霸还能用,查了一下,内存里有三个木马,先杀掉。

    金山毒霸安全百宝箱里有一个进程管理器,居然还能调用,运行发现果然有一个safeabc.exe的进程,先结束掉这个进程,然后去删除这个文件,系统提示禁止删除,找到金山毒霸的文件粉碎器,强行删除,然后将启动项里面可疑的启动项删掉,好像是叫loveHebeAA的,然后查毒杀毒,
重启,病毒是没有了,但是任务管理器还是不能用,郁闷了,上网找了好多资料,试了都不行,后来病急乱投医,在金山的修复工具里检测一下,居然发现好多的劫持,如图:


TNND,修复之,任务管理器就可以用了,

阿门,应该是解决了,不知道这病毒还有没有其他的影响。。。

P.S. 此文不是给金山打广告,别的工具应该也可以做到的,比如进程管理器,文件粉碎器,劫持修复等等,很多工具都可以做到,只是本人手头上恰好有金山而已,:P

posted @ 2008-06-24 22:10 Stephen 阅读(462) | 评论 (0)编辑 收藏
使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel文件并不是一件容易的事。在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来越强烈,目前较为流行的操作是在JSP或Servlet 中创建一个CSV (comma separated values)文件,并将这个文件以MIME,text/csv类型返回给浏览器,接着浏览器调用Excel并且显示CSV文件。这样只是说可以访问到Excel文件,但是还不能真正的操纵Excel文件,本文将给大家一个惊喜,向大家介绍一个开放源码项目??Java Excel API,使用它大家就可以方便地操纵Excel文件了。
JAVA EXCEL API简介
  Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。 现在发布的稳定版本是V2.0,提供以下功能:

? 从Excel 95、97、2000等格式的文件中读取数据;
? 读取Excel公式(可以读取Excel 97以后的公式);
? 生成Excel数据表(格式为Excel 97);
? 支持字体、数字、日期的格式化;
? 支持单元格的阴影操作,以及颜色操作;
? 修改已经存在的数据表;
? 现在还不支持以下功能,但不久就会提供了:
? 不能够读取图表信息;


可以读,但是不能生成公式,任何类型公式最后的计算值都可以读出;
应用示例
从Excel文件读取数据表
Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术语:工作薄),下面的代码片段举例说明了应该如何操作:(完整代码见ExcelReading.java)


import java.io.*;
import jxl.*;
… … … …
try
{
//构建Workbook对象, 只读Workbook对象
//直接从本地文件创建Workbook
//从输入流创建Workbook
InputStream is = new FileInputStream(sourcefile);
jxl.Workbook rwb = Workbook.getWorkbook(is);
}
catch (Exception e)
{
e.printStackTrace();
}


  一旦创建了Workbook,我们就可以通过它来访问Excel Sheet(术语:工作表)。参考下面的代码片段:
//获取第一张Sheet表
Sheet rs = rwb.getSheet(0);
  我们既可能通过Sheet的名称来访问它,也可以通过下标来访问它。如果通过下标来访问的话,要注意的一点是下标从0开始,就像数组一样。
  一旦得到了Sheet,我们就可以通过它来访问Excel Cell(术语:单元格)。参考下面的代码片段:
//获取第一行,第一列的值
Cell c00 = rs.getCell(0, 0);
String strc00 = c00.getContents();
//获取第一行,第二列的值
Cell c10 = rs.getCell(1, 0);
String strc10 = c10.getContents();
//获取第二行,第二列的值
Cell c11 = rs.getCell(1, 1);
String strc11 = c11.getContents();
System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " +
c00.getType());
System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " +
c10.getType());
System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " +
c11.getType());
  如果仅仅是取得Cell的值,我们可以方便地通过getContents()方法,它可以将任何类型的Cell值都作为一个字符串返回。示例代码中Cell(0, 0)是文本型,Cell(1, 0)是数字型,Cell(1,1)是日期型,通过getContents(),三种类型的返回值都是字符型。
  如果有需要知道Cell内容的确切类型,API也提供了一系列的方法。参考下面的代码片段:
String strc00 = null;
double strc10 = 0.00;
Date strc11 = null;
Cell c00 = rs.getCell(0, 0);
Cell c10 = rs.getCell(1, 0);
Cell c11 = rs.getCell(1, 1);
if(c00.getType() == CellType.LABEL)
{
LabelCell labelc00 = (LabelCell)c00;
strc00 = labelc00.getString();
}
if(c10.getType() == CellType.NUMBER)
{
NmberCell numc10 = (NumberCell)c10;
strc10 = numc10.getValue();
}
if(c11.getType() == CellType.DATE)
{
DateCell datec11 = (DateCell)c11;
strc11 = datec11.getDate();
}
System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " +
c00.getType());
System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " +
c10.getType());
System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " +
c11.getType());
  在得到Cell对象后,通过getType()方法可以获得该单元格的类型,然后与API提供的基本类型相匹配,强制转换成相应的类型,最后调用相应的取值方法getXXX(),就可以得到确定类型的值。API提供了以下基本类型,与Excel的数据格式相对应。
每种类型的具体意义,请参见Java Excel API Document。
当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。参考如下代码片段:
//操作完成时,关闭对象,释放占用的内存空间
rwb.close();
Java Excel API提供了许多访问Excel数据表的方法,在这里我只简要地介绍几个常用的方法,其它的方法请参考附录中的Java Excel API Document。


? Workbook类提供的方法
1. int getNumberOfSheets()
获得工作薄(Workbook)中工作表(Sheet)的个数,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
int sheets = rwb.getNumberOfSheets();
2. Sheet[] getSheets()
返回工作薄(Workbook)中工作表(Sheet)对象数组,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
Sheet[] sheets = rwb.getSheets();
3. String getVersion()
返回正在使用的API的版本号,好像是没什么太大的作用。
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
String apiVersion = rwb.getVersion();


? Sheet接口提供的方法
1. String getName()
获取Sheet的名称,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
String sheetName = rs.getName();
2. int getColumns()
获取Sheet表中所包含的总列数,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
int rsColumns = rs.getColumns();
3. Cell[] getColumn(int column)
获取某一列的所有单元格,返回的是单元格对象数组,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell[] cell = rs.getColumn(0);
4. int getRows()
获取Sheet表中所包含的总行数,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
int rsRows = rs.getRows();
5. Cell[] getRow(int row)
获取某一行的所有单元格,返回的是单元格对象数组,示例子:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell[] cell = rs.getRow(0);
6. Cell getCell(int column, int row)
获取指定单元格的对象引用,需要注意的是它的两个参数,第一个是列数,第二个是行数,这与通常的行、列组合有些不同。
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell cell = rs.getCell(0, 0);


生成新的Excel工作薄
  下面的代码主要是向大家介绍如何生成简单的Excel工作表,在这里单元格的内容是不带任何修饰的(如:字体,颜色等等),所有的内容都作为字符串写入。(完整代码见ExcelWriting.java)
  与读取Excel工作表相似,首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象,这里要注意的是,只能通过API提供的工厂方法来创建Workbook,而不能使用WritableWorkbook的构造函数,因为类WritableWorkbook的构造函数为protected类型。示例代码片段如下:


import java.io.*;
import jxl.*;
import jxl.write.*;
… … … …
try
{
//构建Workbook对象, 只读Workbook对象
//Method 1:创建可写入的Excel工作薄
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));
//Method 2:将WritableWorkbook直接写入到输出流
/*
OutputStream os = new FileOutputStream(targetfile);
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
*/
}
catch (Exception e)
{
e.printStackTrace();
}
  API提供了两种方式来处理可写入的输出流,一种是直接生成本地文件,如果文件名不带全路径的话,缺省的文件会定位在当前目录,如果文件名带有全路径的话,则生成的Excel文件则会定位在相应的目录;另外一种是将Excel对象直接写入到输出流,例如:用户通过浏览器来访问Web服务器,如果HTTP头设置正确的话,浏览器自动调用客户端的Excel应用程序,来显示动态生成的Excel电子表格。
  接下来就是要创建工作表,创建工作表的方法与创建工作薄的方法几乎一样,同样是通过工厂模式方法获得相应的对象,该方法需要两个参数,一个是工作表的名称,另一个是工作表在工作薄中的位置,参考下面的代码片段:
file://创建Excel工作表
jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
  "这锅也支好了,材料也准备齐全了,可以开始下锅了!",现在要做的只是实例化API所提供的Excel基本数据类型,并将它们添加到工作表中就可以了,参考下面的代码片段:
file://1.添加Label对象
jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");
ws.addCell(labelC);
//添加带有字型Formatting的对象
jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18,
WritableFont.BOLD, true);
jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell", wcfF);
ws.addCell(labelCF);
//添加带有字体颜色Formatting的对象
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10,
WritableFont.NO_BOLD, false,
UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
jxl.write.Label labelCFC = new jxl.write.Label(1, 0, "This is a Label Cell", wcfFC);
ws.addCell(labelCF);
//2.添加Number对象
jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
ws.addCell(labelN);
//添加带有formatting的Number对象
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);
//3.添加Boolean对象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);
//4.添加DateTime对象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);
//添加带有formatting的DateFormat对象
jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
ws.addCell(labelDTF);
  这里有两点大家要引起大家的注意。第一点,在构造单元格时,单元格在工作表中的位置就已经确定了。一旦创建后,单元格的位置是不能够变更的,尽管单元格的内容是可以改变的。第二点,单元格的定位是按照下面这样的规律(column, row),而且下标都是从0开始,例如,A1被存储在(0, 0),B1被存储在(1, 0)。
  最后,不要忘记关闭打开的Excel工作薄对象,以释放占用的内存,参见下面的代码片段:
file://写入Exel工作表
wwb.write();
//关闭Excel工作薄对象
wwb.close();
  这可能与读取Excel文件的操作有少少不同,在关闭Excel对象之前,你必须要先调用write()方法,因为先前的操作都是存储在缓存中的,所以要通过该方法将操作的内容保存在文件中。如果你先关闭了Excel对象,那么只能得到一张空的工作薄了。
拷贝、更新Excel工作薄
  接下来简要介绍一下如何更新一个已经存在的工作薄,主要是下面二步操作,第一步是构造只读的Excel工作薄,第二步是利用已经创建的Excel工作薄创建新的可写入的Excel工作薄,参考下面的代码片段:(完整代码见ExcelModifying.java)
file://创建只读的Excel工作薄的对象
jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));
//创建可写入的Excel工作薄对象
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile), rw);
//读取第一张工作表
jxl.write.WritableSheet ws = wwb.getSheet(0);
//获得第一个单元格对象
jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
//判断单元格的类型, 做出相应的转化
if(wc.getType() == CellType.LABEL)
{
Label l = (Label)wc;
l.setString("The value has been modified.");
}
//写入Excel对象
wwb.write();
//关闭可写入的Excel对象
wwb.close();
//关闭只读的Excel对象
rw.close();
  之所以使用这种方式构建Excel对象,完全是因为效率的原因,因为上面的示例才是API的主要应用。为了提高性能,在读取工作表时,与数据相关的一些输出信息,所有的格式信息,如:字体、颜色等等,是不被处理的,因为我们的目的是获得行数据的值,既使没有了修饰,也不会对行数据的值产生什么影响。唯一的不利之处就是,在内存中会同时保存两个同样的工作表,这样当工作表体积比较大时,会占用相当大的内存,但现在好像内存的大小并不是什么关键因素了。
  一旦获得了可写入的工作表对象,我们就可以对单元格对象进行更新的操作了,在这里我们不必调用API提供的add()方法,因为单元格已经于工作表当中,所以我们只需要调用相应的setXXX()方法,就可以完成更新的操作了。
  尽单元格原有的格式化修饰是不能去掉的,我们还是可以将新的单元格修饰加上去,以使单元格的内容以不同的形式表现。
  新生成的工作表对象是可写入的,我们除了更新原有的单元格外,还可以添加新的单元格到工作表中,这与示例2的操作是完全一样的。
  最后,不要忘记调用write()方法,将更新的内容写入到文件中,然后关闭工作薄对象,这里有两个工作薄对象要关闭,一个是只读的,另外一个是可写入的。


  下面是在一个Excel表格中创建一个矩阵的简单例子:
import org.apache.poi.hssf.usermodel.*;
import java.io.FileOutputStream;



// code run against the jakarta-poi-1.5.0-FINAL-20020506.jar.
public class PoiTest {
static public void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("foo.xls");
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet s = wb.createSheet();
wb.setSheetName(0, "Matrix");
for(short i=0; i<50; i++) {
HSSFRow row = s.createRow(i);
for(short j=0; j<50; j++) {
HSSFCell cell = row.createCell(j);
cell.setCellValue(""+i+","+j);
}
}
wb.write(fos);
fos.close();
}
}
这段代码首先创建一个Workbook,从该Workbook中得到一个表格、命名,然后继续写入一个50x50的矩阵。最后输出到一个名为foo.xls的Excel文件,甚至在Apple Mac机上也可以打开。
POI项目是Java应用的令人兴奋的一步,为用户提供了Windows文档集成的新功能,允许Java开发人员方便地扩展其产品的功能。

posted @ 2008-05-17 13:18 Stephen 阅读(405) | 评论 (1)编辑 收藏

DBCC DBREINDEX重建索引提高SQL Server性能

大多数SQL Server表需要索引来提高数据的访问速度,如果没有索引,SQL Server 要进行表格扫描读取表中的每一个记录才能找到索要的数据。索引可以分为簇索引和非簇索引,簇索引通过重排表中的数据来提高数据的访问速度,而非簇索引则通过维护表中的数据指针来提高数据的索引。

1. 索引的体系结构

为什么要不断的维护表的索引?首先,简单介绍一下索引的体系结构。SQL Server在硬盘中用8KB页面在数据库文件内存放数据。缺省情况下这些页面及其包含的数据是无组织的。为了使混乱变为有序,就要生成索引。生成索引后,就有了索引页和数据页,数据页保存用户写入的数据信息。索引页存放用于检索列的数据值清单(关键字)和索引表中该值所在纪录的地址指针。索引分为簇索引和非簇索引,簇索引实质上是将表中的数据排序,就好像是字典的索引目录。非簇索引不对数据排序,它只保存了数据的指针地址。向一个带簇索引的表中插入数据,当数据页达到100%时,由于页面没有空间插入新的的纪录,这时就会发生分页,SQL Server 将大约一半的数据从满页中移到空页中,从而生成两个半的满页。这样就有大量的数据空间。簇索引是双向链表,在每一页的头部保存了前一页、后一页地址以及分页后数据移动的地址,由于新页可能在数据库文件中的任何地方,因此页面的链接不一定指向磁盘的下一个物理页,链接可能指向了另一个区域,这就形成了分块,从而减慢了系统的速度。对于带簇索引和非簇索引的表来说,非簇索引的关键字是指向簇索引的,而不是指向数据页的本身。

为了克服数据分块带来的负面影响,需要重构表的索引,这是非常费时的,因此只能在需要时进行。可以通过DBCC SHOWCONTIG来确定是否需要重构表的索引。

 

2. DBCC SHOWCONTIG用法

下面举例来说明DBCC SHOWCONTIGDBCC REDBINDEX的使用方法。以应用程序中Employee数据作为例子,在 SQL ServerQuery analyzer输入命令:

use database_name

declare @table_id int

set @table_id=object_id('Employee')

dbcc showcontig(@table_id)

输出结果:

DBCC SHOWCONTIG scanning 'Employee' table...

Table: 'Employee' (1195151303); index ID: 1, database ID: 53

TABLE level scan performed.

- Pages Scanned................................: 179

- Extents Scanned..............................: 24

- Extent Switches..............................: 24

- Avg. Pages per Extent........................: 7.5

- Scan Density [Best Count:Actual Count].......: 92.00% [23:25]

- Logical Scan Fragmentation ..................: 0.56%

- Extent Scan Fragmentation ...................: 12.50%

- Avg. Bytes Free per Page.....................: 552.3

- Avg. Page Density (full).....................: 93.18%

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

通过分析这些结果可以知道该表的索引是否需要重构。如下描述了每一行的意义:

信息                                           描述

Pages Scanned                    表或索引中的长页数

Extents Scanned                 表或索引中的长区页数

Extent Switches                  DBCC遍历页时从一个区域到另一个区域的次数

Avg. Pages per Extent         相关区域中的页数

Scan Density[Best Count:Actual Count]       

Best Count是连续链接时的理想区域改变数,Actual Count是实际区域改变数,Scan Density100%表示没有分块。

Logical Scan Fragmentation   扫描索引页中失序页的百分比

Extent Scan Fragmentation    不实际相邻和包含链路中所有链接页的区域数

Avg. Bytes Free per Page       扫描页面中平均自由字节数

Avg. Page Density (full)         平均页密度,表示页有多满

 从上面命令的执行结果可以看的出来,Best count23 Actual Count25这表明orders表有分块需要重构表索引。下面通过DBCC DBREINDEX来重构表的簇索引。

3. DBCC DBREINDEX 用法

重建指定数据库中表的一个或多个索引。

语法

DBCC DBREINDEX

    (    [ 'database.owner.table_name'   

            [ , index_name

                [ , fillfactor ]

            ]

        ]

    )    

参数

'database.owner.table_name'

是要重建其指定的索引的表名。数据库、所有者和表名必须符合标识符的规则。有关更多信息,请参见使用标识符。如果提供 database owner 部分,则必须使用单引号 (') 将整个 database.owner.table_name 括起来。如果只指定 table_name,则不需要单引号。

index_name

是要重建的索引名。索引名必须符合标识符的规则。如果未指定 index_name 或指定为 ' ',就要对表的所有索引进行重建。

fillfactor

是创建索引时每个索引页上要用于存储数据的空间百分比。fillfactor 替换起始填充因子以作为索引或任何其它重建的非聚集索引(因为已重建聚集索引)的新默认值。如果 fillfactor 0DBCC DBREINDEX 在创建索引时将使用指定的起始 fillfactor

同样在Query Analyzer中输入命令:

dbcc dbreindex('database_name.dbo.Employee','',90)

然后再用DBCC SHOWCONTIG查看重构索引后的结果:

DBCC SHOWCONTIG scanning 'Employee' table...

Table: 'Employee' (1195151303); index ID: 1, database ID: 53

TABLE level scan performed.

- Pages Scanned................................: 178

- Extents Scanned..............................: 23

- Extent Switches..............................: 22

- Avg. Pages per Extent........................: 7.7

- Scan Density [Best Count:Actual Count].......: 100.00% [23:23]

- Logical Scan Fragmentation ..................: 0.00%

- Extent Scan Fragmentation ...................: 0.00%

- Avg. Bytes Free per Page.....................: 509.5

- Avg. Page Density (full).....................: 93.70%

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

通过结果我们可以看到Scan Denity100%

******

原文链接:《如何提高SQL SERVER的性能》

http://www.csdn.com.cn/database/1142.htm

作者:unknown

posted @ 2008-05-17 11:47 Stephen 阅读(319) | 评论 (0)编辑 收藏

4月30日,因某些原因需要在上班时间重启下应用,
结果重启后就报错无法使用,从下午4点多一直到下班系统都无法使用,
由于系统报的错误始终是spring的applicationContext加载失败,一直在找配置文件的原因,
其中尝试还原备份,切换应用等等好多操作,都没有办法,
开始反馈系统出错的电话很多,头脑一直是乱的,等到下班以后才静下心来找原因,
后来发现本地测试的应用也无法启动,
最后发现是hibernata的tld文件的下载地址失效了,原来的那个地址在网络上突然已经无法访问,
通过其他方式找到TLD文件,打到hibernate 包里面,问题解决.

此事的教训:
1,TLD文件一定要改为从本地取,不能用默认的从网络读取的;
2,遇事要冷静,不要着急,慌乱,每次都这么说,但每次都着急,需要改进.

posted @ 2008-05-17 11:36 Stephen 阅读(392) | 评论 (0)编辑 收藏



显示器: AOC 193FW (19'液晶)    1480元
CPU:  AMD AM2 Athlon 64 X2 5000+(90nm) 800元
主板:  微星 K9N Neo-F    699元
显卡:  双敏 无极HD3690玩家版   890元
内存:  金士顿 DDRII800 1G    250元
硬盘:  希捷 酷鱼7200.9/ST3250824AS 250G  465元
机箱+电源: 金河田      300元左右(可选金河田、爱国者,机箱温度低为好)
鼠标+键盘:      150左右(不用买好的,经常会换)
光驱:  DVD光驱     170(先锋、三星、索尼都行)
网卡声卡板载

-------------------------------------------------------------------------------
       合计:5204


我的机器又落后了。。555555555
posted @ 2008-03-23 23:02 Stephen 阅读(195) | 评论 (0)编辑 收藏
https://gro.clinux.org/frs/download.php/1828/spring2.0-reference_final_zh_cn.chm
posted @ 2007-06-25 21:22 Stephen 阅读(228) | 评论 (0)编辑 收藏
8月了,大半年过去了,
回想今年,3-6月收获还可以,
7,8两个月进步较慢,都是混日子;
这样下去不行啊。。。。。。

今年剩下的日子:
1、重心不能偏移:学技术是重中之重;不和无聊的人勾心斗角;
2、坚持学English:每天学,时间总是有的;
3、自己写出一款软件
posted @ 2006-08-15 22:30 Stephen 阅读(349) | 评论 (1)编辑 收藏