从西维那淘来‘玩宠’一只,名叫 James P. Sullivan 。就是《怪物电力公司》中头号吓人专家毛怪萨利文… 其实我没之前并没有看过此片,趁周末补习了一下,是一部富含的正能量的欢乐电影~

真正有意思的是这只玩宠,虽然模具很小,但相当灵活,各个肢体关节可以灵活弯曲,甚至眼珠也可以调整。据说是韩国买回来的…看来棒子的工艺还是可以的,比国内那些骗小孩的坑爹玩具强多了。既然这么灵活,那就为他设计一些奇葩的动作,来一套写真吧…

断臂的毛怪萨利文
IMG\_0609.jpg

断尾的毛怪萨利文
IMG\_0608.jpg

奔跑的毛怪萨利文
IMG\_0611.jpg
IMG\_0623.jpg

挠痒的毛怪萨利文
IMG\_0610.jpg

思考的毛怪萨利文
IMG\_0613.jpg

犯二的毛怪萨利文
IMG\_0612.jpg

因为表情实属萌系,无法表现出「吓人专家」的面目,只好用一些特殊手段勉强表现一下了~
邪恶的毛怪萨利文
IMG\_0607.jpg

高潮来了,一个 ‘猥琐’ 的童鞋居然摆出了如此的猥琐的姿势,I服了U,胡总。
猥琐的毛怪萨利文
IMG\_0617.jpg

在给nginx增加反代的时候抛出如下错误:
nginx: [emerg] unknown directive "sub_filter"
检查后发现是没有安装http_sub_module 模块,此模板用于过滤/替换响应及一些内容
nginx模块的增加方式比较便捷,首先,nginx -V 查看当前nginx的编译参数

[root@something ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.6.0
built by gcc 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC)
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module         
--with-http_ssl_module --with-http_gzip_static_module --with-ipv6 

进到nginx安装源码目录,在老的编译参数中增加http_sub_module模块,并编译。
如果是第三方模块,则需要添加「—add-module=模块的源码路径」,这里以openresty的echo模板为样例(echo模块可以让nginx输出一些简单信息,方便调试)

[root@something nginx-1.6.0]# ./configure  --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_sub_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --add-module=/home/z/ngx_openresty-1.7.2.1/build/echo-nginx-module-0.54
[root@something nginx-1.6.0]# make

只进行make,如果make install则所有文件被覆盖,导致conf丢失。
停止服务,备份老的nginx脚本,并用objs目下新的脚本替换掉老版本。

[root@something nginx-1.6.0]# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
[root@something nginx-1.6.0]# cp ./objs/nginx /usr/local/nginx/sbin/nginx

启动服务… 查看新的编译参数

[root@something nginx-1.6.0]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.6.0
built by gcc 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC)
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module 
--with-http_sub_module --with-http_ssl_module --with-http_gzip_static_module 
--with-ipv6 --add-module=/home/z/ngx_openresty-1.7.2.1/build/echo-nginx-module-0.54

大功告成!

模式匹配

模式匹配是scala的一大特性,有点像增加版的switch-case。
在Scala代码中无处不在:用于合并条件执行、解构(destructuring) 、在构造中造型。

def getSex(name:Any){
    name match {
        //匹配字符串
          case "rony" => println(“male”)
          case "lina" => println(“female”)
          //匹配元组
          case ("rony","lina") => println(name)
          //匹配列表
          case List("rony","lina") => println(name)
          //匹配自定义类
          case User(u) => println(u.name)
          //匹配通配符
          case _ =>
    }
  }

《Effective Scala》中建议匹配通配符时改为 case other => 可读性更高

Options

写多了java得同学都见多了NullPointerException,一不小心就会出现这种低级错误,Scala中有一种Option类型,是一个表示有可能包含值的容器。空(None)或满(Some(value))二选一。

《Effective Scala》中提出Option提供了使用null的另一种安全选择,应该尽可能的替代null。它是一个集合(最多只有一个元素)并用集合操所修饰,尽量用Option。
但它也提示了不要过度使用Option: 如果有一个明确的缺省值——一个Null对象——直接用Null而不必用Option

def getUser(user_id: Long):User = {
    //userDao.getUser()返回Option[User]类型
    val user = userDao.getUser(user_id)
    user match {
        case Some(u) => u
        case None => //不存在用户
    }
}

有人说这不和if判断null一样么,根本没有什么优势,个人认为这只是更像一种警示,当习惯后,看到方法的返回值是Option时,心里应该明白这个可能是要做空处理的。
Option里面还有一些的好用方法,例如getOrElse(),如果没有取到则给一个默认值,

def getUserName(user_id: Long):String = {
    //userDao.getUserName()返回Option[String]类型
    val user = userDao.getUserName(user_id)
    user.getOrElse("rony")
}