amp@java

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            99 隨筆 :: 0 文章 :: 228 評論 :: 0 Trackbacks

          #

          昨天在調試一段Android程序的時候發現總是出現NullPointerException,是來自一句System.out.println(),但是把里面的內容分拆了幾次都找不到哪里有null,最后發現居然是因為最終輸出的字符串是null!

          一直以來,在JavaSE里,如果字符串本身是null,System.out.println()打印該字符串,會在終端輸出“null”,而在Android里卻是直接拋出NullPointerException,整個程序都會被終止。

          大家可以測試一下下面的語句在兩種環境下的運行結果:
          1 String s = null;
          2 System.out.println(s);
          posted @ 2012-02-13 14:49 amp@java 閱讀(1381) | 評論 (1)編輯 收藏

          這是mars課程里面關于handler和線程的一個例子:
          package mars.handler;

          import android.app.Activity;
          import android.os.Bundle;
          import android.os.Handler;

          public class HandlerTest extends Activity {
              Handler handler 
          = new Handler();
              
          /** Called when the activity is first created. */
              @Override
              
          public void onCreate(Bundle savedInstanceState) {
                  
          super.onCreate(savedInstanceState);
                  System.out.println(
          "1");
                  handler.post(r);
                  System.out.println(
          "2");
                  setContentView(R.layout.main);
                  System.out.println(
          "activity---->"+Thread.currentThread().getId());
                  System.out.println(
          "activity name--->"+Thread.currentThread().getName());
              }
              
              Runnable r 
          = new Runnable() {
                  
                  @Override
                  
          public void run() {
                      
          // TODO Auto-generated method stub
                      System.out.println("handler---->"+Thread.currentThread().getId());
                      System.out.println(
          "handlername---->"+Thread.currentThread().getName());
                      
          try {
                          Thread.sleep(
          10000);
                      } 
          catch (InterruptedException e) {
                          
          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }
                      System.out.println(
          "3");
                  }
              };
          }

          根據mars的解釋,handler所在的線程跟Activity的線程是同一個線程,所以在
          handler.post(r);
          語句后,執行的是Runnable里面的run函數,這個函數沒有在新開的線程中執行,只是簡單地調用了run函數,所以這個app在模擬器運行時要過10秒才會顯示界面,因為run函數里面睡眠了10秒,等它返回后才執行setContentView函數設置界面元素。
          根據實際運行結果,的確是過了10秒才能顯示界面。

          但是奇怪的是System.out語句似乎沒有受到影響,下面是日志:
          log
          02-09 11:12:43.553: INFO/System.out(591): 1
          02-09 11:12:43.553: INFO/System.out(591): 2
          02-09 11:12:43.674: INFO/System.out(591): activity---->1
          02-09 11:12:43.674: INFO/System.out(591): activity name--->main
          02-09 11:12:43.713: INFO/System.out(591): handler---->1
          02-09 11:12:43.713: INFO/System.out(591): handlername---->main
          02-09 11:12:53.775: INFO/System.out(591): 3

          從日志可以看出,除了run函數里面睡眠后才執行的打印函數推遲了10秒才執行之外,其他都是沒有受到任何延時,順序執行的,在
          handler.post(r);
          語句前后的打印函數都被按順序執行了,唯獨
          setContentView(R.layout.main);
          需要在run函數返回后才執行,這是什么道理?難道打印函數的優先級更高,不會堵塞?如果是這樣的話為什么在run函數里面還是要等睡眠結束才執行呢?
          posted @ 2012-02-09 19:25 amp@java 閱讀(1839) | 評論 (6)編輯 收藏

          很想搞點Android的小程序玩玩,但是卻萬事開頭難,不知道從哪里開始,看了官方的文檔,結果一天都看不了幾段,還是英文的,比較痛苦。找了些電子書,也是看過目錄就不知道放哪里了。這種編程的入門沒有強大的決心真的很難靜下心來學習。
          前幾天又心血來潮,搜索了一下android開發的網站,發現了一些視頻,看起來還挺有意思,連續看了幾個,慢慢地也摸著一點門路了,以前沒有試過用這種方法學習,都是看書,現在發現看視頻似乎更高效,起碼眼睛沒那么累,有人在念,很多時候只要用耳朵聽就行了,而且所有軟件的界面、步驟都很清楚,這些東西通過書是沒法表現出來的。
          現在學會了讓一個Activity顯示出來,放上點控件,處理一下點擊,頁面布局等,算是入門了,但很多東西還要繼續看,那些視頻還有好多。
          入門系列視頻地址:
          http://www.marsdroid.org/
          還有一個深入淺出系列:
          http://www.eoeandroid.com/thread-109361-1-1.html
          由于沒有入門,所以還在看第一個系列,第二個系列只看了兩個。
          到現在發現android界面的構建很像web界面,android是通過layout來排布控件,而web是通過css,android可以通過java來操縱控件,而web則是通過javascript操縱控件,回調函數則跟JavaSE一樣。



          不過有時候很容易忘記了一個步驟導致程序運行出錯,一般來說,要讓一個Activity成功運行,需要做以下步驟:
          1、有一個繼承與Activity的類
          2、有一個layout文件,里面是各種控件的布局,在Activity里面應該用setContentView加載這個layout
          3、有一個strings文件,里面是界面的各種字符串,用于國際化
          4、在AndroidManifest里面加入這個Activity
          第4步很容易忘記。
          posted @ 2012-02-08 14:55 amp@java 閱讀(262) | 評論 (0)編輯 收藏

          前段時間聽了一家公司介紹分布式存儲產品,號稱性能超過傳統的磁盤陣列+小型機,但價格卻比這種組合低,而且具有維護簡單、數據安全等優點,其核心就是把一些PC服務器通過網絡連接起來,把數據分散存儲在這些服務器上,查找的時候把任務分配到這些服務器上,讓它們分別完成各自的小任務,最后再匯合出結果,核心就是:每個節點都是一個數據存儲單元和運算單元的結合,這些節點性能要求不高,可以是各種各樣的配置,只要在上面運行集群要求的軟件即可,一臺掛了不要緊,換上去一臺就能自動恢復,增加一臺就能提高性能,減少一臺也不會有很大影響,只是性能稍微下降,每份數據都有多個備份,能夠平衡分布在各服務器上。這種架構的缺點是,只要用上了這套東西,所有的軟件就必須從這家公司購買,因為整個集群的控制和訪問接口都是他們提供的。
          該公司也坦言這其實就是google的服務器應用技術,實際上就是google提出來的云計算。

          今天看了一些文章介紹,發現上面介紹的東西實際上已經通過Apache的一個項目Hadoop實現,不知道那家公司是不是就是簡單包裝了一下這個項目。

          Hadoop包含兩個主要的模塊,分別是HDFS分布式文件系統和MapReduce集群計算機制。剛剛發布了1.0.0版本。

          主頁: http://hadoop.apache.org/

          blogjava有位高手已經翻譯了HDFS的架構說明:http://www.aygfsteel.com/killme2008/archive/2008/06/05/206043.html,但對應的是上一個版本0.20的,里面說到了很多沒有實現的東西,不知道是否已經在1.0版本實現,目前官方網站上該文章的版本還是0.20的。

          這里有三篇文章介紹Hadoop在單機環境、多機環境下的安裝和配置,還有應用程序的開發:http://www.ibm.com/developerworks/cn/linux/l-hadoop-1/index.html

          看起來還是挺有意思的,以前就曾經有過想法,把單位淘汰下來的那一大堆臺式電腦組成一個存儲或者計算的小集群,也許能夠代替一兩臺PC服務器,現在看來可以試試,以后的趨勢就是云計算了,先自己搞點小云看看效果如何。
          posted @ 2012-01-19 14:47 amp@java 閱讀(225) | 評論 (0)編輯 收藏

          這個不僅僅是IE6的錯,而是所有IE的錯!!
          IE有一個特別隨意的功能,就是能夠通過Element的name來操作一個Element,有些人覺得這個功能很方便,實際它不僅不符合標準,還會導致IE自己變得莫名其妙。
          假如你的Form有一個提交按鈕的name="submit",那么,很遺憾,你這個form無論如何都不能通過Javascript來提交,只要你一調用了這個form的submit()方法,IE就會告訴你它不支持這個方法!這不是搞笑嗎?哪個瀏覽器會不支持form的submit()方法?雖然IE不標準,也不至于這樣吧?對不起,就是這樣。

          因為當你調用form的方法submit(),它首先想到的是你的提交按鈕!
          theForm.submit()
          這個語句在IE看來并不是調用theForm的submit方法,而是調用了名字為submit的提交按鈕!如果你在某個元素對象后面加個括號,會有什么效果?當然就是出錯。在IE的獨特視角下,上面這個語句與下面這個語句的效果一樣:
          (theForm.submit)();
          前一個括號代表了名稱為submit的按鈕對象,后面那個括號就無法理解了,所以IE告訴你不支持這個方法。

          IE整個家族都是如此的丑陋!

          posted @ 2010-12-09 15:02 amp@java 閱讀(295) | 評論 (0)編輯 收藏

          一直都看到很多人說,IE6是Web開發人員的惡夢,以前我單位的內部網絡,所有電腦裝的都是IE6,我只針對IE6開發,似乎沒什么感覺,反正在我的電腦上看到什么樣的,其他電腦上看到也是一樣的。
          后來因為某公司給我們做的一個系統運行速度實在太慢,我把自己的電腦更新到IE8,發現速度快了很多,但是有些東西不兼容,我對那些不兼容的功能使用得比較少,就不管了。
          終于,我自己又要開發一個小項目,用了一個網上下載的CSS模板,發現里面很多針對IE的注釋,從IE 5到IE 8都有,反正我電腦上看著效果不錯,于是就用了。
          辛苦了好幾天,我那項目基本完工了,想在IE6上看看效果,Shit,本來顯示在頁面右方主要區域的表格掉在了左邊導航欄的下面,表格里面一些DIV的下劃線莫名其妙地不見了,這些東西在我的電腦上顯示得好好的,也沒用到什么特別的東西,怎么差別會這么大呢?
          一個個問題排查:
          表格問題,在IE6上表現得有些詭異,顯示完之后表格是在下面的,但是鼠標晃過導航欄里面的鏈接,表格又會自動跳到右方區域,真見鬼。改了一下布局的padding,一個表格好了。另外一個卻還是掉下去,仔細研究了一下,把表格的寬度減少10px,好了。
          下劃線問題,我用的是:
          border-bottom:1px solid grey
          結果IE6不會顯示出這條下劃線。搜索一下才知道這是IE6的bug,它理解不了這么長的句子!必須寫成這樣:
          border-bottom-width:1px;
          border-bottom-style:solid;
          border-bottom-color:grey;
          還有比這更傻逼的嗎?有!
          它顯示出的線是黑色的,不是grey的!而且根據DIV里面內容的顏色不同,它還會變色!如果里面是紅色的字,那么它下面的線也是紅色,如果是綠色的字,下面的線也是綠色,如果沒有指定顏色,它就是黑色,非常智能,但就是不顯示你要的顏色!
          后來知道原來它根本不知道grey的意思,必須指定顏色代碼才能解決。


          這就是IE6,沒想到微軟這么大一個公司還出了這么一個垃圾,而且出了那么多年,至今還占據中國瀏覽器市場的半壁江山!



          posted @ 2010-12-08 20:51 amp@java 閱讀(548) | 評論 (4)編輯 收藏

          有一臺WIN2003的服務器,在單位的局域網內,與互聯網是物理隔離的,最近上面運行的一個WEB服務器經常出錯,查看日志發現是因為數據庫不能連接,因為系統的所有端口都已經被占用完。使用netstat -abn查看發現svchost.exe開啟了大量狀態為SYN_SENT的連接,目標端口都是445,但是連接的IP各種各樣的都有,由于機器不能建立Internet連接,所以狀態都是SYN_SENT,重啟一下這些連接都沒有了,但是過一會又會迅速建立起來,很快就把系統的所有端口都占用了。
          根據端口找出哪個服務真不容易,通過netstat -abn只能查到是svchost.exe,最多還能得到一個PID,確定是哪個svchost.exe,然后通過tasklist /svc可以查到那個svchost對應了哪些服務,但是一看,很多服務都是使用那個svchost,包括Server,Workstation等等,根本不知道是哪個產生的連接。
          找了半天發現有人和我一樣:http://www.petri.co.il/forums/showthread.php?t=36427,討論了半天最后也找到了解決方法:http://www.symantec.com/security_response/writeup.jsp?docid=2009-011316-0247-99,原來是W32.Downadup這個病毒惹的禍,下載了專殺工具回來查了一下,果然找到了兩個被感染的文件,一個是jpg文件,在IE的緩存里,一個是dll文件,在system32里。
          根據dll文件名在注冊表里查到了它注冊的服務,原來又是之前處理過的那種,服務名隨機、服務描述為空、啟動類型為自動、狀態為未啟動、dll名隨機,但是我記得這臺服務器已經打過補丁,也沒有出現svchost錯誤,所以就忽略了服務的檢查,沒想到這種東西還有不同的癥狀。
          這個病毒利用的是KB958644的漏洞,到微軟下載了補丁回來,一看才發現原來那臺服務器以前已經裝過這個補丁。補丁的作用也許就是只能防止再出問題,但不能解決已有的問題,所以那臺服務器雖然裝了補丁,但是可能已經被感染了,于是就沒治好。

          posted @ 2010-06-30 11:33 amp@java 閱讀(11981) | 評論 (1)編輯 收藏

          把APE、FLAC等無損壓縮音頻文件刻錄成CD的軟件有很多,搜索一把,出現頻率最多的是用NERO+插件,但是現在的NERO體積實在龐大,我嘗試下載一個NERO 10,大小不過200多M,結果安裝的時候解壓到臨時文件夾,我的C盤1G多的空間都不夠它解壓,根本就安裝不了,為了這么一點事情用這么大一個軟件實在沒必要,仔細搜索一下,刻錄的軟件其實有很多,都能自動地把APE刻錄到CD上,方法遠比NERO簡單。
          第一個軟件是Burrrn
          Burrrn是個專門干這事的軟件,它支持的文件包括ape、flac、mp3、ogg等,實際上也是通過插件來完成編碼解碼工作的,不過這些插件都是內置在程序包里,不用再逐個下載。它的界面非常簡單,使用也非常簡單,基本一打開就會使用。
          第二個軟件是ImgBurn
          這個軟件比較強大,不但能夠刻錄APE,還可以把光盤提取成鏡像、把文件或文件夾生成鏡像、把文件或文件夾刻錄到光盤上、把鏡像刻錄到光盤上,基本上NERO常用的功能都有了,軟件只有幾MB,十分環保。我下載這個軟件的時候只是想使用它的生成鏡像功能,因為下載下來一些藍光原盤需要制作成ISO文件才能用POWERDVD播放。后來發現有人說這個軟件還可以刻錄APE,不過也需要使用相關的解碼器,只是這些解碼器在安裝常用的播放器的時候一般都已經安裝過了,例如我以前裝過終極解碼,其中包含APE解碼器,就不需要另外安裝了。
          使用的時候只需要選擇刻錄鏡像到光盤功能,選中與APE相關的cue文件,然后就可以分軌刻錄了。

          這兩個軟件的體積都很小,而且都是免費軟件,不但環保還合法。

          第一次使用Burrrn刻錄APE的時候,用KMPlayer播放,發現直接播放APE的效果跟播放刻錄出來的CD效果不一樣,CD的效果動態范圍明顯不如直接播放APE,我以為是刻錄軟件的問題,后來使用ImgBurn刻錄,也是一樣的效果。仔細對比之后發現KMP播放的時候是使用不同的濾鏡,可能是這個原因導致效果不同,但是播放APE和播放CD又不可能使用相同的濾鏡,所以到底是什么原因也很難說得清楚,不過CD機上不認APE,也只能這樣了。


          posted @ 2010-06-22 15:30 amp@java 閱讀(587) | 評論 (0)編輯 收藏

          1、服務命名。Oracle的服務命名就跟計算機的名稱一樣。一般來說,在局域網里面,計算機名稱是與IP一一對應的,通信的時候需要使用IP,所以就有了DNS,把計算機名翻譯成IP。同樣的道理,在Oracle體系里,服務命名對應計算機名,服務名(SID)+IP+端口+協議(TCP/IP)就對應了計算機的IP,Oracle體系里的DNS其實就是一個配置文件,把服務命名翻譯成可以用于通信的服務名(SID)+IP+端口+協議(TCP/IP)。有趣的是,與計算機里的ping命令一樣,Oracle里面也有個TNSPing命令,通過“TNSPing 服務命名”,就會得到像ping命令相似的結果,驗證該命名對應的數據庫是否有效。

          2、主機身份驗證。Oracle的一些維護工作往往需要輸入主機身份驗證信息,但是默認情況下,即使輸入了正確的用戶名和密碼,系統也會提示“用戶口令錯誤”,讓人十分困惑。其實真實的原因是,你輸入的用戶必須在“作為批處理作業登錄”里面,否則就會出現上述錯誤。操作方法如下:運行-gpedit.msc-計算機配置-Windows設置-安全設置-本地策略-用戶權利指派-作為批處理作業登錄-添加用戶或組...-加入要登錄的用戶。
          執行數據庫遷移操作的時候,可能需要在源數據庫主機和目標數據庫主機都進行上述操作才能成功。

          更多問題待續
          posted @ 2009-11-12 10:23 amp@java 閱讀(283) | 評論 (0)編輯 收藏

          9月10號,CHDBits開放了注冊權限,趕緊注冊了一個帳戶,這是我第一次登錄PT站。每個文件都有幾個甚至幾十個種子在等待下載者,真是“僧多粥少”。下載速度果然很猛,下了幾個文件,基本上可以達到ADSL的上限,甚至遇到了前所未有的極速,不過持續時間較短,但是平均速度都接近上限。
          然而,ADSL小水管終究不是玩PT的料,嚴格的分享率要求和ADSL龜速的上傳帶寬使得我兩天之后就變成了冰人,如果20天之內再不提高分享率,我的帳戶將會被封禁。仔細考慮了一下,我還是“過把癮就死”算了,因為以我這8:1的上傳和下載帶寬,要長期達到要求基本上是不可能的事情,如果要我的分享率達到1:1,那我4M的下載帶寬就等于縮水成和上傳帶寬一樣,只有512K了,我裝這4M的寬帶還有什么意義?
          其實在PT站外下載,速度也是不錯的,無論是emule還是BT都能達到上限的80%以上,當然,是在種子剛剛放出的一段時間,只要熱度一過,速度馬上下降,這是與PT沒法比的。
          還是等到哪一天光纖到戶再玩PT吧,現在的任務就是趁著20天沒過,趕緊“過癮”,嘿嘿!
          posted @ 2009-09-14 19:44 amp@java 閱讀(298) | 評論 (2)編輯 收藏

          僅列出標題
          共10頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 阳江市| 嘉祥县| 襄城县| 通河县| 长寿区| 台前县| 定襄县| 贡觉县| 石家庄市| 临泉县| 利川市| 庆城县| 城固县| 宁蒗| 文安县| 印江| 金平| 谢通门县| 陇南市| 广水市| 灵川县| 横峰县| 金华市| 密云县| 隆昌县| 临海市| 汉中市| 兴安盟| 工布江达县| 砚山县| 牟定县| 南和县| 绥宁县| 萨迦县| 丰台区| 盖州市| 象山县| 泌阳县| 兴业县| 高州市| 湘潭县|