[转载]手机网站开发必修课[1]:手机浏览器_叛图的博客

mikel阅读(901)

[转载]手机网站开发必修课[1]:手机浏览器_叛图的博客.

手机网站开发必修课系列文章计划:

 

  1. 手机浏览器
    1. 来自wiki的解释
    2. 对wiki的总结
  2. 浏览器兼容性测试
    1. 为什么要有兼容性测试:比web浏览器还恐怖的手机浏览器
    2. 目标用户数据挖掘
    3. 安排测试,整理测试结果
  3. 测试结果对手机网站开发的指导意义
    1. 对设计的指引作用
    2. 确保裸html代码具有较高可用性,谨慎使用html标签
    3. css使用注意事项
    4. 非常重要:代码的优雅降级

以下文字翻译自维基百科》手机浏览器:http://en.wikipedia.org/wiki/Mobile_browser

手机浏览器,又称微浏览器迷你浏览器或者无线因特网浏览器,是被设计用于像手机或者PDA之类的无线设施网页浏览器。手机浏览器针对在便携设备上的小屏幕网页显示进行了专门的优化,以使网页内容显示最高效。手机浏览器的软件必须小巧并且能适应无线掌上设备的低存储量和低带宽。它们一度是最简朴的网页浏览器,但是2006年以后有些手机浏览器能够支持象css2.1JavaScriptAjax这样的最新技术。那些被设计从手机浏览器访问的网站叫无线门户。

内容概览

  1. 相关的技术
  2. 先驱们
  3. 流行的移动浏览器
    1. 被主流手机和PDA厂商使用的默认浏览器
    2. 用户可安装的手机浏览器
    3. 手机HTML代码转换机
  4. 更多
  5. 参考
  6. 更多外部链接

1 相关的技术

手机浏览器通常通过蜂巢网络连接,通过无线局域网连接的手机浏览器数量也日渐增多,后者使用基于TCP/IP的HTTP并能显示那些使用HTML, XHTML Mobile Profile (WAP 2.0), 或者WML (从HDML发展而来)编写的网页。WML和 HDML是适于通过低带宽传送数据的最简朴的形式,而无线数据的连接被称为WAP

在日本,DoCoMo定义了基于i-mode HTML的 i-mode服务,是压缩HTML(C-HTML)的一种扩展,HTML的一个子集。

WAP 2.0指定了XHTML手机协议和WAP CSS,WAP CSS是是W3C标准的 XHTML和 CSS在移动设备上扩展的一个子集。

 

2 先驱们

那些被称为微浏览器的技术,诸如WAP, NTTDocomo的 i-mode平台和Openwave的 HDML平台点燃了人们对无线数据服务的第一次热情。

第一个微型浏览器的诞生大约是在1997年, 当Unwired Planet 公司(后来发展为 Openwave)将他们的”UP.Browser”放在AT&T公司的手持设备上以供用户访问HDML内容。

一家英国公司, STNC股份有限公司,在1997年的时候研发了一款叫做 HitchHiker的微型浏览器,并对这款装备设计了全套的UI。这款微型浏览器(Webwalker)的演示平台拥有每秒处理百万条指令的能力。它是一个单核处理平台,在类似于应用堆栈的处理器上跑着GSM堆栈。1999年 STNC被微软收购,并且HitchHiker变身为Microsoft Mobile Explorer 2.0,不同于之前的Microsoft Mobile Explorer 1.0。HitchHiker被认为是第一款拥有统一标准的渲染模型的微型浏览器,它在一个客户端遵从EcmaScript, WMLScript, POP3IMAP 邮件等标准处理 HTML 和 WAP。尽管这个浏览器最终未被使用,但它确实可是使HTML 和 WAP在一个页面上联合使用,虽然这将使得其他的设备无法正确渲染该页面。另外, Amstrad公司倒霉的将HitchHiker作为他们e-m@iler和 e-m@iler+产品的操作系统,手机浏览器2.0在Benefon Q, Sony CMD-Z5, CMD-J5, CMD-MZ5, CMD-J6, CMD-Z7, CMD-J7 and CMD-J70.等设备上都可使用。

还有一款叫Palmscape的用于PalmOS的免费浏览器(虽然后来才成为共享软件的),由Kazuho Oku 1998年在东京编写,他继而发现了Ilinx,这款浏览器直到2003年才放开使用限制。

于2001年发布的 Mobile Explorer 3.0增 加了iMode的兼容性和众多的专利设计。通过假想的将这些专利设计结合到WAP协议中, MME3.0执行了OTA数据库同步、推送了email,推送了信息客户端和PIM功能。已经退出市场的索尼爱立信CMD-Z700深度集成了 MME3.0。MME的开发脚步在2002年中旬画上了句号。

Opera Software公司以他的小屏幕渲染技术(Small Screen Rendering )和中屏幕渲染技术(Medium Screen Rendering)领先于该领域。Opera的的web浏览器可以让普通的web网页在小型屏幕和中型屏幕上重新布局,并达到最优显示。他是第一款广泛支持Ajax和通过ACID2测试的浏览器。

 

3 流行的移动浏览器

手机浏览器和基于web的模拟器不同,基于web的模拟器使用一种“虚拟的手持设备”在电脑上显示wap页面,使用java或者html转码器。这些模拟器有 Wapjag, TT, Waptiger 和 Superwap。

一下表格列出了一些当下非常流行的手机浏览器。一些手机浏览器是web浏览器的精简版本,因此一些手机浏览器厂商也提供用于台式机和笔记本电脑的浏览器。

3.1 被主流手机和PDA厂商使用的内置手机浏览器

浏览器 开发者 开源 渲染引擎 软件许可 注意
Danger browser Danger 专利的 installed on all Danger-designed devices including the T-Mobile Sidekick
Embider Infraware 专利的 [2]
Internet Explorer Mobile Microsoft 专利的
Nokia Series 40 Browser Nokia 专利的
Novarra nWeb Novarra 专利的
Obigo Browser Obigo AB 专利的 100% owned by Teleca AB
Picsel Browser Picsel Techologies 专利的
jB5 Mobile Browser Jataayu Software ? ? ? available on Symbian Series 60, Windows Mobile and Linux
Wapaka Browser Digital Airways ? ? ? Java micro-browser
Myriad Browser (Previously Openwave Mobile Browser) Myriad Group Fugu (Next version to use WebKit)[4] 专利的 Acquired from Openwave in 2008
Fennec Mozilla Gecko ? Currently in Beta
BlackBerry Browser Research in Motion Mango 专利的
Kindle Basic Web Amazon.com NetFront 专利的
Blazer Palm NetFront 专利的 installed on all newer Palm Treos and PDAs
NetFront ACCESS Co., Ltd. NetFront 专利的
PlayStation Portable web browser Sony NetFront 专利的
Opera Mobile Opera Software Presto 专利的 Capable of reading HTML and reformat for small screens, installed on many Phones
Android browser Google WebKit Apache 2.0 and GPLv2
Iris Browser Torch Mobile Inc. ? WebKit ? Linux/ Qt and Windows Mobile
Safari Apple Inc No WebKit 专利的 on iPhone and iPod Touch
Symphony Motorola ? WebKit ? on MOTOMAGX
Web Browser for S60 Nokia ? WebKit ?
Browser Creator FOSS Current layout engine Software license Notes

3.2 流行的用户可安装的手机浏览器

3.3 手机HTML代码转换机

手机HTML代码转换机将web内容重新格式化并压缩成移动设备可用的内容,并且必须和内置的或者用户安装的手机浏览器配合使用。以下是几个领先的手机HTML代码转换机服务。

 

4 更多

 

5 参考

 

6 更多外部链接

 

对wiki的总结

对于wiki中提到的浏览器类型,还有两个页面可供参考

  1. 手机浏览器型号查询
  2. ppk:手机类型和浏览器表格
  3. 看完整篇文章后,有一些问题要问问聪明的你
  1. 什么是渲染引擎?什么是浏览器?这是两个最先要搞清楚的概念。
  2. 内置的手机浏览器,用户安装的手机浏览器和基于web的模拟器
  3. 每个浏览器都有相应的渲染引擎,因此有必要知道使用同一个渲染引擎的手机浏览器的页面表现是否一致
  4. 国内主流的浏览器机型有哪些?国内用户是否喜欢使用用户自己安装的浏览器。不管怎么样,作为一个开发人员,应该尽量去体验一下这里提到的各种用户可安装的浏览器。
  5. 基于web的模拟器是前期测试很有效的工具,推荐使用safari,opera和firefox(需安装插件)
  6. 如何保证手机网页的开发效率(包括质量和速度哦)?

以上这些问题,前两点在本文中有提到,后面几点希望大家能开动脑筋先想想,答案将在后续的文章中揭晓

建议用你自己的手机访问一些国内较大的无线网站。比如 http://wap.taobao.com,http://wap.163.com等等

源自:http://www.fool2fish.cn/?p=290

0

[转载]苹果图标apple-touch-icon-precomposed和apple-touch-icon两种设置的区别探究_叛图的博客

mikel阅读(891)

[转载]苹果图标apple-touch-icon-precomposed和apple-touch-icon两种设置的区别探究_叛图的博客.

苹果safari浏览器当中apple-touch-icon-precomposed 和 apple-touch-icon属性是有区别的,之前在网上查了下相关的资料和苹果的开发文档手册,对这两中属性区别说的不够详细,导致现在大家开发的时候有些混淆。

苹果safari浏览器定义的这两种属性是为了苹果移动设备(ipod、ipad、iphone)对移动网站-mobile web进行收藏(“添加到桌面图标”)的时候增加的图标定义属性,当你建立一个移动网站(俗称:手机站,mobile web),避免不了为移动站的图标进行设置(这里有篇关于苹果meta设置详解的文章>>点击查看<<),在这篇文章当中尚未介绍这两中属性的区别,这篇文章就是弥补这一空缺。

图标设置的属性分为:

apple-touch-icon 和 apple-touch-icon-precomposed两种属性,从字面意思上可以看出,第一个是 “苹果移动设备图标”,第二个为“苹果移动设备初始图标样式”,由于第二个的意思完全搞不明白预设是预设的什么究竟有什么不同的地方,从官方资料当中也没有搞懂有什么明显的不同,通过实验得知了这两个明显的差异。

直接上图:

图片一:

从图中(图片一)右下角可以看出有两个Milanoo图标,分别是apple-touch-icon 和 apple-touch-icon-precomposed属性的图标,看出区别了没?

放大看大图:注意图标上面的光泽感,看明白了吧,使用apple-touch-icon属性 的明显比使用apple-touch-icon-precomposed图标多出一个高光,因为在ios系统中对icon有一套规范,就是在ios设备的 图标统一为“四边圆角”、“高光处理”,至于“图标阴影”,是ios设备中统一为所有桌面元素增加的,所以不作为图标单独处理的样式,由于在视觉上统一最 重要的是形状的统一,所以“圆角”是必须的,但是对于“高光”苹果没有做出特别的强调,所以苹果设置当中把“高光”作为可选项,就产生了apple- touch-icon 和 apple-touch-icon-precomposed属性。

结论:

  • 使用apple-touch-icon属性为“增加高光光亮的图标”;
  • 使用apple-touch-icon-precomposed属性为“设计原图图标”;

大家牢记了,说了通篇感觉最有用的就是最后两句。哈哈。

连接一下Mobile WEB开发的相关文章:

[转载]Bootstrap3.0学习第二轮(布局) - aehyok - 博客园

mikel阅读(1043)

[转载]Bootstrap3.0学习第二轮(布局) – aehyok – 博客园.

Bootstrap3.0系列导航

1.BootStrap学习从现在开始 http://www.cnblogs.com/aehyok/p/3381651.html

2.Bootstrap3.0学习第一轮(入门)  http://www.cnblogs.com/aehyok/p/3398359.html

通过前面两篇博文的简单介绍,大致对于Bootstrap有了初步的了解。由于自己也只是想通过Bootstrap官网来进行简单的学习,自己能够随便搞个不是太搓的页面就可以了。所以如果你是新手或许可以来看看,对你还有那么一点儿帮助,高手请飘过。

《学习第一轮》中也只是简单的介绍了如何下载文件,及进行引用下载的文件,还没有真正的进入前端的设计学习中。我也看到了广大博友们对 Bootstrap3.0也具有很大的兴趣,有之前就使用过的大牛,也有和我一样正打算学习一下的盆友、小菜。至于回复中比较多的就是:希望能有个系列, 当然我也很希望自己能很好的规划列一个系列,然后按照这个大纲进行即可。不过本人能力有限,所以只好跟随自己的喜好来进行学习了。

  声明:写作能力真是不济,还望各位看官见谅。如有错误,请及时通知,本人必会在最短的时间进行更正,当然更希望能有更多的人来一起学习。

栅格系统(布局)

Bootstrap内置了一套响应式、移动设备优先的流式栅格系统,随着屏幕设备或视口(viewport)尺寸的增加,系统会自动分为最多12列。

我在这里是把Bootstrap中的栅格系统叫做布局。它就是通过一系列的行(row)与列(column)的组合创建页面布局,然后你的内容就可以放入到你创建好的布局当中。下面就简单介绍一下Bootstrap栅格系统的工作原理:

  1. 行(row)必须包含在.container中,以便为其赋予合适的排列(aligment)和内补(padding)。
  2. 使用行(row)在水平方向创建一组列(column)。
  3. 你的内容应当放置于列(column)内,而且,只有列(column)可以作为行(row)的直接子元素。
  4. 类似Predefined grid classes like .row and .col-xs-4 这些预定义的栅格class可以用来快速创建栅格布局。Bootstrap源码中定义的mixin也可以用来创建语义化的布局。
  5. 通过设置padding从而创建列(column)之间的间隔(gutter)。然后通过为第一和最后一样设置负值的margin从而抵消掉padding的影响。
  6. 栅格系统中的列是通过指定1到12的值来表示其跨越的范围。例如,三个等宽的列可以使用三个.col-xs-4来创建。

DW6编码实现

Okay勒,下面开始写代码了额。首先上一张图看看我使用的编辑器,之前在学校学习Html+CSS的时候使用较多的工具。

 

 

然后新建一个HTML文档,选择类型HTML5

 

创建好后,另存为与上一节的讲解中js、css文件夹的同一目录下。

layout.html就是我刚刚创建的文件。Bootstrap.html也是上一节中创建的第一个html页面。

现在可以将Bootstrap.html中的代码全部Copy到layout.html页面。

然后在body标签下添加如下代码

复制代码
 <h1>Hello, world!</h1>
 <h2 class="page-header">区域一</h2>
 <p>Bootstrap has a few easy ways to quickly get started, each one appealing to a different skill level and use case. Read through to see what suits your particular needs.</p>
 <h2 class="page-header">区域二</h2>
 <p>If you work with Bootstrap's uncompiled source code, you need to compile the LESS files to produce usable CSS files. For compiling LESS files into CSS, we only officially support Recess, which is Twitter's CSS hinter based on less.js.</p>
 <h2 class="page-header">区域三</h2>
 <p>Within the download you'll find the following directories and files, logically grouping common resources and providing both compiled and minified variations.</p>
复制代码

这几个标签大家应该都能看的明白,最基础最简单的。

添加完后layout.html页面所有代码如下

复制代码
<!DOCTYPE html>
 <html>
 <head>
 <title>Bootstrap</title>
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <!-- Bootstrap -->
 <link href="css/bootstrap.min.css" rel="stylesheet" media="screen">

<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
 <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
 <!--[if lt IE 9]>
 <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
 <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
 <![endif]-->
 </head>
 <body>
 <h1>Hello, world!</h1>
 <h2 class="page-header">区域一</h2>
 <p>Bootstrap has a few easy ways to quickly get started, each one appealing to a different skill level and use case. Read through to see what suits your particular needs.</p>
 <h2 class="page-header">区域二</h2>
 <p>If you work with Bootstrap's uncompiled source code, you need to compile the LESS files to produce usable CSS files. For compiling LESS files into CSS, we only officially support Recess, which is Twitter's CSS hinter based on less.js.</p>
 <h2 class="page-header">区域三</h2>
 <p>Within the download you'll find the following directories and files, logically grouping common resources and providing both compiled and minified variations.</p>
 <script src="js/jquery-2.0.3.min.js"></script>
 <script src="js/bootstrap.min.js"></script>
 </body>
 </html>
复制代码

当然效果也很简单,我还是把截图放上,可以进行对比。

优化一:可以发现上图的页面效果占满全屏,我们可以通过Bootstrap 样式类对上面的内容进行居中。

 <div class="container">
  .........之前上面添加在body标签下的代码
</div>

效果如下

可以发现container这个类设置了宽度,并且可以让内容显示在页面的中间。

优化二:将三个区域显示在同一排,并且平均分成三栏。

首先为三个区域添加一个容器,可以使用div,并且为div添加一个类 <div class=”row”>.

然后我们为每个小的区域也添加一个容器div,并且为div添加一个类<div class=”col-xs-4″>

简单代码实现如下

复制代码
 <div class="container">
 <h1>Hello, world!</h1>
 <div class="row">
 <div class="col-xs-4">
     <h2 class="page-header">区域一</h2>
     <p>Bootstrap has a few easy ways to quickly get started, each one appealing to a different skill level and use case. Read through to see what suits your particular needs.</p>
 </div>
  <div class="col-xs-4">
     <h2 class="page-header">区域二</h2>
     <p>If you work with Bootstrap's uncompiled source code, you need to compile the LESS files to produce usable CSS files. For compiling LESS files into CSS, we only officially support Recess, which is Twitter's CSS hinter based on less.js.</p>
 </div>
  <div class="col-xs-4">
     <h2 class="page-header">区域三</h2>
     <p>Within the download you'll find the following directories and files, logically grouping common resources and providing both compiled and minified variations.</p>
     </div>
     </div>
 </div>
复制代码

 

效果如下

的确排成一列,然后分成三栏。再结合一下上面栅格系统的6部原理。是不是懂一点了,反正我自己懂了很多。通过同样的方式可以创建出比较复杂的网格布局页面。只需要在布局使用的容器上面添加相应的网格布局的类。比如说如果内容占用6个网格,那么就添加一个col-xs-6的类、占用四个网格就添加一个col-xs-4的类,然后在同一排的周围进行使用带有row类的容器。

总结

本节主要学习的布局(栅格系统),通过简单的实例来理解它的工作原理。

使用过的类有:

1..container:.container包裹页面上的内容即可实现居中对齐。在不同的媒体查询或值范围内都为container设置了max-width,用以匹配栅格系统。

      2..col-xs-4:这个类通过”-“分为三个部分,第三个部分的数字作为一个泛指,它的范围是1到12。就是可以把一个区域分为12个栏,这个要和row类联合使用。

其实这个布局很像HTMl中的Table布局TR行和TD列吧。

暂时的理解就这些,代码直接复制粘贴就可以看效果,当然首先要把预先的css、js文件进行准备。

[转载]用户十秒离开你网站的25个原因 - 商业计划 - 创业邦

mikel阅读(1398)

[转载]用户十秒离开你网站的25个原因 – 商业计划 – 创业邦.

是什么让人们在打开你的网页没多久就按下返回键?他们为什么那么快就想摆脱你的网站?可以做些什么来改善这一点呢?

长期思考这个问题之后,我发现了比原本想象的还要多的一些因素。

如果把一些因素单独考虑的话,可能还不至于让访问者产生迅速离开的冲动,但是如果这些因素掺杂在一起的话,却足以留给访问者一个足够坏的印象,让他们马上离开。

让用户在你的网站有个愉快的体验并不是件容易的事情。实际上大多数网站都会多多少少有些问题。但是看看下面这些负面因素并努力避免,或许可以对于做出更有用户黏性的网站有好处。

来,从最糟糕的开始说吧……

1.自动播放的声音

这真让我发狂。如果我访问网站时候立马遭到不想听的不必要的杂音的轰炸的话,我就想马上离开。接受这种自动播放声音的广告的发布者是最糟糕的发布者,(他们本可以拒绝这样的网站的,就像我一样),常见于酒店行业网站。

2.弹窗

老问题,大问题。因为我们视线里面,它从未消失。如果你想用弹窗弹我,那我就想被弹窗直接从你网站弹开算了。你越早用弹窗弹我,我越早离开。如果弹窗只显示半分钟一分钟,而且内容还能算是有用的话,还能稍微忍受一下。

3.插入式广告

我不再访问某个原因就是那儿插入式广告太多了。一周消息不如改名叫一周插入呢。没有人喜欢等待,但这跟期望的东西有差距。当我点击一个链接的时候,心里希望的是能直接被带到我点的那个网页,而不是被扔到一个挂着个大大的广告牌的页面。

4.分页

看 十张配着小标题的挺小的图片,你真的需要我连点十下翻十页么?或者翻十页只为了看个明明可以在一页内显示的前十名排行榜?分页在我看来就是个人为提高点击 率的低级伎俩。这种伎俩的存在,同时证明了在线广告的衡量和购买标准都是错误的。而且这也让很多站长都跑偏了——本应着重于内容的精力,都放在认为提高点 击率上了。

5.缓慢的载入

谁都不愿意等!我为我的50兆带宽付了那么多钱,可不是为了让你的慢死人的网页搞坏我的情绪的。如果我真心要看看你的网页,或者我真的必须看你的网页,或许还真的就那么等着。但是我要是只是好奇,或者手抖多点了一下到了你的网站,那我等不了几秒就闪了。

6.对于广告的优化大于对内容的优化

这 让人不爽的程度简直就跟漫长的载入时间一样。有些站长为了赚广告费,把广告的载入顺序优化,先载入广告后载入网站内容。有些时候是当我们等待着广告成功载 入的时候,导航栏在整个网页出现之前快速载入,然后一切都卡住了。总结一下这条,站长尤其要留意缓慢的广告服务器加上一个缓慢的网页的时候,所产生的神奇 效果。

7.糟糕的导航栏

作为一个职业网页设计师,设计糟糕的导航栏是少数能说得上来的致命伤之一。导航需要的是直观,描述的清晰,直来直去。基于Flash的网页往往是最糟糕的那些。

8.结构混乱

嘿,我就是想找到我的问题的答案而已。如果我不能快速有效的找到我想要的,我就去别的地方看了。你的工作就是要帮助人们过滤出他们需要的信息。这就是为什么存在优化和测试这种事。

9.关键信息的擅离职守

我最近访问了某酒店的网页,想知道在那里开个房得多少钱。找了几分钟之后我发现没有关于房费的信息。(呃,反正我没找到)。这太奇怪了。顺便说一句,我不可能就为了想知道房费多少,去点“订房”的。我不如直接去其他酒店订个房。记住,要确保基本信息在你的网站上都有。

10.过早的要求注册

为嘛?为嘛现在就得注册?连一点甜头都不让我尝么?时机非常的重要。

11.太多闪烁的滚动的玩意儿

我在上网,我可不想忍受到处是类似夜店里的那种闪烁不停的灯光。是的,又闪又滚是能抓人眼球,但总把人抓疼。这些东西绝望的想要引起人注意,同时又绝对的讨人厌。有个需要注意的特例是,有的人还就是好这口,只要是这样的风格他都爱!

12.拼写错误

错误拼写和错误语法会给访问者不好的印象。这种事情真的没有借口。只要多用些心在细节上了。如果你不在意你的网站,你的访问者会怎么想?

13.垃圾字体

你使用的是宋体?真哒?它很丑的啊。尽管如此吧,至少你用的不是漫画体。正常人不会纯粹因为一个网站字体好看与否而离开的,但是丑陋的字体会给人留下你对你的网站不上心的印象。这种印象再加上其他因素,可能就足以让本想在你网站待一待的人拔腿就走了。

14.网页很窄

还有为800像素宽度的显示器设计的网站呢,让我起鸡皮疙瘩。你不觉得?

15.左对齐网站

重申一下——我不知道具体该怎么解释——左对齐网站(相对于居中对齐)看起来太过时了,起码在我看来。我不知道为啥,但总能注意到这些东西,而且我不觉得这是好设计。

16.俗套的网站

有些网站我看着真是喜欢。事实上我希望所有的网站标准化,按照最经典的指南手册设计。但是如果网页设计都一样的话就行不通了。谁会想要作为一个模仿者出名呢?

17.年久失修

我希望在首页上能看到博客或者新闻版块,能看到这网站还在更新的迹象。显示个标题和日期就够了。如果我看到最新的新闻日期是好几个月前,那我可能立马就看别的网页去了。

18.主题模糊

访问网站的时候我希望是看一眼就能看出来这网站是干嘛的。有时候我挠头都看不出来网站是干嘛的。一行简单明白的描述就够了。

19.术语/行话

我觉得你可以私下里来这套。

20.浏览器不兼容

三天前,微软刚刚在XboxLive客户服务领域拒绝了对于谷歌浏览器Chrome的支持。这是个多方面的错误,特别是我还是个付费的XboxLive用户。测试,测试,测试,找出你的用户喜欢的感觉。尽量避免插手于浏览体验,比如说在新窗口打开链接。

21.Flash

有时候我会在Flash多的网站多呆一会儿,就像是路上有车祸把我堵在那里一样。但是大多数时候我就是简单的点一下返回键。我了解了一些Flash网站,几乎可以肯定地说,没有像样的。我只有在很特殊的情况下忍受这种网站。在这方面我是个强硬派。

22.没有“关于”页面

有些网站好像对“关于”页面过敏似的,我压根想不出来这是为什么。有时候我访问网站就是为了找到有关某些公司的更多的信息而已,看到没有“关于”页面的时候,真是万念俱灰。

23.只有视频的主页

用视频来介绍公司,或者用来解释某种具体的产品或者服务是一种新的趋势,特别是对于新公司。如果有空我还能看个三分钟的小短片,但是我觉得你总得配合点文字吧,更快捷,对网站的搜索优化也有好处。

24.很傻很业余

有的网站没有活力,没有个性,就是个穿着制服的模子。其他人好像远远的超过了你的网站的境界,而你都不知道怎么赶上。这两方面都会是你的网站的后腿,把你的访问者往外推。

25.配色失败

糟糕的配色会让你网站上的内容很难读。而如果你的网站读都不能读的话就更别想着别人会在你网站上待着了。

各种各样的原因让人们在还没有真正了解一个网站的时候就把网页直接关掉了。

那么我少说哪种了?你是为什么离开一个网页的?

[转载].net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串 - szyuxueliang - 博客园

mikel阅读(1225)

[转载].net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串 – szyuxueliang – 博客园.

1.继承
(1)创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间,也会为父类的所有字段开辟空间,只不过父类私有的成员访问不到
(2)子类从父类继承父类所有的非私有成员,但是父类的所有字段也会创建,只不过父类私有的成员访问不到
(3)base关键字可以调用父类的非私有成员
(4)子类的访问级别不能比父类高,原因是访问子类的同时也访问了父类,如果子类的访问级别不能比父类高,就矛盾了
(5)创建子类的时候,会先调用子类的构造函数,然后调用父类的构造函数,然后执行父类的构造函数,最后再执行子类的构造函数
(6)子类的构造函数后面默认加了一个:base()通过这个调用父类的无参构造函数,如果父类没有无参数的构造函数,将会报错,因为子
类的构造函数默认会调用父类的无参数的构造函数
(7)使用base关键字可以显示的指定子类构造函数调用父类的构造函数
(8)继承的特征:
单根性:类只能有一个父类
传递性:子类继承父类所有的非私有成员
(9)父类与子类存在同名成员的时候,如果创建一个子类对象,调用这个子类对象的同名方法会调用子类的
(10)new关键字的第2作用隐藏父类的同名成员

2.里氏替换原则LSP
子类可以替换父类的位置,并且程序的功能不受影响
Person p = new Student();
p.SayHi();//这个是调用Person的SayHi()
如果一个父类变量指向的是子类对象,将这个父类对象转换为子类对象不会报错
Person p = new Student();
Student s = (Student)p;这种类型转换不会报错

如果一个父类变量指向的就是一个父类对象,将这个父类对象转换为子类对象会报错
Person p = new Person();
Student s = (Student)p;这种类型转换会报错

3.虚方法 virtual关键字
如果子类重写了父类的虚方法,那么通过父类变量来调用这个方法的时候会调用子类的,如果没有,则会调用父类的

4.多态
同一种行为,对于不同的事物,有不同的表现形式
多态的表现形式之一:将父类类型作为方法的参数,屏蔽多个子类的不同,将多个子类当成父类来统一处理
多态的表现形式之二:将父类类型作为方法的返回值

5.抽象类、抽象方法
(1)抽象方法用abstract关键字修饰,抽象方法不能有方法体,抽象方法必须在抽象类中
(2)抽象类不能实例化,因为有抽象成员,而抽象成员没有方法体的
(3)如果子类继承抽象类,子类必须重写父类的抽象方法
(4)抽象类中可以拥有非抽象成员,为了继承给子类
(5)当子类必须重写父类的方法或者父类没有必要实例化就用抽象类

6.Equals
object类里面的equals方法是比较两个对象的引用地址,如果引用地址是一样的返回true
string str1 = “abc”;
string str2 = “abc”;
str1.Equals(str2);//返回True,这个Equals方法是string类的,string类的Equals方法是比较两个字符串的内容是否相同

int a = 1;
int b = 1;
a.Equals(b);//返回True
值类型Equals方法比较的是两个结构对象里字段的值(这个时候不存在重写,只是值类型自己新增的一个Equals方法)
所以:
引用类型的Equals方法默认比较的是两个对象的引用地址
string类型,值类型的Equals方法比较的是两个结构对象里字段的值

7.接口
(1)接口表示具有某种能力
(2)接口的本质是一个特殊的抽象类
(3)接口中的成员默认就是抽象的
(4)接口中只能定义方法、属性、事件、索引器
(5)接口中抽象成员不能有访问修饰符,默认就是public
(6)接口就是一个纯粹的为了规范实现类的
(7)string Name{get;set;}这个在接口中不是一个自动属性,是一个普通的属性,只不过get set方法没有实现
(8)什么时候使用抽象类:可以找到父类,并且希望通过父类继承给子类一些成员
什么时候使用接口:多个类具有相同的方法,但是却找不出父类
(9)显示实现接口:是为了解决方法名冲突的问题,显示实现的接口的方法是私有的,所以不能通过对象的变量来调用
(10)显示实现接口:这个接口的实现方法只能通过接口变量来调用
(11)要避免定义多功能接口,以免造成接口污染

8.装箱拆箱
装箱:值类型转化为引用类型int i = 12; object obj = i;
拆箱:引用类型转换为值类型 int j = (int)obj;
装箱和拆箱是比较消耗性能的,要尽量去避免装箱和拆箱操作

9.字符串
(1)字符串是特殊的引用类型
(2)字符串我们可以看做是一个字符数组string str = “abcd”;char c = str[0];
(3)字符串对象一旦创建,这个对象就不能被修改
(4)在创建一个字符串对象的时候,会先去字符串拘留池中寻找是否有相同字符串内容的对象,如果有就直接让变量指向这个对象,如果没
有再创建新的对象
比如:string s1 = “a”; string s2 = “b”; s1 = “b”; s1的引用地址和s2的引用地址是相同的,都指向字符串拘留池中的“b”,不会再创
建一个“b”
(5)字符串对象一旦创建,不会被GC回收,因为微软就认为字符串是常用的
(6)字符串常用的方法、属性:
String s = new String(new char[]{‘a’,’b’});//构造函数只能传递字符数组
int i = s.Length
string s = string.Empty代表一个空的字符串 “”,不是指的null string.Empty等于””,推荐使用string.Empty;为了防止不会写错
int i = string.Compare(s1,s2);比较两个字符串的大小,返回-1,0,1
string s = string.Concat(s1,s2)连接字符串并组成一个新的字符串
bool b = s.Contains(“ab”);判断字符串里面是否包含指定的字符串
b = s.EndWith(“b”);判断字符串是否以指定的字符串结尾
b = s.StartsWith(“a”);判断字符串是否以指定的字符串开始
int i = s.IndexOf(‘a’);查找指定的字符或者字符串在字符串中的索引,如果没有返回-1
int i = s.LastIndexOf(‘!’);从字符串的结尾往前面查,第一次字符串出现的索引
string s = s.Insert(1,”c”);在字符串的指定位置插入字符串
char[] c = s.ToCharArray()将字符串转换为字符数组
还有好多方法就不写了
(7)StringBuilder
StringBuilder这个类的对象是可变的,当改变这个对象的字符串时,不会新开辟空间,而是直接改变。

10.Stopwatch watch = new Stopwatch();//计时器
watch.Start();
watch.Stop();
watch.ElapsedMilliseconds毫秒数

[转载]在VS项目中使用SVN版本号作为编译版本号 - ziyunhx - 博客园

mikel阅读(799)

[转载]在VS项目中使用SVN版本号作为编译版本号 – ziyunhx – 博客园.

在实际项目中(特别是作为产品的项目),版本号是必不可少的一部分。版本号的规则也有许多种,在此不讨论具体的编码规范。对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不同(基于定制需求)时,清楚的标识组件与代码对于的关系十分重要。

本文主要说明如何在 .Net 项目使用 SVN 作为版本控制工具时生成与代码对应的组件版本号。

我们知道,SVN 在 commit 时会生成一个4位数字的序号,所以基本思路是把这个序号作为 . Net 项目编译后生成dll的文件版本号的最后一段。下面所列方法需要使用到TortoiseSVN 提供的 SubWCRev.exe 

首先,我们需要通过注册表查找 TortoiseSVN 的安装目录。

复制代码
1 Rem Search TSVN Path
2 For /f "tokens=*" %%i In ('Reg Query HKLM\Software\TortoiseSVN /v Directory') Do (
3   ECHO %%i | Find "Directory">NUL
4   IF %ERRORLEVEL% == 0 (For /f "tokens=1,2,*" %%j In ("%%i") Do (SET TSVN_PATH=%%1))
5 )
6 SET TSVN_PATH=%TSVN_PATH%bin\SubWCRev.exe
复制代码

SubWCRev 是通过替换文件中指定的关键字来实现获得 commit 序号的,点击查看详细的列表。 

然后我们建立以一个 AssemblyInfo.tpl 作为替换使用的模板,由于 AssemblyInfo.cs 中除了固定的值外还有类似 GUID 变化的值,所以我们不能全部替换,因此仅将需要修改的部分放在 tpl 中,内容如下:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

 接下来使用批处理替换原来的 AssemblyInfo.cs 文件,为了在每次编译时都自动替换,我们把调用批处理的命令卸载项目生成事件的生成前事件中,例如下面这样:

“$(TargetDir)BeforeBuildProject.bat” “$(ProjectDir)” “$(TargetDir)AssemblyInfo.tpl” .\Properties\AssemblyInfo.cs

$(TargetDir)表示编译输出目录,更多可用全局变量请在生成事件中点击“宏”查看。

 替换 AssemblyInfo.cs 的批处理代码:

复制代码
 1 SET WorkDir=%1
 2 SET Template=%2
 3 SET target=%3
 4 SET AssemblyInfo=ASSEMBLY_INFO.tmp
 5 
 6 PushD %WorkDir%
 7 SET WorkDir=.\
 8 
 9 Rem Generate a template file
10 FindStr /v "AssemblyVersion AssemblyFileVersion" %target% > %AssemblyInfo%
11 FindStr ".*" %Template% >> %AssemblyInfo%
12 
13 Rem Using TSVN Replace Tlp
14 "%TSVN_PATH%" %WorkDir% %AssemblyInfo% %target%>NUL
复制代码

 当然这样还不是一劳永逸,你会发现每次编译 AssemblyInfo.cs 文件都会变化,因此你的 commit 序号也要一直跟着增加,这并不是我们所想要的效果。这里提出一种解决方案,在每次替换后生成 dll 后又将 AssemblyInfo.cs 还原回去。

为此,我们在生成前事件中增加备份命令:

COPY /y “%target%” “%target%.bak”>NUL

然后增加生成后事件,调用命令为:

“$(TargetDir)AfterBuildProject.bat” “$(ProjectDir)Properties\AssemblyInfo.cs”

 在 AfterBuildProject.bat 中我们需要完成还原  AssemblyInfo.cs 和删除备份文件的工作,代码如下:

1 SET target=%1
2 COPY "%target%.bak" %target%
3 DEL /Q "%target%.bak" 2>NUL

就此,每次编译时,系统都会自动将 commit 序号放到 dll 的文件版本中了。

完整代码下载:点击下载

本文来自 NewIdea 的博客,作者 ziyunhx 。

原文地址:http://www.cnblogs.com/NewIdea/p/AutoVersion.html

转载请注明出处,否则拒绝转载!

[转载].net泛型理解 - lhb62232397 - 博客园

mikel阅读(886)

[转载].net泛型理解 – lhb62232397 – 博客园.

泛型简介:

泛型(Generic Type)是.NET Framework2.0最强大的功能之一。泛型的主要思想是将算法与数据结构完全分离开,使得一次定义的算法能作用于多种数据结构,从而实现高度可重用 的开发。通过泛型可以定义类型安全的数据结构,而没有必要使用实际的数据类型,这将显著提高系统性能并得到高质量的代码(因为可以重用数据处理算法,没有 必要复制类型特定的代码)。

 

泛型工作原理:

通过泛型可以定义类型安全并且对性能或工作效率无损害的类。表面上,C#泛型 的语法和C++模板类似,但编译器在实现和支持他们的方式存在重要的差异。与C++模板相比,C#泛型可以提供增强的安全性,但在功能方面也受到某种程度 的限制。在一些C++编译器中,在通过特定类型使用模板类之前,编译器甚至不会编译模板代码,当确实指定了类型时,编译器会以内联方式插入代码,并且将每 个出现一般类型参数的地方替换为指定的类型。此外,每当使用特定类型时,编译器都会插入特定于该类型的代码,而不管是否已经在应用程序的其他位置为模板类 指定了该类型,其中C++链接器负者解决该问题,但并不总是有效,而这也可能会导致代码膨胀,从而增加加载时间和内存足迹。

  在.net Framewrok 2.0 中,泛型在IL和CLR本身中具有本机支持。在编译泛型C#代码时,像其他任何类型一样,首先编译器会将其编译为IL,但是,IL只包含实际特定类型的参 数或占位符,并有专用的IL指令支持泛型操作。泛型代码的元数据中包含泛型信息。真正的泛型实例化工作是以“on-demand”的方式,发生在JIT编 译时。当进行JIT编译时,JIT编译器用指定的类型实参来替换泛型IL代码元数据中的T,进行泛型类型的实例化。这会像JIT编译器提供类型特定的IL 元数据定义,就好像从未涉及到泛型一样。JIT编译器可以确保参数正确性,实施类型安全检查,甚至执行类型特定的IntelliSense。

  当.net将泛型IL代码编译为本机代码时,所产生的本机代码取决于指定的类 型。JIT编译器跟踪已经生成特定类型的IL代码,如果本机指定的是值类型,则JIT编译器将泛型类型参数替换为指定的值类型,并且将其编译为本机代码。 如果JIT编译器用已经编译为本机代码的值类型编译泛型IL代码,则只返回对IL代码的引用。因为JIT编译器在以后的所有场合中都将使用相同的值类型特 定的IL代码,所以不会存在代码膨胀问题。如果本机指定的是引用类型,则JIT编译器将泛型IL嗲没种的泛型参数替换为object,并将其编译为本机代 码。在以后的任何针对引用类型而不是泛型类型参数的请求中,JIT编译器只会重新使用实际代码,使用该代码,实例仍然按照它们离开托管堆的大小分配空间, 并且不会存在强制类型转换。

 

泛型实现:

C#泛型支持包括类、结构、接口、委托四种泛型类型,以及其方法成员。此次,只以泛型类做简单演示:

复制代码
class Program
    {
        static void Main(string[] args)
        {
            int obj = 1;
            Test<int> testInt = new Test<int>(obj);
            Console.WriteLine(testInt.obj);//1

            string obj1 = "hello";
            Test<string> testString = new Test<string>(obj1);
            Console.WriteLine(testString.obj);//hello

            Console.Read();
        }
    }

    class Test<T>
    {
        public T obj;
        public Test(T obj)
        {
            this.obj = obj;
        }
    }
复制代码

 

泛型约束:

  在指定一个类型参数时,可以指定类型参数必须满足的约束条件。这里通过指定类型参数时使用where子句来实现的。泛型约束有:基类约束、接口约束、构造函数约束、引用类型和值类型约束。下面简单一一介绍:

基类约束:

使用基类约束,可以指定某个类型实参必须继承的基类。
基类约束有两个功能:
(1)它允许在泛型类中使用由约束指定的基类所定义的成员。例如,可以调用基类的方法或者使用基类的属性。如果没有基类约束,编译器就无法知道某个类型实参拥有哪些成员。通过提供基类约束,编译器将知道所有的类型实参都拥有由指定基类所定义的成员。
(2)确保类型实参支持指定的基类类型参数。这意味着对于任意给定的基类约束,类型实参必须要么是基类本身,要么是派生于该基类的类,如果试图使用没有继承指定基类的类型实参,就会导致编译错误。
基类约束使用下面形式的where子句:where T:base-class-name
T是类型参数的名称,base-class-name是基类的名称,这里只能指定一个基类。

复制代码
class A
    {
        public void Func1()
        { }
    }

    class B
    {
        public void Func2()
        { }
    }

    class C<S, T>
        where S : A
        where T : B
    {
        public C(S s,T t)
        {
            //S的变量可以调用Func1方法
            s.Func1();
            //T的变量可以调用Func2方法
            t.Func2();
        }
    }
复制代码

接口约束:

接口约束用于指定某个类型参数必须应用的接口。接口的两个主要功能和基类约束完全一样。基本形式 where T:interface-name
interface-name是接口的名称,可以通过使用由逗号分割的列表来同时指定多个接口。如果某个约束同时包含基类和接口,则先指定基类列表,再指定接口列表。

复制代码
interface IA<T>
    {
        T Func1();
    }

    interface IB
    {
        void Func2();
    }

    interface IC<T>
    {
        T Func3();
    }

    class MyClass<T, V>
        where T : IA<T>
        where V : IB, IC<V>
    {
        public MyClass(T t,V v)
        {
            //T的对象可以调用Func1
            t.Func1();
            //V的对象可以调用Func2和Func3
            v.Func2();
            v.Func3();
        }
    }
复制代码

构造器约束:
new()构造函数约束允许开发人员实例化一个泛型类型的对象。
一般情况下,我们无法创建一个泛型类型参数的实例。然而,new()约束改变了这种情况,它要求类型参数必须提供一个无参数的构造函数。在使用new()约束时,可以通过调用该无参构造函数来创建对象。基本形式: where T : new()
使用new()约束时应注意两点:
(1)它可以与其他约束一起使用,但是必须位于约束列表的末端。
(2)new()仅允许开发人员使用无参构造函数来构造一个对象,即使同时存在其他的构造函数。换句话说,不允许给类型参数的构造函数传递实参。

复制代码
class A
        {
            public A()
            { }
        }

        class B
        {
            public B()
            { }
            public B(int i)
            { }
        } 
        class C<T> where T : new()
        {
            T t;
            public C()
            {
                t = new T();
            }
        }

        class D
        {
            public void Func()
            {
                C<A> c = new C<A>();
                C<B> d = new C<B>();
            }
        }
复制代码

值类型和引用类型约束:
如 果引用类型和值类型之间的差别对于泛型代码非常重要,那么这些约束就非常有用。 基本形式: where T : class where T : struct 若同时存在其他约束的情况下,class或struct必须位于列表的开头。另外可以通过 使用约束来建立两个类型参数之间的关系 例如 class GenericClass2<T, V> where V:T{} ——– 要求V必须继承于T,这种称为裸类型约束(naked type constraint)。

复制代码
public struct A { }
        public class B { }

        public class C<T> where T : struct
        {

        }

        C<A> c1 = new C<A>();
        C<B> c2 = new C<B>();//error
复制代码

 

泛型的优点:
   泛型使代码可以重用,类型和内部数据可以在不导致代码膨胀的情况下进行更改,而不管是值类型还是引用类型。可以一次性地开发、测试和部署代码,通过任何 类型(包括将来的类型)来重用它,并且全部具有编译器支持和类型安全。因为泛型代码不会强行对值类型进行装箱和取消装箱,或者对引用类型进行向下强制类型 转换,所以性能得到显著提高。对于值类型,性能通常会提高200%;对于引用类型,在访问该类型时,也可以达到预期性。

简单来说:使用泛型,可以极大地提高代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱、拆箱,在一定程度上提升了应用程序的性能。

再简单点:可重用、类型安全、高效率。

[转载]cocos2d-x开发记录:二,基本概念(骨骼动画) - jy02432443 - 博客园

mikel阅读(1070)

[转载]cocos2d-x开发记录:二,基本概念(骨骼动画) – jy02432443 – 博客园.

九,骨骼动画

1.骨骼动画vs Sprite sheets

你能使用sprite sheets 创建动画,它很快又容易。直到你意识到你的游戏需要大量的动画并且内存消耗越来越高,并且需要时间载入全部数据。为了限制大小,你需要为动画限制到比较低的FPS,然后动画看起来不会如你所期望的那么平滑。这时你就需要骨骼动画了。

 

2.骨骼动画简介

骨骼动画在cocos2d-x动画是一个技术,一个角色由两部分组成:一个显示的表皮和类似人骨头样的网格。

Cocos2d-x提供了一种方式来在你的应用程序中使用2 D骨骼动画。骨骼动画设置的过程可能有些复杂,但使用起来很容易,当然有一些工具能简化这个过程。当使用骨骼动画时,动画是由几个骨头批次连接组成。影响 一个骨头也会影响它下面的所有子元素。通过在每个骨头不同的组合转换,你可以获得不同姿势的骨架。

如果对于一个时间点的每个骨骼使用某个转换定义关键帧,你能插入关键帧来让骨骼动画更为平滑。附加代码中,我使用一个类,名叫 Transformation,它包含2D转换数据,如平移,旋转,缩放。然后一个关键帧通过一个帧数被定义成一个这样的转换。一个关键帧定义了一个 KeyframeAnimation的集合。最后一个SkeletonAnimation是一个KeyframeAnimations集合,一个用于每个 骨骼。另外,你使用一个骨骼,保持关节的列表定义骨骼的层次结构。不同于sprite sheets每个骨头分配特定的纹理,如下图所示:

3.骨骼动画的工具

据我们所知,CocosBuilder 是一个很好的免费的创建骨骼动画的工具。CocosBuilder于JavaScript绑定构建Cocos2d,这意味着你的代码,动画,接口将会在cocos2d-x中无修改运行。
4.使用cocosbuilder动画

你能使用CocosBuilder来创建角色动画 ,场景动画或任何你能想象到的动画。动画编辑器已经完全支持多个解决方案,关键帧,骨骼动画和多个时间线等。在主窗口的底部你可以找到时间轴。你使用时间线来创建你的动画。

默认情况下你的ccb-file文件有一个单独的10秒长度的时间线。CocosBuilder编辑动画在每秒30帧的帧率下,当你在 cocos2d中你的应用在播放动画时,却是60帧/每秒(默认)。当前时间显示在右上角,格式为分钟:秒钟:帧。蓝色的垂直线显示当前时间。点击 time显示改变当前时间线的间隔。

 

5.添加关键帧

在CocosBuilder中动画是基于关键帧的。你能添加关键帧到不同属性的一个节点中并且CocosBuilder会自动插入到关键帧之间,任 意不同类型的容位中。为了添加一个关键帧,首先通过点击名字右边的三角形来展开视图节点。它会展示所有的节点动画属性。取决于你选择的节点类型,动画会有 略微不同。一旦属性可见,那么你能点击时间线中用可选的属性。在点击的时候这会创建一个新的关键帧。或者,你可以通过选择一个节点创建一个新的关键帧,然 后选择插入关键帧动画菜单。如果你在画布局域转换一个节点,关键帧会自动添加到当前时刻,考虑到转换后的属性在时间轴上已经有一个或多个关键帧。

 

6.编辑关键帧

你编辑一个特定节点的关键帧通过移动时间标记到关键帧的时刻并选择这个节点。通过双击它你能集中一个关键帧。通过拖动它们周围的选择框,你能选择关 键帧并且一起移动它们。你也可以在节点之间复制和粘贴关键帧。在粘贴关键帧时确保你仅有一个已选择的关键帧。这个关键帧将会粘贴到时间标记是起始位置。如 果你选择一组关键帧,那么通过选择反向选择关键帧动画菜单可以扭转他们的顺序。使用拉伸选择关键帧选项来加快或减慢一个动画的一个比例系数。

 

7.导入一个图像序列

如果你有一个通过sprite创建出来的帧动画,它被乏味到移动到时间线每一个帧中。CocosBuilder简化了这个过程通过自动导入一个图像 序列。在工程视图的左手边选择你想要导入的关键帧,然后在时间线上选择一个CCSprite。现在在动画菜单中选择Create Frames from Selected Resources。这关键帧将会自动被创建在标记的起始位置。如果你需要让动画慢下来,选择新创建的关键帧并使用Stretch Selected Keyframes命令

8.使用 Easing

CocosBuilder提供一个可选的cocos2d提供的easings子集。在2个关键帧中右键并选择你想要应用的easing。

一些easings有额外的选项,在easing之后你能再次点击右键运用

 

9.使用多个时间线

CocosBuilder的动画编辑器一个非常强大的特性就是在一个单一的文件中可以有多个时间线。你能为不同的序列命名并使用它们的名字在代码中播放它们。在不同的时间线中它们也能平滑的转换。

使用时间线弹出菜单,选择,添加,编辑你的时间线。

在编辑时间线的对话框中你能获得你时间线的概述并重命名它们,添加新的一个并设置一个时间线当ccbi-file装入你的应用程序直接自动开始播放。

在时间线中没有关键帧设置可以跨时间线来共享它们的属性值。例如,如果你在一个时间线中移动一个节点,只要它们没有一个关键帧设置position属性,它将被移到所有时间线中。有时添加一个单一的关键帧到一个属性中,为一个特定的时间线,覆盖了共享值是很有用的。

 

10.链接时间线

你可以自动播放时间序列通过链接它们。你还可以使用这个特性来自动循环的时间表。

在有时间线的播放序列中,点击No chained timeline文本并选择你想要播放当前帧之后的时间线。

 

11.在代码中播放动画

以编程方式控制你通过CocosBuilder创建的动画,你就需要找到CCBAnimationManager。当ccbi-file被载入时,动画manager将分配到节点userObject。

CCNode *myNodeGraph = ccbReader->readNodeGraphFromFile("myFile.ccbi", this);

 

动作管理器将返回一个autoreleased对象。播放一个特定的时间线调用runAnimationsForSequenceNamed方法。如果一个时间线是当前正在被播放,当调用这个方法时,它将立即停止。

animationManager->runAnimationsForSequenceNamed("My Timeline");

 

还有一种可选的情况,你能使用一个在间隔时间期间到平滑转换的新时间线。在可能的情况下线性加速器将被用于转换。

animationManager->runAnimationsForSequenceNamedTweenDuration("My Timeline",0.5f);

 

也可以检索一个回调,每当一个时间线完成播放时。在序列中你将接收这些回调,即使另一个时间线被链接了。使用CCBAnimationManagerDelegate来接收这些回调。

[转载]大型网站--前端性能优化和规范 - 贤达 - 博客园

mikel阅读(943)

[转载]大型网站–前端性能优化和规范 – 贤达 – 博客园.

大型网站–前端性能优化和规范

2013-10-28 09:00 by 贤达, 1026 阅读, 7 评论, 收藏, 编辑

  Web性能涉及的范围太广,但一般web开发者在程序上线以后很多都曾遇到过性能的问题。普遍表现为页面速度开始急剧变慢,正常访问时间变的很长,或则干脆给你抛出异常错误页面。这里会涉及到很多可能发生的情况,举例几个最主要发生的情况:
 * 数据库连接超过最大限制,一般表现为程序的连接池满,拒绝了与数据库的连接。
 * 数据库死锁
 * Web Server 超过最大连接数(一般在虚拟主机上才会限制)
 * 内存泄漏
 * Http连接数太多,即访问量超过了机器和软件设计正常所能提供的服务
而今天分享的主要是比较偏向前端

浏览器请求和响应的过程

浏览器请求加载前过程

第一步、浏览器预处理

查询Cache:读取Cache 或者发送304请求

第二步、查询DNS

优化规则–减少DNS查找

DNS缓存

浏览器DNS缓存 计算机DNS缓存 服务器DNS缓存(TTL)

使用Keep-Alive特性
减少DNS查找

当客户端的DNS缓存为空时,DNS查找的数量与Web页面中唯一主机名的数量相等。减少唯一主机名的数量就可以减少DNS查找的数量。

较少的域名来减少DNS查找(2-4个主机)

第三步、建立连接

优化规则– 使用内容分发网络

美国十大Internet网站和CDN服务提供商

页面静态化,取决于发布系统

Ctrip使用的China-Cache和网宿

优化规则–用域名划分页面内容 

按页面内容划分域名,在合适的资源服务器上存放文件

第四步、发送请求

优化规则– 减少HTTP请求

HTTP请求30-40,合并文件,图片地图,内联图像

a)js文件(不超过7个)

1.tuna_090501_base.js和tuna_090501_module.js(拆分tuna_090501.js)
2.数据文件js(1-2个)
3.频道公用js(1个)和页面私有js(1-2个)

不含ga.js、uiscript.asp和外链其他网站的js

b) css文件不超过4个,各频道首页和全站首页不超过3个。

 

c) 目前无法解决的是allyes广告的请求数。

• 大量的广告和产品图片可能会造成,图片请求数很大,可能造成总请求数指标吃紧,

这个只能从设计上搞定,需要权衡

• 目前老页面可能css和js文件请求数可能会超标

 

优化规则- – 优化CSS Spirite

图片地图   Ctrip首页例子

优化规则– 避免404错误

避免内部无效的链接

规则优化 –不要使用frameset,少使用iframe

搜索引擎不友好、

即时内容为空,加载也需要时间、会阻止页面加载

禁止使用iframe引入外部资源,不包括allyes广告,不包括about:blank的空页面。

第五步、等待响应

优化规则 –避免重定向

在重定向完毕并且HTML下载完毕之前,是没有任何东西显示给用户的
涉及服务器负载、数据查询、服务器端缓存等

第七步、接收数据

优化规则 — 压缩组件

HTML文档、脚本和样式表、XML和JSON的文本响应 压缩如何工作
压缩通常能将响应的数据量减少将近70%

优化规则 — 精简JavaScript和Css

从代码中移除不必要的字符以减少其大小,减少加载时间。

规则规则– 尽量缩减页面大小

页面必须小于150K(不含图片)
a) 静态文件是否gzip
b) 图片是否压缩优化过

第八步、读取Cache

优化规则– 添加Expire或Cache-Control

应用于不经常变化的组件,包括脚本、样式表、Flash组件、图片
Expires和Cache-Control

规则规则 — 使用外部的Js和Css文件

尽可能使用外部Js和Css,因为我们目前大部分Js和Css都做了Gzip和缓存技术,可以充分利用。

第九步、处理元素

不要对image和pdf等二进制文件进行gzip压缩

 第十步、渲染元素

优化规则 — 将样式表放在顶部

界面原型页面必须将样式表置于页面顶部,开发人员如无特殊原因也必须将样式表置于顶部。

以往多数是因为masterpage原因无法将所有样式表置顶,在改版修改masterpage时,尽可能按照此原则进行设计。

优化规则 – 建议将脚本放在底部

一般浏览器可以允许并行下载,取决于主机个数、带宽等

(默认情况下,IE是2个而FF是8个)

下载脚本时并行下载实际上是被禁用的。
 

优化规则– 移除重复脚本

必须为0

优化规则 — 避免CSS表达式

影响浏览器渲染时间

优化规则 – 优化图像

尽量使用GIF和PNG

尽量使用png/gif格式的图片,png的图片优先,但是必须注意如要兼容IE6,则png使用一定要注意透明问题。

图片在上次前一定要先用工具压缩优化(png、jpg)

 JavaScript开发规范

大型的项目在前端 JS 方面有几个需要达成的目标: 

  1. 代码逻辑分层
  2. 避免全局变量
  3. 便于多人协作开发
  4. 各部分代码模块化,可以按需加载
  5. 保持全局变量的清洁
  6. 可进行单元测试

推荐书籍

Steve Souders (Yahoo!   Chief Performance)

Greyhound 灵缇犬 (世界上跑的最快的狗)

转帖注明:http://www.cnblogs.com/and/p/3390676.html

[转载]IOS应用开发windows下环境搭建 - 人人小站

mikel阅读(1207)

[转载]IOS应用开发 – 人人小站.

环境搭建

 

————————————- 
PC机上安装MAC OS X系统有两种方法: 
方法一:在硬盘上分区,专门安装MAC OS X 
方法二:在现有Windows系统中,使用VMWare等虚拟机软件安装Mac OS 
注意:一般都需要将苹果系统的DMG光盘镜像文件刻录到D9光盘上,这个步骤比较麻烦。 
本文介绍一下在Windows XP中使用VMWare虚拟机,安装MAC OS X时,无需刻录D9光盘,无需转换成ISO格式, 
直接使用MAC OS XiPhone SDKDMG镜像文件进行安装的方法。 
————————————– 
安装软件: 
Windows XP
 
VMware
VMware-workstation-7.0.0-203739 EXE安装文件 
Mac OS
Mac_OS_10.6_Snow_Leopard_10.6 DMG光盘镜像文件 
iPhone SDK
iphone_sdk_3.1.2_with_xcode_3.2.1 DMG光盘镜像文件 
Darwin.iso
Rebel EFI.iso 引导光盘ISO镜像文件 
————————————– 
1
.下载安装包 
1.1.
下载VMWare 7.0 
这里是VMware-workstation-7.0.0-203739标准版.exe的链接,可以用迅雷下载: 
https://download2.vmware.com/software/wkst/VMware-workstation-7.0.0-203739.exe?HashKey=1338595dbfed5502d44e5506520145fe&ext=.exe&AuthKey=1258895780_40bddf08d507e11e4cb51f2f729cced0&ext=.exe (这个。。我用最新没安装成功,但是最新版支持MAX OS)

1.2.下载Mac OS 
这就是苹果的操作系统。本文下载的是LeoSnowMac OS 10.6 
这个链接可以用迅雷下载: 
ftp://snowleoparddown.maiyadi.com/Mac_OS_10.6_Snow_Leopard_10.6_Retail_maiyadi.dmg (自己百度。。)

1.3.下载iphone SDK 
“iphone_sdk_3.1.2_with_xcode_3.2.1__snow_leopard__10m2003.dmg”
 
这个链接可以用迅雷下载: 
http://ipsw.info/iphone_sdk_3.1.2_with_xcode_3.2.1__snow_leopard__10m2003.dmg (找程若谷同学要3.5G最新版!!!)

1.4.下载iphone SDK 
Darwin.iso
Rebel EFI.iso 用于引导光盘ISO镜像文件。(这个在爱问知识人上有)
————————————– 

2.安装虚拟机VMWare7.0 
2.1
安装虚拟机 
Windows XP上安装虚拟机:VMWare Workstation 7.0 
本文安装的是VMware-workstation-7.0.0-203739 

2.2 创建虚拟机 
使用File->New->Virtual Machine创建一个虚拟机。 
在选择操作系统时,选择Other->FreeBSD 64-bit 

2.3虚拟机设置 
1.CPU
设置为1核即可,2核也可以。 
2.
内存建议设置为:1024MB 
3.
硬盘最少分配15GB 
4.
删除软驱。 
可以在Customize Hardware选项中,将软驱删除,因为我们不会再用软驱。 

2.4虚拟机修改 
在刚建立的虚拟机目录下找到一个扩展名为.vmx的文件, 
用记事本或者UE打开,找到guestOS = “freebsd-64”一行, 
将引号中的freebsd-64改为darwin10 
修改完后是:guestOS = “darwin10”,保存修改后的文件。 
现在,在虚拟机的Options->General选项, 
就可看到操作系统版本显示为:MAC OS X Server 10.6 
若仍显示为FreeBSD 64-bit,则需要重启一下虚拟机VMWare 
若后面无法启动MAC OS X安装程序,很可能是忽略了这步或者修改错了。 
————————————– 

3.在虚拟机VMWare7.0上安装Mac OS 
本文安装的是leosnow即:Mac OS 10.6 

3.1Darwin.iso或者Rebel EFI.iso镜像进行引导。 
先装载镜像文件:在刚才建立的虚拟机Settings->Hardware中, 
选择CD/DVD(IDE)设备, 
选择右侧的Use ISO image file 
Browse加载Darwin.isoRebel EFI.iso 

装载完镜像文件后,现在启动虚拟机。 
先演示使用Rebel EFI镜像启动,引导完成后按照提示进行。 
按照屏幕提示等待10秒或者按‘1’键,选择当前光盘驱动器。 
这里提示请插入MAC OS XDVD光盘。 
此时我们再次打开这个虚拟机的Settings->Hardware 
找到CD/DVD(IDE)设备(你可以双击VMWare窗口右下角的光盘图标来快速打开,如图:), 
将刚才的Rebel EFI镜像替换为苹果系统的DMG镜像; 

Browse,将文件类型CD-ROM images(*.iso)改为All files (*.*)就能浏览到DMG文件了。 
这里有一个关键地方:选择DMG镜像文件后, 
Device status里的Connected前打上勾(否则不能进入安装界面),然后确定。 
此时,我们便进入了MAC OS X的安装程序准备阶段。 
有的朋友使用Rebel EFI引导可能会出现禁止符号,无法安装。 
遇到这个问题可以使用Darwin镜像替换Rebel EFI,并重新启动虚拟机。 
在出现提示界面后,在CD/DVD(IDE)设备里将Darwin镜像改为苹果的DMG镜像即可,同样记得给“Connected”选项打勾。 
经过一阵准备阶段就进入了苹果系统的安装过程; 
在这里特别提一下,有的同学在进行到选择安装盘的步骤时看不到硬盘选项, 
在屏幕上方的菜单中找到实用工具”->“磁盘工具 
对你的虚拟硬盘执行抹掉操作; 

操作完成后关闭磁盘工具窗口就OK了; 

根据你的电脑配置不同,大概进行几十分钟的安装,你就可以用上苹果操作系统了。 

看到下图的界面,表示你的系统已经安装完成,需要重新启动。 

重新启动前你要特别注意,先要去掉安装时在CD/DVD(IDE)设备上加载的苹果DMG镜像, 
换上Darwin或者Rebel EFI引导镜像,否则你将不能成功引导安装好的MAC OS X系统。 
如果使用一种引导失败,可以试着使用其他的引导镜像。 

还有需要在VMWare里的MAC系统上安装声卡、显卡等驱动的朋友,可以在网上寻找相关文章和驱动, 
或参考《号外!折腾无限!VMware Workstation 7.0 虚拟机安装雪豹snow leopard 10.6》文章,本文就不赘述了。 

————————————– 
4XPMAC共享目录 

因为我是在Windows XP中下载的Mac OSiPhone SDK等安装必备文件, 
所以,要安装iphone开发环境,则需要将下载的安装包文件刻录成光盘; 
若不想刻录光盘,可以直接将这些文件传到虚拟机VMWare 7,就可以进行安装。 
我在这里采用windows XPVMWare共享目录的方法实现。 
xp中需要将iphoneSDK目录,共享给VMWare7.0中的Macleosnow)的方法: 

4.1Windows XP中需要将目录iphoneSDK设置为共享 
步骤:在Windows XP中将iphoneSDK目录设置为共享: 
点击鼠标右键, 
选择属性->共享,选中在网络上共享这个文件夹,点击确定按钮。 

4.2.记下Windows XPIP地址 

4.3VMWare7.0中安装的Mac中访问XP的共享目录 
VMWare7.0中安装的Mac中访问XP中的共享目录iphoneSDK目录。 
步骤:在mac中,点击主菜单Finder菜单项, 
按住命令按钮和k键组合键, 
注意:在普通PC或笔记本上(非mac电脑)的cmdK ,连接服务器,smb://ip地址: 
smb://后输入Windows XPIP地址:192.168.6.222点击连接按钮即可看到如下提示: 
选择我们需要共享的目录iphoneSDK,并点击按钮确认,即可打开该共享目录: 

5.安装iphoneSDK 
1.
Mac中找到iphoneSDK的安装文件: 
“iphone_sdk_3.1.2_with_xcode_3.2.1__snow_leopard__10m2003.dmg”
 
用鼠标双击该文件图标,则会看到一个弹出窗口: 
点击继续按钮,出现安装器欢迎界面: 
点击继续按钮,是软件许可协议信息: 
点击继续按钮,出现确认窗口: 
点击同意按钮,出现协议信息: 
点击继续按钮,出现确认窗口: 

点击“Agree”按钮,出现安装路径选择窗口: 
选中安装目标路径后,点击继续按钮,出现安装类型选择窗口: 
点击继续按钮,出现确认窗口: 
点击安装按钮: 

注意:在安装过程之前,需要推出先退出itunes 
itunes图标上,点击鼠标右键,在弹出菜单中选择退出即可关闭: 
之后,点击“continue”按钮,则安装继续进行: 

安装结束的提示: 
安装完成后,点击完成按钮即可。 

 

6.启动XCODE开始开发 

启动Xcode开发环境: 
打开Finder,在磁盘上的“Developer”目录中“Applications”目录中,有Xcode程序, 
双击Xcode图标,即启动Xcode 
点击“Create a new Xcode project”图标,则打开工程模板窗口: 
选择iPhone OS项目模板中的“View-based Application”图标,并点击“Choose”按钮: 
提示输入新项目名字和新项目保存的目录, 
按提示输入后,点击“Save”按钮,则出现新窗口,显示向导生成的项目及该项目目录和文件: 
点击图标“Build and Run”,则开始编译; 
编译完成,则自动启动iphone模拟器。