Vim 中使用被选择文本以 Shell 命令执行

在 Vi 中如果想选取文本作为 Shell 命令来执行该如何做呢? 想法的背景是想在 Vi 中编辑 Shell 命令,主要是对参数的修改,然后直接选择执行,而不希望复制再贴到 Terminal 下看结果。方法其实很简单,用不着使用 VimShell,关键这个插件的安装还依赖于另两个插件。方法就是:

1. 可视模式选择文本,选择技巧, 按 v 逐字选择,j 从光标位置到行尾,最有用的莫过于大 V,以行为单位选择,所以按一下大 V 直接选中当前行
2. Shift+; 进到 :'<,'> 提示符
3. 输入 w !sh, 回车即可,要用 fish 就用  w !fish

效果

vi-selection-shell

原理(这个表述其实不怎么准确):其实进行的是一个管道操作,把选择的文本内容输送给 sh 执行,相当于

echo "echo 'Hello world'" | sh

如果想把执行结果输出到文件或是剪贴板, 就可借题发挥下了,比如 阅读全文 >>

Vi 使用 Vundle 管理插件执行 PluginInstall 出错

Vi 有了 Vundle 这么一个总管(插件管理器),安装插件着实太省事了,再也不需要自己把 *.vim 文件放在各处。只需要做一次

$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

编辑好 ~/.vimrc 文件,装什么每次在这个文件中加上 Plugin 'scrooloose/nerdtree',运行 :PluginInstall 即可。

我第一次体验执行 vim +PluginInstall +qall (和在 Vi 中执行 :PluginInstall 同一效果), 总是得到类似这样的错误

Error detected while processing function vundle#installer#new..<SNR>46_process..vundle#installer#run..vundle#installe
r#install..<SNR>46_sync..<SNR>46_make_sync_command..<SNR>46_get_current_origin_url..<SNR>46_system:
line    1:
E484: Can't open file /var/folders/xz/vqv039517flcxtqzrq_jjy1xqzfzc0/T/v0rQ2fl/1
Error detected while processing function vundle#installer#new..<SNR>46_process..vundle#installer#run..vundle#installe
r#install..<SNR>46_sync: 阅读全文 >>

Play2.3 自定义模板类型 -- Java 版

在上一篇 Play2 自定义模板类型 (Java&Scala),是基于 Play2.2 怎么自定义 Json 模板类型,分别用 Java 和 Scala 实现。从 Play2.3 开始,模板明确了是用 Twirl,所以构建文件上的配置略有不同,并且模板编译出的源文件位置也不一样,Play2.2 前生成的模板源文件在 target/scala-2.10/src_managed/main/views 目录,现在是生成在 target/twirl/main/views 目录。

在 Play2.3 中仍然是默认只支持 html, txt, xml, js 四种类型的模板,见 SbtTwirl。我们这里还是以增加 Json 模板支持为例,且只介绍用 Java 的方式。因为 Play2 尽管可以用 Java 来编写应用,但实现部份基本是 Scala,所以如果用 Scala 来进行扩展相对来说来比用 Java 简单些。

Play2.3 官方的自定义模板的文档 Adding support for a custom format to the template engine 有些出入,似乎还未来得急更新,以实操为证。

还是从构建文件开始 阅读全文 >>

Scala + JUnit 怎么使用 @Rule

JUnit 是个很著名的飞行模式测试框架,即使到了 Scala 中还是免不了要用 JUnit Style 的测试方式,基于 Spec 的方式并不处处行得通,比如想要在 Scala 中使用 JMockit 框架时。

JUnit 提供给我们有两个扩展点,RunnerRule, Runner 扩展点一般被各种框架劫持了,自己搞个 @RunWith(SomeRunner.class) 可能让你无法在测试中应用框架。于是剩下了 Rule 是个更自由的扩展点,这里不讲述怎么定制自己的 Rule,而是怎么用它,怎么在 Scala 中用它。之前的一篇 JUnit 4 如何正确测试异常 中使用了 ExpectedException 这个 Rule。

Rule 的要求是: Annotates fields that reference rules or methods that return a rule. A field must be public, not static, and a subtype of TestRule (preferred) or MethodRule. A method must be public, not static, and must return a subtype of TestRule (preferred) or MethodRule. 属性或方法必须是 public 非静态的,它们的类型或返回类型必须分别是 TestRuleMethedRule

这里尝试以 Java 的方式使用另一个 Rule,TestName, 可以得到当前测试方法的名称 阅读全文 >>

Play2 自定义模板类型 (Java&Scala)

Play2 默认支持的模板类型是 html, txt, xml 和 js,不在这些支持之列的模板文件即使放到 app/views 目录中,也不会被编译的。如果要支持自定义的模板类型就要些定制了,这比 Play1 复杂些。模板的定制包括在 Build.scala 或 build.sbt 中加上 templatesTypes 配置,并需创建 BufferedContent 和 Format 实现类。下面以增加 json 模板类型为例,兼顾 Scala 和 Java 的实现类,是基于 Play2.2 的,在 Play2.3 中又略有不同。

官方有相关的文档,参考:Custom formats on Scala, Custom formats on Java模板定义参考.

在较新一些的 2.2 的 PlaySettings 中,可以看到

弄清了上面的原理后,开始我们的步骤

第一步:修改项目构建文件

在构建文件 build.sbt 或 Build.scala 中增加下面的内容作为项目的 setting 阅读全文 >>

代码中如何获得 Java 方法的形式参数名

对于一个 Java 方法 foo(int id, String name); 我们如何能在代码中获得形式参数名 id 和 name 呢?

我们知道通过反射 API Method.getGenericParameterTypes() 可以获得方法的参数类型,但是对于参数名一般就是 arg0, arg1, arg2 ..., 因为 Java 编译时把形式参数名擦除了。所以对完全擦除了形式参数名的字节码应该是没办法了,但我们自己写的类还是有能力去管控的。

对于自己写的类,有两种办法获得形式参数名,分别是

1) Java8 的 -parameters 编译参数,然后用 Java8 新引入的反射 API Parameter

我们先在 Java8 下运行下面的代码 阅读全文 >>

logback.xml 给变量指定默认值

随着通用日志组件转入 Slf4j,logback 也变成了默认的日志实现,像 log4j 一样,logback.xml 中也可以使用系统属性或环境变量,如 ${catalina.home}。在 log4j.properties 中,如果变量在系统属性和环境变量中找不到的话默认为 "" 空字符串,而到了 logback.xml 中如果某个变量找不到默认就是 "变量名_IS_UNDEFINED" 了,这样就比较奇怪了。

那如何在没有配置 catalina.home 系统属性或环境变量时设置一个默认值呢,例如,没有 catalina.home  时取值为 ".",这时值日志文件的路径就是

./logs/unmi-%d{yyyy-MM-dd}.log

了,也就是生成中当前目录下的 logs 子目录中,这样算是很友好的方式。下面就来分析怎么一步步找到答案的,没耐心或是只求结果的话,直接滚屏到下面就行。

我们的问题是,对于下面那样的 logback.xml 配置: 阅读全文 >>

Mac OS X 下安装使用 Docker

前注: 欢迎进到本页, 本篇写时较早, 而 Mac OS X 下 Docker 早不建议用 boot2docker 了, 取而代之的是 docker-machine. 请点击链接 Mac OS X 下安装使用 Docker (新) 查看最新安装过程与体验

云主机可以选择操作系统镜像快速创建主机,这比虚拟机更便捷了,我们本地也可以这么做了,因为有了 Docker 这个东西。它依赖于 LXC(Linux Container),能从网络上获得配置好的 Linux 镜像,非常容易在隔离的系统中运行自己的应用。也因为它的底层核心是个 LXC,所以在 Mac OS X 下需要在 VirtualBox 中跑一个精小的 LXC(这里是一个 Tiny Core Linux,完全在内存中运行,个头只约 24MB,启动时间小于 5 秒的 boot2docker) 虚拟机,构建在 VirtualBox 中。以后的通信过程就是 docker --> boot2docker --> container,端口或磁盘映射也是遵照这一关系。

理解了上面的关系,开始说说 Docker 安装过程

1. 安装 VirtualBox, 不多讲, 因要在它当中创建一个 boot2docker-vm 虚拟机

2. 安装 boot2docker

brew install boot2docker

你也可以手工安装 阅读全文 >>

Play2 中使用自定义的路由器文件 routes

用过 PlayFramework 的都知道默认的路由器文件是 conf/routes,Play2 可以定义自己的 routes 文件。在默认的 application.conf 中有这么一段注释

# Router
# ~~~~~
# Define the Router object to use for this application.
# This router will be looked up first when the application is starting up,
# so make sure this is the entry point.
# Furthermore, it's assumed your route file is named properly.
# So for an application router like conf/my.application.Router,
# you may need to define a router file my.application.routes.
# Default to Routes in the root package (and conf/routes)
# application.router=my.application.Routes

也就是通过 application.router 可以定义自己的 routes 文件。上面的解释很容易把人搞混,问题在于何处是文件路径,何处是类路径,至少写着的 'conf/my.applicaton.Router 就是在混淆视听。对于上面的解释要明白下面几点 阅读全文 >>

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 连接端口上能找到。 阅读全文 >>