- 用 play 命令创建一个应用
创建一个新应用最初的方式是用play new命令.1$ play new myFirstApp
这会询问你一些信息.- 应用的名称 (仅用于显示, 这个名称后面将在几个消息中使用到).
- 用于这个应用的模板. 你可以从 默认的 Scala 应用, 默认的 Java 应用, 和 空应用 三个选项目中选择.
Unmi 注: 新版 play new 命令允许你带上目录名,让你在指定的目录下创建应用,在 2.0-beta 版中,只是在当前目录下创建你的应用。运行 play help 看显示的 new 是否是: new [directory] Create a new Play application in the specified directory. 就知道能否指定应用的目录。
并且此时的 play new 命令可以用1$ play new ~/Desktop/unmi
这样就会在 ~/Desktop/unmi 目录中创建应用,后面的提示是一样的. 在 ~/Desktop/unmi 目录下有应用所需的 app, conf, public 等目录。
Read More - 系统要求
为了运行 Play 框架, 你需要 JDK 6 或更新的版本.假如你正使用 MacOS, Java 已经内置了. 如果你正在使用 Linux, 请确认使用了 Sun 的 JDK 或 OpenJDK (不是 gcj, 它是许多 Linux 发行版的默认 Java 命令). 要是用的是 Windows, 只下载安装最新版的 JDK 安装包即可.
确可java和javac命令被设置到了当前路径下 (你可以在命令行提示符下通过输入java -version和javac 来检查它).
下载二进制包
下载 Play 2.0 的二进制包 (选择最新的 2.0 RC 版) 并解压到有读和写权限的目录下. (运行play会向安装目录中写入文件, 所以不要安装在/opt,/usr/local或任何你无需设置写入权限的目录中.)
Unmi 注: 当前最新的版本是 2.0.4。 Read More
Play 当前版本是 2.0.4,2.0 前的版本通常会称为 PlayFramework,或者 Play!,现在干脆直呼为 Play 了,名气大了些就这样的,似乎越来越显得不可一世了。本人有意更深点了解 Play 框架,所以打算翻译官网 Manual, tutorials & references 一系列资料,并且着重点会先放在基于 Scala 语言的 Play 2.0 的应用。Play 2.0 是一个高生产率的 Java 和 Scala 的 Web 应用框架,它集成了现代 Web 应用开发所而的组件和 API。
Unmi 注:关于 Iteratee IO, 可参考:Iteratee I/O 和 Scalaz Tutorial: Enumeration-Based I/O with Iteratees
Play 是轻量级的,无状态的,Web 友好的架构,并且是特征可预期的(features predictable)。还借助于它的反应模型(reactive model) 和 Iteratee IO 的使用,让 Play 为高伸缩性的应用最小化了资源消耗(CPU, 内存和线程).
第一步要翻译的内容只想覆盖到以下:
开始使用- 前面通过 在 Java 中使用正则表达式进行后向引用($1,$2...) 讲了在 Java 中使用 JavaScript 和 JRegex 来实现正则表达式的后向分组引用 $1, $2 替换。
自 JDK 1.4 出现正则表达式以来我还真不知道 Java 的正则表达式是可以在替换时用 $1, $2 达成后向分组替换的,所以前一篇表述有些出入的。也就是要实现 JavaScript 中的1<script> 2 var src = "abc def"; 3 var des = src.replace(/(\w+)\s+(\w+)/, "$2 $1"); 4 document.write(des); 5 //输出为: def abc 6</script>
的功能,完全可以不求助于第三方的正则表达式组件库或是通过 ScriptEngine + JavaScript 来实现,在 Java 字符串的:
public String replaceFirst(String regex, String replacement)
public String replaceAll(String regex, String replacement)
两方法的第三个参数中是可以用 $1, $2 ... 来引用第一个参数的括号分组的,简单 Java 示例代码如下:1"abc def".replaceFirst("(\\w+)\\s+(\\w+)", "$2 $1"); //结果为 def abc 2"abc def aaa bbb".replaceAll("(\\w+)\\s+(\\w+)", "$2 $1"); //结果是 def abc bbb aaa
Java 的正则表达式原本还是很强大的,只怕不能被人发现。
2015-07-14: 补充一点,在正则表达式外是用 $1, $2 ... 来进行后向引用,如果是在正则表达式中就需要用 \1, \2 ... 的形式来进后向引用。下面例子,替换重复出现的两位数及之间的内容1"xx12abcd12345".replaceAll("(\\d{2}).+?\\1", ""); //结果为 xx345 - 在 iOS 程序访问 HTTP 资源时需要对 URL 进行 Encode,比如像拼出来的 http://unmi.cc?p1=%+&sd f&p2=中文,其中的中文、特殊符号&%和空格都必须进行转译才能正确访问。
在 Java、.net 和 JS 中都有相应的 encodeURL 方法可用,在 Objective-C 语言中,你可以试下
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;
来对完整的 URL(带请求参数的)进行编码,比如执行下面的代码:1NSString *url=@"http://unmi.cc?p1=%+&sd &p2=中文"; 2NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
Read More - 通常我们在 iOS 中发生什么事件时该做什么是由 Delegate 实现的,例如 View 加载完后会触发 viewDidLoad。 Apple 还为我们提供了另一种通知响应方式,那就是 NSNotification,系统中(UIKeyboardDidShowNotification 等) 以及某些第三方组件(例如 ASIHTTPRequest 的 kReachabilityChangedNotification 等)。
NSNotificationCenter 较之于 Delegate 可以实现更大的跨度的通信机制,可以为两个无引用关系的两个对象进行通信。NSNotificationCenter 的通信原理使用了观察者模式:
1. NSNotificationCenter 注册观察者对某个事件(以字符串命名)感兴趣,及该事件触发时该执行的 Selector 或 Block
2. NSNotificationCenter 在某个时机激发事件(以字符串命名)
3. 观察者在收到感兴趣的事件时,执行相应的 Selector 或 Block Read More - 有两个月里,本站点只能月头坚持七八天,基本处于瘫患状态。访问时就出现几行文字信息,现在不记得啦,大概就是域名被临时挂起了。后来才知道是因为有限的带宽已消耗怠尽,才不允许访问的。似乎这种情况还能给我带来点惊喜,我的网站有这么受欢迎吗!从 Google 的网站分析数据来看,并不是这样,那么就是有异常了。
站点停了几十天后,第一次找了下原因,似乎我站点上提供了几个文件下载量特别大,于是把那几个文件搬到文件分享网站上去分流,还是不奏效,没几天还是收到带宽将要耗尽的邮件通知。是不是别的几个服务器目录中的文件被人拼命下了呢,于是把它们改了名,还用插件对文件的下载进行了监控,未见异常。就这样,仍是没过几天,网站再一次被关闭了,距离月底还有几十天。 Read More - 我们做 iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash,出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源,只是在应用 Delegate 上留下像 Thread 1: Program received signal: "EXC_BAD_ACCESS",让问题无从找起。
比如你对已释放的对象发送消息时就会出现,EXC_BAD_ACCESS,再如 release 的对象再 release,release 那些 autorelease 的对象等也会报这样的错。默认设置下 Xcode 不会给你定位具体是哪一行代码,不该去使用已释放的对象,或者 release 用错了。
比如 UIViewController 子类中这样的代码: Read More - 作为设计模式中最简单的一个,单例模式还是在很多系统中都会用到,总有那么一些实例,从始至终只需要它的一个实例,而且任何时候都要总方便的得到,像 Application 对象啦,环境对像啊。
要保持你设计的类别人只会初始出一个实例来,像 Java/C++/C# 中的做法一般希望能保证以下那些:
1. 构造方法藏起来,private 修饰,这样只能通过统一的工厂方法获得实例,因为 new 出来的总是新对象
2. 克隆方法出来的对象仍然是原来的对象
3. 反序列化出的对象也仍然是原来那个唯一的对象(这好像有点难)
4. 一般程序运行期间,该单实例不被释放
5. 一般要求工厂方法是原子性的,也是避免返回了不同的实例
6. 等等................. 是否还有些补充?
不一定每一点都真正考虑到,因为不是每个使用都都那么变态或不存在某些使用场景。
而我们这里的 Objective-C 有其语言的较大特殊性,是通过 alloc 来创建实例的,无法把构造方法 alloc 隐藏起来,但我们总是有办法的,可以做到:
1. 工厂方法返回唯一的实例
2. 多次调用 alloc 构造出的实例与 工厂方法得到的是同一个
3. 让你释放不掉这个实例,引用计数不让归零 Read More - 前一篇是:Objective-C 的方法原型及重载,本篇呢在上面的话题稍进一步延伸,方法原型中方法的覆盖关系就较为密切的,所以再说下方法覆盖的话题。
由前面,我们知道,在 Objective-C 中方法原型的得来是这样的,假如方法声明是:
-/+ (返回类型) 方法名: (参数1类型) 形参1 参数2描述: (参数2类型) 形参2 参数3描述: (参数3类型) 形参3 .......
那么它的方法原型则是:
方法名: 参数2描述:参数3描述: .......
关键的是它与参数类型无关。
重载的时候我们应避免方法原型相同,而子父类间进行方法覆盖的时候我们又应该要保持一样的方法原型。
我们可以再一次感性认识一下 Objective-C 的方法原型,从 Xcode 中,当 Command + 鼠标悬停 在调用方法上时: Read More