Underscore

Underscore Underscore 一个非常实用的JavaScript库,提供许多编程功能的支持,就像你期望 Prototype.js (或者 Ruby), 有这些功能且不扩展任何JavaScript的原生对象。 It’s the tie to go along with jQuery’s tux. Underscore提供60多个方法,即有普通的功能,例如: map, select, invoke — 也有更多特殊的编程辅助方法,例如: 函数绑定、javascript模板、绝对相等判断等待。 如果一些现代的浏览器提供了内置的 forEach, map, reduce, filter, every,some 和 indexOf方法,Underscore就委托给浏览器原生的方法。 Underscore提供完整的测试用例集供你精读。 你也可以阅读有注释的源代码。 项目代码放在GitHub上,你可以通过issues页、Freenode的#documentcloud频道、发送tweets给@documentcloud三个途径报告bug以及参与特性讨论。 Underscore是DocumentCloud的一个开源组件

Created 2026-02-02 · Updated 2026-02-02 · 1 min · 35 words · -

CSS继承性

CSS继承性 http://developer.51cto.com/art/201009/224897.htm 你对CSS继承性的概念和使用是否了解,这里和大家分享一下,CSS继承特性最典型的应用通常发挥在整个网页的样式预设,需要指定为其它样式的部份设定在个别元素里即可,同时CSS继承是一种机制,它允许样式不仅可以应用于某个特定的元素,还可以应用于它的后代。 CSS继承性及其应用 所谓CSS继承性是指被包在内部的标签将拥有外部标签的样式性质。CSS继承特性最典型的应用通常发挥在整个网页的样式预设,需要指定为其它样式的部份设定在个别元素里即可。这项特性可以给网页设计者提供更理想的发挥空间。但同时继承也有很多规则,应用的时候容易让人迷惑,donger今天就专门和大家聊聊这方面的应用。 正文 CSS是层叠样式表 (CascadingStyleSheets) 的简称,它的规范代表了互联网历史上一个独特的发展阶段。现在对于从事网页制作的朋友来说,很少没有听说过CSS了吧,因为在制作网页过程中我们经常需要用到。 CSS允许我们为文档设置更为丰富且便于修改的外观,可以减轻网页设计者的工作负担。这里我们主要想和朋友们一起对CSS继承性和特殊性进行一点深入的探讨。 一、CSS继承性 CSS的一个主要特征就是继承,它是依赖于祖先-后代的关系的。CSS继承是一种机制,它允许样式不仅可以应用于某个特定的元素,还可以应用于它的后代。例如一个BODY定义了的颜色值也会应用到段落的文本中。 二、CSS继承的局限性 在CSS中,继承是一种非常自然的行为,我们甚至不需要考虑是否能够这样去做,但是继承也有其局限性。 首先,有些属性是不能继承的。这没有任何原因,只是因为它就是这么设置的。举个例子来说: border属性,大家都知道,border属性是用来设置元素的边框的,它就没有继承性。如下图所示,如果继承了边框属性,那么文档看起来就会很奇怪,除非采取另外的措施关掉边框的继承属性。

Created 24246-01-24 · Updated 24246-01-24 · 1 min · 16 words · -

派生选择器

派生选择器 http://www.w3school.com.cn/css/css_syntax_descendant_selector.asp 通过依据元素在其位置的上下文关系来定义样式,你可以使标记更加简洁。 在 CSS1 中,通过这种方式来应用规则的选择器被称为上下文选择器 (contextual selectors),这是由于它们依赖于上下文关系来应用或者避免某项规则。在 CSS2 中,它们称为派生选择器,但是无论你如何称呼它们,它们的作用都是相同的。 派生选择器允许你根据文档的上下文关系来确定某个标签的样式。通过合理地使用派生选择器,我们可以使 HTML 代码变得更加整洁。 比方说,你希望列表中的 strong 元素变为斜体字,而不是通常的粗体字,可以这样定义一个派生选择器: li strong { font-style: italic; font-weight: normal; }

Created 24246-01-24 · Updated 24246-01-24 · 1 min · 24 words · -

Ed25519

Ed25519 http://ed25519.cr.yp.to/Ed25519 它是一个数字签名算法,签名和验证的性能都极高, 一个4核2.4GHz 的 Westmere cpu,每秒可以验证 71000 个签名,安全性极高,等价于RSA约3000-bit。签名过程不依赖随机数生成器,不依赖hash函数的防碰撞性,没有时间通道攻击的问题,并且签名很小,只有64字节,公钥也很小,只有32字节。 部署情况http://ianix.com/pub/ed25519-deployment.html 最近看到恒星(Stellar)网络使用了Ed25519算法作为签名算法,有点兴趣,无奈资料太少,其算法网站也比较简陋,结合找到的资料和网站介绍,粗略看了看,25519这个算法很有特点,相比传统椭圆曲线算法有较大优势,今天简单介绍给大家 Curve25519/Ed25519/X25519 是著名密码学家 Daniel J. Bernstein 在 2006 年独立设计的椭圆曲线加密 /签名 /密钥交换算法,和现有的任何椭圆曲线算法都完全独立,其中Ed25519用于签名,可在区块链中进行签名,Stellar就是使用了Ed25519作为签名算法的 Daniel J. Bernstein 是世界著名的密码学家,他在大学曾经开设过一门 UNIX 系统安全的课程给学生,结果一学期下来,发现了 UNIX 程序中的 91 个安全漏洞; 他早年在美国依然禁止出口加密算法时,曾因为把自己设计的加密算法发布到网上遭到了美国政府的起诉,他本人抗争六年,最后美国政府撤销所有指控,目前另一个非常火的高性能安全流密码 ChaCha20 也是出自 Bernstein 之手 25519 系列曲线自 2006 年发表以来,除了学术界无人问津, 2013 年爱德华·斯诺登曝光棱镜计划后,该算法突然大火。大量软件,如 OpenSSH 都迅速增加了对 25519 系列的支持,如今 25519 已经是大势所趋,可疑的 NIST 曲线迟早要退出椭圆曲线的历史舞台,目前, RFC 增加了 SSL/TLS 对 X25519 密钥交换协议的支持,而新版 OpenSSL 1.1 也加入支持,是摆脱老大哥的第一步,下一步是将 Ed25519 做为可选的 TLS 证书签名算法,彻底摆脱 NIST 。 根据其网站介绍,Ed25519 算法具有以下优势: 完全开放设计,算法各参数的选择直截了当,非常明确,没有任何可疑之处,相比之下,目前广泛使用的椭圆曲线是 NIST 系列标准,方程的系数是使用来历不明的随机种子 c49d3608 86e70493 6a6678e1 139d26b7 819f7e90 生成的,至于这个种子的来历没有资料介绍; ...

Created 23236-01-23 · Updated 23236-01-23 · 4 min · 836 words · -

history.back() webpage has expired. 网页已过期

history.back() webpage has expired. 网页已过期 http://blog.sina.com.cn/s/blog_4b3c4bfa0100vz7h.html 最近开发的时候,碰到了这个问题,就是在回到上一页的时候,IE出现了webpage has expired; Firefox会出现一个alert,是否重新提交表单. page A 提交表单给page B, 然后去到page C. 从page C回到page B的时候, 这个问题就出现了. 于是去查了一些资料,并好好检查了一下我的代码.发现了几个问题,得到一些启发,在这里总结一下. 1.http头中 cache-control的使用. 指示了浏览器的缓存的使用情况, 我是把缓存都关掉了, 导致从page C返回page B的时候,需要重新submit 表单,这是这个问题的起因之一. 介绍一篇博文: http://czy4411741.blog.163.com/blog/static/3420312720102931720414/ 对cache-control的介绍还挺好懂的. 改了cache-control以后可以达到后退的时候不重新submit表单,而是从缓存里拿,其他情况重新submit.具体的请看链接的博文,系统的学习一下. ‘Spring 的 SimpleFormController里面, 把cache-control设成了no-cache no-store.’ 2.Redirect After Post. 我的page A的表单提交方式是post.这本身没有问题,但是浏览器有一个机制防止重复提交表单(只针对post),于是在浏览器端会条出来什么网页过期啊,重复提交警告之类的.找了一下,有一个Post/Redirect/Get的设计模式. Page A 把表单Post给Page B, Page B拿到后Redirect用户去Pace C.在Page C显示结果. 从Page C返回的话,会回到Page A.(浏览器不记录Page B,因为对于浏览器来说,他只做了一个Redirect操作). 这样做的好处是不会再去到Page B, 就不会重复提交表单了. 对于严格禁止重复提交表单的操作, 使用这个设计模式是很好的选择. 解决方案 (任选其一): 1.修改cache-control设置, 并将Expires 设为-1. 看上面的总结一中的博文. jsp可以用response.setHeader(“cache-control”,“private”); 配合response.setHeader(“Expires”,"-1"); 其他语言类似. 2.将page A里表单提交方式改为get. 如果表单数据不敏感的话,可以使用. 谁叫浏览器只针对post. ...

Created 23236-01-23 · Updated 23236-01-23 · 1 min · 78 words · -

spring mvc 标签

spring mvc 标签 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 维护记录 时间 修改内容 原因 2026-06-24 移至 language/java/spring/spring-mvc-标签.md 与 Spring 专题文章同目录归类

Created 20206-01-20 · Updated 20206-01-20 · 1 min · 17 words · -

shiro 标签

shiro 标签 http://kdboy.iteye.com/blog/1155450 授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限。 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等。 一、授权的三要素 授权有着三个核心元素: 权限、角色和用户。 权限 权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的权限。 大多数的资源会支持典型的CRUD操作 (create,read,update,delete) ,但是任何操作建立在特定的资源上才是有意义的。因此,权限声明的根本思想就是建立在资源以及操作上。 而我们通过权限声明仅仅能了解这个权限可以在应用程序中做些什么,而不能确定谁拥有此权限。 于是,我们就需要在应用程序中对用户和权限建立关联。 通常的做法就是将权限分配给某个角色,然后将这个角色关联一个或多个用户。 权限声明及粒度 Shiro权限声明通常是使用以冒号分隔的表达式。就像前文所讲,一个权限表达式可以清晰的指定资源类型,允许的操作,可访问的数据。同时,Shiro权限表达式支持简单的通配符,可以更加灵活的进行权限设置。 下面以实例来说明权限表达式。 可查询用户数据 User:view 可查询或编辑用户数据 User:view,edit 可对用户数据进行所有操作 User:* 或 user 可编辑id为123的用户数据 User:edit:123 角色 Shiro支持两种角色模式: 传统角色: 一个角色代表着一系列的操作,当需要对某一操作进行授权验证时,只需判断是否是该角色即可。这种角色权限相对简单、模糊,不利于扩展。 权限角色: 一个角色拥有一个权限的集合。授权验证时,需要判断当前角色是否拥有该权限。这种角色权限可以对该角色进行详细的权限描述,适合更复杂的权限设计。 下面将详细描述对两种角色模式的授权实现。 二、授权实现 Shiro支持三种方式实现授权过程: 编码实现 注解实现 JSP Taglig实现 1、基于编码的授权实现 1.1基于传统角色授权实现 当需要验证用户是否拥有某个角色时,可以调用Subject 实例的hasRole*方法验证。 Java代码 <img alt="收藏代码" src="http://kdboy.iteye.com/images/icon_star.png" /> Subject currentUser = SecurityUtils.getSubject(); if (currentUser.hasRole("administrator")) { //show the admin button } else { //don't show the button? Grey it out? } 相关验证方法如下: ...

Created 20206-01-20 · Updated 20206-01-20 · 3 min · 568 words · -

apache shiro 自定义过滤器

apache shiro 自定义过滤器 http://blog.csdn.net/michnus/article/details/7987367

Created 17176-01-17 · Updated 17176-01-17 · 1 min · 4 words · -

Spring annoation

Spring annoation @PostConstruct 和 @PreDestroy Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,您既可以通过实现 InitializingBean/DisposableBean 接口来定制初始化之后 / 销毁之前的操作方法,也可以通过 <bean> 元素的 init-method/destroy-method 属性指定初始化之后 / 销毁之前调用的操作方法。关于 Spring 的生命周期,笔者在《精通 Spring 2.x—企业应用开发精解》第 3 章进行了详细的描述,有兴趣的读者可以查阅。 JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类,分别是 @PostConstruct 和 @PreDestroy,这两个注释只能应用于方法上。标注了 @PostConstruct 注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。

Created 18186-12-18 · Updated 18186-12-18 · 1 min · 39 words · -

spring @ModelAttribute

spring @ModelAttribute 通过 SpringMVC 的 SessionAttributes Annotation 关联 User 属性 SpringMVC 文档提到了 @SessionAttributes annotation,和 @ModelAttribute 配合使用可以往 Session 中存或者从 Session 中取指定属性名的具体对象。 ,@SessionAttributes 是用来在 controller 内部共享 model 属性的。从文档自带的例子来看,标注成 @SessionAttributes 属性的对象,会一直保留在 Session 或者其他会话存储中,直到 SessionStatus 被显式 setComplete()。那这个 annotation 对我们有什么帮助呢? 答案就是我们可以在需要访问 Session 属性的 controller 上加上 @SessionAttributes,然后在 action 需要的 User 参数上加上 @ModelAttribute,并保证两者的属性名称一致。SpringMVC 就会自动将 @SessionAttributes 定义的属性注入到 ModelMap 对象,在 setup action 的参数列表时,去 ModelMap 中取到这样的对象,再添加到参数列表。只要我们不去调用 SessionStatus 的 setComplete() 方法,这个对象就会一直保留在 Session 中,从而实现 Session 信息的共享。 controller的代码如下: @Controller @SessionAttributes(“currentUser”) public class GreetingController{ ...

Created 17176-12-17 · Updated 17176-12-17 · 1 min · 102 words · -

nginx rewrite

nginx rewrite 理解地址重写 与 地址转发 地址重写与地址转发是两个不同的概念。 地址重写 是为了实现地址的标准化,比如我们可以在地址栏中中输入 www.baidu.com. 我们也可以输入 www.baidu.cn. 最后都会被重写到 www.baidu.com 上。浏览器的地址栏也会显示www.baidu.com。 地址转发:它是指在网络数据传输过程中数据分组到达路由器或桥接器后,该设备通过检查分组地址并将数据转发到最近的局域网的过程。 因此地址重写和地址转发有以下不同点: 地址重写会改变浏览器中的地址,使之变成重写成浏览器最新的地址。而地址转发他是不会改变浏览器的地址的。 地址重写会产生两次请求,而地址转发只会有一次请求。 地址转发一般发生在同一站点项目内部,而地址重写且不受限制。 地址转发的速度比地址重定向快。 Rewrite 指令 该指令是通过正则表达式的使用来改变URI。可以同时存在一个或多个指令。需要按照顺序依次对URL进行匹配和处理。 该指令可以在server块或location块中配置,其基本语法结构如下: # Context: server, location, if server { # 规则:可以是字符串或者正则来表示想匹配的目标url rewrite {规则} {定向路径} {重写类型}; rewrite regex replacement [flag]; } rewrite:该指令是实现URL重写的指令。 regex:用于匹配 URI 的正则表达式。 replacement:将regex正则匹配到的内容替换成 replacement。 flag: flag标记。 例如客户端请求 http://foo.bar.com/foo/bar, nginx 送到 regex 匹配的字符串是 /foo/bar flag有如下值: last: 本条规则匹配完成后,继续向下匹配新的location URI 规则。(不常用) break: 本条规则匹配完成即终止,不再匹配后面的任何规则(不常用)。 redirect: 返回 302 临时重定向,浏览器地址会显示跳转新的URL地址。(默认值) permanent: 返回 301 永久重定向。浏览器地址会显示跳转新的URL地址。 比如如下列子: rewrite ^/(.*) http://www.baidu.com/$1 permanent; # 说明: # rewrite 为固定关键字,表示开始进行rewrite匹配规则。 # regex 为 ^/(.*)。 这是一个正则表达式,匹配完整的域名和后面的路径地址。 # replacement就是 http://www.baidu.com/1这块了,其中1是取regex部分()里面的内容。如果匹配成功后跳转到的URL。 # flag 就是 permanent,代表永久重定向的含义,即跳转到 http://www.baidu.com/$1 地址上。 Rewrite 指令可用的全局变量 $host: 变量中存放了请求的URL中的主机部分字段,比如 http://xxx.abc.com:8080/home 中的 xxx.abc.com. ngx_http_rewrite_module 模块用来使用正则表达式 (PCREs) 改变请求的 URI,返回重定向,并有条件地选择配置。 ...

Created 8086-12-08 · Updated 8086-12-08 · 5 min · 863 words · -

SIteMesh

SIteMesh 转自:http://javauu.com/thread-27-1-1.html 一、SIteMesh介绍 一、SiteMesh简介 SiteMesh是由一个基于Web页面布局、装饰以及与现存Web应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等。 它不仅仅能处理动态的内容,如jsp,php,asp等产生的内容,它也能处理静态的内容,如htm的内容,使得它的内容也符合你的页面结构的要求。甚至于它能将HTML文件象include那样将该文件作为一个面板的形式嵌入到别的文件中去。所有的这些,都是GOF的Decorator模式的最生动的实现。尽管它是由java语言来实现的,但它能与其他Web应用很好地集成。与传统区别如下图: SIteMesh官方地址: http://www.opensymphony.com/sitemesh/index.html SIteMesh官方下载: http://www.opensymphony.com/sitemesh/download.html SIteMesh 2.3下载: http://www.javauu.com/downloads/resource/sitemesh-2.3.zip 二、SiteMesh原理 SiteMesh框架是OpenSymphony团队开发的一个非常优秀的页面装饰器框架,它通过对用户请求进行过滤,并对服务器向客户端响应也进行过滤,然后给原始页面加入一定的装饰(header,footer等),然后把结果返回给客户端。通过SiteMesh的页面装饰,可以提供更好的代码复用,所有的页面装饰效果耦合在目标页面中,无需再使用include指令来包含装饰效果,目标页与装饰页完全分离,如果所有页面使用相同的装饰器,可以是整个Web应用具有统一的风格。

Created 7076-12-07 · Updated 7076-12-07 · 1 min · 15 words · -

快速匹配字符串

快速匹配字符串 假设内存有一个大字符串集,里面含有约1000万个字符串,如何快速知道该字符串集是否含有某个指定的测试字符串 ? (假设内存能放下这么多字符串) 方法一: hashCode法 方法二: Trie树 http://zh.wikipedia.org/wiki/Trie HashCode法 01 def sampleHashMap(strSet: Set[String]): Map[Int, Set[String]]={ 02 strSet.groupBy{ 03 s => s.hashCode 04 } 05 } 06 07 def contain(str: String, sampleMap: Map[Int, Set[String]]): Boolean = { 08 sampleMap.getOrElse(str.hashCode, Set[String]()).exists(_ equals str) 09 } 10 11 // 测试 12 val sampleSet = Set("a","b","c","AA","Archer","Jack"); 13 val sampleMap = sampleHashMap(sampleSet); 14 println(contain("Archer", sampleMap)); // true 15 println(contain("A", sampleMap)); // false 16 println(contain("a", sampleMap)); // true Trie树法 01 sealed abstract class Trie { 02 def contains(msg: String): Boolean = contains(msg, this) 03 04 @scala.annotation.tailrec 05 private def contains(msg: String, trie: Trie): Boolean = (msg, trie) match { 06 case (null, _ ) | (_ , null ) => false 07 case (StringCase(head, tail), TrieNode(edges)) => edges.get(head) match { 08 case None => false 09 case Some(subTrie) => contains(tail,subTrie) 10 } 11 case (StringCase(_,_), TrieLeaf()) => false 12 case _ => true 13 } 14 } 15 16 case class TrieNode(edges: Map[Char, Trie]) extends Trie{ 17 assert(edges.size > ) 18 } 19 case class TrieLeaf extends Trie 20 21 object StringCase{ 22 def unapply(s: String): Option[(Char, String)] ={ 23 if (s == null || s == "" ) None 24 else Some(s.head, s.tail) 25 } 26 } 27 28 object Trie{ 29 30 def apply(strs: String*): Trie ={ 31 apply(strs.toSet); 32 } 33 34 def apply(strSet: Set[String]) : Trie = { 35 if (strSet.size == || strSet == Set("")) TrieLeaf() 36 else { 37 val char2TrieSet = strSet.filter(_.length > ).groupBy(_.head).mapValues{ 38 strs => strs.map(_.tail) 39 }.mapValues{ 40 strs => apply(strs) 41 } 42 TrieNode(char2TrieSet); 43 } 44 } 45 46 } 47 48 val trie= Trie("abc","ac","b") 49 println(trie) 50 assert(trie.contains("") == true); // true 51 assert(trie.contains(null) == false); //false 52 assert(trie.contains("a") == true); // true 53 assert(trie.contains("b") == true); // true 54 assert(trie.contains("ab") == true); //true 55 assert(trie.contains("ac") == true); //true 56 assert(trie.contains("abc") == true); //true 57 assert(trie.contains("acb") == false); // false 58 assert(trie.contains("abcd") == false); //false 59 assert(trie.contains("bc") == false); //false

Created 26266-11-26 · Updated 26266-11-26 · 2 min · 328 words · lcf

normalize.css 简介

normalize.css 简介 大部分情况下,我们在页面中使用 CSS Resets 解决不同浏览器对 HTML 元素的默认 CSS 设置的差异。CSS normalization 则与 CSS Resets 不同,为了页面具有相同的表现,CSS Resets 对大多元素的样式进行了复位操作,而 normalize.css 则在保留原有表现的基础上进行值的重设并修复一些浏览器的 Bug。

Created 24246-11-24 · Updated 24246-11-24 · 1 min · 20 words · -

LESS CSS

LESS CSS 一种 动态 样式 语言 LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承,运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, Firefox),也可以借助Node.js或者Rhino在服务端运行 CSS (层叠样式表) 是一门历史悠久的标记性语言,同 HTML 一道,被广泛应用于万维网 (World Wide Web) 中。HTML 主要负责文档结构的定义,CSS 负责文档表现形式或样式的定义。 作为一门标记性语言,CSS 的语法相对简单,对使用者的要求较低,但同时也带来一些问题: CSS 需要书写大量看似没有逻辑的代码,不方便维护及扩展,不利于复用,尤其对于非前端开发工程师来讲,往往会因为缺少 CSS 编写经验而很难写出组织良好且易于维护的 CSS 代码,造成这些困难的很大原因源于 CSS 是一门非程序式语言,没有变量、函数、SCOPE (作用域) 等概念。LESS 为 Web 开发者带来了福音,它在 CSS 的语法基础之上,引入了变量,Mixin (混入) ,运算以及函数等功能,大大简化了 CSS 的编写,并且降低了 CSS 的维护成本,就像它的名称所说的那样,LESS 可以让我们用更少的代码做更多的事情。 http://www.ibm.com/developerworks/cn/web/1207_zhaoch_lesscss/index.html

Created 24246-11-24 · Updated 24246-11-24 · 1 min · 57 words · -

SASS

SASS http://www.ruanyifeng.com/blog/2012/06/sass.html 作者: 阮一峰 日期: 2012年6月19日 学过CSS的人都知道,它不是一种编程语言。 你可以用它开发网页样式,但是没法用它编程。也就是说,CSS基本上是设计师的工具,不是程序员的工具。在程序员眼里,CSS是一件很麻烦的东西。它没有变量,也没有条件语句,只是一行行单纯的描述,写起来相当费事。 很自然地,有人就开始为CSS加入编程元素,这被叫做"CSS预处理器" (css preprocessor) 。它的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件。 各种"CSS预处理器"之中,我自己最喜欢SASS,觉得它有很多优点,打算以后都用它来写CSS。下面是我整理的用法总结,供自己开发时参考,相信对其他人也有用。 一、什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护。

Created 24246-11-24 · Updated 24246-11-24 · 1 min · 15 words · -

自适应网页设计 (Responsive Web Design)

自适应网页设计 (Responsive Web Design) http://www.ruanyifeng.com/blog/2012/05/responsive_web_design.html 作者: 阮一峰 日期: 2012年5月 1日 随着3G的普及,越来越多的人使用手机上网。 移动设备正超过桌面设备,成为访问互联网的最常见终端。于是,网页设计师不得不面对一个难题: 如何才能在不同大小的设备上呈现同样的网页? 手机的屏幕比较小,宽度通常在600像素以下;PC的屏幕宽度,一般都在1000像素以上 (目前主流宽度是1366×768) ,有的还达到了2000像素。同样的内容,要在大小迥异的屏幕上,都呈现出满意的效果,并不是一件容易的事。 很多网站的解决方法,是为不同的设备提供不同的网页,比如专门提供一个mobile版本,或者iPhone / iPad版本。这样做固然保证了效果,但是比较麻烦,同时要维护好几个版本,而且如果一个网站有多个portal (入口) ,会大大增加架构设计的复杂度。 于是,很早就有人设想,能不能"一次设计,普遍适用",让同一张网页自动适应不同大小的屏幕,根据屏幕宽度,自动调整布局 (layout) ? 一、“自适应网页设计"的概念 2010年,Ethan Marcotte提出了"自适应网页设计” (Responsive Web Design) 这个名词,指可以自动识别屏幕宽度、并做出相应调整的网页设计。

Created 24246-11-24 · Updated 24246-11-24 · 1 min · 31 words · -

html 版权符号

html 版权符号 在页面里加上版权符号,HTML代码里对应输入© ©就是版权符号在HTML里的代码,但是很多页面在设计的时候,用的字体是宋体,就算没有设置字体,中文系统下默认用的还是宋体,那么就导致的显示出来的版权符号变形。让我们来看看用宋体显示出来的是什么样子,代码和效果: Copyright ©2009 www.fwl.name 看到了,版权符号变形了 让我们来看看用arial字体显示出来的是什么样子,代码和效果: Copyright ©2009 www.fwl.name 看,这样就正常了· 所以,要很好很完美的显示出版权符号,除了用©外,还得用对字体

Created 21216-11-21 · Updated 21216-11-21 · 1 min · 14 words · -

REST是什么?

REST是什么? 概述 REST是英文Representational State Transfer的缩写,中文翻译: 表述性状态转移。 他是由Roy Thomas Fielding博士在他的论文 《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。 REST本身只是为分布式超媒体系统设计的一种架构风格,而不是标准。 基于Web的架构,实际上就是各种规范的集合,这些规范共同组成了Web架构。比如Http协议,比如客户端服务器模式,这些都是规范。每当我们在原有规范的基础上增加新的规范, 就会形成新的架构。而REST正是这样一种架构,他结合了一系列的规范,而形成了一种新的基于Web的架构风格。 传统的Web应用大都是B/S架构,它包括了如下一些规范: 客户-服务器 这种规范的提出,改善了用户接口跨多个平台的可移植性,并且通过简化服务器组件,改善了系统的可伸缩性。最为关键的是通过分离用户接口和数据存储这两个关注点,使得不同用户终端享受相同数据成为了可能。 无状态性 无状态性是在客户-服务器约束的基础上添加的又一层规范。他要求通信必须在本质上是无状态的,即从客户到服务器的每个request都必须包含理解该 request所必须的所有信息。这个规范改善了系统的可见性 (无状态性使得客户端和服务器端不必保存对方的详细信息,服务器只需要处理当前 request,而不必了解所有的request历史) ,可靠性 (无状态性减少了服务器从局部错误中恢复的任务量) ,可伸缩性 (无状态性使得服务器端可以很容易的释放资源,因为服务器端不必在多个request中保存状态) 。同时,这种规范的缺点也是显而易见得,由于不能将状态数据保存在服务器上的共享上下文中,因此增加了在一系列request中发送重复数据的开销,严重的降低了效率。 3.缓存 为了改善无状态性带来的网络的低效性,我们填加了缓存约束。缓存约束允许隐式或显式地标记一个response中的数据,这样就赋予了客户端缓存 response数据的功能,这样就可以为以后的request共用缓存的数据,部分或全部的消除一部分交互,增加了网络的效率。但是用于客户端缓存了信息,也就同时增加了客户端与服务器数据不一致的可能,从而降低了可靠性。 B/S架构的优点是其部署非常方便,但在用户体验方面却不是很理想。为了改善这种情况, 我们引入了REST。 REST在原有的架构上增加了三个新规范: 统一接口,分层系统和按需代码。 1.统一接口 REST 架构风格的核心特征就是强调组件之间有一个统一的接口,这表现在REST世界里,网络上所有的事物都被抽象为资源,而REST就是通过通用的链接器接口对资源进行操作。这样设计的好处是保证系统提供的服务都是解耦的,极大的简化了系统,从而改善了系统的交互性和可重用性。并且REST针对Web的常见情况做了优化,使得REST接口被设计为可以高效的转移大粒度的超媒体数据,这也就导致了REST接口对其它的架构并不是最优的。 2.分层系统 分层系统规则的加入提高了各种层次之间的独立性,为整个系统的复杂性设置了边界,通过封装遗留的服务,使新的服务器免受遗留客户端的影响,这也就提高了系统的可伸缩性。 3.按需代码 REST允许对客户端功能进行扩展。比如,通过下载并执行applet或脚本形式的代码,来扩展客户端功能。但这在改善系统可扩展性的同时,也降低了可见性。所以它只是REST的一个可选的约束。 REST的设计准则 REST架构是针对Web应用而设计的,其目的是为了降低开发的复杂性,提高系统的可伸缩性。REST提出了如下设计准则: 网络上的所有事物都被抽象为资源 (resource) ; 每个资源对应一个唯一的资源标识符 (resource identifier) ; 3.通过通用的连接器接口 (generic connector interface) 对资源进行操作; 对资源的各种操作不会改变资源标识符; 所有的操作都是无状态的 (stateless) 。 REST中的资源所指的不是数据,而是数据和表现形式的组合,比如"最新访问的10位会员"和"最活跃的10为会员"在数据上可能有重叠或者完全相同,而由于他们的表现形式不同,所以被归为不同的资源,这也就是为什么REST的全名是Representational State Transfer的原因。资源标识符就是URI(Uniform Resource Identifier),不管是图片,Word还是视频文件,甚至只是一种虚拟的服务,也不管你是xml格式,txt文件格式还是其它文件格式,全部通过 URI对资源进行唯一的标识。 REST是基于Http协议的,任何对资源的操作行为都是通过Http协议来实现。以往的Web开发大多数用的都是Http协议中的GET和 POST方法,对其他方法很少使用,这实际上是因为对Http协议认识片面的理解造成的。Http不仅仅是一个简单的运载数据的协议,而是一个具有丰富内涵的网络软件的协议。他不仅仅能对互联网资源进行唯一定位,而且还能告诉我们如何对该资源进行操作。Http把对一个资源的操作限制在4个方法以内: GET, POST,PUT和DELETE,这正是对资源CRUD操作的实现。由于资源和URI是一一对应的,执行这些操作的时候URI是没有变化的,这和以往的 Web开发有很大的区别。正由于这一点,极大的简化了Web开发,也使得URI可以被设计成更为直观的反映资源的结构,这种URI的设计被称作 RESTful的URI。这位开发人员引入了一种新的思维方式: 通过URL来设计系统结构。当然了,这种设计方式对一些特定情况也是不适用的,也就是说不是所有的URI都可以RESTful的。 ...

Created 7076-11-07 · Updated 7076-11-07 · 2 min · 425 words · lcf

线框图

线框图 线框图(Wireframe)是软件或者网站设计过程中非常重要的一个环节。线框图是整合在结构层的全部三种要素的方法: 通过安排和选择界面元素来整合界面设计;通过识别和定义核心导航系统来整合导航设计;通过放置和排列信息组成部分的优先级来整合信息设计。通过把这三者放到一个文档中,线框图可以确定一个建立在基本概念结构上的架构,同时指出了视觉设计应该前进的方向。 其实对于更小或更简单的网站来说,一个线框图就足够作为所有即将建立的页面的模板。对于大多数项目来说,无论如何,都需要用多个线框图来传达复杂的预期结果。不过,你不需要为网站的每一个页面都准备一个线框图。正如结构设计流程允许我们把内容要素总结成各个种类一样,一个数量相对较少的标准页面类型将在绘制线框图的过程中慢慢浮现。 线框图在正式建立网站的视觉设计的流程中,是必要的第一步,但是几乎每一个参与这个开发过程的人都会在一些任务点中使用它。负责战略层、范围层和结构层的设计者可以借助线框图来保证最终产品能满足他们的期望。真正负责建设这个网站的人,则使用线框图来回答关于网站应该如何运作的问题。 随着用户体验领域的不断成熟和发展,线框图的责任有时还成为企业内部某种口水战的主题。一些网站研发团队很鲜明地把这部分工作分成两个部分,由两个独立的角色 (有时候是整个部门) “信息架构师"和"设计师"来承担。

Created 3036-11-03 · Updated 3036-11-03 · 1 min · 8 words · -