Play1 直接调用 Action 方法,不作 302 跳转

用过 PlayFramework 的同学们应该都知道,Action 方法间的调用是进行的  302 重定向操作。

简单例子说明一下,当基于下面的 r1, r2 路由配置时,如果 Application.f1() 方法中调用了 f2() 方法,实际运作是 f1() 在调用 f2() 时,会先反向出 f2() 方法对应的路由  GET /r2,然后向 /r2 发出的一个 302 跳转.

上面也算是绕个弯形成了对 f2() 方法的调用,这也是非常合理,在 Action 中很容易理解的。

GET     /r1                                                                     Application.f1
GET     /r2                                                                    Application.f2
GET     /r3                                                                    Application.f3

为什么说会反向出 f2() 方法对应的路由,可以反证一下。

例如说在 f1() 中调用了一个 public static void f4() 方法,但是 f4() 并未出现在 routes 配置中,也就是 f4() 没有对应的路由配置,我们将会看到这样一个异常 阅读全文 >>

Mac OS X 下开发 Android 程序时使用 USB 连真机调试

本人很早一篇 Mac OS X 下开发 Android 程序时使用 WiFi ADB 连真机调试,手机端需要连接  WiFi, Root 权限开启 ADB 端口,电脑上执行 adb connect 命令来让 Mac 连接 Android 真机进行调试,其实用不着那么麻烦。

即使是现在新版的 Andorid SDK Manager 里的 Google USB Drive  Not compatible with Mac OS X,并不是说不支持 USB 连接 Android 手机,而是在 Mac 下根本用不着安装这个驱动,有些知名手机直接 USB 连上 Mac 就能被 DDMS 发现。

而我在用一个小米的手机在连机测试,不被 DDMS 识别,解决办法是把小米手机的 Vendor ID 加到文件 ~/.android/adb_usb.ini 中去就行。

Using Hardware Devices 里有很多手机品牌商的 Vendor ID,没有小米的,不急,手机连上 Mac 从设备信息里查相应的 USB 连接端口上能找到。 阅读全文 >>

用 grunt-contrib-connect 构建实时预览开发环境

本文基本是参照着 用Grunt与livereload构建实时预览的开发环境 实操了一遍,直接实现能实时预览文件列表,内容页面。不用刷新页面了,这比以前开发网页程序都简单。

这里要用到的 Grunt 插件有

grunt-contrib-connect, 用来充当一个静态文件服务器,本身集成了 livereload 功能
grunt-contrib-watch, 监视文件的改变,然后执行指定任务,这里用来刷新 grunt serve 打开的页面

以下是个辅助的插件

load-grunt-tasks, 省事的插件,有了这个可以不用写一堆的 grunt.loadNpmTasks('xxx'),再多的任务只需要写一个 require('load-grunt-tasks')(grunt)

参考的文档中提到了 time-grunt 插件,可用来显示每一个任务所花的时间和百分比,由于此示例中基本就 watch 任务占了百分百的时间。

下面是 Grunt 项目的两个基本的文件 阅读全文 >>

Chrome 扩展开发,定制多功能框(omnibox)

原来一直想着用完整的 Web 应用或 GUI 来做些增强效率的工具集,其实我们每天打交道的浏览器,进行下扩展就能好好的利用。粗略对比了下 Chrome 和 Firefox 的插件系统,Chrome 的插件开发应该要比 Firefox 的简单,无需引用什么新的概念,像 XUL。

例如,想实现一下 omnibox,即 Chrome 的全功能框(地址栏),想要地址栏进入自定的 Unmi 模式,输入关键字让 google 去本站查询,或是输入 tag, category 直接进入本站的相关 tag, category 日志列表,在当前浏览器的 Tab 中打开目的页面。

比如在地址栏上输入关键字 "u>", 然后按空格或 Tab 键就进入到 Unmi 模式,如图

unmi_omnibox

下面是完整开发步骤 阅读全文 >>

AngularJS HelloWorld

经历过一个使用 Backbone.js 的项目,把 Backbone.js 也弄得七七八八了,关键是它比较容易理解。最近接触一个使用了 AngularJS 的项目,乍一看那可是两头雾水,它是一个 MVW(Model - View - Whatever) 型的 Javascript 框架。它与 Backbone.js 相比门槛就要高些了,我的第一感觉。一般都说 MVC,AngularJS 引入个 W(Whatever) 概念来意味就更深远了。

AngularJS 抛却了传统的 Javascript 的操作理念,不再是 Dom 上绑定事件,触发事件,操作 Dom 这样的思维。它在 HTML 代码中的表现就是那些 ng-* 属性,以及 {{...}} 括起来的 AngularJS 表达式。一个简单的操作甚至不需要写一行 Javascript 代码,在 AngularJS 的首页就有几个基本的例子,我体验了类似第一个例子,大概是这样子的 阅读全文 >>

Java 设计之初为何就不让用 == 比较两字符串呢?

Java 的字符串值比较不能用 == 号这个设计不知道最初是怎么考虑的,它最大的贡献无疑是滋生了一个长久未衰的面试题,加之连 Code Review 都可能被忽略掉的 Bug。本来两个字符串用等号相比较是最自然而然的做法,然而它却是要迫使我们相信想当然很可能是错误的那样一个道理。

我一直认为 Java 的字符串比较值不能用 == 而必须用 equals() 方法是个不恰当的设计,这从其他种种语言的现实做法(人家都用 == 比较值)就知道。

猜想一下 Java 为何要这样对待字符串,可能 Java 又想类型全部对象化,同时考虑到方便性,仍然保留了 int, short, boolean 等原始类型,它们是可以用 == 比较值,其他真正的对象类型用 equals() 方法比较也是无可厚非的。这时候夹缝中的字符串却被为难到了,它那么的常用,还常以字面量的面目出现,它更该是个基本类型,而实为对象类型,因此不被认可用 == 直接比较值, 而选择了用 equals() 方法来比较字符串值。

而另一方面,由于字符串是多例的,所以有些情况下又更令人迷惑,比如下面的种种情况 阅读全文 >>

JMockit 如何 mock 异常

2014-07-26 修改本文

后来发现用 JMockit 来 mock 异常根本没有之前文中描述的那么复杂,其实还是在那个 result 上,给它赋个异常实例就轻而易举的解决了,只需如此

原文可不用看下去了。


做过几篇 JMockit 使用 Expectations 来 Mock 方法,私有方法,私有属性的的日志,今天工作上突然有个需求是要 Mock 异常。现在再也不能为了跑个单元测试而去拔下网线了,也不该人为的去制造其他混乱来测试。开始是想能不能用 Expectations 来 Mock 异常,尚未发现相关的属性可以设置,没有类似 result 那样的属性,比如想像中有个 exception/throwable 属性: 阅读全文 >>

初始化 Gradle 工程目录

最近重新在 Eclipse 中打开旧的 Maven 项目,总有些什么错误,备受折磨。期间试手了 Ant+Ivy, 现今试用了下 Gradle,感觉不错,它应该才是我真想要的,Maven 差不多该扔到一边去了。

Gradle 像 sbt 构建工具一样,也不会帮我们生成默认的目录布局,这些要自己来做。这不是什么麻烦事,因为只需做一次,可预先写好初始化脚本,幸好本人已习惯 shell 操作。

假设我们有这样的 build.gradle 文件

apply plugin: 'java'
apply plugin: 'war'    //有这行时我们需要创建 src/main/webapp 目录
apply plugin: 'eclipse'

我们执行 gradle eclipse 后是不会生成src 目录的,工程下的源文件目录是需要自己来生成的。Gradle 参考 Maven 的标准目录布局,即

我们有两种办法初始化目录布局 阅读全文 >>

基于 Groovy 的自动化构建工具 Gradle 入门

本人工作之初没有使用自动化构建,后来敏捷了,开始使用 Ant - 完全面向过程的定义步骤,不进行依赖管理。再发展到 Maven,面向对象的方式管理工程,有了依赖的管理,JAR 包统一从中央仓库获得,保存在本地库。同时产生了 Ivy + Ant,让 Ant 也能管理依赖,不过 JAR 包依赖仓库也是用 Maven 的。

前面都是用 XML 来配置的,虽说 XML 的标签描述性也很强,但阅读性还是有些牵强,并且 Maven 和 Ant+Ivy 都需要 IDE 的支持,比如在 Eclipse 中有专门 Maven Dependenciesivy.xml [*] 中列出项目的依赖包,这里常会出现些问题。

而我今天想尝试使用的是基于 Groovy 的 Gradle,只要一个 build.gradle 文件,实质是一个 groovy 文件,由于可以 DSL,所以 Gradle 比 XML 更写意,更主要的是 Gradle 项目不需要 IDE 的特别支持,见后面的图

先要安装 Gradle,在我的 Mac 系统下我是用 brew install gradle 安装的,不同平台下可能用 yum, apt-get,安装后执行 gradle 命令验证。

接着按以下步骤:

1. 创建项目目录 testgradle,并进入到新创建的目录

mkdir testgradle
cd testgradle 阅读全文 >>

Grunt 运行 Jasmine 测试: grunt-contrib-jasmine-示例

上一篇是 Grunt 运行 Jasmine 测试用例: grunt-contrib-jasmine-实例,本篇叫做示例。其竟在于对 grunt-contrib-jasmine-example 的简单的窥探,进而自己的项目中可以如何如何。

如果剔除该项目的几个外围文件,就只下面的结构了

这算是一个最简单的 Jasmine 项目布局了。各位可以自己去查看上面的 Gruntfile.js 和 package.json 的内容,我这里自己来亲自打造一个比这还更简单的项目来,把原来的 jshint 任务也拿掉了。

1. 首先创建项目目录 TestJasmine 阅读全文 >>