2010 年 04 月

浏览模式: 标准 | 列表 | 图文

Drupal 的钩子(Hooks)

hooks这玩意,一向是被认为是可扩展的代名词,当一个系统启动了hooks后,他就变得可扩展了,同样,他的性能也就需要被众人拿出来做比较了。
目前被很多人拿来做比较的是两款程序:drupal和wordpress,是使用量最大的博客程序之一,在很多人眼里,这两个程序已经脱离了博客,而是CMS了。drupal前后台不分是我最不舒服的地方,所以wordpress才是我的首选。或许大家看到我的TAG里面还有ThinkPHP和QeePHP,那是因为这两个框架都在考虑有行为加入,行为嘛,相对于框架,就当于一个hooks,所以我也加上了这两个框架
thinkphp的Add_filter,add_action和wordpress有点相像 ,而qee因为没有仔细看过,所以不太清楚(flea的时候好象没这个功能)

跑题半天了。上文了

Drupal怎么就知道什么时候调用一个模块来处理特定的请求?

这个是通过Drupal的hook机制完成的,下面解释一下hook的工作机制。

当Drupal处理来自用户的一个请求,它通过一系列步骤进行。比如:Drupal核心首先引导这个应用,确定关键变量和经常使用的功能。接下来,它加载 关键库、主题和模块。接下来,它继续处理请求,将请求的URI映射到正确的处理代码,等等。然后它为数据应用一个主题,为输出来格式化信息。最后它返回输 出结果到用户的浏览器。

在循序渐进的预定义时刻,Drupal进行勾取。这意味着什么呢?简短的说,它意味着Drupal测试部分或全部当前启用的模块,寻找遵循特定的预定义模 块的函数。一些已经连接这个进程到“回调”的模式经常被用在事件处理模块中。Drupal和这个是类似的,但是更加充满活力。

比如说,当它正在创建一个页面浏览内容时,Drupal可能再模块中寻找叫做<modulename>_block() 和<modulename>_view()的函数(在这里<modulename>被每个Drupal检测的模块的名称代替)。 寻找模块包含的这些函数被叫做实施hook_block()和hook_view()勾取。

当Drupal找到这些函数,它执行它们,并且利用这些函数返回的数据创建一个响应来发送给用户。然后Drupal继续循序渐进的处理请求,或许在它进行 过程中执行许多其它的钩子。

当所有的步骤完成并且一个响应发送给用户,Drupal自动清除并且推出。

模块可以定义自己的钩子,这些钩子又可以被其他模块使用。这样一来,hook机制可以扩展到提供复杂的定制行为。

当一个模块提供匹配一个钩子的签名的功能,我们就说那个模块执行那个钩子。比如,假设Drupal有一个叫做hook_example()的钩子。如果我 们定义一个叫做 mymodule 并且包含一个叫做 mymodule_example() 函数的模块,我们就会用到 hook_example().

Hook对于面向对象程序员的启示:

那些对面向对象编程熟悉的程序员可能发现在面向对象语言中考虑将钩子作为一个类似于接口方法或者抽象方法的机制是很有用的。钩子是Drupal将寻找的函 数并在某些情况下需要出现在你的模块中。就像接口方式,一个钩子的函数签名必须匹配Drupal的预期签名。而和接口不同的是,模块开发者可以选择(在一 定程度上)哪个钩子去实现、哪个钩子去忽视。Drupal不要求每个定义的钩子都实现。

参考:《Learning Drupal 6 Module Development》

原文来自:http://www.cnblogs.com/stylesheet/archive/2010/04/16/1713512.html,上次我也写过wordpress的hooks,其实原理都差不多。

为什么Linux现在无法吸引年轻开发者

为什么Linux现在无法吸引年轻开发者

发这个新闻,主要不在新闻的内容,而是在回复。仿佛当年的项庄舞剑,意在沛公差不多。

新闻原文是这样的:

Linux基金会执行董事Jim Zemlin声称Linux的市场地位十分稳固,尽管几位Linux内核的关键维护者已经头发花白。Linux Weekly News的主编Jonathan Corbet在上周举行的Linux基金会协作峰会上挑 明了这一问题,他指出Linux内核团队的年龄一年比一年长,而年轻一代的开发者没有参与进来。为 什么Linux现在无法吸引年轻开发者?

著名的内核开发者Andrew Morton也承认,他们越来越老,越来越累,而且没有看到其他人像他们过去那样充满激情的投入到一件事上。他同时指出,这个问题比较复 杂,因为随着内核代码越来越复杂,进入这个领域的门槛也越来越高,参与内核开发的开发者需要有丰富的经验和知识。他表示Linux内核 团队鼓励年轻一代的热心参与。

也有人评论认为,这种状况和学校的计算机教育也有关系,现在的计算机科学教育不再和1980年代和90年代那样关注底层开发和硬件交互,而 是主要学习高级语言如python、.Net、java等等。

编译/solidot

回复是这一条:

匿名人士 发表于 2010-04-19 13:33:05
因为年轻人要买车买房娶老婆……
极有同感,大家可以去为什么Linux现在无法吸引年轻开发者围观
有点意思:QQ 我的好友想到的信息架构

有点意思:QQ 我的好友想到的信息架构

这篇文章有点意思,不过我更多的想的不是他所说的这种分类,一般来说,在电子商务里面这方面,这方面其实是最难界定的。产品A既可能属于B分类,也可能是属于C分类。但是在促销的时候,B分类产品不打折,C分类可以打折,这时你把A产品怎么处理?打折还是不打折?

QQ好友列表:

+太原(9/39)
+运城老乡(9/49)
+西安(9)
+学校(19)

问题:
QQ
好友上新建了一个女孩组和一个西安组,上面的整理方式,发现经常 弄错,比如“XX“同学,是我女友介绍认识的,我将她顺便放在太原组里面,后来知道她不在太原,山西运城人士,当我和她聊天时候,连我自己都很吃惊经常 问,太原的一些情况,很是影响人家心情,搞的自己也很尴尬。
很长一段时间,渐渐习惯这种分类,突然间觉得这样的分类很不科 学,很明显,这涉及SNS的经典问题,以及信息架构的经典问题:如何做一个有效分类?

我的需求:
1. 新添加一个朋友的时候固定存放
2.
常联系的人立马可以找到
3.
和我趣味相投的统统放在一起,玩到一起的,闲来没事可以出去一起 疯狂的
4.
能够表达出我的职业规划,定位明确,可以清楚的阐述我的社会活动 能力与人际关系

详细说明:

要做到:
1. 清楚地表现好友信息:一看这个分类,就知道这一类型的人是干什么 的,和他们应该在那些方面可以顺利沟通清楚问题。
2.
层次结构清晰:一看这个分类,就知道什么人在这个分类下面,分类 下面涉及到什么朋友

不应该是:
1. 这个分类给人一种距离感,陌生
2.
我想找的是分类A, 但你却出现在分类B中?NND
3.
这个分类做出来不能让我自己都犯晕!

问题的表象是如何找到一个合理的好友分类方式,深入问题的本 质,其实是不满足我的需求,而QQ体现的核心是我的二字,因此人际关系、社会活动能力、我的职业规 划就是该信息架构问题的关键!这样就有了看似简单但能立刻解决问题的分类方式:

QQ好友列表:

6e6225c2da047e6a66a1f1a24766e0af

+熟人(9/19)
+一家人(9/19)
+一帮子(9/14)
+光屁股长大(9/100)
+
刚认识(2/10)
+xxx
公司
+xxx
公司

一切就这么简单,采用这个分类以后,立 即心旷神怡!

--EOF--

原文来自:http://www.cnblogs.com/u_xiaomo/archive/2010/04/18/1714953.html

不过话说回来,抛开电子商务的因素,wordpress的分类设计的就是挺不错的。一篇文章在你迷惘的时候,可以放到多个分类里,分类又只是相当于一个标签。这样的设计让使用者也很爽。只是开发的时候累一点,SQL的性能差一点点而己。

google教你SEO

google教你SEO

Google教你如何SEO,听到这个,你是不是很不相信?很意外?说实话我也真的很意外的,作为一个搜索引擎,你居然把SEO方法教给大家,想想都不可能。可是事实上,在 Inside AdSense-中文网站上已经有类似资料了,比如Google SEO 入门教程,又比如这篇:优化网站的抓取与收录。

说白了,其实google也希望大家多用用google也只有这样,他的广告才能推销得出去。可惜对我来说不太好。要知道我用了google广告很久,但真的没有什么点击率。而另外的朋友做了一段时间却已经有了不菲的收入。

因此对于google的这些SEO资料,我也就纯粹做做参考,不过,有些东西对于增加用户粘度啥的,还是有点用户的,比如作为一个用户,当你看到你的域名把整个地址栏都填满的时候,恐怕你也没有多大的兴趣把它复制给你的朋友吧。当然我想信,如果某个用户复制了很长很长的域名给你看的时候,你会点击它吗?这样地址在我眼里就是垃圾网站的代名词,只有那些作骗子网站才会有这么长的网址。

  • 去除URL中的用户相关参数。那些不会对网页内容产生影响的URL中的参数——例如session ID或者排序参数——是可以从URL中去除的,并被cookie记录的。通过将这些信息加入cookie,然后301重定向至一个“干净”的URL,你可 以保持原有的内容,并减少多个URL指向同一内容的情况。
  • 控制无限空间。你的网站上是否有一个日历表,上面的链接指向无 数个过去和将来的日期(每一个链接地址都独一无二)?你的网页地址是否在加入一个&page=3563的参数之后,仍然可以返回200代码,哪怕 根本没有这么多页?如果是这样的话,你的网站上就出现了所谓的“无限空间”,这种情况会浪费抓取机器人和你的网站的带宽。如何控制好“无限空间”,参考这 里的一些技巧吧。
  • 阻止Google爬虫抓取他们不能处理的页面。通 过使用你的robots.txt 文件,你可以阻止你的登录页面,联系方式,购物车以及其他一些爬虫不能处理的页面被抓取。(爬虫是以他的吝啬和害羞而著名,所以一般他们不会自己 “往购物车里添加货物” 或者 “联系我们”)。通过这种方式,你可以让爬虫花费更多的时间抓取你的网站上他们能够处理的内容。
  • 一人一票。 一个 URL, 一段内容。在 理想的世界里,URL和内容之间有着一对一的对应:每一个URL会对应一段独特的内容,而每一段内容只能通过唯一的一个URL访问。越接近这样的理想状 况,你的网站会越容易被抓取和收录。如果你的内容管理系统或者目前的网站建立让它实现起来比较困难,你可以尝试使用rel=canonical元素去设定 你想用的URL去指示某个特定的内容。

上面这些内容都可以值得作为参考。无谓的重复的内容,只会浪费大家的精力。呵呵。
SEO本来就是一些小技巧 慢慢的累积起来的。觉得有用就参考一下吧。

[多图]网易域名邮箱

[多图]网易域名邮箱

昨天刚说QQ域名邮箱升级,却发现原来网易的域名邮箱又悄悄的开通了。
其实在刚刚网易的域名邮箱开通时,我还是准备想用的。只是我刚准备用的时候,它就关闭了。。
后来尝试使用了微软的域名邮箱live.com还用了google的域名邮箱(由于google的不能绑CNAME【因为功夫网】,导致只能到google页面登录。)
再后来就是QQ域名邮箱了,那也是09年的事情了。
昨天又听说网易域名邮箱开通,是在cnbeta上的事情:
--start--
前几天听说网易将在今天提供免费域名邮箱服务,今天一早就打开,结果还没有上线,中午打开也还没有。刚刚发现已经上线了,可惜需要邀请码。记得网易在前两年就搞了免费域名邮箱,启用的域名是ym.126.com,但是上线没多久就关闭了。自从腾讯搞了个免费域名邮箱后,我就一直使用腾讯的域名邮箱,还不错,相当于是QQ邮箱名换成自己的域名后缀。 网易在中国算是邮箱老大,但是QQ邮箱上线后,腾讯抢了不少用户,眼看蛋糕一点点被抢走,看来网易也得想法子了。

网易域名邮箱是免费的,网址是:http://ym.163.com ,目前是需要邀请码才能注册,我也还没能得到邀请码。虽然很想试用,但是最终我可能还是使用腾讯的域名邮箱,因为真的很方便。
--EOF--
原文地址为http://www.cnbeta.com/articles/108827.htm

QQ域名邮箱的成员数从30人升级至100人

QQ域名邮箱的成员数从30人升级至100人

QQ域名邮箱这玩意,早就该升级了。默认成员数只有30人,你说,这还是给企业用的吗?估计也只有个体公司或者工作室才会这么使用吧?
虽然,确实很方便。但用户数真的太少了。

这次QQ域名邮箱成员数的更新,终于可以让一些小型企业免费拥有了自己的域名邮箱,而不用再花钱了。这次更新又会有多少邮件服务提供商关门呢?期待中。。。。

于是乎,突然想给自己搞点域名邮箱。

比如:@ucapi.com , @tbapi.com , @aliapi.cn , @mzditu.com ,@youhui.in ,@phpoo.com 等等。

当然@neatstudio.com和@neatcn.com以及@52cd.net才是我最重要最想主打的一些域名邮箱。HOHO。

@kkread.com现在用来做推特。如果用来做邮箱却不是特别好。本来是想用来做小说站的,却迷惘的不知道怎么做。

感谢这次QQ的域名邮箱升级,只是希望不要象网易的域名邮箱那样,推个半年一年的就关门大吉了。

Godaddy 优惠码

Godaddy 优惠码

由于我注册了godaddy,因此经常收到一些邮件,为了方便各位以及与各位共享,所以我会整理这个godaddy的优惠码。超过10%的我就放到文章里。。。注册gaddy也很方便。大家可以去注册一下

基本上长期有效的godaddy优惠码,续费域名的:promo749和Wallet30,Godaddy 续费 优惠码有图为证。

ZINE10和NAU3,同上,都是节约30%左右的godaddy优惠码(这个只针对COM域名)

godaddy .net域名优惠码 net优惠码:EMFB7 ,7.49美元/年,长期有效

godaddy .org域名优惠码 org优惠码:EMFB7 ,4.99美元/年,长期有效。

godaddy .biz域名优惠码 biz优惠码:EMFB7 ,7.49美元/年,长期有效。

当然,这些也都是:CRAZY3,VCU3,HITCH3,CDE3,STK3

嗯,还有这个:CJCTLD749

这些优惠确实效果不错,7.49差不多就是7折了。还能要求什么?

这个优惠码:gda627p ,到期时间:2010年7月12日,打折幅度30%

2010年5月7日到期的,注册.COM 7.49美元的优惠码
This special offer expires 5/7/2010
, Use source code NC749FDA when you check out to get your exclusive savings.

2010年4月29日到期的30%的优惠码:
This DOMAIN SALE ends 4/29/2010 at midnight (Pacific Time), To get your discount, just enter source code NCD30A in your shopping cart, or mention the code when you call.

更改网站默认浏览方式为【列表】模式

更改网站默认浏览方式为【列表】模式

由于我不太习惯写摘要,因此问题就出来了。如果文章很长,图片很多,打开首页就会很慢。
以前我一直自己用COOKIE来解决,现在想想,还是用更换默认浏览方式来彻底解决这个问题吧。

改为【列表】后,我相信浏览速度一定可以上一个台阶吧?呵呵,而且,象我这种发起疯来一天最多可以发好几篇勃客的人来说,列表,岂不是更容易展示我的勃文?

oh yeah

简单伪造X-Forwarded-For

简单伪造X-Forwarded-For

说实话,通过代理访问之类的以前都曾关注过,但伪造来源IP还真没注意过。以下的文章内容我没有测试过,仅仅了解一个想法,或许真可以,或许早就不行。但既然有第一次以后就会有第二次。了解入侵途径、方法,在遇到问题的时候岂不更好、更容易多一个技能来解决它?

原文来自:简单伪造X-Forwarded-For

关于伪造X-Forwarded-For的目的我就不多说了。在入侵一个PHP站,GPC为ON的时候,

字符型注入全部歇菜,而在PHP5中,GPC默认是打开的。但是GPC对$_SERVER无任何影响,

因此可以通过伪造$_SERVER来达到注入的目的。

IP.php中有如下代码,主要是获取客户端IP:

<?
function GetIP() {
if (getenv("HTTP_CLIENT_IP")){
echo "getenvHTTP_CLIENT_IP";
$ip = getenv("HTTP_CLIENT_IP");
}else if (getenv("HTTP_X_FORWARDED_FOR"))
{
$ip = getenv("HTTP_X_FORWARDED_FOR");
echo "getenvHTTP_X_FORWARDED_FOR";
echo "<br>you are right";
}else if (getenv("REMOTE_ADDR")){
echo "getenvREMOTE_ADDR";
$ip = getenv("REMOTE_ADDR");
}else{
echo "unknow";
$ip = "Unknown";
}
return $ip;
}
echo GetIp();
?>
1.直接访问IP.PHP时,返回getenv REMOTE_ADDR127.0.0.1

2.用NC提交:
GET /1.php HTTP/1.1
Accept: */*
Referer: http://localhost/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; MAXTHON 2.0)
Host: localhost
Connection: Keep-Alive
Cache-Control: no-cache
X-Forwarded-For: 127.0.0.2
Cookie: rtime=0; ltime=1269249140109; cnzz_eid=64110124-1269242429-; language=zh-cn; PHPSESSID=ae9b14609808b4ff4c5811ad1943c529

返回getenvHTTP_X_FORWARDED_FOR127.0.0.2。

伪造X-Forwarded-For成功。

要想提高程序的安全性,不是一个GPC可以解决的,必须提高程序的过滤机制,因为任何的参数提交都是

有害的!

--EOF--

如果上述属实,那就太痛苦了,啥也不能信了。这年头,连X萝卜也靠不住了。

风雪之隅:ini_set memory_limit在safe_mode下不可用

风雪之隅:ini_set memory_limit在safe_mode下不可用

这是风雪之隅的文章,主要是我正好也有类似的情况发生,先介绍完他的事件后,我再贴出我问题吧。

原文地址为:ini_set memory_limit在safe_mode下不可用

内容如下:

如果你ini_set(“memory_limit”, *)返回了false,不妨检查下, 是否开启了安全模式(手册中没有述及)..

一句话, 记录下:在安全模式下不能使用ini_set的指令:

1. max_execution_time
2. memory_limit
3. child_terminate

--EOF--

附:上文说的ini_set的问题,可以查看一下手册的Chapter 9. Runtime Configuration之How to change configuration settings。

风雪之隅的这个问题其实很常见,但却不会影响系统运行,无非是设置返回false了而己,但我说的是set_time_limit(),这个函数事实上也不会在safe_mode里运行,而且如果你开启了error_reporting(7)后,系统好象是直接无法访问【单位的网站就因为这个而导致程序出错】,由于我仅仅加了这一行,所以我在这行下面加上exit()后才发现safe_mode下,无法set_time_limit。其实这就是上面所说的ini_set中不能使用的max_execution_time。但问题是set_time_limit会有出错信息,而ini_set仅仅返回false。。这是两个不同的概念。

因此,如果你的服务器开启了safe_mode,你一定要看手册的这一章节:Functions restricted/disabled by safe mode。否则遇到问题,你会很头疼的。有的服务器喜欢在上传后直接把文件改到某个用户组,甚至改UID,如果这样,那move_upload_files就不能使用了。当然这种情况很少见,只是需要注意一下。

还有一些函数,也不再能够被使用。多看看手册,真好。