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
如果以后出现了这样的提示,就说明我又在捣鼓程序了 😀

开始准备18号演讲比赛

说来黑大也真是扯淡,本来规定本科生要修满4学分的“创业教育学分”,但是今年不知道怎么回事突然就增加到8分了。结果学院本来为我们准备的“机会”就变得不够,每个学生都有修不满学分毕不了业的危险。
为了保护祖国的花朵祖国的幼苗,让花朵们远离毕不了业的危险,学院就举办了一次日语演讲比赛,据说参加了这个比赛的人能获得数学分的加分,还说是将来找工作什么的可以更有竞争力。竞争力不竞争力先放在一边,单说用学分当诱饵这件事,我感觉简直是跟在威胁人差不多。先前这种手段已经用过两次了,第一次是让三天写完《日本文化史》的读书报告,第二次让两天写完《菊与刀》的读书报告(还好都是用汉语写,要用日语写的话我宁愿毕不了业)。
这次的题目是以“日本和日本文化”为题目进行5分钟的演讲。班长私下说,只要跟日本沾边就算,可以随便说,至于时间方面,演讲前后多あいさつ几句应该能凑出来。
今天下午没有课,突然想起来还有演讲比赛这么个事,不想先准备起来吧。在网上瞎逛了逛跟日本有关的网站,看到一篇跟汉语中的日语词汇有关的文章,于是决定就写这个了。堆了一下午词,终于在傍晚写完了1300字(日语,大部分都是假名,翻译成汉语也就900来字),也不知够不够我忽悠5分钟的。明天先把稿子给老师看看有没有什么低级的语法错误,修改过之后就该背了……

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来显示当前的天气状况(每小时更新)。