2009年12月11日星期五

java.lang.InstantiationException

java.lang.InstantiationException

在Struts creating form bean的时候遇到这个异常

在form bean 中加一个无参的构造函数就Ok了

2009年12月1日星期二

出租西三旗桥东南角常秀家园南北通透三居住房

房屋信息:出租西三旗桥东南角常秀家园南北通透三居住房一套,面积80平米,6层的6层。三室为正规三室无隔断,主卧朝阳20平左右,有阳台,2次卧朝北面积10平左右。
房屋装修为中装,新刷白墙,房间整洁干净,设施齐全。天然气入户,电热水器,上网方便。
房屋周边信息:小区周边交通设施方便,有二十几趟公交车,下楼小区门口就有运通103、运通109、运通118三趟公交始发。
离小区步行5分钟的公交站有919、307、315、345、379、393、398、407、618、625、670、629、753、810、819、运通117等N趟四通八达
的公交车,其中的919大站快车,919区间等八达岭高速的直达车,在上班高峰时间直达三环马甸只需不到半小时时间。919大站
快车一站直达起家豁子(换乘10号线地铁)3站德胜门站(换乘地铁2号线)。小区离13号线城铁龙泽站仅2站地公交。周边商业圈发达并正在迅速崛起中,购物及吃饭都很方便
,京客隆、超市发、肯德基、烤鸭店、老家肉饼、苏宁电器、购物中心、24小时药店……环绕周边应有尽有。
出租条件:房屋觅有正当职业,无不良嗜好的有为青年出租,希望生活习惯良好,收入稳定,长期出租,可整租也可单租,全天看房。中介勿扰,谢谢~
联系方式:13810428318 QQ 122088025

做编程的劳苦兄弟优惠

2009年11月18日星期三

Oracle 分组 取第一条记录

id        apply_id
1         1
2         1
3         1
4         2
5         2
6         3
7         3
8         3

取出
id        apply_id
3         1
5         2
8         3

select alx_a.id
from
(select id,apply_id,rownum rid from 表) alx_a,
(select id,apply_id,rownum rid from 表) alx_b
where alx_a.apply_id = alx_b.apply_id and alx_a.id <= alx_b.id
group by alx_a.id,alx_a.apply_id
having count(*) = 1

2009年11月16日星期一

生育一孩申请书

生育一孩申请书

       我(男、女)系                    单位(存档单位)、村(居)委会人员,生于           日,于        月    日与        同志(男、女)结婚,我属(       )1初婚,未生育和收(抱)养子女;2再婚(离婚次数        次),无子女,符合 《北京市人口与计划生育条例》  生育一孩的相关规定,特提出申请,请予批准。

 

                                    申请人:

                                    年     月     日

                                                                                                                 

                                                       

所在单位意见:

 

计生专干和负责人(签字)

 

单位(存档单位)、村(居)委会(公章)

 

联系电话                             年     月    日

 

 

注:由单位或存档单位盖人事或计生章

 

2009年11月9日星期一

Intellij IDEA 搜索框显示乱码

弄了个windows7 英文包装上,结果发现Intellij IDEA 的搜索框中文乱码了,Ctrl+ F那个,Ctrl+ Shift+F还不是乱码好好的,在网上一搜,试了试这个,嗯,靠谱。

进入IDE Settings 里的 Appearance项,选中Override default fonts by ,把 Name 设置为 SimSun,Size 根据自己喜好设置(我一般设为 14)。确定

参考:http://gx80.javaeye.com/blog/124662

哦对了,win7还是不错的,

2009年11月5日星期四

J2EE For Weblogic开发中Weblogic.xml文件的配置 (转)

http://www.blogjava.net/zhhp1314520/articles/Weblogic_deploy.html

weblogic Server允许通过设置weblogic应用程序扩展描述符(weblogic.xml)配置jsp容器,
该文件通常位于web应用程序的web-inf目录下。一般不通过修改weblogic文件直接配置,
而是通过控制台配置该文件,在Deploments-->web Application-->defaultWebApp中配置。
可在开发和生产环境中配置不同的信息。
主要配置信息:
compilerSupportsEncoding //true--支持使用字符集
encoding //指定jsp文件的默认字符集,如gb2312;
vervose //是否将调试信息输出到浏览器和日志;
keepgenerated //是否让编译jsp文件产生的.java文件持续存在;
Page Check Seconds //正数--在以秒为单位的时间间隔检查jsp文件是否发生了修改,如果是则重新编译;
           0--在每一个请求检查jsp;
           -1--不对jsp文件进行检查。
Precompile //true--在weblogic服务器启动时自动编译所有的jsp。
Debug Enable //true--是否允许调试。

Weblogic .xml

<? xml version="1.0" encoding="GB2312" ?>
<! DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd" >
< weblogic-web-app >
     <!--
         为web.xml所定义角色赋值
         如果是Weblogic 8.1 SP2 或者之前的版本,可以不定义security-role-assignment
         如果是SP3,必须手工添加所有principal(角色或角色组);
         详细介绍请参考 PAFA3开发设计指南 文档 。
      -->
     < security-role-assignment >
         <!-- role-name 必须跟web.xml中security-role标记下的role-name取值相同 -->
         < role-name > pafaDemoUser </ role-name >
         <!-- principal-name 必须是UM中定义的角色或者角色组,不能是用户 -->
         < principal-name > r_usermanager_rm_user </ principal-name >
         < principal-name > p_g_rmtest03_myopr </ principal-name >     
         < principal-name > Administrators </ principal-name >     
     </ security-role-assignment >

     < jsp-descriptor >
         < jsp-param >
             < param-name > pageCheckSeconds </ param-name >
             < param-value > 1 </ param-value >
         </ jsp-param >
         < jsp-param >
             < param-name > compilerSupportsEncoding </ param-name >
             < param-value > true </ param-value >
         </ jsp-param >
         < jsp-param >
             < param-name > encoding </ param-name >
             < param-value > GB2312 </ param-value >
         </ jsp-param >
         < jsp-param >
             < param-name > verbose </ param-name >
             < param-value > true </ param-value >
         </ jsp-param >
         < jsp-param >
             < param-name > printNulls </ param-name >
             < param-value > false </ param-value >
         </ jsp-param >
         < jsp-param >
             < param-name > keepgenerated </ param-name >
             < param-value > true </ param-value >
         </ jsp-param >
     </ jsp-descriptor >
</ weblogic-web-app >

2009年10月24日星期六

在VMware6.5安装Ubuntu9.04 vmware-tools

VMware6.5自带的vmware-tools不好使
需要VMwareTools-7.9.6-173382.tar.gz
http://forum.ubuntu.org.cn/viewtopic.php?f=65&t=197597

2009年10月23日星期五

String split方法

       

String split方法 当在末尾含有空字符时尤其应注意

        String a = ",,";
        System.out.println(a.split(",").length);//0
        System.out.println(a.split(",",-1).length);//3
        a = ",,1";
        System.out.println(a.split(",").length);//3
        System.out.println(a.split(",",-1).length);//3
        a = "1,,";
        System.out.println(a.split(",").length);//1
        System.out.println(a.split(",",-1).length);//3

2009年10月19日星期一

jstl 循环 break 变通方式

如果直接使用<c:forEach> 直接在中间的代码中 插入break , 并不能退出循环。可以采用以下策略进行代换:
1. 用 <c:set var="collections" value="${forEach中的items}"/>
2. 用 jspContext.getAttribute("collections"); 获得对应的集合
3.最后就用最原始的for()。

但还是觉得不爽

2009年10月18日星期日

修改JetBrains idea缓存目录

修改idea.properties

将${user.home}换成自己想到的目录

# path to IDEA config folder. Make sure you're using forward slashes
idea.config.path=E:/Program Files/JetBrains/IdeaConfig/.IntelliJIdea90/config

# path to IDEA system folder. Make sure you're using forward slashes
idea.system.path=E:/Program Files/JetBrains/IdeaConfig/.IntelliJIdea90/system

# path to user installed plugins folder. Make sure you're using forward slashes
idea.plugins.path=E:/Program Files/JetBrains/IdeaConfig/.IntelliJIdea90/config/plugins

2009年10月14日星期三

java随机产生网页颜色

int randomNumber(){   
return (int)Math.floor(Math.random()*256);   
}
String decToHex(int dec)   
{   
String hexStr = "0123456789ABCDEF";   
int low = Math.abs(dec % 16);   
int high = Math.abs((dec - low)/16);   
String hex = "" + (hexStr.length()>high?hexStr.charAt(high):hexStr.charAt(0)) + (hexStr.length()>low?hexStr.charAt(low):hexStr.charAt(10));   
return hex;   
}
String randomBgColor()   
{   
String r,g,b;   
r = decToHex(randomNumber()-1);   
g = decToHex(randomNumber()-1);   
b = decToHex(randomNumber()-1);   
return "#" + r + g + b;   
}

2009年9月22日星期二

用python开发站点

用python开发站点

1. 安装Django,下载 tar 安装包,http://www.djangoproject.com/download/
其文件名可能会是 Django-xx.tar.gz 。

2. tar xzvf Django-*.tar.gz 。

3. cd Django-* 。

4. sudo python setup.py install ,如果不是root需要su命令切换到root

5. python
>>>import django
>>>django.VERSION
出现版本信息 安装OK

6. 将django-admin.py加入path路径
sudo ln -s /path/to/django/bin/django-admin.py /usr/local/bin/django-admin.py

7. 在当前目录建立一个站点
django-admin.py startproject mysite

8. 在mysite目录下发现
__init__.py
manage.py
settings.py
urls.py

9. 启动
python manage.py runserver

http://python.ubuntu.org.cn/viewtopic.php?f=186&t=180327

2009年9月16日星期三

php增删改查

http://blog.csdn.net/newhappy2008/archive/2006/12/06/1432654.aspx

简单看了一下php 中文手册,就像javascript,只是变量名不用var,但必须以$开头,满眼的美元,有点花

晕死,php5.2中的文件 和 5.3的文件不一样,5.3中没有php_mssql.dll,也没有php.ini-dist
想链接SqlServer,Google出方法,竟然找不到php_mssql.dll,只好试着下来个5.2,5.2中有
不知道为什么
   打开php.in将extension=php_mssql.dll的注释符号去掉。
   打开php.in将mssql.secure_connection = Off改为on。
   extension_dir = "E:\php\ext"
   doc_root =E:\Apache2.2\htdocs
还是不行.......郁闷

安装PHP Apache

这周有两人问我会不会PHP,受刺激了,开始Google PHP
搜索 PHP 获得大约 6,910,000,000 条查询结果
搜索 ASP 获得大约 1,730,000,000
搜索 JSP 获得大约 645,000,000 条查询结果
看来我OUt了
1、下载PHP包 http://windows.php.net/download/
   要想下面与Apache整合 必须下载ts版本,也就是Thread Safe
   据咨询高手 zip和installer 没啥区别 ,只是如果用IIS最好用installer
2、接着下载Apache,安装时最好选择for All Users, on Port 80, as a Service -- Recommended。
   我第一次选择了only for the Current User,on Port 8080,whern started Manually,结果不知道怎么运行呵呵。
   修改 Apache HTTP Server 配置文件
\Apache2.2\conf\httpd.conf
   避免冲突将 Listen 80 改成 别的 该改成了 Listen 8082
   将 ServerName 127.0.0.1:80 改成 ServerName 127.0.0.1:8082。
  
   在最后加入 (我把php解压到E:/php下了)
   LoadModule php5_module "E:/php/php5apache2_2.dll"
AddType application/x-httpd-php .php

保存文件。

3、在\Apache2.2\htdocs下新建test.php,输入
<?php
phpinfo();
?>

4、启动Apache,测试http://localhost:8082/test.php
很惊奇,奶奶的出来这么多信息

2009年9月14日星期一

捣鼓Oracle

--创建数据库,貌似创建数据库的sql较复杂,
创建数据库的脚本:
-----------------------------------------------------------
CREATE DATABASE dbtest
LOGFILE
GROUP 1 ('/opt/oracle/oradata/dbtest/redo01.log','/opt/oracle/oradata/dbtest/redo01_1.log') size 100m reuse,
GROUP 2 ('/opt/oracle/oradata/dbtest/redo02.log','/opt/oracle/oradata/dbtest/redo02_1.log') size 100m reuse,
GROUP 3 ('/opt/oracle/oradata/dbtest/redo03.log','/opt/oracle/oradata/dbtest/redo03_1.log') size 100m reuse
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXLOGHISTORY 200
MAXDATAFILES 500
MAXINSTANCES 5
ARCHIVELOG
CHARACTER SET UTF8
NATIONAL CHARACTER SET UTF8
DATAFILE '/opt/oracle/oradata/dbtest/system01.dbf' SIZE 1000M EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE '/opt/oracle/oradata/dbtest/sysaux01.dbf' SIZE 1000M
UNDO TABLESPACE UNDOTS DATAFILE '/opt/oracle/oradata/dbtest/undo.dbf' SIZE 500M
DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/opt/oracle/oradata/dbtest/temp.dbf' SIZE 500M
;

--还是用Database Configuration Assistant 来创建和配置数据库。
--创建表空间
create tablespace official_tablespace
datafile 'E:\oracle\product\10.2.0\oradata\spring\official_data.dbf'
size 5M
autoextend on;--自动增长


--建完表空间 建用户
create user official3 identified by offi1234 default tablespace official_tablespace;

--接着授权给新建的用户

grant connect,resource to official3; --表示把 connect,resource权限授予news用户
grant dba to official3; --表示把 dba权限授予给news用户

--表的数据备份:PL/SQL----->TOOLS--------->Export Tables
------------------------------------------------
删除表空间
DROP TABLESPACE TableSpaceName INCLUDING CONTENTS AND DATAFILES;
删除用户
DROP USER official CASCADE
删除表的注意事项
在删除一个表中的全部数据时,须使用
TRUNCATE TABLE 表名
因为用DROP TABLE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,
反复几次DROP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了。

参考:http://www.cnblogs.com/smartvessel/archive/2009/07/06/1517690.html
http://ilinux.javaeye.com/blog/178306

试一下用手机发博客

这输入框也太小了点

2009年9月11日星期五

java.lang.IllegalStateException STREAMED

request.getInputStream() 和 request.getReader()不能同时调用,否则会引发java.lang.IllegalStateException异常。

API中有写:

getInputStreampublic getInputStream() throws java.io.IOException
Retrieves the body of the request as binary data using a . Either this method or may be called to read the body, not both.
Returns:
a object containing the body of the request
Throws:
java.lang.IllegalStateException - if the method has already been called for this request
java.io.IOException - if an input or output exception occurred

早该总结总结了

突然觉得Google app engine 没什么好玩的了,我说的是技术上

前几天迅速的将我那个blog用spring MVC改写了,之前对spring MVC只是停留在知道有这么个东西,结果感觉还不错,貌似比struts强大写,但是还是没有脱离与框架的解耦,Action中还是要实现/继承Spring的Controller,类似于Struts的ActionForm的类倒是一个pojo

Spring建议将jsp不想被客户直接访问到的文件放入WEB-INFO下

简单学习了jstl的c,fmt,还挺好用 突然感觉以前直往上塞java代码的方式太土了

参考roller里面的MetaWeblogAPI实现,实现了自己的MetaWeblogAPI,用WindowsLiveWriter发布成功

考虑实现上传图片,受困于Google app engine只有500M(免费的),想把图片放在外面,这也是实现MetaWeblogAPI的动力,后来又想到通过Webservices将图片保存到微软的云中http://lnai.cloudapp.net/,实现了才发现Google app engine 不支持WebServices,执着的我实现了在还是在Google app engine中保存图片

同事们都在忙着弄SAP PI 普元EOS...

只有我在这捣鼓有点疯狂老套的代码,接下来研究什么呢

2009年9月9日星期三

在eclipse中 高亮显示相同的变量

eclipse中如果选中一个变量,则在本源文件中高亮显示相同的变量

Window->Preferences,在type filter text 中输入Mark Occurrences

在Java-Editor-Mark Occurrences中将Mark occurrences of the selected element in the current file.选中OK即可

2009年9月8日星期二

转载:如何将 IntelliJ 的配置改到其他分区


转自:http://blog.csdn.net/yidinghe/archive/2009/04/10/4061251.aspx

不管你将 IntelliJ 装在什么地方,它都会在 C 盘的用户目录下创建 .IntelliJIdeaXX 目录,而且这个目录会随着时间增长到几个 G 那么大。这对于 C 盘小得可怜的人来说确实是个问题。不用怕,这里介绍一个将 .IntelliJIdeaXX 目录移到其他分区的办法。

我的 IntelliJ 装在 D:\Program Files\JetBrains\IntelliJ IDEA 8.1 目录下。我是这么做的:

1、首先在 D:\Program Files\JetBrains\ 下创建一个文件夹:IdeaConfig,用来存放所有的 IntelliJ 配置。

2、然后打开 D:\Program Files\JetBrains\IntelliJ IDEA 8.1\bin\idea.properties。

3、将所有的 ${user.home} 替换为 D:/Program Files/JetBrains/IdeaConfig (注意斜杠的方向)

4、保存 idea.properties

5、打开 C:\Documents and Settings\XXX 目录,把 .IntelliJIdea8x 和 .IntelliJIdea80 两个目录移动到 IdeaConfig 目录下。

这样你就可以启动 IntelliJ,而且以后也不会再占用 C 盘空间了。

2009年8月28日星期五

今儿下午貌似没啥事

下午头儿出去了,这周一口气粘帖复制了14个Action20个jsp,没什么技术含量,完全是粘帖复制,我在等待什么?

昨天试着弄了个SSH的demo

工作快三年了,一直没有用到spring,做的几个项目全部基于struts+hibernate,昨天忙完手头的活儿,自己建了个struts+spring+hibernate的demo,能用MyEclipse自动生成的全部自动生成,表映射、pojo、SessionFactory、applicationContext.xml、struts-config.xml都自动生成了,弄了两个jsp,一个add,一个view

运行发现,spring未被加载,原因找来找去找不到,最后还是看了以前写的一篇blog,可能存在重复jar包,有冲突,确实发现Myeclipse自动键入的jar包好多好多,而且有的有重复,捣鼓出以前做的例子,复制lib里面的jar包,果然OK了,实现了增查。

spring确实是个好东西,强大、强大。

Google SSH整合的例子,发现都是Struts2SpringHibernate了,俺还struts1呢,out了

2009年8月8日星期六

瑞星杀毒软件在Google软件精选中没有了

在Google软件精选中找不到瑞星杀毒软件了,今天刚发现,Google了一下 好像从6月份就没有了,今天还原ghost的系统,在线更新瑞星杀毒软件Google专版,升级完发现让我激活,晕死

2009年7月30日星期四

转:Fedora 10 的自动执行脚本

转自:http://pengjiayou.com/blog/fedora-10-auto-install-scripts
easyLife 是另一款和 autoten 类似的软件,是刚刚才发现的,不过其官方网站打不开,需翻墙解决,我找到了它的下载页面,在 sf.net 上,请直接点击这里下载最新的 easylife-1.1-1.fc10.noarch.rpm

easyLife 允许你配置 Fedora 10 的各软件,只需用鼠标点击就搞定了!它的主要特性如下:

  • 为你系统中的常规用户添加 sudo 命令
  • 自动安装 Flash Player 插件
  • 安装各种 Codecs (视频、音频解码库等)
  • 安装额外字体
  • 安装 Livna 软件仓库以安装其它额外及非免费软件
  • 安装 Skype
  • 为 Firefox 安装 Sun Java 和 Sun Java Plugin 插件
  • 用 system-switch-java 整合 Sun Java
  • 安装 Adobe Raeder
  • 安装其他软件等
用esayLife安装来Flash Player 挺好用,真的是省了很多事,可能对我这个Linux初学者不是啥好事

又在感慨自己没有进步

中午陪同事去银行,路上聊起以后的发展,等35岁后还在做程序员coding?呵呵其实也未尝不可,只是可能说起来缺点颜面,可能在中国这种重应用轻研发的大环境下是这样的

那接下来如何改变呢?自叹离一个项目经理需要掌握的全面知识还有许多许多不会的啊,其实我还是蛮喜欢写code的呵呵,bug安静。昨儿捣鼓了一天Google app engine,今天捣鼓了一天Windows Azure Platform,整了个Hello Cloud: http://lnai.cloudapp.net/ ,恼火是Sql Azure好像还没开放使用,明儿参考http://www.cnblogs.com/azure/archive/2009/03/16/1413728.html整个聊天室学习学习参考资料:http://azure.cnblogs.com/

2009年7月29日星期三

又是一个周一

又是一个周一过去了,没什么公事,自己捣鼓app engine,想接下来增加一些功能,比如支持图片显示,支持客户端、Email写blog,支持手机访问,添加地图应用,支持rss,支持更换模板...呵呵,随便想想就这么多今天捣鼓了一天fedora10,希望能解决fedora9中Eclipse输入的问题,安装VMware-tools,折腾了一天到现在貌似还不怎么好使,下了个eclipse,正版他app engine Eclipse插件还不支持Eclipse3.5呜呜 郁闷死

2009年7月20日星期一

com.google.appengine.api.datastore.Text 不能保存

google app engine对String长度有限制,里面中有个com.google.appengine.api.datastore.Text类型以替换长String,但是换了com.google.appengine.api.datastore.Text后不能向数据库保存了,就单单这个字段不能保存,看数据库列中就没有这个字段,google中找到 说要在字段前加@Enumerated,但是在我这也不好使,后来又找到要加
@Persistent(serialized="true", defaultFetchGroup="true")
    private Text text;
//    private String text;
恩,这下好使了

google app engine for java:org.datanucleus.exceptions.NucleusUserException:

开发中遇到这个异常:
NestedThrowablesStackTrace:
Attempt was made to manually set the id component of a Key primary key. If you want to control the value of the primary key, set the name component instead.
org.datanucleus.exceptions.NucleusUserException: Attempt was made to manually set the id component of a Key primary key. If you want to control the value of the primary key, set the name component instead.

原来的修改代码是这样些的:
public void attachDirty(UrlTarget instance) {
        PersistenceManager pm = null;
        try {
           
            pm = PMF.get().getPersistenceManager();
            UrlTarget ut = (UrlTarget) pm.getObjectById(UrlTarget.class, instance.getId());
            ut.setName(instance.getName());
            ut.setRemark(instance.getRemark());
            ut.setUrl(instance.getUrl());
           pm.makePersistent(ut);
        } catch(Exception ex){
            ex.printStackTrace();
        }finally {
            if(pm != null)pm.close();
        }
       
    }

public UrlTarget findById(Long id) {
        PersistenceManager pm = PMF.get().getPersistenceManager();
        try{
            return (UrlTarget) pm.getObjectById(UrlTarget.class, id);
        }catch(Exception ex){
            ex.printStackTrace();
        }finally {
            pm.close();
        }
        return null;
    }
在利用findById方法得到对象后修改,但是findById中pm已经关闭,这就是错误的原因了

2009年7月17日星期五

运通103漏雨

今早下雨,做公交上班,运通103竟然漏雨,骑车40分钟的路走了近两个小时,那个难受啊

Linux操作系统下VI编辑器常用命令介绍

来自http://net.zdnet.com.cn/network_security_zone/2008/0519/869835.shtml

一.简介

  vi是unix世界中最通用的全屏编辑器,linux中是用的是vi的加强版vim,vim同vi完全兼容,vi就是"visual interface"的缩写。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其它编辑程序所没有的。

  vi不是一个排版程序,它不象Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。

  vi没有菜单,只有命令,且命令繁多。只要在命令行上键入vi就可进入vi的编辑环境。vi有三种状态:命令模式,文本输入模式和末行模式。键入vi回车后首先进入vi的命令模式。

  在命令模式下用户输入的任何字符都被Vi当作命令加以解释执行,如果用户要将输入的字符当作是文本内容时,则首先应将Vi的工作模式从命令模式切换到文本输入模式。在命令模式下,按一下"a"("A")键或者”i” ("I")或者"o"("O")键,即进入插入态文本输入模式。按"a"键,插入到当前光标的后面;按"i"键,在当前光标处插入;按"A"键,在当前光标所在行的最后插入;按"I"键,在当前光标所在行的开头插入。在文本输入模式下,按Esc键,即回到命令模式。

  末行模式也称ex转义模式。Vi有一个专门的“转义”命令,可访问很多面向行的Ex命令。在命令模式下,用户按“:”键即可进入末行模式下,此时Vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令执行完后,Vi自动回到命令模式。

  例如:

  :1,$s /A/a/g

  则从文件第一行至文件尾将大写A全部替换成小写a。

  若在末行模式下输入命令过程中想转换的到命令模式,可按键,或用退格键将输入的命令全部删除之后,再按一下退格键,即可使Vi回到命令模式下。

  如果要从命令模式转换到编辑模式,可以键入命令a或者i;如果需要从文本模式返回,则按Esc键即可。在命令模式下输入“:”即可切换到末行模式,然后输入命令。

  Vi中的许多命令都要用到行号及行数等数值。若编辑的文件较大时,自己去数是非常不方便的。为此Vi提供了给文本加行号的功能。这些行号显示在屏幕的左边,而相应行的内容则显示在行号之后。 需要说明的是,这里加的行号只是显示给用户看的,它们并不是文件内容的一部分。

  当用Vi建立一个新文件时,在进入Vi的命令中也可以不给出文件名,当编辑完文件需要保存数据时,再由用户指定文件名。

  进入Vi时,用户不仅可以指定一个待编辑的文件名,而且还有许多附加操作。如果希望在进入Vi之后,光标处于文件中特定的某行上,可在Vi后加上任选项+n,其中n为指定的行数。例如 键入命令:vi +3 example.txt后,光标将位于文件example.txt中的第3行上。

  二.vi常用的命令

  1.插入(Insert)命令

  Vi提供了两个插入命令:i 和 I命令

  (1)i命令

  插入文本从光标所在位置前开始,并且插入过程中可以使用键删除错误的输入。此时Vi处于插入状态,屏幕最下行显示“--INSERT--”(插入)字样。

  例1,有一正在编辑的文件,如下所示:

  Welcome to vi world!Come on!

  ~

  ~

  光标位于第一个“!”上,需在其前面插入:

  This is an example!

  使用i命令,并输入相应文本后,屏幕显示如下:

  Welcome to vi world This is an example!!Come on!

  ~

  ~

  由此例可以看到,光标本来是在第一个“!”处,但是由于是从光标所在位置前开始插入,所以这个“!”就被挤到了新插入的文本之后。

  (2)I命令

  该命令是将光标移到当前行的行首,然后在其前插入文本.

  2.光标移动操作在屏幕上移动

全屏幕文本编辑器中,光标的移动操作无疑是最经常使用的操作了。用户只有熟练地使用移动光标的这些命令,才能迅速准确地到达所期望的位置处进行编辑。

Vi中的光标移动既可以在命令模式下,也可以在文本输入模式下,但操作的方法不尽相同。

(1)在文本输入模式下,可直接使用键盘上的四个方向键移动光标。

(2)在命令模式下,有很多移动光标的方法。不但可以使用四个方向键来移动光标,还可以用h、j、k、l这四个键代替四个方向键来移动光标,这样可以避免由于不同机器上的不同键盘定义所带来的矛盾,而且使用熟练后可以手不离开字母键盘位置就能完成所有操作,从而提高工作效率。

3.在屏幕上移动

Vi提供了三个关于光标在全屏幕上移动并且文件本身不发生滚动的命令。它们分别是H、M和L命令。

(1)H命令

该命令将光标移至屏幕首行的行首(即左上角),也就是当前屏幕的第一行,而不是整个文件的第一行。利用此命令可以快速将光标移至屏幕顶部。若在H命令之前加上数字n,则将光标移至第n行的行首。值得一提的是,使用命令dH将会删除从光标当前所在行至所显示屏幕首行的全部内容。

(2)M命令

该命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行;如果并未充满,则移动到文本的那些行的中间行。利用此命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。例如,在上面屏幕显示的情况下(不论光标在屏幕的何处),在命令模式下,输入命令M之后,光标都将移到add这一行的字母a上。同样值得一提的是,使用命令dM将会删除从光标当前所在行至屏幕显示文件的中间行的全部内容。

(3)L命令

当文件显示内容超过一屏时,该命令将光标移至屏幕上的最底行的行首;当文件显示内容不足一屏时,该命令将光标移至文件的最后一行的行首。可见,利用此命令可以快速准确地将光标移至屏幕底部或文件的最后一行。若在L命令之前加上数字n,则将光标移至从屏幕底部算起第n行的行首。同样值得一提的是,使用命令dL将会删除从光标当前行至屏幕底行的全部内容。

4.编辑命令

让我们看看最简单也是最常用的编辑过程:没有人不犯错误。所以迟早你会碰到修改你输入的文本的时候。实际上花在字处理上的大多数时间是修改而不是输入新的东西。因此,你要知道如何方便地修改就很重要。

(1)x--删除一个字符

删除文字的最简单的方式是用x。这个命令的结果是光标所处的字符的消失,后面的文字左移动。如果你删除的字符是一行最后的一个字符,那么光标将向左移动一个,这样光标就不会停留在不存在的字符的下面了。假如没有任何文字了,喇叭就叫。

(2)d--删除对象

这个命令的右边还要有一定的文字对象。文字对象就是一块文字。他右边接的就是在控制光标移动的那些字符。例如 w 表示向前一个单词,那么 dw 将删除下一个单词。5w 表示前进5个单词,那么 d5w 将删除他们。

(3)dd--删除一行

最常用的 d 系列命令之一。和前面一样, 5dd 将删除 5 行

(4)D--整个删除

大写形式的 D 用来删除从光标到行尾。和 d$ 一样效果。

(5)u--恢复

要后悔吗?他不仅仅撤消删除,还撤消你所有的编辑工作。

(6).--重复

重复编辑工作。

5.退出Vi

当编辑完文件,准备退出Vi返回到shell时,可以使用以下几种方法之一。

(1)在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则Vi保存该文件后退出,返回到shell;若当前编辑的文件没被修改过,则Vi直接退出, 返回到shell。

(2)在末行模式下,输入命令 :w Vi保存当前编辑文件,但并不退出,而是继续等待用户输入命令。在使用w命令时,可以再给编辑文件起一个新的文件名。

例如:w newfile

此时Vi将把当前文件的内容保存到指定的newfile中,而原有文件保持不变。若newfile是一个已存在的文件,则Vi在显示窗口的状态行给出提示信息:

File exists (use ! to override)

此时,若用户真的希望用文件的当前内容替换newfile中原有内容,可使用命令

:w! newfile

否则可选择另外的文件名来保存当前文件。

(3)在末行模式下,输入命令 :q 系统退出Vi返回到shell。若在用此命令退出Vi时,编辑文件没有被保存,则Vi在显示窗口的最末行显示如下信息:

No write since last change (use ! to overrides)

提示用户该文件被修改后没有保存,然后Vi并不退出,继续等待用户命令。若用户就是不想保存被修改后的文件而要强行退出Vi时,可使用命令:q! Vi放弃所作修改而直接退到shell下。

(4)在末行模式下,输入命令 :wq Vi将先保存文件,然后退出Vi返回到shell。

(5)在末行模式下,输入命令 :x 该命令的功能同命令模式下的ZZ命令功能相同。

来自:http://net.zdnet.com.cn/network_security_zone/2008/0519/869835.shtml

2009年7月14日星期二

用DateFormat的parse方法验证字符串是否是日期的问题

因为最近比较闲 有点不思进取 也没什么问题要写了
今天不错,发现一个,恩,感觉不错
做了一个上传Excel并解析数据然后入库的功能,里面涉及到是否是日期格式的判断
之前是这么写的(深谙这么写是不好的,但以为它是可靠的)

private boolean checkDate(String content) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            sdf.parse(content);
            return true;
        } catch (Exception e){
            return false;
        }
    }

现在发现问题了,对于“2008-06-23asdf”这种情况是返回true的,哈哈,看来是孤陋寡闻了,基础不扎实了,看API上这样讲:

在默认情况下,进行的分析是不严格的:如果输入的形式不是此对象的格式化方法使用的形式,但仍可作为日期进行分析,则分析将获得成功。客户机可能通过调用 setLenient(false) 来强调严格遵守该格式。


按照API说法,将代码改成
private boolean checkDate(String content) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            sdf. setLenient(false);
            sdf.parse(content);
            return true;
        } catch (Exception e){
            return false;
        }
    }

运行结果“2008-06-23asdf”这种情况还是返回true的,但“2008-13-23”这种情况是返回false的
最后改进程这种写法,可以适应"yyyy-MM-dd""yyyy-M-d""yyyy-MM-d""yyyy-M-dd"

private boolean checkDate(String content) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
        try {
            sdf.setLenient(false);
            content = content.replaceAll("-0", "-");
            Date d = sdf.parse(content);
            String s = sdf.format(d);
            return content.equals(s);
        } catch (Exception e){
            return false;
        }
    }

参考资料http://www.99inf.net/SoftwareDev/Java/52734.htm
              http://blog.163.com/everlee@126/blog/static/263574220089822631229/

当然也可以用正则表达式做到。

2009年7月10日星期五

觉得开心网该做客户端了

觉得开心网该做客户端了,外挂很火爆嘛,不如弄个官方外挂出来

发现堕落了

记得以前晚上临睡觉还躺着看看书,学习学习,隔段时间就想到书店转转
最近发现回家什么都不干了,书都不知道扔哪去了,堕落了 堕落了
什么原因?事儿比较多?休要狡辩。。。赶紧上进!

2009年7月9日星期四

迷糊SAP

这周公司在培训SAP PI
听的一塌糊涂
一上课10分钟就犯困
明儿好像就结束了 这可咋整

2009年7月2日星期四

提笔忘字

早上写个“液晶显示器”的“液”不会写,无奈在电脑上打出来 照着写

2009年6月16日星期二

百度登陆popup.js

一直在项目中用百度的popup.js,挺好用兼容性不错
有关详细介绍:http://bbs.80nian.net/thread-428-1-1.html
使用中自己也试着修改了些源码 以适应实际需要
1、在弹出层的时候popup.js隐藏了父页面中所有的select选择框,当然这是必要的,但项目中用到了日期选择框js,如果他们两个一块用,呵呵,就开始打架了,现象是 当关闭popup弹出框后会发现页面上有年份和月的select下拉框,我看到是在左上角
      分析popup.js,修改了源码,在popup.js隐藏select的时候,判断如果id为日期选择框中的id名字就不做操作,OK!
2、关闭按钮图标问题,popup.js写死从www.baidu.com中取关闭按钮图片,总不能用着人家js还要用人家图片 呵呵,索性换成了个全角 的X 哈哈
3、遇到一个新需求,就是想在关闭popup的时候,做一些判断处理,看来要对刚刚那个X动手脚了,在config中加了个属性showCloseButton,如果showCloseButton=true显示X,否则不显示X,然后自己在页面中加一个button处理关闭事件,这样自己想做什么就做什么了,哈哈

2009年6月11日星期四

用 Quartz 进行作业调度 续

如果不使用数据库存储,则配置文件变得很简单:
org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = one

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 2
org.quartz.threadPool.threadPriority = 4

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = quartz_job.xml

转载:http://www.blogjava.net/xmatthew/archive/2009/02/15/253864.html
CronTrigger配置格式:

格式: [秒] [分] [小时] [日] [月] [周] [年]

序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3 小时 是 0-23 , - * / 4 日 是 1-31 , - * ? / L W 5 月 是 1-12 or JAN-DEC , - * / 6 周 是 1-7 or SUN-SAT , - * ? / L # 7 年 否 empty 或 1970-2099 , - * /
通配符说明:
* 表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。
? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
- 表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。
, 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发
/ 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次。
L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"
W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-").
小提示

'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发(一般指发工资 )

# 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了) 小提示

周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.


       
常用示例:

0 0 12 * * ? 每天12点触发 0 15 10 ? * * 每天10点15分触发 0 15 10 * * ? 每天10点15分触发 0 15 10 * * ? * 每天10点15分触发 0 15 10 * * ? 2005 2005年每天10点15分触发 0 * 14 * * ? 每天下午的 2点到2点59分每分触发 0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发) 0 0/5 14,18 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
每天下午的 18点到18点59分(整点开始,每隔5分触发) 0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发 0 10,44 14 ? 3 WED 3月分每周三下午的 2点10分和2点44分触发 0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发 0 15 10 15 * ? 每月15号上午10点15分触发 0 15 10 L * ? 每月最后一天的10点15分触发 0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发 0 15 10 ? * 6L 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发 0 15 10 ? * 6#3 每月的第三周的星期五开始触发 0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次 0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)

除了使用xml配置job,还可以使用java代码建立job
public static void main(String[] args){
        try {
            // Initiate a Schedule Factory
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            // Retrieve a scheduler from schedule factory
            Scheduler scheduler = schedulerFactory.getScheduler();
           
            // current time
            long ctime = System.currentTimeMillis();
           
            // Initiate JobDetail with job name, job group, and executable job class
            JobDetail jobDetail =
                new JobDetail("jobDetail22", "jobDetailGroup22", SimpleJob.class);
            // Initiate CronTrigger with its name and group name
            CronTrigger cronTrigger = new CronTrigger("cronTrigger2", "triggerGroup22");
           
                // setup CronExpression
                CronExpression cexp = new CronExpression("0/5 * * * * ?");
                // Assign the CronExpression to CronTrigger
                cronTrigger.setCronExpression(cexp);
           
            // schedule a job with JobDetail and Trigger
            scheduler.scheduleJob(jobDetail, cronTrigger);
           
            // start the scheduler
            scheduler.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
   
    }

参考资料:
http://www.blogjava.net/xmatthew/archive/2009/02/15/253864.html
http://www.ibm.com/developerworks/cn/java/j-quartz/index.html

http://www.blogjava.net/steady/archive/2007/08/02/134017.html

用 Quartz 进行作业调度

Quartz 是个开源的作业调度框架,
为在 Java 应用程序中进行作业调度提供了简单却强大的机制。
Quartz 允许开发人员根据时间间隔(或天)来调度作业。
它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。
整合了 Quartz 的应用程序可以重用来自不同事件的作业,
还可以为一个事件组合多个作业。


   1. 下载 Quartz API。
   2. 新建web项目
   3. 解压缩并把 quartz-x.x.x.jar、core 和/或 optional 文件夹中的 jar 文件和optional 文件夹中的 jar 文件 放在项目lib文件夹内。如果使用 JDBCJobStore,把所有的 JDBC jar 文件放在项目的lib文件夹。
   4. 新建java类作为一个job,必须实现org.quartz.Job接口
      public class SimpleJob implements Job {

          public void execute(JobExecutionContext context) throws JobExecutionException {
              System.out.println("In SimpleQuartzJob - executing its JOB at "
                      + new Date() + " by " + context.getTrigger().getName());
          }
      }
   5. 在src下新建quartz_job.xml,<cron-expression>0/2 * * * * ?</cron-expression>配置从0秒开始每两秒执行一次
      <?xml version="1.0" encoding="UTF-8"?>
      <quartz>
          <job>
              <job-detail>
                  <name>job1</name>
                  <group>job</group>
                  <job-class>com.capinfo.job.SimpleJob</job-class>
              </job-detail>
              <trigger>
                  <cron>
                      <name>t1</name>
                      <group>job</group>
                      <job-name>job1</job-name>
                      <job-group>job</job-group>
                      <cron-expression>0/2 * * * * ?</cron-expression>
                  </cron>
              </trigger>
          </job>
      </quartz>
   6. 在web.xml中加入:
      <servlet>
          <servlet-name>quartz</servlet-name>
          <servlet-class>
              org.quartz.ee.servlet.QuartzInitializerServlet
          </servlet-class>
          <init-param>
              <param-name>config-file</param-name>
              <param-value>/quartz.properties</param-value>
          </init-param>
          <init-param>
              <param-name>shutdown-on-unload</param-name>
              <param-value>true</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
      </servlet>
   7. 在src下新建quartz.properties
      #########################################################################

      #============================================================================
      # Configure Main Scheduler Properties
      #============================================================================

      org.quartz.scheduler.instanceName = TestScheduler
      org.quartz.scheduler.instanceId = i_one

      #============================================================================
      # Configure ThreadPool
      #============================================================================

      org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
      org.quartz.threadPool.threadCount = 5
      org.quartz.threadPool.threadPriority = 5

      #============================================================================
      # Configure JobStore
      #============================================================================

      #org.quartz.jobStore.misfireThreshold = 60000

      org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
      org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
      #org.quartz.jobStore.useProperties=false
      org.quartz.jobStore.dataSource=myDS
      #org.quartz.jobStore.tablePrefix=QRTZ_
      #org.quartz.jobStore.isClustered=true

      #============================================================================
      # Other Example Delegates
      #============================================================================
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.CloudscapeDelegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DB2v6Delegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DB2v7Delegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DriverDelegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PointbaseDelegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.WebLogicDelegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
      #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.WebLogicOracleDelegate

      #============================================================================
      # Configure Datasources
      #============================================================================

      org.quartz.dataSource.myDS.driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
      org.quartz.dataSource.myDS.URL = jdbc:sqlserver://localhost:1433;;DatabaseName=quartzdb;autoReconnect=true
      org.quartz.dataSource.myDS.user = sa
      org.quartz.dataSource.myDS.password = 123456
      org.quartz.dataSource.myDS.maxConnections = 5
      org.quartz.dataSource.myDS.validationQuery=

      #============================================================================
      # Configure Plugins
      #============================================================================

      org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin

      org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
      org.quartz.plugin.jobInitializer.fileName = quartz_job.xml
      org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
      org.quartz.plugin.jobInitializer.failOnFileNotFound = true
      org.quartz.plugin.jobInitializer.scanInterval = 10
      org.quartz.plugin.jobInitializer.wrapInUserTransaction = false



      #org.quartz.plugin.shutdownHook.class = org.quartz.plugins.management.ShutdownHookPlugin
      #org.quartz.plugin.shutdownHook.cleanShutdown = true


      #org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
   8. 初始化数据库表,在\quartz-1.6.5\docs\dbTables中有sql脚本
   9. OK,部署,运行

2009年6月10日星期三

jdbc连接sql server 2000和连接sql server 2005写法不同

在sql server 2000 中加载驱动和URL路径的语句是

String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
String dbURL = "jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sample";

而sql server 2005 中加载驱动和url的语句则为

String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dbURL = "jdbc:sqlserver://localhost:1433; DatabaseName=sample";

SQL Server 2005 driver for JDBC 参考:http://www.bccn.net/Article/kfyy/java/jszl/200706/4588.html