随笔-46  评论-54  文章-0  trackbacks-0
  2005年10月12日
在 Windows 上离线安装 Chrome
https://support.google.com/chrome/answer/126299?hl=zh-Hans
这里链接默认是32位的。
针对所有用户安装版64位完整链接为:
https://www.google.com/chrome/browser/desktop/index.html?system=true&standalone=1&platform=win64

Chorome快捷方式+SwitchyOmega

/Files/rox/chrome.7z
posted @ 2016-05-21 20:52 rox 阅读(336) | 评论 (0)编辑 收藏
参加了国内某知名快递公司的面试,一面就放弃了
自己公司的一个HR经理也曾经教过要换位思考,现在简单的介绍一下面试过程中的一些感想。
1. HR打电话的时候,问周六有没有空?
问题:虽然是专场,但这是很多HR应该规避的,应该尽量说明这是公司的安排,这种周六加班不是企业文化。
建议:曾经遇到过的几个HR都非常注意这一点,特别说明晚上和周末一般都不加班,虽然说HR多半都是骗子,呵呵!
2. 回答都有空,便安排在早晨的第二个时间段
问题:实际上安排了将近50人在早晨面试,可想而知,是面不完的。
      现场有点貌似华为面试,只不过不是在食堂:D
      11点左右HR一面,20分钟,到了12点钟,组织方开始发餐票,到隔壁快餐店用餐。
      没拿餐票,直接回家了。
建议:组织安排上,还算OK,但稍微比较有经验和有能力的HR,应该不会做这样的安排。
      即使是新项目启动,采取这样方式海招,风险比较大,应该是一个相对长期的过程,可以把招聘过程安排的相对宽松点。
      在公司,自己也做技术面试,一般都会面半个小时到一个小时左右,连续面了两个以上,精力和质量就会下降的很厉害。
3. 一面HR的内容,2分钟介绍自己,同时看表,增加面试着的压力。再问了工作和生活上的问题,还有技术问题!
问题:技术问题,比较有意思。
      HR问,最近一年,业界都有那些新技术,回答了Android和iPhone,猜他是想问云计算(面试前调研过,该公司有一直想进电商行业)。
      然后,HR再问Java方面有啥新技术,特意回答没啥新的啊。这个后来被自己朋友批,不知道反问他么!
      这时,HR就做出了一个重大的决定,准备开始对我的职位进行降级。问有没有意向,直接否掉。
      然后就说,各个公司的职位要求不一样,该公司要求更高点,就结束谈话,等待下一轮面试。
      40分钟后,开始发餐票。自己什么都没说就走了,这个其实也是特意做的,后面会有解释。
建议:面试20多分钟,都是HR对面试者进行提问和定位,不留给对方了解相关项目的机会,这个很少见。
      另外,很多初级HR只对项目里面说需要技术单词比较敏感,往往会在面试的时候,就急于问,好进行准确定位。
      但又怕问了以后会让面试者对后面的技术面试有所准备,技巧啊,技巧啊!
另外:解释一下自己没领餐票直接走人,其实想看一下组织方会有哪些动作。
      1. 发餐票的HR妹妹,啥也没问,直接放走。一个已经等了将近三个小时面试者,却不愿意再多等一个小时,没有任何疑问。这种情况发生在自己公司,会被HR经理骂的。呵呵!
      2. 负责一面的HR,大约在一个小时后的确给电话了,你在哪?自己说回家了,然后HR就说那下次有机会再联系吧,就挂了。看来他真的很忙。呵呵!
也参与过自己公司的很多面试,接触HR比较多,从HR经理那里也学到了不少东西,包括压力测试(其实,面试者也可以多给HR一些压力测试)。
感觉这个非常有意思,比和搞技术的打交道有意思。
把自己面试时的一些想法和技巧列出来。
可能还是太片面,而且带着搞技术的那种“坏味道”。
只是希望能为大家提供一点点参考。
posted @ 2013-07-28 11:53 rox 阅读(193) | 评论 (0)编辑 收藏
前一家公司经理的思想是,设计好的系统是绝对不会出错的。需要容错,绝对是没设计好。
这个似乎有道理,但完全不考虑,真正实际环境,是涉及到三方交易结算的的东西啊,真替他捏把汗。

现在的项目,一堆Oracle、腾讯、华为、证券摸爬滚打出来的技术精英,还包括一个纯servlet+jdbc开源项目的作者凑一堆。
不懂Tomcat下为什么要配置filter转码,把这个和虚拟机编码机制混为一谈,最后感慨一句weblogic就没这问题。
也有不懂啥是乐观锁的。
面试的时候,对集合类型及操作考的头头是道,但项目里,一个都没用到。
项目中遇到问题,往往就是解决、解决+解决,不究其原理。
感觉自己像在做硬件拼装的富士康。

牢骚两句。
posted @ 2013-07-21 23:19 rox 阅读(235) | 评论 (0)编辑 收藏
安装64位Ubuntu,方法其实解决方案很简单,不用下载任何的ISO,只要去下载最新的64位包,见下面资源。
拷贝wubi.exe和下载好的ubuntu-12.04-wubi-amd64.tar.xz都拷贝到C盘根目录下,然后执行下面命令即可。

1 wubi.exe --dimagepath=c:\ubuntu-12.04-wubi-amd64.tar.xz

资源:
What is ubuntu-11.10-wubi-amd64.tar.xz ? 

wubi安装Ubuntu11.**正确方法及无限等待下载amd64.tar.xz解决方法

http://cdimage.ubuntu.com/wubi/current/amd64.tar.xz

http://releases.ubuntu.com/12.04/ubuntu-12.04-wubi-amd64.tar.xz
posted @ 2012-07-12 13:26 rox 阅读(6512) | 评论 (4)编辑 收藏
 

参考了这篇the script is not working for any mvc frameworkuri的回复,结合当前Uploadifyv2.1.4版,netbean 6.9.1下编写调试。

        新建grails工程,名为test,并把Uploadify-v2.1.4.zip解压到web-app\uploadify目录下。

        新建grails控制器PictureController,代码如下

package com.test

 

class PictureController {

 

    def index = { redirect(action: "upload") }

 

    def upload = { }

 

    def savePicture = {

       def files = request.getFileMap();

       def path = "c:/test/" + files.get("Filedata").getOriginalFilename();

       files.get("Filedata").transferTo( new File(path))

       render (view:'upload')

    }

}

        新建grails视图upload.gsp,代码如下,注意粗体部分的上下文路径

<html>

  <head>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <title>upload file sample</title>

    <link rel="stylesheet" href="/test/uploadify/uploadify.css" type="text/css" />

    <script type="text/javascript" src="/test/uploadify/jquery-1.4.2.min.js"></script>

    <script type="text/javascript" src="/test/uploadify/swfobject.js"></script>

    <script type="text/javascript" src="/test/uploadify/jquery.uploadify.v2.1.4.min.js"></script>

    <script type="text/javascript">

    $(document).ready(function() {

            $("#fileUpload").uploadify({

                'uploader': '/test/uploadify/uploadify.swf',

              'cancelImg': '/test/uploadify/cancel.png',

              'script': '/test/picture/savePicture',

              'folder': 'files',

              'multi': true,

              'buttonText': 'add',

              'displayData': 'speed',

              'simUploadLimit': 2

            });

    });

    </script>

  </head>

  <body>

    <hr width=100% size="1" color="" align="center">

        <h2>Multiple File Upload</h2>

        <p>checkScript, buttonText, simulataneous upload limit</p>

        <div id="fileUpload">You have a problem with your javascript</div>

        <a href="javascript:$('#fileUpload').uploadifyUpload()">Start Upload</a> |  <a href="javascript:$('#fileUpload').uploadifyClearQueue()">Clear Queue</a>

<p></p>

  </body>

</html>

        运行工程,访问http://localhost:8080/test/picture/upload

posted @ 2010-12-06 15:38 rox 阅读(1062) | 评论 (2)编辑 收藏

公司安排研究耶鲁CAS单点登录的实现,并研究了一下它的代理协议,看了N多文档和代码,才大概明白是怎么回事。
为了方便有兴趣的朋友学习,去掉了HTTPS的加密,源代码、webapp包和配置文件都有。
本来打算针对这个写篇文章,不想写了。

  

另:

  • 针对cas-server-2.0.12和cas-client-2.0.11的
  • ppt中部分内容是翻译+自己理解的,中英文水平均有限,请谅解。

下载地址:

posted @ 2010-04-14 17:41 rox 阅读(585) | 评论 (2)编辑 收藏
JasperReports数据库查询父子报表模板



  • 安装并打开iReport,并新建一个报表文件(见图-1)
[图-1]

  • 选择在“c:\test”目录下建立一个find文件(见图-2)
[图-2]

  • 新建一个datasource,选择jdbc连接方式,命名为find。使用HSQLDB(File)方式,url为jdbc:hsqldb:c:/test/find.hsql,用户名为sa,密码为空,测试一下,成功了,保存即可(见图-3、图-4、图-5
[图-3]

[图-4]

[图-5]

  • 设置报表查询语句、字段后,组和结束页面基本跳过(见图-6、图-7、图-8、图-9
[图-6]

[图-7]


[图-8]


[图-9]

  • 其实做到这里,就可以自己制作根据数据库查询报表了,要画图设置一些参数,说起来麻烦,就干脆打开样例模板来看看结果吧。
这里需要说明的是report1.jrxml是主报表、report1_subreport2.jrxml是子报表,主报表查出的每条记录的结果CLASSNAME作为子报表的查询条件参数传递过去(见图-10、图-11、图-12、图-13
[图-10]

[图-11]

[图-12]

[图-13]


参考资料:
  • 样例模板和数据库
http://docs.google.com/leaf?id=0B8vmIM2WmTA2OWE5ZGY0OTktMTkyZC00ZTljLTg1YjMtODA5ZWQ3NjA0MjMz&hl=zh_CN

  • Creating JasperReport subreports
http://publib.boulder.ibm.com/infocenter/rbdhelp/v7r5m0/index.jsp?topic=/com.ibm.egl.pg.doc/topics/pegl_rep_subreport_create_tsk.html

  • 利用复合的javabean构造基于jasperreports的子报表

本文地址
posted @ 2010-02-26 16:12 rox 阅读(607) | 评论 (0)编辑 收藏

原帖地址:java开发的乱码问题

 

第一,存文件必须以一种编码存;读文件也必须以一种编码读,如不特别设置,去系统默认的编码,中文windows为GBK编码。

从.java->.class过程是,先编写.java文件并按莫种编码方式保存,然后用javac方法编译此文件,注意如.java没按系统默认编码保存则要带encoding参数指明实际编码,否则出错,生成的.class文件存为系统默认编码。

从.jsp->.java->.class,先存为某种编码的.jsp文件,然后tomcat根据pageEncoding读取并转化为servlet存为系统默认编码,然后同上面.java->.class过程。

第二,IDE的encoding为对系统下文件打开的解码方式或保存的编码方式。特例:如果.jsp文件有<%@ page language="java" pageEncoding="UTF-8"%>,则eclipse会自动存为UTF-8方式,不管eclipse的encoding是什么,这也是eclipse的聪明之处。

第三,
pageEncoding="UTF-8"表示此文件的编码方式,必须与此文件存储方式一致(所以eclipse会首选根据它来存文件),tomcat根据这个来读此.jsp文件并编译为servlet。
contentType="text/html;charset=UTF-8"表示当浏览器得到此文件时以什么方式解码。例如:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
 <head>
  <title>test</title>
 </head>
 <body>
  我是个好人
 </body>
</html>
会产生乱码,因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码。

至此,页面应为:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
 <head>
  <title>中文问题</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 </head>
</html>

第四,
request.setCharacterEncoding("UTF-8")是把提交内容的字符集设为UTF-8
response.setCharacterEncoding("UTF-8")可以把页面中的<%@ page contentType="text/html;charset=iso8859-1"%>换为charset=UTF-8,是给告诉浏览器我这个文件的编码方式。

第五,表单提交:无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");来转换成你想要的UTF-8编码方式。但如果每处都加词句太麻烦,故分post和get两种方式区分提交(tomcat5以后分开处理,之前处理方式一样,即都可以用request.setCharacterEncoding("UTF-8")方法处理,不过tomcat5以后get提交方法用此语句无效)。
1,post提交的数据:
程序加上org.springframework.web.filter.CharacterEncodingFilter过滤器.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

因为规范要求浏览器提交数据都要用utf8编码,所以这里设置编码方式为UTF8.

特别注意:
a,这个过滤器只是简单的调用:request.setCharacterEncoding(this.encoding);
在这个语句之前不能调用任何的request.getParameter()方法,否则会设置tomcat的缺省字符集为"ISO-8859-1",并且使setCharacterEncoding的调用失效.所以在这个过滤器之前的过滤器中不能有对getParameter这类方法的调用,比较安全的做法就是把这个过滤器尽量靠前放.
b,在server.xml中不能加上<Valve className="org.apache.catalina.valves.RequestDumperValve"/>
这个value也设置tomcat的缺省字符集为"ISO-8859-1",使setCharacterEncoding的调用失效.可能其他的value也有这个问题,我没有测试过.
如果要观察http请求参数,可以考虑用过滤器或者其他工具,例如ethereal(http://www.ethereal.com/)

2,get提交的数据:
两种情况:
a,如果从地址栏直接输入汉字,则一般编码为"GBK",需要用
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK")
取出
b,如果是页面超连接连接中带的汉字,则编码根据页面编码的不同而不同,如果页面的
content="text/html; charset=utf-8",则在tomcat/conf/server.xml中的配置文件中:
<!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 -->
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true"
disableUploadTimeout="true" />

加上:useBodyEncodingForURI="true"即可正常使用getParameter取出正确内容.
如果content="text/html; charset=GBK",需用
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK")
取出,其他情况类似.

总结:
1,所有页面使用utf8编码,
2,服务器加上过滤器,
3,server.xml中不要使用
<Valve className="org.apache.catalina.valves.RequestDumperValve"/>
4,server.xml文件加上useBodyEncodingForURI="true"
这样应该可以搞定大多数前台的中文问题.至于地址栏输入中文,不支持也罢,一般的程序很少要求
从这里输入.

第六,连接数据库

1、mysql配置文件:
修改mysql在windowsmy.ini里default-character-set=utf-8

2、mysql里数据库和表也都设为utf8_unicode_ci

3、数据库连结:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8
注意,关键就在于此:此句中间是'&'不是'&amp;'这是因为数据库连结时,在.jsp和.java文件中应该用&号,而XML文件中需要用&amp

posted @ 2010-01-05 08:43 rox 阅读(420) | 评论 (0)编辑 收藏

原帖:http://chenyaqiong81081.blog.163.com/blog/static/44622594200791235256255/

一、Runtime.getRuntime().exec()执行命令情况:
       Runtime.getRuntime().exec("cmd /c your command")//2000
       Runtime.getRuntime().exec("command /c your command")//98
       Runtime.getRuntime().exec("sh/ your command")//linux

二、执行.sh文件的情况:
      1、把命令写成a.sh ;执行命令的时候
           Process child = Runtime.getRuntime().exec("bash a.sh,null,new File("//usr/local/mysql/bin/"));
           child.waitFor();
           ........
       2、Process child = Runtime.getRuntime().

                                          exec(new String[] {"/bin/sh","-c","mysqldump -u root -p7788919 axtic_cg" },

                                                   null,
                                                   new File("/usr/local/mysql/bin/"));
            child.waitFor();

            注:waitFor()等待操作完成

posted @ 2009-12-29 17:10 rox 阅读(2799) | 评论 (0)编辑 收藏
     摘要: Java多层目录打包和解压代码(apache commons compress, io, lang)   package zip;   import java.io.BufferedOutputStream; ...  阅读全文
posted @ 2009-11-12 22:53 rox 阅读(3947) | 评论 (1)编辑 收藏

Windows XP增强dos命令

命令:DIR,列文件、目录

增加参数:/-C
参数说明:DIR列文件、目录时显示的文件大小,其数值以千为单位进行分隔,使用此参数即“DIR/-C”将取消显示中的分隔符,以满足部分人的视觉习惯。

增加参数:/Q
参数说明:Windows是多用户操作系统,使用此参数即“DIR /Q”列文件、目录时,将显示出文件、目录的用户属性。

增加参数:/T:C、/T:A、/T:W
参数说明:使用此参数即“DIR/T:C”、“DIR/T:A”、“DIR/T:W”分别显示文件、目录的创建时间、上次访问时间和上次修改时间。

增加参数:/X
参数说明:使用此参数即“DIR/X”列文件、目录时,会对长文件名同时显示“8.3”格式的文件名。

命令:CD,改变目录

增加参数:/D
参数说明:此参数的作用是快速改变当前目录,比如当前目录是C:\Windows,使用命令“CD/D E:\Tools”可快速切换到E:\Tools目录下。注:只有在Win XP的“运行”文本框中输入“CMD”得到的DOS窗口中才能使用此参数。

命令:MD,建立目录

功能说明:此命令并未增加参数,但是增强了功能,它可一次建立多级子目录, 例如使用命令“MD AA\BB\CC\DD”将一次性创建AA、BB、CC、DD四级子目录。而在老版本的DOS中,若不存在AA子目录,便无法直接建立AA下的BB等深层子目录。

命令:RD,删除目录

增加参数:/S
参数说明:使用此参数即“RD/S”用于删除目录树,即删除目录及目录下的所有子目录和文件,相当于以前版本中的DELTREE命令。

增加参数:/Q
参数说明:使用上面的/S参数删除目录树时,系统会要求用户确认是否真的要删除。若同时使用/Q参数即“RD/S /Q”,在进行删除操作时将取消确认,相当于DELTREE命令的/Y参数。

命令:DEL,删除文件或目录

增加参数:/F
参数说明:使用此参数即“DEL/F”可删除只读文件。

增加参数:/S、/Q
参数说明:使用此参数即“DEL/S”作用与“RD/S”完全相同,即删除目录及目录下的所有子目录和文件。同时使用参数/Q,可取消删除操作时的系统确认。

增加参数:/A
参数说明:删除指定属性或指定属性以外的文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件。

命令:ATTRIB,更改文件或目录的属性

增加参数:/D
参数说明:在Win XP中我们不能把文件或文件夹设置为系统属性,只能设为只读、隐藏或存档属性。而带参数/D使用ATTRIB命令可以对文件的所有属性进行设定,设定时必须与参数/S同时使用。例如“ATTRIB /S /D +S D:\Study”,作用是将D:\Study文件夹设置为系统文件夹。

命令:Format,格式化磁盘

增加参数:/FS:filessystem
参数说明:按指定文件系统类型(FAT、FAT32、NTFS)格式化磁盘,例如“Format /FS:NTFS”。

命令:DATE、TIME,显示系统日期和时间

增加参数:/T
参数说明:使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和时间,而不必输入新日期和时间

Win2000/XP应用之奇技酷招

每个Windows用户都希望Windows的启动速度越快越好,不过,如果你想让Windows启动速度更快些,还要掌握一些加速Windows启动的独门秘技!

1.不容忽视的磁盘IDE通道

Windows XP中有一个非常影响启动速度的设置,那就是磁盘IDE通道。一般来说,Windows XP用户不需要安装主板的IDE驱动或补丁程序,ULTRA DMA功能就已经打开了。也正因为如此,绝大多数用户会让IDE通道处于自动状态,但这会导致Windows XP启动变慢——因为主板可以连接四个IDE设备,但大多数电脑只有两个IDE设备,即硬盘和光驱。少数人可能有单硬盘、双光驱(DVD和刻录机)或双硬盘、单光驱,即便这样也只有三个IDE设备,所以一般都有1~2个IDE通道处于空闲状态。此时,你应该把并不存在的IDE设备设置为“无”,而不是“自动检测”。

提示:设置IDE通道的方法是:单击“开始→控制面板”,双击“系统”,切换到“硬件”选项卡,单击“设备管理器”,再双击“IDE ATA/ATAPI控制器”。双击下面的“主要IDE通道”或“次要IDE通道”。我们可以看到,“设备0”下面的“设备类型”不可选,表明该IDE通道目前已被使用。“设备1”下面的“设备类型”可选,如果你近期内不再添加新的IDE设备,可以将“设备类型”设置为“无”。

2.禁用服务和启用Power User

Windows 2000/XP的启动速度要比Windows 9x/Me慢,众多的服务是重要因素之一,因此普通用户禁用一些无用的服务,对启动速度也有很大帮助:

alerter (用户不在局域网并且不需要管理警报)

clipbook (用户不需要查看远程剪贴簿的剪贴页面)

distributed link tracking client (用户不使用NTFS分区并且没有连入局域网)

distributed transaction coordinator (不需要同时处理多个数据库或文件系统)

fax service (不需要发送或接收传真)

ftp publishing service(你的电脑不做为FTP服务器使用)

iis admin service (你的电脑不做为Web服务器使用)

另外,建议大家创建一个Power User用户,平时用它来登录Windows 2000/XP,因为相比管理员身份,它启动的服务更少同时也更加安全。

3.及时清理日志文件

Windows 2000/XP的日志文件比较容易被用户忽视。其实当我们每次开关机、运行程序、系统报错时,这些信息都会被记录下来,保存在日志文件中。但日志文件会随着时间的增长越来越大,从而影响了系统启动速度。我们可以自己指定日志文件的大小及处理方式:

进入“开始→设置→控制面板→管理工具”,双击“事件查看器”或是单击“开始→运行”,输入“eventvwr.msc”后回车,即可打开“事件查看器”,在右侧窗口中可看到应用程序日志、安全日志和系统日志。在任意一种日志上面右击并选择“属性”,就可以在如图所示的对话框中为日志文件设定最大值,还可以选择当日志满了以后的处理方式——一般来说让它自动覆盖一段时间以前的旧日志,这样日志文件就永远不会超出指定大小。单击“筛选器”选项卡可以指定需要写入日志文件的事件类型。


设置“系统日志”的属性

4.借花献佛加快Windows 2000 启动

Windows XP相比Windows 2000在很多方面进行了优化改进,因而启动速度更快,那么能不能让Windows 2000也可以享受这样的好处呢?其实,只要找到Windows XP相应语言版本文件,然后替换Windows 2000的相应文件即可。这两个文件为NTLDR、NTDETECT.COM,它们都在系统分区的根目录下。当然,为了防止Windows 2000出错,建议用户在替换这两个文件前备份Windows 2000原有的同名文件。

5.让蓝色滚动条只滚动一圈

这是一个适用于Windows XP的秘技。打开“注册表编辑器”,依次展开[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters]分支,然后双击右侧窗口中的DWORD值“EnablePrefetcher”,将其值由“3” 改为“1”。退出注册表编辑器并重启电脑,你会发现进入Windows XP时蓝色滚动条的滚动时间明显减少了!

posted @ 2009-09-23 09:26 rox 阅读(348) | 评论 (0)编辑 收藏

Java解压多重zip压缩包

    -- org.apache.commons.compress.archivers.zip.ZipFile结合ZipArchiveInputStream来实现

针对前一篇文章Javazip-- ByteArrayOutputStreamorg.apache.commons.compress打包后的zip文件如何解压的问题。

部分代码如下:



        File f = new File("c:/test.zip");

        ZipFile zf = new ZipFile(f, "gbk");

        File folder = new File("c:/test");

        if (!folder.exists()) {

            folder.mkdirs();

        }



        for (Enumeration<ZipArchiveEntry> files = zf.getEntries(); files.hasMoreElements();) {



            ZipArchiveEntry zae = files.nextElement();

            String zipname = zae.getName();

            if (zipname.endsWith(".zip")) {

                String innerzip = StringUtils.removeEnd(zipname, ".zip");

                File innerfolder = new File(folder + File.separator + innerzip);

                if (!innerfolder.exists()) {

                    innerfolder.mkdirs();

                }

                ZipArchiveInputStream zais = new ZipArchiveInputStream(zf.getInputStream(zae), "GBK", true);

                FileOutputStream fos = null;

                ZipArchiveEntry innerzae = null;

                while ((innerzae = zais.getNextZipEntry()) != null) {

                    fos = new FileOutputStream(folder + File.separator + innerzip + File.separator + innerzae.getName());

                    IOUtils.copy(zais, fos);

                }

                zais.close();

                fos.flush();

                fos.close();

            } else {

                ZipArchiveEntry packinfo = zf.getEntry(zipname);

                String filename = folder + File.separator + zipname;

                FileOutputStream fos = new FileOutputStream(filename);

                InputStream is = zf.getInputStream(packinfo);

                IOUtils.copy(is, fos);

                is.close();

                fos.flush();

                fos.close();

            }

        }

        zf.close();



解包后效果如下图:

 



参考资料:

1、《Java打多重zip压缩包 -- ByteArrayOutputStream结合org.apache.commons.compress来实现》

http://docs.google.com/View?id=ajfmzbdvh8wz_38ftxv59f6



2Apache Commons Compress

http://commons.apache.org/compress/



3、本文地址

http://docs.google.com/View?id=ajfmzbdvh8wz_44cbjdbrfn







 

posted @ 2009-07-28 19:02 rox 阅读(6622) | 评论 (0)编辑 收藏

Java打多重zip压缩

    -- ByteArrayOutputStream结合org.apache.commons.compress来实现



也就是很多个zip文件,但是打包的时候,部分要先集中到一个zip文件后,再写入总的zip文件。

可以采用临时文件夹的方式来解决,下面也是一种解决方法,部分代码如下:



        File f1 = new File("C:/boot.ini");

        File f2 = new File("C:/NTDETECT.COM");



        final ByteArrayOutputStream baos = new ByteArrayOutputStream() ;



        //changed @ 20097218:37:41

        //ArchiveOutputStream ostemp = new ArchiveStreamFactory().createArchiveOutputStream("zip", baos);

        ZipArchiveOutputStream ostemp = new ZipArchiveOutputStream(baos);

        ostemp.setEncoding("GBK");



        ostemp.putArchiveEntry(new ZipArchiveEntry(f1.getName()));

        IOUtils.copy(new FileInputStream(f1), ostemp);

        ostemp.closeArchiveEntry();



        ostemp.putArchiveEntry(new ZipArchiveEntry(f2.getName()));

        IOUtils.copy(new FileInputStream(f2), ostemp);

        ostemp.closeArchiveEntry();



        ostemp.finish();

        ostemp.close();





        final OutputStream out = new FileOutputStream("c:/test.zip");

        ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream("zip", out);



        os.putArchiveEntry(new ZipArchiveEntry("打包.zip"));

        baos.writeTo(os);

        os.closeArchiveEntry();



        baos.close();



        os.finish();

        os.close();

[changed @ 20097218:37:41]

当初查资料时,就知道有个乱码错误,自己从没发现过,后来发现是因为winrar 3.8已经解决了这个问题。

但是为了和其他兼容,修改了代码。



打包后效果如下图:

 

参考资料:

1Commons Compress

http://labs.xiaonei.com/apache-mirror/commons/compress/binaries/commons-compress-1.0-bin.tar.gz



2java.io.ByteArrayOutputStream

http://java.sun.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html



3、本文地址

http://docs.google.com/View?id=ajfmzbdvh8wz_38ftxv59f6

 

posted @ 2009-07-02 17:04 rox 阅读(1753) | 评论 (0)编辑 收藏

 

  Apache Solr集成至Tomcat

    原有系统已经开发,框架以SSH为基础,页面编码GBK,数据库为oracle,容器为tomcat6,需要整合全文检索,下面只是一个简单的整合测试。

1、嵌入Tomcat

解压 apache-solr-1.3.0.tgz,拷贝apache-solr-1.3.0\example\example-DIH\solr目录到Tomcat的安装目录后,修改solr目录中的solr.xml,屏蔽rss部分的配置,内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<solr sharedLib="lib" persistent="true">
 <cores adminPath="/admin/cores">
  <core default="true" instanceDir="db" name="db"></core>
<!--
  <core default="false" instanceDir="rss" name="rss"></core>
 -->
 </cores>
</solr>

  • 删除Tomcat\solr\rss目录
  • Tomcat\solr\db\lib目录下添加必要jarojdbc14.jarslf4j-jdk14-1.5.5.jarslf4j-api-1.5.5.jarsolr-dataimporthandler-1.4-SNAPSHOT.jar
  • 拷贝apache-solr-1.3.0\example\webapps\solr.warTomcat\webapps目录下。
  • 创建Tomcat\conf\Catalina\localhost\solr.xml,内容如下:

<Context docBase="${catalina.home}/webapps/solr.war" debug="0" crossContext="true" >
   <Environment name="solr/home" type="java.lang.String" value="${catalina.home}/solr" override="true" />
</Context>

  • 修改Tomcat\conf\server.xml,添加一个端口为8983Connector,内容如下:

<Connector port="8983" protocol="HTTP/1.1" 

               connectionTimeout="20000" 

               redirectPort="8443" URIEncoding="UTF-8"/>





2、配置DataImportHandler

change @ 20097110:19:57

    主要修改Tomcat\solr\db\conf\db-data-config.xmlTomcat\solr\db\conf\schema.xmlTomcat\solr\db\conf\solrconfig.xml,三个配置文件:

  • db-data-config.xml

<dataConfig>

    <dataSource driver="oracle.jdbc.driver.OracleDriver"

    url="jdbc:oracle:thin:@localhost:1521:orcl"

    user="solr" password="solr" batchSize="50"/>

    <document name="contents" >

        <entity name="content" pk="ID"

        query="select * from CONTENT"

        deltaQuery="select ID from CONTENT where to_char(PUBTIME,'yyyy-mm-dd hh24:mi:ss') > '${dataimporter.last_index_time}'"

        transformer="ClobTransformer">

            <field name="title" column="TITLE" />

            <field column="CONTENT" clob="true"/>

            <field name="pubtime" column="PUBTIME" />

        </entity>

    </document>

</dataConfig>

  • schema.xml

    types标签最后,追加fieldtype,名称为text_cjk,中日韩分词分析器;

    ......



    <fieldtype name="text_cjk" class="solr.TextField"> 

      <analyzer class="org.apache.lucene.analysis.cjk.CJKAnalyzer"/> 

    </fieldtype>



 </types>



    屏蔽或清除<fields></fields>中的全部代码,并添加如下内容:

 <fields>

   <field name="id" type="slong" indexed="true" stored="true" required="true" /> 

   <field name="title" type="text_cjk" indexed="true" stored="false"/>

   <field name="content" type="text_cjk" indexed="true" stored="true"/>

   <field name="pubtime" type="date" indexed="true" stored="true"/>

   <field name="searchtext" type="text_cjk" indexed="true" stored="false" multiValued="true"/>

 </fields>



    修改默认唯一索引为先前定义的id

 <uniqueKey>id</uniqueKey>



    修改默认搜索字段为先前定义的searchtext,并将要搜索的titlecontent都拷贝到searchtext中,方便统一检索:

......



 <defaultSearchField>searchtext</defaultSearchField>

......



   <copyField source="title" dest="searchtext"/>

   <copyField source="content" dest="searchtext"/>

......

 

add @ 20097110:19:57

  • solrconfig.xml

    修改<dataDir></dataDir>标签中的检索数据存放路径。内容如下:

<dataDir>${catalina.home}/solr/db/data</dataDir>

 

 



3、导入和查询:

  • 完全导入:
    http://localhost:8983/solr/db/dataimport?command=full-import
  • 增量导入:
    http://localhost:8983/solr/db/dataimport?command=delta-import
  • 查询
    http://localhost:8983/solr
    点击db,进入一个搜索页面,填入如下内容:

pubtime:[2007-11-16T00:00:00Z TO 2008-11-28T00:00:00Z]

AND

工作;

pubtime desc

    点击搜索,测试。

4xml解析:

一个简单solr查询结果的辅助搜索类,内容如下:



import java.net.URL;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;



import org.dom4j.Document;

import org.dom4j.Node;

import org.dom4j.io.SAXReader;

import org.apache.commons.lang.time.DateUtils;



public class SolrUtils {

private List<Node> docs = new ArrayList<Node>();

private Number numFound = 0;

private Document doc;

public List<Node> getDocs() {

return docs;

}



public Number getNumFound() {

return numFound;

}

@SuppressWarnings("unchecked")

public SolrUtils(String urlString) {

doc = documentFromURL(urlString);

if (doc != null ) {

docs = (List<Node>)doc.selectNodes("/response/result/doc");

numFound = doc.numberValueOf("/response/result/@numFound");

}

}

public Document documentFromURL(String urlString){

try {

SAXReader reader = new SAXReader();

URL url = new URL(urlString);

       doc = reader.read(url);

       return doc;

} catch (Exception e) {

e.printStackTrace();

}

return null;

}



public static String valueOf(Object obj, String name){

return valueOf(obj, "str", name);

}

public static Date dateValueOf(Object obj, String name){

String[] parsePatterns = new String[]{

"yyyy-MM-dd'T'HH:mm:ss'Z'",

"yyyy-MM-dd'T'HH:mm:ss.S'Z'",

"yyyy-MM-dd'T'HH:mm:ss.SS'Z'",

"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",

};

try {

return DateUtils.parseDate(valueOf(obj, "date", name), parsePatterns);

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

public static String valueOf(Object obj, String type, String name){

String path = "./" + type + "[@name='" + name + "']";

if (obj instanceof Node) {

Node n = (Node)obj;

return n.valueOf(path);

}

return "";

}

public static Number numberValueOf(Object obj, String type, String name){

String path = "./" + type + "[@name='" + name + "']";

if (obj instanceof Node) {

Node n = (Node)obj;

return n.numberValueOf(path);

}

return null;

}

public static void main(String[] args) throws Exception {

String url = "http://localhost:8983/solr/db/select/?q=*%3A*&version=2.2&start=0&rows=10&indent=on";

SolrUtils su = new SolrUtils(url);

System.out.println(su.getNumFound());

System.out.println(su.getDocs().size());

for (Node doc : su.getDocs()) {

System.out.println(valueOf(doc, "id"));

System.out.println(valueOf(doc, "title"));

System.out.println(dateValueOf(doc, "pubtime"));

}



}



}



参考资料:

1Apache Solr 的新特性

http://www.ibm.com/developerworks/cn/java/j-solr-update/



2Solr开发经验[]

http://www.jinsehupan.com/blog/?p=25



3slf4j-jdk14-1.5.5.jarslf4j-api-1.5.5.jarsolr-dataimporthandler-1.4-SNAPSHOT.jar

https://svn.apache.org/repos/asf/lucene/solr/trunk/lib/slf4j-jdk14-1.5.5.jar

https://svn.apache.org/repos/asf/lucene/solr/trunk/lib/slf4j-api-1.5.5.jar

http://people.apache.org/repo/m2-snapshot-repository/org/apache/solr/solr-dataimporthandler/1.4-SNAPSHOT/solr-dataimporthandler-1.4-SNAPSHOT.jar



4、本文地址

http://docs.google.com/View?id=ajfmzbdvh8wz_37f4jv46gb








posted @ 2009-06-28 01:19 rox 阅读(3093) | 评论 (0)编辑 收藏

原帖:http://space.itpub.net/29987/viewspace-51921

有的时候我们看到多个异常的进程需要被kill掉,如果一个一个的去做的话,觉得实在是太慢,下面这里提供有两种方法可以实现对有规律的结果做这个kill的动作。
1.
ps -ef | grep $1| awk '{print $2}' | xargs kill -9
2.
for i in `ps -ef|grep $1|awk '{print $2 }'`
do 
kill -9 $i 
done

另可以把ps语句再增加些参数如下:

ps -ef|grep java| grep -v grep| grep $1| awk '{print $2}'

posted @ 2009-01-07 09:42 rox 阅读(602) | 评论 (0)编辑 收藏
     摘要: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtm...  阅读全文
posted @ 2008-12-30 00:08 rox 阅读(20132) | 评论 (2)编辑 收藏

其实,就是类似原来使用磁盘启动然后手动安装Linux。
一、必须要大于光盘镜像images目录中的diskboot.img文件,以rhel5为例,要大于12M,这个应该不难。
二、下载dd for windows,网址:http://www.chrysocome.net/dd
三、C:\>dd if=c:\diskboot.img of=\\.\h: bs=1M --size --progress
四、内网发布一个HTTP目录,把DVD光盘镜像中的全部文件放到发布目录中。
五、设置U盘启动,进入Linux安装界面,F2,然后输入linux askmethod,配置IP,使用HTTP,访问内网的安装目录即可。

备注,参考这篇文章
http://hi.baidu.com/evanlei/blog/item/3c3135103f0244ffc3ce79aa.html
WinImage写入到U盘,不能正常启动。以我的32M为例,使用WinImage写入后,仍然为32M。
但使用dd for windows,就只有12M,其他的空间消失了,却能够正常启动,也使用1GB卡+读卡器成功启动。

如果容量是4G或者8G,完全可以使用UltraISO,把整个文件写入到U盘中启动直接安装,不过还没有测试过。

posted @ 2008-12-18 16:07 rox 阅读(640) | 评论 (0)编辑 收藏

首先拷贝安装文件到服务器的指定目录/data/archive/
mkisofs -o archive.iso -J -r -v -V archive /data/archive/
移动文件到/data/archive/目录
mv ./archive.iso /data/archive/
开始刻录
cdrecord -v -eject speed=16 dev=/dev/cdrom /data/archive/archive.iso
完毕后,删除目录
rm -rf /data/archive/

参考资料:
1、在 Linux 上烧录 CD - 命令行上的 mkisofs 和 cdrecord 使这一切成为可能
http://www.ibm.com/developerworks/cn/linux/l-cdburn/index.html

2、 Linux下刻录CD-R:cdrecord 和cdparanoia(五)
http://www.networkdictionary.cn/software/Linux610.php

posted @ 2008-06-24 11:11 rox 阅读(455) | 评论 (0)编辑 收藏
     摘要: 1、 1cd /data/ 2tar -xzf mysql-5.0.37-linux-i686.tar.gz 3cd ./mysql-5.0.37-linux-i686 4cat ./INSTALL-BINARY  参考以下说明:     1shell> groupadd...  阅读全文
posted @ 2008-06-10 19:33 rox 阅读(912) | 评论 (1)编辑 收藏
1、同步系统时间(可以用的)
1/usr/sbin/ntpdate time.windows.com
2、查询80端口被哪些程序占用
1netstat -antp|grep 80
3、查看目录下各自磁盘占用空间
1du --max-depth=1 -h /appsvr/xjjhr_tomcat-5.5.20/jobhn2/ROOT
4、tar打包和解压
1tar -cvfz ***.tar /sourcefolder
2tar -xvfz ***.tar -C targetfolder
5、编辑iptables
1vi etc/sysconfig/iptables
6、rpm安装、卸载、列表和查询mysql安装
1rpm -ivh 
2rpm -ev --nodeps
3rpm -ql xxx.rpm
4rpm -qa|grep -i mysql
7、查看redhat版本
1cat /etc/redhat_release
8、查看cpu速度
1cat /proc/cpuinfo
9、删除/data/projects/myproject/目录(及其子目录下)的所有.svn目录
1find /data/projects/myproject/ -name .svn |xargs rm -rf
10、修改网卡IP,并重启
1vi /etc/sysconfig/network-scripts/ifcfg-eth0
2service network restart
11、查看tomcat日志文件的最后200行
1tail -200 /apache_tomcat-5.5.20/logs/catalina.out
12、修改当前默认语言
1export LANG=en_US
2export LC_ALL=en_US
3修改系统的:
4cat ~/.bash_profile
13、安装和卸载U盘
1fdisk -l
2mount /dev/sdc1 /mnt
3umount /mnt
4umount -/mnt (等空闲后卸载)
14、修改系统启动参数
1 vi ~/.bash_profile
2 vi /etc/rc.local
3 vi /etc/profile
4 修改后即时生效
5 . ~/.bash_profile
6 . /etc/rc.local
7 . /etc/profile

15、查看8100端口的访问统计

1 netstat -na |grep 8100 |wc -l
2 netstat -tunlap|grep 80
16、修改系统时间
1 date -s "11/20/2003 12:48:00"
2 date +%Y%m%d%T -s "20081225 10:05:00"

17、查看系统IO瓶颈
1 sudo iotop -Pm / 

posted @ 2008-06-04 11:27 rox 阅读(379) | 评论 (1)编辑 收藏

同事在公司论坛里面发的,其实是我接手的一个项目中存在这个问题。
在使用Hibernate分页器时,习惯使用直接把查询语句、页数、分页大小,传给分页器,这样会默认使用last来获取总记录数,效率非常的低。
解决方法,很简单,就是用SQL来count查询条件获得总记录的Query,再给Hibernate分页器(本身就写好了的)。
这样就必须多写几行代码,就是因为自己懒,觉着效果都一样,就简单的写了。
数据量大了以后,就很明显的速度慢下来了。又全部重头改过,很是郁闷。
转载此文,以示提醒!
即使懒得研究Hibernate底层,也要注意它的效率问题。

 

 

我看到一些资料这样说,oracle的jdbc驱动是不支持服务器端的游标的,当你调用resultSet.last()时,jdbc驱动程序会把整个结果集的数据读到内存,然后在内存中进行结果集的遍历。

如果在做分页的时候,用这样的方式获取结果的总记录数:
  rs.last();
  int rowcount = rs.getRow();
在结果集很大的时候,这个性能是相当低下的,并且会用掉很多的内存。

这个问题是昨天在检查人才网的代码时发现的,随着数据增加,原来被掩盖的问题才开始暴露出来。我们用jprofiler对程序进行剖析的情况也间接的证明了上面的说法:1) 连续几次刷新工作列表后,虚拟机的内存被占满了,运行垃圾回收后内存又被释放出来。2) 从页面请求到完成响应,resultSet.last()方法的调用占去了cpu的绝大部分时间。

因为上面提到的分页方法是一种常用的方法,我建议大家考虑一下自己的代码是否存在这样的问题,这对办公系统的稳定运行可能是很重要的。


参考:
http://www.oracle.com/technology/global/cn/sample_code/tech/java/codesnippet/jdbc/rs/CountResult.html
提到了:
如果 ResultSet 非常大,则 resultset.last() 有可能是非常费时的操作,因为它将使用服务器端的更多资源。因此,除非确实需要可滚动结果集,应避免使用这种方法。

http://forum.springframework.org/showthread.php?t=50044&page=2
提到了:
Anyway, if it's a normal behaviour of the oracle driver to keep data in memory when using SCROLLABLE resultset

http://xiongbo.javaeye.com/blog/38481
对几种游标类型做了介绍,并给出了建议

posted @ 2008-05-28 11:26 rox 阅读(4156) | 评论 (4)编辑 收藏
     摘要: 1、float.js  1    var delta=0.35;  2    var collection;  3    var closeB=false;  4   &n...  阅读全文
posted @ 2008-05-28 11:01 rox 阅读(693) | 评论 (0)编辑 收藏
     摘要: Illegal class inheritance loop. 使用JAXB 2.0以上版本,使用schema文件绑定Java对象,并配置了外部配置文件binding.xjb后,出现这个错误。 现已解决,如下: 1、schema文件po.xsd:  1<?xml version="1.0" encoding="utf-8"?>  2...  阅读全文
posted @ 2008-05-02 16:57 rox 阅读(2572) | 评论 (0)编辑 收藏

这两句SQL区别是有没有括号,但却是一个可以查出来,一个几乎查不出来。
一个简单的问题,居然还犯低级错误,留下来提醒自己。

 

1select uj.* from union_job uj , union_company uc where (uj.name like '%职员%' or uj.info like '%职员%'and uj.company_id=uc.id and uc.area= '广东' order by uj.uptime desc

1select uj.* from union_job uj , union_company uc where uj.name like '%职员%' or uj.info like '%职员%' and uj.company_id=uc.id and uc.area= '广东' order by uj.uptime desc
posted @ 2008-04-23 17:33 rox 阅读(153) | 评论 (0)编辑 收藏

1、修改启动文件:
vi /etc/rc.d/rc.local

2、编辑并追加tomcat的启动:
#!/bin/sh
echo "start tomcat">/var/log/tomcatmessages
rm -rf /appserver/gooweb-tomcat-5.5.20/work/
/appserver/gooweb-tomcat-5.5.20/bin/catalina.sh start

注意:JAVA_HOME等环境变量还不会被加载的,这里是使用setenv.sh来加载的。

3、修改计划任务列表:
crontab -e

4、添加重启任务:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 0 * * 0 reboot

定义为每周0点01分重启系统。

5、重启计划任务的服务:
service crond restart

6、查看日志
tail -100 /var/log/cron


另外要非常注意这里所有修改的文件都一定要 chmod +x
不然要吃大亏。呵呵!

posted @ 2007-12-27 16:42 rox 阅读(1481) | 评论 (3)编辑 收藏
浮动广告代码很多了,不介绍了。
但是对于flash或者下拉框,是容易被遮挡的。

1、flash的解决:
    <!--1.设置FLASH为底层-->
    <div style="z-index:-1">
    <!--2.必须把FLASH设置为透明-->
    <param name="wmode" value="transparent">

2、下拉框的解决:
    因为下拉框的index是最高的,怎么调整都没有用。
    所以,浮动层里面要增加一个iframe,里面再src近来一个新页面,这个页面就是广告页面。
   
 1 <!-- 浮云 -->
 2 <div id="fuyun" style="Z-INDEX: 99999999999; LEFT: 4px; WIDTH: 100px; POSITION: absolute; TOP: 372px; HEIGHT: 100px"> 
 3 <align="center">
 4 <iframe height="80" width="80" frameborder="0" scrolling="no" hspace="0" vspace="0" style="padding:0; margin:0" src="ad_kfc/fy_kfc.html">
 5 </iframe>
 6 </p>
 7 </div>
 8 <script language="JavaScript" src="js/fy.js"></script>
 9 <SCRIPT LANGUAGE="JavaScript">
10 <!--
11     start();
12 //-->
13 </SCRIPT>

其中这个src页面代码如下:
1 <html>
2 <head>
3 <title> fy kfc </title>
4 </head>
5 <body style="padding:0; margin:0">
6 <href="/public/enterprise.do?id=29838" target="_blank"><img src="kfc.gif" width="80" height="80" border=0></a>
7 </body>
8 </html>
9 

还是把浮动窗口的js代码贴上来,原来网上找的代码,参数名字过于简单,怕多个js一起调用时会重名。自己改了一下的

 1 var fuyun = document.getElementById("fuyun");
 2 var fy_xPos = 20;
 3 var fy_yPos = document.body.clientHeight;
 4 var fy_step = 1;
 5 var fy_delay = 30
 6 var fy_height = 0;
 7 var fy_Hoffset = 0;
 8 var fy_Woffset = 0;
 9 var fy_yon = 0;
10 var fy_xon = 0;
11 var fy_pause = true;
12 var interval;
13 fuyun.style.top = fy_yPos;
14 function changePos() {
15 fy_width = document.body.clientWidth;
16 fy_height = document.body.clientHeight;
17 fy_Hoffset = fuyun.offsetHeight;
18 fy_Woffset = fuyun.offsetWidth;
19 fuyun.style.left = fy_xPos + document.body.scrollLeft;
20 fuyun.style.top = fy_yPos + document.body.scrollTop;
21 if (fy_yon) {
22 fy_yPos = fy_yPos + fy_step;
23 }
24 else {
25 fy_yPos = fy_yPos - fy_step;
26 }
27 if (fy_yPos < 0) {
28 fy_yon = 1;
29 fy_yPos = 0;
30 }
31 if (fy_yPos >= (fy_height - fy_Hoffset)) {
32 fy_yon = 0;
33 fy_yPos = (fy_height - fy_Hoffset);
34 }
35 if (fy_xon) {
36 fy_xPos = fy_xPos + fy_step;
37 }
38 else {
39 fy_xPos = fy_xPos - fy_step;
40 }
41 if (fy_xPos < 0) {
42 fy_xon = 1;
43 fy_xPos = 0;
44 }
45 if (fy_xPos >= (fy_width - fy_Woffset)) {
46 fy_xon = 0;
47 fy_xPos = (fy_width - fy_Woffset);
48 }
49 }
50 function start() {
51 fuyun.visibility = "visible";
52 interval = setInterval('changePos()', fy_delay);
53 
54 }
55 function fy_pause_resume() {
56 if(fy_pause) {
57 clearInterval(interval);
58 fy_pause = false;
59 }
60 else {
61 interval = setInterval('changePos()',fy_delay);
62 fy_pause = true;
63 }
64 }


不提倡使用浮动广告,现在多半都是悬浮广告了。只是客户指定要,而且还要不被遮挡,在多人的帮助下,终于解决了这个问题。

大家可以到 http://www.jobhn.cn 网站上看看实际的效果。
posted @ 2007-02-14 09:55 rox 阅读(539) | 评论 (2)编辑 收藏
mysql数据库,库名以目录名存在,表名以文件名(后缀为.frm.MYD.MYI)存在。

如test库下user表,在windows中%mysql_home%\data\test\user.frm,windows文件名大小写不敏感,
无论是 select * from test.user 还是 select * from test.USER,都是没有问题的。

而在linux中/var/lib/mysql/test/user.frm,
如果是 select * from test.user 就必须存在 user.frm
如果是 select * from test.USER 就必须存在 USER.frm
这是两个不同的文件,也是两个不同的表名。
同样库名是以目录存在,也存在区分大小写的问题。

相关的官方文档:

http://dev.mysql.com/doc/refman/5.1/en/identifier-case-sensitivity.html


http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html#name-case-sensitivity
posted @ 2007-01-29 09:40 rox 阅读(1657) | 评论 (2)编辑 收藏

这里可以实现类对象数组。方便自己存储和封装数据用。

 1 function MyClass() {
 2   this.myData = 5
 3   this.myString = "Hello World";
 4 }
 5 
 6 var myClassObj1 = new MyClass();
 7 var myClassObj2 = new MyClass();
 8 myClassObj1.myData = 10;
 9 myClassObj1.myString = "Obj1:  Hello World";
10 myClassObj2.myData = 20;
11 myClassObj2.myString = "Obj2:  Hello World"
12 
13 var array = Array();
14 array[0= myClassObj1;
15 array[1= myClassObj2;
16 
17 for (i = 0; i < array.length; i++) {
18     alert(array[i].myData);
19     alert(array[i].myString);
20 }
posted @ 2006-11-29 11:57 rox 阅读(988) | 评论 (0)编辑 收藏
1 < c:import  url ="/site/All.html"  var ="url"   />
2 < c:if  test ="${ not empty url }" >
3      < x:parse  var ="doc"  xml ="${url}"   />
4      < x:forEach  select ="$doc/sites/site"  var ="s" >
5          < x:if  select ="$s/@id = '0'" >
6              < x:out  select ="$s/@id" />
7          </ x:if >
8      </ x:forEach >
9 </ c:if >

 相同结果代码: 

1<c:import url ="/site/All.html"  var ="url"/> 
2<c:if test ="${ not empty url }">
3    <x:parse var="doc" xml="${url}"/> 
4    <x:forEach select="$doc/sites" var="s">
5        <x:out select="$s/site[@id='0']"/>
6        <x:out select="./site[@id='0']"/>
7    </x:forEach> 
8</c:if > 

 



参考URL:

http://java.sun.com/developer/technicalArticles/javaserverpages/faster/

http://www.mokabyte.it/2002/12/jstl-3.htm

http://www.w3school.com.cn/xpath/

posted @ 2006-11-07 10:27 rox 阅读(681) | 评论 (0)编辑 收藏
MySql只支持Union(并集)集合运算,好像也是4.0以后才有的;
但是对于交集Intersect、差集Except,就没有实现了。
一般的解决方案用in和not in来解决,小量数据还可以,但数据量大了效率就很低了。
其实,可以使用Union来实现另外两种的运算,当然是没有办法的办法。

差集Except:
SELECT ID FROM (
SELECT DISTINCT A.AID AS ID FROM TABLE_A A
UNION ALL
SELECT DISTINCT B.BID AS ID FROM TABLE_B B
)TEMP GROUP BY ID HAVING COUNT(ID) = 1

交集Intersect:
SELECT ID FROM (
SELECT DISTINCT A.AID AS ID FROM TABLE_A A
UNION ALL
SELECT DISTINCT B.BID AS ID FROM TABLE_B B
)TEMP GROUP BY ID HAVING COUNT(ID) = 2

不过,上述方法的功能也有限,
只能用来检查某个id是不是A、B表中都存在,
或者只存在于A、B表其中之一,
并不能对id在某表中多次出现做出检查。
而且,差集是有先后之分,这里没有。

posted @ 2006-09-01 09:29 rox 阅读(2575) | 评论 (0)编辑 收藏
Windows XP SP2 + Oralce 9i

exp++.bat
1 set sid=portal
2 set username=portal
3 set password=portal
4 set connect=%username%/%password%@%sid%
5 set back_path=D:\oracle
6 set date_string=%date:~0,4%_%date:~5,2%_%date:~8,2%
7 set time_string=%time:~0,2%_%time:~3,2%_%time:~6,2%
8 set file_string=%back_path%\portal_%date_string%_%time_string%
9 exp %connect% buffer=20000000 file=%file_string%.dmp log=exp_%file_string%.log owner=portal

imp++.bat
 1 set dmp_source=%1
 2 set sid=his
 3 set username=his_dba
 4 set password=his_dba
 5 set connect=%username%/%password%@%sid%
 6 set back_path=D:\oracle
 7 set date_string=%date:~0,4%_%date:~5,2%_%date:~8,2%
 8 set time_string=%time:~0,2%_%time:~3,2%_%time:~6,2%
 9 set output_string=%back_path%\portal_%date_string%_%time_string%
10 set source_string=%back_path%\%dmp_source%
11 imp %connect% file=imp_%source_string% log=%output_string%.log FROMUSER=portal

Change CHARACTER SET
1 ALTER DATABASE CHARACTER SET UTF8
2 NLS_CHARACTERSET
3 ZHS16CGB231280
4 ZHS16GBK
5 AL32UTF8
6 UTF8


posted @ 2006-08-07 14:10 rox 阅读(1554) | 评论 (3)编辑 收藏
Commons 阅读笔记 之 Logging 篇

Configure commons-logging to use log4j
 1 Environment : Win2000Server,Tomcat-3.3a,AXIS and all the stuff for \
 2 Axis(commons-logging,xerces,log4j, etc.)
 3 
 4 What should I do for enabling output axis activity into log file?
 5 
 6 My log4j.properties file looks like:
 7 
 8 /************************************************************************/
 9 
10 log4j.rootCategory=INFO, LOGFILE
11 log4j.category.org.apache.axis=INFO
12 
13 
14 # LOGFILE is set to be a File appender using a PatternLayout.
15 log4j.appender.LOGFILE=org.apache.log4j.FileAppender
16 log4j.appender.LOGFILE.File=axis.log
17 log4j.appender.LOGFILE.Append=true
18 log4j.appender.LOGFILE.Threshold=INFO
19 log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
20 log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
21 
22 /************************************************************************/
23 
24 I'd created variable 
25 
26 TOMCAT_OPTS=log4j.configuration=file:/D:/jakarta-tomcat-3.3a/webapps/axis/WEB-INF/clas \
27 ses/log4j.properties           /* Here the place for file mentioned above */
28 
29 Then I had simply started from console window:
30 
31 java -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4jFactoryLog
32 
33 org.apache.axis.client.AdminClient list
34 
35 I had seen nothing neither on the console window neither in file axis.log
36 
37 What else should I do with commons-logging or log4j for logging?
38 
39 Any help would be very appreciated.
40 
41 Andrew

posted @ 2006-08-03 11:41 rox 阅读(306) | 评论 (0)编辑 收藏
一个可以快速实现网页内窗口的JS:
http://prototype-window.xilinus.com/

以前引用过,转到这里来,
很牛的网页效果,非常接近Windows视觉:
http://www.activewidgets.com/

一个国内牛人的系列产品:
http://www.linb.net/linb/index.html
posted @ 2006-07-11 09:29 rox 阅读(340) | 评论 (1)编辑 收藏
1、首先制作一个批处理,对集群IP进行DNS设置:
 1 @echo off 
 2 if not exist hosts goto WNT 
 3 echo 192.168.2.5 HIS_S0 >>C:\windows\hosts 
 4 echo 192.168.2.6 HIS_S1 >>C:\windows\hosts 
 5 goto END 
 6 :WNT 
 7 echo 192.168.2.5 HIS_S0 >>%systemroot%\system32\drivers\etc\hosts 
 8 echo 192.168.2.6 HIS_S1 >>%systemroot%\system32\drivers\etc\hosts 
 9 :END 
10 echo Finished!
11 pause > nul
12 cls

2、配置一个URL来连接这个集群,集群的服务名为HIS:
1 jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=HIS_S0)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=HIS_S1)(PORT=1521))(LOAD_BALANCE=yes))(CONNECT_DATA=(SERVICE_NAME=HIS)))

posted @ 2006-06-07 09:04 rox 阅读(498) | 评论 (1)编辑 收藏
Searching "iframe height 100" in 谷歌!
1、
<iframe height="100%"> 
no work

2、
<iframe stlye="height: 100%;"> 
no work

3、CSS
1 /*** html file ***/
2 
3 <class="forum2">
4  <iframe src="http://mydomain.com/phpbb" title="Forum" scrolling="auto">
5  </iframe>
6 </p>

 1 /*** css file ***/
 2 
 3 ..forum2 {
 4     height: 900px;
 5     width: 100%;
 6 }
 7 
 8 IFRAME {
 9     min-height: 900px;
10     height: 100%;
11     width: 100%;
12 }


4、JavaScript
 1 <script language="JavaScript">
 2 <!--
 3 function resize_iframe()
 4 {
 5   //resize the iframe according to the size of the
 6 
 7   //window (all these should be on the same line)
 8 
 9   document.getElementById("glu").height=
10     document.body.offsetHeight-
11     document.getElementById("glu").offsetTop-26;
12 }
13 
14 // this will resize the iframe every
15 // time you change the size of the window.
16 window.onresize=resize_iframe; 
17 
18 //Instead of using this you can use: 
19 //    <BODY onresize="resize_iframe()">
20 
21 
22 //-->
23 </script>

1 <iframe id='glu' width=100% onload='resize_iframe()'>
2 </iframe>


5、用CSS构建iframe效果的四种方法

6、W3C关于iframe的描述
posted @ 2006-04-18 19:28 rox 阅读(4913) | 评论 (5)编辑 收藏
desired在digg里写道,这里是一篇有趣的文章, 详细的讨论了为什么Ruby on Rails有那么多的优点却始终难以战胜Java或者ASP.net成为网络应用程序设计的主流语言。不过作者自己本身很喜欢Ruby on Rails,所以他虽然写了这篇文章,却丝毫不影响他对于Ruby on Rails最后定能成功地信心。
posted @ 2006-04-10 10:48 rox 阅读(322) | 评论 (0)编辑 收藏
转载


当然是Ruby相关的。
比如我常去:
http://groups.google.com/group/comp.lang.ruby?hl=zh-CN&lr=&newwindow=1
http://eigenclass.org/hiki.rb?WEBlog%3A%3ARuby
http://redhanded.hobix.com/
http://jimweirich.umlcoop.net/index.cgi

http://wiki.rubyonrails.org

http://www.railscn.com

http://chinaonrails.com/frontpage

http://ror.uuclubs.com

http://www.ruby-forum.com/


posted @ 2006-03-31 20:36 rox 阅读(331) | 评论 (0)编辑 收藏
http://www.ruby-lang.org/

这里有第一版的部分中文翻译
下载最新版本的Ruby,安装之后就有一个快捷指向ProgrammingRuby.chm,
很不错的书,已经有了2005年的2nd版本,可以到这里下载。(顺便做个广告
按照上面的例子,建立两个文件,

test.rb
 1 class Song
 2   def initialize(name, artist, duration)
 3     @name     = name
 4     @artist   = artist
 5     @duration = duration
 6   end
 7   def to_s  
 8     "Song: #{@name}--#{@artist} (#{@duration})"  
 9   end  
10 end
11 
12 class Song
13   attr_reader :name, :artist, :duration 
14 end
15 
16 class KaraokeSong < Song
17   attr_reader :lyrics
18   def initialize(name, artist, duration, lyrics)
19     super(name, artist, duration)
20     @lyrics = lyrics
21   end
22   def to_s  
23     "Karaoke" + super + "\nlyrics: #{@lyrics}"  
24   end
25 end

test2.rb
1 class Song
2   attr_writer :name, :artist, :duration 
3 end

然后在控制台下输入:
 1 C:\>ruby
 2 load "d:/ruby/mycode/test.rb"
 3 load "d:/ruby/mycode/test2.rb"
 4 song = Song.new("Bicylops", "Fleck", 260)
 5 puts song.inspect
 6 puts song.to_s
 7 song.name="Groovy"
 8 song.artist="Java"
 9 song.duration=15
10 puts song.inspect
11 puts song.to_s
12 ^D
13 #<Song:0x28366e0 @name="Bicylops", @duration=260, @artist="Fleck">
14 Song: Bicylops--Fleck (260)
15 #<Song:0x28366e0 @name="Groovy", @duration=15, @artist="Java">
16 Song: Groovy--Java (15)
注:这里的^D是Ctrl+D

这段代码,给我们什么启发呢?
posted @ 2006-03-25 23:51 rox 阅读(231) | 评论 (0)编辑 收藏
好像IE下可以,Firefox不行。
<input type="text" name="test" onclick="test.innerText='hello'">

posted @ 2006-02-17 17:39 rox 阅读(405) | 评论 (0)编辑 收藏
最近用 Hibernate 3 连接 Mysql 4 数据库。
调试时都还好,真正发布的时候毛病来了。
每天早晨都要都会报错,不能正常操作数据库。
Mysql 重启,无效,Tomcat 重启,有效。

Mysql(MySQL 4.1) 文档 7.5.2 节
Tuning Server Parameters 里面
在 Mysql控制台下输入 SHOW VARIABLES;
最后一个参数
wait_timeout    28800
如果单位是秒,也就是 8 个小时。
程序最后一次建立连接完毕之后 8 个小时,
Mysql 单方面关闭了这个连接。
但 Hibernate 还在记忆着这个连接基本信息。
程序再次连接的时候,已经不存在了。

不过,Hibernate 可以设置它自己的 timeout 。
到了 Hibernate 3 默认第三方的连接池管理,
由 Apache 的 DBCP 项目更换成了 c3p0 项目
它的属性在 Hibernate 配置属性有对应的写法,如:
c3p0.maxIdleTime = hibernate.c3p0.timeout
c3p0.maxPoolSize = hibernate.c3p0.max_size
所以,要修改一下 hibernate.cfg.xml 文档
将 Hibernate 默认连接池参数
<property name="connection.pool_size">5</property>
删除或注释掉,Hibernate 默认连接池比较初级。
然后,加入以下属性
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_size">5</property>
就可以使用 c3p0 来管理连接池了。
其实这些属性的参数名都可以在 Hibernate 文档 3.3 节
JDBC connections 里面找到。
按照相应的格式更改名字和值就可以了。

posted @ 2006-02-14 19:43 rox 阅读(12484) | 评论 (5)编辑 收藏
桌面操作系统还是网络操作系统,桌面办公还是网络办公?
希望微软的Vista、Office 2007和Live能够给我们带来答案。

Vista那花哨的界面并不能打动我,那只是一种资源的严重浪费。
至今都不曾给自己装XP,直接由2000跳到了2003(精简版)。
对XP里面,第一次使用Messenger时繁琐的设置过程感到厌恶。

但某些看法在最近改变了。注册了Live Mail和Live Messenger,
并看到Live其他的子项目,再对比最近对于Vista和Office的相关报道。
感觉微软太疯狂了。
当国内外Linux厂商在把Linux做的更微软,
办公软件厂商更进一步提高自己对微软的兼容性时。
微软却打算把我们引入网络操作时代。
这两天在使用Live Messenger时,不得已像XP那样先导一边微软的Passport。
有一个选项大意Passport信息是否与当前Windows用户绑定。

可以想象一下Vista用户信息与Passport信息,登陆Vista,
也就同时在后台登陆相关联的Passport,进入系统之后
OutLook 2007已经把Live Mail的信件连同RSS订阅的新信息收下来,
Live Messenger已经登陆,可能正在逐个显示好友给你发送的离线消息。
Live Favorites已经将自己在上班时收藏的某个网站,放在了当前用户的收藏夹中。
Live Office会打开下班前正在编辑的那篇文档,光标就停在你最后关闭它的位置。
其他的文档,都放在你的网络办公文件夹里面,不妨叫它Live Documents。
还会有什么,这些都会实现么?我不知道!

Hotmail、Messenger未来将叫做Live Mail和Live Messenger,更彻底的统一到一起。
Office 2003本来就有一个网页版本的计划,后来停下来了。
不知道是技术上不足,还是微软刻意要留到Office 2007里面。
Office 2007将会推出一种新的文件格式,基于XML的,标准将完全公开。
理论上可以不用做任何内容修改,增加一个样式文件,就可以放在网页上浏览。
或许我们将来不再使用IE浏览,而是Smart Client或者别的什么。

未来的操作系统是什么样的?很难说清楚。
更期待Apple和Google的加入。
或许将来我们会有多个操作系统,来自同一家公司。
专门娱乐的,专门商务办公的和专门学习开发的。
尽管现在一个非常大的操作系统,这些几乎都能够做到。
但,如果各自够小又够快,或许也是一种思路。

posted @ 2006-02-13 23:00 rox 阅读(390) | 评论 (1)编辑 收藏
最近别人要我给他的网站加一个RSS,用过但没有做过,看了以后,有点感慨。
太多的技术被基于新的平台重新构建了。

新闻组,一种非常“古老”的技术,以至于古老到中国互联网还没有来得及普及的时候,
论坛,一种基于动态网页技术下产生的新事物就将它取代了。
新闻组,一种基于NNTP协议的信息共享方式,这样解释不直接。
浏览它需要客户端,最常见的就是outlook。
对,信息是基于邮件格式的,但首先下载的是基本信息。
如标题、大小、日期、发布者等,当用户选择某个主题时,
客户端,才去下载这个主题的真正实体——一封电子邮件。
是不是感觉有点和RSS类似。

新闻组是分很多讨论组的,有点类似分论坛。
只有订阅后才能够浏览,一般是不需要注册就可以
在讨论组里面浏览、发表新讨论和回复讨论了。
但也可以由管理员设置访问权限。
这样的感觉又有点类似论坛了。

再对比一下近年比较火的博客,它有点感觉像为每个人
建立一个单独的分论坛,管理员是自己。可以自己写日记,
也可以写东西别人看,别人也可以发表意见。
再看看新闻组,一个具有安全特性的讨论组,自己是管理员,
已经很接近了。

另外一些新闻组的特点,也就是作为邮件方式,
本身是可以支持富文本和附件,支持的大小,
根据服务支持而定了。另外,由于是邮件方式,
新闻组,是可以脱机浏览的。这个功能在现在,
网络极度发达的条件下,似乎已经不那么重要了。

不过,无论新闻组有何种的优势,以及对其他技术形式的兼容。
它毕竟已经是一个很老的技术了,而且在国内几乎没有服务商支持。
就如同IRC在国内也不流行一样。
posted @ 2006-02-06 20:11 rox 阅读(366) | 评论 (0)编辑 收藏
作为一个曾经的Java程序员,已经很多年都没有编码,但从没有放弃过对Java和开源的关心。
最近又有机会开始写点东西,感觉自己已经很迟钝了,很难有耐心动手写代码了。
但是为了尽量缩短自己与现在技术水平的差距也开始学点“新”东西,比如Struts、Hibernate和Spring。
大多都是停留在摸摸的水平,离实际开发还有很大的距离。
可能是人老了,变懒了。
一直都在寻找着,更能够精简代码的产品,尤其是使用Hibernate配置了繁琐OR影射后,
完成一个简单数据库操作后,真不知道是用它好还是不用它好。
相比之下,一个同事,只在大学上过公共课程C语言程序设计,用不到一周的时间上手Delphi,
并且在不到一个月时间里(中间还因为其他工作出差,中断过),相对轻松的开发了一套的程序。
同时对比正在激烈讨论的Ruby,微软的.net都看到了很多Java里面没有的东西。
原来编程可以这么简单,也应该这么简单。
Java有没有更简单的方式来保存数据,更确切的说是保存对象,DB4O无疑就是这其中的一种。

基于它现在的技术,有几个想法
1、数据型对象的共享技术,更多的应该是跨语言的实现,毕竟现在大多数语言都是面向对象的。
数据库和XML文件在很多时候,在这些不同语言之间充当了一个数据传递者的角色。
一般数据又都是封装在某个对象里面,与数据库之间OR影射。微软的SOAP和CLI似乎都是向这个主旨努力。
2、EJB太复杂,虽然买了很多书,但都从来没有耐性做个测试的样例。远程访问一个对象,必须继承特定类,
要基于某个协议,还要配置容器,太困难了。DB4O似乎又提供了另一种思考方式。
3、Session大家用的应该很多,使用的不当对服务器是一种非常大的负担。还想不到如何减轻服务器的负担,
但至少可以尝试使用DB4O来减轻Session也就是容器的负担。
4、对于3中Session,困难的就是对众多的临时数据,管理起来太复杂。用过之后就不再使用。
容器自己可以管理Session,清理DB4O中的垃圾数据最简单的方式,就是为DB4O添加一种内存数据库模式。
也就是数据都放在内存里面,管理程序可以清理垃圾数据,一次重启、断电、系统崩溃,
都可以把这些垃圾数据清理掉。
可能还有更多的一些可能,谁又能知道,现在的技术发展太快了!
posted @ 2006-01-13 22:28 rox 阅读(667) | 评论 (1)编辑 收藏
从尚兴林的blog“struts 中文问题解决方案”中发现的本地化方法。
http://blogger.org.cn/blog/more.asp?name=dashee&id=7228

    public static String toNative(String s) {
        int j = 0;
        if (s == null || s.length() == 0)
            return null;
        byte buffer[] = new byte[s.length() * 2];
        for (int i = 0; i < s.length(); i++)
            if (s.charAt(i) >= '\u0100') {
                char c = s.charAt(i);
                byte buf[] = ("" + c).getBytes();
                buffer[j++] = buf[0];
                buffer[j++] = buf[1];
            } else {
                buffer[j++] = (byte) s.charAt(i);
            }
        return new String(buffer, 0, j);
    }

posted @ 2005-10-12 16:14 rox 阅读(805) | 评论 (0)编辑 收藏