Waki-Blog准备开源~♪

再三思量,最终开始决定开了算了。毕竟在写这个系统的时候,参考了一些其他的开源项目,模板也是拿来主义,所以还是决定开源来答谢互联网给我这么多无私的帮助。
昨天写好了安装程序,整理了一部分代码(关键是标准一些,整理了一下以前图方便写的代码),调整了一下数据库结构(索引、一些字段名和属性)。今天上午继续施工,做好了开源用的模板,检查了一下安装程序和模板中的错别字,打包之后给了josh(文件名是wakiblog_opensource_alpha_v1_200612021045.rar)。josh拿到这个“第一份的开源Waki”之后竟然顺利安装好了(我本来以为拿到别人那里多少得出点问题呢),他测试了一下各项功能也没有异常。噢~赫赫,真是顺利。
现在公布一下未来的官方网站吧:http://www.dgwxx.com/waki
因为还没完全准备好,所以要再等一段时间才能提供源代码下载。不知道有没有想要Waki-Blog源代码的朋友呢^^||

此外今天在整理代码的过程中正好修正了几个Bug,看来定期检查代码真的是有好处啊。
1.RSS生成过程中,作者名出问题的Bug。
2.模板sidebar里面标签不配对的问题。
开源之后问题肯定会更多(当然也要有人用才成)。

谁能OCR出来这张验证码

谁能把这个验证码OCR出来,中文OCR就不愁了,任何汉语文字都可以被OCR了。
Image

被SPAM骚扰了好几天之后,决定下狠药把z-CAPTCHA移植到Discuz上+把register.php改名。弄好了之后机器人们终于闭嘴了。就算机器人通过正则表达式匹配出了新register.php的文件名,到了OCR验证码的时候,机器人们就会发现以他们现在的水平,这个验证码是无论如何OCR不出来的(随机加法减法乘法算式随机数+随机背景+随机颜色+随机位置+随机反转角度+随机文字大小+随机图片大小+…)。
不过随着机器人的进步,难免会出现智力高到一定地步的OCR程序。不过到了那时候我也不怕,我还有杀手锏没用出来,那就是中文验证码。现在更加强劲的验证码已经做好了,随机汉字+随机字体+随机背景+随机颜色+随机位置+随机反转角度+随机文字大小+随机图片大小+…就算随机汉字被OCR了,我还可以用汉字提出随机问题,比如:“中国的首都是上海还是北京?”“北京承办了2008还是2007奥运会?”“地球是方的还是圆的?”“美国坐落在遥远的非洲,对还是错?”“南极在南半球还是北半球?”“中秋节的月亮是圆的还是扁的?”“太阳和月亮是一回事吗?”…这种问题要多少有多少,我就不信机器人知道地球是圆的还是方的。
实际上,我觉得验证码用到了这个地步真是没劲了。大家比赛谁生成的验证图片最BT、谁的OCR更厉害,就像矛盾的故事,最后受苦的还是用户。想想看,当你发个帖子还要做一个两位数加法/减法/乘法的随机算式的时候…可能除了极少数人会感谢斑竹提供机会给他们练习口算之外,更多的人会选择骂娘或者不发帖。当一个美国人向来发帖的时候,发现你的验证码是随机汉语/阿拉伯语/日语/泡菜语/火星语…
这个网络越来越叫人无法忍受了不是?

附件,中文验证码取字范围,所有的验证用汉字都从下面段落中随机抽取:

我 在 朦 胧 中 眼 前 展 开 一 片 海 边 碧 绿 的 沙 地 来 上 面 深 蓝 的 天 空 中 挂 着 一 轮 金 黄 的 圆 月 我 想 希 望 本 是 无 所 谓 有 无 所 谓 无 的 这 正 如 地 上 的 路 其 实 地 上 本 没 有 路 走 的 人 多 了 也 便 成 了 路

我愤怒了! z-CAPTCHA超级验证码

原创文章,严禁转载!
本文发在:http://www.discuz.net/thread-467609-1-1.html,文中提到的附件可以去那里下载。
在正式开始之前,请先允许我发一点小小的牢骚。
我的论坛是:http://www.dgwxx.com/nmmbbs
这几天被机器人SPAM发得不胜其扰,因为我的论坛似乎被机器人加入了自动SPAM列表,所以每天都有十几条SPAM过来,还都是那些OX用品的广告。可恶,连我这么个没人气的技术论坛都不放过,真是太可恶了!连续三天被骚扰之后,我打开了所有的验证码。没想到到了第二天变本加厉发得更多了。一猜想,很可能是Discuz的验证码已经被OCR(或者破解)了(后来我去了一趟那个机器人的网站,竟然大言不惭地宣称自己的OCR识别率达到89%,大家去踩:htmdp://www.ab222.cn)。
因为验证码不管用了,所以只好将以前写的一个验证码程序移植到Discuz。成功后不敢独享,将经验分享给大家,愿大家以后远离SPAM的骚扰。
继续阅读我愤怒了! z-CAPTCHA超级验证码

Waki-Blog 1.6 Beta1

昨天晚上再次重新设计了缓存结构,并更改了模板引擎。因为这次上传的是还没有经过充分测试的版本,所以版本就是1.6 Beta1吧。
改动:
(*)重新设计了缓存结构。进一步优化存档部分的效率。
(*)现在的模板引擎从之前的SuperTPL精简版(我自己精简的- -||)换成了完全版的SuperTPL。目的是为了在模板中使用变量调节器,能用变量调节器果然是幸福啊~T_T
(*)首页和分类页改成了分页浏览。因为Blog的首页停留率比较高,为了提高首页的效率,首页只显示本月最新的5条Blog,其他的全部安排到分页里面。这样也避免了首页显示全部Blog导致首页过长影响美观、打开速度慢、增加服务器压力。
(*)首页的存档目录放弃了Ajax,改为对搜索引擎更加友好的直接由程序输出列表给模板的传统方式。(实际上用户看起来没有任何区别)

题外话:
这次更新一共用了5分钟,虽然比那次1.0升级到1.5的半个小时大大缩短了,但是改动毕竟比较大,为了避免有人在升级中途访问造成数据库或者缓存错误,我把Blog挪到另外的目录里面单独升级。但是这样的话如果此时有人访问就会出现404,所以我事先做了一个提示页。风格是我比较喜欢的简约清淡的绿色,用了一下前些日子刚开始学的css驱动div显示。事后心血来潮去验证了一下,竟然顺利通过了XHTML 1.0 Transitional的验证(废话,整个网页只有一个div而已,通不过才怪)。
这个提示页的地址是:http://www.dgwxx.com/blog_down/index.html
如果以后出现了这样的提示,就说明我又在捣鼓程序了 😀

Waki-Blog 1.5完成

经过昨晚半个小时的升级,终于装好了Waki-Blog 1.5。
有进一个星期都没有更新Blog了,这期间就是在忙着弄1.5。这个版本的更新主要是在数据库效率方面,重新做了缓存系统,数据库结构和索引也重新设计过了。虽说前台几乎没有变化,但是实际上后台所有跟数据库有关的部分都重新写过了。趁着这次大幅度整理代码的机会,重新对很多部分进行了测试,并修正了很多以前隐藏很深的Bug。
Bug修正:
(*)删除Blog不彻底
(*)时间戳分析函数返回0时数据库查询错误
(*)内部图片库与Firefox不兼容
(*)黑名单
(*)重复插入Tags

改进:
(*)存档改为数据库存储,大幅度提高缓存更新效率。
(*)调整优化数据库结构与索引设计,调整全部低效的SQL查询。去除3个全表扫描的查询。
(*)重新设计了分类和存档缓存

去掉了影响效率的长期不使用的功能:
(-)隐藏Blog
(-)修改Blog发布时间

Waki-Blog调整性升级

今天对Waki-Blog进行了一系列调整:
1.首先增加了黑名单制度,黑名单上的IP禁止发表评论与TB,为了避免增加服务器负担,程序不会返回任何错误提示,只会直接返回HTTP404 Not Found。
2.调整了后台的数个Bug,可能造成Blog删除不彻底(对应的分类信息、TB、评论没有删除)。
3.为了降低更新缓存时服务器的负担与RSS带宽占用,调整了RSS输出为10条。
4.为了提高天气插件的速度,降低服务器压力,对获得的天气RSS进行缓存,每两小时更新一次。
5.微调了程序结构,加快部分页面的效率。

现在Waki-Blog基本进入了稳定期,Ajax和程序本身的稳定性已经很好了。接下来的工作就是进行代码的优化、安全、提速、Debug。

我对Ajax的一些看法

昨天跟秋实通电话的时候,他突然提起来了Ajax,无奈通话质量实在是糟糕(不知道是澳洲的电话网关糟糕,还是联通的通话质量糟糕),总之就是我听不清他说的话。因为这个话题技术性比较高,我实在是“猜”不出来他在说什么,只好自己瞎应和了几句便换了别的话题。
学Ajax也有一段日子了,也在Waki-Blog上进行了一些小小的应用,作为弥补昨天的“交流不足”,今天就来谈一下我对Ajax的一些看法。
继续阅读我对Ajax的一些看法

解决Javascript跨域访问RSS问题

问题出在我写即时天气插件的时候。
这个天气插件呢,是通过抓取服务商(我选了MSN)提供的即时天气情况的RSS连接,来显示博主所在地当前天气状况的一个小功能。
我在本地调试插件的时候,先把天气情况的RSS保存到本地,加载本地的XML,一路通常地调通了程序,但是在实际测试的时候出现了问题。
当试图通过XMLHttpRequest对象访问http://weather.msn.com/rss.aspx来获得当前的天气情况的时候IE却提示没有权限,Firefox2.0的Debugger则提示了一堆不知所谓的乱码。把XML改成本地的,问题立即消失。心下估么着,八成是Javascript出于安全性考虑,不允许跨域调用资源造成的。
没辙,只好求助Google,Google了一下“Javascript 跨域 RSS”这个关键字之后,想法得到了证实。接下来却又郁闷于如何解决这个问题。在网上大致找到了几种方法,一种是在后台做代理,或者是Apache的Rewrite或者是Proxy模块,document.domain等等的。只不过一来我等小虾没有自己的服务器,改http.conf用速度最快的Rewrite方法是与我无缘了,我和MSN的域名相差甚远,眼看document.domain也没戏。这下只好用PHP做一个代理了。
在网上找到了下面代码(出处,注释我翻译了一下):PHP Code:
<?
// 指定域名
define('HOSTNAME', 'http://api.local.yahoo.com/');
// 从AJAX进程中获得后面的请求地址
$path = $_GET['path'];

// 将域名和地址组合
$url = HOSTNAME.$path;
// 打开Curl进程
$session = curl_init($url);
// 不返回HTTP头,只返回服务器应答内容。
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
// 发起请求
$xml = curl_exec($session);

// WEB服务器发送XML头
header("Content-Type: text/xml");

echo $xml;
curl_close($session);
?>
连看都没看,简单改了一下地址,直接放到程序里面,服务器提示Fatal error: Call to undefined function curl_init()。继续郁闷……
看来只好用苯方法了,但是却比较管用:PHP Code:
<?
$url = "http://weather.msn.com/rss.aspx?wealocations=wc:CHXX0046&weadegreetype=C";
header("Content-Type: text/xml");
$content = file_get_contents($url);
echo $content;
?>
之后保存为weather.php,前台的Ajax向这个weather.php提交请求之后,这个后台代理从别人那里抓了XML内容再输出出来给Ajax看,Javascript一看是本地资源自然高兴,于是按照我的意思就显示了天气出来。这么做虽然增加了服务器负担,但是因为不能动用Rewrite模块,这也是不得已而为之。
ASP、.NET的代理,网上也都能找到现成的代码,既然是玩PHP的,这里就不现眼了。
当然,以上是比较基础的方法,如果你的Blog流量特别巨大,急切希望减小带宽和请求次数开销,可以在服务器段做缓存,N小时更新一次,如果连服务器缓存都支撑不了……-0- 可以尝试用Javascript在客户端的cookie里面放一些东西也不是不可以……只要你的客户们愿意就可以……如果还是不满意的话,可以默认客户端不显示博主当前天气状况,如果用户想看了,就点击相应的链接,触发Ajax,之后就是照常提交请求、接收回应等等。

(别问我为什么MSN提供的天气资料是英文的,我这显示出来的却是中文的…因为我在weather.php里面动了点手脚,把相应的词语都已换成中文了 囧)

近一周内的Waki-Blog更新

1.评论发表Ajax化。
评论发表Ajax化通过Javascript异步向服务器提交请求,根据服务器返回结果,直接在当前页面创建DOM节点,达到避免刷新整个页面造成用户体验度下降、进一步防止SPAM的目的。同时,由于避免了刷新整个页面,服务器只返回XML,通过减少一次界面刷新降低了5次数据库查询,大幅度降低了服务器负担。直接创建DOM节点加上退色技术,提示用户注意刚刚更新的部分。
2.完成了顶部状态跑马灯的渐变特效。
3.插件“即时天气”完成。
天气插件通过即时读取MSN Weather输出的RSS来显示当前的天气状况(每小时更新)。

Waki-Blog的Ajax重写

从N长时间以前,Waki-Blog进入更新不换版本号的阶段。
今天没什么写的,就来写一下最近程序的更新情况吧。

1.更新了RSS输出上的重大问题。当文章内容、标题等地方含有某些特殊字符的时候,会造成XML语法错误,阅读器无法识别。就是这个Bug害得feedsky两周没抓我的feed,7456……
2.重写了Ajax和一些Javascript,现在页面载入的速度说不定能快上个0.00000000000000001% 囧
3.后台增加了前几天提到的安全登录。
4.BBCODE增加了PHP语法高亮显示,使用了PHP内置的highlight_string()函数,速度比较好。
5.修正了当前模板CSS的一个错误,有评论的页面的sidebar会被挤下去。
6.后台Javascript若干调整…不一一列举了 囧