AWS 的 Lambda 给了那些不想自己管理 EC2 服务器和配置负载人员很大的便利,所以 Lambda 被描述为 Serverless。真正的只关注业务就行,怎么调度,同时有多少个实例运行交给亚马逊去处理就是了。运行 Lambda 的环境也是亚马逊内部的 EC2 服务器,镜像是 Amazon Linux, 所以如果想运行系统命令,那是 Linux 的。Lambda 支持多种语言 Node.js, Python, C#(.net core), 还有 Java 8,我们就选择了 Java 8, 一开始还担心它与别的语言比起来会多大劣势,其实不然。而且所谓的 Java 8, 并非单指 Java 语言,而是指 JVM 平台,所以也可以用 Scala, Clojure, Groovy, Kotlin 来写。
Java 与脚本语言如 Node.js, Python 相比给人一个明显的感觉是启动慢,还有人用统计数据来比划 AWS Lambda cold start(pseudeo-)benchmark. 不过真不用担心,人家说的是冷启动,也就发生在部署后第一次执行启动会比较慢。要是我们的 Lambda 经常被调用,或每天触发比较集中,Lambda 在任务到来之前处理待续状态,就不会有冷启动的耗时过程。或者是每次任务要执行 3 分钟左右,又何必在乎毫秒级的冷启动时间。
说到底就是别理会下面的数据20ms startup time for Python ~ $0.04167540ms startup time for Node.js ~ $0.0833580ms startup time for Java ~ $0.1667
Lambda 实例重用
Java 的 Lambda 就是一个微服务,在首次触发时微服务冷启动有些慢,但一旦启动之后就可以用这个微服务实例接受后续的请求,只有在比较长的一段时间内未被触发 AWS 才会把这个微服务杀掉。 Read More- 学习 Clojure 一般是用
lein repl启动控制台, 每次启动lein repl都会发现它打开了一个端口, 例如➜ ~ lein repl
一直不清楚上面显示的
nREPL server started on port 57212 on host 127.0.0.1 - nrepl://127.0.0.1:57212
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.8.0
...........nrepl://127.0.0.1:57212该作何用, 而且端口号是随机的, 这其中定有文章.
幸好有 Google 帮忙, 查一查, 然后才意识到何不运行lein help repl来看看repl中到底有何玄机, 原来是:
<none> -> :startlein repl默认的行为, 见下. 未指定 :host 或 :port , :host 默认为 127.0.0.1, :port 为随机
:start [:host host] [:port port] 原来lein repl设计为为 CS 结构. :start 会启动一个 nREPL server, 并且立即启动一个 client 连接上它. :host 默认为 127.0.0.1, :port 默认为随机的
:headless [:host host] [:port port] 只启动 nREPL server, 等待别人来连接它, 相同的默认 :host, :port 规则. 也就是它不会进到 Clojure 控制台
:connect [dest] 连接一个 nREPL server. 目标服务器的指定有三种方式: HTTPS(S) URL, host:port, 或 port Read More
Clojure 确实要比 Python 语义上庞大, 所以无法尽量在一篇之中收纳进来, 只得另立新篇, 也许还会有第三篇笔记. 现在开始学习函数定义函数定义
函数用defn宏来定义, 函数名与参数列表之间可选的字符串是函数的注释, 相当于 Python 的函数体中第一个字符串, 这个字符串能被(doc func-name)列出来, Python 中是用dir(fun_name显示函数帮助. 不需要 return 关键字, 和 Groovy/Scala 一样最后一个表达式的值为函数的返回值, 所以函数总是有返回值(或为 nil).
和 C 语言一样, 函数必须先定义再使用, 否则要用(declare function-names)提前声明, 下面代码是在 Clojure 的 REPL 中执行的user=> (defn say-hello-to "say hello to some" [name] (str "Hello, " name)) #'user/say-hello-to user=> (doc say-hello-to) ------------------------- user/say-hello-to ([name]) say hello to some nil user=>
提一下 Clojure 的命名规则, 变量和函数名用中划线连接的小写单词.defn-定义的函数是私有, 只对当前名字空间可见, 比如上面的 user 名字空间. 有点像 Python 的下划线变量或函数的可见性约定. Read More
自己所学过的编程语言基本是 C 风格的, 给自己定下的目标是要学习下 Python, Swift 和 Clojure. 正如之前的 我的 Python 快速入门 那样的几分钟入门, 这里记录下 Clojure 的快速上手过程.
为什么是 Clojure, 因为它是 Lisp 的一个方言, 个人觉得有必要拓展一下不同的语言风格与思维方式, 就像当初接触 Objective-C 的 [person sayHello] 的方法调用有点不好理解一样, 其实把它还原为面向对象的本质是向 person 发送 sayHello 消息就简单了.编程语方不仅仅是一种技术, 它更是一种思维习惯
希望通过 Clojure 这样的语言来感受另样的思维方式. Clojure 是运行在 JVM 之上的函数式 List 方言. Clojure 乍一看, 基本就是一个括号语言, 它的语法更能体现操作/函数为中心. Clojure 的圆括号兼具 C 风格语言的圆括号(参数列表), 分号(分隔语句), 以及大括号(限定作用域) 的功能. (1 + 2 + 3 +4) 只用写成 (+ 1 2 3 4)。
因为 Clojure 是构筑在 JVM 之上, 所以可以从 http://clojure.org/community/downloads 下载 clojure 的 jar 包, 然后java -jar clojure-1.8.0.jar
就能进到 Clojure 的 REPL(read-eval-print-loop) 控制台了, 就可以开始体验 Clojure 的代码user=> (+ 1 2 3),如果要运行一个已经写好的 Clojure 文件, 如 hello.clj, 就要用java -jar clojure-1.8.0.jar hello.clj来执行. 为方便可以建立一个脚本clj, 内容为java -jar /path/clojure.jar $1
Read More
经历过一个使用 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 的首页就有几个基本的例子,我体验了类似第一个例子,大概是这样子的 Read More- 我们在 Tomcat 中可以开启 SSL,用 HTTPS 来访问,见前一篇 快速启用 Tomcat 的 HTTPS 协议访问, 不过更接近实际的应用是 Tomcat 只担当 Servlet 容器,HTTPS 协议部份,甚至是静态页面是交给 Apache 的处理,Apache 与 Tomcat 之间有一个通道。 当然前端用 F5 那类负载均衡设备就另当别论了。
这里实践一下怎么开启 Apache 的 HTTPS,并与 Tomcat 进行整合的操作。平台是 Mac OS X, Apache2, Tomat8,其他平台或不同版本的应用软件配置类似。
第一步: 生成自签署证书
安全加密的东西都得证书,我们需要用到 openssl,没有就先安装它,命令是:openssl req -new -x509 -days 365 -nodes -out server.crt -keyout server.key
上面命令可以指定生成 server.crt 和 server.key 文件的目录,默认产生在当前目录下,假设这两个文件生成在/etc/apache2目录下。 Read More - 有时候安全考虑会要开启 Tomcat 的 https 协议访问,最快速的配置,两步
1. 创建 keystore 文件
执行 JDK 带的命令keytool -genkey -alias tomcat -keyalg RSA
按命令提示各个信息即可,最后在用户主目录下创建了一个 .keystore 文件
2. 配置 Tomcat 使用 keystore 文件
打开 server.xml 找到下面被注释的这段<!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> -->Read More - 使用 Ant 进行自动化处理时,不想记住每一个 target 的名称,而是让默认的 target 列出需要的 target 出来,让用户输入名称或数字选择执行哪个 target。这样做自然是多了一步,有时候确也方便不少,但 Ant 还是有个缺点,它不能持久性的保持在 Ant 控制台下,持续的进行用户交互。
对于实现 Ant 的简单用户交互,我们可以借助于两个 Task,input 和 antcall, input 用来提示用户输入值,再根据 input 设定的属性来确定 antcall 调用哪个 target。执行完退出到系统 Shell 下,想要再来,就再执行一下 ant 吧,我也只能做到这一步了。
看下面的例子 build.xml 内容 Read More 前面写过一篇: 关于 JavaBean 规范你还是应该知道的二三事 ,发现还略受关注。其中有人对 boolean 型属性的 getter/setter 方法还有些想法,以及 JavaBean 的规范是根据属性名找相应的 getter/setter 方法,还是由 getter/setter 定位属性呢。本文主要就这两问题展开话题,原本想附中前篇中去,但考虑会让前文凌乱,所以另立新篇。
1. 关于 boolean 型属性
分别来看看 Eclipse(3.5) 和 NetBean(6.7) 的重构功能对 oolean student 和 boolean isStudent 生成什么样的 getter/setter 方法的。 Read More- 作为 Java 程序员,对于 JavaBean 也许你会说再熟悉不过了,它贯穿在系统的多层中,不同的叫法有 PO、VO、DTO、POJO、DO(Domain Object)。然而它无外乎就是一个 Class 类,带上些属性和它们的 setter/getter 方法,set/get 后面那一个字母大写。虽然我们现在很少把 JavaBean 与那个古老的 2.0 的 EJB 搞混,但为什么明明用 IDE 为属性生成的 getter/setter 方法,应用一运行,还是报找不到某个 bean 属性的 setter 或 getter 方法呢?
要知道,在 Sun 的网站上那个关于 JavaBean 规范的 PDF 文档可是有足足实实的 114 页啊。难免有些规则有点古怪,至使知名的 IDE 都难以应对,所以我们还是有必要了解其中二三,来规范我们的 JavaBean 和解释一些情形。
Sun 的关于 JavaBean 规范见:http://java.sun.com/javase/technologies/desktop/javabeans/docs/spec.html,其中可下载到 JavaBean 规范的 PDF 文档。 Read More