Web是开源最大的成功

  开源运动广受欢迎,并且在软件开发史上写下了浓重一笔。但是它影响最深远的地方在哪呢?有史以来,最成功的开源“项目”又是什么呢?

  事实上,总体来看,Web不就是开源运动最大的成功么?

  可能最有名的例子就是隐藏域众多网站背后的LAMP,也就是Linux、Apache、MySQL和PHP。但当你仔细考虑后,你会发现更多。

  下面列出了Web得以运转的一些开源项目。

  Web browsers -网络浏览器

  在网络浏览器市场中,虽然微软的封闭源码软件IE浏览器仍然占有很大的份额,但其它功能相似的开源项目已经流行起来,并在不断壮大。像Mozilla公司的Firefox浏览器(它是开源的,还有Flock、PaleMoon)。还有增长迅速的基于Webkit的浏览器,像Safari,但最著名的是Chrome浏览器。

  如果把手机网络也算到这里面,其中Webkit主宰着iPhone、Android和Blackberry手机中的浏览器。

  Web server software – Web服务器软件

  迄今为止,Apache是使用范围最广的网络服务器软件,它是开源的,但是一个叫做Nginx的轻量级服务器软件在最近几年开始流行起来。事实上,三大顶级网络服务器软件中有两个是开源的(排名第二的微软的IIS是例外,但其距离第一相差甚远)。

  另外,大量服务器端底层软件也是开源的。例如,很多大流量网站使用Varnish作为与网站访问者之间的缓存层,而使用Memcached作为与网站数据库之间的缓存层。这只是众多例子中的两个。

  Scripting languages and web frameworks -脚本语言和Web框架

  网络上使用的大部分编程和脚本语言都是开源的,比如PHP、Perl、Python、Ruby等。

  但是,很少有网站完完全全是从零开始。毫不夸张的说,有成百上千的开源内容管理系统(CMS)和网络框架来协助开发人员,例如WordPress、Drupal、Ruby on Rails、Django、Joomla等。

  Databases -数据库

  开源软件MySQL是目前为止最流行的网站数据库,但还有其它功能相似的开源软件,比如PostgreSQL,更不用说近来出现的众多“非关系型(NoSQL)”数据库。

  既然我们说到了底层软件,那就不得不提一下每次我们使用互联网或因特网上的任何东西时都要依靠的基础系统:

  DNS -域名解析系统

  Web(就此而言是整个因特网)离开了域名解析系统就一无是处。大家都知道,域名解析系统可以让用户使用像example.com之类的域名,而不是IP地址。BIND几乎是DNS服务器(亦称名称服务器)软件的实际标准,并且,你现在可能已经猜到了,它是开源的。

  Server operating systems -服务器操作系统

  所有网站都必须在服务器上运行,而那也是开源的统治领域。虽然Windows统治着桌面领域,但是网站赖以运行的服务器大部分采用开源的Linux操作系统,其他比较流行的选择是freeBSD和OpenBSD。

  开源的诱惑

  由于在许多情况下,开源软件能够提供与商业的封闭源码软件相同的性能,并且又是免费的,所以开源软件如此流行并不奇怪。免费是一个难以挑战的价格。

  假如Web不是运行在所有这些免费软件上,那么它很可能需要一段艰苦的过程,才能让人们广泛接受。

  注意我们并没说过Web中没有任何封闭源码软件,而那显然是存在的。但是,从统计数据看,Web开源统治领域中真正的例外是微软的基于Windows系列系统。

  除了那个,你通常需要深入研究才能发现更多私有封闭源码技术,像路由器和类似设备上的操作系统。但那是因特网,而不是Web。

  结束语

  多亏了80年代因特网、便捷通讯以及合作与共享的兴起,开源运动才得以蓬勃发展。在90年代,当Web诞生于顶层因特网设备时,开源运动已经准备好助其一臂之力了。

  没有人会否认开源统治着Web的大部分。开源和Web是一个合作共生的关系,互利互惠,合作共赢。这就是为什么我们认为Web可以说是迄今为止是开源最大的成功。(我们并没有否定Tim Berners-Lee的意思。注:Tim Berners-Lee,万维网之父、第一位站长,参见《互联网历史上15个划时代的“第一”》)
  译文出处:伯乐在线- 职场博客
  译文链接:http://www.jobbole.com/entry.php/498

  原文作者:Pingdom  编译:伯乐在线 敏捷翻译组- 朱勇

数据库范式

数据库范式指数据库设计所需要满足的规范。符合这些规范的数据库结构明晰,避免INSERT,DELETE和UPDATE操作异常。

1 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性有基本类型构成(整型,实数,字符型,逻辑型,日期型等)。

在现有的DBMS中设计不符合1NF的数据库是不可能的(现有的DBMS不可以把某列再分2列或多列),所以可以“忽视”它。

2 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

比如:一个选课关系表select_course (学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合字段(学号,课程名称),即(学号,课程名称)-> (姓名,年龄,成绩,学分)。

以上表并不符合2NF,因为(学号)-> (姓名,年龄);(课程名称)->(成绩,学分),即存在组合字段中的字段决定非关键字。

则存在问题有:

1)插入异常:

若想输入一门新课程,但还未有人选修(即没有“学号”这个关键字),便无法记录该新课程。

2)更新异常:

若调整了某一门课程的学分,则匹配该课程的所有行的学分都需要更新,否则出现一门课程多个学分情况。

3)数据冗余:

同一门课程由n个学生选修,”学分”就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。

所以,可改为以下几个表(符合2NF):

student (学号,姓名,年龄)

course(课程名称,学分)

select_course (学号,课程名称,成绩)

也可以发现,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

3 第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段传递函数依赖

传递函数依赖,指的是如果存在“A -> B -> C” 的决定关系,则C传递函数依赖于A。

比如:student(学号,姓名,年龄,所在学院,学院地点,学院电话),关键字段为“学号”。这表符合2NF,但不符合3NF,因为有以下关系:

(学号)->(所在学院)->(学院地点,学院电话) (即存在非关键字段“学院地点”,“学院电话”对关键字段“学号”的传递函数依赖),其存在的异常就不再详述。

分解符合3NF的表如下:

学生:(学号,姓名,年龄,学院ID)

学院:(学院ID,学院地点,学院电话)

4 鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖。

比如:仓库管理表store_manage(仓库ID,物品ID,管理员ID,数量)。一个管理员只能一个仓库工作,一个仓库可以存储多种物品,即有如下决定关系:

(仓库ID,管理员ID)->(物品ID,数量)

(管理员ID,物品ID)->(仓库ID,数量)

可以看出,(仓库ID,管理员ID)和(管理员ID,物品ID)都是表store_manage的候选关键字,“数量”是唯一的非关键字段,故符合3NF。但又可以看出有如下关系:

(仓库ID)->(管理员ID)和(管理员ID)->(仓库ID),存在关键字段觉得关键字段的情况,不符合BCNF。出现的异常情况有:

1)插入异常:

仓库不存在物品时,不可加入“管理员ID”

2)更新异常:

需要更改某个“管理员ID”,需要改动多行,如果某行未改动,则会存在一个仓库有2个或多个管理员。

3)删除异常:

若需要清空某一仓库,其所有的“物品ID”和“数量”清空的同时,“管理员ID”和“仓库ID”也被清空了。

修改(符合BCNF):

仓库表:store(仓库ID,物品ID,数量)

仓库管理表:store_manage(仓库ID,管理员ID)

5 还有4NF,5NF,极少用到,略过。

满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作异常等。在多个实践中,有时适当的冗余,即不符合范式要求的设计,可以换来性能效率的提高,这很值得考虑~

2010年个人总结

又是一年年终,感叹时间的飞逝。

该有个总结,其实很少下笔,这很不该,下来务必好好加强。

2010年,总体不给力,接触面是多,却蜻蜓点水居多。心态还不够稳重,急,抱怨……

2011年的计划:

  • 一个团队
  • 一次旅行
  • 学习英语
  • 加强技术:PHP,JAVA
  • 集中精力:放好心态,加强执行力,循序渐进。
  • 阅读写作:每个星期至少2篇Blog。

告别2010,给力2011年,在明年的今日,展示力量的时候~

祝愿朋友们新的一年健康,快乐,进步!

浅谈ECSHOP

许多人应该ecshop并不陌生,它粉丝不少。它对我php的入门学习帮助不少,在此非常感谢它的开源(http://www.ecshop.com)!

总的来说,它的架构清晰,易扩展,可以适合二次开放大型应用的雏形。但它细节的东西还比较粗糙,逻辑任务分解不到位(有些代码块太长,冗余多),稳定性欠佳。我这也是很笼统的说它缺点,它的程序对于入门不久phper也是很容易阅读。本人文笔不够,建议去看它,就知道其中缺点,更能学到许多有用的东西。到时欢迎讨论。也是希望可以帮助改进ecshop,支持开源!

下来就说点ecshop的问题,挑个它模板机制吧,它是模板机制核心在includes/cls_template.php,是改写smarty模板引擎的。改得不错,很方便,Just for it。它里面的诸多细节还需要改进。

它有个动态库文件,就是可以后台添加,删除在前台某个区域显示的内容。如添加广告显示,某类的产品等呀。所以,它不是实时显示内容(不进行缓存)。

这个处理它在cls_template.php中template类的smarty_prefilter_preCompile()方法,在这方法中,对动态库文件的处理,仅仅是加入smarty标签,如{assign var=”” value=”” },然后,比如首页index.php, 写起控制程序的时候,又写了并调用了assign_dynamic()函数,里面不干什么,也是注册动态库的smarty变量。这里虽然通过一个“桥”,来实现对相同的smarty的变量赋值不同的值(如{assign var=”cat_goods”  value=”cat_goods_’. $id .'”}(smarty_prefilter_preCompile()方法实现), $smarty->assign(‘cat_goods_’.$id, $cat_goods) [assign_dynamic()函数实现]),觉得这不错–对动态添加或删除某个显示内容,但是,smarty_prefilter_preCompile()的复杂且多的正则开销,每个方法或函数连接数据库的开销,smarty变量命名的不稳定性(如果方法和函数中某个变量写的不一致,就不能对应赋值啦),这些开销省下来,是多么的可观啊!呼呼~,可以省去assign_dynamic()函数,在preg_replace_callback()中的调用函数,在进行匹配处理的时候,就进行相应的赋值。

还有,smarty_prefilter_preCompile()对动态库文件那么辛苦的工作,就是为了在对应的include的动态库文件前,加入对应{assign var=” value=”}。既然在后台处理模版布局的时候,ecshop对添加的动态文件会在对应的模板,即是对应的.dwt文件里添加<!– #BeginLibraryItem “*.lbi” –>,何不添加一个标识(唯一),在smarty_prefilter_preCompile用str_replace()替换,不轻松许多吗?!

不过,这样也一个弊端,就是对模板可视化编辑的时候,添加的动态库文件不能按原来的规则(即<!– #BgeinLibraryItem ”*.lib” –>, Dreamweaver的模板文件)显示出来。

如果不用标识替换,即保持原来处理方法。在smarty_prefilter_preCompile()方法中,觉得不需要用正则来{include file=”动态库文件”}来前面加上{assign var=”” value=””},而且还要整个$GLOBALS[‘libs’]来协助。稳定性可想而知了。何不用explode敲入数组处理(处理匹配的第一个就可以,这样说很多人不清楚,它的动态库文件存储在数组中,在某个区域内,相同类型的包含的动态文件是相同的,所以在前面{assign}来赋不同的值。在遍历该动态库文件,遇到匹配字符,立即处理便可。)。用处理处理效率高很多,也减少许多不稳定行因素。

再稍稍说下category.php页,有些once write的感觉,很容易看到在相同的应用下调用get_extension_goods()函数许多次,而get_extension_goods()每次都需要和数据库“握握手”。太过奢侈啦!里面可以改进许多,有兴趣者欢迎Email探讨~

以上也是个人看法,自己能力还不够强,还很有待指点。BTW,shopex比ecshop完善许多,可惜不开源。希望ecshop越来越高级,支持开源!

附上改过后的code: ecshop_20101226.zip

PHP 5.3.4 发布

PHP 开发团队宣布 PHP 5.3.4 发布。

PHP 5.3.4 特性:
1)增加对zip 流的统计支持
2)新增 follow_location (默认启用)支持
3)增加一个 3rd parameter to get_html_translation_table
4)Implemented FR #52348, added new constant ZEND_MULTIBYTE to detect zend multibyte at runtime.
5)Multiple improvements to the FPM SAPI.
6)修复 100 多处bug

无人喝彩

无人喝彩的人生,就似没有花香的小径。

人生的赛场常常是这样开始的:两旁是朋友助威的呐喊,身后有亲人关注的目光。我们太多数人的生命是在这亲朋们的赞美与喝彩中长成的,那是我们成长过程中快乐的源泉。

但是,我们要前行,就要有一天会远离朋友的呐喊的范围和亲人关注的视野。当生命孑然独行于荒野,可经受的孤独和痛苦的煎熬?

甚至,在你蹒跚的身影之后还有无数的诽谤和嘲讽,你是否仍能默然坚守?沙滩能让汹涌澎湃的海浪心平气静的退去,并且留下些珍贵的贝壳,是因其胸襟的坦然与博大。

那些只是习惯与繁花锦簇的春天的生命,如何度过群芳凋零的冬天?那些被众星捧月般拥戴和欢呼的人们不经受孤独和冷漠,如何蓄积一种于困境中自信从容的人生大气?

孤独与痛苦验证着生命的弹性,让人更真切地感受到生命的硬度和精神的韧性。我们生命的最大值正是这种承受和忍耐中求得的,而不是以他人的喝彩为砝码来度量的。

喝彩本是人们对那些闪烁真善美光辉的人和事的真诚赞颂,是人们内心对人性的亮点情不自禁的共鸣的反应。由衷的喝彩,对于自卑和脆弱的人,确是一根能去支撑其前行的手杖。但在这个浮世时态,许多喝彩成了随意的问候或礼节性的安慰,甚至不乏谄媚的精神贿赂。正如太多的泡沫只会令人窒息而不能将其抬升一样。廉价的掌声和无端的喝彩总是让人陶醉其中的人们,放慢了快行的脚步。

其实,对于我们这些很平凡的生命,能否赢得别人的喝彩并不重要,只要在自己生存和生活的环境里,大部分人能容纳你,接受你;小部分人能善待你,喜欢你;有那么几个能牵挂你,真爱你,便是幸福的人生了。

而那些一心埋头走路的人,纵会忽略沿途许多美丽的风景。却能明晓自己的每一步迈与何处,跋涉之途是否花香满径,他们是不会在意的。对于这些真正值得喝彩的人,喝彩于他们,反倒成了煞风景的惊扰。

无人喝彩,依然昂扬向前;没有掌声,一样虔诚歌唱~

WIN7下IIS7的PHP环境配置

IIS下配置PHP环境,有CGI方式,ISAPI方式和FastCGI方式,具体它们之间明细,网上可搜索相关资料。

现在配置的PHP 5.3.3 VC9的版本(在windows下,Apache+PHP采用VC6版本,而IIS+PHP采用VC9版本)。在php.net/download中下载installer版本,然后按提示安装,在Web Server Setup选择IIS FastCGI便非常容易安装好,win7下的IIS7便可运行PHP文件了。

小小注意:

1) Windows/Temp目录的权限设置为erverone,否则PHP不可上传文件,还有ASP,.NET等不可访问Access

2)Windows 7中PHP连接Mysql时默认只能使用IP地址连接Mysql,而无法使用localhost连接Mysql,解决方法为打开C:\Windows\System32\drivers\etc下的hosts文件,将# 127.0.0.1 localhost中的注释去除即可。或者将数据库地址设置为127.0.0.1。

ASP访问Access2003和Aceess2007

ASP访问Access 2003的连接语句:
“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & db_path

ASP访问Access 2007的连接语句
“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & db_path

Access 2003和Access 2007的Provider不同,其扩张名也不同,AC2003的为mdb,而AC2007的为accdb。

AC2007转换为AC2003,需检查系统是否安装micorsoft.jet.oledb数据源驱动,如果没有,可以如下方法进行安装:

先安装MDAC 2.7(未安装不可运行Access),安装目录WCU文件夹的MDAC的安装包,驱动申明使用“microsoft.jet.oledb.4.0″. MDAC 2.7做成打包文件以后选择jet引擎,安装即可。

AC2003转换为AC2007,则需检查系统是否安装microsoft.ace.oledb驱动。

还有点得注意,ASP访问access是,需将Windows/Temp目录的权限设置为erverone,否则ASP无法访问Access。

国外PHP大师给初学者的8条建议

如果你还不清楚PHP是什么,可以留意下那些你天天使用的web应用,例如Facebook、Wordpress都是用PHP构建起来的。

学习一门新语言可能会是一件很艰巨的任务,最好的办法就是借鉴前辈的经验已达到事半功倍,下面就是为PHP新手们准备的一些经验餐(笔者也还是新手)。

如果你是个PHP开发者,无论是新手还是高手,笔者都希望你能在此讨论下自己对PHP的想法或者技巧。

1. 从OOP开始
Naramore是SourceForge员工以及PHPWomen.org的创办人。对于初学者,她建议在学PHP之前先了解清楚OOP(Object-Oriented Programming)即面向对象编程思想。

“如果你来自非高科技行业,很有必要花一些时间去学习软件开发的基础流程。例如面向对象程序设计、测试驱动开发、版本控制、调试、设计模式等。”

“如果你已经尝试过了但无法解决问题,不要害怕开口问人。很多PHP社区的气氛都是非常友好的,并且提供了大量初学者可用得上的资源,这些都你 来说都会大有帮助的。找一个适合自己的稳定的社区,一个本地用户组或一个开源项目社区,或者是一个freenode上的相关IRC聊天频道。”

2. 随时Google
Casey创立了一个软件商店,并且在unconference流程方面做了很多研究。

他的建议是在PHP社区找到自己的位置以及遵循“发问前先Google一下”。

“马上找到一个用户组加入,全世界有很多聪明的人聚集一起聊天、开拓思路、互相帮助的PHP群。”

“记住,在提问之前先尝试在google上搜索。没人喜欢懒惰的人。”

3. 加入开源项目
Leonard 在运营一家爱尔兰软件公司echolibre,同时还是CloudSplit(一个云计算分析服务)的联合创始人。和他的很多同龄人一样,他建议应该积极尝试加入开源项目,即使你是个新手。

“通过参加开源项目你有机会看到那些源代码,并可以向资深的前辈学习。”

“帮助开源项目团队做一些事,例如寻找和记录重复性的bug这样的耗时任务,他们会对你心存感激。当我们想要雇用开发人员时,如果他曾经参与过OSS项目,我们会更多地考虑他对公司的潜在贡献。”

4. 想了就做
Lornajane 他在网上的身份Mitchell更为出名,是一个PHP顾问、开发者、作家和演说家。

她给出了一句简短的建议:想了就做。

“PHP是一种非常易懂、可以进行快速开发的语言。想知道一件事是否可行的最佳方法就是去做这件事。”

“任何人都可以用PHP编程。低门槛意味着会有很多糟糕的PHP作品。但很多糟糕的PHP作品却是非常有用的,即使它看起来并不漂亮。我个人认为如果你能用PHP解决问题,就大胆去实行,即便做出来的东西可能并不完美。”

5. 避免编码倦怠
Cornutt 运营PHPDeveloper.org和Joind.in,他从1998年开始一直在使用PHP。他给PHP初学者的建议是千万不要产生编码疲劳和倦怠。

“我认为新手PHP开发人员很容易陷入一种不堪重负的境地…初学者往往是对语言有兴趣,但总是被一种“能运行即可”的心态误导,以至事倍功半。”

“试图找到一位导师来引导你进行这些初步的学习步骤。当你真正去同他人沟通时,会发现世界很多不同的东西。IRC是一个很好的选择,但找一个牛人做老师肯定是最佳选择。”

“PHP开发也是一种需要磨练的技能,没人可以在一夜之间变成一名高手。”

6. 选择一个好用的编码器
Turner 从1996年开始一直在做web相关工作和参加开源项目。他运营PHPKitchen.com,最近还杀入Seedcamp决赛。

他给了新手PHP开发人员一个非常好的建议,可以节省时间,写出更好的代码,并帮助维持你对编码的兴趣。

“阅读经验丰富的开发者的代码,你总会发现一些更好、更简洁的方式算法。不要重新发明轮子,使用库可以避免自己编写重复的代码。”

“确保你的代码是人类可读的,如果你的代码6个月后连你自己也看不懂了,你让合作的其他开发者如何去看?”

“尽量简化接口,写简单的代码难度更大,不过,良好的重构会为维护节省大量的时间和头痛。”

“最后,了解一些杰出的程序员以及他们如何多年保持对编程艺术的热情。”

7. 了解测试驱动开发、封装和代码控制
Herbert 从1999年一直玩PHP至今,他对Gentoo Linux作出很大的贡献。

对于PHP初学者,他说“学习测试驱动开发和封装。一旦你熟悉它,你代码会写的更快,而且继承你代码的人肯定会感谢你”。

“学会代码控制,这是必经之路。”

他还表示,PHP一个最大的优势是有大量的在线免费文档,不用像学其他某些语言一样,跑到街上的书店去买教程。

8. 了解安全问题
Maclean 是来自苏格兰的PHP和Python开发者。

他说:“正因为PHP易用性强,所以有很多人都在使用,但我们必须想想那些初学者在用它做些什么。没必要什么都从头开始写起,适当地选择使用框架是个很好的开始。”

“另外要做的是了解有关安全的问题。PHP曾经在安全性上臭名远扬,就是因为易用性带来的副作用。我们必须学会避开这些问题。“

来源:http://www.k68.org/?p=403