Development in Startup

dev-culture

Fix "Enter passphrase for key" on macOS

You will be asked ‘Enter passphrase for key’ when doing SSH operation:

Enter passphrase for key ‘/Users/fannheyward/.ssh/id_rsa’:

On macOS you can fix this by ssh-add -K.

pushd / popd

cd - can goto last directory that you just leave, - means $OLDPWD. This only support one directory.

pushd / popd / dirs works on multiple directories, as a directory stack:

pushd [dir1] # add dir to stack
popd [dir1] # pop dir from stack
dirs # list stack
dirs -c # cleanup stack

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())
    }
}

六六

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

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

The Role of Technology

@Fenng:

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

Depends on yourself

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

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

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

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

2016

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

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

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

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

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

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


生活

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