• 请教接口设计规范问题 at 2019年02月15日

    有一个考量是日志和监控。

    我在负责的项目的现行做法是在应用代码(语言是 Python)里写一个专门的 WSGI 中间件,这个中间件负责把请求耗时和请求的一些元信息(URL path,HTTP method 等)发送到储存服务(目前在用 InfluxDB)。

    如果遵守了 REST 设计规范,那么 HTTP method 加上 URL Path (不包括 query string 部分)就足够表达这个请求落在哪个接口。在展示监控数据的 dashboard 上可以按照这些元信息来筛选数据。如果要自己发明约定规则,那么收集 + 储存 + 展示数据的服务都需要对这个约定 aware 才行。换句话说,这些服务都要对"是否包含 id 字段"做区别对待。虽然这个问题自己写代码总能解决,但遵循了 REST 约定就可以享受现成的方案,节省开发者的时间。

    如果我想把上述的监控数据收集方案改成用日志收集 agent 来转发负载均衡的访问日志,从而少写代码,进而移植到别的应用 / 服务(很可能不是用同样的编程语言编写的)上去,那么这时遵守一个更流行的规范就能节省更多开发时间。

  • 在 YouTube 上有的视频已经有自动地语音识别生成的英文字幕了。点播放界面右下角的齿轮按钮 -> Subtitles/CC 可以看到。

  • Alpine Linux 3.9.0 Released at 2019年02月01日

    目前一个常用的理由是作为 Docker Image 的 base image。可以有效减小镜像的体积。

    比如 Nginx 的 Docker 镜像,以 debian:stretch-slim 为 base 的 1.14 版本要 109 MB. 而 1.14-alpine 只有 16MB。

    体积更小,那么下载速度更快,需要去清理硬盘上的旧镜像的频率也更低。

  • 这篇文章下面的评论里就有不少反对这篇文章的声音. 我也尝试着批判一下试试:

    另一方面则是因为这样极端的饮食模式很难长期坚持

    这里我不太清楚作者所说的"极端"是指什么. 从旧石器时代饮食(Paleo Diet)的思路出发: 人类在旧石器时代, 没有保存食物的技术, 没有磨制石器可以处理粮食. 只有应季鲜果才是糖分来源. 一年中的大多数时间都要猎取动物为食. 所以这种饮食方案其实更符合人类的消化能力.

    关键的一点在于,我们的身体,并不喜欢这种“饥饿”状态,它不希望葡萄糖被耗光。

    这点我不清楚是否有理论支持.

    人体有能力把其他物质(储存的脂肪, 蛋白质)按需转化成葡萄糖. 这一过程称作糖异生(Gluconeogenesis).

    天天吃得过于油腻以致参与者们胃口不佳、食欲不振、越吃越少

    我个人吃得油腻照样能吃得下去. 我的食欲确实比以前更差了些, 但并不是油腻所致, 而是瘦蛋白(Leptin)的作用. 而且低糖摄入 -> 减少了因为糖分分泌的多巴胺 -> 减少了糖分上瘾. 这也是食欲下降的原理之一.

    这一说法的理论基础是,当血液中的酮体浓度升高后,神经中枢会抑制食欲。道理好像讲得通,但是大部分的研究结果都显示,这一功效是子虚乌有的。

    我在研究生酮饮食的时候, 从来没有听说有"酮体抑制食欲"这样的理论. 这里作者犯的错误是稻草人谬误.

    机体组织缺少了碳水化合物时,生理功能会发生障碍。

    Again, 本着 rule of clarity 的原则, 我看不懂这里作者说的是什么. 没法评论. 作为科普文章, 不把话说清楚, 让人无法验证真伪, 很失望.

    当进行生酮饮食减肥,杜绝了绝大部分碳水化合物时,血糖水平会下降,容易出现头晕、眼前发黑、出冷汗、乏力等“低血糖反应”。低血糖情况严重时甚至会使脑细胞受损,造成不可逆的脑损伤。

    这些低血糖反应在这个网站里都有描述, 并且介绍了应对措施: https://www.dietdoctor.com/low-carb/side-effects 简单来说, 有可能是因为身体适应生酮饮食, 有一定的适应期; 另一种可能是缺乏盐分(低糖 -> 低胰岛素 -> 低盐分存留). 像我这种平时吃饭就不清淡的, 基本没有遇到什么不适.

    至于说脑细胞受损 / 脑损伤, 我还是想知道"为什么会这样". 作者在文章结尾列出了不少参考文献, 但并没有指出哪一个参考文献支持了这个观点. 我不是很想替作者去一个个文章翻阅(有些文章已经无法在网上浏览了)

    Again, 有需要葡萄糖的地方, 可以通过糖异生来满足需求.

    当我们抗拒碳水化合物的时候,由于食物种类单一,脂肪以外的一些营养物质,比如部分维生素、纤维素、矿物质等的摄入会大大降低

    少吃碳水化合物, 依然可以吃大部分蔬菜 / 少数低糖水果. 蔬菜里的维生素 / 纤维素 / 矿物质足够了.

    体内蓄积大量酮体的时候,身体还有可能陷入酮血症或酮尿症。此时血液有酸化现象,轻者会出现恶心、呕吐等症状,重者甚至会发生脱水与休克,危及生命。

    这里说的血液酸化危及生命的病症, 叫做酮酸中毒(Ketoacidosis). 如果是Ⅰ型糖尿病患者, 会因为无法分泌胰岛素, 无法抑制脂肪分解, 进入这种状态. 而健康人(包括Ⅱ型糖尿病患者), 只要分泌很少的胰岛素, 就可以避免进入酮酸中毒.

    至于说酮血症 / 酮尿症, 我目前能找到的描述, 都只是说酮体在血液 / 尿液里含量升高. 但都没说对会人体造成危害.


    最后我还是稍微花点时间, 仔细看看这篇文章引用的文献到底是怎么说的:

    • Anton SD, Hida A, Heekin K, Sowalsky K, Karabetian C, Mutchie H, Leeuwenburgh C, Manini TM, Barnett TE: Effects of Popular Diets without Specific Calorie Targets on Weight Loss Outcomes: Systematic Review of Findings from Clinical Trials. Nutrients 2017, 9(8).

    全文链接: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5579615/

    直接看 Conclusion: Atkins Diet (先严格生酮, 后稍微放宽糖分摄入)的短期与长期减肥证据明显, 其他饮食方案证据不太明显. 可以说是在支持以生酮饮食减肥.

    • Noakes T D, Windt J. Evidence that supports the prescription of low-carbohydrate high-fat diets: a narrative review.[J]. British Journal of Sports Medicine, 2017, 51(2):133.

    链接: https://bjsm.bmj.com/content/51/2/133.short 点页面右上角的 PDF 图标可以查看全文.

    直接看全文最后的 "How might it impact on clinical practice in the future?" (这对未来的临床实践有何影响) 一节:

    A growing understanding that obesity/hypertension/T2DM/nonalcoholic fatty liver disease/atherogenic dyslipidemia and the metabolic syndrome may all be substantially influenced by a single over-riding environmental factor—a high carbohydrate diet, acting on a single metabolic state, insulin resistance—will revolutionise the medical and dietary management of these conditions over the next decade. From our analysis, the LCHF eating plan should become the default medical management approach for all these conditions.

    为了降低各位读者的翻译压力, 减少可能的翻译错误, 我亲自给大家翻译:

    对于肥胖 / 高血压 / Ⅱ型糖尿病 / 非酒精引起的脂肪肝 / 血脂异常导致动脉粥样硬化这些疾病, 以及相应的代谢病症, 现在我们越发地认识到: 它们的决定性诱因可能都是同一个后天要素, 那就是: 高碳水化合物饮食, 使病人进入胰岛素抵抗这种同样的代谢状况. 这一认知, 将在下个十年, 对这些病症的医疗与饮食管理思路发生革命. 根据我们的研究分析, LCHF(低碳水化合物-高脂肪)饮食方案, 应该成为应对这些病症的默认医疗方案.

    也就是说, 这篇研究报告认为低糖饮食应该成为下个十年的革命性的实践. 而果壳的文章引用这篇文章来说明生酮饮食的危害和不确定性.

    到这里我已经不想再分析下去了. 因为果壳文章的作者似乎并没有花和我一样多的时间, 来认真看看至少其中一篇参考文献是否支持了他自己的观点. 我想各位读者也能做出自己的判断了吧.

    顺便, 最后那篇研究报告的第一作者 Tim Noakes, 在 YouTube 上可以搜到不少他的演讲 / 访谈, 宣传低糖饮食的好处. 好奇生酮饮食的同学不妨直接听听专家的意见, 而不是相信为了流量而拼凑文章的"科普媒体".

  • push image 没有那么慢. 因为我们用的私有 Docker Registry 和 CI / 生产环境服务器都在同一个内网网络(某公有云平台), 再加上合适的 Docker 分层缓存, 如果没有依赖更新, 每次 push 的量也就只有仓库里的几 MB 的代码量. 16 秒的时间已经包含 push 在内了.

    不过如果你真的要计量精确的部署时间, 还得把 GitLab CI Job 的运行前的延迟加上. Job 在触发运行之后, 会有几秒钟的时间停在"job 正在等待被某个 runner 认领执行"的状态.

    rollback 我们没有专门的方案. 如果需要部署到旧版本, 可以 SSH 到 Docker Swarm Manager 上手动执行 docker service rollback. 也可以直接在 GitLab 的界面上找一个旧版本, 再点一次部署. 因为应用服务器上的旧版本镜像还在, 不需要重新下载, 这样部署的时间会更短一些. 而且这样做, 不需要担心引入了回滚操作而制造更多的语义. 比如: 不用担心"回滚的回滚"应该是什么意义. 就不会造成误解 / 记错.

  • 我们用的 CI 工具是 GitLab 和它的 CI, 部署用的是 Docker Swarm.

    选用 GitLab CI 的想法是和 GitLab 紧密整合: 把最终部署的步骤写成一个 CI job, 在项目的 Pipeline 界面手动触发这个 job 就可以部署. 不用开发者学用一个新的软件界面.

    部署耗时: 目前我们放宽了 CI 的流程限制, 合并进主干的代码不用等测试跑通, 就会先构建 Docker Image. 构建好了之后就可以部署.

    • 构建 Docker Image 的过程是有 Docker 的分层缓存的. 最近一次构建的时间是 16 秒.
      • 一个可以更好地利用 Docker 分层缓存的技巧是: 在社区里搜了一下发现已经有人写好帖子了: https://ruby-china.org/topics/30078
      • 初次构建没有缓存, 还是会慢一些. 这可以通过从国内镜像安装依赖来解决.
    • 部署新版本: SSH 到一个 Docker Swarm Manager 节点, 在上面运行 docker service update. 因为要滚动更新, 还要下载镜像, 这个时间稍微长一点. 最近一次要 66 秒. 未来应该还有提升空间.
  • Windows XP / 2003 都是不被支持的 OS 了, 不再收到安全补丁更新, 新软件支持越来越少. 有什么理由一定要用么.

    如果可以不用, 还是推荐升级到 Windows 10.

  • 看到有不少回复说运动减肥的事. Well, 生酮饮食和运动并不冲突. 可以两者并行的.

    而且再回到主贴的"需求分析"一节: 我想要用节省时间的, 执行简单的办法. 运动这件事对我来说, 既没有这方面的爱好, 又太花时间. 所以我没有选择运动.

  • 我微信只在工作时才用. 平时基本不用. 实在想要私聊, 给我发 Email 吧. 地址在论坛的个人资料里有. 或者如果你用 IRC 的话, 我会在 Freenode 的 ##devcn 频道常驻.

    话说回来, 如果你真的想要开始尝试这种饮食, 我没法给出负责任的意见. 最好还是自己去研究.

  • 是的,会低血糖。但低血糖这件事本身不是问题。

    如果你在担心低血糖等于身体缺少能量来源,会导致头晕,无力等症状,这会在身体转用脂肪供能之后自然适应。适应期可能有长有短。

    但生酮饮食由于低糖 -> 胰岛素分泌降低 -> 身体存留的盐分减少,可能会由这个原因导致头晕 / 无力 / 等一系列副作用。这个页面有集中介绍生酮饮食的各种副作用:https://www.dietdoctor.com/low-carb/side-effects 其中大多数副作用的原因都是缺少盐分和水分。这样意味着重盐的饮食习惯对生酮饮食是有帮助的(是的,生酮饮食可以多油多盐,照样减肥)。

    如果你需要运动,担心身体缺少糖元储备而影响运动能力,这方面我完全没有去调查过。但如果我现在要开始考虑这个问题,会从 /r/ketogains 的 wiki 开始看起:https://www.reddit.com/r/ketogains/wiki/index