﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-藏经阁-文章分类-转载</title><link>http://www.blogjava.net/zhouf/category/36475.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 25 Jul 2012 04:42:56 GMT</lastBuildDate><pubDate>Wed, 25 Jul 2012 04:42:56 GMT</pubDate><ttl>60</ttl><item><title>JSP静态化HTML笔记</title><link>http://www.blogjava.net/zhouf/articles/383790.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Mon, 23 Jul 2012 11:37:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/383790.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/383790.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/383790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/383790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/383790.html</trackback:ping><description><![CDATA[至于将JSP页面静态化为HTML的好处，想必不用我在此解释了。之前用过一种伪处理的方式，用urlrewrite地址重定向伪装了访问路径，每次访问页面的时候还是会读取数据库，其实每次读取的数据都一样，特别是如新闻内容这种类型的页面，还是不太完美，今天在网上找了一些资料，也发现用urlrewrite的不少，我希望是能生成html文件那样的处理，还好找到一个博客，写的这样的处理方法，才发现，人家早就写了，只是当时没有下功夫去学习，今天按照上面的步骤做出来了，顺便记在这里<br /><br />创建一个Servlet，主要内容如下<br /><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">String&nbsp;url&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">""</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">String&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">""</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">Charset&nbsp;charset&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Charset.forName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">UTF-8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">设置生成文件的字符集</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">ServletContext&nbsp;servletContext&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getServletContext();<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">String&nbsp;file_name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;request.getParameter(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">file_name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">url&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;file_name&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.jsp</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;你要生成的页面动态页面来源</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;servletContext.getRealPath(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;file_name&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.html</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;这是生成的html文件名,如index.html文件名字与源文件名相同</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">RequestDispatcher&nbsp;requestDispatcher&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;servletContext.getRequestDispatcher(url);<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;ByteArrayOutputStream&nbsp;outStream&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ByteArrayOutputStream();<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;ServletOutputStream&nbsp;stream&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ServletOutputStream()&nbsp;{<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;write(</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">[]&nbsp;data,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;offset,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;length)&nbsp;{<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.write(data,&nbsp;offset,&nbsp;length);<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;write(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;b)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException&nbsp;{<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.write(b);<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;PrintWriter&nbsp;printWriter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;PrintWriter(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;OutputStreamWriter(outStream,charset));<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">HttpServletResponse&nbsp;rep&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;HttpServletResponseWrapper(response)&nbsp;{<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;ServletOutputStream&nbsp;getOutputStream()&nbsp;{<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;stream;<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;PrintWriter&nbsp;getWriter()&nbsp;{<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;printWriter;<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">requestDispatcher.include(request,&nbsp;rep);<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">printWriter.flush();<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">FileOutputStream&nbsp;fos&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileOutputStream(name);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;把jsp输出的内容写到html文件中去</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">outStream.writeTo(fos);<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">fos.close();<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">out.print(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&lt;p&nbsp;align=center&gt;OK&lt;/p&gt;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span></div>我是想把page.jsp这个文件转换成page.html，所以只传了一个参数，如果想把show.jsp?id=123转换成123.html，相信这也难不到大家，只不过得注意引用CSS或图片的路径<br />这是在网上那位仁兄贴出来的代码，并做了些修改，他还介绍了其它的些，其它的还没来得及学习，先把这些记录下来。<br />我在转换的时候，碰到中文问题，更改request和response的字符集都搞不定，还好参考了<a href="http://www.blogjava.net/zphab/articles/295631.html">http://www.blogjava.net/zphab/articles/295631.html</a>，把字符编码加过来了，中文才算搞定了，简单的测试通过后，放在应用里就好办了。人家写出来这么多年了，才发现，惭愧呀<br /><br />以上方案参考：<a href="http://blog.csdn.net/noove_001/article/details/1953682">http://blog.csdn.net/noove_001/article/details/1953682</a><img src ="http://www.blogjava.net/zhouf/aggbug/383790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2012-07-23 19:37 <a href="http://www.blogjava.net/zhouf/articles/383790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle10g数据库导入导出（跨字符集） </title><link>http://www.blogjava.net/zhouf/articles/264871.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Sun, 25 Jul 2010 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/264871.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/264871.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/264871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/264871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/264871.html</trackback:ping><description><![CDATA[一导出：<br />
#!/bin/bash<br />
su - oracle -c "exp system/fakepass tables=$1 file=/data/$1.dmp"<br />
<br />
[root@web oracle8i]# dmp album<br />
<br />
Export: Release 10.1.0.3.0 - Production on 星期一 2月 5 01:56:55 2007<br />
<br />
Copyright (c) 1982, 2004, Oracle.&nbsp; All rights reserved.<br />
<br />
<br />
连接到: Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Production<br />
With the Partitioning, OLAP and Data Mining options<br />
已导出 ZHS16CGB231280 字符集和 AL16UTF16 NCHAR 字符集<br />
服务器使用 ZHS16GBK 字符集 (可能的字符集转换)<br />
<br />
即将导出指定的表通过常规路径...<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;&nbsp;&nbsp; ALBUM导出了&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 590 行<br />
EXP-00091: 正在导出有问题的统计信息。<br />
EXP-00091: 正在导出有问题的统计信息。<br />
EXP-00091: 正在导出有问题的统计信息。<br />
导出成功终止, 但出现警告。<br />
二导入<br />
从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production<br />
With the Partitioning, OLAP and Data Mining options 断开<br />
[oracle@dev ~]$ imp system/fit2007 file=blogcat.dmp tables=blogcat<br />
<br />
Import: Release 10.2.0.1.0 - Production on 星期一 2月 5 01:44:39 2007<br />
<br />
Copyright (c) 1982, 2005, Oracle.&nbsp; All rights reserved.<br />
<br />
<br />
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production<br />
With the Partitioning, OLAP and Data Mining options<br />
<br />
经由常规路径由 EXPORT:V10.01.00 创建的导出文件<br />
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入<br />
导入服务器使用 AL32UTF8 字符集 (可能的字符集转换)<br />
导出客户机使用 ZHS16CGB231280 字符集 (可能的字符集转换)<br />
. 正在将 SYSTEM 的对象导入到 SYSTEM<br />
. 正在将 SYSTEM 的对象导入到 SYSTEM<br />
. . 正在导入表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "BLOGCAT"导入了&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1938 行<br />
成功终止导入, 没有出现警告。<br />
[oracle@dev ~]$ imp system/topsecret file=blogcat.dmp tables=blogcat<br />
三总结<br />
&nbsp;&nbsp; 2个oracle10g服务器，导出的在北京， 版本10.1.0.3.0， 使用 ZHS16GBK 字符集。<br />
&nbsp; 导入的在宝鸡，临时开发测试用，版本 10.2.0.1.0，AL32UTF8 字符集。<br />
&nbsp; 主要问题是2个服务器字符集不同，解决的关键是：在导入前，设置导入机器的NLS_LANG 与导出机器的NLS_LANG相同，为Simplified Chinese_china.ZHS16GBK<br />
&nbsp; 全部导出的dmp文件有1.8G，学校服务器带宽有限，所以采用了导出常用数据表的最新数据方法。<br />
<br />
转:http://www.zhuoda.org/hofman/78332.html<br />
<img src ="http://www.blogjava.net/zhouf/aggbug/264871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2010-07-25 11:53 <a href="http://www.blogjava.net/zhouf/articles/264871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在JSP中配置FCKeditor 2.6.4</title><link>http://www.blogjava.net/zhouf/articles/279660.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Tue, 02 Jun 2009 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/279660.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/279660.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/279660.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/279660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/279660.html</trackback:ping><description><![CDATA[1.FCKeditor 介绍<br />
FCKeditor 这个开源的HTML 文本编辑器可以让web 程序拥有如MS Word 这样强大的编辑功能，.FCKeditor 支持当前流行的浏览器。<br />
<br />
2．准备工作：<br />
<br />
环境：winddows XP、tomcat6.0、JDK1.6<br />
下载：<br />
1)：FCKeditor_2.6.4.zip<br />
地址：http://nchc.dl.sourceforge.net/sourceforge/fckeditor/FCKeditor_2.6.4.zip<br />
<br />
2)：fckeditor-java-2.4.1-bin.zip (JAVA支持包)地址http://nchc.dl.sourceforge.net/sourceforge/fckeditor/fckeditor-java-2.4.1-bin.zip<br />
<br />
3)：slf4j-1.5.2.zip 地址 ：http://www.slf4j.org/dist/slf4j-1.5.2.zip<br />
<br />
3.安装：<br />
<br />
下面以jsp为例：<br />
<br />
分别解压之后，我们可以得到一个fckeditor和fckeditor-java-2.4.1两个文件夹。fckeditor文件夹下是需要调用的页面和js文件等等，有各种版本，无所谓啦，我们之需要jsp就够了。将文件加全部复制到工程目录下等待调用即可。<br />
注意：有点麻烦的是导包的问题。我们一共需要5个包：commons-fileupload-1.2.1.jar，commons-io-1.3.2.jar，fckeditor-java-core-2.4.1.jar，slf4j-api-1.5.6.jar，slf4j-simple-1.5.6.jar或slf4j-jdk14-1.5.6.jar。<br />
上面前四个包都可以在fckeditor-java-2.4.1文件夹下面找到，但是第五个却要另外去找，这点我非常不理解，为什么不放在一起。<br />
如果没有的话编译时就会出现如下错误信息：<br />
严重: Servlet /fckeditorDemo threw load() exception<br />
java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder<br />
<br />
<br />
<br />
当然版本或许不同，以上的版本是截止2009-02-4的最新版本。如果想要最新版本，可以在slf4j的官网http://www.slf4j.org/download.html下到。但是要注意，截止到2009-2-4，slf4j官方最新版本是1.5.6，但是fckeditor提供的slf4j-api却是1.5.2版本，如果两个版本不一样的话，你将会在控制台看到如下的消息：<br />
<br />
严重: Servlet /Java threw load() exception<br />
java.lang.IllegalAccessError: tried to access field org.slf4j.impl.StaticLoggerBinder.SINGLETON from class<br />
<br />
org.slf4j.LoggerFactory<br />
<br />
<br />
<br />
所以千万要注意版本一致问题。如果你实在觉得下载很麻烦，那就到这里下载吧：http://www.slf4j.org/download.html<br />
<br />
<br />
4.配置<br />
<br />
1)在工程目录src/下新建一个文件fckeditor.properties，添加内容：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">connector.userFilesPath</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">UploadFile<br />
connector.userActionImpl</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">net.fckeditor.requestcycle.impl.UserActionImpl</span></div>
其中第一行为重新定义上传的文件夹,默认文件夹为userfile,保存即可。<br />
2)修改web.xml，用来提供上传功能支持<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">Connector</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&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;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;net.fckeditor.connector.ConnectorServlet&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&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;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">load-on-startup</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">load-on-startup</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">Connector</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/fckeditor/editor/filemanager/connectors/*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&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;&nbsp;&nbsp; <br />
</span></div>
5.应用,建立一JSP文件如下<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">&lt;%</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">@&nbsp;page&nbsp;language</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">java</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;import</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">java.util.*</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;pageEncoding</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">UTF-8</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">&lt;%</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);"><br />
</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">String</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;path&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;request.getContextPath();<br />
</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">String</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;basePath&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;request.getScheme()</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">://</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">request.getServerName()</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">:</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">request.getServerPort()</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">path</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">/</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">;<br />
<br />
</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">String</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;content</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">request.getParameter(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">edt1</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">if</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;(content&nbsp;!</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">null</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;content&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;content.replaceAll(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">\r\n</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">,&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">""</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;content&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;content.replaceAll(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">\r</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">,&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">""</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;content&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;content.replaceAll(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">\n</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">,&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">""</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;content&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;content.replaceAll(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">\"",&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 128, 0);">'</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 128, 0);">");</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 128, 0);"><br />
</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">}</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">else</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">{<br />
&nbsp;&nbsp;content&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">""</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">;<br />
}<br />
<br />
</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">//</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">下面是处理中文内容的编码转换<br />
content&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">new</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">String</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">(content.getBytes(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">iso8859-1</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">),</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">utf-8</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
</span><span style="color: rgb(0, 0, 255);">&lt;!</span><span style="color: rgb(255, 0, 255);">DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">html</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">head</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">base&nbsp;</span><span style="color: rgb(255, 0, 0);">href</span><span style="color: rgb(0, 0, 255);">="&lt;%=basePath%&gt;"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">title</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">FCKEditor&nbsp;测试</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">title</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">head</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">script&nbsp;</span><span style="color: rgb(255, 0, 0);">type</span><span style="color: rgb(0, 0, 255);">="text/javascript"</span><span style="color: rgb(255, 0, 0);">&nbsp;src</span><span style="color: rgb(0, 0, 255);">="fckeditor/fckeditor.js"</span><span style="color: rgb(0, 0, 255);">&gt;&lt;/</span><span style="color: rgb(128, 0, 0);">script</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">body</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;is&nbsp;my&nbsp;JSP&nbsp;page.&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">br</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">form&nbsp;</span><span style="color: rgb(255, 0, 0);">method</span><span style="color: rgb(0, 0, 255);">="post"</span><span style="color: rgb(255, 0, 0);">&nbsp;name</span><span style="color: rgb(0, 0, 255);">="frm1"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">script&nbsp;</span><span style="color: rgb(255, 0, 0);">type</span><span style="color: rgb(0, 0, 255);">="text/javascript"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">var</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;oFCKeditor&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">new</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;FCKeditor(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">edt1</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oFCKeditor.BasePath&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">fckeditor/</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oFCKeditor.Height</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">'</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">400</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oFCKeditor.Value</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&lt;%=content%&gt;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oFCKeditor.Create();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">script</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">input&nbsp;</span><span style="color: rgb(255, 0, 0);">type</span><span style="color: rgb(0, 0, 255);">="submit"</span><span style="color: rgb(255, 0, 0);">&nbsp;value</span><span style="color: rgb(0, 0, 255);">="提交"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">form</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">hr</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">&lt;%</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">content</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">body</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">html</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span></div>
启动服务器,用浏览器访问即可看到结果<br />
<br />
今天折腾了一个下午,终于算是看到点效果了,便记录在这里,上面的内容在网上转了一部分,因为找不到原文出处,也就没有注明了<br />
<img src ="http://www.blogjava.net/zhouf/aggbug/279660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-06-02 17:42 <a href="http://www.blogjava.net/zhouf/articles/279660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>补上JBOSS的远程控制台</title><link>http://www.blogjava.net/zhouf/articles/264875.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Fri, 10 Apr 2009 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/264875.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/264875.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/264875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/264875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/264875.html</trackback:ping><description><![CDATA[下午上班时，发现服务器竟然无法访问，没有停电呀。输入密码，解开x-window的锁定状态，发现jboss确实关闭了，时间是13:23分，发现时间是15:33分。<br />
这是以前没有从未出现过的，查服务器访问日志，原来是有人通过jmx-console远程关闭了服务器，我还从使用过这个功能，倒让人先用了！<br />
我知道，jboss安装默认情况下，jmx-console/web-console不用密码，就可以访问的，但我一直还以为，只能通过
localhost使用这个功能呢，所以就没有想道会有安全问题。我想，Jboss这么专业，这么成熟，这种小问题，自然不用操心，但我错了！<br />
重新启动服务器后，我自己模拟了一下，果然，不到一分钟时间，就找到了jmx-
console/HtmlAdaptor?action=inspectMBean&amp;
name=jboss.system:type=Server这个页面，其中有一个"shutdown",选择右边的invoke，果然服务器就关闭了。<br />
根据日志分析，一个ip地址为218.79.105.121的朋友，在6月20访问过本站，今天上午10点多，通过baidu读了一篇我的关于Jboss的文章，之后访问试验本站完全开放的jmx-console，试验了3个小时，终于找到了远程关闭服务器的方法。<br />
于是，他在上海徐汇的家中（Adsl，应该是家中吧），远程地关闭了我在架北京郊区自己办公室的服务器。<br />
这么大的漏洞被忽视了，真是汗颜。赶紧补课吧。<br />
<a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=SecureTheJmxConsole" target="_blank">SecureTheJmxConsole</a>,这可是Jboss官方文档.上面提示的做法，应当可行。但没有必要那么麻烦。<br />
只要进入jmx-console.war/web-console.war这2个包的WEB-INF,编辑jboss-web.xml,
web.xml就可以了。我只是在uncomment相应的部分之后，将jaas
domain替换我用的zhuoda.org，并且将security
role替换为我用的zduAdmin就都搞定了，不需要理会user.properties, roles-properties二个文件。<br />
<br />
转:http://www.zhuoda.org/hofman/21129.html<hr size="2" width="100%" />
以下的内容来自<a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=SecureTheJmxConsole" target="_blank">SecureTheJmxConsole</a>的链接<br />
<br />
<h2> Securing the JMX Console and Web Console</h2>
<p>Both the <a href="http://www.jboss.org/community/docs/DOC-10941">jmx-console</a> and <a href="http://www.jboss.org/community/docs/DOC-12659">web-console</a> are standard servlet 2.3 deployments and can</p>
<p>be secured using J2EE role based security. Both also have a skeleton setup to allow</p>
<p>one to easily enable security using username/password/role mappings found in the</p>
<p>jmx-console.war and web-console.war deployments in the corresponding WEB-INF/classes</p>
<p>users.properties and roles.properties files.</p>
<p>The security setup is based on two pieces, the standard <span style="font-family: courier new;">WEB-INF/web.xml</span> servlet URI</p>
<p>to role specification, and the <span style="font-family: courier new;">WEB-INF/jboss-web.xml</span> specification of the JAAS configuration which defines how authentication and role mapping is performed.</p>
<p>To secure the JMX Console using a username/password file -</p>
<ul>
    <li level="1" type="ul">
    <p>Locate the <span style="font-family: courier new;">jmx-console.war</span> directory.&nbsp; This will normally be in <span style="font-family: courier new;">server/default/deploy</span> in your <span style="font-family: courier new;">JBOSS_HOME</span> directory.</p>
    </li>
    <li level="1" type="ul">
    <p>edit <span style="font-family: courier new;">WEB-INF/web.xml</span> and uncomment the security-constraint block</p>
    </li>
    <li level="1" type="ul">
    <p>edit <span style="font-family: courier new;">WEB-INF/classes/jmx-console-users.properties</span> or <span style="font-family: courier new;">server/default/conf/props/jmx-console-users.properties</span> (version &gt;=4.0.2) and <span style="font-family: courier new;">WEB-INF/classes/jmx-console-roles.properties</span> or <span style="font-family: courier new;">server/default/conf/props/jmx-console-roles.properties</span>
    (version &gt;=4.0.2) and change the users and passwords to what you
    desire.&nbsp; They will need the JBossAdmin role specified in the web.xml
    file to run the JMX Console.</p>
    </li>
    <li level="1" type="ul">
    <p>edit <span style="font-family: courier new;">WEB-INF/jboss-web.xml</span>
    and uncomment the security-domain block. The security-domain value of
    jmx-console maps is declared in the login-config.xml JAAS configuration
    file which defines how authentication and authorization is done.</p>
    </li>
</ul>
<p>To secure the JMX Console using your own JAAS domain -</p>
<ul>
    <li level="1" type="ul">
    <p>edit <span style="font-family: courier new;">WEB-INF/web.xml</span>
    as above, uncommenting the security-constraint block.&nbsp; Change the
    role-name value to be the role in your domain that can access the
    console</p>
    </li>
    <li level="1" type="ul">
    <p>edit <span style="font-family: courier new;">WEB-INF/jboss-web.xml</span> as above, setting the security domain to be the name of your security domain.&nbsp; For example, if your <span style="font-family: courier new;">login-config.xml</span> has an application-policy whose name is <em>MyDomain</em> then your JAAS domain <span style="font-family: courier new;">java:/jaas/MyDomain</span></p>
    </li>
    <li level="1" type="ul">
    <p>after making all the changes, redeploy the application.&nbsp; The application can be redeployed by touching the <span style="font-family: courier new;">web.xml</span> file or by restarting the server</p>
    </li>
</ul>
<p>The process to secure the web console is similar.&nbsp; In the deploy directory, locate <span style="font-family: courier new;">management/web-console.war</span> and make the same changes as above to to <span style="font-family: courier new;">WEB-INF/web.xml</span>, </p>
<p><span style="font-family: courier new;">WEB-INF/jboss-web.xml</span> and the users/groups properties file.&nbsp; The default JAAS domain used by the web-console is <span style="font-family: courier new;">java:/jaas/web-console</span> and is defined in <span style="font-family: courier new;">login-config.xml</span>
in the conf directory.&nbsp; You can use a custom JAAS domain or custimize
the existing domain in the same way as with the JMX console. Typically
you would just use the same domain (java:/jaas/jmx-console) as the
jmx-console so that you have a single user/role mapping to configurue.</p>
<p><span>If
you find as I did with 3.2.5 that I couldn't log in, another
users.properties is most likely being picked up. Change the web-console
login-config.xml entry so that that properties files are uniquely named
to avoid ambiguity with which resource is picked up. You also would
need to rename the web-console properties files. (see </span><a href="http://www.jboss.org/index.html?module=bb&amp;op=viewtopic&amp;t=53346">http://www.jboss.org/index.html?module=bb&amp;op=viewtopic&amp;t=53346</a> )</p>
<p>As an extra level of security you may also want to LimitAccessToCertainClients in a particular IP address range.</p>
<p>-</p>
<hr originaltext="----" />
<p><strong>Update for 4.0.2</strong></p>
<p>The <span style="font-family: courier new;">jmx-console-roles.properties</span> and <span style="font-family: courier new;">jmx-console-users.properties</span> files have been moved to <span style="font-family: courier new;">server"default"conf"props</span>.
This is because of the change to use the servlet 2.3 class loading
model and these properties files would not be visible to the other
deployments using the jmx-console security domain. You can&nbsp; move the
files from <span style="font-family: courier new;">conf"props</span> to <span style="font-family: courier new;">WEB-INF"classes</span>, or leave them in place and edit the password for admin.</p>
<p>Similarly for the web console, please note that the web console is unpacked already in the default server configuration as <span style="font-family: courier new;">deploy/management/console-mgr.sar/web-console.war</span>. Proceed to edit the <span style="font-family: courier new;">WEB-INF/web.xml</span> and <span style="font-family: courier new;">jboss-web.xml</span> files as per securing the JMX console, and either edit the <span style="font-family: courier new;">WEB-INF/classes/web-console-roles.properties</span> and <span style="font-family: courier new;">web-console-users.properties</span>, or move those files to <span style="font-family: courier new;">server"default"conf"props</span> and edit them there.</p>
<p><strong>For the impatient</strong></p>
<p>vi $JBOSS_HOME/server/default/deploy/jmx-console.war/WEB-INF/web.xml</p>
<p>uncomment the security-constraint block</p>
<p>and add a &lt;login-config&gt; block after the end of the &lt;security-constraint&gt; block:</p>
<p><span style="font-family: courier new;">&nbsp;&nbsp;
&lt;login-config&gt;
&lt;auth-method&gt;BASIC&lt;/auth-method&gt;
&lt;realm-name&gt;JMXConsole&lt;/realm-name&gt;
&lt;/login-config&gt;
</span></p>
<p>vi $JBOSS_HOME/server/default/deploy/jmx-console.war/WEB-INF/jboss-web.xml</p>
<p>Uncomment the security-domain block. Make sure the JNDI name maps to the realm name (i.e. JMXConsole)</p>
<p>vi $JBOSS_HOME/server/default/conf/props/jmx-console-users.properties</p>
<p>change the password for admin</p>
<p>vi $JBOSS_HOME/server/default/deploy/management/console-mgr.sar/web-console.war/WEB-INF/web.xml</p>
<p>uncomment the security-constraint block</p>
<p>and add a &lt;login-config&gt; block after the end of the &lt;security-constraint&gt; block:</p>
<p><span style="font-family: courier new;">&nbsp;&nbsp;
&lt;login-config&gt;
&lt;auth-method&gt;BASIC&lt;/auth-method&gt;
&lt;realm-name&gt;JMXConsole&lt;/realm-name&gt;
&lt;/login-config&gt;
</span></p>
<p>vi $JBOSS_HOME/server/default/deploy/management/console-mgr.sar/web-console.war/WEB-INF/jboss-web.xml</p>
<p>Uncomment the security-domain block. Make sure the JNDI name maps to the realm name (e.g. JMXConsole)</p>
<p>vi $JBOSS_HOME/server/default/conf/login-config.xml</p>
<p>Change
the path to the web-console-users.properties and the
web-console-roles.properties as follows (add props/ to the front of the
path)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module-option name="usersProperties"&gt;props/web-console-users.properties&lt;/module-option&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module-option name="rolesProperties"&gt;props/web-console-roles.properties&lt;/module-option&gt;</p>
<p>cp
$JBOSS_HOME/server/default/deploy/management/console-mgr.sar/web-console.war/WEB-INF/classes/web-console-.properties
$JBOSS_HOME/server/default/conf/props</p>
<p>edit as needed</p>
<p>cp
$JBOSS_HOME/server/default/conf/props/jmx-console-roles.properties
$JBOSS_HOME/server/default/conf/props/web-console-roles.properties</p>
<p>edit as needed</p>
<p>edit
$JBOSS_HOME/server/default/conf/login-config.xml, find the jmx-console
and web-console applicaiton-policy, and set the name to jmx-console and
web-console, respectively. That is make sure that the application
policy name maps to the realm name (i.e. JMXConsole)</p>
<p>restart jboss</p>
<hr originaltext="----" />
<p><strong>Additional to secure jmx-console and web-console authentication via SSL</strong></p>
<ul>
    <li level="1" type="ul">
    <p>must perform the above steps to enable http authenication ...</p>
    </li>
</ul>
<p>&nbsp;&nbsp; the following steps below will redirect jboss admin pages to <a href="https://localhost:8443/">https://localhost:8443</a></p>
<ul>
    <li level="1" type="ul">
    <p>edit both web.xml to include the following just before end of tag security-constraint </p>
    </li>
</ul>
<p><span style="font-family: courier new;">&nbsp;&nbsp;
&lt;security-constraint&gt;
&nbsp; ...
&nbsp; &lt;user-data-constraint&gt;
&nbsp;&nbsp;&nbsp; &lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;
&nbsp; &lt;/user-data-constraint&gt;
&lt;/security-constraint&gt;
</span></p>
<ul>
    <li level="1" type="ul">
    <p>generate /data01/jboss/server/xxxx/conf/keystore and select your own new secure password</p>
    </li>
</ul>
<p>(@see creating SSL keystore using the java keytool - <a href="http://www.informit.com/articles/article.asp?p=407886">http://www.informit.com/articles/article.asp?p=407886</a>)</p>
<p>or quick setup and verify via </p>
<p><span style="font-family: courier new;">
$ keytool -genkey -keystore /data01/jboss/server/xxx/conf/keystore -alias jbossAdmin
$ keytool -list -keystore /data01/jboss/server/xxx/conf/keystore
</span></p>
<p>$vi /data01/jboss/server/xxx/deploy/jbossweb-tomcat50.sar/server.xml</p>
<ul>
    <li level="1" type="ul">
    <p>secure file permission via chmod 600 server.xml</p>
    </li>
    <li level="1" type="ul">
    <p>uncomment section "SSL/TLS Connector" to enable Connector port="8443"</p>
    </li>
    <li level="1" type="ul">
    <p>replace keystoreFile="${jboss.server.home.dir}/conf/chap8.keystore" </p>
    </li>
</ul>
<p>&nbsp; with&nbsp;&nbsp;&nbsp; keystoreFile="${jboss.server.home.dir}/conf/keystore"</p>
<ul>
    <li level="1" type="ul">
    <p>replace keystorePass="rmi+ssl" sslProtocol = "TLS" /&gt; </p>
    </li>
</ul>
<p>&nbsp; with&nbsp;&nbsp;&nbsp; keystorePass="</p>
<br />
<img src ="http://www.blogjava.net/zhouf/aggbug/264875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-04-10 16:30 <a href="http://www.blogjava.net/zhouf/articles/264875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE定时采集程序</title><link>http://www.blogjava.net/zhouf/articles/263933.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Wed, 08 Apr 2009 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/263933.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/263933.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/263933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/263933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/263933.html</trackback:ping><description><![CDATA[最近因项目需要编写一个定时采集程序，于是就到网上找了一下相关的资料，最后发现一个非常简单的部署定时进程的方法——利用侦听器和定时器。<br />
首先，编写一个Servlet用于启动定时器和进行任务调度，参考代码如下：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;javax.servlet.ServletContextEvent;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;MyTimer&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;javax.servlet.http.HttpServlet&nbsp;</span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.ServletContextListener&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;private&nbsp;static&nbsp;final&nbsp;long&nbsp;serialVersionUID&nbsp;=&nbsp;1L;</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;java.util.Timer&nbsp;timer&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;contextInitialized(ServletContextEvent&nbsp;event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;java.util.Timer(</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">定时器已启动</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.schedule(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;MyTimerTask(),&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 0);">24</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">60</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">60</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">1000</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">已经添加任务调度表</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;contextDestroyed(ServletContextEvent&nbsp;event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.cancel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">定时器销毁</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
其中利用了定时器的java.util.Timer.schedule(TimerTask task, long delay, long period)方法，里面的参数依次为：任务类,延时（单位毫秒）,周期（单位毫秒）。根据我的设定，每２４小时运行一次。<br />
然后是任务调度类：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.util.Calendar;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.util.TimerTask;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;MyTimerTask&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;TimerTask&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;C_SCHEDULE_HOUR&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">22</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;isRunning&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Calendar.getInstance();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">isRunning)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(C_SCHEDULE_HOUR&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;cal.get(Calendar.HOUR_OF_DAY))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isRunning&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">开始执行指定任务</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);">&nbsp;Your&nbsp;Code&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isRunning&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">指定任务执行结束</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">上一次任务执行还未结束</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
其中C_SCHEDULE_HOUR为执行任务的时段，根据我的要求是每天２２点后才执行我的采集程序。<br />
最后是配置侦听器：<br />
在web.xml中添加以下代码，当然Servlet名要换成真实的<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">listener</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">listener-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">com.test.MyTimer</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">listener-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">listener</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
就这样，只需三步，一个简单的定时采集进程就搞定了
<img src ="http://www.blogjava.net/zhouf/aggbug/263933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-04-08 09:44 <a href="http://www.blogjava.net/zhouf/articles/263933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eWebEditor在JBOSS下无法显示的问题</title><link>http://www.blogjava.net/zhouf/articles/264392.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Wed, 08 Apr 2009 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/264392.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/264392.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/264392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/264392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/264392.html</trackback:ping><description><![CDATA[在将一个Tomcat项目迁移到JBOSS时,出现了一点问题,就是配置好的eWebEditor不能用了,控制台里报以下的错误<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">Exception&nbsp;in&nbsp;JSP:&nbsp;</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">eWebEditor.jsp:</span><span style="color: rgb(0, 0, 0);">54</span></div>
经过一番折腾后又发现了如下的出错提示<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">java.lang.NoClassDefFoundError:&nbsp;org</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">dom4j</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">xpath</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">DefaultXPath</span></div>
后来发现是dom4j.jar版本不对造成的问题,JBOSS自带的版本会出现上述的情况<br />
解决方法如下:<br />
将eWebEditor里自带的dom4j.jar(476K)的文件覆盖掉jboss4\lib\dom4j.jar(297K)即可,本文参考以下的材料<br />
<hr size="2" width="100%" />
The error "java.lang.NoClassDefFoundError: org/dom4j/xpath/DefaultXPath" underlines important changes to the dom4j XML library. It usually happens when you try to call this library's methods in runtime. Older versions that shipped with JBoss used to include Jaxen, but for whatever reason, it is no longer included. Users must download dom4j.jar (now at version 1.6.1) and then jaxen-full.jar (FCS-1.0). Now how to resolve this problem is tricky:<br />
<br />
&nbsp;&nbsp; 1. Put dom4j-1.3.jar in {jboss}/lib. This version is known good.<br />
&nbsp;&nbsp; 2. Put dom4j-1.6.1.jar and jaxen-full.jar in {jboss}/server/default/lib. Remove the old dom4j JARs that may exist in that directory.<br />
<br />
The reason the newer version cannot be used with JBoss is unknown, but it does not work. The older version is used when reading JBoss-specific config files. The newer version of dom4j kicks in when the default server is initialized. This allows development of applications using newer versions of the XML API.<br />
<br />
http://prideafrica.blogspot.com/2006/05/javalangnoclassdeffounderror.html<br />
<br />
<img src ="http://www.blogjava.net/zhouf/aggbug/264392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-04-08 09:40 <a href="http://www.blogjava.net/zhouf/articles/264392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装Eclipse SVN plugin(Subclipse)(转载)</title><link>http://www.blogjava.net/zhouf/articles/262061.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Thu, 26 Mar 2009 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/262061.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/262061.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/262061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/262061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/262061.html</trackback:ping><description><![CDATA[这里介紹Eclipse的SVN Plugin，叫做Subclipse,官方网站的下载地址在<a href="http://subclipse.tigris.org/"><font color="#007799">http://subclipse.tigris.org/</font></a>，也提供了update site <a href="http://subclipse.tigris.org/update"><font color="#007799">http://subclipse.tigris.org/update</font></a>。<br />
Eclipse
的使用者可以通过Eclipse的插件自动下载和更新功能来安装这个插件，在Eclipse的菜单中选择Help-&gt;Software
Updates-&gt;Find and Install-&gt; Search for new features to install
-&gt;New Remote Site。URL中就输入<a href="http://subclipse.tigris.org/update"><font color="#007799">http://subclipse.tigris.org/update</font></a>，Eclipse就会自已安装上了.
<p>安装完成后，在Eclipse的plugins中就会多了5个包，命名为org.tigris.subversion.*的都应该是了。打开
Eclipse,window-&gt;show
view窗口中多了一个SVN文件夹，到此就证明svn插件成功的安装上了。具体的使用方法，在Eclipse的Help中有详细的帮助
Subclipse - Subversion Eclipse
Plugin，教你一步一步的使用SVN的客户端了。如果你对subversion想进行深入的了解，那么看看help中的Version
Control with
Subversion一定有所收获，通过本人的观察，这份文档和sbuversion安装文件中提供的官方文档一样，这里看起来就更舒服些了。
</p>
<img src ="http://www.blogjava.net/zhouf/aggbug/262061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-03-26 11:57 <a href="http://www.blogjava.net/zhouf/articles/262061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat6 数据连接池配置</title><link>http://www.blogjava.net/zhouf/articles/258225.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Fri, 06 Mar 2009 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/258225.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/258225.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/258225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/258225.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/258225.html</trackback:ping><description><![CDATA[Tomcat6 和 Tomcat5的配置不一样,我按Tomcat5的配置方法,就是报错,以前是把配置写在server.xml里,但在Tomcat6里面是把配置写在conf/context.xml里<br />
把数据库驱动放到lib目录下<br />
配置tomcat下的conf下的context.xml文件,在&lt;context&gt;&lt;/context&gt;之间添加连接池如下<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">Resource&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="jdbc/mysql"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;auth</span><span style="color: rgb(0, 0, 255);">="Container"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: rgb(0, 0, 255);">="javax.sql.DataSource"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;driverClassName</span><span style="color: rgb(0, 0, 255);">="com.mysql.jdbc.Driver"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;url</span><span style="color: rgb(0, 0, 255);">="jdbc:mysql://localhost/test"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;username</span><span style="color: rgb(0, 0, 255);">="root"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;password</span><span style="color: rgb(0, 0, 255);">="root"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;maxActive</span><span style="color: rgb(0, 0, 255);">="100"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;maxIdle</span><span style="color: rgb(0, 0, 255);">="30"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;maxWait</span><span style="color: rgb(0, 0, 255);">="10000"</span><span style="color: rgb(255, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">/&gt;</span></div>
配置你的应用下的web.xml中的&lt;web-app&gt;&lt;/web-app&gt;之间加入<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">resource-ref</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">description</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">DB&nbsp;Connection</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">description</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">res-ref-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">jdbc/mysql</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">res-ref-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">res-type</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">javax.sql.DataSource</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">res-type</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">res-auth</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">Container</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">res-auth</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">resource-ref</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp; <br />
</span></div>
配置好了之后就可以通过下面的方式获取数据库连接<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">DataSource&nbsp;ds&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;InitialContext&nbsp;ctx</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;InitialContext();&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ds</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">(DataSource)ctx.lookup(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">java:comp/env/jdbc/mysql</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;ds.getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
}</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">(Exception&nbsp;ex){&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();&nbsp;&nbsp;&nbsp;<br />
} <br />
</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/zhouf/aggbug/258225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-03-06 15:47 <a href="http://www.blogjava.net/zhouf/articles/258225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL优化经验</title><link>http://www.blogjava.net/zhouf/articles/254124.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Tue, 10 Feb 2009 12:48:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/254124.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/254124.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/254124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/254124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/254124.html</trackback:ping><description><![CDATA[同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法，因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。<br />
<br />
安装好mysql后，配制文件应该在/usr/local/mysql/share/mysql目录中，配制文件有几个，有my- huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境，当然需要有不同的配制文件了。<br />
<br />
一般的情况下，my-medium.cnf这个配制文件就能满足我们的大多需要；一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了，使用mysqladmin variables extended-status &#8211;u root &#8211;p 可以看到目前的参数，有３个配置参数是最重要的，即key_buffer_size,query_cache_size,table_cache。<br />
<br />
key_buffer_size只对MyISAM表起作用，<br />
<br />
key_buffer_size指定索引缓冲区的大小，它决定索引处理的速度，尤其是索引读的速度。一般我们设为16M,实际上稍微大一点的站点　这个数字是远远不够的，通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好（上述状态值可以使用SHOW STATUS LIKE &#8216;key_read%&#8217;获得）。 或者如果你装了phpmyadmin 可以通过服务器运行状态看到,笔者推荐用phpmyadmin管理mysql，以下的状态值都是本人通过phpmyadmin获得的实例分析:<br />
<br />
这个服务器已经运行了20天<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">key_buffer_size&nbsp;&#8211;&nbsp;128M&nbsp;<br />
key_read_requests&nbsp;&#8211;&nbsp;650759289&nbsp;<br />
key_reads&nbsp;-&nbsp;79112</span></div>
比例接近1:8000 健康状况非常好<br />
<br />
另外一个估计key_buffer_size的办法　把你网站数据库的每个表的索引所占空间大小加起来看看以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大。<br />
<br />
从4.0.1开始，MySQL提供了查询缓冲机制。使用查询缓冲，MySQL将SELECT语句和查询结果存放在缓冲区中，今后对于同样的SELECT语句（区分大小写），将直接从缓冲区中读取结果。根据MySQL用户手册，使用查询缓冲最多可以达到238%的效率。<br />
<br />
通过调节以下几个参数可以知道query_cache_size设置得是否合理<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">Qcache&nbsp;inserts&nbsp;<br />
Qcache&nbsp;hits&nbsp;<br />
Qcache&nbsp;lowmem&nbsp;prunes&nbsp;<br />
Qcache&nbsp;free&nbsp;blocks&nbsp;<br />
Qcache&nbsp;total&nbsp;blocks</span></div>
Qcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况,同时Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，此时需要增加缓冲大小Qcache_hits的值不大，则表明你的查询重复率很低，这种情况下使用查询缓冲反而会影响效率，那么可以考虑不用查询缓冲。此外，在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。<br />
<br />
Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多query_cache_type指定是否使用查询缓冲<br />
<br />
我设置:<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">query_cache_size&nbsp;=&nbsp;32M&nbsp;<br />
query_cache_type=&nbsp;1 <br />
</span></div>
得到如下状态值:<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">Qcache&nbsp;queries&nbsp;in&nbsp;cache&nbsp;12737&nbsp;表明目前缓存的条数&nbsp;<br />
Qcache&nbsp;inserts&nbsp;20649006&nbsp;<br />
Qcache&nbsp;hits&nbsp;79060095&nbsp;　看来重复查询率还挺高的&nbsp;<br />
Qcache&nbsp;lowmem&nbsp;prunes&nbsp;617913　有这么多次出现缓存过低的情况&nbsp;<br />
Qcache&nbsp;not&nbsp;cached&nbsp;189896&nbsp;　　&nbsp;<br />
Qcache&nbsp;free&nbsp;memory&nbsp;18573912　　目前剩余缓存空间&nbsp;<br />
Qcache&nbsp;free&nbsp;blocks&nbsp;5328&nbsp;这个数字似乎有点大　碎片不少&nbsp;<br />
Qcache&nbsp;total&nbsp;blocks&nbsp;30953 <br />
</span></div>
如果内存允许32M应该要往上加点<br />
<br />
table_cache指定表高速缓存的大小。每当MySQL访问一个表时，如果在表缓冲区中还有空间，该表就被打开并放入其中，这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables，可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache，并且opened_tables在不断增长，那么你就需要增加table_cache的值了（上述状态值可以使用SHOW STATUS LIKE &#8216;Open%tables&#8217;获得）。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。<br />
<br />
对于有1G内存的机器，推荐值是128－256。<br />
<br />
笔者设置table_cache = 256<br />
<br />
得到以下状态:<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">Open&nbsp;tables&nbsp;256&nbsp;<br />
Opened&nbsp;tables&nbsp;9046 <br />
</span></div>
虽然open_tables已经等于table_cache，但是相对于服务器运行时间来说,已经运行了20天，opened_tables的值也非常低。因此，增加table_cache的值应该用处不大。如果运行了6个小时就出现上述值 那就要考虑增大table_cache。<br />
<br />
如果你不需要记录2进制log 就把这个功能关掉，注意关掉以后就不能恢复出问题前的数据了，需要您手动备份，二进制日志包含所有更新数据的语句，其目的是在恢复数据库时用它来把数据尽可能恢复到最后的状态。另外，如果做同步复制( Replication )的话，也需要使用二进制日志传送修改情况。<br />
<br />
log_bin指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。MySQL会在文件名后面自动添加数字引，每次启动服务时，都会重新生成一个新的二进制文件。此外，使用log-bin-index可以指定索引文件；使用binlog-do-db可以指定记录的数据库；使用binlog-ignore-db可以指定不记录的数据库。注意的是：binlog-do-db和binlog-ignore-db一次只指定一个数据库，指定多个数据库需要多个语句。而且，MySQL会将所有的数据库名称改成小写，在指定数据库时必须全部使用小写名字，否则不会起作用。<br />
<br />
关掉这个功能只需要在他前面加上#号<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">#log-bin <br />
</span></div>
开启慢查询日志( slow query log ) 慢查询日志对于跟踪有问题的查询非常有用。它记录所有查过long_query_time的查询，如果需要，还可以记录不使用索引的记录。下面是一个慢查询日志的例子：<br />
<br />
开启慢查询日志，需要设置参数log_slow_queries、long_query_times、log-queries-not-using-indexes。<br />
<br />
log_slow_queries指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。long_query_times指定慢查询的阈值，缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的参数，它指示记录不使用索引的查询。笔者设置long_query_time=10<br />
<br />
笔者设置:<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">sort_buffer_size&nbsp;=&nbsp;1M&nbsp;<br />
max_connections=120&nbsp;<br />
wait_timeout&nbsp;=120&nbsp;<br />
back_log=100&nbsp;<br />
read_buffer_size&nbsp;=&nbsp;1M&nbsp;<br />
thread_cache=32&nbsp;<br />
interactive_timeout=120&nbsp;<br />
thread_concurrency&nbsp;=&nbsp;4 <br />
</span></div>
参数说明:<br />
<br />
back_log<br />
<br />
要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短) 检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 Unix listen(2)系统调用的手册页应该有更多的细节。检查你的OS文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效的。<br />
<br />
max_connections<br />
<br />
并发连接数目最大，120 超过这个值就会自动恢复，出了问题能自动解决<br />
<br />
thread_cache<br />
<br />
没找到具体说明，不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的<br />
<br />
thread_concurrency<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">#设置为你的cpu数目x2,例如，只有一个cpu,那么thread_concurrency=2&nbsp;<br />
#有2个cpu,那么thread_concurrency=4&nbsp;<br />
skip-innodb&nbsp;<br />
#去掉innodb支持</span></div>
代码:<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">#&nbsp;Example&nbsp;MySQL&nbsp;config&nbsp;file&nbsp;for&nbsp;medium&nbsp;systems.&nbsp;<br />
#&nbsp;<br />
#&nbsp;This&nbsp;is&nbsp;for&nbsp;a&nbsp;system&nbsp;with&nbsp;little&nbsp;memory&nbsp;(32M&nbsp;-&nbsp;64M)&nbsp;where&nbsp;MySQL&nbsp;plays&nbsp;<br />
#&nbsp;an&nbsp;important&nbsp;part,&nbsp;or&nbsp;systems&nbsp;up&nbsp;to&nbsp;128M&nbsp;where&nbsp;MySQL&nbsp;is&nbsp;used&nbsp;together&nbsp;with&nbsp;<br />
#&nbsp;other&nbsp;programs&nbsp;(such&nbsp;as&nbsp;a&nbsp;web&nbsp;server)&nbsp;<br />
#&nbsp;<br />
#&nbsp;You&nbsp;can&nbsp;copy&nbsp;this&nbsp;file&nbsp;to&nbsp;<br />
#&nbsp;/etc/my.cnf&nbsp;to&nbsp;set&nbsp;global&nbsp;options,&nbsp;<br />
#&nbsp;mysql-data-dir/my.cnf&nbsp;to&nbsp;set&nbsp;server-specific&nbsp;options&nbsp;(in&nbsp;this&nbsp;<br />
#&nbsp;installation&nbsp;this&nbsp;directory&nbsp;is&nbsp;/var/lib/mysql)&nbsp;or&nbsp;<br />
#&nbsp;~/.my.cnf&nbsp;to&nbsp;set&nbsp;user-specific&nbsp;options.&nbsp;<br />
#&nbsp;<br />
#&nbsp;In&nbsp;this&nbsp;file,&nbsp;you&nbsp;can&nbsp;use&nbsp;all&nbsp;long&nbsp;options&nbsp;that&nbsp;a&nbsp;program&nbsp;supports.&nbsp;<br />
#&nbsp;If&nbsp;you&nbsp;want&nbsp;to&nbsp;know&nbsp;which&nbsp;options&nbsp;a&nbsp;program&nbsp;supports,&nbsp;run&nbsp;the&nbsp;program&nbsp;<br />
#&nbsp;with&nbsp;the&nbsp;"--help"&nbsp;option.&nbsp;<br />
<br />
<br />
#&nbsp;The&nbsp;following&nbsp;options&nbsp;will&nbsp;be&nbsp;passed&nbsp;to&nbsp;all&nbsp;MySQL&nbsp;clients&nbsp;<br />
[client]&nbsp;<br />
#password&nbsp;=&nbsp;your_password&nbsp;<br />
port&nbsp;=&nbsp;3306&nbsp;<br />
socket&nbsp;=&nbsp;/tmp/mysql.sock&nbsp;<br />
#socket&nbsp;=&nbsp;/var/lib/mysql/mysql.sock&nbsp;<br />
#&nbsp;Here&nbsp;follows&nbsp;entries&nbsp;for&nbsp;some&nbsp;specific&nbsp;programs&nbsp;<br />
<br />
<br />
#&nbsp;The&nbsp;MySQL&nbsp;server&nbsp;<br />
[mysqld]&nbsp;<br />
port&nbsp;=&nbsp;3306&nbsp;<br />
socket&nbsp;=&nbsp;/tmp/mysql.sock&nbsp;<br />
#socket&nbsp;=&nbsp;/var/lib/mysql/mysql.sock&nbsp;<br />
skip-locking&nbsp;<br />
key_buffer&nbsp;=&nbsp;128M&nbsp;<br />
max_allowed_packet&nbsp;=&nbsp;1M&nbsp;<br />
table_cache&nbsp;=&nbsp;256&nbsp;<br />
sort_buffer_size&nbsp;=&nbsp;1M&nbsp;<br />
net_buffer_length&nbsp;=&nbsp;16K&nbsp;<br />
myisam_sort_buffer_size&nbsp;=&nbsp;1M&nbsp;<br />
max_connections=120&nbsp;<br />
#addnew&nbsp;config&nbsp;<br />
wait_timeout&nbsp;=120&nbsp;<br />
back_log=100&nbsp;<br />
read_buffer_size&nbsp;=&nbsp;1M&nbsp;<br />
thread_cache=32&nbsp;<br />
skip-innodb&nbsp;<br />
skip-bdb&nbsp;<br />
skip-name-resolve&nbsp;<br />
join_buffer_size=512k&nbsp;<br />
query_cache_size&nbsp;=&nbsp;32M&nbsp;<br />
interactive_timeout=120&nbsp;<br />
long_query_time=10&nbsp;<br />
log_slow_queries=&nbsp;/usr/local/mysql4/logs/slow_query.log&nbsp;<br />
query_cache_type=&nbsp;1&nbsp;<br />
#&nbsp;Try&nbsp;number&nbsp;of&nbsp;CPU's*2&nbsp;for&nbsp;thread_concurrency&nbsp;<br />
thread_concurrency&nbsp;=&nbsp;4&nbsp;<br />
<br />
<br />
#end&nbsp;new&nbsp;config&nbsp;<br />
#&nbsp;Don't&nbsp;listen&nbsp;on&nbsp;a&nbsp;TCP/IP&nbsp;port&nbsp;at&nbsp;all.&nbsp;This&nbsp;can&nbsp;be&nbsp;a&nbsp;security&nbsp;enhancement,&nbsp;<br />
#&nbsp;if&nbsp;all&nbsp;processes&nbsp;that&nbsp;need&nbsp;to&nbsp;connect&nbsp;to&nbsp;mysqld&nbsp;run&nbsp;on&nbsp;the&nbsp;same&nbsp;host.&nbsp;<br />
#&nbsp;All&nbsp;interaction&nbsp;with&nbsp;mysqld&nbsp;must&nbsp;be&nbsp;made&nbsp;via&nbsp;Unix&nbsp;sockets&nbsp;or&nbsp;named&nbsp;pipes.&nbsp;<br />
#&nbsp;Note&nbsp;that&nbsp;using&nbsp;this&nbsp;option&nbsp;without&nbsp;enabling&nbsp;named&nbsp;pipes&nbsp;on&nbsp;Windows&nbsp;<br />
#&nbsp;(via&nbsp;the&nbsp;"enable-named-pipe"&nbsp;option)&nbsp;will&nbsp;render&nbsp;mysqld&nbsp;useless!&nbsp;<br />
#&nbsp;<br />
#skip-networking&nbsp;<br />
<br />
<br />
#&nbsp;Replication&nbsp;Master&nbsp;Server&nbsp;(default)&nbsp;<br />
#&nbsp;binary&nbsp;logging&nbsp;is&nbsp;required&nbsp;for&nbsp;replication&nbsp;<br />
#log-bin&nbsp;<br />
<br />
<br />
#&nbsp;required&nbsp;unique&nbsp;id&nbsp;between&nbsp;1&nbsp;and&nbsp;2^32&nbsp;-&nbsp;1&nbsp;<br />
#&nbsp;defaults&nbsp;to&nbsp;1&nbsp;if&nbsp;master-host&nbsp;is&nbsp;not&nbsp;set&nbsp;<br />
#&nbsp;but&nbsp;will&nbsp;not&nbsp;function&nbsp;as&nbsp;a&nbsp;master&nbsp;if&nbsp;omitted&nbsp;<br />
server-id&nbsp;=&nbsp;1&nbsp;<br />
<br />
<br />
#&nbsp;Replication&nbsp;Slave&nbsp;(comment&nbsp;out&nbsp;master&nbsp;section&nbsp;to&nbsp;use&nbsp;this)&nbsp;<br />
#&nbsp;<br />
#&nbsp;To&nbsp;configure&nbsp;this&nbsp;host&nbsp;as&nbsp;a&nbsp;replication&nbsp;slave,&nbsp;you&nbsp;can&nbsp;choose&nbsp;between&nbsp;<br />
#&nbsp;two&nbsp;methods&nbsp;:&nbsp;<br />
#&nbsp;<br />
#&nbsp;1)&nbsp;Use&nbsp;the&nbsp;CHANGE&nbsp;MASTER&nbsp;TO&nbsp;command&nbsp;(fully&nbsp;described&nbsp;in&nbsp;our&nbsp;manual)&nbsp;-&nbsp;<br />
#&nbsp;the&nbsp;syntax&nbsp;is:&nbsp;<br />
#&nbsp;<br />
#&nbsp;CHANGE&nbsp;MASTER&nbsp;TO&nbsp;MASTER_HOST=,&nbsp;MASTER_PORT=,&nbsp;<br />
#&nbsp;MASTER_USER=,&nbsp;MASTER_PASSWORD=&nbsp;;&nbsp;<br />
#&nbsp;<br />
#&nbsp;where&nbsp;you&nbsp;replace&nbsp;,&nbsp;,&nbsp;by&nbsp;quoted&nbsp;strings&nbsp;and&nbsp;<br />
#&nbsp;by&nbsp;the&nbsp;master's&nbsp;port&nbsp;number&nbsp;(3306&nbsp;by&nbsp;default).&nbsp;<br />
#&nbsp;<br />
#&nbsp;Example:&nbsp;<br />
#&nbsp;<br />
#&nbsp;CHANGE&nbsp;MASTER&nbsp;TO&nbsp;MASTER_HOST='125.564.12.1',&nbsp;MASTER_PORT=3306,&nbsp;<br />
#&nbsp;MASTER_USER='joe',&nbsp;MASTER_PASSWORD='secret';&nbsp;<br />
#&nbsp;<br />
#&nbsp;OR&nbsp;<br />
#&nbsp;<br />
#&nbsp;2)&nbsp;Set&nbsp;the&nbsp;variables&nbsp;below.&nbsp;However,&nbsp;in&nbsp;case&nbsp;you&nbsp;choose&nbsp;this&nbsp;method,&nbsp;then&nbsp;<br />
#&nbsp;start&nbsp;replication&nbsp;for&nbsp;the&nbsp;first&nbsp;time&nbsp;(even&nbsp;unsuccessfully,&nbsp;for&nbsp;example&nbsp;<br />
#&nbsp;if&nbsp;you&nbsp;mistyped&nbsp;the&nbsp;password&nbsp;in&nbsp;master-password&nbsp;and&nbsp;the&nbsp;slave&nbsp;fails&nbsp;to&nbsp;<br />
#&nbsp;connect),&nbsp;the&nbsp;slave&nbsp;will&nbsp;create&nbsp;a&nbsp;master.info&nbsp;file,&nbsp;and&nbsp;any&nbsp;later&nbsp;<br />
#&nbsp;change&nbsp;in&nbsp;this&nbsp;file&nbsp;to&nbsp;the&nbsp;variables'&nbsp;values&nbsp;below&nbsp;will&nbsp;be&nbsp;ignored&nbsp;and&nbsp;<br />
#&nbsp;overridden&nbsp;by&nbsp;the&nbsp;content&nbsp;of&nbsp;the&nbsp;master.info&nbsp;file,&nbsp;unless&nbsp;you&nbsp;shutdown&nbsp;<br />
#&nbsp;the&nbsp;slave&nbsp;server,&nbsp;delete&nbsp;master.info&nbsp;and&nbsp;restart&nbsp;the&nbsp;slaver&nbsp;server.&nbsp;<br />
#&nbsp;For&nbsp;that&nbsp;reason,&nbsp;you&nbsp;may&nbsp;want&nbsp;to&nbsp;leave&nbsp;the&nbsp;lines&nbsp;below&nbsp;untouched&nbsp;<br />
#&nbsp;(commented)&nbsp;and&nbsp;instead&nbsp;use&nbsp;CHANGE&nbsp;MASTER&nbsp;TO&nbsp;(see&nbsp;above)&nbsp;<br />
#&nbsp;<br />
#&nbsp;required&nbsp;unique&nbsp;id&nbsp;between&nbsp;2&nbsp;and&nbsp;2^32&nbsp;-&nbsp;1&nbsp;<br />
#&nbsp;(and&nbsp;different&nbsp;from&nbsp;the&nbsp;master)&nbsp;<br />
#&nbsp;defaults&nbsp;to&nbsp;2&nbsp;if&nbsp;master-host&nbsp;is&nbsp;set&nbsp;<br />
#&nbsp;but&nbsp;will&nbsp;not&nbsp;function&nbsp;as&nbsp;a&nbsp;slave&nbsp;if&nbsp;omitted&nbsp;<br />
#server-id&nbsp;=&nbsp;2&nbsp;<br />
#&nbsp;<br />
#&nbsp;The&nbsp;replication&nbsp;master&nbsp;for&nbsp;this&nbsp;slave&nbsp;-&nbsp;required&nbsp;<br />
#master-host&nbsp;=&nbsp;<br />
#&nbsp;<br />
#&nbsp;The&nbsp;username&nbsp;the&nbsp;slave&nbsp;will&nbsp;use&nbsp;for&nbsp;authentication&nbsp;when&nbsp;connecting&nbsp;<br />
#&nbsp;to&nbsp;the&nbsp;master&nbsp;-&nbsp;required&nbsp;<br />
#master-user&nbsp;=&nbsp;<br />
#&nbsp;<br />
#&nbsp;The&nbsp;password&nbsp;the&nbsp;slave&nbsp;will&nbsp;authenticate&nbsp;with&nbsp;when&nbsp;connecting&nbsp;to&nbsp;<br />
#&nbsp;the&nbsp;master&nbsp;-&nbsp;required&nbsp;<br />
#master-password&nbsp;=&nbsp;<br />
#&nbsp;<br />
#&nbsp;The&nbsp;port&nbsp;the&nbsp;master&nbsp;is&nbsp;listening&nbsp;on.&nbsp;<br />
#&nbsp;optional&nbsp;-&nbsp;defaults&nbsp;to&nbsp;3306&nbsp;<br />
#master-port&nbsp;=&nbsp;<br />
#&nbsp;<br />
#&nbsp;binary&nbsp;logging&nbsp;-&nbsp;not&nbsp;required&nbsp;for&nbsp;slaves,&nbsp;but&nbsp;recommended&nbsp;<br />
#log-bin&nbsp;<br />
<br />
<br />
#&nbsp;Point&nbsp;the&nbsp;following&nbsp;paths&nbsp;to&nbsp;different&nbsp;dedicated&nbsp;disks&nbsp;<br />
#tmpdir&nbsp;=&nbsp;/tmp/&nbsp;<br />
#log-update&nbsp;=&nbsp;/path-to-dedicated-directory/hostname&nbsp;<br />
<br />
<br />
#&nbsp;Uncomment&nbsp;the&nbsp;following&nbsp;if&nbsp;you&nbsp;are&nbsp;using&nbsp;BDB&nbsp;tables&nbsp;<br />
#bdb_cache_size&nbsp;=&nbsp;4M&nbsp;<br />
#bdb_max_lock&nbsp;=&nbsp;10000&nbsp;<br />
<br />
<br />
#&nbsp;Uncomment&nbsp;the&nbsp;following&nbsp;if&nbsp;you&nbsp;are&nbsp;using&nbsp;InnoDB&nbsp;tables&nbsp;<br />
#innodb_data_home_dir&nbsp;=&nbsp;/var/lib/mysql/&nbsp;<br />
#innodb_data_file_path&nbsp;=&nbsp;ibdata1:10M:autoextend&nbsp;<br />
#innodb_log_group_home_dir&nbsp;=&nbsp;/var/lib/mysql/&nbsp;<br />
#innodb_log_arch_dir&nbsp;=&nbsp;/var/lib/mysql/&nbsp;<br />
#&nbsp;You&nbsp;can&nbsp;set&nbsp;.._buffer_pool_size&nbsp;up&nbsp;to&nbsp;50&nbsp;-&nbsp;80&nbsp;%&nbsp;<br />
#&nbsp;of&nbsp;RAM&nbsp;but&nbsp;beware&nbsp;of&nbsp;setting&nbsp;memory&nbsp;usage&nbsp;too&nbsp;high&nbsp;<br />
#innodb_buffer_pool_size&nbsp;=&nbsp;16M&nbsp;<br />
#innodb_additional_mem_pool_size&nbsp;=&nbsp;2M&nbsp;<br />
#&nbsp;Set&nbsp;.._log_file_size&nbsp;to&nbsp;25&nbsp;%&nbsp;of&nbsp;buffer&nbsp;pool&nbsp;size&nbsp;<br />
#innodb_log_file_size&nbsp;=&nbsp;5M&nbsp;<br />
#innodb_log_buffer_size&nbsp;=&nbsp;8M&nbsp;<br />
#innodb_flush_log_at_trx_commit&nbsp;=&nbsp;1&nbsp;<br />
#innodb_lock_wait_timeout&nbsp;=&nbsp;50&nbsp;<br />
<br />
<br />
[mysqldump]&nbsp;<br />
quick&nbsp;<br />
max_allowed_packet&nbsp;=&nbsp;16M&nbsp;<br />
<br />
<br />
[mysql]&nbsp;<br />
no-auto-rehash&nbsp;<br />
#&nbsp;Remove&nbsp;the&nbsp;next&nbsp;comment&nbsp;character&nbsp;if&nbsp;you&nbsp;are&nbsp;not&nbsp;familiar&nbsp;with&nbsp;SQL&nbsp;<br />
#safe-updates&nbsp;<br />
<br />
<br />
[isamchk]&nbsp;<br />
key_buffer&nbsp;=&nbsp;20M&nbsp;<br />
sort_buffer_size&nbsp;=&nbsp;20M&nbsp;<br />
read_buffer&nbsp;=&nbsp;2M&nbsp;<br />
write_buffer&nbsp;=&nbsp;2M&nbsp;<br />
<br />
<br />
[myisamchk]&nbsp;<br />
key_buffer&nbsp;=&nbsp;20M&nbsp;<br />
sort_buffer_size&nbsp;=&nbsp;20M&nbsp;<br />
read_buffer&nbsp;=&nbsp;2M&nbsp;<br />
write_buffer&nbsp;=&nbsp;2M&nbsp;<br />
<br />
<br />
[mysqlhotcopy]&nbsp;<br />
interactive-timeout</span></div>
补充<br />
<br />
优化table_cachetable_cache指定表高速缓存的大小。每当MySQL访问一个表时，如果在表缓冲区中还有空间，该表就被打开并放入其中，这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables，可以决定是否需要增加 table_cache的值。如果你发现open_tables等于table_cache，并且opened_tables在不断增长，那么你就需要增加table_cache的值了（上述状态值可以使用SHOW STATUS LIKE &#8216;Open%tables&#8217;获得）。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。对于有1G内存的机器，推荐值是128－256。<br />
<br />
案例1：该案例来自一个不是特别繁忙的服务器table_cache &#8211; 512open_tables &#8211; 103opened_tables &#8211; 1273uptime &#8211; 4021421 (measured in seconds)该案例中table_cache似乎设置得太高了。在峰值时间，打开表的数目比table_cache要少得多。<br />
<br />
案例2：该案例来自一台开发服务器。table_cache &#8211; 64open_tables &#8211; 64opened-tables &#8211; 431uptime &#8211; 1662790 (measured in seconds)虽然open_tables已经等于table_cache，但是相对于服务器运行时间来说，opened_tables的值也非常低。因此，增加table_cache的值应该用处不大。案例3：该案例来自一个upderperforming的服务器table_cache &#8211; 64open_tables &#8211; 64opened_tables &#8211; 22423uptime &#8211; 19538该案例中table_cache设置得太低了。虽然运行时间不到6小时，open_tables达到了最大值，opened_tables的值也非常高。这样就需要增加table_cache的值。优化key_buffer_sizekey_buffer_size指定索引缓冲区的大小，它决定索引处理的速度，尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads，可以知道key_buffer_size 设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好（上述状态值可以使用SHOW STATUS LIKE &#8216;key_read%&#8217;获得）。key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表，但是内部的临时磁盘表是 MyISAM表，也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。对于1G内存的机器，如果不使用 MyISAM表，推荐值是16M（8-64M）。<br />
<br />
案例1：健康状况key_buffer_size &#8211; 402649088 (384M)key_read_requests &#8211; 597579931key_reads - 56188案例2：警报状态key_buffer_size &#8211; 16777216 (16M)key_read_requests &#8211; 597579931key_reads - 53832731案例1中比例低于1:10000，是健康的情况；案例2中比例达到1:11，警报已经拉响。<br />
<br />
本文出自:http://kb.discuz.net/index.php?title=MySQL优化经验
<img src ="http://www.blogjava.net/zhouf/aggbug/254124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-02-10 20:48 <a href="http://www.blogjava.net/zhouf/articles/254124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat 连接池泄露的问题</title><link>http://www.blogjava.net/zhouf/articles/253901.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Mon, 09 Feb 2009 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/253901.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/253901.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/253901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/253901.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/253901.html</trackback:ping><description><![CDATA[1 问题描述<br />
Web程序在tomcat刚开始运行时速度很快，但过一段时间后发现速度变得很慢。<br />
检查日志输出，发现异常如下:<br />
org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause:<br />
java.util.NoSuchElementException: Timeout waiting for idle object<br />
同时在SQLServer事件探查器中发现，每执行一次sql语句都要产生Audit login事件，语句执行后产生<br />
Audit logout事件。说明每一次tomcat都是重新打开新的连接。<br />
2 问题解决<br />
tomcat 的数据源定义提供了三个参数：<br />
a. 如果设为true则tomcat自动检查恢复重新利用，没有正常关闭的Connection.（默认是false）<br />
&lt;parameter&gt;<br />
&lt;name&gt;removeAbandoned&lt;/name&gt;<br />
&lt;value&gt;true&lt;/value&gt;<br />
&lt;/parameter&gt;<br />
b. 设定连接在多少秒内被认为是放弃的连接，即可进行恢复利用。<br />
&lt;parameter&gt;<br />
&lt;name&gt;removeAbandonedTimeout&lt;/name&gt;<br />
&lt;value&gt;60&lt;/value&gt;<br />
&lt;/parameter&gt;<br />
c. 输出回收的日志，可以详细打印出异常从而发现是在那里发生了泄漏<br />
&lt;parameter&gt;<br />
&lt;name&gt;logAbandoned&lt;/name&gt;<br />
&lt;value&gt;true&lt;/value&gt;<br />
&lt;/parameter&gt;
<img src ="http://www.blogjava.net/zhouf/aggbug/253901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-02-09 14:04 <a href="http://www.blogjava.net/zhouf/articles/253901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN的Not authorized to open root of edit operation解决办法</title><link>http://www.blogjava.net/zhouf/articles/251635.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Fri, 16 Jan 2009 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/251635.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/251635.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/251635.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/251635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/251635.html</trackback:ping><description><![CDATA[Subversion装了1.5.2版，乌龟SVN装的是1.5.1版本，可以通过乌龟正常访问到版本库，但当check out时却出现了"Not authorized to open root of edit operation"错误，上网搜索了一下，提供的解决版本如下：<br />
anon-access 属性对目录权限的影响<br />
你想将你的代码库开放给所有人访问，于是你就开放了匿名访问权限，在 svnserve.conf 文件中添加一行："anon-access=read"。可是对于部分目录，你又不希望别人看到，于是针对那些特别目录，你在 authz.conf 里面进行配置，添加了授权访问的人，并添加了"* ="标记。你认为一切OK了，可是你却发现，那个特别目录却无法访问了，总是提示"Not authorized to open root of edit operation"或者"未授权打开根进行编辑操作"。你再三检查你配置的用户名与密码，确认一切正确，还是无法解决问题<br />
原来，Subversion 有个小 bug ，当"anon-access=read"并且某个目录有被设置上"* ="标记，则会出现上述问题。这个 bug 在当前最新版本上（v1.4）还存在<br />
但我并没有设"*="这种访问方式，用户名、密码、目录访问都正确设置了。当把 anon-access=read 改成 anon-access=none 后，发现，真的可以正常访问了<br />
<img src ="http://www.blogjava.net/zhouf/aggbug/251635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-01-16 22:49 <a href="http://www.blogjava.net/zhouf/articles/251635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改MyEclipse中JSP模板解决中文显示</title><link>http://www.blogjava.net/zhouf/articles/251492.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Thu, 15 Jan 2009 12:32:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/251492.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/251492.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/251492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/251492.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/251492.html</trackback:ping><description><![CDATA[在MyEclipse中新建一个JSP页面后，为了让页面显示中文，我们总要做将page指令中的 pageEncoding="UTF-8"或pageEncoding="GBK"之类的动作，每新建一个页面就要更改一次，很麻烦吧，现在告诉大家一个方法，可以再也不用做这无聊而又麻烦的动作了。<br />
先找到MyEclipse 5.1的安装目录<br />
再找到myeclipse\eclipse\plugins\com.genuitec.eclipse.wizards_5.1.0\templates\jsp<br />
(com.genuitec.eclipse.wizards_5.1.0的_5.1.0因为MyEclipse的版本而不一样)<br />
可以看见有一个Jsp.vtl文件，打开源文件(可以直接用记事本打开)，在指令部分将$encoding值修改为"UTF-8"或者"GBK"<br />
<br />
其实同个文件夹下还有Struts自动生成的JSP模板可以改，大家自己动手试下吧。<br />
<br />
以后再新建JSP文件的时候，page指令的pageEncoding就不用大家再去更改了，很方便吧！
<img src ="http://www.blogjava.net/zhouf/aggbug/251492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-01-15 20:32 <a href="http://www.blogjava.net/zhouf/articles/251492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在linux下安装配置svn独立服务器</title><link>http://www.blogjava.net/zhouf/articles/251476.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Thu, 15 Jan 2009 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/251476.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/251476.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/251476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/251476.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/251476.html</trackback:ping><description><![CDATA[subversion(以下简称svn)是近年来崛起的版本管理工具，是cvs的接班人。<br />
svn服务器有2种运行方式：独立服务器和借助apache。2种方式各有利弊。<br />
svn存储版本数据也有2种方式：BDB和FSFS。因为BDB方式在服务器中断时，有可能锁住数据，所以还是FSFS方式更安全一点。<br />
1. svn服务器安装操作系统: Redhat Linux <br />
<br />
AS4安装包获取:下载http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz和<br />
<br />
http://subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz。编译:<br />
以root用户登录。<br />
将subversion-1.4.0.tar.gz和subversion-deps-1.4.0.tar.gz传到服务器。<br />
tar xfvz subversion-1.4.0.tar.gz<br />
tar xfvz subversion-deps-1.4.0.tar.gz<br />
cd subversion-1.4.0<br />
./configure --prefix=/opt/svn --without-berkeley-db --with-zlib<br />
(注：以svnserve方式运行，不加apache编译参数。以fsfs格式存储版本库，不编译berkeley-db)<br />
make clean<br />
make<br />
make install<br />
vi /etc/profile,在/etc/profile最后加入:<br />
PATH=$PATH:/opt/svn/bin<br />
export PATH<br />
测试:<br />
svnserve --version<br />
如果显示如下，安装成功:<br />
svnserve, version 1.4.0 (r21228)<br />
compiled Oct 12 2006, 10:18:56Copyright (C) 2000-2006 CollabNet.<br />
Subversion is open source software, see http://subversion.tigris.org/<br />
This product includes software developed by CollabNet (http://www.Collab.Net/).The following repository back-end (FS) modules are available:* fs_fs : Module for working with a plain file (FSFS) repository.<br />
2. svn配置<br />
建立版本库目录，可建多个：<br />
mkdir -p /opt/svndata/repos1<br />
mkdir -p /opt/svndata/repos2<br />
建立版本库:<br />
svnadmin create /opt/svndata/repos1<br />
svnadmin create /opt/svndata/repos2<br />
修改版本库配置文件:<br />
版本库1：<br />
vi /opt/svndata/repos1/conf/svnserve.conf<br />
内容修改为:<br />
[general]<br />
anon-access = none<br />
auth-access = write<br />
password-db = /opt/svn/conf/pwd.conf<br />
authz-db = /opt/svn/conf/authz.conf<br />
realm = repos1<br />
版本库2:<br />
vi /opt/svndata/repos2/conf/svnserve.conf内容修改为:<br />
[general]<br />
anon-access = none<br />
auth-access = write<br />
password-db = /opt/svn/conf/pwd.conf<br />
authz-db = /opt/svn/conf/authz.conf<br />
realm = repos2<br />
即除realm = repos2外，其他与版本库1配置文件完全相同。如果有更多的版本库，<br />
<br />
依此类推。配置允许访问的用户:<br />
vi /opt/svn/conf/pwd.conf<br />
为了简化配置，2个版本库共用1个用户配置文件。如有必要，也可以分开。注意：对用户配置文件的修改立即生效，不必重启svn。文件格式如下：<br />
[users]<br />
&lt;用户1&gt; = &lt;密码1&gt;<br />
&lt;用户2&gt; = &lt;密码2&gt;<br />
其中，[users]是必须的。下面列出要访问svn的用户，每个用户一行。示例：<br />
[users]<br />
alan = password<br />
king = hello<br />
配置用户访问权限:<br />
vi /opt/svn/conf/authz.conf<br />
为了简化配置，3个版本库共用1个权限配置文<br />
<br />
件/opt/svn/conf/pwd.conf。如有必要，也可以分开。文件中定义用户组和版本库目录权限。注意：<br />
* 权限配置文件中出现的用户名必须已在用户配置文件中定义。<br />
* 对权限配置文件的修改立即生效，不必重启svn。用户组格式：<br />
[groups]<br />
&lt;用户组名&gt; = &lt;用户1&gt;,&lt;用户2&gt;<br />
其中，1个用户组可以包含1个或多个用户，用户间以逗号分隔。版本库目录格式：<br />
[&lt;版本库&gt;:/项目/目录]<br />
@&lt;用户组名&gt; = &lt;权限&gt;<br />
&lt;用户名&gt; = &lt;权限&gt;　　其中，方框号内部分可以有多种写法:<br />
/,表示根目录及以下。根目录是svnserve启动时指定的，我们指定为/opt/svndata。这样，/就是表示对全部版本库设置权限。<br />
repos1:/,表示对版本库1设置权限<br />
repos2:/occi, ,表示对版本库2中的occi项目设置权限<br />
repos2:/occi/aaa, ,表示对版本库2中的occi项目的aaa目录设置权限　　权限主体可以是用户组、用户或*，用户组在前面加@，*表示全部用户。权限可以是w、r、wr和空，空表示没有任何权限。示例：<br />
[groups]<br />
admin = alan[/]<br />
@admin = rw[repos1:/occi/aaa]<br />
king = rw[repos2:/pass]<br />
king =<br />
删除无用文件:<br />
rm /opt/svndata/repos1/conf/authz<br />
rm /opt/svndata/repos1/conf/passwd<br />
rm /opt/svndata/repos2/conf/authz<br />
rm /opt/svndata/repos2/conf/passwd<br />
3. 启动svn<br />
建立启动svn的用户:<br />
useradd svn<br />
passwd svn<br />
根据提示为用户svn设置密码允许用户svn访问版本库:<br />
chown &#8211;R svn:svn /opt/svndata<br />
chown &#8211;R svn:svn /opt/data启动svn：<br />
su - svn -c "svnserve -d --listen-port 9999 -r /opt/svndata"<br />
其中：<br />
su &#8211; svn表示以用户svn的身份启动svn<br />
-d表示以daemon方式（后台运行）运行<br />
--listen-port 9999表示使用9999端口，可以换成你需要的端口。但注意，使用1024以下的端口需要root<br />
<br />
权限<br />
-r /opt/svndata指定根目录是/opt/svndata检查:<br />
ps &#8211;ef|grep svnserve如果显示如下，即为启动成功：<br />
svn　　　 6941　　 1　0 15:07 ?　　　　00:00:00 svnserve -d --listen-port 9999 -r <br />
<br />
/opt/svndata参考资料：<br />
http://www.gbunix.com/htmldata/2006_07/15/27/article_1337_1.html<br />
http://www.iusesvn.com/bbs/thread-157-1-1.html<br />
http://16hot.blog.isyi.com/post/1/552<br />
检测服务是否开启：netstat -ntlp如果看到3690的端口正常开放了，证明SVN启动了。]<br />
下面是机器上的端口显示:<br />
Active Internet connections (only servers)<br />
Proto Recv-Q Send-Q Local Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foreign Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; State&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
PID/Program name<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0.0.0.0:32769&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
2611/rpc.statd<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0.0.0.0:111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
2591/portmap<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0.0.0.0:113&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
2827/xinetd<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 127.0.0.1:631&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
4860/cupsd<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 127.0.0.1:25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
2846/sendmail: acce<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 :::3690&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
5513/svnserve<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 :::22&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
2812/sshd<br />
下面这个就是了:<br />
tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 :::3690&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
5513/svnserve<br />
好了,svn已经架起来了<br />
<br />
<hr size="2" width="100%" />
<br />
在 Linux/Apache 2.2 上配置SVN服务器<br />
<br />
准备，下载所需要文件.<br />
检查已安装的 Apache2 是否已经安装了 mod_dav .<br />
编译SVN，遇到的问题和解决方法<br />
使用 默认文件系统(fsfs) 保存数据<br />
使用 Berkeley DB 保存数据<br />
配置Apache和SVN，测试.<br />
其它小结<br />
从Windows平台上数据转移<br />
配置文件,使用其支持对文件中的 $Id$ 标签每次提交的时候自动更新版本信息.<br />
基于路径的权限控制常用SVN命令<br />
相关资源* 准备，下载所需要文件.<br />
本文测试环境：ubuntu 6.06 LTS (kernel 2.6.15-25-k7，gcc-4.0.3) /ubuntu server (2.6.15-26-<br />
<br />
server,gcc-4.0.4)<br />
Subversion 1.3.2Apache 2.2.2最新的版本 Subversion 可以在这里找到 ：<br />
<br />
http://subversion.tigris.org/project_packages.html* 检查已安装的 Apache2 是否已经安装了 <br />
<br />
mod_dav .<br />
如果已经成功安装了Apache，使用 httpd -M 来查看有没有安装 dav_module，如果没有的话 必须附加 <br />
<br />
&#8216;&#8211;enable-dav&#8217; &#8216;&#8211;enable-dav-fs&#8217; 两个参数重新编译 Apache，否则即使编译通过了svn,apache也<br />
<br />
会启动不起来.如何编译 Apache 请参考我另外一篇文章.* 编译SVN，遇到的问题和解决方法.<br />
使用默认的文件系统保存数据.<br />
最终完整通过安装和测试的编译参数为：./configure --with-apxs=/usr/local/apache2/bin/apxs \<br />
--with-apr=/home/src/server/httpd-2.2.2/srclib/apr \<br />
--with-apr-util=/home/src/server/httpd-2.2.2/srclib/apr-utilmake<br />
make install其中 /home/src/server/ 为 httpd-2.2.2 源代码所在文件夹，根据实际情况调整一下.◆ <br />
<br />
遇到问题：1) --with-apr 和 --with-apr-util 如果没有加上的话，即使编译成功了也会出现Can't set position pointer in file &#8216;/home/svn/repos/db/revs/0&#8242;: Invalid argument<br />
这样的错误提示.2) 暂时不能使用 Berkeley DB [* 已解决]svn保存文件更新数据库的方法有两个，一种是直接使用 fs (filesystem)来保存,另一种是通过Oracle提供支持的开源数据库 Berkeley DB 进行保存。但是如果加上 &#8211;with-berkeley-db=/usr/local/BerkeleyDB.4.4 就会configure时就会报错.configure: error: APR-UTIL was installed independently, it won&#8217;t be possible to use the specified Berkeley DB: /usr/local/BerkeleyDB.4.4我想 apr-unit 暂时不支持吧，我们就用默认的fs好了.3) 在make 的时候可能会遇到缺少 srclib/apr/libapr-1.la，srclib/apr-util/libaprutil-1.la 两个文件，找不到而make error.解决办法：/usr/local/apache2/lib/ 中找到，将其复制到源代码文件夹相应的位置中.Update!!使用 BerkeleyDB 保存数据.<br />
1) 安装 BerkeleyDBcd /usr/local/src<br />
wget http://downloads.sleepycat.com/db-4.3.29.tar.gztar xzvf db-4.3.29.tar.gz<br />
cd /usr/local/src/db-4.3.29/build_unix<br />
../dist/configure --enable-compat185<br />
make<br />
make install2) 更新apr和apr-util源代码# 清理编译后的.la文件<br />
cd /usr/local/src/httpd-2.2.3make cleancd /usr/local/src/subversion-1.3.2<br />
rm -rf apr<br />
rm -rf apr-util<br />
cp -rf /usr/local/src/httpd-2.2.3/srclib/apr ./<br />
cp -rf /usr/local/src/httpd-2.2.3/srclib/apr-util/ ./3) 编译安装./configure --with-<br />
<br />
apxs=/usr/local/apache2/bin/apxs \<br />
--with-berkeley-db=/usr/local/BerkeleyDB.4.3 \<br />
--with-ssl<br />
make<br />
make install<br />
◆ 遇到问题：<br />
1) BerkeleyDB 版本不能大于 4.3.否则同样会出现以下错误.configure: error: APR-UTIL was <br />
<br />
installed independently, it won&#8217;t be<br />
possible to use the specified Berkeley DB: /usr/local/BerkeleyDB.4.4<br />
主要是apr-util 暂时不支持4.4的版本.2) 必须更新apr，apr-util 源代码.<br />
subversion-1.3.2 自带的 apr-util 的版本是0.9.6的,必须升级为 1.2.7 虽然能编译过去。但在 svn <br />
<br />
checkout 的时候会提示svn: REPORT request failed on &#8216;/!svn/vcc/default&#8217;<br />
svn: REPORT of &#8216;/!svn/vcc/default&#8217;: Could not read status line: connection was closed by <br />
<br />
server.<br />
这个问题困扰了我很长时间，Google和官方论坛都无结果。后来昨天竟然自己无意中解决了，感动的得哭了:)* 配置Apache和SVN，测试<br />
成功编译svn后会在 httpd.conf 中自动加上LoadModule dav_svn_module modules/mod_dav_svn.so<br />
LoadModule authz_svn_module modules/mod_authz_svn.so<br />
两个模块，没有的话，自行加上或检测是否真的编译成功.假设我们现在要将一个名为 Lair 的项目导入<br />
<br />
到 SVN中1). Apache的配置在 conf/httpd.conf 或 conf/extra/httpd-vhosts.conf 中加入<br />
&lt;Location /svn/Lair&gt;DAV svn<br />
SVNPath /home/svn/Lair<br />
&lt;/Location&gt;<br />
可以参考以下apache的配置，实现数据加密传输，用户身份验证.Listen 443AddType <br />
<br />
application/x-x509-ca-cert .crt<br />
AddType application/x-pkcs7-crl .crl.SSLPassPhraseDialog exec:/etc/sendsslpwd<br />
SSLSessionCache shmcb:/usr/local/apache2/logs/ssl_scache(512000)<br />
SSLSessionCacheTimeout 300<br />
SSLMutex file:/usr/local/apache2/logs/ssl_mutex&lt;VirtualHost _default_:443&gt;<br />
DocumentRoot /var/SVNRoot<br />
ServerName svn.yousite.com:443<br />
ServerAdmin webmaster@yousite.com<br />
&lt;Location /&gt;DAV svn<br />
SVNPath /var/SVNRoot<br />
AuthzSVNAccessFile /etc/svnserve.conf<br />
Satisfy Any<br />
AuthType Basic<br />
AuthName &#8220;yousite SVN Repository&#8221;<br />
AuthUserFile /etc/httpd-passwords.txt<br />
Require valid-user&lt;/Location&gt;<br />
SSLEngine on<br />
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL<br />
SSLCertificateFile /etc/ssl/server.crt<br />
SSLCertificateKeyFile /etc/ssl/server.key&lt;/VirtualHost&gt;更详细的配置说明文档 <br />
<br />
http://svnbook.red-bean.com/nightly/en/svn.ref.mod_dav_svn.conf.html2). 配置，并且测试SVN，创建一个新用户,用了保存仓库.<br />
useradd -m svn<br />
创建一个新模块su daemon (apache是以daemon用户运行的,所以要切换身份，否则可能会报目录访问权限错误)<br />
svnadmin create --fs-type fsfs /home/svn/Lair<br />
导入原来的项目svn import /var/www/Lair http://localhost/svn/Lair -m &#8216;Initial import&#8217;重新建<br />
<br />
立工作目录rm -rf /var/www/Lair (注意备份!!)<br />
svn checkout http://localhost/svn/Lair<br />
测试打开 http://localhost/svn/Lair如能看到一个你项目录列表，说明您成功了。<br />
* 其它小结<br />
数据转移:从 Windows 平台 SVN 服务器转移<br />
如果windows svn储存的格式也是dbd的话，直接将SVN的文件夹copy过来即可.然后<br />
执行 svnadmin recover /var/SVNRoot 检查一下数据库是否损坏.最后注意权限,确保 db 目录下的所有<br />
<br />
文件可写。chmod 755 db<br />
chmod 666 db/*<br />
否则checkout时出现以下错误，多数是因为文件或者目录权限问题引起的，可以尝试用 chown 或者 <br />
<br />
chmod 命令修改一下权限&lt;m:human-readable errcode=&#8221;160029&#8243;&gt;Could not open the requested SVN <br />
<br />
filesystem<br />
&lt;/m:human-readable&gt;&lt;m:human-readable errcode=&#8221;13&#8243;&gt;<br />
Could not open the requested SVN filesystem<br />
&lt;/m:human-readable&gt;另外一种方法没有测试过，原理大致和mysqldump一样，将svn导出为文本文件，然<br />
<br />
后重新导入，好处是可以避免因为存储格式不同而导致的数据转移困难。# dump data to file <br />
<br />
(assuming a repo @ c:\repo):svnadmin dump c:\repo &gt; c:\repo.txt<br />
# Copy the file over to linux:<br />
mkdir /repo<br />
svnadmin create /repo<br />
svnadmin load /repo &lt; /repo.txt<br />
设置访问控制当 httpd.conf 中 设置 AuthzSVNAccessFile 时，<br />
<br />
可以设置不同用户对不同目录的访问控制.以下是一个例子.[groups]<br />
root = admin.root<br />
web = user1,user2<br />
soft = user3,user4[/]<br />
@root = rw[/www]@web = rw[/soft]<br />
@soft = rw详细的说明文档：http://svnbook.red-bean.com/nightly/en/svn.serverconfig.httpd.html<br />
<br />
配置文件，使用其支持对文件中的 $Id$ 标签每次提交的时候自动更新版本信息(自动属性).Windows <br />
<br />
: C:\Documents and Settings\%USERNAME%\Application Data\Subversion\config<br />
Linux : ~\.subversion\config[miscellany]enable-auto-props = yes<br />
[auto-props]<br />
*.php=svn:keywords=Id<br />
*.html=svn:keywords=Id&gt;&gt; 关于自动属性的更高级讨论■ 几条常用svn 命令<br />
svn update<br />
svn add &#8220;filename&#8221;<br />
svn commit———————&#8211;<br />
Change Log:2006-08-14 neon库subversion已经自带,不需要在单独安装,添加-with-ssl即可使用svn对ssl支持.<br />
2006-08-10 补充自动属性的说明.<br />
2006-08-08 加入关于目录访问验证的说明.<br />
2006-08-07 httpd,2.2.3测试依然有效，解决bdb数据库的支持问题，添加从Windows到Linux下的数据转移方案。<br />
2006-07-25 看到到.声仔对 Can&#8217;t set position pointer in file 另一种解决方案,我当时也测试了，好像没有成功。不想用apache源代码编译的朋友可以也测试一下<br />
&nbsp;<br />
<br />
<br />
<img src ="http://www.blogjava.net/zhouf/aggbug/251476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-01-15 17:44 <a href="http://www.blogjava.net/zhouf/articles/251476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat连接池配置</title><link>http://www.blogjava.net/zhouf/articles/251412.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Thu, 15 Jan 2009 04:17:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/251412.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/251412.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/251412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/251412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/251412.html</trackback:ping><description><![CDATA[有两种配置方法：<br />
第一种：仅为一个具体的工程所使用而配置的数据源<br />
第一步：打开%Tomcat_Home%\conf\server.xml,在&lt;/Context&gt;和&lt;/host&gt;前添加描述<br />
&lt;Context path="/lib" docBase ="lib" debug="0" reloadable ="true" crossContext="true"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;Resource name = "jdbc/mydatasource" auth="Container" type="javax.sql.DataSource"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ResourceParams name ="jdbc/libds"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;parameter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;factory&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;driverClassName&lt;/name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;url&lt;/name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;jdbc:mysql://localhost/lib&lt;/value&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;username&lt;/name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;root&lt;/value&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;password&lt;/name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;password&lt;/value&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;maxActive&lt;/name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;20&lt;/value&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;maxIdle&lt;/name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;10&lt;/value&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;maxWait&lt;/name&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;-1&lt;/value&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/parameter&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/ResourceParams&gt;<br />
&lt;/Context&gt;<br />
注释： &#8220;ch13&#8221;是工程名，JNDI name 是 &#8220;jdbc/libds&#8221;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户名和密码都是"sa"<br />
第二步，将ms sqlserver要用到的三个驱动包复制到%tomcat_home%\common\lib目录下。<br />
第三步，重新启动tomcat。<br />
第四步,可以在工程ch13里写个测试j页面test.jsp：<br />
&lt;%@pageimport="java.sql.*"%&gt;<br />
&lt;%@pageimport="javax.sql.*"%&gt;<br />
&lt;%@pageimport="javax.naming.*"%&gt;<br />
&lt;%<br />
&nbsp; DataSource ds=null;<br />
&nbsp; try{<br />
&nbsp; InitialContext ctx=new InitialContext();<br />
&nbsp; ds=(DataSource)ctx.lookup("java:comp/env/jdbc/libds");<br />
&nbsp; Connection&nbsp; conn=ds.getConnection();<br />
&nbsp; Statement stmt=conn.createStatement();<br />
&nbsp; String strSql="select *&nbsp; from&nbsp; authors";<br />
&nbsp; ResultSet rs=stmt.executeQuery(strSql);<br />
&nbsp; while(rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp; out.println(rs.getString(1)+"&lt;br&gt;");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp; catch(Exception ex){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("出错啦!!!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />
&nbsp; }<br />
%&gt;<br />
如果能正常显示多行数据则测试成功，否则失败。<br />
<br />
<br />
第二种是针对Tomcat中所有的工程进行的配置,可以使用Tomcat图形界面进行设置<br />
&nbsp;第一步,通过IE浏览器进入Tomcat Administration ,用户名和密码就是安装tomcat时设置的密码.,然后选择create&nbsp; New&nbsp; DataSource.<br />
输入如下:<br />
JNDI name :jdbc/allds<br />
Data Source URL:jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=pubs<br />
JDBC Driver Class:com.microsoft.jdbc.sqlserver.SQLServerDriver<br />
User Name:sa<br />
password :sa<br />
可根据实际修改密码<br />
第二步 :在%tomcat_home%/conf/Catalina\localhost目录下找到要使用此数据源的工程同名的xml文件.<br />
在Context一节中加入以下代码：<br />
&lt;ResourceLink name="jdbc/allds" global="jdbc/allds" type="javax.sql.DataSourcer"/&gt;<br />
第三步,在%tomcat_home%'/common/lib中添加要用到的sqlserver的驱动包,重新启动tomcat.<br />
第四步,测试.在刚才要使用数据源的工程中添加test.jsp,代码如下:<br />
&lt;%@pageimport="java.sql.*"%&gt;<br />
&lt;%@pageimport="javax.sql.*"%&gt;<br />
&lt;%@pageimport="javax.naming.*"%&gt;<br />
&lt;%<br />
&nbsp; DataSource ds=null;<br />
&nbsp; try{<br />
&nbsp; InitialContext ctx=new InitialContext();<br />
&nbsp; ds=(DataSource)ctx.lookup("java:comp/env/jdbc/allds");<br />
&nbsp; Connection&nbsp; conn=ds.getConnection();<br />
&nbsp; Statement stmt=conn.createStatement();<br />
&nbsp; String strSql="select *&nbsp; from&nbsp; authors";<br />
&nbsp; ResultSet rs=stmt.executeQuery(strSql);<br />
&nbsp; while(rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp; out.println(rs.getString(2)+"&lt;br&gt;");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp; catch(Exception ex){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("出错啦!!!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br />
&nbsp; }<br />
%&gt;<br />
<img src ="http://www.blogjava.net/zhouf/aggbug/251412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-01-15 12:17 <a href="http://www.blogjava.net/zhouf/articles/251412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss数据源加密</title><link>http://www.blogjava.net/zhouf/articles/250178.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Tue, 06 Jan 2009 13:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/250178.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/250178.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/250178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/250178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/250178.html</trackback:ping><description><![CDATA[<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">1.我们先来看一个普通的数据源配置文件&nbsp;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">&lt;?</span><span style="color: rgb(255, 0, 255);">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: rgb(0, 0, 255);">?&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">datasources</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">local-tx-datasource</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">jndi-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">MySqlDS</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">jndi-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">use-java-context</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">false</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">use-java-context</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">connection-url</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">jdbc:mysql://10.16.175.137:3306/test</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">connection-url</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">driver-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">com.mysql.jdbc.Driver</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">driver-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">user-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">root</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">user-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">password</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">123</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">password</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;//注意这里的密码是明文显示的！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">exception-sorter-class-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">exception-sorter-class-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">metadata</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">type-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">mySQL</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">type-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">metadata</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">local-tx-datasource</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">datasources</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看一下这个文件,里面用户名与密码都是以明文方式存储的,这样子对系统的安全而言带来了极大的威协。所以我们要为我们这个明文的密码加一下密,这就是本文的目的。<br />
<br />
2.说到密码加密，这里我们用到了JBoss下的一个类org.jboss.resource.security.SedureIdentityLoginModule。<br />
看看我们该如何用它来帮我们的密码加密。&nbsp;<br />
<br />
a.先看个配置数据源的例子(mysql-ds.xml)：&nbsp;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">&lt;?</span><span style="color: rgb(255, 0, 255);">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: rgb(0, 0, 255);">?&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">datasources</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">local-tx-datasource</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">jndi-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">MySqlDS</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">jndi-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">use-java-context</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">false</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">use-java-context</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">connection-url</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">jdbc:mysql://localhost:3306/test</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">connection-url</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">driver-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">com.mysql.jdbc.Driver</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">driver-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">security-domain</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">SuperPassword</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">security-domain</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">//这里不用写上你的用户名与密码了，我们可以在login-config.xml里做点手脚，就OK了！用这一行替换掉了上面那个文件的两行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">exception-sorter-class-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">exception-sorter-class-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">metadata</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">type-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">MySQL</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">type-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">metadata</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">local-tx-datasource</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">datasources</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
<br />
<br />
接着我们修改server\default\conf\login-config.xml文件,加上下面这一段配置文件：<br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">application-policy&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="SuperPassword"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;//这里的name应该是你在配置数据源时写的security-domain里的字符串&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">authentication</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">login-module&nbsp;</span><span style="color: rgb(255, 0, 0);">code</span><span style="color: rgb(0, 0, 255);">="org.jboss.resource.security.SecureIdentityLoginModule"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag</span><span style="color: rgb(0, 0, 255);">="required"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">module-option&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="username"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">root</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">module-option</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;//数据库的用户名&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">module-option&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="password"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">2f34371127b18a0b</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">module-option</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;//数据库的密码，不过是加密过的了&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">module-option&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="managedConnectionFactoryName"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">jboss.jca:service=LocalTxCM,name=MySqlDS</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">module-option</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//注意name等于你的数据源的jndi-name,这里我的是MySqlDS&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">login-module</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">authentication</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">application-policy</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;<br />
<br />
3.上面的被加密过后的密码2f34371127b18a0b是哪里来的呢？照下面的方法就可以弄出来了。<br />
在命令行下运行：<br />
java&nbsp;-cp&nbsp;"D:\JBoss\lib\jboss-jmx.jar;D:\JBoss\lib\jboss-common.jar;D:\JBoss\server\default\lib\jboss-jca.jar;D:\JBoss\server\default\lib\jbosssx.jar"&nbsp;org.jboss.resource.security.SecureIdentityLoginModule&nbsp;123<br />
<br />
运行结果：Encoded&nbsp;password:&nbsp;2f34371127b18a0b<br />
<br />
就这样。把上面命令的路径和密码换换就OK了。<br />
<br />
</span></div>
<img src ="http://www.blogjava.net/zhouf/aggbug/250178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2009-01-06 21:24 <a href="http://www.blogjava.net/zhouf/articles/250178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在JTextField中实现对Ctrl+Enter的响应</title><link>http://www.blogjava.net/zhouf/articles/245897.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Fri, 12 Dec 2008 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/245897.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/245897.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/245897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/245897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/245897.html</trackback:ping><description><![CDATA[这段代码可以实现
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp; </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;Test&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;isPressed&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;show(){&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFrame&nbsp;&nbsp;&nbsp;frame&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;JFrame();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyTableModel&nbsp;&nbsp;&nbsp;tableModel</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;MyTableModel();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JTable&nbsp;&nbsp;&nbsp;table</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;JTable(tableModel);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JTextArea&nbsp;&nbsp;&nbsp;text&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;JTextArea(</span><span style="color: rgb(0, 0, 0);">3</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">20</span><span style="color: rgb(0, 0, 0);">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.addKeyListener(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;KeyAdapter(){&nbsp;&nbsp;<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;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;keyPressed(KeyEvent&nbsp;&nbsp;&nbsp;e)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(KeyEvent.VK_CONTROL&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;e.getKeyCode()){&nbsp;&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isPressed&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;&nbsp;&nbsp;<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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(e.getKeyCode()&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;KeyEvent.VK_ENTER&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;isPressed){&nbsp;&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JOptionPane.showMessageDialog(</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Ctrl+Enter&nbsp;&nbsp;&nbsp;was&nbsp;&nbsp;&nbsp;pressed.</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);&nbsp;&nbsp;<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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;keyReleased(KeyEvent&nbsp;&nbsp;&nbsp;e){&nbsp;&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getKeyCode());&nbsp;&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(KeyEvent.VK_CONTROL&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;e.getKeyCode()&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;KeyEvent.VK_ENTER&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;e.getKeyCode()){&nbsp;&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isPressed&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">;&nbsp;&nbsp;<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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.getContentPane().add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;JScrollPane(text));&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setSize(</span><span style="color: rgb(0, 0, 0);">300</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">400</span><span style="color: rgb(0, 0, 0);">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.show();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;main(String[]&nbsp;&nbsp;&nbsp;args){&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;&nbsp;&nbsp;test&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;Test();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test.show();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;}</span></div>
<img src ="http://www.blogjava.net/zhouf/aggbug/245897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2008-12-12 11:41 <a href="http://www.blogjava.net/zhouf/articles/245897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用LaTeX写漂亮学位论文</title><link>http://www.blogjava.net/zhouf/articles/245417.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Wed, 10 Dec 2008 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/245417.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/245417.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/245417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/245417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/245417.html</trackback:ping><description><![CDATA[这是一篇关于介绍用 LaTeX 写学位论文的好文章, 非常建议有一定LaTeX基础的, 而又不想用以前的模板或者找不到合适的模板的朋友写学位论文参考适用, (这里有许多学位论文的模板). 关于如何自己设置学位论文的版式, 下面已经介绍得非常详细了, 文章有点长, 慢慢看吧. 原文地址在这里.<br />
<br />
序<br />
一直觉得有必要写这样一篇文章，因为学位论文从格式上说更像一本书，与文章 的排版不同，不仅多出目录等文章没有的部分，而且一般要设置页眉页脚方便阅 读查找。学校有时会提出具体的格式要求，虽然复旦的要求非常简单，而且事实 上并不严格执行，但自己的论文毕竟是自己的孩子，还是要敝帚自珍的，大家都 希望做得漂亮一点。<br />
<br />
网上已经有不少学位论文的模板，其中大都出自一两个最初的版本，针对各自学 校的要求作了一些改动。这些模板还是很方便的，如果对它们的排版效果感到完 全满意，那么直接拿来用就可以了。不过如果想调整其中某些格式，就不得不仔 细研究一下它们的代码或说明文档，有时并不那么容易。而且这些模板的导言或 cls或sty文件都写得很长，内容很多，尽可能的包含了大家有可能用到的功能， 但其实具体到每个人只有一部分是需要用到的。用一个包含&#8220;冗余&#8221;代码的模板， 总不是一件很舒服的事情。当然也许很多人抱着能用就好的态度，并不care。 <br />
<br />
本文是为那些对论文格式有特殊要求或喜欢自己设置格式的人写的。如果你觉得 网上能找到的论文模板已经足以满足你的需要，并且对TeX本身也没有多少兴趣， 那么你没有必要花费宝贵的时间阅读本文。<br />
<br />
阅读本文的基础是假定你已经了解怎样用LaTeX来写普通的文章。一般的 TeX/LaTeX命令不会再作解释，重点将放在学位论文与普通文章的不同点上，以及 怎样用一些宏包方便地设置其格式。其中大部分内容来源于网络资源、工具书以 及各个宏包的说明文档，恕不一一注明，在此一并致谢！<br />
<br />
一<br />
首先讲一下纸张大小和页边距的设置。根据复旦的格式要求，纸张大小为A4纸， 正文用小四号字，页边距按Word中的默认设置。小四号字即12pt, Word中默认的 页边距为<br />
<br />
上边距=2.54cm, 下边距=2.54cm, 左边距=3.17cm, 右边距=3.17cm<br />
<br />
或者换算成更容易记忆的<br />
<br />
上边距=1in, 下边距=1in, 左边距=1.25in, 右边距=1.25in<br />
<br />
如果我们用book类，第一句可以写<br />
<br />
\documentclass[a4paper,12pt]{book}<br />
然后用geometry宏包设置页边距<br />
<br />
\usepackage[top=1in,bottom=1in,left=1.25in,right=1.25in]{geometry}<br />
但其实这样设置的页边距极不美观，尤其是左右对称的页边距没有考虑装订的需 要，而且加上页眉后这样的上边距就显得过窄。所以注重美观的话还是自己调整 一下吧。<br />
<br />
需要注意的是，book类默认是twoside即双面打印模式，与article类默认的 oneside即单面打印模式不同。两者区别在于页边距和页码的位置。单面模式每页 的页边距都相同，双面模式则会在偶数页将设置的左、右页边距调换。如果采用 单面打印，则可在\documentclass的方括号里加上oneside参数，并在geometry的 选项中适当增加左边距，减少右边距，以留出装订线的位置。但是不要忘了装订 的时候右侧一般会裁掉一点边，所以左、右边距也不要相差过大。如果采用双面 打印，则geometry中的设置被解释为奇数页的页边距，偶数页的左、右边距会自 动互换。<br />
<br />
还有几个注意事项。首先，这里的奇数页和偶数页是针对当前page计数器的值来 说的，而不是在生成文件中总的页码。也就是说，假如当前页在整个输出中总排 序是偶数页，但当前page计数器(即显示的页码)为奇数，则当前页的页边距是按 奇数页设置的。<br />
<br />
其次，\documentclass还有一对选项openright和openany, book类默认是前者， 即每一章(包括目录)都会在奇数页开始，如果前一章的最后一页是奇数页，则会 在其后插入一页空白页，以确保新的一章仍然从奇数页开始。这是书籍的排版规 范，不建议改变，论文页数比较少的还可以借此增加页数。 这是双面模式的情 况，在单面模式下不存在这个问题。经常有人问为什么自己明明是单面打印，却 仍然会在两章之间有一页空白页，请注意book类默认是双面模式，除非你设为 oneside, 记住告诉TeX你要的是什么！<br />
<br />
另外，为了方便查看，页码应该放在书籍的外侧。对于单面模式，外侧就是右 侧，而对于双面模式，奇数页右侧是外侧，偶数页左侧是外侧。如何设置页码留 到后面讲设置页眉、页脚时再详细说。<br />
<br />
至于到底是单面打印还是双面打印，看你自己的喜好了。复旦的论文规范没说， 一般的做法是博士双面、硕士单面。反正总页数少于50页的话，就不要双面了， 否则显得太单薄，书脊的内容都很难打印。<br />
<br />
最后提一个常见的问题。如果用pdf文件来打印，在Acrobat的打印对话框里有一 项Page Scaling默认是Fit to paper, 这样打印出来整个内容就会缩小一些，不 再是设置的尺寸。这是因为打印机的可打印范围不能达到整个A4纸张的全部，而 是比A4纸的规格要小一些(具体的可打印范围跟打印机型号有关), Fit to paper 的意思就是把整个页面调整到可打印范围上去，以保证所有页面上的内容都能打 印出来。因为可打印范围总是小于A4纸的尺寸，所以打印出来总是会缩小一些。 缩小的比例一般为95%左右，与打印机型号有关。解决这个问题，只要选择Page Scaling为None就可以了。<br />
<br />
二<br />
这一节讲中文字体和中英文混排的问题。中文处理推荐使用CJK或新版CCT, 旧版 CCT因为年代久远，有一些bug会导致莫名其妙的问题，不建议再使用。本文以 CJK为例，中文环境为<br />
<br />
\begin{CJK*}{GBK}{song}<br />
...<br />
\end{CJK*}<br />
与英文习惯不同，中文排版一般没有粗体的概念，而是用宋体、黑体、楷体、仿 宋等不同的字体来加强文本效果。在CJK默认的字体定义文件中，宋体对应的粗体 是用\CJKbold 命令通过微小平移字形来实现的，不仅放大后能看到锯齿，而且也 不符合中文的排版习惯。建议将宋体对应的粗体设为黑体，这样文中所有粗体命 令作用的环境中加粗的宋体都会自动变成黑体，不需要再用\CJKfamily{hei}来转 换。<br />
<br />
宋体的字体定义文件C19song.fd里典型的一段代码如下<br />
<br />
\DeclareFontFamily{C19}{song}{}<br />
\DeclareFontShape{C19}{song}{m}{n}{&lt;-&gt; CJK * gbksong}{}<br />
\DeclareFontShape{C19}{song}{bx}{n}{&lt;-&gt; CJKb * gbksong}{\CJKbold}<br />
\DeclareFontShape{C19}{song}{m}{it}{&lt;-&gt; CJK * gbksongsl}{}<br />
\DeclareFontShape{C19}{song}{bx}{it}{&lt;-&gt; CJKb * gbksongsl}{\CJKbold}<br />
\DeclareFontShape{C19}{song}{m}{sl}{&lt;-&gt; CJK * gbksongsl}{}<br />
\DeclareFontShape{C19}{song}{bx}{sl}{&lt;-&gt; CJKb * gbksongsl}{\CJKbold}<br />
这里C19代表GBK字符集的编码方式，m表示字符的粗细程度和宽紧程度均为中等 (medium), bx表示字符的属性为粗(bold)和松(expanded), n, it和sl分别表示正 常直立体(normal), 意大利斜体(italic)和机械斜体(slanted)。 \DeclareFontShape的最后两个参数分别是字体定义和命令序列。显然，上述语句 将宋体的粗体定义为用\CJKbold 生成。要将其改为黑体，只需将这段代码改为<br />
<br />
\DeclareFontFamily{C19}{song}{}<br />
\DeclareFontShape{C19}{song}{m}{n}{&lt;-&gt; CJK * gbksong}{}<br />
\DeclareFontShape{C19}{song}{bx}{n}{&lt;-&gt; CJKb * gbkhei}{}<br />
\DeclareFontShape{C19}{song}{m}{it}{&lt;-&gt; CJK * gbksongsl}{}<br />
\DeclareFontShape{C19}{song}{bx}{it}{&lt;-&gt; CJKb * gbkheisl}{}<br />
\DeclareFontShape{C19}{song}{m}{sl}{&lt;-&gt; CJK * gbksongsl}{}<br />
\DeclareFontShape{C19}{song}{bx}{sl}{&lt;-&gt; CJKb * gbkheisl}{}<br />
实际上，正式的中文排版也不应使用斜体，而应使用楷体或仿宋代替。所以也可 以类似地将上述语句中的gbksongsl改为gbkkai或gbkfs。<br />
<br />
上述字体定义命令可以放在sty文件中(设保存文件名为thesis.sty, 则在导言区 用\usepackage{thesis}引用，后面所述的大部分命令也都可以放在sty文件中), 而不需要更改本地机器上的fd文件，以便在别的机器上也能产生同样的效果。<br />
<br />
另外，为了方便可以定义几个简短的字体转换命令<br />
<br />
\newcommand{\song}{\CJKfamily{song}}<br />
\newcommand{\hei}{\CJKfamily{hei}}<br />
\newcommand{\kai}{\CJKfamily{kai}}<br />
\newcommand{\fs}{\CJKfamily{fs}}<br />
以后就可以用\song, \hei, \kai和\fs在文中转换字体了。<br />
<br />
在用\begin{CJK*}{GBK}{song}开始中文环境后，应加上\CJKindent和\CJKtilde 两句。前者将段首缩进设为两个中文字符的宽度。后者则是为了解决中英文混排 的美观问题。CJK*环境会吞掉跟在汉字后面的空格，从而使得源文件中的换行不 会在相邻汉字之间产生空白。但是这样一来，像下面这样输入的中英文内容<br />
<br />
中文 abc 中文<br />
就会产生如下效果<br />
<br />
中文abc 中文<br />
即abc两侧的空白不一样，很不美观。为解决这个问题，\CJKtilde重新定义了波 浪符~的意义，使得这个符号不再代表一个不可断行的空格，而是一个可断行的弹 性距离，加在中文和英文之间调整它们的距离。上面的中英文内容应该这样输入<br />
<br />
中文~abc~中文<br />
就能得到良好的效果。这个输入方式最好一开始就形成习惯，否则后来再加会很 麻烦。当然你也可以这样输入<br />
<br />
中文abc中文<br />
这样的话虽然中英文之间的距离太窄，但至少左右对称，比上述第一种方式略 好，是偷懒的办法。不过如果你比较在意排版质量的话，还是忍受一下输入~的麻 烦吧。<br />
<br />
中英文混排有一些标点的问题要处理好。首先是在默认的CJK环境里，行末的中文 标点不能与边界对齐，因为中文标点也被视为一个普通的全角字符，所以看起来 行末就有了不应该有的空白，这不符合中文的排版习惯。另外，当一行文字需要 压缩或拉伸时，逗号与句号也应该区别对待，逗号后面留的空白应该比句号小一 些。这两个问题用CJKpunct 宏包就能很好地解决，只要加上 \usepackage{CJKpunct}即可。<br />
<br />
此外，中英文混排的时候是用中文标点还是英文标点呢？这并没有统一的规范。 不过比较合理也比较通行的做法是，中文后用中文标点，英文后用英文标点。比 较特殊的两个标点是句号和括号。一般数学文章习惯用全角的实心句点作为中文 句号，这样看起来与英文的句号比较一致。全角的中文括号看起来不太好看，可 以统一使用英文的括号，不过左括号前面和右括号后面最好加上波浪符~以和前后 的文字留出适当的距离。<br />
<br />
上面说的这几点也许比较琐碎，不过也正是最能看出是否精心排版的地方。<br />
<br />
三<br />
下面几节讲怎样用titlesec和titletoc宏包设置章节标题、页眉页脚和目录的格 式。设置页眉页脚有一个很有名的宏包fancyhdr也可以用，不过titlesec提供的 页面设计命令更方便与它的章节标题命令配合，功能更强大。这一节先讲章节标 题格式的设置。<br />
<br />
在引用titlesec宏包时就可以指定几个格式选项，例如<br />
<br />
\usepackage[bf,small,center,indentafter,pagestyles]{titlesec}<br />
其中bf设置章节标题的字体为黑体，这也是默认值，可以略去。此外，还可以设 为rm(罗马体), sf(无衬线体), tt(打字机体), md(中等黑度), up(直立体), it(意大利斜体), sl(机械斜体), sc(小体大写字母)。<br />
<br />
small设置标题字体的尺寸，还可设为big(默认), medium, tiny。<br />
<br />
center使标题居中，还可以设为raggedleft(居左，默认), raggedright(居右)。<br />
<br />
indentafter相当于宏包indentfirst的作用，使标题下面的第一个段落正常缩进。<br />
<br />
pagestyles是申明后面要自定义页面样式。<br />
<br />
下面就可以用\titleformat, \titlespacing, \titlelabel等命令来设置标题格 式了。因为这些命令里会用到中文，所以要在设置之前放一个空的CJK环境，如<br />
<br />
\begin{CJK*}{GBK}{song}<br />
\end{CJK*}<br />
下面的\titleformat命令设置了章标题的格式<br />
<br />
\titleformat{\chapter}[hang]{\centering\LARGE\bfseries}{\chaptername}{1em}{}<br />
其中\chapter可以换为\section, \subsection等，设置节、小节等标题的格式。<br />
<br />
hang表示标题头与标题内容在同一行，是默认值。而book类默认的章标题是标题 头与标题内容放在两个段落，对应于display选项。此外还有block, runin, leftmargin, rightmargin, frame, wrap等选项，一般不大用到。<br />
<br />
\centering\LARGE\bfseries这一块是设置标题的排版格式，这里设置为居中、 \LARGE尺寸和黑体。<br />
<br />
后面紧跟的是标题头的定义。book类里的标题头是英文，需要改成中文。如果希 望改成&#8220;第一章&#8221;这样的格式，则应先引用CJKnumb宏包，它提供了把阿拉伯数字转 换成中文数字的命令。然后定义<br />
<br />
\renewcommand{\chaptername}{第\CJKnumber{\thechapter}章}<br />
那么\titleformat里的标题头定义\chaptername就得到我们希望的效果。当然你 也可以不用中文数字而用阿拉伯数字，即定义<br />
<br />
\renewcommand{\chaptername}{第~\thechapter~章}<br />
跟在标题头定义后面的是标题头与标题内容之间的距离，这里是1em。注意，在中 文环境里1em等于一个汉字的宽度。<br />
<br />
最后一个花括号内是在排版标题前执行的命令，这里空置。<br />
<br />
然后用\titlespacing或\titlespacing*命令设置标题与四周的距离，例如<br />
<br />
\titlespacing{\chapter}{0pt}{*0}{*4}<br />
将章标题与左边、上边、下边内容的距离分别设为0pt, *0, *4。这里*n表示弹性 距离，对上距离来说相当于n ex plus .3ex minus .06ex, 对下距离来说相当于 n ex plus .1ex。弹性距离因为有一定的伸缩自由度，比较容易得到美观的排版。 如果想自己指定用关键字plus, minus定义的弹性距离，可以用星号版本的命令， 即<br />
<br />
\titlespacing*{命令}{左距离}{上距离}{下距离}<br />
上面设置了章标题的命令，用相同的命令也可以设置节、小节等的标题格式。但 如果没有特殊的要求，只希望修改一下标题头，可以用更加简单的命令 \titlelabel来设置。例如<br />
<br />
\titlelabel{\S\thetitle\quad}<br />
将章节标题设置为类似&#8220;&#167;1 标题内容&#8221;的格式。这里\quad等于\hspace{1em}, 即 空出一个汉字宽度的距离。注意，\titleformat命令的定义会覆盖\titlelabel的 定义，而一般来说章跟节标题的格式不一样，所以只要另外用\titleformat命令 定义章标题的格式，\titlelabel的定义就只能作用于节以下层次的标题了。<br />
<br />
四<br />
这一节接着讲怎样用titlesec宏包提供的命令设置页眉、页脚。下面命令定义了 一个新的页面样式并使用该样式<br />
<br />
\newpagestyle{main}{<br />
\sethead{}{}{\kai\small\chaptername\quad\chaptertitle\qquad\thepage}<br />
\setfoot{}{}{}\headrule}<br />
\pagestyle{main}<br />
其中\sethead命令设置页眉，格式为<br />
<br />
\sethead[偶数页左页眉][偶数页中页眉][偶数页右页眉]<br />
{奇数页左页眉}{奇数页中页眉}{奇数页右页眉}<br />
单面打印模式只要给出奇数页的设置即可，双面模式则需要将左、右页眉做个调 换。上面给出的例子是单面模式的。<br />
<br />
\setfoot用来设置页脚，格式与\sethead类似。<br />
<br />
在页眉、页脚里可以显示章节标题、页码等内容。如上面的例子就在页眉中显示 了章标题和页码。注意，\qquad相当于两个\quad, 即\hspace{2em}。<br />
<br />
\headrule是划出页眉线，类似地\footrule划出页脚线，不过比较少用。默认页 眉线的宽度是0.4pt, 如果不满意，可以用下面命令重新设置其宽度<br />
<br />
\setheadrule{宽度}<br />
此外，还有两种特殊情况需要处理。首先，尽管在上面例子中用 \pagestyle{main}使用了自定义的页面样式，但每一章的第一页不受影响，仍然 使用默认的plain样式。在这种页面上，出于美观的考虑，一般不加页眉，而将页 码放在页脚(也有人喜欢不加页码)。所以plain样式(没有页眉，页码放在页脚中 间)已经基本符合要求，不必修改。如果需要修改，可定义一个新的页面样式，再 用下面命令重定义plain样式<br />
<br />
\renewpagestyle{plain}{新的页面样式}<br />
其次，在目录、参考文献或以\chapter*命令生成的章，上面页眉定义中的标题头 \chaptername是不应该显示的。所以有必要定义一个页面样式在这种特殊的章使 用，例如可以定义<br />
<br />
\newpagestyle{special}{<br />
\sethead{}{}{\kai\small\chaptertitle\qquad\thepage}<br />
\setfoot{}{}{}\headrule}<br />
然后在文中适当的地方用\pagestyle{special}改用该样式。<br />
<br />
五<br />
目录是学位论文的必要组成部分。只要在正文中适当的地方用<br />
<br />
\tableofcontents<br />
就可以自动生成目录。但是目录的格式不总是符合个人的要求，有时还要往其中 加一些条目。用titletoc宏包提供的命令可以方便地设置目录的格式。<br />
<br />
首先可以用<br />
<br />
\renewcommand{\contentsname}{目\quad 录}<br />
将目录部分的标题改为中文。然后，用\titlecontents命令来设置不同级别目录 项的格式。例如，chapter层次的目录项格式可设置如下<br />
<br />
\titlecontents{chapter}[0pt]{\vspace{.5\baselineskip}\bfseries}<br />
{第\CJKnumber{\thecontentslabel}章\quad}{}<br />
{\hspace{.5em}\titlerule*[10pt]{$\cdot$}\contentspage}<br />
其中0pt是目录项到版芯左边界的距离。紧跟其后的是在排版目录项之前执行的命 令，这里\vspace{.5\baselineskip}表示与上文留出一定的垂直距离，该距离为 当前单倍行间距的一半。\bfseries把整条目录项的字体设为黑体。<br />
<br />
后面一项是设置目录项的头部，这里设为&#8220;第一章&#8221;这样的格式，并在其后留出一 个汉字宽度的距离。紧跟的是设置目录项主体的格式，这里因为跟目录项头部相 同而空置。<br />
<br />
再后面是设置填充命令和页码。这里先用\hspace{.5em}在目录项内容后面留出一 点空白，以免跟其后的填充点靠得太近。然后用\titlerule*命令画出填充点，这 里是把垂直居中的实心圆点作为填充符号(习惯上中文不采用居下的填充点), 并 以10pt为包含一个填充符号的水平盒子的宽度，即这个宽度越小，填充点越紧密。 填充点后加上页码\contentspage。<br />
<br />
类似地可以设置section层次的目录项格式如下<br />
<br />
\titlecontents{section}[2em]{\vspace{.25\baselineskip}}<br />
{\S\thecontentslabel\quad}{}<br />
{\hspace{.5em}\titlerule*[10pt]{$\cdot$}\contentspage}<br />
其中2em表示section层次的目录项距左边界有一个缩进。如果还有subsection等 层次，可以类似地定义。<br />
<br />
但是\chapter*, \section*等命令生成的标题不会自动进入目录中。例如中文摘 要部分如果用下面命令开始<br />
<br />
\chapter*{摘\quad 要}<br />
那么可以紧跟其后加上<br />
<br />
\addcontentsline{toc}{chapter}{中文摘要}<br />
就可以将中文摘要作为一个chapter层次插入目录中。英文摘要、参考文献部分均 可照此处理。随便提一下，参考文献部分的标题可用如下命令改为中文<br />
<br />
\renewcommand{\bibname}{参考文献}<br />
六<br />
这一节讲前几节尚未提到的一些文本排版问题。<br />
<br />
首先是行间距的设置。学校的学位论文规范中提到行间距为20pt。其实不同尺寸 的字体行间距都不相同，而是成比例关系。这个20pt是对正文主要字体来说的。 在TeX中基本的行间距是\baselineskip, 对于12pt的字体，这个值等于14.5pt, 而真正的行间距是<br />
<br />
\baselineskip * \baselinestretch<br />
\baselinestretch默认为1, 但我们可以重新设置它的值，如<br />
\renewcommand{\baselinestretch}{1.38}<br />
就得到真正的行间距为14.5pt*1.38≈20pt。而这样定义之后，对不同尺寸的字体 都会按同样的比例因子1.38放大行间距，使得全文排版能协调一致。<br />
<br />
那么\baselineskip的值是怎么知道的呢？在TeX源文件中加上命令<br />
<br />
\showthe\baselineskip<br />
编译时就会暂停下来显示当前字体的\baselineskip值。用这个方法可以知 道，10pt字体对应的\baselineskip为12pt, 11pt字体对应的\baselineskip为 13.6pt。<br />
<br />
至于通常所说的1.5倍行间距和双倍行间距，一般理解为字体基准尺寸的1.5倍和 2倍，例如对于12pt字体, 1.5倍行间距和双倍行间距分别应为12pt*1.5=18pt, 12pt*2=24pt。那么\baselinestretch分别应设为18pt/14.5pt≈1.24, 24pt/14.5≈1.66, 而不是1.5和2, 那样的话行间距就会显得过大了。<br />
<br />
然后讲一下论文首页的设置。复旦的学位论文，装订的地方会按学校的模板制作 封面，就不用自己做了，不过规范中要求在扉页注明指导小组成员名单，并且为 了保持论文电子版的完整性，最好还是做一个简单的论文首页(标题页)。<br />
<br />
没有必要用\title, \author和\maketitle等命令自动生成论文的标题，因为那可 能不太符合你的要求。只要用<br />
<br />
\begin{titlepage}<br />
标题页内容<br />
\end{titlepage}<br />
在标题页内容中用上一些center环境、\vspace*和字体选择命令就可以很容易地 设计出自己想要的格式了。<br />
<br />
注意，上述标题页是没有页码的。而一般正文之前的部分，包括目录、摘要等， 习惯上采用与正文部分不同的页码格式，如用罗马数字表示，而从正文第一页开 始用阿拉伯数字重新开始计算页码。要做到这一点，只要在标题页后加上<br />
<br />
\frontmatter 或 \pagenumbering{roman}<br />
并在正文第一章前加上<br />
<br />
\mainmatter 或 \pagenumbering{arabic}<br />
就可以了。但是推荐使用\frontmatter和\mainmatter, 因为这两个命令的用处不 仅限于此。前面说过，像中文摘要这种非正文的部分，可以用\chapter*命令加 入，但当设置了页眉后就会发现一个问题，页眉中的\chaptertitle没有同步更新。 要解决这个问题，一个办法是在\chapter*命令后加上一句\chaptermark, 例如<br />
<br />
\chapter*{摘\quad 要}\chaptermark{摘\quad 要}<br />
但假如我们使用了\frontmatter, \mainmatter以及与其配套的\backmatter, 就 不需要这么麻烦，只要直接用不带星号版本的\chapter命令就可以了，对于 \frontmatter与\mainmatter之间的部分，以及\backmatter之后的部分，系统就 会自动地跟正文部分的章区别开来，不加上&#8220;第一章&#8221;这样的章标题头。一个典型 的文档结构示例如下<br />
<br />
\begin{document}<br />
\begin{titlepage}<br />
标题页内容<br />
\end{titlepage}<br />
\frontmatter % 开始正文之前的部分<br />
\tableofcontents % 自动生成目录<br />
\chapter[中文摘要]{摘\quad 要}<br />
% 方括号中是在目录中显示的内容，相当于前面使用的\addcontentsline<br />
中文摘要内容<br />
\chapter[英文摘要]{Abstract}<br />
英文摘要内容<br />
\mainmatter % 开始正文部分<br />
\chapter{第一章标题}<br />
第一章内容<br />
\backmatter % 开始正文之后的部分<br />
\begin{thebibliography}{99}\addcontentsline{toc}{chapter}{参考文献}<br />
参考文献内容<br />
\end{thebibliography}<br />
\chapter[致谢]{致\quad 谢}<br />
致谢内容<br />
\end{document}<br />
七<br />
到这里文本排版讲得差不多了。这一节再讲讲定理和证明环境的格式设置。<br />
<br />
数学论文里经常使用大量的定理环境。LaTeX默认的定理环境已经不能满足要 求，amsthm 宏包提供了方便的命令用于设置定理环境的格式。例如下面的命令定 义了一个定理样式mythm, 并用它来定义一些常用的定理环境<br />
<br />
\newtheoremstyle{mythm}{1.5ex plus 1ex minus .2ex}{1.5ex plus 1ex minus .2ex}<br />
{\kai}{\parindent}{\song\bfseries}{}{1em}{}<br />
\theoremstyle{mythm}<br />
\newtheorem{thm}{定理~}<br />
\newtheorem{lem}{引理~}<br />
\newtheorem{prop}{命题~}<br />
\newtheorem{cor}{推论~}<br />
\newtheorem{defn}{定义~}<br />
\newtheorem{conj}{猜想~}<br />
\newtheorem{exmp}{例~}<br />
\newtheorem{rem}{注~}<br />
我们解释一下\newtheoremstyle命令里各项参数的意义。样式名称之后的两个长 度分别表示定理与上、下文之间的距离，这里均设为弹性距离。\kai是设置定理 内容的字体。\parindent是设置定理首行的缩进，在前面使用了\CJKindent的情 况下，它就等于2em。<br />
<br />
紧随其后的\song\bfseries是设置定理头部即类似&#8220;定理 1&#8221;部分的格式，一般中 文使用黑体。因为我们在前面已经将宋体对应的粗体定义为黑体，所以这里将中 文字体设为宋体，再用选择粗体命令\bfseries, 就同时把中文变为黑体，英文变 为粗体了。注意，如果前面没有修改字体定义文件，而在这里用\hei改变字体， 再加上\bfseries就很可能会造成&#8220;黑上加黑&#8221;即黑体的加粗，这种拙劣的文本效果 是不应该出现的。<br />
<br />
这之后的参数是设置紧跟定理头部的符号，英文中常设为一句点，而中文习惯不 加任何符号，所以这里空置。然后是设置定理头部与定理内容之间的空白距离， 这里设为1em, 即一个汉字的宽度。<br />
<br />
最后一项是对定理头部的补充说明，这里空置。但如果我们希望得到类似&#8220;定理 1 (存在性定理)&#8221;这样的定理头部，那么可以再定义一种定理样式<br />
<br />
\newtheoremstyle{specthm}{1.5ex plus 1ex minus .2ex}{1.5ex plus 1ex minus<br />
.2ex}{\kai}{\parindent}{\song\bfseries}{}{1em}{\thmnote{#3}}<br />
这里最后一项\thmnote{#3}表示用方括号中的附加内容作为定理头部。用此样式 定义一个新的定理环境(与前面定义过的thm环境统一编号)<br />
<br />
\theoremstyle{specthm}<br />
\newtheorem{sthm}[thm]{}<br />
并在正文中使用<br />
<br />
\begin{sthm}[定理~\thethm~(存在性定理)]<br />
定理内容<br />
\end{sthm}<br />
就得到了想要的效果。<br />
<br />
至于证明的排版，amsthm宏包提供了proof环境，但格式需要做一点调整。 amsthm.sty中对proof环境的定义如下<br />
<br />
\newenvironment{proof}[1][\proofname]{\par<br />
\pushQED{\qed}%<br />
\normalfont \topsep6\p@\@plus6\p@\relax<br />
\trivlist<br />
\item[\hskip\labelsep<br />
\itshape<br />
#1\@addpunct{.}]\ignorespaces<br />
}{%<br />
\popQED\endtrivlist\@endpefalse<br />
}<br />
为了符合一般中文证明环境的排版习惯，可以重新定义proof环境为(注意，因为 这些命令含有@字符，所以需要在前、后分别加上\makeatletter和 \makeatother)<br />
<br />
\makeatletter<br />
\renewenvironment{proof}[1][\proofname]{\par<br />
\pushQED{\qed}%<br />
\normalfont \topsep6\p@\@plus6\p@ \labelsep1em\relax<br />
\trivlist<br />
\item[\hskip\labelsep\indent<br />
\bfseries #1]\ignorespaces<br />
}{%<br />
\popQED\endtrivlist\@endpefalse<br />
}<br />
\makeatother<br />
并且重新定义\proofname为<br />
<br />
\renewcommand{\proofname}{证明}<br />
proof环境会自动在证明最后一行的最右边加上一个证明结束符，默认为空心方 块，可以重新定义\qedsymbol来修改它。需要注意的是，当证明以一个独立公式 结束时，证明结束符会出现在下一行的最右边，而不是在公式的同一行上，这不 合乎习惯。这时只要在公式环境内加上\qedhere即可。<br />
<br />
八<br />
最后还要讲讲浮动图形和表格环境的中文化。首先把Figure和Table改为中文<br />
<br />
\renewcommand{\figurename}{图}<br />
\renewcommand{\tablename}{表}<br />
然后需要对浮动环境的标题格式做一点修改。在book.cls中可以找到如下定义<br />
<br />
\long\def\@makecaption#1#2{%<br />
\vskip\abovecaptionskip<br />
\sbox\@tempboxa{#1: #2}%<br />
\ifdim \wd\@tempboxa &gt;\hsize<br />
#1: #2\par<br />
\else<br />
\global \@minipagefalse<br />
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%<br />
\fi<br />
\vskip\belowcaptionskip}<br />
这段代码包括了一个判断选择结构，如果标题超过一行则直接显示，否则在一行 内居中显示。可以不理会这个，只要根据自己的格式要求修改#1(即\figurename 或\tablename) 和#2(标题内容)的格式，以及#1与#2之间的分隔符。例如，如果 希望把#1改为黑体，并把分隔符改为一个空格，可以这样设置<br />
<br />
\makeatletter<br />
\long\def\@makecaption#1#2{%<br />
\vskip\abovecaptionskip<br />
\sbox\@tempboxa{{\bfseries #1}\quad #2}%<br />
\ifdim \wd\@tempboxa &gt;\hsize<br />
{\bfseries #1}\quad #2\par<br />
\else<br />
\global \@minipagefalse<br />
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%<br />
\fi<br />
\vskip\belowcaptionskip}<br />
\makeatother<br />
★★★结束语★★★<br />
到这里，每个人都需要知道的东西已经基本上介绍完了。如果你仔细读了这些文 字，并且按照它去设置了你的论文格式，我想应该差不多了。当然，不同学科的 论文有各自的特点和要求，肯定还有很多具体的问题没有涉及。例如计算机专业 的可能经常要用到代码抄录环境，文科的论文可能要使用章末注，等等。这些问 题也是版上经常问到的，在本版精华区中大都能找到解答，这里就不再赘述。<br />
<br />
希望费了不少时间写的这些东西能对大家有所帮助。最后，祝大家TeX越用越熟 练，都能写出漂亮的论文！<br />
<img src ="http://www.blogjava.net/zhouf/aggbug/245417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2008-12-10 10:29 <a href="http://www.blogjava.net/zhouf/articles/245417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fancy设置latex页眉页脚</title><link>http://www.blogjava.net/zhouf/articles/244555.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Fri, 05 Dec 2008 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/244555.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/244555.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/244555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/244555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/244555.html</trackback:ping><description><![CDATA[在latex中用自定义页眉页脚, 一般都要使用宏包fancy. 关键是琢磨一下下面的例子, 在看看相应的说明,  一般就可以得到你想要的结果了. 下面的内容主要来自CTEX - 在线文档, 例子部分已经修改过来了, 可以直接编译.&nbsp;
<p>在用 LaTeX 排版文章、书籍时，缺省定义了四种页眉页脚的格式： </p>
<blockquote>
<table border="0" width="600">
    <tbody>
        <tr>
            <td width="150">empty</td>
            <td width="440">没有页眉和页脚</td>
        </tr>
        <tr>
            <td width="150">plain </td>
            <td width="440">没有页眉，页脚中部放置页码。</td>
        </tr>
        <tr>
            <td width="150">headings</td>
            <td width="440">没有页脚，页眉包含章节的标题和页码。</td>
        </tr>
        <tr>
            <td width="150">myheadings</td>
            <td width="440">没有页脚，页眉页码和使用者所定义的信息。</td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>article 缺省使用 plain 格式，而 book 则使用headings 格式。 也可用 \pagestyle 命令在你的文档中设定所用的格式，例如在文档中使用 \pagestyle{empty} 则使得此后的页面没有页眉和页脚。 一般情况下，这四种格式基本可满足排版的要求。但在某些情况下，特别是 使用者想定义自己的页眉和页脚格式时，就会遇到很多限制和麻烦。这时， 使用 fancyhdr 宏包可以很容易地达到目的。 </p>
<p>利用 fancyhdr 宏包提供的命令，可以方便的作到： </p>
<ul>
    <li>自定义页眉和页脚。 </li>
    <li>为页眉和页脚加上装饰性的横线。 </li>
    <li>页眉和页脚的宽度可以超过正文文本的宽度。 </li>
    <li>多行的页眉和页脚。 </li>
    <li>奇偶页使用不同格式的页眉和页脚。 </li>
    <li>每章的首页使用不同格式的页眉和页脚。 </li>
    <li>浮动对象页使用不同格式的页眉和页脚。 </li>
    <li>控制页眉和页脚的字体，包括字形，字族，大小写等。 </li>
</ul>
<p><strong>简单的例子：</strong></p>
<blockquote>
<p>\documentclass{article}<br />
</p>
<p>\usepackage{fancyhdr}<br />
\pagestyle{fancy}<br />
\lhead{} <br />
\chead{} <br />
\rhead{\bfseries The performance of new graduates} <br />
\lfoot{From: K. Grant} <br />
\cfoot{To: Dean A. Smith}<br />
\rfoot{\thepage} <br />
\renewcommand{\headrulewidth}{0.4pt} <br />
\renewcommand{\footrulewidth}{0.4pt}<br />
%......<br />
\begin{document}<br />
......</p>
<p>test!<br />
\end{document}</p>
</blockquote>
<p>上面例子中，\thepage 给出了当前页的页码，而 \bfseries 则使 LaTeX 使用粗体字排版页眉。如果想在文档中改用其它形式，比如在第一页不要页眉和页脚，则可在 \begin{document} 和 \maketitle 后使用命令 </p>
<blockquote>
<p>\thispagestyle{empty}</p>
</blockquote>
<p>缺省情况下，\maketitle 命令会自动设置其所在页的格式为 plain 。因此，如果你想在该页使用 fancy 格式的话，应该在 \maketile 后面使用命令 \thispagestyle{fancy}。</p>
<p>下面是一个双面页版式下的例子：</p>
<blockquote>
<p>\documentclass{book} <br />
\usepackage{fancyhdr}<br />
\fancyhead{} % clear all fields <br />
\fancyhead[RO,LE]{\bfseries The performance of new graduates} \fancyfoot[LE,RO]{\thepage} <br />
\fancyfoot[LO,CE]{From: K. Grant} <br />
\fancyfoot[CO,RE]{To: Dean A. Smith} <br />
\renewcommand{\headrulewidth}{0.4pt} \renewcommand{\footrulewidth}{0.4pt}<br />
\begin{document}<br />
......</p>
<p>test!<br />
\end{document} </p>
</blockquote>
<p>这里方括号中字母代表的意义为：</p>
<table border="0" width="600">
    <tbody>
        <tr>
            <td align="center" width="95">E</td>
            <td width="495">偶数页</td>
        </tr>
        <tr>
            <td align="center" width="95">O</td>
            <td width="495">奇数页</td>
        </tr>
        <tr>
            <td align="center" width="95">L</td>
            <td width="495">页眉或页脚的左边部分</td>
        </tr>
        <tr>
            <td align="center" width="95">C</td>
            <td width="495">页眉或页脚的中间部分</td>
        </tr>
        <tr>
            <td align="center" width="95">R</td>
            <td width="495">页眉或页脚的右边部分</td>
        </tr>
        <tr>
            <td align="center" width="95">H</td>
            <td width="495">页眉</td>
        </tr>
        <tr>
            <td align="center" width="95">F</td>
            <td width="495">页脚</td>
        </tr>
    </tbody>
</table>
<p>在配合 CJK 排版中文文档时，要把带有中文的页眉和页脚的定义用 \begin{CJK}{...}{...} 和 \end{CJK} 括起来。最简单的办法是将其放到 \begin{document} 和 \begin{CJK}{...}{...} 之后。如：</p>
<p>\documentclass{book} <br />
\usepackage{CJK}<br />
\usepackage{fancyhdr}<br />
%......<br />
\begin{document}<br />
\begin{CJK}{GBK}{song}<br />
\pagestyle{fancy}<br />
\fancyhead{} % clear all fields <br />
\fancyhead[RO,LE]{\CJKfamily{hei} \bfseries \LaTeX{} 排版系统} <br />
\fancyhead[LO,RE]{\CJKfamily{hei&gt;} \bfseries \leftmark}<br />
\fancyfoot[LE,RO]{\thepage} <br />
\fancyfoot[LO,RE]{\CJKfamily{kai} 公元二零零零年七月} <br />
\renewcommand{\headrulewidth}{0.4pt} <br />
\renewcommand{\footrulewidth}{0.4pt} <br />
%......</p>
<p>test!<br />
\end{CJK}<br />
\end{document}</p>
<img src ="http://www.blogjava.net/zhouf/aggbug/244555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2008-12-05 11:52 <a href="http://www.blogjava.net/zhouf/articles/244555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Latex写漂亮学位论文（转from Wloo）</title><link>http://www.blogjava.net/zhouf/articles/244548.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Fri, 05 Dec 2008 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/244548.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/244548.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/244548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/244548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/244548.html</trackback:ping><description><![CDATA[<br />
<br />
一直觉得有必要写这样一篇文章，因为学位论文从格式上说更像一本书，与文章的排版不同，不仅多出目录等文章没有的部分，而且一般要设置页眉页脚方便阅读查找。学校有时会提出具体的格式要求，虽然复旦的要求非常简单，而且事实上并不严格执行，但自己的论文毕竟是自己的孩子，还是要敝帚自珍的，大家都希望做得漂亮一点。<br />
<br />
网上已经有不少学位论文的模板，其中大都出自一两个最初的版本，针对各自学校的要求作了一些改动。这些模板还是很方便的，如果对它们的排版效果感到完全满意，那么直接拿来用就可以了。不过如果想调整其中某些格式，就不得不仔细研究一下它们的代码或说明文档，有时并不那么容易。而且这些模板的导言或 cls或sty文件都写得很长，内容很多，尽可能的包含了大家有可能用到的功能，但其实具体到每个人只有一部分是需要用到的。用一个包含&#8220;冗余&#8221;代码的模板，总不是一件很舒服的事情。当然也许很多人抱着能用就好的态度，并不care。:)<br />
<br />
本文是为那些对论文格式有特殊要求或喜欢自己设置格式的人写的。如果你觉得网上能找到的论文模板已经足以满足你的需要，并且对TeX本身也没有多少兴趣，那么你没有必要花费宝贵的时间阅读本文。<br />
<br />
阅读本文的基础是假定你已经了解怎样用LaTeX来写普通的文章。一般的 TeX/LaTeX命令不会再作解释，重点将放在学位论文与普通文章的不同点上，以及怎样用一些宏包方便地设置其格式。其中大部分内容来源于网络资源、工具书以及各个宏包的说明文档，恕不一一注明，在此一并致谢！<br />
一<br />
<br />
首先讲一下纸张大小和页边距的设置。根据复旦的格式要求，纸张大小为A4纸，正文用小四号字，页边距按Word中的默认设置。小四号字即12pt, Word中默认的页边距为<br />
<br />
上边距=2.54cm, 下边距=2.54cm, 左边距=3.17cm, 右边距=3.17cm<br />
<br />
或者换算成更容易记忆的<br />
<br />
上边距=1in, 下边距=1in, 左边距=1.25in, 右边距=1.25in<br />
<br />
如果我们用book类，第一句可以写<br />
<br />
\documentclass[a4paper,12pt]{book}<br />
<br />
然后用geometry宏包设置页边距<br />
<br />
\usepackage[top=1in,bottom=1in,left=1.25in,right=1.25in]{geometry}<br />
<br />
但其实这样设置的页边距极不美观，尤其是左右对称的页边距没有考虑装订的需要，而且加上页眉后这样的上边距就显得过窄。所以注重美观的话还是自己调整一下吧。<br />
<br />
需要注意的是，book类默认是twoside即双面打印模式，与article类默认的 oneside即单面打印模式不同。两者区别在于页边距和页码的位置。单面模式每页的页边距都相同，双面模式则会在偶数页将设置的左、右页边距调换。如果采用单面打印，则可在\documentclass的方括号里加上oneside参数，并在geometry的选项中适当增加左边距，减少右边距，以留出装订线的位置。但是不要忘了装订的时候右侧一般会裁掉一点边，所以左、右边距也不要相差过大。如果采用双面打印，则geometry中的设置被解释为奇数页的页边距，偶数页的左、右边距会自动互换。<br />
<br />
还有几个注意事项。首先，这里的奇数页和偶数页是针对当前page计数器的值来说的，而不是在生成文件中总的页码。也就是说，假如当前页在整个输出中总排序是偶数页，但当前page计数器(即显示的页码)为奇数，则当前页的页边距是按奇数页设置的。<br />
<br />
其次，\documentclass还有一对选项openright和openany, book类默认是前者，即每一章(包括目录)都会在奇数页开始，如果前一章的最后一页是奇数页，则会在其后插入一页空白页，以确保新的一章仍然从奇数页开始。这是书籍的排版规范，不建议改变，论文页数比较少的还可以借此增加页数。:)这是双面模式的情况，在单面模式下不存在这个问题。经常有人问为什么自己明明是单面打印，却仍然会在两章之间有一页空白页，请注意book类默认是双面模式，除非你设为 oneside, 记住告诉TeX你要的是什么！<br />
<br />
另外，为了方便查看，页码应该放在书籍的外侧。对于单面模式，外侧就是右侧，而对于双面模式，奇数页右侧是外侧，偶数页左侧是外侧。如何设置页码留到后面讲设置页眉、页脚时再详细说。<br />
<br />
至于到底是单面打印还是双面打印，看你自己的喜好了。复旦的论文规范没说，一般的做法是博士双面、硕士单面。反正总页数少于50页的话，就不要双面了，否则显得太单薄，书脊的内容都很难打印。<br />
<br />
最后提一个常见的问题。如果用pdf文件来打印，在Acrobat的打印对话框里有一项Page Scaling默认是Fit to paper, 这样打印出来整个内容就会缩小一些，不再是设置的尺寸。这是因为打印机的可打印范围不能达到整个A4纸张的全部，而是比A4纸的规格要小一些(具体的可打印范围跟打印机型号有关), Fit to paper 的意思就是把整个页面调整到可打印范围上去，以保证所有页面上的内容都能打印出来。因为可打印范围总是小于A4纸的尺寸，所以打印出来总是会缩小一些。缩小的比例一般为95%左右，与打印机型号有关。解决这个问题，只要选择Page Scaling为None就可以了。<br />
二<br />
<br />
这一节讲中文字体和中英文混排的问题。中文处理推荐使用CJK或新版CCT, 旧版 CCT因为年代久远，有一些bug会导致莫名其妙的问题，不建议再使用。本文以 CJK为例，中文环境为<br />
<br />
\begin{CJK*}{GBK}{song}<br />
...<br />
\end{CJK*}<br />
<br />
与英文习惯不同，中文排版一般没有粗体的概念，而是用宋体、黑体、楷体、仿宋等不同的字体来加强文本效果。在CJK默认的字体定义文件中，宋体对应的粗体是用\CJKbold 命令通过微小平移字形来实现的，不仅放大后能看到锯齿，而且也不符合中文的排版习惯。建议将宋体对应的粗体设为黑体，这样文中所有粗体命令作用的环境中加粗的宋体都会自动变成黑体，不需要再用\CJKfamily{hei}来转换。<br />
<br />
宋体的字体定义文件C19song.fd里典型的一段代码如下<br />
<br />
\DeclareFontFamily{C19}{song}{}<br />
\DeclareFontShape{C19}{song}{m}{n}{&lt;-&gt; CJK * gbksong}{}<br />
\DeclareFontShape{C19}{song}{bx}{n}{&lt;-&gt; CJKb * gbksong}{\CJKbold}<br />
\DeclareFontShape{C19}{song}{m}{it}{&lt;-&gt; CJK * gbksongsl}{}<br />
\DeclareFontShape{C19}{song}{bx}{it}{&lt;-&gt; CJKb * gbksongsl}{\CJKbold}<br />
\DeclareFontShape{C19}{song}{m}{sl}{&lt;-&gt; CJK * gbksongsl}{}<br />
\DeclareFontShape{C19}{song}{bx}{sl}{&lt;-&gt; CJKb * gbksongsl}{\CJKbold}<br />
<br />
这里C19代表GBK字符集的编码方式，m表示字符的粗细程度和宽紧程度均为中等 (medium), bx表示字符的属性为粗(bold)和松(expanded), n, it和sl分别表示正常直立体(normal), 意大利斜体(italic)和机械斜体(slanted)。 \DeclareFontShape的最后两个参数分别是字体定义和命令序列。显然，上述语句将宋体的粗体定义为用\CJKbold 生成。要将其改为黑体，只需将这段代码改为<br />
<br />
\DeclareFontFamily{C19}{song}{}<br />
\DeclareFontShape{C19}{song}{m}{n}{&lt;-&gt; CJK * gbksong}{}<br />
\DeclareFontShape{C19}{song}{bx}{n}{&lt;-&gt; CJKb * gbkhei}{}<br />
\DeclareFontShape{C19}{song}{m}{it}{&lt;-&gt; CJK * gbksongsl}{}<br />
\DeclareFontShape{C19}{song}{bx}{it}{&lt;-&gt; CJKb * gbkheisl}{}<br />
\DeclareFontShape{C19}{song}{m}{sl}{&lt;-&gt; CJK * gbksongsl}{}<br />
\DeclareFontShape{C19}{song}{bx}{sl}{&lt;-&gt; CJKb * gbkheisl}{}<br />
<br />
实际上，正式的中文排版也不应使用斜体，而应使用楷体或仿宋代替。所以也可以类似地将上述语句中的gbksongsl改为gbkkai或gbkfs。<br />
<br />
上述字体定义命令可以放在sty文件中(设保存文件名为thesis.sty, 则在导言区用\usepackage{thesis}引用，后面所述的大部分命令也都可以放在sty文件中), 而不需要更改本地机器上的fd文件，以便在别的机器上也能产生同样的效果。<br />
<br />
另外，为了方便可以定义几个简短的字体转换命令<br />
<br />
\newcommand{\song}{\CJKfamily{song}}<br />
\newcommand{\hei}{\CJKfamily{hei}}<br />
\newcommand{\kai}{\CJKfamily{kai}}<br />
\newcommand{\fs}{\CJKfamily{fs}}<br />
<br />
以后就可以用\song, \hei, \kai和\fs在文中转换字体了。<br />
<br />
在用\begin{CJK*}{GBK}{song}开始中文环境后，应加上\CJKindent和\CJKtilde 两句。前者将段首缩进设为两个中文字符的宽度。后者则是为了解决中英文混排的美观问题。CJK*环境会吞掉跟在汉字后面的空格，从而使得源文件中的换行不会在相邻汉字之间产生空白。但是这样一来，像下面这样输入的中英文内容<br />
<br />
中文 abc 中文<br />
<br />
就会产生如下效果<br />
<br />
中文abc 中文<br />
<br />
即abc两侧的空白不一样，很不美观。为解决这个问题，\CJKtilde重新定义了波浪符~的意义，使得这个符号不再代表一个不可断行的空格，而是一个可断行的弹性距离，加在中文和英文之间调整它们的距离。上面的中英文内容应该这样输入<br />
<br />
中文~abc~中文<br />
<br />
就能得到良好的效果。这个输入方式最好一开始就形成习惯，否则后来再加会很麻烦。当然你也可以这样输入<br />
<br />
中文abc中文<br />
<br />
这样的话虽然中英文之间的距离太窄，但至少左右对称，比上述第一种方式略好，是偷懒的办法。不过如果你比较在意排版质量的话，还是忍受一下输入~的麻烦吧。<br />
<br />
中英文混排有一些标点的问题要处理好。首先是在默认的CJK环境里，行末的中文标点不能与边界对齐，因为中文标点也被视为一个普通的全角字符，所以看起来行末就有了不应该有的空白，这不符合中文的排版习惯。另外，当一行文字需要压缩或拉伸时，逗号与句号也应该区别对待，逗号后面留的空白应该比句号小一些。这两个问题用CJKpunct 宏包就能很好地解决，只要加上 \usepackage{CJKpunct}即可。<br />
<br />
此外，中英文混排的时候是用中文标点还是英文标点呢？这并没有统一的规范。不过比较合理也比较通行的做法是，中文后用中文标点，英文后用英文标点。比较特殊的两个标点是句号和括号。一般数学文章习惯用全角的实心句点作为中文句号，这样看起来与英文的句号比较一致。全角的中文括号看起来不太好看，可以统一使用英文的括号，不过左括号前面和右括号后面最好加上波浪符~以和前后的文字留出适当的距离。<br />
<br />
上面说的这几点也许比较琐碎，不过也正是最能看出是否精心排版的地方。<br />
三<br />
<br />
下面几节讲怎样用titlesec和titletoc宏包设置章节标题、页眉页脚和目录的格式。设置页眉页脚有一个很有名的宏包fancyhdr也可以用，不过titlesec提供的页面设计命令更方便与它的章节标题命令配合，功能更强大。这一节先讲章节标题格式的设置。<br />
<br />
在引用titlesec宏包时就可以指定几个格式选项，例如<br />
<br />
\usepackage[bf,small,center,indentafter,pagestyles]{titlesec}<br />
<br />
其中bf设置章节标题的字体为黑体，这也是默认值，可以略去。此外，还可以设为rm(罗马体), sf(无衬线体), tt(打字机体), md(中等黑度), up(直立体), it(意大利斜体), sl(机械斜体), sc(小体大写字母)。<br />
<br />
small设置标题字体的尺寸，还可设为big(默认), medium, tiny。<br />
<br />
center使标题居中，还可以设为raggedleft(居左，默认), raggedright(居右)。<br />
<br />
indentafter相当于宏包indentfirst的作用，使标题下面的第一个段落正常缩进。<br />
<br />
pagestyles是申明后面要自定义页面样式。<br />
<br />
下面就可以用\titleformat, \titlespacing, \titlelabel等命令来设置标题格式了。因为这些命令里会用到中文，所以要在设置之前放一个空的CJK环境，如<br />
<br />
\begin{CJK*}{GBK}{song}<br />
\end{CJK*}<br />
<br />
下面的\titleformat命令设置了章标题的格式<br />
<br />
\titleformat{\chapter}[hang]{\centering\LARGE\bfseries}{\chaptername}{1em}{}<br />
<br />
其中\chapter可以换为\section, \subsection等，设置节、小节等标题的格式。<br />
<br />
hang 表示标题头与标题内容在同一行，是默认值。而book类默认的章标题是标题头与标题内容放在两个段落，对应于display选项。此外还有block, runin, leftmargin, rightmargin, frame, wrap等选项，一般不大用到。<br />
<br />
\centering\LARGE\bfseries这一块是设置标题的排版格式，这里设置为居中、 \LARGE尺寸和黑体。<br />
<br />
后面紧跟的是标题头的定义。book类里的标题头是英文，需要改成中文。如果希望改成&#8220;第一章&#8221;这样的格式，则应先引用CJKnumb宏包，它提供了把阿拉伯数字转换成中文数字的命令。然后定义<br />
<br />
\renewcommand{\chaptername}{第\CJKnumber{\thechapter}章}<br />
<br />
那么\titleformat里的标题头定义\chaptername就得到我们希望的效果。当然你也可以不用中文数字而用阿拉伯数字，即定义<br />
<br />
\renewcommand{\chaptername}{第~\thechapter~章}<br />
<br />
跟在标题头定义后面的是标题头与标题内容之间的距离，这里是1em。注意，在中文环境里1em等于一个汉字的宽度。<br />
<br />
最后一个花括号内是在排版标题前执行的命令，这里空置。<br />
<br />
然后用\titlespacing或\titlespacing*命令设置标题与四周的距离，例如<br />
<br />
\titlespacing{\chapter}{0pt}{*0}{*4}<br />
<br />
将章标题与左边、上边、下边内容的距离分别设为0pt, *0, *4。这里*n表示弹性距离，对上距离来说相当于n ex plus .3ex minus .06ex, 对下距离来说相当于 n ex plus .1ex。弹性距离因为有一定的伸缩自由度，比较容易得到美观的排版。如果想自己指定用关键字plus, minus定义的弹性距离，可以用星号版本的命令，即<br />
<br />
\titlespacing*{命令}{左距离}{上距离}{下距离}<br />
<br />
上面设置了章标题的命令，用相同的命令也可以设置节、小节等的标题格式。但如果没有特殊的要求，只希望修改一下标题头，可以用更加简单的命令 \titlelabel来设置。例如<br />
<br />
\titlelabel{\S\thetitle\quad}<br />
<br />
将章节标题设置为类似&#8220;&#167;1 标题内容&#8221;的格式。这里\quad等于\hspace{1em}, 即空出一个汉字宽度的距离。注意，\titleformat命令的定义会覆盖\titlelabel的定义，而一般来说章跟节标题的格式不一样，所以只要另外用\titleformat命令定义章标题的格式，\titlelabel的定义就只能作用于节以下层次的标题了。<br />
四<br />
<br />
这一节接着讲怎样用titlesec宏包提供的命令设置页眉、页脚。下面命令定义了一个新的页面样式并使用该样式<br />
<br />
\newpagestyle{main}{<br />
\sethead{}{}{\kai\small\chaptername\quad\chaptertitle\qquad\thepage}<br />
\setfoot{}{}{}\headrule}<br />
\pagestyle{main}<br />
<br />
其中\sethead命令设置页眉，格式为<br />
<br />
\sethead[偶数页左页眉][偶数页中页眉][偶数页右页眉]<br />
{奇数页左页眉}{奇数页中页眉}{奇数页右页眉}<br />
<br />
单面打印模式只要给出奇数页的设置即可，双面模式则需要将左、右页眉做个调换。上面给出的例子是单面模式的。<br />
<br />
\setfoot用来设置页脚，格式与\sethead类似。<br />
<br />
在页眉、页脚里可以显示章节标题、页码等内容。如上面的例子就在页眉中显示了章标题和页码。注意，\qquad相当于两个\quad, 即\hspace{2em}。<br />
<br />
\headrule是划出页眉线，类似地\footrule划出页脚线，不过比较少用。默认页眉线的宽度是0.4pt, 如果不满意，可以用下面命令重新设置其宽度<br />
<br />
\setheadrule{宽度}<br />
<br />
此外，还有两种特殊情况需要处理。首先，尽管在上面例子中用 \pagestyle{main}使用了自定义的页面样式，但每一章的第一页不受影响，仍然使用默认的plain样式。在这种页面上，出于美观的考虑，一般不加页眉，而将页码放在页脚(也有人喜欢不加页码)。所以plain样式(没有页眉，页码放在页脚中间)已经基本符合要求，不必修改。如果需要修改，可定义一个新的页面样式，再用下面命令重定义plain样式<br />
<br />
\renewpagestyle{plain}{新的页面样式}<br />
<br />
其次，在目录、参考文献或以\chapter*命令生成的章，上面页眉定义中的标题头 \chaptername是不应该显示的。所以有必要定义一个页面样式在这种特殊的章使用，例如可以定义<br />
<br />
\newpagestyle{special}{<br />
\sethead{}{}{\kai\small\chaptertitle\qquad\thepage}<br />
\setfoot{}{}{}\headrule}<br />
<br />
然后在文中适当的地方用\pagestyle{special}改用该样式。<br />
五<br />
<br />
目录是学位论文的必要组成部分。只要在正文中适当的地方用<br />
<br />
\tableofcontents<br />
<br />
就可以自动生成目录。但是目录的格式不总是符合个人的要求，有时还要往其中加一些条目。用titletoc宏包提供的命令可以方便地设置目录的格式。<br />
<br />
首先可以用<br />
<br />
\renewcommand{\contentsname}{目\quad 录}<br />
<br />
将目录部分的标题改为中文。然后，用\titlecontents命令来设置不同级别目录项的格式。例如，chapter层次的目录项格式可设置如下<br />
<br />
\titlecontents{chapter}[0pt]{\vspace{.5\baselineskip}\bfseries}<br />
{第\CJKnumber{\thecontentslabel}章\quad}{}<br />
{\hspace{.5em}\titlerule*[10pt]{$\cdot$}\contentspage}<br />
<br />
其中0pt是目录项到版芯左边界的距离。紧跟其后的是在排版目录项之前执行的命令，这里\vspace{.5\baselineskip}表示与上文留出一定的垂直距离，该距离为当前单倍行间距的一半。\bfseries把整条目录项的字体设为黑体。<br />
<br />
后面一项是设置目录项的头部，这里设为&#8220;第一章&#8221;这样的格式，并在其后留出一个汉字宽度的距离。紧跟的是设置目录项主体的格式，这里因为跟目录项头部相同而空置。<br />
<br />
再后面是设置填充命令和页码。这里先用\hspace{.5em}在目录项内容后面留出一点空白，以免跟其后的填充点靠得太近。然后用 \titlerule*命令画出填充点，这里是把垂直居中的实心圆点作为填充符号(习惯上中文不采用居下的填充点), 并以10pt为包含一个填充符号的水平盒子的宽度，即这个宽度越小，填充点越紧密。填充点后加上页码\contentspage。<br />
<br />
类似地可以设置section层次的目录项格式如下<br />
<br />
\titlecontents{section}[2em]{\vspace{.25\baselineskip}}<br />
{\S\thecontentslabel\quad}{}<br />
{\hspace{.5em}\titlerule*[10pt]{$\cdot$}\contentspage}<br />
<br />
其中2em表示section层次的目录项距左边界有一个缩进。如果还有subsection等层次，可以类似地定义。<br />
<br />
但是\chapter*, \section*等命令生成的标题不会自动进入目录中。例如中文摘要部分如果用下面命令开始<br />
<br />
\chapter*{摘\quad 要}<br />
<br />
那么可以紧跟其后加上<br />
<br />
\addcontentsline{toc}{chapter}{中文摘要}<br />
<br />
就可以将中文摘要作为一个chapter层次插入目录中。英文摘要、参考文献部分均可照此处理。随便提一下，参考文献部分的标题可用如下命令改为中文<br />
<br />
\renewcommand{\bibname}{参考文献}<br />
<br />
六<br />
<br />
这一节讲前几节尚未提到的一些文本排版问题。<br />
<br />
首先是行间距的设置。学校的学位论文规范中提到行间距为20pt。其实不同尺寸的字体行间距都不相同，而是成比例关系。这个20pt是对正文主要字体来说的。在TeX中基本的行间距是\baselineskip, 对于12pt的字体，这个值等于14.5pt, 而真正的行间距是<br />
<br />
\baselineskip * \baselinestretch<br />
<br />
\baselinestretch默认为1, 但我们可以重新设置它的值，如<br />
<br />
\renewcommand{\baselinestretch}{1.38}<br />
<br />
就得到真正的行间距为14.5pt*1.38≈20pt。而这样定义之后，对不同尺寸的字体都会按同样的比例因子1.38放大行间距，使得全文排版能协调一致。<br />
<br />
那么\baselineskip的值是怎么知道的呢？在TeX源文件中加上命令<br />
<br />
\showthe\baselineskip<br />
<br />
编译时就会暂停下来显示当前字体的\baselineskip值。用这个方法可以知道，10pt字体对应的\baselineskip为12pt, 11pt字体对应的\baselineskip为 13.6pt。<br />
<br />
至于通常所说的1.5倍行间距和双倍行间距，一般理解为字体基准尺寸的1.5倍和 2倍，例如对于12pt字体, 1.5倍行间距和双倍行间距分别应为12pt*1.5=18pt, 12pt*2=24pt。那么\baselinestretch分别应设为18pt/14.5pt≈1.24, 24pt/14.5≈1.66, 而不是1.5和2, 那样的话行间距就会显得过大了。<br />
<br />
然后讲一下论文首页的设置。复旦的学位论文，装订的地方会按学校的模板制作封面，就不用自己做了，不过规范中要求在扉页注明指导小组成员名单，并且为了保持论文电子版的完整性，最好还是做一个简单的论文首页(标题页)。<br />
<br />
没有必要用\title, \author和\maketitle等命令自动生成论文的标题，因为那可能不太符合你的要求。只要用<br />
<br />
\begin{titlepage}<br />
标题页内容<br />
\end{titlepage}<br />
<br />
在标题页内容中用上一些center环境、\vspace*和字体选择命令就可以很容易地设计出自己想要的格式了。<br />
<br />
注意，上述标题页是没有页码的。而一般正文之前的部分，包括目录、摘要等，习惯上采用与正文部分不同的页码格式，如用罗马数字表示，而从正文第一页开始用阿拉伯数字重新开始计算页码。要做到这一点，只要在标题页后加上<br />
<br />
\frontmatter 或 \pagenumbering{roman}<br />
<br />
并在正文第一章前加上<br />
<br />
\mainmatter 或 \pagenumbering{arabic}<br />
<br />
就可以了。但是推荐使用\frontmatter和\mainmatter, 因为这两个命令的用处不仅限于此。前面说过，像中文摘要这种非正文的部分，可以用\chapter*命令加入，但当设置了页眉后就会发现一个问题，页眉中的\chaptertitle没有同步更新。要解决这个问题，一个办法是在\chapter*命令后加上一句\chaptermark, 例如<br />
<br />
\chapter*{摘\quad 要}\chaptermark{摘\quad 要}<br />
<br />
但假如我们使用了\frontmatter, \mainmatter以及与其配套的\backmatter, 就不需要这么麻烦，只要直接用不带星号版本的\chapter命令就可以了，对于 \frontmatter与\mainmatter之间的部分，以及\backmatter之后的部分，系统就会自动地跟正文部分的章区别开来，不加上&#8220; 第一章&#8221;这样的章标题头。一个典型的文档结构示例如下<br />
<br />
\begin{document}<br />
<br />
\begin{titlepage}<br />
标题页内容<br />
\end{titlepage}<br />
<br />
\frontmatter    % 开始正文之前的部分<br />
\tableofcontents    % 自动生成目录<br />
<br />
\chapter[中文摘要]{摘\quad 要}<br />
% 方括号中是在目录中显示的内容，相当于前面使用的\addcontentsline<br />
中文摘要内容<br />
<br />
\chapter[英文摘要]{Abstract}<br />
英文摘要内容<br />
<br />
\mainmatter     % 开始正文部分<br />
\chapter{第一章标题}<br />
第一章内容<br />
<br />
\backmatter     % 开始正文之后的部分<br />
\begin{thebibliography}{99}\addcontentsline{toc}{chapter}{参考文献}<br />
参考文献内容<br />
\end{thebibliography}<br />
<br />
\chapter[致谢]{致\quad 谢}<br />
致谢内容<br />
<br />
\end{document}<br />
<br />
七<br />
<br />
到这里文本排版讲得差不多了。这一节再讲讲定理和证明环境的格式设置。<br />
<br />
数学论文里经常使用大量的定理环境。LaTeX默认的定理环境已经不能满足要求，amsthm 宏包提供了方便的命令用于设置定理环境的格式。例如下面的命令定义了一个定理样式mythm, 并用它来定义一些常用的定理环境<br />
<br />
\newtheoremstyle{mythm}{1.5ex plus 1ex minus .2ex}{1.5ex plus 1ex minus .2ex}<br />
{\kai}{\parindent}{\song\bfseries}{}{1em}{}<br />
\theoremstyle{mythm}<br />
\newtheorem{thm}{定理~}<br />
\newtheorem{lem}{引理~}<br />
\newtheorem{prop}{命题~}<br />
\newtheorem{cor}{推论~}<br />
\newtheorem{defn}{定义~}<br />
\newtheorem{conj}{猜想~}<br />
\newtheorem{exmp}{例~}<br />
\newtheorem{rem}{注~}<br />
<br />
我们解释一下\newtheoremstyle命令里各项参数的意义。样式名称之后的两个长度分别表示定理与上、下文之间的距离，这里均设为弹性距离。 \kai是设置定理内容的字体。\parindent是设置定理首行的缩进，在前面使用了\CJKindent的情况下，它就等于2em。<br />
<br />
紧随其后的\song\bfseries是设置定理头部即类似&#8220;定理 1&#8221;部分的格式，一般中文使用黑体。因为我们在前面已经将宋体对应的粗体定义为黑体，所以这里将中文字体设为宋体，再用选择粗体命令\bfseries, 就同时把中文变为黑体，英文变为粗体了。注意，如果前面没有修改字体定义文件，而在这里用\hei改变字体，再加上\bfseries就很可能会造成&#8220;黑上加黑&#8221;即黑体的加粗，这种拙劣的文本效果是不应该出现的。<br />
<br />
这之后的参数是设置紧跟定理头部的符号，英文中常设为一句点，而中文习惯不加任何符号，所以这里空置。然后是设置定理头部与定理内容之间的空白距离，这里设为1em, 即一个汉字的宽度。<br />
<br />
最后一项是对定理头部的补充说明，这里空置。但如果我们希望得到类似&#8220;定理 1 (存在性定理)&#8221;这样的定理头部，那么可以再定义一种定理样式<br />
<br />
\newtheoremstyle{specthm}{1.5ex plus 1ex minus .2ex}{1.5ex plus 1ex minus <br />
.2ex}{\kai}{\parindent}{\song\bfseries}{}{1em}{\thmnote{#3}}<br />
<br />
这里最后一项\thmnote{#3}表示用方括号中的附加内容作为定理头部。用此样式定义一个新的定理环境(与前面定义过的thm环境统一编号)<br />
<br />
\theoremstyle{specthm}<br />
\newtheorem{sthm}[thm]{}<br />
<br />
并在正文中使用<br />
<br />
\begin{sthm}[定理~\thethm~(存在性定理)]<br />
定理内容<br />
\end{sthm}<br />
<br />
就得到了想要的效果。<br />
<br />
至于证明的排版，amsthm宏包提供了proof环境，但格式需要做一点调整。 amsthm.sty中对proof环境的定义如下<br />
<br />
\newenvironment{proof}[1][\proofname]{\par<br />
\pushQED{\qed}%<br />
\normalfont \topsep6\p@\@plus6\p@\relax<br />
\trivlist<br />
\item[\hskip\labelsep<br />
\itshape<br />
#1\@addpunct{.}]\ignorespaces<br />
}{%<br />
\popQED\endtrivlist\@endpefalse<br />
}<br />
<br />
为了符合一般中文证明环境的排版习惯，可以重新定义proof环境为(注意，因为这些命令含有@字符，所以需要在前、后分别加上\makeatletter和 \makeatother)<br />
<br />
\makeatletter<br />
\renewenvironment{proof}[1][\proofname]{\par<br />
\pushQED{\qed}%<br />
\normalfont \topsep6\p@\@plus6\p@ \labelsep1em\relax<br />
\trivlist<br />
\item[\hskip\labelsep\indent<br />
\bfseries #1]\ignorespaces<br />
}{%<br />
\popQED\endtrivlist\@endpefalse<br />
}<br />
\makeatother<br />
<br />
并且重新定义\proofname为<br />
<br />
\renewcommand{\proofname}{证明}<br />
<br />
proof 环境会自动在证明最后一行的最右边加上一个证明结束符，默认为空心方块，可以重新定义\qedsymbol来修改它。需要注意的是，当证明以一个独立公式结束时，证明结束符会出现在下一行的最右边，而不是在公式的同一行上，这不合乎习惯。这时只要在公式环境内加上\qedhere即可。<br />
八<br />
<br />
最后还要讲讲浮动图形和表格环境的中文化。首先把Figure和Table改为中文<br />
<br />
\renewcommand{\figurename}{图}<br />
\renewcommand{\tablename}{表}<br />
<br />
然后需要对浮动环境的标题格式做一点修改。在book.cls中可以找到如下定义<br />
<br />
\long\def\@makecaption#1#2{%<br />
\vskip\abovecaptionskip<br />
\sbox\@tempboxa{#1: #2}%<br />
\ifdim \wd\@tempboxa &gt;\hsize<br />
#1: #2\par<br />
\else<br />
\global \@minipagefalse<br />
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%<br />
\fi<br />
\vskip\belowcaptionskip}<br />
<br />
这段代码包括了一个判断选择结构，如果标题超过一行则直接显示，否则在一行内居中显示。可以不理会这个，只要根据自己的格式要求修改#1(即\figurename 或\tablename) 和#2(标题内容)的格式，以及#1与#2之间的分隔符。例如，如果希望把#1改为黑体，并把分隔符改为一个空格，可以这样设置<br />
<br />
\makeatletter<br />
\long\def\@makecaption#1#2{%<br />
\vskip\abovecaptionskip<br />
\sbox\@tempboxa{{\bfseries #1}\quad #2}%<br />
\ifdim \wd\@tempboxa &gt;\hsize<br />
{\bfseries #1}\quad #2\par<br />
\else<br />
\global \@minipagefalse<br />
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%<br />
\fi<br />
\vskip\belowcaptionskip}<br />
\makeatother<br />
<br />
到这里，每个人都需要知道的东西已经基本上介绍完了。如果你仔细读了这些文字，并且按照它去设置了你的论文格式，我想应该差不多了。当然，不同学科的论文有各自的特点和要求，肯定还有很多具体的问题没有涉及。例如计算机专业的可能经常要用到代码抄录环境，文科的论文可能要使用章末注，等等。这些问题也是版上经常问到的，在本版精华区中大都能找到解答，这里就不再赘述。<br />
<br />
希望费了不少时间写的这些东西能对大家有所帮助。最后，祝大家TeX越用越熟练，都能写出漂亮的论文！<br />
<img src ="http://www.blogjava.net/zhouf/aggbug/244548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2008-12-05 11:48 <a href="http://www.blogjava.net/zhouf/articles/244548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML表格斑马线</title><link>http://www.blogjava.net/zhouf/articles/238196.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Sun, 02 Nov 2008 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/238196.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/238196.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/238196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/238196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/238196.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">/*表格间隔行变背景色*/<br />
.row<br />
{<br />
&nbsp;alternateColor:expression(bgColor=rowIndex%2==0?'#FFFFFF':'#EFF7FF');<br />
&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;<br />
将上面的代码加入到tr中<br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">table</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">thead</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td&nbsp;</span><span style="color: #ff0000;">nowrap</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">状态</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">thead</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tbody</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tr&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="row"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">td&nbsp;</span><span style="color: #ff0000;">nowrap</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">11111</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">td</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tr</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tbody</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">table</span><span style="color: #0000ff;">&gt;</span></div>
<img src ="http://www.blogjava.net/zhouf/aggbug/238196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2008-11-02 17:39 <a href="http://www.blogjava.net/zhouf/articles/238196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)完全用Linux工作---作者:王垠</title><link>http://www.blogjava.net/zhouf/articles/238125.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Sat, 01 Nov 2008 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/238125.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/238125.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/238125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/238125.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/238125.html</trackback:ping><description><![CDATA[我已经半年没有使用&nbsp;Windows&nbsp;的方式工作了。Linux&nbsp;高效的完成了我所有的工作。&nbsp;<br />
GNU/Linux&nbsp;不是每个人都想用的。如果你只需要处理一般的事务，打游戏，那么你不需要了解下面这些了。&nbsp;<br />
我不是一个狂热的自由软件份子，虽然我很喜欢自由软件。这篇文章也不是用来推行自由软件运动的，虽然我觉得自由软件运动是非常好的。&nbsp;<br />
这篇文章也不是用来比较&nbsp;Linux&nbsp;和&nbsp;Windows&nbsp;内核效率，文件系统，网络服务的。我现在是作为一个用户而不是一个开发者来说话的，我们的讨论是基于操作，应用层面的。是为了告诉大学里还不了解，或者不理解&nbsp;UNIX&nbsp;的科学工作者和大学生，UNIX&nbsp;比&nbsp;Windows&nbsp;更适合用于科学研究工作，请大家理解&nbsp;UNIX&nbsp;的工作方式，不要用&nbsp;Windows&nbsp;的标准来要求&nbsp;Linux，而要用一个科学工作者的标准来要求自己，用UNIX&nbsp;的思想来武装自己。&nbsp;<br />
我显然是反对在大学，特别是理工科专业推广&nbsp;Windows&nbsp;的。我也反对在对"娃娃"们的计算机启蒙教育中使用 &nbsp;Windows。因为&nbsp;Windows&nbsp;不论从技术上，经济上，思想风格上都是与我们培养高科技人才的目标格格不入的。Windows&nbsp;的流行属于历史遗留问题，爷爷一级的人当然已经不可救药，但是我们不应该让下一代继续走上歧途。&nbsp;<br />
UNIX&nbsp;不是计算机专家的专利&nbsp;<br />
当我建议一些非计算机专业的人用&nbsp;Linux&nbsp;的时候，很多人说："UNIX&nbsp;是计算机系的人用的，我们不能理解。"&nbsp;"UNIX&nbsp;是男孩用的，我们女孩不用。"&nbsp;<br />
但是其实世界上的大多数科学家和工程师几乎用的都是&nbsp;UNIX&nbsp;作为他们的电脑工具。就因为它简单，可靠，稳定，强大，有趣。甚至很多时候&nbsp;UNIX&nbsp;就是唯一的选择。&nbsp;<br />
你说："我们都会用&nbsp;UNIX&nbsp;的话，你们计算机专业的人还用来干什么？"&nbsp;很容幸的告诉你，计算机专业的有一部分人就是专门为你们提供这样强大而方便的计算机工具的。如果他们制造的工具只有自己会用的话，那这个工具还有什么用？&nbsp;<br />
理解&nbsp;GNU/Linux&nbsp;不要用&nbsp;Windows&nbsp;的标准来要求&nbsp;Linux。&nbsp;<br />
由于GNU/Linux这个词太长，下面如果没有特别指明，"Linux"就是指GNU/Linux"。&nbsp;<br />
在这个年代，恐怕没有人需要我来介绍&nbsp;Linux&nbsp;是什么了吧？如果你觉得"Linux&nbsp;只不过是跟&nbsp;DOS&nbsp;差不多的东西"，那请问问你旁边的&nbsp;Linux&nbsp;用户，Linux&nbsp;到底是什么？&nbsp;<br />
那为什么我还要写一篇这样的文章？因为，我发现还有很多人不不理解&nbsp;Linux&nbsp;和&nbsp;UNIX，虽然他们也在用它，但是他们有时会问："为什么 &nbsp;Linux&nbsp;不能像&nbsp;Windows&nbsp;那样&nbsp;&#8230;&#8230;？"，"怎么Redhat&nbsp;Linux不能&nbsp;mount&nbsp;NTFS&nbsp;分区！"，"Linux&nbsp;下用什么整理硬盘？"，"什么时候OpenOffice才能完全兼容Word文件啊？"，"现在还有什么Windows能干的事情Linux干不了的？"&#8230;&#8230;&nbsp;<br />
他们有40G的硬盘，却只为&nbsp;Linux&nbsp;分配了2G空间，有时还抱怨"这个东西怎么占这么多硬盘！"&nbsp;似乎&nbsp;Windows&nbsp;该占用大部分硬盘。他们把重要的数据装在Windows的分区，似乎信不过Linux。他们总是到处寻找新奇的，好看的GUI程序，对命令行的东西一概不屑一顾。他们对 Drag&amp;Drop，菜单配置，自动升级非常感兴趣。他们如果找到一个很像&nbsp;Windows&nbsp;程序的&nbsp;Linux&nbsp;程序，一定会很高兴的说："哈哈！Linux&nbsp;也能&#8230;&#8230;了！"如果Linux在某种测试中胜过Windows，他们会高兴得跳起来。他们没有办法用Linux&nbsp;解决问题的时候，甚至用 Wine来运行Windows程序。有时实在没办法，只好重起到Windows，或者干脆省得麻烦，在&nbsp;Windows&nbsp;下装一个&nbsp;VMWare&nbsp;虚拟一个&nbsp;Linux&nbsp;玩。&nbsp;<br />
你如果出现了上面的情况，说明你的思想受到了&nbsp;Windows&nbsp;的某种潜移默化的影响和误导。你没有能够从本质上理解存在于&nbsp;Linux&nbsp;身上的&nbsp;UNIX&nbsp;思想。你支持&nbsp;Linux，你喜欢&nbsp;Linux，你能从中感觉到快乐，这非常好。你现在只需要明白的是：Linux&nbsp; 从来就不是一个玩具，它是天才UNIX的后代。UNIX&nbsp;是自晶体管发明以来最伟大的发明，它从诞生那一天开始就比&nbsp;Windows&nbsp;的设计出色。&nbsp;<br />
你要体会什么叫做"设计"，一个糟糕的设计并不是到后来缝缝补补就可以变好的，而一个出色的设计，不但可以以不变应万变，而且可以影响到后来者。一个出色的设计配上一个出色的实现，那就是非常出色的发明。Linux&nbsp;就是这样的一个出色的发明。Linux&nbsp;并不需要追赶&nbsp;Windows，也不需要打垮微软。它的最终目标是改变整个计算机世界，还人们自由，给人们乐趣和方便。&nbsp;<br />
Unix&nbsp;是简单的，你不需要成为一个天才也能理解这种简单。&nbsp;<br />
UNIX 的设计者&nbsp;Dennis&nbsp;Ritchie&nbsp;说： "Unix&nbsp;is&nbsp;simple.&nbsp;It&nbsp;just&nbsp;takes&nbsp;a&nbsp;genius&nbsp;to&nbsp;understand&nbsp;its&nbsp;simplicity."&nbsp;但是我不这么认为，因为我不是一个天才，但是我却勇敢的把&nbsp;Windows&nbsp;完全删除掉，遇到不明白的事情的时候努力用&nbsp;UNIX&nbsp;的方式去解决，而不是寻求&nbsp;Windows&nbsp;的帮助。现在我体会到了&nbsp;UNIX&nbsp;的思想和好处，我可以用比&nbsp;Windows&nbsp;高效几倍的效率工作。因为我相信这样的信念： "Windows&nbsp;能办到的事&nbsp;Linux&nbsp;一定能办到，而且办的更好。"&nbsp;<br />
这小节开头的话应该改成："Unix&nbsp;是简单的，你不需要成为一个天才或是计算机专家。但是在这个冲斥着&nbsp;Windows&nbsp;错误观念的世界，你需要信念和勇气才能理解它的简单。"&nbsp;我下面就告诉你一些我理解到的东西。首先，你要知道的是微软在国际科学领域是根本没有地位的。&nbsp;<br />
微软的地位&nbsp;<br />
微软的名声在欧洲和美国的大学里，特别是在计算机系里之坏，大家可能有所耳闻。我认识的&nbsp;MIT，Stanford&nbsp;的教授，贝尔实验室的专家，甚至一个欧洲小国的高中计算机老师都绝口不提微软的名字。在他们眼里，微软只是一个没有真技术，专靠在落后国家商业宣传和垄断经营的小公司。这个"小"并不是说它人少，钱少，而是说它先进技术少。&nbsp;<br />
我上次和王益合作写了一个算法演示程序，那个算法是贝尔实验室一位科学家Steven&nbsp;Fortune很天才的发明，为了程序能够被身边大多数人使用，我们选择了&nbsp;VC+ MFC&nbsp;作为平台。我在分析算法时还得到&nbsp;Fortune&nbsp;很热情的鼓励，寄给我一份资料，还多次回信耐心的给我讲解了很多细节。但是程序完成之后，我把样品发给&nbsp;Fortune，他回信说："对不起。我机器上没有&nbsp;MFC。"&nbsp;话说的很客气，但是我已经感觉到了他对&nbsp;Windows的不屑。然后我把 &nbsp;MFC&nbsp;静态编译进程序再发给他，他就没有再回信了。他显然不是瞧不起我，而是确实有难处。&nbsp;<br />
你能感觉到这位科学家对微软和&nbsp;Windows&nbsp; 是什么态度了吧？不是反感，而是他心里根本没有&nbsp;Windows&nbsp;这个东西！微软在高科技领域没有发展，那么它怎么生存呢？到发展中国家去发展一下，他们的人民还对电脑一无所知，我说不定甚至可以打入大学的计算机系呢。我送他们软件，我捐钱盖大楼，我出钱找图灵奖获得者来演讲，让他们觉得我们都是科学家！ &nbsp;<br />
好了，现在全国的大学包括清华，几乎所有人机器必装盗版&nbsp;Win2000，Office&nbsp;XP，学校的选课系统是非IE不能正确浏览，论文用 &nbsp;Word&nbsp;编辑，演示用ppt做，email&nbsp;的通知附件是&nbsp;doc&nbsp;文件，你不用&nbsp;Word&nbsp;打不开，连&nbsp;863&nbsp;项目都用&nbsp;VC&nbsp;写程序了。我很久以前就看到一份报纸说，"微软为什么不严厉打击盗版？"&nbsp;这篇文章说，微软非但不打击中国的盗版行为，而且有放任之趋势。放长线吊大鱼，"以后我要你们加倍的来还我！"&nbsp;确实如此，它的目的快实现了。&nbsp;<br />
Windows&nbsp;笼罩下的中国计算机教育&nbsp;<br />
说句丢脸的话，比尔盖茨很久以前是我的偶像&#8230;&#8230;&nbsp;//blush&nbsp;<br />
在中国，比尔盖茨被很多人奉为神圣，"少年电脑天才"，甚至有的人提到他的名字就做出"抱拳对天"的姿势。很多人谈到微软的"新技术"，"高科技"&nbsp;都是眉飞色舞。各种"VC编程圣经"，"深入了解&nbsp;Visual&nbsp;C++"之类的书，在开头几页都会出现非常肉麻的字眼，"在那团团的混沌中，一个开天辟地的精灵，Windows&nbsp;1.0，诞生了&#8230;&#8230;"&nbsp;<br />
微软的软件被这么多人盗用，那么人们是怎样使用这些盗版程序的呢？先看看电脑培训班，教的都是一些 &nbsp;DOS&nbsp;命令，打字，Windows&nbsp;基本操作，Word&nbsp;文档处理，PowerPoint，高级班可能有&nbsp;Excel，Access&#8230;&#8230;&nbsp;参加各种微软认证考试，MCSE，MSDE&nbsp;的人络绎不绝。考试辅导班都贴出了"280元，考过为止"之类的字样。考试参考资料更是昂贵，有些电脑书店整整两书架都是"Microsoft&nbsp;Press"的东西。我有个同学参加认证考试，每门考试都要200多元。而且你一次考不过可以再考，又要交钱。他后来还津津乐道跟我说，看我，花了XXXX(一个四位数)元考过了微软认证，得到一张比尔盖茨亲笔签名的证书和价值6000元的&nbsp;Windows&nbsp;XP&nbsp;内部发行版。&nbsp;<br />
" 电脑要从娃娃抓起"，我们再来看看娃娃们学的是什么。大部分家长给孩子买了电脑之后，他们首先就会装一个盗版的&nbsp;Windows，然后买来盗版的游戏开始玩。如果哪个孩子会用&nbsp;Delphi&nbsp;编程序，那可不得了。报社记者，电视台争相报导，说，某某学校的初中生某某，在别人都还在玩电脑游戏这种"初级阶段 "的时候就已经用&nbsp;Delphi&nbsp;写程序了。镜头还瞄准了他显示器上面的像框中的比尔盖茨头像！&nbsp;<br />
我刚进入大学计算机系时还不懂得什么是操作系统，因为我以前只用过"中华学习机"。看到新入学的同学们各个谈论的都是&nbsp;"Windows&nbsp;95"，"VC"&#8230;&#8230;&nbsp;我简直觉得我落后了好几十年一样，整个一土人，根本跟他们答不上话。好不容易找到一个比较熟的同学问了一下："你们天天谈论的瘟95是什么啊？"答："win95就是一个操作系统，跟DOS 是一类。""朵死是什么？"&nbsp;"你连DOS都不知道是什么？别在计算机系混了。"&nbsp;学校上课当然不讲VC编程之类的东西，但是上&nbsp;Pascal&nbsp;的老师有一次就说："嗨，我们学校真是落后。现在别人都用&nbsp;C,&nbsp;C++，甚至&nbsp;VC&nbsp;了，我们还在讲&nbsp;Pascal。不知道什么时候才能有VC课啊。你们出去也是要用VC的，只好自学了。"&nbsp;于是，有些同学很多时候上课都捧着一本很重的"Windows&nbsp;编程大全"之类的书，根本没有听课。吃饭时就念念有词的跟我说，"代码的优化是无止境的"，"匈牙利命名法真是伟大的发明"&nbsp;&#8230;&#8230;&nbsp;这就是中国很多大学计算机系的情况。&nbsp;<br />
感觉到无知了？这不是偶然的，而是微软长久以来埋下的伏笔。它要让无知的大家都把它奉为神圣，它要让支持UNIX，Xwindow的人一旦说&nbsp;UNIX&nbsp;好，Xwindow&nbsp;好的时候，都被一群人围着说教："这个&nbsp;Windows&nbsp;也能做到"，"你对&nbsp;Windows&nbsp;有偏见"，"微软才是主流啊"，"你敢瞧不起&nbsp;win2k？"， ".NET&nbsp;就是世界潮流"，"微软的毕竟是新技术"，"有钱就是有技术"&#8230;&#8230;&nbsp;甚至在一番论战比较后败下来还是要说："Windows&nbsp;性能差点，但是易用性强"，"Windows&nbsp;是老百姓用的，要求别那么?quot;，"微软那么有钱，以后想超过&nbsp;UNIX&nbsp;还不容易吗？"&#8230;&#8230;&nbsp;<br />
发达国家的计算机教育&nbsp;<br />
我前段时间在&nbsp;USENET&nbsp;发文问有关&nbsp;Scheme&nbsp;语言的问题时，认识了一位丹麦人。他解决了我所有的问题，并且建议我阅读一些很"深奥"的有关程序语言语法，文法的书，他告诉我很多网站可以学习&nbsp;LISP，Scheme，人工智能，算法。他叫我看&nbsp;Jonathan&nbsp;Rees&nbsp;的论文 &nbsp;"Syntactic&nbsp;Closures"。他还打包给我寄过来一份&nbsp;MIT&nbsp;的&nbsp;"How&nbsp;to&nbsp;Design&nbsp;Programs"。他说他在自己的 &nbsp;PC&nbsp;机上装的是&nbsp;Linux，他用&nbsp;Emacs&nbsp;编辑，运行Scheme&nbsp;程序。他对&nbsp;Emacs&nbsp;的了解和爱好真是使人惊讶。他大学本科毕业时做的毕业设计是一个&nbsp;Scheme&nbsp;解释器。这对于我来说是望尘末及了。&nbsp;<br />
他是那么的不厌其烦，我的每一个问题他都详细的回答。我有时都觉得过于详细了，怎么这么耐心啊？我觉得他似乎是我的高中老师。他是什么样的人呢？我好奇的打听了他的情况。原来，他是丹麦一所普通高中的计算机老师。&nbsp;<br />
他说他在高中里讲授程序设计和算法，计算机语言文法。他说用&nbsp;Scheme，他的学生不用再为内存泄漏等程序语言本身的问题而烦恼，而专注于问题和算法本身。有利于培养学生解决问题的能力，特别是用计算机解决数学问题的能力。&nbsp;<br />
天哪！为什么欧洲出现那么多数学家，几何学家？你看看别人重视的是什么！我们的计算机教育如果继续这样下去，只会沿着弯路越走越远！&nbsp;<br />
微软和它的朋友们的如意算盘&nbsp;<br />
下面来看看微软的收入是怎么来的。首先，Windows&nbsp;98系列操作系统，一个就是&nbsp;100多美元，每次升级又是几乎同样的价钱。Windows&nbsp;NT&nbsp;还要贵几倍，而且有用户数目限制，5个用户的，10个用户的&#8230;&#8230;&nbsp;以后如果要增加用户数目还要按比例付钱。&nbsp;<br />
花了如此多钱买来的操作系统就能用了吗？它竟然连压缩程序都没有提供！你装上Windows&nbsp;之后一般第一件事就是去下载一个&nbsp;WinZip&nbsp;吧，"只要 &nbsp;29&nbsp;美元"。Windows会中病毒啊，马上花&nbsp;70&nbsp;美元买一个&nbsp;Norton&nbsp;AntiVirus&nbsp;吧。还有黑客呢？再买一个 Norton&nbsp;Internet&nbsp;Security&nbsp;好了，100&nbsp;美元。系统需要优化，磁盘需要整理，买一个Norton&nbsp;System&nbsp;Works&nbsp; 是你最佳的解决方案，100美元。&nbsp;<br />
可是你现在还是不能干正事啊！你想要一个&nbsp;Word,&nbsp;PowerPoint？那就买一套&nbsp;Office&nbsp;XP&nbsp;吧，一起买便宜些，$459.90。&nbsp;<br />
那些程序不会用啊！那些菜单怎么设置，到底有什么功能啊？看"帮助"也学不会。买本书看看吧，我推荐 "Special&nbsp;Edition&nbsp;Using&nbsp;Microsoft&nbsp;Office&nbsp;XP"，不贵，$27.99。这本书里面大部分是屏幕抓图，还是买一本旧的比较划算，$17.85。&nbsp;<br />
你如果只是当个秘书，上面的差不多还凑合了。可是你有更高的追求，你想成为&nbsp;Windows程序员。首先买一个&nbsp;Visual&nbsp;Studio.NET&nbsp;吧，要不然怎么编译程序。$494.95。&nbsp;<br />
为了紧跟微软动向，世界潮流，不能不注册个&nbsp;MSDN&nbsp;什么的吧？这个贵一点，不过物有所值啊，$2,799。&nbsp;<br />
嗯，你现在已经是上层阶级，白领人士了。你现在可以像这样"自由"的，"安全"的生活了。&nbsp;<br />
为什么要反对使用&nbsp;Windows&nbsp;<br />
很多人都说不应该完全否定&nbsp;Window，Windows&nbsp;也有它的长处。不应该骂微软。&nbsp;<br />
对。 Windows&nbsp;容易操作，适合普通用户。如果微软把它自己定位在&nbsp;P&amp;G，Philips&nbsp;那样的地位，能够给我们的百姓提供周到的，完善的，价廉物美的服务。那我肯定是很喜欢它的。但是从上面的种种情况说明，微软是一个野心极大的国际垄断组织！它的产品没有一个是不出问题的：Windows&nbsp; 不稳定，容易中病毒，而微软不为大家免费提供杀毒软件。我就是要让你们花钱买我的朋友&nbsp;Symantec&nbsp;的杀毒软件，谁叫你们已经上了我的贼船？这叫什么售后服务啊！&nbsp;<br />
你买来微软的程序，安装的时候一般都有一个协议，说："由于微软的程序造成你的数据损坏或丢失，微软概不负责。"&nbsp;我想很多人肯定觉得这个不合理，不想按那个&nbsp;"I&nbsp;accept"。但是你的软件买都买来了，钱都花了，现在一按&nbsp;"I&nbsp;decline"，安装程序马上就会退出。你只好被迫点击了&nbsp;"I&nbsp;accept"！这不是不平等条约吗？&nbsp;<br />
我已经目睹了好几个朋友的文档被&nbsp;Microsoft&nbsp;Word&nbsp;损坏，有的是编辑了十多天的30多页的论文，有的是费了很大工夫做出来的个人简历，那个朋友为此失去了到自己向往的P&amp;G&nbsp;工作的机会。就在他要投简历的前一个晚上，就在那一瞬间&#8230;&#8230;&nbsp;不知道他痛哭的时候有没有想起要投诉微软，可是谁叫我们用的都是盗版呢，况且你还点击了&nbsp;"I&nbsp;accept"。&nbsp;<br />
微软仗势已经占有大部分PC市场，制定不符合国际标准的"微软的标准"，以不合理的方式压制其它公司的软件，这个问题已经在美国司法部闹了很久了。他甚至在 &nbsp;Windows系列操作系统中放置能够通过网络泄漏用户信息的代码，以至于&nbsp;Windows&nbsp;刚进入澳大利亚时被澳大利亚政府禁止使用。&nbsp;<br />
有些人说："微软毕竟开创了一个历史，造就了今天的&nbsp;IT&nbsp;行业。"&nbsp;但是，如果没有微软，我们今天早就用上非常稳定，非常可靠，非常方便，非常"傻瓜"的软件了！微软是阻挡信息技术发展的罪魁祸首。&nbsp;<br />
微软的程序的工作方式(注意，我只是说操作方式，病毒的事情另外算)确实适合于一般家庭，上上网，发发邮件，打打游戏都不错。可是微软却要把自己包装成什么 "高科技"企业，要在世界各地设置"研究院"，在大学计算机系赠送不适合用于科研的&nbsp;Windows产品，甚至出钱请图灵奖得主来中国畅谈"二十一世纪的计算"，还在大会上宣传自己的&nbsp;.NET&nbsp;技术。非要把别人认为自己是科学的，自己是领导世界高科技的。但是呢？它什么高科技也没有。欧洲，美国，哪一个关键部门在用微软的东西？NASA?&nbsp;DOE?&nbsp;CERN?你仔细想一想，微软的程序对人类到底有什么重大作用？&nbsp;<br />
什么是&nbsp;Windows&nbsp;能干而&nbsp;Linux&nbsp;干不了的事情？---&nbsp;<br />
"Windows&nbsp;能干而&nbsp;Linux&nbsp;干不了的事情，那就是不需要干的事情。"&nbsp;<br />
有个朋友看我半年没有用&nbsp;Windows，有时就会问我："你只用&nbsp;Linux，有没有发现有些Windows&nbsp;能处理的事情&nbsp;Linux&nbsp;干不了？"---&nbsp;<br />
我回答说："Windows&nbsp;能干而&nbsp;Linux&nbsp;干不了的事情，那就是不需要干的事情。"&nbsp;<br />
Windows&nbsp;能做的有益的事情&nbsp;Linux&nbsp;都能做---&nbsp;<br />
Windows&nbsp; 下的某些功能确实是我们需要的，那么&nbsp;Linux&nbsp;的开发者们和用户也需要这种功能，他们就会去实现这种功能，而且比&nbsp;Windows&nbsp;的方式好得多。由于大多数科学家，工程师用的都是&nbsp;Linux&nbsp;或者某种商业&nbsp;UNIX,&nbsp;所以几乎所有商业的科学工程程序，比如Matlab, &nbsp;Mathematica,&nbsp;AutoCAD,&nbsp;Candence的，Synopsys的，Avant!&nbsp;的&#8230;&#8230;全都是先有UNIX&nbsp;的版本(包括 Linux)，然后再考虑移植给&nbsp;Windows，甚至根本不移植给Windows，因为&nbsp;Windows&nbsp;的机器一般没有足够的能力运行这样的程序。你不要以为只有&nbsp;Windows&nbsp;才有&nbsp;PSpice,&nbsp;UNIX&nbsp;的&nbsp;HSpice&nbsp;要好得多，而且可以运行在大型主机上。当然它们不是免费的，但是它们值那个价钱。&nbsp;<br />
但是&nbsp;Windows&nbsp;下有些东西在&nbsp;Linux&nbsp;下没有很相似的，或者你找到很多类似的，但是它们每一个比起&nbsp;Windows&nbsp;的那个程序都要差很多，那么原因有两种可能性：&nbsp;<br />
有一个完全类似的程序，但是由于它乍一看不漂亮，被你忽略了。而其它程序虽然看起来很漂亮，但是它们是一些初学编程的人写的。现在由于&nbsp;Gtk,&nbsp;Qt&nbsp;的诞生，Linux&nbsp;下开发图形界面程序极其简单，很多初中生甚至小学生都可以随手编出一些漂亮不中用的程序。如果你整天寻找这样的程序挑来挑去，永远也找不到你满意的。当然也有一流的程序用&nbsp;Gtk&nbsp;和&nbsp;Qt，比如&nbsp;GVIM&nbsp;就可以用&nbsp;Gtk&nbsp;作为图形界面，我还知道&nbsp;Synopsys&nbsp;一些程序用了 &nbsp;Qt。&nbsp;<br />
我曾经也犯过这样的错误，从外表区分一切。结果优秀的&nbsp;FVWM,&nbsp;lftp,&nbsp;Mutt,&nbsp;wget&nbsp;都被我忽略过。当我找回它们的时候，我是那么的羞愧不已，它们现在都是我的朋友&nbsp;我第一次看到&nbsp;FVWM&nbsp;觉得它只不过是一个有很厚很难看边框的东西。可是现在，我的同学看到 &nbsp;FVWM&nbsp;都说："哇！真漂亮。"&nbsp;<br />
有另一种完全不同的方式可以达到相同的目的，甚至更好。&nbsp;<br />
很多人很关心&nbsp;Open&nbsp;Office, &nbsp;Star&nbsp;Office,&nbsp;AbiWord,&nbsp;...&nbsp;他们多么盼望有一天某一个Linux&nbsp;程序能够完全兼容的打开一个复杂的&nbsp;doc&nbsp;文档。但是你永远也不可能有那一天。为什么呢？因为微软为了占有市场，必定不会让其它系统的程序能够完全兼容它的文档格式。它一定会不断变化&nbsp;doc&nbsp;文档的内部结构，隐藏一些秘密，让其它公司的程序打开&nbsp;doc&nbsp;文档时总是有某种问题，从而你必需购买&nbsp;Microsoft&nbsp;Office&nbsp;和&nbsp;Windows。&nbsp;<br />
你应该想一下，那么多的高智商的大学教授，科学家，学生，他们用的都是&nbsp;Linux&nbsp;或者其它类型的&nbsp;UNIX，他们没有&nbsp;Word&nbsp;可用，怎么处理文档呢？这么多年没有一个像Open&nbsp;Office&nbsp;的程序出现，难道大家没有办法写文档吗？&nbsp;<br />
显然不是这样。你看看那些高水平的学术杂志，论文，那些大学教授的网页，那些漂亮的幻灯片，它们是什么做的？原来&nbsp;UNIX&nbsp;用户早就有非常方便的 &nbsp;troff,&nbsp;LaTeX,&nbsp;SGML等东西可以处理文档，而且它们比起&nbsp;Word&nbsp;都要高明的多。Word&nbsp;显然被这些大拿忽略了，以至于很久以来没有人想在&nbsp;Linux&nbsp;下开发一个类似&nbsp;Word&nbsp;的程序，除非某些公司想抢微软的饭碗。&nbsp;<br />
很多人留着&nbsp;Windows&nbsp;在硬盘上的原因无非是为了用&nbsp;Word&nbsp;和&nbsp;PowerPoint。我见过一个教授，他的&nbsp;Windows&nbsp;笔记本电脑上除了&nbsp;PowerPoint&nbsp;什么都没有。有一天演示的时候，他指着堆乱字符说："对不起，这是一个公式&#8230;&#8230;怎么每次都是这样&#8230;&#8230;"&nbsp;其实有比PowerPoint&nbsp;好几百倍的东西可以制造幻灯片，你可以用最简单的方法制造世界一流效果的论文和幻灯片。你待会儿可以看看我的TeX网页，你就会知道为什么我可以完全离开&nbsp;Windows。&nbsp;<br />
Windows&nbsp;能做的那些没用的事情&nbsp;Linux&nbsp;永远做不好&nbsp;<br />
电脑游戏&nbsp;<br />
有些人说&nbsp;Linux&nbsp;下不能玩&nbsp;Windows&nbsp;下所能得到的所有游戏。的确，Linux&nbsp;下虽然也有少量的游戏，比如&nbsp;Quake。但是它没有&nbsp;Counter&nbsp;Strike,&nbsp;没有&nbsp;Star&nbsp;Craft,&nbsp;&#8230;&#8230;&nbsp;<br />
并不是说电脑游戏不该玩，但是应该适可而止。电脑是用来处理事务，帮助你学习，解决问题的工具，而不是一个玩具！整天沉迷于电脑游戏中，而不出去感觉外面的世界，你会变得越来越冷酷，越来越缺乏人情味。你与真实的世界越来越远。&nbsp;<br />
你可以在&nbsp;CS&nbsp;里杀人，你可以在&nbsp;Tomb&nbsp;Raider&nbsp;里探险，你甚至可以在&nbsp;Tony&nbsp;Hawk's&nbsp;Pro&nbsp;Skaters&nbsp;里滑板&#8230;&#8230;&nbsp;但是 &nbsp;It's&nbsp;not&nbsp;real！你虽然有很高的"反恐技巧"，但是遇到歹徒的时候，你是那么的怯懦；你虽然控制&nbsp;Laura&nbsp;伸手敏捷，但是你打篮球的时候怎么总是被人断球？你虽然可以轻易的在&nbsp;THPS&nbsp;里作出一个&nbsp;"360&nbsp;kickflip&nbsp;to&nbsp;hangten&nbsp;grind&nbsp;to&nbsp;fakie"，但是你踩在自己的滑板上的时候还不会&nbsp;ollie！&nbsp;<br />
说回来，如果你偶尔玩一下电脑游戏未尝不可。但是世界上有远比&nbsp;Windows&nbsp;+&nbsp;PC&nbsp; 更好的游戏方式。Sony&nbsp;的&nbsp;PlayStation2,&nbsp;SEGA&nbsp;的&nbsp;DreamCast,&nbsp;Nintendo&nbsp;的&nbsp;N64，Namco的街机&#8230;&#8230; 每一个都比&nbsp;Windows&nbsp;游戏精彩，每一个都有如此高的3D性能，以至于Pentium4,&nbsp;Itanium&nbsp;+&nbsp;GForce4&nbsp;都无法与它们比美！&nbsp;<br />
Linux&nbsp;的用户们都是关心解决世界的关键问题的份子，他们哪里有时间用自己的机器来玩游戏啊？他们每天用Linux高效的做完自己的工作就到阳光下享受自然去了。要玩游戏也是玩一些类似推箱子，贪吃蛇之类的智力小游戏。所以，你知道为什么&nbsp;Linux&nbsp;几乎没有游戏了吧？"整理硬盘，优化系统"&nbsp;这是一个非常有意思的话题，仅次于有关"病毒"的话题。相信很多&nbsp;Windows&nbsp;用户都有整理硬盘的经历。在很多&nbsp;Windows&nbsp;用户眼里，"硬盘用久了，会出现碎片，速度会减慢，需要一个程序来整理，整理硬盘的时候不要做其它工作"，这好像是天经地义的事情。&nbsp;<br />
我也曾经津津有味的看着&nbsp;Norton&nbsp;Defrag&nbsp;一点一点的把我的硬盘排序，调整，用图形的方式显示出来，然后报告?quot;100%&nbsp;没有碎片。你的硬盘现在已经达到最佳状态。"&nbsp;我现在才发觉我那时是多么的幼稚。&nbsp;<br />
Linux&nbsp; 和&nbsp;UNIX&nbsp;用户似乎从来没有"整理硬盘"这种说法呢？你觉得很奇怪吗？如果你觉得很奇怪，那说明你的思想在某种程度上被微软的垃圾程序禁锢了。你需要明白，UNIX&nbsp;的大型主机很多必须是一天24小时，一年365又1/4天不停运转的，要是每个星期都要整理一次硬盘，在整理的时候几乎不能干任何事情，那是绝对行不通的！&nbsp;<br />
Linux&nbsp;机器根本不用整理硬盘，这就是为什么没有看到过&nbsp;Linux&nbsp;用户整理硬盘。Linux&nbsp;的文件系统是比 &nbsp;Windows&nbsp;的&nbsp;FAT,&nbsp;FAT32,&nbsp;NTFS&nbsp;高明得多的文件系统，它们不但可以对文件设置权限，实施完全的保护，而且可以"越用越整齐"， "越用碎片越少"！你应该把文件大部分放在&nbsp;Linux&nbsp;的分区，而不是&nbsp;Windows&nbsp;分区，因为它比&nbsp;Windows分区可靠得多。&nbsp;<br />
还有更滑稽的事情就是有很多"Norton&nbsp;System&nbsp;Doctor"，"Windows&nbsp;优化大师"，"超级兔仔注册表魔法"&nbsp;之类的程序存在，而且价格昂贵。似乎一个操作系统本来应该有很多问题，需要别的厂商做程序来"优化"它，而且为了得到优化，你需要付钱！这些问题&nbsp;Linux&nbsp;根本就没有，所以不需要什么优化。Linux&nbsp;内核本身就是高度优化的。&nbsp;<br />
IDE&nbsp;<br />
有些人在抱怨为什么&nbsp;Linux&nbsp;没有一个良好的&nbsp;IDE&nbsp;开发环境。 Linux&nbsp;现在已经有一些IDE&nbsp;了，但是总是有很多问题。你是不是正在寻找，正在期望&nbsp;Linux&nbsp;某一天可以有一个VC那样的开发环境？你有没有发现你正在进入微软给你设下的怪圈？你为什么一定要用&nbsp;IDE？你说："IDE&nbsp;开发迅速，调试方便，适合大型程序&#8230;&#8230;"&nbsp;那说明微软的程序在你脑子里已经比较根深蒂固，你需要好好清醒一下了，看看我来告诉你。&nbsp;<br />
高明的&nbsp;UNIX&nbsp;程序员不用&nbsp;IDE，IDE&nbsp;从来就是给初级&nbsp;Windows&nbsp;程序员用的。&nbsp;<br />
你看看大型的&nbsp;UNIX&nbsp;程序，包括&nbsp;Linux&nbsp;内核，各种网络服务程序，Xwindow&nbsp;程序在内，哪一个是&nbsp;IDE&nbsp;搞出来的？我们实验室的 &nbsp;EDA&nbsp;程序也没有一个是&nbsp;IDE&nbsp;弄的，我还知道Candence,&nbsp;Synopsys，Mentor&nbsp;的高性能的图形界面&nbsp;EDA&nbsp;程序也都不是 &nbsp;IDE&nbsp;写的。你信不信，微软的人在写&nbsp;Windows&nbsp;本身的时候也根本不用&nbsp;IDE。微软内部程序员最喜欢的编辑器其实是&nbsp;VIM，用&nbsp;VIM&nbsp;的微软程序员上次向乌干达的可怜儿童捐助了1000多美元，这是值得称赞的。&nbsp;<br />
有一次某杂志采访一些出名的&nbsp;Linux&nbsp;内核程序员，包括 &nbsp;Linus&nbsp;在内，没有一个人用IDE，有的人用&nbsp;VIM，有的用&nbsp;Emacs，只有&nbsp;Linus&nbsp;说"GNU&nbsp;Emacs&nbsp;is&nbsp;evil"，但是其实他用的是一种跟&nbsp;Emacs&nbsp;有同样键绑定功能的&nbsp;MicroEmacs。大家都是用编辑器编辑了程序文件，然后用&nbsp;make&nbsp;这样的自动工具调用 &nbsp;gcc&nbsp;编译器完成编译工作的。甚至高级的&nbsp;Windows&nbsp;程序员也不用&nbsp;IDE，他们可以从命令行调用&nbsp;cl，nmake&nbsp;来编译自己的程序。虽然这样的&nbsp;Windows&nbsp;程序员很少，但是他们却是最了解&nbsp;Windows，最高明的Windows&nbsp;程序员。&nbsp;<br />
为什么&nbsp;UNIX&nbsp;程序员不用 &nbsp;IDE？明白了这个道理你就能体会到&nbsp;UNIX&nbsp;的设计思想了。首先，一个&nbsp;IDE&nbsp;集成了编辑器，编译器，汇编器，调试器，跟踪器&#8230;&#8230;&nbsp;这个编辑器功能肯定比不上&nbsp;VIM&nbsp;或&nbsp;Emacs，编译器比不上&nbsp;GCC，汇编器比不上&nbsp;as，调试器比不上&nbsp;gdb，ddd,&nbsp;跟踪器比不上&nbsp;strace, &nbsp;ltrace,&nbsp;truss。你得到的是一套整合的低能的程序。如果你对调试器的功能不满意，你只好换用另外一套&nbsp;IDE，但是这套&nbsp;IDE&nbsp;的热键，菜单，编辑器功能，按钮&#8230;&#8230;&nbsp;跟原来那个有很大不同。你不得不花很多时间来熟悉新的环境，而不能保持原来的某些东西。&nbsp;<br />
而在&nbsp;UNIX&nbsp;下就不一样了。你可以用你最喜欢的&nbsp;VIM&nbsp;编辑程序，你在&nbsp;VIM&nbsp;里可以调用GNU&nbsp;make，make&nbsp;可以调用&nbsp;gcc,&nbsp;ld,&nbsp;...&nbsp;make&nbsp;的出错信息可以被&nbsp;VIM&nbsp;捕获，VIM&nbsp;能帮你在源程序里定位。你如果喜欢&nbsp;icc,&nbsp;你可以让&nbsp;make&nbsp;用&nbsp;icc&nbsp;而不是&nbsp;gcc。你如果觉得 &nbsp;gdb&nbsp;跟踪变量时比较麻烦，你可以用&nbsp;ddd&nbsp;来显示各种数据结构之间的关系。你还可以在&nbsp;Emacs&nbsp;里调用&nbsp;gdb，那样就可以同步显示源代码了。而且&nbsp;VIM&nbsp;和&nbsp;Emacs&nbsp;还可以编辑很多其它东西，比如信件，LaTeX&nbsp;文档，HTML，配置文件&#8230;&#8230;&nbsp;你不用另外找一个什么编辑器来干这些杂活了。很多程序比如&nbsp;Mutt,&nbsp;tin&nbsp;都可以在内部使用&nbsp;VIM，这样就更方便了。实际上&nbsp;make&nbsp;在其它方面还能帮你很多忙，我的每一个比较大型的&nbsp;LaTeX文档都是用&nbsp;make&nbsp;维护的。&nbsp;<br />
Linux&nbsp;能干的高精尖的事情&nbsp;Windows&nbsp;都干不了&nbsp;<br />
当然有很多事情是 Linux/UNIX的专利了。因为&nbsp;Windows&nbsp;只能装在&nbsp;PC&nbsp;机上，好像以前也有&nbsp;Alpha&nbsp;可以使用&nbsp;Windows&nbsp;NT，但是就是没见到有人用。PC&nbsp;机的能力是很低的，像我们编程序处理&nbsp;NP-Hard&nbsp;问题的人，用&nbsp;Windows&nbsp;的机器显然速度不够，而且有时一个问题算上几天甚至几个星期，Windows&nbsp;机器是以"死机"著称的，我们怎么能放心？所以几乎所有科学计算程序，EDA&nbsp;程序，高性能图像处理程序都不是 &nbsp;Windows&nbsp;的。他们有时也会移植一些给&nbsp;Windows，但是常常降低那些程序的能力。你比较过&nbsp;Windows&nbsp;版本的 &nbsp;Mathematica&nbsp;和&nbsp;Linux&nbsp;的有什么区别吗？&nbsp;<br />
IBM&nbsp;制造的最大的并行计算机有&nbsp;8000&nbsp;多个处理器，Windows&nbsp;不可能有能力管理这么多处理器，它用的是什么操作系统？答案是&nbsp;Linux。&nbsp;<br />
《泰坦尼克号》电影里的三维动画，那么细腻逼真，Windows机器能做出来吗？不行。那也是&nbsp;Linux&nbsp;机器做的。&nbsp;<br />
民航总局用来训练地情人员的虚拟现实训练设备，Windows&nbsp;当然无能为力。那都是商业的&nbsp;IRIX&nbsp;机器。&nbsp;<br />
UNIX&nbsp; 是最早支持&nbsp;TCP/IP&nbsp;网络协议的系统。它上面有很多可以互相协作的网络服务程序，它们经过多年的使用和修订，已经达到比较完善的程度。而就在 1997年，微软的比尔盖茨还在扬言："Internet&nbsp;是没有前途的。"&nbsp;微软的这个"远见卓识"大家应该都已见识，它后来加上的网络服务程序IIS 漏洞之多，让公安部都频频发出警报，大家也是见识了的。&nbsp;<br />
其实你知道了，Windows&nbsp;没有一样有用的事情能比&nbsp;UNIX&nbsp;干的更好。&nbsp;<br />
Linux&nbsp;干不了的有用的事情&nbsp;Windows&nbsp;照样干不了<br />
当然&nbsp;Linux&nbsp;不是万能的。它也有不能干的事情，电脑也有干不了的事情。但是&nbsp;Linux干不了的事情，Windows&nbsp;肯定也干不了。这些事情就是我们需要探索，需要努力的事情了。在你探索的过程中，Linux&nbsp;必定是你的好伙伴。&nbsp;<br />
不要把Linux和Xwindow掩盖起来！不要把我们的用户当成傻瓜。&nbsp;<br />
什么？你早就知道&nbsp;Windows&nbsp;是垃圾？噢！你怎么不早说呢！害我废话这么多。嘿嘿。&nbsp;<br />
"好了。你知道&nbsp;Windows&nbsp;是垃圾，你现在用什么?quot;&nbsp;<br />
"Linux&nbsp;+&nbsp;Xwindow"&nbsp;<br />
"那我问你，Xwindow&nbsp;是什么样的？"&nbsp;<br />
"不就是跟&nbsp;Windows&nbsp;差不多吗？只不过&nbsp;'Start'&nbsp;按钮比较方，而且上面不是一个Windows&nbsp;标志，而是一个脚丫子。点击一下居然还有很漂亮的中文菜单。我喜欢！"&nbsp;<br />
"你知道什么是'根窗口'吗？"&nbsp;<br />
"不知道。从来没听说过呢？"&nbsp;<br />
"根窗口就是遮盖整个屏幕的那个最大的窗口。"&nbsp;<br />
"哪儿有什么窗口啊！我没有看到呢？"&nbsp;<br />
你发现了问题吗？这些&nbsp;Linux&nbsp;用户说是在用&nbsp;Linux&nbsp;和&nbsp;Xwindow，但是他们对&nbsp;Linux和&nbsp;Xwindow&nbsp;几乎完全不了解。很多人用了那么久&nbsp;Xwindow&nbsp;都不知道根窗口是什么东西，不知道其实按钮也是窗口，不知道窗口管理器和其它程序有什么关系，大家都以为窗口上面的按钮是程序自己放上去的，不知道窗口?quot;class&nbsp;name"，"resource&nbsp;name"是什么东西。他们也不知道&nbsp;.Xdefaults&nbsp;是用来干什么的。特别是他们很多人都不知道&nbsp;Xwindow&nbsp;的字体是如何命名的，什么是&nbsp;fontset，有了一个新的字体也不知道怎么安装。&nbsp;<br />
他们被遮在&nbsp;Linux&nbsp;之上的一层一层的包装迷惑了，他们等待有图形界面的工具来帮助完成一切事情，他们认为&nbsp;Linux&nbsp;跟&nbsp;Windows&nbsp;一样，只是麻烦一点。他们知道&nbsp;Linux内核很好，但是他们感觉不到&nbsp;Linux&nbsp;和&nbsp;Xwindow&nbsp;在操作层面的天生的先进性，随后不久就把&nbsp;Linux&nbsp;完全删除掉了。你发现没有，要用户理解&nbsp;UNIX&nbsp;和&nbsp;Xwindow&nbsp;的操作层面的先进性，才是留住用户的最好办法。如果用户体会不到操作时的方便和高效，内核再好他们也不会理会。&nbsp;<br />
但是用摹仿&nbsp;Windows&nbsp;的作法来吸引用户，永远会失败的。因为&nbsp;Linux&nbsp;如果摹仿Windows那一套低效率的方式，那么&nbsp;Linux&nbsp;的这套"低效率方式"永远比不上Windows&nbsp;的那一套"低效率方式"。那么用户就会说："这个&nbsp;Linux，没有一样比的上&nbsp;Windows。"&nbsp;<br />
Linux&nbsp;天生就是继承了&nbsp;UNIX&nbsp;的高效的工作方式，为什么我们要把它掩盖起来？我们为什么只告诉用户 &nbsp;KDE&nbsp;的菜单怎么用？我们为什么不能像早期的&nbsp;Xwindow&nbsp;书籍那样第一节就告诉用户什么是&nbsp;X&nbsp;server,&nbsp;什么是&nbsp;X&nbsp;client，什么是&nbsp;Window&nbsp;Manager,&nbsp;什么是根窗口。第二章就告诉用户窗口有哪些属性，什么是&nbsp;classname,&nbsp;resource&nbsp;name, &nbsp;hint，怎样使用&nbsp;.Xdefaults,&nbsp;xrdb&nbsp;&#8230;&#8230;&nbsp;<br />
在这里我又不得不说一下那些&nbsp;Linux&nbsp;的发行公司和写书的人，他们把 &nbsp;Linux&nbsp;和Xwindow&nbsp;包装起来，却没有从基本上告诉用户&nbsp;Xwindow&nbsp;的工作原理。很多书籍讲授的层次就是在Gnome,&nbsp;KDE&nbsp;的菜单操作的层次，靠大量抓图来占篇幅，"繁荣"Linux&nbsp;书籍市场。&nbsp;<br />
现在很多人已经把能够利用别人的库写出一个好看的程序作为自己编程水平的象征。在这?quot;图形化"，"可视化"&nbsp;的年代，你如果还在用&nbsp;troff,&nbsp;LaTeX&nbsp;写文档，你还在用VIM&nbsp;自己编辑&nbsp;HTML，用 &nbsp;Mutt&nbsp;处理邮件，你还在用文本模式的&nbsp;gdb&nbsp;调试程序，你还在用Xlib&nbsp;写程序,&nbsp;你还在用&nbsp;tin&nbsp;上&nbsp;USENET，你还在自己写 &nbsp;Makefile，写机器代码，你还在玩&nbsp;Clossal&nbsp;Cave&nbsp;这样的字符模式冒险游戏，那你就是老古董。&nbsp;<br />
其实这种思想是错误的。虽然你是一个坚决的&nbsp;Linux&nbsp;支持者，但是你的思想是&nbsp;Windows的思想。你认为图形界面，菜单，按钮就可以解决一切问题，就可以给你高效方便。你还是没能摆脱微软给你的潜移默化的东西。你其实离不开&nbsp;Windows&nbsp;那样的环境，你迟早会删掉自己的&nbsp;Linux。&nbsp;<br />
GUI&nbsp;vs.&nbsp;CLI&nbsp;<br />
做一个坚定不移的"两面派"&nbsp;<br />
大家看到这个标题是不是热血沸腾？两派大虾都可以围攻我了：&nbsp;<br />
GUI派用户："哇！我一看你这小子就是&nbsp;CLI&nbsp;的。要不然自己写什么&nbsp;Makefile？用什么Mutt？"&nbsp;<br />
CLI派用户："切～&nbsp;你还用&nbsp;X！高手都不用&nbsp;X。你是&nbsp;GUI&nbsp;那边的。"&nbsp;<br />
可怜的我："555～～&nbsp;你们都不要我～～&nbsp;GUI&nbsp;和&nbsp;CLI&nbsp;就那么水火不容吗？"&nbsp;<br />
计算机界这样的门派之分还很多。很有特点的就是&nbsp;CLI&nbsp;和&nbsp;GUI&nbsp;了。CLI&nbsp;(Command&nbsp;LIne)的狂热份子声称永远不用&nbsp;X。我上次在实验室看到一个同学用一个&nbsp;SecureCRT&nbsp;登录到Sun&nbsp;机器，然后用一个&nbsp;vanilla&nbsp;vi&nbsp;编辑程序，我建议他启动一个&nbsp;GVIM&nbsp;过来显示在 Exceed&nbsp;上可以有语法加亮。但是他坚决反对，说："高手不用X。你想想，要是我在一个很慢的网络连接怎么用&nbsp;X？而且好多服务器没有装&nbsp;X&nbsp;程序。 "&nbsp;<br />
但是我们实验室的网速可够快，Windows&nbsp;机器都有&nbsp;Exceed&nbsp;啊，而且&nbsp;Sun&nbsp;机器有全套X&nbsp;客户程序包括&nbsp;GVIM。他说他是 &nbsp;CLI&nbsp;的坚决拥护者，但是他却在用&nbsp;Windows，他后来打开了好几个&nbsp;SecureCRT，每次从文本框输入地址，用户名和密码，从下拉菜单选择 "SSH2"，然后点击"Connnect"。他还不断的夸SecureCRT是"网络管理员投票选出的最受欢迎的登录方式"。老天， SecureCRT&nbsp;本身就是个&nbsp;GUI&nbsp;啊，他其实没有明白Xwindow&nbsp;的好处。&nbsp;<br />
你说我是&nbsp;GUI&nbsp;的？我虽然很少在&nbsp;console&nbsp; 下工作。但是我对&nbsp;bash,&nbsp;VIM&nbsp;很熟悉，我可以让&nbsp;bash&nbsp;按照我的键绑定方式来工作。我可以在&nbsp;rxvt&nbsp;里使用&nbsp;Mutt&nbsp;来收发 &nbsp;email。我的每个桌面上都常常堆放着一打不同大小的&nbsp;rxvt。我用&nbsp;VIM&nbsp;编辑&nbsp;LaTeX。我自己写Makefile&nbsp;来维护&nbsp;LaTeX&nbsp; 文档。我有时用&nbsp;mpg321&nbsp;来放&nbsp;mp3。我上BBS用的我自己写的expect&nbsp;脚本。&nbsp;好了，CLI&nbsp;派的朋友可以收我做盟友了&nbsp;<br />
你说我是&nbsp;CLI&nbsp;的老古董？我的&nbsp;FVWM&nbsp;被我配置为可以"手写操作"，我只要画一个"r"就可以启动&nbsp;rxvt，我只要画一个&nbsp;"U"&nbsp;就可以启动 &nbsp;GVIM，&#8230;&#8230;&nbsp;我用&nbsp;GVIM&nbsp;语法加亮模式编辑程序，我用&nbsp;Mozilla&nbsp;浏览网页，&#8230;&#8230;&nbsp;GUI&nbsp;派的现在好像认我做朋友了&nbsp;<br />
好了。CLI&nbsp;派的朋友，虽然我很喜欢命令行，但是我有时在屏幕上左右画一下就可以执行:&nbsp;<br />
Module&nbsp;FvwmConsole&nbsp;-terminal&nbsp;rxvt&nbsp;-geometry&nbsp;45x5-0+0&nbsp;-bg&nbsp;gold&nbsp;-fg&nbsp;midnightblue&nbsp;-fn&nbsp;"-adobe-courier-medium-r-*-*-14-*-*-*-*-*-*-*"&nbsp;<br />
你是不是现在又想把我逐出师门？&nbsp;<br />
GUI&nbsp;派的朋友，虽然我很喜欢窗口。但是我可以在&nbsp;FvwmConsole&nbsp;里输入：&nbsp;<br />
All&nbsp;(rxvt)&nbsp;MoveToDesk&nbsp;<br />
把我所有的&nbsp;rxvt&nbsp;移动到我现在工作的桌面。"这家伙，怎么这么快就叛变了！"&nbsp;<br />
其实何必分什么&nbsp;GUI&nbsp;和&nbsp;CLI，UNIX&nbsp;和&nbsp;Xwindow&nbsp;都是工业标准，它们从设计那天开始就有非常灵活的用法，各个程序，不管是&nbsp;GUI&nbsp;还是命令行的都可以互相协作。UNIX&nbsp;和X&nbsp;是一家，何必搞的那么偏激，非此即彼？你从我上面的行为可以看出&nbsp;GUI&nbsp;和&nbsp;CLI的模糊界线吗？我就是坚定不移的"两面派"。&nbsp;<br />
UNIX&nbsp;是简单的--&nbsp;<br />
"我相信简单就是最好，如果太复杂，我是不能理解的。"&nbsp;-Seymour&nbsp;Cray&nbsp;<br />
很多第一次用&nbsp;Linux&nbsp;的人会惊奇的发现，Linux&nbsp;的程序居然不?quot;安装"就可以运行，程序拷贝到随便那个目录都可以用，而不是一定要占用你第一个分区的空间。程序的设置只是一些简简单单的文本文件。你根本不需要什么"注册表修改器"&nbsp;就可以改变系统的设置。这就叫做简单，但是简单就是美。虽然这只是&nbsp;UNIX&nbsp;简单性的一个肤浅的认识，你已经体会到了某些东西。&nbsp;<br />
但是简单并不意味着功能弱，并不意味着落后。相反，简单意味着强大，意味着生命力。&nbsp;<br />
我不会再继续阐述我理解到的"UNIX&nbsp;的简单"，因为这个需要自己去体会。&nbsp;<br />
UNIX&nbsp;是永恒的&nbsp;<br />
有人说："Plan9&nbsp;会取代&nbsp;UNIX，Mach&nbsp;会取代&nbsp;Linux&nbsp;内核。"&nbsp;<br />
但是你如果是一个深入体会了&nbsp;UNIX&nbsp;的人，你就会知道：UNIX&nbsp;的思想是永恒的，不管时过境迁，Plan9&nbsp;是否代替&nbsp;UNIX，UNIX&nbsp;的灵魂都会在&nbsp;Plan9&nbsp;身上现形！&nbsp;<br />
我为同一个设备写过&nbsp;Linux&nbsp;内核和&nbsp;Windows&nbsp;VxD&nbsp;驱动程序。写&nbsp;Linux&nbsp;驱动程序时，我对&nbsp;UNIX&nbsp;设计的完美的一致性，远见性所折服。UNIX&nbsp;用同样界面的&nbsp;read(),&nbsp;write()系统调用就可以对不同的对象：普通文件，设备文件，管道，管道文件，socket，&#8230;&#8230;进行统一的读写操作。我跟本不需要写一个测试用的应用程序就可以对我的设备驱动进行测试，因为&nbsp;cat,&nbsp;cp,&nbsp;dd,&nbsp;它们也使用了同样的&nbsp;read (),&nbsp;write()，设备和普通文件在应用程序眼里没有区别。在那个还没有&nbsp;Smalltalk,&nbsp;没有&nbsp;C++&nbsp;的年代，UNIX&nbsp;的设计者已经使用了所谓的&nbsp;"面向对象方法"。对，C&nbsp;语言也可以实现面向对象。&nbsp;<br />
UNIX&nbsp;的系统调用几十年都没有很大变化，这非但不是顽固，不进步的象征，反而是UNIX&nbsp;的远见卓识的体现！这就跟&nbsp;TeX&nbsp;程序几十年都不变的情况差不多。这些才是真正的永恒的&nbsp;master&nbsp;piece!&nbsp;你应该改变所有软件都必需从&nbsp;0.1,&nbsp;1.0,&nbsp;1.1,&nbsp;1.2,&nbsp;2.0,...,&nbsp;3.0,&nbsp;3.1,&nbsp;95,&nbsp;98,&nbsp;2000,&nbsp;XP,&nbsp;...&nbsp;不断升级的想法。&nbsp;<br />
Windows&nbsp;就不同了，它在最开头只是一个&nbsp;DOS&nbsp;之上的图形包装而已。后来为了兼容以前的糟糕设计，不得不加上很多累赘。我写 &nbsp;VxD&nbsp;驱动程序的时候就深有体会，Windows&nbsp;95&nbsp;程序对设备的操作只有用&nbsp;DeviceIoControl，我不得不写了两个应用程序来对设备驱动进行测试。Windows&nbsp;内核的不一致性和隐密性使我非常恼火。不过&nbsp;Windows&nbsp;WDM驱动程序现在也有了&nbsp;ReadFile, &nbsp;WriteFile，&#8230;&#8230;&nbsp;那说明什么？那说明&nbsp;Windows&nbsp;在向UNIX&nbsp;学习，或者有可能是某个&nbsp;UNIX&nbsp;设计人员在微软打了几天临工，顺手加了几个UNIX&nbsp;的东西进去。这样做是没有用的，Windows&nbsp;从一开始就是非常糟糕的设计，它的历史的包袱太沉重了，缝缝补补有什么用？它只能永远的被&nbsp;UNIX&nbsp;甩在身后！&nbsp;<br />
UNIX&nbsp;是强大的&nbsp;<br />
让聪明人干任何他们想干的事情。&nbsp;<br />
UNIX&nbsp;的一个特点就是非常高的灵活性，Xwindow&nbsp;也具有这种灵活性。这种灵活性体现在哪里呢？&nbsp;<br />
UNIX&nbsp; 的程序一般都有很多参数，不管你现在用的着用不着，总有人需要某些参数。它们的行为很多都可以用配置文件来改变。比如&nbsp;GNU&nbsp;bash,&nbsp;通常缺省的命令行输入方式是&nbsp;Emacs&nbsp;方式，但是只要我编辑一个&nbsp;.inputrc&nbsp;文件，就可以把它变成&nbsp;vi&nbsp;的输入方式，而且我还可以自己绑定键序列到某些操作。我可以用&nbsp;shopt&nbsp;来设置它的很多特点，比如是否进行通配符扩展，是否可以把一个变量当作一个目录来cd，是否可以自动纠正某些明显的目录名打字错误&nbsp;&#8230;&#8230;&nbsp;<br />
UNIX&nbsp;程序设计的思想是提供给用户"机制"，而不限制用户制定"政策"。这是一个重要的尊重用户的作法。&nbsp;<br />
我们再来看看&nbsp;Xwindow。Xwindow&nbsp;是一个出色的设计，它把显示服务器和客户程序分开。一个显示上既可以显示本机上的程序，也可以显示别的机器上的 &nbsp;X&nbsp;程序，而它们都遵守你的窗口管理器的统一指挥，它们之间可以方便的传送剪贴版数据，各种事件&nbsp;&#8230;&#8230;&nbsp;比如有时我的&nbsp;XFree86&nbsp;上会出现四个不同机器上的&nbsp;XTerm，两个不同机器上的&nbsp;GVIM，&#8230;&#8230;&nbsp;它们统一受本机上的&nbsp;FVWM&nbsp;指挥。&nbsp;<br />
Xwindow&nbsp;程序都具有很多很多命令行参数和&nbsp;resource&nbsp;参数。你可以随意的在命令行或者&nbsp;.Xdefaults&nbsp;文件设置所有的颜色，字体，尺寸&#8230;&#8230;&nbsp;而且如果你用&nbsp;xrdb&nbsp;把 &nbsp;.Xdefaults&nbsp;导入到根窗口，那么其它机器上没有经过配置的同样的程序，显示到你的机器上的时候也会遵守同样的外观规定。&nbsp;<br />
Xwindow&nbsp; 的窗口具有&nbsp;Property,&nbsp;也就是一些可以自己定义的共享数据(原子)。正是因为这些&nbsp;Property&nbsp;的存在，使得&nbsp;Xwindow&nbsp;具有无比强大的生命力。X&nbsp;的窗口管理器和其它客户程序之间并没有统一的协议，但是后来出现了&nbsp;ICCCM(客户程序间通信规范)，这个规范就是通过 &nbsp;property&nbsp;定义的。现在又有人定义了一套"扩展的窗口协议(EWM&nbsp;Hints)"，使得Xwindow&nbsp;可以具有某些&nbsp;Windows&nbsp;的特征，比如一个工具条程序可以告诉窗口管理器："这个屏幕下面被我占据了24个像素的空间，你最大化程序的时候不要越过这个界线。"&nbsp;<br />
一个强大的窗口管理程序比如&nbsp;FVWM，它收到这样的提示时，可以答应工具条程序的这个要求，也可以不答应。一切选择的权力在于谁？当然是用户了！&nbsp;<br />
你想想，是不是有些&nbsp;Windows&nbsp;程序常常弹出一个窗口要你选择&nbsp;"Yes&nbsp;or&nbsp;No"？你不点击它它就不下去。你觉不觉得你的程序在侵犯你的尊严？你是一个人，一个智慧的生物，怎能受到一个程序如此的待遇？&nbsp;<br />
还有就是很多&nbsp;Windows&nbsp;程序把人当成傻瓜，而它是"智能程序"。比如，有一个程序就是喜欢把你的每句话第一个字母都变成大写，我不说它是谁了，你遇到的时候就知道了。&nbsp;<br />
如果连"一句话开头一个字母要大写"这么明显的问题都需要程序帮你纠正的话，人脑还用来干什么？况且如果你故意想要不大写的话，那就更麻烦了，我楞是没有从它那一大堆菜单里找到怎么关闭这个愚蠢的选项。&nbsp;<br />
只有符号才能完全操纵计算机。&nbsp;<br />
我们来说说很多初学&nbsp;Linux&nbsp;的用户。虽然他们在用&nbsp;Linux，但是他们打心眼儿里是觉得Windows&nbsp;的工作方式好，他们希望&nbsp;Linux&nbsp;有一天能"像Windows那样"。你说："我的鼠标一点，我菜单一拉，&#8230;&#8230;&nbsp;就可以完成我的操作。"&nbsp;但是我要告诉你："Linux&nbsp;从来没有摹仿 &nbsp;Windows，将来也不会。Linux&nbsp;从诞生之日起，它的工作方式就比&nbsp;Windows&nbsp;的先进。&nbsp;<br />
Linux&nbsp;属于能勇敢面对符号的人。只有符号才能完全操纵计算机。"&nbsp;<br />
看看优秀的&nbsp;UNIX&nbsp;程序，XFree86,&nbsp;FVWM,&nbsp;VIM,&nbsp;Emacs,&nbsp;proftpd,&nbsp;Mutt,&nbsp;wget,&nbsp;tin,&nbsp;...&nbsp;没有一个不是用配置文件来设置选项的。为什么这些程序没有方便的菜单可以用来配置？难道它们的设计者就那么低能，连个图形配置界面也写不出来？&nbsp;<br />
当然不是。因为图形界面配置方式的能力是极其有限的，而配置文件和程序语言的表达能力却是无限的。用图形界面配置这些程序的话，如果你想达到配置文件的效果，你需要成百上千的菜单，checkbox,&nbsp;radio&nbsp;button,&nbsp;...&nbsp;到时候你根本没办法找到你需要修改的地方了！而各个程序的配置文件的语法都有很多相似之处，一般就是一些命令，设置一些变量，参数，&#8230;&#8230;&nbsp;一旦用会了一个，其它的也就容易理解了。如果你用惯了&nbsp;awk,&nbsp;sed, &nbsp;Perl，你会觉得那才是真正的自动化啊。&nbsp;<br />
鼠标虽然是很好的工具，但是它的表达能力是有限的。你不可能光用鼠标就让电脑完全明白你的意思，它毕竟只有3个按钮。看看我的MetaPost页你就能体会到鼠标的这一弱点。所以我们虽然很喜欢鼠标，但是却不能完全依赖它。&nbsp;<br />
各个小程序的完美配合&nbsp;<br />
这就是UNIX最重要的特点了，它就是UNIX设计的思想。让每个程序只具有一项专门的能力，然后让它们合作。Xwindow也继承了这种好传统。这恐怕就是Windows和其它操作系统望尘末及的地方了。UNIX&nbsp;程序设计之统一，配合之完美，真使我难以置信！shell,&nbsp;grep,&nbsp;find, &nbsp;awk,&nbsp;sed,&nbsp;make,&nbsp;Perl,&nbsp;Emacs,&nbsp;vi,&nbsp;tin,&nbsp;Mutt,&nbsp;...&nbsp;它们是那么的具有一致性！你一旦学会了&nbsp;sed&nbsp; 的正则表达式，其它程序基本上都能用了。你一旦学会了vi&nbsp;和&nbsp;VIM,&nbsp;你会发现它的操作是那么的有规律性，似乎vi的设计者在几十年前就已经设计好了 &nbsp;VIM&nbsp;在今天的完美而统一的操作方式！而且vi的操作还体现在&nbsp;Mutt,&nbsp;tin&nbsp;等很多程序中。你甚至可以把&nbsp;bash&nbsp;设置为&nbsp;vi&nbsp;的输入方式来输入命令行，我就是这么做的。一个程序可以调用另外一个程序来得到数据，可以把数据交给它处理后返回来，可以在自己的窗口里"嵌入"另外一个程序。&nbsp;<br />
在&nbsp;Windows&nbsp; 和其它非&nbsp;UNIX&nbsp;操作系统中，这种合作是非常困难的。我曾经在Windows下使用&nbsp;Perl来进行一些自动工作。但是&nbsp;Windows&nbsp;的文件操作，管道是如此的不稳定，程序之间基本不能合作。你别想在&nbsp;Visual&nbsp;Studio&nbsp;窗口里面嵌入&nbsp;UltraEdit&nbsp;编辑器，你别想用一个 &nbsp;expect&nbsp;脚本来控制&nbsp;telnet&nbsp;到水木清华BBS。&nbsp;<br />
Windows&nbsp;的程序都是大而全，大而杂，所有的电子邮件程序都需要自己提供编辑器，自己发送和收取邮件，自己显示邮件的附件。每一个BBS程序都提供自己的Virtual&nbsp;Terminal,&nbsp;自己的通讯代码。每一个&nbsp;IDE&nbsp; 都自己提供编辑器，编译器，汇编器，调试器。人们为了使用一种新的程序，需要适应所有这些它提供的界面，而不能使用自己喜欢的编辑器的键绑定，菜单组织&#8230;&#8230;&nbsp;不能&nbsp;DIY！&nbsp;<br />
你要知道，最高级的电脑是定做的，自己想要什么什么CPU，什么主板，多少内存，什么硬盘，键盘，鼠标，显示器都是自己选择的。最高级的滑板，自己想要什么牌子的版面，什么牌子的沙，什么桥，什么轮子，什么轴承，也都是自己选的。最高级的古球拍，木板，胶皮，海绵，胶水都是可以自己选择&#8230;&#8230;&nbsp;而用&nbsp;Windows&nbsp;程序，你得到的是大杂烩，就像你去买"品牌机"，只有那么几种配置，而且附带很多你不需要的软件和服务；就像你去买组装好的滑板，你想要大一点的轮子和窄一点的板子，但是你没有这种选择余地！Windows&nbsp;程序就相当于最廉价，最次的滑板。但是它却会花你更多的钱，因为一旦一个部件坏了，或者你不喜欢了，你不能另外找一个好的换掉它，你必需重新买全套配件！&nbsp;<br />
而&nbsp;UNIX&nbsp;和&nbsp;Xwindow&nbsp;就是高档的"组装货"。比如我用&nbsp;Mutt&nbsp;的时候，我可以用&nbsp;VIM也可以用&nbsp;pico&nbsp;来编辑邮件，我可以用&nbsp;ImageMagick&nbsp;也可以用&nbsp;xv&nbsp;来显示附件里的图片，我可以用&nbsp;lynx&nbsp;把&nbsp;HTML&nbsp;附件转成文本嵌入窗口中，我也可以把&nbsp;HTML&nbsp;附件交给Mozilla&nbsp;图形显示。我可以让 &nbsp;GnuPG&nbsp;帮我把邮件进行数字签名和加密，我也可以用其它&nbsp;PGP&nbsp;程序。&nbsp;<br />
我想让&nbsp;Postfix&nbsp;而不是&nbsp;sendmail&nbsp;帮我发出邮件，我想让&nbsp;fetchmail&nbsp;帮我收邮件，转发给&nbsp;postfix，然后被我自己写的Perl过滤器处理&#8230;&#8230;&nbsp;这一切我都可以办到！我可以选择我最喜欢的专门的程序来完成专门的工作，然后把它们结合在一起，我也可以分别得到它们的好处。&nbsp;<br />
学&nbsp;UNIX&nbsp;绝对不是浪费时间&nbsp;<br />
有人告诉我："你看我用&nbsp;Windows&nbsp;什么都不用学。而用&nbsp;Linux，光是安装就花了我一个星期！"&nbsp;<br />
首先，我要告诉你的是，你装&nbsp;Linux&nbsp;花了一个星期，不是因为&nbsp;Linux&nbsp;不好装，而是因为你已经习惯了&nbsp;Windows，对&nbsp;Linux&nbsp;最初难以理解而已。你想一想你最初安装Windows的时候呢？你花了多少时间搞明白什么是硬盘分区？什么是盘符？什么是目录？你认为Windows&nbsp;就是那么容易可以学会的吗？虽然你觉得没花时间学，但是你以前在用别人的机器的时候已经耳濡目染，自然就了解了。而且由于你想要&nbsp;Linux&nbsp;和&nbsp;Windows&nbsp; 并存于硬盘上，又增加了安装难度。而且你肯定没有得到有经验的&nbsp;Linux&nbsp;用户的帮助，否则他们会在20分种之内帮你搞定。一个星期也太夸张了.&nbsp;<br />
如果一开始用的就是Linux就没有这个问题。你想想如果你没有用过&nbsp;windows，你肯定会很习惯&nbsp;/etc,&nbsp;/usr, &nbsp;/usr/local&nbsp;,...&nbsp;而不是&nbsp;C:,&nbsp;D:,&nbsp;E:,&nbsp;...&nbsp;是不是？如果你只用过Linux，你第一次用&nbsp;windows&nbsp;时恐怕也会问："/bin&nbsp;目录哪里去了啊？"&nbsp;<br />
最重要的是，你用惯了的UNIX工具，它们可以伴随你一生，而不会那么容易变化或消失。你可以永远不用再换另外的工具了。除非那个工具比你这个好的太多，而且可以完全模拟你现在的工具。&nbsp;<br />
我们实验室一个60多岁的老师，用vi,&nbsp;cc,&nbsp;make,&nbsp;...都几十年了，他以前的经验绝对没有白费，而且教会了我们一批又一批的学生。vi&nbsp;伴随着&nbsp;UNIX&nbsp;的最初发行而诞生，直到今天还是世界上头两号编辑器之一！有些人的&nbsp;FVWM&nbsp;配置文件已经用了&nbsp;10&nbsp;多年，现在完全不经修改还可以用。 &nbsp;<br />
看看&nbsp;Windows&nbsp;的工具，你从&nbsp;Borland&nbsp;C++&nbsp;换到&nbsp;VC,&nbsp;就必需适应新的环境：菜单不同了，颜色不同了，按钮不同了，帮助信息不同了，热键不同了，编译器参数，调试器功能也不同了，&#8230;&#8230;&nbsp;那个时候恐怕花要花你很多时间去适应。当你刚刚适应了&nbsp;VC,&nbsp;你又要换成VJ, &nbsp;PowerBuilder,&nbsp;C++Builder,&nbsp;...&nbsp;<br />
很多windows程序员都是这样，开头在dos下用Turbo&nbsp;C,&nbsp;然后是 &nbsp;Borland&nbsp;C,&nbsp;VC,&nbsp;C++&nbsp;Builder,&nbsp;......不断追赶微软的潮流。而且微软的SDK,&nbsp;MFC,&nbsp;.NET&nbsp;&#8230;&#8230;&nbsp;什么都在不断变化，不断出问题，又不断的在修改&#8230;&#8230;&nbsp;Windows&nbsp;程序员不得不买又厚又重的&nbsp;Microsoft&nbsp;Press&nbsp;的书籍，看了才一个月，又过时了。今天你才学会了写&nbsp;VxD，明天你就必须用WDM&nbsp;了。你不得不注册&nbsp;MSDN&nbsp;才能赶上&nbsp;Microsoft&nbsp;的步伐。很多人说："计算机是贵族的专业。"&nbsp;这就是微软一手造成的。&nbsp;<br />
这些东西才是没完没了的浪费大家的时间和金钱的。这是是浪费生命！我们为什么不使用从诞生就那么一致和完美的 &nbsp;UNIX？你需要理解先进工具的设计理念。UNIX&nbsp;的工具就像我们用的汽车，它的离合器，油门，刹车，方向盘，后视镜，永远都在同样的位置。用惯了的话，你对你的汽车的每一个部件都会了如指掌，甚至你自己都可以修车了。这难道不好吗？&nbsp;<br />
有人说："你说我们需要了解&nbsp;UNIX，难道你要开车还必须了解汽车的结构吗？"&nbsp;你去问问开车的司机，哪一个不了解汽车的结构的，那他的驾照就是混来的。你难道想要傻瓜型的"微软牌汽车"吗？我们来看看：&nbsp;<br />
你买的微软牌汽车最开头只有一个座位，每加一个座位你得向汽车公司付钱。车上的防撞气囊不时会冒出来，说是为了你的安全。每开100英里要大修一次，每过一年要换一次引擎。附带的，你还必须换用由微软汽车公司指定的石油公司提供的新型号的机油。你的车出了问题，但是法律规定，你不准私自拆开你的汽车来修理，你必需到微软汽车公司指定的维修点去，需要付相当多的钱才能修好一个小毛病。&nbsp;<br />
最可气的是，你每换一个型号的微软牌汽车，它的刹车和离合器都在不同的位置，你需要重新去考驾驶执照。如果这辆汽车在途中刹车失灵，你受了重伤，你也不能状告微软汽车公司，因为你买来汽车之后必须签一个合同，说"由于微软牌汽车对你和家人造成的一切死伤，微软概不负责。"&nbsp;<br />
怎样完全用&nbsp;GNU/Linux&nbsp;工作&nbsp;<br />
说了这么多&nbsp;Windows&nbsp;的不好。我还没有告诉你我怎么用&nbsp;Linux&nbsp;处理有些必要的事情。半年以前我由于中文老是配置不好，一直是双系统，不时需要重起到&nbsp;Win2k&nbsp;来处理汉字。后来我找到了&nbsp;miniChinput,&nbsp;XSIM&nbsp;和&nbsp;SCIM&nbsp;输入法。这下可以处理汉字了。而且&nbsp;VIM&nbsp;和Emacs&nbsp;对汉字支持越来越好。我的大部分文本是用&nbsp;VIM&nbsp;编辑的，包括程序，信件，网页，LaTeX&nbsp;论文，MetaPost&nbsp;绘图语言。&nbsp;<br />
我不用&nbsp;Word&nbsp;这样的程序写论文，而是用&nbsp;LaTeX，因为这是世界上效果最好，最方便的论文工具，是大多数学术杂志要求的格式。幻灯都是用&nbsp;ConTeXt&nbsp;做的，用起来很简单，而且效果非常漂亮。你可以看看我的TeX介绍。&nbsp;<br />
至于绘图，你可以用很多可视化的工具，比如&nbsp;xfig，dia。但是对于我来说，任何可视化的工具都不能完成某些任务，我需要一种可以精确描述图形的语言。我找到了MetaPost。它简单又好用，而且效果是世界一流的。我的插图，如果不是图像，都是MetaPost&nbsp;画出来的。&nbsp;<br />
我曾经抱怨 &nbsp;mozilla-mail&nbsp;经常突然消失，损坏我好几封快要完成的信件。后来我发现mozilla&nbsp;的邮件处理程序确实是不稳定的，功能又弱，有经验的 &nbsp;UNIX&nbsp;用户都不用这样的程序。Mutt&nbsp;是一个非常稳定可靠的&nbsp;UNIX&nbsp;邮件处理程序，而且功能非常强大。我曾经为&nbsp;Gnome&nbsp;和&nbsp;KDE&nbsp;的不稳定而烦恼。现在我找到了非常强大的&nbsp;FVWM。KDE，Gnome也能和&nbsp;FVWM&nbsp;一起工作。虽然&nbsp;Gnome&nbsp;和&nbsp;KDE&nbsp;总体不稳定，但是某些部件程序还不错，很多&nbsp;gtk,&nbsp;Qt&nbsp;的程序也很不错，它们很多都是可以独立于这些桌面环境运行的。&nbsp;<br />
Linux&nbsp;有很多强大方便的工作方式是&nbsp;Windows&nbsp;没有的，或者有类似的东西，但是很差劲或者用起来不方便。比如&nbsp;ssh&nbsp;服务，rsync，cvs，expect&nbsp;&#8230;&#8230;&nbsp;<br />
结论&nbsp;<br />
我写这么多的目的是什么？我希望喜欢&nbsp;Linux&nbsp;的朋友，完全清除微软和&nbsp;Windows&nbsp;灌输在你脑子里的谬论，别再相信它们所谓的"新技术"，别再追赶&nbsp;Windows，因为追赶Windows&nbsp;＝&nbsp;倒退。马克思有一个思想很重要，"新生事物并不一定是在最近出现的。"&nbsp;<br />
UNIX，Xwindow,&nbsp;TeX&nbsp;虽然都比&nbsp;Windows&nbsp;先出现，但是它们才是先进生产力的代表。我们要清楚的认识到什么才是真正的现代化，什么才是真正的自动化。&nbsp;<br />
消除学计算机很难的幻觉，勇敢的拿起像&nbsp;bash,&nbsp;FVWM,&nbsp;TeX,&nbsp;VIM,&nbsp;Emacs,&nbsp;Mutt&nbsp;&#8230;&#8230;这样强大的程序，勇敢的面对符号。不要再埋怨"Linux&nbsp;为什么不能像&nbsp;Windows&nbsp;那样"，不要再浪费时间试用这样那样的程序，不要再忙着升级。你需要理解&nbsp;UNIX&nbsp;的工作方式，因为那是大多数科学家的工作方式。Linux&nbsp;可以成为你的好朋友，你需要认识它，了解它，信任它，才能完全的靠它来高效的工作。当然，在游戏机，手机，掌上电脑里，或者在用电脑来娱乐的时候，用一些"傻瓜软件"还是不错的.&nbsp;<br />
我希望小学，中学的计算机老师能够提高自己的素质，在孩子们的启蒙教育中充分利用Linux&nbsp;神秘的特点，引起孩子们对数学，对符号的好奇心。诱导他们用计算机来解决世界上的有趣问题，而不要把教学的范围局限于计算机的操作和它自身的问题。&nbsp;<br />
附录:&nbsp;我用来处理日常事务的&nbsp;Linux&nbsp;程序&nbsp;<br />
好了好了。我知道你发现自己应该转向&nbsp;Linux，你很后悔当初为什么中了微软的邪。但是不要着急。因为这些东西本来只是工具，它们是用来完成你的主要任务的辅助而已。你以前选错了工具，这不要紧。你还是拥有你自己原来的专业技能，那才是最重要的。工具的东西只有慢慢适应转换，不能一蹴而就，否则你会感到非常没意思，甚至放弃。&nbsp;<br />
如果你只想做一个像我这样的普通用户，主要目的是用&nbsp;Linux&nbsp;来完成自己的任务，那就可以不用系统管理员或者网络管理员的标准来要求自己，因为当一个系统和网络管理员确实很辛苦。这里我对实验室的网管同学鞠一躬，谢谢你的指点和帮助.&nbsp;不用把你的机器当成网络服务器，不用开放没有必要的服务，设置好&nbsp;ssh,&nbsp;ftp&nbsp;已经足够了。这样会省去了解很多没必要了解的东西的时间。不用过度考虑"安全"，因为&nbsp;Linux&nbsp;缺省已经很安全了。不过你有兴趣了解更多那也无妨。&nbsp;<br />
下面给出一些推荐使用的可以处理一般事情的程序。至于你的专业上要用到的科学和工程软件比如 &nbsp;Matlab,&nbsp;Mathematica,&nbsp;Maple,&nbsp;HSpice,&nbsp;Design&nbsp;Compiler,&nbsp;&#8230;&#8230;&nbsp;还有其它物理上的，化学上的，生物上的&nbsp;&#8230;&#8230;&nbsp;都必然有&nbsp;Linux&nbsp;和&nbsp;UNIX&nbsp;的版本。当然他们很多不是免费的，不要总是觉得什么都应该免费，自由不等于免费。它们是经过很多人辛勤劳动的产物，是可靠的程序，它们物有所值。&nbsp;<br />
下面列出我常用的一些&nbsp;Linux&nbsp;程序。一个列表里可能有很多，那是为了方便你来选择，我列出了比较信得过的。但其实很多只有第一个是我真正在用的，我不喜欢试用程序。我不是一个合格的网络管理员，我的服务器都只设置了我自己需要的功能，那样可以省去我很多麻烦。<br />
Shell:&nbsp;bash。它结合了&nbsp;csh&nbsp;和&nbsp;ksh&nbsp;的优点，并且有&nbsp;readline&nbsp;功能，你可以随意绑定自己的键盘。&nbsp;<br />
编辑器：&nbsp;VIM,&nbsp;Emacs。&nbsp;<br />
程序开发：&nbsp;GCC,&nbsp;make,&nbsp;ld,&nbsp;Scheme48,&nbsp;j2sdk,&nbsp;Perl,&nbsp;Python,&nbsp;Tcl/Tk&nbsp;...&nbsp;<br />
论文，幻灯工具：LaTeX,&nbsp;ConTeXt&nbsp;<br />
绘图工具：MetaPost。这个语言太强了，以至于我只用它了。你不熟悉的话可以用xfig,&nbsp;dia&nbsp;来画一些流程图之类的图片。&nbsp;<br />
图像处理：ImageMagick。其中的&nbsp;import&nbsp;程序可以屏幕抓图，convert&nbsp;程序可以转换图像格式，display&nbsp;可以显示图片和简单编辑(缩放，换质量，转格式，简单绘图，简单虑镜)。通常我就这么点需要。如果你要更强大的图像工具可以用&nbsp;Gimp,&nbsp;它几乎和Photoshop差不多。&nbsp;<br />
自动管理工具：make。我可以用make来自动编译程序，自动编译文档，自动更新插图&#8230;&#8230;&nbsp;全自动，而且不会重复劳动。&nbsp;<br />
数值计算程序：SciLab。这个程序基本上可以代替&nbsp;Matlab。&nbsp;<br />
代数计算程序：MAXIMA。这个程序基于世界上最老的计算机代数系统之一:&nbsp;由美国能源部(DOE)发行的&nbsp;MIT&nbsp;Macsyma&nbsp;系统。它是用 &nbsp;Common&nbsp;Lisp&nbsp;实现的。很多现在的符号计算程序比如&nbsp;Maple&nbsp;都从&nbsp;MAXIMA&nbsp;身上学到很多东西。它现在经过&nbsp;DOE&nbsp;批准以GPL 发行，永远是一个自由软件。&nbsp;<br />
加密程序：GnuPG。我的&nbsp;PGP&nbsp;密钥就是它搞出来的。&nbsp;<br />
打包，压缩程序。什么都有:&nbsp;tar,&nbsp;gzip,&nbsp;bzip2,&nbsp;zip,&nbsp;rar,&nbsp;...&nbsp;<br />
虚拟光驱程序。Linux&nbsp;不需要虚拟光驱程序，直接&nbsp;mount&nbsp;就行了。&nbsp;<br />
ftp&nbsp;服务器：proftpd,&nbsp;vsftpd。proftpd&nbsp;功能很强，但是我只用了最简单的一种设置。&nbsp;<br />
WWW&nbsp;服务器：apache。(我一般没有开)&nbsp;<br />
ftp&nbsp; 客户程序：lftp，ncftp。它们都是文本方式操作的，但是比起图形界面的方便的多。比如&nbsp;lftp&nbsp;几乎具有&nbsp;bash&nbsp;的所有方便功能，Tab&nbsp; 补全，bookmark,&nbsp;queue,&nbsp;后台下载，镜像&#8230;&#8230;&nbsp;Linux&nbsp;也有图形界面的&nbsp;ftp&nbsp;客户程序，但是大多不稳定，有很多问题。这就是很多人抱怨&nbsp;Linux&nbsp;不如&nbsp;Windows&nbsp;的一个小原因。还有很多人用&nbsp;Wine&nbsp;模拟&nbsp;Windows&nbsp;的leapftp，其实&nbsp;lftp&nbsp;比 &nbsp;leapftp&nbsp;好很多，你需要的只是适应一下。&nbsp;<br />
自动下载工具：wget。它非常稳定，有一次我下载一个程序，用&nbsp;IE&nbsp;和 &nbsp;Mozilla&nbsp;下载回来的文件都是坏的，最后还是&nbsp;wget&nbsp;可靠的传输了数据。用它甚至可以镜像整个网站，比起WebZip&nbsp;这样的 &nbsp;Windows&nbsp;程序强多了，而且不会因为你不付钱就在下载回来的网页里强制插入广告。&nbsp;<br />
虚拟终端：rxvt,&nbsp;xterm,&nbsp;gnome-terminal,&nbsp;mlterm,&nbsp;...&nbsp;<br />
X&nbsp;server:&nbsp;XFree86&nbsp;<br />
窗口管理器：FVWM。编译加入了&nbsp;libstroke。&nbsp;<br />
中文输入：XSIM。被我修改过以适应&nbsp;FVWM&nbsp;的需要。另外推荐你还可以用&nbsp;SCIM。&nbsp;<br />
email&nbsp;处理：Mutt&nbsp;+&nbsp;Postfix&nbsp;+&nbsp;fetchmail&nbsp;<br />
看&nbsp;PDF,&nbsp;PS,&nbsp;DJVU&nbsp;文件：Acrobat&nbsp;Reader,&nbsp;xpdf,&nbsp;GhostScript,&nbsp;gv,&nbsp;djvu工具包和netscape&nbsp;插件。&nbsp;<br />
看CAJ文档。我从来不看CAJ之类的文档，如果找不到PDF或PS，直接去图书馆借最好。<br />
看网页：Mozilla,&nbsp;Phoenix,&nbsp;lynx。Mozilla-Xft&nbsp;的显示效果比IE&nbsp;好很多。&nbsp;<br />
英汉字典：IBM智能词典，星际译王。&nbsp;<br />
编辑网页：我用VIM&nbsp;直接写&nbsp;HTML。你如果想要图形方式的可以用其它的比如screem,&nbsp;BlueFish。&nbsp;<br />
登录其它&nbsp;UNIX,&nbsp;Linux&nbsp;机器：openSSH,&nbsp;telnet。&nbsp;我喜欢用&nbsp;openSSH&nbsp;把其它机器的X&nbsp;程序通过&nbsp;ssh&nbsp;加密的隧道传到我机器上显示。&nbsp;<br />
登录&nbsp;Windows2000&nbsp;server&nbsp;的&nbsp;display&nbsp;service:&nbsp;rdesktop，...我有一天试了一下，不错。后来就没有用过了。&nbsp;<br />
同步程序：rsync。我用&nbsp;rsync&nbsp;通过&nbsp;ssh&nbsp;来跟某些机器同步数据，或者做自己机器上不同目录间的同步。&nbsp;<br />
上BBS：rxvt(或任何一种终端)&nbsp;+&nbsp;telnet&nbsp;+&nbsp;chatbot(helloooo&nbsp;机器人的程序)&nbsp;<br />
QQ,&nbsp;ICQ:&nbsp;我没有&nbsp;QQ&nbsp;或&nbsp;ICQ。不过你可以用&nbsp;Gaim,&nbsp;它同时支持&nbsp;QQ,&nbsp;ICQ&nbsp;和很多其它的即时通信方式。ICQ&nbsp;用户也可以用&nbsp;Licq。&nbsp;<br />
放录像：MPlayer,&nbsp;RealPlayer。MPlayer&nbsp;太好了，直接就可以放&nbsp;VCD,&nbsp;DVD,&nbsp;divx,&nbsp;wma,&nbsp;wmv&nbsp;...&nbsp;用 &nbsp;Windows&nbsp;的同学都很羡慕我，说&nbsp;Windows&nbsp;要放这个需要大堆插件。rm&nbsp;最好还是用&nbsp;realplayer&nbsp;放，它也是免费的。&nbsp;<br />
放音乐：&nbsp;xmms(mp3,ogg都可以),&nbsp;mpg321(放mp3),&nbsp;ogg123(放ogg)。mpg321&nbsp;不如xmms管理音乐文件那么方便，但是有时我还是用&nbsp;mpg321&nbsp;放&nbsp;mp3&nbsp;作为背景音乐，因为懒得开一个xmms窗口:-)<br />
游戏：我觉得&nbsp;KDE&nbsp;的那个&nbsp;ksokoban(推箱子)，很好玩&nbsp;:-)&nbsp;<br />
看&nbsp;Word&nbsp; 文档。请&nbsp;Word&nbsp;用户把文档全部转为&nbsp;PDF&nbsp;或&nbsp;PS&nbsp;再给我，文档里没有特殊的格式干脆就用文本吧，何必那么麻烦。以前很奇怪的是，通知里本来没有什么特殊的格式居然还要发doc附件的email。现在好了，我们系发通知都用文本，PDF，甚至图片了。<br />
其它程序：还有很多我需要用而你不一定用得着的。比如，Doctor&nbsp;Scheme,&nbsp;<br />
Scheme48, &nbsp;Scsh,&nbsp;kawa...这些程序只有&nbsp;Doctor&nbsp;Scheme&nbsp;有Windows版本。还有很多幕后工作但是你一般不察觉的：xinetd, &nbsp;telnetd,&nbsp;sshd,&nbsp;crond,&nbsp;atd,&nbsp;lpd,&nbsp;...&nbsp;他们都比&nbsp;Windows&nbsp;的对应者强的多，或者根本没有对应者。
<img src ="http://www.blogjava.net/zhouf/aggbug/238125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2008-11-01 21:30 <a href="http://www.blogjava.net/zhouf/articles/238125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wine中文乱码的解决方法</title><link>http://www.blogjava.net/zhouf/articles/237405.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Wed, 29 Oct 2008 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/237405.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/237405.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/237405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/237405.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/237405.html</trackback:ping><description><![CDATA[新装的wine中文全是乱码，需要修改一下几个配置文件，找到一篇比较详细的配置说明，分享一下：<br />
&#8220; wine下中文的配置方案<br />
步骤：
<p>1. 初始设置</p>
<p>运行 winecfg，把模拟的 Windows 系统设置为 Windows XP 或者 Windows 2000。</p>
<p>2. 准备字体</p>
<p>为了让 Windows 应用程序看上去更美观，所以需要 Windows 下面的字体。</p>
<p>由于我已经将 simsun.ttc 复制到 /usr/share/fonts/windows/ 目录中了。所以我只需要在 ~/.wine/drive_c/windows/fonts/ 目录中为 simsun.ttc 创建一个符号连接：</p>
<p>cd ~/.wine/drive_c/windows/fonts<br />
ln -s /usr/share/fonts/windows/simsun.ttc simsun.ttc<br />
ln -s /usr/share/fonts/windows/simsun.ttc simfang.ttc</p>
<p>创建一个 simfang.ttc 是许多 Windows 应用默认使用 simfang.ttc 字体。<br />
3. 修改 ~/.wine/system.reg</p>
<p>装好字体后，还要修改一下 Wine 的注册表设置，指定与字体相关的设置：</p>
<p>gedit ~/.wine/system.reg</p>
<p>（一定要使用 gedit 或其他支持 gb2312/utf8 编码的编辑器修改这些文件，否则文件中的中文可能变乱码）</p>
<p>搜索： LogPixels<br />
找到的行应该是：[System\\CurrentControlSet\\Hardware Profiles\\Current\\Software\\Fonts]<br />
将其中的：<br />
"LogPixels"=dword:00000060</p>
<p>改为：<br />
"LogPixels"=dword:00000070</p>
<p>搜索： FontSubstitutes<br />
找到的行应该是：[Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes]<br />
将其中的：<br />
"MS Shell Dlg"="Tahoma"<br />
"MS Shell Dlg 2&#8243;="Tahoma"</p>
<p>改为：<br />
"MS Shell Dlg"="SimSun"<br />
"MS Shell Dlg 2&#8243;="SimSun"</p>
<p>4. 修改 ~/.wine/drive_c/windows/win.ini</p>
<p>gedit ~/.wine/drive_c/windows/win.ini<br />
在文件末尾加入：</p>
<p>[Desktop]<br />
menufontsize=13<br />
messagefontsize=13<br />
statusfontsize=13<br />
IconTitleSize=13</p>
<br />
<p><span>&nbsp;&nbsp; 5. <font color="#ff0000">最关键的一步，网上很多文章中没有提到的一步</font>──把下面的代码保存为zh.reg，然后终端执行regedit zh.reg。从Windows目录下的Fonts里的simsun.ttc复制到/home/user/.wine/drive_c/windows/fonts里面。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REGEDIT4<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Arial"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Arial CE,238"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Arial CYR,204"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Arial Greek,161"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Arial TUR,162"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Courier New"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Courier New CE,238"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Courier New CYR,204"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Courier New Greek,161"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Courier New TUR,162"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "FixedSys"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Helv"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Helvetica"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MS Sans Serif"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MS Shell Dlg"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MS Shell Dlg 2"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "System"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tahoma"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Times"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Times New Roman CE,238"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Times New Roman CYR,204"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Times New Roman Greek,161"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Times New Roman TUR,162"="simsun"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Tms Rmn"="simsun"</span></p>
<p>之后，中文正常显示哈哈！</p>
<br />
此文出处:http://blog.chinaunix.net/u1/41660/showart_1146355.html
<img src ="http://www.blogjava.net/zhouf/aggbug/237405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2008-10-29 16:38 <a href="http://www.blogjava.net/zhouf/articles/237405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>选择了Emacs</title><link>http://www.blogjava.net/zhouf/articles/235952.html</link><dc:creator>ZhouFeng</dc:creator><author>ZhouFeng</author><pubDate>Wed, 22 Oct 2008 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/zhouf/articles/235952.html</guid><wfw:comment>http://www.blogjava.net/zhouf/comments/235952.html</wfw:comment><comments>http://www.blogjava.net/zhouf/articles/235952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouf/comments/commentRss/235952.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouf/services/trackbacks/235952.html</trackback:ping><description><![CDATA[选择了Emacs。<br />
Emacs被誉为世界上最强的编辑器。<br />
世界上的程序员分三种，一种使用Emacs，一种使用vim，剩余的是其它。<br />
下面是收集的一点Emacs的配置<br />
<div align="left"><font color="#339966">&nbsp;;;去掉启动欢迎界面<br />
(setq inhibit-startup-message t)<br />
<br />
;; 设置窗口大小<br />
(set-frame-height (selected-frame) 30)<br />
(set-frame-width (selected-frame) 90)<br />
<br />
;;不显示工具条<br />
(tool-bar-mode -1)<br />
<br />
;;不要总是没完没了的问yes or no, 为什么不能用 y/n<br />
(fset 'yes-or-no-p 'y-or-n-p)<br />
<br />
;;不要生成临时文件<br />
(setq-default make-backup-files nil)<br />
<br />
;;括号匹配时显示另外一边的括号，而不是烦人的跳到另一个括号。<br />
(show-paren-mode t)<br />
(setq show-paren-style 'parentheses)<br />
<br />
;;打开高亮 #M-x global-font-lock-mode<br />
(global-font-lock-mode t)<br />
<br />
;;把title设置为&#8220;文件名@LC's Emacs"<br />
(setq frame-title-format<br />
'("GNU/Emacs - [ " (buffer-file-name "%f \]"<br />
(dired-directory dired-directory "%b \]"))))<br />
<br />
;;光标靠近鼠标的时候，让鼠标自动让开，别挡住视线<br />
(mouse-avoidance-mode 'animate)<br />
<br />
;; 自动存盘<br />
(setq auto-save-mode t)<br />
<br />
;; 反显选中区域<br />
(transient-mark-mode t)<br />
<br />
(setq load-path (cons "d:/soft/green_soft/ntemacs23/site-lisp/" load-path))<br />
;(add-to-list 'load-path "d:/soft/green_soft/ntemacs23/site-lisp/")<br />
;;(set-scroll-bar-mode nil) ; no scroll bar, even in x-window system<br />
(require 'wb-line-number)<br />
;;缺省显示行号<br />
;;(wb-line-number-enable)<br />
;;显示行号 ＃M-x wb-line-number-toggle</font><br />
</div>
参考网址：<br />
<a href="http://www.emacs.cn/" target="_blank">http://www.emacs.cn</a><br />
<a href="http://www.gnu.org/software/emacs/" target="_blank">http://www.gnu.org/software/emacs/</a><br />
<img src ="http://www.blogjava.net/zhouf/aggbug/235952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouf/" target="_blank">ZhouFeng</a> 2008-10-22 15:53 <a href="http://www.blogjava.net/zhouf/articles/235952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>