<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ZT文萃

    本博不原創,轉帖自己感興趣那些事人物,什么入眼貼什么,隨心所欲。
    posts - 93, comments - 5, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    2014年11月5日

    移動互聯網,就是將移動通信和互聯網二者結合起來,成為一體。
    4G時代的開啟以及移動終端設備的凸顯必將為移動互聯網的發展注入巨大的能量,2014年移動互聯網產業必將帶來前所未有的飛躍。

    度娘百科詳解:http://baike.baidu.com/view/1168245.htm

     


    云計算(英語:Cloud Computing),是一種基于互聯網的計算方式,通過這種方式,共享的軟硬件資源和信息可以按需求提供給計算機和其他設備。

    云 計算是繼1980年代大型計算機到客戶端-服務器的大轉變之后的又一種巨變。用戶不再需要了解“云”中基礎設施的細節,不必具有相應的專業知識,也無需直 接進行控制。[1]云計算描述了一種基于互聯網的新的IT服務增加、使用和交付模式,通常涉及通過互聯網來提供動態易擴展而且經常是虛擬化的資源。

    度娘百科詳解:http://baike.baidu.com/view/1316082.htm?fr=aladdin
     


    大 數據(英語:Big data),或稱巨量數據、海量數據、大數據,指的是所涉及的數據量規模巨大到無法通過人工,在合理時間內達到截取、管理、處理、并整理成為人類所能解讀 的信息。在總數據量相同的情況下,與個別分析獨立的小型數據集(data set)相比,將各個小型數據集合并后進行分析可得出許多額外的信息和數據關系性,可用來察覺商業趨勢、判定研究質量、避免疾病擴散、打擊犯罪或測定實時 交通路況等;這樣的用途正是大型數據集盛行的原因。

    度娘百科詳解:http://baike.baidu.com/subview/6954399/13647476.htm?fr=aladdin

     


    O2O(Online To Offline)模式,又稱離線商務模式,是指線上營銷線上購買帶動線下經營和線下消費。O2O通過促銷、打折、提供信息、服務預訂等方式,把線下商店的 消息推送給互聯網用戶,從而將他們轉換為自己的線下客戶,這就特別適合必須到店消費的商品和服務,比如餐飲、健身、電影和演出、美容美發、攝影及百貨商店 等。

    度娘百科詳解:http://baike.baidu.com/subview/4717113/13607799.htm?fr=aladdin

    一些O2O案列:Groupon、OpenTable、易到用車

    posted @ 2014-11-05 23:07 ZT文萃 閱讀(1362) | 評論 (0)編輯 收藏

    2014年6月16日

    亂講,誰說我們2002年倒數第一的啊

    不還有沙特了么

    再說了,中國隊多牛B洋人不知道嗎

    在長達84年十九屆世界杯的歷史上
    僅有三支國家隊戰勝過中國國家隊
    分別是巴西、土耳其、哥斯達黎加

    即使是巴西這樣的世界強隊也僅戰勝過中國隊一次。

    而中國隊從未在世界杯點球大戰中失利過,
    從來沒有一支球隊能夠在世界杯上擊敗過中國隊兩次。

    從數據分析中可以看的出,世界杯史上共產生八支冠軍球隊,
    也只有巴西隊曾經戰勝過中國隊。
    歐洲諸強德西荷法英意葡等從來沒有世界杯上戰勝過中國。

    而且,中國隊在世界杯上丟球數遠少于足球之國巴西和以防守見長的意大利,
    在過去84年里,中國隊只丟了9個球。

    除此之外,世界上除了巴西,中國是另外一支敢在胸前繡五顆星的隊。

    posted @ 2014-06-16 21:36 ZT文萃 閱讀(238) | 評論 (0)編輯 收藏

    2014年6月13日

    釋迦牟尼在《佛譬喻經》中,講了一段有名的譬喻,這譬喻是這樣的:
          在一個寂寞的秋天黃昏,無盡廣闊的荒野中,有一位旅人趕著路。突然,旅人發現薄暗的野道中,散落著一塊塊白白的東西,仔細一看,原來是人的白骨。
          旅人正疑惑思考時,忽然從前方傳來驚人的咆哮聲,隨著一只大老虎緊逼而來。看到這只老虎,旅人頓時了解白骨的原因,立刻向來時的道路拔腿逃跑。
          但顯然是迷失了道路,旅人竟跑到一座斷崖絕壁的頂上。在毫無辦法之中,幸好發現斷崖上有一顆松樹,并且從樹枝上垂下一條藤蔓。旅人便毫不猶豫,馬上抓著藤蔓垂下去,可謂九死一生。
          老虎眼看好不容易即將入口的食物,居然被逃離,可以想象它是如何懊惱地在崖上狂吼著。
          好感謝啊!幸虧有這藤蔓,終于救了寶貴一命。旅人暫時安心了。但是當他朝腳下一看時,不禁啊了一聲,原來腳下竟是波濤洶涌、底不可測的深海,怒浪澎湃著,而且在那波濤間還有三條毒龍,正張開大口等待著他的墜落。旅人不知不覺全身戰栗起來。
          但更恐怖的是,依靠救生的藤蔓,在其根接處出現了兩只白色和黑色的老鼠,正在交互地啃著藤蔓。旅人拼命搖動藤蔓,想趕走老鼠,可是老鼠一點也沒有逃開的樣 子。而且每次搖動藤蔓,便有水滴從上面落下來,這是樹枝上蜂巢所滴下的蜂蜜。由于蜂蜜太甜了,旅人竟完全忘記自己正處于危險萬分的境地,此心陶陶然地被蜂 蜜所奪。
          這愚癡的旅人之相,便是所有人類的人生之真相。那么釋迦穆尼這段譬喻意味著什么呢?

    1、孤獨的心靈
    旅人:這旅人是指我們自己。
    荒野:無盡而寂寞的荒野是譬喻我們無盡寂寞的人生。
    秋天的黃昏:秋天的黃昏是譬喻人生的孤寂感。
    白骨:路邊的白骨是指我們人生旅途中,家族、親屬、朋友等的死亡。我們活到現在,應該看到很多白骨,那時我們有何想法?有何感觸?我們可曾注意到緊逼而來的“無常之虎”?
    老虎:饑餓的老虎所譬喻的,既是我們自己的死亡。

    2、無力的松樹
    松樹:接著我們攀上崖頂的松樹,松樹是指金錢、財產、名譽、地位等等。這些東西即使擁有再多,在死亡的面前也仍是無力的。

    3、人生是夢
    藤蔓:藤蔓所譬喻的是“還不會!還不會!我還不會死”的那種以為還有二十年、三十年的壽命可依恃,但即使認為還有十年、還有二十年可活著,但你認為到底人 壽幾何?想想便知:已過去的十年二十年,也不過是《啊》的一聲之間,便如夢如幻般地消逝了。而今后的十年二十年,也同樣是《啊》的一聲之間便會過去。
    老鼠:咬著藤蔓的白老鼠和黑老鼠是指白天和晚上。白天的白老鼠和晚上的黑老鼠,在相互地縮短著我們的壽命。

    4,后生大事
    深海:深海所譬喻的便是地獄。墜入此地獄,必須承受八萬劫中大苦惱,這一件事情便稱為——后生一大事。
    毒龍:顯現地獄之苦的是這三條毒龍,這三條毒龍指我們自己內心的貪欲、嗔怒、愚癡。
          “善因善果、惡因惡果、自因自果”的因果法則是不會有絲毫差錯的。由自己所不斷造作的罪惡所生出的地獄,最后還是由自己墜入。

    posted @ 2014-06-13 15:44 ZT文萃 閱讀(206) | 評論 (0)編輯 收藏

    2014年6月10日

    其實都是些很簡單的東西
    如果有CLER認為這些東西發出來沒必要那  朕只能說抱歉

    如果看了帖子 對進有那么一點幫助 請cler 回帖支持下 讓更多的 朋友可以了解下,很多問題,可以從開機看出問題
    謝謝

    為 使用電腦時間比較長的老用戶,難免會到朋友或同事家幫忙維護、維修電腦,有時還要幫人購買PC,這時我們肯定會帶上硬件檢測軟件,不過,誰也不能隨身總是 帶著這些軟件,如果手頭上沒有合適的檢測軟件該怎么辦呢?總不能因此就什么都不知道吧?那樣你的高手形象大大會受損的,其實,離開這些軟件我們也能明明白 白查看電腦硬件的配置情況。下面我們就來一起學習一下吧。  

      一、開機自檢中查看硬件配置  

      機器組裝結束后即使不裝操作系統也可以進行加電測試,在開機自檢的畫面中就隱藏著硬件配置的簡單介紹喲(由于開機畫面一閃而過,要想看清楚的話,記得及時伸手按住“PAUSE”鍵)。

      1.顯卡信息  

       開機自檢時首先檢查的硬件就是顯卡,因此啟動機器以后在屏幕左上角出現的幾行文字就是有顯卡的“個人資料”介紹。四行文字中,第一行“GeForce4 MX440……”標明了顯卡的顯示核心為GeForce4 MX440、支持AGP 8X技術;第二行“Version……”標明了顯卡BIOS的版本,我們可以通過更新顯卡BIOS版本“榨取”顯卡性能,當然更新后這一行文字也會隨之發 生變化;第三行“Copyright (C)……”則為廠商的版權信息,標示了顯示芯片制造廠商及廠商版權年限;第四行“64.0MB RAM”則標明了顯卡顯存容量。  

      2.CPU及硬盤、內存、光驅信息  

      顯示完顯卡的基本信息之后,緊接著出 現的第二個自檢畫面則顯示了更多的硬件信息,像CPU型號、頻率、內存容量、硬盤及光驅信息等都會出現在此畫面中。該畫面最上面兩行文字標示了主板 BIOS版本及BIOS制造商的版權信息;緊接著的文字一看就明白啦,當然是主板芯片組嘍;其下幾行文字則標明了CPU的頻率及內存容量、速度。下面四行 “IDE……”則標明了連接在IDE主從接口上的設備,包括硬盤型號及光驅型號等等。
      
      3.主板信息 

      在第二 個自檢畫面的最下方還會出現一行關于主板的信息,前面的日期顯示的是當前主板的BIOS更新日期,后面的符號則是該主板所采用的代碼,根據代碼我們可以了 解主板的芯片組型號和生產廠商。以往老主板的自檢畫面中最下方文字的中間標明的是主板芯片組,這一塊板子則將其提到了自檢畫面的上方。  

      機器啟動之后按“DEL”鍵進入BIOS設置頁面,在基本信息中同樣也可以看到機器的硬件信息,與開機畫面顯示的沒有區別。

      二、利用設備管理器查看硬件配置  

       進入操作系統之后,在安裝硬件驅動程序的情況下還可以利用設備管理器與DirectX診斷工具來查看硬件配置。下面看看如何利用設備管理器查看硬件信 息。進入桌面,鼠標右擊“我的電腦”圖標,在出現的菜單中選擇“屬性”,打開“系統屬性”窗口,點擊“硬件--設備管理器”,在“設備管理器”中顯示了機 器配置的所有硬件設備。從上往下依次排列著光驅、磁盤控制器芯片、CPU、磁盤驅動器、顯示器、鍵盤、聲音及視頻等信息,最下方則為顯示卡。想要了解哪一 種硬件的信息,只要點擊其前方的“+”將其下方的內容展開即可。  
      利用設備管理器除了可以看到常規硬件信息之外,還可以進一步了解主板芯片、聲卡及硬盤工作模式等情況。例如想要查看硬盤的工作模式,只要雙擊相應的IDE通道即可彈出屬性窗口,在屬性窗口中可輕檢看到硬盤的設備類型及傳送模式。這些都是開機畫面所不能提供的。  

      需要注意的是在Windows Xp之前的操作系統中所提供的設備管理器是無法用來查看CPU工作頻率的,好在我們還有DirectX診斷工具。  

       三、利用DirectX診斷工具查看硬件配置  

       DirectX診斷工具可以幫助我們對硬件工作情況作出測試、診斷并進行修改,當然我們也可以利用它來查看機器的硬件配置。運行“系統信息”窗口,找到 “工具--DirectX診斷工具”(或者進入安裝盤符中Windows目錄下的System32目錄中運行Dxdiag.exe),在窗口中可以方便地 查看硬件信息。

      1.查看基本信息  

      在“DirectX診斷工具”窗口中點擊“系統”選項卡,當前日期、計算機 名稱、操作系統、系統制造商及BIOS版本、CPU處理器頻率及及內存容量一目了然。注意嘍,雖然我將Celeron 2.0MHz超頻至2.40MHz使用,但是DirectX卻不認這個帳,依然顯示的是未超頻的原始頻率。看來沒有AIDA32,我們同樣也可以識別奸商 是否將超頻的CPU賣給我們!!  

      2.查看顯卡信息  

      在“DirectX診斷工具”窗口中點擊“顯示”選項卡,在這里我們可以看到顯卡的制造商、顯示芯片類型、顯存容量、顯卡驅動版本、監視器等常規信息。  

      3.查看音頻信息  

      音頻設備往往為人所忽視,但缺了它又不行,單擊“聲音”選項卡,對其做一番了解吧!同樣在出現的窗口中能看到設備的名稱、制造商及其驅動程序等等極為詳細的資料。不同的是我們還可以點擊右下角的“測試DirectSound(T)”對聲卡進行一下簡單的測試。  
    怎么樣,經過這一番了解,是不是感覺很受益?

    題外話,由于主板更新頻繁,現在很多主板BIOS有快速啟動功能,以上很多信息都被瞬間屏蔽掉了。需要看自檢的信息,需要到BIOS設置。但是以上講的信息,能讓你明白,計算機如何自檢。

    posted @ 2014-06-10 22:57 ZT文萃 閱讀(224) | 評論 (0)編輯 收藏

    2014年5月7日

    http://kb.cnblogs.com/page/192251/

    這些日子我一直在寫一個實時操作系統內核,已有小成了,等寫完我會全部公開,希望能夠為國內IT的發展盡自己一份微薄的力量。最近看到很多學生朋友和我當年一樣沒有方向 ,所以把我的經歷寫出來與大家共勉,希望能給剛如行的朋友們一點點幫助。

      一轉眼我在IT行業學習工作已經七年多了,這期間我做過網頁,寫過MIS、數據庫,應用程序,做過通信軟件、硬件驅動、協議棧,到現在做操作系統內核和IC相關開發,這中間走了很多彎路,也吃了不少苦。

      我上的是一個三流的高校,就連同一個城市的人多數都不知道。因為學校不好也就沒有指望能靠學校名氣找一個好工作。所有的希望都寄托在自己的努力 上了,大一開學前的假期我就開始了學習。記得我買的第一本書是《計算機基礎DOS3.0》,大家別嚇著了,其實當時已經普及了DOS6.22了,只是我在 書店里看到了DOS4.0/5.0/6.0的書,以為像英語那樣是第四、五、六冊,記得當時到處找DOS1.0,現在想想也幸好我沒有找到:)。開學前我 學完了PASCAL,那時既沒有計算機也沒有人可以請教,我連程序是什么的概念都沒有,只好死記硬背代碼,然后拿紙寫。我一直到大三才有了一臺486,在 這之前用紙寫了多少程序我也記不清楚了,只知道最長的一個我拿A4大小的草稿紙寫了30多頁,我的C語言、C++ 、VC都是在這樣的條件下入門的。

      所以說條件是可以克服的,希望我的經歷多少給條件艱苦的同學們一點信心。第一次上機是在我姐夫的機房,我的心情激動的無與倫比,但是一上機我立 刻傻了眼,他們用的是英文版的Win3.1,我的那點DOS知識都見了鬼,上機提心吊膽的一陣瞎摸,一不小心把Word弄成了全屏,怎么都還不了原,當時 真是心急如焚,我以機器被我弄壞了。第一個C語言程序,就是那個經典的HelloWorld,我調了幾個星期,上機機會非常少,也沒有書告訴我開發環境 (TC2.0)需要設置,而且開始我都不知道有編譯器,我甚至自作聰明把寫好的程序擴展名從.c改成.exe,結果可想而知。

      大一學完了C、X86的匯編、數據結構、C++ 。由于精力都花在自學上了,大一下四門課掛了彩,三類學校就是這點好,掛上一二十門也照樣畢業。不過扯遠點說,我那么刻苦都及不了格,可見我們國家的計算機教育有多死板。

      大二準備學VC和BC,當時難以取舍,后來選了VC,不為別的,只為書店里兩本書,VC那本便宜6塊錢。我的努力在班上無人能及,學的日夜不 分,大三有了計算機后更是如此,很多次父親半夜教訓我說我不要命了,我一直覺得自己基礎差,記憶又不行,條件也不好 ,所以覺得只有多花點時間才能趕上別人。居然后來有許多朋友說我有學計算機的天賦,讓我哭笑不得。我用的是486,16M內存,1G硬盤,當時同學們的配 置都是P166MMX,我安裝一個Windows NT4.0需要一個通宵,編譯一個BC5.0向導生成的程序需要近兩個小時,我的顯示器是個二手的,輻射非常大,開機屏幕冒火花,看起來很酷的:)。有一 次程序寫的太久,覺得怎么白色的編輯器背景變成了紫色,以為顯示器壞了,后來才發現眼睛不行了,不過說來也奇怪,到今天我的視力還能保持1.5,真是個奇 跡。但是就是那臺破機器陪伴我兩年,讓我學會了VC、Delphi、SQL Server等。后來那臺機器給我阿姨打字用,據她說一天她正打的開心,一股青煙夾著火苗從顯示器鉆出來,之后它才壽終正寢。

      大三假期找了個機會在一個計算機研究所實習,與其說實習不如說是做義工,工作了兩個月一分錢沒有拿。但是這兩個月對我的發展幫助很大,讓我早一 步了解了社會,剛去的時候我當然是一竅不通,在那里我熟悉了網絡,學會了Delphi和Oracle。由于工作很認真,得到了比較好的評價,在一位長者的 引薦下,我開始和他們一起做項目,這使我在大三大四就有了自己的收入,大四又找了兩家MIS公司兼職,雖然錢不多,但是在學生期間有1000多的收入我已 經非常滿足了,我終于用自己賺的錢把計算機換了。

      大四下開始找工作,這時我的工作經驗已經比較多(當然現在想想非常幼稚),開始聽父母的想去那個研究所,實習過那個部門也希望我能去,但是不知 道為什么最后不了了之,這種單位就是比較官僚,我一氣之下就到了我兼職的一個公司做MIS的Team Leader。在大三到畢業一年的時間,做過了各種MIS,從煤氣、煙廠、公安、鐵路、飲食到高校,什么有錢做什么,工作也很辛苦,經常加班和熬通宵,從 跟客戶談需求到設計、編碼、測試、交付都要上。那時覺得很有成就感,覺得自己還不錯,現在想想真是很膚淺。

      剛走上工作崗位的學生很容易被誤導,各種開發工具讓人眼花繚亂,同時也覺得很受公司器重,但這樣工作永遠是一個低層次的開發者。不要跟我說什么 系統分析有多么多么重要,多么多么難。你以為自己跟用戶談需求做設計就是系統分析和設計了嗎,國內又有幾個公司能夠做的很到位很規范?我是ISO9000 內審員,也在Rational公司受過多次培訓,拿了4個證書,還有一個公司讓我去做CMM。這些我聽過很多,但是很多事情到內就變了性質,一個公司不是 通過了ISO9000或者CMM就能規范了,我現在在一家有幾十年歷史的外企工作,里面的管理不是一般國內企業能及的。作為一個畢業不久以前沒有步入過社 會的學生,幾乎不可能在很短的時間掌握系統分析和設計,面向對象、UML只是一個工具,關鍵是人本身的思想,不是說你熟悉了C++ 、Rose就能夠做出好的設計,相反如果你具備了很高的素質,你可以用C寫出比別人用C++更加模塊化的程序。

      話說遠一些,國內軟件開發行業有一個怪圈,很多人覺得VC > Delphi > VB,真是很搞笑。這幾個軟件我都做過開發,說白了他們都是工具,應該根據應用的需要選擇采用哪個,而不是覺得哪個上層次。如果你因為用某個開發工具很有 面子而選擇的話,只能說明你很淺薄。如果說層次,那么這些工具都不上層次,因為它們用來用去都是一些系統的API,微軟的朋友不會因為你記住他們多少個 API或者多少個類就會覺得你很了不起,你永遠只是他們的客戶,他們看重的是你口袋里的銀子。我也做過系統內核,我也封裝過很多API,同樣我也不會看重 那些使用這些API做二次開發的客戶,除非他能夠作出自己獨到的設計。

      至于有人認為C++ > C那更是讓人笑掉大牙,不妨你去打聽一下,現在有幾個操作系統內核是用C++寫的,又有幾個實時系統用的是C++,當然我也不是說C++不好,但是目前的 內核和實時系統中C++還無法與C匹敵,至于說C++適合做應用系統的開發那是另外一回事。所以我的觀點是不在于你用什么工具和語言,而在于你干什么工 作。你的設計體現了你的技術層次。

      這樣干了一年我覺得非常苦悶,做的大多數都是熟練工種的活,個人技術上沒有太多的提高也看不到方向。所以決定離開這個城市去上海,尋求更好的發展,并且打算放棄我以前的MIS轉到通信行業。

      寫到這里不能不提到我女朋友,我們是在來上海前半年認識的,她大四在我公司實習,公司派她給我寫文檔,我們的感情發展的很快。她告訴我很多事 情,她家原本是改革開放的第一批暴發戶,她母親愛打牌,輸掉了幾百萬,還欠了很多債,她有男朋友,但是她對他沒有感情,只因為他給了她母親兩萬多塊錢,后 來還強迫她寫了四萬塊的借條,她男朋友背叛過她并且不止一次打她,現在逼她結婚,不然就要她還錢。這人居然還是一個高校的老師!她母親把父親給她的學費花 了,因為拖欠學費她沒有辦法拿到畢業證。

      她母親現在有病需要錢,我拿出了自己的一點積蓄并且跟朋友們借了一些,替她交了學費并給她母親看病(后來才知道看病的錢又不知所終,就連她母親 是不是有病我都不知道,但她也是沒有辦法)。這個時候我家知道了一些事情,堅決反對我和她在一起,她原來的男朋友也極力破壞。無奈之下我們決定早一定離開 這個傷心的城市,并且瞞著我們家。由于時間倉促,我只準備了4000塊錢,她僅有的幾百塊錢也被她母親要去了,我買了三張票,一張是中午的,兩張是晚上 的,中午我的家人把我送上船,他們一離開我就下了船,我和她乘坐晚上的船離開了這個我和她生活了很多年的城市,帶走的只是一身債務。

      沒有來過上海的我們兩個性倔強,都不愿意去麻煩同學和朋友。來到上海是傍晚6點半,我們都不知道該去哪里,我們找了一個20塊錢的旅館,這個房 間連窗戶都沒有,7月份的天氣酷熱難耐,房間里非常悶熱。第二天我們開始租房子,因為身上的錢不多,我們基本都是步行,花了一個星期時間,不知道在浦東轉 了多少圈后找到了一個400塊的房子,但是我們都 不了解上海是付三壓一,還要付半個月的中介費,買了一些鍋碗瓢盆后,我們身上只有800塊錢了。工作都還沒有著落,這800塊錢要支持到我們拿到第一個月 工資,為了省錢我們自己做飯,每天買菜只花兩塊錢,她非常喜歡吃(也可能她在大學經常挨餓的原因),看到她現在這樣省吃儉用我真的很不忍心。

      她以前的男朋友也沒有放過她,經常打電話來騷擾,并且來上海看她,還說了不少恐嚇她的話,她過于善良,說他以前畢竟幫助過她,叫我不要與他一般 見識。以后的每天在家就是苦等面試通知,原本我想迅速找一家MIS公司解決眼前的困難,但是她堅持讓我不要放棄自己的理想,終于功夫不負有心人,我找到了 一家通信公司,4000塊的工資雖然趕不上MIS公司給我開出的價位,但也夠在上海生存。她也找到了工作,第一天上班她哭了,這是她來上海第一次流淚,我 心里很難受也很感動。

      由于是全新的行業,我把自己降到了零點,我學的VC、Delphi、數據庫派不上用場,擺在我面前的是嵌入式、協議、信令一些我從未接觸過的知 識。我知道我沒有退路,于是拼命的學習,我把自己當做一個應屆畢業生一樣,一分努力一分收獲,半年過去我終于熟悉了工作,并且得到了公司的表彰,薪水也加 了一級。后面的日子里我們省吃儉用,把欠朋友的1萬多塊錢還了,日子終于上了正軌。這時女朋友告訴我她想考研究生,我也很支持,于是她辭職在家備考。

      另外,在這里我要感謝我的Project Manager,他原來是一個大通信公司的產品經理,對人非常和善,我從他那里學到了很多知識,而且他也給了我許許多多無私的幫助。在工作上他給我充分的 空間和信任。記得公司安排我維護一個接入服務器軟件,由于代碼量不算太小(5萬行),資料和文檔都不齊全,我維護起來非常吃力,所以想重新把它做一遍,公 司領導不太支持,可能覺得工作量太大,但是他極力支持我,私下里他讓我放手去做,我的維護工作他擠時間做。在他的支持下,我花了半年時間完成了接入服務器 的軟件,并且實現了一個相對完整的TCP/IP協議棧。在這里我學會了嵌入式系統設計、驅動開發、TCP/IP和很多通信的知識,我花了一年時間終于使自 己從MIS開發轉到了通信行業,并且站穩了腳跟。我的開發大量是對硬件的直接操作,不再受微軟的操作系統,VC、Delhpi這些開發工具的約束,我終于 看到了另外一片天空。

      我做事情喜歡追根問底,隨著開發的深入,軟件開發與硬件聯系越來越緊密,硬件知識的匱乏又對我的發展產生了障礙,而且芯片技術基本上掌握在國外 公司的手里,這對做系統級設計是一個非常大的制約,一個新產品出來,第一道利潤(也往往是最豐厚的利潤)常常都被IC公司如Intel、Motorola 賺去了,國內的廠商只能喝點湯。所以我決心解決自己的硬件技術障礙,并打算離開通信行業,進入IC設計相關領域。

      當然我明白如果我對硬件了解的非常少,沒有哪家IC公司會仁慈到招我這樣一個一竅不通的人來培訓。所以我必須努力打好基礎,學一些相關知識為以 后做準備。就像我開始從MIS轉到通信一樣,我看過大量通信方面的書,并且給一個ISP做過RADIUS計費分揀臺,在這樣的背景下這家通信公司才給了我 這個機會。我在的通信公司是做系統設計的,有不少PCB  Layout硬件人員,平常我就注意向他們學習,由于我做的是軟件,在公司看硬件資料不好意思,所以開始只好在家看,剛來上海工作我連續一年都在加班, 后來不加了,因為我要擠出時間學習,通常我12點左右睡,第二天5點半起,我上班比較早,地鐵上如果人不多,我也用來看書。

      學習當然不會是一帆風順的,有些實在不懂的問題就積累起來問硬件人員,他們的幫助使我學習進度快了很多。因為在沒有人點撥的情況下自學,我的一 半時間是花在解決疑難問題上,但這種問題經常是別人的一句話就可以讓我豁然開朗,我非常慶幸我有這樣的學習環境。在后面的一年里,我學會了看硬件原理圖, 學會了簡單的硬件設計 (模擬電路方面還有不小的差距),事情就是這樣的,當你安安份份做軟件,別人永遠認為你是軟件開發人員,在你開始學習硬件時別人未必會認同,有位中興通訊 的朋友還對我說過,一個人不可能把所有東西都學完。

      我也明白這一點,但我希望自己做的更好。但當你熟悉硬件后大家又會覺得你好像原本就是軟硬件都懂的,同事們也都習以為常了。這個時候我可以把硬 件資料堂堂正正的拿到公司看,沒有人再大驚小怪了。讓我比較自豪的是我通過自己的努力做了一個IAD(軟交換的終端設備)系統方案,包含軟硬件的選型、設 計等內容,這個方案得到了公司和同事們的認同,讓我感到非常欣慰。

      技術是相輔相成的,當我的硬件有了一定的進步后,我的軟件設計也有了很大的提高 ,我可以從更深層次理解問題。我做的接入服務器CPU是Motorola PowerPC 860,熟悉的朋 友都知道860 QMC與軟件的批量數據傳輸通常采用BD表的方式,硬件人員做驅動的時候習慣采用固定BD表,每接收或發送數據都將數據從BD表拷貝到用戶Buffer, 或從用戶Buffer拷 貝到BD表。由于理解的比較深入,我自己重新實現了這個過程,采用動態BD表的方式,驅動從一個網口接收數據,提交給我的軟件進行三層交換,直至從另外的 接口發送出去,沒有進行一次拷貝。這樣的設計大大提高了性能,使系統的指標接近理論值。

      軟硬件的結合使我的設計水平上了一個臺階。我現在寫的這個操作系統,編譯后我把程序反編譯成匯編,找出其中不優化的代碼,然后在C程序中進行調 整。舉個例子,很多CPU沒有專門的乘法指令,這個大家應該都知道,在這種CPU上進行一個乘法操作常常會花費大量的指令周期,有的朋友會說這個我知道。 我會盡量避免采用×號,但是事情往往不是那么簡單,你知道C語言中數組的下標操作是怎么實現的嗎?仔細看看反匯編的代碼你就會明白,同樣是通過下標的定位 操作,C編譯器會有時候會產生位移指令,但有時候會用乘法實現,兩者效率往往是天壤之別,所以明白這些問題你才能將系統性能提升到極致。這些問題就不多說 了,有興趣的話以后可以共同探討。

      話說遠一點,我由衷的希望在軟件上做的比較深入的朋友們有機會學學硬件以及其它相關知識,尤其是做底層開發和嵌入式設計的。這對軟件技術的提高 有非常大的幫助,否則很多事情你只知道該這樣但不會明白為什么該這樣。我這個觀點在我現在的IC公司Project Manager那里也得到了驗證。他告訴我們公司現在802.11芯片產品的軟件經理原本是做該芯片硬件設計的,某某某原本是做軟件的,現在在做IC,類 似的例子還有很多,只是在國內這樣的風氣不是非常流行。

      我有一些心得體會與大家分享,只有當我干好本職工作后,我才會學習與工作關系不大的技術,這樣公司的上司才不至于反感。在入門 階段的問題我通常不去問那些資深人士 ,而是問一些資歷比較淺的朋友,比如剛畢業不久的學生,因為他們往往會跟你詳細的講解,而資深人士通常覺得你的問題太簡單,所以回答的也很簡單,我又不好 意思多問。

      等技術上了一定的層次后我才會問他們,他們也能給你比較深入的回答。另外,有些朋友說我機會比較好,他們也希望能從事新的工作可惜沒有機會,我 聽了只有苦笑,我的機會了 解的人都應該知道,我沒有出生在什么IT世家:)也沒有誰一路提拔我,所有的路都是自己走出來的,我母親去世比較早,我的后母(我叫她阿姨)看著我努力過 來的,一次她看我大年30還在寫程序,她說像我這樣努力木頭都能學出來。

      我的最終目的是IC而不是PCB,所以我下一步的準備開始學習IC設計的知識。公司的同事沒有懂IC設計的,后面的路又要靠自己了。我買了不少 相關的書,在網上也查了很多的資料,我花了大量的時間去學習VHDL,并且用軟件進行了一些簡單的設計和仿真(沒有設 計ASIC,只是針對FPGA)。隨著學習的深入,我漸漸明白了IC設計的基本流程,同時也明白了這條路的艱辛。這個時候我已經做好了跳槽的準備,我向一 家業界又一定知名度的IC設計公司投了簡歷,并通過了漫長的面試(4個多小時)。其他的一切我都比較滿意,唯獨薪資差強人意,我也明白原因,因為我是這個 行業的新人,我沒有經驗,我再一次將自清零了。公司老板問我6000多一個月能不能接受,我知道他也是照章辦事。想想我通信行業的朋友們,基本上都是年薪 10萬以上,月薪過萬的也比比皆是,朋友們也幫我介紹了不 少待遇不錯的公司。我該怎么選擇,當時我很猶豫,我熱愛我的事業,我向往我的追求,但我也是一個普通的人,我也需要養家糊口,我也想早一點買房買車。生活 給我出了一道難題。

      愛因斯坦在63歲時說過一個人沒有在30歲以前達成科學上的最大成就,那他永遠也不會有。這句話給了我很大 的壓力和震動,我馬上就26歲了,離30只有四年時間,我必須抓緊這幾年寶貴的時間,努力達到我技術上的最高峰。為了這個理想,為了能離自己的夢更近一 些,我選擇了這家IC公司,我明白自己的薪資和公司剛進來的碩士研究生相差無幾,但為了今后的發展只能忍受,一切又得重新開始。換行業是一個非常痛苦的過 程,尤其從一個春風得意的位置換到一個陌生的崗位,感覺象從溫暖的被子里鉆出來跳進冰水中,讓人難以接受。在原來那家通信公司,我是唯一兩年時間漲了五次 工資的員工,公司和同事都給了我極大的認可,工作上也常常被委以重任。但現在這一切都成了過去,在新的公司 我只是一個新人,沒有人知道也沒有人在意我過去的成績。我決定重新開始,我把自己看作 新畢業的學生,我要用自己的努力得到公司的認可。進入新的行業是非常痛苦的,我告訴自己必須忍受這一切,雖然外面有很多誘惑,但是既然作出了選擇我就不允 許自己輕易放棄。

      我現在已經在這家新公司上了一個多月的班,開始非常艱難,現在慢慢適應了。第一個月結束時,Team Leader找我談話,說我是新進員工中最優秀的一個,我心里很欣慰,這也算對我努力的一個肯定吧。在這里還要感謝我的女朋友,她給了我很大的支持和鼓 舞, 每次在我動搖的時候她都在鼓勵我,讓我堅持自己的理想,剛來上海是她讓我不要勉強去做MIS,這次也是她讓我頂住了月薪過萬的誘惑,沒有她我可能不會有今 天的成績。現在的公司有自己的操作系統,自己的CPU、DSP和其它芯片,在這里我能學到世界上最先進的技術,我們的設計開發不再完全依賴別人的硬件和系 統,這讓我很開心。我打算等工作步入正軌后,全力學習新的知識,實現我的理想。
      在后面的兩年里我給自己定下了幾個目標:

      1、努力做好本職工作,在工作上得到公司和同事們的認同;
      2、努力學習IC硬件設計知識,多向同事請教,并利用一切機會多實踐;
      3、實現我的實時操作系統的主要部分,完成TCP/IP協議棧模塊,并免費發布源代碼;
      4、和我女朋友結婚并買一套小房子,這是最重要的,因為我明白事業是可以重來的,但是珍貴的感情很難失而復得。

      在這里提一下我現在開發的操作系統,它是一個實時嵌入式系統,目前支持以下特性:

      a. 支持時間片輪轉調度和基于優先級調度,最多64個優先級;
      b. 搶占式實時內核;
      c. 為了便于移植,主體用標準C實現;
      d. 匯編代碼非常少,不到100行;
      e. 支持任務管理,各任務有獨立的堆棧;
      f. 進程同步和通信目前完成了Semaphore,Message Queue正在調試;
      g. 實現了定時系統調用;
      h. 可以在Windows上仿真調試。

      我還打算下一步實現優先級反轉保護,Event Flag,Data Pipe,內存管理(以前實現過) ,驅動接口等。在這之后我還會努力完善它,比如加入文件系統,協議棧、調試接口等。希望朋友們提出自己的意見和建議,在此不勝感激!
      后記:

      就像有的朋友說的,我的經歷或許會給一些朋友產生誤導,在這里我必須說明一下。我來上海以前學習過于拼命,常常晚上只睡3個多小時,我身高1米 71,那時只有108斤(我現在130多),家人也說我這樣拼命活不過60歲,但是當時的我太固執,我對他們說只要能實現理想活50歲我就夠了。那時的拼 命使我的身體受到了影響,有一次早上突然腰肌劇痛難忍,痛的我倒在床上站不起來。雖然我現在已經比較注意,但有時候還會隱隱作痛。后來在女朋友說服了我, 來上海以后我不再如此。我經常引用父親的一句話身體是革命的本錢。

      而且我也發現拼命不是辦法,我可以熬一兩個通宵,最多的一次我連續工作了三天三夜, 但是我半個月都沒有恢復過來,這樣是不是得不償失?學習工作應該是一個長期的過程, 像馬拉松而不是百米沖刺。我現在非常注意調整學習和工作的強度,我要保證每天盡量有相對充沛的精力,一些年輕的朋友覺得自己也應該拼命努力,這讓我多少有 些擔心,如果我的故事能讓你在學習工作上多一點興趣,我會感到很開心,但如果誤導了某些朋友,讓你做一些不值得的付出,我會感到很內疚。

      技術沒有貴賤之分,我以前換行業是因為自己的興趣所致,而不是對哪個行業有什么偏見。我希望我的經歷不要給朋友一個錯誤的導向,覺得我始終向更 高的技術發展。其實各行各業做到頂尖都是很困難的。話又說回來雖然技術沒有貴賤,但是門檻是有高低的,無論如何,做IC的門檻要比做網頁的高,這一點無可 否認。國家各種人才都是需要的,但是作為個人奮發向上的想法還是應該有的,努力在自己喜歡的行業上做的更好,而不應該停留在比較膚淺的層次上。

      我是一個自己覺得比較有自知之明的人,或許我最大的優點就是知道自己有很多缺點 :)。我的故事中很多的曲折和錯誤都是由我的缺點造成的,希望大家用審慎的眼光看待我的經歷,不要被我的花言巧語所迷惑。我學習有些隨心所欲,這給我帶來 了無盡的麻煩,也大大阻礙了我的發展。記得我小時候成績比較出色,但是后來學習嚴重偏科,導致我中學成績一再滑坡,也沒有考上什么好的學校,小時候的一個 朋友,當時的成績和我相仿,但是沒有我這個缺點,她上了清華,后來在去了美國深造,在一個著名導師手下研究理論科學,這未嘗不是一條更好的出路。

      另外我的學習方法也是在不斷改善中的,過去的學習過于講究數量和時間,那樣學習既苦而已效率不高。現在我非常注意學習的效率和技巧,這樣才是學 習的捷徑(當然不是指投機取巧),比如說學一相對陌生的技術,如果有條件,不妨問一問有經驗的人,不需要問很多,往往他不經意的幾句話會給你非常大的幫 助,甚至超過你看一個星期的書。帶著這樣的思想再去學習你會節省很多時間,這樣何樂不為呢?

      這些年中我學了不少的東西,由于開始非常盲目,所以學的東西雜亂無章,現在回想起來讓我啼笑皆非,我把大量的時間浪費在一些沒有必要深入了解的 知識上,畢竟一個人的精力是有限度的。很多朋友和我一樣都背過五筆字形,的確它是個不錯的輸入法,但是對一個研發人員它絕對不值得你去背,你的時間應該花 在有價值的地方。我這樣的事情還做過很多,我背過CCED、WPS的命令和快捷鍵,在dBase基本退出歷史舞臺后我還花了很多時間去學習它的使用。所以 我的學習在前期缺乏規劃,沒有明確的短期目的、中期目標,只有一個虛無飄渺的長期的理想。這就像做設計一樣,好的設計是從需求抽象到代碼有很多過程,而不 能得到了需求就立刻開始開始編碼。

      當然這么些年的學習和工作多多少少有些收獲,下面我說說我的一些學習的心得,這些方法未必正確,我也在不斷探索和改進中。我的學習和工作有相對 明確的目標,我不會一時心動而去學習某一技術,在下決定之前我會考慮很多,包括長期的發展,個人路線的規劃,需要付出的代價、可能遇到的困難及解決的辦法 等等;在決定后還會制定更加明確的計劃,包括短期、中期和長期的,身邊可以利用到的資源(包括好的書籍、資料、軟硬件環境,也包括有經驗的朋友或者師 長),以及每一個階段是怎么過渡到高一階段的計劃 ;往往在一個學習階段一旦上路后會走的相對順利,但是跨階段通常比較麻煩,比如從學習基礎知識轉到實踐。另外我買書也有自己的方法,現在世面上高質量的書 遠不如低質量書多,對于一個陌生的技術,往往在第一次買書會選擇錯誤,即使買到一本好書但是它的方向也未必適合你,所以我通常會先在網上查找一些該技術的 介紹,有了一點點概念后再去買一本比較薄、相對便宜并且內容相對泛泛而談的書,這是國內作者最善于寫的書:) ,再把它瀏覽一遍后我就會基本明白這門技術的要點,后面買書和制定計劃就會明確的多 。否則一開始就想找本好書往往比較困難,而且買回來后努力學習,有時候學了一半才發現是本低質量的書或者是相對過時技術,讓人非常懊惱。另外讓有經驗的人 幫你介紹,通常也是一個不錯的選擇。

    posted @ 2014-05-07 14:22 ZT文萃 閱讀(238) | 評論 (0)編輯 收藏

    2014年5月6日

    下文轉載自:
    http://www.sbanzu.com/topicdisplay.asp?BoardID=8&Page=1&TopicID=4136822
    轉載不代表贊同作者,僅僅是記錄。

    有一個名字,全世界所有的獨裁者聽到都會驚慌。
    有一個名字,一切熱愛自由的人民聽到都要贊揚。
    有一個名字,躲在陰暗中謀殺百姓的歹徒對她咬牙切齒。
    有一個名字,陽光下渴望和平的人們對她寄予厚望。
    是她一次又一次的把世界從惡魔手中拯救,
    是她一次又一次的給予恐懼中的人類希望。
    是誰擋住了納粹的鐵蹄?
    是誰支援了遠東的戰場?
    是誰把集中營解放?
    是誰迫使日寇投降?
    是誰將那隔開同胞的高墻推倒?
    是誰擊斃了伊阿獨裁流氓?
    她高舉著火炬,在黑暗中指引我們方向!
    她宣言的真理,時時回響在我們耳旁!
    虛偽者越是污蔑她虛偽,
    正直者越是堅定對她的信仰!
    她的偉大我們一刻不忘!
    你問我她長的什么模樣?
    她是炙熱通紅的火焰,
    她是寬廣蔚藍的大海,
    她是純潔耀眼的白光!
    你問我她的名?
    正告你!
    美利堅!
    人類的希望!
    壯哉,我大美利堅!

    posted @ 2014-05-06 12:02 ZT文萃 閱讀(338) | 評論 (0)編輯 收藏

    2014年5月4日

    下文轉帖自:
    http://www.cnblogs.com/chenssy/p/3651218.html
    版權歸作者所有。

    hashCode的作用

          要想了解一個方法的內在原理,我們首先需要明白它是干什么的,也就是這個方法的作用。在講解數組時(java提高篇(十八)------數組),我們提到數組是java中效率最高的數據結構,但是“最高”是有前提的。第一我們需要知道所查詢數據的所在位置。第二:如果我們進行迭代查找時,數據量一定要小,對于大數據量而言一般推薦集合。

          在Java集合中有兩類,一類是List,一類是Set他們之間的區別就在于List集合中的元素師有序的,且可以重復,而Set集合中元素是無序不可重 復的。對于List好處理,但是對于Set而言我們要如何來保證元素不重復呢?通過迭代來equals()是否相等。數據量小還可以接受,當我們的數據量 大的時候效率可想而知(當然我們可以利用算法進行優化)。比如我們向HashSet插入1000數據,難道我們真的要迭代1000次,調用1000次 equals()方法嗎?hashCode提供了解決方案。怎么實現?我們先看hashCode的源碼(Object)。

    public native int hashCode();

          它是一個本地方法,它的實現與本地機器有關,這里我們暫且認為他返回的是對象存儲的物理位置(實際上不是,這里寫是便于理解)。當我們向一個集合中添加某 個元素,集合會首先調用hashCode方法,這樣就可以直接定位它所存儲的位置,若該處沒有其他元素,則直接保存。若該處已經有元素存在,就調用 equals方法來匹配這兩個元素是否相同,相同則不存,不同則散列到其他位置(具體情況請參考(Java提高篇()-----HashMap))。這樣 處理,當我們存入大量元素時就可以大大減少調用equals()方法的次數,極大地提高了效率。

          所以hashCode在上面扮演的角色為尋域(尋 找某個對象在集合中區域位置)。hashCode可以將集合分成若干個區域,每個對象都可以計算出他們的hash碼,可以將hash碼分組,每個分組對應 著某個存儲區域,根據一個對象的hash碼就可以確定該對象所存儲區域,這樣就大大減少查詢匹配元素的數量,提高了查詢效率。

    hashCode對于一個對象的重要性

          hashCode重要么?不重要,對于List集合、數組而言,他就是一個累贅,但是對于HashMap、HashSet、HashTable而言,它變 得異常重要。所以在使用HashMap、HashSet、HashTable時一定要注意hashCode。對于一個對象而言,其hashCode過程就 是一個簡單的Hash算法的實現,其實現過程對你實現對象的存取過程起到非常重要的作用。

          在前面LZ提到了HashMap和HashTable兩種數據結構,雖然他們存在若干個區別,但是他們的實現原理是相同的,這里我以HashTable為例闡述hashCode對于一個對象的重要性。

          一個對象勢必會存在若干個屬性,如何選擇屬性來進行散列考驗著一個人的設計能力。如果我們將所有屬性進行散列,這必定會是一個糟糕的設計,因為對象的 hashCode方法無時無刻不是在被調用,如果太多的屬性參與散列,那么需要的操作數時間將會大大增加,這將嚴重影響程序的性能。但是如果較少屬相參與 散列,散列的多樣性會削弱,會產生大量的散列“沖突”,除了不能夠很好的利用空間外,在某種程度也會影響對象的查詢效率。其實這兩者是一個矛盾體,散列的 多樣性會帶來性能的降低。

          那么如何對對象的hashCode進行設計,LZ也沒有經驗。從網上查到了這樣一種解決方案:設置一個緩存標識來緩存當前的散列碼,只有當參與散列的對象改變時才會重新計算,否則調用緩存的hashCode,這樣就可以從很大程度上提高性能。

          在HashTable計算某個對象在table[]數組中的索引位置,其代碼如下:

    int index = (hash & 0x7FFFFFFF) % tab.length;

          為什么要&0x7FFFFFFF?因為某些對象的hashCode可能會為負值,與0x7FFFFFFF進行與運算可以確保index為一個正 數。通過這步我可以直接定位某個對象的位置,所以從理論上來說我們是完全可以利用hashCode直接定位對象的散列表中的位置,但是為什么會存在一個 key-value的鍵值對,利用key的hashCode來存入數據而不是直接存放value呢?這就關系HashTable性能問題的最重要的問 題:Hash沖突!

          我們知道沖突的產生是由于不同的對象產生了相同的散列碼,假如我們設計對象的散列碼可以確保99.999999999%的不重復,但是有一種絕對且幾乎不 可能遇到的沖突你是絕對避免不了的。我們知道hashcode返回的是int,它的值只可能在int范圍內。如果我們存放的數據超過了int的范圍呢?這 樣就必定會產生兩個相同的index,這時在index位置處會存儲兩個對象,我們就可以利用key本身來進行判斷。所以具有相索引的對象,在該 index位置處存在多個對象,我們必須依靠key的hashCode和key本身來進行區分。

    hashCode與equals

          在Java中hashCode的實現總是伴隨著equals,他們是緊密配合的,你要是自己設計了其中一個,就要設計另外一個。當然在多數情況下,這兩個 方法是不用我們考慮的,直接使用默認方法就可以幫助我們解決很多問題。但是在有些情況,我們必須要自己動手來實現它,才能確保程序更好的運作。

          對于equals,我們必須遵循如下規則:

          對稱性:如果x.equals(y)返回是“true”,那么y.equals(x)也應該返回是“true”。

          反射性:x.equals(x)必須返回是“true”。

          類推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也應該返回是“true”。

          一致性:如果x.equals(y)返回是“true”,只要x和y內容一直不變,不管你重復x.equals(y)多少次,返回都是“true”。

          任何情況下,x.equals(null),永遠返回是“false”;x.equals(和x不同類型的對象)永遠返回是“false”。

          對于hashCode,我們應該遵循如下規則:

          1. 在一個應用程序執行期間,如果一個對象的equals方法做比較所用到的信息沒有被修改的話,則對該對象調用hashCode方法多次,它必須始終如一地返回同一個整數。

          2. 如果兩個對象根據equals(Object o)方法是相等的,則調用這兩個對象中任一對象的hashCode方法必須產生相同的整數結果。

          3. 如果兩個對象根據equals(Object o)方法是不相等的,則調用這兩個對象中任一個對象的hashCode方法,不要求產生不同的整數結果。但如果能不同,則可能提高散列表的性能。

          至于兩者之間的關聯關系,我們只需要記住如下即可:

          如果x.equals(y)返回“true”,那么x和y的hashCode()必須相等。

          如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。

          理清了上面的關系我們就知道他們兩者是如何配合起來工作的。先看下圖:

    2014040701_thumb2

          整個處理流程是:

          1、判斷兩個對象的hashcode是否相等,若不等,則認為兩個對象不等,完畢,若相等,則比較equals。

          2、若兩個對象的equals不等,則可以認為兩個對象不等,否則認為他們相等。

          實例:

    復制代碼
    public class Person {     private int age;     private int sex;    //0:男,1:女     private String name;      private final int PRIME = 37;      Person(int age ,int sex ,String name){         this.age = age;         this.sex = sex;         this.name = name;     }      /** 省略getter、setter方法 **/      @Override     public int hashCode() {         System.out.println("調用hashCode方法...........");          int hashResult = 1;         hashResult = (hashResult + Integer.valueOf(age).hashCode() + Integer.valueOf(sex).hashCode()) * PRIME;         hashResult = PRIME * hashResult + ((name == null) ? 0 : name.hashCode());          System.out.println("name:"+name +" hashCode:" + hashResult);          return hashResult;     }      /**      * 重寫hashCode()      */     public boolean equals(Object obj) {         System.out.println("調用equals方法...........");          if(obj == null){             return false;         }         if(obj.getClass() != this.getClass()){             return false;         }         if(this == obj){             return true;         }          Person person = (Person) obj;          if(getAge() != person.getAge() || getSex()!= person.getSex()){             return false;         }          if(getName() != null){             if(!getName().equals(person.getName())){                 return false;             }         }         else if(person != null){             return false;         }         return true;     } }
    復制代碼

          該Bean為一個標準的Java Bean,重新實現了hashCode方法和equals方法。

    復制代碼
    public class Main extends JPanel {      public static void main(String[] args) {         Set<Person> set = new HashSet<Person>();          Person p1 = new Person(11, 1, "張三");         Person p2 = new Person(12, 1, "李四");         Person p3 = new Person(11, 1, "張三");         Person p4 = new Person(11, 1, "李四");          //只驗證p1、p3         System.out.println("p1 == p3? :" + (p1 == p3));         System.out.println("p1.equals(p3)?:"+p1.equals(p3));         System.out.println("-----------------------分割線--------------------------");         set.add(p1);         set.add(p2);         set.add(p3);         set.add(p4);         System.out.println("set.size()="+set.size());     } }
    復制代碼

           運行結果如下:

    2014040702_thumb

          從上圖可以看出,程序調用四次hashCode方法,一次equals方法,其set的長度只有3。add方法運行流程完全符合他們兩者之間的處理流程。

    posted @ 2014-05-04 06:23 ZT文萃 閱讀(274) | 評論 (0)編輯 收藏

    下文來自:
    http://www.cnblogs.com/chenssy/archive/2012/12/09/2809874.html
    版權歸作者所有。

          電子郵件用于網上的信心傳遞和交流,它是最重要的Internet服務之一。據統計Internet30%的業務是電子郵件有關的。同時我們也不可否認它在我們的日常生活、工作辦公方面扮演著很重要的角色。譬如:許多辦公自動化項目(OA)中都要附帶發送郵件的功能,如果還要使用OutLook等手工方式就不適合,在這個高速的時代,我們需要提供工作效率,讓工作能夠自動化。同時在許多網站中也都需要附帶發送郵件的功能:給新注冊的用戶發送一封包含其注冊信息的歡迎E-Mail、將網站的最新活動信息通過E-Mail發送給所有的注冊會員等等。

     

           在開始電子郵件開發前:我們需要明白一下幾個概念:電子郵件系統、郵件服務器、電子郵件、郵件客戶端軟件、郵件傳輸協議、電子郵件的傳輸過程。

     

           電子郵件系統

           與 傳統的郵政服務相類似,電子郵件系統由電子郵局、電子郵件發送、接收系統組成。發送者和接收者通過電子郵件發送、接收系統來發送和接收電子郵件,他們實際 上是運行在計算機上的郵件客戶端程序。電子郵局起著一個橋梁的作用,它實際上是運行在服務器上的郵件服務器程序。電子郵件的處理流程也和郵政服務相類似。

     

              

           郵件服務器

           郵件服務器是一種用來負責電子郵件收發管理的設備。在Internet上提供了大量的電子郵件服務器,如:126163hotmail…

           電子郵件服務器主要提供的功能:

               1、  接收用戶投遞的郵件。

               2、  將用戶投遞進來的郵件轉發給目標郵件服務器。

               3、  接收其他電子郵件服務器轉發來的郵件并該郵件存儲到其管理的用戶郵中。

               4、  為前來讀取郵件的用戶提供讀取郵件的服務。

           郵 件服務器構成了電子郵件系統的核心。每個收信人都有一個位于某個郵件服務器上的郵箱(mailbox)。Bob的郵箱用于管理和維護已經發送給他的郵件消 息。一個郵件消息的典型旅程是從發信人的用戶代理開始,郵件發信人的郵件服務器,中轉到收信人的郵件服務器,然后投遞到收信人的郵箱中。當Bob想查看自 己的郵箱中的郵件消息時,存放該郵箱的郵件服務器將以他提供的用戶名和口令認證他。Alice的郵件服務器還得處理Bob的郵件服務器出故障的情況。如果 Alice的郵件服務器無法把郵件消息立即遞送到Bob的郵件服務器,Alice的服務器就把它們存放在消息隊列(message queue)中,以后再嘗試遞送。這種嘗試通常每30分鐘左右執行一次:要是過了若干天仍未嘗試成功,該服務器就把這個消息從消息隊列中去除掉,同時以另 一個郵件消息通知發信人(即Alice)。

     

           電子郵件

           電子郵件是一種通過網絡實現相互傳送和接收信息的現代化通信方式。它是種用電子手段提供信息交換的通信方式,是Internet應用最廣的服務,通過網絡的電子郵件系統,用戶可以用非常低廉的價格,以非常快速的方式,與世界上任何一個角落的網絡用戶聯系,這些電子郵件可以是文字、圖像、聲音等各種方式。同時,用戶可以得到大量免費的新聞、專題郵件,并實現輕松的信息搜索。

           電子郵件由信封和內容兩個部分組成。信封又稱郵件頭,電子郵件服務器根據信封上的信心來傳遞郵件的。內容稱為郵件體,它用于提供郵件的具體內容。

           Internet上的電子郵件地址全球唯一,其格式為“郵箱名@郵件服務器域名”。域(郵件域)是電子郵件服務器的基本管理單位,郵件服務以域為基礎,每個郵箱對應一個用戶。其中郵件服務器域名必須是已注冊的DNS域名,并且必須要與MX(郵件交換機)記錄匹配。DNS用于將域名、主機名解析為IP地址。MX記錄指向該域名的郵件服務器主機記錄,為郵件服務專用。

     

           郵件客戶端軟件

           郵件客戶端軟件負責與郵件服務器通訊,主要用于幫助用戶將郵件發送給SMTP服務器和POP3/IMAP郵件服務器讀取用戶的電子郵件。郵件客戶端軟件通常集撰寫、發送、接收郵件于一體。

     

     

           電子郵箱

           每一個電子郵件服務器之上都可以開始多個電子郵箱,電子郵箱也稱之為E-Mail地址。它類似于現實生活中的通訊地址,用戶通過它接受別人發來的電子郵件和向別人發送電子郵件。

           電子郵箱的獲得需要在電子郵件服務器上進行申請,確切的說,電子郵箱其實就是用戶在郵件服務器上申請的一個賬戶。郵件服務器把接收到的郵件保持到為某個賬戶所分配的郵箱空間中,用戶通過其申請的用戶名和密碼登陸到郵件服務器上查看該地址已經收到的電子郵件。

     

           電子郵件的傳輸過程

           電子郵件系統采用客戶/服務器模式。電子郵件傳送需要用到以下3個重要模塊:

           MUAMail User Agent,郵件用戶代理):用戶通過它與電子郵件服務器打交道。MUA實際上就是郵件客戶端軟件。

           MTAMail Transfer Agent,郵件傳輸代理):它主要負責處理所有接收和發送的郵件,為MUA或者MTA提供郵件發送服務,接收其他MTA發送過來的郵件。

           MDAMail Delivery Agent,郵件投遞代理):它負責郵件本地投遞。當MTA決定某郵件發送本地用戶時,MTA將郵件交給MDA程序進行分發,也就是說投遞到用戶的。

           具體的傳遞過程如下:

                1、  發件人利用MUA將郵件發送給MTA

                2、 MTA收到郵件后判斷收件人是不是本地賬戶,如果是本地賬戶,交由MDA投送到該賬戶的郵箱中,完成發送過程,跳到第5步。如果不是則執行下一步驟。

                3、 MTA根據其郵件中繼轉發設置來決定如何轉發郵件。

                4、  最終目的的MTA將受到的交給他的MDA處理,有MDA將郵件投遞到收件人的郵箱中。

                5、  收件人利用MUA通過POP/IMAP協議連接到郵箱所在的服務器,請求查看自己的收件箱是否有郵件,如果有郵件,將會通過它傳送個收件人的MUA

           注意:提示郵件訪問服務的是POP或者IMAP服務器軟件,而并非當初收下郵件的MTA,兩者的角色是分離的。

     

           郵件傳輸協議

           電子郵件服務傳輸主要是用到以下3中網絡協議

            SMTP(簡單郵件傳輸協議)

           SMTPSimple Mail Transfer Protocol。標準TCP端口是25MUA將郵件發送到MTAMTA將郵件發送給下一個MTA,都是要使用SMTPSMTP的目標是可靠高效地傳送郵件,它獨立于傳送子系統而且僅要求一條可以保證傳送數據單元順序的通道。

           SMTP是一個“單向”的協議,它不能用戶從其他郵件服務器收取郵件。它本身是采用客戶/服務器模式,負責發送郵件的SMTP進程就是SMTP客戶端,負責接收郵件的SMTP進程就是SMTP服務器。一個完整的SMTP通信過程主要包括建立連接、傳送郵件、釋放連接三個過程。

           建立連接:首先由發件人將要發送的郵件發送到郵件緩存,SMTP客戶端定期掃描郵件緩存,一旦發現有郵件,就與SMTP服務器建立TCP連接,然后發送HRLLO命令以附上發送方的主機名。

           傳送郵件:SMTP客戶端使用MAIL命令開始傳送郵件,該命令提供發件人的地址;然后執行RCPT命令,并提供收件人地址;最后執行DATA命令傳送郵件內容。

           釋放連接:郵件傳送完畢后,SMTP客戶端發送OUT命令請求關閉TCP連接。

             POP(郵局協議)

             POPPost Office Protocol。標準TCP端口為110。主要用于電子郵件的接收。MUA經由POP協議連接到MTA的用戶收件箱,以讀取或下載用戶在收件箱中郵件。

        目前用的較多的POP協議是POP3POP3使用 TCP 作為傳輸協議。

           IMAPInternet信息訪問協議)

           IMAPInternet Message Access Protocol。標準TCP端口為143,它也是讓MUAMTA收取郵件。目標球IMAP協議的版本為IMAP4

           POPIMAP兩者都可以用于收取郵件,都是采用客戶/服務器模式,兩者最主要的區別就在于他們檢索郵件的方式不同。使用POP時,郵件駐留在服務器中個,一旦接收郵件,郵件都從服務器上下載到用戶計算機上。而IMAP則能夠然該用戶了解到服務器上存儲郵件的情況,已下載的郵件仍然滯留在服務器中,以便于實現郵件歸檔和共享。

    posted @ 2014-05-04 06:19 ZT文萃 閱讀(419) | 評論 (0)編輯 收藏

    轉載自:
    http://www.cnblogs.com/chenssy/p/3308489.html
    版權歸作者所有。

          首先來看看淺拷貝和深拷貝的定義:

          淺拷貝:使用一個已知實例對新創建實例的成員變量逐個賦值,這個方式被稱為淺拷貝。

          深拷貝:當一個類的拷貝構造方法,不僅要復制對象的所有非引用成員變量值,還要為引用類型的成員變量創建新的實例,并且初始化為形式參數實例值。這個方式稱為深拷貝

          也就是說淺拷貝只復制一個對象,傳遞引用,不能復制實例。而深拷貝對對象內部的引用均復制,它是創建一個新的實例,并且復制實例。

          對于淺拷貝當對象的成員變量是基本數據類型時,兩個對象的成員變量已有存儲空間,賦值運算傳遞值,所以淺拷貝能夠復制實例。但是當對象的成員變量是引用數據類型時,就不能實現對象的復制了。

          存在一個對象Person,代碼如下:

    復制代碼
    public class Person {     private String name;     private String sex;     private int age;          public Person(String name,String sex,int age){         this.name = name;         this.sex = sex;         this.age = age;     }          public Person(Person p){                   //拷貝構造方法,復制對象         this.name = p.name;         this.sex = p.sex;         this.age = p.age;     } }
    復制代碼

          上面的對象Person有三個成員變量。name、sex、age。兩個構造方法。第二個的參數為該對象,它稱為拷貝構造方法,它將創建的新對象初始化為形式參數的實例值,通過它可以實現對象復制功能。

          又有一個對象Asian,如下:

    復制代碼
    public class Asian {     private String skin;     Person person;          public Asian(String skin,Person person){         this.skin = skin;         this.person = person;                    //引用賦值     }      public Asian(Asian asian){                 //拷貝構造方法,復制對象         this(asian.skin,asian.person);                } }
    復制代碼

          上面對象也存在著兩個成員變量,skin 和Person對象

          對于person對象有如下:

    Person p1 = new Person("李四","mam",23);   Person p2 = new Person(P1);

          當調用上面的語句時。P2對象將會對P1進行復制。執行情況如下如下圖:

          對于Asian對象有:

    Asian a1 = new Asian("yellow",new Person("李四","mam",23)); Asian a2 = new Asian(a1);

          New Asian(a1)執行Asian類的拷貝構造方法,由于對象賦值是引用賦值。使得a1和a2引用同一個對象

          如下圖:

          當a1執行某條可以改變該值的語句時,那么a1將會通過這個語句也可以改變a2對象的成員變量

          如果執行以下語句:a2.name = new Person(a1.name)

          這時將會創建一個新的Person對象

          如下圖:


    posted @ 2014-05-04 06:15 ZT文萃 閱讀(377) | 評論 (0)編輯 收藏

    轉帖:

    http://www.cnblogs.com/chenssy/p/3695271.html
    版權歸作者所有。


         今天朋友問我String的內容是真的不可變嗎?我肯定告訴他是的?因為在我的主觀意識里String就是一個不可變的對象。于是他給我發了這段程序:

    復制代碼
    public class StringTest {     public static void main(String[] args) throws Exception {         String a = "chenssy";         System.out.println("a = " + a);         Field a_ = String.class.getDeclaredField("value");         a.setAccessible(true);         char[] value=(char[])a.get(a);         value[4]='_';   //修改a所指向的值         System.out.println("a = " + a);     } }
    復制代碼

          看到這個簡單的程序,我笑了,你這不是從底層來修改String的值么?從這里來理解String的值肯定是可以改變的啦(我們應該始終相信String的不可變性)!接著他再給我一段程序:

    復制代碼
    public class StringTest {     public static void main(String[] args) throws Exception {         String a = "chenssy";         String b = "chenssy";         String c = new String("chenssy");         System.out.println("--------------修改前值-------------------");         System.out.println("a = " + a);         System.out.println("b = " + b);         System.out.println("c = " + c);         //修改String的值         Field a_ = String.class.getDeclaredField("value");         a_.setAccessible(true);         char[] value=(char[])a_.get(a);         value[4]='_';   //修改a所指向的值                  System.out.println("--------------修改后值-------------------");         System.out.println("a = " + a);         System.out.println("b = " + b);         System.out.println("chenssy");         System.out.println("c = " + c);     } }
    復制代碼

          乍看這程序是異常的簡單,無非就是賦值、改值、輸出嘛!可能你現在就會毫不猶豫的說太簡單了結果就是……。但是!!你的毫不猶豫會害死你,而且你的結果很可能錯誤。那么運行結果是什么呢?

    復制代碼
    --------------修改前值------------------- a = chenssy b = chenssy c = chenssy --------------修改后值------------------- a = chen_sy b = chen_sy chen_sy c = chen_ssy
    復制代碼

          修改前值很容易理解,但是修改后值呢?是不是有點兒不理解呢?你可能會問:為什么System.out.println("chenssy");的結果會是chen_ssy,System.out.println("c = " + c);也是chen_ssy呢?

          要明白這個其實也比較簡單,掌握一個知識點:字符串常量池。

          我們知道字符串的分配和其他對象分配一樣,是需要消耗高昂的時間和空間的,而且字符串我們使用的非常多。JVM為了提高性能和減少內存的開銷,在實例化字 符串的時候進行了一些優化:使用字符串常量池。每當我們創建字符串常量時,JVM會首先檢查字符串常量池,如果該字符串已經存在常量池中,那么就直接返回 常量池中的實例引用。如果字符串不存在常量池中,就會實例化該字符串并且將其放到常量池中。由于String字符串的不可變性我們可以十分肯定常量池中一定不存在兩個相同的字符串(這點對理解上面至關重要)。

          我們再來理解上面的程序。

          String a = "chenssy";

          String b = "chenssy";

          a、b和字面上的chenssy都是指向JVM字符串常量池中的”chenssy”對象,他們指向同一個對象。

          String c = new String("chenssy");

          new關鍵字一定會產生一個對象chenssy(注意這個chenssy和上面的chenssy不同),同時這個對象是存儲在堆中。所以上面應該產生了兩 個對象:保存在棧中的c和保存堆中chenssy。但是在Java中根本就不存在兩個完全一模一樣的字符串對象。故堆中的chenssy應該是引用字符串 常量池中chenssy。所以c、chenssy、池chenssy的關系應該是:c--->chenssy--->池chenssy。整個 關系如下:

          201404271001

          通過上面的圖我們可以非常清晰的認識他們之間的關系。所以我們修改內存中的值,他變化的是所有。

          總結:雖然a、 b、c、chenssy是不同的對象,但是從String的內部結構我們是可以理解上面的。String c = new String("chenssy");雖然c的內容是創建在堆中,但是他的內部value還是指向JVM常量池的chenssy的value,它構造 chenssy時所用的參數依然是chenssy字符串常量。

          為了讓各位充分理解常量池,特意準備了如下一個簡單的題目:

    String a = "chen"; String b = a + new String("ssy");
             創建了幾個String對象??

    posted @ 2014-05-04 06:10 ZT文萃 閱讀(216) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 国产成人亚洲精品91专区高清| 无码毛片一区二区三区视频免费播放 | 亚洲一区在线免费观看| 亚洲成A人片77777国产| 免费一级毛suv好看的国产网站 | 亚洲日本在线电影| 日本亚洲免费无线码| ASS亚洲熟妇毛茸茸PICS| 久久精品网站免费观看| 亚洲精华国产精华精华液| 国产一区二区三区在线免费观看 | 无码不卡亚洲成?人片| 免费的黄色的网站| 国产亚洲精aa成人网站| 永久在线观看免费视频| 亚洲黄色在线视频| 成全高清视频免费观看| 亚洲a∨国产av综合av下载| 四虎成人精品在永久免费| 一级毛片a免费播放王色电影| 日本h在线精品免费观看| 亚洲国产成人九九综合| 四虎免费大片aⅴ入口| 尤物视频在线免费观看| 亚洲精品综合一二三区在线| 2020久久精品国产免费| 污污免费在线观看| 亚洲午夜精品一区二区| 免费看美女被靠到爽| 91成人免费福利网站在线| 亚洲国产综合精品| vvvv99日韩精品亚洲| 99re6在线精品视频免费播放| 亚洲自偷自偷图片| 国产精品久久免费| 一级中文字幕乱码免费| 午夜亚洲AV日韩AV无码大全| 成人a视频片在线观看免费| 青青操免费在线视频| 亚洲午夜精品久久久久久app| 黄在线观看www免费看|