Java 控制台输出百分比进度指器

用 Java 在控制台下输出用 System.out.print() 这样的方法,那么要在同一行输出象 FTP 传文件那样的进度指示怎么做呢,它需要在同一行相同的位置上擦除并输出新百分数。比如前一行打印了 1%, 下一次就把 1% 擦除掉,同一位置上打印 2%,就形成了走进度的效果。如下:

console_percent

我们要用到的办法是 System.out.print("\b") 就会在控制台下往回删掉一个字符,如果你想回删多个字符就打印多个 "\b" 吧,只回删除到当前行首,也就是不回影响到上一行的输出。怎么删除当前行全部输出或指定的字符数呢,两个办法:

输出足够多的 "\b",会删除到行首为止,这样做其实也不保险,谁知道上一行会多少字符呢
精确控制回删多少个字符,有时候也需要保留前面一些内容 阅读全文 >>

Maven 工程生成可执行的 JAR 包

远离 Maven 工程有些时日了,也不知道当前还是否在流行 Maven 管理工程与依赖,当前类似工具有 Ant+Ivy, Grunt, sbtGradle。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
lib
        jsch-0.1.50.jar
        commons-cli-1.3-20140216.032825-101.jar     #这里的 revision 号是随 SNAPSHOT 动态而定的

并且在 GoSSH-0.0.1.jar 中的 META-INF/MANIFEST.MF 文件中指定了 阅读全文 >>

Debian 6 上安装 Nginx+PHP+MySQL

正在使用亚马逊的 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一键包。我只记录下我自己的安装过程,以备忘。 阅读全文 >>

JMockit 一个 Expectations 中 Mock 多个方法

从 JMockit 系列的开篇 JMockit 之 Expectations 中了解到了一个最基本的 Mock 的写法,这里记录下在一个 Expectations 中如何同时 Mock 多个方法。基本框架是这样的:

        new Expectations(MyService.class, ExternalService.class) {
            {
                MyService.prefix("Unmi");
                result = "Welcome to website: ";
                
                ExternalService.suffix("Unmi");
                result = "http://unmi.cc";
            }
        };

Java 语法告诉我们 new Expectations(){{......}} 省略号处的代码会在 Expectations 匿名类实例初始化时被调用,那么其中对 result 的赋值便是新创建的 Expectations 匿名类实例的 result 的属性值,那两次的 result 赋值难道不是以最后一个为准吗,有点文章了。先来跑个例子,见识一下现象,由三个类组成,分别是: 阅读全文 >>

JMockit Mock 私有方法和私有属性

前面说过 JMockit 因身处前线,所以简直无不可,本节例子演示 JMockit 怎么 Mock 私有方法和私有属性,示例虽然是静态方法和属性,但因采用的是反射手法,所以这种 Deencapsulation 的 Mock 手段同样适用于公有的方法或属性,无论是否静态。

本文所用 JMockit 版本为 1.6, 可能网上所搜索的方法与此有所不同,请注意 JMockit 版本差异。仍需重复一下,运行 JMockit 的例子 classpath 上必须让 jmockit.jar 在 junit.jar 之前,或用 javaagent 参数来加载 jmockit.jar,并且 junit 要 4.8 及以上版本.

1. Mock 私有方法(非静态类似) 阅读全文 >>

JMockit 之 Expectations

TDD 推求测试先行,不光在自己代码未实现时可以先做好测试,即使平台依赖或第三方接口未准备好我们也能先行一步的,这就要对接口依赖进行 Mock。同时 Mock 也使得我们的测试代码在运行当中不至于随着第三方接口的沦陷而坠入深渊。

Java 中 Mock 工具也不少,像通用 EasyMock, jMock, Mockito, Unitils Mock, PowerMock, 再比如偏专业的 HttpMock, StrutsMock 等。但 JMock 与前面各位相比简直是全能选手,对 final/static/native/private 方法都能 Mock,功能上还远不止这些了,可以看看一个对比图 https://code.google.com/p/jmockit/wiki/MockingToolkitComparisonMatrix

JMockit 是基于 Java5 的 java.lang.instrument 包开发的,所以它才能夺得先机,也可陷得更深。自然它要求 JDK5 及以上,JUnit 4.8 及以上版本。命令行下原来用 -javaagent:/.../lib/jmockit.jar 加载 JMockit,现在发现把 jmockit.jar 放在 classpath 下就 OK 的,但是必须放在 junit.jar 包之前,否则你会看到这个 java.lang.IllegalStateException: JMockit wasn't properly initialized; check that jmockit.jar precedes junit.jar in the classpath。 JMockit 有两种 Mock 方式:

1. Behavior-oriented(Expectations & Verifications)  --- 基于代码执行行为的模仿,象黑盒测试
2. State-oriented(MockUp<GenericType>)   --- 侵入类内部,随意模仿,似白盒,可以说是能为所欲为

此篇体验下第一种 Mock 方式,在测试代码中最直观就是那个 new Expectations(...){{result = some;}},下面来看个实际的例子。应用场景是 阅读全文 >>

Ant 提示输入并根据用户输入执行不同的任务

使用 Ant 进行自动化处理时,不想记住每一个 target  的名称,而是让默认的 target 列出需要的 target 出来,让用户输入名称或数字选择执行哪个 target。这样做自然是多了一步,有时候确也方便不少,但 Ant 还是有个缺点,它不能持久性的保持在 Ant 控制台下,持续的进行用户交互。

对于实现 Ant 的简单用户交互,我们可以借助于两个 Task,inputantcall, input 用来提示用户输入值,再根据 input 设定的属性来确定 antcall 调用哪个 target。执行完退出到系统 Shell 下,想要再来,就再执行一下 ant 吧,我也只能做到这一步了。

看下面的例子 build.xml 内容 阅读全文 >>

SQLite 使用主键,ROWID 及自增列

之前关注过一些嵌入式数据库,倒时 SQLite 风头更劲,在 Android 上被应用,在 HTML5 中一些浏览器的 Local Database 的实现也是 SQLite。因在 PhoneGap 中使用数据库存储的选择也期待着它的表现,首先要建个数据库,第一要义就是主键的选择,自增列是最有效更简单的。

这里就看下 SQLite 怎么使用自动列,了解三个内容,ROWID, ROWID 的别名,自动列与序列表,归根结底它们都是 ROWID。

1. ROWID

每个表默认都有 rowid 列,除非创建表时指定了 WITHOUT ROWID, 它现在是 64 位长的。在查询时用 select * from table1 里没有它,要显式的用 select rowid, * from table1 就会列出它来。

2. ROWID 的别名 阅读全文 >>

PhoneGap, 第一个应用

移动开发有三条路,Native, HTML5 和 Hybrid,Native 可以把各种平台的特性充分发挥,HTML5 简单,可限制太多,混合型是个折中的办法。对于那些不很注重特效又需要访问部分本地资源的应用可采用 Hybrid 的方式,而其中的佼佼者就数 PhoneGap,又说 Cordova。它们是两个主,却又基本相似的东西,见 PhoneGap, Cordova, and what’s in a name?

我们既可以选择 PhoneGap,也可以选择 Cordova,安装使用起来基本类似,再往下的发展的就无定数了。鉴于 PhoneGap 依托于 Adobe 那么一个强大的后台,我还是选择试用下 PhoneGap,并且 Adobe 还为它提供了在线构建和源码托管 http://build.phonegap.com。当然这是一家像 Oracle 那样商业气息比较浓的公司,使用在线构建免费用户只能建立一个应用。

现在看一个应用 PhoneGap 的例子,从安装开始,演示平台为 Mac, 其他平台都类似。PhoneGap 可由 NodeJS 来安装,所以首先要在 http://nodejs.org 安装 NodeJS。然后执行下面的命令安装 phonegap: 阅读全文 >>

Emacs 24 使用第三方主题

Emacs 默认的样子总觉不怎么可爱,所以想要找个主题来装饰一番。试过 http://www.emacswiki.org/emacs/ColorTheme 介绍的办法,从这里下载 http://www.nongnu.org/color-theme 主题文件,并且在 ~/.emacs 中添加了以下几句话:

(require 'color-theme)                                                                                                                                              
(color-theme-initialize)                                                                                                                                            
(color-theme-robin-hood)

重启 Emacs 后不能发现界面有变化,但是在 Emacs 中可以用 M-x color-theme-select 看到装载进来的主题,M-x color-theme-hober 执行后也能看到应用上了这个主题,就是无法持久到下次 Emacs 运行。再次试验了ColorTheme 提到的多种方法都不奏效。

好像是因为我安装的是 Emacs 24 的版本,它有自己的默认主题 deftheme, 和其他备选主题,M-x customize-themes 可以看到下面这样的界面 阅读全文 >>