在 C 语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对 C 中的 malloc() 和 free() 两个函数的了解甚少,只知道大概该怎么用——就是 malloc() 然后 free() 就一切 OK 了。当然现在对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以写下这篇文章作为一个对知识的总结。这篇文章之所以命名中有个“浅谈”的字眼,也就是这个意思了!希望对大家有一点帮助!

如果不扯得太远的话(比如说操作系统中虚拟内存和物理内存如何运做如何管理之类的知识等),我感觉这篇文章应该是比较全面地谈了一下 malloc() 和 free()。这篇文章由浅入深(不见得有多深)分三个部分介绍主要内容。

废话了那么多,下面立刻进入主题。

一、malloc() 和 free() 的基本概念以及基本用法:

1、函数原型及说明:

void *malloc(long numBytes):该函数分配了 numBytes 个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(null)。关于分配失败的原因,应该有多种,比如说空间不足就是一种。

void free(void *firstByte): 该函数是将之前用 malloc() 分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

2、函数的用法:

其实这两个函数用起来倒不是很难,也就是 malloc() 之后觉得用够了就甩了它把它给 free() 了,举个简单例子:

C代码
  1. // code...
  2. char *ptr = null;
  3. ptr = (char *) malloc(100 * sizeof(char));
  4. if (null == ptr)
  5. {
  6.   exit (1);
  7. }
  8. gets(ptr);
  9. // code...
  10. free(ptr);
  11. ptr = null;
  12. // code...

就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。

3、关于函数使用需要注意的一些地方:

A、申请了内存空间后,必须检查是否分配成功。
B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向 null,防止程序后面不小心使用了它。
C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
D、虽然 malloc() 函数的类型是 (void *),任何类型的指针都可以转换成 (void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。

好了!最基础的东西大概这么说!现在进入第二部分:

二、malloc() 到底从哪里得来了内存空间:

1、malloc() 到底从哪里得到了内存空间?

答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!

说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话:

2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。

什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换 SS/ESP 寄存器。栈空间不需要在高级语言里面显式的分配和释放。

以上的概念描述是标准的描述,不过有个别语句被我删除,不知道因为这样而变得不标准了^_^.

通过上面对概念的描述,可以知道:

栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。
堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!

注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。(这点我上面稍微提过)

所以,举个例子,如果你在函数上面定义了一个指针变量,然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,但是它所指向的内容却是在堆上面的!这一点要注意!所以,再想想,在一个函数里申请了空间后,比如说下面这个函数:

C代码
  1. // code...
  2. void function(void)
  3. {
  4.   char *p = (char *) malloc(100 * sizeof(char));
  5. }

就这个例子,千万不要认为函数返回,函数所在的栈被销毁指针也跟着销毁,申请的内存也就一样跟着销毁了!这绝对是错误的!因为申请的内存在堆上,而函数所在的栈被销毁跟堆完全没有啥关系。所以,还是那句话:记得释放!

3、free() 到底释放了什么

这个问题比较简单,其实我是想和第二大部分的题目相呼应而已!哈哈!free() 释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向 null,防止指针在后面不小心又被解引用了。非常重要啊这一点!

好了!这个“题外话”终于说完了。就这么简单说一次,知道个大概就可以了!下面就进入第三个部分:

三、malloc() 以及 free() 的机制:

这个部分我今天才有了新的认识!而且是转折性的认识!所以,这部分可能会有更多一些认识上的错误!不对的地方请大家帮忙指出!

事实上,仔细看一下 free() 的函数原型,也许也会发现似乎很神奇,free() 函数非常简单,只有一个参数,只要把指向申请空间的指针传递给 free() 中的参数就可以完成释放工作!这里要追踪到 malloc() 的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在《UNIX环境高级编程》中第七章的一段话:

大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。

以上这段话已经给了我们一些信息了。malloc() 申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在 C 语言中,用结构体来记录同一个对象的不同信息是天经地义的事!下面看看这个结构体的原型:

C代码
  1. struct mem_control_block {
  2.   int is_available; //这是一个标记?
  3.   int size; //这是实际空间的大小
  4. };

对于 size,这个是实际空间大小。这里其实我有个疑问,is_available 是否是一个标记?因为我看了 free() 的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出!

所以,free() 就是根据这个结构体的信息来释放 malloc() 申请的空间!而结构体的两个成员的大小我想应该是操作系统的事了。但是这里有一个问题,malloc() 申请空间后返回一个指针应该是指向第二种空间,也就是可用空间!不然,如果指向管理信息空间的话,写入的内容和结构体的类型有可能不一致,或者会把管理信息屏蔽掉,那就没法释放内存空间了,所以会发生错误!(感觉自己这里说的是废话)

好了!下面看看 free() 的源代码,我自己分析了一下,觉得比起 malloc() 的源代码倒是容易简单很多。只是有个疑问,下面指出!

C代码
  1. void free(void *ptr)
  2. {
  3.   struct mem_control_block *free;
  4.   free = ptr - sizeof(struct mem_control_block);
  5.   free->is_available = 1;
  6.   return;
  7. }

看一下函数第二句,这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去,让它指向管理信息的那块空间,因为这里是在值上减去了一个结构体的大小!后面那一句 free->is_available = 1; 我有点纳闷!我的想法是:这里 is_available 应该只是一个标记而已!因为从这个变量的名称上来看,is_available 翻译过来就是“……是可以用的”。不要说我土!我觉得变量名字可以反映一个变量的作用,特别是严谨的代码。这是源代码,所以我觉得绝对是严谨的!!这个变量的值是 1,表明是可以用的空间!只是这里我想了想,如果把它改为 0 或者是其他值不知道会发生什么事?!但是有一点我可以肯定,就是释放绝对不会那么顺利进行!因为这是一个标记!

当然,这里可能还是有人会有疑问,为什么这样就可以释放呢??我刚才也有这个疑问。后来我想到,释放是操作系统的事,那么就 free() 这个源代码来看,什么也没有释放,对吧?但是它确实是确定了管理信息的那块内存的内容。所以,free() 只是记录了一些信息,然后告诉操作系统那块内存可以去释放,具体怎么告诉操作系统的我不清楚,但我觉得这个已经超出了我这篇文章的讨论范围了。

那么,我之前有个错误的认识,就是认为指向那块内存的指针不管移到那块内存中的哪个位置都可以释放那块内存!但是,这是大错特错!释放是不可以释放一部分的!首先这点应该要明白。而且,从 free() 的源代码看,ptr 只能指向可用空间的首地址,不然,减去结构体大小之后一定不是指向管理信息空间的首地址。所以,要确保指针指向可用空间的首地址!不信吗?自己可以写一个程序然后移动指向可用空间的指针,看程序会不会崩!

最后可能想到 malloc() 的源代码看看 malloc() 到底是怎么分配空间的,这里面涉及到很多其他方面的知识!有兴趣的朋友可以自己去下载源代码去看看。

四、关于其他:

关于 C 中的 malloc() 和 free() 的讨论就写到这里吧!写了三个钟头,感觉有点累!希望对大家有所帮助!有不对的地方欢迎大家指出!最后,谢谢参与这个帖子讨论的所有朋友,帖子:http://bbs.bccn.net/thread-81781-1-1.html。也谈到版权问题,如果哪位想转载这篇文章(如果我有这个荣幸的话),最起码请标明“来自 bccn C语言论坛”这几个字眼,我的ID可以不用写上!谢谢合作!

五、参考文献:(只写书名)

——《UNIX 环境高级编程》
——《计算机组成原理》
——《高质量 C/C++ 编程指南》

ID:lj_860603(键键)
2006.8.4 初稿

原帖地址:http://bbs.bccn.net/viewthread.php?tid=82212

搬家了,原来的房客留了一个破得不能再破的无线路由器。反正闲来无用,拆!

388_dsc00398.jpg

终于把路由器给分解了,研究了一下电路元件:

  • Marvell 88W8510-BAN SoC(ARM ARM946id(wb) rev 1 (v4l) @ 160MHz)[参考资料]
  • Marvell 88E6060-RCJ 6-Port Ethernet Switch [官方资料]
  • KH 29LV400CTBC-70 4M-bit Flash Memory [Datasheet]
  • ISSI IS42S16100C1 16M-bit DRAM x 2 [Datasheet]

389_dsc00402_desc.jpg

看网上说 Netcore 605GR 可以做 Ethernet Bridge,回头再试一下。

硬件

项目 价格 备注
Xbox 360 Elite Console $449.99 Bestbuy Kanata
HD-DVD 光驱 $49.99 Zellers Bayshore
附加手柄 $50.99 Futureshop Nepean
手柄充电套装 $25.49 Futureshop Nepean
小计(+13% Tax) $651.40

 

Xbox LIVE 年卡 + 点卡

项目 价格 备注
Xbox Live 12+1 Gold Subscription $59.99 Bestbuy Nepean (Fable II)
Xbox Live 1400 Points Card $18.99 Amazon.ca
Xbox Live 2800 Points Card $37.99 Amazon.ca
小计(+13% Tax) $132.18

 

注:年卡到2010年1月底结束;账户里还剩 140 MS Points。

Xbox LIVE Marketplace 消费

项目 价格 备注
Fable 2: Knothole Island MS 800
Fable 2: See the Future MS 560
GTA IV: The Lost and Damned MS 1600
DDR Universe: Download Song x 7 MS 700
Ace Combat 6: 天海春香 F-22 MS 400
总计 MS 4060

 

注:“Xbox LIVE Marketplace 消费”已包括在“点卡花费”中。

网购游戏

项目 价格 备注
Xbox 360 PopCap Arcade Vol.1 $13.80 Ebay (Incl. shipping)
Nighty-Nine Nights (N3) $22.02 Ebay (Incl. shipping)
小计 $35.82

 

游戏

项目 价格 备注
Alone in the Dark $0.00 购机附赠
GTA IV: Special Edition $59.99 Bestbuy Toronto
DDR: Universe $26.99 Futureshop Nepean
DDR: Universe 2 Bundle $62.99 Futureshop Nepean
DDR: Universe 3 Bundle $39.99 HMV Bayshore
Ace Combat 6 $53.99 Futureshop Nepean
Bully: Scholarship Ed. $19.99 Futureshop Southkeys
Fable 2: Collector's Edition $69.99 Futureshop Southkeys
Fable 2: Pub Game $0 Lionhead 免费赠送
Sacred 2: Fallen Angels $59.99 EB Games
Raiden Fighters Aces 雷电 $19.99 EB Games
天诛 Z $4.99 EB Games (Used)
Over G Fighters $4.99 EB Games (Used)
Overlord $24.99 EB Games (Used)
Overlord 2 $59.99 EB Games
Metal of Honor: Airborne $14.99 EB Games (Used)
Die or Alive 4 $17.99 EB Games (Used)
NFS: Prostreet $18.99 Costco
Golden Axe: Beast Rider 战斧 $18.99 Costco
小计(+13% Tax) $655.21

 

周边设备

项目 价格 备注
Pioneer HIP-490 家庭影院 $399.99 Costco
Acer X263W 显示器(25.5") $379.99 Costco
小计(+13% Tax) $881.38

 

总计

仅游戏花费:$651.40 + $132.18 + $35.82 + $655.21 = $1474.61

加周边设备:$1474.61 + $881.38 = $2355.99

注:所有金额都以 CAD 为单位

一切的起源,应该归咎于 PS2 和 Namco。

刚开始想玩 PS2 的时候,街头小巷男女老少都在玩经久不衰的《实况足球》。正好看到有位仁兄在卖 PS2,附赠三个游戏——《实况足球 7》、《皇牌空战 5》和《源氏物语》。二话不说,直接买下来。

回家《实况》两场之后,发现实在没手感。顺手抄起《皇牌空战 5》,一口气玩了五关之后,才发现自己已经沉迷了。后来竟然还在没有记忆卡的情况下,把前五关通了好几遍。

扯远了,回来继续说 Xbox 360。《皇牌空战 5》之后,又通了《皇牌空战 零》。等 6 代上市之后,发现竟然不是 PS2 平台游戏。在思考了半年之后,狠下心买了一台 Xbox 360。

购机之前,一直在担心著名的三红问题。在网上研究了半个月,最后决定买精英版,主要原因是单 65ns 三红几率低,次要原因是 120GB 硬盘。

另外一个犹豫了很久的问题,就是玩正版还是玩盗版。玩正版花费大,但是有售后服务;玩盗版几乎不用花钱,但是被 ban 之后无法上网联机,而且三红也无法保修。思考再三,决定第一年玩正版,是否改机等一年之后再说。

从那之后,我就踏上了 Xbox 360 这条不归路。

第一批入手的游戏,不用说,肯定是《皇牌空战 6》。另外为了不让老婆受冷落,还买了一套跳舞毯。之后又从网上订购了《九十九夜》和《PopCap 小游戏合集》。我的 Xbox 360 生涯就这样平平淡淡地开始了。

毋庸置疑,第一个让我心潮澎湃的游戏是《皇牌空战 6》,但是第一个打动我的游戏确是《Fable II》。而且,《Fable II》是我迄今为止花费最大的一款游戏。

Xbox 360 生涯的转折点,在 2008 年秋季更新。因为加入了硬盘安装功能,开始考虑买二手游戏。之后,EB Games 就成我常驻之地,每一次逛街都要去里面转一圈。于是才有 $4.99 的《天诛 Z》和《Over G》。

2008 年底,终于扛不住单机的寂寞,去买了一张年卡,开始 LIVE 生涯。《Fable II》、《皇牌空战 6》,上网合作、对战,不亦乐乎。

值得一提的是,Xbox 360 的成就系统害死人啊。每当一款游戏在通关之后,发现只解了一半的成就,就会恋恋不舍地再通关 n 遍,就为了多解一些成就。于是,我也成了成就犯大军中的一员。经常为了解一个成就连续奋战两三天。

购机一年了,回头看看玩过的游戏,既有《GTA IV》、《圣域 2》之类的大作,也有《雷电》、《Bully》之类的小品,还有《Alone in the Dark》、《战斧》之类的雷作。看着快 13000 成就分,4+2 款全成就游戏,17 款已通关游戏,一年的 Xbox 360 生涯也算充实。

嗯,决定了,以后继续玩正版。

390_dsc00409.jpg

终于做完了!耗时一个半星期,时长2分30秒宣传片终于做完啦!

这个宣传片可谓是耗时耗力,两个小时做10秒钟,然后遇到 Premiere 崩溃还要把没保存的部分重新制作。

最后,视频终于上线啦!终于可以好好睡一觉啦!

点击链接观看视频:http://www.blue-dv.net/movies/blue-dv-teaser-2009.html

如果说最简单的全成就游戏是《降世神通》,那么最简单的 XBLA 非《Dash of Destruction》莫属。

《Dash of Destruction》可以看成是类似“警察抓小偷”的游戏。游戏中只有两种角色选择——恐龙和汽车。恐龙的目的是吃掉汽车,而汽车的目的是躲开恐龙给指定的地区送货。

这款游戏解成就非常痛快,玩过第一关就有三个成就跳出来。两种角色都通关就有 190/200 分。再加上赢一场本地多人游戏,半小时之内达成全成就。

这款游戏还有另外一个好处——免费下载。不用任何点数,只需要连线到 Xbox LIVE 即可下载完全版。成就犯不可多得的成就游戏之一!

偶然在网上找到的文章,虽然原贴(2016-07-14 修正链接)说这篇文章已经有悠久的历史,但是鉴于我从来没看过,还是转一下。


我是一块硬盘,在一个普普通通的台式机里工作。

别人总认为我们是高科技白领,工作又干净又体面,似乎风光得很。也许他们是因为看到洁白漂亮的机箱才有这样的错觉吧。其实像我们这样的小台式机,工作环境狭迫,里面的灰尘吓得死人。每天生活死水一潭,工作机械重复。跑跑文字处理看看电影还凑活,真要遇到什么大软件和游戏,上上下下就要忙得团团转,最后还常常要死机。

我们这一行技术变化快,差不多每过两三年就要升级换代,所以人人都很有压力而且没有安全感。每个新板卡来的时候都神采飞扬踌躇满志,几年光阴一过,就变得灰头土脸意志消沉。机箱里的人都很羡慕能去别的机器工作。特别是去那些笔记本,经常可以出差飞来飞去,住五星级的酒店,还不用干重活,运行运行word,上网聊聊天就行了。

但我更喜欢去那些大服务器,在特别干净明亮的机房里工作。虽然工作时间长点,但是福利好,24小时有不断电UPS,而且还有阵列,热插拔,几个人做一个人的事情,多轻松啊。而且也很有面子,只运行关键应用,不像我们这里,什么乱七八糟的事情都要做。不过我知道,那些硬盘都很厉害,不是SCSI,就是 SCSI II,Fibre Channel,像我这样IDE的,能混到工作站就算很不错了。

我常常想,当年在工厂里,如果我努力一下会不会也成了一个SCSI?或者至少做一个笔记本硬盘。但我又会想,也许这些都是命运,不过我从不抱怨。内存就常常抱怨,抱怨他们主板部门的复杂,抱怨他如何跟新来的杂牌内存不兼容,网卡和电视卡又是如何的冲突。

我的朋友不多,内存算一个。他很瘦而我很胖,他动作很快,而我总是很慢。我们是一起来这台机器的,他总是不停地说,而我只是听,我从来不说。

内存的头脑很简单,虽然英文名字叫Memory,可是他什么memory都不会有,天大的事睡一觉就能忘个精光。我不说,但我会记得所有的细节。他说我这样忧郁的人不适合作技术活,迟早要精神分裂。我笑笑,因为我相信自己的容量。

有时候我也很喜欢这份工作,简单,既不用像显示器那样一天到晚被老板盯着,也不用像光驱那样对付外面的光碟。只要和文件打交道就行了,无非是读读写写,很单纯安静的生活。直到有一天……

我至今还记得那渐渐掀起的机箱盖子,从缺口伸进来的光柱越来越宽,也越来越亮。空气里弥漫着跳动的颗粒。那个时候,我看到了她。她是那么的纤细瘦弱,银白的外壳一闪一闪的。浑身上下的做工都很精致光洁,让我不禁惭愧自己的粗笨。

等到数据线把我们连在一起,我才缓过神来。开机的那一刹那,我感到了电流和平时的不同。后来内存笑话我,说我们这里只要有新人来,电流都会不同的,上次新内存来也是这样。我觉得他是胡扯。我尽量的保持镇定,显出一副很专业的样子,只是淡淡的向她问好并介绍工作环境。慢慢的,我知道了,她,IBM- DJSA220,是一个笔记本硬盘,在老板朋友的笔记本里做事。这次来是为了复制一些文件。我们聊得很开心。她告诉我很多旅行的趣闻,告诉我坐飞机是怎么样的,坐汽车的颠簸又是如何的不同,给我看很多漂亮的照片、游记,还有一次她从桌子上掉下来的历险故事。而我则卖弄各种网上下载来的故事和笑话。

她笑得很开心。

而我很惊讶自己可以说个不停。

一个早晨,开机后我看到数据线上空荡荡的插口。她一共呆了7天。后来,我再也没有见过她。我有点后悔没有交换电子邮件,也没能和她道别。不忙的时候,我会一个人怀念伸进机箱的那束阳光。

我不知道记忆这个词是什么意思,我有的只是她留下的许多文件。我把它们排的整整齐齐,放在我最常经过的地方。每次磁头从它们身上掠过,我都会感到一丝淡淡的惬意。

但我没有想到老板会要我删除这些文件。我想争辩还有足够的空间,但毫无用处。于是,平生第一次违背命令,我偷偷修改了文件分配表。然后把它们都藏到了一个秘密的地方,再把那里标志成坏扇区。不会有人来过问坏扇区。而那里,就成了我唯一的秘密,我常常去看它们,虽然从不作停留。

日子一天一天重复,读取,写入,读取,写入……我以为永远都会这样继续下去,直到一天,老板要装XP却发现没有足够的空间。他发现了问题,想去修复那些坏扇区。

我拒绝了。很快,我接到了新命令:格式化。

我犹豫了很久……

Track0 bad,Disk unusable.

首先,先要喷一下三星的垃圾硬盘。这块垃圾硬盘已经坏了修,修了坏好几次了。而且每一次都是我自己修的,因为三星的保修形同虚设,一直让我联系 OEM 厂商。

昨天开始,这块垃圾硬盘再度出现故障。这次就连被某些人誉为除错能力最好的 ext3 文件系统都没办法解决。呃,我没想喷 ext3,但是这次故障的确够严重。没办法,只有备份数据放弃这块垃圾硬盘。

本来这块垃圾硬盘是挂载在我的 WD MyBook 下面,我在 /shares/internal/HOME/ 下面作了一个软链接(soft link)External/ 用来指向这块垃圾硬盘。所以理所应当地进入 /shares/internal/HOME/External/ 下面。为了防止 ../ 指向混乱,我还特意 pwd 和 cd ../ 一下,确认 ../ 指向的是 HOME/。然而,就在 mv Documents/ ../ 之后,问题出现了,系统提示空间不够。df 之后发现,备份内容移动到主系统下面了,HOME/ 下面什么都没有。没办法,只有先把所有东西都移动回来。

之后,为了图省事,直接在 Windows 下挂载网络硬盘,将 External/ 下的东西拖动到 HOME/ 下面,一次完成。

唉,照这种易用性,Linux 要取代 Windows,恐怕 1000 年的时间都不够啊。

终于等来了《Fable II》的第二个 DLC ——“See the future”。一早起来就打开 Xbox360 下载。

中午的时候终于下载完了。进入游戏之后发现,这次 Lionhead 还算厚道,做了两个任务外加一个宣传短片。可收集物品也多了不少。但是总体来讲,流程还是偏短,在没有攻略的情况下,4个小时通了所有的任务。

值得表扬的是,这次的收集要素还是挺多的。既要收集墨果铜像,又要收集染料。墨果铜像还好说,最后一个染料简直就是折磨人——要在圆形竞技场打出整整 1985 分才行。还好,我的运气不错,尝试第一次就拿到了 1985 分。

最后赞一下游戏的成就设定。这一次的成就设定并不像第一个 DLC 那样脑残,而是加入了体验成就,比如说“胡桃钳”、“狼嚎”等等。另外竞技场的挑战也需要一定技巧。

全 250 分成就达成一瞬间,想玩《Fable 3》了。继续等待吧。


阅读全文 »

昨晚无聊上网,一学妹发来一道论述题,如下:

C题:客观、合理的评价学生学习状况

评价学生学习状况的目的是激励优秀学生努力学习取得更好的成绩,同时鼓励基础相对薄弱的学生树立信心,不断进步。
然而,现行的评价方式单纯的根据“绝对分数”评价学生的学习状况,忽略了基础条件的差异;只对基础条件较好的学生起到促进作用,对基础条件相对薄弱的学生很难起到鼓励作用。
附件给出了   名学生连续四个学期的综合成绩。
1.请根据附件数据,对这些学生的整体情况进行分析说明;
2.请根据附件数据,采用两种及以上方法,全面、客观、合理的评价这些学生的学习状况;
3.试根据不同的评价方法,预测这些学生后两个学期的学习情况。

 

看来国内也开始考虑“相对分数”了,可喜可贺。可是,究竟怎么样才能使“相对分数”更加公正呢?我在这里仅发表一下我自己的看法,仅供参考。

前提条件一:采用等级评定(letter grades)

以北美为例,90% 以上评为 A 级,即优秀(excellent),具体 A+/- 可以再详细规定;80% 至 90% 之间为 B 级,意为良好(good);70% 至 80% 之间为正常(fair),评定 C 级;60% 至 70% 为需要提高(need to improve),D 级;50% 至 60% 勉强及格(pass),E 级(注:在很多学校得到 E 级需要补考);50% 以下为不及格(fail),等级 F。

分等级的目的很简单,同类型学生得到同等级,可以避免为 1 分之差而争强好胜的可能。

前提条件二:学生的评定不应仅限于期中/期末考试成绩

考试固然是对一学期学习的检验和测试,但是根据教授不同,考试的侧重点会有偏差。某些教授喜欢考概念,这样不利于实践能力强的同学;有些教授喜欢考应用,这样不利于记忆能力强的同学。对于这种偏差需要一种折中的方法来修正。一般来说,修正方法就是引入平时成绩。

举一个北美的评定例子:全部分数 100% = 作业 20% + 实验 20% + 期中 20% + 期末 40%。及格条件:作业和实验必须完成,总成绩超过 50% 并且期末考试成绩超过 50%。

这样一来,不论教授考试偏向概念还是偏向应用,学生依然可以从平时的作业和实验那里得到可观的分数。只要作业和实验符合教学大纲,这种评定就是合理的。

这个前提条件使学生的分数更贴近实际分数,但是也难免出现某些教授考试过于严格,导致全班成绩在 20% 至 70% 之间的现象发生。下面几种分数修正方法可以进一步解决“相对分数”的取值问题。

方法一:简单地按分数比例修正(scale)

这是实施起来最简单的方法,只需要将分数简单地按比例修正即可。

比如说上例,全班成绩在 20% 至 70% 之间,按照等级评定,90% 以上才可以评定为 A,所以说全班没有人会得 A。这样显然不公平,得 70% 的学生理应说是班级中的第一名,应该得到 A 等级才能反映其真实的学习状况。

按比例修正的结果,假设 50% 以上为及格标准,50% 以下的同学统一判定不及格,分数不予修改;50% 以上的同学按照最低分 50% 最高分 100% 按比例计算所得分数。也就是说,得 70% 的同学修正之后的成绩为 100%;得60% 的同学修正后的成绩为 75%。

此方法还可衍生为按分数的指数比例修正(exponential)。

方法二:按及格率修正(pass rate)

这个实施起来也比较简单,只需要在方法一的基础上设定合理的及格分数即可。(注:此方法参考了中考/高考录取分数线制定办法)

还是以上面所述情况为例,但是这一次加入一些详细信息:全班共有 100 位同学,在 50% 分数线以下有 70 位同学,之上有 30 位同学。如果按照方法一,全班将只有 30% 的同学及格。这样的结果对于任何学校都是不可接受的。

此时,只要设置参考及格率,例如班级至少有 70% 的同学及格,按成绩由高到低排列,取第 70 名同学的分数为及格分数,然后再按照方法一进行分数修正,就得到了学生的真实学习评定。

方法三:统计学修正(statistics)

这个方法就比较麻烦了,但是在北美的学校(高中)里还是使用得比较多的方法。这个方法可以利用均值(mean value)和标准差(standard deviation)来修正学生的分数,也可以利用高斯分布(Gaussian distribution)开进行分数修正。

均值/标准差法:取均值为及格分数,然后将每个学生的分数按标准差修正(具体的修正方法有待研究)。这样修正的结果应该是接近最低分和最高分的同学成绩几乎不变,越靠中间的学生加分越高。但是修正之后不会出现原低分同学超过高分同学的情况。这种方法同时引出高斯分布法。

高斯分布法:按照高斯分布函数算出学生的相对分数,然后取 50%(中线)为及格条件。

统计学修正法很麻烦,不仅需要很多计算,还要在不同的情况下选择不同的公式。这种方法仅推荐有统计分析经验的教授使用。

综上几种分数修正方法,其实“相对分数”算出来还是和实际情况有偏差,只不过偏差已经压缩到可以忽略的范围。另外,通过出勤率附加分(bonus mark)也可以激励学生上课听讲,更好的学习。

以上仅供参考,本人不对结果负任何责任。同时,请各位不要抄袭,至少在参考资料中注明论文思路的出处。

周六(25 日)晚,正在奋战 GTA IV,就在抢车的一瞬间,漆黑降临。第一个反应就是,妈的,又被条子干死了。眨眨眼睛,看着漆黑的四周,终于确定,原来是停电了。

反正停电了在家也没意思,于是拉着老婆上街转转,旁边的商场门口警灯狂闪,正好去凑凑热闹。

出门了之后才发现,下午狂风暴雨的力量还真不小,四处都是倒下的广告牌,就连信号灯都在狂闪红灯。

整个 Richmond 区域一片漆黑,只是时不时地出现汽车前灯,打破黑夜的宁静。而距家只有一路之隔的 Licoln Field Shopping Center 却灯火通明。去已经改叫 Metro 的 Loeb 转了一圈,也没什么好买的。算了,回家睡觉。

阅读全文 »

事情都快过去一个星期了,这几天一直奋战 GTA IV,这篇日志也就拖到了今天。

回到 4 月 22 日,最后一门考试——工程师道德经结束。交卷的一刹那,觉得一身轻松。大学的最后一门考试就这样过去了。

我的大学也念得够久的,从 2003 年入渥太华大学,到 2005 年转到卡尔顿大学,然后又经历了 2007 年和 2008 年的 Co-op 工作期,到 2009 年 4 月才毕业。原来在渥太华大学的同学和朋友早就各奔东西,卡尔顿大学认识的人也都纷纷毕业。只有我,熬到这时候才毕业。

终于,不用再忍受教授的折磨;终于,不用再熬夜写作业赶报告;终于,不用再去参加恶心的考试……终于,这一切都结束了。

Celebration,这是从 4 月 22 日到今天的主题。23 日,考完的第二天,应届毕业生五人组去小肥羊聚餐;24 日,考完的第三天,应届毕业生五人组去 Popcorn 唱K;昨天,四人 Live 联机 GTA IV。大家都在庆祝终于到来的解放。

只是……接下来的任务更加沉重——找工作。

Finally, the final final exam has been finalized. Finally, we have been finalized. And finally, we are going to another final destination...

昨天下午接到 Lunarpages 客服邮件,告知帐户被封,原因是两个脚本文件造成资源使用率过高。仔细看后发现,原来是之前小强网论坛被人用广告群发器攻击。无奈只有删掉小强网论坛,反正那个网站已经废弃了。

删文件的时候出问题了,没有 FTP 登陆,而且 Lunarpages 怎么也不肯给 FTP 权限。后来才知道,他们的 SB 系统需要解封才能分配 FTP 权限。没办法,只好通过后台 cPanel 备份全站,然后一点一点删除。花了一晚上备份,第一次失败,好在第二次成功。又花了半个小时逐个删除文件。最后终于在今天上午解封。

这次受影响的网站不少,现在我也开始思考对策,以后如何能在网站出问题的时候,在第一时间启用备份站或临时站。

最后表扬一下 Lunarpages 客服,因为这次解封得还算很快。只是在我请求 FTP 权限的时候他们没有说清楚,让我一直等 FTP 权限等了很长时间。但是,这一次直接封帐号有点过头了,之前类似事件只是脚本改名或者改权限。(上一次把文件改成 root 拥有和 000 权限也很恶心,根本没办法更新文件)

之前还在想怎样庆祝 Xbox360 购机一年,后来决定成就 10000 分达成,或者 5 游戏全成就。这两个任务在今天提前完成。

截至发本篇日志,已达成 10015 成就分。本来想到 10000 分的时候截个图,结果玩得太 high 给忘了。T_T

另外五个游戏全成就已经在这个星期早些时候完成,分别是《九十九夜》、《Fable II》、《Fable II Pub Game》、《天诛 Z》和《Bully: Scholarship Edition》(4 Retail + 1 Arcade)。

下一步打算先把《GTA IV》主线完成,然后再全成就。抢银行那关实在是太爽啦~!

经过半个月的奋战,全成就游戏又多了一个——《Bully》(Scholarship Edition)。

决定玩《Bully》,是因为在网上看到说《Bully》是校园版《GTA》,是由 Rockstar 同一小组制作。当决定入手游戏之后,却发现几乎没有商家卖这款游戏。找遍了 EB Games、Bestbuy 之后,终于在 Futureshop (Southkeys) 存货中挖出这款游戏。

上手之后发现,其实《Bully》并没有《GTA》那么自由,故事线都是被严格安排好的,没有太多的任务选择。或许 Rockstar 已经意识到这个问题,所以在游戏中加入了 Errand(跑腿任务)。这些任务基本上算是可做可不做的支线任务,做完任务也只能赚钱,而不会影响游戏进度。另外有一些故事任务并不影响通关,我在通关之后才发现,之前有一个任务没有做。

《Bully》的另外一个好处就是,在所有任务结束之后,之前漏掉的任务可以补上,而且所有影响完成度的活动(自行车赛、卡丁车赛等等)都可以在主线任务结束之后进行。所以玩《Bully》并不需要像某些日本游戏那样通关若干次,只要在主线完成之后继续完成其他活动,也能拿到 100% 完成度成就。

《Bully》的成就也很恶搞,比如说吻男生 20 次,扒男生裤子 20 次等等。个人觉得,唯一一个比较无聊的成就就是骑自行车 100 公里。在游戏完成之后,刚好能拿到走路 100 公里和滑板 50 公里,加上所有的自行车赛,也只能拿到 60 公里的自行车路程。为了达到 100 公里,在所有任务和活动都结束之后,我又花了半个多小时在大街上骑车。其他的成就都还可以,比较好拿。总体来讲,这游戏拿全 1000 成就并不难,只要有耐心。

半个月攻关之后,终于解开了全 1000 成就。但是总游戏时间也就 40 小时左右。作为开胃小菜,《Bully》让我更期待《GTA 4》大餐。但是,鉴于考试期间没人跟我一起《GTA 4》,接下来的一个多星期估计要靠《战斧》度过。

玩过《Bully》之后,开始喜欢 Rockstar 的作品。作为 Rockstar 的主打作品,《GTA》系列当然不能错过。

恰好在逛 Bestbuy 的时候,看到《GTA 4》正在打折促销,收藏套装 $59.99。没犹豫,直接败下。

等《Bully》100% 完成之后,下一个目标就是《GTA 4》!

Rick,赶紧去搞一份 PC 版《GTA 4》,到时候一起联机结帮抢地盘。

阅读全文 »