Echo nil > me

Bleach me and begin again

Use Include for Querying to Optimize

| Comments

今天写项目,然后参考ruby-china的一部分代码的时候,看到一个include的用法,不知道是怎么回事,因为它是用mongodb的,所以也一时找不到ActiveRecord中的用法。

不过刚刚在看railscasts的时候,突然就看到了这种用法:

比如说TaskProject是多对一的关系

在index的页面需要用到Task和它belongs_to的那个Project,这样的话,看log里,会发现,查找了Project了很多次。

那么就能用@tasks = Task.find(:all, :include => :project)来查到和project关联的task,这样的话可以把相关联的对象也先读取出来。

那么有什么结果呢?

在console的log里就看得很清楚了,载入页面之后,两次查询就够了。

我自己去写的时候,find方法不起作用,不知道是因为这是以前的写法还是怎样。 就看到实战圣经上有说这个的,原来是includes方法,比如:

1
@events = Event.includes(:user).order('start_date DESC').page(params[:page])

这样就能查询到最近的event,并把对应的user包含进去,再进行分页了。顿时感觉世界好美好的有木有!! 哈哈~

ActiveRecord-ORM of Rails(2)

| Comments

这两天重装系统,没做什么事情,装系统现在已经很快了,只是还在做好多的后续工作,回头再写篇总结好了。先写之前剩下的一篇。这次是聊点ActiveRecord的callback。

Monitor

ActiveRecord控制model的生命周期,包括他们的CRUD(《Agile..》上很风趣地说是watches sadly as they are destroyed. haha)。

而在这过程中的许多时刻我们都可以通过callbacks来进行一些操作.

ActiveRecord定义了十六个回调函数,十四个是before/after_func的形式,分别在一些函数之前或之后被调用,如destory, validation,两个特别的是after_find以及after_initialize,这两个没有对应的before。

他们的流程如下:

ActiveRecord–ORM of Rails(1)

| Comments

最近在看ihower的实战圣经,白天不能上网的话就看《Agile Web Development with rails》的后半部分,又看了railscasts开始几集,正好都讲到了ActiveRecord,也就是rails里MVC的model部分,就索性做个总结。

ORM

ActiveRecord是rails定义的一个类,是rails的ORM,很强大。

ORM(Object-relational mappiing),用我自己的话来说,就是建立在数据库与web程序之间的一种抽象机制,把关系行数据库的表和程序中的对象建立关系,简化了对于数据库的操作,起到了极大的简化作用。而这种抽象与简化对于那些SQL用的不是很熟练的人,对于开发web应用有很好的方便,可以不过多关注底层的sql,而专注于web应用本身。而有些人可能会比较反对这种机制,因为效率或是其他原因。

而Joel Spolsky有个抽象渗漏法则,就是说

所有重大的抽象机制在某种程度上说都是有漏洞的。比如C语言简化了组合语言的繁杂,ruby简化了C,TCP简化了IP,而他们又都有一些缺陷,而他们的实现里又都会混入一些后者,来达到效率等目的。

但是,取舍在于这种抽象能带来更大的好处,比如开发时间的缩短或是怎样。比如,学习ruby、rails这些时间,确实感觉到了它们的快速和方便,虽然听说效率可能不及C或java,但是他们带来的时间的节省以及带给程序员的快乐是很大的,我觉得这些原因就足够了。

What’s the Result of N << N?

| Comments

昨天在ruby-china上看到关于ruby的一个很有意思的问题:

1
2
3
4
5
6
n = [1, 2]
a = n << n
p a
=> [1, 2, [...]]
a[2]
=> [1, 2, [...]]

这是一个无限嵌套的数组,数组允许嵌套,这很正常,不过为什么会出现无限嵌套呢? 好多人给出了各式的答案,还提到了用direct graph去表示递归数组的stackoverflow的一个问题 就是用有向图去表示了一个<<的过程,不过感觉还是没解释这个的原因。

<<

先从<<符号说起,这是一个ruby上用的很多的符号,大概表示append或push的意思,可以用于String,Array等等的类型,甚至是非这些基础类,比如rails里的1-n的关系中就有用到。

object_id

在解释之前要先说一下object_id,这个有点想C++或java里的对象的地址,简单来说就是唯一标识对象的。 在irb里,可以看到[1, 2] << [1, 2]这个的结果是和我们预期的一样的:[1, 2, [1, 2]],而查看[1, 2]object_id,会发现

1
2
3
4
5
6
1.9.3p194 :005 > [1, 2].object_id
 => 84087500 
1.9.3p194 :006 > [1, 2].object_id
 => 84084000 
1.9.3p194 :007 > [1, 2].object_id
 => 84104730 

Using Map Method in a Incredibly Elegant Way

| Comments

今天在写最近的项目的时候,遇到一个问题,本来是想等这个项目完了之后,把学到的一些一起写出来,不过觉得那时应该会工作量比较大,也比较拥挤。 问题是,需要把多个参数转换为一个integer,然后再-1,如下:

1
foo1, foo2, too3 ... = foo1.to_i - 1, foo2.to_i - 1, foo3.to_i -1 ...

如果变量一多,就会很麻烦,要重复写好多(我那里是8个,用了三大行才写下),就去ruby-china上求助,然后很快得到回复,然后得到了一种很漂亮的方法

1
[foo1, foo2, foo3].map(&:to_i).map(&:pred)

这真算是种一看就亮了的方法吧,awesome

map

map的话,确实因为ruby用的不熟,还没想到去用,而且也没考虑要把他们作为一个数组来对待,这其实就是说明一堆没有规律的数据堆在一起,不管操作还是干嘛都很不方便。 所以这里用数组组织起来确实是很合适的,当然,这样直接赋值后的话,还并没有改变那几个变量本身,不过还是可以把结果保存在一个数组中来用的。

&:symbol

最cool的应该是这个吧,看上去是挺容易看懂,就是把每次迭代器的参数对它自身调用to_i方法,并连续调用map。 不过详细解释的话,还是去搜了一下,就在stackoverflow的一个问题里看到了相关话题。 那个被采用的回答里提到

It’s shorthand for tags.map(&:name.to_proc).join(’ ‘)

If foo is an object with a to_proc method, then you can pass it to a method as &foo, which will call foo.to_proc and use that as the method’s block.

Installing the Archlinux OS

| Comments

参考自:老手看这个, 新手教程

这个guides还是很细致的,不过就怕遇到一些莫名的问题就不好了。以及一些不符合自己电脑的东西

虽然在忙个rails的项目,不过还是抽了个空来搞一下一直想玩的arch,也当是从rails里切换出来,放松一下吧。

安装archlinux,版本是2012.09.07(好新~)

PS:其实还是有一段惨痛的波折的,本来是想在已有windows xp和ubuntu双系统的情况下,把ubuntu换成arch的,不过因为有一些原因导致安装不成功,最后不得不砍掉window,来拥抱arch了,不过也好,其实也都不用windows

下载

首先当然是下载了,可以从这里下载,官方推荐用BitTorrent下载,但我这里几乎不能下载,就找到了国内的镜像,挨个点开,比较了一下,当时属北交的最快,十几分钟就搞定了。 当然,下载完了最好检查一下文件的完整性,用sha1sum archlinux-2012.XX.XX-XXXX.iso或md5sum archlinux-2012.XX.XX-XXXX.iso,会得到一个类似于这样的码fa01ac8b4186c17cf7725e24c62c0e1891fcacc0 archlinux-2012.09.07-dual.iso,然后和刚刚下载镜像的那个网站中的sha1sum或md5sum文件中的内容做对比看是不是一样的。

JS GoodPart: Object

| Comments

javsctipt 简单类型包括数字、字符串、boolean、null和undefined,其余都是对象(和Ruby不同

是可变的键控集合(keyed collections)

对象字面量

一个对象字面量就是在一对花括号中的0或多个“键/值”对

对象是属性的容器,每个属性有名字和值,属性名可选择是否用双引号括起来

检索

  1. 【】+字符串
  2. foo.bar (优先)

不存在时返回undefined

  • 用||来赋默认值
  • 用&&来避免undefined错误
1
2
3
4
5
var middle = stooge["middle-name"] || "(none)";
var status = flight.status || "unknown";
flight.equipment // undefined
flight.equipment.model // throw "TypeError"
flight.equipment && flight.equipment.model // undefined

Hello!

| Comments

关于新的博客

早就想搞个技术博客了,之前也写过个RoR的,不过感觉写的不太好,而且又被大作业耽搁了,再加上主机的事,就显得比较麻烦。而这个月又有一些网站,和一些学习的内容, 最近看到用好多用github来写的,觉得挺棒的,很方便,而且很hack的方法,于是我也来试试咯。等更完善的blog engine写出来,并且搞定主机之后,再用自己的去搭吧,现在 还是一切从简。

博客的名字也是早就想好的,用shell的一个挺漂亮的echo命令和ruby里的nil来构成,也很hack,哈哈

博客的搭建,参见octopress,不知道这个名字是怎么取的,不过和wordpress有点像的感觉,是用来表示博客相关的吧,大概。

基本上按照上边网站的指示来搭建就行,当然也可以选择在heroku或是Rsync(第一次听到这个)。不过也有一些问题,主要是在改动_config.yml来进行配置后,先push到remote 那边,结果网页显示不变,看了github上的代码,是有改动的。google之后知道,是因为还要执行rake setup_github_pages来进行初始化deploy,再进行rake deploy就 可以了。

最后就是,发现现在换的这个Terminal Guake对中文的显示感觉挺好的,而且挺漂亮,对vim的color-scheme的显示也会比自带的terminal要好一点,当然也有点不足,比如在vim下 不能用触摸板像操纵滚动条一样调整光标的上下位置,而且没有直接启动的快捷键。不过整体还好,反应速度也不错。

还有就是,twitter上不去了,用GAE的方法也不行,因为它像Github一样加了ssh吧,倒是安全了一些,哎,还是赶快搞个vps吧。