不用跨域,ExtJS通过代理使用CouchDB

在选择CoudhDB做数据库,Apache做Web服务器时,在客户端用ExtJS可以直接通过HTTP来访问CouchDB的数据。但通常CouchDB和Apache是位于不同的端口,这也就意味两者位于不同的域,所以对于ExtJS而言,要想使用CouchDB,必须得使用ScriptTagProxy来进行跨域访问了。

但ScriptTagProxy在实际使用中发现,如果一个返回的JSON字符串较长,CouchDB会将JSON使用’\n’截断,在Chrome/Firefox下都会提示”无法解析json”(Firefox下错误消息为”invalid label”),但如果不跨域使用HttpProxy来解释包含有’\n’的JSON字符串,却能正常工作,看起来似乎是ScriptTagProxy和HttpProxy在解释JSON字符串的方式有上区别吧。

既然没打算去Hack ScriptTagProxy代码,那就只好Google一下了。翻了翻,发现有人使用Apache的mod_proxy_http可以免跨域,具体做法如下:

$ sudo a2enmod proxy_http
$ vim /etc/apache2/mods-enabled/proxy.conf
内的Proxy_Via设置为on

编辑虚拟主机配置在(VirtualHost *:80)下增加两行

ProxyPass /cdb/ http://localhost:6902/
ProxyPassReverse /cdb/ http://localhost:6902/
$ sudo /etc/init.d/apache2 restart

这样,便可以通过”http://localhost/cdb” 来访问原来”http://localhost:6902″的资源了,在ExtJS中,也可以将ScriptTagProxy换成HttpProxy来使用了。

C/C++之简易Logger

用C++写Logger,常见的有这几种方法:

  1. 写一个Logger类,封装诸如Info(format, …)、Warn(format, …)之类的方法,然后用个实例化一个全局对象,处处皆可输出log,不仅到屏幕,而且可以到文件甚至是网络。
  2. 在c99之前,宏定义中的可变参数…是不能直接在宏中展开的,必须在函数中使用va_list这样的方式来处理,所以如果不使用c99标准,简易的Logger可以使用
  3. #define LOG_INFO(msg)   printf msg

    这样的方式来定义一个宏,然后用以下方式来使用

    LOG_INFO((“hello, %s!\n”, “world”));

    不过,这种方法的弊端在于,LOG_INFO宏在代码中的表现看起来不太符合常理,它应该像个函数,参数周围只用一对括号才好。为什么要用两对括号呢?因为只用一对括号,每个用’,’分隔的参数都会被传进对应的宏,而宏本身并不支持多态,所以只用一对括号,在c99以前的标准下,根本没法做到。并且如果我希望在每条log前都输出标识”[INFO] “的话,只能在每个使用了LOG_INFO的format参数中增加”[INFO] “,目的虽然能达到,但是灵活性不够,一旦需要修改,处处都得改。

  4. 在c99标准及以后,已经支持可变参数在宏定义中直接展开了,所以LOG_INFO可以这样来定义:
  5. #define LOG_INFO(…)   fprintf(stderr, “[INFO] “__VA_ARGS__)

    这样,我既可以选择将log输出到stdout,或是stderr, 或是某个文件指针(暂不讨论输出到文件,因为我暂时没这需求)。并且还可以随意地在format字串里加上前缀,甚至是文件(__FILE__)或函数(__FUNC__)信息,并且使用时就像正常的函数一样使用:

    LOG_INFO(“hello, %d!”, “world”);

    如果使用gcc 4.0以上的版本,总是会有警告”warning: anonymous variadic macros were introduced in C99”出现,编译时加上参数”-Wno-variadic-macros”就清静了。

把C代码当做脚本来运行

在我们的印象中,C代码是需要经过编译链接后才能运行的,因为C是编译型语言。
不像bash等脚本语言,即改即用,不需要编译。

现在,使用Tiny CC可以做到这点了。把C代码当做脚本来运行。
Tiny CC的全称是Tiny C Compiler. 是GNU/Linux下的自由软件。使用debian/ubuntu的用户可以通过”sudo apt-get install tcc”来体验一把。

安装完后,写一段最简单的代码来测试一下: 继续阅读“把C代码当做脚本来运行”