<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>因为爱</title>
    <description></description>
    <link>http://jackytang520.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>fcitx的美化方案</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/237764" style="color:red;">http://jackytang520.javaeye.com/blog/237764</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自：<a href="http://www.leninlee.cn/?p=177#comment-97" target="_blank">http://www.leninlee.cn/?p=177#comment-97</a><br /><br />把里面“［界面］”部分替换成下面的部分：<br /><br />[界面]<br />候选词个数=5<br />主窗口是否使用3D界面=0<br />输入条使用3D界面=0<br />主窗口隐藏模式=1<br />显示虚拟键盘=0<br />是否自动隐藏输入条=1<br />输入条是否居中=0<br />首次显示输入条=1<br />#输入条固定宽度(仅适用于码表输入法)，0表示不固定宽度<br />输入条固定宽度=0<br />输入条偏移量X=0<br />输入条偏移量Y=12<br />序号后加点=1<br />显示打字速度=1<br />显示版本=1<br />光标色=102 159 66<br />主窗口背景色=255 255 255<br />主窗口线条色=203 202 186<br />主窗口输入法名称色=153 153 153 102 159 66 56 134 230<br />输入窗背景色=255 255 255<br />输入窗提示色=2 89 196<br />输入窗用户输入色=255 0 132<br />输入窗序号色=0 66 200<br />输入窗第一个候选字色=0 99 200<br />#该颜色值只用于拼音中的用户自造词<br />输入窗用户词组色=0 99 200<br />输入窗提示编码色=255 0 132<br />#五笔、拼音的单字/系统词组均使用该颜色<br />输入窗其它文本色=56 134 230<br />输入窗线条色=203 202 186<br />输入窗箭头色=193 227 151<br />虚拟键盘窗背景色=220 220 220<br />虚拟键盘窗字母色=80 0 0<br />虚拟键盘窗符号色=0 0 0<br /><br />保存后按在fcitx打开的状态下ctrl+5重新读取配置文件再重新启动fcitx即可。如图即为美化后的效果截图。<br /><br />当然如何配色你自己也可以试试。
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/237764#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 20:23:58 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/237764</link>
        <guid>http://jackytang520.javaeye.com/blog/237764</guid>
      </item>
      <item>
        <title>Linux/Ubuntu chmod命令详解使用格式和方法</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/235268" style="color:red;">http://jackytang520.javaeye.com/blog/235268</a>&nbsp;
          发表时间: 2008年09月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small;">转自：</span><a href="http://www.ownlinux.cn/2008/03/14/ubuntu-linux-chmod/"><span style="font-size: small;">http://www.ownlinux.cn/2008/03/14/ubuntu-linux-chmod/</span></a></p>
<p><span style="font-size: small;">在 Ubuntu Linux 中</span><a href="http://www.ownlinux.cn/?p=147" target="_blank"><span style="font-size: small;">用源码文件安装软件</span></a><span style="font-size: small;">时经常都会用到<strong>chmod</strong>命令来更改文件的权限使其在安装时有执行的权限。由于 Ubuntu Linux 默认不能用root账户来登录所以在用chmod命令来更改文件的权限时往往需要结合sudo命令来使用，如果你对sudo命令还不太了解，请先看看本站的</span><a href="http://www.ownlinux.cn/?p=169" target="_blank"><span style="font-size: small;">《sudo命令详解》</span></a></p>
<h3><span style="font-size: small;">chmod</span></h3>
<p><span style="font-size: small;"><strong>Linux/Ubuntu </strong>系统中文件调用的权限分为三级:文件拥有者(<span style="color: #ff0000;">u</span>)、群组(<span style="color: #ff0000;">g</span>)、其他(<span style="color: #ff0000;">o</span>)。用chmod就可以更改文件的权限。<strong>chmod</strong>是一个相当灵活的命令，对同一个文件的权限的修改可以用多种风格的命令格式来实现。 </span></p>
<p><span id="more-260"></span></p>
<h3><span style="font-size: small;">方式一：</span></h3>
<p><span style="font-size: small;">语法格式： chmod [-vR] mode 文件名</span></p>
<p><span style="font-size: small;">参数说明:</span></p>
<p><span style="font-size: small;">mode 权限设置字串,格式为[ugoa] [+-=] [rwx]</span></p>
<p><span style="font-size: small;">u 表示文件的拥有者</span></p>
<p><span style="font-size: small;">g 表示与此文件拥有者属于一个组群的人</span></p>
<p><span style="font-size: small;">o 表示其他人</span></p>
<p><span style="font-size: small;">a 表示包含以上三者即文件拥有者(<span style="color: #ff0000;">u</span>)、群组(<span style="color: #ff0000;">g</span>)、其他(<span style="color: #ff0000;">o</span>)</span></p>
<p><span style="font-size: small;">+ 表示增加权限</span></p>
<p><span style="font-size: small;">- 表示取消权限</span></p>
<p><span style="font-size: small;">= 表示唯一设置权限</span></p>
<p><span style="font-size: small;">r 表示有读取的权限</span></p>
<p><span style="font-size: small;">w 表示有写入的权限</span></p>
<p><span style="font-size: small;">x 表示有执行的权限</span></p>
<p><span style="font-size: small;">-v 显示权限改变的详细资料</span></p>
<p><span style="font-size: small;">-R 表示对当前目录下的所有文件和子目录进行相同的权限更改</span></p>
<p><span style="font-size: small;">例：</span></p>
<p><span style="font-size: small;">我们要将当前目录下ownlinux这个文件的权限修为所有用户拥有该文件的读取、写入、执行的权限。在这里就需要结合sudo命令来使用，如果你对sudo命令还不太了解，请先看看本站的</span><a href="http://www.ownlinux.cn/?p=169" target="_blank"><span style="font-size: small;">《sudo命令详解》</span></a></p>
<p><span style="font-size: small;">ownlinux@server:/var/www$ sudo chmod a+rwx ownlinux</span></p>
<p><span style="font-size: small;">[sudo] password for ownlinux: （此时输入你的密码）</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;">或者使用</span></p>
<p><br /><span style="font-size: small;">ownlinux@server:/var/www$ sudo chmod ugo+rwx ownlinux</span></p>
<p><span style="font-size: small;">[sudo] password for ownlinux: （此时输入你的密码）</span></p>
<p><span style="font-size: small;">命令不一样，但执行后的效果是一样的。</span></p>
<h3><span style="font-size: small;">方式二：</span></h3>
<p><span style="font-size: small;">语法格式： chmod [-vR] [No] 文件名</span></p>
<p><span style="font-size: small;">参数说明:</span></p>
<p><span style="font-size: small;">No 三位代表相应权限的数字</span></p>
<p><span style="font-size: small;">-v 显示权限改变的详细资料</span></p>
<p><span style="font-size: small;">-R 表示对当前目录下的所有文件和子目录进行相同的权限更改</span></p>
<p><span style="font-size: small;">可能这种方式对于初学者来说有一定的难度，但这种方法学会后在更改文件权限就变得非常的简单。相信通过我的介绍大家会掌握种方法的:)</span></p>
<p><span style="font-size: small;">首先了解一下读取(r)、写入(w)、执行(x)相应的数字编号，如下图所示</span></p>
<p><span style="font-size: small;"><img src="http://www.ownlinux.cn/wp-content/uploads/2008/03/ubuntu_ownlinux_chmod_1.jpg" alt="ubuntu_ownlinux_chmod_1" /> </span></p>
<p><span style="font-size: small;">如果你记住了上图所示的数字和对应的权限就往下边看</span></p>
<p><span style="font-size: small;">刚才已经说过了，[No]参数 是三位代表相应权限的数字。从左向右，第一位数学代表文件拥有者(<span style="color: #ff0000;">u</span>)的权限、群组(<span style="color: #ff0000;">g</span>)的权限、其他(<span style="color: #ff0000;">o</span>)的权限。每一个数字就对应该级用户拥有的权限即为rwx相应的数字之和。这样说可能大家不是很明白，我画了一张表帮助大家了解</span></p>
<p><span style="font-size: small;"><img src="http://www.ownlinux.cn/wp-content/uploads/2008/03/ubuntu_ownlinux_chmod_2.jpg" alt="" /></span></p>
<p><span style="font-size: small;">如上图可以看出来如果是所有用户拥有该文件的读取、写入、执行的权限就是拥有者(<span style="color: #ff0000;">u</span>)的权限(4+2+1=7)群组(<span style="color: #ff0000;">g</span>)的权限(4+2+1=7)其他(<span style="color: #ff0000;">o</span>)的权限(4+2+1=7即为777。<span style="color: #000000;">注意：如果没有读取的权限则&rdquo;r&rdquo;相应的数字编号就为&rdquo;0&Prime;,写入(w)、执行(x)同理。</span></span></p>
<p><span style="font-size: small;">例： </span></p>
<p><span style="font-size: small;">就用刚才方式一的例子,我们要将当前目录下ownlinux这个文件的权限修为所有用户拥有该文件的读取(<span style="color: #ff0000;">r</span>)、写入(<span style="color: #ff0000;">w</span>)、执行(<span style="color: #ff0000;">x</span>)的权限。回顾一下方式一的命令格式。 </span></p>
<p><span style="font-size: small;">ownlinux@server:/var/www$ sudo chmod a+rwx ownlinux</span></p>
<p><span style="font-size: small;">[sudo] password for ownlinux: （此时输入你的密码）</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;">方式二的命令</span></p>
<p><br /><span style="font-size: small;">ownlinux@server:/var/www$ sudo chmod 777 ownlinux</span></p>
<p><span style="font-size: small;">[sudo] password for ownlinux: （此时输入你的密码）</span></p>
<p><span style="font-size: small;">可以看出使用方式二的命令格式简洁明了</span></p>
<p><span style="font-size: small;">如果要让当前目录下ownlinux这个文件的权限修为该文件的拥有者(<span style="color: #ff0000;">u</span>)有该文件的读取(<span style="color: #ff0000;">r</span>)、写入(<span style="color: #ff0000;">w</span>)、执行(<span style="color: #ff0000;">x</span>)的权限,群组(<span style="color: #ff0000;">g</span>)和其他(<span style="color: #ff0000;">o</span>)的用户只有读取(<span style="color: #ff0000;">r</span>)和执行(<span style="color: #ff0000;">x</span>)的权限,运行以下命令：</span></p>
<p><span style="font-size: small;">ownlinux@server:/var/www$ sudo chmod 755 ownlinux</span></p>
<p><span style="font-size: small;">[sudo] password for ownlinux: （此时输入你的密码）</span></p>
<p>&nbsp;</p>
<p><span style="font-size: small;">相信通过我的介绍大家都已经对chmod这个命令有一定的了解了吧。我觉得方式二的命令风格一但了解了就很容易掌握，而且方式二的命令风格简单明了。</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/235268#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 01 Sep 2008 11:47:35 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/235268</link>
        <guid>http://jackytang520.javaeye.com/blog/235268</guid>
      </item>
      <item>
        <title>Linux/Ubuntu tar命令详解使用格式和方法</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/235266" style="color:red;">http://jackytang520.javaeye.com/blog/235266</a>&nbsp;
          发表时间: 2008年09月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small;">转自：</span><a href="http://www.ownlinux.cn/2008/01/22/ubuntu-linux-tar"><span style="font-size: small;">http://www.ownlinux.cn/2008/01/22/ubuntu-linux-tar</span></a> <span style="font-size: medium;"><br />格式：tar 选项 文件目录列表 <br />功能：对文件目录进行打包备份 <br />选项： <br />-c 建立新的归档文件 <br />-r 向归档文件末尾追加文件 <br />-x 从归档文件中解出文件 <br />-O 将文件解开到标准输出 <br />-v 处理过程中输出相关信息 <br />-f 对普通文件操作 <br />-z 调用gzip来压缩归档文件，与-x联用时调用gzip完成解压缩 <br />-Z 调用compress来压缩归档文件，与-x联用时调用compress完成解压缩 <br /><br />例如： <br />1.将当前目录下所有.txt文件打包并压缩归档到文件this.tar.gz，我们可以使用 <br />tar czvf this.tar.gz ./*.txt <br /><br />2.将当前目录下的this.tar.gz中的文件解压到当前目录我们可以使用 <br />tar xzvf this.tar.gz ./</span></p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/235266#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 01 Sep 2008 11:42:36 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/235266</link>
        <guid>http://jackytang520.javaeye.com/blog/235266</guid>
      </item>
      <item>
        <title>Ubuntu系统中Groub的修复</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/234950" style="color:red;">http://jackytang520.javaeye.com/blog/234950</a>&nbsp;
          发表时间: 2008年08月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如果你以前为ubuntu和windows多系统，当你重新安装windows，就会在MBR中只存在windows的起动选项，没有了ubuntu的grub，你可以用如下方法解决：<br />用ubuntu的LIVECD（即安装光盘）启动，进入终端，输入sudo grub,回车<br />然后输入：<br /><span style="color: red">grub> find /boot/grub/stage1  注：这里是数字1，不是英文小写的L，<br />                              前面的grub〉为提示符，不需要输入，下同</span><br />输出如下：<br />(hd0,1)<br /><br /><span style="color: red">注：在ubuntu7.04以后的版本会出现find不到结果的现象，可能是因为这种版本用/dev/sda来表示分区的原因，而grub是用hd0来表示造成不兼容。所以需要你自己查找/boot所在的分区号。另开一个终端，使用命令：<br />sudo fdisk -l<br />列出你所有的分区号。<br />    1、如果/boot没有单独分区：那么只需要知道/分区的分区号。比如/分区号为/dev/hda5，那么我们所需要的结果就是(hd0,4)。<br />    2、如果/boot单独分区：那么需要知道/boot分区的分区号。比如/boot分区号为/dev/hda8，那么我们所需要的结果就是(hd0,7)。</span><br />然后输入：<br />grub>root (hd0,1)   <span style="color: red">注：这里的括号中的内容就是刚才输出的内容或者你自己查找到的/boot所在分区的分区号，其中还是数字0和1。</span><br />grub>setup (hd0)    <span style="color: red">注：这里的括号中的内容为刚才输出的内容中，逗号前面的内容。</span><br /><br />如果结果类似下面的结果，那就是成功把grub安装到了MBR。（分区号可能与你的不一致，没问题。）<br /><br /><span style="color: red"> Checking if "/boot/grub/stage1" exists... no<br /> Checking if "/grub/stage1" exists... yes<br /> Checking if "/grub/stage2" exists... yes<br /> Checking if "/grub/e2fs_stage1_5" exists... yes<br /> Running "embed /grub/e2fs_stage1_5 (hd0)"...  17 sectors are embedded.<br />succeeded<br /> Running "install /grub/stage1 (hd0) (hd0)1+17 p (hd0,8)/grub/stage2 /grub/menu<br />.lst"... succeeded<br />Done.</span><br /><br />输入quit退出grub模式。<br /><br />最后取出光盘重新启动即可。
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/234950#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 31 Aug 2008 08:22:49 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/234950</link>
        <guid>http://jackytang520.javaeye.com/blog/234950</guid>
      </item>
      <item>
        <title>Gvim安装及帮助文档的设置</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/234741" style="color:red;">http://jackytang520.javaeye.com/blog/234741</a>&nbsp;
          发表时间: 2008年08月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自：<a href="http://www.linuxdiyf.com/bbs/thread-86657-1-1.html" target="_blank">http://www.linuxdiyf.com/bbs/thread-86657-1-1.html</a><br />Linux是一个属于程序员的操作系统，Ubuntu也不例外。So，在Linux上面配置一个属于程序员的强大的编程环境不可或缺。我选择－我喜欢的gvim。<br /><br />C的开发首先离不开编译器，GCC首当其冲，获取命令如下：<br />sudo apt-get install build-essential<br /><br />gvim的安装命令如下：<br />sudo apt-get install vim-full<br />或者sudo apt-get install vim-gtk vim-doc cscope<br /><br /><strong>创建快捷方式</strong><br />sudo cat > /usr/share/applications/gvim.desktop &lt;&lt; "EOF"<br />[Desktop Entry]<br />Name=Gvim<br />Comment[zh_CN]=Gvim編輯器<br />Exec=gvim<br />Icon=/usr/share/pixmaps/gnome-word.png<br />Terminal=false<br />X-MultipleArgs=false<br />Type=Application<br />Categories=Application;Development;<br />Encoding=UTF-8<br />StartupNotify=true<br />EOF<br /><br /><strong>配置gvim</strong><br />cat > $HOME/.vimrc &lt;&lt; "EOF"<br />" 項目: gvim 配置文件<br />" 作者: yonsan<br />" 安裝: sudo apt-get install vim-gtk<br />" 用法: 將本文件(.vimrc)拷貝到$HOME/<br /><br />" 使用 murphy 調色板<br />colo murphy<br />" 設置用於GUI圖形用戶界面的字體列表。<br />set guifont=SimSun\ 10<br />"<br />set nocompatible<br />" 設定文件瀏覽器目錄為當前目錄<br />set bsdir=buffer<br />set autochdir<br />" 設置編碼<br />set enc=utf-8<br />" 設置文件編碼<br />set fenc=utf-8<br />" 設置文件編碼檢測類型及支持格式<br />set fencs=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936<br />" 指定菜單語言<br />set langmenu=zh_CN.UTF-8<br />source $VIMRUNTIME/delmenu.vim<br />source $VIMRUNTIME/menu.vim<br />" 設置語法高亮度<br />set syn=cpp<br />"顯示行號<br />set nu!<br />" 查找結果高亮度顯示<br />set hlsearch<br />" tab寬度<br />set tabstop=4<br />set cindent shiftwidth=4<br />set autoindent shiftwidth=4<br />" C/C++註釋<br />set comments=://<br />" 修正自動C式樣註釋功能 &lt;2005/07/16><br />set comments=s1:/*,mb:*,ex0:/<br />" 增強檢索功能<br />set tags=./tags,./../tags,./**/tags<br />" 保存文件格式<br />set fileformats=unix,dos<br />" 鍵盤操作<br />map &lt;Up> gk<br />map &lt;Down> gj<br />" 命令行高度<br />set cmdheight=1<br />" 中文幫助<br />if version > 603<br />set helplang=cn<br />endi<br />EOF<br /><br /><strong>菜单栏乱码</strong><br />這有可能是你將locale設置為GBK而導致。<br /><br />編輯 $HOME/.vimrc ，將其中相關內容調整為<br /><br />" 指定菜單語言<br />set langmenu=zh_CN.GBK<br />set enc=chinese<br />set fencs=gbk,utf-8,ucs-bom,gb18030,gb2312,cp936<br />source $VIMRUNTIME/delmenu.vim<br />source $VIMRUNTIME/menu.vim<br /><br /><strong>vim中文手册安装</strong><br />到<a href="http://vcd.gro.clinux.org" target="_blank">http://vcd.gro.clinux.org</a>下载gvim中文帮助包<br />将帮助包解压，拷贝到gvim安装目录的doc下即可，我的安装目录是/usr/share/vim/vim71<br />如果无法显示中文, 在/usr/share/vim/gvimrc中增加下面这句试试:<br />set helplang=cn<br />帮助文件的文本是utf-8编码的, 如果想用vim直接查看, 需要在/usr/share/vim/gvimrc中设置:<br />set encoding=utf-8
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/234741#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 30 Aug 2008 11:36:38 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/234741</link>
        <guid>http://jackytang520.javaeye.com/blog/234741</guid>
      </item>
      <item>
        <title>将Ubuntu Hardy打造成Mac OSX Leopard主题</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/234639" style="color:red;">http://jackytang520.javaeye.com/blog/234639</a>&nbsp;
          发表时间: 2008年08月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我们并不能真正地把linux系统改为苹果系统，但要把我们的Ubuntu打造地像Mac OSX却完全没问题。因为 Ubuntu 的外观的定制性相当强，你可以根据你自己的喜好来改变它的外观，而且可以改造很多方面。<br />PS：这样做是让既喜欢苹果外观又喜欢的Ubuntu的系统的用户知道怎么来改造和自定义 Ubuntu 的外观，本不是希望 Ubuntu 的默认外观要和MAC或者是Windows一样。<br />如果你想把这个<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20873/b93fb0d1-dabb-3663-9855-6985b58d6b1b.jpg " /><br />改为这个<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20875/b9ebe929-04a3-3726-bad3-4833f6f14fff.jpg " /><br />请照下面步骤做：<br /><strong>开始前</strong><br />首先在你的Home 目录下创建名为Mac_files 的文件夹，将以下文件下载到该文件夹内。<br /><a href="http://maketecheasier.com/a/Mac4Lin_modified_theme/" target="_blank">Modified Mac4Lin theme</a> <br /><a href="http://maketecheasier.com/a/Mac4Lin_Icons_modified/" target="_blank">Mac4Lin icon set</a> <br /><a href="http://downloads.sourceforge.net/mac4lin/Mac4Lin_Wallpapers_Part3_v0.4.tar.gz?modtime=1198007584&big_mirror=0&filesize=12555519" target="_blank">Mac4Lin wallpaper</a> <br /><a href="http://gnome-look.org/CONTENT/content-files/66381-Elegant_glass.tgz" target="_blank">Avant Windows Manager elegant glass theme</a> <br />使用归档管理器将3个Mac4Lin 压缩文件解压到Mac_files文件夹中。<br /><strong>应用 Mac OSX Leopard 主题</strong><br />找到System->Preferences->Appearance.<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20877/add58f8f-874d-391f-92c7-7d4fda01745d.jpg " /><br />点击 Install 然后选择Mac4Lin GTK theme<br />(/home/username/Mac_files/Mac4Lin_v0.4/GTK <br />Metacity Theme/Mac4Lin_GTK_v0.4.tar.gz).<br /><br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20879/ab44e001-b7a9-3005-a138-51630dc18189.jpg " /><br /><br />下一步，再次点击 Install ，选择Mac4Lin icon theme.<br />(/home/username/Mac_files/Mac4Lin_Icons_Part2_v0.4.tar.gz).<br />当出现对话框时，选择Apply new themes。<br />再次点击Install，选择Mac4Lin mouse cursor theme.<br />(/home/username/Mac_files/Mac4Lin_v0.4/GTK Cursor Theme/Mac4Lin_Cursors_v0.4.tar.gz).<br />在出现对话框时选择Apply new themes。<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20881/47ff42e0-55dc-3f1a-af2e-cf5818984f7f.jpg " /><br />单击 customize， 选择Mac4Lin_GTK_v0.4，进入Window border标签项,选择Mac4Lin_GTK_v0.4，然后关闭。<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20883/11d36034-ee63-3593-8ae4-48302f9a8868.jpg " /><br />在顶端，点击Backgound 项，单击Add 选择Leopard壁纸(/home/username/Mac_files/Wallpapers/Leopard.jpg)。点击关闭以结束Appearance 窗口。<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20885/fadf30a1-fda5-3968-aa81-09b55cdcd078.jpg " /><br /><strong>安装 Dock（先进的窗口浏览器）</strong><br />打开一个终端(Applications->Accessories->Terminal)，输入<br />gksu gedit /etc/apt/sources.list<br />在文件末尾加入以下几行：<br />deb http://ppa.launchpad.net/awn-testing/ubuntu hardy main<br />deb-src http://ppa.launchpad.net/awn-testing/ubuntu hardy main<br />保存并退出。<br />在终端输入<br />sudo apt-get update<br />sudo apt-get install avant-window-navigator-trunk awn-manager-trunk awn-extras-applets-trunk<br />进入System->Preferences->AWN manager，点击左侧的 Theme，在右侧，点击add并找到Mac_files文件夹，点选Elegant_glass.tgz文件，选中Elegant透明主题前的小圆圈，点击Apply<br /><img src=" http://jackytang520.javaeye.com/upload/picture/pic/20887/4f31e8b5-5de6-37ac-841f-a29b1583debd.jpg  " /><br />下一步，在左边，选择applet图标，在右边，下滚至stack Applet。选择并激活它，这将会把Mac Leopard stack 安装到你的dock中。<br />启动AWN之前先把桌面底部的面板删除，在面板上单击右键选择delete this panel即可。在Applications->Accessories->Avant Window Navigator中打开awn，一旦它被激活，你就可以通过简单的拖拽把各种应用程序加入到dock中<br /><strong>安装 OSX 字体</strong><br />打开终端输入以下内容<br />sudo apt-get install msttcorefonts<br />这将安装微软核心字体<br /><img src=" http://jackytang520.javaeye.com/upload/picture/pic/20889/b0e412e8-3ac0-3d4b-ae28-625a8d091af6.jpg " /><br />接下来将osx的字体考到字体文件夹<br />cd /usr/share/fonts<br />sudo tar xvzf /home/username/Mac_files/Mac4Lin_v0.4/Fonts/OSX_Fonts.tar.gz<br />配置字体<br />cd /<br />sudo tar xvjpf /home/username/Mac_files/Mac4Lin_v0.4/Fonts/fontconfig.tbz -C /etc/fonts<br />打开Appearance 窗口，选择Fonts 标签，照以下图片选择字体，并关闭窗口<br /><img src=" http://jackytang520.javaeye.com/upload/picture/pic/20889/b0e412e8-3ac0-3d4b-ae28-625a8d091af6.jpg " /><br />在终端输入<br />gconf-editor<br />这将调出 gconf-editor 窗口。下滚至App->Metacity->general，双击右侧的button_layout并将内容改为close,minimize,maximize:menu，点击ok并关闭gconf-editor<br /><img src="  http://jackytang520.javaeye.com/upload/picture/pic/20893/7063c3b6-3099-3769-8bfa-0fd64b3d507d.jpg " /><br />改变菜单栏<br />删除顶端面板左侧的所有图标和应用程序，右击图标选择Remove from panel你将的到类似下图的东西<br /><img src=" http://jackytang520.javaeye.com/upload/picture/pic/20895/b40f395c-144e-33e8-b269-3c05606af6f5.jpg " /><br />在顶端面板的右侧，删除注销图标，在原处单击右键，选择Add to panel，下滑列表选择加入 Search for files，这将在面板中添加 spotlight图标<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20897/2f041fe1-1d2c-3905-b8b5-4df9b75d64e2.jpg " /><br />在最左端，用同样的方法加入Main Menu这样就可以像在Mac OSX中一样注销或关机了<br /><img src=" http://jackytang520.javaeye.com/upload/picture/pic/20899/8ac14517-cd6a-3445-9f31-09f0858a850f.jpg " /><br />接下来我们要安装 globalmunu以显示各个应用程序的菜单栏。在终端输入<br /><br />cd Mac_files<br />wget http://gnome2-globalmenu.googlecode.com/files/gnome-globalmenu-0.4-svn964.tar.gz<br />tar zxvf gnome-globalmenu-0.4-svn964.tar.gz<br />cd globalmenu<br />sudo dpkg -i *.deb<br />如果在安装软件包过程中出现错误请尝试输入<br />sudo dpkg -i –force-overwrite *.deb<br />如果安装gnome-globalmenu-applet过程中出错，请尝试：<br />sudo apt-get install -f<br />结束后，右击顶端面板选择add to panel，下滚列表选择Global Menu Applet<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20901/0983c993-f402-3bd7-9a66-ac3cd1a2ac94.jpg " /><br />最初你可能看不到任何东西，注销再登录后你应该能够在面板上看到各个程序的菜单栏了<br />如果你的globalmenu 有和面板其它部分不同的灰色阴影（如下图所示），在面板空白处单击右键选择属性，找到背景标签，选择“背景图片”，选择/home/username/.themes/Mac4Lin_GTK_v0.4/gtk-2.0/Panel and select panel-bg.png<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20903/a3209ef4-6365-34a9-b319-82436e5df78f.jpg " /><br />将globalmenu 拖至最靠apple图标的左边，右击globalmenu选择 preferences，勾选Display the title of the current application旁的方框，将最大宽度调至100，字体选择Lucida Grande Bold，应用并确定，你将得到一个类似Mac Leopard的桌面。<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20905/1431232c-f7cf-3b47-b138-3d1bad8f03c4.jpg " /><br /><br /><img src=" http://jackytang520.javaeye.com/upload/picture/pic/20907/10dcfe2d-e919-374c-9db9-963c11ee31e6.jpg " /><br /><strong>配置登录屏幕</strong><br />右击苹果图标，进入System->Administration->Login Window，在Local标签中单击add，找至路径<br />/filesystem/home/username/Mac_files/Mac4Lin_v0.4/GDM Theme 选择the file Mac4Lin_GDM_v0.4.tar.gz，勾选新安装的主题边的方框以激活它。<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20909/cb3fab4d-adb0-3142-99d0-7d0b260f711a.jpg " /><br />在下面，有一个颜色选择区，选择并在color code中键入E5E5E5<br /><img src=" http://jackytang520.javaeye.com/upload/picture/pic/20911/fbf39acf-89e3-36e8-91ce-8db342020ff0.jpg " /><br />确定并注销，你将看到如下的登录屏幕<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20913/525d9e8c-205c-38d0-a4fd-147c3c8e7516.jpg " /><br /><strong>配置启动项选择屏幕（usplash）</strong><br />usplash是计算机启动时出现的屏幕，我们将改变它以显示白色苹果屏幕。<br />终端键入：<br />sudo apt-get install startupmanager<br />进入System->Administration->Start-Up Manager，选择appearance标签，点击Manage bootloader theme，选择add并浏览至文件<br />/filesystem/home/username/Mac_files/Mac4Lin_v0.4/GRUB Splash/appleblack.xpm.gz<br />勾选Use background image for bootloader menu” 并选择 ‘appleblack”.<br /><img src=" http://jackytang520.javaeye.com/upload/picture/pic/20915/32bccd74-7e2a-38ee-8399-7d7a06c00f2f.jpg " /><br /><br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20917/5ed723b6-5d14-3136-a83d-9182bfd79d60.jpg " /><br />下一步，单击Manage usplash theme，添加/filesystem/home/username/Mac_files/Mac4Lin_v0.4/USplash Theme/osx-splash.so，在下拉菜单中选择OSX-splash。现在重启，你应该看到如下画面：<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20919/650d4fd2-db05-35b8-befa-46ebf469631c.jpg " /><br /><br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20921/917ea3ca-9ff4-3677-b93d-8042d87ceb26.jpg " /><br /><br />添加Dashboard效果<br />我们将用screenlets和compiz插件的组合实现dashboard效果<br />安装screenlets<br />sudo apt-get install screenlets compizconfig-settings-manager<br />进入System->Preferences->Advanced Desktop Effect Setting，在左侧点击Desktop，在右侧，Widget layer前划勾<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20923/93a651a4-4b14-35d2-b44a-dbbb79d5151f.jpg " /><br />进入Accessories->Screenlets，激活你想要显示的插件，右击并选择Properties， 进入 Options标签并选择Treat as widget，对你已激活的所有插件重复此步骤<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20925/d44fa73a-18bd-3516-a341-7fceefd44e06.jpg " /><br />现在你可以按F9查看你的dashboard了。<br /><img src=" http://jackytang520.javaeye.com/upload/picture/pic/20927/65cd09aa-69e0-3ea9-a846-94b303e88d83.jpg " /><br />好了。你已经把ubuntu桌面换为Mac 桌面了。<br />一些截图：<br /><br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20929/5396859c-aa70-34cf-994d-c5e0ae5da6b1.jpg " /><br /><br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/20931/2ee9f3fa-178a-3292-859f-60db9b995272.jpg " />
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/234639#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 30 Aug 2008 00:18:46 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/234639</link>
        <guid>http://jackytang520.javaeye.com/blog/234639</guid>
      </item>
      <item>
        <title>使用苹果丽黑字体美化Ubuntu8.04</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/234593" style="color:red;">http://jackytang520.javaeye.com/blog/234593</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、准备好苹果丽黑字体，推荐蚂蚁修改的LiHei Pro字体，为方便，我在这里提供下载<br /><br />2、将字体放入字体文件夹，这里有个问题，必须要拥有系统管理权限才能在字体文件夹内进行文件复制等操作，下面进行详细说明。<br />（1）进入字体文件夹：cd /usr/share/fonts<br />（2）创建一个名字apple的文件夹：mkdir apple<br />（3）将字体复制到apple文件夹下：sudo mp /home/jackytang520/LiHeiPro.ttf /usr/share/fonts/apple/<br />（4）修改字体权限：sudo chmod 755 /usr/share/fonts/apple/LiHeiPro.ttf<br /><br />3、建立字体缓存，命令：<br />cd /usr/share/fonts/apple/<br />sudo mkfontscale<br />sudo mkfontdir<br />sudo fc-cache -fv<br /><br />4、重启电脑，设置系统字体。
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/234593#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 20:08:07 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/234593</link>
        <guid>http://jackytang520.javaeye.com/blog/234593</guid>
      </item>
      <item>
        <title>英文Locale下使用中文输入法</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/234474" style="color:red;">http://jackytang520.javaeye.com/blog/234474</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自:<a href="http://wiki.ubuntu.com.cn/英文Locale下使用中文输入法" target="_blank">http://wiki.ubuntu.com.cn/英文Locale下使用中文输入法</a><br /><br /><span style="font-size: small"><strong>fcitx输入法 </strong><br />1. 安装<br /><pre name="code" class="java">sudo apt-get install fcitx</pre><br />2. 设置环境变量<br /><pre name="code" class="java">echo -e "export XMODIFIERS=@im=fcitx\nexport GTK_IM_MODULE=\"xim\"\nexport QT_IM_MODULE=\"xim\"\nfcitx &">>~/.profile</pre><br />3. 重启X <br /><br />4. 方块字<br /><pre name="code" class="java">gedit --encoding gbk ~/.fcitx/config显示字体(中)=*</pre><br />改为：显示字体(中)=AR PL UMing CN #填你喜欢的中文字体<br />在fcitx激活状态( Ctrl+Space )下按 Ctrl+5 启用配置，重启X亦可。<br /><br />如果你在英文locale下，正确安装scim或fcitx后仍无法正常使用输入法，解决的方法如下：<br /><pre name="code" class="java">sudo aptitude install im-switch</pre><br />如果你用scim，运行 <br /><pre name="code" class="java">sudo im-switch -s scim -z all_ALL
im-switch -s scim -z all_ALL
</pre><br />如果你用fcitx，运行<br /><pre name="code" class="java">sudo im-switch -s fcitx -z all_ALL
im-switch -s fcitx -z all_ALL</pre><br />这样，以后你就可以任意locale（英文、法文、藏文、维吾尔文，等等）下使用你喜欢的输入法了。 <br /><br />其实im-switch不过是帮你修改了几个配置文件而已。如果你实在不想装im-switch，也可以手动修改配置文件（比如下面就是一个加入en locale支持的例子，不过小心，有省力的软件帮你配置不用，一定要自己手工改，会被别人说你在装B哦）。 <br /><br />编辑 /etc/gtk-2.0/gtk.immodules(如果存在的话) 或者 /usr/lib/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules 文件，在xim 的 local 增加 en 也就是说： <br /><pre name="code" class="java">"xim" "X Input Method" "gtk20" "/usr/share/locale" "ko:ja:th:zh"</pre><br />改成 <br /><pre name="code" class="java">"xim" "X Input Method" "gtk20" "/usr/share/locale" "en:ko:ja:th:zh"</pre><br />如果是像本人一样，在英文locale环境下，只使用fcitx作为默认输入法的五笔用户，可以考虑删除scim。 <br /><br />删除scim <br /><pre name="code" class="java">sudo apt-get remove --purge scim-*
sudo apt-get autoremove
sudo apt-get install -f</pre><br />注：系统自动清理时，会提示删除ubuntu-desktop以及个别语言包之类，请自行google，再作决定。<br /><br />安装fcitx <br /><pre name="code" class="java">sudo apt-get update
sudo apt-get install fcitx</pre><br />注：有的源中的fcitx存有bug（能调出输入法，但中文无法输入），请自行到fcitx官网下载页下载，按照说明文档编译安装 。<br /><br />设置中文输入环境 <br /><pre name="code" class="java">echo 'LC_CTYPE=zh_CN.UTF-8' | sudo tee - -a /etc/environment</pre><br />保存你的所有工作，重启X（ctrl+alt+backspace）。 <br /><br />ctrl+space调出/隐藏fcitx界面。<br /><br />注：有些桌面环境（比如Fluxbox）可能并不能自动启动fcitx，可以在相应的启动脚本中（比如Fluxbox的启动脚本位于 ~/.fluxbox/startup）加入启动命令（比如 fcitx &）。也有其它的启动方法，请google。 <br /><br />注意，在纯英文环境下（没有安装任何中文支持），可能做了如上修改后fcitx仍然显示方块，这就是你的电脑中没有生成cn环境，可能进行如下修改以生成cn环境。 <br />sudo gvim /var/lib/locales/supported.d/zh <br /><br />加入如下内容<br />zh_SG.UTF-8 UTF-8<br />zh_HK.UTF-8 UTF-8<br />zh_TW.UTF-8 UTF-8<br />zh_CN.UTF-8 UTF-8<br />zh_CN.GB2312 GB2312<br />zh_CN.GBK GBK<br />zh_CN.GB18030 GB18030<br />zh_HK.Big5 Big5<br />zh_TW.Big5 Big5 <br /><br />然后<br />sudo locale-gen<br />生成可能要几分钟，等等就行了，这样的话，在纯英文环境中fcitx也可正常显示状态栏上的文字了。</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/234474#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 16:08:06 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/234474</link>
        <guid>http://jackytang520.javaeye.com/blog/234474</guid>
      </item>
      <item>
        <title>在Ubuntu8.04中添加更新源</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/234228" style="color:red;">http://jackytang520.javaeye.com/blog/234228</a>&nbsp;
          发表时间: 2008年08月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          使用命令:sudo gedit /etc/apt/sources.list<br /><br />将下面内容copy到文件保存即可,因为我是电信的,所以这个源比教育网的要快:<br />deb http://ubuntu.cn99.com/ubuntu/ hardy main restricted universe multiverse <br />deb http://ubuntu.cn99.com/ubuntu/ hardy-security main restricted universe multiverse <br />deb http://ubuntu.cn99.com/ubuntu/ hardy-updates main restricted universe multiverse <br />deb http://ubuntu.cn99.com/ubuntu/ hardy-proposed main restricted universe multiverse <br />deb http://ubuntu.cn99.com/ubuntu/ hardy-backports main restricted universe multiverse <br />deb-src http://ubuntu.cn99.com/ubuntu/ hardy main restricted universe multiverse <br />deb-src http://ubuntu.cn99.com/ubuntu/ hardy-security main restricted universe multiverse <br />deb-src http://ubuntu.cn99.com/ubuntu/ hardy-updates main restricted universe multiverse <br />deb-src http://ubuntu.cn99.com/ubuntu/ hardy-proposed main restricted universe multiverse <br />deb-src http://ubuntu.cn99.com/ubuntu/ hardy-backports main restricted universe multiverse<br /><br />#中国科学技术大学更新服务器（教育网，推荐校园网和网通用户使用）：<br />deb http://debian.ustc.edu.cn/Ubuntu/ gutsy main multiverse estricted universe<br />deb http://debian.ustc.edu.cn/Ubuntu/ gutsy-backports main multiverse restricted universe<br />deb http://debian.ustc.edu.cn/Ubuntu/ gutsy-proposed main multiverse restricted universe<br />deb http://debian.ustc.edu.cn/Ubuntu/ gutsy-security main multiverse restricted universe<br />deb http://debian.ustc.edu.cn/Ubuntu/ gutsy-updates main multiverse restricted universe<br />deb-src http://debian.ustc.edu.cn/Ubuntu/ gutsy main multiverse restricted universe<br />deb-src http://debian.ustc.edu.cn/Ubuntu/ gutsy-backports main multiverse restricted universe<br />deb-src http://debian.ustc.edu.cn/Ubuntu/ gutsy-proposed main multiverse restricted universe<br />deb-src http://debian.ustc.edu.cn/Ubuntu/ gutsy-security main multiverse restricted universe<br />deb-src http://debian.ustc.edu.cn/Ubuntu/ gutsy-updates main multiverse restricted universe
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/234228#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Aug 2008 01:26:20 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/234228</link>
        <guid>http://jackytang520.javaeye.com/blog/234228</guid>
      </item>
      <item>
        <title>LINUX的目录树</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/228755" style="color:red;">http://jackytang520.javaeye.com/blog/228755</a>&nbsp;
          发表时间: 2008年08月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自:<a href="www.javaeye.com/topic/187492" target="_blank">www.javaeye.com/topic/187492</a><br /><br />目录树可以分为小的部分，每个部分可以在自己的磁盘或分区上。主要部分是根、/usr 、/var 和 /home 文件系统。每个部分有不同的目的。 <br /><br />每台机器都有根文件系统，它包含系统引导和使其他文件系统得以mount所必要的文件，根文件系统应该有单用户状态所必须的足够的内容。还应该包括修复损坏系统、恢复备份等的工具。  <br /><br />/usr 文件系统包含所有命令、库、man页和其他一般操作中所需的不改变的文件。 /usr 不应该有一般使用中要修改的文件。这样允许此文件系统中的文件通过网络共享，这样可以更有效，因为这样节省了磁盘空间(/usr 很容易是数百兆)，且易于管理(当升级应用时，只有主/usr 需要改变，而无须改变每台机器) 即使此文件系统在本地盘上，也可以只读mount，以减少系统崩溃时文件系统的损坏。  <br /><br />/var 文件系统包含会改变的文件，比如spool目录(mail、news、打印机等用的)， log文件、formatted manual pages和暂存文件。传统上/var 的所有东西曾在 /usr 下的某个地方，但这样/usr 就不可能只读安装了。  <br /><br />/home 文件系统包含用户家目录，即系统上的所有实际数据。一个大的/home 可能要分为若干文件系统，需要在/home 下加一级名字，如/home/students 、/home/staff 等。  <br /><br />虽然上面将不同的部分称为文件系统，但它们不必是真的分离的文件系统。如果系统是小的单用户系统，而用户希望简单化，可以很容易地放在一个文件系统中。根据磁盘容量和不同目的所需分配的空间，目录树也可以分到不同的文件系统中。重要的是使用标准的名字，即使/var 和/usr 在同一分区上，名字/usr/lib/libc.a 和/var/adm/messages 必须能工作，例如将/var 下的文件移动到/usr/var ，并将/var 作为/usr/var 的符号连接。  <br /><br />Unix文件结构根据目的来分组文件，即所有的命令在一个地方，所有的数据在另一个地方，所有的文档又在一个地方，等等。另一个方法是根据属于的程序分组文件，即所有Emacs文件在一个目录中，所有TeX文件在另一个中，等等。后一种方法的问题是文件难于共享(程序目录经常同时包含静态可共享的和动态不可共享的文件)，有时难于查找 (例如man页在极大数量的地方，使man程序查找它们极其困难)。  <br /><br />根文件系统 <br />根文件系统一般应该比较小，因为包括严格的文件和一个小的不经常改变的文件系统不容易损坏。损坏的根文件系统一般意味着除非用特定的方法(例如从软盘)系统无法引导。  <br /><br />根目录一般不含任何文件，除了可能的标准的系统引导映象，通常叫/vmlinuz 。所有其他文件在根文件系统的子目录中。  <br /><br />/bin   <br />引导启动所需的命令或普通用户可能用的命令(可能在引导启动后)。  <br />/sbin   <br />类似/bin ，但不给普通用户使用，虽然如果必要且允许时可以使用。  <br />/etc   <br />特定机器的配置文件。  <br />/root   <br />root用户的家目录。  <br />/lib   <br />根文件系统上的程序所需的共享库。  <br />/lib/modules   <br />核心可加载模块，特别是那些恢复损坏系统时引导所需的(例如网络和文件系统驱动)。  <br />/dev   <br />设备文件。  <br />/tmp   <br />临时文件。引导启动后运行的程序应该使用/var/tmp ，而不是/tmp ，因为前者可能在一个拥有更多空间的磁盘上。  <br />/boot   <br />引导加载器(bootstrap loader)使用的文件，如LILO。核心映象也经常在这里，而不是在根目录。如果有许多核心映象，这个目录可能变得很大，这时可能使用单独的文件系统更好。另一个理由是要确保核心映象必须在IDE硬盘的前1024柱面内。  <br />/mnt   <br />系统管理员临时mount的安装点。程序并不自动支持安装到/mnt 。 /mnt 可以分为子目录(例如/mnt/dosa  可能是使用MSDOS文件系统的软驱，而/mnt/exta 可能是使用ext2文件系统的软驱)。  <br />/proc , /usr , /var , /home   <br />其他文件系统的安装点。  <br /><br /><br /><br />/etc目录 <br />/etc 目录包含很多文件。许多网络配置文件也在/etc 中。  <br /><br />/etc/rc  or /etc/rc.d  or /etc/rc*.d   <br />启动、或改变运行级时运行的scripts或scripts的目录。  <br /><br />/etc/passwd   <br />用户数据库，其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息。  <br /><br />/etc/fdprm   <br />软盘参数表。说明不同的软盘格式。用setfdprm 设置。 <br /><br />/etc/fstab   <br />启动时mount -a命令(在/etc/rc 或等效的启动文件中)自动mount的文件系统列表。 Linux下，也包括用swapon -a启用的swap区的信息。 <br /><br />/etc/group   <br />类似/etc/passwd ，但说明的不是用户而是组。  <br /><br />/etc/inittab   <br />init 的配置文件。  <br /><br />/etc/issue   <br />getty 在登录提示符前的输出信息。通常包括系统的一段短说明或欢迎信息。内容由系统管理员确定。  <br /><br />/etc/magic   <br />file 的配置文件。包含不同文件格式的说明，file 基于它猜测文件类型。 <br /><br />/etc/motd   <br />Message Of The Day，成功登录后自动输出。内容由系统管理员确定。经常用于通告信息，如计划关机时间的警告。  <br /><br />/etc/mtab   <br />当前安装的文件系统列表。由scripts初始化，并由mount 命令自动更新。需要一个当前安装的文件系统的列表时使用，例如df 命令。  <br /><br />/etc/shadow   <br />在安装了影子口令软件的系统上的影子口令文件。影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow 中，而后者只对root可读。这使破译口令更困难。  <br /><br />/etc/login.defs   <br />login 命令的配置文件。  <br /><br />/etc/printcap   <br />类似/etc/termcap ，但针对打印机。语法不同。  <br /><br />/etc/profile , /etc/csh.login , /etc/csh.cshrc   <br />登录或启动时Bourne或C shells执行的文件。这允许系统管理员为所有用户建立全局缺省环境。  <br /><br />/etc/securetty   <br />确认安全终端，即哪个终端允许root登录。一般只列出虚拟控制台，这样就不可能(至少很困难)通过modem或网络闯入系统并得到超级用户特权。  <br /><br />/etc/shells   <br />列出可信任的shell。chsh 命令允许用户在本文件指定范围内改变登录shell。提供一台机器FTP服务的服务进程ftpd 检查用户shell是否列在 /etc/shells 文件中，如果不是将不允许该用户登录。  <br /><br />/etc/termcap   <br />终端性能数据库。说明不同的终端用什么"转义序列"控制。写程序时不直接输出转义序列(这样只能工作于特定品牌的终端)，而是从/etc/termcap 中查找要做的工作的正确序列。这样，多数的程序可以在多数终端上运行。 <br /><br /><br />/dev目录 <br />/dev 目录包括所有设备的设备文件。设备文件用特定的约定命名。 <br /><br />/usr文件系统 <br />/usr 文件系统经常很大，因为所有程序安装在这里。 /usr 里的所有文件一般来自Linux distribution；本地安装的程序和其他东西在/usr/local 下。这样可能在升级新版系统或新distribution时无须重新安装全部程序。 <br /><br />/usr/X11R6   <br />X Window系统的所有文件。为简化X的开发和安装，X的文件没有集成到系统中。 X自己在/usr/X11R6 下类似/usr 。  <br />/usr/X386   <br />类似/usr/X11R6 ，但是给X11 Release 5的。  <br />/usr/bin   <br />几乎所有用户命令。有些命令在/bin 或/usr/local/bin 中。  <br />/usr/sbin   <br />根文件系统不必要的系统管理命令，例如多数服务程序。  <br />/usr/man , /usr/info , /usr/doc   <br />手册页、GNU信息文档和各种其他文档文件。  <br />/usr/include   <br />C编程语言的头文件。为了一致性这实际上应该在/usr/lib 下，但传统上支持这个名字。  <br />/usr/lib   <br />程序或子系统的不变的数据文件，包括一些site-wide配置文件。名字lib来源于库(library); 编程的原始库存在/usr/lib 里。  <br />/usr/local   <br />本地安装的软件和其他文件放在这里。  <br /><br /><br />/var文件系统 <br />/var 包括系统一般运行时要改变的数据。每个系统是特定的，即不通过网络与其他计算机共享。  <br /><br />/var/catman   <br />当要求格式化时的man页的cache。man页的源文件一般存在/usr/man/man* 中；有些man页可能有预格式化的版本，存在/usr/man/cat* 中。而其他的man页在第一次看时需要格式化，格式化完的版本存在/var/man 中，这样其他人再看相同的页时就无须等待格式化了。 (/var/catman 经常被清除，就象清除临时目录一样。)  <br />/var/lib   <br />系统正常运行时要改变的文件。  <br />/var/local   <br />/usr/local 中安装的程序的可变数据(即系统管理员安装的程序)。注意，如果必要，即使本地安装的程序也会使用其他/var 目录，例如/var/lock 。  <br />/var/lock   <br />锁定文件。许多程序遵循在/var/lock 中产生一个锁定文件的约定，以支持他们正在使用某个特定的设备或文件。其他程序注意到这个锁定文件，将不试图使用这个设备或文件。  <br />/var/log   <br />各种程序的Log文件，特别是login  (/var/log/wtmp log所有到系统的登录和注销) 和syslog (/var/log/messages 里存储所有核心和系统程序信息。 /var/log 里的文件经常不确定地增长，应该定期清除。  <br />/var/run   <br />保存到下次引导前有效的关于系统的信息文件。例如， /var/run/utmp 包含当前登录的用户的信息。  <br />/var/spool   <br />mail, news, 打印队列和其他队列工作的目录。每个不同的spool在/var/spool 下有自己的子目录，例如，用户的邮箱在/var/spool/mail 中。  <br />/var/tmp   <br />比/tmp 允许的大或需要存在较长时间的临时文件。 (虽然系统管理员可能不允许/var/tmp 有很旧的文件。)  <br /><br /><br />/proc文件系统 <br />/proc 文件系统是一个假的文件系统。它不存在在磁盘某个磁盘上。而是由核心在内存中产生。用于提供关于系统的信息(originally about processes, hence the name)。下面说明一些最重要的文件和目录。  <br /><br />/proc/1   <br />关于进程1的信息目录。每个进程在/proc 下有一个名为其进程号的目录。  <br />/proc/cpuinfo   <br />处理器信息，如类型、制造商、型号和性能。  <br />/proc/devices   <br />当前运行的核心配置的设备驱动的列表。  <br />/proc/dma   <br />显示当前使用的DMA通道。  <br />/proc/filesystems   <br />核心配置的文件系统。  <br />/proc/interrupts   <br />显示使用的中断，and how many of each there have been.  <br />/proc/ioports   <br />当前使用的I/O端口。  <br />/proc/kcore   <br />系统物理内存映象。与物理内存大小完全一样，但不实际占用这么多内存；it is generated on the fly as programs access it. (记住：除非你把它拷贝到什么地方，/proc 下没有任何东西占用任何磁盘空间。)  <br />/proc/kmsg   <br />核心输出的消息。也被送到syslog 。  <br />/proc/ksyms   <br />核心符号表。  <br />/proc/loadavg   <br />系统"平均负载"；3个指示器指出系统当前的工作量。  <br />/proc/meminfo   <br />存储器使用信息，包括物理内存和swap。  <br />/proc/modules   <br />当前加载了哪些核心模块。  <br />/proc/net   <br />网络协议状态信息。  <br />/proc/self   <br />到查看/proc 的程序的进程目录的符号连接。当2个进程查看/proc 时，是不同的连接。这主要便于程序得到它自己的进程目录。  <br />/proc/stat   <br />系统的不同状态，such as the number of page faults since the system was booted.  <br />/proc/uptime   <br />系统启动的时间长度。  <br />/proc/version   <br />核心版本。
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/228755#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Aug 2008 19:50:31 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/228755</link>
        <guid>http://jackytang520.javaeye.com/blog/228755</guid>
      </item>
      <item>
        <title>自定义Hibernate Dialect解决createSQLQuery时的decimal,long</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/194953" style="color:red;">http://jackytang520.javaeye.com/blog/194953</a>&nbsp;
          发表时间: 2008年05月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
org.hibernate.MappingException: No Dialect mapping for JDBC type: 3
</pre><br />仔细查看,发现问题在于数据类型.到网上查,发现hibernate在执行List result = session.createSQLQuery(sql).list()的时候,当SQL语句中遇到的decimal,long等类型的字段时,就出现上面的错误.而且从错误信息中可以发现:出错的是Dialect.<br /><br />解决办法:<br /><br />错误知道以后,我就到网上找解决办法.看来遇到这类问题的人太多了,网上到处都有人贴这个问题.我看了几篇,发现有个解决办法,就是自定义Hibernate Dialect.虽然所用数据库不同(我用的数据库是DB2),我觉得大同小异,就照着做了:<br /><br />首先建一个类,继承org.hibernate.dialect.DB2Dialect,该类的内容如下:<br /><br /><pre name="code" class="java">
import java.sql.Types;

import org.hibernate.Hibernate;
import org.hibernate.dialect.DB2Dialect;

public class PmDb2Dialect extends DB2Dialect {
    public PmDb2Dialect() {
        super();
        registerHibernateTyp(Types.DECIMAL,Hibernate.BIG_DECIMAL.getName());
    }
}
</pre><br />第二步,就是修改hibernate的配置文件hibernate.cfg.xml:<br /><br />将:<br /><pre name="code" class="xml">
    &lt;property name="hibernate.dialect">
        org.hibernate.dialect.DB2Dialect
    &lt;/property>
</pre><br />改为:<br /><pre name="code" class="xml">
    &lt;property name="hibernate.dialect">
        com.yonder.pm.common.PmDb2Dialect
    &lt;/property>
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/194953#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 20 May 2008 17:13:59 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/194953</link>
        <guid>http://jackytang520.javaeye.com/blog/194953</guid>
      </item>
      <item>
        <title>Hibernate 保存对象出现 org.hibernate.NonUniqueObjectExce</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/194696" style="color:red;">http://jackytang520.javaeye.com/blog/194696</a>&nbsp;
          发表时间: 2008年05月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Hibernate save 在 session 中已存在相同 OID(主键) 的对象，会出现异常，详细内容如下：<br /><pre name="code" class="java">
Exception in thread "main" org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.unmi.LoanDetail#1]
 at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:168)
 at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
 at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
 at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
 at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
 at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
 at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
 at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
 at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
 at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
 at com.unmi.Test.main(Test.java:44) 
</pre><br />重现以上错误的代码如下(去除了事物控制的代码行)：<br /><pre name="code" class="java">
Session session  =  HibernateSessionFactory.getSession();
      
     // 加载OID为1L的对象，会被放在session缓存中   
     LoanDetail detail  =  (LoanDetail)session.get(LoanDetail. class ,  1L );
     
     // new 一个OID也为1L的临时对象  
     LoanDetail newDetail  =   new  LoanDetail( 1L );
    newDetail.setSubjectId( 1000L );
    
     // 持久化一个临时对象，试图放在session的缓存中，因OID冲突出现异常 
     session.save(newDetail);

     // 执行saveOrUpdate同样会出现以上的异常
     // session.saveOrUpdate(newDetail); 
</pre><br /><br />解决方法：<br />   1) 如果用的 hibernate 2, 需要在get/load/query到持久化对象，赋上新的属性值，再 save/update/saveOrupdate.<br />      对以上代码就是：不能 new 一个session中已存在OID的对象，直接<br />      detail.setSubjectId(1000L);<br />      session.save(detail);<br />      session.save()一个持久化对象时，会转化成update调用。<br /><br />   2) 使用 hibernate 3 的 merge 方法. session.merge(newDetail)即可，它会在 session 缓存中找到持久化对象，把新对象的属性赋过去，再保存原session中的持久化对象。<br />      如果在session或数据库中没有的对象，用merge方法的话，它也能够帮你把记录 insert 到表中，相当于 save 方法。<br /><br />上面是一个简单的例子，实际业务中可能是经过一番复杂的操作后自己也很难搞清楚 new 的一个新对象在 session/数据库中是否已存在。所以第一种方法你需要清楚你的每一个对象状态，第二种方法在 hibernate 3 中就比较通用一些。<br /><br />附 hibernate javadoc 对 session.merge() 方法的注释：<br />Copy the state of the given object onto the persistent object with the same identifier. If there is no persistent instance currently associated with the session, it will be loaded. Return the persistent instance. If the given instance is unsaved, save a copy of and return it as a newly persistent instance. The given instance does not become associated with the session. This operation cascades to associated instances if the association is mapped with cascade="merge".<br /><br />The semantics of this method are defined by JSR-220.
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/194696#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 20 May 2008 02:22:17 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/194696</link>
        <guid>http://jackytang520.javaeye.com/blog/194696</guid>
      </item>
      <item>
        <title>Eclipse 3.3 and GlassFish Java EE 5 integration</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/188968" style="color:red;">http://jackytang520.javaeye.com/blog/188968</a>&nbsp;
          发表时间: 2008年05月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转载自：<a href="https://glassfishplugins.dev.java.net/eclipse33/index.html" target="_blank">https://glassfishplugins.dev.java.net/eclipse33/index.html</a><br /><br />Download the Eclipse IDE 3.3 for Java Enterprise Developers (122Mb) (tools for Java Developers creating JEE and Web applications, including a Java IDE, tools for JEE and JSF, Mylyn and others...:<br />[url]http://www.eclipse.org/downloads/[url] Install the IDE and start it...Then:<br /><br />Now, switch to the "Java EE" perspective:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13387/9cce0ab0-b74b-3c0a-80df-26bedbaf997c.png" /><br /><br />Now, In the Server Tab, use the popup menu to call the "New Server" wizard:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13397/bf4fdcba-942b-37fe-8af9-dc740306fbd6.png" /><br /><br />Click on the link "Download addtional server adapters" (if you're behind a firewall, make sure you have set an SSL proxy).<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13395/1d961fad-fefb-331b-b8d1-1a6edbde2162.png" /><br /><br />Select the GlassFish Java EE 5 Server entry<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13393/6e22d0aa-b13e-339a-a0b5-09b3e2905e83.png" /><br /><br />Accept the license to download the GlassFish adapter<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13391/d296eb48-e678-3084-9dd8-063d07706542.png" /><br /><br />Eclipse will now download the adater from the GlassFish update Center. Click the OK button to continue.<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13389/86ba9a33-ad67-39f8-81b0-c744a14881ee.png" /><br /><br />After the download, Eclipse will prompt for a restart. Click the Yes button to continue:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13407/cbce44cb-d637-343f-98ab-032d0a6143d8.png" /><br /><br />After a fresh restart, you'll see the GlassFish category in the "New Server" wizard:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13405/fd585a2f-c22a-3d88-8717-89d0b7c85081.png" /><br /><br />Select a version of GlassFish you want to work with, for example GlassFish V2:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13403/118e7ed2-41d4-3bfa-9ac3-63a4f00924d6.png" /><br /><br />Using the "Browse..." buttton, navigate to a correct GlassFish installation directory. IF you have not installed GlassFish, get it from <a href="https://glassfish.dev.java.net/downloads/v2-b41d.html" target="_blank">https://glassfish.dev.java.net/downloads/v2-b41d.html</a><br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13401/e1d7086b-dcf7-3a8e-ad83-8cd85ad57d9d.png" /><br /><br />In the Next step of the wizard, you can fine tune some server properties. Default values are usually correct, but adapt them to your environment:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13399/0b82446e-2785-3fd9-b862-88db92c2def8.png" /><br /><br />A new Server (GlassFish V2) is now added to the Servers tab. Using the popup meny, you can start it:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13417/38c299c2-031b-339b-8468-be2d845ff889.png" /><br /><br />Once started, the server status will be shown as "Started". <br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13431/4b6ad35a-0907-3285-9718-c01b52376006.png" /><br /><br />Using the Console Tab, you can see the server log content:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13415/17a0a5dd-c0b2-39f6-9d63-07c7556bb81f.png" /><br /><br />Now it is time to create a Java EE 5 Web Application: on the PRoject Explorer view, if you are using the Java EE perspective, you can use the Popup menu New->Dynamic Web Project:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13413/71e2d17b-992d-3882-a941-0fa4e42a8e53.png" /><br /><br />Enter a name and verify that the Target runtime is GlassFish V2 Java EE 5<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13411/43eb6a17-137e-3d4b-957a-516bd00d4c2e.png" /><br /><br />In the Next step, you can verify the that version for Web Application is Servelt 2.5 (java EE 5 compliant), and if you want a default sun-web.xml deployment descriptor, make sure this facet is selected (on by default):<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13409/fb73befa-b2d7-3ea5-81d5-dd0ec4f4e6c9.png" /><br /><br />You see the new Web Application on the Project explorer.  Just create a new JSP index,jsp (Eclipse does not create it by default):<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13427/4ea947a1-bf7a-3b86-98cd-376f05625f2d.png" /><br /><br />Using the green run button on the Eclipse Tool bar, you are presented with the following choices. Pick the "Run on Server" item:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13425/73d3e810-f62e-36c3-bb23-4df58cc05dd0.png" /><br /><br />Click the Finish button on the "Run On Server" wizard:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13423/bc755035-fd4c-331f-acaa-b29a34433e66.png" /><br /><br />The Web Application is deployed to GlassFish and the index.jsp page is shown in the internal broswer in Eclipse. You can see the deployment status in the Eclipse Console<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13421/2c7de9b9-e684-364c-bc4d-f8a598061883.png" /><br /><br />If you need to debug, you could also "DEbug" this Web Application<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13419/9154c306-f4d6-3bc5-b3a6-20b04075b441.png" /><br /><br />And the GlassFish V2 server will restart in debug mode, and Eclipse will attach to the debugged server.<br />If you set a breakpoint on a JSP, the server will be stopped and you can use all the Debugger features from Eclipse to debug your Java EE application:<br /><img src="http://jackytang520.javaeye.com/upload/picture/pic/13429/1aacd0a2-5ca9-3cfb-bc9a-e1f729de8598.png" />
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/188968#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 02 May 2008 22:27:12 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/188968</link>
        <guid>http://jackytang520.javaeye.com/blog/188968</guid>
      </item>
      <item>
        <title>glassfish性能配置</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/188868" style="color:red;">http://jackytang520.javaeye.com/blog/188868</a>&nbsp;
          发表时间: 2008年05月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          为了使glassfish在产品环境中运行的更快，可以调整一些参数来提高性能：<br />　　Java虚拟机参数将-client改为-server。<br /><br />　　根据服务器的内存大小调整堆使用参数，如果服务器内存为2G，可以调整堆内存为-Xms1024m, -Xmx1024m。<br /><br />　　一般应用服务器发布程序后页面不需要经常更改，网站改版后可以重新发布，所以可以禁用页面和类自动检测功能。<br /><br />　　glassfish的自动发布功能在开发时很有用，不过正式的网站服务器上可以禁用此功能来避免线程检测，提高性能。<br /><br />　　为了提高并发连接数，需要增大线程数，默认的最大线程数一般比较小，glassfish最大为20。<br /><br />　　提高Keep Alive的连接数量，对AJAX站点来说这点很重要，很多页面刷新需要经常请求服务器处理，提高Keep Alive连接数目可以复用打开的连接，减少请求的时间。<br /><br />　　启用Http Cache，打开Admon Console -> Configuration -> HTTP Service -> HTTP File Cache，选中Globally和File Transmission选项，根据网站内容的不同适当调整文件缓存的大小。
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/188868#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 02 May 2008 17:04:57 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/188868</link>
        <guid>http://jackytang520.javaeye.com/blog/188868</guid>
      </item>
      <item>
        <title>Dynamically Generated Checkboxes</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/187222" style="color:red;">http://jackytang520.javaeye.com/blog/187222</a>&nbsp;
          发表时间: 2008年04月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自：<a href="http://wiki.apache.org/tapestry/Dynamically_Generated_Checkboxes?highlight=(checkbox)" target="_blank">http://wiki.apache.org/tapestry/Dynamically_Generated_Checkboxes?highlight=(checkbox)</a><br /><br />If you need to generate a sequence of check boxes in a form, it can be tricky to work out in your form listener which check boxes have been selected. Here is my solution which involves reconstructing the list of check boxes when the value method of each @Checkbox component is called.<br /><br />First create a Serializable object to hold the id of the check box: <br /><pre name="code" class="java">
package com.myweb.pages.admin;

import java.io.Serializable;

public class CheckboxItem implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * Can be whatever you like - perhaps a primary key from a database
     */
    private Serializable id;

    private boolean selected;

    public Serializable getId() {
        return id;
    }

    public void setId(Serializable id) {
        this.id = id;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }
}
</pre><br />This class must be serializable because Tapestry will stringify the object and use it as the value of the input element in the html output.<br /><br />Then create the datasource for your checkbox list. I have used a class with a static method for demonstration purposes, but you would normally pull some data out of a database to create the list. <br /><pre name="code" class="java">
package com.myweb.pages.admin;

import java.util.ArrayList;
import java.util.List;

public class CheckboxItemFactory {
	public static List&lt;CheckboxItem> getCheckboxItems() {
		List&lt;CheckboxItem> items = new ArrayList&lt;CheckboxItem>();

		{
			CheckboxItem item = new CheckboxItem();
			item.setId("ITEM1");
			items.add(item);
		}

		{
			CheckboxItem item = new CheckboxItem();
			item.setId("ITEM2");
			items.add(item);
		}

		{
			CheckboxItem item = new CheckboxItem();
			item.setId("ITEM3");
			item.setSelected(true);
			items.add(item);
		}

		return items;
	}
}
</pre><br />Then your Tapestry page class would be as follows. This page simply logs the values, but you could do whatever you like with them, e.g. put the values back into a db.<br /><pre name="code" class="java">
package com.myweb.pages.admin;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.tapestry.event.PageBeginRenderListener;
import org.apache.tapestry.event.PageEvent;
import org.apache.tapestry.html.BasePage;

public abstract class MultipleCheckboxes extends BasePage implements
        PageBeginRenderListener {
    private static final Logger logger = Logger
            .getLogger(MultipleCheckboxes.class);

    public abstract void setCheckboxItems(List&lt;CheckboxItem> checkboxItems);
    public abstract List&lt;CheckboxItem> getCheckboxItems();

    public abstract void setUpdatedCheckboxItems(List&lt;CheckboxItem> checkboxItems);
    public abstract List&lt;CheckboxItem> getUpdatedCheckboxItems();

    public abstract void setCurrentItem(CheckboxItem item);
    public abstract CheckboxItem getCurrentItem();
    
    //生成需要的Checkbox列表值
    public static List&lt;CheckboxItem> getCheckboxItems1() {
		List&lt;CheckboxItem> items = new ArrayList&lt;CheckboxItem>();

		{
			CheckboxItem item = new CheckboxItem();
			item.setId("ITEM1");
			items.add(item);
		}

		{
			CheckboxItem item = new CheckboxItem();
			item.setId("ITEM2");
			items.add(item);
		}

		{
			CheckboxItem item = new CheckboxItem();
			item.setId("ITEM3");
			item.setSelected(true);
			items.add(item);
		}

		return items;
	}
    
    public boolean isCurrentItemSelected() {
        return getCurrentItem().isSelected();
    }

    public void setCurrentItemSelected(boolean selected) {
        CheckboxItem item = getCurrentItem();
        item.setSelected(selected);
        getUpdatedCheckboxItems().add(item);
    }

    public void pageBeginRender(PageEvent pageEvent) {
        if (pageEvent.getRequestCycle().isRewinding()) {
            logger.info("Rewinding");
            setUpdatedCheckboxItems(new ArrayList&lt;CheckboxItem>());
        } else {
            logger.info("Beginning full page render");

            if (getUpdatedCheckboxItems() == null) {
                setCheckboxItems(getCheckboxItems1());
            } else {
                setCheckboxItems(getUpdatedCheckboxItems());
            }
        }
    }

    public void doSubmit() {
        logger.info("Form submitted");
        for (CheckboxItem item : getUpdatedCheckboxItems()) {
            logger.info("Item " + item.getId() + " is "
                    + (item.isSelected() ? "" : "not ") + "selected");
            
            System.out.println("Item " + item.getId() + " is "
                    + (item.isSelected() ? "" : "not ") + "selected");
        }
    }
}
</pre><br />The html page is as follows. <br /><pre name="code" class="html">
&lt;html>
	&lt;body>
		&lt;h1>Multiple Checkboxes&lt;/h1>
		&lt;form jwcid="@Form">
	        &lt;span jwcid="@For" source="ognl:checkboxItems" value="ognl:currentItem">
	   			&lt;input jwcid="@Checkbox" value="ognl:currentItemSelected"/>
				&lt;span jwcid="@Insert" value="ognl:currentItem.id"/>&lt;br/>
	        &lt;/span>
	        &lt;input jwcid="@Submit" listener="listener:doSubmit" value="Submit"/>
		&lt;/form>
	&lt;/body>
&lt;/html>
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/187222#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 27 Apr 2008 05:02:26 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/187222</link>
        <guid>http://jackytang520.javaeye.com/blog/187222</guid>
      </item>
      <item>
        <title>eMule服务器列表</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/184462" style="color:red;">http://jackytang520.javaeye.com/blog/184462</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          推荐：<br />http://www.emule.org.cn/server.met<br />http://ed2k.2x4u.de/luymfrvo/max/server.met<br />其他：<br />http://www.esel-paradies.de/server/all/server.met
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/184462#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 21:08:43 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/184462</link>
        <guid>http://jackytang520.javaeye.com/blog/184462</guid>
      </item>
      <item>
        <title>Subversion备份 </title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/179043" style="color:red;">http://jackytang520.javaeye.com/blog/179043</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          版本控制最关键的一件事是保证数据的安全性，不能因为磁盘损坏，程序故障造成版本库无可挽回的错误，为此必须制定较完备的备份策略。在Subversion中，我们有三种备份方式：完全备份，增量备份和同步版本库。<br />1, 完全备份<br /><br />最常见和简单的备份就是直接使用拷贝命令，将版本库目录拷贝到备份目录上，就可以了。但是这样不是很安全的方式，因为如果在拷贝时版本库发生变化，将会造成备份的结果不够准确，失去备份的作用，为此Subversion提供了“svnadmin hotcopy”命令，可以防止这种问题。<br /><br />还记得我们的版本库目录吗？<br /><br />    D:\SVNROOT<br />    ├─project1<br />    │  ├─conf<br />    │  ├─dav<br />    │  ├─db<br />    │  │  ├─revprops<br />    │  │  ├─revs<br />    │  │  └─transactions<br />    │  ├─hooks<br />    │  └─locks<br />    └─project2<br />        ├─conf<br />        ├─dav<br />        ├─db<br />        │  ├─revprops<br />        │  ├─revs<br />        │  └─transactions<br />        ├─hooks<br />        └─locks<br />       <br /><br />如果要把project1备份到d:\svnrootbak目录下，只需要运行：<br /><br />    svnadmin hotcopy d:\svnroot\project1 d:\svnrootbak\project1<br /><br />但是我们作为配置管理员，必须想办法优化这个过程，如果我们这个目录下有许多版本库，需要为每个版本库写这样一条语句备份，为此我写了下面的脚本，实现备份一个目录下的所有版本库。我们在D:\SVNROOT下创建了两个文件，simpleBackup.bat：<br /><br />    @echo 正在备份版本库%1......<br />    @%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2<br />    @echo 版本库%1成功备份到了%2！<br /><br />这个文件仅仅是对“svnadmin hotcopy”的包装，然后是backup.bat：<br /><br />    echo off<br /><br />    rem Subversion的安装目录<br />    set SVN_HOME="D:\Subversion"<br /><br />    rem 所有版本库的父目录<br />    set SVN_ROOT=D:\svnroot<br /><br />    rem 备份的目录<br />    set BACKUP_SVN_ROOT=D:\svnrootbak<br /><br />    set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%<br />    if exist %BACKUP_DIRECTORY% goto checkBack<br />    echo 建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.log<br /><br />    mkdir %BACKUP_DIRECTORY%<br /><br />    rem 验证目录是否为版本库，如果是则取出名称备份<br />    for /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" %SVN_ROOT%\simpleBackup.bat "%%~fI" %%~nI<br />    goto end<br /><br />    :checkBack<br />    echo 备份目录%BACKUP_DIRECTORY%已经存在，请清空。<br />    goto end<br /><br />    :end<br /><br />你在使用的时候，只需要修改backup.bat开头的三个路径，将两个脚本拷贝到“SVN_ROOT”下就可以了。根据以上的配置，你只需要运行 backup.bat，就可以把“SVN_ROOT”下的版本库都备份到“BACKUP_SVN_ROOT”里，并且存放在备份所在日的目录里，例如 “D:\svnrootbak\2006-10-22”。<br /><br />虽然这部分工作很简单，可是必须有人定时地去执行这个操作（例如每周一凌晨），为了避免发生遗忘的情况，我们可以将这个操作加入到系统的at任务当中去，例如还是上面的环境，为了安装at任务，我们运行：<br /><br />    at 1:00 /every:M D:\svnroot\backup.bat<br /><br />这样在每周一凌晨1:00都会执行这个备份过程。当然备份在本机也是不安全的，你也许需要上传到别的机器，这个就要靠你自己去实现了。<br /><br />2, 增量备份<br /><br />尽管完全备份非常简单，但是也是有代价的，当版本库非常巨大时，经常进行完全备份是不现实的，也并不必要，但是一旦版本库在备份之间发生问题，该如何呢，这里我们就用到了增量备份。<br /><br />增量备份通常要与完全备份结合使用，就像oracle数据库的归档日志，记录着每次Subversion提交的变化，然后在需要恢复时能够回到最新的可用状态。在我们这个例子中我们使用的是，svnadmin dump命令进行增量的备份，使用方法是：<br /><br />    svnadmin dump project1 --revision 15 --incremental > dumpfile2<br /><br />上面的命令实现了对修订版本15进行增量的备份，其中的输出文件dumpfile2只保存了修订版本15更改的内容。<br /><br />为了记录每次提交的结果，我们需要使用一项Subversion的特性--钩子（hook），看看我们的project1目录：<br /><br />    ├─project1<br />    │  ├─conf<br />    │  ├─dav<br />    │  ├─db<br />    │  │  ├─revprops<br />    │  │  ├─revs<br />    │  │  └─transactions<br />    │  ├─hooks<br />    │  └─locks<br /><br />其中的hooks目录里存放的就是钩子脚本，我们在此处只使用post-commit钩子，这个钩子会在每次提交之后执行，为了实现我们的备份功能，我们在hooks下建立一个文件post-commit.bat，内容如下：<br /><br />    echo off<br />    set SVN_HOME="C:\Program Files\Subversion"<br />    set SVN_ROOT=D:\svnroot<br />    set UNIX_SVN_ROOT=D:/svnroot<br />    set DELTA_BACKUP_SVN_ROOT=D:\svnrootbak\delta<br />    set LOG_FILE=%1\backup.log<br />    echo backup revision %2 >> %LOG_FILE%<br />    for /r %SVN_ROOT% %%I in (.) do if D:/svnroot/%%~nI == %1 %SVN_ROOT%\%%~nI\hooks\deltaBackup.bat %%~nI %2<br />    goto end<br />    :end<br /><br />通过这个脚本，可以实现D:\svnroot下的版本库提交时自动增量备份到D:\svnrootbak\delta（确定这个目录存在），其中使用的deltaBackup.bat其实可以放在任何地方，只是对脚本的svnadmin dump的包装，内容如下：<br /><br />    @echo 正在备份版本库%2......<br />    %SVN_HOME%\bin\svnadmin dump %SVN_ROOT%\%1 --incremental --revision %2 >> %DELTA_BACKUP_SVN_ROOT%\%1.dump<br />    @echo 版本库%2成功备份到了%3！<br /><br />以上两个脚本可以直接拷贝到project2的hooks目录下，不需要修改就可以实现project2的自动备份。<br /><br />以上的操作已经OK了，现在需要做的是将完全备份和增量备份结合起来，也就是在完全备份后清理增量备份的结果，使之只保存完全备份后的结果。<br /><br />当果真出现版本库的故障，就要求我们实现版本库的恢复操作了，这是用要使用svnadmin load命令，同时也需要上次的完全备份例如要把上次完全备份backuprepo，和之后的增量备份dumpfile：<br /><br />    svnadmin load backuprepo &lt; dumpfile<br /><br />最后的结果，可以下载svnroot.rar，将之解压缩到d:\下，然后修改几个bat文件的SVN_HOME就可以使用了。<br />3, 版本库同步<br /><br />Subversion 1.4增加了同步机制，可以实现一个版本库同另一个版本库的同步（但好像只是单向的），我们可以用来实现版本库的备份或镜像。<br />3.1. 对目标库初始化<br /><br />    svnsync init svn://localhost/project2 svn://localhost/project1 <br />     <br /><br />其中project2是目标的版本库，而project1是源版本库。其中的目标版本库必须为空，而且必须允许修订版本属性的修改，也就是在目标的版本库的hooks目录里添加一个文件pre-revprop-change.bat，内容为空即可。<br />3.2. 同步project2到project1<br /><br />    svnsync sync svn://localhost/project2 <br />     <br /><br />这时候你update一下你的project2的一个工作拷贝，就会发现有了project1的所有内容。如果project1又有提交，这时候 project2的版本库无法看到最新的变化，还需要再运行一遍sync操作，这样才能将最新的变化同步。需要注意的是，目标版本库只能做成只读的，如果目标版本库发生了变更，则无法继续同步了。<br />3.3. 同步历史属性的修改<br /><br />因为同步不会更新对历史属性的修改，所以svnsync还有子命令copy-revprops，可以同步某个版本的属性。<br />3.4. 钩子自动同步<br /><br />希望在每次提交时同步，则需要在源版本库增加post-commit脚本，内容如下：<br /><br />    echo off<br />    set SVN_HOME="D:\Subversion"<br />    %SVN_HOME%\bin\svnsync sync  --non-interactive svn://localhost/project2 <br />     <br /><br />把以上内容存放为post-commit.bat，然后放到版本库project1下的hooks目录下，这样project1每次提交，都会引起project2的同步。<br /><br />转自：<a href="http://www.subversion.org.cn/index.php?option=com_content&task=view&id=85&Itemid=9" target="_blank">http://www.subversion.org.cn/index.php?option=com_content&task=view&id=85&Itemid=9</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/179043#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 01:59:39 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/179043</link>
        <guid>http://jackytang520.javaeye.com/blog/179043</guid>
      </item>
      <item>
        <title>Subversion的权限控制 </title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/179042" style="color:red;">http://jackytang520.javaeye.com/blog/179042</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在阅读本文之前，请确定你已经知道了Subversion基本的服务器管理，知道了svnserve或Apache的配置，清楚如何设置用户和密码。关于svnserve的配置可以看我们的《Subversion快速入门教程》和《用Apache 和Subversion 搭建安全的版本控制环境》，对于一些细节情参考《使用Subversion进行版本控制》。<br /><br />作为一个配置管理员，需要管理用户的权限，本文主要介绍了使用Subversion的授权文件“authz-db”，同时为了叙述的清晰，我首先澄清一些概念。<br />1，认证（Authentication）和授权（Authorization）<br /><br />这两个术语经常一起出现。其中认证的意思就是鉴别用户的身份，最常见的方式就是使用用户名和密码，授权就是判断用户是否具备某种操作的权限，在 Subversion里提供了“authz-db”文件，实现了以路径为基础的授权，也就是判断用户是否有操作对应路径的权限，在Subversion 1.3之后，svnserve和Apache一样都可以使用“authz-db”文件。<br /><br />2. svnserve下的配置文件<br /><br />因为本文是以svnserve为例的，所以先介绍一下版本库目录的结构：<br /><br />D:\SVNROOT\PROJECT1<br />├─conf<br />├─dav<br />├─db<br />│  ├─revprops<br />│  ├─revs<br />│  └─transactions<br />├─hooks<br />└─locks<br /><br />其中conf下面有三个文件：<br /><br />    authz<br />    passwd<br />    svnserve.conf<br /><br />其中的“svnserve.conf”是这个版本库的配置文件，当使用svnserve时，这个配置文件决定了使用什么认证和授权文件：<br /><br />    password-db = passwd<br />    authz-db = authz<br /><br />上面的配置说明使用“svnserve.conf”同目录的passwd和authz，其中的password-db指定了用户密码文件，authz-db是我们的授权文件，也就是我们本文主要介绍的文件。<br /><br />注意：使用Apache作为服务器时，根本就不会参考“svnserve.conf”文件的内容，而是会参考Apache的配置。<br /><br />3，基于svnserve的版本库文件布局<br /><br />使用svnserve时，为了管理的方便，应该使用相同的认证和授权文件，所以应该让所有版本库的配置文件svnserve.conf指向同一个password-db和authz-db文件。下面是一个多版本库的目录：<br />D:\SVNROOT<br />├─project1<br />│  ├─conf<br />│  ├─dav<br />│  ├─db<br />│  │  ├─revprops<br />│  │  ├─revs<br />│  │  └─transactions<br />│  ├─hooks<br />│  └─locks<br />└─project2<br />    ├─conf<br />    ├─dav<br />    ├─db<br />    │  ├─revprops<br />    │  ├─revs<br />    │  └─transactions<br />    ├─hooks<br />    └─locks<br />   <br />D:\SVNROOT下有两个目录project1和project2，都已经创建了版本库，所以我们修改每个conf目录下的svnserve.conf，使之指向同一个password-db和authz-db文件。<br /><br />password-db = ..\..\passwd<br />authz-db = ..\..\authz<br /><br />这样，D:\SVNROOT\passwd和D:\SVNROOT\authz就控制了所有版本库的svnserve访问。另外在后面的操作中要关闭匿名访问，应该去掉“anon-access = none”前的“#”号，保证只有认证用户可以访问。<br /><br />注意：还有一点需要注意，那就是svnserve的“realm”的值，在上面的设置下，应该保证所有的版本库使用相同的realm值，这样，对版本库的密码缓存可以在多个版本库之间共享，更多细节见客户端凭证缓存。<br />4，测试用户和组说明<br /><br />版本库禁止任何匿名用户的访问，只对认证用户有效。<br /><br />root:配置管理管理员，对版本库有完全的管理权限。<br /><br />p1_admin1:project1的管理员，对project1有完全权限。<br />p1_d1:project1的开发者，对project1的trunk有完全的权限，但是对其中的/trunk/admin目录没有任何权限。<br />p1_t1:project1的测试者，对project1的trunk有完全的读权限，但是对其中的/trunk/admin目录没有任何权限。<br /><br />p2_admin1:project2的管理员，对project2有完全权限。<br />p2_d1:project2的开发者，对project2的trunk有完全的权限，但是对其中的/trunk/admin目录没有任何权限。<br />p2_t1:project2的测试者，对project2的trunk有完全的读权限，但是对其中的/trunk/admin目录没有任何权限。<br /><br /><br />对应的组及组的用户：<br />p1_group_a:p1_admin1<br />p1_group_d:p1_d1<br />p1_group_t:p1_t1<br />p2_group_a:p2_admin1<br />p2_group_d:p2_d1<br />p2_group_t:p2_t1<br /><br /><br />5，修改D:\SVNROOT\passwd文件<br /><br />前面已经说过了，用户和密码文件应该是在D:\SVNROOT\passwd，所以我们为每一位用户设置权限，文件内容如下：<br /><br />    [users]<br />    p1_admin1 = p1_admin1<br />    p1_d1 = p1_d1<br />    p1_t1 = p1_t1<br />             <br />    p2_admin1 = p2_admin1<br />    p2_d1 = p2_d1<br />    p2_t1 = p2_t1<br /><br />为了便于验证，所有密码和用户名一致，如果你使用的是其他认证方式，这一步可能不同，但是用户名应该都是一样的。<br /><br />6，配置授权，修改D:\SVNROOT\authz<br /><br />    [groups]<br />    # 定义组信息<br /><br />    p1_group_a = p1_admin1<br />    p1_group_d = p1_d1<br />    p1_group_t = p1_t1<br /><br />    p2_group_a = p2_admin1<br />    p2_group_d = p2_d1<br />    p2_group_t = p2_t1<br /><br /><br />    [/]<br />    # 指定所有的版本库默认只读，root可读写<br />    * = r<br />    root = rw<br /><br /><br />    [project1:/]<br />    # 指定对版本库project1根目录的权限<br />    @p1_group_a = rw<br />    @p1_group_d = rw<br />    @p1_group_t = r<br /><br />    [project1:/trunk/admin]<br />    # 指定对版本库project1的/trunk/admin根目录的权限，<br />    # p1_group_a读写，p1_group_d和p1_group_t没有任何权限。<br />    @p1_group_a = rw<br />    @p1_group_d =<br />    @p1_group_t =<br /><br />    [project2:/]<br />    # 指定对版本库project2根目录的权限<br />    @p2_group_a = rw<br />    @p2_group_d = rw<br />    @p2_group_t = r<br /><br />    [project2:/trunk/admin]<br />    # 指定对版本库project1的/trunk/admin根目录的权限<br />    @p2_group_a = rw<br />    @p2_group_d =<br />    @p2_group_t = <br /><br /><br />经过以上设置以后，你会发现一些有趣的事情。当使用用户“p1_d1”，检出project1的trunk时，目录是空的，好像admin目录根本不存在一样，当使用p1_d1用户浏览版本库时，能够看到admin目录，但是其中的内容却无法看到。<br /><br />关于中文目录，也是没有问题的，只是注意要把authz文件转化为UTF-8格式，在我的WINXP的UltraEdit里显示的文件格式为U8-DOS，具体的做法是用UltraEdit打开authz文件，然后选择“文件->转换->ASCII转UTF-8”，然后保存。<br /><br />再复杂的情况也不过如此，在实际的工作中要首先规划好权限，只赋给用户最小的权限，保证以最小的配置实现最复杂的权限控制。<br /><br />转自：<a href="http://www.subversion.org.cn/index.php?option=com_content&task=view&id=84&Itemid=9" target="_blank">http://www.subversion.org.cn/index.php?option=com_content&task=view&id=84&Itemid=9</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/179042#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 01:58:37 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/179042</link>
        <guid>http://jackytang520.javaeye.com/blog/179042</guid>
      </item>
      <item>
        <title>FormClientPersistence</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/173075" style="color:red;">http://jackytang520.javaeye.com/blog/173075</a>&nbsp;
          发表时间: 2008年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tapestry's client persistence is great, but can be over-zealous in encoding the data to every URL in sight. Sometimes, what you want is for normal navigation links to remain unsullies, but forms to get the client persisted data so that if they cause a page re-render due to validation, everything still works. This persistence strategy does just that...<br /><br />You'll need a Persistence strategy, a persistence scope, and some hivemodule magic. Once it's done, just use @Persist("client:form") to use.<br /><br />The strategy: <br /><pre name="code" class="java">
package com.zillow.web.infrastructure;

import org.apache.tapestry.engine.ServiceEncoding;
import org.apache.tapestry.record.ClientPropertyPersistenceStrategy;

public class FormClientPropertyPersistenceStrategy extends
                ClientPropertyPersistenceStrategy {
    @Override
    public void addParametersForPersistentProperties(ServiceEncoding encoding, boolean post){
         if ( post )
             super.addParametersForPersistentProperties( encoding, post );
                
        }
}
</pre><br /><br />The scope: <br /><br /><pre name="code" class="java">
package com.zillow.web.infrastructure;

import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.ServiceEncoding;
import org.apache.tapestry.record.AbstractPrefixedClientPropertyPersistenceScope;
import org.apache.tapestry.record.PersistentPropertyData;

public class FormClientPropertyPersistenceScope extends
                AbstractPrefixedClientPropertyPersistenceScope
{
    private IRequestCycle _requestCycle;
    
        public FormClientPropertyPersistenceScope()
        {
                super( "form:" );
        }
        
    public boolean shouldEncodeState(ServiceEncoding encoding, String pageName,
            PersistentPropertyData data)
    {
        return pageName.equals(_requestCycle.getPage().getPageName());
    }

    public void setRequestCycle(IRequestCycle requestCycle)
    {
        _requestCycle = requestCycle;
    }
        
}
</pre><br /><br />The hivemodule config: <br /><br /><pre name="code" class="xml">
&lt;service-point id="FormClientPropertyPersistenceScope" 
                                        interface="org.apache.tapestry.record.ClientPropertyPersistenceScope">
    &lt;invoke-factory>
      &lt;construct class="com.zillow.web.infrastructure.FormClientPropertyPersistenceScope">
        &lt;set-object property="requestCycle" value="infrastructure:requestCycle"/>
      &lt;/construct>
    &lt;/invoke-factory> 
  &lt;/service-point>

  &lt;service-point id="FormClientPropertyPersistenceStrategy" 
                                        interface="org.apache.tapestry.record.PropertyPersistenceStrategy">
    
    &lt;invoke-factory model="threaded">
      &lt;construct class="com.zillow.web.infrastructure.FormClientPropertyPersistenceStrategy">
        &lt;set-object property="request" value="infrastructure:request"/>
        &lt;set-object property="scope" value="service:FormClientPropertyPersistenceScope"/>
      &lt;/construct>
    &lt;/invoke-factory>
    
  &lt;/service-point>

  &lt;contribution configuration-id="tapestry.persist.PersistenceStrategy">
    &lt;strategy name="client:form" object="service:FormClientPropertyPersistenceStrategy"/>
  &lt;/contribution>
</pre><br /><br />转自：<a href="http://wiki.apache.org/tapestry/FormClientPersistence" target="_blank">http://wiki.apache.org/tapestry/FormClientPersistence</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/173075#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Mar 2008 17:10:07 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/173075</link>
        <guid>http://jackytang520.javaeye.com/blog/173075</guid>
      </item>
      <item>
        <title>Tapestry4重复提交官方解决方案</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/172865" style="color:red;">http://jackytang520.javaeye.com/blog/172865</a>&nbsp;
          发表时间: 2008年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          页面类代码（使用注入）：<br /><pre name="code" class="java">
public abstract class MyPage extends BasePage
{
  @Persist("flash")
  public abstract String getMessage();
  
  public abstract void setMessage(String message);
}
</pre><br /><br />不使用注入<br /><pre name="code" class="xml">
&lt;property name="message" persist="flash"/>
</pre><br /><br /><pre name="code" class="java">
@InjectObject("engine-service:page")
  public abstract IEngineService getPageService();
  
  public ILink doFormSubmit()
  {
    // ... write data to a database
    
    setMessage("Your changes have been saved.");
    
    return getPageService().getLink(false, getPageName());
  }   
</pre><br /><br />该解决方案需要Tapestry-Flash包支持，下载地址<a href="http://howardlewisship.com/downloads/tapestry-javaforge/" target="_blank">http://howardlewisship.com/downloads/tapestry-javaforge/</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://jackytang520.javaeye.com/blog/172865#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Mar 2008 10:46:29 +0800</pubDate>
        <link>http://jackytang520.javaeye.com/blog/172865</link>
        <guid>http://jackytang520.javaeye.com/blog/172865</guid>
      </item>
      <item>
        <title>IT项目经理如何学习（四）：IT项目经理的个人知识管理</title>
        <author>jackytang520</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jackytang520.javaeye.com">jackytang520</a>&nbsp;
          链接：<a href="http://jackytang520.javaeye.com/blog/170916" style="color:red;">http://jackytang520.javaeye.com/blog/170916</a>&nbsp;
          发表时间: 2008年03月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前一篇文章还是在9月底写的，这一篇用一些零零碎碎的时间写，实在让大家久等了。这篇想和大家分享的是作为IT项目经理，如何挖掘和利用IT项目经理所需要的学习资源。<br /><br />　　IT项目的特点对我们的学习和反应速度提出了很高的要求，主要表现在<br /><br />　　一、IT项目环境在不断变化，要求IT项目经理不断学习<br /><br />　　IT项目面对的环境包括企业的组织架构、业务流程、企业组织文化、项目团队文化、信息技术、领导风格等等不同因素。你需要不断学习，因为这些因素都在不断变化，而学习的目的就是适应这些变化。<br /><br />　　二、IT项目需求的复杂性，要求IT项目经理具有快速学习和创新能力<br /><br />　　IT项目交付物是无形产品，无论是功能性需求还是技术性需求、易用性需求，影响的因素都非常复杂。你随时都会遇到自己从未思考或学习过的问题。所以，我们总是要考虑如何在最短的时间里，发现最有效的方法和方案。<br /><br />　　三、IT项目经理的时间都非常紧张，学习必须是高效率的。<br />　　<br />　　所以，IT项目经理的学习一定是非常特殊的，否则，很难在有限的时间里完成大型的复杂的项目。<br /><br />那么什么才是IT项目经理最有效的学习之道呢？<br /><br />　　这里给大家分享一些我自己的做法。个人知识管理理论认为，个人知识管理的过程分为四个方面,我们也不妨从这四个方面展开：<br /><br />　　1、FIND:寻找资源<br /><br />　　IT项目经理所需要的学习资源有很多分类,我这里以ERP项目为例，每一类里面我只推荐我比较多使用的网站管理学习资源：<br /> <br />　　通用管理理论：（使用频率：非常低）<a href="/">http://www.12manage.com</a>，该网站支持八种语言。<br />　　阅读过波特、德鲁克、柯普兰等的主要代表作，其他管理理论以MBA教材为主，MBA管理类教材基本都是国外知名大学引进的教材，中文和英文各占一半。对通用管理理论的学习我自认为自己做的是不够的。<br /> <br />　　管理实务：<br />　　主要以搜索引擎搜索为主，无固定网站，如财务、投资、工厂管理、市场营销、信息管理、项目管理、需求管理、知识管理都是我从事过的具体业务和管理工作，需要的工具以专业书籍和搜索引擎搜索为主，推荐google和xunlei就够了。还有一些国内外的数字图书馆，只要有价值我一般自费购买，每年投资在3000元左右；<br /> <br />　　中国管理实践：<br />　　<a href="/">http://cnc.gemag.com.cn/gemag/new/</a>，中文<br /> <br /><br />　　项目管理动态：<br />　　http://www.pmi.org，英文，加入PMI国际会员，以阅读pmi发来的一些刊物为主，网站上的比较少；<br /> <br /><br />　　运营管理：<br />　　<a href="http://www.apics.org" target="_blank">http://www.apics.org</a>,英文，加入APICS国际会员，大量的学习资料和互动交流社区；<br /><br />　　商业案例和管理评论：<br />　　<a href="/">http://www.businessweek.com</a>（商业周刊，业界最前沿的观点发源地）<br />　　<a href="/">http://www.nytimes.com</a>（纽约时报，报道非常及时）<br />　　<a href="/">http://hbswk.hbs.edu/</a>（哈佛商学院的工作知识，每一篇文章的份量都很重）<br /><br />　　IT学习资源，在IT项目中不同角色需要不同的学习资源<br /><br />　　技术动态，以IT专家网为主，基本不买书；要买也是买如&ldquo;世界是平的&rdquo;，&ldquo;长尾理论&rdquo;。如果看书的话，一定会一字不漏全部看完；近期以学习SOA为主。<br /><br />　　技术学习，以IBM开发者社区为主，关于数据库、编程语言、软件架构及相关技术、软件工程、网络、存储等相关的书都会看一些，尤其是前几年，但学习只求一般理解。技术方面只写过部分规划和分析文档，纸上谈兵罢了。<br /><br />　　产品学习，金蝶自身的产品学习自然具有先天的条件，其他以SAP、oracle开发者社区为主,买的SAP和ORALCE产品和光盘资料也比较多，国内可以买到的国外出版的ERP、工作流、供应链、门户等书籍基本都会买，是专业书籍中看得比较认真的部分<br /><br />　　特殊的技术和产品学习：参考各厂商的网站为主，微软的网站访问比较多。<br /><br />　　以上资源，不同的人会有不同的对待方式。重要的其实不在于搜集（collection),而在于发现(find)。同样的资源，不同的人会有不同的发现。我们要更好的发现&ldquo;宝库&rdquo;，还需要具备其他一些条件。通俗一点说，你要具备一双善于&ldquo;发现&rdquo;的眼睛。只要善于发现，互联网上到处都是金子。<br /><br />　　2、connect：连接专家<br /> <br /><br />　　connect这个词现在我们应该深有体会了，你加入任何一个社会网络或社区，其实你都是在不断的和其他人建立连接。金蝶社区的各位同仁和版主都是我的连接对象，此外，早期，我还会与业内不同网站的创始人和主编经常保持联系。这两年主要是与国外的同行交流多一些。这方面我认为自己做的还很不够，需要多向大家学习。<br /><br />　　在阅读文章和资料的时候，我有一个习惯，就是会特别留意文章的作者。熟悉这些作者，并尽量和他们保持联系。这两天见到蔡颖老师，蔡老师说他还记得04年我就与他联系过，我很感动他还记得我。国内确实有一大批优秀的专家，与专家交流，是人生的一大快事！不过，与专家交流，是如何让专家了解你，找到双方沟通的桥梁。如果我们不象专家一样思考，很难与专家保持真正的长久沟通。<br /><br />　　现在已经有了一些网站专门帮助你建立与各类专家的联系，这些网站现在称为社会网络（Social Network）。现在建立社会网络有很多的选择，金蝶社区目前也在进行社会化改造；金蝶友商网甚至干脆将自己的社区称为商务和管理的社会化网络。金蝶以外，畅想网是一个不错的平台。<br /><br />　　我也使用社会化网络，每天至少会有半小时与我的专家网络联系。国内的以金蝶网站为主，国外的以facebook等网站为主。关于社会化网络，后期我可能会有更多的日志和大家分享。我们自己的金蝶社区将在明年年初的时候初步完成社会化网络改造。<br /><br /><br />　　3、learn：系统学习<br /><br />　　互联网的丰富资源可以扩充我们的视野，为学习提供一些参考资料。但我认为真正的学习还是要专下心来，对重点知识领域一个一个的去攻破。作为IT项目经理，特别需要啃下一些基本的IT技术和项目管理的基本专业知识，包括技术方面的管理信息系统（ERP理论）、决策支持系统（商业智能）、软件工程方法（需求管理、分析与设计、软件过程控制、软件测试）、服务器与网络、数据库、分布式计算、SOA、web2.0及其他相关的技术知识；业务方面的会计学、财务管理、供应链管理、运营管理、组织管理、流程管理、项目管理、质量管理、知识管理。现在很多计算机专业的学生可能在大学阶段都或多或少接触过一些这些知识，但是有了一定的实际工作经验后，你可以发现情况又会很不一样。<br /><br />　　在个人知识管理的四个环节中，Learn这个环节无疑是最考验个人的智慧、学习能力和学习意志的。可能大家已经听过很多次，不过，我还是想重点强调一次：这些学习，宜直接选择国外的教材。这是我二十几年的学习和阅读经历证明了的。以上这些知识模块，我大概只有在ERP理论这一部分学习过陈启申教授的那两本书，其他都是选择国外教材。<br /><br />　　在国外有一些电子书网站可以下载到上面提到的大多数的专业领域的教材，<br /><br />　　4、explore:探石问路<br /><br />　　会学习的人总是会带着问题去学习，勤问、勤记永远是学习的最佳法宝。很多人利用互联网都是从在网上发帖子、问问题开始的。当然，你能够得到什么样的解答，取决于你选择的交流平台。我很久没有在社区问过问题了。因为如果有问题的话，我会首先问公司内部的专家，其次是用搜索引擎再其次就是找专家社交圈（social network)的人。令我感动的是，在专家网络中，大多数专家在接到邮件和问题后都能给出非常满意的答复。我相信建立自己的专家网络对个人学习是非常