爱情和婚姻需要烟火气

有越来越多的人想要离婚了。婚姻似乎成了一座围城,外面的人不想进去,里面的人都想冲出来。

烟火气才是婚姻的真谛,没有烟火气的婚姻就是一场孤独的旅行。所以,如果你还不会做饭的话,是时候去好好学一学了,生活需要不断调整我们的情绪和心态,婚姻更需要你每天制作充满爱的美味佳肴。

爱情,如果不落实到穿衣、吃饭、数钱、睡觉这些实实在在的生活里去,是不容易天长地久的。

婚姻研究专家约翰·戈特曼在《幸福的婚姻》一书中说:“在各种生活小事上靠近配偶,是浪漫持久存在的关键。”

有人说,婚姻中要有不会磨灭的爱情;要有志趣相投的三观;要有势均力敌的经济;要有互相包容的内心;还要有一定程度的距离,给彼此一些独立的空间…..

但仅有这些还是不够的,最好的婚姻,没有那么多的“有情饮水饱”,而是实实在在的柴米油盐,是抚慰你身心的那顿饭,守候你回家的那盏灯,放在你床头的那杯水,以及你们携手走过的那些路。

做饭是婚姻的修行,爱情最好的模样应该就是一屋两人三餐四季,褪去一天的疲劳,两个人坐在暖黄色的灯光下,桌子上是热气腾腾的饭菜,里面都是家的味道,爱的人在身旁,热的菜在手边,一切都如同岁月静好一般的温暖。

我看了很多幸福美满的夫妻,发现他们都有一个共同的特点:不管多忙,都会一起做饭。

最令人羡慕的爱情就是你负责下厨做饭,我负责吃完不剩;你负责洗手作羹汤,我负责择菜洗碗瓢;你负责柴米油盐酱醋茶,我负责琴棋书画诗酒花…..

日剧《最完美离婚》中有句台词:“男女凑在一起不代表是夫妻,夫妻也不等同于家人,只要去政府递交了申请就成了夫妻,但不代表能成为家人,家人是可以坐下来好好喝上一杯茶,吃上一顿饭。”

夫妻俩能吃到一起,才能过到一起,如若连吃饭都是随意解决,那婚姻生活也只会越过越糟糕。

幸福只是一件小事,一件需要两个人用心保鲜的小事。

不需要你陪我去多么高档奢华的餐厅大快朵颐,也不需要你陪我去异国他乡享受别样的风土人情。要的只是你能陪我做一顿饭,然后好好的坐下来,一起品尝。

有人说:“婚姻就像是一大碗洋葱卤肉饭,洋葱爆锅会让你流眼泪,小火炖卤肉会让你等待,要考虑酱油放多少,冰糖放几块,味道拿捏全凭平日里的默契。

一勺子米饭铺在碗底,是平平淡淡的生活,惊喜是大勺卤肉浇在米饭上,再加半勺汤,切开的卤蛋,你一半,我一半,有福同享有难同当。”

愿你以后的日子,厨房有烟火,客厅有笑容,卧室有拥抱,爱人跟你一蔬一饭,你跟爱人一颦一笑。

愿往后余生,有人陪你吃人间烟火,吃到眼睛老了,胃口小了,牙齿掉光光了,然后在餐桌边一点一点地老去,一起走到世界的尽头。

摘抄原文:http://www.sohu.com/a/258721034_196571

人有欺之,却不自欺

小九:“真跳下去,我也没有把握不会受伤,况且我不能用这种方式证明自己有种,那不过是证明了我是个傻子。他们显然是在欺负我,难道我还要欺负自己吗?若如其所愿,便是其帮凶,没有道理帮着欺负我的人去欺负自己。”

人有欺之,却不自欺,这倒是不错。

世人往往不懂强弱之道,自在之强,看似柔弱。所谓勇者,有勇于敢,亦有勇于不敢,而勇于不敢往往更难。明白这个道理并不容易,你能喊出那一句实不简单。

莫说你有功夫可以跳下去,也可以打得过他们,若是你没有功夫在身,也打不过他们,那是更不能跳了。因为你根本不该这么做、也不能这么做,哪怕受辱骂嘲笑,亦能不跳,则是大勇。

当然有,万事万物都在大道之中。若行止自然,就不必刻意去讲。

来源:徐公子<<太上章>>

IAP是什么

1.IAP是什么–简介

IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。

2.IAP是什么–功能

在应用编程IAP(In-Application Programming)是应用在Flash程序存储器的一种编程模式。它可以在应用程序正常运行的情况下,通过调用特定的IAP程序对另外一段程序Flash空间进行读/写操作,甚至可以控制对某段、某页甚至某个字节的读/写操作,这为数据存储和固件的现场升级带来了更大的灵活性。

3.IAP是什么–实现方法

通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:

1)检查是否需要对第二部分代码进行更新

2)如果不需要更新则转到4)

3)执行更新操作

4)跳转到第二部分代码执行

第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新。

在第二部分代码开始执行时,首先需要把CPU的中断向量表映像到自己的向量表,然后再执行其他的操作。

如果IAP程序被破坏,产品必须返厂才能重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,STM32在对Flash区域实行读保护的同时,自动地对用户Flash区的开始4页设置为写保护,这样可以有效地保证IAP程序区域不会被意外地破坏。

4.IAP是什么–IAP与ISP的区别

在线编程目前有两种实现方法:在系统编程(ISP)和在应用编程(IAP)。ISP一般是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程,而IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将控制从一个存储体转向另一个。ISP的实现一般需要很少的外部电路辅助实现,而IAP的实现更加灵活,通常可利用单片机的串行口接到计算机的RS232口,通过专门设计的固件程序来编程内部存储器。

来源:电子产品世界 作者:蒋雅娴

蓝牙5.0模块方案

蓝牙5.0模块方案

蓝牙5.0模块方案

全新蓝牙5.0标准在性能上将远超目前的版本,也就是蓝牙4.2LE版本,包括在有效传输距离上将是4.2LE版本的4倍,也就是说,理论上,蓝牙发射和接收设备之间的有效工作距离可达300米。而传输速度将是4.2LE版本的2倍,速度上限为24Mbps.
同时,蓝牙5.0允许无需配对接受信标的数据,比如广告、Beacon、位置信息等,这一传输率提高了8倍。

另外,蓝牙5.0还支持室内定位导航功能,可以作为室内导航信标或类似定位设备使用,结合wifi可以实现精度小于1米的室内定位。这样,你就可以在那些非常大的商场中通过支持蓝牙5.0的设备找到路线。不过,在本次的发布中,蓝牙技术联盟并未提到这一项特性。另外,蓝牙5.0针对物联网进行了很多底层优化,力求以更低的功耗和更高的性能为智能家居服务.
1、更快的传输速度
蓝牙5.0的开发人员称,新版本的蓝牙传输速度上限为24Mbps,是之前4.2LE版本的两倍。当然,你在实际生活中是不太可能达到这个极限速度的,但是仍然可以体验到显著的速度提升。;
2、更远的有效距离
蓝牙5.0的另外一个重要改进是,它的有效距离是上一版本的4倍,因此在理论上,当你拿着手机站在距离蓝牙音箱300米的地方,它还是会继续放着你爱的歌。
也就是说,理论上,蓝牙发射和接收设备之间的有效工作距离可达300米。当然,实际的有效距离还取决于你使用的电子设备。
3、导航功能
此外,蓝牙5.0将添加更多的导航功能,因此该技术可以作为室内导航信标或类似定位设备使用,结合wifi可以实现精度小于1米的室内定位。
举个例子,如果你和小编一样是路痴的话,你可以使用蓝牙技术,在诺大的商业中心找到路。
4、物联网功能
物联网还在持续火爆,因此,蓝牙5.0针对物联网进行了很多底层优化,力求以更低的功耗和更高的性能为智能家居服务

5、升级硬件 
此前的一些蓝牙版本更新只要求升级软件,但蓝牙5.0很可能要求升级到新的芯片。不过,旧的硬件仍可以兼容蓝牙5.0,你就无法享用其新的性能了。
搭载蓝牙5.0芯片的旗舰级手机将于2017年问世,相信中低端手机也将陆陆续续内置蓝牙5芯片。苹果将为成为第一批使用该项技术的厂商之一。
6、更多的传输功能
全新的蓝牙5.0能够增加更多的数据传输功能,硬件厂商可以通过蓝牙5.0创建更复杂的连接系统,比如Beacon或位置服务。因此通过蓝牙设备发送的广告数据可以发送少量信息到目标设备中,甚至无需配对。
7、更低的功耗
众所周知,蓝牙是智能手机的必备功能,随着智能设备和移动支付等越来越多需要打开蓝牙,才能享受便利功能逐渐融入人们的生活之中,蓝牙的功耗成为了智能手机待机时间的一大杀手。
为此蓝牙5.0将大大降低了蓝牙的功耗,使人们在使用蓝牙的过程中再也不必担心待机时间短的问题。

英语中有几个表示商品的词 goods commodity product merchandise wares 区别

来源:https://www.zybang.com/question/c92b94d22116484221401ba7990b3676.html

英语中有几个表示商品的,goods,commodity,product,merchandise,wares 区别

goods,commodity,product,merchandise,wares这些名词都可表示“商品,货物”之意.

但是products是产品,goods是物品,commodity是日用品,merchandise是货物
详细点就是:goods一般生活或商业用词,指销售或购入的商品.Goods 货物!
commodity作“商品”解时系经济学名词,也可指日用品.
product一般指工业产品,也可泛指各种各样的产品.
merchandise正式用词,指商业上销售或商家拥有货物的总称.
wares 指上市待卖的商品或货物.多用复数形式.
merchandise 商品,泛指商品,不特指某一商品

英媒晒国外名人收入 比尔·盖茨每天入账6000多万元

国际在线专稿:在各类媒体上看到哪个福布斯富豪又赚了多少钱时,可能并不会给人造成太大的冲击。不就是数字嘛,多加几个零就是了,数数谁不会啊?

但是,如果把这个数字换算成日薪甚至是时薪和自己对比的话,可以说就很扎心了…

英国《每日邮报》近日统计了多位富豪的日均收入以及花钱方式,一起来看看吧。

(并没有换算成小时单位,所以还请放心阅读)

比尔·盖茨

日均收入:710万英镑(约6215万人民币)

据彭博社报道,盖茨去年进账共26亿英镑(约227.7亿人民币),平均到每天就是710万英镑。

除此以外,作为盖茨基金会主席,盖茨本人能够调动的金钱量更大于他自身的收入……

花销:盖茨喜欢去冰岛度假,还常和家人一起驾游艇出游。

盖茨曾说过:“到了一定程度以后,金钱对于我个人就没什么用处了。现在我用钱的主要目的就是贡献给基金会,并将资源送到世界最穷苦的人们手中。”

J·K·罗琳

日均收入:19.8万英镑(约173.4万人民币)

作为《哈利波特》系列的作者,罗琳从其版税、电影、主题公园、各种纪念品以及舞台剧表演中获得巨大的收入,而她现在还在继续写作。

花销:罗琳和丈夫以及三个孩子一起住在爱丁堡,据说曾以百万英镑买下邻居的房子……

阿黛尔·阿德金斯

日均收入:14.4万英镑(约126万人民币)

阿黛尔的第三个专辑《25》全球共售出2000万份,仅在英国就帮她捞了1650万英镑(约1.44亿人民币)。

花销:在美国和英国多地拥有房产。

大卫·贝克汉姆

日均收入:13.6万英镑(约119.1万人民币)

小贝的肖像权公司去年给他开出了1270万英镑(约1.1亿人民币)的薪水,使用其形象打广告的商家遍布各种行业。

花销:小贝在科茨沃尔德的房子花了近六百万英镑(约5255万人民币),他的宝贝女儿哈珀(Harper)上芭蕾课也是一笔不小的花销。

英国女王

日均收入:11.7万英镑(约102.5万人民币)

英国政府会将皇室不动产利润中的15%给予女王,去年她因此获得的收入共有4280万英镑(约3.7亿人民币),近期预计还将增长。

花销:女王的各种度假在她总花销中其实所占比例不大,维护各个皇家宫殿的费用才是大头。

詹妮弗·劳伦斯

日均收入:4.9万英镑(约42.9万人民币)

尽管这位奥斯卡影后时常抱怨自己的收入不如一些男演员高,但她去年也有1820万英镑的收入(约1.59亿人民币)。

花销:在比弗利山庄的住宅价值540万英镑(约4728万人民币)。

 

高性能PHP框架 Phalcon

BSD
PHP,C
跨平台

PhalconPHP 是一个使用 C 扩展开发的 PHP Web 框架,提供高性能和低资源占用。

Phalcon 是一个开源的、全堆栈的 PHP 5 框架,使用 C 扩展编写,专门为高性能优化。无需学习和使用 C 语言,所有函数都以 PHP 类的方式曾现。Phalcon 是一个松耦合的框架。

使用时需在 php.ini 中添加:extension=phalcon.so

参考:https://www.oschina.net/p/phalcon

孙悟空是哪一年出生

以地上时间计算,孙悟空入地狱时生死簿记载其342岁,其后孙悟空在天上呆了三次,计15天(弼马温)+180天左右(齐天大圣)+49天(炼丹炉)=244天左右,即244年,偷了蟠桃后在花果山上呆了一年,则孙悟空被压到五行山时已经587岁左右,而此年书中写明是王莽篡汉之时(第十四回),即公元8年,则猴王出世发生在公元前579年左右——而后贞观十三年(639年)取经,过了十四年取经结束,即653年(当然历史上这年唐太宗已经死了)。

若考虑王莽篡汉一说为误传,即孙悟空确实只是压了五百年,则孙悟空被压五行山为公元139年,东汉汉顺帝永和四年左右,那么再次以贞观十三年(639年)计算, 猴王出世是在公元前448年左右。

以上,孙悟空的出生年份:
1.采取第十四回王莽篡汉之说,孙悟空出生于公元前579年左右,时为春秋时代,周简王在位。
2.采取书中出现的大多数【被压了五百年】之说,孙悟空出生于公元前448年左右,时为战国时代,周贞定王在位。

一想到孙悟空当美猴王之时,那头正春秋五霸纷争,战国七雄裂土——花果山果然是人间福地,世外桃源啊!

作者:黄粱
链接:https://www.zhihu.com/question/35327628/answer/62342484
来源:知乎

巴科斯-诺尔范式 (BNF) 基本语法[转]

语法规范:BNF与ABNF

BNF 

巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。

在BNF中,双引号中的字(“word”)代表着这些字符本身。而double_quote用来代表双引号。

在双引号外的字(有可能有下划线)代表着语法部分。

< > : 内包含的为必选项。
[ ] : 内包含的为可选项。
{ } : 内包含的为可重复0至无数次的项。
|  : 表示在其左右两边任选一项,相当于”OR”的意思。
::= : 是“被定义为”的意思
“…” : 术语符号
[…] : 选项,最多出现一次
{…} : 重复项,任意次数,包括 0 次
(…) : 分组
|   : 并列选项,只能选一个
斜体字: 参数,在其它地方有解释

下面是是用BNF来定义的Java语言中的For语句的实例:

FOR_STATEMENT ::= 
      "for" "(" ( variable_declaration | 
  ( expression ";" ) | ";" ) 
      [ expression ] ";" 
      [ expression ] ";" 
      ")" statement

 

理解巴科斯-诺尔范式 (BNF) 语法

语法结构使用BNF范式形式给出,先做一个简单了解。

在双引号中的字(“word”)代表着这些字符本身。而double_quote用来代表双引号。
在双引号外的字(有可能有下划线)代表着语法部分。
尖括号( < > )内包含的为必选项。
方括号( [ ] )内包含的为可选项。
大括号( { } )内包含的为可重复0至无数次的项。
竖线( | )表示在其左右两边任选一项,相当于”OR”的意思。
::= 是“被定义为”的意思。

BNF 语法使用下表中显示的表示法。

约定/符号 含义
::= 等效
| OR
X+ 一个或多个 X。
[X] X 可选。可选的分隔符由 [] 表示。
任何粗体文本 字符串。
任何斜体 文本 如何构造字符串。

正如前表中所指出的,注册器脚本使用字符串。这些值是必须出现在脚本中的实际的文本。下表描述 ATL 注册器脚本中使用的字符串。

字符串 操作
ForceRemove 完全移除下一项(如果存在),然后重新创建它。
NoRemove 在“注销”期间不移除下一项。
val 指定 <Key Name> 实际上是一个命名值。
Delete 在“注册”期间删除下一项。
s 指定下一个值为字符串 (REG_SZ)。
d 指定下一个值为 DWORD (REG_DWORD)。
m 指定下一个值为多字符串 (REG_MULTI_SZ)。
b 指定下一个值为二进制值 (REG_BINARY)。

  ABNF

RFC2234 定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中 ABNF 被广泛使用。ABNF 做了更多的改进。扩充巴科斯-瑙尔范式(ABNF)基于了巴科斯-瑙尔范式(BNF),但由它自己的语法和推导规则构成。这种元语言的发起原则是描述作为通信协议(双向规范)的语言的形式系统。它建档于 RFC 4234 中通常充当 IETF 通信协议的定义语言。

ABNF 规定是一组推导规则,写为:

规则 = 定义 ; 注释 CR LF

这里的规则是大小写敏感的非终止符,定义由定义这个规则的符号序列,一个文档注释组成,并结束于回车换行。

规则名字是大小写不敏感的: <rulename><Rulename><RULENAME> 和 <rUlENamE> 都提及同一个规则。规则名字由开始于一个字母的字母、数字和连字符组成。不要求用尖括号(“<”, “>”) (如 BNF 那样)包围规则名字。但是它们可以用来界定规则名字,比如在冗文中识别出规则名字的时候。ABNF 使用 7-位 ASCII 编码,在 8-位域中把高位置零。

终结符由一个或多个数值字符指定。数值字符可以指定为跟随着基数(b = 二进制, d = 十进制, x = 十六进制)的一个百分号“%”,随后是这个数值,或数值的串联(用“.” 来指示)。例如回车可以指定为十进制的 %d13 或十六进制的 %x0D。回车换行可以指定为 %d13.10

文字正文通过使用包围在引号(")中字符串来指定。这些字符串是大小写不敏感的,使用的字符集是 US-ASCII。所以字符串“abc”将匹配“abc”, “Abc”, “aBc”, “abC”, “ABc”, “AbC”, “aBC” 和 “ABC”。对于大小写敏感匹配,必须定义明确的字符: 要匹配 “aBc” 定义将是 %d97 %d66 %d99

操作符

空白被用来分隔定义的各个元素: 要使空格被识别为分割符则必须明确的包含它。

串联

规则1 规则2

规则可以通过列出一序列的规则名字来定义。

要匹配字符串“aba”可以使用下列规则:

fu = %x61; a
bar = %x62; b
mumble = fu bar fu

选择

规则1 / 规则2

规则可以通过用反斜杠(“/”)分隔的多选一规则来定义。

要接受规则 <fu> 或规则 <bar> 可构造如下规则:

fubar = fu / bar

递增选择

规则1 =/ 规则2

可以通过使用在规则名字和定义之间的“=/”来向一个规则增加补充选择。

规则

ruleset = alt1 / alt2 / alt3 / alt4 / alt5

等价于

ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5

值范围

%c##-##

数值范围可以通过使用连字符(“-”)来指定。

规则

OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"

等价于

OCTAL = %x30-37

序列分组

(规则1 规则2)

元素可以放置在圆括号中来组合定义中的规则。

要匹配“elem fubar snafu”或“elem tarfu snafu”可以构造下列规则:

group = elem (fubar / tarfu) snafu

要匹配“elem fubar”或“tarfu snafu”可以构造下列规则:

group = elem fubar / tarfu snafu
group = (elem fubar) / (tarfu snafu)

可变重复

n*n规则

要指示一个元素的重复可以使用形式 <a>*<b> 元素。可选的 <a> 给出要包括的元素的最小数目,缺省为 0。可选的 <b> 给出要包括的元素的最大数目,缺省为无穷。

对零或多个元素使用 *元素,对一或多个元素使用 1*元素,对二或三个元素使用 2*3元素

特定重复  

n规则

要指示明确数目的元素可使用形式 <a> 元素,它等价于 <a>*<a>元素

使用 2DIGIT 得到两个数字,使用 3DIGIT 得到三个数字。(DIGIT 在下面的核心规则中定义)。

可选序列

[规则]

要指示可选元素下列构造是等价的:

[fubar snafu]
*1(fubar snafu)
0*1(fubar snafu)

注释

; 注释

分号(“;”)开始一个注释并持续到此行的结束。

操作符优先级

上述操作符有从最紧绑定(binding)到最松绑定的给定优先级:

  1. 字符串,名字形成(formation)
  2. 注释
  3. 值范围
  4. 重复
  5. 分组,可选
  6. 串联
  7. 选择

与串联一起使用选择操作符可以造成混淆,建议使用分组来做明确串联分组。

核心规则

核心规则定义于 ABNF 标准中。

规则 形式定义 意义
ALPHA %x41-5A / %x61-7A 大写和小写 ASCII 字母 (A-Z a-z)
DIGIT %x30-39 数字 (0-9)
HEXDIG DIGIT / “A” / “B” / “C” / “D” / “E” / “F” 十六进制数字 (0-9 A-F a-f)
DQUOTE %x22 双引号
SP %x20 空格
HTAB %x09 水平tab
WSP SP / HTAB 空格和水平tab
LWSP *(WSP / CRLF WSP) 线性空白(晚于换行)
VCHAR %x21-7E 可见(打印)字符
CHAR %x01-7F 任何 7-位 US-ASCII 字符,不包括 NUL
OCTET %x00-FF 8 位数据
CTL %x00-1F / %x7F 控制字符
CR %x0D 回车
LF %x0A 换行
CRLF CR LF 互联网标准换行
BIT “0” / “1”

例子

在巴科斯范式(BNF)条目中的邮政地址的例子可以被指定为:

postal-address = name-part street zip-part

name-part = *(personal-part SP) last-name [SP suffix] CRLF
name-part = / personal-part CRLF

personal-part = first-name / (initial ".")
first-name = *ALPHA
initial = ALPHA
last-name = *ALPHA
suffix = ("Jr." / "Sr." / 1*("I" / "V" / "X"))

street = [apt SP] house-num SP street-name CRLF
apt = 1*4DIGIT
house-num = 1*8(DIGIT / ALPHA)
street-name = 1*VCHAR

zip-part = town-name "," SP state 1*2SP zip-code CRLF
town-name = 1*(ALPHA / SP)
state = 2ALPHA
zip-code = 5DIGIT ["-" 4DIGIT]

引用

参考

来源:http://kb.cnblogs.com/page/189566/

来源:http://tianya23.blog.51cto.com/1081650/633141

优秀程序员眼中的整洁代码[转]

有多少程序员,就有多少定义。所以我只询问了一些非常知名且经验丰富的程序员。

image.php_-57.gif

Bjarne Stroustrup,C++语言发明者,C++ Programming Language(中译版《C++程序设计语言》)一书作者。

我喜欢优雅和高效的代码。代码逻辑应当直截了当,叫缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来。整洁的代码只做好一件事。

Bjarne用了“优雅”一词。说得好!我MacBook上的词典提供了如下定义:外表或举止上令人愉悦的优美和雅观;令人愉悦的精致和简单。注意对“愉悦”一词的强调。Bjarne显然认为整洁的代码读起来令人愉悦。读这种代码,就像见到手工精美的音乐盒或者设计精良的汽车一般,让你会心一笑。

Bjarne也提到效率——而且两次提及。这话出自C++发明者之口,或许并不出奇;不过我认为并非是在单纯追求速度。被浪费掉的运算周期并不雅观,并不令人愉悦。留意Bjarne怎么描述那种不雅观的结果。他用了“引诱”这个词。诚哉斯言。糟糕的代码引发混乱!别人修改糟糕的代码时,往往会越改越烂。

务实的Dave Thomas和Andy Hunt从另一角度阐述了这种情况。他们提到破窗理论4。窗户破损了的建筑让人觉得似乎无人照管。于是别人也再不关心。他们放任窗户继续破损。最终自己也参加破坏活动,在外墙上涂鸦,任垃圾堆积。一扇破损的窗户开辟了大厦走向倾颓的道路。

Bjarne也提到完善错误处理代码。往深处说就是在细节上花心思。敷衍了事的错误处理代码只是程序员忽视细节的一种表现。此外还有内存泄漏,还有竞态条件代码。还有前后不一致的命名方式。结果就是凸现出整洁代码对细节的重视。

Bjarne以“整洁的代码只做好一件事”结束论断。毋庸置疑,软件设计的许多原则最终都会归结为这句警语。有那么多人发表过类似的言论。糟糕的代码想做太多事,它意图混乱、目的含混。整洁的代码力求集中。每个函数、每个类和每个模块都全神贯注于一事,完全不受四周细节的干扰和污染。

image.php_-58.gif

Grady Booch,Object Oriented Analysis and Design with Applications(中译版《面向对象分析与设计》)一书作者。

整洁的代码简单直接。整洁的代码如同优美的散文。整洁的代码从不隐藏设计者的意图,充满了干净利落的抽象和直截了当的控制语句。

Grady的观点与Bjarne的观点有类似之处,但他从可读性的角度来定义。我特别喜欢“整洁的代码如同优美的散文”这种看法。想想你读过的某本好书。回忆一下,那些文字是如何在脑中形成影像!就像是看了场电影,对吧?还不止!你还看到那些人物,听到那些声音,体验到那些喜怒哀乐。

阅读整洁的代码和阅读Lord of the Rings(中译版《指环王》)自然不同。不过,仍有可类比之处。如同一本好的小说般,整洁的代码应当明确地展现出要解决问题的张力。它应当将这种张力推至高潮,以某种显而易见的方案解决问题和张力,使读者发出“啊哈!本当如此!”的感叹。

窃以为Grady所谓“干净利落的抽象”(crisp abstraction),乃是绝妙的矛盾修辞法。毕竟crisp几乎就是“具体”(concrete)的同义词。我MacBook上的词典这样定义crisp一词:果断决绝,就事论事,没有犹豫或不必要的细节。尽管有两种不同的定义,该词还是承载了有力的信息。代码应当讲述事实,不引人猜测。它只该包含必需之物。读者应当感受到我们的果断决绝。

image.php_-59.gif

“老大”Dave Thomas,OTI公司创始人,Eclipse战略教父

整洁的代码应可由作者之外的开发者阅读和增补。它应当有单元测试和验收测试。它使用有意义的命名。它只提供一种而非多种做一件事的途径。它只有尽量少的依赖关系,而且要明确地定义和提供清晰、尽量少的API。代码应通过其字面表达含义,因为不同的语言导致并非所有必需信息均可通过代码自身清晰表达。

Dave老大在可读性上和Grady持相同观点,但有一个重要的不同之处。Dave断言,整洁的代码便于其他人加以增补。这看似显而易见,但亦不可过分强调。毕竟易读的代码和易修改的代码之间还是有区别的。

Dave将整洁系于测试之上!要在十年之前,这会让人大跌眼镜。但测试驱动开发(Test Driven Development)已在行业中造成了深远影响,成为基础规程之一。Dave说得对。没有测试的代码不干净。不管它有多优雅,不管有多可读、多易理解,微乎测试,其不洁亦可知也。

Dave两次提及“尽量少”。显然,他推崇小块的代码。实际上,从有软件起人们就在反复强调这一点。越小越好。

Dave也提到,代码应在字面上表达其含义。这一观点源自Knuth的“字面编程”(literate programming)5。结论就是应当用人类可读的方式来写代码。

image.php_-60.gif

Michael Feathers,Working Effectively with Legacy Code(中译版《修改代码的艺术》)一书作者。

我可以列出我留意到的整洁代码的所有特点,但其中有一条是根本性的。整洁的代码总是看起来像是某位特别在意它的人写的。几乎没有改进的余地。代码作者什么都想到了,如果你企图改进它,总会回到原点,赞叹某人留给你的代码——全心投入的某人留下的代码。

一言以蔽之:在意。这就是本书的题旨所在。或许该加个副标题,如何在意代码。

Michael一针见血。整洁代码就是作者着力照料的代码。有人曾花时间让它保持简单有序。他们适当地关注到了细节。他们在意过。

image.php_-61.gif

Ron Jeffries,Extreme Programming Installed(中译版《极限编程实施》)以及Extreme Programming Adventures in C#(中译版《C#极限编程探险》)作者。

Ron初入行就在战略空军司令部(Strategic Air Command)编写Fortran程序,此后几乎在每种机器上编写过每种语言的代码。他的言论值得咀嚼。

近年来,我开始研究贝克的简单代码规则,差不多也都琢磨透了。简单代码,依其重要顺序:

能通过所有测试;

没有重复代码;

体现系统中的全部设计理念;

包括尽量少的实体,比如类、方法、函数等。

在以上诸项中,我最在意代码重复。如果同一段代码反复出现,就表示某种想法未在代码中得到良好的体现。我尽力去找出到底那是什么,然后再尽力更清晰地表达出来。

在我看来,有意义的命名是体现表达力的一种方式,我往往会修改好几次才会定下名字来。借助Eclipse这样的现代编码工具,重命名代价极低,所以我无所顾忌。然而,表达力还不只体现在命名上。我也会检查对象或方法是否想做的事太多。如果对象功能太多,最好是切分为两个或多个对象。如果方法功能太多,我总是使用抽取手段(Extract Method)重构之,从而得到一个能较为清晰地说明自身功能的方法,以及另外数个说明如何实现这些功能的方法。

消除重复和提高表达力让我在整洁代码方面获益良多,只要铭记这两点,改进脏代码时就会大有不同。不过,我时常关注的另一规则就不太好解释了。

这么多年下来,我发现所有程序都由极为相似的元素构成。例如“在集合中查找某物”。不管是雇员记录数据库还是名-值对哈希表,或者某类条目的数组,我们都会发现自己想要从集合中找到某一特定条目。一旦出现这种情况,我通常会把实现手段封装到更抽象的方法或类中。这样做好处多多。

可以先用某种简单的手段,比如哈希表来实现这一功能,由于对搜索功能的引用指向了我那个小小的抽象,就能随需应变,修改实现手段。这样就既能快速前进,又能为未来的修改预留余地。

另外,该集合抽象常常提醒我留意“真正”在发生的事,避免随意实现集合行为,因为我真正需要的不过是某种简单的查找手段。

减少重复代码,提高表达力,提早构建简单抽象。这就是我写整洁代码的方法。

Ron以寥寥数段文字概括了本书的全部内容。不要重复代码,只做一件事,表达力,小规模抽象。该有的都有了。

image.php_-62.gif

Ward Cunningham,Wiki发明者,eXtreme Programming(极限编程)的创始人之一,Smalltalk语言和面向对象的思想领袖。所有在意代码者的教父。

如果每个例程都让你感到深合己意,那就是整洁代码。如果代码让编程语言看起来像是专为解决那个问题而存在,就可以称之为漂亮的代码。

这种说法很Ward。它教你听了之后就点头,然后继续听下去。如此在理,如此浅显,绝不故作高深。你大概以为此言深合己意吧。再走近点看看。

“……深合己意”。你最近一次看到深合己意的模块是什么时候?模块多半都繁复难解吧?难道没有触犯规则吗?你不是也曾挣扎着想抓住些从整个系统中散落而出的线索,编织进你在读的那个模块吗?你最近一次读到某段代码、并且如同对Ward的说法点头一般对这段代码点头,是什么时候的事了?

Ward期望你不会为整洁代码所震惊。你无需花太多力气。那代码就是深合你意。它明确、简单、有力。每个模块都为下一个模块做好准备。每个模块都告诉你下一个模块会是怎样的。整洁的程序好到你根本不会注意到它。设计者把它做得像一切其他设计般简单。

那Ward有关“美”的说法又如何呢?我们都曾面临语言不是为要解决的问题所设计的困境。但Ward的说法又把球踢回我们这边。他说,漂亮的代码让编程语言像是专为解决那个问题而存在!所以,让语言变得简单的责任就在我们身上了!当心,语言是冥顽不化的!是程序员让语言显得简单。

稿源:代码湾

转自:https://www.oschina.net/news/87473/good-programmers-clean-code

Thrift 数据类型

要编写Thrift定义文件,肯定要熟悉Thrift常见的数据类型:

1.基本类型(括号内为对应的Java类型):
bool(boolean): 布尔类型(TRUE or FALSE)
byte(byte): 8位带符号整数
i16(short): 16位带符号整数
i32(int): 32位带符号整数
i64(long): 64位带符号整数
double(double): 64位浮点数
string(String): 采用UTF-8编码的字符串

2.特殊类型(括号内为对应的Java类型):
binary(ByteBuffer):未经过编码的字节流

3.Structs(结构):
struct定义了一个很普通的OOP对象,但是没有继承特性。

struct UserProfile {
1: i32 uid,
2: string name,
3: string blurb
}

如果变量有默认值,可以直接写在定义文件里:

struct UserProfile {
1: i32 uid = 1,
2: string name = “User1”,
3: string blurb
}

4.容器,除了上面提到的基本数据类型,Thrift还支持以下容器类型:
list(java.util.ArrayList):
set(java.util.HashSet):
map(java.util.HashMap):

Thrift容器与类型密切相关,它与当前流行编程语言提供的容器类型相对应,采用java泛型风格表示的。Thrift提供了3种容器类型:
List<t1>:一系列t1类型的元素组成的有序表,元素可以重复
Set<t1>:一系列t1类型的元素组成的无序表,元素唯一
Map<t1,t2>:key/value对(key的类型是t1且key唯一,value类型是t2)。
容器中的元素类型可以是除了service意外的任何合法thrift类型(包括结构体和异常)。
用法如下:

struct Node {
1: i32 id,
2: string name,
3: list<i32> subNodeList,
4: map<i32,string> subNodeMap,
5: set<i32> subNodeSet
}

包含定义的其他Object:

struct SubNode {
1: i32 uid,
2: string name,
3: i32 pid
}

struct Node {
1: i32 uid,
2: string name,
3: list<subNode> subNodes
}

5.Services服务,也就是对外展现的接口:

service UserStorage {
void store(1: UserProfile user),
UserProfile retrieve(1: i32 uid)
}

好了歌

好了歌(曹雪芹《红楼梦》中诗词)

好了歌,中国著名古典章回体小说《红楼梦》中经典诗词,小说中为跛足道人所做,甄士隐彻悟后进行进一步注解,表现了作者现实主义和宗教思想。文中还有与之相和的《好了歌注》,承接并引申了《好了歌》的思想。诗歌内容隐射小说情节,表达了作者对现实的愤懑和失望,以及对自由的追求和向往!

甄士隐知投人不著,心中未免悔恨,再兼上年惊唬,急忿怨痛已伤,暮年之人,贫病交攻,竟渐渐的露出那下世的光景来。可巧这日拄了拐杖挣到街前散散心时,忽见那边来了一个跛足道人,疯癫落拓,麻鞋鹑衣,
口内念着几句言词道:
世人都晓神仙好,惟有功名忘不了!
古今将相在何方?荒冢一堆草没了。
世人都晓神仙好,只有金银忘不了!
终朝只恨聚无多,及到多时眼闭了。
世人都晓神仙好,只有娇妻忘不了!
君生日日说恩情,君死又随人去了。
世人都晓神仙好,只有儿孙忘不了!
痴心父母古来多,孝顺儿孙谁见了?
士隐听了,便迎上来道:“你满口说些甚么?只听见些‘好了’‘好了’。”
那道人笑道:“你若果听见‘好了’二字,还算你明白。可知世上万般,好便是了,了便是好。若不了,便不好;若要好,须是了。我这歌儿便名《好了歌》。”
士隐本是有夙慧的,一闻此言,心中早已彻悟,因笑道:“且住!待我将你这《好了歌》注解出来何如?”道人笑道:“你就请解。”
士隐乃说道:
陋室空堂,当年笏满床。
衰草枯杨,曾为歌舞场。
蛛丝儿结满雕梁,绿纱今又在蓬窗上。
说甚么脂正浓、粉正香,如何两鬓又成霜?
昨日黄土陇头送白骨,今宵红灯帐底卧鸳鸯。
金满箱,银满箱,转眼乞丐人皆谤。
正叹他人命不长,那知自己归来丧!
训有方,保不定日后作强梁。
择膏粱,谁承望流落在烟花巷!
因嫌纱帽小,致使锁枷杠,
昨怜破袄寒,今嫌紫蟒长。
乱烘烘你方唱罢我登场,反认他乡是故乡。
甚荒唐,到头来都是为他人作嫁衣裳。

写给自己也写给你 自己到底该何去何从

写给自己也写给你,自己到底该何去何从

能有一项长期爱好,看电影或者听歌收集旧书都行。这些爱好说白了就是让无聊的日子看起来有那么一点意义。

不要担心长时间不读书,你刷的微博,是在刷新信息量。看的电影也能充斥知识量。

看书看电影无须在意评论家说什么,有你喜欢的作家或演员就行。

过了三十岁,不管在什么地方吵架,都挺二的,尤其在网上。

五毛从来不值一提,更不配顺口一骂。

无论是谁,一有空就随便抓个人骂来骂去的,都不是什么好人。

别轻易贬低别人,同一个世界,同一个泥潭,无论黑衬衫白衬衫都带着污渍。

接下来说点小事 :))

不要占用别人车位,临时占用要留电话,否则车被划了轮胎被扎了都不好意思嚷嚷。

记得排队,记得上扶梯站右边,记得打车时别抢到别人前面,记得让自己方便的时候别给别人制造不快。

飞机没停稳何苦打开行李舱拿着背包就往外冲呢?我们不是最讨厌拥挤吗?

既然你改变不了什么,就改改自己的暴脾气,顺便去做一个正常人,当正常人越来越多,活着就没那么纠结,就会舒服一些,这就是改变。

别人给的伤害不能让你变强大,但你要学会躲避他们,不是说你惹不起,是你浪费不起那时间。把时间浪费在那种人身上,与自残无异。

关于朋友这件事,合得来就多加珍惜,不合拍就别浪费精力浪费时间辛苦维持了。

说到爱情,别为此寻死觅活,也别要求对方爱自己爱一辈子,那就是一段经历而已。

别问朋友借钱,除非是治病救人。欠钱到期还不了,要提前说,别羞于启齿错过时间等朋友问起时再支支吾吾闹得彼此都不痛快。

过去会越来越多,未来会越来越少,直到没有。当过去变成记忆,就变成身体的一部分,你忘不掉的。

当你感到自己真笨,这也干不好,那也做不好的时候,你已经是聪明人了。

不要担心这个致癌,那个致癌,这个不吃那个不吃,放心,我们最后都要死于癌症。

别人让你点菜,不会点就老老实实说不会点,别一张嘴就出来俩字:随便。

只要活着就总有那么一段时间,充满灰暗,躁动不安,可是除了面对,好像也没有别的办法。

当你感到时光漫长,实际上已经没有多少时间了。

老人倒了要扶,当年的坏人变老了,但不是所有的老人都变坏了。相信我,只有看热闹的越来越少,我们的下半生才有希望。

你会臃肿,你会白头,你将来也会倒在路边,但你不会去诬赖那个扶你的人。

你不会,我相信。

最后,

移民不是真正的理想,真正的理想是留在这个国家,管好自己并力所能及的帮助他人,以及,参与它的每一次改变。

来源:http://www.myexception.cn/other/1768786.html

struts2 upgrade 2.3 to 2.5 migration 升级向导

Dependencies

Update Struts dependencies to 2.5.

Remove the following plugin dependencies because they were dropped and aren’t supported anymore.

  • Dojo Plugin
  • Codebehind Plugin
  • JSF Plugin
  • Struts1 Plugin

StrutsPrepareAndExecuteFilter

The org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter was moved to org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.

In web.xml replace this:

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

with that:

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

There were other package changes, please read Version Notes 2.5 for more details.

DTD

Struts DTD was updated to 2.5 version.

In struts.xml replace 2.3 DTD version:

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

with 2.5:

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"

Tags attributes

The id attribute was replaced with var attribute in the following tags.

  • <s:action>
  • <s:append>
  • <s:bean>
  • <s:date>
  • <s:generator>
  • <s:iterator>
  • <s:merge>
  • <s:number>
  • <s:set>
  • <s:sort>
  • <s:subset>
  • <s:text>
  • <s:url>

If you have something like that in your code:

<s:url id="url" action="login">

change it to:

<s:url var="url" action="login">

The <s:set> tag name attribute is replaced with var attribute.

From:

<s:set id="str1" value="'string1 value'" />
<s:set name="str2" value="'string2 value'" />

to:

<s:set var="str1" value="'string1 value'" />
<s:set var="str2" value="'string2 value'" />

Also escape attribute was renamed to escapeHtml attribute.

From:

<s:property escape="true" var="someProperty"/>

to:

<s:property escapeHtml="true" var="someProperty"/>

Div tag

The <s:div> tag was dropped.

Replace <s:div> with plain HTML <div> tag.

Field names

If you have field names which starts with single lower case letter, for example:

private String sTrng;
public String getSTrng() {...}
public void setSTrng(String str) {...}

change accessors to getsTrng and setsTrng.

Or better yet, change field names to not contain single lower case letter:

private String strng;
public String getStrng() {...}
public void setStrng(String str) {...}

For additional info see WW-3909.

Tiles

Depending on from which version of struts you upgrade and whether you used tiles-plugin or tiles3-plugin you may need to do different steps.

Struts 2.5 just provides a tiles-plugin which uses Tiles3. So support for Tiles2 has been dropped as well as the name tiles3-plugin.

Now the only maven dependency looks like this:

maven dependecy for tiles-plugin
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-tiles-plugin</artifactId>
    <version>${struts2.version}</version>
</dependency>

You may need to update DTD in your tiles.xml files to Tiles3:

tiles3 dtd
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"

A Listener in web.xml is required. It is not necessary to configure paths to tiles.xml files here as they are picked up automatically.

StrutsTilesListener in web.xml
<listener>
  <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>

Optionally you may remove TilesDefinitions from XML and annotate actions instead. See Tiles Plugin for more details.

Temp/Work directory of ApplicationServer/ServletContainer

Users reported it was necessary for them to remove temp/work directory of their ApplicationServer/ServletContainer. Likely to force server to recompile JSPs.

来源:https://cwiki.apache.org/confluence/display/WW/Struts%202.3%20to%202.5%20migration

语法规范:BNF与ABNF

BNF 

巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。

在BNF中,双引号中的字(“word”)代表着这些字符本身。而double_quote用来代表双引号。

在双引号外的字(有可能有下划线)代表着语法部分。

< > : 内包含的为必选项。
[ ] : 内包含的为可选项。
{ } : 内包含的为可重复0至无数次的项。
|  : 表示在其左右两边任选一项,相当于”OR”的意思。
::= : 是“被定义为”的意思
“…” : 术语符号
[…] : 选项,最多出现一次
{…} : 重复项,任意次数,包括 0 次
(…) : 分组
|   : 并列选项,只能选一个
斜体字: 参数,在其它地方有解释

下面是是用BNF来定义的Java语言中的For语句的实例:

FOR_STATEMENT ::= 
      "for" "(" ( variable_declaration | 
  ( expression ";" ) | ";" ) 
      [ expression ] ";" 
      [ expression ] ";" 
      ")" statement

  ABNF

RFC2234 定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中 ABNF 被广泛使用。ABNF 做了更多的改进。扩充巴科斯-瑙尔范式(ABNF)基于了巴科斯-瑙尔范式(BNF),但由它自己的语法和推导规则构成。这种元语言的发起原则是描述作为通信协议(双向规范)的语言的形式系统。它建档于 RFC 4234 中通常充当 IETF 通信协议的定义语言。

ABNF 规定是一组推导规则,写为:

规则 = 定义 ; 注释 CR LF

这里的规则是大小写敏感的非终止符,定义由定义这个规则的符号序列,一个文档注释组成,并结束于回车换行。

规则名字是大小写不敏感的: <rulename><Rulename><RULENAME> 和 <rUlENamE> 都提及同一个规则。规则名字由开始于一个字母的字母、数字和连字符组成。不要求用尖括号(“<”, “>”) (如 BNF 那样)包围规则名字。但是它们可以用来界定规则名字,比如在冗文中识别出规则名字的时候。ABNF 使用 7-位 ASCII 编码,在 8-位域中把高位置零。

终结符由一个或多个数值字符指定。数值字符可以指定为跟随着基数(b = 二进制, d = 十进制, x = 十六进制)的一个百分号“%”,随后是这个数值,或数值的串联(用“.” 来指示)。例如回车可以指定为十进制的 %d13 或十六进制的 %x0D。回车换行可以指定为 %d13.10

文字正文通过使用包围在引号(")中字符串来指定。这些字符串是大小写不敏感的,使用的字符集是 US-ASCII。所以字符串“abc”将匹配“abc”, “Abc”, “aBc”, “abC”, “ABc”, “AbC”, “aBC” 和 “ABC”。对于大小写敏感匹配,必须定义明确的字符: 要匹配 “aBc” 定义将是 %d97 %d66 %d99

操作符

空白被用来分隔定义的各个元素: 要使空格被识别为分割符则必须明确的包含它。

串联

规则1 规则2

规则可以通过列出一序列的规则名字来定义。

要匹配字符串“aba”可以使用下列规则:

fu = %x61; a
bar = %x62; b
mumble = fu bar fu

选择

规则1 / 规则2

规则可以通过用反斜杠(“/”)分隔的多选一规则来定义。

要接受规则 <fu> 或规则 <bar> 可构造如下规则:

fubar = fu / bar

递增选择

规则1 =/ 规则2

可以通过使用在规则名字和定义之间的“=/”来向一个规则增加补充选择。

规则

ruleset = alt1 / alt2 / alt3 / alt4 / alt5

等价于

ruleset = alt1 / alt2
ruleset =/ alt3
ruleset =/ alt4 / alt5

值范围

%c##-##

数值范围可以通过使用连字符(“-”)来指定。

规则

OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"

等价于

OCTAL = %x30-37

序列分组

(规则1 规则2)

元素可以放置在圆括号中来组合定义中的规则。

要匹配“elem fubar snafu”或“elem tarfu snafu”可以构造下列规则:

group = elem (fubar / tarfu) snafu

要匹配“elem fubar”或“tarfu snafu”可以构造下列规则:

group = elem fubar / tarfu snafu
group = (elem fubar) / (tarfu snafu)

可变重复

n*n规则

要指示一个元素的重复可以使用形式 <a>*<b> 元素。可选的 <a> 给出要包括的元素的最小数目,缺省为 0。可选的 <b> 给出要包括的元素的最大数目,缺省为无穷。

对零或多个元素使用 *元素,对一或多个元素使用 1*元素,对二或三个元素使用 2*3元素

特定重复  

n规则

要指示明确数目的元素可使用形式 <a> 元素,它等价于 <a>*<a>元素

使用 2DIGIT 得到两个数字,使用 3DIGIT 得到三个数字。(DIGIT 在下面的核心规则中定义)。

可选序列

[规则]

要指示可选元素下列构造是等价的:

[fubar snafu]
*1(fubar snafu)
0*1(fubar snafu)

注释

; 注释

分号(“;”)开始一个注释并持续到此行的结束。

操作符优先级

上述操作符有从最紧绑定(binding)到最松绑定的给定优先级:

  1. 字符串,名字形成(formation)
  2. 注释
  3. 值范围
  4. 重复
  5. 分组,可选
  6. 串联
  7. 选择

与串联一起使用选择操作符可以造成混淆,建议使用分组来做明确串联分组。

核心规则

核心规则定义于 ABNF 标准中。

规则 形式定义 意义
ALPHA %x41-5A / %x61-7A 大写和小写 ASCII 字母 (A-Z a-z)
DIGIT %x30-39 数字 (0-9)
HEXDIG DIGIT / “A” / “B” / “C” / “D” / “E” / “F” 十六进制数字 (0-9 A-F a-f)
DQUOTE %x22 双引号
SP %x20 空格
HTAB %x09 水平tab
WSP SP / HTAB 空格和水平tab
LWSP *(WSP / CRLF WSP) 线性空白(晚于换行)
VCHAR %x21-7E 可见(打印)字符
CHAR %x01-7F 任何 7-位 US-ASCII 字符,不包括 NUL
OCTET %x00-FF 8 位数据
CTL %x00-1F / %x7F 控制字符
CR %x0D 回车
LF %x0A 换行
CRLF CR LF 互联网标准换行
BIT “0” / “1”

例子

在巴科斯范式(BNF)条目中的邮政地址的例子可以被指定为:

postal-address = name-part street zip-part

name-part = *(personal-part SP) last-name [SP suffix] CRLF
name-part = / personal-part CRLF

personal-part = first-name / (initial ".")
first-name = *ALPHA
initial = ALPHA
last-name = *ALPHA
suffix = ("Jr." / "Sr." / 1*("I" / "V" / "X"))

street = [apt SP] house-num SP street-name CRLF
apt = 1*4DIGIT
house-num = 1*8(DIGIT / ALPHA)
street-name = 1*VCHAR

zip-part = town-name "," SP state 1*2SP zip-code CRLF
town-name = 1*(ALPHA / SP)
state = 2ALPHA
zip-code = 5DIGIT ["-" 4DIGIT]

引用

参考

JAVA BIO与NIO、AIO的区别

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

一、BIO

在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。

二、NIO (New IO)

NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。

NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。  也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。

BIO与NIO一个比较重要的不同,是我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程;而NIO则是使用单线程或者只使用少量的多线程,每个连接共用一个线程。

NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。

在NIO的处理方式中,当一个请求来的话,开启线程进行处理,可能会等待后端应用的资源(JDBC连接等),其实这个线程就被阻塞了,当并发上来的话,还是会有BIO一样的问题。

HTTP/1.1出现后,有了Http长连接,这样除了超时和指明特定关闭的http header外,这个链接是一直打开的状态的,这样在NIO处理中可以进一步的进化,在后端资源中可以实现资源池或者队列,当请求来的话,开启的线程把请求和请求数据传送给后端资源池或者队列里面就返回,并且在全局的地方保持住这个现场(哪个连接的哪个请求等),这样前面的线程还是可以去接受其他的请求,而后端的应用的处理只需要执行队列里面的就可以了,这样请求处理和后端应用是异步的.当后端处理完,到全局地方得到现场,产生响应,这个就实现了异步处理。

三、AIO

与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。  即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。  在JDK1.7中,这部分内容被称作NIO.2,主要在Java.nio.channels包下增加了下面四个异步通道:

  • AsynchronousSocketChannel
  • AsynchronousServerSocketChannel
  • AsynchronousFileChannel
  • AsynchronousDatagramChannel

其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数。

BIO是一个连接一个线程。

NIO是一个请求一个线程。

AIO是一个有效请求一个线程。

先来个例子理解一下概念,以银行取款为例:

  • 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写);
  • 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API);
  • 阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回);
  • 非阻塞 : 柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成)

Java对BIO、NIO、AIO的支持:

  • Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
  • Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
  • Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,

BIO、NIO、AIO适用场景分析:

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
  • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
  • AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

另外,I/O属于底层操作,需要操作系统支持,并发也需要操作系统的支持,所以性能方面不同操作系统差异会比较明显。

在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。

在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步,同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。

一般来说I/O模型可以分为:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO

同步阻塞IO:在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式!

同步非阻塞IO:在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。

异步阻塞IO:此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!

异步非阻塞IO:在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。目前Java中还没有支持此种IO模型。

2016世界最烂密码出炉 排名第一的还是123456

据Business Insider报道,安全公司Keeper在对1000万个泄露的密码进行分析后,得出了今年最常用的密码。排名第一的密码就是123456,而它几乎每年都会当选。
2016年,这些超简单的密码也频频给黑客们助攻,最令人记忆犹新的就是Facebook CEO扎克伯格“dadada”的密码。
在这1000万个泄露的密码中,有17%的用户都选择了123456最为自己的密码。排名第二的常用密码比123456高明不了多少,因为它是123456789。排在第三的这是qwerty(键盘第一排的几个字母)。
Keeper表示,安全专家三番五次提醒用户增强密码的安全级别都被大多数人当成了耳旁风,“过去几年里,这个榜单上的密码几乎没变过,这就意味着安全专家的善意提醒根本没多少人接受。如果用户在设置密码时不负责任,网站管理者应该替用户把关。”
2016年最常用密码TOP 25:
1. 123456
2. 123456789
3. qwerty
4. 12345678
5. 111111
6. 1234567890
7. 1234567
8. password
9. 123123
10. 987654321
11. qwertyuiop
12. mynoob
13. 123321
14. 666666
15. 18atcskd2w
16. 7777777
17. 1q2w3e4r
18. 654321
19. 555555
20. 3rjs1la7qe
21. google
22. 1q2w3e4r5t
23. 123qwe
24. Zxcvbnm
25. 1q2w3e
来源:第一财经|YICAI

[转] UltraEdit_16.10.0.22 破解

2016-11-20 增加16.10.0.22破解

去官网下载原载,先运行一次,再在终端里执行下面代码就可以破解完成!
printf ‘\x31\xC0\xFF\xC0\xC3\x90’ | dd seek=$((0x92D370)) conv=notrunc bs=1 of=/Applications/UltraEdit.app/Contents/MacOS/UltraEdit

论坛里有很多锋友发消息问我怎么找skProtectionPlus::IsActivated函数地址,下面我把找函数地址的方法发一下:

你下载个IDA pro,然后用打开idaq64,然后把Applications/UltraEdit.app/Contents/MacOS/UltraEdit拖到IDA里,
在导出函数里找到skProtectionPlus::IsActivated

2016-11-17 增加16.10.0.21破解

去官网下载原载,先运行一次,再在终端里执行下面代码就可以破解完成!
printf ‘\x31\xC0\xFF\xC0\xC3\x90’ | dd seek=$((0x92B240)) conv=notrunc bs=1 of=/Applications/UltraEdit.app/Contents/MacOS/UltraEdit

16.10.0.19破解:

去官网下载原载,先运行一次,再在终端里执行下面代码就可以破解完成!

printf ‘\x31\xC0\xFF\xC0\xC3\x90’ | dd seek=$((0x92D540)) conv=notrunc bs=1 of=/Applications/UltraEdit.app/Contents/MacOS/UltraEdit

其实就是修改skProtectionPlus::IsActivated函数,会修改的后续版本可以自已改!

来源:http://bbs.feng.com/read-htm-tid-10828753.html

一份简单实用的微交互设计指南

好的产品往往做好了两点:功能和细节设计。

功能吸引用户使用你的产品,细节设计将你的用户留下。优秀的细节设计能够使你的产品在众多竞品中脱颖而出,优秀的微交互设计往往能够让用户在初次使用产品时就能够留下深刻的印象。作为一个交互设计师,在设计微交互方案的时候不仅要考虑视觉上的冲击力,还要想办法赋予其信息传递的功能。

 什么是微交互?

微交互是产品中存在的某一个时刻,它完成了某一个小的任务。Dan Saffer在他的书中(Microinteractions)第一次描述了微交互的概念,这些小细节专注于服务这些必要的功能:

 交流回馈或者动作的结果回馈

完成某个单独的任务

增强直接操作的感觉

帮助用户在视觉上展示操作的结果,以及避免错误

一些明显的微交互例子包括:

当你将iPhone设置成静音时伴随出现的的震动提醒、屏幕上的静音icon。

7yw20160316
 

界面动画提示是否能够点击(当鼠标移到按钮上方时按钮的颜色改变)。

6yw20160316
 

  为什么使用微交互?

微交互是在对用户一些自然的需求/欲望的认知和反馈。用户从微交互提供的视觉、触觉等反馈中确认他们的行为被接受。微交互还可以引导用户正确的使用系统/产品。

  定义微交互的使用情景

微交互的一个特点是它可以被放置在很多的场景下,辅助不同的动作行为。总体来说,微交互的使用场景包括:

 展示系统/产品的状态

Jacob Nielsen在“可用性启发原则”中指出:让你的用户时刻了解发生的事情,用户期望对自己的行为立即得到反馈。但是有些情况下,app需要时间来等待行为处理完成后才能向用户发出反馈。因此,产品界面需要向用户指明此刻正在发生的事。

5yw20160316
 

▲ 下载进度表

  或者标明用户所在的位置:

4yw20160316
 

Tips:不要让你的用户感到无助,让你的用户了解实时的状态并且向其展示进度(比如进度条能够让用户了解进度,消除疑惑)

 提示更新

我们有时需要向用户推送通知来保证用户了解到事态的更新。动画可以做到这一点,动画可以吸引用户的注意力,避免用户忽视掉重要的信息。

3yw20160316
 

Tips:微交互里的动效应该遵循KISS原则(keep it simple, stupid),应该尽量简单直接。

关联上下文

使用动效来将用户的注意力平滑的在导航页面间切换,向用户解释页面里元素之间的关系,以及页面跳转的来龙去脉。这对于移动设备非常有用,因为屏幕的尺寸限制,移动界面中每一页的内容都很紧凑,使用动效来阐述内容之间的联系非常实用。

Tips:尽量让每个页面的导航简洁,这样可以有效避免用户在页面跳转中迷失。两个状态之间的却换应该清晰、平滑、快捷。在视觉上统一所有的交互形式,降低用户的学习成本。

 输入可视化

数据输入是应用中非常重要的环节,微交互可以使用现有的元素来展示数据输入的反馈,从而将这步操作变得更加高效。

2yw20160316
 

Tips:微交互能够帮助用户理解信息格式,来源,帮助用户便捷输入信息。

  引导互动

微交互可以鼓励用户、吸引用户与产品交互。它可以在用户体验中产生同理心。但是需要谨慎使用微交互,保证其在感官上不会冒犯你的用户。

时刻谨记:不要让用户感到厌烦,Keep it simple, stupid.

1yw20160316
 

Tips:关注用户的情感反馈,因为它在用户体验中起到很重要的作用。多做用户研究和情景调研,设计能被用户频繁使用的微交互方案。

  值得谨记的

微交互向用户展示动作反馈,通知以及信息框架结构

微交互应该通过转移用户的注意力、愉悦用户等来达到加快/缩短信息数据的传输

了解你的用户以及使用微交互的背景,能够让你的微交互方案更加的精准与高效

微交互必须能够支持长时效的使用,在第一次使用时感到惊喜的方案,可能在第一百次使用时就变成了困扰。

微交互方案应该人性化一些,并且在视觉上保持和谐。用户在使用的时候应该感到流畅,微交互的方案应该尽可能的从现实生活中获得启发,比如使用拟物化等手段,从而降低学习成本。

  总结

用心设计,思考用户使用产品的情景,再设计这些微交互时多运用一些生活中常见的操作模式、物体的运动轨迹、常见的行为方式等。产品的易用性来源于对细节的打磨,伟大的设计不仅仅在功能上满足用户的需求,还要在微交互的设计上打动人心。

喝酒与开发,新年了还是喝酒庆祝一下好了

新的一年了,还是喝酒庆祝一下好了。

大家喝的是啤酒。这时你入座了。
你给自己倒了杯可乐,这叫低配置。
你给自已倒了杯啤酒,这叫标准配置。
你给自己倒了杯茶水,这茶的颜色还跟啤酒一样,这叫木马。
你给自己倒了杯可乐,还滴了几滴醋,不仅颜色跟啤酒一样,而且不冒热气还有泡泡,这叫超级木马。
你的同事给你倒了杯白酒,这叫推荐配置。

人到齐了,酒席开始了。
你先一个人喝了一小口,这叫单元测试。
你跟旁边的人说哥们咱们随意,这叫交叉测试。
但是他说不行,这杯要干了,这叫压力测试。
于是你说那就大家一起来吧,这叫内部测试。
这个时候boss向全场举杯了,这叫公开测试。

菜过三巡,你就不跟他们客气了。
你向对面的人敬酒,这叫p2p.
你向对面的人敬酒,他回敬你,你又再敬他……,这叫tcp.
你向一桌人挨个敬酒,这叫令牌环。
你说只要是兄弟就干了这杯,这叫广播。
可是你的上司jj听了不高兴了,只有兄弟么,罚酒三杯。这叫炸弹。
可是你的下级mm听了不高兴了,我喝一口,你喝一杯,这叫恶意攻击。
有一个人过来向这桌敬酒,你说不行你先过了我这关,这叫防火墙。
你的小弟们过来敬你酒,这叫一对多。
你是boss,所有人过来敬你酒,这叫服务器。

酒是一样的,可是喝法是不同的。
你喝了一杯,boss喝了一口,这叫c#。
你喝了一杯,mm喝了一口,这叫vb。
你喝了一杯,你大哥喝了半杯,这叫c++。
你喝了半杯,你小弟喝了一杯,这叫汇编。
你喝了一杯,你的搭档也喝了一杯,这叫c。

酒是一样的,可是喝酒的人是不同的。
你越喝脸越红,这叫频繁分配释放资源。
你越喝脸越白,这叫资源不释放。
你已经醉了,却说我还能喝,叫做资源额度不足。
你明明能喝,却说我已经醉了,叫做资源保留。
你喝一段时间就上厕所,这叫cache。

酒过三巡,你也该活动活动了。
你一桌一桌的走,这叫轮巡。
你突然看到某一桌的漂亮mm,走了过去,这叫优先级。
你去了坐下来就不打算走了,这叫死循环。
你的老大举杯邀你过去,你只好过去,这叫启动事件。
你向一桌敬酒,他们说不行不行我们都喝白的,于是你也喝白的,这叫本地化。
你向boss敬酒,可是boss被围了起来,你只能站在外圈,这叫排队。
你终于到了内圈,小心翼翼的向前一步,这叫访问临界区。
你拍着boss的肩膀说哥们咱们喝一杯,这叫越界。
你不知喝了几圈了,只会说两个字,干了,这叫udp。
可是还有人拿着酒瓶跑过来说,刚才都没跟你喝,这叫丢包。

喝酒喝到最后的结果都一样
你突然跑向厕所,这叫捕获异常。
你在厕所吐了,反而觉得状态不错,这叫清空内存。
你在台面上吐了,觉得很惭愧,这叫程序异常。
你在boss面前吐了,觉得很害怕,这叫系统崩溃。
你吐到了boss身上,只能索性晕倒了,这叫硬件休克。

喝挂了,宕机

响应了国家号召不喝高度酒,都把白酒换成了白葡萄酒,这叫最佳实践

不喝不准走,这叫锁,喝了才让走,这叫解锁

边喝边吐是不是叫溢出呢?

边喝边尿叫多线程?

来源:https://my.oschina.net/xxiaobian/blog/818235