温故而知新,可以为师矣

Ruby语言中的Enumerable::inject方法

作者:admin 时间:12.18.2009 类别:Ruby & Rails

在使用一组数据的过程中(比如说数组),我们可能经常需要遍历其中的每一个元素,拿着每一个元素做些计算并收集这些计算结果,比如像下面这个数组:

1
nums = [1, 3, 5, 7]

如果你想计算数组中所有元素的和,那么我们可以使用each方法,像下面这样:

1
2
sum = 0
nums.each { |n| sum += n }

这样子做是可以正常工作的,但是ruby提供了更灵活的inject方法,点这里查看(Enumerable::inject

1
sum = nums.inject(0) { |x,n| x+n }

上面这做对代码也可以计算出同样的值,但是它是用inject方法。Inject是通过一个accumulator来完成收集值的过程的,在上面代码中accumulator是x。inject的每一步中,上一次block执行的结果会被赋值给下一次block执行时的accumulator。在这里我们是把accumulator的初始值设定成了0,每一步中当前遍历的元素的值被加到了accumulator上。

如果省略了inject方法的参数,那么accumulator的初始值则是数组中的第一个元素,紧接着的遍历过程则从数组中第二个元素开始(下标为1),比如:

1
sum = nums.inject { |x,n| x+n }

它和下面代码完成的事情是一样的:

1
2
sum = nums[0]
nums[1..-1].each { |n| sum += n }

我们再看一个例子,假设我们有五个名子组成的数组:

1
names = ["edde", "rita", "guapo", "andy", "ash"]

下面的代码:

1
string = names.inject("") { |x,n| x << "#{n} " }

将会输出:

1
"edde rita guapo andy ash "

当然你也可以通过这样的代码来得到同样的结果:

1
2
string = ""
names.each { |n| string << "#{n} "}

这里有一点请大家记住,在inject的每一步里你可以做任何事情,或者说的更明确些你可以做非常复杂的事情,比如让我们上面的例子变得稍微复杂一些,我们想让每个人名首字母大写,后面接着一个逗号,人名和人名之间用空格分开,当然最后一个人名之后不需要再加任何字符,用我们熟悉的each方法,我们可以这样做:

1
2
3
4
5
string = ""
names.each do |n|
    name = n.length > 4 ? n.capitalize : n
    n == names.last ? string << name : string << "#{name}, "
end

如果用inject方法,可以像下面这样:

1
2
3
4
string = names.inject("") do |x,n|
  name = n.length > 4 ? n.capitalize : n
  n == names.last ? x << name : x << "#{name}, "
end

上面两段代码都会输入相同的结果:

1
"Edde, Rita, Guapo, Andy, Ash"

绕口令(tongue twister)

作者:admin 时间:12.17.2009 类别:生活娱乐, 英语

  绕口令真的很不容易说好,但是我觉得还是很值得练习练习的,一来可以让自己口腔肌肉变得更加灵活,二来也可以在朋友面前秀一秀,何乐而不为呢?英文中也有绕口令,叫做tongue twister,这个名子真的很形象,似乎是在告诉我们绕口令可以让我们的舌头都卷起来,哈哈。

tongue twister在朗文词典和柯林斯词典中的解释如下:

  1. A word or phrase that is difficult to say quickly.
  2. A tongue-twister is a sentence or expression which is very difficult to say properly, especially when you try to say it quickly.

下面是一个很有名的中文绕口令:

《喇嘛和哑巴》

  打南边来了个喇嘛,手里提拉着五斤鳎(tǎ)目(ma)。打北边来了个哑巴,腰里别着个喇叭。南边提拉着鳎目的喇嘛要拿鳎目换北边别喇叭哑巴的喇叭。  哑巴不愿意拿喇叭换喇嘛的鳎目,喇嘛非要换别喇叭哑巴的喇叭。
喇嘛抡起鳎目抽了别喇叭哑巴一鳎目,哑巴摘下喇叭打了提拉着鳎目的喇嘛一喇叭。也不知是提拉着鳎目的喇嘛抽了别喇叭哑巴一鳎目,还是别喇叭哑巴打了提拉着鳎目的喇嘛一喇叭。喇嘛炖鳎目,哑巴嘀嘀哒哒吹喇叭。

以下是几个tongue twister:

  1. George Gabs grabs crabs. Crabs George Gabs grabs. When George Gabs grabs crabs, how does George Gabs grab crabs?
  2. All I want is a proper cup of coffee made in a proper copper coffee pot, you can believe it or not, but I just want a cup of coffee in a proper coffee pot. Tin coffee pots or iron coffee pots are of no use to me. If I can’t have a proper cup of coffee in a proper copper coffee pot, I’ll have a cup of tea!
  3. A tutor who tooted a flute tried to tutor two tooters to toot. Said the two to their tutor, “Is it harder to toot or to tutor two tooters to toot?”
  4. Mr. See owned a saw. And Mr. Soar owned a seesaw. Now See’s saw sawed Soar’s seesaw before Soar saw See, which made Soar sore. Had Soar seen See’s saw before See sawed Soar’s seesaw, See’s saw would not have sawed Soar’s seesaw. So See’s saw sawed Soar’s seesaw. But it was sad to see Soar so sore just because See’s saw sawed Soar’s seesaw!
  5. She sells seashells on the sea shore. The shells she sells are surely seashells. So if she sells shells on the seashore, I’m sure she sells seashore shells.
  6. Silly Sally swiftly shooed seven silly sheep. The seven silly sheep Silly Sally shooed shilly-shallied south. These sheep shouldn’t sleep in a shack; sheep should sleep in a shed.

腾讯推出QQ五笔输入法

作者:admin 时间:12.17.2009 类别:应用软件

这两年输入法和浏览器一样也成了各大公司抢夺的重要市场,QQ早先已经推出了拼音输入法,现在它又推出了五笔输入法,因为我是用五笔输入法的,所以得到这条消息还是想试一试。下面是官方的一些介绍:

版本最新特性
1、三种输入模式,五笔拼音混输、纯五笔、纯拼音,让你使用更方便
2、用户可定制候选词的排列顺序,固定词序或按输入次数排序
3、推出词库管理工具,用户可评估、替换系统词库,使用自己的词库,输入得心应手
4、支持下载添加分类词库(dict.py.qq.com)
5、大量精美皮肤,支持在线安装(skin.py.qq.com)
6、提供手动造词、编码反查、候选词置顶、候选词删除等快捷操作
7、分号模式支持临时英文输入、数字转换、计算器等便捷输入
8、“Ctrl+;”快捷切换到QQ五笔 (需要先在设置中开通)
9、用户可以在“个人信息”中查看输入速度,学习之前输入中不熟悉的字词
QQ五笔输入法的特色
词库开放

提供词库管理工具,用户可以方便地替换系统词库。

输入速度快

输入速度快,占用资源小,让五笔输入更顺畅。

兼容性高,更加稳定

专业的兼容性测试,让QQ五笔表现更加稳定。

大量精美皮肤

提供多套精美皮肤,让书写更加享受。

关于网站中script标签的位置

作者:admin 时间:12.12.2009 类别:Javascript

我在好久以前就看到有些网站在引入js文件时把script标签写在了body的结束标签之前,也就是像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<body>

<p>Hello get2know.it<p/>

<script type="text/JavaScript" src="jquery.min.js">
<script type="text/javascript">
    $(function(){
    alert($("p").text());
    });
</script>
</body>
</html>

但是却一直不知道人家为什么要这么写,现在我明白是为什么了,原来把script紧挨着写在body之前有好处的,因为:

  1. script标签写在head里会导致浏览器在遇到script标签时去下载这个js文件,这时浏览器是不会并行地去做其它的download的(比如图片),而用户在这个时候因为dom没有加载完成,所以什么也不会看到,所以给用户的体验不好。
  2. script写在head里会使得浏览器在遇到这些Javascript代码时就去执行它们,而Javascript大多数都是要去操作dom的,而这时dom并不存在,所以这样的Javascript里就得写一些事件注册的代码,比如window.onload=init;之类的,而把script标签写在body结束标签之前时则不需要这样的事件注册的代码,大家想一想一个很简单的道理,代码多了执行需要的时间肯定会长一些,所以说把script标签写在body结束标签之前会提高程序的效率。
  3. 把script标签写在body结束标签之前的话,Javascript代码在被执行时dom已经加载完成,所以不会出现因为dom没有加载完成而出现的一现问题,你可以直接书写你要写的代码,需要打的字会相应地少一点。
  4. 把script标签写在head里是不过是我们长期以来的一种古老的编程习惯罢了。

下面一些网站都把script标签写在了body结束标签之前:

  1. http://www.youku.com
  2. http://www.tudou.com
  3. http://css3.org
  4. http://www.yahoo.com
  5. http://www.qq.com
  6. http://www.sina.com.cn

新网站开张了,希望大家多多支持

作者:admin 时间:12.12.2009 类别:其它类别

用了差不多一个星期的业余时间,在2009年12月13日5点46分Get2Know.it终于可以访问了。我还是很高兴的,毕竟终于有了一个可以说话的地方了,哈哈!

以前我也用过各种各样的博客,最早可以追溯到2002年到2003年这一段时间。不过那时是不太了解blog,加上又没什么可以写的东西,于是放弃了。后来过了一些时间又想找个博客来记录自己平时的学习心得什么的,也试过blogspot、wordpress、blogjava、donews、qzone、blogger、新浪博客、网易博客、天涯博客等等等等,但要么是因为网站在国外被封,要么是可定制性太差限制太多,于是全部放弃。终于前几个星期买了空间和域名,打算自己架设blog,目的是想得到高度的可定制性。哈哈,用其它的提供商提供的blog在我感觉就好像是带着枷锁走路一样,太难受了,也许这是做技术人员的通病吧…

空间域名买到后为选哪个系统还是经过了一些考虑,最终选择了最火爆的wordpress系统。这几天主要做的事情有:

  1. 下载安装到本地,熟悉一下其基本操作
  2. 看了一下wordpress的wiki,了解了一下wordpress的结构
  3. 在网络上找漂亮的模板
  4. 因为第3步没有结果,所以只有把一个还看得过眼的进行修改,从而得到现在这个样子
  5. 修改完后上传代码,建立数据库

目前的想法是,这个blog里会记录一些我学习到的内容做为以后的参考,另外也可以分享给大家,希望大家支持:-)