Saturday, January 30, 2016

自己的想法

人活着 得有自己梦想

烟草的利亚杠杆太大了,不是某一个人可以收了算的,因为这里面牵扯的利益太多了,不是老马看不到的,只因为,利益有点超大,会得罪很大的一批人,没有这个必要,给及买个坑总归是不好的,当你发财的时候,你总会堵一些人的路,但是,你需要做的选择就是堵谁的路,这才是人应该做的,我不知道自己的人生,中还有多少机会和机遇,我自己的梦想太多了,真正能够实现的并不是很多,我需要做的就是珍惜自己的时间,去做自己的内心真的喜欢做的时间,我没有那么多的时间去儿女清唱的。因为,现在对于我而言。最宝贵的莫过于时间。想法只是一种思路而已,但是真的能走到哪里,是自己的选择说了算的。按着自己的意志走下去。是的,我以前似乎错的太离谱了,我竟然傻乎乎的说,我愿意等你到30岁呢?我想问问你阿珠,凭什么?在最好的年纪,并不会答应你的人,你有为什么要将自己最好的年华给她呢?你觉的这样子公平吗?中国人,真的是太急功近利了,总是做锦上添花的事情,美欧人会雪中送炭的。这就是我们的现实,如果你不行了,没有人会看的起你的奥。当你连自己都养不活的时候,又怎么可你去管别人呢?我只是想问问你?你的内心是怎么想的?不是吗?
当年,那么一口就回绝了你了。她是多么聪敏的孩子,你为什么非要一棵树上吊死恩?不知道吗?就算是现在,你还么有成功,她是不会把宝压在你的身上的,似乎只有成为了下一个马云的时候,她才会回头吧,但是,那个时候,  现在你对我爱答不理,将来我让你高攀不起。霸气的话语,很牺牲 马哥哥的才华!

什么 秋呀,什么 姗姗呀,什么 所有的 孩子们,我真的很干洗你们,感谢你们这些我生命中的过客。没有你们,就没有我现在的生活,谢谢你们,好马不吃回头草。

我会按照自己意志走下去,我绝对不要等到你的30岁的时候,区区一个老女人的的。这不是我的性格,我会按照自己的理念活着,我的生活不再是 以前的样子。 我要按照自己的意志活着。只做自己喜欢的事情。只欣赏自己喜欢的事情。这就是我  李珠,李珠 并不会去改自己的名字,因为 这是唯一陪伴我20多年没有嫌弃我的食物,还有自己的影子,自己的路就在前面。


前面未必就是  光明的,也是 黑暗的人生,我不知道,我都要走下去,因为,自己的路不是别人帮你走的,就算别人能给你铺最好的路,自己不行,也是 垃圾,就像 张学良, 老爸 牛逼吧,他本来可以成为 执牛耳这,但是 自己不行,自己的意志不行。 跟在别人的后面,你绝对不会超过他的,但是自己走,就不一定了~!

Wednesday, January 27, 2016

GreatFireWall 工作原理

1  DNS  污染

你请求的网址,在进行DNS解析的时候,给你返回错误的IP地址。

修改host 可以解决这个问题:修改 hosts 文件的原理是什么?

DNS(Domain Name Service)即“域名解析服务”,功能好比是互联网上的电话簿。早期,仅通过IP来封锁服务的话,“墙”需要查看每个数据包,判断是否放行。但使用“DNS污染”技术,相当于直接给用户一个错误的“电话号码”,从源头就遏制了“不良通信”。值得注意的是,“DNS污染”这种强力武器,不仅能有效封锁国内网民对敏感内容的访问,还会连带影响其他国家。


2  IP 封锁
IP 封锁。比如访问国外一个 IP 无法访问,Ping 不通,tracert 这个 IP 后发现,全部在边缘路由器 (GFW) 附近被拦截。换言之,GFW 直接拦截带有这个 IP 头的数据包。所以,如果你更改的 IP 被封锁了,就算你过了 DNS 这一关,也仍旧不能翻过 GFW。

3  敏感词
这几年,我在香港求学,当时因为研究需要,我要下载大陆某公司的中文词库,奇怪的是,无论使用何种工具,进度条总是停在70%的地方。后来分析发现,每次下载到这个位置的时候,系统就会收到一个“RST”包──“RST”是“Reset”(重置)的意思。这是一种特殊的数据包,当计算机收到这种包的时候,会重置一条网络链接。这个特点被“墙”广泛用来掐掉“不和谐”的网络链接。好比A和B正在打电话,“墙”想要掐断电话,和以前粗暴地摔电话机不同,“墙”对A说:“B挂你电话了”,同时又对B说,“A挂你电话了”,不明真相的两人就真的自己把电话挂掉了。敏感词触发RST,这种“墙”的工作机制,
最重原创

转载:  感谢 VV

道高一尺,墙高一丈:互联网封锁是如何升级的


1987年,中国第一封电子邮件由中国兵器工业计算机应用研究所发往德国,标志中国成功接入互联网。邮件内容是:“Across the Great Wall we can reach every corner in the world”——穿越“巨墙”(长城),我们无处不及。与这封邮件几乎同龄的我,没想到生活中竟总离不开“墙”。在物理世界和虚拟世界中多次穿墙,也去过世界各处,看“墙”越筑越高,有时义愤填膺,有时啼笑皆非。仅以此文,记录“墙”边的一些见闻。

国家公共网络监控系统

国家公共网络监控系统,俗称中国网络防火墙(The Great Fire Wall of China,常用简称“GFW”或“墙”)。一般意义所説的GFW,主要指中国官方对境外涉及敏感内容的网站、IP地址、关键词、网址等的过滤。随着使用的拓广,中文“墙”和英文“GFW”有时也被用作动词,网友所説的“被墙”即指被防火长城所屏蔽。

2008年校园网:“连坐”惩罚

2007年,我进入这所XX理工大学。它特别吊诡的设定是,大一不能带电脑,大二考过国家英语四级的人才可以带电脑。就这样,2008年秋天,我终于正大光明地连上校园网。千兆比特级别以太网直入国家主干网,中国电信、中国教育网双通道。这个规格,算是极高的。网速之快,前所未见;可是,总有一些网站访问不了。但这些小细节,终究不影响同学们DotA(一款基于Warcraft的对战地图)的热情。
那个时候,我们愉快地上Google,查Wikipedia,学习西方先进科技。不时有好事者,会键入诸如“六四”、“胡萝卜”、“温度计”(网民用来形容胡锦涛与温家宝的指代用词)这样的神奇词汇,于是全校与Google失联十数分钟。每当到这个时候,室友们相视一笑,“哦,谁又撞墙了!”但打壶开水,泡一杯面,还不等吃完,就又可以Google了。
那个时候的“墙”就好像霰弹枪,火力充足,但瞄不太准。一枪下去,打一大片,总是搞得“城门失火,殃及池鱼”。
墙如何运作?
一台机器要与互联网上的其他机器对话,需要一个IP地址,好比一个人需要身份证(ID),才能唯一标识一样。否则,你喊一句话,对方不知应该回话给谁。而IP地址的总量是有限的,就好比一个大小固定的蛋糕。美国入场早,切走一大块。接着列强瓜分。等到中国的时候,还剩下点面皮。而该理工大学在这轮“圈地运动”中,只得到2个IP地址,给全校数万师生共用。这下好了,一个IP后面几万人,究竟谁在干什么,从校外是看不清的了。早期的防火墙,只能粗糙地在IP级别上执行封锁,要管束,只能全盘封了整个学校的网络。但毕竟一所国家重点高校,不可能用这种方式来管理,但不封锁,又无法向监管部门交代。
墙早期对用户的“连坐”惩罚策略。制图:金秋枫
说到底,监管当局不乏能工巧匠,他们很快想出一个办法:封杀大约4千个连续的端口(Port)。如果我们把IP地址比作一栋房子 ,那么端口就是出入这间房子的门。不同于真正的房子只有几个门,一个IP地址的端口可以有65536(即2的16次方)个之多。端口在一定时期内是被内网的一个用户独占,于是数据包可以准确地回到始发地。不过,封一个端口不过瘾,只是撞墙者自己倒霉而已。试想,你好不容易把野马制服了,又会有一些原本安顺的良马变野,效果不佳。最好的办法就是让它成为害群之马,以做警示。所以,一旦内网某个用户登陆Google检索“敏感信息”,这意味着一个端口“撞墙”,“墙”就把接连着的约四千多个端口都封掉,令无辜群众也无法上网。这种断网的“连坐惩罚”短则几分钟,长则十几分钟,才能恢复服务。

2010年北京:合租服务器翻墙

3月,Google位于北京中关村的办公室楼下堆满了鲜花,网友以这种方式纪念因“遭受中国骇客攻击”和“网络审查”而决定退出中国市场的Google。
“墙”这个概念越来越清晰,也进入了更多人的视野。2009年,Facebook和Twitter相继被封,昭示着中国政府通过防火墙阻隔国际互联网,建立“局域网”的决心——“局域网”是中国网民对墙内状况的戏称。
“咱们合租一个VPS(Virtual Private Server)吧”,这是技术青年们见面经常谈到的话题,仅次于买房和买车。VPS即虚拟主机,向服务商租取一段时间使用权即可。以前,大家合租VPS,多是为了搭个博客,赶赶时髦。而现在,合租VPS,多是为了翻墙。
墙外丰富多彩的世界吸引着年轻人。制图:金秋枫
对这些年轻人来说,“翻墙”用Google检索最新资讯,使用垃圾邮件最少的Gmail,随时查询在线百科全书Wikipedia,通过Facebook、Twitter与同行保持密切的技术资讯沟通,就像呼吸一样自然。也有更多人翻墙是要选择不同服务器进行联网游戏,或下载最新的影视内容,“翻墙”就像玩猫和老鼠的游戏。
VPS如何帮你翻墙?
当你发一个数据包到Google或者Facebook时,防火墙可以直接识别目的IP地址而自动拦截。而前面提到的VPS,是虚拟主机,自己也有IP地址,但无公开记录其归属,难以确认是否是敌军。既然如此,我们把数据包先发到VPS,再由它中转到目的地,就成功绕开“墙”了。由于VPS的这种特性,它也被称作“跳板”。
“跳板”是所有“翻墙”技术的共通原理。制图:金秋枫
利用一个“跳板”绕过“墙”,正是许多翻墙软件的基本原理。曾经繁荣的翻墙软件“无界”、“自由门”,还有众多的“代理服务器”,包括后来更广泛应用的VPN(Virtual Private Network),都是借用跳板原理。VPN最早是用来帮助一个企业多地的办公室间互联,也可以让员工在异地进入公司内网,方便执行一些高权限的作业。这样一来,跨国公司天然就拥有了穿墙的隧道:数据包先发到海外办公室,再去向世界各地。所以,VPN也成了跨国公司员工翻墙的主流手段。
这年,我第一次用“ssh -D”(一行命令)翻墙。SSH可以让系统管理员连接上主机,进行远程操作。同时它相当于在客户端与服务器之间建立了一个隧道,所以也能传输其他的数据,包括“翻墙”流量。只要这台机器的IP不在墙的“黑名单”中,也就可以成功绕过墙的封锁了。对技术人员来说,买VPS是最简单且低成本的翻墙方法。即便一台VPS被墙,再买一台即可。一年几十美元的价格,合租下来非常便宜。
SSH协议可以建立“隧道”,成为技术人员“翻墙”的最爱。制图:金秋枫

2011-14年香港:“墙”成为一门显学

在Google、Wikipedia中文、Facebook、Twitter等全球流行网络应用被阻隔在防火墙之外后,中国大兴土木建设的“局域网”,这几年也初现雏形。
搜索用百度,邮箱有163/QQ,社交有微博/人人,购物用淘宝/京东,即时聊天用微信——各种互联网服务,墙内应有尽有。对大部分网民来说,翻墙成了越来越不必要的需求。而剩下的一小拨执着于翻墙的用户,以及全世界致力于研究“墙”的学者,他们见证了“墙”的升级,与之斗智斗勇,也从一些滑稽的表象,捕捉到“墙”发展的各种蛛丝马迹。
因“墙”不同的工作原理,越来越多的翻墙工具被开发出来。对“翻墙”这个行当来说,这是个百花齐放的时代。

解析邮件

2011年初,Gmail大规模延迟,这可能是生活在中国的很多“良民”第一次看到墙的影子。他们并不是Twitter、Facebook的忠实用户,对自由世界的“危险信息”也并不感兴趣,只是日常收发邮件,竟也撞墙。实测显示,Gmail与大陆服务商之间的邮件有不同程度的延迟,少则几个小时,多则几个星期。人们纷纷猜测,“墙”已经进化到开始解析邮件。
“墙”开始尝试解析墙内外邮件,终因负载太高,造成大规模延迟。制图:金秋枫

敏感词触发RST,偶尔需要“向内翻墙”

这几年,我在香港求学,当时因为研究需要,我要下载大陆某公司的中文词库,奇怪的是,无论使用何种工具,进度条总是停在70%的地方。后来分析发现,每次下载到这个位置的时候,系统就会收到一个“RST”包──“RST”是“Reset”(重置)的意思。这是一种特殊的数据包,当计算机收到这种包的时候,会重置一条网络链接。这个特点被“墙”广泛用来掐掉“不和谐”的网络链接。好比A和B正在打电话,“墙”想要掐断电话,和以前粗暴地摔电话机不同,“墙”对A说:“B挂你电话了”,同时又对B说,“A挂你电话了”,不明真相的两人就真的自己把电话挂掉了。敏感词触发RST,这种“墙”的工作机制,如今已是衆所周知。而这种监控与阻断是双向的,出入都可能撞墙。有时候在墙内需要翻出来,有时候在墙外需要翻进去。
通过“RST”欺骗通信双方,以阻断链接。制图:金秋枫

走出国门的DNS污染

DNS(Domain Name Service)即“域名解析服务”,功能好比是互联网上的电话簿。早期,仅通过IP来封锁服务的话,“墙”需要查看每个数据包,判断是否放行。但使用“DNS污染”技术,相当于直接给用户一个错误的“电话号码”,从源头就遏制了“不良通信”。值得注意的是,“DNS污染”这种强力武器,不仅能有效封锁国内网民对敏感内容的访问,还会连带影响其他国家。2012年,世界顶级网络通讯会议SigComm上,出现一篇匿名论文。论文发现,中国发动的“DNS污染”已经超越了国界。在测试了全球4万多个域名解析服务器后,他们发现其中26.41%的服务器受到了这种污染的影响,覆盖109个国家。
DNS污染。制图:金秋枫

近500个实体“哨所”

2012年,一组来自Michigan大学的研究者,对“墙”的位置进行了探测。他们发现,就像真实的长城并非连绵不断的,防火墙也并不是密不透风地“堵”在我们的“网络”上,而是一组散落各处的“哨所”,只有当发现威胁的时候,它们才用“RST”或“DNS污染”这样的方式进行干扰。截止2012年底,研究者总共探测到了近500个这样的“哨所”,在中国南方,部署数量头三位的省份为:广东(84个)、福建(29个)、湖南(28个)。
小插曲是,研究者把探测“哨所”的工具在GitHub(世界最大的开源代码托管服务)上开源发布后,引起了激烈的争论。一些人认为,此举会激怒“墙”的管理者,导致GitHub被封锁,影响墙内程序员学习交流,所以应该删除这样的代码仓库,“保持技术社区的纯粹”。另一些人,则认为翻墙是程序员的基本技能,表示不受影响,所以力挺该项目,并极力反对技术社区加入“自我审查”的行列。

深度数据包检测

2012年底,“墙”的总设计师、北京邮电大学时任校长方滨兴的研究团队曾发表论文“网络流量分类,研究进展与展望”,文章提到了多种使用机器学习进行“深度数据包检测”(Deep Packet Inspection,DPI)的技术。随后几年,这些先进的技术逐渐在“墙”上部署开来。
要理解“深度数据包检测”的威力,我们可以把数据包想像成一封信。“浅度”的数据包检测,就好像是看看信封上的发件人和收件人,即决定是否放行。这给“跳板法”留下可乘之机:我们先将信送到中间站(如虚拟主机VPS),再转发到目的地,就绕过检查了。“深度”的数据包检测,可以理解成对信件内容的探查──相比起暴力打开信封,这种基于机器学习的技术更具有艺术性。它并不实际解读数据包的内容,而是搜集周边信息,对数据流进行“肖像刻划”(Profiling)。举个例子,你用Google搜索时,网络上只会有文本和少量图片经过,数据量很小,并且是突发的;但用YouTube看视频时,就会有持续一段时间的大量数据流过。“墙”的监控也是基于这样的抽象指标,比如它监控到到间歇而细小的流量,便推断你不太可能是在用YouTube。将诸如此类的可参考指标放在一起,就组成当前数据流的一副“肖像”。把这个“肖像”与数据库里面已经存放的巨量“翻墙流量肖像”和“非翻墙流量肖像”做个比对,就可以相应归类了。如所有的机器学习算法一样,这种归类会误杀一些非翻墙流量,也会错放一些翻墙流量。但日积月累,“墙”观察的样本越多,准确率也就越高。
浅度与深度数据包检测。制图:金秋枫

2015年深圳:“墙”的疯狂进化

新时代的墙,像是手术刀,精准迅速,直击命门。
在深圳小住半年,我深刻感受到“数字围剿”的压力。随着2014年底,Gmail全面被封禁,墙进化迅速、部署增强,还配合行政措施打击翻墙势力。深度包检测的大规模部署、DNS污染的扩大、转守为攻的国家防火墙策略、ISP的深度合作——“墙”俨然是正规军,而翻墙的社区只能打一场场的游击战,越打越疲惫。
首先,是香港的学校专用VPN开始不好使了。据传,几种主流的VPN协议已经被“墙”破解,手段十分细腻:有时候连上VPN,可以使用Google搜索和Google Drive办公,但一旦链接YouTube或者Facebook,网络链接就立马被掐掉了。
紧接着,一系列政策出台:境外VPN需要备案。像Astrill等常用的商业VPN服务,迅速被封。
同时,“DNS污染”的范围与频度都扩大了。为了抵御“DNS污染”,我曾一度使用“DNSCrypt”——这个开源项目会加密客户端和服务器之间的通信内容,不被墙查探到。然而好景不常在,很快,“墙”将已知的DNSCrypt的服务器IP计入黑名单,这样连访问DNSCrypt的服务器也是需要“翻墙”了……有段时间,我依赖SSH+DNSCrypt翻墙。但这套组合拳,最终打在墙上只是手疼,而墙还是泰然自若。
更有甚者,一些二级ISP(不自建主干网,但提供社区宽带接入到主干网服务的ISP)参与了合作,封禁“非常用”的DNS地址。家庭宽带用户,只能选择ISP默认分配的DNS,或者一些“广为人知”的DNS服务器,如Google多年前提供的8.8.8.8(该服务器的IP地址)就是其中之一。“4个8”曾经是大陆网民用来抵御“DNS污染”的缓冲剂,但它使用普通DNS协议,很容易被攻击。社区很快发现,“墙”会选择性地污染8.8.8.8返回的结果。
“DNS污染”、“RST攻击”、“深度数据包检测”——“防火长城”的一套立体防御体系已经建成。从左到右,精准度逐渐加大,防御成本也逐渐加大。这个时候,不管使用什么VPN,最常见的现象是,翻墙几分钟后,网络延迟加大,进而链接被阻断,导致日常工作都不能正常进行。
“进攻是最好的防守”——2015年3月,国家防火墙突然转守为攻。这是一种与“防火长城”(Great Fire Wall,GFW)部署在一起的设备,网友戏称其为“大加农炮”(Great Cannon,GC)。经过3月初的一系列测试,“大炮”从3月中旬开始发动疯狂攻击,其首轮攻击的重点目标之一是GitHub上“greatfire”这个代码仓库。“greatfire”上集结了大量的翻墙工具与资讯,俨然一个巨大的“翻墙军火库”。“大炮”攻击目标的原理简单而有效:它会劫持跨越中国边境的流量,注入恶意脚本,向指定目标发动“DDoS攻击”。

DDoS

DDoS(Distributed Denial of Service,分布式拒绝服务),是一种通过巨大流量导致目标服务器不堪重负而下线的攻击手法。DDoS是一系列方法的统称,他们使用不同的技术,“大炮”所使用的流量劫持并注入恶意脚本的技术是一种比较新的形式。衡量一场DDoS攻击的能量,可以使用“峰值速率”。如2014年6月,香港的公民投票网站“PopVote”受到超过“300Gbps”的攻击,连提供网络支持服务的Google和Amazon都抵挡不住,宣布退出,最终服务商靠着全球网络服务业者联手,才维持“占中”公民投票持续进行。2015年7月,支持加密功能的即时通信软件Telegram受到超过“200Gbps”的攻击,受影响区域很快从东南亚蔓延到全球,导致大量用户无法通信。要知道100Gbps的流量有多大,可以想像同时在线点播两万部高清(720p)视频。也可以参考的一个数据,据CNNIC报告显示,截至2014年底,中国大陆的所有国际出口带宽总和为4100Gbps。
“墙”转守为攻的这一异常举动,是一个明显的信号,希望GitHub删除“有威胁”的代码仓库。最终,在巨大的舆论压力下,“大炮”停止了攻击。在墙的攻防体系中,“大炮”虽然不直接设防,但它对墙外的“反动势力”是一种威慑的的存在——必要的时候,随时可以出击。
墙的招式列表。大炮作为一种威慑的存在,以攻为守。制图:金秋枫
在“墙”的拼命围剿之下,传统翻墙手段逐一失效。原因很简单:主流方法都有特定的模式,逃不过基于机器学习的“深度包检测”技术。机器学习的准确性是随着样本增加而提升的,所以要逃离“墙”的围剿,就得把自己的流量伪装得不一样。海外专业VPN服务Astrill,以及国内的“曲径”、“红杏”等后起之秀,都是通过打造私有协议,来绕过检测。
在这种形势下,开源翻墙利器ShadowSocks被更多的人注意到,基于SS搭建的翻墙服务如雨后春笋一样出现。它的中文名为“影梭”,社区昵称为“SS”——这是一个由中国程序员发起的开源项目,主要开发者在墙内。
2012年4月,SS第一份代码提交;
2013年,SS完成主要开发;
2014年夏开始,由于墙的升级,SS受到社区更多的关注,进入高频升级的阶段;
……
ShadowSocks开发记录。
ShadowSocks提供的其实是一套框架,支持多种加密方式,可以监听不同的端口,只需要很简单的配置,就可以在客户端和跳板机之间建立一条隧道。这些特点,让SS成为“游击队员”们最喜爱的工具。作为一款“非主流”的工具,SS曾经是非常有效的翻墙手段。但从15年初开始,深圳的部分ISP已经部署针对SS的阻断系统——推测是基于同一套“深度包检测”技术。好在SS的参数衆多,随便调整一下,即可生成不同的“肖像”,令“墙”在观测不足的情况下,无法迅速动手。但随着时间推移,“墙”总会搜集到足够的样本。刚开始的时候,选一套SS的参数可以坚持几个星期,到后来,就只有几个小时了。但墙一天不倒,游击战就一天不停。换密码、换加密协议、换端口,如每天吃饭一样,逐渐变得规律。实在不行,就只有换IP了,即再买一个VPS。SS的高级玩家,会加入自己定制的加密模块,使得流量更隐蔽。总之,SS是一个开源项目,玩法多种多样,打游击的优势巨大。

2015年香港:遥看墙内围剿“造梯人”

还有太多重要的事情要做,不能将时间浪费在与“墙”无休止的游击战中——我决定搬回香港。
而墙内,一场密谋已久的围剿,终于显露。
8月20日,ShadowSocks作者在GitHub上关闭了相关项目的Issue面板并清空所有帮助信息,同时GitHub上“shadowsocks”组织的成员信息被隐藏。
8月21日,GoAgent(一款曾经主流的翻墙软件,托管在Google Code)的论坛上传出SS作者“被喝茶”的消息。
8月22日,ShadowSocks作者现身GitHub,证实“喝茶”,并删除了代码库。
8月25日,Google Code转为只读状态,GoAgent论坛散落。
8月25日,GoAgent托管在GitHub上的仓库被删。
8月25日,GitHub受到超过两个小时的DDoS攻击,攻击源目前不明。
8月26日,多处消息源显示,曲径、红杏等大陆多家VPN服务商受到直接或间接的压力,停止服务。
……
以前干掉的是制造和售卖梯子的人,现在连设计梯子的人也要干掉。
未来会如何呢?可以想像,大规模的VPN服务会消失;一些小规模的地下服务,继续运行。另一方面,翻墙工具链,势必会持续升级。公开的成熟项目被封后,社区会衍生出不同变种,以适应“墙”的改变。特别是像SS这样的开放框架,稍作修改,又是一种玩法,无穷无尽。但没了牵头的人,没了集中的论坛,知识传递的形式将会反古。原本,互联网让知识可以扁平传递,现在“屠梯”行动恐将人们逼回“口耳相传”的模式。未来,“翻墙”可能是一种手艺,如何传承,任重道远。

ShadowSocks的翻墙原理

写给非专业人士看的 Shadowsocks 简介http://vc2tea.com/whats-shadowsocks/

ShadowSocks的翻墙原理



为什么ShadowSocks 不能 给Iterm 提供翻墙?

I use ping www.google.com   can't response any info!
Because,  ping 用的是 ICMP 协议,而 proxychains 不支持.
you can use
 curl www.google.com   to test your proxy!

Why?

Because ShadowSock is just for browser, like ssh. It just like a layout for browser. Not for all application in the ma: for example:  Iterm and so on!


Let us to study how to config  Iterm2 Proxy?

I use Mac

First
how to install proxychains-ng

brew install proxychains-ng


Second
vim /usr/local/etc/proxychains.conf


you shoud on the bottom file add this:

socks5 127.0.0.1 1080  just your local proxy

Third:
 you can test your proxychains4  can work?

proxychains4 git pull origin develop




your config is success~

Four
I don't like input proxychains4, it is too long for me.
I use zsh, So you can add  alias
You can :
vim ~/.zshrc

alias pc='proxychains4'

So you can     pc git pull



Five

you can test your Iterm Proxy config use ping www.google.com
Because ping use ICMP,So you can use
curl www.google.com


It is success!





reference:

http://www.w3ccafe.com/590.html

Thanks to:

http://www.dreamxu.com/proxychains-ng/

http://yanghui.name/blog/2015/07/19/make-all-command-through-proxy/

Fiddler introduce


Fiddler 教程

http://blog.csdn.net/ohmygirl/article/details/17846199




1  图解Fiddler如何抓手机APP数据包【超详细】





Http and https 区别?

Monday, January 25, 2016

What is iml file in the android studio?

What are iml files in Android Studio project?

Let's me see the iml file:


<?xml version="1.0" encoding="UTF-8"?><module external.linked.project.id="MSERentAgent" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">  <component name="FacetManager">    <facet type="java-gradle" name="Java-Gradle">      <configuration>        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />        <option name="BUILDABLE" value="false" />      </configuration>    </facet>  </component>  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="true">    <exclude-output />    <content url="file://$MODULE_DIR$">      <excludeFolder url="file://$MODULE_DIR$/.gradle" />    </content>    <orderEntry type="jdk" jdkName="Android API 17 Platform" jdkType="Android SDK" />    <orderEntry type="sourceFolder" forTests="false" />  </component></module>


IML is a module file created by IntelliJ IDEA, an IDE used to develop Java applications. It stores information about a development module, which may be a Java, Plugin, Android, or Maven component; saves the module paths, dependencies, and other settings.

why not to use gradle scripts to integrate with external modules that you add to your project.
You do "use gradle scripts to integrate with external modules", or your own modules.

However, Gradle is not IntelliJ IDEA's native project model — that is separate, held in .iml files and the metadata in .idea/ directories. In Android Studio, that stuff is largely generated out of the Gradle build scripts, which is why you are sometimes prompted to "sync project with Gradle files" when you change files like build.gradle. This is also why you don't bother putting .iml files or .idea/ in version control, as their contents will be regenerated.

If I have a team that work in different IDE's like Eclipse and AS how to make project IDE agnostic?
To a large extent, you can't.

You are welcome to have an Android project that uses the Eclipse-style directory structure (e.g., resources and manifest in the project root directory). You can teach Gradle, via build.gradle, how to find files in that structure. However, other metadata (compileSdkVersion, dependencies, etc.) will not be nearly as easily replicated.

Other alternatives include:

Move everybody over to another build system, like Maven, that is equally integrated (or not, depending upon your perspective) to both Eclipse and Android Studio

Hope that Andmore takes off soon, so that perhaps you can have an Eclipse IDE that can build Android projects from Gradle build scripts


Have everyone use one IDE



refence:

http://stackoverflow.com/questions/30737082/what-are-iml-files-in-android-studio

you have JVM property "https.proxyHost" set to 127.0.0.1". This may lead to incorrect behaviour, Proxy should be set in Setting

INFO - ntellij.util.proxy.CommonProxy - <html>You have JVM property "https.proxyHost" set to "127.0.0.1".<br>This may lead to incorrect behaviour. Proxy should be set in Settings | HTTP Proxy<br>This JVM property is old and its usage is not recommended by Oracle.<br>(Note: It could have been assigned by some code dynamically.)








I have run into a similar problem on Mac.

Looking at the log under Help -> Show logs in Finder I found the following entry.

You have JVM property "https.proxyHost" set to "127.0.0.1".
This may lead to incorrect behaviour. Proxy should be set in Settings | HTTP Proxy
This JVM property is old and its usage is not recommended by Oracle.
(Note: It could have been assigned by some code dynamically.)


How to use resolve it?

You just restart your PC. It works for me!


if  you have some question, you can ask me.


references:






Sunday, January 24, 2016

Android studio 2.0 preview 7 的坑

今天遇到几个问题,

1  Gradle sync failed: Another refresh project task is currently running for the project:  /Users/Hades/Work/MSEGit/mse/MSERentAgent
         Consult IDE log for more details (Help | Show Log)



2  INFO - ntellij.util.proxy.CommonProxy - <html>You have JVM property "https.proxyHost" set to "127.0.0.1".<br>This may lead to incorrect behaviour. Proxy should be set in Settings | HTTP Proxy<br>This JVM property is old and its usage is not recommended by Oracle.<br>(Note: It could have been assigned by some code dynamically.)





 I can't resolve this question. If you just for fun, you can use the new android studio tool.
if  you work for a group, I recomand you use the stable version.

Saturday, January 23, 2016

Ubuntu Please install the openssl library (with development headers)

when i use make menuconfig

show error info:
Ubuntu Please install the openssl library (with development headers)

in the terminal:

Ubuntu 

sudo apt-get install libssl-dev

it works for me!

Ubuntu please install a static zlib. (missing libz.a or zlib.h)


in the terminal:

apt-get install zlib1g-dev

如何安装Buntu?

安装Ubuntu 的教程,有很多,但是有的时候你按照教程一步一步的做了,但是还是不成功,你知道为什么吗?


原因:

我们应该插上网线,再去安装!

Friday, January 22, 2016

如何给Android studio 设置代理?

用了这么久,今天才知道如何给Android studio 设置代理。我他妈的也是醉了,感觉还不错的奥!哈哈

为什么要用代理

如今android studio越来越流行,很多的android程序猿都开始转入anroid studio的大本营。但是GFW的封锁成为很多人的困扰,eg:无法更新sdk,无法使用如下方式添加类库:
compile 'com.android.support:support-v4:23.0.0'
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.android.support:design:23.0.0'
翻墙软件有很多,我使用的是shadowsocks,选择Shadowsocks.com 普通版 ¥99.00CNY 年付。对于搞android开发的,我觉得这个很有必要而且价格也不是很贵。

如何设置代理

下面,开始讲如何设置android studio的shadowsocks代理:
File-->Settings... 按照下图配置
  1. 设置自动代理
    This will attempt to user your system settings and is useful if your system uses a proxy autoconfiguratioin file(.pac) 
    • 勾选 Auto-detect proxy settings后android studio会自动走你操作系统设置的代理。
    • 勾选Automatic proxy configuration URL并设置本地pac文件

    Image 2.png
  2. 设置手动代理
    由于ShadowSocks是socks方式所以需要按照下图的方式配置

    settings
    点击ok后会在项目根目录的gradle.properties文件中生成如下代码:
    systemProp.http.proxyHost=127.0.0.1
    systemProp.http.proxyPort=1080
    到此,就配置完毕了。



http://www.jianshu.com/p/5fa894881667

屌丝程序员必备的 PS 神器


该如何破解呢?

http://www.superqq.com/blog/2015/10/20/mac-adobe-photoshop-crack/

Android Git 项目的规范教程

1  Git 规范

1 克隆仓库
git clone git@IP:路径/gitname.git

2 第二步:需要更新仓库的信息
git pull

3 第三步: 创建自己的分支

git branch release
git branch dev

release  发布的版本
dev        开发版本

具体的项目,加载release之后 
例如:
git branch releaseMSE

为了避免冲突的发生,我们应该定义这样的命名模式:

研发版本(release/dev)+项目名称(简称)+开发者的信息(自己的英文名字)

当我们开发完成自己的功能之后,就merge 到 devMSE 的版本,
测试如果没有问题,就merge 到 releaseMSE!

确保代码的稳定性!














Thursday, January 21, 2016

史上最快在VPS搭载git 服务教程


in the VPS

1   useradd git

2   passwd git

3   cd /home/git

git  init --bare  test.git

4   cd /home/git
   chmod 777 git -R

5   in the local PC

 git clone git@IP:/home/gitA/hades.git

the working copy is locked due to a previous error cornerstone




Question:

the working copy is locked due to a previous error cornerstone





http://stackoverflow.com/questions/24028986/svn-cornerstone-error-can-not-commit-file

Tuesday, January 19, 2016

程序员必读的书单


个人喜欢的书单,看过的感觉很不错的推荐给大家:

1  《Refactoring》  《重构》
     Martin 大神写的,需要一定的代码量

2  《大话设计模式》  程杰
    面向对象的经典书籍,如果,你想在面向对象的路上走下去,就不用高级语言,写面向过程的代码!在这里是你对面向对象有更深的认识,提高自己的设计思维,提高自己的代码质量!

3  《代码简洁之道》
    很不错的书,交给你怎么样写出最简洁的代码,避免代码重复,代码重复是万恶之源!


我的书单



修改代码的艺术:
http://world.taobao.com/item/40767723606.htm?spm=a312a.7700714.0.0.8C3gZD#detail




深入浅出 设计模式
http://world.taobao.com/item/523887777506.htm?spm=a312a.7700714.0.0.FcUcMH#detail



Error:Execution failed for task ':app:createAnzhiDebugMainDexClassList'. > com.android.ide.common.internal.LoggedErrorException: Failed to run command: java -Xmx1024M -cp

Android studio  gradle  run the program

erro info:

Error:Execution failed for task ':app:createAnzhiDebugMainDexClassList'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
  java -Xmx1024M -cp /Users/Hades/Library/Android/sdk/build-tools/21.1.2/lib/dx.jar com.android.multidex.ClassReferenceListBuilder /Users/Hades/Work/Code/RentAgentNew/RentAgent/app/build/intermediates/multi-dex/anzhi/debug/componentClasses.jar /Users/Hades/Work/Code/RentAgentNew/RentAgent/app/build/intermediates/multi-dex/anzhi/debug/allclasses.jar
  Error Code:
  1
  Output:
  Unable to locate a Java Runtime to invoke.


Resolve Method:

you can in the gradle command line input this command:

Mac
./gradlew --stop

Windows
gradle --stop
or
gradlew --stop

It works for me!

Monday, January 18, 2016

我的好友

         我的朋友,是的曾经的好朋友,现在似乎请她吃一顿饭,似乎都不是这么简单的事情。方方土,我们曾近 一块的度过了大一的时光。今天知道她来北京了,我想请她吃顿饭。本来很简单的事情。我不知道,为什么她会怎么想呢?不知道。为什么的他的生活就是这样紫的。她觉得我也许是坏人吧,毕竟我们已经很长时间不见了。但是,我真的喜欢的人,并不是很多的,为什么,很多人并不会像     假如人生只如初见!这真的不容易呀!更多的时候,我们需要考虑的事情,需要更多的。时间,真的 会让两个人便的陌生,就算是我的女神,千秋,长时间的不见,每个人的价值观,人生观也是不同的,我们的也是变得不一样了!

   也会是,我们不是同一个社会的人,不同的圈子。正如,翟哥一样,加入,当初 一个你追的人,超喜欢的,但是,现在的我,

Thursday, January 14, 2016

Android studio src/ 下面的路径的含义?

Source directories

To build each version of your app, the build system combines source code and resources from:
  • src/main/ - the main source directory (the default configuration common to all variants)
  • src/<buildType>/ - the source directory
  • src/<productFlavor>/ - the source directory
Note: The build type and product flavor source directories are optional, as Android Studio does not create these directories for you. You should create these directories as you add build types and product flavors to the build configuration files. The build system does not use these directories if they are not present.
For projects that do not define any flavors, the build system uses the defaultConfig settings, the main app directory and the default build type directories. For example, to generate the default debug and release build variants in projects with no product flavors, the build system uses:
  • src/main/ (default configuration)
  • src/release/ (build type)
  • src/debug/ (build type)
For projects that define a set of product flavors, the build system merges the build type, product flavor and main source directories. For example, to generate the full-debug build variant, the build system merges the build type, product flavor and main directories:
  • src/main/ (default configuration)
  • src/debug/ (build type)
  • src/full/ (flavor)
For projects that use flavor dimensions, the build system merges one flavor source directory per dimension. For example, to generate the arm-demo-release build variant, the build system merges:
  • src/main/ (default configuration)
  • src/release/ (build type)
  • src/demo/ (flavor - app type dimension)
  • src/arm/ (flavor - ABI dimension)
The source code from these directories is used together to generate the output for a build variant. You can have classes with the same name in different directories as long as those directories are not used together in the same variant. 
The build system also merges all the manifests into a single manifest, so each build variant can define different components or permissions in the final manifest. The manifest merge priority from lowest to highest is libraries/dependencies -> main src -> productFlavor -> buildType. 
The build system merges all the resources from the all the source directories. If different folders contain resources with the same name for a build variant, the priority order is the following: build type resources override those from the product flavor, which override the resources in the main source directory, which override those in any libraries.
Note: Build variants enable you to reuse common activities, application logic, and resources across different versions of your app.


Tuesday, January 12, 2016

Gitolite+Gitweb配置实现Git权限管理教程

Git是一个什么东西我就不介绍了,下文介绍的主要是说Git权限的一个管理工具配置了,有兴趣的和小编来学学吧。
Xdesc

文章中使用的server,指的是的服务器端的公网ip。
/mnt是我的阿里云外挂盘,新建用户不指定目标位置,会自动在/home下生成。
Gitolite配置
1、在指定目录/mnt/git下建立一个git的用户并给用户git设置密码。(服务器端-用户:root)
useradd -d /mnt/git -s /bin/bash git
passwd git
测试是否建立成功,如果通过ssh连接成功即证明用户已经建立成功。
ssh git@server
2、clone gitolite(服务器端-用户:git)
// 切换到git用户
su git
// 切换到git根目录
cd
// clone gitolite
git clone https://github.com/sitaramc/gitolite.git
成功后会在根目录看到一个gitolites的目录。
3、客户端生成秘钥(客户端)
ssh-keygen
会在你登录的用户的目录下找到.ssh目录,我的目录是C:\Users\new\.ssh,复制id_rsa.pub到d盘根目录。
通过ssh上传id_rsa.pub,并重命名为admin.pub。
// 切换到d盘目录执行
scp id_rsa.pub git@server:admin.pub
执行完成后,切换到服务器端可以在git用户的根目录下找到admin.pub
4、开始安装gitolite (服务器端-用户:git),所有操作都是在git的根目录。
注意点:
进入.ssh目录,如果有authorized_keys,删除即可。
// 新建bin目录
mkdir bin
// 安装gitolite,默认会安装到bin,如果想安装到你自己之的指定的目录请参考官方安装 -to
gitolite/install -ln
// 配置秘钥
bin/gitolite setup -pk admin.pub
测试是否执行成功
首先git根目录下是否生成了projects.list和repositories
同时可以进入.ssh,可以看到新生成的authorized_keys,以后每一次提交新用户都会写到这个里边。判断是否用户添加成功,看这个里边文件是否新增了那个用户的key即可。
5、客户端clone gitolite-admin(客户端)
// 结尾不需要加.git
git clone git@server:gitolite-admin
6、添加新用户(客户端)
修改gitolite-admin/conf/gitolite.conf
@developer = weiwei1628 mac
repo gitolite-admin
RW+ = weiwei1628 mac
repo testing
RW+ = @all
repo anhei
RW+ = @developer
将新用户的key都放到keydir
push到服务器即可,查看是否成功,去服务器进入git用户,查看.ssh/authorized_keys,里边会多了新的key。
Gitweb配置
1、安装(服务器端-用户:root)
yum install gitweb
2、配置(服务器端-用户:root)
/etc/gitweb.conf
$projectroot = "/home/git/repositories/";
3、重启httpd(服务器端-用户:root)
service httpd restart
即可看到gitweb的网站,但是会出现404找不到项目的情况。
这个问题是权限问题,查不不少资料,也遇到不少坑。
最终的解决方案:
首先要修改/home/git/.gitolite.rc中的UMASK,将0007修改为0027。
修改git及其根目录的读写权限为 755。
// 切换到root,在root根目录执行
chmod -R 755 /mnt/git
网上有配置方法,但是gitweb是找到项目了。但是客户端有clone不下文件了。提示秘钥没权限
chmod g+r /mnt/git/projects.list

chmod -R g+rx /mnt/git/repositoriesGitolite+Gitweb配置实现Git权限管理教程
分享代码开始




How to make up yourself git repo in your VPS?


In a world:
A   you should in your VPS you add gitUser


Log into your VPS, and gain root*:

su -

*Some people feel uncomfortable using root in this manner. If your VPS is set up to use sudo, then do so.

Add the Unix user (not necessarily Git user names) to handle the repositories:

useradd git

Then give your Git user a password:

passwd git


B  Then you  should in the /home/git  in yout VPS

   create your git repo
  you can input this command:

   git  init --bare  test.git


C  in yout local PC

     you just  create ssh, and you need send the id_rsa.pub key send to admin manager!

    Then
    you create the directory, where you want to create git repo:

     git clone git@IP:/home/gitA/hades.git

    MayBe you need meet this quesiton:  in the terminal command:
    Permission denied, please try again?

  Why?  because your  VPS git user directory remote user have no permission

  you just use this command :

   cd /home/git
   chmod 777 git -R

   It works for me!

D  Now, you will meet this question you always should input  password when you git pull or push!
   Why ?

I have set id_rsa.pub to the .ssh/authorized_keys
But it doesn't work for me? why?

  
E  how to control many people?
How To Use Gitolite to Control Access to a Git Server on an Ubuntu 12.04 VPS


F  How to look your VPS version  system info?


   cat /etc/issu


========================================================================

Question:
1 when you use this command line
  git clone git@IP:home/git/hadesgit.git

error info:
git clone git@103.21.140.1:/repo/test.git
Cloning into 'test'…
fatal: '/repo/test.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

一般是因为你的路径填写的有问题,所以需要做的就填写对的路径
git clone git@Ip:/home/git/hadesgit.git


========================================================================

2  当你的VPS 配置的端口,有可能你把常用的端口给禁掉了,并不是
     22 端口的时候

如果你的git服务端改了非默认端口,那么客户端指定端口连接有以下两种办法:

--------------------------------------------------------------------------------------
方法一:(仅linux系有效) 做ssh端口映射

编辑 ~/.ssh/config

host example.com
port 6789


 .git/config里的地址
url = git @example.com:test.git

当进行远程访问的时候,ssh连接会将example.com的端口指向6789


========================================================================

3  error: insufficient permission for adding an object to repository database ./objects


========================================================================

4  Permission denied, please try again?


5  you how to config git config file?

    git config --global user.name "Your Name"
    git config --global user.email you@example.com



============================================================================
Reference Links:
1 if you meet git clone git@45.78.17.86:home/git/hadesgit.git
http://yikebocai.com/2013/11/build-private-git-server/

2  How to set git repo in the VPS ?
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-private-git-server-on-a-vps

http://intermarketing.merkados.com/setup-a-git-repository-in-your-vps


3  按照这个流程基本能走通。已测试~
还是看中文的舒服,我也是罪恶了!
http://www.alliedjeep.com/8481.htm




============================================================================

Reference:

https://www.digitalocean.com/community/tutorials/how-to-set-up-a-private-git-server-on-a-vps







Thursday, January 7, 2016

Java 1.6 注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Assignment {
    String assignee();
    int effort();
    double finished() default 0;



@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型。可以通过default来声明参数的默认值。在这里可以看到@Retention和@Target这样的元注解,用来声明注解本身的行为。@Retention用来声明注解的保留策略,有CLASS、RUNTIME和SOURCE这三种,分别表示注解保存在类文件、JVM运行时刻和源代码中。只有当声明为RUNTIME的时候,才能够在运行时刻通过反射API来获取到注解的信息。@Target用来声明注解可以被添加在哪些类型的元素上,如类型、方法和域等。







refencnce










Wednesday, January 6, 2016

Mac 反编译工具汇总


不想说太多,自己玩!


第一名: JADX   屌屌的

https://github.com/GeekHades/jadx

Java JDK1.5、1.6、1.7新特性整理

一、Java JDK1.5的新特性

 1.泛型:

  

List<String> strs = new ArrayList<String>();//给集合指定存入类型,上面这个集合在存入数据的时候必须存入String类型的数据,否则编译器会报错
 2.for-each

  

例如上面这个集合我们可以通过for-each遍历,这样更加简单清晰
    for(String s : strs){
     System.out.println(s);
    }
    注意:使用for-each遍历集合时,要遍历的集合必须实现了Iterator接口
 3.自动拆箱和装箱功能

  

复制代码
什么意思呢?
    JDK1.5为每一个基本数据类型定义了一个封装类。使java中的基本数据类型也有自己的对象
    例如:int -->Integer,
    double --> Double,
    long --> Long,
    char --> Character,
    float --> Float,
    boolean --> Boolean,
    short --> Short,
    byte -- > Byte
    自动装包:将基本类型转换成为对象,例如:int --> Integer
    自动拆包:将对象转换成为基本数据类型,例如:Integer --> int
    对于JDK1.5之前集合总不能存放基本数据类型的问题,现在也能够解决。
复制代码
4.枚举:

  

枚举是JDK1.5推出的一个比较中要的特性。其关键字为enum
    例如:定义代表交通灯的枚举
    public enum MyEnum{
        RED,GREEN,YELLOW
    }
5.可变参数

复制代码
什么意思呢?先举个例子:在JDK1.5以前,当我们要为一个方法传递多个类型相同的参数时,我们有两种方法解决,1.直接传递一个数组过去,2.有多少个参数就传递多少个参数。
    例如:
    public void printColor(String red,String green,String yellow){

    }
    或者
    public void printColor(String[] colors){

    }
    这样编写方法参数虽然能够实现我们想要的效果,但是,这样是不是有点麻烦呢?再者,如果参数个数不确定,我们怎么办呢?Java JDK1.5为我们提供的可变参数就能够完美的解决这个问题
    例如:
    public void printColor(String... colors){

    }
    可以这样定义,什么意思呢?如果参数的类型相同,那么可以使用“类型+三个点,后面跟一个参数名称”的形式。这样的好处就是,只要参数类型相同,无论传递几个参数都没有限制
    注意:可变参数必须是参数列表的最后一项(该特性对对象和基本数据类型都适用)
复制代码
6.静态导入

优点:使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
    缺点:过度使用会降低代码的可读性
7.线程并发库

复制代码
线程并发库是Java1.5提出的关于多线程处理的高级功能,所在包:java.util.concurrent
    包括
    1.线程互斥
        工具类描述:Lock,RedWriteLock
    2.线程通信
        描述:Condition
    3.线程池
        ExecutorService
    3.同步队列
        ArrayBlockingQueue
    4.同步集合
        ConcurrentHashMap,CopyOnWriteArrayList
    5.线程同步工具
        Semaphore

    关于线程并发库的内容还有很多(很重要),这里就不一一列举了,感兴趣的朋友可以查看一下帮助文档。
复制代码


二、JDK1.6新特性

1.Desktop类和SystemTray类

前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),
    用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序。
2.使用JAXB2来实现对象与XML之间的映射

复制代码
JAXB是Java Architecture for XML Binding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。
      我们把对象与关系数据库之间的映射称为ORM,其实也可以把对象与XML之间的映射称为OXM(Object XML Mapping)。原来JAXB是Java EE的一部分,在JDK1.6中,
    SUN将其放到了Java SE中,这也是SUN的一贯做法。JDK1.6中自带的这个JAXB版本是2.0,比起1.0(JSR 31)来,JAXB2(JSR 222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,
    这就极大简化了开发的工作量。实际上,在Java EE 5.0中,EJB和Web Services也通过Annotation来简化开发工作。另外,JAXB2在底层是用StAX(JSR 173)来处理XML文档。
    除了JAXB之外,我们还可以通过XMLBeans和Castor等来实现同样的功能。
复制代码
3..理解StAX

复制代码
StAX(JSR 173)是JDK1.6.0中除了DOM和SAX之外的又一种处理XML文档的API。
      StAX 的来历:在JAXP1.3(JSR 206)有两种处理XML文档的方法:DOM(Document Object Model)和SAX(Simple API for XML)。
      由于JDK1.6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都会用到StAX所以Sun决定把StAX加入到JAXP家族当中来,
    并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版本)。
    JDK1.6里面JAXP的版本就是1.4。StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程
    ,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;
      SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,        这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。
复制代码
4.使用Compiler API

现在我 们可以用JDK1.6 的Compiler API(JSR 199)去动态编译Java源文件,Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征。
      这个特性对于某些需要用到动态编译的应用程序相当有用,比如JSP Web Server,当我们手动修改JSP后,是不希望需要重启Web Server才可以看到效果的,这时候我们就可以用Compiler        API来实现动态编译JSP文件,当然,现在的JSP Web Server也是支持JSP热部署的,现在的JSP Web Server通过在运行期间通过Runtime.exec或ProcessBuilder来调用javac来编译代码,这        种方式需要我们产生另一个进程去做编译工作,不够优雅而且容易使代码依赖与特定的操作系统;Compiler API通过一套易用的标准的API提供了更加丰富的方式去做动态编译,而且是跨平        台的。
5.轻量级Http Server API

JDK1.6 提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server API来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给HttpHandler实现类的回调方法。
6.插入式注解处理API(Pluggable Annotation Processing API)

复制代码
插入式注解处理API(JSR 269)提供一套标准API来处理Annotations(JSR 175)
      实际上JSR 269不仅仅用来处理Annotation,我觉得更强大的功能是它建立了Java 语言本身的一个模型,它把method,package,constructor,type,variable, enum,annotation等Java语言元素映射为Types和Elements(两者有什么区别?),从而将Java语言的语义映射成为对象,我们可以在javax.lang.model包下面可以看到这些类。 所以我们可以利用JSR 269提供的API来构建一个功能丰富的元编程(metaprogramming)环境。JSR 269用Annotation Processor在编译期间而不是运行期间处理Annotation,Annotation Processor相当于编译器的一个插件,所以称为插入式注解处理.如果Annotation Processor处理Annotation时(执行process方法)产生了新的Java代码,编译器会再调用一次Annotation Processor,如果第二次处理还有新代码产生,就会接着调用Annotation Processor,直到没有新代码产生为止.每执行一次process()方法被称为一个"round",这样整个Annotation processing过程可以看作是一个round的序列。
      JSR 269主要被设计成为针对Tools或者容器的API. 举个例子,我们想建立一套基于Annotation的单元测试框架(如TestNG),在测试类里面用Annotation来标识测试期间需要执行的测试方法
复制代码
7.用Console开发控制台程序

JDK1.6中提供了java.io.Console 类专用来访问基于字符的控制台设备。你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳。但我们不总是能得到可用的Console,一个JVM是否有可用的Console依赖于底层平台和JVM如何被调用。如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实例。
8.对脚本语言的支持

如: ruby,groovy,javascript。
9..Common Annotations

复制代码
Common annotations原本是Java EE 5.0(JSR 244)规范的一部分,现在SUN把它的一部分放到了Java SE 6.0中。
      随着Annotation元数据功能(JSR 175)加入到Java SE 5.0里面,很多Java 技术(比如EJB,Web Services)都会用Annotation部分代替XML文件来配置运行参数(或者说是支持声明式编程,如EJB的声明式事务),如果这些技术为通用目的都单独定义了自己的otations,显然有点重复建设,所以,为其他相关的Java技术定义一套公共的Annotation是有价值的,可以避免重复建设的同时,也保证Java SE和Java EE 各种技术的一致性。
      下面列举出Common Annotations 1.0里面的10个Annotations Common Annotations Annotation Retention Target Description Generated SourceANNOTATION_TYPE,CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE 用于标注生成的源代码Resource Runtime TYPE,METHOD,FIELD用于标注所依赖的资源,容器据此注入外部资源依赖,有基于字段的注入和基于setter方法的注入两种方式 Resources Runtime TYPE同时标注多个外部依赖,容器会把所有这些外部依赖注入PostConstructRuntime METHOD标注当容器注入所有依赖之后运行的方法,用来进行依赖注入后的初始化工作,只有一个方法可以标注为PostConstruct PreDestroy Runtime METHOD当对象实例将要被从容器当中删掉之前,要执行的回调方法要标注为PreDestroy RunAs Runtime TYPE用于标注用什么安全角色来执行被标注类的方法,这个安全角色必须和Container的Security角色一致的。RolesAllowed Runtime TYPE,METHOD用于标注允许执行被标注类或方法的安全角色,这个安全角色必须和Container的Security角色一致的 PermitAll Runtime TYPE,METHOD允许所有角色执行被标注的类或方法DenyAll Runtime TYPE,METHOD不允许任何角色执行被标注的类或方法,表明该类或方法不能在Java EE容器里面运行DeclareRoles Runtime TYPE用来定义可以被应用程序检验的安全角色,通常用isUserInRole来检验安全角色。
      注意:
      1.RolesAllowed,PermitAll,DenyAll不能同时应用到一个类或方法上标注在方法上的RolesAllowed,PermitAll,DenyAll会覆盖标注在类上的    RolesAllowed,PermitAll,DenyAllRunAs,RolesAllowed,PermitAll,DenyAll和DeclareRoles还没有加到Java SE 6.0上来 处理以上Annotations的工作是由Java EE容器来做,Java SE6.0只是包含了上面表格的前五种Annotations的定义类,并没有包含处理这些Annotations的引擎,这个工作可以由Pluggable Annotation Processing API(JSR 269)来做。
复制代码


相对于1.6的新特性,1.7的新特性更加令我们心动,因为它是我们期待已久的而且看得见摸得着的。

三、JDK1.7的新特性

1.二进制面值

在java7里,整形(byte,short,int,long)类型的值可以用二进制类型来表示了,在使用二进制的值时,需要在前面加上ob或oB,例如:
    int a =0b01111_00000_11111_00000_10101_01010_10;
    short b = (short)0b01100_00000_11111_0;
    byte c = (byte)0B0000_0001;
2.数字变量对下滑线的支持

复制代码
JDK1.7可以在数值类型的变量里添加下滑线。
    但是有几个地方是不能添加的
    1.数字的开头和结尾
    2.小数点前后
    3. F或者L前
    例如:
    int num = 1234_5678_9;
    float num2 = 222_33F;
    long num3 = 123_000_111L;
复制代码
3.switch对String的支持

复制代码
之前就一直有一个打问号?为什么C#可以Java却不行呢?哈,不过还有JDK1.7以后Java也可以了
    例如:
    String status = "orderState";    
    switch (status) {  
        case "ordercancel":  
            System.out.println("订单取消");  
            break;  
        case "orderSuccess":  
            System.out.println("预订成功");  
            break;  
        default:  
            System.out.println("状态未知");  
    }  
复制代码
4.try-with-resource

复制代码
try-with-resources 是一个定义了一个或多个资源的try 声明,这个资源是指程序处理完它之后需要关闭它的对象。try-with-resources 确保每一个资源在处理完成后都会被关闭。
    可以使用try-with-resources的资源有:
    任何实现了java.lang.AutoCloseable 接口java.io.Closeable 接口的对象。
    例如:
    public static String readFirstLineFromFile(String path) throws IOException {  

        try (BufferedReader br = new BufferedReader(new FileReader(path))) {  
            return br.readLine();  
        }  
    }  
     在java 7 以及以后的版本里,BufferedReader实现了java.lang.AutoCloseable接口。
    由于BufferedReader定义在try-with-resources 声明里,无论try语句正常还是异常的结束,
    它都会自动的关掉。而在java7以前,你需要使用finally块来关掉这个对象。
复制代码
5.捕获多种异常并用改进后的类型检查来重新抛出异常

复制代码
 例如:
 public static void first(){  
 try {  
   BufferedReader reader = new BufferedReader(new FileReader(""));  
   Connection con = null;  
   Statement stmt = con.createStatement();  
  } catch (IOException | SQLException e) {  
    //捕获多个异常,e就是final类型的  
    e.printStackTrace();  
    }  
 }
 优点:用一个catch处理多个异常,比用多个catch每个处理一个异常生成的字节码要更小更高效。
复制代码
6..创建泛型时类型推断

复制代码
只要编译器可以从上下文中推断出类型参数,你就可以用一对空着的尖括号<>来代替泛型参数。这对括号私下被称为菱形(diamond)。 在Java SE 7之前,你声明泛型对象时要这样
    List<String> list = new ArrayList<String>();
    而在Java SE7以后,你可以这样
    List<String> list = new ArrayList<>();
    因为编译器可以从前面(List)推断出推断出类型参数,所以后面的ArrayList之后可以不用写泛型参数了,只用一对空着的尖括号就行。当然,你必须带着”菱形”<>,否则会有警告的。
    Java SE7 只支持有限的类型推断:只有构造器的参数化类型在上下文中被显著的声明了,你才可以使用类型推断,否则不行。
    List<String> list = new ArrayList<>();
    list.add("A");
    //这个不行
    list.addAll(new ArrayList<>());
    // 这个可以
    List<? extends String> list2 = new ArrayList<>();
    list.addAll(list2);
复制代码
7.全新的集合声明以及获取集合中的值的方式

复制代码
JDK1.7以前声明集合的方式
        List<String> strs  = new ArrayList<String>();
        Map<String,String> map = new HashMap<String,String>();
        strs.add("abc");
        strs.get(index);
        map.put("key","全新集合");
        map.get(key);
    JDK1.7以后
    List<String> list = [item1,item2,item3];
    String item1 = list[0];
    String item2 = list[1];
    String item3 = list[2];
    Map<String,String> map = {key:value,key:value}
    String mapValue = map[key];
    这样的定义是不是非常方便?肯定的!(有点象JSON)呵呵
复制代码
8.新增一些取环境信息的工具方法

例如:
    File System.getUserHomeDir() // 当前用户目录
    File System.getUserDir() // 启动java进程时所在的目录5
    File System.getJavaIoTempDir() // IO临时文件夹
    File System.getJavaHomeDir() // JRE的安装目录
9.安全的加减乘除

复制代码
例如:
    int Math.safeToInt(long value)
    int Math.safeNegate(int value)
    long Math.safeSubtract(long value1, int value2)
    long Math.safeSubtract(long value1, long value2)
    int Math.safeMultiply(int value1, int value2)
    long Math.safeMultiply(long value1, int value2)
    long Math.safeMultiply(long value1, long value2)
    long Math.safeNegate(long value)
    int Math.safeAdd(int value1, int value2)
    long Math.safeAdd(long value1, int value2)
    long Math.safeAdd(long value1, long value2)
    int Math.safeSubtract(int value1, int value2)
复制代码




转载:

http://www.cnblogs.com/tony-yang-flutter/p/3503935.html