<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7838455367609171347</id><updated>2011-07-30T22:09:29.626-07:00</updated><category term='Tomcat'/><category term='Web前端'/><category term='JSP'/><category term='Java'/><category term='Linux'/><category term='R Language'/><category term='C/C++'/><title type='text'>薪的刻痕</title><subtitle type='html'>孔子曰：中午不睡，下午崩溃。&lt;br&gt;
孟子曰：孔子说的对。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-812852585793780851</id><published>2010-03-25T19:29:00.001-07:00</published><updated>2010-03-25T19:29:49.449-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R Language'/><title type='text'>R对象结构，用.Call的调用方式更灵活地写R-package</title><content type='html'>虽然R的使用资料很多也很齐备，但R的开发资料却少得可怜，写一个能管点用途的package也得大费周章。于是蜀中无大将、廖化当先锋，官方文档那区区130页不齐备而又晦涩的＜Writing R Extensions＞就成了红宝书，天天抱着啃，啃得呕心呖血再加上翻着几个现成package的源代码看，终有小小成。&lt;br /&gt;&lt;br /&gt;R与C的调用接口有好几种，以前介绍过的.C形式是一种，此外还有.Call形式和.External形式。.Call使用最为广泛，功能也比.C形式大很多，因为使用它可以直接操作R的数据结构，可以实现在C/C++中操作R的数据及调用R的函数，然后封装为包供R使用。&lt;br /&gt;&lt;br /&gt;R的所有数据类型（无论数据或类或函数）都是对象，都统一定义为结构SEXPREC，由指针SEXP（不要想歪，我也不明白作者为何要取这个名字）所指向。这个结构在Rinternal.h中定义为：&lt;br /&gt;&lt;br /&gt;typedef struct SEXPREC {&lt;br /&gt;SEXPREC_HEADER;&lt;br /&gt;union {&lt;br /&gt;struct primsxp_struct primsxp;&lt;br /&gt;struct symsxp_struct symsxp;&lt;br /&gt;struct listsxp_struct listsxp;&lt;br /&gt;struct envsxp_struct envsxp;&lt;br /&gt;struct closxp_struct closxp;&lt;br /&gt;struct promsxp_struct promsxp;&lt;br /&gt;} u;&lt;br /&gt;} SEXPREC, *SEXP;&lt;br /&gt;&lt;br /&gt;它包含一个HEADER及一个UNION，HEADER又是由如下宏定义：&lt;br /&gt;&lt;br /&gt;#define SEXPREC_HEADER \&lt;br /&gt;struct sxpinfo_struct sxpinfo; \&lt;br /&gt;struct SEXPREC *attrib; \&lt;br /&gt;struct SEXPREC *gengc_next_node, *gengc_prev_node&lt;br /&gt;&lt;br /&gt;它包含一个32位的sxpinfo的信息头，一个指向属性的指针，两个指向前后节点的指针构成双向链表。&lt;br /&gt;&lt;br /&gt;sxpinfo这个信息头的定义如下：&lt;br /&gt;&lt;br /&gt;struct sxpinfo_struct {&lt;br /&gt;SEXPTYPE type      :  5;&lt;br /&gt;unsigned int obj   :  1;&lt;br /&gt;unsigned int named :  2;&lt;br /&gt;unsigned int gp    : 16;&lt;br /&gt;unsigned int mark  :  1;&lt;br /&gt;unsigned int debug :  1;&lt;br /&gt;unsigned int trace :  1;  /* functions and memory tracing */&lt;br /&gt;unsigned int spare :  1;  /* currently unused */&lt;br /&gt;unsigned int gcgen :  1;  /* old generation number */&lt;br /&gt;unsigned int gccls :  3;  /* node class */&lt;br /&gt;}; /*            Tot: 32 */&lt;br /&gt;&lt;br /&gt;简单说几个主要字段的作用：type表示数据类型，如数字型、字符型、列表型等等；named控制引用时拷贝与否；mark为垃圾回收所用（GC）。&lt;br /&gt;&lt;br /&gt;使用.C调用方式来做R的扩展是最简单的方式，因为不需要理会SEXP这些复杂的R结构，只需要把数据拆解为一个个向量传递给C函数即可，详情参见我以前的描述。如果.C可以实现的功能，倒不必要一定要折腾到.Call，因为后者要牵涉到很多的R API，这些API还都没有文档说明其作用及调用方式，只能根据＜Writing R Extensions＞以及参考一些包的用法来猜测着使用。不过好处是.Call的功能更丰富而且稳定，.C方式的指针纵横交错，极易使程序崩溃。&lt;br /&gt;&lt;br /&gt;这里先用官方文档里的一个例子拿出来加以解说，阐述个大体流程，以后实践深入再结合一些经验来谈谈技巧。&lt;br /&gt;&lt;br /&gt;在C里处理R对象，以下是一个计算外积的例子：&lt;br /&gt;&lt;br /&gt;在C文件中的源代码为：&lt;br /&gt;&lt;br /&gt;#include &lt;R.h&gt;&lt;br /&gt;#include &lt;Rinternals.h&gt;  // 所有R API都定义在这里，只可惜没有太多说明，需要细细看&lt;br /&gt;SEXP out(SEXP x, SEXP y)  // 无论参数，还是返回值，都要定义为SEXP指针类型&lt;br /&gt;{&lt;br /&gt;int i, j, nx, ny;&lt;br /&gt;double tmp, *rx = REAL(x), *ry = REAL(y), *rans;  // REAL函数取得SEXP结构中的数据指针（如果是整型，则用INTEGER），以方便对数据的操作&lt;br /&gt;SEXP ans;&lt;br /&gt;nx = length(x); ny = length(y);&lt;br /&gt;PROTECT(ans = allocMatrix(REALSXP, nx, ny));  // 分配空间，返回一个SEXP指向的对象，REALSXP是指实数类型，这里生成一个实数矩阵。PROTECT保护该内存不被垃圾回归机制回收。&lt;br /&gt;rans = REAL(ans);&lt;br /&gt;for(i = 0; i &lt; nx; i++) {&lt;br /&gt;tmp = rx[i];&lt;br /&gt;for(j = 0; j &lt; ny; j++)&lt;br /&gt;rans[i + nx*j] = tmp * ry[j];&lt;br /&gt;}&lt;br /&gt;UNPROTECT(1);  // 放弃对以上PROTECT声明内存段的保护，参数1指示放弃1次，次数必须跟上面使用PROTECT次数一致。&lt;br /&gt;return(ans);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;假如文件存储为out.c，则用R CMD SHLIB out.c命令可以把源代码编译为out.so共享库。然后在R里使用如下代码即可使用：&lt;br /&gt;&lt;br /&gt;a=1:3&lt;br /&gt;b=4:6&lt;br /&gt;dyn.load("out.so")&lt;br /&gt;.Call("out", a, b)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-812852585793780851?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/812852585793780851/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2010/03/rcallr-package.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/812852585793780851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/812852585793780851'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2010/03/rcallr-package.html' title='R对象结构，用.Call的调用方式更灵活地写R-package'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-7590310265320307460</id><published>2010-03-25T19:27:00.000-07:00</published><updated>2010-03-25T19:28:18.367-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R Language'/><title type='text'>把R的dataframe当成数据库来查ZZ</title><content type='html'>从cos上看到一个很好玩的包：sqldf，可以把一个或多个dataframe组成数据库，然后用SQL语句来查询，这样对于一些查询计算会非常方便。其原理是先把dataframe转成SQLite的表，然后进行查询。&lt;br /&gt;&lt;br /&gt;由于今天早上起来r-project主站无法连上，只能用镜像网站下载安装了：install.packages(“sqldf”, repos=”http://mirrors.geoexpat.com/cran/”)&lt;br /&gt;&lt;br /&gt;使用，假设工作区里有两个dataframe：x和y，那么可以用如下方式查询&lt;br /&gt;&lt;br /&gt;sqldf(’select * from x limit 10′)&lt;br /&gt;&lt;br /&gt;sqldf(’select distinct id from y where status=”P” limit 10′)&lt;br /&gt;&lt;br /&gt;sqldf(’select status, count(1) from y group by status’)&lt;br /&gt;&lt;br /&gt;sqldf(’select y.name from x, y where x.id=1 and y.rid=x.id’)&lt;br /&gt;&lt;br /&gt;是不是很像数据库查询，这时你的工作区就是一个数据库了。&lt;br /&gt;&lt;br /&gt;注意：有时候表实际的列名会与dataframe的名字不一致，也即x[1:5, ]和sqldf(’select * from x limit 5′)看到的字段名是有可能会不一样的，这种情况下，以后者为准。比如我x中有一个字段user到了sqldf就变成了user__1，这时只能用user__1来作为字段名进行查询，不能再用user。最好先用sqldf(’select * from x limit 5′)确认一下具体的字段名称。&lt;br /&gt;&lt;br /&gt;速度如何？经我的试验，10万的数据都是瞬间完成，在100万的量级都还是很快的，无论对哪个字段作为查询条件都很快，估计不是因为有索引，而是采用高效的向量化运算，并且数据都在内存里的缘故。因为即使不用sqldf，直接对data.frame作判断查询，速度也不慢，而sqldf不过作了一个漂亮的sql包装。对于更大的数据集，要考虑到内存的占用。所以如果有一个或几个可以载入到内存的数据集（又或是一些临时的结果），想做一些简单的查询计算，用sqldf就可以很快地得到结果（而且语法很简洁）。当然前提是你必须得懂简单的SQL。&lt;br /&gt;&lt;br /&gt;不足之处在于需要依赖tcltk，这是个图形相关的包，所以在非图形界面的服务器上不会被编译安装。其实很让人费解为什么需要依赖图形包。&lt;br /&gt;&lt;br /&gt;更新：今天收到益辉同学发来R-dev邮件组的一篇讨论帖，说sqldf并非直接依赖tcltk，而是为了加快查询而依赖gsubfn，而gsubfn依赖tcltk的缘故。我查了一下这两个包的说明，确实如此。事实上，gsubfn并非一定得依赖tcltk，后者只是起一个加速的作用，所以开发者们也在考虑是否应该把gsubfn对tcltk的depend关系改为suggest关系。我很支持，因为我在gentoo服务器上装的R是不带X进行编译的，所以不能安装tcltk。&lt;br /&gt;&lt;br /&gt;reference：http://www.wentrue.net/blog/?p=453&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-7590310265320307460?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/7590310265320307460/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2010/03/rdataframezz.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/7590310265320307460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/7590310265320307460'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2010/03/rdataframezz.html' title='把R的dataframe当成数据库来查ZZ'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-6120326291711163902</id><published>2010-03-25T19:24:00.002-07:00</published><updated>2010-03-25T19:27:15.700-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R Language'/><title type='text'>R package的最简单制作ZZ</title><content type='html'>R的强大之处在于它包罗万有的包，几乎任何领域都可以从CRAN里找到你所需要的实现。&lt;br /&gt;&lt;br /&gt;如果有一些功能你希望自己来实现，又或者是用别人的包用多了，希望自己做一个，那么这是一个简单的向导。可以告诉你怎么去制作一个最简单的R包，如果你需要用到复杂的功能，可以再深入地查看资料，我以后也会根据自己的实践深入写一写。&lt;br /&gt;&lt;br /&gt;其实最原始最详尽的R包制作指南应该是官方文档＜Writing R extensions＞，但看过的人无一不觉得这是个累赘，它面面俱到地说了所有的事情，但令初学制作者无所适从。那么，摒弃里面的大部分内容，你真正需要的东西是这样的（以下说明基于linux平台，windows用户也可参考）：&lt;br /&gt;&lt;br /&gt;准备工作指定两个目录，一个是工作目录mydir（/home/wentrue/work），一个是包目录mylib（如/home/wentrue/Rlibs）。前者是你写R代码、运行R console的地方，后者是安装包的地方。&lt;br /&gt;默认情况下在mydir是找不到mylib下的包的，因为mylib不在包的搜索路径里，解决这个问题只需要在mydir新建一个文件.Rprofile文件，里面写上：.libPaths(“/home/wentrue/Rlibs”)即可。这样在mydir运行R脚本或启动R终端，mylib就会被添加到包搜索路径中。&lt;br /&gt;添加目录与文件在mydir新建一个目录，名为once，作为包名。然后生成一些目录，目录树结构见下：&lt;br /&gt;&lt;br /&gt;$ tree once&lt;br /&gt;once&lt;br /&gt;|– DESCRIPTION&lt;br /&gt;|– R&lt;br /&gt;|   |– test.R&lt;br /&gt;|   `– zzz.R&lt;br /&gt;|– data&lt;br /&gt;|– man&lt;br /&gt;`– src&lt;br /&gt;&lt;br /&gt;目录说明：必需的是DESCRIPTION文件、man目录和R目录，剩下的都是可选的。DESCRIPTION文件描述包的meta信息，后面会有一个附例；R目录下面存放R脚本文件，里面的函数可导出作为包函数库提供给外部使用；如果要在包里放一些试验数据，可以放在data目录里，常用是以csv格式存放，在R终端里data(***)可以载入，这里留空；man目录是R的帮助文档，即?xxx时显示的那些，有一定的格式要求，这里也留空；src存放c/c++/fortran源代码，必须同时放置Makefile或Makevars文件指导编译程序工作，这里留空。&lt;br /&gt;作为试验，我在test.R里写了一个简单的函数，内容见下，里面的oncetest函数在once被装载时就可以被R直接调用。&lt;br /&gt;&lt;br /&gt;oncetest &lt;- function(x, y)&lt;br /&gt;{&lt;br /&gt;return(x*y)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;zzz.R可以在载入包时做一些事情，这里留空。&lt;br /&gt;一个简单的包就这样做好了，是不是很简单。如果有其它需要，只要往R目录或src目录添加文件就可以了。&lt;br /&gt;安装与试验（以下步骤都在mydir目录进行）运行R CMD check once，R会检查包看是否能正确安装（并未实际安装），如果不成功会返回ERROR，并有出错信息。这个实验里会有一些warning，是因为一些目录留空的缘故，不用管它。&lt;br /&gt;运行R CMD build once，会生成一个once_0.1.tar.gz安装包，其中的数字是我在DESCRIPTION里写的版本号。&lt;br /&gt;运行R CMD INSTALL -l /home/wentrue/Rlibs once_0.1.tar.gz，就可以把包安装到mylib里。&lt;br /&gt;运行R，进入R终端；library(once)，载入刚制作的包；search()，可以看到once已经被载入。&lt;br /&gt;在R终端运行oncetest(2,3)，返回6，试验成功。&lt;br /&gt;附：我的DESCRIPTION文件内容&lt;br /&gt;&lt;br /&gt;Package: once&lt;br /&gt;Version: 0.1&lt;br /&gt;Date: 2009-07-31&lt;br /&gt;Title: Once Test&lt;br /&gt;Author: Guozhu Wen &lt;xxx@gmail.com&gt;&lt;br /&gt;Maintainer: Guozhu Wen &lt;xxx@gmail.com&gt;&lt;br /&gt;Depends: R (&gt;= 1.9.0)&lt;br /&gt;Description: A Once Test Description&lt;br /&gt;License: GPL version 2 or later&lt;br /&gt;&lt;br /&gt;参考：http://www.maths.bris.ac.uk/~maman/computerstuff/Rhelp/Rpackages.html&lt;br /&gt;&lt;br /&gt;补充：最典型的一个应用是，你已经积累下来一批自己写的常用的R函数，但又不想每次都一个个文件source进来，那么，把它们分类做成package吧，就可以像平常用其它package一样使用这些函数了，发布给别人用也方便得多。&lt;br /&gt;&lt;br /&gt;reference：http://www.wentrue.net/blog/?p=395&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-6120326291711163902?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/6120326291711163902/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2010/03/r-packagezz.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/6120326291711163902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/6120326291711163902'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2010/03/r-packagezz.html' title='R package的最简单制作ZZ'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-5493034210857079090</id><published>2010-03-25T19:24:00.001-07:00</published><updated>2010-03-25T19:24:56.253-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R Language'/><title type='text'>R程序调试–DEBUG R</title><content type='html'>1、browser(): 在脚本文件适当的位置插入browser()，重新载入模块，运行，程序会在该行中断。命令：n: step; c: continue; where: print the call back; q: quit; enter: last command；&lt;br /&gt;&lt;br /&gt;2、traceback(): 运行最后的出错信息；&lt;br /&gt;&lt;br /&gt;3、定义一个全局变量捕捉中间数据信息，比如一个全局变量a，可以在函数内a&lt;&lt;-***来给全局变量赋值；&lt;br /&gt;&lt;br /&gt;4、设定options(warn=1)，即时提示warning信息，不设置则警告信息会在程序执行完毕之后才会输出；&lt;br /&gt;&lt;br /&gt;5、try() 和tryCatch()是两个很好的处理error的函数；&lt;br /&gt;&lt;br /&gt;6、warning()输出一个警告信息，stop()函数终止程序运行并退出，geterrmessage()得到最后一次出错信息&lt;br /&gt;&lt;br /&gt;reference: http://www.wentrue.net/blog/?cat=45&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-5493034210857079090?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/5493034210857079090/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2010/03/rdebug-r.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/5493034210857079090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/5493034210857079090'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2010/03/rdebug-r.html' title='R程序调试–DEBUG R'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-2586493508474324789</id><published>2010-03-25T19:20:00.000-07:00</published><updated>2010-03-25T19:23:45.462-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R Language'/><title type='text'>VIM编辑R脚本配置ZZ</title><content type='html'>我的R脚本通常用*.R作为后缀，用VIM编辑R文件时有时会无法正确检测出文件类型来，从而无法进行正确地颜色高亮。另外，默认的配置用来编辑R脚本也不够用，翻了翻资料，作了一些简单的配置。&lt;br /&gt;&lt;br /&gt;在我的.vimrc文件里加了如下三行配置：&lt;br /&gt;&lt;br /&gt;imap &lt;c-r&gt; &lt;space&gt;&lt;-&lt;space&gt;&lt;br /&gt;autocmd FileType r set fdm=indent&lt;br /&gt;au BufNewFile,BufRead *.R set ft=r&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;说明：&lt;br /&gt;&lt;br /&gt;1、第一行是在“输入模式”下作了一个映射，把ctrl+b映射为” &lt;- “这几个字符（&lt;space&gt;指代空格符），因为R里推荐的赋值操作符是”&lt;-”，打起来很麻烦，虽然我常用的是”=”，但有时还是用得上的。&lt;br /&gt;&lt;br /&gt;2、第二行设定当文件类型是R时，把fdm这个option设置为indent，这样可以实现代码折叠，即按z+c就可以把大括号中间的部分折叠起来，编辑多函数的文件时非常方便。用:help可以查看到autocmd这个命令的定义为：autocmd [group] {event} {pattern} [nested] {cmd}，即在{event}事件触发时，如果文件名符合{pattern}模式，则执行{cmd}的命令。具体在这里就是当FileType r这个事件被触发时，执行set fdm=indent命令。&lt;br /&gt;&lt;br /&gt;3、第三行的au是autocmd的缩写，功能完全一样。这里的定义是指：当BufNewFile,BufRead事件被触发时，如果文件名为*.R，则set ft=r，自动设定好FileType，这就实现了根据文件名后缀自动检测文件类型。其它文件后缀与文件类型的绑定也可以通过这种方法来实现。&lt;br /&gt;&lt;br /&gt;4、说到文件类型的检测，还得补充几句，通常你需要默认打开文件类型检测，即设定filetype plugin indent on，可以在vim里输入:filetype查看是否已经开启。除了上述提到的在.vimrc中设定之外，还有两种方法可以设定文件类型，一种是在文件的开头或结尾加上” vim: ft=c “的注释，注意两边的空格，还有不同类型的文件有不同的注释方式；另一种方法是打开文件后直接通过:set ft=r来设定。&lt;br /&gt;&lt;br /&gt;简简单单的三行配置就使得自己的工作环境大大改善，很强大吧。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Reference: http://www.wentrue.net/blog/?p=625&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-2586493508474324789?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/2586493508474324789/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2010/03/vimrzz.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/2586493508474324789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/2586493508474324789'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2010/03/vimrzz.html' title='VIM编辑R脚本配置ZZ'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-2737594134857597893</id><published>2009-12-03T15:36:00.000-08:00</published><updated>2009-12-03T15:44:03.774-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>zgrep/grep pipeline</title><content type='html'>Table:&lt;br /&gt;&lt;br /&gt;Roosevelt  Tommy    38  54579  555-1212  &lt;br /&gt;&lt;br /&gt;Nixon      Edward   19  37583  246-3457  &lt;br /&gt;&lt;br /&gt;Roosevelt  Freddie  47  11745  674-6972  &lt;br /&gt;&lt;br /&gt;Lincoln    Albert   26  26452  916-5763  &lt;br /&gt;&lt;br /&gt;If you wanted to find all the Roosevelts and sort them by zip code, you could do it like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;grep Roosevelt people.txt &gt; grep.out&lt;br /&gt;sort +3 grep.out&lt;br /&gt;rm grep.out&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Alternately,&lt;br /&gt;&lt;code&gt;grep Roosevelt people.txt | sort +3 &gt; sort-results&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-2737594134857597893?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/2737594134857597893/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/12/zgrepgrep-pipeline.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/2737594134857597893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/2737594134857597893'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/12/zgrepgrep-pipeline.html' title='zgrep/grep pipeline'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-4647896271019677841</id><published>2009-11-25T14:11:00.000-08:00</published><updated>2009-11-25T14:25:30.301-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R Language'/><title type='text'>Common Commands (beta, Sun Grid Engine)</title><content type='html'>Please see the man pages for qsub, qalter, qstat, qdel, qhost. &lt;br /&gt;&lt;br /&gt;qsub &lt;shell script&gt; : submit a script for execution &lt;br /&gt;qlogin : request a node for interactive use: see HPC:Using qlogin &lt;br /&gt;qstat -j &lt;jobid&gt; : show the status of a job &lt;br /&gt;qdel &lt;jobid&gt; : cancel a job &lt;br /&gt;qstat -f : display all of your jobs queued or running &lt;br /&gt;qhost -j : display which jobs are on which host &lt;br /&gt;qstat -u &lt;user&gt; : display jobs queued or running for a single user &lt;br /&gt;qstat -f -u '*' : to see all jobs &lt;br /&gt;qacct -b 200810010000 -e 200810020000 -o username : show your usage statistics between those dates &lt;br /&gt;qsub -l mem_free=4G script.sh : request that there are at least 4GB RAM free on the node where your script will run &lt;br /&gt;&lt;br /&gt;qsub script&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#$ -cwd&lt;br /&gt;#$ -N yourjobname&lt;br /&gt;/usr/local/bin/R CMD BATCH&lt;br /&gt;/.../gwa_hmm/codes/gwa_hmm_chop_Chr.R&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;with -cwd option, the output will be sent to current directory;&lt;br /&gt;otherwise home directory&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-4647896271019677841?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/4647896271019677841/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/11/common-commands-beta-sun-grid-engine.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/4647896271019677841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/4647896271019677841'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/11/common-commands-beta-sun-grid-engine.html' title='Common Commands (beta, Sun Grid Engine)'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-1926200885649377902</id><published>2009-11-12T09:49:00.000-08:00</published><updated>2009-11-12T13:01:42.984-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Vector for Array</title><content type='html'>One way:&lt;br /&gt;&lt;code&gt;           vector&amp;lt; vector&amp;lt;int&gt; &gt; array(3);   //R(3)&lt;br /&gt;              for(int   i=0;i&lt;3;i++)   &lt;br /&gt;                  array[i].resize(3);   //C(3)&lt;br /&gt;                    &lt;br /&gt;              for(int   i=0;i&lt;3;i++)   &lt;br /&gt;                  for(int   j=0;j&lt;3;j++)   &lt;br /&gt;                      array[i][j]=(i*j);   &lt;br /&gt;             &lt;br /&gt;              for(int   i=0;i&lt;3;i++)   &lt;br /&gt;              {   &lt;br /&gt;                    for(int   j=0;j&lt;3;j++)   &lt;br /&gt;                        cout&amp;lt;&amp;lt;array[i][j]&amp;lt;&amp;lt;"   ";   &lt;br /&gt;                    cout&amp;lt;&amp;lt;endl;   &lt;br /&gt;                }&lt;br /&gt;  &lt;br /&gt;            array.resize(5);   //5*3&lt;br /&gt;            array[3].resize(3);   &lt;br /&gt;            array[4].resize(3);   &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Another way:&lt;br /&gt; &lt;code&gt;             int m = 5, n = 2, s = 2;&lt;br /&gt;              vector &amp;lt; vector&amp;lt;int&gt; &gt; vecInt(m, vector&amp;lt;int&gt;(n)); &lt;br /&gt;vector&amp;lt;vector&amp;lt;vector&amp;lt;int&gt; &gt; &gt; dgamma(m,vector&amp;lt;vector&amp;lt;int&gt; &gt;(n,vector&amp;lt;int&gt;(s)));&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-1926200885649377902?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/1926200885649377902/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/11/vector-for-array.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/1926200885649377902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/1926200885649377902'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/11/vector-for-array.html' title='Vector for Array'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-1941169036926259498</id><published>2009-11-04T10:01:00.001-08:00</published><updated>2009-11-04T10:02:32.822-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>C++ way to convert from a double to an int</title><content type='html'>The C++ way to convert from a double to an int is with static_cast:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;int m;&lt;br /&gt;double x;&lt;br /&gt;&lt;br /&gt;m = static_cast&amp;lt;int&gt;(x);&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-1941169036926259498?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/1941169036926259498/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/11/c-way-to-convert-from-double-to-int.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/1941169036926259498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/1941169036926259498'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/11/c-way-to-convert-from-double-to-int.html' title='C++ way to convert from a double to an int'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-2007232838816169986</id><published>2009-10-30T13:26:00.000-07:00</published><updated>2009-10-30T13:30:33.755-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>File input and output</title><content type='html'>1 output:&lt;code&gt;       &lt;br /&gt;        PrintWriter out = new PrintWriter(new FileWriter(output));&lt;br /&gt;  for(int i=0; i&amp;lt;n; i++)&lt;br /&gt;  {&lt;br /&gt;   for(int j=0; j&amp;lt;n; j++)&lt;br /&gt;   {&lt;br /&gt;    out.print(array[i][j] + "\t");&lt;br /&gt;   }&lt;br /&gt;   out.println();&lt;br /&gt;  }&lt;br /&gt;  out.flush();&lt;br /&gt;  out.close();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;2 input: &lt;code&gt;&lt;br /&gt;BufferedReader in = new BufferedReader(new FileReader("input-A"));&lt;br /&gt;  String line;&lt;br /&gt;  String s;&lt;br /&gt;  s=in.readLine();&lt;br /&gt;  int n= Integer.parseInt(s);&lt;br /&gt;  float[][] a=new float[n][n];&lt;br /&gt;  &lt;br /&gt;   for(int i=0; i&amp;lt;n; i++)&lt;br /&gt;   {&lt;br /&gt;    line=in.readLine();&lt;br /&gt;    if(line==null) break;&lt;br /&gt;    String[] tmp=line.split(" ");&lt;br /&gt;    for(int j=0; j&amp;lt;n; j++)&lt;br /&gt;    {      &lt;br /&gt;     a[i][j] = Float.parseFloat(tmp[j]);&lt;br /&gt;    }&lt;br /&gt;   }&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-2007232838816169986?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/2007232838816169986/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/10/file-input-and-output.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/2007232838816169986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/2007232838816169986'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/10/file-input-and-output.html' title='File input and output'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-1919311369548582606</id><published>2009-10-30T12:48:00.000-07:00</published><updated>2009-10-30T12:49:00.422-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java current directory</title><content type='html'>&lt;code&gt;&lt;br /&gt;public class Main&lt;br /&gt;{&lt;br /&gt;  public static void main(String[] args)&lt;br /&gt;  {&lt;br /&gt;    System.out.println("user.dir: " + System.getProperty("user.dir"));&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-1919311369548582606?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/1919311369548582606/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/10/java-current-directory.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/1919311369548582606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/1919311369548582606'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/10/java-current-directory.html' title='Java current directory'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-5079323621456607257</id><published>2009-10-24T16:59:00.000-07:00</published><updated>2009-10-24T17:05:27.360-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Convert int to string without itoa</title><content type='html'>&lt;code&gt;&lt;br /&gt;#include &amp;lt;iostream&gt;&lt;br /&gt;#include &amp;lt;sstream&gt;&lt;br /&gt;&lt;br /&gt;int main() {&lt;br /&gt;  string s="section"&lt;br /&gt;  int number = 123;&lt;br /&gt;&lt;br /&gt;  std::stringstream ss;&lt;br /&gt;  ss &lt;&lt; s &lt;&lt; number;&lt;br /&gt;&lt;br /&gt;  std::cout &lt;&lt; ss.str() &lt;&lt; endl;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-5079323621456607257?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/5079323621456607257/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/10/convert-int-to-string-without-itoa.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/5079323621456607257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/5079323621456607257'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/10/convert-int-to-string-without-itoa.html' title='Convert int to string without itoa'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-2237041123878102110</id><published>2009-10-21T21:07:00.001-07:00</published><updated>2009-10-25T16:50:13.156-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R Language'/><title type='text'>Call C from R</title><content type='html'>&lt;a href=http://cos.name/bbs/read.php?tid=14434&amp;fpage=3&gt;http://cos.name/bbs/read.php?tid=14434&amp;fpage=3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=http://www.math.ncu.edu.tw/~chenwc/R_note/index.php?item=loop&gt;http://www.math.ncu.edu.tw/~chenwc/R_note/index.php?item=loop&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-2237041123878102110?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/2237041123878102110/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/10/win-xprc.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/2237041123878102110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/2237041123878102110'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/10/win-xprc.html' title='Call C from R'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-2620363703459345936</id><published>2009-10-17T13:27:00.000-07:00</published><updated>2009-10-17T13:56:03.339-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>C++ Algorithms: next_permutation()</title><content type='html'>&lt;code&gt;&lt;br /&gt;template &lt;class BidirectionalIterator&gt;&lt;br /&gt;bool next_permutation(BidirectionalIterator first, BidirectionalIterator last) {&lt;br /&gt; if (first == last) return false; //空范围&lt;br /&gt; BidirectionalIterator i = first;&lt;br /&gt; ++i;&lt;br /&gt; if (i == last) return false; //只有一个元素&lt;br /&gt; i = last; &lt;br /&gt; --i;&lt;br /&gt; for(;;) {&lt;br /&gt;  BidirectionalIterator ii = i--; //相邻元素&lt;br /&gt;  if (*i &lt;*ii) { //如果前一个小&lt;br /&gt;   BidirectionalIterator j = last;&lt;br /&gt;   while (!(*i &lt;*--j)); //从末尾找,直到遇上比*i大的元素&lt;br /&gt;   iter_swap(i, j); //交换&lt;br /&gt;   reverse(ii, last); //重排&lt;br /&gt;   return true;&lt;br /&gt;  }&lt;br /&gt;  if (i == first) { //进行最前面了&lt;br /&gt;   reverse(first, last);&lt;br /&gt;   return false;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;/* Once iterators i and ii have been properly located, there are still a few more steps left. The next step is to again start searching from the end of the sequence for the first member that is greater than or equal to the member pointed to by i. Because of the previous search for i and ii, we know that at worst the search will end at ii, but it might end earlier. Once this member is located, it is pointed to by iterator j.&lt;br /&gt;&lt;br /&gt;Once these three iterators are located, there are only two more simple steps. First, a call is made to &lt;code&gt;iter_swap( i, j )&lt;/code&gt;. This simply swaps the members pointed to by i and j. Finally, a call is made to &lt;code&gt;reverse( ii, last )&lt;/code&gt;. This has the effect of reversing the sequence that starts at ii and ends at the end of the sequence. */&lt;br /&gt;&lt;br /&gt;Reference: "http://marknelson.us/2002/03/01/next-permutation"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-2620363703459345936?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/2620363703459345936/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/10/c-algorithms-nextpermutation.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/2620363703459345936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/2620363703459345936'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/10/c-algorithms-nextpermutation.html' title='C++ Algorithms: next_permutation()'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-4599802654913912796</id><published>2009-10-09T11:42:00.000-07:00</published><updated>2009-10-09T11:59:56.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Random numbers - API</title><content type='html'>1. java.util.Random class&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import java.util.Random; // Only the Random class&lt;br /&gt;Random r = new Random(); // Default seed comes from system time.&lt;br /&gt;int i = r.nextInt(int n); //Returns random int &gt;= 0 and &lt; n&lt;br /&gt;int i = r.nextInt();  //Returns random int (full range)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Example: Generating a number from 1 to 6&lt;br /&gt;&lt;br /&gt;Because nextInt(6) returns a number from 0-5, it's necessary to add 1 to scale the number into the range 1-6,&lt;br /&gt;&lt;code&gt;&lt;br /&gt;static Random randGen = new Random();&lt;br /&gt;int spots = randGen.nextInt(6) + 1;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;2. Math.random() method&lt;br /&gt;&lt;br /&gt;The Math.random() method returns random double numbers in the range &gt;=0.0 to &lt;1.0 .&lt;br /&gt;For example, if you need an int int the range 1 to 10, the following code could be used.&lt;br /&gt;&lt;code&gt;int n = (int)(10.0 * Math.random()) + 1;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-4599802654913912796?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/4599802654913912796/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/10/random-numbers-api.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/4599802654913912796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/4599802654913912796'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/10/random-numbers-api.html' title='Random numbers - API'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-1957161817915993274</id><published>2009-09-19T13:49:00.002-07:00</published><updated>2009-09-19T13:53:45.007-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>获得路径下的所有文件名</title><content type='html'>&lt;code&gt;#include “sys/types.h“&lt;br /&gt;#include “dirent.h“&lt;br /&gt;#include “stdio.h“&lt;br /&gt;&lt;br /&gt;int main( int argc,char *argv[] )&lt;br /&gt;{&lt;br /&gt;   DIR   *dp;&lt;br /&gt;   struct dirent *dirp;&lt;br /&gt;   if( argc != 2 )&lt;br /&gt;   {&lt;br /&gt;      printf("error:need argument!\n");&lt;br /&gt;      return 0;&lt;br /&gt;   }&lt;br /&gt;   if ( ( dp = opendir(argv[1]) ) == NULL )&lt;br /&gt;   {&lt;br /&gt;      printf("can't open dir %s\n",argv[1] );&lt;br /&gt;      return 0;&lt;br /&gt;   }&lt;br /&gt;   while ( (dirp = readdir (dp)) != NULL )&lt;br /&gt;   {&lt;br /&gt;      printf("%s\n",dirp-&gt;d_name);&lt;br /&gt;   }&lt;br /&gt;   closedir(dp);&lt;br /&gt;   return 0;&lt;br /&gt;}&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-1957161817915993274?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/1957161817915993274/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/09/blog-post_19.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/1957161817915993274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/1957161817915993274'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/09/blog-post_19.html' title='获得路径下的所有文件名'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-3322896650666372853</id><published>2009-08-24T17:07:00.000-07:00</published><updated>2009-08-24T17:13:07.069-07:00</updated><title type='text'>ThinkVantage的恢复</title><content type='html'>你在系统里面装一下IBM的rescure and recovery，再装ThinkVantage Productivity Center就好了，前者是安装恢复系统，后者是在XP下ThinkVantage键激活，主要原因是你分区后，破坏了硬盘的主引导分区MBR。原来的MBR中保留着对thinkvantage键的相应，你重新分区后就没有了。&lt;br /&gt;&lt;br /&gt;如果你的机器的隐藏分区还在，只是你按thinkvantage进不去了，恢复方法如下：&lt;br /&gt;&lt;br /&gt;1、 复制bmgr32.exe和bootmgr.bin（在隐藏分区里搜）到C盘根目录下，然后进入CMD，在C盘根目录下运行：bmgr32 /fc:bootmgr.bin /m2 /ibm，如果没有任何信息提示即运行完毕，恭喜你，可以恢复出厂设置了。 &lt;br /&gt;&lt;br /&gt;2、重新启动，按 Access IBM 后再按tinkvange或 F11 就能进入恢复出厂设置的界面了。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-3322896650666372853?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/3322896650666372853/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/08/thinkvantage.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/3322896650666372853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/3322896650666372853'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/08/thinkvantage.html' title='ThinkVantage的恢复'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-6328144794291179342</id><published>2009-08-24T14:48:00.000-07:00</published><updated>2009-08-24T15:03:20.930-07:00</updated><title type='text'>Vista home版管理员权限</title><content type='html'>开始--程序--附件-命令提示符-右键(以管理员方式运行），在命令行状态下输入：&lt;br /&gt;net user Administrator /Active:Yes （启用administrator帐户）&lt;br /&gt;回车会出现成功字样，然后关闭，注销。&lt;br /&gt;&lt;br /&gt;同样，当你想要禁用Windows Vista中的Administrator账户的时候，只需像上面一样操作，只不过最后在命令行中输入的是“net user Administrator /Active:no”罢了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-6328144794291179342?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/6328144794291179342/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/08/vista-home.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/6328144794291179342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/6328144794291179342'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/08/vista-home.html' title='Vista home版管理员权限'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-8896834749080391453</id><published>2009-06-03T01:10:00.000-07:00</published><updated>2009-06-03T01:11:24.987-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JTextPane的视返回</title><content type='html'>在写记事本的时候发现，textpane.setCaretPosition和textarea.setCaretPosition有偏差（每行差1），而debug时getText的换行符都是'\r\n'，毫无差别。其实问题就出在怀疑的地方，因为textPane.getText()返回的String含'\r',并紧跟着一个'\n',但是这是视返回的，不是文档返回的，而文档只包含'\n',于是把&lt;br /&gt;&lt;br /&gt;&lt;code&gt;textPane.getText();&lt;/code&gt;换成   &lt;br /&gt;&lt;code&gt;textPane.getDocument().getText(0, textPane.getDocument().getLength());&lt;/code&gt;&lt;br /&gt;   &lt;br /&gt;这样，不管有没有'\r'也都是对的啦,而textarea.setCaretPosition并不受到换行符的影响，不晓得为什么这样。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-8896834749080391453?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/8896834749080391453/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/06/jtextpane.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/8896834749080391453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/8896834749080391453'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/06/jtextpane.html' title='JTextPane的视返回'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-3160484150719538515</id><published>2009-06-02T18:43:00.000-07:00</published><updated>2009-06-02T18:53:49.959-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JTextPane Java关键字变色</title><content type='html'>&lt;code&gt;import java.util.StringTokenizer;&lt;br /&gt;&lt;br /&gt;import java.awt.*;&lt;br /&gt;import java.awt.event.*;&lt;br /&gt;&lt;br /&gt;import javax.swing.*;&lt;br /&gt;import javax.swing.text.*;&lt;br /&gt;import javax.swing.event.*;&lt;br /&gt;import javax.swing.text.rtf.RTFEditorKit;&lt;br /&gt;&lt;br /&gt;public class MyTextPane extends JTextPane {&lt;br /&gt;&lt;br /&gt;    protected StyleContext m_context;&lt;br /&gt;    protected DefaultStyledDocument m_doc;&lt;br /&gt;    private   MutableAttributeSet keyAttr,normalAttr;&lt;br /&gt;    private   MutableAttributeSet inputAttributes =&lt;br /&gt;                new RTFEditorKit().getInputAttributes();&lt;br /&gt;&lt;br /&gt; private String[] keyWord={"int","float"};&lt;br /&gt;&lt;br /&gt;    public MyTextPane() {&lt;br /&gt;        super();&lt;br /&gt;        m_context = new StyleContext();&lt;br /&gt;        m_doc = new DefaultStyledDocument(m_context);&lt;br /&gt;        this.setDocument(m_doc);&lt;br /&gt;&lt;br /&gt;        this.addKeyListener(new KeyAdapter() {&lt;br /&gt;            public void keyReleased(KeyEvent ke) {&lt;br /&gt;                syntaxParse();&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;//定义关键字显示属性&lt;br /&gt;        keyAttr = new SimpleAttributeSet();&lt;br /&gt;        StyleConstants.setForeground(keyAttr, Color.green);&lt;br /&gt;&lt;br /&gt;//定义一般文本显示属性&lt;br /&gt;        normalAttr = new SimpleAttributeSet();&lt;br /&gt;        StyleConstants.setForeground(normalAttr, Color.blue);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void syntaxParse() {&lt;br /&gt;        try {&lt;br /&gt;            String s = null;&lt;br /&gt;            Element root = m_doc.getDefaultRootElement();&lt;br /&gt;&lt;br /&gt;            int cursorPos = this.getCaretPosition();    &lt;br /&gt;            int line = root.getElementIndex(cursorPos); &lt;br /&gt;&lt;br /&gt;            Element para = root.getElement(line);&lt;br /&gt;            int start = para.getStartOffset();&lt;br /&gt;            int end = para.getEndOffset() - 1;&lt;br /&gt;            s = m_doc.getText(start, end - start);&lt;br /&gt;&lt;br /&gt;            int i = 0;&lt;br /&gt;            int xStart = 0;&lt;br /&gt;&lt;br /&gt;//分析关键字---&lt;br /&gt;            m_doc.setCharacterAttributes(start, s.length(),normalAttr, false);&lt;br /&gt;            MyStringTokenizer st = new MyStringTokenizer(s);&lt;br /&gt;            while( st.hasMoreTokens()) {&lt;br /&gt;                s = st.nextToken();&lt;br /&gt;                if ( s == null) return;&lt;br /&gt;                for (i = 0; i &lt; keyWord.length; i++ ) {&lt;br /&gt;                    if (s.equals(keyWord[i])) break;&lt;br /&gt;                }&lt;br /&gt;                if ( i &gt;= keyWord.length ) continue;&lt;br /&gt;&lt;br /&gt;                xStart = st.getCurrPosition();&lt;br /&gt;&lt;br /&gt;                //设置关键字显示属性&lt;br /&gt;                m_doc.setCharacterAttributes(start+xStart, s.length(),&lt;br /&gt;                                             keyAttr, false);&lt;br /&gt;            }&lt;br /&gt;            inputAttributes.addAttributes(normalAttr);&lt;br /&gt;        } catch (Exception ex) {&lt;br /&gt;            ex.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        JFrame frame = new JFrame("test text pane");&lt;br /&gt;        frame.getContentPane().add(new MyTextPane());&lt;br /&gt;        WindowListener wndCloser = new WindowAdapter() {&lt;br /&gt;            public void windowClosing(WindowEvent e) {&lt;br /&gt;                System.exit(0);&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;        frame.addWindowListener(wndCloser);&lt;br /&gt;        final int inset = 50;&lt;br /&gt;        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();&lt;br /&gt;        frame.setBounds ( inset, inset, screenSize.width - inset*2, screenSize.height - inset*2 );&lt;br /&gt;        frame.show();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*在分析字符串的同时，记录每个token所在的位置&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;class MyStringTokenizer extends StringTokenizer{&lt;br /&gt;    String sval = " ";&lt;br /&gt;    String oldStr,str;&lt;br /&gt;    int m_currPosition = 0,m_beginPosition=0;&lt;br /&gt;    MyStringTokenizer(String str) {&lt;br /&gt;        super(str," ");&lt;br /&gt;        this.oldStr = str;&lt;br /&gt;        this.str = str;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String nextToken() {&lt;br /&gt;       try {&lt;br /&gt;           String s = super.nextToken();&lt;br /&gt;           int pos = -1;&lt;br /&gt;&lt;br /&gt;           if (oldStr.equals(s)) {&lt;br /&gt;               return s;&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;           pos = str.indexOf(s + sval);&lt;br /&gt;           if ( pos == -1) {&lt;br /&gt;               pos = str.indexOf(sval + s);&lt;br /&gt;               if ( pos == -1)&lt;br /&gt;                   return null;&lt;br /&gt;               else pos += 1;&lt;br /&gt;           }&lt;br /&gt;&lt;br /&gt;           int xBegin = pos + s.length();&lt;br /&gt;           str = str.substring(xBegin);&lt;br /&gt;&lt;br /&gt;           m_currPosition = m_beginPosition + pos;&lt;br /&gt;           m_beginPosition = m_beginPosition + xBegin;&lt;br /&gt;           return s;&lt;br /&gt;       } catch (java.util.NoSuchElementException ex) {&lt;br /&gt;           ex.printStackTrace();&lt;br /&gt;           return null;&lt;br /&gt;       }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   //返回token在字符串中的位置&lt;br /&gt;   public int getCurrPosition() {&lt;br /&gt;       return m_currPosition;&lt;br /&gt;   }&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;出处：http://blog.csdn.net/raphaelxia/archive/2006/02/12/597465.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-3160484150719538515?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/3160484150719538515/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/06/jtextpane-java.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/3160484150719538515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/3160484150719538515'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/06/jtextpane-java.html' title='JTextPane Java关键字变色'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-5886186737598110018</id><published>2009-05-31T18:53:00.000-07:00</published><updated>2009-05-31T18:56:26.446-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java定时器</title><content type='html'>a,编写类,实现TimeTask接口，定时执行的代码写入run()方法中&lt;br /&gt;&lt;code&gt;class XXXTask extends TimerTask {&lt;br /&gt;  public void run() {&lt;br /&gt;   do something...&lt;br /&gt;  }&lt;br /&gt; }&lt;/code&gt;    &lt;br /&gt;&lt;br /&gt;b. Timer timer = new Timer();  &lt;br /&gt;timer.schedule(TimeTask子类对象, 开始执行的Date, 毫秒周期);&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-5886186737598110018?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/5886186737598110018/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/05/java.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/5886186737598110018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/5886186737598110018'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/05/java.html' title='Java定时器'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-8193460143155684524</id><published>2009-05-23T03:50:00.001-07:00</published><updated>2009-05-23T03:50:45.631-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JTABLE如何刷新数据</title><content type='html'>需要在JTable中显示内容添加到javax.swing.table.DefaultTableModel类的对象中，使用javax.swing.JTable类中的void setModel(TableModel dataModel)方法，将DefaultTableModel的对象作为参数传入到setModel方法中即可。&lt;br /&gt;e.g: &lt;code&gt;table.setModel(new BookTableModel(...));&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-8193460143155684524?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/8193460143155684524/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/05/jtable.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/8193460143155684524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/8193460143155684524'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/05/jtable.html' title='JTABLE如何刷新数据'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-7736955169676053810</id><published>2009-05-23T03:48:00.000-07:00</published><updated>2009-05-23T03:49:41.798-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>java读取文本文件(txt)</title><content type='html'>&lt;code&gt;public void ReadData(){ &lt;br /&gt;  try { &lt;br /&gt;   FileReader read = new FileReader("D:/data.txt"); &lt;br /&gt;   BufferedReader br = new BufferedReader(read); &lt;br /&gt;   String row; &lt;br /&gt;   while((row = br.readLine())!=null){ &lt;br /&gt;    System.out.println(row); &lt;br /&gt;   } &lt;br /&gt;  } catch (FileNotFoundException e) { &lt;br /&gt;   e.printStackTrace(); &lt;br /&gt;  } catch (IOException e){ &lt;br /&gt;   e.printStackTrace(); &lt;br /&gt;  } &lt;br /&gt;} &lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-7736955169676053810?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/7736955169676053810/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/05/javatxt.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/7736955169676053810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/7736955169676053810'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/05/javatxt.html' title='java读取文本文件(txt)'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-363810223189331148</id><published>2009-05-23T03:45:00.000-07:00</published><updated>2009-05-23T03:52:45.277-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java中split的反斜杠（“\”）问题</title><content type='html'>在Java中处理一些路径相关的问题的时候，如：上传文件路径为：C:\Documents and Settings\My Documents\ww\桌面\map4.gif，欲取出文件名：map4.gif。可以&lt;br /&gt;&lt;code&gt;String temp[] = name.split("\\\\");&lt;br /&gt;if (temp.length &gt; 1) {&lt;br /&gt;name = temp[temp.length - 1];&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;regex为\\\\，因为在java中\\表示一个\，而regex中\\也表示\，所以当\\\\解析成regex的时候为\\。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-363810223189331148?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/363810223189331148/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/05/javasplit.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/363810223189331148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/363810223189331148'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/05/javasplit.html' title='Java中split的反斜杠（“\”）问题'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-7930875548791817726</id><published>2009-03-19T18:07:00.000-07:00</published><updated>2009-03-19T18:11:51.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java中UUID的使用</title><content type='html'>UUID又称为通用唯一标识符(Universally Unique Identifier)，是一个128位长的数字，一般用16进制表示，算法的核心思想是结合机器的网卡、当前时间和一个随机数来生成 UUID。UUID的应用非常广泛，比如Hibernate中ID Generator中的一种实现就是UUID。在系统中需要用到随机数的地方都可以考虑采用UUID算法。&lt;br /&gt;&lt;br /&gt;在Java1.5中，已经包含了一个UUID的实现java.util.UUID。要随机生成一个UUID，代码为：&lt;code&gt;String uuid = UUID.randomUUID().toString();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;如果系统中采用了Hibernate框架，也可以用Hibernate的UUIDHexGenerator。代码为：&lt;br /&gt;&lt;code&gt;String uuid = (String)new UUIDHexGenerator().generate(null, null);&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-7930875548791817726?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/7930875548791817726/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/03/javauuid.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/7930875548791817726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/7930875548791817726'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/03/javauuid.html' title='Java中UUID的使用'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-6435777317814727871</id><published>2009-03-19T00:38:00.000-07:00</published><updated>2009-03-19T00:40:25.168-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JDBC</title><content type='html'>&lt;strong&gt;一. 使用JDBC的五个步骤&lt;/strong&gt;&lt;br /&gt; 1.注册driver&lt;br /&gt;  (1). Class.forName("oracle.jdbc.driver.OracleDriver");&lt;br /&gt;   Connection conn=DriverManager.getConnection(url,"kettas","19851127");&lt;br /&gt;  (2). Driver driver=new oracle.jdbc.driver.OracleDriver();&lt;br /&gt;   DriverManager.registerDriver(driver);&lt;br /&gt;  (3). java -Djdbc.drivers=xxxxxxxxxx&lt;br /&gt; 2.连接db&lt;br /&gt;  String url=” oracle:jdbc:thin:@127.0.0.1:1525:XE”;&lt;br /&gt;  Connection conn=DriverManager.getConnection(url,"kettas","19851127");&lt;br /&gt;  &lt;br /&gt; 3.执行sql语句&lt;br /&gt;  Statement stm=conn.createStatement();&lt;br /&gt;  stm.execute(“sql”);&lt;br /&gt; 4.返回结果集&lt;br /&gt;  ResultSet rs=stm.executeQuery("select id,sid,name from students");&lt;br /&gt;  while(rs.next()) {&lt;br /&gt;    System.out.print(rs.getInt(1)+"\t");&lt;br /&gt;    System.out.print(rs.getInt(2)+"\t");&lt;br /&gt;    System.out.println(rs.getString(3));&lt;br /&gt;    System.out.println("--------------------");&lt;br /&gt;  }&lt;br /&gt; 5.释放资源&lt;br /&gt;  xxx.close();&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;二.Statement对象的三个execute方法&lt;/strong&gt;&lt;br /&gt; 1. execute() 返回boolean,是否有结果集&lt;br /&gt;  stm. getResultSet()&lt;br /&gt; 2. executeQuery() 返回ResultSet&lt;br /&gt; 3.executeUpdate() 返回 int,影响的行数&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;三. PreparedStatement&lt;/strong&gt;&lt;br /&gt; 同构的sql语句使用,有预编译&lt;br /&gt; 有变量的sql语句中简化书写&lt;br /&gt; sql语句在oracle的执行过程&lt;br /&gt;  1.语法检查 2. 权限检查 3.转化sql语句为内部指令  ----编译&lt;br /&gt;  4.执行&lt;br /&gt; PreparedStatement pstm = conn.preparedStatement(“insert into students values(1,?,?)”);&lt;br /&gt; pstm.setString(1,变量 )&lt;br /&gt; pstm.setString(2, 变量)&lt;br /&gt; pstm.executeUpdate();&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;四. Connection工厂&lt;/strong&gt;&lt;br /&gt;package com.kettas.raiha;&lt;br /&gt;&lt;br /&gt;import java.util.*;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.sql.*;&lt;br /&gt;&lt;br /&gt;public class JDBCUtil {&lt;br /&gt; private static Properties env=new Properties();&lt;br /&gt; static {&lt;br /&gt;  InputStream is=JDBCUtil.class.getResourceAsStream("connection.properties");&lt;br /&gt;  try {&lt;br /&gt;   env.load(is);&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;   System.out.println("ERROR! Can't find file : connection.properties.");&lt;br /&gt;   throw new ExceptionInInitializerError(e);&lt;br /&gt;  } finally {&lt;br /&gt;   if(is!=null)try { is.close();} catch (IOException e) {e.printStackTrace();}&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public static Connection getConnection() throws ClassNotFoundException, SQLException{&lt;br /&gt;  Connection conn=null;&lt;br /&gt;  try{&lt;br /&gt;   Class.forName(  env.getProperty("driver") );&lt;br /&gt;  } catch (ClassNotFoundException e) {&lt;br /&gt;   System.out.println("Mabey connection.properties file error");&lt;br /&gt;   throw e;&lt;br /&gt;  }&lt;br /&gt;  conn=DriverManager.getConnection(env.getProperty("url"),env.getProperty("username"), env.getProperty("password"));&lt;br /&gt;  return conn;&lt;br /&gt; }&lt;br /&gt; /*&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  try {&lt;br /&gt;   JDBCUtil.getConnection();&lt;br /&gt;  } catch (ClassNotFoundException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } catch (SQLException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ThreadLocal&lt;/strong&gt;&lt;br /&gt; 保证线程中的对象唯一的方法;&lt;br /&gt; 每个线程中包含一个Map,以ThreadLoacal为key,用set()存值;&lt;br /&gt; get()方法获得本线程中Map的值&lt;br /&gt; t1 = new ThreadLocal();&lt;br /&gt; t1.set( i ) ;&lt;br /&gt; t1.get();&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;事物&lt;/strong&gt;&lt;br /&gt; conn.setAutoCommint(false);&lt;br /&gt; conn.commint();&lt;br /&gt; conn,rollback();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-6435777317814727871?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/6435777317814727871/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/03/jdbc.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/6435777317814727871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/6435777317814727871'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/03/jdbc.html' title='JDBC'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-5561029768510094680</id><published>2009-03-19T00:25:00.000-07:00</published><updated>2009-03-19T00:35:48.645-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Log4j</title><content type='html'>&lt;strong&gt;代码中:&lt;/strong&gt;&lt;br /&gt;1.得到Logger对象&lt;br /&gt;Logger logger=Logger.getRootLogger();&lt;br /&gt;Logger logger=Logger.getLogger(test.class);&lt;br /&gt;2.读取配置&lt;br /&gt;(1)使用默认配置:&lt;br /&gt;BasicConfigurator.configure();&lt;br /&gt;(2)读取配置文件&lt;br /&gt;PropertyConfigurator.configure("mylog4j.properties");&lt;br /&gt;3.插入记录信息&lt;br /&gt;Logger.debug ( Object message ) ; &lt;br /&gt;Logger.info ( Object message ) ; &lt;br /&gt;Logger.warn ( Object message ) ; &lt;br /&gt;Logger.error ( Object message ) ; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;配置文件参考:&lt;/strong&gt;&lt;br /&gt;rootLogger&lt;br /&gt;#其中level就是设置需要输出信息的级别，后面是appender的输出的目的&lt;br /&gt;#log4j.rootLogger=[level],appenderName, ...，&lt;br /&gt;log4j.rootLogger=debug, stdout, R&lt;br /&gt;&lt;br /&gt;LEVEL&lt;br /&gt;level是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。&lt;br /&gt;Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG&lt;br /&gt;&lt;br /&gt;appender&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;#配置日志信息输出目的地Appender&lt;br /&gt;log4j.appender.stdout=org.apache.log4j.ConsoleAppender&lt;br /&gt;#配置日志信息的格式（布局）&lt;br /&gt;log4j.appender.stdout.layout=org.apache.log4j.PatternLayout&lt;br /&gt;#Pattern to output the caller's file name and line number.&lt;br /&gt;log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n&lt;br /&gt;#配置另一个Appender:R&lt;br /&gt;log4j.appender.R=org.apache.log4j.RollingFileAppender&lt;br /&gt;log4j.appender.R.File=example.log&lt;br /&gt;log4j.appender.R.MaxFileSize= 100KB&lt;br /&gt;# Keep one backup file&lt;br /&gt;log4j.appender.R.MaxBackupIndex=1&lt;br /&gt;log4j.appender.R.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Log4j提供的appender&lt;br /&gt;  org.apache.log4j.ConsoleAppender（控制台）&lt;br /&gt;  org.apache.log4j.FileAppender（文件）&lt;br /&gt;  org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）&lt;br /&gt;  org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生新文件）&lt;br /&gt;  org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）&lt;br /&gt;&lt;br /&gt;Log4j提供的layout&lt;br /&gt;  org.apache.log4j.HTMLLayout（以HTML表格形式布局）&lt;br /&gt;  org.apache.log4j.PatternLayout（可以灵活地指定布局模式）&lt;br /&gt;  org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串）&lt;br /&gt;  org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）&lt;br /&gt;&lt;br /&gt;log4j的PatternLayout参数含义&lt;br /&gt;Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下： &lt;br /&gt;%m 输出代码中指定的消息  &lt;br /&gt;%p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL &lt;br /&gt;%r 输出自应用启动到输出该log信息耗费的毫秒数 &lt;br /&gt;%c 输出所属的类目，通常就是所在类的全名 &lt;br /&gt;%t 输出产生该日志事件的线程名 &lt;br /&gt;%n 输出一个回车换行符，Windows平台为“\r\n”，Unix平台为“\n” &lt;br /&gt;%d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：  &lt;br /&gt;%d{yyy MMM dd HH:mm:ss,SSS}，输出类似： 2002年10月18日 22：10：28，921 &lt;br /&gt;%l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;一个比较全的配置文件例子&lt;/strong&gt;&lt;br /&gt;log4j.rootLogger=DEBUG,CONSOLE,DATABASE,FILE &lt;br /&gt;log4j.addivity.org.apache=true &lt;br /&gt;&lt;br /&gt;# 应用于控制台 &lt;br /&gt;log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender &lt;br /&gt;log4j.appender.CONSOLE.Threshold=INFO &lt;br /&gt;log4j.appender.CONSOLE.Target=System.out &lt;br /&gt;log4j.appender.CONSOLE.Encoding=GBK &lt;br /&gt;log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout &lt;br /&gt;log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n &lt;br /&gt;&lt;br /&gt;# 用于数据库 &lt;br /&gt;log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender &lt;br /&gt;log4j.appender.DATABASE.URL=jdbc:oracle:thin:@192.168.0.103:1521:ORCL &lt;br /&gt;log4j.appender.DATABASE.driver=oracle.jdbc.driver.OracleDriver &lt;br /&gt;log4j.appender.DATABASE.user=Nation &lt;br /&gt;log4j.appender.DATABASE.password=1 &lt;br /&gt;log4j.appender.CONSOLE.Threshold=WARN &lt;br /&gt;log4j.appender.DATABASE.sql=INSERT INTO LOG4J(stamp,thread, infolevel,class,messages) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m') &lt;br /&gt;# INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') &lt;br /&gt;# 写入数据库中的表LOG4J的Message字段中，内容％d（日期）%c: 日志信息所在地（类名）%p: 日志信息级别%m: 产生的日志具体信息 %n: 输出日志信息换行 &lt;br /&gt;log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout &lt;br /&gt;log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n &lt;br /&gt;&lt;br /&gt;# 每天新建日志 &lt;br /&gt;log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender &lt;br /&gt;log4j.appender.A1.File=C:/log4j/log &lt;br /&gt;log4j.appender.A1.Encoding=GBK &lt;br /&gt;log4j.appender.A1.Threshold=DEBUG &lt;br /&gt;log4j.appender.A1.DatePattern='.'yyyy-MM-dd &lt;br /&gt;log4j.appender.A1.layout=org.apache.log4j.PatternLayout &lt;br /&gt;log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n &lt;br /&gt;&lt;br /&gt;#应用于文件 &lt;br /&gt;log4j.appender.FILE=org.apache.log4j.FileAppender &lt;br /&gt;log4j.appender.FILE.File=C:/log4j/file.log &lt;br /&gt;log4j.appender.FILE.Append=false &lt;br /&gt;log4j.appender.FILE.Encoding=GBK &lt;br /&gt;log4j.appender.FILE.layout=org.apache.log4j.PatternLayout &lt;br /&gt;log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n &lt;br /&gt;&lt;br /&gt;# 应用于文件回滚 &lt;br /&gt;log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender &lt;br /&gt;log4j.appender.ROLLING_FILE.Threshold=ERROR &lt;br /&gt;log4j.appender.ROLLING_FILE.File=rolling.log &lt;br /&gt;log4j.appender.ROLLING_FILE.Append=true &lt;br /&gt;log4j.appender.CONSOLE_FILE.Encoding=GBK &lt;br /&gt;log4j.appender.ROLLING_FILE.MaxFileSize=10KB &lt;br /&gt;log4j.appender.ROLLING_FILE.MaxBackupIndex=1 &lt;br /&gt;log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout &lt;br /&gt;log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n &lt;br /&gt;&lt;br /&gt;#自定义Appender &lt;br /&gt;log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender &lt;br /&gt;log4j.appender.im.host = mail.cybercorlin.net &lt;br /&gt;log4j.appender.im.username = username &lt;br /&gt;log4j.appender.im.password = password &lt;br /&gt;log4j.appender.im.recipient = yyflyons@163.com &lt;br /&gt;log4j.appender.im.layout=org.apache.log4j.PatternLayout &lt;br /&gt;log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n &lt;br /&gt;&lt;br /&gt;#应用于socket &lt;br /&gt;log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender &lt;br /&gt;log4j.appender.SOCKET.RemoteHost=localhost &lt;br /&gt;log4j.appender.SOCKET.Port=5001 &lt;br /&gt;log4j.appender.SOCKET.LocationInfo=true &lt;br /&gt;# Set up for Log Facter 5 &lt;br /&gt;log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout &lt;br /&gt;log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n &lt;br /&gt;# Log Factor 5 Appender &lt;br /&gt;log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender &lt;br /&gt;log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 &lt;br /&gt;&lt;br /&gt;# 发送日志给邮件 &lt;br /&gt;log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender &lt;br /&gt;log4j.appender.MAIL.Threshold=FATAL &lt;br /&gt;log4j.appender.MAIL.BufferSize=10 &lt;br /&gt;log4j.appender.MAIL.From=yyflyons@163.com &lt;br /&gt;log4j.appender.MAIL.SMTPHost=www.wusetu.com &lt;br /&gt;log4j.appender.MAIL.Subject=Log4J Message &lt;br /&gt;log4j.appender.MAIL.To=yyflyons@126.com &lt;br /&gt;log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout &lt;br /&gt;log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-5561029768510094680?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/5561029768510094680/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/03/log4j.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/5561029768510094680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/5561029768510094680'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/03/log4j.html' title='Log4j'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-6939823850231973033</id><published>2009-03-19T00:17:00.000-07:00</published><updated>2009-03-19T00:24:01.163-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Tomcat配置三点</title><content type='html'>&lt;strong&gt;1. 如何加大tomcat连接数&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;在tomcat配置文件server.xml中的&amp;lt;Connector ... /&amp;gt;配置中，和连接数相关的参数有：&lt;br /&gt;minProcessors：最小空闲连接线程数，用于提高系统处理性能，默认值为10&lt;br /&gt;maxProcessors：最大连接线程数，即：并发处理的最大请求数，默认值为75&lt;br /&gt;acceptCount：允许的最大连接数，应大于等于maxProcessors，默认值为100&lt;br /&gt;enableLookups：是否反查域名，取值为：true或false。为了提高处理能力，应设置为false&lt;br /&gt;connectionTimeout：网络连接超时，单位：毫秒。设置为0表示永不超时，这样设置有隐患的。通常可设置为30000毫秒。&lt;br /&gt;&lt;br /&gt;其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数，应同时加大这两个参数。&lt;br /&gt;&lt;br /&gt;web server允许的最大连接数还受制于操作系统的内核参数设置，通常Windows是2000个左右，Linux是1000个左右。Unix中如何设置这些参数，请参阅Unix常用监控和管理命令 &lt;br /&gt;&lt;br /&gt;tomcat4中的配置示例：&lt;br /&gt;&amp;lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"&lt;br /&gt;port="8080" minProcessors="10" maxProcessors="1024"&lt;br /&gt;enableLookups="false" redirectPort="8443"&lt;br /&gt;acceptCount="1024" debug="0" connectionTimeout="30000" /&amp;gt;&lt;br /&gt;&lt;br /&gt;对于其他端口的侦听配置，以此类推。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. tomcat中如何禁止列目录下的文件&lt;/strong&gt;&lt;br /&gt;在{tomcat_home}/conf/web.xml中，把listings参数设置成false即可，如下：&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;listings&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/init-param&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/servlet&amp;gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3. 如何加大tomcat可以使用的内存&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，需要调大。&lt;br /&gt;&lt;br /&gt;Unix下，在文件{tomcat_home}/bin/catalina.sh的前面，增加如下设置：&lt;br /&gt;JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'&lt;br /&gt;需要把这个两个参数值调大。例如：&lt;br /&gt;JAVA_OPTS='-Xms256m -Xmx512m'&lt;br /&gt;表示初始化内存为256MB，可以使用的最大内存为512MB &lt;br /&gt;&lt;br /&gt;大家都知道，JAVA程序启动时都会JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候，JVM是要先去做垃圾回收的动作，释放被占用的一些内存。&lt;br /&gt;    所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明，一般的JAVA程序在运行都可以通过中-Xms -Xmx来调整应用程序的初始内存和最大内存: &lt;br /&gt;   如：java -Xms64m  -Xmx128m  a.jar.&lt;br /&gt;   tomcat的启动程序是包装过的，不能直接使用java -X..... tomcat.*来改变内存的设置。在Tomcat在改变这个设置&lt;br /&gt;有两种方法：&lt;br /&gt;1. 就需要在环境变量中加上TOMCAT_OPTS, CATALINA_OPTS两个属性，&lt;br /&gt;    如 SET  CATALINA_OPTS= -Xms64m -Xmx512m;&lt;br /&gt;   ms是最小的，mx是最大，64m, 512m分别是指内存的容量.&lt;br /&gt;&lt;br /&gt;2. 修改Catalina.bat文件&lt;br /&gt;    在166行“rem Execute Java with the applicable properties ”以下每行%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home=" CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 中的%CATALINA_OPTS% 替换成-Xms64m -Xmx512m&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-6939823850231973033?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/6939823850231973033/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/03/tomcat.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/6939823850231973033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/6939823850231973033'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/03/tomcat.html' title='Tomcat配置三点'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-1014372966046943216</id><published>2009-03-18T20:28:00.000-07:00</published><updated>2009-03-19T00:09:48.629-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSP'/><title type='text'>中文乱码问题</title><content type='html'>&lt;strong&gt;JSP设置&lt;/strong&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;%@ page language="java" contentType="text/html; charset=GB2312" pageEncoding="GB2312"%&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;“contentType”中的”charset=GB2312”说明http头信息指定编码为gb2312,这样浏览器就会自动选择相应的编码; pageEncoding指的是jsp文件的编码,通常不涉及乱码问题&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;URLEncode&lt;/strong&gt;&lt;br /&gt;在url提交中文参数的时候,会进行urlencode,例如:&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%&amp;gt;&lt;br /&gt;&amp;lt;form action="login.jsp"&gt;&lt;br /&gt;姓名:&amp;lt;input type="text" name="username"/&amp;gt;&lt;br /&gt;密码:&amp;lt;input type="text" name="password"/&amp;gt;&lt;br /&gt;&amp;lt;input type="submit"&amp;gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;!--此jsp页面指定浏览器使用utf-8编码,我们输入”张三”,提交,浏览器的url为--&amp;gt;&lt;br /&gt;&amp;lt;!-- http://xxxx/xxxx/login.action?username=%E5%BC%A0%E4%B8%89 --&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/td&gt;&lt;tr&gt;&lt;/table&gt;下面我们看看使用gb2312编码的情况:&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;%@ page language="java" contentType="text/html; &lt;br /&gt;charset=gb2312"pageEncoding="utf-8"%&amp;gt;&lt;br /&gt;&amp;lt;!-- 只改变charset的属性,jsp文件编码依然使用utf-8 --!&amp;gt;&lt;br /&gt;&amp;lt;!-- url:http://xxxx/xxxx/login.action?username=%D5%C5%C8%FD --&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/table&gt;URL的encode与当前浏览器的编码选择有关,因此需要指定web服务器的URIEncoding,与浏览器编码匹配&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;设置Tomcat的URIEncoding&lt;/strong&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;Connector connectionTimeout="20000" port="8081" &lt;br /&gt;protocol="HTTP/1.1" redirectPort="8443" URIEncoding="GB2312"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Action里从Request得到参数&lt;/strong&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;if( name!=null ){&lt;br /&gt;name = new String( name.getBytes("ISO-8859-1"),"gbk");&lt;br /&gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-1014372966046943216?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/1014372966046943216/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/03/jsp-contenttypecharsetgb2312httpgb2312.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/1014372966046943216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/1014372966046943216'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/03/jsp-contenttypecharsetgb2312httpgb2312.html' title='中文乱码问题'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7838455367609171347.post-8044504325995819616</id><published>2009-03-18T01:53:00.000-07:00</published><updated>2009-03-19T00:16:17.117-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web前端'/><title type='text'>等有空学学jQuery</title><content type='html'>jQuery中文入门指南：&lt;br /&gt;&lt;a href="http://www.k99k.com/jQuery_getting_started.html" target="_blank"&gt;http://www.k99k.com/jQuery_getting_started.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;官网：&lt;a href="http://jquery.com/" target="_blank"&gt;http://jquery.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;参考：&lt;a href="http://api.jquery.com/" target="_blank"&gt;http://api.jquery.com/&lt;/a&gt; &lt;br /&gt;     &lt;a href="http://visualjquery.com/" target="_blank"&gt;http://visualjquery.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;另：web前端的潮流：&lt;br /&gt;&lt;a href="http://www.smashingmagazine.com/" target="_blank"&gt;http://www.smashingmagazine.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7838455367609171347-8044504325995819616?l=wangweinku.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://wangweinku.blogspot.com/feeds/8044504325995819616/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://wangweinku.blogspot.com/2009/03/jquery.html#comment-form' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/8044504325995819616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7838455367609171347/posts/default/8044504325995819616'/><link rel='alternate' type='text/html' href='http://wangweinku.blogspot.com/2009/03/jquery.html' title='等有空学学jQuery'/><author><name>景文</name><uri>http://www.blogger.com/profile/05408320747655093268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
