躺在沙滩上的小猪

快乐的每一天

#

痛苦,gmail talk 不能保存全部历史记录。

很遗憾,好多聊天记录都没有了,我需要那些东西,那些是我思考的过程,也是我和同事,朋友讨论的过程。

希望gmail talk下个版本能加上。

posted @ 2005-09-20 15:59 martin xus| 编辑 收藏

《dive into python》

我喜欢这本书

http://diveintopython.org/

posted @ 2005-09-20 15:41 martin xus| 编辑 收藏

菜单的生成。

需要生成:
http://www.softcomplex.com/products/tigra_menu_tree/ 

最终生成的菜单:

 

首先按需求定义了一个model.

package com.jxlt.db.parse; 
import java.io.Serializable; 

public class TreeModel implements Serializable { 
        private static final long serialVersionUID = 7896562831509010976L; 

        private String code; 
        private String title; 
        private String url; 
        private boolean leaf; 
        private int level; 

        /** 
        * @return Returns the leaf. 
        */ 
        public boolean isLeaf() { 
                return leaf; 
        } 

        /** 
        * @param leaf 
        *            The leaf to set. 
        */ 
        public void setLeaf(boolean leaf) { 
                this.leaf = leaf; 
        } 

        /** 
        * @return Returns the title. 
        */ 
        public String getTitle() { 
                return title; 
        } 

        /** 
        * @param title 
        *            The title to set. 
        */ 
        public void setTitle(String title) { 
                this.title = title; 
        } 

        /** 
        * @return Returns the url. 
        */ 
        public String getUrl() { 
                return url; 
        } 

        /** 
        * @param url 
        *            The url to set. 
        */ 
        public void setUrl(String url) { 
                this.url = url; 
        } 

        /** 
        * @return Returns the code. 
        */ 
        public String getCode() { 
                return code; 
        } 

        /** 
        * @param code 
        *            The code to set. 
        */ 
        public void setCode(String code) { 
                this.code = code; 
        } 

        /** 
        * @return Returns the level. 
        */ 
        public int getLevel() { 
                return level; 
        } 

        /** 
        * @param level 
        *            The level to set. 
        */ 
        public void setLevel(int level) { 
                this.level = level; 
        } 

}

获取内容:

package com.jxlt.db.parse; 

import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; 

import com.jxlt.db.util.DataSourceUtils; 

public class ParseTree { 
        private static final String sql = "select t.bz_code code, 
                                          t.bz_title itle, t.bz_content content "
                                 + "  from bz_czzs t " 
                                 + "  order by t.bz_code"; 

        private static final String sql2 = "select t.bz_code code, 
                                           t.bz_title title, 
                                           t.bz_content content " 
                                           + "  from bz_czzs t " 
                                 + " where substr(t.bz_code, 0, 3) = '002'" 
                                 + " order by t.bz_code"; 

        public static List parse() { 
                Connection conn = null; 
                Statement st = null; 
                ResultSet rs = null; 
                List list = new ArrayList(); 
                try { 
                        conn = DataSourceUtils.getConnection(); 
                        st = conn.createStatement(); 

                        rs = st.executeQuery(sql2); 
                        String code, title = ""; 

                        while (rs.next()) { 
                                code = rs.getString("code"); 
                                title = rs.getString("title"); 
       
                                TreeModel model = new TreeModel(); 
                                model.setCode(code); 
                                model.setTitle(title); 

                                model.setUrl(
                                 "m/content/" + code + ".html"); 
                                model.setLeaf(false); 
                                model.setLevel(
                                code != null ? code.length() / 3 : 0); 
                                list.add(model); 
                        } 

                } catch (SQLException e) { 
                        e.printStackTrace(); 
                } finally { 
                        // DataSourceUtils.close(rs); 
                        // DataSourceUtils.close(st); 
                        DataSourceUtils.close(conn); 
                } 
                return list; 
        } 
}

生成js文件

package com.jxlt.db.parse; 

import org.apache.log4j.Logger; 

import java.util.List; 

/** 
* Generate the left tree menu 
* 
* @author martin.xus (martin.xus@gmail.com) 
*/ 
public class GeneratorTree { 
        private static Logger logger = Logger.getLogger(GeneratorTree.class); 

        public static final String TREE_FILE = "D:\\workspace\\style\\test\\martin.tree.002.js"; 

        /** 
        * Generate the left tree menu 
        * 
        * @return String 
        */ 
        public static String generator() { 
                StringBuffer buf = new StringBuffer().append(HEADER); 
                List list = ParseTree.parse(); 
                logger.debug("generating tree menu begin"); 
                TreeModel model; 
                TreeModel modelNext; 
                int position; 
                if (null != list && 0 < list.size()) { 
                        for (int i = 0, length = list.size(); i < length - 1; i++) { 
                                logger.debug("dealed with :" + i + " rows"); 
                                StringBuffer _buf = new StringBuffer(); 
                                model = (TreeModel) list.get(i); 
                                modelNext = (TreeModel) list.get(i + 1); 
                                _buf.append("['").append(model.getTitle()).append("','") 
                                                .append(model.getUrl()).append("'"); 

                                if (model.getLevel() > modelNext.getLevel()) { 
                                        _buf.append(SUFFIX).append(COMMA); 
                                } else if (model.getLevel() == modelNext.getLevel()) { 
                                        _buf.append(SUFFIX).append(COMMA).append(PLACEKICK); 
                                } else if (model.getLevel() < modelNext.getLevel()) { 
                                        _buf.append(COMMA).append(PLACEKICK).append(SUFFIX); 
                                } 

                                position = buf.toString().indexOf(PLACEKICK); 
                                if (position != -1) { 
                                        buf.replace(position, position + 7, _buf.toString()); 
                                } else { 
                                        buf.insert(buf.length() - model.getLevel() - 4, "," 
                                                        + _buf.toString()); 
                                } 

                                if (i == length - 2) { 
                                        _buf.append("['").append(modelNext.getTitle()) 
                                                        .append("','").append(modelNext.getUrl()).append( 
                                                                        "'").append(SUFFIX).append(COMMA); 
                                } 
                        } 
                } 
                return buf.toString(); 
        } 

        private static final String SUFFIX = "]"; 

        private static final String COMMA = ","; 

        private static final String PLACEKICK = "$martin"; 

        private static final String HEADER = "var TREE_ITEMS = [['索引','#'," 
                        + PLACEKICK + "]];"; 
}

test 一下:

logger.debug("writing file:" +
                   GeneratorTree.TREE_FILE); 
FileWriter writer = 
                   new FileWriter(GeneratorTree.TREE_FILE); 
writer.write(GeneratorTree.generator()); 
writer.flush(); 
writer.close(); 
logger.debug("end");

菜单js样本
一:

var TREE_ITEMS = [
	['index', '#',
		['001', '#001',
			
			['001001', '#001001',
				['001001001', '#001001001'],
			],
			
			['001002', '#001002',
				['001002001', '#001002001',
					['001002002', '#001002002'],
				],
			],
			
			['001003', '#001001003',
				['001003001', '#001003001',
					['001003001001', '#001003001001'],
					['001003001002', '#001003001001',
						['001003001002001', '#001003001002001'],					
					],
				],
			],
		],
		['002', '#002'],
	]
];

posted @ 2005-09-20 14:11 martin xus| 编辑 收藏

python的强悍(二)

按照需求,从新改写了一下,而这些只是几分钟时间而已。

import cx_Oracle
from Template import *

def parse():
    '''generate the content html'''

    sql = '''select t.bz_code code, t.bz_title title, t.bz_content content
        from bz_czzs t 
        order by t.bz_code'''

    connection = cx_Oracle.connect( 'etasadmin/etasadmin@zhongju' )
    cursor = connection.cursor()
    cursor.execute(sql)
    item=cursor.fetchone()
    i=1;
    print 'begin'
    while item:
        i+=1
        print 'parsing ',i,' item....'
        writeContent(item[0],item[1],str(item[2]))
        item=cursor.fetchone()

def writeContent(code,title,content):
    filedir='D:\\m\\content\\'
    
    params = {'code':code,'title':title,'content':content} 
    t = Template('D:\\workspace\\style\\test\\template.xt',params)
    s = t.parse()

    out = open(filedir+code+".html",'w')
    out.write(s)
    out.flush()
    out.close()
    
if __name__=='__main__':
    print 'parse..................'    
    parse()
    print 'end'

posted @ 2005-09-20 13:42 martin xus| 编辑 收藏

Martin Fowler:闭包

Martin Fowler:闭包
原著:Martin Fowler  http://martinfowler.com/bliki/Closures.html

翻译:huangpuzhuang.com>

http://www.ruby-cn.org/

另外一片文章总结了各种语言实现的本文中的例子。

闭包(Closures)在各种语言中的例子

2004/11/23

本文地址:http://www.ruby-cn.org/articles/closures.html

    随着人们对动态语言兴趣的日益浓厚,越来越多的人都遇到了闭包(Closures )和或块(Blocks)等概念。有着C/C++/Java/C#等语言背景的人因为这些语言本身没有闭包这个概念,所以可能不太了解闭包。本文将简单的介绍一下闭包的概念,那些有大量支持闭包语言编程经验的人也许觉得本文不会太有意思。

    闭包的概念已经提出很长时间了。我第一次碰到这它是在smalltalk中,那时候还叫做块(blocks)。Lisp语言中用的很多。Ruby中也有同样的功能-这也是Ruby用户喜欢Ruby的一个原因。

    本质上来说,一个闭包是一块代码,它们能作为参数传递给一个方法调用。我将通过一个简单的例子来阐述这个观点。假设我们有一个包含一些雇员对象的列表,然后我想列出职位为经理的员工,这样的员工可以通过IsManager判断。在C#里,我们可能会写出下面类似的代码:

  public static IList Managers(IList emps) {
    IList result = new ArrayList();
    foreach(Employee e in emps)
      if (e.IsManager) result.Add(e);
    return result;
  }

    在一种支持闭包的语言中,比如Ruby,我们可以这样写:

  def managers(emps)
	return emps.select {|e| e.isManager}
  end
  

    select是Ruby中定义的集合结构中的一个方法,它接受一个block,也就是闭包,作为一个参数。在Ruby中,闭包写在一对大括号中(不止这一种方法,另一种为do .. end)。如果这个块也接受参数,你可以将这些参数放到两个竖线之间。select方法循环迭代给定的数组,对每个元素执行给定的block,然后将每次执行block返回true的元素组成一个新的数组再返回。

    现在,如果你是C程序员你也许要想,通过函数指针也可以实现,如果你是JAVA程序员,你可能回想我可以用匿名内类来实现,而一个C#者则会想到代理(delegate)。这些机制和闭包类似,但是它们和闭包之间有两个明显得区别。

    第一个是形式上的不同(The first one is a formal difference)。闭包可以引用它定义时候可见的变量。看看下面的方法:

def highPaid(emps)
	threshold = 150
	return emps.select {|e| e.salary > threshold}
end
  

    注意select的block代码中引用了在包含它的方法中的局部变量,而其它不支持真正闭包的语言使用其它方法达到类似功能的方法则不能这样做。闭包还允许你做更有趣的事情,比如下面方法:

def paidMore(amount)
	return Proc.new {|e| e.salary > amount}
end

    这个方法返回一个闭包,实际上它返回一个依赖于传给它的参数的闭包。我可以用一个参数创建一个这样的方法,然后再把它赋给另一个变量。

highPaid = paidMore(150)

    变量 highPaid 包含了一段代码(在Ruby中是一个Proc对象),这段代码将判断一个对象的salary属性是否大于150。我们可以这样使用这个方法:

john = Employee.new
john.salary = 200
print highPaid.call(john)
  

      表达式highPaid.call(john)调用我之前定义的代码,这时候此代码中的amount已经在创建这方法的时候绑定为150。即使现在我执行print 的时候,150已经不在它的范围内了,但是amount和150之间的绑定依然存在。

    所以,闭包的第一个关键点是闭包是一段代码加上和定义它的环境之间的绑定(they are a block of code plus the bindings to the environment they came from)。这是闭包和函数指针等其它相似技术的不同点(java匿名内类可以访问局部变量,但是只有当这些内类是final的时候才行)。

    第二个不同点不是定义形式的不同,但是也同样重要。(The second difference is less of a defined formal difference, but is just as important, if not more so in practice)。支持闭包的语言允许你用很少的语法去定义一个闭包,尽管这点可能不是很重要的一点,但我相信这点是至关重要的-这是使得人们能很自然的使用闭包的关键点。看看Lisp,Smalltalk和Ruby,闭包遍布各处-比其它语言中类似的使用多很多。绑定局部变量是它的特点之一,但我想最大的原因是使用闭包的语法和符号非常简单和清楚。

    一个很好的相关例子是从Smalltalk程序员到JAVA程序员,开始时很多人,包括我,试验性的将在Smalltalk中使用闭包的地方在Java中使用匿名内类来实现。但结果使得代码变得混乱难看,所以我们不得不放弃。

   我在Ruby经常使用闭包,但我不打算创建Proc对象,然后传来传去。大多数时间我用闭包来处理前面我提到的select等基于集合对象的方法。闭包另一个重要用途是'execute around method',比如处理一个文件:

File.open(filename) {|f| doSomethingWithFile(f)}

   这里open方法打开一个文件,然后执行给定的block,然后关闭它。这样处理非常方便,尤其是对事务(要求commit或者rollback),或者其它的你需要在处理结束时候作一些收尾处理的事情。我在我的xml文档转换中广泛使用这个优点。

   闭包的这些用法显然远不如用Lisp语言的人遇到的多,即使我,在使用没有闭包支持的语言的时候,也会想念这些东西。闭包就像一些你第一眼见到觉得不怎么样的东西,但你很快就会喜欢上它们。

其它语言例子

Joe Walnes在blog中提供了 closures in the next version of C#。这个例子是静态类型语言的,基于delegate,且需要delegate关键字。

更新: Ivan Moore提供类类似的 Python 的例子

更新: Vadim Nasardinov 让我知道了来自Guy Steeleled的 closures in Java 这个有趣的珍闻。

 译者注:如你想知道上面例子中文件对象是怎么自己关闭的,请看http://blog.csdn.net/ruby_cn/archive/2004/11/23/192588.aspx,希望可以找到答案。翻译的不好,请多原谅。欢迎交流。括号之中的英语实在是不知如何很好翻译,所以保留了下来。

posted @ 2005-09-20 13:37 martin xus| 编辑 收藏

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