sbt 项目继承并扩展了 Maven 的默认项目布局, 加入了 Scala 代码的支持, 所以目录如 Shell 命令
mkdir -p src/{main,test}/{java,scala,resources}生成的目录结构, 即.
└── src
├── main
│ ├── java
│ ├── resources
│ └── scala
└── test
├── java
├── resources
└── scala
这个目录目录虽然很清晰, 但把 Java 和 Scala 代码拆在两处没多大必要, 其次是层次多了点. 因使用 Play Framework 时日有点久了, 比较习惯于 Play 2 改造后的项目布局. 我们启动到 Play 2 的 activator(其实就是加入了定制的 sbt) 控制台, 用命令看它的目录布局 Read More两年前的一篇Mac OS X 下安装使用 Docker 安装时还是用的 boot2docker, 如今进化到了在 Mac OS X 下用 Docker Toolbox, 而且命令也由 boot2docker 换成了 docker-machine. 当然由于是非 Linux 系统, 所以 Mac OS X 仍然需要借助于 VirtualBox 中的 Linux 虚拟机作为桥梁, Docker Toolbox 创建的虚拟机名是 default (boot2docker 创建的虚拟机名是 boot2docker-vm) 就是这一桥梁, 我们称之为 DOCKER_HOST. 文中的 default 虚拟机指的就是这个 DOCKER_HOST.
现在来看下安装步骤及体验, 因为我系统中已安装好了 VirtualBox, 所以这一步骤等会就省略了.
一. 安装 docker 和 docker-machine
官方的指南是通过下载 DockerToolbox 来安装 docker, docker-machine 和其他辅助工具. 但如果你偏于极客, 并不习惯于图形界面来安装的话, 那么安装 docker 和 docker-machine 就只要下面两个指令
1brew install docker 2brew install docker-machine如果你已选择了使用上面的两条命令来安装 docker, docker-machine 的话, 那么请跳到下一步.
如果你热爱图形界面来安装应用的话, 可以到页面 https://www.docker.com/products/docker-toolbox 中下载 Mac 的版本的 DockerToolbox-1.10.3.pkg, 当前版本是 1.10.3
Read More- Java 7 首次引入了 fork/join 框架,但一直未曾直接尝试. 而且基本上也很少在实际项目中直接写 fork-join 的代码,在我们使用第三方组件时倒是间接会接触到 fork/join 框架。譬如 Akka 的 fork-join-executor, sbt 执行测试用例时也是默认 fork/join 并发执行。fork-join 可以帮助我们把计算任务粒度细化,并更有效的利用多 CPU 内核。
fork-join 与 map-reduce 有些相妨,在 Java 7 时代我其实是忽视了它的存在。目今正在了解 Java 8 的 parallelStream 时,因为它的底层实现也是 fork/join, 所以有兴致去稍加体验一下。fork/join 的算法简单来讲就是递归对半去细化计算任务,及到不能细化时由多内核(线程)去计算被拆分的任务,最后反方向把结果汇总。
下面是从 《Java 8 IN ACTION》中截的一个说明 fork/join 的处理过程 Read More 我在 Mac OS X 下执行 brew update 出错
➜ brew update
error: Your local changes to the following files would be overwritten by merge:
Library/Formula/abcde.rb
Library/Formula/acpica.rb
............
Library/Formula/pypy.rb
Library/For
error: The following untracked working tree files would be overwritten by merge:
Library/Aliases/actor-framework
Library/Formula/aescrypt-packetizer.rb
............
Library/Formula/stlink.rb
Library/Formula/with-readline.rb
Please move or remove them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master Read More- 我们无论是在写批处理还是 Linux 的 Shell 都常用到 >, >> 或 <,这是输入输出重定向。特别是 Linux 的 Shell 常见到 2>&1 这样的写法,这是在干什么呢?这里就来了解下 Linux 下的输入输出重定向的一些来龙去脉。
在 Linux 下几乎一切都号称是文件,标准输入、输出也不例外,它们是叫做 fd (File Descriptor) 文件描述符。这里我们关注三个东西名称 代码 操作符 Java中表示 Linux 下文件描述符(Debian 为例) 标准输入(stdin) 0 < 或 << System.in /dev/stdin -> /proc/self/fd/0 -> /dev/pts/0 标准输出(stdout) 1 >, >>, 1> 或 1>> System.out /dev/stdout -> /proc/self/fd/1 -> /dev/pts/0 标准错误输出(stderr) 2 2> 或 2>> System.err /dev/stderr -> /proc/self/fd/2 -> /dev/pts/0
从以上表格我们可以理解 0, 1 和 2 分别是什么东西了,它们的输入源或输出目的地默认都是屏幕。
下面不作系统解释输入, 输出重定向的完整使用,只说明一些常见的例子: Read More - 使用过 Java 反射的大多都知道, 想要修改某个类或对象的私有变量的值的话, 在调用 set 设置新值之前执行一下 setAccessible(true) 即可。这样利用的 Java 的反射就能绕过 private 的限制 ,不再有 IllegalAccessException 异常了。这是一个 trick, 调用 Java 的私有方法也能这么做,有些人或许或这样来测试 Java 私有方法。
提前说一句:在修改 final 型值时,要特别留意它的常量值本身是否被编译器优化内联到某处,否则你会看到虽然没什么异常,但取出的还是原来的值。后面会稍为深入的讲到。
例如下面是一段完整的代码, 由于调用了 setAccessiable(true), 所以能成功把 OneCity 的私有属性 name 的值改为 "Shenzhen": Read More - 在 NodeJS 中进行异步操作很简单,而 Java 到了 7 开始才支持异步的 IO 操作。虽然之前的版本有引入非阻塞 IO,但编码中还不易体现出它的优越性。亮一下 NodeJS 用异步 IO 的例子:
var fs = require('fs');
fs.readFile('Test.scala', 'utf-8', function(err, data){
if( !err ) {
console.log(data);
}
});
console.log('continue doing other thins');
执行输出是
continue doing other things
CONTENT FROM FILE Test.scala
对的,理想中的异步操作就是,传递回调函数来读取文件,读取完成后招待回调,且不阻塞主线程。
在 Java 8 之前,因为没有 Lambda 支持只能应用内部类的方式。JDK 提供了以下异步 Channel 来实现异步操作
AsynchronousFileChannel Read More - Java 泛型在调用方法操作时应用具体参数还是很好理解的,比如
Map<String, Integer> map = new HashMap<>(); //钻石操作符是 JDK 1.7 引入的
后续的 put 操作调用的具体方法就是
Integer put(String key, Integer value)
因为 put 方法的原型是
V put(K key, V value)
上面的代码我们是看到了 <>,所以知道是泛型调用。有时候并不需要 <>,但实际上也是进行的泛型调用,那就是 Java 可以依据变量声明类型来作特化调用 -- 应用具体参数类型。
例如:
List<String> list = Collections.emptyList(); //虽不见 <>, 但同样是泛型调用,类型为 String Read More - 我们在用 Java 解析 XML,当文档不是一个合法的 XML 时,可能会收到
[Fatal Error]的控制台输出,即使把整个代码都 catch 住,仍然不能抑制住 [Fatal Error] 的信息输出。比如常见到这样的输出:[Fatal Error] :1:1: Content is not allowed in prolog.
为什么不能禁掉它呢,本来 catch 了异常对程序已经有了很好的保护,想眼不见心不烦,但还是避之不及。
因为,因为这个 XML 解析器用System.error.print()输出来了,当然你可以用 System.setErr(PrintStream) 重定向掉错误输出,但不现实,波及面太大。我们需要找到源头,首先交代解决方案就是覆盖掉默认的 ErrorHandler。
看下这段 XML 解析代码: Read More - 作为编程,讲救效率自然是用各种 IDE,诸如 Idea, Eclipse, NetBeans 等。但平时总也离不开一款趁手的纯文本编辑器,如阅读各种语言的代码,简单编辑。我就经常会用 Sublime 这类工具的列编辑功能,奇怪于为何 IDE 们鲜有提供列编辑的特性的。
在 Mac 下的 TextEdit 其实是一款富文本编辑器,且未给编程带来任何便利。根据本人从开始扑向 Mac OS X 平台起到现在,选择过三款程序编辑器,它们分别是 TextMate, Sublime 和 Atom,前两为付费的,最后一个是免费的。
1. TextMate
最早听说很多人喜欢用它写 Ruby 程序,也不知是不是真的. TextMate 以其卓越的 Bundle 们驰行于天下。只是最近几年来它却裹足不前了,似乎失去了前进的方向,一直稳定在 1.5.11 版本上,2.0 已经 alpha 很久了. 其间好像思考过开源,出现在了 GitHub 上 https://github.com/textmate/textmate,少有维护。 Read More
