没有样式就是最好的样式

Archive for January, 2007


ruby 资料

Jan 22, 2007 Author: | Filed under: Uncategorized

2006年9月9日下午,Ruby技术沙龙在LUPA总部顺利召开,虽然天下着雨,但来自各个公司以及在杭高校等12位朋友在周末时间还是准时参与了此次沙龙,我代表LUPA社区向你们表示感谢。

  Ruby,一种动态语言,因为ROR这样一种思想很好的WEB框架确变得越来越火,没想到在技术界事情也是这样的难以琢磨。现在看到一篇自认为很好的介绍Ruby,ROR的文章以飨大家。

  Ruby,一种面向对象的脚本语言。它综合了perl,python,java等语言的特点写成,有强大的文字处理能力,简单的语法,完全的面向对象。而且,用它来编程,你会得到很多的乐趣,比如…. 仔细往下看吧。同时欢迎有相同爱好的人一起加入这里,共同学习。

  我不打算浪费时间来谈论Ruby的历史,如果你没有听说过它,你可以去它的主页看看www.ruby-lang.org,或者去它的新闻组comp.lang.ruby。如果你知道Ruby,我将讲述我为什么会喜爱它。

  1. 它是面向对象的。这表示什么意义呢?如果问10个程序员,你也许会得到12种结果,你有你的看法,我不会试图去改变你的看法。但是有一点,Ruby提供了对数据和方法的封装,允许类的继承,对象的多态。不像其它语言(C++,Perl等),Ruby从设计的时候开始就是一种面向对象的语言。

  2. 它是纯面向对象的语言。难道是我多余?不是这样的,之所以这么说,因为Ruby中一切都是对象,包括原始数据类型(primitive data types),比如字符串,整型,都表示的是一个对象,而不需要Java那样提供包装类(wrapper classes)。另外,甚至是常量,也会被当作对象来处理,所以一个方法的接收者,可以是一个数字常量。

  3. 它是动态语言。对于只熟悉像C++,Java这样静态语言的人来说,这是一个重大的概念上的差别。动态意味着方法和变量可以在运行时候添加和重定义。它减少了像C语言那样的条件编译(#ifdef),而且容易实现反射API(reflection API)。动态性使得程序能自我感知(self-aware),比如运行时类型信息,检测丢失的方法,用来检测增加方法的钩子等。在这些方面Ruby和 Lisp和Smalltalk都有一些关系。

  4. 它是一种解释执行的语言。这是一个负杂的问题,值得重点解释一下,也许这个特点会因为性能的原因而引起从优点变为缺点的争论。对于此,我有几点见解:1. 第一:快速开发循环是一个巨大的好处,这要得意于Ruby的解释执行。2.多慢才叫慢呢?在说它慢之前先定一个慢的基准。3.也许有人要批评我了,但我还要说:处理器每年都在变得原来越快。4.如果你真的很在意你的速度,你可以用C开发一部分你的代码。5.最后,从某种意义上说,这是一个还在争论中的问题,没有一个语言天生就是解释型的,世界上没有哪个法律进制开发一个Ruby编译器出来。

  5. 它理解正则表达式。很多年之前,正则表达式只是用在UNIX的工具如grep或者sed中,或者在vi中进行一些一定的查找-替换等。Perl的出现解决了这些问题,而现在,Ruby同样也能做到这些。越来越多得人认识到了这种字符串和文本处理技术的难以置信的能力,如果你对此表示怀疑,那么请去看一下 Jeffrey Friedl的书Mastering Regular Expressions,然后,你就应该不会有什么怀疑了。

  6. 它是多平台的。 Ruby可以运行在Linux,UNIX,Windows,BeOS?,甚至MS-DOS。如果我没记错,甚至还有一个Amiga 版本的

  7. 它是派生来的。这是一件好事情吗?抛去书本上的知识,它是有用的。牛顿曾说过“我如果看得比别人远,那是因为我站在巨人的肩膀上”。Ruby同样也是站在巨人的肩膀上,它借鉴了Smalltalk, CLU, Lisp, C, C++, Perl, Kornshell等的优点。在我看来它的原则包括:1.不要重复制造轮子。2.不要修补没有损坏的东西。3.最后一个也是比较特别的,它能平衡(Leverage )你已有的知识。你了解UNIX的文件和管道,没关系,你可以在Ruby中继续用,你用了两年的时间学习了printf 指示符,不必担心,Ruby中你也可以使用printf。你知道Perl的正则表达式处理,那么你也就学会了Ruby中的正则表达式。

  8. 它是创新的。是不是觉得这个和第七条矛盾了?也许是有一部分矛盾,每个硬币都有两面。一些Ruby的特点都是创新的东西,比如非常有用的Mix-in,也许这个特点会被后来的语言借鉴。(注:一位读者指出Lisp早在1979年就有mix-in了,这是我的疏忽;我应该找个更好的例子,并且能确信它。)

  9. 它是非常高层次的语言。(Very High-Level Language :VHLL) 这是一个容易引起争论的话题,因为这个术语还没有广泛使用。而且它的意思比起OOP来说还是有讨论余地的。我这么说,指的是Ruby能支持复杂的结构和这些结构的负杂的操作,而需要的指令非常少,这与最小努力原则(Principle of Least Effort)一致。

  10. 它有一个灵巧的垃圾收集器。 像malloc和free 这样的例程已经是昨天的恶梦了,你不需要什么回收内存的操作,甚至是调用垃圾收集器。

  11. 它是脚本语言。 不要因为此就认为它不够强大,它不是一个玩具。它是完全成熟的语言,用它能轻松的完成传统的脚本操作,比如运行外部程序,检查系统资源,使用管道,捕获输出等等。

  12. 它是通用的。 Kornshell做的东西它也可以做,C语言做的东西它也可以做的很好。你可以用它写一个只运行一次的只有10行的程序,或者对一些遗留程序进行包装,你想写个web server,或者一个CGI,都可以用Ruby来写。

  13. 它是多线程的。 Y你可以用一些简单的API来写多线程程序,甚至在MS-DOS上都可以。

  14. 它是open source的。 你想看它的源代码吗?可以,你也可以提交补丁,参加广泛的社区,包括它的创造者。

  15. 它是值觉得。 Ruby的学习曲线比较低,而如果你翻过了一个坎,你开始“猜测”事情是怎么工作的,而且你的猜测很多时候都是正确的。Ruby坚持最小惊讶( Least Astonishment)的原则。

  16. 它有异常机制。 像Java和 C++一样, Ruby 中也有异常机制,这意味着你不必因为返回值而将代码弄得凌乱不堪,很少的嵌套if语句,很少的意大利面条似的逻辑,更好的错误处理。

  17. 它有一个高级的数组类:Array。 Ruby中数组都是动态的,你不必像pascal那样在声明它的大小,也不必像C,C++那样为它分配内存。它们是对象,所以你不必关心它们的长度,实际上你不能”走到末尾(walk off the end)”。这个类提供了各种方法,使得你能够根据索引,根据元素来访问数组内容,也可以反向处理数组。你也可以用数作作为set,队列,堆栈等。如果你想用查找表,可以用哈希结构。

  18. 它是可以扩展的。 你可以用C或者Ruby来编写外部库(external libraries),同样,你也可以修改已有的类和对象。

  19. 鼓励文档编程(literate programming)。 你可以在Ruby程序中嵌入注释或者文档,这些文档可以用Ruby的文档工具提取和处理。(真正的文档编程者可能认为这是必须的基本东西吧)

  20. 创造性的使用标点符号和大写字母。比如一个方法返回一个boolean型(Ruby中并没有这种说法),那么一般这个方法最后都以问号结尾,如果一个方法要修改接收者本身,或者具有破坏性,则用一个感叹号结尾,简单,直觉。所有常量,包括类名,都以大写字母开头,所有对象属性以@符号开头。这有匈牙利命名法的实用性,但是没有视觉上的丑陋性。

  21. Reserved words aren’t.It’s perfectly allowable to use an identifier that is a so-called “reserved word” as long as the parser doesn’t perceive an amibiguity. This is a breath of fresh air.

  22. 支持迭代器。 这使得你可以给一个数组,list,tree等对象传递一个块,然后对它们的每个元素进行block调用。这个技术值得深入学习。

  23. 它的安全性。 Ruby借鉴了Perl中基于$SAFE变量的分层控制机制 。这对于CGI程序来说非常有用,可以防止人们攻击web服务器。

  24. Ruby中没有指针。 像 Java一样,和C++不同,Ruby中没有指针的概念,所以免除了关于指针语法和调试的头疼。当然,这也意味着最底层的程序开发将会很困难,比如访问一个设备的控制状态寄存器;但是,我们可以用一个C库来调用。(像C语言程序员有时候要使用汇编语言一样,Ruby程序员有时候也要使用C语言来完成一定的任务)

  25. 它使得人们专注于细节。 Ruby中有很多同义词和别名,你也许不记得字符串或数组的长度是size还是length,没关系,它们任何一个都可以工作。对于Range来说,你可以使用begin 和end 或者使用 first 和 last,它们也都工作。你想拼写indices,结果写成了indexes,没关系,这两个都一样。

  26. 非常灵活的语法。 方法调用时候括号可以省略,参数之间只需用逗号分割。类似Perl风格的数组定义可以让你不用全部使用引号和逗号定义一个字符串的数组。关键字return可以生路。

  27. 丰富的库函数。 Ruby提供了线程,socket,有限对象持久化,CGI,服务器端可执行的,数据库等其它库函数,还有对Tk的支持等。还有很多其它的库函数。

  28. 本身自带调试器(debugger)。 在完美的世界中,我们才不需要调试器,但是这个世界不是完美的。

  29. 交互式执行。 可以用Ruby像Kornshell那样执行。 (这可能是本页最具争论的一点,我不得不承认,Ruby真的不是一个很好的shell。但我仍然坚持,基于Ruby的shell是一个不错的主意。)

  30. 它是简明的。 不像Pascal那样要求if后面跟着then,while后面跟着do 。变量不需要声明,它们不需要类型。返回类型不必指定,关键字return 可以省略,它将返回最后一个表达式的值。另一方面,它也不像Perl或者C那样复杂难懂。

  31. 它是面向表达式的(expression-oriented)。 你可以轻易的使用 x = if a<0 then b else c 这样的表达式。

  32. 语法砂糖(syntax sugar)。 (像Mary Poppins解释:一勺语法的糖能使语义被接受) 。如果你想对数组x进行迭代,可以用for a in x。你也可以用a+=b代替a=a+b,这都行。很多操作符其实在Ruby中都是方法,这些方法的名字比较直观,短小,有着便利的语法。

  33. 它支持操作符重载。如果我没有记错的话,早在很久之前的SNOBOL就提供了这个功能,但是直到C++它才变得流行。虽然它可能乱用而出错,但是这仍是一个非常不错的优点。另外Ruby自动定义操作符的赋值版本,比如,如果你重定义了+,那么,你同时得到了一个+=操作符。

  34. 支持无限精度的数字。 有人会关心 short, int, long吗,只需要使用 Bignum就行了,你可以轻松的实现365的阶乘。

  35. 有幂操作符。在很久以前,我们在BASIC和FORTRAN中使用它,然而当我们学习Pascal和C之后,我们才认识到这个操作符有多差劲。(我们被告知自己连它是怎么工作的都不知道-它使用了对数,迭代了吗,效率如何?),但是,我们真的关系这些吗?如果是,我们可以重写这个方法,否则,Ruby有非常好的* *(星号之间无空格)操作符可以用。

  36. 强大的字符串处理。 If如果你想查找,判断,格式化,trim,定界(delimit),interpose,tokenize,你可以自己选择随便用哪一个来得到你想要的结果。

  37. 规则很少引起异常。 Ruby的语法和语义比其它语言有条理,每种语言都有独特的一面,每条规则都会有异常发生,但是Ruby规则引起的异常就少的多了。

via http://bbs.lupaworld.com/htm_data/254/0609/21737.html

xhtml 1.0 scrollTop 问题

Jan 21, 2007 Author: | Filed under: Uncategorized

问题

Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

加上这段后,document.body.scrollTop永远等于0

body onscroll = “alert(document.body.scrollTop);”永远也不会引发。

解决

使用 document.documentElement.scrollTop 即可。

var top = (document.documentElement && document.documentElement.scrollTop) ?

document.documentElement.scrollTop : document.body.scrollTop;

prototype.js 资料

Jan 21, 2007 Author: | Filed under: Uncategorized

这是别人的介绍

以下为引用内容:

prototype.js是一个非常优雅的javascript基础类库,对javascript做了大量的扩展,而且很好的支持Ajax,国外有多个基于此类库实现的效果库,也做得很棒。

prototype.js不仅是一个有很大实用价值的js库,而且有很高的学习价值,所以我强烈建议B/S开发人员和对JS开发感兴趣的朋友去浏览一些它的源代码,其中有很多的珠玑,你绝对会觉得读它的源代码是一种享受,当然要读得懂,呵呵。

网上也有人写过1.3版的源码解读,大家可以找来看看。不过1.4版做了很大的扩充,所以希望有朋友写出1.4版的源码解读。


以下为引用内容:

或许你还没有用过它, prototype.js 是一个由Sam Stephenson写的JavaScript包。这个构思奇妙编写良好的一段兼容标准的一段代码将承担创造胖客户端, 高交互性WEB应用程序的重担。轻松加入Web 2.0特性。

以下为引用内容:

编写这些方法的明显的目的就是为了减少你大量的重复编码和惯用法。

在我看来,就是类似龚睿这样的程序员懒汉,多年来对javascript不屑一顾之后的葵花宝典,代码封装且简单优雅,但首先要挥刀自宫…

prototype.js.cn.zip

prototype.js 1.4版开发者手册

ruby 学习笔记

Jan 20, 2007 Author: | Filed under: Uncategorized

下载图片

只需三行代码,就可以通过http下载漂亮的图片!

CODE:

require “open-uri”

data=open(”http://bbs.railschina.com/images/default/logo.gif”){|f|f.read}

open(”logo.gif”,”wb”){|f|f.write(data)}

axgle说明:1.open方法如果要把uri作为文件打开,需要require “open-uri”这个库文件。

2.因为logo.gif是图片,属于二进制数据(binary),所以open(”logo.gif”,”wb”)里应该是“wb”(write binary),不能是”w”(如果你搞不清楚什么时候该wb,什么时候该w,那么统一填写wb就可以了,反正计算机最喜欢二进制).

如果谁的网站上有1000个图片,并且是img1,img2这样命名的,那么你可以用一个循环语句,把他们都下载回来

open() 里的地址可以用其它的替代.

“f”是文件对象。

open(){}读取的是图片的内容,一堆只有计算机才认识的数据,然后传递给了data。

批量下载:

CODE:

require “open-uri”

for i in 1..10

uri=”http://bbs.railschina.com/images/default/logo” +i.to_s +”.gif”

data=open(uri){|f|f.read}

open(”logo” + i.to_s + “.gif”,”wb”){|f|f.write(data)}

end

注意:bbs.railschina.com得有logo1.gif,logo2.gif…logo10.gif十张图片才行,这里只是演示。

via http://bbs.railschina.com/thread-23-1-1.html

字符串换行处理

你用记事本或者其他编辑器写了一段话,是一行一行的。但是当你把它们用在浏览器里显示的时候,却没有换行(这是因为浏览器换行要用
表示)。下面用ruby把换行符转化为

CODE:

String.class_eval do

def br

self.gsub(/
|
|
/,”
“)

end

end

#下面是测试

test_str=%{one

two

three

}

print test_str.br

axgle说明:我们处理的类叫做“String”,它管理着所有字符串对象。因为任何类都有class_eval 这个方法,所以String也有这个方法。

通过“class_eval do end”,可以给类添加新的方法。这里就是给String类添加了一个br方法.br方法中的gsub是替换字符串的意思,具体用法请参考手册。大体就是这样,讲解完毕。

ruby计数器

五行代码编写一个基于文本的ruby计数器.

CODE:

file=”count.txt”

i=open(file){|f|f.read}.to_i rescue 0

i+=1

print i

open(file,”w”){|f|f.write(i)}

axgle说明:文件里读取出来的数据类型是字符串,to_i表示把字符串转化为数字,这样后面才能做加法运算(可见ruby是强类型语言)

如果file文件不存在(异常),则rescue 0,表示i默认为0(rescue能够抑制异常的出现).递增显示后,重新写入file文件,完毕。

ruby 电子书下载(强烈推荐):

http://www.blogjava.net/cap/articles/book.html

ruby 书籍下载(emule)

firefox 使用 event 的问题(转)

Jan 19, 2007 Author: | Filed under: Uncategorized

不错的文章。原文在 lupa forum

在FireFox下编写事件处理函数是很麻烦的事.

因为FireFox并没有 window.event . 如果要得到 event 对象,就必须要声明时间处理函数的第一个参数为event.

所以为了兼容IE与FireFox,一般的事件处理方法为:

btn.onclick=handle_btn_click;

function handle_btn_click(evt)

{

if(evt==null)evt=window.event;//IE

//处理事件.

}

对于简单的程序,这不算麻烦.

但对于一些复杂的程序,某写函数根本就不是直接与事件挂钩的.如果要把event传进该参数,那么所有的方法都要把event传来传去..这简直就是噩梦.

下面介绍一个解决这个麻烦事的方法,与原理.

JScript中,函数的调用是有一个 func.caller 这个属性的.

例如

function A()

{

B();

}

function B()

{

alert(B.caller);

}

如果B被A调用,那么B.caller就是A

另外,函数有一个arguments属性. 这个属性可以遍历函数当前执行的参数:

function myalert()

{

var arr=[];

for(var i=0;i

arr=myalert.arguments;

alert(arr.join(”-”));

}

alert(”hello”,”world”,1,2,3)

就能显示 hello-world-1-2-3

(arguments的个数与调用方有关,而与函数的参数定义没有任何关系)

根据这两个属性,我们可以得到第一个函数的event对象:

btn.onclick=handle_click;

function handle_click()

{

showcontent();

}

function showcontent()

{

var evt=SearchEvent();

if(evt&&evt.shiftKey)//如果是基于事件的调用,并且shift被按下

window.open(global_helpurl);

else

location.href=global_helpurl;

}

function SearchEvent()

{

func=SearchEvent.caller;

while(func!=null)

{

var arg0=func.arguments[0];

if(arg0)

{

if(arg0.constructor==Event) // 如果就是event 对象

return arg0;

}

func=func.caller;

}

return null;

}

这个例子使用了SearchEvent来搜索event对象. 其中 ‘Event’ 是 FireFox 的 event.constructor .

在该例子运行时,

SearchEvent.caller就是showcontent,但是showcontent.arguments[0]是空.所以 func=func.caller 时,func变为handle_click .

handle_click 被 FireFox 调用, 虽然没有定义参数,但是被调用时,第一个参数就是event,所以handle_click.arguments[0]就是event !

针对上面的知识,我们可以结合 prototype.__defineGetter__ 来实现 window.event 在 FireFox 下的实现

JSON

Jan 18, 2007 Author: | Filed under: Uncategorized

JSON, which stands for JavaScript Object Notation, is a lightweight data-interchange format aimed at easy use in browser-based code, as well as in most desktop or server-side programming environments.

JSON(Javascript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于Javascript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, Javascript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON概念很简单,就是服务器直接生成Javascript语句,客户端获取后直接用eval方法来获得这个对象,这样就可以省去解析XML的性损失。

例如:

使用XML表示:

代码: [ 复制到剪贴板 ]

1

Jackson

thor>

http://www.richweb.cn

Welcome to RichWeb.cn

2

Relkn

http://www.richweb.cn

RichWeb.cn关注互联网新技术

3

Kvogend

http://www.richweb.cn

RichWeb.cn关注WEB2.0

使用JSON:

代码: [ 复制到剪贴板 ]

{items:[

{

id:1,

author:"Jackson",

url:"http://www.richweb.cn",

content:"Welcome to RichWeb.cn"

},

{

id:2,

author:"Relkn",

url:"http://www.richweb.cn",

content:"RichWeb.cn关注互联网新技术"

},

{

id:3,

author:"Kvogend",

url:"http://www.richweb.cn",

content:"RichWeb.cn关注WEB2.0"

}

]};

JSON不仅减少了解析XML解析带来的性能问题和兼容性问题,而且对于Javascript来说非常容易使用,可以方便的通过遍历数组以及访问对象属性来获取数据,其可读性也不错,基本具备了结构化数据的性质。不得不说是一个很好的办法,而且事实上google maps就没有采用XML传递数据,而是采用了JSON方案。

JSON的另外一个优势是”跨域性”,例如你在www.richweb.cn的网页里使用

运行代码 [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

这是 http://del.icio.us/feeds/json/tags/guoshuang?count=20&sort=count 给出的内容

if(typeof(Delicious) == ‘undefined’) Delicious = {}; Delicious.tags = {”linux”:76,”webdesign”:65,”ubuntu”:61,”firefox”:60,”blog”:31,”css”:31,”windows”:28,”google”:26,”software”:26,”opera”:24,”design”:19,”javascript”:19,”xp”:17,”china”:16,”geek”:15,”web2.0″:14,”coding”:13,”ie”:13}

有趣,而且跨域。