May 30th, 2008 by 张磊
上次在图书馆游荡,我可以借的额度还没借满,看到这本《Web2.0高级编程》,就顺手借了下来。最近翻了一下,感觉很不错。 这本书名字里有“高级编程”几个字,不过我觉得按照它的英文名字来理解“Professional web2.0 Programming”更切合它的内容。里面谈的不是那些复杂的开发技巧或是易用的框架、语言们,而是一些Web2.0网站开发上面的思路和网站结构的统筹。当然,里面的很多例子,都给出了具体的实现,用的语言也很多样,从python到c#,自然也少不了java、ruby、php这些弟兄们。 一些平日里可能不会被注意到的细节,书中提到很多,比如javascript中的内存泄漏,比如实现和维护URI空间。感觉这本书在谈论技术之外透露出来的,就是对“标准”的尊重,这一点,也更符合书名里的“Professional”。 所以,如果你对Web2.0中Web开发的一些新思路(还算不上新技术)感兴趣,很推荐你读一下这本《Web2.0高级编程》。书中所谈的“标准”们,probably,即使你不去遵守也可以达到目标,但遵照标准,可以让事情做得更好。
November 30th, 2007 by 张磊
从图书馆一口气抱回了8本书,一路上的生人熟人都惊讶地看着我。回到宿舍时,胳膊软得连电话都举不起来了。软件设计师考试已经过去了,下一步想准备一下系统分析师。而我始终觉得要想搞定这些考试,一定的实践很需要,最好能有大量的实践。软设的下午题本来没底的,最后居然比上午题还高,我毫不怀疑自己沾了实践经验的好处。 一个学通信的朋友说他觉得到了大三课内的知识很难,当时我说,学习在更多时候是改变我们理解问题的方式的。其实我也没有全明白自己在说啥。在操作系统课里学的处理互斥的知识,不只可以用在操作系统上;学数据库设计处理多对多关系也可以顺便考虑下多夫多妻。事和物之间有说不清的联系,可是只有足够敏感且足够渊博的人才能一窥究竟。 距离挂失不到一周,中行给我补发的金卡就到了手里。卓越的退货是上门服务,速度也非常快。只剩下某个酒店欠我的钱没还,某人又给我一笔“巨款”。 今天借的书目(可以去当当网搜一下这些书的介绍): 《Ajax模式与最佳实践》《AJAX框架解析与实例》 《Programming Ruby》 《代码大全》 《系统分析师考试辅导》《系统分析师技术指南》《系统分析之路》《系统分析师考试论文试题分类分析与范文》 我看书很快,记忆力也很好,所以借来慢慢看 其实我一点都不喜欢写code。做一个东西有点像造房子,除了砌墙痛苦点,其他都还不错。围绕着用什么材料怎么设计结构把房子造好想主意的过程,还是很享受的。
June 7th, 2007 by 张磊
最近在研究PHP中的缓存,在牛扑上一个简单的图书信息页面(比如这个)都要进行至少9次数据库查询,而其中大部分东西都是在相当长一段时间不会变的,所以把这些内容缓存出来是很必要的。其实现在的牛扑一部分内容是有缓存的,当然效果很好,但缓存没有大规模使用,会限制整站的速度。于是我开始找一种通用的缓存机制,果然被我找到了,那就是ZF中的Zend_Cache。 其实缓存的概念在很多地方都有,CPU中有一级缓存二级缓存,缓存的存在大大提高了信息交换的速度(当然,和命中率有关),其实是一种空间换时间的办法。空间换时间的思路在编程中也有,特别是在做ACM时,对解法要求的效率很高,这些时候“空间换时间”的思想往往会对解题有很大帮助。 Zend_Cache是包含在ZendFramework中的,我查看了一下官方文档,发现介绍的比较简单。后来找到了Babel的程序,才看到了实例。V2EXCore.php中有这样一段: if ($o = $this->cs->get(‘babel_top_wealth’) && $cached) { echo $o; } else { ob_start(); /*output sth.*/ $o = ob_get_contents(); ob_end_clean(); $this->cs->save($o, ‘babel_top_wealth’); echo $o; } 其中$this->cs是一个初始化好的缓存类。在这里,思路是这样,如果缓存”babel_top_wealth”命中,就输出,如果没有命中,就通过ob_start()/ob_get_contents()获得输出的内容,然后保存到缓存。坦白说,这个比我以前自己写的缓存类好使多了。 现在唯一的问题是,缓存很多的话查找也是一个问题。牛扑上的50W本书假如有10W本进入缓存,估计需要的空间在1G左右。这个时候,到底是数据库的速度快呢,还是利用程序的逻辑从磁盘上读的速度快呢?
April 24th, 2007 by 张磊
在Topcoder上只参与了一次SRM,还拿了0分。恐怕这辈子不可能像嘉之那样做个超级牛人,却记下了Topcoder上一个有意思的问题:”Is topcoder born or made?” 今天收到z的邮件,说考研专业的选择有些苦恼。学计算机吧,复试对编程能力的要求很高;学另一个中意的专业吧,复试的分数线又很高。我对考研一点主意都没有,但还是告诉她,能力可以培养,成绩也可以提高。摆在面前的不是两难的选择,而是需要选择自己真正喜欢什么。 毫不夸张地说,每次 做物理实验我都是全组同学中第一个完成的。因为大部分物理实验我在高中物理竞赛时就接触过,虽然那时我们真正花在培训实验上的时间只有2天。上学期的物理课经常撺掇着Alone和POPO一起逃课,作业也是能抄就抄,最后居然考了92分——这个也是得益于高中对物理的接触。回头看看,高中参加物理竞赛虽然因为一分之差没拿到一等奖,但到现在对我的帮助是巨大的。(咳咳,我高考的时候理综只考了210多,物理的大题全部错了,要是物理能在那时候帮助我,我现在就不在HDU了) 高中为什么参加物理竞赛呢?一方面是物理的成绩很好,另一方面确实对这套东西很感兴趣。兴趣不是高中培养起来的,而是在小学就有这样的爱好。我小时候至少读过4个版本的《十万个为什么》,其他方面的科普读物也看了很多。三年级开始写文章,老师每天要求写一篇,实在不知该写什么的时候就会把太阳系写一下。甚至到了初中写的一篇不知道该怎么结尾的小说,写的也是冲出宇宙啊什么的——蛮可爱的。初二开始的物理课每次考试成绩都在98以上,中考也是98分。 正好趁这个机会写写我的家庭。我小时候家里条件一直不好。我出生时我家的房子只有10平方米,一张床一个桌子摆进去就只剩下走廊了。条件不好,所以我也一直瘦的可以。3岁那年我家搬到了新房,那时我最喜欢的就是家里满柜的书。我喜欢鲁迅选集,那四本书被我翻来覆去地看。后来我遇到了一些自己不太喜欢的语文老师,甚至一度讨厌写作。最后重新开始坚持写随笔、写blog,就是受到了我家大书柜的影响。我父母都是知识分子,也很懂得教育的重要,对我的教育做得很早。所以我的小学和初中过得轻轻松松,成绩却出奇地好。中考时轻轻松松就考了县里的第一名——因为这个第一名,实际上,我高中在家里用的电脑也没有花钱。 我觉得这一切都不是我生来就有的,我并不比别的孩子强多少,反而在体质上要弱很多,在年龄上也比同窗小。得益于父母对我的教导,我走出了那个山区的小城。而在这两年的大学生活,更让我感觉没有什么知识是我们所学不会的,没有什么问题是我们所不能解决的——天才和平庸的差距不在知识的底层而在知识的顶端。所以这让我在面对一些事情的时候更为从容和坦然。 另一个方面说,世界把我们改变成什么样子不是我们能决定的。我曾经以为自己将来会做画家,最差也要当作家吧。可是现在我是一个地地道道的理科生,我的专业是软件工程。我们为什么会是这样?因为我们不可能是别的样子。
August 12th, 2006 by 张磊
这一段陆续做了两个输出JS的程序。其实做得多了,觉得也无非就是那么回事。去年这个时候,馒头让我在blog侧栏放上他的一段JS,那是不懂编程的我从HACKER的角度看了看,愣是没看明白。转眼做了半年有余的PHP,现在做一个输出JS的东西简直太容易了。 echo “document.write(\”XXXXXXX\”);”; 当年觉得那么奥妙的东西,不过如此简单。技术本身就是这么简单的东西,容易入门,容易上手,容易学成——但终究有那么多人说,“我要学编程!”,然后拼命在讨论XXX语言是不是比XXX好。C++的高手断然不是只会写C++。技术永远都是简单却繁琐,真正要学的东西,是我们驾驭这些技术的能力。 做一个广告,http://www.buyren.net/shop.php要升级了,采用dianping的数据库,礼品卡信息实时更新——相信会焕发出新的活力。只是我不知道智勇对我做的是不是满意。
August 7th, 2006 by 张磊
今天在前些日子下载的清华视频课件上看了看C++后面的内容,弄明白了原来拷贝构造函数的浅拷贝和深拷贝就是那个意思(以为多深奥呢)。看到了虚函数那里,谈了虚析构函数,自己心里痒痒,就开了VC,实践了一下。 #include using namespace std; class A{ public: A(){cout< <”Building A..”< ~A(){cout<<”Deleting A..”< }; class B:public A{ public: B(){cout<<”Building B..”< ~B(){cout<<”Deleting B”< }; int main(){ A *a = new B(); delete a; } 这样一段程序的运行结果是: Building A.. Building B.. Deleting A.. 最开始我并不明白倒数第二句”A *a= new B();”是什么意思,现在明白了。a是一个指向数据类型为A的指针,构造它调用的是B的构造函数。由于B是从A继承过来,所以在调用B()之前先调用了A()。但是,当对象析构时,却调用的是A类的析构函数,B类的析构函数没有调用,发生了内存泄漏。造成这种问题的原因是:当A类指针指向的内存单元(即B类对象的数据)被释放时,编译器看到指针类型是A类的,所以调用A类的析构函数。 现在,可以使用虚析构函数来解决问题。将程序中class A的定义作如下修改: class A{ public: A(){cout< <”Building A..”< virtual ~A(){cout<<”Deleting A..”< [...]