2009年1月19日

因为最近要用到RPC,考察了一下thrift(facebook用的一套rpc框架)和google protocol buffer。

thrift支持的语言非常多,不光支持c++,java,python,ruby等非常流行的语言外还支持ocaml,Squeak等很少见的语言,比google protocol buffer好多了,而且已经内置RPC,不像google protocol buffer的RPC还藏着掖着。比较google protocol buffer和thrift的文章比较多,其中google到的比较靠前的一篇blog指出thift的c++版本对windows支持不好,我一开始也是觉得如此,主要是thrift只提供了autoconf,automake作为构建工具,在windows上只能用cygwin或者msys才能比较方便的编译,而google protocol buffer提供了vc的工程文件。另外在代码的规范性方面,的确是google protocol buffer更好。

此次移植的目的是在windows上运行的client和compiler,因为server肯定是用linux的,移植没太大必要。根据我从前移植代码的经验,发现妨碍移植的关键在于系统api的差异,或者是某些依赖库的差异,如果差异太大,则移植比较麻烦。另外,在移植时我比较倾向于先移植一个最小的功能集合,并逐步完善。

在泛读了thrift的代码和文档后发现thrift中并没有用到非常难于移植的api,我先用thrift compiler开始,thrift compiler很简单,基本不用修改就可以在vc2008上编译,主要依赖的是flex和bison,在windows下也都不难找到,也可以在linux生成后,再把生成的thriftl.cc,thrifty.cc和thrifty.h直接copy过来使用。编译完成后发现在处理include和externs的时候有问题,主要是linux和windows的路径分隔符("/"和"\\")的差异,修改main.cc里面的program_name和directory_name就可以解决了,这个问题在msys下面也存在。

接下来就是client和server了,我打算主要使用Framed Transport+Binary protocol+nonblocking server,因为使用的是libevent(在windows上已经有移植,直接拿过来用就可以了,在linux上面用的是epoll,性能也不错),也没有其他的依赖库,移植起来还是比较方便的。

先从client开始,在TSocket中因为使用了poll来进行超时处理,先改成阻塞方式,将所有的非阻塞和poll相关代码注释掉,基本可以编译成功,然后还有就是ctime_t的地方可以用vc的ctime_s代替,但是dbgtime的长度要改成26。运行tutorial没什么问题。然后就是加入超时处理了,虽然ms在windows server 2008里面引入了WSAPoll,我用的是xp,只有用select来模拟一个poll了,反正功能差不多,只是接口不太一样。完成后就可以生成基本的client runtime库了。

至于server,大致看了一下,里面主要的问题是使用了socketpair和poll,主要是用来做libevent的通知。不过socketpair就自己建两个socket然后连接起来就可以了,poll用之前client的select模拟实现,移植起来问题应该不大。

client的代码因为移植时间比较紧,只有半天时间,还没清理,就不放上来丢人了。

只发一个tutorial的client的exe(需要vc9的runtime才能运行),修改后的Framed Transport+Binary protocol+nonblocking server的linux server代码和compiler的vc9工程代码。下载





posted @ 2009-01-19 14:39 BoolKinG| 编辑 收藏

2007年1月8日

vs2005sp1出来已经有一段时间了,由于安装速度太慢,我一直都没有安装,今天遇到一个vs的bug,不得已需要安装sp1,上网找了一下,发现一个解决安装速度慢的方案。
之所以速度慢是很大程度上是因为windows installer的cache造成,在安装时暂时禁用掉windows installer的cache可以极大的加速sp1的安装,而且可以节省1.3G的磁盘空间。
将下面的代码存为bat文件,通过这个bat来安装sp1

reg export HKLM\Software\Policies\Microsoft\Windows\Installer installer.reg
reg add HKLM\Software\Policies\Microsoft\Windows\Installer 
/v MaxPatchCacheSize /t REG_DWORD /0 /f
net stop msiserver
start 
/wait VS80sp1-KB926601-X86-ENU.exe
reg delete HKLM\Software\Policies\Microsoft\Windows\Installer 
/v MaxPatchCacheSize /f
reg import installer.reg
net stop msiserver
del 
/q installer.reg 2>nul


另外,VS2005的intellisense对C++来说实在太慢,代码量大的时候cpu占用率一直在100%,功能也比不上VA,将Microsoft Visual Studio 8\VC\vcpackages\feacp.dll改名直接禁用之。

posted @ 2007-01-08 14:29 BoolKinG| 编辑 收藏

2006年7月1日

BumpTop
http://bumptop.ca/




看演示非常不错
对于我这种喜欢什么都放在windows桌面上的人是再合适不过的了,只用鼠标一拖,所有的东西都自动排好堆成一摞,而且查阅起来也非常方便。

现在还没有可供测试的版本,希望很快可以用上

posted @ 2006-07-01 13:01 BoolKinG| 编辑 收藏

2006年6月19日

近日下载了一个VC2005 Express Edition,用它来编译boost,发现有不少的warning C4819,说代码文件中有cp936无法表示的字符,还有就是vc2005特有的废弃的ANSI函数的错误,虽说不影响编译,但是看着时不时出现的warning总是让人心神不安,还容易掩盖其他的错误,如果是直接用cl编译,只要加上/wd4819 /D_CRT_SECURE_NO_DEPRECATE就可以不显示这两个错误,但是大家都知道boost是使用其特有的boost.build进行编译的,下面我就给出如何修改boost.build来抑制这两个错误的显示

boost.build分为v1和v2两个版本
v1:
修改$(BOOST_ROOT)/tools/build/v1/vc-8_0-tools.jam

flags vc - 8_0 C ++ FLAGS :  / Zc:forScope ;

改为

flags vc - 8_0 C ++ FLAGS :  / Zc:forScope  / wd4819  / D_CRT_SECURE_NO_DEPRECATE ;

v2:
cvs版本
修改$(BOOST_ROOT)/tools/build/v2/tools/msvc.jam

8.0  adds some more options

一行的下方加上

flags msvc.compile CFLAGS $(condition) :  / wd4819  / D_CRT_SECURE_NO_DEPRECATE ;

boost 1.33.1版本

    #  8.0  deprecates some of the options
    
if   !  [ MATCH  ^ ([ 67 ]. * ) : $(version) ] 
    {
        flags msvc.compile CFLAGS $(condition)
/< optimization > speed :  / O2 ;
        flags msvc.compile CFLAGS $(condition)
/< optimization > space :  / O1 ;
        flags msvc.link.dll MANIFEST : 
" mt -manifest  "  ;
        flags msvc.link.dll OUTPUTRESOURCE : 
" -outputresource: "  ;
    }

改为:

    #  8.0  deprecates some of the options
    
if   !  [ MATCH  ^ ([ 67 ]. * ) : $(version) ] 
    {
        flags msvc.compile CFLAGS $(condition) : 
/ wd4819  / D_CRT_SECURE_NO_DEPRECATE ;
        flags msvc.compile CFLAGS $(condition)
/< optimization > speed :  / O2 ;
        flags msvc.compile CFLAGS $(condition)
/< optimization > space :  / O1 ;
        flags msvc.link.dll MANIFEST : 
" mt -manifest  "  ;
        flags msvc.link.dll OUTPUTRESOURCE : 
" -outputresource: "  ;
    }
posted @ 2006-06-19 17:44 BoolKinG| 编辑 收藏

2006年6月7日

学过C/C++语言的都知道程序的执行从main函数开始(先不说static对象和CRT),大部分学过C/C++的也都知道main可以有int main()和int main(int argc, char**argv)的参数格式,有不少人还知道int main(int, char**, char**)的参数形式,返回值也可以为void,但是为什么C/C++ compiler能够支持这些格式呢?在初学C的时候,我以为是编译器内置的功能来支持

近日研究VC的CRT,发现原来是通过调用规范(calling coventions)实现的。
调用规范分为参数传递次序,调用栈维护,命名修饰和大小写转换4个规范组成。

大部分的C语言编译器(至少是在x86架构上)遵循以下的规范
命名修饰和大小写转换:无论函数的signature是什么样子,在编译时会将名为“Xxxx”的函数转换为“_Xxxx”的形式,即在函数名前面加上“_”,大小写不变,也就是说不管是什么形式的main函数,有没有返回值,有多少个参数都会在编译时转换为_main。因此虽然在CRT中使用的是
int __cdecl main(intchar **char **);

的形式声明的main函数,但是在链接的时候无论是什么形式的main都符合要求,只不过除了在文章开始提到的3种形式有意义外,其他的参数格式要么是得到无意义的值,要么还会溢出调用栈(使用超过3个参数)
测试代码如下:

int main(int a1, char* a2, unsigned long a3, float a4, double a5, unsinged int a6)
{
 printf(
"Hello World!\n");
 
return 0;
}

 

posted @ 2006-06-07 17:40 BoolKinG| 编辑 收藏

2006年5月14日

现在的工作是在unix平台,平时是用UE的ftp功能来写代码的,有时候文件大了,传输就很慢,而且经常不是很稳定。
下定决心要学学Vim(现在应该没有人用原始的vi了吧),在经过二周的使用后,发现Vim实在是非常不错的一个editor,现在我在Windows上也装了一个Vim,使用起来颇为顺手,基本上已经替代了UE。

下面介绍一些我在使用Vim的过程中得到的一些心得:
1. 在使用Vim之前一定要进行一些设置,否则你使用起来肯定会很不爽,下面是我的配置

 1 " ==============================================
 2 "  General settings
 3 " ==============================================
 4
 5 set nocp
 6 set ru
 7 "  使用cindent
 8 set cin
 9 set cino = :0g0t0(sus
10
11 set sm
12 set ai
13 "  缩近
14 set sw=4
15 set ts=4
16 "  不展开tab为空格,反之set et
17 set noet
18
19 set lbr
20 set hls
21 set backspace = indent , eol , start
22 set whichwrap = b , s , < , > , [ , ]
23 set fo+ = mB
24 set selectmode =
25 set mousemodel = popup
26 set keymodel =
27 set selection = inclusive
28 set matchpairs+ = <:>
29
30 " ==============================================
31 "  Cursor movement
32 " ==============================================
33 nnoremap <Down> gj
34 nnoremap <Up> gk
35 vnoremap <Down> gj
36 vnoremap <Up> gk
37 inoremap <Down> <C-o>gj
38 inoremap <Up> <C-o>gk
39
40 nnoremap <End> g$
41 nnoremap <Home> g0
42 vnoremap <End> g$
43 vnoremap <Home> g0
44 inoremap <End> <C-o>g$
45 inoremap <Home> <C-o>g0
46
47 nmap <C-F4> :confirm bd<CR>
48 vmap <C-F4> <ESC>:confirm bd<Enter>
49 omap <C-F4> <ESC>:confirm bd<Enter>
50 map! <C-F4> <ESC>:confirm bd<Enter>
51
52 "  打开语法高亮
53 syntax on
54 "  使用语法进行折叠
55 set foldmethod=syntax
56
57 if (has( " gui_running " ))
58     set nowrap
59     set guioptions+=b
60     colo inkpot
61 else
62     set wrap
63     colo ron
64 endif
65
66 "  设置swap文件的目录
67 set dir = D:\vim\tmp
68 " 设置备份文件的目录
69 set backupdir=D:\vim\bak
70
71 "  设置leader的快捷键,原来的“\”太远了,而且位置还不固定
72 let mapleader = " , "

这里是一些基本设置
如果有什么不太清楚的,可以在Vim里normal模式下
:h 关键字
查看帮助

2. Vim教程
推荐先看看Vim自带的Tutor(这可是位好老师)
用vimtutor启动Vim
或者在Vim里面用:h tutor来启动
中文教程我推荐李果正的《大家来学Vim》
这里还有Vim的键位示意图,可以打出来随时查看哦

 
3. Vim的插件
有几个插件强烈推荐
(1) A:在同名的cpp和h文件之间切换 http://www.vim.org/scripts/script.php?script_id=31
(2) NERD_comments:超强的注释插件,支持很多语言的注释风格,按照上面的设置,只需要",cc"就可以添加注释了 http://www.vim.org/scripts/script.php?script_id=1218
(3) csupport:写C/C++代码必备 http://www.vim.org/scripts/script.php?script_id=213
(4) LargeFile:再也不用担心打开大文件会慢了 http://www.vim.org/scripts/script.php?script_id=1506
(5) TipOfTheDay:多读读vim的tips会有很多收获的,记得要经常更新tips文件啊 http://www.vim.org/scripts/script.php?script_id=88
(6) cppomnicomplete:提供C++中类/对象成员的补全(需要Vim7) http://www.vim.org/scripts/script.php?script_id=1520
(7) ColorSamplerPack:提供上百种颜色主题,必有一款适合你,不过大多数都是在GUI下才有相应的效果 http://www.vim.org/scripts/script.php?script_id=625
(8) vimcdoc:汉化的vim帮助 http://vimcdoc.sourceforge.net/

3. 在telnet中使用vim的颜色
如果是在linux中使用telnet,SecureCRT会自动使用合适的颜色来显示vim不同的颜色,但是如果在其他unix下就会无法显示正确的颜色,所有的东西都是同一种颜色。

在.vimrc中加入(^[的输入方式是Ctrl-v然后输入Esc):
if !has("gui_running")
set t_Co=8
set t_Sf=^[[3%p1%dm
set t_Sb=^[[4%p1%dm
endif
并在SecureCRT的模拟终端类型选择ANSI,并钩上ANSI Color,就可以显示不同的颜色了

4. vim的自动补全功能
一般使用Ctrl+n就可以自动补全了,从Vim7后,C/C++的函数、变量或者是类的成员,使用Ctrl+x,Ctrl+o也可以自动补全。在安装了cppomnicomplete后,对象的成员也可以用Ctrl+x,Ctrl+o来补全

5. 代码折叠
许多editor都支持代码折叠,Vim也不例外
常用的快捷键
zc 折叠代码
zo 打开折叠的代码
还有其他的快捷键可以查看帮助
:h fold

6. 自动格式化代码
在Visual模式下,选中代码按=就可以了
Normal模式下,按=会格式化光标所在行

7. 脚本支持
Vim不仅有内建的脚本功能,还支持Perl,Python,Tcl,Ruby和MzScheme这些流行的脚本语言编写Vim的扩展

Vim的功能是不是很强大?
经过1年多的测试Vim 7.0也release了,还不快下载来试试
http://www.vim.org

Happy Vimming!

对于已经习惯了使用Vim但是要在Windows下编程的用户
我还推荐
ViEmu,可以在VisualStudio下模拟Vi的编辑操作
不过只有30天的试用期

posted @ 2006-05-14 17:35 BoolKinG| 编辑 收藏
 
以下转自我在msn的blog

今天又看到一个和Source Offsite类似的软件:SourceAnywhere。不用装.net framework,对中文的支持也很好,早知道有这个东东,就不用浪费一个下午取搞定那个中文版的SOS了
不过这个东东和SOS实在是有点太像了,就连没有指定database之前不能启动服务都一模一样,不知道两者之间有什么关系

posted @ 2006-05-14 14:23 BoolKinG| 编辑 收藏
 
以下转自我在msn的blog

本文内容纯属技术研究,请勿将其用于非法用途!
如需转载,请注明出处。
 
SourceOffsite是一个基于 Microsoft Visual SourceSafe 数据库的源代码管理软件,具有以下特性:


1. 比 Microsoft Visual SourceSafe 客户端快。
2. 可以通过 TCP/IP 方式访问和操作 VSS 库。
3. 在 Windows、Slolaris 和 Linux 上都提供了客户端。
4. 并且通过传输数据的压缩和加密方式,使得文件操作的速度大大加快并增强了系统的安全性。5. 高度 IDE 集成,可以成为 Visual C++ 的 SCC 提供者。
就是有一个问题,对中文支持很糟糕,如果在代码库中有中文名的文件,就会出现乱码,Rick的汉化版解决了这个问题,但是由于改变了对字符串的处理方式(SourceOffsite是一个.net程序,我对.net完全是一窍不通,所以不要问我是怎么修改的),以前的keygen不能用了,出现错误“Incorrect format of serialnumber 1\n Incorrect format of serialnumbers”。虽然该汉化版附带了2用户的永久license,但是感觉总是不太爽,于是祭起.Net Reflector反编译之,发现汉化版已经Obfuscated,而原始版本却没有经过Obfuscate,于是可以根据原始版本来得到汉化版的注册的大致流程。
 
{msn的blog真烂,居然有字数限制,过程写了贴不上来
直接写结果了(相信大部分人都希望直接看结果
用UE打开汉化版的SosService.exe文件,将0xEEBC处的16改为17

sossvr.prp文件中server.serialnumbers=00020002ffff000000000004853352c3
大功告成,最大用户数的永久license

posted @ 2006-05-14 14:22 BoolKinG| 编辑 收藏
 
以下转自我在msn的blog:

今天在bt上发现了一个怀旧小游戏合集,里面都是10几年前我们在电脑房(现在网吧的前身)里面dos下玩的游戏,虽然现在看来非常粗糙,但是曾经在电脑房里鏖战的日日夜夜却是难以磨灭的美好回忆。

下载下来发现有些游戏不能在xp下运行,推荐三个软件dosboxVDMSoundglidos,第一个是一个跨平台的dos模拟器,不想在VMWare里面装个Dos就试试它吧,不过还是有些游戏支持的不是太好;第二个是一个在xp的console下模拟声卡的东东;第三个是我强烈推荐的,可以在windows下运行需要glide(游戏龄超过10年的人都知道这是当年的3D硬件王者3dfx的编程接口,类似现在的Direct3D)的硬件加速游戏,很好的支持了古墓丽影1,就是非注册版在后面几关屏幕中间会出现一个很大的logo(试试emule,会有意想不到的收获)。

实在不行就在VMWare里面装个dos来怀旧吧。

posted @ 2006-05-14 14:21 BoolKinG| 编辑 收藏
 
之前都是在msn写blog的,现在live.com被封,msn的慢的不行,限制太多,我的maxthon还经常被它弄的假死,因此换到cppblog。cppblog的确比msn快,而且用起来也顺手些

以后以此为家,各位前辈也多多指教了

posted @ 2006-05-14 14:14 BoolKinG| 编辑 收藏
仅列出标题