今天去vim.org看到Bram新作了一个 Seven habits of effective text editing 2.0 报告。 Video. Slides.
Recently in 技术与实践 Category
前两天查了一些关于如何提高AJAX程序性能的网页,把结果总结一下。
影响AJAX程序性能的几个方面:
- Javascript 程序本身。比如字符串的连接操作带来的性能影响
- DOM操作。操作DOM节点是很有讲究的,相同的结果采用不同的方法效率能够相差几十倍。
- 渲染页面。浏览器的引擎结合DOM和CSS渲染页面的时候也会占用时间和资源。
- 网络流量。由于网络的延迟也会造成AJAX程序性能不好。
了解这些方面之后,就知道从那些地方入手提高性能。
在动手提高性能之前,最好构造一个方法衡量性能。
常用的方法就是,准备一个测试用的数据集,在javascript上加上计时器,测出一个时间作为基准时间,然后每次改变程序之后都再看一下新的运行时间是多少。这样有明确的指
标,才能够使得提高性能的尝试通往正确的方向。
最后就是一些tips,使用这些tips可以很好提高性能:
- 使用innerHTML不要使用createElement
- 使用innerText不要使用innerHTML
- 避免改变class,直接操纵style这个对象。
- 缓存全局对象。document啊,window啊,使用这些全局对象消耗还是挺大的,如果频繁使用的话,应该把它们缓存在局部变量里。
- 缓存对象的属性,比如s.Length.
- 复用已有的元素。
- 如果字符串连接操作比较多的时候(>10000),使用Array.join来代替字符串的 "+".
参考文献:
- Faster DHTML in 12 Steps
- Building High Performance HTML Pages
- DHTML性能提高的其他技巧
- IE + JavaScript Performance Recommendations - Part 1
- IE+JavaScript Performance Recommendations Part 2: JavaScript Code Inefficiencies
- Ajax Performance
- Boost Ajax performance using local storage
- JavaScript Performance Issues - Lesson 1
- JavaScript Performance Issues - Lesson 2
- JavaScript Performance Issues - Lesson 3
前几天看到Microsoft收购了Sysinternals公司的消息,惊讶之余想起来更前些天Sysinternals的一个经典免费工具Process Explorer来调试Job Object遇到的问题。
Process Explorer
Process Explorer可以说是一个超级加强版的task manager,进程信息、内存使用、线程、Call Stack、handle的情况都可以查看。 是程序员调试程序,管理员预防病毒木马强大工具。 记得曾听过Dave Solomon的Windows Internals的培训,几乎他的所有关于系统内部情况的演示都是用process explorer来作的。
Job Object
Job Object 是Microsoft Windows上编程的一个概念, 它可以让你把一组进程作为一个单位进行管理。有一些你无法在进程级别控制的限制可以在Job Object上控制,它会应用到Job Object关联的每一个进程上。比如:最大工作集、最大user-mode执行时间、最多占用内存等等。 当Job Object的handle被关闭时,它所关联的所有进程都会被杀掉。这样就能提供一个类似砂箱沙箱的安全环境来执行一些不太可靠的代码。
遇到的问题
我们期待的是当那个Job Object的handle被关闭时,它所关联的进程都被杀掉,但是好像有点儿问题,作了一些修改后,我们用process explorer查看handle和进程的情况,发现handle的确被关闭了,但是那个进程就是不被杀掉,检查了各种参数都没找到原因。
转天,突然发现不开process explorer的时候就正常了!进程可以成功地被杀掉。突然想到,原来Process explorer为了能够查看每个handle的情况也会增加handle的reference,导致在CloseHandle的时候reference不是0,还没有真正关闭那个handle。
这不是Process Explorer的bug, 虽然在主进程中那个handle已经不见了,那个handle还被process explorer自己用着。
最后
应该早一些想到这个原因的。平时应该再好好读读Windows Internals。掌握一些系统的内部原理能够在你编程中遇到神奇问题的时候帮上大忙。
最近gaim总是刚一连上,闪了一下就消失了。很郁闷。
今天不能忍了, 决定提交bug。忽然发现已经有人反映了。 里面提到gaim 2.0中没有这个问题了。 于是
apt-get remove gaim
svn co https://svn.sourceforge.net/svnroot/gaim/trunk gaim
cd gaim
./autogen.sh
sudo apt-get install libgnutls-dev
./configure --enable-gnutls=yes
make
sudo make install
搞定。
ieasy.org上的jabber服务开始支持SSL了,它的SSL证书由CAcert.org签署。 CAcert.org是一个提供免费安全认证的站点。这也是我选择它的原因。
但是,问题在于CAcert.org的根证书并没有为大部分软件所包含,像Firefox、IE都没有包含,所以你得去https://www.cacert.org/cacert.crt 来安装证书才行。当然常用的jabber客户也没有包含,你需要手工的设置才行。
对于Psi的用户,可以简单的安装这个文件cacert.org.xml到psi所安装的目录(一般是c:\program files\psi\)下certs目录就可以了,关于这份证书的正确性,你可以到https://www.cacert.org/index.php?id=3下载CAcert.org的根证书对比一下即可。你也可以手工添加:)
关于CAcert.org 还想说两句,它提供了客户端证书用于验证客户,也提供了服务器证书。挺不错的。不过好像客户端的证书用于加密邮件在thunderbird 和 outlook上都没有成功。主要是导入证书的问题。回头有时间再仔细研究:)
几天以前,ieasy.org上的jabber服务搞定了。以后有兴趣的可以使用ieasy.org作为jabber服务器。现在支持注册新用户。暂时还不支持SSL和其它的Transport服务。以后有时间会逐步摸索把服务都建立起来。
接触jabber这个东东,主要我是想在我的Palm Tungsten W 上使用MSN, 找到了Chatopus, Chatopus是一个palm os上运行的jabber客户端。依仗着jabber server的msn transport服务,我就可以用我的pda上msn了。
现在的问题是,palm os 4上QQ的客户端很少,有的话也很不好用,j2me的。如果能有支持transport 到QQ的jabber服务就好了。可惜经过考察,现在没有:(。 于是我打算自己写一个,第一步就是架一个jabber服务器啦,呵呵。然后考察现有的QQ客户端实现:OpenQ, perl-oicq,lumaQQ. 研究jabber transport的工作原理。 这些天太忙了,等忙过了这段,就开始研究,有了好结果再向大家汇报:)。
我的JID是
在学校里,不能直接连接国外网站,当然我们有办法找到代理来浏览网页 :P . 不过对于fetchmail + mutt的邮件解决方案,fetchmail怎么利用代理收gmail的信呢?
首先你得有能用的socks代理。
其次,你需要有runsocks或者tsocks这一类socks客户端。这种客户端当你配置好配置文件以后,可以用runsocks command的方式运行你的程序“command”,它就会用socks代理出去了.关于这么配置,我就不赘述了,请参照文档。
这时,你可能已经想到,那我直接用runsocks运行fetchmail不就行了么? 没错, 当然可行,不过前提是你的fetchmail是支持SSL的。而且有些小问题:
1。有可能你的fetchmail不止收取一个gmail的信件,还有其他服务器的,比如(eyou.com? :P),他就是国内的了,用了代理反而慢了。(当然这个问题也能解决,比如你自己在本地建一个socks代理,配置成访问指定目标地址时使用另一个站外socks服务)
2。还有可能,你的整个Linux系统就只运行了一个fetchmail daemon他是全局的,读取所有用户的配置文件,你没法让它以runsocks运行,或者你不想修改配置好的/etc/init.d/fetchmail启动文件。 那就可以用我下面说的方法:
答案是:stunnel . stunnel可以建立一个SSL的tunnel. 看下面这个命令
runsocks stunnel -d 10000 -c -r pop.gmail.com:995
-d 10000 表示在本地监听10000这个TCP端口。-c 表示使用client模式。 -r pop.gmail.com:995 表示连接远程的服务器以及端口。
运行完这条命令之后,你在试一下telnet localhost 10000 ?然后再输入 user yourid, pass yourpass , list, exit等POP3会话命令试试,可以了吧? 没错,我们在本地10000端口和远程的pop.gmail.com:995建立了一个tunnel,而且是脱掉了SSL的,就是明文,(没关系,这是本地的连接,不怕sniffer的).
利用这种方法,你只需要在你的fetchmail配置文件中配置主机为localhost,端口为10000就可以了。
BTW:值得提到的是,fetmail是支持plugin的,在命令行里写 --plugin "command %h %p" 或者在配置文件里写 poll xx.xx.xxx.xx plugin "command %h %p", command就是你提供的程序,%h是host,%p是port,fetchmail从command的stdout读东西,把要写数据写给command的stdin,
所以我们又有了一个方案,前提是fetchmail支持ssl, plugin里面写
plugin "runsocks nc %h %p"
其中nc就是有着TCP/IP瑞士军刀之称的 netcat
非常想自己写一个程序分析QQWry.dat的格式, 从而使用在我的网站日志分析程序中。由于ieasy.org用的是awstats,支持perl写的插件,我就打算写一个perl脚本。
找到如下信息:
《关于QQwry格式》 http://dev.csdn.net/article/33/33563.shtm
正当我想自己写的时候,碰巧找到了雷傲论坛的代码,里面正好有perl写好的:) 这里下载 用的时候,把脚本的保存为qqwry.pl,再去http://www.cz88.net/下载一份最新的QQWry.Dat,
写一个你得Perl脚本test.pl,如
#!/usr/bin/perl
use strict;
require "qqwry.pl";
print ipwhere("${ARGV[0]}");
print "\n";
$./test.pl ip地址
hehe,这样就可以查了 .下一篇blog我会讲讲怎么写那个awstats的插件。
hehe,是我2002年写的。只支持vc6
以前都是在linux下编程序,现在改到写vc程序,便觉得visual studio内置的编辑器非常的不好用,呵呵 :)
下载了一个vim for windows 6.1之后,看了一下文档发现早就有人有同感了,写了一个VisVim( vim add-in )来解决,现在把安装心得和大家共享一下
1.首先安装一个vim
可以到ftp://ftp.vim.org/pub/vim/pc/gvim61.exe下载一个完全的安装版本 这个东东比较大, 但是比较方便。呵呵。当然你也可以去下载相应的OLE GUI executable 和runtime files 但是注意一定要是OLE 的GUI版本才行。
2.到你的vim安装目录下,假设是e:\tools\gvim
>cd e:\tools\gvim
>cd vim61\visvim
>regsvr32 VisVim.dll #win95/98可以跳过这步
3.要是你还没有注你的OLE gvim
>cd e:\tools\gvim\vim61
>gvim -register
4.打开visual studio 运行
Tools
Customize...
Add-Ins and Macro Files
5.点Browse 找到gvim\vim61\visvim\目录下面VisVim.dll
6.选中新加入的这个Add-in,关闭对话框
7.这时你就可以看到工具条上的Vim按钮了。第一个按钮会弹出一个设置对话框 。。。。这之后我就不讲了。
到现在为止,你只需要配置好你的gvim 比如字体呀、颜色呀、自动缩进呀、语法呀什么的就行了。是不是很好用? :P
