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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

        怎么讓你對象跟Array或者Hash一樣,可以使用[ ]操作符來獲取屬性值或者賦值? 問題其實就是如何定義index操作符,在Ruby中可以這樣做:

    class Message
       def initialize
        @props
    =Hash.new
       end
       def [](key)
          @props[key]
       end
       
       def []
    =(key,value)
          @props[key]
    =value
       end 
    end

    m
    =Message.new

    m[
    0]=1
    p m[
    0]

    m[:a]
    ="hello"
    p m[:a]

            注意方法簽名。

    posted @ 2010-02-01 16:29 dennis 閱讀(1053) | 評論 (2)編輯 收藏

        通訊層的改造使用了google protocol buffers作為協議體,效率還是挺讓人滿意。編輯以.proto結尾的語法文件,沒有語法高亮很不習慣,幸好protocolbuf提供了vim和emacs的擴展。下載非win32版本的protocol buffers的壓縮包里,解壓后有個editors目錄,里面就是兩個擴展文件:proto.vim是提供給vim愛好者的,而protobuf-mode.el就是提供給emacs控的。
        安裝很簡單,將protobuf-mode.el加入你的Emacs加載路徑,然后在.emacs配置文件里加上這么兩行代碼:
    (require 'protobuf-mode)
    (setq auto-mode-alist  (cons '(".proto$" . protobuf-mode) auto-mode-alist))
        require是不夠的,第二行將自動把.proto結尾的打開文件以protobuf-mode模式運行。運行時截圖:

             
        
        工具欄上多了個ProtocolBuffers菜單,有一些簡單功能,如注釋某段代碼,代碼跳轉等等。

    posted @ 2010-01-20 11:47 dennis 閱讀(1747) | 評論 (1)編輯 收藏

        Java Memcached Client——Xmemcached的新版本1.2.2正式released。這個小版本最主要的改進是允許遍歷所有在memcached中的key,這是通過stats協議實現,具體信息可以看這里

    1.2.2的主要改進如下:

    1、添加一個KeyIterator接口,這個迭代器接口用于遍歷memcached中的所有key。由于是基于stats協議實現的,因此這個迭代過程并非高效,請慎重使用,并且迭代返回的key也并非實時,而是當前快照。KeyIterator目前僅在文本協議下可用,使用例子如下:
    MemcachedClient client=
    KeyIterator it
    =client.getKeyIterator(AddrUtil.getOneAddress("localhost:11211"));
    while(it.hasNext())
    {
       String key
    =it.next();
    }

    2、添加一個新類net.rubyeye.xmemcached.Counter,用于封裝原始的incr/decr方法,提供類似AtomicLong原子類的API方便計數器的使用:
    Counter counter=client.getCounter("counter",0);
    counter.incrementAndGet();
    counter.decrementAndGet();
    counter.addAndGet(
    -10);

    3、修復BUG,如issue 71,issue 72,issue 70 etc.
    4、聲明廢棄 net.rubyeye.xmemcached.buffer.BufferAllocator,現在哪怕你設置了這一屬性也將被忽略,這個類將在以后的某個版本中移除
    5、升級yanf4j到1.1.0

       Wiki用戶指南都已經更新,歡迎使用并反饋任何建議或者bug報告。

    項目主頁:http://code.google.com/p/xmemcached/
    下載地址:http://code.google.com/p/xmemcached/downloads/list

    posted @ 2010-01-12 18:13 dennis 閱讀(4502) | 評論 (7)編輯 收藏

       利用這個小工具,可以生成豆瓣上記錄的每年讀的書,看的電影,聽的音樂。我的記錄,看過的書


    看過的電影:



    posted @ 2010-01-11 09:26 dennis 閱讀(832) | 評論 (1)編輯 收藏

        《Joel on software》談到所謂抽象漏洞,簡單來說就是抽象能解決90%的一般情況,而其他10%的情況你仍然需要跟抽象層面下的細節打交道,也就是抽象本身只能減少你的工作時間,而無法減少你的學習時間。道理簡單,舉幾個例子。
        以SQL語言為例,SQL是所謂說明性的語言,你所寫的語句只是一條what,而how是如何做的無需關心,但是真的無需關心嗎?事實上是不行,低效的SQL語句對數據庫的性能損害非常大,作為程序員你需要知道SQL這個抽象層次下的部分內容,知道數據庫是怎么執行這些語句,知道如何去避免一些最差實踐。再比如分布式調用希望做到能跟本地調用一樣的透明,但實際上還是不行的,網絡的不確定性讓RPC調用根本無法做到的類似本地調用那樣的透明性。隱藏在RPC這個抽象層次下的網絡通信細節,你不能不去care。抽象能幫你解決大多數情況,提高你的工作效率,但是剩下的一公里問題,仍然需要你花費更多時間和精力去了解并解決。這事實上也是一個優秀程序員跟普通程序的差別之一,學習了java編程,知道了collection集合框架,不代表你無需再去學習數據結構和算法。
        Joel將這個現象稱為漏洞抽象。事實上,我并不認為這是抽象本身的漏洞,這反而是軟件的本質復雜性在作怪,抽象只能去化簡偶然復雜性,例如函數、類、模塊化等手段去組織代碼,而本質的復雜性是無法避免的。舉個不是那么恰當的例子,例如我們有這么個方法,傳進一個參數list,我們要遍歷list做一些事情,(我知道用迭代器才是正途,先允許我犯這么個錯誤),你可能這么寫:

        public void doSomething(List<String> list){
            
    for(int i=0;i<list.size();i++){
                String str
    =list.get(i);
                
    //do something
            }
        }

       這樣的代碼我估計在1.5有for語句增強之前不少人都寫過,這樣的代碼有什么問題呢?考慮下list是ArrayList和LinkedList這兩種情況,List是鏈表的抽象,但是鏈表的實現形式卻是可以用數組或者引用鏈接,鏈表的實現形式不同,List.get(index)這個方法的效率會很成問題。我們都知道ArrayList適宜于隨機訪問,而LinkedList方便插入添加移除,在這個doSomething方法中,顯然隨機訪問的訴求大于添加移除。在通常情況下,這樣寫都不會成為問題,但是如果這個doSomething方法被經常調用,并且list是一個LinkedList的情況下,這個方法就很可能成為性能瓶頸。我們寄希望于List這個接口可以讓我們無需關心list的具體實現,然而現實是你仍然需要知道各種實現的區別和原理,這就是所謂漏洞抽象。這并非抽象的無力,你肯定不會反對“針對接口編程”這條原則,而是抽象本身解決不了本質復雜性,這里的本質復雜性就是鏈表的實現方法,隨機訪問與添加移除的平衡問題。在我們無法找到更好的鏈表實現方法來平衡隨機訪問與添加移除之前,這個本質復雜性就不是抽象能夠解決的。
        同樣的現象出現在String、StringBuffer、StringBuilder的使用上,字符串的實現方法你仍然需要知道,這是繞不過去的本質復雜性。這里談到的本質復雜性根本上也是現實世界的本質復雜性的反映,扯遠些就更虛了。就現實的工作情況來看,不知道其他人有沒有這樣的經驗,就是在自以為解決某個難題的時候,最后卻發現難題以另一個面目出現,問題本身沒有得到解決,只是以更好的方式被掩蓋了。
       無論是過程式、OO、函數式編程,解決的問題都是為了更好的抽象,抽象是個好東西,但是抽象無法解決那些本質性的問題,因此《人月神話》斷言沒有銀彈,我們仍然需要跟狼人作戰。

        
      



    posted @ 2010-01-10 20:25 dennis 閱讀(2956) | 評論 (4)編輯 收藏

        你不得不承認,寫代碼的效率跟周期性的情緒相關。以我為例,總存在著周期性的情緒波動,那段時間內基本不想寫代碼,上班就是收收郵件,看看網頁,遺憾的是每個月都有那么幾天。事實上,我認為在一天8小時的工作中,能有2、3個小時能達到忘我狀態的工作,那已經是非常不錯的事情。如果你是程序員,你肯定知道我說的忘我狀態是什么。我在這里說的局限了,其實任何工作都可能進入這種忘我狀態,這種狀態下你的思維非常活躍,全神貫注,哪怕有人跟你說話你也會聽而不聞,這種狀態在你讀一本非常有趣的小說的時候也會出現。這種狀態下的你效率會非常高,例如我前段時間內就在一周內寫了13000多行代碼,600多個測試用例,為我們的系統重新實現了一個通信層。

       看過很多討論程序員工作效率的文章,據稱研究表明要進入這種狀態是至少要15分鐘的時間,因此頻繁地打斷工作會阻礙你的工作效率,畢竟醞釀情緒也是需要時間的嘛。我有思考過怎么去盡量多地保持這種狀態,排除那種對工作厭煩的情緒,畢竟拿著工資不干活心里還是會不安,況且看到周圍那么多高效率的人,壓力是難免的,讓人擔心的不是每天只有兩個小時的高效工作,而是那段什么都不想干的時間。最后讓我發現一個方法,說起來很簡單,就是在出現這種低效狀態的時候,強迫自己打開eclipse,而不是 firefox,強迫自己去寫幾行代碼,如果這段時間內沒有被其他事情打斷,那么你還是容易進入一種不那么高效和愉悅的工作狀態,至少能做到專心致志。當然,跟自己的情緒對抗可能不是世界上最困難的事情,也是其中之一,不過請你相信,只要你打開eclipse開始寫代碼并進入思考狀態,那么你至少是可以暫時遺忘那些負面情緒的,甚至你的情緒可能因為解決了某個難題而高昂起來。
       這個方法肯定不是什么新發現,我估計很多人會有同樣的經驗,今早在看《joel說軟件》其中一篇文章《開火與運動》也談到了同樣的問題,joel也提到相同的經驗:開了頭就好。你不知道要費多少勁才能將一輛帶齒輪的山地車運轉起來,不過一旦它轉起來之后,一切都跟騎一輛沒有齒輪的自行車沒什么兩樣。Joel還延伸了更多,開火的策略不僅僅是工作效率的問題,也是競爭策略,當你向敵人開火的時候,同時向敵人靠過去,活力會迫使敵人低下頭而不能向你開火。競爭也是如此,壓迫性的不斷推出新東西讓你的競爭對手疲于奔命,反而遺忘產品的根本性的目的,這些新東西可能只是為了替換過去不易用的東西,為什么不易用的東西在過去也會被推出來?那只是了為每天進步不斷開火,讓敵人忘記開火。
       

    posted @ 2010-01-09 11:09 dennis 閱讀(3136) | 評論 (7)編輯 收藏

        趁著下班前的半小時,回顧下2009年我都干了什么,有什么收獲,有什么不足。
        09年最重要的事情是我的兒子出生了,小家伙的到來帶給全家很多歡樂,煩惱也不少,比如半夜總要被吵醒,晚上的讀書也沒辦法那么專心讀了。此外,我還在學習怎么當爸爸,寫過這篇《新爸爸指南》,記錄下新生兒遇到的種種問題,逐漸經歷自己生命的又一個階段,這個歷程很美好。
        年初從廣州公司辭職后,到了廈門一家創業公司,這不是一次很愉快的經歷,回想起來我的問題不小。首先不該貿然地想去轉換一個語言平臺,寫C++實在不是很好的編程的體驗,乃至于我根本提不起工作熱情;其次,心態不成熟,遇到問題和困擾的時候還是比較被動地解決,事實上完全沒必要搞成這樣,主動提出并且離開公司并不是什么丟人的事情。這次經歷告訴我做決定的時候最好再慎重一點,畢竟自己不是一個人了,養家糊口是實實在在的責任。
       在廈門的失敗經歷后,我投簡歷到了淘寶,盡管對于待遇并不是很滿意,出于對淘寶的向往和有點理想主義的小情懷還是來到了杭州。剛來的時候,工作很順利,生活比較糟糕,老婆孩子接到杭州后才好了點,生活比較有規律了。在淘寶,我所做的仍然是開發,寫代碼還是我的最愛,不過做的離業務的比較遠,這正符合我的期望。負責的是一個消息中間件的開發,這個產品本身已經成型,并且應用在了淘寶的核心系統當中,現在每天通過這個MQ發送的消息量已經接近兩億,整個系統擁有數個集群,近30臺機器。工作不單純是開發,包括一些方案的設計和日常的維護工作,總體來講還是很愉悅的體驗。不足的地方,我仍然還是將自己視為一個純粹的技術人員,對淘寶本身的業務、對其他系統的架構設計的了解都比較少,甚至于認識的人還是很局限,不過這個跟我的性格有關了。
        技術上,這一年自我感覺沒多大進步,除了將sicp讀完之外(我準備再度幾遍),一些零零散散的技術書籍也看了不少,很少留下深刻的印象,比較有價值的是《卓有成效的程序員》和《C++網絡編程》上下兩卷。前者使我開始有意識地將自己一些重復性的工作自動化,提高自己的工作效率,后者讓我對網絡框架的設計模式有了相對全面的認識,也促進了我對Java網絡編程的認識。今年也開發了個Java Memcached Client——Xmemcached,并在大家的鼓勵下持續地在改進,總算有不少用戶在用,沒有枉費精力和時間,也算今年的一個小小自得的地方。這里要特別感謝下曹曉剛,沒有他的鼓勵和他們公司的使用,xmc還只是個人玩具。09年下半年又將不少精力放在了Erlang,過去學習是跟風,這次總算在項目中了有了個小應用,并且將《Erlang程序設計》和OTP設計原則來回讀了幾遍,對Erlang的興趣越來越大,甚至于想是不是該去找份專職做Erlang的工作。對技術的學習,我還是沒有一個明確的規劃,任憑興趣在幾個領域里轉來轉去,這不是好現象,明年希望能更有計劃和針對性地去學習,能跟自己的工作契合得更緊密一些。明年也希望能將《算法導論》讀完,今年讀了1/4,發現我的數學都已經拋到了Java國了,算法復雜度的推導總是看不懂,因此又去搞了幾本數學書,從頭再看看。

       回顧完了,說說明年的愿望:
    技術上:讀完《算法導論》,繼續深入Erlang,探索Erlang在工作中的實際應用,加強對其他系統的了解以及大型網站構建方面的學習
    生活上:希望能全家一起去旅游一次,希望能將老爸老媽接過來玩一段時間。







    posted @ 2009-12-24 17:29 dennis 閱讀(1546) | 評論 (2)編輯 收藏

        昨天收到一個xmc的issue報告,大概的意思是將Xmemcached與spring 2.5集成沒有任何問題,但是將spring升級到3.0就會拋出一個異常,并且spring容器無法正常啟動,異常信息類似“Couldn't find a destroy method named 'shutdown' on bean XMemcachedClientFactoryBean”。更詳細的情況可以看這里,這是這位朋友分析的結果,簡單來說就是spring 3.0對于查找destroy method為空的情況處理不同了,過去是打個日志,現在是拋出一個異常。
       問題說完,這里主要是介紹下這個問題的解決方式,事實上Xmemcached有一個沒有被文檔化的Spring配置方式,沒有寫入文檔的主要考慮是以為wiki介紹的第一種方式已經足夠,而builder的方式相對繁瑣一些。通過XmemcachedClientBuilder的這個factory bean的factory-method,也就是build方法來構建MemcachedClient,這就可以繞開spring 3.0的這個問題。一個示范配置如下:

    <bean name="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">
            
    <constructor-arg>
                
    <list>
                    
    <bean class="java.net.InetSocketAddress">
                        
    <constructor-arg>
                            
    <value>localhost</value>
                        
    </constructor-arg>
                        
    <constructor-arg>
                            
    <value>12000</value>
                        
    </constructor-arg>
                    
    </bean>
                
    </list>
            
    </constructor-arg>
        
    </bean>
        
    <bean name="memcachedClient" factory-bean="memcachedClientBuilder"
            factory-method
    ="build" destroy-method="shutdown" />

       memcachedClientBuilder作為一個factory-bean,接受一個InetSocketAddress列表作為構造函數傳入,最后MemcachedClient就可以通過factory-method——也就是build方法創建了。

       多個節點情況下,可能你想設置權重,那么傳入memcachedClientBuilder的第二個構造函數參數權重數組即可:
    <bean name="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">
            
    <constructor-arg>
                
    <list>
                    
    <bean class="java.net.InetSocketAddress">
                        
    <constructor-arg>
                            
    <value>localhost</value>
                        
    </constructor-arg>
                        
    <constructor-arg>
                            
    <value>12000</value>
                        
    </constructor-arg>
                    
    </bean>
                    
    <bean class="java.net.InetSocketAddress">
                        
    <constructor-arg>
                            
    <value>localhost</value>
                        
    </constructor-arg>
                        
    <constructor-arg>
                            
    <value>12001</value>
                        
    </constructor-arg>
                    
    </bean>
                
    </list>
            
    </constructor-arg>
            
    <constructor-arg>
                
    <list>
                    
    <value>1</value>
                    
    <value>2</value>
                
    </list>
            
    </constructor-arg>
        
    </bean>
        
    <bean name="memcachedClient" factory-bean="memcachedClientBuilder"
            factory-method
    ="build" destroy-method="shutdown" />


    上面的例子將localhost:12000的權重設置為1,而localhost:12001的權重設置為2。除了這些配置外,XmemcachedClientBuilder還有其他選項,如配置一致性哈希算法、連接池等,完整的配置例子如下:

    <bean name="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">
                    
    <!-- XMemcachedClientBuilder have two arguments.First is server list,and second is weights array. -->
                    
    <constructor-arg>
                            
    <list>
                                    
    <bean class="java.net.InetSocketAddress">
                                            
    <constructor-arg>
                                                    
    <value>localhost</value>
                                            
    </constructor-arg>
                                            
    <constructor-arg>
                                                    
    <value>12000</value>
                                            
    </constructor-arg>
                                    
    </bean>
                                    
    <bean class="java.net.InetSocketAddress">
                                            
    <constructor-arg>
                                                    
    <value>localhost</value>
                                            
    </constructor-arg>
                                            
    <constructor-arg>
                                                    
    <value>12001</value>
                                            
    </constructor-arg>
                                    
    </bean>
                            
    </list>
                    
    </constructor-arg>
                    
    <constructor-arg>
                            
    <list>
                                    
    <value>1</value>
                                    
    <value>2</value>
                            
    </list>
                    
    </constructor-arg>
                    
    <property name="connectionPoolSize" value="2"></property>
                    
    <property name="commandFactory">
                            
    <bean class="net.rubyeye.xmemcached.command.TextCommandFactory"></bean>
                    
    </property>
                    
    <property name="sessionLocator">
                            
    <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
                    
    </property>
                    
    <property name="transcoder">
                            
    <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
                    
    </property>
            
    </bean>
            
    <!-- Use factory bean to build memcached client -->
            
    <bean name="memcachedClient" factory-bean="memcachedClientBuilder"
                    factory-method
    ="build" destroy-method="shutdown"/>



    posted @ 2009-12-24 01:51 dennis 閱讀(4879) | 評論 (1)編輯 收藏

        最近讀數理邏輯方面的資料,感慨自己沒有早點接觸邏輯學,如果在小學初中階段就能有邏輯學的系統訓練,我想我對數學的理解會完全不一樣,對定理證明的思路也將大大開拓。中學時代對數學充滿熱情,基本上老師講的都滿足不了我,我的學習遠遠在課堂前面,初中的時候我已經接觸了微積分、概率論、立體幾何之類,教材是從我舅舅用過的教材垃圾堆里淘出來的,那時候我外婆準備賣了那堆書,就叫我去看看有沒有想要的,印象中從那里掏出了不少好東西,武俠小說、馬克思恩格斯全集、毛選、數學語文教材之流,在老家那個閱讀資料極度缺少的地方,這些書成了我整個初中的精神食糧。上了高中后,家也搬到縣城,離書城近了,并且學校有圖書館,更是如魚得水。扯的太遠,回到題目,以數學定理的證明為例,我們熟知的直接證明、反證法、數學歸納法、間接證明、存在性證明、唯一性證明其實背后都有牢固的邏輯定律在支撐,直接證明其實就是蘊含 p-> q,而反證法的原理是¬¬p ↔ p,間接證明則是原命題與逆否命題等價 p-> q ↔ ¬q -> ¬p等等。如果在教授數學的同時,教授給學生背后的邏輯原理,那么將極大地開闊學生的視野并且讓數學證明變的有趣。數理邏輯不僅僅對數學學習有益,對軟件開發同樣有幫助,例如以謂詞和量詞來精確地描述和分析系統規格,推理邏輯的使用也能啟發你的設計思路,幫你找到一個復雜的設計的等價物。此外,你能更快地比別人做出某些邏輯難題,這也挺有趣。

    posted @ 2009-12-12 16:35 dennis 閱讀(1340) | 評論 (0)編輯 收藏

        Xmemcached  1.2.1正式發布,這是1.2.0發布以來的第一個小版本,主要改進是修復BUG、內部重構以及添加一些新特性。主要改進如下:

    1、為Kestrel 1.2添加delete方法支持,kestrel 1.2發布后正式支持memcached delete協議

    2、添加了一個新的序列化轉換器 net.rubyeye.xmemcached.transcoders.TokyoTyrantTranscoder,專門提供給使用xmemcached連接Tokyo Tyrant的用戶,這個轉換器默認在value前加上4個字節的flag,因為Tokyo Tyrant不支持flag,所以默認無法存儲除String之外的Java序列化類型。

    3、添加兩個新選項:


        Transcoder.setCompressionThreshold(threshold)
     
        Transcoder接口添加了setCompressionThreshold用于設置壓縮閥值,序列化后的value如果超過這個閥值將啟用壓縮,默認閥值是16K。

      
    MemcachedClient.setSanitizeKeys(true|false)  

        setSanitizeKeys用于決定是否啟用URLEncoding來編碼key,如果你用url作為key存儲,這一特性能方便你的使用,默認為開啟。

    4、添加中文用戶指南,比較完整的使用說明和選項說明,在線閱讀

    5、內部優化,移除一些老代碼和一些在1.1中被聲明為Deprecated的方法。添加了更多單元測試。

    6、BUG修復和對binary協議實現的部分優化。

    項目主頁:http://code.google.com/p/xmemcached/

    下載地址: http://code.google.com/p/xmemcached/downloads/list

     

    歡迎試用和反饋。

    posted @ 2009-12-04 13:07 dennis 閱讀(1801) | 評論 (2)編輯 收藏

    僅列出標題
    共56頁: First 上一頁 11 12 13 14 15 16 17 18 19 下一頁 Last 
    主站蜘蛛池模板: 特黄特色大片免费| 久久久久亚洲精品天堂久久久久久| 一级毛片aaaaaa视频免费看| 亚洲a级片在线观看| 亚洲欧洲∨国产一区二区三区| 在线视频免费国产成人| 四虎成年永久免费网站| a级毛片免费完整视频| 黄色毛片免费观看| 中文字幕乱码亚洲无线三区| 中文字幕亚洲综合精品一区| 亚洲国产三级在线观看| 久久久久一级精品亚洲国产成人综合AV区 | 男女猛烈激情xx00免费视频| 亚洲乱码一二三四区乱码| 少妇中文字幕乱码亚洲影视| 国产亚洲精品a在线无码| 亚洲一区AV无码少妇电影☆| 亚洲 小说区 图片区 都市| 免费观看亚洲人成网站| 看全色黄大色大片免费久久| 成年人免费视频观看| 亚洲成在人线aⅴ免费毛片| 99久久99这里只有免费费精品| 无码av免费一区二区三区试看| 很黄很污的网站免费| 日本道免费精品一区二区| 成人自慰女黄网站免费大全| 国产成人自产拍免费视频| 一本久久A久久免费精品不卡| 免费国产草莓视频在线观看黄| 精品久久亚洲一级α| 国产成人高清亚洲一区91| 国产偷国产偷亚洲高清人| 国产成人精品亚洲一区| 免费很黄无遮挡的视频毛片| 一级黄色毛片免费看| 成人性生交大片免费看好 | 亚洲Aⅴ无码专区在线观看q| 亚洲视频在线免费观看| 亚洲国产成人精品无码区在线秒播|