Hui’s Thinkpad Header Image

Entries in '程序' category

[下载] 一本C#和.NET的好书

《Pro C# 2008 and the .NET 3.5 Platform, Fourth Edition》
作者 Andrew Troelsen
我把这本电子书放在了Megaupload上,下载链接。打开时需要密码 c@sharp.com
这本书的前一半介绍C#和.NET的基础,包括四个部分,分别是:
1. .NET的基础概念(CLR/CTS/CLS等)和C#的编译环境。值得一提的是侧重介绍了非Visual Studio环境,包括命令行环境。这对理解C#的编译过程很有帮助。
2. 核心的C#语言构造,包括类的定义、继承、多态、成员函数重载、虚函数和抽象类,exception处理,以及特别有一章是关于garbage collection的,值得一看。
3. 高阶C#构造,包括interface, collection, delegate, indexder, 以及C#2008的新特性和LINQ入门。
4. 介绍 .NET 的assembly构造,多线程和CIL等。
后半介绍C#下的微软扩展库(比如ADO.NET, WCF, WindowsForms, WPF和ASP.NET等)。
特别值得一提的在附录中专门有一章介绍.NET的平台无关移植 — Mono项目。
该书条理清晰,将一个个概念按逻辑顺序逐个解释,同时辅以例子。即可以作为初学者的入门书,同时这部1300页、拥有详细索引的书也可作为进阶的参考书,所以强烈推荐!
阅读(669 次)Share This

Categories: 程序

.NET比C/C++更快?

C#和JAVA以及Python一样,是解释性语言(Interpreted language)的一种,这类语言和编译性语言(Compiled language)如C/C++/FORTRAN的区别在于后者将源代码编译为机器代码执行,而前者通过将源代码编译为平台无关的bytecode,然后再通过虚拟机的“即时编译”(Just-in-time compilation, JIT)在执行时“解释”为机器代码然后运行。在跨平台性和代码易于调试维护上前者比后者有绝对优势,而且往往添加了一些关键特性比如garbage collection。
通常编译性语言比解释性语言快,但并不是一定的。两者执行效率差距完全取决于编译器和虚拟机的质量。.NET平台就是一个很好的例子。
.NET 是微软的一种应用程序构架(Framework),C#/C++/VB等源代码可以通过微软的编译器先生成一种称为CIL(Common Intermediate Language, 通用中间语言)的bytecode,然后通过.net的虚拟机编译为机器代码执行。C#是.NET的默认语言,你也许会争论C++是.NET的默认语言,因为其可控性更强,但这种争论是错误的,因为:C#和managed C++生成的都是相同的CIL bytecode,而C++语言本身显然缺少C#的新特性。
即使是C#.NET和unmanaged C++(非生成CIL的C++)相比,前者执行效率上也有优势。下面我通过实例(N体问题的数值解)来比较C#和C++(unmanaged)的运行效率,采用了computer language shootout中的源代码,并做了少量修改,但算法都是一样的。我修改过的代码在下面下载:
C# 源代码文件 nbody.cs
C 源代码文件 nbody.c
C++ 源代码文件 nbody.cpp
编译环境为:
CPU: Pentium 4 3.0Ghz
OS: Windows XP / SP2
Memory: 1G
Compilers:
Visual Studio 08: .NET(3.5), C# 编译器 csc.exe (3.5.21022.8), C++/C 编译器 cl.exe(15.00.21022.08),
Cygwin中的gcc/g++(3.4.4)
另外对C#编译后的.exe的bytecode还可以通过ngen.exe进行预编译为机器码放入Native Image Cache(C:\windows\assembler)中尝试加快执行速度(免去对CIL的JIT时间)。
编译和运行都在cygwin的shell下通过命令行执行,编译命令行和程序执行的时间见下。
C# (csc.exe)
$ csc /o nbody.cs
9.604s, 9.587s, 9.593s, 平均值 9.595s
C# (csc.exe with ngen.exe)
$ csc /o nbody.cs
$ […]

Categories: 程序

kxw2ebook: 科学网博客文章下载导出器

花了一个晚上写了一个Python程序,kxw2ebook,可以把科学网博客上的文章下载为电子书并导出到Wordpress里。因为我对科学网的编辑推荐不感冒,所以写这个程序也算是为科学网的作者提供另一个选择。
下载、源代码、使用说明和FAQ等都放在了google code上
http://code.google.com/p/kxw2ebook/
原理大概是这样的:
1. 首先从博客“所有文章”页面下载所有的文章链接
2. 下载文章
3. 通过正则表达式提取文章的主题内容等写入html和xml文件(wordpress导入时需要用)
通过修改脚本中的正则表达式匹配字符串,这个脚本也可以用于其他的博客系统。
几个比较有趣的地方:
1. 科学网似乎用了一种pager叫AspNetPager,在kxw2ebook试图获得多页数据时必须request如下古怪的post data
__EVENTTARGET=right_1%24AspNetPager1&__EVENTARGUMENT=DDDDDDD&__VIEWSTATE=%2FwEPDwUKMTE5MDI4MTYxNw9kFgIC…
我本来以为通过简单的url参数就可以,后来用firefox的LiveHttpHeaders插件截获浏览器请求才知道javascript的__doPostBack()函数会产生这样的浏览器行为。
2. 用pyinstaller将python脚本“编译”成了在windows可以直接运行无需安装python解释环境的standalone程序,通过UPX进行了压缩,但还是有2.5M,作为一个只有console的程序,尺寸是不是太大了。
3. 在测试期间“发现了”GFW,当程序试图下载下面的页面时,
http://www.sciencenet.cn/blog/user_content.aspx?id=25746
连接被重置。不知道GFW对国内的朋友访问国内网站是否有影响,大家可以试试。
将帖子导出到Wordpress还是比较成功的,但目前还无法导出评论。下面是个导出的例子:
科学网博客上的原址:
http://www.sciencenet.cn/blog/科学网编辑部.htm
导出到wordpress.com的效果
http://kxw2ebook.wordpress.com
导出到72pines.com的效果
http://kxw2ebook.72pines.com
阅读(860 次)Share This

Categories: 程序

Google Application Engine 试用

收到了GAE(Google Application Engine)的邀请函,在其主页上注册了一个帐号,试用了一下。
GAE是google基于其Bigtable和GFS开发的网站开发环境,目前只支持Python语言。GAE的目的主要有两个:
1. 提供一个易于上手的网站开发环境。开发人员不需要自己搭建网络服务器,DNS和数据库等软件,只要使用google提供的API即可用Python开发CGI脚本。
2. 解决网站的可扩展性问题(scalability)。就是当有成千上万甚至数百万每天的用户请求时GAE能根据连接数自动将任务负载均衡到各个计算节点,同时对数据库的存储和操作也可以自动并行化。用户根本无需使用特殊的API即可自动实现可扩展性。由于GAE的实现是基于和Google搜索引擎类似的硬件和软件,网络和节点的维护由google完成,用户无需操心。
这两个想法显然是很前卫的。GAE也是所谓的云计算(cloud computing),它和Amazon EC2的区别在于EC2的用户对节点有绝对的控制权(root),但EC2并不是一个网站开发环境。
我比较喜欢GAE的这些特性:
1. 支持Python。没有哪种语言比Python更容易上手也更容易维护,另外Python的扩展库也非常丰富。
2. GAE SDK中的uploader用起来很简单,而且自带了一个webserver可以让开发人员在本地建立虚拟的GAE环境进行调试。
3. API中有访问者帐号认证的模块,但仅仅限于google account。
4. 数据库的查询命令和SQL很类似。
目前GAE还处于preview release阶段,功能上还有很多不足。下面是我找到的一些缺陷:
1. GAE中的Python版本删除了一些库和库函数。比如不支持写文件和socket编程,不支持C/C++写的extension,很多os库中的函数都不能用了。从安全角度这可以理解。
2. 不支持多线程。
3. API还比较少,文档比较简陋。
4. GAE的后台管理 (console window)很简陋,特别是管理数据库的页面基本上和没有没区别(比如无法通过表单选择某个table中的所有记录然后删除)。
5. 数据库操作的执行效率目前还很差。从一个数据表单中取出5000条记录居然需要3.3秒; 插入100条数据需要3.4秒; 一次删除4000多条数据会超时产生出错网页。
我用GAE写了一个benchmark网站,在这里:
http://benchmarkgae.appspot.com
其中对数据库,网络速度和排序算法进行了测试。还有对Scalability的测试,其中静态存储的可扩展性:
#_of_concurrency speedup
1 1
10 10.0
100 87.2
排序CGI程序的可扩展性:
#_of_concurrency speedup
1 1
10 9.64
100 63.9
前者比后者要好些,但并行程度都较低。
benchmark的源代码可以从上面的网站下载到。
总之,GAE还处于测评阶段,功能欠缺较多,并不适合用来编写较复杂的网站。
阅读(1189 次)Share This

Categories: 程序

Ubuntu 8.04

Ubuntu出了新版本8.04,一个长期支持(LTS, long-term support)的版本,一时间大家争先恐后去下载,以至于Ubuntu的主页都瘫了,us.archive的源也暂时无法连上。

图:从Update Manager处更新至8.04
这次更新的包不少,我的机器上有1273个包要更新,花了大约4个多小时。升级比较大的变化有
1. Firefox更新到了3.0beta5, 启动速度明显加快,不过以前在2.0下的几乎所有插件都不能用了
2. 新版本捆绑了新的Searching and indexing的工具trackerd,不过刚启动就直接crash了
3. Kernel 更新到了2.6.24, Python 更新到了2.5.2
4. gnome-terminal 的字体显示有一个bug尚未解决,就是无论在System->Preferences->Appearance中如何修改自己的hinting,gnome-terminal的字体显示总是一样的模糊,看得时间长眼睛都绿了。从这个网页找到了解决方法
$ cd /etc/fonts/conf.d
$ sudo rm 10-hinting-medium.conf
$ sudo ln -s ../conf.avail/10-hinting-full.conf
另外,还很土星地发现了WenQuanYi的zenhei矢量字体包,效果不错:
$ sudo apt-get install ttf-wqy-zenhei

除了上述变化,其他方面的改变几乎感觉不出来。
阅读(920 次)Share This

Categories: 程序

Close
E-mail It