十 31
Wang Wen HaoWeb开发 HTML
由于历史的原因,各个浏览器在对页面的渲染上存在差异,甚至同一浏览器在不同版本中,对页面的渲染也不同。在W3C标准出台以前,浏览器在对页面的渲染上没有统一规范,产生了差异(Quirks mode或者称为Compatibility Mode);由于W3C标准的推出,浏览器渲染页面有了统一的标准(CSScompat或称为Strict mode也有叫做Standars mode),这就是二者最简单的区别。
W3C标准推出以后,浏览器都开始采纳新标准,但存在一个问题就是如何保证旧的网页还能继续浏览,在标准出来以前,很多页面都是根据旧的渲染方法编写的,如果用的标准来渲染,将导致页面显示异常。为保持浏览器渲染的兼容性,使以前的页面能够正常浏览,浏览器都保留了旧的渲染方法(如:微软的IE)。这样浏览器渲染上就产生了Quircks mode和Standars mode,两种渲染方法共存在一个浏览器上。
那么浏览器究竟该采用哪种模式渲染呢?这就引出的DTD,既是网页的头部声明,浏览器会通过识别DTD而采用相对应的渲染模式:
- 浏览器要使老旧的网页正常工作,但这部分网页是没有doctype声明的,所以浏览器对没有doctype声明的网页采用quirks mode解析。
- 对于拥有doctype声明的网页,什么浏览器采用何种模式解析,这里有一张详细列表可参考。
- 对于拥有doctype声明的网页,这里有几条简单的规则可用于判断:对于那些浏览器不能识别的doctype声明,浏览器采用strict mode解析
- 在doctype声明中,没有使用DTD声明或者使用HTML4以下(不包括HTML4)的DTD声明时,基本所有的浏览器都是使用quirks mode呈现,其他的则使用strict mode解析。
- 可以这么说,在现有有doctype声明的网页,绝大多数是采用strict mode进行解析的。
- 在ie6中,如果在doctype声明前有一个xml声明(比如:),则采用quirks mode解析。这条规则在ie7中已经移除了。
Quirks mode和Standars mode最大的不同就是提现在对盒模式的解释上,这也是我们在js里要注意的地方。
什么是盒模式? 这是针对块级元素说的,说白了就是把块级元素想像成一个装东西的盒子,而margin,padding,border,width这些css属性构成了盒模式。
在Standars mode中:
元素真正的宽度 = margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-right;
在Quirks mode中:
width则是元素的实际宽度,内容宽度 = width – (margin-left + margin-right + padding-left + padding-right + border-left-width + border-right-width)
- 内联元素 ,例如<a>|<span>等,定义上下边界不会影响到行高(line-height),内联元素距离上一行元素的距离由行高决定,而不是填充或边界。
- 内联元素(display: inline) 内联元素不需要在新行内显示,而且也不强迫其后的元素换行,如<a>|<em>|<span>等都为内联元素。内联元素可以为任何其他元素的子元素。
- 浮动元素(无论左或者右浮动)边界不压缩 ,且若浮动元素不声明宽度,则其宽度趋向于0,即压缩到其内容能承受的最小宽度。
- 如果盒中没有内容,则即使定义了宽度和高度都为100%,实际上只占0% ,因此不会被显示,此点在采取层布局的时候需特别注意。
- 边界值可为负,其显示效果各浏览器可能不相同。
- 填充值不可为负。
- 边框默认的样式(border-style)为不显示(none)。
在js中如何判断当前浏览器正在以何种方式解析?
document对象有个属性compatMode ,它有两个值:
BackCompat 对应quirks mode
CSS1Compat 对应strict mode
各浏览器的兼容性表,可以查看PPK的网站。
十 26
Wang Wen HaoiOS iOS
大家都知道@property和@synthesize可以自动生成某个类成员变量的存取方法,但可能对property中的一些属性不是很了解,网上的一些介绍有的不是很正确,感觉会误导新手,于是准备详细介绍一下property中的详细属性。
先介绍一下默认的情况:
readwrite:这个属性是默认的情况,会自动为你生成存取器
assign:这个属性一般用来处理基础类型,比如int、float等等,如果你声明的属性是基础类型的话,assign是默认的,你可以不加这个属性
对于assign来说,他的存取器代码是这样的:
@property (nonatomic, assign) NSString* myField
- (NSString*) myField {
return myField;
}
- (void) setMyField: (NSString*) newValue {
myField = newValue;
}
natomic:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。
然后说一下其他的情况:
readonly:只生成getter不会有setter方法
copy:这个会自动生成你赋值对象的克隆,相当于在内存中新生成了该对象的副本,这样一来,改变赋值对象就不会改变你声明的这个成员变量了
retain:会自动retain赋值对象,具体实现如下:
@property (nonatomic, retain) NSString* myField
- (NSString*) myField {
return myField;
}
- (void) setMyField: (NSString*) newValue {
if (newValue !=myField) {
[myField release];
myField = [newValue retain];
}
}
可见首先要判断一下当前myField是否就是新赋值来的对象,如果不是要将自己release掉,之后才会进行赋值及retain。
nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。
十 20
Wang Wen HaoiOS iOS, MVC
我们今天谈谈cocoa程序设计中的 模型-视图-控制器(MVC)范型。我们将从两大方面来讨论MVC:
- 什么是MVC?
- M、V、C之间的交流方式是什么样子的?
理解了MVC的概念,对cocoa程序开发是至关重要的。
一、MVC的概念
MVC是Model-VIew-Controller,就是模型-视图-控制器,这些都是什么东西呢?
MVC把软件系统分为三个部分:Model,View,Controller。在cocoa中,你的程序中的每一个object(对象)都将明显地仅属于这三部分中的一个,而完全不属于另外两个。
Model = 你的程序是什么(而不是你的程序是如何显示的)
让我们举个例子,我们上中学的时候,我们的步步高电子词典中有个游戏叫“雷霆战机”,也就是“打飞机”的游戏,Model就是:你的小飞机的攻击力是多少?你的小飞机上装的是什么武器,炮弹,导弹,还是激光炮?你的小飞机还有多少血?等等。再概括点说,就是你的程序将要实现的功能,或者是它所能干的事情。
Controller = 如何使你的模型呈现给用户(程序逻辑)
Controller是程序内部的逻辑,大多情况下你将看不到它,它将Model和View捆绑在一起,它将处理用户的输入,例如,你按开炮的键子,Controller就会通过内部的逻辑来处理你的要求,并在屏幕上做出相应的显示,你将看到屏幕上的小飞机发出炮弹击中敌机。这也是Controller控制View的显示的例子。所以你可以把Controller看成是连接M和V的桥梁。
View = 在屏幕上你所看到的(是你的Controller的“奴才”)
接着前面的小飞机,View就是:你的小飞机是什么样子的,有一个还是两个翅膀,有几挺枪炮;还有,你的飞机在屏幕上的位置等等。总之,你在屏幕上看到的组件都可以归类为View。
MVC可以帮助确保帮助实现程序最大程度的可重用性。各MVC元素彼此独立运作,通过分开这些元素,可以构建可维护,可独立更新的程序组建。
二、M V C之间的交流模式
好了,现在我们来讨论MVC中各个元素之间的交流方式。
我们把程序分成三个部分,但并不希望他们完全独立,因为那样的话,我们的程序将毫无意义和功能而言。它们之间必然存在某种联系,使它们能有机的成为一个整体来实现各种强大的功能。而这种联系就是我们提到的交流方式。我们来看看下面的图,此图出自斯坦福大学CS193课程的课件。

图中有几条线把这三部分划分开,有黄线,虚线,和白色的实线。我们把它们想象成路标。你可以看到,在M和V之间有两条黄线,这表示什么呢?它意味着你不能穿越这黄线,任何一个方向都不行。在图的上部,你可以看到白色的虚线,它意味着你可以自由的穿越它,只要是安全的。那白色的实线呢?它代表你可以穿越,但你必须要买票,或者交点过路费。
好了,如果你觉得前面的比喻没有使你明白的话,让我们来讲点实在的东西。
首先, 我们来看C和M之间的绿色箭头,这箭头的方向就代表着“发起对话”的方向,也就是说,发起对话的是C,而做出回答的是M。C可以问M各种各样的问题,但M只是回答C的问题或要求,它不可以主动的向C要求什么。还记得虚线是畅通无阻的意思吧,所以,C知道M的所有的事情,如果用代码来说明这件事情,就是说,C可以导入M的头文件或是M的接口(API)。因为C可以通过M的API,所以它就可以肆无忌惮的向M要求这要求那了。
我们再来看看另外的一个绿色箭头,它是在C和V之间,和前一个绿色箭头的意义一样,它代表C可以直接地向V进行交流。你可以想想,C要把V放到屏幕上,并设置V的属性,告诉它们什么时候从屏幕上消失,把它们分成组等等。如果C不能自由的向V发号施令的话,程序的显示将会多么的困难,所以,C可以毫无限制地向V说话。
可能你已经注意到了,这个箭头上还有outlet(输出口),outlet可以看作是从C指向V的指针,它在C中被定义。outlet给我们提供了很大的方便,它使我们在C的内部就可以轻松准确地向V施令。C可以拥有很多的outlet,可以不止一个,这也使它可以更高效的和V进行交流。
那M和V之间可以交流么?还记得黄线的意思么?完全不可以通过,所以我们是不允许M和V进行交流的。这是因为我们不希望这三部分之间有过多的交流,你想想,假如V在显示时出现了问题,比如有一个图形没有显示出来,我们就要去查找错误,因为C可以和V交流,M也可以和V交流的话,我们就要去检查两个部分。相反的,只有C可以和V交流的话,在出错时,我们就只需要去C那里查找原因,这样查找错误不就很是简单了么?所以,我们不允许M和V之间有直接的联系,这也是在它们两之间有两根黄线的原因。
好的应用程序要具备与用户交互的能力。如果没有良好的交互性,程序的功能将会受到很大的限制。在MVC中,V是和用户直接接触的,用户看不到M和C,所以,程序与用户的交互必须通过V来实现,但V只是视图而已,它并不能完全处理用户的要求,所以,这就要求V必须有某种手段来向C发送信息,移交用户的交互要求。这手段就是前面白色实线代表的过路费,你知道V不能知道C的一切,但它可以通过某种“手段”来和C进行交流,移交用户交互责任。
我们接下来讨论V是如何向C发送信息的。V对C的交流有三种不同的方式。
第一种我们称为目标操作(target-action)。它是这样工作的,C会在自己的内部“悬挂”一个目标(target),如图中的红白相间的靶子,对应的,它还会分发一个操作(action,如图中的黄色箭头)给将要和它交流的视图对象(可能是屏幕上的一个按钮),当按钮被按时,action就会被发送给与之对应的target,这样V就可以和C交流了。但是在这种情况下,V只是知道发送action给对应的target,它并不知道C中的类,也不知道它到底发送了什么。target-action是我们经常使用的方法。
第二种方式我们叫做委托(delegate)。有时候,V需要和C进行同步,你知道,用户交互不仅仅是什么按按钮,划滑块,还有很多种形式。好了,让我们来看看图中的delegate黄色箭头,你发现箭头上又分出了四个小箭头:should,did,will,还有一个没标注的。绝大部分的delegate信息都是should,will,did这三种形式。和英文意思相对应,should代表视图对象将询问C中的某个对象“我应该这么做么?”,举个例子,有一个web视图,有人点击了一个链接,web视图就要问“我应该打开这个链接么?这样做安全么?”。这就是should信息。那will和did呢?will就是“我将要做这件事了”,did就是“我已经做了这件事”。C把自己设置为V的委托(delegate),它让V知道:如果V想知道更多的关于将如何显示的信息的话,就向C发送delegate信息。通过接受V发过来的delegate信息,C就会做出相应的协调和处理。还有一点,每个V只能有一个delegate。
第三种方式就是数据源(datasource),你知道,V不能拥有它所要显示的数据,记住这点非常重要。V希望别人帮助它管理将要显示的数据,当它需要数据时,它就会请求别人的帮助,把需要的数据给它。再者,iphone的屏幕很小,它不能显示包含大量信息的视图。看图中的datasource箭头,和delegate类似,V会发送cout,data at信息给C来请求数据。
好了,这就是V给C发送信息的三种形式。
最后一个问题。你看到M和C之间的白线,这意味着M不可以直接地,没有限制的对C进行交流。但有时,这个方向的交流是必要的。当M中的一些东西发生变化时,C需要了解这些变化,那我们怎么才能让C知道M的变化呢?通知(Notification)和KVO是解决问题的好方法。它们是这样工作的,当M中的某些东西发生变化时,他们会向C发出通知“嘿,老兄,注意了啊,我这发生变化了”,或者他们会发出指向变化的指针给C,或其他什么的。总之,他们的工作模式是这样的。
下面是我们的一个总结,cocoa忠实于MVC,所以理解cocoa的MVC是我们关键的开始,希望这些能使你明白一些。
C对M:API
C对V:Outlet
V对C:Target-action, Delegate,Datasource
M对C:Notification,KVO
十 14
Wang Wen Hao胡扯
60多年前,一群小白程序员扒了一个俄罗斯的开源框架,写了几行漏洞百出的代码,产品上线运营了,30年后新的CTO实在看不下去了,重构了部分代码,但框架依旧是旧的,又过了30年新代码和旧框架严重不兼容,产品濒临崩溃,用户流失严重,这时我们该
1 继续修bug打补丁
2 换个框架重构代码
3 干脆换掉这些程序猿
关键是那个开源框架糟糕得很,还没哪个使用它的产品成功过,虽然曾经在东欧拥有庞大的用户,但是22年前都抛弃不用了。
这个框架的设计师是两个德国人…
十 12
Wang Wen Hao胡扯
今天是中华民国一百岁生日,也是辛亥革命一百週年,我们以欢欣鼓舞的心情,一起为中华民国庆生,一起分享喜悦,一起跨越这个伟大、感人的时刻。一百年前的今天,国父孙中山先生领导发动震惊世界的武昌起义,一举推翻满清政府与千年帝制,创立亚洲第一个民主共和国—中华民国。今天不仅台湾,世界各地的华人,包括中国大陆,都在纪念辛亥双十。
今天我们要以庄严崇敬的心情,向怀抱理想、不怕牺牲的革命志士致敬。他们包括广东的陆皓东、湖南的黄兴、浙江的秋瑾、福建的林觉民、台湾的罗福星。这些民国英雄,只是少数中的少数。过去一百年,从开国、北伐、抗战、戡乱到保台,不知折损多少仁人志士,他们绝大多数是无名英雄,奉献了青春、牺牲了生命,却照亮了中华民国的天空。
各位先进、各位同胞:辛亥双十是海峡两岸共同的记忆与资产。因此,英九要藉这个机会,呼吁大陆当局:纪念辛亥双十,就不能忘记国父建国的理想是要建立一个自由、民主、均富的国家,大陆应该勇敢地朝这个方向迈进,也唯有如此,才能缩短两岸目前的距离。纪念辛亥双十,也不能割裂历史,而必须呈现历史原貌,正视中华民国存在的事实。中华民国的存在不是过去式,而是现在进行式,六十多年来中华民国在台湾蓬勃发展,在世界发光发热,未来我们还会继续蓬勃发展,继续发光发热!
各位先进、各位同胞:中华民国在抗战期间,牺牲了二千万军民的生命,台湾才能结束日本殖民统治,回到中华民国版图。如果没有台湾的回归,内战失利后,中华民国很可能在六十多年前就走入历史,没有机会新生,更不可能开启海峡两岸不同的发展历程。
六十多年来,中华民国不仅保障了台澎金马的安全,延续了中华文化的命脉,创造了台湾经济与政治的奇蹟,实现了台湾先贤追求议会自治的理想,而且还向世人证明:民主可以在华人社会的土壤中生根、开花、结果。
今天,台湾人民享有自由、民主、富足的生活,也凝聚对国家─中华民国─坚实的认同,中华民国宪法更早已成为全民共识的基础。国父建国的理想,当年在大陆没有机会实施,如今却在台湾完整实现。
今天,我们庆祝中华民国一百年双十国庆,我们深深以中华民国为荣,深深以台湾民主为傲。今天台湾所展现的活力与生活方式,已成为华人世界的标竿。
台湾面积不大,天然资源贫乏,我们却能赤手空拳,开创一片天。今天放眼全球,无论在半导体、平板电脑、智慧型手机或太阳光电方面,台湾产业不但角色重要,并对全球节能减碳贡献卓着。今年5月瑞士国际管理学院(IMD)世界竞争力评比,台湾排名世界第六,是有史以来最好的成绩;今年9月世界经济论坛(WEF)公布全球竞争力评比,我国竞争力分数创五年来最高分,排名全球第十三,其中有8项指标全球第一。
我们的年轻人才华横溢,在设计、发明与文创领域,光芒耀眼,在全球六大发明展中屡屡夺魁。如今全球80%的华语音乐在台湾创作,不论电影、戏剧、舞蹈、设计,我们都已经站上世界舞台。尤其我们的国片掀起一波波热潮,台湾新生代展现惊人的创作潜力,为台湾电影发展开创无限可能。
台湾社会也充满爱心,现在台湾有超过4万个非营利组织,有上百万志工在台湾各角落默默服务,甚至远赴海外,参与国际人道援助。去年我们的捐血率8%,在世界数一数二;我们认养了30万贫童,20万人在国外;每年慈善捐款超过350亿元,绝大多数来自一般人民。
在台湾这块土地上,我们看到很多值得尊敬、实践梦想的英雄。就像长年默默行善的阿嬷陈绸、陈树菊与老荣民尹殿甲、洪中海、战胜非洲疟疾的连日清、挑战超级马拉松的林义杰、创意烘焙大师吴宝春、康复再起的王建民、拾金不昧的杨黄牡丹、验出塑化剂的杨明玉、拍史诗电影的魏德圣、以及高球天后曾雅妮。从他们身上,我们看到了善良、勤奋与进取,更看到了坚持与希望,这是台湾前进的原动力。
各位先进,各位同胞:自由民主的中华民国、活力创新的中华民国、人文关怀的中华民国、开放自信的中华民国,这就是我们国家的形象。让我们一起为中华民国喝采,向所有曾经为中华民国付出汗水与青春的英雄,表达我们最深的敬意!
近三年来全球经济动盪不安,台湾仍以稳健的步伐,脱困而出,大幅提升国家竞争力,这是全民共同努力的成果。面对全球竞争压力,未来十年将是关键的十年,我们要全面落实黄金十年的愿景,在自信中开放,在创新中发展,在公义中前进,让中华民国彻底脱胎换骨,跻身先进国家之林。
各位先进、各位同胞:两岸和平是台湾繁荣发展的必要条件。过去三年多,政府在中华民国宪法架构下,以「九二共识,一中各表」为基础,推动两岸关係,维持台海「不统、不独、不武」现状,并得以大幅降低台海紧张,赢得国际社会的肯定与支持。三年多来,我们与大陆签署15项协议,每一项协议都做到了「对等、尊严、互惠」、「以台湾为主,对人民有利」。两岸人民同属中华民族,希望双方在正视现实的基础上,求同存异,互助合作,建立制度化的和平关係。
如今大陆已经是台湾最大的贸易伙伴、顺差来源与投资地区,大陆也是驱动全球经济成长的主要动力。我们要善用台湾优势,布局大陆市场,还要加快脚步,与其他国家洽签自由贸易协定或经济合作协议,为台湾开创新的商机。上月22日,我们与日本签署了投资协议,就是成功的桉例。目前我们也正积极与新加坡协商经济合作协议,我们还要参与区域经济整合,努力创造条件,以十年为期,加入正在扩展中的「跨太平洋伙伴(TPP)协定」。
今后我们要继续推动活路外交,更加巩固与邦交国的关係,增进与美国、日本、欧盟、东协、纽澳等无邦交国的高层互信,并扩大国际参与。十天前,英国成为第七个与我国签署青年打工度假协定的国家;五天前,荷兰也给我们6个海外领土的免签证待遇;后天布吉纳法索给我们落地签证待遇将正式生效,使国人享有免签证或落地签证的国家(地区)总数达到124个,比英九上任时增加了70个国家(地区)。各位先进,各位同胞:这显示当国家受到肯定,人民就有尊严。
在推动两岸关係时,台海和平的维繫不能一厢情愿,必须以坚实的国防为后盾,台湾安全才有保障,民众才有信心与大陆进一步改善关係。过去三年多,我们在部队训练、武器自製方面都有长足进步,并且多次成功採购先进的防卫性武器。未来的十年,我们将持续强化国防力量,打造精锐新国军,以捍卫中华民国主权,保卫台湾安全。
各位先进、各位同胞:国父当年成立「兴中会」时,成员只有二十几位,可是他们坚持理想、勇于实践,掌握了时代的脉动,十七年后竟然推翻满清,建立民国。
今天我们纪念辛亥双十,就要继承先烈先贤这种理想主义,不怕风雨,勇于开创,让我们的国家成为华人世界的典范。中华民国不只是国家的名字,也代表了自由民主的生活方式,对嚮往自由民主的华人地区也将产生示范作用。
光辉的十月,对英九而言,还有一项特殊意义。六十年前的十月,在风雨飘摇中,我的父母带着家人和一岁多的我,从香港来到台湾,追求自由安定的生活。他们万万没有想到,他们的儿子在五十多年后会成为中华民国总统。对这个国家、对这块土地,我怀着深深感恩的心情,我愿意奉献此生一切,努力建设台湾,让她成为自由繁荣的乐土,继续哺育我们的下一代,让每一个孩子,不论出身贫富,都能实现梦想。
就任总统三年多来,英九体会责任的艰钜,不敢丝毫鬆懈。虽然世局多变,挑战随时出现,但我对这块土地有信心,对人民有信心。
各位先进、各位同胞:中华民国是我们的国家,台湾是我们的家园。中华民国的前途与台湾的未来掌握在我们二千三百万人的手中,我们要团结、要奋斗,让台湾更有活力,更有魅力,也更有竞争力!
今天我们不分族群,不分党派,不分海内外,一起为中华民国庆生。我们要发下宏愿,一定要在我们的手中壮大台湾、振兴中华,为中华民国下一个精彩百年,打下基础。让中华民国在国际社会,成为一个更加受人尊敬、让人感动的国家!
现在,让我们一起高呼:
中华民国万岁!
台湾民主万岁!
谢谢大家!
近期评论