金曜日, 9月 21, 2007

博友会主页制作记

——又修正了两个bug,估计暂时可以告一段落了。
这两天集中给博友会写主页。总算告一段落了。
由于只使用免费空间,所以很多功能没法完成。比如,用户验证啊,BBS啊。
不过,免费空间也可以完成很多工作,特别是使用了最近的Ajax技术。

原来的设想很简单,也很不明确——就是给博友们提供一个交流的平台。经过几次讨论,初步确定下来这样两项简单的功能:
  • 博友的列表,更新过的,标示出来。这样就可以不用逐一去各家去找了。
  • 以前的活动记录,以及新活动的通知。
于是,俺就开始干起来了。
别看俺搞挨踢已经这么多年了,什么XML啊,feed啊,Ajax啊早已耳熟能详,可是还没有实际用Ajax和XML做过一个东西——约等于不会
本来以为很简单,一两个晚上就可搞掂,结果……
挑战一:主页设计。到底采用什么结构?菜单放在哪里?标题怎么写?手头儿又没有合适的设计工具,只有用文本编辑器,从源代码直接写HTML文件。太吃力了。后来下载了nvu。虽然不怎么好用,但是至少可以不用记那些html的标签了。
一开始,做成这样:
后来,tubomim告诉俺,不用那么费事,博友们基本是中日文融会贯通,中日文全放在一起就好了。
于是,开始考虑一个页面包括全部。俗话说,天下文章一大抄,看你会抄不会抄。俺就特别会抄。从这时候开始,整个博友会的主页就开始进入了抄的阶段。
首先,页面结构,是从网上抄来的。俺发现了一个html模板网站。于是,进去一通划拉,试验了5、6个页面结构,最后经过简化、改进,现在这个结构基本定型。
挑战二:动态菜单制作。接下来就是抄左菜单的程序。俺找到了这个网站,看上了这个菜单,于是信手拈来,经过改头换面,变成了博友会的菜单。
然后就是抄内容。各次活动情况。从博友那里拷贝、粘贴。活动内容也就齐了。
下面就是用Ajax编程,把菜单和内容连接起来。——也就是,按菜单要调出相应的内容出来,放到相应的位置。这是俺第一次用Ajax做一个实际的东西。不用说,以前学习的时候,什么helloword之类的程序也还是做过的。编程也不能不抄啊,习惯了,没办法。从网上google了一个例子,修改修改修改……,也成了。
挑战三:feed处理。再接下来就是最困难的了,要把博友们的博文收集起来,放到主页上面去。俺还没看到过类似的程序,这下没得抄了吧。这难不倒俺。俺决定利用google code。从google code里面的例子入手,修改修改修改……,这次没那么容易。几经挫折,还只是把博友们的博文简单收集到一起。而且,博文还经常串门儿——张冠李戴。用tubomim的话说,这反而不错,方便交流。哈哈。
可是,专业人士不能这样原谅自己啊。于是找原因——发现,原来的收集方法是,发出请求、接收数据。默认返回来的一定是刚才请求的数据。但是,各个网站响应速度不同,有可能后请求的先回答,先请求的后回答。甚至还有的不回答(这就是后面一个bug的原因)。这样,就张冠李戴了。于是想办法,识别请求和响应,终于解决了这个问题。
挑战四:爬行榜。后来,tubomim说,这样不太容易阅读,于是俺想到了做爬行榜。可是,这次就没有地方去抄了。一直到俺们公司CMMI正式评审,俺才找到机会坐下来好好编程。一边参加评审,一边偷偷在下面写、调试程序。不过,这时候俺还不会javascript、更不知道DOM呢。这个网站里面的javascript参考,和DOM参考,帮了俺不少忙,起到了参考书的作用。
俺公司的CMMI评完了,博友会的主页爬行榜也基本做好了。揭示板,实在没有办法,于是,用了google的博客代替。基本的功能都已经做好了,于是tubomim发出了第一次通知。
挑战五:动态排序。可是很快就发现不少问题。首先,tubomim发现,爬行榜经常不出现。分析原因,原来,有的网站很慢,你发出请求,它不一定回答。这时候,俺的程序就在那里“痴痴地等”。于是,采用动态排序的方法,来一个数据就先显示它,下一个来了,比较一下投稿时间,决定是应该放在什么位置,只录取前十名——这样自然而然就是爬行榜了。
后来,又发现,顺序不一定准确。查找原因,原来,有的网站采用国际标准时,有的网站采用本地时间。于是,又要换算时间。
这一切都做好了以后,俺觉得,博友列表也不应该是固定的,而应该按“勤奋度”排序。于是,博友连接(不)完整列表,也按照爬行榜的思想改造了。不过,有一个缺点就是,俺没有办法得到文章的长短,跟贴的多少,等等数据,所以没办法综合评价。只能用更新的频度,最新文章的发表时间来排序。不过,好在爬行榜的目的只是为了阅读方便,而不是排名次。所以暂时凑合用了。
这里刚刚全部准备就绪。那边儿揭示板又出了问题。原来揭示板可以自由投稿——向投稿信箱发出电子邮件,立刻就在揭示板显示,没有审查机制。这两天一些黄色网站反复张贴一些垃圾信息。没办法,只好改变投稿方式。增加审查机制。刚才不是说了,俺用的是免费空间,没办法审查嘛。俺用了google的mailing list的审查机制。投稿信箱设置为mailing list的一个会员,于是,向这个mailing list投稿,就会自动转发到投稿信箱。但是,只有会员才可以向mailing list投稿。这样就可以决定谁可以在揭示板发消息了。
挑战六:IE和Firefox不兼容。总算解决了这些问题,刚想告一段落,突然发现,用微软的IE和用Firefox显示的结果竟然不一样!俺一直都是用Firefox调试的。比如,爬行榜,爬在最前面的,应该显示。博友列表,各个博友之间也用天蓝色的横格隔开的。而在IE上面,俺原来做的这些效果竟然出不来!
查找原因,发现微软竟然不遵守标准的javascript规格和DOM规格。该死的微软!总是作类似的讨厌的事情。于是只好加上这样的程序:
if(navigator.appName=='Microsoft Internet Explorer'){ //如果是微软
stupid=true; //stupid(愚蠢)=真
}
else{ //否则,是其他的话
stupid=false; //stupid(愚蠢)=假
}
然后后面根据浏览器是不是stupid(愚蠢)采用不同的处理方法。

6 件のコメント:

匿名 さんのコメント...

うわ、難しそうですね。
俺さんの脳みそを覗いてみたいですぅ~。
どうなっているの?

プログラムやページを作るどころか、この記事に挙げられた専門用語を理解するだけでも大変ですね。

でも、大変な作業だった事だけはよくわかりました。
本当にお疲れ様でした。
愛情を注いで作っていただいたページを大切に活用します。
WHYより

匿名 さんのコメント...

うわ、難しそうですね。
俺さんの脳みそを覗いてみたいですぅ~。
どうなっているの?

プログラムやページを作るどころか、この記事に挙げられた専門用語を理解するだけでも大変ですね。

でも、大変な作業だった事だけはよくわかりました。
本当にお疲れ様でした。
愛情を注いで作っていただいたページを大切に活用します。

匿名 さんのコメント...

ごめんなさい!
素晴らしいページにわくわくし過ぎたせいか、二重投稿してしまいました。

適宜に削除して下さい。

lhw さんのコメント...

whyさん:
谢谢鼓励。

匿名 さんのコメント...

こんばんは。T.Fujimotoです
素晴らしい大作で感動しています。真令人敬佩!

昔クロスブラウザを作った時と言えば、
navigator.appName.charAt(0)=="M"か、
navigator.appName.charAt(0)=="N"か、
でIEかネットスケープかを判定していたんですが、いまやIEの競合と言えば完全にFirefoxですね。

匿名 さんのコメント...

实在是难为我们的「俺」了,不会「踢」的尽在场外瞎吆喝,忙的「俺」老告不了一个段落。
不过这篇文章除了为「俺」的精神与付出而感动外,也学习不少新词,没准那天咱们这里出现几个「爱踢」的。欢迎经常为咱们「科普」一下。tubomi