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 跳转到当前光标所在名字对应的文件(前提是文件存在)。
  • 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 <fannheyward@gmail.com>

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

Tweet

Make every detail perfect and limit the number of details to perfect.

via Jack

What Apple has done

Zsh Shared History

You can share every commands between all terminals with Zsh shared history. In your .zshrc:

# enable shared history
setopt inc_append_history
setopt share_history

# disable shared history
unsetopt inc_append_history
unsetopt share_history