2008-10-28

在 Postgresql 中使用正则表达式替换

例:
select
regexp_replace('wz-001', '^\\D+-|^\\d{2}-|\\D', '', 'g'),
regexp_replace('01-3001', '^\\D+-|^\\d{2}-|\\D', '', 'g'),
regexp_replace('08001-A', '^\\D+-|^\\d{2}-|\\D', '', 'g'),
regexp_replace('8372A', '^\\D+-|^\\d{2}-|\\D', '', 'g'),
regexp_replace('83j3s9', '^\\D+-|^\\d{2}-|\\D', '', 'g');

结果:
001, 3001, 08001, 8372, 8339

补空例:
select
lpad('329', 10, '0'),
lpad('93', 10, '0');

结果:
0000000329, 0000000093

2008-10-22

Eclipse 的代码折叠





在使用 webwork 的过程中,为了接收表单参数,而需要在 action 中写一堆的 setter, getter,这些代码与业务逻辑代码混在一起,看着有些令人生厌。Java 不能像 C# 支持一个类可以拆分成多个文件,如果使用 modelDriven,创建实际并不存在的中间对象,似乎有些别扭;或者再创建一个基类,但也不太理想。除此之外,或许将代码折叠,眼不见为净倒是不错的选择。
"Coffee-Bytes Code Folding Plugin",就是这样一个 eclipse 插件,但按官方的安装方法, eclipse 更新程序取不到其提供的网站内容,无法安装。可以到 csdn 的资源上找找,有朋友提供了下载。
安装完成后,在设置中,更改默认的 folding 选项,选择此插件,重新打开 java 文件,应该可以看到 if 等也可以折叠了。
如果想要类似于 C# 中的 #region 效果,则需要打开 User defined regions 选项。

2008-09-23

Java 中,+ 号连接的多行文本,与单行文本的有区别吗?

在代码编写中,经常会有一长串的文本,为了阅读方便,一般是以多行输入的。在 C# 中,可以使用 @ 符来指定这是一个多行文本块,但是在 Java 中,并没有找到类似的语言特性,所以我只能用 + 号来连接多行文本,并以为这与单行文本,最终的处理方式是不一样的,会浪费 CPU 资源,进行字符串拼接。


如下面的代码:

public ArrayList getPage(EnterpriseForm formBean, Integer pageNo) throws Exception{
ArrayList result = new ArrayList();
// SQL文
SQLBuilder sql = new SQLBuilder("SELECT id, code, category, name, phone1, fax1, phone2, fax2, " +
"email, url, address, keyword, " +
"bank_name1, bank_account1, bank_account_name1, " +
"bank_name2, bank_account2, bank_account_name2, " +
"bank_name3, bank_account3, bank_account_name3, " +
"contact1_name, contact1_phone1, contact1_phone2, contact1_phs, " +
"contact1_mobile1, contact1_mobile2, contact1_email, " +
"contact1_qq, contact1_msn, contact1_skype, " +
"contact2_name, contact2_phone1, contact2_phone2, contact2_phs, " +
"contact2_mobile1, contact2_mobile2, contact2_email, " +
"contact2_qq, contact2_msn, contact2_skype, " +
"contact3_name, contact3_phone1, contact3_phone2, contact3_phs, " +
"contact3_mobile1, contact3_mobile2, contact3_email, " +
"contact3_qq, contact3_msn, contact3_skype, " +
"memo, " +
"regist_user_id, regist_time, update_user_id, update_time " +
"FROM enterprise");

但是一想,编译器难道不会作优化处理么?
为了验证,使用 jadnt158 进行了反编译,验证了这个想法。
结果不出所料,从而可以没有顾虑地使用多行字符串了。


上面代码反编译后的结果:

public ArrayList getPage(EnterpriseForm formBean, Integer pageNo)
throws Exception
{
ArrayList result = new ArrayList();
SQLBuilder sql = new SQLBuilder("SELECT id, code, category, name, phone1, fax1, phone2, fax2, email, url, address, keyword, bank_name1, bank_account1, bank_account_name1, bank_name2, bank_account2, bank_account_name2, bank_name3, bank_account3, bank_account_name3, contact1_name, contact1_phone1, contact1_phone2, contact1_phs, contact1_mobile1, contact1_mobile2, contact1_email, contact1_qq, contact1_msn, contact1_skype, contact2_name, contact2_phone1, contact2_phone2, contact2_phs, contact2_mobile1, contact2_mobile2, contact2_email, contact2_qq, contact2_msn, contact2_skype, contact3_name, contact3_phone1, contact3_phone2, contact3_phs, contact3_mobile1, contact3_mobile2, contact3_email, contact3_qq, contact3_msn, contact3_skype, memo, regist_user_id, regist_time, update_user_id, update_time FROM enterprise");

2008-09-22

偶见汉字[ "的" "地" "得"] 的讨论

上网浏览时,发现这些网友评论好有趣,虽然说离题万里,倒也是令人受教了。
比如下面这个(来源:http://www.cnbeta.com/articles/65289.htm


引用匿名人士发表于2008-09-22 14:42:40的评论:
引用webbe发表于2008-09-22 14:23:32的评论:
引用匿名人士发表于2008-09-22 13:53:04的评论:
引用webbe发表于2008-09-22 13:30:49的评论:
用Windows7画图工具的我得意的飘过。。。
第二个“的”,应该是“地”,“飘过”属于动词。
不巧西厢记有同类例:《西厢记诸宫调》(卷六):平生踪迹无定着,如断蓬。听塞鸿,哑哑的飞过暮云重。 不巧我是学汉语言文学的;不巧我导师又是吕叔湘的学生;不巧吕叔湘又主张“的”“地”合并;不巧又有杨秀君、李赓钧、田小琳、倪宝元、鞠复信等学者支持这 个观点;不巧1984年发布了《中学教学语法系统提要(试用)》中提倡不分“的”、“地”,都用“的”字;不巧我正好生在1986年就接受了这个教 育。。。太多的不巧了。
我95年小学毕业,当时老师对“地的得”三字的用法还强调的十分厉害,作文用错要扣分,何解楼上的86年通用的?难道九几年又改成不能通用了?但据说现在已经可以通用了,难道又改了?
“的”对于“地”“得”两字的合并从上世纪末就一直在学术界大讨论了。作为一种文化科学,是没有绝对的真理这种说法的,也就是说其实语言这种东西一直在随 着使用习惯的变化而不断变化,看看古代汉语到现代汉语的变化就能知道。所以一个字怎么用,可能在某几年是一定的,但是一旦有争议的话,则很可能发生变化。 对于这三个“的”“地”“得”,其实至今没有定论。小学的强调是为了能让孩子更好的掌握语法结构把握句子的意思,突出强调的内容。譬如“严厉的批评是必要 的”和“严厉地批评是必要的”,两句话都是正确的,但是因为助词“的”与“地”的不同所以强调的点不同,前者倾向于强调“批评”这一行为的必要,而后者倾 向于强调批评的程度——“严厉”的必要。 但是语言毕竟是一种工具,还是来用的,规范有规范的必要,但是一味的讲究规范而否定发展变化就是不对的,因此过分强调用法的行为只会在小学打基础的时候。 所以也就有了你说的一会儿强调一会儿又不强调的情况。 但这三个字也并不是所谓的“通用”,而是“的”作为助词的时候能在不给句子造成歧异的情况下能替代“地”与“得”,用通俗点的话来说就是现在这三个字不是 各管三分之一了,而是现在“的”范围变大了,能涵盖一部分的“地”和“得”了。 其实我们导师说的是,在一个结构你很把握不准的情况下,用“的”的话正确率一般会在75%以上。 《中学教学语法系统提要(试用)》是确实存在的,只是在可以不分但是分的话更利于学生、孩子掌握语句的情况下,多数小学的老师还是选择了强调分。仅此而 已。

2008-09-19

Excel add-in 备忘

两项机能:

1、自动添加工具栏按钮,文档关闭时,自动删除所添加的工具栏按钮
2、点击按钮图标,执行模块(Module)中的宏机能

注:在取得工具栏对象时,如果指定名称的工具栏不存在,会报错。下面代码的处理是对工具栏集合进行遍历,判断是否存在,当然,也可以直接使用异常处理(on error goto)来进行判断。

代码1(ThisWorkBook):

Option Explicit
Const toolbarCaption As String = "MyToolbar"
Const onActionString As String = "autoAdjust"

Private Sub Workbook_Open()
Dim toolbar As CommandBar

Set toolbar = getCommandBar(toolbarCaption)
If toolbar Is Nothing Then
Set toolbar = Application.CommandBars.Add(Name:=toolbarCaption)
toolbar.Visible = True
End If

With toolbar.Controls.Add(Type:=msoControlButton, Before:=1)
.Caption = "Auto Adjust"
.TooltipText = "Run Auto Adjust"
.OnAction = onActionString
ThisWorkbook.Worksheets(1).Shapes(1).Copy
.PasteFace
End With

Set toolbar = Nothing

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim toolbar As CommandBar
Dim i As Integer

Set toolbar = getCommandBar(toolbarCaption)
If toolbar Is Nothing Then
Exit Sub
End If

For i = 1 To toolbar.Controls.Count
With toolbar.Controls(i)
If .OnAction = "'" & ThisWorkbook.Path & "\" & ThisWorkbook.Name & "'!" & onActionString Then
.Delete
Exit For
End If
End With
Next i

If toolbar.Controls.Count = 0 Then
toolbar.Delete
Set toolbar = Nothing
End If
End Sub

Private Function getCommandBar(barCaption As String)
Dim i As Integer

For i = Application.CommandBars.Count To 1 Step -1
If Application.CommandBars(i).Name = barCaption Then
Set getCommandBar = Application.CommandBars(i)
Exit Function
End If
Next i

Set getCommandBar = Nothing
End Function


代码2(Module):

Option Explicit

Sub autoAdjust()
Dim formulaString As String
Dim i As Integer
Dim sheet As Worksheet

Set sheet = ActiveSheet

'addjust column
sheet.Columns("E:Z").ColumnWidth = 8
sheet.Columns("G:G").Delete Shift:=xlToLeft
sheet.Columns("H:H").Delete Shift:=xlToLeft
sheet.Columns("I:J").Delete Shift:=xlToLeft
sheet.Columns("J:J").Delete Shift:=xlToLeft

' unmerge
Dim mergeCells, cell As Range
Dim formula As Variant
Dim iRow, iCol As Integer

For iRow = 3 To 100
For iCol = 1 To 15
Set cell = sheet.Cells(iRow, iCol)
If cell.mergeCells Then
Set mergeCells = cell.MergeArea
cell.UnMerge
formula = cell.formula
mergeCells.Cells.formula = formula
End If
Next iCol
Next iRow

'split size
'size formula format: =length * width * height
Dim lst() As String
For i = 3 To 100
formulaString = sheet.Cells.Item(i, "I").formula
If Len(formulaString) > 1 Then
lst = Split(Mid(formulaString, 2), "*")
If UBound(lst) <> 2 Then
With sheet.Range(sheet.Cells.Item(i, "I"), sheet.Cells.Item(i, "L"))
.formula = formulaString
.Interior.ColorIndex = 3
.Interior.Pattern = xlSolid
End With
Else
sheet.Cells.Item(i, "J") = lst(0) 'length
sheet.Cells.Item(i, "K") = lst(1) 'width
sheet.Cells.Item(i, "L") = lst(2) 'height
End If
End If
Next i

sheet.Columns("I:I").Delete Shift:=xlToLeft
sheet.Columns("A:B").Insert Shift:=xlToRight

sheet.Range("A3:A100") = Split(ActiveWorkbook.Name, ".")(0)
sheet.Range("B3") = 1
Range("B4").FormulaR1C1 = "=R[-1]C + 1"
Range("B4").AutoFill Destination:=Range("B4:B96"), Type:=xlFillDefault
Range("B3").Select

End Sub

(完)

2008-06-16

佳的美(GADMEI) UTV 380 在 XP SP3 上安装驱动

升级了 SP3,无法安装电视棒的驱动程序了,提示要先安装 SP2。
驱动安装程序是使用 install shield 打包的,可以解压缩驱动程序包,使用 inf 文件,windows xp 自动安装。

1.下载 install shield cab 解压缩工具 i6comp
下载地址:http://hobbes.nmsu.edu/cgi-bin/h-viewer?sh=1&fname=/pub/os2/win32os2/i6comp020.zip

2.将下载的工具 i6comp020.zip 解压缩到任意文件夹

3.将 UTV 380 的驱动文件安装目录下的 driver\install\ 的所有文件复制到上面的文件夹中的 Release 的下级文件夹中

4.在开始菜单中,选择运行,输入命令: cmd,打开 Dos 命令窗口

5.在 Dos 窗口输入命令, []内为说明,无需输入,每行输入结束,按回车键
cd M:\i6comp020\Release [将 M:\i6comp020 改为你解的文件夹]
i6comp e data1.cab
i6comp e data2.cab

6.插入电视棒,系统提示找到新硬件,点击浏览按钮,打开刚才驱动解压出来的文件夹,点击 OK,一路继续。

7.安装应用程序。

其实,造成无法安装的原因,我想是驱动安装程序将系统环境设置死了,如果是有意为之,那是太细心了,未来没测试过的平台,就不给安装了。如果不是,那是有点粗心了,或是思维定势?

不管怎么说,我按上面的方法安装后,并没有发现使用与 SP2 有任何差别,况且,听说 SP3 也就是收集了 SP2 之后的补丁而已,并没有什么大的改变。

令人遗憾的是,在官方论坛上,却迟迟没有发布新的驱动程序安装包,如果不是管理问题,那只能说,对客户实在是不敬。因为,在我看来,改一下安装包,只不过是在判断条件上,多加一个 OR 而已:
if (systemEv != sp2 || systemEv != sp3){
alert("请安装SP2.")
}

在 ubuntu 8.04 中,安装了 v4l2 后,使用 card=37(UTV330),检索不到频道,看频段,55M~900M,应该是正确的吧。改为 card = 6,则提示无法设置频率,可能因为代码中没定义 turn。v4l2 的代码,没精力和时间去研究,只能遗憾放弃,看电视,还是重启到 xp 了。

2008-02-10

注意安全

总是很容易粗心大意,做事不够严谨,一般来说,这不会有太大的后果,但涉及到安全问题,还是不能太随便。
年前,为了方便,在厨房加装一个插座。这对于我来说,是很平常的事。准备了线材,工具等就开工了。第一步,当然是拉闸断电;第二步是爬上天花板,走暗线;第三步是并上电源线,第四步是安装多用插座。在打开多用插座后,发现里面少了枚螺丝,不想再去弄一只,于是打算直接穿线后拧死。事情就在这时发生了,当我直接用手去穿线时,天哪,我被结结实实地电着了!忙乱中,使劲地甩手,当我下来时,手被多用插座的铜片划出了N道血口,但还不如被电击时那浑身震颤的难受滋味,这在我N次被电的记录中,是最为严重的一次,可能与我捏实了电线有关系吧,这次电下来,半天才回过神来。
追查原因是,家里竟然有两处电闸!我断的是与厨房无关的那只,天哪,太恐怖了!

这次的教训是非常“沉重”的,分析了我的处理流程,有多处马虎的地方:
1、这是在老丈人家,由于刚翻修过房子,电路被重新改过,而我却不知情。照理,在断电后,应当进行确认,尤其是在别人布的线路上作业时。如果当时我开灯,或是用电笔进行测试,就会在第一时间发现这个问题。
2、为了安全起见,应该小心地以假想带电模式下进行操作。如电源并接应当在连接终端完成之后来做,而我却是先连接电源,然后再安装多用插座。(连接电源其实是做了个插头,接到一处插座上,因此没有发生触电)连接插座时,发现少了一枚螺丝,最好还是重新换一个,因为直接拧线连接,有可能会造成连接不可靠,在接入大功率设备时(如电炉等几千瓦的加热器),容易产生电弧发热,留下火灾的安全隐患。

还好,没有造成更严重的结果,真是万幸,安全一定要注意啊。
还有象插头制作,一定要考虑连接线头是不是牢固可靠,线头是不是压实了,或是考虑打个结,不要简单一接了事,不是每个人,每一次都会老老实实地握住插头来拨电线的,万一拉出一根线来,可就危险了。

2008-01-23

eclipse3.3 + tomcat5.5.25 启动web服务器错误

在启动tomcat5.5服务器时出错,提示:
atalina.startup.Bootstrap start
java.lang.ClassNotFoundException: org.apache.catalina.startup.Catalina
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.apache.catalina.startup.Bootstrap.init(Bootstrap.java:222)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:410)

eclipse3.3启动器生成的命令是:
M:\Application\Java\jdk1.5.0_14\bin\javaw.exe -Dcatalina.base=M:\Mostone.Personal\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0 -Dcatalina.home=M:\Application\apache-tomcat-5.5.25 -Dwtp.deploy=M:\Mostone.Personal\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps -Djava.endorsed.dirs=M:\Application\apache-tomcat-5.5.25\common\endorsed -classpath M:\Application\apache-tomcat-5.5.25\bin\bootstrap.jar;M:\Application\Java\jdk1.5.0_14\lib\tools.jar org.apache.catalina.startup.Bootstrap start

最终找到原因是:catalina.base不正确而找不到tomcat的lib目录下那些jar文件,如:apache-tomcat-5.5.25\server\lib\catalina.jar等,启动失败.

关于catalina.base和catalina.home这两个参数的描述,我在apache-tomcat-5.5.25\bin\catalina.bat中找到的相关信息是:
rem CATALINA_HOME May point at your Catalina "build" directory.
rem
rem CATALINA_BASE (Optional) Base directory for resolving dynamic portions
rem of a Catalina installation. If not present, resolves to
rem the same directory that CATALINA_HOME points to.
catalina.home应该是Application所在目录,catalina.base是tomcat的安装目录,如果省略catalina.base参数,则使用catalina.home作为tomcat的安装目录.

将VM参数的-Dcatalina.base与-Dcatalina.home互换,启动成功,但eclipse IDE环境下的Server project中配置文件 server.xml 不能载入,载入的是tomcat目录下的 server.xml,影响eclipse自动发布.

我不确定,出现这个问题与安装tomcat是否有关.我的环境是:
OS: Windows XP Pro
JDK: jkd1.5-14(只安装了开发包,PATH变量是手工加的)
tomcat: 5.5.25(下载的是zip包,而不是service安装包)

tomcat解压后,startup成功,但eclipse缺省下run on server出现以上问题,不知道在直接安装service版tomcat情况下是否能成功启动。

时间不早了,昨天没睡好,今晚早点睡,改天折腾吧.

(续上)
今天无意打开Server project目录下的文件,发现catalina.policy和catalina.properties中有运行环境的设置,才猛然想起,这些文件被我覆盖过。因为原来用的是tomcat 6.0,我改过server.xml。

将Servers project删除,重新建立,这次再运行,一切OK。

费了这么多时间,真是冤枉啊,太郁闷了,未能快速找出错误的解决方法,是我不了解eclipse启动的背后,不知道从哪里入手查找问题,不过,翻看E文文档资料,对于我来说还是件难事。
By mostone.Jiang