为什么Firefox 3不能加载本地的JavaScript文件了?

一段时间来一直受这样的困扰,就是我的Firefox无法运行本地的dojo的测试文件。一直以为是我的firefox或者机器出了什么问题,就只好去使用IE或者Chrome去运行这些测试例子,可惜不能用firebug的确让人很不爽。

今天在firebug查看了一些错误情况,报错居然是“Access to restricted URI denied”。这个明显是跨域访问的错误,但是本地文件怎么报这样的错呢?在Firefox的about:config搜索了一下policy,居然找到了原因所在,原来Firefox对于本地文件也进行了同源访问的安全设置,配置参数是:security.fileuri.strict_origin_policy。这个新的设置只是在firefox 3才被加入,并且默认是开启的。不过你也可以将这个关掉,这样就可以如同以前那样运行本地的dojo测试用例,或者其它你想本地加载的JavaScript文件。

local-file-p-origin-policy

继续在google了一下,找了这个”feature”的由来,https://bugzilla.mozilla.org/show_bug.cgi?id=230606,大概是说本地的文件如果没有这样的限制,可以访问本机的其他文件,这样会造成安全隐患。John Resig(Father of  jQuery) 也有一个blog关于这个问题,http://ejohn.org/blog/tightened-local-file-security/,下面的评论也挺值得看看的。

More Links:

JavaScript中==等同运算符的类型转换

这周在给一些新员工讲JavaScript的时候,谈了==和===的区别,本质来说,===是严格的等同运算符,要求两者类型相同并且值相同;而==运算符在做比较时,会做一定的类型转换。我们在使用过程中应该使用===而不是==,因为这种类型转换后的比较往往都不是你想要的。当时列出了corckfork最喜欢一些例子:

	'' == '0'          // false
	0 == ''            // true
	0 == '0'           // true
	false == 'false'   // false
	false == '0'       // true
	false == undefined // false
	false == null      // false
	null == undefined  // true
	' \t\r\n ' == 0    // true

转换规则

当时有人就问了,那么在做类型转换的时候倒是等式的左边向右边转,还是反过来呢?其实这些都是不对的,我们去看看ECMAScript的规范,会发现它有对于等同运算符做类型转换很明确的比较算法,下面我将其翻译如下:
对于比较x==y,

1.如果x和y类型不同,那么到14步;
//
//2-13步,为类型相同的比较
//
14.如果x是null,y是undefined,返回true;
15.如果x是undefined,y是null,返回true;
16.如果x是Number,y是String,将y转化成Number,然后再比较;
17.如果x是String,y是Number,将x转化成Number,然后再比较;
18.如果x是Boolean,那么将x转化成Number,然后再比较;
19.如果y是Boolean,那么将y转化成Number,然后再比较;
20。如果x是String或者Number,y是Object,那么将y转化成基本类型,再进行比较;
21.如果x是Object,y是String或者Number,将x转化成基本类型,再进行比较;
22.其他情况均返回false;

ECMA这帮人写的算法过程比较啰嗦,简单一句话来概括就是,对于基本类型Boolean,Number,String,三者之间做比较时,总是向Number进行类型转换,然后再比较;如果有Object,那么将Object转化成这三者,再进行比较;对于null和undefined,只有x,y分别是它们时才相同,其他都为false。

另外,对于转化到Number的算法,细节可以来看ECMAScript的规范,但是基本上下面这个几个表可以覆盖大部分的内容:

type-convert to number (+col) : String Values.
“”
(empty
string)
“-1.6″ “0″ “1″ “1.6″ “8″ “16″ “16.8″
+col 0 -1.6 0 1 1.6 8 16 16.8
type-convert to number (+col) : String Values.
“123e-2″ “010″
(Octal)
“0×10″
(Hex)
“0xFF”
(Hex)
“-010″ “-0×10″ “xx”
+col 1.23 10 16 255 -10 NaN NaN
type-convert to number (+col) : Other Values.
undefined null true false new Object() function(){
return;
}
+col NaN 0 1 0 NaN NaN

再回头来看看corkford给出的例子,然后使用上面的规则去判断;

 '' == '0'          // false
//类型相同,毫无疑问,值不同,所以结果为false
 
0 == ''            // true
//String要像Number转化,''是空String,根据上面的表,转成0,所以结果是true
 
0 == '0'           // true
//String要像Number转化,根据上面的转化Number表,'0'转成0,所以结果是true
 
false == 'false'   // false
//有Boolean,转化成Number,所以第一步转化后为0=='false';
//然后'false'向Number转,结果是NaN,最后变成比较0==NaN,那么肯定是false。
//(NaN和任何相比都是false,就算是自己也是false, NaN==NaN //false)
 
false == '0'       // true
//有Boolean,转化成Number,经过第一次转化就成了0=='0';
//就变成了上面的第3个例子,所以是true
 
false == undefined // false
//对于undefined和null,只有两边分别是两者才是true,其他都是false;所以是false
 
false == null      // false
//对于undefined和null,只有两边分别是两者才是true,其他都是false;所以是false
 
null == undefined  // true
//对于undefined和null,只有两边分别是两者才是true,其他都是false;所以是true
 
' \t\r\n ' == 0    // true
//对于String,先转成Number,对于空String,都将转成0,所以转化后成为0==0,结果为true
//(注意,空字符不仅仅是只是空格,还包括\t\r\n等等,更多可以见ECMAScript spec的9.3.1)

总结

虽然我们了解了==这个坏东西的本质,但是在我们的实际JavaScript编程中是要避免使用==,而是去使用===这个严格的比较运算符。

最近的一篇新的developerWorks文章 – 使用 Assemble Flow 开发简单协作流程

终于这篇文章在dWs上面发表出来了。
使用 Project Zero 和 WebSphere sMash Assemble Flow 构建 Mashup 应用,第 2 部分: 使用 Assemble Flow 开发简单协作流程

–文章摘要如下

在使用 WebSphere® sMash 中的 Assemble flow 来构建 Mashup 应用的第 1 部分中,我们介绍了 Assemble flow 的基本概念,以及如何使用 Assemble flow 来实现基于 Feed 的 Mashup 服务。本文中,我们将向您介绍如何使用 Assemble flow 来开发简单的协作流程。

–文章目录如下:

本文内容包括:
引言
开始之前
在Assemble flow中访问REST资源和服务
面向 REST 的流程接口
使用 REST 风格实现流程会话
简单人工协作流程
webUI 活动
使用 webUI 活动构建人工协作流程
配置 sMash 应用程序
结束语
下载
参考资料
作者简介
对本文的评价

–另外,发了另外两个blog在projectzero的中文博客上面;

关于‘行’与‘你怎么知道’

周末参加了一个opug的一个线下,真的很棒,收集到更多资料后,我会在后面的文章中来专门谈这个活动。其实活动之后我一直在琢磨在活动中给我触动的一件小事,记得当时有一位嘉宾说了一个观点后,我立刻机械地说“对”,坐在我对面的长城同学的反应是”你怎么知道“。其实道理很简单,对于观点你应该有一个什么样的正确的直觉反应。做技术,甚至无论做什么,都应该有一个怀疑和刨根问底的思维方式,这样才能很好的培养对于问题的独立思考能力。

嗯,对于你不知道的东西/观点,多问点为什么,别让‘对’/’行‘成为自己的第一反应。

怎么用twitter?

09年是year of twitter, 这个东西现在火的一塌糊涂,google和facebook对它是羡慕的不得了。国内IT圈中也是刮起了一阵twitter风,好像你没有个twitter都不好意思和别人打招呼。但是当你屁颠屁颠地在上面发点东西的时候,也同时也被大量的信息噪音给淹没。有的人用twitter在聊天,有的人发布的信息非常多但是毫无意义,慢慢地这个东西成为了一种负担。其实twitter火起来有它的原因,但要看怎么来用了。

twitter来至一个简单的想法,告诉别人你在做什么。现在有很多的工具来帮助人们进行交流,比如blog和IM,但是日常发生在自己身上的一些事情使用这样一些工具都不太适合。我们不可以发一个blog告诉别人我在做什么,也不可能在聊天工具上面像疯了似的给每个人发这些消息。然而通过twitter,人们可以进一步加深相互的了解。比如,我的一个好朋友发消息说他在做一道菜。我看到后,很好奇他居然还会做菜呀,于是我们有了公共的兴趣点,可以进一步地聊聊。

从技术上面来讲,twitter的火爆说明了开放API的成功。有了twitter提供的API,就有了它的客户端的繁荣,桌面的、浏览器插件的、手机的….任何平台任何环境,只要你想到的都可以找到一堆的twitter客户端。 如果twitter没有这些多的客户端和社区支持,估计也难以流行起来。

话说回来,怎么用twitter呢?我想可以从两点来看,一是你希望收到什么消息;二是你应该给出什么样信息。关于收到什么消息,基本的原则应该是:只follow你所关心的人和事。前端日子follow了很多技术名人的twitter,发现他们发的信息根本都不是我关心的。我并不是他们的朋友,我根本不关心你和谁吃饭了,你今天去哪里运动了。所以很简单,将你并不认识的名人从你的follow列表中删掉,因为你对这些名人其实真正关心只是他的知识,而这些只要订阅他们的blog就可以啦。对于技术和某种事情的关注,follow这个社区的twitter就好了。另外对于那些乱发垃圾消息的人,删除好了。这个世界不是信息太少,而是太多了。

那用twitter应该发什么样的消息呢?我想原则应该是:只发有用的信息,并且这个信息不需要通过其他消息的上下文就能理解。如果是个人还是用twitter的本意就好了,就是发你在做什么,或者发现什么有意思的事情。社区类的twitter可以发当然社区发生重要的事情。切忌使用twitter进行聊天了,因为follow你的人并不一定follow了和你聊天的朋友,所以这些没有上下文的消息就毫无意义。

最后我想到了一位美女同事对于twitter的理解,twitter的消息就像一种缘分,你看到了就是一种缘分,不需要像聊天那么有紧迫感,也不像blog那么正式所以还是一切随缘吧

Enable Gmail Random Signature using Google App Engine

在GMail的Lab中有这样的一个小东西,它可以随机地加入签名档到你的邮件中。这个一直是我想要的,于是在五一无聊的时候试试。

首先当然是要到GMail的Lab中enable这个功能了。

enable1

这个时候到Setting->General中的Signature中会多出这么一个东西,

setting

默认是http://www.brainyquote.com/link/quotefu.rss这个地址,这个时候当你新建一个邮件,就会发现有签名档随机插入到邮件中。但是这个并不是我想要的签名档,我需要它是从我自己的签名档列表中去找。这个功能的签名档的信息是由一个RSS来给出的,那么何不使用Google App Engine来做一个自己的签名档管理的小系统,这样我可以加入自己新的签名档,然后还可以提供签名档的RSS给它呢?

说动手就动手吧,很快就完成了。http://liwb-quote.appspot.com/。界面是抄twitter的,因为我的功能的确就是和它一样。我不得不说,在App Engine上面开发这样的应用的效率是惊人的。我很久没有动python了,App Engine的东西也是边看它的tutorial来完成的。但是我还是没有碰到太多的障碍就完成这些事情。看截图吧。

quote

然后再是提供RSS就可以了:http://liwb-quote.appspot.com/rss。 再将这个地址放到gmail中设置就可以了。嘿嘿,当你再新建一个邮件的时候,签名档就是你在appspot上面的自己的了。是不是很high呢?

Conclusion

App Egine来开发这样的应用的效率是极高的。无非是数据库的一些操作,开发、调试和上线的体验只有用过才知道是如何的high。

另外,Gmail中的Random Signature还是非常不成熟,它并不是实时地去拿我当前的记录。也不知道它多久抓一下,这点让人沮丧。

Download

这个是我的App Engine的工程,如果你管理自己的签名档或者类似一句话的东东,这个都可以用。

下载App Engine应用

一些注意事项:

  1. 下载后,修改app.yaml 文件中的application: {{ 你的应用名字  }}。
  2. 在main.py中需要把users.get_current_user().email()==’wbinglee@gmail.com’改成你自己的email,因为我让只有本人才有添加的能力,其他人只有浏览的权限。
  3. 然后appcfg.gy update 就好了。


在Beijing OpenParty

今天是第二次参加OpenParty的活动了。第一次参加时联系好了,还以为过去时讲东东,结果情况也不是我们预料的那样,最后的情况不是我们所想的但是依然收获颇丰,知道了有这样一个社区,认识了很多有意思的人。

这次的活动更是精彩了,顺着QCon的风,请到了一些业界的大拿们到这里给大家讲些东西。周5的晚上还在和朱可商量说,我们就不要讲了,这么多好的topic我们可以去听,就没有别要自讨没趣了。

听的第一个是hongqn谈douban的技术架构的发展,从douban最早的1.2M/D到23M/D所遇到的问题以及处理相应的解决办法。简单来说就是兵来将挡,水来土掩。非常敬佩他们对于技术的全面性,而现在我们每天只在实验室做点自己的那点事情,其实还是不了解一个真正运行的系统所涉及到的东西是如此的繁多和复杂。在听的时候,我一直在想这个问题,如果云计算足够的成熟,这些网站所面对的这些技术架构(主要是性能)上面的问题还会是一个如此巨大的问题吗?一个网站需要一个十几个人团队不断维护,这个太过于浪费。期待云计算的不断的成熟,也许那一天我们不需要让每个网站都需要经历这样一个技术架构上面的不断挑战。

第二个非常有用,来至解放军总医院的来要水(别问我,名字的确很怪,我也想问,但是觉得不礼貌),讲了程序员颈椎治疗秘籍,:) .从里面的确学到很多有用的东西。完后帮我老爸(他颈椎非常严重)问了一些问题,学到很多,等搞到ppt了给老爸发过去,让他也好好学习一下。

下面听的就是周爱民讲软件架构,非常的high level,好处就是让你能够站在更高处去思考问题,问了很多问题,周老师也是耐心解答。每次我举手,周老师过来说,”好,有什么问题?“,呵呵,弄的我很紧张。发现他和老毛不是一个风格,大师们的共同点就是能够对问题深度思考并且抽象,不过老毛的交流风格是彪悍的,周老师的是温和的。坐在下面我在想,做小兵的感觉很不好,如果我在未来的十年还是做IT技术的话,那么我希望我至少能有一次和世界级大师像Martin Fowler,James Gosling等 同台一起做技术讲座,如果你没有影响力,这是不成功的。

最后听了糖醋鼻子讲卡片机摄影,开始大家讨论了半天美学,修养的话题,呵呵。也学到了很多一些基本的技巧,对于我这样的摄影白痴很有帮助,收获很大。

总之,收获,收获很多。以后要继续参加这样的活动并且贡献自己的所学所想。BTW,我一定要去找公司印名片了,出去没有名片太丢人了。

附两张上次参加活动的图:

I am Still Alive

恩,我的确还活着。我快有3个月没有发一个新的文章了,草应该长的很深了,不过不要紧,冬天不怎么长草, :) 。那么我都在做些什么呢?我还是工作在ProjectZero上,现在project采用新的Agile的方式进行开发,适应也是学习的过程。准备在社区做更多的事情(article,seminar,speech…),希望能有更多富有成效的合作,总之希望在09年会是一个有收获的一年。

另外一件值得提一提的事情就是,我的羽毛球技术大涨。自从每周六都要和研究生同学聚聚打2个小时的球,相互交流切磋,真是学到了不少。不过还是总是被ll以绝对优势赢,可以提高的地方还有很多。:)

还有,我现在住的地方人是越来越多。只从xg同学搬过来,生活简直又上升了一个档次了。一伙人可以喝点茶(我最爱普洱),可以看点书,可以聊点天,可以一起笑哈哈地看海绵宝宝或者喜羊羊,可以做点菜然后相互抬举或者相互鄙视之,可以一起研究如何养龟(到现在还木有看到龟吃东西,不知道这次是否能活过2个月),还可以一起打麻将… 而fr博士同学被我成功骗到了CRL,7月份入职后会更加的热闹一点。希望能租到一个大房子,4居or超大3居,或者复式的。总之,朋友要在一起才快乐。

春天来了,一切都应该不一样。

你的website也social了吗?

如果你访问我的website,你可能注意到我的页面中多了两个小东西(我们一般叫gadget),通过它们,你可以加入我的website、看到所有的人、加他们为好友、或者可以留言。嘿嘿,看,我的website也成为social了哦。(一定要给面子加入到我的website,:),)。不过感觉比较遗憾的一点是,朋友之间不能相互地发message,是我漏点了什么吗?

这就是Google Friend Connect所提供的能力,你只需要copy/paste它提供的HTML到你的页面中就完事了。是不是很简单呢?

Google的确在兑现它的承诺,让所有的website都能容易加入social的能力,并且还是使用最基本的东西(HTML/Javscript)。年初的时候在讲什么OpenSocial,觉得挺玄乎的,并没有搞懂这个东西到底怎么折腾到我的website,也懒得去研究它。现在Friend Connect可以说是提供了一个平民化的social方式 – Copy/Paste HTML总会了吧, 2分钟搞定。

OpenSocial就是提供了一堆的API来帮助你构建你需要的Social能力。当然这个对于需要social能力的商业网站是可行,能力很强,干啥都可以。而Friend Connect就更进一步了,就是将OpenSocial的能力平民化。通过使用OpenSocial的API写相关的OpenSocial gadget,你就可以通过Copy/Paste的方式加入各种各样的gadget。Cool?YES.  当然Friend Connect另外提供了一些基本的login,管理的能力。

看看几个简单的OpenSocial的API (当然就是JavaScript的):

  • API: opensocial.DataRequest.newFetchPersonRequest('OWNER')
    Site Name: 李文兵的主页
  • API: opensocial.DataRequest.newFetchPeopleRequest('OWNER_FRIENDS')
    Site Members:。。。。
  • API: opensocial.DataRequest.newFetchPeopleRequest('VIEWER_FRIENDS')
    Viewer friends:。。。

是不是很cool?你是不是也想抄起code写点东东,呵呵。 当然你也可以找些你喜欢的OpenSocial gadget来用就可以了。http://opensocialdirectory.org/.

未来的mashup会怎么样呢?还有多少infrastructure的东西都被google给占了? 期待&反思。

实在是喜欢新版本WordPress

WordPress总是给我带来一些小小的惊喜,刚刚更新到2.7,居然有如此大的变化。

  • 超cool的界面,合理的布局,新的layout,适应各种resolution让我吃惊。不过以前的theme也挺爽的。有时候觉得wordpress就像美女一样,换肤就像换时装一样,需要时髦,嗯。
  • 支持gears了。对我的使用上带来的好处还是非常大的
  • 能够自动更新了。这点非常赞。以前总是提示你要upgrade,我总是要做一系列的事情。现在点个button就可以了。Love it!
  • 导航条可以折叠,关键是缩起来超炫。
  • 每个page的各个module(categories,tags…)都可以拖拽来调整位置。不过因人而异,默认位置就很好了。

如何?一起来感受美妙软件带来快乐吧。

wordpress27