• 请教接口设计规范问题 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

  • 简单来说,是的。

    具体来说,还要避免一些制作过程加入的淀粉:比如油炸 / 丸子食品都要用淀粉。

    但生酮饮食是个量变而非质变的事儿,不用担心“吃了两个带皮的饺子就要用 N 天严格无糖饮食补回来”。只要尽量降低糖分摄入就好。

  • 因为西红柿含糖量低。

    这个饮食背后的理论与传统的食物分类无关,只看糖分多少。含糖低的水果也可以吃。

    再就糖分的影响更多的是量变而非质变。所以稍微多吃了一点也没事。

  • 是的。能自己做饭那么确实会容易很多。但我自己是不会做饭的。

    我不清楚你所说的“真正的 Keto”是怎样的标准。但 /r/keto 的 FAQ 里也说了:可以放宽到每天 100g 糖分摄入,只不过减脂的速度会慢一些。所以在外吃饭吃到调味加的糖,也还可以接受。我打算等到自己体重降到理想水平时,就把糖分摄入提高到这个水平,用来吃水果,偶尔吃甜食。

    至于吃肉比较昂贵的问题,我的体验是开始 Keto 之后食欲会下降,可以每天减少一份正餐,能挽回一点吃饭成本。

  • 关于使用 Postgres 的疑问 at 2019年01月21日

    猜测 PostgreSQL 的流行程度增长,和 Heroku 有很大的关系。

    如果没记错的话,Heroku 是第一个把部署简单的 PaaS 做大做好的公司。而这个平台最先支持的编程语言是 Ruby,最先提供的数据库服务就是 PostgreSQL。

  • 我记得bash 有一种技巧可以记住程序的路径

    有的,看这里:http://mywiki.wooledge.org/BashFAQ/081

    你的问题的原因应该是:因为 alias irb=pry,那么当 irb 是 bash 命令的第一个 word 时,这个 alias 就会生效,运行起来的是 pry。而运行 env irb这个命令时,alias 可能是不生效的。

  • 关于 and 关键字 at 2018年11月16日

    官方文档大概都会有解释。

    用 Google 搜 ruby language keyword 搜出来的第一个结果刚好是官方文档的 keywords 页面,点进去可以找到 and

  • Linux、Ruby 不冷没天理! at 2018年01月30日

    何以见得?

  • 假如还不能开始使用容器化方案(如 Docker)的话,至少也考虑用配置管理(如 Ansible)。而且还能搜到现成的方案:https://github.com/j-mcnally/ansible-rails

  • 与问题是否简单无关。因为,呃,如果你读过了我给出的链接所指向的那一段你就知道原因了。我这边就不再复制粘贴。

  • 既然你 @ 的人里不包括我,那么看来我也没有资格回答这个问题了。

    再者,这个问题看上去就像是家庭作业

  • 一个建议:不要使用粗体。

    愿意认真给你答案的人,肯定也愿意认真阅读你的问题。加粗所传达出的信息是“我知道你们都不会认真阅读,所以只读我加粗的重点就好了”。相关吐槽:https://programnt.github.io/design/2017/10/24/bold-bold-bold.html

    回到主题,遇到这种问题我的解决方法是:

    • 如果在构建过程能生成配置文件(比如 configs 目录下的文件),或者配置文件都是提交进仓库的,无视它。反正也就是项目根目录里多一个文件而已。
    • 自己 fork 过来重写。反正 libs 文件夹里一共俩文件,加一块儿也就 50 来行。自己维护也没什么大不了的。
    • 因为这个库检测/加载 qq_secrets.yml 秘密文件用的是 File.exist?YAML.load_file,而 f 变量的值是个相对路径。也就是说这个库寻找秘密文件的逻辑是依赖于当前工作目录的(这个行为本身就不靠谱),而不是项目根目录。那么你可以在加载这个库时临时切换当前工作目录。虽然算不上是利用了高级语言特性的元编程,不过至少做到了不改动第三方代码就能让它的行为满足你的期望。
  • Emacs 闲谈 (二) 自如的分屏 at 2017年11月12日

    多年 Vim 用户,现在在用 Neovim。

    曾经有一次想切换到 Emacs + Evil 玩玩,结果发现太多的功能 / 插件都需要找到对应的实现,并且从头学习快捷键,旧习惯太难改,果断放弃了。现在还依然模糊地记得 Emacs 的很多快捷键的助记性(Mnemonic)太差,实在记不住。不过年头太久了,这个模糊的记忆也许不太可靠。

    现在又过了这么些年,估计转换难度已经低了些,也许有时间会试试 Spacemacs 吧。

  • Ruby 的面向对象编程 at 2017年11月10日

    帖子的分类是新手问题,那么问题在哪里呢?还是说只是意外地选错了分类?

  • 要买技术书籍的话,很多出版商都是自己开网店直接卖电子版的:Apress,No Starch Press,PACKT,Manning。你提到的图灵和 The Pragmatic Bookshelf 都属于这一类。

    OReilly 虽然是一家挺大的出版商,但他们好像在主推按月付费的 Safari Books 服务,不再单独售卖 DRM-free 的电子版了。正在无耻地读盗版。

    再就是 Humble Bundle 上总是有打包便宜卖的电子书,但不一定是技术书。

  • 这个行为能在 5.1 版(严格来说是 5.0 就希望引入,但由于 bug 被推迟到 5.1)被引入,就给我感觉 NPM 的开发团队有点不太靠谱。

    应用的依赖管理这件事,有 Bundler 先行推广的 Gemfile{,.lock} 模式,其他包管理器如 Pipenv、Cargo 等也都跟着效仿,而且几乎见不到有人对这个设计提出有效的反对,那么看上去这个设计就足够好,NPM 这边只要效仿着做就可以了。毕竟不是去挑战什么未知领域的高端问题。

    结果嘞,#16866 里面这么一吵,也不见 NPM 项目维护者拿出自己的观点来讨论讨论,也不考虑回应一下评论里提到的 npm update 行为不符合预期的问题,就直接在 #17058 给“fix”了,甚至在 code review 过程里也没人质疑,估计是私下讨论达成一致意见了吧。

    反正我是先去用 Yarn 算了。