博文

目前显示的是 2007的博文

教训:装完gcc42后记得要重装libtool

今天很郁闷,发现,明明是用g++42编译的ImageMagick,但是其依赖的so还是libstdc++.so.5,应该是libstdc++.so.6才对。反复多次编译,都未解决。查make的输出,也都一切正确。
后来突然想到,可能是libtool 的问题,而且这家伙在每次调用libtool的时候都加了--silent参数隐藏了真正的命令执行过程。 重装libtool后,一切果然恢复。
回想下,这次第二次遇见这样的问题。上次没有记录下来。唉……

最近在看的书

最近在看的书,
《哲学概论》&& 《哲学要义》,每本看了3-4章就扔下了
《健康心理学》 看目录的时候觉得有趣,越往里看越受不了,我不关心那些试验数据以及分析,给我点科普性的结论就行了。
《The Java Programming Language》,作者之一是Java之父。我耐着性子看完了100页,但是这本书有800多页,光附录就有150页,所以,2个月内,是没指望看完了。
最近3个月读了2本小说,一本法国小说〈救救我〉,一本中国小说〈阿难〉,都是看的索然乏味的那种。
对了,上个月逛万圣和单向街的时候,发现它们都在力推一本书,〈协和医事〉,被列在榜首推荐。然后我就买了,结果……结果…… 也许是内容太积极向上了,尽是溢美之词,所以我翻了3、4章就困了,扔墙角去了。谁要有兴趣来我家拿哈。
顺便向广大青年,以及晚上睡不着爱失眠的人,推荐一本书:“责任的落寞:新民主时期的无痛伦理观”。这本书90s出的,可以用来吸纳下现代思想。

Freebsd中fileno和fileno_unlocked的区别

从一个open返回的fd创建一个FILE*,所用的函数是fdopen。而反过来,就是用fileno。
由于FILE*所指向的是一个复杂的数据数据结构,一个进程内的所有线程共享这些数据,所以在使用fileno获取FILE*内容的时候,必须先使用flockfile或pthread_mutex_lock这样的函数加锁,这一点是由libc中的fileno函数本身完成的,调用fileno函数的用户并不用关心这些。而fileno_unlocked和fileno的实现上的区别就是,前者没有加锁/释放锁。
如果
1、你的程序是单线程
2、或者,尽管是多线程,但是可以保证同一时间内只有一个线程会对这个FILE*调用fileno函数
那么就可以采用fileno_unlocked代替fileno
类似的还有clearerr_unlocked、feof_unlocked、ferror_unlocked。

伟大的java就这么否决了swap函数

在C++中,要交换一对变量,就这么简单
int a(10),int b(20);
std::swap(a,b);
不管a和b是什么类型,不管是基本类型、还是复杂类型,还是指针,都这么简单。
而java呢?可以写一篇长达数页的paper去论证,任谁也写不出这样的函数。
java的原则是,你可以把一段重复的代码写很多遍,只要:
1、这段代码很短
2、你确保你每次都不会写错
p.s. php程序员更有“天赋”:
list($a,$b) = array($b,$a);

在一个类的静态变量被完全初始化完前,调用其静态成员函数

java中,如果两个类的static initialization block相互调用怎么办? 一个类的static initialization block应该在一个类初次被使用时被调用。假如我有一个class A,它有一个static initialization block和一个名叫func的static function。还有一个叫做B的class,与A有同样的结构。 但是,特殊之处在于,如果A的static initialziation block会调用B.func这个静态函数,此时,因为发现class B的静态成员还没有初始化过,那么就会调用B的static initialization block,再如果此时B的这个block也调用A.func,那么此时该怎么办? 它会先执行A的static initialization block,执行到一半的时候再去执行B的static initialization block,此时,在A的所有变量尚未初始化完之前,进入A.func。OMG!

绕过防火墙:X11转发

我经常要连接远端的服务器,而由于种种原因,不仅防火墙加了很多限制,sshd的X11 forwarding和tcp forwarding也都被关闭了。但是没关系,自己装个tcp转发器就好了(这一点在sshd的文档中就有注明)。 下面,嘿嘿,看我是怎么把本机的6000端口转发到服务器上去的。
首先,下载个叫做netcallback的软件。http://netcallback.sourceforge.net/release/netcallback-1.3.1.zip
http://netcallback.sourceforge.net/release/netcallback-1.3.1.tar.gz然后,在本机运行xserver,那么它就会在tcp 6000端口执行监听。 最后,就是最重要的,我们要把这个端口利用netcallback转发出去。
1、在远程服务器上,运行
java -jar netcallback.jar -public -servicePort 63121 -tcpPort 6000
那么,netcallback就会在63121 和6000端口执行监听。其中63121 是netcallback和netcallback之间执行通讯的,传输一些控制信息。而6000是我们要转发的端口,用于传输x协议的数据信息。 2、在本机(运行X的机器)上运行
java -jar netcallback.jar -private -service xxx.xxx.xxx.xxx 63121 -tcp 127.0.0.1 6000
其中xxx.xxx.xxx.xxx是服务器的ip,63121是netcallback在xxx.xxx.xxx.xxx执行监听的端口。后面是要被转发出去的internet地址。 之后,所有发往xxx.xxx.xxx.xxx的6000端口的tcp请求以及数据,都会被转发到正在运行x的那台机器的6000端口。下面要做的就是把DISPLAY环境变量设置成127.0.0.1:0.0,就ok了!

《Java Programming Language》到了

《Java Programming Language》到了,第四版,Java之父的大作,很厚的一本。
嗯,从今天起,好好学java吧。 今天装eclipse的时候遇到了如下错误: Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine. 环境:Freebsd 6.2,diablo-jdk-1.5.0.07.01_8,找文档,改了下java的参数,一切ok。 setenv _JAVA_OPTIONS '-Xmx128m'

freebsd的sun rpc烂透了

亲爱的,稍微改进下你的程序吧,这不费多大事儿。
我在一个多线程的corba程序的多个worker线程中调用了sun rpc的clnt_create函数。然后我的程序偶尔会core dump.查了下,backtrace如下:
#0 0x84c7f82a in fclose (fp=0x0) at /usr/src/lib/libc/stdio/fclose.c:56
#1 0x84c4b0a2 in endnetconfig (handlep=0x86e0420) at /usr/src/lib/libc/rpc/getnetconfig.c:394
#2 0x84c40cc5 in __rpc_endconf (vhandle=0x86e0410) at /usr/src/lib/libc/rpc/rpc_generic.c:441
#3 0x84c327eb in clnt_create_timed (hostname=0x80977d8 "127.0.0.1", prog=931729681, vers=1,
netclass=0x80977d4 "tcp", tp=0x0) at /usr/src/lib/libc/rpc/clnt_generic.c:271
#4 0x84c3264d in clnt_create (hostname=0x80977d8 "127.0.0.1", prog=931729681, vers=1,
nettype=0x80977d4 "tcp") at /usr/src/lib/libc/rpc/clnt_generic.c:186
... 后面的我略了。
然后我打开netnetconfig.c看了下
endnetconfig中调用了fclose函数关闭一个叫做nc_file的file handle。而这个file handle是一个全局静态变量。
static FILE *nc_file;
然而在使用这个变量的时候,完全没有加锁。
如ni.ref++; if ((nc_file != NULL) || (nc_file = fopen(NETCONFIG, "r")) != NULL) { nc_vars->valid …

伟大的Douglas C. Schmidt居然是学社会学的

Douglas C. Schmidt是ACE的主要作者,我今天看了下他的resume,发现他居然本来是学社会学的。OMG~~Ph.D. Computer Science, summer 1994, University of California, Irvine
Dissertation: An Object-Oriented Framework for Experimenting with Alternative Process Architectures for Parallelizing Communication Subsystems.
Co-advisors: Dr. Tatsuya Suda and Dr. Richard W. Selby.M.S. Computer Science, summer 1990, University of California, Irvine, specializing in software engineeringM.A. Sociology, summer 1986, College of William and Mary, Williamsburg, Virginia
Thesis: ``A Statistical Analysis of University Resource Allocation Policies.''
Advisor: Dr. Michael A. FaiaB.A. Sociology, summer 1984, College of William and Mary, Williamsburg, Virginia
p.s.找到一本感兴趣的书,pattern-oriented software architecture vol 4: a pattern language for distributed computing.可惜国内还没有的卖,我刚下了电子版。

ACE_Svc_Handler的并发性问题

在ACE基于Reactor模式的 Acceptor-Connector 框架中:
当一个新的连接请求到达server时,会触发ACE_Acceptor的handle_input方法。
ACE_Acceptor的handle_input做三件事情:
1、调用make_svc_handle()创建一个新的 service handle。此时会调用该ACE_Svc_Handler的构造函数
2、调用accept_svc_handle(),执行accept
3、调用activate_svc_handle(),调用service handle的open方法。
在accept的时候,系统的accept函数会为每个新连接创建一个socket,然后ACE的模式是一个socket(ACE_HANDLE)对应一个ACE_Svc_Handler。在执行完accept方法后,该ACE_Svc_Handler就被Reactor关联到一个socket(ACE_HANDLE)上。当有新数据到达时,Reactor就会触发这个ACE_Svc_Handler的handle_input方法。
理论来讲一个ACE_Svc_Handler对应一个网络连接,发生并发冲突的情况很小。那么在哪些步骤可能发生并发呢?
1、首先,ACE_Svc_Handler的handle_input/handle_output/handle_close可能在open执行结束之前被调用。ACE在此模式中使用open来初始化一个对象而不是构造函数,是考虑构造函数难以处理创建中发生的各种错误(ACE不喜欢用C++ exception),那么给问题的处理带来很多麻烦。于是就用一个open函数来处理所有的初始化工作。但是,如果handle_input在open执行结束之前被调用,情况是比较可怕的。
2、ACE_Svc_Handler的析构函数可能在open执行结束之前被调用。例如handle_input返回负值的时候就会引发handle_close,而handle_close会调用delete this;删除自己,此时就会调用该对象的析构函数。而此时open正在对一些变量进行初始化,so....
那么,如何处理这些问题呢?对于每个网络连接,在每次数据接收之间经常是有一些状态需要保存的。嗯,尽量多用函数内的局部变量,少定义成员变量,多加锁。唉……

CORBA/TAO学习笔记

对象:一个CORBA编程实体,由一个标识符、一个接口和一个实现组成。对象也被称作仆人(Servant)。
对象引用:一个强类型的不透明句柄,用于标示一个对象的位置。
客户:对对象实现的接口进行调用的程序实体。
通过一个对象引用对其发送请求。
对象请求中介(ORB):提供一种机制实现客户和对象之间的请求的透明传递。对于分布式程序而言,它使得客户像调用本地函数一样调用远程函数。
ORB接口:一个ORB是一个可以被多种方式实现的逻辑实体。为了把应用的从实现细节中分离出来,CORBA规格对每个ORB定义了一个抽象接口。这个接口提供了一些有用的工具函数,例如把一个对象的引用转换成字符串。
说具体一点,一个CORBA接口就像一个纯虚的C++类。它没有任何数据成员,没有任何protected或private成员,所有的函数都是public且纯虚的。
CORBA IDL stubs and skeletons:它们像胶一样把客户端和服务应用程序分别和ORB粘起来。这些通常是由CORBA IDL编译器完成的。
动态调用接口(DII):这个接口允许客户端直接访问由ORB提供的底层请求机制。
动态Skeleton接口:这个就相当于服务器端的(DII)。
对象适配器:它帮助ORB把请求传递给对象,并且激活该对象。更重要的是,对象适配器将对象的实现和ORB联系起来。
OMG接口上的每一个操作必须具有:
1、一个名字
2、一个返回类型,可以为void
3、0个或多个参数
同时它还可以可选的含有:
1、一个raises语句,标明这个操作可能会引发哪些异常。
2、一个oneway修饰符,标明调用者不期望得到任何结果 (一般不要使用)
3、一个context语句。(这个是过时的且不可移植的,不该再被使用)
另外,操作不支持重载。
IDL到C++的映射规则:
1、每个module(模块)被映射到一个namespace或者class
2、每个interface被映射到一个class
3、每个操作被映射到c++中的一个方法
4、每个属性被映射成一对 get/set 方法
CORBA的基本设计原则:
1、将接口与实现相分离
2、位置透明。服务的使用和服务的位置是不相关的。
3、访问透明。直接通过对象执行调用。
4、类型化的接口。
5、接口支持多继承。
CORBA/C++中的参数传递:
1、内置的传入类型参数,例如,char,long,按值传
2、用户定义的传…

[转载]莫斯科大学数学力学系数学分析教学大纲

数学分析
第一学期
1。集合,集合的Cartesian积,函数与映射,集合的等价,有理数集的不可数性。
2。集合及其子集蔟的不等价性的Cantor定理。连续统的不可数性。
3。自然数,自然数的公理与运算,数学归纳原理。
3。实数的小数表示,Archimedes公理,有界数集的确界存在性。
4。集合的可分理性引理,数集的分割引理。
5。实数域的唯一性原理,实数域的完备性。
6。数列,无穷大与无穷小数列及其性质,Bernoullis不等式与Newton二项式。
7。收敛数列与他们的算术性质,Stolz定理。
8。求代数方程根的迭代方法。
9。复合收敛数列的Toeplitz变换,Toeplitz定理,数列极限的Cauchy定理,数列的Cau
chy和,Abel定理。
10。极限的定义,单调数列,Weierstrass定理。
11,无理数与有理数。
12。子列的极限,Bolzano-Weierstrass定理。
13。数列收敛的Cauchy准则。
14。函数极限的Cauchy定义,无穷小函数,函数极限的有限性,单调函数极限的性质,
连续函数的算术运算。
15。函数极限存在的Cauchy准则。
16。函数极限的Cauchy与Heine定义的等价性。
17。复合函数的极限。
18。函数在某一点上的连续,连续函数的算术运算,三角函数与指数函数的连续性。
19。一些重要的极限。
20。单调函数的间断,单调函数的不连续性。
21。反函数的连续性,初等函数的连续性,Kepler方程解的连续性。
22。区间上连续函数介值的Cauchy定理。
23。区间上连续函数一致连续性的Cantor定理。
24。Khinchin归纳原理,数直线上的连通集,连续函数的连通性,。
25。函数可微性的概念及其导数,函数连续性与可微性的联系,反函数与复合函数的导
数,Kepler方程解的可微性。
26。导数的和、差、积、商,Leibnitz公式。
27。增函数的Darboux定理,Rollet定理,导数的中值定理。
28。Cauchy定理与Lagrange定理。
29。常数、单调与严格单调函数的判断准则。
30。l'Hopital第一公式,具有Pean余项的Taylor公式。
31。l'Hopital第二公式。
32。具有Lagrange余项的Taylor公式,初等函数按Taylor公式展开。
33。函数极值的判断与必要条件。
34。函数的的凸性,奇点,渐进线,Jen…

检测一个进程是否还在运行(safe_xxx)

mysqld给我们提供了一种模式,就是:
不直接启动daemon(mysqld),而是通过一个脚本来启动这个daemon(safe_mysqld),并定时检查这个daemon是否还存在。
如何给我们自己写的daemon也做到如此效果呢?freebsd下提供了一个叫做daemon的命令(man 8 daemon)
假设我们有一个叫做taskd的进程
那么我们可以这样启动它
daemon -f -p /var/run/taskd.pid /usr/local/bin/taskd
然后把这个命令加入到crontab中,让其每分钟执行一次。那么系统就会自动每分钟检查taskschd这个程序是否还在,不在则自动重起。

自己写个类似于BDB的数据库?

其实本来我只是需要一个队列系统,所需要的数据存储和并发控制、同步功能在BDB中都有,一切都很完美。但是,最初遇见的是环境的问题,因一个进程异常退出而导致要重新启动所有使用该环境的进程。这个问题刚解决,又遇到了死锁的问题。BDB我只懂皮毛,不知道死锁如何产生的,只知道在shell下运行db_deadlock就可以让陷入死锁的程序继续运行下去。神啊!
BDB的同步还存在一个问题,就是多个进程/线程在等待同一个queue类型的数据库的数据的时候,当一个数据被塞进去后,是所有在等待的进程都被唤醒。怎么办?
最基本的思想,就是通过mmap把一个文件映射到内存中来,然后这个文件分为两部分,head和data。head中是一些meta data,诸如counter of items、mutex等,后面是一系列的data。
每次打开前,需要获取一个跨进程的锁,然后检查meta data部分的有效性,如果出错,那么尝试恢复或者退出。
对于queue这样的等待事件,最好是用 posix semaphores 来通知/唤醒。
。。。。
一些零碎的想法,嗯。

在TAO中用线程池创建CORBA服务

1、创建ORB、poa、poa_manager对象
CORBA::ORB_var orb = init_orb_with_naming_service(argc,argv); CORBA::Object_var poa_object =
orb->resolve_initial_references ("RootPOA");
PortableServer::POA_var poa =
PortableServer::POA::_narrow (poa_object.in ());
PortableServer::POAManager_var poa_manager =
poa->the_POAManager ();
poa_manager->activate ();
TAO_ORB_Manager orb_manager(orb.in(),poa.in(),poa_manager.in());
如果一切都采用默认的话,可以直接用TAO_ORB_Manager这个类协助创建。
2、创建对象并注册服务
CORBA::Object_var naming_context_object =
orb->resolve_initial_references ("NameService");
CosNaming::NamingContext_var naming_context =
CosNaming::NamingContext::_narrow (naming_context_object.in ());
CosNaming::Name name (1);
///创建对象
slib_ChannelFactory_i channelFactory_i(poa.in(),poa_manager.in());
///用默认poa激活
::slib::ChannelFactory_var channelFactory=channelFactory_i._this();
name.length (1);
name[0].id = CORBA::string_dup ("my…

gcc的又一个BUG:优化abs出错?

测试代码: #include <stdlib.h> #include <stdio.h> intmain(){ int i=2; if( (-2*abs (i-1)) == (2*abs(i-1)) ) printf ("OMG,-10==10 !!\n"); elseprintf ("nothing special here\n"); } 测试环境:
Freebsd 6.2, gcc 3.4和gcc 4.2
输出都是"OMG,-10==10 !!"。
为什么呢?
freebsd的libc的abs的实现在/usr/src/lib/libc/stdlib/abs.c,但是我在gdb中对这个函数下断点发现并没有进入这个函数。然后用gcc -S编译,查看源代码发现它并没有调用libc库的abs函数,而是被gcc优化掉了,尽管我是用gcc -O0编译。
核实了下,的确,gcc在其内部实现了abs函数,如果这样编译
gcc42 -o test1 test1.c -ggdb -fno-builtin
则就调用libc的abs函数,就没有问题了。

真是想不到什么办法对一个typedef进行forward declaration

我要在一个类的头文件中使用 DB* db_handle;这样一个变量。DB这个类型是在BDB的头文件中定义的,但是我又不希望在我的头文件中包含BDB的这个头文件。于是我就尝试用
struct DB;
这样的方式在我的头文件中进行forward declaration。但是不幸的是,DB是一个typedef而不是一个struct/class;
struct __db;
typedef struct __db DB;
唉~~
我真是想不到什么办法对一个typedef进行forward declaration,只是被迫的先声明成void*然后在使用的时候强行的转成DB*。

TAO中序列化一个对象

每种RPC方式都必须提供一种序列化机制,以把参数列表中的参数转化成字节流通过传输层发送给对方。如sun rpc使用的是xdr,web service使用soap格式的xml。而对于CORBA,标准中并没有对之做细致的规定,只是在iiop中做了一些简略的规范。
下面一段示例代码序列化一个Any对象。(这里所说的序列化与POA中的持久化还是有些区别的。) TAO_OutputCDR cdr; cdr << data; CORBA::ULong size(ACE_Utils::truncate_cast<CORBA::ULong> (cdr.total_length ())); CORBA::OctetSeq seq(size); seq.length (size); char* buffer = reinterpret_cast<char*> (seq.get_buffer ()); { char* buf = buffer; for (ACE_Message_Block const* mb = cdr.begin (); mb != 0; mb = mb->cont ()) { ACE_OS::memcpy (buf, mb->rd_ptr (), mb->length ()); buf += mb->length (); } } 之后就可以以这样的方式把这个对象发送给对方 socket_.send (buffer, size);

一个想法,用CORBA封装BDB

BDB是一个非常棒的东西,但是有很多局限性。例如
1、它仅限于同主机内访问,数据库和应用程序必须放在同一台主机上。尽管提供了sun rpc接口,但是用起来很不方便
2、使用同一个环境的所有进程中,只要有一个死掉(在关闭环境之前意外退出),其它的就得概率性的统统重新打开环境。
如果,我提供一个类似于mysqld的东西,恩,就叫bdbd(有些绕口)。它以corba的方式对外提供OO接口。恰好,bdb的C api都是OO风格的。嗯,那么就解决了这两个问题。
需要额外要做的,是几个认证接口。还好前几天我刚分析了mysql的协议,我准备借用它的一些函数来完成这件事情。

可恶的TAO/COS Event Service

我希望借COS Event Service实现队列,于是就采用了PushSupplier和PullConsumer。 但是问题百出。event怎么着都无法从supplier传递到consumer中去。
我先启动consumer,结果supplier无法启动,挂起在这里
CosEventChannelAdmin::ConsumerAdmin_var comsumer_admin = ec->for_consumers();
我先启动supplier,ok,一切都好,数据发送成功。但是consumer却一直停留在CosEventChannelAdmin::ProxyPushConsumer_var->push(data);这里。死活都一直接收不到数据。最可恨的是,然后我无论试图再启动一个consumer或者supplier,都无法启动,依然是停留在ec->for_consumers这里,不知道为什么。
OMG~ 谁指点下我?为什么会这样?
为什么会停留在ec->for_consumers?为什么接收不到数据?数据去哪里了?

corba的效率啊……

本来以为corba的效率会很高,结果比较出乎我的意外。我用的是tao,它的设计和实现是侧重于嵌入式系统和实时应用的,效率应该是比较不错的。但是……执行一个非常简单的corba调用,需要4s或者更久。我加了些调试语句,发现主要是慢在第一次执行调用的时候。此时要建立网络链接等等,需要花很久时间。之后几次调用就非常快。
唉。。。。

终于在treo 650上装好QQ了

在tompda上找到一个, firstfan做的。
感觉……这个QQ比较简陋。聊天的时候输入一段话后,如果点完成而不是发送,再次进来的时候,刚才输入的话居然不见了。
另外,没有群的功能?
唉……palm越来越没落了

Freebsd 6.2下编译ACE 5.6.x

遇到两个错误:
1、In file included from ../../ace/OS_NS_signal.h:149, from ../../ace/Signal.h:29, from ../../ace/Dev_Poll_Reactor.cpp:5: ../../ace/OS_NS_signal.inl: In function 'int ACE_OS::pthread_sigmask(int, const sigset_t*, sigset_t*)': ../../ace/OS_NS_signal.inl:31: error: '::pthread_sigmask' has not been declared gmake[3]: *** [libACE_la-Dev_Poll_Reactor.lo] 错误 1 gmake[3]: Leaving directory `/data0/install/ACE_wrappers/objdir/ace' gmake[2]: *** [all-recursive] 错误 1 gmake[2]: Leaving directory `/data0/install/ACE_wrappers/objdir/ace' gmake[1]: *** [all] 错误 2 gmake[1]: Leaving directory `/data0/install/ACE_wrappers/objdir/ace' gmake: *** [all-recursive] 错误 1 解决办法:
打开ace/OS_NS_signal.inl,在头部添加#include <pthread.h>#include <signal.h>2、In file included from ../../ace/OS_NS_netdb.h:142, from ../../ace/ICMP_Socket.cpp:9: ../../ace/OS_NS_netdb.inl: In function 'hostent* ACE_OS::gethostbyaddr_r(constchar*…

整理文档

最近整理了很多以前自己写的老的文档出来然后贴到blog上。因为我发现这样事实,一味的通过各种途径提高工作效率,是不顶用的!就算我能把工作效率相对于现在再提高50%,又有什么用呢?没有多大效果。继续招人,加强新员工的培训。他们只要每人能帮忙多承担20%的工作,那么我肩上的担子就要落下近一半。
我现在迫切的希望改变现在的工作状态,以及生活状态。我希望在上班时间也能有小部分时间去阅读一些技术书籍和文档。我希望上班正在调试程序的时候不总被电话打断。我希望每天晚上可以关掉手机睡觉。
有些是容易改变的,例如从明天早上起,每天早起来10分钟恢复吃早饭的习惯。有些只能是奢望,如晚上可以关掉手机睡觉,除非我不再在现在的部门呆了。

在Linux下安装ACE

最近几年一直在用Freebsd,后来发现它对posix线程、队列这些东西支持实在太差,再加上项目上的种种原因,现在又改用linux了,唉……
Freebsd的ports中ace还是5.5,而tao还停留在5.4,其实ace+tao的5.6已经出来好一阵子了。
好吧,说正文。总体来说,自从ace加入了configure脚本后,配置、编译容易多了。
首先在ace的目录下建立一个build目录。$ mkdir build然后进去执行configure脚本$ cd build;../configure然后gmake,就这么简单。编译的过程非常的漫长,唉~~~~

在FreeBSD/Linux/Solaris下部署smart磁盘监控程序

1、安装
Freebsd:

cd /usr/ports/sysutils/smartmontools
make BATCH=yes
make install

Linux或solaris:
wget http://ports.cn.freebsd.org/smartmontools-5.37.tar.gz
tar -zxvf smartmontools-5.37.tar.gz
cd smartmontools-5.37
./configure --with-docdir=/usr/local/share/doc/smartmontools --enable-sample --prefix=/usr/local --mandir=/usr/local/man --infodir=/usr/local/info/
gmake
然后切换到root
gmake install
2、配置
(1)、首先确定自己有多少块硬盘
Linux:
$fdisk -l |grep '^Disk'|cut -d' ' -f2|cut -d':' -f 1
Freebsd
$ sysctl kern.disks | cut -d':' -f 2 | sed -e 's/ / \/dev\//g'
Solaris:

(2)、检查各块硬盘是不是支持smart
 对挨个硬盘运行下面的命令
 smartctl -i /dev/sda
 每次更换下最后一次参数(/dev/sda)
 如果没有任何一块硬盘支持smart,那么就算了吧。

(3)、根据输出结果编辑配置文件
cp /usr/local/etc/smartd.conf.sample /usr/local/etc/smartd.conf
然后用文本编辑器打开/usr/local/etc/smartd.conf
注释掉第23行的
DEVICESCAN
(这一行就这么短,后面没有什么了)

然后在下面加入这样的东西
/dev/sda -d scsi -H -C 0 -U 0 -m changming@xxx.com
/dev/sdb -d scsi -H -C 0 -U 0 -m changming@xxx.com
/dev/sdc -d scsi -H -C 0 -U 0 -m changming@xxx.com
/dev/sdd -d sc…

刚装上了Adobe Design Premium CS3

嗯,今天腾了3G空间,把以前的dreamweaver 8.0撤下,换了CS3 。感觉没有太大的变化。
顺便装了adobe acrobat 8.0 professional,想试一试它创建文档的功能,于是就试图从已有的文本文件创建pdf,结果……每次都是以acrobat报错而退出。
试了下Indesign,好高级的咚咚,不会用。太in了
没装photoshop,不喜欢

Linux下做软RAID

0、切换到root用户1、查看有多少块硬盘可用
$ fdisk -l
嗯,一般而言,留下系统盘不动,其它的盘如果大小相同的话,统统合起来做一个raid。2、决定做什么类型的raid。
raid-0、raid-1、raid-5?
如果有三块一样大小的盘(或者更多),那么极力推荐raid-5。
否则请根据实际情况选择raid-0或者raid-13、卸载已挂载的数据盘
首先查看下,要做raid的几块盘是不是已经被挂载过了
$ mount
如果有,那么挨个删除数据、然后用umount卸载。
然后,还有,打开/etc/fstab,注释掉那些刚卸载的分区。免得万一操作中失误,导致机器重起,然后它又起不来……4、使用fdisk更改硬盘分区类型为Linux raid auto
以/dev/sdb为例:
$ fdisk /dev/hdeThe number of cylinders for this disk is set to 8924.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)Command (m for help):嗯,如果不了解linux下的fdisk的用法,可以先输入m看看帮助。
(注意:freebsd和windows、dos下也有fdisk,但是只是名字相同,界面和用法都相差很大。windows xp及以后版本摒弃了fdisk)
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new p…

新糊涂的转信恢复

新糊涂的转信恢复
哎,好久没碰bbs的代码了,翻文档,查代码,折腾了近一周才搞定
555555
熟能生巧,不知道还有哪个bbs想开转信的

pf转发的疑惑

我今天按照pf的手册配置端口转发和负载均衡,但是遇到问题。转发到本机的端口可以,转发到其它主机就不行。后来仔细查了下,发现原理是这样的假设有这样一条规则rdr on tl0 proto tcp from 192.0.2.1 to 24.65.1.13 port 80 -> 192.168.1.5 port 8000那么如果从192.0.2.1 连接24.65.1.13 的tcp 80端口,那么首先192.0.2.1会给24.65.1.13 发一个SYN包。包头如下Source address: 192.0.2.1Source port: 4028 (arbitrarily chosen by the operating system)Destination address: 24.65.1.13Destination port: 80然后在经过pf执行rdr规则之后,包头如下Source address: 192.0.2.1Source port: 4028Destination address: 192.168.1.5Destination port: 8000然后这个包会从24.65.1.13某个合适的网卡出去(根据netstat -nr中的路由表规则而定),到达192.168.1.5这台主机。192.168.1.5 这台主机会给192.0.2.1 回复一个SYN-ACK的包。如果不出意外,192.0.2.1会顺利收到这个包。但是它不会理会。因为它试图与24.65.1.13的80端口建立连接,但是得到的回复却是来自于192.0.1.5。于是192.0.2.1继续发SYN包,192.0.1.5继续回复,直到timeout。此时用pfctl -s state查看,会得到这样的信息self tcp 192.0.1.5:8000 <- 24.65.1.13:80 <- 192.0.2.1:4028 CLOSED:SYN_SENT如果192.0.1.5的所有向外的数据都是通过24.65.1.13进行nat出去的,那么连接就可以顺利建立。因为此时192.0.2.1看到的是24.65.1.13的IP。如果转发是在同一台主机上发生,那么就可以看到一个有趣的现象,用netstat/sockstat看到的连接状态是不对称的。会看到一条LOCAL AD…

内奸

这是一个短时间内快速组建起来的团队,人来自各方,有的是直接从竞争对手那里挖过来的,大家素未谋面,只是网友。但是,突然,怀疑有内奸。因为发在内部讨论区的很机密的东西被人公开张贴到了竞争对手门口。这样的事情一再发生,团队陷入恐慌。谁?!
一番波折过后,到现在,一切算是水落石出,风平浪静。而我依然恐惧。我在想,如果我是leader,我该怎么办?面试实习生的时候,怎样确信他不是奉竞争对手之命窃取资料而来?组建一个团队的时候,如何能让所有人的利益找到同一个共同点?当危机出现后,该怎么去处理?God knows...

新手机的缺点

色深只有16位(65536色),所以电脑上彩色图片(尤其是jpg)在treo上看的时候就会失色,有时显得非常难看。(你可以尝试把电脑的显示器调成16位色深,再去看看那些你收藏的精美图片)
不支持wifi。如果支持wifi的话,我就在买个无线路由放家里。反正公司有wifi,家里有wifi,咖啡馆有wifi,书店有wifi,马路上还常常能收到信号微弱的free public wifi。哇……随时拿手机免费上网~~
即时通讯类的软件太少。据说QQ在很久很久以前曾开发过palm os下的qq,反正现在没有了,只有第三方的基于java的极不稳定版。中国移动用于免费发短信的"飞信"支持很多手机平台,但是没有palm。
尽管手机可以用来看电影,但是毕竟屏幕太小,带字幕的电影根本没法看。尽管手机可以用来听mp3,但是由于treo 650耳机插孔的天生缺陷,买treo的人一般都不敢插耳机,否则经常得去修。可是如果不插耳机,就靠手机本身的听筒来听mp3...唉……和其它手机相比,效果中等。如果贼有钱,买个蓝牙耳机吧!
ok,说到蓝牙。treo对蓝牙的支持只到1.2。即便是treo 680也是如此。而蓝牙2.x和蓝牙1.x的传输速度的差别是巨明显的。
摄像头,有是有一个,2倍变焦的,效果很模糊。对于此,treo爱好者的解释是:“treo的摄像头就是用来即拍即发送的,要那么清晰干吗,太清晰的图片太大,发送慢,要清晰买数码相机去。”
说到底,手机最主要的两个功能也就打电话和发短信。
treo 650的待机时间还行,电池比680好。但是与nokia等相比通话质量很差。

在Freebsd下用geom作软RAID

嗯,Freebsd截至到6.x,都还只支持raid-0和raid-1,不支持raid5。
下面说如何利用geom框架中的gmirror实现raid1。
假设有两块空的数据盘,/dev/da1,/dev/da2。要求大小一样。
首先把/dev/da1和/dev/da2联合成一个磁盘data,调度算法采用round-robin
#gmirror label -v -b round-robin data da1 da2
然后加载gmirror。
#gmirror load
此时在/dev/mirror 下就有一个叫做data的盘了。
然后初始化这个盘
#fdisk -vBI /dev/mirror/data
#bsdlabel -wB /dev/mirror/datas1
#newfs -U /dev/mirror/datas1a
然后按照平常的方式挂载即可
#mount /dev/mirror/data /data1
为了让gmirror能够开机自动加载,需要把这句话追加到/boot/loader.conf中
geom_mirror_load="YES"
然后,如果为了加载方便,那么请在/etc/fstab中增加一条挂载项。

MYSQL5 新建从库的步骤

由于误操作等种种原因,MYSQL的主从库之间经常会发生不同步的问题。解决办法是停掉从库,删除所有数据。并按以下步骤重建从库。
1、mysql_install_db --datadir=/data1/slavevar
2、在/data1/slavevar下设置my.cnf
主库的my.cnf示例
[mysqld]
log-bin=mysql-bin
server-id=1
port = 3306
socket = /tmp/mysql.sock
从库的my.cnf示例
[mysqld]
log-bin=mysql-bin
server-id=2
port = 3307
socket = /tmp/mysql.3307.sock
relay-log = /data1/slavevar/localhost-relay-bin
3、chown -R mysql:mysql slavevar
4、/usr/local/etc/rc.d/mysql-server-slave start
5、登陆主库
FLUSH TABLES WITH READ LOCK;
然后运行
SHOW MASTER STATUS
并记录下状态
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 223 | | |
+------------------+----------+--------------+------------------+
6、从主库中dump出所有数据
mysqldump -hlocalhost -uroot -p --all-databases --master-data > dbdump.db
7、释放主库的锁
在mysql下运行
unlock tables;
8、启动从库
/usr/local/l…

新浪网招聘高级研发工程师(多名)

1)新闻发布系统高级研发工程师
岗位职责:参与新闻发布系统的规划、研发、维护等工作;
任职要求:
1、重点综合性大学计算机或相关专业本科以上毕业, 英语4级以上, 能熟练阅读英文文档;
2、熟悉HTTP协议及W3C相关互联网规范,熟练掌握XHTML、CSS、DIV、Javascript技术;
3、具备2年以上的互联网行业Unix/Linux/FreeBSD下的C/C++开发经验,熟悉面向对象的软件设计方法,熟悉设计模式的应用;
4、熟练掌握Perl编程语言,至少有1年的Perl开发经验;
5、熟练掌握MySQL数据库应用,具备数据库应用系统的规划及设计能力;
6、具备良好的代码编程习惯及较强的文档编写能力;
7、具备强烈的进取心、求知欲及团队合作精神,有较强的沟通及协调能力;
8、具备CMS系统开发经验者优先考虑;
欢迎优秀人才加盟,一旦录用,待遇从优!联系邮箱: job@vip.sina.com
2)新闻抓站系统高级研发工程师
岗位职责:参与新闻抓站系统的规划、研发、维护等工作;
任职要求:
1、重点综合性大学计算机或相关专业本科以上毕业, 英语4级以上, 能熟练阅读英文文档;
2、具备良好的代码编程习惯及较强的文档编写能力,有较强的沟通及协调能力;
3、具备1年以上的Solaris或Linux或FreeBSD下的C/C++开发经验,有扎实的C/C++根基;
4、熟悉Unix下的系统编程和网络编程,熟悉面向对象的软件设计方法;
5、熟悉HTTP协议及W3C相关互联网规范,熟练掌握XHTML、CSS、Javascript技术;
6、熟练掌握MySQL数据库应用,具备数据库应用系统的规划及设计能力,具有熟练的mysql维护能力。
7、熟悉Perl编程语言
如具有以下开发经验或者技能更佳:
1、有内容管理系统的开发经验
2、有Web Mining领域相关专业背景或知识
欢迎优秀人才加盟,一旦录用,待遇从优!联系邮箱: job@vip.sina.com
3)新闻搜索系统高级研发工程师
岗位职责:参与新闻搜索系统的规划、研发、维护等工作;
任职要求:
1、重点综合性大学计算机或相关专业本科以上毕业, 英语4级以上, 能熟练阅读英文文档;
2、具备良好的代码编程习惯及较强的文档编写能力,有较强的沟通及协调能力;
3、精通C/C++/Java中至少一门开发语言,熟悉面向对象的软件设计方法,熟悉设计模式的应用;
4、对算法设计,数据结构有深…

几种lock

lockf(), fcntl(2), and flock(2) 相容。
flockfile与flock没有关系。flockfile一般是用pthread_mutex实现的,一个带计数的锁,该锁被最近一次调用flockfile的线程所拥有。
调用flockfile时,如果该stream未被调用过flockfile或者拥有者不是当前线程,则尝试获取锁(此处可能会陷入等待),并将计数器初始化为1。
如果上次调用flockfile的就是此线程,则counter的计数加一。
调用funlockfile时,如果锁的拥有者不是当前线程,则释放锁,否则计数器减一。
计数器归0后,锁被释放。
flockfile适合被用于同一个进程内多个线程间的带计数的同步。

FreeBsd的PID库使用说明

pidfile_open打开一个文件,例如/var/run/httpd.pid,然后使用flock锁住这个文件。
如果锁文件失败,说明有同样的进程正在跑,那么从该文件中把pid读出来,并返回。
这个函数可以在fork之前调用。
pidfile_write函数把pid写入到刚才打开的pid文件中。
pidfile_close关闭刚才打开的pid文件,应该在fork开始一个子进程之后调用。
pidfile_remove删除pid文件
示例代码:struct pidfh *pfh; pid_t otherpid, childpid; pfh = pidfile_open("/var/run/daemon.pid", 0600, &otherpid); if (pfh == NULL) { if (errno == EEXIST) errx(EXIT_FAILURE, "Daemon already running, pid: %d.", otherpid); /* If we cannot create pidfile from other reasons, only warn. */ warn("Cannot open or create pidfile"); } if (daemon(0, 0) == -1) { warn("Cannot daemonize"); pidfile_remove(pfh); exit(EXIT_FAILURE); } pidfile_write(pfh); for (;;) { /* Do work. */ childpid = fork(); switch (childpid) { case -1: syslog(LOG_ERR, "Cannot fork(): %s.", strerror(errno)); break; case0: pidfile_close(pfh); /* Do child work. */b…

Berkeley DB 学习笔记

Berkeley DB 的数据库 目前提供四种访问方式:Btree, Hash, Queue和Recno。每个数据库是以什么样的方式创建的,以后就必须用什么样的方式访问。
对用户而言,Berkeley DB内存储的都是key-pair这样的键值对。
对于Btree,在插入、删除一条记录的时候,其它记录的record number也会随之而改变。而Queue不变。Recno可设置为改变或不改变(默认是不改变)。
Hash不支持Logical record number。
Btree:
采用已排序的、平衡树的结构存储数据。查询、插入、删除的效率都是0(logN)。
既支持按key查找,也支持按record number查找。
Hash:
以hash的结构存储数据。采用的方式是“Extended Linear Hashing”
Queue和Recno只存储data,key是由数据库内部产生一个logical record number来唯一标识每条记录。
Queue:
每条记录的长度固定。(即每条记录的最大长度必须实现已知)
可以使用get方法从队列的头部原子化的获取并删除记录。
支持记录级别的锁,因之比Recno具有更高的并发度。
在插入、删除一条记录的时候,其它记录的record number不会改变。
Recno:
每条记录的长度固定或不定。
可采用一个flat text file做后存储。
如果记录的长度不定,且采用了一个flat text file做后存储,则需要设置一个特殊的字节做为记录的结束符。如果没有设置,默认是'\n'。如果有多个进程要同时向其插入/删除数据,则需要一次把整个后存储文件读入,否则只在调用get的时候读入必须的行。而且应该只有一个进程设置了flat text file,且该进程需要设置DB_SNAPSHOT参数。
对于二进制数据,可以采用出现频率最小的数字(d)做为结束符,在插入的时候把原始数据中出现d的地方后面再加一个d。
例如以下的代码向/tmp/make.conf中追加一行intmain(int argc,char* argv[]){ setlocale(LC_ALL,""); DB* db; db_create(&db,NULL,0); ///此处应该先ftrylockfile /tmp/mak…

再说BSD/Linux的su

用惯了Linux的人再去用BSD的时候,很多都会抱怨说为什么只有wheel组的人才能su? wheel是一个什么东西?
在gnu版的su的man页的末尾,有这么一段 Richard Stallman 的 解释:
Sometimes a few of the users try to hold total power over all the
rest. For example, in 1984, a few users at the MIT AI lab decided to
seize power by changing the operator password on the Twenex system and
keeping it secret from everyone else. (I was able to thwart this coup
and give power back to the users by patching the kernel, but I wouldn't
know how to do that in Unix.)

However, occasionally the rulers do tell someone. Under the usual
`su' mechanism, once someone learns the root password who sympathizes
with the ordinary users, he or she can tell the rest. The "wheel
group" feature would make this impossible, and thus cement the power of
the rulers.

I'm on the side of the masses, not that of the rulers. If you are
used to supporting the bosses and sysadmins in whatever they do, you
might find this idea strange at first.

而现在,那么一个大机房很多个无盘工作站共用一个Unix机的状况已经很少见了。站在系统管理员的角度来想…

列出机器上所有的网卡

功能类似于ifconfig -l
仅限bsd 下使用#include <sys/types.h> #include <sys/socket.h> #include <ifaddrs.h> #include <iostream> intmain(int argc,char* argv[]){ struct ifaddrs* ifap; if(getifaddrs(&ifap)) return -1; while(ifap!=NULL){ std::cout<<ifap->ifa_name<<std::endl; ifap=ifap->ifa_next; } freeifaddrs(ifap); return0; }

玩栈溢出

voidmytrap(void){ puts("I win"); } intfunc(int c){ int buf[100]; buf[10]=c; ///把以前的返回地址存储起来///这里以前存储的是本函数的第一个参数的值 buf[102]=buf[101]; ///把栈中的返回地址给修改掉 buf[101]=&mytrap; return0; } intmain(int argc,char\* argv[]){ func(10); return0; } 以前我发现过windows xp自带的ftp客户端存在缓存区溢出的漏洞,并且在微软新闻组上报告了该漏洞。只是后来一两年也没发现过有关于它的补丁。

dbenv的问题

我的一个程序使用了berkeley db数据库,并且使用了env。但是这个程序偶尔会被其它的进程kill -9杀死。当它再次启动的时候,有可能会发现 env已经被损坏,然后就打开数据库环境失败。
解决办法是在打开env的时候加入这两个flags:DB_REGISTER|DB_RECOVER。这样一来,程序的启动速度就会明显慢很多,但是它会自动检查env并修复不一致。

站在面向对象的角度理解IPC

全局函数是特殊的对象序列化是对象的7大基本元素之一webserivce、sun rpc,所要解决的第一个问题就是如何把函数的参数序列化。对于sun rpc,它采用了xdr,对于webservice,它采用了xml(soap)函数自身也可被序列化,不过它很简单,例如只需要找一个唯一的标识符来表示它。sun rpc采用整数(程序号、版本号、函数号),webservice采用自身的一套xml规范。序列化完成后所要做的就是选择恰当的传输协议传输过去。相比而言,sun rpc很自由,tcp、udp、unix domain socket都可以,而web service则是主要使用http,也有udp的规范,还有smtp的但是很少使用。对于同主机内的ipc,它无法采用unix domain socket这样的高效方式。记得有人说
web service = http + xml + rpc<

升级了下blog所用的wordpress

晚上没事儿做,就升级了下blog所用的wordpress。从2.0.x升级到2.2.x。开始的时候总是失败,反复的download、upload,更新、回滚,后来发现是我以前所用的统计软件 firestat 和这个版本的wordpress不兼容。唉……删了它!
感觉wordpress的可视化编辑器还是太弱太弱了。不过新版本加了export功能,是我比较喜欢的。

大名鼎鼎的expat原来不支持gb2312

Catch EvalException: Couldn't open encmap gb2312.enc: No such file or directory at /usr/local/lib/perl5/site_perl/5.8.8/mach/XML/Parser.pm line 187 (in cleanup) Couldn't open encmap gb2312.enc: No such file or directory at /usr/local/lib/perl5/site_perl/5.8.8/mach/XML/Parser.pm line 187 我本来以为是perl5的xml::parser包的问题,后来查了下man和google才知道原来expat只支持4种编码:US-ASCII, UTF-8, UTF-16, and ISO-8859-1.而我的文档是gb2312。于是就……

发现freebsd 6.2的rpcgen的2个bug

重现方法:1、写一个简单的.x文件,保存为my.x
2、运行命令 /usr/bin/rpcgen -CMm -IP my.x -o my.c && /usr/bin/rpcgen -CMh -IP my.x -o my.h该命令的目的是为所写的.x文件生成合适的C/C++代码。但是它生成的代码有几个问题BUGS:1、某头文件位置错误#ifdef __cplusplus#include /* getdtablesize, open */#endif /* __cplusplus */sysent.h这个文件在freebsd中不是在/usr/include下,而是在/usr/include/sys/include下。所以此处最好是#ifdef __cplusplus#include <sys/sysent.h> /* getdtablesize, open */#endif /* __cplusplus */2、大量的使用了solaris的mutexmutex_t _svcstate_lock; mutex_lock(&_svcstate_lock); (类似于此的代码多次出现) 编译的时候会提示找不到mutex_t的定义。此处应该为pthread_mutex_t _svcstate_lock; pthread_mutex_lock(&_svcstate_lock);

使用mysql长连接的时候要注意

首先,如果使用了长连接而长期没有对数据库进行任何操作,那么在timeout值后,mysql server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL server has gone away“这样的错误。一个好的解决方法是使用mysql_ping。在使用mysql_real_connect连接数据库之后,再使用mysql_options( &mysql, MYSQL_OPT_RECONNECT, ... ) 来设置为自动重连。这样当mysql连接丢失的时候,使用mysql_ping能够自动重连数据库。如果是在mysql 5.1.6之前,那么则应在每次执行完real_connect 之后执行mysql_options( &mysql, MYSQL_OPT_RECONNECT, ... ) ,如果是mysql 5.1.6+,则在connect之前执行一次就够了。有一种很自然的想法就是,新开一个线程,让它隔一定时间(如20秒)就执行一次mysql_ping.除此而外它什么都不用做。但是显然,这个线程必须与其它线程共享一个mysql连接,共享该mysql句柄。否则这样做一点意义都没有。但是,mysql_ping会改变mysql_affected_rows的返回值。所以最好是给该MYSQL句柄再加一个mutex(最好是读写锁)。当其它线程准备执行query的时候,就获取锁,执行完就释放。而这个执行mysql_ping的线程在执行ping之间先尝试获取锁,如果获取失败,则继续sleep,放弃这一轮的ping.

weekend

21:36 2007-8-11今天呆在屋里玩了一整天游戏哪里也没有去,懒得说话,懒得发短信。离开房门最远的一次是晚上出门直走再左转吃了碗羊肉泡馍。
昨晚又做了一个很重复的梦。梦见我和两个人拿了三把小手枪逃命。我们在一个村子里,被一群人包围了。我在门口偷听两个人的谈话说他们要派人去地道守着以免我们从哪里逃出去。于是我知道这个房子下面有地道。我找到了它,我决定冒险一试。但愿我们能赶在他们前面逃出去。那个地道很宽,很高,很像火车山洞那样,只是非常明亮。我带着他俩逃进去。不幸走了一大半的时候,突然对方冲出敌人。他们赶过来了,他们发现我们了。而这样的地形下,我们连个躲藏的地方都没有。笔直笔直的洞子。我手上那把枪不是我的是别人的,手感很不好。我惊恐万分。不知道怎么着我发现左面有窗子然后跳了出去。他们跟在我背后也跳了出来。出来之后是在一座山头上。周围是翠绿的一片崇山峻岭。我不知道我们在哪里。不知道是否已经逃出了敌人的包围。总的来说最近过得还是很不错的,上周就周四晚上加了几个小时的班,其它时间都是还比较轻松。周四下午还给内部做了一个spider的培训。第一次做讲座,没敢叫太多人所以信件就没有群发,但是没想到在讲座开始前3-5分钟头惊奇的发现我没有群发还是帮我群发出去了。然后来了10-20个人。很紧张,本来该2个小时的东西在事前被我压缩到1个小时然后实际被我半个小时就讲完了,后面就是交流讨论解疑。
唉,第一次,以后就好了。

再次哭死

下午花了3个小时,终于在gdb里面看见这条错误信息。
Perl v6.1000.2931959785526681268 required--this is only v5.8.8, stopped at /usr/local/lib/perl5/5.8.8/Exporter.pm
如果程序没有忽略SIGFPE信号,则得到的是这个
#0 0x28ae2716 in Perl_cast_ulong () from /usr/local/lib/perl5/5.8.8/mach/CORE/libperl.so
#1 0x28a61711 in Perl_pad_findmy () from /usr/local/lib/perl5/5.8.8/mach/CORE/libperl.so
#2 0x28a417bf in Perl_yylex () from /usr/local/lib/perl5/5.8.8/mach/CORE/libperl.so
#3 0x28a51153 in Perl_yyparse () from /usr/local/lib/perl5/5.8.8/mach/CORE/libperl.so
#4 0x28ab0c02 in S_doeval () from /usr/local/lib/perl5/5.8.8/mach/CORE/libperl.so
#5 0x28ab2492 in Perl_pp_require () from /usr/local/lib/perl5/5.8.8/mach/CORE/libperl.so
#6 0x28a801a9 in Perl_runops_standard () from /usr/local/lib/perl5/5.8.8/mach/CORE/libperl.so
#7 0x28a2a89c in S_call_body () from /usr/local/lib/perl5/5.8.8/mach/CORE/libperl.so
#8 0x28a2f26a in Perl_call_sv () from /usr/local/lib/perl5/5.8.8/mach/CORE/libperl.so
#9 0x28a2f617 in Perl_call_list () from /usr/local…

可恶的perl。。。。

唉,每次总是因为perl装的不知道怎么不对,编译我的库的时候常出这样的错误g++ -ggdb -Wall -Woverloaded-virtual -fexceptions -c -DHAVE_CONFIG_H -Wall -I/usr/local/include/mysql -fno-strict-aliasing -pipe -I`/usr/bin/perl -MConfig -e 'print $Config{archlib}'`/CORE -I/usr/local/include -o my_perl_interpreter.o my_perl_interpreter.cppmy_perl_interpreter.cpp: In function `void gsps::xs_init()':my_perl_interpreter.cpp:28: error: `my_perl' was not declared in this scopemy_perl_interpreter.cpp:28: warning: unused variable 'my_perl'my_perl_interpreter.cpp: In function `void gsps::my_perl_eval_sv(SV*)':my_perl_interpreter.cpp:44: error: `my_perl' was not declared in this scopemy_perl_interpreter.cpp: In function `void gsps::my_perl_eval_sv(SV**, SV*)':my_perl_interpreter.cpp:80: error: `my_perl' was not declared in this scopemy_perl_interpreter.cpp: In function `void gsps::my_perl_eval_pv2(SV**, const char*)':my_perl_interpreter.cpp:123: error: `my_perl' was not declared in this s…

查找没有符号的库

近来用gdb看core的时候常遇到很多"?"和错误的符号,我怀疑是因为我加载了很多动态库而这些动态库没有符号file `ldd xxxxxx | cut -d'>'-f2 | cut -d' '-f2` | grep ", stripped"嘿嘿,管道就是好。

这个该死的gprof究竟该怎么用?!

/usr/bin/ld: cannot find -lstdc++_p
gmake: *** [datagather] 错误 1

发现doxygen的一个“隐藏”选项

INPUT_ENCODING = GBK
默认的doxygen -g生的Doxyfile中没有INPUT_ENCODING 这个选项。我以前都是先用doxygen -g生一个模板然后慢慢修改。看来这样不行,里面还有很多隐藏选项呢

常用编码的编码范围

刚整理出来的,常用编码的编码范围注:
1、0x00-0x7f这样的是指这样一个整数区间[0x00,0x7f],其中包含0x00和0x7f
2、C语言规定,任何时候,凡是读到0x0,就意味着字符串结束gb2312:字长为1字节-2字节
0x00-0x7f
0xA1-0xFE,0xA1-0xFEgbk:字长为1字节-2字节
0x00-0x7F
0x80-0xFE,0x40-0xFEgb18030: (18030-2000)字长为1字节-4字节
0x00-0x7f
0x81-0xfe,0x40-0x7E或0x80-0xFE
0x81-0xfe,0x30-0x39,0x81-0xFE,0x30-0x39big5:字长为1字节-2字节
0x00 - 0x7F
0xA1 - 0xFE,0x40-0xFEutf-8:字长为1字节-6字节:
0x00-0x7F
0xC0-0xDF,0x80-BF
0xE0-0xEF,0x80-BF,0x80-BF
0xF0-0xF7,0x80-BF,0x80-BF,0x80-BF
0xF8-0xFB,0x80-BF,0x80-BF,0x80-BF,0x80-BF,
0xFC-0xFD,0x80-BF,0x80-BF,0x80-BF,0x80-BF,0x80-BF特征:每个字的第一个字节(开始字节)必定不以10开头,开始字节之后的字节必定以10开头。
如果某个字节高两位为10,则说明这个字节不是开始字节。
容错能力好,解析的过程中发现某个字节不正确,则跳过这个字,继续解析后面的字符就好。确定字长的方法:每个开始字节从高位向低位寻找第一个0。如果0在从高向低数的第i位,则此字的长度为
i+1个字节。用于检测字符串是否utf-8的perl正则:
http://www.w3.org/International/questions/qa-forms-utf-8.en.php$field =~ m/^( [\09\0A\0D\x20-\x7E] # ASCII | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | [\xE1-\xEC\xEE\xEF][\x…

微软建议大家下载ie6.0

http://www.microsoft.com/downloads/ "Recommended Downloads"的第一条居然是 Microsoft Internet Explorer 6.0 微软对ie7失望了?

gdb又死了……

Attaching to process 72238
/usr/src/gnu/usr.bin/gdb/libgdb/../../../../contrib/gdb/gdb/solib-svr4.c:1443: internal-error: legacy_fetch_link_map_offsets called without legacy link_map support enabled.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) y
/usr/src/gnu/usr.bin/gdb/libgdb/../../../../contrib/gdb/gdb/solib-svr4.c:1443: internal-error: legacy_fetch_link_map_offsets called without legacy link_map support enabled.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Create a core file of GDB? (y or n) y
Abort (core dumped)

solaris 8的vm让我很不满意

Memory: 8062M real, 6132M free, 1418M swap in use, 7353M swap free
我这台机器,8G的内存,没有跑多少服务,内存使用量并不大。但是系统的iowait却通常在10-40%之间徘徊(当然,这个不能全怪vm)。
尽管我的物理内存还剩了75%以上,但是用vmstat查虚拟内存的调页情况
vmstat 4
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr s0 s1 s2 s3 in sy cs us sy id
0 0 0 7376448 6111972 92 7 294 119 111 0 0 0 14 18 34 242 280 278 59 23 18
0 0 0 7529444 6278364 71 486 7 31 31 0 0 0 5 26 45 293 1824 260 9 2 89
0 0 0 7529792 6278728 39 257 6 58 57 0 0 0 26 27 125 413 1908 291 8 3 89
0 0 0 7529444 6278832 182 907 1 38 37 0 0 0 1 23 52 283 2289 237 5 4 91
0 0 0 7529940 6279136 72 204 0 28 26 0 0 0 0 13 41 244 1626 227 7 1 92
0 0 0 7529792 6279040 73 283 5 12 11 0 0 0 6 1 22 252 2260 304 13 2 85
0 0 0 7529940 6279184 68 268 2 12 11 0 0 0 2 12 22 242 2438 270 9 2 89
一直频繁有page in/page out。这一点很让我不满!

mysql的缓存?

今天遇到一个灵异事件。
我在一个进程中用mysql_real_query执行了9000多条插入语句,每条语句插入10-30个左右的记录。
同样的程序,从同样的文件中提取数据,跑第一次,得到30多万条结果。跑第二次,
mysql -uroot -p
select count(*) from mby;
+----------+
| count(*) |
+----------+
| 144118 |
+----------+
1 row in set (0.02 sec)
居然只有14万。我很惊奇我是不是把程序改错了。然后就去分析日志。过了约10分钟,再次回mysql执行count(*)
select count(*) from mby;
+----------+
| count(*) |
+----------+
| 355314 |
+----------+
1 row in set (0.00 sec)结果就变回了以前的数字。这期间我未对该表做任何操作。莫非mysql_real_query是异步执行的?还是说mysql采用了什么特殊的缓存机制造成了这种差异?
怪哉!
不过也可能是因为这台机器mysql版本比较老
mysql Ver 11.18 Distrib 3.23.58, for pc-linux (i686)

mysql的包的大小?

这是为何?
"Got a packet bigger than 'max_allowed_packet' bytes"谁知道mysql的语句最大长度有多大?我一次插入10000条记录可以吗?

valgrind“失效”

今天惊奇的发现我的valgrind失效了。无论加多少参数,最最基本的内存泄露错误它都检测不出来。
查了半个多小时,发现,原来,我是改用了libtool编译,我传递给valgrind的不是真正的二进制文件,而是一个shell脚本组成的wrapper.
忘了这一茬了……

对一个空socket调用getsockname?

if (getsockname(0, (struct sockaddr *)&saddr, &asize) == 0) {
}
rpcgen生的,就在svc的main函数的开头。
啥意思?

gcc又和我闹别扭了

gcc又和我闹别扭了,输出了100多行链接错误,然后gcc: Internal error: Segmentation fault: 11 (program ld)
Please submit a full bug report.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.但是检查一下,它不仅正确的输出了二进制可执行文件,而且这个二进制可执行文件也可正常的顺利运行。

xorg7.2升级完毕

唉,折腾了快一个月了,辗转在北京和学校之间。终于安定了。
昨天晚上把机器开了一晚上,跑portmaster,终于,把xorg 7.2装上并成功启动了。
oh yeah~
但是谁能告诉我,除了安装流程大幅度改变外,它有什么优点?

sina相册上线了

http://photo.sina.com.cn/快来看看吧绝对不让你失望

张朝阳实在是让人无语

背景介绍: 张朝阳,男,西安人,40岁左右。在国内的时候就读于清华物理系,后在MIT取得博士学位并从事博士后研究。sohu的创始人兼现任CEO。大家都知道,sina的博客做的不错,在国内算是第一大博客服务提供(BSP)。但sohu的做的也相当不错,有不少同学给我反映说sohu的博客看起来很时尚,比sina的好。正所谓萝卜青菜各有所爱,本无可厚非的事情。但是张朝阳同学这次做的就有点过了。sohu开发一个sina ----> sohu 的博客搬家工具也就罢了,可他在他的博客上如此的来宣传这个搬家工具:
http://charles.blog.sohu.com/50657777.html‘我号召搜狐博友,如果您真正地喜欢搜狐博客,而您的朋友还在新浪开博,请帮助说服您的朋友,弃暗投明,投奔“解放区”,搬家到搜狐,“解放区的天是晴朗的天”! 哈哈!’我觉得,他独权执掌sohu这么多年,在互联网界也算是赫赫人物,且不论他文中所说的竞争对手组织枪手文章对他个人进行攻击是否贼喊捉贼,结尾这段的文字真是显得过于轻浮。我觉得他是在拿sohu blog当脚下的滑板玩。真是要将该文付诸公堂,文字里面嚼文字,相信律师非整的他半年不得安歇。

模式判别与数理统计

0:19 2007-6-4
晚上问小妖在哪里,她说她在上自习,然后我就厚着脸皮死蹭过去。不过我确实是在踏踏实实认认真真的上自习,且,大有心得。心得是啥呢?心得就是早知当日好好学习概率论,今日就不会这么痛苦。
说下我对模式判别的理解。
首先,要找些样本来。然后在它们身上提取特征向量。然后就可以把它们看作一个 l 维的随机变数。所谓的模式判别就是要对这个l维的随机变数和该随机变数所属的分类进行回归分析。
如果已经知道这l维的随机变数其每一个分量的pdf的形式(如高斯分布、均匀分布),然后就用数理统计里面的估计理论,通过样本对其pdf的参量进行估计。一旦确定了pdf,就可以根据Bayes分类原则确定其分界函数。
如果对其pdf的形式未知,那么就需要用一些非参数的方式。如kNN。
所谓的Bayes分类原则就是为了能让错误分类率降到最低。
在做clustering、kNN的时候一个key point就是要选取恰当的dissimilarity function。可是选什么好呢?为什么书上会有这么多乱七八糟的模型?其实很多都是可以在模式判别的时候从pdf推导分界函数的时候推导出来的。其决定性因素在于随机变量究竟采用的是什么样的分布。所以我就走了很大的弯路。我是先学的clustering,弄得晕糊糊不明所以之后,才回过头来看Bayes分类。

新博客开张,敬候新老朋友光临

http://www.sunchangming.com/blog/嗯,就是我的姓名的拼音啦~有了新家,于是这里就要停止更新一段时间,嘿嘿,不好意思啦~

-pthreads测试

OS:solaris 8
Gcc: gcc (GCC) 3.4.6#include <iostream> intmain(int argc,char* argv[]){ #ifdef _REENTRANT std::cout<<"threaded"<<std::endl; #elsestd::cout<<"single thread"<<std::endl; #endifreturn0; } 无论是用
g++ threadTest.cpp -o thr –pthreads
还是用
g++ threadTest.cpp -o thr
编译,输出的结果都是threaded
而,把代码稍微修改一下#include <stdio.h> intmain(int argc,char* argv[]){ #ifdef _REENTRANT printf("%s\n","threaded"); #elseprintf("%s\n","single thread"); #endifreturn0; } 用
g++ threadTest.cpp -o thr –pthreads
编译输出threaded

g++ threadTest.cpp -o thr
编译输出single thread
结论:
在solaris下在编译源代码的时候给gcc加-pthreads参数的一个主要的用途就是定义
_REENTRANT宏。这将导致在pthreads和solaris threads混用的时候,采用Solaris
threads语义。
但是iostream等头文件会强行定义这个宏。