Configuring DoS Protection Service for Java  |  App Engine standard environment for Java  |  Google Cloud Platform



Configuring DoS Protection Service for Java  |  App Engine standard environment for Java  |  Google Cloud Platform

The App Engine Denial of Service (DoS) Protection Service enables you to protect your application from running out of quota when subjected to denial of service attacks or similar forms of abuse. You can blacklist IP addresses or subnets, and requests routed from those addresses or subnets will be dropped before your application code is called. No resource allocations, billed or otherwise, are consumed for these requests.


Read full article from Configuring DoS Protection Service for Java  |  App Engine standard environment for Java  |  Google Cloud Platform


Best Practices for Preventing DoS/Denial of Service Attacks



Best Practices for Preventing DoS/Denial of Service Attacks

By By Michael Cretzman and Todd Weeks,Microsoft Corporation

Many corporate websites have suffered from illegal denial-of-service (DoS) attacks more than once. The companies that learn how to turn these experiences to their advantage go a long way to ensuring it doesn't happen again.

Sometimes there's nothing like adversity to give you a new look at your surroundings. And the events of a network attack can uncover some very important mistakes and provide you with more than a few lessons. Turning these lessons into best practices is where the rewards of such adversity are realized. You can arrive at these best practices by asking yourself: "How are we vulnerable?" The following best practices are a sample of some of the common conclusions companies have come to following a DoS attack.


Read full article from Best Practices for Preventing DoS/Denial of Service Attacks


Can christian priests marry, if not why? | Yahoo Answers



Can christian priests marry, if not why? | Yahoo Answers

Nuns and priests are Catholic, not Christians. The Catholic church does not allow its priests to marry. Supposedly this is because the Catholic church believes that Peter, allegedly the first "priest" did not marry. But the Bible makes at least two references to Peter's wife. See 1 Corinthians 9:5 (which uses Peter's Greek name "Cephas") and Matthew 8:14 (which references Peter's mother in-law).

Christian pastors can marry and, in fact, are encouraged to marry, so they can teach the congregation on issues related to marriage and parenting. Something Catholic priests can't really do a good job at having no first hand experience in these matters.

Read full article from Can christian priests marry, if not why? | Yahoo Answers


Love bite horror as teen dies 'after girlfriend's hickey formed blood clot that travelled to brain causing stroke' - Mirror Online



Love bite horror as teen dies 'after girlfriend's hickey formed blood clot that travelled to brain causing stroke' - Mirror Online

Most Read in News Top Celebs Most Read in Celebs 18:05, 27 Aug 2016 By Scott Campbell Paramedics rushed to the scene but they could not save 17-year-old Julio Macias Gonzalez Click to play Tap to play The Live Event you are trying to watch is either unavailable or has not started Please refresh this page in your browser to reload this live event video A teen has reportedly died after getting a love bite from his girlfriend that caused him to have a stroke . Julio Macias Gonzalez started having convulsions at the dinner table with his family in Mexico City after spending an evening with his girlfriend. Paramedics were dispatched to the scene but the 17-year-old could not be saved. It is thought that the suction of the love bite – also known as a 'hickey' – caused a blood clot that travelled to Julio's brain and caused him to have a stroke. His 24-year-old girlfriend has now disappeared and the boy's parents are apparently now blaming her for his death.

Read full article from Love bite horror as teen dies 'after girlfriend's hickey formed blood clot that travelled to brain causing stroke' - Mirror Online


[#5] Counting Cards - PuzzleNode



[#5] Counting Cards - PuzzleNode

Rocky sat down hours ago with his three fellow troublemakers and now is too drunk to remember what card game they are playing. Rocky figures even if he doesn't remember, he's halfway there if he can at least keep track of his partner's hand. Luckily, his partner Lil devised ahead of time a system of signals so that they could communicate their moves to each other without the other players knowing, and she also let Rocky peek at her initial hand. The problem is that Lil is not very good at hiding her signals, and their opponents Danny Dogg and Shady Skunk have caught on. Rocky's vision never was that good, and in his inebriated state, he can't always tell if it's Lil giving him signals or his opponents tricking him with fake signals.

I know you're walking in late to the saloon, but can you help Rocky keep track of what's in Lil's hand?

Mouse Nell has a nervous habit of watching the game from Rocky's shoulder and has been taking obsessive notes about what moves she can see and what signals are being given.

Her notes are attached below in the "INPUT" file. The format is described below.

Problem

You'll need to provide Rocky with a list of which cards Lil has in her hand after each of her turns. The format of this file is also described below.

Note that:

  • One standard deck of cards is being used in the game (52 suit cards, no Joker cards).
  • Everyone is dealt 4 cards to begin with.
  • Possible moves are drawing from the deck, passing a card to another player, and discarding to the discard pile.
  • Once a card is discarded, it never goes back into a player's hand.
  • When a player discards a card, everyone sees it.
  • Luckily, you don't have to understand anything more than this about the game itself.

The moves that Lil signals to Rocky are drawing a card, passing a card to another player, and receiving a card from another player, which may have happened earlier in the round.

So for example, her turn might consist of:

  1. receiving the Jack of Diamonds and 10 of Clubs from Rocky and 2 other cards from Shady during the round;
  2. drawing 3 cards;
  3. discarding the 7 of Hearts;
  4. passing 2 cards to Danny;
  5. and passing the Jack of Spades to Rocky.

Note that the discarded 7 of Hearts and the Jack of Spades she passed are visible to Rocky, as well as the two cards she received from Rocky, while the other cards are not visible.


Read full article from [#5] Counting Cards - PuzzleNode


Comparing Solr Response Sizes | 7digital Developers



Comparing Solr Response Sizes | 7digital Developers

After seeing some relative success in our Solr implementations xml response times by switching on Tomcats http gzip compression, I've been doing some comparisons between the other formats solr can return. We use Solrnet, an excellent open source .NET Solr client. At the moment, it only supports xml responses, but every request sends the "Accept-encoding:gzip" header as standard, so all you have to do is switch it on on your server and you've got some nicely compressed responses. There is talk of supporting javabin de-serialisation, but it's not there yet. I've decided to compare the following using curl with 1000 rows and 10000 rows in json, javabin, json/gzip compressed and javabin/gzip compressed.

My test setup is a solr 1.4 instance with around 11000 records in sitting behind an nginx reverse proxy handling the gzip compression. As I said, this could easily be achieved by switching on gzip compression in Apache Tomcat. The same 10000 records, returned using the q=*:* directive with wt=json when http gzip compressed is the smallest, but only marginally, compared to wt=javabin. It would seem that json compresses very well indeed. You can also see the massive drop just switching on gzip compression gives to xml.


Read full article from Comparing Solr Response Sizes | 7digital Developers


Solr 4.0: new fl parameter functionalities – first look | Solr Enterprise Search



Solr 4.0: new fl parameter functionalities – first look | Solr Enterprise Search

The last functionality, which we will look at today, is the ability add the result of the function, as a field in the documents returned by Solr. Thus, in Solr 4.0 will have the option to add such values as sum of prices, or calculated distance between two points. Quite useful. To use this functionality You will have to add the appropriate function call to the fl parameter for example:

1fl=*,stock:sum(stockMain,stockShop)

The above will result in Solr returning all the fields for the document (value *) and a field named stock, which will be the sum of two fields: stockShop and stockMain.


Read full article from Solr 4.0: new fl parameter functionalities – first look | Solr Enterprise Search


漫谈Domain Flux | 关注网络安全技术



漫谈Domain Flux | 关注网络安全技术

Domain Generation Algorithm(DGA)是一项古老但一直活跃的技术,是中心结构僵尸网络赖以生存的关键武器,该技术给打击和关闭该类型僵尸网络造成了不小的麻烦,研究人员需要快速掌握域名生成算法和输入,对生成的域名及时进行sinkhole。

背景
僵尸网络指攻击者(Botmaster)出于恶意目的,通过命令控制信道(C&C Channel)操控一群受害主机(Bots)所形成的攻击平台。通过该平台,攻击者可以发起多种常见攻击,包括DDoS、垃圾邮件、钓鱼攻击、点击欺诈、在线身份窃取、比特币挖掘/窃取、加密勒索等。
同传统恶意代码形态相比,僵尸网络的攻击实现依赖攻击者和受害主机之间的信息交互,即攻击者需要告知僵尸主机命令,僵尸主机才可发起相应的攻击,命令的下发通过命令控制信道实现,这是僵尸网络构建的核心,也是攻防双方博弈的关键点。
在早期中心结构的僵尸网络中,僵尸主机通常采用轮询的方法访问硬编码的C&C 域名或 IP来访问命令控制服务器,获取攻击者命令,由于硬编码的域名或IP固定且数量有限,防御人员通过逆向掌握该部分内容后可对该域名进行有效的屏蔽,阻断其命令控制途径,使其失去控制源并逐渐消亡。该种缺陷称之为中心节点失效(single-point-of-failure)。


Read full article from 漫谈Domain Flux | 关注网络安全技术


译:编辑器之战: Vim的复仇 - 今日头条(TouTiao.com)



译:编辑器之战: Vim的复仇 - 今日头条(TouTiao.com)

想其他任何的编辑器一样,Vim也拥有难以置信的可拓展性。如果有任何不能制作成宏的特性,用户通常都可以为此编写插件。依我看来,Vimscript 没Lisp那样好编写,所以我就把拓展的编写留个其他用户吧。有人已经写了一个几乎你所需的所有模块。但是在刚开始的时候不要过度使用插件。即使你是刚学习Vim,它也会使你的工作量减轻很多。

如果你经不住诱惑安装了一些插件,我建议你一次只装一个,直到能给非常熟练的使用后再安装另外的插件。我建议依次安装和学习如下插件:vim-sensible, vim-airline, vim-abolish, ctrlp.vim, UltiSnips, vim-surround, vim-easy-align。

VIM最佳命令

如果你在用Vim,但是没充分使用如下的命令,说明你还没用好它。

l IA 分别插入文本到行首或尾部。

l m设置标记然后通过"`就可以跳回到此标记位置。 这对轻松在长篇文章中跳转非常有效。

l g; 跳转到上次编辑位置。就是说"在去其他地方之前,先返回之前编辑的地方"。这非常有用。但这还不是全部--它追踪编辑历史以便可以复现前5此编辑。g,返回前一个编辑历史。

l CTRL-] 跳转到鼠标所在函数的定义位置,CTRL-t跳回。CTRL-t可以使你会一直返回,直到返回到开始位置。(为了使其生效你需要一个标签文件。) 这几乎达到像eclipse这种IDE价值的一半,却没他们那样造成屏幕凌乱。

l 一个IDE的另外一半是长变量或者方法名的tab完成功能。在Vim中用CTRL-nCTRL-p 来预选列表中上滚和下滚。如果你使用的是标签文件或者如果你在Vim中其他文件定义了标签,它将对变量名和方法名自动完成。

l gg=G跳转到文档顶部(gg) 自动缩进(=) 直到到达文档末尾 (G)。这使得你打开和关闭的大括号排成一行,很容易找到你忘记配对的大括号。

l U撤销最后一个命令。CTRL-r重做。:earlier 2m 恢复到两分钟前的状态。如果你不再进行撤销,继续编辑然后想重做之前的一些改动,就可以考虑用这个命令。g+g- 则在恢复树种上下切换。它变得更加复杂。

l /f 都是搜索命令,这两个命令在符合命令中起着至关重要的作用。df,从当前光标位置上的字符一直删除到遇到逗号(包括逗号)。d/foo 一直删除直到第一次匹配"foo"的位置。如果你喜欢,你可以用这来代替其他动作。

l :r 读取一个文件。:!在shell中运行命令。:r! 粘贴命令的结果输出到文档中。:r!ls whatever*比输入文件名更快。在此我并不打算介绍UNIXy中怎样通过shell脚本运行文本。

无处不在的VI

一旦你习惯于Vim的移动命令,你会乐在其中。当然了你也可以直接使用鼠标,但如果你能熟练使用Vim移动命令,你将很少用鼠标了。手一直在键盘上比时不时腾出手来操作鼠标操作要会更快很多。铁杆Vim用户会重新映射Escape 键(返回到普通模式)到其他更加方便的功能。我设置的是 Caps Lock键,在我左手小手指下面。

(我其实是通过xcapse插件映射它和Control键复合键使用。)

是的,这确实有点极端,但是比 现在已经不存在的避免Emacs导致腕管综合征的键盘设计 强多了。

如果你在Unix使用Bash shell,set -o vi 这种用法来读取行的方法几乎和vi一样。你的浏览器也可以Vim化,火狐浏览器、cVim或vimium中有Vimperator 和Pentadactyl 插件。谷歌浏览器中有ViChrome插件 。如果你想合二为一,qutebrowser是目前最好的原生Vim风格网页浏览器,而且还将会更加完善。

你若搜索 "vi keybindings"你会发现它不仅支持Visual Studio、Eclipse 还支持Emacs。

为什么Emacs里有Vi模拟模式,但Vim中却没Emacs的模拟模式呢?

稍加思索你就会明白,编辑器之战已经有了结果。

想用惯Vim需要花费一些时日。程序员想要擅长Vim,需要要摆正心态勤加练习。从1994到20011年间我用Emacs写代码、写我的学位论文、我所代课的学生的论文和学术论文。从2011年起我就开始用Vim来编写更多代码、写书、写邮件和我在Hackaday上的文章。

我仍然在不断提高,五六年间每天使用Vim 6到8小时,每月将自己总结的技巧写在指令表中。虽然Vim像任何值其他值得深入探索的东西一样,用起来有点难,但是却非常值得。不要轻信任何人告诉你他们"懂"Vim。:wq.


Read full article from 译:编辑器之战: Vim的复仇 - 今日头条(TouTiao.com)


web.xml - Difference between / and /* in servlet mapping url pattern - Stack Overflow



web.xml - Difference between / and /* in servlet mapping url pattern - Stack Overflow

/* The /* on a servlet overrides all other servlets, including all servlets provided by the servletcontainer such as the default servlet and the JSP servlet. Whatever request you fire, it will end up in that servlet. This is thus a bad URL pattern for servlets. Usually, you'd like to use /* on a Filter only. It is able to let the request continue to any of the servlets listening on a more specific URL pattern by calling FilterChain#doFilter(). / The / doesn't override any other servlet. It only replaces the servletcontainer's builtin default servlet for all requests which doesn't match any other registered servlet. This is normally only invoked on static resources (CSS/JS/image/etc) and directory listings. The servletcontainer's builtin default servlet is also capable of dealing with HTTP cache requests, media (audio/video) streaming and file download resumes. Usually,

Read full article from web.xml - Difference between / and /* in servlet mapping url pattern - Stack Overflow


一个不写代码不称职被扒皮的水货 CTO 的自白书



一个不写代码不称职被扒皮的水货 CTO 的自白书

丁香园的技术实力,与丁香园品牌和医生资源等是不匹配的,我觉得技术是拖了后腿的,丁香园本可以用互联网中上的技术实力加上丁香园过去积累的品牌和资源跑的更快。现在丁香园只能说比那些更烂的团队要好。(Fenng: 前面说「有一些领先」,现在又「技术是拖了后腿」,请问一下,市场上哪家同行公司比丁香园技术产品还强的,多举出几个,以便证明我之前做的不好。跟烂团队比好,我觉得还是挺丢人的。

如果说从大辉身上学到了点什么,那就是如何喷人吧,怎么喷同事,怎么喷同行,怎么喷很多其实和我们毫无关系的人和事,然后感叹时间不够用,应该把时间用在 "美好的事情" 上。(Fenng: 其实,我觉得「喷人」没什么不好,至少我没有匿名,我公开的说。

张小龙曾经说过 "要提防那些 blog 写得好的产品经理,因为在 blog 上花的时间越多,在产品上花的时间就越少。原来还以为有例外,现在看起来无一例外。"  (Fenng: 不好意思,我不是产品经理。乔布斯还说过,匿名的都是蠢货呢,看起来也毫无例外。

我想说,这句话要是用在 CTO 身上更加合适,在朋友圈、微博和公众号上花的时间越多,在真正技术上花的时间就越少,这个绝无例外。无论是技术精进和管理能力,我再也不会相信,把大量时间耗费在社交媒体上和人互喷的人能够做好。(Fenng: 不好意思,一个 CTO,如果在一个垂直互联网公司整天标榜「真正技术」,我觉得他真不配做  CTO,写多少代码都不配。另外,Wikipedia 上有 CTO 的职责定义,有空可以看一下。

最后,听说大辉要自己创业了,我最想说的是 "希望他能尽快找到一个靠谱的 CTO"。(Fenng: 如果能找到一个 CTO 的话,我希望他至少是正直的。他最好不要写代码。

关于一些其他不太好说的事情就不说了,希望大辉能够像自己表现的那样,有尊严一点吧,别做那些让兄弟们不好意思说的事情了。(Fenng: 既然已经说得如此不堪,不妨都说出来一点如何?比如,我侵害公司利益没?我吞钱了没?我吃里爬外了没?说出来啊,这些才更有杀伤力。) 



Fenng: 最后我再做一点补充。 

一个 CTO 的工作怎么评估?我是当事人不好说。但我认为,不管怎么评估,要看看他的团队,他怎么组建的团队,他怎么做招聘。还要看做事情的结果。他拿出的结果是不是令人满意。看一个人的缺点或是不足之处太容易了。随便一个人站出来,看他的缺点他一无是处,但是,他有优点吗? 他的优点体现了什么价值? 

每个人有自己的管理风格。我不喜欢开会,如果别的管理者喜欢开会,那是他的行事风格,但我并不会从这一点来评估人的高下。有的 CTO 坚持一线亲力亲为甚至写代码,有的 CTO「一行代码都不写」,但我并不觉得前者就一定比后者是更合格的 CTO。 

尽管有些人劝我说,清者自清,读者有自己的判断。实际情况不是这样,如果我不做回应,不明就里的人就会把那些当成事实。我并不想在离开一家公司之际夸自己有多大「功劳」,也不想再次陷入「跟老东家对掐」的尴尬局面 — 这恰恰是很多吃瓜群众喜闻乐见的热闹。我欢迎公开的批评我,指责我的不足,我承认自己有不足,比如,我就是不喜欢跟很多人开会,有的时候沟通直来直去说话会伤害人,甚至在一些社交网络上无意说的话也会让不相干的人有所联想,虽非我的本意,但有了坏影响,我承担后果。 


Read full article from 一个不写代码不称职被扒皮的水货 CTO 的自白书


Docker生态会重蹈Hadoop的覆辙吗?



Docker生态会重蹈Hadoop的覆辙吗?

1、开发者能够用Docker,开发者要一个开发环境,总会涉及到种种资源,比如数据库,比如消息中间件,去装这些东西不是开发人员的技能,是运维人员的技能。而用Docker去Pull一个mySQL镜像,或是Tomcat镜像,或是RabbitMQ镜像,简易轻松,几乎是零运维。做好了应用代码,打一个Docker镜像给测试或是运维人员,避免了从前打个程序包给测试或是运维人员,测试或运维人员要部署、配置应用,还得反反复复来麻烦开发人员,现在好了,丢个Docker镜像过去,让运维人员跑镜像就可以,配置在镜像里基本都做好了。


这正好满足了DevOps的要求,所以DevOps也一下热起来了。开发者是一个巨大的市场,是海量的个体,通过类似于病毒式的传销,Docker一下在开发者中热起来了。


2、镜像仓库和开源,谁都可以用,Docker镜像库非常丰富,谁做好一个镜像都可以往公有仓库推送,开发人员需要一个环境的时候,可以到Docker镜像仓库去查,有海量的选择,减少了大量无谓的环境安装工作。而通过开源,又开始大规模传播。


我们再来回顾看看2010-2013年,大数据的名词火遍大江南北,各行各业都在谈大数据,但是落到技术上就是Hadoop,还记得2012年的时候,和Hadoop没啥毛关系的VMWare也赶紧的做了一个虚机上部署Hadoop的serengeti,谁家产品要是和Hadoop不沾点边,不好意思说自己是IT公司。Hadoop当年的热度绝对不亚于2014-2015的Docker。而且时间上有一定的连续性,2014年开始,Hadoop热度达到顶点,开始逐渐降温,标志事件就是Intel投资Cloudera。而Docker是从2014年开始热度升高的。

再看Hadoop为何在2010年前后开始热起来,之前的大数据都是数据仓库,是昂贵的企业级数据分析并行数据库,而Hadoop是廉价的大数据处理模式,通过开源和X86廉价硬件,使得Hadoop可以大规模使用,而互联网时代产生的海量数据虽然垃圾居多,但是沙里淘金,也能淘出点价值,Hadoop正好迎合了这两个需求,虽然Hadoop的无论是功能还是性能远比MPP数据库差,但做简单的数据存储、数据查询、简单数据统计分析还是可以胜任的,事实上,到目前为止,大多数的Hadoop应用也就是数据存储、数据查询和简单的数据统计分析、ETL的业务处理。


Read full article from Docker生态会重蹈Hadoop的覆辙吗?


Woman brutally attacked on sidewalk in SF’s Pacific Heights - SFGate



Woman brutally attacked on sidewalk in SF's Pacific Heights - SFGate

Woman brutally attacked on sidewalk in SF's Pacific Heights Updated 7:17 am, Thursday, August 25, 2016 A woman in her 50s suffered a broken nose and will require surgery after a stranger stopped her on a San Francisco street and punched her repeatedly in face and head for no apparent reason, authorities said Wednesday as they released security video of the unprovoked assault. The attacker remained on the loose Wednesday and police officials are asking for the public's help in catching him. "It kind of happened really quickly," said Officer Giselle Talkoff , a spokeswoman for the San Francisco Police Department . "She was merely out for a walk and a stranger came up and just attacked." Photo: San Francisco Police Department / / Image 1of/2 Image 1 of 2 San Francisco Police are hunting for a man who brutally beat a woman police say he randomly targeted on a sidewalk near Lafayette Park in the city's Pacific Heights neighborhood on Saturday, Aug. 20, 2016.

Read full article from Woman brutally attacked on sidewalk in SF's Pacific Heights - SFGate


Mom's Guide 2016: The 4 Best Organic Baby Foods (Yummy!)



Mom's Guide 2016: The 4 Best Organic Baby Foods (Yummy!)

One of the best organic baby food brands out there, and readily-available in most box stores (but cheaper online).

Earth's Best (click here to check price) is really high quality and healthy. Looking at the ingredients label makes it obvious: for example, the "First Peas" food lists the ingredients as "organic peas, water." I love it.

No added sugars, salts, artificial flavors, preservatives of any kind. This does mean, however, that you have to use it up within one day of opening the jar, or you should throw it away.

I like to taste-test all of my baby food, and Earth's Best is one of the yummiest. I think that's a pretty huge bonus!

The only downside to Earth's Best is the price: most of them are about $1.25 for a 4 oz jar, or more expensive per oz for smaller jars. Still, this is an excellent baby food.

There used to be a concern of BPA in their lids, but as of Oct. 2011, they no longer have BPA in any of the packaging anymore.


Read full article from Mom's Guide 2016: The 4 Best Organic Baby Foods (Yummy!)


腾讯高级工程师:一道面试题引发的高并发性能调试思考 - 其他 - DBAplus社群——围绕数据库、大数据、PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群



腾讯高级工程师:一道面试题引发的高并发性能调试思考 - 其他 - DBAplus社群——围绕数据库、大数据、PaaS云,运维圈最专注围绕"数据"的学习交流和专业社群

4月份的时候看到一道面试题,据说是腾讯校招面试官提的:在多线程和高并发环境下,如果有一个平均运行一百万次才出现一次的bug,你如何调试这个bug?(知乎原贴地址如下:https://www.zhihu.com/question/43416744)

遗憾的是知乎很多答案在抨击这道题本身的正确性,虽然我不是这次的面试官,但我认为这是一道非常好的面试题。当然,只是道加分题,答不上,不扣分。答得不错,说明解决问题的思路和能力要超过应届生平均水平。


之所以写上面这段,是因为我觉得大部分后台服务端开发都有可能遇到这样的BUG,即使没有遇到,这样的题目也能够激发大家不断思考和总结。非常凑巧的是,我在4月份也遇到了一个类似的而且要更加严重的BUG,这是我自己挖的一个很深的坑,不填好,整个项目就无法上线。


现在已经过去了一个多月,趁着有时间,自己好好总结一下,希望里面提到的一些经验和工具能够带给大家一点帮助。


项目背景

我们针对Nginx事件框架和openssl协议栈进行了一些深度改造,以提升Nginx的HTTPS完全握手计算性能。


由于原生Nginx使用本地CPU做RSA计算,ECDHE_RSA算法的单核处理能力只有400 qps左右。前期测试时的并发性能很低,就算开了24核,性能也无法超过1万。


核心功能在去年底就完成了开发,线下测试也没有发现问题。经过优化后的性能提升几倍,为了测试最大性能,使用了很多客户端并发测试https性能。很快就遇到了一些问题:


1、第一个问题是Nginx有极低概率(亿分之一)在不同地方core dump。白天线下压力测试2W qps一般都要两三个小时才出一次core。每次晚上睡觉之前都会将最新的调试代码编译好并启动测试,到早上醒来第一眼就会去查看机器并祈祷不要出core,不幸的是,一般都会有几个到几十个core,并且会发现经常是在一个时间点集中core dump。线上灰度测试运行了6天,在第6天的早上才集中core dump了几十次。这样算来,这个core dump的概率至少是亿分之一了。 不过和面试题目中多线程不同的是,Nginx采用的是多进程+全异步事件驱动的编程模式(目前也支持了多线程,但只是针对IO的优化,核心机制还是多进程加异步)。在webserver的实现背景下,多进程异步相比多线程的优点是性能高,没有太多线程间的切换,而且内存空间独立,省去线程间锁的竞争。当然也有缺点,就是异步模式编程非常复杂,将一些逻辑上连续的事件从空间和时间切割,不符合人的正常思考习惯,出了问题后比较难追查。另外异步事件对网络和操作系统的底层知识要求较高,稍不小心就容易挖坑。


2、第二个问题是高并发时Nginx存在内存泄漏。在流量低的时候没有问题,加大测试流量就会出现内存泄漏。


3、第三个问题,因为我们对Nginx和openssl的关键代码都做了一些改造,希望提升它的性能。那么如何找到性能热点和瓶颈并持续优化呢?


其中第一和第二个问题的背景都是,只有并发上万qps以上时才有可能出现,几百或者一两千qps时,程序没有任何问题。


core dump的调试

首先说一下core的解决思路,主要是如下几点:


  • gdb及Debug log定位,发现作用不大。

  • 如何重现BUG?

  • 构造高并发压力测试系统。

  • 构造稳定的异常请求。

gdb及Debug log效率太低

因为有core dump ,所以这个问题初看很容易定位。gdb找到core dump点,btrace就能知道基本的原因和上下文了。 


core的直接原因非常简单和常见,全部都是NULL指针引用导致的。不过从函数上下文想不通为什么会出现NULL值,因为这些指针在原生Nginx的事件和模块中都是这么使用的,不应该在这些地方变成NULL。由于暂时找不到根本原因,还是先解决core dump吧,修复办法也非常简单,直接判断指针是否NULL,如果是NULL就直接返回,不引用不就完事了,这个地方以后肯定不会出CORE了。


这样的防守式编程并不提倡,指针NULL引用如果不core dump,而是直接返回,那么这个错误很有可能会影响用户的访问,同时这样的BUG还不知道什么时候能暴露。所以core dump在NULL处,其实是非常负责任和有效的做法。

在NULL处返回,确实避免了在这个地方的core,但是过几个小时又core在了另外一个NULL指针引用上。于是我又继续加个判断并避免NULL指针的引用。悲剧的是,过了几个小时,又CORE出现在了其他地方,就这样过了几天,我一直在想为什么会出现一些指针为NULL的情况?为什么会core在不同地方?为什么我用浏览器和curl这样的命令工具访问却没有任何问题?

熟悉Nginx代码的同学应该很清楚,Nginx极少在函数入口及其他地方判断指针是否为NULL值。特别是一些关键数据结构,比如'ngx_connection_t'及SSL_CTX等,在请求接收的时候就完成了初始化,所以不可能在后续正常处理过程中出现NULL的情况。

于是我更加迷惑,显然NULL值导致出core只是表象,真正的问题是,这些关键指针为什么会被赋值成NULL? 


这个时候异步事件编程的缺点和复杂性就暴露了,好好的一个客户端的请求,从逻辑上应该是连续的,但是被读写及时间事件拆成了多个片断。虽然GDB能准确地记录core dump时的函数调用栈,但是却无法准确记录一条请求完整的事件处理栈。根本就不知道上次是哪个事件的哪些函数将这个指针赋值为NULL的,甚至都不知道这些数据结构上次被哪个事件使用了。


举个例子:客户端发送一个正常的get请求,由于网络或者客户端行为,需要发送两次才完成。服务端第一次read没有读取完全部数据,这次读事件中调用了 A,B函数,然后事件返回。第二次数据来临时,再次触发read事件,调用了A,C函数。并且core dump在了C函数中。这个时候,btrace的stack frame已经没有B函数调用的信息了。


所以通过GDB无法准确定位 core 的真正原因
 

log Debug的新尝试


这时候强大的GDB已经派不上用场了。怎么办?打印Nginx调试日志。 
 

但是打印日志也很郁闷,只要将Nginx的日志级别调整到Debug,core就无法重现。为什么?因为Debug的日志信息量非常大,频繁地写磁盘严重影响了Nginx的性能,打开Debug后性能由几十万直线下降到几百qps。 


调整到其他级别比如 INFO,性能虽然好了,但是日志信息量太少,没有帮助。尽管如此,日志却是个很好的工具,于是又尝试过以下办法:


  1. 针对特定客户端IP开启Debug日志,比如IP是10.1.1.1就打印Debug,其他IP就打印最高级别的日志,Nginx本身就支持这样的配置。

  2. 关闭Debug日志,自己在一些关键路径添加高级别的调试日志,将调试信息通过EMERG级别打印出来。

  3. Nginx只开启一个进程和少量的connection数。抽样打印连接编号(比如尾号是1)的调试日志。


总体思路依然是在不明显降低性能的前提下打印尽量详细的调试日志,遗憾的是,上述办法还是不能帮助问题定位,当然了,在不断的日志调试中,对代码和逻辑越来越熟悉。


BUG如何重现?

这时候的调试效率已经很低了,几万QPS连续压力测试,几个小时才出一次core,然后修改代码,添加调试日志。几天过去了,毫无进展。所以必须要在线下构造出稳定的core dump环境,这样才能加快Debug效率。


虽然还没有发现根本原因,但是发现了一个很可疑的地方: 出core比较集中,经常是在凌晨4、5点,早上7、8点的时候dump几十个core


弱网络环境的构造 traffic control

联想到夜间有很多的网络硬件调整及故障,我猜测这些core dump可能跟网络质量相关。特别是网络瞬时不稳定,很容易触发BUG导致大量的CORE DUMP。
 

最开始我考虑过使用TC(traffic control)工具来构造弱网络环境,但是转念一想,弱网络环境导致的结果是什么?显然是网络请求的各种异常啊,所以还不如直接构造各种异常请求来复现问题。于是准备构造测试工具和环境,需要满足两个条件:


  1. 并发性能强,能够同时发送数万甚至数十万级以上qps。

  2. 请求需要一定概率的异常。特别是TCP握手及SSL握手阶段,需要异常中止。


traffic control是一个很好的构造弱网络环境的工具,我之前用过测试SPDY协议性能。能够控制网络速率、丢包率、延时等网络环境,作为iproute工具集中的一个工具,由linux系统自带。但比较麻烦的是TC的配置规则很复杂,facebook在tc的基础上封装成了一个开源工具apc,有兴趣的可以试试。


WRK压力测试工具

由于高并发流量时才可能出core,所以首先就需要找一个性能强大的压测工具。 


WRK是一款非常优秀的开源HTTP压力测试工具,采用多线程 + 异步事件驱动的框架,其中事件机制使用了redis的ae事件框架,协议解析使用了Nginx的相关代码。 


相比ab(apache bench)等传统压力测试工具的优点就是性能好,基本上单台机器发送几百万pqs,打满网卡都没有问题。 
 

wrk的缺点就是只支持HTTP类协议,不支持其他协议类测试,比如protobuf,另外数据显示也不是很方便。

Nginx的测试用法: wrk -t500 -c2000 -d30s https://127.0.0.1:8443/index.html

分布式自动测试系统的构建

由于是HTTPS请求,使用ECDHE_RSA密钥交换算法时,客户端的计算消耗也比较大,单机也就10000多qps。也就是说如果server的性能有3W qps,那么一台客户端是无法发送这么大的压力的,所以需要构建一个多机的分布式测试系统,即通过中控机同时控制多台测试机客户端启动和停止测试。


之前也提到了,调试效率太低,整个测试过程需要能够自动化运行,比如晚上睡觉前,可以控制多台机器在不同的协议,不同的端口,不同的cipher suite运行整个晚上。白天因为一直在盯着,运行几分钟就需要查看结果。


这个系统有如下功能: 


  1. 并发控制多台测试客户端的启停,最后汇总输出总的测试结果。 

  2. 支持https,http协议测试,支持webserver及revers proxy性能测试。 

  3. 支持配置不同的测试时间、端口、URL。 

  4. 根据端口选择不同的SSL协议版本,不同的cipher suite。 

  5. 根据URL选择webserver、revers proxy模式。


异常测试请求的构造

压力测试工具和系统都准备好了,还是不能准确复现core dump的环境。接下来还要完成异常请求的构造。构造哪些异常请求呢? 
 

由于新增的功能代码主要是和SSL握手相关,这个过程是紧接着TCP握手发生的,所以异常也主要发生在这个阶段。于是我考虑构造了如下三种异常情形:


  1. 异常的tcp连接。即在客户端tcp connent系统调用时,10%概率直接close这个socket。

  2. 异常的ssl连接。考虑两种情况,full handshake第一阶段时,即发送client hello时,客户端10%概率直接close连接。full handshake第二阶段时,即发送clientKeyExchange时,客户端10%概率直接直接关闭TCP连接。

  3. 异常的HTTPS请求,客户端10%的请求使用错误的公钥加密数据,这样Nginx解密时肯定会失败。



Core Bug fix小结

构造好了上述高并发压力异常测试系统,果然,几秒钟之内必然出core。有了稳定的测试环境,那Bug fix的效率自然就会快很多。 


虽然此时通过gdb还是不方便定位根本原因,但是测试请求已经满足了触发core的条件,打开Debug调试日志也能触发core dump。于是可以不断地修改代码,不断地GDB调试,不断地增加日志,一步步地追踪根源,一步步地接近真相。


最终通过不断地重复上述步骤找到了core dump的根本原因。其实在写总结文档的时候,core dump的根本原因是什么已经不太重要,最重要的还是解决问题的思路和过程,这才是值得分享和总结的。很多情况下,千辛万苦排查出来的,其实是一个非常明显甚至愚蠢的错误。


比如这次core dump的主要原因是: 
由于没有正确地设置non-reusable,并发量太大时,用于异步代理计算的connection结构体被Nginx回收并进行了初始化,从而导致不同的事件中出现NULL指针并出core。

 
内存泄漏

虽然解决了core dump,但是另外一个问题又浮出了水面,就是高并发测试时,会出现内存泄漏,大概一个小时500M的样子


valgrind的缺点

出现内存泄漏或者内存问题,大家第一时间都会想到valgrind。


valgrind是一款非常优秀的软件,不需要重新编译程序就能够直接测试。功能也非常强大,能够检测常见的内存错误包括内存初始化、越界访问、内存溢出、free错误等都能够检测出来。推荐大家使用。


valgrind运行的基本原理是: 待测程序运行在valgrind提供的模拟CPU上,valgrind会纪录内存访问及计算值,最后进行比较和错误输出。
 

我通过valgrind测试Nginx也发现了一些内存方面的错误,简单分享下valgrind测试Nginx的经验:


  1. Nginx通常都是使用master fork子进程的方式运行,使用–trace-children=yes来追踪子进程的信息

  2. 测试Nginx + openssl时,在使用rand函数的地方会提示很多内存错误。比如Conditional jump or move depends on uninitialised value,Uninitialised value was created by a heap allocation等。这是由于rand数据需要一些熵,未初始化是正常的。如果需要去掉valgrind提示错误,编译时需要加一个选项:-DPURIFY

  3. 如果Nginx进程较多,比如超过4个时,会导致valgrind的错误日志打印混乱,尽量减小Nginx工作进程,保持为1个。因为一般的内存错误其实和进程数目都是没有关系的。


上面说了valgrind的功能和使用经验,但是valgrind也有一个非常大的缺点,就是它会显著降低程序的性能,官方文档说使用memcheck工具时,降低10-50倍


也就是说,如果Nginx完全握手性能是20000 qps,那么使用valgrind测试,性能就只有400 qps左右。对于一般的内存问题,降低性能没啥影响,但是我这次的内存泄漏是在大压力测试时才可能遇到的,如果性能降低这么明显,内存泄漏的错误根本检测不出来。


只能再考虑其他办法了。


AddressSanitizer的优点

address sanitizer(简称asan)是一个用来检测c/c++程序的快速内存检测工具。相比valgrind的优点就是速度快,官方文档介绍对程序性能的降低只有2倍。 


对Asan原理有兴趣的同学可以参考asan的算法这篇文章,它的实现原理就是在程序代码中插入一些自定义代码,如下:

\


和valgrind明显不同的是,asan需要添加编译开关重新编译程序,好在不需要自己修改代码。而valgrind不需要编程程序就能直接运行。 


address sanitizer集成在了clang编译器中,GCC 4.8版本以上才支持。我们线上程序默认都是使用gcc4.3编译,于是我测试时直接使用clang重新编译Nginx:

--with-cc="clang" \

--with-cc-opt="-g -fPIC -fsanitize=address -fno-omit-frame-pointer"

 

其中with-cc是指定编译器,with-cc-opt指定编译选项, -fsanitize=address就是开启AddressSanitizer功能。


由于AddressSanitizer对Nginx的影响较小,所以大压力测试时也能达到上万的并发,内存泄漏的问题很容易就定位了。


这里就不详细介绍内存泄漏的原因了,因为跟openssl的错误处理逻辑有关,是我自己实现的,没有普遍的参考意义。 


最重要的是,知道valgrind和asan的使用场景和方法,遇到内存方面的问题能够快速修复。


性能热点分析

到此,经过改造的Nginx程序没有core dump和内存泄漏方面的风险了。但这显然不是我们最关心的结果(因为代码本该如此),我们最关心的问题是:

1. 代码优化前,程序的瓶颈在哪里?能够优化到什么程度? 
2. 代码优化后,优化是否彻底?会出现哪些新的性能热点和瓶颈? 


这个时候我们就需要一些工具来检测程序的性能热点。


perf,oprofile,gprof,systemtap

Linux世界有许多非常好用的性能分析工具,我挑选几款最常用的简单介绍下: 


  1. [perf](Perf Wiki)应该是最全面最方便的一个性能检测工具。由linux内核携带并且同步更新,基本能满足日常使用。推荐大家使用。 

  2. oprofile,我觉得是一个较过时的性能检测工具了,基本被perf取代,命令使用起来也不太方便。比如opcontrol --no-vmlinux , opcontrol --init等命令启动,然后是opcontrol --start, opcontrol --dump, opcontrol -h停止,opreport查看结果等,一大串命令和参数。有时候使用还容易忘记初始化,数据就是空的。 

  3. gprof主要是针对应用层程序的性能分析工具,缺点是需要重新编译程序,而且对程序性能有一些影响。不支持内核层面的一些统计,优点就是应用层的函数性能统计比较精细,接近我们对日常性能的理解,比如各个函数时间的运行时间,,函数的调用次数等,很人性易读。 

  4. systemtap 其实是一个运行时程序或者系统信息采集框架,主要用于动态追踪,当然也能用做性能分析,功能最强大,同时使用也相对复杂。不是一个简单的工具,可以说是一门动态追踪语言。如果程序出现非常麻烦的性能问题时,推荐使用systemtap。


这里再多介绍一下perf命令,Linux系统上默认都有安装,比如通过perf top就能列举出当前系统或者进程的热点事件,函数的排序。 


perf record能够纪录和保存系统或者进程的性能事件,用于后面的分析,比如接下去要介绍的火焰图。


火焰图 flame graph

perf有一个缺点就是不直观。火焰图就是为了解决这个问题。它能够以矢量图形化的方式显示事件热点及函数调用关系。 


比如我通过如下几条命令就能绘制出原生Nginx在ecdhe_rsa cipher suite下的性能热点:


  1. perf record -F 99 -p PID -g -- sleep 10

  2. perf script | ./stackcollapse-perf.pl > out.perf-folded

  3. /flamegraph.pl out.perf-folded>ou.svg


\


直接通过火焰图就能看到各个函数占用的百分比,比如上图就能清楚地知道rsaz_1024_mul_avx2和rsaz_1024_sqr_avx2函数占用了75%的采样比例。那我们要优化的对象也就非常清楚了,能不能避免这两个函数的计算?或者使用非本地CPU方案实现它们的计算? 


当然是可以的,我们的异步代理计算方案正是为了解决这个问题。


\


从上图可以看出,热点事件里已经没有RSA相关的计算了。至于是如何做到的,后面有时间再写专门的文章来分享。


心态

为了解决上面提到的core dump和内存泄漏问题,花了大概三周左右时间。压力很大,精神高度紧张, 说实话有些狼狈,看似几个很简单的问题,搞了这么长时间。心里当然不是很爽,会有些着急,特别是项目的关键上线期。但即使这样,整个过程我还是非常自信并且斗志昂扬。我一直在告诉自己:


  1. 调试BUG是一次非常难得的学习机会,不要把它看成是负担。不管是线上还是线下,能够主动地,高效地追查BUG特别是有难度的BUG,对自己来说一次非常宝贵的学习机会。面对这么好的学习机会,自然要充满热情,要如饥似渴,回首一看,如果不是因为这个BUG,我也不会对一些工具有更深入地了解和使用,也就不会有这篇文档的产生。

  2. 不管什么样的BUG,随着时间的推移,肯定是能够解决的。这样想想,其实会轻松很多,特别是接手新项目,改造复杂工程时,由于对代码,对业务一开始并不是很熟悉,需要一个过渡期。但关键是,你要把这些问题放在心上。白天上班有很多事情干扰,上下班路上,晚上睡觉前,大脑反而会更加清醒,思路也会更加清晰。特别是白天上班时容易思维定势,陷入一个长时间的误区,在那里调试了半天,结果大脑一片混沌。睡觉前或者上下班路上一个人时,反而能想出一些新的思路和办法。

  3. 开放地讨论遇到问题不要不好意思,不管多简单,多低级,只要这个问题不是你google一下就能得到的结论,大胆地,认真地和组内同事讨论。这次BUG调试,有几次关键的讨论给了我很大的启发,特别是最后reusable的问题,也是组内同事的讨论才激发了我的灵感。谢谢大家的帮助。


Read full article from 腾讯高级工程师:一道面试题引发的高并发性能调试思考 - 其他 - DBAplus社群——围绕数据库、大数据、PaaS云,运维圈最专注围绕"数据"的学习交流和专业社群


我的Java后端书架 (2016年暮春3.0版) | 江南白衣



我的Java后端书架 (2016年暮春3.0版) | 江南白衣

书架主要针对Java后端开发。

3.0版把一些后来买的、看的书添补进来,又或删掉或降级一些后来没有再翻开过的书。

更偏爱那些能用简短流畅的话,把少壮不努力的程序员所需的基础补回来的薄书,而有些教课书可能很著名,但干涩枯燥,喋喋不休的把你带回到大学课堂上昏昏欲睡,不录。
 

1. 操作系统与网络的书

《Linux内核设计与实现 第3版》
Robert Love用最薄的篇幅,顺畅的文字将Linux内核主要的算法讲清楚了,《深入理解Linux内核》《深入Linux内核架构》之类厚厚的全是代码,不是专门的内核程序员看这本足够了。

《Linux系统编程 第2版》
继续是Robert Love,比起APUE也是以薄见长,专门针对重要的系统调用讲解。


Read full article from 我的Java后端书架 (2016年暮春3.0版) | 江南白衣


小团队玩不转的测试 | kazaff's blog



小团队玩不转的测试 | kazaff's blog

Karma

Karma作为测试套件的执行器(test runner),为我们的测试框架提供测试环境的,它的安装和配置简单的我都想哭了。不过好像它并无法直接进行端到端测试,github上有一个扩展:karma-e2e-dsl是专门做这件事儿的,有兴趣的可以看看。

Atomus

Atomus给自己定位很准确,就是轻量级UI测试套件,重点提到了它可以支持局部界面测试,其实就是利用了jsdom提供的能力来灵活的做到了js+html联调,思路不错,不过github上的关注度和活跃度不算高。

Casperjs

类似Atomus,但是Casperjs更加的强大,它是基于PhantomJS来实现浏览器模拟的,并提供了强大的测试API,该项目的关注度也很高,值得好好看看。

google上可以找到比较多的使用casperjs配合mocha和chai来做端到端测试的资料,这也是目前我比较中意的组合。

chrome上还有一个casperjs的插件:Resurrectio,用来帮助我们通过直接在页面上操作来录制测试脚本,虽然作者好像已经不再维护这个项目,但经测试依然可以满足一些简单的场景。

Mocha + Chai + Sinon

这套黄金搭档在面对单元测试时基本上所向无敌,不过如果是做端到端测试,我们几乎不需要做mock或stub,所以Sinon就可以先放一边。Mocha配合Chai可以提供标准的测试所需功能,是目前最新的测试框架之一。所以之后我在搭建具体测试环境的时候也会优先选择这俩工具。

PhantomFlow

如果你想要一份屌炸天的测试报告,那PhantomFlow应该是一个开箱即用的工具了,它基于我们上面提到的一些工具,并提供了各种漂亮的展示模版,很适合装逼用。

Page-Monitor

上面说的都是功能测试为主,最后我们来说一下界面测试,国人大牛提供了Page-Monitor工具,可以帮我们对比界面的差异,使用方法非常简单,具体可以根据官方步骤来做,目前这不是我的关注点。


Read full article from 小团队玩不转的测试 | kazaff's blog


Respondable: Write Better Emails with Boomerang for Gmail



Respondable: Write Better Emails with Boomerang for Gmail

Add an assistant that uses artificial intelligence to help you write better, more actionable emails in real time. Based on data from millions of messages, Respondable makes every email you send more effective.


Read full article from Respondable: Write Better Emails with Boomerang for Gmail


软件工程师,是时候打造你自己的流水线了 - 极光日报 - 知乎专栏



软件工程师,是时候打造你自己的流水线了 - 极光日报 - 知乎专栏

简评:作者在苦口婆心地劝你单干,不要在大公司呆。因为作为软件工程师的你,现在云计算时代构建一个服务代价如此地低,你完全可以去打造自己的流水线,当老板,做你自己想做的事情,并且收获更多。

软件工程师经常深陷于职业中,完全投入于软件维护,而不是开发新产品。

这篇文章:

  1. 概述为什么大公司经常为工程师给的报酬不高,并且提供的不那么认人满意的工作;
  2. 建议工程师寻求脱离流水线式的开发工作。

工业革命之后,人们开始在流水线上工作。

在流水线上,工人的工作职责范围很窄。流水线是一种有弹性的、一贯性的生产机制,因为每个岗位的职责定义非常明确,工人很容易被替代。

生产线工人如此地容易被替代,就像一个商品一样 - 拿过来就用。

对于这些工人,成为商品当然不是好事。你是也没有其他的好办法。你不能简单地离开生产线,去弄自己的(你的能力只限于非常窄的领域)。

这个生产线模式持续到了信息时代。

大部分软件工程师与流水线的工人具有同样的职业路径,刚开始影响力有限(只是一个螺丝钉)。我们遵从于大公司的需求来做些没有意思的工作。

是的,这个世界也要商品化你。

如果你只从这篇文章取一句话,就是这句:现在,构建你自己的流水线,变得容易了。

20 年前,大软件公司里的工具都很复杂,超出了个人购买范围。

然后,亚马逊云服务(AWS)把服务器的租用与维护费用从 5 万美元几乎降为 0。

AWS 催生了像 Dropbox, Trello, Slack 这样的很棒的免费服务。这些便宜的工具彼此集成,大大地提高了个人的生产力。

SaaS 工资彼此联结在一起,产生更好的工具。可用的软件功能以惊人的速度被催生出来。

在公开软件领域,云计算导致了非常大的效果提升,从而个人或者小团队可以打造技术栈,并且通常工作效率比大公司更高。

大公司非常依赖于他们的工具,难以受益于这些快速组合的软件功能。而在大公司之外,只要你觉得合适,就可以混合、匹配工具。

软件工具是生产手段,相当于 19 世纪生产线的实业家,这些生产手段的使用现在变得分散了。

实际上,整个经济体变得去中心化了。

。。。

理解一点:单个工程师的杠杆效率是很大的,比之前任何时候都大。小团队的杠杆效率更大。

然后,是做什么,与怎么做的问题。建议阅读原文。

。。。

有些人更愿意呆在大公司做流水线的一员,接下来作者反驳了几个观点。


1. 所得:大公司拿得更多。在大公司,大部分钱被生产线创建者拿去了,而不是维护与构建的人(实际去干活的人)。


2. 忠诚:需要有人来做这个工作。很多员工离开大公司觉得内疚。他们的工作对公司非常重要 - 没有他公司如何运转啊。

如果你的工作对公司真那么重要,那么你应该去找你的经理,要求把工资涨到你的工作所创造的价值的水平。如果他不同意给你涨,这意味着替换掉你没事。


3. 稳定性:大公司更安全。更安全的投资是,锻炼你自己的创新与独立的能力。而不是呆在大公司。

4. 影响力:大公司的平台让我更能发挥。当你自己打造一个产品,最好的使用场景是吸引人。你获得这个产品 100% 的价值,你控制整个的创造过程。大公司里做创新这些都是没有保障的。


5. 导师制:大公司是学习的好地方。大公司里的导师制的问题在于,它给你洗脑,同样的方式,它也给你的导师洗过脑。


本文编译与节选自:You Are Not A Commodity. 建议阅读原文。


Read full article from 软件工程师,是时候打造你自己的流水线了 - 极光日报 - 知乎专栏


Go1.7中程序结构的解析



Go1.7中程序结构的解析

Go 1.7终于发布了,这个版本的一大特色是引入了一个新的基于SSA的编译器! SSA是一个描述低层次的操作集合的方法,比如隐射到系统底层操作的加载和存储操作。而SSA的特殊之处在于它有无限数量的寄存器。它本身不是特别有趣,除了它启用了一类很容易理解的优化传值这一点以外,因为这个特性使得编译速度更快,编译出的二进制文件更小。Go的新版本发布说明实现正在成熟,并且开始利用llvm(wider world of compiler technology)中的技术和实践。


Read full article from Go1.7中程序结构的解析


AI Is Here to Help You Write Emails People Will Actually Read | WIRED



AI Is Here to Help You Write Emails People Will Actually Read | WIRED

subscribe Phone Charger. That email you just wrote is rude. So says Boomerang: bit.ly/2bfruQO Date of Publication: 08.23.16. 7:00 am AI Is Here to Help You Write Emails People Will Actually Read Slide: 1 / of 5 . Caption: Respondable analyzes your email message and predicts how likely it is to get a response based on several different factors.Boomerang Slide: 2 / of 5 . Caption: An email can score poorly in one or more areas and still be be considered a "respondable" email.Boomerang Slide: 3 / of 5 . Caption: Respondable analyzes your email message and predicts how likely it is to get a response based on several different factors.Boomerang Slide: 4 / of 5 . Caption: You can click on any given factor to learn more about how to improve it.Boomerang Slide: 5 / of 5 . Caption: It may not be a surprise that simple emails get more responses. But it's possible to be too simple.Boomerang Related Galleries Slide: 1 / of 5 Caption:

Read full article from AI Is Here to Help You Write Emails People Will Actually Read | WIRED


puer-mock/why-your-need-a-mock-server.md at master · ufologist/puer-mock · GitHub



puer-mock/why-your-need-a-mock-server.md at master · ufologist/puer-mock · GitHub

前后端分离之后

前后端分离后, 大家从此进入了所谓的并行开发时代. 一旦完成前后端的(边界)分工, 大家就可以各司其职了.

前端在与后端交互时, 要想有效地提高工作效率, 后端的接口文档就是重中之重了.

接口文档还不够

所谓的接口文档, 即一份数据的契约书. 前端的所有逻辑和展现全部依赖接口文档中规定的数据结构.

但是光有接口文档不足以提升前端的开发效率, 因为前端开发时, 必须调用实实在在的接口和数据才能看到结果, 尽早跑通所有的前端流程, 这才是效率的根本.

在前后端并行开发的时代, 前端开发时, 后端也才开发, 接口还没有开发完, 后端拿什么给前端调用.

那么问题来了, 我们怎么做一份能够调用的接口文档呢?


Read full article from puer-mock/why-your-need-a-mock-server.md at master · ufologist/puer-mock · GitHub


Go1.7让二进制文件变得更小(翻译)



Go1.7让二进制文件变得更小(翻译)

测试这个特性,我采用了一个更大的生产环境程序,jujud,其体积从94MB减小为67MB。

地址无关的二进制文件可以减小50%。地址无关的可执行程序(PIE)中,在只读数据段的指针需要动态重映射。因为新的类型信息格式通过段偏移单元代替了了指针,这样,每个指针节省了28个字节。

移除调试信息的地址无关的可执行程序对于移动开发者很重要,因为这是发布到手机端的程序。因为下载大体积的应用程序的用户体验差,所以体积减少对他们来说是个好消息。

未来的工作

一些运行时类型信息的改变没有赶上Go1.7版本冻结,但是希望会在1.8版本加入。这些会进一步减小程序体积,尤其是对地址无关的程序。

这些改变都是保守的,减小二进制文件的体积不会增加编译时间、启动时间、整体的运行时间以及内存使用量。我们会进行更彻底的做法来减小二进制文件的体积:upx工具可以把二进制文件的体积进一步压缩50%,代价是增加启动时间和潜在的内存使用量。针对非常小的系统(可能在钥匙挂上),我们会编译一个没有反射的Go,虽然还不确定这样一个有限制的语言是否是非常有用。在运行时中,当计算每个kb字节时,我们会使用稍微慢点但是更紧凑的算法。所有的这些需要在后续的开发周期中做更多的调研。



Read full article from Go1.7让二进制文件变得更小(翻译)


美颜Java - 简书



美颜Java - 简书

Scala是设计DSL的利器。

借助于柯里化,及其漂亮的大括号语法,使得Scala创建自定义的「控制结构」变得非常容易;同时可以有效地除去冗余的语法噪声,提升代码的可读性。


    Read full article from 美颜Java - 简书


    【第678期】不思量,自难忘:我的10年程序生涯



    【第678期】不思量,自难忘:我的10年程序生涯

    1.我一直在庆幸遇到了几个非常照顾我的领导,还有一个非常有能力的领导。回想当年魔鬼赛程一样的日子,我其实更希望在年轻的时候能有这样的领导对我严格要求。当年我已拖家带口,性格已基本成型,所以改变的过程非常痛苦。


    2.坚持两个字说起来非常容易,做起来非常之难。当你在巨大压力下,比别人多坚持一步,也许你就看到黎明的阳光。


    3.关于学历,年轻时候还是要能够尽量的提升。我们一个领导说过,35岁前要能把能够拿到的证都拿到。我现在考过了PMP和OCP,正在积极备考软考。这些硬件,说不定哪个机会来时,就会用的到。


    4.关于学习,我走了很多弯路,从早期的C到VB6和ASP,以及现在用的java,c#和php,还有前端jquery,jquerymobile,bootstrap,extjs,手机客户端(包括原生开发和ionic、weex,rect native等跨平台技术),微信公众号开发等。每有一项新技术,我都忍不住要去学习,结果是多而不精,都会些皮毛,做起来有模有样,一深入就不行了。如果再给我一次机会,我希望我能够做到一专多能。在某一方面深入的研究下去,其他的了解就可以了。


    5.非常讨厌一些人,他们负能量满满,整天抱怨工资低,工作多什么的。你跟这些人在一起,会或多或少的受他们影响。要么想办法改变,要么就走,请收起你的抱怨。最起码不要跟我抱怨。


    6.关于一些离开的人,他们总是不经意表现出好的一面,对留下来的人造成影响。不管对谁来说,能力才是最重要的,不要只看表面的东西,很多时候你浅尝辄止,轻易放弃,相信你到其他地方也是一样。


    7.每个时代都有每个时代的机会,能够抓住机会的就是那些出类拔萃的人。我们这些凡夫俗子,能做的就是提升自己的能力,说不定也有什么机会能够抓住呢?能够提升一下生活质量也是好事情。



    Read full article from 【第678期】不思量,自难忘:我的10年程序生涯


    我在创业公司这八个月 | wangyan9110's blog



    我在创业公司这八个月 | wangyan9110's blog

    在来创业公司我早已做好整天加班的准备,但是没想到到了之后,加班的强度远超我的预期,但是我还是熬过来。以前在大公司有着上班下班时间,还有双休,但是来到这家公司之后,除了写代码就是睡觉,一天工作14到16个小时,这样持续了一个多月。最后这一个月我做出了我们产品的1.0版本。
    在后来我们组建了我们技术团队。我一方面需要有自己的开发任务,另外还需要指导其他技术人员。帮助整个技术团队提高技术。另外也不再是完成自己的目标,需要考虑整个技术团队,完成整个团队的目标。在5月份我们做我们APP产品的开发,开发周期非常紧,但是团队成员又总有一两个人有各种事情需要请假。我们团队从未抱怨、互帮互助,以团队目标为重,每人每天都要工作12小时左右,最后还有一周两次通宵。快速的完成了我们APP的产品的上线。这段日子也是整个我们团队非常怀念的日子。我们现在也时常提起那段日子。也正是那段日子,建立了我们团队兄弟般的情谊。
    我们团队非常年轻,也正是这样的年轻的团队才有了整个团队ALL IN的状态。

    技术

    在创业公司,早期流量不是很大,主要是实现业务为主,遇到不了太多的技术难题。但是需要的是技术的特种兵、多面手,从技术选型、需求分析、系统架构、详细设计、代码实现、上线、运维,往往都需要一个人来完成。代码实现不仅仅是后端还包括前端,在很长一段时间内前后端都是我一个人完成的。对于技术选型、技术架构和详细设计,在创业公司都有自己的特点,这个我会写一个系列,讲解创业公司技术选型和技术架构、详细设计相关的内容。
    我们团队大多数是应届生、实习生或者刚毕业一年。项目经验不足是这个团队的特点,但是对于学习技术热情要比很多团队好的多。对于这个情况而言,我很清楚现在这个阶段对团队来讲养成良好的代码规范、分析设计思路的重要性。我自己也是有对自己的代码规范、分析设计思路影响比较大的前辈。我在指导他们的同时,时常想起我在智学网的那段经历。我就按当时作年指导我的思路,培养他们,这也算是一种传承。

    产品技术

    我个人把产品和技术看做成有机的整体,我们这虽然有产品部、技术部但是我觉得应该合并叫产品技术部。我加入创业公司,是希望做一个从0到1的产品,对于产品的关注有时高于技术。我也经常和产品讨论一些自己的思路,也和一些产品形成了很多的默契。对于一个互联网创业公司的技术来讲,自己的价值也在于做出一个对于用户有价值的产品。所以我们在技术评审时,也时常让产品讲一些关于做这个功能对于用户的价值,分享一些我们做过功能的数据,来体现我们的价值。
    我们的产品属于强业务型,业务的需求比较多样。业务逻辑相对复杂。产品需要接收从市场、客户、运营、老板的需求,这样产品没办法系统性的去梳理产品需求。到技术评审时,可能会有这样那样的问题,有时评审时没有发现,到测试时发现这样问题。对于问题发现的越早,越容易解决。所以对于技术评审也是我非常关注的一个环节。


    Read full article from 我在创业公司这八个月 | wangyan9110's blog


    【新提醒】AppFolio电面一面面经【一亩三分地论坛面经版】 - Powered by Discuz!



    【新提醒】AppFolio电面一面面经【一亩三分地论坛面经版】 - Powered by Discuz!

    还是一个月前的先是唠唠嗑问问项目然后就开始做题
    用的是skype视屏 + google doc
    给的题目我还挺意外的,感觉不是特别算法类

    1. 给一个是密码:
    1) 必须包含大小写
    2)必须含有特殊字符!#¥#@等等
    3)必须长度8位以上
    4)不能连续3个同样的字符

    . visit 1point3acres.com for more.
    2. 给一个用户名,然后给了一些validation的条件,和上题差不多

    . 1point 3acres 璁哄潧
    感觉用正则比较快。1.4是leetcode第三题,Longest Substring Without Repeating Characters
    自己迅速写出来很高兴,面试管还自己找了几个test都过了
    结果面完回想,因为当时太激动了,有几个corner case没想到,有bug吧

    Read full article from 【新提醒】AppFolio电面一面面经【一亩三分地论坛面经版】 - Powered by Discuz!


    It’s hard to imagine a much worse pitch Donald Trump could have made for the black vote - The Washington Post



    It's hard to imagine a much worse pitch Donald Trump could have made for the black vote - The Washington Post

    The inside track on Washington politics. Be the first to know about new stories from PowerPost. Sign up to follow, and we'll e-mail you free updates as they're published. You'll receive free e-mail news updates each time a new story is published. You're all set! The inside track on Washington politics. Be the first to know about new stories from PowerPost. Sign up to follow, and we'll e-mail you free updates as they're published. You'll receive free e-mail news updates each time a new story is published. You're all set! Donald Trump smiles during a roundtable discussion about national security on Aug. 17 at his Trump Tower office in New York City. (Gerald Herbert/AP) At a rally Friday night in Dimondale, Mich., Donald Trump repeated a version of a plea to black voters that he had offered 24 hours earlier in North Carolina. "No group in America has been more harmed by Hillary Clinton's policies than African Americans," he said, apparently pointing to individuals in the crowd. "No group.

    Read full article from It's hard to imagine a much worse pitch Donald Trump could have made for the black vote - The Washington Post


    Google announces new Google Classroom features for back to school



    Google announces new Google Classroom features for back to school

    The day is approaching when kids will be back in school and out of your hair. For schools that use Google Classroom, there will be a number of nifty new features to help both kids and their parents stay on top of things. There's even a new tool for VR field trips, no permission slips needed. There are three big new things going on in Google Classroom, along with a few smaller additions. The first big one is email summaries. Teachers who use Google Classroom will be able to generate automatic summaries of a student's work on a daily or weekly basis and send them to parents. That makes grounding much more efficient—maybe next Google will automate that too. In addition, the Google Classroom app is getting a cool annotation capability. Teachers will be able to draw on students' homework and documents. Students can also use annotations to work out problems. There's a new VR app for Google Classroom today too—it's called Expeditions .

    Read full article from Google announces new Google Classroom features for back to school


    自用推荐!美国代购Nicorette男士尼古丁戒烟糖4mg 27粒 最有效_淼妈_新浪博客



    自用推荐!美国代购Nicorette男士尼古丁戒烟糖4mg 27粒 最有效_淼妈_新浪博客

    .服用戒烟硬糖后吸烟会觉得恶心,所以开始一段时期烟瘾来的时

    候需含一块口香.糖。大概一个月左右想抽烟的欲望就会小很多。而

    戒烟硬糖不会上瘾,所以含的次数就会减少很多,慢慢可减为半块。

    2.大部分人在服用戒烟硬糖两三个月左右时,就基本上没有烟瘾

    了,所以就会停用,我的建议是除非你很少接触吸烟人群,否

    则一定要备用戒烟糖到六个月。

    3.戒烟期间要多喝一些水,帮助体内排毒。

    4.戒烟糖的优点就是服用方便,我个人觉得比戒烟贴更方便。


    Read full article from 自用推荐!美国代购Nicorette男士尼古丁戒烟糖4mg 27粒 最有效_淼妈_新浪博客


    The Most Popular Java Tools for Every Phase of Development - DZone Java



    The Most Popular Java Tools for Every Phase of Development - DZone Java

    Just because a tool is the most popular doesn't mean it's the "best." What's best is always context-dependent in programming. However, popularity is an undeniably important metric when choosing between a handful of similar tools. It's not the popularity itself that adds to a tool's value; it's the greater supply of resources and support from the larger community of a given tool.

    Popular tools are easier to learn because so many people can help you use them. And popular open-source tools tend to be less buggy because more eyes are on the code and more people are testing it in a greater number of scenarios.

    So, while there's always a counterpoint like Apache and Nginx — two web servers: Apache is used on more websites, but Nginx is used more by the top sites on the web, which means its used by some of the best engineering teams — in a lot of cases, popularity can be a key differentiator between tools.

    This list covers most of the important things you need tools for when developing Java applications. It covers each category by providing the "Top" most popular tool, and also provides a "Runner-up," with some context and citations from large Java community surveys proving these placements. Java beginners should have a look at all of these top tools to get more familiar with the ecosystem.


    Read full article from The Most Popular Java Tools for Every Phase of Development - DZone Java


    【新提醒】提供Oracle内推,Cloud大量招人,求贤若渴【一亩三分地论坛内推版】 - Powered by Discuz!



    【新提醒】提供Oracle内推,Cloud大量招人,求贤若渴【一亩三分地论坛内推版】 - Powered by Discuz!

    马上就到新的毕业季了,相信很多同学开始了求职
    .1point3acres缃�虽然这个号是个马甲号无疑,主要是大号分有点高,几千分,不想用大号来发招人帖
    但是我求贤若渴的心是真诚的

    Oracle是老牌的软件公司了,但是随着cloud technology的发展,它也站在了历史的风口浪尖,可能大公司都是这样吧,有自己的黄金期,但是过了黄金期,不转型也只有死路一条
    转型是肯定的,但Oracle算是资格老的公司里盈利目前还很有保证的,相信在一段时间内还不太会变化。
    cloud部门现在在大量招人,投入很大,尤其是experienced hire,当然fresh grad也招不少
    . from: 1point3acres.com/bbs
    很高兴为大家提供internal referal,但是fulltime only,因为公司实习招的太少太少了
    fresh grad的话,GPA确实很重要,而且近一两年就业行情不好,光有GPA也不太够了,基本上现在的模式是,好学校高GPA or 次好学校高GPA好实习,别的组合可能也可以,但是就目前来看,我个人觉得这两种比较有希望。
    另外,特别牛的人,请不要给我发邮件,或者你发了我也不会推你,因为给你offer你也不会来,例如CMU CS在google实习过,stanford CS在facebook实习过之类的,主要是节省大家的时间,另外也给更多的不是特别牛的人机会,毕竟他们才是真正需要内推的人
    . Waral 鍗氬鏈夋洿澶氭枃绔�,
    如有兴趣,请发简历至,oracle.redwoodcity@gmail.com,并附上一段100字左右的英文自我介绍,主要是自己的技术长处,相关经验等
    或者你对具体的职位有兴趣,请把职位链接也发给我,否则的话就只是general referal
    我这边会一周统一进行一次推荐,抱歉不能对每一封邮件都回复,如果我这边提交内推的话,你是会收到系统邮件的

    Read full article from 【新提醒】提供Oracle内推,Cloud大量招人,求贤若渴【一亩三分地论坛内推版】 - Powered by Discuz!


    Verizon Wireless vs Verizon Communications - | DSLReports Forums



    Verizon Wireless vs Verizon Communications - | DSLReports Forums

    There seems to be the usual confusion in this thread between Verizon Communications (the landline company, with FIOS, and union labor issues), and Verizon Wireless (a non-union company). Verizon Communications has a majority stake in Verizon Wireless, but they are separate companies.

    Read full article from Verizon Wireless vs Verizon Communications - | DSLReports Forums


    有人知道TEksystems是干啥的? - JobHunting版 - 未名存档



    有人知道TEksystems是干啥的? - JobHunting版 - 未名存档

    TekSystem is not an ICC. It is the biggest staffing company in US and it is
    owned by white people. It works with many second-tier consulting companies
    and it is staffing for both full-time and consulting positions.

    Read full article from 有人知道TEksystems是干啥的? - JobHunting版 - 未名存档


    【新提醒】amazon ads组OA兼讨论hackerrank【一亩三分地论坛面经版】 - Powered by Discuz!



    【新提醒】amazon ads组OA兼讨论hackerrank【一亩三分地论坛面经版】 - Powered by Discuz!

    lz最近收到了amazon ads组的oa,看到其他一些地里的朋友也收到了类似的OA,希望大家都能进来讨论一下。我的OA是75分钟,具体几道题email里没说,但是看前人的面经,很有可能是3道。hackerrank的OA不同于本版大多数人经历的OA1->OA2->video标配,似乎通过OA表现好的直接onsite,表现一般的加一轮电面。已经完成OA的朋友,如能分享一下题目,不胜感激。lz花了一天的时间把面经版里所有疑似hackerrank OA的帖子全部整理了出来,在附件里

    Read full article from 【新提醒】amazon ads组OA兼讨论hackerrank【一亩三分地论坛面经版】 - Powered by Discuz!


    【新提醒】雅虎/Verizon 电面【一亩三分地论坛面经版】 - Powered by Discuz!



    【新提醒】雅虎/Verizon 电面【一亩三分地论坛面经版】 - Powered by Discuz!

    昨天面了一通领英今天转战雅虎。中午十二点面完,傍晚就收到了现场面试的邀请,看来是真缺人啊。贴面经之前实在忍不住唠嗑一下,虽然很多人已经不再考虑雅虎了,我也只是抱着试一试的态度让一位朋友内推一下,但心里还是多少有点敬佩和惋惜这位昔日的巨头。对于科技公司,20岁往往等价于传统公司的60岁,时代的变化是很多人都无法阻挡的,科技的日新月异很快就会让一大批一时愣神没跟上的公司淡出历史的舞台。记得几年前还在学校的时候,老教授们很感慨雅虎的处境,说它做了很多amazing work,但都没盈利,还有就是Sun公司。Anyway,说正经事了。

    正规传统的45分钟面试。面试官是个三姐,是个manager。因为平时听三哥英语习惯了,没啥大的压力。. more info on 1point3acres.com

    首先是各种非技术问题,谈项目经验,针对她感兴趣的问题提问,老实说就好。10多分钟结束。

    然后是算法题,很经典的问题:给一个英语单词list,将拥有相同字母组合的单词归为一类,然后将最后的分类结果返回。比如:stop, post, eat, tea, tops, apple,结果是三类:stop, post, tops; eat, tea; apple.(;是类别分隔符)。用hashmap就好。key的话我一开始是排序单词来做。follow up是有没有更快的生成key方法:hash算法,26进制或者Java的那个hash算法都行。17分钟时间。
    . 鐗涗汉浜戦泦,涓€浜╀笁鍒嗗湴
    最后又是机器学习问题。情景是这样:假设一个email account肯能被黑了,如何设计出feature set来判断出一个email account是否被黑。16分钟时间。

    Read full article from 【新提醒】雅虎/Verizon 电面【一亩三分地论坛面经版】 - Powered by Discuz!


    【新提醒】Coursera OA【一亩三分地论坛面经版】 - Powered by Discuz!



    【新提醒】Coursera OA【一亩三分地论坛面经版】 - Powered by Discuz!

    一个小时五道题,但是登录的时候有说期待半小时内完成。

    第一题编程50分,剩下4题各5分,也是要打个什么及格线么。

    找一个二维数组里每行lovely number个数,一个数没有重复数字就很lovely。每行就是两个数,上下限。反正我是暴力解,有一个test case超时,我也懒得整了……

    后四个选择题都很基本(然而并不觉得都做对了),遍历树,大O,基础知识,链表。而且好像基本都是三选,33.3%么至少。

    Read full article from 【新提醒】Coursera OA【一亩三分地论坛面经版】 - Powered by Discuz!


    【新提醒】bb店面 8/16【一亩三分地论坛面经版】 - Powered by Discuz!



    【新提醒】bb店面 8/16【一亩三分地论坛面经版】 - Powered by Discuz!

    3分钟秒了,结果白人小哥就开始不停follow up,问写完代码后我自己要怎样设定一些输入去检测代码的正确,我就说了一堆vector<int>的不同情况,结果似乎不是他的意思,我又想拿return个奇怪的结果?或者throw一个exception?他又说不用管具体函数的内容,就在函数声明这怎样让别人知道输入的格式。。。我就纳闷了,这能怎么改,然后就和他一直讨论,最后才搞懂他的意思是要自己定义一个新的class作为输入,在这个class中去保证输入的格式,比如vector<int>会有[1 -1 34]这种情况无法表示一个数。。。。。然后就没了,就提问了。我我以为这次就挂了,才一个题,结果今天居然收到了on site,自己都不敢相信。。。。感觉BB还是挺人性化的吧,首先你得保证写代码没问题,之后的话可能还是注重交流的过程。。。。

    Read full article from 【新提醒】bb店面 8/16【一亩三分地论坛面经版】 - Powered by Discuz!


    What's the difference between my Timeline and my Newsfeed? | Facebook Help Community | Facebook



    What's the difference between my Timeline and my Newsfeed? | Facebook Help Community | Facebook

    DIFFERENCE BETWEEN TIMELINE & HOMEPAGE/NEWSFEED

    Your Timeline, which is sometimes referred to as your profile, is your collection of the photos, stories and experiences that tell your story.

    News Feed—the center column of your home page—is a constantly updating list of stories from people and Pages that you follow on Facebook. News Feed stories include status updates, photos, videos, links, app activity and likes.

    Read full article from What's the difference between my Timeline and my Newsfeed? | Facebook Help Community | Facebook


    应用性能优化: 如何将应用延迟降低为 0 ms - 互联网技术和架构



    应用性能优化: 如何将应用延迟降低为 0 ms - 互联网技术和架构

    2. 应用业务之外的架构层次的修改

    假如不考虑程序的 BUG 或者代码本身的优化,在这之上的一个层次也可以有很多可以优化的方向。

    这里主要说明一个利用 最终一致性 的思路修改缓存系统对网页延迟的优化。

    Varnish 4.0 增加了一个新功能:

    Background (re)fetch of expired objects. On a cache miss where a stale copy is available, serve the client the stale copy while fetching an updated copy from the backend in the background.

    假如 cache miss,立刻返回给用户一个之前的旧版本缓存,然后再从应用服务器请求新的版本。这意味着如果缓存足够大,可以让用户 100% 访问到 Varnish 服务器上缓存的版本,而跳过后端服务器的延迟。这也是为什么标题写着降低到 0ms :-) 有点标题党了。

    具体的实现方式:

    1. 保证缓存存储足够大
    2. 保证 Grace 时间足够长(无限长)
    3. 假如 obj.ttl + obj.grace > 0s 则返回缓存,否则访问后端服务器。

    这样离保证用户 100 % 命中缓存还差一步,就是缓存的预热。为了避免第一个用户访问后端服务器,我们通过主动抓取的方式,或者叫做缓存推送的方式进行缓存的预热。方式很简单,逐个向每个 Varnish 实例请求网站的所有 URL。另外,新生成的 URL,首先进行预热。

    需要注意的是,这种方式只适合于用户对信息新旧不是非常敏感的场景,比如所有的媒体页面,说明页面,电商网站的产品说明页面,移动应用的 Feed API (跳出 Varnish,应用类似思路)。另外,这个方案适用于所有需要针对搜索引擎 SEO 进行延迟优化的场景。


    Read full article from 应用性能优化: 如何将应用延迟降低为 0 ms - 互联网技术和架构


    Java开发牛人十大必备网站 - 猩猩之火可以燎原 - 博客频道 - CSDN.NET



    Java开发牛人十大必备网站 - 猩猩之火可以燎原 - 博客频道 - CSDN.NET

    This is my collection of websites for advanced level Java developers. Those website provide news, answers to general questions or interview questions, great lectures, etc. Quality is the key factor of good websites. In my opinion, they all have the highest quality. In the following, I will also share how I use these websites for learning or for fun. You may think some sites are good for any level developers, but I think it is how they are used determines whether they are good sites for an advanced level Java developer.

    1. Stackoverflow

    Stackoverflow.com is probably the most popular website in the programming world. There are millions of good questions and answers. Learning an API or a programming language often rely on code examples, stackoverflow has a lot of code segments.

    Another good thing about stackoverflow is that it is social. You can view questions under some certain tags, e.g. "java" and "regex", then you can see what question is most frequently asked and most voted. This can serve as a good resource for learning, also a good resource to write popular topics of Java bloggers.


    Read full article from Java开发牛人十大必备网站 - 猩猩之火可以燎原 - 博客频道 - CSDN.NET


    程序员持续学习之道 | ShareCore



    程序员持续学习之道 | ShareCore

    我其实是一个悲观主义者,从开始成为一名程序员的那一天开始,我就对自己的职业充满着担忧。早期,我担忧的是我刚进入这一行,落后身边从事这一行多年的人太多,跟他们比,我一开始就处于"不公平"的起跑线上;二是当我稍微深入这行后,发现技术的道路充满了歧路和死胡同,稍不留神,就将落入再也跟不上技术进步的节奏,身边也充斥着类似的示例。

    好在在这条路上,我找到了一个克服担忧的良方:学习,坚持不懈的学习!

    人类最大的恐惧莫过于对未知的恐惧,而学习,是克服未知的一个最有效途径。那作为一个程序员,该如何才能做到坚持不懈的学习呢?我想主要有以下几点:

    1. 不抗拒变化,跟踪变化

    这里说的变化,更多指的是技术的变化。新技术永远层出不穷,如果你抗拒变化,或惧怕变化,在心里优势上就落后了一大截。很多程序员的技术道路越走越窄,当一门新技术来临时,他们从不去了解或研究,他们要么认为这是"换汤不换药"的"技术幌子",不值得去研究,要么等着别人去研究,自己被动的接受别人的结论与成果。诚然,等待别人的研究结果也可行,但是,当身边没有人去研究呢?当研究的人不愿意提供给你他的研究结果呢?当别人的结论和结果是错误的呢?

    当然,业界的新技术层出不穷,要去跟踪每一项新技术的变化也是不可能的,我的建议是尽量掌握基础的技术,越是基础的技术越是恒定。如计算机的体系架构,TCP,HTTP,各类编程范式,OOP,MVC架构等,都是好多年来没有发生过变化的技术了。许多新技术也是建立在他们上面,当你了解了这些基础的技术,建立在他们之上的新技术也就能很快掌握了,并能迅速而准确地对这些新技术作出"价值判断"。

    技术的变化,其实也并不全是指业界的新技术来临,更多指的是,超出自己当前技术能力外,主动研究和选择的"新技术" ,主动丢弃老的套路和技术,不固步自封。见过很多的程序员,他们写了很多年的代码了,技术能力还停留在数据库层写一个Sql(存储过程)+前端调用上。为什么如此呢?因为自开始写代码起,这样简单粗暴的方式就可以解决他们面对的问题了。所以,当碰到新的问题,他们就继续沿用着这种方式,而从不去看看业界是不是有更合适的方案来解决。长此以往,他们的技术能力也就不会有任何的变化,工作十年,只是将第一年所学的技术重复十年而已。

    2. 书宜杂读,业宜精钻

    建筑学家梁思成赴美留学,其父梁启超告诫说:你该挤出一部分时间学些常识性东西,特别是文学或人文科学,稍稍多用点工夫就能有大的收获。我深怕你因所学太专一,把多彩的生活弄得平平淡淡,生活过于单调,则生厌倦心理,厌倦一生即成苦恼之事……书宜杂读,业宜精钻。

    学习本身应该是一件很快乐的事情,但如果只是一味地沉浸于专业学习之中,难免会将本来快乐的事情弄成平淡和单调,更可怕的是,由此产生厌倦心理,放弃学习。

    所以,可以尽量跟随自己的兴趣,去更广泛地读书。历史,文学,心理学,哲学等等各方面的书都可以尝试去读,它们不仅丰富你的知识,更能让你在阅读中受到感动、教育和启迪。书读的更多更广泛,知道的事也就多,思路更加开阔,解决问题的能力也就能高于常人,从而反过来帮助到你专业能力的提升。

    3. 投资团队,积极打造学习型团队

    现代社会,难免的一点就是个人必须置身于群体之中,程序员更是如此。从群体心理学的角度来看,在群体里,个人的才智被削弱,异质性被同质性所吞没。由此,如果一个团队不爱学习,那么,其中的成员也很难坚持学习(个性和意志力特别强的人除外)。

    如果你爱学习,请想办法让你的团队也变得爱学习,这样,你对学习的坚持将变得更加容易。或许你认为建立学习氛围,是团队领导的事情,跟自己无关。领导当然可以来做也需要来做这样的事情,但要明白的一点,学习这事,如果变成从上向下,就难免"政治化"了,容易失去它本身的意义。而从下往上,更能建立轻松和谐的学习环境。


    Read full article from 程序员持续学习之道 | ShareCore


    Guava官方文档-RateLimiter类 | 并发编程网 – ifeve.com



    Guava官方文档-RateLimiter类 | 并发编程网 – ifeve.com

    RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证。如果必要的话,每个acquire() 会阻塞当前线程直到许可证可用后获取该许可证。一旦获取到许可证,不需要再释放许可证。

    校对注:RateLimiter使用的是一种叫令牌桶的流控算法,RateLimiter会按照一定的频率往桶里扔令牌,线程拿到令牌才能执行,比如你希望自己的应用程序QPS不要超过1000,那么RateLimiter设置1000的速率后,就会每秒往桶里扔1000个令牌。

    1com.google.common.util.concurrent.RateLimiter
    2 
    3@ThreadSafe
    4@Betapublic
    5abstract class RateLimiter extends Object


    RateLimiter经常用于限制对一些物理资源或者逻辑资源的访问速率。与Semaphore 相比,Semaphore 限制了并发访问的数量而不是使用速率。(注意尽管并发性和速率是紧密相关的,比如参考Little定律

    通过设置许可证的速率来定义RateLimiter。在默认配置下,许可证会在固定的速率下被分配,速率单位是每秒多少个许可证。为了确保维护配置的速率,许可会被平稳地分配,许可之间的延迟会做调整。
    可能存在配置一个拥有预热期的RateLimiter 的情况,在这段时间内,每秒分配的许可数会稳定地增长直到达到稳定的速率。

    举例来说明如何使用RateLimiter,想象下我们需要处理一个任务列表,但我们不希望每秒的任务提交超过两个:

    1//速率是每秒两个许可
    2final RateLimiter rateLimiter = RateLimiter.create(2.0);
    3 
    4void submitTasks(List tasks, Executor executor) {
    5    for (Runnable task : tasks) {
    6        rateLimiter.acquire(); // 也许需要等待
    7        executor.execute(task);
    8    }
    9}

    再举另外一个例子,想象下我们制造了一个数据流,并希望以每秒5kb的速率处理它。可以通过要求每个字节代表一个许可,然后指定每秒5000个许可来完成:

    1// 每秒5000个许可
    2final RateLimiter rateLimiter = RateLimiter.create(5000.0);
    3 
    4void submitPacket(byte[] packet) {
    5    rateLimiter.acquire(packet.length);
    6    networkService.send(packet);
    7}

    有一点很重要,那就是请求的许可数从来不会影响到请求本身的限制(调用acquire(1) 和调用acquire(1000) 将得到相同的限制效果,如果存在这样的调用的话),但会影响下一次请求的限制,也就是说,如果一个高开销的任务抵达一个空闲的RateLimiter,它会被马上许可,但是下一个请求会经历额外的限制,从而来偿付高开销任务。注意:RateLimiter 并不提供公平性的保证。


    Read full article from Guava官方文档-RateLimiter类 | 并发编程网 – ifeve.com


    Labels

    Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

    Popular Posts