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。

Fail

你有你自己的骄傲。

But

有一种落差是,你配不上自己的野心,也辜负了所受的苦难。

Nginx proxy_cache_valid

proxy_cache 可以缓存 upstream 响应,其中 proxy_cache_valid 设置缓存有效时间,需要注意的是 Nginx 检查缓存是否有效的优先级问题。根据文档Igor,Nginx 判断缓存有效的顺序是:

  1. X-Accel-Expires
  2. Expires/Cache-Control
  3. proxy_cache_valid

也就是说 Nginx 会优先用 upstream 设置的缓存有效期,这种情况下 Nginx 相当于 Client,如果想忽略缓存直接到 upstream 更新,类似浏览器忽略本地缓存,可以这样设置:

proxy_ignore_headers X-Accel-Expires Expires Cache-Control;

另外 proxy_cache_path ... inactive=10m; 不受 upstream 影响,缓存文件在指定时间内没有被再次访问会被清理删除。

参考:

Monthly Review 2014-11

工作:

  1. 依然是 BDD(Business-driven Development, 业务驱动开发),完成了三个大功能,已上线的基本没有返工,符合自己的标准。
  2. BDD 往往是结果导向,产品前端的需求不一定会考虑到对后端系统带来的改变和压力。如果需求确定后才发现不可为或代价太大,开发会带着情绪去做,这不是好事。
  3. 所以开发要尽量早的参与到前期讨论,分析可能会带来的问题,考量开发性价比,对不合理或不清楚的需求能及时反馈,甚至拒绝。
  4. 需求-开发-上线-监测-分析,往往进行到上线就结束了,这样很难判断这次开发的价值,以后类似的需求还要不要做?
  5. 开发性价比是最近在思考的一个问题,有没有必要 100% 实时?一个需求要三个系统增加开发值不值得?

生活:

  1. 保持一个月回一次家的频率,发现同车还有很多这样的人。
  2. 视频叫六六会抬头瞅着屏幕笑,然后低头看着音箱找人……
  3. 深圳卫视的《极速前进》真人秀节目很好看,推荐。
  4. 老婆最近每天加班到八九点,相比之下我真的太懒散了。搞活动买的牛肉吃了两个星期,这么冷的冬天晚上有萝卜炖牛肉真的很幸福。

Vim Tips

这周新学到的两个 Vim tips:

  • gf 跳转到当前光标所在名字对应的文件(前提是文件存在)。
    • C-w-f 新 buffer 打开
    • C-w-gf 新 tab 打开
  • gt 跳转到下一个 tab,对应有 gT 上一个 tab,{n}gt 编号对应的 tab.

Yoda

“Always pass on what you have learned.”

Monthly Review 2014-10

工作:

  1. 本月的 git commits 还不足上个月的一半。
  2. Redmine 上关掉 42 issues,当然有部分是无法复现或拒绝需求。
  3. 完成拖延一年的运营管理界面,这部分一周可能都用不了一次,一直没动力去做。
  4. 捡起 Docker 想做一下 CI,发现最大的问题不是环境,而是没有写测试用例的习惯。
  5. 除了没有测试,大部分项目都没有文档,或者更新不及时,接下来一个月先把自己手上的项目文档补全。
  6. 暴漏出来的问题就是自己的开发模式还处于比较原始的小作坊形式。VCS+Code Review 全靠自觉+代码强迫症,测试和部署上线全手工操作,没有流程,而这却是最重要的。

生活:

  1. 想六六。
  2. 考虑把娃带北京自己带,然后就没有然后了,哎。
  3. 如果独生子女有什么好处的话,孩子在需要帮忙的时候父母没有太多其他牵挂算一个。
  4. 晚上买菜做饭,对自己的厨艺还算满意,就是刀工太差。

Jekyll in Docker

最近又捡起 Docker,打算用在团队内做一些 CI 工作。拿 Jekyll 练手,记一下笔记:

FROM ruby:2.1.3
MAINTAINER Heyward Fann <[email protected]>

RUN gem install github-pages
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*

ENV NODE_VERSION 0.10.33
RUN curl -SLO "http://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" \
        && tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 \
        && rm "node-v$NODE_VERSION-linux-x64.tar.gz"

WORKDIR /blog
EXPOSE 4000

ENTRYPOINT ["jekyll"]
CMD ["serve"]

Then:

  1. docker build --rm=true --tag="blog:0.0.2" .
  2. docker run --rm -p 4000:4000 -v /ABSOLUTE/PATH:/blog blog:0.0.2
  3. boot2docker ip then http://IP:4000
  4. OR docker run --rm -v /ABSOLUTE/PATH:/blog blog:0.0.2 build

笔记:

  1. Base image 建议选用 debian:wheezy,如果需要编译环境可用 buildpack-deps:wheezy|jessie,相对 Ubuntu image 要小很多。
  2. 尽量不安装编译环境,直接包管理工具或二进制文件,注意清理缓存文件。
  3. 尽量少的 RUN 命令,减少 layers 数量,尽可能在一个 RUN 组合完成多个操作,比如 ruby
  4. 配合 .dockerignore 忽略不需要的文件。
  5. build 或 run 的时候加上 --rm=true 自动删除中间容器。
  6. CMDENTRYPOINT 都是 docker run 的入口,只是在参数处理上不同。CMD 可以被 run 后面的命令替换,而 ENTRYPOINT 是把 run 后面的作为参数传入。
  7. CMD 配合 ENTRYPOINT 一起用很不错,如果没有参数,执行的就是 ENTRYPOINT+CMD 组合起来的功能,加上参数就会把 CMD 替换掉,执行另外的命令。
  8. OS X 下用 boot2docker 要注意 IP 不是本机或 127.0.0.1,而是 boot2docker ip.
  9. 如果是 Golang 二进制程序,完全可以构建一个空 image 执行,比如 Building Docker Images for Static Go Binaries.

参考:


就目前的情况,用 Docker 构建测试环境很方便,麻烦的是测试用例和测试脚本整理,小团队基本以业务为主,很少有时间或没有意识的去写测试用例,只是在完成具体业务后针对该功能进行测试,没法系统的进行测试,这个需要在后面工作中重视起来。