Monthly Review 2015-03

  1. 依然是业务维护型开发,由于在新产品还在调研阶段,并没有太多代码产出,commit 只有 30.
  2. 抽空整理 API 文档,Gitbook 写文档挺方便。
  3. 面试了十来个 iOS 开发,要想考核别人,首先自己要知道,面试很考验技术的。

Monthly Review 2015-02

  1. 从 2.14 休假到月底,等于这个月只工作了半个月。
  2. 个人习惯,长假前三五天代码库冻结,除了 typo 级别的修改,其他全部延迟安排到假期后,这样算下来代码的时间就更少了。
  3. 然后就有了更多时间阅读学习,看了不少 Go 相关的,结合之前项目加深理解。
  4. 休假前推进完成服务迁移,长假期间没有出现一次问题,省心很多,更放心的玩耍。
  5. 算下来今年春节是这几年休假时间最长的,狠狠的陪六六半个月。
  6. 小孩子一天一个样,刚回去还没长牙,一周后露头,等走的时候已经很明显能看到小嫩牙。
  7. 车子成了现在人的身份象征,甚至高于房子。没人关心你做什么,追求什么,累不累,单纯的根据车子判断你的成功,大家似乎也很高兴用车子来证明自己。

Nginx If Is Evil

官方文档 IfIsEvil.

简单说在 location 中要尽量避免使用 if,如果一定要用,确保 if body 中只包含 return or rewrite,其他指令可能会出现莫名错误。

解决方案就是用 try_files 替换:

location / {
    try_files $uri $uri/index.html $uri.html =404;
}

如果想 if 和 try_files 一起用,可以把 if 放在 location 外:

set $APP 'unknown';
if ($query_string ~ "app=([^&]+)") {
   set $APP $1;
}
location = /api {
   try_files /$APP/data.json /data.json =404;
}

Nginx Pitfalls 列举了一些 nginx 陷阱,值得学习。


春哥这篇 How nginx “location if” works 做了逐步分析,学习。

Middleware

(这块内容属于个人理解,可能会不对)

最近学习中又一次接触 middleware 概念,一直对这个东西都比较模糊,似乎 Ruby 界用的比较多,比如 Rack。middleware 给我的感觉就是在请求与 App 之间对请求进行一层或多层处理,然后将处理后的请求对象交由 App;同理,在 App 和响应之间也可以有。

一个常见的业务场景:

请求 -> [cache.get -> 有-返回|无 -> 服务处理生成数据 -> cache.set] -> 响应

其中 cache 读写都是在服务内处理请求时进行。套用 middleware 似乎是这样的流程:

请求 -> [middleware.cache.get -> 有-返回|无-请求交由下一步处理] -> [服务处理生成数据] -> [middleware.cache.set] -> 响应

去掉 middleware.cache 整个服务不受影响,流程变成了这样:

请求 -> [服务处理生成数据] -> 响应

middleware 的好处是可多层组合,让流程有层次,服务更专一。接下来要在实际项目中实践一下:

  • Negroni, Idiomatic HTTP Middleware for Golang. Martini 作者开发。
  • lua-resty-rack, A minimalistic rack implementation for Openresty.

Go 初体验

用 Go 写了第一个线上服务,简单记录一些。

  1. 直接 net/http,没有用 Web 框架。之前用过 Beego,强大但过于黑盒,很多细节不理解,其实 Go 已经提供了 web 开发所需要的东西,这个服务只需对外 API,没有页面等,直接 net/http 反而更简单。
  2. 强制代码风格,大爱,包括定义但不使用直接报错,刚开始会有不适应,但是对整体代码质量很有帮助。
  3. database/sql 提供了统一的数据库操作接口,配上不同的 driver 即可。
  4. Golang 的 error handlling 是个特色,但作为 web service 有些繁琐,需要再学习看有没有更为简洁的处理方式。
  5. 无痛热更新比较麻烦,还没有找到类似 Nginx 的实现。
  6. 性能上简单的 ab 压测和 ngx_lua 差距不大,开发效率相对高一些,毕竟自带库更丰富。
  7. gin 可以监控代码变化并自动重新编译,代理方式,不错的开发辅助工具。

Monthly Review 2015-01

  1. 参加一次线下的 Golang 技术聚会,收获不少。
  2. 有些业务功能很难 cover 全部情况,要有所取舍,满足最主要的用户需求。敢于放弃。
  3. Android 项目启动,简单调研了一下,对这个生态系统还是没兴趣,尤其是国内乱七八糟的市场。
  4. Golang 有了实际线上服务产出。
  5. 视频时六六已经会自己找爸妈了,真快。

Nginx DNS resolver

nginx 通过 proxy_pass 和 upstream server 通信的时候需要手动指定 resolver。某些时候 DNS 解析失败就会出现这个错误:

domain.com could not be resolved.

可以指定多个 DNS 并重置域名 TTL 延长 nginx 解析缓存来保障解析成功率:

resolver 223.5.5.5 223.6.6.6 1.2.4.8 114.114.114.114 valid=3600s;

如果还有解析错误,可以用 dnsmasq 在本地自建 DNS,顺带还有加速解析的好处:

#/etc/dnsmasq.conf
domain-needed
bogus-priv
cache-size=51200
listen-address=127.0.0.1

#server=223.5.5.5
resolv-file=/etc/resolv.conf

另外需要注意的是 proxy_pass 并不是每次请求都会进行解析,如果 upstream IP 频繁变动,需要强制解析:

# via http://forum.nginx.org/read.php?2,215830,215832#msg-215832
resolver 127.0.0.1;
set $backend "foo.example.com";
proxy_pass http://$backend;

HoloLens

When you change the way you see the world, you can change the world you see.

命令行 API 调试工具: HTTPie & jq

  • HTTPie: a CLI, cURL-like tool for humans.
  • jq: a command-line JSON processor.

HTTPie 类似 cURL,更简单易用,jq 用来解析 JSON,一起配合使用做 API 开发调试非常方便:

  1. GET: http :9090/api/test
  2. POST: http -f post --session=fann :9090/api/login' user=fannheyward passwd=passwd
  3. GET with cookie: http --session=fann :9090/api/profile

  1. jq . - 格式化整个 JSON
  2. jq ".status" - 只显示 status 字段的值
  3. jq ". | {name: .name, icon: .icon}" - 重组 JSON,只显示 name&icon 字段
  4. jq ".[] | {name: .name}" - 遍历 JSON 数组,只显示每个元素的 name 字段

更多高级用法参考各自文档。

[self review:2014]

2014 年度个人总结,先对照去年计划:

工作

产品、管理的转型,提高执行力。

Properly Failed.

技术深度的挖掘。

Failed.

一年一门新语言,Golang.

Just done.


工作

瓶颈

由于个人原因,下半年的工作状态不好,对工作造成了很大影响,很不应该。

工作以业务开发为主,针对具体问题需求会有一些学习,但整体技术进步很有限。结果就是工作兴奋度不够,持续性差,缺乏成就感,工作以外的学习又流于表面,不够深入,一直在尝试打破这种状况,但效果不好,执行力不够是主要原因。

目前这种状况是自己的一个瓶颈期,要尽量解决好个人问题,减少对工作的影响。提高执行力和专注度,以技术为主,多学习多实践,向开发 leader 甚至架构的方向努力。

生活

升级做爸爸。

因为现在没有和六六待在一起,对我们生活有很大影响,主要是情绪上,时不时的状态低落。过了年就要想办法带六六过来,一家人就是要在一起。

在不同阶段会面临不同问题,要敢于面对,可以想的大一些,但不要想太多,不要试图用一个方案去解决所有问题。


2015

工作

  1. Golang 进入团队技术栈,结合实际项目要有更多学习。
  2. 分布式开发,要有实际产出。
  3. 代码质量保证上继续摸索一些适合团队的方案,Unit Test, CI 等。
  4. leader 去澳洲移民监,要担起开发团队的责任,不光光是自己有代码产出。

生活

  1. 家。
  2. 减肥,现在是 88kg,目标 75kg。