庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

    最近一直压力很大,一些事情的干扰,给我带来很大压力。
    做过的心理测试也表明我不是那种抗压性和自控力很强的人,在没有很大压力的时候,我会做的很开心,很有生活的乐趣。然后,当压力一大,却是常常消极地对待,或者说逃避,当然,最后还是要面对,并且后果更严重了。很佩服那些在压力下还能奋勇前行的人,毫无畏惧,坚定地向目标前进。说到底自己还是少年心性,见过我的人经常说我好小,zzz...,太不给面子了,怎么也是84年的。俺得承认,俺不成熟,想问题有时候想的简单了,做事情很多靠感性决定而非理性的权衡,尽管表面上看起来挺积极奋进很理性的一人,背后嘛只有自己知道了。
    我很想请教下,对一件自己很不喜欢做,并且觉的做的意义不大事情,如何鼓起勇气尽快去做,而非拖到不可收拾才去被动解决。还有个问题就是对于事情重要性的判断上,对于别人可能说很重要的事情,有时候对我来说却是没多大重要的事情,那么就会造成一个认知上的误差,也常常造成误解,得罪人的地方难免,然而我本心却绝不是那样的。那么如何去处理这个认知上的差别?
    性格上的改造肯定不是一朝一夕能解决的,一通牢骚,明天又是一周了。

posted @ 2008-12-01 00:20 dennis 阅读(506) | 评论 (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 阅读(2204) | 评论 (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 阅读(3492) | 评论 (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 阅读(6408) | 评论 (1)编辑 收藏

     摘要:     本节开始进入第4章最后一部分——逻辑程序设计。scheme将实现一种查询语言,非常类似prolog。由于解释器的实现在后面,还未读到,前面的习题我都将用prolog做测试,当然也给出scheme版本的解答,待以后测试。     首先给出依照书中所述写出的prolog事实库: Code highlighting prod...  阅读全文

posted @ 2008-11-22 13:27 dennis 阅读(1779) | 评论 (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 阅读(1547) | 评论 (0)编辑 收藏

     摘要:     在第二个分析求值器的基础上实现了完整的amb求值器,在drscheme选择R5RS标准下测试通过。注意,在show details面板里将disallow redefinition of initial bindings选项去掉,允许重定义过程。给出完整代码: Code highlighting produced by Actipro CodeHig...  阅读全文

posted @ 2008-11-18 20:41 dennis 阅读(1101) | 评论 (3)编辑 收藏

    跑步快3个月了,其实并没有天天跑,基本每周都休息两三天。今天终于挑战了下一万米,开跑前两个小时吞了点面包,喝了两碗淡盐水。最后一千米膝盖开始有点僵,最后估计花了50多分钟快一小时,仅作纪念。长跑准备一星期来这么一次,平时还是四五千米为好。

posted @ 2008-11-16 18:37 dennis 阅读(505) | 评论 (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 阅读(4403) | 评论 (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 阅读(620) | 评论 (0)编辑 收藏

仅列出标题
共56页: First 上一页 20 21 22 23 24 25 26 27 28 下一页 Last