对于 GTD 的进一步思考

两年前,在经历了几个月的拖延之后,终于看完 《Getting Things Done》这本书,还写了一篇总结。 经过两年实践的今天,再看这篇总结的时候,感觉十分啰嗦而且没有点到要害,加上这段时间以来有了一些新思考,精简优化了流程,感觉是时候重新聊聊 GTD 这件事情了。
2020/04/30 21:31 下午 posted in  坏笔记不如好记性

GTD 入门笔记

看完 GTD 之后对 GTD 理论有了更进一步的理解,通过通读,更加清晰了 GTD 四步法:收集,清理,组织,回顾,也明确的四步法与执行的关系,并顺便根据自己的理解将 GTD 这一套理论简化为 4 个原则,以方便执行和安利。
2018/04/30 19:07 下午 posted in  坏笔记不如好记性

Ansible Config 和 Playbook

Config

Ansible 的配置一般不需要更改,如果需要定制,自定义配置也很简单,在 Ansible 中,寻找配置按照如下顺序:

  • ANSIBLE_CONFIG (一个环境变量)
  • ansible.cfg (位于当前目录中)
  • .ansible.cfg (位于家目录中)
  • /etc/ansible/ansible.cfg

因此只需要按照文档自定义配置即可:http://ansible-tran.readthedocs.io/en/latest/docs/intro_configuration.html

Playbook

为了方便保存执行的操作,Ansible 使用了 Playbook 剧本。剧本使用 yml 格式,来避免成为了一种新语言或者脚本。

Playbook 是有 play 组成的,每个 play 包含了 host,user,tasks。

比如一个 playbook:

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

host 便是指定的 hosts 文件中的主机,可以通过 remote_user 指定在远程使用的用户,也可以用 sudo 为远程操作添加 root 权限。

Task

作为远程部署工具,task 是整个 playbook 的重点。每个 task 都会在指定的所有远程主机执行,如果有执行失败的主机,将会被跳过。

每个 task 目标在于执行一个幂等(moudle)的操作,因此即使是多次执行也会很安全。一个 task 类似于下面的格式:

tasks:
  - name: make sure apache is running
    service: name=httpd state=running

一个 task 包含了名称,model,以及参数。更多的 task 写法见: http://ansible-tran.readthedocs.io/en/latest/docs/playbooks_intro.html

2017/07/26 13:43 下午 posted in  坏笔记不如好记性

Ansible 初体验

记得刚来上海的时候,叶神给了我一本奶牛书:《奔跑吧, Ansible》。时隔一年,我居然有了写 Ansible 脚本的需求。

安装

pip install ansible

配置主机

在安装完 ansible 之后,需要在 /etc 下创建一个 ansible 文件夹,并在里面添加一个 hosts 文件,因为 ansible 会默认在 /etc/ansible/hosts 中寻找主机的配置。

因为 macOS 下 etc 文件夹不能编辑或者因为其他原因,可以通过 -i 指定 hosts 的位置。

可以创建一个 hosts 文件:

[local]
10.8.0.164

[blog]
150.95.155.202 ansible_user=user ansible_port=2222

[] 内为 target, 可以通过 targets 来对主机进行分组管理。

每一行包含一个 ip 或者域名,host 好支持一些表达式。

在每个 ip 后面可以加一些特殊的参数,比如 SSH 用户名,SSH 端口,密钥等。

详细配置可见: http://docs.ansible.com/ansible/latest/intro_inventory.html

配置完 hosts 文件之后便可以进行 ping:

$ ansible -i hosts all -m ping
10.8.0.164 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
150.95.155.202 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

也可以对某一组的主机进行 ping:

$ ansible -i hosts blog -m ping
150.95.155.202 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

执行

当能够连接上主机之后,便能对某个或者某组主机执行命令了:

$ ansible -i hosts local -m service -a "name=docker state=restarted" --become --ask-sudo-pass
SUDO password:
10.8.0.164 | SUCCESS => {
    "changed": true,
    "name": "docker",
    "state": "started"
}

其中 -m 是选择使用的模块, ansible 有大量的模块可以使用, 不同的模块负责管理不同的功能,对 ansible 的学习也就是对这些模块熟悉的过程。

--become 是作为某个用户来执行,如果添加整个参数,或默认尝试使用 root, 如果需要密码的话,还需要输入密码相关的参数, 权限相关的参数见:

  Privilege Escalation Options:
    control how and which user you become as on target hosts

    -s, --sudo          run operations with sudo (nopasswd) (deprecated, use
                        become)
    -U SUDO_USER, --sudo-user=SUDO_USER
                        desired sudo user (default=root) (deprecated, use
                        become)
    -S, --su            run operations with su (deprecated, use become)
    -R SU_USER, --su-user=SU_USER
                        run operations with su as this user (default=root)
                        (deprecated, use become)
    -b, --become        run operations with become (does not imply password
                        prompting)
    --become-method=BECOME_METHOD
                        privilege escalation method to use (default=sudo),
                        valid choices: [ sudo | su | pbrun | pfexec | doas |
                        dzdo | ksu | runas ]
    --become-user=BECOME_USER
                        run operations as this user (default=root)
    --ask-sudo-pass     ask for sudo password (deprecated, use become)
    --ask-su-pass       ask for su password (deprecated, use become)
    -K, --ask-become-pass
                        ask for privilege escalation password

使用 root 用户:

Hypo-MBP:~ hypo$ ansible -i hosts local -a "whoami"
10.8.0.164 | SUCCESS | rc=0 >>
hypo

Hypo-MBP:~ hypo$ ansible -i hosts local -a "whoami" --become --ask-su-pass
SUDO password:
10.8.0.164 | SUCCESS | rc=0 >>
root

Playbook

通过命令行总归不是优雅的姿势,还是需要能存储的固定的脚本,每次部署的时候运行这个脚本,在 ansible 里便是 playbook。

NEXT 见:Ansible Playbook

2017/07/25 12:12 下午 posted in  坏笔记不如好记性

图灵机器人

偶然间发现居然有一家公司提供图灵机器人的 API(http://www.tuling123.com ),突然觉得可以做些好玩的东西,比如接入 DaoVoice。

在之前就在博客上接入 Voice,但是基本上没怎么用过,索性就拿自己的博客做个试验。

获得 API

图灵机器人 注册下,然后创建一个机器人拿到 APIkey:

然后可以使用官方提供的 API,进行简单的对话:

# POST /openapi/api

+ Request (application/json; charset=utf-8)

        {
            "key": "<APIKey>",
            "info": "hello",
            "userid": "<user_id>"
        }

+ Response 200

    + Headers

            Transfer-Encoding: chunked

    + Body

            {"code":100000,"text":"hi"}

这里的 info 就是发送的对话,而 response 里的 text 就是回复。

需要注明的就是这里的 userid,这是一个可以为空的字段,如果填写的话,可以对不同的用户的对话加些区分。

这个 api 可以做很多有趣的事情,不仅仅是简单的对话,还可以提供日常服务,比如问问天气讲个笑话之类的,用法的话可以见官方文档:http://www.tuling123.com/help/h_cent_webapi.jhtml?nav=doc

接入 DaoVoice

对于对话类的接入肯定是需要实时性,那么 Voice 提供的 Webhook 就可以满足需求,而 webhook 的详细内容可以看 Voice 的文档:http://docs.daovoice.io/api/#webhook

比如当收到用户回复的时候,主要关注 conversation_idconversation_parts 里的第一个信息的 body ,前者因为这是调用 Voice 回复 api 时要用的信息,后者是因为 conversation_parts 包含了整个对话,而第一个便是最新的回复。

当拿到这两个信息之后,把 body 里的内容,发给图灵机器人获得回复之后再把回复通过 回复对话API 发送给用户就可以了。

Docker image

因为程序非常简单,就是两个 API 来回倒腾,就几行代码的事情,索性 build 出一个镜像:https://hub.daocloud.io/repos/147ff5fa-dbdd-4f79-a489-546d2fc63e9c

部署

需要几个环境,变量,缺一不可。

KEY VALUE
VOICE_TOKEN DaoVoice 的 access_token
VOICE_API https://api.daovoice.io
VOICE_ADMIN_ID DaoVoice 用来回复的用户 admin_id
REBOT_API http://openapi.tuling123.com/openapi
REBOT_TOKEN 图灵机器人的 APIKey
docker run -d -p 80:4000 -e <上面的环境变量> daocloud.io/ihypo/robot

还有一个选填的环境变量:

KEY VALUE
SAY_HELLO 当用户创建回话的默认回复

使用

这个镜像开放两个 API

ping api,用来检查看有没有还活着:

# GET /_ping

hook api,直接把这个 api 添加到 DaoVoice 的 webhook 里就可以了:

# POST /hook

注意

只保证 tag:latest 能正常工作。

试玩

不用说太多,现在就点下右下角试玩下吧。

2017/01/19 21:57 下午 posted in  坏笔记不如好记性