Mar 27, 2006
通常,如果对HTML元素指定了 position: absolute,则可以通过 left、top、pixelLeft等
属性获取该元素的位置和大小。但是不指定 position:absolute 的情况下则不能使用该方法。
幸运的是如果我们想知道的是文本框的位置,则可以使用 textRange 对象来获取。
如果我们有
<input type="text" id="inputbox">
则可以通过以下代码获取其位置:
var inputbox = document.getElementById('inputbox');
var tr = inputbox.createTextRange();
top = tr.boundingTop;
left = tr.boundingLeft;
height = tr.boundingHeight;
(Read More)
Mar 25, 2006
-
安装Apache和 ActiveState Perl。
-
安装mod_perl。
ppm install http://theoryx5.uwinnipeg.ca/ppms/mod_perl.ppd
安装完毕之后会提示输入Apache的路径,输入类似于 D:/Apache2/modules。
-
配置mod_perl。修改httpd.conf,增加以下几行:
LoadFile "C:/Perl/bin/perl58.dll"
LoadModule perl_module modules/mod_perl.so
<Files *.cgi>
SetHandler perl-script
PerlHandler ModPerl::PerlRun
Options +ExecCGI
</Files>
-
重新启动Apache。
2009/9/27更新~
原来的安装地址http://theoryx5.uwinnipeg.ca/ppmpackages/mod_perl.ppd已经变成了ActivePerl 6.xx的地址,
而本文使用的是ActivePerl 5.xx,地址修改为http://theoryx5.uwinnipeg.ca/ppms/mod_perl.ppd。
(Read More)
Mar 24, 2006
按:本文主要针对预装 Windows XP 的笔记本电脑。台式机硬盘都比较大,一般没有 C盘减肥的必要,不过也可以借鉴本文的做法。
-
准备备份空间
由于C盘减肥并不是简单的文件删除,有许多不常用但却不能删除的重要文件需要备份到其他地方,所以应当首先准备出一个2-3G大小的备份空间。如果你的笔记本有恢复光盘,那么可以将笔记本硬盘最后面的恢复分区删除,就可以得到>2G的空间。
-
修改系统配置减肥
禁用休眠功能可以节约数百 M 的C盘空间(与内存大小相同)。然后将虚拟内存移动到备份分区可以节约 500M - 1G 左右的空间。禁用各个硬盘的系统还原功能可以节约 100M 左右。最后将C盘的回收站所占的百分比减小。
-
删除不必要的文件
不必要的文件包括:%WinDir%/Help 下的所有帮助文件,约 100M;%WinDir% 下的 $NtUninstallxxxx$ 等为系统补丁的备份文件,一般不必保留。至于 %WinDir%/Font下的字体文件,没用的字体就删除掉,因人而定了。最后再清理一下 Temp和 IE 缓存等。
-
移动不常用的文件
%WinDir%下可能会包括一个 i386 的文件夹,该文件夹为Windows XP的安装文件。有了它,在添加删除系统功能时就不会提示插入系统盘了。但是这些文件不常用,应当将其移动到备份分区。以后提示插入系统盘时,选择备份分区即可。另外 %WinDir%/Installer 下为 Windows Installer安装文件的备份,可以将其全部移动到备份分区,添加删除程序时再将其移回即可。但要注意%WinDir/Installer下面的目录中保存了各个软件所用的图标,最好不要移动。
(Read More)
Mar 24, 2006
今天被 Windows Installer 搞死了。
事情是这样的。今天本来是要安装Office的补丁 KB905756,据说是修复 Excel 2003 漏洞的。下载补丁文件之后进行安装,片刻之后提示安装失败。我当时没怎么在意,因为正好在补丁站点上看到了安装失败的解决方式,就是进行一下Office 2003的自动修复,再重新进行安装。于是打开控制面板、添加删除程序,单击Office 2003选择修复,然后等待。片刻之后系统给出提示:
この修正プログラム パッケージを開くことができませんでした。
修正プログラム パッケージが存在し、アクセスできることを確認してください。
またはアプリケーション ベンダに問い合わせ、
Windows インストーラの修正プログラム パッケージが
有効であることを確認してください。
大意就是说,找不到补丁的文件,请确认该补丁是否存在。然后我又试图将Office2003 删除,结果得到了同样的提示,删除失败。我才意识到事情的严重性,估计所有的 Windows Installer 安装的程序都不能维护了吧。突然想起,前一阵子为了增加C盘剩余空间,曾经删除了C:\Windows\Installer 下面的全部文件。我知道这个目录下面保存的是Windows Installer的安装Cache,安装文件都以 xxxxxx.msi xxxxxx.msp (xxxxxx为16进制数字)的形式保存在这里,会不会是因为Cache被删除所以不能维护了呢?
(Read More)
Mar 23, 2006
猜测一下Windows Installer的安装过程。注意:仅仅是根据本人经验猜测而成,并不一定正确,而且一定不完整。
1. 应用程序的安装。
首先将安装文件 abc.msi 复制到 %WinDir%/Installer 下,文件名改名为 xxxxxx.msi ,其中 xxxxxxx 为16进制数。然后将源文件 abc.msi 所在位置保存到一个名为SOURCEMGMT 的服务中。然后取得该软件的软件包 id 并注册。最后进行软件安装。
2. 打补丁。
首先与程序安装过程相同,将补丁文件 def.msp 备份到 %WinDir%/Installer 下面,并进行相应的注册等工作。然后检查该补丁是否与已安装的补丁冲突,如没有冲突则直接安装,否则利用以前在%WinDir%/Installer下备份的安装文件将冲突的补丁进行回滚并重新安装。例如,软件 abc.msi 打了两个补丁 def1.msp 和 def3.msp,现在要安装 def2.msp,检测出 def2.msp应当在 def3.msp之前进行安装,则自动卸载 def3.msp,然后安装 def2.msp,再安装 def3.msp。因为以前在 %WinDir%/Installer 下备份了 def3.msp,所以这里可以利用以前的备份进行 def3.msp的删除和安装。
3. 卸载
按照顺序依次卸载软件的补丁和软件本身。
4. 找不到备份时的处理
如果在进行软件包维护时,%WinDir%/Installer 下找不到所需的安装文件备份,则访问 SOURCEMGMT 服务,得到该安装文件的原位置,再试图到原位置去寻找。如果再找不到则提示安装失败。
(Read More)
Jan 12, 2006
在Excel中,方向键的作用通常是移动光标到当前单元格的相邻的单元格。但偶尔会出现方向键不能移动光标,而是使得整个工作表滚动。这时看看键盘上的ScrollLock灯是不是打开了,将它关掉即可恢复正常。
(Read More)
Nov 29, 2005
研究发现,将英文单词的首尾字母之外的其他字母随机调换顺序,人还是能够基本无障碍地阅读整篇文章。例如,
Sometimes w3c's specification is much more insteresting than MSDN.
Unfortunatelly new techs are not supported by most browser.
将该文章中每个单词保持首位字母不变,中间的其他字母随机调换顺序,得到下面的文章。
Stmemieos w3c's seapifccition is mcuh mroe inseeirsttng tahn MSDN.
Urfnltueanolty new tcehs are not speproutd by msot bsrwoer.
但是大部分人仍然能够正常阅读。
做了个小程序用来调换字母顺序。

(Read More)
Nov 29, 2005
我的开发环境是 MIPS_4ke,调试器是 Multi 2000 v4 + SlingShot + EJTAG。
昨天在调试程序的时候调试到这样一段程序:
UI8 * pDest = g_pStreamBuffer;
if (*(UI32*)pDest != 0x000001BE) {
return;
}
pDest += 10;
if (*(UI32*)pDest != 0x000001B5) {
return;
}
调试器跟踪到第二个 (UI32)pDest 时发生错误,调试器拒绝继续调试。开始百思不得其解,因为第一个(UI32)pDest正常地得到了所需要的结果。后来想明白,原来是对齐的问题。MIPS从内存中读取一个UI32时必须在4字节边界开始读取,而上面的操作执行了 pDest += 10之后,pDest就不再位于4字节的边界上,因此执行第二个 (UI32)pDest访问时发生了CPU异常。于是我做了下面的这个函数:
UI32 getUI32(UI8 * pSrc)
{
return (
(((UI32)(* pSrc )) << 24) |
(((UI32)(*(pSrc+1))) << 16) |
(((UI32)(*(pSrc+2))) << 8) |
(((UI32)(*(pSrc+3))) )
);
}
这样就能够从任意地址读取四个字节了。
另外,Multi的编译器指令中有一个 pack 指令,该指令能够指定定义结构时的最小的对齐字节数。例如正常情况下进行下列定义时,各个成员所占定义如下所示:
typedef struct {
UI32 a; // 4 bytes
UI8 b; // 1 byte + 3 bytes padding
UI32 c; // 4 bytes
}
由于第三个成员 c 为 UI32,CPU在读取c时需要在4字节边界上对齐,因此成员b后面就留下了三个padding字节。如果这样写即可避免该问题。
#pragma pack(1)
typedef struct {
UI32 a; // 4 bytes
UI8 b; // 1 byte
UI32 c; // 4 bytes
}
#pragma pack()
但是这样一来,CPU读取c的时候为什么不会产生异常?其实编译器作了特殊的处理,它将读取c的指令分解成两条,第一条在前一个边界上读取c的前三个字节,第二条在后一个边界上读取c的最后一个字节,因此不会产生异常。
(Read More)
Nov 7, 2005
前一阵子遇到的一个问题是,如何在Java程序中调用Windows DLL的函数。查了查资料,得知使用名为JNI(Java Native Interface)的方式可以让Java调用DLL中的函数。JNI的使用方法如下:
- 在Java中定义JNI调用,并撰写使用该JNI调用的相关代码。
- 根据定义好的JNI调用生成相应的C语言头文件。
- 利用上一步生成的头文件,使用C书写Windows平台上的代码。
- 编译C代码生成DLL库文件。
- 执行Java程序中JNI调用的代码。
(Read More)
Sep 30, 2005
自己开设的服务器,希望晚上睡觉的时候它能自动关机减少噪音,早上起床之后再自动开机提供服务。我的主板是微星815EP Pro,Award BIOS v3.3(2001/4/20)。
首先重新启动计算机,按Del键进入BIOS设置。在BIOS下找到Integrated Peripherals中的PWRON After PWR-Fail,将其设定为On。这样停电之后再次供电时电脑就可以自动开机。
然后进入Power Management Setup,选择Resume By Alarm,将其设置为Enabled。然后将下面的Date(of Month) Alarm选项设置为0,表示每天定时开机。Date(hh:mm:ss)设置为开机时间,我设置为10:0:0。设置好之后重新启动计算机,进入操作系统,然后再关机。注意主板说明书上只说明了“修改后需要重新启动计算机”,要注意的是重新启动之后必须要进入操作系统,再关机,才会按照指定的时间开机。
然后设置自动关机。比较简单,在 /etc/cron.d 下面添加一个 shutdown 文件,内容如下:
30 2 * * * root /sbin/shutdown -h now
设置每天2:30定时关机。
(Read More)