正在查看: 2009年08月日志归档(第 1 页 / 共 14 篇)

CodeIgniter中开启PATH_INFO时mod_rewrite隐藏index.php的问题

我曾专门写过一篇文章介绍如何使用mod_rewrite隐藏URL路径上的index.php,但在某种情况下如果你改变了URI寻址的方式,这份htaccess方案可能会失效。

在CodeIgniter中,当我将URI寻址方式从AUTO更改为PATH_INFO时,即:

$config['uri_protocol'] = 'PATH_INFO';

注:PATH_INFO的开启,是因为我希望通过$_GET来取值,而不是系统默认的POST方式。

在此情况下如何仍然使用以上.htaccess方案,结果将是:index.php顺利隐藏,但主控制器并不能正确的获取值。

解决方案如下,就一步:

去掉以下重写规则中index.php后面的问号即可。

 RewriteRule ^(.*)$ /index.php?/$1 [L]

修改后的规则如下:

 RewriteRule ^(.*)$ /index.php/$1 [L]

其他地方不变。

Why?

第一句话在index.php后加问号的意思是告诉Apache的mod_rewrite模块,处理请求时自动去掉index.php后的GET字符串,这显然与我的意图相悖。

使用XSLT进行日期格式转换

现在有个问题需要用XSLT来实现,那就是在XSLT中如何将一个日期结点的格式由YYYY-MM-DD转换到DD/MM/YYYY?

我首先想到的就是利用XSLT中的带参数的模板,将此原始日期作为参数参数一个模板中,然后进行重新组合。说起来晕乎乎,还是直接进入实战吧。

假设现在有一个XML文档,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="format_date.xsl"?>
<notebooks>
 <notebook>
  <title>红花还需绿叶衬,我是标题一</title>
  <date>2009-08-11</date>
 </notebook>
 <notebook>
  <title>红花还需绿叶衬,我是标题二</title>
  <date>2009-08-10</date>
 </notebook>
</notebooks>

在这个文档中,结点的日期为2009-08-11,即格式为YYYY-MM-DD,现在我们需要利用XSLT将其转换成DD/MM/YYYY,也就是11/08/2009。

关于实现思路,我在上面已经讲到,不再赘述。这里讲讲具体实现,一个带参数的XSLT模板:

<xsl:template name="FormatDate">
 <!--Convert Old Date Format:yyyy-mm-dd to New Date Format: dd/mm/yyyy-->
 <xsl:param name="DateTime" />
 <xsl:variable name="y">
      <xsl:value-of select="substring($DateTime,1,4)" />
    </xsl:variable>
    <xsl:variable name="m_temp">
  <xsl:value-of select="substring-after($DateTime,'-')" />
 </xsl:variable>
    <xsl:variable name="m">
      <xsl:value-of select="substring($m_temp,1,2)" />
    </xsl:variable>
    <xsl:variable name="d_temp">
      <xsl:value-of select="substring-after($m_temp,'-')" />
    </xsl:variable>
    <xsl:variable name="d">
      <xsl:value-of select="substring($d_temp,1,2)" />
    </xsl:variable>
    <xsl:value-of select="$d"/>
    <xsl:value-of select="'/'"/>
    <xsl:value-of select="$m"/>
    <xsl:value-of select="'/'"/>
    <xsl:value-of select="$y"/>
</xsl:template>

如果对XSLT有所了解,相信上面的代码非常直观;如果不太了解,那么首先你应该去了解,或者在下面留言……

在XSLT中,我一直将模板当作其他程序语言中的函数。理解了这一点,上面这段程序就很好理解了,那个参数Datetime就像是程序语言中的入口参数,用来接受外部送给这个“函数”的参数。

需要注意的地方是,上面的19-23行,这是最后对日期各个部分(年、月、日)进行组合。换言之,你可以组合出任意你可以想出的日期格式,不限于此。

但这里只写了“函数”了部分,没有提到调用,调用方法如下:

<xsl:call-template name="FormatDate">
 <xsl:with-param name="DateTime" select="date"/>
</xsl:call-template>

在此例中,我将date这个结点的值传给了“函数”的参数。

完整的XSLT文件和最后的结果请分别这里这里

新项目:图标吾爱上线

图标吾爱,一个中文图标搜索引擎。

这个网站是我前不久花了断断续续一个多月时间策划和编码制作出来的新站,没有预期它能给我带来多大的作为,仅作为编程的练手以及积累网站运营的经验。

当然,做这个图标搜索站也是有目的性的。

我发现目前国内虽然关于素材的站点很多,但它们普遍存在以下几个问题:

1、图标质量低下。

2、没有对图标进行很好的分类和索引,这就会导致:用户可能仅仅需要搜索某个特定图标,但由于网站没有提供一个良好的索引和检索方式,导致用户需要花费大量的时间和精力浏览很多并不相关的页面,分散注意力,效率低下。

3、用户体验不够好。这实际上是上面说的第二点相关联。

4、不尊重版权。这是一个开放的互联网时代,不尊重版权就意味着杀鸡取卵,自断后路。

图标吾爱的出发点就是改进上述不足,以增强用户体验为主。稍后还会推出一系列与图标处理相关的服务,比如Favicon生成、在线格式转换等非常实用的功能。

图标吾爱总的设计思想是:为每个图标添加多个元标记,我称之为meta tag,然后将此标记与每个图标相关联。而元标记的添加,我采用了开放的理念,由用户自行添加,后台审核。当元标记足够多足够精确之后,检索的质量就自然提高了。

我的目标是,在10秒之内,让用户搜索到自己期望的图标

目前图标吾爱租用的是美国的服务器,可能速度较慢,稍后会将它转移到国内的IDC上,正式运行。

最后,希望有兴趣的朋友,和我共同维护这个项目。要求只有一个:不是奔钱而来的,对网站维护有一定经验(这个网站正处于并将长期处于赔本阶段)。

PHP设计模式:工厂模式之简单工厂

要写出漂亮的代码,掌握一些常用的设计模式是很有必要的。这篇文章只是我将设计模式应用在OO PHP的系列学习(之前一直是在JAVA里面)笔记之一,如有不妥,就留言一起探讨。

根据设计模式的圣经GoF所写的Design Patterns: Elements of Reusable Object-Oriented Software一书的分类,工厂模式被归类在创建模式(Creational Pattern)之下。工厂模式作为一种创建模式,主要用于处理对象的创建,以适合不同场景[via]。

工厂模式又分为抽象工厂模式和工厂方法模式。

本文所讨论的简单工厂,又称作静态工厂方法,可以看作是工厂方法的一个特例。个人认为它是学习工厂模式最好的切入点。

工厂模式,正如其名,我们在实例化一个对象时,不是直接实例化具体的对象,而是通过工厂这个接口来实现。通俗的说,作为消费者(某个对象A),我们在需要消费(调用)某个具体产品(其他对象B)时,不需要了解这个产品(对象B)的制作过程(实现过程),只需要直接拿这个产品来用即可。而具体的这个产品的生成(对象的实例化)过程,由工厂实现。

可见,工厂模式可以在降低对象间的关联(耦合度降低),并能够隐藏具体产品的实现过程。因为整个调用过程是面向接口的。

»阅读全文

PHP设计模式:工厂模式之抽象工厂

上一篇中,我主要记录了工厂模式之一的简单工厂在PHP中的实现,这篇文章主要总结工厂模式的另一种形态:抽象工厂。

简单工厂中,工厂的角色是负责实例化具体对象,而在实际应用中这种情况却不很实用,主要原因是如果我们希望增加或去除这个工厂所能实例化的某个对象,则需要对工厂类进行直接修改,这显然违背了低耦合的宗旨。对于上一篇文章的例子来说,那就是:如果我们需要添加那个汽车工厂所能生成的汽车品牌,则需要修改工厂类的判断逻辑。

如何尽可能的降低耦合,从而达到非侵入式的设计逻辑?这里的非侵入式一次,是我从Spring中借用过来的概念,通俗来讲,就是去除和添加某个工厂的产品对象不影响整个程序的架构。

由此就引入了抽象工厂的思想。抽象工厂将面向接口编程的思想演绎的淋漓尽致,它的核心思想是:抽象工厂仅提供一个产品簇(同一类别的所有对象的接口抽象)的通用接口,而将实例化对象的任务交给遵循其标准的具体工厂来完成;具体工厂还可能生产出多个产品,此时还需要对产品定义一个接口,供具体工厂来生产具体产品。

举个例子,还是关于生产汽车的。汽车工厂经过一段时间的努力,现在已经发展装大了,于是做了两个决定:第一个决定是将生产汽车的过程分拆成两个阶段,分别是生成轮胎和除去轮胎的其他部分。另一个决定是,决定为每个汽车品牌单独建立一个汽车工厂。那么如何管理这些工厂,使他们既遵循第一个决定,又不相互干扰?解决办法就是:汽车总厂提供生产汽车的通用流程(第二条),这个流程两个子工厂都需要严格执行。同时,将具体生产的过程交给两个具体工厂,分别是Benz工厂和Audi工厂。这就是抽象工厂的设计思想的概念。

»阅读全文

使用索引优化含ORDER BY的MySQL语句

谨以此文献给那些希望优化MySQL数据库查询性能,却又不知道如何着手的同仁们。本文将持续更新

本文的第一个版本发布在CI中国社区,主要是发现很多同学虽然知道索引能够提升MySQL数据库的读取性能,但却存在很多操作上的误区。所以,我特此写了这篇文章,希望能够对大家有些启示。

下面的内容很大程度上是我在平时项目中积累所产生的认识,既然是一家之言,难免会有错误。如果对其中某一条规则有异议,欢迎和我交流。

在开始之前,我想表明一个观点,很多同学在编写WEB程序时,往往非常重视程序的结构和效率,这固然是一个很好的习惯。但他们却忽视了对数据库的结构和优化。在我看来,对于目前很多网站来说,特别是那些对数据库依赖非常严重的泛WEB 2.0网站,数据库调优比程序本身的效率更重要。

本文的主题是:在MySQL中,如何通过合理的建立索引,大幅提升包含ORDER BY语句的效率。在这里,我主要以讲述操作为主,至于为什么这么做,各位同学就要去查阅包括MySQL手册在内的其他资料了。

»阅读全文

修改了几个BUG,图标吾爱升级版本0.1.1

这几天抽空对图标吾爱的源码进行了完善,主要以解决BUG和算法升级为主。

具体升级细节Ver 0.1.1:

1、开启整站GZIP压缩

2、修正ICO图标下载失败的BUG

3、整合多个CSS文件至单一CSS文件

4、重写搜索、分词、智能提示(?)的核心算法

5、压缩所有JS CSS文件

6、检查整站是否存在安全漏洞

7、加入DB Cache功能

总的来说,是在做性能优化,不过由于主机用到是IXWebHosting,国内访问速度还是慢。等有空了,开始租用国内的LINUX主机,做下调查先。

下一步将直接升级到Ver 0.2,以功能升级为主:

1、加入Favicon在线生成

2、加入图片格式在线转换

PHP设计模式:Singleton单例模式

此文承接之前我在PHP中实现简单工厂抽象工厂的讨论,讨论一个广泛应用在OOP体系中的设计模式——Singleton模式。

Singleton Pattern(中文称单例模式),可以说是最容易理解的设计模式了,也充分体现了DRY (Don't Repeat Yourself)的思想。它的核心思想是:保证一个对象存在且仅允许存在一个实例,并提供一个全局访问方式[via]。

单例模式的运作模型是:当对象第一次被请求时,创建这个对象的实例;之后的每次请求,仅传递已创建实例的句柄。与单例模式相对应的模式叫做Prototype(Java平台下)或者叫SingleCall(.NET平台下),在此种模式下,每次请求一个对象,都将新建一个实例。

在WEB程序中应用单例模式的一个典型例子是数据库连接的创建:通过数据库句柄来连接数据库这一行为是独占的。换言之,在一个句柄尚未关闭之前,你无法第二次创建一个相同名称的句柄。然后在日常编码中,假设你希望在同一页面中操作由数据库传递回来的多组数据。此时如果采用传统的Prototype方式编程,为了程序的安全运行,你可能需要创建多个数据库链接句柄或者重复进行打开/关闭数据库连接的操作。显然,这样的操作会导致程序过度消耗一些不必要的资源。

在此场景下,我们可以运用单例模式来维护和共享同一个数据库句柄。优点有二:

1、提高了程序运行上的安全性。你不必过多的担心和考虑诸如数据库打开/关闭的问题。

2、避免了因创建多个连接导致的不必要资源浪费。垃圾回收机制仅需要对一个链接句柄进行操作。

当然,以上两个问题对于PHP来说并不是问题,PHP的垃圾回收机制就是,当一个页面执行完毕会自动清空所有资源和内存,这里面就包括数据库连接。

至此,可以总结出Singleton单例模式在WEB程序中的运用场合:

1、某些资源本身具有独占性,你不希望在多个地方重复创建对这个独占资源对象的实例。

2、你需要在一个对象的多个实例之间共享这个对象的状态(下面我会将此条规则进行代码举例)。

下面写一段小代码来演示PHP 5中Singleton的实现:

/***************************************************************************
 *              Singleton在PHP5中的实现
 *             
 *   @Author  :    Saturn
 *   @Contact: http://www.cnsaturn.com/
 ***************************************************************************/
class Singleton
{
 //此成员变量用来记录此对象的引用次数
 private $counter = 1;
 //注意这里是private,即禁止外部程序通过解析函数实例化对象
 private function __construct()
 { }
 //禁止克隆这个对象
 private function __clone() 
 { }
 //必须通过此方法得到对象的引用
 public static function getInstance()
 {
  static $instance = null;
  if($instance == null)
  {
   $instance = new Singleton();
  }
  return $instance;
 }
 
 public function getUsedCount()
 {
  return $this->counter++;
 }
 
}
//test test
echo Singleton::getInstance()->getUsedCount();//echo 1
echo Singleton::getInstance()->getUsedCount();//echo 2
echo Singleton::getInstance()->getUsedCount();//echo 3
$obj = new Singleton();//trigger fatal error
?>

此程序演示的是如何通过Singleton模式让多个引用能够同时共享此对象的某个状态,在这里是共享$counter。

注意,我们将解析函数的Scope设置成了private,这样做为了禁止通过解析函数实例化对象,而必须使用对象提供的静态化方法getInstance来获取对象的引用。

这个例子比较简单,但已经初步展示了单例模式的核心思想,仅起抛砖引玉的作用。

贴几张年初去企鹅岛的照片

这是今年年初,我和朋友一行四人游至墨尔本著名的景点企鹅岛的一些照片。今天翻自己的硬盘,突然发现了这些照片,于是贴上来立此存照。

Phillp Island,又称企鹅岛,距离墨尔本大约三个小时左右的路程,应该是南半球最容易看到企鹅的地方。这些小企鹅(这种企鹅的名字就叫做"小企鹅")只在澳大利亚和新西兰部分地区出没。

这不是壁纸

初到澳大利亚时,我就感觉这个国家的生态真是一绝,比如什么东西长得都很大:比姚明还高的仙人掌,近1米高的西芹……风景那更是没得说,比如下面这张照片,是我们经过企鹅岛时GPS发生错误引导而“偶然发现”的一处海滩。

深处其间,反复置身天堂。Paradise.

我的背影……

低低的云朵

天渐渐暗下,到处都是海鸥在我们头上盘旋。

企鹅马上就会成群结队的出没了,可惜的是,全场禁止拍照。这不能不说是一个遗憾,但为了保护这些可爱的小精灵,也值了。不过朋友倒是照了几张陈列馆的企鹅模型。

照片中左手第二个就是我们这次看到的小企鹅,非常小。大概只有不到30厘米高。再次感叹大自然的伟大与人类的渺小。

不贴我本人的照片似乎不太厚道,哈哈。不过我不告诉大家这里面哪个是我,大家可以通过对比上面的“我的背影”猜猜看。

完结。

[案例]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