nodejs编译时的错误:zlib.h: No such file or directory

Error information as below when doing “make”.

Problem:

Waf: Entering directory `/root/node-v0.6.14/out’
DEST_OS: linux
DEST_CPU: ia32
Parallel Jobs: 1
Product type: program
[18/34] cxx: src/node_zlib.cc -> out/Release/src/node_zlib_5.o
/usr/bin/g++ -pthread -m32 -g -O3 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_FDATASYNC=0 -DARCH=”ia32″ -DPLATFORM=”linux” -D__POSIX__=1 -Wno-unused-parameter -D_FORTIFY_SOURCE=2 -IRelease/src -I../src -IRelease/deps/http_parser -I../deps/http_parser -IRelease/deps/uv/include -I../deps/uv/include -IRelease/deps/uv/src/ares -I../deps/uv/src/ares -IRelease/deps/v8/include -I../deps/v8/include -Ideps/v8/include ../src/node_zlib.cc -c -o Release/src/node_zlib_5.o
../src/node_zlib.cc:28: fatal error: zlib.h: No such file or directory
compilation terminated.
Waf: Leaving directory `/root/node-v0.6.14/out’
Build failed: -> task failed (err #1):
{task: cxx node_zlib.cc -> node_zlib_5.o}
make: *** [program] Error 1

Solution:

Check whether there is the zlib1g-dev installed. If not, installing zlib1g-dev . Rebuild and then it’s ok.

IE6下gzip开启后,JS不执行的BUG

最近又遇到了这个问题,因为只有一小段 JS,就直接写在页面内了,没有外链 JS。测试的过程中就发现,IE6 下 JS 没有执行。

Demo:

原因:

当 HTTP header 里输出了 Content-Encoding: gzip 后,即使同时设置了 Cache-Control: no-cache,这个文件也将会被缓存住,并且不执行。目前受影响的版本是 IE5.5 及 IE6

微软官方说明见这里:http://support.microsoft.com/kb/321722

最后的解决办法:分离 JS,让 JS 文件开 gzip,但是缓存,JS 文件的更新用版本号来控制

IE6 下设置 document.domain 后的一个 BUG

本文描述的是,继上次的《IE 判断是否设置 document.domain》后,又一则关于 IE6 的 document.domain 相关问题。

今天得到看点同事的反馈,IE6 下看点部署的 SUDA 有 JS 报错,根据浏览器提供的错误信息,定位到了错误位置,是 SUDA 一启动读取了 window.location.href,但此时的报错是没有权限。

仔细查看了一下,看点里设置了 document.domain = ‘kandian.com’;用 Fiddler 替换去掉这个 domain 设置,SUDA 不再报错。

经仔细查验,发现了 IE6 重现此异常的规律,必须满足两个条件:

1、当前页面的 location.host 和 document.domain 要设置的是一样。

例如:http://kandian.com/play.html 设置 document.domain = ‘kandian.com’;。在 http://www.kandian.com/play.html 设置 document.domain = ‘kandian.com’; 不会触发

2、在设置 document.domain 前,已经读取过一次 window.location.href;

这两个条件都同时存在的情况下,就出现了这个很诡异的 BUG。

解决的办法:

1、用 document.URL 替代。

但 document.URL 是只读的,不可写入。如果 domain 设置后读取 window.location.href,并不会通过 location.href = ‘XXX’ 来改变 URL,这是可行的。

2、打破规则。比如把 document.domain 的设置放到最前面去,先于第一次操作 window.location.href。

不过,document.domain 设置后的安全隐患还是很大,建议技术方案中能不用 document.domain 来解决跨域问题,就尽量别用。哪怕让后台同事做一个透明代理呢。

Firefox 和 Chrome 下金山词霸屏幕取词插件的罪孽

最近开启 Firefox 或者 Chrome 后,Fiddler 会不断抓包到一些 502 请求,比如 Firefox 下就是 http://127.0.0.1:35000/firefox/requestgrab/,一直不明白是为啥,今天总算找到了罪魁祸首

Chrome 下如果安装了,也需要禁用:主菜单->工具->扩展程序里

Fiddler 跟踪 Android 数据包

随着 HTML5 的急速增长,现在越来越多的人,开始涉及到移动终端的 Web 开发领域,但手机端始终没有 PC 端这么多的调试工具。即使 PC 端浏览器模拟 user-agent 进行开发,也可能会发生移动终端和 PC 端浏览器渲染不一致的问题。

所以,最好还是在真正的手机端开发调试,但,怎么抓包呢?

今天,就向大家介绍 Fiddler 如何抓取 Android 手机浏览器上的数据包。

众所周知,Fiddler 是通过代理来实现数据捕获的。对 Android 手机来说,也是通过将网络连接的代理指向 PC 机的 Fiddler 端口,来实现数据包的拦截。

下面,我以我的一次实践为例,向大家介绍如何操作。

环境:Windows7、moto mb860(android 2.3.4)

1、首先,确保安装 Fiddler 的电脑和手机在可以互相访问的局域网内。因为要将手机的代理指向 PC 机,不能互相访问是不行的。

2、Fiddler 开启远程连接。Fiddler 主菜单 Tools -> Fiddler Options…-> Connections 页签

将允许远程电脑连接打勾;上面的的端口号无需改变,保持默认即可。

打勾后,请重启一下 Fiddler,这一步很重要。

3、在设置手机的代理之前,我们需要先获得安装 Fiddler 这台电脑在局域网内的 IP。在手机上设置代理服务器的时候会用到,开始菜单打开运行窗口(快捷键 Win + R),输入 cmd 回车,进入 Windows 命令行工具,输入 ipconfig 回车,结果形如下图:

你实际的局域网 IP 肯定跟我的不一样,不过不用担心,你把这个 IP 地址记下来。

3、现在,我们需要设置手机的代理。

打开系统设置

进入无线和网络模块

进入 Wifi 设置

找到当前正在使用的 Wifi 连接,长按会出来快捷菜单

选择“修改网络”,或者“代理服务器”,进入编辑界面

将使用代理服务器打勾,并填上刚才在 PC 机上 ipconfig 获得的 IP 地址 192.168.1.105,端口号填 Fiddler 默认的 8888

代理例外地址不用管了,留空吧。

点保存,就完成了代理的设置。

现在,我们就可以尝试下配置是否好了,打开遨游浏览器

输入一个网页 http://ming.sinaapp.com,试试看

与此同时,我们看看 Fiddler 上的数据抓包结果吧

bingo,成功啦

MS Onenote Mobile for Android

  Onenote 是微软 Office 套件中的笔记神器,用来日常备忘、会议记录什么的,都是非常棒的。

OneNote

  近日,微软发布了 Android 版 OneNote,继续 OneNote 的跨平台之旅。(虽然在 Android 上用 M$ 的东东貌似有点怪怪的,不过好用才是王道嘛)

  移动版 OneNote 目前已经登陆 Windows Phone、iPhone(Version 1.3)、iPad,现在又登陆了 Android。无论使用什么平台,用户都可以随时随地地利用移动版 OneNote 记录、访问自己的所有笔记和创意。

  利用 SkyDrive 帐户,Android 版 OneNote 用户可以在多款设备上同步笔记内容。

  Android 版下载地址:

  安卓市场微盘

  安装完毕后,会自动识别为机器的语言,我这里当然是简体中文啦。

  一起来看看吧,以下是部分截图:

  1、协议

  2、提示登录 Windows Live SkyDrive

提示登录 windows live

  3、登录界面

登录界面

  4、开始加载 SkyDrive 上的远程笔记

远程数据获取

  5、主界面

主界面

  如果你在桌面版的 Onenote 里设置了共享到 SkyDrive,桌面和手机就可以共享同一份笔记了,随时随地查看修改。

  

IE 判断是否设置 document.domain

众所周知,对于同主域的多个子域名,可以通过设置 document.domain 来绕过同源策略(安全性极差,强烈反对这么做

在我们的 JS 程序里,需要创建一个空白的 iframe(src=”about:blank”) 来做数据代理。

如果没有设置过 document.domain,这个 iframe 是可以随意访问的,没有问题。

但我们的 JS 程序部署在第三方页面,是否设置了 document.domain 是未知的,IE下只要设置了 document.domain,访问这个 iframe 就会提示“没有权限”了。(Firefox 和 Chrome 等非 IE 浏览器,都是没有这个问题的。)

所以,需要检测一下页面是否设置了 document.domain,并修复这个问题。

对于 test.weibo.com 设置 document.domain = “weibo.com”; 的情况,应该是很好判断了,只需判断 document.domain 和 window.location.host 是否相等即可。

但,如果是 test.weibo.com 设置 document.domain = “test.weibo.com”; 的就麻烦了。(各位看官,不要以为没人这样子做,谁知道呢)

解决的办法如下:

如果是 IE,就试着取一下 iframe 的 document 属性,如果 try catch 捕获到异常,就表示 A 页面设置了 document.domain,做一下修正。

document.domain = 'weibo.com';
var ifm = document.createElement('iframe');
ifm.src = "about:blank";
document.body.appendChild(ifm);
if(/msie/i.test(navigator.userAgent)){
	try{
		ifm.contentWindow.document.title;
	}catch(e){
	addEvent(ifm, "load", function () {
		alert(ifm.contentWindow.document.body.innerHTML);
		ifm.onload = null;
	});
	ifm.src = "javascript:void((function(){var d=document;d.open();d.domain='"+
		document.domain + "';d.write('111111111');d.close()})())";
	}
}

“坑”系列——iPad下的100%大小iframe

之前在《一个100% iframe滚动条的故事》一文中提到,使用 100% 大小的 iframe 来嵌入第三方应用。

合作方提出了一个需求,旋转 iPad 时候,iframe 需要获得当前可视尺寸的大小。

在 iframe 中虽然可以监听 top 窗口的 onorientationchange 事件来获得屏幕的旋转,但 iframe 自身无法获得可视区域大小,需要在父页面监听此大小,然后传递给 iframe。

最终定下的方案是:如果判断 userAgent 是 iPad、iPhone、iPod,就监听 onorientationchange 事件获得可视区域尺寸,然后通过 postMessage 传递给 iframe。

在这期间,总共踩了两个坑,本文先描述第一个,《“坑”系列——postMessage》描述第二个。

第一个坑:虽然 iframe 是以 100% 大小嵌入,父页面也没有任何别的内容,但是发现旋转屏幕后,iframe 并没有自动重新渲染一次,导致会残留一部分空间,滚动条可显示区域,明显大于实际区域。

但多方咨询,并没有什么方法可以让 iframe 自身强制重绘一次。

最后的办法是,针对 iPad 系列设备,取得当前窗口的大小,重新指定像素值给 iframe,而不是使用 100%,在改变 iframe 尺寸的时候,让 iframe 强制重绘达到目的。

Fiddler 插件之Stave批量替换

用过 Fiddler 的人,都知道它最强大的莫过于 URL 替换功能。

Fiddler 自带了一个 AutoResponse 面板,里面可以进行一些规则替换。

但是,它没法做批量的替换,比如说:
1、换域名:
http://test.domain.com 指向 http://another.domain.com
2、换端口:
http://test.domain.com 指向 http://test.domain.com:8080
3、将某一路径下的所有文件,指向某个本地目录
http://test.domain.com/folder1/*.* 指向 D:/demo 目录

不过有这样一个 Fiddler 插件,就让我们能轻松做到这一点

Stave

官方地址:http://code.google.com/p/stave/

作者:zhongzhi98@gmail.com

根据作者在 Google code 上的描述,主要功能如下:
• 目录替换
• 按项目管理配置文件
• 包含文件模板解析
• 设置上下行网速限制(没此功能找到在哪)

其实大家看截图,也基本上能看出这个插件的主要用法了。

在右键菜单里,可以增加、修改、删除规则

亲,记得把主界面左上角的启用插件打勾噢

演示一下替换某路径为本地目录:

在 D: 建立一个 index.html,内容随便你啦

现在访问下 http://www.baidu.com/test/index.html,看看,是不是替换过来了?

前端攻城师开发期间,用来模拟接口的调用什么的,这功能最棒了

其他几个,就自己试试吧

如果还不会,请来微博找我 @Bencalie

Beyond Compare 3 注册码

今天突然发现,Beyond Compare 提示我的 license key revoked,就换了个别的,经测试,下面两个可用

第一个:
— BEGIN LICENSE KEY —
rssAPVg2OpBjDVo3E0DhGWrjPIq0hsTSuNz13wTuzVHfb2mRgO9bZKn9B
l42D5YEyMSYPXsxzcb08dqbRlbzWNJzJXE6YVapYW7f+tRRXRFI4yn4Nj
jZ0RiiqGRCTVzwComUcXB-eiFWRBY6JpSsCNkmIxL5KsRCo442djHhTZE
— END LICENSE KEY —–

第二个:
— BEGIN LICENSE KEY —
mv1nPlXAywBDCdhxFc9QOVv6TBcQHLAXBQUAKTh3ie4fqSEOnWrPsnVkF
yt0wAkJHweoExRJWWVwwCniKNROSdJzJXE6YVapYW7f+tRRXRFI4yn4Nj
jZ0RiiqGRCTVzwComUcXB-eiFWRBY6JpSsCNkmIxL5KsRCo442djHhTZE
— END LICENSE KEY —–