Play 2.0 中文资料--翻译附注解(持续更新中)

最近在研究 PlayFramework 2.0,主要关注在使用 Scala 来写 Play 2.0 的应用,下面是从官方文档进行的翻译,并加入了大量的自己的理解与备注( Unmi 注: 起头的蓝色文字)

  1. Play 2.0 中文资料 - 开篇
  2. Play 2.0 中文资料 - 安装 
  3. Play 2.0 中文资料 - 创建一个新的应用 
  4. Play 2.0 中文资料 - 剖析 Play 2.0 应用 
  5. Play 2.0 中文资料 - 使用 Play 2.0 控制台 
  6. Play 2.0 中文资料 - HTTP 编程 
  7. Play 2.0 中文资料 - 搭建你偏爱的 IDE 
  8. Play 2.0 中文资料 - Action, Controller 和 Result 
  9. Play 2.0 中文资料 - HTTP 路由 
  10. Play 2.0 中文资料 - 操控 Result  阅读全文 >>

WordPress 升级到 3.5 之后 Widget 无法拖动, 设置的解决办法

WordPress 升级到 3.5 之后发现 Widget 无法拖动,也无法展开设置。在之前也发生过类似情况,一般来说是某个插件或主题的影响,原来一一试过,才知是因为 Use Google Libraries 这个插件在作祟,禁了就能恢复正常。这回也以为旧病复为,禁为 Use Google Libraries,仍然无济于事。

后通过 FireFox 的 Firebug Console Errors 中看到浏览 Widget 编辑页面时出现脚本错误:

Error: Syntax error, unrecognized expression: #enh_rp-show-select-%i%
...eturn t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=...

点击进去,才发现坏在了  jQuery 1.8.3 上去了,jQuery 我想应该是久经考验的革命 LD 吧,自然黑锅就得让 WordPress 来背了,这时的 WordPress 只能算作是临时工,更时髦的名称是合同工。

查了下,这个问题在 WordPress 的坛子里有不少人上报,有人列出了些解决方案,拣亲身试过的在这里供出来。 阅读全文 >>

简单实现 Java 的 Tuple 元组数据类型

元组类型,即 Tuple 常在脚本语言中出现,例如 Scala 的 ("Unmi", "fantasia@sina.com", "blahbla")。元组可认为是象数组一样的容器,它的目的是让你方便构造和引用,例如 Pair 可认为是一个只能存两个元素的元组,像是个 Map; 真正的元组应该是可以任意多个元素的容器,绕来绕去,它还是数组,或列表,所以我们实现上还是要借助于数组或是列表。

先看 Scala 中什么是元组:

Scala 中访问从 1 开始,用 ._1 方式来访问其中的元素。

参照于此,写出一个 Java 版本的 Tuple,为增长你的键盘的使用寿命,我们把方法名也缩短了,例如 make 缩写为 mk,引用元素的方法名为 _,仍然保持 Java 的习惯,索引从 0 开始: 阅读全文 >>

Java 里把 InputStream 转换成 String 的几种方法

我们在 Java 中经常会碰到如何把 InputStream 转换成 String 的情形,比如从文件或网络得到一个 InputStream,需要转换成字符串输出或赋给别的变量。

未真正关注这个问题之前我常用的办法就是按字节一次次读到缓冲区,或是建立 BufferedReader 逐行读取。其实大可不必费此周折,我们可以用 Apache commons IOUtils,或者是 JDK 1.5 后的 Scanner,还可用 Google  Guava 库的 CharStreams。到了 JDK7,若要从文件中直接得到字符串还能用 java.nio.file.Files#readAllLines 和 java.nio.file.Files#readAllBytes 方法。

下面看各个例子,为能够实际用运,例子写在 main 方法里,并从文件获得一个 InputStream,代码中把可能要捕获的异常抛出来。再就是注意处理输入输出流时有涉及到字符集,字符集乱了就乱码了,默认字符集是 System.getProperty("file.encoding"),通常我们都用 UTF-8,异常 UnsupportedEncodingException 继承自 IOException。

下面的 6 个方法中应该有一个你能看得上的吧,用 Groovy,Scala 的除外,若未找到一个遂意的,告诉我,你有好办法更应该告诉我。

1. 使用 JDK 5 的 Scanner 阅读全文 >>

Objective-C 类方法 load 和 initialize 的区别

过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method)。它们的特别之处,在于iOS会在运行期提前并且自动调用这两个方法,而且很多对于类方法的规则(比如继承,类别(Category))都有不同的处理。

而因为这两个方法是在程序运行一开始就被调用的方法,我们可以利用他们在类被使用前,做一些预处理工作。比如我碰到的就是让类自动将自身类名保存到一个NSDictionary中。

先来看看NSObject Class Reference里对这两个方法说明:

+(void)initialize

The runtime sends initialize to each class in a program exactly one time just before the class, or any class that inherits from it, is sent its first message from within the program. (Thus the method may never be invoked if the class is not used.) The runtime sends the initialize message to classes in a thread-safe manner. Superclasses receive this message before their subclasses.

+(void)load

The load message is sent to classes and categories that are both dynamically loaded and statically linked, but only if the newly loaded class or category implements a method that can respond.
The order of initialization is as follows: 阅读全文 >>

Xcode 4 中使用自定义字体,非 Outlet 方式

在 Xcode 3 的时代,如果要使用自定义字体,只要把字体安装到系统中,就能够在 Interface Builder  中字体列表中选择到,当然需要把字体文件加到项目中,并且在 Xxx-Info.plist 文件中列举出来。

而到了 Xcode 4 后,要用个自定义的字体反而更难了,字体安装到了系统中,它也不会出现在 Interface Builder 中的字体列表,必须用 setFont 为需要的控件应用自定义字体,这是一个浩大的工程,要么遍历控件,要么就得为控件与 IBOutletCollection 关联起来。

难道是 Apple 不希望看到应用中各色字体令人眼花缭乱的景象,所以制造点障碍。也不知道新的  Interface Builder 中的字体列表由哪得来的,是否能把自己的字体出现在该列表中呢?这个嘛,有点难。

既然不想使用 setFont 方法对 Xib 中的众多的控件一一设置字体,那就得另寻 Hack 方法了,幸好有了 FontReplacer 的方法。FontReplacer 是为 UIFont 做的一个 Category,它的实现原理是利用 method_exchangeImplementations 机制把 UIFont 的 fontWithName:size:fontWithName:size:traits: 换成自定义的方法,然后在自定义的方法中按照预设置的字体映射,当遇到某个系统字体 A 时,换成自定义的字体  Custom-A。

而你所要做的就是在 Interface Builder 中寻找字体,自己记住当选用了 系统字体 A,运行时会是 Custom-A 字体,系统字体 B 运行时会是 Custom-B,根据需要自己映射就行。一般方便起见,我们会选择一种字体(Family),然后用它的 Style 来与我们的自定义字体对应。这样只需要 Interface Builder 里像往常一样设置字体就行了,从而达到一劳永逸。 阅读全文 >>

使用 sbt 的 np 插件自动创建目录结构和 build.sbt 文件

通常我们要创建一个 sbt 项目需要经历以下几步:

$ mkdir testscala && cd testscala      #创建项目目录 testscala,并进入该目录
testscala $  mkdir -p src/{main,test}/scala   #创建源文件目录结构,可能还需要 mkdir -p src/{main,test}/resources
$ vi build.sbt # 填入基本的信息 (name, organization, version)
$ sbt

这一看怎么这么复杂啊,特别是习惯了 Maven 的同学们更会这么觉得。Maven 不仅可应用各种模板来创建不同类型的工程,完整的工程目录结构都有了。

那么 sbt 能不能做到自动创建目录和配置文件呢,答案是: 本身不能。你可以基于一个项目模板目录结构拷来拷去。前面说是 sbt 本身不能,要知道 sbt 是一个插件化更彻底的玩意,如今的 0.12.2 的 sbt.zip 才 1M 大小,其余全赖插件帮你插来插去了。

因此,我们找来的 np(New Project) 插件 https://github.com/softprops/np 帮我们创建工程的目录结构和 build.sbt 文件。它能让我们创建项目的过程简化为以下两步操作:

$ mkdir testscala && cd testscala   #这一步还是不能少
$ sbt
> np name:testscala org:cc.unmi   #这样 testscala 下 {main.test}/{scala,resources} 和  build.sbt 文件都有了

np 的安装及使用可以参考:https://github.com/softprops/np,就是下面的步骤: 阅读全文 >>

Objective-C 实现自己的 Subscripting Methods 下标方法

在前一篇 Xcode 4.4/4.5 新特性 / LLVM 4.0 新语法 提到了 Xcode 4.4 之后对数组和字典的操作可以用下面的方式:

id value = array[i];
array[i] = newObj;
id value = dictionary[@"key"];
dictionary[@"key"] = newObj;

上面几行语句实际调用的方法分别对应如下:

NSArray : - (id)objectAtIndexedSubscript: (NSUInteger)index;
NSMutableArray : - (void)setObject: (id)obj atIndexedSubscript: (NSUInteger)index;
NSDictionary : - (id)objectForKeyedSubscript: (id <NSCopying>)key;
NSMutableDictionary : - (void)setObject: (id)anObject forKeyedSubscript: (id <NSCopying>)aKey;

所以,如果你希望自己定义的类可以支持 obj[i] 和 obj[@"key"] 的方式来读取和设置值的话,就可以实现上面相应的方法,只是要处理好你自己参数和结果类型。现在就来看看下面自定义类 TestClass 的实现和执行效果: 阅读全文 >>

Xcode 4.4/4.5 新特性 / LLVM 4.0 新语法

跟着苹果干的好处就是,有什么新特性就尽快的就享用它们,这非常符常程序员们的学习心态。不像国内的某些技术领导,他们很领会某种舞台上的精髓 -- 稳定压倒一切 ,JDK 1.6 都出来了,还不少项目还牢牢固守在 JDK 1.3 上,程序员真是无言而又苦 B 啊。当然你在使用  Objective-C 时能时刻得到更新也得利于 Obj-C 完全由 Apple 主导,免了不少口水,瞧瞧 C++ 到 C++11,历时 13 年啊。

OK,言归正传,Xcode 当前版本 4.5.2,来看下自 4.4 以来它给我们带来了什么语言上的新特性。每个版本有新特性时一定要看官方的  What's New in Xcode。这么说来 Xcode 4.4 也算是个关键性的版本更新。

@ 不光可用于创建 NSString,还简单化了 NSNumber,NSArray 和  NSDictionary 对象的创建,一一来看。

@ 创建 NSNumber 实例

从 Xcode 4.4 起,无段  [NSNumber numberWithInt: 10] 这么写了,@10 就完事,下面是各种数值类型的 NSNumber 创建方式: 阅读全文 >>

Scala 2.10.0 新特性之字符串插值

Scala 在处理字符串方面终于也与时俱进了,引入了字符串插件,这在许多脚本语言中就早已这么做了。有了这个特性,字面量字符串和变量连接可以不需要总是用加号进行丑陋的连接了。有些脚本语言会是只对双引号字符串解析其中的变量,单引号的不会,当然Scala 是要区分字符串和字符类型。

直白的讲字符串插值就是,val name="Unmi"; val greeting=s"Hello $name"; greeting 的值就是 "Hello name"。产生效应的就是那个 s 方法。

Scala 2.10.0 为我们提供了三种字符串插值的方式,分别是 s, f 和  raw。它们都是定义在 StringContext 中的方法。

s 字符串插值器

可以解析字符串中的变量,可以调用方法,还能进行计算。实际调用的是  StringContext 中的  s 方法。 阅读全文 >>