Monthly Archive: 十一月 2015

自建Piwik-All Websites Dashboard页面

Piwik是一款开源流量监测工具,好用好看好配置,好处自然不用多说。但也有一些小问题,私以为Piwik的可配置参数项还不够多。

前端时间一直在纠结如何在「所有网站」这个页面上加上「访客数」这个指标,一通翻找Piwik源码,发现水有点深,另外考虑到以后的升级,所以在想如果我把它的源码给改了,那以后方便的一键升级是不是玩不转了,或者说升级之后又需要重新再修改一遍,经过重重考虑,决定还是绕道,既然Piwik这么强大,提供的API如此丰富,何不如再写一个自己的「所有网站」页面,展示自己认为比较重要的检测指标,这种灵活性是不是爆棚,所有就自己写了一个「所有网站」的Dashboard页面。

Installation

项目源码下载到本地之后,如果需要跑起来,还需要修改这么几个地方:

  1. ~/js/piwik-tongji.js中的http://www.yourpiwikserver.com替换成你自己Piwik的服务器地址,token_auth请替换成你自己Piwik的授权码;
  2. 如果想要在本地进行测试,并且你的Piwik并没有安装在本地,那么还涉及到一个跨域的问题,可以在Chrome的浏览器里面装一个插件Allow-Control-Allow-Origin: *

Need to be done

1、还是有很多值得优化的地方,比如页面布局

At Last

最后上一张效果图(好像有点以假乱真):
QQ20151119-1@2x

深入理解JVM—类加载的时机

最近在读《深入理解Java虚拟机:JVM高级特性与最佳实践》这本书,对于深入理解JVM的基础技术概念大有帮助,现对「类加载时机」这块逻辑处理过程进行一个简单的回顾和总结。

众所周知,JVM在字节码上运行,字节码从何而来,从高级源码编译过来,当年在制定Java虚拟机规范时并没有强制规定JVM只能运行由Java源代码编译过来的字节码,不管何种高级开发语言,只要编译后的字节码符合JVM的规范,理论上都能在JVM上运行,好了,扯远了。Java程序从加载到虚拟机内存中开始,到从内存中移出大致需要经历以下过程,如下图所示:
虚拟机类加载机制 (1)

 

我们从逻辑上把Java程序执行的完整链条切割成各个阶段,后一阶段的顺利执行取决于上一阶段的执行结果,前后依赖。下面对各个阶段所执行的操作作一简单介绍:

加载:我们在这里说的加载指的是类的加载,大致需要完成以下几件事情:
1)根据类的全路径名称获取描述此类的二进制字节流。这个动作一般通过「类加载器」来实现,「类加载器」是一块在Java虚拟机外部实现的动作代码,从Java虚拟机的角度出发,存在两种不同的类加载器:启动类加载器(由C++实现,是JVM的一部分)和其他类加载器,启动类加载器负责把<JAVA_HOME>\lib目录中的类库加载到虚拟机内存中;其他类加载器中的扩展类加载器负责加载<JAVA_HOME>\lib\ext目录中的类库;应用程序类加载器则负载加载用户类路径上指定的类库。
2)将这个字节流所代表的静态存储结构(比如类变量)转化为方法区的运行时数据结构。
3)在内存中生成一个代表这个类的Java对象,通过该对象来访问该类的各种数据。

验证:确保上一步加载进虚拟机的字节流不包含危害虚拟机自身安全的信息,主要进行以下几个验证操作:
1)文件格式验证:验证字节流是否符合Class文件格式的规范;文件格式验证基于二进制字节流进行,通过该验证之后,字节流才会进入内存的方法区中进行存储,所以后面的验证操作都基于方法区中的存储结构进行,不会再直接操作字节流;
2)元数据验证:对类的元数据信息进行语义校验,保证不存在不符合Java语言规范的元数据信息;
3)字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的;
4)符号引用验证:对类自身以外的信息进行匹配性校验,比如通过字符串描述的全路径名称是否能找到对应的类。

准备:为类变量在方法区中分配内存空间,并设置初始值,需要注意几个关键的地方:
1)仅仅只为类变量(类中以static修饰的变量)分配内存空间,并设置初始值;
2)准备阶段为变量设置初始值一般指的是变量对应类型的零值,比如public static int xyz = 123,准备阶段过后变量xyz的初始值为零,123赋值给xyz的操作需要等到初始化阶段才真正执行,但是也有一个例外情况:如果变量xyz具有ConstantValue常量属性,public static final int xyz = 123,那么xyz在准备阶段就会被初始化成值123。各变量对应的零值如下图所示:
QQ20151111-1@2x
解析:主要完成把常量池内的符号引用替换为直接引用

初始化:真正开始执行类中定义的Java程序代码(其实是字节码)
初始化阶段主要执行类构造器<clinit>()方法,<clinit>()方法是由编译器自动收集类中所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,另外需要注意以下几个比较重要的地方:
1)<clinit>()方法与类的构造函数不同,前者不需要显式的调用父类的<clinit>()方法,Java虚拟机保证会在调用子类的<clinit>()方法之前先执行父类的<clinit>()方法,也就意味着父类中定义的静态语句块先于子类的变量赋值操作。

解析这一阶段所需要完成的工作相对来说是比较复杂的,可以另外再进行说明。

开始听民谣

少年时的偶像如今也成家立业,娶妻生子,偶尔还是能看到他的新闻出现在门户网站上,而只是换了形象,多少有点英雄老去的味道,而留下的感动却永远留在心中,变成美好的回忆。

而今自己也度过了青春岁月,步入而立之年,此时此刻与民谣似乎更有共鸣,民谣初听起来似主人公的人生独白,将自己的人生阅历变成优美的文字配以简单的编曲即可话人生。再听便能读出其中的人生态度,体验到关注个人情怀的细致和柔绵;抑或给人带来很大的想象空间和很强的代入感,免不了开始思考人生。

不敢妄说喜欢所有的民谣歌曲,还只是开始喜欢听,推荐以下这两位的代表作:
赵雷李志

[player autoplay=”0″]

未来的未来

刚刚看完卖桃君推送的文章《程序猿,30岁的中年危机?》,顿时觉得心里堵得慌,好像这篇文章直接戳到了我内心的痛点,说出了自己内心的焦虑和不安,深深的不安。

从去年毕业进入现在这家公司,省行的信息科技部,我现在依然认为自己在这件事情的决定上是欠缺考虑的,可能也是自己的性格原因,当时手头有好几个不错的Offer,现在来看,这几家公司发展的都很不错。当时有点犹豫,不过还是最终选择了这家公司,说了上面这些废话,其实想说这里的工作并没有让我满意。

不知从何时期,觉得自己应该专注技术,觉得技术是作为一名软件工程师的安身立命之本,纵使周遭环境千变万化,我也自淡然于众,而在国企单位想要技术得到飞速的提高是一家多么难的事情,是的,没错,我们可以利用相对空闲的时间去学习自己想要了解和掌握的知识,但是我更喜欢业务的快速发展能够带领技术进入未知的挑战,低下头,安心解决问题,获得技能。

痛定思痛,我也一直在思考出路,对于技术人来说,想的粗了,觉得未来的路还很宽广,想到眼前,发现自己仅还是只能依靠技术安身立命,所以还是需要低下头,努力修炼自己的技术。