随笔-179  评论-666  文章-29  trackbacks-0
 

如何为代码选择开源许可证,这是一个问题。

世界上的开源许可证,大概有上百种。很少有人搞得清楚它们的区别。即使在最流行的六种----GPLBSDMITMozillaApacheLGPL----之中做选择,也很复杂。

乌克兰程序员Paul Bagwell,画了一张分析图,说明应该怎么选择。这是我见过的最简单的讲解,只用两分钟,你就能搞清楚这六种许可证之间的最大区别。

下面是我制作的中文版,请点击看大图。


posted @ 2011-05-03 09:05 Alpha 阅读(446) | 评论 (0)编辑 收藏

http://blog.s135.com/nginx_php_v6/

http://www.mike.org.cn



posted @ 2011-04-27 11:29 Alpha 阅读(437) | 评论 (0)编辑 收藏



完善api-doc,用eclipse生成javadoc的时候发生“编码 GBK 的不可映射字符 ”其实是字符编码问题。
打开eclipse,project -> Generate javadoc 一项一项的选你要输出javadoc的项目,最后一步中VM设置行中加入以下代码
-encoding utf-8 -charset utf-8 
-encoding utf-8 -charset utf-8 -J-Xmx256m
这次操作,输出的html代码不会发生“编码 GBK 的不可映射字符 ”问题,而且html字符编码都设为了UTF-8,问题彻底解决
posted @ 2011-04-26 11:15 Alpha 阅读(1171) | 评论 (0)编辑 收藏

一、简介:

BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。

二、用法:

BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:

Java代码 复制代码
  1. public static void copyProperties(java.lang.Object dest,java.lang.Object orig)   
  2. throws java.lang.IllegalAccessException,   
  3.        java.lang.reflect.InvocationTargetException  


如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:

Java代码 复制代码
  1. //得到TeacherForm   
  2. TeacherForm teacherForm=(TeacherForm)form;   
  3. //构造Teacher对象   
  4. Teacher teacher=new Teacher();   
  5. //赋值   
  6. teacher.setName(teacherForm.getName());   
  7. teacher.setAge(teacherForm.getAge());   
  8. teacher.setGender(teacherForm.getGender());   
  9. teacher.setMajor(teacherForm.getMajor());   
  10. teacher.setDepartment(teacherForm.getDepartment());   
  11.   
  12. //持久化Teacher对象到数据库   
  13. HibernateDAO=;   
  14. HibernateDAO.save(teacher);   
  15.   
  16.   
  17. 而使用BeanUtils后,代码就大大改观了,如下所示:   
  18. //得到TeacherForm   
  19. TeacherForm teacherForm=(TeacherForm)form;   
  20. //构造Teacher对象   
  21. Teacher teacher=new Teacher();   
  22. //赋值   
  23. BeanUtils.copyProperties(teacher,teacherForm);   
  24. //持久化Teacher对象到数据库   
  25. HibernateDAO=;   
  26. HibernateDAO.save(teacher);  


如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如 Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:

Java代码 复制代码
  1. teacher.setModifyDate(new Date());  


怎么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与 BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。BeanUtils支持的转换类型如下:


    * java.lang.BigDecimal
    * java.lang.BigInteger
    * boolean and java.lang.Boolean
    * byte and java.lang.Byte
    * char and java.lang.Character
    * java.lang.Class
    * double and java.lang.Double
    * float and java.lang.Float
    * int and java.lang.Integer
    * long and java.lang.Long
    * short and java.lang.Short
    * java.lang.String
    * java.sql.Date
    * java.sql.Time
    * java.sql.Timestamp


这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。

三、优缺点:

Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我将说明如何使用BeanUtils将local实体bean转换为对应的value 对象:

Java代码 复制代码
  1. BeanUtils.copyProperties(aValue, aLocal);  


上面的代码从aLocal对象复制属性到aValue对象。它相当简单!它不管local(或对应的value)对象有多少个属性,只管进行复制。我们假设local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了!太强大了!太有用了!

BeanUtils.copyProperties 与 PropertyUtils.copyProperties 都是拷贝对象属性的方法,BeanUtils 支持类型转换,而 PropertyUtils 不支持。但是 BeanUtils 不允许对象的属性值为 null,PropertyUtils 可以拷贝属性值 null 的对象。
如果对象属性值为 null,BeanUtils.copyProperties 方法会报 commons.beanutils.ConversionException: No value specified 错误。

现在,还有一个坏消息:使用BeanUtils的成本惊人地昂贵!我做了一个简单的测试,BeanUtils所花费的时间要超过取数据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力!


MethodUtils类使用方法:

Java代码 复制代码
  1. package rong.propertyUtils;   
  2.   
  3. import java.util.Map;   
  4. import org.apache.commons.beanutils.MethodUtils;   
  5. import org.apache.commons.beanutils.PropertyUtils;   
  6.   
  7. public class TestPropertyUtils {   
  8.        
  9.     public static void main(String[] args) throws Exception{   
  10.            
  11.         Entity entity = new Entity();   
  12.            
  13.         //通过PropertyUtils的getProperty方法获取指定属性的值   
  14.         Integer id = (Integer)PropertyUtils.getProperty(entity, "id");   
  15.         String name = (String)PropertyUtils.getProperty(entity, "name");   
  16.         System.out.println("id = " + id + "  name = " + name);   
  17.            
  18.         //调用PropertyUtils的setProperty方法设置entity的指定属性   
  19.         PropertyUtils.setProperty(entity, "name""心梦帆影");   
  20.         System.out.println("name = " + entity.getName());   
  21.            
  22.         //通过PropertyUtils的describe方法把entity的所有属性与属性值封装进Map中   
  23.         Map map = PropertyUtils.describe(entity);   
  24.         System.out.println("id = " + map.get("id") + "  name = " + map.get("name"));   
  25.            
  26.         //通过MethodUtils的invokeMethod方法,执行指定的entity中的方法(无参的情况)   
  27.         System.out.println( MethodUtils.invokeMethod(entity, "haha"null) );   
  28.            
  29.         //通过MethodUtils的invokeMethod方法,执行指定的entity中的方法(1参的情况)   
  30.         MethodUtils.invokeMethod(entity, "sayHelle""心梦帆影");   
  31.            
  32.         //通过MethodUtils的invokeMethod方法,执行指定的entity中的方法(多参的情况)   
  33.         Object[] params = new Object[]{new Integer(10),new Integer(12)};   
  34.         String msg = (String)MethodUtils.invokeMethod(entity, "countAges", params);   
  35.         System.out.println(msg);   
  36.            
  37.     }   
  38.   
  39. }  
posted @ 2010-05-10 14:07 Alpha 阅读(3263) | 评论 (1)编辑 收藏
本人经常用到的命令,在这里做下记录。
 

.tar.bz2

解压:tar jxvf FileName.tar.bz2 压缩:tar jcvf FileName.tar.bz2 DirName

.gz
解压1:gunzip FileName.gz   解压2:gzip -d FileName.gz 压缩:gzip FileName
.tar.gz
和 .tgz
解压:tar zxvf FileName.tar.gz 压缩:tar zcvf FileName.tar.gz DirName

.rpm
解包:rpm2cpio FileName.rpm | cpio -div
.deb
解包:ar p FileName.deb data.tar.gz | tar zxf -

从远程scp到本地:

scp root@192.168.2.100:/opt/test/* /opt/test ,输入远程机器密码后完成

scp -P 3588  root@192.168.2.100:/opt/test/* /opt/test 走特殊端口号


从本地scp到远程:

scp /opt/test/*  root@192.168.2.100:/opt/test ,输入远程机器密码后完成

使用方式 : chmod [-cfvR] [--help] [--version] mode file...

使用方式 :chown jessie:users file1.txt 

Mysql 初始化:chkconfig –add mysqld

正在使用的端口:netstat -ant

挂载USB: mount  /dev/sdc /mnt/usb

Rpm 安装: rpm –ivh filename

www服务配置:/etc/httpd/conf/httpd.conf

网络测试:curl -I http://www.job5156.com

改IP地址:ifconfig eth0 192.168.2.29 netmask 255.255.255.0

改网关:route add default gw 192.168.2.254   查看:route –n

改DNS:nano -w /etc/resolv.conf  


导出表结构:mysqldump -u root -p -d --add-drop-table dbName tableName > /opt/name.sql

导入表结构:mysql dbName < name.sql

修复Mysql表: mysqlrepair --auto-repair -F -r dbName  tableName

给mysql用户加账号权限: grant all on dbName.* to user@'%' identified by 'pwd'; FLUSH PRIVILEGES;

加字段:ALTER TABLE table_name ADD field_name field_type;

删字段:alter table t2 drop column c;

字段重命名:alter table t1 change a b integer;

表重命名:alter table t1 rename t2;

加索引:alter table tablename add index 索引名 (字段名1[,字段名2 …]);

删索引:alter table tablename drop index emp_name;

posted @ 2010-04-16 15:17 Alpha 阅读(1232) | 评论 (0)编辑 收藏

最近在寻找这方面的资料:

 

1,查看apache进程:
ps aux | grep httpd | grep -v grep | wc -l

2,查看80端口的tcp连接:
netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l

3,通过日志查看当天ip连接数,过滤重复:

cat access_log | grep "24/Jul/2007" | awk '{print $2}' | sort | uniq -c | sort -nr

4,当天ip连接数最高的ip都在干些什么(原来是蜘蛛):
cat access_log | grep "24/Jul/2007:00" | grep "61.135.166.230" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10

5,当天访问页面排前10的url:

cat access_log | grep "24/Jul/2007:00" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10

6,用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr
接着从日志里查看该ip在干嘛:
cat access_log | grep 220.181.38.183| awk '{print $1"\t"$8}' | sort | uniq -c | sort -nr | less


7,查看某一时间段的ip连接数:
grep "2006:0[7-8]" www20060723.log | awk '{print $2}' | sort | uniq -c| sort -nr | wc -l

posted @ 2010-03-31 16:55 Alpha 阅读(1918) | 评论 (0)编辑 收藏
    当你在客户端用view source看JSP生成的代码时,会发现有很多空行,他们是由< %...% >后的回车换行而生成的,也就是说每一行由< %...% >包含的JSP代码到客户端都变成一个空行,虽然不影响浏览,但还是希望能把他们删掉。这里将为大家介绍如何删除JSP编译后的空行。

    删除JSP编译后的空行办法如下:

    1. 支持JSP 2.1+ ,在每个要去空行的页面里包含下面代码:

            
    1. <%@ page trimDirectiveWhitespaces="true" %> 

    在 Tomcat 6.0.14下测试JSP编译成功

    2. 支持servlet 2.5+, 即 web.xml的 XSD版本为2.5,在web.xml中加入如下代码

            
    1. <jsp-config> 
    2. <jsp-property-group> 
    3. <url-pattern>*.jsp</url-pattern> 
    4. <trim-directive-whitespaces>true</trim-directive-whitespaces> 
    5. </jsp-property-group> 
    6. </jsp-config> 

    在tomcat 6.0.14下测试JSP编译成功

    3. Tomcat 5.5.x+,在Tomcat安装目录/conf/web.xml中找到名叫"jsp"的servlet,添加下面一段代码:

            
    1. <init-param> 
    2. <param-name>trimSpaces</param-name> 
    3. <param-value>true</param-value> 
    4. </init-param> 

    本人测过

    trimSpaces          Should white spaces in template text between  actions or directives be trimmed?  [false]

    在实际操作中我加入了5.5的配置到页面中并反复启动了几次tomcat但是还是没有成功,后来才想到JSP已经编译成servlet了所以没有能改变,进入到tomcat中的work目录把已经进行JSP编译的class全部删除,哇哈哈,整个世界清净了,成功删除空行

     

     

posted @ 2010-03-25 10:12 Alpha 阅读(1473) | 评论 (0)编辑 收藏
     摘要: 优化是一项复杂的任务,因为它最终需要对整个系统的理解。当用你的系统/应用的小知识做一些局部优化是可能的时候,你越想让你的系统更优化,你必须知道它也越多。  阅读全文
posted @ 2009-09-22 16:55 Alpha 阅读(6359) | 评论 (20)编辑 收藏
现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses/alphabetical)。我们在常见的开源协议如BSD, GPL, LGPL,MIT等都是OSI批准的协议。如果要开源自己的代码,最好也是选择这些被批准的开源协议。
这里我们来看四种最常用的开源协议及它们的适用范围,供那些准备开源或者使用开源产品的开发人员/厂家参考。
BSD开源协议(original BSD license、FreeBSD license、Original BSD license)
BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以"为所欲为",可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。
但"为所欲为"的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:
Ruby代码
1.如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。  
2.如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。  
3.不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对 商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。
Apache Licence 2.0(Apache License, Version 2.0、Apache License, Version 1.1、Apache License, Version 1.0)
Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:
Ruby代码
1.需要给代码的用户一份Apache Licence  
2.如果你修改了代码,需要再被修改的文件中说明。  
3.在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。  
4.如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。
需要给代码的用户一份Apache Licence
如果你修改了代码,需要再被修改的文件中说明。
在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。
Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。
GPL(GNU General Public License)
我们很熟悉的Linux就是采用了 GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代 码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商 业软件公司开发的免费软件了。
GPL协议的主要内容是只要在一个软件中使用("使用"指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的"传染性"。GPL协议的产品作为一个单独的产品使用没有任何问题, 还可以享受免费的优势。
由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。
其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。
LGPL(GNU Lesser General Public License)
LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL允许商 业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和 销售。
但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源代码很 适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。
GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品。
MIT(MIT)
MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他了限制.也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。
posted @ 2009-08-05 15:59 Alpha 阅读(940) | 评论 (0)编辑 收藏
     摘要: Flex中As调用Js的方法是:
1、导入包 (import flash.external.ExternalInterface;)
2、使用ExternalInterface.call("Js函数名称",参数)进行调用,其返回的值就是Js函数所返回的值
Js调用As的方法是:
1、导入包 (import flash.external.ExternalInterface;)
2、在initApp中使用ExternalInterface.addCallback("用于Js调用的函数名",As中的函数名)进行注册下
3、js中 就可以用document.getElementById("Flas在Html中的ID").注册时设置的函数名(参数)进行调用
  阅读全文
posted @ 2009-06-27 10:32 Alpha 阅读(26647) | 评论 (4)编辑 收藏
仅列出标题
共18页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last