博文

目前显示的是 五月, 2009的博文

icu貌似被国家防火墙拦住了

icu-project.org报告302,指向了site.icu-project.org
我在北京网通用nslookup查的结果是
Non-authoritative answer:
Name: site.icu-project.org
Address: 74.125.47.121而在国外一个dns查的结果是
Non-authoritative answer:
site.icu-project.org canonical name = ghs.google.com.
ghs.google.com canonical name = ghs.l.google.com.
Name: ghs.l.google.com
Address: 209.85.171.121按推测,icu把它的项目主页托管在了google的GAE上。所以……还好的是,下载页面还是可以打开的http://icu-project.org/download/4.2.html

如果释放一个mutex之前并未获取它?

ACE_Thread_Mutex m; m.release(); //如果此时没有任何线程拥有这个锁?ACE_Thread_Mutex在linux/unix下一般用的pthread_mutex_t来实现,按man手册来说,如果发生这种情况,pthread_mutex_unlock将会返回一个非0的值EPERM:"The current thread does not hold a lock on mutex”.但是在windows下情况就很不一样。它调用的是LeaveCriticalSection,按msdn所述,此时不会有任何错误,但是当另一个线程试图调用EnterCriticalSection的时候,将会陷入无限的等待中。按我所测试,不仅是另外的线程会如此,错误的调用LeaveCriticalSection的线程再次调用EnterCriticalSection 也会如此。啊!昨晚我为了这个一宿没睡好。昨晚为了调试一个timer,写了段简单的测试代码。intACE_TMAIN(int argc,ACE_TCHAR* argv[]){ int counter=0; time_t startTime=time(NULL); ACE_Thread_Mutex m(ACE_TEXT("mutex1"),NULL); ACE_Condition_Thread_Mutex mutex(m); while(1){ ACE_Time_Value tv=ACE_OS::gettimeofday()+ACE_Time_Value(1) ; //m.acquire(); mutex.wait(&tv); time_t sec=time(NULL)-startTime; double v; if(sec !=0) v=counter++/(double)sec; //m.release(); } return0; } 我在调用条件变量的wait之前没有acquire相对应的mutex,而ACE_OS::cond_wait在调用WaitForS…

postgresql自身没有连接池?

今天在看postgresql的startup部分的代码,发现它采用的是process per connection 模式,每新来一个tcp连接就会fork一次(即便此时还没有进行身份验证)
首先,如果把postgresql的端口暴露在外是多么的可怕。在win下,每个postgresql新fork的进程占10M左右内存,那么200个就是2G,400个就是4G,攻击者只需要不断的完成3次握手,服务器很快就会因为这个而内存耗尽。在配置文件中改小AuthenticationTimeout的值(默认是60秒),貌似是唯一的解决办法。另外,如果采用长连接,我觉得那么采用ldap查找连接参数的意义并不大。
在上家公司用mysql集群的时候,DBA的建议是不要用长连接,因为他会试图给每个连接分配非常大的buffer并限制最大连接数,前者会显著提高检索效率。这些buffer所占的内存,在连接建立的时候被分配,在断开的时候释放。所以如果没有专门的连接层做连接池,不要使用长连接。而且这样程序也非常好写。而且mysql是在它自己内部做的process。
可如果是像wordpress这样的简单的php应用?怎么再搞一个连接池?
我正在看apache的dbd,还没看懂

阅读postgresql

反正我就是喜欢freebsd/berkeleyDB/postgresql,大概是因为它们共同的血脉以及BSD方式的授权。前几天下了postgresql的代码,本来准备用vc编译,然后发现要装perl,而且必须是windows版的active perl而不能是cygwin perl,而且PATH中不能有cygwin的东西,并且还有很多很多需求,于是我放弃了。我在vc下用别人预编译好的库写应用,唯一的担心就是crt版本的问题,我用的是多线程调试DLL,而它不知道当时是和什么链接的,而且那个是vc71的库,而我用的是vc9。尽管postgresql不建议使用cygwin编译运行,但是我不想装mingw之类的,就还是这么弄了。configure/make/make install一切顺利。但是运行的时候有特殊要求,必须事先启动cygserver,然后将环境变量CYGWIN设置成server,否则启动会报bad system call(在请求SystemV shared memory的时候)。可是我不想再用emacs写代码了,我喜欢eclipse。eclipse中编译调试都很方便。但是我不知道为什么我在启动的时候,就会在ntdll.dll中连续停下来几次,而显然我没有对应的源文件用来加断点,我怀疑是遇到signal了,但是我在eclipse/cdt中没有找到与signal相关的设置。更郁闷的是,尽管eclipse在调试程序的启动参数中支持设置环境变量,但是这个环境变量是windows的环境变量而不是cygwin的shell的环境变量。我在这里尝试设置了CYGWIN这个环境变量,但是在程序中用getenv(“CYGWIN”)得到的却是NULL。不晓得该怎么办,于是总是启动失败。之所以选择postgresql的代码来读,是因为我觉得它的注释写的很详尽。代码风格很普通工整,而在每个函数开头都详细的描述了用途,在每个特殊实现的地方都详细说明了为什么这么做。但是,随便扫了几眼,就发现一些我觉得不够好的地方,例如:1892: if (cvc)
1893: free(cvc);前面那个if判断完全是不必要的。还有这样的:postmaster.c
817:for (i = 0; i \< MAXLISTEN; i++)
818: ListenSocket[…

mysql 6.0对unicode的支持有很大改善

mysql 5.1 rc了一年多才发布,就这,大牛们还因不满SUN的草率而拂袖而去。6.0什么时候能发布呢?加上oracle对它不明不白的暧昧态度,估计更是遥遥无期吧。
mysql 5.x
mysql 6.0


unicode 3.0
unicode 5.0


不支持增补字符集
支持增补字符集

ucs2/utf8,utf8最长3个字节。
以前的utf8被更名为utf8mb3,新的utf8支持4个字节,并增加了对utf16、utf32的支持

如果不使用增补字符集,那么根本没有必要给java程序员费尽心思的讲String.length()计算的是内存的大小而不是实际字符的个数。可这么折腾来折腾去,不就主要是为了照顾中文以及那些深受汉字影响的东南亚语系吗?可中国人貌似一点也不关注这个。