LonelyThinker

LonelyThinker是我写的一个blog程序,基于PHP+MySQL,使用BSD协议开源。

更多的信息可以看http://lonelythinker.org

Currently, 8 posts in this tag.

安装和设置LonelyThinker

| 3 comments 2009-04-16 22:33:18

注:就目前来说,这篇说明其实是写给LT的内测团队的。

1.下载并安装CakePHP

LonelyThinker(以下简称LT)使用CakePHP框架开发,因此你需要这个框架才能运行LT。

CakePHP的下载方法、安装和设置等内容,在其官方网站上都有很详细地说明,这里不再赘述。

如果阅读英文吃力,也可以搜索相关的中文教程。经过4年的发展,CakePHP已经成了最流行的PHP框架之一,中文资料比4年前丰富许多。

假设我们将CakePHP的安装在如下目录:

/Users/felixding/Sites/CakePHP

假设我们的网站根目录在如下位置:

/Users/felixding/Sites/public_html

2.下载LT并将其置于合适的目录

LT压缩包中包含core和webroot两个目录。按照CakePHP的要求,将core放置于:

/Users/felixding/Sites/CakePHP/core

将webroot目录下的所有文件复制到如下目录:

/Users/felixding/Sites/public_html

在复制时要注意,webroot目录下有名为.htaccess的隐藏文件。不过其实如果你用Windows的话,漏掉这个文件倒也无关紧要,因为这个文件主要是用来控制Friendly URL的,而Windows本来也不支持这功能。

3.建立数据库

假设你已经有了一个名为lonelythinker的MySQL数据库,那么你只要把以下两个文件导入到数据库里就好了:

/Users/felixding/Sites/CakePHP/core/config/sql/lonelythinker.sql
/Users/felixding/Sites/CakePHP/core/config/sql/lonelythinker_bayesian_wordlist.sql

其中第二个文件是包含了2万多个词汇的贝叶斯词库,LT的SPAM清洁机器人“毛毛(M-O)”需要这个词库以便正常工作。

4.编辑数据库配置文件

按照你的情况,编辑如下文件以使LT连接数据库:

/Users/felixding/Sites/CakePHP/core/config/database.php

5.使tmp目录可写

Windows用户可直接跳过本步,其它系统的用户则需要将如下目录的权限改为777:

/Users/felixding/Sites/CakePHP/core/tmp

大功告成,现在LT已经可以运行了!

控制面板

默认的管理员用户名和密码如下,你可以登录后自行修改:

用户名:root
密码:lonelythinker

LT 0.4.9中的评论统计功能

LT 0.5内部测试,谁有兴趣?

| 15 comments 2009-03-21 11:24:43

LT 0.5预计于5月份发布,在此之前我希望做一些内部测试,有人有兴趣参加吗?

  1. 自愿,全凭兴趣,无报酬;
  2. 你会成为LT测试团队的一员,获得内部论坛、邮件列表和Trac的帐号;
  3. 你的名字会出现在软件的“测试团队”的名单中;
  4. 你会预先获得LT的代码拷贝;
  5. 你需要精通PHP,因为在0.7版以前,LT会非常初级,基本上只限于开发、测试及高手自虐 :D ;
  6. 你需要安装、运行及“折磨”LT,找出一切bug、安全隐患和你认为不合理的设计,并通过Trac(或其它系统)提交;
  7. 在LT 0.5正式发布前(以我在本blog上的声明为准),你不可以传播LT的全部或部分代码给其他任何人,也不可以将你发现的bug/安全漏洞告知除测试团队以外的任何人。

要参加的朋友请回复本文,尽量留下你的blog/网站(如果有的话),测试团队的人数在10名以内。

介绍VisitorSense,LT 0.5的主角之二!

| 5 comments 2009-03-15 23:31:16

除了M-O外,LT 0.5还将引入另外一个全新的概念:VisitorSense。

VisitorSense是什么?

在我解释这东西到底是什么之前,先来看个演示:

首先,作为blog作者,在blog的控制台里进入“VisitorSense”:

探测器列表探测器列表。图片点击放大

点“Add a sensor”增加一个探测器。选择“MatchReferrer”触发器,在选项内填入“blog.rexsong.com”;选择“DisplayMessage”动作,在选项内填入“看到我在千鸟那里的评论了?关于这个问题我写了一系列的文章:用户体验架构”:

添加新探测器添加新探测器。图片点击放大

点“Save”保存,在探测器列表中可以看到这个探测器已经在工作了:

新探测器已经在工作了新探测器已经在工作了。图片点击放大

退出blog控制台。

现在假设你是一个普通的blog读者,你来到千鸟的blog,找到一篇链接至我网站的文章:

千鸟的blog上到我网站的链接

点原文的链接,你会看到:

探测器感知到了你!探测器感知到了你!图片点击放大

看到了吗?探测器感知到了你(blog读者)的来源,并知道这个来源符合blog作者的设定,于是便执行了预设的动作。这一“感知-执行”的机制,就是全新的VisitorSense!

如果你仔细看第三张图片,你会发现页面的顶端有一行探测器被临时关闭的说明,这是为了保护blog作者-不会不小心被自己设定的探测器挡在控制台外面。甚至,在控制台的不同页面,这个说明还会有小小的差异:如果你在其它功能的设置页面,这行提示中会包含一个引导你到VisitorSense功能页面的链接,否则则只会显示文字:

细节设计

VisitorSense到底是什么?

顾名思义,VisitorSense是一种对blog读者(visitor)的感知(sense)机制。它可以在每个读者周围安排许多不同的探测器(sensor),每个探测器负责从不同的角度去感知访客,一旦某一探测器发现某条件符合,VisitorSense就会发出指令让此探测器执行一些动作。

你可以同时添加并释放很多探测器,让它们构成一个探测器矩阵(Sensors Matrix),从而感知并执行各种各样的动作。

老网虫应该还记得DoubleClick,这个公司最为引以为傲的技术,就是在对用户的访问行为进行详细地记录和分析后,采取端到端的广告投放策略。而这大概就是VisitorSense这一想法的最初来源。

VisitorSense有什么用?

VisitorSense的核心目的是提供完全个性化的、精准的和端到端的关怀和营销。比如说,你可以:

  1. 根据访客的浏览路径(浏览历史),来判断他真正要找的东西,并提供个性化的帮助;
  2. 根据访客的点击来源,显示差异化的内容。比如对于从UCD China点过来的朋友,我可以在页面上更多地显示产品和设计;而来源如果是InfoQ等技术网站,则侧重开源的内容;
  3. 根据访客的IP来做一些好玩的事情,比如我知道121.*.*.*是阿里巴巴内部网络的IP,那么就可以有针对性地显示一段欢迎辞;

不知道大家注意到没有,实际上我已经使用了VisitorSense好一阵子了:我原来用的域名是 dingyu.me,后来我希望把它更换成 dingyu.me,但网络上有很多链接仍然指向老的域名,于是我添加了一个探测器(触发器:MatchUrl,动作:RedirectToDomain),把所有指向老域名的访问全部跳转到新域名。你可以点这个链接看看效果:http://heartstringz.net/blog/posts/view/introducing-m-o(注意浏览器地址栏的变化)。

可以说,只要有合适的探测器并结合合理的运用,你可以让VisitorSense做几乎任何事情!

VisitorSense是可扩展的

LT 0.5会自带几个最常用的探测器,你当然也可以不断地扩展VisitorSense的功能。我计划在LT的官方站点上提供专门的区域,供用户下载和开发者提交新的探测器。

对于用户来说,安装新探测器的工作非常简单-只要把它们拷贝到指定的目录。

对于开发者来说,编写探测器的难度和限制也很小。每一个探测器的触发器和动作,都只是一些非常简单的PHP代码,比如上面用到的MatchReferrer触发器的代码如下:

class MatchReferrer
{	   
    /**
     * Every trigger must have a 'sense' method
     * 
     * @param $referrer String Referrer URL that defined by user
     * @return Boolean Return true when actual Referrer matches with the pre-defined one, otherwise return false
     * @date 2009-3-12
     */
    public function sense($referrer = null)
    {
    		if(!$referrer || empty($_SERVER["HTTP_REFERER"])) return false;
		return ereg($referrer, $_SERVER["HTTP_REFERER"]);
    }
}

开发上的一点小问题……

VisitorSense实际上是一种系统的插件机制。我用过也写过各种各样的插件,可是设计一个装载插件的机制却是第一次,目前遇到的主要问题是:如何在提供嵌入系统的机会同时,最大限度地保证系统的安全?比如,我如何保证不会有人写个清空数据库的探测器?

介绍M-O,LT 0.5的主角之一!

| 5 comments 2009-02-26 16:20:37

还记得电影“WALL-E”中的那个可爱的清洁工M-O吗?它和主角WALL-E的那对交流让人忍俊不禁,不过看似小巧的它倒是非常忠于工作-决不放过任何污渍(这话怎么听起来有点像洗衣粉广告?)。

M-OM-O

在即将开源的LT 0.5中,我大幅度地完善了对评论的分类和管理,并决定把这一SPAM防火墙最终命名为M-O!我是有一天晚饭吃糖醋排骨的时候,突然想起来这个创意的,所以吃顿好吃的晚饭真的很重要。

目前M-O能为LT带来以下一些功能:

自动化的评论分类

M-O会使用内建的贝叶斯算法并结合黑名单机制,对每一条评论进行识别。正常留言直接予以发表;SPAM则标记为SPAM,并告知留言者此评论待审核。最棒的是,M-O是有学习能力的,随着留言数量的不断增多,M-O分类的准确性也会上升。

如果万一你发现M-O出现了判断失误,只需要在管理界面中操作一下,M-O就会记住你的判断并吸取教训。

智力

因为M-O对评论是有学习能力的,所以我们可以通过“智力”这个功能,得知它现在聪明到了一个什么程度。智力以一种非常有趣的方式来表示:“猴子-人-外星人”分别代表了从低到高的智能程度。这个点子其实来自于Sapiens,现在连图标都是用人家的,不过以后会改掉的。

M-O的智力M-O的智力情况。图片点击放大

说句题外话就是,有人问外星人一定比地球人聪明吗?答案要看谁先找到谁。如果某一天外星飞船忽然出现在了太阳系甚至地球,那毫无疑问,人家比我们发达多了。顺便推荐一本我读了几遍仍是爱不释手的《量子物理史话》

其实这个功能可能并没有什么用处,但是看起来很好玩。还有就是,做这种功能有什么比较好的算法(Javaeye上的提问贴)?

统计

显示一些关于评论的统计数据,比如一共有多少条评论、其中多少是正常的、多少是SPAM,在分类的过程中有多少错误识别等等。

黑名单

在以下两种情况下,黑名单会特别有用:

  1. 贝叶斯算法失效时。贝叶斯算法并不能处理所有的情况,比如当SPAM内容为一串很长且无规律的英文字母、或者数据库中尚未建立对此SPAM内容的存储时;
  2. 你有特别不想见到的评论时。比如来自某个或某段IP、来自某个email、内容中包含特定的词等等。

M-O的内建黑名单M-O的内建黑名单。图片点击放大

你可以把不同类型的内容放到黑名单里,比如评论人的名字、邮件、网站、IP和评论的内容等,只要满足任何一个条件,他的评论就会被当作SPAM。

如果需要的话,你甚至可以使用正则表达式!比如对于SPAM内容为一串很长且无规律的英文字母的情况,一条内容如下的正则就解决问题了:

/\b[a-z]{25,}\b/

在M-O的内建黑名单中加入关键字在M-O的内建黑名单中加入关键字。图片点击放大

评论管理

你当然可以在LT中管理你收到的文章评论。所有的评论分为三种状态:已发表的、SPAM和被放进废纸篓的。

已发表的评论已发表的评论。图片点击放大

SPAMSPAM。图片点击放大

废纸篓废纸篓。图片点击放大

你可能注意到,在每种状态下,你可以进行的操作是不同的:

细节设计-不同类型评论的不同操作细节设计-不同类型评论的不同操作

当然了,作为一个以用户体验为目标的blog系统,当然少不了特效:

LT 0.5仍处于开发中,所以上述功能和设计还会进一步的调整。

Lonely Thinker 0.4完成及0.5展望

| 10 comments 2008-12-02 21:56:19

Lonely Thinker简介

Lonely Thinker(LT)是我编写的一个小型blog系统,这一系统所追求的目标是用户体验至上、功能简单、架构轻量。至于可扩展性,至少在目前的计划中不再考虑范围之内。你可以将LT的目标理解为B/S架构且经过功能简化的iWeb

Lonely Thinker 0.4完成

从07年11月26日发布0.3开始,LT就正式步入了0.4版的开发轨道。当初给这个版本设定的开发目标有三,一是确定每个版本升级所遵循的原则,以及版本号的规则;二是完成“iconment”功能;三是更新“Spam防火墙”。

现在回头来看这三个目标均已达到(当然从功能的角度来说,第一个也算不上什么目标)。其中“iconment”功能增加又最终去掉了评论时上传头像的功能,转而鼓励评论者注册Gravatar。而“Spam防火墙”经过数次更新,也已初步显示了一定的效果:在最近的22天之内,它成功地拦截了共779条spam,平均每天约35条。而在11月初的4天内,它更是抵挡了平均每天90.75条spam的进攻!

疯狂的spams疯狂的spams-日志文件一角

在LT 0.3.14中,我大幅度改进了在“有效地阻止SPAM”一文中所提到的方法,完全重写了Comment的Model,现在Spam防火墙有了自己的Spam数据库、校验规则和校验机制,并且这三者是完全分离的,也就是说你可以很容易地增加一条校验规则而不改动其它任何代码。这让我觉得很酷!

Spam防火墙的部分代码Spam防火墙的部分代码

当然偶尔会有漏网的spam(今天一下子漏了好几条),这工作任重道远。

Lonely Thinker 0.5展望

LT 0.5的开发目标如下:

开源

这是优先级最高、最重要的目标。本来说要在08年内开源的,但由于时间及精力的关系,这个目标只能拿到09年实现了。

现在的程序架构很不合理(懒得先期构思的结果)、程序运行效率低下、代码注释不全等等问题不一而足。开源的目标之一,就是利用开源的机会强迫自己重构代码。

为了开源,需要做到:1)重构;2)添加注释;3)编写相关文档;4)在Sourceforge、Google Code或Cakeforge上给项目安个家。

升级Spam防火墙到0.2

主要改动包括:1)将拦截下来的spam自动添加到spam数据库中,已被下次判断留言是否为spam时使用,把Spam防火墙变为一个自给自足的系统;2)考虑集成一些数学算法(比如贝叶斯)来判断spam。

“访客嗅探(Visitor Sense)”

这个功能很有意思:想象一下你通过查看日志,发现最近由于一个网站推荐了你的一篇文章,给你的站点带来了许多的流量。那么从营销的角度来说,你可能希望对这部分访客做一些特殊的引导-比如有针对性的显示一段欢迎辞,这样会让他们或多或少有一种“宾至如归”的感觉。

我打算这样设计这个功能:1)设定一些规则(比如Referrer URI=http://dingyu.me/about),然后设定这些规则之间的关系(AND或OR),最后在设置相关的动作(比如显示一段欢迎辞,或者显示与当前文章相关的信息);2)规则的类型以及规则间的关系是预先定义好的,使用时进行选择。比如规则的类型只能包括Referrer URI、访问的时间、访问的IP等等,规则间的关系只能是AND或OR;3)动作的内容每次都是完全自定义的。这是为了保证更好的营销效果。

上述概念类似于下图:

Apple Mail中的规则设定Apple Mail中的规则设定

 

刚刚发现的:落伍者上的一个朋友对LT的看法

About

我在厦门拍的照片

丁宇(Felix Ding),电脑Geek,狂热的爱书和爱乐分子,99年迷上网页设计,并从此一发不可收。现在在上海做用户体验/产品设计咨询。Email: felixding[AT]gmail.com。

订阅到RSS