Archive for 3月, 2010

Function set_magic_quotes_runtime() is deprecated

find:
set_magic_quotes_runtime(0);
replace with:
ini_set(”magic_quotes_runtime”, 0);

MAXScript

MAXScript语言是为了扩展3ds MAX 功能而专门设计的一种脚本语言,是面向对象编程语言中的一种。用它创建的场景物体和材质与在3ds MAX界面中创建的场景物体和材质完全对应。可以生成自动关键帧的动画模式,并可以通过层级路径名来访问场景中的物体。有记录在3ds MAX界面中的交互操作过程的能力,在使用界面操作的同时可以使用MAXScript来自由创作。
可以实现3D Studio MAX的全部用途,如建模、动画、材质、渲染等。
MAXScript可以运用各种数学工具来完成高级复杂的程序设计任务。可以对含有大量对象的集合进行操作。例如在复杂的场景中选择物体,可以把大量物体放置在精确的位置上,例如在山或路边放置一些树木,使用MAXScript操作起来是非常的方便。
它也能将一些功能定义为界面元素,例如工具栏按钮、菜单、浮动窗口,程序面板卷帘窗。
可以建行批处理操作提高工作效率。例如建立一次可以渲染多个场景文件的脚本程序。
可以自定义输入输出工具,可以定义修改器,渲染效果插件等。
脚本分享网站:http://www.scriptspot.com/

C++名人坊

有两位Google Maps API的初学者向我请教他们按照最简单例子写的程序为什么不能正常的运行。
  其中一位用GTalk跟我交流,我仔细了看了他的代码,没看出问题,把代码保存在本地,打开Firefox的错误控制台,用Firefox打开他的页面。出错的那一行被清晰的显示出来,我再仔细端详那句话,原来有两个应该是英文逗号的地方,写上了中文逗号。
  另一位,在我的论坛跟我交流他的Google Maps API中遇到的问题,我看他代码的时候也没有马上发现问题。然而,同样在用Firefox打开后,问题很明显的找到了,原来是一个方法openInfoWindow被他写成OpenInfoWindow了。
  在我帮助别人解决的程序调试问题中,这是非常常见的。人人都可能打出中文逗号,人人都可能把大小写写错。但是在我帮助他们解决问题以后,他们总是感慨的说,谢谢我解决了这个问题,这个问题困扰了他们几个小时,甚至是几天。
  这其实并不是只有初学者才会遇到的问题,我还帮助过些有非常丰富经验的工程师解决问题,有时候问题仅仅出自某个参数没有传递进来,或者是拼接字符串的时候少些了一个冒号,或者是拼接地址的时候漏掉了http:。我甚至帮助一些人调试一些我根本不懂的语言的程序,因为多半出现的问题,都和语言特性无关,不是程序员写错了字符,就是写错了逻辑,或者是错误理解了一个函数。
  出问题是正常的,写程序是一个复杂的边思考边打字的过程,笔误和一时糊涂都是难以避免的。程序员一般把这种问题叫做低级问题,因为这类问题跟你的智商完全无关,任何人都可能犯。
  但是,问题在于,有时候即使是很优秀的程序员,也会被一个低级错误困扰,可能会几天都解决不了。所以,关键在于,如何找到问题。
  遇到问题的时候:
  1,不要怨天怨地。出了问题,当然有可能是系统的bug,API的问题,但是那些几率往往比你犯低级错误的几率要低多了,先从自己身上找原因,是不是自己写错了。
  2,要掌握工具。最低限度你要会写Log,最好是Log和调试器结合。好 的工具可以大大的提高效率。以前有人跟我说,Dll不能调试,我发现可以;有人说多线程不能调试,我发现可以;有人说COM不能调试,我发现可以;有人说 IE插件不能调试,我发现可以;有人说OE插件不能调试,我发现也可以。当然,你确实会遇到不能调试的时候,当年我们做东芝芯片的嵌入程序,一个组都没有 一个仿真器和调试器,但是至少可以用Log嘛,无非是麻烦点。
  3,分析问题要有逻辑。遇到问题可以先把所有的可能性都列出来,然后一个一个分析,肯定能找到原因的。
  4,要学会隔离问题。问题涉及到的代码越多,越难以理解,问题越难以解决。遇到这样的情况,可以利用Log或者调试器,一行代码一行代码的给它们洗清嫌疑,这样很快你就可以找到出问题的地方。如果代码特别长,程序特别复杂,可以用二分法来做,效率很高。
  5,千万不要懒惰,不要事事求别人。一次复杂的调试过程就像一部侦探剧,如果你有非常好的逻辑性,那这部剧的主角就是福尔摩斯,剧情一定非常精彩。我说这个是有巨大风险的,说真的我帮人调东西挺上瘾的,很有意思。但是我还是要告诉大家,一次高难度的调试之后,你的满足感绝对不亚于写了一个伟大的程序。
  要想不遇到问题,写代码的时候:
  1,要对写出来的代码负责。我很佩服那些写代码写100行都不执行一次的 高手,如果他们最后不被低级错误困扰的话我就更加的佩服了。我写程序几乎是写一行两行就要执行一次,每句话我都要确保执行效果跟我的预期一致。没错这样写的时候 可能慢一些,但是调试的时候很轻松,我可以很简单的确定哪些代码绝对没有问题。所以我写代码整体速度比一般人高。很多人学习新东西的时候喜欢把例子抄一遍,运行一下,改改,再运行。我喜欢一句一句的抄例子,抄一句两句执行一次,这样可以把例子透彻的理解,而且很难会遇到出现了问题找不到原因的时候。
  2,函数体功能块不要过长。我认为我的智商并不高,我很难接受一个程序的一个函数体或者一个功能块超越3屏(当然逻辑真的有那么复杂除外,你会发现越是简单的逻辑越是容易被人写的冗长)。很多人对面向对象耳熟能详,对封装继承看起来驾轻就熟。但是动不动就写出来个函数体超长的程序。这就像写本书从头到尾不点句号一样,会累死读者的。自己看的时候,估计也会被累的喘不过来气。这是我对基础教育的微词所在,他们连教会学生写函数都没教会,虽然表面上他们连面向对象这么高深的东西都教。
  3,缩进要对。这点很重要,虽然大部分语言不是像Python那样用缩进来决定逻辑块的位置,但是人看到缩进的时候,总是会以为这些缩进位置跟逻辑相关。尤其是在有大量的ifelse或者for循环等等的嵌套逻辑的时候,如果缩进错了,可能会直接让人把程序的逻辑读错。所以我拿到别人的代码,第一件事情就是整理缩进。我见过一些比较优秀的页面工程师,他们会在div结束的位置用注释写上这个div的id,这样层级关系就一目了然了。
  4,不断重构。随着程序的不断修改,有些部分会不断的增长,原来看着清晰的架构可能因为问题的复杂而慢慢模糊,也可能被修正bug的权宜之计弄的面目全非。不信你找一个经过多次修改的程序看看,是不是满目疮痍,是不是都很难认出是你自己的作品了。这在多人参与的项目中更加严重,每个人有不同的代码风格,经过多次杂交后,你肯定认不出你的代码是骡子是马,还是四不像了。随着程序的慢慢成长,原来有些函数体会慢慢膨胀,需要拆分;有些原来简单的功能块四处都需要,应该被提炼成函数或者方法,等等。现在不重构,未来等到代码复杂到无法控制的时候,重构的工作就会变得更加困难。我见过最强的案例是,一个几千行的电子辞典配套联机软件,经过无数次的改版,变成了一个几乎无法维护的主窗体的cpp有1万8千行的怪物。最后经过复杂的重构,才变成一个出新版本只需要新增一个驱动程序的可以维护的几千行的程序。
  郝培强:银杏技术咨询创始合伙人,网名Tinyfool,技术方向是全文检索,搜索引擎优化,网站架构设计等。 银杏技术咨询的主要业务是帮助客户的网站改进技术,提高网站性能和反应速度,解决门槛性技术问题,从而提高用户满意度。
  【CSDN独家专访】有的时候我们对一款产品表现出难以名状的喜爱之情,往往我们就会想像做出这样功能的程序员他应该是多么的伟大,是什么样的天才,对他就如同造物主一般的崇拜,所以很多人会把成为一个程序员作为自己的理想,然而很少有人会知道,在这样一款产品的背后,其实还有一个更加强健的团队在护送着他前行。
  而这个团队的领军人物就是产品经理。近日,我们都很熟悉的暴风影音发布了它最新的3.1版本,这距离上次的3.0版仅过了45天。暴风影音做为一个日使用量在千万级别之上的客户端软件,产品里的任何一个角落有瑕疵,任何一个细节有Bug,被用户识别到的几率非常大,这和普通的应用软件是不能比的。所以需要做大量的用户反馈,数据分析,数据挖掘的工作,来提升软件本身的性能,那么,如果作为暴风影音的产品经理,他的身上又发生着什么样的故事呢?我们带着这样的好奇心采访了暴风影音的产品经理王志鹏。
  王志鹏是一个很健谈的人,但在倾听的时候却很真诚。“也许这就是做一名产品经理所必备的基本素质。”王志鹏对我们的赞赏这样回答道,“判断自己适不适合做一名产品经理,你需要为自己做一个这样的测试,如果有十个人分别提出了十种功能改进的方案,那么你是否能够发自内心的把这十套方案都耐心、认真的听完,并且能够真正领会到他们的意图,即使这其中有不切实际的方案、有令人哭笑不得的方案,但是如果你是有兴趣去做这件事,而且付出的都不会成为你的心理负担,那么你就具备了成为一名产品经理的基本素质”。
  在做产品经理之前王志鹏也是一名技术人员,他也很喜欢做技术,那么是什么让他实现了从一名技术人员到一名产品经理这样的一次转型呢?“其实我很早就立志我要做技术开发,大学毕业以后我在一家公司做ERP软件,由于ERP软件的特殊性,是需要跟很多的业务部门进行沟通来了解他们的运作状况之后才能够编写软件代码的,所以渐渐的我发现,我的编程技术或者说是一些技巧并不是最好的,但我是最懂得我们业务人员需求,最懂得他们要什么的人。”也许就是这样的一段时间,让王志鹏考虑了自己的特长可能会在这里有更好的发挥。
  也许就是凭着良好的沟通和理解能力,不久,王志鹏就被一家知名的国际软件厂商看中收入麾下,并担任项目管理的工作。“这段时间里我主要是在做项目甲方和乙方之间的桥梁,做时间、人员和资源方面的协调分配”王志鹏说,“在这段时间里我已经不做具体代码的编写工作了,这也让我有机会在抽离了具体的代码编写工作之后看清楚了一名技术人员在项目实施过程中会出现的问题,更重要的是让我深刻的体验到了这样的一家国际软件厂商他在软件产品生产的过程中积累下来的流程和规则,在这样的流程和规则下运作的软件生产活动,不管是谁都可以很好的完成高质量的产品”。也正是在这里,王志鹏完成了他的转型。
  “其实在这个转变的过程中,我也有过挫败感的时候。”王志鹏说,“曾经我认为从一个技术人员转型到产品经理是容易的,其实不然。在有过失败之后,我开始反思我这样的想法,非常幸运的是我找到了出口”。从王志鹏感悟中我们找到了转型过程中最核心的三点:
  1、敬畏之心。无论是技术人员面对产品经理还是产品经理面对技术人员,大家一定要抱有敬畏之心,要尊重和重视别人的意见,不要认为自己就是正确的,一个人提出任何一种想法一定是经过了思考的,不能单纯的认为这个想法“幼稚”、“不可能”,更多要想的是为什么他会有这种想法。
  2、主动沟通。技术人员和产品经理其实各自运行的是两套逻辑。技术人员在考虑问题的时候最先是从后台着眼,继而考虑架构然后开始编写代码的过程;而产品经理在考虑问题的时候首先是从用户开始,继而是用户体验、完全以市场驱动为主导。这样两种完全不同的思考方式造就了不同的工作习惯。
  程序员完全可以只考虑自己技术实现的这一部分,做到精美、高效那他就是一个合格的技术人员,而产品经理需要的是Open的方式,需要和不同的人沟通他们各自的感受,因为代码的对和错有明显的界限,而用户体验没有对和错,只有好和更好,而自己的习惯并不能代表大家习惯,所以要通过主动的沟通和倾听来知道各种各样的体验是怎样的。
  3、大量阅读。不仅仅要阅读相关专业类书籍更要有广泛阅读的习惯。因为这样能够培养人文的思维习惯,这也是单一研究理工科类的技术人员所欠缺的,编程需要逻辑思维的缜密,而阅读能够让你看事情的时候更换另一种逻辑,也让你的思维变得更加全面。
  获得成功是每个人都需要的,但是成功并没有一条可以遵循的路线可以走。并不是说程序员到了一个规定的阶段就一定需要转型,一定需要专向产品经理,或者一定需要出去创业。“我并不赞同每个技术人员都要考虑自己该如何转型,真正要考虑的是看请自己突出的特点在哪里。”王志鹏说,“在我们的工作过程中,并不是像升学考试一样,要一张桌子四条腿一样长,所谓的全面发展,如果数学能考120分,语文能考60分,而继续学数学就能考130分,同样的力气学语文可能可以靠90分,那毫不犹豫的应该去学语文;但是在工作中,如果我写代码能得80分的认可,做管理、做沟通能得60分的认可,而继续努力写代码就能到95分,继续努力尝试管理和沟通能得到80分,那么,奉劝大家还是要继续向95分的代码去努力。因为这就是你的特长,如果为了全面而放弃了你的特长,将是一个巨大的浪费。”
  王志鹏的经验令我觉得这应该就是社会分工的规律所在,每个人都有自己的角色,要认清的是自己的核心竞争力,而在这里木桶效应是失效的。如果要打破这种规律的话,那可能会付出很大的代价 。

OpenDNS的特点.使用方法

一.OpenDNS的特点有三个:
1.OpenDNS可以识别和阻止钓鱼(Phishing)网站,就像在你访问的网站和你之间设了一个检查站,保护你的安全。
2.比一般的DNS更快:两个特点保证了OpenDNS更快,首先它拥有一个大型的、智能化的缓存,这能够保证用户可以从庞大的OpenDNS用户库中获利;OpenDNS有一个高性能的按地理分布的网络和多个冗余备份连接,它会根据你的访问选择最近的地理位置;可以让你不用通过电信或者网通提供的DNS解析,这样可以避免被已经开始流氓的电信或网通域名劫持、广告等困扰。
3.OpenDNS可以自动纠正拼写错误:如果你不小心输入网址时拼写错误(比如少了个字母),OpenDNS也能将你引导到正确的网站,或者提供一个相似网站的搜索列表。比如输入www.google.cmo,就会自动转到www.google.com
二.使用方法:
只要把网络连接属性(TCP/IP协议属性页)中的主要DNS和次要DNS分别改成:
·208.67.222.222
·208.67.220.220
然后检验一下设置成功没http://welcome.opendns.com
如果提示如下内容则成功! Welcome to OpenDNS! Your Internet is safer, faster, and smarter because you’re using OpenDNS. Thank you!

emos

EMOS简介
  EMOS是一个基于CentOS,集成了ExtMail Server全部组件的小型Linux系统,10分钟即可完成安装及配置,成为完备的企业邮局系统。它的诞生将彻底改变邮件系统复杂的安装和配置局面,使只具备基本linux知识的用户就可轻松架设邮局。
  EMOS特性:
  1、EMOS 1.2 系统级特点 :
  基于CentOS 4.4,x86架构,支持4G+内存及多路CPU(SMP) 。
  基于Maildir存储,MySQL/LDAP(可选),简/繁体及英文三种安装界面 。
  基于交互式配置界面,方便设置大量邮局系统的初始化参数 。
  EMOS 1.2 交互安装程序介绍 :
  交互设置默认域名、默认主机名、邮件大小限制,是否支持TLS 。
  交互设置数据库类型(MySQL或LDAP),满足最爱好者或商业用户需求 。
  交互设置服务器存储类型(按散列模式或者标准企业邮局),支持ISP模式 。
  交互设置ExtMan后台超级管理员密码,杜绝了默认密码的安全漏洞 。
  EMOS 1.2 邮局特点 :
  多语言同屏读写,支持UTF-8及各种RFC标准,简/繁体及英文三种界面 。
  开源界第一个支持外发email编码转内码,全面支持99%的邮局/客户端 。
  轻松对付200M+邮件,GMail风格自动补齐、多附件上载等Ajax特性 。
  针对运营商的hashdir散列存储,可轻松应付上万个域名、上百万用户 。
  支持注册模块,可有针对性的开放某些域名免费注册,方便管理员 。
  支持新的禁止密码修改特性,可方便设置演示帐户和演示管理员 。
  支持防止SMTP认证用户伪造Sender/From 给本域或外域用户发信功能 。
  全面支持mysql或ldap的web管理,自带phpmyadmin/phpldapadmin 。
  支持注册/后台登陆的图形识别码功能,可选开/关(默认打开,6位英文) 。
  Webmail支持邮件大小限制,可控制系统资源占用及外发邮件体积问题 。
  HTML编辑器支持RTF<=>TEXT格式自由转换,附件/邮件同屏处理 。
  人性化的GMail风格过滤器,网络磁盘支持文件<=>邮件自由转换 。
  支持多域,可任意控制域/别名/帐户,分级管理,满足企业邮局各种需求 。
  后台支持每域名的6种默认服务设置,是否支持注册,默认磁盘限额 。
  支持默认网络磁盘限额,帐户默认生命周期,可选邮件用户禁止改密码 。
  支持域/邮箱/别名/网盘等数量限额,Web/SMTP/POP/网盘等个性化开、关 。
  SMTP行为及SpamAssassin内容过滤,支持频率控制,GreyList,黑/白名单MSPF/SPF,PTR,HostName,主机名规范检查,RBL等大量实时拦截功能 。
  图形化的邮件日志分析,可对邮件进出数量、大小/垃圾、病毒拦截率/POP。
  登陆和队列情况进行实时监视 。
  EMOS 1.2使用说明
  由于1.2全面支持交互设置,因此假设您输入的默认域名是domain.tld,而主机名是mail.domain.tld,后台帐户密码是mypassword,下同。
  webmail访问地址:http://mail.domain.tld/extmail/
  默认帐户名:postmaster 密码:extmail 域名:domain.tld
  后台访问地址:http://mail.domain.tld/extman/
  默认帐户名:root@domain.tld 密码:mypassword
  mysql后台地址: http://mail.domain.tld/phpmyadmin/
  帐户:root 密码:空 (请登陆后立即修改mysql密码!)
  LDAP后台地址:http://mail.domain.tld/phpldapadmin/
  帐户:cn=Manager,dc=extmail.org 密码:secret ,请注意修改此密码。如果不熟悉如何修改,建议利用htpasswd来保护这个后台!
  有关软件/脚本路径、使用说明
  1)半夜4点执行过期帐户检测脚本expireusers.pl并给postmaster@domain.tld发送汇报邮件,自动屏蔽过期帐户
  2)半夜4:30执行所有帐户/域名的磁盘空间检测,并给postmaster发送汇报邮件
  3)每个星期日半夜5点,自动执行/usr/local/slockd/tools/log-rotate程序,将slockd的日志归档压缩
  4)每周凌晨0点下载Spam assassin 的chinese rules.cf
  5)Extmail路径:/var/www/extsuite/extmail
  6)ExtMan路径:/var/www/extsuite/extman
  7)maligraph_ext路径:/usr/local/mailgraph_ext
  8)slockd路径:/usr/local/slockd

摄像头互动游戏开发

1.    简介
何为摄像头互动游戏,摄像头互动游戏就是使用摄像头作为输入设备取代传统的键盘和手柄输入,从而使玩家能够更加融入游戏。目前国内很多公司从事摄像头互动技术(包含投影和游戏)。
http://www.eyebobi.com/
http://www.interjoy.com.cn
http://www.interactiveprojection.co.uk/
http://www.eyeclick.com/
多数公司都会将这套技术同时用于互动投影、游戏和其他相关领域。就目前而言,互动投影使用的较多,游戏方面的运用相对较少。
2.    原理
使用摄像头作为交互输入的原理就是通过摄像头捕获的序列帧分析玩家的运动或者动作从而达到输入的目的。(参见hardant的博客-基于视频序列捕获人体运动和人体运动分析)
3.    实现
对摄像头采集的数据进行分析当然需要图像处理的知识,还好有强大的OpenCV支持一切都变得简单了。
http://en.wikipedia.org/wiki/OpenCV
http://www.opencv.org.cn/index.php/首页
其中包含运动物体检测,人脸识别,色块跟踪,轮廓检测等功能。我们所要做得就是将其与我们的游戏结合即可。可以看到基本的流程可以如下实现:
数据获取及分析
1、使用DS获取摄像头数据(使用Grabber滤波器直接获取到RAM)
2、使用OpenCV对获取的数据分析得到想要的结果
 
数据获取及使用
1、使用多边形的典型数据结构PolyPolygons进行数据的存储和使用。
 
最需要的功能碰撞检测,可以参考基于2D多边形的碰撞检测和响应一文
或者直接使用物理引擎。
 
这样你就可以使用其他的显示库和游戏引擎进行互动游戏的开发了。
4.    问题
摄像头获取数据的不稳定性导致得到的数据在每次更新过程中都会发生改变,在这种情况下碰撞检测会不精确;玩家背景的变化也会导致游戏的易操作性和可玩性下降。(最好买游戏附送绿幕)
 
 目前这种互动技术仅仅运用于简单游戏和互动投影,对于交互性较强的游戏就显得捉襟见肘了。

相剑者

鉴定宝剑的人说:“呈魄表示坚硬,呈黄色表示柔韧,黄白相混杂则既坚又韧为好剑。”
有人反驳:“白为不韧,黄为不坚,黄白乃不坚不韧。怎为利剑?”

cassandra

Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynomite(分布式的Key-Value存储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。)Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo 2.0。
  功能
  Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra 的一个写操作,会被复制到其他节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。 
  这里有很多理由来选择Cassandra用于您的网站。和其他数据库比较,有三个突出特点:
  模式灵活 :使用Cassandra,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部署上。
  真正的可扩展性 :Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台电脑。你不必重启任何进程,改变应用查询,或手动迁移任何数据。
  多数据中心识别 :你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。
  一些使Cassandra提高竞争力的其他功能:
  范围查询 :如果你不喜欢全部的键值查询,则可以设置键的范围来查询。
  列表数据结构 :在混合模式可以将超级列添加到5维。对于每个用户的索引,这是非常方便的。
  分布式写操作 :有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。

两个人和斧子

两个人一起赶路,一个人捡到了一把斧子,高兴地大喊:“我捡到了一把斧子。”另一个却纠正他说:“唉,朋友,不是我捡到一把斧子,而应该说我们捡到一把斧子。”
没走多远,丢斧子的人追上了他们。误以为他们偷了他的斧子。捡斧子的人对同伴说:“哎呀,我们遇到麻烦了。”另一个人却回答说:“不是我们遇到麻烦了,应该说我遇到麻烦了。”

挤牛奶的故娘

一天,一个农家姑娘头顶着一罐牛奶到市场上去卖。
她边走边浮想联翩:“这桶牛奶卖的钱,至少可以买回300个鸡蛋。除去意外损失,这些鸡蛋可以孵得250只小鸡。到鸡价涨得最高时,便可以拿这些小鸡到市场中去卖。那么这样一年到头,我便可分得很多赏钱。用这些钱足够买一条漂亮的绿裙子。我要穿着它逛街,所有的年轻小伙子都来向我求婚。不行,不管他们怎么恳求,我都得摇摇头,拒绝他们。”
想到这里,她真的摇起头来,结果,头顶的牛奶倒在地上,她的美妙幻想也随之消失了。