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

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

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

    Read Sean

    Read me, read Sean.
    posts - 508, comments - 655, trackbacks - 9, articles - 4


    回想大學時代,我第一本從頭到尾讀完的英文小說是Arthur Hailey的《Airport》,是在大學門口的外研書店買的。當時的想法很單純:要證明自己的英文閱讀水準不差,光靠新聞、應用文和專業(yè)文獻是不夠的,小說占到native speaker們日常閱讀相當大的比重。如果能夠啃下一本真正原汁原味的長篇小說,至少說明他們讀什么,我也能讀、能欣賞。最終花了一個禮拜,利用課余時間讀完了。

    這個看似不起眼的"成就",對我自信心的建立至關重要。沒有這個打底,后面恐怕也不會在知識"原始積累"的時候能有心有力去大量地閱讀原版或影印版的書籍,并且往往能比別人更準確地把握原著要表達的意思。這個閱讀小說原著的習慣一直延續(xù)到今天,量雖然不大,一直都有意識地在進行,比如前幾年的《The Da Vinci Code》,這幾年的《Animal Farm》、《1984》、《Twilight》等等。

    就個人成長而言,光靠別人給你壓力,給你找突破點是不夠的。經驗告訴我,影響自己最深遠的,通常是那些自己給自己找的突破點。你能走多遠,成為什么樣的人,很大程度上取決于你自己。

    posted @ 2011-01-01 21:09 laogao 閱讀(653) | 評論 (1)編輯 收藏


    相信大家對SOA這個詞并不陌生,很多企業(yè)都在講我們要上SOA,也有很多企業(yè)在呼應:我們能幫忙。但究竟什么是SOA,SOA能做什么,如何在企業(yè)中推行SOA,采用什么樣的技術,這些都是擺在我們面前的現(xiàn)實問題。

    我為什么會對這本書產生興趣?這要從我的工作說起。我從2004年開始投身到企業(yè)軟件開發(fā)當中,具體而言,就是醫(yī)院管理信息系統(tǒng)(HIS)。我們的團隊,一直都是扮演獨立軟件廠商(ISV)的角色,為國內大中型醫(yī)院提供高品質的HIS產品和服務。

    接觸過醫(yī)院信息化的朋友都知道,醫(yī)院對軟件的需求是多方面的,通常很難有一家廠商能夠提供從ICU/CCU、LIS、RIS/PACS到財務軟件的全線產品和服務。而HIS在所有這些系統(tǒng)中,管理著醫(yī)院的核心運營,貫穿醫(yī)院業(yè)務的各個環(huán)節(jié),經常需要和第三方系統(tǒng)進行通信。如何能更好地集成醫(yī)院的各類資產,為醫(yī)院這個特殊的企業(yè)提供優(yōu)質的服務,與醫(yī)院一同成長,就成為我們關注的焦點。

    作為獨立軟件廠商,同時也考慮到醫(yī)院的實際承受能力,我們很難說服自己和醫(yī)院接受那些閉源SOA大廠高昂的產品服務價格。同時,出于對靈活配置和伸縮性的要求,我們在一開始就把目光鎖定在開源產品上。

    SOA為我們提供了架構設計豐富的營養(yǎng)和施展拳腳的平臺。這本書要帶給大家的,正是如何用開源的產品實現(xiàn)完整的SOA。在這個過程中,作者為我們分析了SOA的方方面面,對每個環(huán)節(jié)采用的技術都做了大量翔實的評估和介紹,對每個關鍵點都給出了詳細的說明和完整的源代碼。

    如果你是企業(yè)主管、業(yè)務專家,相信你讀完本書,會對SOA有更清楚的認識,對SOA能為你的企業(yè)帶來什么樣的價值會有更深的理解和體會。

    如果你是架構師或程序員,相信你也和我一樣,在閱讀完本書之后,能更明白SOA的本質,掌握實際開發(fā)SOA的技能,懂得如何在企業(yè)或現(xiàn)有系統(tǒng)中引入SOA的思想。

    得知博文視點引進并準備翻譯這本書時,網上傳來了質疑的聲音,認為開源加上SOA,受眾太小。我卻不這么看。中國的軟件產業(yè),并非只剩下互聯(lián)網和外包,除了叫得出名字的大公司,有大量中小型的獨立軟件廠商在暗自努力,他們在網上的曝光率很低,但都在踏踏實實地做事。他們是可愛、可敬的一批人,做的是幕后支撐企業(yè)運營的重要產品和服務,這本書也是為他們準備的。

    在這里,我要特別感謝武漢博文視點的周筠老師,給我翻譯本書的機會,與她相識是我的榮幸。感謝莫錫昌、成碩為審稿付出的寶貴時間。感謝編輯盧鶇翔、劉唯一和其他所有幕后工作者的辛勤勞動。

    我還要感謝在事業(yè)上給予我重要幫助的兩個人:毛穎和林勇,是他們的信任和鼓勵讓我走到今天。

    最后要感謝我的家人,為了讓我安心翻譯這本書,犧牲了太多的周末和假期,謝謝你們對我的包容和支持,無私的愛當然要用無私的愛來回報,我愛你們!

    在本書的翻譯過程中,譯者雖已盡力確保專業(yè)術語符合中文讀者的習慣,也盡力將原著的真實意圖以符合中文習慣的方式呈現(xiàn)給大家,畢竟水平有限,書中的問題和疏漏之處在所難免,懇請各位讀者朋友批評指正,聯(lián)系郵箱:gaoyuxiang.soa@gmail.com。

    高宇翔

    2010年11月于上海

    posted @ 2010-12-30 16:20 laogao 閱讀(491) | 評論 (0)編輯 收藏

    2010年即將過去,在這一年里,我做了什么?找到自我了嗎?我問自己。

    整個2010年,我大概有這么幾件事值得一提:

        首先,我去年向公司爭取的產品改造計劃,執(zhí)行到中段,可恥地失敗了;
        其次,我有幸參與翻譯了兩本外版IT書:《Scala編程》《開源SOA》,目前兩本書均已上架;
        再次,我下了很大的決心轉行做出版,最終也可恥地失敗了。

    不過,我找到自我了嗎?我想是的:命中注定做架構師。

    這兩天在讀周國平的《人生哲思錄》:

    “古希臘哲人赫拉克利特說:‘一個人的性格就是他的命運。’這句話包含兩層意思:一,對于每個人來說,性格是與生俱來、伴隨終身的,永遠不可擺脫,如同不可擺脫命運一樣;二,性格決定了一個人在此生此世的命運……赫拉克利特的名言的真正含義是:一個人應該認清自己的天性,過最適合于他的天性的生活,而對他而言這就是最好的生活……為別人對你的好感、承認、報償做的事,如果別人不承認,便等于零。為自己的良心、才能、生命做的事,即使沒有一個人承認,也絲毫無損。”

    我想,這就是為什么人在抉擇時要追隨自己的內心和天性,因為這才是對自己最合理的安排。

    posted @ 2010-12-22 23:22 laogao 閱讀(521) | 評論 (1)編輯 收藏


    這篇日記寫給自己,發(fā)散式+意識流,趕時間的朋友請放心略過。

    進入2010年,頭1個月,到今天是最后1天,家里的事暫不去提,這個月是我參加工作以來感覺最累的1個月。

    加入現(xiàn)在的這支創(chuàng)業(yè)團隊4年,我們的產品,從無到有(1.0),到現(xiàn)在的2.x,傾注了很多人的心血,我們的團隊,在后面的這2年多,也經歷和見證了很多傷感的離別,"元老"級的人物,已經屈指可數(shù)。萬事不能盡如人意,能有今天的結果,也許應該慶幸而不是哀傷,至少產品還在,至少團隊還在運轉。但未來會如何,誰也無法預知,我也不敢多想,我只知道,工作帶給我的幸福感,正在不停的創(chuàng)造新低。

    創(chuàng)業(yè)型團隊的一大特點,就是一個人要同時承擔多個角色的職能,而且比其他團隊更容易受到外部環(huán)境的沖擊。為了生存,有時不得不做一些不相關的項目、不相關的事,活下來比什么都重要,你東西再好,技術再牛逼,沒人要就是沒人要,沒資源就是沒資源,哭爹喊娘,沒人理你。

    去年年底,我們的老板帶著我們一起,并入了現(xiàn)在這家集團公司,一個比我們大得多的團隊。按說這應該是好事,我們也不必像原來那樣擔驚受怕,但事實證明這個想法非常天真,外部環(huán)境的沖擊比以前更加真實的發(fā)生在我們身邊,無時無刻不在提醒我們它的存在。以前我們賣力做事,一狠心一咬牙一跺腳,創(chuàng)業(yè)嘛,為整個團隊付出,咱認了;現(xiàn)在我們賣力做事,不知道是在為誰付出:累的是你自己,收獲的是別人。從創(chuàng)業(yè)的角度來說,我們失敗了,我們?yōu)閯?chuàng)業(yè)比別人多付出的那些汗水,除了回憶,現(xiàn)在看,也只有回憶了。對我們這個小團隊來說,情形依然是:為了生存,有時不得不做一些不相關的項目、不相關的事,活下來比什么都重要,你東西再好,技術再牛逼,沒人要就是沒人要,沒資源就是沒資源,哭爹喊娘,沒人理你。

    有人說,其實哪里都一樣。這樣想可能會讓人更快樂,不那么痛苦,但我很清楚,這是精神毒藥,如果事實果真如此,那就不僅僅是令人傷感苦悶,而是徹徹底底的讓人絕望了。

    物以類聚,人以群分。我的群在哪兒?


    posted @ 2010-01-31 21:25 laogao 閱讀(501) | 評論 (1)編輯 收藏


    周二的時候拿到了新的T400s,安裝Linux(64位Karmic)的過程比預想的要曲折,趁周末有時間,整理記錄于此,希望對遇到同樣問題的人有所幫助。

    T400s送到之前,我先簡單的在網上查了查基本的配置信息,同時也看到有很多網友十分順利的安裝了Linux,不論是Ubuntu Karmic還是Arch Linux,基本都是除了指紋都是out-of-box就可直接工作的,這也符合我的預期。于是,拿著amd64版的Karmic盤,開始在T400s上安裝。

    基本系統(tǒng)的安裝很順利,跟著提示一路走完,Karmic就能夠boot并正常login了,so far so good。不過登錄進去之后,無線網卡不工作,只有有線連接,這是怎么回事?用lspci一看:
    • 00:00.0 Host bridge: Intel Corporation Mobile 4 Series Chipset Memory Controller Hub (rev 07)
    • 00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
    • 00:02.1 Display controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)
    • 00:03.0 Communication controller: Intel Corporation Mobile 4 Series Chipset MEI Controller (rev 07)
    • 00:03.3 Serial controller: Intel Corporation Mobile 4 Series Chipset AMT SOL Redirection (rev 07)
    • 00:19.0 Ethernet controller: Intel Corporation 82567LM Gigabit Network Connection (rev 03)
    • 00:1a.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 03)
    • 00:1a.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 03)
    • 00:1a.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 03)
    • 00:1a.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 03)
    • 00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 03)
    • 00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 03)
    • 00:1c.1 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 2 (rev 03)
    • 00:1c.2 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 3 (rev 03)
    • 00:1c.3 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 4 (rev 03)
    • 00:1d.0 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 03)
    • 00:1d.1 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 03)
    • 00:1d.2 USB Controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 03)
    • 00:1d.7 USB Controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03)
    • 00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 93)
    • 00:1f.0 ISA bridge: Intel Corporation ICH9M-E LPC Interface Controller (rev 03)
    • 00:1f.2 SATA controller: Intel Corporation ICH9M/M-E SATA AHCI Controller (rev 03)
    • 00:1f.3 SMBus: Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 03)
    • 03:00.0 Network controller: Realtek Semiconductor Co., Ltd. Device 8172 (rev 10)
    • 04:00.0 Memory controller: Intel Corporation Turbo Memory Controller (rev 11)
    • 05:00.0 SD Host controller: Ricoh Co Ltd Device e822 (rev 01)
    • 05:00.1 System peripheral: Ricoh Co Ltd Device e230 (rev 01)
    注意03:00.0這一行,竟然是Realtek的8172,對應Windows下的型號是8192,Lenovo什么時候把T400s原本的無線芯片配置(Intel WiMAX/WiFi Link 5xxx)換成了Realtek 8172的?難怪沒有無線,這塊網卡的驅動還沒有被Linux內核直接支持,需要手工安裝。網上搜到很多方案,比如ndiswrapper+win版驅動等等,但這個Ubuntu LaunchPad上的方案[1]看上去最靠譜,還等什么,開工吧。
    • 首先下載驅動: http://launchpadlibrarian.net/34090404/rtl8192se_linux_2.6.0010.1012.2009_64bit.tar.gz
    • 解壓后進入rtl8192se_linux_2.6.0010.1020.2009_64bit子目錄,make
    • 成功后在HAL/rtl8192下能夠找到r8192se_pci.ko文件,cp至/lib/modules/`uname -r`/kernel/drivers/net/wireless/
    • 然后將固件相關文件,即firmware/RTL8192SE目錄,cp至/lib/firmware/`uname -r`/
    • 執(zhí)行命令depmod -a重新掃描module依賴關系
    • 執(zhí)行命令modprobe r8192se_pci加載該module,這一步完成以后NetworkManager就可以搜到無線網絡并進行連接了
    好了,到此最大的攔路虎已經消滅,開始裝別的軟件吧。就在這時,新的問題出現(xiàn)了,dmesg可以看到重復出現(xiàn)的如下報錯/警告信息:
    • [ 483.431670] DMA: Out of SW-IOMMU space for 9100 bytes at device 0000:0e:00.0
    • [ 483.435783] DMA: Out of SW-IOMMU space for 9100 bytes at device 0000:0e:00.0
    • [ 483.439867] DMA: Out of SW-IOMMU space for 9100 bytes at device 0000:0e:00.0
    • ...
    通常經過數(shù)分鐘的積累,系統(tǒng)就死機了,只剩下CapsLock鍵上的小燈不停閃爍,典型的kernel panic? 根據網友提供的線索[2],由于Intel的64位實現(xiàn)雖是參考AMD64但細節(jié)有差異,所以在實際內存大于等于4G的環(huán)境下,某些未考慮到該特性的代碼會leak memory,怎么辦?增加內核啟動參數(shù)mem=4G iommu=off,一方面限定內存范圍,另一方面關閉IOMMU。

    經過測試,這樣的配置下系統(tǒng)和無線網絡都能夠持續(xù)穩(wěn)定運行。系統(tǒng)安裝到此,一個大的里程碑達成,唯一的缺憾是每次kernel升級,可能還需要手工做一些工作,且暫時不能既開無線又開4G以上內存,不過這樣總好過沒有無線,或者繳槍投降,不是嗎?本想多罵幾句Lenovo,好好的Intel芯片不用,要換Realtek,但轉念一想,這已是既成事實,而且看到很多其他型號的ThinkPad,如R500、SL400等,也有不少用上了Realtek的這款無線芯片,讓我們一起期待穩(wěn)定可靠的驅動最終被Linux內核支持的那一天吧。

    參考鏈接:
    [1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/401126
    [2] http://lwn.net/Articles/91870/

    posted @ 2009-12-26 11:14 laogao 閱讀(1411) | 評論 (2)編輯 收藏

    到處吹噓Scala很長時間了,卻一直沒有在自己的blog上增加過任何相關內容,今天就來補一補。當然,Scala的基本特性就不多廢話了,網上已經有相當多的資料,如果懶得google,只想看完本文,那么你只需要知道它是一門以JVM為目標運行環(huán)境的靜態(tài)編程語言(當然,Scala官方也有.NET版,但已不是其重點),同時具備面向對象和函數(shù)式編程語言的特點。本文將通過一個簡單的示例,展示Scala的FP能力,其中十分heavy的用到了implicit隱式轉換和模式匹配。

    代碼是從guithub的gist上抄的,簡單改了改,原始代碼見: http://gist.github.com/66925

    import scala.reflect.Manifest
      
    def simpleName(m:Manifest[_]):String 
    = {
      val name 
    = m.toString
      name.substring(name.lastIndexOf(
    '$')+1)
    }
      
    trait Num
    final class Succ[Pre<:Num] extends Num
    final class _1 extends Num
    type _2 
    = Succ[_1]
    type _3 
    = Succ[_2]
    type _4 
    = Succ[_3]
     
    case class Move[N<:Num,A,B,C]()

    implicit def move1[A,B,C](implicit a:Manifest[A], b:Manifest[B]) : Move[_1,A,B,C] 
    = {
      System.out.println(
    "Move from " + simpleName(a) + " to " + simpleName(b))
      
    null
    }
     
    implicit def moveN[P
    <:Num,A,B,C](implicit m1:Move[P,A,C,B], m2:Move[_1,A,B,C], m3:Move[P,C,B,A]) : Move[Succ[P],A,B,C] = null
      
    def run[N
    <:Num,A,B,C](implicit m:Move[N,A,B,C]) = null
      
    case class Left()
    case class Center()
    case class Right()
      
    run[_3,Left,Right,Center]

     

    這段代碼解決的是經典的漢諾塔問題,通過一根中柱,將左柱上64個大小依次疊加的圓盤全部移動到右柱,要求整個過程中每次只能移動一個圓盤,且每個圓盤只能獨立占據一根柱子或是疊加在比自身更大的圓盤上。

    簡單分析一下就知道,這是一個遞歸問題(FP的英雄特長):

    • 當只有1個圓盤時,不用通過中柱,直接可以從左柱移動到右柱;
    • 當有2個圓盤時,將小盤移動到中柱,剩下的大盤移動到右柱,再從中柱把小盤移動到右柱;
    • 當有3個圓盤時,先移動2個圓盤到中柱,再移動大盤到右柱,再移動2個圓盤到右柱;
    • ...

    很容易發(fā)現(xiàn)一個pattern,那就是移動N(N>1)個圓盤,可以通過以下三個步驟:

    1. 移動N-1個圓盤,從左柱到中柱;
    2. 移動剩下的1個圓盤,從左柱到右柱;
    3. 移動N-1個圓盤,從中柱到右柱。

    在解釋代碼之前,先說說Scala的implicit隱式轉換,這是一個非常powerful的idea,當Scala編譯器發(fā)現(xiàn)類型不匹配,它不會直接fail,而是嘗試從代碼中指定的,在scope內的implicit轉換定義,來替換問題對象或表達式以滿足類型要求,當然,為了避免歧義,同一時刻Scala需要找到唯一的一個滿足條件的implicit定義。

    我們的代碼首先定義了一個取得友好類名的方法,不去深究它,然后定義了一個正整數(shù)的序列,也不去深究它了,你只需要當作他們是正整數(shù)就好,接觸過FP的同學應該對此類定義不陌生,接下來定義了如下3個支持implicit傳入參數(shù)的方法:

    1. implicit def move1[A,B,C](implicit a:Manifest[A], b:Manifest[B]) : Move[_1,A,B,C]
    2. implicit def moveN[P<:Num,A,B,C]( implicit
      m1:Move[P,A,C,B],
      m2:Move[_1,A,B,C],
      m3:Move[P,C,B,A]
      ) : Move[Succ[P],A,B,C]
    3. def run[N<:Num,A,B,C](implicit m:Move[N,A,B,C])

    含義分別是:

    1. 當需要Move[_1,A,B,C]值時,可以找我?guī)兔?我有個side-effect,那就是輸出移動指令);
    2. 當需要Move[Succ[P],A,B,C]時,可以找我?guī)兔Γ?/li>
    3. 運行我,我接受Move[N,A,B,C]類型的參數(shù)。

    簡單說明:Scala用[]表示類型參數(shù),區(qū)別于Java的<>,另外,Scala的類型聲明在變量/函數(shù)定義之后。Move[_,A,B,C]的含義是通過C,從A移動圓盤到B。

    我們來模擬運行一下,為了演示效果,用一個中等復雜的數(shù)目,3個圓盤,從Left移動到Right。

    run[_3,Left,Right,Center],對應Move[Succ[_2],Left,Right,Center],于是展開成三個Move:

    Move[_2,Left,Center,Right]即Move[Succ[_1],Left,Center,Right]
    Move[_1,Left,Right,Center]
    Move[_2,Center,Right,Left]即Move[Succ[_1],Center,Right,Left]

    然后繼續(xù)展開Move[_2,Left,Center,Right]和Move[_2,Center,Right,Left],得到:

    Move[_1,Left,Right,Center]
    Move[_1,Left,Center,Right]
    Move[_1,Right,Center,Left]
    --------------------------
    Move[_1,Left,Right,Center]
    --------------------------
    Move[_1,Center,Left,Right]
    Move[_1,Center,Right,Left]
    Move[_1,Left,Right,Center]

    這個時候已經全部都匹配Move[_1,A,B,C],于是我們很容易得到以下輸出:

    Move from Left to Right
    Move from Left to Center
    Move from Right to Center
    Move from Left to Right
    Move from Center to Left
    Move from Center to Right
    Move from Left to Right

    希望本文能帶給Scala初學者一些感性認識和啟發(fā)。


    posted @ 2009-11-23 19:20 laogao 閱讀(2614) | 評論 (3)編輯 收藏


    前兩天看到網友關于鐵觀音泡法的留言,接受建議,收了只手繪青花瓷蓋碗,和一只公杯:



    家里還有些去年的秋茶存貨,開始練習用蓋碗,右手的拇指、食指和中指被燙到不行,據說燙出一層老繭就好了,我覺得應該不至于那么夸張,慢慢來,挺好玩的。

    posted @ 2009-10-18 11:57 laogao 閱讀(415) | 評論 (0)編輯 收藏


    最近圍觀一本JavaScript的書籍引發(fā)的爭論,一不小心碰到一篇講編程語言類型系統(tǒng)劃分的帖子,回想起當年還在公司內部的Tech Session上主講過這個話題,不過只涉及到靜態(tài)/動態(tài)、強類型/弱類型,遠沒有這位仁兄總結的那么全面。

    原文鏈接
    http://www.reddit.com/r/programming/comments/63tnv/bruce_eckel_33104_im_over_it_java/c02qx55

    不多廢話,直入正題:

    [維度一] Static vs Dynamic Typing
    靜態(tài)類型和動態(tài)類型,區(qū)分的關鍵點為編譯期或運行期確定類型:靜態(tài)類型在編譯期確定,動態(tài)類型在運行期確定。
    靜態(tài)類型代表 Java、Scala、Haskell
    動態(tài)類型代表 Ruby、Python、Erlang

    [維度二] Strong vs Weak Typing
    強類型和弱類型,區(qū)分的關鍵點為運行時是否自動轉換到與實際類型不符的類型:強類型要求手工類型轉換,弱類型自動轉換。
    強類型代表 Java、Scala、Python
    弱類型代表 C、Assembly、JavaScript

    [維度三] Latent (Implicit) vs Manifest (Explicit) Typing
    隱式類型和顯式類型,區(qū)分的關鍵點為是否要在源碼中聲明類型:隱式類型不需要,顯式類型需要。
    隱式類型代表 Haskell、Erlang、Python
    顯式類型代表 C、C++、Java

    [維度四] Nominal vs Structural Typing
    名義類型和結構類型,區(qū)分的關鍵點為類型判定是根據標稱還是根據內容:名義類型根據標稱,結構類型根據內容。
    名義類型代表 C、C++、Java
    結構類型代表 Haskell、Erlang、Python

    關于JavaScript書籍的爭論,請移步如下網址:
    1- 網友Hax的"炮轟"帖 http://www.javaeye.com/topic/474725
    2- 周愛民(aimingoo)的MSN空間 http://aimingoo.spaces.live.com/blog/
    3- 火星常駐JE辦事處相關帖 http://mars.group.javaeye.com/group/topic/14325

    posted @ 2009-09-28 19:19 laogao 閱讀(1130) | 評論 (0)編輯 收藏


    這個周末又去收了一只紫砂,這下除了龍井,我平常喝的所有品種的茶,都有了各自專用的壺。貼個"全家福":


    從左到右依次為鐵觀音、高山烏龍、熟普洱和生普洱。目前只有第一只養(yǎng)成了,其余的三只還得多花些時間和心思呢。


    posted @ 2009-08-30 11:58 laogao 閱讀(492) | 評論 (1)編輯 收藏


    我曾經一度是Twitter重度用戶,直到上周五,@laogao這個賬號,被Twitter無端禁言了。被禁時,我follow 133人,被241人follow,共2260歷史推。

    Follow我的推友們,以及我經常@的兄弟姐妹,抱歉了,尤其那些被我"忽悠"上Twitter的朋友。當你訪問
    作為一個喜歡Twitter的簡單、直接的人,我從來都很認真的對待我的每一推,尊重他人的意見,善待每個@我的朋友,也在現(xiàn)實世界的朋友圈中推薦大家使用這個服務。但從今天開始,我將不再向人推薦Twitter,也無法確定什么時候@laogao這個賬號能夠被reinstate或者再次被suspend,各位關注我的朋友,請移步
    https://friendfeed.com/laogao

    對那些仍然天真的以為Twitter封號肯定是用戶自己的問題的朋友,我很理解你們的想法,當初我看到別人被封時,也是這么想的。

    各位推友保重!


    posted @ 2009-07-06 21:15 laogao 閱讀(522) | 評論 (0)編輯 收藏


    周末去敗了只全新的紫砂回來,宜興紅泥的,專門用來泡臺灣高山烏龍。用之前,當然少不了開壺的過程,雖然比較耗時,但也挺有趣,在這里做個記錄。

    首先將新買的紫砂壺用清水洗凈,浸泡一整天,其間換水2~3次,去除掉殘余的泥土、灰塵等。然后放入鍋內,加入清水煮上1個小時,繼續(xù)消毒。


    接下來,放置一邊,冷卻后,取老豆腐半塊,放入清水中,再煮1小時,去火氣。


    第三步,用清水洗凈,根據今后用這個紫砂壺泡什么類型的茶,選用單次用量的2~4倍茶葉,加清水,煮沸后,待茶汁完全浸出,撈起茶葉殘渣,繼續(xù)用茶湯煮上1個小時。


    出鍋。


    這是成品,可以正式開始享用了:


    現(xiàn)在開始,從頭養(yǎng)我的第二只紫砂,細細體味那份安靜和從容,讓每日忙碌和疲憊的身心,有一個休息和平復的空間。

    posted @ 2009-06-08 22:07 laogao 閱讀(510) | 評論 (1)編輯 收藏

    各位童鞋們過節(jié)好啊,今天給大家?guī)淼氖窃赽ash中DIY制表符鍵自動補全。

    bash是大多數(shù)主流Linux發(fā)行版的默認shell,如果你用過bash,那么一定會接觸到<tab>鍵自動補全的這個方便的功能,當你一個命令的頭幾個字符敲下去,按下<tab>,如果以此開頭的命令只有1個, bash會直接幫你補全,如果有多個,則會有相應提示,而在后續(xù)的參數(shù)輸入時,也會帶有默認的自動補全文件路徑的功能。當你習慣了<tab>,很難想象沒有自動補全的日子會是什么樣子。

    bash默認支持常見的補全功能,如可執(zhí)行命令、文件路徑等,如果安裝了bash-completion包,甚至連chown, man, svn, ssh這些也會帶有相應的自動補全提示,而不是單純的文件路徑補全。好奇的你一定想知道是怎么實現(xiàn)的吧,其實很簡單,我們舉個例子來說:

    假定你有一個命令,叫做abc,它又有自己的子命令,分別是build_all、compile和update,其中compile這個子命令需要的參數(shù)必須來自project.list這個文件中列出的值,怎么實現(xiàn)<tab>自動補全,讓bash知道abc的合法子命令和compile子命令的合法參數(shù)列表呢?

    在你的~/.bashrc或者任何一個啟動bash時會被執(zhí)行的文件中加入下面的代碼:

    function _abc() {
        COMPREPLY=()
        local cur=${COMP_WORDS[COMP_CWORD]};
        local com=${COMP_WORDS[COMP_CWORD-1]};
        case $com in
        'abc')
            COMPREPLY=($(compgen -W 'build_all compile update' -- $cur))
            ;;
        'compile')
            local pro=($(awk '{print $1}' project.list))
            COMPREPLY=($(compgen -W '${pro[@]}' -- $cur))
            ;;
        *)
            ;;
        esac
        return 0
    }

    complete -F _abc abc

    手動載入一下,或者重啟bash,再敲abc命令,即可自動補全子命令,如果子命令是compile,還能自動補全相應的參數(shù)值。我們來簡單分析一下這段代碼。首先我們定義一個function _abc,這個函數(shù)先清空自動補全列表,根據當前輸入位置前一個token判斷目前需要自動補全的語境,如果是abc,則將自動補全內容設置為'build_all'、'compile'和'update',如果是'compile',則將project.list文件內容輸出到補全列表,當然,這里我們也可以換成其他任何必要的方式。最后我們通過complete -F _abc abc將這段自動補全邏輯注冊到abc這個主詞上。這樣當我們敲abc時,后續(xù)內容就能自動補全了。

    Enjoy!

    posted @ 2009-06-01 00:11 laogao 閱讀(4086) | 評論 (1)編輯 收藏


    本來是手寫的一張草稿,清理臺面的時候,正要扔,發(fā)現(xiàn)內容還有點意思,干脆吧,開個隨筆記錄一下,備忘,說不定還能幫到別人。

    在我們日常生活和工作中,尤其瀏覽含有中文的網站,時常會為亂碼問題犯愁,一些天生Unicode支持不到位的編程語言和軟件更是加重了這個現(xiàn)象。雖說已經是2009年了,我們時不時還是能碰到一些明顯腦殘的code,吐出一堆亂碼,不論你用選什么字符集,似乎都無法還原最初的中文。比如"?·2",或者同一個頁面,無法用同一個字符集顯示,任何一種字符都至少有一部分顯示不正確,不是這兒就是那兒。

    首先科普一下UTF-8。UTF-8是Unicode所有字符編碼實現(xiàn)中,應用范圍最廣的一個,最大的特點是兼容ASCII碼,在此基礎上,通過1..4個byte來表示每一個Unicode字符。它是怎么做到的?其實很簡單,看首個byte:
    00000000 ~ 01111111 : 0~127 (ASCII, 單個byte) 表示Unicode范圍\u0000 ~ \u007F
    11000000 ~ 11011111 : (2個1打頭,所以2個byte) 表示Unicode范圍\u0080 ~ \u07FF
    11100000 ~ 11101111 : (3個1打頭,所以3個byte) 表示Unicode范圍\u0800 ~ \uFFFF
    11110000 ~ 11110111 : (4個1打頭,所以4個byte) 表示Unicode范圍\u10000 ~ \u10FFFF

    除了單個byte這個case,其他情況下,后續(xù)的byte均以10打頭。這些打頭的bit:10、110、1110、11110,都不作為具體編碼的一部分參與真正Unicode編碼的計算。所以1..4個byte,其有效位數(shù)分別為:7、11、16、21,因此才有了\u007F、\u07FF、\uFFFF這樣的臨界值,且4個byte的空間還有富余。

    有了這個基礎知識,我們就來具體看看這個"已"字,是怎么被UTF-8表示的,以及為什么處理不當?shù)拇a會最終輸出"?·2"。

    "已"字,用Unicode表示法,是\u5DF2,按照2個byte拆開成二進制表示:
    01011101 11110010
    如果用UTF-8編碼,采用1110???? 10?????? 10??????這個格式,?號部分填入上述01011101 11110010,得到
    11100101 10110111 10110010 這樣3個byte。

    好了,這個時候腦殘代碼出現(xiàn),假如它不認識UTF-8,那么他會看到這樣3個前后沒有關聯(lián)的byte,在西歐Latin-1字符集(即ISO 8859-1)中,它們分別表示"?"、"·"、"2"這3個字符。如果把它們分別再按照UTF-8編碼,就成了:
    11000011 10100101 11000010 10110111 11000010 10110010
    完美的UTF-8編碼,只不過,這完全是假象,只能通過非常規(guī)手段才能恢復它原本的樣子。


    posted @ 2009-05-05 19:24 laogao 閱讀(1159) | 評論 (0)編輯 收藏


    上周在北京參加QCon大會,回來以后一直沒有成塊的時間,把一些之前只是通過Twitter分享出來的信息匯總整理出來。已經有不少朋友都在各自的博客上記錄了大會感聞,所以我還是抓緊些吧,不然真要成沒有營養(yǎng)的廢話了。

    QCon這次是首次進入中國,我有幸得以抽身參加。大會為期三天,由InfoQ中文站組織策劃,包括 @taiwen 在內InfoQ中文站只有3個人,這是我之前沒有想到的,感謝他們和志愿者的辛勤勞動,使得這次大會得以順利舉行。大會嘉賓包括了國內外許多大名鼎鼎的牛人,比如前TSS和后來InfoQ的主創(chuàng)Floyd Marinescu、ThoughtWorks首席科學家Martin Fowler、Spring之父Rod Johnson、eBay架構師Randy Shoup、《硝煙中的Scrum和XP》作者Henrik Kniberg、《大道至簡》作者周愛民、支付寶數(shù)據庫架構師馮大輝 @Fenng 等。

    大會第一天,上午和下午都安排了Martin Fowler的session,分別是DSL和Ruby,雖然內容算不上特別新,但幻燈片準備很到位,而大師就是大師,思路清晰,言簡意賅,尺度分寸拿捏的很好。唯一感覺可能是大家都比較含蓄,或者熱身不夠,溝通和對話的環(huán)節(jié)顯得不是很活躍,除了買書簽名的,到后面Dojo的創(chuàng)始人Dylan Schiemann講Open Web,氣氛就開始暖和一些了。至于Amazon的Jeff Barr,不少朋友也都說了,基本上就是來打廣告的,可惜QCon北京的贊助商中,沒有發(fā)現(xiàn)Amazon。晚上的沙龍,國際講師唱主角,分享關于軟件開發(fā)趨勢的見解。

    大會第二天,可能是最精彩的一天,尤其是下午 @Fenng 主持的網站架構這個Track。上午的大戲是Rod Johnson,不過也許是大家期望比較高,反倒是沒覺出特別出彩的地方,Rod特別強調Simplicity和Lean,同時通批了一頓Java EE,不過把Tomcat作為simplicity和lean的代表舉例,似乎大家都不是特別買賬。后來才知道原來Tomcat 90%的commit都來自SpringSource,而稍后SpringSource會在此基礎上推出功能更豐富的Spring tc server,以及(我猜)Spring 3.0。接下來eBay的Randy Shoup,帶來了一場頗為精彩的演講。下午來自支付寶、豆瓣網、網易有道和優(yōu)酷網的架構師們共同創(chuàng)造了本次QCon大會最受歡迎的半天,尤其是豆瓣的 @hongqn ,內容相當務實、精彩、有貨。說到這,插句題外話,如果沒記錯, @hongqn 是這次大會中唯一一位使用Mac的國內講師,國際講師用Mac的好像也只有Martin Fowler (如果說的不對還請同學們指正)。到了這個時候,國際講師們漸漸淡出,場子交給了國內的講師們,會場氣氛也更加熱鬧和隨意起來,包括晚上的沙龍。

    大會第三天,從日程上看,并沒有特別重量級的session,似乎除了云還是云,不過如果因此選擇不參加的話,可能就會錯過了兩場很不錯的演講,分別是高煥堂的"提高架構質量的10個觀點"和周愛民的"我之于架構的主要觀點"。高煥堂的演講讓人耳目一新,明顯感覺來自臺灣的專家,比大陸的專家,對中國傳統(tǒng)文化,有更深的理解和思考,他的"序"、"容"、"易"三角,讓人印象深刻,另外他還對目前我們軟件產業(yè)的結構性問題提出了批評。而周愛民的演講同樣很有深度,尤其是后面說到架構師的決策作用時,很引起我的共鳴:"架構師不需要讓所有人都理解你的每一個決定和這些決定最終要達成的目標,去做就是了。"(可能原話不是這么說的,但意思是這樣) 也許有些朋友覺得這兩個session虛幻的成分比較重,但對我來說,收益頗豐,因為很多觀點,都能夠在我之前經歷的一些項目和設計中找到支撐。至于其他幾講,關于云計算的,確實提不起什么興趣,尤其是Azure,干的要命(小插曲: 現(xiàn)場演示一段ASP.NET代碼,至少修改和重編譯了3次才搞定)。大公司帶著推銷產品/服務的目的來參加開發(fā)會議,有點浪費大家的時間和銀子啊。

    最后說說大會的組織相對還有待提高的地方:
    1- 第一天入場時,志愿者的引導不是很到位,報到的地方和其他展臺秩序稍顯混亂。
    2- 同聲傳譯據說質量不高,白天沒用,但是周圍的朋友在用,耳機漏音比較嚴重,稍影響一些效果,晚上直接通過擴音設備翻譯,就很明顯的感覺到脫節(jié)了。
    3- 午餐和沙龍的地方,顯得還是小了些,而且中午所有人都集中在一個時間去,不論排隊打飯還是找位置,都比較吃力,以至于第二天中午有一小撮腦筋比較活絡的同學,提前下課去打飯吃。
    4- 現(xiàn)場網絡環(huán)境比較差,害我只能用手機上twittai。

    總的來說,這次的QCon還是挺不錯的,希望明年的QCon會繼續(xù)在中國舉辦,更多的嘉賓,更豐富的內容,更有深度的主題,更加精彩。


    posted @ 2009-04-17 00:36 laogao 閱讀(616) | 評論 (0)編輯 收藏


    其實很早就聽說有這個東東,只是一直沒玩過,最近公司調整PC服務器,正好找個空閑實戰(zhàn)了一把。基本的配置步驟如下(時間有限,挑簡單的說,假定你要Wake-on-LAN的機器是Windows,控制服務器是Linux):

    [被控制方]
    1- 正常開機進入BIOS設置
    2- 找到Wake-on-LAN的選項enable它(如果是Dell的機器這個選項叫Remote Wake Up)
    3- 進入OS,在需要配置Wake-on-LAN的網絡端口的配置項中(網絡連接屬性->配置->電源管理),選擇允許此設備使計算機脫離待機狀態(tài)
    4- 記錄網卡的MAC地址
    5- 正常關機
    // 如果被控制方是Linux/Ubuntu,OS的配置方法參考鏈接[4]

    [控制方]
    1- 安裝wakeonlan,可以選擇(如果有的選) apt-get install wakeonlan,或者從鏈接[3]獲取源碼手工安裝(是Perl寫的)
    2- 通過wakeonlan+MAC地址的命令行方式控制需要wake up的機器,如 wakeonlan 01:23:45:67:89:AB
    // 更高級的用法包括編寫腳本,添加到cron,以及通過-f指定一個包含多個MAC地址的文件同時操作等

    [基本原理]

    Wake-on-LAN的相關通信協(xié)議位于OSI七層模型中的數(shù)據鏈路層,比IP需要的網絡層還要低一層,在局域網范圍發(fā)送廣播,數(shù)據包格式為:
    FF FF FF FF FF FF $MAC*16
    即 FF FF FF FF FF FF然后重復16次對方的MAC地址,被戲稱為"magic packet"。

    配置成功后,只要被控制方正常關機、掛起、休眠,且環(huán)境始終不掉電,任何時候在局域網中廣播"magic packet",指定網卡的機器就可以被喚醒。

    鏈接:

    [1] http://en.wikipedia.org/wiki/Wake-on-LAN
    [2] http://en.wikipedia.org/wiki/OSI_model
    [3] http://gsd.di.uminho.pt/jpo/software/wakeonlan/
    [4] http://ubuntuforums.org/showthread.php?t=234588


    posted @ 2009-03-18 20:03 laogao 閱讀(1130) | 評論 (0)編輯 收藏

    僅列出標題
    共34頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 亚洲国产精品日韩在线| 无码人妻久久一区二区三区免费丨 | 日本人护士免费xxxx视频| 久久国产乱子免费精品| 五月天婷婷精品免费视频| 亚洲色精品VR一区区三区| 久久久无码精品亚洲日韩按摩| 亚洲成A人片在线观看无码3D| 成年丰满熟妇午夜免费视频| 亚州免费一级毛片| 人人玩人人添人人澡免费| 久久99久久成人免费播放| 黄页网站在线观看免费| 亚洲a∨无码一区二区| 中国亚洲呦女专区| 亚洲国产精品久久丫| 亚洲色偷偷av男人的天堂| 久久精品国产亚洲AV麻豆王友容 | 狼人大香伊蕉国产WWW亚洲| 亚洲一区电影在线观看| 亚洲精品中文字幕乱码影院| 亚洲日本中文字幕| 亚洲国产天堂久久综合网站| 久久精品亚洲综合专区| 久久精品亚洲综合| 亚洲爱情岛论坛永久| 亚洲天堂男人天堂| 亚洲黄色在线观看视频| 久久久久亚洲精品无码蜜桃| 噜噜噜亚洲色成人网站∨| 97亚洲熟妇自偷自拍另类图片| 亚洲男人第一av网站| 亚洲精品美女在线观看| 亚洲福利一区二区精品秒拍| 亚洲国产韩国一区二区| 亚洲一卡2卡3卡4卡国产网站| 亚洲午夜无码久久久久小说| 亚洲高清毛片一区二区| 国产成人不卡亚洲精品91| 九九综合VA免费看| 99精品免费视品|