So, people who make conferences: listen up. I think that there are lots of sysadmins and ops people who would go to a conference solely about web operations.

John Allspaw

今年的网志年会已经开始筹备了,这一次,我们能不能做一个真正的有纯技术(开发,运行,维护等)话题和参加者的年会呢?

我个人想感兴趣的话题:

  • 开发的平台,框架和工具,SCM的环境的选择;
  • 网站性能优化;
  • 技术团队的成长;
  • 技术趋势(Atom, OpenID, REST, Microformats等)的演示;
  • 好玩的新技术;

如果真的能够有完全让技术人员感兴趣和交流的演讲和讨论,相信年会的影响力和凝聚力会更大提高,而我也会争取让我们团队和认识的其他程序员一起去参加。

为了更方便阅读网页(“Improves readability”),有人专门针对Lifehacker.com(我每天必看的网站)页面写了个Greasemonkey用户脚本,把多余的页面元素删除掉(“Removes various elements from the Lifehacker site”)。

猜猜看Lifehacker的反应是什么?

It removes too many elements of the site’s design, but this custom Lifehacker user style is still a compliment. You like us enough to mod us!

稍微有点不满意(删除掉太多页面设计元素了),但这对Lifehacker.com还是一个认可,因为用户喜欢Lifehacker到了改装页面(mod的感觉没翻译出来)的地步。

所以:

  • 如果有用户用user script改装你的页面,那这是一件好事情(你提供了他们不愿意放弃的内容),同时也是一件需要考虑的事情(页面设计也许太花哨或者色彩搭配不够好);
  • 页面的mark up不能太复杂,否则user script不好写 ;)
  • 页面的mark up不能经常变动,否则user script会失效;

这就让我想起几天前看到的一句话:

Your Markup is an API. With all the hype about APIs and mash-ups, it’s easy to forget that your HTML is also an API, and your users are experimenting with it right now.

Matthew Magain

但页面设计和编写的重要性绝对不仅仅在为了考虑用户使用Greasemonkey user script(毕竟这样用户比例特别小),在结构化的数据的发布和读取上,尤其是microformats的推广更是证明了“页面是API”。下一个版本的Firefox,Firefox3.0,已经在考虑集成对microformats的支持,这里有一些Firefox3在支持microformats的用户界面设计模拟图,已经包括hCard, hCalendar等格式。

话说回来,无聊一下,如果写Greasemonkey user script来改装网页,你会改装国内的哪个网站?怎么改?

REST @ 06 June 2007, “No Comments”

Q: What’s the difference?

A: A mime-type.

Joe Gregorio

Although things have been pieced and formed up together in my mind for months, still have to say, it was one of aha! moments when I read that.

Further reading:

tools @ 22 March 2007, “No Comments”

为了能够在blog里显示代码,一直没有找到理想的解决方案,因为没能满足以下三个要求:

  1. 能够根据语法高亮或者着色;
  2. 不在代码里添加内嵌的css代码;
  3. 没有副作用(比如第二点,在代码里直接插入渲染的代码,要修改可能就比较麻烦),包括增加服务器的压力;

今天找到一个满意的方案:google-code-prettify,很好地满足了前面三个要求,使用方法很简单

当然,如果在RSS阅读器里看代码,是看不到语法着色的(这是第二个要求的代价);如果浏览器关掉了Javascript,也看不到(这是第三个要求的代价)。

例子:

PHP:


require_once 'Url/PathVars.class.php';
...
require_once 'View/SearchPage.class.php';

class Controller_Dispatcher
{
	public static function handle_request($url)
	{
		$pv = new Url_PathVars('/');
		
		// TODO:this is ugly, got to change it
		if (substr(strtolower($pv->fragment), 0, 8) == '/search?')
		{
			self::handle_search_request($pv);
			return;
		}
		switch ( strtolower($pv->fetchByIndex(0)) )
		{
			case '':
				self::handle_default_home_request($pv);
				break;
			case 'people':
				self::handle_people_scope_request($pv);
				break;
		...
	}
}

Javascript:

window.addEventListener(
		"load", 
		function() 
		{
			twsstopper = new TWSStopper(window);
			window.twsstopper = twsstopper;
			twsstopper.startUp(window);

		    var appcontent = window.document.getElementById("appcontent");
		    if (appcontent) 
			{
    		    if (!appcontent.TimeWastingSiteStopper) 
				{
        		    appcontent.TimeWastingSiteStopper = true;
	            	appcontent.addEventListener("DOMContentLoaded", twsstopper.onAction, false);
    	    	}
			}
		}, 
		false);

bash:

cd $TMP_DIR

if [ -f "chrome.manifest" ]; then
  echo "Preprocessing chrome.manifest..."
  # You think this is scary?
  #s/^(content\s+\S*\s+)(\S*\/)$/\1jar:chrome\/$APP_NAME\.jar!\/\2/
  #s/^(skin|locale)(\s+\S*\s+\S*\s+)(.*\/)$/\1\2jar:chrome\/$APP_NAME\.jar!\/\3/
  #
  # Then try this! (Same, but with characters escaped for bash :)
  sed -i -r s/^\(content\\s+\\S*\\s+\)\(\\S*\\/\)\\s*$/\\1jar:chrome\\/$APP_NAME\\.jar!\\/\\2/ chrome.manifest
  sed -i -r s/^\(skin\|locale\)\(\\s+\\S*\\s+\\S*\\s+\)\(.*\\/\)\\s*$/\\1\\2jar:chrome\\/$APP_NAME\\.jar!\\/\\3/ chrome.manifest

  # (it simply adds jar:chrome/whatever.jar!/ at appropriate positions of chrome.manifest)
fi

BAT?:

xcopy build\skin build\chrome\skin /i /e
...
rmdir /s /q build\locale
rmdir /s /q build\skin
 
cd build\chrome
7z a -tzip "%x%.jar" * -r -mx=0
cd ..\..

一直热情支持OpenID的Zola在呼吁给OpenID起个中文名,因为:

OpenID是为广大网民服务的,支持OpenID能让服务提供者和网民都得到好外,需要推广才能让广大网民尽早享受到这一个新东西。

像一个场景:在网吧,去问一个正在玩跑跑卡丁车的人有没有OpenID,他会怎么想?如果我问他”有没有可以作为用户名的网址”会不会更容易让他明白我在问什么?

Zola的另一个理由是不能让又(我为什么说又呢?)一个词被垃圾译法给劫持(这字眼是俺用的)了。

伍岭老师(真的是老师)认为没有必要

用户最关心的,是服务是否满足需要,而不是好听的名字;服务有效,再生造的外文词汇也可以琅琅上口;服务低能,再典雅的中文名字也玷污口舌。

更何况OpenID这个单词本身已经足够便于理解,而但凡连这个词都理解不了的用户根本不会关心OpenID。

我还没想好OpenID在大陆的推广和发展是否需要中文名,倒是刚刚想到一句台词:

“IP卡,IC卡,IQ卡,统统告诉我密码。”

《天下无贼》里这句台词出现的时候,大家都笑了。

笑了就说明大家都听懂了。

是否要给OpenID一个中文名,如果要的话用什么,我想还是依靠大众的智慧(The wisdom of crowds)来决定吧。OpenID的推广,有个准确的约定的中文名称也许重要,但更重要的还是用中文来准确、清晰、简单、易懂地解释给普通网民,即使他只是个“在网吧正在玩跑跑卡丁车的人” 。

谁来试试看?:-)

Tech, tools @ 03 February 2007, “2 Comments”

我的电脑一直是用Linux和Windows双启动,Evolution是在Linux上的email客户端,现在打算换成Thunderbird。其实Evolution没什么特别不好用的地方(除了更占内存,偶尔崩溃等小麻烦外),可以继续用下去。只是现在打算windows和linux下都用同一个email客户端,方便管理(导入导出备份等),Thunderbird就是最好的选择了。

除了跨平台,TB最大的功能就是扩展,跟firefox一样,强大的扩展性可以说是它们的killer feature。现在在用的有:

比较有趣的扩展是Display Mail User Agent,它会显示发件人所用的email客户端软件的logo,用了它才发现原来有那么多以前都不知道的email客户端软件。

另外值得一提的是TB的垃圾邮件过滤也做得不错。

现在Evolution最让我怀念的功能是unmatched vfolder,希望将来TB上也能有这样的功能,或者有扩展提供这个功能,实在不行,自己写一个也不是不可能。

Tech @ 23 January 2007, “5 Comments”

应该说Mozilla 产品线(包括Firefox,Thunderbird,Sunbird/Lightning等)能否成为客户端开发的平台?

想到这个问题是因为正好工作上的项目有可能要开发一个客户端,首先想到的几个可能的选择:

  1. Win32应用,在福州倒是不难找到熟练的Delphi工程师,开发应该也很快。但感觉有点落后,另外团队里没有熟练的Delphi/VB程序员,也未必有兴趣去学,开发上的经验和代码也不大可能能在将来的项目上用到,为这个客户端专门招聘一个工程师也说不过去;
  2. Java Swing,优点是工程师们已经熟悉Java了,而且跨平台(okay,就算是了)。缺点是团队除了我自己在上个世纪的经验(几乎忘光)之外没有多少Swing实战经验,其次Swing应用未必是那么容易开发而且慢和占内存(据说Java6进步很大,还没时间研究),然后还有个部署(首先就是得在客户机器上装JRE)的问题;
  3. .NET Windows Forms,.NET framework现在在很多电脑上都有了(吧?),开发上C#与Java很接近,中文资料文档网络上下也很丰富,开发速度(考虑prototyping等过程)也不会慢,虽然开发过程中积累的经验和代码在将来“或许”还有用,但还是要程序员去把.NET捡起来。

然后突然想起,这个客户端是否可以考虑用Firefox的扩展来做呢?想到的优点有:

  • 工程师熟悉Javascript, CSS,实际工作中其它项目里天天在用;
  • 界面开发上XUL不难,也不算难看;
  • 绝对的跨平台(从Unix/Linux,Windows,到Mac);
  • 成熟的安装,更新机制(这点很重要);
  • 数字签名机制;
  • Firefox的一些扩展(Firebug,Console2,Extension Developer,Javascript Debugger等)结合起来提供了足够好的开发环境;
  • 对程序员来说,应该更有趣味性和挑战性,而且没有浪费(见第一点);
  • 扩展很轻小;

当然,这个项目是否能用Firefox要看最终用户能否接受(也许最终还是选择前面说的三个选择之一)。重点是对我来说,项目开发里客户端的开发和部署方案又多了一个值得考虑的选择,虽然这个方案解决的问题有限,不能满足或者适合所有客户端的需求(比如需要连接本地关系型数据库,哦,等等,改用XML+XPath+XQuery?… )。

对了,还有一个好处:推广Firefox!:D