问题起源来自这个帖子:
作者: admin
-
Windows桌面开发者的必备软件
如果你新安装好了一台WindowsXP或者Windows7的机器,作为一个开发人员,我建议安装下面这些软件:
1,WinMerge.
2, Lua for windows,或者Python或者Ruby,选择一个你喜欢的脚本语言。LuaForWindows还自带了一个Scite编辑器,节省了找一个程序员相关编辑器的步骤。
http://luaforwindows.luaforge.net/
3,7-zip,不需要安装winzip或者winrar了
4,Sysinternals套件,windows开发必备。
http://technet.microsoft.com/en-us/sysinternals/default.aspx
5,Windbg,windows调试必备。
http://www.microsoft.com/whdc/Devtools/Debugging/default.mspx
6,FileZilla,开源的ftp软件。
7,Visual Studio2008 express,微软系的同学必须要的。当然,你应该很容易搞到更高级的版本。如果不玩dotnet那些,可以下载个VC++6.0,足够用了。
http://www.microsoft.com/express/Downloads/#webInstall
Java系的朋友,自有选择,不多废话。
8,Debug Diagnostic Tool,检查memory leak很好用。
9,bitnami stacks,如果你搞什么php,ruby,python,mysql之类的web开发,这里面的集成安装包必有一款适合你。不想安装的还可以下载vmware镜像文件。
10,daemon-tools,虚拟光驱软件。
11,文本编辑器,notepad++或者gVim都不错。
12,SSH软件推荐putty,破墙必备。
http://portableapps.com/apps/internet/putty_portable
13,VNC类的软件可以用这个
http://portableapps.com/apps/utilities/teamviewer_portable
也可以用QQ或者netmeeting之类的,也是必备。
14,Picpick,抓屏软件,非常推荐。
15,版本管理工具,可以用subversion或者git。github算是个不错的选择。我经常把小代码片段贴到gist中。其中visualsvn有免费服务器程序下载。
http://github.com/guides/using-git-and-github-for-the-windows-for-newbies
16,如果搞网络相关开发,可以下载抓包工具wireshark(原名ethereal)。
http也可以试试这个软件
http://www.fiddler2.com/fiddler2/
17,VMWare虚拟机,最好搞一个,里面装上Debian,玩玩Linux,另外装个干净的windowsXP,压缩起来备用,测试中经常会用到。
-
Lua程序设计(第二版)阅读笔记
很有意思的是,下面的代码是有效地,我也是看了书才知道。代码后面可以跟着,也可以不跟分号。
1: a = 5 b = 6
2: c = 7; d = 8;
3: print(a, b, c, d)
Lua中,什么是字母依赖于locale的设置,也就是中文环境下,中文可以用作变量名(?这个需验证)
Lua有大小写之分。
常用的块注释方式是–[[然后以–]]结尾,这样如果想取消块注释,就把开头多加个-就行了。
LUA_INIT内容为@文件名,解释器会先执行这个文件(?需验证)。
Lua中的(以后省略)函数为第一类值,比如print = type; print(a); 这个是合法合理的,但是print就没有了,一般用于沙箱sandbox操作。
条件判断只有两种情况为假,false以及nil。其余都为真。
number是实数(通常下)。用双精度代表整数,只要这个数字不大于10的14次方就没问题(本书这里笔误为1014,shit,我对照了PIL第一版确认的)。重新编译数字类型可以方便用于其它平台luaconf.h。数字可以写作4.57e-3 0.3e12 5e+20这种科学计数法。
Lua可以存储任意二进制字符到字符串类型中。5.1支持的长括号写法[===[匹配]===],只要等号数量移植。字符串与数字运算,数字会转成字符串,可以用tonumber把字符变成数字。
1: local str = "5e+20"
2: local num = tonumber(str)
3: print(num)
数字转成字符,可以用tostring或者让数字与空字符串连接。
5.1的字符串支持#。
local a = {}创建了一个table,并且让a引用这个table,通过a这个变量我们可以操作这个table,如果没有变量继续引用这个table(a = nil),Lua会负责回收内存销毁它。
a["nameX“] = 5 等价于 a.nameX = 5,注意key里面的引号。local a = {}; a[x] = 5这个代码是不合法的。local a = {}; a["x"] = 5; print(a.x);这个会打印出5。
长度操作#的常用做法,print(a[#a])打印最后一个(因为Lua的table索引从1开始),a[#a +1] = n常用与自增,a[#a] = nil删除最后一个。
注意当table中有空洞(数字索引不连续,或者某个值为nil)的时候,#操作未必得到正确值。
5.1新增%取模操作。a % b == a – floor(a / b) * b,结果符号永远与第二个参数相同。print(5 % -2)得到-1,print(-5 % 2)得到1。另外取模操作可以用于对实数取整数部分或者小数部分。x = math.pi; x – x % 0.01 是让x精确到小数点后2位。x % 1 取小数部分,x – x % 1 取到整数部分。
table,userdata以及function,比较引用。
and与or都是用短路求值。 x = x or v常用于默认值设置。
Lua中的字符串是不可变值immutable value,两个字符串链接,会返会一个新的字符串。
链表写法:
1: list = nil
2: for line in io.lines() do
3: list = {next = list, value = line}
4: end
local a = { [-1] = 3, ["3"] = 5, ["n"] = "bbb"};
print(a[-1]); print(a["3"]); print(a.n);比较有意思的是a["3"]没法写成a.3。
a = {x = 0, y = 0} 相当于a = {["x"] = 0, ["y"] = 0}的语法特例。
local a = { [-1] = 3; ["3"] = 5; ["n"] = "bbb"};这样写也是合法的,构造式可以用分号代替逗号。
第四章
x, y = y, x交互x与y的值。
可以用do-end控制局部变量的范围。
local print = print,相当于定义了一个局部变量print(函数),后面如果使用print,就是访问了这个局部变量。访问局部变量要比访问全局变量快。
while x do .. end,当x为真值时进入while;repeat .. until x,当x为真值的时候结束循环。这点我弄混过。
-
选书之美与购书之道
什么什么之美与什么什么之道现在简直是有些烂大街了,
就好像“寂寞”之于春晚,美和道这两个词能让计算机书商用上三四年没问题,
比如《代码之美》与《代码之道》我都买了,可是都没看完,如果用豆瓣打分也就是三星,可以读读。我承认,这两本书买了有些后悔。好了,想说什么问题呢?怎么也要表达一些中心思想吧,
没错,“选书跟买电脑一样,不要在刚出来的时候就买,至少等一两个月“
这就是我的选书之美,美不美?比如《代码之美》这本书的内容简介(from china-pub):
本书介绍了人类在一个奋斗领域中的创造性和灵活性:计算机系统的开发领域。在每章中的漂亮代码都是来自独特解决方案的发现,而这种发现是来源于作者超越既定边界的远见卓识,并且识别出被多数人忽视的需求以及找出令人叹为观止的问题解决方案。
本书33章,有38位作者,每位作者贡献一章。每位作者都将自己心目中对于“美丽的代码”的认识浓缩在一章当中,张力十足。38位大牛,每个人对代码之美都有自己独特的认识,现在一览无余的放在一起,对于热爱程序的每个人都不啻一场盛宴。虽然本书的涉猎范围很广,但也只能代表一小部分在这个软件开发这个最令人兴奋领域所发生的事情。太牛逼了,简直是无以伦比的文案,可实质上,这本书就是一部散文集罢了。
另外《代码之道》这本书,不知是不是我境界太低,读起来真是费劲啊,看了几张就丢一边了。如果你在书刚刚发布的几天购买,会发现星星的评分真是高,编辑、作者一个劲推荐,也有一些名牛人使劲推(我不认识这些名牛人,无法评价他们是不是真的看了),让你感觉不买就买不到了(新楼盘?)。过了几周,你会发现一些”不和谐“的声音慢慢出现了,这其实才是真正的读者开始慢慢浮现。我们排除敌对出版社的打击,里面还是有不少值得借鉴的意见和观点。
OK,还有另外一半,就是购书之道。前面有同学在TL提问买什么书好,我的建议很简单,
不要买带“美”和“道”的书,太玄了,编程就是编程,扯什么大道至简、负负得正的有什么意思?是不是联系上道家思想,编程就会变得清新空灵?(请去豆瓣搜“小清新”小组)好了,我瞎掰完了。
-
一个有趣的代码问题
OldNewThing发布了一篇很有意思的文章http://blogs.msdn.com/oldnewthing/archive/2010/01/20/9950638.aspx
The wrong way to determine the size of a buffer
A colleague of mine showed me some code from a back-end program on a web server. Fortunately, the company that wrote this is out of business. Or at least I hope they’re out of business!
size = 16384;
while (size && IsBadReadPtr(buffer, size))
{ size--; }
高人就是高人,这个代码其实还是需要好好想一想才能明白为何有问题。
IsBadReadPtr的意思是尝试去读一个不属于自己进程的内存地址,因为指针越界在大多数情况下都是代表错误发生。但是这个函数实际上并不是那么好用,具体原因可以看OldNewThing的这篇文章http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx 介绍的非常详细。
回到这个问题上,在OldNewThing的文章中介绍的非常清楚“But guard page exceptions are raised only once.”,也就是说,IsBadReadPtr将只会有效一次(?need to double check),这个代码逻辑就是有问题的。
再把其中包含的问题列一下,主要参考了文章后的留言。
1)16384这个16K大小来的莫名其妙,当然不排除在某些特定软件设计中,最大就是这个大小。
2)第二个问题,IsBadReadPtr并不是那么好用。
3)这个计算得到的值未必正确。
那么我们该如何获取buffer的大小呢?
在c-faq中告诉我们,通常情况下是没有解决办法的,只能自己保存这个buffer大小。办法也很简单,我们需要申请的时候就把buffer大小记住,需要知道的时候,查找一下就知道了,或者是使用某种数据结构,把buffer的大小以及其他信息放在开头固定的一块大小就行了。
如果是windows,那么有一些特定的办法。可以用_msize来获得malloc申请的buffer。
allocated with LocalAlloc, use LocalSize. For HeapAlloc, use HeapSize. For GlobalAlloc, use GlobalSize,如果使用CoTaskMemalloc,可以先用CoGetMalloc拿到一个IMalloc接口,然后调用GetSize()
这些函数到底好用不好用,还是得靠你自己多测试。最简单牢靠的办法还是自己保存这个size信息。