博文

目前显示的是 十二月, 2012的博文

gcc中获知表达式的类型

有时候我们想知道一个东西它具体是什么类型。比如,pthread_t,它到底是个整数呢,还是个指针呢,还是什么其它东西呢?幸运的是,gcc的abi中有一个函数可以帮我们的忙。#include <iostream>#include <typeinfo>#include <cxxabi.h>#include <stdlib.h>#include <pthread.h>usingnamespacestd; intmain(int argc, char* argv[]){ int status; pthread_t thr; char* realname = abi::__cxa_demangle(typeid(thr).name(), 0, 0, &status); std::cout << realname << std::endl; free(realname); return0; } # g++ -o t test.cpp -g3 -Wall # ./tunsigned long另外,我们还可以用它来检查下数字和字符串常量是什么类型。比如0xFFFFFFFF是什么类型?#include <iostream>#include <typeinfo>#include <cxxabi.h>#include <stdlib.h>#include <pthread.h>usingnamespacestd; intmain(int argc, char* argv[]){ int status; char* realname = abi::__cxa_demangle(typeid(0xFFFFFFFF).name(), 0, 0, &status); std::cout << realname << std::endl; free(realname); return0; } 还是很有趣的.比如0x0FFFFFFF的类型是int,而0xFFFFFFFF的类型就是unsigned int。Integer literals基本规则:以0开头的一定是8进制
以…

LLVM 4.0发布,附下载地址及安装办法

官方文档: http://releases.llvm.org/4.0.0/docs/CMake.html

下载地址:
http://llvm.org/releases/4.0.0/

如果你没有找到与你系统对应的二进制包,可按下述步骤编译及安装:
下载源代码 mkdir llvm
cd llvm

aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/4.0.1/llvm-4.0.1.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/4.0.1/cfe-4.0.1.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/4.0.1/compiler-rt-4.0.1.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/4.0.1/lldb-4.0.1.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/4.0.1/lld-4.0.1.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/4.0.1/clang-tools-extra-4.0.1.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/4.0.1/polly-4.0.1.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/4.0.1/openmp-4.0.1.src.tar.xz


解压缩
for filename in *.xz; do tar -Jxf $filename ; done

mv cfe-4.0.1.src llvm-4.0.1.src/tools/clang
mv compiler-rt-4.0.1.src llvm-4.0.1.src/projects/compiler-rt
mv clang-tools-extra-4.0.1.src llvm-4.0.1.src/tools/clang/tool…

LLVM初体验

LLVM是一套新的C/C++工具链,用来取代GNU的gcc、g++、binutils(如ar、objdump等)。目前XCode 4已经把默认的编译器换成了gcc 4.2+LLVM。即用gcc 4.2做前端,生成中间代码,然后用LLVM把中间代码转换成二进制。LLVM项目还有一个子项目叫clang,是C/C++编译器的前端,用起来就跟gcc/g++基本一样。在编译速度和最终二进制码的执行效率上来说,LLVM已经勉强可以与GCC匹敌。这个只能看各处的评测报告。但是在实际可用性上来说,目前还比较惨。GNU有一套C++的标准库,libstdc++。这个必须要打补丁后才能被LLVM/clang编译过去。于是在fedora 17上,clang连一个最最简单的C++的hello world都编译不过去。编译不过的主要原因是: 1. gcc的很多内置关键字,需要clang支持。 2. gcc在对C++11的支持上远胜于LLVM,于是它就可以大胆的在libstdc++的代码中使用很多语言新特性。所以,在这个问题上,LLVM会长期处于被动、被拖累的状态。据说等clang 3.2(这周)发布后对libstdc++的支持会好点。于是Apple开了一个新项目,libc++来取代libstdc++。目前这个已经用在了Mac OS X上。但是对Linux用户来说,我觉得这是个噩梦。两套C++标准库啊…. 肯定不能混联。不信你把一个libstdc++的string*传递给libc++中试一试…… 那么做发行版的怎么办呢?只有放弃libc++。总之,如果没有用到太多C++11的标准库,在公司内部的小项目试用LLVM我觉得蛮不错的。起码错误信息更友善一点,节省些开发时间。如果现在的项目是用autotools/cmake管理的话,那么切换起来很简单。设置下CC/CXX这两个环境变量即可。Apple看来是对gcc恨之入骨,等XCode 5发布的时候,估计不会再支持gcc了。

vmware安装程序的神奇BUG!

我想用虚拟机装一个Mac OS X,据说vmware workstation 9.0新添了对Mac OS X的支持,于是我赶紧卸载8.0安装9.0试一试。我从http://www.crsky.com/soft/1863.html 上下载了zip包,解压缩得到VMware-workstation-full-9.0.1-894247.exe。这是安装程序,我嫌名字太长,就改名为vmware.exe。然后双击安装,告诉我,“setup has detected vmware software running on this machine”。不让我装!然后我在命令行下运行vmware.exe /? ,得到参数列表。发现可以通过“VMware.exe /d /v /f2 D:\1.log”这样打开调试日志。重新运行,浏览日志后发现,20121217141611:INFO *** Executing CCheckRunningProcessesOperation::Execute
20121217141611:INFO CCheckRunningProcessesOperation::Execute: checking for running process: 'vmware-vmx.exe'
20121217141611:INFO CProcess::isRunning: Could not find running process: vmware-vmx.exe
20121217141611:INFO CCheckRunningProcessesOperation::Execute: checking for running process: 'vmware-vmx-debug.exe'
20121217141611:INFO CProcess::isRunning: Could not find running process: vmware-vmx-debug.exe
20121217141611:INFO CCheckRunningProcessesOperation::Execute: checking for running process: 'vmware-vmx-stats.exe'

Tcp Fast Open and Linux 3.7

今天Linux 3.7发布了,一个引人注目的特性是,包含了完整的对TCP Fast Open(TFO)的支持,client端以及server端。传统的TCP需要经过3次握手才能建立。假设我们要从服务器上用http协议下载一个图片C->S : SYNS->C : SYN+ACKC->S : ACK+ http get requestS->S : http response所以一个最简单的HTTP请求也需要2个round-trip time才能完成。比如从北京到加州的round-trip time大约是200ms左右,2 round-trip time 就是400ms左右。无论如何增加带宽,都无济于事。Google给出了一个解决方案,让第一个SYN包就携带数据,于是在一个RTT之内就能得到response。但是,这个看似很小的改动,实际应用起来却很不容易。首先,目前只有Linux支持了TFO,先给你的Linux升级kernel吧。其次,server和client的代码都得改。server在listen之前要设置TFO选项。int qlen = 5;
setsockopt(sfd, SOL_TCP, TCP_FASTOPEN, &qlen, sizeof(qlen));client就复杂多了。去掉connect调用,send/write方法要改成sendto或者sendmsg。sendto(sfd, data, data_len, MSG_FASTOPEN,
(struct sockaddr *) &server_addr, addr_len);看完TFO的paper后,作为一个搞后台开发的程序员,我当时首先想的是,如果MySQL也启用TFO的话……我不知道你们怎么用MySQL的。JAVA程序员习惯用长连接,而PHP程序员习惯用短连接,我之前在某浪公司工作的时候,那边则是强烈要求使用短连接。短连接的原因是MySQL是按Connection分配内存资源(而非Query),短连接能提高内存利用率。但是另一方面,谁都知道,每次都打开、关闭TCP连接,进行身份认证,设置变量,会造成不必要的消耗,增大延迟。否则你告诉我,JAVA程序员干嘛非得去用连接池?但是TFO要适用在MySQL上还必须得修改MySQL协议。因…

密码能不用明文传输吗?

我发现居然还有很多,每天有几千万人次访问的网站,登录密码居然是明文在网上传输。没有https,也没有CHAP。tudou.com就是其中之一。还有某网站,虽然把登录页换成了https,但是它支持以第三方帐号登录。登录绑定页又是http。无语。能更山寨点吗?呼唤立法限制!!!

Hadoop unable to create new native thread

这已经是我第N次遇到这个问题了。我的leader是一个做事很小心的人,每次用机器的时候都生怕用坏了,任务不敢多开,进程不敢多启,而我恰恰相反,喜欢一次开几十、上百个进程让它们去跑。于是就这样了:2012-12-05 16:59:50,649 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(10.4.1.26:50010, storageID=DS-1495479526-10.4.1.26-50010-1351698048013, infoPort=50075, ipcPort=50020):DataXceiveServer: Exiting due to:java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:691)
at org.apache.hadoop.hdfs.server.datanode.DataXceiverServer.run(DataXceiverServer.java:133)
at java.lang.Thread.run(Thread.java:722)2012-12-05 16:59:50,650 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: PacketResponder 1 for block blk_-7993801208181269223_29312 terminating
2012-12-05 16:59:50,650 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Receiving block blk_-5613326197766122812_29314 src: /10.4.1.26:50409 dest: /10.4.1.26:50010
2012-12-05 16:59:50,709 INFO org.apache.h…