隨筆-179  評論-666  文章-29  trackbacks-0
           

          如何為代碼選擇開源許可證,這是一個問題。

          世界上的開源許可證,大概有上百種。很少有人搞得清楚它們的區別。即使在最流行的六種----GPLBSD、MIT、Mozilla、ApacheLGPL----之中做選擇,也很復雜。

          烏克蘭程序員Paul Bagwell,畫了一張分析圖,說明應該怎么選擇。這是我見過的最簡單的講解,只用兩分鐘,你就能搞清楚這六種許可證之間的最大區別。

          下面是我制作的中文版,請點擊看大圖。


          posted @ 2011-05-03 09:05 Alpha 閱讀(457) | 評論 (0)編輯 收藏

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

          http://www.mike.org.cn



          posted @ 2011-04-27 11:29 Alpha 閱讀(452) | 評論 (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 閱讀(1191) | 評論 (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 閱讀(3280) | 評論 (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 閱讀(1250) | 評論 (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 閱讀(1934) | 評論 (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 閱讀(1494) | 評論 (0)編輯 收藏
               摘要: 優化是一項復雜的任務,因為它最終需要對整個系統的理解。當用你的系統/應用的小知識做一些局部優化是可能的時候,你越想讓你的系統更優化,你必須知道它也越多。  閱讀全文
          posted @ 2009-09-22 16:55 Alpha 閱讀(6409) | 評論 (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 閱讀(959) | 評論 (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 閱讀(26676) | 評論 (4)編輯 收藏
          僅列出標題
          共18頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 河南省| 临安市| 岳普湖县| 揭东县| 临江市| 遂川县| 集安市| 永济市| 昭觉县| 同德县| 彩票| 崇义县| 寿宁县| 马尔康县| 长丰县| 通榆县| 陆丰市| 天津市| 元阳县| 平罗县| 榆树市| 绍兴市| 耒阳市| 炉霍县| 顺平县| 涟水县| 阳信县| 响水县| 泽库县| 沂南县| 五台县| 江永县| 喀什市| 察哈| 白山市| 岳池县| 瑞丽市| 麦盖提县| 济南市| 灵武市| 普兰县|