Archive for February, 2004

我的课程设计计划书

Saturday, February 28th, 2004

已经基本上定下来了,就是开发一个PHP的Blog系统。
老师极力推荐用Java技术,但是我出于普及性的考虑还是最终选择了PHP,虽然前者看起来更有“技术含量”,更“拿得出手”,但是也许这个作品就永远是一个毕业课程设计了…
PHP有什么不好,我现在还直接把它作为Linux下的脚本语言使用,像perl一样,也很好用(CLI: Command Line Interface)。它还是一个很好的Web services的client(我可没说不能做server),而且又这么普及,干嘛在很多只需要鸟枪的地方非要用大炮?
下面是计划书的文本。

毕业设计题目:
多用户内容发布管理系统(网志)
Multiuser Content Management System (Weblog)
课题简介:
Weblog(网志),简称Blog,是个人CMS(Content Management System,内容管理系统)的一种。很多人利用Blog系统像写日记一样记录每天的收获、所得,Blog系统将其整理、归档,其他人则可以自由地发表留言、评论,交流信息、思想。在国外,一些人甚至将其作为一种出版方式,还可以申请ISSN(国际出版物期号)来出版发行。
Blog是新技术的弄潮儿。基于XML的RSS Feeds / ATOM Feeds等是Blog的信息发布的重要形式之一。通过这种形式,不用去Blog网站,只要通过“聚合器”软件便可将众多Blog的内容收集起来(“聚合”),达到共享的目的。Blog也不是孤立的,通过基于XML-RPC方式的Ping/Trackback,各个Blog之间可以自动交换信息。另外Blog还通过提供Web Services接口支持远程更新和查询。
本项目的目标就是实现一个支持多用户的,多语言的Blog系统,后台使用数据库系统做为信息存储方式。编码方面通过模板引擎做到代码/界面分离。
本项目作为一个试验性的实践项目,是对GPL协议、极限编程等新型软件工程方法的一次积极尝试,也是对XML,XHTML/CSS,Web services(SOAP/XML-RPC),RSS/ATOM,Unicode等技术、标准的一次有益实践,为以后的软件开发积累经验。
本项目使用新软件工程方法极限编程(eXtreme Programming, XP)的思想,以测试驱动开发,以每两周为一个周期,每个周期结束都要拿出一个可供公开测试的原型产品,发布到网上进行公开测试,根据测试用户反馈制定下一周期的开发计划。每个新的周期都要对代码进行重构。
本项目采用开放源码的GPL协议,开发过程中的源码管理使用开放的CVS系统,并建立专门网站对项目进行管理,积极听取用户反馈。项目发布初始版本后,每天都要在CVS上进行每日构建(Daily Build) ,发布Nightly CVS Build版本。

New term, new hope, reloading…

Thursday, February 26th, 2004

新学期,新气象!
回到大连已经好几天了,ADSL的问题也解决了,终于又可以安心的上网了,感觉真好。不过这里还要继续批评中国网通集团,重量不重质,出国带宽哪去了?经常连MSN都上不去,下载速度和猫似的…
今天下午把毕业课程设计定下来了,还是继续原来的计划,做一个Weblog系统,本来老师建议我用Java(Servlet/JSP/Bean..)来写,这样比较有“技术含量”,可是我觉得那样做实用性比较差,所以决定还是用PHP来写,当然是Open Source的,填补一下这方面的空白吧,希望大家多多支持。
另外这几天在帮朋友做一个结合IPB论坛的整站系统(包含新闻,文章,下载三大模块),我使用的都是现成的东西,比如Smarty模板库,ADODB,htmlarea,呵呵,等着看看效果怎么样吧。
另外出国估计要明年春天才能走,所以这几天准备整理一下简历,找一个兼职或者短期的工作做做,谁有这方面的需求联系我吧(哈哈)

为FeedOnFeeds增加HTTP安全验证

Sunday, February 15th, 2004

FeedOnFeeds就是好,有了它,我每天都能有新鲜的牛奶喝啦!对不起,串了!:P 我每天都能有新鲜的Feeds看啦!可是您也许注意到了,我虽然前几天就介绍了它,但是一直没敢公开我的FeedOnFeeds,因为真怕哪位哥哥随便给我删点什么,那么我辛苦积累的Feed清单就可惜了;可是另一方面,FeedOnFeeds提供了OPML,也就是说,通过它你也可以分享我的Feed清单,如此有创意的功能不公开也真是浪费。再三权衡,找到了一个好方法,通过PHP的HTTP验证(HTTP authentication)和COOKIE验证(这样密码只要输入对一次然后就记住了)来对它进行一些限制:)
auth.php代码如下:
<?php
function authPass() {
    $my_user=”name”;
    $my_passwd=”password”;
    
    if (isset($_COOKIE["FOF_USER"]) && isset($_COOKIE["FOF_PW"])) {
        $user=$_COOKIE["FOF_USER"];
        $passwd=$_COOKIE["FOF_PW"];
    } else if(isset($_SERVER['PHP_AUTH_USER'])) {
        $user=$_SERVER['PHP_AUTH_USER'];
        $passwd=$_SERVER['PHP_AUTH_PW'];
    } else {
        header(’WWW-Authenticate: Basic realm=”FeedsOnFeed Authentication”‘);
        header(’HTTP/1.0 401 Unauthorized’);
        echo ‘Only the host can do this action’;
        exit;
    }
    if ($user==$my_user && $passwd==$my_passwd) {
        if (!isset($_COOKIE["FOF_USER"])) {
            setcookie(”FOF_USER”, $my_user, time()+2678400); //for a month
            setcookie(”FOF_PW”, $my_passwd, time()+2678400);
        }
        return true;
    } else {
        header(’WWW-Authenticate: Basic realm=”FeedsOnFeed Authentication”‘);
        header(’HTTP/1.0 401 Unauthorized’);
        echo ‘Only the host can do this action’;
        exit;
    }
}
authPass();
?>

好啦,把这个文件扔到FeedOnFeeds的目录里面去,更改上面预设的$my_user和$my_passwd为你的,然后在需要进行安全限制的页面,比如add.php, delete.php, [...]

庆祝Blog首页访问量达到10000 \^_^/

Thursday, February 12th, 2004

在线等待了半个多小时,用我的Blog统计程序一直在暗暗盯着,眼看着访问量一点一点的从99xx一直攀升到了9999,赶快上来抢10000,哈哈,抢点成功!

这是在访问量为9999的那一刻统计数据的截图:

10000次,虽然中间肯定有不少是我自己过来逛出来的:),但是还是感谢大家的捧场。从2003-09-08开站到今天2004-02-12这5个月的时间里(其中12月中旬至1月中旬由于参加IELTS考试的原因没有更新,所以持续更新近4个月),在大家的鞭策和鼓励下,我的进步很快——PHP, Java等软件编程水平由于有了实践提高很快;也开始有机会接触了XML, Web Services等一些新技术。因为有了Blog,可以记录我每天的成长、学习、生活的过程,看着记录下来的一点一滴,真是从心里由衷地感谢这种新生的媒体形式。
我第一次听说Blog是从我的朋友rainice那里,第一次了解是在《程序员》杂志2003年第7期上面看到了《Blog技术与软件开发》这篇文章,第一次有了自己的网站douzi.org是在去年暑假开学时结识了wanxu.com的朋友,第一次决心做一个自己的Blog,并采用Nucleus CMS是在高春辉那里看到了他的Blog…通过Blog,我陆续结实了LG ,Sterding, 沅沅, Zoom.Quiet, Naola, 胡锋, linlance, cathayan, murj等新朋友,我的Email信箱能收到的也不再只是SPAM啦,能够和他们一起解决问题,分享快乐,真的是一件很高兴的事情。希望以后可以通过他结识更多的朋友。
呵呵,喜悦之情不能言表,让我们一起继续进步吧!

《Thinking In Java 2/e》学习笔记(2) Container 容器

Wednesday, February 11th, 2004

容器是Java学习过程中的一个难点,也是一个重点。
[Java 2 容器分类]
1. Collection: 一组各自独立对象
List: 以特定次序存储一组元素 [原序]
常用举例: ArrayList, LinkedList
Set: 元素不得重复 [重排序]
常用举例: HashSet
最常用界面: add(element)
get()
iterator()
2. Map: key-value paris, 也被称为关联式数组(associative array) [重排序]
常用举例: HashMap
最常用界面: put(key, value)
get()
[容器打印]
由各容器缺省的toString()提供
Set和Map都具有内部的排列(Ordering)机制
[容器缺点: 元素型别未定]
一旦将元素放入容器,它将丧失它的型别信息,都变成了Object
这样从容器中取出元素时首先要转换为原有型别,唯有String例外:
编译器会自动调用toString()函数
[迭代器 Iterators]
迭代器是一个对象,其职责是走访以及选择序列(sequence)中的一连串对象
而且迭代器是“轻量级”对象,产生的代价极小
Collention.iterator() 返回一个Iterator对象
java.util.Iterator [class]
next() 取得序列中下一个元素,第一次调用将返回第一个元素
hasNext() 检查序列中是否还有下一个元素
remove() 移去迭代器最新传回的元素
对于List还有一个更复杂的ListIterator
java.util.ListIterator [class]
add(), remove(), set(),
hasNext(), next(), nextIndex(),
hasPrevious(), previous(), previousIndex()
旧版迭代器为Enumeration
[容器分类 Container taxonomy]

[Collection机能]
boolean add(Object)* 若未能将引数加入,则返回false
boolean [...]

第二次雅思考试成绩出来了

Monday, February 9th, 2004

我: Overall: 6
Listening:6, Reading:7, Writing:5, Speaking:5
豆子: Overall: 6
Listening:6, Reading:5.5, Writing:6, Speaking:6
呵呵,上次只差0.5就可以到6分了,事后知道了有些不服气,所以这次如愿了,果真只有Reading比上次提高了0.5,总分达到了6分。豆子的提高倒是很明显的。不管怎么样,这次总算不是鸡肋成绩了,虽不尽如人意,但还算不错啦。:) 可以着手申请学校了。

RSS聚合网上用 — FeedOnFeeds

Saturday, February 7th, 2004

这几天又发现了一个新东东。:)我现在使用的这个RSS的网上聚合器FeedOnFeeds比起桌面上的RssReader之类的有这样几个好处:
1. 随时随地: 在外面只要能上网就能看了:)
2. 节省带宽/时间: 嘿嘿,当然是我的带宽了… 服务器抓东西的速度总要比我快吧
3. 适应性好: 我现在使用的这个FeedOnFeeds几乎支持各门各派的各种XML的Feed格式,阿童木(ATOM),RSS1.0/RDF,RSS2.0/0.9,OPML(一种记录多个RSS源的RSS格式),够全了吧?而且在使用过程中,除了blogcn.com的RSS大部分都有问题外,其它的都能用,这归功于它使用的RSS解析引擎MagpieRSS,而不是我们在PHP下常用的Useful,Inc.的那个,这个对gb2312的兼容性要好一些。(blogcn的也挺奇怪,除了里面名人老榕的顺利parse外,别的居然都有parse错误?)
4. 对我来说,PHP的东西DIY很方便:) 本来想加上自动根据UTF-8/GB2312转码的功能,后来换了个角度,我装了两个,一个专门用来看UTF-8格式的,一个专门用来看GB的,嘿嘿,效果还不错,还省事了。
还有它并没有对默认的charset做设置,所以大家自己加一下就好了,我的方法是开一个lang.php
<?php
$charset=”utf-8″;
header(”Content-type: text/html; charset=$charset”);
?>
这里是把编码设为utf-8了,然后在需要转码的叶子,如index.php, view.php前面include一下就行了:)
现在唯一的问题就是,这东西没保密设置,也没多用户选项,毕竟是个简单的东东嘛…Enjoy!
下载: http://minutillo.com/steve/feedonfeeds/

《Thinking In Java 2/e》学习笔记(1) 数组

Monday, February 2nd, 2004

我在一边学习《Java Servlet Programming》过程中,还在一边通过《Java编程思想 第二版(Thinking In Java 2/e)》补习Java的一些基本知识,这几天学习下来真有一种茅塞顿开的感觉:)
这里是第一篇,关于数组Array的。我的笔记的作用就是复习备忘的,所以里面很多用语、类/函数格式等等都不是很规范,请见谅。
(终于可以给Java栏目添加一些东西了:) 一个Java高手就要诞生了…Haha…哪来的烂苹果?! -_-b )
Array — 容量固定且(容量)无法动态改变
两种Array: primitives array, objects array
(wrapped primitives container array也属于object array)
区别: 前者直接持有基本型别的值, 后者持有的是references
[初始化 Initialization]
primitives array:
int[] a1={1, 2, 3, 4, 5};
int size=5;
int[] a2=new int[size];
int[] a3=a1; // 注意,这只不过是reference的复制
objects array:
int size=5;
Integer[] a1=new Integer[size];
Integer[] a2 = {
new Integer(1),
new Integer(1),
new Integer(3), //最后这个逗号可有可无
}; // Aggregate initialization
Integer[] [...]

PHP: UTF-8兼容的substr()函数

Sunday, February 1st, 2004

把Nucleus改成了PHP编码后,发现一些功能,如RSS,LastComments插件等等由于要截取前…个字符做预览,结果造成了从UTF-8字符的中间截断,出现错误,这个函数可以很好的改善这个功能。
更好的实现方法当然是使用官方的mb_substr,但是需要在编译的时候指定参数,我等使用虚拟主机的只好用这个方法解决了。
<?
function utf8_substr($str,$start) { 
    /*
    UTF-8 version of substr(), for people who can’t use mb_substr() like me.
    Length is not the count of Bytes, but the count of UTF-8 Characters
    
    Author: Windix Feng
    Bug report to: windix(AT)gmail.com, http://www.douzi.org

    - History -
    1.0 2004-02-01 Initial Version
    2.0 2004-02-01 Use PREG instead of STRCMP and cycles, SPEED UP!
    */

preg_match_all(”/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/”, $str, $ar); 

    if(func_num_args() >= 3) { 
        $end = func_get_arg(2); 
        return join(”",array_slice($ar[0],$start,$end)); 
    } else { 
        return join(”",array_slice($ar[0],$start)); 
    }
}
?>