谈谈架构

之前开头的《架构设计原则》一文一直没有把坑填上。而最近在公司内部做了一次架构交流/培训,把架构的概念、架构的形式、架构设计原则都做了阐述,正好算是对此文的完成和补充。

PPT观看

[译]在Java中提升函数以更好地“函数式”编程

Java8中的Stream和Optional给我们带来了函数式编程的乐趣,但Java仍然缺少很多函数编程的关键特性。Lambda表达式、Optional和Stream只是函数式编程的冰山一角。这也导致了varvrfunctionlajava这些类库的出现,他们都源于Haskell这个纯函数式编程语言。

如果想要更加地“函数式”编程,那么首先要注意的是不要过早的中断monad(一种设计模式,表示将一个运算过程通过函数拆解成互相连接的多个步骤。只要提供下一步运算所需的函数,整个运算就会自动进行下去, Optional、Stream都是monad),比如,很多人经常会在还不需要的时候就调用了Optional.get()和Stream.collect()提前终止monad。本文主要讲述如何通过提升方法来使得代码更”函数式”。

《Java工程师修炼之道》内容概览

最近几个月由于工作和正在筹备《Java工程师修炼之道》一书的原因一直没有写新的文章。不过,忙里偷闲,自己陆续读完了《格鲁夫给经理人的第一课》、《架构真经》、《聊聊架构》这几本书,收获了不少干货,之前自己挖坑的《一些架构设计原则》一文后面会尽快填上。本文则先介绍一下《Java工程师修炼之道》一书^_^。

《Java工程师修炼之道》一书主要内容是Java后端工程师必备的基本技能大纲。内容主要来自于公司内的后端工程师学习计划、自己以前的一些博客文章和自己从业以来积累的知识库。但由于后端工程师的每一个技能点都具有一定的深度,都不是一两篇文章就能讲述清楚的,因此本书不可能对每一个技能点都讲的特别透彻。

本书可以看做是一本Java工程师的入职指南,也可以看做一本串联Java后端技能点的参考手册。对其中每一个技能点的学习,推荐通过他们的官方文档来深入学习,此外,本书也给出了自己觉得有价值的参考学习书籍。

JVM诊断调优CheatSheet

包含诊断调优java应用的各种命令以及jvm配置示例。

常用Shell命令

  • 查看网络状况

      netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    
  • 使用top去获取进程cpu使用率;使用/proc文件查看进程所占内存。

      #!/bin/bash
      for i in `ps -ef | egrep -v "awk|$0" | awk '/'$1'/{print $2}'`
      do
          mymem=`cat /proc/$i/status 2> /dev/null | grep VmRSS | awk '{print $2" " $3}'`
          cpu=`top -n 1 -b |awk '/'$i'/{print $9}'`
      done
    

如何读取ClassPath下的资源

最近在写一些公共组件时,碰到了需要读取classpath下文件的场景。也突然想起其实之前有很多场景牵扯到读取类加载路径下的文件内容、路径,包括非jar包和jar包中的。总结一下,以备后续使用。

2016年读过的书

16年由于工作、身体等各种原因,阅读的书籍并不多。主要集中在技术方面。

  • 计算广告

    广告是什么?广告的效果如何评价?机器学习如何应用在计算广告上?作者从产品、运营、技术角度分别进行了阐述。是其计算广告课程(清华、北航的研究生课程)的总结和输出,推荐广告系统开发工程师学习和参考,个性化推荐系统的开发者也能够从中得到很多启发。

  • 集体智慧编程

    机器学习的经典书籍。讲述了集体智慧相关的东西,也是推荐系统相关的一本书。可以看做是机器学习的入门书籍。

  • 七周七并发模型

    多线程、Actor、Lambda架构等八种并发模式。看完此书,确实能够开阔眼界,拓展思路。和系列中的《七周七语言》《七周七数据库》《七周七Web开发框架》都是类似的拓展眼界的佳作。

  • 写给大忙人看的Java SE 8

    浅显易懂地对JDK 7和8新特性的概括,很薄的书,很快就能够看完,做到对Java新版本特性的了解。

  • 快学Scala

    Scala这个编程语言的学习曲线很陡,之前找到twitter的scala school,但是发现讲的有点不到位。此书作为Scale学习的入门书籍值得阅读。

[译]JDK自带工具之问题排查场景示例

目录

最近看到了大量关于java性能调优、故障排查的文章,自己也写了一篇Java调优经验谈。接着此篇文章,其实一直打算写写一些常用调优工具以及它们的惯常用法的。后来在http://java-performance.info这个站点上看到了类似的一篇博文,自我感觉很有指导意义。于是决定翻译+重组织一下此篇文章:Java server application troubleshooting using JDK tools

引言

在Java世界中,我们的很多开发工作从编码、调试到调优都在使用GUI工具。我们经常尝试在本地构建一套和线上一样的环境从而使得问题能够重现,进而使用我们常用的工具来排查定位故障。但不幸的是,很多情况下是无法在本地重现线上问题的。例如,我们没有权限获取真实客户端提交到线上服务端的数据。

由此,很多时候都是需要远程来排查线上服务器上发生的问题。但是如果单单只有一个JRE的话,你也不可能有合适的办法来进行排查。你需要JDK或者第三方的工具。有时候使用JDK提供的工具就是最可取的方案,毕竟,在线上环境使用第三方工具有时候会牵扯到权限的问题。

一般情况下,在线上环境安装JDK发布版本可以让排查进行地更高效。建议安装使用最新的Java7/8 JDK或者构建与线上JRE匹配的一些工具(原文作者不建议安装jdk的发布版本,而是建议根据实际需求逐渐地安装其中的工具)。

[译]使用Groovy的AST Transformation实现DSL

最近在看一些java开源项目时,发现不少是用gradle做为项目构建工具的。之前虽然也用过gradle,但是却没怎么仔细留意build.gradle的语法是groovy的。但这次再怎么看也觉得里面的好多语法都和以前用过的groovy都联系不到一起。各种懵逼状态。。。后来阅读了这篇文章,算是解答了一些疑问:http://www.cnblogs.com/CloudTeng/p/3418072.html。但是对于下面这种写法,还是不知道是怎么回事:

task copyFile(type: Copy){
    from 'xml'
    into 'destination'
}

copyFile做为task名称竟然不是一个字符串,阅读了groovy的文档也没发现字符串可以省略引号的说明(php中引号倒是可以省略),此外一个方法后面跟一个参数然后这个参数又跟着一个括号,这又是什么语法。。。凭直觉觉得这里的copyFile应该是一个方法,但是这时候copyFile还没有定义啊。。。

带着以上疑问,去翻了一下groovy的官方文档,凭感觉觉得gradle是利用了groovy的ast trasnfomation,也就是抽象语法树转换(故名思议,也就是能够转换groovy的语法树从而创造自己的一套语法)。那么到底是不是这样呢?http://blog.csdn.net/zxhoo/article/details/29830529给出了解释并证明了这个结论。但是groovy的ast transformation到底是什么东西呢?国外有一篇博客给出了比较清晰明了的讲述:http://www.jroller.com/DhavalDalal/entry/a_case_for_using_groovy。以下即对此篇博文的翻译。