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

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

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

    莊周夢蝶

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

        最近一直壓力很大,一些事情的干擾,給我帶來很大壓力。
        做過的心理測試也表明我不是那種抗壓性和自控力很強的人,在沒有很大壓力的時候,我會做的很開心,很有生活的樂趣。然后,當壓力一大,卻是常常消極地對待,或者說逃避,當然,最后還是要面對,并且后果更嚴重了。很佩服那些在壓力下還能奮勇前行的人,毫無畏懼,堅定地向目標前進。說到底自己還是少年心性,見過我的人經常說我好小,zzz...,太不給面子了,怎么也是84年的。俺得承認,俺不成熟,想問題有時候想的簡單了,做事情很多靠感性決定而非理性的權衡,盡管表面上看起來挺積極奮進很理性的一人,背后嘛只有自己知道了。
        我很想請教下,對一件自己很不喜歡做,并且覺的做的意義不大事情,如何鼓起勇氣盡快去做,而非拖到不可收拾才去被動解決。還有個問題就是對于事情重要性的判斷上,對于別人可能說很重要的事情,有時候對我來說卻是沒多大重要的事情,那么就會造成一個認知上的誤差,也常常造成誤解,得罪人的地方難免,然而我本心卻絕不是那樣的。那么如何去處理這個認知上的差別?
        性格上的改造肯定不是一朝一夕能解決的,一通牢騷,明天又是一周了。

    posted @ 2008-12-01 00:20 dennis 閱讀(515) | 評論 (5)編輯 收藏

        yanf4j簡介,請看這里
        這里俺要介紹下用yanf4j寫個最簡單的聊天室,可以直接telnet上去聊天。請先下載common-loggingyanf4j-0.40-stable-bin.tar.gz
        聊天室嘛,肯定要維護一個聊天者聊表:
    List<Session> sessionList = new CopyOnWriteArrayList<Session>();
        用戶名讓系統產生,用戶1、2、3.....,最簡單的嘛:
    AtomicInteger userId = new AtomicInteger();
    private String generateUserName() {
            
    return "user" + userId.incrementAndGet();
        }
       
        服務端要實現一個處理handler,來接受用戶連接并轉發聊天消息,嗯,繼承HandlerAdapter,覆寫相應的方法即可。當有人連上來的時候,覆寫onSessionCreated方法:
    public void onSessionCreated(Session session) {
            sessionList.add(session);
            
    // 給session取名
            session.attach(generateUserName());
            
    // 廣播某人進來
            broadcast(session, session.attachment() + " enter room");
        }
        當收到聊天消息的時候,廣播給組內成員:
        @Override
        
    public void onReceive(Session session, String t) {
            
    if (t.equals("quit"))
                session.close();
            
    else
                broadcast(session, 
    "[" + session.attachment() + "] say:" + t);

        }
        
    private void broadcast(Session s, String msg) {
            
    for (Session session : this.sessionList) {
                session.send(msg);
            }
        }

        廣播我們只是簡單的遍歷sessionList并send而已。完整的ChatServerHandler.java清單如下:
    package com.google.code.yanf4j.test.example.chat;

    import java.util.List;
    import java.util.concurrent.CopyOnWriteArrayList;
    import java.util.concurrent.atomic.AtomicInteger;

    import com.google.code.yanf4j.nio.Session;
    import com.google.code.yanf4j.nio.impl.HandlerAdapter;

    public class ChatServerHandler extends HandlerAdapter<String> {
        List
    <Session> sessionList = new CopyOnWriteArrayList<Session>();
        AtomicInteger userId 
    = new AtomicInteger();

       
    @Override
        
    public void onReceive(Session session, String t) {
            
    if (t.equals("quit"))
                session.close();
            
    else
                broadcast(session, 
    "[" + session.attachment() + "] say:" + t);

        }


        @Override
        
    public void onSessionClosed(Session session) {
            sessionList.remove(session);
            broadcast(session, session.attachment() 
    + " leave room");
        }

        
    private void broadcast(Session s, String msg) {
            
    for (Session session : this.sessionList) {
                session.send(msg);
            }
        }

        @Override
        
    public void onSessionCreated(Session session) {
            sessionList.add(session);
            
    // 給session取名
            session.attach(generateUserName());
            
    // 廣播某人進來
            broadcast(session, session.attachment() + " enter room");
        }

        
    private String generateUserName() {
            
    return "user" + userId.incrementAndGet();
        }

    }

        接下來我們要實現聊天服務器了,yanf4j實現TCP Server的核心類是TCPController,假設端口設為8080:

    package com.google.code.yanf4j.test.example.chat;

    import java.io.IOException;

    import com.google.code.yanf4j.config.Configuration;
    import com.google.code.yanf4j.nio.TCPController;
    import com.google.code.yanf4j.nio.impl.StringCodecFactory;

    public class ChatServer {
        
    public static void main(String[] args) throws IOException {
            TCPController controller 
    = new TCPController(new Configuration(),
                    
    new StringCodecFactory());
            controller.setHandler(
    new ChatServerHandler());
            controller.setPort(
    8080);  //端口
            controller.start();  //啟動
        }
    }

         順利完成,啟動后,telnet到8080端口,看看效果



    posted @ 2008-11-26 11:36 dennis 閱讀(2208) | 評論 (8)編輯 收藏

        首先你的機器上肯定要安裝emacs啦,此步略過不表。
     1、從 http://rubyforge.org/projects/emacs-rails 下載最新emacs-rails,解壓文件到~/.emacs.d/rails 目錄
     2、根據README,你需要下載三個依賴庫:
    cd ~/.emacs.d/rails
    wget http:
    //www.kazmier.com/computer/snippet.el
    wget http:
    //www.webweavertech.com/ovidiu/emacs/find-recursive.txt
    mv find
    -recursive.txt find-recursive.el

    wget http:
    //svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/misc/inf-ruby.el?view=co
    mv inf
    -ruby.el\?view=co inf-ruby.el

    3、將ruby源代碼目錄下的/misc子目錄中的emacs擴展文件拷貝到/usr/share/emacs/site-lisp/目錄下:
    sudo cp /home/dennis/backup/ruby-1.8.7-p72/misc/*.el /usr/share/emacs/site-lisp/

    4、在~/.emacs添加兩行代碼,加載emacs-rails
    (setq load-path (cons "~/.emacs.d/rails" load-path))
    (require 
    'rails)

        搞定,看起來挺強悍的,在菜單蘭多了個ROR菜單,需要熟悉下快捷鍵。

    posted @ 2008-11-23 02:22 dennis 閱讀(3504) | 評論 (2)編輯 收藏

        一開始嘗試使用
        sudo apt-get install libopenssl-ruby1.8
        安裝是安裝成功了,但是仍然提示找不到openssl。還是決定從源碼安裝,首先確保ubuntu安裝了openssl:
        sudo apt-get install openssl
        sudo apt-get install libssl-dev
        sudo apt-get install libssl0.9.8
       
        然后進入ruby源碼目錄下的/ext/openssl
        cd RUBY_SOURCE/ext/openssl
        ruby extconf.rb
        make
        sudo make install

    posted @ 2008-11-23 01:34 dennis 閱讀(6419) | 評論 (1)編輯 收藏

         摘要:     本節開始進入第4章最后一部分——邏輯程序設計。scheme將實現一種查詢語言,非常類似prolog。由于解釋器的實現在后面,還未讀到,前面的習題我都將用prolog做測試,當然也給出scheme版本的解答,待以后測試。     首先給出依照書中所述寫出的prolog事實庫: Code highlighting prod...  閱讀全文

    posted @ 2008-11-22 13:27 dennis 閱讀(1785) | 評論 (0)編輯 收藏


        本節實現了amb求值器,題目都是擴展這個求值器,引入一些特殊的過程。我的嘗試解答從4.51開始
    習題4.51,要求實現permanent-set!,這個過程的副作用在遇到失敗時不撤銷,實現如下:
    ;擴充analyze 
    ((permanent
    -assignment? exp)
             (analyze
    -permanent-assignment exp))

    ;實現

    (define (permanent
    -assignment? exp)
      (tagged
    -list? exp 'permanent-set!))
    (define (analyze-permanent-assignment exp)
       (let ((var (assignment
    -variable exp))
            (vproc (analyze (assignment
    -value exp))))
          (
    lambda(env succeed fail)
            (vproc env
                   (
    lambda(val fail2)
                          (set
    -variable-value! var val env) 
                          (succeed 
    'ok fail2))
                   fail))))

    習題4.52,實現if-fail的特殊形式,在第一個表達式如果求值成功,就返回該表達式的值,否則返回第二個表達式的值,實現如下:
    ;擴充analyze
     ((
    if-fail? exp)
             (analyze
    -if-fail exp))
    ;實現
    (define (
    if-fail? exp)
      (tagged
    -list? exp 'if-fail))
    (define (analyze-if-fail exp)
       (let ((pproc (analyze (
    if-predicate exp)))
            (cproc (analyze (
    if-consequent exp))))
         (
    lambda(env succeed fail)
            (pproc env (
    lambda(pred-value fail2)
                         (succeed pred
    -value fail2))
                   (
    lambda() (cproc env succeed fail))))))
    pproc如果執行成功,就返回結果pred-value,否則就執行fail過程(lambda() (cproc env succeed fail)),測試略。

    習題4.53,根據題意可知這個過程返回結果應該是(prime-sum-pair '(1 3 5 8) '(20 35 110))的所有結果,執行也是如此:
    ;;; AMB-Eval value:
    ((
    8 35) (3 110) (3 20))

    習題4.54,將require實現為特殊形式:
    ;擴充analyze
    ((require? exp)
             (analyze
    -require exp))

    ;實現
    (define (require? exp)
      (tagged
    -list? exp 'require))
    (define (require-predicate exp)
      (cadr exp))
    (define (analyze
    -require exp)
      (let ((pproc (analyze (require
    -predicate exp))))
        (
    lambda (env succeed fail)
          (pproc env (
    lambda(pred-value fail2)
                       (
    if (not pred-value)
                           (fail2)
                           (succeed 
    'ok fail2)))
                 fail))))


    posted @ 2008-11-21 10:26 dennis 閱讀(1554) | 評論 (0)編輯 收藏

         摘要:     在第二個分析求值器的基礎上實現了完整的amb求值器,在drscheme選擇R5RS標準下測試通過。注意,在show details面板里將disallow redefinition of initial bindings選項去掉,允許重定義過程。給出完整代碼: Code highlighting produced by Actipro CodeHig...  閱讀全文

    posted @ 2008-11-18 20:41 dennis 閱讀(1105) | 評論 (3)編輯 收藏

        跑步快3個月了,其實并沒有天天跑,基本每周都休息兩三天。今天終于挑戰了下一萬米,開跑前兩個小時吞了點面包,喝了兩碗淡鹽水。最后一千米膝蓋開始有點僵,最后估計花了50多分鐘快一小時,僅作紀念。長跑準備一星期來這么一次,平時還是四五千米為好。

    posted @ 2008-11-16 18:37 dennis 閱讀(509) | 評論 (4)編輯 收藏

        說謊者謎題是sicp4.3.2小節的一道題目,題目本身不難:
    五個女生參加一個考試,她們的家長對考試結果過分關注。為此她們約定,在給家里寫信談到考試的時候,每個姑娘都要寫一句真話和一句假話。下面是從她們的信里摘抄出來的句子:
    Betty : kitty考第二,我只考了第三
    Ethel : 你們應該很高興聽到我考了第一,joan第二
    joan :   我考第三,可憐的Ethel墊底
    kitty:  我第二,marry只考了第四
    marry: 我是第四,Betty的成績最高。
    這五個姑娘的實際排名是什么?

        Ruby本來就有call/cc,因此也可以實現amb操作符,網上已經有一個實現了:
    class Amb
      
    class ExhaustedError < RuntimeError; end
      def initialize
        @fail 
    = proc { fail ExhaustedError, "amb tree exhausted" }
      end
      def choose(
    *choices)
        prev_fail 
    = @fail
        callcc { 
    |sk|
          choices.each { 
    |choice|
            callcc { 
    |fk|
              @fail 
    = proc {
                @fail 
    = prev_fail
                fk.call(:fail)
              }
              
    if choice.respond_to? :call
                sk.call(choice.call)
              
    else
                sk.call(choice)
              end
            }
          }
          @fail.call
        }
      end
      def failure
        choose
      end
      
      def 
    assert(cond)
        failure unless cond
      end
      alias :require :
    assert
    end

        這一段代碼與scheme宏實現amb是完全相同的:
    (define amb-fail '*)

    (define initialize
    -amb-fail
      (
    lambda ()
        (set! amb
    -fail
          (
    lambda ()
            (error 
    "amb tree exhausted")))))

    (initialize
    -amb-fail)
    (define call
    /cc call-with-current-continuation)
    (define
    -syntax amb
      (syntax
    -rules ()
        ((amb alt )
         (let ((prev
    -amb-fail amb-fail))
           (call
    /cc
            (
    lambda (sk)

              (call
    /cc
               (
    lambda (fk)
                 (set! amb
    -fail
                       (
    lambda ()
                         (set! amb
    -fail prev-amb-fail)
                         (fk 
    'fail)))
                 (sk alt))) 
                 
                 (prev
    -amb-fail)))))))
        回到謎題,從題意可知每個姑娘的兩句話的異或結果為true,并且姑娘的排名肯定不會相同,因此定義兩個輔助過程:
    require 'amb'
    def distinct?(items)
      items.uniq
    ==items
    end
    def xor(exp1,exp2)
     (exp1 
    or exp2) and !(exp1 and exp2)
    end
        剩下的完全就是將題目翻譯成代碼即可了,沒有多少可以解釋的東西:

    amb=Amb.new
    betty
    =amb.choose(*[1,2,3,4,5])
    ethel
    =amb.choose(*[1,2,3,4,5])
    joan
    =amb.choose(*[1,2,3,4,5])
    kitty
    =amb.choose(*[1,2,3,4,5])
    marry
    =amb.choose(*[1,2,3,4,5])

    amb.require(xor(kitty
    ==2,betty==3))
    amb.require(xor(ethel
    ==1,joan==2))
    amb.require(xor(joan
    ==3,ethel==5))
    amb.require(xor(kitty
    ==2,marry==4))
    amb.require(xor(marry
    ==4,betty==1))
    amb.require(distinct?([betty,ethel,joan,kitty,marry]))
    puts 
    "betty:#{betty} ethel:#{ethel} joan:#{joan} kitty:#{kitty} marry:#{marry}"

        答案就是:
        betty:3 ethel:5 joan:2 kitty:1 marry:4  

        最后給出一個Prolog的解答:
    notmember(A,[]).
    notmember(A,[B
    |L]):-
      A\
    ==B,
      notmember(A,L).
    distinct([A,B,C,D,E]):
    -
       notmember(A,[B,C,D,E]),
       notmember(B,[A,C,D,E]),
       notmember(C,[A,B,D,E]),
       notmember(D,[A,B,C,E]),
       notmember(E,[A,B,C,D]).
    xor(Exp1,Exp2):
    -
       (Exp1;Exp2),\
    + (Exp1,Exp2).
    solve(Betty,Ethel,Joan,Kitty,Marry):
    -  
       X
    =[1,2,3,4,5],
       member(Betty,X),
       member(Ethel,X),
       member(Joan,X),
       member(Kitty,X),
       member(Marry,X),
       distinct([Betty,Ethel,Joan,Kitty,Marry]),
       xor(Kitty
    =:=2,Betty=:=3),
       xor(Ethel
    =:=1,Joan=:=2),
       xor(Joan
    =:=3,Ethel=:=5),
       xor(Kitty
    =:=2,Marry=:=4),
       xor(Marry
    =:=4,Betty=:=1).


    posted @ 2008-11-15 18:50 dennis 閱讀(4416) | 評論 (3)編輯 收藏

        JRuby的內存占用是比較高的,畢竟需要啟動一個JVM以及構建抽象語法樹等,一般同一個腳本的內存占用都是CRuby的幾十倍甚至上百倍。記的Infoq上有過一個新聞是說sun跟東京某大學合作研究Ruby和JRuby的MVM,可以在幾個VM之間共享解釋器,可以在啟動多個VM的時候大大降低內存占用。不過這個項目暫時沒有什么消息,要想在實際中應用更是沒影的事情。有無其他解決辦法?今天看到IBM Developer的一篇文章,原來IBM JRE for the Java platform SE 5早就引入了類共享的特性,也就是說允許通過緩存在 JVM 之間共享類來減少內存占用和重復加載類的開銷。最新SR1 jvm更是引入了AOT編譯的原生代碼也可以放入共享緩存。那么,如果用ibm的支持類共享的VM來跑多個JRuby進程,會不會能大大減少整體的內存占用情況呢?可能出現的兩個問題:
    1、兼容性,IBM的jvm跑sun的JRuby,還是可能出現兼容性的問題。
    2、JRuby的jar包中的類能否被共享?JRuby生成的語法樹、Ruby運行時等能不能被共享?

    有興趣的童鞋可以測試一下,我的機器是AMD的,ibm jvm裝不了,還是我下錯了?
       

    posted @ 2008-11-15 00:58 dennis 閱讀(623) | 評論 (0)編輯 收藏

    僅列出標題
    共56頁: First 上一頁 20 21 22 23 24 25 26 27 28 下一頁 Last 
    主站蜘蛛池模板: 中文字幕无码免费久久99| a级毛片黄免费a级毛片| 1024免费福利永久观看网站| 婷婷精品国产亚洲AV麻豆不片 | 亚洲精品精华液一区二区 | 四虎永久免费观看| 亚洲AV无码国产一区二区三区 | 无码中文在线二区免费| 亚洲av无码一区二区三区天堂古代 | 国产精品免费在线播放| 亚洲欧洲日本在线| 中文字幕免费在线播放| 亚洲va在线va天堂va888www| 久久aⅴ免费观看| 亚洲AV无码乱码在线观看代蜜桃 | 午夜在线免费视频 | 日本亚洲中午字幕乱码| 亚洲AV人无码激艳猛片| 永久免费av无码入口国语片| 亚洲成av人片在线观看无码不卡| 国内精品一级毛片免费看| 亚洲黄色网站视频| 成人女人A级毛片免费软件| 亚洲欧美熟妇综合久久久久| 色www永久免费视频| 一级视频免费观看| 亚洲国产精品乱码一区二区| 日韩免费精品视频| 边摸边脱吃奶边高潮视频免费| 色噜噜AV亚洲色一区二区| 在线观看的免费网站无遮挡| 亚洲色偷偷色噜噜狠狠99| 亚洲精品成人网久久久久久| 免费在线中文日本| 亚洲国产精品自在自线观看| 国产亚洲精品精品国产亚洲综合| 最近免费视频中文字幕大全| 精品无码专区亚洲| 亚洲人成电影在线天堂| 国产大片51精品免费观看| 国产高清不卡免费视频|