| Subcribe via RSS

WinHA windows环境下故障切换软件

6月 29th, 2008 | No Comments | Posted in C/C++ < by Johnny Woo >

这个是我准备做的新的开源项目
主要是为了使用简单的方法来搭建WINDOWS环境下的HA应用
应为MCSC需要使用域.让我觉得很不爽
而HA其实就是个简单的东西来的.
所以准备自己重写一个
首先环境需要2台服务器
每台有两块网卡.其中一块用于心跳线对接
鉴于可靠性
我准备同时检测公网IP以及对外服务IP
软件流程大致如下

windows启动
winha服务启动
删除绑定的对外IP
arp检测对外公开ip的mac地址
如果公开IP不通,并且心跳线不通
则绑定公开IP
如果对外IP通,且MAC地址不是本机,心跳线正常
则使用检测是否对外IP以及心跳线正常
随时准备接管

阅读内文

关闭JUST-IN-TIME DEBUGGER调试器

4月 27th, 2008 | No Comments | Posted in C/C++ < by Johnny Woo >

安装了VS之后
系统会默认使用vs的just in time调试器
很多原来不会报错的东西,现在都会不时的跳出来
关闭方法如下
在vs->tools->option->debugging->把just in time的都取消
确定之后即可
下面有一遍是如何使用注册表来取消调试的

阅读内文

Inotify编程

4月 15th, 2008 | No Comments | Posted in C/C++ < by Johnny Woo >

参考文档
http://search.cpan.org/~mlehmann/Linux-Inotify2-1.1/Inotify2.pm
http://www-128.ibm.com/developerworks/linux/library/l-inotify.html

阅读内文

IISBACK终于完工

4月 11th, 2008 | 2 Comments | Posted in C/C++ < by Johnny Woo >

终于把IIS备份恢复工具写好了
项目地址
http://code.google.com/p/iisback
好久之前就在想写这么一个工具
因为市面上所有的IIS备份恢复工具
几乎都是收费的
而MS自己又无法在重装之后使用原有的备份文件来恢复
备份工具实现了很久之前就想做到的一些功能
1.备份站点用户
2.自动创建站点用户
3.自动设置站点指向目录的用户权限
有了这几点
即便是原先没有对每个站点设置独立用户的主机
也可以通过简单的重装IIS来将所有站点设置成独立用户环境
这对于拥有几十个以上站点的IIS来说,是非常有用的.
不过至今还有几点需要在今后添加的
1.备份以及还原IIS 6模式下的应用池
2.备份站点的运行权限
再往后.可能会慢慢将iisback的各种功能丰富并且独立出来
形成一个iis tools套件

阅读内文

我的开源项目

4月 11th, 2008 | No Comments | Posted in C/C++ < by Johnny Woo >

iisback
项目目的:构建一个通用性的IIS备份还原工具,解决IIS服务器重装之后的站点还原问题.
http://code.google.com/p/iisback/

vhost
项目目的:构建用来自动开通IIS,SERV-U,MYSQL,MSSQL,IMAIL的工具
http://sourceforge.net/projects/vhost/

阅读内文

C与现代语言和刀与自动切片器

4月 11th, 2008 | No Comments | Posted in C/C++ < by Johnny Woo >

自从石器时代开始
刀的大致设计就出现并且已经定型
虽然今天可能用钛合金而非石头来制作刀体
但是其基本思想仍旧是一致的
这个由简单的要素组成的工具
成为了其问题领域(切割)的最好通用性解决方案
但是其在某些特定领域的效果
可能没有针对性的改良工具来的好
比如你要切丝,切片
用刀需要横切竖切
而用刨刀只需要几秒
结果也比未受训练的要切出来的更整齐
甚至减少了其所带来的可能性的损伤(切到自己的手)

但是
工具的设计目的应该是更快的帮你完成聪明事
而不是阻止你去做傻事
对刀的要求是更锋利而提高切割性能
而不是更钝去阻止你割伤自己
很多人责难C更容易导致程序的崩溃
这本身并非由于C的语法问题或者编译器问题
而是使用人的问题
阻止人们做傻事成为了现代语言的设计目标
结果更大更复杂的语言出现了

刀被改进成了自动切片机
有了罩子,自动电源保护,自动停止保护
一切看起来都更方便,更安全了
其体积与开销却成倍翻翻
并且其针对的问题域也越来越小
你如何用自动切片机来刻花呢?
成为通用性工具又要保持自由性
那么其不可避免的将变得有更大的体积与开销
而结果将是
其使用复杂性也变得更大
想象一下
一部能自动切丁,切片,甚至刻花的自动切割机
其体积将会和一个台子那么大
可能嵌入芯片来控制刀片
可能需要可以自行编程来达到雕刻任意花色的目的
最后其说明书
可能比 更厚
而最后能熟练掌握这台机器的学习难度
和你熟练用好刀所需要的练习一样多

这看起来很蠢是不是?
但是现在的编程语言正在重复这种蠢事
更安全,更通用,看起来是很棒的目标不是么
但是他们没有考虑到后面所带来的开销
看看现在JAVA已经成什么样了.
经过3年之后,它可能臃肿的需要一张DVD来安装
目前的JAVA学习曲线,已然比C或者汇编更高了.

和切丝器与切片器是刀的额外补充或者增强一样
高级语言应该是作为高级抽象思维的胶合层
其或者是改善在某个特定问题域的解决速度
或者是对逻辑进行高度抽象
python和lua在这方面做得不错
它们并非是为了取代底层语言或者包含底层语言而出现的
相反,它的目的是为了胶合底层或者扩展特定目的而产生
这方面,JAVA甚至C++都在犯傻.
C++如同其名字一样
在C上增加又增加
它就像一个刀片外露的自动切割机
没有对犯傻做保护
(即便有也是用更傻的方法去阻止更傻的事,比如强制转型)
却阻止人们做更聪明的事
其加入的面向对象和模板
似乎提供了更多的编程方式
但是其增加的学习难度
却远远超过其带来的便利性

面向对象,被鼓吹成为解决很多问题的终极方法
但是最后的实践看来.其也只是针对某个特定问题域有效率.
首先程序内需要有超过2层的抽象结构
接着不同层的对象之间至少有一个不同实现的方法,也必须至少存在有一个相同的实现.
这种约束条件却是很多人没有看到的
其目前善于的问题域
应该是游戏对象以及窗体系统方面

同样.模板只有针对在针对不同的数据结构或者对象
都使用相同的算法的情况下
才是有效的解决方案

模板类或者类模板,
非常精巧
和福尔摩斯的缜密逻辑一样
甚至只有和摩尔摩斯一样的人
才能理解这种使用方式
它就像一个能自动雕刻花式的切割器一样
一切看起来很完美
但是人们只看到其综合了所有方法的优点
却忽视了其同样综合的所有缺点

当人切到自己手的时候
不该责怪这个延续了1万多年的设计
而是应该去熟悉这种设计
而其改进方向
也不该是如何的切不到自己的手

最后这篇文章,可能会引起很多JAVA,C++狂热份子的不满
确实这些语言在其特定问题域
有着比低级语言更好的开发效率和安全性
但是其注定了只是针对特定域的解决方案
即便其设计目的是想针对所有问题域
但结果往往不得不将人们推回低级语言(例如只使用了C++中的C子集)

阅读内文

LUA配置方面的应用

4月 11th, 2008 | No Comments | Posted in C/C++ < by Johnny Woo >

LUA由于其可以方便的加入C程序
作为外部调用脚本使用
这种特性
对于日益复杂的应用服务的配置文件非常适合
可以写出自己想要的操作流程
流入varnish现在的流程
固定了调用的流程的名称
然后再去针对每个流程写每个操作手段
而如果使用lua
就可以只定义几个操作方法
而具体的流程
可以由用户使用判断,转移,条件等语句进行逻辑组合
这样的可读性也会更高

阅读内文

WINDOWS编程手札

4月 11th, 2008 | No Comments | Posted in C/C++ < by Johnny Woo >

comment 最大长度260
windows用户名 最大长度20
windows密码 最大长度128
iis id 最大长度10
IIS数据键值最大长度 METADATA_MAX_NAME_LEN
IMSAdminBase::GetData之前不需要OpenKey

META BASE属性
http://msdn2.microsoft.com/en-us/library/ms525644.aspx

NTFS的文件权限是用ACL描述的,ACL分为DACL和SACL,设置权限主要是指设置DACL。SACL是用于审核的。

一般情况下都是在已有的权限基础上给NTFS的文件/目录增加/减少权限,当然也可以完全替换掉原来的权限设置。大致步骤:
1、用GetNamedSecurityInfo( )获得与该文件对象(实际上也可以是其它对象,如注册表键值等)相关的SD(Security Descriptor)
2、用LookupSecurityDescriptorParts( )从该SD中取出感兴趣的部分,一般是取出DACL。
如果你不想在原来的DACL基础上增加/减少权限,而是想设置全新的DACL,则此处可以不用LookupSecurityDescriptorParts,而是用InitializeAcl从头生成一个空的DACL。
3、用BuildExplicitAccessWithName/AddAccessAllowedAce/AddAccessDeniedAce和SetEntriesInAcl( )给上述的这个DACL增加新的ACE,生成一个新的DACL结构。
4、用SetNamedSecurityInfo( )将新的DACL与文件的SD联系起来,完成权限设置。
Net API中有几个函数可以操作共享。

参考:
1、基本概念:
http://www.microsoft.com/China/msdn/technic/compilation/windowsnt.asp
http://www.china-pub.com/computers/emook/0238/info.htm
2、MSDN中关于security API的部分
3、Platform SDK中关于security API的例子程序
\Microsoft Platform SDK\Samples\WinBase\Security

阅读内文

VC 2008,更好的IDE体验

4月 11th, 2008 | 1 Comment | Posted in C/C++ < by Johnny Woo >

跟风选择了VC 2008 ?
我可不这么想
虽然对于我来说VC2008的功能和VC6来说没有什么差别
我用到的也不过就是所有C++编译器都能编译的东西
甚至没有用到模板.(见鬼的模板.让我的程序看起来更加乱而已.)
那是什么让我选择了VC2008呢
速度和界面!
这个速度并非编译速度
而是界面打开的速度
在同一台电脑上打开IDE比较
第一次打开时间
VC6一般在4~6秒
VC2008在3秒
再次打开时间
VC6在1~2秒
VC2008.算是半秒吧.基本是瞬开了.
界面呢
虽然我能够使用软件将VC6的字体换成比较喜欢的字体和大小
但是那个界面.可是天天要面对的
每个人都会说表面不重要
可是实际上还是会凭着界面的美观对一个软件做评判.
至少天天面对的东西.更养眼些.而且开启速度更快
那对我来说已经是非常充足的理由了.
还有
VC2005以及2003弃用的理由之一
就是因为2003要弄个MSVCRT71.DLL
而2005更过分.一定要弄个manifest.
编译出的debug版本换台机器运行根本不能跑.
而2008令我惊喜的地方
native的编译好之后.放在一台没有装过任何编译环境的机器上
直接就能跑起来.
完美
有了这三个理由
我已经是决意将vc6抛弃了.

今天发现EXPRESS EDITION在DEBUG模式下
也有DISASSEMBLE功能
显示风格非常好
在每条C语句下面会有灰色显示对应的反汇编代码
这对于调试来说实在是太棒了
也许2003,2005早有了这个功能
不过2008里面这个功能的发现,确实让我欣喜不已

阅读内文

给VisualStudio Express加上资源编辑器

4月 11th, 2008 | No Comments | Posted in C/C++ < by Johnny Woo >

VisualStudio从2005开始有了Express版本
这个版本是正式版的简化.而且免费.对于没有太大的项目要求的人来说
是很好的一个版本.
可惜没有MFC等的支持.当然.制作小软件,不需要那样的东西.
但是连RC EDITOR也没有.这样要做有窗体的APP就比较困难
市面上有很多资源编辑器.但是很多不支持.RC格式.
首先推荐两款RC编辑器
一款是ResED
一款是ResEdit
前一款是著名的radasm环境开发者开发的
用asm写成.非常小巧而且迅速
http://www.radasm.com/projects/ResEd.zip
后一款是一个免费软件项目
http://www.resedit.net/ResEdit.zip
这款能够导入windows头文件
根据最新版本做出相应的空间.
也是十分的小巧

如果只是用两款软件另外打开RC文件去编辑
那没有和IDE集成.就很没意思了.
下面是如何将这些软件和VC EXPRESS集成起来使用
打开项目后
在项目的Resource Files内找到.RC文件
右键选择Open With,选择Add,选中ResEd或者ResEdit的执行文件
完成后选择Set as Default就可以了
这样以后直接.rc文件
就可以用其他的资源编辑器打开并且编辑
编辑好后.直接保存.然后再用VC EXPRESS编译即可

阅读内文

安装VS 2008 EXPRESS出现无法读取deffactory.dat错误

4月 11th, 2008 | No Comments | Posted in C/C++ < by Johnny Woo >

安装VC 2008 EXPRESS的时候出现无法读取C:\Documents and Settings\Administrator\Local Settings\Temp\SIT23992.tmp\DefFactory.dat文件的错误
The data file ‘DefFactory.dat’ cannot be opened

打开此文件
手工修改内容如下

[Version]
Signature=”$Windows NT$”
Provider=”Microsoft Visual C++ 2008 Express Edition - ENU”
Version=900.100.00
NullString=Null String
BootstrapperURL=fwlink/?LinkId=95926
NewVersionURL=fwlink/?linkid=96095
Lang=1033
AdminModeSupported=0

[Scenario List]
vsscenario.dll

[Scenario Factory Information]
Default Scenario=11E4C8F3-425E-43b9-B689-8BFDF03342E2

发现这个问题的原因是某些软件
例如UltraISO
在解压ISO文件的时候
将此文件的编码改变的关系

阅读内文

inotify例程

4月 11th, 2008 | No Comments | Posted in C/C++ < by Johnny Woo >
下载: inotify.cpp
#include   
#include   
#include   
 
char * monitored_files[] = {   
    
"./tmp_file",   
    
"./tmp_dir",   
    
"/mnt/sda3/windows_file"   
};   
 
struct wd_name {   
    
int wd;   
    
char * name;   
};   
 
#define WD_NUM 3   
struct wd_name wd_array[WD_NUM]//用于存储文件路径名和watch描述符   
 
//inotify机制事件对应说明数组   
char * event_array[] = {   
    
"File was accessed",   
    
"File was modified",   
    
"File attributes were changed",   
    
"writtable file closed",   
    
"Unwrittable file closed",   
    
"File was opened",   
    
"File was moved from X",   
    
"File was moved to Y",   
    
"Subfile was created",   
    
"Subfile was deleted",   
    
"Self was deleted",   
    
"Self was moved",   
    
"",   
    
"Backing fs was unmounted",   
    
"Event queued overflowed",   
    
"File was ignored"   
};   
#define EVENT_NUM 16   
#define MAX_BUF_SIZE 1024   
 
int main(void)   
{   
    
int fd;   
    
int wd;   
    
char buffer[1024];   
    
char * offset = NULL;   
    
struct inotify_event * event;   
    
int len, tmp_len;   
    
char strbuf[16];   
    
int i = 0;   
 
    
fd = inotify_init();   
    
if (fd < 0) {   
        
printf("Fail to initialize inotify.\n");   
        
exit(-1);   
 
    
}   
    
for (i=0; i< WD_NUM; i++) {   
        
wd_array<I>.name = monitored_files<I>;  //存入文件路径名   
        
//给路径wd_array<I>.name添加一个watch,监视所有事件,wd为返回的watch描述符   
        
wd = inotify_add_watch(fd, wd_array<I>.name, IN_ALL_EVENTS);   
        
if (wd < 0) {   
            
printf("Can't add watch for %s.\n", wd_array<I>.name);   
            
exit(-1);   
        
}   
 
        
wd_array<I>.wd = wd;   
    
}   
 
    
while(len = read(fd, buffer, MAX_BUF_SIZE)) { //读取多个事件   
        
offset = buffer;   
        
printf("Some event happens, len = %d.\n", len)//打印实际读取的长度   
        
event = (struct inotify_event *)buffer; //得到事件   
 
        
while (((char *)event - buffer) < len) {   
            
if (event-> mask & IN_ISDIR) { //目录   
                
memcpy(strbuf, "Direcotory", 11);     
                
//“Direcotory”字符串长度为11   
            
}   
            
else {   
                
memcpy(strbuf, "File", 5);   
                
//“File”字符串长度为5,包括后面加一个空格   
            
}   
            
printf("Object type: %s\n", strbuf);   
 
            
for (i=0; i< WD_NUM; i++) {   
                
if (event-> wd != wd_array<I>.wd)   
                    
continue;   
                
printf("Object name: %s\n", wd_array<I>.name);   
                
//打印文件路径名   
                
break;   
            
}   
 
            
printf("Event mask: %08X\n", event-> mask)//打印事件掩码   
            
for (i=0; i< EVENT_NUM ; i++) {   
                
if (event_array<I>[0] == '\0')   
                    
//空字符串行,说明事件对应说明不存在   
                    
continue;   
                
//将事件掩码的位匹配数组成员,如:00000020,即100000,对应i为5   
                
if (event-> mask & (1 << i)) {   
                    
printf("Event: %s\n", event_array<I>);     
                    
//打印事件对应的说明字符串   
                
}   
            
}   
 
            
tmp_len = sizeof(struct inotify_event) + event-> len;   
            
event = (struct inotify_event *)(offset + tmp_len)//得到下一个事件   
            
offset += tmp_len;   
        
}   
    
}   
}
阅读内文