<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>TO BE OR NOT TO BE</title>
    <description>热爱技术，努力学习</description>
    <link>http://flierlh.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>xfire+spring无缝配置</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/158075" style="color:red;">http://flierlh.javaeye.com/blog/158075</a>&nbsp;
          发表时间: 2008年01月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>web.xml</p><pre name="code" class="java">&lt;context-param&gt;
		&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
		&lt;param-value&gt;classpath:spring/*.xml&lt;/param-value&gt;
	&lt;/context-param&gt;

	&lt;listener&gt;
		&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
	&lt;/listener&gt;

	&lt;servlet&gt;
		&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;
		&lt;servlet-class&gt;
			org.codehaus.xfire.spring.XFireSpringServlet
		&lt;/servlet-class&gt;
		&lt;load-on-startup&gt;2&lt;/load-on-startup&gt;
	&lt;/servlet&gt;

	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/servlet/XFireServlet/*&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;

	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;</pre><p>&nbsp;</p><p>applicationContext.xml:</p><pre name="code" class="java">&lt;import resource=&quot;classpath:org/codehaus/xfire/spring/xfire.xml&quot;/&gt;
    &lt;bean id=&quot;jaxbTypeMappingRegistry&quot;
        class=&quot;org.codehaus.xfire.jaxb2.JaxbTypeRegistry&quot; 
        init-method=&quot;createDefaultMappings&quot; singleton=&quot;true&quot;/&gt;
    &lt;bean id=&quot;webAnnotations&quot;
        class=&quot;org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations&quot;/&gt;
    &lt;bean id=&quot;handlerMapping&quot;
        class=&quot;org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping&quot;&gt;
      &lt;property name=&quot;typeMappingRegistry&quot;&gt;
        &lt;ref bean=&quot;jaxbTypeMappingRegistry&quot;/&gt;
      &lt;/property&gt;
      &lt;property name=&quot;xfire&quot;&gt;
        &lt;ref bean=&quot;xfire&quot;/&gt;
      &lt;/property&gt;
      &lt;property name=&quot;webAnnotations&quot;&gt;
        &lt;ref bean=&quot;webAnnotations&quot;/&gt;
      &lt;/property&gt;
    &lt;/bean&gt;
    &lt;bean class=&quot;org.springframework.web.servlet.handler.SimpleUrlHandlerMapping&quot;&gt;
      &lt;property name=&quot;urlMap&quot;&gt;
        &lt;map&gt;
          &lt;entry key=&quot;/WebService&quot;&gt;
            &lt;ref bean=&quot;handlerMapping&quot;/&gt;
          &lt;/entry&gt;
        &lt;/map&gt;
      &lt;/property&gt;
    &lt;/bean&gt;
    &lt;bean class=&quot;cn.com.aceway.web.webservice.WebServiceImplement&quot;&gt;
    	&lt;property name=&quot;userService&quot; ref=&quot;userService&quot; /&gt;
    &lt;/bean&gt;
    &lt;bean name=&quot;userService&quot; class=&quot;cn.com.aceway.web.webservice.service.UserServiceImpl&quot; /&gt;
</pre><p>&nbsp;</p><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/158075#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, 21 Jan 2008 16:20:29 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/158075</link>
        <guid>http://flierlh.javaeye.com/blog/158075</guid>
      </item>
      <item>
        <title>hibernate不能get字符型主键数据</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/157119" style="color:red;">http://flierlh.javaeye.com/blog/157119</a>&nbsp;
          发表时间: 2008年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          没有找到更好的解决办法：<br /><pre name="code" class="java">
public MusicUsers findById(java.lang.String id) {
		String queryString = "from MusicUsers as model where model.userId = '" + id + "'";
		List&lt;MusicUsers> l = getHibernateTemplate().find(queryString);
		return (MusicUsers) (l.size() == 0 ? null : l.get(0));
}
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/157119#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, 17 Jan 2008 23:53:30 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/157119</link>
        <guid>http://flierlh.javaeye.com/blog/157119</guid>
      </item>
      <item>
        <title>hibernate:Write operations arenot allowed...)</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/157118" style="color:red;">http://flierlh.javaeye.com/blog/157118</a>&nbsp;
          发表时间: 2008年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="cnt"><p>环境 spring＋hibernate3＋struts</p><p><span style="font-family: 宋体">failed to lazily initialize a collection of role: no session or session was closed</span></p><p>试验了一下发现了几个解决方法：</p><p>1、是把对应一对多的那两个列lazy=true改为lazy＝false即可</p><p>2、对于查询中如果用的是xxx.load（class，id）则改为xxx,get(class，id)<br />3在web.xml文件中加入&nbsp;</p><pre name="code" class="xml">&lt;filter&gt;
  &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;
  &lt;filter-class&gt;

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter  

&lt;/filter-class&gt; 

  &lt;init-param&gt;
            &lt;param-name&gt;singleSession&lt;/param-name&gt;
            &lt;param-value&gt;false&lt;/param-value&gt;
        &lt;/init-param&gt; 

&lt;!--这个--  &lt;init-param&gt;一定要加不然很可能会报错：org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition
&gt;
 &lt;/filter&gt;

&lt;filter-mapping&gt;
  &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;
  &lt;url-pattern&gt;*.mmg&lt;/url-pattern&gt;
 &lt;/filter-mapping&gt;
</pre><p>&nbsp;</p></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/157118#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, 17 Jan 2008 23:50:32 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/157118</link>
        <guid>http://flierlh.javaeye.com/blog/157118</guid>
      </item>
      <item>
        <title>我的.emacs</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/153441" style="color:red;">http://flierlh.javaeye.com/blog/153441</a>&nbsp;
          发表时间: 2008年01月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>(global-set-key [f1] 'cvs-examine)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 开始 PCL-CVS<br />(global-set-key [f5] 'undo)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 或许 C-_ 或 C-/ 更方便<br />(global-set-key [f6] 'eshell)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 一个 elisp 写的 shell<br />(global-set-key [f7] 'calendar)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Emacs 的日历系统<br />(global-set-key [f9] 'view-mode)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 只读方式查看文件<br />(global-set-key [f8] 'other-window)&nbsp;&nbsp;&nbsp;&nbsp; ; 跳转到 Emacs 的另一个窗口<br />(global-set-key [f11] 'compile)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 在 Emacs 中编译<br />(global-set-key [f12] 'gdb)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 在 Emacs 中调试<br />;; 这些功能键有时候还是很有用的。除了直接设置之外，还可以配合 Shift, Ctrl 设<br />;; 置，比如：<br />;;<br />;; (global-set-key [(shift f1)] 'goto-line)<br />;;<br />;; 实际上 Shift-F1 也可以用 F13 表示。</p><p>(global-set-key &quot;\C-x\C-b&quot; 'electric-buffer-list)</p><p>;; C-x C-b 缺省的绑定很不好用，改成一个比较方便的 electric-buffer-list，执行<br />;; 之后：<br />;;&nbsp;&nbsp;&nbsp;&nbsp; 光标自动转到 Buffer List buffer 中；<br />;;&nbsp;&nbsp;&nbsp;&nbsp; n, p&nbsp;&nbsp; 上下移动选择 buffer；<br />;;&nbsp;&nbsp;&nbsp;&nbsp; S&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保存改动的 buffer；<br />;;&nbsp;&nbsp;&nbsp;&nbsp; D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除 buffer。<br />;; 除此之外，不错的选择还有 ibuffer，不妨试试 M-x ibuffer。</p><p>(global-set-key &quot;\C-x\C-j&quot; 'dired-jump)<br />;; Dired-x 在 Dired 之上又提供了很多有用的功能，这是其中之一。可以方便的在任<br />;; 何时候跳转到当前目录的 Dired buffer 中。</p><p>(global-set-key &quot;\C-xk&quot; 'kill-this-buffer)<br />;; 按下 C-x k 立即关闭掉当前的 buffer，需要关闭掉别的 buffer 时，按C-x C-b<br />;; 用 D 就 ok 了。</p><p>(global-set-key &quot;\C-c\C-o&quot; 'occur)<br />;; occur 功能，列出当前 buffer 中匹配的行。如果你在 Emacs 阅读这篇说明，试试<br />;; M-x occur RET chunyu RET 和 C-u 2 M-x occur RET chunyu RET。</p><p>(global-set-key &quot;\C-c\C-v&quot; 'view-mode)<br />;; 查看文件，翻页比较方便，不用 C-v M-v 了。</p><p>(global-set-key &quot;\C-c\C-z&quot; 'pop-global-mark)<br />;; 很多文件的时候，在几个文件中跳转到曾经用过的 mark 地方。</p><p>(global-set-key &quot;\C-\\&quot; 'toggle-truncate-lines)<br />;; 基本不用 Emacs 的输入法，绑定给折行命令吧</p><p>(global-set-key &quot;\C-z&quot; 'set-mark-command)<br />;; C-SPC 多数时候都是操作系统的输入法切换，set-mark-command 无论如何都要设置<br />;; 在一个方便的位置。而用来挂起 Emacs 的命令可以用 C-x C-z，也很方便。</p><p>(global-set-key &quot;\M-/&quot; 'hippie-expand)<br />;; 自动补全，M-/ 原来的绑定 dabbrev-expand 也是这个功能，然而 hippie-expand<br />;; 功能更强而且可以扩展。</p><p>(global-set-key &quot;\M-o&quot; 'other-window)<br />;; 除了在 Dired buffer 中，基本都可以用来 other-window。</p><p>(global-set-key &quot;\M-n&quot; 'gnus)<br />;; 启动新闻组客户端 gnus。</p><p>;;(global-set-key [(home)] 'beginning-of-buffer)<br />;;(global-set-key [(end)] 'end-of-buffer)<br />;; 以前的 Emacs 都是如此绑定的，Emacs 21 之后反而使我不习惯了。不过现在我已<br />;; 经基本不用了，因为 M-&lt; 和 M-&gt; 更方便。而且，如果你是新手，还是行首和行尾<br />;; 更直观。</p><p>;;(global-set-key [(insertchar)] 'overwrite-mode)<br />;; 平时用 PuTTY 登陆到 Linux 机器上使用，但是不知道为什么 INSERT 键到了<br />;; Emacs 中变成 insertchar 了，索性从新绑定一下。</p><p>(define-prefix-command 'ctl-x-m-map)<br />(global-set-key &quot;\C-xm&quot; 'ctl-x-m-map)<br />;; 定义了一个新的前缀，并且绑定到 C-x m，后面给这个前缀绑定一些键。而原来的<br />;; mail 对我基本没用处，或许都是因为 gnus :)。</p><p>(define-key ctl-x-m-map &quot;s&quot; 'dictionary-search)<br />;; 【dictionary.el】查词典。</p><p>(define-key ctl-x-m-map &quot;c&quot; 'boxquote-shell-command)<br />(define-key ctl-x-m-map &quot;f&quot; 'boxquote-describe-function)<br />(define-key ctl-x-m-map &quot;i&quot; 'boxquote-insert-file)<br />(define-key ctl-x-m-map &quot;k&quot; 'boxquote-describe-key)<br />(define-key ctl-x-m-map &quot;p&quot; 'boxquote-paragraph)<br />(define-key ctl-x-m-map &quot;r&quot; 'boxquote-region)<br />(define-key ctl-x-m-map &quot;t&quot; 'boxquote-title)<br />(define-key ctl-x-m-map &quot;u&quot; 'boxquote-unbox)<br />(define-key ctl-x-m-map &quot;v&quot; 'boxquote-describe-variable)<br />(define-key ctl-x-m-map &quot;y&quot; 'boxquote-yank)<br />;;【boxquote.el】在邮件或新闻组中做出漂亮的引用。</p><p>(define-key ctl-x-m-map &quot;e&quot; 'cvs-examine)<br />;; 开始 PCL-CVS。</p><p>(define-key ctl-x-m-map &quot;m&quot; 'man-follow)<br />;; 查看光标处的单词的 man page。</p><p>(define-key ctl-x-m-map &quot;g&quot; 'run-scheme)<br />;; 启动 scheme 交互环境。</p><p>(define-key ctl-x-m-map &quot;b&quot; 'list-bookmarks)<br />;; 列出所有书签。<br />;; C-x r m BOOKMARK RET 将当前文档的当前位置，设置为名字是 BOOKMARK 的书签；<br />;; C-r r b BOOKMARK RET 跳转到名字为 BOOKMARK 的书签。</p><p>(define-key ctl-x-m-map &quot;l&quot; 'browse-kill-ring)<br />;;【browse-kill-ring.el】查看 kill-ring，都曾经 kill 过哪些文本。</p><p>(define-key ctl-x-m-map &quot;a&quot; 'align-current)<br />;; 重新排列为整齐的格式。参考 EMACSDIR/lisp/align.el 的注释。</p><p>(define-key ctl-x-m-map &quot;w&quot; 'ibuffer)<br />;; 管理 Emacs 所打开的 buffer。</p><p>(define-prefix-command 'meta-m-map)<br />(global-set-key &quot;\M-m&quot; 'meta-m-map)<br />(define-key meta-m-map &quot;\M-m&quot; 'back-to-indentation)<br />;; 原来 M-m 所绑定的键，现在放在 M-m M-m，同时 M-m 成为了另一个前缀。</p><p>(define-key meta-m-map &quot;\M-i&quot; 'imenu)<br />;; 用当前缓冲中所定义的函数之类移动光标。imenu 自动的扫描所打开的文件，根据<br />;; 内容以及相应的模式判断那些可以作为索引项。打开一个已经写的差不多的 C 文件，<br />;; M-x imenu RET 试试。<br />;; 环境的设置 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</p><p>(setq inhibit-startup-message t)<br />;; 不显示 Emacs 的开始画面。</p><p>(setq default-major-mode 'text-mode)<br />;; 任意的打开一个新文件时，缺省使用 text-mode。</p><p>(setq next-line-add-newlines nil)<br />;; Emacs 21 中已经是缺省设置。按 C-n 或向下键时不添加新行。</p><p>(setq require-final-newline t)<br />;; 存盘的时候，要求最后一个字符时换行符。</p><p>(setq resize-mini-windows nil)<br />;; mini buffer 的大小保持不变。</p><p>(setq track-eol t)<br />;; 当光标在行尾上下移动的时候，始终保持在行尾。</p><p>(setq Man-notify-method 'pushy)<br />;; 当浏览 man page 时，直接跳转到 man buffer。</p><p>(setq uniquify-buffer-name-style 'forward)<br />;; 当有两个文件名相同的缓冲时，使用前缀的目录名做 buffer 名字，不用原来的<br />;; foobar&lt;?&gt; 形式。</p><p>(setq suggest-key-bindings 1)<br />;; 当使用 M-x COMMAND 后，过 1 秒钟显示该 COMMAND 绑定的键。</p><p>(setq line-number-display-limit 1000000)<br />;; 当行数超过一定数值，不再显示行号。</p><p>(setq kill-ring-max 200)<br />;; kill-ring 最多的记录个数。</p><p>(setq ring-bell-function 'ignore)<br />;; 彻底的消除 ring-bell 的效果。</p><p>(setq apropos-do-all nil)<br />;; M-x apropos 时多查询些结果，但需要更多的 CPU。</p><p>(setq bookmark-save-flag 1)<br />;; 每当设置书签的时候都保存书签文件，否则只在你退出 Emacs 时保存。</p><p>(setq bookmark-default-file &quot;~/.emacs.d/.emacs.bmk&quot;)<br />;; 缺省书签文件的路径及文件名。</p><p>(setq dired-listing-switches &quot;-avl&quot;)<br />;; Dired buffer 中列出文件时传递给 ls 的参数。加个 &quot;l&quot; 可以使大写的文件名在<br />;; 顶部，临时的改变可以用 C-u s。</p><p>(setq dired-recursive-copies t)<br />(setq dired-recursive-deletes t)<br />;; 复制(删除)目录的时，第归的复制(删除)其中的子目录。</p><p>(setq cvs-dired-use-hook 'always)<br />;; 在一个 CVS 本地拷贝目录的 Dired buffer 中时，如果进入 CVS 目录，自动进入<br />;; PCL-CVS 界面。</p><p>(setq abbrev-file-name &quot;~/.emacs.d/.abbrev_defs&quot;)<br />;; 缺省的定义缩写的文件。</p><p>(setq custom-file &quot;~/.emacs.d/.emacs_custom.el&quot;)<br />;; M-x customize 功能保存设置的文件。默认的是 Emacs 的初始化文件 .emacs。</p><p>(setq display-time-24hr-format t)<br />(setq display-time-day-and-date t)<br />(setq display-time-use-mail-icon t)<br />(setq display-time-interval 10)<br />;; 在 mode-line 上显示时间。</p><p>(setq gnus-inhibit-startup-message t)<br />(setq gnus-init-file &quot;~/.emacs.d/.gnus.el&quot;)<br />;; 设置 gnus 的初始化文件。</p><p>(setq mail-signature-file &quot;~/.sig/default&quot;)<br />(setq mail-user-agent 'gnus-user-agent)<br />(setq mail-alias-file &quot;~/.mailrc&quot;)<br />;; 关于 mail 的简单设置，其他的和 mail 相关的东西都在 .gnus.el 中。</p><p>(setq user-full-name &quot;Your Name&quot;)<br />(setq user-mail-address &quot;<a href="mailto:yourmail@address.com">yourmail@address.com</a>&quot;)<br />;; 缺省的名字和邮件地址，很多地方用得到，比如 VC(version control) 中产生<br />;; ChangeLog 文件。</p><p>(setq time-stamp-active t)<br />(setq time-stamp-warn-inactive t)<br />(setq time-stamp-format &quot;%:y-%02m-%02d %3a %02H:%02M:%02S chunyu&quot;)<br />;; 设置时间戳，标识出最后一次保存文件的时间。</p><p>(setq diary-file &quot;~/.emacs.d/.diary&quot;)<br />;; 默认的日记文件</p><p>(setq calendar-latitude +45.75)<br />(setq calendar-longitude +126.63)<br />(setq calendar-location-name &quot;Harbin&quot;)<br />;; 设置所在地的经纬度和地名，calendar 可以根据这些信息告知你每天的日出和日落<br />;; 的时间。</p><p>(setq calendar-remove-frame-by-deleting t)<br />(setq calendar-week-start-day 1)<br />(setq christian-holidays nil)<br />(setq hebrew-holidays nil)<br />(setq islamic-holidays nil)<br />(setq solar-holidays nil)<br />(setq general-holidays '((holiday-fixed 1 1 &quot;元旦&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (holiday-fixed 4 1 &quot;愚人节&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (holiday-float 5 0 2 &quot;母亲节&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (holiday-float 6 0 3 &quot;父亲节&quot;)))<br />;; 去掉了我不感兴趣的节日。</p><p>(setq mark-diary-entries-in-calendar t)<br />(setq appt-issue-message nil)<br />(setq mark-holidays-in-calendar nil)<br />(setq view-calendar-holidays-initially nil)</p><p>(setq chinese-calendar-celestial-stem<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&quot;甲&quot; &quot;乙&quot; &quot;丙&quot; &quot;丁&quot; &quot;戊&quot; &quot;己&quot; &quot;庚&quot; &quot;辛&quot; &quot;壬&quot; &quot;癸&quot;])<br />(setq chinese-calendar-terrestrial-branch<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&quot;子&quot; &quot;丑&quot; &quot;寅&quot; &quot;卯&quot; &quot;辰&quot; &quot;巳&quot; &quot;午&quot; &quot;未&quot; &quot;申&quot; &quot;酉&quot; &quot;戌&quot; &quot;亥&quot;])<br />;; Calendar 中 p C 可以看到我们的阴历有中文的天干地支。</p><p>(setq todo-file-do &quot;~/.emacs.d/todo-do&quot;)<br />(setq todo-file-done &quot;~/.emacs.d/todo-done&quot;)<br />(setq todo-file-top &quot;~/.emacs.d/todo-top&quot;)<br />;; Emacs TODO 模式的相关文件。</p><p>(setq version-control t)<br />(setq kept-old-versions 2)<br />(setq kept-new-versions 5)<br />(setq delete-old-versions t)<br />(setq backup-directory-alist '((&quot;.&quot; . &quot;~/var/tmp&quot;)))<br />(setq backup-by-copying t)<br />;; Emacs 中，改变文件时，默认都会产生备份文件(以 ~ 结尾的文件)。可以完全去掉<br />;; (并不可取)，也可以制定备份的方式。这里采用的是，把所有的文件备份都放在一<br />;; 个固定的地方(&quot;~/var/tmp&quot;)。对于每个备份文件，保留最原始的两个版本和最新的<br />;; 五个版本。并且备份的时候，备份文件是复本，而不是原件。</p><p>(setq font-lock-maximum-decoration t)<br />(setq font-lock-global-modes '(not shell-mode text-mode))<br />(setq font-lock-verbose t)<br />(setq font-lock-maximum-size '((t . 1048576) (vm-mode . 5250000)))<br />;; 语法高亮。除 shell-mode 和 text-mode 之外的模式中使用语法高亮。</p><p>(setq hippie-expand-try-functions-list<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '(try-expand-line<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-expand-line-all-buffers<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-expand-list<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-expand-list-all-buffers<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-expand-dabbrev<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-expand-dabbrev-visible<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-expand-dabbrev-all-buffers<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-expand-dabbrev-from-kill<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-complete-file-name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-complete-file-name-partially<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-complete-lisp-symbol<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-complete-lisp-symbol-partially<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try-expand-whole-kill))<br />;; hippie-expand 所使用的补全函数及使用的顺序。</p><p>(setq ido-enable-tramp-completion t)<br />;; ido 模式中，使用 tramp 的补全方式。<br />(setq ido-save-directory-list-file nil)<br />;; ido 模式中不保存目录列表。</p><p>(setq tramp-unified-filenames t)<br />(setq ange-ftp-generate-anonymous-password &quot;<a href="mailto:user@cyber.net">user@cyber.net</a>&quot;)<br />(setq ange-ftp-default-user t)<br />;; 用于编辑远程文件的 tramp 和 ange-ftp 的设置。</p><p>(setq quack-default-program &quot;guile&quot;)<br />(setq quack-fontify-style nil)<br />;;【quack.el】scheme 的交互环境。</p><p>(setq bbdb-file &quot;~/.emacs.d/.bbdb&quot;)<br />;;【bbdb】一个很好用的地址簿，保存你的联系人信息。</p><p>(setq-default kill-whole-line t)<br />;; 在行首 C-k 时，同时删除该行。</p><p>(set-register ?e '(file . &quot;~/.emacs.d/.emacs.el&quot;))<br />(set-register ?g '(file . &quot;~/.emacs.d/.gnus.el&quot;))<br />;; C-x r j e 就打开了我的 .emacs 配置文件。</p><p>(setenv &quot;DISPLAY&quot; &quot;chunyu:0&quot;)<br />;; 设置显示变量，到我的 Windwos 机器，上面装了 X-Win32，用来显示 Linux 机器<br />;; 上的 X 程序。</p><p>(set-language-environment 'Chinese-GB)<br />;; 默认的语言。<br />(set-keyboard-coding-system 'chinese-iso-8bit)<br />;; 键盘输入，用于输入法。<br />(set-terminal-coding-system 'chinese-iso-8bit)<br />;; 终端显示的编码方式。<br />(set-clipboard-coding-system 'chinese-iso-8bit)<br />;; 剪切板，用于和其他程序之间复制内容</p><p>(fset 'yes-or-no-p 'y-or-n-p)<br />;; 改变 Emacs 固执的要你回答 yes 的行为。按 y 或空格键表示 yes，n 表示 no。</p><p>(minibuffer-electric-default-mode 1)</p><p>(partial-completion-mode 1)<br />;; M-x t-t-l RET 就可以执行 M-x toggle-truncate-lines。其中的 &quot;-&quot; 除按空格键<br />;; 就可以。</p><p>(global-font-lock-mode 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 开启语法高亮。<br />(auto-compression-mode 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 打开压缩文件时自动解压缩。<br />(column-number-mode 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 显示列号。<br />(blink-cursor-mode -1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 光标不要闪烁。<br />(display-time-mode 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 显示时间。<br />(show-paren-mode 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 高亮显示匹配的括号。<br />(menu-bar-mode -1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 不要 menu-bar。<br />(icomplete-mode 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 给出用 M-x foo-bar-COMMAND 输入命令的提示。<br />(ido-mode 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 打开文件和转换 buffer 的方便模式。</p><p>(add-hook 'diary-hook 'appt-make-list)<br />(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)<br />;; shell 中打开 ansi-color 支持。</p><p>(add-hook 'comint-output-filter-functions 'comint-watch-for-password-prompt)</p><p>(add-hook 'write-file-hooks 'time-stamp)<br />;; 自动更新 time-stamp。</p><p>(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)<br />;; Dired 中 C-c C-a 作为附件发送。</p><p>(add-hook 'dired-load-hook<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda ()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (load &quot;dired-x&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq dired-view-command-alist<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '((&quot;[.]\\(ps\\|ps_pages\\|eps\\)\\'&quot; . &quot;gv -spartan -color -watch %s&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;[.]pdf\\'&quot; . &quot;xpdf %s&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;[.]\\(jpe?g\\|gif\\|png\\)\\'&quot; . &quot;ee %s&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;[.]dvi\\'&quot; . &quot;xdvi -sidemargin 0.5 -topmargin 1 %s&quot;)))))<br />;; 开启 Dired-x 所提供的新功能，设置 Dired 中 v 使用的相应程序。</p><p>(add-hook 'message-setup-hook<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda ()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define-key message-mode-map &quot;\M-/&quot; 'chunyu-message-expand)))<br />(defun chunyu-message-expand (&amp;optional arg)<br />&nbsp; &quot;message mode expand.&quot;<br />&nbsp; (interactive)<br />&nbsp; (if (message-point-in-header-p)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (bbdb-complete-name arg)<br />&nbsp;&nbsp;&nbsp; (hippie-expand arg)))<br />;; Message buffer 中的 M-/ 使用自己定义的补全方法 chunyu-message-expand。<br />;; 当在邮件头中的时候，使用 bbdb-complete-name 补全；而在其他地方，使用缺省<br />;; 的 hippie-expand 补全。<br />(add-hook 'ido-define-mode-map-hook<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda ()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define-key ido-mode-map &quot;\M-\d&quot; 'ido-delete-backward-updir)))<br />;; 由于使用 ido 之前的习惯，经常用 M-Backspace 来删除 mini-buffer 中的文件名，<br />;; 而 ido 的绑定中虽然有却不好用，索性从新绑定一下。</p><p>(add-hook 'c-mode-common-hook<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda ()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (c-toggle-auto-hungry-state 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (which-func-mode 1)))<br />;; auto-newline&nbsp; 子模式，自动换行缩进；<br />;; hungry-delete 子模式，一个 Backspace 删除尽可能多的空白；<br />;; which-func-mode 在模式行中显示当前行在哪个函数中。</p><p>(cond ((not window-system)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; 如果不在 window 环境中(字符界面时)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq frame-background-mode 'dark)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; 设置背景为黑的，这样 Emacs 的很多缺省颜色会和黑色背景协调。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (eval-after-load &quot;log-view&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; 设置 log-view 的颜色。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '(progn<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set-face-attribute 'log-view-file-face nil :foreground &quot;blue&quot; :weight 'bold)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set-face-attribute 'log-view-message-face nil :foreground &quot;yellow&quot; :weight 'bold))))</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((eq window-system 'x)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; 如果在 X Window 中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (global-set-key (kbd &quot;C--&quot;) 'undo)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; Console 中习惯了 C-_ 作为 Undo，不妨把这个也改过来。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq visible-bell t)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; X Window 中的 visible-bell 还是很好看的。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq x-stretch-cursor nil)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; 如果设置为 t，光标在 TAB 字符上会显示为一个大方块 :)。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (scroll-bar-mode -1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (tool-bar-mode -1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; 不要 tool-bar 和 scroll-bar。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq default-frame-alist<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; 缺省的颜色设置。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `((vertical-scroll-bars)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (top . 0) (left . 0) (width . 111) (height . 48)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (background-color . &quot;DarkSlateGrey&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (foreground-color . &quot;Wheat&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cursor-color&nbsp;&nbsp;&nbsp;&nbsp; . &quot;gold1&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (mouse-color&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . &quot;gold1&quot;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (font . &quot;9x15&quot;)))</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; 其他颜色设置。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (facep 'mode-line)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set-face-attribute 'mode-line nil :foreground &quot;DarkSlateGrey&quot; :background &quot;Wheat&quot;))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (facep 'fringe)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set-face-attribute 'fringe nil :foreground &quot;limegreen&quot; :background &quot;gray30&quot;))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (facep 'tool-bar)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set-face-background 'tool-bar &quot;DarkSlateGrey&quot;))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (facep 'menu)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (face-spec-set 'menu '((t (:foreground &quot;Wheat&quot; :background &quot;DarkSlateGrey&quot;)))))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (facep 'trailing-whitespace)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set-face-background 'trailing-whitespace &quot;SeaGreen1&quot;))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (facep 'minibuffer-prompt)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (face-spec-set 'minibuffer-prompt '((t (:foreground &quot;cyan&quot;)))))))<br />(autoload 'big5togb-region &quot;big5togb&quot; &quot;Big5 to GB2312&quot; t)<br />;;【big5togb.el】ZSH 写的将 big5 文本转为 gb2312 的包。</p><p>(autoload 'css-mode &quot;css-mode&quot; &quot;CSS editing mode&quot; t)<br />;;【css-mode.el】编辑 css 文件。</p><p>(autoload 'python-mode &quot;python-mode&quot; &quot;Python editing mode.&quot; t)<br />(autoload 'py-shell &quot;python-mode&quot; &quot;Python shell&quot; t)<br />;;【python-mode.el】<a href="http://www.python.org/">www.python.org</a> 上面的 python-mode</p><p>(autoload 'run-scheme &quot;quack&quot; &quot;Quack scheme editing mode&quot; t)<br />(autoload 'scheme-mode &quot;quack&quot; &quot;Quack scheme editing mode&quot; t)<br />;;【quack.el】scheme 模式和交互模式。</p><p>(autoload 'html-helper-mode &quot;html-helper-mode&quot; &quot;Yay HTML&quot; t)<br />;;【html-helper-mode.el】一个不错的 html 编辑模式。</p><p>(autoload 'htmlize-buffer &quot;htmlize&quot; &quot;HTMLize mode&quot; t)<br />;;【htmlize.el】把 buffer 中的内容连同颜色转为 html 格式。</p><p>(autoload 'browse-kill-ring &quot;browse-kill-ring&quot; &quot;Browse kill ring&quot; t)<br />;;【browse-kill-ring.el】查看 kill-ring，都曾经 kill 过哪些文本。</p><p>(autoload 'folding-mode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;folding&quot; &quot;Folding mode&quot; t)<br />(autoload 'turn-off-folding-mode &quot;folding&quot; &quot;Folding mode&quot; t)<br />(autoload 'turn-on-folding-mode&nbsp; &quot;folding&quot; &quot;Folding mode&quot; t)<br />;;【folding.el】编辑文本的一部分，将其他部分折叠起来。</p><p>(setq auto-mode-alist<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;; 将文件模式和文件后缀关联起来。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (append '((&quot;<a href="file://.py//'">\\.py\\'</a>&quot; . python-mode)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;<a href="file://.s/?html?\\'">\\.s?html?\\'</a>&quot; . html-helper-mode)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;<a href="file://.asp//'">\\.asp\\'</a>&quot; . html-helper-mode)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;<a href="file://.phtml//'">\\.phtml\\'</a>&quot; . html-helper-mode)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&quot;<a href="file://.css//'">\\.css\\'</a>&quot; . css-mode))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto-mode-alist))</p><p>(add-to-list 'load-path &quot;~/.emacs.d/elisp&quot;)<br />(add-to-list 'load-path &quot;~/.emacs.d/elisp/tramp&quot;)<br />(add-to-list 'backup-directory-alist (cons tramp-file-name-regexp nil))<br />;(require 'gnus-load)<br />;(require 'tex-site)<br />;(require 'boxquote)<br />;(require 'compile)<br />;(require 'dired-tar)<br />;;【dired-tar.el】Dired 中用 T 就把一个目录压缩为一个 .tar.gz 文件。</p><p>(require 'uniquify)<br />(require 'flyspell)</p><p>(put 'dired-find-alternate-file 'disabled nil)<br />(put 'downcase-region 'disabled nil)<br />(put 'narrow-to-page 'disabled nil)<br />(put 'narrow-to-region 'disabled nil)<br />(put 'set-goal-column 'disabled nil)<br />(put 'upcase-region 'disabled nil)<br />(put 'rmail 'disabled t)</p><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/153441#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>Sun, 06 Jan 2008 09:18:32 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/153441</link>
        <guid>http://flierlh.javaeye.com/blog/153441</guid>
      </item>
      <item>
        <title>emacs插件集锦</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/152909" style="color:red;">http://flierlh.javaeye.com/blog/152909</a>&nbsp;
          发表时间: 2008年01月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CSCOPE:<br /><a href="http://cscope.sourceforge.net/" target="_blank">http://cscope.sourceforge.net/</a><br /> <br />ecb:<br /><a href="http://ecb.sourceforge.net/" target="_blank">http://ecb.sourceforge.net/</a><br /> <br />cedet：<br /><a href=" http://cedet.sourceforge.net/" target="_blank"> http://cedet.sourceforge.net/</a><br />doxymacs : 这是一个按照doxy风格生成注释的工具。使代码可以更方便的生成文档<br /><a href="http://sourceforge.net/projects/doxymacs" target="_blank">http://sourceforge.net/projects/doxymacs</a><br /><br />配置emacs<br /> <br /> <br />一切就绪后，就需要配置emacs了。在C盘根目录下建立一个.emacs文本文件，输入配置内容。以下是我的配置文件内容：<br />(require 'xcscope) ;;加载xcscope<br />(require 'cedet) ;;加载cedet<br />(require 'ecb) ;;加载ecb<br />(require 'session) ;;加载session<br />(add-hook 'after-init-hook 'session-initialize) ;; 启动时初始化session<br />(require 'doxymacs) ;; 启动doxymacs<br />(add-hook 'c-mode-common-hook 'doxymacs-mode) ;; 启动doxymacs-mode<br />(add-hook 'c++-mode-common-hook 'doxymacs-mode) ;; 启动doxymacs-mode<br />(desktop-load-default) ;;读取默认desktop设置<br />(desktop-read) ;;读取当前目录保存的desktop设置<br />(set-face-background 'default "LightCyan3") ;;设置背景色为 浅青色3<br />(set-face-font 'default "-outline-新宋体-normal-r-normal-normal-*-*-96-96-c-*-iso8859-1") ;;设置字体为新宋体 ( Only for windows )<br />(global-set-key [f12] 'ecb-activate) ;;定义F12键为激活ecb<br />(global-set-key [C-f12] 'ecb-deactivate) ;;定义Ctrl+F12为停止ecb<br />(global-set-key [f11] 'delete-other-windows) ;;设置F11为删除其它窗口<br />(global-set-key [(meta return)] 'semantic-ia-complete-symbol-menu) ;;设置Alt+Enter为自动补全菜单<br />(global-set-key [C-\;] 'ecb-goto-window-edit-last) ;;切换到编辑窗口<br />(global-set-key [C-\'] 'ecb-goto-window-methods) ;;切换到函数窗口<br />(global-set-key [C-.] 'cscope-find-global-definition) ;;搜索定义<br />(global-set-key [C-,] 'cscope-pop-mark) ;; 跳出转向<br />(enable-visual-studio-bookmarks) ;; 启动VS书签子程序<br />;;(setq semanticdb-project-roots (list "d:/work")) ;; 设置cemanticdb的扫描根目录<br />(add-hook 'c-mode-common-hook ( lambda() ( c-set-style "k&r" ) ) ) ;;设置C语言默认格式<br />(add-hook 'c++-mode-common-hook ( lambda() ( c-set-style "k&r" ) ) ) ;;设置C++语言默认格式
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/152909#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 Jan 2008 18:43:56 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/152909</link>
        <guid>http://flierlh.javaeye.com/blog/152909</guid>
      </item>
      <item>
        <title>hibernate的保存（转）</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/135395" style="color:red;">http://flierlh.javaeye.com/blog/135395</a>&nbsp;
          发表时间: 2007年10月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>hibernate对于对象的保存提供了太多的方法，他们之间有很多不同，这里细说一下，以便区别：<br />
一、预备知识：<br />
在所有之前，说明一下，对于hibernate，它的对象有三种状态，transient、persistent、detached<br />
下边是常见的翻译办法：<br />
transient：瞬态或者自由态<br />
persistent：持久化状态<br />
detached：脱管状态或者游离态</p>
<p>脱管状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。<br />
持久化实例可以通过调用 delete()变成脱管状态。通过get()或load()方法得到的实例都是持久化状态的。<br />
脱管状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。</p>
<p>save()和persist()将会引发SQL的INSERT，delete()会引发SQLDELETE，<br />
而update()或merge()会引发SQLUPDATE。对持久化（persistent）实例的修改在刷新提交的时候会被检测到，<br />
它也会引起SQLUPDATE。saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE</p>
<p>二、save 和update区别<br />
把这一对放在第一位的原因是因为这一对是最常用的。<br />
save的作用是把一个新的对象保存<br />
update是把一个脱管状态的对象保存</p>
<p>三,update 和saveOrUpdate区别<br />
这个是比较好理解的，顾名思义，saveOrUpdate基本上就是合成了save和update<br />
引用hibernate reference中的一段话来解释他们的使用场合和区别<br />
通常下面的场景会使用update()或saveOrUpdate()： <br />
程序在第一个session中加载对象 <br />
该对象被传递到表现层 <br />
对象发生了一些改动 <br />
该对象被返回到业务逻辑层 <br />
程序调用第二个session的update()方法持久这些改动 </p>
<p>saveOrUpdate()做下面的事: <br />
如果对象已经在本session中持久化了，不做任何事 <br />
如果另一个与本session关联的对象拥有相同的持久化标识(identifier)，抛出一个异常 <br />
如果对象没有持久化标识(identifier)属性，对其调用save() <br />
如果对象的持久标识(identifier)表明其是一个新实例化的对象，对其调用save() <br />
如果对象是附带版本信息的（通过<version>或<timestamp>） 并且版本属性的值表明其是一个新实例化的对象，save()它。 <br />
否则update() 这个对象 </timestamp></version></p>
<p>四,persist和save区别<br />
这个是最迷离的一对，表面上看起来使用哪个都行，在hibernate reference文档中也没有明确的区分他们.<br />
这里给出一个明确的区分。（可以跟进src看一下，虽然实现步骤类似，但是还是有细微的差别）<br />
这里参考<a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682">http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682</a>中的一个说明：<br />
---------------------------------------------------------------------------------<br />
I found that a lot of people have the same doubt. To help to solve this issue <br />
I'm quoting Christian Bauer:<br />
&quot;In case anybody finds this thread...</p>
<p>persist() is well defined. It makes a transient instance persistent. However, <br />
it doesn't guarantee that the identifier value will be assigned to the persistent <br />
instance immediately, the assignment might happen at flush time. The spec doesn't say <br />
that, which is the problem I have with persist().</p>
<p>persist() also guarantees that it will not execute an INSERT statement if it is <br />
called outside of transaction boundaries. This is useful in long-running conversations <br />
with an extended Session/persistence context.A method like persist() is required.</p>
<p>save() does not guarantee the same, it returns an identifier, and if an INSERT <br />
has to be executed to get the identifier (e.g. &quot;identity&quot; generator, not &quot;sequence&quot;), <br />
this INSERT happens immediately, no matter if you are inside or outside of a transaction. This is not good in a long-running conversation with an extended Session/persistence context.&quot;</p>
<p>---------------------------------------------------------------------------------<br />
简单翻译一下上边的句子的主要内容：<br />
1，persist把一个瞬态的实例持久化，但是并&quot;不保证&quot;标识符被立刻填入到持久化实例中，标识符的填入可能被推迟<br />
到flush的时间。</p>
<p>2，persist&quot;保证&quot;，当它在一个transaction外部被调用的时候并不触发一个Sql Insert，这个功能是很有用的，<br />
当我们通过继承Session/persistence context来封装一个长会话流程的时候，一个persist这样的函数是需要的。</p>
<p>3，save&quot;不保证&quot;第2条,它要返回标识符，所以它会立即执行Sql insert，不管是不是在transaction内部还是外部</p>
<p><br />
五,saveOrUpdateCopy,merge和update区别<br />
首先说明merge是用来代替saveOrUpdateCopy的，这个详细见这里<br />
<a href="http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html">http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html</a><br />
然后比较update和merge<br />
update的作用上边说了，这里说一下merge的<br />
如果session中存在相同持久化标识(identifier)的实例，用用户给出的对象的状态覆盖旧有的持久实例 <br />
如果session没有相应的持久实例，则尝试从数据库中加载，或创建新的持久化实例,最后返回该持久实例 <br />
用户给出的这个对象没有被关联到session上，它依旧是脱管的 <br />
重点是最后一句：<br />
当我们使用update的时候，执行完成后，我们提供的对象A的状态变成持久化状态<br />
但当我们使用merge的时候，执行完成，我们提供的对象A还是脱管状态，hibernate或者new了一个B，或者检索到<br />
一个持久对象B，并把我们提供的对象A的所有的值拷贝到这个B，执行完成后B是持久状态，而我们提供的A还是托管状态</p>
<p>六,flush和update区别<br />
这两个的区别好理解<br />
update操作的是在脱管状态的对象<br />
而flush是操作的在持久状态的对象。<br />
默认情况下，一个持久状态的对象是不需要update的，只要你更改了对象的值，等待hibernate flush就自动<br />
保存到数据库了。hibernate flush发生再几种情况下：<br />
1，调用某些查询的时候<br />
2，transaction commit的时候<br />
3，手动调用flush的时候 </p>
<p>七,lock和update区别<br />
update是把一个已经更改过的脱管状态的对象变成持久状态<br />
lock是把一个没有更改过的脱管状态的对象变成持久状态<br />
对应更改一个记录的内容，两个的操作不同：<br />
update的操作步骤是：<br />
（1）更改脱管的对象-&gt;调用update<br />
lock的操作步骤是：<br />
(2)调用lock把对象从脱管状态变成持久状态--&gt;更改持久状态的对象的内容--&gt;等待flush或者手动flush</p>
<p>参考内容：<br />
<a href="http://www.blogjava.net/iamtin/archive/2006/03/06/33910.aspx">http://www.blogjava.net/iamtin/archive/2006/03/06/33910.aspx</a><br />
<a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682">http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682</a><br />
<a href="http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/objectstate.html">http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/objectstate.html</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/135395#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, 25 Oct 2007 11:46:29 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/135395</link>
        <guid>http://flierlh.javaeye.com/blog/135395</guid>
      </item>
      <item>
        <title>sed命令使用详解（转）</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/132809" style="color:red;">http://flierlh.javaeye.com/blog/132809</a>&nbsp;
          发表时间: 2007年10月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td align="center" height="65"><span twffan="done" style="font-size: 12pt;"><strong>sed命令使用详解 </strong></span></td>
        </tr>
        <tr>
            <td align="right" height="31" style="border-bottom: 1px solid rgb(204, 204, 204);">文章作者：红箭 发布时间：2006-04-28 &nbsp;  <br />
            </td>
        </tr>
        <tr>
            <td height="419" valign="top">
            <div twffan="done" style="font-size: 2pt;">&nbsp;</div>
            <table cellspacing="0" border="0" style="table-layout: fixed;" cellpadding="0">
                <tbody>
                    <tr>
                        <td width="6">&nbsp;</td>
                        <td id="dede_content" style="font-size: 9pt; line-height: 140%;">sed 编辑器是 Linux 系统管理员的工具包中最有用的资产之一， <br />
                        因此，有必要彻底地了解其应用 <br />
                        <br />
                        Linux 操作系统最大的一个好处是它带有各种各样的实用工具。存在如此之多不同的实用工具，几乎不可能知道并了解所有这些工具。可以简化关键情况下操作的一个实用 工具是 sed。它是任何管理员的工具包中最强大的工具之一，并且可以证明它自己在关键情况下非常有价值。 <br />
                        <br />
                        sed 实用工具是一个&ldquo;编辑器&rdquo;，但它与其它大多数编辑器不同。除了不面向屏幕之外，它还是非交互式的。这意味着您必须将要对数据执行的命令插入到命令行或要处 理的脚本中。当显示它时，请忘记您在使用 Microsoft Word 或其它大多数编辑器时拥有的交互式编辑文件功能。sed 在一个文件（或文件集）中非交互式、并且不加询问地接收一系列的命令并执行它们。因而，它流经文本就如同水流经溪流一样，因而 sed 恰当地代表了流编辑器。它可以用来将所有出现的 &quot;Mr. Smyth&quot; 修改为 &quot;Mr. Smith&quot;，或将 &quot;tiger cub&quot; 修改为 &quot;wolf cub&quot;。流编辑器非常适合于执行重复的编辑，这种重复编辑如果由人工完成将花费大量的时间。其参数可能和一次性使用一个简单的操作所需的参数一样有限， 或者和一个具有成千上万行要进行编辑修改的脚本文件一样复杂。sed 是 Linux 和 UNIX 工具箱中最有用的工具之一，且使用的参数非常少。 <br />
                        <br />
                        sed 的工作方式 <br />
                        <br />
                        sed 实用工具按顺序逐行将文件读入到内存中。然后，它执行为该行指定的所有操作，并在完成请求的修改之后将该行放回到内存中，以将其转储至终端。完成了这一行 上的所有操作之后，它读取文件的下一行，然后重复该过程直到它完成该文件。如同前面所提到的，默认输出是将每一行的内容输出到屏幕上。在这里，开始涉及到 两个重要的因素&mdash;首先，输出可以被重定向到另一文件中，以保存变化；第二，源文件（默认地）保持不被修改。sed 默认读取整个文件并对其中的每一行进行修改。不过，可以按需要将操作限制在指定的行上。 <br />
                        <br />
                        该实用工具的语法为： <br />
                        <br />
                        <br />
                        sed [options] '{command}' [filename] <br />
                        <br />
                        在这篇文章中，我们将浏览最常用的命令和选项，并演示它们如何工作，以及它们适于在何处使用。 <br />
                        <br />
                        替换命令 <br />
                        <br />
                        sed 实用工具以及其它任何类似的编辑器的最常用的命令之一是用一个值替换另一个值。用来实现这一目的的操作的命令部分语法是： <br />
                        <br />
                        <br />
                        's/{old value}/{new value}/' <br />
                        <br />
                        因而，下面演示了如何非常简单地将 &quot;tiger&quot; 修改为 &quot;wolf&quot;： <br />
                        <br />
                        <br />
                        $ echo The tiger cubs will meet on Tuesday after school | sed <br />
                        's/tiger/wolf/' <br />
                        The wolf cubs will meet on Tuesday after school <br />
                        $ <br />
                        <br />
                        注意如果输入是源自之前的命令输出，则不需要指定文件名&mdash;同样的原则也适用于 awk、sort 和其它大多数 LinuxUNIX 命令行实用工具程序。 <br />
                        <br />
                        多次修改 <br />
                        <br />
                        如果需要对同一文件或行作多次修改，可以有三种方法来实现它。第一种是使用 &quot;-e&quot; 选项，它通知程序使用了多条编辑命令。例如： <br />
                        <br />
                        <br />
                        $ echo The tiger cubs will meet on Tuesday after school | sed -e ' <br />
                        s/tiger/wolf/' -e 's/after/before/' <br />
                        The wolf cubs will meet on Tuesday before school <br />
                        $ <br />
                        <br />
                        这是实现它的非常复杂的方法，因此 &quot;-e&quot; 选项不常被大范围使用。更好的方法是用分号来分隔命令： <br />
                        <br />
                        <br />
                        $ echo The tiger cubs will meet on Tuesday after school | sed ' <br />
                        s/tiger/wolf/; s/after/before/' <br />
                        The wolf cubs will meet on Tuesday before school <br />
                        $ <br />
                        <br />
                        注 意分号必须是紧跟斜线之后的下一个字符。如果两者之间有一个空格，操作将不能成功完成，并返回一条错误消息。这两种方法都很好，但许多管理员更喜欢另一种 方法。要注意的一个关键问题是，两个撇号 (' ') 之间的全部内容都被解释为 sed 命令。直到您输入了第二个撇号，读入这些命令的 shell 程序才会认为您完成了输入。这意味着可以在多行上输入命令&mdash;同时 Linux 将提示符从 PS1 变为一个延续提示符（通常为 &quot;&gt;&quot;）&mdash;直到输入了第二个撇号。一旦输入了第二个撇号，并且按下了 Enter 键，则处理就进行并产生相同的结果，如下所示： <br />
                        <br />
                        <br />
                        $ echo The tiger cubs will meet on Tuesday after school | sed ' <br />
                        &gt; s/tiger/wolf/ <br />
                        &gt; s/after/before/' <br />
                        The wolf cubs will meet on Tuesday before school <br />
                        $ <br />
                        <br />
                        全局修改 <br />
                        <br />
                        让我们开始一次看似简单的编辑。假定在要修改的消息中出现了多次要修改的项目。默认方式下，结果可能和预期的有所不同，如下所示： <br />
                        <br />
                        <br />
                        $ echo The tiger cubs will meet this Tuesday at the same time <br />
                        as the meeting last Tuesday | sed 's/Tuesday/Thursday/' <br />
                        The tiger cubs will meet this Thursday at the same time <br />
                        as the meeting last Tuesday <br />
                        $ <br />
                        <br />
                        与 将出现的每个 &quot;Tuesday&quot; 修改为 &quot;Thursday&quot; 相反，sed 编辑器在找到一个要修改的项目并作了修改之后继续处理下一行，而不读整行。sed 命令功能大体上类似于替换命令，这意味着它们都处理每一行中出现的第一个选定序列。为了替换出现的每一个项目，在同一行中出现多个要替换的项目的情况下， 您必须指定在全局进行该操作： <br />
                        <br />
                        <br />
                        $ echo The tiger cubs will meet this Tuesday at the same time <br />
                        as the meeting last Tuesday | sed 's/Tuesday/Thursday/g' <br />
                        The tiger cubs will meet this Thursday at the same time <br />
                        as the meeting last Thursday <br />
                        $ <br />
                        <br />
                        请记住不管您要查找的序列是否仅包含一个字符或词组，这种对全局化的要求都是必需的。 <br />
                        <br />
                        sed 还可以用来修改记录字段分隔符。例如，以下命令将把所有的 tab 修改为空格： <br />
                        <br />
                        <br />
                        sed 's// /g' <br />
                        <br />
                        其 中，第一组斜线之间的项目是一个 tab，而第二组斜线之间的项目是一个空格。作为一条通用的规则，sed 可以用来将任意的可打印字符修改为任意其它的可打印字符。如果您想将不可打印字符修改为可打印字符&mdash;例如，铃铛修改为单词 &quot;bell&quot;&mdash;sed 不是适于完成这项工作的工具（但 tr 是）。 <br />
                        <br />
                        有时，您不想修改在一个文件中出现的所有指定项目。有时，您只想在满足某些条件时才作修改&mdash;例如，在与其它一些数据匹配之后才作修改。为了说明这一点，请考虑以下文本文件： <br />
                        <br />
                        <br />
                        $ cat sample_one <br />
                        one 1 <br />
                        two 1 <br />
                        three 1 <br />
                        one 1 <br />
                        two 1 <br />
                        two 1 <br />
                        three 1 <br />
                        $ <br />
                        <br />
                        假定希望用 &quot;2&quot; 来替换 &quot;1&quot;，但仅在单词 &quot;two&quot; 之后才作替换，而不是每一行的所有位置。通过指定在给出替换命令之前必须存在一次匹配，可以实现这一点： <br />
                        <br />
                        <br />
                        $ sed '/two/ s/1/2/' sample_one <br />
                        one 1 <br />
                        two 2 <br />
                        three 1 <br />
                        one 1 <br />
                        two 2 <br />
                        two 2 <br />
                        three 1 <br />
                        $ <br />
                        <br />
                        现在，使其更加准确： <br />
                        <br />
                        <br />
                        $ sed ' <br />
                        &gt; /two/ s/1/2/ <br />
                        &gt; /three/ s/1/3/' sample_one <br />
                        one 1 <br />
                        two 2 <br />
                        three 3 <br />
                        one 1 <br />
                        two 2 <br />
                        two 2 <br />
                        three 3 <br />
                        $ <br />
                        <br />
                        请 再次记住唯一改变了的是显示。如果您查看源文件，您将发现它始终保持不变。您必须将输出保存至另一个文件，以实现永久保存。值得重复的是，不对源文件作修 改实际是祸中有福&mdash;它让您能够对文件进行试验而不会造成任何实际的损害，直到让正确命令以您预期和希望的方式进行工作。 <br />
                        <br />
                        以下命令将修改后的输出保存至一个新的文件： <br />
                        <br />
                        <br />
                        $ sed ' <br />
                        &gt; /two/ s/1/2/ <br />
                        &gt; /three/ s/1/3/' sample_one &gt; sample_two <br />
                        <br />
                        该输出文件将所有修改合并在其中，并且这些修改通常将在屏幕上显示。现在可以用 head、cat 或任意其它类似的实用工具来进行查看。 <br />
                        <br />
                        脚本文件 <br />
                        <br />
                        sed 工具允许您创建一个脚本文件，其中包含从该文件而不是在命令行进行处理的命令，并且 sed 工具通过 &quot;-f&quot; 选项来引用。通过创建一个脚本文件，您能够一次又一次地重复运行相同的操作，并指定比每次希望从命令行进行处理的操作详细得多的操作。 <br />
                        <br />
                        考虑以下脚本文件： <br />
                        <br />
                        <br />
                        $ cat sedlist <br />
                        /two/ s/1/2/ <br />
                        /three/ s/1/3/ <br />
                        $ <br />
                        <br />
                        现在可以在数据文件上使用脚本文件，获得和我们之前看到的相同的结果： <br />
                        <br />
                        <br />
                        $ sed -f sedlist sample_one <br />
                        one 1 <br />
                        two 2 <br />
                        three 3 <br />
                        one 1 <br />
                        two 2 <br />
                        two 2 <br />
                        three 3 <br />
                        $ <br />
                        <br />
                        注意当调用 &quot;-f&quot; 选项时，在源文件内或命令行中不使用撇号。脚本文件，也称为源文件，对于想重复多次的操作和从命令行运行可能出错的复杂命令很有价值。编辑源文件并修改一个字符比在命令行中重新输入一条多行的项目要容易得多。 <br />
                        <br />
                        限制行 <br />
                        <br />
                        编辑器默认查看输入到流编辑器中的每一行，且默认在输入到流编辑器中的每一行上进行编辑。这可以通过在发出命令之前指定约束条件来进行修改。例如，只在此示例文件的输出的第 5 和第 6 行中用 &quot;2&quot; 来替换 &quot;1&quot;，命令将为： <br />
                        <br />
                        <br />
                        $ sed '5,6 s/1/2/' sample_one <br />
                        one 1 <br />
                        two 1 <br />
                        three 1 <br />
                        one 1 <br />
                        two 2 <br />
                        two 2 <br />
                        three 1 <br />
                        $ <br />
                        <br />
                        在这种情况下，因为要修改的行是专门指定的，所以不需要替换命令。因此，您可以灵活地根据匹配准则（可以是行号或一种匹配模式）来选择要修改哪些行（从根本上限制修改）。 <br />
                        <br />
                        禁止显示 <br />
                        <br />
                        sed 默认将来自源文件的每一行显示到屏幕上（或重定向到一个文件中），而无论该行是否受到编辑操作的影响，&quot;-n&quot; 参数覆盖了这一操作。&quot;-n&quot; 覆盖了所有的显示，并且不显示任何一行，而无论它们是否被编辑操作修改。例如： <br />
                        <br />
                        <br />
                        $ sed -n -f sedlist sample_one <br />
                        $ <br />
                        <br />
                        $ sed -n -f sedlist sample_one &gt; sample_two <br />
                        $ cat sample_two <br />
                        $ <br />
                        <br />
                        在 第一个示例中，屏幕上不显示任何东西。在第二个示例中，不修改任何东西，因此不将任何东西写到新的文件中&mdash;它最后是空的。这不是否定了编辑的全部目的吗？ 为什么这是有用的？它是有用的仅因为 &quot;-n&quot; 选项能够被一条显示命令 (-p) 覆盖。为了说明这一点，假定现在像下面这样对脚本文件进行了修改： <br />
                        <br />
                        <br />
                        $ cat sedlist <br />
                        /two/ s/1/2/p <br />
                        /three/ s/1/3/p <br />
                        $ <br />
                        <br />
                        然后下面是运行它的结果： <br />
                        <br />
                        <br />
                        $ sed -n -f sedlist sample_one <br />
                        two 2 <br />
                        three 3 <br />
                        two 2 <br />
                        two 2 <br />
                        three 3 <br />
                        $ <br />
                        <br />
                        保持不变的行全部不被显示。只有受到编辑操作影响的行被显示了。在这种方式下，可以仅取出这些行，进行修改，然后把它们放到一个单独的文件中： <br />
                        <br />
                        <br />
                        $ sed -n -f sedlist sample_one &gt; sample_two <br />
                        $ <br />
                        <br />
                        $ cat sample_two <br />
                        two 2 <br />
                        three 3 <br />
                        two 2 <br />
                        two 2 <br />
                        three 3 <br />
                        $ <br />
                        <br />
                        利用它的另一种方法是只显示一定数量的行。例如，只显示 2-6 行，同时不做其它的编辑修改： <br />
                        <br />
                        <br />
                        $ sed -n '2,6p' sample_one <br />
                        two 1 <br />
                        three 1 <br />
                        one 1 <br />
                        two 1 <br />
                        two 1 <br />
                        $ <br />
                        <br />
                        其它所有的行被忽略，只有 2-6 行作为输出显示。这是一项出色的功能，其它任何工具都不能容易地实现。Head 将显示一个文件的顶部，而 tail 将显示一个文件的底部，但 sed 允许从任意位置取出想要的任意内容。 <br />
                        <br />
                        删除行 <br />
                        <br />
                        用一个值替换另一个值远非流编辑器可以执行的唯一功能。它还具有许多的潜在功能，在我看来第二种最常用的功能是删除。删除与替换的工作方式相同，只是它删除指定的行（如果您想要删除一个单词而不是一行，不要考虑删除，而应考虑用空的内容来替换它&mdash;s/cat//）。 <br />
                        <br />
                        该命令的语法是： <br />
                        <br />
                        <br />
                        '{what to find} d' <br />
                        <br />
                        从 sample_one 文件中删除包含 &quot;two&quot; 的所有行： <br />
                        <br />
                        <br />
                        $ sed '/two/ d' sample_one <br />
                        one 1 <br />
                        three 1 <br />
                        one 1 <br />
                        three 1 <br />
                        $ <br />
                        <br />
                        从显示屏中删除前三行，而不管它们的内容是什么： <br />
                        <br />
                        <br />
                        $ sed '1,3 d' sample_one <br />
                        one 1 <br />
                        two 1 <br />
                        two 1 <br />
                        three 1 <br />
                        $ <br />
                        <br />
                        只显示剩下的行，前三行不在显示屏中出现。对于流编辑器，一般当它们涉及到全局表达式时，特别是应用于删除操作时，有几点要记住： <br />
                        <br />
                        上三角号 (^) 表示一行的开始，因此，如果 &quot;two&quot; 是该行的头三个字符，则 <br />
                        <br />
                        <br />
                        sed '/^two/ d' sample_one <br />
                        <br />
                        将只删除该行。 <br />
                        美元符号 ($) 代表文件的结尾，或一行的结尾，因此，如果 &quot;two&quot; 是该行的最后三个字符，则 <br />
                        <br />
                        <br />
                        sed '/two$/ d' sample_one <br />
                        <br />
                        将只删除该行。 <br />
                        <br />
                        将这两者结合在一起的结果： <br />
                        <br />
                        <br />
                        sed '/^$/ d' {filename} <br />
                        <br />
                        删除文件中的所有空白行。例如，以下命令将 &quot;1&quot; 替换为 &quot;2&quot;，以及将 &quot;1&quot; 替换为 &quot;3&quot;，并删除文件中所有尾随的空行： <br />
                        <br />
                        <br />
                        $ sed '/two/ s/1/2/; /three/ s/1/3/; /^$/ d' sample_one <br />
                        one 1 <br />
                        two 1 <br />
                        three 1 <br />
                        one 1 <br />
                        two 2 <br />
                        two 2 <br />
                        three 1 <br />
                        $ <br />
                        <br />
                        其通常的用途是删除一个标题。以下命令将删除文件中所有的行，从第一行直到第一个空行： <br />
                        <br />
                        <br />
                        sed '1,/^$/ d' {filename} <br />
                        <br />
                        添加和插入文本 <br />
                        <br />
                        可以结合使用 sed 和 &quot;a&quot; 选项将文本添加到一个文件的末尾。实现方法如下： <br />
                        <br />
                        <br />
                        $ sed '$a <br />
                        &gt; This is where we stop <br />
                        &gt; the test' sample_one <br />
                        one 1 <br />
                        two 1 <br />
                        three 1 <br />
                        one 1 <br />
                        two 1 <br />
                        two 1 <br />
                        three 1 <br />
                        This is where we stop <br />
                        the test <br />
                        $ <br />
                        <br />
                        在该命令中，美元符号 ($) 表示文本将被添加到文件的末尾。反斜线 () 是必需的，它表示将插入一个回车符。如果它们被遗漏了，则将导致一个错误，显示该命令是错乱的；在任何要输入回车的地方您必须使用反斜线。 <br />
                        <br />
                        要将这些行添加到第 4 和第 5 个位置而不是末尾，则命令变为： <br />
                        <br />
                        <br />
                        $ sed '3a <br />
                        &gt; This is where we stop <br />
                        &gt; the test' sample_one <br />
                        one 1 <br />
                        two 1 <br />
                        three 1 <br />
                        This is where we stop <br />
                        the test <br />
                        one 1 <br />
                        two 1 <br />
                        two 1 <br />
                        three 1 <br />
                        $ <br />
                        <br />
                        这将文本添加到第 3 行之后。和几乎所有的编辑器一样，您可以选择插入而不是添加（如果您希望这样的话）。这两者的区别是添加跟在指定的行之后，而插入从指定的行开始。当用插入来代替添加时，只需用 &quot;i&quot; 来代替 &quot;a&quot;，如下所示： <br />
                        <br />
                        <br />
                        $ sed '3i <br />
                        &gt; This is where we stop <br />
                        &gt; the test' sample_one <br />
                        one 1 <br />
                        two 1 <br />
                        This is where we stop <br />
                        the test <br />
                        three 1 <br />
                        one 1 <br />
                        two 1 <br />
                        two 1 <br />
                        three 1 <br />
                        $ <br />
                        <br />
                        新的文本出现在输出的中间位置，而处理通常在指定的操作执行以后继续进行。 <br />
                        <br />
                        读写文件 <br />
                        <br />
                        重定向输出的功能已经演示过了，但需要指出的是，在编辑命令运行期间可以同步地读入和写出文件。例如，执行替换，并将 1-3 行写到名称为 sample_three 的文件中： <br />
                        <br />
                        <br />
                        $ sed ' <br />
                        &gt; /two/ s/1/2/ <br />
                        &gt; /three/ s/1/3/ <br />
                        &gt; 1,3 w sample_three' sample_one <br />
                        one 1 <br />
                        two 2 <br />
                        three 3 <br />
                        one 1 <br />
                        two 2 <br />
                        two 2 <br />
                        three 3 <br />
                        $ <br />
                        <br />
                        $ cat sample_three <br />
                        one 1 <br />
                        two 2 <br />
                        three 3 <br />
                        $ <br />
                        <br />
                        由于为 w (write) 命令指定了 &quot;1,3&quot;，所以只有指定的行被写到了新文件中。无论被写的是哪些行，所有的行都在默认输出中显示。 <br />
                        <br />
                        修改命令 <br />
                        <br />
                        除了替换项目之外，还可以将行从一个值修改为另一个值。要记住的是，替换是对字符逐个进行，而修改功能与删除类似，它影响整行： <br />
                        <br />
                        <br />
                        $ sed '/two/ c <br />
                        &gt; We are no longer using two' sample_one <br />
                        one 1 <br />
                        We are no longer using two <br />
                        three 1 <br />
                        one 1 <br />
                        We are no longer using two <br />
                        We are no longer using two <br />
                        three 1 <br />
                        $ <br />
                        <br />
                        修 改命令与替换的工作方式很相似，但在范围上要更大些&mdash;将一个项目完全替换为另一个项目，而无论字符内容或上下文。夸张一点讲，当使用替换时，只有字符 &quot;1&quot; 被字符 &quot;2&quot; 替换，而当使用修改时，原来的整行将被修改。在两种情况下，要寻找的匹配条件都仅为 &quot;two&quot;。 <br />
                        <br />
                        修改全部但&hellip;&hellip; <br />
                        <br />
                        对于大多数 sed 命令，详细说明各种功能要进行何种修改。利用感叹号，可以在除指定位置之外的任何地方执行修改&mdash;与默认的操作完全相反。 <br />
                        <br />
                        例如，要删除包含单词 &quot;two&quot; 的所有行，操作为： <br />
                        <br />
                        <br />
                        $ sed '/two/ d' sample_one <br />
                        one 1 <br />
                        three 1 <br />
                        one 1 <br />
                        three 1 <br />
                        $ <br />
                        <br />
                        而要删除除包含单词 &quot;two&quot; 的行之外的所有行，则语法变为： <br />
                        <br />
                        <br />
                        $ sed '/two/ !d' sample_one <br />
                        two 1 <br />
                        two 1 <br />
                        two 1 <br />
                        $ <br />
                        <br />
                        如果您有一个文件包含一系列项目，并且想对文件中的每个项目执行一个操作，那么首先对那些项目进行一次智能扫描并考虑将要做什么是很重要的。为了使事情变得更简单，您可以将 sed 与任意迭代例程（for、while、until）结合来实现这一目的。 <br />
                        <br />
                        比如说，假定您有一个名为 &quot;animals&quot; 的文件，其中包含以下项目： <br />
                        <br />
                        pig <br />
                        horse <br />
                        elephant <br />
                        cow <br />
                        dog <br />
                        cat <br />
                        <br />
                        您希望运行以下例程： <br />
                        <br />
                        <br />
                        #mcd.ksh <br />
                        for I in $* <br />
                        do <br />
                        echo Old McDonald had a $I <br />
                        echo E-I, E-I-O <br />
                        done <br />
                        <br />
                        结 果将为，每一行都显示在 &quot;Old McDonald has a&quot; 的末尾。虽然对于这些项目的大部分这是正确的，但对于 &quot;elephant&quot; 项目，它有语法错误，因为结果应当为 &quot;an elephant&quot; 而不是 &quot;a elephant&quot;。利用 sed，您可以在来自 shell 文件的输出中检查这种语法错误，并通过首先创建一个命令文件来即时地更正它们： <br />
                        <br />
                        <br />
                        #sublist <br />
                        / a a/ s/ a / an / <br />
                        / a e/ s/ a / an / <br />
                        /a i/ s / a / an / <br />
                        /a o/ s/ a / an / <br />
                        /a u/ s/ a / an / <br />
                        <br />
                        然后执行以下过程： <br />
                        <br />
                        <br />
                        $ sh mcd.ksh 'cat animals' | sed -f sublist <br />
                        <br />
                        现 在，在运行了 mcd 脚本之后，sed 将在输出中搜索单个字母 a （空格，&quot;a&quot;，空格）之后紧跟了一个元音的任意位置。如果这种位置存在，它将把该序列修改为空格，&quot;an&quot;，空格。这样就使问题更正后才显示在屏幕上， 并确保各处的编辑人员在晚上可以更容易地入睡。结果是： <br />
                        <br />
                        Old McDonald had a pig <br />
                        E-I, E-I-O <br />
                        Old McDonald had a horse <br />
                        E-I, E-I-O <br />
                        Old McDonald had an elephant <br />
                        E-I, E-I-O <br />
                        Old McDonald had a cow <br />
                        E-I, E-I-O <br />
                        Old McDonald had a dog <br />
                        E-I, E-I-O <br />
                        Old McDonald had a cat <br />
                        E-I, E-I-O <br />
                        <br />
                        提前退出 <br />
                        <br />
                        sed 默认读取整个文件，并只在到达末尾时才停止。不过，您可以使用退出命令提前停止处理。只能指定一条退出命令，而处理将一直持续直到满足调用退出命令的条件。 <br />
                        <br />
                        例如，仅在文件的前五行上执行替换，然后退出： <br />
                        <br />
                        <br />
                        $ sed ' <br />
                        &gt; /two/ s/1/2/ <br />
                        &gt; /three/ s/1/3/ <br />
                        &gt; 5q' sample_one <br />
                        one 1 <br />
                        two 2 <br />
                        three 3 <br />
                        one 1 <br />
                        two 2 <br />
                        $ <br />
                        <br />
                        在退出命令之前的项目可以是一个行号（如上所示），或者一条查找/匹配命令： <br />
                        <br />
                        <br />
                        $ sed ' <br />
                        &gt; /two/ s/1/2/ <br />
                        &gt; /three/ s/1/3/ <br />
                        &gt; /three/q' sample_one <br />
                        one 1 <br />
                        two 2 <br />
                        three 3 <br />
                        $ <br />
                        <br />
                        您 还可以使用退出命令来查看超过一定标准数目的行，并增加比 head 中的功能更强的功能。例如，head 命令允许您指定您想要查看一个文件的前多少行&mdash;默认数为 10，但可以使用从 1 到 99 的任意一个数字。如果您想查看一个文件的前 110 行，您用 head 不能实现这一目的，但用 sed 可以： <br />
                        <br />
                        <br />
                        sed 110q filename <br />
                        <br />
                        处理问题 <br />
                        <br />
                        当使用 sed 时，要记住的重要事项是它的工作方式。它的工作方式是：读入一行，在该行上执行它已知要执行的所有任务，然后继续处理下一行。每一行都受给定的每一个编辑命令的影响。 <br />
                        <br />
                        如果您的操作顺序没有十分彻底地考虑清楚，那么这可能会很麻烦。例如，假定您需要将所有的 &quot;two&quot; 项目修改为 &quot;three&quot;，然后将所有的 &quot;three&quot; 修改为 &quot;four&quot;： <br />
                        <br />
                        <br />
                        $ sed ' <br />
                        &gt; /two/ s/two/three/ <br />
                        &gt; /three/ s/three/four/' sample_one <br />
                        one 1 <br />
                        four 1 <br />
                        four 1 <br />
                        one 1 <br />
                        four 1 <br />
                        four 1 <br />
                        four 1 <br />
                        $ <br />
                        <br />
                        最初读取的 &quot;two&quot; 被修改为 &quot;three&quot;。然后它满足为下一次编辑建立的准则，从而变为 &quot;four&quot;。最终的结果不是想要的结果&mdash;现在除了 &quot;four&quot; 没有别的项目了，而本来应该有 &quot;three&quot; 和 &quot;four&quot;。 <br />
                        <br />
                        当执行这种操作时，您必须非常用心地注意指定操作的方式，并按某种顺序来安排它们，使得操作之间不会互相影响。例如： <br />
                        <br />
                        <br />
                        $ sed ' <br />
                        &gt; /three/ s/three/four/ <br />
                        &gt; /two/ s/two/three/' sample_one <br />
                        one 1 <br />
                        three 1 <br />
                        four 1 <br />
                        one 1 <br />
                        three 1 <br />
                        three 1 <br />
                        four 1 <br />
                        $ <br />
                        <br />
                        这非常有效，因为 &quot;three&quot; 值在 &quot;two&quot; 变成 &quot;three&quot; 之前得到修改。 <br />
                        <br />
                        标签和注释 <br />
                        <br />
                        可以在 sed 脚本文件中放置标签，这样一旦文件变得庞大，可以更容易地说明正在发生的事情。存在各种各样与这些标签相关的命令，它们包括： <br />
                        接下来的步骤 <br />
                        <br />
                        访问并收藏 Linux 技术中心 <br />
                        <br />
                        阅读 Dale Dougherty 和 Arnold Robbins 的著作 sed &amp; awk, 2nd Edition （O'Reilly &amp; Associates 出版社）。 <br />
                        <br />
                        : 冒号表示一个标签名称。例如： <br />
                        <br />
                        <br />
                        :HERE <br />
                        <br />
                        以冒号开始的标签可以由 &quot;b&quot; 和 &quot;t&quot; 命令处理。 <br />
                        <br />
                        b {label} 充当 &quot;goto&quot; 语句的作用，将处理发送至前面有一个冒号的标签。例如， <br />
                        <br />
                        <br />
                        b HERE <br />
                        <br />
                        将处理发送给行 <br />
                        <br />
                        <br />
                        :HERE <br />
                        <br />
                        如果紧跟 b 之后没有指定任何标签，则处理转至脚本文件的末尾。 <br />
                        <br />
                        t {label} 只要自上次输入行或执行一次 &quot;t&quot; 命令以来进行了替换操作，就转至该标签。和 &quot;b&quot; 一样，如果没有给定标签名，则处理转至脚本文件的末尾。 <br />
                        <br />
                        # 符号作为一行的第一个字符将使整行被当作注释处理。注释行与标签不同，不能使用 b 或 t 命令来转到注释行上。 </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/132809#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>Wed, 17 Oct 2007 11:09:43 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/132809</link>
        <guid>http://flierlh.javaeye.com/blog/132809</guid>
      </item>
      <item>
        <title>Tapestry的service（转）</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/131677" style="color:red;">http://flierlh.javaeye.com/blog/131677</a>&nbsp;
          发表时间: 2007年10月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这是Tapestry框架的核心部分。Tapestry框架面向组件的开发方式，使得我们不再操心Servlet底层细节和URL中质询参数的结构。
<p>Tapestry用于Servlet的底层对象</p>
<p>为了更好地理解Tapestry的service运作过程，我们首先需要熟悉一下Tapestry service中常用的核心对象。 <br />
1. IRequestCycle对象 <br />
该对象用于控制一个单一的请求周期。一旦客户段浏览器发出请求，Tapestry将做以下处理。 <br />
通过IEngineService对象响应URL； <br />
决定响应页面； <br />
释放所有资源。 <br />
在这个过程中，IRequestCycle对象还会处理： <br />
异常操作； <br />
加载页面模板； <br />
跟踪页面属性的变化并储存页面状态； <br />
缓存页面对象。 <br />
2．IRageRecorder对象 <br />
该对象用于观察一个页面及该页面Tapestry属性（页面属性和组件属性）的变化，在请求周期内储存页面状态，并在下一个请求周期到来之前，将页面已经发生变化的状态回复到初始值。 <br />
通过实现IRageRecorder接口，可以自定义页面状态持久化策略，可以将页面状态存储内存，客户端cookies文件系统或数据库中。 <br />
3．IPageSource对象 <br />
通过页面规范从缓存池中加载页面对象，如果IPageSource对象在缓存池中找不到页面对象，或者加载的对象不可用，那么IPageLoader对象的实例就会创建页面对象的实例(包括页面所调用的组件)。 <br />
4．IPageLoader对象 <br />
创建页面对象的实例。 <br />
5．IEngine对象 <br />
Tapestry应用程序的核心对象的生命周期与HttpSession相同，每个单一客户端拥有自己的engine对象。Engine对象用于向页面和组件提供Tapestry的核心service. <br />
6.IEngineService对象 <br />
Tapestry 的核心service通过IEngine对象相页面和组件提供Service.service的作用是构建URL编码以响应请求，或解析请求中包含的URL。 <br />
7．WebRequest对象 <br />
包含了当前请求的所有信息。这个对象本质上是对HttpServletRequest的封装。 <br />
8．WebResponse对象 <br />
控制客户端响应，并创建输出流。这个对象本质上是对HttpServiceResponse的封装。 <br />
9．WebContext对象 <br />
对ServletContext的封装。 <br />
10．WebSession对象 <br />
对HttpSession的封装。 </p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/131677#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, 13 Oct 2007 16:27:10 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/131677</link>
        <guid>http://flierlh.javaeye.com/blog/131677</guid>
      </item>
      <item>
        <title> PO/POJO/BO/DTO/VO的区别（转）</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/131308" style="color:red;">http://flierlh.javaeye.com/blog/131308</a>&nbsp;
          发表时间: 2007年10月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <script type="text/javascript">unction StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();</script> <font size="2"><strong><span style="color: rgb(153, 51, 0);">PO</span> </strong>：<span>persistent object持久对象</span> </font><font size="2">
<div>
<div align="left"><font size="2">1 ．有时也被称为<span>Data对象，对应数据库中的entity，可以简单认为一个PO对应数据库中的一条记录。</span></font></div>
<font size="2">
<div><font size="2">2 ．在<span>hibernate持久化框架中与insert/delet操作密切相关。</span>
<div><font size="2">3 ．<span>PO中不应该包含任何对数据库的操作。</span>
<div><span></span>
<div><font size="2"><span>--------------------------------------------------------- </span>
<div><font size="2"><strong><span style="color: rgb(153, 51, 0);">POJO </span></strong>：<span>plain ordinary java object 无规则简单java对象</span>
<div><font size="2">一个中间对象，可以转化为<span>PO、DTO、VO。</span>
<div><span></span>
<div><font size="2">1 ．<span>POJO<span style="color: blue;">持久化之后</span>==〉<span>PO </span></span>
<div><font size="2">（在运行期，由<span>Hibernate中的cglib动态把POJO转换为PO，PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。PO对于programmer来说完全透明，由于是运行期生成PO，所以可以支持增量编译，增量调试。）</span>
<div><font size="2">2 ．<span>POJO<span style="color: blue;">传输过程中</span>==〉<span>DTO </span></span>
<div><font size="2">3 ．<span>POJO<span style="color: blue;">用作表示层</span>==〉<span>VO </span></span>
<div><span></span>
<div><font size="2">PO 和<span>VO都应该属于它。</span>
<div><span></span>
<div><font size="2"><span>---------------------------------------------------------- </span>
<div><font size="2"><strong><span style="color: rgb(153, 51, 0);">BO</span> </strong>：<span>business object 业务对象</span>
<div><font size="2">封装业务逻辑为一个对象（可以包括多个<span>PO，通常需要将BO转化成PO，才能进行数据的持久化，反之，从DB中得到的PO，需要转化成BO才能在业务层使用）。</span>
<div><font size="2">关于<span>BO主要有三种概念</span>
<div><font size="2">1 <span>、只包含业务对象的属性；</span>
<div><font size="2">2 <span>、只包含业务方法；</span>
<div><font size="2">3 <span>、两者都包含。</span>
<div><font size="2"><span>在实际使用中，认为哪一种概念正确并不重要，关键是实际应用中适合自己项目的需要。</span>
<div><span></span>
<div><font size="2"><span>---------------------------------------------------------- </span>
<div><font size="2"><strong><span style="color: rgb(153, 51, 0);">VO</span> </strong>：<span>value object值对象 / view object表现层对象</span>
<div><font size="2">1 ．主要对应页面显示（<span>web页面/swt、swing界面）的数据对象。</span>
<div><font size="2">2 <span>．可以和表对应，也可以不，这根据业务的需要。</span>
<div><span></span>
<div><font size="2"><strong><span style="color: fuchsia;">注</span> </strong>：在<span>struts中，用ActionForm做VO，需要做一个转换，因为PO是面向对象的，而ActionForm是和view对应的，要将几个PO要显示的属性合成一个ActionForm，可以使用BeanUtils的copy方法。</span>
<div><span></span>
<div><font size="2"><span>---------------------------------------------------------- </span>
<div><font size="2"><strong><span style="color: rgb(153, 51, 0);">DTO</span> </strong><strong><span style="color: rgb(153, 51, 0);">（TO）</span> </strong>：<span>Data Transfer Object数据传输对象</span>
<div><font size="2">1 <span>．用在需要跨进程或远程传输时，它不应该包含业务逻辑。</span>
<div><font size="2">2 ．比如一张表有<span>100个字段，那么对应的PO就有100个属性（<strong><span style="color: purple;">大多数情况下，DTO 内的数据来自多个表</span></strong>）。但view层只需显示10个字段，没有必要把整个PO对象传递到client，这时我们就可以用只有这10个属性的DTO来传输数据到client，这样也不会暴露server端表结构。到达客户端以后，如果用这个对象来对应界面显示，那此时它的身份就转为VO。</span>
<div><span></span>
<div><font size="2"><span>---------------------------------------------------------- </span>
<div><font size="2"><strong><span style="color: rgb(153, 51, 0);">DAO</span> </strong>：<span>data access object数据访问对象</span>
<div><font size="2">1 ．主要用来封装对<span>DB的访问（CRUD操作）。</span>
<div><font size="2">2 ．通过接收<span>Business层的数据，把POJO持久化为PO。 </span></font></div>
</font></div>
</font></div>
</font></div>
</div>
</font></div>
</font></div>
</font></div>
</font></div>
</div>
</font></div>
</div>
</font></div>
</font></div>
</font></div>
</font></div>
</div>
</font></div>
</font></div>
</font></div>
</font></div>
</font></div>
</font></div>
</font></div>
</font></div>
</div>
</font></div>
</div>
</font></div>
</font></div>
</font></div>
</font></div>
</div>
</font></div>
</font></div>
</font></div>
</div>
</font></div>
</font></div>
</font></div>
</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/131308#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, 12 Oct 2007 11:31:09 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/131308</link>
        <guid>http://flierlh.javaeye.com/blog/131308</guid>
      </item>
      <item>
        <title>软件团队的建设和软件开发管理(转)</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/129743" style="color:red;">http://flierlh.javaeye.com/blog/129743</a>&nbsp;
          发表时间: 2007年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          毕业以后一直在从事软件工作，历经了10年坎坷，现在是一家IT企业的软件开发主管。在不断的摸索、失败、成功中，有不少的经验和教训，希望能和一些成长中的软件从业者分享。<br />
<br />
软件组织中什么是最重要的呢？团队和开发管理。今天我们的主要话题就是围绕着团队和开发管理展开的。<br />
<br />
在很多场合，我们都听到人们说&ldquo;人才是最重要的资产&rdquo;，我想，这不是一句空话。有了人才就有一切，这是一个真理。对于软件开发来说更是如此。当然，对人才的关注并不意味着要人才堆积甚至浪费，人才浪费反而会影响整个团队。<br />
<br />
人才只是一个个的点，如果没有形成一个有效的团队，人才再多也毫无意义。软件开发是一个需要协同作战的工作，团队是软件开发工作的基本组织，因此形成一个有效的团队是软件组织成功的基础。<br />
<br />
很多时候，团队作战听起来容易做起来难。有一次，我和一个大型软件企业的CTO聊起了软件组织的模式，他打了一个比方，说软件开发就象做外科手术，外科主任应该是技术最强的人，熟知每一项技术细节的人，所以软件组织的领导也应该是技术最全面，每个细节都精通的人。软件开发真的象医生看病做手术吗？我们来看看这里面有什么不同。医生通常面对的是一个病人，通常处理的是一个个案，当然一个复杂的手术也需要麻醉、影像、护士、助手的配合才能完成。一个软件项目呢？软件项目也有大小的区别，小的项目一个人处理所有环节，前端、业务逻辑、数据库；大的项目通常有一个团队共同完成，需求分析、结构设计、概要设计、详细设计、编码、测试，中间贯穿配置管理、流程管理等等，可由几人、几十人、几百人的团队共同完成。当领导几十人、几百人的团队的时候，项目的成功与否不光是领导者的技术能力所能够决定的了，更重要的是领导者的管理能力和领导能力决定的了。可见，不同软件企业的CTO对软件组织的模式认识也是不同的。<br />
既然我们认识到了团队是一个软件组织的基本作战单位，那么我们应该怎样建立一个样团队呢？我们建立的团队应该包含哪些模块呢？我们可以从一下几个方面入手来对我们面对的问题先进行一个分析：<br />
?*&nbsp;团队的技术要求是什么？<br />
?*&nbsp;团队要具有哪些功能模块？<br />
?*&nbsp;什么样的员工适合我们的团队？<br />
<br />
下面我们来分析一下以上3个问题。<br />
<br />
团队的技术要求是什么？&nbsp;通常，我们需要分析一下我们工作的技术要求。我们可以把软件系统作一个简单的分类：<br />
?*&nbsp;基础系统，如操作系统、数据库系统、服务器系统<br />
?*&nbsp;专业系统，如人工智能、大型索引系统<br />
?*&nbsp;应用系统，如BOSS、BI系统<br />
在这些系统中，也存在不同的分工。尤其是应用系统，分工更为繁多，比如：系统分析工程师、架构工程师、核心层开发工程师、业务层开发工程师、表现层工程师、美工、项目管理人员、测试人员，等等。不同的系统具有不同的技术要求，比如实时系统和信息系统的要求就不一样，常见的实时系统如电信系统，要求任何时候都不能中断，而信息系统，比如简单的OA系统，短暂的停顿造成的影响不是很大。因此在建立软件组织的时候需要考虑所从事软件项目的技术要求，我们首先要考虑我们开发的是什么系统，它的技术要求是什么，并在此基础上考虑软件组织的构成人员的要求。这个道理其实很简单，通常没有人为了OA系统的开发去招聘研究算法的博士。同时，对系统技术要求的过低估计通常会造成很低的客户满意度，也不利于组织的能力的提升。因此我们要仔细分析组织的技术要求，同时考虑组织未来发展的要求，尽量做到合理估计组织技术能力需求。<br />
<br />
团队要具有哪些功能模块？<br />
很多人都看过软件工程方面的书，在实践中我们基本也是按照规范去做的，现在，我们简单总结一下一个软件组织应该具有的能力：需求分析，架构设计、概要设计、详细设计、编码、测试、配置管理、流程管理、过程管理等等。但并不是任何规模的软件组织都要完全建立独立的组织来完成上述的功能，很多时候软件团队也是可以人员复用的，比如设计和编码通常可以融合。通常我们需要根据我们项目的实际情况，对组织能力作出适当的裁减，对人员复用作出合理的安排，并在此基础上决定我们的组织规模和构成。<br />
<br />
什么样的员工适合我们的团队？<br />
这可能是在建立团队的时候最不确定的因素，也最没有规范的因素。不同的管理者对人员的筛选会有不同的要求，因而构成的团队也具有不同的气质。同样是团队，有活泼的，有严肃的，有纪律严明的，有松散的，有喜欢冒险的，有害怕冒险的，有繁文缛节的，有简单明了的，这都跟管理者自身的喜好有关。这里就我个人的经验，谈谈在选择人员的看法。我们对人员需要被考察的素质做一个总结：<br />
?&nbsp;经验值<br />
?&nbsp;能力值<br />
?&nbsp;潜力值<br />
?&nbsp;洞察力<br />
?&nbsp;敏锐值<br />
?&nbsp;诚实度<br />
?&nbsp;老实度<br />
?&nbsp;开朗、&nbsp;大度、外向值<br />
?&nbsp;谦虚度<br />
?&nbsp;自知力值<br />
?&nbsp;亲和力值<br />
?&nbsp;负责度<br />
?&nbsp;细致度<br />
?&nbsp;抗压度<br />
?&nbsp;稳定度<br />
?&nbsp;承担责任能力<br />
这些素质中，有些我们可以通过考试的方法了解，有些可以询问，也有不少特质需要我们自己去感知。在我们招聘的过程中，技术人员的笔试是很重要的，必须根据需要设立不同的考题对人员进行考察。对于人员的能力和经验除了考虑目前他所具备的能力以外，还要考虑他的潜力，有些人具有很强的学习能力，在具备一定基础知识的情况下，可以降低对这种人经验的要求。除了能力以外，一个人的情商对于我们的组织来说非常重要。我们可以通过心理测试的方式了解一个人的情商，同时，最重要的是，作为管理者，我们必须要具有感知一个人性格特点的能力。这样，在招聘过程中，我们才能尽量做到选择出合适的人才。在选择人才的时候，我们不要一味追求便于管理，不要怕有能力的人。对于性格过于内向的人我们也要多加考虑，很多内向的人同时也具有执拗、各色、生硬、融合性差的特点，因此内向不等于便于管理。<br />
<br />
有了合适的人选，团队建立了，还需要不断提升团队的能力，需要培养具有特色的团队精神。正如一个球队，有了合适的人选，还必须有高质量的训练，严格的细节要求，才可能在竞争中获得胜利。一个团队也是一样，需要不断的提升技术能力，提升凝聚力，提升协作能力，提升士气，才能在一个个项目中获得成功。<br />
<br />
那么，团队精神的培养，团队能力的提升从何着手呢？首先要确立团队的风格，例如建立这样一种团队风格：分享、透明、责任、协作、团结、激情。在确立了这个风格以后，要在日常的工作中加以贯彻。<br />
<br />
分享，主要是指技术的分享，可以定期举办技术讲座，让每个人都参与进来，领导者可以确立技术方向，然后大家分享彼此的知识和经验，这种方式可以很快地提升团队整体技术能力，分享的过程中也增加了成员间的相互了解和信任。<br />
<br />
透明，是指管理上要透明，在我们的团队中没有不能拿出来说的秘密（工资除外），团队成员间秘密的形成也是团队隔阂的开始。<br />
<br />
积极的态度、责任心是软件开发必不可少的素质，不同的责任心开发出来的软件可用性、性能、稳定性、出错率可能相差很远，发现由责任心引起的问题一定要坚决处理，提出公开的批评，根据情况作出适当的处罚，确保以后避免类似的错误。<br />
<br />
软件工程的过程和软件设计的模块化、分层结构导致了软件组织成员分工的不同，这就要求成员间要有很高的协作性、团结性。对各项工作多进行讨论，不要怕争论，不要独断专行，最后执行讨论后的结果，多讨论有助于增进协作和团结。<br />
<br />
每个人都需要一个舞台，在团队管理中一定要了解每一个团队成员的特点和能力，把最适合的任务分配给他，要为每一个人营造一个舞台，要充分发挥每个人的作用。软件是一个团队的工作，不是团队中一个明星的工作。就象篮球是5个人的运动，足球是11个人运动一样。要让所有的团队成员都参与到工作中来，一同享受工作的乐趣和成功的喜悦。不要造成忙的忙，闲的闲的现象，那样的话忙的、闲的都会产生不满情绪，最终导致不可调和的矛盾。<br />
<br />
除了上述方法可以培养团队的精神，促进团队能力的提升以外，另外一个重要的手段是确立团队不同阶段目标，并讨论采用什么样的手段达到目标。目标包括项目目标和能力目标，只有有了正确的目标，在团队精神的鼓舞下，团队才会产生激情。很多时候，激情的迸发可以产生意想不到的力量。<br />
<br />
在培养团队精神的时候也要避免一些严重影响团队精神的事情发生。不要任人唯亲，要唯贤是用；不要独断专行，要群策群力；不要高压强制，要鼓励引导。<br />
<br />
<br />
在建设了一个好的团队以后，任务已经完成了一半。软件工程的特殊性要求我们在软件开发上要有一套合理的管理方法。这在很多软件工程的著作中作了大量的描述，这里我们只是做一个简单的经验介绍。我们分成一下3点进行阐述：<br />
?&nbsp;规范<br />
?&nbsp;流程<br />
?&nbsp;考核<br />
<br />
规范。无论开发什么软件系统，都必须按照一定的规范进行。软件开发过程采用规范进行管理的必要性相信任何一个管理者都会有明确的认识，这里我们只谈采用什么规范，怎么样执行规范。软件工程的规范主要有CMM和ISO9000。通常我们采用CMM规范，并根据软件组织的具体情况对规范进行相应的裁减。不管怎么裁减，在开发管理过程中，以下一些关键环节是不可缺少的：需求分析，架构设计，概要设计，编码，测试。通常，我们可以利用配置管理和版本管理的工具来进行开发过程的管理。在这些过程中，我们必须按照一定的CMM规范产生相应的过程输出。我们采用的规范都要形成相应的书面材料或者模版以供员工阅读。总结一下我们需要的基本模版：需求分析模版、设计模版（架构、模块、数据）、编码规范、测试规范，基本管理工具：版本管理、配置管理、测试流程管理。<br />
<br />
流程。流程涵盖软件组织的内部流程以及软件组织和需求单位之间的外部流程。外部流程包括需求讨论流程、需求确认流程、系统初审流程、系统终审流程等等。内部流程包括需求分析流程、设计流程、开发流程、测试流程等等。每个组织要根据自身特点和项目特点按照CMM规范的要求制定流程，并对流程进行讲解，按照流程严格执行。在流程的各个环节完成软件项目的输出：需求书、设计书、代码、产品、测试记录、说明书等等。<br />
<br />
除了正确的规范和流程以外，任何一项工作都要进行考核。考核可以是全方位的，除了工作业绩外，协作意识、学习意识、责任意识都在考核的范围内。软件的输出是个人脑力劳动的输出，独立完成同一个功能，不同的开发人员输出产品的性能、稳定性很难完全一致，因此工作业绩的量化很难，对于工作业绩可以采用以下公式进行评估：<br />
?&nbsp;工作业绩=工作量（小时）*复杂度（1-10）*创新性（1-10，是否可以参考以前的项目）*重要性（1-10）*质量（1-10）。<br />
不要用输出代码或者文档的长度来衡量工作量，因为有时一项重要的任务思考很长时间，但是输出却很短。复杂度、创新性、重要性、质量包含了对能力的评估，使得能力强的人工作业绩能够得到体现。复杂度、创新性、重要性、质量标准的确定是很难的，不同的人有不同的见解，这套标准需要软件工程的人员专门研究确定，这个标准可以是公司自身的标准。协作意识、学习意识、责任意识也是考核的一方面，这些标准的制定也需要软件工程人员研究后确定。<br />
<br />
最后我们对软件开发团队的建设、软件开发管理的一些理念做一个总结：<br />
?*&nbsp;根据技术要求、项目要求确定团队的模块功能，既能满足要求又不能形成岗位重复和浪费。<br />
?*&nbsp;选择合适的团队成员，利用书面测试考察应聘者的能力、经验，感知应聘者的情伤，避免招聘难于融合到团队的人员。<br />
?*&nbsp;建立团队的风格，比如：分享、透明、责任、协作、团结、激情。确立正确的团队目标，给每个人一个合适的舞台去发挥，同时避免不利于团队精神形成的管理方法。<br />
?*&nbsp;制定适合企业的软件工程规范，并严格执行。<br />
?*&nbsp;制定适合企业的流程，并严格执行。<br />
?*&nbsp;制定适合企业的考核体系，并严格执行。
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/129743#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, 08 Oct 2007 16:05:04 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/129743</link>
        <guid>http://flierlh.javaeye.com/blog/129743</guid>
      </item>
      <item>
        <title>10条有益的涉世忠告</title>
        <author>tigerli</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flierlh.javaeye.com">tigerli</a>&nbsp;
          链接：<a href="http://flierlh.javaeye.com/blog/127742" style="color:red;">http://flierlh.javaeye.com/blog/127742</a>&nbsp;
          发表时间: 2007年09月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="mode_table_mains">
<div style="position: relative;">
<div class="lh3" id="veryContent" style="overflow: hidden; font-size: 12px; width: 100%;">
<table class="contentTable" cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td>如何在涉世之初少走弯路，有一个好的开端，开始一番成功的事业？以下是一些先行者积累的10条有益的涉世忠告。好好地遵循、把握这些忠告和建议吧，比起所学的课堂课程来，它毫不逊色！&nbsp;<br />
            <br />
            1.&nbsp;买个闹钟，以便按时叫醒你。贪睡和不守时，都将成为你工作和事业上的绊脚石，任何时候都一样。不仅要学会准时，更要学会提前。就如你坐车去某地，沿途的风景很美，你忍不住下车看一看，后来虽然你还是赶到了某地，却不是准时到达。&ldquo;闹钟&rdquo;只是一种简单的标志和提示，真正灵活、实用的时间，掌握在每个人的心中。&nbsp;<br />
            <br />
            2.&nbsp;如果你不喜欢现在的工作，要么辞职不干，要么就闭嘴不言。初出茅庐，往往眼高手低，心高气傲，大事做不了，小事不愿做。不要养成挑三拣四的习惯。不要雨天烦打伞，不带伞又怕淋雨，处处表现出不满的情绪。记住，不做则已，要做就要做好。&nbsp;<br />
            <br />
            3.&nbsp;每个人都有孤独的时候。要学会忍受孤独，这样才会成熟起来。年轻人嘻嘻哈哈、打打闹闹惯了，到了一个陌生的环境，面对形形色色的人和事，一下子不知所措起来，有时连一个可以倾心说话的地方也没有。这时，千万别浮躁，学会静心，学会忍受孤独。在孤独中思考，在思考中成熟，在成熟中升华。不要因为寂寞而乱了方寸，而去做无聊无益的事情，白白浪费了宝贵的时间。&nbsp;<br />
            <br />
            4.走运时要做好倒霉的准备。有一天，一只狐狸走到一个葡萄园外，看见里面水灵灵的葡萄垂涎欲滴。可是外面有栅栏挡着，无法进去。于是它一狠心绝食三日，减肥之后，终于钻进葡萄园内饱餐一顿。当它心满意足地想离开葡萄园时，发觉自己吃得太饱，怎么也钻不出栅栏了。相信任何人都不愿做这样的狐狸。退路同样重要。饱带干粮，晴带雨伞，点滴积累，水到渠成。有的东西今天似乎一文不值，但有朝一日也许就会身价百倍。&nbsp;<br />
            <br />
            5.&nbsp;不要像玻璃那样脆弱。有的人眼睛总盯着自己，所以长不高看不远；总是喜欢怨天尤人，也使别人无比厌烦。没有苦中苦，哪来甜中甜？不要像玻璃那样脆弱，而应像水晶一样透明，太阳一样辉煌，腊梅一样坚强。既然睁开眼睛享受风的清凉，就不要埋怨风中细小的沙粒。&nbsp;<br />
            <br />
            6.管住自己的嘴巴。不要谈论自己，更不要议论别人。谈论自己往往会自大虚伪，在名不副实中失去自己。议论别人往往陷入鸡毛蒜皮的是非口舌中纠缠不清。每天下班后和你的那些同事朋友喝酒聊天可不是件好事，因为，这中间往往会把议论同事、朋友当做话题。背后议论人总是不好的，尤其是议论别人的短处，这些会降低你的人格。&nbsp;<br />
            <br />
            7.&nbsp;机会从不会&ldquo;失掉&rdquo;，你失掉了，自有别人会得到。不要凡事在天，守株待兔，更不要寄希望于&ldquo;机会&rdquo;。机会只不过是相对于充分准备而又善于创造机会的人而言的。也许，你正为失去一个机会而懊悔、埋怨的时候，机会正被你对面那个同样的&ldquo;倒霉鬼&rdquo;给抓住了。没有机会，就要创造机会，有了机会，就要巧妙地抓住。&nbsp;<br />
            <br />
            8.若电话老是不响，你该打出去。很多时候，电话会给你带来意想不到的收获，它不是花瓶，仅仅成为一种摆设。交了新朋友，别忘了老朋友，朋友多了路好走。交际的一大诀窍就是主动。好的人缘好的口碑，往往助你的事业更上一个台阶。&nbsp;<br />
            <br />
            9.千万不要因为自己已经到了结婚年龄而草率结婚。想结婚，就要找一个能和你心心相印、相辅相携的伴侣。不要因为放纵和游戏而恋爱，不要因为恋爱而影响工作和事业，更不要因一桩草率而失败的婚姻而使人生受阻。感情用事往往会因小失大。&nbsp;<br />
            <br />
            10.&nbsp;写出你一生要做的事情，把单子放在皮夹里，经常拿出来看。人生要有目标，要有计划，要有提醒，要有紧迫感。一个又一个小目标串起来，就成了你一生的大目标。生活富足了，环境改善了，不要忘了皮夹里那张看似薄薄的单子。&nbsp;&nbsp;</td>
        </tr>
    </tbody>
</table>
</div>
</div>
</div>
<div class="mode_sign showsign" id="verySign">
<table class="contentTable" cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td>只要我决心成功，失败永远不能将我击垮！</td>
        </tr>
    </tbody>
</table>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://flierlh.javaeye.com/blog/127742#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, 27 Sep 2007 23:05:58 +0800</pubDate>
        <link>http://flierlh.javaeye.com/blog/127742</link>
        <guid>http://flierlh.javaeye.com/bl