waterflier's Blog -- 刘智聪的Blog

热爱生活,热爱编程
posts - 30, comments - 76, trackbacks - 0, articles - 5
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年6月5日

 

工作了以后,Blog就很少更新了。时不时地会有一点像把一些经验写下来的冲动,不过一旦准备写,惰性就上来了。要加强执行力!

posted @ 2008-06-05 19:37 waterflier 阅读(20) | 评论 (1)编辑

2007年6月12日

前段时间闲疯了,懒得更新。
最近忙疯了,没时间更新。


posted @ 2007-06-12 11:12 waterflier 阅读(62) | 评论 (2)编辑

2006年10月23日

感谢你为我们带了如此精彩的谢幕表演!没有冠军没有香槟都没有关系!!!!!!!!!

posted @ 2006-10-23 12:29 waterflier 阅读(218) | 评论 (1)编辑

2006年9月8日

好久没写了。最近几个月,考了英语,完成了一个项目。疯狂的燃烧了一把模型魂,可惜烂尾不少,只完成了几个BB而已。
现在终于可以过只需专注一件事的生活了,感觉不错。就是... 很多写了一半的文章到底什么时候才会有激情完成阿.. 我的文章烂尾的也太多了。

 

posted @ 2006-09-08 20:02 waterflier 阅读(98) | 评论 (4)编辑

2006年7月21日

    如果我写windows程序,并且用MSVC调试程序,那么通常我都会在Debug 的Watch window中保留一个这样的监视项 "@err,hr" .可以即时的显示当前的GetLastError值已经对应的字符串解释.非常的好用. 这个东西我一直都当做是vc的一个技巧来使用(也不记得是怎么学来的,好像是看某人调试的时候偷学的). 并没有继续寻找其它类似的监视项.今天突然心血来潮,在网上找了找,又有收获^_^

整的假寄存器列表:
 
@ERR
 最后错误值; 和GetLastError() API 函数一致
 
@TIB
 当前线程信息; 在调试器无法处理”FS:0”格式的时候是必要的
 
@CLK
 未列入文档的寄存器; 只是在Watch窗口适用
 
@EAX, @EBX, @ECX, @EDX, @ESI, @EDI, @EIP, @ESP, @EBP, @EFL
 Intel CPU 寄存器
 
@CS, @DS, @ES, @SS, @FS, @GS
 Intel CPU 段寄存器
 
@ST0, @ST1, @ST2, @ST3, @ST4, @ST5, @ST6, @ST7
 Intel CPU 浮点寄存器
 
其中@TIB很有用,可以用在多线程调试的时候作为断点的条件变量.这样就可以只观察一个线程的执行情况.

posted @ 2006-07-21 15:37 waterflier 阅读(251) | 评论 (0)编辑

2006年5月17日

    一直以来都没有把工作过程中的经验整理成文章的习惯,到是比较喜欢把一些技术细节写成文章免

的自己忘记。 而且经验性的东西总结起来题目比较大,内容多。我懒,有的时候真的很想把一些碰到的

挫折和解决的方法以及延伸的思考写出来,最后都是写了几行就去玩游戏了。这个习惯真的很不好,许

多本以为会牢记的深刻教训都随着时间的流逝渐渐忘记了.. 比如说原来的许多许多windows 窗口系统的

开发经验,MFC的使用经验,我也就工作一年都在Linux下,现在几乎都记不得了。主要原因就是当时不懒

得写..好记性比不过烂笔头。这个坏习惯一定要改,这里先把题目记下来,监督自己慢慢写。

   《TCP服务器开发》 主要内容:关于IO模型选择的原则,如何进行性能测试方面,开发如何选择库,用

库与不用库的优劣分析,自己开发需要注意屏蔽的细节。就这么多,好多内容。我这懒人都不知道什么

时候才能完成

    《UDP 服务器开发》 姊妹篇,增加什么情况下应该使用UDP来设计协议的一些经验
    《Jabber 服务器开发感想》 想系统的回顾一下这个jabber server的开发经验。
    《数据库同步类中的设计模式》 这里的数据库同步类指用C++封装一些用于操作数据库特定表的类

posted @ 2006-05-17 22:48 waterflier 阅读(216) | 评论 (3)编辑

2006年4月21日

看到

http://community.csdn.net/Expert/topic/4699/4699658.xml?temp=.7951166

觉得也应该把自己的感受写下来,没想到居然写了不少... 够字数在blog里凑篇文章了:)

作为C++程序员,我只谈我用到的部分的改进~
新的工具总是会有不少优点的。
优点:
1)最喜欢的 Code Definition Windows。终于可以像Source Insight一样在点击某个类型或函数的时候直接查看对应的实现代码了。
2)然后是Caller Graph.从Source Insight学来的很实用的功能,可以用图表的方式显示某个函数被项目中哪些地方调用了。
3)Class View窗口支持Search了,而且在点击一个类的时候把类的成员放到单独的窗口里显示(有些像Eclipse的outline窗口了),不错。就是在公司15寸LCD上会觉得Class View太拥挤了。如果用17寸LCD会很舒适。
4)智能提示功能得到了进一步加强。
5)调试器大改进!大大提高了对于字符串类型变量的支持!可以选择纯文本,html,xml 3种方式来分析字符串。My God!对于我现在开发的基于XML的网络协议太他妈实用了。
6)据说加入了方便团队开发,测试的功能。由于我目前只是个人使用,项目还不敢贸然迁移到新IDE上,所以不知道。

缺点:
不觉得很慢,我只安装了C++,C#.感觉还好,在我amd semphone 2600+ 512m的机器上比vs2003稍微慢一些。
最大的缺点就是不稳定,我把一个项目移过来尝试的时候,写代码的过程中崩溃了2次,调试多线程+异步IO崩溃了n次..这个m$的东西一向是这样的,等打补丁吧。vs2002当年也是崩溃到完全没法用,到了vs2003就非常稳定了。
还有一个缺点是很多vs的插件还没有更进,好在我不用什么插件,据我所知很多人用的bc,va都没有出vs8的版本吧。对于哪些离开va就不想写代码的人,等va出新版本吧。
然后。。。麻烦的。。。项目中使用的大部分库都要用vc8重编译才能使用。my god!大工程。而且,而且,有几个库编译无法通过..估计是编译器错误检查严格了..

posted @ 2006-04-21 10:15 waterflier 阅读(2914) | 评论 (17)编辑

2006年3月6日

关于unicode,各种编码等国际化的技术原理可以参看我blog上的文章。最近的项目里要用到GBK-

>wchar_t,wchar_t->UTF8.所以对这部分功能做了些简单封装。其实对于国际化技术的封装,无非

就是

DBCS <=> wchar_t .

wchar_t <=> 各种unicode编码 比如说UTF8,UTF16等。

这样的转换都是绝对可以成功的。像GBK<->BIG5这种dbcs<=>dbcs的转换就不一定能成功了。

wchar_t作为C++的字符串内部处理用类型,主要原因是各种字符串函数都都有wchar_t作为接口的

版本。方便使用。wchar_t这个东西的长度是由编译器,平台实现决定的,所以请记住,处理

wchar_t的时候,千万不要关心他的长度。如果你的代码对wchar_t的长度特别关心,这个时候你需

要的应该是一种标准的unicode编码

(Linux下的wchar_t长度为4byte,好心痛)

罗嗦这么多,各位看官久等了。上代码。

   class string_util
 {
 public:

#ifndef _UNIX
    //我的程序只需要支持GBK,各位可以在这里加上Linux下的编码名字与windows下的codepage的

对应关系进行扩展。
    static inline int codepage(const char* code_page)
    {
        return 936;//"GBK"
    }
 #endif

     static inline int dbcs2wchar(const char* code_page,/*in*/const char* in,int

in_len,
                                                /*out*/wchar_t* out,int out_max)
     {
#ifdef _UNIX
         size_t result;
         iconv_t env;
         env = iconv_open("WCHAR_T",code_page);
         result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)

&out_max);
         iconv_close(env);
         return (int) result;
#else
         return ::MultiByteToWideChar(codepage(code_page),0,in,in_len,out,out_max);
#endif
     }

     static inline int dbcs2wchar(const char* code_page,/*in*/const string&

in,/*out*/wstring& out)
     {
         int len = in.length() + 1;
         int result;
         wchar_t* pBuffer = new wchar_t[len];
         memset(pBuffer,0,len*sizeof(wchar_t));
         result = dbcs2wchar(code_page,in.c_str(),in.length(),pBuffer,len*sizeof

(wchar_t));
         if(pBuffer >= 0)
         {
            out = pBuffer;
         }
         else
         {
             out.clear();
         }
         delete[] pBuffer;
         return result;
     }

     static inline int wchar2dbcs(const char* code_page,/*in*/const wchar_t* in,int

in_len,
                                                 /*out*/char* out,int out_max)
     {
#ifdef _UNIX
         size_t result;
         iconv_t env;
         env = iconv_open(code_page,"WCHAR_T");
         result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)

&out_max);
         iconv_close(env);
         return (int) result;
#else
         BOOL use_def_char;
         use_def_char = FALSE;
         return ::WideCharToMultiByte(codepage(code_page),0,in,in_len/sizeof

(wchar_t),out,out_max,"?",&use_def_char);
#endif  
     }

     static inline int wchar2dbcs(const char* code_page,/*in*/const wstring&

in,/*out*/string& out)
     {
         int len = in.length() + 1;
         int result;
         char* pBuffer = new char[len*3];
         memset(pBuffer,0,len*3);
         result = wchar2dbcs(code_page,in.c_str(),in.length() * sizeof

(wchar_t),pBuffer,len*3);
         if(result >= 0)
         { 
             out = pBuffer;
         }
         else
         {
             out = "";
         }
         delete[] pBuffer;
         return result;
     }

     static inline int wchar2utf8(/*in*/const wchar_t* in,int in_len,
                                               /*out*/char* out,int out_max)
     {
#ifdef _UNIX
         size_t result;
         iconv_t env;
    
         env = iconv_open("UTF8","WCHAR_T");
         result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)

&out_max);    
         iconv_close(env);
         return (int) result;
#else
         BOOL use_def_char;
         use_def_char = FALSE;
         return ::WideCharToMultiByte(CP_UTF8,0,in,in_len/sizeof

(wchar_t),out,out_max,NULL,NULL);
#endif
     }
   
     static inline int wchar2utf8(/*in*/const wstring& in,/*out*/string& out)
     {
         int len = in.length() + 1;
         int result;
         char* pBuffer = new char[len*3];
         memset(pBuffer,0,len*3);  
    
     
         result = wchar2utf8(in.c_str(),in.length() * sizeof(wchar_t),pBuffer,len*3); 
    
   
         if(result >= 0)
         {
             out = pBuffer;
         }
         else
         {
             out = "";
         }
         delete[] pBuffer;
         return result;
     }
   
     static inline int utf82wchar(/*in*/const char* in,int in_len,
                                                /*out*/wchar_t* out,int out_max)
     {
#ifdef _UNIX
         size_t result;
         iconv_t env;
         env = iconv_open("WCHAR_T","UTF8");
         result = iconv(env,(char**)&in,(size_t*)&in_len,(char**)&out,(size_t*)

&out_max);
         iconv_close(env);
         return (int) result;
#else
         return ::MultiByteToWideChar(CP_UTF8,0,in,in_len,out,out_max);
#endif
     }

     static inline int utf82wchar(/*in*/const string& in,/*out*/wstring& out)
     {
         int len = in.length() + 1;
         int result;
         //wstring temp;
         wchar_t* pBuffer = new wchar_t[len];
         memset(pBuffer,0,len*sizeof(wchar_t));
         result = utf82wchar(in.c_str(),in.length(),pBuffer,len*sizeof(wchar_t));
         //printf("utf82wchar result is %d,errno is %s\n",result,strerror(errno));
         if(result >= 0)
         {
            out = pBuffer;
         }
         else
         {
            out.clear();     
         }
         delete[] pBuffer;
         return result;
     }
};

posted @ 2006-03-06 11:41 waterflier 阅读(908) | 评论 (1)编辑

2006年2月18日

又忘记了...4个月前配的。今天搞半天都没搞上去。今天还要搞定将原来的仓库导入的问题...

这里找篇文章看起来比较全的...先看看。有补充的继续。

Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

cvs [pserver aborted]: bad auth protocol start:

Connection closed by foreign host.
address@hidden sam]$ rpm -qa cvs
cvs-1.11.1p1-7
address@hidden sam]

address@hidden sam]$ cat /etc/xinetd.d/cvspserver
service cvspserver
{
disable = no
port = 2401
socket_type = stream
protocol = tcp
wait = no
user = root
passenv = PATH
server = /usr/bin/cvs
server_args = -f --allow-root=/repository
pserver
}

address@hidden sam]$ cat /etc/xinetd.conf
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/

defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}

includedir /etc/xinetd.d


-------------------------------------

下载完之后安装的步骤:

# tar xzvf cvs-1.11.tar.gz

# cd cvs-1.11

#./configure

# make

# make install

-----------------------

注解:cvs-1.11.tar.gz 是下载的文件名

#是根用户的标志,而且必须是在根用户之下


这个东西主要是为软件工程用的,在开发大型项目比如现在的开发源码项目,经常会有很多开发树,为了保证开发的进度,出了错能够即时的回到原有的状态, 而设计了这中代码管理工具.

 


我觉得m113是根本就没有作除 rpm -i cvs-xxx 以外的事


1.检查 /etc/services

vi /etc/services

:/cvspserver

如果找到的行前面并没有#,那么就不用修改了,否则去掉行首的#


2.在 /etc/xinetd.d 目录下创建一个文件,随便命名,比如 cvs

vi /etc/xinetd.d/cvs

在其中添上

service cvspserver

{

socket_type = stream

wait = no

user = root

env = HOME=

server = /usr/bin/cvs

server-tags = --allow-root=/home/cvsroot pserver

}


3.保存以后创建一个名为 cvs 的组和一个名为 cvsroot 的用户

groupadd cvs

useradd -g cvs -s /sbin/nologin cvsroot

cd /home/cvsroot

chown -R cvsroot /home/cvsroot


4.然后

vi /etc/profile

在其中添上

CVSROOT = /home/cvsroot

export CVSROOT


5.重启 xinetd:

/etc/init.d/xinetd restart


6.cvs init


这样CVS就可以用了


添加仓库: 进入到你的源码目录

cd /your/sources/path

然后执行

cvs export SOURCE_DIR_NAME Author Version

其中的SOURCE_DIR_NAME 就是你的工程在 CVSROOT 目录中保存的目录名, Author 为工程作者, Version 为你的工程发行版本号,必须以字母开头

 


1.如果系统没有安装CVS的,可以到 http://ftp.cvshome.org/ 去下载。已经安装的也建议删除旧的,下载一个新的。我的做法是:

下载 http://ftp.cvshome.org/linux/cvs-1.11.2-i386-linux-glibc-2.1.gz;

gzip -d cvs-1.11.2-i386-linux-glibc-2.1.gz;

mv cvs-1.11.2-i386-linux-glibc-2.1 /usr/local/bin/cvs;

chmod 755 /usr/local/bin/cvs;

这样做就是没有man pages。要不你可以下载rpm格式的。安装后应该有man pages。


至于CVS系统的安全,我只知道可以不使用 real user 登陆:

chmod 644 $CVSROOT/CVSROOT/config

vi $CVSROOT/CVSROOT/config

将第二行的

#SystemAuth = no

去掉注释,即改为

SystemAuth = no


然后,创建一个并没有根目录的用户,用户名随便,这个用户就是作为你的虚拟用户帐号的

useradd -g cvs -M username


接着将 shadow 复制到 $CVSROOT/CVSROOT, 并重命名为 passwd:

cp /etc/shadow $CVSROOT/CVSROOT/passwd


修改passwd文件:

chmod 0644 $CVSROOT/CVSROOT/passwd

vi $CVSROOT/CVSROOT/passwd

将 username 对应那一行以外的行全部去掉,然后去掉 username 所在行第二个冒号以后的所有内容,并添上字符串 cvsroot, 改为如下格式

username:sds54354jkbft576/fdsh:cvsroot


最后去掉在系统中添加的那个 username:

userdel -f username


好了,这样你的CVS用户就只能用 passwd 中规定的用户来登陆你的CVS SERVER了,并且登录以后自动映射为real user cvsroot

 

 

CVS的安全方面你说的找个文档我也看过,增加一个用户还好,多了之后,烦死了,我觉得应该可以连接ldap,或者mysql的数据库,作为用户的认证服务


 

posted @ 2006-02-18 10:59 waterflier 阅读(1227) | 评论 (2)编辑

2006年1月12日

打开文件 /etc/sysconfig/iptables 编辑如下内容

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 9000 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 9001 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9222 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9200 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5222 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5269 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

这个文件为Linux启动时iptables自动加载的规则文件,不用再启动后自己手工输入一条条规则了,而且也便于维护。

如果这个时候系统正在运行,修改了这个文件想要重新加载,输入如下命令
iptables-restore /etc/sysconfig/iptables
重新加载规则

输入iptables --list 查看规则 是不是和自己想要的一样了~

纯粹mark,linux的命令用一次忘一次。

 


 

 


 

 

posted @ 2006-01-12 19:22 waterflier 阅读(839) | 评论 (2)编辑