向左走,向右走。。。
          永遠(yuǎn)不回頭
          posts - 16,comments - 17,trackbacks - 0
          @ My Space
          posted @ 2005-05-13 00:08 非飛 閱讀(2468) | 評論 (2)編輯 收藏
          @ My space
          posted @ 2005-05-07 00:19 非飛 閱讀(2232) | 評論 (0)編輯 收藏
          在JDK1.4.2中加入了對NIO的支持,掌握其中的Selector個人認(rèn)為是能實現(xiàn)好NIO的關(guān)鍵。

          Selector是用來獲取注冊在其中的channel的相關(guān)事件的發(fā)生,也就是accept,read和write。selector中有3個key set。

          key set:包含代表所有在其中注冊的channel,可以通過selector.keys()得到。
          selected-key set:包含所有被檢測到有關(guān)注的操作已經(jīng)就緒的key,通過selector.selectedKeys得到。
          cancelled-key set:包含所有已經(jīng)被cancel,但是還沒有channel還沒有deregister的key,這個集合是不能直接被訪問的。

          key通過調(diào)用channel的register方法被加入到key set中。被取消的key在select的時候會被從相應(yīng)的key set中移除。

          key set自身是不可以直接進(jìn)行修改的。 無論是通過調(diào)用channel的close方法還是調(diào)用key的cancel方法,key都會被放置到canceled-key set中。取消的key會將其channel在下一次select時將注冊撤銷,同時將key從所有的key set中移除。

          key在執(zhí)行select操作時被加入到selected-key set中。在selected-key set中的key可以通過調(diào)用iterator的remove方法,將其從selected-key set中移除,不能通過其他的辦法將其從selected-key set中移除。

          通過selector的3個方法select(阻塞選擇,直到有關(guān)心的事件發(fā)生時退出阻塞),selectNow(不阻塞選擇),select(long)(指定超時選擇,超時到達(dá)或者有關(guān)心事件發(fā)生時退出阻塞),來獲取關(guān)心事件的發(fā)生。其執(zhí)行步驟分為以下3步:

          1、將存在于canceled-key set中的key從所有的key set中移除,撤銷注冊的channel,清空canceled-key set。
          2、地層操作系統(tǒng)檢查是否有關(guān)心的事件發(fā)生,當(dāng)有關(guān)心的事件發(fā)生時,首先檢查channel的key是否已經(jīng)存在于selected-key set中,如果不存在,則將其加入到selected-key set中去,同時修改key的ready-operation set來表明當(dāng)前ready的操作,而以前存在于ready-operation set中的信息會被刪除。如果對應(yīng)的key已經(jīng)存在于selected-key set中,這直接修改其ready-operation set來表明當(dāng)前ready的操作,刪除原來ready-operation set中的信息。
          3、如果在第二步中有加入到canceled-key set中的key,在這一步會執(zhí)行第一步的操作。

          selector自身是線程安全的,而他的key set卻不是。在一次選擇發(fā)生的過程中,對于key的關(guān)心事件的修改要等到下一次select的時候才會生效。 另外,key和其代表的channel有可能在任何時候被cancel和close。因此存在于key set中的key并不代表其key是有效的,也不代表其channel是open的。如果key有可能被其他的線程取消或關(guān)閉channel,程序必須小 心的同步檢查這些條件。

          阻塞了的select可以通過調(diào)用selector的wakeup方法來喚醒。
          posted @ 2005-04-26 10:06 非飛 閱讀(17400) | 評論 (3)編輯 收藏

          在JavaScript中,可以通過window.location來獲取url地址。但是window.location是一個對象,沒有辦法直接從里面獲取出我們需要的參數(shù)。通常的做法就是使用一個隱藏的<input>,通過將window.location負(fù)值給input。其目的就是為了將location轉(zhuǎn)換成String。寫的過程中總是覺得太復(fù)雜了,后來發(fā)現(xiàn)使用document.URL就可以解決這個問題。
          posted @ 2005-04-18 15:52 非飛 閱讀(4103) | 評論 (3)編輯 收藏

          今天在幫朋友寫一個簡單的產(chǎn)品發(fā)布網(wǎng)站,由于使用的空間是靜態(tài)的,沒有辦法只能在javascript上下功夫了。首先想到的便是RIA,上網(wǎng)google了一下,發(fā)現(xiàn)這樣的東西還真不少,可謂是十八般武藝各顯靈通。看了看文明的bindows,感覺真的非常的好。可是選擇它對于我要做的東西,可以說是過于復(fù)雜了。(http://www.bindows.net 有興趣的朋友可以去看看)。
          搜索了半天最后還是決定,采用javascript讀取服務(wù)器端xml文件的辦法來實現(xiàn)。嘗試了一下感覺還不錯,確定就是對使用的瀏覽器有依賴。
          先寫了一個商品的xml文件:

          <?xml version="1.0"?>
          <root>
           
          <product id="0001" name="product1" price="10.00">
            
          <description>
             Detail Description
            
          </description>
           
          </product>
           
          <product id="0002" name="product2" price="20.00">
            
          <description>
             Detail Description
            
          </description>
           
          </product>
          </root>

           

          使用javascript來讀入xml實在是相當(dāng)?shù)暮唵危恍枰獌删湓捑涂梢愿愣ǎ?BR>

          // 裝載xml文件的函數(shù)
          function loadXML(fileName) {
           
          // 定義一個xml dom對象
           var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
           
           xmlDoc.load(fileName);
           xmlObj 
          = xmlDoc.documentElement;
          }

           

          指定要載入的xml文件名就可以完成對xml的讀入。

          // 載入xml文件
          loadXML("product.xml");

           

          得到xml對象后就可以適用對象提供的相應(yīng)方法和屬性來獲取xml中定義的數(shù)據(jù)信息。
          xmlObj.hasChildNodes來判斷是否含有子項;
          xmlObj.childNodes.lenght 得到包含的子項的數(shù)量
          子項可以用數(shù)字來作為索引,以product.xml為例。如果我們要獲取第二條商品時,可以用xmlObj.childNodes(1)來獲得,xmlObj.childNodes(1).childNodes(0)得到的是description
          xmlObj.childNodes(1).childNodes(0).text 得到description的值
          xmlObj.childNodes(1).getAttribute("name") 得到第二條商品的名字


          posted @ 2005-04-09 12:23 非飛 閱讀(4722) | 評論 (1)編輯 收藏

          下載了一個Action Script Viewer 4.0對原來的swf文件進(jìn)行反編譯,雖然有的movie clip會出現(xiàn)一點問題,但是總的來說效果還是不錯的,而且操作相當(dāng)?shù)暮唵巍?BR>
          1)使用ASV打開要進(jìn)行反編譯的SWF文件;
          2)File-->export rebuild data。這時將swf文件分拆成單個的swf文件;
          3)打開flash,創(chuàng)建一個空的fla文件;
          4)File-->Import...-->Import to Library   將前面導(dǎo)出的swf文件導(dǎo)入,如果swf文件太多flash會報錯,可以通過分批導(dǎo)入文件來繞過這個錯誤;
          5)將新建的swf文件保存為rebuild.fla,并且3)導(dǎo)出的文件在同一目錄;
          6)運行3)產(chǎn)生的一個rebuild.jsfl文件,一切搞定。


          posted @ 2005-04-04 03:32 非飛 閱讀(2708) | 評論 (1)編輯 收藏

          中午收到老姐來的電話,電話里她是一遍一遍又一遍的在我耳邊嘮叨,說,“不管你怎么忙,有多少東西要寫,一定要按時睡覺”。還列出了一堆要按時睡覺的理由。其實誰不知道應(yīng)該要按時睡覺,可是作為寫程序的程序員來說,要真想做到這一點實在是難,難,難呀!

          要按時睡覺的理由


          從人的排毒期入手:晚間11:00--1:00,肝的排毒期(必須在睡覺中進(jìn)行)
          從人的睡眠最佳時段入手:1:00--4:00,人的睡眠是質(zhì)量最高的

          不知道各位有誰是有正常的生活習(xí)慣的,能不能說一說你是怎么做到的。。。


          posted @ 2005-03-23 15:25 非飛 閱讀(2124) | 評論 (3)編輯 收藏

              做項目,無論是遺留產(chǎn)品的再生產(chǎn),還是對遺留產(chǎn)品的再利用,都不可避免的會出現(xiàn)一大堆的異構(gòu)現(xiàn)象。解決異構(gòu)通信問題是這類項目的主要問題。以前看見這種情況第一個解決方案就是Socket通信。說實在的自己實現(xiàn)Socket通信,定制通信協(xié)議,或者是實現(xiàn)已有的通信協(xié)議都是很頭痛的事情。本人有不堪回首的歷史經(jīng)歷。

              最近同樣在項目中需要去解決一個異構(gòu)問題,由于時間的緊迫,以及先天的運行環(huán)境(兩個部分是運行在同一臺機(jī)器上的)。考慮到了使用JNI,結(jié)果表明JNI是完全可以勝任目前的角色的。以前沒有了解過JNI,總是以為它這不好那不好,用了用,表現(xiàn)還不錯,而且實現(xiàn)起來非常之簡單。

              整個實現(xiàn)過程可以分為五步來完成:

          1)寫一個聲明了native的Java文件:

          package example;

          public class TestJNI 
          {
              
          static 
          {
                  System.loadLibrary(
          "test"
          );
              }

              
              
          public native String getNameCPP();
          }


          2) 使用javah產(chǎn)生對應(yīng)的CPP頭文件:
          命令:javah -classpath <path> -jni example.TestJNI -d <out_dir>
          生成的頭文件example_TestJNI.h如下:
          /* DO NOT EDIT THIS FILE - it is machine generated */
          #include 
          <jni.h>
          /* Header for class example_TestJNI */

          #ifndef _Included_example_TestJNI
          #define _Included_example_TestJNI
          #ifdef __cplusplus
          extern "C" {
          #endif
          /*
           * Class:     example_TestJNI
           * Method:    getNameForCPP
           * Signature: ()Ljava/lang/String;
           
          */

          JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
            (JNIEnv 
          *, jobject);

          #ifdef __cplusplus
          }

          #endif
          #endif

          3)實現(xiàn)對應(yīng)的CPP代碼:
          #include "example_TestJNI.h"
          #include 
          <string>

          JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
            (JNIEnv 
          * env, jobject)
          {
              
          //TODO 可以在此調(diào)用其他的代碼
              std::string strName = "Tower";
              
          return env->NewStringUTF(strName.c_str());
          }


          4) 編譯CPP代碼
          命令:g++ -o libtest.so -shared -I<include_path> -I<java_home>/include -I<java_home>/include/linux example_TestJNI.cpp

          5)執(zhí)行
          package example;

          public class Test {
              
          public static void main(String[] args) {
                  TestJNI test 
          = new TestJNI();
                  System.
          out.println("Hello " + test.getNameForCPP());
              }

          }


          export LD_EXPORT_PATH=<so_path>
          java -cp <path> -Djava.library.path=<so_path> example.Test
          輸出:Hello Tower
          posted @ 2005-03-22 18:39 非飛 閱讀(3357) | 評論 (0)編輯 收藏

          做了這么久的軟件,從來就沒有好好的學(xué)習(xí)過設(shè)計模式。寫代碼,做設(shè)計的時候都是稀里糊涂。做出來的設(shè)計,都會不同程度的讓自己感覺到不安。這可能就是《設(shè)計模式精解》書中所說那種直覺吧。

          引用:

          留意你的知覺

          出自本能的直覺能對設(shè)計質(zhì)量做出令人驚訝的預(yù)測。所謂“出自本能的直覺”,是指當(dāng)你看到某些不喜歡的東西時,你胃部的感覺。我知道這聽起來并不科學(xué)(而且它的確不科學(xué)),但我的經(jīng)驗總是向我證明:當(dāng)我從直覺上不喜歡一個設(shè)計時,一個更好的設(shè)計一定就躺在角落里。

          Facade模式:關(guān)鍵特征

          意圖:希望簡化現(xiàn)有系統(tǒng)的使用方法。你需要定義自己的接口。
          問題:只需要使用一個復(fù)雜系統(tǒng)的一個子集。或者,需要用一種特殊的方式與系統(tǒng)交互。
          解決方案:Facade向客戶展現(xiàn)使用現(xiàn)有系統(tǒng)的一個新的接口。
          參與者與協(xié)作者:向客戶展現(xiàn)一個定制的接口,讓客戶更容易地使用現(xiàn)有系統(tǒng)。
          效果:Facade模式簡化了對所需子系統(tǒng)的使用。但是,由于Facade并不完整,因此某些功能對于客戶可能是可用的。
          現(xiàn)實:1)定義一個(或一組)新的類來提供所需要的接口。
                       2)讓新的類使用現(xiàn)有的系統(tǒng)。

          Facade模式使用于以下情況:

          • 不需要使用一個復(fù)雜系統(tǒng)的所有功能,并且可以創(chuàng)建一個新的類來包容訪問原有系統(tǒng)的接口的一個子集(通常它就是)比原始系統(tǒng)AP簡單得多。
          • 希望包裝或隱藏原有系統(tǒng)。
          • 希望使用原有系統(tǒng)的功能,并且希望增加一些新的功能。
          • “編寫一個新的類”的代價小于“讓所有人學(xué)會使用原有系統(tǒng)”或“在未來維護(hù)整個系統(tǒng)”所需的代價

           

          posted @ 2005-03-13 23:41 非飛 閱讀(2643) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 盐城市| 县级市| 绩溪县| 措勤县| 灵川县| 普兰店市| 福州市| 威远县| 东城区| 石城县| 邓州市| 无极县| 新昌县| 象山县| 重庆市| 泸定县| 华宁县| 简阳市| 汨罗市| 麻栗坡县| 城固县| 万年县| 南宫市| 水城县| 织金县| 平昌县| 邳州市| 黄大仙区| 洪湖市| 鸡东县| 布拖县| 松原市| 贵德县| 通许县| 广河县| 武强县| 商城县| 迭部县| 尚志市| 盘山县| 青州市|