hashit.net ("哈"网) ("哈"网)是我目前见过的最好用的视频分享网站,每天在hashit.net ("哈"网)上面可以观看来自各大视频网站的最新视频,更方便的是hashit.net ("哈"网)还提供了视频的下载。如果在某个视频在hashit.net ("哈"网)上没有找到,你自己还可以发布这个视频和朋友们共享,或者以后下载。如果是自己创作的视频内容也可以上传发布到hashit.net ("哈"网),而且不限制视频文件的大小。hashit.net ("哈"网)是我目前见过的最好用的视频分享网站
2007年8月25日星期六
2007年6月19日星期二
2007年6月13日星期三
2007年5月22日星期二
[+/-] |
Zac访谈MatCuttis中关于SEO的一些问题 |
访谈主要围绕中文搜索和搜索引擎优化。Matt Cutts和Google的“顶级中文反垃圾工程师”, Jianfei(朱健飞),回答了我的问题。当然很多问答并不局限于中文搜索和SEO,对所有SEOers都有参考意义。
Matt: 实际上,如果你注册了Google Webmaster Central
http://www.google.com/webmasters/
你也可以用这两个表格报告垃圾
https://www.google.com/webmasters/tools/spamreport?hl=zh-cn
https://www.google.com/webmasters/tools/spamreport?hl=zh-tw
另外,如果你不想注册Google账户,也可以在这里举报spam:
http://www.google.cn/contact/spamreport.html
http://www.google.com.tw/contact/spamreport.html
不过我还是建议用前两个。我们对Webmaster Central的垃圾报告给于更多权重。
Zac: 我们谈谈复制内容,最近很热的话题。
我在中文网站看到更多的内容复制。很多中文站长喜欢从其他网站“采集”内容,有的用软件,有的人工,然后放在自己的网站上。Google是否惩罚这种放满了四处可见的内容的网站?是否有个百分百或门槛,超过了会导致惩罚?
原创者应该怎么做才能确保原创版本被正确辨认?
Jianfei: 我们注意到了一些中文网站有很多复制内容。用户喜欢看到不同的搜索结果,所以Google尽力提供多样的结果。我们的算法已经有了一些清除复制内容的办法,我们会继续寻找改进的方法。
Zac: 有的网站使用多个域名,内容完全一样,比如说domain.com和domain.com.cn 。这样危险吗?最好的处理方法是什么?
Matt: 如果内容真的一样,我会选一个域名,另一个域名做转向到选定域名。比如,google.com 做永久转向 (301) 到 www.google.com,我们会看到并通常会选择转向指向的那个。如果内容是不同的语言(比如中文和英文),那么在两个不同的域名的内容没什么危 险,但是如果内容完全一样,最好从复制域名做永久转向到一个选定域名。
没有转向的镜像网页可以产生问题。最好使用301/永久转向,因为Google也许选择删除或不显示你最喜欢的版本。
Zac: 我一直在我的博客强调好的原创内容,这个观念也被中国的SEOers很好地接受。问题是,正像很多读者问的,比如说,如果我的公司是卖“玻璃磨边机”的,这东西根本就太乏味了,我能写些什么有意思的内容呢?能不能给些这种高度专业化产品内容发展的窍门?
Matt: 别忘了创造性真的会帮很大忙。比如,有个做工业混合机的站,听起来是挺乏味的题目。但是去看看这段视频: http://www.youtube.com/watch?v=aM94aorYVS4 你会看到奇妙的东西。他们把各种物品扔进混合机来证明他们的机器有多厉害。
确实,一些重型机械或工业站点初听之下是比较无聊乏味,但从创造性的角度看的话,你经常能提高对你公司的兴趣。即使像newsletters,博客,行业信息,或其他资源也可以是别人对你的站感兴趣并连向你的原因。
Zac: 我们能找到的PR最高的中文站是PR8。就PR来说对中文站有歧视吗?如果没有,为什么没有PR9甚至PR10的站点?PR对排名还有用吗?
Matt: PageRank确实取决于互联网的链接结构,但我不会因为看不见PR9或PR10的站而灰心。 其一,中文站通常是跟其他中文站比较排名,所以比赛还是公平的。同样很重要的是Google的PageRank有更细的量度(并不是简单的1到10),所 以都显示工具条PR6的两个站可能有不同的PageRank。
Google对非英文站点的权威声望度的测量有特殊处理来帮助。
Zac: 英文网站SEO和中文网站SEO有什么显著区别吗?你们的算法对不同语言处理有不同吗?
Matt: 我觉得不同国家在怎么做SEO方面确实有不同。比如,在德国,人们更可能在域名里用连词符(-)。有的国家更倾向于通过联署计划(affiliate programs)赚钱,有的国家通过手机比信用卡赚的多,因为信用卡不是在每个国家都同样常见。 但是在SEO的操作上也有很多相同点。
Jianfei: 英文网站SEO和中文网站SEO的一个主要区别是要做的搜索词。比如“viagra”是英文里垃圾最多的搜索词之一,“手机铃声”在中文里垃圾更多。另一个区别是差不多所有大中型中文站都有博客,其他语言就不是。
Zac: 其他国家的AdWords用户一般直接在Google注册。不过Google在中国采取了另一种方式,与AdWords代理合作,在某种意义上是本地化的方式,因为中国的所有其他关键词竞价(PPC)提供商都这么做。
与广告商保持直接关系已经在世界范围被证明是成功的,为什么Google在中国采取了本地化的方式?你觉得AdWords在中国成功吗?
Matt: 我不是专家,但我知道Google尝试适应每个市场,以那个国家最有效的方式呈现产品。我为AdWords组感到自豪,我认为他们在中国干的非常好。
Zac: 一些SEO相信新鲜度(freshness)在Google排名中起到很重要作用。很多人认为博客容易得到好的排名,部分得益于新鲜度。但是有的SEO认为经常修改网页不是个好主意。
你的建议是什么?经常更新还是不?
Matt: 这取决于你所在的行业。我会做对用户有益的所有事。为更新网页而更新网页可能效率不会高。但如果你有个博客,经常更新可能吸引更多用户。所以对有些人来说,不太常更新可能更适合(比如生产制造公司),对另一些人经常更新更好(比如你是个博客的话)。
Zac: SEO服务是个可靠的商业模式并值得向中国的SEOers推荐吗?我这么问是因为在中国有规模有声望的SEO公司非常非常少。很多公司声称他们提供SEO服务但实际上他们做的就是在论坛和博客发垃圾。
遵守规则的单独的SEO们正在为生存奋斗。
我相信你们知道很多成功的SEO公司。在中国,SEO行业有前途吗?我们怎么从个人成长为有信誉的SEO公司呢?
Jianfei: 我认为如果SEO按照Google的质量指南的话,他可以有很好的未来。搜索引擎结果对行业很重要,所以对守规矩的公司的市场需求会很多。
Matt: 如果你在考虑用SEO,眼光放长远非常重要。用户突然增加然后Google或其他搜索引擎发现spam并删除网站,这对网站没什么用。可以问问是否有参考客户,或者是否能有SEO提供稳定长期流量的成功故事。
http://www.google.com/support/webmasters/bin/answer.py?answer=35291&hl=cn 是个很好的帮助调查SEO的文件。不幸的是,有些SEO服务,你雇用他们的话,他们会发垃圾,应该从一开始就避免他们。
Zac: 最近很多关于被信任的域名和权威网站的讨论。如果一个站被认为是权威,它会在Google排名高,更多人找到这个站所以带来更多链接,然后它变得就更强。
普通默默无闻的站怎么克服这个情况和权威站竞争呢?除了建一个有很多有用原创内容的好的站点,有什么捷径吗?
Matt: 如果是刚建的普通小站,我不会去尝试热门关键词。把精力集中在一个小的你能被当作专家的利基市场。当你被更多人知道了,你可以从小利基市场往越来越大的领域发展。很多成功的站都是从小站开始,往大发展。而且,你越有创意,越有趣,越有帮助,这常会有助于人们注意到你。
Jianfei: 比如,你的站 http://www.chinamyhosting.com/seoblog/ ,就是这样的站。一年前,这个站没人知道,但通过你的勤劳工作和创造性努力,现在它在搜索[搜索引擎优化排名]时排名很好,这令人印象深刻。
Zac: 你去过中国吗?如果你计划访问中国,这里有成千上万的粉丝想亲眼见到你。
Jianfei: 我在中国出生,去年去了中国两次。我很喜欢与Google中国的同事工作。
Matt: 很遗憾,我没去过中国。我妈妈去过中国几次,包括阳朔(桂林),我太太去过一次,并且虽然他们都是美国人,他们都会说点中文。我得努力争取去那里。我听说中国是个奇妙的国家,我很乐意有一天去访问。
我去不了今年的SES中国大会,但我很高兴Jianfei或另一个Google代表将出席SES中国大会。Jianfei是反垃圾组的顶级成员,在中文反垃圾方面比我要更专家。
Zac: 我每天都在我的博客里看见大量链接垃圾。论坛或博客里的链接垃圾会导致惩罚吗?还是被Google直接忽略因此对排名没影响?
Jianfei: 实际上,发链接垃圾可以变得危险。如果Google发现一个公司在发链接垃圾,这个公司的站可能从索引删除。除非我们再也看不到垃圾链接,Google不 一定会重新收录。在大部分情况下,删除链接比加入链接还难(比如用垃圾软件发在博客和论坛的垃圾),所以还是离链接垃圾远点好。
Matt: 通常,Google会忽略链接垃圾。当我们知道一个公司确实发链接垃圾,我们可能采取适当的行动。
Zac: 另一个在SEO论坛和博客的话题是补充材料。如果一个域名有越来越多的页面进了补充材料,这是否意味着这个域名正在丧失信任?如果你是SEOer而不是Googler,你会担心补充材料吗?
Matt: 我不会担心补充材料。如果你的域名PageRank低,它可能就会进补充材料索引,但这不意味着站点被惩罚或丧失信任。通常只是意味着,如果你能因为你的站点好而得到一些高质量链接,我们会把你的站点的更多页放进主索引。
另外,补充材料更新已经更快,显示给用户的也更多了,所以站长经常看到更多到补充材料页的流量。
Zac: 百度是你们在中国市场的最大竞争者。据说百度在某些搜索技术比如中文分词上比Google更好。
另一方面,Google已经在中国招聘顶级人才。我从一些材料读到Google中国的工程师对核心排名算法还没有很多贡献。你们计划将算法本地化以更适合中文语言吗?与百度相比,你们的技术优势在什么地方?
Jianfei: 不对特定竞争对手置评是我们的政策。我们欢迎有助于向用户提供更多有用信息和选择的竞争。对我们和搜索领域的所有人来说,良好的竞争都是有益的,能使我们更努力,最终结果是,用户获得好处。
Matt: 我们不大谈论我们的排名,因为是机密,但中国分部从几方面对Google怎样排名做了贡献。实际上热榜 http://www.google.cn/rebang/home 这样的出色应用就是在中国首先出现的。这是在中国开发的全新产品。
Zac: 如果你不介意的话,Matt,你是不是如暗示的,是站长世界的GoogleGuy?Google与站长的沟通非常出色,我们很感谢。有没有可能某位Google中国的工程师能起到类似的作用,与中文站长社区积极沟通?
Matt: 我们没有确认过GoogleGuy的正式身份,这没关系,因为如果GoogleGuy需要休息一下,其他人可以进来帮助沟通。事实上我得到了比我应该得到的更多的名誉。英文的沟通其实通过很多人,Vanessa Fox,Adam Lasnik,还有很多很多其他人。
在中文,我很幸运与一组像Jianfei这样的出色团队,还有在Mountain View(美国加州)及北京的其他出色的人一起工作。我想Google将开始与中国站长更多沟通。这个联合访谈就是好的开始。
Zac: 在中国有些争论,SEO在网站总体中起到什么作用?SEO是不是网络营销和电子商务的重要部分?有的网络营销人认为SEO是小菜一碟,写写标题标签,这里那里加些关键词,诸如此类。
你觉不觉得现在的SEO已经深入一步,充当某种网站营销顾问的角色?换句话说,SEOers应该帮助客户优化线上销售流程,目标市场定位,内容发展,用户体验,病毒式营销等。 这是我在尝试推广的观念。最终,用户需要好的网站,不是好的代码。
Matt: 我同意很多时候SEO是创造一个好的网站,不仅仅是把网页设计和代码弄对。SEO包括把标签和代码写对,但那只是第一步。如果你能计划一个出色的病毒式营销活动,或者通过口碑传播让人们谈论你的站点,这也是SEO,而且是比使用垃圾软件好得多的获得链接的方式。
在很多方面,SEO是确保用户有良好体验,因为一个出色的网站会有助于在搜索引擎自然地得到好的排名。
Zac: 你预见SEO在接下来的几年会有大的变化吗?
Matt: 我认为个人化和本地化是大的趋势。如果Google对用户了解多些从而返回不同的搜索结果,那可能对用户来说是搜索质量上很大的改进。那将使SEO更困 难,但关心长久价值的SEO们会对个人化很高兴,因为他们将得到更多对他们的网站感兴趣的流量,这些流量可能会转化为客户。
Jianfei: 当然,Google也将继续关注质量和SEO。假以时日,中国SEO们会发现做符合我们的质量指南的好的网站变得容易了,因为Google会继续努力扫除垃圾。
英文原文在这里
几个参考连接
2007年5月17日星期四
[+/-] |
研究项目质量控制 |
原始链接:http://www.searchina.net.cn/client/quality.asp
新秦的质量控制理念贯穿 了项目的整个过程,从研究设计,项目执行到研究分析报告撰写均建立有系统的质量监控体系:严格执行欧洲市场研究协会(ESOMAR)的有关原则和章程,保 证数据收集的技术质量;专门设立独立的质量控制部,负责对所收集的数据进行复核,保证数据收集的客观质量。
新秦的质量控制体系由网络调查质量控制体系和传统调查质量控制体系两个部分组成。
1、网络调查质量控制体系
A、营销环节(营销部门)
初步了解客户的调查方向,双方达成协议,充分掌握客户的调查目的
要求:明确并充分的了解与掌握客户的调查方向、调查周期、调查条件、样本量和调查统计格式以及所认定的有效样本量的含义、调查费用,如若客户已经制作完毕调查问卷,必须先看到调查问卷,再与其确定其他事项
B、调查实施环节
调查项目由调查实施部门、调查数据分析部门、技术部门人员组成项目小组进行实施
1、 调查问卷设计与修改(调查实施部门)
1) 根据客户的调查方向、目的、内容、调查条件设计调查问卷,对客户已有的调查问卷仔细检查问卷是否有逻辑关系上的错误和错别字或者是遗忘标点
2) 调查问卷可以以普通问卷格式或者网络调查问卷提交给客户确认,
3) 将确认好的调查问卷拆分成为网络调查问卷格式 要求:确保问卷中相关会员属性与公司后台会员属性是否一致,问卷中的逻辑关系正确
2、 调查问卷制作(技术部门)
1) 根据网络调查问卷添加调查问卷题目
2) 根据网络调查问卷逻辑关系与网络调查页面要求制作调查页面
3) 将调查页面提交客户确认,确认完毕后激活问卷,向符合要求会员发送调查邀请 要求:完全按照问卷的样本要求、逻辑关系、对网络页面的要求制作,并在问卷中加入监控问卷回答正确有效的题目
3、 调查数据处理环节(技术部门、调查数据分析部门)
1) 技术部门根据问卷的内容与逻辑关系确认调查结果数据、筛选有效样本
2) 调查数据分析部门再次确认数据的正确性
3) 根据客户的要求与客户对报告的目的进行数据分析 要求:对问卷的监控问题与整体数据进行对比,确保逻辑关系与有效样本筛选的正确
4、 制作调查报告(调查数据分析部门、调查实施部门)
1) 调查数据分析部门向调查报告制作人员提供符合客户要求的数据分析结果
2) 调查报告制作人员根据客户对报告的目的制作调查报告
3) 向客户提交调查数据与调查报告 要求:数据分析与报告制作不能参杂个人的主观意愿,确保真实性
2、传统调查质量控制体系
A、数据采集过程中质量控制
按照项目执行的流程,新秦的对数据采集严格按照公司质控制度进行,以定量研究为例如下:
1. 督导培训
在项目执行前,由项目经理对项目督导进行培训,就问卷进行仔细讲解,并阐述一些项目访问中需要注意的关键地方;
2、访问员培训
通过督导培训后,确认督导对问卷和执行中所有细节都无异议的情况下,由督导对访问员进行培训。所有访问员在进入公司时必须参加由本公司专人负责进行的基础 培训。基础培训将包括市场研究的概念、种类、访问的技巧(如何介绍自己、如何询问、如何记录、如何追问)、抽样原则、访问员的基本素质等。在执行特定项目 访问前,访问员必须接受项目研究人员组织的项目访问培训。
3 模拟访问
通过对访问员正式培训后,需要在访问员间进行模拟访问,使访问员能进一步熟悉问卷,熟练掌握访问技巧;对于访问操作不熟练,不规范的访问员,坚决不予其参与访问。
4. 试访
访问期间,由督导陪访,陪访人数为访问员的100%(每人陪访一次)对存在的问题,现场督导应当及时纠正,并记录总结。同时陪访人员会填写一份陪访报告, 对访问员在试访过程中的具体表现进行量化考核;当天督导要进行总结,第二天访问之前对访问员进行说明。如果出现严重问题或有必要,应召集访问员重新培训, 及时更正存在的问题。为保证访问顺利,陪访不合格的访问员不能参与本项目。
5. 试访总结
项目经理和参与该项目的研究人员会召集所有的访问员进行试访总结,对试访过程中出现问题进行总结,避免在正式访问中再出现类似的问题,保证正式访问的质量。
6、正式访问
正式访问时,现场配置专门的QC人员和问卷复核人员,项目督导负责整个现场的控制,项目研究人员必须到定点抽样监督,发现问题及时纠正,确保数据采集质量。
访问完毕后,访问员应对问卷进行初审,对出现问题、漏问、记录错误等立即进行补问。问卷交回,由执行督导及时进行一审。对一审问卷合格的问卷由另外督导进行二审。
B、数据处理过程中质量控制
在数据复核、编码、数据录入、数据处理过程中公司都有自己的标准化操作流程加以严密规范控制。公司制定严格的警示系统,高度重视数据处理过程,严格尊重事实,禁止数据虚构、修改行为。
其中复核制度如下:
本公司的项目执行和QC工作独立运作,执行督导和QC督导相互合作,但独自承担责任,基本复核要求如下:
复核比例为100%(电话与实地结合)
发现有问题的访问员,抽取全部的问卷进行复查。
对经再次确认的确存在问题的问卷全部作废,并进行补救,以完成有效问卷数量。
复核认可标准:复核到达率为100%,合格率98%以上。
C、研究报告撰写过程中的质量控制
研究报告由富有创新精神和市场洞察力的资深专业研究人员根据客户的需求撰写,力求最精准、最确切的洞悉市场问题,提供富有创新性、建设性策略建议;努力为客户提供增值服务,为客户创造欣喜。在内容和形式上坚持新秦一贯保持的专家、简洁风格!
[+/-] |
一些定律 |
1.250定律
拉德认为:每一位顾客身后,大体有250名亲朋好友。如果您赢得了一位顾客的好感,就意味着赢 得了250个人的好感;反之,如果你得罪了一名顾客,也就意味着得罪了250 名顾客。 在你的网站访客中,一个访客可能可以带来一群访客,任何网站都有起步和发展的过程,这个过程中此定律尤其重要。
2.达维多定律
达 维多认为,一个企业要想在市场上总是占据主导地位,那么就要做到第一个开发出新产品,又第一个淘汰自己的老产品。 国内网站跟风太严重,比如前段时间的格子网,乞讨网,博客网,一个成功了,大家一拥而上。但实际效果是,第一个出名的往往最成功,所以在网站的定位上,要 动自己的脑筋,不是去捡人家剩下的客户。同理,买人家出售的数据来建站效果是很糟糕的。
3.木桶定律
水 桶定律是指,一只水桶能装多少水,完全取决于它最短的那块木板。这就是说任何一个组织都可能面临的一个共同问题,即构成组织的各个部分往往决定了整个组织 的水平。 注意审视自己的网站,是速度最糟糕?美工最糟糕?宣传最糟糕?你首先要做的,不是改进你最强的,而应该是你最薄弱的。
4.马太效应
《新 约》中有这样一个故事,一个国王远行前,交给三个仆人每人一锭银子,吩咐他们:“你们去做生意,等我回来时,再来见我。”国王回来时,第一个仆人说: “主人,你交给我们的一锭银子,我已赚了10锭。”于是国王奖励他10座城邑。第二个仆人报告说:“主人,你给我的一锭银子,我已赚了5锭。” 于是国王例奖励了他5座城邑。第三个仆人报告说:“主人,你给我的一锭银子,我一直包在手巾里存着,我怕丢失,一直没有拿出来。”于是国王命令将第三个仆 人的一锭银子也赏给第一个仆人,并且说:“凡是少的,就连他所有的也要夺过来。凡是多的,还要给他,叫他多多益善。”这就是马太效应。 在同类网站中,马太效应是很明显的。一个出名的社区,比一个新建的社区,更容易吸引到新客户。启示是,如果你无法把网站做大,那么你要做专。作专之后再做 大就更容易。
5.手表定理
手表定理是指一个人有一只表时,可以知道现在是几点钟,而当他同时拥有两只表时却无法确定。
一个网站,你只需要关注你特定的用户群需求。不要在意不相干人的看法。
6.不值得定律
不值得定律:不值得做的事情,就不值得做好 不要过度seo,如果你不是想只做垃圾站。不要把时间浪费在美化再美化页面,优化再优化程序,在你网站能盈利后,这些事情可以交给技术人员完成。
7.彼得原理
劳伦斯.彼得认为:在各种组织中,由于习惯于对在某个等级上称职的人员进行晋升提拔,因而雇员总是趋向于晋升到其不称职的地位。
不要轻易改变自己网站的定位。如博客网想变门户,盛大想做娱乐,大家拭目以待吧。
8.零和游戏原理
当 你看到两位对弈者时,你就可以说他们正在玩“零和游戏”。因为在大多数情况下,总会有一个赢,一个输,如果我们把获胜计算为得1分,而输棋为-1分,那 么,这两人得分之和就是:1+(-1)=0 不要把目光一直盯在你的竞争网站上,不要花太多时间抢它的访客。我们把这些时间用来寻找互补的合作网站,挖掘新访客。
9.华盛顿合作规律
华盛顿合作规律说的是: 一个人敷衍了事,两个人互相推诿, 三个人则永无成事之日。
如果你看准一个方向,你自己干,缺人手就招。不要轻易找同伴一起搞网站,否则你会发现,日子似乎越过越快了,事情越做越慢了。
10.邦尼人力定律
一个人一分钟可以挖一个洞,六十个人一秒种却挖不了一个洞。合作是一个问题,如何合作也是一个问题。你需要有计划。
11.牛蛙效应
把 一只牛蛙放在开水锅里,牛蛙会很快跳出来;但当你把它放在冷水里,它不会跳出来,然后慢慢加热,起初牛蛙出于懒惰,不会有什么动作,当水温高到它无法忍受 的时候,想出来,但已经没有了力气。 如果你是soho,注意关注你的财务。不要等到没钱了再想怎么挣,你会发现那时候挣钱更难。
12.蘑菇管理
蘑菇管理是许多组织对待初出茅庐者的一种管理方法,初学者被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上一头大粪(无端的批评、指责、代人受过),任其自生自灭(得不到必要的指导和提携)。
做网站毕竟要遭遇这样的阶段,搜索引擎不理你,友情链接找不到,访客不上门。这是磨练。
13.奥卡姆剃刀定律
如无必要,勿增实体。
把网站做得简单,再简单,简单到非常实用,而不是花俏。
14.巴莱多定律(Paredo 也叫二八定律)
你所完成的工作里80%的成果,来自于你20%的付出;而80%的付出,只换来20%的成果。
随时衡量你所做的工作,哪些是最有效果的。
原始链接:http://www.thinkjam.org/mercury/archives/2007/04/web_rules-20070406.html
2007年5月14日星期一
2007年5月5日星期六
[+/-] |
web2.0网站如何设计UE/UI |
不应该是局限于web2.0的网站的,只不过在web2.0的圈子里面,大家普遍比较重视用户体验,界面的交互友好性,因此做web2.0的网站推行用户 为中心的设计(User-Centered Design)就容易得多。这些天总有些负责网站界面的设计人员找我咨询,怎么做用户访谈才感觉不像聊天,怎么样让用户参与到设计中来,得到更多的意见而 不是简单的一句还可以或不错之类的评语,原型的改进花费时间总是太长怎么能缩短,设计的时候没什么把握,诸如此类的问题。。我想对此在msn上做的指导大 量重复,需要在这里做一些入门级的解释了。。 Q1:首先,用户为中心的设计环节包括哪些活动? Q2:这样的迭代,什么时候中止,递交给开发呢? Q3: 用户什么时候接触?他们最理想的介入时期是什么时候? Q4..回头再写吧,下班了。。大家有什么问题,可以留言。 一提web2.0,大家的耳朵都竖起来了。那我接着来... Q4:我知道在开发前期的设计工作,要做一些用户研究,问卷调查,用户访谈之类的,到底要研究些什么,出来些什么结果呢? 1.他们的基本特征,比如年龄段分布,性别特征,家庭,行业,电脑经验,上网经验,收入阶层等等。。 2.你需要找到他们中间最典型的人群,需求最强烈的人群是怎样的一个形象。这个在UCD里面叫做角色提炼(Personas setting)。也许为10万个人设计,你什么都靠猜的,没可能满足10万个人的要求。但是你为这一个或者两个角色来设计吧,他们最典型,他们的需求满足好了,你就离成功不远了。 3.用户在使用你的网站到底舒服不,流畅不,主要是看他的操作习惯,行为方式和网站设计的是不是很匹配。你要研究什么,根本就是典型用户的操作习惯,行为方式,最后获得一个用户模型(User Model)。网站要创造出的用户体验,不是用户对你说,我要怎么样怎么样的,也不是设计者自己在那里想,嗯,这么设计比较容易,两步就能完成,一定很好。。两步就一定好么,你的用户很可能就习惯了走某固定的三步来完成,你的两步,很可能让他们满腹狐疑,忧心忡忡了。。 ok,现在你知道了,出来的结果是什么,用户群特点,典型用户的形象即角色(Persona),然后就是用户模型。。 Q5:知道研究什么呢,该怎么开展研究呢? Q6:项目已经进入开发了,做用户研究来不及了啊。 好,今天就到这里咯。有问题请留言,尽量解答。 Iceshow 问到了两个问题,我觉得挺好的,把这几个问题集中解答一下,不能算解答,只是基于我目前的理解和经验吧,让我们继续探索吧。 Q7:你所在的team(UI)是怎样跟一个团队(产品策划,程序员等)沟通合作的,又怎样更好的融入到产品的整个过程中的呢? 这只是其中一部分,在你和产品决策者沟通时,甚至还有市场部门的同事参与,一方面,你要代表用户的利益,另一方面,你要试图了解公司希望创造的商业价值,从中找到一个平衡点。这种设计才最容易获得上层的支持,以最快的速度推行下去。。可以看看偶翻译的用户体验设计师的职责那片文章。 Q8:界面(原型+设计),交互(包括js),测试等都由一个人做吗?如果不是的话,那么对用户体验的研究又怎样能证明自己的作用? 白鸦在blog里面特意的提到我这个系列,标题的web2.0,应该改掉。我倒不想,出于UE知识的普及,这样的标题适合目标用户群--web2.0用户体验实践者,可以抓住他们的眼球。这一群能人帮助只是迅速传播普及。另外在用户体验设计方面,之前3篇完全适用web2.0.. 今天说说web2.0和1.0在用户体验方面的不同之处,但是,这只是我浅薄的理解,希望可以得到各位资深的实践者们的提点。其实以我的积累,应该是远远不够的。 用户体验包括四个因素:品牌,功能,usability和内容。现在大家常常误认为:用户体验=易用性(或者可用性/usability)。其实不然。 web2.0最不缺的是功能,每一个创业者都是认为自己发现了用户的某一种需求,而市场上没有任何产品可以去满足,因此觉得自己可以开发出具备某些功能的 2.0产品。。这方面,不多说什么,只是说一点,细分用户群,必定会成为竞争趋势。。仔细研究了用户群,深入挖掘他们的特点和需求,在最开始就做到高的粘 着力,是否更好了? 在品牌上,很多人对这一点的忽略,导致了用户体验的整个盲目。现在我问你,sina,sohu和网易,有什么差别?普通用户可不清楚,都是门户网站。。好 像网易开发游戏,sohu还开发了搜索,sina,好像经常做赞助活动。。这就是品牌么?现在问你Nokia和Moto有什么差别?你能回答吧。。品牌和 用户体验的关系,是互相影响的。。你用Nokia,发现它简单朴实,好用,还抗摔。就是样子有点。。那么nokia的品牌形象排除了价格因素后就是这样, 简单朴实好用机身抗摔,样子一般了点。。现在如果有人推荐你,某个品牌,它是如何的有趣个性时尚,然后你一使用,发现:切,哪点特别的,跟Nokia差不 多,还不如买Nokia。。失败了吧,因为品牌没有独特的个性,带来的用户体验期望值和现实落差,将会让你的目标用户转头而去。。网易相册和其他的相册, 有什么差别。。和flikr反正是大大的不同。。 在内容上面。虽然说,web2.0是用户参与,很多网站的内容都是用户来建设。。但是在用户参与之前,你要想,用户为什么要参与。。只因为我没有日记本, 你给我一个日记本,我就一定要用你给的这个来写么?用户是否参与,参与程度多少,这些都取决于你现在的内容。。你现在是空的。。鬼知道你这个网站是不是快 黄了,我干吗要在这写啊。。你现在很多,但是都是转载的,没几个用户在写。。骗我么?我写了根本就没有几个人看。。好,现在你的内容很多,用户也开始很多 了。。但是,天啦,这些内容也未免太广告性了吧。。。或者,用户想,我写了你会不会到处转载啊。。你们这的用户素质怎么样啊。。。而且,形式上,你的品 牌,说一点关联性,品牌你标语说时尚个性,网站样子看上去土拉吧唧的,马上用户的信任度就降低了。。 Usability,网站当然要好用了,很迅速的完成内容提交,或者找到目标内容,这是当然的。。但是不是随便一个你觉得交互方式很流畅的网站,都可以完 全拷贝复制。幸亏世界如此丰富,不然我们做交互设计的,就跟做数学公式一样了,多没意思,一个套路。。不同的用户,习惯不同的交互方式,他们喜欢什么样子 的,这便是用户研究里面要做的一部分工作。。这样的研究结果,帮助你的交互设计具备了自己的个性。。usability测试的结果,是要知道你的目标用户 群的看法,发现的问题,而不是科学研究,三步如何变成两步。
答案:设计--〉原型--〉测试--〉再改进设计--〉原型--〉测试 --〉。。。看出来了吧,这是个迭代过程。。。你的设计没有把握,那么使用测试来验证,发现问题,再快速改进。。
答案:没有完美的设计的,递交给开发前,保证你的设计没有一级易用性问题。否则上线的产品用户骂声一片。。但是还有一些小的bug好改 的都改掉,不能改的下一版本吧。什么时候中止,那要看口袋里的钱,还剩的时间和人力等资源限制咯。看得出来吧,这里面肯定有很多的Tradeoff(妥 协)的,做UE的和做开发的一定要搞好关系哦,这样,可以多改掉几个bug
答案:作为UE/UI要记得,永远和用户保持紧密联系。不管项目进展到什么时刻,你都要思考,用户要干嘛,喜欢怎么干,这样的设计他们会不会觉得舒服流畅。要验证答案,那就赶紧去接触他们吧。
答案:在设计之前,你要明白的一件事情就是,为谁而设计。围绕这个谁,你需要回答:
答案:用户研究的方法可以很灵活的,常常见到类似聊天一样的,一个问,一个来答,叫用户访谈。还有一些方法,比如问卷调查,焦点小组,数据分析等等。。根据不用的研究内容,还有时间,技术,成本来决定。。
至于怎么研究,一个前提就是,目的性明确。不管你做访谈也好,问卷也好,漫无目的,只会让你对这些形式的有效性产生怀疑。。比如问卷,设计多少个问题,设计哪些问题,你要规划好了。。问卷设计哪几个纬度,每个纬度需要几个问题可以得到结果,什么样的量表合适。。
答案:嗬嗬,来得及来得及,只是要让你的第一批用户多多忍耐了。UCD是迭代过程嘛,已经开发了,你就研究着,准备对第一版本的产品进行测试评估和改进吧。。慢慢来,一个一个的改。
答:经历过很多种不同的Team,他们处在不同的位置上,常常承担的责任也不一样,因此作事情的方式也完全不一样了。UE在整个产品开 发过程中的位置把握准确,相当的重要。关于位置怎么最合适,日后我再专门阐述。目前接触到较理想的工作方式,如何沟通合作,是和产品设计决策者一起工作, 将你获得的研究或者评估结果,直接变成设计或建议,传递给产品设计决策者,判断问题的重要性,有哪几种可行的方案,如何改最合适,你们一起探讨。常常,在 研究方案是否可行时,你需要跟程序员沟通,提出你的想法,询问是否能实现,实现难度,大致的时间。这样能够保证你方案的可快速执行。这存在很多的沟通技 巧。最好的情况就是你,UE人员,要把以用户为中心的思想灌输给他,让他进入你设定的情景,站在你的立场去考虑问题,这样程序员会增加工作的责任感,他甚 至可能发挥主观能动性,帮你想到更好的实现方法。。。这样的一种氛围中,整个的团队就像一根绳子往一个方向使劲,都全力想让产品做好,想想,那样的工作多 让人充满激情吧。
答:这些工作我都做过,一个人做这种情况其实非常的常见。但是一个人,并不理想,最好,还是培养一个团队。而且有些工作,一个人做不了,必须有协助。这主要看公司的不同状况了。如果是一个人,评估用户体验研究的效果,就可以对你的成绩进行评判了。
如何是一个Team,是好几个人协作完成,如何证明每一部份的工作成效?iceshow是问这个吧。
老实说,我对这个问题没有把握。因为UE的日常工作就是设计-原型-测试评估,是完整的流程,对工作的评估,只能考核整个流程下来的结果。单独一部份工作做得如何,我还没有研究过。
[+/-] |
UI手册 |
An effective User Manual should help you:
-Gather information while reading
-Use the product successfully
An effective User Manual should have these attributes:
-Neatness
-Clarity and precision
-Consistency
-Zero defects
整洁(Neatness)
No one likes to read a badly formatted document.
The following makes up a good looking document:
-Good font-type and size
-Pleasant color
-Alignment
-Error free language
Some tips to keep your User Manual neat:
-Maintain one font-type acoss the User Manual.
-Set the Font Size to 14pts for the heading, and 12pts for the body text.
-Use fewer colors
-Never centre align the text/image. Keep it justified.
-Make sure error free in the sense.
More reference: http://business-writing.proof-reading.com/?p=20
清晰准确(Clarity and Precision)
To write good instructions:
-Keep your instructions short.
-Use the right terminology/word
-Bold the names of buttons/tabs/windows
-Number all actions but NOT expected results
-Specify both the action and the expected result
-Don't miss out on steps
一致性(Consistency)
Consistency is one thing which most people ignore while writing.
Voluminous User Manual written without consistency get the audience confused with 100% chance.
To maintain consistency:
-Make sure you write the names of buttons/tabs/windows exactly the way it appears in the product.
-Watch out for caseing issueshttp://www.blogger.com/img/gl.link.gif
-Maintain one instruction structure for similar action.
Good reference link:http://www.ebstc.org/TechLit/plainall.html
零失误(Zero defects)
The key to an error free User Manual is continously review.
The best way to check your instructions is to read them yourself and perform the actions on the product.
It is always good to have a model while writting.(tone, text, terminology) This will help you stylize your User Manual in the right way. Microsoft products are good examples.
Checkpoint:
-Grammatical errors
-Casing issues
-Wrongly written instructions
-Bad formatting
-Wrong alignment
To chinese text, the spell, structure consistency, are especially important.
Recommendation: http://www.netbeans.org/kb/55/loanprocessing.html - Make sure you visit this!
[+/-] |
用户特征(User characteristics) |
Psychological and social characteristics
– Do cognitive abilities influence ease of operation?
– Do knowledge, experience and habit influence ease of operation?
– Do cultural differences influence ease of operation?
– Does literacy influence ease of operation?
– Does language influence ease of operation?
· Physical and sensory
– Are body dimensions relevant for ease of operation?
– Are strength and biomechanical abilities relevant?
– Are visual abilities relevant for ease of operation?
– Are auditory abilities relevant for the ease of operation?
– Does handedness influence the ease of operation?
· Categories
– Does age influence the ease of operation?
– Does gender influence ease of operation?
[+/-] |
UI/UX开发过程 |
Planning: brainstorming
Research: technology, design issues, strategies
Analysis: user profiles, use scenarios, prototypes
Design: content, applications, branding, storyselling
Implementation: scripting, coding, final production
Evaluation: focus groups, user tests, heuristic evals.
Documentation: guidelines, patterns, specifications
Training: courseware, tutorials, mentoring
Maintenance: continuing client relations
[+/-] |
UI的构成 |
Metaphors(隐谕): Clear concepts via words, images,sounds, music
Mental Models(心智模型): Easy assimilation of data,functions, tasks, and roles at work, play, on the way
Navigation(导航): Efficient movement in menus, windows
Interaction(交互): Effective input/output, feedback
Appearance(外观): Quality perceptual characteristics
2007年4月21日星期六
[+/-] |
沉默的螺旋 |
沉默的螺旋是一个政治学和大众传播理论,由 Elisabeth Noelle-Neumann 在 The Spiral of Silence: Public Opinion -- Our Social Skin 中提出。沉默的螺旋理论指出,如果一个人感觉到他的意见是少数的,他比较不会表达出来,因为害怕被多数的一方报复或孤立。
由于我们只能直接观察整个公众群体中的一小部分(经常是通过媒体),媒体就在决定什么是社会主流意见中占据重要地位。随着主流意见在媒体上占据了与其相称的比例,持少数意见的人表达自己观点的可能性逐渐降低。相反地,如果一个人感到自己的立场正在为公众所接受,他就会变得更加勇于表达自己。
这一理论假设人们总是在判断什么是公众的观点,而且他们经常通过媒体来判断。理论同时假设我们有一种与生俱来的对被孤立的恐惧,而且我们知道什么观点可以导致我们被主流群体孤立。这一理论也解释了为什么社会上还总有那样的敢于提出不同意见的少数群体,因为社会上总还是有一些人对被孤立没有那么强烈的恐惧,这些人可以被成为社会观点的挑战者。理论进一步提出少数派是社会进步的必要条件,而服从的多数派则是社会稳定的必要条件,因此两者都是进化的产物。
通过引入所谓“魔鬼代言人”(the devil's advocate)机制,可以减少“沉默的螺旋”的影响。这一位置由团体内的某个特定成员担当,这一机制将允许团体成员自由地表达意见,而不必担心可能导致的谴责,从而在整体上创造一个更加有建设性的氛围。
2007年4月1日星期日
[+/-] |
PHP和正则表达式 |
原作者:Mitchell Harper 翻译:iwind
原文:http://www.devarticles.com/c/a/PHP/PHP-and-Regular-Expressions-101
一个正则表达式是一个特定的格式化模式,可以用来找出一个字符串在另一个字符串中的使用情况。几个编程语言,包括Visual Basic,Perl,JavaScript和PHP都支持正则表达式,希望在这篇入门指导的结束,Mitchell(作者自己)可以让你在PHP程序中能应用一些基本的正则表达式。正则表达式是在各种各样的程序语言中突出的古怪特征中的一种,但是由于它们看起来是很难的一个概念,所以很多开发者就把它们放到了角落里,忘记了它们的存在。
让我们先来看看什么是正则表达式,为什么你要在PHP程序中用到它们。
什么是正则表达式?
你对从一个不错的老的基于控制的文本编辑器中分离出像BBEdit和notepad的程序,有什么看法呢?两个都支持文本输入,可以让你保存文本到文件中,但是现在的文本编辑器也支持其它功能,包括查找–代替工具,这让编辑一个文本文件相当容易。
正则表达式也是相似的,只是更好一些。正则表达式可以被认为一个极其高级的查找-替换工具,让我们从痛苦中摆脱出来:不必再写定制的数据确认例子来检查电子邮件地址或者来确认电话号码的格式是正确的,如此等等。
任何程序中最普通的函数之一就是数据有效性检查,PHP捆绑了一些文本检查函数,允许我们用正则表达式匹配一个字符串,确认有一个空格,有一个问号,等等。
你不知道的可能是,正则表达式可以简单装备吗,当你掌握了一些正则表达式时(这个正则表达式可以用来告诉正则表达式引擎一个字符串中我们想要匹配的部分),你会自问为什么会把正则表达式扔到角落里这么久,^_^。
PHP 有两套函数,用来处理两种类型的正则表达式:Perl5兼容模式,和Posix标准兼容模式。在这篇文章中我们将看看ereg函数,用遵照Posix标准的搜索表达式工作。虽然它们并没有Perl5模式那样强大,但是一种不错的学习正则表达式的方法。如果你对PHP支持的Perl5兼容正则表达式感兴趣,可以到PHP.net网站找一些关于preg函数的细节。
PHP有六个函数来处理正则表达式,它们都把一个正则表达式作为它们的第一个参数,列出如下:
ereg: 最常用的正则表达式函数, ereg 允许我们搜索跟一个正则表达式匹配的一个字符串.
ereg_replace: 允许我们搜索跟正则表达式匹配的一个字符串,并用新的字符串代替所有这个表达式出现的地方。
eregi: 和ereg几乎是一样效果,不过忽略大小写。
eregi_replace: 和ereg_replace有着一样的搜索-替换功能,不过忽略大小写.
split: 允许我们搜索和正则表达式匹配的字符串,并且以字符串集合的方式返回匹配结果.
spliti: split函数忽略大小写的版本.
为什么使用正则表达式?
如果你不断地建立不同的函数来检查或者操作字符串的一部分,现在你可能要放弃所有的这些函数,取而代之的用正则表达式。如果你对下列的问题都答“是的”,那么你肯定要考虑使用正则表达式了:
你是否正在写一些定制的函数来检查表单数据(比如在电子信箱地址中的一个@,一个点)?
你是否写一些定制的函数,在一个字符串中循环每个字符,如果这个字符匹配了一个特定特征(比如它是大写的,或者它是一个空格),那么就替换它?
除了是令人不舒服的字符串检查和操作方法,如果没有有效率地写代码,上述的两条也会使你的程序慢下来。你是否更倾向于用下面的代码检查一个电子信箱地址呢:
function validateEmail($email)
{
$hasAtSymbol = strpos($email, "@");
$hasDot = strpos($email, ".");
if($hasAtSymbol && $hasDot)
return true;
else
return false;
}
echo validateEmail("mitchell@devarticles.com");
?>
... 或者使用下面的代码:
function validateEmail($email)
{
return ereg("^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$", $email);
}
echo validateEmail("mitchell@devarticles.com");
?>
可以肯定的是,第一个函数比较容易,而且看起来结构也不错。但是如果我们用上面的下一个版本的email地址检查函数不是更容易吗?
上面展示的第二个函数只用了正则表达式,包括了对ereg函数的一个调用。Ereg 函数返回true或者false,来声明它的字符串参数是否和正则表达式相匹配。
很多编程者避开正则表达式,只因为它们(在一些情况下)比其它的文本处理方法更慢。正则表达式可能慢的原因是因为它们涉及把字符串在内存中拷贝和粘贴,因为正则表达式的每一个新的部分都对应匹配一个字符串。但是,从我对正则表达式的经验来说,除非你在文本中几百个行运行一个复杂的正则表达式,否则性能上的缺陷都可以忽略不计,当把正则表达式作为输入数据检查工具时,也很少出现这种情况。
正则表达式语法
在你可以匹配一个字符串到正则表达式之前,你必须先建立正则表达式。开始的时候,正则表达式的语法有点古怪,表达式中的每一个短语代表某个类型的搜索特征。下列是一些最普通的正则表达式,也都对应着一个如何使用它的例子:
字符串头部
搜索一个字符串的头部,用^,例如
将返回 true, 但是
将返回 false, 因为hello不在字符串”I say hello world”的头部。
字符串尾部
搜索字符串尾部,用$,例如:
将返回true, 但是
将返回 false,因为bye不在字符串”goodbye my friend”的尾部.
任意的单个字符
搜索任意字符,用点(.),例如:
将返回true,但是
将返回false,因为我们的要搜索字符串没有包含字符。你可以用花括号随意告诉正则表达式引擎它要匹配多少个单个字符。如果我只想匹配5个字符,我可以这样用ereg:
上面的这段代码告诉正则表达式引擎当且仅当至少5个连续的字符出现字符串的尾部时返回true.我们也可以限制连续出现的字符的数目:
在上面的例子里,我们已经告诉正则表达式引擎,我们的搜索字符串来匹配表达式,它在尾部必须有介于1和3个的”a”字符。
上面的例子将不会返回true,虽然有三个”a”字符在搜索字符串里,但是它们不是在字符串的尾部。如果我们把结尾字符串匹配$从正则表达式中去掉,那么这个字符串是匹配的。
我们也可以告诉正则表达式引擎来匹配至少有确定数目的字符在一行,如果它们存在的,可以匹配更多。 我们可以这样做:
零或多次重复字符
为了告诉正则表达式引擎一个字符可能存在,也可以重复,我们用*字符。这里的两个例子都将返回true.
即使第二个例子不包含”t”这个字符,但仍旧返回ture,因为*表示字符可以出现,但不是必须出现。事实上,任何普通的字符串模式都会使上面的ereg调用返回true,因为’t’字符是可选的.
一或多次重复字符
为了告诉正则表达式引擎一个字符必须存在,也可以重复不止一次,我们用+字符,像
下面的例子也会返回true:
零或一次重复字符
我们也可以告诉正则表达式引擎,一个字符必须是或者只存在一次,或者没有。我们用?字符来做这项工作,就像
如果我们愿意,我们完全可以从上面的搜索字符串中删除’c’,这个表达式会仍旧返回true.’?’ 的意思是一个’c’可以出现在搜索字符串的任何地方,但不是必须的。
正则表达式语法 (续)
空格字符
为了匹配一个搜索字符串中的空格字符,我们用预定义Posix的类,[[:space]].方括号标明连续字符的相关性,”:space:”是实际要匹配的类(在这种情形下,是任何空白字符)。空白包括tab字符,新行字符,空白字符。或者,如果搜索字符串必须包含只有一个空格,而不是一个tab或者新行字符,你可以用一个空格字符(" ")。在大多数情况下,我倾向于使用":space:",因为这意味着我的意图不仅仅是单个空格字符,这点很容易被忽视。这里有一些Posix-标准预定义类,
有一些我们可以作为正则表达式的部分的一些Posix-标准预定义类,包括[:alnum:], [:digit:], [:lower:]等等。 完整的列表可以在这里查看
我们可以像这样匹配单个空白字符:
我们也可以通过在表达式后用?字符来告诉正则表达式引擎匹配没有空白或者一个空白。
模式分组
相关的模式可以在方括号里分在一起。很容易用[a-z]和[A-Z]指定只有一个小写字母或者一列大写字母以搜索字符串的一部分存在。
// 要求从第一个到最后一个都是小写字母
echo ereg("^[a-z]+$", "johndoe"); // 返回true
?>
或者像
// 要求从第一个到最后一个都是大写字母
ereg("^[A-Z]+$", "JOHNDOE"); // 返回 true?
?>
我们也可以告诉正则表达式引擎,我们希望或者是小写字母,或者是大写字母。我们只要把[a-z]和[A-Z]模式结合在一起就可以做到。
在上面的例子里,如果我们能匹配"John Doe",而不是"JohnDoe",将是非常有意义的。我们用下面的正则表达式来做这个:
^[a-zA-Z]+[[:space:]]{1}[a-zA-Z]+$
很容易搜索一个数字字符串
词语分组
不仅仅搜索模式可以分组,我们也可以用圆括号把相关的搜索词语进行分组。
在上面的例子中,我们有一个字符串头部字符,紧跟着"John"或者"Jane",至少有一个其它字符,然后一个字符串尾部字符。所以…
...将也匹配我们的搜索模式
特殊字符的情形
因为一些字符要用在一个搜索模式的明确分组或者语法上,像在(John|Jane)中的圆括号,我们需要告诉正则表达式引擎来屏蔽这些字符,加工它们使之成为被搜索字符串的一部分,而不是搜索表达式的一部分。我们所用的方法称为“字符转义”,涉及到将任何“专用符号”加上反斜杠。所以,例如,如果我想在我的搜索中包含’|’,那么我就可以这样做
这里只是少量的一些你要转义的字符,你必须转义^, $, (, ), ., [, |, *, ?, +, \ and { 。
希望你现在对正则表达式实际上有多么强大有了一点点感觉了。现在让我们看两个用正则表达式来检查数据中一个字符串的例子。
正则表达式例子
例子1
让我们把第一个例子做的相当简单,检验一个标准的URL.一个标准的URL(没有端口号),有三个部分构成:
[协议]://[域名]
让我们从匹配URL的协议部分开始,并且让它只能用http或者ftp.我们可以用下面的正则表达式做到这点:
^(http|ftp)
^字符特指字符串的头部,利用圆括号把http和ftp围住,且用“或者”符号(|)将它们分开,我们告诉正则表达式引擎http和ftp两者之一必须在字符串的开头。
一个域名通常由www.somesite.com构成,但是可以随意选择要不要www部分。为了例子简单,我们只允许.com,.net,和.org的域名是在考虑之中的。我们最好这样对正则表达式中的域名部分表示如下:
(www\.)?.+\.(com|net|org)$
把所有的东西放在一起,我们的正则表达式就可以用作检查一个域名,如:
function isValidDomain($domainName)
{
return ereg("^(http|ftp)://(www\.)?.+\.(com|net|org)$", $domainName);
}
//真(true)
echo isValidDomain("http://www.somesite.com");
//真(true)
echo isValidDomain("ftp://somesite.com");
//假 (false)
echo isValidDomain("ftp://www.somesite.fr");
//假 (false)
echo isValidDomain("www.somesite.com");
?>
例子二
因为我居住在澳大利亚悉尼,让我们检查一个典型的澳大利亚国际电话号码。澳大利亚国际电话号码的格式如下:
+61x xxxx-xxxx
第一个x是区号,其它的都是电话号码。检查以'+61'开头且紧跟一个在2到9之间的区号的电话号码,我们用下面的正则表达式:
^\+61[2-9][[:space:]]
注意,上面的搜索模式把'+'字符用'\'转义,以便于可以在搜索中包含,不至于被解释为一个正则表达式。[2-9]告诉正则表达式引擎我们需要包含一个2到9之间的数字。[[:space:]]类则告诉正则表达式期望在这里有一个空白。
这里是电话号码剩下的搜索模式:
[0-9]{4}-[0-9]{4}$
这里没有什么不寻常的地方,我们只是告诉正则表达式引擎电话号码可用的数字,它必须是4个数字的组合,跟着一个连接符,再跟着另一个4个数字的组合,然后一个字符串尾部字符。
把完整的正则表达式放在一起,放进一个函数,我们可以用代码来检查一些澳大利亚国际电话号码:
function isValidPhone($phoneNum)
{
echo ereg("^\+61[2-9][[:space:]][0-9]{4}-[0-9]{4}$", $phoneNum);
}
// 真(true)
echo isValidPhone("+619 0000-0000");
// 假(false)
echo isValidPhone("+61 00000000");
//假( false)
echo isValidPhone("+611 00000000");
?>
总结
正则表达式用一些不适合书写和重复的代码来检查一个字符串。在最后的几页里,我们已经讲解了所有的Posix标准正则表达式的基础,包括字符,分组和PHP ereg函数。我们也知道了怎么用正则表达式来检查一些PHP中简单的字符串。
2007年3月30日星期五
2007年3月28日星期三
[+/-] |
PHP服务器变量 |
- “PHP_SELF”
-
当前正在执行脚本的文件名,与 document root 相关。举例来说,在 URL 地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名。
如果 PHP 以命令行方式运行,该变量在 PHP 4.3.0 之前无效。
- “argv”
-
传递给该脚本的参数。当脚本运行在命令行方式时,argv 变量传递给程序 C 语言样式的命令行参数。当调用 GET 方法时,该变量包含请求的数据。
- “argc”
-
包含传递给程序的命令行参数的个数(如果运行在命令行模式)。
- “GATEWAY_INTERFACE”
-
服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。
- “SERVER_NAME”
-
当前运行脚本所在服务器主机的名称。如果该脚本运行在一个虚拟主机上,该名称是由那个虚拟主机所设置的值决定。
- “SERVER_SOFTWARE”
-
服务器标识的字串,在响应请求时的头信息中给出。
- “SERVER_PROTOCOL”
-
请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。
- “REQUEST_METHOD”
-
访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。
注: 如果请求的方式是 HEAD,PHP 脚本将在送出头信息后中止(这意味着在产生任何输出后,不再有输出缓冲)。
- “REQUEST_TIME”
-
请求开始时的时间戳。从 PHP 5.1.0 起有效。
- “QUERY_STRING”
-
查询(query)的字符串(URL 中第一个问号 ? 之后的内容)。
- “DOCUMENT_ROOT”
-
当前运行脚本所在的文档根目录。在服务器配置文件中定义。
- “HTTP_ACCEPT”
-
当前请求的 Accept: 头信息的内容。
- “HTTP_ACCEPT_CHARSET”
-
当前请求的 Accept-Charset: 头信息的内容。例如:“iso-8859-1,*,utf-8”。
- “HTTP_ACCEPT_ENCODING”
-
当前请求的 Accept-Encoding: 头信息的内容。例如:“gzip”。
- “HTTP_ACCEPT_LANGUAGE”
-
当前请求的 Accept-Language: 头信息的内容。例如:“en”。
- “HTTP_CONNECTION”
-
当前请求的 Connection: 头信息的内容。例如:“Keep-Alive”。
- “HTTP_HOST”
-
当前请求的 Host: 头信息的内容。
- “HTTP_REFERER”
-
链接到当前页面的前一页面的 URL 地址。不是所有的用户代理(浏览器)都会设置这个变量,而且有的还可以手工修改 HTTP_REFERER。因此,这个变量不总是真实正确的。
- “HTTP_USER_AGENT”
-
当前请求的 User-Agent: 头信息的内容。该字符串表明了访问该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。也可以使用 get_browser()得到此信息。
- “HTTPS”
-
如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
- “REMOTE_ADDR”
-
正在浏览当前页面用户的 IP 地址。
- “REMOTE_HOST”
-
正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR。
注: 必须配置 Web 服务器来建立此变量。例如 Apache 需要在 httpd.conf 中有 HostnameLookups On。参见 gethostbyaddr()。
- “REMOTE_PORT”
-
用户连接到服务器时所使用的端口。
- “SCRIPT_FILENAME”
-
当前执行脚本的绝对路径名。
注: 如果脚本在 CLI 中被执行,作为相对路径,例如 file.php 或 ../file.php,$_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。
- “SERVER_ADMIN”
-
该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。
- “SERVER_PORT”
-
服务器所使用的端口。默认为“80”。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
- “SERVER_SIGNATURE”
-
包含服务器版本和虚拟主机名的字符串。
- “PATH_TRANSLATED”
-
当前脚本所在文件系统(不是文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
注: PHP 4.3.2 之后,PATH_TRANSLATED 在 Apache 2 SAPI 模式下不再和 Apache 1 一样隐含赋值,而是若 Apache 不生成此值,PHP 便自己生成并将其值放入 SCRIPT_FILENAME 服务器常量中。这个修改遵守了 CGI 规范,PATH_TRANSLATED 仅在 PATH_INFO 被定义的条件下才存在。
Apache 2 用户可以使用 httpd.conf 中的 AcceptPathInfo On 来定义 PATH_INFO。
- “SCRIPT_NAME”
-
包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名(例如包含文件)。
- “REQUEST_URI”
-
访问此页面所需的 URI。例如,“/index.html”。
- “PHP_AUTH_DIGEST”
-
当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的“Authorization”HTTP 头内容(以便作进一步的认证操作)。
- “PHP_AUTH_USER”
-
当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
- “PHP_AUTH_PW”
-
当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
- “AUTH_TYPE”
-
当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。
2007年3月27日星期二
[+/-] |
使用MaxMind 根据IP地址对访问者定位 |
有时你需要知道你的站点访问者来自哪个国家——比如如果你正打算执行针对地理区域的广告计划。本文将对此方法进行介绍。 有时你需要知道你的站点访问者来自哪个国家——比如如果你正打算执行针对地理区域的广告计划。这正是象MaxMind's GeoIP一类的工具大显身手的地方——它可以让你从访问者的IP地址轻松获取其确切的地理位置信息。 MaxMind提供了商业数据库和免费数据 库。前者更为精确,精度可以达使用者所在城市信息一级,而后者则只能确定国家和地区。在本文中,我们将演示免费版的使用方法。如果你需要更多详细信息,比 如远程客户的城市以及国家信息,你需要从MaxMind:http://www.maxmind.com购买更详细的数据库。 起步 要使用此软件,你必须首先下载GeoIP免费国家信息文件:http://www.maxmind.com/app/geoip_country 并将其存放于Web服务器的某个目录中。然后你需要选择数据库文件所使用的语言API。为简化整个过程,我们将使用纯粹的PHP版本以避免其他额外的配置 或设置Apache组件。请记住在安装软件到Web站点前阅读软件许可证条款:http: //www.maxmind.com/download/geoip/database/LICENSE.txt以确保你同意这些条款。 代码列表A // include functions include("geoip.inc"); // read GeoIP database $handle = geoip_open("GeoIP.dat", GEOIP_STANDARD); // map IP to country echo "IP address 62.149.130.132 located in " . geoip_country_name_by_addr($handle, "62.149.130.132") . " (country code " . geoip_country_code_by_addr($handle, "62.149.130.132") . ")"; // close database handler geoip_close($handle); // print compulsory license notice echo " -- This product includes GeoIP data created by MaxMind, available from http://maxmind.com/ --"; ?> 列表A中的代码显示了使用模块(geoip.inc)以访问GeoIP免费国家信息数据库(GeoIP.dat)的基本方法。示例假设PHP include和国家家信息数据库文件都在与PHP文件本身相同的目录中。如果示例与你的安装不同,则需要根据需要改变路径。 示例代码相当明了,在引入GeoIP PHP函数库后,第一步即使用geoip_open()函数打开GeoIP数据库文件。此函数接收两个参数:数据库文件路径和数据库类型。 我们然后使用由调用geoip_open()返回的句柄,由此根据所给的IP地址以获取两字母的国家代码及直观的国家名称。其中还要分别借助函数 geoip_country_code_by_addr()和geoip_country_code_by_name()。二者都接收两个参数:由 geoip_open()返回的句柄以及需要解析的IP地址。 一旦获得所需信息,我们通过调用geoip_close()关闭数据库文件。
// www.knowsky.com
[+/-] |
正则表达式中的特殊字符 |
字符 描述
\
将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\' 匹配 "" 而 "\(" 则匹配 "("。
^
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
*
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n}
n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}
n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
?
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
.
匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern)
匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 {CONTENT}… 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern)
正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)
负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y
匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz]
字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz]
负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z]
字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B
匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx
匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d
匹配一个数字字符。等价于 [0-9]。
\D
匹配一个非数字字符。等价于 [^0-9]。
\f
匹配一个换页符。等价于 \x0c 和 \cL。
\n
匹配一个换行符。等价于 \x0a 和 \cJ。
\r
匹配一个回车符。等价于 \x0d 和 \cM。
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t
匹配一个制表符。等价于 \x09 和 \cI。
\v
匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W
匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn
匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num
匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)' 匹配两个连续的相同字符。
\n
标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm
标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml
如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un
匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (?)。
2007年3月19日星期一
[+/-] |
判定mine类型的东西 |
$filetype=array();
$filetype['hqx']="application/mac-binhex40";
$filetype['bin']="application/octet-stream";
$filetype['oda']="application/oda";
$filetype['pdf']="application/pdf";
$filetype['ai']="application/postsrcipt";
$filetype['eps']="application/postsrcipt";
$filetype['es']="application/postsrcipt";
$filetype['rtf']="application/rtf";
$filetype['mif']="application/x-mif";
$filetype['csh']="application/x-csh";
$filetype['dvi']="application/x-dvi";
$filetype['hdf']="application/x-hdf";
$filetype['nc']="application/x-netcdf";
$filetype['cdf']="application/x-netcdf";
$filetype['latex']="application/x-latex";
$filetype['ts']="application/x-troll-ts";
$filetype['src']="application/x-wais-source";
$filetype['zip']="application/zip";
$filetype['bcpio']="application/x-bcpio";
$filetype['cpio']="application/x-cpio";
$filetype['gtar']="application/x-gtar";
$filetype['shar']="application/x-shar";
$filetype['sv4cpio']="application/x-sv4cpio";
$filetype['sv4crc']="application/x-sv4crc";
$filetype['tar']="application/x-tar";
$filetype['ustar']="application/x-ustar";
$filetype['man']="application/x-troff-man";
$filetype['sh']="application/x-sh";
$filetype['tcl']="application/x-tcl";
$filetype['tex']="application/x-tex";
$filetype['texi']="application/x-texinfo";
$filetype['texinfo']="application/x-texinfo";
$filetype['t']="application/x-troff";
$filetype['tr']="application/x-troff";
$filetype['roff']="application/x-troff";
$filetype['shar']="application/x-shar";
$filetype['me']="application/x-troll-me";
$filetype['ts']="application/x-troll-ts";
$filetype['gif']="image/gif";
$filetype['jpeg']="image/pjpeg";
$filetype['jpg']=array("image/pjpeg","image/jpeg");
$filetype['jpe']="image/pjpeg";
$filetype['ras']="image/x-cmu-raster";
$filetype['pbm']="image/x-portable-bitmap";
$filetype['ppm']="image/x-portable-pixmap";
$filetype['xbm']="image/x-xbitmap";
$filetype['xwd']="image/x-xwindowdump";
$filetype['ief']="image/ief";
$filetype['tif']="image/tiff";
$filetype['tiff']="image/tiff";
$filetype['pnm']="image/x-portable-anymap";
$filetype['pgm']="image/x-portable-graymap";
$filetype['rgb']="image/x-rgb";
$filetype['xpm']="image/x-xpixmap";
$filetype['txt']="text/plain";
$filetype['c']="text/plain";
$filetype['cc']="text/plain";
$filetype['h']="text/plain";
$filetype['html']="text/html";
$filetype['htm']="text/html";
$filetype['htl']="text/html";
$filetype['rtx']="text/richtext";
$filetype['etx']="text/x-setext";
$filetype['tsv']="text/tab-separated-values";
$filetype['mpeg']="video/mpeg";
$filetype['avi']="video/avi";
$filetype['rm']="video/rm";
$filetype['rmvb']="video/rmvb";
$filetype['wmv']="video/x-ms-wmv";
$filetype['flv']="application/octet-stream";
$filetype['mpg']="video/mpeg";
$filetype['mpe']="video/mpeg";
$filetype['avi']="video/x-msvideo";
$filetype['qt']="video/quicktime";
$filetype['mov']="video/quicktime";
$filetype['moov']="video/quicktime";
$filetype['movie']="video/x-sgi-movie";
$filetype['au']="audio/basic";
$filetype['mp3']="audio/mp3";
$filetype['snd']="audio/basic";
$filetype['wav']="audio/wav";
$filetype['wma']="audio/x-ms-wma";
$filetype['aif']="audio/x-aiff";
$filetype['aiff']="audio/x-aiff";
$filetype['aifc']="audio/x-aiff";
$filetype['swf']="application/x-shockwave-flash";
$filetype['doc']="application/msword";
$filetype['ini']='application/octet-stream';
?>
[+/-] |
在PHP里通过工厂模式提高效率【转】 |
这文章说的很透彻,对工厂模式的理解是非常有帮助的。当然如果想深入了解设计模式,可以看我们翻译的《PHP设计模式导论》
【原文地址】:http://www.phpchina.com/bb...
在进行大型系统的开发的时候,我总是困饶,是否应该包含每一个可能用到的类库文件。
如果只是在使用中才包含,会给开发带来很大的麻烦。因为我不可能预先知道在哪个地方会使用到哪个类。而且,如果在每个页面中,根据需要进行require 或include,这是令人很头疼的,我们往往会因为忘记include而导致一个warning或fatal。
如果在一个全局文件中包含所有的类库,然后所有的页面都包含这个全局文件。这样,虽然简化了include的工作,但是却带来了效率的下降。因为php会对每一个包含在内的文件进行检测。虽然PHP的效率很高,但是检测一大堆的类,还是会带来一些性能的下降的,特别是在一个大型系统中。
是不是有方法可以两全其美呢?肯定有了,不然我就不打这么多字了。
方法就是工厂模式。具体工厂模式是什么,我就不说了,这个已经被程序员们说到烂了。
我们建立以下四个文件
index.php
include_once("f.inc.php");
$f=new factory;
$t1=&$f->create('T1');
echo $t1->getName();
echo $config;
?>
f.inc.php
class factory
{
function factory()
{
$this->mClasses=array('T1'=>'t1.inc.php','T2'=>'t2.inc.php');
}
function &create($class)
{
if (!class_exists($class))
{
require_once($this->mClasses[$class]);
}
return new $class;
}
}
?>
t1.inc.php
global $config;
$config='surfchen';
class T1
{
var $mName='name::T1';
function getName()
{
return $this->mName;
}
}
?>
t2.inc.php
class T2
{
function T2()
{
echo 't2 is ok';
}
}
?>
在index.php里,我们通过一个factory类来创建其他的类实例。
在factory里,保存有一个数组$this->mClasses,格式为array(”类名”=>”类文件路径”).
我们通过factory::create()来创建一个类实例的时候,在create()里,会首先检测类是否存在,如果不存在,就根据$this->mClasses把类对应的类文件包含进来。然后创建并返回一个该类的实例。
这样,我们只需要把factory类文件包含进执行的脚本(如index.php)中就可以了。
大家可能还注意到了在t1.inc.php中的这两行代码。
global $config;
$config=’surfchen’;
为什么需要global呢?因为t1.inc.php是在factory::create中被包含的,t1文件中的变量将会默认为create的函数级变量。所以我们需要对其中的变量(如$config)进行global以便index.php能访问到。
运行index.php,将会输出
name::T1surfchen
[+/-] |
互联网盈利模式思考 |
转载于:it草根网
K12网站从1999年创办,2000年春节就遇上Nasdaq大崩盘,因而被迫转向传统业务–教育信息化软件,一直到2005年中时,传统业务不断萎缩,才开始再次探索通过网站挣钱的方向。
试图重新通过网站挣钱–或者说搞“网络经济”,对于K12来说,倒并不是如何度过初创期的问题,也不是吸引访问量或者吸引用户的问题,投入虽然不足,但由于网下业务仍然在持续开展,因此还是有一定资金支撑的。因此,现在对于K12来说,只是怎样通过用户、访问量来挣到钱的问题。前面几篇文章就是立足于此。
(当然还有一条路子,就是先找到资金,然后再进一步扩大影响,最后再考虑挣钱。但这条路子对于猫扑、ChinaBBS这样的大众化网站来说,或许还能行得通, 可是对于K12这样的专业网站来说,网站本身的影响力似乎很难大到足够引起投资者的注意。更为现实的路子或许是自己找到可行的商业模式,然后再去找投资者。)
所以,正如我在前面的文章中提到的:创意->产品开发->市场推广每个环节都是非常重要的。而在网络经济中,让众多的用户知道你、相信你是一件很难的事情,但背后的商业模式也不是件容易的事情。就象许多人都曾经表达过的:互联网的商业模式在刚开始的阶段是无法看清楚的。大家一拥而上搞门户网站时,本来都觉得广告是最挣钱的,没想过最后居然是无线增值业务和网游最挣钱–包括华尔街在内。
以下引用记者采访的陈一舟只言片语,也是类似的意思。
———————————-
记者:你认为像猫扑、Donews或者是Dudu.com网站,他的广告的盈利来源主要是还是广告吗?或者是未来有更多的利润的方向,现在看得清楚的好象就是广告。
陈一舟:广告看的很清楚了,其他的盈利模式我觉得未来几年广告还是为主,但是过了三年以后,我不知道是不是去收费,但是我对互联网的理解,我觉得互联网上的东西最后还是以广告为主,其他都要变成免费的。千万不要小看广告的生意,因为广告已经造就了Google的全世界的地位。他的市值已经超过了时代华纳。不要小看广告,广告是小但是成长量比较大。而且他能为广告客户带来比较高的价值。
记者:我理解您刚才说的不管是Donews或者是猫扑一开始都没有考虑赚钱的问题,都是先把人气做旺,就好象把人气造起来以后,无论是靠广告或者是其他的业务赚钱,就像Google一样用的人多了赚钱的渠道自然就来了。
陈一舟:至少在互联网上应该是这样。我觉得社区的变量也比较大,至少是中上的。
记者:上海有一个这样的网站,叫做迈克(英文).com据说他已经有一万多人的真实的白领的资料。已经有些人看上他了,可能这就是他的价值吧。
陈一舟:对。
———————————
目前来看,有一点是肯定的:只要你能吸引到“足够多”的用户–比如象盛大、QQ一样拥有1亿以上的用户水平,就比较容易把用户变成钱了。换句话来说,新浪、搜狐、网易、TOM、QQ这些网站已经有足够的能力把注意力转化为金钱。
当然,实际上也没有几个网站有足够的能力、金钱、耐性和运气能够吸引到上亿用户,尤其是许多“垂直门户”、“专业网站”(如斗牛士、榕树下、K12等),还有一些区域性的网站–比如分类信息网站(如58同城、客齐集之类的),是不太可能做到这么大的用户量和访问量的。
因此,在“注意力”还不够的情况下,而且又没有足够的资本支撑你到有足够注意力的那一天的话,即使你有很多用户、在目标用户群中有很大的影响力、你的品牌在目标用户群中很响亮,但如何把影响力变成钱仍然是一件很难的事情。
以目前的网站赢利手段来说,公认的大规模商业模式只有3种:广告、无线增值、网游,其它规模相对较小的还有会员费、电子商务(网上买卖)、虚拟物品交易、增值服务等几种。
按照不同的性质,这些业务应该可以分为4种模式。
(1)免费业务 + 第三方增值服务。比如网络广告、……。
(2)免费业务 + 基于免费业务的增值服务。比如无线增值服务、虚拟物品交易(比如赛我网、QQ秀的个人形象道具,网络游戏道具买卖等)、其它网络增值服务(如QQ网络硬盘扩容、QQ特号等)。
(本Blog刚转载的一位风险投资商的“我最喜欢的商业模式”,恰好与此点完全相符。)
(3)直接收费的网络服务(或许可免费体验)。比如网游、各种交易平台(如alibaba、ebay)、UUTV网络电视频道包月、EngilshTown网上英语培训等。
(4)网上通道,网下服务(收费,但业务主要依靠传统经济开展)。传统的“电子商务”概念基本上应该指这一条。比如各种网上书店、携程网、唐高网(整合高尔夫球场资源)等。
在上述4种类型中,我们以业务本身是免费/收费、付费方是第三方/用户、赢利方式是通过网上/网下进行了划分。这样划分的好处就是可以比B2B、B2C、 C2C这样简单地以用户性质的划分方式思考起来更贴近网站的实际特性。当然,这4种类型业务当然也可以交叉起来,形成更为丰富的特性。
由于这里的内容非常丰富,也有相当典型的实例,因此后面将逐个重点探讨。
上文说到互联网业务的4种模式。其实无论是哪一种–尤其是前三种,其基本的规律都是“免费+收费”,而且即使收费,其金额相对来说也要足够地小。因为在互联网上开展的业务,对于用户来说既无法实地感知、又不见得一定要来,因此免费就是非常重要的。
免费业务对两个方面都有重要帮助:建立用户认知、培养用户习惯。这其实也是现代商业社会中普遍的商业规律。用户不知道你、不知道要做这件事,就不可能购买– 从而无法做任何经营活动;用户不习惯于做,就不会产生重复购买–从而无法产生源源不断的利润。可以说,没有这种“认知”和“习惯”,就没有商业。
因此,在现实生活中,无论是可口可乐、还是牙刷牙膏、保健品,从中央电视台的广告,到赞助各种赛事,到各种各样的研究成果“表明……”,都是希望先让我们先了解、感觉到能接受或有必要,最后慢慢变成习惯。比如:牙刷要3个月一换,穿名牌就会很“酷”之类的。
网络上培养用户认知和习惯的主要途径就是“免费”。比如:刚开始时我们不觉得一定要去网上看新闻,也不一定要通过MSN聊天。但培养了几年,几天上不了网就觉得信息极为不通畅,与朋友也不能随时联系了,这时,我们不仅觉得这样的网络服务有用,而且已经“习惯于用”了。既然你离不开了,这项服务对你来说就是有价值了,这时让你再付一定的费用,想必你不会拒绝。
而对于最后一种模式来说,免费的可能性就会小一些–因为其主要收入来源是网下业务,而网下业务免费,就意味着你要付出较高的成本。这一点不象网上的业务,对用户免费的“增量成本”往往很小–这也可以说是网上业务的优势吧。
当然,最后一种模式的重点本质上并不在于“免费”,因为其收入来源是网下业务,换句话来说是用户本来就需要的产品或服务,只不过通过网上来出售而已。因而,其最需要的是“给用户带来的明确价值”–通常来说是省钱、省事,当然还有用户对你服务水平的认可和信心。
其实,在现实的网下商业现象中,也有不少用“免费”或近似于免费的概念吸引用户、最终从用户人气中获取销售的。这里举一个例子。
这个例子是发生在我所住的天通苑小区的。天通苑小区由于人极多–据说有20万人,而且这里的老人特别集中,因此吸引了很多做健康/保健用品生意的厂家。但是大家都知道:老人买东西是极为谨慎的,而且以低值商品为主,那么怎么能让老人来买价值几千元、几万元的高档产品呢?也许大家都已经在身边见到了他们的做法:免费–每天都可以免费使用,也不动员或要求你买,你觉得有用就可以每天来用,只要你不想买,就可以永远不买。结果呢?象我父母每天都要排队去做的一种仪器–现在已经免费做3年了吧,叫“科治好”,据说是净化血液的,效果应该是很好的,售价2万多,一个这样的免费体验中心,每个季度就可以卖出20台以上。这也是通过免费吸引用户,建立用户认知、习惯,最后实现销售的典型案例。
还有一个小例子是听到广播中的广告,说是1块钱可以买到一瓶某种保健食品(比如深海鱼油、卵鳞脂之类的),限一人购一瓶,说是希望每个人都能够以1元钱的价钱感受到优质服务。–可想而知,你体会到了,如果感觉到效果确实不错,再加上些许动员,恐怕有相当比例的人会继续购买的。
其实,无论是网上还是网下,只要是做商业,其基本原理都是相通的。让人们花钱,人们总是会犹豫的。只要用户犹豫一下,90%的销售机会就溜走了。而免费、或近似于免费,则非常容易获得大量关注和潜在用户,能够培养用户认知甚至习惯,这里一定会有一定比例的用户转化为真正的“客户”的–只是一个转化率问题,而且必定存在一个转化率。比如,即使在网站上做广告,其转化率的典型值是:0.5%的点击率、每次点击0.10元左右。
当然,不管是网上还是网下,你敢让用户免费体验的前提就是:你的产品和服务一定要过硬!只要有这个前提,就可以充分利用“免费”(或近似于免费)这个有力的武器–当然产品形式必必须要适合于免费,迅速获取较大数量的潜在目标用户。一旦获得了大量用户,下面的工作只是跟踪用户、争取较高的转化率而已。这样,市场宣传工作的成本大大降低了,而且销售工作的跟进也就是顺理成章的事。
“免费”+“转化率”,这就是互联网营销中的一个有别于传统营销的常用手段。
[+/-] |
URL映射 |
1、大家来说说URL映射吧
一般url映射有两种方式,一种是通过mod_rewrite实现,这种网上教材很多我也不多说了。另外一种是在程序中模拟,比如类似zend Framework中的那种方式/index.php/controller/action/var1/value1/var2/value2/。这里方式其实最主要是通过一个统一的输入接口,然后对url进行解析,最后转发到相应的controller中的module。
我这里写了两个简单函数来模拟。
第一个函数主要是进行地址解析,把类似/index.php/controller/action/var1/value1/var2/value2/的地址解析出来,一般来说要解析成三部分:controller,module,params。
/**
*对url路由进行简单的解析,支持对/path/to/site/index.php/module/action/parm/value
* /path/to/site/index.php?/module/action/parm/value和
* /path/to/site/?/module/action/parm/value三种形式的处理
*@param:null
*@return:router array
*/
function url_router(){
$path=strip_tags($_SERVER['REQUEST_URI']);
$strpos=strpos($path,'.php');
if($strpos){
$path=substr($path,$strpos+4);
}else{
if(empty($_SERVER['QUERY_STRING'])){
$strpos=strpos($path,'?');
if($strpos){
$path=substr($path,$strpos+1);
}else{
$path='';
}
}else{
$path=$_SERVER['QUERY_STRING'];
}
}
//统一化$path的格式,如果$path的第一个字符为/则去掉
if($path[0]=='/'){
$path=substr($path,1);
}
//解析,并且路由
if(!empty($path)){
$path=explode('/',$path);
$router['controller']=$path[0];
$router['action']=(!empty($path[1]))?$path[1]:'index';
//print_r($path);
for($i=2;$i
}
$router['params']=$params;
}else{
//默认路由信息
$router['controller']='index';
$router['action']='index';
$router['params']=array();
}
return $router;
}
?>
这里就完成主要的url解析功能,然后是转发映射,下面这个函数实现(注意这个函数的实现是结合了我自己的架构,所以你采用的话需要相应的修改,当然你的MVC如果类似zend Framework,那应该要该的不多。)
function url_dispatch($router,$app_path='/app/controllers/')
{
require_once(SERVER_PATH.'/libs/controller.class.php');
$controller=$router['controller'].'Controller';
//echo SERVER_PATH.$app_path.$controller.'.class.php';
if(!file_exists(SERVER_PATH.$app_path.$controller.'.class.php'))die('缺少必要的类!');
require_once(SERVER_PATH.$app_path.$controller.'.class.php');
$controller=new $controller();
$controller->_setParam($router['params']);
$controller->{$router['action'].'Action'}();
return true;
}
?>
2007年3月16日星期五
[+/-] |
DIGG下的赋值的探讨[转] |
From:http://blog.donews.com/BearEyeOnIT/archive/2007/03/13/1139702.aspx
看了板儿砖的CNSNS的《DIGG下的赋值初探》,也想谈谈自己对digg类网站的赋值的一些宏观上的想法,微观的具体到使用哪些参数,各参数比重等细节本文就不深入下去了。
正如CNSNS文章中提到整个赋值体系分为两部分:一、基于信息内容轴的赋值,即对每一篇文章的赋值;二、基于用户行为轴的赋值,即对每一个用户进行赋值。这两部分又相互结合,一部分设计的不好也会影响到另外一部分的效果。
整个赋值系统的最终目标就是使得优秀的文章能被推荐出来给更多人阅读,同时系统也应该具有抗作弊性,不能让少数人的不正常行为影响到最终的结果。
我 先来探讨下关于文章的赋值。一篇文章的赋值是由参与评价的所有用户决定的,但是由于用户本身的赋值有所差异,所以用户的评价行为对文章的赋值的改变应该也 有一定的差异。比如:对于低于赋值x的用户,其影响力设为0,这样可以很好的限制某些人通过注册众多的帐号来作弊的行为。对高于赋值y的用户设定其影响力 为1,对于赋值在x和y之间的用户其影响力呈线性在0-1之间变化。
简单的,文章的赋值=叫好的用户总影响力-拍砖的用户的影响 力。但是考虑到一些文章可能相对有争论性,较能引起大家的关注讨论,所以更进一步的文章赋值公式可以修正为:文章赋值=m*(叫好值-拍砖值)+n*(总 参与用户讨论数)。系数m、n决定了它们的比重。修正后的公式能使一些毁誉参半的观点想法的文章也能有高的赋值,从而被更多人关注。
下面谈 谈关于用户的赋值。正如前面设定,用户低于赋值x时其对文章影响力为0。那么用户就需要通过其在网站上的交互活动来提升他的赋值,以达到对文章产生影响力 的地位。这也相对可以促进用户参与网站交互的积极性。用户可以通过发文章,评价文章来获得赋值。可以给评价文章获得的赋值设定较小的值。而用户发文章以 后,这篇文章的含金量将会同值赋给用户,这样就可以刺激用户多发有价值的文章,而不是简单的转贴子,灌水。
可以看到,文章的赋值会影响到发文章用户的赋值,用户的赋值又影响到他评论的文章的赋值。这两部分相互关联,是一个有机整体,所以设计的时候也不应该简单的把两个割裂开来。
2007年2月25日星期日
2007年2月21日星期三
[+/-] |
My Favorite App(For Mac) |
Adium——It is a chatting application. Combined most chat tools, such as MSN, QQ, ICQ, etc. And it is FREE.
Download Adium 1.0.1
Backup——App for backup, product by Apple.
backup3.zip , Backup 3.1 [UBK].zip(cracker)
BitRocket——Bittorrent Client for Mac. This app is the greatest tool I use in Mac OS, compared with Xtorrent, Bitwheel, Azureus, etc. FREE
Download Beta 0.1(25)
Chmox——Read your CHM documents on your Mac. FREE
Chmox 0.3 (251K)
Cocoacash——Manage your personal finance - the Mac way. FREE
CoCoaCash download
Firefox——The most popular browser, and the assisted app for safari. FREE
Download Firefox - Free 2.0.0.1 for Mac OS X, English (18MB)
iGetter——My favorite download app.
iGetter2.5(k).zip(app & cracker)
iSerial Reader——Useful App for searching SN. FREE
Dreamweaver 8——Good stuff for webmaster.
Mdict——The most fabulous dictionary for mac users. FREE
MDict-Download-21370.html
NoteBook——Write your own article. It is pretty good.
Download Page(contain cracker)
Pandora——Searching pictures as more as you can.
download , How2crack
Pandoraman——Little app for listening music on Pandora.
Pathway——Your own Wiki library.
Tips: If you can not link to wiki.en, try to modify search engine as http://anonymouse.org/cgi-bin/anon-www.cgi/http://en.wikipedia.org/wiki/
Mplayer——The most popular media player for Mac OS.
Tips: If you wanna open real format file, such as rm, rmvb, mkv, etc, you need to download decode package.
Picasa Web Album Uploader——Application for upload pictures to Google Album.
Quicksilver——Good stuff for finding anything you want quickly.
Rapidweaver——Application for building webpage.
Download Page
Realplayer——Most popular media player for Mac OS.
Screen Mimic——Recording your desktop, export the movie to flash and quicktime format.
ScreenMimic.dmg
Name: The Blade
Email: TheBlade@Pirates.gov
SN: SM2-P82CGJ-HUAX5-3TMPL-ATK4P-DGKCJ-N
Skype——Global Voice&Video Chat Application for Mac OS.
Snapz Pro X——
Stuffle Standard 9——Although it is the old version application for expand packed files, but it is enough.
Writeroom——Writing in the dark background, feeling good.
Download Page
Yojimbo——Something like your Notebook or Diary. There is another one familiar with this, named Journler.
Download Page
Yummy FTP——FTP client tool. I try a lot of FTP tools before, and finally choose this one.
yummyftp.zip
VLC——Most popular media player for Mac OS.
Windows Media Player——Most popular Media Player for Mac OS.