10月14
项目中最近做了个SVN代码变更的插件,需要做一个安装盘,发现插件只能用在TortoiseSVN 1.6.x或者以上的版本,这就需要安装盘中在安装时提醒用户安装1.6.x或者以上的SVN客户端版本写了几个公共方法实现如下的版本对比。
//从注册表中获取SVN客户端TortoiseSVN的版本号
function getSVNClientVersion (): String;
begin
RegQueryStringValue(HKCU , 'Software\TortoiseSVN','CurrentVersion', result);
end;
//此函数用于截取版本号数字
procedure DecodeVersion (verstr: String; var verint: array of Integer);
var
i,p: Integer; s: string;
begin
verint := [0,0,0,0];
i := 0;
while ((Length(verstr) > 0) and (i < 4)) do
begin
p := pos (',', verstr);
if p > 0 then
begin
if p = 1 then s:= '0' else s:= Copy (verstr, 1, p - 1);
verint[i] := StrToInt(s);
i := i + 1;
verstr := Copy (verstr, p+1, Length(verstr));
end
else
begin
verint[i] := StrToInt (verstr);
verstr := '';
end;
end;
end;
//从注册表中获取SVN客户端TortoiseSVN的版本号
function getSVNClientVersion (): String;
begin
RegQueryStringValue(HKCU , 'Software\TortoiseSVN','CurrentVersion', result);
end;
//此函数用于截取版本号数字
procedure DecodeVersion (verstr: String; var verint: array of Integer);
var
i,p: Integer; s: string;
begin
verint := [0,0,0,0];
i := 0;
while ((Length(verstr) > 0) and (i < 4)) do
begin
p := pos (',', verstr);
if p > 0 then
begin
if p = 1 then s:= '0' else s:= Copy (verstr, 1, p - 1);
verint[i] := StrToInt(s);
i := i + 1;
verstr := Copy (verstr, p+1, Length(verstr));
end
else
begin
verint[i] := StrToInt (verstr);
verstr := '';
end;
end;
end;
9月25
以前在使用MyEclipse开发的都常用到其中一个"Open In Explorer"的小插件,可以直接在Windows资源管理器中打开选中文件所在的目录,工具虽小,但我们经常需要用到它
由于MyEclipse收费以及体积庞大的原因,现在我已经改用Eclipse(WTP) + Tomcat进行开发了,这个组合对我来说足以满足目前项目开发的需要,但就是缺少这个小插件,为了继续享受这个快捷打开文件目录的功能,自己动手DIY了一个插件,功能简单,但足够使用。
插件下载:org.lightframework.eclipse.explorer_1.0.0.201003172130.jar
源码浏览:google code browse
喜欢这个插件的朋友欢迎下载使用,不过目前没有计划提供支持,需要改动的请自行下载源码改造
注:第二次DIY Eclipse插件,1小时写代码,2小时找图标,对插件编写方式有质疑的欢迎指导。
由于MyEclipse收费以及体积庞大的原因,现在我已经改用Eclipse(WTP) + Tomcat进行开发了,这个组合对我来说足以满足目前项目开发的需要,但就是缺少这个小插件,为了继续享受这个快捷打开文件目录的功能,自己动手DIY了一个插件,功能简单,但足够使用。
插件下载:org.lightframework.eclipse.explorer_1.0.0.201003172130.jar
源码浏览:google code browse
喜欢这个插件的朋友欢迎下载使用,不过目前没有计划提供支持,需要改动的请自行下载源码改造
注:第二次DIY Eclipse插件,1小时写代码,2小时找图标,对插件编写方式有质疑的欢迎指导。
9月2
在ext中的那个desktop的demo图标不能自动换行的,我们需要在desktop.js中加入自动换行的代码。下面看代码
//shortcuts 自动换行
var btnHeight = 61;
var btnWidth = 64;
var btnPadding = 15;
var col = null;
var row = null;
function initColRow(){
col = {index: 1, x: btnPadding};
row = {index: 1, y: btnPadding};
}
initColRow();
function isOverflow(y){
if(y > (Ext.lib.Dom.getViewHeight() – taskbarEl.getHeight())){
return true;
}
return false;
}
this.setXY = function(item){
var bottom = row.y + btnHeight,
overflow = isOverflow(row.y + btnHeight);
if(overflow && bottom > (btnHeight + btnPadding)){
col = {
index: col.index++
, x: col.x + btnWidth + btnPadding
};
row = {
index: 1
, y: btnPadding
};
}
//shortcuts 自动换行
var btnHeight = 61;
var btnWidth = 64;
var btnPadding = 15;
var col = null;
var row = null;
function initColRow(){
col = {index: 1, x: btnPadding};
row = {index: 1, y: btnPadding};
}
initColRow();
function isOverflow(y){
if(y > (Ext.lib.Dom.getViewHeight() – taskbarEl.getHeight())){
return true;
}
return false;
}
this.setXY = function(item){
var bottom = row.y + btnHeight,
overflow = isOverflow(row.y + btnHeight);
if(overflow && bottom > (btnHeight + btnPadding)){
col = {
index: col.index++
, x: col.x + btnWidth + btnPadding
};
row = {
index: 1
, y: btnPadding
};
}
8月31
基于浏览器的应用,表现力始终不够丰富,我们常常会想,在一个网页中,点一下某个链接,能够直接调用安装好的可执行程序有多好啊。按照微软的推荐,应该是通过ActiveX,把可执行程序嵌入到网页中,例如flash的ActiveX。这样,我们就要购买ActiveX的签名,不通过签名的东西,在IE6中是无法加载的,为一个小项目购买ActiveX的签名,代价太昂贵了。另外,很多时候还要考虑如果用户突然关闭了浏览器该怎么办。这对播放个flash、歌曲之类的没多大影响,但是很多时候,不能在关闭前清扫战场,带来的后果是灾难性的。通常,在企业应用中,我们总是通过IE直接调用exe。
最早的时候,从网页调用一个EXE是很简单的事情,一段javascript就可以了。但是,自从IE6开始,微软就不再允许这种“极不安全的行为”。这也是有道理的。没事就给你来个“format d:/q”,即使不这么恶劣,动不动就给你弹几百个notebook,也确实够恐怖的。浏览器不应该与操作系统有太多不必要的关联。
拿javascript在IE6测试之后,我几乎放弃了直接调用exe的想法,直到有一天,看到了腾讯的实现方法。
腾讯有一个在网页上面显示QQ状态的东西,点一下就能弹出一个对话框跟该QQ用户聊天(就是我blog左上方的那个Q我的小图标),而不会有任何警告。好神奇啊。注册表里面研究了一天,终于明白了怎么回事。
在windows中,注册表中包含各种协议(http,ftp,telnet等)的信息,包含了默认打开方式的参数。试一下,从IE的地址栏中输入telnet://www.hecks.tk,出现什么了?弹出了一个命令行窗口,开始进行telnet操作。IE居然能完成这个,那么为什么就不能完成“telnet1://参数” 呢?
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\rDelta]
@="rDelta"
"URL Protocol"="C:\\PROGRA~1\\rDelta\\rDeltaCmd.exe %1"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\rDelta\DefaultIcon]
@="%SystemRoot%\\system32\\url.dll,0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\rDelta\Shell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\rDelta\Shell\open]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Delta\Shell\open\command]
@="C:\\PROGRA~1\\rDelta\\rDeltaCmd \"%1\""
把这个东西导入注册表,那么我们在浏览器中输入rDelta://1022,那么就会自动调用c:\program files\rDelta\rDeltaCmd.exe(当然了,你得确实有这个文件),并把1022这个参数传给该exe。这个操作被认为是安全的,不会有任何的限制。
到这里,思路就清晰了,我们的安装程序中,在注册表中建个协议,例如上面的rDelta,再把要执行的exe的路径信息写入,在网页直接一个超链接,协议://参数就可以了。exe文件接受这个参数,进行相应的处理。搞定。
记住,协议://后面的所有字符串被看做是一个参数。那么,exe文件永远只有两个参数,参数0是它的完整执行路径,参数1就是网页传过来的字符串。
最早的时候,从网页调用一个EXE是很简单的事情,一段javascript就可以了。但是,自从IE6开始,微软就不再允许这种“极不安全的行为”。这也是有道理的。没事就给你来个“format d:/q”,即使不这么恶劣,动不动就给你弹几百个notebook,也确实够恐怖的。浏览器不应该与操作系统有太多不必要的关联。
拿javascript在IE6测试之后,我几乎放弃了直接调用exe的想法,直到有一天,看到了腾讯的实现方法。
腾讯有一个在网页上面显示QQ状态的东西,点一下就能弹出一个对话框跟该QQ用户聊天(就是我blog左上方的那个Q我的小图标),而不会有任何警告。好神奇啊。注册表里面研究了一天,终于明白了怎么回事。
在windows中,注册表中包含各种协议(http,ftp,telnet等)的信息,包含了默认打开方式的参数。试一下,从IE的地址栏中输入telnet://www.hecks.tk,出现什么了?弹出了一个命令行窗口,开始进行telnet操作。IE居然能完成这个,那么为什么就不能完成“telnet1://参数” 呢?
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\rDelta]
@="rDelta"
"URL Protocol"="C:\\PROGRA~1\\rDelta\\rDeltaCmd.exe %1"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\rDelta\DefaultIcon]
@="%SystemRoot%\\system32\\url.dll,0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\rDelta\Shell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\rDelta\Shell\open]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Delta\Shell\open\command]
@="C:\\PROGRA~1\\rDelta\\rDeltaCmd \"%1\""
把这个东西导入注册表,那么我们在浏览器中输入rDelta://1022,那么就会自动调用c:\program files\rDelta\rDeltaCmd.exe(当然了,你得确实有这个文件),并把1022这个参数传给该exe。这个操作被认为是安全的,不会有任何的限制。
到这里,思路就清晰了,我们的安装程序中,在注册表中建个协议,例如上面的rDelta,再把要执行的exe的路径信息写入,在网页直接一个超链接,协议://参数就可以了。exe文件接受这个参数,进行相应的处理。搞定。
记住,协议://后面的所有字符串被看做是一个参数。那么,exe文件永远只有两个参数,参数0是它的完整执行路径,参数1就是网页传过来的字符串。
8月31
在MS-SQLServer中,如何在不同的数据库之间复制表?
当表目标表存在时:
insert into 目的数据库..表(字段1...字段n) select 段1...字段n from 源数据库..表
当目标表不存在时:
select 段1...字段n into 目的数据库..表 from 源数据库..表
--如果在不同的SQL之间:
insert into openrowset('sqloledb','目的服务器名';'sa';'',目的数据库.dbo.表)
select * from 源数据库..表
除了上面的方法之外或者还可以用链接服务器:
当表目标表存在时:
insert into 目的数据库..表(字段1...字段n) select 段1...字段n from 源数据库..表
当目标表不存在时:
select 段1...字段n into 目的数据库..表 from 源数据库..表
--如果在不同的SQL之间:
insert into openrowset('sqloledb','目的服务器名';'sa';'',目的数据库.dbo.表)
select * from 源数据库..表
除了上面的方法之外或者还可以用链接服务器:
8月17
今天在微博上发表一感慨:“内部晋升越来越困难,但是外部来的大P越来越多,所以很多人都选择跳槽”,之后我从三个方面简要的进行了回答:“外面来的总是有包装的,内部的都是肉身PK,此一输;外面来的总是小股人马,内部的一批批的,升谁都伤感情,此二输;外面来的通常都是大佬推荐的,没有特别重大机会,人不会来,内部的就不解释了,成果都被大佬吸收,难有机会,此三输”。之后讨论不断,我也余兴未了,继续写来。
这个世界上有一类人特别苦逼,苦逼到什么程度呢?他们省吃俭用攒钱买房,结果房价越来越贵;公司外部竞争激烈,他们工作异常繁忙,披星戴月,日复一日;技术更新行业罕见,他们要随时调整心情,随时学习知识;他们长期和机器为伍,大多比较呆傻,比较单纯;还有很多不一一例举,这一类人就是程序员。
而就是这么一类程序员过着这么苦逼的生活,在公司内部却难以获得公平的晋升机会,外来的和尚总是在不断打破平衡,甚至是刚毕业的新和尚拿得都比老和尚多,这是全行业都罕见的奇观,IT人有幸经历了。
某创业公司,某个程序员要离职,老板甚至不问问他直接领导的意见,就同意了,没有挽留,之后大骂不忠诚,这个人拿3k,拿了2年,他走了以后,老板用5k雇了个新面孔,但就是不愿意给这个老人晋升,不愿意给加到哪怕是4k。
某上市公司,游戏部门突然从外部空降了一个领导,原因是原大佬被挖走以后,剩下的人升谁都有意见,难以服众,不从外部请人来镇不住局面,这个人一来,大家是团结了,团结起来和这个人斗,但最后还是和解了。
某国际大公司,某人伪造简历,包装的如花似玉,获得高职,工作主要有下属完成,他只需要汇众汇报即可,越混路越宽,直到某天事发,依然是高官。
某IT企业,某清华同学离职时语重心长的对我说,XX(可以理解为网游,搜索,电商任意一种)是00-02年毕业的这些人清华人的机会,我们就是比某人强十倍也没有机会,也得从下面做起,搜索的天时不属于我,此人去了某金融分析软件公司,目前是高管,同期留在某IT企业的其他同学依然过着苦逼的生活。
举了这么多例子,我想说得是为什么不给你晋升这个问题,或者晋升很难,为什么?
这个世界上有一类人特别苦逼,苦逼到什么程度呢?他们省吃俭用攒钱买房,结果房价越来越贵;公司外部竞争激烈,他们工作异常繁忙,披星戴月,日复一日;技术更新行业罕见,他们要随时调整心情,随时学习知识;他们长期和机器为伍,大多比较呆傻,比较单纯;还有很多不一一例举,这一类人就是程序员。
而就是这么一类程序员过着这么苦逼的生活,在公司内部却难以获得公平的晋升机会,外来的和尚总是在不断打破平衡,甚至是刚毕业的新和尚拿得都比老和尚多,这是全行业都罕见的奇观,IT人有幸经历了。
某创业公司,某个程序员要离职,老板甚至不问问他直接领导的意见,就同意了,没有挽留,之后大骂不忠诚,这个人拿3k,拿了2年,他走了以后,老板用5k雇了个新面孔,但就是不愿意给这个老人晋升,不愿意给加到哪怕是4k。
某上市公司,游戏部门突然从外部空降了一个领导,原因是原大佬被挖走以后,剩下的人升谁都有意见,难以服众,不从外部请人来镇不住局面,这个人一来,大家是团结了,团结起来和这个人斗,但最后还是和解了。
某国际大公司,某人伪造简历,包装的如花似玉,获得高职,工作主要有下属完成,他只需要汇众汇报即可,越混路越宽,直到某天事发,依然是高官。
某IT企业,某清华同学离职时语重心长的对我说,XX(可以理解为网游,搜索,电商任意一种)是00-02年毕业的这些人清华人的机会,我们就是比某人强十倍也没有机会,也得从下面做起,搜索的天时不属于我,此人去了某金融分析软件公司,目前是高管,同期留在某IT企业的其他同学依然过着苦逼的生活。
举了这么多例子,我想说得是为什么不给你晋升这个问题,或者晋升很难,为什么?
8月3
本文主要讲述如何在tomcat中配置Basic认证以及工作流程:
Tomcat配置:
1 在tomcat的webapps下新建一个目录authen,再建立子目录subdir,下面放一个index.jsp
2 在authen目录下建立WEB-INF目录,下放web.xml文件,内容如下:
3 在tomcat的tomcat-users.xml文件中添加一个用户名manager密码为admin,manager的用户,角色manager。
客户端访问:
访问http://localhost:port/authen/subdir/index.jsp
会弹出对话框提示认证,输入manager admin可以登录。
Tomcat配置:
1 在tomcat的webapps下新建一个目录authen,再建立子目录subdir,下面放一个index.jsp
2 在authen目录下建立WEB-INF目录,下放web.xml文件,内容如下:
3 在tomcat的tomcat-users.xml文件中添加一个用户名manager密码为admin,manager的用户,角色manager。
客户端访问:
访问http://localhost:port/authen/subdir/index.jsp
会弹出对话框提示认证,输入manager admin可以登录。
7月16
首先Subversion作为一个优秀的自由/开源的版本控制系统,Eclipse默认对其并不支持,我们可以通过使用svn插件subclipse(http://subclipse.tigris.org/)增加对其的支持。
subclipse插件安装方法方法除了有官方推荐的“Eclipse自带图形界面在线安装法”、“直接拷贝法”,还有就是比较推荐的“link文件法”。当然啦,新版本的eclipse这里还有一种方法就是直接扔在dropins目录也可以的。
这里以1.6.2版本为例,介绍下subclipse的link安装方法(本例中eclipse的安装路径为D:\Program Files\eclipse):
1.首先下载site-1.6.2.zip;

2.新建路径为D:\Program Files\eclipse\linkplugins\subclipse的目录;
3.将site-1.6.2.zip解压至指定目录,本例将其解压至D:\Program Files\eclipse\linkplugins\subclipse;
subclipse插件安装方法方法除了有官方推荐的“Eclipse自带图形界面在线安装法”、“直接拷贝法”,还有就是比较推荐的“link文件法”。当然啦,新版本的eclipse这里还有一种方法就是直接扔在dropins目录也可以的。
这里以1.6.2版本为例,介绍下subclipse的link安装方法(本例中eclipse的安装路径为D:\Program Files\eclipse):
1.首先下载site-1.6.2.zip;
2.新建路径为D:\Program Files\eclipse\linkplugins\subclipse的目录;
3.将site-1.6.2.zip解压至指定目录,本例将其解压至D:\Program Files\eclipse\linkplugins\subclipse;
7月14
最近项目有个需求要将持续集成环境编译好的发布文件用 Xcopy命令复制文件夹下所有文件到指定目录,下面是具体代码。
@echo off
color 0
@echo.
@echo ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@echo ` Smart rDelta 发布版本到指定目录 `
@echo ` `
@echo ` - - - Power By:Heck `
@echo ` `
@echo ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@echo.
color 0A
@echo 正在复制文件,请稍等。。。
xcopy SmartrDelta_build\*.* Release\Smart rDelta V100R001C02B05 /s
@echo.
@echo ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@echo ` 复制完成,多谢猪头! `
@echo ` `
@echo ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@echo.
pause
复制上面的代码保存为.bat文件直接运行即可,上面的SmartrDelta_build\*.*表示要复制的文件夹路径, Release\Smart rDelta V100R001C02B05表示目录文件夹,/s表示递归复制也就是将下面所有文件或者复制到指定文件夹。
@echo off
color 0
@echo.
@echo ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@echo ` Smart rDelta 发布版本到指定目录 `
@echo ` `
@echo ` - - - Power By:Heck `
@echo ` `
@echo ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@echo.
color 0A
@echo 正在复制文件,请稍等。。。
xcopy SmartrDelta_build\*.* Release\Smart rDelta V100R001C02B05 /s
@echo.
@echo ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@echo ` 复制完成,多谢猪头! `
@echo ` `
@echo ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
@echo.
pause
复制上面的代码保存为.bat文件直接运行即可,上面的SmartrDelta_build\*.*表示要复制的文件夹路径, Release\Smart rDelta V100R001C02B05表示目录文件夹,/s表示递归复制也就是将下面所有文件或者复制到指定文件夹。
7月5
下面是几种java转exe的工具,进行一下比较,谈谈自己的看法:
1. 从www.towerj.com获得一个TowerJ编译器,该编译器可以将你的CLASS文件编译成EXE文件。
注:现在已经找不到,不提供了,被人家收购了。
2. 利用微软的SDK-Java 4.0所提供的jexegen.exe创建EXE文件,这个软件可以从微软的网站免费下载,地址如下:
http://www.microsoft.com/java/download/dl_sdk40.htm
jexegen的语法如下:
jexegen /OUT:exe_file_name
/MAIN:main_class_name main_class_file_name.class
[and other classes]
注:没有试过
3. Visual Cafe提供了一个能够创建EXE文件的本地编译器。你需要安装该光盘上提供的EXE组件。
注:没有试过
4. 使用InstallAnywhere创建安装盘。
注:很不错的工具。
但就是要>8M(带jre),还有一种是>1M的(不带jre)。
但是它可以编译成各种平台上可以使用的exe程序。
5. 使用IBM AlphaWorks提供的一个高性能Java编译器,该编译器可以从下面的地址获得:
http://www.alphaworks.ibm.com/tech/hpc
注:没有试过
6. JET是一个优秀的Java语言本地编译器。该编译器可以从这个网站获得一个测试版本:
http://www.excelsior-usa.com/jet.html
1. 从www.towerj.com获得一个TowerJ编译器,该编译器可以将你的CLASS文件编译成EXE文件。
注:现在已经找不到,不提供了,被人家收购了。
2. 利用微软的SDK-Java 4.0所提供的jexegen.exe创建EXE文件,这个软件可以从微软的网站免费下载,地址如下:
http://www.microsoft.com/java/download/dl_sdk40.htm
jexegen的语法如下:
jexegen /OUT:exe_file_name
/MAIN:main_class_name main_class_file_name.class
[and other classes]
注:没有试过
3. Visual Cafe提供了一个能够创建EXE文件的本地编译器。你需要安装该光盘上提供的EXE组件。
注:没有试过
4. 使用InstallAnywhere创建安装盘。
注:很不错的工具。
但就是要>8M(带jre),还有一种是>1M的(不带jre)。
但是它可以编译成各种平台上可以使用的exe程序。
5. 使用IBM AlphaWorks提供的一个高性能Java编译器,该编译器可以从下面的地址获得:
http://www.alphaworks.ibm.com/tech/hpc
注:没有试过
6. JET是一个优秀的Java语言本地编译器。该编译器可以从这个网站获得一个测试版本:
http://www.excelsior-usa.com/jet.html







