Windows 7边栏小工具-Gmail Notifier-查收Gmail

没想到这个工具还有几个用户,还很认证地给我发邮件提一些建议,这几天抽空做了一点小修改,同时也修复了几个小bug。

新的LOGO:

设置里面会多出一个选项:当没有新邮件的时候,点击图标是否打开Gmail页面,默认是不打开的。

下载地址:gmailnotify-0.2


国庆呆着无聊的时候,折腾了个Windows 7的边栏小工具,用来及时查收Gmail,可自定义收取时间间隔,预览Gmail邮件内容,有新邮件时会有提示音通知。截图如下:

呆在边栏时的状态:

预览Gmail邮件:

参数设置:

工具下载地址:

点击此处下载

不安全的js写法

一种很常见的写法:

document.write('<scr'+'ipt src="http://a.com/b.js" type="text/javascript"></scr'+'ipt>');

直到被杀毒软件提示有恶意代码才发现这也是不安全的,汗……

那就只好改成这样了:

(function() {
    var s = document.createElement('script');
    s.type = 'text/javascript';
    s.src = 'http://a.com.cn/b.js';
    document.getElementsByTagName('head')[0].appendChild(s);
})();

搜了一下,原来还有“邪恶”的eval,具体可以看这里:网马解密大讲堂——网马解密中级篇(Document.write篇)。…

全新极速CSS选择器引擎whiz

好不容易有些空余时间,便拿来写自己的CSS选择器引擎了,这个CSS选择器引擎的目标只有三个:

  • 速度要快
  • 代码要精简
  • 要支持CSS3的选择器。

希望通过这个,能够真正理解那些牛逼的框架中的一部分,比如jQuery,Mootools,YUI等等。花了接近三个星期的时间,大重构了三遍,从最开始的速度极低到现在的极速,每一次都是大换血。在这个过程中,我看到了那些大师写代码的境界,即使我完成了这样一个东西,代码依然很难看。要做一个CSS选择器并没有你想像的那么难,也并不复杂。

大家可能看完性能测试才会有兴趣,下图是一个较全的性能测试结果,大家可以在这里测试,大家可以自己跑一跑看(由于加载的东西较多,请耐心等待一会儿再点start按钮)。

代码量目前还没达到我满意的程度,不过已经足够小了,Gzip之后仅仅只有2KB(YUICompressor压缩之后为8.61K(win NTFS)),另外,针对Firefox 3, Opera…

背景图片千万不要gzip压缩,尤其是PNG

我们网站的静态资源(css、js和背景图片)和web应用程序是分开部署的,几乎所有的静态资源都部署在同一个应用下。最开始的网站很简单,对所有的静态资源都进行了gzip,包括所有的css,js,图片,flash等等,也一直相安无事。

直到……直到有一天用了png做背景图片,并且上传到服务器进行部署,发现在很多IE6都会在这个页面卡死,无法动弹,出事的几率非常的高。但是在内网部署的没有任何问题,那问题就只能比较内网和公网的服务器环境了。观察HTTP请求头部是个不错的方法,很快锁定是由于gzip的png引起的。内网服务器加上gzip测试,果然如此。

其实对图片等文件进行gzip是完全没有必要的,原因很简单:在web里面用作背景的图片99%以上都是gif或者jpg或者png,这些格式本来就是压缩过的,再用gzip对他们进行压缩只是徒增服务器负担而已。…

用书签压缩你当前访问的页面地址

正式开始twitter了,我的twitter地址是:http://twitter.com/xushengs,欢迎加入!

由于twitter的字数有限制,因此把长URL压缩成短URL是非常非常必要的。不过,你是不是因为压缩的工作而烦恼,要复制地址,然后粘贴,然后再复制,再粘贴?用书签来替你完成前面的工作吧!

把下面的这个地址拖到你的书签栏就OK了:

Compress URL

如果不能拖到书签栏,请新建一个书签或者把当前页面加入收藏,然后更改这个书签的属性,把URL地址更改为:

javascript:void(function(){var r='http://is.gd/api.php?longurl='+encodeURIComponent(location.href),x=function(){if(!window.open(r,'ShortURL','toolbar=0,resizable=1,scrollbars=yes,status=1,width=320,height=240'))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()

关于Math.PI、前自增和后自增

有这么一个题目,说bt其实也不bt,为了重点突出其中的意图,特意加上了括号:

var a = (++Math.PI);
var b = (Math.PI++);
var c = Math.PI = (++Math.PI);
var d = Math.PI = (Math.PI++);
var e = Math.PI = (Math.PI + 1);

执行完后,a、b、c、d、e的值分别是什么呢?如果学校里学的C语言基础好的话,应该可以知道答案。你不妨先写下答案,我们再来看看ECMA的规范。

在ECMA-262中,对于Math.PI的说明是这样的:

15.8.1.6

The number value for π, the ratio of the circumference of a circle to its diameter, which is approximately 3.1415926535897932.

This property has the attributes { DontEnum, DontDelete,

Maxthon傲游3默认使用WebKit引擎(附下载)

Maxthon 3已经第三个内测版本显示,默认使用WebKit殷勤渲染页面。WebKit的页面渲染速度非常快,WEB标准的兼容性也非常好,Apple的Safari和Google的Chrome均是使用该引擎。

使用WebKit渲染页面时,傲游称此为“极速模式”,同时还提供了一个“兼容模式”,这个兼容模式使用的是IE7的渲染引擎。极速模式下对应的UserAgent为:

Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/528.4 (KHTML, like Gecko) Maxthon/3.0 Safari/528.4

兼容模式下的UserAgent为:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR

在IE下获取object(ActiveX)的Param

在IE下,获取Param的时候有个诡异现象(不知道算不算bug)。为了清晰起见,下面用最简单的HTML和JavaScript来说明。有这么一段HTML(head部分是标准的head,doctype使用xhtml-transitional的DTD):

<body>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="100%" height="100%">
  <param name="movie" value="Test.swf"

在Chrome下使用User Scripts和豆瓣插件

首先要解决Chrome下使用User Scripts的问题。这个功能在Chrome 2中已经支持了,不过没有开启,要自己手动开启。这个教程很多,整理一段在这里:

1.安装最新的Chrome 2

以下是下载地址,随便挑一个吧:
http://download.tech.qq.com/soft/1/2/45974/index.shtml
http://www.google.com/intl/en/landing/chrome/beta/

2.切换Chrome到dev分支

下载chrome channel switcher即可,下载地址:
http://download.pchome.net/internet/browser/companions/detail-142198-0.html

提示:如果切换到dev版本后不稳定(目前为止,我这里还没出现过异常情况),还可以通过这个方式切换回来。

3.建立User Scripts文件夹

利用GAE&Google Gears做了一个简单的AJAX代理

做这个的起因很简单:我喜欢用Google Chrome,又喜欢逛豆瓣Google Chrome支持User Scripts了,但是我写的那几个插件在Chrome下又跑不了。因为Google ChromeGoogle Gears,据说可以跨域Ajax,于是弄吧!结果越弄越复杂,因为Google Gears的跨域也是有很多限制的,看来还得服务器跑,还好有Google的App Engine,继续弄下去吧!

当然了,现在这个仅仅只是为Google Gears服务,写的很简单,不过还是比较“Ajax”的,看看简单的示例代码:

<script type="text/javascript" src="gears_init.js"></script>
<script type="text/javascript">
    var options =