Ansible notes

Ansible 是基于 SSH 的自动化配置管理和部署工具,更多请参考官方文档

ansible -i hosts.ini all -m ping
ansible-playbook -i hosts.ini playbook.yaml

用 Ansible + Supervisor 部署/更新应用:

- hosts: server
  tasks:
  - name: check if exists
    stat: path=/path/to/app
    register: check_path
  - name: clone
    shell: git clone XXX && git checkout -b release
    when: check_path.stat.exists == false
  - name: pull
    shell: cd /path/to/app && git pull origin release
    when: check_path.stat.exists
  - name: is already running ?
    stat: path=/tmp/supervisord.pid
    register: supervisord_stat
  - name: restart
    command: supervisorctl -c supervisord.conf restart all
    args:
      chdir: /path/to/app
    when: supervisord_stat.stat.exists
  - name: start
    command: supervisord -c supervisord.conf
    args:
      chdir: /path/to/app
    when: supervisord_stat.stat.exists == false

TLS 1.2+ in Nginx

小程序要求 HTTPS 并且 TLS 1.2 以上,不然会报错:

小程序要求的 TLS 版本必须大于等于 1.2

Nginx 下需要用新版 OpenSSL 重新编译 Nginx。官网下载新版 OpenSSL 和 Nginx:

./configure —with-http_ssl_module —with-openssl=/home/page/soft/openssl-1.0.2k -j8
make -j8
make install

重启 Nginx 即可。

Golang sync.WaitGroup

sync.WaitGroup waits for a collection of goroutines to finish. 类似一个计数器,添加任务加一,完成任务减一,非零即阻塞。

  • Add(x) 添加到计数器,需要注意的是必须在 main goroutine 执行
  • Done() 计数器减一
  • Wait() 阻塞 main goroutine 执行,直到所有 goroutine 执行完成。
var wg sync.WaitGroup
var urls = []string{
    "http://www.google.com/",
    "http://fann.im/",
}
var errChan = make(chan error, len(urls))

for _, url := range urls {
    wg.Add(1)

    go func(url string) {
        defer wg.Done()

        resp, err := http.Get(url)
        if err != nil {
            errChan <- err
        }
        defer resp.Body.Close()
    }(url)
}

wg.Wait()
close(errChan)

for err := range errChan {
    if err != nil {
        log.Println(err.Error())
    }
}

errgroup 提供了类似的功能:

var g errgroup.Group
var urls = []string{
    "http://www.golang.org/",
    "http://www.google.com/",
}

for _, url := range urls {
 // Launch a goroutine to fetch the URL.
    url := url // https://golang.org/doc/faq#closures_and_goroutines
    g.Go(func() error {
        // Fetch the URL.
        resp, err := http.Get(url)
        if err == nil {
            resp.Body.Close()
        }
        return err
    })
}
// Wait for all HTTP fetches to complete.
if err := g.Wait(); err == nil {
    fmt.Println("Successfully fetched all URLs.")
}

六六

清明节假期带六六回老家,很多好玩的:

  • 高铁上,六六趴窗户上说:爸爸这地铁飞得好快!
  • 她现在已经不会说家乡话,尽管还能听懂,但一开口就是普通话。六六追着邻居小朋友问:小朋友们,你们还记得我吗?
  • 有一个小孩比她就大一两岁,按辈份得叫人姑姑,六六就不:是小姐姐,不是姑姑!
  • “爸爸爸爸,我给小朋友分饼干吃”。作为一个小吃货,能这样还挺让我意外。
  • 会主动跟小朋友分享玩具,包括自己最喜欢的玩具琴。
  • 去朋友家玩,会把小弟弟的玩具收起来,敢开口跟人打招呼,走的时候会跟所有人拜拜。
  • 上山看见桃花,“爸爸我要那花”,我去摘花的时候在后面大叫 “爸爸 你小心一点”。
  • 摔跤擦破了手,哭着找每个人求安慰,最后找爸爸擦药,哭的那叫一个伤心,忽然瞅见玩具小人的头在地上,瞬间不哭捡起来一本正经的说“这个头怎么掉了?”,然后又看着爸爸举着手哭。
  • 走之前收拾行李,六六拿了一个塑料袋也要收拾行李,“爸爸,我把这个小鸭子带着吧,小鸭子最可爱了”,于是我们就把她那两个很早以前的小鸭子带到了北京。

The Role of Technology

@Fenng:

技术的作用从短期来看往往被高估,但是从长期来看又往往容易被低估。

Depends on yourself

算下来,从12岁离家上初中到现在,将近20年都是一个人面对着一切,中考,高考,工作,北漂,就算已经结婚四年,依然如此,只不过从我一个人变成了我们两个的一个人。

这种一个人,在面对问题的时候,往往首先想到的是我自己能不能解决,不寄希望于别人。

这种一个人,让我特别害怕欠人情,比如借钱,比如麻烦朋友,尽管我知道他们并不在意,每次还是会打心底感谢他们的帮助。

这种一个人,一定程度上强迫自己变强,因为你只能依靠你自己。

2016

工作,劳而无功,即是失败。

组建团队,目前技术团队共有的问题是能出东西,但是技术边界明显,对于没有接触多的领域缺少思路。… 开发是和业务紧密结合的,过于脱离业务做技术不切实际,作为技术负责人是不及格的。两个设计师的招聘比较费时,但反而是今年最好的招人,也是对技术团队的反思,设计师的招聘以解决问题为主,歪打正着的效果很好。

运营工作做的很差,没有好的想法,一切照旧的做法消磨着大家的积极性和耐心,也影响了整个团队的氛围,好在 Q4 新应用的开始让大家看到一些希望,其实大家都很愿意花心思做运营,只不过现状让大家觉得做与不做并没有太多区别,作为负责人没能让大家看到项目的前景和希望,是失职。

商务成绩是持续走低,日活的走低对商务工作的影响很大,下半年商务转型主做 CPA,每单的压力减小,但对商务整体成绩影响依然很大,究其原因还是产品的走低。

产品项目上,前半年纠结于苹果的审核,自己是做好了持久战的准备,但没有给团队其他成员对产品的信心,现实也是一次次的打击着大家,然后连锁反应的影响运营/商务。Q4 用新技术方案做给大家带来不少信心,但还是有点晚,应该在上半年就实施的。讽刺的是我一直认为自己在技术上有不错的敏感度,真遇到实际情况却太多的犹豫和顾虑,也是技术不过关。

这一年再一次的发现自己的瓶颈,对运营的不擅长,对产品的不敏感,长时间的产品低谷自己能扛住却不会给团队信心,毕竟没有成绩一切都很无力。另一方面,能正确认识自己的不完美也是给自己减压,专注于那些可以做的工作,而不是想把一切都完美解决。


生活

装修,搬家,接六六来北京,第一次在北京过年,每一步看似幸福,背后都很艰辛,好在老婆的耐心,大度,坚持,努力的支撑着我们的生活,希望来年我们能顺利一点,健康一点,开心一点,幸福一点。

Monthly Review 2016-08

  1. 产品迭代有了节奏,可惜一直不能上线。之前不好的行为,现在出了结果。
  2. 对业务的熟悉在进行功能设计的时候很有帮助,思考更为全面,更为合理。
  3. 向小米的同学请教了推荐系统的设计,接触学习 Spark。平台很重要,这位同学之前跟着我们做 iOS,现在小米负责大数据相关的东西,成长真快。
  4. 日活下降,新增乏力,开始接入第三方渠道,业务似乎要变成一个广告平台。
  5. 回老家,六六现在的口头禅:这是啥?那谁?叫我看看。也会很腼腆的说:我不会。
  6. 在宜家买到心仪的桌子,一个桌面四条腿,简单却厚实的大桌子,很喜欢。

Monthly Review 2016-07

  1. 终于招到一个设计师,配合还不错
  2. 国内现在的应用推广实在是乱,ASO 最火,这个还是很有技术含量的,主要是养账号难。苹果也看到了搜索的力量,干脆自己来收租,下半年付费搜索就要上线。
  3. 产品迭代推进,从之前一团乱的情况有所好转,每次确定一个功能来做,完成度可以。现在问题是卡在提交上,不好审核通过。
  4. 2016 ChinaJoy. 第一次自己带队参加活动。几点感触:
    1. 游戏只剩下大公司,中小公司很惨,尤其是现在又出了手游版号要求。
    2. 自己研发苦,做发行的就多了,包括出海/引入国内。
    3. VR 火,不过小厂就是在替大厂做用户教育,最后都是炮灰,看看 PS VR 的预售就知道。
    4. 全民直播时代真的到来了。
  5. 六六两岁生日。去年暑假接到北京住了 40天,今年得再过两个月,天凉快后接过来,就不走了。

29

29.

这一年,职业转型,一切还在摸索中,生活上买房,依然是双城跑,都很难,都还在路上。