一切福田,不離方寸,從心而覓,感無不通。

Incorrect string value: '\xF0\x90\x8D\x83…' for column… Emoji表情字符过滤的Java实现

Emoji表情字符现在在APP已经广泛支持了。但是Mysql的UTF8编码对Emoji字符的支持却不是那么好。所以我们经常会遇到这样的异常: Incorrect string value: '\xF0\x90\x8D\x83…' for column 原因是Mysql里UTF8编码最多只能支持3个字节,而Emoji表情字符使用的UTF8编码,很多都是4个字节,有些甚至是6个字节。 解决的方案有两种: 1.使用utf8mb4的mysql编码来容纳这些字符。 2.过滤掉这些特殊的表情字符。 关于第一种解决方法,请参考:http://segmentfault.com/a/1190000000616820 和 http://info.michael-simons.eu/2013/01/21/java-mysql-and-multi-byte-utf-8-support/ 有大量细节需要注意,例如:mysql版本,mysql的配置,mysql connector的版本等等。。 因为我们使用的云数据库,所以我选择了过滤这些特殊字符。其实过滤的方式很简单,直接使用正则表达式匹配编码范围,然后替换就行了。 下面是我的代码。 更多可以参考:http://stackoverflow.com/questions/27820971/why-a-surrogate-java-regexp-finds-hypen-minus import org.apache.commons.lang3.StringUtils; public class EmojiFilterUtils { /**      * 将emoji表情替换成*      *       * @param source      * @return 过滤后的字符串      */ public static String filterEmoji(String source) { if(StringUtils.isNotBlank(source)){ return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*");         }else{ return source;         }     } public static void main(String[] arg ){ try{             String text = "This is a smiley \uD83C\uDFA6 face\uD860\uDD5D \uD860\uDE07 \uD860\uDEE2 \uD863\uDCCA \uD863\uDCCD \uD863\uDCD2 \uD867\uDD98 ";             System.out.println(text);             System.out.println(text.length());             System.out.println(text.replaceAll("[\\ud83c\\udc00-\\ud83c\\udfff]|[\\ud83d\\udc00-\\ud83d\\udfff]|[\\u2600-\\u27ff]", "*"));             System.out.println(filterEmoji(text));         }catch (Exception ex){             ex.printStackTrace();         }     } } from:http://blog.csdn.net/shootyou/article/details/44852639

龙生   27 Jul 2016
View Details

&nbsp|&quot|&amp|&lt|&gt等html字符转义

No. 文字表記 10進表記 16進表記 文字 Comment 001 &quot; &#34; &#x22; """ quotation mark = APL quote 002 &amp; &#38; &#x26; "&" ampersand 003 &lt; &#60; &#x3C; "<" less-than sign 004 &gt; &#62; &#x3E; ">" greater-than sign 005 &nbsp; &#160; &#xA0; " " no-break space = non-breaking space   iSO 8859-1 characters char glyph HTML tag &nbsp; ¡ &iexcl; ¢ &cent; £ &pound; ¤ &curren; ¥ &yen; ¦ &brvbar; § &sect; ¨ &uml; © &copy; ª &ordf; « &laquo; ¬ &not; &shy; ® &reg; ¯ &macr; ° &deg; ± &plusmn; […]

龙生   26 Jul 2016
View Details

用node.js进行微信公众平台的开发

基本原理 用nodejs怎样来实现对微信公众平台的开发呢? 别的就不多说了,先来简单介绍微信公众平台的基本原理。 微信服务器就相当于一个转发服务器,终端(手机、Pad等)发起请求至微信服务器,微信服务器,然后将请求转发给自定义服务(这里就是我们的具体实现)。服务处理完毕,然后转发给微信服务器,微信服务器再将具体响应回复到终端;通信协议为:HTTP;数据格式为:XML。   具体的流程如下图所示: 其实,我们需要做的事情,就是对HTTP请求,做出响应。具体的请求内容,我们按照特定的XML格式去解析,处理完毕后,也要按照特定的XML格式返回。 平台注册 要想完成对微信公众平台的开发,我们需要注册一个微信公众平台帐号。注册步骤如下:   打开微信公共平台的官网,https://mp.weixin.qq.com/,点击“立即注册”。 然后根据提示,填写基本信息,邮箱激活,选择类型,信息登记,公众号信息,完成注册。 在注册完成以后,我们要对公众号进行一些基本的设置。登录公众号,找到【公众号设置】,然后设置头像以及其它信息。 nodejs环境搭建 我们需要在公网上找一台服务器,以便可以启动我们的nodejs的环境,启动环境后通过设置访问地址,我们就可以接收微信服务器发送的消息了,并且我们也可以向微信服务器发送消息了。 在公网的服务器中安装完成nodejs以后,我们还需要安装一些nodejs所用到的模块,如:express,node-xml,jssha等模块。可以通过npm命令进行安装。 我们通过nodejs来实现向微信服务器消息的发送与接收,以及与微信服务器的签名认证。 在我们右面的编辑环境中已经为同学们安装了nodejs环境。我们在接下来内容中就为同学们来实现微信服务器的签名认证。 创建express框架 我们在前面的课程中已经安装了express模块,并且在我们右面的环境中已经创建了一个名为app.js的文件。现在我们就在这个文件中完成express框架。如下代码:

然后再添加一个名为test.html的文件。写入以下内容

我们还要添加一个名为index.js的文件,来实现我们的路由。点击编辑环境中的添加文件按钮,添加文件,然后我们写入以下代码,其中GET请求用来验证配置的URL合法性,POST请求用来处理微信消息。

这样我们需要的express框架就完成了,当然我们还可以添加public公共文件夹以及我们要用到的中间件。保存文件,点击【提交运行】,然后点击【访问测试】,去试试吧。记下访问测试的地址,我们将在下一节中会用到该地址。 微信服务器配置 我们登录微信公众平台,在开发者模式下面找到基本配置,然后修改服务器配置。如图所示: 首先URL要填写公网上我们安装nodejs接收与发送数据的路径。我们可以填写上节中【访问测试】的地址,然后加上对应的路由就可以了。

上面代码是我的访问测试的地址,然后加上前面课程中的路由,同学们要根据自己的访问测试地址与路由来填写。 Token要与我们自定义服务器端的token一致。填写完成以后,就可以点击提交了,在提交以前,我们启动app.js(点击【提交运行】)。这样根据我们的路由匹配就可以验证签名是否有效了。 当配置完成以后,一定要启用配置。 网址接入 公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。 signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 加密/校验流程: 将token、timestamp、nonce三个参数进行字典序排序; 将三个参数字符串拼接成一个字符串进行sha1加密; 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。 参数排序 首先我们确认请求是来自微信服务器的get请求,那么就可以在index.js文件中进行添加代码了。然后在app.get('/interface',function(req,res){});的function中进行添加。 先来获取各个参数的值,如下代码:

我们在这里对token进行设置,让其与微信服务器中设置的token一致。 然后对其中的token、timestamp、nonce进行排序,如下代码:

这样我们就完成了排序。 参数加密 在上节中我们已经对参数进行了排序,然后我们在这一节中要将参数组成一个字符串,进行SH-1加密。在加密以前要用到jssha模块,在我们的文件中要引用该模块。

在上一节课中我们已经对参数排序完成,并存放在数组中,我们可以通过join方法来生成一个字符串,如下代码:

最后对该数据进行加密,如下代码:

好了这样就生成了我们需要的签名字符串scyptoString。 签名对比 我们已经得到了我们想要的签名字符串scyptoString,然后我们就可以与来自微信服务器的签名进行对比了,对比通过,则我们就可以接收与发送消息了。

本参考了如下网站,更多内容也请访问: http://www.hubwiz.com/course/569dc7fdacf9a45a69b051cd/ from:http://my.oschina.net/u/2275217/blog/630770

龙生   25 Jul 2016
View Details

作为一个新手程序员该如何成长?

“哦,天那。相比其他开发者,我又笨又没准备。老板会知道我是多么无能,我要被炒鱿鱼了。” 这种想法,在我们作为一名软件开发人员刚进入工作领域的时候,非常常见。我也不例外。这种想法会让人觉得自己不如其他的开发者,感觉自己是滥竽充数的,感觉自己像一个全面的傻瓜,当涉及到写代码的时候。 在短短的几个月后,我第一次获得一份真正编程工作的兴奋——改善和维护一个基于 web 的研究平台——终于变成了绝对的恐惧,那些消极负面的想法在我的脑海里不断地涌入。即使在我去了更大节奏更快的组织机构,以及之后终于开创了我自己的企业,这些想法也在不断地蚕食我。 我总是觉得自己写的每一行代码都那么笨重,低效,如果展示给任何其他有才干的开发者看绝对会被批判得体无完肤。我感觉自己很笨,他们发现这一点不过是时间问题。 听起来很熟悉?如果你有我这种想法,有绝大多数软件开发者都有的这种想法,很大的可能是会惶惶而不可终日。 下面我要介绍一些我发现的有助于,你作为一个初出茅庐的开发人员,提升你自己和你的职业生涯前景的关键策略,并在推动职业发展时保持一种健康的心态。 作为一个初出茅庐的开发人员提升自己和职业生涯前景 无论你是正在找你的第一份工作,还是盯上了潜在的晋升,在一定程度上你都需要与其他的开发者竞争。为了确保你能从中脱颖而出,这里有一些关键的步骤可以帮助你迈向成功。 1. 找一种你喜欢用到工作中的语言。 要成为一个更优秀的程序员,需要定时经常性地练习编程并用不同的语言和技术扩宽你的经验,但是语言是如此之多,很多时候你不知道从哪里开始,也不知道该选择什么语言才最适合你要解决的问题风格。 如果你还没有想好具体的语言,并且想要先试验下的话,我会建议你搜索求职网站,例如 Stack Overflow Careers、Indeed 和 Monster,看看是什么语言最抢手。如果你想或者目前的职位要求的话,你可以牢牢掌握一些特定的语言,然后开始研究和试验。 The TIOBE Index 可用来查看哪些语言更受欢迎 当我开始我的第一份工作的时候——一个基于 web 研究平台的开发者——我进入了学习的阵营:虽然我有足够的技能在面试时通过编程测试,但是这份工作要求我加强 PHP、JavaScript 和 SQL 技能。于是下班后以及周末,我都会磨练自己在那三方面的技能,以便于能够在工作中表现良好,能够拥有更多基于 web 开发的机会,而这些对于我现在能够拥有和打理我自己的 web 开发公司有很大的贡献。 不管你恰巧遇到或选择了什么语言,关键是经常练习。尝试不同的语言,通过一些小例子编码,然后用它们构建小的项目。一旦你找到了能与你产生共鸣的一种或一系列语言以及如何处理问题的方法,坚持下去,并经常性地定期实践练习。 2. 发现问题或任何让你觉得生气的事情。 正如随着我职业生涯的向前迈进,我进入了一家大的临终护理组织,担任 web 开发者。虽然我的工作主要是改善和维护我们的在线计费和 CRM 系统,但是许多医务人员经常抱怨:病人总是报告说系统运行得异常缓慢。这让我很生气,它让员工更生气——因为不得不去修复。 临终护理几乎纯粹运行在微软技术上,并且数据库也不例外——Microsoft SQL Server(MSSQL)。虽然它不是我感觉最舒服的查询语言,但是我依然在家里研究、阅读、练习构建小型的 MSSQL 项目。通过我的努力,我渐渐能够建立一些示例报告来向数据库管理员展示报告可以如何改进。随着时间的推移,我帮助实现的优化促使我得到了晋升,通过修复那 个问题学到的技能帮助我获得了一份数据库管理的工作。 和一种语言一起成长和点燃学习激情的最好办法是,使用你学到的知识来帮助解决令你感到苦恼的问题。不仅要学习语言本身,也要学习语言可以如何应用到实际生活中的问题。 3. 公开发布到 Github 或其他公共代码平台上。 即使你不认为有人会使用它,喜欢它,或者甚至看上一眼,还是要发布你的代码,一旦你觉得它达到生产标准的话。你的项目可能不会改变世界,但它可以让你脱颖而出,让你可以坦然对待别人查看和批评你的工作。此外,它可以让你的简历增色不少。 4. 写博客,展示你正在学习的东西,怎么学习以及为什么。 向世界(以及将来的雇主)展示你正在学习,以及你有主动的学习意愿,就可以让你领先于 95% 以上的同行业开发人员。你也可以练习你的写作技巧,这个过程也能让你学到很多关于自我方面的东西——你如何处理问题,如何分解和解决。你还需要整理一下你 常用的思考方式,如何学习和成长,以及如何取得进步。 5. 在软件开发社区中表现活跃。 解决问题,看别人怎么解决问题,说出自己的声音和意见。我通过 Stack Overflow 和编程社区做到这些。这还不是最宽容的文化,因为你将会遇到一些非常眼尖的开发者咆哮你怎么在伪代码中忘记了后面那个括号,但这能让你与其他的开发者交 流,使得具备接受诚实(有时是残酷)批评的经验,并知道其他人可能会如何处理问题,从而打开思考问题的新思路。 6. 学会如何简明扼要地解释给技术和非技术人员听。 我总是听到大家说沟通是实现职业成功时,要掌握的最难和最重要的事情之一。在早期,我认为这是无稽之谈——只是跟人讲电话,会议期间交谈,发送电子 邮件能有多难?任何有着专业沟通经验的人都会对这种看法嗤之以鼻,我现在也会。你会惊讶地发现误解的快速突然出现,工作流程是如此之复杂,以及项目进程的 拖延。 要真正掌握高效的沟通,你需要对实际工作中你需要工作于什么有一个基本的了解(我强烈推荐 Charles Petzold 的《Code》)并彼此交互。写博客,并与编程社区互动有助于有效地提高沟通能力。 如果你能掌握简练,实事求是,通俗易懂(如果需要的话)的沟通方式,并将复杂的问题和解决方案分解为可理解和很小的块,那么你就能在软件开发领域立于不败之地。你会发现项目经理,其他的程序员,以及执行主管等都会争夺你去他们的团队。 保持健康的心态 专业软件开发人员的成长之路没有一条不充满着荆棘和困难,所以你很容易掉入不健康的自我思考和职业选择的陷阱。通过了解每个人都会有的专业的不安全感,可以在你对自己失去信心的时候更好的激励自己。 1. 要知道,每个人都感觉自己像骗子。 你在你的职业和生活中遇到的每个人都在与骗子综合征做斗争。我们每个人都觉得自己正处在被发现自己是骗子,然后被公开批评无能的边缘。了解这一点能在精神领域帮助你觉得公平,而且还能帮助你认识到,每一个做过值得夸耀的事情的人曾几何时的想法就和你现在一样。 这种心态可以帮助你坚持下来!如果再加上具有建设性的渠道方法——学习新的语言,开发方法,以及解决问题的方法——你的整个职业生涯都将有极大的提高,并且能够快速让你成为技艺大师。 2. 知道自己会陷入困境。 毫无疑问,就是在编程中我终于接受了我是人这个事实——我也有犯迷糊,笨手笨脚,错误频出的时候。没错,你也是如此。你会错过最后期限,太多次点击“全部回复”,滑动捕捉一些严重的错误,或者在应用程序架构中轻易放过一个令人难以置信的 bug。 要想保持快乐和健康,那就得让自己去分析错误,然后从中学习,还要应用所学的东西以便于下次完成得更好。 […]

龙生   25 Jul 2016
View Details

避免成为优秀程序员

我曾经和我认为优秀的程序员一起工作,但是他们是真正优秀的程序员吗?是什么让他们如此优秀?(或者,他们只是普通的程序员?) 最近读到Mark Pearl博客里一篇名为《Programming, a Subset of Writing》的文章,其中的观点让我十分推崇,尤其是下面这段: 优秀程序员和普通程序员最大的区别在于,优秀的程序员会使用整洁、易于理解的方式进行编程,任何不必要的复杂代码均不会出现。和我工作过的那些真正优秀的程序员总是尊学这样的编程步骤:写代码、重构、进一步重构。 就像日常生活技能一样,提高自己的办法唯有不断练习, 但是除了重构和进一步重构之外,你还能做些什么? 还有一种提升自我的方法,很简单,只需要对编程的其他重要要素保持开放的心态就好了。如单元测试、异常处理甚至交流技巧都非常重要。如果忽略或轻视这些因素也许会导致你过度自信,甚至成为一个自负的人。 我认为鼓吹“忽略实际情况,循规蹈矩地遵守软件开发实践就能成为一个优秀程序员”的说法非常荒谬。有时我会认为他们只是些 “自负的程序员”,虽然,老实说,他们中的一些人还是很优秀的。 我非常赞同我以前的同事 Russell Politzky 曾经说过的一句话: 那些自负的程序员往往是教条、狭隘和不切实际的。在我们的业务中,这会导致他们做出不合适的和有缺陷的设计。 如下是一些程序员经常挂在嘴边的话: 所有的测试必须是单元测试 要不惜代价达到100%的代码测试覆盖率 所有使用mocks/stubs的测试,必须基于mock库进行实现 不管业务目标是什么,所有的应用程序都必须建立在DDD模式之上 所有使用数据库的程序必须使用ORM来操作数据 不使用ORM是非常糟糕的,而且难于维护 代码注释不应该存在于代码中,因为存在注释表明代码不够清楚明了,不能直接表达其含义,应该总是使用代码来表达程序的含义而不是注释 任何一个你产出的文档,比如说设计文档,总是会过时的,用处很少 你唯一需要的文档就是代码 你唯一需要的模型也是代码 自顶向下的设计是不会成功的,这种尝试总会失败,拥护这种设计的人只是没找着门路,最终他们还是会折服于“演进式设计”所带来的优越性,没错,就是TDD 除了面向对象,你用别的编程范式根本写不出好的软件,因为只有OO能降低复杂度 你认识这类程序员吗?如果是,你认为他们的水平如何?经验表明这类极端的思维,既不是完全正确也不是完全错误,只是不合逻辑。 更加切实的考虑和合理的推理才能帮助你成为一名优秀的程序员。磨练技艺,增强技能固然很好,但是当我们在做这些事情的时候,应该从实际情况出发,认真考虑实施其所需的范围、成本、环境等各种因素。将这些合理的因素纳入考虑范畴需要成熟的思考,才能成为优秀的程序员。 当然,也需要大量的练习。 稿源:ThoughtWorks洞见   from:http://www.oschina.net/news/75493/avoid-become-good-programmer

龙生   25 Jul 2016
View Details

《精灵宝可梦:Go》带来的软件质量启示

如果您的应用拥有2100万活跃用户,且随时保持在线,那么需要处理的质量难题一定不计其数。为了避免出现严重问题,我们将共同探讨如何抢先一步搞定体验保障工作。 《精灵宝可梦:Go》终于上线。这款手游的人气有多高?很简单,其已经成为全美有史以来最流行的移动游戏,目前拥有2100万活跃用户。 但兴奋的玩家们在游戏时却发现了大量问题。我个人就发现自己无法使用谷歌凭证完成登录,因为其“无法接入该服务器”。后来虽然登录完成,但却由于“GPS连接丢失”而无法捉住身边的妙蛙种子。网上报告该游戏问题的帖子层出不穷,同时也给出了一些潜在的解决方案。Google Play与iTunes出现了大量用于“修复”该游戏问题并保持玩家顺利游玩的相关应用。 我们不禁要问:为什么会有这么多故障? 难道是游戏开发者们没有为汹涌的玩家做好充分准备?或者,他们没有测试全部可能用例——包括地理位置、设备、操作系统、硬件等等? 在上线后的头一周,几乎每天都会出现《精灵宝可梦:Go》服务器崩溃以及影响人们使用体验的报告。值得庆幸的是,这些都没有影响到这款游戏的人气。目前其开发商Niantic公司已经掌握并修复了多种问题,然而随着此游戏在更多国家的上线,恐怕他们还要面临规模更大、强度更为夸张的冲击。 凭借着对游戏的热爱,下面我们一起来看应当从中吸取的四项软件质量保障教训: 教训一:你的实际水平由短板决定——测试并监控API 《精灵宝可梦:Go》的核心在于API。无论是登录应用、识别位置、查看增强现实效果、收集宝可梦小怪物、对战还是开着游戏街,这一切都依靠着API实现数据与请求传递。其中部分API由Niantic公司独立开发,也有一些属于流行的公共API——例如谷歌地理API。 然而很多玩家发现游戏无法检测到GPS位置,或者有时会给出错误位置。 相关问题包括: •    API端点可用性 •    响应请求的具体速度 •    载荷的功能正确性 由于整款游戏基于地理位置的正确性与严谨性而建立,因此即使是小小的误差也会影响到用户体验。游戏厂商不仅需要在部署之前测试不同API功能,还应当立足不同场景监控API功能的正确性——包括地理位置、设备、操作系统与服务供应商对效果的影响。 教训二:验证用户生成的数据 事实上,《精灵宝可梦:Go》并不是Niantic公司的首款增强现实游戏。早在2011年,他们就曾发布了Ingress的beta版本,其允许用户在世界各地的标志性建筑及历史地点收集“门户位置”。正是凭借着这部分数据,该公司才能够建立起《精灵宝可梦:Go》中的竞技场与宠物商店数据库。 虽然群众提供的数据非常庞大,但仍然有可能带来错误的结果。另外,其指向的某些偏僻位置甚至有可能给玩家带来人身安全风险。谁该对此进行控制?当然是游戏厂商! 教训三:测试并监控前端 在《精灵宝可梦:Go》这款游戏中,需要由API与GUI相配合以共同完成信息收集,这也意味着对二者进行测试变得非常重要。 前端图形用户界面(简称GUI)不仅需要API响应,同时亦需要配合设备硬件/传感器数据。举例来说,玩家所处地点由基于位置的传感器GPS提供,而其反过来又会影响到游戏GUI的表现。这意味着测试人员需要利用集成化GUI与API测试工具进行问题分析。 与此同时,要建立起规模化且坚实的自动化测试战略,我们还需要关注GUI与API层的行为优化。我们以此为基础建立更多单元测试,而后是API测试,最后完成数量进一步减少的UI测试。 由于游戏厂商有着极为庞大的全球化推广野心,因此为了在不同区域提供一致的使用体验,前端错误或可用性问题必须得到高度重视。 教训四:准备好应对一切潜在用户场景 与任何一款应用一样,《精灵宝可梦:Go》所面对的用户也是形形色色。他们来自不同的国家、身处不同地点、利用不同设备访问应用,但却希望获得同样的性能表现。 事实上根据我的个人经验,这款游戏在Android设备上非常耗电,我甚至不得不在尝试了几天之后选择将其删除。 我认为游戏开发商在增强现实游戏领域才刚刚起步,这类应用能够带来新的发展方向与潜在可能性,但同时也面临着种种前所未有的挑战。第一次尝试做到这样已经足够令人赞叹,也希望他们能够在未来继续积累经验,真正在软件质量层面带来让每个人满意的成果。 【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】 原文标题:4 Software Quality Lessons From Pokemon Go’s Wild First Week 原文链接:https://dzone.com/articles/4-software-quality-lessons-from-pokemon-gos-wild-f 核子可乐译 from:http://developer.51cto.com/art/201607/514878.htm

龙生   22 Jul 2016
View Details

一篇文章,掌握所有开源数据库的现状

数据库作为业务的核心,在整个基础软件栈中是非常重要的一环。近几年社区也是新的方案和思想层出不穷,接下来我将总结一下近几年一些主流的开源数据库方案,其背后的设计思想以及适用场景。本人才疏学浅如有遗漏或者错误请见谅。本次分享聚焦于数据库既结构化数据存储 OLTP 及 NoSQL 领域,不会涉及 OLAP、对象存储、分布式文件系统。 1 开源RDBMS与互联网的崛起 很长时间以来,关系型数据库一直是大公司的专利,市场被 Oracle / DB2 等企业数据库牢牢把持。但是随着互联网的崛起、开源社区的发展,上世纪九十年代 MySQL 1.0 的发布,标志着关系型数据库的领域社区终于有可选择的方案。 MySQL 第一个介绍的单机RDBMS就是MySQL。相信大多数朋友都已经对 MySQL 非常熟悉,基本上 MySQL 的成长史就是互联网的成长史。我接触的第一个 MySQL 版本是 MySQL 4.0,到后来的 MySQL 5.5 更是经典——基本所有的互联网公司都在使用。 MySQL 也普及了「可插拔」引擎这一概念,针对不同的业务场景选用不同的存储引擎是 MySQL tuning 的一个重要的方式。比如对于有事务需求的场景使用 InnoDB;对于并发读取的场景 MyISAM 可能比较合适;但是现在我推荐绝大多数情况还是使用 InnoDB,毕竟 5.6 后已经成为了官方的默认引擎。大多数朋友都基本知道什么场景适用 MySQL(几乎所有需要持久化结构化数据的场景),我就不赘述了。 另外值得一提的是 MySQL 5.6中引入了多线程复制和 GTID,使得故障恢复和主从的运维变得比较方便。另外,5.7(目前处于 GA 版本) 是 MySQL 的一个重大更新,主要是读写性能和复制性能上有了长足的进步(在5.6版本中实现了SCHEMA级别的并行复制,不过意义不大,倒是MariaDB的多线程并行复制大放异彩,有不少人因为这个特性选择MariaDB。MySQL 5.7 MTS支持两种模式,一种是和5.6一样,另一种则是基于binlog group commit实现的多线程复制,也就是MASTER上同时提交的binlog在SLAVE端也可以同时被apply,实现并行复制)。 如果有单机数据库技术选型的朋友,基本上只需要考虑 5.7 或者 MariaDB 就好了,而且 5.6、5.7 由 Oracle 接手后,性能和稳定性上都有了明显的提升。 PostgreSQL PostgreSQL的历史也非常悠久,其前身是UCB的Ingres,主持这个项目的 Michael Stronebraker 于 2015 年获得图灵奖。后来项目更名为 Post-Ingres,项目基于 BSD license 下开源。 1995 年几个 UCB 的学生为 Post-Ingres 开发了 SQL 的接口,正式发布了 PostgreSQL95,随后一步步在开源社区中成长起来。 和 MySQL 一样,PostgreSQL 也是一个单机的关系型数据库,但是与 MySQL […]

龙生   22 Jul 2016
View Details

立足GitHub学编程:13个不容错过的Java项目

今天我们将整理一大波干货满满的Java示例代码与能力展示素材。 GitHub可谓一座程序开发的大宝库,有些素材值得fork,有些则能帮助我们改进自有代码或者学习编程技能。无论如何,开发工作当中我们几乎不可能绕得开GitHub。 下面,我们将一同分享各有趣且颇为实用的Java库,大家请任取所需、不用客气~ 1.极致精简的Java Bootique是一项用于构建无容器可运行Java应用的极简技术。该项目允许大家创建REST服务、Web应用、任务、数据库迁移等等,且一切都立足于模块实现。另外,大家也可以将其作为简单的命令进行使用。 该项目的目标在于将应用从Java容器中解放出来,允许开发者重新回归main()方法。另外其中还包含部分内置命令,因此就算各位需要处理的代码量不多或者并未向应用中导入任何模块,仍然能够利用Bootique对其加以执行。 2.优雅的问题处理方式 99-problems,光看名字就能对其功能了解一二。很明显,它的作用是帮助大家磨练逻辑编程中的具体技能。大家可以选择利用Java 8、Scala或者Haskell进行问题解决,并最终找到最精致的解决办法。 如果大家喜爱解题,其中还提供多种不同层级的难度供各位选择。另外,如果大家将全部99道难题解决掉,则可进一步冲击Java Deathmatch。如果大家被难住了,请点击此处查看难题——但请注意,认真思考之后再参阅比较好哦。 3.字符串操作 Strman-java库是一套Java 8库,专门用于处理字符串。由于其可用于Maven,因此大家只需要面向选定的构建工具添加关联性即可使用。 如果大家使用过Kik并听说过其遭遇的leftPad问题,那么Strman可能是个更好的选择——其能够返回特定长度的新字符串,且自动填充开头部分内容。另外,其中还提供一整套功能列表,包括向值附加字符串、从特定目录中提取字符以及利用字符串在开始与结束间返回数组等等。 4.数据浏览 如果大家希望通过酷炫的方式进行数据交互,那么Dex绝对不容错过。它能够帮助我们提取、转换及可视化数据,同时附带预测功能。大家可以将可视化结果发布为3D或者其它HTML变量形式。 Dex允许我们生成超过50种不同的可视化模式,其中包括世界地图、参与时间表、网络使用情况等。大家也可以利用R与其运行实例相结合,从而构建起复杂的统计分析与预测分析体系。 民主党与共和党谁能胜出?利用弦状图看个究竟。 5.小小大数据 Tablesaw是一套内存内数据表,其中包含多种数据工具与面向列的存储格式。其设计思路认为没人会面向小型任务执行分布式分析,而大家可以在单一服务器上对200万行级别的表进行交互。 大家能够利用Tablesaw执行各种规则,从而检查显示布局、数据优先级或者针对数据显示及交互向特定用户提供扩展控制范围。在它的帮助下,我们可以利用RDBMS与CSV文件导入数据,添加及删除列,执行映射与规约操作或者将表保存在经过压缩的列式存储格式当中。 6.键值存储 Chronicle Map是一套内存内键值存储方案,其设计目标在于实现低延迟与/或多进程应用,例如贸易与金融市场应用。这套库主要面向中等读取与写入查询延迟场景,允许用户根据服务器中的硬件执行线程数量编写合适的查询机制。 其主要用途包括在单一服务器(例如Redis)中替代低速键值存储方案,或者取代同类面向JVM的解决方案以实现速度提升。大家也可以将部分应用状态移出Java堆,从而降低堆体积及GC压力。 7.负载调查工具 Gumshoe允许大家监控自己的应用性能统计指标。有了它,我们可以精确到具体代码行并了解与堆栈调用及个别栈帧相关的统计数据,从而确切分析资源使用情况(例如TCP、UDP、文件系统或处理器使用量)。 这套库能够在统计数据生成时对其进行捕捉、过滤与可视化处理,从而更为直观地实现数据结论查阅。如果需要更为具体地使用,大家还可以在数据捕捉与/或可视化处理过程中过滤栈帧,并在其运行中加以变更。 8.Java音乐 SoundSea允许大家搜索并下载歌曲。其内置有元数据与专辑信息,大家在查找特定歌曲时,SoundSea会在iTunes上查找相关元数据与专辑信息,并显示相关结果。如果匹配的歌曲超过一首,大家可在其中找到自己需要的条目。 歌曲本身下载自Pleer.com,大家还可以根据高品质、低品质或者VBR码率进行过滤。这同时也是一款迷你播放器,供我们直接聆听歌曲而不再经由其它音乐库。 搜索与下载 9.检查泄漏问题 LeakCanary是一套开源库,旨在帮助我们解决内存泄漏问题。大家可以利用它在Java(与Android)中检查内存泄漏。正如其GitHub页面中所言,“千里之埋溃于蚁穴”。 在LeakCanary设置完成后,大家可以利用其自动检查泄漏并在发现问题时给出通知。 10.多维数组 ND4J是一套开源库,能够将多种来自Python社区的科学计算工具引入JVM。其面向生产环境设计,因此运行速度很快但对内存容量却要求不高。在它的帮助下,工程师们能够轻松将算法及接口移植到Java与Scala库当中。 这套库的主要贡献是提供一套通用型n维数组对象,其多平台功能包括GPU与线性代数外加信号处理能力。其与Hadoop及Spark相集成,且提供API以模拟Numpy——一款高人气Python数学库。 11.监控Java 无论大家使用哪种监控工具,Automon都能够将其与AOP(AspectJ)相结合以实现Java代码、JDK以及依赖库监控声明。其可与其它各知名监控工具相协作,例如JAMon、JavaSimon、Yammer Metrics以及StatsD等,同时亦支持各类日志记录库,包括perf4j、log4j、sl4j等等。 另一款出色的生产型监控工具为Takipi。它能够帮助大家了解自己的代码何时及为何发生崩溃,查看全部意外状况并获取与之相关的全部堆栈、源与状态信息。 12.打理Java Jvm-tools,或者SJK,是一套用于JVM故障排查、监控与配置的工具组合。这是一款不像话地工具,使用JVM的标准诊断接口(例如JMX、JVM attach与perf计数器),同时添加了更多逻辑以应对各类常见故障排查用例。 这套库允许我们对目标JVM的CPU线程使用情况进行池化,同时定期向控制台报告实时CG信息并提供基础样本分析功能。在这里,我们可以通过命令行配合MBean执行各基本操作,同时将目标Java进程的全部MBeans转储为JSON格式。 13.最佳Java awesome-java是一套出色的Java框架、库与软件合集。如果大家不太清楚自己应当如何选择具体方案,请务必参考这套清单 ,其中甚至根据类别对各条目加以划分。 其中还包含一部分仍在使用的古老工具,包括能够简化映射的框架,可构建应用周期与依赖性的工具以及负责处理字节码编程的库等等。 总结陈词 这当然只是GitHub的冰山一角,毫无疑问还有更多项目值得大家审视并用于改善自身代码工程。也欢迎大家结合自己的经验在评论中提供更多推荐! 【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】 原文标题:The Hitchhikers Guide to GitHub: 13 Java Projects You Should Try 原文链接:https://dzone.com/articles/the-hitchhikers-guide-to-github-13-java-projects-y from:http://developer.51cto.com/art/201607/514785.htm

龙生   22 Jul 2016
View Details

大型网站应用中 MySQL 的架构演变史

没有什么东西是一成不变的,包含我们的理想和生活!MySQL作为一个免费的开源的关系型数据库,深受大家喜爱,从最初的无人问津到当下的去IOE,都体现出了MySQL举足轻重的作用。今天我们就从淘宝的发展来阐述MySQL在大型网站下的架构演变史! MySQL的可扩展性 架构的可扩展性往往和并发是息息相关,没有并发的增长,也就没有必要做高可扩展性的架构,这里对可扩展性进行简单介绍一下,常用的扩展手段有以下两种 Scale-up : 纵向扩展,通过替换为更好的机器和资源来实现伸缩,提升服务能力 Scale-out : 横向扩展,  通过加节点(机器)来实现伸缩,提升服务能力 对于互联网的高并发应用来说,无疑Scale out才是出路,通过纵向的买更高端的机器一直是我们所避讳的问题,也不是长久之计,在scale out的理论下,可扩展性的理想状态是什么? 可扩展性的理想状态 一个服务,当面临更高的并发的时候,能够通过简单增加机器来提升服务支撑的并发度,且增加机器过程中对线上服务无影响(no down time),这就是可扩展性的理想状态! MySQL架构的演变 MySQL简单网站架构(V1.0) 一个简单的小型网站或者应用背后的架构可以非常简单,  数据存储只需要一个mysql instance就能满足数据读取和写入需求(这里忽略掉了数据备份的实例),处于这个时间段的网站,一般会把所有的信息存到一个database instance里面。 在这样的架构下,我们来看看数据存储的瓶颈是什么? 1.数据量的总大小  一个机器放不下时 2.数据的索引(B+ Tree)一个机器的内存放不下时 3.访问量(读写混合)一个实例不能承受 只有当以上3件事情任何一件或多件满足时,我们才需要考虑往下一级演变。 从此我们可以看出,事实上对于很多小公司小应用,这种架构已经足够满足他们的需求了,初期数据量的准确评估是杜绝过度设计很重要的一环,毕竟没有人愿意为不可能发生的事情而浪费自己的经历。 这里简单举个我的例子,对于用户信息这类表 (3个索引),16G内存能放下大概2000W行数据的索引,简单的读和写混合访问量3000/s左右没有问题,你的应用场景是否 MySQL的垂直架构(V2.0) 一般当V1.0 遇到瓶颈时,首先最简便的拆分方法就是垂直拆分,何谓垂直?就是从业务角度来看,将关联性不强的数据拆分到不同的instance上,从而达到消除瓶颈的目标。以图中的为例,将用户信息数据,和业务数据拆分到不同的三个实例上。对于重复读类型比较多的场景,我们还可以加一层cache,来减少对DB的压力。 在这样的架构下,我们来看看数据存储的瓶颈是什么? 单实例单业务,依然存在V1.0所述瓶颈,遇到瓶颈时可以考虑往本文更高V版本升级, 若是读请求导致达到性能瓶颈可以考虑往V3.0升级, 其他瓶颈考虑往V4.0升级 MySQL的主从架构(V3.0) 此类架构主要解决V2.0架构下的读问题,通过给Instance挂数据实时备份的思路来迁移读取的压力,在Mysql的场景下就是通过主从结构,主库抗写压力,通过从库来分担读压力,对于写少读多的应用,V3.0主从架构完全能够胜任 在这样的架构下,我们来看看数据存储的瓶颈是什么? 写入量主库不能承受 MySQL的路由多集群架构(V4.0) 对于V2.0 V3.0方案遇到瓶颈时,都可以通过水平拆分来解决,水平拆分和垂直拆分有较大区别,垂直拆分拆完的结果,在一个实例上是拥有全量数据的,而水平拆分之后,任何实例都只有全量的1/n的数据,以下图Userinfo的拆分为例,将userinfo拆分为3个cluster,每个cluster持有总量的1/3数据,3个cluster数据的总和等于一份完整数据(注:这里不再叫单个实例 而是叫一个cluster 代表包含主从的一个小mysql集群) 数据如何路由? 1.Range拆分 sharding key按连续区间段路由,一般用在有严格自增ID需求的场景上,如Userid, Userid Range的小例子:以userid 3000W 为Range进行拆分 1号cluster userid 1-3000W 2号cluster userid 3001W-6000W 2.List拆分 List拆分与Range拆分思路一样,都是通过给不同的sharding key来路由到不同的cluster,但是具体方法有些不同,List主要用来做sharding key不是连续区间的序列落到一个cluster的情况,如以下场景: 假定有20个音像店,分布在4个有经销权的地区,如下表所示: 业务希望能够把一个地区的所有数据组织到一起来搜索,这种场景List拆分可以轻松搞定 3.Hash拆分 通过对sharding key 进行哈希的方式来进行拆分,常用的哈希方法有除余,字符串哈希等等,除余如按userid%n 的值来决定数据读写哪个cluster,其他哈希类算法这里就不细展开讲了。 数据拆分后引入的问题: 数据水平拆分引入的问题主要是只能通过sharding key来读写操作,例如以userid为sharding key的切分例子,读userid的详细信息时,一定需要先知道userid,这样才能推算出再哪个cluster进而进行查询,假设我需要按username进行检索用户信息,需要引入额外的反向索引机制(类似HBASE二级索引),如在redis上存储username->userid的映射,以username查询的例子变成了先通过查询username->userid,再通过userid查询相应的信息。 实际上这个做法很简单,但是我们不要忽略了一个额外的隐患,那就是数据不一致的隐患。存储在redis里的username->userid和存储在mysql里的userid->username必须需要是一致的,这个保证起来很多时候是一件比较困难的事情,举个例子来说,对于修改用户名这个场景,你需要同时修改redis和mysql,这两个东西是很难做到事务保证的,如mysql操作成功 但是redis却操作失败了(分布式事务引入成本较高),对于互联网应用来说,可用性是最重要的,一致性是其次,所以能够容忍小量的不一致出现. 毕竟从占比来说,这类的不一致的比例可以微乎其微到忽略不计(一般写更新也会采用mq来保证直到成功为止才停止重试操作) 在这样的架构下,我们来看看数据存储的瓶颈是什么? 在这个拆分理念上搭建起来的架构,理论上不存在瓶颈(sharding key能确保各cluster流量相对均衡的前提下),不过确有一件恶心的事情,那就是cluster扩容的时候重做数据的成本,如我原来有3个cluster,但是现在我的数据增长比较快,我需要6个cluster,那么我们需要将每个cluster 一拆为二,一般的做法是 1.摘下一个slave,停同步, 2.对写记录增量log(实现上可以业务方对写操作 多一次写持久化mq  或者mysql主创建trigger记录写 等等方式) […]

龙生   22 Jul 2016
View Details

人类到底该吃肉 还是吃素?

我们都知道生理和心理有着密切的关联。当我们身体不好时,我们会郁闷、抱怨,同样,我们的情绪,也会影响我们的生理状态,比如,我们心情抑郁的时候,会食不知味,对原本很热衷的美食,可能都会提不起兴致。更为甚者,一些心理疾病会引发或加重一些身体上的疾病,比如,长期的抑郁,会引起比如消化系统,呼吸系统,循环系统,神经系统等等多种身体病症。 我们常常有这样的体验,就像我们饿了的时候,会寻找吃的,同样,我们心情不好的时候,有时嘴上嚼着东西,也能释放焦虑等负面情绪,也就是饮食于我们,无论是身体还是心理都是有着这样或那样的影响。 之前看过很多关于素食和肉食的话题,于是引发了思考:是否素食更适合人类?或者说,人类是否本就是素食的物种?如果是这样,是否肉食与素食也会对人的心情产生不同的影响呢?那么,长期食肉会否与一些心理疾病有关,或者素食对人的心理健康更有益呢? 带着这样的疑问与思考,于是想写今天的这篇文章,叫做《素食与心理健康》之“人类适合吃肉还是吃素”。 很少有人不关注自己的生活是否快乐与幸福,而幸福本身又与我们的身体和心理密不可分。既然这样,探讨与身体和心理密切相关的饮食,那就是很必要的了。那么,人的生理结构是怎样的?它适合吃肉吗? 哺乳动物可按其饮食习性大致划分为食肉类动物、食草叶类动物及食果类动物。下面我们分别以食肉类动物、食草叶类动物、食果类动物与人进行对比,从人的生理构造,身体机能和消化系统等方面来看人类更适合食肉还是食素。 1、食肉类动物 所有的食肉动物,包括狮子、狗、狼、猫等它们都有着非常“简短”的消化系统。食肉动物的小肠长度大约只相当于身体(指躯干,不计头部和四肢)长度的3倍。 这是因为,肉类食物腐烂得极快,如果在体内存留过久,其腐烂后生成的毒物会浸入血流,因此食肉动物通过长期的进化形成了较短的消化道,以利于腐败的肉食及其产生的毒物能迅速排出体外。 另外,食肉动物的胃中也含有较高浓度的盐酸用以消化肉食中的纤维组织和骨骼,其盐酸的强度比素食动物的强约20倍。 食肉动物多在阴凉的夜间外出猎食,在白天时则睡觉,因此不需要通过皮肤的汗腺来出汗以降低体温,而是通过舌头排汗散热。 食素动物则不同,像牛、马、鹿等动物,从早到晚大部分时间都要在烈日下觅食,因此,需要通过皮肤的汗腺大量地出汗来使体温降低。 食肉动物与食素动物区别最大的地方,在于牙齿的不同。 为了捕杀猎物,食肉动物需要有尖利的爪,强有力的颚以及长而尖锐的门齿和犬齿(在口腔的前部)用来刺穿及撕裂(主要依靠牙齿)坚韧的皮肉。 食素动物一般都是先将谷物一类的食物在口里嚼碎,进行初步消化,然后再送入肠胃中,而食肉动物则没有平坦的臼齿,因此肉食是浓缩性食物,不需要预先嚼碎,其消化过程几乎全部是在肠胃中进行。 以猫为例,它几乎不能用牙齿来嚼碎食物。 2、食草叶类动物 这类动物一般是靠吃草本植物,树木枝叶或其它植物维生,例如大象、牛、羊、骆驼等。它们所吃的都是一些粗糙或硬重的食物。 食草叶动物的唾液中一般都含有一种叫做唾液淀粉脢的消化液,用于消化淀粉类食物,其消化过程在口腔中就已经开始了。 那些粗糙的食物必须先经细细嚼碎,并与唾液淀粉充分混和后,才能送入肠胃中做进一步分解。因此,食草叶动物都有24个平坦的臼齿,可以通过微小地左右移动来嚼碎食物(食肉动物的牙齿则只能上下运动)。 食草叶动物没有爪子,牙齿也不尖。它们喝水时是用嘴吸,而食肉动物则是用舌舔。 与食肉动物不同,食草叶动物所吃的植物性食物不会很快腐烂,可以慢慢地通过肠道充分消化吸收,所以其小肠比食肉动物的长得多,约为身体长度的10倍。 值得注意的是,近来发现:食草叶动物若改吃肉食,身体将受到严重的损害。 美国科学家做过这样一个试验:若每天在兔子的饲料里添加半磅的动物性脂肪,两个月之后,兔子的血管就结满了脂肪硬块,呈现出动脉硬化的严重病症。 人的消化系统正像兔子那样,不是为消化肉食而设计的,吃肉将使人深受其害。 3、食果类动物 这类动物主要包括类人猿,是一种与人类最接近的动物界祖先。 类人猿主要是靠吃水果和坚果维生。它们有平坦的臼齿用来嚼碎食物;它们的唾液是碱性的,同食草叶动物一样也含有唾液淀粉脢,用于在口腔中初步消化食物;它们的肠道曲折环绕,其肠道长度大约相当于身体(躯干)长度的12倍,适于慢慢地消化水果和蔬菜。 4、人类 人类的生理特征与食果动物的几乎完全相同,与食草叶动物十分相似,与食肉动物则相差甚远。人类的消化系统、牙齿的构造,以及身体机能等与食肉动物的完全不同。 与类人猿一样,人类的肠道大约也是身体(躯干)长度的12倍;人类是通过皮肤上无数个汗腺(在微小的毛孔内)用来排汗以降低体温;人类像所有素食动物一样用嘴吸的方式喝水;人类的牙齿和颚的构造都是为素食而设计的;人类的唾液是碱性的,并含有唾液淀粉类,用来预先消化谷类食物。 因此,从生理结构上来看:人类不是食肉动物。 根据对人体的解剖和消化系统的构造可以断定,在数百万年的进化过程中,我们一直都是靠吃水果、坚果、谷物和蔬菜维生的。 人类根本就不具备吃肉的本能。我们大多数人都要靠别人替我们杀死动物来获得肉食,若自己亲手杀生会感到恶心或不舒服。 食肉动物一般吃生肉,而我们人类则要用煮、烧烤、炸等方法作熟之后才能吃,烹调过程中还要用各种调味品来掩饰肉的原味。 一位科学家曾这样说道:“一只猫嗅到水果则根本无动于衷。如果人喜欢抓捕鸟雀,并能用牙活生生地撕断其尚在扑动的翅膀,吸吮其温暖的血。那么,可以断定大自然赋予了人吃肉的本能。相反,一串甘美的葡萄却能让人流口水。人在肚子不饿时也会想吃水果,因为人确实觉得它好吃。” 科学家和博物学家林内(V、Linne)曾说:“将人体里里外外的生理构造与其它动物的比较一下就知道,水果和多汁水的蔬菜才是大自然赐予人类的食物。” 总之,科学家们对于生理学、解剖学和动物行为等方面的研究结果显示,人更适合于吃水果、蔬菜、坚果和谷物。 大自然赋予人的生理结构不适合吃肉,世界上大部分病症都是因为吃肉引起的。吃素才是符合自然规律的。吃素是大自然赋予人类的本能,也是大自然赋予的智慧,当然,更是符合天地德行的。 实际上,我们也都知道这样一个事实:如果我们天天只吃肉类而不吃米饭、蔬菜和水果是吃不消的,但我们只吃米饭、蔬菜和水果而不吃肉类却是没有问题的。 科学家们认为,任何动物的饮食都必须与其生理构造相适应。人类的生理构造,身体机能和消化系统等与食肉动物的完全不同,人的生理结构不适合吃肉。 所以,通过以上的分析,关注幸福健康的人们,可以想一想了,我们更适合吃肉还是吃素呢? from:http://tech.btime.com/science/20160721/n316289.shtml

龙生   21 Jul 2016
View Details