自动化构建工具真是缭乱纷呈,最早的 make, nmake, 到 Ant, NAnt, 进化到面向对象的 Maven, Gradle,由 Scala 而起的 SBT, SBuild,再就是今天要说的由 node.js 建立起的生态 Grunt。 Grunt 可以做什么呢,理论上只要有相应的插件支持,它可以应对任何构建任务,但它更为有力的表现是在前端方面。
Grunt 是运行在 node.js 环境,由 npm 来安装,所以首先要安装 node.js, npm, 它们俩的安装不多说,我这里的版本分别是:unmi@localhost ~> node --version
运行 Grunt 还要安装 grunt-cli, 使用命令 npm install -g grunt-cli,安装后我机器上 Grunt 的版本是 Read More
v0.10.24
unmi@localhost ~> npm --version
1.3.21- 我们在 Tomcat 中可以开启 SSL,用 HTTPS 来访问,见前一篇 快速启用 Tomcat 的 HTTPS 协议访问, 不过更接近实际的应用是 Tomcat 只担当 Servlet 容器,HTTPS 协议部份,甚至是静态页面是交给 Apache 的处理,Apache 与 Tomcat 之间有一个通道。 当然前端用 F5 那类负载均衡设备就另当别论了。
这里实践一下怎么开启 Apache 的 HTTPS,并与 Tomcat 进行整合的操作。平台是 Mac OS X, Apache2, Tomat8,其他平台或不同版本的应用软件配置类似。
第一步: 生成自签署证书
安全加密的东西都得证书,我们需要用到 openssl,没有就先安装它,命令是:openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key
上面命令可以指定生成 server.crt 和 server.key 文件的目录,默认产生在当前目录下,假设这两个文件生成在/etc/apache2目录下。 Read More - 记录下这个其实没有多大的意义,新入手 Play 框架的应该直接就是用版本 2 了,只因我们还要系统工作在 Play1 下,所以记下来,估计在 Play2 中已无借鉴作用了。
我们在 Play1 中访问外部 WebService 资源都是用WS.url(url),然后调用它的 get(), post(), delete() 等相对应的 HTTP 请求方法。我们可以系统中所有通过 WS.url() 访问的 URL, 需找到切面,Play 是在哪里为访问的 URL 创建请求的。
看 WS 类的实现,它是一个 PlayPlugin 插件,其中定义了private static WSImpl wsImpl = null;
来看 Play 是如何获得 WSImple 实现的,WS 插件的初始化方法中: Read More - 有时候安全考虑会要开启 Tomcat 的 https 协议访问,最快速的配置,两步
1. 创建 keystore 文件
执行 JDK 带的命令keytool -genkey -alias tomcat -keyalg RSA
按命令提示各个信息即可,最后在用户主目录下创建了一个 .keystore 文件
2. 配置 Tomcat 使用 keystore 文件
打开 server.xml 找到下面被注释的这段Read More1<!-- 2<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" 3 maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 4 clientAuth="false" sslProtocol="TLS" /> 5--> - 有了前面的 SAM,Lambda 表达式,以及默认接口方法作铺垫后,我们可以去很好的去理解 Java8 用 Lambda 表达式操作集合的基本原理了。此篇我们想要化解的示例代码如下:
1package cc.unmi; 2 3import java.util.Arrays; 4import java.util.Collection; 5import java.util.List; 6import java.util.stream.Collectors; 7 8/** 9 * @author Unmi 10 */ 11public class TestJava8Collection { 12 public static void main(String[] args) { 13 Collection collection = Arrays.asList("abc", "cde", "efg"); 14 List list = collection.stream().filter(x -> x.contains("c")).collect(Collectors.toList()); 15 list.forEach(x->System.out.println(x)); 16 } 17}
如果对其他支持闭包的语言,如 JavaScript, Groovy, Ruby, Scala 等有所了解的话,很容易看出前面的代码输出为abc
cde Read More 进入 Java8 之后我们会发现接口可以有方法实现了,这与我们一直看待 Java 接口的观念产生了冲突,不过也别急,接口中的方法实现必须是一个默认方法,即像
本文旨在探讨 Java8 的默认接口方法存在的合理性,Java8 在这点上如何保持与前面版本的兼容性。1interface Shape { 2 default boolean isShape() { 3 return true; 4 } 5}
Lambda 和方法引用使得 Java 语言更具表现力。说到 Lambda 和方法引用的关系,Lambda 表达式的目的就是让你更为便捷的去绕过对象直接引用方法。
接口应该是相对稳固的,我们应该有这样的经验,类中使用了接口中定义的常量,如果在接口中改变了该常量值,单纯的替换接口对应的 class 文件是不奏效的,因为编译类时其实是把接口中的常量直接固化在类中了。如果类中要体现出最新常量值,那么使用接口的类也要重新编译。即使在接口中添加或改变了方法定义,也不能强制使用到它的类重新编译,早先的类完全可以自由的运行,因为接口中定义的常量和方法的所有内容都在自身,类一旦编译后便可脱离所实现的接口而运转。 Read More- 用 Java 在控制台下输出用
System.out.print()这样的方法,那么要在同一行输出象 FTP 传文件那样的进度指示怎么做呢,它需要在同一行相同的位置上擦除并输出新百分数。比如前一行打印了 1%, 下一次就把 1% 擦除掉,同一位置上打印 2%,就形成了走进度的效果。如下:
我们要用到的办法是System.out.print("\b")就会在控制台下往回删掉一个字符,如果你想回删多个字符就打印多个 "\b" 吧,只回删除到当前行首,也就是不回影响到上一行的输出。怎么删除当前行全部输出或指定的字符数呢,两个办法:
输出足够多的 "\b",会删除到行首为止,这样做其实也不保险,谁知道上一行会多少字符呢
精确控制回删多少个字符,有时候也需要保留前面一些内容 Read More - 远离 Maven 工程有些时日了,也不知道当前还是否在流行 Maven 管理工程与依赖,当前类似工具有 Ant+Ivy, Grunt, sbt 和 Gradle。Web 工程的输出发布包没什么好说的,因为 <packaging>
war</packaging>,所以mvn package出来的 WAR 包里就有站点运行的所有内容了,用到的依赖会在 WEB-INF/lib 目录下列着。
而对于那些 <packaging>jar</packaging> 的工程,用mvn package只会生成一个 JAR 包,它所依赖的各个类库仍然分散在本地仓库中,而我们的发布包应该包含这些第三方依赖的。
假定,有一个 GoSSH Maven 工程,设定的版本是 0.0.1,它依赖了 jsch-0.1.50, commons-cli-1.3-SNAPSHOT,想要发布的包有如下布局GoSSH-0.0.1.jar
并且在 GoSSH-0.0.1.jar 中的 META-INF/MANIFEST.MF 文件中指定了 Read More
lib
jsch-0.1.50.jar
commons-cli-1.3-20140216.032825-101.jar #这里的 revision 号是随 SNAPSHOT 动态而定的 - 正在使用亚马逊的 VPS,一年的小心翼翼的免费期,选择的是 Debian 6 32 位的系统,因搭建 WordPress 试图在上面安装 Nginx+PHP 的环境。看着在 Nginx 环境下多是使用 php-fpm,而不是 php-cgi,前者与后者的区别是在孤立的 php-cgi 之上又多了一个调度层。
一开始打算一步步纯手工打造,但在执行apt-get install php-fpm时总有不可逾越的依赖症,所以转而寻求更傻瓜的一键包安装方式。试过 LNMP,包太大,东西太过于齐全,把人太当傻瓜,虽然如此,我在用它安装时也有些慢,因为它也是采取的编译安装方式,针对本机应该有很好的优化。没装完我就中断了,下次有时间可以再试下。
正好在这期间看到了 Dvid Pennington 制作的 lowendscript lnmp 一键安装脚本,很省事,连安装 WordPress 也考虑到了,这里有介绍,比较详细 lowendscript:最省资源lnmp一键包。我只记录下我自己的安装过程,以备忘。 Read More - 从 JMockit 系列的开篇 JMockit 之 Expectations 中了解到了一个最基本的 Mock 的写法,这里记录下在一个 Expectations 中如何同时 Mock 多个方法。基本框架是这样的:
1new Expectations(MyService.class, ExternalService.class) { 2 { 3 MyService.prefix("Unmi"); 4 result = "Welcome to website: "; 5 6 ExternalService.suffix("Unmi"); 7 result = "http://unmi.cc"; 8 } 9};
Java 语法告诉我们 new Expectations(){{......}} 省略号处的代码会在 Expectations 匿名类实例初始化时被调用,那么其中对 result 的赋值便是新创建的 Expectations 匿名类实例的 result 的属性值,那两次的 result 赋值难道不是以最后一个为准吗,有点文章了。先来跑个例子,见识一下现象,由三个类组成,分别是: Read More