|
2008年7月13日
有人在Stack Overflow上 发问,动手开发网站之前,需要知道哪些事情? 不出意料地,他得到了一大堆回答。通常情况下,你需要把所有人的发言从头到尾读一遍。但是,Stack Overflow有一个很贴心的设计,它允许在问题下方开设一个wiki区,让所有人共同编辑一个最佳答案。于是,就有了下面这篇文章,一共总结出六个方 面共计62条"网站开发须知"。 我发现,这种概述性的问题,最适合这种集合群智、头脑风暴式的回答方式了。这也是我第一次觉得,Stack Overflow做到了Wikipedia做不到的事。(难怪它最近挤进了全美前400大网站。) 在我的印象中,关于网站开发,这样全面的概述性文章非常少见,因此也就非常有用。大家不妨看看,62件事情中你做到了多少? 一、界面和用户体验(Interface and User Experience) 1.1 知道各大浏览器执行Web标准的情况,保证你的站点在主要浏览器上都能正常运行。你至少要测试以下引擎:Gecko(用于Firefox)、Webkit(用于Safari、Chrome和一些手机浏览器)、IE(你可以利用微软发布的Application Compatibility VPC Images进行测试)和Opera。同时,不同的操作系统,可能也会影响浏览器如何呈现你的网站。 1.2 除了浏览器,网站还有其他使用方式:手机、屏幕朗读器、搜索引擎等等。你应该知道在这些情况下,你的网站的运行状况。MobiForge提供了手机网站开发的一些相关知识。 1.3 知道如何在基本不影响用户使用的情况下升级网站。通常来说,你必须有版本控制系统(CVS、Subversion、Git等等)和数据备份机制(backup)。 1.4 不要让用户看到那些不友好的出错提示。 1.5 不要直接显示用户的Email地址,至少不要用纯文本显示。 1.6 为你的网站设置一些合理的使用限制,一旦超过门槛值,就自动停止服务。(这也与网站安全相关。) 1.7 知道如何实现网页的渐进式增强(progressive enhancement)。 1.8 用户发出POST请求后,总是将其重导向(redirect)至另外一个网页。 1.9 不要忘记网站的可访问性(accessibility,即残疾人如何使用网站)。对于美国网站来说,有时这是法定要求。WAI-ARIA有一些这方面很好的参考资料。 二、安全性(Security) 2.1 阅读《OWASP开发指南》,它提供了全面的网站安全指导。 2.2 了解SQL注入(SQL injection)及其预防方法。 2.3 永远不要信任用户提交的数据(cookie也是用户端提交的!)。 2.4 不要明文(plain-text)储存用户的密码,要hash处理后再储存。 2.5 不要对你的用户认证系统太自信,它可能很容易就被攻破,而你事先根本没意识到存在相关漏洞。 2.6 了解如何处理信用卡。 2.7 在登录页面及其他处理敏感信息的页面,使用SSL/HTTPS。 2.8 知道如何对付session劫持(session hijacking)。 2.9 避免"跨站点执行"(cross site scripting,XSS)。 2.10 避免"跨域伪造请求"(cross site request forgeries,XSRF)。 2.11 及时打上补丁,让你的系统始终跟上最新版本。 2.12 确认你的数据库连接信息的安全性。 2.13 跟踪攻击技术的最新发展,以及你使用的平台的最新安全漏洞。 2.14 阅读Google的《浏览器安全手册》(Browser Security Handbook)。 2.15 阅读《网络软件的黑客手册》(The Web Application Hackers Handbook)。 三、性能(Performance) 3.1 只要有可能,就使用缓存(caching)。正确理解和使用HTTP caching与HTML5离线储存。 3.2 优化图片。不要把一个20KB的图片文件,作为重复出现的网页背景图案。 3.3 学习如何用gzip/deflate压缩内容(deflate方式更可取)。 3.4 将多个样式表文件或脚本文件,合为一个文件,这样可以减少浏览器的http请求数,以及减小gzip压缩后的文件总体积。 3.5 浏览Yahoo的Exceptional Performance网站,里面有大量提升前端性能的优秀建议,还有他们的YSlow工具。Google的page speed则是另一个用来分析网页性能的工具。两者都要求安装Firebug。 3.6 如果你的网页用到大量的小体积图片(比如工具栏),就应该使用CSS Image Sprite,目的是减少http请求数。 3.7 大流量的网站应该考虑将网页对象分散在多个域名(split components across domains)。 3.8 静态内容(比如图片、CSS、JavaScript、以及其他cookie无关的网页内容)都应该放在一个不需要使用cookie的独立域名之上。因为域名之下如果有cookie,那么客户端向该域名发出的每次http请求,都会附上cookie内容。这里的一个好方法就是使用"内容分发网络"(Content Delivery Network,CDN)。 3.9 将浏览器完成网页渲染所需要的http请求数最小化。 3.10 使用Google的Closure Compiler压缩JavaScript文件,YUI Compressor亦可。 3.11 确保网站根目录下有favicon.ico文件,因为即使网页中根本不包括这个文件,浏览器也会自动发出对它的请求。所以如果这个文件不存在,就会产生大量的404错误,消耗光你的服务器的带宽。 四、搜索引擎优化(Search Engine Optimization,SEO) 4.1 使用"搜索引擎友好"的URL形式,比如example.com/pages/45-article-title,而不是example.com/index.php?page=45。 4.2 不要使用"点击这里"之类的超级链接,因为这样等于浪费了一个SEO机会,而且降低了"屏幕朗读器"(screen reader)的使用效果。 4.3 创建一个XML sitemap文件,它的缺省位置一般是/sitemap.xml(即放在网站根目录下)。 4.4 当你有多个URL指向同一个内容时,在网页代码中使用<link rel="canonical" ... />。 4.5 使用Google的Webmaster Tools和Yahoo的Site Explorer。 4.6 从一开始就使用Google Analytics(或者开源的访问量分析工具Piwik)。 4.7 知道robots.txt的作用,以及搜索引擎蜘蛛的工作原理。 4.8 将www.example.com的访问请求导向example.com(使用301 Moved Permanently重定向),或者采用相反的做法,目的是防止Google把它们当做两个网站,分开计算排名。 4.9 知道存在着恶意或行为不正当的网络蜘蛛。 4.10 如果你的网站有非文本的内容(比如视频、音频等等),你应该参考Google的sitemap扩展协议。 五、技术(Technology) 5.1 理解HTTP协议,以及诸如GET、POST、sessions、cookies之类的概念,包括"无状态"(stateless)是什么意思。 5.2 确保你的XHTML/HTML和CSS符合W3C标准,使得它们能够通过检验。这可以使你的网页避免触发浏览器的古怪行为(quirk),而且使它在"屏幕朗读器"和手机上也能正常工作。 5.3 理解浏览器如何处理JavaScript脚本。 5.4 理解网页上的JavaScript文件、样式表文件和其他资源是如何装载及运行的,考虑它们对页面性能有何影响。在某些情况下,可能应该将脚本文件放置在网页的尾部。 5.5 理解JavaScript沙箱(Javascript sandbox)的工作原理,尤其是如果你打算使用iframe。 5.6 知道JavaScript可能无法使用或被禁用,以及Ajax并不是一定会运行。记住,"不允许脚本运行"(NoScript)正在某些用户中变得流行,手机浏览器对脚本的支持千差万别,而Google索引网页时不运行大部分的脚本文件。 5.7 了解301重定向和302重定向之间的区别(这也是一个SEO相关问题)。 5.8 尽可能多得了解你的部署平台(deployment platform)。 5.9 考虑使用样式表重置(Reset Style Sheet)。 5.10 考虑使用JavaScript框架(比如jQuery、MooTools、Prototype),它们可以使你不用考虑浏览器之间的差异。 六、解决bug 6.1 理解程序员20%的时间用于编码,80%的时间用于维护,根据这一点相应安排时间。 6.2 建立一个有效的错误报告机制。 6.3 建立某些途径或系统,让用户可以与你接触,向你提出建议和批评。 6.4 为将来的维护和客服人员撰写文档,解释清楚系统是怎么运行的。 6.5 经常备份!(并且确保这些备份是有效的。)除了备份机制,你还必须有一个恢复机制。 6.6 使用某种版本控制系统储存你的文件,比如Subversion或Git。 6.7 不要忘记做单元测试(Unit Testing),Selenium之类的框架会对你有用。
iBatis解决sql注入
(1) ibatis xml配置:下面的写法只是简单的转义 name like '%$name$%'
(2) 这时会导致sql注入问题,比如参数name传进一个单引号“'”,生成的sql语句会是:name like '%'%'
(3) 解决方法是利用字符串连接的方式来构成sql语句 name like '%'||'#name#'||'%'
(4) 这样参数都会经过预编译,就不会发生sql注入问题了。
(5) #与$区别:
#xxx# 代表xxx是属性值,map里面的key或者是你的pojo对象里面的属性, ibatis会自动在它的外面加上引号,表现在sql语句是这样的 where xxx = 'xxx' ;
$xxx$ 则是把xxx作为字符串拼接到你的sql语句中, 比如 order by topicId , 语句这样写 ... order by #xxx# ibatis 就会把他翻译成 order by 'topicId' (这样就会报错) 语句这样写 ... order by $xxx$ ibatis 就会把他翻译成 order by topicId
一、关于滚动显屏加载
常常会有这样子的页面,内容很丰富,页面很长,图片较多。比如说光棍节很疯狂的淘宝商城页面。 或者是前段时间写血本买了个高档耳机的京东商城页面,或者是新浪微博之类。
这些页面图片数量多,而且比较大,少说百来K,多则上兆。要是页面载入就一次性加载完毕。乖乖,估计黄花都变成黄花菜了。所以,我们得做点什么,避 免这种糟糕的状况发生。目前很流行的做法就是滚动动态加载,显示屏幕之外的图片默认是不加载的,随着页面的滚动,这个要显示图片的区域进入了浏览器可是窗 口范围,则触发图片的加载显示。这种做法的好处是,一是页面加载速度快(浏览器转啊转的圈圈或是进度条很快就玩完了),二是节约了流量,因为不可能每个用 户浏览页面时从头滚到尾的。
貌似我上面提到的几个站点就是采用的这种做法,例如,我以迅雷不及掩耳的速度从淘宝商城首页截下来的已触发滚动加载但是未加载完毕的图片:
这是提高前端性能,优化页面加载速度很实用的做法。看上去这种技巧有些技术门槛,其实很简单的。我们需要一个滚动事件,然后判断元素是否在浏览器窗 口,然后,显示图片(或是其他元素)就可以啦。我在jQuery库下写了个实现此效果的插件,下面就将简单展示讲解此插件的使用以及滚动动态加载的实现。
二、jQuery滚动加载插件scrollLoading
虽然只有几十行代码,但是为了方便使用,我还是将其插件化了。插件名为jquery.scrollLoading.js,您可以狠狠地点击这里下载(右键 – [目标|链接]另存为),或是点击这里下载mini压缩版的。
demo 您可以狠狠地点击这里:jQuery滚动加载图片等demo,如果您的网速是在贫困线上挣扎,可以慢慢拖动滚动条,就可以很清楚的看到滚动加载的效果了;如果您的网速让你引以为豪,哥,你需要很快的拖动滚动条才能瞥见效果。效果类似下面:
demo页面中似乎有段破坏和谐的HTML片段,那是动态加载HTML后的效果,也就是说,此scrollLoading不仅可以用来滚动加载图片,Ajax load页面什么的也是可以的。
三、scrollLoading使用
不管怎样,首先调用jQuery库文件,还有jquery.scrollLoading.js,您可以直接在页面的某处添上如下的代码:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script> <script type="text/javascript" src="http://www.zhangxinxu.com/study/js/mini/jquery.scrollLoading-min.js"></script>
此插件的方法名就是scrollLoading,所以,直接:包装器.scrollLoading(); 就可以实现滚动加载效果了,简单的吧。如下:
$(".scrollLoading").scrollLoading();
表示所有class为scrollLoading的元素绑定了滚动加载的方法。 当然,不可能真的就如此简单,我们还需要做点小动作的。元素默认是不加载的,那么真正的加载地址显然要预先在元素上放置的,例如新浪微博默认把头像地址绑在了一个自定义的”dynamic-src”属性上,见下图:
在HTML5中,以data-开头的自定义属性都是合法的,且地址可以是图片,页面等。所以,我设定了绑定地址的自定义属性为”data-url”,此属性值设为真实的图片(或页面)地址就可以了。例如下面:
<div class="scrollLoading" data-url="loaded.html">加载中...</div>
会在滚动时加载名为loaded.html的页面,并自动替换里面的内容。
对于常用的图片,还有一点小问题,就是其默认的src图片地址。其src地址不能是真实的图片地址(否则会直接一次性全部加载),也不能是空地址或是坏地址,否则IE浏览器下会出现很惊悚的红叉叉。。我的做法是默认链接的是一个1px * 1px的gif透明图片(大小很小),同时可以透出后面加载中gif动画图片,当滚动加载的时候直接把此gif图片替换掉。于是,对于图片,可能就有类似下面的代码:
<img class="scrollLoading" data-url="http://image.zhangxinxu.com/image/study/head/s180/1.jpeg" src="http://www.zhangxinxu.com/study/image/pixel.gif" width="180" height="180" style="background:url(http://www.zhangxinxu.com/study/image/loading.gif) no-repeat center;" />
四、scrollLoading可选参数
scrollLoading是个很简单很小的插件(无注释YUI compressor min版仅508B),所以参数也很少,就一个,见下表:
参数 | 默认 | 释义 |
attr |
data-url |
获取元素加载地址的属性名 |
就这些了。此插件只适用于页面默认滚动条的动态加载。对于内部div之类的滚动加载不支持。
五、周五,结语
要下班了,nice! 明天周末,我要去钓鱼。 我感冒了,鼻涕流个不停,难受。 空间近日升级了,20G的月流量已经挺不住了。 最近经常看动漫。 我决定在RSS里面加点广告,评论链接什么的。
//zxx:主人,这是你有屎以来最龌龊的结语了。
恩,对此我举双脚表示赞同。
原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com] 本文地址:http://www.zhangxinxu.com/wordpress/?p=1259
一、相关demo
本文地址: http://www.zhangxinxu.com/wordpress/?p=616
本文作者为:张鑫旭 来源于:张鑫旭-鑫空间-鑫生活 欢迎访问原出处
二、简介与说明
- 此jQuery插件为Ajax分页插件,一次性加载,故分页切换时无刷新与延迟,如果数据量较大不建议用此方法,因为加载会比较慢。
- 原插件CSS不太合理,使用浮动,故无法方便实现左右方向的定位,且未清除浮动,在中文修改版中我对其进行了优化,使其支持text-align的定位。
- 对原js文件注释进行了中文翻译,demo页面也是汉化了的,demo页面的js与原demo有一些出入,但核心不变。
本文地址: http://www.zhangxinxu.com/wordpress/?p=616
本文作者为:张鑫旭 来源于:张鑫旭-鑫空间-鑫生活 欢迎访问原出处
三、使用方法
跟一般的jQuery插件一样,此插件使用也很简单便捷。方法是pagination ,例如$("#page").pagination(100); ,这里的100参数是必须的,表示显示项目的总个数,这是最简单的使用,得到的显示如下:
还有一点值得一提的是分页列表需要放在class类为pagination的标签内,您可以使用text-align属性控制分页居中显示还是居右显示。
回调函数一般用来装载对应分页显示的内容,具体参见demo源文件。
本文地址: http://www.zhangxinxu.com/wordpress/?p=616
本文作者为:张鑫旭 来源于:张鑫旭-鑫空间-鑫生活 欢迎访问原出处
四、参数
参数名 | 描述 | 参数值 |
maxentries |
总条目数 |
必选参数,整数 |
items_per_page |
每页显示的条目数 |
可选参数,默认是10 |
num_display_entries |
连续分页主体部分显示的分页条目数 |
可选参数,默认是10 |
current_page |
当前选中的页面 |
可选参数,默认是0,表示第1页 |
num_edge_entries |
两侧显示的首尾分页的条目数 |
可选参数,默认是0 |
link_to |
分页的链接 |
字符串,可选参数,默认是"#" |
prev_text |
“前一页”分页按钮上显示的文字 |
字符串参数,可选,默认是"Prev" |
next_text |
“下一页”分页按钮上显示的文字 |
字符串参数,可选,默认是"Next" |
ellipse_text |
省略的页数用什么文字表示 |
可选字符串参数,默认是"…" |
prev_show_always |
是否显示“前一页”分页按钮 |
布尔型,可选参数,默认为true,即显示“前一页”按钮 |
next_show_always |
是否显示“下一页”分页按钮 |
布尔型,可选参数,默认为true,即显示“下一页”按钮 |
callback |
回调函数 |
默认无执行效果 |
本文地址: http://www.zhangxinxu.com/wordpress/?p=616
本文作者为:张鑫旭 来源于:张鑫旭-鑫空间-鑫生活 欢迎访问原出处
五、使用举例
例如下面的使用代码:
$("#Pagination").pagination(56, { num_edge_entries: 2, num_display_entries: 4, callback: pageselectCallback, items_per_page:1 });
这段代码表示的含义是:总共有56(maxentries)个列表项,首尾两侧分页显示2(num_edge_entries)个,连续分页主体数 目显示4(num_display_entries)个,回调函数为pageselectCallback(callback),每页显示的列表项为 1(items_per_page)。您可以对照参数表修改配置这里的参数。
本文地址: http://www.zhangxinxu.com/wordpress/?p=616
本文作者为:张鑫旭 来源于:张鑫旭-鑫空间-鑫生活 欢迎访问
六、关于demo的一些说明
总共有三个demo,第一个demo就是个静态的数据,直接写在HTML上;第二个使用Ajax加载HTML数据,然后进行分页显示;第三个demo可以动态修改一些参数观察对应的分页效果。
所有demo页面的js注释我都改为了中文标注,难点在于回调函数,demo中回调函数有两个参数,一个是page_index,另一个是jq,前 一个表示您当前点击的那个分页的页数索引值,后一个参数表示装载容器。这里的页数索引值是关键,我们要根据这个索引值找到对应的(例如)HTML元素,然 后再指定的容器中显示出来,demo中提供了装载单元素以及多元素的方法,相信不会有太大问题。
http://www.zhangxinxu.com/wordpress/
这小子个人空间里前端特效不错,还带有用例,源码,效果图,以及demo
Amateras Eclipse HTML Editor
Amateras Eclipse HTML Editor |
Homepage |
http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=EclipseHTMLEditor |
Download |
https://sourceforge.jp/projects/amateras/files/ |
Dependencies |
GEF: http://www.eclipse.org/gef |
Description |
Eclipse HTML Editor is an Eclipse plugin for HTML/JSP/XML Editing. It works on Eclipse 3.0 (or higher), JDT and GEF. It has following features.
- HTML/JSP/XML/CSS Hilighting
- HTML/JSP Preview
- JSP/XML Validation
- Contents Assist (HTML Tags/Attributes, XML based on DTD and JSP taglib and more)
- Wizards for creating HTML/JSP/XML files
- Outline View
- Editor Preferences
- Editor Folding
- Web Browser (It works as an Eclipse's editor)
- Image Viewer
- Tag Palette
- CSS code completion and outline
|
Usage |
http://amateras.sourceforge.jp/docs/FacesIDE/HtmlEditor.html
|
XMLBuddy
XMLBuddy |
Homepage |
http://www.xmlbuddy.com/ |
Download |
http://xmlbuddy.com/2.0/licensed.html |
Dependencies |
|
Description |
http://xmlbuddy.com/2.0/features.html |
Usage |
|
Freemarker IDE
Freemarker IDE |
Homepage |
http://www.freemarker.org/editors.html |
Download |
http://sourceforge.net/project/showfiles.php?group_id=794 |
Dependencies |
|
Description |
|
Usage |
|
JSEclipse
JSEclipse |
Homepage |
http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=EclipseHTMLEditor |
Download |
http://www.interaktonline.com/Products/Eclipse/JSEclipse/Try-Download/ |
Dependencies |
The Eclipse SDK version 3.1 or higher The Java Runtime Environment version 5.0 or higher |
Description |
http://www.interaktonline.com/Products/Eclipse/JSEclipse/Overview |
Usage |
|
SQLExplorer
SQLExplorer |
Homepage |
http://eclipsesql.sourceforge.net/ |
Download |
http://sourceforge.net/project/showfiles.php?group_id=132863 |
Dependencies |
|
Description |
Eclipse IDE plugin for database query/schema viewer for nearly any kind of JDBC database. It supports plugins for specialized functionality for individual databases and data tools ( like Hibernate, Oracle or Sybase ) |
Usage |
|
Properties Editor
Properties Editor |
Homepage |
http://propedit.sourceforge.jp/index_en.html |
Download |
http://sourceforge.jp/projects/propedit/ |
Dependencies |
|
Description |
|
Usage |
|
SpringIDE
Spring IDE |
Homepage |
http://www.springframework.org/download |
Download |
Updatesite: http://springide.org/updatesite/ Download: http://springide.org/updatesite/ |
Dependencies |
|
Description |
|
Usage |
|
JettyLauncher
Jetty Launcher |
Homepage |
http://jettylauncher.sourceforge.net/ |
Download |
Updatesite: http://jettylauncher.sourceforge.net/updates |
Dependencies |
|
Description |
|
Usage |
|
方式一:
Java转exe篇: 实现方式:Eclipse搭配JSmooth(免费)。 1.先由Eclipse制作包含Manifest的JAR。制作教学 2.使用JSmooth将做好的JAR包装成EXE。 JSmooth下载页面: http://jsmooth.sourceforge.net/index.php ; 3.制作完成的exe文件,可在有装置JRE的Windows上执行。
方式二:
exe4j
方式三
NSIS(这个最好用)
方法四:
Launch4j is a cross-platform tool for wrapping Java applications distributed as jars in lightweight Windows native executables. The executable can be configured to search for a certain JRE version or use a bundled one, and it's possible to set runtime options, like the initial/max heap size. The wrapper also provides better user experience through an application icon, a native pre-JRE splash screen, a custom process name, and a Java download page in case the appropriate JRE cannot be found.
EasyTomcat支持您使用的Apache Tomcat和MySQL的。您可以轻松的启动,停止和配置Tomcat和MySQL,尤其是你不需要任何特殊的知识来使用它。您可以监控服务器和查看统计信息的重要属性。
经典语录:
哈佛有一个著名的理论:人的差别在于业余时间,而一个人的命运决定于晚上8点到10点之间。每晚抽出2个小时的时间用来阅读、进修、思考或参加有意的演讲、讨论,你会发现,你的人生正在发生改变,坚持数年之后,成功会向你招手。
经典语录:
无论你的收入是多少,记得分成五份进行规划投资:增加对身体的投资,让身体始终好用;增加对社交的投资,扩大你的人脉;增加对学习的投资,加强你的自信;增加对旅游的投资,扩大你的见闻;增加对未来的投资,增加你的收益。好好规划落实,你会发现你的人生逐步会有大量盈余。
经典语录:
过去的一页,能不翻就不要翻,翻落了灰尘会迷了双眼。有些人说不出哪里好,但就是谁都替代不了! 那些以前说着永不分离的人,早已经散落在天涯了。收拾起心情,继续走吧,错过花,你将收获雨,错过这一个,你才会遇到下一个。
经典语录:
被人误解的时候能微微的一笑,这是一种素养;受委屈的时候能坦然的 一笑,这是一种大度;吃亏的时候能开心的一笑,这是一种豁达;无奈的时候能达观的一笑,这是一种境界;危难的时候能泰然一笑,这是一种大气;被轻蔑的时候 能平静的一笑,这是一种自信;失恋的时候能轻轻的一笑,这是一种洒脱。
经典语录:
人生途中,有些是无法逃避的,比如命运;有些是无法更改的,比如情 缘;有些是难以磨灭的,比如记忆;有些是难以搁置的,比如爱恋……与其被动地承受,不如勇敢地面对;与其鸟宿檐下,不如击翅风雨;与其在沉默中孤寂,不如 在抗争中爆发……路越艰,阻越大,险越多,只要走过去了,人生就会更精彩。
经典语录:
你改变不了环境,但你可以改变自己;你改变不了事实,但你可以改变态度;你改变不了过去,但你可以改变现在;你不能控制他人,但你可以掌握自己;你不能预知明天,但你可以把握今天;你不可以样样顺利,但你可以事事尽心;你不能延伸生命的长度,但你可以决定生命的宽度。
经典语录:
魅力女人:1、善于发现生活里的美。2、养成看书的习惯。3、拥有 品位。4、跟有思想的人交朋友。5、远离泡沫偶像剧。6、学会忍耐与宽容。7、培养健康的心态,重视自己的身体。8、离开任何一个男人,都会活得很好。 9、有着理财的动机,学习投资经营。10、尊重感情,珍惜缘分。
经典语录:
愚人向远方寻找快乐,智者则在自己身旁培养快乐。生活里的每一个细节都蕴藏着快乐,只是在于你是否感受到了而已。快乐着的人,每一件事,每一个人身上,他都能发现能令自己欢悦的因素来,并让快乐扩张,鼓舞和影响了周围的人。
经典语录:
【给自己安慰的10句温馨话】1、最重要的是今天的心;2、别总是 自己跟自己过不去;3、用心做自己该做的事;4、不要过于计较别人评价;5、每个人都有自己的活法;6、喜欢自己才会拥抱生活;7、不必一味讨好别 人;8、木已成舟便要顺其自然;9、不妨暂时丢开烦心事;10、自己感觉幸福就是幸福。
经典语录:
没有永远的缘份,没有永远的生命,我们所能拥有的,可能只是平凡的一生。然而因为有你,生命便全然不同,不用誓言,不必承诺,我们只需依了爱缘,以目光为媒,印证三生石上的约定,便牵了手,不必紧握,却永不放松,以自己设计的爱的程式,去演绎一种精典的永恒。
经典语录:
我们之所以会心累,就是常常徘徊在坚持和放弃之间,举棋不定。我们之所以会烦恼,就是记性太好,该记的,不该记的都会留在记忆里。我们之所以会痛苦,就是追求的太多。我们之所以不快乐,就是计较的太多,不是我们拥有的太少,而是我们计较的太多。
经典语录:
男人吸引女人的10个特质:1.真实 2.深刻 3.胸怀 4.敢为 5.风度 6.机灵 7.幽默 8.进取 9.浪漫 10.冒险.女人吸引男人的10个特点:1.温柔 2.知性 3.直性 4.涵养 5.朦胧 6.小动作 7.勤于家事 8.肤白 9.性感着装 10.香氛
经典语录:
真正的爱,是接受,不是忍受;是支持,不是支配;是慰问,不是质问;真正的爱,要道谢也要道歉。要体贴,也要体谅。要认错,也好改错;真正的爱,不是彼此凝视,而是共同沿着同一方向望去。其实,爱不是寻找一个完美的人。而是,要学会用完美的眼光,欣赏一个并不完美的人。
经典语录:
身 边总有些人,你看见他整天都开心,率真得像个小孩,人人都羡慕他;其实,你哪里知道:前一秒人后还伤心地流着泪的他,后一秒人前即刻洋溢灿烂笑容。他们其 实没有能力独处,夜深人静时,总坐在窗前对着夜空冥想失意的苦楚。他们就像向日葵,向着太阳的正面永远明媚鲜亮,在照不到的背面却将悲伤深藏。
经典语录:
生命中,有些人来了又去,有些人去而复返,有些人近在咫尺,有些人 远在天涯,有些人擦身而过,有些人一路同行。或许在某两条路的尽头相遇,结伴同行了一段路程,又在下一个分岔路口道别。无论如何,终免不了曲终人散的伤 感。远在天涯的朋友:或许已是遥远得无法问候,但还是谢谢您曾经的结伴同行。
经典语录:
爱情很简单,因为每个人都会说:“我爱你,会为你付出一切!”,爱情很难,因为没有多少人做到了他的承诺。 如果真心爱一个人,不承诺也会去爱;如果不爱一个人,曾经承诺也会背叛。
经典语录:
【你最后悔什么】 某杂志对全国60岁以上的老人抽样调查:第一名:75%的人后悔年轻时努力不够,导致一事无成。第二名:70%的人后悔在年轻的时候选错了职业。第三 名:62%的人后悔对子女教育不当。第四名:57%的人后悔没有好好珍惜自己的伴侣。第五名:49%的人后悔没有善待自己的身体。
经典语录:
【做人十心机】 ⒈做人不能太单纯 适度伪装自己 ⒉凡事留余地 要留退路 ⒊话不说绝 口无遮拦难成大事 ⒋成熟而不世故 ⒌心态好 想得开活得不累 ⒍懂方圆之道:没事不惹事,来事不怕事 ⒎不可少二礼:礼仪与礼物 ⒏人在江湖飘 防挨朋友刀 ⒐偶尔"势利眼" 寻可靠伙伴 ⒑放下面子来做人。
经典语录:
人生旅途中,总有人不断地走来,有人不断地离去。当新的名字变成老 的名字,当老的名字渐渐模糊,又是一个故事的结束和另一个故事的开始。在不断的相遇和错开中,终于明白:身边的人只能陪着自己走过或近或远的一程,而不能 伴自己一生;陪伴一生的是自己的名字和那些或清晰或模糊的名字所带来的感动。
经典语录:
从现在开始,聪明一点,不要问别人想不想你,爱不爱你?若是要想你或者爱你自然会对你说,但是从你的嘴里说出来,别人会很骄傲和不在乎你。再也不要太在意一些人,太在乎一些事,顺其自然以最佳心态面对,因为这个世界就是这样:往往在最在乎的事物面前,我们最没有价值。
经典语录:
一个人的成就,不是以金钱衡量,而是一生中,你善待过多少人,有多少人怀念你。生意人的账簿,记录收入与支出,两数相减,便是盈利。人生的账簿,记录爱与被爱,两数相加,就是成就。
第一课 一个男人在他妻子洗完澡后准备进浴室洗澡。这时,门铃响了。 妻子迅速用浴巾裹住自己冲到门口。 当她打开门时,邻居鲍勃站在那儿。 在她开口前,鲍勃说,“你如果把浴巾拿掉,我给你800美元。” 想了一会儿,这个女人拿掉浴巾赤裸地站在鲍勃面前。几秒钟后,鲍勃递给她800美元然后离开了。 女人重新裹好浴巾回到屋里。 当她踏进浴室时,丈夫问她,“是谁呀?” “是邻居鲍勃。”她回答。 “哦,”丈夫说,“他有没有提到还欠我800美元?” 故事寓意: 及时与同舟共济的人们分享重要信息,将会避免不必要的曝光。
第二课 一个销售员、一个办事员和他们的经理步行去午餐时发现了一盏古代油灯。 他们摩擦油灯,一个精灵跳了出来。 精灵说:“我能满足你们每人一个愿望。” “我先!我先!”办事员说,“我想去巴哈马群岛,开着快艇,与世隔绝。” 倏!她飞走了。 “该我了!该我了!”销售员说,“我想去夏威夷,躺在沙滩上,有私人女按摩师,免费续杯的冰镇果汁朗姆酒,还有一生中的最爱。” 倏!他飞走了。 “OK, 该你了。”精灵对经理说。 经理回答:“我要那两个蠢货午饭后马上回来工作!” 故事寓意: 永远让你的老板开口先。
第三课 一只鹰坐在高高的树上休息,无所事事。 一只小兔子看见鹰并且问它,“我能象你一样坐着什么都不干吗?” 鹰回答:“行啊,为啥不行。” 于是,兔子坐在鹰下面的地上休息。突然,一只狐狸出现了,它扑到兔子身上把它吃掉了。 故事寓意: 要想坐着无所事事,你必须坐在非常、非常高的位置。
第四课 一只小鸟飞去南方过冬。天实在太冷了。它冻僵了,掉在一片田野上。 它躺在那儿时,一头母牛走过来在它身上拉了一堆屎。 冻僵的小鸟躺在粪堆里,开始感觉到了温暖。 牛粪确实使它暖和过来了。 它躺在温暖的牛粪中,异常高兴,并开始唱起歌来。 一只过路的猫听到鸟叫赶过来看个究竟。 顺着声音,它发现了牛粪下的小鸟,并迅速把它拖出来吃掉了。 故事寓意: (1) 并不是每个在你身上拉屎的都是你的敌人。 (2) 并不是每个把你拖出粪堆的都是你的朋友。 (3) 当你深陷粪堆中的时候,最好闭上你的鸟嘴 1)学会 沉默
有 时候,你被人误解,你不想争辩,所以选择沉默。本来就不是所有的人都得了解你,因此你认为不必对全世界喊话。却也有时候,你被最爱的人误解,你难过到不想 争辩,也只有选择沉默。全世界都可以不懂你,但他应该懂,若他竟然不能懂,还有什么话可说?生命中往往有连舒伯特都无言以对的时刻,毕竟不是所有的是非都 能条列清楚,甚至可能根本没有真正的是与非。那么,不想说话,就不说吧,在多说无益的时候,也许沉默就是最好的解释。
(2)至少 平静
在 你跌入人生谷底的时候,你身旁所有的人都告诉你:要坚强,而且要快乐。坚强是绝对需要的,但是快乐?在这种情形下,恐怕是太为难你了。毕竟,谁能在跌得头 破血流的时候还觉得高兴?但是至少可以做到平静。平静地看待这件事,平静地把其他该处理的事处理好。平静,没有快乐,也没有不快乐。
(3)学会弯腰 这会是我意外的收获
和 别人发生意见上的纷歧,甚造成言语上的冲突,所以你闷闷不乐,因为你觉得都是别人恶意。别再耿耿于怀了,回家去擦地板吧。拎一块抹布,弯下腰,双膝着地, 把你面前这张地板的每个角落来回擦拭干净。然后重新省思自己在那场冲突,所说过的每一句话。现在,你发现自己其实也有不对的地方了,是不是?你渐渐心平气 和了,是不是?有时候你必须学习弯腰,因为这个动作可以让你谦卑。劳动身体的同时,你也擦亮了自己的心绪。而且,你还拥有了一张光洁的地板呢。这是你的第 二个收获。 (4)不要想 如果 当初
你说,人生是一条有无限多岔口的长路, 永远在不停地做选择。如果只是选择吃炒面或炒饭,影响似乎不大,但选择读什么科系、做什么工作、结婚或不结婚、要不要有孩子,每一个选择都影响深远,而不 同的选择也必定造就完全不一样的人生。你又说,生命中不可承受之情,就在于人生没有重来的机会啊。如果当初如何如何,现在就不会怎样怎样...这种充满怅 然的喃喃自语,还是别再多说了吧。每一个岔口的选择其实没有真正的好与坏,只要把人生看成是自己。独一无二的创作,就不会频频回首如果当初做了不一样的选 择。
(5)努力吧 不管成功与否 至少曾经美丽
漫步林间,你看见一株藤蔓附着树干,柔软与坚实相互 交缠,你感动于这静美的一幕。让幸福与归属就此驻足吧。你想。不知未来会有怎样一番风雨摧折?也许藤将断、树会倒,也许天会荒,地将老。你又想。那么,请 时光停格在此刻吧。停格即是永恒。永恒里若有这静美的一刻,未来可能遭遇的种种劫难,便已得到了安慰与报偿。
(6)保持单纯
因 为思虑过多,所以你常常把你的人生复杂化了。明明是活在现在,你却总是念念不忘着过去,又忧心忡忡着未来;坚持携带着过去、未来与现在同行,你的人生当然 只有一片拖泥带水。而单纯是一种恩宠状态。单纯地以皮肤感受天气的变化,单纯地以鼻腔品尝雨后的青草香,单纯地以眼睛统摄远山近景如一幅画。单纯地活在当 下。而当下其实无所谓是非真假。既然没有是非,就不必思虑;没有真假,就无须念念不忘又忧心忡忡。无是非真假,不就像在做梦一样了吗?是呀,就单纯地把你 的人生当成梦境去执行吧。
(7)偶尔'俗气'...
吃多了健康食品,偶尔你也想啃一啃鸭舌头和盐酥 鸡。看多了大师名剧,偶尔你也想瞄一瞄耳光摔不完眼泪掉不完的连续剧。听多了古典音乐,偶尔你也想唱一唱爱他一百年又恨他一万年的流行歌曲。你知道健康食 品对健胃整肠有意义,大师名剧对培养气质有意义,古典音乐对提升性灵有意义,可是,偶尔你其实并不想让自己时时刻刻活得那么有意。人生不需要把自己绑得那 么紧。偶尔的小小放纵,是道德的。灵气充满或许接近大人,但偶尔的俗气会更平易近人。
(8)控制情绪 别浪费了~
今 天的你,是不开心的你,因为有人在言语间刺伤了你。你不喜欢吵架,所以你离开;可是你只是离开了那,却没有离开被那人伤害的情境,因此你愈想愈生气。愈有 气,你就愈没有力气去理会别的事情,许多更该用心去做去想去处理的事件,就在你漫天漫地的心烦意乱之中,被轻忽被漠视被省略了。因为,你只是一心一意地在 生气。在情绪上做文章,这是对自己的浪费,而且是很坏的浪费。毕竟,生气也是要花力气的,而且生气一定伤元气。所以,聪明如你,别让情绪控制了你,当你又 要生气之前,不妨轻声地提醒自己一句:“别浪费了。”
(9)抓住最好的时机 绝不错过
你曾经买了一 件很喜欢的衣裳却舍不得穿,郑重地供奉在衣柜里;许久之后,当你再看见它的时候,却发现它已经过时了。所以,你就这样与它错过了。你也曾经买了一块漂亮的 蛋糕却舍不得吃,郑重地供奉在冰箱里;许久之后,当你再看见它的时候,却发现它已经过期了。所以,你也这样与它错过了。没有在最喜欢的时候上身的衣裳,没 有在最可口的时候品尝的蛋糕,就像没有在最想做的时候去做的事情,都是遗憾。生命也有保存期限,想做的事该趁早去做。如果你只是把你的心愿郑重地供奉在心 里,却未曾去实行,那么唯一的结果,就是与它错过,一如那件过时的衣裳,一如那块过期的蛋糕。
(10)偶尔的出离轨道
某 次你搭火车打算到A地去,中途却忽然临时起意在B地下了车。也许是别致的地名吸引了你,也许是偶然一瞥的风景触动了你,总之,你就这样改变了本来预定的行 程,然后经历了一场充满惊奇的意外旅行。A地是你原先的目标,B地却让你体会了小小的冒险。回忆起来,你说,那是一次令你难忘的出轨经验。生命中的许多时 候不也如此?心无旁骛地奔赴唯一的目的,不过是履行了原本的行程而已;离开预设的轨道,你才有机会发现其他的风景。
(11)悄悄 悄悄地 回归平静..
曾 经有一段时间,你心情低落,甚至懒得拉开窗帘,看着窗外的阳光。因此你当然也忘了去看看,窗台上那一盆每天都需要喝水的玛格丽特。如此不知过了多久,总算 有一天,你度过了心情的低潮,同时也想起了你的玛格丽特。天啊,可怜的花,她还活着吗?你战战兢兢地拉开窗帘,却见她迎风招摇,花颜可掬。原来在过去的这 段日子里,你虽然忘了喂她喝水,老天却没忘了以雨露眷顾她呢。许多事物悄悄地在你的视线之外进行,而且悄悄地安排好了它们自己。天生万物,天养万物,一切 其实无须担心......你只要做的就是做好自己,不留任何遗憾...足矣。
1不管是鞋子的哪个地方磨到了你的脚,你就在鞋子磨脚的地方涂一点点白酒,保证就不磨; 2 皮包上有了污渍或者是脏了的话,可以用棉花蘸风油精擦拭; 3 在洗完脸后,用手指沾些细盐在鼻头两侧轻轻摩擦,然后再用清水冲净,黑头粉刺就会清除 干净,毛细孔也会变小; 4 出门是随时在包包里面带一节小的干电池,如果你的裙子带静电的话把电池的正极在裙子上 面擦几下就可以去掉静电了;
5 若有小面积皮肤损伤或烧伤、烫伤,抹上少许牙膏,可立即止血止痛,也可防止感染; 6 牛仔裤穿时间长了就会褪色。可以把新买来的牛仔裤放入浓盐水中浸泡12小时后,再用清水洗净,以后再洗涤时就不会褪色了; 7 豆腐可用来美容。每天早晨起床后,用豆腐一块,放在掌心,用以摩擦面部几分钟,坚持一个月,面部肌肤就会变得白嫩滋润。 8 拉链的保养:拉链不能拉得太急、太猛;不能崩得太紧;保持干燥,防止和酸、碱东西接触;拉链发涩,可涂点蜡,轻轻拉几下,即可; 9 白背心穿久了会出现黑斑,可取鲜姜2两捣烂放锅内加1斤水煮沸,稍凉后倒入洗衣盆,浸泡白背心十分钟,再反复揉搓几遍,黑斑即可消除; 10 巧除领带上的皱纹。打皱了的领带,不用熨斗烫也能变得既平整又漂亮,只要把领带卷在啤酒瓶上,第二天再用时,原来的皱纹就消除了; 11 当你非常口渴而家中又无凉开水时,可把装有热水的杯子放入冷水中浸泡,然后在冷水中撒上一把盐,这样能加速开水的冷却; 12 旅途中遭遇雷雨时,千万不要在巨石、悬崖下和山洞口躲避,电流从这些地方通过时会产生电弧,击伤避雨者。若山洞很深,可躲在里面;
13 吃羊肉有助于保持健美体形,羊肉是理想的肉碱来源,这种和氨基酸类似的物质能帮助细胞 “烧”掉人体多余的脂肪; 14 皮肤粗糙者可将醋与甘油以5:1比例调和涂抹面部,每日坚持,会使皮肤变细嫩。在洗脸水中加一汤匙醋洗脸,也有美容功效; 15 晾晒衣服要诀:衣服最好不要在阳光下曝晒,应在阴凉通风处晾至半干时,再放到较弱的太阳光下晒干,以保护衣服的色泽和穿着寿命; 16 晾晒衣服要诀晾晒衣服不可拧得太干,应带水晾晒,并用手将衣服的襟、领、袖等处拉平,这样晾晒干的衣服会保持平整,不起皱褶;
17 防衣物褪色二法:洗涤深色棉织物时加适量醋,可防止其褪色,且光泽如新;新买的有色花布第一次下水时,加盐浸泡十分钟可防止布料褪色; 18 身上有伤口流血时,可立即在伤口上撒些白糖,因为白糖能减少伤口局部的水分,抑制细菌 的繁殖,有助于伤口收敛愈合; 19 化妆时,先把微湿的化妆绵放到冰箱里,几分钟后把冰凉海绵拍在抹好粉底的肌肤上,你会觉得肌肤格外清爽,彩妆也显得特别清新; 20 画眼线的小技巧:要画好一双细致的眼线,可以先把手肘固定在桌上,然后平放一块小镜子,让双眼朝下望向镜子,就可以放心描画眼线了;
21 专家建议冬天多吃红辣椒、胡萝卜、西红柿、洋葱、山楂等红颜色食品,可预防感冒;每天喝一杯酸奶、一碗鸡汤也有预防感冒的作用; 22 毛巾科学消毒法:将毛巾先用开水煮沸10分钟左右,再用肥皂洗涤,然后用清水充分洗净,最后将毛巾折叠好放入微波炉中,加热5分钟; 23 9种让你笑容绽放的食物:芹菜、乳酪、绿茶、洋葱、香菇、芥末、无糖口香糖、薄荷、水;常食这些食物可消除口臭、防止蛀牙; 24 头皮屑过多可通过饮食改善。多吃碱性食物如水果、蔬菜、蜂蜜等;多吃含维生素B2、B6食物,如动物肝、肾、心、奶类、蛋黄、麦胚等; 25 枕头应有一定弹性,但过强也不好,头部不断受到外加的弹力作用,易产生肌肉疲劳和损伤。如弹簧枕、气枕等,都不能算是有利健康的枕头; 26 冬季当心“低热烫伤”。热水袋内水温不要太热,热力表面不要直接贴近皮肤。糖尿病人或末梢感觉神经迟钝者及婴幼儿最好不用热水袋取暖; 27 减少电脑伤害策略:连续工作1小时后应休息十分钟左右。室内光线要适宜,且保持通风干爽。注意正确的操作姿势。保持皮肤清洁; 28 白色毛衣穿旧了会逐渐发黑,将毛衣清洗后放入冰箱冷冻1小时,再取出晾干,即可洁白如新; 29 钻石保养:不要将钻饰堆放在一起,以免镶托间相互摩擦刮花;做粗重、剧烈活动时,先将钻饰脱下;每隔半年送珠宝店作一次专业性清洗; 30 被子晒法:以化纤面料为被里、被面的棉被不宜在阳光下曝晒,以防温度过高烤坏化学纤维,晒时可在被子上盖一层布,防止阳光直接晒到; 31 不要因为兔毛衫掉毛就不再穿它了,可把它装进一个塑料袋中放入冰箱内冷藏3-4天,就可 以防止它掉毛了; 32 丝巾的妙用。在美容院做好发型,一觉醒来就变形了。不必烦恼,睡前在枕头上铺一条质地光滑的丝巾,就不会弄乱头发,美丽发型得以保持; 33 天热更要防感冒。天热流汗使人们消耗大量的能量,人体抵抗力下降,易患感冒,应注意多喝白开水,少量多次,以每次三百至五百毫升为宜; 34 天热了,许多人有脚臭,以下两法不妨一试:穿鞋时将少许茶叶放鞋里;盆里放温水,放入少许茶叶,把双脚放进去浸泡十分钟,可除臭味!
米醋能抑制皮肤细菌孳生 醋本身就能改变皮肤的酸碱度,软化皮肤的角质层,此外,还能抑制细菌孳生,使毛孔通畅,减少感染性皮肤病的发生。在洗脸水里加点醋是不错的保健方法,醋的 种类以天然的米醋最好,其他食用醋也可以,在一盆洗脸水里滴上7~10滴就可以了。长期使用可增加皮肤细胞的水分和营养,恢复皮肤的光泽和弹性。 绿 茶能收敛肌肤、抗辐射 茶叶中含有茶多酚,有抗氧化作用,可防止肌肤衰老。茶叶还能抗辐射,尤其适合长期用电脑的女性,可抑制皮肤色素沉着,减少过敏反应 的发生。此外,茶叶的鞣酸作用可以缓解皮肤干燥,对于患湿疹的儿童也非常适用。在茶叶中,绿茶的茶多酚含量最丰富。因此,不防经常用绿茶水洗洗脸。 蜂蜜可以抗衰老、防干燥 蜂蜜含有大量能被人体吸收的氨基酸、酶、激素、维生素及糖类成分,不仅能促进皮肤创面的愈合,还能抗衰老,防止皮肤干燥。中干 性肌肤的人,平时可以将2~3滴蜂蜜加到洗脸水中,洗脸时沾湿整个面部再轻轻拍打、按摩面部几分钟,可使皮肤光洁、细嫩。油性皮肤的人则不太适合用蜂蜜水 洗脸。 食盐能去除角质和油脂 用食盐水洗脸有去除角质、收剑肌肤、安抚潮红肌肤的作用,此外还能清除皮肤的油脂,比较适合油性皮肤。一般经过一星期左右的食盐美容,面部皮肤就能呈现一种鲜嫩、透明感。在一盆洗脸水里加两小勺食盐就可以了。
电脑MM护肤的饮食策略 因为电脑有一定的辐射源,会直接影响到我们身体的内分泌系统的稳乱。从而使皮肤代谢不规律等。加上电脑有磁性,会聚积一些灰尘、和不洁的空气,这些都会影响到我们皮肤自身的质量,和加聚皮肤的老化程度。 针对每一种不同类型的皮肤,表现就不同: 油性肤质:就会出油情况严重,或者是出油的同时面部开始发干,也就是缺乏水份,起痘痘,毛孔粗大等; 干性肤质:则表现为皮肤干燥,出现细纹,没有光泽,有黑斑; 混合性肤:这样的肤质,通常具备干性和油性两种肤质的特征,一般是T区油,两颊干。面对电脑的话,两种肤质的特点就越发明显了。 再有就是眼部皮肤的加具老化,和眼部视神经的模糊化。 对策 内调方面不妨试试绿茶和菊花茶这两种弱碱性的茶饮: 绿茶不仅有抗癌的效果,可以清除体内的自由基,还可以有抗辐射的功效;菊花茶是一种清香茶饮,它的妙处在于当眼睛很累时,用菊花茶的热气薰眼部1分钟,眼睛马上感觉到很舒服,大家不妨试一试。 还要多吃一些帮助抗氧化的食物,比如含有维它命A、维它命C和维它命E的食物。 从各种蔬菜和水果中尤其是水果,都可以摄取到丰富的维它命C,因为它是水溶性的; A和E都是脂溶性的,尤其是维它命A,在各种黄颜色的蔬菜中都有,建议用油炒来吃。尤其胡萝卜,胡萝卜素也叫贝塔胡萝卜素,只有用油炒来吃才能真正释放。 再来说说维它命E吧,它又叫生育醇,有非常多的用途,针对于电脑皮肤的人士来讲,时常吃一些天然维它命E的东西,比如动物内脏啊,各种豆类等等,对保护细胞壁非常有效果,从而加强皮肤抗氧化。 最后,平时还要注意多饮水。 每天最好是2500亳升,打个比方,1瓶矿泉水的量是550ML,大约要喝4瓶左右。保持每天1000亳升的排尿量。多吃蔬菜和水果这些弱碱性的食物,保持身体弱碱性状态,少吃酸性食物,这样皮肤就会慢慢改善过来。 面部美容 1. 将香蕉捣碎,加入牛奶,涂在脸上。20分钟后洗净,可以使你的皮肤细腻光滑。 2. 把鸡蛋清和蜂蜜搅拌均匀后涂在脸上可以使皮肤光滑并减少皱纹。 3. 把姜黄粉末和牛奶混合后涂在脸上可以去除晒斑和减少脸上的汗毛。 4.麦片,乳酪和西红柿汁搅拌均匀涂在脸上,20分钟之后再用凉水洗干净,可以帮助恢复晒黑的皮肤,使皮肤有光泽。 5.把生土豆片贴在脸上可以减轻雀斑颜色和疤痕。 6.黄瓜汁是很棒的紧肤水。把黄瓜汁均匀涂在脸上可以收紧毛孔。15分钟后用清水洗干净。 7.黄粉和酸橙汁也可以帮助恢复晒黑的皮肤。酸橙汁是天然的漂白剂。 8.蜂蜜可以使皮肤细腻光滑有光泽,并减少皱纹。 9.桔类水果汁是对付油性皮肤的好选择。 10.用冰块摩擦皮肤可以收紧毛孔并促进血液循环。 除面部皱纹: 鲜黄瓜汁二调羹,加入等量鸡蛋清(约一只蛋)搅匀,每晚睡前先洗脸,再涂抹面部皱纹处,次日晨用温水洗净,连用半至一月,能使皮肤逐渐收缩,消除皱纹有特效. 皮肤粗黑: 靠化妆品增白皮肤,只能一时掩饰,治表不治本,现向你介绍一种治表治本能使皮肤增白而真白的妙方,既简单又有特效:用白醋甘油按5:1混合,常擦皮肤(一 日二三次)能使皮肤湿润,减少黑色素沉积,一月后皮肤即细腻白嫩,洁净光滑富有弹性,充满美感。(此方对遗传黑皮肤均有效). 除雀斑: 杏仁*5钱,研成细粉,用鸡蛋清调匀,每晚睡前涂面部,次日清晨用温水洗去,一日一次,10-15日显效,以后不发. 黄褐班蝴蝶斑: 冬瓜汁白醋等量,调匀涂面部,一日2-3次,涂后过10分钟洗去.连用半月即可除净. 除面部色素斑: 鲜西红柿汁蜂蜜,按5:1混合,涂面部,过10分钟后洗净,连用10-15日,能使黑色素分解,皮肤变白红润. 除粉刺(酒刺青春豆座疮): 鲜黄瓜汁白醋等量调匀,先用热水洗脸后再涂脸,一日三次,涂后过10分钟用温水洗去,连用半月可愈,以后不 除黑痣: 花生仁烧焦捣碎,用酒精调匀,涂痣上,每晚睡前涂上并包好,次日晨洗去,连用半月可除,(大痣需涂一月). 纯中药美容面膜DIY送给爱美的... 1、 单 方白芷面膜:用白芷加上水或蜂蜜,敷于长痘痘处可以消炎。 2、 祛痘面膜:白芨、白茯苓、丹参。可以支祛痘、淡化痘印。 3、 四白面膜:白芨、白茯苓、白芷、白苻子。加水或蜂蜜可以美白、祛斑、对黄褐斑很有效果。 4、 人参增白面膜:人参5克、珍珠5克、白芷2克、白芍3克、白术4克、杏仁4克、当归2克、薏仁4克,具有增白营养、滋润肌肤、防晒等作用。对黑黄 皮肤引起的干燥、肤色无光泽等有护理作用。 5、 杏仁按摩膏,杏仁粉加蜂蜜,是天然的按摩膏对死皮和角质很有作用,适合于干性到中性皮肤。 6、 百合按摩膏,百合粉加蜂蜜,是天然的按摩膏对死皮和角质很有作用,适合于中性到油性皮肤。 7、 薏仁粉面膜,薏仁粉加上白芨,是晒后修复美白皮肤的好东西,适合于各种皮肤。 8、 单方绿豆粉面膜,控油佳品排毒美白面膜:绿豆粉加茯苓粉加蜂蜜,排毒养颜,经常化妆和痘痘肌妹妹的好东西 9、补水美白肌肤的北芪薏米面膜 材 料:北芪25克薏米1两、云苓1两 北芪具有补扬的功效,所谓“气能生津”,透过补气能加强面部血液循环,同时能促进津液自行生化,令内脏得到滋养,皮肤亦自然润华起来。薏米和去苓能减少皮 肤内的湿毒,帮有美白和去湿之效,便集保湿、美白和防皱于一身。想再滋润一点,还可加入蜜糖,令皮肤更具有弹性。 功效:行气保湿、收紧肌肤及美白除斑。 10、洗颜粉蒿本散材料;蒿本、黑牵牛、黑豆、皂角全是等分 用法:每次洗澡前,先取水将蒿本散调成糊状涂在脸上,洗完澡后再洗掉,很简单。脸不但变白了,青春痘也少了很多,很有效果,既有效又如此简单。平时可以作为洗脸粉的作用 11、 抑脂爽肤泽明面膜 材料;泽泻10克、草决明5克、山楂5克、珍珠粉5克、白芷5克。 功效:具有祛脂爽肤、消散脂结、疏导阻塞、软肤洁肤、清凉抑菌的作用。 适应症:对油性皮肤及黑头皮肤以及毛孔堵塞、皮肤粗糙和油腻等渥脂分泌过度症状有护理作用. 细盐美容4个实用妙方~很好用的哦。 一、盐亮肤 洗脸后,把一小勺细盐放在手掌心加水3-5滴,再用手指仔细将盐和水搅拌均匀,然后沾着盐水从额部自上而下的搽抹,边搽边做环开按摩。几分钟后,待脸上的盐水干透呈白粉时状时,用温水将脸洗净,涂上保湿乳液或继续正常的护肤步骤。持续进行,每天早晚洗脸后各一次。 这样有很好的清洁和去污效果,对于毛孔中积聚的油脂、粉刺、甚至是“黑头”都可以去掉。不过按摩时应该避开眼部周围的皮肤,而且敏感性皮肤谨慎些。千万不要把盐水弄到眼睛里去,以免造成眼结膜损伤。 二、盐明目 做完正常的清洁后,打半盆温清水,撒上少量盐让它融化,将脸部浸泡在淡盐水中,在水中睁开眼睛,上下左右活动眼球达到用淡水洗眼的效果。 不出二个星期,你会发现你的眼睛变得明亮且炯炯有神起来,这才是名副其实的“电眼美女”。 三、盐战痘 其实对于背部长有青春痘的“顽疾”,盐一样也有用。入浴后让身体充分温热,待毛孔张开后多抹些盐在后背,各个角落都要抹到。用浴刷按摩1分钟,不要太用力,只要让皮肤及刷子间的盐分移动即可,然后用海绵蘸上淡盐水,贴在背上10分钟,用清水洗干净。 洗几次再看看,背上的痘痘慢慢地被攻克了。 四、盐控油 对于分泌油脂旺盛的T字部位,即使到了秋天,很多油性皮肤的“产油量”还是源源不断的。对于局部区域,可以用细盐抹在事先润湿的皮肤上,轻轻按摩后休息3分钟,然后在鼻翼两侧毛孔张开的部位用中指指腹由下向上做挤压式按摩。
美容美发 一,除去面部皱纹:鲜黄瓜汁加等量的鸡蛋清,每晚睡前洗脸,在涂于面部皱纹处,次日清洗,一个月皮肤收紧,消除皱纹有特效. 二,皮肤粗黑:用白醋加甘油,5:1的混合,常擦皮肤,使皮肤湿润,减少黑色素沉积,一个月后皮肤细腻白嫩,洁净光滑有弹性. 三,除雀斑:杏仁5钱,研成细粉,用蛋清调匀,每晚睡前涂脸部,次日用温水洗去,10到15日显效,以后不复发. 四,黄褐斑,蝴蝶斑:冬瓜汁加白醋,调匀涂面部,一日3次,10分钟后洗去,连续半个月可除去. 五,除面部色素斑:鲜西红柿汁加蜂蜜,5:1的混合,涂面部,10分钟洗去,连用半个月,能使黑色素分解,皮肤变白. 六,除粉刺(酒刺,青春豆,痤疮)鲜黄瓜汁加白醋等量混合,先用热水洗脸,一日三次,涂后10分钟用温水洗去,半个月可愈合. 七,除脱发,头屑,头痒:每次用桑树根皮4钱,水2斤,烧开洗头,一日一次,洗后勿用清水过头,连用5天,能促进头皮血液循环,有固发作用,并治头屑,头痒,可在生发. 八,牙变白:用食盐加小苏打等量,调成牙膏状,每日刷牙一次,3_5天可除牙齿所有色斑,使牙齿洁白. 九,除汗毛,胡须:用旧电池加碱粉,用医用酒精调匀,过5分钟洗去一日一次,5_7天胡须,汗毛即可自动脱落,不在复发,对皮肤无过敏. 每天用淘米水洗脸淘米水中所含的成分可洗去脸上的污垢,其中的维生素B、E也可帮助保持肌肤的滋润。 方法是:用洁面乳洗脸后,用淘米水按摩肌肤3分钟,再用温水清洗。每天坚持可预防雀斑的生长。 蜂蜜的美容功效一直是被公认的,但是怎样才能最大化利用,怎么做才最有效呢? 第一类功效:使皮肤光洁、细嫩 秘方1(蜂蜜+水) 蜂蜜含有的大量能被人体吸收的氨基酸、酶、激素、维生素及糖类,有滋补皮肤的美容作用。用蜂蜜加2—3倍水稀释后,每日敷面,可使皮肤光洁、细嫩。 秘方2(蜂蜜+醋) 蜂蜜和醋各1-2汤匙,温开水冲服,每日2-3次,按时服用。长期坚持,能使粗糙的皮肤变的细嫩润泽。 秘方3(蜂蜜+鸡蛋+橄榄油) 蜂蜜100克,鸡蛋一个搅和,慢慢加入少许橄榄油或麻油,再放2-3滴香水,彻底拌匀后放在冰箱中保存。使用时,将此混合剂涂在面部(眼睛、鼻子、嘴除外),10分钟后用温水洗去,每月做两次(多做效果更佳),能使颜面细嫩,青春焕发。 第二类功效:减少皱纹,紧缩面部皮肤 秘方4(蜂蜜+苹果+乳脂) 将苹果煮沸,捣碎,加入蜂蜜与乳脂,制成润肤膜膏,敷面令你肤洁如玉。 秘方5(蜂蜜+鸡蛋清) 蜂蜜50克,鸡蛋清一个,两者搅拌均匀,睡前用干的软刷子刷在面部,慢慢进行按摩,约30分钟自然风干后,用清水洗去,每周2次。 第三类功效:去斑 秘方6(蜂蜜+甘油+水+面粉) 蜂蜜1份、甘油1份、水3份、面粉1份,混合均匀制成敷面膏,敷于面上20分钟后,用清水洗去,此法适用于普通干燥性衰萎皮肤。可使皮肤嫩滑细腻,除去皱纹及黄褐斑,并能治疗暗疮。 秘方7(蜂蜜+鲜蜂王浆+鸡蛋清+花粉+水) 蜂蜜1匙、鲜蜂王浆1匙、鸡蛋清1个,加入适量花粉和水调成糊状,涂于面部,30分钟后用温水洗去,再用鲜蜂王浆1克加少许甘油调匀涂于面部,每周一次。对清除脸部黑斑及暗疮特别有效。 第四类功效:保湿 秘方8(蜂蜜+奶粉+鸡蛋清) 蜂蜜1匙、奶粉1份、鸡蛋清1个, 混合均匀制成面膜,用棉签将其在脸上涂上薄薄一层,20分钟后用温水洗去。连续使用一个月。对皮肤干燥有明显效果。 去除黑眼圈:*~* 1、把鸡蛋用水煮熟去壳,拿手帕将鸡蛋包着,然后在黑眼圈位置来回热敷,热力加按摩令皮下血液循环。每天一次。 2、切开柿子。用匙羹挖出柿肉并搅烂,敷在眼上10分钟然后用湿毛巾抹掉。早晚一次。柿子以熟透为佳。作用:柿子含丰富维他命C,增强皮肤的更新能力。 3、泡茶后的茶包对黑眼圈也有帮助作用。 去除黑眼圈可多吃以下食物: 1、鸡蛋:由于鸡蛋中富含优质蛋白质,而蛋白质又能促进细胞再生,因此经常食用鸡蛋,增加蛋白质的摄入,对于缓解黑眼圈的形成是有一定功效的。但因人体每日最多只能吸收两个鸡蛋所含的营养,因此食用鸡蛋不宜超过两个。 2、芝麻:富含对眼球和眼肌具有滋养作用的维生素E,从而能缓解黑眼圈的形成。既能使秀发乌黑靓丽,又能消除黑眼圈,一举两得。除了芝麻,富含维生素E的其他食物还有花生、核桃、葵花子等。 3、胡萝卜:除了维生素E能对眼球和眼肌有滋养作用外,维生素A也有此般功效。胡萝卜就是增加维生素A摄入量的最佳选择,它能维持上皮组织正常机能,改善黑眼圈。此外,胡萝卜中所含的维生素A还有助于增进视力,尤其是黑暗中的视力。 4、海带:富含铁质,经常食用能缓解黑眼圈的困扰。 5、绿茶:经常用电脑者可多饮用绿茶,补充特异性植物营养素,消除因电脑辐射引起的黑眼圈。多喝低咖啡因的绿茶不仅能消除黑眼圈,其含有的儿茶素,既能帮助身体脂肪代谢,而且对睡眠也有帮助,不仅可以安定睡眠质量,也让人比较不容易有疲劳感觉。 清除黑眼圈最好的方法: 1.血管性静脉循环不良所引起的黑眼圈,在睡眠不足、过度疲劳时会更为明显。保持充足的睡眠、呼吸新鲜空气,多摄入氧气均可改善,而局部的眼圈按摩对促进静脉循环回流也会有帮助。 2. 如果是黑色素沉淀和过敏导致的黑眼圈,须先寻找出病源以治病着手,再配合一些祛斑用品及相应的眼霜、眼胶予以护理。这种后天性的色素沉淀在经过一段正确的 治疗后是会淡化的。而若是有家族遗传性黑眼圈的人,在处理上较为棘手,而实际获得的改善也极其有限,最终还是需要化妆的帮助。 3.对于疲劳性的黑眼圈患者则需要从日常生活做起逐步清除黑眼圈。 a.安排好生活,保证充足的睡眠,绝不可熬夜。同时睡觉时仰睡而不是俯睡,并尽量使用柔软的枕头。 b.应尽量避免过度地搓揉眼部。 c.喜欢化彩妆的人,眼部卸妆要彻底,最好用专业眼部卸妆液卸妆。 d.当您起床时黑眼圈太过严重时,有一招急救法:用热毛巾覆盖眼睛四周,来回重复多次,再用冰茶袋敷几分钟,最后涂上眼霜即可。此外多汁的苹果片、未长芽的土豆片和煮熟的鸡蛋都是暂时消除黑眼圈的好帮手。 e.一些耗氧运动,使血液保持充足的氧分。亦可在早上或晚饭后出外散步,呼吸新鲜空气
web项目脚手架¶
rapid- framework是一个以spring为核心的项目脚手架(或者称为胶水框架),框架将各个零散的框架 (struts,strust2,springmvc,hibernate,ibatis,spring_jdbc,flex)搭建好,并内置一个代码生 成器,辅助项目开发,可以生成java的hibernat model,dao,manager,struts+struts2 action类,可以生成jsp的增删改查及列表页面
在线文档
请加入google-group参与讨论
rapid-framework官方网站
项目定位¶
本 框架是类似appfuse,springside的框架,但定位与springside及appfuse不同,它们更像是一些代码的最佳实践,而 rapid-framework则是应用于实际项目开发的脚手架, 并且代码也将优化至极致.使用脚手架3分钟即可以搭建出一个实际项目.
框架概览¶
- Dao: spring_jdbc, hibernate, ibatis2, ibatis3, 可以切换dao组件
- Dao Helper: 基于dialect的分页(ibatis2, ibatis3, jdbc),动态sql构造工具rapid-xsqlbuilder
- Web MVC: struts1, struts2, springmvc, springmvc_rest, 可以切换web组件
- Template: (velocity, freemarker, jsp)的模板可以相互继承, velocity及freemarker可以实现模板之间的管道操作
- 分页组件: extremeTable, rapid-simpletable
- UI: rapid-validation表单验证, My97DatePicker日期控件
- 单元测试: spring test+DBunit
- 底层支撑: 插件体系及代码生成器(rapid-generator)
项目质量¶
代码生成器生成的增删改查截图
后续请查看v2.x路线图: roadmap
http://code.google.com/p/rapid-framework/
运用Lightbox和Modal Dialog可以很方便地在浏览器中展示内容,而无需重载整个页面,有了Lightbox就不必再使用浏览器弹窗了。Lightbox正愈来愈广泛地应用于媒体、网页、邮件、表格等元素的展示。 本文将为你介绍15款优秀的Lightbox和Modal Dialog特效,供网站开发者参考。 1. Facebox facebox是一个jquery为基础的Lightbox,可显示图像,divs,或者远程页面。它的使用很简单。 下载地址:http://chriswanstrath.com/facebox
2. Colorbox ColorBox是一个轻量级,可定制的Lightbox插件,可以在jQuery 1.3 和1.4中使用,ColorBox支持 照片,照片组,幻灯片,ajax,内联 和 iframe 框架。 下载地址:http://colorpowered.com/colorbox/
3. jQuery Lightbox Plugin jQuery LightBox plugin是一个简洁优雅的插件,不需额外扩展代码就可以把当前页面上的图片通过一个遮罩显示出来,这主要是通过jQuery强大灵活的选择器来实现的。 下载地址:http://leandrovieira.com/projects/jquery/lightbox/
4. prettyPhoto prettyPhoto是jQuery Lightbox的一个“克隆”。实际上它不仅能显示图片,还能显示许多的类型,比如在可能弹出的层窗口中加载视频、Flash动画、一个已布局好的网页、一个框架页等等。 下载地址:http://www.no-margin-for-errors.com/projects/prettyPhoto-jquery-lightbox-clone/
5. jQuery Dialog 这是一个 jQuery 的对话框插件,可以根据你的喜好很方便地自行定制对话框。 下载地址:http://jqueryui.com/demos/dialog/
6. Prototype Window 你可以把它用到ASP.NET,Ajax,Java等等所有网页上,可以实现改变窗口大小、最小化、最大化窗口、模型对话框、渐入渐出的渐变效 果,支持皮肤等功能。现有的实例包括:模仿MAC OS的对话框,在对话框中打开一个网页,警告框,确认对话框,信息对话框,登录对话框,Ajax对话框等等。 它的原型基于对话框插件。 下载地址:http://prototype-window.xilinus.com/samples.html
7. MochaUI MochaUI 是一个用于开发Web应用的用户界面库,基于Mootools的JavaScript框架。 下载地址:http://mochaui.com/
8. Boxy Boxy是一个可灵活实现类似Facebook风格对话框的jQuery插件,支持对对话框进行拖拉和改变大小等操作。 下载地址:http://onehackoranother.com/projects/jquery/boxy/
9. ModalBox Modalbox可用来增强Web应用中的用户交互,开发它的灵感来自Mac OS X的模块动态对话。 下载地址:http://www.wildbit.com/labs/modalbox/
10. Shadowbox Shadowbox是一个在线媒体展示应用,支持绝大多数的网络媒体常用格式。Shadowbox完全是基于JavaScript和CSS编写的,高度可定制化。 下载地址:http://www.shadowbox-js.com/
11. jqModal jqModal是jQuery的一个插件,用来在浏览器中显示通知,对话框和模型窗口。它简直如瑞士军刀一般灵活和小巧,而且它为通用目的窗口框架奠定了基础。 下载地址:http://dev.iceburg.net/jquery/jqModal/#examples
12. Highslide Highslide是一个用Javascript写的图片影像特效浏览器,外观简洁优雅。 下载地址:http://highslide.com/
13. PiroBox 风格时尚且现代的Lightbox控件,采用jQuery开发。能够根据浏览器窗体大小自动调整展示图片大小。提供向前/向后控制链接。动态加载图片效果。易于定制。 下载地址:http://www.pirolab.it/pirobox/#howto
14. imgBox imgBox是一个可以实现图片平滑放大效果的jQuery插件。 下载地址:http://jqueryglobe.com/labs/imgbox/
15. jQuery Tools jQuery Tools是一个当前网站开发中最常用的UI组件集合。 下载地址:http://flowplayer.org/tools/overlay/index.html
如果我不再是过去的我,
你还会回到我身边吗?
Thriller
谨以此
献给流行之王
Michael Jackson
Zion架构下载支持
很小,很强大 736KB
- 不到1MB小身材,绿色软件免安装
- 原生读取压缩文件(RAR/ZIP)
- 原生无缝播放支持(压缩状态有效)
- Pure Music纯音还原技术,还原纯净好声音
- 自主开发Zion架构图形及音频引擎
- 歌词支持,及专辑图片显示,支持预览
- 多种格式,无损音频全兼容(支持内嵌CUE)
- 支持多种列表格式,目录列表及智能列表
- 全局快捷键及多媒体键盘支持
02222cf46fe0ee1c5b1b4316403c30f7
下载地址:http://dl.podez.com/zion/AIRPLAY.exe
详情 http://www.podez.com/zion.php
"你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚. 但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起."
1.SRP单一职责原则[适用于类功能] (就一个类而言,应该仅有一个引起它变化的原因.) 详细说明: 如果一个类承担的职责过多,就等于把这些职责耦合在一起. 一个职责的变化可能会削弱或者抑制这个类完成其它职责的能力. 这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏. 结论: 它是所有类设计原则最简单的,也是最难正确使用的. 我们会自然的把职责结合在一起,软件设计真正要做的内容就是发现职责并把那些职责相互分离. 2.OCP开放-封闭原则[适用于类抽象] (软件实体(类,模块,函数...)应该是可以扩展的,但是不可以修改.) 详细说明: OCP=对于扩展是开放的,对于修改是封闭的. 如果程序中的一处改动就会产生连锁反应,导致一系列相关模块的改动,那么设计就有臭味. OCP建议我们如果要对系统进行重构,就只需要添加新的代码,而不必改动已经正常运行的代码. 结论: 在许多方面,OCP都是面向对象设计的核心. 尊循它可以带来巨大的好处(程序的灵活性,可重用性,可维护性). 在代码中肆意使用OCP也不是一个好主意. 正确的做法是:开发人员仅仅对程序中呈现频繁变化的部分做出抽象!拒绝不成熟的抽象和抽象本身一样重要! 3.LSP Liskov替换原则[适用于类层次] (子类型必须能够替换掉它们的基类型.) 详细说明: Barbara Liskov在1988年说道: Liskov替换性质:若对每个类型S的对象O1,都存在一个类型T的对象O2, 在所有针对类型T编写的程序P中,用O1代换O2后,程序P行为功能不变,则类型S是类型T的子对象. 结论: LSP是使用OCP开放-封闭原则成为可能的主要原则之一, 正是子类型的可替换性才能用基类类型(基类引用或者指针)的模块在无需修改的情况下就可以扩展. 这种可替换性是开发人员可以隐式依赖的东西. 因此,如果没有显示的强制基类类型的契约,那么代码就必须良好并明显的表达出这一点. 术语"IS-A"不能作为子类型的定义, 子类型的正确定义是"可替换性","可替换性"可以通过显式或者隐式的(动态绑定必须用基类类型)契约. 4.DIP依赖倒置原则[适用于类层次] (抽象不应该依赖细节.细节应该依赖抽象.) 详细说明: a.高层模块不应该依赖于低层模块,二者都应该依赖抽象(使用接口或者虚类来连接). b.抽象不应该依赖于细节,细节应该依赖于抽象. 结论: 使用传统的过程化程序设计方法所创建出来的依赖关系结构和策略是依赖于细节. DIP使得细节和策略都依赖于抽象,并且常常为客户定制服务接口. 事实上,这种依赖关系的倒置是好的面向对象的程序设计的标记. DIP正确应用对于可重用框架是必须的,对于构建在变化面前富有弹性的代码也是非常重要的. 由于抽象和细节被DIP彼此隔离,所以代码也非常容易维护. 5.ISP接口隔离原则[适用于类的接口] 不应该强迫客户程序依赖于它们不用的方法. 接口属于客户,不属于它所在的类层次结构. 详细说明: 分离客户就是分离接口.分离接口有2种方法:委托和多重继承 接口隔离原则是用来处理胖接口所具有的缺点. 如果类接口不是内聚的,就表示该类的接口是胖的,需要减肥. 减肥的原则是接口分成多组方法,每一组方法都服务于一组不同的客户程序! 客户程序面对的就是多个具有内聚接口的抽象基类. 结论: 胖类会导致它们的客户程序之间产生不正常的有害的耦合关系. 当客户程序要求胖类进行一个改动时,会影响到所有其它户程序. 因此,程序应该仅仅依赖于它们实际调用的方法. 通过把胖类的接口分解为多个特定的客户程序的接口,可以实现这个目标. 每个特定于客户程序的接口仅仅声明它自己调用的函数. 解除了类的客户程序之间依赖关系,使它们互不依赖. 6.REP重用发布等价原则[适用于包] (重用的粒度就是发布的粒度) 详细说明: 当你重用别人一个类库时,你的期望是什么? 当然是好的文档,可以工作的代码,规格清晰的接口! 你希望作者会一直维护类库代码,当作者都把类库的接口和功能进行任何改变时,你希望得到通知. 代码的作者把它们的软件组织到一个包中(dll,jar,...),所以我们重用的粒度就是包的发布粒度. 结论: 一个包的重用粒度和和发布粒度一样大,由于重用性是基于包的,所以可重用的包必须包含可重用的类. 7.CCP共同封闭原则[适用于包] (包中的所有类对于同一类性质的变化应该是共同封闭的. 一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其它包不造成任何影响.) 详细说明: 这是SRP单一职责原则对包的重新规定.这规定了一个包不应该包含多个引用包变化的原因. 在大多数应用中,可维护性超过可重用性. 代码更改:如果代码要更改,原意更改都集中在一个包中,而不是分布于多个包中. 代码发布:我们也只发布更改中的包! 结论: CCP鼓励我们把可以由于同样的原因而更改的所有类共同聚集在同一个包中. 8.CRP共同重用原则[适用于包] (一个包中的所有类应该是共同重用的. 如果重用了包中的一个类,那么就要重用包中的所有类.) 详细说明: 一个包中的所有类应该是共同重用的. 结论: 如果重用了包中的一个类,那么就要重用包中的所有类. 这个原则可以帮助我们决定哪些类应该放进同一个包中. 9.ADP无环依赖原则[适用于包] (在包的依赖关系图中不允许存在环.) 详细说明: 如果开发环境中有许多开发人员都在更改相同的源代码文件集合的情况, 因为有人比你走的晚,且改了你所依赖一些东西(类或者方法),第二天来上班, 你昨天完成的功能,今天不能正常工作,那么就会发生"晨后综合症"! 针对此问题有两个解决方案:"每周构建"和"消除依赖环" 每周构建:应用于中等规模的项目中,它的工作方式为:每周1-4,开发人员各自工作在私人的代码空间,周5-6联合调试! 消除依赖环:通过把开发环境划分成可发布的包,可以解决依赖环. 结论: 解决包之间的依赖环有两个主要方法: 1.使用依赖倒置原则,在类和依赖类之前添加一个依赖的接口或者抽象类,解除依赖环. 2.添加新类,把类和依赖类之间的依赖移到一个新的类,解除依赖环. 10.SDP稳定依赖原则[适用于包] (朝着稳定的方向进行依赖.) 详细说明: 设计不是完全固定的,要使设计可维护,某种程序的易变性是必要的. 使用这个原则,我们可以创建对某些变化类型敏感的包.
其它的包不要依赖这个要变的包. 软件包就可以分为稳定包和可变包! 如何识别稳定包和可变包?如果许多其它的包都依赖此包,那么它就是稳定包,否则就是可变包! 把包放在不同的位置,它的稳定性是不同的. 如何计算一个包的不稳定性?(输入耦合度Ca,输出耦合度Ce) 不稳定值=Ce/(Ca+ce),此值越低越稳定! 结论: 把可变包不稳定值降低的方法是:为它加上一个抽象外衣(interface/抽象类),其它包调用抽象外衣! 可变包为抽象外衣的实现! 11.SAP稳定抽象原则[适用于包] (包的抽象程序应该和其它稳定程序一致.) 详细说明: 此原则把包的稳定性和抽象性联系到一起. 一个稳定的包应该是抽象的,这样它的稳定性就不会使其无法扩展; 一个不稳定的包应该具体的, 这样它的不稳定性使代码易于修改. 结论: 它指出一个包有时候应该达到部分是可抽象的,部分是不稳定的原则
该聊天程序包括服务器和客户端两部分,使用是MFC的CSOCKET类。它可以使多个人聊天,其工作方式类似于网上聊天室。客户端可以选择谈话对 象,有32种动作,可以设置字体颜色,也可以悄悄地对某人说,对信息进行过滤。服务器端可以“踢“人,并可以防止用户名称的重复 chatsource.rar (3.09 MB)
解压密码:www.topnetsecurity.com
该消息原文来自于:http://www.topnetsecurity.com/viewthread.php?tid=279&extra=page
http://code.google.com/p/excelreport/
ExcelReport是一款基于Excel的轻量级地报表生成工具,它通过用户定义报表模板文件,定义数据源,并配置相应的配置文件,就可以通过页面向 指定Servlet请求输出报表,其生成的报表是一个excel文件。通过模板文件的方式来生成Excel文件,可以让程序员从对生成特定格式的 Excel文件输出格式的控制以及Excel文件读写等纷繁复杂而又容易出错的细节中解放出来,使得程序员只需组装自己的数据源,而根本不需要关心如何去 生成Excel文件,如何用程序去控制最终的文件输出效果,从而大大增强了程序的可维护性,因为很多的报表输出格式的修改只需通过模板文件的修改就可以实 现,而无需改动程序。同时该报表工具又提供一些灵活的特性来使得用户可以自由控制报表的输出过程。 ExcelReport的灵活性 数据源的自定义: 用户可以自己定义数据源以替代默认实现,例如,我们可以编写一个自己的数据库数据源,通过定义该数据源我们可以利用现有系统的数据库连接及数据检索框架等。 嵌入报表数据处理类: 用户可以嵌入自己报表数据处理类(通过配置文件配置),通过嵌入用户自己的报表数据处理类,报表工具给用户提供了一个入口让用户参与报表的生成过程。比 如,用户可以在生成报表前来组合自己的数据源,在这里用户完全可以充分利用现有系统的相关业务类来生成自己的数据源。 插入查询监听器: 用户可以插入自己的查询监听器,通过监听数据源的查询请求来做相关数据的检索及处理等工作(该功能在主从报表中尤其有用)。 插入字段监听器: 通过插入字段监听器,使得用户可以参与报表的输出过程,控制报表的具体输出的数据。 目前它具有那些功能? 1. 卡片式报表的支持。 2. 列表式报表的支持。 3. 主从式报表的支持。 4. 分组式报表的支持。(注:主从式和分组式之间可以任意嵌套,即一个主从式报表中我们可以嵌套一个分组从而实现对主记录或从记录进行分组的功能,反之也如此。) 5. 格式化的数据输出,该报表工具支持所有Excel的格式化输出控制。 6. 支持所有Excel的函数。 它与普通报表工具的区别: 1. ExcelReport是一个完全基于excel的报表工具,其最大的特点是完全依赖于excel。这是其于其他任何报表工具的最大区别。 2. 通过依赖于Excel它具备了以下优点: a. 省略了专门的报表模板定义工具,应为该工具就是Excel本身,相信Excel的强大功能可以胜过任何其他报表工具模板定义工具。 b. 可以充分利用Excel的强大功能,如Excel函数库及其相关的脚本技术,Excel的图表(暂未提供支持)以及其对打印功能的强大控制能力。
编者按:原文作者乔纳森·丹尼可(Jonathan Danylko)是一位自由职业的web架构师和程序员,编程经验已超过20年,涉足领域有电子商务、生物技术、房地产、医疗、保险和公用事业。正如乔纳 森在文中所言,本文适合刚毕业的大学生和刚入门的程序员。如果你已是高级开发人员,或许你在本文中看到自己的身影。
从11岁时,我就一直在编程,并且一直都很喜欢技术和编程。这些年来,我积累了一些艰难又容易的经验。作为一名程序员,你或许还没这些经验,但我会把它们献给那些想从中学到更多的朋友。
我会持续更新这些经验,我可能还会有更多的感想,但就我这20年来看,我想下面这个列表中基本不需要增添额外的东西了。下面就是我至今最难忘的经验。
1. 估算解决问题所需要的时间。不要怕,承认吧!我曾见过一些程序员为了解决一个特殊问题而坐在显示器前面8小时。为自己定一个时间限制吧,1小时、30分钟或甚至15分钟。如果在这期间你不能解决问题,那就去寻求帮助,或到网上找答案,而不是尝试去做“超级堆码员”。
2. 编程语言是一种语言,只是一种语言。随着时光推移,只要你理解了一种语言的原理,你会发现各种语言之间的相似之处 。你所选择的语言,你应该觉得“舒服”,并且能够写出有效(而且简洁)的代码。最重要的,让语言去适应项目,反之亦然。
3. 不要过于注重程序的“设计模式”。 有时候,写一个简单的算法,要比引入某种模式更容易。在多数情况下,程序代码应是简单易懂,甚至清洁工也能看懂。
4. 经常备份代码。在我年轻时,我就有过因硬盘故障而丢了大量代码的经历,这经历很恐怖的。只要你一次没有备份,就应当像有着严格的期限,客户明天就需要。此时就该源码/版本控制软件大显身手了。
5. 承认自己并不是最顶尖的程序员 - 知不足。我常想,我对编程了解已足够多,但是总有其他人比你优秀。正所谓,“一山总比一山高”。所以,向他们看齐吧!
6、学习再学习。正如第5点所说,我经常会在手里拿一本计算机或编程相关的杂志或书(不信,可以问我的朋友)。诚然,总有很多你不知道的技术,你可以从中学习以保持不落后。如果你有一种灵巧的方式来获取你需要的新技术,那你每天都应该坚持学习。
7. 永恒的变化。你 对待技术/编程知识,就应像你对待股票一样:多样化。不要在某一特定技术上自我感觉良好。如果那种技术或语言已经没有足够支持,那你还不如现在就开始更新 你的简历,并启动培训新计划。我能保持前行的主要原则是什么呢?至少了解两到三种语言,所以,如果某种语言过时了,你在学习新技术的时候还可以依靠另一种 语言。
8. 提携新人。协助并且培养初级/入门的开发人员学习优秀的编程方法和技巧。也许你还不知道,在帮助他们向更高一层前进时,你自己也在向更高一层提升,你会更加自信。
9. 简化算法。代码如恶魔,在你完成编码后,应回头并且优化它。从长远来看,这里或那里一些的改进,会让后来的支持人员更加轻松。
10. 编写文档。无 论是Web服务的API,还是一个简单的类,你尽量编写相应文档。我曾经引以为豪的代码注释,因过度注释而有人指责。给三行代码加一行注释,只需要你几秒 时间。如果那是一个比较难以理解的技术,千万别担心过多注释。如果你能很好做好自己的工作,大多数架构师、后备程序员、支持组都会感激你。
11. 测试、测试再测试。我是一名黑盒测试粉丝。当你完成编码后,你“被认可”的时候就开始了。如果你们公司有QA部门,如果你的代码中有错误,那你得到的评论,会比项目经理还多。如果你不彻底测试自己的代码,那恐怕你开发的就不只是代码,可能还会声名狼藉。
12. 庆祝每一次成功。我见过很多程序员在解决编程技术难题后,会和同伴握手、击掌或甚至手舞足蹈。每个人在生命中都会碰到“顿悟”。如果一个程序员高兴地跑来叫你去看他的非凡代码,也许你已经看过这样的代码100遍了,但你也应该为了这个家伙而庆祝第101次。(编者注:《庆祝成功的九种方式》。)
13. 经常检查代码。 在公司,你的代码要经常检查(包括自查和其他同事检查)。不要把别人的检查,看成是对代码风格的苛求。应该把它们看作是有建设性的批评。对个人来说,经常检查你的代码并且自问,“我怎样才能写得更好呢?” 这会让你加速你的成长,让你成为一个更优秀的程序员。
14. 回顾你的代码。在 看到自己以前的代码时,通常会有两种方式:“难以至信,这代码是我写的”和“难以至信,这代码是我写的”。第一种往往是厌恶的语气,并在想如何改进它。你 也许会惊叹,旧代码也能复活成为一种更好的程序,甚至是一个完整的产品。第二种通常带着惊奇和成就感。开发人员应该一到两个自己完成的项目成果,能让众人 不禁而立并注目而观的项目。同样,基于你优越的编程能力,你可以把过去的程序或项目拿出来,把它们更新为更加优秀的产品或想法。
15. 幽默是不可缺的。在我20年的开发生涯中,我还没有碰到哪位程序员是没有幽默感的。实际上,干我们这行,幽默是一项必备品。
16. 谨防那些无所不知的程序员,不愿分享的程序员,还有经验不足的程序员。当你遇到这几种程序员时,你自己要谦虚。无所不知的程序员,更想当一个英雄而不是团队成员;保守的程序员则是在编写着他们独享的代码;而经验不足的程序员则会每十分钟就来问你一下,当代码完成后,代码已经是你的,而不是他们。
17. 任何项目都不会那么简单。朋 友、家人和同事曾请求我仓促做一些事情,仓促做一个程序或者网站。对于这样的事,应该从双方做计划,才能做出令两方都会满意的东西。如果某人起初只是需要 一个使用Microsoft Access的、只有有3个页面的网站,但来就很可能变成一个有15个页面的网站,并使用SQL Server,有一个论坛,还有一个定制的CMS(内容管理系统)。
18. 任何时候不要想当然。假如你承接一个简单的项目,你可能会认为某个部分可以轻松完成。千万别这样想!除非你有一个类、组件、或者一段已经写好的代码,并且在现有的项目已经测试通过。不要认为这将是很容易的。
19. 没有已经完成的软件。曾经有一位程序员告诉我,没有软件是已经完成的,它只是“暂时完成了”。这是明智的忠告。如果客户还在使用你写的程序,并经受了时间的考验。如果有机会,你仍在更新它,这并不是什么坏事,这让你不断地前行。
20. 耐心是一种美德。当 客户、朋友或家庭成员用电脑的时候,他们也许会受挫,进而想砸电脑,或气冲冲地离开。我一直在告诉他们,“是你掌控电脑,不是电脑掌控你。”对于用作编程 的电脑,你要有一定的耐心。一旦程序员知道问题所在后,他们就会站在电脑的角度看问题,并且说 “哦,这就是为什么它是这样做。”
编者后话
对本文深有感触!虽然本文没有华丽的辞藻,其中朴实的道理,其实并非只适用程序员,同样可以扩展到其他行业。记得以前练字时,总感觉当时写得很好,但后来回头再看时,也会想“这居然是我写的字!”
在阅读本文的朋友,不知你是否也有看到了自己的身影呢?欢迎你在微博或评论中和大家一起分享感触。
A java based workflow suite,include engine、designer...
一个java工作流套件,包含引擎、设计器等等。欢迎大家积极报告错误,同时也欢迎大家加入Fireflow。
QQ群号是:200人高级群 80347522(已满)
500人超级群 32897788
官方论坛:www.fireflow.org
Fire Workflow的开发计划¶
- 流程模型+引擎:已于2009年2月2日发布预览版本
- netbeans设计器-模拟器插件:已经发布预览版本。
- eclipse设计器-模拟器插件:已于2009年2月2日发布预览版本。
- 图形化流程实例跟踪:即在浏览器中显示流程执行的进度情况,使用SVG技术。尚无明确时间表。
- 基于Web的流程自定义程序:严格说是对系统已经存在的流程作局部调整,而不是完全的自定义。这个东东是否有必要,怎么实现,正在考虑中。
A java based workflow suite,include engine、designer...
一个java工作流套件,包含引擎、设计器等等。欢迎大家积极报告错误,同时也欢迎大家加入Fireflow。
QQ群号是:200人高级群 80347522(已满)
500人超级群 32897788
官方论坛:www.fireflow.org
Fire Workflow的开发计划¶
- 流程模型+引擎:已于2009年2月2日发布预览版本
- netbeans设计器-模拟器插件:已经发布预览版本。
- eclipse设计器-模拟器插件:已于2009年2月2日发布预览版本。
- 图形化流程实例跟踪:即在浏览器中显示流程执行的进度情况,使用SVG技术。尚无明确时间表。
- 基于Web的流程自定义程序:严格说是对系统已经存在的流程作局部调整,而不是完全的自定义。这个东东是否有必要,怎么实现,正在考虑中。
A java based workflow suite,include engine、designer...
一个java工作流套件,包含引擎、设计器等等。欢迎大家积极报告错误,同时也欢迎大家加入Fireflow。
QQ群号是:200人高级群 80347522(已满)
500人超级群 32897788
官方论坛:www.fireflow.org
Fire Workflow的开发计划¶
- 流程模型+引擎:已于2009年2月2日发布预览版本
- netbeans设计器-模拟器插件:已经发布预览版本。
- eclipse设计器-模拟器插件:已于2009年2月2日发布预览版本。
- 图形化流程实例跟踪:即在浏览器中显示流程执行的进度情况,使用SVG技术。尚无明确时间表。
- 基于Web的流程自定义程序:严格说是对系统已经存在的流程作局部调整,而不是完全的自定义。这个东东是否有必要,怎么实现,正在考虑中。
为Google app engine开发JAVA Hello Word
After hearing the buzz about java support in Google App Engine I decided to write a hello, world application and run it on Google App Engine.
在听说GAP 支持java以后,我决定写一个在gap 上运行的java hello world程序。我使用的开发工具是eclipse 3.4,google推出了gap的Eclipse插件,以方便开发者。
添加Eclipse的Google app engine plugin
第一步: 打开eclipse,选择 帮助>软件更新>添加站点。站点的url 是:
1. http://dl.google.com/eclipse/plugin/3.4
勾选sdk,plugin,toolkit 可选,点击安装,重启Eclipse等更新完成。
创建工程
创建一个新的web application ,点击file >New >project,在对话框中选择google下面的google web application。
指定web应用的名称和包的名称。为了保持应用的简单,不要勾选‘use GWT’ and check ‘,勾选‘Use app engine’,之后点击完成。
这样就生产了应用文件,工程结构如下:
本地运行web应用
Right click on your application and click on Run as… > Web Application.
右键点击helloword工程,选择Run as… > Web Application.
Eclipse将启动web app服务器在端口8080,你可以通过这个url访问应用:
1. http://localhost:8080/helloworld
Create a Google App Engine account
创建gap 帐号
Before you can deploy you hello world application to google app engine, you need to create an account on google app engine.
在你把web应用部署在gap以前,你必须创建一个gap帐号。可以登录http://appengine.google.com/按照步骤创建app帐号。
首先通过已有的google帐号登录,当你第一次创建app帐号的时间必须通过短消息验证。我们选择 其他国家和地区,手机号码输入:+086 13888886666 (13888886666是你的手机号码,可以接受短信),之后在下一步的验证中输入你的手机收到的验证码。
选择一个唯一的application ID
Application id, 就像登录名字一样必须是唯一的。在操作之前你必须选择一个唯一的id。在你选择application id后,http://<你的 application id>.appspot.com 就是你的应用的地址。
配置eclipse application的application id
右键点击 helloworld工程,google >app engine settings。
输入你的application id。也可修改appengine-web.xml中的application标签。
<application>wjjapp</application>
部署你的app到Google app engine
右击 你的应用> Google > Deploy to app engine.输入google帐号名,和密码,点击部署即可。
完成上面的步骤后,你的web应用就部署到了Google app engine.如果部署失败,收到这样的消息:
java.io.IOException: Error posting to URL: http://appengine.google.com/api/appversion/...
1. 400 Bad Request
2. Invalid runtime specified.
3.
4. Unable to upload app: Error posting to URL: http://appengine.google.com/api/appversion/...
5. 400 Bad Request
6. Invalid runtime specified.
这是由于你没有访问java version的权限,你可以点击 here申请。
申请成功的话,你将会收到google的mail通知,这个过程一般需要1到2天的时间。Email如下:
再次尝试部署web应用,这次将会成功,你将看到下面的控制台输出:
1. Creating staging directory
2. Scanning for jsp files.
3. Scanning files on local disk.
4. Initiating update.
5. Cloning 1 static files.
6. Cloning 13 application files.
7. Uploading 5 files.
8. Uploaded 1 files.
9. Uploaded 2 files.
10. Uploaded 3 files.
11. Uploaded 4 files.
12. Uploaded 5 files.
13. Deploying new version.
14. Will check again in 1 seconds
15. Closing update: new version is ready to start serving.
16. Uploading index definitions.
17. Deployment completed successfully
在线访问你的应用
登录 google app engine,你将看到你的application页面。
你将看到你的版本号为1的web应用,点击链接,打开应用。链接如下的格式:http://<applicationid>.appspot.com, 例http://wjjapp.appspot.com/.
对于 Java 程序员来说,除 SSH 之外,的另一个选择:
Nutz
当然,它是开源的,并且是完全免费的,同时也是商业友好的(Licensed under the Apache License, Version 2.0)。
同传统的 SSH 相比,它具备如下特点:¶
- 轻 -- 当前最新版,整个 jar 文件共 820k
- 薄 -- 针对 JDBC 的薄封装,无缓存
- 全 -- 提供了 Dao (ORM, SQL 管理), Ioc, Aop, Mvc, Json解析 等必要功能
- 活 -- 各个部分可以独立使用,比如在 Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等
- 整 -- 它所有功能均不依赖第三方 jar 文件。
这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了
当然你要使用其它的连接池,数据库驱动,打印PDF支持等功能,还需要自行添置 jar 包。
Nutz 为谁而设计?¶
- 如果你觉得 Hibernate 控制比较繁琐,iBatis 编写SQL又比较麻烦,Nutz.Dao 专为你设计。
- 如果你觉得在多个服务器部署或者修改 Spring 配置文件很麻烦,Nutz.Ioc 专为你设计
- 如果你觉得直接写 XML 配置文件很麻烦,可视化编辑器又没控制感,Nutz.Mvc 专为你设计
- 如果你觉得 JSON 转换很麻烦(要写超过一行以上的代码),Nutz.Json 专为你设计
- 如果你觉得 Java 语法不如 Ruby 便捷, Nutz.Castor 以及 Nutz.Lang 专为你设计
- 如果你以前根本没接触过 SSH ,只使用 JDBC 编程, 整个 Nutz 专门为你设计
- 你只要在你的 classpath 下部署这个 800多K 的小 jar 包,你会得到上述所有好处
我要使用 Nutz,该从那里入手呢?¶
- 下载 Nutz -- 包括文档和源码都包含在下载包中
- 阅读文档 -- Wiki 页面 有充分的介绍,每个部分都有 Hello World
- 运行 Demo -- Demo 在不断的添加中 ... 现在已有 7 个可用 Demo
- 编译 -- 请看详细介绍
- 运行测试 -- 请看详细介绍
另外:
- Amosleaf 写了一个 Nutz.Dao 入门的例子
- Peter Tung 写的 Nutz Json Book 几分钟可以让你对 Json 解析入门
Nutz 的质量¶
托社区的福,截至到现在为止,Nutz 一共通过了超过 500 个JUnit测试。其中有 152 个用例针对数据库,并在如下数据库中工作良好:
截止到 1.a.31 为止,大约有 66% 的代码被 JUnit 测试用例覆盖:
更多详情,请请 查看最新emma测试报告
在一个功能告一段落以后,我通常会花1-2个晚上在一边咂着廉价的红酒一边颇有成就感的书写JUnit测试。 通常我会用 JUnit 把我自己击溃,紧接着的那几天我都努力让那个该死红条变绿,之后,又想方设法写出 新的Junit测试试图让它再度变红。并且我还要保证所做的修改不能让代码膨胀,这的确让我死掉了不少脑 细胞。这些测试中,不仅涵盖各种功能上的测试,也涵盖了一些跨越线程的测试。在以后,我会针对代码执 行的效率加入一些新的测试。
我能保证的就是Nutz的代码是小巧的,以及通过尽可能多的 JUnit 测试。但是所有我能做的也就只是 这些了,找出剩下的那些代码上的缺陷,就应该交给 Nutz 第一批“小白”们了。“小白”们,加油!我 支持你们...
小白: 是小白鼠的简称。小白鼠是实验室的最爱,实验室是产生新东西的地方。
注: 从 09年9月开始,随着“小白”们的不断增多,项目的 Issue 列表越来越长,不断的有人发现缺陷,也不断的有人 提交修复,现在,基本上是整个社区在决定 Nutz 的品质。
Nutz 的未来¶
Nutz 是一个新兴的开源项目
它没有过去,只有未来
我可以保证,在未来,Nutz 的代码 绝对不会膨胀。 所有的功能设计的出发点就是最大限度给予程序员实惠。
- 下面一些计划会被执行,但是不一定按照我给出的顺序:
* 为 Nutz 的 Ioc 和 Mvc 开发一个代码生成器 * 让 Nutz.mvc 支持自动生成缩略图 * 为 Nutz 建立一个官方网站,提供讨论区和 Wiki * 提供英文文档
1. 我写它不花钱 2. 我喜欢写代码 3. 我不担心自己的生计 4. 社区很活跃,越来越多的人在贡献代码,测试,提交问题
http://www.zentao.net/
禅道项目管理软件(ZenTaoPMS)是一款国产的,基于LGPL协议,开源免费的项目管理软件,它集产品管理、项目管理、测试管理于一体,同时还包含了事务管理、组织管理等诸多功能,是中小型企业项目管理的首选。 禅道项目管理软件主要理念基于scrum,因此它也是一款好用的scrum管理工具。 禅道项目管理软件使用PHP + MySQL开发,基于自主的PHP开发框架──ZenTaoPHP而成。第三方开发者或者企业可以非常方便的开发插件或者进行定制。
http://www.playframework.org/documentation/1.1/firstapp 本文是使用 B3log Solo 从 Solo 示例 进行同步发布的。
http://code.google.com/p/javabloger-mini-books/ 本文是使用 B3log Solo 从 Solo 示例 进行同步发布的。
mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量 数据的处理。关于它的一个最简洁描述为:scalable, high-performance, open source, schema-free, document-oriented database。我对于文档型数据库有一些个人的偏好,这种偏好是从半年前研究couchdb而来的,因为我觉得用它来描述一个具有个性化特征的实体对 象正合适,比如网站上的用户或商品书籍之类的条目。
一些概念:
跟mysqld一样,一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个 collection可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中。跟关系型数据库不一样的地方是,它是的以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文 档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储 了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。可以说是兼备了key-value数据库的方便高效与关系型数据库的强大功 能。
索引
跟关系型数据库类似,mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引。当然建立索引就意味着增加空间开销,我 的建议是,如果你能把一个文档作为一个对象的来考虑,在线上应用中,你通常只要对对象ID建立一个索引即可,根据ID取出对象某些数据放在 memcache即可。如果是后台的分析需要,响应要求不高,查询非索引的字段即便直接扫表也费不了太多时间。如果还受不了,就再建一个索引得了。
默认情况下每个表都会有一个唯一索引:_id,如果插入数据时没有指定_id,服务会自动生成一个_id,为了充分利用已有索引,减少空间开销,最好是自己指定一个unique的key为_id,通常用对象的ID比较合适,比如商品的ID。
capped collection
capped collection是一种特殊的表,它的建表命令为:
db.createCollection("mycoll", {capped:true, size:100000})
允许在建表之初就指定一定的空间大小,接下来的插入操作会不断地按顺序APPEND数据在这个预分配好空间的文件中,如果已经超出空间大小,则回到 文件头覆盖原来的数据继续插入。这种结构保证了插入和查询的高效性,它不允许删除单个记录,更新的也有限制:不能超过原有记录的大小。这种表效率很高,它 适用于一些暂时保存数据的场合,比如网站中登录用户的session信息,又比如一些程序的监控日志,都是属于过了一定的时间就可以被覆盖的数据。
复制与分片
mongodb的复制架构跟mysql也很类似,除了包括master-slave构型和master-master构型之外,还有一个 Replica pairs构型,这种构型在平常可以像master-slave那样工作,一但master出现问题,应用会自动了连接slave。要做复制也很简单,我 自己使用过master-slave构型,只要在某一个服务启动时加上–master参数,而另一个服务加上–slave与–source参数,即可实现 同步。
分片是个很头疼的问题,数据量大了肯定要分片,mysql下的分片正是成为无数DBA的噩梦。在mongodb下,文档数据库类似key- value数据库那样的易分布特性就显现出来了,无论构造分片服务,新增节点还是删除节点都非常容易实现。但mongodb在这方面做还不足够成熟,现在 分片的工作还只做到alpha2版本(mongodb v1.1),估计还有很多问题要解决,所以只能期待,就不多说了。
性能
在我的使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能实在让我惊讶。写入性能同样很令人满意,同样写入百万级别的数 据,mongodb比我以前试用过的couchdb要快得多,基本10分钟以下可以解决。补上一句,观察过程中mongodb都远算不上是CPU杀手。
GridFS
gridfs是mongodb一个很有趣的类似文件系统的东西,它可以用一大块文件空间来存放大量的小文件,这个对于存储web2.0网站中常见的大量小文件(如大量的用户头像)特别有效。使用起来也很方便,基本上跟一般的文件系统类似。
用合适的数据库做适合的事情
mongodb的文档里提到的user case包括实时分析、logging、全文搜索,国内也有人使用mongodb来存储分析网站日志,但我认为mongodb用来处理有一定规模的网站日 志其实并不合适,最主要的就是它占空间过于虚高,原来1G的日志数据它可以存成几个G,如此下去,一个硬盘也存不了几天的日志。另一方面,数据量大了肯定 要考虑sharding,而mongodb的sharding到现在为止仍不太成熟。由于日志的不可更新性的,往往只需APPEND即可,又因为对日志的 操作往往只集中于一两列,所以最合适作为日志分析的还是列存储型的数据库,特别是像infobright那样的为数据仓库而设计的列存储数据库。
由于mongodb不支持事务操作,所以事务要求严格的系统(如果银行系统)肯定不能用它。
mongodb占用空间过大的原因,在官方的FAQ中,提到有如下几个方面:
1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、 256M那样的指数递增,直到2G为单个文件的最大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。
2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果 value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是最大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用 空间就小了,但这就要求在易读性与空间占用上作为权衡了。我曾建议作者把字段名作个index,每个字段名用一个字节表示,这样就不用担心字段名取多长 了。但作者的担忧也不无道理,这种索引方式需要每次查询得到结果后把索引值跟原值作一个替换,再发送到客户端,这个替换也是挺耗费时间的。现在的实现算是 拿空间来换取时间吧。
3、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。
4、可以定期运行db.repairDatabase()来整理记录,但这个过程会比较缓慢。
因为官方文档中对各方面的内容已经有很详细的叙述,所以我并没有再过多的引用原文与代码,只是结合自己的使用归纳一些心得,有兴趣的朋友不妨直接去翻文档中自己感兴趣的问题,超群的博客上有一个很好的入门介绍。
最后总结一句,文档型数据库有点像波粒二象性,总能在适当的时候表现出它作为关系型数据库或key-value数据库的优势来。
实战案例:
昨天我访问mongodb的python程序开始出错,经常抛出AssertionError异常,经查证只是master查询异常,slave正常,可判断为master的数据出了问题。
修复过程:
1、在master做db.repairDatabase(),不起作用;
2、停止slave的同步;
3、对slave作mongodump,备份数据;
4、对master作mongostore,把备份数据恢复,使用–drop参数可以先把原表删除。
5、恢复slave的同步。 本文是使用 B3log Solo 从 Solo 示例 进行同步发布的。
http://fm.mp3.baidu.com/ 本文是使用 B3log Solo 从 Solo 示例 进行同步发布的。
前一阵收到一封网友的来信,信中提到了他在提高个人收入和未来发展中的一些困惑,这也是我们许多学员和网友经常找我咨询的一件事情,颇具普遍性,故写此博与大家探讨和分享一下。
原信内容如下:
-------------------------
张老师,你好!
我今年23岁,明年12月软件工程硕士毕业,学Java一直都是深受张老师的感染,是跟着张老师走进IT这个行业,现在又对这行有一定的疑惑,希望老师能够给予解答!
为什么JavaEE搞太久之后,会觉得Java搞起来没意思了,想去搞 Linux C了呢? 我在一家中国最大BSS/OSS的电信运营商工作两年了,工资在xx(二线城市)这个地方还算可以(一年可能8万-9万左右),但是最近一直觉得很失落, 觉得搞JavaEE甚至搞java都觉得没好大意思了,有点想转行去搞Linux c这些东西去了,因为在xxxx这个地方大公司(比如:Moto,诺西,阿尔卡特,爱立信等)都很少招搞Java的人,而且一般招搞Java的人,工资都 给得不是特别的高,去小公司我觉得没有好多意思(大部分都给不了好多钱),所以一直很迷茫!
我 想在硕士毕业之后,薪资待遇方面能够更上一层楼,我觉得人生有三个境界:一是满足物质生活需要,二是有自己的事业 ,三是做一定奉献(不求回报)。我现在还处于人生的第一个阶段,最近张老师一直在说Android很火,但是我在成都的招聘网站上搜索了一下,职位还是相 当的少! 我真的有点迷茫了,是继续搞Java还是转行去做C/C++,请张老师给点意见吧!谢谢!
致
礼!
---------------------------
我回复的邮件如下:
----------------------------------
你好!
我实在实在是太忙了,连给你回信的时间都很难抽出来,但你的来信我一直都挂在心上。眼看一个多月过去了,这封回信我也实在拖得太久了,今天索性先把别的事情搁置一下来处理你的来信,但也只能对你简单回复一下了。 对程序员来说,要想赚大钱,赚月薪超过12k、甚至更多的钱,不是学什么技术,搞什么技术的工作能解决的!单说打工,你现在的薪水已经够可以的了,想单纯 地通过学习其他技术来提高薪水,是不会有多大的收获的,还不如靠现有的技术混年头,月薪也能自然增长到5位数。
要想大幅度地提升薪水,靠的是技术之外的许多其他因素,我简单列举一二:
(1)找到一个未来有发展潜力的公司,你在技术上站得住脚,且努力额外做一些力所能及的与技术无关的事情,把公司的事情当作自己的事情来对待,以得到老板 和上司赏识,被委以重任。一旦公司以后发展起来了,或者公司上市了,你作为元老,在物质回报上自然少不了你的好处!(ps:像传智播客这样的公司就是一支 极具潜力的绩优股,要找到这样的公司,需要有眼光和机遇,呵呵)
(2)潜心修炼技术和专业技能,能独当一面地开发出几款小产品 (如cms,oa,crm等),然后自己多辛苦点,通过网络等各种途径接点类似的项目回家干,也算是额外赚点外快,比拿死工资要多点。如果通过接项目,结 识到了一些有市场揽活关系或能力的人物,彼此互补性强,又合得来,双方可以合作,多接点赚关系钱的肥项目,一年下来也能赚个几十万。
(3)自己开公司,当老板。走这条路的成功者寥寥无几,百分之九十以上的都会夭折,但也说不准你就是那百分之几的幸运者和成功者。即使走这条路,也不能操 之过急,最好是在一个感兴趣的行业里摸爬滚打数载,对行业的门道都很熟悉了,手头的资源也很丰富了,一切似乎都差不多了,再加上你有强烈的创业欲望,不试 一试终生遗憾,还有那么几个死党支持你,这时候你就可以破茧而出了,这样的风险就会小得多,成功的概率也就大些。
(4)如果上面这些中的任何一条都无法做到,那就老老实实拿着现有的工资,有工作可干,有班上就不错了,好好享受生活的快乐,知足常乐吧,毕竟生活比你困难的人还多得是!
最后要提醒那些试图通过跳槽涨薪的朋友,对那些刚入行一两年、且学习能力强的程序员来说,每次工作几月后跳槽几乎都能带来薪资上的一定增长,但薪水达到一 万以后,就会遭遇发展瓶颈,薪水就很难再有更大突破,并且由于反复跳槽,对所在公司并没有做出沉淀性的历史贡献,所以薪水到了12k后,就差不多到头了, 那些薪水能突破2w,甚至3w的人,大多是与公司同甘共苦过多年的元老。如果你遇到了好的有发展潜力的公司,请不要计较一时之得失,一定要好好珍惜这样的 一份工作机会。
本文是使用 B3log Solo 从 Solo 示例 进行同步发布的。
10 个最酷的 Linux 单行命令,希望对你有用。
-
sudo !!
以 root 帐户执行上一条命令。
-
python -m SimpleHTTPServer
利用 Python 搭建一个简单的 Web 服务器,可通过 http://$HOSTNAME:8000 访问。
-
:w !sudo tee %
在 Vim 中无需权限保存编辑的文件。
-
cd -
更改到上一次访问的目录。
-
^foo^bar
将上一条命令中的 foo 替换为 bar,并执行。
-
cp filename{,.bak}
快速备份或复制文件。
-
mtr google.com
traceroute + ping。
-
!whatever:p
搜索命令历史,但不执行。
-
$ssh-copy-id user@host
将 ssh keys 复制到 user@host 以启用无密码 SSH 登录。
-
ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg
把 Linux 桌面录制为视频。
本文是使用 B3log Solo 从 Solo 示例 进行同步发布的。
除多年编程经验之外,还有什么能区分一个程序员是“老手”还是“新手”?编程技巧当然是一部分,但它绝非是全部。聪明的程序员可能比他们的同行拥有更出众的编程技巧,但那不足以说明他们就是“老手”。同样,仅仅因为拥有10年编程经验也并不意味着他们就是高手。在工作岗位上,拥有多年编程经验也不能说明问题。即便没被炒鱿鱼,那也不能提升你的价值。
下面列举的事情是大多数高级程序员都会做的。 1.至少掌握一门编程语言 我相信有些优秀的程序员只懂(并精通)一门编程语言,但在某种程度上而言,这其实会限制一个人的思维。就像当你手拿一把锤子时,任何东西看起来都像钉 子。我认为,知道并成功使用至少一门编程语言,这是程序员从新手走向老手的重要一步。我要说的是,像JavaScript和SQL这样的辅助编程语言,只 有当你确实已经开发了完整的应用程序,并在其中使用这些编程语言时,它们才有价值。 2.工作之余也经常编程 我抱怨过把开源作为招贤的一项要求,但那仅仅因为许多充满激情的程序员把时间花在别的地方。除了对开源有所贡献,你还可以做兼职顾问,兼职创业,开发自己的产品或者创办自己的微型软件公司。当然,你也可以尝试从外部接些兼职项目,可参考伯乐在线的这篇《成功接项目需要注意的几个要点》。 注:mISV即MicroISV,是一个只有一名员工组成的软件公司,是一种微型公司。 3.经历完整的软件开发过程,从概念设计到产品实现,再到产品维护 有的程序员希望不用自己动手就可以得到详细的设计说明,然后把缺陷代码交给测试/维护小组,这是平庸程序员的一个缩影。任何称职的程序员都会跟客户密切合作,去制定需求分析,然后编码实现,当然也要维护。如果你在编码实现阶段偷懒了,那你在维护阶段不得不付出代价。 4.不断创新 创新就是做一些你身边的人没有做过的事情,用来改善你的过程或产品。你不一定非得是世界上第一个做这件事的人,只要发现一个问题,找到解决方法然后实现它就行。 5.编写的软件能解决实际问题 有一副虚构的场景:一名黑客,仅仅是出于对技术以及自己所做事情的爱,一天到晚都在编写代码。但这几乎无助于成就一名优秀的开发者。事实上,我曾见过 有些开发人员和客户争论,来采用更好但不太有助客户的技术。这会适得其反。你可以利用自己的时间来完善。但涉及工作时,你最好还是编写能实际改进并解决问 题的代码,而不是使用那些不同寻常的算法或接口。 编者后话 这些问题对于任何想成为高级开发人员的朋友来说,都合情合理。因为这些问题和拥有多少年编程经验并没有关联。如果你能做到上面4-5条,那你就是高级程序员。如果只有1-2条,那你还需要加油努力。 当然,在面试中,设置一个简单的“是或不是”问题,通常是一个衡量自己的小练习。更重要的问题会是“你能给我们举例介绍一下吗?”
本文是使用 B3log Solo 从 Solo 示例 进行同步发布的。
REST关键原则
大部分对REST的介绍是以其正式的定义和背景作为开场的。但这儿且先按下不表,我先提出一个简单扼要的定义:REST定义了应该如何正确地使用 (这和大多数人的实际使用方式有很大不同)Web标准,例如HTTP和URI。如果你在设计应用程序时能坚持REST原则,那就预示着你将会得到一个使用 了优质Web架构(这将让你受益)的系统。总之,五条关键原则列举如下:
- 为所有“事物”定义ID
- 将所有事物链接在一起
- 使用标准方法
- 资源多重表述
- 无状态通信
下面让我们进一步审视这些原则。
为所有“事物”定义ID
在这里我使用了“事物”来代替更正式准确的术语“资源”,因为一条如此简单的原则,不应该被淹没在术语当中。思考一下人们构建的系统,通常会找到一 系列值得被标识的关键抽象。每个事物都应该是可标识的,都应该拥有一个明显的ID——在Web中,代表ID的统一概念是:URI。URI构成了一个全局命 名空间,使用URI标识你的关键资源意味着它们获得了一个唯一、全局的ID。
对事物使用一致的命名规则(naming scheme)最主要的好处就是你不需要提出自己的规则——而是依靠某个已被定义,在全球范围中几乎完美运行,并且能被绝大多数人所理解的规则。想一下你 构建的上一个应用(假设它不是采用RESTful方式构建的)中的任意一个高级对象(high-level object),那就很有可能看到许多从使用唯一标识中受益的用例。比如,如果你的应用中包含一个对顾客的抽象,那么我可以相当肯定,用户会希望将一个指 向某个顾客的链接,能通过电子邮件发送到同事那里,或者加入到浏览器的书签中,甚至写到纸上。更透彻地讲:如果在一个类似于Amazon.com的在线商 城中,没有用唯一的ID(一个URI)标识它的每一件商品,可想而知这将是多么可怕的业务决策。
当面对这个原则时,许多人惊讶于这是否意味着需要直接向外界暴露数据库记录(或者数据库记录ID)——自从多年以来面向对象的实践告诫我们,要将持 久化的信息作为实现细节隐藏起来之后,哪怕是刚有点想法都常会使人惊恐。但是这条原则与隐藏实现细节两者之间并没有任何冲突:通常,值得被URI标识的事 物——资源——要比数据库记录抽象的多。例如,一个定单资源可以由定单项、地址以及许多其它方面(可能不希望作为单独标识的资源暴露出来)组成。标识所有 值得标识的事物,领会这个观念可以进一步引导你创造出在传统的应用程序设计中不常见的资源:一个流程或者流程步骤、一次销售、一次谈判、一份报价请求—— 这都是应该被标识的事物的示例。同样,这也会导致创建比非RESTful设计更多的持久化实体。
下面是一些你可能想到的URI的例子:
http://example.com/customers/1234 http://example.com/orders/2007/10/776654 http://example.com/products/4554 http://example.com/processes/salary-increase-234
正如我选择了创建便于阅读的URI——这是个有用的观点,尽管不是RESTful设计所必须的——应该能十分容易地推测出URI的含义:它们明显地标识着单一“数据项”。但是再往下看:
http://example.com/orders/2007/11 http://example.com/products?color=green
首先,这两个URI看起来与之前的稍有不同——毕竟,它们不是对一件事物的标识,而是对一类事物集合的标识(假定第一个URI标识了所有在2007年11月份提交的定单,第二个则是绿颜色产品的集合)。但是这些集合自身也是事物(资源),也应该被标识。
注意,使用唯一、全局统一的命名规则的好处,既适用于浏览器中的Web应用,也适用于机对机(machine-to-machine,m2m)通信。
来对第一个原则做下总结:使用URI标识所有值得标识的事物,特别是应用中提供的所有“高级”资源,无论这些资源代表单一数据项、数据项集合、虚拟亦或实际的对象还是计算结果等。
将所有事物链接在一起
接下来要讨论的原则有一个有点令人害怕的正式描述:“超媒体被当作应用状态引擎(Hypermedia as the engine of application state)”,有时简写为HATEOAS。(严格地说,这不是我说的。)这个描述的核心是超媒体概念,换句话说:是链接的思想。链接是我们在HTML中常见的概念,但是它的用处绝不局限于此(用于人们网络浏览)。考虑一下下面这个虚构的XML片段:
<order self="http://example.com/customers/1234"> <amount>23</amount> <product ref="http://example.com/products/4554"> <customer ref="http://example.com/customers/1234"> </customer> </product></order>
如果你观察文档中product和customer的链接,就可以很容易地想象到,应用程序(已经检索过文档)如何“跟随”链接检索更多的信息。当然,如果使用一个遵守专用命名规范的简单“id”属性作为链接,也是可行的——但是仅限于应用环境之内。使用URI表示链接的优雅之处在于,链接可以指向由不同应用、不同服务器甚至位于另一个大陆上的不同公司提供的资源——因为URI命名规范是全球标准,构成Web的所有资源都可以互联互通。
超媒体原则还有一个更重要的方面——应用“状态”。简而言之,实际上服务器端(如果你愿意,也可以叫服务提供者)为客户端(服务消费者)提供一组链 接,使客户端能通过链接将应用从一个状态改变为另一个状态。稍后我们会在另一篇文章中探究这个方面的影响;目前,只需要记住:链接是构成动态应用的非常有 效的方式。
对此原则总结如下:任何可能的情况下,使用链接指引可以被标识的事物(资源)。也正是超链接造就了现在的Web。
使用标准方法
在前两个原则的讨论中暗含着一个假设:接收URI的应用程序可以通过URI明确地做一些有意义的事情。如果你在公共汽车上看到一个URI,你可以将它输入浏览器的地址栏中并回车——但是你的浏览器如何知道需要对这个URI做些什么呢?
它知道如何去处理URI的原因在于所有的资源都支持同样的接口,一套同样的方法(只要你乐意,也可以称为操作)集合。在HTTP中这被叫做动词 (verb),除了两个大家熟知的(GET和POST)之外,标准方法集合中还包含PUT、DELETE、HEAD和OPTIONS。这些方法的含义连同 行为许诺都一起定义在HTTP规范之中。如果你是一名OO开发人员,就可以想象到RESTful HTTP方案中的所有资源都继承自类似于这样的一个类(采用类Java、C#的伪语法描述,请注意关键的方法):
class Resource { Resource(URI u); Response get(); Response post(Request r); Response put(Request r); Response delete(); }
由于所有资源使用了同样的接口,你可以依此使用GET方法检索一个表述(representation)——也 就是对资源的描述。因为规范中定义了GET的语义,所以可以肯定当你调用它的时候不需要对后果负责——这就是为什么可以“安全”地调用此方法。GET方法 支持非常高效、成熟的缓存,所以在很多情况下,你甚至不需要向服务器发送请求。还可以肯定的是,GET方法具有幂等性[译 注:指多个相同请求返回相同的结果]——如果你发送了一个GET请求没有得到结果,你可能不知道原因是请求未能到达目的地,还是响应在反馈的途中丢失了。 幂等性保证了你可以简单地再发送一次请求解决问题。幂等性同样适用于PUT(基本的含义是“更新资源数据,如果资源不存在的话,则根据此URI创建一个新 的资源”)和DELETE(你完全可以一遍又一遍地操作它,直到得出结论——删除不存在的东西没有任何问题)方法。POST方法,通常表示“创建一个新资 源”,也能被用于调用任意过程,因而它既不安全也不具有幂等性。
如果你采用RESTful的方式暴露应用功能(如果你乐意,也可以称为服务功能),那这条原则和它的约束同样也适用于你。如果你已经习惯于另外的设计方式,则很难去接受这条原则——毕竟,你很可能认为你的应用包含了超出这些操作表达范围的逻辑。请允许我花费一些时间来让你相信不存在这样的情况。
来看下面这个简单的采购方案例子:
可以看到,例子中定义了两个服务程序(没有包含任何实现细节)。这些服务程序的接口都是为了完成任务(正是我们讨论的 OrderManagement和CustomerManagement服务)而定制的。如果客户端程序试图使用这些服务,那它必须针对这些特定接口进行 编码——不可能在这些接口定义之前,使用客户程序去有目的地和接口协作。这些接口定义了服务程序的应用协议(application protocol)。
在RESTful HTTP方式中,你将通过组成HTTP应用协议的通用接口访问服务程序。你可能会想出像这样的方式:
可以看到,服务程序中的特定操作被映射成为标准的HTTP方法——为了消除歧义,我创建了一组全新的资源。“这是骗人的把戏”,我听见你叫嚷着。 不,这不是欺骗。标识一个顾客的URI上的GET方法正好相当于getCustomerDetails操作。有人用三角形形象化地说明了这一点:
把三个顶点想象为你可以调节的按钮。可以看到在第一种方法中,你拥有许多操作,许多种类的数据以及固定数量的“实例”(本质上和你拥有的服务程序数 量一致)。在第二种方法中,你拥有固定数量的操作,许多种类的数据和许多调用固定方法的对象。它的意义在于,证明了通过这两种方式,你基本上可以表示任何 你喜欢的事情。
为什么使用标准方法如此重要?从根本上说,它使你的应用成为Web的一部分——应用程序为Web变成Internet上最成功的应用所做的贡献,与 它添加到Web中的资源数量成比例。采用RESTful方式,一个应用可能会向Web中添加数以百万计的客户URI;如果采用CORBA技术并维持应用的 原有设计方式,那它的贡献大抵只是一个“端点(endpoint)”——就好比一个非常小的门,仅仅允许有钥匙的人进入其中的资源域。
统一接口也使得所有理解HTTP应用协议的组件能与你的应用交互。通用客户程序(generic client)就是从中受益的组件的例子,例如curl、wget、代理、缓存、HTTP服务器、网关还有Google、Yahoo!、MSN等等。
总结如下:为使客户端程序能与你的资源相互协作,资源应该正确地实现默认的应用协议(HTTP),也就是使用标准的GET、PUT、POST和DELETE方法。
资源多重表述
到目前为止我们一直忽略了一个稍微复杂的问题:客户程序如何知道该怎样处理检索到的数据,比如作为GET或者POST请求的结果?原因是,HTTP 采取的方式是允许数据处理和操作调用之间关系分离的。换句话说,如果客户程序知道如何处理一种特定的数据格式,那就可以与所有提供这种表述格式的资源交 互。让我们再用一个例子来阐明这个观点。利用HTTP内容协商(content negotiation),客户程序可以请求一种特定格式的表述:
GET /customers/1234 HTTP/1.1 Host: example.com Accept: application/vnd.mycompany.customer+xml
请求的结果可能是一些由公司专有的XML格式表述的客户信息。假设客户程序发送另外一个不同的请求,就如下面这样:
GET /customers/1234 HTTP/1.1 Host: example.com Accept: text/x-vcard
结果则可能是VCard格式的客户地址。(在这里我没有展示响应的内容,在其HTTP Content-type头中应该包含着关于数据类型的元数据。)这说明为什么理想的情况下,资源表述应该采用标准格式——如果客户程序对HTTP应用协 议和一组数据格式都有所“了解”,那么它就可以用一种有意义的方式与世界上任意一个RESTful HTTP应用交互。 不幸的是,我们不可能拿到所有东西的标准格式,但是,或许我们可以想到在公司或者一些合作伙伴中使用标准格式来营造一个小环境。当然以上情况不仅适用于从 服务器端到客户端的数据,反之既然——倘若从客户端传来的数据符合应用协议,那么服务器端就可以使用特定的格式处理数据,而不去关心客户端的类型。
在实践中,资源多重表述还有着其它重要的好处:如果你为你的资源提供HTML和XML两种表述方式,那这些资源不仅可以被你的应用所用,还可以被任意标准Web浏览器所用——也就是说,你的应用信息可以被所有会使用Web的人获取到。
资源多重表述还有另外一种使用方式:你可以将应用的Web UI纳入到Web API中——毕竟,API的设计通常是由UI可以提供的功能驱动的,而UI也是通过API执行动作的。将这两个任务合二为一带来了令人惊讶的好处,这使得 使用者和调用程序都能得到更好的Web接口。
总结:针对不同的需求提供资源多重表述。
无状态通信
无状态通信是我要讲到的最后一个原则。首先,需要着重强调的是,虽然REST包含无状态性(statelessness)的观念,但这并不是说暴露功能的应用不能有状态—— 事实上,在大部分情况下这会导致整个做法没有任何用处。REST要求状态要么被放入资源状态中,要么保存在客户端上。或者换句话说,服务器端不能保持除了 单次请求之外的,任何与其通信的客户端的通信状态。这样做的最直接的理由就是可伸缩性—— 如果服务器需要保持客户端状态,那么大量的客户端交互会严重影响服务器的内存可用空间(footprint)。(注意,要做到无状态通信往往需要需要一些 重新设计——不能简单地将一些session状态绑缚在URI上,然后就宣称这个应用是RESTful。)
但除此以外,其它方面可能显得更为重要:无状态约束使服务器的变化对客户端是不可见的,因为在两次连续的请求中,客户端并不依赖于同一台服务器。一 个客户端从某台服务器上收到一份包含链接的文档,当它要做一些处理时,这台服务器宕掉了,可能是硬盘坏掉而被拿去修理,可能是软件需要升级重启——如果这 个客户端访问了从这台服务器接收的链接,它不会察觉到后台的服务器已经改变了。
理论上的REST
我承认:以上我所说的REST不是真正的REST,而且我可能有点过多地热衷于简单化。但因为我想有一个与众不同的开场,所以没有在一开始就介绍其正式的定义和背景。现在就让我们稍微简要地介绍一下这方面的内容。
首先,先前我并没有明确地区分HTTP、RESTful HTTP和REST。要理解这些不同方面之间的关系,我们要先来看看REST的历史。
Roy T. Fielding在他的博士学位论文(实际上你应该访问这个链接——至少对于一篇学术论文来说,它是相当易读的。此论文已被翻译成中文) 中定义了术语REST。Roy曾是许多基本Web协议的主要设计者,其中包括HTTP和URIs,并且他在论文中对这些协议提出了很多想法。(这篇论文被 誉为“REST圣经”,这是恰当的——毕竟,是作者发明了这个术语,所以在定义上,他写的任何内容都被认为是权威的。)在论文中,Roy首先定义一种方法 论来谈论架构风格——高级、抽象的模式,来表达架构方法背后的核心理念。每一个架构风格由一系列的约束(constraints)定义形成。架构风格的例子包括“没有风格”(根本没有任何约束)、管道和过滤器(pipe and filter)、客户端/服务器、分布式对象以及——你猜到它了——REST。
如果对你来说这些听起来都太抽象了,那就对了——REST在本质上是一个可以被许多不同技术实现的高层次的风格,而且可以被实例化——通过为它的抽 象特性赋上不同的值。比如,REST中包含资源和统一接口的概念——也就是说,所有资源都应该对这些相同的方法作出反应。但是REST并没有说明是哪些方 法,或者有多少方法。
REST风格的一个“化身”便是HTTP(以及一套相关的一套标准,比如URI),或者稍微抽象一些:Web架构自身。接着上面的例子,HTTP使 用HTTP动词作为REST统一接口的“实例”。由于Fielding是在Web已经(或者至少是大部分)“完善”了之后才定义的REST风格,有人可能 会争论两者是不是100%的匹配。但是无论如何,整体上来说Web、HTTP和URI仅仅是REST风格的一个主要实现。不过,由于Roy Fielding即是REST论文的作者,又对Web架构设计有过深远的影响,两者相似也在情理之中。
最后,我在前面一次又一次地使用着术语“RESTful HTTP”,原因很简单:许多使用HTTP的应用因为一些理由并没有遵循REST原则,有人会说使用HTTP而不遵循REST原则就等同于滥用HTTP。 当然这听起来有点狂热——事实上违反REST约束的原因通常是,仅仅因为每个约束带来的设计权衡可能不适合于一些特殊情况。但通常,违背REST约束的原 因可归咎于对其好处认知的缺乏。来看一个明显的反面案例:使用HTTP GET调用类似于删除对象的操作,这违反了REST的安全约束和一般性常识(客户程序不应为此负责,服务器端开发人员大概不是有意而为之)。但在随后的文 章中,我会提及更多这样或那样的对HTTP的滥用。
总结
本文试图对REST(Web架构)背后的概念提供快速的介绍。RESTful HTTP暴露功能的方式与RPC、分布式对象以及Web Services是不相同的;要真正理解这些不同是需要一些心态的转变。不管你构建的应用是仅仅想暴露Web UI还是想把API变成Web的一份子,了解下REST的原则还是有好处的。 本文是使用 B3log Solo 从 cannysquirrel 的个人博客 进行同步发布的。
validation.js是一个基于prototype表单前端验证工具,与其它库相比,简单易用. 下面是对validation的介绍 http://tetlaw.id.au/view/blog/really-easy-field-validation-with-prototype/ ajax http://ajax.org/space/start/2006-05-15/2 http://ajax.org/space/start/2006-05-22/1
以下是对其做的扩展.
- 新增验证:
- 增加min-value-number验证,例: 最小值为10.1 = min-value-10.1
- 增加max-value-number验证,例: 最大值为-100.1 = min-value--100.1
- 增加长度范围validate-length-range-minLength-maxLength验证,例: 最小长度为1,最大长度为10:validate-length-range-1-10
- 增加整型数字范围validate-int-range-minValue-maxValue验证,例: 5至20 : validate-int-range-5-20
- 增加浮点数字范围validate-float-range-minValue-maxValue验证,例: 1.1至10 : validate-float-range-1.1-10
- 增加min-length-number验证,例: 最小长度为10 = min-length-10
- 增加max-length-number验证,例: 最大长度为10 = max-length-10
- 增加文件类型 validate-file-type1-type2-typeX 的验证,例: validate-file-zip-png-jpeg 将验证文件是否为zip,png,jpeg格式之一
- 增加中文日期验证 validate-date-cn
- 修改记录:
- 增加Validation._getInputValue() 取代$F()方法以对file input进行验证
- 修正Validation.isVisible() 中while循环中elm可能不存在为空的问题
- 增加ValidationFactory for cache
- 修改Validation.get()方法使用indexOf()的匹配模式,以适应可以通过class传递参数
- 修改errorMsg可由方法返回
min-length-number,max-length-number,validate-file-xx1的实现机制主要是直接使用className作为参数传递,再在验证方法中抽取max-length-number的number作为参数使用
下载 http://www.blogjava.net/Files/badqiu/validation1.5.3.rar
本文是使用 B3log Solo 从 cannysquirrel 的个人博客 进行同步发布的。
摘要: 概述jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不及 的,它兼容 CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。 jQuery 是一个快速的,简洁的 javaScrip... 阅读全文
我现在是一个初学JAVA的学生,目前的学习阶段是Struts 2.0,希望大家能给予帮助!!!
|