显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

汉斯的博客

信之:疯子和天才只一步之差,奋起直追,提升自我,坚持不懈,永不言弃!

 
 
 
 
 
 

四个级别的 “自由” 程序员

2014-8-21 9:01:20 阅读34 评论0 212014/08 Aug21

摘要:大多数程序员为企业工作,被捆绑在岗位上,但拥有稳定的收入与福利。如果向往自由,有些程序员会成为SOHO一族,有些则是自主研发产品。而财务自由则是程序员们最高的自由等级,那时,编程更像是一门艺术。

这段时间,作为程序员的我一直在思考关于工作中“自由程度”的问题,终于我得出了一个结论,把它分成了四个级别。

这四个级别与技术无关。通常来说,只要努力追求,我们都可以成功“晋级”。

第一级:上班族

大部分程序员都是从这一级别开始的,甚至大部分程序员会一直停在这个层级。该级别的程序员没有太多自由,只能做那些必须做的工作,而且被“捆绑”在固定位置上。为别人打工也不全是坏处,你可以有稳定的收入和福利,但这一切都是用你大部分自由时间换取的。

第二级:自由开发者

提起“自由工作者”,大家的想法是:可以做自己想做的项目、可以跟不同人打交道、可以到不同的地方工作……

然而自由开发者并不如我们想象的美好。首先,如果你只有大客户,那和上班没区别。其次,就算你有很多不同的客户,你的工作量和压力会远远大于上班族。当然,从收入上来说的确比上班强。

第三级:自主研发产品

当发现自由开发者的生活不如想象中那么美好时,我又开始幻想:如果能研发出一种产品或者一种服务卖给别人,这样就算不工作也有钱赚。

于是我开发了几个地图应用来挣钱。现在我没有固定的老板和客户,就算几个月不工作也不担心没钱赚,基本上可以达到自由。但有个问题,这时的你得自己决定开发的产品或者服务,所以得学会调查市

作者  | 2014-8-21 9:01:20 | 阅读(34) |评论(0) | 阅读全文>>

新浪微博 微彩票 第二轮改造规划

2014-8-15 9:29:48 阅读37 评论0 152014/08 Aug15

1、架构规划

2、前、后端规划

3、规范标准(命名、访问路径、请求、相应规划)

4、性能规划

5、兼容性规划(web与触屏版兼容性)

6、code review规划

7、...

打造全新的项目组团队,力争让每一个参与了该项目改造的人员都能有所提高。

作者  | 2014-8-15 9:29:48 | 阅读(37) |评论(0) | 阅读全文>>

编程认知:多思考、多编码、多测试

2014-7-17 21:41:11 阅读48 评论0 172014/07 July17

摘要:每位程序员有自己独有的编程方式,原文作者Ben Teese在他的程序员生涯中,悟出对编码流程的一些见解:多思考、多编码、多测试。打造软件的过程是一个不断学习的过程,一个好的策略是遵循计划-执行-反思来进行的。

在我的程序员生涯中,悟出了以下的一个程序编码流程;期间也接触了很多其它的理论和想法,但是我还是觉得这是最适合我的。

大致的样式是这样的:

多思考(Think a bit)多编码(Code a bit)多测试(Test a bit)再来一遍(Go to Step 1)

第一步:多思考

有多少朋友会觉得,噼噼啪啪键盘节奏的快慢代表了程序生产力的高低?如果你也是这样想的,我希望你能在遇到问题时,先放一放,静心想一想。

如果思考的时候,觉得无从下手,不妨先问问自己:究竟要做什么? 一旦安静下来,这个问题的答案将会使我们辨清方向或者重新考虑问题的处理方法。

下一步,我会建议思考这个问题:自己是否把简单问题复杂化了? 尝试用最简单的办法来解决问题是每个程序员应该为之努力的目标。但当我们掌握了足够多的学识时,用如此简单的方法来解决问题是否大材小用了?如果这样想,或许最后找上我们的却是一堆堆越来越复杂的问题。尝试转一下思路,用简单的办法解决问题会导致最坏结果是什么呢?是比不能解决问题更差吗?学会跳出牛角尖,这一点很重要。

因此,在遇到问题时,不妨多问问自己以上几个问题。而当进行到一个瓶颈位置,进退维谷时,我会考虑进入下一步。

第二步:多做

我觉

作者  | 2014-7-17 21:41:11 | 阅读(48) |评论(0) | 阅读全文>>

分析Netty工作流程

2014-4-13 19:41:28 阅读111 评论0 132014/04 Apr13

下面以Netty中Echo的例子进行流程跟踪,并简要的

服务器启动->客户端连接-> 服务器处理连接-> 服务器处理客户端数据<-> 客户端处理服务器数据

1:客户端连接:

我们直接看这行代码:

bootstrap.connect(new InetSocketAddress(host, port));

通过帮助类ClientBootstrap来连接服务器。

Debug源码进去发现最后是某个Channel类进行connect操作。

而这个Channel是如何来的呢?其实是从前面的 ChannelFactory和ChannelPipelineFactory得到的。

Channel.connect-> AbstractChannel.connect->Channels.connect(…);

Channels是Channel的帮助类,封装一些常用的操作。在封装操作时,基本都是触发事件。

这里发起一个connectd的Downstream的事件。

所有的事件都是丢给ChannelPipeline进行管理,ChannelPipeline使用了责任链模式来将事件传送给注册到Pipeline中的ChannelHandler,由ChannelHandler进行处理。如果遍历了所有的ChannelHandler后则交给ChannelSink进行处理,ChannelSink根据不同的事件进行不同的处理,

作者  | 2014-4-13 19:41:28 | 阅读(111) |评论(0) | 阅读全文>>

基于Websocket草案10协议的升级及基于Netty的握手实现

2014-4-13 12:12:02 阅读123 评论0 132014/04 Apr13

最近发现,WEBWW在chrome14及FF6.5中没法与后台建立连接了,后面经过查找原因,是chrome14中使用最新的websocket协议草案,而chrome12中使用的websocket协议标准还是草案7.5、7.6的标准;现在草案的最新版本是草案10,草案的链接地址为:http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10,本次协议变更比较大,主要体现在安全性和可扩展性上:

1、握手的标准:

1)、最老的websocket草案标准中是没有安全key,草案7.5、7.6中有两个安全key,而现在的草案10中只有一个安全key,即将7.5、7.6中http头中的"Sec-WebSocket-Key1"与"Sec-WebSocket-Key2"合并为了一个"Sec-WebSocket-Key"

2)、把http头中Upgrade的值由"WebSocket"修改为了"websocket";

3)、把http头中的"-Origin"修改为了"Sec-WebSocket-Origin";

4)、增加了http头"Sec-WebSocket-Accept",用来返回原来草案7.5、7.6服务器返回给客户端的握手验证,原来是以内容的形式返回,现在是放到了http头中;另外服务器返回客户端的验证方式也变了,后面会有介绍。

作者  | 2014-4-13 12:12:02 | 阅读(123) |评论(0) | 阅读全文>>

基于netty的websocket开发小结

2014-4-13 12:08:41 阅读167 评论0 132014/04 Apr13

WebSocket是html5规范新引入的功能,用于解决浏览器与后台服务器双向通讯的问题,使用WebSocket技术,后台可以随时向前端推送消息,以保证前后台状态统一,在传统的无状态HTTP协议中,这是“无法做到”的。

WebSocket提出之前,为了解决后台推送消息到前台的需求,提出了一些解决方案,这些方案使用已有的技术(如ajax,iframe,flashplayer,java applet ...),通过一些变通的处理来实现。

webSocket是html5新引入的技术,允许后台随时向前端发送文本或者二进制消息,WebSocket是一种全新的协议,不属于http无状态协议,协议名为"ws",这意味着一个websocket连接地址会是这样的写法: 

ws://127.0.0.1:8080/websocket。ws不是http,所以传统的web服务器不一定支持,需要服务器与浏览器同时支持, WebSocket才能正常运行,目前的支持还不普遍,需要特别的web服务器和现代的浏览器。

浏览器对WebSocket的支持 

Google Chrome浏览器最先支持WebSocket,随后是Safari,Firefox,此外最新版本的Opera和IE(Opera11,IE10)也支持WebSocket。

客户端WebSocket的主要方法

1 构造函数

Java代码

var websocket = new WebSocket("ws://127.0.0.1:8080/websocket");

作者  | 2014-4-13 12:08:41 | 阅读(167) |评论(0) | 阅读全文>>

java开源高性能nio框架netty

2014-4-12 16:51:53 阅读105 评论0 122014/04 Apr12

1、netty是什么?

2、netty能解决什么问题?

3、如何使用netty?

4、编写后,如果做监控、安全等的扩展

5、应用在java程序中进行交互。

作者  | 2014-4-12 16:51:53 | 阅读(105) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 4

2014-4-11 21:56:30 阅读101 评论0 112014/04 Apr11

半关闭socket

TCP和SCTP允许用户关闭一个socket的出站流量而不用完全关闭它。这样的socket被称为“半关闭socket”,同时用户能够通过调用SocketChannel.shutdownOutput()方法来获取一个半关闭socket。如果一个远端关闭了出站通道,SocketChannel.read(..)会返回-1,这看上去并没有和一个关闭了的链接有什么区别。

3.x没有shutdownOutput()操作。同样,它总是在SocketChannel.read(..)返回-1的时候关闭链接。

要支持半关闭socket,4.0增加了SocketChannel.shutdownOutput()方法,同时用户能设置“ALLOW_HALF_CLOSURE”的ChanneOption来阻止Netty在SocketChannel.read(..)返回-1的时候自动关闭链接。

灵活的I/O线程分配

在3.x里,一个Channel是由ChannelFactory创建的,同时新创建的Channel会自动注册到一个隐藏的I/O线程。4.0使用新的名为EventLoopGroup的接口来替换ChannelFactory,它由一个或多个EventLoop来构成。同样,一个新的Channel不会自动注册到EventLoopGroup,但用户可以显式调用EventLoopGroup.register()来注册。

感谢这个变化(举例来说,分离了ChannelFactory和I/O线程),用户可以注册不同的C

作者  | 2014-4-11 21:56:30 | 阅读(101) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 6

2014-4-11 21:55:51 阅读133 评论0 112014/04 Apr11

良好定义的线程模型

在3.x里并没有良好设计的线程模型,尽管曾经要修复线程模型在3.5的不一致性。4.0定义的一个严格的线程模型来帮助用户编写ChannelHandler而不必担心太多关于线程安全的东西。

Netty将不会再同步地调用ChannelHandler的方法了,除非ChannelHandler由@Shareable注解。这不会理会处理器方法的类似——入站、操作、或者是生命周期时间处理器方法。用户不再需要同步入站或出站的事件处理器方法。4.0不允许加入加入一个ChannelHandler超过一次,除非它由@Sharable注解。每个由Netty调用的ChannelHandler的方法之间的关系总是happens-before。用户不用定义一个volatile字段来保存处理器的状态。用户能够在他加入一个处理器到ChannelPipeline的时候指定EventExecutor。如果有指定,ChannelHandler的处理器方法总是由自动的EventExecutor来调用如果没指定,处理器方法总是由它关联的Channel注册到的EventLoop来调用。声明到一个处理器的EventExecutor和EventLoop总是单线程的。处理器方法总是由相同线程调用。如果指定了多线程的EventE

作者  | 2014-4-11 21:55:51 | 阅读(133) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 5

2014-4-11 21:54:45 阅读59 评论0 112014/04 Apr11

简化的关闭

releaseExternalResources()不必再用了。你可以通过调用EventLoopGroup.shutdown()直接地关闭所有打开的连接同时使所有I/O线程停止,就像你使用java.util.concurrent.ExecutorService.shutdown()关闭你的线程池一样。

类型安全的ChannelOptions

有两个方法来配置Netty的Channel的socket参数。第一个是明确地调用ChannelConfig的setter,例如SocketChannelConfig.setTcpNoDelay(true)。这是最为类型安全的方法。另外一个是调用ChannelConfig.setOption()方法。有时候你不得不决定在运行时的时候socket要配置什么选项,同时这个方法在这种情况下有点不切实际。然而,在3.x里它是容易出错的,因为一个用户必需用一对字符串和对象来指定选项。如果用户调用了错误的选项名或者值,他或她将会赵宇到一个ClassCastException或指定的选项甚至可能会默默地忽略了。

4.0引入了名为ChannelOption的新的类型,它提供了类型安全地访问socket选项。

01ChannelConfig cfg = ...;

02

03// Before:

04cfg.setOption("tcpNoDelay", true);

05cfg.setOption("tcpNoDe

作者  | 2014-4-11 21:54:45 | 阅读(59) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 3

2014-4-11 21:52:24 阅读44 评论0 112014/04 Apr11

每个处理器的缓存

不像3.x那样在每次读操作都简历一个新堆里的缓存来触发上游的MessageEvent,4.0不会每次都创建新的 缓存。它直接从socket中读取数据到由用户的ChannelInboundByteHandler和ChannelInboundMessageHandler实现创建的入站缓存。

因为由上述处理器创建的入站缓存直到关联的通道关闭前都会重用,所以在上面的GC和内存带宽消耗都能保持较小。同样,当接收到的数据被销毁时用户已经完成操作,codec的实现就变得更简单和有效了。

在创建出站缓存时也是差不多的(不会新建)。用户的ChannelOutBoundBYteHandler和ChannelOutboundMessageHandler来操作。

不需要每条消息都有一个事件

4.0里不再有了messageReceived或writeRequested处理器方法。它们被inboundBufferUpdated和flush代替了。用户的入队一个或多个消息到一个入站(或出站)缓存同时会出发一个inboundBUfferUpdated(或flush)事件。

01public void inboundBufferUpdated(ChannelHandlerContext ctx) {

02    Queue<MyMessage> in = ctx.inboundMessageBuffer();

0

作者  | 2014-4-11 21:52:24 | 阅读(44) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 2

2014-4-11 21:51:29 阅读52 评论0 112014/04 Apr11

Channel API的变化

在4.0中,许多io.netty.channel包中的类都经历大量修改,因此文本上的简单搜索-替换是无法让你基于3.x的程序迁移到4.0上。这个部分会尝试将这些重大变更背后的思考过程展示出来,而不只是简单地作为展示所有变更。

翻新后的ChannelHandler接口Upstream → Inbound, Downstream → Outbound

对于初学者来说,术语'upstream'(译者注:直译为向上游,有点像TCP/IP协议栈中从下往上,从物理层最终到达应用层这么一个流程)和'downstream'有点让人迷惑。在4.0中,只要可能,都会使用'inbound'(译者注:直译为开往内地的,相对于upstream确实更贴切,即指数据从外部网络经历层层filter到达我们的处理逻辑)和'outbound'来替换他们。

新的ChannelHandler继承层次

在3.x时代,ChannelHandler只是一个标记接口,而在ChannelUpstreamHandler、ChannelDownstreamHandler、LifeCycleAwareChannelHandler定义了具体的处理器方法。在Netty 4中,ChannelHandler将LifeCycleAwareChannelHandler接口和一堆实现辅助方法融合到了一起,具体见代码:

01public interface ChannelHandler {

02

作者  | 2014-4-11 21:51:29 | 阅读(52) |评论(0) | 阅读全文>>

Netty 4.0 新的特性及需要注意的地方 1

2014-4-11 21:48:27 阅读55 评论0 112014/04 Apr11

英文原文:Netty4.0 New and noteworthy

翻译来自oschina.net 开源中国,5.0新特性在后面会给出。

这篇文章和你一起过下Netty的主发行版本的一些显著的改变和新特性,让你在把你的应用程序转换到新版本的时候有个概念。

项目结构改变

Netty的包名从org.jboss.netty改为io.netty,因为我们不在是JBoss.org的一部分了

二进制JAR包被分为了多个子模块以便用户能够从类路径中去掉非必需的特性。当前的结构如下:

模块描述nettyproject parentcommonutility and loggingbufferbuffer APItransportchannel API and its core implementationstransport-rtrxRTRX transport implementation

作者  | 2014-4-11 21:48:27 | 阅读(55) |评论(0) | 阅读全文>>

WebSocket与Java

2014-4-10 22:56:35 阅读49 评论0 102014/04 Apr10

 转自infoq 作者 张龙 发布于 2013年12月22日

Bozhidar Bozhanov是Ontotext AD的高级软件工程师,拥有多年的从业经验,也是stackoverflow上的活跃用户。他精通于Java与Java技术栈,如Spring、JPA、JavaEE等,同时还是http://computoser.comhttp://welshare.com的创始人。曾开发过爱立信的项目、保加利亚电子政务项目以及大型招聘平台等。近日Bozhidar撰文谈到了WebSocket与Java,并给出了相应的代码示例。Bozhidar在文中详细分析了WebSocket的原理、适用范围,以及如何通过Java来使用WebSocket。

WebSocket是一个很酷的新技术,可以实现浏览器与服务器之间实时、双向的通信,几乎没有任何额外的代价。我这里要做的事情就是提供一个非常简洁,但却内容丰富的概览,介绍如何开始使用这门技术。首先读者需要了解如下一些事情:

首先在浏览器与服务器之间需要开启一个TCP Socket连接,每一方都可以向对方发送消息(比如说,服务器可以在有数据时将其推送出去,无需使用轮询、长轮询、iframes等技术)。并不是所有浏览器都支持WebSocket技术,IE 10是首个支持WebSocket的IE版本,Android依然还存在着一些问题。幸好有SockJS,在不支持WebSocke

作者  | 2014-4-10 22:56:35 | 阅读(49) |评论(0) | 阅读全文>>

应对Memcached缓存失效,导致高并发查询DB的四种思路

2014-4-10 10:40:12 阅读90 评论0 102014/04 Apr10

 转自一位同事的文章:

当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然上升。

这篇blog主要是探讨如何在缓存将要失效时,及时地更新缓存,而不是如何在缓存失效之后,如何防止高并发的DB查询。

解决这个问题有四种思路:

比如一个key是aaa,失效时间是30s。

1.定期从DB里查询数据,再刷到memcached里

这种方法有个缺点是,有些业务的key可能是变化的,不确定的。

而且不好界定哪些数据是应该查询出来放到缓存中的,难以区分冷热数据。

2.当缓存取到为null时,加锁去查询DB,只允许一个线程去查询DB

这种方式不太靠谱,不多讨论。而且如果是多个web服务器的话,还是有可能有并发的操作。

3.在向memcached写入value时,同时写入当前机器在时间作为过期时间

当get得到数据时,如果当前时间 - 过期时间 > 5s,则后台启动一个任务去查询DB,更新缓存。

当然,这里的后台任务必须保证同一个key,只有一个线程在执行查询DB的任务,不然这个还是高并发查询DB。

缺点是要把过期时间和value合在一起序列化,取出数据后,还要反序列化。很不方便。

网上大部分文章提到的都是前面两种方式,有少数文章提到第3种方式。下面提出一种基于两个key的方法:

4.两个key,一个key用来存放数据,另一个用来标记失效时间

作者  | 2014-4-10 10:40:12 | 阅读(90) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 

广东省 深圳市 处女座

 发消息  写留言

 
对互联网系统与应用架构、中间件架构、大型分布式系统架构、系统性能优化(特别是互联网性能优化)等有深入研究。微信等第三方开发商
 
近期心愿完成一些第三方软件开发,再为创业机缘做进一步的积累、沉淀。
POPO  daihaixiang@163.com
QQ54339729
MSNcnhaixiang@hotmail.com
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 

天气

 
 
模块内容加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 
 
 
圈子列表加载中...
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2014

创建博客 登录  
 加关注