RSS 2.0 Feed
2006-04 Entries
摘要:龙芯(狗剩/GODSUN)的商用产品要上市了,我想买,嗯,考虑一下~ 动机 不能让工作用机长期开机,因为太耗电了(估算400W+),老妈要说的;最主要是SATA+RAID0系统不适合长时间工作,太危险了 现在那些做虚拟主机的太烦了,说好听点就是很不专业;我想买第二台机器放在家里做服务器,接ADSL就可以了,恢复我的sunmast.com,反正访问量不会很大,PC也够用 希望能更加肆无忌惮的下载东西(7x24小时的),以免浪费我那总计600G的硬盘 给家里的网络做个Gateway 工作用机不适合做Domain Controller,最好弄个专用的 学学Linux?很酷但是好像没必要(对我来说),玩玩还可以 优点 便宜才RMB1200(一说是USD200),相当于现在一颗P4/K8 CPU的价钱 够用我要找的就是这种配置的机器,而且CPU的性能应该高于我的需求 功率低(待考证)因为我不会给他接n个硬盘n个光驱和n个PCI、USB设备,看新闻介绍的图片,只看到散热片,连风扇都没有,估计全部加起来也就我那颗K8 CPU的功率;很适合24小时开机 噪音小(待考证)功率低了,散热要求自然小,噪音应该就很小了。我要把它摆在卧室的,太闹了影响晚上睡觉,我要求是不能高于空调的噪音 也算是支持一下民族工业吧多谢robinz提醒,造假事件是关于汉芯的,和龙芯无关。汉芯要鄙视,龙芯要支持,嗯 缺点 不支持Windows看来我得在Linux下装个VM才行,不然不能做DC了;且不说我只在大学里学过几个Unix命令,基本全忘完了 外观难看比以前在大学里看到的老示波器还要难看,放在卧室里影响美观 不知道稳定性如何上市之后,需要经过一段时间的考验才能让人放心;不过,现在谁也不要下结论 对我来说,它不支持Windows是最大的障碍。所以还很犹豫,再给我一个理由吧。 ----- Update on 4/16/2006 关于购买龙芯PC的一次聊天记录...[阅读全文]

posted @ | Feedback (29) | Filed Under [ Deployment and Configuration ]

摘要:还是说P/Invoke,不过这回不大一样,因为我找到了一个工具来帮忙了,而不是用极易出错的方式手工进行操作,这个工具就是SWIG:Simplified Wrapper and Interface Generator。 HOME:http://www.swig.org/WIKI:http://www.dabeaz.com/cgi-bin/wiki.plWIKIPEDIA:http://en.wikipedia.org/wiki/SWIG 这玩意儿居然可以根据C/C++的头文件直接生成出各种脚本语言的包装类,包括Lua、Tcl、Perl、Python、Ruby、Guile、Chicken、PHP、Java、C#、Ocaml(见WIKIPEDIA上面的介绍)。不仅如此,它和我以前看到的几个类似的工具不同,它似乎还带了一个C/C++编译器前端,可以利用语义分析过程处理各种#include、#define、typedef等等造成的复杂情况,和一般的依赖于文本替换的类似工具根本就不在一个重量级。 对于C#,它自动生成的代码大量应用了P/Invoke,产生了大量的static extern声明。不过,它们对包装类的使用者来讲是透明的。比如,原来C++的class会被自动对应到一个C#的class,你能看到的就是它的property和method而已,和普通C#的class没什么两样。 我在它的Example文件夹下面看到了好多例子,关于C#的有class、enum、funcptr、reference、simple、template、variables。注意到,很多原本很难通过P/Invoke调用的Native元素比如C++类型、方法指针、C++模版类/方法,它都能支持,摆脱了P/Invoke只能用于Invoke结构体和C导出函数的局限。也许C++有很多更复杂的语法或用法它还没能支持(我不确定,这个还有待继续研究),但也已经相当NB了。 真是相见恨晚啊,早知道有这个东西,就不会有这个post存在了。 BTW,中国的太监们居然把WIKIPEDIA这么好的网站都给阉了,实在是匪夷所思。好在通过IP还是可以访问;再懒一点,可以改一下你的hosts文件(%windir%\system32\drivers\etc),在最后面接上这么几行: 145.97.39.155 www.wikipedia.org145.97.39.155 en.wikipedia.org145.97.39.155 zh.wikipedia.org145.97.39.155 upload.wikimedia.org 学新东西的时候,WIKIPEDIA是很有用的,特别是那些专业词汇,找起来比GOOGLE更精确,嗯。...[阅读全文]

posted @ | Feedback (9) | Filed Under [ P/Invoke ]

摘要:啊,今天真的很闲,这是今天写的第三篇了,哈哈,超过了前面每月的平均水平。 VCKBASE的翻译团队刚刚把MSDN的一篇关于ManagedSpy的文章翻译了过来,我在这里直接引用一下,就不多说废话介绍了: ManagedSpy是一个诊断工具,和Spy++类似。它显示受托管的属性,允许你记录事件,并且是一个使用ManagedSpyLib的很好例子。ManagedSpyLib引入了一个称为ControlProxy的类。一个ControlProxy是一个System.Windows.Forms.Control的代表,允许你获得或设置属性并预定事件好似你正在目标进程中运行着一样。使用ManagedSpyLib来做自动化测试,为兼容性做事件记录、进程交互通讯,或白盒测试。 译文:http://www.vckbase.com/document/viewdoc/?id=1625原文:http://msdn.microsoft.com/msdnmag/issues/06/04/ManagedSpy/default.aspx下载:http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/ManagedSpy.exe 截图: 很酷吧~ Managed Spy是开源的,它用C++/CLI封装了一个基础类ControlProxy(小小的展现了一下C++/CLI的NB之处),外加一个用C#写的UI(就是你看到的这个截图)。你只可以用Managed Spy来spy基于.NET 2.0的Windows窗体应用程序。 它的ControlProxy类还能用来做别的事情,除了察看别的进程里控件的属性和事件之外,我在想是不是可以利用它写一个记录UI操作的Recorder,这样连测试脚本都不用写了,Beyondsoft这样的公司有福了。...[阅读全文]

posted @ | Feedback (6) | Filed Under [ Inside CLR Patterns and Practice ]

摘要:在我前面的这个post,曾谈到AsyncOperation类的一个令我着迷的功能,那就是它可以把一个方法提交到另一个线程上执行。它也是实现BackgroundWorker的关键组件。 However,前几天在一个Console程序再次试验这个类时,发现了一个不同的行为,就是.Post方法提交的delegate运行于哪个线程是不确定的,具体的说: 在Windows程序,如果AsyncOperation类是UI线程创建的,那么delegate将在UI线程执行(这个符合预期) 在Windows程序,如果AsyncOperation类是非UI线程创建的,那么delegate将在一个“随机”的来自线程池的Background线程上执行 — 而不一定是创建AsyncOperation实例的那个非UI线程 在Console程序,同第二条 也就是说,运行于其它线程的AsyncOperation.Post方法并不总是把delegate提交到AsyncOperation实例的创建者线程。对应到BackgroundWorker类的ReportProgress方法,同样如此。按照FCL的设计,应该是这样的。这是其一。 其二,假如说AsyncOperation和BackgroundWorker类专门针对Windows程序而设计,那么第2、3两条应该归为我的应用程序的设计问题。但是,有人在这里提到,即便是Windows程序(满足上面的第一条),也不能保证提交的delegate一定在UI线程执行! 这里不是讨论线程并发冲突的问题,而是BackgroundWorker和AsyncOperation类是否能真正简化Windows程序中多线程的应用。这里提到的问题,我自己暂时还没碰到。但如果属实,那我估计会放弃AsyncOperation和BackgroundWorker类,因为这相对于原先的猜测:“这个类只是一个线程的简单包装,用多线程模拟了异步调用而已”,其结果没有什么两样。 我不反对这两个类的使用,只是在ReportProgress时,也要用Control.Invoke来更新UI控件,防止RPWT。 更深的原因是,AsyncOperation.Post方法的实现是未知的,我曾经想用Reflector找出答案,如上个post所述,未果。我不知道它究竟把delegate提交到了哪里。按照MSDN的说法:“Invokes a delegate on the thread or context appropriate for the application model.” — 轻描淡写。 在.NET 1.x的Threading ≈ Thread + ThreadPool + lock(syncRoot) + WaitHandle + Control.Invoke,我觉得基本上就是这套东西了;而在.NET 2.0,现在看来AsyncOperation.Post()这种新奇的做法最好还是慎用~ ----- update on 4/4/2006 看来我的担心变成了现实,这里有人重现了同样的错误。...[阅读全文]

posted @ | Feedback (3) | Filed Under [ Inside CLR Patterns and Practice ]

摘要:在前面提到,.NET 1.x提供的自定义序列化的solution很不方便。不过,IMPOSSIBLE IS NOTHING,我们可以写两个辅助方法来绕过这个问题。class SerializationHelper ...{ public static void Serialize(object obj, SerializationInfo info, StreamingContext context) ...{ MemberInfo[] members = FormatterServices.GetSerializableMembers(obj.GetType(), context); foreach(FieldInfo field in members) ...{ info.AddValue(field.Name, field.GetValue(obj), field.FieldType); } } public static void Deserialize(object obj, SerializationInfo info, StreamingContext context) ...{ MemberInfo[] members = FormatterServices.GetSerializableMembers(obj.GetType(), context); foreach(FieldInfo field in members) ...{ field.SetValue(obj, info.GetValue(field.Name, field.FieldType)); } } } 如果你已经看明白了我的意图,那就不必往下看了。 下面是利用了这个SerializationHelper的自定义序列化方案:[Serializable] class Person : ISerializable ...{ // public field public string Name = "Vista Xia"; // private field private int age = 23; //......[阅读全文]

posted @ | Feedback (3) | Filed Under [ Inside CLR Patterns and Practice ]

摘要:1、支持绑定到非公有方法的委托 关于这一点,与其说是个增强,在我看来这似乎是设计思路上略微的转变。具体地说,在.NET 1.x,像这样的代码:[Serializable] class Person ...{ public event EventHandler Birthday; } static void Main(string[] args) ...{ Person p = new Person(); p.Birthday += new EventHandler(p_Birthday); BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); bf.Serialize(ms, p); } static void p_Birthday(object sender, EventArgs e) ...{ Console.WriteLine("Birthday is coming!"); } 会抛出一个这样的异常: An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dllAdditional information: Serialization will not deserialize delegates to non-public methods. 提示信息是很明确的,它不支持绑定到非公有方法(non-public method)的委托。要解决这个问题,你得在p_Birthday方法前加一个public关键字。然而,对于类Person的设计者来说,他不知道事件Birthday将被绑定到什么样的方法之上,所以这带来了一定程度的不确定性。 .NET 2.0已经把这个行为改掉了,这段代码现在可以正常运行。这样,在做序列化/反序列化操作时,这增强了应用程序的稳定性。 2、可选字段增强了不同版本的应用程序之间的互操作性 .NET/FCL 2.0的System.Runtime.Serialization命名空间引入了一个新的名为OptionalFieldAttribute的特性类: Specifies that a field can be missing from a serialization stream so that the BinaryFormatter and the SoapFormatter does not throw an exception. This attribute allows you to specify that new fields in a serializable type (a......[阅读全文]

posted @ | Feedback (3) | Filed Under [ Inside CLR ]