胡言乱语之一

这是我的胡言乱语系列的开篇文章,主要记录自己日常中因为某些事件而“触发”的一些想法。如果有人赞同,那固然很好;如果没有,权当练习写作和思维;若干年之后看这个系列应该会感觉很有意思。

总之,欢迎拍砖与探讨。版权的,没有;拷贝的,欢迎。

#1 寂寞的中国互联网

国内现在有个很搞笑的现象,当国内媒体热衷报道国外的创新性互联网产品如Twitter时,郁闷的网民却发现这些网站根本就访问不了。于是乎,此类新闻就彻底沦为炒作和噱头,只是不知道这些炒作的对象是谁?

不过这还是有好处的,至少它给了一小撮模仿起家的翻墙精英以机会。因为只有他们,能够第一时间翻过墙去,COPY那些国外的先进理论。然后就有了非死不可中国版人人网,推特中国版(现在仍然被维护)的饭否们。

国家一直鼓励创新,尤其是在互联网这个人才辈出的新兴行业。但在目前这个并不开放的互联网大环境下,何以创新,以何创新?或许,大部分创新已经都被扼杀在了它们的初级阶段了。

没有一个开放的环境,在我看来,很难出现百花齐放的创新性互联网。

#2 没落的博客

志勇兄博文《流量》一文再次引发了我对国内独立博客未来的思考。我这里所谈到的博客,是指独立架设博客,非第三方BSP新浪博客之流,那里是炒作、绯闻以及“名人”之间骂战的起源地。当然不能一棍子打死一船人,但总的来说,我给新浪博客下的定义是“名人博客”:80%的草根给20%的“名人”捧场吆喝。这又一个墨菲法则的典型案例。

在国内写博客真的是一件吃力不讨好的事情。首先,你很难因此赚到钱,就算赚到钱也很难以此糊口。其次,你需要时不时担心自己的某些文字是否触犯了神秘机构“有关部分”的潜规则,进而被悄无声息的拔掉网线?就算你将服务器迁至国外,你也要承担被GWFed的风险……

在我看来,这都不是目前博客没落的最大杀手;最大杀手是对版权的藐视,这可以说是中国互联网的特色之一。想必大多数写博客的人都碰到过这样的情况:你花了大半天写完了一篇博客文章,第二天却欣喜的发现这篇文章只字未改的出现在某知名网站上,只是作者变了个人。

于是乎,博客作者们仅剩的一点动力也被无情的扼杀了。所以,下次你发现一个博客几年没有更新,千万别惊讶。

开放与尊重,是博客价值体系的基石,破坏了它,想不没落都不行。

»阅读全文

Tags: 胡言乱语

CodeIgniter上传类库的一个Bug

这几天重构博客程序的时候,发现了一个CodeIgniter默认上传类的BUG。很奇怪的是,一直到前些天CI官方最新发布的1.7.2,此BUG仍未修正,特此记录。

症状:只能上传图片后缀的文件,其他类型文件(比如.zip,.tar.gz)无法通过验证,就算你将这些类型添加进了$config['allowed_types']。

涉及到的CodeIgniter版本:1.7.1;1.7.2。

原因:Upload Class中的is_allowed_filetype()方法有逻辑错误。

解决方案

1、如果你不想动CI的系统源码,那么就将除图片类型之外的其他后缀,放到图片类型之前,比如:

$config['allowed_types'] = 'zip|gz|png|gif|jpg';(正确)

$config['allowed_types'] = 'png|gif|jpg|zip|gz';(错误)

请注意以上暗红色部分的位置。

2、对Upload.php开刀并修改is_allowed_filetype()的判断逻辑,解决办法在这个帖子里面:

http://codeigniter.com/forums/viewthread/113029/

这个BUG在BUG Tracker存在了那么久,开发者竟然不采纳的……What can I say?

PHP中插件机制的一种实现方案

这篇文章的出发点是我对插件机制的理解,及其在PHP中的实现。这套插件机制已经在你目前看到的这个博客程序中的重构代码中实现(我定名为STBlog),由于尚未开发完毕,所以目前暂不开发源代码。但文章会涉及到核心思想和部分实现代码。

插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现),它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除它;且无论是激活还是禁用都不影响系统核心模块的运行,也就是说插件是一种非侵入式的模块化设计,实现了核心程序与插件程序的松散耦合。一个典型的例子就是Wordpress中众多的第三方插件,比如Akimet插件用于对用户的评论进行Spam过滤。

一个健壮的插件机制,我认为必须具备以下特点:

  • 插件的动态监听和加载(Lookup)
  • 插件的动态触发
  • 以上两点的实现均不影响核心程序的运行

要在程序中实现插件,我们首先应该想到的就是定义不同的钩子(Hooks);“钩子”是一个很形象的逻辑概念,你可以认为它是系统预留的插件触发条件。它的逻辑原理如下:当系统执行到某个钩子时,会判断这个钩子的条件是否满足;如果满足,会转而先去调用钩子所制定的功能,然后返回继续执行余下的程序;如果不满足,跳过即可。这有点像汇编中的“中断保护”逻辑。

某些钩子可能是系统事先就设计好的,比如之前我举的关于评论Spam过滤的钩子,通常它已经由核心系统开发人员设计进了评论的处理逻辑中;另外一类钩子则可能是由用户自行定制的(由第三方开发人员制定),通常存在于表现层,比如一个普通的PHP表单显示页面中。

可能你感觉上面的话比较无聊,让人昏昏欲睡;但是要看懂下面我写的代码,理解以上的原理是必不可少的。

下面进行PHP中插件机制的核心实现,整个机制核心分为三大块:

  • 一个插件经理类:这是核心之核心。它是一个应用程序全局Global对象。它主要有三个职责:
    • 负责监听已经注册了的所有插件,并实例化这些插件对象。
    • 负责注册所有插件。
    • 当钩子条件满足时,触发对应的对象方法。
  • 插件的功能实现:这大多由第三方开发人员完成,但需要遵循一定的规则,这个规则是插件机制所规定的,因插件机制的不同而不同,下面的显示代码你会看到这个规则。
  • 插件的触发:也就是钩子的触发条件。具体来说这是一小段代码,放置在你需要插件实现的地方,用于触发这个钩子。

原理讲了一大堆,下面看看我的实现方案:

»阅读全文

Tags: php,stblog,插件

22周岁

这是我第一个在海外度过的生日,虽然没有什么特别活动,但仍然收到了家人、朋友和众多同学的祝福,真的是非常感谢和感激。

这让我觉得,虽孤身一人求学,但却并不孤独。

服务器正在升级

难怪前些天我总感觉服务器不稳定(经常掉包,反映缓慢),原来是真的出问题了。今天IXWebhosting发邮件告诉我,下周可能对我目前博客所在的服务器做迁移,以提供更好的服务。

国外的IDC服务客户服务真的是没话说,就算是他们的问题,你也很难找出埋怨的理由。国内大部分IDC就比较无良了,我用过很多IDC的主机服务,大部分给我的感觉就是:交款前你是他的上帝,交款后他是你的上帝。

We have been alerted to the fact that life on your server has not been so great. Load times are slower than they should be, some downtime may be experienced, or uploading content to your sites is not the quick and easy process it once was. If you have no idea what I'm talking about, that's great...but you may become acquainted with these symptoms soon if we don't do something about it now.

What we have decided to do is migrate accounts away from your server in order for the quality of life to improve across all accounts. Your account may be migrated (and if it is, what to expect is outlined below) or you may remain on your current server. Either way, you should notice a marked improvement in performance!

Migrations will begin on Monday, September 21st and continue through Friday. If your account is one of the ones being migrated, you will receive a ticket in the helpdesk informing you that the process has been initiated and what to expect.

These changes are being made so that you may experience much higher-quality service levels – the service levels you signed up for.

建议国内的IDC们学习下这种24*7无缝无掉线的客户服务吧。

Location-aware Query Processing

这是我今天做的一个关于Location-aware Processing的Presentation,立此存照。

Location-aware是近5年来,业界发展最迅猛的一个新兴概念和技术。Google Maps on Mobile就是这一技术的典型应用。

PPT看这里

图标吾爱搬到了新家

再次对图标吾爱进行了整体优化,上次优化主要集中在搜索算法和程序逻辑

此次优化主要集中对前端的优化,严格遵循Yahoo优化小组的这34个标准。由于涉及到大量的JS/CSS文件,所以优化的效果非常明显,YSlow给出的图标吾爱首页的评分是95。

另外,我将图标吾爱从IXWebhosting搬到了国内的易联主机。由于目前身处国外,暂时感觉不到有多少明显的变化,请国内的朋友帮忙测试下网站的响应速度。IXWebhosting最近似乎不是很稳定,经常出现掉包的现象,而且MySQL数据库反映缓慢(也有可能是我的网络的原因)。

说来很有意思,一个对设计并不擅长的代码工人现在却做了一个对设计要求比较高的图标搜索站。我也不知道自己对这个站的愿景是什么,也不对它的发展抱多大的期望,但是我总希望自己能够为国内UI和UED的发展做出些什么,虽然我只是个程序员:)

在未出国之时,我就发现国内的网站相比国外,普遍不重视网站的User Interface、Web Accessibility和Web Usability。到了国外,这种感觉就更加强烈了,就拿银行业的网站来说,国内有多少个银行网站能够兼容所有主流浏览器的?似乎很少,于是就有了用户为了使用网银而特地打开一个IE浏览器的笑话。再比较一下国内某著名航空公司澳洲某著名航空公司网站的界面设计和用户体验,你就不难发现其中的差距。

而我认为,图标作为Web设计中重要的一个细节,对UI设计应当有相当大的改善和促进作用。很多时候,一个图标的有效表达可抵千言万语。

额……似乎写着写着就跑题了,就到这里吧。

Tags: icon52

卫报的网站技术架构

这是QCon 2009伦敦站,由英国卫报的首席系统架构师Mathew Wall带来的演讲,非常具有借鉴和学习意义。

卫报的R2架构是一个典型的J2EE敏捷开发的实际应用,也是一个企业级的网站从旧的系统(卫报R1)移植到新的系统(R2)的典型实战。

R2的初步应用架构:

可以看到,这是一个典型标准的J2EE敏捷开发架构:

1、采用原生Spring MVC作为Web Tier;

2、使用Velocity 1.5做模板引擎;

3、使用Hibernate ORM做持久层。

4、建立实体Domain Model和其对应的Repository。

6、使用Ehcache配合Hibernate进行缓存

除架构值得学习之外,Mathew还介绍了他们的一些新老系统移植经验,比如,在移植过程中为何首先卫报的Travel频道作为测试对象,以及在这过程中碰到的问题和解决方案。

非常值得一看的视频:http://www.infoq.com/presentations/evolving-architecture-guardian-uk

Tags: 架构,j2ee

使用PHP/gzip压缩网站JS/CSS文档的实例

一些泛WEB 2.0网站为了追求用户体验,可能会大量使用CSS和JS文件。这就导致在服务器带宽一定的情况下,多用户并发访问速度变慢。如何加快网页响应速度?解决办法之一就是:依照Yahoo性能优化小组提出的N条性能优化建议对前端程序进行优化和重构,关于此文的讨论很多,在这里不再赘述。

这篇文章主要分享一下我个人在实际项目中,对于使用PHP对JS和CSS进行压缩的经验,在这里假设服务器仅支持GZIP压缩,不支持.htaccess(符合很多站长的租用的虚拟主机实际情况)。

首先说说对CSS和JS文件进行性能优化的几个小技巧:

  • 将多个CSS/JS文档合并成一个文件,以减少HTTP请求
  • 对合并后的文件进行文档压缩,比如分别使用js compressorCSS compress
  • 如果使用到一些主流的JavaScript框架,比如JQuery, Mootools或者YUI,强烈推荐直接使用Google AJAX Library以外部链接的形式导入基库。
  • 最后,就是本文所提到的,使用GZIP在服务器端对JS/CSS文档进行压缩。

这里提到的方法对系统来说是无侵入式的,也就是说不管你的程序是新编写的,还是已经上线了很久,均适用。

»阅读全文

Tags: php,gzip

[案例]iptables/netfilter建立防火墙之常用命令集锦

声明:本文由cnSaturn.com原创,转载请注明出处。

Update: 2009-8-25

本文的目标读者是已经了解过iptables运行原理的同学,如果你连iptables是什么都不知道,那么本文并不适合你。因为此文并不介绍iptables的运行原理,而是直奔主题介绍一些它的常用实施案例。

iptables/Netfilter可以用来在Linux主机环境下架设简单的防火墙。

现在,假设我们有一个IP段为192.168.1.0/24的内部子网,它通过一个网关(gateway)链接到外部网络(可能是互联网或其他子网)。我们的需求是:需要通过iptables为其配置一个简单的防火墙以满足特定的需求。以下所有案例均基于此假设,网络拓扑图如下:

案例一:拒绝外部网络的所有FTP数据包,但允许内部子网运行FTP服务。

»阅读全文

Tags: linux,iptables