Friday, December 22, 2006

整理:ICE Log: Hello Demo client runtime error

Hello Demo client runtime error:
Problem:
jump a debug runtime error when invoking remote "helloword()"

Solution:
Enable RTTI in VC project. In 配置属性 - C/C++ - 语言 - 启用运行时类型信息

Reference:
http://www.zeroc.com/vbulletin/archive/index.php/t-844.html

整理:ICE Log: Hello Demo run failure

Hello Demo run failure:

Problem:
The ordinal 2604 could not be located in the dynamic link library LIBEAY32.dll

clicking ok spits this out to the console:

Quote:
server:
.\PluginManagerI.cpp:182: Ice::PluginInitializationException:
plug-in initialization failed: unable to load entry point `IceSSL:create'

Solution:
COPY libeay32.dll and ssleay32.dll from ice\bin to the working directory.
Because Windows will use SYSTEM dll before PATH.

Reference:
http://zeroc.com/vbulletin/showthread.php?t=817

整理:Current Path of ASP.net Application

ASP.net Application invokes a native dll.
The native dll need a conf file under Current Path. But what is the Current Path?
It is not the directory which the native dll locates.
Well....I found the answer is simple.
Because asp.net app is loaded by w3wp.exe, w3wp.exe is under C:\WINDOWS\system32\inetsrv
So the current path is C:\WINDOWS\system32\inetsrv !

整理:Best Practice in MS

总结一下,谈一下ms软件开发的一些best practice,个人体会
Reference: http://blog.csdn.net/shony_zhao/archive/2005/04/25/362014.aspx
1) 充分沟通:每个人都知道自己在干什么,也知道别人在干什么,同时一个代码由owner和一个xp式的buddy共同通晓,这样做review, buddy build都很方便,一个倒下了也不至于block。
2) No Pure Coder:没有纯粹的执行者,每个人都有充分的空间发挥,从feature构思到design到experiment到debug,每个人都可以作为倡导者,这样就不会有边缘人的感觉了……当然除了我,呵呵。
3) PM:PM是不懂也不管具体技术的,负责上下协调,要钱找人,控制进度,联系出行,集合玩乐,总之就是程序员们不喜欢的工作就交给PM啦。而且重要的任务还有调节男女比例,我们这里dev全是男的,2个女生PM就被捧着了,吃饭的时候明显有PM的那桌热闹。
4) 适当文档:其实ATC里代码的注释不是很多的,大段大段没有注释的代码也不少,文档也主要是Design和Spec。但是那些代码都很容易懂,当然匈牙利命名法+好的结构。当然接口定义是很详细的。
5) 包:什么都可以包,包一包就好了 。指针对象用栈对象一包,就不用管del,close了。c++用mc一包,去.net调。好东西啊。
6) 统一Error Code:统一Error Code Define,统一Error Message Map,这样就不会有冲突。
7) Feature Priority:Feature永远做不完,时间永远不够,所以定好P0,P1 ....
想到再加

整理:STL doesn't support UNICODE fully!

现在正好是写blog的时间了,因为那个按照网上的正确代码写成的程序终于开始run了。
先说一下这是如何的一件白痴事情吧:很简单,我不过是要读一个unicode文件,然后把它里面的某几行写到另外一个文件里去罢了。
OK, 看上去是小学生的题目,于是我准备正好练练手,试试看最近学到的standard c++的STL。
wstring, wfstream, wchar_t.......... everything looks correct, except the answer
好了,经过艰苦卓绝的嫌疑排查之后,疑点终于集中在wfstream上了,看上去他每次都只读写byte……(大概荒废了我一个下午)但是他是w-的啊……何况getline里面还有widen('\n')这样的操作。
经过我失败地用C style的东西改写后,work了,看来果然是wfstream的问题,不支持Unicode。
终于……看到变态的解释和解法了:

using namespace std;
typedef codecvt Mybase;
// CLASS Simple_codecvt
class Simple_codecvt : public Mybase

{
public:
typedef wchar_t _E;
typedef char _To;
typedef mbstate_t _St;
explicit Simple_codecvt(size_t _R = 0)

: Mybase(_R) {}
protected:

virtual result do_in(_St& _State, const _To *_F1, const _To *_L1, const _To *&_Mid1, _E *F2, _E *_L2, _E *&_Mid2) const
{return (noconv);}
virtual result do_out(_St& _State, const _E *_F1, const _E *_L1, const _E *&_Mid1, _To *F2, _E *_L2, _To *&_Mid2) const

{return (noconv);}
virtual result do_unshift(_St& _State, _To *_F2, _To *_L2, _To *&_Mid2) const

{return (noconv);}
virtual int do_length(_St& _State, const _To *_F1, const _To *_L1, size_t _N2) const _THROW0()

{return (_N2 < (size_t)(_L1 - _F1)? _N2 : _L1 - _F1); } virtual bool do_always_noconv() const _THROW0()
{return (true);}
virtual int do_max_length() const _THROW0()

{return (2);}
virtual int do_encoding() const _THROW0()

{return (2);}
};
#include
int _tmain(int argc, TCHAR* argv[])

{
const char *fname = "filename.txt"; // or whatever locale loc = _ADDFAC(locale::classic(), new Simple_codecvt);
wofstream myostr;

myostr.imbue(loc);
myostr.open(fname, ios_base::binary);
if (!myostr.is_open())
cerr << "can't write to " << fname << endl;
return 0;
}

算了,我承认我高估STL了,或者说是VC上的STL
不讲了,累死了,有兴趣自己看http://www.codeproject.com/vcpp/stl/upgradingstlappstounicode.asp?df=100&forumid=16224&exp=0&select=646006

整理:IIS 5 vs IIS 6

FT, 搞了半天原来真的是IIS 5和IIS 6的不同
IIS 5所有的App虽然都可以是Isolation(high),但是其本身还是在一个进程空间内,所以如果调用一个外部native dll的singleton对象,所有的App会指向同一个对象……
IIS 6就是真正的在不同进程空间内运行了,不同的App Pool终于是隔开的了
然而,xp是很难装IIS6的……

Thursday, December 21, 2006

光线跟踪MPI并行版本 STEP 1

SolidViewer_MPI 并行msmpi, Win32版本基本完工。
关键词:光线跟踪3d场景渲染,易并行,条状分割
现在在一台机器上开n个mpi进程试验成功,不过好像效率上差不多。
下一步准备研究Win64编程,然后把这个deploy到Windows Cluster上面
话说为啥Window CCS只有x64版本呢?还得我很多东西还要重新改过……

Thursday, December 07, 2006

VS2005超大bug

vs2005我装了x64编译器后(不知道没装之前有没有这个bug):
1)创建最简单win32 console,啥都不改
2)debug下直接run,显示找不到msvcr80d.dll
3)属性里把“使用标准windows库”改成“静态库使用MFC”,run,正确
4)改回“使用标准windows库”, run,就不报错了……

解决方案除了上面说的那个么,还有:
a)在“属性->配置属性->清单工具->常规“下有一个”使用FAT32解决办法,把它选成是,就可以了。(注意:一定要先配置这个选项,然后再编译工程,要不然还是不好用:)
b)到你的工程的文件夹,如(myproject),找到其下的myproject\myproject\Debug\ myproject.rec,把它删掉(删掉整个Debug目录也可以),重新编译,搞定
c)在“属性->配置属性->清单工具->输入输出”,把嵌入manifest选为否

Tuesday, August 29, 2006

自写ThreadPool+select做多线程服务端心得

ThreadPool采用message driven方式,每当select返回一个fd的read请求时,将其包装为Task,丢入ThreadPool的message queue中。等其中的Thread从queue拿出,进行处理。
有三点心得:
1)当read请求已经被包装丢入队列,但还未得到recv处理时,select依然会不停的对这个fd的read进行响应,因此当丢入队列尚未处理时,select应拒绝该fd的read,否则负载越高,越容易重复Task溢出。解决方法是再设一个fd_pending的set,记录此状态下的fd。
2)queue不应是无限长的,在达到一定长度后应拒绝入队请求,以控制负载。同时对队列操作部分要设Critical Section。
3)fd_set的系列操作都是线程不安全的,在多个线程同时操作其时,需要设Critical Section。因此要将fd_set系列操作重新包装,外面加上Enter/Leave Critical Section。

Monday, August 21, 2006

似乎终于有点看懂select了

从只会用WSAxxxx到看懂select,还真是一个飞跃,赶快记下来。
select一般用于单线程、并发服务器


SOCKET msock;
fd_set rfds, afds;

msock = passiveTCP( service, QLEN );
FD_ZERO( &afds );
FD_SET( msock, &afds );

while( 1 )
{
memcpy( &rfds, &afds, sizeof( rfds ) );
if( select( FD_SETSIZE, &rfds, (fd_set*)0, (fd_set*)0, (struct timeval *)0 ) == SOCKET_ERROR ) )
errexit;
if( FD_ISSET( msock, &rfds ))
{
SOCKET ssock;
alen = sizeof( fsin );
ssock = accept( msock, (struct sockaddr *)&fsin,&alen );
if( ssock == INVALID_SOCKET )
errexit;
FD_SET( ssock, &afds );
}

for( fdndx=0; fdndx < rfds.fd_count; ++ fdndx )
{

SOCKET fd=rfds.fd_array[fdndx];
if( fd != msock && FD_ISSET( fd, &rfds ))
if( echo(fd) == 0 ) // DO Echo Process
{
closesocket( fd );
FD_CLR( fd, &afds );
}
}
}


Thursday, August 10, 2006

好久没来了

原因很简单,似乎就是我们伟大的长城金盾,以倒水把孩子也要一律倒掉的伟大作风,把我们的双眼狠狠蒙上,不让我们看到这里。
不过现在说这里改了ip,就解封了?不知道能解多久。