关于作者

用户名:chaoslawful
笔名:chaoslawful
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



友情链接

访问统计:
文章个数:30
评论个数:21
留言条数:2




Powered by BlogDriver 2.1

chaoslawful的笔记

 

文章

中国互联网随想
现在中国互联网的发展算是很快的了,然而空有速度没有质量,内部还分割成几乎互不相通的小网络,无论是网络速度之慢还是收费之高恐怕都是世界首位,最近看到有网友称之为"中国互断网",实在是再贴切不过了。其原因大概还是可以归咎于电信的垄断地位,看看中国的网络、通讯等几个领域的情况就知道,垄断绝对生不出什么好果子。再这样胡整下去不思进取,后果难以想象啊。

- 作者: chaoslawful 2005年07月2日, 星期六 14:11  回复(0) |  引用(0) 加入博采

让Encode::HanExtra起作用
为了支持GB18030编码需要从CPAN上安装Encode::HanExtra模块,但Perl发行版本默认的Encode模块设置没有打开对HanExtra的支持,装了该模块也暂时无法使用GB18030编码。让模块有效的修改方法是:
修改Perl发行版的lib/Encode/Config.pm文件,其中的%ExtModule散列表定义了不同的编码对应的模块名称,搜索后会发现包括gb18030在内的几个编码对应的行被注释了,装完Encode::HanExtra模块以后手工去掉这几个注释即可。

- 作者: chaoslawful 2005年06月13日, 星期一 00:32  回复(1) |  引用(0) 加入博采

疯狂的想法:整合所有知识的数据库
搞学术、做技术少不得四处奔波查找参考资料,然而我们本身成长经历的环境局限很大,思维当然也逃不出眼见的那点儿玩意儿,这样一来凭着自己的想法查找资料的方向究竟对不对,谁都不好说。虽然网络早已进入平常生活,但这种被动式的工具不可能弥补我们自己的认识缺陷,关系近一些的资料也许会被关键词揪出来,然而那些不属于你的领域却从另一个方向解决了你的问题的资料呢?恐怕一辈子都不会知道它们的存在。从这方面看,国内国外的情况都差不多,前苏联进行的工程和数学研究对社会产生的推动力有目共睹,然而大概没多少人能看懂那些俄文文献了。每个领域都在不停地进行重复劳动,浪费宝贵的社会资源,减缓了社会发展速度。如果有这样一种数据库,能够将全球历史上所有知识都分门别类的汇总起来,人们只要向系统提出问题,它就能罗列出可能解决问题的相关理论,给人们一个主动的引导,这样大概会大大减少重复工作吧。这样的系统简直就是一个无所不知的智者,拥有高超的理解和判断力,又有着任何人都难以企及的记忆力,远非目前的技术所能达到。不过幻想一下总没坏处,hoho。

- 作者: chaoslawful 2005年06月12日, 星期日 21:15  回复(7) |  引用(0) 加入博采

Visual C++中编译时产生C1010致命错误的原因
fatal error C1010是预编译头(precompiled headers)错误,编译时出现该错误一般是因为工程设置中要求使用预编译头,而某些C/C++源文件中没有包含对stdafx.h预编译头文件的include,解决方法:
1、不使用预编译头。直接在工程设置里关闭使用预编译头的选项。
2、使用预编译头。由于预编译头辅助文件为stdafx.cpp,是C++文件类型,因此产生的预编译头也只适用于C++环境,不能用于C环境下,这样就要求工程中必须只包含纯粹的C++源文件,每个源文件必须在开头加入#include "stdafx.h"以包含stdafx.h,这时无法进行C/C++混合编译。

- 作者: chaoslawful 2005年05月28日, 星期六 22:14  回复(1) |  引用(0) 加入博采

避免pod2html时中文链接遭到损坏的方法
这一问题主要出现在Windows系统下,修改Perl安装目录下的lib/Pod/Html.pm,将其中的anchorify函数修改如下:
sub anchorify {
my ($anchor) = @_;
$anchor = htmlify($anchor);
# $anchor =~ s/\W/_/g; # 注释此行
return $anchor;
}

然后转换时中文链接就不会被替换成下划线了。而*nix系统下可以通过设置LOCALE环境变量使\w包含中文字符。
pod2html本来使用了locale指示符,想要解决不同编码的问题,但Windows系统下似乎并没有和POSIX标准对应的LOCALE设置,只有手工对原始代码进行修改了。

- 作者: chaoslawful 2005年03月18日, 星期五 22:59  回复(0) |  引用(0) 加入博采

使用Win32::API模块导入DLL中函数的注意事项
使用Win32::API时需要注意的基本上就3点:
1、DLL中函数的calling convention必须为__stdcall型。这个应该是Win32::API的底层库中引入的一个假设,和Perl没关系;如果你用XS自己写DLL的调用过程,自然可以根据DLL中特定的calling convention自行调整调用方法,这一限制也就不复存在了。
2、导入DLL中的函数时要保证函数标识符的正确性。之所以要提这一点是因为在不使用definition file的情况下,不同的编译器在产生DLL时对导出函数名的处理方法不一样。以VC6为例,当调用规范为__cdecl时,函数func将被改名为_func;调用规范为__stdcall时,函数func被改名为_func@n,其中n是函数参数的总字节数。因此在导入函数之前最好用dumpbin之类的工具看一下DLL导出函数的真正标识符,必须用这种name mangling之后的标识符才能正常导入函数。为了避免这种麻烦,在写DLL的时候尽量用definition file指定每个函数生成的标识符吧。
3、用给出函数原型的方法导入函数时表示指针的*号一定要和类型紧挨着,另外这时对于指针类型的参数不需要自己pack数据了。例如:
假设test.dll中有一个函数long func(long *a),则
use Win32::API;
$handle=Win32::API->new('test','long func(long* a)'); # 这里指针符号*和指向的类型必须紧挨着,
# 这是由Win32::API解析原型的方法决定的。
$a=10; # 注意:不需要pack了!Win32::API会自动根据函数原型pack数据
$handle->Call($a);
不使用原型时,由于指针指向的对象类型未知,Win32::API无法知道如何处理这种数据,就必须手工将数据pack到标量中去。
$handle=Win32::API->new('test','func','P','N');
$a=pack('L',10);
$handle->Call($a);


Reference:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_Calling_DLL_Functions_from_Visual_Basic_Applications.asp


- 作者: chaoslawful 2005年03月12日, 星期六 01:58  回复(2) |  引用(1) 加入博采

Win32下注册COM组件后对注册表产生的变动
    在Win32下使用regsvr32 component.dll注册component这个COM组件后,将在注册表的HKEY_CLASSES_ROOT\CLSID下产生一个以该组件的UUID为名字的项,其下的InprocServer32项里就指明了该组件对应的DLL文件所在的路径。


- 作者: chaoslawful 2005年03月8日, 星期二 09:30  回复(0) |  引用(0) 加入博采

Perl5.8中读取其他编码的文本文件
通过改变PerlIO层的编码即可实现,配合encoding指示符可以使操作过程更为自然,如读取UTF-16编码的文本文件:
use encoding 'gbk';   # 系统默认编码为GBK
use open IN=>':encoding(utf16)';   # 读入文件时认为数据按UTF-16编码,自动根据BOM头判断是LE还是BE
open(FH,"test.txt") or die;
while(<FH>) {   # 读入数据时自动从UTF-16转换为标准的UTF-8编码的Perl字符串
    chomp;
    print "$_\n";   # 由于encoding指定了系统默认编码,输出时数据自动从UTF-8转换为GBK
}

也可以用open的3参数形式指定单个文件句柄的PerlIO层编码,并在输出时手工转换编码:
use Encode;   # 需要使用encode函数实现手工转码
open(FH,"<:encoding(utf16)","test.txt") or die;   # 指定FH句柄的数据为UTF-16编码
while(<FH>) {   # 读入数据同样自动转换为UTF-8
    chomp;
    print encode("gbk",$_),"\n";   # 手动将UTF-8编码字符串转换为GBK编码字符串输出
}

另外使用binmode可以随时切换某个文件句柄的PerlIO层编码,如:
binmode(FH,":encoding(utf16)");   # 将FH的数据编码置为UTF-16
binmode(FH,":raw");   # 不对FH的数据进行编解码处理
binmode(FH,":utf8");   # 将FH的数据编码置为UTF-8



- 作者: chaoslawful 2005年02月28日, 星期一 22:50  回复(0) |  引用(0) 加入博采

Perl/Tk如何去除窗口标题栏?
TopLevel窗口本身没有标题栏,而MainWindow窗口调用overrideredirect(1)就可以去除标题栏及边框,如:
$mw=new MainWindow;
$mw->overrideredirect(1);  
# 去除窗口标题栏及边框
...




- 作者: chaoslawful 2005年02月22日, 星期二 11:05  回复(0) |  引用(0) 加入博采

Perl5.8中使用encoding指示符需要注意的问题
     Perl5.8中引入了encoding指示符,可以用来设定源代码及输入输出的编码格式,并自动将内部字符串的UTF-8编码转化为所需的编码,方便了在非Unicode编码环境中的字符串操作。但是在使用中需要注意一些问题:
1、encoding指示符仅对源代码、标准输入输出起作用,一般的文件及socket输入输出不受其影响,因此还不能抛弃Encode模块。
2、使用encoding设置编码后,若对任何一个字符串进行chomp操作,则会根据encoding编码将其转换为UTF-8编码;而chop操作则仅对字符进行操作,不进行这种转换。
例子:
use encoding "cp936";
use Encode;
open(FH,"<t.txt");   # 从某个文件读入一些汉字数据
while(<FH>) {
    chop;   # 可改为chomp后对结果进行比较
    print "$_\n";
    print "before decode len: ",length($_),"\n";
    print "after decode len: ",length(decode("cp936",$_)),"\n";
    print "@{[split//,decode('cp936',$_)]}\n";
    print length(join('',split(//,decode("cp936",$_)))),"\n";
}


- 作者: chaoslawful 2005年02月18日, 星期五 22:28  回复(0) |  引用(0) 加入博采