Welcome to Triffic Site

BI模式(Schema)介绍-Table配置

在这里系统的看看构成模式文件的元素:
首先说明一点:这个sample中每一部分在形式上有很多重复的地方,为了尽可能地讲的完全,所以在讲解的过程中,每一部分提取形式上不重复的部分,然后加入该部分的一些可选项,同时可以查阅FoodMart.xml这个Schema文件。从宏观上来看,配置一个Schema大致可以分成五部分,分别是:

  1. Table配置
  2. Dimension配置
  3. Measure配置
  4. VirtualCube配置
  5. 访问权限配置

下面分析每一部分中的元素构成。

1、Table配置

  1. 首先给出表名,在一般情况下,一个Cube是建立在一张事实表之上的,所以Table name=某事实表,但也可以在一张基础表上建立Cube;
  2. 在本sample中加入了一个聚合表(aggregate table),在一个Cube中可以加,也可以不加,需要根据实际情况来决定。聚合表的作用简单的说表现在考虑报表设计时,通过聚合预先计算好数据汇总,从而改进查询响应的时间。聚合表的内容非常丰富,在这里只讲解最基本的概念,进一步了解请访问官网http://mondrian.pentaho.com/documentation/aggregate_tables.php,接下来简单的理解构成聚合表的元素;
  3. AggExclude name,这里给出的表名旨在告诉Mondrian该表不是相应事实表的聚合表;
  4. AggName name,这里给出的表名告诉Mondrian该表是相应事实表的聚合表;
  5. AggFactCount column=”FACT_COUNT”,这个字段在每一张聚合表中都存在,记录了相应的事实表中有多少列写入到聚合表中;
  6. AggIgnoreColumn column,该列名的作用是告知Mondrian该列是已知的,应该被忽略;
  7. <AggForeignKey factColumn=”product_id” aggColumn=”PRODUCT_ID”/>这里给出了一个映射关系,即事实表中的product_id列对应了聚合表中的PRODUCT_ID列;
  8. AggMeasure name和AggLevel name这两个元素同样也给出了一个映射关系,即把在Cube的模式文件中定义的逻辑名映射到聚合表中的列名;
  9. AggPattern pattern使用了正则表达式,把符合该pattern的聚合表包括进来。如在本sample中把前缀为agg_sales_fact_1997_的聚合表全部包括进来作为孩子元素;
  10. AggPattern pattern中的AggExclude name元素,该元素很明确地指出在已包括进来的聚合表中,剔除某特定的聚合表;
  11. AggPattern pattern中的AggExclude pattern元素,该元素的作用表现在把符合AggExclude pattern的正则表达式的聚合表剔除;
  12. 第一部分的完整框架是:
 

Logback日志输出规则

Background

LOGBACK作为一款优秀的开源日志组件,相信每位都多少接触过,这里记录几个比较容易忽略却重要的Points(主要指日志输出规则),下面是Logback中关于根节点和子节点之间的继承关系图。

logback1
关于Appender部分

这部分内容就不再说明,关于如何布局日志的输出,网上相关内容已经很多,可以查阅参考文献中给出的链接。
Logger和Root在输出日志时的规则:
Logger用来指定项目源码中某一个Package或者某一个class所对应的日志打印级别,所选用的appender,同时还有一个可选项为addtivity,共三个属性,具体解释如下:

Name:指定项目源码包或者类的路径,为该包或类定义独特的日志格式,一般为com.xxx;
Level:指定输出日志的最低级别,一般为下列中的某一项(缺省情况下使用上级的Level):

Trace
Debug
Info
Warn
Error
ALL
OFF
INHERITED or NULL 表示强制使用上级的Level配置

Addtivity:是否向上级Logger传递日志输出信息,缺省情况下为True。

Root从本质上说其也是一个Logger元素,只不过Root只有一个Level属性
日志输出规则如下图所示:

logback2

Reference

  1. http://my.oschina.net/looly/blog/298675

BOOKLIST OF 2015

Background

2015年已过一大半,年初制定的每读完一本书就写一篇Blog的愿望最终还是没能实现,原因有:

  1. 书读的多了,发现很多思想放在心底会更好,写出来感觉都变味了,原谅我功力不够,怕写出几段骚柔文字侵犯了经典;
  2. 对每一本读完的书写类似读后感的文字,其实是对书中所传导的观点的一种思考,这种思考在我看来是与时俱进的,并不能由当时当下就能下定论,随着时间的推移,细细想之,总能体会出别样的味道,所以还是别定型了;
  3. 我害怕把写读后感变成一种精神上的任务,导致一种让我带着偏离正常轨道的思考去阅读一本书,意思是在阅读过程中就一直在思考如何写这篇书评,却忽略了阅读本身。

所以决定列一份书单,带上简单的几句点评,让我的阅读变得更轻松:

Sept

1、[A Farewell To Arms], 《永别了,武器》 By 海明威(Ernest Hemingway)

经历战争洗礼的男人才懂得战争的真实残酷,我们祈祷有一个美满的结局,但留下的依旧是被战争迫害后的支离破碎,了解战争的残酷,洞悉人性的险恶,惟一让我们能得到慰藉的是人与人之间的爱。

2、[Sams Teach Yourself Regular Expressions in 10 Minutes], 《正则表达式必知必会》 By Ben Forta

由Ben Forta所著的这本正则表达式书籍入门简单,实用性非常强,让人在掌握基本的正则表达式语法之后,会在实际开发过程中有意识的开始思考如何利用正则表达式帮我们做代码优化(很多用代码实现的字符串搜索和替换又臭又长,而这正是正则表达式发挥其神力的地方),删除冗余代码,写出具备实际意义又优雅的代码,赞!

3、[ナミヤ雑貨店の奇蹟], 《解忧杂货店》 By (日)东野圭吾

浪矢杂货店连接着过去与未来,三位年轻人天注定似的逃生来到此,由此展开了一段匪夷所思的精神冒险,从解决他人的烦恼开始,意识到自己对于他人的重要性,最后作者神迹般的让这三位年轻人完成了从不良少年到自我肯定的救赎。作者构思巧妙,中心意图明显,只是读者真的能很好理解作者在构思浪矢杂货店作为链接过去和未来这一桥梁角色的逻辑合理性吗?

4、《嫌疑人X的献身》 By (日)东野圭吾

故事精彩之处在于敌我双方的一攻一守,也即石神达摩和汤川学之间的较量,如果没有汤川学这个角色,很难想象警察能解开这个谜。从这个故事中读出了石神内心的足智多谋,勇敢和无所畏惧,真正为爱献身。

5、白夜行 By  (日)东野圭吾

读完这本小说,内心深处是感到震撼的,不得不说,作者讲述故事的逻辑很强,前后贯通,同时最精彩的是这个故事本身。

 

 

Reference

http://readcolor.com/books/52da22803063e1d3b1000002

中美日韩四国Github开发者比较

  • Background

越来越多的开发者开始使用Github工具,在这之前谁都没法预估一个代码托管网站会收到追捧,受由InfoQ推出的2015年GitHub中国开发者年度分析报告的启发,想做一份关于中美日韩(为什么选择这四个国家,理由是这几个国家跟中国的关系最微妙,呵呵,瞎扯,其实我是随便选了这四个国家)四国的开发者比较文章。

  • 四国开发者数量比较

通过调用Github API来获取每个国家的开发者数量,数据在一定程度上可能会少算导致不够准确,因为API中根据location这个属性去定位开发者所属的国家,而location这个参数值是可选的,如果开发者未填写此项,那么这部分用户将不会被统计在内。具体发起的HTTP GET请求如下:

https://api.github.com/search/users?q=location:china

分别获取了这四个国家的开发者数量,虽然数据在某种程度上并不能保证准确,但不影响其参考意义,四国开发者数量对比图如下所示:

cukj
从上图可以得知,国内开发者数量已经超越美国,处在排头兵的位置,Github在国内开发者社区中的受欢迎程度可见一斑。

  • 四国开发者使用语言分布情况

通过有针对性的选择当前比较主流的开发语言:Javascript,Java,Php,CSS,Swift,Python,Ruby,Perl,Shell,C,了解四国开发者的语言使用情况。

language-china

language-usa

language-japan

language-korea
以上四图分别展示了中美日韩四国开发者的语言使用情况(备注:开发语言所对应的扇区面积越大,表示对应的开发者数量越多),我们似乎能够比较确信的获知以下几点信息:

  1. 纵观统计图可以发现,前台语言Javascript稳固开发语言第一,Js和Java开发者数量占据所有开发者数量的50%以上,尤其是中韩,两者呈现着势均力敌的效果,而美日两国虽然Js和Java开发者占比很大,但Js明显比Java更受开发者喜爱。
  2. 排在Js和Java语言之后的Python,PHP和Ruby不相上下,PHP一直保留着大块江山,目前已推出PHP7;Python和Ruby作为后起之秀,具备动态快速开发的优势,越来越成为开发者的心头之好。
  3. 样式语言CSS的出现有点出乎意料之外,在老旧的思维习惯里,似乎有点轻视它;但细细想来,在如今把用户体验当尚方宝剑的产品设计里面,样式不重要才见的奇怪呢,不知从哪年起,UX方面的人才突然变得非常受欢迎,同时轻框架,重设计的提倡也带来用户体验的变革,这对用户来说必然是一件好事,同时也傲娇到再也不需要去迎合老旧,土鳖的设计习惯,因为当下应用产品正在经历着从匮乏到丰富到五彩缤纷到争雄逐鹿到你死我活的变革,真是虐死一堆产品汪的节奏。好了,有点跑题,只是想说UX被越来越重视着。
  • Github中国开发者区域分布图

这似乎是一个已知的事实,用下面的这幅图说话吧。
china-fenbu
没有歧视其他省份开发者的意思,只是有针对性的选择了这几个我认为开发者相对集中的区域(见着色区域,颜色越深,代表开发者数量越多),这幅图不过是在确认一个事实:北上广深依然有绝对优势的开发者,这些一线城市凭借其综合因素仍然吸引着大批开发者前往,但不可否认的是杭州作为一座时尚美丽干净的城市,尤其是近几年互联网的火热让杭州有赶超一线城市开发者的趋势。

  • Ending

这只是作为我业余时间产生的一个衍生品,数据来自官方(All Data From Github),但不代表任何人,任何组织,我只是觉得好玩而已,并且这篇文章也只是从量上进行一个横向比较,没多少有价值的东西,业余有精力再多挖掘一点有意思的东西分享给大家,就这样。

  • Reference
  1. http://ecomfe.github.io/echarts/index-en.html
  2. https://developer.github.com/v3/search/

一个人的朝圣

看完《一个人的朝圣》 不免唏嘘不已,这就是我们的人生吧,虽然不尽相同,但这一生总是艰难的。人生当中,其实不需要很多个为什么,不需要刨根问底,不经历过的人即使知道了为什么,难道就真的能感同身受,做不到的。

但也带给我一些积极的人生暗示:

  • 想到了就去做,说自己不行的往往都是不够自信,心里有业障,对自己多一点耐心,发现我们就做成了一件事。
  • 人生当中,唯一能保持自己一直愉悦的方法便是找到自己真正想要的经历,除此之外,都是自我妥协。
  • 又及,在很多情况下,我们都想要变得很勇敢,可是只是心勇敢了,强人不仅有一颗勇敢的心,同时也付诸行动,会有牺牲,但不会有遗憾。

Reference

  1. http://book.douban.com/subject/24934182/

The Facebook Effect

这算是今年以来认认真真读过的一本书,这本书不算新,书中剖析facebook的内容也在被大家所慢慢熟知,但总的来说阅读本书还是给自己带来一些积极的思考。经过阅读本书,我试图用自己的语言去概括facebook如此attractive的原因:

  • 满足相互认识的人在线上保持联系

Mark自始至终都在强调做这件事的初心,就是为了满足彼此认识的人在互不见面的时光里也能保持畅通的交流,满足想要了解你的伙伴“最近在忙什么,换了一份新工作?去了什么地方旅游…”,基于如此干净纯粹的想法出现了第一版本的The Facebook

  • 长远的眼光

NB的人似乎都能在当时当下看到长远的未来,其独到长远的想法都能在作品中展露无遗,不得不说,有些时候有些人做出能如此吸引用户的产品是具备一些天赋的,Mark确切知道自己想要什么,坚持什么,即使公司在缺银子,缺设备,快难以为继的情况下也能进行如此的固执坚持,这些固执和坚持带来今天facebook的巨大成功,但在当时却带有很大风险,如果facebook发展后继无力,则在当时看来还算吸引人的收购pay就会开始贬值,幸好Mark长远的想法一直被证明都是正确的,当然中间出现过一些很大的政策和功能上的争议,但总归来说瑕不掩瑜。

  • 用户隐私

对用户隐私的严重关注及保护能很好的体现一家商业公司的社会责任,对之强调再多也不为过,因为用户隐私在一家以社交为主导的互联网商业公司是如此敏感。纵观全书,隐私问题渗透在facebook如此多路牛毛的功能项中,牵一发而动全身,做好隐私保护这一点不易,但facebook照顾到了用户的情绪。

  • 找到搭档

说一千道一万,事情总归需要人去落实。我不算足球迷,最多是个伪球迷,却被足球场上团队拼搏的画面深深感动,横刀立马,气势磅礴,势必洞穿对方球门。Mark再厉害,也势单力薄,幸好有莫斯科维茨、克里斯·休斯、玩世不恭的肖恩·帕克…,所以请尽情脑补吧,Finally, They make it.

  • At last

最后贴一段Mark对比Google和Facebook的原话:

“一面是google,主要取得和追踪已有信息,他们称为爬网。他们爬网,取得网络上的资料放入他们自己的系统。他们想打造google地图,于是派出拍摄车辆,认认真真地去拍你家,然后做出google街景系统。他们利用搜集整理的用户资料做广告,还通过doubleclick和adsense的cookies追踪用户的上网记录。他们就这样建立了一套用户对什么感兴趣的档案。google是个伟大的公司。”

“另一个场景是在我们公司。允许人们分享他们想分享的东西,给他们提供优秀的工具控制如何分享,你可以获得越来越多的共享信息,但是想想那些在facebook上不想分享给所有人的内容,是不是?你可不想这样的信息被爬网,被索引,比如你和家人的度假照片,你的电话号码,所有发生在公司局域网里的事儿,所有私人短信和邮件,所以很大一部分信息变得越来越透明化了,但是仍然有另一大部分不可以对所有人开放的。”

所以我们拭目以待,也许他们能合作,那就无敌了,如果这样还有什么是google做不到的呢,或者两大巨头死磕,那google的劣势是不是会越来越明显?

  • Reference
  1. Facebook效应

SpringMVC 入门笔记

SpringMCV笔记分成两部分,第一部分描述应用启动时针对SpringMVC框架所进行的准备工作;第二部分描述SpringMVC框架完成一次用户请求到响应请求的逻辑处理过程。

第一部分

SpringMVC的本质原理是通过Servlet拦截所有url的请求来达到控制的目的,我们不妨从一个web应用的描述符文件(web.xml)入手一探究竟(这里补充说一句,Servlet技术对于web开发者来说多多少少都有接触过,结合SpringMVC的本质原理,我们是否可以推测出Spring框架的核心:通过层层封装底层相关技术,如Servlet,从而达到高效开发WEB应用的目的,当然这中间包含了作者呕心沥血的构思和设计)。在描述符文件中包含了应用的资源名称,路径,启动项,监听器和拦截器等等,常常看起来像下面这样:

1444898662_full.png

在web.xml中分别标注出了各部分,对重要项进行解释:

1、在Part II中我们配置了一个SpringMVC核心的处理请求类DispatcherServlet,它继承自HttpServlet,继承关系如下所示:

1.1、Servlet框架技术由两个Java包组成:javax.servlet 和 javax.servlet.http。前者定义了所有servelt类都必须实现或扩展的通用接口和类;后者定义了基于HTTP协议的HttpServlet类。在HttpServlet类中包含了

方法,该方法在应用程序启动时执行初始化操作,SpringMVC框架重载了这个方法,用于在启动时针对特定应用需求做初始化工作,比如读取描述符文件中的配置信息。

1.2、当DispatcherServlet载入后,将从XML文件中加载配置信息,在默认情况下,该XML文件的文件名取决于,但也可以支持自定义,在该例子中SpringMVC框架将从/WEB-INF/config/springmvc-config.xml处加载配置项。

1.3、通过配置/拦截所有的用户请求,转向DispatcherServlet作进一步的处理,该请求处理过程可以认为是SpringMVC的核心处理逻辑,留在下一部分进行说明。

1.4、关于<load-on-startup>1</load-on-startup>该配置项表明应用程序启动时,则加载Servlet类,执行其init方法,在正式接受用户请求之前,完成初始化工作,当然也可以不加这个配置项,在第一次接受用户请求时进行资源初始化的操作,但在通常情况下,预先加载资源进行初始化工作会带来节省用户请求时间的好处,数值代表加载的优先级,数值越小,优先级越高。

2、在Part III配置了ContextLoaderListener上下文环境监听器,现在我们就大致来了解下这个ContextLoaderListener具备哪些功能?

2.1、当硬编码的时候,我们可以在代码中直接把Spring的配置信息读入Spring容器,比如通过以下方式:

但在通常情况下,在开发web应用时,考虑到配置的灵活性以及程序的正交性,通常将Spring配置文件的路径以的形式进行注册,并用ContextLoaderListener进行监听,好,交待完小小的背景,现在我们来看看ContextLoaderListener到底给我带来了什么样的功能,先查看其继承关系,如下:

而查看ServletContextListener接口发现其包含了两个需要子类实现的方法:

而web容器在启动时,会自动执行contextInitialized方法,所以我们便可以了解ContextLoaderListener的功能:在web容器启动时,就会默认执行其实现的方法contextInitialized,自动加载ApplicationContext的配置信息,开发者能够在为客户端提供服务之前向ServletContext中添加任意的对象。

2.2、每一个Web应用都有一个ServletContext与之相关联,它类似与一个全局变量,在应用启动时被创建,在应用关闭时被销毁。

Reference

1、http://www.cnblogs.com/xing901022/p/4178963.html

Mondrian+Jpivot在MyEclipse中源码配置的详细步骤

之前在《关于实施一个mondrian+Jpivot的DEMO的方案》中给出了配置Mondrian+Jpivot源码配置的大概步骤,现在兑现之前的承诺,给出在MyEclipse中源码配置的详细步骤:

  1. 首先在官网上下载最新版的Jpivot-1.8.0.zip压缩包,解压到相应的目录。
  2. 在解压的目录中找到一个jpivot.war文件放到/webapp目录下,启动tomcat进行解压,得到一个jpivot的文件夹。
  3. 新建一个web工程,取名jDemo,在第一步中解压出来的文件中根据..\jpivot-1.8.0\src\java这个路径,把该文件夹下的所有文件全部拷贝到新建的web工程的src目录下。
  4. 根据第二步,循着路径/webapp/jpivot,把该文件夹下的所有文件全部拷贝到新建web工程的WebRoot目录下,在拷贝时选择全部 拷贝。
  5. 在完成上述这些工作后,可能会有一个文件报错,因为该文件中有乱码出现,这要根据自己的编码方式了。我在实际的使用过程中,为了能够显示中文,是用了gb2312的编码,这因人而异。同时到目前为止这个文件的作用不知道在哪里,我把这个文件删除之后,程序还是运行正常的。
  6. 现在基本上已经完成源码在Myeclipse中的配置了,很多也许会问不是说Mondrian+Jpivot的源码配置吗,其实我们把jpivot-1.8.0.zip这个包下载下来之后,在配置的过程中,同时也配置Mondrian,可以在配好之后,阅读源码,你会发现这点的。
  7. 好了,本来想上图,看看效果,但是一直上不上来。