其它杂谈

为什么要在自己的Blog上回贴

[引子] 在网友haohappy的blog上发生了一场网上争论。争论中haohappy说不知道为什么“deminy为什么要在自己的Blog上回,还建立本地镜像”。本文对此问题将做完整回答。

为什么deminy不喜欢把自己的一些文字发布在别的网站上?为什么deminy要把自己发表在别的网站上的文字搬到自己的网站上?

三点主要原因:

我对自己写的文字特别珍惜(原因 1 ……),因此我会尽力完整的记录和保存我的邮件信息、我的MSN聊天记录、我在网上发布的帖子信息等。我曾经写的各类文字散布在不同的网站上,但随着时间的流逝很多都消逝了(例如 1 2 ……)。因此,我现在的做法是,尽量不在其它网站上留言,而把自己的感想写在自己的blog上;当我不得不在别的网站写下自己的一些重要感想的时候,我会把相应的文字在自己的网站上同时做一份备案,而且这份备案是尽量完整的、原始的、不会让人产生歧异的(例如 1 2 3 4 5 ……)。这是第一个原因。

我对自己的文字很负责,不喜欢说一些不负责任的话,而且我认为文字应该尽量准确(包括准确地引用他人言论)。因此,我的blog上的部分帖子发表之前,都是仔细斟酌、修改过的。一些站不住脚的、事后可能会自己推翻自己言论的帖子我都暂时不贴的,或者我会暂时把它们从网页上隐藏(例如 1 ……),直到我觉得修改成熟了,才会贴出来。那些事后证明不够成熟或者观点错误的帖子,我会用“补充说明”的方式来做补充注解1,并且注明注解补充的日期(例如 1 ……),就像我在上一篇回复中的那样。在彻底完成上一篇回复性质的文字之前,肯定我需要作相当的修改的,并且事后也许我还需要作些补充说明。因此我一般不喜欢把自己的文字贴在别人的地盘上,因为可能会导致引来更多的无聊的争论,那样子对大家都不好。这是第二点。

推崇文字原创的行为,同时我也特别反感盗链、文章转抄的行为(例如 1 ……)。因此本站极少极少转抄文章,万不得已的情况下,也会尽力完整地注明出处(例如 1 ……)。文字内容的更新是正常的(就像软件更新一样),因此,我认为,某一个作者的个人闲暇文字,在网上应尽量只保存一份原始件,这样该文字的任何更新或改进都会真实地、完整地体现出来,而不会出现不必要的歧异(当然,分布式的保存方式也是需要的,但这时候其它转载原始文字的页面应该注明原始出处)。这就是为什么我不愿意把这篇文字发在两个地方的原因之一2,这也是为什么有时候我在自己的文字下方明确注明谢绝转载的原因(例如 1 2 ……)。这是第三点。

最后顺便说一句,虽然以后我会对本站做改进(尤其是本站的blog),但目前,本站的blog程序仍然是基于deminy在4年多年写的一个文本型的留言本的基础上改造的。因此,这是一个功能单薄的blog系统,没有评论功能,没有trackback功能……好在它足以满足deminy个人堆砌文字的基本需要。

[注1] 文字应该尽量忠实地反映原作者当初创作时候的本意,但某些文字可能会有后续的补充或改进。这时候,不应该在原文上做直接的修改,而应该通过补充说明的形式来加以完善。通过这样的一个方法,既保持了文字的原始信息(不管是正确的还是错误的),也保证了文字中一些错误能够得到即时修正,或者对文字中提供的过时的数据进行必要的补充。

对原始文字的修改仅限于对错别字的修正和无损于原文意思的其它修正。


[注2] 例如,你将会看到我会对上一篇回复做一些补充性质的说明,但是如果我把上一篇文字同样也发在你的blog里,我将不得不对两个地方的文字做补充说明。如果我没有对所有文字作补充说明的话,部分读者就无法完整地理解我的最新的想法。

标签:

类别:

对《Smarty的分页实现》一文的最后回复

[引子] 前两天在网上看到一篇谈(针对小项目的)web分页实现的文字(见此),其做法是丛数据库中取出所有记录集(而不管实际需要哪页的记录集),然后用空循环的方式定位到指定的记录集所在位置并提取。由此引发一通讨论。本文是deminy对该文的最后回复。

本文涉及到的关键字: PHP Smarty ADOdb 数据库分页


1. 你在评论中说,你“不是经不起批评”,而是我的口气让人不爽。抱歉,实在是因为你的设计中的缺陷太明显、太典型了,是一种设计思想上的严重缺陷,而这种思想是每个技术人员都应该避免和制止的,让人不得不说。难道你的作品就批评不得?难不成我批评的时候还要刻意的先恭维恭维你?被人批评后感觉爽不爽要看对方的言辞,但也要看自己对批评的理解和觉悟。我顺手指出你的问题所在,你就从点到面地开始反驳起来。既然彼此都不易不饶,那我也只好奉陪了。 :D

2. 我相信你曾花了(点)时间研究过别人的(数据库)分页技术,但是如果你细看一下的话,你会发现,别人的分页技术都没有采用你的思路,为什么?很简单,因为你的思路是(完全)不可取的。不要以为那些分页技术的设计者们比你差,恰恰相反,他们对具体技术的应用往往比你久,他们的实战经验往往比你丰富得多(得多),而且,他们的智商往往也不低于你。

3. 你文中说“不过分页类库不一定适合Smarty,特别是当记录集数据是二维数组时”。希望你再去好好研究一下Smarty的文档、然后再写点程序测试一下再这么说吧。事实上,Smarty支持多维数组都是没有问题的。其实,Smarty比别的绝大多数模板厉害的其中一点就在于别的模板引擎绝大多数无法支持多维数组变量(甚至连一维数组都不支持),而Smarty可以。对于基于PHP+DB的项目来讲,在模板引擎中对多维数组变量的支持是非常重要的,因为数据库的结果集是以数组的形式返回的。4

4. 你在评论中说,“但是希望有深入的讨论,而不是这样的泛泛而谈。 ”。在我前面的几篇讨论中,我已经清晰、具体地告诉你,你的设计的“致命伤在于浪费资源,而且是没有意义地在浪费资源。”;我还提到,单就MySQL而言,它的分页类也是比较难设计的,并指出主要的原因;后来,我还告诉你,我具体地查了一下ADOdb的分页技术(实际上我是翻阅了其中几处关键代码),认为ADOdb的分页技术可以直接应用,因此可以不必要自己再费劲去设计分页;最后,我还清晰、具体地告诉你,几种数据库(例如MySQL/Oracle/MS SQL)的分页技术是不一样的,因此好的(通用的)分页类是很难写的;在本文的讨论中,你还会看到我对Smarty和ADOdb的一些具体技术方面的讨论。我想,你不会再以为我还是在和你“泛泛而谈”了吧?

5. 你在评论中说,“分页类要是还依赖于数据库,那都耦合成什么样了,怎么扩展。”。很抱歉,这点我懒得评论,浪费口舌。我只能认为你的数据库开发经验还是肤浅的。分页这项需求是紧密地和数据库相关的,如果没有数据库,那么也就不需要这么费劲地讨论分页问题了;分页类的设计是一项非常具体的web技术应用,而不是一种泛泛的理论、一种泛泛的思路,可以被随便挂在嘴上当做谈资。如果你对一项技术的具体应用不是很熟悉,就不要试图发表一些不够成熟的、却又貌似权威的看法。(顺便问一句,如你所说若分页类需要扩展的话,分页类的扩展方向是什么?)

6. 你在评论中说,你的设计思路是“数据库->分页类。分页类是完全独立的,类中不包括其它任何对象。”。的确,你说“分页类是完全独立的”是正确的,但那是因为你的分页类根本就没做记录集分页的核心部分。基本上来讲你的分页类主要是实现了输出不同页码(坦率的说,这属于分页技术里面的边角料的活,初级程序员都可以用几个循环来实现)和显示结果记录集,但是最关键的记录集查询时候的分页你却没做,而却把它交给了Smarty,而且让Smarty去用一种低级的手法去实现。

7. 至于你文中所说的“看到一个号称分页类终结者的,哈哈,有点好笑。分页类中把SQL都包含进去了,这个是绝对不能容忍的,可以说作者对OO的认识还比较浅。”,显然也是荒谬的,该被好笑的是你。分页(原则上)是用SQL实现的,当然要用到SQL,而且这跟OO(面向对象)没什么关系。如果你只会这么生搬硬套OO的概念,建议你还是再实战两年后再讨论吧。

8. 你在评论中说,“而deminy(的思路)是 分页类(包含数据库连接)。 ”。这点你倒说对了,没有数据库连接,是没法(有效)分页的。注意,我说的是有效(率)的分页。这点是一目了然的。如果这点你都不能理解,你最好先好好地开发几个基于数据库的产品/项目后再来讨论吧(不要把业余的留言本等也当成项目)。

9. 你在评论中说,如果用ADOdb的话,万一“换了个数据库系统,你又要重写分页部分的代码。 ”,“但是ADODB并不是大家开发的标准,不是所有人都用数据库抽象层。很多项目就是针对某种数据库的,如果需要作数据库移植,你就连分页类都要修改”,这两句话毫无正确性可言,而且我已经明确告诉你了,“ADOdb对于分页的处理机制比较好”。如果把你的这两句话贴给那些用过ADOdb的技术人员去看看的话,他们会笑话你一知半解的。我想你对ADOdb没有深入了解过,对ADOdb的数据集处理机制你更没有研究过。

10. 你在评论中说,“分页就是两个思路:一种整个结果集读入内存,只需要一次查询,占用内存多,但效率高;另一种读取部分记录,多次对数据库查询,占用内存少,效率视情况而定,如果用户多,数据库并发查询数目过多也可能导致一些问题。 ”。我建议你讨论的时候不要一时冲动而说一些很不严谨的话。单就我们当前讨论的简单话题(从数据库查询记录后分页输出)而言,把你这段话随便拿给绝大多数的数据库相关开发人员(不管是用VB/C++/Delphi/Java的,还是DBA)看,都会告诉你不妥的。前一种思路在web上一无可取之处,连Java web server这种使用了服务器端cache技术的服务器都不会这样做。

11. 你在评论中说,你认为“面对不同规模的项目就是要采用不同的方法。”。是地,这句话没错,但是一些基本原则还是要遵循的。退一步而言,你用这样的垃圾思路在小项目中也的确无妨的,但如果把它当成一个经验贴出来,那可是贻笑大方的。

12. 别的方面(例如软件架构、软件设计模式)等话题就太广了,争议更多,说出来都是扯皮了。

13. 再退一步来讲的话,你可以说你的讨论仅限于Smarty,而不涉及数据库问题。即使这样的话,你也可以检查检查你的那段循环取值程序(这是你的设计中的两个主要部分之一),看看是不是很垃圾:

{section name="list" loop=$productID start=0 max=$pager_Total step=1}
{if ($smarty.section.list.index >= $pager_StartNum )&& ($smarty.section.list.index <= $pager_EndNum )}
......


简洁来写就是:

for (i = 0; i < size_of_array; i++)
if ((i >= a) && (i <= b))
// do sth here.这段是伪代码,不是PHP代码


看出来你的程序的问题了没有?你试图从数组中取一个区间(例如区间(a,b)),于是你用了一个空循环从数组开始的地方一直空循环到a,然后取出a到b的元素,然后继续空循环到数组末尾!3不要跟我说while/for/section这类的循环结构是应该这样用来对数组操作的。(如果你还不懂在Smarty中如何更有效率地写这段代码的话,那就去好好读读Smarty中相关文档吧)

大体上来讲,从你文中使用的技术(Smarty)来看是你是个中级程序员的水平,但从你文中对数据库知识的理解、从你的程序设计能力以及由此反映出来的程序设计思想水平来看,是个初级程序员的水准。

14. 另外,从头到尾你都在偏执地、教条地理解我的意思,教条地套用软件开发中的“教科书”言论来解释事理,却缺乏具体的、有说服力的实战例子(例如具体的有价值的项目应用)。在这篇讨论中,你也许知道某些技术名词,但不知道些技术名词的具体含义,但你却试图在你不熟悉、不大了解的技术方面充当行家和权威。在这篇讨论中,你对概念僵硬地套用的能力超越了你对概念具体应用的能力。也许在网上,对概念的夸夸其谈更能够吸引眼球,但更能推动技术进步的做法是对概念的实际应用。(顺便说一句,我也很看不起拉大旗做虎皮的人。)

15. 看看吧,你的一篇原创文字(包括回复),在技术上有如此众多可以被他人指正的地方,并且连入门级的(技术方案设计)思路都没有端正,然后你还好意思说你是在义务地给我“普及知识”?你以为你有这个资格?太可笑兼无知了。

16. 不要认为你能够翻译、转载一些有价值的技术文字就代表你的水平好,就代表你就是权威。翻译技术文字不代表你理解了其中的意思,就像很多翻译计算机书籍的人,自己都不大懂书里面说的是什么。顺便说一句,我还是很赞赏你翻译文章的行为的(因为的确很有必要),但是要记得尊重版权、尊重原作者,而且,也要尊重原文的原始意思。

完。

[注1] 原讨论见此本地镜像 (取自2005-11-14 16:42:39左右)。

[注2] 居然为讨论这么低级、浅显的技术问题而花了这么多篇幅,惭愧。谢绝在本站继续讨论这个问题。

[注3] 这段代码的问题在于其执行一些不必要的空循环操作,在无意义地浪费资源。这个问题是可以通过简单地改写一下代码就可以解决的,如下所示:

for (i = a; i <= b; i++)
// do sth here.这段是伪代码,不是PHP代码


对小项目来讲,这点资源的浪费的确不是很重要,但是其中反映出来的程序设计思想是欠佳的。另外,关于效率问题,请参阅我的一篇文字《为什么程序效率仍然很重要》。2005-11-14 21:24:51


[注4] 此段讨论误解了原作者(haohappy)意思,删除。2005-11-15 01:03:11

[注5] 对你最新回复的回复

前五点不评价,或者不再讨论。但下面会讨论一下你在第六点后面的一些话题。

你说,“我做过的数据库应用应该不比你少,你叫我去实战?你拿出一个我完全没有做过的数据库应用吧? 或者你自己得意的一套数据库相关代码出来让我分析一下?”Hoho,如果攀比彼此做过的数据库应用多少,我想是没有多大意思的。但是如果你真要比的话,那我告诉你,我在tom.com工作期间(14个月),相当一段时间是带领一个团队负责tom整个网站大部分在线互动程序(PHP为主)的开发的。考虑一下整个门户网站对在线互动程序的需求,你自己算算我可能经手过多少个项目吧(你没有这种经历,是无法想象的)。

你也许会说,“你经手那么多项目,不一定都是你做的呀”。是的,但是每个项目如何实现我都要先大体考虑清楚后才能给其他同事去做(实际上我自己也要自己动手做很多项目);如果我不能在某些方面服众,我就无法领导好一个团队。我觉得,我在tom工作期间的表现是基本称职的。

你也许还会说,“你做过很多项目不一定代表你牛啊、不一定代表你水平高啊”。是的,从编程能力来讲,我从来没有把自己当成一个高级程序员的水平,我对自己现在的编程能力的定位也就是一个很称职的中等偏上的程序员水平。我有时候会对朋友说,我说我不喜欢自己写程序,因为我写出来的程序不属于最漂亮的行列;但是,我的眼光比我的编程能力高,我能够看到好些一般程序员看不到的问题,这就是为什么我大概只有中级程序员的编程水平、但却具备中级偏上的素质。

另外,成为高级程序员不是我的追求。我眼高手低,我更喜欢的是借用别人的代码实现自己的思路,我更欣赏的是别人的代码和思想,例如Smarty的设计,就是我非常推崇的一套设计方案(虽然我没有大规模用过它)。

这种比较是无聊的。自信心不需要靠这样的攀比来建立的。每个人都有优点和缺点的。

最后,过两天我会隐藏(不是删除)这篇文字的,一则我不喜欢自己帖子里面有不妥的过激言论,二则我不喜欢技术争论,三是影响我修行的效果,尤其在我修行尚未到家的时候 :$。2005-11-15 01:09:56

类别:

答题玩玩

先来几个脑筋急转弯热热身:

1. Deminy是个很普通的人,为什么竟然能一连十几个小时不眨眼?(已解)

2. 一只凶猛的饿猫,看到老鼠,为何却拨腿就跑?(已解)

3. 在一次监察严密的考试中,有两个学生交了一模一样的考卷。主考官发现后,却并没有认为他们作弊,这是什么原因?(已解)

4. 加热会凝固的东西是什么?

5. 农夫养了10头牛,为什么只有19只角?(已解)

6. 周润发的爸爸在哪,你知道吗?(已解)

再来两个热热身:

7. 找规律填数字: 11,1,12,1,1,1,2,请填出后面的数字。

8. 一个长方体的盒子(如图),假设它是密封的,无法打开。你现在有一把直尺,能不能量出对角线AB的长度?不能量出边长,再进行计算。也不能损坏这个盒子。只能用一把直尺量。(已解)

现在来个复杂的数学题:

9. 甲容器有纯酒精5公升,乙容器有水10公升,现分别从甲乙两容器中各取出X公升,分别倒对方的容器中,搅匀后再从甲乙容器中各取出X公升,分别倒对方容器中,这样做十次。这时甲乙容器中酒精溶液的浓度相同,求X。(已解)

最后来个酷题:

10. 十个半径为1的球堆起来。下层6个,中层3个,上面1个。这堆球的高度是多少?(已解)

[注1] 应mfd的留言而发了这几个题目。

[注2] 答案参见留言本留言。

类别:

一个困扰我的概率问题

前两个星期上557(几何算法)的课程,想起来一个概率问题:a、b、c三个数字比大小,几率均等,c为最大值的概率是多少?

解法一:三者中任何一个都有可能为最大而且几率均等,所以c为最大值的概率是1/3。

解法二:c要为最大值,则需要c>a且c>b。c>a的概率是1/2,c>b的概率是1/2。所以(c>a且c>b)的概率是(1/2)*(1/2)=1/4。因此,c为最大值的概率是1/4。

显然,从常理来讲解法一是对的。但是解法二为什么是错的呢?

糊涂中……

[补充说明] Ben提供的参考答案见此。2005-11-08 18:46:03

标签:

类别:

对“建站目的”的补充说明

一开始做个人主页的时候,有两个目的,一是因为自己喜欢网站技术,做个玩玩;二是想让同学、朋友们能够在异地了解我的情况,也让其他和我生活比较接近的人更好地了解我。

现在呢,则又有了个新的目的。就像我在MSN上跟个别朋友说的那样,就是打算以后能让自己的下代看看他们的长辈年轻的时候所思所想所为,看看他们长辈的一些生活感悟、生活挫折和生活错误。为了这个目的,应该忠实地记录生活,也在尽量做到这一点。

当然,这样的一个网站以后也可以用来给自己留一份回忆的。因此,我一直在尽量避免在本站过多地讨论技术问题,毕竟技术不是生活的主体。

有时候我自嘲道,也许我的个人主页做得一般般,但至少它有一项世界之最:世界上最全的关于deminy的网站。

[补充说明] 本文是对“常见问题”页中的“建站目的”一章所做的补充说明。

类别:

域名Deminy.com是怎么丢失的

1999年8月中旬,deminy第一次创建了自己的个人主页,当时使用的是国内网站的免费主页。

1999年9月初左右,deminy从网上得知可以通过webprovider.com这家外国域名注册商免费注册顶级域名,并且这个公司还提供10M的免费个人空间。因此deminy很兴奋地通过该网站注册了域名deminy.com,并使用webprovider提供的免费空间建立了deminy.com网站。但是,webprovider强行在deminy.com这个网站的每个网页上自动加上该公司的广告条,让deminy感觉颇为不舒服,于是不久后便不再使用deminy.com这个域名及其免费空间。

2000年9月前后,发现deminy.com域名到期了,而且webprovider也没有继续为这个域名续费,很是高兴,准备申请它了,但当时正好银两不足,没有及时申请。

2000年10月08日早上,再去查看deminy.com的注册信息时,却发现它已经被一家叫register.com的域名注册公司注册了。时值互联网泡沫飞涨,该公司的注册目的应该是待价而沽。

2001年06月08日,deminy申请了顶级域名deminy.net,并用它来做自己的个人网站。

大约在2001年或2002年,在deminy.com闲置了相当时间后,register.com放弃了域名deminy.com。随后deminy.com流落到一家叫做demini的西班牙公司手里。

2002年至2005年,域名deminy.com一直都被这家叫demini的西班牙公司霸占着。让人气愤的是这家公司闲着deminy.com这个域名不怎么使用,但却每年都续费,使得deminy每年都在监控deminy.com域名的续费信息,却每年都等不到结果。

2005年夏天,deminy悲哀地发现,那家叫做demini的西班牙公司在今年续费的时候,一次性给域名deminy.com购买了5年的使用权。

类别:

图书馆里的官方资料

下午1:00的时候557第一次期中考试,于是就在中午的时候去了图书馆二楼复习。

忽而想拿本原本是放在图书馆三楼的参考书来看看。但我却忘了自己身在二楼,起身去二楼的相应位置寻找,却诧异地发现,“原本”放我需要的参考书的位置放的全是加拿大各省历年来的各种资料,方方面面的都有。

于是饶有兴趣地浏览我所在的安大略省(也是加拿大人口最多、经济实力最强的省),发现安省的资料占据了好几排书架,最早的资料至少是在20世纪50年代左右(也就是1950左右),有水文、食物、农业、人力等等等等,而且历年的都有,让我不由得不赞叹。

我不由想到三点。

首先,作为一个间谍,中国间谍很容易就能了解到过去加拿大的经济运行的准确情况,而加拿大间谍要知道过去中国经济运行的准确情况,却很难。因为一个中国人都很难了解到中国经济运行的准确情况。

其次,一个加拿大社会学爱好者、学生等等,可以很顺利地查询到很多他需要的社会、经济等(正确的)资料并且为己所用,而中国学生的某些社会报告等,只能是基于推测或者不完全的数据等等,往往不能得出让人信服的结论。外国的作家,如果写传记,可以很全面地引用各种公开资料(也有需要特权批准的时候);而中国的传记作家,有时候往往需要特权批准才能翻阅相关资料。

最后,这些所谓的加拿大的“官方资料”涉及到人们生活的方方面面,任何平民都可以查到,而且真实性也是不言而喻的。但是在中国,丁点大个政府报告都是下发到机构去的,并没有实际能够让普通民众能够免费、即时地了解到,老百姓的知情权还是不够的。情为民所系、权为民所用、利为民所谋,任重而道远。

很有兴趣有空的时候去图书馆翻翻这些资料。

类别:

大长今 - 希望

晚上拨了她的手机号码,里面传来等候接通的歌曲声。乍一听那曲子,觉得特别好听,于是赶快随便在电脑上找个对话框记下歌词。终于在歌曲被掐断之前断断续续地抄下了些歌词:“看生命 路程漫漫 越走越远”。

用这歌词片断在网上搜索后,才知道原来这首是《大长今》的主题曲《希望》,以前在看超级女声的时候也听过五强合唱过这首歌。于是从网上下载陈慧琳的原唱,并用minilyrics下载了相应的歌词。

单独把这首歌放了2遍,听着感觉不错,不过再读读歌词,感觉歌词写得驴头不对马嘴,什么都谈不上,连歌名都给这歌词糟蹋了。好好的一首曲子,全给歌词糟蹋掉了。

类别:

关于男人(1) 英雄般的男人

本文有待完成。

类别:

关于男人(4) 男人生存术

看了“关于男人(2) 郁闷的男人”和“关于男人(3) 软腿的中国男人”这2篇文字后,男人也许是会感到些许郁闷。郁闷是解决不了问题的,我们还是需要点对策来解决问题,是吧?这就是这篇文字的由来。

本文有待完成。

类别:

页面