Category Archives: Tech

IPv9

今天看到新语丝上面有人提到IPv9,于是去查了一下一些英文的评论,基本上除了国内的新闻(没有真正技术的东西),国外的评论都是负面。
wikipedia的IPv9的英文篇也被标上了“即将删除”的标志,原因是观点不中立,加上英文又差。
我看了一下它的官方网站,不敢多说,但总的感觉是非技术的东西大于技术,是一些个人和某些政府官员在操作着。从技术上讲,我赞成有人的观点,这个IPv9本质上只是一个新的DNS解释,将10位数的数字域名映射到现在的IPv4和IPv6。另外它号称空间大小是2^256次,而Ipv6的大小是2^128次,只是我想,IPv6已经够大,还要搞成256干什么,如果一定要追求大,干脆整成512不更好,这些都不是IPv9比IPv6好的地方了。
看到包括人民日报等媒体也在宣传这玩意,感觉比较纳闷。有新闻里讲到,现在root server主控在美国,中国搞个IPv9,就成为第二个拥有主控权的国家了。也许吧,形象比较重要!

Talking about 判断空字符串的问题

That’s right. Looking at Length property equals to zero or not will be much faster than string equality comparison. In a more common case, use IsNullOrEmpty method instead in .net 2.0. This method checks the coming argument null or not, and then call String.get_Length to compare with 0.

Quote

判断空字符串的问题

一般人都喜欢用 (a==null || a=="" )来判断字符串是否是空的,也有部分人会用 String.IsNullOrEmpty(a)来判断(这里要大骂一下微软写MSDN帮助的人,这个方法的说明居然明显地写错了,包括IDE中的代码提示也是错的!!也许因此很多人本来知道这个方法的却被这个提示给误导了!)

现在回到假设已经知道a不是null的情况,我们需要判断a是否是空字符串,如何判断呢? a=="" 估计是大部分人的选择,当然这个时候继续用String.IsNullOrEmpty(a)也是无可厚非的,但是毕竟多了一句废代码, 也许大部分人认为把一个字符串和""比较是一个简单的操作,不过事实上并不是这样~~~~~~~

让我们ILDASM一下,看看这个 == 运算符到底做了什么事:

代码首先是把null的情况当特殊情况先处理了,然后

(省略了MSIL equalhelper代码)
是否感觉有些可怕?在a是空字符串的情况下,2个空字符串比较将会执行多少代码啊,首先是先比较字符串的长度,如果长度不同则返回假,可是此时2个字符串都是长度为0所以不符合这个条件,这个分别锁住a和""这两块内存,然后初始化4个指针来指向它们,再用2个复杂的循环和表达式运算,移动指针比较(很庆幸,由于是空字符串,2个循环实际上分别只判断了一次,并不会执行循环体)然后再判断字符串的长度~~~~ 至此,a=="" 返回了一个true ~~~

事实上事情本可以更加简单得多,如果我们使用另外一个表达式 a.Length == 0 则世界将美好许多,不再需要指针,不再需要那些复杂的语句,我们需要的仅仅是:

.method public hidebysig specialname instance int32 get_Length() cil managed internalcall

事实上在上面的L_0001和L_0009的最终语句里这句话已经被调用了2次了~~~

所以下次需要判断一个字符串是不是空字符串的时候,使用a.Length==0要比a=="" 执行起来快得多,需要执行的机器指令也少得多!

sql server 2005 express file database readonly

当开发环境里的sql server 2005 express数据库文件copy到发行环境里,往往面临权限更改的问题。
比如开发环境里是 nt authority/xxx windows集成帐号,但发行环境里不可能保证这个帐号和密码与开发环境一致。一个较好的方法是将之设置为 sql server帐号,比如使用sa和相关的密码(更安全自然是使用专门的帐号,而不用sa)
但即便如此,copy到发行环境里,还会出现数据库文件只读的问题。这一般是由于在sql server 05 express使用的network service权限不足够更改数据库文件。一个方便的解决方法是将数据库文件所在的目录权限增加network service,使之安全控制(可能修改和写入也足够)。重启sql server(配置管理器里)。到这一步按我的实验仍是只读。打开management studio express,先将该只读的数据库文件detach掉(好像会提示某个信息说detach失败,没关系),关闭对象链接器然后再重新打开,这时表明已经成功detach掉了,重新attach进来,发现已经可用。
权限的问题有时候整起来十分麻烦,这问题足足花了我三、四个小时。

这两天将Asian G-WADI转换成 Cuyahoga架构的动态网站

Cuyahoga是个结构很优美的基于asp.net 2.0的CMS框架。一直想好好看一下它,这两天从它的官方svn上当下来简单研究了一下,前面想用mySql,结果好像有问题,从官方forum上有人讲目前trunk下的版本不支持mySql,于是切换到Sql server 2005 express。又发现一点小bug,比如EditSite.aspx的bindculture绑定的时候key和value反了,造成site无法保存。更正了就没有太大问题。
不过目前来看Cuyahoga的modules还相对比较少,不过好东西都是曲高和寡,用的人都比较少,有个类似的叫dnn以前看过一些,感觉比较而言,在结构上不如Cuyahoga简明。简单就是美。

VisualSVN 1.3.2

最近VisualSVN 1.3.2出来了,trial是30天试用。Reflector反汇编分析了一下代码,采用了xor和md5公私密钥双重加密,由于无法知晓密钥(公钥在VisualSVN.VS.Interface.dll的资源public里),无法制作keygen。
找了几个切入点,都不理想,后来发现更改LicenseConverter.KeyToLicense是个不错的切入点,不管什么情况都产生一个有效的License。
       License l = new License();
       l.Binding = LicenseBinding.Seat;
       l.Capacity = 999;
       l.EndTime = DateTime.Now.AddYears(2);
       l.LicensedTo = "tong";
       l.LicenseId = Guid.NewGuid();
       l.PurchaseDate = DateTime.Now.AddDays(-10);
       l.PurchaseId = "shareit:1";
       l.StartTime = DateTime.Now.AddDays(-2);
       l.Type = LicenseType.Corporate;
       l.Version = 2;
简单测试了一下可用。

这里下载

porting win console app to MONO

MONO为.net程序提供了在linux等平台下运行的可能。一个简单的win console程序也可能会出现一些问题:

  • P/I
  • path separator
  • case sensitivity

比如.net代码引用了非托管代码,而非托管代码是不能在linux下运行的。这时会出现P/Invoke的问题。我不知道如何解决,重写吧。
linux下的路径分隔符与win下不一样,建议.net下的全部写成 /,或者用 Path.SeparatorChar,否则会出现在linux下找不到文件的问题
linux下大小写敏感,所以在.net代码里也要注意文件写的大小写问题,应当严格一致。

对winform情况更为复杂,一些.net下的功能可能在MONO下还没有完全支持,所以在porting的时候应当注意这些功能。
看官方网站,目前MONO处在1.x到2.0中间的某阶段,这意味着MONO还没有完全支持2.0,一个复杂的项目从.net到mono还是需要efforts才能搞定。

Install Boost c++ library

 
1. get Boost source code from its official web site.
2. download bjam source codes, which is required to build Boost binaries.
3. build bjam. In my environment, mingw compiler is used. type:
 build.bat mingw
 actually the build.bat is smart enough to detect the right compiler
 at this point, we get bjam at it’s bin.ntx86 dir.
4. build boost. enter boost’s source dir, type:
  bjam –toolset=gcc
  make bjam compiled above, can be accessedwe should specifiy toolset as
  it will be msvc by default that’s not what we expect.
5. to enable content assist, it would better change indexer to full.

Eclipse CDT MinGW debug error: error creating session

When I run as debug, the CDT says error creating session, then launching failed.
 
This is araised from missing of gdb. For best integration, I download MinGW gdb binary from MinGW’s download repository.
Then install it to MinGW’s same location. It works. 
 
Nov 29 2007: MinGW GDB debugger is bad; I have suffered various problems in debugging.

solution: 不能在space上发表日志

我前面经常遇到登陆进去后,却不能发表日志,发表日志的链接是灰的。前面有过调查,大致归因于中国的服务器好像有问题,一些js脚本可能无法传到我的机器。到美国后,同时用的一个台式机访问和发表空间日志没有任何问题,但笔记本仍有同样问题,有时候能发表,大部分时间却不能,很不稳定。无奈我前面都是通过email来发表日志,但总归是比较麻烦,一些信息通过email过去好像要审查,无法发布出来。
刚才在下班之后突然想来,如果我改成英语,那么将直接从美国这边的服务器下载,可能就没有问题了。
1)在浏览器的语言选项里(Internet Options/Lanugages)加入英语(美国),并移到最上面;重新打开Google时,发现Google的界面已经是英语。但登陆到空间,发现仍是中文,发表日志仍无效。
2)找到一个帖子,说可以更改space的默认语言,点击 http://spaces.live.com/?mkt=en-us 进去,发现果然是英语了。退出,再打开,还是英语,没变回来。估计在Cookie里存储下来了。
3)再进去发现果然发表日志的链接可用了。
前面跟人讨论说到这个问题,总怀疑我的机器中毒或有木马,因为我习惯是不打开杀毒程序。但自己感觉机器还是比较干净,应该问题不在这。现在这个结果表明,是国内的服务器有问题(或者是那个什么Great Wall Firewall等东东在搞破坏)。

Nov 29, 2007: I also found installed IE 7 will also solve this problem.

Make MinGW dll to be used by MSVC application

Make MinGW dll to be used by MSVC application
Zhuotong Nan, [email protected]

1. We cannot directly use dynamic libararies generated by MinGW in MSVC application
2. To enable this, it’s easy. In eclipse, open project property window, go to the MinGW c++ settings page, and enable –output-def by giving a def name.
3. Compile, this time it will generate a def file along with the dll file.
4. In msvc command window, type "lib /machine:x86 /def:def_file.def". It will create a lib file and a exp file.
5. In msvc ide, import this lib file as the common dll generated by MSVC.
6. The above described for only C functions, or c++ functions with extern "C" keywords. all c++ functions and any functions inside c++ class cannot be called by MSVC in this means. For information to address this so-called ABI (Application Binary Interface) issues between c++ compilers, please google with "ABI C++". In a short word, there is no easy way to do the interoperation. But there might be some workarounds.

Reference:
1. http://www.mingw.org/MinGWiki/index.php/MSVC-MinGW-DLL