Emacs as react native ide

Published on:
Tags: emacs react

最近又在写 react-native 了,对自己的环境又作了一番配置。记录一下。

web-mode

我主要用的 mode 是 web-mode。这个 mode 简直万能,能处理 html,jsx,js 等。具体配置如下。

(use-package web-mode
  :ensure t
  :config
  (add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode))
  (add-to-list 'auto-mode-alist '("\\.js\\'" . web-mode))
  (add-to-list 'auto-mode-alist '("\\.ejs\\'" . web-mode))
  (setq web-mode-markup-indent-offset 4)
  (setq web-mode-css-indent-offset 4)
  (setq web-mode-code-indent-offset 4)

  (setq web-mode-content-types-alist
        '(("jsx" . ".*\\.js\\'"))
        )
)

主要是那个 web-mode-content-types-alist 的配置,让 web-mode 处理 js 文件的时候,把 <> 代码段识别成 jsx。这样能把缩进处理好。

我还试过 rjsx-mode,这个用起来也可以,基于 js2-mdoe,js2-mode 有的一些用法都支持,并且 flycheck 都不用做多余的配置。但是主要问题是,jsx 的代码缩进有问题。

flycheck

(use-package flycheck
  :ensure t
  :config
  (global-flycheck-mode t)
  (flycheck-add-mode 'javascript-eslint 'web-mode)
)

把 web-mode 的 checker 设置为 javascript-eslint,如果你用别的就设置成对应的。配合用的 .eslintrc 文件如下,可以根据自己需求调整。

{
    "parser": "babel-eslint",
    "env": {
        "es6": true
    },
    "parserOptions": {
        "ecmaVersion": 6,
        "sourceType": "module",
        "ecmaFeatures": {
            "jsx": true
        }
    },
    "plugins": [
        "react"
    ],
    "globals": {
        "require": false,
        "module": false,
        "setInterval": false,
        "clearInterval": false,
        "setTimeout": false,
        "clearTimeout": false,
        "console": false
    },
    "extends": [
        "eslint:recommended",
        "plugin:react/recommended"
    ],
    "rules": {
        // overrides
        "react/prop-types": 0,
        "indent": ["error", 4],
        "react/jsx-indent": ["error", 4],
        "no-trailing-spaces": 2,
        "no-console": 0,
        "comma-dangle": ["error", "never"]
    }
}

补全

(use-package tern
  :ensure t
  :config
  (add-hook 'web-mode-hook (lambda () (tern-mode t)))
  :bind (:map tern-mode-keymap
              ("M-*" . tern-pop-find-definition))
  )

(use-package company-tern
  :ensure t
  :config
  (add-to-list 'company-backends 'company-tern)
  )

我用的是 company 后端用的是 tern。.tern-project 的内容如下,可以根据自己的情况调整下。

{
  "ecmaVersion": 6,
  "libs": [
    "browser"
  ],
  "loadEagerly": [
    "Controller/*.js",
    "Utility/*.js",
    "App.js"
  ],
  "dontLoad": [
    "node_modules/**"
  ],
  "plugins": {
    "node": {},
    "es_modules": {},
    "jsx": {}
  }
}

Django middleware

Published on:
Tags: django

Django 提供了 middleware 来让你 hack Request 和 Response。用的时候有几个问题需要注意一下。

__call__ 方法

__call__ 方法实际上就是最早收到 request 的地方,如果不关心 view,那么就可以在这里做你想要做的事情。比如认证用户啥的。这个实际上应该就是早期的 process_request

process_view 方法

process_view 方法会接收到 view_func 和其参数,如果想要针对这些东西处理,可以在这里动作。比如我们所有 api 请求的 POST 的 body 里面都是固定格式的 json 数据,我就在这里检查了 json 的格式,并把解析结果给到了 view_func。

如果不打算对 view_func 做什么事情,那就最好做完想做的事情,直接返回 None 就可以。否则处理完毕之后,返回一个 response 对象。

要注意的是,这里最好不要产生 exception,产生了会把逻辑跑到 Middleware 的 exception 逻辑里面。所以最好对自己的代码段加上 try-except 逻辑。

另外,这里可以对 view_func 做调用,直接返回 view_func 的结果或者处理之后的结果,只要保证是个 response 对象就可以了。也可以不做调用,返回 None ,后续 django 也会调用。要注意的是,如果你对 view_func 做了调用,那么在捕捉到错误的时候,except 里面应该也需要返回一个 response 对象,不能返回 None 了,否则 djangon 还会再次调用这个 view_func 。

process_exception 方法

process_exception 方法是在 view 报错的情况下会调用。我在这里统一返回了 server error 的 json,http 状态是 200 的。

Emacs as python IDE

Published on:
Tags: emacs python

最近 python 写的比较多,比较了几个编辑器,最后还是留下了 emacs。

主要比较了 emacs 和 pycharm。pycharm 绝对是一个很强的 IDE,几乎可以补全任何东西,写代码各种提示。比如 Django 里面定义一个 model User 之后,就可以 User. 之后提示 objects ,这个是依据 metaclass 来补全的。另外还有比如写 User.objects.get(|) 的时候,光标在竖线那个位置,会提示 User 的字段,这个相当好用。这两个只是皮毛,实在是太好用了。

但是为什么还要用 emacs 呢?emacs 的编辑器功能太好用了。比如 < 到页首, > 到页尾, C-x b 切换 buffer,还有切换 frame,等等快捷键非常舒服,完全不用鼠标。不过也可能是我习惯了 emacs 的快捷键了。在 pycharm 里面时不时就不行,比如选择一段文字,纯键盘需要按 -> 配合才可以,那还不如用鼠标算了。

其实如果一上手就用 pycharm,那绝对会觉得很爽。

emacs 写 python 在原生的 python-mode 基础上有两个好用的选择,一个是 anaconda-mode,一个是 elpyanaconda-mode 相对来说比较简陋一点,但是补全什么的没问题,缺少重构功能。两个的工作模式都是会启动一个补全用的进程,然后通过 lisp 和这个进程交互获取补全信息。

anaconda-mode 遇到的问题和解决

anaconda-mode 我遇到一个问题,为了下载 emacs 的 package 方便,我设置了代理,这个代理导致 anaconda-mode 和补全进程交互的时候,连接不能断开,就会不停的新建连接,一会就打开文件数满了,可以参观这个 issue。主要是设置了 no_proxy 解决。


 (setq url-proxy-services
       '(("no_proxy" . "^\\(127.0.0.1\\|localhost\\|10.*\\)")
         ("http" . "127.0.0.1:6152")
         ("https" . "127.0.0.1:6152")))

auto-virtualenv

我的 python 项目使用了 virtualenv ,会在项目目录下面建一个 =.venv= 的目录,把虚拟环境放进去。 anaconda-mode 提供了 pythonic-activate 命令, elpy 提供了 pyvenv-activate 来切换环境。但是每次打开项目都需要搞一下就挺恶心了。

然后找到了 auto-virtualenv 这个工具。安装之后,他会自动查找你的项目里面的可能的虚拟环境。项目根目录识别是通过 =.git= , =.hg= 等一些逻辑来判定的,具体可以看代码。然后虚拟环境识别是通过根目录下面的 =.python-version= =.venv= 等来识别的。

我的项目是建了一个 =.venv= 目录,所以每次打开一个 python 文件,会自动配置好 virtualenv 的环境,这样 elpy 在 django 自带的 model 上面也可以查找 defination。


(use-package auto-virtualenv
  :ensure t
  :config
  (add-hook 'python-mode-hook 'auto-virtualenv-set-virtualenv)
)

elpy

elpy 其实没有什么好配置的,主要注意的是,因为我们用了 virtualenv 环境,所以需要他依赖的包都装在 =.venv= 环境或者装在 python 自己的目录下面应该都可以。启动 emacs 之后可以使用 M-x elpy-config 看看还有什么没配置好。


(use-package elpy
  :ensure t
  :init
  (setq elpy-rpc-backend "jedi")
  (elpy-enable)
  :config
  (add-hook 'python-mode-hook 'elpy-mode)
  (with-eval-after-load 'elpy
  (add-hook 'elpy-mode-hook 'elpy-use-ipython))
  :bind (("M-*" . pop-tag-mark))
  )

elpy-rpc-backend 有两个选择,一个 jedi ,一个 rope ,我试了感觉区别不大,另外 rope 感觉要死了。所以我用了 jedi

flycheck

flycheck 可以配合 flake8 实时显示出来你的代码有不符合 flake8 要求的地方,很方便。这个工具我也遇到一个坑 issue,有兴趣可以看看。主要原因是 flycheck 是使用 flake8 < xxx.py 这种方式检查的,而这种方式下 flake8 不会考虑文件头部的 coding 设置,来识别文件编码,而是根据 LC_CTYPE 环境变量来的,所以只要正确设置这个变量就可以了。 issue 里面提到的设置 emacs 的编码屁用么有的。

flycheck 可以配合 flake8 和 pylint 来做 python 代码的检查,如果装了前者,就不会考虑后者了。我试过 pylint,这货默认要求有点高,比如 class 和 method 没有 doc string 也会提示,代码一堆问题,我就赶紧换掉了。。。

python outline

好处是打开 python 文件的时候,会把代码都折叠起来,按照需要你自己打开就好。elpa 里面没有,网上搜到的。


(use-package python-magic
  :ensure outline-magic
  :config
  (add-hook 'python-mode-hook 'my-python-outline-hook)
  (add-hook 'python-mode-hook
            (lambda ()
              (setq outline-regexp "def\\|class ")))

  )

indent-tools

这个工具是用来锁进 python 代码和浏览代码用的。搜一下有动图,看看就知道了。


(use-package indent-tools
  :ensure t
  :init
  (add-hook 'python-mode-hook
            (lambda () (define-key python-mode-map (kbd "C-c i") 'indent-tools-hydra/body))
            )
  )

yasnippet 和 company

elpy 是使用这两个补全的。有几个有用的配置, C-s 那个,可以在补全候选菜单出来的时候,用关键词过滤结果。

我没搞定在 company 里面直接显示出来 yasnippet 可用的 snippet,只好设置了一个快捷键 C-c y 来提示。可以提示出来一大堆。比如我经常写错的 -*- coding:utf8 -*- 有一个 snippet 叫做 utf8 ,直接输入之后 tab 就可以了。


(use-package company
  :ensure t
  :init
  (setq company-minimum-prefix-length 2)
  (setq company-dabbrev-ignore-case t)
  :config
  (add-hook 'after-init-hook 'global-company-mode)
  (define-key company-active-map (kbd "C-n") #'company-select-next)
  (define-key company-active-map (kbd "C-p") #'company-select-previous)
  (define-key company-active-map (kbd "C-s") #'company-filter-candidates)

  (global-set-key (kbd "C-c y") 'company-yasnippet)
  )

Run ssserver on VPS

Published on:

VPS 上面好早以前用过 docker 跑了一个 container 运行了一个 ssserver, 是从 debian 基本系统创建, 然后手动安装各种软件弄好的. 最近朋友升级了 docker, 那个工作有点问题了,就重新搞了一下, 发现现在好方便.

我用的是这里提供的 dockerfile https://github.com/EasyPi/docker-shadowsocks-libev, 他的例子里面使用了 docker-compose 来创建, 发现很简单, 不过遇到了一个问题, 说一下解决办法.

这个 docker 本地监听的端口是固定的 8388 不能修改, 例如 docker-compose.yml 里面


server:
  image: easypi/shadowsocks-libev
  container_name: wd-ss
  ports:
    - "HOST_PORT:8388/tcp"
    - "HOST_PORT:8388/udp"
  environment:
    - METHOD=aes-256-cfb
    - PASSWORD=5ouMnqPyzseL
  restart: always

需要配置的是 HOST_PORT METHOD PASSWORD 这三个变量, 然后我还指定了 container_name 方便以后的操作, 不指定会自动产生一个.

启动服务之后,可以使用 docker logs wd-ss 来看 log, 类似于下面, 这个 docker 启用了 udp relay 和 tcp fast open, 差不多也就够了.


 2017-06-09 03:13:17 INFO: using tcp fast open
 2017-06-09 03:13:17 INFO: UDP relay enabled
 2017-06-09 03:13:17 INFO: initializing ciphers... aes-256-cfb
 2017-06-09 03:13:17 INFO: using nameserver: 8.8.8.8
 2017-06-09 03:13:17 INFO: tcp server listening at 0.0.0.0:8388
 2017-06-09 03:13:17 INFO: udp server listening at 0.0.0.0:8388
 2017-06-09 03:13:17 INFO: running from root user

如果想要开启更多选项, 可以在 compose 文件里面使用 command 自定义启动命令


  command:
    ss-server -s 0.0.0.0
              -p 8338
              -k 5C4D5403-31C9
              -m aes-256-cfb
              -t 30
              --fast-open
              -u
              -a nobody

自己实验过程中, 如果可以随时删除自己的 container 重建, 将来 ss 升级的话, 只需要把 image 更新一下,然后删除再新建一下 container 就好了.用起来还是相当简单方便的.

Meetings and meetings

Published on:

前几天海龙 在 twitter 的提了一个问题“这个世界上有喜欢开会的人吗?能和我说说理由吗?”。作为开了很多会的人,由不住想说两句。

    首先,高质量的会应该具备什么呢?我也没看过《罗伯特议事规则》这样的书(放在 kindle 里面好久了一直没看过,汗颜。。),就是自己按照自己参与的情况总结下:
  • 会议前必要的沟通,好确认是不是需要你参加。当然也有一定可能性组织会议的人确认需要你参加而不做沟通(当然也不排除判断错误的时候 QAQ)。
  • 组织会议的人做好前期调研,会议讨论的一些相关方案的基本情况应该需要比较了解。避免好容易召集齐人之后,发现要讨论的内容本身自己互相矛盾,或者需要参会的人没有通知等情况。
  • 邮件通知与会人会议要沟通的内容,和希望达成的目标,让大家提前了解事情的原委。也给大家一个机会提前确认下是不是真的和自己有关系。
  • 有了希望达成的目标,就应该会比较明确具体需要谁参与,比如想要一个明确的决定的时候,却约一个不能拍板的人来,这会议注定不能成功。
  • 会议中有可以控制会议节奏的人主持。能适时的阻止一些无关话题,扯皮,控制会议节奏,避免开大长会和会上吵架。
  • 会议中有人记录会议记录,结束后有人会把会议记录和结论(这个很重要,没有结论的会就是没必要开的会)发给所有人。

下面列几个我作为技术人员常见的一些烂会。

产品总监派一个刚入职几天业务都没摸清的人召集一帮干了好几年的工程师开会。这种情况下,产品经理大概率会被工程师各种怼,因为他不可能真的熟悉产品,工程师提到的很多可能的问题都不太可能圆满回答,最后会发现要讨论的问题各种依赖性,A 功能不确定的情况下,B 功能可能直接就不存在而没必要讨论了。最后会导致会议非常低效。这个时候所有人都会不爽,技术工程师会认为浪费他的时间,产品经理会认为这些人好难配合。其实锅应该是在产品总监头上。

跨部门的会议。很多时候莫名其妙就招呼你去开会,到了之后也不知道是讨论什么的,最后听半天发现貌似和自己一毛钱关系都没有,浪费几个小时。当然浪费的是你的时间,组织会议的人其实是有收获的,他明白这事情和你无关。

头脑风暴会议当作需求讨论会来开。有时候对方可能根本没有明确的想法,你当成最终需求讨论半天指出来其中各种问题,最后发现其实他们根本就确定怎么做呢。这种情况其实就是那个网传的“产品经理找你聊一天,他的需求有了,你的程序还没写”的情况。毕竟需求会的优先级会比头脑风暴要稍微高一点。

如果作为组织者,就是尽量做到前面提到的好的会议应该具备的条件,避免浪费别人时间。作为参与者,如果有能力,遇到有问题的会议,应该想办法协助会议组织者把会议变高效,提高效率的同时,自己也会节省不必要的时间,我经常这么干,毕竟年轻人不容易。。。。当然,我有时候不一定那么有耐心,遇到垃圾会有时候直接就走了,留他们继续浪费时间。

再回到海龙的问题,我的回答是有些人为了合理的浪费时间,是会喜欢开会的,因为这样会让别人觉得他的时间安排很充实,因为整天不在座位,在忙。不知道各位开会的时候有没有遇到一些人全部时间都是在刷手机,只是偶尔说一两句话?这些人就是我说的这种人。我如果遇到我没兴趣的会或者和我无关的会议,我会直接和组织的人申请离开,如果确实后面和我有关系,那麻烦到了时间点叫我(当然你也得保证下到时可以随叫随到,避免浪费其他参会人的时间等你),当然,呃…… 如果我碰巧也想合理的浪费一下时间。。。。

这些人一般都需要是 leader,至少有人在给他创造 GDP 的,否则一个手头很多工作要干的人,你让他开这种无意义的会他自己也不答应,否则其他工作完不成无法交代的。不过某种意义上讲,这些人也是有贡献的,至少能组织一些人贡献 GDP 就是贡献。

感觉跨职业跨部门的会比较容易产生垃圾会,因为看问题角度不一样,有时候会比较难互相理解。我们技术人员很多时候开会,都是找一块白板,画几个图,大家就都明白了,很快就能出决议,不能定的一般可能是需要 leader 拍板的。

同一个部门的会大家会接触比较多比较容易妥协,能接受自己多花点时间或者吃点小亏来完成一个事情。这其实也是所谓的拓展,团队活动,年会想要达到的目的,如果大家都很熟悉的情况下,就比较容易站在对方的角度想问题,遇到事情容易妥协。

上面提到的这些问题其实越大的公司问题越多,反而小公司比较少,因为头绪少,并且大家都比较熟悉的缘故。当然实在遇到一个比较弱的会议组织者,烂会也不可避免。

Something about cruise tour

Published on:
Tags: cruise travel

之前知道邮轮游一直没有体验过,据说是在上面各种滚来滚去看书,因为手机没有信号,没有网络。前几天体验了一把,总结一下。

一句话总结

这上面有你讨厌的所有因素,大妈,广场舞,广场卡拉 ok,小孩子,无序,占座,插队,甚至最后一天还目睹了两起吵架。

邮轮游玩什么

我参加的是歌诗达幸运号(Costa Fortun),邮轮上面估计 80% 都是各种大爷大妈,带着女儿外孙。你可以想象一下,平时最不喜欢的组合在这里最全了。

邮轮上面有免费的自助餐和一些特别的餐食,比如批萨,面条,猪排什么的。也有收费的餐食,当然你可以不去。酒和软饮都是收费的,开饭的时候有免费的白水给你喝,屋子里面是没有的。

邮轮上面一般有大量的娱乐设施,比如赌场,游戏机,泳池,桑拿,剧场等。还定期有各种娱乐活动,比如猜个字啊,跳个舞什么的。所以第一次去还是可以看个新鲜的,尤其可能还有一些漂亮的陪玩 mm,看着也还可以。游戏机赌场是收费的,恩。

此外剧场每天基本都会有一场大型的演出,30-40 分钟,可以让你打发时间。但是剧场虽然每天演出内容不一样,但是演员总是那一波,看多了其实也会腻味。

房间里面也有电视,不过我观察电视都是反复重播录下来的一些电视,然后有一个电影台还是只有那么几部反复重复播放,《x man 天启》我看了不下 10 遍。

小孩也有人给带着玩游戏,有专门的儿童俱乐部。还有健身房,健身房是我唯一对这次邮轮活动满意的地方,当然肯定不是对环境满意,毕竟里面充满了大爷大妈,满意的地方主要是在设备,设备真心不错。浴室和换衣间地板异常干净,比起我家楼下的奥力,简直天上地下。

邮轮一般有那么1,2天是下船,我们这次的安排很屎,景点很无聊,低接导游也只是对购物有兴趣,购物店虽然不贵,但是东西比较少,挺没意思的。

让人反感的几个瞬间

排队上邮轮的时候,过安检的时候就一条队排的特别粗,到了最后那变细互相挤着往前走。我们后面有个阿姨就各种急着往你前面走,我老婆发现之后就故意挤着不让,我看的笑死,呵呵。

第一天必须做逃生演习。有个大爷一家推着小车带着孩子,孩子可能没一会睡着了。而演习是需要所有人参加的,所以就不得不等比较慢的人。大爷就生气了,开始呵斥工作人员,「孩子都睡着了,啥时候开始」之类的,声音巨大。工作人员大都是外籍,估计也吓了一跳。最后结束的时候,大爷还过去指着那个工作人员不知道说了什么。

剧院演出,基本前三四排上面都是东西占座的。除非你提前半个小时到。另外就是各种小孩大声说话也没人管。有时候酒吧做游戏,工作人员都明确说了游戏可能比较激烈,让大家把小孩弄走,但是看着一个女的抱着小孩几次被劝离之后还是要上去玩,貌似还是上去让小孩参与。

昨天有个游戏,几个被淘汰的大妈,悄悄的跑回去继续参与,也有跑回去被发现之后赶走,再次跑回去的,当着一百来号人目睹就那么做,真的无语。

今天下船之前大家集中在一个地方等着,有个姥爷带着孙女玩气球。有个哥们玩心重,带了个面具就冲那小孩过去了,小孩吓的赶紧跑到了姥爷后面,那个哥们就走了。过了半分钟小孩反映过来开始哭,那姥爷就开始不爽了。后来他们全家,追着那小伙骂,最后把面具也抢过来了,还要护照说要以后有啥毛病要找他。纠缠了能有10分钟。

这只是记得起来的几个,反正年轻人真的不建议去邮轮了。如果是自己父母,倒是可以推荐去,他们应该喜欢。

My way to keep fit

Published on:

目前第一阶段减肥基本告一段落,后面目标是保持目前体重 6 个月。

先聊聊结果

2014 年 9 月份前,我的体重最高到 98kg,甚至有时候超过了 100kg。第一阶段减肥可能截止到 2016 年中,减到体重大概是 92kg。第二阶段开始于 2016 年 2 月底,截止到今天体重 80kg。整体算下来减掉 40 斤。

第一阶段

2014 年开始我发现一种比较简单的减肥方法,就是不吃或者少吃晚饭。

这个方法应该不一定对所有人适用。我估计应该只对 BMI(Body Mass Index, 身体质量指数,注意和体脂率不是一个东西)比较高的人有用吧。

我当时 BMI 是 98/1.77^2=31.28 是属于比较高的,坚持了上面的方法半年之后,大概最瘦的时候是 28,我查了是刚好脱离了肥胖那一档,进入了过重。

我当时所在的公司的上班时间是 10:00 - 19:00,但是经常出现 20:00 以后才从公司走的情况,这样我到家经常是 21:30 或者 22:00 以后。这个时候吃晚饭就太晚了,基本吃饭完了就睡觉了。并且,中午吃饭到这个时候,一般其实已经饿过劲了,那个时间反而没有那么饿了,我就慢慢开始晚上到家之后只吃几个水果。后来慢慢转为不吃东西,或者只吃很少的水果。有时候也会遇到快下班的时候非常饿,这个时候吃点小零食,也就可以了。这种方式减肥,早上和中午基本不控制自己,还是吃的比较好的。

上面说了,这个阶段减掉了大概 10 多斤。中午饮食基本不控制,晚上不吃,或者很少吃(一个月有那么一两次推不开的)。

第二阶段

大概是从今年 2 月底从日本回来,开始实施,方法是锻炼加节食。

锻炼的内容是 60 分钟椭圆机(我用的机器难度是 5,不同机器可能不一样),30 分钟运动后拉伸,30 分钟游泳。大概是每周 1,2,4,5 去,一周会休息三天。锻炼毕竟比较枯燥,所以需要中间休息一下调剂一下心情,如果你的体力耐力跟的上,可以不休息。

上面的强度下来,进度大概是一周 3kg。我的情况 3 月 25 是 88.6kg,5 月 2 是 81.7kg,5.5 是 80kg。为什么比较慢呢?在这两个月内,我参加了一趟邮轮游大概一周,去了一趟沈阳,大概一周,还去了一趟日本大概一周。所以如果坚持应该可以更快,但是快速减重我感觉应该可能会有副作用,所以我也基本也是控制减一点,保持几天这样子,不让这个减重太快。另外,这段时间我是全职减肥,所以没有工作上面的压力,可能速度相对快一点。

方法细节

MHR

按照一些理论,在有氧运动一定时间 T 之后,保持一定的心率 HR 继续运动,就会开始消耗脂肪。所谓的 fat burning zone (搜索到的,仅供参考)。

对于 T,我看有的说是 20 分钟,有的是 40 分钟。我一般的做法是持续运动 40-50 分钟,不超过一小时。

对于心率,先看下面的公式


MHR(最大心率) = 220 - age
MHR = 206 - (0.88 x age)

上面是最大心率,有多种算法最后应该结果大致有个范围,然后你的减脂的 HR 范围就是 MHR x (0.7 到 0.8) 之间。我算出来我的是大概 130-145.

所以注意并不是越累越好,比如天天跑 5km 还追求速度,那个思路不对,那个不是减肥。只要心率到了加持续时间够长。,不管做什么都减肥。

节食

如果想要减脂,必须要节食,并且节食之后,我发现不运动体重也会降,直到降到一个平衡点。

节食并不是一下子就从原来中午晚上吃两碗米饭变成只吃一个苹果,这个也是应该有个循序渐进的过程,要不不说身体是否能接受,你自己就坚持不下来。

我的建议是,逐步减少饭量,花 1-2 个月来完成这个过程,一定要给自己定一个什么时间点达到什么目标的方案,否则面对一个自己都觉得无法达到的目标,也会容易被各种诱惑吸引,然后放弃。

节食期间,并非就一直得是清淡饮食,偶尔吃一次大餐也不是不行,但是最好安排在中午,并且吃了之后第二天早餐午餐一定要减少量。另外注意是「偶尔」,千万别当成常态。

此外,也得注意要按时吃饭,节食本身就很痛苦了,如果不能按时吃饭,比如过了平时饭点再吃,容易吃多,影响节食效果。

我自己的方案,如果今天上午不出门,那就最多喝一杯牛奶做早餐。如果要出门,可以接受大概半个馒头那么多的饮食量。中午也类似,如果不出门就少吃,如果要出门,可以适当比平时多一点点,避免晚上的时候很难熬,或者路上出现低血糖。

我自己控制的结果,是在中午大概3点一顿自助餐的基础上,晚上6点又有不能推掉的酒局的情况下,中午一杯啤酒,晚上一杯红酒,然后第二天重量维持不变。自己感觉还是挺有成就感的,当然也很痛苦。

我目前体重还没有到平台期,还不清楚节食结束之后反弹的情况,但是我自己的打算是平台期或者达到我的目标体重之后,我再继续维持低饮食量一段时间巩固下,把自己的饮食习惯培养好,不再能暴饮暴食的情况下,应该是可以适当放开饮食的。

    总结下:
  • 节食要循序渐进,不要一次就到位,食量可以比如每周减 1/4 的节奏安排。
  • 设定自己的目标,一阶段一阶段完成,不要一次设定一个看着无法做到的目标
  • 饮食要准时定量,实在受不了的时候,可以允许自己来一次暴食(不要暴饮,尤其是甜的饮料,酒等),但要注意控制次数
  • 毅力坚持很重要。我节食期间参加各种自助餐,火锅,聚餐等都能很好的控制自己的食欲。

关于低血糖,特别讲一下,节食非常容易产生低血糖,建议按照自己的体力,健身之前最好吃一口东西(不要多),或者随身携带一些吃的,一旦感觉低血糖头晕,就补充一点。别产生什么危险。

低血糖的时候,也会影响你做事情的效率,会发现什么事情都不想做,所以这个时候最好就吃点吧,不过要注意是这也是有控制的吃。

跑步机 vs 椭圆机 vs 动感单车

    我自己家里买了一台动感单车,实际实践过之后,用这个有几个缺陷
  • 自己练没有动感。在操课房里面教练会带着不停的变换速度,动作,一方面让你觉得没那么无聊,另一方面也是能增加运动量。
  • 自己练容易损坏脚踝和膝盖。我自己在家练的时候,基本就是站上面运动 30+ 分钟,脚一直在单车上面脚尖踩着,练完之后脚会疼痛。

我其实挺喜欢在外面跑步,尤其早上,但是因为体重大,好几次都是跑一周之后双腿膝盖会开始疼痛,只好作罢。健身房里面的跑步机冲击比路面跑步小,可以试试看。

最近尝试了跑步机上面跑,坚持 2 周之后,还是出现了一只腿的膝盖疼痛,只好暂停。开始尝试椭圆机。

跑步机上面跑强度比椭圆机肯定强很多,跑步机上面在一个不快的速度下面,我持续跑 15 分钟之后,心率就会达到 150,其实已经有点高了。

    跑步机的几个问题
  • 容易心率过快
  • 不方便听音乐看片子分散注意力
  • 不容易不间断坚持跑 30 - 40 分钟
  • 膝盖损伤
    最后发现椭圆机实在是很不错
  • 运动速度慢,不妨碍你看片子听音乐(这个非常重要,否则坚持50分钟很难)
  • 速度恒定,也就是心率恒定,你只需要选择一个适合你的减脂的心率的难度就可以了
  • 对膝盖冲击比较小

我用实际使用的就是椭圆机 Elliptical Trainer。一次 60 分钟,控制心率在 140 左右。高了就换近一点的把手,低了就换远一点的。

运动后拉伸

这个一定要做,可以参考 keep 这个 app 里面的一些教程做,另外就是自己看着健身房的设备练练。注意设定好节奏,比如一组 10 次,做 3 组。

这个是拉伸,不是力量训练,所以不需要挑战自己的极限。控制好设备的重量。

饮食注意

我本身血压高,所以需要低盐。然后减脂的话,一般的讲法是不要吃或者少吃和糖类有关系的食物,比如糖,西瓜这些,以及很容易转换为糖类的食物,比如谷物,大米这些。可以吃肉类(瘦肉或者白肉,比如鸡肉鱼肉)。

我以前基本没炒过青菜,这次发现光是做到不难吃的话,其实很简单。

  • 不用水煮直接凉拌:黄瓜,西红柿等,莴笋
  • 白水煮了就能接受的:西兰花,菜花
  • 水煮之后过油炒一下加点盐或者酱油的:油菜,蘑菇,小白菜,菠菜
  • 直接过油炒一下加盐或者酱油:芹菜

之前看了一本书,里面讲到几个低盐的方法,就是比如放入火腿肠等本身自带咸味的食材,或者往酸的方向走。对于凉拌菜,可以适当考虑加一点醋,发现还挺不错的。

Update

有上面这几招,应该可以让你短时间不会吃腻了。我中午基本就是吃一盘青菜,不吃主食。

2017.6.9

更新一下, 从停止运动到现在已经大概一个多月了, 之前最低到了 78kg. 这一个月发现如果还按照之前的食量, 体重还会降. 但是我不打算继续让它降的, 所以也开始提升食量.

最近两周我还出去国内玩了一趟, 吃饭吃的也挺多的, 时间也不固定, 到了当地还会尝试喝当地的一些米酒啤酒之类的, 到今天早上称重是 79kg. 感觉还可以.

2017.6.30

再次更新一下,目前体重 77kg。目前吃喝的内容基本已经不需要太注意了,只是有意不要多吃,也避免吃谷物类。不过我也吃过几次米饭,面条,大饼什么的,目前体重还是保持住了。

Use org mode to publish blog

Published on:
Tags: org-mode org

a test

啊哈哈哈哈,超棒唉。markdown 里面写代码都没有高亮,org 里面是可以把代码部分高亮的。 效果可以看 这里

Title1

title2

  • list1
  • list2
  • list3

import sys

class Hugo(object):
    def __init__(self):
        pass

hugo = Hugo()
print(hugo)
print("just a test")

Migrate blog to hugo

Published on:
Tags: hugo hexo blog

折腾了好几天,把 blog 从 hexo 迁移到了 hugo 上面。hexo 是使用 nodejs 写出来的,hugo 是使用的 go。主要基于下面几个原因吧。

  • 个人不太喜欢 nodejs 那一坨依赖。
  • hugo 也比 nodejs 速度快很多。
  • hugo 用起来比较简洁。

首先写了一个迁移工具 hexo2hugo。网上还有一个 nodejs 版本的迁移工具可以参考。其实就是简单的把头部信息处理一下就可以。我还有一些特殊需求,比如把老早以前的一些 html 格式的文档顺道处理一下格式,还有一些小的修正和兼容工作,所以自己写了一个。另外也主要是好久没有写代码了,熟悉下。。

把文档迁移过去之后,找了几个主题看了一下,发现没有很喜欢的,就本着蛋疼的原则,把原来用的主题也迁移过来了,这个花的时间比较长一点。主要还得熟悉 hugo 的模板语法,还得想办法适配 hugo 的体系。比如 hugo 里面没有 archive 一说,不过通过万能的 google 搜索到了一个解决办法,也勉强还好。

目前这个 blog 已经是由 hugo 产生了,和以前外观,访问地址完全一模一样,rss 地址都一样。我测试了 google 里面的搜索结果,是都可以跳转的。今天算是基本都迁移完毕了。

这几天没事也总想记录一点想法,但是无奈新本子上面的 hexo 挂了,又不想搞 nodejs 那一坨依赖,就折腾了这个事情。不过折腾完毕之后发现想记录的事情都忘记了,nnd。