随笔 - 12, 文章 - 0, 评论 - 22, 引用 - 0
数据加载中……

2016年2月14日

迟来的年终总结(2014-2015)

    正好2016年的春假结束了,趁这个时间总结一下前面两年的工作情况。
    2014年之前一直做的是java后台开发,工作的内容整体感觉是不难的,平常也都有自我学习源码、框架之类的。2014-2015年这两年跟随移动互联网的潮流,转作了android开发,负责android团队。在一家公司一直做后台近3年,也的确对相同的业务没什么激情了,工作性质的转变还挺不错。回首这两年时间,心情到是有些复杂。
    2014年初刚转到android组的时候,对于android的了解是零;另外也是头一次管理团队,心里也是有些忐忑。进入android团队没2个月,恰逢android版本的整体升级(参考别组的产品代码来改造升级),我自己拦了一部分核心业务来做。最初的想法是籍着这个升级的项目来了解andorid代码,顺便熟悉业务,之后就是暗无天日2个多月的忙碌。最后产品是出来了,但是发现对于android知识和业务的了解的还是不够,之间还一度感觉精神都抑郁了,想想也是够呛的。这两个月之前也算是对产品代码有了一定了解,另外对于团队间的运作和管理也有了一定的熟悉,磕磕碰碰的度过了最艰难的时期。这2个月的时间对我说,算是这两年中工作上最重要的一个时期。回过头来看,其实这两个月自己时间的安排不太合理,每天小组的琐事挺多,分去了我一半精力,另一半又赶产品升级的事;的确是有点顾此失彼。当时可能还是选择一些小模块来熟悉代码,会比较合理。
    度过了最难的2个月后,工作和小组管理也步上正规。我们部门是b2b,公司内部的资源和分散,经常一个模块的功能,需要3,4个小组一起来处理。又经过好长时间,熟悉流程,并跟其他小组人来完善流程,也逐步融入团队,适应andorid小组的节奏。这个事在2015年还在不断的进行中。2014年中还是出过几件有意思的事,小组成员离职、与其他组人员沟通出问题遭投诉,android人员招聘等等,细节就不一一道来了。
    2015年感觉相对2014年是平稳很多,毕竟适应了1年的小组节奏了。2015年工作主要在于项目管理和小组的管理上。每周组织小组成员的知识培训,制定代码规范,优化外部流程等等。这一年的出差倒是需要提一下,有过几次销售让出差说是给客户技术解答,最后发现一句话都不用说;后面出差的时候我都会再三确认出差的具体事由。总体来说去外面出差还是挺不错的,跟客户了解项目需求、技术解答等也是挺有意思、挺锻炼人的,如有时间多,还可以顺便在当地玩玩。
    两年下来,可惜的是对于android的了解,只是个皮毛。2014兼顾开发和管理,对于andorid技术的专研不深也就算了;2015年其实有很多时间可以加深android的了解,可惜由于种种原因都没能花时间进去。这两年的收获也是不小,由一个纯粹的开发,到项目管理、团队管理的职责转变,也使自己的眼界开阔了不少;对于热门的移动行业也有一定的了解;andorid小组最初由7个人,一度达到15个人,跟随着小组一起成长。2016年工作又是有变动,重新回到后台开发,之后可能出差会多些,还要学学技术包装,哎感觉跟技术这条路背道而驰了。2016年已经起航,祝福自己顺利吧!
    

posted @ 2016-02-14 00:28 heavensay 阅读(162) | 评论 (0)编辑 收藏

2013年10月29日

jQuery分析纪要

       本文是对jQuery源码分析的简单纪要。

jQuery相关对象内存图



    jQuery代码分析纪要:
        1、 jQuery一加载进来,就执行匿名函数,进行jQuery的初始化工作,定义jQuery的功能,最后暴露出jQuery和$变量给用户使用。
(function( window, undefined ) {

window.jQuery = window.$ = jQuery
})( window );

        2、 jQuery功能扩展函数Extend
jQuery.extend = jQuery.fn.extend = function() {
    
}
        jQuery提供了2个供用户扩展的函数jQuery.extend和jQuery.fn.extend。
        jQuery.extend 用于扩展jQuery自身方法,如jQuery.ajax, jQuery.getJSON等,jQuery.fn.extend则是用于扩展jQuery(...)的方法,从上面的内存图中可以看出,经过jQuery包装后的dom元素,在其原型链上会拥有jQuery.fn.extend扩展的方法。

        3、 jQuery函数,就是我们平常$('#id')所执行的函数,返回包装过的dom元素
   // Define a local copy of jQuery
    jQuery = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'
        return new jQuery.fn.init( selector, context, rootjQuery );
    },

posted @ 2013-10-29 20:18 heavensay 阅读(286) | 评论 (0)编辑 收藏

2013年10月28日

Spring加载资源分析

     摘要: 这篇文档是对Spring加载和解析xml文件过程的分析  阅读全文

posted @ 2013-10-28 00:12 heavensay 阅读(11237) | 评论 (2)编辑 收藏

2013年10月20日

Js中Prototype、__proto__、Constructor、Object、Function关系介绍

一    Prototype、__proto__与Object、Function关系介绍

        Function、Object:Js自带的函数对象。
        prototype,每一个函数对象都有一个显示的prototype属性,它代表了对象的原型(Function.prototype函数对象是个例外,没有prototype属性)。
        __proto__:每个对象都有一个名为__proto__的内部隐藏属性,指向于它所对应的原型对象(chrome、firefox中名称为__proto__,并且可以被访问到)。原型链正是基于__proto__才得以形成(note:不是基于函数对象的属性prototype)。
       关于上面提到的函数对象,我们来看以下例子,来说明:
        var o1 = {};
        var o2 =new Object();
        
        function f1(){}
        var f2 = function(){}
        var f3 = new Function('str','console.log(str)');
    
        f3('aabb');   // aabb
        console.log('typeof Object:'+typeof Object);            //function
        console.log('typeof Function:'+typeof Function);        //function
        console.log('typeof o1:'+typeof o1);   //object
        console.log('typeof o2:'+typeof o2);   //object
        console.log('typeof f1:'+typeof f1);   //function
        console.log('typeof f2:'+typeof f2);   //function
        console.log('typeof f3:'+typeof f3);   //function
  • 通常我们认为o1、o2是对象,即普通对象;f1、f2、f3为函数。
  • 但是其实函数也是对象,是由Function构造的,
  • f3这种写法就跟对象的创建的写法一样。f1、f2最终也都像f3一样是有Function这个函数构造出来的
  • f1、f2、f3为函数对象,Function跟Object本身也是函数对象。
       Js中每个对象(null除外)都和另一个对象相关联,通过以下例子跟内存效果图来分析Function、Object、Prototype、__proto__对象间的关系。

    function Animal(){
        
    }
    var  anim = new Animal();
    
    console.log('***********Animal anim proto*****************');
    console.log('typeof Animal.prototype:' +typeof Animal.prototype);  //object 
    console.log('anim.__proto__===Animal.prototype:'+(anim.__proto__===Animal.prototype));  //true
    console.log('Animal.__proto__===Function.prototype:'+(Animal.__proto__===Function.prototype));  //true
    console.log('Animal.prototype.__proto__===Object.prototype:'+(Animal.prototype.__proto__===Object.prototype));  //true
    
    console.log('***********Function proto*****************');
    console.log('typeof Function.prototype:'+typeof Function.prototype);  //function
    console.log('typeof Function.__proto__:'+typeof Function.__proto__);  //function
    console.log('typeof Function.prototype.prototype:'+typeof Function.prototype.prototype); //undefined
    console.log('typeof Function.prototype.__proto__:'+typeof Function.prototype.__proto__);   //object
    console.log('Function.prototype===Function.__proto__:'+(Function.prototype===Function.__proto__)); //true

    console.log('***********Object proto*****************');
    console.log('typeof Object.prototype:'+typeof Object.prototype);  //object
    console.log('typeof Object.__proto__:'+typeof Object.__proto__);  //function
    console.log('Object.prototype.prototype:'+Object.prototype.prototype);  //undefied
    console.log('Object.prototype.__proto__===null:'+(Object.prototype.__proto__===null));  //null

    console.log('***********Function Object  proto关系*****************');
    console.log('Function.prototype===Object.__proto__:'+(Function.prototype===Object.__proto__));   //true
    console.log('Function.__proto__===Object.__proto__:'+(Function.__proto__===Object.__proto__));   //true
    console.log('Function.prototype.__proto__===Object.prototype:'+(Function.prototype.__proto__===Object.prototype));   //true

    /********************* 系统定义的对象Array、Date ****************************/
    console.log('**************test Array、Date****************');      
    var array = new Array();
    var date = new Date();
    console.log('array.__proto__===Array.prototype:'+(array.__proto__===Array.prototype));   //true
    console.log('Array.__proto__===Function.prototype:'+(Array.__proto__===Function.prototype));  //true
    console.log('date.__proto__===Date.prototype:'+(date.__proto__===Date.prototype));    //true
    console.log('Date.__proto__===Function.prototype:'+(Date.__proto__===Function.prototype));     //true

Function、Object、Prototype、__proto__内存关系图


        上面的内存图跟堆栈结构可以参照文章Javascript_01_理解内存分配
        堆区图说明:
 
        Function.prototype函数对象图内部表示prototype属性的红色虚框,只是为了说明这个属性不存在。

        通过上图Function、Object、Prototype关系图中,可以得出一下几点:
  1. 所有对象所有对象,包括函数对象的原型链最终都指向了Object.prototype,而Object.prototype.__proto__===null,原型链至此结束。
  2. Animal.prototype是一个普通对象。
  3. Object是一个函数对象,也是Function构造的,Object.prototype是一个普通对象。
  4. Object.prototype.__type__指向null。
  5. Function.prototype是一个函数对象,前面说函数对象都有一个显示的prototype属性,但是Function.prototype却没有prototype属性,即Function.prototype.prototype===undefined,所有Function.prototype函数对象是一个特例,没有prototype属性。
  6. Object虽是Function构造的一个函数对象,但是Object.prototype没有指向Function.prototype,即Object.prototype!==Function.prototype。

二    Prototype跟Constructor关系
介绍
         在 JavaScript 中,每个函数对象都有名为“prototype”的属性(上面提到过Function.prototype函数对象是个例外,没有prototype属性),用于引用原型对象。此原型对象又有名为“constructor”的属性,它反过来引用函数本身。这是一种循环引用(i.e. Animal.prototype.constructor===Animal)。
        通过以下例子跟内存效果图来分析Prototype、constructor间的关系。
    console.log('**************constructor****************'); 

    console.log('anim.constructor===Animal:'+(anim.constructor===Animal))    ;    //true
    console.log('Animal===Animal.prototype.constructor:'+(Animal===Animal.prototype.constructor))    ;    //true
    console.log('Animal.constructor===Function.prototype.constructor:'+(Animal.constructor===Function.prototype.constructor));   //true
    console.log('Function.prototype.constructor===Function:'+(Function.prototype.constructor===Function));    //true
    console.log('Function.constructor===Function.prototype.constructor:'+(Function.constructor===Function.prototype.constructor));    //true

    console.log('Object.prototype.constructor===Object:'+(Object.prototype.constructor===Object));    //true
    console.log('Object.constructor====Function:'+(Object.constructor===Function));    //true

 prototype、constructor内存关系图(在Function、Object、Prototype关系图上加入constructor元素):


        上图中,红色箭头表示函数对象的原型的constructor所指向的对象。
  1. 注意Object.constructor===Function;本身Object就是Function函数构造出来的        
  2. 如何查找一个对象的constructor,就是在该对象的原型链上寻找碰到的第一个constructor属性所指向的对象。
参考:
http://www.libuchao.com/2012/05/14/prototypes-in-javascript/ (JavaScript 的原型对象 Prototype)
http://rockyuse.iteye.com/blog/1426510 (理解js中的原型链,prototype与__proto__的关系)



posted @ 2013-10-20 23:47 heavensay 阅读(31741) | 评论 (13)编辑 收藏

2012年11月27日

JMX分析3-MXBean及OpenMBean

     摘要:        MXBean跟标准MBean很像,标准MBean需要实现XXXXMBean这样命名的接口,而MXBean则需要实现XXXXMXBean这样命名的接口,也可以在接口上使用注解@MXBean,而不用强制使用XXXMXBean这样的命名格式。但是MXBean有点在于它可以供任何的client,包括remote client访问相关属性和执行相关操作。...  阅读全文

posted @ 2012-11-27 00:39 heavensay 阅读(3510) | 评论 (0)编辑 收藏

2012年11月7日

class卸载、热替换和Tomcat的热部署的分析

     摘要:      这篇文章主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理。一 class的热替换 ClassLoader中重要的方法 loadClass       ClassLoader.loadClass(...) 是ClassLoader的入口点。当一个类没有指明用...  阅读全文

posted @ 2012-11-07 22:29 heavensay 阅读(21174) | 评论 (7)编辑 收藏

2012年10月17日

JMX分析2-Monitor

     摘要: JMX Monitor主要用于监控MBeanServer注册的MBeans属性值得变化,在属性的值达到阈值的时候发送消息。 JMX agent需要实现Monitor功能。  阅读全文

posted @ 2012-10-17 00:04 heavensay 阅读(807) | 评论 (0)编辑 收藏

2012年9月24日

JMX分析1-MBean的实现

     摘要:       本文只是JDK7中JMX在本地,MBeanServer管理MBeans的默认实现的探索学习,没有涉及JMX Remote。      JMX 使用了 Java Bean 模式来传递信息。一般说来,JMX 使用有名的 MBean,其内部包含了数据信息,这些信息可能是:应用程序配置信息、模块信息、系统信息、统计信息等。另外,MBe...  阅读全文

posted @ 2012-09-24 08:33 heavensay 阅读(6593) | 评论 (0)编辑 收藏