IE 里有很多原生的 Javascript 函数实际上都不是一个标准的 Function 对象,例如 window.alert,window.setTimeout 以及 IE8 的 window.console.log 等。在需要对这样的函数进行包装的时候,会因为它们都没有 Function 对象应该有的 .apply() 及 .call() 方法而难以做到。

这段代码为了兼容旧版本没有 console 的浏览器,尝试将 console.log 包装为 $.log,但是基于上述原因它在 IE 里无法执行。

$ = {};

if (console && console.log) {
    $.log = function() {
        console.log.apply(console, arguments);
    };
} else {
    $.log = function() {};
}

由于 window 和 console 这样的原生对象都是只读的,所以无法使用类似这样的代码简单地为其添加 .apply() 方法。

console.log.apply = Function.apply;

解决办法是使用 Function.apply.apply() 将 Function.apply 函数对象 apply 到 console.log 上。

$ = {};

if (console && console.log) {
    $.log = function() {
        Function.apply.apply(console.log, [console, arguments]);
    };
} else {
    $.log = function() {};
}

这段代码和第一段代码完全等价。

如果觉得不容易理解,可以看看这个 .apply() 函数比较清晰的例子。这两行代码也完全等价。

[1, 2, 3, 4].slice(0, 2);
Array.prototype.slice.apply([1, 2, 3, 4], [0, 2]);
标签:

自从关注并使用 Ruby on Rails 以来,也对 Ruby 语言本身很感兴趣,并经常尝试用它写一些日常使用的小工具脚本。虽然自己使用很方便,但要分享给不用 Ruby 的朋友就比较麻烦了。

但是在 JavaEye 的某个帖子里知道 Exerb 后,事情就变得简单了。Exerb 是一个可以把 Ruby 脚本以及其依赖的 Ruby 扩展库转换成 Windows 下的单个的可独立运行的可执行文件的工具(这么长的一句话读起来是不是很有想扁我的冲动?:p),到 Exerb Project 的主页 下载安装包解开并执行里面的 setup.rb 即可完成安装。

用法也很简单,先执行 mkexy your_script.rb,让 mkexy 启动你的脚本并运行,这期间它会自动探测出 your_script.rb 所依赖的类库文件以及扩展库文件,并在 your_script.rb 结束运行后创建一份清单 your_script.exy,然后执行命令 exerb your_script.exy 即可生成 your_script.exe。OK,现在可以轻松地把你的 Ruby 脚本分享给朋友们了。(注1)

看到这里,也许你会跟我一样想,哇哈哈哈,有了这个工具,用 Ruby 来做 GUI 的小工具就变得有意义了啊。没错,对依赖 fxruby、wxruby 的 Ruby GUI 脚本也能正常的使用 Exerb 完成转换 (注2) (注3)。但是,由于 Exerb 会把 fxruby/wxruby 的运行库嵌入到 .exe 文件里,生成的 .exe 文件都非常大,fxruby 的在 9MB 左右,wxruby 的 11MB 左右。对于一个功能简单的小工具来说,这个程度的体积显然是很多人不能接受的。

事实上,已经有了一个 GUI toolkit 运行库很小,VisualuRuby,虽然它是 Windows Only 的,虽然它现在在 Vista 上还有点小问题。不过这又是另外一个话题了,我会在下一篇 blog 里继续聊。

注1: 在这之前也许你需要用 upx 压缩一下生成的 .exe 文件,因为它确实比较大,一个最简单的 Hello world 也有 1.4MB 左右。

注2: Tk/Gtk/FLTK 我没有试过,对 Tk 不感兴趣,Gtk 在 Windows 下的运行库太过庞大,FLTK 则是因为找到的 ruby-fltk 在 Windows 下的二进制发行版依赖的 Ruby 版本太老,源代码发行版还没来得及尝试自己编译。

注3: 对于 GUI 脚本,使用 exerb -c gui your_script.exy 可以避免生成的可执行文件运行时带有 Windows 命令行窗口。

标签:, ,

一些自动执行特定任务的小脚本程序,如果希望能使程序的 stdout/stderr 输出到屏幕的同时也把他们记录到一个日志文件,可以使用 tee 命令结合 shell I/O 重定向来轻松完成:

./a_tiny_script 2>&1 | tee the_log_contain_both_stdout_and_stderr.log

这个命令的精华在于 2>&1,意为让 stderr 使用 stdout 的文件描述符,效果也就是将 stdout 和 stderr 内容合并,并且输出到 stdout 被定向的位置。在这里也就是管道中的 tee 命令的 stdin 上,然后 tee 将得到的输入同时显示在屏幕上和记录到日志文件里。爽吧?

以前为了在 PHP 脚本里实现这样的功能竟然使用了 ob 系列函数 + 自定义的 output callback 函数,并且这样也只能做到同时显示和记录 stdout,真是晕到死。

标签:, , ,

大家都知道 ACDSee 有 Viewer 和 Browser 两种模式。一般来说我们在“我的电脑”或者其他文件管理器里双击一个图片文件时 ACDSee 会以 Viewer 模式启动,以便让我们查看双击的这张图片。此时如果我们双击 ACDSee 的显示图片的区域,会使其切换到 Browser 模式,以便让我们浏览刚才打开的图片所在文件夹下的所有图片。

问题就出在这个 Browser 模式上。 Read the rest of this entry »

标签:,

虽然早用上了 Delphi 2005 Update 1 正式版,这张光盘已经没有实际意义,但还是挺兴奋的,毕竟是 Borland 寄给我的东西,呵呵。

平心而论 Delphi 2005 是个不错的产品,虽然我们可以找出一堆数落她的理由。比如启动太慢,占用内存太多,IDE 太像 Visual Studio 而失去了 Delphi 传统的风格,编辑器反应比较慢等等。不过在同一个 IDE 里同时支持 Delphi for Win32、Delphi for .NET 以及 C# 确实是个很诱人的卖点。以及新增的 Refactoring、UML Modeling 等等都是很实用很重要的功能。

Delphi 2005 是个不错的产品,但 Borland 对她的宣传确实有些过了。

标签:,
Page 1 of 212