AllowEmptyInput
不晓得从什么时候起,xorg中多了AllowEmptyInput这个选项,而且默认是打开的。一旦这个选项启用,它就会忽略xorg.conf中驱动为kbd和mouse的设定(但是vmware的vmmouse不会被忽略),并尝试使用hal来自动检测鼠标键盘的配置。
事实是我不知道我已经装了hal和dbus,更不知道如果没有启动它们将会导致xorg找不到鼠标键盘(尽管我已经在xorg.conf中手动指定了)
从邮件列表(freebsd-x11)中摘一段话:
“As I understand, currently user is required to do one of following:
– Make sure hald is running (if xorg is compiled with it)
- Add AllowEmptyInput "0" to xorg config otherwise
Thus, extra action is ALWAYS required from user.”
如何在C语言中输出int64_t?
假如,现在有一个64位的整数,需要被输出到stdout或者某个文件里。该怎么写?
先毙掉一个:
int64_t i=9;
printf("%lld\n",i);
GCC会报警。warning: format ‘%lld’ expects type ‘long long int’, but argument 2 has type ‘int64_t’。传说这个警告已经在gcc中存在了15年以上,但是我在linux以及cygwin下编译并不会报告这个,在freebsd下会(我在amd64的8-current上测的)
相比而下,C++的ostringstream简直万能的完美无瑕。但是……我还是希望能找到一个简洁点的方案。
被支付宝流氓了一把
因为最近机器里多了很多软件,上周打开SysinternalsSuite的autoruns查看下有没有什么多余的东西。发现支付宝的一个驱动是开机自动加载运行的,我想,支付宝我一个月也用不到一次,况且,这种驱动肯定是会监听键盘,干嘛呢!犹豫是删掉还是改成手动启动,最后选择了后者。
昨天诺顿防火墙竟然意外死了,于是我强关了机器,然后重起。结果发现,在启动xp前键盘还是好的,但是xp启动后,键盘彻底不能用,touchpad也不能用,小红帽也不能用。幸好我有外接的鼠标,这个可以用。但是外接的键盘还是不能用,无论如何我都没有办法输入用户名密码进入系统。之后试了很多方法,包括命令行的安全模式,也不行。
万分绝望,准备找xp安装盘进故障恢复台。这个时候突然想到,可以试下启动F8的时候选最后一次成功配置。因为后来尽管数次都启动成功,但是没有登录也没有进行任何注册表修改操作,所以它保存的应该是我修改驱动之前的配置。果然,成功了。
接下来,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet下面搜alipay,然后在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}的UpperFilters那里找到了它,干掉,只留下原始的kbdclass和我的vmware的vmkbd。哈哈,世界清静了。之后HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services也把alipay删掉,重启,一切ok.支付宝照样可以登录。
只是我没明白为何它做的这么狠。因为它在键盘的upperfilters中,所以它没有启动就导致系统根本收不到任何键盘输入?
买相机了,松下fx520
今天……唉,不说了,冲动是魔鬼。本来下楼准备吃个饭,然后听说楼下不远有个国美,就决定去看看。结果,那个国美因为奥运的缘故,早就拆了。路上遇见的那个阿姨推荐我去安贞桥看看。我想了下,反正去安贞桥和回家的距离都差不多,就当饭后散步吧,就去了。路上遇见苏宁,逛了逛。然后去逛国美,
因为苏宁和国美差不多,都比京东贵多了。京东520买1910,苏宁卖2300左右。国美的580卖2599。而且,520处于下架中基本没货的状态。我想,反正没事儿,那么去逛中关村吧。没有想到,中关村第一家的报价,就是1700。但是,中关村一台580都没有.
我选择这款机器基于以下几个被鄙视的目的:
1、莱卡的镜头。和莱卡的某款机器具有同样的外形同样的生产厂商
2、机身在日本制造。日本产,中国进销。
3、尽管我只会自动档,但是它能手动调光圈和曝光速度
4、广角
5、sony、佳能已经烂大街了。所以我要选个不怎么满不街的牌子。就像我第一个手机是飞利浦的一样
没买单反是因为我觉得我不需要多高级的相机。我需要一个金属外壳的,随手可以塞裤兜的,不怕摔的。如果那个相机像我的笔记本这么结实就好了
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上。所以……
还好的是,下载页面还是可以打开的
如果释放一个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,写了段简单的测试代码。
int ACE_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();
}
return 0;
}
我在调用条件变量的wait之前没有acquire相对应的mutex,而ACE_OS::cond_wait在调用WaitForSingleObject之前首先会调用thread_mutex_unlock错误的释放锁。结果是WaitForSingleObject立即就返回了,但是wait在醒来后试图再次获取mutex的时候陷入到了无限的等待中。这是win下特有的现象,linux我同样也试了,不会如此。但是,当一段代码逻辑本身就是错误的时候,不该再奢望它在各个平台下得到同样的结果。
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[i] = -1;
为什么非要手写一个loop而不是用memset呢?那样会更简洁,并且,或许这个系统的libc库的memset是用汇编以更高效的串移位指令实现的呢。
另外,这个开发社区反对使用一切bug管理工具,这帮狂野的人认为,邮件列表是更有效的沟通方式。
mysql 6.0对unicode的支持有很大改善
| mysql 5.x | mysql 6.0 |
| unicode 3.0 | unicode 5.0 |
| 不支持增补字符集 | 支持增补字符集 |
| ucs2/utf8,utf8最长3个字节。 | 以前的utf8被更名为utf8mb3,新的utf8支持4个字节,并增加了对utf16、utf32的支持 |
mysql 5.1 rc了一年多才发布,就这,大牛们还因不满SUN的草率而拂袖而去。6.0什么时候能发布呢?加上oracle对它不明不白的暧昧态度,估计更是遥遥无期吧。
如果不使用增补字符集,那么根本没有必要给java程序员费尽心思的讲String.length()计算的是内存的大小而不是实际字符的个数。可这么折腾来折腾去,不就主要是为了照顾中文以及那些深受汉字影响的东南亚语系吗?可中国人貌似一点也不关注这个。