Archive for December, 2007
December 21st, 2007 by 张磊
有好长时间不用javascript,这几天用起来还有点不纯熟。不想看到再有人说javascript是rubbish,关键还是人怎么使用它。复习一下有关的知识:
javascript中的数组
arr = new Array();
arr = new Array(num);
arr = new Array(["item1","item2"...]);
数组的创建基本就这几种,我用的最多的是第一种。表面看起来,创建数组的时候提供一个整型参数可以创建一个定长数组,其实还是可以使用超出范围的index来设置数组元素的。比如用arr = new Array(3)创建一个数组,仍然可以用arr[100]=”item100″进行赋值。所以,还不如干脆用第一种呢。
javascript中的类
function Shop (name) {
this.name = name;
this.somefunc = function (){
}
}
在JS中,声明一个类不是用class XXX,而是用上面的方法。Javascript中的类有些高级的用法,如果感兴趣可以看一下script.aculo.us/prototype这些库的程序,还是比较容易懂的。我自己掌握的就是上面这个简单的办法。使用的时候,通过shop = new Shop(name) 就可以创建一个Shop的类。
当然,类也可以包含方法,具体的用法,实践一下就好。
JSON
最初接触AJAX的时候,在我的启蒙书籍“AJAX基础教程”中看到过JSON。当时我用AJAX根本用不到XML(只用TEXT),所以也没打算去折腾这个看起来比XML复杂的JSON。
JSON是这样一个东西,可以把任何Javascript的对象、数组等数据编码为一个字串,而比同样内容编码为XML要省了不少空间。如果想向服务器发送一个或多个对象的信息,用JSON无疑是很方便的。关于JSON的具体介绍可以看这里。
想用JSON,需要先下载一个JSON的文件,地址是http://json.org/json.js。下载之后包含在页面内,对任何想编码为JSON的数据,只要调用一下toJSONString()就可以了。
比如一个数组定义为 arr = new Array(["item1","item2"]); ,使用arr.toJSONString()将返回[["item1"],["item2"]]。
上面说了编码JSON。想把原来的对象还原回来,只要用eval()函数。当然eval的效率值得商榷,不过还没进行过具体的测试。
此外,友情提醒一下,那个JSON.js文件里面注释占了一大部分。如果要用在实际的项目中,最好都干掉吧,不然很影响加载的速度。
December 20th, 2007 by 张磊
昨天的比赛,结果出来了,我是三等奖,在14个作品里是第7。先前听到现场同学的消息,以为自己会在前面几名的。不知是评委修改打分了还是怎么了。不过拿奖就赚,运气尚可。
读书改变生活。昨天晚上去卓越亚马逊上买了3本书,现在在琢磨寒假时怎么把厚书运回山西呢。

貌似是去年初看alone买的一本《程序员》,上面说算法方面的书籍时,提到了这本《算法导论》。alone后来借阅过这本书,说上面全是数学,很难理解。而我则看过另一本《计算机程序设计艺术》,感觉确实高深。
不过时代变了,在这一年里,虽然我没有在数学上有啥研究,可是在其他方面觉得有很多进步。总认为人对事物的理解像是一个“层次遍历”的过程,所以现在买来再读,不知道能不能读懂。算法方面的书,和前面说的C语言的书一样,经典著作很难过时。

这本书我也提过很多次了,我没读过。只读过它的第一版。第一版给我的感觉是,rails实在太神奇了。我先从图书馆借来,然后看着不过瘾,自己又去网上买了一本。现在我也经常在上课时拿去教室看。如今,第一版已经被我翻来覆去读了许多次,前些日子也开始了一些实践。但看到这个第二版,还是忍不住买了。图书馆里找不到,也不知道崭新的rails会有怎样的不同。而且,价格还比第一版贵了60%。

这本书本来没打算买,偶然看到却吸引我了。因为最近的一个项目里要用到这两样东西:Ajax&rails,这本书无疑是个好教材。同时里面的script.aculo.us和rails的版本都不算旧。要去上课了,就写到这里吧
December 20th, 2007 by 张磊
很多年以前家里给我买了这本书,记得当时这本书非常畅销。那时我还在上四年级,对书里的很多东西都看得一知半解,但是还是觉得非常新颖。后来听到了一些批评的声音,说里面的一些学习方法不大适合国内的学生使用。不过已经是很久以后了。
很小的时候,不会质疑,看什么都觉得别人对。现在觉得自己牛气了,啥都不服,总想挑出点刺来。
谈这本书只是个引子。最近需要学很多东西,比如rails,比如一些javascript的库(dojo、scriptaculous等等),而这样的学习,和以前的方式,区别太大了。
首先就是告别了书本。不是没有书,只是在这个迅猛发展的领域,当一本书出来的时候,已经陈旧了。Rails最新的版本是2.0,是前些日子出来的。而我昨天下单购买的《Web 开发敏捷之道》是市面上最新的介绍rails开发的书,用的是rails1.8。更别说我手里那本拿过Jolt震撼大奖的《应用rails进行敏捷Web开发》,是2006年出版的书,谈的是更早的版本。
同样的例子也发生在我要学的dojo上。我手里的一本介绍几个JS框架的书讲的dojo是0.36版的,而现在的dojo已经出到了1.01。script.aculo.us也是这样。
一个好用的东西(不管是新的技术还是框架或者别的)X被人们最初接触,然后有睿智的人想为它写本书,熟悉和深入理解的过程怎么也得2、3个月。而不管书有多薄,写一本书花的时间不会少于4个月。等到出版,至少已经离X出世有半年了。而这时的书,一般还是英文的。我们国内的精英们虽然写不出什么畅销的书,可是至少还会翻译啊。一翻译,又一个季度没了。等到翻译出来的书被广大读者推荐,更多的人认识到它的价值开始关注,算下来,X就该一岁了。谭浩强讲C语言编程的书可能10年都不会过时,但在一个迅猛发展的领域,一年,世界可能早就翻天覆地了。
我们应该做好准备拥抱这一场革命,这也是场学习的革命。互联网依然在不停地改变着我们,对新事物应保持足够的敏感,同时也该学好英文——这个和什么民族感情一点关系也没有。不要总在思考之前就去提问,自己的学习往往收获更多,更别说可能周围没有人能回答你的问题。多用互联网,多去搜索多去提问,当然,也要多贡献。再新的图书也没有4天前的技术文章来得新 ,再全的纸质手册也比不上一个大家贡献内容的Wiki。
December 19th, 2007 by 张磊
一大早还在梦里呢,popo就接到了辅导员老师的电话。通知下午去参加科技作品评比的事。一共14个作品入围最后的评比,我们班有3个。特别滑稽的是,我本来是该被刷掉的。可是那边老师都念在我往上报了9个作品,积极地支持了学校的活动,给我网开一面,让我从9个里面选择一个去展示、评比。
若说作品的技术含量或是复杂程度,我感觉这9个作品不说全部进入了final round吧,至少有4件有这个实力。但评委们都是计算机学院的资深老师,大多都看不起网站作品。差点就没机会发挥了,本来想拿个不错的奖,只好降低目标,想着拿奖就赚。
顺便说说这个科技作品评比的活动。其实在我做上一届科技部长时,这个活动就有策划了。只是当时很仓促,各方面条件也不成熟,最终只是把那些作品的截图拿出来做成展板——自然也没什么奖品。而今年有了校友捐赠,最好的奖品是一台价值6K的笔记本,这活动自然也有好多人参加了。可是学院组织活动的狼狈还是没有改观,虎头蛇尾。我实在不知道为什么评委在popo报的4个项目里偏偏选了一个没有做完的。
最近事情很多。可是上午还是为这事慌了一上午,很有压力。因为一方面,拿出来的东西好好讲可以比较好,我的表达能力也没的说。可是另一方面,评委的胃口吃不准,假如一看是网站作品就一棍子打死,实在太亏了。慌张。每个展示只有5分钟时间,对于牛扑这样的程序,连功能的演示都不够。后来做了个简单的PPT,打算到时候个人演讲为主,网站、PPT演示作辅助。前些日子做沙龙,一个朋友做了一个没用任何模板的底色留白的PPT,感觉非常好,于是我今天也这么做了。(PPT像是讣告,如果有兴趣,不妨看看:
http://docs.google.com/Presentation?id=dccpwt5s_162gwcmn2n6)
下午和popo一起去了比赛场地,发现教室的电脑居然还不能上网。感谢我的同学陈伟,和网管中心联系了一下终于可以上网。我和popo没有抽签,结果popo被排在第一个,我在第四个。
开始之后,在我前面的3个除了popo,还有一个是成天在辅导员老师blog上高调谈论自己在阿里软件多么NB的,另一个是研究生,做的东西技术含量还是很高的,只是后来估计分数未必有我高。很快就轮到我了。
主持人挺漂亮,是Tom的前GF。
上去演示的是牛扑,可是服务器在大洋彼岸,打开很慢。于是先自我介绍,然后先说了下我理解的网站是“software for the internet”,希望这样能避免被一棍子打死。 时间很短,尽力说快,还是超时了。而且没有评委提问这一节,总之,组织还不很完善。
做沙龙的经历让我讲东西的时候很沉的住气,哪怕只有5分钟,也先留了好几个悬念后面才揭开。谈吐和表达,都还需要更多的锻炼。在上面讲完,最后给学院的同学们写了20字的寄语:“打好基础 相信逻辑 关注行业 勤于思考 乐于实践”。大学的前两年虽然自己有很大提高,终究没给学院争得过什么荣誉,后两年估计也没既会了。也不知道这20个字能传播多久。
很多事,从下午回来到现在,手忙脚乱,一篇blog,写了好几个小时。后来听说,我拿个二等奖还是很有希望的。
December 18th, 2007 by 张磊
最近需要做一个包含拖放功能的东西,一直在考虑如何去实现。前些日子我在看Dojo,一边看一边脑子里就一个念头:不会吧,这么强悍啊。而最近要做的东西打算后端用rails做,rails里面自带了script.aculo.us(后面简称s.a.u吧),于是很长时间我都在面临选择:是用dojo呢还是用s.a.u呢?
后来还是下载了s.a.u,花了大概半个小时,一边看书一边看wiki上的帮助,成功做了这么一个拖放的demo。演示在这里:http://www.blogkid.net/prototype/testdnd.html
在IE浏览器下排序列表的序号会有奇怪的变化,还没搞明白怎么解决。推荐用Firefox试。每个大的块可以拖动,每个小条目也可以移动。
具体的实现其实是用了Sortable,创建了可排序的拖放。程序大体是这样的 :
HTML部分:
<ul id=”base1″><li>item1</li> <li>item2</li></ul>
<ul id=”base2″><li>item3</li> <li>item4</li></ul>
Javascript部分:
Sortable.create(“base1″,{
constraint:false , dropOnEmpty:true , containment: ["base1","base2"]
});
Sortable.create(“base2″,{
constraint:false , dropOnEmpty:true , containment: ["base1","base2"]
});
其中create的第二个参数可以有很多选项,这里用的constraint是指定拖动方向的;dropOnEmpty表示当容器为空时,是否还能继续拖入;而containment用来指定可以容纳来自哪几个元素的子元素。
当然,在s.a.u中,Drag and Drop大多数时候是用Draggable和Droppables来实现的,我也试了一下。具体内容大家用s.a.u的时候,自己体会吧。推荐这本书:征服Ajax-Dojo、Prototype、script.aculo.us框架解析与实例,我最初是看它才初步了解了Dojo/Prototype这些东西的。
December 17th, 2007 by 张磊
最近用ruby on rails做东西,但也不指望能用啥IDE了,找个趁手的文本编辑器就够了。因为在ubuntu下,默认的是gedit,可这东西有一个不好,就是每次我改了一个文件,它都会自作聪明地做一个备份。这导致我目录里几乎每个文件都有两份,删掉又会再来,好不麻烦。
于是就找有没东西可以替代。Kate和Kedit就算了,在我用的Gnome上不太好使。komodo edit貌似是免费的,可也太大了,下载都得好久。后来居然找到一个叫做Scribes的,被交口称赞,于是装来用用。安装很简单:
apt-get install scribes
装好打开一看,怎么这么简陋。连菜单栏都没有,只有个工具栏。但实际的使用中才感觉到它的强大。作为一个text editor,Scribes居然有代码提示、自动完成的功能,这可是一般放在IDE中才有的。于是写起ruby来也更有感觉了。当然,它是没有语法错误提示的,这个需要开发者细心一点了。
December 17th, 2007 by 张磊
最近看rails如痴如醉阿,上一篇写过两点收获,今天又有很多。感觉之前看书就像听老师讲课,很系统地领会了一次。而现在动手做的过程,无疑更刺激。
用render :partial生成小块(部分)内容
在做软件工程作业时,需要在里面加一个搜索框。首页需要一个,搜索结果页面也需要放一个。当然可以分别在两个地方写一次,也没多少。可是敏感的人们一定能感觉到,这个违背了rails所提倡的DRY的精神。没关系,rails早就想到了。可以用render :partial来生成小部分内容。(坦白说,若不是rails,我也不会这么积极地寻找能遵守DRY原则的方法)
需要用这样的形式来使用:render :partial => ‘path/filename’。应当注意的是,相应的模板(.rhtml)文件该保存为“_”开头的。比如我的模板文件在app/views/book/_search_form.rhtml,若在BookController的方法中调用时,直接用
render :partial => ‘search_form’
若在别的控制器中,则需要
render :partial => ‘book/search_form’
用content_for()填充预留块
同样是部分内容。在有的情况下,可能不同页面的同一部分需要不同的内容,比如侧边栏在不同的页面上需要体现不同内容,这时可以用yield先预留一个位置:
<div id=”sidebar”>
<% yield :sidebar %>
</div>
然后在具体页面上可以这样做:
<% content_for :sidebar %>
sidebar content
<% end %>
这样就能把中间“sidebar content”输出到刚才预留的位置。
懒得装那些用于代码高亮的插件了,用简单的缩进也能描述清楚。先写这两个吧,其实还有很多,慢慢写
December 17th, 2007 by 张磊
还能记起在北京的暑假,地铁里的某一段,两边都是《魔兽世界》的广告。对游戏没啥兴趣的我,却一直能记得这句广告词:“做你从未做过的事”。
最近很饥渴地接触了很多东西,ruby&rails/dojo,还看了很多关于设计模式的内容。在计算机的世界里,很多东西都很相似;而在更大的世界里,也有那么多类似的东西——直让人想起狭义和广义相对论,虽然我一直都没太看明白。霍金的书像是讲故事,读起来更有趣。
dojo很惊艳,而rails让人惊讶。有人在我技术blog上说PHP是rubbish,我从来都懒得和这种无聊的人争论。没有做过,也就没有发言权。
今天要开始一个新的Project,有点遗憾要暂时把Camel放下了。我快要20岁了,感觉比起3年前的Livid,还是差了很多。境界上的差距,来自所接触的人和事,不是啃啃书本写写程序就能弥补。
所以,都积极起来吧。亲爱的们,趁着年轻,好好地感受这个世界吧。
December 16th, 2007 by 张磊
在北京的时候,明知电影院里是被阉的版本,某人和我还不约而同地想到要去影院看。浪漫的代价是100元电影票。没想到,还拖拖拉拉迟到了10分钟。
而那次看得没太大感觉,略显跳跃的情节也有点不爽。今天早上看到了飞猪的更新 ,说是DVD高清,还是香港那边的版本,一下就动了心。专门去下载来了电骡,开始下色戒。
一直下到晚上,终于下载回来了。传给Alone,Alone又分给popo,我们三个男的,就开始看这个准A片。看了之后才觉得,本以为没剪多少呢,居然剪掉这么多。李安导演能在剪掉这么多的情况下还让内地观众看得有滋有味,实在太有水平了。
在香港的一段戏,王佳芝刚在几个男学生的商量下被教会怎么做爱,马上老易就搬回上海了。看王佳芝接电话,我就在琢磨,她心里是不是在感叹,亏了,老娘亏大了。
关于王佳芝和邝裕民的感情,也让我想起从小到大发生在身边的一些事。一般来说,假设一个集体是全集U,U由男生集合B和女生集合G组成。男生中的翘楚一般会和女生中的公主发生点故事,而剩下的集合G里会有很多喜欢那个极品男,因为集合B剩下的都比不上那个极品男。故事里,邝裕民就是那个极品男,最初的极品女不是王佳芝,而是她的同学赖秀清。可是不会演戏的王佳芝一上台就变身当家花旦了,我真不知道,被比下去的赖秀清会怎么想。
王佳芝在被处决之前,回想起来邝裕民叫她名字的情景。也许从一开始,她就是因为喜欢邝裕民才决定参与行动的。而在第一次交给笨拙的梁同学的3年后,她才问了一句,3年前你可以的,为什么不?
而我总觉得,王佳芝喜欢易先生更多,虽然影片里的王佳芝一直要杀易,但喜欢是可以积累的。在影片最后,王佳芝戴着6克拉的戒指,沐浴在易关爱而欣赏的目光里时,她一定也感觉到了易对她的喜欢。汤唯在这个地方演得太绝了,欲言又止,惶惑的眼神,让每个看的人都能体会到这种两难。
很早就想说,这么一帮傻乎乎的学生,拿着满腔热情就想去救国,太傻了。我们这一代从小接受的是见义勇为的教育,要路见不平拔刀相助。可自从国家开始“以人为本”之后,见义勇为就也需要带脑子了。现在教育小朋友们的时候,都更推荐比较温和的办法比如打110。千万别再拿赖宁说事了,大家都独生子女,甘愿为某个崇高理想献出宝贵生命,可别把一家老小都给饿死了。
还有就是,港版的到底是港版的。我平日没有看A片的嗜好,性爱的镜头们实在让我开了眼界,原来做爱,可以这样的。不过真的苦了梁朝伟和汤唯了。 汤唯不论是演土人还是演贵妇都很有一套,挺牛的。那个年代的上海,估计比本世纪初的中国都要开放。只是若生在那时,估计我住在贫民窟呢。
December 16th, 2007 by 张磊
如何设置全局变量:
开发时可能总有一些全局都要用到的变量。在Ruby On Rails中,我一开始以为是在app/controller/application_controller.rb 里设置,但发现没有效果。后来查查资料,看到应该到config/environment.rb中。
需要注意的是,全局变量名应该大写,比可以这样写:
DEFAULT_VALUE = “blogkid”
之后保存,需要重新启动Web服务器加载environment.rb文件。
如何生成下拉菜单:
表单里面的下拉菜单和别的元素比起来要麻烦许多,但是在rails 里可以用表单辅助的工具轻松生成。譬如我的数据库里一个表放了出版社以及出版社的ID,在向另一个表添加图书时,想把里面的出版社显示为一个下拉菜单供选择,可以这样:
先在控制器里使用下面的语句把出版社信息读取出来:
@presses = Press.find_all().map { |p| [ p.name , p.id] }
然后在相应的view里,使用下面这个语句创建下拉菜单:
select( :book, :press , @presses)
这就搞定了,生成的下拉菜单还能将原来选中的值自动设为“selected”项,一共只要2句话。前一句将数据库中内容转化为一个“数组的数组”——每个子数组包含出版社的名字和ID;后一句用这个数组生成了下拉列表。要是放在PHP中用传统的做法,可能需要先从数据库取出数据然后来一次fetch_array的循环,中间还少不了要判断初始值和哪个选项相等——我并不是说PHP不好,通过一定的抽象,可以使这个过程更容易。只是没有ruby这么简洁没有rails这么贴心罢了。
今天顺便看了这么一段话:
我们不想掩饰对这样一些人的蔑视–他们不愿思考,或者在发问前不去完成他 们应该做的事。这种人只会谋杀时间–他们只愿索取,从不付出,无端消耗我 们的时间,而我们本可以把时间用在更有趣的问题或者更值得回答的人身上。 这样的人为“失败者”(由于历史原因,我们有时 把它拼作“lusers”)
确实,我很烦那些什么都直接提问的人,自己在学东西的时候,也很少求助于别人。有互联网这个好东西,大学的好多课都很废了。