这两天测试的时候,一个机器上同时运行了3、4个Tomcat,只好修改 $CATALINA_HOME/conf/server.xml 里的端口。
在 VIM 中用以下替换命令
:%s/\([pP]ort\)=”\(\d\{4\}\)”/\1=”3\2″/gc
全局替换端口数字长度为4的,在前面加上3。
最后面的 gc 是全局替换并且确认,去掉c就不用每次确认替换了。

发信人: cathayan (连接被重置), 信区: VIM
标 题: Re: 怎样导出语法加亮的代码
发信站: 水木社区 (Fri Jul 7 09:46:48 2006), 站内
:let html_use_css = 1
:let html_no_pre=1
:let use_xhtml = 1
html_use_encoding

进行远程调试简单来说:只需要在java 命令后面添加上如下的参数:
-Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=y
例如:原先是这样启动程序的
java -cp . HelloWorld,
现在就改成这样了
java -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=y -cp . HelloWorld
然后一运行就会出现如下的文字:
Listening for transport dt_socket at address: 8000
这就OK了。打开 Eclipse, 在调试里面新增一个 Remote Java Application,Host 填写上启动 Java 程序的那台服务器的地址,Port填写 8000,也就是参数中 address 后面指定的数字。剩下就跟平常一样了,断点该设就设,程序动态运行时也可以修改,不用重新拷贝,立刻生效,跟本地运行一样。当然了并不是所有的修改都可以立即生效的,有时还是需要我们把程序重新拷贝一下。
上面各个参数的含义分别是:transport=dt_socket指明了使用网络来传输,所有的平台都支持,server=y指明了启动VM的以调试服务器来执行,address=8000就是端口了,也能指定服务器IP,suspend=y则指定了VM开始的时候暂停,等待与客户端连接,连接上以后才继续执行。

更详细的内容看BEA上的《充分利用 J2EE 调试工具》一文

发现应用不能用了,反复测试发现页面中不能包含 taglib,否则会出现以下提示:

HTTP Status 500 –

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD “META-INF/tlds/struts-bean.tld” from JAR file “file:/C:/home/chaifeng/eclipse_workspace/cnlife365_tracker/web/WEB-INF/lib/struts.jar”: org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

root cause

org.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD “META-INF/tlds/struts-bean.tld” from JAR file “file:/C:/home/chaifeng/eclipse_workspace/cnlife365_tracker/web/WEB-INF/lib/struts.jar”: org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:39)
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:405)
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:86)
org.apache.jasper.compiler.Parser.processIncludeDirective(Parser.java:339)
org.apache.jasper.compiler.Parser.parseIncludeDirective(Parser.java:372)
org.apache.jasper.compiler.Parser.parseDirective(Parser.java:484)
org.apache.jasper.compiler.Parser.parseElements(Parser.java:1552)
org.apache.jasper.compiler.Parser.parse(Parser.java:126)
org.apache.jasper.compiler.ParserController.doParse(ParserController.java:211)
org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:155)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:295)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs.
Apache Tomcat/5.5.17

想了半天,刚才没有改动代码。折腾了半天才想起来,只是更新了一下lib下的jar,一时图方便就把另外一个目录下的jar全都复制过来了,包括 jsp-api.jar。
把它删除就ok了,记录一下。

Google Talk 升级了能在Gmail里面聊天了, 都说这个服务只有在英文界面下才能看到,可是我的Gmail一直就是英文的,怎么从来没见到过能聊天的那个界面,还差点以为自己人品有问题。
刚才发现原来这个服务还必须得在 http://mail.google.com 里才能看到,如果你也象我一样用 https://mail.google.com 来使用 Gmail,也是看不到这个选项的,只能设置是否把聊天记录保存到 Gmail 中。

Technorati Tags: , ,

我在 LiveJournal 也注册了账户, 其实就是冲着他的 openid。原先在 LiveJournal 的免费用户的访问地址是类似这样子的:http://www.livejournal.com/users/******/ ,现在继续访问这个链接就会自动跳转到 http://******.livejournal.com/ 这个二级域名上。

嗯,要是 MSN Spaces 也能提供二级域名就好了。

1、打开 HyperSnap,打开“捕捉设置”选项对话框。
2、在“捕捉”标签页,取消“在捕捉图像后播放声音”和“捕捉后恢复HyperSnap窗口,并将其显示到最前面”两个复选框。
3、在“快速保存”标签页,选中“自动将每次捕捉的图像保存到文件中”和“文件名依次增序”;选择好“自动保存的路径”,找一个剩余空间比较大的分区,免得还没保存多长时间就没空间了;设置好“终止值”,最好设置大一些,比如“9999999”;然后在下面的“重复第一次捕捉,间隔时间”那里输入你期望的间隔时间(单位是秒),比如“30”
4、在“任务栏”属性对话框的“任务栏”标签页下有个隐藏不活动的图标,点击“自定义”按钮,找到 HyperSnap 的图标,修改为“总是隐藏”;以前见过什么软件可以隐藏其他软件在任务栏的现实,用那个也不错的。
5、最后用 HyperSnap 抓一个全屏,剩下的就是过段时间来看看记录了,看看别人在电脑上干了些什么。

优点:这还用说?杀毒软件根本发现不了。哈哈,HyperSnap 怎么会是病毒、木马或者间谍软件?
缺点:容易被人发现,不过大多数情况下都会被忽略掉的,哈哈。

最后来说说这份 HowTo 的起因:

前几天有台 Web 服务器的 WebLogic 总是出问题,昨天上午发现两次异常增大的流量,所以干脆不停的察看 WebLogic 的流量状态。到了中午吃饭时,担心误过一些异常的流量,于是打开了 HyperSnap,然后设置了每隔 1 分钟就保存当前屏幕。然后就放心的出去吃饭了,1个多小时后回来后看了看截图发现都挺正常。不过我忘记再把 HyperSnap 定时截图给取消了,结果 HyperSnap 老老实实的给我截了一个下午的图,就这样完完整整地记录了我一下午的活动,包括跟MM聊天,玩游戏,上网找好玩的东西。呵呵,当然了,基本上还是都在工作的。
被记录了

好多人都有这样的困惑,系统越用越慢,打开任务管理器一看发现一大堆的进程,有的占用资源还挺高,内存也被耗掉不少。有的看上去那么面生,担心会不会是木马程序或病毒。不知道是不是正常的进程,不知道该不该杀掉,有的还是系统的正常进程,只不过所提供的服务我们平时用不着,每次开机都自动运行白白耗费资源。

ProcessLibrary (http://www.processlibrary.com/) 就是这样一个进程库的大全,在这里能搜索到绝大部分的进程信息。比如我看到这么一个进程 wdfmgr.exe,不知道是个什么进程,每次都能看见,好像刚装完系统是没有的。一搜索wdfmgr.exe才知道,wdfmgr.exe 是 Microsoft Windows media player 10 及其以上版本的一部分。刚装完XP,系统里面是 Windows media player 9,难怪没有。下面还有一些其他信息:比如系统危害程度是0,不是间谍软件、广告软件、病毒或木马程序。

嗯,又看见一个 gmt.exe,一看搜索结果原来是个间谍软件,赶快删掉吧。

在 ProcessLibrary 首页上还能看到危害最高的5个进程:

1. lsas.exe
Security Risk
2. msbb.exe
Security Risk
3. scvhost.exe
Security Risk
4. gmt.exe
Security Risk
5. rundll.exe
Security Risk

你还可以把这些添加你的网站上提醒大家。不过我们平时用电脑还是以预防为主,什么杀毒软件、防火墙都尽早装上。要是厌烦了这些,就用 Linux吧,个人推荐 Ubuntu,还能免费获得正版光盘,平时上网、聊天、写文档、写程序、看电影、听音乐、玩些休闲游戏绰绰有余了,还不用担心病毒、木马的,也不会越用越慢是不是就去重装系统。毕竟电脑是为我们服务的,而不是要我们去伺候它的,你说呢?

发信人: thinelephant (光吃不长), 信区: VIM
标  题: VIM 测试题(给用 VIM 做数据处理的初学者)
发信站: 水木社区 (Thu Oct 27 20:21:50 2005), 站内

以前写的,主要是针对数据处理的,虽然写得不好,不过也发到版上留个备份啦。:-)

VIM 测试题(给用 VIM 做数据处理的初学者)

请回答以下操作所需的步骤或命令:

01. (4) 光标移到最后一行
02. (4) 设置跳格(Tab)宽度为 4
03. (4) 忽略大小写查找字符串 elephant(本题不得使用 GUI)
04. (4) 将所有 elephant 替换为 pig(本题不得使用 GUI)
05. (4) 打开 VIM 关于正则表达式的帮助文档
06. (4) 在阅读 VIM 帮助时遇到链接如何跳转?如何返回?

07. (6) 比较编辑两个内容相近的文件
08. (6) 借助外部命令 sort 将文件的行按字母顺序进行排序
09. (6) 将每一行的第一个字符与第二个字符交换
10. (6) 将当前目录中所有文件的文件名插入到当前文本中

假设文件 data.txt 内容如下:

ACDSee             000001   499.95  ACD Systems, Ltd.
Internet Explorer  000004  1999.50  Microsoft Corp.
Vi IMproved        000015     0.00  Bram Moolenaar
FlashFXP           000204   199.00  CEDsoft

请回答以下操作所需的正则表达式(可查阅帮助,反复尝试):

11. (4) 匹配每行的软件名字段
12. (4) 匹配每行的编号字段
13. (4) 匹配每行的价格字段
14. (4) 匹配每行的开发者字段

请回答以下操作所需的步骤或命令:

15. (6) 交换每行的编号和价格字段
16. (8) 借助外部命令 sort 将文件的行按软件价格进行排序
17. (8) 将连续两个或以上的空格替换为一个跳格字符
18. (6) 删除每行的开发者字段

送分题,写得越多越好:

19. (8) 请写出任何难以用 notepad 完成的并且你会的 VIM 功能。

============================================================================

参考答案

01. G
    在 Normal 模式下按 G 快速跳到最后一行,按 gg 跳到第一行,当然,也可以按
    Ctrl-Home 和 Ctrl-End。
02. :set tabstop=4
    将 Tab 设成大一点的宽度,比如 16,查看数据文件的时候比较有用,对齐清晰。
03. 方法一,先设置忽略大小写,然后查找
    :set ignorecase
    /elephant
    :set noignorecase
    方法二,在前面加入 \c 表示忽略大小写
    /\celephant
04. :%s/elephant/pig/g
    g 表示如果一行有多个 elephant 将全部替换,没有 g 表示只替换每行第一个。
    另外还有 i 标志,有 i 表示忽略大小写。i g 这两个标志非常基础!
05. :help pattern
    用 :help xxx 看一个东西帮助,提示:在 :help 后面可以尝试按 tab 补全,
    比如输入 :help search 然后按 tab(一次或多次),你就可以看到
    search-pattern 正是你想要看的。
06. Ctrl-] Ctrl-T
    帮助里面用两个 | 括起来高亮的,比如 |pattern| 都是可以跳转的链接,按
    Ctrl-](按住 Ctrl 按右中括号)跳进去,再按 Ctrl-T 跳回来。

07. 在命令行下 vim -d file1.txt file2.txt 可以用比较模式查看编辑两个文件,
    或者如果在 Windows 下面,可以先选中两个文件,然后鼠标右点菜单,选
    “Diff with Vim”。一般在比较某个文件的两个版本(即是一个是以前的,
    一个是修改后的)时很有用。
08. :%!sort
    表示将整个文件的行用外部命令 sort 过滤一遍,不过要当心 Windows 的 sort
    命令在某些条件下会产生错误的排序结果。
09. 方法一,用正则表达式匹配替换每行的前两个字符
    :%s/^\(.\)\(.\)/\2\1/
    方法二,用块选择
    Normal 模式下,先把光标移到第一行第一个字符上,按 Ctrl-V 进入块选择模式,
    移动光标到最后一行第一个字符上,这时选中的是每一行的第一列字符,按 d
    删除,然后移动光标到第一行第二个字符,按 P(注意是大写)粘贴,刚才删除的
    第一列就被粘到第二列上了。
10. :split .
    打开当前目录(. 表示当前目录,当然也可以是比如 C:\ ),然后就可以将目录
    中的文件名复制粘贴过来了。

请把 :help pattern 那一页帮助内容仔仔细细阅读 99 遍!:-)

11. 软件名字段的特征是:位于行首;由若干个单词组成,单词之间用一个空格分开。
    ^\S\+\( \S\+\)*
12. 编号字段的特征是:恰好六个数字。
    \<\d\{6}\>
13. 价格字段的特征是:若干个数字,一个点,若干个数字。
    \d\+\.\d\+
14. 开发者字段的特征跟软件名字段的特征类似,但是位于行末。
    \S\+\( \S\+\)*$

15. 同 09 题方法二,用块选择。
16. 用块选择将价格字段换到前面,然后用 :%!sort 排序,然后换回来。
17. :%s/  \+/\t/g (注意这里是两个空格)或者
    :%s/ \{2,}/\t/g
18. 用块选择,按 D(大写)删除。块选择后按 d 跟 D 的区别是:d 删除选中的块,
    D 删除选中的块以及后面一直到行末的内容。

19. 略。

JavaScript 的 base64 编码/解码的源代码
摘自:www.aardwulf.com
作者:aardwulf systems

var keyStr = "ABCDEFGHIJKLMNOP" +
"QRSTUVWXYZabcdef" +
"ghijklmnopqrstuv" +
"wxyz0123456789+/" +
"=";
function encode64(input) {
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
do {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
keyStr.charAt(enc1) +
keyStr.charAt(enc2) +
keyStr.charAt(enc3) +
keyStr.charAt(enc4);
chr1 = chr2 = chr3 = "";
enc1 = enc2 = enc3 = enc4 = "";
} while (i < input.length);
return output;
}
function decode64(input) {
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
var base64test = /[^A-Za-z0-9\+\/\=]/g;
if (base64test.exec(input)) {
alert("There were invalid base64 characters in the input text.\n" +
"Valid base64 characters are A-Z, a-z, 0-9, '+', '/', and '='\n" +
"Expect errors in decoding.");
}
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
do {
enc1 = keyStr.indexOf(input.charAt(i++));
enc2 = keyStr.indexOf(input.charAt(i++));
enc3 = keyStr.indexOf(input.charAt(i++));
enc4 = keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
chr1 = chr2 = chr3 = "";
enc1 = enc2 = enc3 = enc4 = "";
} while (i < input.length);
return output;
}