Blog

Leetcode-Maximum Subarray


最近在leetcode上看到一个有趣的题目Maximum Subarray,跟大家分享一下,题目如下: Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [-2,1,-3,4,-1,2,1,-5,4],the contiguous subarray [4,-1,2,1] has the largest sum = 6. More practice: If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach,…

Check List for 2016


一年不玩游戏,最难做到的,也并不是必要的,但是人做事,总得有点决心才可以。 锻炼,坚持锻炼,不超过一个星期不锻炼。 代码,继续topcoder,不超过一周无任何github记录。 吉他,不超过两周不碰它。 blog,心得,不超过两周不更新。 学习,看书看视频,只要不是加班特别晚,不超过三天不看书或者学习视频。 暂时列出这些,后面想到再补上!

One Person’s Dream


18岁的时候觉得自己最对不起的是母亲,25岁的时候越来越认识到自己亏欠最多的是父亲。 现在还记得小的时候,很小的时候,甚至记忆还很模糊的时候,家里人给我算了个命,算命先生说:这匹马将来是一匹千里马,他不甘受到限制,他会去到很远很远的地方。我忘记了了那个年纪的大多数事,却不知为什么很清楚的记得这句话,甚至依稀记得算命先生的语气。 四五岁的时候来了一次上海,除了动物园、地铁和外滩,没有太多记忆。十岁的时候又来了一次上海,依旧去了动物园,这次还去了东方明珠,住了高档一些的酒店,认识了一些不一样的人事物,认识到了这个城市的一些繁华和发达。等到选择大学的时候,发现自己除了上海,几乎没有考虑过其他的城市,我那时以为自己可以“征服”这座城市。 大学四年一晃就过去了,在这个城市呆了四年,说不上自己受益多少,但是眼界毕竟是不一样。四年过得悠然自得,知道谈论买房前,也从没觉得自己比同学差什么。毕业后毅然决定留在上海,其一,对我来说,这里是全中国最有机会的地方;其二,回去?在我从一个只知道学习玩耍的学生逐渐走到社会,对社会的概念逐渐形成的时候,我是在这个城市度过的,回去,我不见得可以接受另一套社会法则,而且我认为这里的法则跟适合我些。等到你要开始工作结婚买房,你又突然发现,这个城市给予了你很多,要的也不是一般的少。 等意识到自己的决定给我生命中的一些人带来巨大的压力,仿佛这只是我一个人的梦想,父母、女朋友还有其他的家人,他们都只是在跟我承受着代价。突然觉得亏欠他们很多。 这个时候父亲说,人知道上进是好事,我们以你为荣。 一个不太跟你推心置腹的人,一个总是默默为这个家奉献的人,一个总是愿意担起责任的人。25岁,亏欠父亲太多太多。 我不会让你们失望!

New Beginning?


  工作终于定下来了,说不上高兴不高兴。薪资待遇还可以,至少短期可以缓解生活压力,工作内容应该也还不错,但是工作的限制实在太多,让人很是不爽!话说回来,谁不想有一份干着又爽薪资又高又不用死命加班的工作,可是很多时候,只能在某些方面compromise一下。 三月底开始找工作,有时七点起床晚上十一二点到家,累成狗。面试了十来次吧,电话面试估计几十次了,心仪的几个结果都挂了,唉,拿了六个都差不多的offer。有一个做旅游到D轮的,两个创业的,一个做支付,一个做互联网金融,还有一个bank的。旅游的这个感觉公司发展挺快,但是给人的感觉公司管理很乱,典型的暴发户感觉。两个创业的一个做图片分享app,一个做淘宝卖家服务。前者不是非常看好,类似的app较多,而且没有直接的金钱来源,做了四五年团队也不是很大。后者是杭州的一家公司,算是一大半的offer在手吧,说起来很奇怪,我本来是不考虑这些处于创业期的小公司的,但是跟这个公司的技术很聊得来,而且驱使我请了半天假去杭州,然后甘愿晚上十一点多才赶回上海的重要原因是:面试官看了我的blog。真的,我觉得这一点真的很重要,至少反映出公司对技术员工的重视程度和面试官的工作态度,我投出的每一份简历都有我的blog地址和git地址,却几乎没有面试官提及这些东西。但是毕竟从上海搬去杭州代价太大,女朋友过去的话也要换工作,最终放弃了。做支付的这个,线下支付居多,现有模式和发展都不看好。互联网金融这个是p2p,大公司背景,但是招聘流程忍不住要吐槽。技术面和hr面加起来才半个多小时吧,而且感觉hr比技术问的还多。定工资竟然要薪资证明或者拉银行流水,然后就按上家的薪资和上家公司的等级给你定薪资,有点呵呵吧。bank这个是所有的中月薪资最高的,而且毕竟是500强子公司,待遇也还不错。应该是manger比较喜欢我吧,面试的流程也非常的顺利,就是等offer等的吐血,四月初定的口头offer,五月初才拿到纸面offer,昨天才正式入职。听说很多外企招聘的流程都是很慢,但是至少也让人感觉的这种巨型传统行业的笨重感。 三月末才开始找工作的时候,发现自己很多东西都忘了,一筹莫展。等到手里有几个offer了,却又很是懈怠,最终也没能拿到一个令自己很满意的offer。其实进不了BAT等级的公司,其他的感觉都差不多,这个时候的选择,无非就是看薪资和发展。当然,对于现阶段的我来说,薪资和稳定更加重要些。我不是鼠目寸光,我也有自己的理想,我也知道自己的选择将会带来什么,但是当你不是一个人,当你要承担起家庭的责任而没有足够的资本的时候,稳定可能是最好的选择,所以我选择去了bank。 为什么程序员都想去BAT,因为如果去得是BAT,这篇blog就可以叫New Beginning,但是现在却要加个“?”。

Properties 和 Jsp Compile Nullpointer


1.发现问题 之前在碰到一个bug,email service的smtp服务由于没有设置timeout,当和服务器连接失败时,会永远hang在那里。然后就在代码里加上了time out。 1 private static final int MAIL_SMTP_TIMEOUT = 300000; 2 Properties props = System.getProperties(); 3 props.put("mail.smtp.timeout", MAIL_SMTP_TIMEOUT); 4 m_session = Session. getDefaultInstance(props, null); 5   但是却发现,这样修改后jsp会随机的出现无法compile的情况,报错如下: HTTP Status 500 The server encountered an internal error () that prevented it from fulfilling this request.        org.apache.jasper.JasperException: Unable to compile…

第一份摄影作业


女朋友出去有事,回不了家,苦b留在公司也没啥事,就把之前拍的照片po过来玩玩。 我以前觉得自己是个很没美感的人,拍出来的照片完全像翔一样的。不过女朋友很喜欢拍照,经常因为不能帮她拍出好照片而吵架,所以以后准备每周稍微花一点时间在摄影上面。这是我的第一次作业,拍了上百张吧,就这几张感觉还不错的。

To the Year of Young


     本命年就要过去了,过去的一年总结的话,总体感觉就是so-so,或者说跟自己想的比实在是马马虎虎。二十岁的时候想着,二十五岁的时候,自己应该是个很牛的人,应该有一份不错的工作,生活应该可以比较自由的掌控了,离自己的初步理想也很近才对。可不得不慢慢接受现实,不管是生活还是工作,都没有想的那样容易。    以前觉得自己很聪明,不管什么只要想学,都能很快学会。孰不知,这也就是自己以为而已,比自己学的快学的好的人多的数不清,而且学会和学好根本就是两个概念。更可怕的是,有些我现在才学会的东西,很多人在多年前就已经学好了!井底之蛙,接触的越多,越感觉自己有那么多东西要学。过去的一年,接触了一些新鲜的东西:linux服务器的常用操作(ps,aux,grep,tail,awk,netstat等等),dns负载均衡,数据库sharding,消息中间件(tibco, disruptor),多线程的实际应用,aws,wordpress…有些只是了解,有些有点应用基础,但依然是缺乏深入的了解。越要去学习新的东西,越感觉基础不够扎实。所以从羊年开始,要稳稳的打牢基础!明年的学习focus在c++和算法,接下来的至少三年都要打牢基础,算法、操作系统、tcp/ip。   才工作不到两年,就感觉有些职业病了—经常感觉脖子和腰酸痛。所以羊年还有一个目标就是要坚持锻炼,再加上明年周末要上交大的在职硕士,如果不坚持锻炼加强体魄,明年肯定坚持不下来。   要说去年一年里也有觉得不是特别马虎的事情,就是顺利的跟女友度过了这一年:-D 想想原来天天要靠别人照顾的,现在算是可以照顾另一个人了,也算是有些成长吧。而且长跑也有九年了,辛酸什么的感觉都忘的差不多,离修成正果也不远了。年少时的一些梦想,感觉最难最渴望的一个慢慢就要实现了。    再过几天就是羊年了,希望女朋友在本命年里顺顺利利,依然很young。父母可以依然身体健康,可以更多的回报他们。自己工作顺利,更多的学习,争取能有一些质的改变!

Disruptor 学习之MultiBuffer, WorkerPool ,Priority


自从之前在并发编程网上看到一片关于Disruptor的文章,然后就着迷了,由于能力有限,看了好多天Disruptor的源码才感觉自己稍微有一点点理解(有些对于底层的优化,实在不太直观,还有待研究),然后联系工作的需要,自己就想到写一个: 拥有多个RingBuffer, 支持WorkerPool 模式,支持Priority的disruptor。黑喂狗! 一、对Disruptor的认识 之前看了一些帖子,然后看了一段时间源码,我总体的感觉是: Disruptor存储数据的结构叫做RingBuffer,是一个固定长度的数组,我们的元素都是存放在数组里,同时由于取数组时我们进行取余操作,数组使用起来就像是一个环形结构。往RingBuffer中放入元素时,只是把相应index的元素做更新。 RingBuffer包含一个Sequencer,这个Sequencer里面包含了生产者当前的下标,以及所有的消费者的下标。生产者可以根据最慢的消费者下标知道下个index是否可更新,消费者可以根据生产者下标知道自己可以处理到哪个index。 生产者和每个消费者都只是自己持用自己的数组引用,而彼此之间的引用只是可读。 上面只是简单的说一下自己总体上的理解,以后会根据源码写一点具体的细节。 二、WorkerPool 模式 我的应用场景是这样的,有一个地方可以不断的向queue里放如元素,又有多个线程同时去拿这些元素,每个元素只能被处理一次。开始我的想法是,在每个元素里加一个标志位,每个线程拿到元素都去做判断是否已经被处理。但是后来发现这样浪费资源都不说了,还可能会出错(比如一个元素被处理了多次)!后来万能的google给了我答案,这个哥们跟我的需求一样,开始的想法和我也一样,结果人家Disruptor的开发人员早就想到了各种各样的情况。WorkerPool模式就是解决了这种问题! 大致说下WorkerPool的原理: 生产者的行为不需要做任何改变; 对于属于一个WorkerPool的消费者,他们除了维护自己的index外,还需要额外维护一个共有的workSequence,这个Sequence里面记录了这个WorkerPool里所有消费者拿到的最大的index。 当一个消费者处理完了当前的元素,会根据这个workSequence,而不是根据自身的sequence去拿下一个元素。 Disruptor的源码里面就已经提供给我们了很多的模式,包括MultiBuffer和WorkerPool。我只是在这个基础上稍微做了一点点小修改。 三、实现 1. MultiBufferWorkProccesor 1 private final AtomicBoolean running = new AtomicBoolean(false); 2 private final Sequence[] sequences; 3 private final DataProvider<T>[] providers; 4 private final SequenceBarrier[] barriers; 5 private final WorkHandler<T> handler; 6…