# README

Information filtering service

### 立意

我们每天都会接收到过载的信息，然而明月与砾同囊，其中的优质信息往往会被淹没。因此需要一个信息过滤服务来提升接收的信息质量。

\[思考的价值] 由此而来，分享内容的不限，偏向于 计算机技术 与 科技人文的方向。

### 输出

站点的内容 皆来自于 思考的价值 微信群，它记录了 自从建群以来 每天有价值的信息。

从 22.11 月之后，站点输出的形式固定为周刊，周刊 newsletter 服务：<https://simon.zhubai.love/>。

站点导航:

* [具体的分享领域](https://thinking.tomotoes.com/tags)
* [讨论过的事物](https://thinking.tomotoes.com/tags/talk)
* [某一周分享的汇总](https://thinking.tomotoes.com/archives/2020/12/25-31)
* [分享汇总](https://thinking.tomotoes.com/archives)

如果你对内容很感兴趣，随时欢迎加群一起交流。

### 须知

在加群之前请先仔细阅读以下条目：

1. 讨论、发帖时 禁止涉及广告、色情与时政敏感话题。
2. 希望大家一起做有价值的输出，共同提升进步。
3. 站点内会 mark 群里一些有价值的讨论。但请放心，发表讨论时为匿名状态（以固定字母代称），不会涉及个人隐私。

### 入口

添加我的微信，邀你进群，微信号：simonaking

<figure><img src="/files/0CP2hYAE7cWaCLdxVq71" alt=""><figcaption></figcaption></figure>


# Archives

汇总


# 2022


# 5-10

简单说下这些日子的停更原因吧，4 月份之后一直在沉浸工作，这一沉浸就是数月，期间确实没有太多精力时间 去学习 & 分享。

后续的话 虽然有一些时间，但很少有大片的时间，闲杂时间也会做些其他的事情，阅读过的文章，都是放到 pocket 后就不了了之了，没有进一步提炼思考的分享冲动，断更期间 学习能动性一直在下降。

思考的价值 的历史分享 已存档，近期准备重启。

这期间 分享的方式一直在探索中，看了 discord、飞书群、telegram、twitter space，最终的选择是 飞书话题群，随之而来的两个问题，我回答下。

为什么弃用微信？

线性的信息呈现形式 其实不利于学习 & 分享的形态，如果存在 >= 2条 话题线，基本上是比较乱的。

为什么使用飞书？

1. 个人使用方便，办公软件是飞书，可光明正大摸鱼（不是
2. 话题群功能强大 <https://www.feishu.cn/hc/zh-CN/articles/360049067735>
3. 国内应用 无需 梯子
4. 聊天记录不会丢失
5. 结构化的信息呈现方式

此次迁移，对不方便的同学很抱歉。\
\
除此之外，分享的形态可能不会像之前那么重，我可能会分享下链接，后续有时间（一周内）再补充一些说明信息。 \
\
并且 我会启动周刊的形式，每周会收集日常的分享，类似于阮一峰老师的科技周刊的形态。&#x20;

该内容 短期会在 思考的价值站点上进行更新，未来会演变为 newsletter + 多平台的形式，类似于湾区日报。

感觉大家一直以来的陪伴，该群的旅程先到此为止了。

同时也欢迎大家加入飞书群，有什么意见可随时向我提出。


# 4

1. 分享个有趣的服务：

   Bionic Reading

   <https://bionic-reading.com/>

   有个常见的结论：人脑的信息处理速度远大于人眼解析信息的速度，换句话说 不管脑子转 多快，处理信息总是需要先看到的，所以毫无疑问 处理信息的速度受限于人眼。 这好比于 人眼是外部 IO ，人脑是 CPU，对于 IO 密集型场景(如读书)，想要以最快时间 阅读完整本书，是存在一个基础值的。

   而该服务就是根据该结论，通过自动标记单词前缀的方式，让用户可以快速获取到重点信息，这也很像 脑图与列表 之间的关系，让信息呈现更具结构化，从而提效信息处理速度。

   很明显该服务与信息所用的语言高度依赖的，英语可以通过列举单词重点前缀的方式，来吐出重点，简单来看这是可以枚举的。而如果是中文，因为中文是由汉字组成的，所以想要自动标记重点是需要深入理解信息上下文语义的，这是需要 NLP 辅助的。
2. 项目分享：

   react-worker-components

   React Worker Components simplify using Web Workers

   <https://github.com/dai-shi/react-worker-components>

   该项目提供 WebWorker 中渲染 React 组件的能力，思路类似于之前分享 partytown。

   关键的思路在于 如何在其他 Worker 中渲染组件、传递 Props，查阅源码发现 实际组件渲染的步骤还是在主线程中执行的，Worker 充当了组件序列化的角色，Worker 与 Master 之间遵守相同的通信规范，感兴趣的同学可以看下源码，整体短小精悍。

   项目中有一处较为亮眼的设计，组件序列化时会占据内存，作者使用 WeakRef 作为数据结构，还补充了 主动的简易 GC 机制。
3. ![image-20221101190651474](/files/9y4z2OfZ6wPJmXKreuvY)\
   Kotlin 函数的语法形式 可以轻易表达出其他域的语义。
4. 快餐文分享：

   Strongly Typed JSON in TypeScript

   <https://dev.to/nickytonline/strongly-typed-json-in-typescript-5gb2>

   文章介绍了一种小技巧，通过 配置 tsconfig.json 来实现 编程时的 json 对象的类型定义。

   现在的开发方式，我认为从前往后 可大致分为三个阶段：

   1. Coding Runtime，编辑器会使用 Tree-sitter、其他 parser 解析开发中的代码，给开发者提供一些代码智能提示、语义分析等能力。
   2. Compile Runtime，大多数的语言会有源码编译的环节，该环节中强类型的语言会涉及到语法检验、性能优化等步骤，最后生产目标指令。
   3. Client Runtime，即 终端 Runtime 距离用户最近的环节，该环节中的语言行为会直接关联应用逻辑、用户体验等。

   其中前两个环节在业务场景中权重不高，多为建立规范、资源收口行为。

   文中提到的技巧就是在 Coding Runtime 中增强开发时的类型感知，但如果 JSON 过大的话，无疑会造成编辑器的性能开销 从而带来机器卡顿，所以针对大的数据 还是建议使用某些 Type Generator 去生成类型。
5. 每日一句分享：

   汽车是一种快速折旧的昂贵资产，生命周期的绝大部分时间都无所事事地停在车库。大都市地区必须拿出大量土地，当作停车场，才能放置所有的闲置车辆。 我们越早实现无人驾驶和大规模的按需运输，就能越早摆脱这种巨大的浪费。

   来自阮一峰老师的 201 期科技周刊。

   <https://www.ruanyifeng.com/blog/2022/04/weekly-issue-201.html>
6. 惊讶系列分享：

   I built a receipt printer for GitHub issues

   <https://aschmelyun.com/blog/i-built-a-receipt-printer-for-github-issues/>

   一个很有脑洞、很可爱的项目，作者为 Github 项目的 issue 创建了一个打印服务，每当有新的 issue 时，打印机都会自动打印出一张表单，非常有仪式感。

   文章具体介绍了该打印服务中的技术细节，简单总结是 issue 发布时，github 的 webhook 调用反向代理的 树莓派服务，树莓派服务连接打印硬件端口，并使用其提供的 Library 进行数据打印。

   如果把信息源从 项目 issue 换成 报警消息、邮件通知，也很适用，交互方式的创新往往能带给人们很多的想象空间。
7. 惊讶系列分享：

   Google Maps Hacks

   <https://www.simonweckert.com/googlemapshacks.html>

   如何使用 99 部手机 hack Google Maps 的交通状态，很粗暴，同时也很有效。
8. 快餐文分享：

   Writing a document database from scratch in Go: Lucene-like filters and indexes

   <https://notes.eatonphil.com/documentdb.html>

   一篇很有学习价值的文章。

   作者以 Lucene 语法为例，通过 500 行左右代码介绍了 文本搜索引擎的核心工作原理。

   文章主要介绍了两点：1. 搜索语法的 parser 实现（基本的词法分析）；2. 数据存储服务的优化（索引优化，增加其他维度获取数据的方式，以空间换时间），感兴趣的同学建议刷下。

   Lucene 作为搜索引擎的老大哥，Elasticsearch、Solr 都是基于此作为核心服务开发的。

   文中梳理的 Lucene 的简易查找能力很类似于 GraphQL，不过 GraphQL 只重于通讯规范，后端实现不关心。
9. 每日一句分享：

   'So much complexity in software comes from trying to make one thing do two things.' -- Ryan Singer
10. 快餐文分享：

    From Static to Interactive: Why Resumability is the Best Alternative to Hydration

    <https://builder.io/blog/from-static-to-interactive-why-resumability-is-the-best-alternative-to-hydration>

    一篇介绍 Web Hydration 渲染现状的文章（忽视尾部推广）。

    作者先是讲解了 Hydration 对页面性能产生的正向收益，通俗来讲，页面提前在其他 Runtime 上进行渲染，当页面真正展现时 取其他 Runtime 渲染的中间态 并加以恢复交互的逻辑（如事件绑定），以达到页面支出的效果。

    但这种渲染方式虽然提高了 FCP，但页面的交互 TTI 并没有提高，原因在于交互的逻辑很难做到序列化，需要从 0 执行，延伸来说 不同 Runtime 之间的差异是无法抹平的，这也是为什么大多数高性能框架 需要同构的原因。
11. 快餐文分享：

    Those HTML Attributes You Never Use

    <https://www.smashingmagazine.com/2022/03/html-attributes-you-never-use>

    一篇关于一些鲜为人知 HTML 特性的介绍文章。

    总结自认为有用的特性：

    1. input 的 enterkeyhint 属性，可更改 enter 键提示文本
    2. img 的 decode 属性，可更改图片解码的执行方式
    3. iframe 的 loading 属性，类型与 img 的用法 可懒加载资源
    4. preload 当前窗口 所适用图片的属性
12. 快餐文分享：

    Pre-allocated lists in Python

    <https://rednafi.github.io/reflections/pre-allocated-lists-in-python.html>

    一篇关于编程时提效技巧的文章。

    文章介绍了一个简单的事实，以 Python 为例 预分配内存的计算比正常的计算会快出近 1us(微秒)。

    其实这种编程技巧一直都存在，提效的原理也很明显，固定长度且申请一次内存的速度 要优于 长度不定且申请多次内存的速度。 前者的优势在于 申请的都是连续的内存区域，可以获得最佳的高速缓存一致性，但缺点也很明显 需要依赖 程序的数据特性，并有可能会造成内存浪费。 我见过业界中常见的技巧是 申请较小的固定连续内存，然后反复使用，可见之前的分享。

    终于找到了，记错了 之前只是学习过 但没有分享过。

    Dissecting the Disruptor: Why it's so fast (part two) - Magic cache line padding

    <https://trishagee.com/2011/07/22/dissecting_the_disruptor_why_its_so_fast_part_two__magic_cache_line_padding/>

    中文翻译：<https://www.cnblogs.com/geason/p/5774048.html>

    具体信息可见文中提到的 缓存行填充 与 伪共享情况。
13. 惊讶系列分享：

    Expanding Single Page Apps into multiple Browser Windows

    <https://medium.com/swlh/expanding-single-page-apps-into-multiple-browser-windows-e6d9bd155d59>

    一篇关于 Web 页面渲染方式变革的文章。

    作者介绍了充分使用多核 Worker 去渲染 Web 页面的案例，各个 Worker 根据场景职责各司其职，Master 尽可能闲置 以满足交互体验，在我看来 这或许是下一代 复杂场景下的 Web 渲染框架。

    首先明确场景，这种 Worker 渲染框架很适用于复杂的 Web 场景（重特效、重计算），如前不久 阿 B 发生的用户体验事情，在用户终端执行视频解码。简单场景其实是用不到的，单线程足够了..

    其次分析难点，抛开浏览器兼容性问题不谈，多 worker 的开发场景重于 数据同步、线程开销。数据同步解决成本与数据本身正向相关，如果是简单数据，序列化一把梭即可，如果是复杂数据如 React.FC，就需要仔细设计了。线程开销问题 很多前端框架已经解决了，可引入 vdom 将多次通信 批量化。

    最后简单聊下看法，主观感觉多 Worker 框架前期还是会解决一些解耦比较明确的场景，如 文章的 Data Worker。如果框架侵入性很强（不只是数据通信还有组件生产）想象空间会很大，实现多 Worker 渲染的场景也不是没有可能。

    补充一下项目地址： <https://github.com/neomjs/neo>
14. 项目分享：

    <https://github.com/Aslemammad/venode>

    The missing child of Node.js and Deno.

    一个有趣的项目，如何最小成本实现 deno 中无 package.json 特性。 项目整体比较简单，具体来说是使用 vite 来做到 node 环境中包下载，感兴趣的同学可以看下。
15. 快餐文分享：

    The Next Google

    <https://dkb.io/post/the-next-google>

    一篇探索搜索引擎产品形态的文章。

    文中梳理了多种搜索引擎，并分别介绍了各自主打的特性。

    下面我介绍两个 比较 cool 的产品：

    1. Kagi(<https://kagi.com/>) - 一款完全定制化的搜索引擎，可以自定义搜索结果、UI 交互、网站过滤等。 该产品的 Slogan 是打造不一致的搜索结果，乍一看与今日头条分用户推荐很相似，但问题在于它并不会根据用户行为去做分析，而是完全依赖用户对搜索结果的配置，这无疑存在问题的，需要用户有很强的信息管理能力，导致用户成本过高。 而其他定制化的地方，一两个油猴脚本就能搞定。
    2. Neeva(<https://neeva.com/>) - 一款能搜索多种信息的搜索引擎，可以搜索 其他应用内的信息。 毫不疑问，该搜索引擎的愿景虽然很美丽，但几乎无法实现，需要不同产品的密切配合。于国内 现在 Web 2.0 已经发展为信息孤岛的形式，各个互联网产品之间建立了很强的护城河，禁止信息流通 自建生态、为用户构建信息茧房。这种产品没有相关部门的强大背书是做不到的。 而其他特性 Chrome 上都有相应插件可做到。

    搜索引擎的本质是获取信息，现代很多人已经习惯了被信息推荐... 丧失了主动权..

    我觉得下一个 Google 是很难出现了，不过垂类场景的发展空间 毫无疑问是存在的。
16. 每日一句分享：

    Browsers should ship with the top 1GB of npm built-in, with the option to download the rest on-demand.
17. 好文分享：

    教育对人的改变有多大？

    <https://xiaohanyu.me/posts/2017-02-13-about-education/>

    文章摘要：

    一个人所能达到的高度是由四个方面决定的：家境、 天赋、机遇和个人努力，四者缺一不可 。家境是个人发展的起步，是出发点，是个人成就的下限；个人努力是发动机；天赋代表着发动机的好坏，是加速度；机遇不同就是高速路、 柏油路、山路和山中小路的区别。

    文章主题虽然是教育，但主人公的成功其实是在于他自身的努力 以及 对未来的勇气。
18. 好文分享：

    开发者体验总览

    <https://dx.phodal.com/>

    在产品设计、需求研发中，开发者体验经常是被忽视的一环，很多基建、平台不重视。究其原因，大部分面向开发者的工具 产品设计薄弱、腐烂速度快，并且相关的优化措施也很难量化收益。

    最近了解到 黄峰达老师在出一本关于开发者体验的书，主题覆盖了开发者体验、技术产品运营等主题，感兴趣的同学建议了解下。
19. Hi 各位晚上好，最近群里一直没有分享信息，因为我潜移默化中换了一种处理信息方式。

    之前每次接受信息都会及时输出，虽然会加强思考，但如此一来 输入的密度会随花费时间降低。 并且随着这种习惯不断的重复加深，导致我获取信息的方式也出现了问题，做明显的是 我会不知不觉 倾向阅读自己擅长领域的文章，只是为了更方便的输出。

    所以最近 我做了个试验，不输出只输入。 在此期间 给我最大感受是，阅读量比之前增加了好多倍，待消费文章个数 直线上升。 是的，没有输出了，也无需深入思考，大部分情况下只是获取信息的快感与贪婪。

    这种方式好吗？不好。 输入的信息并没有融入自己的知识库，过两三天就会遗忘，所以最近准备采取 定期分享的方式，具体来说如下。

    1. 输入还是单纯的输入，正向的信息会加入到待消费列表，该过程如上，无需深入思考，输入效率是最高优化级。
    2. 定期输出，如每双休，会重新消费之前阅读的文章，深入思考，尽可能 输出一套相关的知识体系。

    另：不会看重输出的数量，这不是目的。

    ps：getpocket 作为链接管理服务，还挺好用的。


# 3

1. 每日一句分享：

   Objects are data with functions. Closures are functions with data.
2. 快餐文分享：

   Solid.js feels like what I always wanted React to be

   <https://typeofnan.dev/solid-js-feels-like-what-i-always-wanted-react-to-be/>

   一篇介绍 Solid.js 的软文。

   作者直击 React 开发时的复杂度：React 并不是 Reactive 的，Runtime 的概念会让 代码不好维护、造成性能影响，说的都非常有道理。后面引出了 Solid.js，一个真正形式上的 Reactive 框架，没有 runtime，没有显示标记依赖等。
3. 快餐文分享：

   Early peek at C# 11 features

   <https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/>

   宇宙第一甜的语言 C# 近期发布了 11 版本，文章梳理了其中的一些语法特性。

   1. 字符串内计算能力增强
   2. 列表模式匹配，不但支持数据还支持切片，看起来非常的甜
   3. 非空参数断言，感觉不如设置关键词来代替，符号太多 阅读代码时会解析困难。
4. 分享一个有学习价值的库，可以快速用来熟悉语言。

   A Lodash-style Go library based on Go 1.18+ Generics

   <https://github.com/samber/lo>

   再补充另一个 质量很高的 sdk 扩展

   <https://github.com/bradenaw/juniper>
5. 快餐文分享：

   It's always been you, Canvas2D

   <https://developer.chrome.com/blog/canvas2d/>

   文章从多个方面介绍了 Canvas 的新特性与现有能力，其中值得一提的是 文字绘制能力基本追平了 CSS.
6. 每日一句分析：

   要么是用户控制程序，要么是程序控制用户。
7. 好文分享：

   Why Static Languages Suffer From Complexity

   <https://hirrolot.github.io/posts/why-static-languages-suffer-from-complexity>

   一篇介绍 设计静态语言时复杂度不可控的论述文。

   文章篇幅比较长，章节较多，整体一直是围绕着 静态语言的不足展开。静态语言中最重要的就是类型系统，类型系统虽然可以让语言表现的更有张力，为程序赋予了编译时的检查能力，但如果过度重视会语言的不完整性，造成了运行时的二义性。作者引用了很多例子说明这一点，就不展开了。

   程序的复杂度除了来源于问题的本身领域，更多由 追求完整性的表现造成的，摘录：

   Combining statics and dynamics in a single working solution is also complicated since you cannot invoke dynamics in a static context.

   Programming languages ought to be rethought.
8. 项目分享：

   <https://github.com/neurocollective/go_chainable>

   With generics, allowing chainable .Map(func(...)).Reduce(func(...)) syntax in go

   一个实现通用方法 链式调用的库。

   库源码很简单，定义了两个接收泛型的复合类型 wrapper，实现都是样板代码。仔细读下来 库中存在明显的问题，链式方法不支持类型转换，这其实反映了语言类型系统的缺失。
9. 每日一句分享：

   战争之后，所有的相机都到别的战场去了。
10. 快餐文分享：

    巨亏 55 亿，你的「三连」救不了 B 站

    <https://mp.weixin.qq.com/s/oYx2Y_85hmhGvolzhOwyBQ>

    一篇围绕 B站 21年报 对内容消费产品商业模式的分析文章。

    从文中可以看出，B 站目前的窘态，对于内容消费的产品来说，营收是产品商业模式重要的外在表现，它与用户增长其实是相辅相承的，用户增长带来流量，不可避免的会带来营收，而营收也会反哺这个闭环，从而做更多的用户增长。

    为什么 B 站月日活 4 亿，存在一定流量还是亏损呢？我猜测原因有二，一是产品变现出了问题二是用户价值不高。

    文中对于 B 站变现的动作说了很多，总结来说是 没有投入正确的方向。用户价值不高指的是用户与变现的动作不 match，就比如我看 B 站经常刷到一些乱七八糟的作者商单，自然没有消费心理，而这些商单理应是根据用户画像准确推送的。
11. 快餐文分享：

    Introduction to GPUs with OpenGL

    <https://engineering.monstar-lab.com/en/post/2022/03/01/Introduction-To-GPUs-With-OpenGL/>

    一篇介绍 OpenGL 与 GLSL 基础概念的文章。

    文中用一个画矩形的过程，引出了 OpenGL 中相关概念，其中涉及了很多 GLSL 上的对 drawing 的建模思想，整体而言很偏领域性。
12. 每日一句分享：

    These walls are funny.First you hate them,then you get used to them;Enough time passes,gets so you depend on them.That’s institutionalized.
13. 好文分享：

    低代码平台边界探索：多技术栈支持及高低代码混合开发

    <https://mp.weixin.qq.com/s/5h2K8ektFD1ZNilCxrRbXA>

    一篇从多个维度介绍 Low Code 平台的好文。

    文章虽然面向的是华为内部场景，但有很多思想都是搭建领域的通用方案，这种文章可以帮助我们很快建立起特定领域的思维框架。

    我下面随文章脉络，简单梳理下各个部分。

    1. 文章开始引出低代码的定义，指出其缺点，这里是有所偏失的，引用自 Gartner 的定义：“...以牺牲跨平台的可移植性、应用开放性为代价来提高生产效率。”。我并不认同 Gartner 的第一点定义，对于 Low Code 的本质来说，跨平台的差异其实在于物料层，并不在于搭建本身，搭建可以由专门的领域去承载 如 Web，不同平台的物料可以提供 Web 化的形态，所以 Low Code 与跨平台不是同一维度；而第二点作者的解读，我也不认可，作者在文中指的应用开放性是 应用级别的，而应用级别是更加广泛的开放，其实 Gartner 这里指的是物料开放，显然 Low Code 中使用的物料存在或多或少的约束，但我们可以借助中间层 或者 规范收口层 让其物料产物可对接更多的场景。
    2. 文中探讨了一个我非常有同感的话题，Low Code 与 20 年前流行的 Delphi、WinForm 有什么差异，作者说的三个 LowCode 意义价值中，个人认为只有第一个站得住脚，Low Code 面向非研发人员，那么问题延伸到 非研发人员为什么要搭建应用呢？因为一直存在的数字化转型的场景；而至于作者提到的另外两个价值，其实算是 Low Code 领域下出现的新问题..
    3. 文章提到了 Low Code 解决方案，该方案比较常见了，(这里作者使用“区块”封装了 组件的概念，自建名词)，其实这里也算是 LowCode 的价值之一，降本增效。
    4. 作者从技术视角提到了如何在不同前端技术栈中复用组件，作者给出了 web-components 的方案，这里推荐感兴趣的同学了解 微前端，Low Code 领域 与 微前端领域 所面临的问题存在明显的交集，如 技术栈打通、沙盒运行，可执行文件加载运行等。
    5. 文章提到了 Low Code 中非常值得讨论的一个话题，搭建后的产物是如何生成的？常见的有两种方式：运行时渲染、生成源码。作者分别梳理了这两种方式的优劣势，不过整体比较发散，简单来说 运行时渲染的方式 利于平台的扩展性、用户预览的体验，生成源码的方式利于 产物的性能、二次开放的场景。
    6. 关于平台的架构设计，可以看出由上往下 扩展得大而全，有很多抽象的二次封装大一统，算是大厂基建的通病了，不管用户使用体验如何，具体问题是否解决，先把事情搞大..
14. CJS 如何在代码层面快速迁移到 ESM&#x20;

    ![image-20220401192336417](/files/Nvu9s6bTxHdrfNXaPLhS)
15. 快餐文分享：

    Inspecting Web Views in macOS

    <https://blog.jim-nielsen.com/2022/inspecting-web-views-in-macos/>

    事实证明 因为天然的动态性与强大的跨平台能力，Hybrid 形态的应用无处不在。

    作者在打开 Webview 调试开关后发现，iCloud Native 应用有很多页面已被 Web 技术栈渗透。
16. 最新 TC39 提案:

    ECMAScript proposal: Types as Comments

    <https://github.com/giltayar/proposal-types-as-comments>

    背景：减少 TypeScript 侵入性，摆脱二次编译，使用注释方式声明类型信息。 提案中的类型标注 严格属于 TypeScript 中的子集，只是移除了部分非 JavaScript 标准的语法。

    提案中的愿景在我看来并不适用于 C 端，就像软件与硬件的发展，高速发展与稳定迭代之间是一直存在 Gap 的，必然会使用某些技术手段抹平，并且方案中提到 类型标注是在 运行时移除，这对文件体积是会有不利影响的。

    方案最后有很多 QA，其中涉及了 TC39 与 TypeScript 之间的发展关系、类型系统未来的演变方向等。
17. 分享一个小巧 REST Client 请求库：

    <https://github.com/johannschopplich/uncreate>

    源码很精炼，只有 60 行代码。主要工作是 通过 Proxy 实现声明式的路径请求，如： `await api.users(userId).get<UserResponse>();`
18. 快餐文分享：

    H.264 is Magic

    <https://sidbala.com/h-264-is-magic/>

    文章介绍了 H 264 编码中压缩的主要思路。

    分为三个措施：信息熵量化、色彩信息精简、运动补偿机制。 前两个措施是 空间维度上的优化，运动补偿是时间维度上的优化，我简单介绍下这三个措施：

    信息熵量化：是将一帧的数据转换为某种分布规律的数据形式，这个过程属于无损的编码转换，而转换之后的数据可以进一步地做信息密度的量化，从而压缩一帧的图片体积。文章抛硬币的例子很通俗异同，在现实生活中无损编码的例子也比比皆是，如进制的转换。

    色彩信息精简：指的是优化掉人眼无需要的色彩信息。

    运动补偿机制：算是比较经典的视频压缩算法，通俗来说是根据之前帧与当前帧的块级信息的位置差异，来弥补当前帧，从而去掉序列冗余。

    与之前提到的流媒体 VP9 算法，动态补偿机制应该是同一原理。
19. 快餐文分享：

    Browser In The Browser (BITB) Attack

    <https://mrd0x.com/browser-in-the-browser-phishing-attack/> <https://github.com/mrd0x/BITB>

    一个脑洞很大的攻击方式。

    使用前端技术栈模拟 弹窗登录，这种方式类似于常见的钓鱼网站，不过 mock 的目标变成了组件，这种方式不仅成本低，并且用户容易忽视。
20. 快餐文分享：

    理解 Language Server Protocol 的工作原理

    <https://juejin.cn/post/7051453384645148680>

    一篇介绍 LSP 基本概念的文章。

    LSP 重点在于其架构设计，通过引入规范协议将编辑器中的语言服务抽离出来，隔离了具体语言框架与编辑器，算是一个很典型的沙漏模型案例。
21. 快餐文分享：

    Delightful React File/Directory Structure

    <https://www.joshwcomeau.com/react/file-structure/>

    一篇关于前端项目中 工程结构最佳实践的文章。

    文章针对不同内容场景 输出了一些观点，个人感觉很收益，简单总结下：

    1. 不要存在过多的 index 文件，index 文件应只用于管理 export，实际的逻辑由同名文件承载。该实践最大的好处是 可以加速检索文件的时间。
    2. helpers 不等于 utils，前者应与项目场景相关，后者是通用的逻辑。
    3. 维护 constants 文件，这里我展开一下，如果项目中常量定义过多，建议使用 文件(\*\*.const.js) 或者 复合结构(更推荐) 区分。
    4. 推荐根据文件的定位 而不是 具体逻辑 分类。
22. 项目分享：

    sysend.js - <https://github.com/jcubic/sysend.js>

    一个具有学习价值的库，通过 localStorage / BroadcastChannel 实现跨 tab 之间的同域通信。

    虽然项目文件很精简，但整体完整性很高，感兴趣的同学可以看下。
23. 快餐文分享：

    Dependency Injection in Node.js

    <https://blog.risingstack.com/dependency-injection-in-node-js/>

    一篇介绍依赖注入基础概念的文章。

    曾几何时，我非常讨厌依赖注入、设计模式这些“故弄玄虚”的概念，认为其只是常见的编程技巧，没有造词的必要。

    但最近有了一些更深的理解，在开发中，经常会对所在域的不同实体进行抽象建模，而不同实体之间 因为责任范围或多或少的存在逻辑交集，逻辑子集，想要垮范围使用其他实体能力，必然涉及到模型之间的组合，这是依赖注入的意义之一，这一点很像函数式中的组合子，将不同的逻辑融合来增强函数。

    依赖注入的另外意义是 管控 实体的输入，这一点很像函数式的偏函数，隔离了不同依赖的出现时机。

    所以综合来看，依赖注入、设计模式在特定的场景下是可以解决问题的。这些模式在我看来更像是某些编程技巧、函数式理论 在 OOP 这个域上的延伸。

    关于 IOC 最佳实践，推荐一个功能全面的库：

    <https://github.com/jeffijoe/awilix>
24. ![image-20220401192439333](/files/gZIyt4RJXcUkP8cKXDjO)

    CSS properties and their initial step in the pixel pipeline

    图片来源： <https://www.freecodecamp.org/news/web-animation-performance-fundamentals/>
25. 快餐文分享：

    Give me a browser, I’ll give you a Shell

    <https://systemweakness.com/give-me-a-browser-ill-give-you-a-shell-de19811defa0>

    如何通过浏览器获取当前环境的 shell，一段有趣的实践。
26. 分享一个检测网页产生碳排放的工具：

    Are my third parties green?

    <https://aremythirdpartiesgreen.com>

    以下内容摘要自工具：

    It's estimated that global information and communication technology (ICT) accounts for around 4% of global CO2 emissions. That is about equivalent to Germany's national emissions (the world's 7th largest polluter), and is more polluting than the civil aviation sector.
27. 每日一句分享：

    A broken watch gives the time correctly twice a day – Unknown
28. 快餐文分享：

    Hooks Considered Harmful

    <https://labs.factorialhr.com/posts/hooks-considered-harmful>

    一篇讨论 React Hooks 设计不合理性的文章。

    内容整体比较发散，引起共鸣的点有二，一是 state 管理依赖的方式过于原始，二是 hooks 运行的时机，运行的次数很难把控。

    除了文中提到的观点，hooks 对开发者的心智成本、项目中 state 的管控都有很大影响。本质上 React 是个由 state 驱动的 runtime，如果没有一个很好处理 state 的机制，则开发者就不得不面对带来的复杂度。
29. 项目分享：

    dum - An npm scripts runner written in Rust.

    <https://github.com/egoist/dum>

    dum 是知名开发者 egoist 的个人作品之一，项目中使用 rust 降低了执行 npm 命令的时间。

    从压测数据中可看出，使用 rust 开启进程 执行 node 脚本，会提升 npm 命令数倍性能，可以看出 npm 命令主要的性能瓶颈在于 node 桥接层。

    项目整体比较精简，是个很好的学习案例。
30. 快餐文分享：

    Please put units in names

    <https://ruudvanasseldonk.com/2022/03/20/please-put-units-in-names>

    一篇介绍代码最佳实践的文章。

    文章的关注点聚焦于魔法数字，文中梳理了 一些使魔法数字具有可读性的方案。

    第一种方案可以称为 parameter hint，像一些编程语言在 语法层面存在该特性，如python、kotlin ，现代的 IDE 一般也都具有该功能。

    第二种方案类似于类型别名，该方案就极度依赖语言特性了，并且在运行时 语义大概率会被抹出。

    我经常实践的方案是数字计算，定义一个基本的单位产量，如 Second = 1000，然后魔法数字 foo = n \* Second 这些。这种方式的好处是 可以方便的升级计算公式，且具有很强的语义。
31. 惊讶系列分享：

    A regular expression to check for prime numbers

    <https://www.noulakaz.net/2007/03/18/a-regular-expression-to-check-for-prime-numbers/>

    使用正则表达式 判定素数证明 - `/^1?$|^(11+?)\1+$/`

    文中针对原理介绍很详细，感兴趣的同学可以看下。

    延伸来看 正则引擎可以匹配出所有非负的数字公式，这些公式使用正则去描述，两种不同领域之间的表达映射，实在是妙…
32. 好文分享：

    Lisp的永恒之道

    <https://www.cnblogs.com/weidagang2046/archive/2012/06/03/tao_of_lisp.html>

    一篇论证编程语义的好文。

    文章从多个角度介绍了编程语言中 语义的重要性，以 lisp 为主导论证了语义的强大之处。

    从语义的角度出发，业界中常见的编程语言 本质上是基于底层（操作系统、网络模型、持久化这些域）提供的 DSL，或多或少都不太纯洁，比如在 C 系列语言中，用户需要关心 语言的内存管理，在 非 ML 系语言中用户需要留意 递归爆栈..

    用户使用这些编程语言往往解决特定场景下的问题。这些问题是场景所赋与的，比如做电商平台，不同的商品模型是需要不同的建模策略。 理论上，在这些业务域上 使用常见的编程语言去抽象建模是不自然的，创造的思想会被编程语言所限 且 思想的表达会被语言的细枝末节所淹没。

    解决问题的方案会明显，针对业务域的问题 创造专属的 DSL，扩展思想表达的能力，然后 研发编译器去将 业务域的思想 翻译到 底层。 很明显该逻辑已经被反复验证了 (上述的问题换成计算 DSL 换成 编程语言)。

    那么问题是 DSL 表达能力如此强，为什么业界没有广泛应用呢？我猜测原因有两点：一是 人(需要强有力的技术专家推动)，二是 问题量级。

    延伸阅读：

    王垠 - DSL 的误区 - <https://www.yinwang.org/blog-cn/2017/05/25/dsl>

    从文中可看出 垠神对 DSL 持反对态度，其实不难理解 文中提到的 DSL 算是 常见编程语言的能力 子集..

    我认为 DSL 所在的意义可看之前的一条分享。
33. 每日一句分享：

    We talk a lot about “passive income,” but not as much about “passive social capital” or “passive knowledge gaining” — that’s what you gain if you build an asset that grows over time without intensive constant effort to sustain it. A few examples include starting a company, an angel portfolio, a newsletter, or a podcast.

    摘录自： Build Personal Moats

    <https://eriktorenberg.substack.com/p/build-personal-moats>

    文章介绍了 个人护城河的重要性，以及如何找到自己的护城河。
34. 快餐文分享：

    Tao of Node - Design, Architecture & Best Practices

    <https://alexkondov.com/tao-of-node/>

    一篇探讨 Node 服务最佳实践的文章。

    文章整体篇幅很长，涉及的方面比较广，主要分为项目结构，应用结构，请求处理，错误处理等等方面，感兴趣的同学可以刷一下。

    对于文中大部分的最佳实践，社区内常见的 Express Koa 框架，因为设计的机制 是需要开发者投入人力的，这里我推荐 一个大而全的成熟解决方案 NestJS。


# 1

1. 快餐文分享：

   DevTools 实现原理与性能分析实战

   <https://mp.weixin.qq.com/s/H8iahg5WUOHXeRzvf0R01w>

   一篇介绍 DevTools 调试工具的综述文。

   文章先是简述了 DevTools 的发展历史，分为三个阶段：WebKit Inspector 的先行阶段；Firebug 神器的风靡时代；DevTools 集百家之长后的快速发展 直到垄断阶段； 然后作者具体介绍了 DevTools 的架构设计，基础原理。也正是因为一开始优秀的解耦设计，让 DevTools 在跨端调试、Nodejs 调试 以及社区的生态中占据了重要的一环。可以理解为将 DevTools 中的关键动作 封装成了 DSL，只需要传递指令 即可响应。

   ![image-20220204212425682](/files/3nK00SMoe7ALPYDhwoE7)

   延伸阅读：

   1. 10 Years of Web Inspector

      <https://webkit.org/blog/5718/10-years-of-web-inspector/>
   2. liriliri/chobitsu

      <https://github.com/liriliri/chobitsu>

      Chrome devtools protocol JavaScript implementation

   如果你想实现一个类 DevTools 的跨端调试工具，完全可参考 CDP 协议做到。
2. 每日一句分享：

   web3 = decentralisation + blockchain + NFTs + metaverse

   web0 = web3 - blockchain - NFTs - metaverse

   web0 = decentralisation
3. 快餐文分享：

   Go Fuzzing

   <https://tip.golang.org/doc/fuzz/>

   Go1.8 除了在语法带来了泛型，其他重要的一点是 官方 Test 库支持了模糊测试。 模糊测试可理解为是编程时的“混沌工程，通过简单的 API 去测试 程序的各种边界情况。

   文中给出了模糊测试的编写规则与其草案。
4. 每日一句分享 - 结果思维：

   结果大于过程；

   有交付价值的结果大于无交付价值的结果；

   能复制的结果大于不能复制的结果。
5. 分享一个利用搜索引擎&关键词 快速找到替代品的技巧：

   {keyword} vs

   ![image-20220204212513103](/files/qWOcE4DAoq3HVnkxwTm6)
6. 快餐文分享：

   揭秘 vivo 如何打造千万级 DAU 活动中台

   <https://mp.weixin.qq.com/s/rN9AujBNIztrvonJBaKmUg>

   文章介绍了 vivo 内部的头部 no code 搭建平台 悟空，逐个盘点了 平台所处的业务背景、应用层（组件、活动）的市场模型、画布渲染动态组件的核心思路、数据源的编排能力等，整体算是深入浅出了。
7. 快餐文分享：

   Using Neovim for Three Years

   <https://jdhao.github.io/2021/12/31/using_nvim_after_three_years/>

   文章分享了 作者使用学习 Vim 的经历，从初学者慢慢到使用者的演变，用作者的话来说：自己的需求 自己撸插件实现，完全掌握一个工具的感觉很爽。 文章中也分享了作者的 dotfile 与 使用插件，感兴趣的同学可刷一下。
8. 快餐文分享：

   Gem: exploding string alternatives

   <https://nedbatchelder.com/blog/202112/gem_exploding_string_alternatives.html>

   文章分享了使用 python 去模拟实现 shell 列表字符串的方案。 核心逻辑在于 排列组合可以复用官方库。

   评论区 也有使用 ruby 的复刻，以及使用 迭代生成器的精简版。
9. 每日一句分享：

   我理解的用户体验，是让用户付出最小成本满足需求。

   用户体验无法用一个通用方法整体衡量，只能在理解产品全貌的前提下评测分解属性。

   摘抄自：什么是用户体验？如何评价用户体验的好坏？ - 俞军的回答

   <https://www.zhihu.com/question/19682869/answer/32552025>
10. Github 最近新增了个 为自己添加继承者的功能。

    <https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-user-account/managing-access-to-your-personal-repositories/maintaining-ownership-continuity-of-your-user-accounts-repositories>

    数字遗产一直没有个规范化的处理方案，Github 算是开放先河了。
11. 分享个项目：

    Darling - <https://www.darlinghq.org>

    一款可以在 linux 上运行 mac 程序的翻译层软件，与 Wine（在 linux 运行 windows 程序）的产品形态很相似。
12. 快餐文分享：

    Why might you run your own DNS server?

    <https://jvns.ca/blog/2022/01/05/why-might-you-run-your-own-dns-server-/>

    一篇 关于 DNS 种草文。 作者先是介绍了 DNS 去中心化的特征，解释了 DNS 查询时的影响因子（几乎链路上的每个环节）。后面花大篇幅盘点 自建域名托管服务与自建域名解析服务的好处。于平时生活中，最显然的好处就是 block ad 了。 当然 于国情来说，自建 DNS 是违法的。

    这里延伸话题可以说些 GFW 的原理，它的核心思路就是在 DNS 时做 404 的…

    （DNS 污染也是我见过最牛逼的 DDOS 攻击 （没有之一
13. 每日一句分享：

    国家新能源车辆标准 GB32960 规定，车载系统需 每十秒上传一次实时数据，包括经纬度、车辆发动机状态 、电池状态等。
14. 微软 终于出了 Execl JS API，JS 的生态更完善了。

    <https://docs.microsoft.com/en-us/office/dev/add-ins/reference/overview/excel-add-ins-reference-overview>
15. 快餐文分享：

    Visualizing Concurrency in Go

    <https://divan.dev/posts/go_concurrency_visualize/>

    作者使用 WebGL 对 Go 程序中运行的 Goruntine 及 channel 通信做了可视化。 文中使用可视化的方式，总结了 Go 比较常见经典的多个并发模型，看起来非常直观。 结尾作者介绍了技术原理：使用 gotracker + three.js 实现。
16. 快餐文分享：

    Introducing Metho: Safely adding superpowers to JS

    <https://dev.to/jonrandy/introducing-metho-safely-adding-superpowers-to-js-1lj>

    由一个有趣的想法诞生的库，如何通过语言特性扩展基类的能力？文中给出了实践。 文章所属的系列一共四篇，详细地介绍了原理。

    10\[times(()=>alert('Hello'))]

    据我观察，可扩展基类的语言 比如 js、kotlin、ruby，都是解释型语言。
17. 视觉优先级。

    ![image-20220204212711085](/files/bpRFQrcgSpNzHl8ssfxb)
18. 一些技术名词的缩写

    ![image-20220204212724732](/files/nn2NGEwxJBJSqnyAzcjD)
19. 快餐文分享：

    Memory leaks: the forgotten side of web performance

    <https://nolanlawson.com/2022/01/05/memory-leaks-the-forgotten-side-of-web-performance/>

    一篇谈 Web 内存泄漏的文章，作者先是梳理了 内存泄漏的性能特征：影响程度低，很难诊断等，然后站在用户角度，浏览器角度，开发者角度去分析问题影响，其中 有一句话很让我感触：Third, it’s a tragedy-of-the-commons situation, and people tend to blame the browser. 的确 很多情况下 用户分析是这样的，只到软件层级。

    最后作者分享了他的内存泄漏检查工具，并表达了对产品的预期表现：不要因为性能问题，让用户对产品失去信心。
20. 快餐文分享：

    Hashing is not encryption

    <https://eric.mann.blog/hashing-is-not-encryption/>

    文章总结了 encryption, encoding, and hashing 各自的定义与使用场景。

    不过文中对 encryption 定义过于简单了，只是用传统 对称加密的方式去描述。
21. 惊讶系列分享：

    Minecraft as a k8s admin tool

    <https://eric-jadi.medium.com/minecraft-as-a-k8s-admin-tool-cf16f890de42>

    minecraft 是一款风靡全球的沙盒游戏。

    作者脑洞大开地使用游戏作为用户界面，圈养的动物作为 k8s cluster，来实现 pod 管理... 实在是太秀了。
22. 排列 小猫咪

    ![image-20220204212801993](/files/l8Pl0TBAXvJDOCzaxeea)
23. 快餐文分享：

    The Optional Chaining Operator, “Modern” Browsers, and My Mom

    <https://blog.jim-nielsen.com/2022/a-web-for-all/>

    文中讲述了作者帮忙家人解决网页问题的经历，原因仅是 网页中出现了不兼容的低端机的语法，但是却对个人影响很大……

    摘录自 W3C 设计准则：

    The internet is for end users: any change made to the web platform has the potential to affect vast numbers of people, and may have a profound impact on any person’s life.

    （现代前端开发已经离不开 babel 了。
24. 快餐文分享：

    Why I Like D

    <https://aradaelli.com/blog/why-i-like-d/>

    一篇小众语言种草文。

    作者先从自己寻找 better c 语言的经历讲起，为什么 D 能优于 Go 与 Rust（非常主观）。

    然后列举了 D 的语言特性，标准库，元编程，脚手架等。

    其中 有个特性（集合类型 运算符重载）很有趣，让我想起了 Python ， half\[] += 1;
25. 好文分享：

    走进 Web3

    <https://www.bmpi.dev/dev/glimpse-of-web3/>

    一篇介绍 Web3 的好文。

    文章先介绍了 Web 的发展历史，延伸抛出了 当前 Web2 我们与信息之间的关系，这里说的很透彻：

    互联网公司的产品大多是免费的，这个秘诀就在于用户也是其产品的一部分。

    而 Web3 的引子 来源于 中本聪提出比特币应用的底层技术 - 区块链，可理解为是一种特殊的数据结构：节点之间存在验证关系的链表，并且节点与节点之间是去中心化的，既然是数据结构那么最大的作用就是存储数据，从这点看来 使用的场景是有限的。

    这里就不得不说 币圈另一位知名的大佬 V 神，V 神基于区块链开发了 以太坊，一个支持智能合约的区块链平台，之前区块链的可编程能力非常有限，而以太坊的 EVM（虚拟机）是图灵完备的，具体细节就不展开了。

    那么 Web3 与 区块链的核心关系是什么？

    我的理解是 区块链的去中心化 让 Web 信息流动的过程 发生了变化，听起来是不是很像 Web3 变成 区块链上层的炒作概念？其实不是的，去中心化 技术一直在发展，蒂姆·伯纳斯·李 以及很多组织一直在倡导，今年来的一些技术：BT、ipfp、webrtc、solid 也是在以这个方向演讲，但是由于 去中心化后的利益问题（于巨头公司、国家监控），在现实中是很难大范围普及的。

    关于去中心化，文章也说了一些：

    去中心化想要落地 必须让价值从少数寡头公司中所属变为从属为网络中每个参与者。要形成共识就需要让一部分人先有币。

    文章之后又谈论了，Web3 上创建去中心化产品的路径，一些必需依赖的生态等。其中创建产品路径的例子可以说稍显荒诞，产品的价值共识形成 可以不完全依赖产品本身，可以依赖一些名人的背书，这点很像币群的乱象，没有完备的白皮书也可以诞生一个市值很高的币。

    A: <https://mp.weixin.qq.com/s/7sOOCrNU2FcypaHN2phMYA>

    这篇讲了 区块链 NFT 的一些简单介绍 也不错
26. 惊讶系列分享：

    Folders - <https://esolangs.org/wiki/Folders>

    一个脑洞大开的编程语言，通过文件夹之间的结构特征 去代表出数据，运算逻辑。可只通过创建文件夹，来实现图灵完备的程序，解释器也有多个语言版本。

    更多奇怪的编程语言：<https://esolangs.org/wiki/Language_list>
27. 快餐文分享：

    Effective Error Handling in Golang

    <https://earthly.dev/blog/golang-errors/>

    一篇介绍 Go 错误处理的文章。 文章整体的脉络很清晰，基本上就围绕着两方面，错误类型的定义与包裹使用。 文中提到 定义预期的错误类型行为，是很值得提倡的，即可为上下文增加更多的语义化信息也会明确程序中存在不可避免的错误。

    一直有很多声音很讨厌 Go 中教条式地异常处理，觉得很繁琐，不智能。但归根结底 在于错误处理没有银弹可言，不管是 Go 的多返回值，还是函数式语言中使用 sumtype ，或者传统 oop 中函数签名的 mark exception，都不是一个很优雅的方式。Go 只不过让开发者直面了 任何运行时存在的异常。
28. 好文分享：

    Life of a Pixel

    <https://bit.ly/lifeofapixel>

    一个像素的一生，本文来自 18 年 Chromium 团队的一次分享。 文章主要讲述了 在浏览器视角下 从获取网页后 到渲染在屏幕上的整体流程( turn HTML / CSS / JavaScript into the right OpenGL calls to display the pixels)，并对一些重点的流程做了较直观的技术梳理。

    我简单整理后，像素的生命周期 大体梳理如下：

    * 最顶层的页面内容、最底层的像素。
    * 解析 DOM/Style、排版、文档树/Style Map 生成。
    * 合成布局树(包括下一代布局 NG 布局算法)(这里有一点很有趣：不管上层是怎么样的 DOM 元素，映射到 Layout 元素上 只是可枚举的几种)。
    * 分图层。
    * 构建属性树 以及 绘制、图层合成。
    * 布局树转换成绘制操作列表。
    * 绘制操作列表经过栅格化转换成位图(包括 GPU、重绘、动画)。
    * 激活绘制，合成线程有两份图层树的引用，一根用于下层消费 即 光栅化线程池消费，一根用于工作时消费，生成下一次提交到光栅化线程的图层树，这里很类似于 React Fiber 架构，也是双树的架构设计。
    * 栅格化分块。
    * 通过 Skia、OpenGL等生成 GPU 指令库 绘制图像。
    * GPU 显示。 除此之后还包括了 很多相关的领域知识。

    文章囊括的底层范围很广泛，有助于我们开阔技术视野，非常建议前端同学阅读。

    ![image-20220204212859671](/files/yf1JiNNKo9MHlJRsGaL4)
29. B: 分享我这几天写的一篇文章，我是花了周末两天时间好好写了下 GitHub 和 GitLab 的历史，介绍下这两家如何从零起步的创业公司做到百亿美元市值。

    从零到百亿美金之路 - <https://mp.weixin.qq.com/s/4MoyzFfpgIeHgSivkWiM-A>

    A: 微软真是捡了个大便宜，这话一点没错，Gitlab 的市值 上市就过百亿了……

    融资节奏对公司发展太重要了……

    B: 确实，不过微软收购对GitHub也是好事，原CEO走后GitHub感觉就没有那股创业劲头了。倒是微软收购后变化又大了起来

    A: 嗯，是这样子，微软接手后，确实做了很多对开发者利好的事情，记得微软收购后，社区内有很多声音要拒绝 github 微软化，迁移 gitlab 的潮流￼

    B: 不得不说微软的战略远见很高明，也不差钱，而是加大对GitHub的投入来牢牢抓住开发者
30. 快餐文分享：

    React Native Web vs. Flutter web

    <https://blog.logrocket.com/react-native-web-vs-flutter-web/>

    一篇介绍 rn 与 flutter 差异的综述文。 文中从多个方面比较两个跨端方案的有异同，优缺点分析等。

    在 Native 上，由于 Flutter 的架构设计(compile to native code) 其性能更优。在 Web 上，Flutter 支持两种架构，the HTML renderer and the CanvasKit renderer，前者 体积小 性能差，后者体积大 性能好，但基于 Skia 会导致渲染差异问题。

    复用性上 RN 在 Web 上更好，只需要在编译时将 View Text 编译成等价的 DOM 元素即可。
31. 快餐文分享： \
    Do Svidaniya, Igor, and Thank You for NGINX \
    <https://www.nginx.com/blog/do-svidaniya-igor-thank-you-for-nginx/>

    今日 HN 热文，Nginx 组织对其创始人 Igor 退休时的祝福，以及 Nginx 历史回顾。 目前 Nginx 已经成为了 web 上使用量最广的服务器软件，服务端的必不可少的底层设施。 可能有同学不清楚，Nginx 并不是完全开源的，有一些关键特性需要商业版协议的，相比之下 Apache 服务器是完全开源的。
32. 快餐文分享：

    CSS Fingerprinting

    <https://csstracking.dev>

    文章介绍了一种使用 CSS 为用户设备生成指纹的方案。
33. 快餐文分享：

    structuredClone(): deeply copying objects in JavaScript

    <https://2ality.com/2022/01/structured-clone.html>

    近期浏览器厂商们提出了一个新的 用于深拷贝的 API：structuredClone，文章介绍了 深拷贝对象的现状以及该 API 的详细用法，特性解释，需要注意的是该方法只支持拷贝原始类型。至于为什么没有 TC39 的提案，我猜测是 WHATWG 组织先行的结果。
34. 快餐文分享：

    TypeScript Features to Avoid

    <https://www.executeprogram.com/blog/typescript-features-to-avoid>

    文章梳理了一些在 JS 中不兼容的 TS 独有特性，作者的观点很正确，TS 应该只作为 JS + Type 的辅助存在，而不是赋能特性的存在，不然会出现不兼容的情况。
35. 快餐文分享：

    Tutorial: Getting started with generics

    <https://go.dev/doc/tutorial/generics>

    Golang 官方介绍泛型文章来咯。文中使用一个简单 Demo 介绍了泛型的基本用法。
36. ![image-20220204213153994](/files/l2ojJ5eQMdKx04qjfRGc)

    迄今为止看到关于 Monad 最直白的解释定义..

    编程中常见的场景是 通过特定场景下的逻辑操作数据。

    虽然被操作数据有各种各样的类型，但数据类型中 有一些通用的操作表达 可以被提取出来，比如 使用 SumType 来做数据空指针兜底，使用 Just + Fold 来实现 数据单向操作流、PointFree 免定义等。 而这些通用操作表达 的载体可理解为 一个被构造出的类型实例，该表达之间的规则也符合 使用组合子时 的规律。以上就是 Monad。

    上图来自 monio 一个小众函数库的介绍。

    <https://github.com/getify/monio/blob/master/MONADS.md>
37. 分享篇文章：

    我们应聘过骑手，打过卧底电话，看了1907份判决，最后拼出了这部外卖平台进化史

    <https://mp.weixin.qq.com/s/KNLWPjHf6YzTMUNWUkZrUg>

    摘要： 外卖系统里不仅仅有算法，还藏匿了许许多多的公司，而这些公司错综复杂交汇而成的法律关系网络，正把骑手死死地捆住。当骑手跌入前方这个大坑的时候，其中任何一家公司，都不足以构成他的用人单位。

    人们常说算法是一个黑箱，我们只需要享受最后的结果，不需要知道中间的运行过程。可是如果这个人不是你和我，而是受伤的骑手呢？
38. 快餐文分享：

    I’m porting tsc to Go

    <https://kdy1.dev/posts/2022/1/tsc-go>

    目前越来越多的前端工程基础设施正在用底层语言重写，阿比如 webpack、babel、eslint 等，这些重写后的工具都取得了明显性能收益，具体可以看之前的分享。

    文章作者 也是 swc 的作者正在重写 tsc，rust 重写后性能提高了 62 倍，但是因为语言特性的问题最后还是选择了 go，文中介绍了心路历程。
39. 好文分享：

    How React server components work: an in-depth guide

    <https://blog.plasmic.app/posts/how-react-server-components-work/>

    一篇介绍 RSC 的综述文。 \
    作者先是说明了 RSC 的背景，优势，与 SSR 的差异（可理解为 另一种对前端生态更友好的 SSR 架构）。

    优势摘要：

    In short, React Server Components makes it possible for the server and the browser to do what they do best. Server components can focus on fetching data and rendering content, and client components can focus on stateful interactivity, resulting in faster page loads, smaller javascript bundle sizes, and a better user experience.

    文中作者花了很多笔墨介绍 RSC 的工作原理，具体的渲染流程可简单理解为 另一种形态的 bigpipe。

    首先服务端序列化组件树，其中包括 前端组件的 placeholder，浏览器解析时 遇到 placeholder 引用到相应的前端组件。

    可以看出，该流程是重编译的， 重 runtime 的。社区对这些基础设施也有对应的解决方案。

    最后，总结了 RSC 的发展现状，虽然还在实验，但也有一些大公司开始吃螃蟹了。
40. 快餐文分享：

    IDE中的魔法 - 编译原理通识

    <https://zhuanlan.zhihu.com/p/453329147>

    文章介绍了编译原理常见的概念，一图胜千言。 \
    作者从 IDE 的视角，简单介绍了其 在 词法分析、语法分析、语义分析阶段的 不同的能力范围 以及 抛出了一些引子。

    感兴趣的同学可以看下该系列文章，整体系统性较弱，但很偏实践。 <https://www.zhihu.com/column/c_1463537113430441984>

    用今天垠神的一条微博来说：

    这个时代，拥有真正知识的人已经不多了。有真的知识，还愿意分享给其他人的就更少。愿意分享给其他人，还能把它讲清楚的，就寥寥无几了。
41. 分享一个调节 mac 风扇 转速的利器：

    Macs Fan Control

    <https://crystalidea.com/macs-fan-control>

    设备提供了多项 调速策略，如：固定转速、基于硬件设备的维度，且非付费版本也可以满足基本使用。

    亲身经历，使用之后 电脑风扇 终于不再发生噪音了。

    虽然没有噪音了，但是电脑卡顿更严重了，逃不出能量守恒定律￼
42. 快餐文分享：

    Exploiting JavaScript quirks for fun and profit

    <https://kittygiraudel.com/2022/01/21/exploiting-javascript-quirks-for-fun-and-profit/>

    文中介绍了作者使用一些奇技淫巧解决问题的过程，最后解决方案 很简洁明了。如果是我的话 我可能会使用 new Function 了。
43. 好文分享：

    A pipe operator for JavaScript: introduction and use cases

    <https://2ality.com/2022/01/pipe-operator.html>

    一篇介绍 pipe operator 特性的文章。

    pipe operator 并不是一个新特性，提案时间已经有很多年了。

    pipe operator 提案最初是来源于两个语言中的特性 F# 与 Hack，一个是ML 体系 微软研发的语言，一个是 赵海平 参与建设 Fackbook 研发的 PHP 超集语言。文中详细介绍了 这两种语言中关于 Pipe 特性的优缺点，可以看出 Hack 的适用范围更广，这也成为 TC39 选择的原因。

    文中用诸多例子介绍了 Pipe 对 JS 带来的好处，一言蔽之 可以极大程度使用 Pointfree 风格。

    并且梳理了 F# 与 Hack 结合后的特性形态，也是最后 JS 会演变的形态。

    最后 2ality 给出了 一些内部 DSL 方案，但看起来都有一些槽点，不如使用某些 可 Boxable 的函数库。
44. ![image-20220204213302969](/files/dxgRUjSAMTPJ7OeCXOq1)

<br>


# 2

1. ![image-20220305153410870](/files/Gd88fEw9gkf662V0hxhl)

   图片来源：

   A toy DNS resolver

   <https://jvns.ca/blog/2022/02/01/a-dns-resolver-in-80-lines-of-go/>
2. 惊讶系列分享：

   Yes, I can connect to a DB in CSS

   <https://www.leemeichin.com/posts/yes-i-can-connect-to-a-db-in-css.html>

   文章介绍了作者使用 CSS 与数据库交互的经历。

   主要是通过 Houdini 自定义了 CSS 能力，数据库使用 过时的 ASM.js 嵌入 sqlite ，绘画文本借助 opentype 解析数据得到文字路径，（其中作者提到了 JSPM，一个自动为库 生成 es6 module 的 saas，不可否认存在一定应用场景），最后作者给出了一些 自定义数据源，查询数据的例子。

   虽然 使用场景很有限，但可以看出 现在 Web 能力已经发展到了一定水平。
3. 快餐文分享：

   A look back at 2021

   <https://vercel.com/blog/how-the-web-evolves>

   Vercel 2021 年的 review 报告。

   可能有的同学 对 Vercel 公司不太熟悉，我简单介绍一下，Vercel 的前身是 Zeit，属于开源社区内 比较知名的组织，其公司下有众多开源产品：比如 Next.js, SWR, Turborepo, hyper 等等，并且 Vercel 内的大佬众多，包括 Svelte 作者、Webpack 作者、React 灵魂人物，SWC、Turborepo 作者等等。

   Vercel 的商业模式 很简单，主要是做部署服务，Next.js 开源产品 为其助力，给我影响最深的地方在于 产品的设计，简约风 黑白分明。

   文中值得一提的是，梳理了几项未来 Web 的发展趋势：

   1. Web 的部署形态将趋于 边缘服务。 这也是 Remix 优于 Next.js 的地方，Remix 更适合 faas。
   2. 开发基建 将越来越快，底层语言重写的趋势还在延续。
   3. 实时数据 会提高用户体验。
   4. Web 开发的 Low Code、No Code 会持续演讲。
4. 快餐文分享：

   Understanding LSM Trees: What Powers Write-Heavy Databases

   <https://yetanotherdevblog.com/lsm/>

   文章介绍了数据库背后的核心存储数据服务 - LSM ，整体很宏观，LSM 常见应用在 BigTable，RocksDB 中。

   LSM 的持久化存储机制是 SSTable，一个按 k 排序的 kv 表。当写入数据时，LSM 会先写到内存中的红黑树中（用于排序），到达一定体积时会 刷到持久化存储介质上。 当查找数据时，会根据 key 做二分，找到对应的子区间做扫描，如果未找到则使用 bloom filter，通过多维交叉认证查找。 当存在新旧数据时，LSM 有后台进程，异步地合并数据，维护数据顺序，删除空标记数据。删除数据时，做空标记数据处理。
5. 好文分享：

   Dependency Confusion: How I Hacked Into Apple, Microsoft and Dozens of Other Companies

   <https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610>

   一篇介绍依赖攻击的好文，作者用自己的亲身经历讲述了使用混淆开发依赖的方式，成功 hack 进众多互联网公司服务器的故事。

   文中的列举中行为很让我震撼，公共的 js 资源中 引用的依赖 大多数都可检索到，而这些依赖安装时，完全信任中心服务器，没有任何检查机制，也没有任何前置的 scope，这就导致只要存在同名的“恶意”依赖，那么大概率就会被安装到服务器上并执行。 这些某些服务可以是 npm、PyPi、gems 等官方服务。

   可以见得，这些官方服务设计的自由开放性是罪归祸首之一。除此之外，文中提到 大公司关于漏洞的奖励 都非常丰厚。
6. 快餐文分享：

   Move over JavaScript: Back-end languages are coming to the front-end

   <https://github.com/readme/featured/server-side-languages-for-front-end>

   一篇讨论 前后端协作形态的文章。

   随着应用需求的复杂，从最开始的后端主导 慢慢演变为后端前后端分离，在此过程中诞生了很多后端渲染页面的库与框架，作者详细介绍了它们设计时的 trade off，但前后端分离并不是终点，近些年已经有越来越多的 hybrid render 方案的出现。

   摘抄文章结尾的一句话：

   Perhaps what we're seeing is not so much a pendulum swing, but a state of equilibrium where computing happens on both client and server in equal measure depending on the needs of the user.
7. 每日一句分享：

   The programmer(s) who came before you cared about the person who would come along later, maybe because they realised that the programmer who came along later might be them.
8. 快餐文分享：

   Deep dive into React Native’s New Architecture

   <https://medium.com/coox-tech/deep-dive-into-react-natives-new-architecture-fb67ae615ccd>

   文章介绍了 RN 的新架构，包括 JSI，Fabric，Turbo Modules 与 CodeGen。

   这些新的特性颠覆了之前传统 bridge 通信的方式，JSI 的出现隐藏了 前端与客户端通信的流程，JSI 的设计形态非常像 Chrome 之前推出的开源库 ComLink，更 enjoyable 的上层使用。Fabric 解决了之前 RN 渲染时 双引用，异步渲染的问题，底层也是基于 JSI 那一套，但本质没变 还是重 JS 计算，只不过通信变高效了。而剩下两个特性比较一般， Turbo Modules 实现了 对 NativeModules 按需使用，CodeGen 是 使用 JSI 时新一代的 type checker。
9. 快餐文分享：

   TypeScript/Implement Rust-style Result

   <https://www.huy.rocks/everyday/02-14-2022-typescript-implement-rust-style-result>

   用 7 行代码模拟实现 Rust 的 Result 类型。
10. 快餐文分享：

    Monorepos Explained

    <https://monorepo.tools>

    一篇分析 monorepo 工具的好文。

    文中先是介绍了 monorepo 项目的形态，然后说明了 monorepo 工具的应用场景，再从多个角度重点分析了业界现存工具的优缺点。

    延伸阅读：

    Misconceptions about Monorepos: Monorepo != Monolith

    <https://blog.nrwl.io/misconceptions-about-monorepos-monorepo-monolith-df1250d4b03c>
11. 惊讶系列分享：

    The Simula One: Linux VR Computer (VRC)

    <https://shop.simulavr.com>

    个人电脑带到 VR 会发生什么？链接展示了该产品形态。
12. 快餐文分享：

    Retrofitting Async/Await in Go 1.18

    <https://csgrinding.xyz/go-async/>

    文中介绍了在 Go 中想要取到异步结果的复杂性，远没有 async await 语法方便，作者在后面介绍了 github 上一个模拟实现的库，只有数行代码。
13. 一本介绍 rust 的电子书，整体介绍的很详细，偏理论。

    <https://github.com/vinodotdev/node-to-rust>
14. 快餐文分享：

    When I'm Sad My Computer Sends Me Cats

    <https://healeycodes.com/when-im-sad-my-computer-sends-me-a-cat>

    一个有趣的想法，当作者在电脑面前伤心时，就会收到一张小猫咪🐈图片。

    文中介绍了实现途径，通过各种 saas 服务结合，如 检测人脸通过 face.js，推送消息，猫猫照片通过其他服务等。

    这展示了不同服务连接的 power，多年以前就有很多连接服务的产品出现了，如平时各种的 cicd 服务，与生活比较近的 ifttt 等，ifttt 在我看来于产品形态上是比较完备的，通过可视化的方式提供了用户很大的想象空间。唯一遗憾的是，国内的国民应用都较为封闭，很少提供开放能力。
15. 有个问题，健康的商业模式，是不是都存在闭环呢？
16. 好文分享：

    The Internet Was Designed With a Narrow Waist

    <https://www.oilshell.org/blog/2022/02/diagrams.html>

    文章介绍了架构设计时的沙漏思想，一种设计收口的中间层机制。

    作者使用了两个案例来解释 沙漏思想的好处，一是避免双端的互操作复杂度，二是避免代码爆炸。这两个案例非常经典，OSI 模型 与 OS 数据类型，可见下图。 其实在平时的应用，沙漏思想随处可见，比如 V8 字节码，上层是 JS 的广泛生态，下层是编译后在不同平台的指令集。又比如 JSX，上层是各种物料生态，下层是 DOM、Native、Terminal。又比如 JVM，上层是 Java，Scala，Kotlin，下层是 VM 编译的机器指令等。虽然文章的脉络比较乱，文章的主题仍能引发思考。

    ![image-20220305153548230](/files/r0z1j59IjQ7qbyQqTH2J)
17. 快餐文分享：

    为什么比特币可以防篡改

    <https://draveness.me/whys-the-design-bitcoin-database/>

    文章介绍了比特币保障用户交易安全性与公正过去交易合法性的技术原理。 分为两部分，一是非对称加密，二是共识机制。非对称加密老生常谈了，共识机制核心依赖共识算法，比特币的共识算法是 POW - 工作量证明，这是一种需要大量算力 且 对自然生态会造成影响的算法，详细可见：<https://en.wikipedia.org/wiki/Proof_of_work>。
18. 每日一句分享：

    代码应该尽可能简单，因为下一个维护你的代码的人不会像你那么聪明。


# 2021


# 12

1. 用 Scala unfold 算子定义斐波那契数列，很简单明了：

   ```
   val fibonacci: Iterator[Int] =      
       Iterator.unfold((1, 1)) {        
           case (x, y) => Some((x, (y, x + y)))      
       }
   ```
2. 惊讶系列分享：

   Implementing Raft for Browsers with Rust and WebRTC

   <https://eevans.co/blog/wraft/>

   一篇想法很超前的文章，文中讲述了 作者在浏览器终端模拟 Raft 算法的经历，仓库如下。

   <https://github.com/shosti/wraft>

   WebRTC 提供了 P2P 的能力（抛开中心信令服务器不谈），现代 Web 也有很多持久化的能力（比如 IndexDB ），那么可不可以将浏览器视为一个节点，去实现一套类似于 etcd 的分布式数据库系统呢？

   文中虽然没有实现该系统，但给了一个很赞的启发。

   在浏览器中去实现 CAP 原理中的 C，可太有趣了。
3. 快餐文分享：

   React Lazy Loading - A Guide to Code Splitting for React Components

   <https://javascript.plainenglish.io/a-guide-to-react-lazy-loading-6bca6be7159>

   文中介绍了一种工程实践，利用 React.lazyLoad 将非首屏的资源 拆包后延迟加载，从最开始的 首屏加载 1mb 的资源变成 只加载 几十kb 的资源，收益非常明显。
4. 好文分享：

   Generator Tricks For Systems Programmers

   <http://www.dabeaz.com/generators/Generators.pdf>

   一篇讲述 Python Generator 的好文，文中用大量例子去证明生成器在处理数据 IO 时的优美便捷性。

   这种内部 DSL 设计得确实很赞，既可以流式处理数据源，又可以像 C# Linq 那样查询过滤数据。
5. ![image-20220104224809517](/files/pFh3kxAt68YAktJ7IFeM)
6. 分享个惊艳的项目：

   liriliri/chii - Remote debugging tool

   <https://github.com/liriliri/chii>

   这是一个调试神器，原理类似于多年前的 Weinre。

   可以做到 远程（互联网）、跨终端设备限制（就算是 WKWebview）、且无需代理去调试当前设备浏览的页面。

   其流程是需要在页面中注入一段脚本，然后脚本与远程服务器建立 Websocket 连接。 服务器拿到终端页面的信息后，通过 Chrome 开源的 Devtool fronted，渲染出 调试页面供用户使用。

   用户在调试页面交互时，会发送消息到终端。

   而刚刚提到终端注入的脚本 可以视为 Chrome devtools protocol JavaScript implementation，是对于调试动作的消费端。

   一句话概述：通过 WS 建连， Chrome devtools protocol 作为通信规范，Chrome devtools-fronted 作为调试工具页面，很大程度上 模拟出 开发时的调试体验。

   值得一提的，chill 还有提供 whistle 插件。

   <https://github.com/liriliri/whistle.chii>

   而 阿里开源的 lightproxy 调试工具 正是基于 ws + 该插件的 electron 封装。

   该工具，有很大的市场前景，可以被挖掘下，天下唯 WKWebview 调试苦矣。
7. 每日一句分享：

   The modern web is a nightmare without an adblocker and annoyance blocklists.
8. 快餐文分享：

   Async I/O for Dummies

   <https://www.alwaysrightinstitute.com/async-io-by-example/>

   一篇讲述异步IO、高并发基础概念的文章。

   开篇先是从处理IO 时的 回调地狱到 Future 模式再到最后的 async，简单概述了下语法层面的各种方式，但 async 也有函数染色的问题。

   后面主要用例子解释了 面临 C10K 问题时 NIO 的必要性。

   最后提到的 Back-Pressure 类似于限流，削峰 的概念。
9. 快餐文分享：

   VasSonic成长历程<https://github.com/Tencent/VasSonic/blob/master/assets/sonic%E5%8F%91%E5%B1%95%E5%8E%86%E7%A8%8B.md>

   文章介绍了 腾讯开源下 专注于首屏性能的全链路项目 VasSonic。

   项目中用了很多奇技淫巧、黑科技，值得学习、借鉴。

   但该项目 不是一个通用的解决方案，客户端、前端、服务端都要同步接入，侵入性太大..
10. ![image-20220104225112978](/files/Vl0vY6uJDwiJPaRwcroG)
11. 快餐文分享：

    Service worker caching and HTTP caching

    <https://web.dev/service-worker-caching-and-http-caching/>

    文章介绍了 SW Cache 与 HTTP 缓存之间的异同，可以看出 SW Cache 使用场景比HTTP Cache 更多样，可以精确控制每个文件的缓存时间，缓存策略，并且使用时也没有 HTTP 缓存的大小限制。
12. 快餐文分享：

    Defensive CSS

    <https://ishadeed.com/article/defensive-css/>

    防御性编程一直以来都是保障稳定性的规范之一，在编写样式时，常见的措施有 stylelint，CSS reset 库，但这些都很通用，太通用就不实用。

    而文中结合实际场景介绍了大量 CSS 防御性编程的案例，有很多都值得学习。
13. 每日一句分享：

    Logging should not do any side effects except writing to the log.

    （Log4j 是今天最亮的一颗星，一己之力 hack 调互联网）

    ![image-20220104225139025](/files/w9ecwKe6o7b3whv8oby0)
14. 分享一本最近读完的书：

    《字节跳动：从0到1的秘密》

    <https://book.douban.com/subject/35544985/>

    我曾经认为，想要创业成功 最直观的方式是解决一个没人没解决过的问题，或者挖掘一个全新的垂类、信息交互场景，然后像大多数创业故事那样一骑绝尘。

    但现在看来 想要创业成功，关键不在于你的 idea，解决方案，因为复制想法的成本很低，就比如文中讲述的抖音发展历程，或者国内那些国民应用。关键应该在于你是否有入场机会，以及有入场机会后 各方面资源的协同 补足性。

    创新与想法不是关键。
15. 好文分享：

    I blew $720 on 100 notebooks from Alibaba and started a Paper Website business

    <https://daily.tinyprojects.dev/paper_website>

    文章介绍了作者的初创项目，整个项目仅来自作者无意间的一个荒诞想法："Can you build a website from a piece of paper?"

    想法虽然很荒诞，但现在 OCR 的识别能力 已经可满足大部分场景，关键难题就延伸成 如何提高识别的准确率，文中作者使用 GPT-3 训练出了一个 spellchecker，然后再将识别出来的内容，生成网页文章。

    当基本满足自己使用后，作者开始考虑产品的商业模式，他使用了常见 saas 产品的订阅服务，一年 3600💲…

    万事俱备后，就差推广了，作者的推广路径很原始，在社区中不停宣传，然后被某专注于高效率办公自媒体发现宣传后，最终获得了流量、客户。同时更大的意义是 它做到了改变人们的写作方式。

    Can you build a website from a piece of paper? People were doing it right now!

    从文章可以看出，一个成功的产品离不开，对可行性产品的挖掘能力，执行力 快速打造mvp，以及根据现有资源的推广。
16. 快餐文分享：

    从消费者行为模式到用户增长模型

    <https://www.biaodianfu.com/consumer-behavior-model.html>

    文章先是梳理了 消费者的行为，包括上图的多种模式，这些模式之间的侧重点不同，整体偏学术；文章后半部分以一些互联网公司的案例 分析了各种用户增加模型，其中模型中指标的深层含义与消费者行为密切关联。

    ![image-20220104225334386](/files/V9BaQxkNwAnQ6HgRwsEl)
17. 快餐文分享：

    Why C# goes well with TypeScript

    <https://nate.org/csharp-and-typescript>

    文章是一篇非常主观 谈编程语言的文章，作者用了很多例子来比较 ts、js 与 csharp 语法的异同，并单独讲了一些 csharp 中设计很赞的语法糖，值得一提的是 ts 与 csharp 都是被 Anders Hejlsberg 设计的，出自大师手笔。
18. 快餐文分享：

    Record, replay and measure user flows

    <https://developer.chrome.com/docs/devtools/recorder/>

    Chrome 将在 97 版本新增 Recorder 特性，可记录保存用户在页面上的操作，回放操作时也可以增加某些步骤编辑，或者做性能评测。 算是自动化场景的杀手锏。
19. 惊讶系列分享：

    Do infinite scroll without JavaScript

    <https://noscript-infinite-catfacts.glitch.me/>

    如何不使用 JS 做到页面无限滚动，自动加载下一页的内容呢？链接中给出了实例。 基本原理是：服务端保持长连接，并且 页面底部有 声明 lazyload 属性的 隐藏 img 元素，每次滚动到底部时，img 发起请求，长连接写入新的内容 + 新的 img 元素。
20. 分享个项目：

    webpack/tapable

    <https://github.com/webpack/tapable>

    该项目是 Webpack 的插件管理库，可单独使用。

    如果你的项目中存在明显的事件流特征，且逻辑依赖之间层次清晰，那么可以尝试使用 Tapable 进一步的划分项目中的流程，将核心逻辑与可插拔的逻辑抽离出来。
21. 每日一句分享：

    能被 Saas 化的产品，终将被 Saas 化。
22. 每日一句分享：

    越是创造性工作，就越不可能把工作和生活分开。

    体力劳动搬砖你可以朝九晚五，下班后脑子里不会想砖头；如果是文艺创作，大部分灵感都来自非创作时的生活见闻。

    干互联网也是如此，下班路上脑子仍然会对设计问题代码问题思索，生活和工作都沉溺在屏幕中。

    <https://twitter.com/ftium4/status/1476127072766820355?s=20>


# 11

1. 每日一句分享：

   The metaverse is bullshit because it already exists, and it's called the internet.
2. 快餐文分享：

   我们一起学习CSS image-set()

   <https://www.zhangxinxu.com/wordpress/2019/11/css-image-set/>

   来自张鑫旭老师的一篇文章，文中采用对话风格，读起来很有趣。 在图片资源优化中，如果只优化 img 元素是不够的，还需要处理另一个图片加载入口 css url 函数。在图片格式兼容中常见的一种方式是使用 picture 元素（不兼容低端机型）承载兜底图，而 css 代表的则是 image-set 属性。

   实践时，可以通过 postcss 插件 来处理。
3. 分享个有趣的项目：

   MangoDB - A truly Open Source MongoDB alternative

   <https://www.mangodb.io/>

   因为 MongoDB 放弃了开源协议，所以社区的替代品出现了。 其技术原理非常有趣，它并不是完全自研的数据库，而是基于 PostgreSQL 做的上层SQL 命令 transform，把 orm 那一套封装到了 db。

   发现 orm 的演进方向有两种，一种是 DB 概念透传，比如 gorm，一种是无视 DB 概念，即你可以在传统 SQL 数据库上 做图数据库，文档数据库的事情，比如 Ent。

   由于复杂度守恒定律，后一种高度抽象的 Orm ，生成的 sql 会比较复杂，效率低。

   ![image-20211201134031069](/files/zufST1FVX08t2kiJgsFW)
4. 分享几篇美团技术博客 产出的性能优化文章：

   其中既有宏观上的综述类文章，比如系统性工程、前端专项的优化措施梳理（1，2）；也有微观上 针对具体场景的探索，比如 Webview、预渲染技术 探讨（3，4）。 这些文章都很值得一看，可以帮我们完善思维框架。

   1. 境外业务性能优化实践

      <https://tech.meituan.com/2018/01/19/overseas-business-performance-optimization-practice.html>
   2. 美团金融平台Web前端技术体系

      <https://tech.meituan.com/2018/03/16/front-end-web-architecture.html>
   3. WebView性能、体验分析与优化

      <https://tech.meituan.com/2017/06/09/webviewperf.html>
   4. 构建时预渲染：网页首帧优化实践

      <https://tech.meituan.com/2018/11/15/first-contentful-paint-practice.html>
5. 分享个有趣的项目：

   ct.css

   <https://github.com/csswizardry/ct>

   通过 css selector 将 head 里阻塞关键路径渲染的资源打印在页面，源码值得一看。
6. 快餐文分享：

   How Partytown's Sync Communication Works

   <https://dev.to/adamdbradley/how-partytown-s-sync-communication-works-4244>

   介绍 Partytown 系列的第二篇文章，该文先是点出了 传统 postMessage 不能胜任其通信场景的问题，然后主要介绍了 WebWorker 同步通信的黑魔法。 简单来说，借助 Ajax 做到 worker 发出、收到消息的同步，但消息会经过 Service Worker proxy ，最终走 postMessage 异步。 感兴趣的同学可以读下源码，设计得还是挺有想法的。

   <https://github.com/BuilderIO/partytown>
7. 工具分享：

   Modern Unix

   收集了常见 unix 命令的现代替代品，列举得还挺全的。

   <https://github.com/ibraheemdev/modern-unix>
8. 快餐文分享：

   HOW TO LEARN COMPILERS: LLVM EDITION

   <https://lowlevelbits.org/how-to-learn-compilers-llvm-edition/>

   文章总结了一些学习资源，从 AST to IR to Machine code 的路径上进行拆分，分门别类的 从三个方面：前端 中端 后端 推荐。
9. 每日一句(误)分享：

   页面性能瓶颈 是要分运行环境的。

   在浏览器最大的瓶颈是单线程模型, 这就是为什么 React 16 提出了 fiber 架构，将组件树渲染过程 增量化。 在跨端 比如小程序、RN、hybrid 的性能瓶颈 除了渲染成本，还有线程通信, 这时 vdom 就起了作用, 可以将多次通信 批量化。

   想要优化 最直接的解决方法是去掉 程序运行时的成本，把运行时的消耗分摊在编译时，比如 Svelte 框架主打的想法。

   除了架构上的优化，更多的是与运行时环境相关，这种场景的优化方案很多了，根据环境一般区分两种：

   1. Web

      用之前看到的一篇文章举例：

      How to Eliminate Render-Blocking Resources: a Deep Dive

      <https://sia.codes/posts/render-blocking-resources/>

      该篇文章属于页面性能方向，一开始介绍了 页面的关键渲染路径是什么，其重要性(用户体验，页面性能，SEO)。 然后通过梳理渲染路径，找出可能阻塞渲染中的资源(CSS，JS-Maybe)并给出造成阻塞的原因，文章后半部分主要围绕着借助 Lighthouse 发现问题，并解决问题来进行。
   2. Hybrid

      常规 Hybrid 的性能是一定大于 Web 性能指标的，很明显 Hybrid 有 Webview 创建的时间，一般会比 Web 的 FCP 大 70-800 ms，但如果优化的足够，就可以在 后台 prerender，达到页面秒开的假象。 这里的优化措施也较明显，preload webview 就好了，参考 东软的专利

      <https://patents.google.com/patent/CN106250434A/zh>。

   除了框架与常见优化外，现在社区有一种新趋势出现，那就是 flutter web 为代表的 canvaskit 渲染(基于 2d 图形库 skia)，但项目初衷 for cross platform，对 performance 有多大正向收益，社区没有这方面的声音，美团官方有产出一篇文章，可以看出并无明显的性能收益。

   FlutterWeb在美团外卖的实践

   <https://tech.meituan.com/2021/03/18/flutterweb-in-meituanwaimai.html>
10. 快餐文分享：

    Developer Tools secrets that shouldn’t be secrets

    <https://christianheilmann.com/2021/11/01/developer-tools-secrets-that-shouldnt-be-secrets/>

    Edge devtool pm 的一篇文章，介绍了下常见 devtool 的一些用法。 其中一条 tip 是使用 snippet 从端上注入脚本。 想到一点是，移动端应用可以通过签名检查防止 反编译，比如 ios 的 公证机制，那 web 端有没有可能做到呢？ 想到一种可能，通过加载后的 dom tree 可以做下快照（预期与实际渲染）对比，然后对比逻辑需要混淆埋到代码中。
11. 快餐文分享：

    Deep dive into Node.js Architecture

    <https://dev.to/altamashali/deep-dive-into-nodejs-architecture-5190>

    一篇介绍 NodeJS EventLoop 的文章，有些偏理论，涉及到 os 层面时 libuv 一笔带过了。

    简单来说，Eventloop 分为三个层面，libuv 只是最上面的应用层，还有内核层与硬件层。 内核层上，os 提供了很多 bio 的机制，比如 select，poll，epoll，或者 信号等。 这些调用对应到 硬件层都绕不开中断，cpu 芯片上的一个引脚，可以让 os 进入到 ring0 处理相应程序。
12. 分享一个开源的浏览器自动化工具：

    <https://www.producthunt.com/posts/automa-2>

    看起来功能很惊艳，通过拖拽 可视化的节点 完成工作流。
13. 每日一句分享：

    "A computer would deserve to be called intelligent if it could deceive a human into believing that it was human" — Alan Turing, Computer scientist
14. 快餐文分享：

    Rust Is The Future of JavaScript Infrastructure

    <https://leerob.io/blog/rust>

    一篇介绍 rust 的软文，列举了 rust 对 js 生态的一些贡献，可弥补哪些生态中缺失的缺失。
15. 惊讶系列分享：

    How To Make A CPU - A Simple Picture Based Explanation

    <https://blog.robertelder.org/how-to-make-a-cpu/>

    虽然我看不懂，但我大为震撼。
16. 快餐文分享：

    What is the async disposer pattern in Javascript

    <https://advancedweb.hu/what-is-the-async-disposer-pattern-in-javascript/>

    文章较基础，讲了一种抽象 生命周期相关逻辑 的编程模式。
17. 快餐文分享：

    JEP draft: Virtual Threads (Preview)

    <https://openjdk.java.net/jeps/8277131>

    OpenJDK 提供用户级线程，该来的终于来了。 可以看出它的实现原理，宏观上与常见的调度程序很像：The JDK implements virtual threads by storing their state, including the stack, on the Java heap. Virtual threads are scheduled by a scheduler in the Java class libraries, whose worker threads mount virtual threads on their backs when the virtual threads are executing, thus becoming their carriers. When a virtual thread parks -- say, when it blocks on some I/O operation or a java.util.concurrent synchronization construct -- it suspends, and the virtual thread's carrier is free to run any other task. When a virtual thread is unparked -- say, by an I/O operation completing -- it is submitted to the scheduler, which, when available, will mount and resume the virtual thread on some carrier thread, not necessarily the same one it ran on previously. In this way, when a virtual thread performs a blocking operation, instead of parking an OS thread, it is suspended by the JVM and another one scheduled in its place, all without blocking any OS threads……

    值得一提的是，openJDK 并没有提出新的语法，而是放到了 Thread 类中，算是最小程度的修改了。
18. 快餐文分享：

    Types of parser combinators

    <https://sgt.hootr.club/molten-matter/types-of-parser-combinators/>

    一篇赞赏 combinator 的文章，文章先是介绍了 parser 在程序中的通用性，后面主要描绘了 highly composable 在 coding 时的好处。
19. 产品分享：

    Layout patterns

    <https://web.dev/patterns/layout/>

    A collection of layout patterns built using modern CSS APIs that will help you build common interfaces such as cards, dynamic grid areas, and full-page layouts.
20. 快餐文分享：

    What's new in Kotlin 1.6.0&#x20;

    ﻿<https://kotlinlang.org/docs/whatsnew16.html>

    文章概括了 Kotlin 16 的 新特性 & change-release 。 其中包括 when 使用场景的提升，模式匹配能力更强；suspend 类型标注更广泛等。
21. Podcast 分享：

    AsyncTalk - 前端的工程化

    <https://podcasts.apple.com/cn/podcast/asynctalk/id1590369272?i=1000542344921>

    播客的主题是关于前端工程化的问题，以及对未来的展望，如何身体力行地去参与创建下一代前端。内容主要三个部分 —— 开发，部署，运维。
22. ![image-20211201134242051](/files/DRWwGvHfA9jQadNtqRAM)
23. 快餐文分享：

    Tmux使用手册

    <http://louiszhai.github.io/2017/09/30/tmux/>

    tmux 是一款优秀的终端复用软件，文章详细介绍 tmux 的使用技巧，配置方式(比我看过的所有文章都更详细)。

    如果不想这么复杂，可以试试 oh-my-tmux，内置了很多开箱即用的配置。

    A: 要有个大屏幕会好一些, 笔记本就别用了,费眼。共享session的特性 , 挺适合交流的。 B: split window 只是 tmux 一个特性而已,复用 session 才是主要功能.

    并且还可以借助 session 管理工具 做到工作流自动化.. 就比如开发时 经常会开启项目相关的 服务器, 编辑器, 本地监控, 某服务的 repl...

    使用 tmuxinator 这种工具 都可以将这些流程自动化.. 一条命令就搞定.
24. 快餐文分享:

    Improve Your Workflow in the Terminal with These fzf Tips

    <https://revelry.co/resources/development/terminal-workflow-fzf/>

    文章介绍了三个使用 fzf 的函数, 通过其模糊匹配窗口交互方式,提升在终端的生活质量. fzf 官方也维护了一份常见的例子,感兴趣的同学可以点开看看.

    <https://github.com/junegunn/fzf/wiki/Examples>
25. 如何安全地网上冲浪……

    ![image-20211201134332478](/files/unWbipCyxIiXWCzNhaCm)
26. 快餐文分享：

    Only 90s Web Developers Remember This

    <https://zachholman.com/posts/only-90s-developers/>

    文章列举了一些古老的前端开发时的代码，正如标题仅有 90 年代的开发者知道…
27. 快餐文分享：

    How JavaScript engines achieve great performance

    <https://blogg.bekk.no/how-javascript-engines-achieve-great-performance-fb0b36601557>

    一篇介绍 V8 编译时优化的文章。包括 V8 的执行原理，hot code 生成时机，对象后 隐藏类的数据结构 以及访问时的内联缓存的优化，还有常见的代码内联机制。 文中有一段话说的很让我认同。

    Think about it. There is no type information. Every single object can gain and lose properties over the lifetime of the program. There are six(!) different kinds of falsy values, and every number is a 64-bit float. As if that wasn’t enough, JavaScript is expected to execute quickly, so you can’t spend a lot of time analyzing and optimizing it either. And yet, JavaScript is fast.
28. 快餐文分享：

    Golang 编程思维和工程实战

    <https://mp.weixin.qq.com/s/llmE9QpnrvA02AtvfHtqJQ>

    文章总结一些常见的编程实战技巧，文中多次使用“优雅” 我是不赞同的，Golang 的优雅只能相对于裸命令式的语言而言..
29. 好文分享：

    Is my cat Turing-complete?

    <https://belaycpp.com/2021/11/24/is-my-cat-turing-complete/>

    一篇十分有趣的文章，作者用严谨的论据证明了 他的小猫咪🐱是图灵完备的。 实际上 作者是想强调开发时不要滥用新特性，指 C++..
30. 快餐文分享：

    Welcome to Fleet!

    <https://blog.jetbrains.com/blog/2021/11/29/welcome-to-fleet/>

    Jetbrains 终于推出一款主打轻量级 对标VSCode 的编辑器，基于 jvm 与 部分 Rust，算是 VSCode native 了……
31. 快餐文分享：

    Defer non-critical CSS

    <https://web.dev/defer-non-critical-css/>

    一直以来 页面关键渲染路径 是影响页面性能的核心因素之一。其中 资源加载的优先级非常重要，虽然 google 最近推出了 lint importance 但距离落地还是有一段时间的，那么现阶段如何手动处理呢？文章给出了一种延迟加载 CSS 不阻塞路径的方案，使用起来比较简单。

<br>


# 10

1. 每日一句分享：

   好的艺术家复制，伟大的艺术家窃取。
2. 快餐文分享：

   Generics in Go

   <https://golangweekly.com/link/114433/b69cdee624>

   文章介绍了泛型的基本概念，1在新版本 Golang 中的打开方式，如何借助内置约束、类型更好地使用等。

   从语法层面上看 增加了上下文的范围 且 借助泛型约束不丢失类型检查能力。

   从编译层面上看 磨平了 操作 不同布局的内存 的差异，让数据更通用。
3. 快餐文分享：

   20 Things I’ve Learned in my 20 Years as a Software Engineer

   <https://www.simplethread.com/20-things-ive-learned-in-my-20-years-as-a-software-engineer/>

   作者回顾多年工作经历，给出了 20 条团队建设，工作规划的建议，内容很直白 且 很多都是通用场景下的。
4. 快餐文分享：

   3 TypeScript Tricks I wish I knew when I learned TypeScript

   <https://www.cstrnt.dev/blog/three-typescript-tricks>

   文章如题，介绍了编程时使用 TS 内置泛型、unknown 的三个技巧。

   其中第一个技巧很受用，使用 Readonly 限制对入参的修改，使函数减少副作用，属于防御性编程一种很好的实践。

   编程时收益最明显的实践之一 就是 写纯函数了，不但可以明显减少 Bug，还因为其不依赖外部上下文，可以随处 Copy。
5. 快餐文分享：

   各流派React状态管理对比和原理实现

   <https://zhuanlan.zhihu.com/p/394106764>

   文章介绍了三种流派的状态管理库，并分别梳理了各自的核心原理，使用差异。
6. 快餐文分享：

   Safer Enums in Go

   <https://golangweekly.com/link/115001/b69cdee624>

   文章探索了 实现枚举的几种方式，从最简单的 iota 开始如何变得越来越完美，文末的例子虽然语义明显，但要增加更多模版代码，语义类型足够了。
7. 工具分享：

   Introducing Sapling: a VS Code Extension for Traversing React Component Hierarchy

   <https://javascript.plainenglish.io/introducing-sapling-a-vs-code-extension-for-traversing-your-react-component-hierarchy-3ac94d95887e>

   文章推广了 一个 VSCode 扩展，在较大的项目中可通过自动构建 Props 依赖树的方式，帮你快速在文件中导航。 看起来是存在一定使用场景的，并足以见得编辑器扩展机制设计的合理性。

   优秀的插件机制是可以构建出生态，反哺本身的。
8. 每日一句分享：

   I think computer viruses should count as life. I think it says something about human nature that the only form of life we have created so far is purely destructive. We’ve created life in our own image.
9. 快餐文分享：

   说一说Web端侧AI

   <https://mp.weixin.qq.com/s/9PoFZVs7jiI992y6MWLqUQ#>

   摘要： AI 正在不断拓展前端的技术边界， 算法的加持也为前端研发注入了全新的力量。 本文为大家介绍什么是端智能，端智能的应用场景以及 Web 端侧实现 AI 的基本原理概念。其中 Web 端的算力支撑比较有趣，GPU 有 WebGPU、WebGL，CPU 有 Webassembly，比较知名的 tensorflow 可以通过设置不同的后端来使用不同的硬件。

   虽然端 AI 目前没有优秀的产品 case，但随着终端发展逐渐多样性，用户交互逐渐趣味性，后续有可能会衍生中其使用场景。
10. 快餐文分享：

    Bringing instant page-loads to the browser through speculative prerendering

    <https://web.dev/speculative-prerendering/>

    文章前半部分介绍了 现代 Web 标准的 prefetch prerender 机制，包括 prefetch 的行为， prerender 的实现（纤细化的 后台 render 进程）。 文中重点讲了社区中知名的两类 prefetch library，也代表了两种流派，一根据可视窗口简单粗暴加载，二根据点击频率数据加载，还有一种流派 根据用户行为比如 hover 某一链接。

    文末梳理了下实验性的一些预加载方案，包括 portal、Speculation rules。
11. 快餐文分享：

    Everything you need to know about Web Renderers in Flutter

    <https://wilsonwilson.dev/articles/flutter-web-renderers/>

    文章介绍了 Flutter 的两种 Render 引擎：HTML、CanvasKit ，并分别介绍了各自的优缺点与使用场景。

    ![image-20211031151031911](/files/hRFBixu0h2yTPY43bAhr)

    可以看出 HTML 中的内容 用 Canvas 完整复刻出来 还是很困难的，尤其是字体渲染的问题。并且 Flutter CanvasKit 使用的 Skia（2D图形库）应该很难支持高帧率的媒体资源。
12. 快餐文分享：

    Why I Hate Frameworks, Benji Smith.

    <https://www.fredrikholmqvist.com/pages/why-i-hate-frameworks.html>

    今日 HN 热文，整篇文章以一种黑色幽默的对话口吻讲述了 主人公买锤子（暗指 Java 框架生态）时遇到的荒诞事情。

    很多时候，我们只需要一个简单的锤子，结果却采用了一个高级通用 可创建锤子工厂的工厂……
13. 快餐文分享：

    Building a static site generator in 100 lines of Rust

    <https://kerkour.com/blog/rust-static-site-generator/>

    使用 一百行 Rust 代码创建一个简单的静态文档生成器。 文章主题与我之前翻译的一篇文章很像，NodeJS 只需要 40 行￼

    <https://tomotoes.com/blog/build-static-site-generator-nodejs/>
14. 快餐文分享：

    136 facts every web dev should know before they burn out and turn to landscape painting or nude modelling

    <https://www.baldurbjarnason.com/2021/100-things-every-web-developer-should-know/>

    一位具有25年资质的开发者 总结出来的各种建议，包括 用户体验，组织架构等等。
15. ![image-20211031151057065](/files/0gDrTnTkobGePqkqn2T8)

    讲好一个故事的基础框架。
16. 快餐文分享：

    How to schedule a task at a specific time in Go

    <https://golangweekly.com/link/115309/b69cdee624>

    内容如题，文中给出了一种 timer 定时 加 select 阻塞的方案。
17. React 官方最近正在重写文档：<https://beta.reactjs.org>，所有的 demo 用 hooks 重写，并增加了可视化图表与在线交互功能。
18. 好文分享：

    Optimizing resource loading with Priority Hints

    <https://web.dev/priority-hints/>

    文章较长，可分为三个方面。

    开头介绍了 浏览器 解析资源的优先级规则（有表格）。 然后主要梳理了，如何通过现有的能力去操控 资源优先级，优化关键路径渲染 提高 lcp，并着重强调了一些 现有能力无法覆盖的 case 。通过这些 case 引出了 importance hint 新特性。 最后讲了下新特性的 roadmap。 文章整体的脉络梳理的比较清楚，能有助我们思维发散。
19. 快餐文分享：

    Getting Started With Webpack

    <https://www.smashingmagazine.com/2021/06/getting-started-webpack/>

    文章介绍了模块化概念在前端的体现，后面花多个章节介绍 Webpack 的基本概念，使用方式，优化配置等。
20. 快餐文分享：

    Web Performance Recipes With Puppeteer

    <https://addyosmani.com/blog/puppeteer-recipes/>

    文章介绍了如何利用无头浏览器做性能统计，客户端环境模拟等优化措施。 文章的最后一个 topic 是梳理代码中使用率报告，之前一直有个想法，想借助无头浏览器做 运行时 的 treeshaking，并非传统编译时的优化。 这个想法从理论是不可行的，因为 终端的逻辑分支、用户交互是不可被穷举的，但有些场景是可以考虑的，比如简单的海报活动。
21. ![image-20211031151147300](/files/yxzxdlHqCDOvB3QiJQ4M)
22. 快餐文分享：

    “社科热”陷阱：年轻人热衷社科，是破圈的假象还是另类的鸡汤？

    <https://mp.weixin.qq.com/s/dC6Jm4uZkV5T-GOVYags8g>

    讲年轻人社科热现象的一篇文章。

    文中摘要：

    传统的鸡汤关注个体的能动性，相信努力就能成功，付出就有收获；社会科学则指出，个体在很多时候是受制于结构的，是身不由己的，人们由此为自己的困扰找到了社会层面的原因，继而把自己的境遇合理化。但，“然后呢？”

    当我们问出这一问题时，便会发现许多年轻人往往止步于此。
23. 分享一篇有关 Golang 调度器模型 GMP 原理的文章，个人认为写的很棒。

    <https://learnku.com/articles/41728>
24. 分享一个有趣项目：

    CookLang – Recipe Markup Language

    <https://cooklang.org>

    看看极客是怎么整理菜谱的……
25. 好文分享：

    Building an effective Image Component

    <https://web.dev/image-component/>

    一篇介绍图片资源优化的综述文。 文章先介绍了图片在页面性能中的权重，未优化的图片对 LCP 造成影响。 然后抛出了图片优化时的一些难点，并借此引出文章的主角 NextJs Image 组件，一个开箱即用的解决方案。 随后重点讲其优化措施，以及面对开发者时 如何在开发体验与性能保障 中取衡。

    文章暴露的问题很明显，不管怎样 性能优化 都要侵入开发层，开发者都要承担其带来的心智成本，关于图片组件优化，理论上可以在编译时 通过 babel plugin 去替换。 理想场景是开发者不必关心媒体资源的优化。

    关于之前提到的 使用 babel 插件做图片格式优化（比如 png 换成 webp、avif 以减轻页面的资源体积），主要是为了将 img native element 换成 一个 集成多种优化方案的 Image 组件。

    但该方案需要侵入开发层，个人开发还好，但团队开发中 制定开发规范是很难推进的。

    如果让开发者无需承载任何心智成本，优化措施就需要集成在运行时。 我们优化的目标就是 Image DOM，而该对象代表的就是 HTMLImageElement。

    那么刚刚说的图片格式替换 的优化措施如下，借助 Proxy、Reflect 做到动态图片资源拦截。

    ![](/files/aX9bcj0QA8gVkc5p0ZG2)

    当然 这也需要静态资源 cdn 边缘计算能力，或者 图片资源打包时的下一代格式的处理。

    ![](/files/r3WawghQBYwY3mSPurkr)

    可以看到 收益非常明显。
26. 每日一句分享：

    张潮在《幽梦影》中说：“人莫乐于闲，非无所事事之谓也。闲则能读书，闲则能游名胜，闲则能交益友，闲则能饮酒，闲则能著书。天下之乐，孰大于是？”
27. ![image-20211031151238820](/files/Wj83F2sOZVxL8uYZA31B)

    常见的工具类型。
28. ![image-20211031151250418](/files/TVEvHXZVd2mVxvbEYCA1)
29. 好文分享：

    Which Programming Languages Use the Least Electricity?

    <https://thenewstack.io/which-programming-languages-use-the-least-electricity/>

    编程语言之间的能量消耗，运行时间，内存占用分析比较。 通过多种程序的 benchmarks 测试，研究者发现 运行时间与能量消耗并不成正相关，但有种趋势是 在大部分场景下 解释型语言的能量消耗，内存占用往往高于编译型语言。在语言范式方面，则是命令式更高，fp oop 都不敌。 导致这些结论的原因也很明了，毕竟慢的语言、范式都是更高一层的抽象，应了那句杨学：复杂度不会凭空消失，只会被转移。
30. Podcast 分享：

    聊聊音视频技术

    <https://podcasts.apple.com/us/podcast/ggtalk/id1440443653?i=1000455980416>

    两年前的一期播客，很多知识依旧受用，介绍了 音视频技术主要包括的内容，对音视频技术的思考和未来前景的分析。

<br>


# 9

忙碌的一个月，精力分配不足..

1. 快餐文分享：

   Why did the web take over desktop and not mobile?

   <https://subconscious.substack.com/p/why-did-the-web-take-over-desktop>

   文章先是介绍了，市场中对称竞争与不对称竞争(It shifts the basis of competition.)的关系。然后阐述了 计算机时代的五个阶段(Each epoch was a shift in the means, mode, and relations of computing. )

   在此抛出了阶段转变中两个关键性的问题： web 如何颠倒了 pc native software; web 为什么没有颠倒 mobile native software.

   第一个问题的答案围绕着 for the network，evolvable 进行(We’re social animals)。 在此阶段 商业模型也随之发生了改变。 可理解为非对称竞争。

   第二个问题的答案很明了，Mobile ate the world 且 hah built the whole vertical slice，商业模式也扩展到 IAP 软件订阅等。 可理解为对称竞争。

   摘抄自文中一句话：

   The main reason I care about the Web is because it's the world's biggest software platform that isn't owned.

   Dave Herman, TC39
2. 快餐文分享：

   10 lesser-known Web APIs you may want to use

   <https://blog.greenroots.info/10-lesser-known-web-apis-you-may-want-to-use>

   文章介绍了一些不常见的 WebAPI，其中 ImageCapture（视频帧捕获）可以将视频流中的帧转换为图片；BroadcastChannel（同源 Tab 广播）看起来可尝试取代 传统 LocalStorage onEvent 的方式。
3. ![image-20211023171413943](/files/6cbj2uNLW8aQFhHqjAWG)
4. 每日一句分享：

   A large fraction of the flaws in software development are due to programmers not fully understanding all the possible states their code may execute in.
5. 之所以 FP 的 Immutable、Pure Function，语言中静态类型被人追捧，就是因为这些理论能在程序中 起到状态约束的作用。

   状态约束对应的逻辑层面，编译层也可做一些内存生命周期的约束，就像 Rust 所有权提倡的那样。
6. 快餐文分享：

   Asynchronous Programming in C#

   <https://news.ycombinator.com/item?id=28641480>

   HN 今日热文，CSharp 异步编程指南，介绍了各种场景下的 pros and cons。 HN 上的讨论也十分精彩，值得一刷，有几种类别： 异步于 CPU 执行时的瓶颈，使用的场景(IO 密集)。 异步于语法层面的心智负担，打开方式。 业界内不同需要对于异步的处理。
7. 快餐文分享：

   Introducing Partytown 🎉: Run Third-Party Scripts From a Web Worker

   <https://dev.to/adamdbradley/introducing-partytown-run-third-party-scripts-from-a-web-worker-2cnp>

   文章先是强调了传统 CRP(关键渲染路径)中阻塞 JS 对性能影响的占比，后续给出了一种独辟蹊径的解决方案，既将所有第三方脚本放到 Worker 中执行，设想一下 没有 JS 的页面对性能的收益是成指数的。

   而 Worker 除了兼容性问题，与主线程还存在异步信息同步的机制。 所以其中最大的难点在于 Worker sandbox 如何同步地读取 main thread 的信息，文中给出的方案是 在代码层增加代理去实现(作者下篇将会讲述原理，感兴趣的同学可以看下源码)。
8. 快餐文分享：

   what's new in react 18?

   <https://yagmurcetintas.com/journal/whats-new-in-react-18>

   文章很长，每个新特性介绍得都很详细。 作者开头先是讲述了一些新特性依赖的基本概念(SSR, Hydration,Suspence)，后面花大章节逐个解释每个新特性的背景，用法，以及之间的联系。

   其中不难看出 React18 把重点放在了两个方面：

   1. 优化 Runtime 的性能： 新特性有 并发模式，所有状态更新批量化，更新区分优先级，懒加载组件。
   2. 为 CSR 渲染阻塞，SSR 网络链路延迟场景提出新的解决方案：流式渲染 - Server Component 流式渲染 已经不是新的概念，10年前 脸书就有了 bigpipe 技术，近些年 CDN 边缘计算也有这方面的倾向。


# 8

1. 快餐文分享:

   Generate a fully-working Go CRUD HTTP API with Ent

   <https://entgo.io/blog/2021/07/29/generate-a-fully-working-go-crud-http-api-with-ent/>

   Ent 是 facebook 开源的图数据库 ORM 框架，底层兼容各种传统型数据库。 文章介绍了一种与 elk(web framework) 结合使用的方式，定义一套 scheme(Ent 提供的规范，属于一种内部 DSL)，执行一次命令，即可生成 CRUD Api (elk cover)与 SQL Command(Ent cover)。 之前的项目中深度用过 Ent，这种根据 DSL 吐出代码的 ORM，比传统的 gorm, xorm 体验增强很多。 因为使用传统 gorm 时，还需要经常接触 SQL 的概念，甚至有时候还需要手写 SQL，这种程度的封装 应该称之为 ORM Lite...

   要么就简单得没有缺陷，要么就复杂得足够简单。
2. ![image-20211023164127009](/files/XiedHHm9aws5bHOf1OuR)

   调用该文件默认导出函数后，该文件在不同线程中会运行两次，一个是主线程等待结果，一 个是子线程做计算。

   用事件做消息通信，符合 NodeJS Event-Loop 思想模型，有趣。
3. 好文分享:

   Running CPU-Bound Tasks in Node.js: Introduction to Worker Threads

   <https://yarin.dev/nodejs-cpu-bound-tasks-worker-threads/>

   文章很长，主要围绕以下三个问题展开:

   1. 什么是 CPU 密集型应用
   2. 为什么 NodeJS 不能胜任 CPU 密集型场景
   3. NodeJS 该如何克服 CPU 密集型额的场景

   文中涉及了很多概念，问题背后的理念讲得非常清楚，属于综述类文章。 这样的文章可以让我们思考，并帮助我们在遇到类似场景时做决策。
4. 每日一句分享:

   "When I see a door with a push sign, I pull first to avoid conflicts" - anonymous
5. 快餐文分享:

   New in Git: switch and restore

   <https://www.banterly.net/2021/07/31/new-in-git-switch-and-restore/>

   文章前半部分介绍了 git checkout 的复杂性，既可以 切换分支，指定 commit，也可以用来回滚工作区文件。 高版本 Git 增加了 git switch 与 git restore 来拆解 git checkout 的功能，文中给出了使用 case。
6. 每日一句分享:

   葬礼越多，科学越进步。
7. 快餐文分享:

   电商巨头的好日子到头了？

   <https://mp.weixin.qq.com/s/7bz_d4h5-eVrlbbxwmHbiQ>

   文章根据一些企业的宏观数据去分析国内电商布局与发展战略。
8. 最近在熟悉 VSCode，分享两篇文章：
   1. 微软官方推出的 VSCode 基础技巧 <https://code.visualstudio.com/docs/getstarted/tips-and-tricks#vscode>
   2. VSCode 那些你可能会用到的功能 <https://vscodecandothat.com/>
9. 快餐文分享:

   腾讯企鹅辅导 H5 性能极致优化

   <https://mp.weixin.qq.com/s/zJMM4SF7pc6LZPCsQfWOxw>

   文章梳理了一套 H5 性能优化的思维框架。
10. 七夕了，刷到了 HN 上一篇爱恨情仇的帖子，vim 党 、Emacs 与现代 IDE之间的派别之争：

    <https://news.ycombinator.com/item?id=9713478>
11. 好文分享：

    JavaScript needs more helper functions for iteration

    <https://2ality.com/2021/08/iteration-helpers.html>

    一篇讨论迭代器特性的好文，文章整体脉络结构很清晰，文章作者也是社区内名气较大的布道者，Deep Javascript 的作者。 文中关于迭代器的解读很有趣，将其使用方式分为生产者与消费者，并用一个个 demo 去论证 helper 函数如何更好地与 customer 结合。

    Deep Javascript 开源电子书：

    <https://exploringjs.com/deep-js/toc.html>
12. 快餐文分享：

    Microfrontends With React

    <https://dev.to/kpiteng/microfrontends-with-react-47jb>

    文章主要给出了一种实践，在 React 工程中 微前端的加载子模块的方式，可以看出对 编译层侵入较多。
13. 快餐文分享:

    Let's build a Full-Text Search engine

    <https://artem.krylysov.com/blog/2020/07/28/lets-build-a-full-text-search-engine/>

    文章介绍了 如何使用 Go 一步步 构建一个简易的全文搜索引擎。 大体流程如下:

    1. 文本处理(分词,去掉常用词,token 小写 不同时态替换, nlp...)
    2. 设计分词的数据结构（倒排索引）
    3. 搜索（根据 关键词分词后命中次数排序）
14. ![image-20211023164336184](/files/lGyTRMHOpryhvnJPxj5p)

    上图只是从语义层面的分析, 实际上 SQL 执行顺序不是完全这样,数据库引擎会做很多优化..

    上图来自于这篇文章.

    SQL queries don't start with SELECT

    <https://jvns.ca/blog/2019/10/03/sql-queries-don-t-start-with-select/>
15. 快餐文分享：

    6 Command Line Tools for Productive Programmers

    <https://earthly.dev/blog/command-line-tools/>

    一些提高生产力的命令行工具。如果你经常生活在终端，推荐阅读。
16. 今日 HN 热文：

    Imba – I have spent 7 years creating a programming language for the web

    <https://news.ycombinator.com/item?id=28207662>

    一栈式 编程语言<https://imba.io/>，除了语法形式的一致性，还内置了一些社区中知名的库，没什么有吸引力的特性。
17. ![image-20211023164422884](/files/YBKnXZ0PblL1sjkus2QL)

    跨端中常见的终端通信机制。
18. 分享个问题:

    因为渲染机制的差异，在大部分场景下 canvas 渲染的性能是高于传统 dom 渲染的，那么问题来了，里面的回答考虑的很全面。

    Does it make sense to create canvas-based UI components?

    <https://stackoverflow.com/questions/6856953/does-it-make-sense-to-create-canvas-based-ui-components>
19. 每日一句分享：

    华尔街的投资家使用各种方法，希望比他人更早获得内部信息。他们向卫星公司购买图片，专门监视美国67,000家大型商场门口的停车场，通过车辆的数量判断商场的生意。据估计，他们使用这种方法，每个季度的收益率可以达到4％至5％，转化成年率就会非常可观。
20. 快餐文分享：

    Practical Uses of CSS Math Functions: calc, clamp, min, max

    <https://moderncss.dev/practical-uses-of-css-math-functions-calc-clamp-min-max/>

    文中介绍了 CSS 中 4 个计算函数，并给出了常见的使用场景，总结得很详细。
21. 快餐文分享:

    今日头条品质优化 - 图文详情页秒开实践

    <https://mp.weixin.qq.com/s/Xqr6rQBbx7XPoBESEFuXJw>

    针对 Webview 场景的性能优化方案。 文章从客户端视角出发，在固定页面结构的情况下(只需考虑数据拉取、注入、渲染)如何应用一系列手段做到体验极致。
22. 快餐文分享：

    How Did Vim Become So Popular

    <https://pragmaticpineapple.com/how-did-vim-become-so-popular/>

    文章概述了 Vim 的历史演进，从上世纪 70 年代的 QED 到 Ed（editor） 再到 Bill Joy 开发的 Ex（Extend ED），然后可视化浪潮的兴起，EX 摇身一变成为了 Vi(Visual)，随后慢慢出现了很多 Vi 变体，其中 Vi Improved 受众最高 且 完全兼容之前的 Vi，也就是现在被人民所选择的 Vim。
23. 快餐文分享：

    Announcing TypeScript 4.4 RC

    <https://devblogs.microsoft.com/typescript/announcing-typescript-4-4-rc/>

    TS 4.4 发布，除了一些类型分析，性能上的优化，语法上新增了 static block(like Java)，编译器层面增加了 内联提示(like kotlin)，node\_modules 导入路径优化。
24. HN 今日热帖：

    <https://how-i-experience-web-today.com>

    现代 Web 站点是什么样子呢？(太过真实)
25. 快餐文分享：

    NodeJS Performance Optimization with Clustering

    <https://blog.bitsrc.io/nodejs-performance-optimization-with-clustering-b52915054cc2>

    NodeJS 通过使用 cluster 来处理网络请求，提高性能的简易教程。
26. 分享篇文章：

    canistilluse.com

    <https://blog.jim-nielsen.com/2021/canistilluse.com/>

    相对于 Web 兼容性查询站点 caniuse ，canistilluse 是什么？为什么会有该产品，浏览器厂商实现标准时 有哪些不合理之处，文章着重介绍了这些事情，透露着一股用户对产品的无奈。
27. ![image-20211023164551932](/files/J5Uqq3qaVsTSywIykCXF)
28. 快餐文分享:

    Pnpm: 最先进的包管理工具

    <https://juejin.cn/post/7001794162970361892>

    文章介绍了，Pnpm 安装复用依赖的机制，又是如何通过系统的 软硬链接 做到 performant npm。 可以看出 前端的包管理器还处于刀耕火种的时代..
29. 快餐文分享:

    The underutilized usefulness of sync.Once

    <https://blog.chuie.io/posts/synconce/>

    文章介绍了 Sync.once 的的含义与数据竞争场景下的使用 case，且还给出了一种用 channel 模拟 once 的 demo。

    Once 在数据竞态下如何保持原子性，就离不开 Go 的 atomic library 了，里面有很多底层指令，汇编代码。
30. 每日一句分享:

    You cannot reduce the complexity of your problem by increasing the complexity of your language.
31. 每日一句分享:

    Somewhere between Objective-C and Swift1-5 you ended up with one framework from the past, one framework from the future, and one tangled mess in the present.

<br>


# 7

1. 每日一句分享:

   100年前的中国，四千个人里面才有一个中学生，其他都是文盲。
2. 快餐文分享:

   张一鸣为什么总有远超他人的认知？

   <https://m.huxiu.com/article/438900.html>

   如果文章后半部分能辩证地去描绘就好了...
3. ![image-20211023161854752](/files/YjW5IP9GQlbOSZqoLH9r)
4. 产品运营的三大目的：

   1. 拉新：拉取新的用户
   2. 留存：活动用户转化实际用户
   3. 促活：老用户激活

   看起来，产品运营做的事情 都是由指标衡量的。
5. 每日一句分享:

   Jevons悖论：业界对节约煤炭研究不会降低煤炭需求，反而会因为提升了煤炭使用效率而加大对煤炭的需求。

   这句话 让我联想到 大牛们发明各种压缩算法，让数据更紧凑..
6. 快餐文分享：

   RenderingNG

   <https://developer.chrome.com/blog/renderingng/>

   Chrome 下一代渲染引擎 RenderingNG 介绍。
7. 每日一句分享：

   人脑可看做一个CPU，整块时间的效率最高，多线程并行会带来上下文切换的不良成本。
8. 每日一句分享:

   苦读十多年，进入顶尖名校，熟悉前沿技术，进入互联网大厂，拿着 996 的高薪，最重要的工作是：骗人多点一下「继续抽奖」。
9. 快餐文分享：

   计算机体系架构——一文读懂Cache（一）

   <https://zhuanlan.zhihu.com/p/386919471>

   关于计算机体系中负责 IO 的缓存，文章脉络很清晰，虽然包含很多方向，但大多只讲个概念。
10. 每日一句分享：

    无论是从 mysql 到 mongodb 到 cassandra 到 time series db，或者从memcached 到 redis，从 lucene 到 solr 到 elasticsearch，从离线批处理到hadoop 到 storm 到 spark 到 flink，技术不是突然出现的，总是站在前人的肩膀上不断演变的。 而要能在浩如烟海的现代互联网技术栈中选择合适的来组装自己的方案，则需要对技术的来源和历史有一定的了解。否则就会出现一些新人张口ELK，闭口tensorflow，然后一个简单的异步消息处理就会让他们张口结舌的现象。
11. 快餐文分享:

    精读《React 18》<https://github.com/ascoders/weekly/blob/master/%E5%89%8D%E6%B2%BF%E6%8A%80%E6%9C%AF/202.%E7%B2%BE%E8%AF%BB%E3%80%8AReact%2018%E3%80%8B.md>

    文章具体分析了 Automatic batching，Concurrent APIS，SSR for Suspense 三大特性的背景概念。
12. 快餐文分享:

    3 Programmers Got Fired (Including Me) Due to a Single App Crash

    <https://betterprogramming.pub/3-programmers-got-fired-including-me-due-to-a-single-app-crash-35d4c94555da>

    一位年轻开发者在初创公司的悲剧，文中处处透漏各种不合理性，失去投资也是情由所原。
13. 每日一句分享:

    产品形态是最上层的抽象，决定了技术架构 底层设计的所有层层面面。
14. 快餐文分享:

    好看视频与B站走向同一战场

    <https://mp.weixin.qq.com/s/UV_rq7k8Fgmh9wq_spHU_w>

    用户需要糖衣，但是长期来看，他也需要药。
15. 分享个小知识:

    在Android7.0及以上的系统中，每个应用可以定义自己的可信CA集。 默认情况下，应用只会信任系统预装的CA证书，而不会信任用户安装的CA证书。 通过代理工具,比如 Charles 安装的证书恰恰正属于用户安装的CA证书，因此会被视作不安全的证书。 如果想在高版本 Android 机上安装 CA 证书, 只能先 Root ...

    如何解决呢?

    1. 换 IOS 手机
    2. 先 Root, 再使用 open-ssl 计算出证书 hash, 重命名为 hash.任意数字 移动到 Android 的系统分区的证书文件夹 即可.
16. ![image-20211023162115474](/files/WqmwIZR4EqWbtE2HCfB2)

    全新的命名规范:

    Reverse-pascal-reverse-snake case
17. 快餐文分享:

    数据上报痛点解决方案

    <https://mp.weixin.qq.com/s/VlgW6r_u6_ZzG6IgiP_PAQ>

    埋点上报如何更好地与业务结合。
18. 每日一句分享:

    年轻人总想发现自己的诗人，并从中发现自己。
19. 分享篇文章：

    30s 源码刨析系列之函数篇

    <https://tomotoes.com/blog/30s-javascript-function/>

    本系列是对名库 30SecondsOfCode 的深入刨析。 本篇是其中的函数篇，可以在极短的时间内培养你的函数式思维。
20. 分享篇掘金的文章，总结了一些常见的命令行工具。

    像闪电划破雨夜，这些开源项目瞬间点亮了漆黑的命令行

    <https://www.toutiao.com/w/a6963938962931073573?only_rec=1&share_token=9b5b751b-0fa8-407e-a2a4-ca0f10b11875&wid=1634977342902>
21. 10 Papers Every Developer Should Read

    <https://michaelfeathers.silvrback.com/10-papers-every-developer-should-read-at-least-twice>

    一篇09年的文章，作者总结了10篇他认为值得一读的计算论文。
22. ![image-20211023162311454](/files/OCiDfRWvSkhEUEDwaeQQ)

    JS 语言的内存区概览。
23. 脊髓是人体的中枢神经传递信号的通路，它的带宽有多大？一个神经科人士估算，可以达到每秒16.625 GB的数据，比 5G 通信的最快速度，还要快几十倍。
24. 快餐文分享:

    Rust and the JVM

    <https://blog.frankel.ch/start-rust/7/>

    文章介绍了 JVM 对于 使用 Rust 时，可以免去 GC 静态标记的痛点，并给出了几种 JVM-Rust 集成方案。
25. 快餐文分享:

    Useful Kotlin Idioms You Should Know

    <https://blog.jetbrains.com/kotlin/2021/07/useful-kotlin-idioms-you-should-know/>

    Kotlin 官方出品的文章，梳理了 Kotlin 的常见特性、风格。入门 Kotlin 之选。

    问题来了，苹果借助 pingfang 字体可以无缝切换，那其他终端该如何实现呢？ 可以看下我两年前写的文章，使用 35 行 JS 代码即可完成。

    网站必备之简繁切换

    <https://tomotoes.com/blog/simplified-chinese-and-traditional-chinese-switching/>
26. 发现了一个产品：

    可以根据输入的 WiFi 名称与密码自动生成二维码，用户可以扫码直接连上 WiFi。

    <https://wificard.io/>

    目前代码已开源，只有一个 web 端，感觉有一些商业价值可待挖掘。
27. The State of Developer Ecosystem 2021

    <https://www.jetbrains.com/lp/devecosystem-2021/>

    本报告展示了 JetBrains 进行的第五次年度开发者生态系统调查的综合结果。 JavaScript 依旧是最受欢迎的语言。

    JS 前端专属篇&#x20;

    <https://www.jetbrains.com/lp/devecosystem-2021/javascript/>&#x20;

    一些有趣的结果: 49% 的受访者使用 React，43% 的受访者使用 Vue.js。
28. 分享期播客:

    <https://moon.fm/share/episode/8303/>

    🎙EP-29.-架构设计与-12fallacy（上）

    播客前部分主要围绕 ThoughtWorks 讨论其影响，与业界互联网公司的 diff。中间大佬们分享了很多面试经历以及如何招人。最后讨论了架构设计上的规范流程。

    可能有同学不太了解 ThoughtWorks ，我简单介绍下，ThoughtWorks 不是常见互联网公司，是 ToB 的咨询公司，在业界非常知名，很多著名的概念，比如 微前端，敏捷开发都是其提出的。 并且ThoughtWorks 的洞见与技术雷达系列文章都非常有质量。
29. 好文分享:

    The Ultimate Guide to Browser-Side Storage

    <https://blog.openreplay.com/the-ultimate-guide-to-browser-side-storage>

    文章梳理了 前端存储数据的各种方式，分成三部分介绍:过去已废弃的方式，现代主流方式，未来实验方式。 并在介绍时梳理了其优点缺点，使用方式，兼容性等。

    IE 模拟 localStorage 用 window\.name 来存储数据真是让我没想到。
30. 每日一句分享:

    如果懒惰意味着缺乏自律，那就是缺点。自律是高生产力所必须具备的条件。但是，如果懒惰意味着不必要的事情一件也不用做，那就是优点。 生产力不等于工作。
31. 快餐文分享:

    利用机器学习通过网页预提取技术加快网站加载速度

    <https://mp.weixin.qq.com/s/S1Yg6wiYkK2lN-5aTp2dqQ>

    文章介绍了如何以机器学习 + SW(Service worker) 作为抓手，去提高网站的性能指标。

    具体原理是通过网站的分析数据(一些站长工具，GA)训练模型，预测用户在网站中可能访问的资源，然后放到 SW 中预加载，来减少网络请求。

    文中整套解决方案的使用场景偏向大型网站(页面数量多，路由复杂)的场景。 像一些中小网站则完全可以枚举出资源，放到 Workerbox(Google推荐的 SW 框架)预加载即可。

    我站点现在的缓存方案就是这样，并且还增加了 用户点击意图捕获，如果用户 hover 一个入口链接超过一定时间(300ms) 则会通过 preload prefetch 这些 meta 标签去预加载资源，且不阻塞主渲染线程。
32. 快餐文分享：

    微信小程序基础架构浅析

    <https://mp.weixin.qq.com/s/h562ECyLiQWkD3JpWXZg-g>

    文章介绍了微信小程序的背景由来，如何通过双线程的架构设计来达成监管与优化体验，后续讲解了与 RN 原生跨端的差异，开发小程序时的规范。

    同样适用于小程序的渲染场景，使用 vdom 将通信成本批量化。

    而小程序除了像 RN 的通信瓶颈，还有 webview 的渲染瓶颈，这就是为什么很多小程序框架(比如 taro)都做了类似于 Svelte 的事情，将 runtime 的时间成本放在编译时。
33. 快餐文分享：

    How to Eliminate Render-Blocking Resources: a Deep Dive

    <https://sia.codes/posts/render-blocking-resources/>

    该篇文章属于页面性能方向，一开始介绍了 页面的关键渲染路径是什么，其重要性(用户体验，页面性能，SEO)。 然后通过梳理渲染路径，找出可能阻塞渲染中的资源(CSS，JS-Maybe)并给出造成阻塞的原因，文章后半部分主要围绕着借助 Lighthouse 发现问题，并解决问题(篇幅很小，建议不全面)来进行。

    ![image-20211023162529776](/files/y0izJ8fWZPOEIiJ1HJpe)
34. 快餐文分享：

    现代 Web 开发困境与破局

    <https://zhuanlan.zhihu.com/p/389935233>

    字节基建(Web 开发引擎)同学的一篇文章，梳理了现代前端开发时不同场景下的各种痛点，针对这些不同的痛点提出了不同的平台化解决方案。

    ![image-20211023162603623](/files/7Wogm7IxcwrGhkOZloYg)
35. ![image-20211023162615666](/files/wpvs3WalEcPBbAdtCVf6)

<br>


# 6

毕设与我只能活一个

1. 把最近开发的毕设上线了一版, 项目的定位是语音社交平台.

   有空的同学可以体验下, 提提意见\~

   <https://github.com/Tomotoes/ITalking>

   <https://italking.tomotoes.com>

   服务器是 香港的, 速度一般..
2. 快餐文分享:

   Stack Overflow Sold to Tech Giant Prosus for $1.8 Billion

   <https://www.zdnet.com/article/stack-overflow-sold-to-europes-prosus-for-1-8bn/>

   Stack Overflow 被 Prosus 收购，成交价 18亿刀，收购方是著名投资机构，也是 腾讯的大股东之一。
3. 最近开发时遇到了一个问题，感觉 开发 React 应用太自由了，稍不注意 逻辑代码就会很分散。

   我指的 逻辑代码差不多是这几方面:

   1. 控制 UI 逻辑
   2. 副作用，网络 IO 逻辑
   3. 状态管理逻辑
   4. 数据转换逻辑
   5. 领域相关逻辑
   6. 埋点逻辑

   这些逻辑的承载地方 有组件内部，HOC 组件，各种 Hooks，State 的 Effect，各种 unity。

   因为 React 应用的搭建方式是 不同组件的组合。 所以把上面提到的逻辑承载 再分散不同层级的组件后，难免会出现不规范的问题。

   并且业界一直提倡 UI 组件与 业务组件分离维护的原则，在实际场景下 其实很难实践，分开的场景有局限性。

   当出现这种情况时，不得不单独抽离出一个 意义为 Provider 的 Wrapper 组件来包裹大部分逻辑..

   只能说，逻辑承载的地方太多，且每个地方能做的事又太广..
4. 每日一句分享:

   每一次统一的努力，都最终变成新的分裂。
5. CodeByExample 系列分享：

   <https://kimh.github.io/clojure-by-example>

   对 Clojure 编程语言感兴趣的同学可以刷一下
6. 快餐文分享：

   Object Oriented Programming Concepts in Rust

   <https://blog.knoldus.com/object-oriented-programming-concepts-in-rust/>

   文章介绍了常见 OOP 概念在 Rust 的体现。 文中最后给了一个 扩展基类的例子。 扩展基类 可以看成，官方暴露了 自定义实现 sdk 的入口。 像常见支持该特性的语言也有很多，比如 JS、Ruby、Kotlin..

   而与该特性类似（改变 native 行为）的有 运算符重载、定义魔法函数。 在我看来，能支持其一的语言都称得上是 "自由"的语言..
7. 每日一句分享：

   架构就是业务的正交分解。每个模块都有它自己的业务。
8. JetBrains 前不久推出了 compose-jb 一种新的编写 GUI 的方式。

   <https://github.com/JetBrains/compose-jb>

   把样式、行为、结构全结合到一个组件内维护.. 这种设计和 Dart 好像.. ![image-20211023151331184](/files/vXWWr0H5GX2xqbBmEtX6)
9. bloom filter: False is always false. True is maybe true.

   布隆过滤器，时间换空间的经典实践。只需存储小范围内的数据，通过多重 hash 则可判断大范围数据是否命中。

   具体原理是 既然一维存在冲突，那就使用多维交叉确认的方式，多维交叉确认可以有效地降低因冲突导致的误判。

   但只是降低误判的概率，并不能完全避免冲突
10. 想到一个点，https tls 1.0 版本的握手过程: 先用非对称加密传输 random key，后续再用 random key 做对称加密，以保证传输的安全性。

    为什么不设计成 双层非对称加密呢？ 我指的是: 先用 自己私钥加密，然后 使用对方公钥加密； 对方收到后用自己私钥解密，再用对方公钥解密，便可以拿到信息。

    我猜测没有设计的原因 一是为了更快 (很显然)；二是更安全 不需要双方都知道互相的公钥，暴露的信息更少。 在现在 如果要使用一个站点的公钥，需要先安装站点签名的机构证书，再用机构的公钥检查。
11. 快餐文分享:

    LEVERAGING GOLANG FOR GAME DEVELOPMENT AND OPERATIONS

    <https://technology.riotgames.com/news/leveraging-golang-game-development-and-operations>

    拳头公司使用 Golang 作为服务端语言的开发实践，文章聚合了多个不同部门工程师的经历。 整体偏软文 不客观(连 duck type 都能舔)，没有什么可以产生思考的线索(可看文章前部分，团队老大的任务罢了..
12. 突然联想到一点。

    关于语言内扩展基类(自定义 sdk) 在操作系统层面上也有相同的概念。

    内核通过中断表的形式向外暴露了基础能力。 而操作系统可以通过动态库的方式扩展。 比如 windows 下的 dll,linux 下的 so 等。 现代编程语言的 library 也是基于 操作系统内置的动态库的上层抽象。

    另外一个关联点是(很主观，可能有误)。

    进程发起中断，系统调度，执行这一过程是在 ring 0 内核态进行的。 众所周知 进程是在 ring 3 用户态执行的。

    其中的关键点在于 每一个进程都可以通过中断 进入内核态执行指令。

    是不是可以理解为 内核被所有进程 shared，或者 内核 是处于 global scope，使用时需要遵守特殊的 中断协议，而一过程中像极了事件回调。
13. 每日一句分享:

    现在获取知识唯一的困难，是知识被淹没在每天不断产生的娱乐、体育、新闻、带节奏、造舆论等信息海洋中，缺少目标、定力和执行力的人会被分散注意力，从而耽于逸乐，主动放弃了学习和自我提升，在物竞天择中失败，选择彻底躺平，那就彻底浪费了这一次人世间的修行了。
14. 分享个工具：

    <https://github.com/banga/git-split-diffs>

    GitHub style split diffs in your terminal
15. 每日一句分享:

    React hooks 发布以后，同事们很想重写公司 App 的大部分代码，只是因为现在有了新的 API。
16. 想到一个有趣的点，可以讨论下。

    服务端架构上的演进，这些年业界摸索出的路线是: 从单体应用 到 亚马逊 大刀阔斧 以ESB(企业服务总线) SOA 架构再到近些年很热闹的微服务(去中心化，去掉总线，以 API 网关、服务治理来管理，且每个服务 组件化...)。

    而服务端演进的每一阶段 如果映射到操作系统上， 我的理解是 从最开始的裸内核(单体应用)到现在传统的事件总线(SOA架构)，连接每一设备，降低设备之间的耦合，系统设计总体的复杂性。

    为什么操作系统没有演进到微服务的阶段呢？既每个设备硬件抽象成独立的服务，之间相互调用。 如果演化成这种类微服务架构，操作系统会发生呢？

    我的猜想是， 为每个硬件设备 添加计算单元，且之间的通信 按照 设计好的标准协议进行。 就像现在 Mesh 服务网格那样\~

    如果是这样的话，可以理解为 冯诺依曼架构的一种变体吧..

    总线模式可以扩展下，它是一种思想，代码层面可以是种设计模式(举个例子，vue 的 状态传递的 bus)，架构层面是服务之间通信的约束.. 思想嘛，可以到处体现的\~
17. 每日一句分享:

    解决单点问题(同一运行时，同一虚拟机，同一物理机，同一机架，同一机房，同一数据中心，同一光纤线路) 最安全的方案是物理层面的异地多活。
18. ![image-20211023151646005](/files/nNCNakmbpXlWOx1rjh3I)

    <https://makelinux.github.io/kernel/map/>

    Linux 内核全景图

    Linux 是传统的宏内核架构，图中多个模块之间相互调用，复杂性不言而喻..
19. 每日一句分享: 兴趣只是开始，而能让人不断投入时间和精力的则是正反馈，是成就感。
20. 好文分享:

    Efficient data transfer through zero copy

    <https://developer.ibm.com/articles/j-zerocopy/>

    文章介绍了 Web 应用的场景下，传统的文件传输与使用零拷贝技术传输的性能差异。

    从 4 次 DMA 传输，优化了 零拷贝的 2 次 DMA 传输。 每一次 DMA 传输意味着 用户/内核态切换，数据拷贝。

    最终文章给出的通过零拷贝技术，传输时间提高 65%，提高了系统的吞吐量。

    零拷贝性能提升的关键在于，省去了在数据传输不需要 CPU 参与。

    文中的两行代码给了很好思考的视角。 File.read(fileDesc, buf, len); Socket.send(socket, buf, len);

    在此过程中一共发生了 4 次数据传输，文中有很详细的解释，感兴趣的同学可以读一下。
21. 知识图谱分享：

    Javascript on one sheet. (and one for algorithms)

    <https://github.com/mechaniac/Map-of-Javascript>
22. 快餐文分享：

    How to Implement a Video Conference with WebRTC and Node

    <https://acidtango.com/thelemoncrunch/how-to-implement-a-video-conference-with-webrtc-and-node/>

    文章前半部分介绍了 WebRTC 建立 P2P 的过程，双端连接时需先交换 SDP 的信息，后续通过 ICE 机制建立通信频道，流程梳理得比较清楚。 后面给出了一个 语音房的 NodeJS 简单实现。
23. 快餐文分享：

    京东商城活动页面构建系统——通天塔

    <https://blog.csdn.net/zl1zl2zl3/article/details/84661421>

    摘要： 通天塔是京东商城内部提供给运营，用以快速搭建活动页面的平台，自2015年第一版上线以来，已历经多个618和双十一的考验。

    关于 京东 low code 平台通天塔的一次简要介绍，涉及了一些技术设计。
24. 每日一句分享：

    callback 的编程方式破坏了屏幕上的顺序和时间顺序的直接映射关系。
25. 突然想到一点，函数式强调的 数据不变性 没有副作用、无状态特征 其实算得上，是 遏制熵增 的最佳实践之一。
26. 分享个项目：

    <https://vivirenremoto.github.io/doomcaptcha/>

    极具创新的新一代验证码形式，在 客户端 完成小游戏 才能通过验证。 虽然具有安全风险，但这创意 实在太棒了。
27. Generic programming centers around the idea of abstracting from concrete, efficient algorithms to obtain generic algorithms that can be combined with different data representations to produce a wide variety of useful software. — Musser, David R.; Stepanov, Alexander A., Generic Programming

    泛型最显而易见的好处就是让数据更通用，底层的本质 抹平了操作 不同内存布局的数据 差异。
28. 快餐文分享：

    官方揭秘！你的颜色是这样算出来的……

    <https://musicfe.dev/color-quiz/>

    文章介绍了 网易云团队开发上周爆品 “主导色” 活动所使用的动效技术，canvas、WebGL、物理引擎，以及 计算主导色的公式（上当了
29. 快餐文分享:

    An Intuition for Lisp Syntax

    <https://stopa.io/post/265?repost=true>

    文章以一种远程绘画的场景为引，一步步实现了 根据远程指令传输来的指令(内部DSL)，实现绘画(组合)出不同效果的功能，结尾给出了 lisp 的等效语法。
30. 每日一句分享:&#x20;

    分治算法要求分割成的子问题，不能有重复子问题，而动态规划正好相反，动态规划之所以高效，就是因为回溯算法实现中存在大量的重复子问题。
31. 快餐文分享：

    从可逆计算看声明式编程

    <https://zhuanlan.zhihu.com/p/85492497>

    文章整体偏学术风格，读起来云雾缭绕.. 术语很多.. (想表达的观点实在是撑不住...
32. 阿姆达尔定律（Amdahl’s Law），程序并行化 计算收益定理:

    优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间
33. 著名的失败预测定理，比尔·盖茨在上世纪 80 年代说的“640K ought to be enough for anyone”。
34. 每日一句分享:&#x20;

    想一个自己从未深入思考的问题是危险的，我们读书是别人替我们思考，我们不过是在重复作者的精神过程而已。所以一个人如果整日读书，他将逐渐失去思考能力。 ——叔本华
35. 为什么 JS Runtime 中除了宏任务还要增加微任务？

    因为宏任务 运行时间的不可控性，提出了微任务，主要是用来满足粒度更小的异步。

    而 Vue 的 nextTick 运行机制是微任务，这与 Vue 的 render 本质不谋而合。

    A: 宏任务一开始是不是只为哪些时间相关的 settimexxx之类的设计的 目前似乎也是这样？ B: 不是吧，宏任务对应的概念是函数栈的创建，全局执行 context 也是宏任务执行中的一环。 通俗来讲，除了那些微任务，所有的代码都可理解为宏任务，比如 setTimout，执行 script 等。

    针对第一句，举个例子: function foo() { setTimeout(foo, 0) }

    是不会爆栈的，因为 每次宏任务的创建都会清空函数栈。

    function foo() { return Promise.resolve().then(foo) } 问题来了，该函数会爆栈吗？

    可以理解成 微任务递归自身..

    C：貌似就是foo函数永远会被放入微任务队列，然后一直执行这个foo。 那应该会爆栈吧，微任务队列的特性就是微任务执行过程中产生的微任务会立即被执行，这样就卡在这个函数这了。

    B: 不会爆栈，会页面假死。 因为会源源不断地产生 新的微任务，然后任务队列一直在当前宏任务执行，既 主线程(UI 线程)无法执行下一宏任务，所以页面假死了。

    卡死与暴栈 关键的差异在于，后者会在内存中保留栈帧，卡死(如果是上面的例子) 会不停地在任务队列中添加新的微任务.. 执行一个添加一个.. 微任务不会保留栈帧，会退出之前的调用栈。
36. 快餐文分享:

    V8 是怎么跑起来的 —— V8 中的对象表示

    <https://www.cnblogs.com/chargeworld/p/12236848.html>

    文章介绍了 V8中对象的结构设计，分为隐藏类(对象的结构)，Property(命名属性)，Element(索性属性)。 而命令属性的存储方式又分为 内属性、快属性、慢属性。

    当索性属性设置成稀疏数组时会自动转换为哈希存储。

    结构相同的对象，为了节省内存，隐藏类是一致的。

    文章探讨了当 CRUD 属性后对象内存的变化，文章整体排版有些乱。 而内属性，快属性，慢属性的设计 与 Java 中 Hashmap 结构 当冲突过多时，由 链表转换为红黑树的思想有些类似。

    都是为了 performance 与 memory 之间的 决策。
37. 衍生阅读:

    Fast properties in V8

    <https://v8.dev/blog/fast-properties>
38. HTTP2 因为支持了 TCP 链接多路复用，在浏览器端 已经没有同一域名 同时最多 6 个请求的限制。
39. 快餐文分享：

    Code Health: To Comment or Not to Comment?

    <https://testing.googleblog.com/2017/07/code-health-to-comment-or-not-to-comment.html>

    Google 介绍声明注释时的一篇短文，列举了什么时候适合，什么时候不适合。
40. 每日一句分享：&#x20;

    训练一个大型 AI 模型会排放近30吨二氧化碳，相当于5辆小汽车终身的二氧化碳排放量（包含制造期间的二氧化碳）。
41. ![image-20211023152324222](/files/qE62N3joSbkve6M4925Y)

    数据单位：byte - kb - mb - gb - tb - pb - eb - zb
42. ![image-20211023152335184](/files/qkQhdCWiECUt0tXdtllE)
43. 快餐文分享：

    Bookmarklets

    <https://www.ph-uhl.com/0010-Bookmarklets/>

    文章介绍了 常见的 bookmarklet，使用书签控制视频播放速度，存档网页等。
44. 每日一句分享:&#x20;

    "To be a programmer is to develop a carefully managed relationship with error." — Ellen Ullman
45. 快餐文分享:

    一觉醒来，竟发现自己看不懂 JS 了？

    <https://mp.weixin.qq.com/s/hsJGjo1j7fBMwcJLMVnSlg>

    列举了一些很有趣的 JS 提案。
46. 快餐文分享:

    State of the Windows: How many layers of UI inconsistencies are in Windows 10?

    <https://ntdotdev.wordpress.com/2021/02/06/state-of-the-windows-how-many-layers-of-ui-inconsistencies-are-in-windows-10/>

    现在的 Windows 系统 融合了 Win10、8、7、XP、2000、95、DOS 各个版本的设计风格。 文章主要剖析了不同系统设计风格的体现。
47. 快餐文分享:

    What Every Programmer Should Know About SSDs

    <https://databasearchitects.blogspot.com/2021/06/what-every-programmer-should-know-about.html>

    文章介绍了 SSD 的写入，读取数据时的一些特性。
48. 每日一句分享:

    函数式组件的名称存在很强的误导性。 在程序中，函数往往代表了一个封装好的执行单元，依据命令去执行。 而函数式组件却是一个有限状态机，在 React 的运行时中存在，会依据不同的指令 渲染不同的状态。

    Finite State Machines: Old State + Input = New State
49. 快餐文分享:

    Everything New In React 18

    <https://dev.to/push9828/everything-new-in-react-18-2mlf>

    文章梳理了一下 React 18 的新特性，我简单总结下:

    1. root.render(\<App />) 可以使用 新的 render api 来获得 18 的新功能，包括 concurrent 特性。
    2. 所有 render 自动批处理
    3. startTransition 对于不紧急或重的 UI 更新可以使用该方法
    4. SuspenseList 组件，Suspense 的父组件
    5. useDeferredValue hooks 可以理解为 useBounce
50. 快餐文分享:

    Drawing Graphics with the CSS Paint API

    <https://tympanus.net/codrops/2021/06/18/drawing-graphics-with-the-css-paint-api/>

    介绍 CSS Houdini 技术的一篇文章，文中给出了一个 Demo，借助 canvas 作为底层渲染来 实现自定义的 CSS 属性。 CSS Houdini 提出了很多年了，到现在 业界也没多少声音..
51. Question:

    渲染网页的过程是发生在 下载 HTML 文件后，还是下载 HTML 文件时？

    Answer：不是的，全程都是流式
52. ![image-20211023152623863](/files/yGsrdbNZx5c7KG7wnhlN)
53. <https://jsisweird.com/>

    JavaScript is a great programming language￼
54. 每日一句分享:

    任何一个产品创意都不会孤立存在，而是都有自己独特的行业定位和上下游资源。
55. 每日一句分享:

    "Code is there to explain the comments to the computer" — Andy Harris

<br>


# 5

毕设和我只能活一个

1. 每日一句分享：&#x20;

   哥德尔命题G：G无法被证明。
2. 分享个工具：&#x20;

   dbcli/mycli - <https://github.com/dbcli/mycli>

   一款自动补全，语法高亮，可恢复历史命令的 MySQL 终端客户端。
3. 分享个小知识：&#x20;

   假设用户 正在访问的是 [www.example.com，如果需要其他子域名也能够访问到正在设置的Cookie值的话，需要它设置为](http://www.example.com，如果需要其他子域名也能够访问到正在设置的Cookie值的话，需要它设置为) example.com 。

   场景：当服务端下发 cookie 时，比如 api.tomotoes.com(服务端) -> italking.tomotoes(客户端)，下发的 Cookie domain 需要设置成 .tomotoes.com这样客户端才能成功保存。

   当客户端访问服务端时，客户端 ajax 库需要开启 withCredentials，并且 服务端跨域配置也要设置 AllowCredentials，这样服务端才能接收。
4. A: 之前讨论过的 服务端无状态 会话管理方案，刚刚在读 gorilla/sessions 源码时，发现已经通过 ScureCookie 机制 实现了...

   哎，为什么每次自己做出了一些具有复杂度的东西，到头来发现 都是前人早已发明的东西... 一到实践，几乎没有我自己的创造，只不过是将 早已知道的方法重新组合起来而已..

   B: 有点妄自菲薄的感觉，其实站在巨人的肩膀上看事物；不一定要成为巨人，多少有点感同身受；这种感觉就好像自己花了很多时间和精力做的曲子；发现前人早就做过了，还比你做的好；

   A: 哎 是啊，算是复读机的自我修养了。

   学得越多，越能意识到 我掌握的东西几乎没有我创造的。&#x20;

   学到新知识是件幸福的事，但不能因此而满足。&#x20;

   就像 Aurora 曾说过： 只有深刻地认识到自己的复读机本质，才真正有想要发出一些新声音的冲动。 因为，世界的意义在世界之外啊。

   B: 我想这是学习的魅力吧 我不太知道程序员对于计算机或是代码有没有自己情感&#x20;

   赋予某种意义相对来说比成为某种意义可能来的自由一点

   A: 当然有了，Coding 就是 创造的过程，而创造就是艺术\~&#x20;

   艺术就值得欣赏，欣赏就会不自觉地附带上主观情感\~

   B: 这句话果然很程序员，那我简单一点讲就是，别在意自己成就感，表达只是表达

   A: 之前经常通过编程 解各种题：算法题、编程模式、小编译器什么的，喜欢把自己的想法通过 Coding 优美地表达出来，如果选择了合适的语言 这一过程就像写诗一样\~

   现在面对的 是领域相关的问题，相比之下 编程中的各种细枝末节 就会显得不那么重要，重要的是对领域的理解。

   B: 我在做音乐的过程中时常会碰到瓶颈；每当我做曲子不顺的时候，我做这是为什么，给别人听，给自己听，装X，还是等等；但最后自己都会得到一个同样的答案；就只是表达而已。

   所以你是被卷了嘛？

   A: 不算被卷，这算是趋势吧，视角从小变大\~
5. 每日一句分享：&#x20;

   读书是很辛苦的。

   因为读数学书的过程就像是在大脑里跑一个解释器，自底向上地从基本概念和公理出发，逐渐组装成一棵枝繁叶茂的树。这个过程需要的时空开销是不小的，所以读数学书，需要反复读、需要举一反三，有的书甚至有大量的练习，称得上是时间黑洞。

   而，读文学类书籍是流式的过程，就像遍历一张线性表。空间开销是常数的，时间开销是线性的。但想象力仍然是重要的，因为大家都知道，从线性表里恢复出非线性的数据结构，似乎需要更多的知识、精力和智慧呢。

   数学之美在于体系之美，文艺之美在于言外之美。
6. 快餐文分享：&#x20;

   Hosting SQLite databases on Github Pages&#x20;

   <https://phiresky.github.io/blog/2021/hosting-sqlite-databases-on-github-pages/>

   文章介绍了作者将 sqlite 编译成 wasm 加载到前端，然后基于 sql.js 实现了一套 HTTP 协议的数据库虚拟环境，而这一切都不需要服务端。
7. ![](/files/Zun6VQypGyh9J0RYee9I)
8. &#x20;每日一句分享：&#x20;

   有些固有的复杂度是不能被eliminated的。&#x20;

   比如引入前端框架的前端代码，只是从一团乱麻变成了另一团乱麻而已。&#x20;

   比如PC的走线，该乱糟糟还是乱糟糟，只不过是把乱糟糟的部分放在看不见的地方罢了。&#x20;

   解决乱麻的方法大致有两种：一种是解决问题，请身经百战的专家来重新设计架构，药到病除。

   另一种是消灭问题，古代有个皇帝看到前人留下的一个几百年都无人破解的死结，他抽出宝剑，一剑斩断了这个死结，于是问题在被消灭的时候就被解决了。&#x20;

   **我们面临的很多问题，很大程度上是“不应该被解决的”，也就是原本就不应存在的问题。深层次的原因还是康威定律。那么，我们只能期待话事人一声令下，说这个事儿不用干了。**

   来自 Aurora 的一则灵感。
9. 每日一句分享：&#x20;

   有三句很好的格言可以指导我们的生活：不要行不道德之事；如果已经行了，不要忏悔；又如果，你已经忏悔了，也绝不要承认。
10. 快餐文分享：&#x20;

    What the heck is time-series data (and why do I need a time-series database)? <https://blog.timescale.com/blog/what-the-heck-is-time-series-data-and-why-do-i-need-a-time-series-database-dcf3b1b18563/>

    文章先是介绍了数据分析的重要性，简述了时序数据库是什么，如何通过时序数据更好地分析数据，是如何工作的。

    文中提了一个有趣的问题，是不是所有数据都具有时序性？显然计算机输入的数据是这样的。
11. 好文分享：&#x20;

    The Humble Element And Core Web Vitals&#x20;

    <https://www.smashingmagazine.com/2021/04/humble-img-element-core-web-vitals/>

    文章讲述了 图片标签的很多相关内容，我简单总结下。

    1. 图片标签是如何影响 Web 核心指标的(LCP, CLS, FID)。
    2. 以及通过使用 LightHouse 分析图片从加载到渲染过程中的各个指数。
    3. 借助现代 Web 标准如何实现 响应式图片。
    4. 为了兼容图片格式的最佳实践。
    5. 图片懒加载属性。
    6. 图片预加载方式。
    7. 设置图片异步解码的属性，这真是头一次见，decoding="async" suggests it’s OK for image decoding to be deferred, meaning the browser can rasterize and display content without images while scheduling an asynchronous decode that is off the critical path.
    8. 实现占位图的方式。
    9. 通过 设置 content-visibility 实现懒渲染
    10. Next.js Image 组件介绍。
12. ![](/files/b2M09eU3uaG736j8dd5N)
13. 快餐文分享：&#x20;

    Facebook 新一代 React 状态管理库 Recoil <https://mp.weixin.qq.com/s/OwYW9v4FooE2IK2AJQePpA>

    文章介绍了 Recoil 的特性，基础使用。 是 Facebook 官方推出的状态管理库，可以简单做个了解\~
14. 发现了个有趣的项目：&#x20;

    hyperscript - <https://hyperscript.org/comparison/>

    使用近自然语言的 DSL 去完成页面交互。
15. 每日一句分享：&#x20;

    上个世纪60年代到80年代，你写好程序，需要提交给大型机运行，然后等待它返回结果。

    现在2020年代，大型机又回来了！它们只是被改称为“云”。
16. 每日一句分享：&#x20;

    我一向认为“提出问题比解决问题更有价值”。

    此书描绘了80年代美国方方面面的细节，据此提出了许多开放问题，没有给出答案。

    用作者的话说就是“提供思维的机会”。这种书就像一串钥匙链，每当你找到一把新的钥匙，就可以把它挂在合适的位置上。

    当你自己找到了足够多的钥匙，你就会发现，你所得到的绝不是打开一扇扇门那么简单，你打开的可能是一片全新的世界。
17. ![image-20211023105042496](/files/AHIjomtDXisEdBNqoLxd)
18. 分享个网站：&#x20;

    Go Proverbs - <https://go-proverbs.github.io/>

    Go 作者 Rob Pike 曾提过的编程思想。 经典语录摘抄：

    1. The bigger the interface, the weaker the abstraction.
    2. A little copying is better than a little dependency.
    3. Don't communicate by sharing memory, share memory by communicating.
19. 每日一句分享：&#x20;

    我们既要承认矛盾的存在、尊重人的个性、维护社会的多样性，更要努力建立共同的价值观、寻找众人利益的最大公约数。&#x20;

    在团结活泼的氛围中，每个人都有自由发展的权利，而不是将社会竖切成互相敌对的若干小圈子。
20. 分享个项目：&#x20;

    google/zx - <https://github.com/google/zx>&#x20;

    A tool for writing better scripts

    设计得有创意，使用 $`command` 作为入口函数，看起来很直观。

    例子： await $`cat package.json | grep name`
21. 快餐文分享：&#x20;

    Note on worker pools in Go&#x20;

    <https://adtac.in/2021/04/23/note-on-worker-pools-in-go.html>

    文章前半部分介绍了 Goruntine 过多时会触发 Go 底层的 double stack 分配，这将潜意识造成性能问题(比如 GC 压力太大)。 文中后半部分给出来一个简单的 worker pool 实现。

    池化 是 资源复用的重要方式之一，对 worker pool 感兴趣的同学，推荐了解下 ants ，一个高性能的 go runtine pool library.
22. 快餐文分享：&#x20;

    漫画 | 三千年的密码战争，人类天才的巅峰对决&#x20;

    <https://mp.weixin.qq.com/s/0xYb6N45ZIuyfIGL07EPZw>

    关于加密技术发展的一些历史。
23. 快餐文分享：&#x20;

    HTML Tips&#x20;

    <https://markodenic.com/html-tips/>

    文章介绍了一些不常见的 HTML 功能。
24. ![image-20211023105232625](/files/KWbYu5t4AQfQ1iATWM9x)
25. 分享一个 simulating macOS's GUI 的个人站点，很炫：

    <https://portfolio.zxh.io/>
26. 每日一句分享：&#x20;

    你个人的项目，应该有四分之一会失败，否则就说明你的冒险精神不够。
27. 每日一句分享:&#x20;

    时刻不忘未知量。（即时刻别忘记你到底想要求什么，问题是什么）莱布尼兹曾经将人的解题思考过程比喻成晃筛子，把脑袋里面的东西都给抖落出来，然后正在搜索的注意力会抓住一切细微的、与问题有关的东西。

    事实上，要做到能够令注意力抓住这些有关的东西，就必须时刻将问题放在注意力层面，否则即使关键的东西抖落出来了也可能没注意到。
28. 快餐文分享:&#x20;

    Next Gen CSS: @container&#x20;

    <https://css-tricks.com/next-gen-css-container/>

    文章介绍了 目前处于 stage-3 的 CSS 新特性 @container，可以根据父元素的尺寸 来动态调整。 用法类似于媒体查询器。

    可以与媒体查询器结合，实现布局上的宏观调整以及微观调整。
29. 快餐文分享：

    Go modules cheat sheet&#x20;

    <https://encore.dev/guide/go.mod>

    文章介绍了 如何通过命令管理 go module(看起来不是很直观)，go.mod 文件介绍，go module 版本管理机制(文中介绍的存疑，如果是自动使用最新版本，而不锁版本，那不同版本之间存在 breaking change 的话，岂不是会有问题)
30. 每日一句分享:

    未来是不确定的。

    人类天生有一种寻求确定性的需要，以及控制周遭的小世界的需求。 我们总是希望听到“你只要这样这样，以后就一定能够那样那样”这类令人窝心的话。&#x20;

    然而与我们的控制错觉相反，这个世界有太多因素是不确定的，除了自身的因素比较可控之外，外界的机遇因素几乎完全不是能够控制或预测的。&#x20;

    我们最多只能做好头脑准备，尽量不错失机遇。 也正因此，你几乎永远也听不到足够有说服力的证据来告诉你“你只要……，就一定能够……”，因为成功并不是仅取决于个人因素的。&#x20;

    个人因素往往只是成功的一个既非充分又非必要的条件，所谓谋事在人，成事在天；但无需悲观，因为毫无疑问，改善个人因素的确能够大大增加成功的几率。
31. 分享个有趣的项目:&#x20;

    长链接生成器&#x20;

    <https://aaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/>&#x20;

    我试了下，生成的链接的确够长...
32. 分享个 CSS Level 5的新特性:&#x20;

    自定义媒体查询器

    @custom-media --narrow-window (max-width: 30em);

    @media (--narrow-window) { /\* narrow window styles \*/ }

    自定义CSS变量，自定义元素(WebComponent)，自定义事件(new Event)，自定义媒体查询器￼
33. 每日一句分享:

    在不同的情境下我们所谓「真实的自己」是完全不同的形象。

    这些不同的「真我」都不是真实的，它们是由情绪、习惯和自己的直觉惯性驱使，在控制和失控同时作用之下显现出的某种人格。

    每个「真我」本质上都是表演，我们只是在扮演「真实的自己」—— 剧本有时来自外界公序良俗和威逼利诱，有时来自个人生活经历和阅读经历，或它们的综合结果。
34. 快餐文分享:&#x20;

    Modern Javascript: Everything you missed over the last 10 years&#x20;

    <https://turriate.com/articles/modern-javascript-everything-you-missed-over-10-years>

    文章简单梳理了下 JS 的一些现代特性、语法。
35. 每日一句分享:&#x20;

    任何设计以及建造同时发生在同一个人身上的心智活动，都是艺术创作。
36. ![image-20211023105414664](/files/I5BRrmDBrfeEkGfZZ4ZS)
37. 快餐文分享:&#x20;

    TEXT EDITING HATES YOU TOO&#x20;

    <https://lord.io/text-editing-hates-you-too/>

    文章从多个方面介绍了 文本编辑领域 开发时的复杂度。 在光标移动，文本选中，输入多种语言 这些符合直觉的场景下，蕴含着 many horror stories..&#x20;

    Windows 系统为文本输入的不同场景 提供了 128 个接口.. 足以见得开发成本是巨大的..
38. 快餐文分享:&#x20;

    Programming and Writing&#x20;

    <http://antirez.com/news/135>

    Redis 作者 9年前的一篇文章，主题如题 探讨了 编程与写作的异同。

    简单总结下: 编程与写作 都是创作的过程，从宏观角度 整个作品需要结构联系合理，从微观角度，都需要由良好的语句构成。 不同点在于产品的部署(小说需要联系出版社..)与开发时的阻塞。
39. Github Readme 终于支持播放视频，只要将视频上传CDN即可。

    一颗栗子: <https://github.com/a327ex/SNKRX/blob/master/README.md>
40. 分享个很 geek 的项目:&#x20;

    generate rss feeds with grep(1), sed(1), and awk(1)&#x20;

    <https://www.romanzolotarev.com/rssg.html>

    通过 148 行 shell 解析HTML Docs，生成 Rss Feed，使用前提是 HTML 需要符合规范，比如 不能出现两个 H1😷
41. ![image-20211023105557354](/files/0tGWLXt8QVTzxkeJBZQw)
42. 浏览器渲染文档的流程。&#x20;

    其中 渲染进程 每个 TAB 一个，GPU 进程 所有 TAB 共享。

    渲染进程 包括三个线程。

    1. 合成线程，负责与 GPU 通信，将位图信息发送到 GPU 线程。
    2. 光栅化 Worker，处理光栅化工作。
    3. 主线程，开发时密切接触的线程，负责解析文档 样式计算，重排重绘等。 而常见的性能优化 也是从主线程切入的。

       更具体应该称之为 浏览器渲染一帧的流程。

       渲染的顺序很重要，样式更新时 应尽可能地减少无意义的步骤，比如常见的 使用 transform 代替 left top 位置更新等。

       并且可以见得 requestIdleCallback 是整个渲染流程的最后一步。

       而 React 早期的 Schedule 机制就是借助该 API，而后续因为经常分不到 timing ，提换成了现在的 MessageChannel。
43. 每日一句分享:&#x20;

    事物的本身是不变的，变得只是人的感觉。
44. 好文分享：

    精读《前端职业规划 - 2021 年》&#x20;

    <https://mp.weixin.qq.com/s/FmJon_hINllggxrVpjRzoQ>

    本文作者是来自阿里的前端工程师 黄子毅老师。 文章从三个大的方面: 知识分类，领域深耕，经济视角分析工程师未来的职业发展。 文章很有价值，没有泛泛而谈。

    我简单从我的视角总结下:&#x20;

    知识分类，文中把工程师额的知识体系分为了 通用知识与领域知识。&#x20;

    通用知识代表的就是计算机基础知识，是工程师的内功，因为更新周期缓慢，体系大而全，其重要性不言而喻。 我们在学习时，除了多总结还应把应用知识理解到通用知识的层面。 就像最近 Google docs 更换 canvas 渲染，为什么会这样设计？canvas 代表了什么底层的基础设施。

    领域知识，一般都会受职业所限制，没有机会 很难接触到。文章中所提的富文本编辑就是一个很好的例子。

    领域深耕，作者把其分成两个方向。 Y 轴 业务方向；X 轴 技术广度方向。 不管是哪个方向，都要求不设边界地发展学习。

    经济视角，文中的一句话 说得很本质: 于打工人视角，公司抹平了产品的成本。 开发不是让我们追求个人的软件成就，而应是实实在在的产出。

    总体而言，为了自身更好地发展，应该不设边界 多学多思考，打磨自己的产出。
45. 快餐文分享:&#x20;

    Half a million lines of Go&#x20;

    <https://blog.khanacademy.org/half-a-million-lines-of-go/>&#x20;

    来自 Khan 官方 blog 的一篇水文，全文只阐述了一个主题: Go 真好用 真先进 我超喜欢..
46. 快餐文分享:&#x20;

    WebAssembly cut Figma's load time by 3x&#x20;

    <https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/>

    文章介绍了 Figma 借助 Webassembly 将产品速度优化了 3 倍的结果，简单阐述了 Webassembly 的概念、发展 与 asm.js 的差异。
47. ![image-20211023105811167](/files/3v7KarQVowtdCdMCVCut)
48. 快餐文分享:&#x20;

    What every developer should know about TCP&#x20;

    <https://robertovitillo.com/what-every-developer-should-know-about-tcp/>

    文章简单介绍了 TCP 的一些概念: 三次握手的流程，两点之间的数据控制机制，拥塞控制算法(有空可以探讨一下传统拥塞窗口与 BBR 算法的改进)。
49. Rust 无 GC 机制的设计理念(控制更多 context):

    Since memory safety in C++ is a major practical issue, it would be great if we can check them statically in a similar manner that static typing does.

    Yes, this was one of the main motivations behind the creation of Rust. Just like C++ compiler tracks type information for each variable, Rust compiler tracks ownership, lifetime, and aliasing for each variable in addition.&#x20;

    相应地 开发者要添加更多标识 并且限制了其他自由地写法，以帮助 compiler 更好地推断 内存异常。
50. 每日一句分享:&#x20;

    现在的开发者需要具备的，不仅仅是技能树，而是技能森林。
51. 快餐文分享：&#x20;

    Soul自己的“soul”是什么？

    <https://mp.weixin.qq.com/s/sfGkkWFTuQAGZbadz44zZw>&#x20;

    如果 soul 成功上市，将成为国内陌生人社交第一股。 文中描写 soul 社交元宇宙玩法挺新颖的，为陌生人社交披上了新的概念。
52. ![image-20211023105931906](/files/jw09WL0tPtbq0FMsF0ha)
53. Servers as they should be&#x20;

    <https://oxide.computer/>

    2022 年的服务器基础设施应该是什么样子。
54. Imagine you've been tasked with the problem of designing the API for a new web service.

    Where would you start?

    At a high level, you'll want to consider which general style of API (REST, RPC, graph, etc) will be the best-fit for your application's business domain. You'll want to settle on a transport protocol (which will probably be HTTP but you might consider WebSocket, or both). And you'll need to choose between a medley of generic serialisation standards (JSON and XML lead the field here), or you might opt for a specialist messaging protocol with plain text (SOAP, OData, GraphQL) or binary message encoding (Thrift, Avro, Protocol Buffers).

    RESTful 已经成为了 CS 模型 最广泛、最直观的 API Style..

    摘录自文章: Should we rebrand REST?&#x20;

    <https://kieranpotts.com/rebranding-rest/>&#x20;

    文章中详细介绍了 RESTful 的概念，适用场景。 RESTful 已经被误解，文章指出 使用 HTTP 方法 去操作资源，只是最淳朴的 HTTP API 而已。
55. 宏 可以不可以理解为是 语言内部的一种 DSL..

    如果实现得很完美，没有任何 bug，可以看作是个 隐藏复杂性的好工具。

    比如 知名 Phoenix 框架，定义路由的方式:

    scope "/", HelloWeb do&#x20;

    &#x20; pipe\_through :browser&#x20;

    &#x20; get "/", PageController, :index&#x20;

    end
56. 快餐文分享:&#x20;

    Announcing TypeScript 4.3&#x20;

    <https://devblogs.microsoft.com/typescript/announcing-typescript-4-3/>

    TS 4.3 发布，增加了 getter setter 类型支持，override 关键字，模板字符串提升，约束泛型提升等功能。
57. 每日一句分享:&#x20;

    计算机科学与计算机无关，就像天文学与望远镜无关。
58. Question: 如何在 Web 中实现端口扫描程序(得知用户电脑 端口使用情况)。

    (静态页面，不借助服务端任何能力)&#x20;

    Answer: 通过 WebSocket 对象
59. SK-II著名的神仙水在中国零售价格为560元，而其制造成本仅为人民币6.5元。就算研发成本都加进去，每单只成本也不超过人民币10元。

    如果10块钱的产品，定价500元，那么多出来的490元用在哪里呢？回答就是用在推广上面，重金投入，千方百计说服消费者愿意出500元购买这个成本10元的产品。所以，美妆类自媒体才可能得到那么多厂商的资源，可以不断做活动。

    摘抄自阮一峰老师的技术周刊。
60. 快餐文分享:&#x20;

    An experiment in helping users and web publishers create deeper connections on Chrome&#x20;

    <https://blog.chromium.org/2021/05/an-experiment-in-helping-users-and-web.html?m=1>

    Chrome 新增了 follow 机制，用户可以 follow 喜欢的网站，当网站出现新内容时，用户会收到推送。 整套机制建立在 RSS 协议上。

    Google 做的好哇。 很久之前 Google 关掉了自家的 rss 软件，如果把 rss 内嵌到 浏览器中的话，一定会大受欢迎。 而 Chrome 也成为了 另一种形式的流量分发平台。
61. 快餐文分享:&#x20;

    Naming Your Lifetimes&#x20;

    <https://www.possiblerust.com/pattern/naming-your-lifetimes>

    良好的命名习惯 会无形中为代码注入更多的 context。 这也算是 UI 的一种形式，只不过 U 是 Developer，I 是文本描述方式。

    传递 Context 很重要，不仅是在 coding 中有所体现，更多是交流中。 多给对方一些信息，不仅能提效，还能培养自己的 credit。
62. 快餐文分享:&#x20;

    Functional programming in Go with generics&#x20;

    <https://ani.dev/2021/05/25/functional-programming-in-go-with-generics/>

    文章介绍了函数式编程的基本概念，以及在未出泛型时 Go 的两种使用方向，后面给出了一个简单的 Demo。&#x20;

    文章比较浅，后面给出的一些 fp repo 倒是可以有空刷一下。 其中有一些 之前看过，整体来说， 在 Go 中学编程范式 不如去看一些应用型的库..
63. ![image-20211023110141559](/files/q3gEJ5bfpOgHttUzpysI)
64. 为什么 esbuild 打包这么快? 我简单总结下:

    1. 编译型语言，不需要解释过程 、JIT，更适合 bundler 这种 run once 场景。
    2. 线程间共享内存，而NodeJS 应用是独立的..
    3. 尽可能地使用在并行。在解析、链接、代码生成 三个环节中，除了链接 其余环节都是全部并行化的，而 go runtine 的合理调度机制 GMP 可保证完全打满 CPU。
    4. 代码全部从零实现，不依赖第三方库，把核心流程都把握在自己手中。微软的 TS parser 既然不把 解析 performance 放在首位，那么我们就自己实现一个。
    5. 内存高效利用。仅需要处理三次 AST 即可，并且整个流程一直处于内存“热区”，同时压缩存储更节省内存。

    最后，摘录官方结尾: Each one of these factors is only a somewhat significant speedup, but together they can result in a bundler that is multiple orders of magnitude faster than other bundlers commonly in use today.
65. 快餐文分享:&#x20;

    QUIC is now RFC 9000&#x20;

    <https://www.fastly.com/blog/quic-is-now-rfc-9000&#x20>;

    QUIC 经过多年发展，已进入了 RFC 阶段，是个利好的消息。但整体 over udp 应该需要基础设施一些妥协。
66. Podcast 分享:&#x20;

    <https://avocadotoast.live/episodes/70/&#x20>;

    🎙#70.-和Vue.js的创造者尤雨溪聊开源软件
67. 快餐文分享:&#x20;

    I quit my job to focus on SerenityOS full time&#x20;

    <https://awesomekling.github.io/I-quit-my-job-to-focus-on-SerenityOS-full-time/>

    SerenityOS 作者的自述，可以见得 热爱是最大的驱动力。 像个造物主一样发明着各种基础设施。

<br>


# 4

暂未分类


# 15-30

暂未分类

1. 4 月 1 - 14 日 汇总分享，共产出 57 条，暂未分类： <https://thinking.tomotoes.com/archives/2021/4/1-14>\
   惊讶系列 2 篇： \
   1\. Making Facebook 2x Faster \
   <https://m.facebook.com/nt/screen/?params=%7B%22note_id%22%3A10158791326312200%7D&path=%2Fnotes%2Fnote%2F&refsrc=https%3A%2F%2Fm.facebook.com%2F&_rdr>

   2\. BigPipe: Pipelining web pages for high performance

   <https://m.facebook.com/nt/screen/?params=%7B%22note_id%22%3A10158791368532200%7D&path=%2Fnotes%2Fnote%2F&refsrc=http%3A%2F%2Fsegmentfault.com%2F&_rdr>\
   好文系列 5 篇： \
   1\. 移动端 JS 引擎哪家强？ \
   <https://mp.weixin.qq.com/s/2cxe1L9_vyB8oNg2jr2rkg>

   2\. CPU 和 GPU - 异构计算的演进与发展 \
   <https://draveness.me//heterogeneous-computing>

   3\. 透过 Rust 探索系统的本原：编程语言 \
   <https://mp.weixin.qq.com/s/ZA-_BARVAWe0Q4eM0lYgwg>

   4\. 沅有芷兮：类型系统的数学之美 \
   <https://mp.weixin.qq.com/s/ieEewizkN7H-11z-PexkGw>\
   5\. 竞争与垄断：几段概念史 \
   <https://mp.weixin.qq.com/s/0dsoNUDDTtIZwE5d2TsAcA>

   快餐文 10 篇。
2. 每日一句分享: \
   国家需要劳动力时，年轻人被要求卖力劳动；国家需要消费者时，年轻人被要求大方购物；当国家需要下一代劳动力和消费者时，年轻人被要求婚育。 ——日本新世代社会学家古市宪寿
3. 快餐文分享: \
   My simple Github project went Viral \
   <https://gourav.io/blog/my-simple-github-project-went-viral>

   文章的作者是 前几天trending上的clone-wars项目的作者，介绍了这个项目的动机，如何实现的过程，给自己带来的收益。

   这种收集汇总的项目，只要花点精力，写好文档，就能有很多 star.. 我愿称之为 markdown 工程师..
4. 好文分享: \
   WHY DOES "=" MEAN ASSIGNMENT? \
   <https://www.hillelwayne.com/equals-as-assignment/> \
   文章介绍了，现代编程语言中 使用 = 做赋值，== 做等于的历史背景。

   从60年代的4大编程语言(COBOL, FORTRAN II, ALGOL-60, and LISP)中，FORTRAN2 首次使用 = 号做初始化与重复赋值。 之后的 ALGOL 60 分支演变出来的语言 CPL,BCPL,B 都沿用了 := 赋值的语法，以及 ML, Ada 都受其影响。 而由于 肯汤姆森(B,GO,UNIX,UTF-8,PLAN-9 等的开发者) 受当时机器内存的限制，提出使用 == 作为判断，减少代码所占内存。

   回到问题，为什么 = 赋值，== 相等判断 成主流呢？因为 C 采用了这些历史设计，并且 C 火了。

   A: 还记得第一次上 C 语言课，我看到 = 赋值，== 判断 的命令式，很不能接受，这与一直以来 数学中符号表达的方式 很相违背。

   B: 当时学 C 语言有很多次因为赋值 与 判错写错的情况

   A: 是的，我人生中的第一个 bug 就是这样来的。

   B: 但现在感觉好像主流编程语言都是使用 == 进行赋值判断 就像最开始学习 vim 不习惯 hjkl

   A: 是的，都是当时历史下的选择.. 从现在的角度去批判，无视过去的现实场景，没有太大意义..
5. 每日一句分享: \
   思考某事和讲述某事是不同的事情。我们思考事物的方式很复杂，有时甚至是不连贯的，而且经常是矛盾的。但是讲述时，我们必须把某事表达得很清晰，可以在很短的时间内说得出来。
6. 程序的 CPU 执行时间 = 时钟周期数 \* 时钟周期时间

   时钟周期时间，在摩尔定律早已放缓的今天，已经很难提高了，除非物理界出现新的突破。

   所以想要程序跑得更快，应该把重点放在 时钟周期数 这一指标。

   时钟周期数 = 每条指令的平均周期数 \* 指令数。

   指令数 依赖于程序以及编译器的优化。

   每条指令的平均周期 因为现在的CPU 执行粒度(原子指令)都相同，取码 解码 执行 写回，所以这一指标可视为常量。

   时钟周期时间 就是 CPU 的主频了，开始超频技术后，会更快一点，但功耗 散热也会更大，可视为常量。

   所以想要程序跑得更快，优化重点就是 减少指令数，这过程离不开 程序设计 以及 编译器优化程度。

   时钟周期 是 CPU 规范的 GHz 指标。 以拯救者 Y9KK为例，CPU 4.1 GHz，这意味着 1 秒 会产生 4.1 G 脉冲信号，即 高低电平转换，也是 时钟周期。

   所以说，现在个人设备 算力早就过剩了。

   而现在的程序员(指应用层) 已经很难接触到底层的魔法了。 领域细分严重，每个人都变成了一个螺丝钉。

   我一直自诩为 吃了互联网红利的一代人，其实这并不是妄自菲薄，我连计算机中基本的数字电路都不了解，怎么敢称之为工程师。只会基本的门电路。
7. 驱动智能硬件(领域专用架构-DSA)的三个重要定律: \
   1\. 摩尔定律 集成电路上可以容纳的晶体管数目在大约每经过18个月便会增加一倍。 \
   2\. 贝尔定律 计算机每10年产生新一代，其设备或用户数增加10倍。 \
   3\. 牧本定律 性能功耗，开发效率 很难同时满足。专用结构 性能功耗优先，通用结构 开发效率优先。
8. 好文分享:

   多核之后，CPU 的发展方向是什么？ - 包云岗的回答 - 知乎 \
   <https://www.zhihu.com/question/20809971/answer/1678502542>

   讲解了 CPU 优化演进的历程，从多核时代迈向领域专用架构中 业界的实践。

   文章很有价值，讲解得非常棒，值得阅读。
9. 每日一句分享: \
   眼睛看不到视网膜，舌头不知道自己的味道，大脑不清楚自己时如何思考…… 这个世界仿佛在尽力杜绝自省的可能性。 一旦自省的递归被触发，就像当年第一个可自我复制的核酸分子那样…… 谁也不知道下一章讲的是什么故事。

   来自 Aurora 一则灵感。
10. 分享期Podcast: \
    Ep-27.-gRPC-and-Python \
    <https://moon.fm/share/episode/5158/>

    本期播客从 gRPC-Python 开发者视角 讨论了 gRPC 的相关问题。 简单总结下，感兴趣的同学可以听下: gRPC 名字的由来。为什么 采用 over http2。protobuf 是什么，如何与 gRPC 结合。gRPC 下一步进展是什么。py-grpc async await 的实现机制。为什么会从更好的load balancer是服务发现。商业开源的讨论。开源的趣事。Py 的性能。

    根据 protobuf 配置文件，生成相关代码，关于代码生成 feature，KiteX(字节开源的rpc框架) 也是支持的。
11. 快餐文分享：\
    String Hashing \
    <https://jorgechavez.dev/2020/11/12/string-hashing/>

    文中介绍了计算 字符串 hash 的一种方式，并给出了 JS 实现。

    ![image-20210430200659943](/files/-MZXkY9CiiyZ_lXxedEx)

    文中有一处很有趣的结论... String Hashing is a technique where we can convert our strings into an Integer which will act as a hash number. Therefore, we will be comparing two hashes hash(A) == hash(B) this will be considered O(1). That’s the best option we can have for comparing two strings.

    哈哈，为了迎合传统时间复杂度的计算方式，忽视 算法实际的花费时间。

    大O计数法就是屑，不要被毒害了..
12. 突然想到一个点，好像 sum type 无处不在...

    Java 中的臭名昭著的 NPE(null pointer exception) 问题, JS 无处不在的 undefinded，Golang 中最常见的 err != nil ... 等等

    从类型系统上审视，假设 null，undefinded, interface{}, 可以赋值为一个具有类型的变量 且不会造成程序 crash。 那么可不可以说，这些十亿美金的错误设计 已经成为了 类型系统中最底层的 sum type 之一\~

    举个最简单的例子，以 Java 为例，很多语言都有类似的场景： String str = "Hello World"; String str = null;

    这两种写法在 Java 中都是合法的，为什么可以把 null 赋值给 String 呢？

    如果把 null 假设成一个类型为 None 的值，从类型上推演的话 String 或者其他的类 更严格的定义如下： String = Optional{ None, java.lang.String }

    或者更彻底一点，Java 中的类 实际类型为：Optional{None, Object}.

    这就造成了 为什么 NPE 问题无法得到优雅处理的问题，哪怕 JDK9 推出了 Optional 类，打算从 sum type 的方式去解决，但效率低下。
13. ![image-20210430200919260](/files/-MZXkcQ9bhHAgvP7_o44)

    Types are moving to the right
14. 每日一句分享： \
    对生命你不妨大胆一点，因为我们始终要失去它。— 尼采
15. 分享期播客: \
    <https://moon.fm/share/episode/5179/> \
    🎙和-PingCAP-CTO-畅谈数据库和编程语言

    时长两个半小时，可以着重听下前半部分，介绍了 pingcap 的创建故事，没错 又是因为 google 的发表论文
16. A: 有没有一些计算机领域的中文播客啊？ \
    B: 我听的比较多的有 捕蛇者说 teahour(已不更新) 内核恐慌 软件那些事
17. ![image-20210430200954654](/files/-MZXkhR6sNPk54aNUUd3)
18. 快餐文分享：

    分布式基础（一）：CAP 的理解 \
    <https://www.qtmuniao.com/2020/02/08/CAP/>

    文章介绍了 CAP 原理的背景故事，并针对 CAP 的定义 逐个解释每条原理的性质，各条性质之间的联系，最后探讨了在设计分布式系统时 如何根据网络环境和业务需求 对 CAP 做取舍。

    摘要：原则是理想情况下的断言，而实践是实际场景下的取舍。
19. 分享篇轻小说： \
    调 bug 的小女孩 \
    <http://liyaos.com/blog/the-little-bug-girl/>

    摘要：但小女孩知道，她所做的是也许世界上最执着于消灭单调的工作。在那方寸代码间的世界里，每天面临的都是一场全新的挑战，而每场挑战都如一次华美的旅行——数据与函数层层抽象，有若蒙德里安的风格画；多线程任务交相辉映，好似巴赫的赋格曲。

    作者文笔很好，虽然文章引用了很多典例名言，但都很恰到好处，与上下文很相溶，丝毫没卖弄文藻的感觉。
20. ![image-20210430201013965](/files/-MZXkpRH1rBvdtkuja3_)

    这种 fetch api 的抽象设计 可太有趣了\~ 直接写原生报文..

    github repo -> <https://github.com/pfrazee/http-template-literal>
21. "海森堡 bug"（heisenbug）指的是在调试时会消失或更改行为的 bug。这个词来自海森堡不确定性原理，当你想精确测量粒子的位置时，它变得不确定了。
22. 好文分享: \
    虚拟内存精粹 \
    <https://strikefreedom.top/memory-management--virtual-memory>

    潘少最新一期的文章，由浅入深地介绍了虚拟内存。 \
    为了满足容量，速度，价格这些特性，现代计算机存储架构不得不进行取舍，设计了一套从上而下的机制: 存储器，三级缓存，RAM，外部持久化IO。 而虚拟内存的提出 就是为了应对主存不够的场景。 文章从宏观视角介绍了 虚拟内存的实现，如何通过引入 页表(虚拟内存映射物理内存的函数)，MMU(翻译虚拟地址)，缺页中断处理等抽象 来完成 内存映射。 \
    后面着重介绍了 利用 TLB(针对虚拟内存的缓存)，多级页表，倒排页表来加速翻译，尽可能地抹平 读取数据的速度差异。
23. 每日一句分享: \
    原则是理想情况下的断言，而实践是实际场景下的取舍。
24. 快餐文分享: \
    <https://brendaneich.com/2008/04/>

    Brendan eich(JS 创始人)介绍了 发明 JS 时的一些背景故事。 进入网景的原因，为什么做成了创立这种语言 而没有选择 java，受商业决策(like java) 不得不引入了 Date 包装对象这些不良的设计，script 标签对安全的取舍等。

    有个文章外的历史，现在的 ecmascript 的规范由来，是网景先找到了 ecma 组织，ecma 成立了 tc39 委员会负责 JS 规范，而第一份规范却是微软 JScript 提给 tc39的。
25. 每日一句分享: \
    我们对幸福过分的渴求毁了生活中的一切，我们渴望的程度就决定了毁坏的程度。如果一个人抛弃了过分的期待，在自己拥有的东西之外不再渴望更多，那么他就能平安顺利地生活下去。 摘抄自《梅克通讯录》

    A: 表达的思想可以概括为:降低欲望，不付出期望。没有任何人，任何事值得过分关心。

    B: 是“不以物喜，不以己悲”吗 \
    C: 降低期望确实会比之前提升很多幸福感 \
    A: 我个人理解是 不要去追求幸福(幸福暗藏着不幸与痛苦)，而是去选择避免痛苦。不付出期望就是避免痛苦的很好实践。 \
    D: 知足常乐就完事了呗 \
    A: 没错，乐观主义些，容易满足的人获取幸福更轻松。 \
    B: 逃避痛苦是非常明智的选择，把痛苦排除了，剩下的就是幸福
26. 好文分享: \
    What’s the “sync.Cond” \
    <https://dtyler.io/articles/2021/04/13/sync_cond/>

    一篇讲解临界区 条件变量的好文。 \
    文章先是介绍了 条件变量的定义，与锁、信号量的差别，条件变量的使用场景是什么，以及 使用锁去实现 条件变量 与 语言中提供的 lib 差别(一个是 push，一个是 pull，性能可想而知)。 文中给出了一个 并发队列容器的例子，从最开始的锁实现条件变量到使用 sync.Cond ，以及如何使用 双重 sync.Cond 优化边界场景，一步步了解 条件变量的深层含义。 文中最后简单讨论了 Spurious Wakeups，在我看来这算是 实现的问题，简单了解下即可。

    一句话来说，条件变量 就是操作 临界资源的一种特例，把操作方式抽象出来了，加上了通知结果 push 唤醒 handler。

    总觉得 关于临界区条件变量的操作，这种使用 mutex 的方式不是很推荐，会增加太多复杂性(因为本身就隐藏了很多操作)。 \
    在 go 中，可以把资源放到 channel，外部 for + select 放到一个 goruntine 接收就好了..
27. <https://github.com/miao-lang/miao-lang> \
    喵语翻译：将人类语言翻译为喵语言。 喵‍‍‍‍‍‍‍‍‌‌‍‌‌‌‍‌‌‌‌‌‌‌‌‌‌‍‍‍‍‍‍‌‌‍喵‌‌‌‌‌‌‌‌‍‌‌‌‍‌‌‌‌‌‌‌‌‌‌‍‌‍‍‍‌‌‍‌‌‍‌‌喵‍‌‌‍‌‌‍‍‍‌‍‌‍‌‌‌‌‍‍‌‌‍‍‍‌‌‌‍‍‍‌‌‌‌‌喵‍‍‌‌‍‌‍‍‌‌‌‌‍‌‌‌‍‌‌‌‌‌‌‌‌‌‌‍‍‍‍‌‌‌‍喵‌‌‌‌‌‍‌‌‌‌‍‍‌‍‍‌‌‍‌‌‌‌‌‌‌‌‍‌‌‌‍‌‌‌‌‌‌喵‌‌‌‌‍‌‍‍‍‍‍‍‌‌‌‍‌‍‌‌‌‌‌‍‍‍‍‍‍‍‍‌‌‍‌喵‌‌‍‌‌‌‌‌‌‌‌‌‌‍‍‍‍‌‌‌‍‌‌‌‌‌‍‌‌‌‌‍‍‌‍‌喵‍‌‌‍‌‌‌‌‍‌‌‌喵。
28. ![image-20210430201237283](/files/-MZXl4iSEIqq-Zm06FsU)

    A: 然后 360 把 java 卸载了 \
    B: 因为垃圾分类的标准不同。Java把垃圾分为干垃圾、湿垃圾、可回收垃圾和有害垃圾；360则认为在座 的都是垃圾。 \
    C: 哈哈哈哈，底下的回答是认真的嘛.. 程序员的黑色幽默。

    还记得大一 在机房电脑上写.net winform 程序，每次一运行，360就提示病毒软件直接干点。 现在懂了，原来是360在执行垃圾回收，而且没有采用染色标记法，没有生代分区，系统都没有 freeze，直接清除。
29. 快餐文分享: \
    Cache API 101 \
    <https://bitsofco.de/cache-api-101/>

    Cache api 一个实验性的API，可用于在客户端缓存网络请求，一般与sw(service worker)搭配使用，在 sw 检测到页面请求时 则可过滤一遍 cache api\~ 目前只有 Chrome 与 Firefox 支持。

    建议使用 workbox(google 的一个开源lib) 实现站点 sw 配置，比手写 cache 方便灵活得多。
30. 快餐文分享: \
    Node.js 16 available now \
    <https://nodejs.medium.com/node-js-16-available-now-7f5099a97e70>

    Nodejs 16 发布，简单总结下文章涉及到的更新: \
    1\. V8 升级到 9.0 版本 \
    2\. 支持 Timer Promise API(不用再写 sleep 函数了) \
    3\. 关于 web api 的一些稳定实现: crypto(加密)，fetch 中断机制等。

    快进到 nvm install 16 吧。
31. 分享个有趣的问题: \
    Why does Python return \[15] for \[0xfor x in (1, 2, 3)]? \
    <https://stackoverflow.com/questions/67083039/why-does-python-return-15-for-0xfor-x-in-1-2-3>

    高赞第一回答，详细解释了发生的原理。 \
    1\. 因为词法分析，会将0xfor 解析成 0xf or. \
    2\. Or 的短路特性，使得后面不会被执行，所以返回了 0xf 常量。

    有趣的是，lua perl ruby 支持 or keyword 的语言都中招了..
32. 快餐文分享: \
    Easier Node.js streams via async iteration \
    <https://2ality.com/2019/11/nodejs-streams-async-iteration.html>

    文章介绍了通过 async gen 函数与 Nodejs stream 结合，如何更好地处理 pipe 数据。
33. 快餐文分享: \
    OS Exceptions OS Wiki\
    <https://wiki.osdev.org/Exceptions>\
    文章总结了操作系统发生错误的类型(Faults 可恢复错误，Traps 执行修复错误指令时的错误，Aborts 不可恢复的错误)。 并列举了常见的错误类型。

    我简单挑几个常见的错误 梳理下。 \
    1\. Page Fault: 程序访问了一个未被映射的页表时，或者 写入一个只读的页表时 会发生，缺页错误 很常见，属于remapping 内存的一种特殊入口，详细可见之前分享的虚拟内存精髓好文。 \
    2\. Invalid Opcode: 一般是程序 编译后的指令集不兼容当前 CPU 造成，就比如新的 sse 指令集运行老的 cpu 上。 \
    3\. General Protection Fault: 一般出现在指令特权级访问的场景，比如在用户态执行内核态指令。 \
    4\. Double Fault: 修复错误指令时发生的错误 \
    5\. Triple Fault: 修复错误指令的错误处理指令发生的错误，OS无法处理这种异常，一般会重启系统。
34. 每日一句分享: \
    我们不肯探索自己本身的价值，我过分看重别人在自己生命中的参与。 于是，孤独不再美好，失去了他人，我们惶恐不安。 --三毛
35. 好文分享: \
    Reflecting on My Failure to Build a Billion-Dollar Company \
    <https://mp.weixin.qq.com/s/Q2IKg77XUxKc6rVMwRdBhQ>

    摘要: 本文来自 Gumroad 创始人 Sahil Lavingia，Gumroad 是一个可以帮助创作者直接面向付费客户的线上平台，刚通过股权众筹的方式完成了一轮估值 1 亿美金的融资。在本文中他主要分享了他创立 Gumroad 期间经历的各种起起落落，以及感悟与收获。

    这篇文章给我印象最深的是，很多时候的成功，绝大部分是市场本身的功劳，和人有一定的关系，但很多时候关系并没有那么大，也就是我们所说的顺势而为。同样，对于成功的定义，除了金钱，应该还有一些其它的方式。

    当一个产品 开始关注造成的影响 大于 其收益时，在我看来 这是为人类创造价值的行为，不管结果如何，都值得尊敬。

    产品影响越大，在社会的生态位就越稳，商业模式的选择会更多，而盈利也是迟早的事情。
36. 基于 Flutter 的 Web 渲染引擎「北海」正式开源 - 阿里云云栖号的文章 - 知乎 <https://zhuanlan.zhihu.com/p/367623268> \
    Kraken 项目愿景挺赞的，一个 better webview over flutter。

    还可以定制化现在 web 的能力，通过 flutter plugin 从渲染引擎层面打破 开发的局限，比如文章提到的定义 css rule，event。
37. 好文分享: \
    The suspend modifier — under the hood \
    <https://medium.com/androiddevelopers/the-suspend-modifier-under-the-hood-b7ce46af624f>

    文章介绍了 Kotlin 是如何在编译层 基于 CPS 变换 实现了 coruntine。 实现机制很精妙，让我一度想起 tj 写的 co 函数。 不借助 任何并发原语 只通过FSM(有限状态机) 加 管理流程的 Context 参数 实现 yield 与 resume。

    而且如果 suspend func 没有其他 suspend func，则不会生成额外的字节码。 这在我看来 Kotlin 的 suspend func 比现在的 feature promise async awit 等异步机制，写起来更简洁，心智成本更小，还不会造成函数染色的问题。

    文章介绍得很详细，感兴趣的同学可以刷一下。

    一句话解释 Kotlin suspend func ： 一个 automate await 的 async func，且返回 值 sum type，可以更好地handle exception.
38. 每日一句分享： \
    如果有人在电话里说有害的言论，你不会让电话公司负责。我们也应该这样对待网站。

    \-- 扎克伯格
39. 快餐文分享： \
    Tiny Container Challenge: Building a 6kB Containerized HTTP Server! \
    <https://devopsdirective.com/posts/2021/04/tiny-container-image> \
    文章介绍了如何从943mb的Nodejs 服务器容器一步步简化成6.34kb 汇编服务器容器。
40. 分享期视频： \
    从神秘发家、买壳上市、三夺首富，到身陷囹圄，深挖黄光裕二十年商海旧事 \
    <https://www.youtube.com/watch?v=62u7EUCWoeo>

    该系列一共3集，时长50分钟。 介绍了 黄是如何从一个穷小子起家，国美是如何从一个小作坊一步步做起来的？ 以及 黄在资本市场的一系列运作，如何从中国首富神坛跌落到囚犯的？ 期间黄家与国美职业经理人之间的战争，资本视角下的道德与利益权衡介绍地很精彩。

    摘要：时代不负有心人、时代不等任何人。

    如果黄家没有赢得 企业控制权，资本继续站边陈晓，现在的国美会不会发展得更好呢？ 很早 陈晓就为国美布局了电商，而黄显然没有重视 或者 认清所处的时代红利是什么？

    这期视频也只是从商业角度去挖掘了黄与国美生涯的一些重要转折、发展阶段，而真正的故事应该是什么样，就不为人知了。

    时代的弄潮儿就算再耀眼，可终究还是要 服从大海的意志。
41. 分享期播客：\
    <https://moon.fm/share/episode/5337/> \
    🎙#73.-分布式文件系统

    讨论了文件系统的历史， raid 冗余磁盘阵列的诞生故事，现代分布式文件系统与 Google 的渊源，GFS/Hadoop 与 raid 的相似之处。 整体过程 涉及了一些文件存储专门领域知识，最后着重讲了 对象存储。
42. ![image-20210430201736970](/files/-MZXm5UifGI9eM9tGPwE)

    A: 没想到 刷番剧还能碰到使用 cookie session 做会话管理的场景..

    不过这个Session ID 生成看起来是有问题的.. 没有借助中间件，靠 sdk 提供的伪随机数 + while true 判断重复.. 不提倡.. \
    B: 哪部番

    A: 小林家的龙女仆，真正的驯龙高手，B站有，敲治愈～

    A: 有空可以讨论下 生成 全局UUID(比如上面的 session id) 的常见实践～ \
    C: 全局？我直接上一手uuid api。雪花算法和uuid算法比较常见吧。数据库自增id也可。分布式也没啥问题 \
    A: 数据库自增id 可以保证唯一性，就是性能一般\~ 毕竟与外部io交互..Redis 保证 id 唯一性也可以\~

    C: 我觉得基本上uuid算法就够了，概率上来说 冲突的可能性还是太小了 \
    A: 是这样的，但是如果 session id 出现重复那就麻烦了.. 雪花算法 看起来是一种方案，时间维度 + 同一时间机器id，冲突概率会非常低..
43. 快餐文分享： \
    Use Google like a pro \
    <https://markodenic.com/use-google-like-a-pro/>

    文章介绍了 Google 时一些常见技巧，简单总结下： \
    1\. "Content" 准确搜索 \
    2\. AND(both match), OR(匹配其中一个),\* (any match ) - (exclude) \
    3\. site: 在搜索 特定网站的爬取链接，filetype 指定文件类型 \
    4\. 2016..2018 特定年份 after:2018，before:2018 有点像 git log 的 filter\~
44. Question: 实现图片热区(在图片的某个范围上增加点击事件)的最佳实践是什么？

    答案是 HTML `<area>` Tag <https://www.w3schools.com/tags/tag_area.asp>
45. 快餐文分享： \
    How to Leverage the Fullscreen API… and Style It \
    <https://css-tricks.com/how-to-leverage-the-fullscreen-api-and-style-it/>

    文章介绍了有关 full screen 的 API。 如何做全屏 toggle，如何定义全屏样式。
46. 每日一句分享： \
    我认为，对人工智能的恐惧，大多数情况下，就是对资本主义的恐惧。我们担心资本主义将如何通过技术来利用我们。

    现在，技术与资本主义息息相关，已经很难区分两者了。
47. The problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle.

    \-- Erlang 发明者 Joe Armstrong 谈 OOP.

    还记得之前读《Java 编程思想》 开篇有一段话给我留下很深的印象: Java 的定位是从大型组织有序的包和模块中获益的编程语言。

    不是快速完成功能的脚本语言。

    而现在国内普通高校中常见的编程语言就是 Java，这对最开始编程思想的养成 不是一个最好的选择。 上来就学OOP的三大特性，而三大特性本身就是不正确的。

    封装是个常见的概念，一个函数就是一个封装。 继承最开始也不是OOP的设计宗旨，更好的选择应该是组合 与 mixin。 多态只是类型系统的向下转型，或者遵守 contract (接口) 规范。

    真正的 OOP 特性应该是 万物皆 model 的概念 以及 消息传递的特性。
48. 快餐文分享： \
    The BFF Pattern (Backend for Frontend): An Introduction \
    <https://blog.bitsrc.io/bff-pattern-backend-for-frontend-an-introduction-e4fa965128bf>

    文章介绍了 BFF 的使用场景，提出的意义，相比与传统通信 其优势是什么，其模式的最佳实践探讨。 感觉使用场景很局限，一是为了更好地 combine、filter 数据，二是 为了抹平 微服务 过度模块化带来的影响，提出了这一中间层模式。 \
    在我看来，BFF 更像是 为了服务端架构设计不合理的妥协。 \
    或许过于复杂的项目，设计时总会有不合理的地方，毕竟需要考虑的地方很多。
49. 快餐文分享： \
    An Introduction to WebRTC App Development \
    <https://hackernoon.com/an-introduction-to-webrtc-app-development-3t1m23lr> \
    文章简单介绍了 WebRTC 是什么，STUN TURN 的作用(这两个重要的infra 文章说的很少，我补充下: STUN 服务是为了 exchange 握手信息，做为一个中继者的角色，如果 P2P 打通 则双端正常通信，而因为 NAT 或者 Firewall 无法通信时，TURN 则会作为 中转流量服务器 让双端间接通信，可以见得 很吃服务器的带宽 性能，这也是为什么 WebRTC PaaS 这么贵的原因)。

    文章主要的精彩之处，在于介绍 WebRTC 对于 media data 的压缩方法(VP9 的算法原理)，针对每一帧与前一帧做 diff，传递 diff 信息而不是 whole state，这带来的后果是 丢一帧则会影响下一帧。

    而文章后续水得一批... 还打了个软广..
50. Question: Git commit 保存的是 diff 还是 snapshot？

    A: diff？ \
    B: 我之前也是这么想的\~ 直到前不久我看到了一篇文章.. \
    Commits are snapshots, not diffs \
    <https://github.blog/2020-12-17-commits-are-snapshots-not-diffs/>
51. 每日一句分享: \
    对于软件中的缺陷，不同阶段被发现会导致非常不同的解决时间：
    1. 不要引入任何缺陷（可惜我们是人，不是神，这不现实）—— 无需解决时间
    2. 当敲下代码的那一刻，有缺陷的地方就能够被捕获到（很多语言的 language server 已经在做这样的事情了）—— 秒级
    3. 在编译时被捕获到 —— 秒级到分钟级
    4. 在 UT 时被捕获到 —— 分钟级
    5. 在 CI 时被捕获到 —— 分钟级到小时级
    6. 在 code review 时被捕获到 —— 分钟级到天级
    7. 在 End-to-End test / QA 时被捕获到 —— 小时级到天级
    8. 在部署后被捕获到 —— 若干小时，若干天，甚至若干月之后
    9. 部署后被用户捕获到 —— 若干天，若干月，甚至若干年之后（也许永远无法解决 —— 很难复现）
52. 分享道题目： \
    Nesting Structure Comparison <https://www.codewars.com/kata/520446778469526ec0000001/train/javascript>

    判断两个数组是否结构相同，你想到最快的方案是什么？

    // should return true \[ 1, \[ 1, 1 ] ].sameStructureAs( \[ 2, \[ 2, 2 ] ] );

    // should return false \[ \[ \[ ], \[ ] ] ].sameStructureAs( \[ \[ 1, 1 ] ] ); \
    A: 先转化成字符串，从左到右的比较 \
    B: 我也是这个想法\~ \
    ![image-20210430202114461](/files/-MZXmT-3LMyVM-__75J3)
53. 分享道之前刷过的一题，属于印象较深刻的：

    Evaluate mathematical expression <https://www.codewars.com/kata/52a78825cdfc2cfc87000005/train/javascript>

    实现一个 针对数学表达式的计算程序，不能使用 eval or new Function 表达式中 可以有无限 括号嵌套，负数，浮点数。

    一个 case： except('2 / (2 + 3) \* 4.33 - -6', 7.732 )
54. 每日一句分享: \
    无数渺小的思考 填满了人的一生。
55. 快餐文分享: \
    CSS Tips \
    <https://markodenic.com/css-tips/>

    文章介绍了一些不常见的现代 CSS Rule 与 一些常见组件使用 CSS 实现的技巧。
56. 突然发现 @babel/plugin-transform-regenerator (针对于 yield 的 transformer)，生成后的代码 是一个类似于 kotlin suspend 函数编译后的 状态机，异曲同工..

    <https://babeljs.io/docs/en/babel-plugin-transform-regenerator>
57. 好文分享: \
    图解 Functor, Applicative 和 Monad \
    <http://blog.forec.cn/2017/03/02/translation-adit-faamip/>

    经典老文了，介绍了 Functor, Applicative,Monad，深入读过一遍 收获很多。

    Functor 将一个普通函数应用到被封装的值上，可以理解为 Box 类型 或者 可 Mapable 数组，函数复合。

    Applicative 将一个封装的函数应用到封装值上。 可以理解为 Box(fn).apply(Box(value))，属于一种更强大的 functor，可以让 函数接受多个参数，类似于被包裹的 curry 机制。 Functor 实质上就是 map 一次的 Aplicative。

    Monad 将一个 “接受一个普通值并回传一个被封装的值” 的函数应用到一个被封装的值上。

    用一个例子理解:

    ```javascript
    const arr1 = [1, 2, 3, 4]; 
    arr1.flatMap(x => [x * 2]); 
    // [2, 4, 6, 8]
    ```

    实现了 flatMap 或者 chain 的类型，可以更好地处理函数链中传递的context.
58. 快餐文分享: \
    A Brief, Incomplete, and Mostly Wrong History of Programming Languages \
    <http://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html>

    文章介绍了各种编程语言诞生 设计 流行的梗，太搞了..

    关于 Haskell 如下(中文翻译后): 一个单子（Monad）说白了不过就是自函子范畴上的一个幺半群而已，这有什么难以理解的？
59. 快餐文分享: \
    My current HTML boilerplate \
    <https://www.matuzo.at/blog/html-boilerplate/>

    文章逐行介绍了作者使用的 HTML 模板，包括 Docs 声明，常见的 meta 标签等。
60. 快餐文分享: \
    Scala Syntax for Java Developers \
    <https://itnext.io/scala-syntax-for-java-developers-69734ce17cdf>

    文章介绍了 Scala 与 Java 通用语法的异同。 Scala 调用方法时，the parenthesis can be omitted. 真是好蠢的设计..
61. 想到了有趣的点，关于传统前端开发 与 MVC 架构。

    假设 DOM 是 Model，浏览器视窗是 View，JS 是 Controller。

    当用户从 View fires event，Controller 处理，更改 Model，rerender View。

    有趣的一点是在传统前端开发中， View 即是 Model 的 输出，又是 Controller 的输入。

    那么传统前端开发 与现代前端框架 MVVM 架构，比如御三家(Vue React Angular) 又有什么差别呢？

    最显然的差别就是去掉了 Controller，也就是去掉了上面提到的 Controller 接收 View 发出的 instruction，然后修改 Model 的流程。

    而去掉这一流程，MVVM 做了哪些工作，又做出了哪些提升。

    最重要的是，关于 Model 抽象概念的提升，Model 不再是 DOM，而是 应用中的 State。这一点很重要。

    State 更新则会 DOM 更新。

    State 的定位不仅是简单的 Model，而是可以 发出 DataChange 的 Model。

    既 Controller 接收指令 渲染 Model 的工作放到了 全新的 State Model 中。

    从更深远的角度考虑，MVVM 是 GUI 应用开发 一种意义非凡的架构。

    那么问题来了，MVVM 缺点是什么？

    最显然的就是违背了 软件工程提倡的单一原则(这种原则 没有根据场景就提出，都是屑￼)

    其他缺点就是关于 DataChange 的实现机制了，Vue 与 React 采用了两种不同的方式，之前有讨论过。

    还有 Svelte ，属于三种不同的实现机制。
62. Question: 流量调度 可以在哪些层实现？

    1. 基础设施层，DNS
    2. 网络层，比如 LVS
    3. 应用层，比如 Nginx

    A: Lvs是转换mac地址吗还是网络地址啊 \
    B: Mac 地址
63. 分享篇文章: \
    职业选手和业余选手 \
    <https://yinwang1.wordpress.com/2021/04/29/professional-amateur/>

    垠神最近的一篇文章。 \
    摘要: Mac 地址 对于我来说，“专业”或者“职业”（professional）这个词不再意味着水平高，而只是意味着你要以这个事情为生。也就是说，你得靠它挣钱，不做这个事情你就活不了。进一步的意思就是说，作为一个“职业选手”，你可能会为了钱而去做你不喜欢的事情，而不是只做你喜欢的事情。
64. 「直播回放」Go语言并发调度器和网络模型解析 - 腾讯技术工程的视频 - 知乎 <https://www.zhihu.com/zvideo/1371214468270071808>

    分享期视频，内容包括 Go GMP 调度机制，如何更好地榨干系统资源； Go 网络 IO 模型，如何基于 多路复用 在用户态完成 connection 分发；以及 Go 的网络优化(软广部分)。 \
    视频很干，干货很多。
65. 分享则推： \
    <https://twitter.com/mrcatacroquer/status/1386318806411325440?s=05> \
    近日一国外小伙，使用树莓派发明了个名为 Yayagram 老人关爱机，可通过 telegram 将文字，语音发送到 对方，该推 介绍了其特性与工作机制。

    ![image-20210430202545896](/files/-MZXml2O5IRJHvEmHimv)

    看起来还是挺实用的。

    之前也做过一些智能硬件(Arduino)项目，通过天气、设定条件 自动调节 各种小灯，屏幕 啥的.. 与其相比，愿景差远了。
66. 每日一句分享： \
    在泰国工作的人，都说那是一个很糟糕的地方；在泰国休假的人，都说那个地方好极了。
67. 一家创业公司推出了数字画框。挂在墙上，它会自动将精选的艺术品推送到显示屏，定时更新。

    来自阮一峰老师最新的周刊。

    ![image-20210430202643769](/files/-MZXmp6dtknQ9DssVahl)

    感觉这数字画框有一定商业价值啊。
68. 快餐文分享： \
    前端性能优化：当页面渲染遇上边缘计算 \
    <https://segmentfault.com/a/1190000022762247>

    文章介绍了 如何通过CDN 边缘计算的能力，让动态页面更快地渲染。 可理解为将最基本的 Docs 请求，在连接时做解析，获取页面中 外部资源，并拉取，返回页面时 又分为整个页面返回(ssr)，或类似于脸书 bigpipe 技术的动态返回。 文中将其称为了 瀑布流式 与 嵌入式。


# 1-14

暂未分类

1. 3 月分享汇总：

   1-18：<https://thinking.tomotoes.com/archives/2021/3/1-18>

   共分享：136 条，其中 好文 6 条 快餐文 21 条。

   19 - 31：<https://thinking.tomotoes.com/archives/2021/3/19-31>

   共分享：93 条，其中 好文 10 条 快餐文 17 条。
2. 每日一句分享:

   什么时候最适合做垃圾回收？当没有人进行观察时。用一颗摄像头对眼球进行追踪，当对象的眼睛离开屏幕时就执行垃圾回收。

   When is the best time to do a GC? When nobody is looking. Using camera to track eye movement when subject looks away do a GC. -- Richard Hudson
3. ![image-20210414205617564](/files/-MYF_fcN-vgwsSMa12xw)

   淳朴的语义表达。
4. 惊讶系列分享: \
   Making Facebook 2x Faster

   <https://m.facebook.com/nt/screen/?params=%7B%22note_id%22%3A10158791326312200%7D&path=%2Fnotes%2Fnote%2F&refsrc=https%3A%2F%2Fm.facebook.com%2F&_rdr>

   这是一篇 10 年前，脸书工程师写的文章，介绍了如何从 网络时间，服务响应时间，页面渲染时间 三个阶段优化 站点 TTI 指标。

   其中 优化网络时间 需要发起更少的请求，请求更小的资源。 服务器响应时间 没有展开说，因为这一阶段是完全可控的。 除了传统的优化技巧，脸书工程师 重点优化了 可复用资源的请求 与 查分 过程。 并且开发了 Primer 作为关键JS文件的本地缓存管理库。 另一个杀手锏 就是 bigpipe，将服务器响应时间 与 渲染时间 增量化，从页面单位， 划分成业务组件单位(这与React Server component 的概念 很相近)。 从另一个角度思考，是将服务器 与 客户端 并发化，这是一个创新型的技术。

   关于 bigpipe 摘要: \
   We've overlapped a significant portion of the generation time with the render time which will reduce the overall TTI experienced by the user.

   BigPipe is a fundamental redesign of the dynamic web page serving system. The general idea is to decompose web pages into small chunks called pagelets, and pipeline them through several execution stages inside web servers and browsers. This is similar to the pipelining performed by most modern microprocessors: multiple instructions are pipelined through different execution units of the processor to achieve the best performance. Although BigPipe is a fundamental redesign of the existing web serving process, it does not require changing existing web browsers or servers; it is implemented entirely in PHP and JavaScript.
5. 惊讶系列分享: \
   BigPipe: Pipelining web pages for high performance

   <https://m.facebook.com/nt/screen/?params=%7B%22note_id%22%3A10158791368532200%7D&path=%2Fnotes%2Fnote%2F&refsrc=http%3A%2F%2Fsegmentfault.com%2F&_rdr>

   文章介绍了 BigPipe 的技术细节，受 pipelining microprocessors 启发而来。

   BigPipe 在国内有很多实践，国内称这种技术为 页面直出。 更准确的概念是 页面分段渲染。
6. 每日一句分享:

   互联网公司的时间是狗年。狗的一年，据说相当于人的七年。一家开张两年的互联网公司，就像经营了二十年的传统行业公司。
7. 快餐文分享:

   A categorized list of all Java and JVM features since JDK 8 to 16

   <https://advancedweb.hu/a-categorized-list-of-all-java-and-jvm-features-since-jdk-8-to-16/> \
   文中从多个方面(语法、API、性能、安全、字节码)梳理了 jdk8 到 jdk16 的变动更新。
8. 快餐文分享:

   Announcing TypeScript 4.3 Beta

   <https://devblogs.microsoft.com/typescript/announcing-typescript-4-3-beta/>

   TS 4.3 changelog。

   1. 新增 getter setter 属性支持
   2. 可使用 overwrite 关键字显示声明重写方法
   3. 字符串模板类型更加定制化 (为字符串限制类型，真是太赞了)
   4. 支持 #private 修饰属性 方法(好丑)
   5. Check 未 await 的 Promise 将会抛出异常(不会真有人这么用吧)
   6. 支持类中静态索引属性
   7. 枚举不可以与任意数字比较 还有一些与语法无关的更新，详细可以看原文。
9. 每日一句分享:

   眼镜蛇效应（Cobra effect）指的是解决某个问题的方案，反而使得该问题恶化。

   它来自于殖民时期的印度，政府颁布法令说每打死一条眼镜蛇都可以领取赏金。结果，民众为了赏金开始养殖眼镜蛇，政府不得不取消赏金，养殖蛇的人就把蛇都放了，放出去的蛇继而繁殖，反而使得眼镜蛇数量大增。
10. 好文分享:

    移动端 JS 引擎哪家强？

    <https://mp.weixin.qq.com/s/2cxe1L9_vyB8oNg2jr2rkg>

    文章介绍了移动双端中常用的 JS 引擎(JSC、V8、Hermes、Quickjs)，并分别讲解了历史背景 与 在 IOS Android 上各自的优缺点，最后给出了目前业界选型的一些案例。

    简单解释下文中涉及到编译的术语: JIT、AOT、增量编译、堆快照。

    1. JIT : 即时编译（英语：just-in-time compilation，缩写为JIT。 在程序运行期间会不断分析正在运行的字节码，根据一定策略，将 hot code 直接编译成机器码，减少字节码 transform 开销，不过因为集成在 runtime 会增加内存占用。
    2. AOT: 在程序执行前期，先将源码编译成字节码，然后程序执行时只需运行已经编译好的字节码，移除源码解释的时间。
    3. 增量编译: 增量是一种思想，用一个典型例子解释: git push 只会 push 修改的部分，不会 push 整个项目。 这就是 增量的思想。而增量编译 顾名思义 只会编译修改的部分，不会编译整个项目，所以 增量编译存在于工程时间，而不是 runtime。
    4. 堆快照: AOT 的一种应用。

       在文中的业界选型中，几乎不约而同的 在 IOS 系统中全都采用 JSC 作为 JS 引擎，还是被阉割 只能解析执行的 engine。 并且据我所知，所有的第三方 IOS 应用如果有编译执行 VM 的存在，都是不允许上架 App Store 的。

       Apple 一向以来都是生态闭环，不管是 to c(客户) 还是 to d(开发者)。
11. 国内知名 BaaS 厂商 LeanCloud 被 TapTap 收购了... hah 由客户变成了金主爸爸
12. Question: 目前业界内 前后端分离架构，做用户状态保存的最佳实践是什么？

    A: 共享session，独立session服务器 \
    B: 独立 session 服务器有单点问题，能不能服务端端不保存状态呢？ \
    目前业界常用实践(前后端分离)也只能是后端管理 session 了.. \
    A: 不保存状态是啥意思啊，独立session服务器也算是无状态服务 \
    B: 就是后端彻底是无状态的，根据前端 Token 拿到 uid (用户ID)。 我说的状态是用户状态..

    B: Session 的数据结构怎么设计呢？ \[sessionId] -> uid 这种 hash 结构嘛\~ \
    B: 先不谈 csrf，感觉 cookie session 给服务端增加很多复杂性..

    B: 还是使用 Token 做用户状态保存吧，服务端彻底无状态。 \
    最明显的缺点是，单点登录 还是需要数据层做妥协，禁用 Token 可以维护一个黑名单。 也只能这样减少复杂性了

    B: Token 自动续期的话，可以每次请求重新分发，然后在设置一个较长的过期时间。

    A: 确实，肯定需要数据层，不过问题也不大，在可以接受的范围内。分布式下token会不会有副作用

    B: 预防 CSRF 攻击可以CSRF Token 分发到页面，请求带上，只存在于会话期间。 假如不做单点登录，没有禁用Token 需求，那么不需要数据层保存状态了\~

    B: 对于后端，复杂性最低的就是 Token 了。 \
    从 登录请求根据用一些不关键信息(uid) + 服务端密钥 + 加密算法 生成 Token，下发到客户端。 \
    客户端请求带着 Token，提取 uid，再根据 服务端密钥 + 加密算法生成一遍，相同则权限通过。 \
    客户端管理 Token 可以根据 httpOnly + cookie 过期时间。 \
    最致命的问题是，无法废弃已下发的 Token。 并且 Token 续签只能通过 客户端 cookie 过期功能。

    B: 想了想，废弃下发 Token 可以手动维护一个黑名单，自动续签 也可以在 用户的不关联信息 加上一个时间戳，如果时间戳 未来的一定期限内 继续维持，如果超出则自动更新。

    emm，有实践的可能性。 \
    hah，我称之为 statusless 方案，新的术语出现了
13. 快餐文分享:

    How MDN’s site-search works

    <https://hacks.mozilla.org/2021/03/how-mdns-site-search-works/>

    文章讲解了 MDN 的技术架构，由于站点大部分内容都是 静态文件，只有一个搜索接口可以讲.. 居然是采用 Django 作为 web framework 这让我没想到，搜索引擎是 es，数据同步使用的是 github action.. 这些基本的服务支撑起了 MDN 搜索功能。

    每一次提取搜索内容需要花费 24 小时.. 使用 py 脚本做这件事 真的合理嘛..(估计是 GIL 的限制)，可以使用 Numpy 提速.. \
    这种 计算密集型 任务，使用 Golang 最合适不过了。 我在想，如果使用 gpu 计算，goruntine 还具有优势吗？ \
    看了一些文章，大部分讲的都是 golang 如何调 cuda(可看做英伟达平台的指令集)，没有相关讨论。
14. 快餐文分享:

    5 ways to prevent code injection in JavaScript and Node.js

    <https://snyk.io/blog/5-ways-to-prevent-code-injection-in-javascript-and-node-js/>

    防止代码注入的五种规范:

    1. Avoid eval(), setTimeout() and setInterval()
    2. Avoid new Function()
    3. Avoid code serialization in JavaScript 4 Use a Node.js security linter
    4. Use a static code analysis (SCA) tool to find and fix code injection issues
15. 每日一句分享:

    舜发于畎亩之中，傅说举于版筑之间，胶鬲举于鱼盐之中，管夷吾举于士，孙叔敖举于海，百里奚举于市。故天将降大任于是人也，必先苦其心志，劳其筋骨，饿其体肤，空乏其身，行拂乱其所为，所以动心忍性，曾益其所不能。
16. Linux 内核 和 Windows 内核有什么区别？ - 小林coding的视频 - 知乎 <https://www.zhihu.com/zvideo/1362020816201367553>

    分享期小林的视频，讲解了内核的能力(内存管理，进程调度，驱动管理，程序运行环境)，Linux 内核的设计特点，Windows 与 Linux 内核，可执行文件的差别，以及不同的内核模型。有空的同学可以刷一下，视频很短。
17. 开个老生常谈的话题，如何管理 项目中的复杂性，有哪些手段？

    常见的手段有 分层，模块化，抽象。 \
    从抽象维度 小到大来讲的话，就是 抽象，模块化，分层。

    抽像 函数维度， 最典型的提现就是代码中接口与实现的关系，调用者只需要知道接口的能力，如何实现不必感知，能有效减少心智成本。

    模块化 文件维度，是将相同业务或使用场景 的代码组合起来，成为一个模块，就比如 monorepo 中多个不同的 package，微服务架构的项目。

    分层 项目维度，将同一层级的项目横向组合起来，最典型的就是 OSI 网络模型。

    呃，只给个宏观视角，详细展开说的话，太泛泛。
18. ```
    Y = f => (
        (g => g(g))
            (x => f(a => x(x)(a)))
    )
    fact = Y(f => n => n == 1 ? 1 : n * f(n - 1))
    console.debug(fact(5)) // 120
    ```

    这种 Y combinator 看起来真像是魔法.. 看完发现，只有 我脑子是不动点。
19. 快餐文分享:

    重新发明 Y 组合子 JavaScript(ES6) 版

    <http://picasso250.github.io/2015/03/31/reinvent-y.html>

    这篇文章把 Y-combinator 讲得细致入微，从 0 演化成了Y组合子，感兴趣的同学可以读一下。
20. ![image-20210414210517872](/files/-MYFa6DmNSMrxm8W53yg)
21. ![image-20210414210524174](/files/-MYFaBH5I0Gf7vjvHdca)
22. 分享则故事:

    The history of UTF-8 as told by Rob Pike

    <http://doc.cat-v.org/bell_labs/utf-8_history>

    现在世界上广泛使用的编码 UTF-8 的发明历史。 由 罗伯派克 与 肯汤姆森 花了两三天的时间完成。 该文章主要从 Rob Pike 的视角，讲解了 当时发生的一些事情。

    丹尼斯里奇 与 肯汤姆森 这两位最初 Bell labs 的 研究员，可以说为 现在计算机界的发展做出了 不亚于 冯老爷子的贡献。

    当然冯老爷子(冯诺依曼) 不是人，是神，通天带的那种。

    图灵与之相比就一不懂事的小学生。
23. 快餐文分享:

    Off-heap memory in Java

    <https://dev.to/jeissonk19/off-heap-memory-in-java-4dd1>

    文章首先介绍了 JVM 中堆的主要作用，并给出了 JVM 规范中的定义。 接下来讨论了 当堆中数据过大时，GC 压力很大，会造成长时间的 suspend，所以给出了 如何在 JVM 堆外保存数据的方案(可能是软文？)。

    ![image-20210414210616557](/files/-MYFaFsH3BApG2NPnMPp)
24. 每日一句分享:

    我通过删除 WordPress 的 Mailchimp 插件中 20 KB 的 JavaScript 依赖关系，每月估计减少了59,000 公斤的二氧化碳排放量。

    之前分享过的环保观点：

    1. 4G 上网的二氧化碳排放比 WIFI 上网高4～7倍。
    2. cloudflare 公司宣布，新推出的 Bot fight 功能所释放的二氧化碳，将通过种树弥补。根据计算，一个 CPU 内核每年释放8公斤二氧化碳，而一棵树吸收21公斤二氧化碳，因此计算量每新增2.5个 CPU 年，该公司将种植一棵树。
    3. 训练一个大型 AI 模型会排放近30吨二氧化碳，相当于5辆小汽车终身的二氧化碳排放量（包含制造期间的二氧化碳）。

    为了我们子孙后代的生存环境，请不要再写垃圾代码了￼

    A: 数字挖矿造成的二氧化碳是不是更多?

    B: 数字挖坑一般都会用到定制化的智能硬件，相对于普通GPU的使用情况来讲，肯定更耗费性能，能量守恒定律。
25. 开个话题，编程语言中 类型系统 是否会限制抽象能力，你想到了哪些场景。

    或者说，类型系统是否已经潜移默化地影响了 编程中的思维表达。

    一个具有“完备”(相对而言)类型系统的语言 或者 没有类型系统的语言 是否能写出更高级别的抽象代码。

    我一直把类型当做上下文标注信息来理解，而大部分场景下 它已经成为了一种约束，像是一种工程化的妥协。

    类型系统 是为了编译器更好提取上下文，更好地优化程序；为了工程“更高质量” 定义的一套法则。 也是预先定义的一套编程思想定式。

    在不同视角上来看，有合理的意义，也有不合理的意义。 突然觉得这种话题 没有 01 定论，就算深入探讨 遇到的只是各种 解释 归因。

    想起了 暗时间 中的一段话: 由于事实上，任何行为都有合理性因素在里面，所以总是有机会争辩的。
26. 快餐文分享:

    Object oriented vs. functional programming

    <https://www.johndcook.com/blog/2010/11/03/object-oriented-vs-functional-programming/>

    摘要: OO makes code understandable by encapsulating moving parts. FP makes code understandable by minimizing moving parts.

    文章很短，简单探讨了 fp 与 oo 对 state 的不同处理，以及在混合编程中很难达到 不同编程范式最大的优点。

    有一则评论很赞同: \
    My experience so far has been: \
    1\) Inheritance is over-rated, composition is far more useful. \
    2\) State is unavoidable, but good programming is about getting away with as little state as possible. \
    3\) Thinking of a problem assuming you are going to write the program in a purely functional language usually results in a better design (even if you come back and write classes and maintain state in them)
27. ![image-20210414210845673](/files/-MYFaMxEq8vj2GcKt1sD)

    V8 运行 JS 的过程

    1. 源代码(source code) 通过解析器(parser) 解析后 生成抽象语法树(AST)
    2. 抽象语法树 通过 解释器(interpreter-Ignition) 生成了字节码(bytecode), 此字节码作为基准执行模型, 字节码等同于 25%-50% 机器码大小. 并且 此时抽象语法树被彻底清除掉了, 释放其内存空间.
    3. 生成后的字节码 直接被 解释器执行 (解释执行),
    4. 在代码不断的运行过程中, 解释器收集到了很多可以优化代码的信息, 比如变量的类型, 哪些函数执行的频率较高.
    5. V8引擎的编译器(compiler-TruboFan) 会根据这些信息和字节码 来编译出经过优化的机器代码

    一些常见的优化规则:

    * 函数只是声明未被调用, 那么该函数不会生成到 AST
    * 函数如果只被调用一次, 字节码则直接被解释执行了
    * 如果函数被调用多次, 可能会被标记为热点函数, 会被编译成机器代码
    * 随着不断执行, 会有越来越多的代码被标记为热点代码, 然后被编译成机器码.

    所以 JS 运行的过程 正是一个从解释执行到编译执行的过程.
28. 每日一句分享:

    一个人如果将他自己描述得很好的话，他十有八九是在撒谎，因为任何生命从内部审视都只不过是一系列的失败。 如果能意识到问题 就好了，可描述的人 往往只愿沉浸在自己以为的成功。 如果能遇到帮助审视自己的朋友，一定要珍惜。
29. 快餐文分享:

    λ表达式与邱奇数，JAVA与JS的lamda表达式实现

    <https://www.cnblogs.com/niuyourou/p/12245960.html>

    一直对邱奇数很感兴趣，用函数定义熟数字。 今天刷到了这篇文章，文章前面主要介绍了关于 lambda 演算的历史背景，后面给出了 js java 邱奇数的实现。

    补充下摘要: 现代形式科学的所有的故事都来自于莱布尼茨的两大梦想：第一、建立一套严格精密的人工语言，这种语言没有人类语言的歧义多结构，可以精确地描述任何哲学、逻辑和数学问题；第二、找到一种方法，利用这套“普遍语言”，解决任何科学、哲学和数学的问题。　　

    莱布尼茨的梦想，在20世纪先后成真：集合论和符号逻辑、计算科学。而这一切的一切都源自19世纪末20世纪初发生的第三次数学危机。这场危机的结果使得数学、逻辑学和哲学发生了脱胎换骨的变化，数学的公理化、逻辑学的数学化、哲学的逻辑化是这个伟大变革中最显著的特点。
30. 想到了之前摘录的一句话:

    图像的表达力和精准度有限，信息冗余和歧义多，特别是无法(或很难)表达抽象。

    相对的，我看好公式公理化数学化高阶逻辑化编程.
31. 阿里需要一次触及灵魂的反思

    <https://mp.weixin.qq.com/s/-lDKXVTPLNt72jC5LyuyXA>

    分享篇今天读到的一篇文章，文章给出的观点很主观 有作者的思考，整体不像其他文章 没有阴谋论的调调。
32. A: http2的多路复用值怎么保证数据的顺序的 \
    B: 有序号值，不过当一个帧丢失时，复用该链路的所有请求都会阻塞，这是 http2 最大的槽点。

    A: 每一个数据帧都会有一个序号吗 \
    B: 是的，这个序号决定该帧属于哪个流。 \
    快进到物理界出现新突破吧，不然再计算机业界再怎么出新东西 都打破不了天花板。
33. 快餐文分享:

    Python 3.10 : What's the new ?

    <https://dev.to/thrpy/python-3-10-what-s-the-new-4a61>

    Py 3.10 的一些新特性，增加了 类型标记中增加了组合，别名。语法中增加了 结构模式匹配(无聊)。

    A: JS给点作用啊JS 感觉这两年没啥nb的特性 \
    B: ?? ?. js 已经让我变成了问号党
34. 好文分享:

    CPU 和 GPU - 异构计算的演进与发展

    <https://draveness.me//heterogeneous-computing>

    文章整体介绍了 CPU GPU 的演进历程，为了达到更快更强的性能，工程师做出的努力。

    文章梳理得很棒，受益匪浅，以下信息皆来自该文章，建议阅读。

    ![image-20210414211148393](/files/-MYFaW_IZIDMlAQ-HZKD)

    每一条汇编指令都是原子操作，而原子操作意味着该操作要么处于未执行的状态，要么处于已执行的状态，而数据库事务、日志以及并发控制都建立在原子操作上。不过如果再次放大指令的执行过程，我们会发现指令执行的过程并不是原子的。 \
    有针对指令级并行的处理器-超标量处理器。 \
    原来 intel cpu 之间的通信 也采用的是 网格(mesh)架构，这和微服务各个节点的服务代理通信机制 异曲同工。

    经常分享这位老师的文章，很早之前学 go 时就被他吸引，记得剖析 go 源码文章，大多数人 都是研究 lib或汇编，他直接从词法分析搞起..
35. 突然想到一个有趣的点，现在大部分产品 通信都是C-S架构，如果是S-S架构会怎样？

    浏览器加载网页时不仅请求html，还会请求cgi，然后 run 在 sandbox 中，这样是不是天然支持全双工？是不是可以最低成本实现p2p？ \
    现实条件 背景先不管，如果真能实现这种架构，那一定能极大扩展现在传统的通信机制。 \
    A: 这算是一种退步吗？未来的趋势不是把更多的逻辑处理放到云端，client尽量的轻便。

    呃，这只是设想，因为现在的计算机 还不支持或者说能力不够。 \
    现在也是这种趋势，未来可能终端能承载更多东西，如果5g落地的话。 \
    但是现在这种趋势真的好吗？或许好吧。 \
    我看到的只是被商业包裹下的互联网。 希望有生之年能看到去中心化网络在国内出现。
36. 透过 Rust 探索系统的本原：编程语言

    <https://mp.weixin.qq.com/s/ZA-_BARVAWe0Q4eM0lYgwg>

    好文分享，介绍了编程语言中世界观对设计的影响，并以 rust 为例讲解了 编程语言设计时的衡量取舍。\
    ![image-20210414211338288](/files/-MYFafY8HCSmlXTz-cJf)
37. 每日一句分享:

    编程语言有三派：哲学派、数学派、物理派。Erlang和Elixir属于物理派，面向对象属于哲学派，函数式属于数学派 - 张汉东
38. 一图说清 CSP 与 Actor 并发机制的区别。 \
    ![image-20210414211357925](/files/-MYFamCFlqRrjSNE-f5H)

    摘抄自之前我发的一则微博: CSP 模型 和 Actor 模型, 具有相同的设计理念:

    通过通信来实现共享内存，而不是用共享内存来实现通信。

    然而它们的侧重点不同，Actor 关心通信的实体（对 OOP 更加友好），CSP关心通信的工具。

    如果要选其一的话，我更加欣赏 CSP模型。

    假设通信的数据，可以自我实现状态管理，这样一来就不会被通信双方所约束，消息传递的过程 就可以增加更多的抽象。

    目前，业界的 CSP 代表 Golang 结合 Context 包已经实现了这一点。
39. 沅有芷兮：类型系统的数学之美

    <https://mp.weixin.qq.com/s/ieEewizkN7H-11z-PexkGw>

    好文分享，从数学视角介绍类型系统的严谨性，文章开头介绍了原始类型与复合类型的概念，复合类型本质上是笛卡尔乘积的概念让我耳目一新，后面介绍了 类型系统如何处理异常，sum type 为什么是最佳选择，泛型可枚举类型的集合证明。 非常推荐阅读。
40. A: 怎么删除响应头的某个项啊？服务端配置 \
    B: 最好服务端配置。或者加个bff/转发请求层，forward request 的时候 过滤，这样搞复杂性高一点。
41. 分享一段 今天从陈天老师文章上看到的观点，感觉很受益。

    我们生活在一个既幸运又不幸的年代。上古时代，没那么多语言，更没那么些子分工。程序员是包打天下的黑客，匠人。如今，软件开发的领域细分到一个令人发指的地步，前后端分家，跟南北朝似的，然后前端又分裂出东西魏。前些日子 interview 时有个哥们超级自豪地自我介绍，说自己是在做 backend of backends。详问之，不禁哑然。那哥们不过是拿 node 做了些 service 的事情，就觉着自己升级成了刹帝利，急着把自己和做 API 的吠舍们撇清关系了。

    精细分工的后果是程序员从黑客和艺术家蜕化成了螺丝钉 —— 端到端的包打天下越来越罕见，不再有人觉得自己了不起，觉得自己是 King of the world：写代码从一件很 cool 的，很好玩的事情变成了混饭吃的行当。后端的练好肌肉，前端的用好脂粉，便可以了，倘若后端开始修眉，前端怼人鱼线马甲线，那就乱了，是僭越。
42. 分享个项目：

    Awesome Landing Page

    <https://github.com/nordicgiant2/awesome-landing-page>

    还在为项目、毕设的首页发愁吗？可以看看这个项目，收集了很多优秀开源的 landing 页，居然包括了 我的主页项目￼

    我还好奇 最近 一个坏掉的番茄 pv 怎么这么高..
43. A: 有怎么封装dialog的文章吗？ B: 没看过这种文章，可以讨论下。想找 demo 的话，可以去 github 上搜一下，一定有很多的。\
    建议使用组件库里自带的 dialog，或者 某个 dialog 开源库，是想自己实现吗？ 如果自己实现的话，可以先设计出 props 规范(标题，内容，弹出动画，点击确认的回调，是否有蒙板等等)，剩下的就是根据规范 画界面的工作了。 \
    A: api和属性怎么设计啊？ \
    B: 有使用场景吗？建议最初根据使用场景设计，不要过度设计，先做个 mvp 再根据未来的需求迭代。
44. A: 有人熟悉sticky属性吗 \
    B: 其他窗口视图fixed + 当前窗口视图 relative
45. 竞争与垄断：几段概念史

    <https://mp.weixin.qq.com/s/0dsoNUDDTtIZwE5d2TsAcA>

    好文分享，文章梳理了 竞争与垄断理论在经济学上的演变，并给出了 不同阶段下 代表人提出的理论。
46. ![image-20210414211728280](/files/-MYFaxi1HALChSN8DZie)

    悲伤的故事\
    爱情就像是个非确定状态有限自动机.. 交流个一两句，情绪系统就能爆出多个异常。
47. 我一个有个疑问，对于现在的互联网feed流产品，到底是用户是客户，还是广告主是客户？ \
    A: 我感觉是广告呢 \
    Feed流产品 利用各种功能手段 尽可能地争取用户时间，而广告主 花钱在产品上采购用户时间。

    或许 feed 流产品天生就决定了 用户数据，使用时长 这些关键指标是商业模式的驱动力.. \
    之前摘录过一段话: 硅谷的 IT 精英圈有一种共识：我们正在建造一个超级大脑，接入网络的所有的用户都只是可以交互的神经元，你就像一个小的编程单元，算法通过你的行为去操作，去编码，来服务于这个巨型大脑！你根本无足轻重，系统不会给你钱，也不会告诉你真相，你完全没有自主权。

    还有之前分享过一句话:

    如果你没有为商品付钱，那么你就是商品本身。——纪录片《监视资本主义：智能陷阱》

    个人认为，这种生态 对用户来讲也不算坏事，毕竟产品需要商业模式，而用户也是能从产品中获取信息。

    如果想摆脱这种产品，不想被它为你亲身打造的信息茧房所束缚，可以试试 rss。
48. 很早之前答应过大家，写一篇信息流获取文章，鸽了好几个月了，其实我获取信息的关键不是靠 rss，而是靠广撒网，遇到关键信息摘要，深入理解。

    最关键的信息流 全是 newsletter，我会订阅很多有趣的博客，社区。 其余的有 rss, 微信号， 收藏的博客，微信读书，twitter, github, 知乎, quora, reddit, 各种社区..(实在太多了)
49. 快餐文分享:

    THERE'S ALWAYS MORE HISTORY

    <https://www.hillelwayne.com/post/always-more-history/>

    深入探索了 Vim 为什么采用 hjkl 做方向键(当时开发者用的键盘)，JS 的 month 为什么 从 0 开始的背景故事(为了更好的内存优化算法)。
50. ![image-20210414212348677](/files/-MYFb6cIZToQ8WeYW1ir)
51. 每日一句分享: 每个时代，自由和常识都面临着四大挑战：强人对权力集中的渴望；穷人对财富不平均的怨恨；无知者对乌托邦的向往；无信仰者将自由和放纵混为一谈。——剑桥大学历史系教授阿克顿勋爵
52. ![image-20210414212359945](/files/-MYFb99tJd30SWssU4uD)

    可以通过H5这些网络条件属性，来更好地优化页面性能。 比如，在弱网环境下加载不同的资源￼
53. Deno 1.9发布

    <https://deno.com/blog/v1.9>

    最大的更新是 http 层默认采用了 http2 了
54. 分享篇文章:

    My startup failed. Then I found out I was unemployable.

    <https://davesullivan.is/my_startup_failed_then_i_found_out_i_was_unemployable.html>

    HN今日热文，文章以作者的第一人称视角，描述了经历两次创业失败后，发现很难找到一份合适的工作(出现了\~ 白板反转二叉树)，最后不得以去一家待遇一般的公司遭受压榨，最后吐槽了 虚假的公司文化传统，以及初创企业的不设边界风格。

    摘要: In the larger picture, I would comment that startups and tech companies claim to have a new kind of company culture, but they are (mostly) just the new factory with tech workers as the new factory workers. Rather than work at a startup, I much prefer being good at what I do and doing it on a temporary contract basis with clear boundaries and compensation. A job at a typical startup has no boundaries and feels like a cult. So I guess being unemployable works out fine for now, and maybe someday I'll get around to making something again

    感觉这能说明一个问题，聪明人/精英/有思想的人，从一些场景来看，并不会对社会发展产生正向收益.. 他实在太懂自己想要什么了。
55. 刚刚看到了个项目 <https://github.com/piscinajs/piscina>  - Nodejs线程池库

    我在想，Nodejs 主要靠底层 libuv 任务队列循环模型 去执行。 在应用层提出个 线程池，有什么使用场景。 \
    libuv底层实现已经做了池化，在应用层做资源复用，有什么意义... 使用场景是 PM2 这种特例嘛..

    感觉用 nodejs 做这种多线程，cpu密集型计算 都是用错了锤子
56. 目前的计算机底层架构，最理想的高并发模型应该是 轻量级协程 + 池化(可以看下 golang 的 ants库) + 命中临界区时的特殊处理(不要优先使用互斥锁)+ (智能硬件/与英伟达的 cuda 紧密结合)。

    IO 密集，CPU 密集 都可以适用。

    我理想 适用高并发的智能硬件，是在一条原子指令执行时，可以更细化到原子指令的每一步，就比如 加载指令，解码指令，执行，写回。

    对每个核上运行的程序做更细粒化地调度。
57. A: 请问学什么才能看懂你发的东西 \
    B: 呃.. 就是学计算机科学.. 就好了.. 不要设边界，随着自己性子来\~ 找到乐趣\~

    除了时间精力，爱好。 还有一点很重要，学习方法。 学习要多思考，在我这里可以体现为两点∶

    1. 做翻译，把文章主旨，关键思想 翻译成我的语言，这个过程虽然无聊，但很容易触发其他知识点的关联，并且更利于吹牛。
    2. 思考层次，不要局限于知识表面细节，这是最大的误区，要提取 技术点的本质，融会贯通，最简单的办法就是学习时 思考到操作系统层为止。

    当你只满足于知识的表面细节时，下次遇到问题 或者 学到其他知识，会无形中阻塞你。


# 3

暂未分类


# 1-18

暂未分类

1. 好文分享：

   Blogged Answers: A (Mostly) Complete Guide to React Rendering Behavior <https://blog.isquaredsoftware.com/2020/05/blogged-answers-a-mostly-complete-guide-to-react-rendering-behavior/>

   摘要：下面的图片。

   这篇文章大而全，从各个场景介绍了 React 渲染的行为，用空的前端同学 强烈建议话时间读一下。 我断断续续读了快一个小时，比之前分享的那篇用 TypeScript 写 Curring Type 文章还要长.. 有空的前端同学 强烈建议花时间读一下。

   ![image-20210319214730195](/files/-MW9tb4ILXIiM61iOgPW)
2. 应用程序的内存布局。

   ![image-20210319214755976](/files/-MW9td_qI4aZC_PJRakU)

   栈区（Stack）— 存储程序执行期间的本地变量和函数的参数，从高地址向低地址生长； 堆区（Heap）— 动态内存分配区域，通过 malloc、new、free 和 delete 等函数管理； 未初始化变量区（BSS）— 存储未被初始化的全局变量和静态变量； 数据区（Data）— 存储在源代码中有预定义值的全局变量和静态变量； 代码区（Text）— 存储只读的程序执行代码，即机器指令； 上述五种不同段虽然存储着不同的数据，但是我们可以将它们分成三种不同的内存分配类型，也就是静态内存、栈内存和堆内存。

   摘抄自 内存管理设计精要 \
   <https://draveness.me/system-design-memory-management/>
3. 每日一句分享: \
   产品负责界定和提供长期用户价值，运营负责创造短期用户价值+协助产品完善长期价值。
4. 数据最具有说服力，数据最具有迷惑性。

   有的人就是喜欢读那种“干货满满”的文章，要么充斥着大量的图表和数据，要么夹杂着大量的参考文献，给人一种论据充分、无可置疑的印象。

   实际上此类文章更难以辨别真伪，因为查证是个递归的过程，一个证据往往需要更多的证据去支撑。这一方面成本极高以至于一般人懒得彻底查证，不如直接选择相信；另一方面会有自我引用和循环引证之嫌疑，例如有个著名的段子：一个人发表了十篇文章，总被引次数为45次。

   至于数据的迷惑性就更高了。一方面，数据是客观的，但数据的分析和解释是主观的。另一方面，数据比文字更容易造假，更容易造出合理但不符合事实的数据，本福特定律并不只是审计人员才懂。这方面举两个例子吧：一是法广报道中国疫情“中国本土新冠确诊暴增7.5倍”，实际上只是从2增加到15。二是“中国国足世界杯只输过3场”，这个就不需要解释了。

   道理不言而喻，一目了然。有句话说得好，绝对的谎言不足以彻底迷惑人，半真半假的谎言才足够具有欺骗性。

   来自 Aurora 的一则灵感。
5. 词汇分享: \
   profound - adjective /prəˈfaʊnd/
   1. felt or experienced very strongly or in an extreme way: Eg: His mother's death when he was aged six had a very profound effect on him.
   2. showing a clear and deep understanding of serious matters: Eg: profound truths/wisdom
6. 分享篇文章:

   How I cut GTA Online loading times by 70% \
   <https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times-by-70/>

   文章讲述了作者难以忍受 GAT OL 缓慢的加载速度-7分钟(与7年前发布时基本没变)，使用反汇编工具，一步一步调查出花费时间的瓶颈 的经历。 瓶颈是 GTA OL 在启动时会加载 10mb 63k item json(作者猜测是有关 游戏内购买商品) 数据，并且存储为一个数组，解析后还会逐个检查 hash ，这几个流程将花费6分钟.. 作者在最后呼吁 R\* 解决这个问题(确实很容易解决，结尾也给出了方案)。
7. 主板上这家伙，要当CPU和内存的中间商！ <https://mp.weixin.qq.com/s/UKPagzvcwyY5RzOLWIff5g> \
   快餐文分享，简单介绍了内存条的组成单元，以及与 OS 交互的基本原理。
8. 二月分享： \
   2.1 \~ 2.6 （97）：<https://thinking.tomotoes.com/archives/2021/2/1-6> \
   2.7 \~ 2.17 （118）：<https://thinking.tomotoes.com/archives/2021/2/7-17> \
   2.18 \~ 2.28 （147）：<https://thinking.tomotoes.com/archives/2021/2/18-28>\
   终于整理完了，2 个半小时... 早知道不学这么多东西了。 \
   并且以后 可能会去掉 分类（Tag）<https://thinking.tomotoes.com/tags>。

   这两期的汇总一直没时间同步到分类，太花时间了😷
9. 漫画 | Linux之父：财务自由以后，我失眠了！ <https://mp.weixin.qq.com/s/j3c1feAroSErPcdwGNyccA> \
   分享篇文章，简单介绍了 托瓦茨 的开发 linux 经历，文中有很多梗 来自托瓦茨的自传 Just for fun.
10. 快餐文分享:

    Architecturally Significant Requirements \
    <https://luminousmen.com/post/architecturally-significant-requirements>

    文章介绍了架构中的常见术语: Availability(可用性，3个9) ，Fault Tolerance(容错性，包括可用性)，Durability(持久性，主要手段通过 校验和 等编码算法 或 多地备份保证)，Resiliency(弹性，抵抗系统攻击，某一节点出错的能力，比较常见的有 服务熔断，降级，限流等容灾手段)，Reliability(可靠性，符合预期)，Scalability(扩展性，基本上符合 SOA 架构的，扩展性都很容易保证)。
11. 每日一句分享: \
    成功的反义词不是失败，而是什么都不做。
12. 词汇分享: \
    rim - noun /rɪm/ \
    the outer, often curved or circular, edge of something

    Eg: The rim of the cup was chipped and broken. \
    让我想起了之前 吐槽 nim 语法 过于灵活(对一个方法 既可以命令式，也可以函数调用，调用形式像是 py2 与 py3的融合)。\
    一种语义对应多种行为，过于灵活，无疑会增加开发者的心智负担，在我看来设计得不严谨，不利于工程化。 \
    当然，灵活性与工程化本来就很难兼得。
13. 之前学 rust 的时候，有一个特性很让我无语，rust 函数可以在内部写一个表达式，代表的就是函数返回值，可以不声明 return。 但除了减少代码量，我看不到任何好处，把函数中 最关键的意图隐藏在代码内部..\
    并且 rust 为了实现 0gc，在语言上增加了太多的概念，付出代价不小，所有权，生命周期，在语法上的表现就是 各种符号混杂在一起，你需要理解每一个概念，才能正常开发。 \
    如果不是为了开发稳定的运行时应用，比如操作系统，我暂时还想不到有什么非用不可的领域。
14. ![image-20210319215023966](/files/-MW9ts5B9mTCJwxzFTOR)\
    对 30s 代码感兴趣的同学，可以看下我之前写的这篇文章: \
    30s 源码刨析系列之函数篇 <https://tomotoes.com/blog/30s-javascript-function/>
15. 为什么说 immutable 是 React 的核心，如何理解这一概念？ - Liuyl的回答 - 知乎 <https://www.zhihu.com/question/446377023/answer/1756125862> \
    分享个回答，不可变保证了调度时的灵活性，角度清奇。
16. 快餐文分享: \
    前端工程师所需要了解的WebView \
    <https://mp.weixin.qq.com/s/PipKSnMQaTBhE5kSwG3DVQ> \
    文章简介了 Webview 的概念，jsb的意义，后面列举了下 Android webview,ios webview 所支持的能力。
17. 分享篇池老的文章: \
    最容易被忽视的流量入口\
    <http://weixin.sogou.com/weixin?type=2&query=MacTalk+%E6%9C%80%E5%AE%B9%E6%98%93%E8%A2%AB%E5%BF%BD%E8%A7%86%E7%9A%84%E6%B5%81%E9%87%8F%E5%85%A5%E5%8F%A3> \
    摘要:

    1. 在文字互联网的时代，搜索引擎成了信息流动的入口，Google 和百度这样的公司，收割了 PC 时代所有的信息内容，成为最大的流量入口。
    2. 在移动互联网时代，流量被重新分配，每个 App 有了自己的品牌和搜索服务，人们需要进入 App，才能消费内容。
    3. 新的流量分发入口，只不过承载的内容介质是视频。

    有趣的事，上一周刚分享过 一个可以在视频中 根据语义搜索相应帧 的项目。
18. ![image-20210319215108558](/files/-MW9u0nDfyMy51JQWFn4) \
    学 Ruby 岂不是要倾家荡产
19. 自适应 CSS 栅格：自由布局的最终版本 - 霜羽的文章 - 知乎 <https://zhuanlan.zhihu.com/p/354154177> \
    快餐文分享，文章例子清晰易懂，并且只涉及了一些常见的 grid 属性，可以简单刷一下。
20. 每日一句分享: \
    可以把自己当成一家公司来经营，时间和注意力就是你拥有的最多的资源，公司的使命可以是让自己拥有快乐人生。想要经营好一家公司，应当能有效管理好各种资源，要挖掘自己的兴趣和特长，并且把资源投入到能带来更大长期回报（财富/快乐）的项目上，还要保持身心健康，让身体和大脑能更有效地合作。
21. ![image-20210319215141068](/files/-MW9u6C_9Zd6kAg8-9FG)
22. 分享个工具： \
    HTTPie - <https://httpie.io/docs> like curl but easier

    http \[method=get] \[key=value => data in post/put] \[key==value query string in get] \[key:value => field in header] \[field:=json or field:=@file.json] \[--flag] url\[or :port]

    1. http PUT pie.dev/put X-API-Token:123 name=John
    2. http pie.dev/image/png > image.png
23. 学徒涌现，但clubhouse模式在中国没有前景｜深网 \
    <https://mp.weixin.qq.com/s/kckFEjjgNxqn-62R-Qu9-g> \
    分享篇文章，作者从 监管成本，商业模式，语音不利于知识检索的角度分析 clubhouse 难以在国内出现成功的复刻品。
24. 分享篇文章:

    Speed is the killer feature \
    <https://bdickason.com/posts/speed-is-the-killer-feature/>

    摘要:New features might help your users accomplish something extra in your product. Latency stops your users from doing the job they already hire your product for.

    文章阐述了及时响应 对一款产品是否能取得成功的重要性。
25. 分享篇很有味道的文章: \
    耦合 - <https://mp.weixin.qq.com/s/Fp2lYL8Qno15erQ4Z8EPoA> \
    如果你能在生前把它们都解耦，你将拥有一个光辉的名字：佛。
26. 分享篇文章: \
    分布式相关理论和分布式事务 \
    <https://juejin.cn/post/6935352650275749896>

    文章列举了分布式系统中常见的概念，分布式锁，事务的几种实现，涉及到的点都很浅。
27. 列举下 目前分享文章的标签:
    1. 快餐文，干货很多，偏总结性知识，引起的思考很少。
    2. 好文，偏某一领域的深挖知识，引起的思考很多，文章体系偏严谨。
    3. 没标签，很难引起共鸣。
    4. 惊讶系列，技术系列的文章，或者 代码片段，很少遇到。
28. ![image-20210319215244739](/files/-MW9uLlVkzElTIOlg06L)
29. ![image-20210319215253446](/files/-MW9uO3a1S47p6jU0lqX)
30. 点击“我不是机器人”后，网站到底怎么知道你真的是人？ <https://mp.weixin.qq.com/s/N_f7jp4TlIozxGR-mYHEhg> \
    很有意思的文章
31. 每日一句分享: \
    If we don't create the thing that kills Facebook, someone else will. ![image-20210319215327374](/files/-MW9uRJpnH7ZQVTB-_4i)
32. 分享篇文章: \
    Announcing Flutter 2 \
    <https://developers.googleblog.com/2021/03/announcing-flutter-2.html?m=1> \
    Flutter2.0发布，不只是移动端跨端，还支持编译成 web,pc-native。

    虚假的跨端:支持 web ios android windows apple linux \
    真实的跨端: 支持 微信小程序，百度小程序，支付宝小程序，参考 taro
33. 分享个流量孤岛的概念: \
    指移动端时代，各大企业为了维护各项用户指标，建立起来的一系列护城河。将流量划分成一座座孤岛，互不相同，自建生态，属于国内创新型概念。 \
    来自今天一位吃饱饭后打工人的碎碎念。\
    互联网精神是什么？在资本的视角下 不值一谈。牺牲用户信息的流动性，巩固自身的生态才是王道。
34. 请不要叫我做题家 \
    <https://mp.weixin.qq.com/s/U59O-2SzEmTfaSKz3NNk7Q>

    分享篇文章，直指教育机制与个体发展之间的矛盾。 \
    摘要: 中国式应试教育绝非完美，英美教育制度也不乏优点，但对这个国家最普遍的个体来说，他们接受教育的目的不是拓宽视野，不是结交名流，不是跻身精英，而是逃离贫穷。 做题依然是他们手里唯一的筹码。 \
    让我想起了之前分享过的一句话:培养一个巴黎人，需要三代人的努力。
35. Redis 多线程网络模型全面揭秘 \
    <https://mp.weixin.qq.com/s/-op5WR1wSkgAuP7JYZWP8g> \
    好文分享，文章对 Redis 的 IO 模型，介绍得很详细，从宏观角度给出概念，图解，与源码解析。也分析了 Redis 6.0 引入多线程之后 发生的变化。 \
    文章写得很好，建议多读两篇，多线程 源码那里可以略过。

    摘要: Redis 内部实现了一个高性能的事件库 --- AE，基于 epoll/select/kqueue/evport 四种事件驱动技术，实现 Linux/MacOS/FreeBSD/Solaris 多平台的高性能事件循环模型。Redis 的核心网络模型正式构筑在 AE 之上，包括 I/O 多路复用、各类处理器的注册绑定，都是基于此才得以运行。
36. 惊讶系列分享: 解构模板字符串。\
    &#x20;![image-20210319215519638](/files/-MW9udIQ2-90_9-qQVru)
37. 好工整的程式。\
    &#x20;![image-20210319215532514](/files/-MW9uhATSzohFFs5lPVs)
38. A: 问一下vue创建和卸载组件是同步还是异步啊？

    B: Vue 创建组件是同步的过程，加载组件是异步的过程。

    创建与加载是两种不同的概念，组件被加载后才可以创建。

    创建属于一个原子操作，不可被拆分。

    Vue2 官方文档中有写，支持异步加载组件：<https://cn.vuejs.org/v2/guide/components-dynamic-async.html>

    Vue3 也是可以借助 defineAsyncComponent 定义一个异步加载的组件

    还有一些常见的方法 使用懒加载包一层，等到被激活才加载。 如果说到 Vue 卸载组件，具体 应该指的是 destroyed 钩子中 remove component 的底层实现是否是异步化了，等我翻翻源码。<https://github.com/vuejs/vue/blob/5255841aaff441d275122b4abfb099b881de7cb5/src/core/instance/lifecycle.js#L97>

    destroyed 钩子中 卸载组件会将 父组件的 children 中移除该组件，并将组件的引用置于 null，等 gc 回收，是一个同步的过程。

    如果异步化的话，页面就不会实时更新了。
39. 春招已经开始，找工作的同学把握住啊，多刷下牛客 看看面经，算法题 也不要落下 ，偶尔 ac 几道题积累下经验，除了准备基本的面试题，思维题 与 场景题 也是经常考的。场景题需要技术的广度，这个没有短期提高的技巧，只能平时多学习。思维题 等死就好了。 \
    投简历的时候 可以先投一些小厂找找感觉，后面再投一些大厂，并且记住投大厂的时候 部门也很重要，不要心急。 \
    准备基础面试题时 不要眼高手低，一定要多思考（思考到操作系统层面，很多已有的概念都能找到身影） 并 与其他知识点关联起来，还有一个技术的意义，适用的场景 都要多多少少了解下，这样回答问题的时候 才能把面试官经验住。 \
    并且演技也很重要，不要说太流畅 像背书一样就不好了。

    回答面试题时 最好以网状的结构，从一个点挖到另一个点（需要你主动引导），这样是最佳的。
40. ![image-20210319215649079](/files/-MW9uopo-sEVrh_didP5) \
    CSS IS AWESOME\~
41. 用WebRTC来实现P2P直播 - Yard的文章 - 知乎 \
    <https://zhuanlan.zhihu.com/p/101991665> \
    快餐文分享，介绍了 WebRTC 中的常见概念，总结一点: SDP 负责媒体信息交换，ICE 负责网络信息交换，如果不能透过 NAT 直连，只能通过 TURN 来中转，这样多端的流媒体才能流动起来。 \
    但这对 TURN 服务器消耗的带宽是巨大的，而云服务中带宽用量一般都不便宜。还记得之前看 熊猫直播 复盘的一篇文章，带宽花费巨大。
42. ![image-20210319215715393](/files/-MW9uuFFHmawBwhizVgh) \
    WebRTC 本质是P2P网络架构(提供了 STNU 用于NAT打孔(属于 钻了网络协议的漏洞)，TURN 用于转发，传输数据 over udp) 再结合 优秀的音视频处理库(可看之前分享过的一篇文章，GIPS 公司的内部作品，后被Google收购)，比如回声消除，消音，结合网络带宽智能调节码流等，这些功能是 WebRTC 主要的优势。 \
    而国内的网络 因为NAT类型，天生是很难支持 P2P的。 所以 声网 与 一些厂商 关于 WebRTC 的 PaaS 服务才会那么贵，中小型企业 搭建需要花很多成本。 现在有关在线语音，声网与腾讯云是 1000分钟 7元。
43. 每日一句分享: \
    我从小公司跳槽到大公司。我发现，大公司的很多工作都在学习他们庞大的自定义领域，而不是学习某种的公开技术。
44. <https://github.com/git/git/blob/master/banned.h>

    因吹斯汀 这算不算 unix style 的 api 设计的问题呢
45. 分享个概念-XaaS： \
    XaaS is a general, collective term that refers to the delivery of anything as a service. It recognizes the vast number of products, tools and technologies that vendors now deliver to users as a service over a network -- typically the internet -- rather than provide locally or on-site within an enterprise. There are countless examples of XaaS, but the most common encompass the three general cloud computing models: Software as a Service (SaaS), Platform as a Service (PaaS) and Infrastructure as a Service (IaaS). \
    XaaS：Anything as a service.
46. 分享篇文章： \
    The Ultimate Beginners Guide To Kubernetes and Container Orchestration\
    <https://hackernoon.com/the-ultimate-beginners-guide-to-kubernetes-and-container-orchestration-5d83354y>

    文章介绍了 K8S 的相关概念与出现的背景意义以及具有的优势。
47. 计算机的文件系统是一种存储和组织计算机数据的方法，它使得对其访问和查找变得容易，文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念，用户使用文件系统来保存数据不必关心数据实际保存在硬盘（或者光盘）的地址为多少的数据块上，只需要记住这个文件的所属目录和文件。 \
    严格地说，文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型（Abstract data type）。
48. ![image-20210319215833333](/files/-MW9v58I0xRx1lM8KdN4)

    错误的 JRE：Java Runtime Env \
    真正的 JRE：JavaScript Runtime Env
49. 好文分享： \
    为啥负利率国债有人抢着买？因为时代变了 \
    <https://mp.weixin.qq.com/s/NdNv3LiO_3IxrgyeG5Xubw>

    文章分析了 经济微增长时代 带来的危机，各国的现状，以及如何做出应对（人口增长要保持，寻找新的技术突破，降低贫富分化 给基层让利 参考 拼多多）

    文章摘要： 最终消费的动力主要来自三点： 1、孩子；2、年轻的女人；3、技术的更新迭代。

    现在互联网技术风口耗尽了，整体格局也差不多了。现在互联网大厂连菜贩子的生意都抢，大部分行业跟餐饮业一样，一片红海。

    那整个社会佛系了它不好吗？没这么简单了。比如作为富豪阶层却有大量的钱投资不出去，放手里通货膨胀贬值，存银行也不赚钱，最后想来想去，只好去追那些少数优质资产，最后把那些资产给追到天上去了。

    “每一个人自由发展是一切人自由发展的条件”，给每个人发展的机会，才是最大的福利。文中提到了一句话：“富人通胀，穷人通缩”，整篇文章从经济发展的宏观视角 去分析在负利率、微增长时代 整个社会将会呈现 M 型经济体系。 文中的很多话 引起了我的共鸣，但很难引起思考，视角太宏观了.. \
    文中提到了一句话：“富人通胀，穷人通缩”，整篇文章从经济发展的宏观视角 去分析在负利率、微增长时代 整个社会将会呈现 M 型经济体系。 文中的很多话 引起了我的共鸣，但很难引起思考，视角太宏观了..
50. 分享个网站：

    Your GitHub story in 3D \
    <https://skyline.github.com/>

    Github 官方产品，View a 3D model of your GitHub contribution graph. Share it, print it, and more!\
    ![image-20210319215922814](/files/-MW9vE3GCUK2R8gJVYJV)

    看了一下，居然是使用 Vue 的 ssr 框架 nuxt.js 写的，3D 动画是通过 WebGL 实现\~
51. 快餐文分享：

    知乎文章转视频实现(乞丐版本) \
    <https://zhuanlan.zhihu.com/p/353515449>

    对不起，熟悉 ffmpeg 就可以为所欲为。 \
    这是文章的源码 repo - <https://github.com/leoython/text-to-video> 简单粗暴，可以看下。
52. 快餐文分享： \
    My guiding principles after 20 years of programming\
    <https://alexewerlof.medium.com/my-guiding-principles-after-20-years-of-programming-a087dc55596c>

    一位编程 20 年的前辈，列举出职业生涯中积累的 20 条原则。 \
    文中有两个观点很赞同：

    1. Expose yourself to other languages, technologies, culture and stay curious.
    2. Never start coding (making a solution) unless you fully understand the problem.

    第一点保持好奇心、保持热情 才能源源不断的持续进步。 \
    第二点很有共鸣，之前打 ACM ，经常读完题目 根据内心最直观的想法去 coding... 然后再花大量时间 debug...
53. 分享篇文章：

    Does every programming language have a central package repository? <https://codelani.com/posts/does-every-programming-language-have-a-central-package-repository.html>

    摘要：The other day I was curious: does every programming language have one of these? I decided to find out. I pointed my crawler and trained a model to check for a package repository for every one of the 3,006 languages I am tracking. The results surprised me.

    文章简介了 作者训了模型 爬取了 3,006 languages(WTF，猜测 这里不应该是PL的个数，作者没给出 context)，然后总结了下具有包管理的语言数据\~

    可以与之前的包管理的讨论 联系起来\~

    ![image-20210319220003972](/files/-MW9vLqHVA6WAi4ZE8lo)
54. 今天在 Twitter 上刷到一条消息，大体内容是 为什么有这么多公司 招 K8S 工程师？具体是干嘛？ 下面有条热评 - 是写 yaml 高级工程师。

    给我的感受是 听起来很 easy，但 easy is not simple。 \
    正如这篇文章所说：To understand all the peculiarities and to have the ability to configure and debug such systems, one should have a good understanding of microservice architecture and containerization(容器化) principles. \
    之前也有分享过很多类似的观点，比如 Golang 的设计，CSS 隐藏在背后的复杂性 等。
55. 每日一句分享： \
    Program testing can be used to show the presence of bugs, but never to show their absence. - Dijkstra \
    测试只能表明程序中存在错误，而不能表明程序中没有错误。

    很明显，这句话是在说 测试不能兼顾到程序运行时的所有场景，但是如果能枚举程序运行时的每一个场景（理想） 是不是就能达到完美的测试呢？

    就比如 类型系统，int num = "Hello World" 显然是错误的，因为 int 枚举出了取值类型与取值范围。

    对于一个程序普通的编译时错误，可以通过静态分析来解决，而运行时的错误 是无法兼顾到的，你永远不可能检测到 外部 IO 到时是什么，这时候唯有 形式化方法 才能解决。 \
    当然 不提场景都是无意义的，形式化方法 也是场景有限。
56. 快餐文分享： \
    形式化方法基础 <http://kaelzhang81.github.io/2018/03/19/%E5%BD%A2%E5%BC%8F%E5%8C%96%E6%96%B9%E6%B3%95%E7%AE%80%E4%BB%8B/>

    摘要： 针对60年代出现“软件危机”，业界提出两种解决方法：

    1. 采用工程方法来组织、管理软件的开发过程；
    2. 深入探讨程序和程序开发过程的规律，建立严密的理论，以期能用来指导软件开发实践。 前者导致“软件工程”的出现和发展，后者则推动了形式化方法的深入研究。

    形式化方法是基于数学的特种技术，适合于软件和硬件系统的描述、开发和验证。将形式化方法用于软件和硬件设计，是期望能够像其它工程学科一样，使用适当的数学分析以提高设计的可靠性和鲁棒性。但是，由于采用形式化方法的成本高意味着它们通常只用于开发注重安全性的高度整合的系统。

    文章介绍了 形式化方法的常见概念，感兴趣的同学可以了解下。
57. 快餐文分享： \
    Will it finally: a try/catch quiz \
    <https://frontarm.com/james-k-nelson/will-finally-run-quiz/>

    文中用多个问题 列举了 try catch finally 在不同场景下执行的不同结果，并给出了答案。

    我的理解是，try catch finally 是一套独立的 execute context，如果运行时 throw error，则 按照顺序（t-c-f）运行完成之后，所在的 func frame 会自动弹栈；如果没有 catch 到 error，运行完成后 还会继续往下执行;

    除了涉及 error 的场景还有 try catch 中调用 return ，catch statement 中 throw error 的场景，这两种场景都偏少见（主观觉得研究这些语法毫无意义） 文章也给出了相应的例子，可以看一下。
58. 概念分享： 锚定效应(认知偏差的一种) Wiki 定义：\
    人类在进行决策时，会过度偏重先前取得的资讯（这称为锚点），即使这个资讯与这项决定无关。在进行决策时，人类倾向于利用此片断资讯（锚点），快速做出决定。在接下来的决定中，再以第一个决定为基准，逐步修正。但是人类容易过度利用锚点，来对其他资讯与决定做出诠释，当锚点与实际上的事实之间的有很大出入，就会出现当局者迷的情况。

    想到的例子：小米手机发展史，估计大家都知道小米手机 主打的就是性价比，在最开始进入手机行业时，米 1 的发布定价 就成为了锚，成功打乱了平静的市场，把各大厂商的价钱压低很多。

    来自知乎上的例子：比如当一只股票价格过高时，上市公司就会拆股，比如一拆五，就是一股变五股，那么股价就会降低。以前100块，一拆五后，理论上会变为20元。一些算术不好的股民就会认为，以前要100元，现在只要20元。赶紧买！ \
    大家生活中有遇到过锚定效应的例子吗？ - 小菜鸡的回答 - 知乎 <https://www.zhihu.com/question/21230051/answer/203976948>
59. 别低头，往前看 \
    <https://mp.weixin.qq.com/s/QNm-6nblReW6bzuCy5iZHg>

    分享篇文章，讲解了 回忆时的自我抽离与自我沉浸视角的概念。以及如何利用自我抽离视角 去放下挥之不去的回忆，如何通过一些积极的事情，站在自我沉浸视角 去更好的生活。

    摘要: 永远把自己看作是一个不断流动、成长、变化的系统，每一刻的“我”都只是当下的我，我所有的错误和失败都只是我的经验，都是帮助未来的“我”变得更好的方式。 \
    文中提到了 在自我沉浸视角会被迫 采用回避策略，逃避创伤，为了不再受伤，宁可保原状，停滞不前。久而久之，就会产生回避型人格障碍。
60. 分享期视频: \
    【巫师】女首富的躺赢和撕逼之路，护肤和化妆品背后的资本帝国：欧莱雅 <https://youtu.be/GEa6Ic3tfDI> \
    视频很精彩，值得一看。\
    &#x20;![image-20210319220155654](/files/-MW9vcKM6QzinzvhANEO)
61. 分享期Podcast: \
    <https://moon.fm/share/episode/4178/> \
    🎙数据挖掘---龙星镖局(Justin)

    本期主要讲了数据挖掘是什么，应用场景在哪里(比如分析股票，推荐feed等) 以及应用深度学习分析的流程(花了很长时间讲监督学习与非监督学习的原理)，总体而言 数据挖掘是个综合性很强的领域。
62. 分享一个充满设计感的网站，给我的感觉很惊艳： \
    <https://www.samuelday.de/>\
    A: 有点苹果官网的感觉 各种视觉差

    B: 看了一下，动画是用 svg 写的，站点是用 webflow 平台搭建的..
63. 快餐文分享：

    大型 Web 应用插件化架构探索 \
    <https://mp.weixin.qq.com/s/EBI3NvirxKfRIRE9amJ4TQ>

    文章介绍了前端常见应用的插件系统：Atom、VSCode、Figma，以及 Figma 为了实现插件沙箱化 所做的实践，从iFrame（封闭性完美，但也由于太过封闭，无法高效通信）到 Proxy Global 对象 （依旧可通过原型链干涉外部）再到使用 外部WASM 编译器去执行插件。\
    作者最后也给出了 使用 WebWorker 做沙箱的一些探讨，和 CSS 隔离的一些方案。
64. 词汇分享： \
    infomercial - /ˈɪn.foʊ.mɝː.ʃəl/ \
    a long television advertisement, that contains a lot of information and seems like a normal programme

    Eg：About 3% of viewers who watch infomercials buy the product being pitched(推销).

    本词直译是电视广告，听起来有点距离（不会还有人在看电视吧），我觉得叫做信息广告更合适，伪装成正常信息的广告。 \
    像知乎回答 中的信息倒流到某电商，B 站中的恰饭视频，或者在 Ins 上刷到图片后 下面出现的 Product 链接.. 都称得上互联网时代的“电视广告”（infomercial ） \
    归根结底的原因是 信息流动的主要载体一直在变化。
65. 每日一句分享: \
    调试就像身处在一部犯罪电影中，你既是侦探也是凶手 - Sindre Sorhus
66. ![image-20210319220300594](/files/-MW9vmnbHItIBbi4_PXQ)
67. 《计算机科学概论》读书笔记分享:

    计算思维中的几种重要思想:

    1. 符号化思想 于人而言，信息与二进制之间的相互转换。于计算机而言，逻辑门电路构成了复杂的电路 这离不开电路特性与逻辑运算之间的转换。
    2. 程序化思想 不管一个问题多么复杂，只要是可计算的，就可以将问题解决过程分解成一系列基础指令。程序是一系列按照规定组合的指令集合。
    3. 递归化思想 递归思想的场景是将一个复杂的问题，层层转化为原问题相似的规模较小的问题求解。能够用有限的步骤定义无限的能力。许多重要思想，如分治思想、回溯思想、迭代思想、动态规划思想都与递归思想紧密相关。
68. 快餐文分享： \
    Introduction to the A\* Algorithm \
    <https://www.redblobgames.com/pathfinding/a-star/introduction.html>

    文章介绍了 A\* 算法，BFS 算法，Dijkstra 算法 在最短路径中的原理 以及差异 并给出了动画证明 与 每一种算法的实现。

    之前一直很想了解下 A\*算法，在搜了很多资料后 发现它实质上就是 Dijkstra 算法的策略升级版。 简单点来说， Dijkstra 算法基于简单的贪心策略（有个权重 hash，每次 visit 都会更新）但算法的整体过程还是没有明确终点的概念，所以它可以找到基于每一个点的最短路径。 但 A\* 算法则有明确的终点的概念，这里指的是 利于一些预估算法（曼哈顿距离算两点距离，或者 欧式距离这类）每次 visit 节点时 会动态选择 （当前节点 与 终点 结合 预估算法的距离）下一个最优的节点 作为起始节点。

    A\* 与 Dijkstra 算法的共同点 都是加权贪心策略，不同的是 A\* 可以用预估算法（也叫 启发式算法）做减枝优化。\
    &#x20;为什么之前搞算法 写减枝策略时 没有想到这一点呢... 我之前的减枝 只是简单的 判断当前节点的访问代价，每次遇到障碍图时 就不适用了.. 如果有引导算法 再加 优先队列 就轻松多了..
69. ![image-20210319220405061](/files/-MW9vsHkQCFWMX6HTVsC)

    A: 原来 Web 上的 数据绑定概念 很早就可以使用 plain html 实现了.. 我记得 最开始学 Web 的时候，只是简单了解过上面的标签用法，当时还没有 数据绑定的概念...

    B: HTML里还能写xml啊 涨姿势

    A: 是的，不过就算使用 也会隐藏起来不显示，H5 已经弃用了这个 xml tag.\
    <http://www.html-5.com/changes/deprecated/xml-tag.html>
70. 分享个鲜为人知的属性：

    document.currentScript 返回当前正在运行的脚本所属的`<script>` 元素.

    if (document.currentScript.async) { console.log("Executing asynchronously"); } else { console.log("Executing synchronously"); }
71. 快餐文分享： \
    你在用的浏览器又更新了，这些新功能值得一试 \
    <https://sspai.com/post/65371>

    Chrome 89 版本提供了很多人性化的功能：

    1. 自带「稍后读」
    2. 新增标签页搜索入口
    3. 默认使用 HTTPS 连接 ，减少 重定向，更详细的可看这篇文章 <https://9to5google.com/2021/01/11/google-chrome-address-bar-may-soon-default-to-https/>
72. 分享篇文章： \
    Chrome 89 DevTools 新功能 \
    <https://developers.google.com/web/updates/2021/01/devtools>

    文章顶部有中文视频介绍... 并且主持人的口音很好玩，听起来像粤语..

    于我（CV 程序员）而言，最有用的功能 就是支持右键快速复制 CSS rules 了。
73. 每日一句分享: \
    大多数人都高估了他们一天能做的事情，但低估了他们一年能做的事情。
74. WebP2P 让你的直播免流 - villainHR的文章 \
    <https://zhuanlan.zhihu.com/p/33716171> \
    快餐文分享，文章主要讲解了 WebRTC 建立 P2P 连接的细节。 \
    文章有一点跳过了，为什么双方都是 对称性NAT 无法打洞，对称性 NAT 在 每一次内网与不同的外网主机通讯时，会 重新分配另一个内网端口号，当双方都是 对称性 NAT 时，理论上是无法打洞成功的。 \
    而国内的运营商的 4G网络，公共 WiFi，因为安全因素 都选择采用的是 对称 NAT，这就是为什么 P2P网络 在国内几乎没办法落地的原因。\
    当然可以使用 一台高带宽的服务器做中转，去伪实现双端通信(对服务器可用性要求会很高)。 \
    其实打洞也是个很有趣的行为，属于网络协议的安全漏洞了。

    打洞的过程: A 和 B 需要和 STUN 服务器建立连接，获得 A/B 的公网 ip:port 和私网 ip:port。 B 往 A 发送一个打洞包，此时，已经在 B 的 NAT 上留下到 A 的 打洞 session。但是，由于该包没有 A NAT 的 session 记录，会被 A 拒绝掉。 A 往 B 发送一个打洞包，该包会在 A 的 NAT 上增加 B 的 session。此时，由于 B 的 NAT 上存在 A 的 session，该包是可以直接被 B 的 NAT 通过的。 打洞完成。
75. 姓 TRUE 可还行.. \
    ![image-20210319220610008](/files/-MW9w3Cb2wu1KBvo0xUu)
76. ![image-20210319220616102](/files/-MW9w5e-CWHkqfDtrt4p) \
    unfold 是 FP 中常见的 functor，可以隐藏与上下文无关的状态，减少复杂性。
77. 分享篇故事: \
    一个程序员眼中的上帝，会设计出啥样的电脑系统？ \
    <https://www.techug.com/post/what-kind-of-computer-system-will-a-programmer-design.html>

    曾有幸访问过主人公的作品网站，抛去种族主义，精神问题不谈，是个纯粹的人。
78. 黄玄 base64 原理的视频 \
    <https://www.bilibili.com/video/BV1xy4y187MF> \
    不得不说视频做的真好hh
79. A: 既然谈到这些自带的数据结构，那么问题来了。 \
    Question: 对象存储键值对 与 Map 有什么差别吗？

    B: 对象只能存字符串吧 \
    A: 是的，对象的 key 只能字符串，Map 的 key 不限类型。 \
    C: obj\[{}] = 10; 它是存的时候就变成了字符串，还是读取的时候呢

    A: 存储的时候。 会调用 toString 方法，转换为 key。

    还有一点，Map 实现了\[Symbol.iterator] 方法，最明显的体现就是 Map 可以被 for of 遍历。\
    &#x20;C: 貌似String也实现了这个方法😂 太神奇了 \
    A: 是的，可以支持 for of，或者 \[...variable] 就证明该变量实现了 Symbol.iterator\~ \
    有趣的是 Python 也是有相关的魔法方法的，**iter** 与 **next** \
    |![image-20210319220802447](/files/-MW9wI8Bc-lYBTL7A41D) \
    这其实称得上 另一种形式的运算符重载了\~ \
    ![image-20210319220812142](/files/-MW9wJxaovTRdRAbfqVr)
80. 这种对 UI 的计算，看起来真是太酷了\~ 理性与美感的结合。 ![image-20210319220821954](/files/-MW9wMIu3mjRxbWgHWZ6)
81. ![image-20210319220826886](/files/-MW9wRC2KI1oiIUh551F) \
    原来 DevTools 也是可以被调试的... \
    用 DevTools 去调试 DevTools，果然 递归是计算理论的基础。
82. 分享个项目：

    xiaochunjimmy/Sogou-Input-Skin \
    <https://github.com/xiaochunjimmy/Sogou-Input-Skin>

    作者设计了搜狗拼音输入法的几款极简风格皮肤，十分漂亮\~ ![image-20210319220850463](/files/-MW9wTktZI_FrsnlEL9h)
83. 分享一门小众语言： \
    LiveScript - <http://livescript.net/>

    LiveScript is a language which compiles to JavaScript. It has a straightforward mapping to JavaScript and allows you to write expressive code devoid of repetitive boilerplate. While LiveScript adds many features to assist in functional style programming, it also has many improvements for object oriented and imperative programming.

    JavaScript 最初的名字是 Mocha，然后改成了 LiveScript，最后定为了现在的名称。

    该语言的一些语法 看起来还是挺有吸引力的，支持列表生成式，|> pipe 式调用，支持链式比较.. \
    不过其他的语法 "噪音"都很强.. 尤其是使用缩进来划分代码块...

    并且该语言还完成了自举，看得出来 开发者很用心 （没错，我就在点你 swift）
84. 每日一句分享: \
    There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies.
85. 分享篇短文: \
    -2000 Lines Of Code \
    <https://www.folklore.org/StoryView.py?story=Negative_2000_Lines_Of_Code.txt>

    用代码函数衡量生产率太蠢了。
86. 快餐文分享: \
    What Is JavaScript Made Of? \
    <https://overreacted.io/what-is-javascript-made-of/>

    Dan 19年的一篇文章，整体偏基础概念。
87. 【译】下一代前端构建工具 ViteJS 中英双语字幕 ｜ 技术点评 <https://juejin.cn/post/6937176680251424775> \
    GitHub Open Source Friday 关于 vite 的访谈
88. 刚刚了解到原来二次加盐 主要目的是为了防止彩虹表查询的。 \
    记得字节一面问过这个问题，我回答很笼统: 为了增加密码被暴力破解的难度。
89. “能量既不会凭空产生，也不会凭空消失，它只能从一种形式转化为别的形式，或者从一个物体转移到别的物体，在转化或转移的过程中其总量不变”。这叫做能量守恒定律，1847年由德国物理学家、生理学家赫尔姆霍茨（1821—1894年）首先提出。 \
    “复杂度既不会凭空产生，也不会凭空消失，它只能从一种形式转化为别的形式，或者从一个抽象概念转移到别的抽象概念，在转化或转移的过程中其总复杂度不变”。这叫做复杂度守恒定律。 \
    当然如果做到 足够复杂且没有缺陷，那么整体的复杂度会转换为 一个个功能的认知成本，复杂度被隐藏了。 \
    从宏观角度而言，复杂度是守恒 或者 由于设计得不合理 复杂度会增高，但从用户的角度，是感受不到所有复杂度的。\
    就像 程序员 不必懂得计算机中是如何控制电流的。
90. 想到一个问题: 当两个客户端在建立 TCP 长连接后，网络传输的物理介质突然 down 掉，这时 TCP 连接还会继续吗？\
    答案是会的，因为 长连接 是使用心跳检测机制 来保证连通性的。等到下一次心跳才会断开，而这里的断开 也就是在系统的内存区中 清除连接状态。
91. 分享个网站: \
    看看AI怎么接着写 \
    <https://sundamao.com/>

    有点惊讶，这AI回答的很有逻辑，虽然读起来怪怪的... \
    数据集应该全是爬到的..
92. 一首小诗: \
    I have updated the dependencies that were in the package.json

    and which you were probably pinning for some reason

    Forgive me they were outdated so vulnerable and so old

    <https://twitter.com/tesseralis/status/1369162628384235522?s=19>
93. Node.js 并发能力总结 \
    <https://mp.weixin.qq.com/s/cXwM_ENAjxvvwaBHEsuHbA> \
    快餐文分享: 文章给出了 限制数量 异步请求，超时异步请求的实现，并简单介绍了 asyncHook 的作用，多线程多进程在 Nodejs中 使用。
94. Question: Nodejs 适用于 IO 密集型还是 CPU 密集型？ \
    计算密集与IO密集最本质的差别 就是 计算密集主要在用户态花费时间，IO密集则是在内核态。 \
    A: 不是吧

    我觉得 计算密集(CPU密集) 主要就是计算，不需要进入内核，用户态就可以完成。 IO 密集因为需要很多读取写入，程序需要各种系统调用完成，而这一过程是在内核态进行。这是我的理解 。\
    答案是 IO 密集型，主要靠 libuv 库 将阻塞IO请求 转换为 异步请求。
95. 漫画 | Google剽窃了我的算法！ \
    <https://mp.weixin.qq.com/s/eZIjMAYu0xp8nOGj9Q48sA> \
    分享篇文章，介绍了 pageRank 的权重机制，整体来说 写的很浅，没有介绍清楚。 \
    可以看下这本书《改变未来的九大算法》，里面有 pageRank 更详细的介绍。
96. ![image-20210319221347717](/files/-MW9wtkxxK3Uzqrht6qw)
97. 快餐文分享: \
    Interview with Ryan Dahl, Creator of Node.js \
    <https://evrone.com/ryan-dahl-interview>

    一篇访谈 Ry(nodejs deno creator)的文章。\
    文章很长，涉及的点很多 不只是关于 Deno，有一些关于语言看法，新手程序员学习建议，Node 初期时应该着重的事情等等等.. 并且文章内 Ry 也表达了 Nodejs 不适用于 CPU 密集型场景的观点。

    I don't consider TypeScript a separate language; its beauty is that it's just marked up JavaScript.

    摘抄自文章。

    Website cookie popups are not the best analogy - they're a fairly useless legal byproduct.

    很赞同这句话。可惜在国内还没有对 cookie 等用户信息 建立全面的法律机制。
98. A:那个monorepo是怎么管理代码的啊？对src进行自动拆分吗，还是什么？ \
    B: 解决了吗？我也不是很懂具体原理，只知道解决了 依赖复用。 \
    有两个比较常见的 monorepo : leran 与 yarn workspace \
    不是对 src 进行自动拆分，是为了多项目的场景 才去用 monorepo 的。 ![image-20210319221451876](/files/-MW9wzSns7aXpytkTlhQ)\
    可以看下上图的项目结构，packages 中的每一个包 都可以独立维护、发布，而这些包共同组成了 一个大的项目。 \
    就比如上图中 画图项目 是由 流程图、类图、时序图等这些子项目组成的。

    而 yarn workspace 与 lerna 的工作机制 笼统来讲 就是用于同一项目下多个 repo 依赖管理、发布，可以减少开发时 多项目依赖的复杂度，构建成本等。
99. 每日一句分享: \
    路过我们生命的每个人，都参与了我们，并最终构成了我们本身。
100. ![image-20210319221519996](/files/-MW9x3s_ZAUEVpSzhn1s) \
     两个有序数组合成一个有序数组，时间复杂度 O(m+n)，有更优解吗？\
     &#x20;很明显最优解应该是 O(Max(m,n)) \
     哈哈，想到一个办法 是可以做到的，把两个数组打到一个 hash 上，再取到两个数组的最大值，常数项遍历一遍取映射值 就可以做到 O(Max(m,n))。 \
     所以 大 O 计数法就是个理念上的概念，依据它算出的最优解 从某些 case 上来说 并不会比 O(m+n) 快。
101. 分享篇文章： \
     F\*\*k Domainparkers \
     <https://www.indiehackers.com/post/f-k-domainparkers-14f52b7724>

     作者呼吁人们不要在炒作域名，二次销售域名了...

     hah 域名一项是件有利可图的事情，还记得 麦代劳改名 金拱门，金拱门域名经过几次周转被炒到了 30w\... \
     我也遇到过相同的事情，还记得当时看到了 mj.net 这个域名，要价 15w 一年
102. ![image-20210319221608105](/files/-MW9xEa06FO7815Y9xSc) \
     上图来自 Go 2020 survey，好家伙 感觉除了 package management 其他的真是一点没变.. \
     分享篇文章：\
     Go Developer Survey 2020 Results \
     <https://blog.golang.org/survey2020-results>

     可以看出 Golang 现在的发展、主要生态、适用的场景..

     快进到 Go 1.18 吧，毕设要用不上了泛型了..
103. ![image-20210319221636512](/files/-MW9xHDCuUcmU7qknXzv) \
     新特性：Error Cause ，目前 Stage-3
104. 任何设计以及建造同时发生在同一个人身上的心智活动，都是艺术创作。 编程也是属于艺术创作的一种心智活动。

     摘抄自：企划：一本有关程序的词典——《编程语言词典》\
     <https://ray-eldath.me/programming/dictionary-project/>
105. 好文分享: \
     I bought 300 emoji domain names from Kazakhstan and built an email service \
     <https://tinyprojects.dev/projects/mailoji>

     现代社会典型的成功案例。 \
     作者从一个简单的idea (emoji email address service)，到借助Tiktok，produce hunt 推广，最后获得成功的故事。 \
     我 todo list 一直有一项是: 借助获取信息能力，发掘有信息差的产品，再依靠现在的社交平台 推广，获利。

     从文章可以看出，一个成功的产品离不开，对可行性产品的挖掘能力，执行力 快速打造mvp，以及根据现有资源的推广。

     分享下之前了解过一个真实案例，A 在github上发现一个可以借助 ml 还原老旧照片的项目，A 很快根据它打造成一个简单的软件，然后在抖音上进行推广，并留下自己的联系方式，当天就有数百人加他，他的定价是每张照片 5-10 元，可以想象下～

     分享下我自己的故事，我 github 有一个 1.8k star 的项目，这个项目最开始只是源于 我对一款产品使用方式的不满，感觉这款产品受众很广，但使用姿势却很 geek，普通用户有很大的门槛。于是 我花了几天，简单包装成了可视化软件，并在各大社区 人肉推广，慢慢的越来越多的人了解到，下载量过 20w\..

     一款产品的成功 靠得并不是发明者而是看到产品潜力的人。
106. 每日一句分享： 人生的意义就是探索人生的意义。
107. Haskell 实现 快排：

     quicksort \[] = \[] \
     quicksort (x:xs) = (quicksort \[y | y<- xs , y < x] ) ++ \[x] ++ (quicksort \[y |y<- xs, y>=x])
108. ![image-20210319221739886](/files/-MW9xP0b9vHES0Gk40as)
109. 2013 年 React 的官网 <https://web.archive.org/web/20130607112820/http://facebook.github.io/react/>\
     ![image-20210319221757842](/files/-MW9xTip725hvYkvoKEI)
110. 生活是人为了生存和发展而在一定的自然环境和社会条件中进行的各种活动。它是有着内在联系的多层次多方面的整体系统，实质上是人的生存发展需要的不同表现，也是围绕着以需要为基础的利益而进行，并随着需要和利益的变化而变化的。 生活的内容和水平取决于物质生产状况和社会发展水平，同时也与个人的文化状况、能力和社会联系有关。在社会生活中形成的人生观反映了人们在不同生活领域内活动的需要和意义，对生活有着规划、调节和控制的作用。 \
     摘自寻找 生活是什么 时看到的百科解释。 \
     A: 用冷冰冰的解释来定义充满意识情绪的生活，真好
111. 词汇分享: \
     dread

     1. verb to feel extremely worried or frightened about something that is going to happen or that might happen.

     Eg: That night as he dreamed, the warrior was confronted by the enemy he dreaded most.

     1. noun a strong feeling of fear or worry:

     Eg:The prospect of working full-time fills me with dread.
112. 皓叔：中文区的互联网趋向于越来越封闭，能深度讨论的事越来越少，而全网都在创造“10万+”，一切唯流量是首，目的只是为了迎合看热闹的大众，收割流量，而不是输出有价值的东西，仅有的有价值的内容也都在被私有化起来变现……所以，从长远的角度来看，中文圈的信息只会越来越差……

     A: 确实随处可见的广告，流量至上，国内搜索引擎出来的前几条都是广告水文\
     B: 还有为了提升搜索引擎权重建立的各种 收集网站\
     互联网流量不管是pc时代还是移动时代 一直都把握在资本巨头手中。\
     &#x20;为了商业化、流量不丢失，导致获取信息的过程中出现了一系列魔幻产物。 \
     万维网之父 李博士很早就意识到了这一点，所以近些年他一直在推广去中心化的网络模型。 \
     由于破坏了资本的根本利益，所以去中心化的网络也只能存在于乌托邦。
113. 每日一句分享: \
     今天，是你生命中最年轻的一天。

     (也是你爱的人 生命中最年轻的一天)
114. 每日一句分享: \
     I'm convinced that the only thing that kept me going was that I loved what I did.

     我深信，保持前进的唯一动力，就是我热爱自己所做的事。
115. ![image-20210319221954724](/files/-MW9xf2lDM5fQ9hJAVoj) \
     filter movies manually by rating.
116. 热力学第二定律告诉我们，物质与能量只能沿着一个方向转换，即从可利用到不可利用，从有效到无效，从有秩序到无秩序。热力学第二定律实质上就是说宇宙万物从一定的价值与结构开始，不可挽回地朝着混乱与荒废发展。

     热力学的两个定律可以用一句简短的句子来表达：宇宙的能量总和是个常数，总的熵是不断增加的。

     摘抄自 《熵：一种新的世界观》
117. cherish - /ˈtʃer.ɪʃ/ verb

     1. to love, protect, and care for someone or something that is important to you.

     Eg: Although I cherish my children, I do allow them their independence.

     1. to keep hopes, memories, or ideas in your mind because they are important to you and bring you pleasure.

     Eg: I cherish the memories of the time we spent together. \
     A: 啥学词 app？ \
     B: 不是 app，是剑桥词典网站。 \
     <https://dictionary.cambridge.org/dictionary/english/cherish> \
     C: cherish 貌似很常见 可以翻译成: 把...当成宝贝 \
     B: 不常见的是 cherish 后面的名词。
118. 在内存只有 24KB 的电脑上写操作系统，是怎样的体验？ \
     <https://mp.weixin.qq.com/s/NMEBNoF-gRpVPZQTNSBEUQ>

     快餐文分享，介绍了 Unix 的前世今生，Unix的发明其实只是40年前的事情。
119. ![image-20210319222115396](/files/-MW9xloDy4lHhb_dM_ux) \
     WebRTC 集网络传输、音视频处理的一套 Web 标准。
120. 分享篇文章: \
     Rockstar thanks GTA Online player who fixed poor load times, official update coming \
     <https://www.pcgamer.com/rockstar-thanks-gta-online-player-who-fixed-poor-load-times-official-update-coming/>

     R\*回应了，与之前文章的作者取得了联系，准备在下一版本更新，并可能奖励1w美金给作者。
121. 好文分享: \
     Performance comparison: counting words in Python, Go, C++, C, AWK, Forth, and Rust \
     <https://benhoyt.com/writings/count-words/>

     作者根据自己常年出的一道面试题(文本分词后，根据出现频率进行排序)，给出了多个语言版本的解决方案，并给出不同语言的优化版本。

     文章很长，读完后有一些感想:

     1. Go 的性能测试工具很现代，可视化到一个 web 页面
     2. C++ 还是那么不可读，哪怕是简单版本
     3. 同样 Rust 的多个符号组合让人畏惧
     4. 社区的贡献力量 很庞大
     5. C 与 py 的代码函数 说明了背后隐藏的复杂度
     6. 性能瓶颈不在于 io，而是 hash 操作与分词
     7. wc 永远滴神
     8. 语言越底层，优化的技巧越多

     之前我还用 Go 写过 WC 的4个版本，感兴趣的同学可以看下基本原理。 <https://github.com/Tomotoes/WC>
122. 每日一句分享:\
     一流的投资者研究投资者情绪，就是股民们的喜怒哀乐等；二流的投资者研究政府政策；三流的投资者研究企业基本面，就是企业的产品、竞争力、利润率之类；四流的投资者研究K线，就是股票价格的走势、股票交易量等。

     摘抄自《金融思维》
123. 腾讯的HR方法论：以用户思维发现需求,用产品思维制定政策,用运营思维推行政策。

     摘抄自 《腾讯人力资源管理》
124. ![image-20210319222220480](/files/-MW9xsxj8WYHLuQsUCfw)

     让我想起了之前TS的复数模型。

     ![image-20210319222240739](/files/-MW9xvfbyPNtW-UZzX74)
125. 编程语言新宠 Rust 不完全入门指南 \
     <https://mp.weixin.qq.com/s/2CkSpOmt0aYuGAEcl1XByw>

     快餐文分享，文章比较基础，讲解了 Rust 常见的语法特性，对 Rust 感兴趣的同学可以了解下。 现代的编程语言真像是一个个组装工。
126. Dimmed theme beta for GitHub.com \
     <https://github.blog/changelog/2021-03-16-dimmed-theme-beta-for-github-com/>

     Github 出了新的主题皮肤。
127. 字节跳动最爱考的前端面试题：计算机网络基础 <https://juejin.cn/post/6939691851746279437>

     分享一些基础面试题，找工作的同学可以查漏补缺下。 \
     文章有关建立 https 连接的过程 缺少信息，https 层分为多个版本，每个版本都是有差别的。

     翻了下之前分享的文章，简单来说 TLS 握手分为三个版本: 1.0，1.2，1.3。 1.0 就是最基础的加密过程，就是文中提到的。1.2 去掉了 rsa 的密钥加密算法，换成了更安全的ECDHE 算法，此时需要的加密参数发生了很大变化。1.3 则是完全去掉了 rsa，并且整个建连的过程只需要一次rtt.
128. 善于利用思维时间的人，可以无形中比别人多出很多时间，从而实际意义上能比别人多活很多年。\
     善于利用思维时间的人则能够在重要的事情上时时主动提醒自己，将临时的记忆变成硬编码的行为习惯。

     每个人的手表都走得一样快，但每个人的生命却不是。衡量一个人生活了多少年，应该用思维时间来计算。 因为看书并记住书中的东西只是记忆，并没有涉及推理，只有靠推理才能深入理解一个事物，看到别人看不到的地方，这部分推理的过程就是你的思维时间，也是人一生中占据一个显著比例的“暗时间”，你走路、买菜、洗脸洗手、坐公车、逛街、出游、吃饭、睡觉，所有这些时间都可以成为“暗时间”，你可以充分利用这些时间进行思考，反刍和消化平时看和读的东西，让你的认识能够脱离照本宣科的层面。\
     这段时间看起来微不足道，但日积月累将会产生庞大的效应。 \
     能够充分利用暗时间的人将无形中多出一大块生命。\
     以上文字摘抄自 《暗时间》 刘未鹏 想表达是 利用好碎片时间，并且学习时多思考，深入理解当前的知识，这样 你的思维时间将会越来越多。
129. 每日一句分享: \
     A few lines of reasoning can change the way we see the world.
130. Open JDK 16 发布： <http://openjdk.java.net/projects/jdk/16/>

     在语法上提供了 Recode，Instace Pattern Matching等特性。
131. 快餐文分享: \
     Why Video Chat is a Hard Technical Problem \
     <https://dev.to/lazerwalker/why-video-chat-is-a-hard-technical-problem-43gj> \
     作者从4个方面阐述了 WebRTC 实践上的难点:
     1. 音视频设备获取数据在不同浏览器上的兼容性与不一致表现。
     2. WebRTC 需要信令服务器进行转发握手信息。
     3. 如果遇到对称性NAT 或者防火墙 只能自己建设 TURN 服务。
     4. 如果存在某一节点网速变慢，WebRTC 是无法做到端对端调整码率，只能从 p2p 改成 中心化的智能转发数据架构。
132. 快餐文分享: \
     聊一聊Serverless \
     <https://lengyuexin.blog.csdn.net/article/details/113833894>

     摘要: 从架构角度理解，Serverless=FaaS+事件驱动+BaaS=无服务器计算(Serverless computing) Faas:Function as a Service,函数即服务 事件驱动：通过事件触发的形式去完成函数的调用，处理请求和响应（如定时任务/http请求…） Baas:Backend as a Service 后端即服务

     这篇文章介绍 serverless 虽然偏基础，倒也说清楚了 无服务是什么，适用场景。\
     ![image-20210319222618414](/files/-MW9yCRx-SSQmRhx8rxt)
133. 黄峥隐退：「我想去摸一摸 10 年后路上的石头」 <https://mp.weixin.qq.com/s/WC09xWsRp8g8JznfCNc-Ew> \
     正值壮年，接连退任董事长、CEO，丢掉权利巅峰去追寻科学梦想，看起来像是个热爱科研的理想主义者，有点意思。
134. V8 release v9.0 \
     <https://v8.dev/blog/v8-release-90> \
     提供了 regex 的 indices 属性，其余的都是性能上的优化。
135. ![image-20210319222651953](/files/-MW9yGbEs0F3wi5GSTtp)
136. Py 3.10 发布了 Patter matching 语法，看起来还是挺局限的，只能匹配指定的结构。 \
     <https://www.python.org/dev/peps/pep-0636/>

     我一直有个疑问，不支持代数类型的模式匹配 除了简短语法，还有什么意义。 \
     如果只是简单的值结构匹配，没有类型匹配，那看起来只是 解构的另一种表达。


# 19-31

暂未分类

1. 分享篇 Go 圣经中的一章节: 9.8. Goroutines和线程

   <https://books.studygolang.com/gopl-zh/ch9/ch9-08.html>

   很好地解释了协程的意义，为什么优于线程，线程调度的缺点，以及是如何打满多核CPU的。

   文章对 Golang 协程调度器只是简单地带过，感兴趣的同学可以去搜下 Golang GMP Scheduler.
2. QUIC 协议原理浅解

   <https://mp.weixin.qq.com/s/Bm_4M-QCcWYRqv1V8a-J-A> \
   好文分享，文章介绍了 HTTP 协议的历史上不同的版本、特性、缺点。 HTTP3 over quic 是如何从 udp 层解决历史遗留问题的，最后给出了 quic的多种特性，以及报文组成。

   总结下文章提到的 quic 特性:

   1. 动态连接，就算客户端换了 ip，网络环境 还是可以保持连接。
   2. 0 rtt 握手，直接覆盖了 https 组成的 tls 层。
   3. 可自定义拥塞控制算法，传统的 tcp 拥塞控制 总是用力过猛(直接减半，在递增)，而这些年很火的 谷歌推出的BRR 算法则柔和的多，可惜标准已定 只能手动更改。
   4. 利用额外的字段，解决了队头阻塞问题。

   这些特性，每一个拿出来 都足够改变现在的网络环境。 \
   记得之前了解过，早期的QQ通讯 就是用的两次udp 机制实现 消息确认的。
3. 每日一句分享: \
   对于运营来说，“制造冲突”是一种比较有风险的做法。当然，这也是一种能够在短时间内制造出用户活跃和用户引入的做法。最通常的运营方式是利用社会热点，创造多种不同角度、不同立场的初始内容，然后通过多种手段，让认同不同观点的用户发现彼此，并制造出冲突，从而引发用户的站队。 \
   摘抄自《从零开始做运营》
4. 分享个网站，收集了 一些常见的 IT 词汇。 \
   The Strange Roots

   <https://www.thestrangeroots.com/posts/>

   记录下两个没印象的词汇:

   1. Dongle 适配器
   2. Nintendo 任天堂

   SpringBoot ✘ 全栈式应用程序框架 ✔ 春季靴
5. 快餐文分享: \
   Asynchronous programming. Blocking I/O and non-blocking I/O

   <https://luminousmen.com/post/asynchronous-programming-blocking-and-non-blocking>

   作者简述了 socket 通信中基础的IO模型，阻塞 IO、NIO，并给出了 Python 实现的 Demo，结尾讲解了 多任务不同架构的优缺点，多进程 或 多线程。

   文章并没有将传统的多路 IO 模型与例子结合起来，我补充下: \
   Select Poll epoll 都是 NIO 模型。 文中给出的 NIO Demo 与 Select 的原理相近。
6. ![image-20210331192759108](/files/-MX7H5e3uw6dC9L0f3to) \
   React Fiber 工作机制。
7. 想到一个问题: 如果只有一个线程 可以实现异步吗？ \
   想了想 应该是可以通过硬件提供的 scheduler 机制 做到。 \
   呃，这个问题没有意义。

   其实昨晚想到的那个 如何在单线程 （单个执行单元）实现异步的问题。 \
   我的第一想法就是 通过事件模型，像 JS 这样。 但是很明显，虽然执行的过程是单线程的，但是 事件触发的机制 是单线程无法保证的。 \
   而不管是 浏览器环境 还是 JS 独立的运行时，当外部 IO 完成后，回调函数插入事件循环 这一过程，是单个线程无法做到的。 \
   换个角度来思考，JS 的这一套单线程执行机制 + 事件循环模型，在一定程度上 屏蔽了 并发原语带来的复杂性..
8. 好文分享: \
   Self：编程语言的变革仍未到来

   <https://ray-eldath.me/programming/self-language/>

   文章很短，但作者翻译的那段话非常有价值，值得思考。 \
   摘要：是机器服务于人类，还是人类服务于机器？人们创造了人造物，而它们又反过来重塑它们的创造者。这些人造物包括能产生深远影响的思想体系。\
   &#x20;有些思想体系其实是元思想体系——也就是说，它们是构建其他思想体系时应该遵循的思维方式。\
   由于它们指导着其他思想体系的构建，所以它们的影响尤其大，人们在设计这样的元思想体系时必须特别小心。 \
   用户界面框架和编程语言语义却要求用户以某种特定的方式思考，而我们却未能说服世界，以我们提出的方式思考要更好些。我们是错在试图唤醒事实上并不存在于每个人心中的创新性精神吗？还是说使用动态语言有一些经济学意义上的影响，使之不切实际？\
   我们，编程语言研究界的许多人们都在暗自怀疑，编程语言研究是否已经与世界上大多数的程序员无关——尽管显而易见的事实是，在许多方面，计算机仍然是痛苦的、不透明的黑盒子，它仍在传播新的数字瘟疫。
9. 3 月 1 - 18 日 汇总分享，共产出 136 条，暂未分类： <https://thinking.tomotoes.com/archives/2021/3/1-18> \
   由于现实中要做的事情越来越多，并且最近接触的信息媒介 偏书籍（很难像文章 作为信息流分享），所以分享频率 与上月降低了小一半.. 而且主题讨论 也很少进行了。 \
   我相信事情是可以一件一件一件一件做完的😷
10. ![image-20210331192931950](/files/-MX7HJcBn0oSGPZV-M1J) \
    CSS IS AWESOME！
11. 好文分享： \
    introduction-to-parser-combinators

    <https://gist.github.com/yelouafi/556e5159e869952335e01f6b473c4ec1>

    这篇文章是我最近读到 关于函数式 最好的一篇了。 \
    作者在文章开头，从一个简单的加法解析 Demo 讲解了 parser 的基础概念。 并一步步递进，通过 组合多个 parser 实现更高级的能力。 文章中半部分是全文最精彩的内容，通过一个个 combinator，FP 的优美强大体现得一览无遗，即保证了程序的可读性 又完全与副状态隔离，在数据流映射与转换的过程中，实现了可支持多种计算的解析器。 \
    文章最后给出了 generator 形式的实现，而 generator 历来都是 FP 最基础的特性之一。

    对这篇文章感兴趣的同学，非常建议反复阅读。
12. 分享一个项目： \
    Charts.css

    <https://chartscss.org/>

    一个 通过 CSS + Table 实现数据可视化的库，这种可视化的打开方式 还是挺新奇的\~

    ![image-20210331193007005](/files/-MX7Hbd0ErqcLCN090ZK)
13. ![image-20210331193011926](/files/-MX7He8uGwSMt7M_AIln)

    HTTP 的强缓存与协商缓存 经典图解。
14. 每日一句分享： \
    人生所有的事情之中，后悔是最可怕的。 失败是一种答案，拒绝也是一种答案，但后悔却是永远得不到答案。"要是我当初......"、"如果我那样选了......"、"不知道如果走了那条路会怎样......"，你永远、永远都不会知道答案，而且这些疑问会纠缠你一辈子。

    ——来自《天生有罪》
15. 快餐文分享： \
    Useful Hooks

    <https://react-typescript-cheatsheet.netlify.app/docs/basic/useful-hooks> \
    文中给出了一些 Hooks 的实现，不过偏少..

    我之前整理过一份 Hooks Recipes，里面有数十个 我觉得优美的 Hooks 实现，感兴趣的同学可以了解下\~

    <https://thinking.tomotoes.com/tags/docs/dig-deep-into-hooks>

    ![image-20210331193041543](/files/-MX7HiM-Np9bpvpqdttL)

    参考了多个开源仓库 ahook、react-use ... 花费很多时间收集、整理的Hooks 食谱\~
16. 有人将费曼的成长经历总结成了一套学习方法，叫“费曼学习法”。 \
    过程如下: 学习目标→转换讲述→总结疑问→简化理解

    首先你要确定你要学习什么，然后集中精神理解并学习这些知识。 学习结束后，你需要将你学习到的东西通过讲述给别人听，来加深印象，在这个讲述的过程中，你会知道自己理解了什么，学会了什么，也会知道没明白什么，然后记下这些没学会的问题。 \
    最后你在这个转化的讲述的过程中你通过自己组织的语言和理解，已经完成了对所学知识的简化，更便于记忆。

    总结疑问是最重要的一环，一定要对知识 进行深入思考，提取本质，对我来说 思考最有效的方式就是 对当前知识的猜想 why what how，以及与其他知识之间的联系、对比。\
    关于深入思考，这里摘抄《暗时间》中一段给我留下很深印象的文字: 知识的表象细节会迷惑我们的眼睛，阻碍我们对知识的转移运用，因为表面上不相似，而我们的记忆提取又是很大程度上依赖于一些表象上的线索来提取的，因此这些表面不相似性便阻碍了我们在问题之间进行的类比，阻碍了我们将在一个情境下掌握的道理运用到另一个情境下。

    我们常说有些人善于看到事物的本质，这样的人往往就是那些聪明人，因为他们更能够举一反三，将一个地方领悟的道理推广到另一个看上去很不一样的地方。

    而简化理解 指的就是 在更高维护 抽象其本质，去掉泛化、不确定性带来的无关因素。
17. 分享个V社帖子: \
    Rust 它凭啥这么难？学习路线这么陡峭。

    <https://www.v2ex.com/t/763062>

    好家伙，现场吐槽大会。 \
    里面有条评论把我逗笑了: 用过 C++ 的都说好。 \
    帖子中有些讨论还是挺有价值的。
18. 分享个响应式编程的概念： If the functional programming is the programming with pure functions, the reactive programming would be the programming with observables.

    来自刚刚在 Codewars 刷到的一道题目的前置理论，题目更详细地描述了 What is an observable?

    <https://www.codewars.com/kata/5c8f822533a2b7336aeee2de>

    响应式编程 最经典的案件就是 事件模型了，事件可以抽象成以下的多种场景：

    1. 于终端应用角度，可能是 GUI 上的用户交互
    2. 于服务端角度，可能是某一个打到 服务器 80 端口号上的 HTTP 请求
    3. 于操作系统角度，可能是 terminal 上的一次信号调用。

    而事件模型的本质与响应式强调的 observable 不谋而合。

    那什么是 observable 呢？ \
    结合 题目描述，An observable is a powerful pattern that enables non-deterministic and lazy pull computations.

    简单总结下 observable 的三个特点：

    1. Non-deterministic 数据源不确定性: 体现在 到达的时间不确定，次数不确定。
    2. Lazy 只有在数据源到达之后，才会执行相应逻辑。
    3. Pull Consumer 不必关心 Producer，只需要关心自己的消费流程即可，换句话说，消费者是感知不到数据源的。

    感兴趣的朋友可以刷下上面的题目：

    <https://www.codewars.com/kata/5c8f822533a2b7336aeee2de>

    该系列一共有 5 道题，每到题目都是层层递进的。 \
    前两个题目 是要求实现 基本的 Reactive programming 的 observer。 \
    后面的题目 则是要求 在原有 RP 题解的基础上，实现 多个 Functional programming 的 operator、combinator。 \
    整个系列的目的是 实现一个简易版的 Rxjs\~
19. 其实在 Codewars 上我一直有道题没有解决，每次想到都很遗憾(傲娇求助

    Mine Sweeper

    <https://www.codewars.com/kata/57ff9d3b8f7dda23130015fa>

    简述: 给一个二维数组, 里面的特定元素代表的是 扫雷游戏中的一些格子, 就比如雷啊.. 或者 数字啊.. 然后你需要做到是 该盘扫雷能否通关.

    这道题 我去年死磕了两天, 最后通过了大部分的 case, 一直卡在一些奇怪的边缘 case, 结果不得不放弃了.. 我当时的解决方案:

    <https://github.com/Tomotoes/Kotlin-Note/blob/master/src/Solution.kt>

    Codewars 上的题目很多都不限制语言，一些难题，或者 Beta 系列题 可能没有题解。 \
    题目质量都很高，并且范围不限于 算法，有很多有关语言特性，编程范式的题目。

    除了Codewars ，还有国人开发的 ScriptOJ，我有幸刷过上面的所有题，SOJ 的题目重心也不只限于算法，有实现简易 vdom，mvvm模型，LINQ JS版本，Brainfuck 解释器等好题。 可惜目前作者不维护，关站了。
20. ![image-20210331193352390](/files/-MX7IJdhVu0C1sixPsxN) \
    B站这直播页的技术栈 全了.. \
    A: 不会是微前端吧 \
    因为业务组之间技术栈没统一，不是微前端 应该是多个模块组合导致的.. \
    技术栈没统一，其实能看出 公司中团队管理的一些信息。 \
    尤其是前端，不同团队 使用不同的技术栈，很难沉淀出 复用组件，这缺点挺明显的。给我的感觉就像是团队之间互不妥协。 \
    如果是服务端还好，各服务之间的调用 可以使用 rpc 网络协议层、服务注册管理或者加个 mesh 等实现解耦。
21. 可以开个话题讨论，之前听一名大佬说过一句话，意思是 中国的科技水平发展很迅猛，并用 BAT 这些头部大厂 以及 微信，抖音这些现象级产品 举例。 \
    关于这一点，国内计算机的科技水平该如何体现呢？真的是世界前列吗？

    对于国内科技水平（计算机）很高，我一直是不以为然。 \
    科技水平这个词很泛化，如果用现象级产品做特例的话，其实与“科技”关系不大。

    与其说是 国内科技水平很高，不如说 国内技术水平很高。 \
    因为科技与技术 本身就不可一并而论。 在我看来 科技注重的是发明创造，技术注重的是应用实践。 显然更合适来说，中国算是技术大国。\
    &#x20;A: ￼业务大国 \
    B: 科技发展很迅猛，这句话完全认同；不可否认的是，现象级潮流市场造就了大规模产业的发展，相对的给IT行业有了更多的创造空间。关于高与不高如何界定我是不清楚的，还有一个就是，把科学技术，分成发明创造和注重应用实践，这个有点较真儿了，是发明创造不属于技术，还是技术创造不属于科技发明；实现了技术创新，必然要用于实践发展；而不断发展的趋力形势也必将加快技术的创新。 所以从理解方面，我并不赞同你所说的，科技与技术本身就不可一并而论，这句话。 \
    C: 先补充下状语，上面指的科学，技术是有关计算机的￼ \
    你说的有道理，这两点是相辅相成，互相发展的。 \
    但是很明显，国内计算机学术上的创新 与 技术上应用的量级 差距挺大的。 \
    这和市场经济，教育机制也有挺大关系。
22. 突然想到了 类型系统与语义之间的一种联系。 \
    假如 一门 PL 的类型系统支持自定义类型（无论复合类型还是基础类型），完成可以说明该 PL 有将语义融合进类型的能力。

    举个简单例子： const china:string = 'CHINA'

    type Country = string const america:Country = 'America'

    我觉得这种应用只限于 基础类型 不能枚举的场景。

    复合类型没什么好谈了，本身是基础类型上的自定义构建。 \
    基础类型自定义的话，最好还是使用枚举，不然会破坏类型系统，不要为了可读性去做包装。
23. ![image-20210331193628926](/files/-MX7Iahrty12EF9ebtGm)

    hah 为什么 Haskell 这么特别，成于 Haskell 败于 Haskell\~ \
    这张图背后折射的现象很明显，学术界 与 市场 之间存在的 Gap\~ \
    当然 Scala 虽然算是一门学术派语言，但这门语言的特性实在是很多，几乎是一门大杂烩，并且在业界也有很多能打的产品，比如 Spark、kafka、flink..
24. 好文分享： \
    10 MOST(LY DEAD) INFLUENTIAL PROGRAMMING LANGUAGES

    <https://www.hillelwayne.com/post/influential-dead-languages/>

    作者介绍了已死却为后继者奠定基础理论，元思想体系的十门编程语言。 \
    文章按照10个章节分别介绍了 各个语言提出了哪些思想创新，创建的背景是什么，为什么没落的原因。

    读完这篇文章，我脑子里一直回想着垠神曾表达过的一则观点：现代编程语言只不过是一个个理论的组装工。

    总结一下各大语言的创新点：

    1. COBOL: 提出了层级化结构
    2. ALGOL: lexical scoping, structured programming, nested functions, formal language specifications, call-by-name semantics, BNF grammars, block comments…
    3. APL: 矩阵处理 Through this innovation APL lead to R, numpy, pandas, Matlab, etc.
    4. BASIC: runtime interpretation 以及更深远的教育影响
    5. PL/I: 结构化类型(eg: user.name)，指针，常量定义，函数重载
    6. SIMULA 67: 子类，虚方法，类中保护级别字段，对 oop 正确的建模影响
    7. Pascal: 没有语法上的创新，更多聚焦于编程思想
    8. CLU: 迭代器，抽象数据类型，泛型，异常检查
    9. ML: 类型推导，代数类型，模型，fp with type (ML 的影响是非常大的)
    10. Smalltalk: OOP, 不同单元之间的消息传递，影响了 Actor 通信模型。

    除了文中提到的这影响深远的十大语言，我想补充下其他 在我看来同样具有很高影响力的语言：

    1. Self: 原型链，语言虚拟机概念，支持 GUI...
    2. Lisp: Lambda 演算的映射，元编程，宏...
    3. Fortran: 第一种高级语言
25. 快餐文分享： \
    Synchronous generators (advanced)

    <https://exploringjs.com/impatient-js/ch_sync-generators.html>

    文章简介了 ES6 提供 Generator 特性，并给出了一些简单 Demo，感兴趣的同学可以刷下。
26. 分享个有趣的帖子： \
    WHY DOES TIME GO FASTER AS WE GET OLDER?

    <https://ubiquity.acm.org/article.cfm?id=1455706>

    为什么随着年龄增长 时间流逝得越快？ 帖子中有很多有趣的观点。摘抄自 其中一条的观点（很赞同）: Great post. I think there are three reasons why there is a general consensus that time seems to be moving faster as we age. Firstly, novelty tends to slow down our perception of things. When we are young so many things are novel that it seems like so much more actually happened in the time span. Secondly, its the relativity thing, where as we age, we have more years under the belt, so each that passes seems like that much less. Thirdly, technology is speeding all sorts of things up. I think the information overload of modern day life is enough to make things seem like they are happening faster. The older you are, the more you pick up on this, especially as your ability to adapt may not be that which you had when you are younger.
27. 我发现了个让我不能理解的点。 为什么国内的知网、acm、IEEE 这些知名的顶会期刊库网站， 读论文需要花钱啊..

    知识与钱绑定在一起... 呃... 是我理想化了？我不能理解...

    这些数字库 不应该站在人类知识分享的角度去出发嘛... 互联网精神呢...

    让我回想起 之前在阮一峰老师《前方的路》读过的一篇文章： \
    论文的版权属于谁？

    <http://www.ruanyifeng.com/blog/2011/08/copyright_of_academic_papers.html>

    摘要： 论文不是消费品，而是知识；消费品越用越少，知识越用越多。知识的自由传播是造福全人类的事情，限制论文流通是以牺牲人类福利为代价的，换来的只是一些垄断机构的利润。废除论文版权，不会抑制创新，只会推动创新。

    之前看过一句话，在学术界 最关键得指标就是论文的引用次数。 今晚根据接触到的信息，真是大开眼界（一定是我找到的资源不对..
28. 分享篇文章： \
    如何收集和整理论文（面向CS专业）

    <https://ying-zhang.github.io/misc/2016/we-love-paper/>

    文章内有挺多干货的，内容如题。
29. 分享个网站: \
    展示 CSS 中所有命名的颜色

    <https://enes.in/sorted-colors/> \
    A tool to sort the named CSS colors in a way that it shows related colors together
30. 每日一句分享: \
    人活在世上需要什么呀？ 食物、空气、水和思想。 \
    A: 需要满足，精神和生理满足
31. 好文分享:

    浅谈国内高校编程语言教育摘要

    <https://zhuanlan.zhihu.com/p/43914842>

    这篇文章从“写作动机”开始，先后针对“为什么我国不重视编程语言教育”，“好的编程语言教育会对个人和社会带来什么好处”，“应当如何讲授编程语言课程”几个问题逐一阐述了作者的个人观点。

    文章内有一些引发我思考的话: 对于个人，受到更好的编程语言教育意味着可以更好的理解从语言本身到构建出的复杂软件系统，对于问题的“势”和通过编程手段解决问题的“器”也都会有更好的把握。
32. ![image-20210331193846122](/files/-MX7IqhwAtAVL7arP1Nz) \
    图片来自小林的这篇文章。 你不好奇 Linux 是如何收发网络包的？

    <https://zhuanlan.zhihu.com/p/339698383>
33. Podcast 分享:

    <https://moon.fm/share/episode/4539/> \
    🎙Prolog---王四哥

    延伸阅读: Prolog 语言入门教程

    <https://www.ruanyifeng.com/blog/2019/01/prolog.html> \
    Prolog 一门专注于逻辑推理的编程语言。
34. 快餐文分享: \
    Scaling webapps for newbs & non-techies \
    <https://arcentry.com/blog/scaling-webapps-for-newbs-and-non-techies/>

    文章讲解了 服务端扩容演变的过程。 \
    从最开始的单 server 单 db 架构，一步步通过各种中间件，架构划分，多层负载均衡，针对耗时 IO 问题的解决方案，演化成一个三高(并发，可用，性能)的系统架构。

    文章整体偏基础，感兴趣的同学可以刷一下。
35. 分布式系统有两大难题：一是消息的excactly once delivery, 二是消息的保序，一是消息的excactly once delivery.
36. 如何评价编译器技术「前端不过是小打小闹，后端才是真正的难」这一观点？ - Guannan Wei的回答 - 知乎

    <https://www.zhihu.com/question/429304366/answer/1595607429> \
    分享个关于 compiler 的精彩回答，作者先是介绍了编译器的前中后端概念，又给出了复杂度的论证，最后提出了很多值得思考的问题。
37. primes = sieve \[2..] \
    sieve (p:xs) = p : sieve \[x| x <- xs , mod x p /=0 ]

    Haskell 两行实现素数筛，太优美了... 简直是在写诗...

    这两行代码 值得反复咀嚼... 除了蕴含的 Haskell 语法外，它给我了一种启发： 它是在编写思想 而不是在编写代码，程序应该是如此的。 \
    或者说 思想的表达过程中 是不应该存在语法噪音，并且要清晰直观，没有奇淫技巧，不存在未定义的破坏行为。 现代的编程语言中 能做到这点的太少了。
38. 词汇分享： \
    entropy - 熵

    Entropy is a scientific concept, as well as a measurable physical property that is most commonly associated with a state of disorder, randomness, or uncertainty. The term and the concept are used in diverse fields, from classical thermodynamics, where it was first recognized, to the microscopic description of nature in statistical physics, and to the principles of information theory.
39. ![image-20210331195508054](/files/-MX7J4W_IPjHDO2h20US)
40. ![image-20210331195512851](/files/-MX7J7ZR_hMAtivNZo0T)
41. 每日一句分享: \
    只有能够改变你行动的信息才是知识。 \
    像这种绝对、没有场景的话，总觉得有点不妥，但确实引起了共鸣.. \
    可能想强调对重要知识的掌握与运用吧..
42. 快餐文分享: \
    Combinator Recipes for Working With Objects in JavaScript

    <https://raganwald.com/2012/12/01/combinators-in-js.html> \
    主要介绍了 combinator 在 js 中的基本使用，文章比较基础，但其中有句话说得很精妙，值得回味:

    If Objects are nouns and Methods are verbs, Combinators are the adverbs of programming. \
    combinator 对于函数来说，是个组装工，副词的定位不是特别准确..
43. 分享篇36氪短文: \
    字节跳动收购沐瞳科技，一家有2个全球爆款的游戏公司

    <https://www.36kr.com/p/1149142567748740> \
    读完文章，有些感受:

    1. 竞业协议 是会限制个人职业发展，签署之前要小心。
    2. 运营得好并且商业模式不错的游戏，是暴利行业。一款 moba 月流水 上亿。
    3. 腾讯阿里 是家投资公司，之前分享过一篇虎嗅好文，深入剖析了 这些资本巨头的投资布局。
    4. 相对于游戏 玩法而言，游戏IP的塑造更重要，可以扩充玩法，进入更广的互娱领域。
44. ![image-20210331195558952](/files/-MX7JGBiZF6w6YIl2klg)

    上图左是分离式架构，CPU和GPU各自有独立的缓存和内存，它们通过PCI-e等总线通讯。\
    这种结构的缺点在于 PCI-e 相对于两者具有低带宽和高延迟，数据的传输成了其中的性能瓶颈。目前使用非常广泛，如PC、智能手机等。

    上图右是耦合式架构，CPU 和 GPU 共享内存和缓存。AMD 的 APU 采用的就是这种结构，目前主要使用在游戏主机中，如 PS4。

    摘抄自 深入GPU硬件架构及运行机制

    <https://www.cnblogs.com/timlly/p/11471507.html>
45. ![image-20210331195615925](/files/-MX7JMVBRO3DEJrAlXpx)

    NodeJS 10 以上支持了 promisify callback func，好耶\~ 再也不用包一层了。
46. ![image-20210331195626118](/files/-MX7JP0-hzL8F2f3CVCS)

    Go 泛型的一则例子。 \
    为什么编程语言的设计者 总是倾向于 把变量与类型放在一起表示呢？ 如果能找到一种分开表示的方法，代码可读性会不会更好呢？

    type Add = (a:number, b:number) => number \
    const add:Add = (a,b) => a + b

    就像是函数签名与函数，或者是 动态重载 免去类型。 \
    我的理解是 类型只是个上下文推理标注，代码是 逻辑思维的抽象，标注与思维不应该混为一起，这不是最佳实践。
47. 快餐文分享: \
    这次答应我，一举拿下 I/O 多路复用！

    <https://zhuanlan.zhihu.com/p/358208161> \
    文章简单易懂，先从Socket模型讲起，涉及了建立连接的基本步骤，每个步骤背后 操作系统做的事情。再到经典IO模型: 多线程，多进程，多路复用(epoll poll select)，并分别描述了 各自的原理 以及 优缺点。 \
    作者小林，我关注很久了，每篇文章都很清晰易懂，推荐一下。

    总结了下，epoll 优于 select poll的三点:

    1. 连接状态检查增量化，减少用户态与内核态的内存分配与数据拷贝
    2. 连接状态检查算法的优化，从线性结构到红黑树
    3. 连接状态通知解藕化，通过 epoll\_wait + 边缘触发(NIO) 或者 水平触发(BIO)，简单来说，异步场景 IO也要异步化，不然没有意义，还会造成阻塞。

    增量化，解藕化 这些思想是计算机科学，软件工程中最基本的本质。 \
    它们适用的场景无处不在，不要被上述 IO 模型的表面迷惑，要提取本质。

    这样每个知识节点之间才能建立连接，打通整个思想体系￼
48. A safer default for navigation: HTTPS

    <https://blog.chromium.org/2021/03/a-safer-default-for-navigation-https.html?m=1> \
    分享个短文，Chrome 90 默认优先使用 HTTPS 连接，HTTPS 连接失败后会转向HTTP。 \
    很有意义的一次更新，不但提升安全又在可以大部分场景减少一次302。
49. 每日一句分享: 流量是没有价值观的。 (下一句是黑粉也是粉...
50. 分享个 API： Navigator.sendBeacon() \
    <https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/sendBeacon> \
    这个方法主要用于满足统计和诊断代码的需要，这些代码通常尝试在卸载（unload）文档之前向web服务器发送数据。

    简单来说 主要用于埋点信息的处理。
51. 快餐文分享

    美团点评前端无痕埋点实践

    <https://zhuanlan.zhihu.com/p/26211623> \
    文章先是讲解了常见埋点的三种类别:代码埋点（最常见）、可视化埋点（GUI化 埋点过程，适用于 不需要研发，主要面向 DA 同学）、无痕埋点（统计上传 用户的所有信息行为，常见的有 GA谷歌分析）。 \
    又讨论了如何在实践中最到最小侵入性: 从工程出发 编译模板，或者借助一些逻辑注入语法(就比如 修饰器，它的学名叫 面向切面编程AOP，逃) \
    最后给出了 无痕埋点的设计方案(显然很理想，看不出什么价值)
52. Unreal Engine 4 has a Game Thread and a Render Thread as main, and then a few others for things such as helpers, audio, or loading. The Game Thread in Unreal Engine runs all of the gameplay logic that developers write in Blueprints and Cpp, and at the end of each frame, it will synchronize the positions and state of the objects in the world with the Render Thread, which will do all of the rendering logic and make sure to display them.

    哇哦，虚幻4 与 浏览器渲染帧的机制很像，都有专门与GPU 协商的线程。
53. 一本关于HTTP的恋爱日记

    <https://mp.weixin.qq.com/s/o-OEwacY7-YeqqHa6M6pdQ> \
    分享篇文章，写的很有趣，看到下面段话，我笑了..

    另外一个很尴尬的问题就是，她觉得我不太持久，每个Tcp链接只能发送一个请求，发送数据就关闭，这让我很苦恼，所以有些浏览器在请求时，用了一个非标准的Connection字段。

    感觉文中的 client server 是对渣男渣女，每次连接时都需要带礼物(cookie 曲奇饼)，才能认出对方。\
    并且 双方都可以与其他 客户端或服务端 随意谈恋爱..
54. 快餐文分享： \
    Advanced programming languages

    <http://matt.might.net/articles/best-programming-languages/>

    摘要：If, on the other hand, you're interested in enlightenment, academic research or a start-up, the criterion by which you should choose your next language is not employability, but expressiveness（手动加粗）.

    作者在文中列举出了他最喜欢的4种语言：Haskell，Scala，SML/OCaml和Scheme，并介绍了各自的特点与相关的学习资源。
55. ![image-20210331200111235](/files/-MX7JlOBe5iOXZNSwVeE) \
    A: 我也证明过！我给你写一下我的思路\
    ![image-20210331200131243](/files/-MX7JuEw-lrf6R_HIjzT) \
    B: 当代带数学家 我刚刚用勾股定理证明了，是对的￼
56. 每日一句分享： \
    “There are only two industries that refer to their customers as 'users': illegal drugs and software. " — Edward Tufte

    只有两个行业把客户称为‘用户’：一个是计算机设计（computer design），另一个是毒品交易（drug dealing）。
57. 分享篇文章： \
    Epigrams on Programming

    <http://pu.inf.uni-tuebingen.de/users/klaeren/epigrams.html>

    关于编程的130条警句。 \
    总结下我觉得其中 有价值的一些句子：

    1. Every program is a part of some other program and rarely fits.
    2. Wherever there is modularity there is the potential for misunderstanding: Hiding information implies a need to check communication.
    3. Re graphics: A picture is worth 10K words - but only those to describe the picture. Hardly any sets of 10K words can be adequately described with pictures.
    4. Every program has (at least) two purposes: the one for which it was written and another for which it wasn't.
    5. A language that doesn't affect the way you think about programming, is not worth knowing.
    6. A programming language is low level when its programs require attention to the irrelevant.

    hah 真是应了那句 Just for fun.
58. 快餐文分享: \
    Clean APIs in React with TypeScript

    <https://javascript.plainenglish.io/a-cleaner-api-for-react-ts-components-47d0704a508c>

    文章阐述了 React 应用导出 Props 的问题，并给出了两种方法，一是提取共同 props，二是利用 infer 类型匹配获取。个人倾向于后者。

    ```
    export type GetComponentProps<T> = T extends
    | React.ComponentType<infer P>
    | React.Component<infer P>
    ? P
    : never;
    ```

    如果项目中使用 css-in-js 的话，这种场景是挺常见的。 \
    当需要传递 props 给 styled component 时，就可以使用上述 类型方法。
59. ![image-20210331200957829](/files/-MX7K03Sr3QedL0lxduq)
60. ![image-20210331201003761](/files/-MX7K3aksl9Mt4rwSqoK)
61. MySQL 深入学习总结

    <https://mp.weixin.qq.com/s/sRFmW57KUY3yyyRkyw0L4A>

    快餐文分享，正如标题所言，整篇文章像是学习笔记，涉及到了很多点 :MySQL 的架构，实践规范，范式，执行命令机制，通过分库分表解决性能瓶颈，分布式数据库的概念。 但都浅入浅出，意义不大。
62. 我偏爱的技术文章主要有两大类。\
    一种是所谓综述的文章。它能把一个事物的历史，前因后果，各种影响，优点缺点全都尽量客观的用一条主线串下来。这样的文章可以让我们思考，并帮助我们在遇到类似场景时做决策。比如“SQL是怎么来的，历史上若干SQL和NoSQL存储都是怎样的，优缺点都有什么“。

    另外一种是针对一个具体的问题/场景，可以比较明确的建立判别的框架，因此也就可以比较明确的对比出来怎样做是更好的。比如“在实现外卖的地理位置信息索引查询时，MySQL、Postgres、Mongo等的空间索引还是自己手工撸一个，用哪个方案最好“就是值得讨论的好问题。

    如果我们空泛的去讨论一个非常复杂的东西，又没有思维框架让我们清晰的梳理讨论本身，对实际落地又没啥帮助。我们为啥要花功夫去讨论这种问题呢？刷刷抖音看看小姐姐不好吗？

    摘抄自 大宽宽老师的一则评论。
63. 你真的理解userAgent了吗

    <https://mp.weixin.qq.com/s/8ZCyZnvUq_nkDvU1gaaaUw> \
    快餐文分享，文章讲解了 UA 之所以这么混乱的历史原因(商业竞争导致)，并给出了 如何在不同平台解析 ua。
64. Question: 为什么函数式编程 利用高并发场景？ \
    Answer: 函数式编程没有副作用，所以 临界区场景很少，不存在“锁”线程。 \
    想到一个问题，如果数据修改(补充场景)在CPU执行时是原子操作，是不是完全可以杜绝 锁 的出现。\
    A: 锁不是还有什么一致性 可见性 \
    锁是可以保证这些内存性质的。 \
    想到了一点，如果数据都是 immutable，想要修改只能 copy on write，就像函数式倡导的那样，那么每次读取数据时 都会保证最终一致性，这也是 fp 利于 并发场景的一点。

    当然 fp 的缺点很多，最明显的:

    1. 如果 compiler 不支持尾递归优化，会有大量函数栈帧
    2. 每次 cow，会造成大量 gc 操作

    少了一点，还是需要保证数据修改原子性，不然只能保证最终一致性，实时读取数据的一致性无法保证。\
    我发现之前的猜想是不现实的，原子性只能通过硬件来保证。\
    假设一个64位的数据放到32位的机器上，必然是要读两次的。
65. 分享一则帖子: \
    Scheme vs Haskell for an Introduction to Functional Programming?

    <https://softwareengineering.stackexchange.com/questions/69697/scheme-vs-haskell-for-an-introduction-to-functional-programming> \
    讨论很精彩。 \
    摘要: the main basis of modern¹ functional programmings are higher-order functions, a static type system, and algebraic datatypes and pattern matching.

    从帖子可以看出现代 fp 的发展趋势，各个分支的不同。
66. 如何通过 BFS、DFS 方式遍历DOM Tree。 \
    我的解法：

    ![image-20210331201126179](/files/-MX7KHbPj612RWcv-Map)
67. 离开字节跳动的人

    <https://mp.weixin.qq.com/s/qqwQhU6Gy8z0sOuJrajtNg> \
    快餐文分享，文中拜访了多名内部同学，提供了一种审查的视角🤫
68. 每日一句分享: 影响编程效率最大的因素，不是使用何种编程语言，而是昨晚你的睡眠是否充足。
69. 快餐文分享: \
    SQLite is not a toy database

    <https://antonz.org/sqlite-is-not-a-toy-database/> \
    文章主要讲解了 SQLite 的特性。 \
    摘要:

    1. SQLite is the most common DBMS in the world, shipped with all popular operating systems.
    2. SQLite is serverless.
    3. For developers, SQLite is embedded directly into the app.
    4. For everyone else, there is a convenient database console (REPL), provided as a single file (sqlite3.exe on Windows, sqlite3 on Linux / macOS).
70. 好文分享: \
    A gentle introduction to multithreading

    <https://www.internalpointers.com/post/gentle-introduction-multithreading>

    很久之前读过一次这篇文章，该系列一共有四篇，每篇文章都是以综述的口吻进行描述。 \
    该篇文章先是讲解线程，进程的基础模型，历史知识。\
    后面说明了 各种模型所导致不可避免的问题 和 各自的优点缺点。 \
    各个子主题全都客观的用一条线 串了下来，非常推荐阅读，能产生思考\~
71. 前后端分离架构 且遵循 RESTFUL 通信规范的产品中，后端同学算不算得上 面向前端同学的前端工程师呢？

    需要设计各种接口，而接口、API 从更高维度的视角上来看是另一种形式的用户(programmer)界面。 越想越有趣.. 抽象思维 会导致看一个点的不同视角￼
72. A: promise有哪些缺点啊？ \
    B: 好问题，想不到什么明显的缺点.. \
    Promise 的缺点，如果硬要说的话，可能是函数染色吧(想不到什么明显缺点，函数染色应该是 异步环境无法避免的问题) \
    Promise 只是一种更好的控制异步场景的方案，本身并没有异步能力。 ![image-20210331201553596](/files/-MX7KUZabiKT3GtLf2Kd)\
    找到了一些点，但我觉得算不上缺点。
    1. 可以使用 Timeout + Promise.race 解决
    2. 可以全局监听 Promise error
    3. 没必要支持那么多细粒化状态，想不到场景..
    4. emm，这也行
73. A: 大公司接口是不是都是前端写啊？ \
    B: 看项目场景吧。 如果是传统 RESTFUL 接口是后端提供，当然也可以 BFF 包一层，如果是 Graphql 那就只需要 后端配置了。 \
    也分项目的用户，如果是TO B的，影响不大 pv 不大，可以前端 + serverless
74. 游戏“头号玩家”：像做游戏一样做Web开发

    <https://mp.weixin.qq.com/s/-CJbjSa5r1qRJJnGNz30Wg> \
    分享篇文章，采访 字节-杨扬，文中有很多杨学片段..
75. ![image-20210331201631184](/files/-MX7L2o54hN_CI4eIB4z)

    想到一些问题:

    1. 为什么已经有了内核态 可以保证系统权限，还要提出 TrustZone 特权级？
    2. TrustZone 是如何负责安全世界的切换？

    第一个问题很显然，内核态的意义在于保证操作系统的权限与安全。而 TrustZone 是为了应用程序的数据安全，而提出的硬件隔离机制。

    第二个问题查了下，是在硬件级别做到环境隔离，可以看下分享的文章。 \
    简述ARM TrustZone - <https://zhuanlan.zhihu.com/p/101486119>
76. Linux 内核 0.01版本 仅有 8102 行代码。而到了 5.7 版本代码量为 2870 0000行..
77. Question: \
    Android 应用的主要开发语言是 Java，那么 Java 编写的应用是如何在 Android 上运行的呢？也是通过 JVM 吗？

    A: android肯定是dvm啊 java程序运行在dalvik vm java程序编译成.class文件，打包到jar包里，sdk提供的工具转化成.dex文件，然后dalvik读取指令和数据集 \
    B: 基础面试题: 为什么不继续采用 jvm 呢，dvm 在哪方面优于 jvm￼

    A: 其中应该和内存有关吧 IO操作 java编译多个.class

    而.dex是对.class的整合，减少文件IO操作，查询类的速度也快了 dvm其实基于寄存器的架构的 主要其实还是dvm的特性适合移动端

    B: 了解.. DVM 更适合Android(ARM 指令集)这种不需要考虑跨平台的场景。 \
    查到一个回答，把刚刚你提到的点延伸了下。 \
    Dalvik 虚拟机和 Sun JVM 在架构和执行方面有什么本质区别？ - 天光的回答 - 知乎 <https://www.zhihu.com/question/20207106/answer/14654536>
78. ![image-20210331202338010](/files/-MX7Nw6-ONu3IwaI6xXK)
79. 每日一句分享: 真理属于人类，谬误属于时代。 \
    A: 毒鸡汤来一套 - 荒缪是常态，而真理是变化态
80. 分享个工具: \
    Figma to React Convert Figma designs to React code (React Native and Next.js)

    <https://figma-to-react.vercel.app/> \
    可以谈谈前端智能化 目前在业界的实现。

    一般业界有两种方案。 一是通过CV 识别设计图，在体通过神经网络 分析设计图，然后生成代码。 \
    难度较大，但不限于设计工具。 例子: 微软的Sketch2code

    二是通过设计工具提供的API，分析设计稿背后的数据，然后生成代码。 \
    难度较小，但受限于设计工具。 例子: 阿里的imgcook
81. 于地球的移动来说，我们从出生起 没有一秒钟在原地停留过，我们每一分钟都距离前一分钟几十万公里以上。

    摘抄自 《天才在左 疯子在右》
82. 为 JS 数组实现 slice 特性\
    &#x20;![image-20210331202534328](/files/-MX7O7yOoBACgktXhc3q)

    一直想改成更 friendly 的方式，不需要借助函数： const arr = \[1,2,3,4,5] arr\['1:2']

    但发现 js 的 native array constructor 根本无法拦截..

    ![image-20210331202550493](/files/-MX7OD8gMhG1CSpKQgjk)

    这种可以达到想要的效果，但是很明显 start end，应该是任意数值才对。
83. 一日囚 - <https://weibo.com/ttarticle/x/m/show/id/2309404593036926518013?_wb_client_=1> \
    分享篇科幻小说，设计构思都很有趣\~
84. ![image-20210331202632364](/files/-MX7OFTv3qaobWFjPWkQ)
85. 好文分享: \
    How to Improve CSS Performance

    <https://calibreapp.com/blog/css-performance> \
    文章介绍了多种优化 CSS 影响页面性能的方法。 简单总结下:

    1. 因为 CSS 会阻塞 HTML 解析，而 JS 又会阻塞 CSS 解析，所以 要小心翼翼安排资源的顺序。
    2. 通过压缩CSS文件，移除未使用的代码，(补充:抽离原子类技术) 减少 文件尺寸。
    3. 将一些关键样式，内联到页面，减少请求，很快地渲染。
    4. 加载不必要的 CSS，异步化请求。
    5. `<link rel="stylesheet" href="non-critical.css" media="print" onload="this.media='all'">`
    6. preload(不推荐)
    7. 避免 @import 引用文件，不会并发加载，只能顺序从而影响性能。
    8. 编写 animation 时，尽量使用 只会引发重绘的属性，减少页面重排。
    9. 使用 contain 属性，控制页面中组件渲染，不影响到整体(渲染力度细粒化)
    10. 使用 font-display: swap 在加载字体的时候，显示文本，以免显示空白。
    11. 使用 @font-size 加载字体(常用方案了)
    12. 不要把时间精力 放到优化 selector 上面，它已经足够快了，不是瓶颈。

    异步化加载 CSS 文件倒是第一次听说，偏 trick.. \
    “Print” media type defines the stylesheet rules for when the user tries to print the page, and the browser will load such stylesheet without delaying page rendering. Applying that stylesheet to all media (namely screens and not just print) uses the onload attribute to set the media to all when the stylesheet finishes loading.

    再补充几条:

    1. will-change 使用 gpu 去渲染 所在声明的元素，使用时要小心，注意场景(建议 动画元素，全屏 shift 元素)，有层爆炸的风险。
    2. content-visibility，按照窗口显示条件 避免渲染 不在窗口内的元素。
    3. Link with media，将 css 文件根据屏幕分辨率加载。
86. 快餐文分享: \
    How I bought a business for $0

    <https://every.to/superorganizers/how-i-bought-a-business-for-0>

    文章介绍了作者 如何通过技巧，花费 0元 买到的一个 SaaS 应用(符合他的各项条件)，获得成功的故事(年收益 百万刀)。

    摘要:

    1. Where revenue is less than $20K per month, many of the businesses you’re looking at aren’t businesses at all: they’re jobs.
    2. it often pays to approach deals in a certain way: “my price, your terms OR your price, my terms.”

    阅读后，整篇故事其中最为关键的两点:

    1. 挖掘商品潜力的能力
    2. 执行力，联系作者，约谈收购，完成签约 不超过一月
    3. 包装推销商品的能力(文中未主动体现)，不过看结果可以想象到。

    文中记录了这位风险投资家的 mentor 观点: my price, your terms OR your price, my terms. 感觉实现起来有漏洞，万一对方全都要呢..
87. 快餐文分享: \
    How I use the Speech Synthesis API on my blog

    <https://jlelse.blog/dev/speech-synthesis> \
    如何用短短十行代码为页面增加 语音播放内容 功能。 利用了 experimental SpeechSynthesis API..

    可以为网站加一个播放功能\~ 也算是无障碍功能的一种设计。
88. 分享个有趣的观点: \
    a pure function of only Constants can also be treated as a Constant!

    摘抄自 Three Types of Data

    <https://www.brandonsmith.ninja/blog/three-types-of-data>

    文中提到的三种数据类型，与 React 中的 useState、useMemo、immutable 的概念 不谋而合..
89. 每日一句分享: \
    The main cost of abstraction is in separating the implementation from the specification, or, to put it in a different way, the letter of the function from the spirit of the function. The former being what the function does, the latter being what everybody believes it should do.

    要么就简单得没有缺陷，要么就复杂得足够简单。

    hah 居然逻辑自洽了\~

    我想表达的是，不管项目中如何管理复杂性，最重要的一点就是不要有明显的缺陷\~
90. 好文分享: 有道云笔记新版编辑器架构设计

    <https://zhuanlan.zhihu.com/p/345895871>

    <https://zhuanlan.zhihu.com/p/347415991>

    第一篇文章讲解了 现代在线编辑器的模型，以及实现模型的不同方式，可以看出关键的能力都受限于 浏览器环境，文中有句话存在歧义: Word 和 WPS 可以说将桌面客户端中的富文本编辑器做到了极致。 latex:？？？

    第二篇文章从宏观视角讲解了 实现在线编辑的机制，并给出了一些细节问题的方法。
91. 快餐文分享: \
    6年从华人首富到破产，这可能是史上最惨的接班案例

    <https://www.36kr.com/p/1152742179947654>

    一代华人商界领域 王安的故事。 从一代神童，到哈佛物理博士，然后车库 技术起家(为什么又是车库..) 布局小型计算机、软件办公，再上市身家暴涨 成为华人首富。 \
    没落的原因 从文中看，一是商业战略出了问题，傲慢忽视 IBM 与 PC 机；二是不顾大局 选择子女作为继承人。
92. 快餐文分享: \
    The evolution of a Scheme programmer

    <https://erkin.party/blog/200715/evolution/> \
    茴香豆的“茴”字到底有几种写法？

    中间 Y 组合子 方式看傻了..

    我喜欢这种方式\~

    ```
    fac n = result (for init next done)
            where init = (0,1)
                  next   (i,m) = (i+1, m * (i+1))
                  done   (i,_) = i==n
                  result (_,m) = m
    ​
    for i n d = until d n i
    ```
93. 好文分享。

    张一鸣最新内部演讲：我只是个平常人，平常人也能做非常事

    <https://mp.weixin.qq.com/s/fp_q7JcfdZuCHc_jAN_AJA> \
    整篇文章读下来，能感受到 满满的字节范: 坦诚清晰，务实敢为，开放谦逊。 建议全文背诵。


# 2


# 1-6

1. 程序员招聘月刊：谁在招人？（2021年2月）

   <https://mp.weixin.qq.com/s/R5KrtXbQ-p2jHEAJmV-taQ>
2. 漫画 | CPU战争40年，真正的王者终于现身!

   <https://mp.weixin.qq.com/s/ARmVvuRR8bwmo3Dm1_mJLA>
3. 好文分享:

   为什么 Linux 需要 Swapping

   <https://mp.weixin.qq.com/s/sf9G13Lp0LNm_CvFzDYGaA>
4. 如果 CPU 访问 L1 缓存需要 1 秒，那么访问主存需要 3 分钟、从 SSD 中随机读取数据需要 3.4 天、磁盘寻道需要 2 个月，网络传输可能需要 1 年多的时间。
5. 为什么 Linux 默认页大小是 4KB

   <https://mp.weixin.qq.com/s/rz5H5_kKul-H1Z8u0aYGcg>
6. 多线程下载大文件速度更快的原因，到底是什么？

   <https://mp.weixin.qq.com/s/7xQfO663MrnTHYDeFXUZSQ>

   多线程下载单个文件并不一定优于单线程下载单个文件。

   任何一台机器都有一个实时网络最大可用带宽。

   而机器实时抢占带宽是永远小于实时网络最大可用带宽(TCP 重传机制)。

   而之所以广义上，多线程下载优于单线程下载，就是因为单线程触发重传时 小于多线程平均重传的下载速率。

   假如机器使用的不是传统流量调度算法 而是BRP算法，那么多线程下载的优势 就体现不出来了。

   A: 百度网盘\[破涕为笑]神一样的限速

   B: 哈哈哈，百度网盘： 别和我提多线程，brp 不好使

   C: 我刚在掘金看到一个百度云网盘多线程下载的 还没实验呢🌚

   Java实现大文件多线程下载，提速30倍！想学？我教你啊 <https://juejin.cn/post/6908867438624899079>

   B: 这个可行，多线程下载 就适合单点限速。
7. Question: 怎么将不同技术栈的页面组合在一个页面，且不存在样式冲突，数据冲突。

   具体场景是，一个 vue 搭建的页面，一个 react 搭建的页面，继承进其他页面这样。

   这其实就是一道典型的前端面试题，考你的知识广度与深度。 只不过是我出的。

   Answer:

   1. Iframe
   2. Web components
   3. 构建时，打包多个子应用
   4. 微件化，远程 load js chunk
8. sudo=速冻 cd=吃的 ls=零食 ps=披萨 ssh=熟食 scp=水产品
9. alias please=sudo
10. 上上周分享条数 71 上周分享条数 51 这周分享条数 29

    哎, 一次比一次懈怠了..

    1. 工作太占据时间
    2. 最近不爱读文章了, 换成了读书
    3. 自身问题影响

    上周分享聚合: <https://thinking.tomotoes.com/archives/2021/1/24-31>
11. Chrome 88 支持新的 CSS 属性`aspect-ratio`，可以设置容器的长宽比。

    这么常见的UI构建功能，现在才出现...

    ![image-20210206215650285](/files/-MSrkeXnha1BjGyQFKr8)
12. 漫画 | 轻松写意了解一下Linux 内核的真面目

    <https://mp.weixin.qq.com/s/RySLif5-dZRVpiNGcdbZ2w>
13. ![image-20210206215723966](/files/-MSrkguM0eq2a-9VG5TW)

    喜欢列表生成器的语义
14. 抖音支付：帝国的缝合线

    <https://mp.weixin.qq.com/s/Bl3jqK27YzCNtcFwF0WoSw>
15. 网易云音乐：关于给酷狗音乐相关团队申请年终奖励的建议

    <https://mp.weixin.qq.com/s/LPB6GffoosdD4M92fG5NlA>

    A: 哈哈哈，撕起来了

    B: 太刚了

    A: 狗化 可太秀了，哈哈哈

    C: qq音乐用户表示吃瓜

    D: 网易云音乐：关于取消酷狗音乐相关团队年终奖励的建议

    <https://mp.weixin.qq.com/s/PxoggRcAHMwEjuDM-co-NQ>

    大阴阳师又发文了

    A: 哈哈哈 搞活能手
16. 如何管理自己的时间资产

    <https://mp.weixin.qq.com/s/AeqtxDmtgIkKzEbcMyZh3Q>
17. 好文分享:

    为什么 TCP 会被 UDP 取代

    <https://mp.weixin.qq.com/s/BGWkvLl0AAx9slI1lSZMgw>
18. 被马斯克一夜引爆的Clubhouse，到底是怎么回事？ <https://www.huxiu.com/article/407961.html>

    等一波国内竞品

    A: 打个赌，不出一个月，国内必有一个打着高知社区为主的特色版clubhouse出现。

    Club house 国内的下一个泡沫…

    B: 感觉只是一阵风，不会成为主流社交方式，甚至跟 yy 十几年前的模式有点像

    C: 感觉就是玩的一阵新鲜

    D: 没邀请码到现在都没进去看过啥样

    A: 会被炒一阵的 现象级应用资本不会放过

    A: 出现了 clubhouse 复刻品 <https://github.com/bestony/neshouse> NESHouse.com —— An open source implementation of ClubHouse
19. 分享篇文章： Ruby 编程语言入门 <https://hutusi.com/articles/ruby-quickstart>

    ```
    一些我欣赏的特性：
    ​
    a = []
    a << 1        # [1]
    a << 2 << 3   # [1, 2, 3]
    ​
    a = [1, 2, 3, 4, 5]
    a[-2]         # 4, 负数下标从最后一个倒数
    ​
    # 获取子数组 切片
    a[1, 2]       # [2, 3] 第一个下标数字表示起始下标，第二个表示子数组长度
    a[1, 0]       # [] 
    a[0...-1]     # [1, 2, 3, 4]
    ​
    3.times { action }
    ​
    a << 1 这种命令式的符号表达 看起来挺好玩的。
    ```
20. Shell的魅力

    ![image-20210206215911726](/files/-MSrkk-wwly3r-B7fD86)

    A: jq 不会是 jquery 吧。？

    B: 不是 Go写的 查询 json 的一个知名工具
21. 换一个角度分析，网页性能优化

    <https://mp.weixin.qq.com/s/o8HOvYfUNUKPGydSak1mxA>
22. 如何打造一款游戏外挂

    <https://mp.weixin.qq.com/s/yd20_S8eql6r4N3yLkGbYA>
23. A: 现在国内Android开发主流语言是kotlin了嘛

    B: 双混合

    A: 这样不太好吧 像是团队之间互不妥协的结果..

    B: 不过kotlin快成主流了，好多都转了

    A: 嗯呐，好事…

    B: 不过感觉kotlin还是需要时间 毕竟android framework是java开发的 处在这个很尴尬的地步

    A: 是不是，kt 除了 语法层面，没什么提升呢？

    B: 我感觉，比java用起来方便简洁，好像别的没感觉哈哈 就凭它基于jvm

    A: 生态兼容吗..

    B: 兼容的一批 %100共通，可以相互调用

    A: 哇，可以的 底层都是class字节码吧

    如果从底层打通，编译时 混在一起，那就剩下语言隔离了

    B: 是啊，最后编译源文件都是.class

    编译时可以混在一起使用啊.

    都编译成class文件嘛，天然的兼容性，就是项目里可以有java类也可以有.kt类

    定义的类都能互相调用

    还不摆脱不了jvm，要是能摆脱jvm 就是android主流语言了哈哈哈

    A: 哇，这么爽

    C: 字节安卓新项目都是kt了 很香 反观iOS

    A: 之前看过 kotlin 通过内部dsl 写gui 那酸爽

    B: Anko？哈哈哈 kt史上最强框架名不虚传

    A: 算得上让我惊讶系列的技术了

    B: 但是我感觉还是习惯了xml铺布局，写代码生成布局还得写代码哈哈哈
24. NoSQL ：一个帝国的崛起

    <https://mp.weixin.qq.com/s/JedHtkVNklyfs0-viCLLPA>
25. Java的战争

    <https://mp.weixin.qq.com/s/21eCFfRZYyTstnw777-Fhg>
26. Go 语言网络轮询器的实现原理

    <https://mp.weixin.qq.com/s/wwyxfWrvNMRhB1fLrZQRww>
27. 调度系统设计精要

    <https://mp.weixin.qq.com/s/R3BZpYJrBPBI0DwbJYB0YA>

    调度系统其实就是调度器（Scheduler），我们在很多系统中都能见到调度器的身影，就像我们在上面说的，不止操作系统中存在调度器，编程语言、容器编排以及很多业务系统中都会存在调度系统或者调度模块。这些调度模块的核心作用就是对有限的资源进行分配以实现最大化资源的利用率或者降低系统的尾延迟，调度系统面对的就是资源的需求和供给不平衡的问题。

    在操作系统的进程调度器中，待调度的任务就是线程，这些任务一般只会处于正在执行或者未执行（等待或者终止）的状态；而用于处理这些任务的 CPU 往往都是不可再分的，同一个 CPU 在同一时间只能执行一个任务，这是物理上的限制。简单总结一下，操作系统调度器的任务和资源有以下特性： 任务 —— Thread 状态简单：只会处于正在执行或者未被执行两种状态； 优先级不同：待执行的任务可能有不同的优先级，在考虑优先级的情况下，需要保证不同任务的公平性； 资源 —— CPU 时间 资源不可再分：同一时间只能运行一个任务；

    除了操作系统和编程语言这种较为底层的调度器之外，容器和计算任务调度在今天也很常见，Kubernetes 作为容器编排系统会负责调取集群中的容器，对它稍有了解的人都知道，Kubernetes 中调度的基本单元是 Pod，这些 Pod 会被调度到节点 Node 上执行： 任务 —— Pod 优先级不同：Pod 的优先级可能不同，高优先级的系统 Pod 可以抢占低优先级 Pod 的资源； 有状态：Pod 可以分为无状态和有状态，有状态的 Pod 需要依赖持久存储卷； 资源 —— Node 类型不同：不同节点上的资源类型不同，包括 CPU、GPU 和内存等，这些资源可以被拆分但是都属于当前节点； 不稳定：节点可能由于突发原因不可用，例如：无网络连接、磁盘损坏等；
28. JVM 三种模式：解释执行；JIT编译执行；JIT编译与解释混合执行（主流JVM默认执行模式）。混合执行模式的优势在于解释器在启动时先解释执行，省去编译时间 JIT动态编译：将热点代码转换成机器码，直接交给CPU;JIT的作业是将Java字节码动态地编译成可以直接发送给处理器指令执行的机器码。

    V8 执行 JS 也是相似的流程。

    都是从解释向编译的过程。

    解释执行后获取到的信息反哺 编译机器码的过程。
29. 垂直社区也许是个伪命题 <https://m.tmtpost.com/4968506.html>

    垂直社区，固然在转化率上更高，但也注定了甲方来源会非常集中。短期看没感觉，但时间一旦拉长，这可能会是一个问题。新用户增长一旦停滞，老用户都买过你的产品了，那转化率依然会下跌。

    简单来说，垂直社区的初期商业化好做，但天花板很快就会出现。

    大平台上的垂类博主靠着高人气高流量快速商业化后进一步加强内容深耕，最后压过你垂直社区。

    A: 说的很有道理

    B: 赞一个，泛化大众化直到平台庞大，流量至上，虽然有些不一定质量高，但是流量够了也好商业化了
30. A: 我真的很羡慕基建 可以纯粹搞技术

    B: 能真正纯粹搞技术的岗位很少的，脱离了业务，技术敏锐度也会下降的
31. 每日一句分享: 乡下人最好的出路就是出走。
32. 没错，我们和美帝的差距就是这么大

    <https://mp.weixin.qq.com/s/6Fw-OlqR1400iTLnSc-lwg>

    可以衍生为 应用技术与科学技术的主题。
33. 分享篇文章: 5 React Custom Hooks You Should Start Using (Explained) <https://dev.to/alterclass/5-react-custom-hooks-you-should-start-using-explained-5d18?utm_source=digest_mailer&utm_medium=email&utm_campaign=digest_email>

    文章写得挺好的，建议阅读。
34. 分享篇文章： 多线程高并发学习之并发容器 <https://segmentfault.com/a/1190000039163739>

    文章比较浅，介绍了 Java 中常见的并发容器 和一些基本原理。

    基本上常见的保持一致性的策略： cas(Compare And Swap): 原子操作，系统级。基本很多语言都有 Atmoic 提供 cow(Copy on Wirte): 乐观锁，读写锁的底层机制

    一些与语言相关的同步机制就不介绍了
35. 分享篇文章： DDD实现之路 <https://insights.thoughtworks.cn/path-to-ddd/>

    A: 文章看了两三遍，其中的一些概念还是没有很好理解。

    看不懂的都是好文...

    B: 知乎上有个人一直在推DDD 看不懂根本

    A: 架构设计的领域，需要场景支持。 没有经验 很难理解他的概念。
36. 分享一个编写时序图的工具: swimlanes.io

    A: 整个过程，用文字描述即可生成对应的图，非常方便。

    B: 怎么有点像 mermaid.js ?

    A: 这个库好强啊..
37. 你不知道的 Proxy

    <https://mp.weixin.qq.com/s/SN8HqiGA30-IJ7OZ3WMr3g>
38. 分享个软件, 用了好几天了\~ <https://github.com/zenghongtu/PPet> 在你的桌面放一个萌妹子，多一点趣味\~（支持Mac、Win和Linux）

    之前我的网站还搞过这个 live2d 的模型\~ 每天看两眼都很开心
39. 分享篇文章: 手撸一个静态文档生成器\[译] <https://tomotoes.com/blog/build-static-site-generator-nodejs/>

    如果你还没个人网站的话, 可以参考这篇文章 构建一个简单的生成器.
40. B: 2020美团技术年货-合集：<http://dpurl.cn/uuHl2zr> 2020美团技术年货-前端篇：<http://dpurl.cn/1Ri23Fo> 2020美团技术年货-后台篇：<http://dpurl.cn/CcyQ7Ai> 2020美团技术年货-算法篇：<http://dpurl.cn/AMEswIw> 2020美团技术年货-顶会论文精选：<http://dpurl.cn/OLtVREA>

    A: 美团博客 网易云音乐博客 腾讯AlloyTeam博客 淘宝前端团队博客

    这几个官方博客,几乎每篇文章都没有水文..

    咦, 字节怎么没有.. 好吧, 字节技术沉淀还是不行.. 照阿里还是有差距的..

    C: 拼多多

    A: 拼多多就算了

    B: 华为：你直接念我名字得了 是不是点我

    A: 华为不是互联网企业嘛, 还能理解.. 不过华为开源产出还是有的

    字节好像没什么开源的产品 字节Github 官方仓库, star 最多的是 一个开源图标库 3k多..
41. 分享篇文章: Epic Games 研究：Fortnite 和游戏行业的未来 <https://www.ruanyifeng.com/blog/2020/06/epic-games.html>

    文章出自阮一峰老师之手... 文章介绍得挺详细的..

    为什么学什么知识, 都能找到阮一峰老师...
42. ![image-20210206223725990](/files/-MSrm-p1YeZie5yhxZZs)

    A: 刚刚又突然想到了 惊讶系列分享中的一张图(已经分享过, 重温下思想)

    让我吃惊的是, 完全可以通过 fetch 指定 url 的内容 并设置到 innerHTML, 实现爬虫.. 在浏览器就可以跑, 什么库也不需要..

    最后 eval(code) 真的很惊艳..

    B: 恭喜你发现了 qiankun 的秘密

    A: 不过建议使用 new Function, Function 比 eval 安全性要高, 并且执行时性能也高

    B: new Function 主要不会污染全局

    A: 还有一点, new Function 仅需要处理传入的字符串一次，后面重复执行都是同一个函数，而eval需要每次都处理，性能更高

    A: 哈哈, qiankun 那个源码使用 new Proxy 代理 假window, new Function 执行代码的

    A: ![image-20210206223810223](/files/-MSrm1i0p2KuJrjysGjV)

    qiankun 沙箱的核心思想... 可能有误, 烦请指正..

    B: 大体上是这样，有很多细节要小心处理 比如 fakewindow 上 freeze 的变量什么的
43. ![image-20210206221400400](/files/-MSrkoSHv8oO0ePJFAlm)

    &#x20;太真实了.. 不过 actionscript 设计得还是挺不错的.. 去掉了 js 的很多历史包袱..
44. ![image-20210206221452442](/files/-MSrksG5-a7wupywOuCx)
45. `npm install -g yarn`
46. ![image-20210206221505828](/files/-MSrkuawgaBgCHNffrCF)
47. 假如重新设计 JavaScript 它会是什么样的？ - 贺师俊的回答 - 知乎 <https://www.zhihu.com/question/442622908/answer/1715676739>
48. 如何通俗易懂地解释遗传算法？有什么例子？ - 尼布甲尼撒的回答 - 知乎 <https://www.zhihu.com/question/23293449/answer/120185075>
49. 每日一句分享： 互联网就像一个坑坑洼洼的道路系统，路上到处都有修路工人。

    上路时，你的车辆可能被劫持，也可能有黑手伸入车窗偷走你的东西，甚至你不知不觉时，车辆就被卖掉了，供他人使用。你都没有注意到那些犯罪的人，压根不会指责和追究他们的责任。
50. 从 JS 引擎谈到 WebAssembly

    <https://mp.weixin.qq.com/s/p2a8P6_Ww8UAWOZqbgyAsg>

    文章写得不错，建议阅读.

    感觉这东西最大帮助就是扩展 web 生态，比如游戏迁移，调用opengl这些库啊.

    我一直觉得大部分场景下，web应用的性能瓶颈是单线程所致。
51. Help users in Iran reconnect to Signal <https://signal.org/blog/help-iran-reconnect/>

    signal 太良心了
52. ![image-20210206221646099](/files/-MSrky8JJ62-0JINXmmn)
53. ![image-20210206221656614](/files/-MSrl-HUds1LTLZ5HBU1)

    好家伙，今年可以参加百亿项目了
54. 分享个项目： rails/kredis <https://github.com/rails/kredis>

    基于 Redis 封装的数据模型，可以理解为高度集成的 orm， 支持元编程的语言就是硬气。。
55. 分享篇文章： 校招攻略 DLC <https://sspai.com/post/64922>
56. 分享篇文章：

    6 Reasons Scala is Better Than Java <https://levelup.gitconnected.com/6-reasons-scala-is-better-than-java-c328cfb410d1>

    一篇介绍 scala 的软文... Both Scala and Java run on JVM. So their code must be compiled into bytecode before running on JVM. But Scala compiler supports an optimization technique called tail call recursion. The optimization makes the Scala code compile faster than Java code.

    ？？？ 几乎每个语言都有自己的狂热爱好者，他们在社区里推销自己想法时，往往把语言包装成 能解决各种问题的银弹。尤其是这些学术派语言...
57. 分享篇好文： Things You Can Do With CSS Today <https://www.smashingmagazine.com/2021/02/things-you-can-do-with-css-today/>

    总结：

    1. grid 网格布局
    2. is 伪类选择器 .post :is(h1, h2, h3)
    3. where 选择器
    4. min max clamp 函数
    5. ch ex 字体尺寸单位
    6. text decoration 的一些 rule
    7. scroll-margin-top
    8. 之前分享过的 aspect-ratio 尺寸等比划分
    9. content-visibility：google 带头提出的一个特性，刚出的时候让我很惊艳，具体做的是：With content-visibility: auto, you can tell the browser not to worry about rendering the elements in there while they are outside of the viewport, which can have a massive impact on initial loading speeds.
    10. 支持嵌套选择
58. 我准备举行个7天沉淀计划，学习点感兴趣的技术，或者做点产品什么的。

    上次元旦三天沉淀计划，产出还是不错的..

    计划形式是，列出 7天之内的 todo list，最好精确到天。 然后每天约定时间，一起对一下，及时调整todo，也复盘下进度。

    想参加的同学可以在群里说，或者私信我。
59. 分享篇文章： New Language Features Preview in Kotlin 1.4.30

    <https://blog.jetbrains.com/kotlin/2021/02/new-language-features-preview-in-kotlin-1-4-30/>
60. 分享期播客： <https://moon.fm/share/episode/3240/> 🎙Ep 02. 开发中的碎碎念
61. 分享篇文章: CSS奇思妙想 -- 使用 background 创造各种美妙的背景 <https://juejin.cn/post/6925600887947657224>

    chokcoco 每篇文章都很有艺术气息aaa..
62. V8 正式发布 v8.9 版本. <https://v8.dev/blog/v8-release-89>

    1. 支持了顶层 await 语法 (<https://v8.dev/features/top-level-await>) 没什么大用, 不支持 函数内部 类内部使用
    2. 优化了 函数 不确定参数传递性能

    A: TLA本来就只支持模块吧

    B: 是的, 在之前需要 babel plugin 支持, 不过现在浏览器支持度上来了

    A: 好像还在stage3

    B: 我刚刚搜了下, 是这样的..
63. 梳理下 Promise API:
    1. Promise.allSettled (ES2020) 返回每个 promise 结果, 不管是 fulfilled 还是 rejected
    2. Promise.all (ES2015) 如果有一个 promise rejected, 则立刻返回 reject; 否则等待所有 promise fulfilled
    3. Promise.race (ES2015) 如果有一个 promise fulfilled or reject 则立刻返回, 可以用于 网络超时 你想到了嘛?
    4. Promise.any (ES2021) 如果有一个 promise fulfilled 则立刻返回
64. Question: nodejs 中使用 es module 会编译成什么?

    A: require

    B: 没错 commonjs

    C: node不是可以直接跑esm了吗跑的时候还编译了一层？

    B: 直接跑 esm ? 这个是新版 nodejs 支持了嘛? 我不清楚..

    C: package.json 指定type为module

    B: 我去了解下..

    B: Nodejs 12 支持了 esm 实验特性, 只要 package.json 指定type为module, get
65. 分享篇文章: 深度：揭秘小米隔空充电背后技术 <https://zhidx.com/p/255150.html>
66. 如果我们把自己的人生看成是一个项目，既要有真才实学，也要懂得推销自己。
67. 分享篇文章: 我的十年回顾 <https://overreacted.io/zh-hans/my-decade-in-review/>

    著名 JavaScript 程序员、Redux 作者 Dan Abramov 回顾自己的过去十年，从一个没有上大学的俄罗斯高中毕业生，到 Facebook 公司 React 团队的重要成员。

    有空可以多看看 Dan 博客上的文章, 价值都很高的
68. 分享篇文章: How To Implement Inter-thread Communication In Java <https://www.tutorialdocs.com/article/java-inter-thread-communication.html>

    文章涉及了 Java 线程通信的简单工具例子.

    并发工具搞来搞去也就那一套...

    还不如从通信机制本身做出创新..

    参考 actor , channel
69. 分享个网站: Akiyoshi's illusion pages <http://www.ritsumei.ac.jp/~akitaoka/index-e.html>

    站点收集了各种错觉图片..

    ![image-20210206221907253](/files/-MSrl38JKE7Pz1NnSlA5)
70. 分享个网站: 荷兰的国家博物馆 <https://www.rijksmuseum.nl/en/rijksstudio>

    ![image-20210206221923709](/files/-MSrl5OZt8AAErAeZg8z)
71. 好文分享:

    Future JavaScript: what is still missing? <https://2ality.com/2019/01/future-js.html>

    摘要: In recent years, JavaScript has grown considerably in size. This blog post explores what’s still missing. Notes: I’m only listing the missing features that I find most important. Many others are useful, but there is also a risk of adding too much. My choices are subjective. Almost everything mentioned in this blog post is on TC39’s radar. That is, it also serves as a preview of a possible future JavaScript.

    面向未来的 JavaScript 应该是什么样.

    不得不说 JS 的历史包袱太重了.
72. 分享一句话: 今天我们看到很多所谓的“城市新穷人”，他们不是“经济穷人”，而是“意义贫困”。
73. 好文分享:

    项飙谈996和异化：城市新穷人不是经济穷人，是意义贫困 | 专访

    <https://mp.weixin.qq.com/s?__biz=MzA5ODY2NDIyNQ==&mid=2651977911&idx=1&sn=35fea1ba9ddbfca8e24fc83c4f2e32e1&chksm=8b6b72f9bc1cfbefd7ef5ffdbe6711754171a9c374aaa1d4d3d8a7a44e305e73a69d9bd2d15f#rd>

    文中涉及到的一些点, 引起了我的共鸣. 一个人如果一天到晚生活在自己的大脑里和心理空间里，自然需要渴求意义来支撑自己。这个时候，人自己就成为了一个封闭的“系统”。
74. 分享个练习 Python 的站点, 一共有36道题目..都挺基础的 <http://www.practicepython.org/>
75. 分享篇文章,几年前读过,现在拿来也不过时: Google Search Operators: The Complete List (42 Advanced Operators) <https://ahrefs.com/blog/google-advanced-search-operators/>

    一些Google搜索时的可以用到的符号
76. 好文分享: Software development topics I've changed my mind on after 6 years in the industry <https://chriskiehl.com/article/thoughts-after-6-years>

    很多观点都很犀利, 我喜欢.

    So called "best practices" are contextual and not broadly applicable. Blindly following them makes you an idiot
77. 每日一句分享:

    Software architecture probably matters more than anything else. A shitty implementation of a good abstraction causes no net harm to the code base. A bad abstraction or missing layer causes everything to rot.
78. 分享篇文章: 2020 年度小结暨羡辙的 30 年小结 <http://zhangwenli.com/blog/2021/01/01/goodbye-2020/>

    羡辙大佬太强了, orz...

    摘要: 如果说这三十年的经历只能总结经验之谈的话，我觉得是——永远与最优秀的人为伍，不管那是你的对手，还是你的伙伴。

    我更相信托马斯·杰斐逊说的 —— 当我越努力的时候，我发现自己越幸运。
79. 我最近fo了一位大佬: <https://mikukonai.com/>

    看他的灵感片段 受益良多...

    ![image-20210206222015093](/files/-MSrl9lFWiovz65E-Uic)

    ![image-20210206222229987](/files/-MSrlBq29b11QngrCCL6)

    ![image-20210206222314925](/files/-MSrlDc3M_1VSSd3CSUX)

    A: 关于上图的灵感主题, 我有些共鸣.. 也是最近困扰我的一件事..

    A: 我发现 我的系统完全做不到理性驱动, 那些我认为非高质量的信息 往往能给我很大的幸福感, 比如 B站的一些好玩视频..

    B: 刷视频真的好快乐哈哈哈

    C: 会有平衡点 我觉得都是需要的

    A: 哎, 但每次花时间在这些信息上面, 都有很大的负罪感..

    C: 怎么会

    A: 我觉得对我没有任何实质的帮助, 浪费了自己的时间, 我是罪人..

    C: 开心放松就完了，放松放松会冲劲更大

    A: 呃.. 好吧..

    A: 目前的做法是, 睡觉半小时之前吃褪黑素, 然后看会b站.. 就不会浪费太多时间.. 因为看着看着就睡着了...

    D: 我玩一天以后可能晚上会有负罪感，然后睡一觉第二天接着玩

    A: 太真实了....

    E: 以前我会有负罪感，现在一点都没有了上班那么累，多玩会儿不行吗

    A: hah 晚上再不学 一天就白过
80. ![image-20210206222400834](/files/-MSrlGWtMwTJ5AAc4hha)

    A: 说的真好

    B: 说的真好
81. 我明天要好好学学计算理论PLT，越想越有趣…

    计算理论与计算模型 - 晓强DL的文章 - 知乎 <https://zhuanlan.zhihu.com/p/158121402>
82. ![image-20210206222041073](/files/-MSrlMnzkIAj80lxpLo9)
83. 操作系统提供的是一个抽象”。抽象来源于具体，又超越具体。

    进程从根本上来说是操作系统对 CPU 进行的抽象和装扮 从根本上说，线程是操作系统给进程模型提供并发能力的手段进程属于处理器级并发，即在处理器这一层次上提供并发的抽象 线程则属于进程级并发，即在进程这个层次上再提供一层并发的抽象 内存管理从根本上说是操作系统对存储设备进行的抽象和装扮 文件系统从根本上说是操作系统对磁盘进行的抽象和装扮 输入输出从根本上说是操作系统对各种外部设备进行的抽象和装扮

    每次看到这些基本概念, 都很感叹设计的艺术..
84. 分享篇文章: 《操作系统之哲学原理》读书笔记 <https://taifua.com/operating-system-philosophy-notes.html>

    反复读了两遍, 就喜欢这么干的文章..
85. 分享篇文章: 纳什：无常命运中的美丽心灵 <https://fwjmath.wordpress.com/2011/07/25/john-nash-as-a-mathematician/>

    摘要: 很多人来说，数学家可能是遥不可及的存在。他们醉心于那个由各种抽象符号组成的世界，而似乎离现实很远很远。《美丽心灵》以诺贝尔经济学奖获奖者约翰·纳什的经历为素材，讲述了一位患上精神分裂症的数学天才，在爱与理智的帮助下，逐渐痊愈的感人故事。但电影毕竟是艺术抽象，它偏重于纳什博士与精神分裂症抗争的过程。那么，他属于数学家的一面，又是如何呢？

    A: 有空的同学可以看看 美丽心灵 这部电影, 挺感人的.

    B: 美丽心灵还是我十六岁那年看的 当时就觉得女主特别伟大

    A: 可惜的是 现实中 纳什 与 他的爱人 并不像电影中那样.. 曾一度打算离婚..

    电影中 在纳什获奖感谢爱人那一刻 泪崩了..
86. ![image-20210206222156542](/files/-MSrlJ6MQncmPJznpzeJ)

    stage 3
87. 分享篇有关 React Hook 使用例子的文章: useEncapsulation <https://kyleshevlin.com/use-encapsulation>

    指出了 使用 hooks 典型的场景.
88. 分享篇文章:

    计算的极限（一）：所有机器的机器，与无法计算的问题 <https://fwjmath.wordpress.com/2012/11/21/the-limit-of-computation-1/>

    文章涉及了 计算理论 中的一些概念, 有关可计算性理论可以讨论下.
89. 再开个讨论, 时间复杂度的表示 你觉得是否正确

    相信每个计算机同学都有接触过时间复杂度的概念 O(n) 大O符号表示法, 是计算理论中 计算复杂性理论 的衡量工具.

    有关它的计算有两个特性, 我想具体讨论下:

    1. 忽视常数项, 常数项视为 O(1)
    2. 忽视底次幂, 由最高次幂定

    这真的合理吗?

    我的质疑点有二:

    1. N 没有量化, 常数项没有量化, 为什么 哈希表的存取为 O(1), 这就是限制了常数项的缪论.
    2. 理论没有与工程联系起来, 计算机的各种cache,并行,传输开销等, 是理论不涉及的, 它真的实用吗?

    所以说 我在想 时间复杂度 可能只是一种很理论层面上的衡量复杂度的工具.

    我之所以说这么多, 就是我上学的时候 为它花了时间, 现在想想可笑.

    还有一点也随便发泄出来吧, 就是软件工程课程.

    一群不知道哪来的人造出来的概念, 或者根据已有的概念包装下, 竟然成了国内计算机大学的必修课.

    我从来没有从国内教育中获益过.

    到此为止了, 不说这点了.

    因为我眼界有限 并且 接触到的教育资源有限, 我吐槽的教育 只代表我经历过的.

    让我想起了之前看 软件随想录中的一句话:

    不论从什么角度看，这两种文化的差别大致上就是阳春白雪与下里巴 人之间的差别。 事实上，它很精确地反映在全国各个计算机系的课程设置 上。 在常春藤联盟 的院校中，只教授 UNIX 、函数式编程、状态机理论。 当你顺着排名的顺序往下看到那些越来越少人问津的学校，你就会看到 Java 语言开始在课程中出现了。 你再往下看，大概就会看到有一些课程起了这样的名字 ： Microsoft Visual Studio 2005的101 课程，3个学分。 等到你看到2年制学院的部分，会发现有些课程的名字，同 “21天 SQLServer书课程”差不多，简直如同周末有线电视中的广告 一样。 想找好工作吗？现在正是你最好的时机开始学习（另一个声音出来说 ） Java Enterprise Beans !
90. 分享篇文章:

    GO 编程模式：FUNCTIONAL OPTIONS <https://coolshell.cn/articles/21146.html>

    Go 复合结构 初始化的一些实践

    说到 Go, 它设计中有一点, 让我很喜欢

    它不支持 同时"可读可写"

    什么叫 同时"可读可写" ?

    1. i++ , 把 i 加 1, 该表达式会返回 i 未更正的值.
    2. a = 2, 把 a 赋值为 2, 该表达式会返回 2

    这种设计 现在大部分编程语言都有.. 我真的很想吐槽, 这是什么脑残设计..

    c 语言考试, 还就爱考 i++, ++i 这种问题..

    我之所以说这种设计脑残, 就是因为 从语义上来看, 它本应就是一个 只读或者只写的操作.

    把本来很简单的语义搞得异常复杂..

    A: 有点好奇 马老师为什么能在短短一小时里看了那么多篇文章

    B: 你可以看看我发的文章... 真的挺简单的.. 都是已有的概念..

    B: 就比如这篇文章, 我只是想衍生讨论下..

    每次分享这种文章, 也是为了能"下沉市场"...

    B: 我阅读最大的动力, 就是想找到一个让我惊讶 兴奋的知识..

    可是很难遇到.. 我太菜了 就怪我读不懂 paper
91. 分享篇好文: 分布式之系统底层原理 <https://cloud.tencent.com/developer/article/1770779>

    这篇文章 在我的阅读列表存了快一个月了.. 读了很多遍, 每次读它 读到一半就云里雾里.. 至今不是很理解 原子提交协议..

    之所以是好文, 文章前面讲的事务 以及 后面并发控制 让我很受教, 并且它出自潘少(ants的作者)之手.
92. Kujira no namida

    <https://music.163.com/#/song/1434293074/?userid=70921220&app_version=8.1.10>

    A: 当初做这首曲子用了2个小时，是因为情感问题，心里很，不知道怎么形容，

    B: 听起来感觉 挺舒服的.. 空洞.. 小心翼翼地维护.. 淡然.. 给我的一些感触.. hah 你多了一名fans\~

    A: 我想这是我做的夹杂情绪最浓的一首

    B: 我有点怕这种东西.. 会让我陷入回忆, 审视自己...

    A: 我想你们理工科的人也可以尝试一些音乐方面的，更有逻辑更严谨

    A: 我想，自己多少在这首曲子上找到了一点自己接触音乐的价值
93. 本周分享汇总： <https://thinking.tomotoes.com/archives/2021/2/1-6>

    共分享 92 条数，暂时未分类，实在太多了...

    上周分享条数 51 上上周分享条数 29 上上上周分享条数 71

    92 条信息 逐个分类，头疼...

    早知道不学这么多东西了...

    整整花了两个小时 整理完了...

    效率太低了...
94. A: 整理，一定要精简，精简，精简

    阅读的目的不就是为了，取其精华，去其糟粕嘛

    记得我们以前老师这样讲，读书就是为了把一本书理解为一句话，同时也能把一句话写成一本书

    B: 是这样的流程。

    1. 从手机里 把一周的选择消息记录都转发到电脑 （一次只能发99条）
    2. 把消息记录中的内容复制到 Typora （本地的一款编辑器） 如果遇到单纯的链接，还需要打开链接把对应的标题复制过来 如果遇到对话，还需要把每个人前面标志上字母代称 如果遇到图片，还需要调整下格式
    3. 把整理好的内容上传到 gitbook
    4. 由于图片不会自动上传，需要手动的上传遍所有图片
    5. 所有的信息条目本地分类
    6. 分类好的信息再复制到对应的 gitbook 上的分类
    7. 由于图片不会自动上传，需要手动的上传遍所有图片

    A: 这流程也太多了吧，哈哈哈哈

    B: 整理很好时间， 分类也很花时间，因为有的信息很难划分。 就比如下面这4篇

    ![image-20210207001652329](/files/-MSs8h1-c_xPQJfMzKXx)

    A: 你是喜欢整理，还是真的需要这些

    B: 由于使用微信群的方式，很多时候 有价值的信息都会被时间掩埋，并且当卸载微信或者换手机时，聊天记录也会丢失。 基于这些痛点，我创建了个站点：<https://thinking.tomotoes.com/> 站点里的内容 皆来自于 思考的价值 微信群，它记录了 自从建群以来 每天有价值的信息。

    算是一种记录吧。

    其实几乎没有同学看的。

    但意义不在于此。

    在于我怎么看这件事。

    可以看下我的年终总结 自己的热爱一章 <https://tomotoes.com/blog/2020/>

    A: 可以的 我的建议还是精简一些

    B: 没办法精简啊，都是信息流。

    A: 某个问题的具体描述，一些看法，引发的思考，等等；但基本上篇幅过长，引用的东西太多，而且中文表达的意思过于零模两可

    B: 我明白，但你说的这种场景不适合 信息流聚合。

    就比如刚刚的4篇文章图片，你觉得应该精简呢？

    A: 我是说，自己可以根据看完的文章，自己做一个简单的文本记录

    B: 哦，了解了，大部分好文，我会简单提两句，有的文章只是快餐而已。

    A: 那你就是喜欢整理了，哈哈哈哈

    B: 你可能不了解计算机，很多快餐文 没必要做记录的。

    我明白，其实知识内化部分 我有待提高，的确有的知识可以看完再梳理下。

    A: 既然你认为是快餐文，还有需要整理的必要性？

    B: 快餐文也好 好文也好，最重要的初衷是分享给大家。

    A: 了解，明白 但这样会累吧 乐此不疲但也还好

    B: 但是 每个人的爱好 都不一致。就比如我分享一些好文，有很多同学都不一定感兴趣，这也是一个大问题。

    A: 我不太看文章

    B: 是啊，所以 我在群规的第一条是 如果你觉得不舒服或者因为其他原因，可以随时退群。 在我看来 这是双向选择的事情，我完全理解。

    计算机太广了，不可能照顾到每一位同学的。

    A: 哈哈哈哈哈，还是能接触到了一些很有趣的事的

    B: 谢谢，这句话对我很有意义。
95. 我准备下一步获取知识，通过一些 paper 了。

    我目前的困境就在于此，信息获取的质量一直不高，不管是读书还是看文章。

    虽然平时我在群里分享很多文章，但这些文章一是质量一般，很少有好文章，二是找到这些质量一般的文章 也需要花时间。

    这不利于我进步。
96. A: 你的站点是自己建的的嘛？ 用的哪的服务器

    B: 关于 Tomotoes <https://tomotoes.com/blog/tomotoes/> 这篇文章有介绍，除了域名 整个网站还没花过钱。

    A: 服务器免费？很好奇，你没有备案，怎么没有被封掉，服务器是国外的，厉害了

    B: 托管服务器： GithubPage

    很简单，无论是技术方面的信息，还是其他方面，我都不会涉及中国大陆法律禁止的条令。 并且，我不会输出负能量。 然后，一个坏掉的番茄永不备案，永不迁入大陆服务器。 平时都很讨厌GFW的存在，但这个时候 我并不觉得有什么大碍。 我的微博，我网站的评论都需要站在墙外才能输入输出。 这样挺好的，避免了熟人发现我的情感弱点，避免了无意义的评论。 至于SEO，我不会主动去做。 我知道，这样做的后果就是网站流量太低。 哎，对于我来说，没什么，一个坏掉的番茄 是为我服务的。 每天就几十日活，很好，我的信息得到了分享，完全够了。

    A: 好的，待会去了解一下


# 7-17

暂未分类，肝不动了...

1. 分享本书：改变未来的九大算法 \
   <https://book.douban.com/subject/24529132/> \
   虽然书名取得很一般，但内容还是不错的。
2. Rust相较于Haskell除了效率还有何优势？ - parker liu的回答 - 知乎 <https://www.zhihu.com/question/31644802/answer/1720583773>
3. ES6 提出 class 关键字是希望解决什么问题？它是不是鸡肋？ - 大宽宽的回答 - 知乎 <https://www.zhihu.com/question/432832293/answer/1719931291> \
   宽老师居然来飞书做架构师了..
4. 你辛苦学会的 Webpack dll 配置，可能已经过时了 \
   <https://mp.weixin.qq.com/s/jtIbVc9Bl50TIs7YilWbFg>

   之前一直没想过前端工程与dll之间的关系..
5. 分享本画册，里面的绘画都超治愈。 \
   生活蒙太奇 \
   <https://book.douban.com/subject/35088492/> \
   摘要：我总觉得，这个世界的联系很多时候是靠共感产生的。虽然人有千差万别，但我某时某刻的所思所想一定可以代表某时某刻的一部分人。我希望能把我感受到的情绪准确地传达到那部分人心里，利用共感让他们的世界能短暂地和漫画里描绘的世界联系起来。
6. 有哪些好看到爆的油画壁纸？ - 一盏茶酱的回答 - 知乎 \
   <https://www.zhihu.com/question/311419280/answer/1485398578> \
   写实油画 看起来太有魅力了。
7. 分享篇文章：

   React 事件系统工作原理 \
   <https://musicfe.dev/react-event/>

   摘要：React 为我们提供了一套虚拟的事件系统，这套虚拟事件系统是如何工作的，笔者对源码做了一次梳理，整理了下面的文档供大家参考。
8. 快餐文分享：

   聊聊 JavaScript 的并发、异步和事件循环 \
   <https://musicfe.dev/eventloop/>

   文章涉及了一些基本的概念，可以简单看下。
9. 惊艳系列文章分享：

   用「增量」思想提升代码检查和打包构建的效率 \
   <https://musicfe.dev/delta-mind/> \
   具体原理是使用 git diff 找到需要构建的资源。 文章很久之前读过，当时留下来挺深的印象，惊讶系列的知识实在太难遇到了..
10. 学到一个名词：语法噪音 \
    syntactic noise is syntax within a programming language that makes the programming language more difficult to read and understand for humans. 你有想到哪些语法噪音呢。
11. ![image-20210219225312812](/files/-MTutv8yVX-QcgTbLC0t)

    设计 内部 DSL ，在我看来就是设计面向开发者的 UI。

    C# 的 linQ 无疑是实用性与优美性兼得的DSL。
12. 好文分享：

    前端 DSL 实践指南（上）—— 内部 DSL \
    <https://musicfe.dev/dsl/>

    经典老文，建议阅读\~
13. 好文分享：

    前端响应式编程与实时计算：从 RxJS 到 Flink \
    <https://mp.weixin.qq.com/s/m5kBSTYg95qHHOaZn1NV0g>

    好文很难遇到，且行且珍惜。\
    RxJS 的事件组合机制, 太利于对View 驱动抽象了，惊讶。 \
    refresh$ = merge(clickRefresh$, autoRefresh$, pullRefresh$));
14. 分享篇文章：

    State of the Common Lisp ecosystem, 2020 🎉 \
    <https://lisp-journey.gitlab.io/blog/state-of-the-common-lisp-ecosystem-2020/>

    了解下 Lisp 的生态\~
15. 故事分享：

    A short history of ReScript (BuckleScript) \
    <https://discuss.ocaml.org/t/a-short-history-of-rescript-bucklescript/7222>

    一个Ocaml狂热爱好者与他的一个想法 到 实践 推出 ReScript 的故事。\
    作者开发了 一个比编译器还复杂的解释器，找到了作者的知乎账号： <https://www.zhihu.com/people/hongbo_zhang>

    A: 原来是国人..

    B: 张宏波大神

    A: 之前只是听说过 ocaml，原来这么强大的一门语言。
16. 快餐文分享:

    Web前端剪切板文本分享到文件发送 \
    <https://mp.weixin.qq.com/s/TrrxxeGdPsF5wVoGMcuw4w>

    目前 Web 还不支持复制多个文件,文件夹,Gif 动图... \
    里面涉及了 之前我们讨论过的 复制图片的点.
17. 分享篇文章: \
    Build a Regex Engine in Less than 40 Lines of Code \
    <https://nickdrane.com/build-your-own-regex/>

    40 行写一个简易的正则引擎\~

    文章简单易懂, 推荐阅读.

    <https://github.com/nadrane/build-your-own-regex/blob/master/solution.js> \
    这个正则引擎的实现 读起来有股淳朴的味道..
18. hah 分享篇文章:

    10 Things I Hate About SQL \
    <https://dev.to/shaqq/10-things-i-hate-about-sql-a9e>

    暴躁老哥 在线吐槽. With PostgreSQL, MySQL, Spark SQL, Presto SQL, SQL Server, Oracle SQL, and probably many others… we just can’t get a break! Each of these SQL implementations have slight idiosyncrasies that make it very painful to transfer queries from one system to another.
19. 想讨论下关于 React 状态管理的问题..

    随着项目的迭代, React 的项目慢慢 分成了 状态管理库(Redux)中的状态 与 组件内部的状态..

    感觉状态越来越混乱了..

    这应该是一个现代前端项目无法绕过的问题.. 全局中的状态 往往都是 很多组件需共用的状态, 组件内部一般都是 关于该组件的 UI 状态..

    这是我目前的划分, 有什么更好的实践嘛? 总觉得没有统一美..

    业界感觉除了 rxjs 也没有什么其他的实践, mobx 那一套 感觉只是加了成 proxy 的概念

    可以想想.. 感觉这块状态管理有痛点欸..

    想出来你就是下一个 Dan
20. 分享期视频: \
    炒房、卖房、租房，潘石屹的中国房地产行业掘金史【中国商业史21】第1集 \
    <https://www.youtube.com/watch?v=ISlfUzVUcSA&ab_channel=%E5%86%B2%E6%B5%AA%E6%99%AE%E6%8B%89%E6%96%AF>

    这系列只讲经济不讲政治.. 多少有失偏颇.. 不过无聊的时候看一看还是挺有趣的..
21. <https://weibo.com/1787076481/K15Zi8Xk2?type=repost>

    JavaScript 2020 年度普查 (2) · 技术章 | 程序员黄玄 - 2020 年最受关注的技术 —— 横跨 JS 方言、前端/后端/测试框架、数据层、构建工具、桌面端移动端 App 开发方案。

    视频做的很棒，建议观感\~
22. 读到一句话，感觉写的很有道理。 \
    人是社会动物，有欲望，有理智；人也是经济动物，凡事会计算利益得失。人永远在利益与代价之间，在理性与感性之间，决定自己的行动。
23. 文章分享：

    「字节跳动」投资2020：全面开花、深入布局 \
    <https://36kr.com/p/1090378619357956>

    字节的战略布局越来越广了..
24. A: 每天调UI库的API，调到不知道该怎么提升...

    B: 可以提升到 如何在繁琐的业务中提升自己的主题。

    加班只是为了自己的今天，提升自己是为了自己的明天，有多少人只有今天没有明天，当你加班缓过神来，一定要努力提升自己。

    具体来说，提升就是学习嘛\~ 如何学习呢，这个话题就大了。

    我不想提什么广度，方向，学习资源这些横向的事，想讨论下竖向的事情。 其实这也是老生常谈的话题了，我分享下我的学习方法。

    每天读各种文章，不管是什么方向，什么领域，从这些信息中提取关键信息 反馈到自己的系统，增强与其他知识的联系。 关于如何读书，又是一个很大的话题了。

    我一般都是先简单过一遍，没有兴奋的点就pass，如果有就精度几遍，读的时候一定要思考，提问。 就比如一个应用层的框架，一定要思考到操作系统层面。 呃，以上观点 主观性极强，你可以做个参考..

    A: 我感觉还是主观能动性

    B: 哦，你说这点嘛，我理解。

    A: 我有时候读着读着就发现我需要a知识点，然后读a知识点又发现b知识点不知道，然后去读b...

    B: 哇，我超喜欢这个过程..大把的知识\~

    B: 我只是知识的搬运工，自己创造不了新的知识理论.. 太菜了
25. <https://shimo.im/sheets/wV3VVxGO5EsGXX3y/MODOC/> 《个人七天沉淀计划模板》

    七天沉淀计划，还有同学要参加吗？ 我具体讲一下：

    ![image-20210219225922240](/files/-MTuu6k9XYcU6aNmQYPU)

    意义我再补充下，关于上面的群体性，大家可能理解的不是很全面，具体指的是，当你进入到一个群体时，你的上进心 就会被潜意识地挖掘。

    每天都是由事情所驱动，不会有所懈怠，尽可能的不浪费时间。

    想参加的同学可以试一下，不需要 7 天全部，也可以单独两三天这样。
26. ![image-20210219225937100](/files/-MTuu8yKPzf8bVDJD99C)

    对齐工程师可还行
27. JS 主题图标和插画艺术展 \
    <https://zhuanlan.zhihu.com/p/124302068>

    拟物风 爱了爱了..
28. <https://www.remotion.dev/> \
    使用 React 创造 视频...

    GUI 表达语法 的扩展程度超出我的想象。

    关于刚刚分享工具详细介绍： \
    A soft introduction to Remotion \
    <https://www.youtube.com/watch?v=szh2Qgo9SVE&ab_channel=uidotdev>

    This new tool merges the video creation process with software development concepts like source code control. You don’t create videos, you program them.
29. A: 列举一下 目前我了解到的 React render domain：Web、App、PDF、CommandLine、Sketch、Video、PC native software，几乎所有可想象到的终端\~

    现在看来 ，React 的架构设计（core 与 render 的分层）真包含着大智慧。

    B: 确实 还有渲染到游戏机液晶屏的 将 React 渲染到嵌入式液晶屏 - doodlewind的文章 - 知乎 <https://zhuanlan.zhihu.com/p/89574235>

    A: hah 我看过这篇文章，关注作者很久了，是位白学家大佬￼ 他之前写过一篇实现v8引擎￼

    B: 受益匪浅￼
30. A: 为什么python在科学计算这么火呢？是因为研究者喜欢吗？我一直搞不清..

    B: 因为大部分库都是写给py的吧

    C: 动态类型，运算符重载，调c方便

    A: 好吧\~\_\~ 运算符重载 是挺酷的，但是对工程化的提升不大.. 好吧，灵活性与工程化本来就很难兼得
31. Podcast分享： <https://moon.fm/share/episode/3453/>\
    🎙Ep 07. Lisp 程序员眼中的 Python?

    讲了很多语言特性，编程范式，可以当做饭后零食\~
32. 好文分享: \
    分布式一致性与共识算法 \
    <https://mp.weixin.qq.com/s/iPynSikOAihYMIcCERtrgg>
33. 惊讶系列分享，文中 画板的例子太秀了。 \
    你可能不知道的 transition 技巧与细节 \
    <https://juejin.cn/post/6924114612799406093>
34. 正在找工作的前端同学可以看看，面试题都很典型。 \
    2021 千字大厂面经 & 个人成长经验分享 \
    <https://juejin.cn/post/6922290178836922381>
35. CSS奇思妙想 -- 使用 CSS 创造艺术 \
    <https://juejin.cn/post/6922257014840098830> \
    我愿称为大艺术家chokcoco\~
36. 🌚如何更容易上手 Typescript 类型计算？ \
    <https://juejin.cn/post/6924848590544207885> \
    摘要： 最近在国内的前端圈流行一个名词“TS 体操”，TS 对应 TypeScript，“体操”是 TC 的戏称，而 TC 就是 turing completeness （图灵完备）的意思，具体就是指验证 TypeScript 的 Type-level programming （编译时（compile time）的相关语法）是图灵完备的，经过传播之后，也泛指以一个 TS 类型作为输入，通过写 TS 代码输出另外一个类型的实践。

    文章分享，写的很不错，demo也值得刷一下。
37. 实用函数式编程技巧：\
    Combinator Pattern \
    <https://juejin.cn/post/6919302763306287117>\
    好文分享。 好文不易，受教了。 \
    尤其是讲 rxjs 与 函数组合概念章节 很赞，文中的 demo 将 generator 与 fp tools 结合 给了我另一个视角去思考迭代器。非常建议阅读。
38. 【译】主板芯片组和内存映射 \
    <https://juejin.cn/post/6927099189872721928> \
    文章分享，干货不少，示例图有些歧义，现在北桥一般都集成进cpu了。
39. 程序调用 dll 的本质是什么？ \
    <https://www.v2ex.com/t/752972>

    帖子中 有人说 dll 的主要作用有 2 个，一个是代码复用，另外一个是节省内存。 我再补充下，还有混淆加密关键文件的作用。
40. Podcast 分享：<https://moon.fm/share/episode/3495/>\
    🎙Ep 18. 竟然有人在前端做科学计算？

    解决了我昨天的那个py发展的问题，是因为 py 已经有很好的计算工具生态 比如numpy，借助 ai 的风潮，在科学计算领域成为了现象级的语言.
41. 文章分享： \
    一名近六年工作经验的程序员通过日常开发，沟通，排查和解决问题，来提升开发效率的经验 \
    <https://lichuanyang.top/posts/3423/>

    虽然文章不长，但是我觉得在工作中确实会被一些除技术外的事情影响进度，如何提高效率很重要
42. 词汇分享： \
    chew\[tʃuː] \
    v.咀嚼；思量 \
    【记】联想记忆：chewing gum（口香糖） 【考】chew sth. over 思量
43. vs stories 插件作者 ben今天推出了 最近研发的vscode clubhouse 插件\~ 执行力max..

    <https://youtu.be/hy-EhJ_tTQo>

    I built an audio social network that's going to be the next billion dollar unicorn. <https://dogehouse.tv> <https://github.com/benawad/dogehouse>
44. CSS 专业技巧 一个帮你提升 CSS 技巧的收藏集。

    <https://github.com/AllThingsSmitty/css-protips/tree/master/translations/zh-CN>

    文章中一些技巧很有实践意义，总结了下:

    1. all: unset; 可以用all简写來指定所有元素的属性。
    2. 安装字体时，使用 local 函数检查是否本地安装
    3. a\[href^="http"]:empty::before { content: attr(href); }
45. 盘点春节红包大战：流量和多巴胺\
    <https://mp.weixin.qq.com/s/0DoZxo8QgqgTQoeUtJkncw>
46. 每日一句分享： \
    “Our mission is to organize the world’s information and make it universally accessible and useful.”

    来自 Google 's mission - <https://about.google/>
47. hah 它终于来了。

    reactend/reactend-express \
    <https://github.com/reactend/reactend-express>

    React renderer to build Node.js server 感觉也就是一个玩具，使用 JSX 表达，让我想起了 使用 xml 配置 tomcat .. 实用价值几乎为0..
48. B: 可以衍生谈一谈这点：

    JSX 最初是用来描述 GUI 的，最大的特点是 可以在 GUI 内部包含逻辑，包含状态。

    而编程其实就是在写 UI，这里的 UI 是一个更高层次的，指的不仅是 Web，Command，还有面向开发者的 UI。

    在设计接口，设计API时，从另一个角度来看，我们本质上是在写UI。

    并且 声明式编程范式，也是一种很好的体现。

    JSX 代表的是一种表达方式，一种可以很好切合 声明式范式 需求的语义方案。

    关于声明式编程 其实可以多谈一谈。

    如果用一句话概况声明式编程的话，它最大的特点是: 它的所有语义表达, 只是在声明要做什么，具体怎么做，剩下的它不需要关心，只需要交给编译器。

    函数式编程其实就是声明式编程的一种体现。

    一些业界典型实践有，sql ，graphql，jsx

    A: 与声明式对应的是啥来着 OO？

    B: 不不不，oo 其实算不上是语义范式，是命令式的建模

    我觉得没有对应的，只是思考的层次不同吧。

    C: 声明式对应命令式吧 比如gui开发，声明式比如HTML，命令式比如qt

    B: 命令式 感觉和 声明式的思想一样的，只不过是被声明的对象不同。

    声明式的出发点是开发者，命令式的出发点是 编译器，操作系统，运行时。 照这么说，感觉所有语义范式 应该都是声明式的，只不过是声明粒度不同而已。

    而 oop 与 fp，算不上语义范式，是编程范式。

    oop 对应建模，状态传递，fp 对应 状态映射，其实 oop 与 fp 之间的关系很近的。

    A: 嗯，实际写代码的时候我基本都不 care 声明式还是命令式啥的范式。。按直觉去写了 \
    B: hah 我除了遵循 fp 的编程规范外，做到最多的事 就是隔离状态。
49. 好文分享：

    我的信息方法论：原则与实践 \
    <https://blog.ddlee.cc/posts/3a6233e2/>

    摘要：很多人都谈，我们处于一个信息过载的状态，这个时代唯一稀缺的资源便是我们的注意力。作为个人而言，如何在数字时代更健壮和自信地生活？我将在这篇文章里试图梳理自己在信息的获取和处理方面的态度和思考，以原则和实践分别叙述出来。

    这篇文章很有价值，建议阅读。

    信息源头 -> 阅读者

    信息源头 -> 平台 -> 阅读者（数量增多）

    信息源头 -> 平台（过滤，推荐，隐藏） -> 阅读者（数量增多）

    RSS：

    * Rich Site Summary & Really Simple Syndication（前者注重格式，后者强调目的：方便更新）
    * 一种信息流动的格式/协议：「允许内容提供者按一定格式组织和发布内容，方便内容消费者抓取。你甚至可以认为，它是一项信息提供者和消费者之间的“契约”。」

    如何使用 RSS：

    1. 找到网站（我主要以大佬们的博客为主）的 RSS 链接
    2. 去 [Feedly](https://feedly.com/) 服务，创建账号，搜索 RSS 订阅（想用 mac 的客户端 reeder 发现要 A 区账号而且还要钱。。）
    3. 手机也可以下载 Feedly（需要 A 区账号）
50. A: 之前我看 Go web frame 源码时，经常看到使用前缀tree做路由匹配 其实是字典树，也叫字母树的一种应用。

    B: trie树 leetcode上刷到过￼
51. 分享道 leetcode 上的必刷题：

    基本计算器 \
    <https://leetcode-cn.com/problems/basic-calculator/>

    没有尝试过的同学可以试下，推荐。

    可惜 scriptoj 平台不继续运营了。 <http://scriptoj.mangojuice.top/>

    这平台里面 一百多道的题 我曾经全刷过，有关于 Virtual DOM 的实现，有关于 写一个 brainfuck 的解释器， linq 的 js 版本等等，里面的题目质量不底， 有工程实践味道。 \
    另一个推荐的平台就是 codewars 了，支持很多编程语言，题目也由浅入深，推荐。<https://www.codewars.com/> 断断续续的 刷到了 3段。
52. 哇 发现一个老古董\~ \
    GnoConsortium/gno \
    <https://github.com/GnoConsortium/gno> \
    ![image-20210219230945388](/files/-MTuug0HvMj6wjjKecGo)

    24 年前... 都比我大了。
53. Q: 给你一个 fetch 函数，fetch => Promise\<Data>. 请你实现 请求 8 秒无结果后，超时报错的机制。

    A: ablortController￼ 加上promise.race￼ \
    Q: 回答上了 promise.race 就成功了。
54. 分享篇多年前看过的好文，出自黄峰达老师之手：

    演进：如何用练习快速提升技术

    <https://mp.weixin.qq.com/s?__biz=MjM5Mjg4NDMwMA==&mid=2652975915&idx=1&sn=1d0c3bb0937e3d9cf1f74b1257c7aacc&chksm=bd4ae0088a3d691e44cfaf0a3baae2cbd9b3611996663e4c00df5bbe79974b6ed005857995f4>

    对最开始刚学计算机的我，产生了很大的影响，还记得看完后 我练了一周的指法... \
    当时看完真是 收益匪浅，现在看了一遍 没多少感觉了..
55. 快餐文分享：

    如何把css'content的操作跟价值发挥到最大\
    <https://juejin.cn/post/6844903917348732936>

    counter 函数 与 content 中的字符拼接 可以关注一下
56. 文章分享：

    go-patterns - Semaphore

    <https://hxangel.gitbooks.io/go-patterns/content/synchronization/semaphore.html>

    使用 channel 实现 信号量，代码很简单，文章很短，建议阅读。
57. 分享篇有趣的文章：

    代码要按行收费？！\
    &#x20;<https://mp.weixin.qq.com/s?__biz=MjM5NzAxMzMxOQ==&mid=2675249783&idx=1&sn=89853b6c2302f2f7dbffea43739b3a61&chksm=bc61c05f8b164949156fe0619071eecc1b1faa8f0d33a9bdc0326bc139962d3a5eae3ad4465c>

    摘要：有一个站在巅峰的男人曾经应拉里 · 佩奇的邀请将谷歌的所有代码写成了一行，并且能完整的实现了谷歌现有的所有功能，人们甚至发现谷歌搜索快了将近 30%。后来有华尔街和硅谷的资深从业者看到这行代码后久久不能平静，对这行代码给出了 5600 亿美元的估值，当然这行代码一般人是看不完的，据说这行代码的长度可以从加州连接到 M31 星系。
58. 分享篇 科普文章：

    原子的故事 \
    <https://oldj.net/article/2020/09/20/story-of-the-atom/>
59. 分享篇文章：

    编程语言社会学 \
    <https://yuheng.io/articles/proglang-sociology>

    作者的一个观点我很赞同：编程语言的语法就是开发者的用户界面。很大程度上，编程语言的风格决定了开发人员的思维风格，编程语言的局限也会成为开发人员的思维局限。
60. 分享篇文章：

    互联网不需要皇帝 \
    <https://greatdk.com/1696.html>

    摘要：互联网世界的许多东西都已经或正在消亡：RSS 在消亡，电子邮件在消亡，BBS 在消亡，超链接协议在消亡，浏览器也在消亡，剩下的只有 App，他们是互联网世界里，新立起来的一座座孤岛。 在 App 的世界中，自由举步维艰：内容审查，智障能推荐，跳转拦截，接口封闭，你的选择的权利，拒绝的权利，保存的权利，沟通的权利，都在逐渐丧失。

    哎，典型的囚徒困境 ，如果没有不可抗力 是无法破的。
61. 快餐文分享：

    Go 并发编程范例 \
    <https://steeed.gitee.io/gotour-concurrency-coding-example.html>

    Goruntine + channel 实现多种并发模型 真的不要太简单。
62. 好文分享：

    Let's Create a Simple Load Balancer With Go \
    <https://kasvith.me/posts/lets-create-a-simple-lb-go/>

    摘要：Load Balancers plays a key role in Web Architecture. They allow distributing load among a set of backends. This makes services more scalable. Also since there are multiple backends configured the service become highly available as load balancer can pick up a working server in case of a failure.

    文章写的很好，由浅入深 先介绍了 负载均衡常见的策略，然后给出了实践，重试机制，心脏检测都有涉及，可惜的是反向代理的核心流量转发 使用的是 Go library 中的 ReverseProxy..
63. 人物分享：

    欧长坤 - 2020 年终总结 \
    <https://blog.changkun.de/posts/2020-summary/>

    这是一位我仰慕已久的大佬。
64. mutex 是 mutual exclusion 的简写，翻译一下：互相排斥。
65. 好文分享：

    工程师应该怎么学习 \
    <https://xargin.com/how-to-learn/>

    摘要：现在很多年轻的程序员会从网络博客来学习技术，但博客内容大多缺乏体系(主要说总结性质的博客内容)，不系统。很多博主为了掩饰自己的未知，遇到不知道的关键点就一笔带过，进而导致缺失。即使原作者非常努力，内容上没有缺失，你能从中获取的也只是别人总结好的知识，没有自己的主动思考，这中间便缺少过程式的沉淀，一味地满足于背诵别人总结好的知识，最后也只不过沦为他人的复读机而已。

    人这一辈子，最重要的是能把路越走越宽。对于工程师来说，能够锻炼软技能的场合其实不是很多，但也不代表完全没有。即使没有也可以自己创造机会，例如组内、组间、部门内的技术分享都是不错的机会。
66. 我还真搜到了文中提到的 awesome-awesome-awesome repo，\
    hah <https://github.com/t3chnoboy/awesome-awesome-awesome>

    项目描述是 A a curated list of curated lists of awesome lists. \
    哈哈哈 这种黑色幽默 太可爱了。
67. 人每天只有八个小时工作时间，谁都一样。其中能高效工作的时间绝对不超过4个小时。 这些工程师编写的代码行数绝对不算多，但从事的项目影响大。 比如 Pike，大部分时间花在了审查其他成员的 Go 代码上。而一个刚入行的 Golang 工程师，每天的任务就是写作 Go 的标准库，今天写 http 明天写 sort，写的比 Pike 多很多。 考核时，高级工程师因为带领着高效团队，每季度 OKRs 上都有诸多亮点；而刚入行的工程师，只能报告一些比较琐碎的成就。 这个观察近乎于常识，然而对于当时的我来说是一个顿悟：做出 MapReduce 框架的和写琐碎 MapReduce 程序的工程师之间的差距并不是他们的工具和编程效率，也往往不是教育背景或者经验，而是他们各自的杠杆：所带领的团队。

    问题是，没有人会给你这个杠杆。

    摘抄自 4G Spaces - 技术管理猪鸡-1 开篇 \
    <https://blog.youxu.info/2015/05/17/tech-lead-1/>
68. 分享篇文章：

    Writing JavaScript tools in other languages – a new trend\
    <https://2ality.com/2020/10/js-plus-other-languages.html>

    摘要：Recently, we have seen an uptick of JavaScript tools being written in languages other than JavaScript. This blog post lists a few examples and explains the appeal of not using JavaScript.
69. ![image-20210219231203219](/files/-MTuuul--dCbYfcdIQGC)

    自由过了火\~
70. Answer to What should you never say to a programmer? by Aladin Bensassi <https://www.quora.com/What-should-you-never-say-to-a-programmer/answer/Aladin-Bensassi?ch=99&share=753c53dd&srid=iVbmg>

    代入感很强，已经开始生气了..
71. ![image-20210219231252196](/files/-MTuuxxxtRpzjSrryfjE)

    hah 第一次碰到 so 维护..
72. Learn fp visually

    <https://david-peter.de/cube-composer/>

    一个 立方体映射的游戏，玩到 3.1 就玩不动了..
73. 词汇分享： \
    Ponder /ˈpɑːn.dɚ/

    to think carefully about something, especially for a noticeable length of time:

    例：She sat back for a minute to ponder her next move in the game.
74. 刚刚学到两个快捷键，在 Chrome 下键入：

    1. Command + up arrow：页面滚动至顶部
    2. Command + down arrow: 页面滚动至底部 平时都是用 vimium 的 G 与 gg...

    并且在 Finder 中键入：

    1. Command + up arrow：返回上一目录
    2. Command + down arrow: 返回刚刚的目录 这些快捷键 与 鼠标手势，剪切板手势结合 简直完美\~
75. 如何监听 React 应用的性能：
    1. 使用 React 官方提供的 Development tool plugin 中的 Profiler panel，控制台可见
    2. 与上面类似，使用 React 提供的 Profiler 组件，在 onRender props 中可以拿到渲染的信息。
    3. 使用 Chrome Dev Tools 的 performance tab，使用之前需要禁用 React Development tool 插件，不然会影响性能，记录之后 在 timing 中有查阅。
    4. 使用 performance api 拿到信息，不过经常用于埋点。
76. React 组件测试的两种场景：

    1. 组件 snapshot 测试，常见的工具有 jest

    > 将组件渲染出来的元素截取 与预期元素做判断，可以看做一种断言测试。

    &#x20;   2\. e2e 测试（end to end），一般使用 headless browser 作为测试工具，常见的工具有 cypress

    > 在“真实”环境下，模拟用户运行应用测试。

    测试的类别：单元测试，集成测试，冒烟测试 等...

    随便提下：AB 测试与灰度发布 其实是一种概念，AB 测试可以看做带有埋点系统的灰度发布。 \
    之所以这么划分，在我看来 是因为出发点的不同。\
    AB测试 是从产品，数据角度。 灰度发布 是从运维，开发角度。
77. A: 可以讨论下 测试驱动开发。业界俗称 TDD

    测试驱动开发 我觉得最关键的是 分场景。 需要质量保障，可以按模块分期迭代的场景比较适合。

    因为我从来没写过测试，所以对它的解决的痛点不是很了解。

    B: 先编写测试 测试飘红写业务代码，然后绿了在重构，红绿红绿

    A: 原来这就是 测试驱动开发，还能被绿，开心。

    感觉最好的测试 就是防御性编程了。

    我指的是，开发时遵守规范，如果当复杂性很难控制 或者 数据流模糊不清，就是测试失败了。

    我感觉很多时候，先写测试用例，大概率会重写，因为有的点 只有开发时才会意识到...

    还是看测试粒度吧.. \
    B: 我觉得tdd是个好的锻炼思维逻辑还有对后期代码维护调试的方法

    传统的tdd应该就是先写测试，不写业务代码，全权由测试引出需要抽象的那些，看过一些大佬码代码的过程 是啊，正常写代码也是迭代的过程吧，那些点就是重构的阶段了也符合tdd \
    A： 哦，看起来 测试驱动 应该是强调 思维重心，先由 测试引出设计，这个听起来挺厉害的... \
    B: 是啊，而且先写测试也能强迫你出松散耦合的设计￼ 而且测试可以当做文档使用

    A: 了解，测试当文档使用，指的是测试的伪代码吗？还是说 测试有一套 dsl 可以描述信息？ 感觉 tdd 并不适合UI开发。 \
    B: 一个测试对应一个功能，一个测试对应一个类 加上测试方法命名规范，基本上就知道这个测试 A: 我刚刚想了下，感觉 tdd 的适用性 与 前端（这里泛指GUI）与后端开发模式的不同存在很大关系。\
    今天早上看了一篇文章，写的很有道理，关于GUI 开发复杂性。

    The complexity that lives in the GUI \
    <https://blog.royalsloth.eu/posts/the-complexity-that-lives-in-the-gui/> \
    文章把主要的痛点 都归结于组件之间的状态管理。 正因为组件（模块，单元，类 一种概念）之间的状态 划分不清，开始设计时 很难把所有的 UI 状态，数据状态都想到位。
78. 好文分享：

    深入理解JSCore \
    <https://tech.meituan.com/2018/08/23/deep-understanding-of-jscore.html>
79. 分享两篇关于介绍 React-Native 比较简明的文章：
    1. React Native架构一览 <http://www.ayqy.net/blog/react-native-architecture-overview/>
    2. React Native架构演进 <http://www.ayqy.net/blog/react-native-new-architecture/>
80. HTTP2.0 的多路复用 与 浏览器网络连接限制 针对 Web 应用优化的建议：

    1. 如果服务端配置了 HTTP 2.0 ，那么建议域名收敛，可以最大程度上 多个请求复用同一个链接，可以消除重复连接带来的消耗。
    2. 如果服务端没有配置 HTTP2.0，并且请求数量很多，建议域名分散，最大程度上 不阻塞 请求统一域名下的资源。

    我总结的这个主题，有同学想讨论下吗。 \
    域名收敛 与 域名分散 居然出现在了同一个场景。\
    好吧，其实我对浏览器限制同一域名最大请求限制数 这个规则挺好奇的。 \
    其实这点与 tcp 拥塞避免 规则 可以联系到一起。\
    &#x20;一句话概括：为了正义.\
    可以看下这个回答 浏览器允许的并发请求资源数是什么意思？ - bombless的回答 - 知乎 <https://www.zhihu.com/question/20474326/answer/15691654>
81. 分享个好玩的项目：

    GTAmodding/re3 \
    <https://github.com/GTAmodding/re3>

    GTA3 罪恶都市源代码 全局搜了下 nuttertools 居然啥也没找到，这不是真的罪恶都市￼
82. 优化 HTTPS 的一些策略：
    1. session 复用，将非对称加密的结果保存到 session 中，下一次连接直接复用
    2. TLS 1.3 ，一次 RTT 即可握手成功
    3. TCP fast open, 将 三次握手 优化成 二次 + 凭证 认证
    4. HSTS：强制使用 HTTPS 访问，减少一次 302
83. 分享篇文章：

    DNS的历史和原理 \
    <https://yangwang.hk/?p=852>

    摘要：在1973年，IETF（国际互联网工程任务组）发布了RFC 606，RFC 608等几个文档，决定由斯坦福研究院网络信息中心（NIC）作为hosts文件的官方来源，互联网上的所有主机均从该中心下载hosts文件使用。这套方案从1973到1983运作了差不多十年时间。相比于70年代，十年后的主机数量已经庞大得让这套系统得缺陷也被暴露出来：由于主机的增加，hosts文件像滚雪球一般变得越来越大。更糟糕的是主机名到IP地址的映射关系不是固定的，换人话说，那就是一台主机的IP地址可能随时间发生变化。主机数量越多，文件的变化率也就越大。以至于到后期每天都要从NIC重新下载最新的hosts文件。
84. 想讲讲 客户端缓存，也就是只有静态页面，没有服务端的应用 该怎么利用好缓存，让页面加载更快。 \
    我在这方面有一些实践，因为我的网站是一直是托管在 github page 和使用 jsdriver cdn 这样的，除了域名 没有买过服务器，所以网络请求的优化也无法涉及，只能从客户端性能这边入手。 \
    但是 只讲下 页面缓存，其他优化的点 暂时不涉及。 \
    我最开始使用的页面缓存 很蠢，我把关键 css，js 的内容保存到 localStorage 中，然后页面 onload 时，判断是否命中，命中的话读取，反之拉取数据。\
    这是真的，我大二的实践，当时还写了一个简单的版本管理... \
    唯一的性能就是 从磁盘与从网络 读取的速度不同了，但是由于 localStorage 最大 5 mb ，没办法继续。\
    然后我开始想办法 在用户进入我的首页时，就把其他页面的资源加载好，就比如我其中一个实践是：

    在用户进入 tomotoes.com 时，会加载一个display:none 的 blog 页面的 iframe，然后用户大概率会进入到博客，此时 博客的所有资源都是从 内存中加载的，超快。 \
    但是很明显，牺牲了首页的性能换来了其他页面的性能提升。 \
    然后，我就开始钻研起了 pwa-service-worker 的 缓存机制￼ \
    A: 这种像是prefetch啊 \
    是的，不过我的优先级很高，hh\~ 关于全站上 sw 这事我做了一周多，因为我的网站分为多个子站点，而每个站点的技术栈不同，打包的机制不同，想把所有站点全上 sw 缓存 就必须把所有打包机制全统一化，就比如 主页使用 gulp，博客使用 hexo，关于页 webpack 等等。 \
    其实 sw 缓存还有代理的功能\~ 配置项很多，玩法就很多
85. ![image-20210219231816728](/files/-MTuvXLao5DLWnDrUmIB)

    注意，module 文件 A 中 import 的其他文件（B，C） 加载机制是不同的。

    1. A 与 BC 是串行加载，只有 fetch A 之后 才能加载 B C
    2. B 与 C 是可以并行加载

    如果是手动加载 script，默认是 async 的方式 \
    <https://javascript.info/script-async-defer>
86. Windows 10X 上手体验 \
    <https://sspai.com/post/64991>

    好家伙，Windows 又新增了一种设计系统.. 之前的 WinXP，Win7 拟物，Win10 Fluent Design 还不嫌乱嘛..
87. 很好奇 TLS1.3 改进了什么算法，一次 RTT 即可握手成功。TLS 详解握手流程 <https://juejin.cn/post/6895624327896432654>

    摘要：TLS 三个版本的握手方式，你都了解吗？

    介绍了 RSA、DH、TLS1.3 握手流程，只是宏观层面...\
    The Transport Layer Security (TLS) Protocol Version 1.3 \
    <https://tools.ietf.org/html/rfc8446>

    找到了 TLS1.3 的 rfc，算了还是宏观了解下吧。
88. Question：抓包工具是 如何拦截记录 HTTPS 请求的呢？

    抓包工具实际上是作为 客户端与服务端的中间人。 \
    客户端以为是与服务端通信，实则是与抓包工具。 服务端以为是与客户端通信，实则是与抓包工具。

    服务端与抓包工具的通信 就是正常的通信。 \
    而客户端与抓包工具的通信 是在 用户已经在系统安装了抓包工具根证书的前提下的。

    当客户端与抓包工具通信时，验证抓包工具的证书，会以已经安装好的根证书去验证。自己验证自己是一定会通过的。 \
    所以说，当抓包工具不使用时，尽快把它的根证书下掉，万一黑化 很可怕的。
89. ![image-20210219231901578](/files/-MTuvUEvrtsvZI_kn_5B)

    A: hah 我今天早上 也刷到这张图了 \
    B: 这是一台已觉醒的服务器对后一台的温柔。。
90. Kotlin基金会成立 \
    <https://kotlinlang.org/docs/kotlin-foundation.html> \
    这两天 Kotlin, Rust 的基金会都成立了，好耶\~
91. 写一篇最好懂的HTTPS讲解 \
    <https://juejin.cn/post/6925296374628122632> \
    分享篇科普文，文中有一处错误，通过数据解密成功失败去认证权威性 显然是不对的，而是在使用公钥解密后拿到数据摘要，客户端本地在使用hash生成一份数据摘要，只有这两份摘要相同才认证成功。
92. 分享篇老文 \
    Tutorial - Write a Shell in C \
    <https://brennan.io/2015/01/16/write-a-shell-in-c/>

    之前使用 Golang 写过 一个简易的 Shell，原理很简单。

    文中介绍了下：Let’s look at a shell from the top down. A shell does three main things in its lifetime.

    Initialize: In this step, a typical shell would read and execute its configuration files. These change aspects of the shell’s behavior. Interpret: Next, the shell reads commands from stdin (which could be interactive, or a file) and executes them. Terminate: After its commands are executed, the shell executes any shutdown commands, frees up any memory, and terminates.
93. 好文分享：

    An Interactive Guide to CSS Transitions \
    <https://www.joshwcomeau.com/animation/css-transitions/>

    摘要：The world of web animations has become a sprawling jungle of tools and technologies. Libraries like GSAP and Framer Motion and React Spring have sprung up to help us add motion to the DOM.

    The most fundamental and critical piece, though, is the humble CSS transition. It's the first animation tool that most front-end devs learn, and it's a workhorse. Even the most grizzled, weathered animation veterans still reach for this tool often.

    文章很有价值，建议阅读。总结下自己从文章受益的点：

    1. 有的规则不能被子像素渲染，比如 margin，所以过渡时无论是 cpu 还是 gpu 渲染都需要 round to the nearest pixel, creating a stepped, janky effect.
    2. 过渡行为中定义的 transition 其实是在过渡行为结束后 才会起作用，这一点可以和之前分享过 chokcoco 你可能不知道的 transition 技巧与细节一文 联系在一起。 （可以在群记录中搜索 画板例子太秀了 关键词）
    3. Doom flicker，触发动画的元素 与 动画运动元素 一定要分清
    4. @media (prefers-reduced-motion: reduce) 可以使用此选择器禁用动画 关于最后一点，确实 动画太多，整个页面看起来较油腻，建议设计时 动画要小而精美。
94. 分享一个数据结构的基础知识：
    1. 树是图的联通无环类型
    2. 链表是树的非叶节点只有一个子节点类型
95. 词汇分享：

    plight /plaɪt/ 困境

    an unpleasant condition, especially a serious, sad, or difficult one:

    eg: the plight of the poor/homeless eg: Few of us can be unmoved by the plight of the refugees. 光被挡住了，就会陷入困境。
96. 提个观点，平衡二叉树（AVL）树 是二分搜索在存储结构设计上的体现。

    A: 在学红黑树，突然联想到的一个概念.. \
    B: 我之前面试的时候，让我手撕红黑树 \
    A: 之前X给我讲过 java hashmap 的底层设计。 hashmap 不可避免的问题是 hash 冲突，解决 hash 冲突的两种办法：开放寻址，链式解决。 \
    java hashmap 的设计是当相同地址，冲突的元素小于等于 8 时，是链表挂载；当大于 8 时会变成一根红黑树（当然概率很小）。 \
    所以说 hashmap 存取 都为 O(1) ，在 java 的 hashmap 某些场景中（冲突数大于 8）是不成立的。 \
    当然 O(1) 本身就是个伪命题，感兴趣可以延伸讨论下 之前我的观点（聊天记录搜索 大 O符号表示法） \
    C: 解决哈希冲突还可以在哈希￼ \
    推荐一个红黑树操作的可视化演示网址

    <https://www.cs.usfca.edu/~galles/visualization/RedBlack.html>
97. 文章分享： \
    如何基于心智模型打造更棒的用户体验 \
    <https://mp.weixin.qq.com/s/6-M3iyHQYHxYUNNWoUAx_Q>

    摘要：用户体验设计存在的一个主要原因，就是为了迎合人们的心智模型，从而帮助他们以尽可能最佳的体验去完成任务。

    那么关键的问题来了，如何将心智模型应用于 UI-UX 设计中呢？我们又要如何利用用户体验中的这种心理因素来构建更人性化的产品呢？
98. 快餐文分享：

    CSS现状和如何学习 \
    <https://mp.weixin.qq.com/s/ztU1tESHy-5kF2iFpZbgfw>

    hah 我曾经也写过 CHSS，文章实在太长了...

    摘要：CSS与其编程语言不同，她没有循环、逻辑和其他概念，它只是声明式的语言，因此，CSS很容易上手。也许正是因为如此，它才获得了简单的美誉。在 "不复杂 "的意义上，它是简单的，但这并不意味着它很容易。把 "简单 "误认为是 “容易”，只会让人心痛”。
99. 分享个很全面的 Vim Cheatsheet：<https://devhints.io/vim>
100. 每日一句分享： \
     如果把人看作一个machine，这个machine有输入有输出，最初这个machine只拥有时间维度，逐渐它拥有了技能维度，积累了金钱维度，把时间、技能与金钱看作它的输入端，那它输出端就是金钱、技能与影响力维度，其中金钱和技能在输入与输出间自循环，一般是正向的。 <https://twitter.com/madawei2699/status/1361562843372417026?s=20>
101. 安利下 三款命令行应用：

     1. exa - ls 的替代品，更强大 配置项众多 <https://github.com/ogham/exa>
     2. cheat - man 的替代品，所有文档由社区维护，也可自定义 <https://github.com/cheat/cheat>
     3. broot - file browser 在 Windows 上用了挺久了，非常强大。 <https://github.com/Canop/broot>

     一些其他的 autojump fzf ni bat git-extra gacp silver-searcher ...
102. 分享个项目：

     50projects50days \
     <https://github.com/bradtraversy/50projects50days>

     使用 CSS HTML JS 构建的 50 个小项目，代码质量可以、项目也都很不错，可以作为练手项目。 比如使用 React Hooks + TS 重写一些例子。 下面是我重写 ToDo App 的一个例子： <https://github.com/Tomotoes/50projects50days-react/blob/master/src/todo-list/index.tsx>
103. 好文分享：

     Exploring Node.js Internals \
     <https://www.smashingmagazine.com/2020/04/nodejs-internals/>

     文章介绍了 Nodejs 的内部构造 以及 调用 系统 API 时 底层是如何运行的，并在最后指出了IO操作时，JS 并非是单线程的。

     摘要：we will dig deeper into the Node.js runtime, understanding how it runs JavaScript, seeing whether it actually is single-threaded, and, finally, better understanding the interconnection between its core dependencies, V8 and libuv.

     文中指的 运行在虚拟机的语言 ，可简单列举下：

     1. JVM (java,scala,kotlin,groovy,Clojure...)
     2. CLR (C#)
     3. BEAM (erlang, elixir)

     我记得很久之前（大家在讨论 arguments 特性时） 我曾提过一点： 学习 JavaScript 最痛苦的地方就是，环境（Nodejs、浏览器）给你的 API，是无法直接查看源码的，它不像其他语言会有自建的 SDK，它的所有 API 都像是个带有规则的黑箱。 如果想查看源码，只能去翻看相应的 v8 构建。 \
     其实有的语言，比如 Go，Java 也是对一些 built-in 函数、关键字 有所黑箱，因为有的东西 确实无法自举... \
     实现的层级 不同没办法的。 \
     A: Python JS这些脚本语言算是跑在虚拟机上的吗

     JS 不是跑在虚拟机上的，它是一门解释编译语言，有对应的解释器与运行环境就可以了。 Python 也是如此的，是一门解释语言，不需要虚拟机。 \
     虚拟机最大的好处 就是可以使用虚拟机上面已有的生态，开发语言时也无需考虑后端（指编程语言）的设计。 \
     当然 跨平台 拿到现在就没什么亮点了。
104. 好文分享：

     随机数的故事 - 李银城的文章 - 知乎 \
     <https://zhuanlan.zhihu.com/p/205359984>

     文中涉及了一些知识，概况一下：

     1. v8 Math.random 是借助系统上的随机数能力实现的
     2. 系统上随机数 是不安全的，在大的数据量下会有特征
     3. 可以借助window\.crypto.getRandomValue实现更安全的随机
     4. 真随机的实现有多重多样，文中说的 根据系统运行时的噪音生成、大气噪音、量子随机等等
105. ![image-20210219232415472](/files/-MTuw0urKRxHIwCgMLMU)

     这买了血赚，才 20k
106. ![image-20210219232422769](/files/-MTuw3YhGWZkgsor7UPz)

     React 的正确打开方式
107. 每日一句分享： \
     线程的实现模型主要有3种：内核级线程模型、用户级线程模型和两级线程模型（也称混合型线程模型），它们之间最大的差异就在于用户级线程与内核级线程的对应关系。
108. 分享篇文章：

     平台与创新的悖论：Facebook头顶紧箍咒 \
     <https://www.huxiu.com/article/409688.html>
109. 分享篇文章(官方faq)：

     Why is esbuild fast? \
     <https://esbuild.github.io/faq/> \
     这篇文章 建议前端同学阅读，里面有涉及 JS 运行时的缺陷。
110. 词汇分享：

     typist\[ˈtaɪpɪst] \
     n.打字员
111. 分享道题目：

     重塑矩阵 \
     <https://leetcode-cn.com/problems/reshape-the-matrix/>

     感兴趣的同学可以刷一下。\
     &#x20;![image-20210219232507973](/files/-MTuwBSevvxTzXsAQFdQ) \
     分享下我的做法
112. 好文分享：

     JavaScript Promises: 9 Questions \
     <https://danlevy.net/javascript-promises-quiz/>

     My goal is to try a new ‘quiz tool’ I built for my blog, and get feedback on how well you learned from the excercise.

     除了第一个比较特例，剩下的都正确了，文章是以题目+讲解的形式 去学习 Promise 。
113. 分享个项目：

     apankrat/nullboard \
     <https://github.com/apankrat/nullboard> \
     Nullboard is a minimalist kanban board, focused on compactness and readability.

     53kb 的“单页面”看板应用，看了下源码 太强了..\
     该应用使用 jQuery 写的，假如是 React 的 会是什么形式呢？ 首先一定会分隔成多个组件，每个组件有多种状态... \
     这种 jQuery 一把梭 的方式看起来挺酷的.. 所以说 React 的组件化 与 状态驱动 思想 很利于工程化，在大中型项目中会感受到明显收益，而小型项目中引入（主要还是看场景）多少有点过渡设计的味道。 \
     好吧，这句话没什么价值。 因为项目大小 与 工程化 没有一个很好的鉴定。
114. Podcast 分享： \
     OCaml编程语言 - 张宏‪波‬ \
     <https://podcasts.apple.com/cn/podcast/ocaml%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80-%E5%BC%A0%E5%AE%8F%E6%B3%A2/id1098682510?i=1000396401474>
115. Tailwind CSS （可能）是名过其实的 \
     <https://juejin.cn/post/6930196913119576077> \
     分享篇文章，文中的观点很赞同：对于原子类的使用，一直有这样的痛点：当封装的粒度太小时，会显得异常繁琐，反之想自定制化时又经常不合适。
116. A: 感觉技术的发展有点像个圈子 新的东西也很容易找到以前的影子

     是啊，计算机领域多久没更新新的理论了，很多基础概念都是89十年代的那群大佬已经定下的了。 \
     就比如 redux 提倡的全局唯一状态不可修改，纯函数，都是来自 fp 的基础理论。 \
     今天我了解到了一个概念，编程范式会对GC有明显的影响。 \
     我想说的重点不是这句话，而是 我觉得很多基础设施决定了上层的发展，同时也限制了新的创新。 \
     举个例子，假如从一开始就不是冯诺依曼体系的计算机，而是细胞自动机或者其他体系，还会有并发原语，数据结构等这些概念的出现嘛。&#x20;
117. 今天还和一朋友讨论 css 的设计，不正交性，理论耦合过深。\
     我相信很多同学从一开始接触前端 都用过dreamweaver，它支持可视化搭建界面，就像 winform,android studio那样，为什么它没有继续流行起来？ \
     我相信在以后(现在 low code 平台已经成为了大厂绩效的风向标)，一定会再出现的。
118. 分享篇文章: Java 新特性解析：模式匹配 \
     <https://www.infoq.cn/article/1CB7jiLBmvU3Hbxw2ZO7>

     这怎么越来越 Scala 化了... 有趣


# 18-28

暂未分类

1. 分享篇文章: \
   DOM API 清单 \
   <https://github.com/anish000kumar/Javascript-DOM-API-cheatsheet>

   前端同学可以刷下，基础的crud都有涉及

2. 分享篇有趣的文章: \
   Answer to What do computer programmers, software engineers and developers just "get" that other people don't? by Izak Burger <https://www.quora.com/What-do-computer-programmers-software-engineers-and-developers-just-get-that-other-people-dont/answer/Izak-Burger?ch=99&share=cb33d505&srid=iVbmg>

   生活常识与领域知识，经验主义偶尔也会带来误解。

3. Answer to What is the most ingenious piece of code you’ve seen a junior developer write? by Timothy High <https://www.quora.com/What-is-the-most-ingenious-piece-of-code-you-ve-seen-a-junior-developer-write/answer/Timothy-High?ch=99&share=732e154d&srid=iVbmg>

   可以与之前讨论的主题(聊天记录搜索 如何将优化双分支的代码？)联系在一起..

4. 新的 Visual Viewport API，用于移动端检测键盘之外的窗口。

   <https://twitter.com/rikschennink/status/1361598959828037633?s=05>

5. <https://github.com/QuantlabFinancial/cpp_tip_of_the_week> \
   我想学c++的想法又一次被打消了..

6. 文章分享： \
   从17 个方面对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 等分布式消息队列 <https://www.zhihu.com/question/43557507/answer/370979636>

   A: 现在推荐学哪个好呢？ kafka 吗？

   B: 貌似RabbitMq和Kafka用的多

   成年人不做选择 吞吐量较低->Kafka or RabbitMq 吞吐量高-> Kafka

7. 每一位程序员都应该学习的优秀代码

   <https://mp.weixin.qq.com/s/Jmwp7O8ng-5WbkWYD8mdsQ>

8. 每日一句分享：\
   创造操作系统，就是去创造一个所有应用程序赖以运行的基础环境。从根本上来说，就是在制定规则：什么可以接受，什么可以做，什么不可以做。事实上，所有的程序都是在制定规则，只不过操作系统是在制定最根本的规则。

   摘抄自 Linus Torvalds 自传 Just for fun

   还有一句让我感同身受的话：

   在那个时候，只要一想到姑娘，Linux系统就变得不再重要了。在某种程度上，今天也还是这样。

   我突然发现，现在的 linux 这么庞大的体系 以及在此之上的各种基础设施 都是因为 托瓦茨在大二时 只是为了好玩（just for fun）发展起来的...

9. 文章分享：\
   如何写出无法维护的代码 \
   原文：<https://www.mindprod.com/jgloss/unmain.html> \
   皓叔版：<https://coolshell.cn/articles/4758.html>

   A: 我喜欢这句话：测试是懦夫行为。一个勇敢的程序员是根本不需要这一步的。太多的程序太害怕他们的老板，害怕失去工作，害怕用户抱怨，甚至被起诉。这种担心害怕直接影响了生产力。如果你对你的代码有强大的信心，那还要什么测试呢？真正的程序员是不需要测试自己的代码的。

   B: 确实，如果足够完美，测试就是浪费时间

10. 人物分享： \
    理查德·斯托曼 简称 rms ，1953年3月16日－，美国程序员，自由软件活动家。他发起自由软件运动，倡导软件用户能够对软件自由进行使用、学习、共享和修改，确保了这些软件被称作自由软件。斯托曼发起了GNU项目，并成立了自由软件基金会。他开发了GCC、GDB、GNU Emacs，同时编写了GNU通用公共许可协议。 <https://zh.wikipedia.org/wiki/%E7%90%86%E6%9F%A5%E5%BE%B7%C2%B7%E6%96%AF%E6%89%98%E6%9B%BC>

11. 皓叔的这篇文章也挺好玩的，我就知道会有打表\~ 编程真难啊 <https://coolshell.cn/articles/1391.html>

12. ideavim 昨天更新了一版，支持了 NERDTree plugin\~ 喜大普奔 <https://github.com/JetBrains/ideavim/blob/master/CHANGES.md>

13. 好文分享:

    张一鸣：大学四年收获及工作感悟 \
    <https://mp.weixin.qq.com/s/hlhbPO9HB9NFkP6_fD9WVw>

    优秀的人从不甘于平庸，不过一鸣开饭店的故事居然没有涉及￼

14. 分享道编程题： \
    <https://www.codewars.com/kata/5a6de0ec0136a1761d000093/train/java> 最有意思的是这道题背后的故事\
    <https://twitter.com/mxcl/status/608682016205344768>

    A: hah homebrew 开发者因为没写出 board code 被谷歌拒了的故事

    oteto/hiring-without-whiteboards - 20.3k

    <https://github.com/poteto/hiring-without-whiteboards> \
    Companies that don't have a broken hiring process

    B: 公司50%都在用你做的东西但是就是不收你

15. 图解 | 你管这破玩意叫计算机？

    <https://mp.weixin.qq.com/s/prJ767KGkhw3cc53BniNJg>

    数字电路科普分享，建议阅读。

16. 分享篇文章： \
    Zsh Tricks to Blow your Mind \
    <https://www.twilio.com/blog/zsh-tricks-to-blow-your-mind>

    原来 zsh 还有这么多便捷操作。

    文章受益总结下：

    1. take：mkdir {folder} && cd {folder} 的命令集合
    2. 历史命令 建议使用 zsh 的 history-substring-search 插件
    3. 搜索历史命令 在 iterm 上的快捷键是 ctrl r {twice}
    4. 键入 folder name，即可自动进入目录 文章其他的点 使用 vim-mode 更方便\~

17. IETF的全称是“互联网工程任务组”（Internet Engineering Task Force），主要目标是协调制定互联网标准。几乎所有重要的网络底层协议，都是由IETF制定的，比如TCP协议、IP协议、HTTP协议等。可以毫不夸张地说，没有IETF就没有互联网。

    IETF与其他权力机构没有不同：一些人高高在上，另一些人服从指挥。

    但是，IETF居然是网友自发组织，并且自我管理的！

    所有人都可以参与，都可以报名参加会议。只要加入邮件列表，你就可以把自己看作IETF成员。 这就是说，任何人都可以加入IETF，提出自己的互联网标准！ IETF的运行原则，也完全是民主平等的。 在IETF身上，充分体现了自由、开放、合作、共享的精神。这是互联网的核心价值。正是这样的机构，以及信奉这些价值的人，奠定了互联网的基础。

    摘抄自 阮一峰老师的IETF：互联网精神的典范 一文。

18. vim-easymotion 真是神器啊.. 比 Ace jumper 插件功能更全面 \
    <https://github.com/easymotion/vim-easymotion>

19. 分享个小众知识： \
    The Set constructor will still go through the .add method.

20. 国美能否再造国美？\
    <https://mp.weixin.qq.com/s/NMk8hRPNPjQV5WoKqUnzrQ> \
    全篇文章居然没有提他。还是很期待黄出狱后的动作。

    A: 出来了吗？

    出来有一阵了 可以说 错过了互联网的风口，他老婆没有啥成绩。

21. 词汇分享: \
    bachelor\[ˈbætʃələ] \
    n.单身汉；学士（学位）

22. 刚刚我看到一个故事: \
    Elasticsearch 的前身——Compass 则是在 2004 年，由年轻的 Shay Banon 为妻子学烹饪开发的。

    为了开发这款 App，Banon 认真比较了很多不同技术的优缺点。在他眼里，这款 App 的核心是一个搜索框。只要你在这个搜索框中输入一个概念、一个想法或者一种配料，它就可以开始搜索可能相关的烹饪知识。

    这与知识图谱的概念不谋而合啊。

    好吧，我的理解是 es 的重心在于业务上的那些特征，高可用，高并发。而知识图谱强调知识和相关性，与 nlp 脱不了关系。

23. A: 只看到了爱情的伟大\
    B: 我也 写过多个关于前女友的惊喜，不过都过去了。\
    爱情 在我看来，风险太高，投入太多。一旦失败 之前的投入相当于打水漂，血本无归.\
    不如把时间与精力花在自我提升上，这对追求全体女生都有效，而前者很显然存在单点问题。 当然我做不到。

24. <https://github.com/RealPeha/This-Repo-Has-452-Stars> \
    每点一颗星名字就会跟着改变

    A: 看样子是借助 github action 实现的hook吧。

25. 分享一个字节这边的前端面试题库 \
    <https://bitable.feishu.cn/app8Ok6k9qafpMkgyRbfgxeEnet?table=tblEnSV2PNAajtWE&view=vewJHSwJVd> \
    里面的资源很多，前端同学可以看一下，准备下春招了。

26. 双周分享汇总：

    2.7 - 2.17： \
    <https://thinking.tomotoes.com/archives/2021/2/7-17> 共分享条数 118 ，暂时未分类，肝不动了...

    2.1 - 2.6: \
    <https://thinking.tomotoes.com/archives/2021/2/1-6> 共分享条数 92

    我发现，分类中条目最多的是 “破梗”... 真实... <https://thinking.tomotoes.com/tags/joke>

27. Breaking: Mars becomes the second planet that has more computers running Linux than Windows.￼

28. 分享篇文章: \
    前缀树算法实现路由匹配原理解析 <https://shiniao.fun/posts/%E5%89%8D%E7%BC%80%E6%A0%91%E7%AE%97%E6%B3%95%E5%AE%9E%E7%8E%B0%E8%B7%AF%E7%94%B1%E5%8C%B9%E9%85%8D%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/>

29. 如何改掉晚睡强迫症? - 江命夏的回答 - 知乎 <https://www.zhihu.com/question/39556368/answer/102910826>

    A: 分享这个可以吗😂

    B: 当然没问题啊，就像我经常提的。 此群的定位并不是我一个人的频道，每位同学都可以分享 自己认为有价值的信息，并欢迎随时发起 理性话题讨论。

    如果有价值这个条件是一个人的主观判断，那么将不会有其他声音的出现，不利于社会价值观￼

30. 好文分享，文章很有深度。 \
    翻遍 2 万多条专利，看透苹果造车 \
    <https://mp.weixin.qq.com/s/wTOl5O1LqWP7O9uuIN_AtQ>

31. 词汇分享: \
    breeze\[briːz] n.微风，和风

    【记】联想记忆：和风（breeze）吹化了冰冻（freeze）的河流

32. 好文分享： \
    你不会真的以为，自己薅到了微信读书的羊毛吧？ \
    <https://www.huxiu.com/article/410147.html>

    摘要：如果说没有砍价就没有拼多多，那没有无限卡可能就没有今天的微信读书。 用户可以在薅羊毛的过程中感到获利，但资本绝对不会亏损。拉新、留存、促活、曝光、裂变、转化，我们在完成福利场任务的过程中早已被微信读书以各种方式套牢，不知不觉替运营团队完成了产品发展的任务。

    目前国内数字阅读行业的主要参与者分为四类：

    第一类为电信运营商，代表为中国移动的咪咕阅读、中国电信的天翼阅读和中国联通的沃阅读；

    第二类为互联网巨头，通过收购互联网文学网站获取内容、自研或收购阅读 APP 产品获得平台，并利用其自身的流量优势实现内容分发和流量变现，典型代表为腾讯旗下的阅文集团；

    第三类为独立运营的数字阅读企业，通过开发自有阅读平台、获取内容和用户流量，实现产品的平台价值，典型代表为掌阅科技、追书神器等；

    第四类为电商企业，通过传统纸质图书销售向数字化转型介入数字阅读行业，典型代表为京东阅读、当当阅读等。

    如果没有找到合适的商业化方式，任何产品都不会走太远。 举个例子，抖音之所以成为国民级应用，除了它的产品设计外，更重要的是 在早期就摸索到了适合自己的商业模式。

33. 快餐文分享： \
    Generic functions on slices with Go type parameters \
    <https://eli.thegreenplace.net/2021/generic-functions-on-slices-with-go-type-parameters/>

    Golang 泛型的介绍，涉及的点比较少。 这两天 Golang 发布了 1.16, 等到 1.18 就完全支持泛型了。

34. 快餐文分享： \
    Getting The Most Out Of Git \
    <https://www.smashingmagazine.com/2021/02/getting-the-most-out-of-git/>
    1. recover deleted commits 通过 git reflog，想怎么搞怎么搞。 git reflog 相等于对 git 操作 做了记录。
    2. clean up your commit history git rebase -i {commitID} 可以删除 无意义的 commit，合并重复的 commit 等。
    3. manage third-party code git submodule add {repo-url}
    4. staging selected part git add -p file 将文件的多次修改暂存起来，为了此次 commit 不涉及。

35. ![image-20210301223036505](/files/-MUiR9lOT80S8mjF4Q3e)

36. 快餐文分享： \
    18个月，黄光裕如何带国美重回巅峰？ \
    <https://www.36kr.com/p/1106544746892548>

37. <https://twitter.com/neilsardesai/status/1362890469970214917?s=19> \
    在 icon 上玩游戏，太秀了。 让我想起了之前 在 url 地址栏 玩贪吃蛇的项目。

38. 每日一句分享： 秦时明月(国产动画)存在的时间已经超过了秦朝。

39. 项目分享： \
    Python 0.9.1  - Py 0.9.1 源码\
    <https://github.com/smontanaro/python-0.9.1>&#x20;

    The Python source is copyrighted, but you can freely use and copy it as long as you don't change or remove the copyright

    A: 以这样的方式看到 python 的源码？。。有点不敢相信

    B: 嗯，包含解释器，一些py库，很有研究价值\~

40. 分享个可能不了解的事： \
    京东公司的成立(98.6月) 比腾讯 网易 新郎 搜狐 阿里都早。

41. 为什么我觉得 Java 的 IO 很复杂？ - 知乎 <https://www.zhihu.com/question/67535292/answer/1248887503> \
    分享篇关于 Java IO 很好的回答，可惜的是 流的概念只是一笔带过。 流是一个抽象的概念，小到电路中的比特流，大到flink为首的多节点流式计算。

42. A: Question: 怎么理解流这个概念的呢？

    B: 就是数据？

    A: 本质是数据，但是为什么会有这个概念呢？它想表达什么？

    B: 就是那种 通过管道 然后数据流？ 交换数据？

    A: 流是数据传输的一种形式。它的特征概念是为了操作服务的。想到了哪些特征呢？ \
    A: IO 流 与 IO 强调的并不是一种东西。一个是 数据传输方式，一个是 IO 模型，所以还是避免混淆。

43. A: 不如聊聊比特币  为什么一个虚拟的概念现在市值过万亿美金了呢？这是一个很有趣的问题。

    B: 收割韭菜 以前比特币不是洗钱用的么

    A: 韭菜也是人，为什么会被收割呢？ 洗钱的前提也是有人承认这个东西。

    C: 因为人类是喜欢制造概念并深信与此的动物

    A: 和我的想法 很相近。 合法化的信托机构，以及名人，主流机构的背书。再加上比特币的“合理”供求机制。

44. 科普文分享： \
    Linux 内核和 Windows 内核有什么区别？ <https://www.cnblogs.com/xiaolincoding/p/14419269.html>

45. 好文分享： \
    HTTPS知识点梳理 \
    <https://juejin.cn/post/6930446060846481416>

    文章干货很多，值得反复阅读。 \
    微信把掘金禁了可还行，真是典型的护墙河。

46. A: 不同的价值碰撞才可以有新的价值嘛w

    B: 是的，可闲聊不会碰撞出价值 只会污染 timeline. 所以说，需要约束 讨论，不然会跑偏的，价值就不存在了。 \
    A: 约束讨论是什么意思。。 个人觉得 无论什么话题只要挖掘的够深就是有所谓思考价值的 再严肃专业的话题 不去深入讨论 而是浅尝辄止 也就没有价值 \
    B: 不过 很久之前我就意识到 思考的价值 失败了，它做不到最初的立意。 \
    不管是否更换血液。 因为涉及到人的问题，是不能用理性去思考的。 \
    换句话说，人是不可控的。\
    我觉得是初衷 出了问题。 应该垂类到某一领域，比如计算机。 \
    并且人是需要审核的。 起码需要有贡献的意识。

    A: 是啊 只是思考的话 太笼统了 \
    B: 我需要思考下 此群存在的意义了，可能又是心中的一个乌托邦。

47. 每日一句分享： \
    机器学习可以看成是 在连续空间中的近似的逻辑编程。 而逻辑编程可以看成是 在离散空间中的精确的机器学习。

48. 百度贴吧里有哪些神贴？ - 一朵瓜子的回答 - 知乎 <https://www.zhihu.com/question/20011317/answer/1739615930>

    分享个故事，有关两三面的情愫，因为道德上的约束 主人公始终没敢迈出冲动的那一步，文章描写的很细腻。 \
    遇见其实已经很幸运了。

    要知道，人的一生中要走过很多个身影，也许对陈思萌来说，我只不过是在她生命中众多路人中的一个，无关感情痛痒。摘抄自文章。 \
    人总是要带着少许的遗憾过生活的。

49. “好内卷”与“坏内卷” \
    <https://mp.weixin.qq.com/s/MYBeSOOP5OBZ38zs98dpEQ>

    薛定谔则说“人活着就是在对抗熵增定律，生命以负熵为生”。 动物群落、人类社会的本质也是熵减 - 摘抄自文章。 \
    A: 如是这样讲，所以更要要去探索吧；没有问题发现问题，有困难要克服困难；觉得这篇文章是借着内卷来说明社会风气问题 我就粗略的看了一下 然后看完，个人认为哈；社会发展进程是没有良性结果的，看似很好的状态下，也是在可控范围内进行内部消化；语言确实很有意思 \
    B: 这篇文章涉及的宏观角度过大了，我看完是一知半解，想不到思考的点。 A: 所以我刚刚说是有略带影射，说社会风气；把思考范围缩小一点，写实一点 C: 刚在下班时间上卷赢我导师\
    D: 我这样想的，文章中定义的好和坏都是相对于大多数人的，以大多数人这个惯性系来讨论好内卷和坏内卷。apple公司总是做出我无法理解、接受的事情。但是这个团队也在改变着世界。相对于少部分人就要重新定义好内卷 \
    B: 赞同，一个概念的定义 是很难下定论的，文中的表达形式 是为了证明例子 有失偏颇。

50. 今晚定了毕业论文的题目: 基于微前端架构的低代码开发平台的设计与实现

    我简单说明下：

    1. 微前端是前端应用中资源的组合方式，类似于现在的微服务概念。
    2. 低代码开发 是 通过可视化配置界面的方式 去生成前端应用。

    有同学想一起讨论下嘛\~

    微前端为什么要和低代码开发平台结合呢？ 微前端主要是 负责 用户可以加载不同的业务组件库的。

    想了想 毕设还是改成了 基于微前端架构的绘图平台设计与实现。

    这个比 low code 平台 简单一些。只需要实现 画板 与 元素智能布局。 类似于 <https://app.diagrams.net/> \
    之前在墨刀实现的时候，做过一个类似的产品。

    关键点在于底层绘图引擎的选型。 draw\.io 也就是上面最知名的工具，使用的是 svg，绘图引擎有开源 06 年开发。 processon 国内最大的绘图平台使用的就是 刚提到的开源引擎。

    而现在 canvas 是一个更好的选择了。 \
    所以 问题来了，canvas 与 svg 的根本差异是什么，它们适于的场景是什么。

    A: 绘图平台和微前端的结合点是什么呀？ 感觉微前端和 low code 平台结合还是好说一些。\
    基本现在混合研发就是做这些事，产品里标准化的部分通过 low code 搭建，高度定制的东西 procode 实现，再用微前端结合在一起。最近我们基本都在这么搞，有一些内部的工程实践

    B: 在于 不同的汇图组件 可以根据用户的需求 模块化地加载。 比如，电路图 需要一些电子元件的图片组件，建筑图 需要对应的建筑标识组件。 \
    其实微前端有点强行了，我的目的是为了突出毕设的复杂性。\
    论文嘛，就是概念越多 越复杂越好😷 为了贴合 国内毕业生 强制产出论文的大环境\~ \
    魔幻的环境待久了，我就成为了魔幻的组成因子，才不管熵增熵减..

51. A: 美团一面有个面试题：在不同的设备尺寸下, rem 如何一致。 现在也没有找到一个很好的答案。 \
    B: media query 尺寸 设置对应的 font size 可以用 sass 的 循环来做 \
    A: hah 不对，我就这么回答的。对方提到 不同的设备分辨率 你如何保证呢？ B: dpr 能 media query嘛？ 然后我回答，使用 JavaScript 动态计算，然后没想到 分辨率 API 名字。 \
    C: dpr是啥（ \
    A: 像素比。 Device Pixel Ratio: Number of device pixels per CSS Pixel \
    A: 分享篇文章：

    完全理解px,dpr,dpi,dip <http://www.ayqy.net/blog/%E5%AE%8C%E5%85%A8%E7%90%86%E8%A7%A3px-dpr-dpi-dip/>

    更正一下: @media (-webkit-min-device-pixel-ratio: 2), (min-device-pixel-ratio: 2) {}

    原来媒体查询器是支持 dpr 的...

52. 好文分享：

    无代码/低代码 - 前端的中台 \
    <https://github.com/phodal/lowcode>

    文章出自黄峰达老师之手，讲解了低代码平台的意义，以及设计思路。

    文章很有深度，建议阅读。

    low code 的每一个基础设施 的实现难度都很高，并且 low code platform 的适用场景也很垂类。

53. A: 最近我接触到了一个 no code platform，勉强能用的阶段，我现在有点怀疑 我的毕设选题 是否超出预期了。

    B: 不是说是 kpi 驱动的嘛 \
    A: 是的，这些平台都是高杠杆，很利于衡量产出。 \
    B: 那 low code 的 roi 到底高不高啊

    A: ![image-20210301224502052](/files/-MUiRxisKEEHgfpc3rKc)

    去年阿里的活动页 有70%都是 low code 产出。

    A: 是的，话虽这么说。 其实是公司内部团队之间不愿意互相妥协，都想抓住高杠杆的结果。 \
    A: 对于 no code platform 我的设想是： 既可以快速可视化搭建页面，一键完成上线 预览 测试 部署 埋点，形成一个完美的闭环； 又可以像 figma 那样 支持高自定义地设计细节。 \
    B: 这个想法很宏大啊

54. A: 其实可以延伸讨论一下 公司个人发展的话题。

    我刚刚反复提到一个关键词，高杠杆。 如果在公司内部，一个人可以抓住一次 所谓 高杠杆 的机会，那么他大概率会成功的，

    B: 撬不动杠杆咋办 \
    A: 你不需要撬，你需要观察别人的杠杆是怎么搭建的。

    就好比，在 Google 内部，一个写 Go library 的开发者 与 一个借助 Go 写service 的开发者，他们的产出 是没有可比性的。 这无关 他们的素质，技术水平，教育背景。 \
    如今公司内部，开个周会，几乎每一个团队都有两三个平台，这其实能体现出很多东西。 \
    B: 写lib的会更高吗 \
    A: 不在于高，在于影响。 而影响高 带来的价值是无法衡量的。 \
    A: 杠杆 也往往和所在的团队 有很大的关系。 \
    C: 做业务，比较容易有产出吧, 搞基建的话，如果基建发展的比较完善了，那想产出不也就比较难了吗 \
    A: 基建不会发展完善的，新概念只会不停地出现。

55. 快餐文分享：

    Concurrency with Go Lang \
    <https://mithun-17.medium.com/concurrency-with-go-lang-7129571a68fb>

    文章很简单，都是些基础概念，对 goruntine 感兴趣的同学可以读一下。

56. 好文分享：

    Getting Started with Three.js \
    <https://js.plainenglish.io/a-simple-introduction-to-threejs-9b060c1bb6e7>

    文章介绍了 3D 渲染的基本概念，从 OpenGL 到 WebGL 再到之上的 Three.js，并由此 作者写了个小Demo，一步步由浅入深地带你了解 Three.js 中的基本概念。

    在我看来，Three.js 最令人称赞的地方 在于它对 WebGL 的概念抽象 重新建模。GUI 渲染引擎，3D 渲染引擎，游戏渲染引擎... 计算机图形学是一个很广的学科，有太多黑魔法值得挖掘了

    A: 图形学 强烈推荐 games101 这门课 b站搜索就有 还有何渊鸣的 games201 B: 贴下链接：

    1. GAMES101-现代计算机图形学入门-闫令琪 <https://www.bilibili.com/video/BV1X7411F744?from=search&seid=12880289156025443052>
    2. GAMES201：高级物理引擎实战指南2020 <https://www.bilibili.com/video/BV1ZK411H7Hc?from=search&seid=10863851673950129238>

57. ![image-20210301225056212](/files/-MUiSJOwkG1AdKXJDYrs)

58. 快餐文分享：

    Functional Domain Modeling in Kotlin \
    <https://www.47deg.com/blog/functional-domain-modeling/#functional-domain-modeling-in-kotlin-0>

    文章简述了 关于类型建模时的一些最佳实践（模式匹配真的好香..

59. 科普文分享：

    WebRTC for beginners; How it all works from the outside! \
    <https://itnext.io/webrtc-for-beginners-how-it-all-works-from-the-outside-3c806f582229>

    文章简述了 WebRTC 背后的基础协议 以及基本的运行原理。

60. A: 有什么背单词软件推荐吗？ \
    B: 高中的时候 本子和笔。。 \
    C: 之前用墨墨背单词，坚持了两年多，加扇贝阅读打卡。 现在用微信读书，每天有空看单词书。

61. 快餐文分享：

    Golang WaitGroup 原理深度剖析 \
    <https://mp.weixin.qq.com/s/CkSd2aldYaoLbd-IKhkpWg>

    这性能压榨得太可怕了... 不愧是官方库...

62. 分享下 Kotlin 的一个片段：

    ```
    import kotlin.browser.window
    ​
    fun onLoad() {
        window.document.body!!.innerHTML += "<br/>Hello, Kotlin!"
    }
    ```

    Kotlin 面向 Web，Android，IOS，Server，everywhere...

63. 漫画 | 打死我也不搞负载均衡了！ \
    <https://mp.weixin.qq.com/s/aWHKEpwATfTEu-yPC3ogzg>

64. ![image-20210301225314786](/files/-MUiSNtsONxKarKzxAnz)

65. 词汇分享: \
    sin\[sɪn] \
    n.罪，罪恶 vi.犯罪

66. 好文分享，图模型的概念，使用场景，以及一些概念。 \
    娓娓道来图模型、图查询、图计算和图学习知识 \
    <https://mp.weixin.qq.com/s/mPebHfCm8_Sb-miI87zzLg>

67. 分享篇文章: \
    Go is not an easy language \
    <https://www.arp242.net/go-easy.html>

    Go 是一门非常容易上手的语言，但它的学习成本 一点也不简单。 \
    文章说的有理有据，简约的抽象从来不会降低复杂性，只是把复杂性转移到了其他地方。 \
    当你充分理解抽象背后的概念时，比如 Goruntine,channel，你就会惊叹设计的优美。

68. 分享个有趣的项目： \
    qeeqbox/social-analyzer \
    <https://github.com/qeeqbox/social-analyzer>

    finding a person's profile across 350+ social media websites.\
    简单来说是爬虫项目，爬多个社区网站，聚合信息。 在我看来，这个项目其实存在着一些价值，拿到信息后 完全可以分析出一个人的具体画像。 \
    而用户画像的价值是很大的，完全可以转换成相应的商业价值。\
    上面提到的行为 属于 数据挖掘领域。 一般企业的这种行为是见不得光的。

69. 分享篇文章： \
    草根前端人的焦虑 \
    <https://www.notion.so/b92c170778554d258409d7b6b2de4095>

    摘要：Vite、ESBuild、SWC、TailWind、Snowpack、Vue3.0、Recoil、Deno、Lowcode... 不管是前端领域、还是技术领域、还是娱乐圈、每年都有涌现出一大堆的新玩意、每年都有新的鲜肉火了。

    文中讲解 个人成长的观点，我挺赞同的。

    1. 不要给自己设置边界。
    2. 技术深度和广度是需要不断学习和累积。

70. ![image-20210301225455327](/files/-MUiS_w_3yTo5bruJaT-)

71. ![image-20210301225505955](/files/-MUiSdCIqisbPvweM0mx)

72. A: 地铁上可以做什么有人推荐吗 \
    B: 听播客，看单词书，或者发呆。 \
    A: 我去搜索有什么好的播客！ \
    B: 地铁其实很适合发呆的，或者观察人 也挺好玩的。 \
    A: 人有什么好观察的啊 \
    B: 对啊，观察一个人 是做什么的，和同伴沟通什么。 每个人都是一本书的，可以与你想象力结合～

73. 分享篇文章: \
    Style Spelling and Grammar Errors with the ::spelling-error and ::grammar-error pseudo-elements

    <https://www.bram.us/2021/02/21/the-future-of-css-style-spelling-and-grammar-errors-with-pseudo-elements/>

74. 每日一句分享：

    You can't connect the dots looking forward, you can only connect them looking backward. So you have to trust that the dots will somehow connect in your future.

    来自 05 年 斯坦福的一次演讲。 \
    <https://www.youtube.com/watch?v=UF8uR6Z6KLc&feature=youtu.be&ab_channel=Stanford>

75. ![image-20210301223740634](/files/-MUiSm-B3EtvX1Peu4ZI)

    惊讶系列分享。使用 proxy 定义了一种内部 DSL，这种表达力太强了。

76. A: 整的跟抖音一样 \
    B: 短视频 从创新层面来上说，对中国意义很大，这是我目前知道的 唯一一个国内创新概念风靡全球的产品原型。 \
    像美团，淘宝，滴滴，即时通讯软件，少儿编程，知乎，都是抄袭国外概念 再利用国内的\*\*机制 做大的。

    A: 是创新 新型精神鸦片

    B: 思考的层面小了 - 并且这句话不太好，有点引战.. \
    C: 短视频确实是成功的，而且像这类受众群体非常广泛的产品确实不多见 \
    B: 而微信小程序，web app 导流 更是国内拿得出手的创新，简直是魔幻的代表。 \
    B: 可以聊聊抖音的产品设计。它的成功与其设计 有莫大的关系。 \
    D: 靠算法推荐？ \
    B: 全屏展现，划一下即可导向下一个视频。 数据系统强大，随着用户的增多，使用量增多，完全形成了正向循环的视频推荐。 \
    C: 一屏只展示一个视频，这就是很创新的一个设计了，而且交互基本都是很简单的 \
    B: 是的，网站越简单的设计越高级，符合用户的心智模型。 \
    E: 之前听说抖音是介乎于实时和非实时的社交，实时，非实时指获取信息的方式，而且现在我发现老人用户里关注的大部分是熟人 \
    F: 快手太low \
    B: 哎，快手现在也没摆脱这个形象.. 它一直很努力的，然而 基础形象定下来，后面再做其他行为补救 也无济于事。 这像极了爱情。 \
    F: 抖音短视频 也是抓住了当前人们的碎片化时间吧

77. A: 我小时候爱看 老梁 爱听单田芳 现在喜欢打游戏 街拍 但是还没下载过抖音快手 是因为怕沉迷 其实真的没必要感觉你和谁不一样就感觉自己格格不入 我就不在乎他们怎么看我 我也不反对任何事 南方总有一句话 什么东快傻 觉得低俗 但是什么都不能千篇一律 每个人人格都是独立的 自己都有自己选择什么的爱好和权利 雅俗哪有那么多界限 他怎么选择 你不去批判 才是尊重 人人价值观都一样 人不会繁荣 早灭绝了 你自己定位自己 做什么人 就别后悔 又没触犯道德 法律 伦理 没影响到别人 小时候爱玩贴吧 天涯 就是因为有一群相同价值观的人 可以一起玩梗 秒懂什么的 就像现在群里 冲浪交流思想 虽隔千里 却似近语 这个裙对我的意思就很大 虽然看不太懂学术上我的东西 但是起码让我思考了 \
    B: 赞同，每个人的认知成本 生活环境 都是不一样的。

    价值的本身也很难定义。 \
    对于一个事物，每个人都会有不同的看法，从不同的层面思考，差异是一定存在的。

    但存在差异并不是坏事，往往越优秀的组织 差异才会越大，顶层与底层的观点。相反平庸或者和睦的团队 差异小的多，要么是认知水平相似，要么是所有人都持有一种声音。

78. 分享篇文章：

    我在小米做爆品 \
    <https://mubu.com/doc/qymyWavX_4>

    文章提到了一点：爆品需要自然流量，可以延伸谈谈。

    自然流量就是用户自主寻找商品带来的流量，一个是搜索，搜索对应有一个搜索指数，包括百度指数，还包括天猫，京东拼多多的电商指数，头条指数，微信指数

    搜索指数 是一个很具有商业价值的数据，在信息快速发展的时代，拿到某一宏观指数，就好比拿到了大多数用户的导向。 相信大家 都知道 微信公众号的信息循环一直是一个闭环，它不允许搜索爬虫爬取，所有的信息流量 都尽量导向自身，先不谈互联网精神，就谈谈微信公众号 产生的商业价值。

    事实上，微信文章只支持一个搜索引擎 那就是搜狗（去年已被腾讯收购），搜狗为了得到数据源，每年需要支付上亿；并且 一些灰产早就盯上了 微信文章这一封闭的数据源，现在有很多接口平台，按每次爬取收费，假设一次爬取 1 毛，如果想到达实时爬取这其中的利润是巨大的。

    实时爬取是为了更好得分析，得到更全面的数据，你可能不理解，为什么会有这个需求？这和今天中午提到的数据挖掘是一个领域。

    刚刚在讨论 抖音快手，但重点一直没有扯到商业化上面，我是简单说一下，希望思考时 层面可以大一点，不要局限场景。

    抖音的商业化 毫无疑问最核心的就是广告了，而广告就是靠浏览量赚钱。 在早期 第二年的时候抖音就已经摸索出了自己的商业化并且迅速形成了一个正向循环，这里用一鸣对抖音的定位来概括：我们是把移动应用与人工智能相结合，打造出\*\*\*应用。

    在刷抖音时，可能会觉得除了偶尔的广告并没有什么，没有损失什么，但其实你已经成为了一个神经元，推荐算法中的神经网络的组成因子，这会让你越来越沉浸，换句话讲 你为自己的数据流赋能。 当你打开各种权限时，参加各种活动时，你实际上是在推进运营任务的各项指标。 当有类似春节的这种活动时，日活可以轻松破千亿。

    这带来的商业价值 不可想象，它给了字节充足的粮草去开张阔土。

79. 快餐文分享：

    Switching from Rust to TypeScript (and vice versa) \
    <https://blog.logrocket.com/switching-from-rust-to-typescript-and-vice-versa/>

    摘要：we’ll show you how to transition from writing apps in Rust to TypeScript and vice versa. We’ll explore how these languages are similar, how they differ, and common challenges associated with each. We’ll then discuss the benefits of adopting TypeScript in Rust as well as best practices for how to do so.

    今天中午准备详细讨论下 文中涉及的一些点。 主题有：错误处理，类型检查，模式匹配，scope ...

    文章第一个主题是有关包管理，可以简单枚举一下 各大语言的包管理机制：

    1. Java，Kotlin 等（JVM 平台语言） - Maven、Gradle 非官方
    2. C# - NuGet 官方
    3. Haskell - Cabal 官方
    4. C++ - Conan （代表，C++ 的实在太多了）
    5. JavaScript - NPM 号称世界上 package 数量最多的生态，懂得都懂..
    6. Rust - cargo 官方
    7. Ruby - RubyGem 官方
    8. Golang - GoModule 官方
    9. Python - pip 官方，Conda 非官方 暂补充...补充一下，Vim - vim-plug，Vundle 等。

    A: 什么 cpp居然有包管理器 \
    B: CPP 很多的\~ \
    A: 很多说明没有统一 可以讨论下 统一性技术（完全由一个机构决定） 与 非统一性技术 的发展利弊。\
    统一性技术的代表 毫无疑问是 微软 苹果 为代表的。 微软的 .net 生态，苹果所有终端应用的生态闭环。

    非统一性技术的代表 就是 Web，目前没有任何一家公司 资本可以统一 Web 技术的发展。 这也是现在 Web 技术混乱，动不动娱乐圈的一原因。 \
    当然 Google 也有很多 统一性的技术，但开源做得好（偶尔独裁），就不谈了。 \
    而每一项技术也是一种资源，并且还是不会涉及到商业垄断的资源。

    \
    文章的第二个主题是有关类型检查，可以延伸谈一下强类型与弱类型 在工程实践中的作用。 \
    强类型 与 弱类型主题有点小，扯的话绕不开 防御性编程，编程规范，不如谈谈类型系统。 \
    先抛出个问题，编程的本质是什么？ \
    在我看来，编程的本质就是 运算推导结果的过程。 \
    而类型系统的意义就在于 它为推导的过程添加约束，白话讲是决定了一个 symbol 的可取值范围。

    \
    第三章节是有关错误检查，这点之前讨论过一次了。 \
    错误处理没有银弹可言，不管是 Go 的多返回值，还是使用 union type 封装，或者在函数签名中 mark exception，都不是一个很优雅的方式。\
    归根结底在于 运行时的异常 是无法检查出来。 \
    像一些编译时的异常 可以用过一些语法糖来避免，就比如 kotlin 中的!! assert，java9 提供的 option，以及 js 的 ?. \
    A: 什么叫编译时的异常呢 你说的这些是为了解决空指针异常把

    编译时，解释器 会在最初的运行时进行 基本推导，你说的空指针异常 是存在于编译时与运行时的，我上面抛出的信息没有加场景。

80. 分享篇文章：

    “I WILL SLAUGHTER YOU” \
    <https://daniel.haxx.se/blog/2021/02/19/i-will-slaughter-you/>

    curl 作者收到死亡威胁邮件。 故事太离奇了，对方因为 使用 curl 失去了家庭、6 年工作、国家..

    <https://news.ycombinator.com/item?id=26192025> 相关 hn 上的讨论

    I'm not a psychiatrist, but it seems that this person has some severe psychotic disorder. The whole thing reads like a cheap knockoff of "A Beautiful Mind".

    摘抄自一条评论。 显然他可没有纳什那么有成就。

81. 卡颂的财富增长实践 \
    <https://mp.weixin.qq.com/s/PUBD9NGTbiHW-ziDPVOsJQ>

82. A: 云真机平台(可在 web 端实时操作手机 的技术)，有同学了解吗.. \
    刚刚想了下 应该是基于 webrtc 做了视频流推送，然后在phone shell 上捕获动作，发送到 手机端，手机端 收到信号 再做相应的处理。 \
    想完成 实时操作，每一环节都很难. \
    B: 我只略懂安卓的投屏和控制呀 web实时操作手机，ws-scrcpy做的不就是这个事吗

    主要两个线程。一个建立adb forward sockect链接，传输手机画面视频流到PC，然后可以用各种前端技术把视频流显示到web上。第二个线程捕获web上的键鼠事件，转化成手机的事件，传输并注入到手机中完成实时控制

    <移动测试开发Scrcpy 工具码流格式化 >\
    <https://testerhome.com/articles/19417?order_by=like> \
    这个文章探讨的就是上面说的第一个线程，也就是投屏。第二个线程实时控制可以参考安卓系统层提供的设备控制接口文档 \
    A: 受教了，这里面的技术细节 确实挺多的。 电脑控制手机 以及手机响应这个比较清楚。 手机实时投屏 文章介绍的两种机制 为我解惑了。

83. 分享个概念： 破窗效应 - <https://zh.wikipedia.org/wiki/%E7%A0%B4%E7%AA%97%E6%95%88%E5%BA%94> \
    以一幢有少许破窗的建筑为例，如果那些窗没修理好，可能将会有破坏者破坏更多的窗户。最终他们甚至会闯入建筑内，如果发现无人居住，也许就在那里占领、定居或者纵火。 又或想像一条人行道有些许纸屑，如果无人清理，不久后就会有更多垃圾，最终人们会视为理所当然地将垃圾顺手丢弃在地上。因此破窗理论强调着力打击轻微罪行有助减少更严重罪案，应该以零容忍的态度面对罪案。

84. 词汇分享: \
    bud\[bʌd] \
    a small part of a plant, that develops into a flower or leaf \
    n.芽，花苞 vi.发芽，萌芽

85. 【第2206期】奇怪的知识——位掩码 \
    <https://mp.weixin.qq.com/s/zT4dZPYN3vYMRABWkH5SFQ> \
    分享篇科普文章，简述了位运算的一些基础概念与实践。

86. ![image-20210301225933279](/files/-MUiTZMvYC4oFY3oAwLi)

87. 每日一句分享： \
    无常，宇宙中唯一的常量。

    上面的话 来源于 雪莱的诗《Mutability》 人世的明日绝不会雷同于今朝，万古不变的，唯独只有无常。

88. Why build concurrency on the ideas of CSP?

    Concurrency and multi-threaded programming have over time developed a reputation for difficulty. We believe this is due partly to complex designs such as pthreads and partly to overemphasis on low-level details such as mutexes, condition variables, and memory barriers. Higher-level interfaces enable much simpler code, even if there are still mutexes and such under the covers.

    One of the most successful models for providing high-level linguistic support for concurrency comes from Hoare's Communicating Sequential Processes, or CSP. Occam and Erlang are two well known languages that stem from CSP. Go's concurrency primitives derive from a different part of the family tree whose main contribution is the powerful notion of channels as first class objects. Experience with several earlier languages has shown that the CSP model fits well into a procedural language framework.

    摘抄自官方 FAQ - <https://golang.org/doc/faq> \
    官方 FAQ 有很多有价值的信息，建议花时间翻翻看，我非常欣赏它的设计原则。

89. 快餐文分享:

    面试官：前端跨页面通信，你知道哪些方法？ \
    <https://juejin.cn/post/6844903811232825357>

    对于同源页面，常见的方式包括：

    广播模式：Broadcast Channe / Service Worker / LocalStorage + StorageEvent

    共享存储模式：Shared Worker / IndexedDB / cookie

    口口相传模式：window\.open + window\.opener

    基于服务端：Websocket / Comet / SSE 等

    而对于非同源页面，则可以通过嵌入同源 iframe 作为“桥”，将非同源页面通信转换为同源页面通信。

90. 分享篇文章: \
    Java Threads: Are They Memory Efficient? \
    <https://dzone.com/articles/java-threads-may-not-be-memory-efficient>

    摘要: This study clearly indicates that memory is allocated to threads at the time of creation, and memory is not allocated based on the thread’s runtime demand.

    Java 线程占用内存居然是预分配一个数值的，这与前几天分享的 Go waitgroup 源码解析文章 中 为了减少内存对齐做的优化，给我的触动真是截然不同。

91. ![image-20210301230844322](/files/-MUiThbpLrpKxek_3caD)

    提问的艺术

92. 分享个概念: \
    函数染色: Dan 用这个术语来形象的描述这一现象：一旦一串函数调用里有一个需要加 async，则其所有祖先函数都得被迫加 async。 \
    <https://overreacted.io/algebraic-effects-for-the-rest-of-us/#a-function-has-no-color>

93. 朝夕光年，字节跳动的游戏梦 \
    <https://mp.weixin.qq.com/s/T7BZlX68md1_OC-dSGRHHw> \
    分享篇文章，讲解了字节在游戏领域的动作以及 与国内游戏巨头难以跨越的鸿沟。

94. 快餐文分享: \
    Web Vitals Explained \
    <https://dev.to/laurieontech/web-vitals-explained-114j>

    CLS FID LCP FCP 你知道指的是什么性能指标吗？

95. 分享个有趣的帖子: \
    王伟在公司厕所，带薪拉屎 \
    <https://www.v2ex.com/t/755667>

96. 刚刚了解到了 一个工作法(偏概念):

    在定义 todo list 的同时，建议也写一份 not-todo list，意义是不要让低优先级的事情干扰高优先级的事情。

97. HTML tip: Use the `start` attribute to change the starting point for your ordered lists.

98. 快餐文分享：

    \[译]只使用 CSS 进行用户追踪 \
    <https://mp.weixin.qq.com/s/Xxs1sG7CrbSR1uV8r0gm4g>

    * 通过字体加载 判断 系统信息
    * 通过媒体查询器找到设备信息
    * 通过 hover active 伪类追踪用户行为

99. ![image-20210301230955636](/files/-MUiTqHLJJvmPqYec_6J)

100. 网络 IO 演变发展过程和模型介绍 \
     <https://mp.weixin.qq.com/s/EDzFOo3gcivOe_RgipkTkQ>\
     快餐文分享，文章讲解网络IO比较详细，建议阅读。 \
     如果在衍生下 epoll 的诞生背景 c10k 问题，就更好了。

     摘要:两台计算机而言，要进行网络通信，其数据都是先从应用程序传递到传输层(TCP/UDP)到达内核态，然后再到网络层、数据链路层、物理层，接着数据传递到硬件网卡，最后通过网络传输介质传递到对端机器的网卡，然后再一步一步数据从网卡传递到内核态，最后再拷贝到用户态。

101. 开发者怎样才能写出好的 API？ \
     <https://www.infoq.cn/article/rk4gcSYZiYGctrYlTwZI> \
     可以的，API 不应该限定实现 主题的最佳实践就是 路由加版本了。

102. TypeScript 4.2 正式发布：更智能的类型别名保留，声明缺失的帮助函数，还有许多破坏性更新 \
     <https://mp.weixin.qq.com/s/Dps5LCx5NClq5eB6Xf2jgw>

103. JavaScript 到底是哪个国家发明的？Brendan Eich 生于靠近移民大熔炉纽约的宾州，Eich 又是个德裔姓氏，说明他祖籍显然来自欧洲。而欧洲又有被元太祖成吉思汗征服的历史，基于蝴蝶效应、命运石之门理论与混沌经济学等诺奖级研究，如果成吉思汗没有征服欧洲，Brendan 的祖先就不会移民美国，自然也就不会有 JS。由于元朝是中国的朝代，所以铁木真作为中国的民族英雄，没有他就没有美国的 JavaScript。 所以，JavaScript 表面上是美国发明的，但本质上还是中国的！ \
     Doodle 昨天的一则想法，hh 挺好玩的。 \
     这种含沙射影的阴阳文学，最近很火喔..

104. 分享个新了解到的概念 - 混沌工程

     混沌工程：混沌工程，是一种提高技术架构弹性能力的复杂技术手段。Chaos工程经过实验可以确保系统的可用性。混沌工程旨在将故障扼杀在襁褓之中，也就是在故障造成中断之前将它们识别出来。通过主动制造故障，测试系统在各种压力下的行为，识别并修复故障问题，避免造成严重后果。 它也可以视为流感疫苗，故意将有害物质注入体内以防止未来疾病，这似乎很疯狂，但这种方法也适用于分布式云系统。混沌工程会将故障注入系统以测试系统对其的响应。这使公司能够为宕机做准备，并在宕机发生之前将其影响降至最低。 如何知道系统是否处于稳定状态呢？通常，团队可以通过单元测试、集成测试和性能测试等手段进行验证。但是，无论这些测试写的多好，我们认为都远远不够，因为错误可以在任何时间发生，尤其是对分布式系统而言，此时就需要引入混沌工程（Chaos Engineering）。 混沌工程、故障注入和故障测试在关注点和工具中都有很大的重叠。

     混沌工程 相关主题：链路压测、故障测试、监控报警、熔断降低。 都是为了保证系统的 stability。

105. 快餐文分享：

     \[译] 精通 Intersection Observer API \
     <https://juejin.cn/post/6844904034193637389>

     Intersection Observer 不会阻塞主线程，并且还支持 threshold rootMargin 选项，回调函数中 intersectionRatio 可以实时拿到当前的交集所占的比率。

106. 分享篇文章： \
     Web实时语音/视频聊天/文件传输 \
     <https://juejin.cn/post/6844903993307561991>

     想通过 WebRTC 连接 实现 实时的语言 视频信息传输，还需要特定的STUN服务器（穿破NAT）... \
     文章写得很有条理 有关 webrtc 的基本介绍，以及现代浏览器如何获取到 视频音频数据。

107. 分享个 WebRTC 与 Websocket 异同的分析： \
     WebRTC is designed for high-performance, high quality communication of video, audio and arbitrary data. In other words, for apps exactly like what you describe.

     WebRTC apps need a service via which they can exchange network and media metadata, a process known as signaling. However, once signaling has taken place, video/audio/data is streamed directly between clients, avoiding the performance cost of streaming via an intermediary server.

     WebSocket on the other hand is designed for bi-directional communication between client and server. It is possible to stream audio and video over WebSocket (see here for example), but the technology and APIs are not inherently designed for efficient, robust streaming in the way that WebRTC is.

     As other replies have said, WebSocket can be used for signaling.

     <https://stackoverflow.com/questions/18799364/webrtc-vs-websockets-if-webrtc-can-do-video-audio-and-data-why-do-i-need-web>

108. 一个介绍 WebRTC 更详细的文章：\
     <https://bloggeek.me/what-is-webrtc/>

109. 分享篇文章： \
     Clubhouse被曝幕后服务商：深度揭秘声网为何能先发一步找到爆款？ \
     <https://www.36kr.com/p/1084968817132552> \
     为什么国内的 paas 厂商在国内没打出名声呢..

110. 好文分享： \
     前端优秀实践不完全指南 \
     <https://juejin.cn/post/6932647134944886797>

     文章出自 chokcoco 老师之手，不用我多说了吧.. \
     前端开发时 很重要的一环 就是 体验，该如何保障体验呢？上文给了很好的实践指南，建议阅读。\
     总结一下之前没有注意过的点：

     1. object-fit 指定可替换元素如何适应父元素的尺寸
     2. object-position 指定可替换元素在父元素的显示位置
     3. sroll-snap-type 指定滚动时 临界点的行为
     4. user-select: all 点击选中当前元素中的内容
     5. 使用 button 打开链接时，是不支持鼠标右键打开页面的，应该杜绝这种行为
     6. 设计时要防范 色彩对比度 过低
     7. 遵守无障碍设计

111. 分享个知识：埋怨的拼音是 man yuan...

112. 每日一句分享： \
     理性的调节性是引导经验去追求无限，追求绝对，但是永远也达不到。达不到也有作用 — 它使得经验科学不断的前进，并且有了明确的目的和方向…

     摘抄自 德国哲学家康德《纯粹理性批判》 一书。 \
     让我想起了，我之前批判编程语言设计时，不应该映射操作系统、编译器的概念 的行为。

     更详细的 可以看这篇 我写的文章： \
     漫谈编程语言 - <https://tomotoes.com/blog/talking-about-programming-language/> \
     果然哲学是其他学科的奠基... 可以在更深的层级解释 各种行为\现象...

113. 每日一句分享: 如果你只看大众媒体和算法推荐给你的文章，你最终将罹患智力糖尿病。

     摘抄自阮一峰老师的科技周刊。

     有一个名词叫信息茧房，说的也是这种现象。 \
     信息茧房是指人们关注的信息领域会习惯性地被自己的兴趣所引导，从而将自己的生活桎梏于像蚕茧一般的“茧房”中的现象。 \
     A: 那怎么破解呢？ \
     B: 建立二向思维（在保有自我倾向性思维时，通过大量浏览汲取与自我倾向性不同或对立的信息，）

114. 我突然有个疑问，刚刚看一个文档的伪代码有感... \
     如何 在 ts 中定义 float 类型？

     是不是做不到呢..

     ```
     type float = `{number}.{number}` ？？
     ​
     最终: type FloatCast<T extends `${number}.${number}`> =  Count<ToString<T>, '.'> extends 1 ? Float : String
     ```

     这种类型无法限制，1.-1.1，1.0.1 都是合理的

     我想了想，因为 ts 不提供 define basic 的能力，可以把 Float 定义一个 unique type，再借助 多个 type func 来约束。 `type FloatCast<T> = Count<ToString<T>, '.'> extends 1 ? Float : Number`

115. 分享篇文章： \
     揭开在线协作的神秘面纱 – OT 算法 \
     <http://www.alloyteam.com/2019/07/13659/>

     摘要：相信大家或多或少都有使用过在线文档，国内的像我们在做的腾讯文档还有其他家的很多类似产品。今天主要为大家揭开在线协作的神秘面纱，那就是 OT 算法。

116. 协作开发后，最有趣的一点是 之前 eslintrc 只有 3 条rule，我接入后 直接干到 18 条

117. 春招开始了，大家把握住啊。 \
     心态要保持住，对自己预期要超出，多看牛客 多刷题，经典面试题或者技术概念，不要只限于学，要多用自己的语言去表达，把它变成自己的，积累多了 offer 就多了。

118. 好文分享： \
     你不好奇 CPU 是如何执行任务的？ \
     <https://mp.weixin.qq.com/s/k9r7XtAq7VnAvyZ2G5Kdgg>

     文章简述了 CPU 选择执行线程的常见策略，对伪共享问题 阐述得比较清楚，内存对齐 主要就是为了防止 内存伪共享 的现象。

119. 分享个项目： \
     haltakov/natural-language-youtube-search \
     <https://github.com/haltakov/natural-language-youtube-search>

     Search inside YouTube videos using natural language

     该项目会把 youtube 上的视频下载下来，解析每一帧画面（识别画面中的东西），然后支持用户使用语言搜索到相应的画面，即 对视频进行帧搜索的工具。

120. 分享个网站： \
     2020 JavaScript Rising Stars \
     <https://risingstars.js.org/2020/en>

     The following graphs compare the number of stars added on GitHub over the last 12 months.

     相关链接：<https://2020.stateofjs.com/zh-Hans/>

121. 分享篇文章： \
     数字世界中的纸张——理解 PDF \
     <https://type.cyhsu.xyz/2018/09/understanding-pdf-the-digitalized-paper/>

     文章简介了 PDF 的基本原理 以及常见特征背后的原因。

122. 快餐文分享： \
     CSS-in-JS support in DevTools \
     <https://developers.google.com/web/updates/2021/02/css-in-js>

     文章涉及了 DevTools 中的 Style 显示编辑机制，感兴趣的同学可以了解下。

123. 介绍一门小众的编程语言： \
     Ballerina - <https://ballerina.io/> \
     官方介绍：Ballerina is an open source programming language and platform for cloud-era application programmers to easily write software that just works.

     特性：

     1. 语法层面支持网络基础设施的概念（service，resource...）;
     2. 可以随时将代码渲染成 流程图（AST 设施的一定很有规范，才能做到）；
     3. 静态类型，支持复合结构
     4. 内置大量 网络协议与云基础设施库（docker，k8s, grpc...）
     5. 快速发布，快速发布（抽象层级这么高..）

     另：有趣的是 官网上有两段 我曾分享过的名言：

     1. A programming language that doesn't change the way you think about programming is not worth knowing.
     2. Be conservative in what you send, be liberal in what you accept.

     还有一点 官方 blog 反复提到的特性：可完美兼容 JVM 生态，因为语言的运行时依赖 JVM... jBallerina is an implementation of the Ballerina language specification that targets the JVM.

     现在实现一门编程语言 比之前选择要多 ，往往只需要设计一门语言的标准（这是最难的，我见过太多小众语言只是 常见语法的组合，没有自己的设计原则），语言的后端有很多成熟的方案（JVM，LLVM..)

124. 分享篇文章：

     The Ballerina Language and Platform Support for WebSockets \
     <https://hackernoon.com/the-ballerina-language-and-platform-support-for-websockets-tv5k33wi>

     文章前半部分讲解了 实现 web 全双工通信的历史：轮询、长轮询、WebSocket，后面给出了 Ballerina 实现 ws 的实践。

125. ![image-20210301231832322](/files/-MUiUMnrDcGYK-uZ6Lv3)

     CSS IS AWESOME\~

126. 每日一句分享: 如果你经营酒店，退房时间放宽30分钟。如果你经营餐馆，给客人提供免费的小点心。如果你经营面包店，柜台上放一些额外的饼干。

     这些短期成本会创造顾客长期的忠诚度。

     \-- David Perell

127. 人物分享： \
     What Impossible Meant to Feynman \
     <https://nautil.us/issue/68/context/what-impossible-meant-to-feynman>

     理查德·费曼是当代最著名的物理学家之一，作者在1970年代读本科期间，听过费曼的课，并与他有密切的接触。本文回忆了一些往事，主要是费曼对碰到的新问题如何做出反应（摘抄自阮一峰老师周刊）。

     wiki 链接：<https://zh.wikipedia.org/wiki/%E7%90%86%E6%9F%A5%E5%BE%B7%C2%B7%E8%B2%BB%E6%9B%BC> \
     中学时代的费曼对数学和女孩子尤其感兴趣，但认为语文和哲学浮于表面，所以不喜欢。

128. A: 问一个小众的问题，大家知道在 JS Array.forEach 中 如何提前退出吗？ \
     B: 在外层设置flag？直接 break flag？ \
     C: 在foreach里 process.exit()

     A:直接 execSync(shutdown)&#x20;

     A: 我的答案是 使用 Array.every or Array.some return false/true \
     答非所问，不过确实能达到想要的效果。 \
     C: 😒你都说用foreach了，咋还换方法的 如果是我，我就直接for循环了 ，清晰一点

     A: 还有种方法 改变 顺序机制，就是 函数内部 throw error外层 catch

129. 分享篇资讯： \
     字节跳动筹备将抖音电商整合落地至上海 <https://www.36kr.com/p/1113574893676805>

     2020年中，字节跳动就曾释放消息称，未来3年在上海员工将增至2万人，在沪电商业务将整合升级为抖音电商板块。春节前后的这波调整，就属于此前计划的落实与推进。 一位接近抖音电商研发团队的人士告诉36氪，对于不想前往上海的员工，公司的态度是可以选择转岗。

130. 万字复盘：\
     为何我认为在线教育注定失败 \
     <https://www.huxiu.com/article/411665.html>

     摘抄：事实上，有真人的在线教育行业，就是规模不经济的。当你的团队开始有第7个全职老师之后，你就需要从教师团队里分离出一个不做任何教学工作只是管理老师教学的人，当你有第4个教务之后，你就得有一个教务主管……以此类推，这个管理金字塔会不断延伸下去，你的组织里注定会出现越来越多为了监督管理其他人是否在努力工作而存在的、但是并不为前线业务直接做出贡献的人。这是最大的问题。

131. ![image-20210301232149976](/files/-MUiUXthcF99QWbR-hvD)

     TS 不是 JS 的超集，hh 来自 jjc 老师最新朋友圈有感\~

     以上代码明明是 输出 false，false在 TypeScript 中却编译失败\~ \
     这说明 TS compiler 词法分析的过程中 泛型操作符 比 大于小于操作符 优先级更高。 \
     A: 泛型的语法解析 - 编译器是怎么解析有歧义的泛型调用表达式？ - d41d8c的回答 - 知乎 <https://www.zhihu.com/question/445904308/answer/1751558809>

132. 分享篇挺好玩的文章（小孩子别看）： \
     我拍了四年公厕涂鸦，这感觉就像读了别人的日记 \
     <https://mp.weixin.qq.com/s/dXueBDK5hMu-nJCZ1p2zZA>

133. 惊讶系列分享： \
     cowboy/abstraction-2020.js \
     <https://gist.github.com/cowboy/8270edb119c8ca700c3b1093659b3e4c>

     ```
     let $elseif, $else, $if = state => state ? (
       $elseif = () => () => {},
       $else = () => {},
       f => f()
     ) : (
       $elseif = $if,
       $else = f => f(),
       () => {}
     )
     ```

     短短几行代码实现了状态转移，OMG...

     <https://gist.github.com/cowboy/2784002> 这是 12 年版本的abstraction.js

134. think of the computer display as a flip-book（翻页书）, and the pages of the flip-book as frames played at some rate when you flip them. In other words, a computer display is nothing but an automatic flip-book that plays at all times when things are changing on the screen.

135. 好文分享： \
     A deep dive into React Fiber internals \
     <https://blog.logrocket.com/deep-dive-into-react-fiber-internals/>

     摘要：“Fiber is reimplementation of the stack, specialized for React components. You can think of a single fiber as a virtual stack frame. The advantage of reimplementing the stack is that you can keep stack frames in memory and execute them however (and whenever) you want. This is crucial for accomplishing the goals we have for scheduling. Aside from scheduling, manually dealing with stack frames unlocks the potential for features such as concurrency and error boundaries. We will cover these topics in future sections.”

     深度好文，讲解了 React 15 的 Stack reconciler 的缺陷、JS 执行的机制、React 16 Fiber 意义所在、以及 React16 的渲染原理。 \
     这篇文章值得前端同学花时间看一下，讲得很全面。

136. 为什么提出 Fiber？ \
     因为浏览器环境 运行 JS 是单线程模型，如果当一个状态需要超过一帧才能更新时 会造成页面响应卡顿俗称掉帧，所以 React 16 在此之前提出了 Fiber，一种在上层 控制 执行机制的模型。\
     抽象来讲，浏览器是一个单核的操作系统，浏览器执行的时间 就是最宝贵的资源。 假如 有一个线程执行时间过长，就会造成系统假死。 所以需要避免这种形象的出现，在操作系统上 是有时钟中断的，而 Fiber 的设计概念就是让中断机制置于每一个渲染单元。 \
     之前看国内 很多有关 Fiber 的文章时，经常把其与协程，纤程联系在一起，这完全就是不同的概念，协程是线程的进一步抽象，相当于重写 接管了线程的执行机制，它的主要意义是为了减少内核态切换带来的开销。 \
     当然多了一层抽象，可做的优化点 有很多，最简单的就是资源复用，比如池化，之前看 ants 源码（潘神写的 golang 的协程池库）内部就是用的 Golang 中的 sync.Pool..

     我还想提下关于 创造性的概念 是有多么重要。 \
     协程的概念 并不是 Go 提出的，goruntine 只是官方对自身协程的封装，goroutine 其实就是一些用户级的 “continuation”（<https://en.wikipedia.org/wiki/Continuation>）。 以及通过 channel 来通信，也不是 Go 提出的，是来源于 一篇 1978年的 paper。

137. A: 我突然感受到 文章局限了我的思想，刚刚的思考 是在文章总结好的知识体系上进行的，我做的只不过把中心思想 转换为我的理解，像个复读机。

     就像我刚刚提到的问题，我觉得它很重要 但文章没有涉及。 可能作者是不知道 或 没想到，该文章总结的知识体系 应该是不系统的。 我只是满足于 总结好的知识，在其基础上 进行思考，但却没想过 基础是否合理。

     我之所以提这点，是因为我平时阅读文章，获取信息都是这样的，就算主动思考，沉淀知识 再与其他节点关联，也只不过是个复读机。

     并且更重要的是，关于一个 topic，很多文章 总结好的知识都是类似的，刚提到的问题 google 下居然没找到相关信息，这是否能说明 一些现象呢？

     或许 关于一个知识的系统性 在文章这种信息媒介上 是很难体现到位的。 \
     又或许 一个知识的系统性 本身就是无法定义的，很难衡量的。 \
     B: 我觉得文章是其个人对知识的总结和见解 确实有局限性，所以还是读书更可能构建知识的系统性 \
     A: 赞同，可是问题是 新技术的时效性很强，书籍这种载体尤为明显.. \
     C: 新技术的具体提现不应该是产品嘛 文字作为记录介质，不觉得夹杂太多东西 作为一个陈述性的途径，更多是表达不同观点和做解释 \
     A: 是的，过度提炼 迷失自我了。

138. ![image-20210301232619540](/files/-MUiUubI-TqR_PClXYDe) \
     Kotlin 高阶函数调用方式 极大地增强了 语义表达能力... \
     A: kotlin的lambda 就像是为dsl而生的

139. 每日一句分享: 对爱情的渴望，对知识的追求，对人类苦难不可遏制的同情，这三种纯洁而无比强烈的激情支配着我的一生。 - 罗素

140. 重磅！七国首脑会议决定制裁Go语言！ \
     <https://mp.weixin.qq.com/s/xCv0xTZ8T37q23gQy1gVqQ>

141. Terms cheatsheet：

     SPA→ Single Page App

     PWA→ Progressive Web Application

     AMP→ Accelerated Mobile Pages

     CMS→ Content Management System

     SEO→ Search Engine Optimisation

     UX→ User Experience

     UI→ User Interface

     DRY -> Don't Repeat Yourself

     KISS -> Keep it Short, Stupid

142. ![image-20210301232723334](/files/-MUiUxd5AeELlEia1ouL)

143. ![image-20210301232728136](/files/-MUiV--_WtQBSty4HvMn)

     让我想起了那个梗，应聘需求 - 需要 Swift 8 年开发经验..

144. 为什么小程序强调双线程，普通web浏览器的渲染线程和js引擎不是本来就是两个不同线程的吗? - Liuyl的回答 - 知乎 <https://www.zhihu.com/question/446103629/answer/1747236457> \
     分享篇回答，简单粗暴。

145. ![image-20210301232800085](/files/-MUiV2_-8l8g5dPQb1Wn)

146. A: 家人们 分享点实用的pc端软件呗 \
     B: 可以看下 我之前的一篇文章，里面有关于 Windows 的常用软件 <https://tomotoes.com/blog/Y9KK/>

147. Why doesn’t React put memo() around every component by default? Isn’t it faster? Should we make a benchmark to check?

     Ask yourself:

     Why don’t you put Lodash memoize() around every function? Wouldn’t that make all functions faster? Do we need a benchmark for this? Why not?

     Dan 有关 为什么不将 React.memo 设置成默认行为的回答。 <https://twitter.com/dan_abramov/status/1083897065263034368?s=20>

     在我看来有两点：

     1. 为了性能提高会增加大量的内存消耗
     2. 有些引用 props 在使用不当的情况下，是会一直 rerender 的

     我一直在想 React.memo, PureComponent 好像是 React 设计时的妥协.. React 的思想是 重复渲染 entire tree，不支持细粒化代理更新，那 memo 算不算 开发者为了 其设计思想 买单呢？

     翻到了一个 issue： \
     Q: When should you NOT use React memo? #14463 \
     <https://github.com/facebook/react/issues/14463>

     讨论得很热闹，不过没有得到一个完美的答案。


# 1


# 1-3

1. 我想组一个 元旦三天沉淀计划, 有同学想参加吗?

   初衷是 准确把握元旦三天时间.

   具体的形式是 列举自己三天内要完成的事情, 不是普通的列举, 每件事要有排期时间的. 然后每天约个时间, 一起 review 下当前进度..

   有意向可私聊.

   **三天后的进展:**

   1. 重学 TypeScript \[v]
   2. 查看 ahook / usehook 的源码 (0.5d) \[v]
   3. 阅读 30 seconds of code (0.5d) \[v]
   4. 维护 tomotoes! \[v]

   &#x20;       1\. 微信端的header bgcolor

   &#x20;       2\. 移动端问题打赏后的点xmodel

   &#x20;       3\. 修改 博客与相册 版本年号

   &#x20;       4\. 字体在移动端过大

   &#x20;       5\. 关于项目增加书籍

   5\. 完成 Type-Challenge / typescript-exercises \[v]

   6\. macOS 与 Windows 的工具对齐 \[v]

   &#x20;   继续研究在 webStorm 下的快捷开发模式

   7\. 完成 年度总结 \[x]

   * 思考下 孤独与人性
   * 思考下 业务与前端发展
   * 思考下 朋友与爱情

   8\. 思考的价值 \[x]

   * 思考的价值软文/推广
   * 更新站点
   * 分享:
     * 产品与前端
     * 效率工具
     * 知识分享

   9\. Github 年度报告 项目 \[x]

   <https://mp.weixin.qq.com/s/lsUHCcTljz854ZrJVJpjFw>

   <https://fant-gp.herokuapp.com/>

   <https://github.com/tipsy/profile-summary-for-github>
2. Facebook 黑客杯四冠王！8 岁起横扫国际大赛，拿奖拿到手软 <https://mp.weixin.qq.com/s/a9J8knbkc-6RfrFRzVcBJw> \
   Tourist 永远滴神
3. 分享个 TS snippet 助助兴

   ![image-20210104231703062](/files/-MQD3UO_fi2Xs4ASLV45)
4. A: Java 中的 Object TypeScript 中的 any C++/C 中的 void \* Go 中的 interface{} Kotlin 中的 Any ...

   好多编程语言, 不管静态类型, 动态类型 都提供了 "Any" 类型..

   B: 这些更像是对应ts中的unknown吧 Java的object变量 o，你可以使用o.a访问a成员吗 好像不行吧

   A: 是的 但是 unknown 变量不能向下转型 any 是可以的
5. 函数重载的另一种方式.. 除此之外还有:

   func(签名1); func(签名2); ... func(签名3) {}

   &#x20;![image-20210104231731702](/files/-MQD3_xcKuArvuuVffua)
6. A: 写 Java 感觉重载这个概念很棒 \
   B: 其实我感觉重载有时候没啥必要

   A: 面向对象的设计好像 离不开重载

   C: 重载是 是设计者的妥协.. 如果一个功能 有多次重载, 多种签名.. 那么这个功能设计的就是有问题.. \
   PS: 在绝大数场景下
7. Answer to What is that one picture that describes the lowest point in your life? by Julia Puschnerat \
   <https://www.quora.com/What-is-that-one-picture-that-describes-the-lowest-point-in-your-life/answer/Julia-Puschnerat?ch=99&share=c9b74588&srid=iVbmg>

   A: 一个真实且无奈的故事.

   B: 这妹子为什么要去德国啊 Information System专业exchange就是为了看孩子也太不值了

   A: 哈哈，的确挺怪的
8. 如何评价ACM-ICPC World Finals 2077? - 陈靖邦的回答 - 知乎 <https://www.zhihu.com/question/437191564/answer/1655313320>
9. 在国内做独立开发者，没有公司实体寸步难行。
   1. 安卓 APP 商店上不了, 小米 华为 魅族 是允许个人的 ，opp vivo 不允许
   2. 经营性 APP 带后台需要域名备案，网安备案
   3. 支付还需要 ICP 证，其他网文、视频都需要单独办证
   4. 软著是强制的
   5. 提供服务不能接入支付宝、微信官方支付渠道（接第三方渠道收费高、还担心跑路）
   6. 唯一没支付障碍的是 iOS 渠道，支付用 IAP , 苹果商店要收 30% 手续费
10. (type as any) as targetType 可以将 任意 type 转换成 targetType..
11. TypeScript 官方提供了一种注解的元编程库.. TypeScript 在 编译成 JS 的这一层 可以增加好多抽象哇..

    <https://jkchao.github.io/typescript-book-chinese/tips/metadata.html>
12. 怎么过滤 Type Model/Object 中的不需要的 Key

    `type filter<T extends object> = { [K in keyof T]: condition ? ... : never }[keyof T]`

    关键在于 最后一行, 它其实隐含了两点:

    1. `[keyof T] keyof T => key1 | key2 | key3 ...`

    `[key1 | key2 | key3 ...]` 可以看成 `[Literal type]` 而 `[literal type]` 会执行 "遍历 每一个可成立的字面量"的...

    &#x20;  2\. `{k1:nerver, k2: value}['k1'|'k2]` 此类型返回值是 value 也就是说 会自动过滤掉 `never`

    ![image-20210104232004043](/files/-MQD3YlAM-8ctAVVnZkg)

    B: 可以当分配律来理解`A[x|y]=A[x]|A[y]`

    `T|never=T T&never=never`

    A: 这个受教了 是的, 就应该是理解的
13. 分享个视频: 下一代 Web 应用的超能力：机器学习 \
    <https://www.youtube.com/watch?v=dDIk1Tmnj9A&ab_channel=GoogleChromeDevelopers>

    视频讲解了主流的AI概念, 以及 AI 为前端赋能 的应用场景..
14. 第一次见到泛型组件的用法.. 有趣..

    ![image-20210104232045105](/files/-MQD3QLcUx-A5glHVfrx)

    &#x20;`<Component<Generic Type> attributes... />`
15. 快餐文分享: 10++ TypeScript Pro tips/patterns with (or without) React <https://medium.com/@martin_hotell/10-typescript-pro-tips-patterns-with-or-without-react-5799488d6680>

    使用 TS 开发 React 项目时需要注意的一些点, 这篇文章是 2018 年写的, 在 medium 上有 8.9k 点赞.. 文章有很多 现在看来的 明显的错误...

    就比如 `Don’t use FunctionComponent<P>/FC<P> to define a function component`

    果然发展的快, 沉淀就成了个问题..
16. 我突然想到了一个点, coding 时有一个问题一直无法绕过.. 就是命名了..

    命名变量的时候, 用名词堆叠 再符合个命名规范就可以了

    但函数命名时, 在大部分场景下 其实是有一定规律的

    变量: 名词堆叠 函数: 动词+名词堆叠

    而这个动词 完全可以把它枚举出来, 这样大部分场景下, 都可以拿来就用..

    ```
    addBalance
    getAccount
    filterActivityList
    patchEmail
    deleteUserById
    removeItem
    generateTagList
    fillTableHeader
    createFolder
    forEachFileList
    parseNodeTree
    updateUserInfo
    extractUserInfo
    showTable
    hideIframe
    useDebounce
    toBase64
    isSuccess
    canWrite
    requestModule
    loadScript
    fetchGalleryData
    setLanguage
    sendMessage
    querySelector
    findElement
    combineList
    importResource
    searchService
    renderComponent
    readFile
    onChange
    handleInput
    verifyFormData
    changeSettings
    cloneJSON
    appendSlice
    insertColumn
    saveConfig
    execCommand
    unloadPage
    destoryConnection
    openProgram
    ​
    单个动词, 一般都是 名词.动词 , 就比如 AST.parse()
    make
    do
    run
    walk
    enable
    disable
    parse
    build
    notify
    compare
    ​
    还有一些特定场景下的:
    downloadPage
    promisify
    expect
    box / pipe / then 链式调用
    ```

    A: 暂时想了这么多, 然后也借鉴了下之前的实践 与 通用 API

    B: 妙啊 我也是老起名困难了

    A: 我起名有个毛病.. 我经常 const filtererPageList = filterPageList()

    每次coding 代码都好长..

    B: 没懂 这个命名是就多了个er吗

    A: 多了个过去式.. 已过滤的列表 = 过滤列表(original list)

    B: 我觉得长得太像了 容易看错

    A: 哈哈 没办法短.. pageList 被用了 只能 filtererPageList 了..

    我经常闹这种情况..

    B: 我喜欢前面加个new， newPageList
17. 利用接口 实现 构造函数约束..

    ![image-20210104232245968](/files/-MQD4MMCUcPNeJ5_nY7g)
18. Question: 以下组件 存在什么问题?

    ```
    const handleClick = () => {}
    <Button type="primary" onClick={() => handleClick()}> Click me </Button> 
    ```

    A: 每次渲染都会重复构造一遍这个回调函数

    B: 好家伙，我垃圾代码看多了，这种没放在 usecallback 的函数我已经习以为常了。。。

    C: 嗯 每次 render 时, onClick 都是一个新的函数, 而函数是引用类型, 所以 每次render 时 都会重新 render Button 组件...
19. TS 类本身内部居然也支持 定义限制条件...

    ![image-20210104232327963](/files/-MQD4R4CSS1jZIhGREiE)
20. hah 每次看到 + - 修饰符, 都觉得使用这两个符号 类型显得很清晰易懂

    ![image-20210104232351383](/files/-MQD4UFk7wS-p4DUDgIy)
21. JS 在浏览器环境中 真正的并行执行..

    ![image-20210104232415831](/files/-MQD4KD9yG5JEO0GmtNS)

    通过 Worker API 去实现

    分享一篇没建群之前看过的好文

    Web Worker 文献综述 <http://www.alloyteam.com/2020/07/14680/>

    是腾讯 AlloyTeam 团队写的, 文章写的有深度, 该介绍的都介绍了.
22. 设计优秀的代码, 看起来就像诗一样的优美..

    ![image-20210104232439943](/files/-MQD4blmGmRcFAm_lfJd)
23. 2021年UI界面设计的9个趋势

    <https://www.inneed.club/articles/detail/l5xgd43gdw>
24. 分享一本刚刚整理的 React - Hooks 小册 - Dig deep into Hooks.

    里面包括了一些 推荐阅读的源码库, 以及一些经典的 Hooks 片段. 前端的同学有空可以读一下\~ 对掌握 Hooks 会更有帮助的.

    [Dig deep into Hooks](https://thinking.tomotoes.com/tags/docs/dig-deep-into-hooks)

    这个小册没有包括 ahooks 中的一些例子, 因为 ahooks 每个 hook 之间存在耦合, 不容易整理成代码片段..

    其他参考链接中的 hooks , 对我产生价值的 都整理了..
25. 3行核心CSS代码的rate评分组件，秀到你怀疑人生

    <https://mp.weixin.qq.com/s/FE3IuNu66VxLDgHCHWIRVA>
26. 好文分享:

    Learn Advanced TypeScript Types \
    <https://medium.com/free-code-camp/typescript-curry-ramda-types-f747e99744ab>

    摘要: Despite the popularity of currying and the rise of functional programming (and of TypeScript), it is still a hassle today to make use of curry and have proper type checks. Even famous libraries like Ramda do not provide generic types for their curry implementations (but we will). However, you need no functional programming background to follow this guide. The guide is about currying but it is only a topic of my choice to teach you advanced TypeScript techniques. You just need to have practised a bit with TypeScript’s primitive types. And by the end of this walk-through, you will be a real TS wizard.

    文章主要讲述了, 使用 TypeScript 为 Curry 函数建模的过程

    文章前面花大篇幅讲解了 curry, 与 TS 的基础概念.. 然后借助这个概念 创建了一个个类型工具, 再利用这些工具 达成最后 curry 模型.. 并且最后还增加了 placeholder 支持..

    整篇文章读了3遍.. 耗时半个多小时... 很久没这么耗费心智看一篇文章了...

    PS: 文章中存在一处错误 CurryV3 的递归名词 应该是 CurryV3

    这篇文章真的非常棒, 非常推荐阅读.

    <https://github.com/millsp/ts-toolbelt/blob/master/src/Function/Curry.ts>

    这是文章最终的产出

    哎, 虽然 TS 只提供了 type extends infer 很少的关键字, 但已经做到 类型系统上 图灵完备了...
27. 分享：[用 github-page 做短链服务](https://github.com/nelsontky/gh-pages-url-shortener)，包括[这篇](https://zhuanlan.zhihu.com/p/339832422)国人作者搬运的，利用 github 仓库做 db，github-page 的 `404.html` 来做查 db 和重定向，想法不错哈哈

    B: 这个想法可以的 404 拦截所有请求, 然后在提取请求中的参数, 通过参数 访问 github api 找到对应的长链接, 再重定向..
28. 换了套衣服

    ![image-20210104232614174](/files/-MQD4nZ946fc47DVZCgL)

    主题: Monokai Pro 图标: Material Icon 字体: Cascadia Code

    我发现 还是 vscode 好看哇.. jet brains 的 ide 差距挺大的

    要是 vscode vim 插件再给力点就好了..
29. Ep 23. 个人知识管理体系系列 - 输入篇 <https://pythonhunter.org/episodes/ep23>
30. 分享下 配置了一下午的 idemvimrc, 带注释的那种, 可以开箱即用\~

    [ideavimrc](https://thinking.tomotoes.com/tags/docs/ideavimrc)

    hah 这个 action 配置方面偏前端了, 因为 前端不需要 实现接口, 跳转到类 等等行为

    不过除了 action 篇, 前面都是通用的
31. 最近大家有什么工作机会，可以在群里共享下.. 毕竟寒假了，实习岗应该也挺多了..

    <https://m.nowcoder.com/intern/center>

    多关注些牛客，看些面经～
32. 分享个刚刚学到的小知识: `git push origin master:remoteBranch` \
    从本地 master 分支上 新建 远程分支, 并 push 到远程仓库.


# 4-7

1. 每日一句分享:

   这年代最讽刺的事是一一 人不知疲倦地996重复劳动，让自己变成机器 机器不断地训练学习提升智能，让自己变成人

   来自陈皓叔推特
2. 分享张老图, 温故而知新

   ![image-20210107192111669](/files/-MQRbS9bzeA5KA7PsCMT)
3. 解构的妙用

   ![image-20210107192120580](/files/-MQRbUEK9RAQHC5YFih9)
4. 【第 50 期】浅谈大型分布式 Web 系统的架构演进 <https://mp.weixin.qq.com/s/DAIv__Qr1yt49ZXhm9Yy2g>
5. 漫画 | 都是搬砖的打工人，差距怎么这么大呢？ <https://mp.weixin.qq.com/s/bUNnZxUKrktF0Wu3WGzfmw>
6. 分享一个非常全面的 vim command sheet.. <https://vim.rtorr.com/lang/en_us>
7. 第一次了解到 Vim - K 键的作用.. open man page for word under the cursor
8. A: 今天听到一种观点: 说做业务的程序员，技术能力的要求 都很低。

   B: “观点”是别人的

   C: 要做好业务也不容易

   A: 嗯，是的。

   C: 说到底技术是用服务于业务的

   A: 其实我很认同这个观点.. 在很多场景下，做业务等于在应用层开发..

   C: 是啊 天天写业务代码 也顶不住啊

   B: 嗯嗯 会麻木的哈哈哈

   A: 我在想，我目前属不属于互联网时代红利.. 只要学一点基本技术，就可以进大厂

   &#x20;可能有点妄自菲薄吧..

   C: 不会啊

   B: 不会啊 每个人的追求和目标不一样嘛 想法也不一样

   D: 看到拼多多猝死员工新闻时，大家都说是拿命换钱，可是在中国很多人连这个机会都没有，但如果猝死这件事情万一真的发生在自己身上，那些人可能又会觉得命重要一点了吧

   C: 哎 保命要紧

   E: 在资本家的领导下 何谈理想

   F: ￼当大家习惯了996 那007也快来了吧
9. ![image-20210107192510137](/files/-MQRbVrMeBvY5o32cyIh)
10. 看完这篇还不懂高并发中的线程与线程池你来打我(内含20张图)

    <https://mp.weixin.qq.com/s/BvU3ASLGkGBf5NIJmmESKA>
11. 开发组件时，经常把 UI state 与 data state 混合在一起，看起来乱哄哄，这方面有什么好的实践嘛？ 我发现大部分的时间都是在调ui 调交互..
12. V社 这帖子笑死了.. \
    问一下前端大佬，你们公司的产品或者 UI，在出原型或者设计稿的时候，是怎么体现动画的？ <https://v2ex.com/t/742168#reply29>
13. 好文分享:

    前端生产方式：过去 10 年回顾和未来 10 年展望 <https://mp.weixin.qq.com/s/c6-9wnxKTq5w3BVqlBFxPQ>

    摘要: 要看一个行业的未来发展怎样，就看这个行业的人才目前和未来在市场上被密集需要的地方在哪、规则最混浊或混乱的地方在哪。如果说这个行业的规则出奇地清晰、人才的供给又出奇的冷静，那么基本上来说，这个行业在市场的发展已经达到平衡状态，而能打破这种平衡重新建立平衡的也肯定是另外的行业的发展渗入。

    文章前半部分讲了 作者在阿里经历的变化, 后半部分则说明了 no-code 以及智能化 对传统前端带来的利与弊.

    最后，我还是带着大家一起展望一下前端智能化的未来 10 年（以如今的互联网发展节奏看，或许下面的 5 年内就达到也是有可能的）：

    2\~3 年内，前端智能化从业者数量翻倍，AI 在前端领域内或多或少有一些产品形态上的应用，终端开始浮现各种前端机器学习框架，用户产品在智能化体验方面的设计也有对应的倾斜，社区上也开始浮现出各种前端智能化的工程框架、训练框架和 AI 平台；

    3\~5 年内，前端智能化从业者数量继续增长，传统前端已经被淘汰，前端领域内智能化在特定领域内小有成绩，可以解决特定领域内的一些业务或人力生产效率问题，终端智能体验会趋渐成熟，给用户带来的沉浸式体验增强，线上线下无屏化无差异体验趋近相同，社区上开始开源一些前端的智能化产品；

    5\~10 年内，前端智能化从业市场已趋近饱和，端智能体验设计者应该在市场上比较吃香（如沉浸式人机对抗游戏等），nocode 问题应该能彻底解决，但同时带来其他的消费诉求，可能会引入新的领域难题。

    如今危机四伏，未来无限可期，所以大家还是要未雨绸缪，提前做好准备。

    以上摘抄自 文章最后一段, 结合我目前的经历来看 我觉得作者预测得并不是没有道理..
14. ![image-20210107192635846](/files/-MQRbXcDSujtS9rWAGbX)
15. 如何摆脱大学差、学历低的焦虑和困窘？ - 胡津铭的回答 - 知乎 <https://www.zhihu.com/question/348607535/answer/1663701384>

    这答案中的每一环节 都不是那么简单跨过的。从高职上一本，再考浙大研究生，冲刺顶级paper..

    我也是从高中后期努力自学，虽然高考结果很一般，但高中自学这个过程 一直激励着我到现在。 努力什么时候都不晚。
16. 好文分享:

    基于 Web 技术栈的动态化跨平台漫谈 <https://mp.weixin.qq.com/s/0QViGHkt6R5fOZms-EpwAA>

    摘要: 随着互联网红利的消失，整个移动市场的关注从“流量”转成了“留量”，大部分的移动产品也都告别了初期的抢占市场，进入了 A/B 实验和快速试错的阶段，现有 App 都开始对用户的时间进行激烈的争夺。普通的 App 不断的扩展领域和内容来满足长尾需求、超级 App 们也不断的提高护城河构建自有生态。所以无论是流量分发、精细化运营、还是提升时长，都需要 App 不断的增加平台化的属性，高效的响应调整和变化。 技术趋势一定是顺应行业发展的，在提升效率这样的行业背景下，App 整体的架构和技术选型，也都到了进行服务于效率的架构升级，拥抱工程化敏捷的时候了。

    而 App 中的敏捷工程化 代表的正是 Web 与 Native 结合了. 文中讲了目前的 Web 在移动端的发展 很全面. 背景,意义,业界实践, 都说的很细致.
17. List of languages that compile to JS: \
    <https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS>

    JS 简直就是新时代的 跨平台 指令集. PS: wasm 的出现, 让编译成 JS 没有了太大意义..
18. 快餐文分享: 一个产品需求的研发流程是怎样的？ \
    <https://mp.weixin.qq.com/s/ujfZBl9HR_0_FCr1Zz-SVQ>

    ![image-20210107192741718](/files/-MQRbZIhbMrdOJqvMvTL)
19. 刚刚学到 JetBrains IDE 的一个快捷操作.. Search Structurally (同理 Replace Structurally)

    可以根据代码结构去进行操作..

    ![image-20210107192751130](/files/-MQRb_lsqRzxM9dxXGQf)
20. MOST POPULAR BACKEND FRAMEWORKS – 2012/2020

    <https://www.statisticsanddata.org/most-popular-backend-frameworks/>

    相比于国内 Java php，国外的服务端 选择多得多


# 8-10

1. C: 分享一个收益良多的 Goruntine Pool 库 <https://github.com/panjf2000/ants/>

   里面的源码质量很高, 并且能从 协程池的工作流程 学到池化的精髓..

   ![image-20210110233324856](/files/-MQgxwJyRRdyBFxDiB5h)

   当时学 Go 的时候, 真的看了好多库的源码..

   在这期间, 我学到了 很多底层的知识 以及网络的知识..

   A: 好奇一下 马老师为什么不去搞后端开发呢？

   C: 其中有个库挺让我印象深刻的 <https://github.com/nsheremet/banjo> 它是一个 web 框架.. 但它的底层实现 是 tcp 监听路由, 然后 解析 成 http message 格式..

   因为在学完 Go 之后, 我又学了 Java Kotlin .. 我当时眼光很局限, 觉得 Go 在国内没有大厂生态..

   然后就开始准备考研了..

   放弃考研后.. 发现前端真的太容易找工作...

   B: 感觉现在的前端很热门呀

   C: 当然了, 前端现在生态混乱.. 还没有陷入平衡 再加上 各种终端, 移动端的发力, 前端的人才需求 太大了.. 其实 我也挺后悔没有 继续坚持走 服务端的..

   主要是因为 自己从来就没有一个规划吧..

   B: 前端也能把后端的事给干了

   C: 还是看产品定位吧..

   之前大二我开发一个 "JS全栈" 项目时, 也觉得 自己成为了一个"全栈工程师"..

   现在想想 挺幼稚的.. Nodejs 也好 Deno 也罢.. 它们只适用于 IO **密集的引用**

   这和它们底层的event listener 脱不了关系

   我最喜欢 前端的一点, 就是它在大部分产品下, 最贴近业务了..

   当然 很多业务是没有意义了...
2. 分享一个常见的概念: 马太效应-两极分化现象

   出自圣经《新约·马太福音》一则寓言： “凡有的，还要加倍给他叫他多余；没有的，连他所有的也要夺过来”。

   马太效应为强者愈强弱者越弱之现象，即是贫者愈贫富者愈富。 现实中就是指，只要获得了每一点的成功，就会产生累积优势，使之拥有更大的机会获得更卓越的成就。也是造就了贫富差距的原因之一。
3. 互斥锁与信号量的差别: 信号量, 可定义 同时访问 临界资源的线程数量 互斥锁, 只能定义一个 访问临界资源的线程 当有解锁时, 只有锁住该临界资源的线程才能解开 而 信号量没有这一限制 Mutex管理的是线程的使用权，而Semaphore管理的线程数量

   你想到哪些 编程语言相应的实现了嘛..
4. A: 碎片时间应该干嘛好呢.. 我感觉不能很好的利用起来..

   很多时候 我都是在 信息流中 去寻找 对我有价值的东西文章.. 我觉得效率很低..

   B: 对我来说信息太多了，有用的没用的适合的不适合的冗余都在一起了，分辨也需要时间

   A: 是的, 我目前 常常遇到这个场景..

   B: 怎么解啊

   A: 别看在群里经常分享 文章... 其实每一篇文章 都很难得的..

   感觉 得换换方式..

   B: 确实都是好文，虽然有些看不懂

   A: 是我的问题.. 知识无法下沉.. 自从建群以来 就一直存在这个问题..

   B: 没，没觉得有啥 多学学总没有坏处 是我的问题

   A: 并且方向对后端同学也不友好..

   C: 不是马老师的问题 是我们太菜了

   A: 别别别 别这样..

   B: 其实我觉得挺好的 为以后打基础

   C: 马老师发的后端内容也不少吧哈哈哈

   B: 挺多的也

   A: 不是的.. 我发的大部分都是 架构.. 中间件.. 分布式理论..

   我觉得真正应该有利的信息 是 spring 某一中间件的一些配置文章

   但我不感冒

   B: 我觉得挺好的，对我来说

   C: 我也觉得挺好的

   D: 我是挑自己感兴趣的看看hhh

   B: 我是挑我看的懂的去看

   A: 其实还有一事.. 从来没说过..

   B: 啥事呀

   A: 我会把群里的一些讨论 上传到 思考的价值站点 但放心, 从来没透漏过 真实的信息, 从来没有涉及到隐私

   所有的聊天信息 人称 都是 以 字母为代号.. 比如 我一会是 A 一会是 B 这样.. <https://thinking.tomotoes.com/tags/talk>

   D: 手动录入吗

   A: 是的.. 所以说 我整理元旦的三天消息 整理了一小时.. 但是 只录入 有价值的..
5. 每日一句分享: \
   100年前，由于汽车的诞生，乱穿马路才变成非法。
6. 看了CopyOnWriteArrayList后自己实现了一个CopyOnWriteHashMap <https://mp.weixin.qq.com/s/8RFSyMhUg7Ve6rQlBNs2yg>

   不知 读写锁 与 cow 相比，是否性能更强..
7. 莫名其妙 个人信息 被一个社区爬走.. 成为 分布式专家了.. hah 原来我这么强的嘛..

   ![image-20210110233840233](/files/-MQgxoWOUmPUv6dDtfyV)
8. 分享篇文章: \
   两次校招后呕心沥血整理的指南 \
   <https://blog.cugxuan.cn/2021/01/06/Campus/guide-capmus-v2/>

   文章涉及了一些校招基本的点, 希望能对找工作的同学有帮助吧..
9. Sorts an array of numbers, using the bucket sort algorithm. <https://www.30secondsofcode.org/js/s/bucket-sort>

   桶排序的 JS 实现
10. A: hah 我刚刚用一条命令让 webstorm down 掉了

    在 vim insert 模式下键入 :!vim

    用 vim 去打开 vim

    B: ️禁止套娃哈哈

    A: 哈哈哈，我发现 idea vim 是个阉割品，插件只能用它支持的，失去了好多乐趣..
11. 死月的二零二零总结 | 掘金年度征文

    <https://juejin.cn/post/6915772817308909582>

    死月大佬的年度总结.. 强如死月..
12. ![image-20210110233958088](/files/-MQgxmoHiLuk_lLvbW1N)
13. 分享两个比较全面 的 Vim CheatSheet

    <https://wincent.com/wiki/Vim_cheatsheet> <https://gist.github.com/awidegreen/3854277>

    好吧 我发现上面分享链接中的内容 vim quickref 都有涉及..
14. 分享最近刚了解到的 Vim 使用姿势

    ![image-20210110234124308](/files/-MQgxuGxa1C8mPklVJab)


# 11-15

1. 分享一下 chrome 小技巧

   ![image-20210116152016955](/files/-MR99lxzz1upZFrkYN4R)

   开启 Chrome 的 tab preview 功能，输入 chrome://flags/#tab-hover-card-images

   * Tab Hover Cards
   * Tab Hover Card Images
2. 分享个视频: \
   因为看到同事被抬上救护车我被拼多多开除了 \
   <https://www.youtube.com/watch?v=Vs8c5fYQlVc&feature=youtu.be&ab_channel=wuqi>

   这视频刚发完 b 站就消失了.. 看完这视频.. 我对拼多多一生黑..
3. 分享款效率工具:

   Vimac - Vimium on MacOS <https://github.com/dexterleng/vimac/>

   主要功能点有两个:

   1. 可以把所有 clickable 的地方标记出来, 然后键入对应的字符 模拟鼠标的 Click, Right Click, Double Click
   2. 可进入到滚动模式, hjkl 进行导航

   ![image-20210116152104505](/files/-MR99xjbdjBR6aTG-lt8)

   分享下 我的配置
4. [「墨刀冬招」「远程/北京/长沙」前后端/产品/设计职位开放，北京薪资，远程/北京/长沙可选，可节前面试，节后入职](https://www.v2ex.com/t/732806)
5. Q: 有啥好的java面试资料吗大佬们\~

   A: <https://github.com/Snailclimb/JavaGuide/> 可以看下这个
6. 快餐文分享: \
   Java 并发编程之 JMM & volatile 详解 \
   <https://segmentfault.com/a/1190000038926896>

   文章完美做到了 浅入深出.. 前面介绍基础概念 讲得不错, 后面 讲 volatile 时,少了一些相关概念..
7. 分享两个名词:
   1. 动效 == 交互动画 界面动效能加强用户认知且增加活力。
   2. 品质建设 == 优化应用 就如 前端品质建设 主要为了解决白屏渲染, 提高 FCP, FP 指数.
8. ![image-20210116152216996](/files/-MR9A4-bf7GtenTdIe5-)

   这个 snippet 太精彩了.. 只需短短几行代码 实现加权随机样本..
9. ![image-20210116153706363](/files/-MR9AAVAdDdO-d5tqt7g)
10. ![image-20210116153628856](/files/-MR9ADIbE6arYAhsPCUp)

    A: Py API 设计的真是糟糕, 这短短两行代码, 做的事情全都隐藏起来了 反而给开发者增加了心智负担

    B: 。。list 原来还有 count？

    A: 不清楚, py 很久没接触了

    B: +1

    C: 惊了

    A: 我最讨厌的两门语言 php py

    B: 哈哈哈哈

    C: 真要说，JS的api不是更糟糕吗

    A: 何以见得呢..

    C: 就比如这个array.from

    A: 怎么了..

    B: array from 挺好用的我觉得哈哈哈

    C: new Array(n)才是最符合直觉的 然而。。

    A: 我不能接受这种命令式的声明.. 违背 pointfree 原则..

    py 的 API 设计 我看到头大, 除了 那个生成式的特性, 以及一些语法上的特性 就比 10 <= a <=12, 切片.. 好像也什么我喜欢的了..

    C: py除了lambda只能写一行，我觉得都还行吧（

    B: 可以直接 Array(n) 啊

    A: 这样我觉得更不好..

    B: 那你喜欢啥样的

    A: Array.from

    B: ...... 传啥参数呢

    A: Array.from({length: n}, () => initialValue)

    `const range = (start,end) => Array.from({length: end-start}, (_,i) => start + i)`

    A: 关于 range 我最喜欢的就是 go 与 Haskell 可以生成无限自然数的数列了..

    并且还是懒调用 还不会影响 performance

    C: JS用generator也行吧

    A: 可以的.. 支持 迭代器特性 语言应该都可以
11. A: 最开始学 es6 那些新特性的时候, 我一直有个问题..

    就是 Promise.all 里面的 promise task 到底是 并发 还是并行 或者说 还是顺序执行..

    举个场景 await Promise.all(\[request1, request2, ...])

    B: 好问题 我已经停止思考了

    A: hah 和 event loop 有关

    A: 我觉得 并行是存在的 并发也是存在的 顺序执行也是存在的

    C: 我一直当并发理解的

    A: 主要看 每个 promise 在不同场景下的运行.. 需要多个维度思考..

    C: JS怎么并行啊，单线程，就跑在一个核吧

    A: 假如 promise 执行的是 一个 IO 请求, 底层会并行执行的

    并发执行 这个是 promise 的特性了 顺序执行 这个是 promise.all 的 check 机制

    A: 之前做项目 每次写 await Promise.all 我都心里不踏实,感觉跟个黑盒似的..

    现在没有.. 现在是写 css 有这种感觉.. 每次写定位 布局时, 都头大..

    ![image-20210116154030382](/files/-MR9AI8DeOGerFWGH2H9)

    我之前写的打包脚本, 感觉是 promise 的正确应用场景
12. ![image-20210116154045754](/files/-MR9AOGOvMHHPYAGmvCj)
13. 快餐文分享: \
    【第1892期】GPU加速在前端的应用 <https://mp.weixin.qq.com/s/T8g8uSn6K_5gz2DiPBWk9Q>

    文章简单介绍了 GPU 做计算的优势, 以及前端如何借助 浏览器渲染机制利用 GPU 渲染. 原理就是 将 layer 提升成一个单独的图层..

    目前 利用 GPU 计算 在业界已经有对应的产品落地了.. 就比如 常见的 webgl 库 three.js pixel.js 也有利用 GPU 做计算的数据库 等..
14. CSS 目前的三种趋势: CSS-in-CSS (e.g. CSS, Preloader, CSS Modules) CSS-in-JS (e.g. Styled Components, Emotion) Utility-First-CSS (e.g. Tailwind CSS)
15. 分享一个 111 页的PPT

    Intro to React, Redux, and TypeScript <https://blog.isquaredsoftware.com/presentations/react-redux-ts-intro-2020-12/#/>

    PPT 中简明扼要地讲了 React, Hooks, Styling, Redux, React-Redux, Redux-Toolkit, TypeScript 的基本概念, 以及使用场景.. 最后的推荐阅读链接 也不
16. Redux-toolkit The official, opinionated, batteries-included toolset for efficient Redux development <https://github.com/reduxjs/redux-toolkit>

    建议了解下 我准备在项目中落地下 这个库, 看起来比原始使用 redux 香很多

    自带 reselect, redux-thunk, immer, 还提供了 多种 action creator..

    reselect redex-thunk 都很让我印象深刻.. 之前看源码时.. 就短短一百行.. star 高达上万..

    ![image-20210116154210717](/files/-MR9A_bk7fe8n6-g5FU0)

    这是 redux-thunk 的源码... 说白了 就是将 dispatch 传进函数中...

    <https://github.com/reduxjs/reselect/blob/master/src/index.js> 这个是 reselect 源码, 就是做了个 memories 的事情...

    这就是 redux 的生态
17. 公司监控 1、监控摄像头（通道出入口）迟到或带打卡，人脸识别可以看到真实上下班时间 2、上网监控（时间、网站、发送数据）https一样可以被监控，没有隐私 3、QQ微信数据是加密，但是可以看到什么时间使用 4、电脑不允许重装系统，可能安装有监控程序，录屏、录音、文件扫描，而且不能强行卸载 5、微信QQpc端同步后都会被监控到 6、很多监控有录音功能，甚至还有拾音器，能收到20m内的声音

    保护自己 1、不要用公司发配的设备登录个人账号 2、不要使用公司网络干工作无关的事情 3、公司系统中的密码与私人密码需要明确区分开 4、QQ微信最好准备工作账号，私人账号不要介入公司WIFI等
18. 分享篇文章，讲的挺好的

    Facebook 重构：抛弃 Sass / Less ，迎接原子化 CSS 时代 <https://mp.weixin.qq.com/s/NmHUYZh_ILG-Phe53NcoEg>
19. ![image-20210116154309783](/files/-MR9AgI5oiX3wVfyfCnA)
20. 为什么不使用一个全局变量替代redux？ - 江湖术士的回答 - 知乎 <https://www.zhihu.com/question/428851039/answer/1673506867>

    暴躁老哥，在线答疑
21. 招聘信息分享: 腾讯云云开发团队招全职/实习生， Web 前端/Node.js 相关岗位 <https://v2ex.com/t/744656#reply0>
22. ![image-20210116154339298](/files/-MR9AjxQX31Gd_evJnKz)
23. 分享篇文章: 我在拼多多这三年 <https://github.com/LeadroyaL/pdd_3years/blob/master/pdd_3year.md>
24. 短信息分享: You may not be familiar with his name but React’s original creator, Jordan Walke, has left Facebook. This comes after ten years with the company where he put an indelible stamp on both React and Reason. In announcing his departure he simply said he is “starting a new company” but also goes to say that he will also be investing in startups in the React/Reason ecosystems which is great.
25. 动漫版 flexbox cheat sheets，图示敲可爱\~

    <https://dev.to/joyshaheb/flexbox-cheat-sheets-in-2021-css-2021-3edl?utm_source=digest_mailer&utm_medium=email&utm_campaign=digest_email>
26. <https://moon.fm/share/episode/2519/>

    🎙#88 - 与墨刀创始人张元一聊创业从 0 到 1

    分享下 今天听的博客. 时长一小时, 干货很多, 主要内容是 元一 创建墨刀这个产品的故事.. 其中有一个主题, 让我感受很深: 关于一个产品的驱动.

    有的产品是 运营驱动, 有的产品是技术驱动 而不同的驱动 往往是一个产品 从 1 到 100 这个过程中 最重要的立意.
27. 打开线程 | 进程 | 协程的大门

    <https://mp.weixin.qq.com/s/NP2TEpgIArJrHagGfq5N2A> 文章很长，很啰嗦，到涉及的基础概念还是挺全的。
28. 分享个问题: A: RPC 位于 ISO 第几层？ 与HTTP , TCP是什么关系？

    B: 和tcp在同一层？

    A: No... 它也是个应用层协议..

    C: 我理解也是应用层的 服务之间调用

    B: 基于tcp的应用层协议 这样可以满分吗 马老师

    A: No.. over TCP or UDP
29. TypeScript 4.2 Beta 发布 \
    <https://www.oschina.net/news/126465/typescript-4-2-beta-released>

    语法新feature

    1. 元祖类型的 Rest 元素支持放置在元组中的任何位置
    2. 模板字面量表达式已具有模板字面量类型
30. 29岁两年狂赚77亿，35岁被判终身监禁，暗网“丝绸之路”缔造者的末路

    <https://mp.weixin.qq.com/s/GoGIXpexrOOVjrqKs4Tdkg>

    这故事写的还挺波折
31. 淘宝技术这十年 <https://weread.qq.com/web/appreader/016324b05a617e01617778fk636320102206364d3f0ffdc?wtheme=white&wfrom=app&wvid=244154583&scene=bottomSheetShare>

    分享本书，讲得是淘宝从开始到10年之间的重要技术架构迭代，遇到的技术问题，以及一些产品方案上的实践。最后花了大篇幅讲了淘宝的各种大佬。

    上面的长文字摘要 就来自这本书，花了50分钟读完了。 建议前面50%仔细读一下，后面的章节略读就好。
32. 分享篇短文

    2020 前端技术发展回顾

    <https://mp.weixin.qq.com/s/b0pFJFXgBSyB56Ce86YMUg>
33. <https://moon.fm/share/episode/2559/>

    🎙Ep 19. 如何成为互联网校招 offer 收割机？

    三个上岸的大佬分享校招的一些亲身事情与经验。
34. 所以……是出了问题才知道 Flash 被停用的么……

    <https://weibo.com/1668726803/JDclcgigy?ssl_rnd=1610783219.8414&type=comment#_rnd1610783230849>

    A: 太好玩了，配上这文案…

    B: 丧事喜办

    A: 微机组立大功

    C: 欺负领导不懂，瞎汇报
35. ![image-20210116154733419](/files/-MR9AmIJQM1avmxmLEVl)
36. 今日播客分享: \
    <https://moon.fm/share/episode/2603/>

    🎙从技术到管理 - 陈皓

    皓叔有句话说得好，代码能力不行 就是在为社会 创造就业机会。公司要为你招其他基础服务岗位。

    劳动密集型+运营驱动型+\[不合理管理] 造成 996 现状

    加班只是为了自己的今天，提升自己是为了自己的明天，有多少人只有今天没有明天，当你加班缓过神来，一定要努力提升自己。

    职业规划 当有两三家公司给你发 offer 时，才有谈的必要。当你连选择都没有时，你做的只有提升自己才对。

    关于提升自己的主题，陈皓说 说了两点

    1. 学什么技术都要思考到操作系统层面
    2. 学技术时要重点学习基础性的东西，而不是“说明书”


# 16-17

1. <https://moon.fm/share/episode/2606/> \
   🎙Ep 14. 聊聊职场中的那些坑 关于 Google 的两位大佬，阿里的一位大佬 之间的一场闲聊，好玩的点挺多的
2. 分享一个JS清单: <https://github.com/DrkSephy/es6-cheatsheet>
3. Apple 收益预警 的两封公开信:

   1. "苹果公司预计第二季度的收入将达到约14亿美元～14.5亿美元，低于此前约16亿美元的预期。收入低于预期主要是由于消费者和创意市场（如广告和出版）的需求疲软。从地理位置来看，欧洲和日本的收入变得特别薄弱。由于成本降低，毛利率高于预期，预计收入不足将被大幅抵消。因此，公司已将盈利预测修订为每股0.08美元至0.10美元，而之前的指引为0.11美元或略高。"
   2. "与我们行业的其他人一样，本季度我们的销售额正在放缓。因此，我们将低于收入预测约10％，导致利润略微下降，"苹果首席执行官史蒂夫乔布斯说。"我们有一些令人惊叹的新产品正在开发中，所以我们对未来一年感到兴奋。作为目前在PC业务中获利的少数几家公司之一，我们对苹果长期增长的前景仍持乐观态度。"

   第一封信的作者是史蒂夫·乔布斯，第二封信的作者是蒂姆·库克。 第二封信一发出来，苹果股价就跌了10%。
4. 介绍两个另类API的实现:
   1. 验证码识别服务 2Captcha 2Captcha 最大的特色是，不管字体多么扭曲的验证码，都可以正确识别，因为他们采用真人识别！任何人都可以去平台接活，按照工作量获取报酬。开发者只需要把验证码图片发到他们的服务器，就会有真人识别这些图片。每次验证码识别需要12秒～14秒，开发者使用前一次请求返回的 ID 轮询服务器，拿到识别结果。
   2. 检测水质服务, 根据扇贝的生理行为, 具体信息忘了.. 只记得一年会消耗7-8个大扇贝
5. M1 不能算作 CPU，而是一个单片系统 （System on a Chip，简称 SoC），里面集成了中央处理器 CPU、图形处理器 GPU、机器学习芯片 NPU、安全芯片等等。 正是由于这么多组件做在一起，苹果才有办法，最大限度地优化电路，提高协同能力，节省电力。再加上，操作系统也是自家的，可以配合着修改底层，所以性能才能提高这么多。

   SoC 的盛行会带来一个后果，因为它把许多功能集成在一起，大量使用自定义的逻辑和接口，封装成一个黑箱，而且每家公司的设计都不一样，所以 SoC 不可能是一个开放的、兼容的系统，只可能是封闭的专有系统。 目前的手机硬件，就是这种状况。

   来自阮一峰老师141期科技周刊 <http://www.ruanyifeng.com/blog/2021/01/weekly-issue-141.html>
6. 快餐文分享: Hardening Website Security – Part 1: HTTP Security Headers <https://int64software.com/blog/2018/11/05/hardening-website-security-part-1-http-security-headers/>

   文章讲了一些常见的 HTTP 安全头概念, 以及如何设置(Nginx Apache PHP ASP IIS)

   1. X-Frame-Options: 有关 iFrame 嵌入的限制选项
   2. X-XSS-Protection: XSS 安全设置
   3. X-Content-Type-Options: 浏览器嗅探文件选项
   4. Strict-Transport-Security: HTTPS 相关
   5. CSP, Content-Security-Policy: 前端必会, 面试也常问 不懂的同学可以去了解下了
7. 快餐文分享:

   9 Bash Aliases to Make Your Life Easier <https://medium.com/@remykarem/9-bash-aliases-to-make-your-life-easier-3e5855aa95fa>

   里面一些 aliases 还是挺实用的:

   1. gitpush/gitrefresh
   2. google/so
8. ![image-20210118000157996](/files/-MRG8y0XWXv-BLSTxxUX)

   说一句, 字节之所以这么快的发展起来, 就是商业模式确定的早, 依靠广告系统迅速实现了盈利.
9. 分享一个有趣的网站: We've all faced rejection. <https://rejected.us/>

   里面是各种大佬求职时 被拒绝的故事... 看的我有点羡慕...

   ![image-20210118000244962](/files/-MRG6-PxvOS-1qI4Mnp3)
10. 分享一个调色板网站: <https://www.happyhues.co/palettes/17> 网站中的每种调色方案, 都很让人舒服, 即简洁又突出重点
11. 分享篇文章: My Bootstrapped Micro-Startup got acquired for $22k <https://mohddanish.me/my-bootstrapped-micro-startup-got-acquired-for-usd22k-10>

    一个独立开发者, 在辞职后 打算开发一款 简历生成器 项目, 在此过程中 遇到了 Github 上的 PublicAPI 库 (我之前看到这个库时, 就想利用它做点什么..), 然后他为这个库搭建了一个可视化使用界面, 在长达 8 个月后, 他把这个产品卖了 20k 美金.. 这 8 个月中, 他又基于 twitter 上 有人发布招聘信息的场景, 开发了一款收集招聘信息的应用..

    看完这篇文章, 我又想起我之前的一个观点.. 一个产品往往都是 能看到它潜力的人 才会驱动起来, 并不一定不是发明者.

    并且很多时候信息差真的很重要, 在我 TODO 清单中一直有个条目没有实施: 利用信息差 发现可以挖掘的产品 然后借助现在营销的手段 搞点东西出来

    目前国内的最短糙快的营销平台就是 抖音了.. 我之前看过一个身边的产品落地, 就是利用网上修复老照片的服务, 然后找各种自媒体推广, 最后 将流量引导到微信中 快速盈利..
12. 人物文章分享: 我，75后，年薪几十万累到不行，离开上海回乡下种地放羊 <https://www.toutiao.com/i6912037372054028804/>

    摘要: 在上海工作十八年，我每天拼命学技术、开研讨会、最多一年出差飞行近百次。这些努力让我收获了世界五百强公司技术专家的名头、上海内环的房子、几十万的年薪，但也累出了一身病，长期日夜颠倒，神经紧绷。

    放弃家里安排好的环境, 孤身到上海打拼, 一路上成为文中自嘲的 上海人上人, 到最后卸甲归田 实现种地的梦想..

    故事很真实, 看到最后 很羡慕 作者得到了想要的生活.
13. 人物文章分享: 为什么他能成为谷歌新当家？皮查伊的登顶之路 <https://tech.sina.com.cn/it/2019-12-10/doc-iihnzhfz4783261.shtml>

    摘要: 在谷歌诸多高管中，皮查伊并不是一个特别善于表现的人物。但他在Chrome部门的亮丽业绩，他本人的谦逊性格，却让皮查伊得到了佩奇和布林的赏识，在公司内部的政治斗争中站到了最后。

    文中将 皮查伊 能够胜任, 归结于 他的背景, 在 Google 中的优秀成绩(Chrome发起者), 以及与上级之间的信任(拒绝股票).. 世界 TOP 公司中, 印度人 多居领导位绝不是偶然..
14. 分享一个简单的数据库(基于文件系统):

    Kn-DB <https://github.com/Knove/knDB/blob/master/README.CN.md>

    源码很简单, 正是应了那句话 最早的数据库 就是文件系统.. 这个库做到事情就是 对文件包了一层 IO 接口..
15. I think there's fundamentally 3 architypes of programmers, divided by which ideals we hold in highest esteem:

    1. You are a poet and a mathematician. Programming is your poetry
    2. You are a hacker. You make hardware dance to your tune
    3. You are a maker. You build things for people to use

    这个opinion 是我最近听到最感同身受的一个了.. 很幸福, 这3种分类 我都有体验过\~
16. 点击网页的按钮, 如何只利用 CSS 发起网络请求:

    .some-button:active { background-image: url('some\_image.jpg') }

    点击按钮时, 触发 按钮 active 状态, 然后应用到 CSS 规则的 background-image: url(图片地址) 这就相当于对 图片地址 发起了一次网络请求..
17. 快餐文分享: 我在阿里做技术面试官的一些经验 <https://github.com/lihongxun945/myblog/issues/40>
    1. 面试前准备
    2. 面试的时候的一些建议
    3. 面试结束的时候应该问点什么
18. 分享个网站: cssdb <https://cssdb.org/>

    cssdb is a comprehensive list of CSS features and their positions in the process of becoming implemented web standards.

    未来 CSS 的新feature 都可以在这里找到\~

    @media (480px <= width < 768px) {}

    关于媒体查询器, 新的语法方案, 看起来挺期待的.
19. 今日Podcast分享: <https://moon.fm/share/episode/2631/> 🎙Ep 10. 和 ctrlsf 的作者 dyng 聊聊 Vim

    大佬们之间的关于Vim的闲聊，听完没什么干货，完全当成背景声了..
20. 分享两个视频:

    1. UI Design Trends 2021 <https://www.youtube.com/watch?v=5RluSnRPRbI&ab_channel=DesignSense>
    2. UX Design Trends 2021 <https://www.youtube.com/watch?v=tPoRAL7Lm1M&ab_channel=DesignSense>

    2021 UI/UX 演讲趋势, 看完让我大开眼界, 每一个设计都具有美感, 尤其是 Colorless Design , 个人太喜欢了.. 美得溢出屏幕.. 还有在 AR 时代的 UX 设计, 科技感满满..
21. 每日一句分享: 微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想

    之前看过一本书, 程序员的呐喊, 里面有一个作者在亚马逊的经历.. 12年的时候, 贝佐斯 就前瞻性地提出, 所有服务都采用 SOA 架构重新实现..

    搞错了, 不是12年, 是 02 年...

    ![image-20210118000403355](/files/-MRG5w5p-7bOWRP9CmnM)
22. 常见的负载均衡实现场景:

    1. DNS 层面
    2. 服务层面 负载均衡服务器, 比如 Nginx
    3. 硬件层面 , 比如 F5

    Load Balancers have different strategies for distributing the load across a set of backends.

    1. Round Robin Distribute load equally, assumes all backends have the same processing power.
    2. Weighted Round Robin Additional weights can be given considering the backend’s processing power.
    3. Least Connections Load is distributed to the servers with least active connections.
23. 分享今天看到的一句话, 让我感触颇深.

    吃苦不是受穷的能力. 吃苦的本质是 长时间为一件事聚焦的能力, 以及在长时间的聚焦过程中, 所放弃的娱乐生活 无效社交 无意义的物质消费, 以及在过程中所忍受的不被理解和孤独. 吃苦本质上一种禁欲能力 自控能力 坚持能力和深度思考能力.

    来自 和君总裁王明夫.

    我的理解是 在已经有温饱条件后, 吃苦应该是从精神层面去诠释了.. 所以 也不是很赞同上面的话...
24. 一个人倘若需要从思想中得到快乐, 那么他的第一个欲望就是学习.

    来自 王小波 思维的乐趣.
25. 今日人物文章分享: 开启 PC 时代的人也离开了 - 纪念保罗·艾伦 <https://mp.weixin.qq.com/s/iRRfXabhZpsi7ODP8CmMYQ>

    摘要: 而艾伦已经熟悉10种类型的计算机、10种高级语言、9种机器语言、3种操作系统。那一年他不到20岁。

    伟大的梦想都始于微不足道，当年艾伦和盖茨在畅想创业生活的时候，艾伦问比尔，「如果一切顺利的话，你觉得我们公司能办多大？」比尔想了想说，「估计得有35名程序员那么大！」，艾伦心想，这真是个雄心壮志。

    比尔·盖茨：没有他就没有个人电脑。
26. 快餐文分享: 你足够「懒」吗？ <https://mp.weixin.qq.com/s/mkYgOvfVxFmONPh742pi1w>

    摘要: Fortran 这门编程语言主要面向的领域是科学计算，使用人群不够广泛，没有 C、Java、Python 等热门语言那么热闹，社会上对它的讨论热度也不高。但 Fortran 的地位和影响却是其他编程语言没法比的。从某种程度上来说，Fortran 是编程的源头，后来出现的很多语言都是在它的基础上发展起来的。正如图灵奖获得者吉姆·格雷（Jim Gray）所说：“一切都从 Fortran 开始”。

    我想谈谈创造性的产品与工程性的产品 在计算机界中所占的不同重量.

    我了解到的很多技术 都是工程性的产品, 比如 redis, nginx, vue, spring, hadoop 等等 这些耳熟能详的产品.. 我之所以称它们为工程性的产品, 是因为这些产品不具备根本上的创新.

    这些产品 都是 已有思想 paper 的实现产物.

    而具有创造性的产品, 在我看来 都是瑰宝.. 就比如 mapReduce 的提出, 冯诺依曼的计算机体系, 图灵机计算模型, 以及 前端方面从语法层面的新革命 react... 等等等..

    当然有太多太多案例了, 我只是简单列举下..
27. 快餐文分享: 什么是Service Mesh <https://zhuanlan.zhihu.com/p/61901608>

    摘要: Service Mesh是微服务时代的TCP协议。

    整篇文章 没有几处是作者产出, 皆是 Pattern: Service Mesh 文章的内容以及翻译后的润色.

    之前在 twiiter 刷到一句话: 有的人翻译文章，就像哈希函数。经过他的翻译，就认不出原文了。

    并且有一点, 国内的开发者很少有意识.. 当你翻译篇文章并发表时, 一定要征得原作者的同意, 不然这是侵权的行为..
28. <https://moon.fm/share/episode/2646/> 🎙#78 - 和 Vue.js 框架的作者聊聊前端框架开发背后的故事
29. ![image-20210118000520853](/files/-MRG5s09q1GM2W9fJ_3P)

    两行代码实现全排列..
30. 分享篇 池建强老师谈信息噪音的文章:

    任何事物当中的百分之九十都是垃圾？ <https://xie.infoq.cn/article/c01732c6e3914a73cdcd74c47>

    摘要: 互联网是无法自动区分有意义的知识和无价值的噪声，这就意味着优质信息总会被各种无聊的冗余信息和充斥着过载情绪的劣质信息淹没掉。 因此，在摄入信息时，我们要像对待食物和药物一样挑剔、严格、谨慎。
31. 文摘分享:

    我现在已经活到了人生的中途，拿一日来比喻人的一生，现在正是中午。人在童年时从朦胧中醒来，需要一些时间来克服清晨的软弱，然后就要投入工作；在正午时分，他的精力最为充沛，但已隐隐感到疲惫；到了黄昏时节，就要总结一日的工作，准备沉入永恒的休息。

    来自 王小波 「你为什么活着」
32. 好文分享:

    职场寒冬，给你讲四个小故事 <https://xie.infoq.cn/article/f273de6668578c9a3728b85b1>

    摘要: 第一个故事:

    1. 大平台业务量大，碰到的技术问题、管理问题、业务问题都很多，而且这些问题都涉及比较大的规模和流量。如果认真工作，需要你投入的思考会更多，更加考验你全面的素质和能力，逼着你快速提升自己，尽快成熟坚强起来。
    2. 身处职场还是挺重要的。这不是说让大家都曲意逢迎别人，而是要有自己的原则和执行方向，但是又能最大限度的整合资源，争取更多的支持。切记，千万别觉得自己个人能力强就目空一切，这在需要高度协作化工作的互联网公司可能会给你造成较大伤害。

    第二个故事:

    1. 这个时代虽然是一个社会高速发展，什么都讲快餐的时代，但是对于人才，尤其是高级人才，还是越有积淀越吃香。如果一个人什么都懂，什么都稀松平常，那就很难体现出自己的竞争优势。
    2. 在任何时候，投资自己永远是投资收益比最高的，所以永远要投资自己，充实自己，让自己有价值之后才能变现价值

    第三个故事: 态度决定高度的真实案例

    第四个故事: 把工作当成是创业 的心态
33. Question: 如何在编程角度复用资源？

    A: 单例与池化
34. 好文分享: 3 tribes of programming <https://josephg.com/blog/3-tribes/>

    文章介绍了 编程语言的三种阵营, 也正对开发者的不同方向.

    1. Programming as applied mathematics 学术界的代表: Haskell, FP理论
    2. Programming as hardware hacking 注重性能的底层语言: C系列, 汇编
    3. Programming as a tool to make things 开发应用的语言: 前端..

    Ultimately code is code. Even though we have different reasons for writing software, what we write is (usually) compatible. And even when its not (looking at you, Haskell) - there's always a lot of ideas we can learn from and steal. 作者的主要思想: crosses multiple tribal lines
35. 分享一本今晚看完的书, 这书写得非常棒, 值得反复阅读的.

    《大型网站技术架构》<https://book.douban.com/subject/25723064/>


# 18-23

1. 每日一句分享: 万维网的基本单位是单个页面
2. 新一年20天内, 字节宣布放弃两个业务:
   1. 悟空问答
   2. 好好学习
3. 快餐文分享: \
   CSS Grid 网格布局教程 \
   <http://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html>

   摘要: Grid 布局与 Flex 布局有一定的相似性，都可以指定容器内部多个项目的位置。但是，它们也存在重大区别。 Flex 布局是轴线布局，只能指定"项目"针对轴线的位置，可以看作是一维布局。Grid 布局则是将容器划分成"行"和"列"，产生单元格，然后指定"项目所在"的单元格，可以看作是二维布局。Grid 布局远比 Flex 布局强大。
4. 我确认我的串讲主题了, 不讲 组件化了, 这东西 老生常谈 感觉没什么新东西. 我还是讲 编程语言, 刚刚确定了一些 子主题:

   1. 编程语言的三种阵营 (学术派, 底层派, 应用派)
   2. 编程语言 与 语义学
   3. 决定编程语言所在领域的关键因素
   4. 不同编程语言的不同 IO 模型
   5. 编程语言 与 DSL
   6. 编程语言常见范式: FP OOP 命令式
   7. 编程规范: 防御性编程, SOLID 五大原则, 抽象的颗粒度, API 的优雅设计, 对输入有所限制 对输出包容等
   8. 编程语言的类型系统
   9. 元编程
   10. 如何实现一门编程语言 (利用现在后端的技术 llvm), 以及之前我写过的 Brainfuck 解释器
   11. 编程语言的历史/重要人物/ 可引申出 学多门语言对编程思想的重要性
   12. 常见编程语言的编译步骤 (AST, 中间字节码, 收集数据优化..)
   13. 未来编程语言的设想
   14. 不同编程语言处理异常的不同做法
   15. 内存管理, 常见的 GC 机制
   16. 不同编程语言的工具链/生态
   17. 不同语言下的模式匹配,可用 TS 中的 refer 引出共鸣
   18. 揭秘设计模式 就是一个营销概念
   19. 编程与工程之间的关系, 可以说说 软件工程的知名营销概念
   20. 编程语言与操作系统之间的关系: 现代编程语言 不可避免的复杂性 离不开操作系统的最初设计

   嘿嘿, 主题就叫 漫谈编程语言.
5. 如何看待 QQ 扫描读取所有浏览器的历史记录？ - 360安全卫士的回答 - 知乎 <https://www.zhihu.com/question/439768601/answer/1683922148>

   hah 第二次 3Q 大战\~
6. 分享篇文章:

   MacOS Keyboard Settings and Shortcuts for Coding

   <https://utkuufuk.com/2021/01/17/macos-keyboard-shortcuts/>
7. ![image-20210124124443236](/files/-MRmnHRVXwsTQpGQpMMc)
8. 计算机图形的两种分支: 矢量图形与光栅图形(位图)
9. A: 发现了个有趣的知识: 熵增定律—热力学第二定律 是唯一区分过去和未来的基本物理定律。其他物理定律在时间上都是可逆的。

   B: 巧了 吃饭的时候正在想熵增这个事

   C: 魔法少女小圆好像就是基于这个定律讲故事

   D: 神作 快去看

   A: 啊哦，这么高能的番剧嘛.. 我一直很好奇，信息熵增的事情。

   B: 怎么？ 也是表示混乱程度嘛

   A: 我不是很理解 熵的概念 在信息上的体现.. 我不是很了解 “熵”

   B: 简单的说 3个 bit 就有 2^3 种可能的组合 可以用一个值去量化这个可能性（混乱度）也就是熵

   香农这个人就搞了一系列定义 。。直观的看3 个 bit 的 熵 entropy=log2(2^3) = 3

   A: 也就是说 熵代表的是 信息越多 相互产生的信息就会越多。 熵代表的是这种过程的混乱度？ 而熵增代表的是 这种过程的趋势，并指出不可逆？

   C: 大学信息论学过信息熵

   A: 我感觉 熵指的是是热学中的概念，并且这种概念符合 信息产生..

   B: 可以去了解了解信息论～

   C: 是指的信息除去冗余后的信息量，有个公式 梦回大学课堂

   这些理论通信领域用的多些，计算机领域似乎用的少

   B: b站有个up推荐 YJango 可以看看 机器学习 深度学习 吧

   谁让我tm专业就是这方面的

   A: 感觉计算机越往深学，越离不开物理.. 今天中午一直在看电流的概念.. 我太菜了

   C: 电流。。。我只有在处理手机的功耗问题时，会去看电流数据

   A: 大魔法师无疑了
10. 分享篇文章:

    信息论入门教程 <http://www.ruanyifeng.com/blog/2019/08/information-theory.html>

    A: 总结下: 信息熵 表示随机信息的期望, 果然最本质的语言 还是数学. 它在通信中提供的最重要思想是 编码机制 (大概率信息分配短码), 和霍夫曼编码是一种实现机制.

    我对信息熵的概念 不是很感兴趣.. 大家口中常说的熵 其实指的是 事情发展的混乱趋势..且不可逆的..

    信息熵 与 热学熵 之间的关联.. 就是它们看待的介质不同.. 它们的思想是相同的..

    大家口中常说的熵, 是 熵 在现实事件中的引申意义.. 并不是熵 如果有哪里错误.. 请告知我哈..

    B: 信息论里面的信息熵是香农借鉴的热学熵，去解决通信领域具体的信息传输问题。广义的熵，是个更抽象玄学的概念

    A: 赞同, 我对广义的熵 理解就是 混乱度的不可逆性..
11. 快餐文分享: \
    浅谈移动端开发技术 \
    <https://mp.weixin.qq.com/s/TXBRUVoOBDxr8P9Iw5FpTQ>

    文章花大篇幅讲了 hybrid 在移动端的一些原理

    在移动端 昂贵的不是 触发 render 的次数, 而是通信的次数.

    都说了 还是扩展下吧: web 的性能瓶颈 在于单线程模型, 这就是为什么 react 16 提出了 增量化 fiber 架构 移动端的 hybrid 的性能瓶颈 在于 线程通信, 不过 RN 从一开始就常用的 vdom, 可以将多次修改 增量化
12. 推荐本书: 未来世界的幸存者 \
    阮一峰老师 几年前出的一本书。 里面的很多内容 现在看来也具有价值，建议阅读。
13. 快餐文分享:

    CSS Tips you won't see in most tutorials \
    <https://denic.hashnode.dev/css-tips-you-wont-see-in-most-tutorials>
14. 最近找到了 获取高质量信息 的一种解决方案。就是不再从大量文章中花时间去寻找，而是找书去看。

    这样收获的知识 系统性也很强。
15. B: A，我是前几天看到你的scrcpy-gui项目，对我帮助很大。你有没有尝试过修改scrcpy的源码进行定制化？

    A: 事实上，我一直没有 scrcpy 场景下的需求。

    C: 哈哈哈

    A: 这么说吧.. GUI 软件只有在开发的时候才会打开.. 目前这个项目，已经很久不维护了。

    定制化的需求，我记得 QTScrcpy 有做。 还有一个 WS-Scrcpy 可以把屏幕投放到 web

    B: 好的，我去看看

    我打算自己改写一下scrcpy server端，再调用几个Android framework里的方法，比如powerManager亮度调节色温调节之类的，还有些隐藏的接口可以反射调用

    A: 可以的，我记得 scrcpy 作者写过一些 scrcpy 原理的文章，可以多看看。

    如果是 Android 的话，想做到自动化，也可以借助其他软件，就比如 Tasker autojs 这样 还有 termux

    要是苹果的话，jsbox 还是勉强能用的

    我之前在 我的用户群，看到过一些基于scrcpy的作品，有一些黑产的软件 打开个终端 可以同时控制十多个手机，并且 支持很多人性化定制化的功能。

    这块是存在的市场的，因为目前 看起来挺混乱的。
16. 计算密集与IO密集最本质的差别 就是 计算密集主要在用户态花费时间，IO密集则是在内核态。
17. 分享篇文章:

    圣杯与银弹 · 没用的设计模式

    <https://mp.weixin.qq.com/s/3TbunRkouM7PtCQrC52brQ>
18. 分享篇文章: 「黑客帝国」和「楚门的世界」 <https://mp.weixin.qq.com/s/PVYTfc0KuOkWbf5dJDrVLQ>

    摘要: 算法真的没有价值观吗？不，算法有价值观。 算法的价值观是被某种「成功」所定义的。如果这种成功是最大化股东利益下的商业利润，是更多的用户时长，更好的增长，以及更高效的广告变现

    文中的困局挺好解决，提升自己 摆脱低级趣味就好了。

    相应的结果 是幸福感会降低。
19. 分享篇文章: \
    锻炼你的麦克斯韦妖 \
    <https://mp.weixin.qq.com/s/ORwUC_O9MGdSRjepUFW1xA>

    摘要: 每个人的大脑里都住着自己的麦克斯韦妖，经常锻炼它，它的行动就更敏捷，肢体也更强壮。一旦你的麦克斯韦妖足够敏捷，足够强壮，就有能力解决复杂得多的问题。对羸弱的麦克斯韦妖而言，把气体分子分为快慢两类可能就手忙脚乱、左支右绌了；而对强壮的麦克斯韦妖来说，按速度划分成几十个甚至几百个档次，把各档气体分子分到不同的区域，也丝毫不在话下。
20. 快餐文分享: \
    页面的加载优化方案 \
    <https://blog.serenader.me/ye-mian-de-jia-zai-xing-neng-you-hua-fang-an>

    涉及了一些常见的点，可以简单刷下。
21. 每日一句分享: 一个主任医师需要二十多年才能成长起来，而一名软件工程师在四十多岁已经很难找工作了，这就是大后期和大前期职业的差异吧
22. 垃圾代码编写规范: State-of-the-Art Shitcode Principles

    <https://github.com/trekhleb/state-of-the-art-shitcode>

    建议全文背诵￼
23. 分享篇文章:

    被拆分的身份证

    <https://mp.weixin.qq.com/s/XohlUmqYEVXTyxjPsDm3pA> \
    一个网络包从节点A发到节点B，这个过程中 只有目标IP地址是不变的。
24. Linux 常见的文件类型:
    1. 普通文件
    2. 目录文件
    3. 块设备文件和字符设备文件-外设
    4. FIFO 管道
    5. Socket
    6. 符号链接
25. 程序员的信仰之争： Vim vs Emacs, Tab vs Space - 老莫的视频 - 知乎 <https://www.zhihu.com/zvideo/1293595906412236800>

    我绝对不会与 用空格键而不是Tab的人同床共枕。 hah 太搞了…
26. A: TIL, macOS 在 /etc/pam.d/sudo 里面增加一行 auth sufficient pam\_tid.so 可以给 sudo 加上 TouchID 验证 <https://t.co/spuN1IswF9>

    B: wow 这个好

    C: wow 这下可以彻底忘记开机密码了呢

    A: hah 推荐一款我用了一年多的密码管理器 bitwarden

    目前除了一些银行卡密码，bitwarden 主密码，其他所有账号的密码 我都不需要记\~

    并且 bitwarden 是开源产品，可以自己架服务

    C: 酷

    A: 但是不推荐自己架，应该服务器 存在安全问题￼
27. 快餐文分享:\
    &#x20;🦸‍♂️ 11 JavaScript Tips and Tricks to Code Like A Superhero (Vol.2) <https://dev.to/orkhanjafarovr/11-javascript-tips-and-tricks-to-code-like-a-superhero-vol-2-mp6>

    我喜欢这个片段

    ![image-20210124125848194](/files/-MRmnZpdZznsL_2YPNiE)
28. 快餐文分享: \
    Scoping CSS using Shadow DOM \
    <https://blog.bitsrc.io/scoping-css-using-shadow-dom-a548985b73af>

    使用 Shadow DOM 去隔离 不同应用之间的样式

    应用场景 太适合 微前端了..
29. A: 我有一个小疑问, 你的信息源是如何获取的@C

    B: 啥时候分享一下

    C: 正在做了 因为实在太多了 我准备写篇文章 但是写文章需要大片空白时间..

    可能等到下个双月 我定个 okr ￼

    ![image-20210124130052273](/files/-MRmndVJWJbAiSyH_qbk)

    A: 哈哈哈哈 如何选麻辣烫

    B: 这啥 TODO 软件呀

    C: 微软 TODO 啊.. 看来工作效率介绍 文章是有意义的
30. A: 谷歌的验证是不是利用用户打标签 收集用户数据集 训练ai啊 什么玩意这是

    ![image-20210124130124164](/files/-MRmnfsuk4oGGwKWwyyx)

    B: hah 很有可能

    A: 选斑马线我就没对过

    B: hah 你可能需要换个梯子

    A: 感觉不是梯子问题 感觉他是想让我多测几组 细思极恐

    B: 其实这个还好, 昨天分享的文章 就有提到一个观点, 只要你使用一些产品, 你就成为了产品本身.

    因为很多产品的埋点系统十分强大 全面..

    换句话讲, 一个用户成为了某一个算法神经网络中的一个神经元

    A: 赞同 就像广告系统 推送广告 其实也是为了提供服务
31. 分享个帖子, 太好玩了: \
    个人博客一般怎么增加用户粘性？ <https://v2ex.com/t/746884#reply35>

    下面有个回答是: 得用 python 写，因为...python 号称胶水语言 /doge
32. 分享篇文章:

    JS Bridge 通信原理

    <https://mp.weixin.qq.com/s/cBsmunLXLBEtR14cFfy1LQ>

    可以着重看下概念与前端调用的方式
33. ![image-20210124130335179](/files/-MRmnjZ_FU-Vsri1_rAu)
34. 分享篇文章:

    <https://medium.com/@jaf_designer/why-product-thinking-is-the-next-big-thing-in-ux-design-ee7de959f3fe>

    设计产品时，最应该关注的是 用户最基本的体验，而不是各种特性。这才是一个产品的成功之本。
35. A: 网页上执行粘贴操作，可以把剪切板上的图片显示出来。 Question： 你知道其中的过程吗？最常见的场景就是 github issue 区了

    B: 不走服务端就是 file => base64，走服务端应该是上传到服务器然后再回显

    A: 是的, 是存在这一过程的\~

    我好奇的是 前端如何接受到 图片的数据, 换句话说 剪切板中的图片数据 在前端如何体现.

    C: url 吗

    A: 不是吧..

    C: 哦剪切板。。

    C: 我感觉剪切板是存的图片的路径吧 本地的 或者网页上的url

    粘贴所在的地方（app）做请求资源，渲染，拷贝等操作 我瞎猜的。。

    B: 我猜着是 判断copy事件拿到的值类型 文件类型并且是图片，可以直接转base64 不过图片太大的话base64也有性能问题

    A: 是的, 不过有个口误 应该是 paste 事件 另外, 也不一定需要 上传服务端.. (当然 不限于场景 假如可以转 base64 的话, 直接显示 就好了\~

    好吧.. 我刚刚 google 了下.. 我的好奇点, 其实就在于 event.clipboardData 这个对象中..

    ![image-20210124130519649](/files/-MRmnmeu-UsuzCmSxVHk)

    看来这个问题 好像没什么意思.. 涉及到的原理, 浏览器 api 都提供了, 把魔法都封装好了..
36. A: 分享一个 我今天思考的点.. 这个点是今天团队技术分享时涉及的.. 关于 前端开发模式, 前端生态 为什么这么 suck..

    关键因素在于 , 至今为止 web 没有任何一个巨头 可以领头, 可以成为行业标准..

    不像 Android IOS 这些终端..

    这些终端应用的开发者 只要跟着爸爸走 就行了..

    B: 原生应用开发者应该也要考虑各种厂商机型的适配￼

    A: 没错.. android4 , ios9, ie, 微信内置浏览器, 是每一个终端开发者的恶梦 想想就开心
37. 大半夜的分享一道算法题吧

    题目分享: Mine Sweeper <https://www.codewars.com/kata/57ff9d3b8f7dda23130015fa>

    简述: 给一个二维数组, 里面的特定元素代表的是 扫雷游戏中的一些格子, 就比如雷啊.. 或者 数字啊.. 然后你需要做到是 该盘扫雷能否通关.

    这道题 我去年死磕了两天, 最后通过了大部分的 case, 一直卡在一些奇怪的边缘 case, 结果不得不放弃了.. 我当时的解决方案: <https://github.com/Tomotoes/Kotlin-Note/blob/master/src/Solution.kt>

    有兴趣的同学, 可以做一下这道题 很爽的 (不骗你
38. 分享读到的一个有趣观点，来自阮一峰老师。

    最近，我有一个猜想。

    我们知道，人眼有“视觉暂留”现象：影像消失后，人眼仍能保留影像100毫秒～400毫秒。这就是电影的原理，每秒播放24张图片，影像就动起来了。

    图片

    我就想问，那么有没有“听觉暂留”呢？我们听到的声音是连贯的，有没有可能其实也是一个个分离的片断？

    查了一下，还真有听觉暂留，叫做“哈斯效应”。如果两个声音相隔5毫秒～35毫秒之间，人耳会认为这是一个声音。

    相比“视觉暂留”的至少100毫秒，“听觉暂留”要短得多，最短只有5毫秒，足足相差了20倍。

    我猜想，这会不会跟信息的传输速度有关。视频的信息量比较大，音频的信息量比较小，如果人体神经系统的信号传播速度是恒定的，那么传输视频就会多耗时。为了把所有视频信息传输完，视觉就暂留久一点。

    一个有趣的经验是，4分钟的 MP3 文件（44.1kHz 抽样）体积大概是 4MB 左右，而4分钟的 1080P 视频（H.264编码）体积是 80MB 左右，相差也约是20倍。
39. 好文分享:

    前端架构发展史 \
    <https://tomotoes.com/blog/history-of-front-end-architecture/>

    摘要: 在1990年，Tim Berners-Lee 在他的 NeXT 电脑上部署了第一套“主机-网站-浏览器”构成的Web系统，这标志着前端的开始。 在最初，前端是一片荒芜的，经过浏览器大战，W3C 标准化的过程 前端才慢慢成长了起来。

    这篇文章 读了很多遍, 主要讲了 前端改革 30 年，从一片荒芜到微前端兴起, 很有价值, 并且文笔很好, 推荐阅读.

    本文作者 是我一朋友￼, 狗头
40. <https://usehooks.com/useKonamiCode/> \
    分享一个有趣的 hooks, up up down down left right left right B A 的按键 彩蛋
41. 分享篇文章:

    微前端到底是什么？

    <https://zhuanlan.zhihu.com/p/96464401?utm_source=wechat_session&utm_medium=social&utm_oi=1088870436204318720&utm_campaign=shareopn>
42. 微服务架构（Microservices Architecture, MSA）的出现并非偶然，与这个时代的软件思想、技术工具的发展有着密切的联系。比如，将业务功能服务化，是SOA的延续；RESTful等架构的兴起，让我们可以考虑更多轻量化的通信机制；领域驱动设计指导我们如何分析并模型化复杂的业务；敏捷方法论帮助我们拥抱变化，快速反馈；持续集成和持续交付（CI/CD）促使我们构建更快、更可靠、更频繁的软件部署和交付能力；虚拟化和容器技术的发展，使我们简化了部署环境的创建和安装；DevOps文化的流行及全栈自治团队的出现，使得小团队更加全功能化。这些都是推动微服务架构诞生和发展的重要因素。

    摘抄自 分布式系统常用技术及案例分析 第二版

    A: ￼前段也有微服务了

    B: 是呀\~ 应用复杂性不可避免，所以 系统级的模块化 也是趋势所向。

    如果一股趋势不加以控制，混乱度会越来越高。 “微”服务就是抑制熵增的很好例子\~
43. ![image-20210124130756895](/files/-MRmnvCw4pQTiQjzqRoJ)

    并发出轨可太秀了
44. 每日一句分享： \
    经济发展不一定会缓解贫困，反而有可能加剧贫困，物质进步不仅不能解脱贫困，实际上它产生贫困。虽然经济革命使生产力上升，但它不一定是在底部对社会结构起作用，把整个社会都抬高，反而好像一个巨大的楔子，在社会的中部穿过去。那些在分裂点以上的人们处境上升了，但是那些在分裂点以下的人们被压碎了。

    来自 亨利·乔治的《进步与贫困》
45. Unix 的发明是50年前，1969年。 这50年 人类社会的发展超乎想象。

    30年前，还没有网页，浏览器，搜索引擎。

    中国封建社会可得2000年之久，所以社会进步的根本动力是技术。
46. 不要害怕失败。 \
    人生的最终结果是一个极大值函数（由所有尝试中最成功的一次决定），而不是一个平均值函数。 失败完全可以理解成积极进取的结果，只有生命力充沛的人，才可能会有一次又一次的失败。一味地恐惧失败，只会让自己畏首畏尾，丧失进取心。

    摘抄自 阮一峰老师的散文 -- 被拒绝，也是一种肯定
47. 刚刚读到 unix 联合创始人, c语言之父 丹尼斯·里奇 的故事，让我吃惊。 \
    发明Unix和C语言，给丹尼斯·里奇带来巨大的荣誉，但他始终没有跳槽，一直在贝尔实验室工作，尽管后者多次分拆，到了最后已经名存实亡。2001年，接手贝尔实验室的朗讯公司，决定关闭大多数实验室，许多研究人员纷纷离开，包括Unix发明者之一的肯·汤普森都去了Google，但是丹尼斯·里奇哪里也没去，还是留了下来。2006年12月1日，贝尔实验室被整体卖给了法国阿尔卡特公司，第二年他就选择退休了。 退休以后，他过上了隐居生活，外界几乎忘了他的存在。2011年10月12日，共事20年的同事Rob Pike从加州到新泽西去拜访他，才发现他已经去世了。由于是独居，无法知道准确的死亡时间。
48. 最令你吃惊的事实是什么？ \
    人生只有900个月。

    C: 900个月还少吗

    B: 900个月还少吗
49. 苹果公司的市值等于丹麦（世界第28大经济体）的净资产，用户数量等于中国人口。所以，如果把苹果公司看成一个国家，它将是一个超级大国，对世界人民的生活、政治和文化产生了深远的影响。
50. 分享篇文章:

    Worth Moving to Sweden as Engineers? \
    <https://hongchao.me/living-and-working-in-sweden-as-engineers/>

    一名国人开发者在瑞典的十年回首.

    文中涉及到的很多关于福利, 工作环境的问题 都很现实.
51. 分享篇文章: \
    FIZZBUZZ IN 10 LANGUAGES! \
    <https://iolivia.me/posts/fizzbuzz-in-10-languages/>

    FizzBuzz 是一个简单编程题, 从 1 到 100 的数列中, 遇到3的倍数输出Fizz, 遇到5的倍数输出Buzz, 遇到3与5的共同倍数输出FizzBuzz, 否则输出数字本身

    文中给出了 10种不同编程语言的实现.. 其中 rust 的模式匹配特性 与其他语言格格不入..

    如果是我的话, 我会这么写

    ```
    const solution = () => Array.from({ length: 100 }, (_, i, a = !((i + 1) % 3), b = !((i + 1) % 5)) => a && b ? 'FuzzBuzz' : a ? 'Fuzz' : b ? 'Buzz' : (i + 1)).forEach(i => console.log(i))
    ```


# 24-31

1. 内存对齐 | 原来字段顺序还能影响结构体占用的内存空间

   <https://mp.weixin.qq.com/s/l3T5p_iw3S9nm635ezflGQ>
2. 半月聚合分享:

   2021.01.11 \~ 2021.01.17 思考的价值共产出 71 条信息 <https://thinking.tomotoes.com/archives/2021/1/11-15> <https://thinking.tomotoes.com/archives/2021/1/16-17>

   2021.01.18 \~ 2021.01.23 思考的价值 共产出 51 条信息 <https://thinking.tomotoes.com/archives/2021/1/18-23>

   感谢各位.

   以后每隔总结日, 将会发下近两期的产出信息, 纪录一下.
3. 【分享】：如何发现代码质量问题

   ![image-20210201231815544](/files/-MSTCToheQ3eoDmcoGx3)

   ![image-20210201231825540](/files/-MSTCamo6-p-iggrwpRv)
4. A: CSS 真是我的一生之敌 这东西太不讲逻辑了

   B: 我只会照着设计稿 设盒模型

   A: 哇，这么强的嘛... 我现在连居中都不会

   C: 哇，这么强的嘛... 面试八股文啊

   B: 面试背双飞翼布局，圣杯布局，进来发现用不上

   A: 我那个场景太复杂了，一会等我回家 画出来.. 哈哈哈， 真实

   ![image-20210201231930359](/files/-MSTCd5qz7EbuHgeh8aC)

   我放弃了，太难画了..

   总之，我使用两层 flex(针对不同对齐）+ N个占位元素 + 绝对定位处理边界元素 + 全局最小宽度 overflow auto 支持滚动 处理不同分辨率 搞定了...

   之前的方案是使用 相对+绝对，结果因为这个方案，每次产品验收 都能找出bug.. 最后不得不改写..

   真怀念在 winform 上开发的日子.. 只要拖拖控件，想在哪就在哪..

   B: 移动端这点好，屏幕小，布局不复杂

   A: 是啊，移动端 rem 一把梭
5. 前方的路 - 阮一峰

   <https://book.douban.com/subject/30234758//>

   推荐一本阮一峰老师写的书。

   书是有一个个散文组成的，每一篇散文都给我带来的一些不同的思考与声音，很有价值的一本书。
6. <https://nohello.net/> \
   发现了个有趣的网站，传播的主题 和我们平时反感“在吗(却不说事）” 是一样的。
7. 电脑硬件基本常识

   <https://segmentfault.com/a/1190000039076172>

   涉及到的点还挺多的，可以刷一下。
8. TypeScript 中提升幸福感的 10 个高级技巧

   <https://juejin.cn/post/6919478002925453320>

   快餐文分享，第一条 与 第四条 都是之前没有想过的用法。
9. <https://vole.wtf/coder-serial-killer-quiz/> \
   编程语言创始人 还是 连环杀手，你能选对几个？

   我刚刚玩了一把，不明所以.. 为什么要把 这两种不同的人物画像放在一起…
10. 之前我分享过一个观点： 每一个开发者应该深入掌握两种领域：一个是技术领域，另一个就是技术服务的产品领悟。

    刚刚了解到，原来在业界 早就有领域驱动设计(DDD)的概念了。

    架构设计到底是面向技术还是面向业务？诚然在很多技术人员眼中，架构设计几乎等同于技术架构设计，对架构师的理解也主要关注于对各种技术体系和框架的掌握程度。然而，很多团队并不缺少出色的技术人员，但是产品开发最终还是会以失败而告终。究其原因，在于技术人员往往只关注于技术架构，而对系统设计的其他方面，尤其是对业务的理解缺少足够的重视。 当然，针对不同性质的系统开发，架构设计的工作重点显然也会有所区别。在对“架构设计到底是面向技术还是面向业务”这个问题作出判断之前，我们首先需要明确两点。第一点是我们是不是在做业务？除了专门从事中间件或底层框架开发的少数场景之外，绝大多数的软件开发工作实际上都是围绕着现实中的业务问题而展开。如果面对的是业务导向的开发场景，那么我们就要考虑第二点，即面对复杂的业务逻辑架构师应该怎么办？采用主流的架构设计理念和先进的技术实现体系，对业务的充分理解，并且能够对业务与技术进行整合的能力同样是成为一名合格架构师的必要条件。

    摘抄自 系统架构设计 一书
11. 前端架构：从入门到微前端

    <https://book.douban.com/subject/33477112/>

    准备今天把这本书啃完。 和终端打交道，都能有微服务的概念，可见现在应用的复杂性...
12. 我准备列个7天沉淀计划，学习点感兴趣的技术，或者做点产品什么的。

    上次元旦三天沉淀计划，产出还是不错的..

    计划形式是，列出 7天之内的 todo list，最好精确到天。 然后每天约定时间，一起对一下，及时调整todo，也复盘下进度。

    想参加的同学可以在群里说，或者私信我。
13. 分享篇文章: \
    张小龙把微信8.0做成了丑八怪 \
    <https://www.inneed.club/articles/detail/k3v0qw90xw>

    暴躁老哥从个人角度的吐槽, 说的很挺有道理的..
14. ![image-20210201232313653](/files/-MSTCyvGSqUUHt9V8_el)
15. 分享篇文章:

    漫谈编程语言 <https://tomotoes.com/blog/talking-about-programming-language/>

    本文来自于 我在公司内部的一次分享。 主要简述了编程语言的阵营，语义的表达形式，不同的思维范式，以及常见规范和执行机制。 感兴趣的朋友可以读一下\~
16. 每日一句分享: 人与人的收入不一样，原因不是甲比乙更努力，而是很多外部因素综合起来的结果。 甲拥有的资本、技能和环境条件超过了乙，使得甲所在的层次高于乙。一个餐厅服务员，无论怎样努力，收入恐怕都不会超过基金经理，道理就在这里。 这告诉我们，如果你想真正地提高收入，努力仅仅是一部分的因素，更重要的是，你必须设法提升自己的资本、技能和环境的层次。 你需要的不是"水平方向的努力"，而是"垂直方向的努力"。
17. 构建个人知识体系

    <https://mp.weixin.qq.com/s/aUj1yHHgvDtseDkyHnrKSg>
18. <https://moon.fm/share/episode/3087/>\
    🎙Ep 24. 个人知识管理体系系列 - 内化篇
19. 分享个项目: In-JavaScript-we-trust <https://github.com/yeungon/In-JavaScript-we-trust>

    In JS we trust - The best way to learn is by building/coding and teaching. I create the challenges to help my friends learn JavaScript and in return it helps me embrace the language in much deeper level. Feel free to clone, fork and pull.

    刷了两道就不想看了, js 奇怪的特性太多了
20. 分享两个几乎我每天都在用的 命令行工具:

    1. paulirish/git-open <https://github.com/paulirish/git-open>

    > Type `git open` to open the GitHub page or website for a repository in your browser.

    2\. antfu/ni <https://github.com/antfu/ni>

    > Use the right package manager, 根据你的目录智能 选择 npm 还是 yarn 作为pm工具

    当然用的最多的还是 zsh 的各种插件, 各种 alias, 各种命令行工具..\
    &#x20;这个可以参考下 我的 dotfiles repo <https://github.com/Tomotoes/dotfiles>
21. 分享篇个人文章:

    前端架构发展史 <https://juejin.cn/post/6923779473053581320>

    之前分享过一次, 不过那次写的比较糙, 这次重新润色了下, 并添加了微前端架构的使用场景..
22. 分享一个有趣的项目

    How to exit vim <https://github.com/hakluke/how-to-exit-vim>

    hah :call libcallnr('kernel32.dll', 'ExitProcess', 0)
23. 分享个项目: \
    gpu.js <https://github.com/gpujs/gpu.js>

    GPU.js is a JavaScript Acceleration library for GPGPU (General purpose computing on GPUs) in JavaScript for Web and Node. GPU.js automatically transpiles simple JavaScript functions into shader language and compiles them so they run on your GPU.

    底层是使用的 webgl 调 gpu

    智能硬件，gpu 并行计算，这些领域都有待挖掘..
24. 题目：假如给你一个新产品，你将从哪些方面来保障它的质量？

    参考答案： 可以从代码开发、测试保障、线上质量三个方面来保障。 在代码开发阶段，有单元测试、代码Review、静态代码扫描等； 测试保障阶段，有功能测试、性能测试、高可用测试、稳定性测试、兼容性测试等； 在线上质量方面，有灰度发布、紧急回滚、故障演练、线上监控和巡检等。
25. ![image-20210201232434466](/files/-MSTD41qJC787wJugCRs)

    ![image-20210201232440149](/files/-MSTD6KkndJ0E64aGUoR)
26. 编程语言的关键词个数: \
    <https://github.com/e3b0c442/keywords>

    ![image-20210201232452774](/files/-MSTD8PCuvSU97G8EKyN)

    甜得齁人的C#位居第二 107 关键词 大道至简的 Golang 25 关键词
27. 分享一款应用： \
    responsively-app \
    <https://github.com/responsively-org/responsively-app>

    可以在多种不同尺寸的终端上 调试页面
28. 分享篇文章：

    You-Dont-Need-Loops <https://github.com/you-dont-need/You-Dont-Need-Loops>

    文章讲述使用 函数式范式来处理数据的例子， 非常建议阅读，会培养你的编程思维。

    文章外的讨论： 使用 for 循环 必然要引入 其他状态，且还会隐藏意图，这通常不是一种很好的实践。

    但函数式也是有明显的问题， 如果编译器没有自动尾调用优化， 很容易造成调用栈溢出的问题，

    我记得之前和一朋友讨论过一个场景， 就是数组求和。

    通常情况下，如果没有接触函数式编程的同学，很可能写出面条式的代码：

    ```
    let total = 0
    ​
    for(cont el of list){
      total += el
    }
    ```

    上面的代码， 就引入 total 这个完全没必要的状态， 所以的意图都藏在了 for 循环中。

    而建议的场景是 list.reduce((t,o)=>t+o)

    可以在拓展下， pointfree 编程原则。

    之前不知道各位还记得 聊 js 初始数组的时候，我提到过一次。

    在纯 FP 的语言中，是不存在赋值语句的，FP 是非常排斥 无关上下文状态的出现。

    如果想遵循 pointfree ，那最好有很多可以组合映射数据流的工具，也就是FP中的Functor。

    举个例子:

    ```
    const getLongestWordLength = R.pipe(
      R.split(' '),
      R.map(R.length),
      R.reduce(R.max, 0)
    );
    ```

    A: pointfree 的 point 是什么

    没必要的状态，就是上文中的 total
29. 分享篇文章：\
    &#x20;You-Dont-Need-Lodash-Underscore \
    <https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore>

    文章介绍了常见的 工具函数的JS实现，有兴趣的同学可以刷一下。


# 2020


# 12


# 25-31

1. 快餐文分享:

   Ruby 3.0.0 Released

   <https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/>

   迭代了近5年的Ruby 3.0 发布了, 主要的提升聚集在三方面: 性能 并发 类型

   Matz(作者) 声明 Ruby3 比 Ruby2 快3倍.

   性能方面: 主要引入了 JIT 即时编译技术, 算得上几乎所有现代语言的编译器内置功能了

   并发方面: Ruby 的实现居然是 Erlang 的 Actor-model 方案, 这就有点意思了

   并且对于 block 操作, Ruby 还引入了 Fiber Scheduler 设计..

   哈哈, async await 的思想算是现代语言标配了

   其余信息可以查阅上面链接\~
2. 分享一个很有趣的视频

   中国地产第一疑案，武斗抢公章，合同不盖章，兄弟不认账，融创躺中枪

   <https://www.youtube.com/watch?v=es9zFXWc4OM&ab_channel=%E5%86%B2%E6%B5%AA%E6%99%AE%E6%8B%89%E6%96%AF>

   这作者 我也是一路关注过来的, 他的视频都很有质量(起码很用心),很符合我胃口.

   算是除了巫师后, 我最喜欢的一位博主了.

   这个视频内容也很有趣, 时长一小时, 可以吃饭的时候刷, 里面讲的故事是 融绿股权之争, 一场充满“人情味”中国式并购案。
3. Question: 如何在浏览器环境 实现 sleep 函数, 可以给出 异步函数, 同步函数 两种实现方案吗?

   ![image-20201227003510757](/files/-MPZDcVwby-z1ps9O6Dl)

   Question: 当我执行 同步 sleep 函数,比如 sleepBySync(9e9), 这个时候浏览器 tab 会怎样?

   A: 9e9有点大了。。

   B: hahah 随意啦 也可以 9\_000\_000\_000

   A: 页面啥交互的操作都无效吧

   B: 是的. tab 直接假死..

   A: 异步的这个使用场景是啥呀

   B: 最简单的就是 mock 网络请求过程..

   B: 那假设是在 react支持 concurrent 版本中, 一个事件 里面调用 sleepBySync(9e9), 那页面还会卡死吗

   其实 promise 最有趣的 resolve, reject 这两个函数了, 我一直把他们理解为 异步环境下的 "PV"原语

   可以 把resolve, reject 传到其他异步场景中, 再调用..

   就好比 手动 join 下其他线程, 或者 发出个信号 这样

   C: 好理解

   B: 我根据刚刚的讨论 以及我对 promise 的理解, 写了个限制网络请求数量的demo

   C: 我面字节就考的这个 没答出来

   B: ![image-20201227003647395](/files/-MPZDcW-1FHr6_Ipu4kZ)

   超过限制的request, 会将 resolve 传到了 全局, 等到 resolve 被消费 才会执行(await), 已经完成的 网络请求 会按照顺序消耗 resolve 信号.

   典型的 "PV"原语...

   D: 咦，这个我能听懂

   B: 现在 并发方案 业界, 学术界有挺多不同的模式了..

   就比如 上午我说 ruby3 引进的 actor-model, 还有 golang 的 csp, 以及函数式宗教信奉的通过编程范式 去天然引进并发..

   B: 以下来自我之前的一条微博:

   CSP 模型 和 Actor 模型, 具有相同的设计理念: 通过通信来实现共享内存，而不是用共享内存来实现通信。

   然而它们的侧重点不同，Actor 关心通信的实体（对 OOP 更加友好），CSP关心通信的工具。 如果要选其一的话，我更加欣赏 CSP模型。

   假设通信的数据，可以自我实现状态管理，这样一来就不会被通信双方所约束，消息传递的过程 就可以增加更多的抽象。 目前，业界的 CSP 代表 Golang 结合 Context 包已经实现了这一点。

   C: 但是像JS这样的单线程语言，感觉玩不出多少花样来

   B: 对啊.. 撑死就是借用下 异步 api, 去模拟下 fiber 了...

   谁叫 js 天生单线程呢..
4. A: 我说我的网站怎么日活超5k了..

   原来是被人扫描了..

   ![image-20201227003332069](/files/-MPZDcW2IaYLnw5Q09rN)

   hah 对方一看就是个 新手

   B: 这啥后台啊

   A: Google Analytics 我只接入了 Google tag manager

   如果接 国内的服务, 可以明确查看到 ip 信息的

   就比如百度站长 完全可以.. 但是国内服务 我很排斥..

   除了 我的微博点赞 使用的是 leancloud 国际版, 其他的服务就没有国内的了

   B: 我今天给你微博点赞了 看得到不？

   A: hah 当然

   B: 能看到点赞人的信息吗？

   A: 你觉得呢...

   ![image-20201227003432457](/files/-MPZDcW75JCZv0xhGgm2)

   B: 对的我还看了这个请求。。。没看懂

   A: 点赞信息 只是一个简单的kv store, 存储的地方是 leancloud

   k 就是每一条微博的 ID, v 就是微博点赞的数量 hh

   B: 了解了hhh

   A: 我是一直想开源的, 但我觉得 有这需求的人 好像都没几个..
5. 每日一句分享: 2006年，两名美国学生完成了一个名为"发送阳光"的项目。如果手机发现，你的朋友在天气不好的地方，而你在天气很好的地方，那么手机就会提示你，拍一张照片发送给朋友，让他们振作起来。

   后来，两人当中的 Mike Krieger 创建了 Instagram。
6. 快餐文分享:

   JavaScript: Conditional JavaScript, only download when it is appropriate to do so

   <https://umaar.com/dev-tips/242-considerate-javascript/>

   如何根据终端的配置来进一步优化 UX 呢?这篇文章给出了一些例子.
7. 快餐文分享:

   The headers we don't want

   <https://www.fastly.com/blog/headers-we-dont-want>

   本文不是 HTTP response header 的最佳实践, 而是介绍了 有哪些 field 实质上是没有必要的.
8. 好文分享:

   CSS Utility Classes and "Separation of Concerns"

   <https://adamwathan.me/css-utility-classes-and-separation-of-concerns/>

   摘要: Over the last several years, the way I write CSS has transitioned from a very "semantic" approach to something much more like what is often called "functional CSS."\
   这篇文章介绍了 HTML-CSS 编写的多种范式 以及 各种范式之间的差异与感触.本文的作者同时也是 TailWind CSS 的作者, 值得一读. 说实话 我几乎没有思考过 CSS HTML 之间的依赖, 一直按照文中的第一种 或者 BEM 规范去写, 原来它们之间一直没有做到 关注点分离, 一直存在依赖. 不过 现在 CSS IN JS, CSS Module 方案已经从编译方面打开了新出路
9. ![img](/files/-MPZm_hxmz2O6Zyg36IF)
10. [你不好奇 Linux 是如何收发网络包的？](https://zhuanlan.zhihu.com/p/339698383?utm_source=wechat_session\&utm_medium=social\&utm_oi=1088870436204318720\&utm_campaign=shareopn)

![这帖子绝对是来搞事情的](/files/-MPgIcyNDXoAZSVFOJsG)

<https://www.reddit.com/r/linux/comments/kkv8kq/my_boyfriend_is_very_into_linux_i_know_nothing/?utm_medium=android_app&utm_source=share>

VIM 学习资源分享: \
<https://github.com/wsdjeg/vim-galore-zh_cn> \
<https://www.kancloud.cn/kancloud/learn-vimscript-the-hard-way/49321> \
<https://vimjc.com/page/11/> \
<https://www.jianshu.com/p/42ef98846b11>\
<https://vim.rtorr.com/lang/zh_cn/>\
<https://vimawesome.com/>\
<https://coolshell.cn/articles/5426.html>\
<https://juejin.cn/post/6844903470953136142>\
<https://juejin.cn/post/6844903444164116493> \
<https://juejin.cn/post/6844903469564821511>\
<https://tomotoes.com/blog/order-of-vim-cultivation-cheats/>\
<https://tomotoes.com/blog/grammar-of-vim-cultivation-cheats/>\
还有一本 《 Vim 实战技巧 》--- Drew Neil\
后面两个文章 是我写的, hah 不建议读, 废话太多

```
练习的话, 记得设置下 以下命令在 vimrc
 inoremap <down> <nop>
 nnoremap <down> <nop>
 inoremap <left> <nop>
 nnoremap <left> <nop>
 inoremap <right> <nop>
 nnoremap <right> <nop>
```

快餐文分享: \
Fetch API 教程 \
<http://www.ruanyifeng.com/blog/2020/12/fetch-tutorial.html>

灭霸打响指的源码: DELETE FROM people where rand() < 0.5

快餐文分享:\
[RxJS——给你如丝一般顺滑的编程体验（篇幅较长，建议收藏）](https://juejin.cn/post/6910943445569765384)\
文章很长，大部分的篇幅都是在讲 rxjs 的一些概念与api，并没有结合实际场景，对rxjs感兴趣的同学可以了解下。\
\
好文分享: \
字节跳动“全力跳动”：底层商业逻辑和第二增长曲线分析 \
<https://www.36kr.com/p/1021582816920324>\
摘要:天下武功，唯快不破。字节第一增长曲线的实践也是这一表达的最好证明。然而，物竞天择，适者生存，每个行业有其自身的行业发展规律和最适合的竞争策略。当字节引以为傲的算法、流量和快速商业化的“快模式”无法在有关行业形成降维打击时，遵循行业基本规律的打法可能是更合适的。\
文章写得很有深度，让我更看清了字节的发展上的一些问题，值得反复阅读。

A: 我在reddit看大部分程序员都觉得 pm码不会打几个 还事多\
B: 哈哈，思想不一样吧。他们可能只是把工作当做了工作。程序员除了技术，最重要的能力就是业务能力，产品能力了。\
B: 我的思想转变, 除了自己的工作外 离不开一系列文章, 其中最典型的, 对我启发最大的 就是 于江水前辈 写的 我在淘宝做前端的这三年 的三篇了.<https://zhuanlan.zhihu.com/p/55272391> \
其中有句话一直影响着我.\
业务能力应该是程序员除了技术之外，最具价值的能力，也是最必要的。 因为技术本身很难赚钱，业务落地才能赚钱。 当程序员具备了业务和产品能力，才可能选取业务和技术的折中点，又快又好的支撑业务，带来价值和效益。 懂产品和业务（甚至交互设计）的技术，更容易跟其他工种进行沟通，用通俗易懂的方式介绍技术实现和难度，可以提升在企业中的自身地位和价值。 此外，对于架构师，理解业务也是必备能力。\
A: 嗯...业务能力可能是每个合格打工人的一个必备条件吧 这个时代需要的是跨专业的人才\
B: 是的, 需要的是 通才..  其实 我认识很多同学有一个通病.. 就是给自己设边界..<br>

A: 现在的计算机 应用层 还是有不少潜力的.. 但是底层 沉淀下的基础设施, 很难改变了..\
就比如 http3, 现在一直没有推广开发..\
B: 等一波什么量子计算机出现\
A: 量子计算机 最大的痛点 除了学术上, 还有一点不可忽视, 普通人用不起那东西的.. 只能等 物理 化学届的新突破了.. 之前的计算机划时代的晶体管时代 也是 这样过来的...\
B: 不是出来个什么 “以氮化镓、碳化硅为代表的第三代半导体”

A: 现在 web 智能化 是一个新方向啊..  我听说 去年 双 11 淘宝的活动页 有 79% 都是机器生成的..\
B: 再过十几年AI是不是要侵占地球了hhh\
A: 现在各个公司都有相应的智能化的产品落地了\
那想多了 现在 ai 只是 ai, 只是数学拟合\
如果真正想成为 人工 智能, 那前提条件是 人类把自己研究明白透彻 还可以.. 就比如 人脑科学..\
之前看马斯克的脑机接口项目, 完全可以与 人体 API 相交互, 太酷了\
具体的原理是, 大脑中的芯片 解码 神经中的电信号, 然后 在通过 应用层协议 与 外部相交互.. 关键 就在于 识别电信号了..\
假如说真有 人体 API 就好了... 我会强制让自己跑个 10 公里的, hahah\
B: 人体api假如真出来 可能是全网最长了hh\
C: 怕不是到时候出来一堆伦理问题\
A: 我在想 如果用 linux POSIX API 的设计标准 来设计的话, 那一定很有趣.. 每一次 action 都是一个 进程的 fork , 每次 拉屎 都是 一次 GC..

![](/files/-MPm-S6P3iut-dmkpLY2)

A: 无言以对..  国人的 github trending 一个开源的技术项目没有...\
B: 茅台抢购哈哈哈\
C: ...我对面的今儿早上说茅台抢购,说的原来是这玩意儿\
A: 这算不算技术作恶 违法是肯定的了\
我看了下 源码, 就是简单的爬虫... 连个 IP 池都没提供... 京东风控 怎么搞得... 这不分分钟封掉..\
现在 拼多多的 安全准则就是 宁可误杀 也不让薅羊毛 \
京东真是好兄弟啊<br>

![ 分享下今天 coding 时对 React 的重新思考..](/files/-MPm-mA48BeIFUtRzv0x)

好文分享: \
将 React 作为 UI 运行时 \
<https://overreacted.io/zh-hans/react-as-a-ui-runtime/>\
摘要: \
1\. React 程序通常会输出一棵会随时间变化的树。 它有可能是一棵 DOM 树 ，iOS 视图层 ，PDF 原语 ，又或是 JSON 对象 。然而，通常我们希望用它来展示 UI 。我们称它为“宿主树”，因为它往往是 React 之外宿主环境中的一部分 — 就像 DOM 或 iOS 。宿主树通常有它自己的命令式 API 。而 React 就是它上面的那一层。\
2\. 请记住 React 元素并不是永远存在的 。它们总是在重建和删除之间不断循环着。\
3\. 我喜欢将 React 元素比作电影中放映的每一帧。它们捕捉 UI 在特定的时间点应该是什么样子。它们永远不会再改变。\
4\. 令人讽刺地是，React 并没有使用“反应式”的系统来支持细粒度的更新。换句话说，任何在顶层的更新只会触发协调而不是局部更新那些受影响的组件。 这样的设计是有意而为之的。对于 web 应用来说交互时间是一个关键指标，而通过遍历整个模型去设置细粒度的监听器只会浪费宝贵的时间。此外，在很多应用中交互往往会导致或小（按钮悬停）或大（页面转换）的更新，因此细粒度的订阅只会浪费内存资源。\
\
我喜欢将 React 元素比作电影中放映的每一帧, 它们捕捉 UI 在特定的时间点应该是什么样子。\
这句话很有价值.. 这就是 React 的 render 原理体现.

快餐文分享: \
maybedoer: the Maybe Monoid for Go\
<https://christine.website/blog/maybedoer-2020-05-23>\
函数式编程中 maybe monod 在 Go 中的实现.

补充下 我今天提的微内核的概念..\
在微内核设计背后的思想是，为了实现高可靠性，将操作系统划分成小的、良好定义的模块，只有其中一个模块——微内核——运行在内核态上，其余的模块，由于功能相对弱些，则作为普通用户进程运行。特别地，由于把每个设备驱动和文件系统分别作为普通用户进程，这些模块中的错误虽然会使这些模块崩溃，但是不会使得整个系统死机。\
这个微是真的没发展起来￼.\
微服务是发展起来了.. 但是我觉得 它只不过是对 多个资源的一种使用规范..\
\
每日一句分享:\
并发是有关结构的，它是一种将一个程序分解成小片段并且每个小片段都可以独立执行的程序设计方法; 并发程序的小片段之间一般存在通信联系并且通过通信相互协作； \
并行是有关执行的，它表示同时进行一些计算任务 。\
来自 Rob Pike\
\
快餐文分享: \
浅析 Redis 分布式锁解决方案 \
<https://www.infoq.cn/article/DVAAJ71F4fBQsxmGVdCE>\
在单机中 原子性是锁的保障, 在分布式中 锁的问题又上升了一个层级...

快餐文分享: \
Go语言的设计哲学之三：并发 \
<https://www.imooc.com/read/87/article/2340>\
文中讲了传统语言的并发方案的缺点 如下, 以及 Goruntine 模型的简单介绍.\
摘要: \
并发单元间通信困难，易错：多个 thread 之间的通信虽然有多种机制可选，但用起来是相当复杂；并且一旦涉及到 shared memory，就会用到各种 lock，死锁便成为家常便饭 对于很多网络服务程序，由于不能大量创建 thread，就要在少量 thread 里做网络多路复用，即：使用 epoll/kqueue/IoCompletionPort 这套机制，即便有 libevent、libev 这样的第三方库帮忙，写起这样的程序也是很不易的，存在大量 callback，给程序员带来不小的心智负担。\
nodejs deno 在底层全是用的 epoll/kqueue/IoCompletionPort 这套机制 , 只不过在应用层 nodejs 使用的是 libuv, deno 使用的是 Tokio..

快餐文分享: \
5 Recommended Tools for Optimizing Performance in ReactJS \
<https://blog.bitsrc.io/5-recommended-tools-for-optimizing-performance-in-reactjs-29eb2a3ec46d>\
文章列举了检查 react performance 的一些工具: \
1\. React 提供的 Profiler 组件 \
2\. React Developer tools plugin \
3\. why-did-you-render \
4\. Chrome Devtools - Performance timeline

快餐文分享: \
来自新时代的 CSS \
<https://mp.weixin.qq.com/s/pPtzhXbAaXfoTV2q3u0Dww>\
文中列举很多关于 CSS 现在发展的一些技术 特性. \
1\. css 命名规范, 遗憾的是 文章只提了 结构与样式分离的规范: BEM, 应该扯扯 构建函数单元的 css 命名规范 \
2\. 简单介绍预处理器: less sass stylus \
3\. 发展了很多年也没有声音的 CSS Houdini, 还不如说 css in js \
4\. postcss, postcss 之于 css 就好比 babel 之于 js \
5\. css module: 没说清楚.. \
6\. stylelint 规范工具 \
7\. postcss-preset-env 的规范: cssdb

![如此语义化, 看着就赏心悦目..](/files/-MPr5C_IKAjwnEHAbrfC)

![https://www.reddit.com/r/ProgrammerHumor/comments/kn04bb/wholesome/](/files/-MPr5NBIyRWDv5m2FLlU)

\
多个CPU的原子操作通常通过总线锁或者是缓存锁实现，意思就是当某一个核读取一块内存或者是缓存的时候。CPU会拉低系统总线或者是缓存的电平，这样其他核就无法读取被锁定的区域，这样就实现了资源隔离，从而解决并发冲突问题。\
硬件层面上的原子操作机制。\
\
几年前，我为一所大学的 IT 部门工作。\
一天，我收到统计系主任的电话，他说他们的电子邮件最多只能发送500英里（800公里），比500英里更远的地方，就发送不过去。我差点一口咖啡喷出来。\
我试了一下他们的邮件服务器，居然是真的。我发到纽约（420英里）可以成功，发到普罗维登斯（580英里）就失败了。这怎么可能呢。\
这时，我发现他们的邮件服务器是 Sendmail 5，而不是当时已经广泛使用的 Sendmail 8。我问了一下管理员，确认最近进行过一次服务器升级，但是 Sendmail 版本被降级了。\
他们原来的配置文件是为 Sendmail 8 写的，有几项会被 Sendmail 5 重置为0，其中有一项是连接到远程服务器的超时，也就是远程服务器被设为零延迟，否则连接就会断掉。程序实际执行的时候，0超时是按3毫秒计算的。一旦3毫秒之内，没有收到远程服务器的答复，就认为邮件无法发送。\
我快速计算了一下，光速在3毫秒的前进距离，正好是500多英里。

快餐文分享: \
Introducing: The Async Cookie Store API \
<https://medium.com/nmc-techblog/introducing-the-async-cookie-store-api-89cbecf401f>\
摘要: Are you sick and tired of weird ways to get cookies fromdocument.cookie ? Hate it that you don’t know whether the cookie you set was actually saved or not? Introducing: Cookie Store API, available on Chrome version 87!\
有生之年系列.


# 17-24

1. 发现了个有趣的 Mac native 命令，在 terminal 下执行 `say "Hello World`, 会有小姐姐出现。

   ![image-20201224232922604](/files/-MPZDcF-TmeF5ILOffUk)
2. 每日一句分享:

   最近读到了一段话，引起了我的思考。 "工作对于人生至关重要。它提供了收入，身份和意义，失业的创伤仅次于亲人的死亡。"

   我完全同意这段话。因为我父母的人生就是这样，上了一辈子的班，如果把工作的部分去掉，就没有其他值得一说的东西了。 对于许多人来说，人生就是围绕着工作。上学是为了找工作，毕业是为了上班，等到退休不上班，就已经是晚年了。万一失业，生活顿时就崩溃了，就像上面的引言说的，收入、身份、意义瞬间都没了。

   我今天想说的是，这种"工作型人生"已经过时了。要是现在你还把上班当作人生的主轴，是一件很危险的事情，因为失业的风险越来越大。 时代变了，稳定的工作越来越少，失业会是家常便饭，人生已经没法依附在某一份具体的工作上了。

   由于经济全球化和技术进步，行业的兴衰正变得越来越快。往往几年时间，新事物就彻底取代了旧事物，比如网络淘汰了报纸杂志，电动车淘汰汽油车，自动驾驶以后会淘汰司机。新行业瞬间崛起，又瞬间衰落，共享单车、P2P 网贷、长租公寓等等都是如此。 这些变化都是预想不到的，根本没法提前准备。上学的时候，我们学习内燃机，怎么可能想到有生之年这个东西会过时，汽车会不用汽油。在技术浪潮的面前，很多行业一转眼都没了，从业人员都得下岗再就业，当代社会的失业可能性比以前大得多。

   所以，已经没法围绕工作而规划人生了，因为工作靠不住了，人生不能押宝在某一份具体的工作上面，风险太大。现在是互联网 + 智能手机 + 云计算 + 5G，未来会变成什么样，没人知道。 我的意思是，我们对人生的预设应该是，一生中会多次改变工作，服务过多家公司，干过各种事情，中间很可能有失业期。 不能像以前那种，以某一份具体的工作或职业作为预设来规划人生。

   人生是一次旅行，不同的工作或公司只是我们沿途投宿过的村庄。它们不是人生的主轴，你不要误以为那是可以定居的地方，大多数人没有这种幸运。 不要再关注能不能找一个好工作/好公司（让你定居），人生的主轴应该是关注能不能实现下面三个目标。

   目的：你的人生想做到什么。 成长：怎么保证自己的技能不断在成长。 人脉关系：你能联系和动员的社会网络有多大。

   链接: <http://www.ruanyifeng.com/blog/2020/12/weekly-issue-138.html>
3. 对 vanilla js 一致很迷惑。。直到 <https://stackoverflow.com/questions/20435653/what-is-vanillajs>

   <http://vanilla-js.com/> 居然还有个官网，还能下载 可以试试 忽悠 boss 专用
4. ![image-20201224233022166](/files/-MPZDcF4Wd-CEYbQLnM2)

   I tried to do a fizzbuzz using modern web platform apis and im terrified that it actually works <https://t.co/SUaYVZAu8j>

   看到这个创意 惊呆了.. 太秀了..
5. 互联网大厂的后端技术栈 - 文西的文章 - 知乎 <https://zhuanlan.zhihu.com/p/103798636>

   文章不错，涉及了大部分概念。
6. [分享8个非常实用的Vue自定义指令](https://juejin.cn/post/6906028995133833230)
7. <https://www.golangprograms.com/go-language/concurrency.html>

   快餐文分享，操作系统中经典案例的Golang实现，Demo 值得阅读。
8. [Node.js底层知识 - 理解Buffer](https://mp.weixin.qq.com/s/8e2xA4PxckzKpZZnyMbAuA)
9. [如何只使用CSS提升页面渲染速度](https://mp.weixin.qq.com/s/aPguK-dZr7JMA-s2OOFyjg)
10. 好文分享: [2020年大前端技术趋势解读](https://juejin.cn/post/6908713513271689224)
11. 快餐文分享: [使用 hooks 的开发模式](https://github.com/dt-fe/weekly/blob/v2/080.%E7%B2%BE%E8%AF%BB%E3%80%8A%E6%80%8E%E4%B9%88%E7%94%A8%20React%20Hooks%20%E9%80%A0%E8%BD%AE%E5%AD%90%E3%80%8B.md)
12. 快餐文分享：

    终于明白了，一文彻底理解I/O多路复用 <https://mp.weixin.qq.com/s?__biz=MzI0MjEwMDMzNQ==&mid=2652517896&idx=1&sn=0ccd0ddf7e0b75094a6843039948692f>

    文章较简单，没有介绍抽象概念，没了解过 I/O 机制的同学可以读一下。

    A: 昨天还看 bio nio aio 感觉好多文章都无法理解

    B: 是的，Java 的 IO 机制 实质上就是 底层 IO 机制 的封装。

    不过现在 IO 机制的思想，已经很难改变了。

    不管是 windows 的 select ，还是 linux 的 epoll ，还是 mac 的 kqueue 实质上都是一种思想 的不同实现。
13. 分享一本朋友最近在看的书： 《如何征服英俊少男》 <https://lady.163.com/photoview/513O0026/47050.html#p=93H0ISUD513O0026>

    摘要：《如何征服英俊少男》是河北人民出版社曾经出版过的一本奇书。这些先辈们智慧的结晶，今天还在指引着求知若渴的青少年朋友。如果能早看到这本书，人生得少走多少弯路啊！

    A: 看了第一章，写的很有道理。有时候 别把性别看太重

    B: 大城市这么开放的嘛

    C: 开放多元

    A: hah 多元兼容 这就是字节范儿
14. 分享一个项目： <https://github.com/type-challenges/type-challenges> Collection of TypeScript type challenges with online judge

    可做 TS 体操
15. [音乐的语言是很糟糕的](http://www.yinwang.org/blog-cn/2020/12/19/music)

    垠神终于发新文章了，这篇文章 乍一读 有很大戾气，但是 我能感受到垠神对语言的思考方式。从一开始 他讨论编程语言，DSL，机器语气，数学以及人类语言的小语种，到现在的音乐语言。他一直是以客观的角度 去看待这些事物，在他心中 没有谁是大牛，没有谁是创始人，这种思维方式 我很喜欢，很受教。
16. Question: React fiber 为了在浏览器环境 做到时间分，片机制 增量渲染，底层借助的 API 是什么？

    Answer: 不是 requestAnimationFrame, 也不是 setTimeout, 是 MessageChannel + postMessage

    ![image-20201224233447568](/files/-MPZDcFADTrD2MEVZ6iT)

    可以看下 上面这张图, 这个相当于简化版本的 react 调度机制实现.

    如果浏览器兼容 MessageChannel(宏任务) 就使用它 来做异步, 否则粗暴点 使用 setTimeout(宏任务)

    之所以使用 MessageChannel + postMessage , 而不是 requestAnimationFrame, requestIdleCallback, setTimeout..

    我还需要在找找具体原因...

    我想起来了, 之前看过一篇文章 1. requestAnimationFrame 如果一帧之内没有剩余时间, 则留到下一帧调用 2. requestIdleCallback 使用在浏览器空闲时才 调用, 这样会造成 渲染单元一直得不到调用 3. setTimeout 懂得都懂..

    找到了一个合适的回答,之所有使用 MessageChannel 做异步机制, 除了上面 API 的缺点外, 它本身的优点在于: onmessage的回调函数的调用时机是在一帧的paint完成之后。react scheduler内部正是利用了这一点来在一帧渲染结束后的剩余时间来执行任务的

```
好像 Vue 中的 nextTick 底层使用的异步机制 也是 MessageChannel

我刚刚查了一下
nextTick 先检测是否原生支持Promise，不⽀持的话再去检测是否支持MutationObserver，如果都不行就只能尝试宏任务实现，首先是setImmediate，这是⼀个⾼版本 IE 和 Edge 才支持的特性，如果都不支持的话最后就会降级为 setTimeout。

这个问题就挺有趣的.. React 的异步是 MessageChannel 宏任务 , Vue 的nextTick 使用的 微任务 , 为什么呢...
```

1. ![image-20201224233406549](/files/-MPZDcFEtu3YVJfkN7wI)

   ​ A: 这条推笑死了, 未来的 React 编程方式.

   ​ B: hahah 未来 react 的全栈吗

   ​ A: 我看到这图的第一想法是, 这敢上线 数据库不分分钟被打穿.

   ​ Dan 发的, 我觉得有可能 hah
2. [React RFC Server Components是什么，有啥用](https://mp.weixin.qq.com/s/7AT5iNaJyRdAKaE3Rr321w)

   A: 这前后端 合久必分，分久必合..

   B: 快进到react全栈

   A: 做个BFF层还是不错的
3. A: 我到字节 最好奇的就是 有很多很多同事 的开发环境 就是使用 mac + 触控板.. 我坚持了一周, 各种效率软件 魔改快捷方式软件 都试过了.. 撑不下去了..

   B: 哈哈哈我也觉得很顺手啊 是时候分享一波你的魔法操作了

   A: 好吧.. 可能 我在 Windows 上的环境 太高效了.. 这点我到没有夸张..

   我除了 各种新知识, 最喜欢探索的 就是 和电脑的交互方式了..

   我平时使用最多的是 WGesture + Chrome 下的 Vimium, crx Mouse Gesture + Seer + uTools + QTTabber + 罗技鼠标宏 + 自己写的 AHK 模拟鼠标脚本..

   对了 主要离不开 wsl2

   C: 推荐用quicker 感觉比utool好用点

   A: 那个 一直被各路推, 我也试了很多次, 找不到解决痛点所在...

   C: 我看到测评m1芯片的出来了，性能好像很强悍，自家os优化贼好，很想换，又舍不得在win辛辛苦苦优化的工作流程

   A: no no no, arm 架构 现在生态还没站住脚呢..

   C: 那估计刚出 恰饭的比较多
4. 之前在图书馆看过一本 7天7数据库的书，里面介绍了多种主流的数据库类型: 按照存储类型分类

   1. 关系型数据库
   2. 非关系型数据库

      &#x20; 基于文档

      &#x20; 基于键值对
   3. 新关系型数据库
   4. 列存储型数据库
   5. 图存储型数据库
   6. 时间序列数据库

   业界代表: 1. 关系型数据库: Oracle MySQL PostgreSQL MariaDB SQLServer 2. 文档数据库: MongoDB 3. 键值对数据库: Redis, Memcache 4. 新关系型数据库 主要用于分布式: TiDB OceanBase Ectd 5. 列存储型数据库: HBase 6. 图存储型数据库: Neo4j 7. 时序数据库: InfluxDB

   其他的区别: 1. 开源/商用 2. 存储模型 3. 单机/分布式 4. 数据库引擎 5. 底层数据结构 6. 搜索引擎 7. 索引的支持 8. 事务的支持 9. ACID 的实现性 10. 是否云产品 11. ....
5. 好文分享: 深度解析 Raft 分布式一致性协议 <https://juejin.cn/post/6907151199141625870>

   摘要: 在分布式系统中，为了消除单点提高系统可用性，通常会使用副本来进行容错，但这会带来另一个问题，即如何保证多个副本之间的一致性？

   文章写得很有深度, 目前 Raft 算法是 CAP 理论中 C 一致性 在业界内的最佳实现, 有兴趣的同学可以读一下 前两章与最后一章, 中间实现细节 可以泛读.
6. 每日一句分享：

   代码注释是一种道歉，为未选择更清晰的名称或更合理的参数而道歉，为代码无法维护而道歉，为不使用知名算法而道歉，为编写"聪明"代码而道歉，为没有良好的版本控制系统而道歉，为未完成代码编写工作而道歉，为留下漏洞或代码中的缺陷而道歉。

   \-- [Uncle Bob](https://critter.blog/2020/09/15/dont-comment-your-code-refactor-it/)

   A: “code tells you how, comments tell you why” 这句也挺好
7. ![image-20201224234657849](/files/-MPZDcFHUzbM_wj8ul1K)

   hah Server Side Rendering
8. ![image-20201224234712461](/files/-MPZDcFIPRcS3sxgwwsK)

   Kotlin 1.4 新推出了一个关键字 tailrec , 可以使用它 去主动编译优化 尾调用的函数. <https://twitter.com/kotlin/status/1341749661175066624?s=20>

   先不提尾调用是什么, 就说说 都 2020 年了, 现代的编译器还做不到 主动优化尾调用嘛.. (V8 做到了,但因为一些问题 不敢主动开启)

   这个关键字很破环我对 Kotlin 的印象..

   它就和 C++ 中的 inline, volatile 代表的性质一样... 这些关键字的出现 是为了弥补 底层设计的缺陷... 之所以 C++ 的定位是偏底层语言, 就因为 它的语法特性 就离不开操作系统那些概念..

   而一个优秀 现代的编程语言 是不应该为用户增加此心智负担的.

   A: kotlin也有inline 还有refied这种类型擦除后再生 给Java擦屁股
9. [【招聘】字节跳动番茄小说招前端工程师/Leader（社招/校招/实习）](https://mp.weixin.qq.com/s/V0Qduc-Gouv3qrTWmEY_tQ)
10. [漫画 | 程序员必须要小心的7个潜规则](https://mp.weixin.qq.com/s/ubzCmQTL7wt9GEoSqueicw)
11. 分享一个最近学到的术语：AB测试

    AB测试是为Web或App界面或流程制作两个（A/B）或多个（A/B/n）版本，在同一时间维度，分别让组成成分相同（相似）的访客群组（目标人群）随机的访问这些版本，收集各群组的用户体验数据和业务数据，最后分析、评估出最好版本，正式采用。

    可以看出 AB 测试 与 埋点系统，数据设计 数据清洗 数据分析统计，CDN 分发（灰度测试）关系很近


# 10

1. 快餐文分享:

   漫画 | 从量子力学到抖音

   <https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665523232&idx=1&sn=4dc7613bb5be208452677485d7e8e7c2>

   量子力学 -> 晶体管 -> 逻辑电路 -> 指令集 -> 汇编语言 -> 高级语言 -> 应用程序
2. 每日一句分享:

   学习编程很酷的一点是，你会同时获得两个专长。一个专长是计算机科学和编程，另一个是需要你来编程的那个专门领域。
3. 分享一个练习 CSS-Flex 语法的游戏

   <https://flexboxfroggy.com/>

   一共24关, 通过写 Flex, 让小青蛙移动到合适的位置 即可过关.
4. 快餐文分享:

   科技反垄断简史：当曾经的勇者成为恶龙

   <https://www.huxiu.com/article/398778.html>

   摘要: 公司的首要职责是为股东创造价值，这并不一定需要创新，更不一定与社会或国家利益一致。如果没有竞争，垄断巨头可以自行决定创新的节奏，以最大化自己的利益。
5. 电子书分享:

   《微服务：从设计到部署》

   <https://github.com/DocsHome/microservices>

   本书是 Chris Richardson 和 Floyd Smith 联合编写的微服务电子书 [**Designing and Deploying Microservices**](https://www.nginx.com/resources/library/designing-deploying-microservices/) 的中文译本，其从不同角度全面介绍了微服务：微服务的优点与缺点、API 网关、进程间通信（IPC）、服务发现、事件驱动数据管理、微服务部署策略、重构单体。

   微服务是一种相对于复杂应用的规范，也是近两年来一直被炒的概念。

   本书从头到尾一直讲微服务的各种细节概念，对微服务好奇的同学 可以读下。
6. A: 我想用 数组的 length 生成一个 union type，比如 length = 4 -> type N = 0 | 1 | 2 | 3，这样有可能吗？

   B: 我有一个绝妙的想法 吃完饭验证一下

   A: 哈哈哈好！

   C: 我看看..

   D: **我也想看哈哈**

   B:

   ```typescript
   type Rua<Arr> = Exclude<keyof Arr, keyof (typeof [])>

   type A = Rua<[1,2,3]>
   ```

   能生成 字符串的union

   A: `type ArrIndex<Arr> = Exclude<keyof Arr, keyof any[]>;`

   C: 受教了\~ 这个思路 牛批\~
7. ![image-20201212211905498](/files/-MPZDc62Q-3_xJeGr9gg)

   A: 分享下 Java8 Functional Interface 的设计

   B: 这就是java8的特性吗

   A: Java 8 最牛批的设计 就是 Functional Interface 了.. 借助它这个概念, 实现 lambda 语法, stream, 函数引用 .. 并且还没有违背 Java 的 OOP 设计原则...

   C: 本质还是个interface嘛 像kotlin那样有函数类型就好了

   A: Java8 内置了 多种 函数接口类型, 平常用 足够了 可惜 Java 只有类是第一成员...

   如果没有 这种设计 , 也不会有设计模式, 依赖注入各种营销术语..

   C: 哈哈哈 确实
8. ![image-20201212212006821](/files/-MPZDc64t3Ez-gqF4BiQ)
9. ![image-20201212212012129](/files/-MPZDc65dZjgszf5tZs8)
10. 发现了个有趣的项目 <https://github.com/itorr/e/blob/master/index.html>

    A: hah 中文编程又前进了一大步

    B: 哈哈哈 我在公司代码还看到了用中文做变量名的 简直惊了

    A: 没有 review 与 规范嘛... 这我不能接受..

    A: 果然 中文编程是未来趋势

    C: 易语言申请出战

    A: 易语言 永远滴神\~

    A: 文言文編程語言 <https://github.com/wenyan-lang/wenyan>

    ![image-20201212212105825](/files/-MPZDc66HGwGAXkazYDW)

    B: woc 好牛逼hhh

    A: 东北方言编程语言 <https://github.com/zhanyong-wan/dongbei>

    issue区笑死我了 完犊子了 == throw error

    B: 哈哈哈 不过我觉得这个和我们母语有关，毕竟不是出生就看英文的，还是习惯用中文翻译一遍hhh
11. ![image-20201212212132061](/files/-MPZDc67jhB-BlzxGk1t)
12. ![image-20201212212136954](/files/-MPZDc68QQSg9MJ0sM2N)
    1. Things you can do with a browser in 2020 <https://github.com/luruke/browser-2020>
    2. 分享一个推: <https://twitter.com/xiqingongzi/status/1336353507167780864?s=20>

       开发者搞项目的一个迷思：关注技术。但除了极少数项目，绝大多数项目都不是靠技术赚钱的。更应该关注的是，产品设计、运营策略、流量来源、转化效率，技术是所有环节中最不起眼的那个。
    3. ![image-20201212212159747](/files/-MPZDc69OYZq0uWKrqan)


# 9

1. 招聘分享:

   <https://mp.weixin.qq.com/s?__biz=MzIzMTIzMTUwOQ==&mid=2650041308&idx=3&sn=3ea75db29bab752362706a6d931a3808>
2. 快餐文分享:

   漫画 | Java小子和C老头儿的硬盘夜话

   <https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665523198&idx=1&sn=206c2ed4035207aaae049aeab8dd83a0>

   A: 多线程学了三套 Windows的方法到Linux下，还得自己研究怎么实现

   B: mingw
3. A: ts枚举可以约束值的选项吗？

   B: type Number = 1 | 2 | 3 | 4 ...

   A: ![image-20201209182027303](/files/-MPZD_zN3EX0ZX91aFRW)

   可选的不是1，2，3 为啥赋值为5还可以啊?

   B: 你对枚举理解错了 你需要 literal type 去约束值 枚举并不是去约束取值的

   A: 那他是干嘛的呀？

   B: 枚举主要代表的是 状态的集合

   ```typescript
   enum Week {
     Monday 
     Tuesday 
     Wednesday 
     ...
   }
   ```

   就像是这样 我知道你现在的迷惑 我想想怎么解释哈...

   A: 好

   B: 你现在不明白的是 状态 与 值 之间的关系...

   A: 不明白上面那个代码为啥不报错

   B: 呃... 是这样的 我在本地复现了, ts 确实没有检测出来, 之所以没有检测 也情有可原, 枚举没有这么使用的...

   一般都是 变量 = Enum.member 而不是等于一个值常量...

   A: 嗷嗷，这样啊

   B: 因为枚举代表的是 状态的集合, 而每个状态 只要有一个 unique 值就好了...

   就好比 给你一个 HTTPStatusCode 算了 给你写下伪代码吧, 这就是枚举平时的用法

   ![image-20201209182208807](/files/-MPZD_zOcDoyEUZy17iz)
4. Golang 主题分享:

   Go2 泛型设计草案更新 <https://v2ex.com/t/733860> 泛型提案终于迭代了.. 个人感觉这次提案的更新 挺赞的, 符合 Golang 大道至简的观念.
5. <https://github.com/home> Github 这个营销页设计的很有水准.. 整体的布局交互, 页面色调 算得上一等作品.


# 8

1. <https://juejin.cn/post/6903456514355232776>

   <http://www.yinwang.org/blog-cn/2017/05/23/kotlin>

   A: 分享两篇关于 Checked Exception 机制的文章，我个人赞同垠神的观点，异常检查没有银弹可言。但也正如掘金郭霖前辈所说 绝大多数的方法其实都是没有抛出异常的。

   业界的其他语言 不管是 Go 还是 Rust，错误处理都一直被人诟病，这也代表了开发的复杂性，有的时候 不能不正视 逻辑下隐含的异常，而各种 try catch , 多返回值，Optional 等各种设计方案 就是为了处理这种脏活出现的。

   的确没有 CE 是方便了开发者，但稳定性，维护性 很难得到保证。

   另，Rust 的错误处理方案 如果你熟悉函数式的话，其实是一套理论..

   相比之下 JS 就像个小孩子... 还是傻了吧唧的那种（缺乏类型系统）..

   B: rust的错误处理我觉得还挺优雅的 比go高到不知道哪里去了

   B: ce设计初衷没问题 强迫程序员处理错误 但是程序员都比较懒

   A: 懒惰才是第一生产力
2. <https://www.instagram.com/p/CIc2oBhAQBP/?igshid=1m9xm8cg43zy>

   主题: 为什么 Java 不是纯 OOP 语言。

   我发现不管是哪种编程范式宗教，只要带上 纯 这个形容词，最后全沦为 white elephant..
3. <https://juejin.cn/post/6903678103483072520>

   本文介绍了 Java 中常见的语法糖，以及糖衣背后的样子。
4. 好文分享:

   编程语言学习心得 （完全版） -- 不要害怕遗忘和混淆

   <https://mp.weixin.qq.com/s?__biz=MzI2MjQ3Njk2MQ==&mid=2247483875&idx=1&sn=4b693ca650cc952fae47fcad7280d612>

   摘要: 很多工程师往往把学习语言的重点放在了学习不同语言的语法上，而忽略了语言背后的思想及适合的应用场景。

   其实对于编程语言的学习，意义最大，收获最大的就是对于编程思想的学习。正如著名的计算机学者，首位图灵奖获得者，Alan Perlis说的那样如果一个编程语言不能够影响你的编程思维，这个语言便不值得学习。

“A language that doesn’t effect the way you think about programming, is not worth knowing.” - Alan Perlis

正确有效的学习编程语言对于我们编程思维的提高有着很重要的影响，即使是去学习的一些暂时还用不到的编程语言。

1. ![image-20201209181417425](/files/-MPZDdHP14p52CzFGp1y)


# 7

1. <https://www.instagram.com/p/CFeevK7g6ES/?igshid=1vfezo09h0sir>

   ![image-20201207230225367](/files/-MPZDbstL_QEOB9Q-rT5)
2. A: copywithin？

   B: <https://es6.ruanyifeng.com/#docs/array#%E6%95%B0%E7%BB%84%E5%AE%9E%E4%BE%8B%E7%9A%84-copyWithin>

   ![image-20201207230254351](/files/-MPZDbsvPc6d92WEKx9l)

   这个API 表示从未用过..

   C: 惊了

   B: 又是一个具有副作用的API...

   A: 好家伙

   B: 每次看到这种API 就头疼，pop,push,shift,unshift,splice,sort,copyWithin..

   我可能被函数式熏陶傻了

   C: 那用immutable.js继续嗨

   B: 哈哈，可以，全都是纯操作\[让我看看]
3. ![image-20201207230402682](/files/-MPZDbsw9qh9_qLysuek)

   【Mannequin.js: An Articulated Mannequin Figure Library】<https://boytchev.github.io/mannequin.js/>

   Mannequin.js: 关节式人体模型库。
4. 每日一句分享: API 是另一种形式的 User Interface。

   ![image-20201207230421457](/files/-MPZDbsxvBxAsBsXvI4m)
5. 分享一本书，读了前两章 干货很多，后面的章节 有兴趣的同学可以实践下.

   <https://weread.qq.com/web/appreader/4a4323f0718ff6824a40316k9bf32f301f9bf31c7ff0a60?wtheme=white&wfrom=app&wvid=244154583&scene=bottomSheetShare>
6. ![image-20201207230440296](/files/-MPZDbsy3wlGruxFKUgV)
7. ![image-20201207230451095](/files/-MPZDbszFwr5c-p3i9By)

   A: \[让我看看]答案是 2

   B: 我和C都觉得是1, 我们答错了

   A: 这道题，确实有点问题

   B: 理解下来感觉像是 形参 被放到 arguments 对象，然后 a 指向 arguments\[0]

   A: 我回去查查资料，我越想越想不明白。

   B: 我也是瞎猜的哈哈哈

   D: 形参不是会和arguments形成映射吗

   A: 可是形参是基本类型啊，不存在引用啊。

   B: 你要是查到资料也告诉我们

   A: 就好比 const arr = \[1] const a = arr\[0] arr\[0] = 2 a === 1 => true

   B: ![image-20201207230614060](/files/-MPZDbt-yJ2_eSH_-ykM)

   ![image-20201207230624797](/files/-MPZDbt062SDqSVat4bZ)

   C: 哇 果然 但是并没有解释到底是如何互相影响的

   A: 嗯，我在查

   D: 严格模式参数不会与arguments形成映射，使用es6默认参数自动使用严格模式

   A: <https://stackoverflow.com/questions/54323086/changing-javascript-functions-parameter-value-using-arguments-array-not-working>

   D: 非严格模式下arguments虽然和参数是两个独立的，但是会形成映射，一个还另一个会跟着改, 对不对，A？

   A: ![image-20201207230741720](/files/-MPZDbt1t3lU6bkAg0s_)

   对，不过有点瑕疵。

   es6 默认参数 是一个语法特性。

   E: 我啪的一声就站起来了奥 马老师发生社么事了

   A: 你说的映射其实可以衍生出两个概念。

   第一个是 arguments 本身代表的是函数内置参数，它是一个对象，类数组。

   第二个是 不严格模式下，里面的每一个数组元素都定义了 getter setter，而这些实现都是 native code，这就是映射的底层。

   所以造成的现象是，在不严格模式时，每次读取arguments，都会代表最新\[修改后]的参数。因为 setter 会同步修改函数栈里的参数。

   而严格模式，只有 getter ，也就是最初传递进来的参数。

   A: 我在找找具体的协议规范。

   A: 学 JS 这一点 一直让我不爽，想找 native code，只能去翻 V8 源码。

   A: ![image-20201207230822031](/files/-MPZDbt2Vso_IigXYOjE)

   <http://es5.github.io/#x10.6>

   “映射”后面的规范标准。

   ![image-20201207230844681](/files/-MPZDbt3UQMTBG43f1Rb)

   D: 哎呀，这大英文

   A: 跟我上面中总结的雷同，只不过我用了 getter,setter 抽象了 share 这个概念。

   A: 没事，如果真遇到 这种面试题，你说映射 以及在严格模式的差异 就行。

   A: 并且要加一句，自己的观点。

   D: 好滴，感谢A的分享

   A: 就比如，修改参数会模糊数据的流向。

   D: 模糊数据的流向是啥意思？

   A: 这个就可以说说了，有些新手没有这个意识。

   假如你解释清楚，面试就十拿九稳。

   大部分的情况下 模糊数据流的情况 就是副作用函数 和 引用类型了。

   说白了，就是 修改了一个引用数据，这就会模糊数据流。

   我觉得，面试的时候是说白话挺减分的。

   最好从更高的抽象去回答问题，让面试官 对你印象深刻。

   C: 面试能回答出这个 可能你就是ssp了

   A: 面试嘛，就是个博弈的过程，要懂得表现的机会，要懂得如何通过小动作装出来，最关键是该懂的必须懂。 面试大忌就是 直接回答问题。 一定要说清楚 问题的背景，其代表的意义，业界的探索，最后再说答案，然后加一两句个人观点。

   A: 总之就是通过表演把答案回答得更丰满，更立体。

   A: 呃，我是菜鸡，这只是我的方法，意义不大。

   C: 感觉还是看硬实力
8. <https://www.v2ex.com/t/732806>

   之前我实习的公司，待遇很棒，有需求的同学可以试试。


# 6

1. 每日一句分享:

   做失败的互联网产品往往具备以下特征: 1、始终免费 2、体量小 3、频次低 4、不刚需 5、可替代方案多
2. 快餐文分享:

   C# Updates for the Absent C# Developer (C# 6.0 and newer overview)

   <https://gamlor.info/posts-output/2020-12-05-csharp-for-the-absent/en/>

   摘要: It has been a while since I actively developed in C#. I mostly worked with C# and .NET during the 3.0 to 4.5 days and I did async/await work very early on, so I skip over that as well. After a job change, I didn’t touch C# for actual work. I mostly just watched the development from the sidelines via news. Today, I take a short look at some features. I will skip a lot and just add some of my highlights tour.

   文章介绍了 C# 6.0 以来的新特性语法。
3. 视频分享：

   【巫师加更】随便聊聊境内股权资本市场，入市抉择，内幕交易和杠杆

   <https://www.youtube.com/watch?v=-N2G6lMJzlk&ab_channel=%E5%B7%AB%E5%B8%88%E8%B4%A2%E7%BB%8F>

   入市：推荐 内幕：扯淡 杠杆：别干

   推荐一个 我每期必看，陪伴他从 0 到 1 的博主：巫师财经 <https://www.youtube.com/channel/UC55ahPQ7m5iJdVWcOfmuE6g>
4. ![image-20201206153751981](/files/-MPZDbmOG5l2TFVQvpTI)
5. MongoDB 等 NoSQL 与关系型数据库相比，有什么优缺点及适用场景？ - 周思远的回答 - 知乎 <https://www.zhihu.com/question/20059632/answer/14981332>
6. 为什么 react 还比 vue 火？ - 阿白的回答 - 知乎 <https://www.zhihu.com/question/51690331/answer/1112468309>
7. 函数式宗教文化:一见Haskell，立刻想到纯函数式，立刻想到Monad，立刻想到范畴论，立刻想到数学，立刻想到自己是小天才。程序员的想象惟在这一层能够如此跃进。
8. javascript为什么不像java一样直接事先编译成字节码然后跑在v8上？ - windliang的回答 - 知乎 <https://www.zhihu.com/question/429597199/answer/1575867910>

   它不是一种语言，而是规定了一种虚拟指令集，可以作为各个语言的编译目标，然后通过wasm的虚拟机运行到浏览器还有其他各个平台中。 对于前端领域，当前Webassembly在某些场景下可以有效提高前端项目的性能，并且可以将C/C++领域的一些优秀的库通过编译直接运行到浏览器中。如果前端遇到了性能的问题，不妨可以考虑下WebAssmbly的方案。

   ![image-20201207225633527](/files/-MPZDbmQ2w_ox3I0kdjR)
9. A: 大佬有在学 haskell 吗？

   C: 哈哈，之前有学过一点

   B: 我发现大佬发的好多梗 知乎上都看过（ 不会关注的都是同一批人吧

   C: 我知乎玩了很多年了，现在关注了近700名前辈\[让我看看] <https://www.zhihu.com/people/simonma-87> 这是我的知乎，只吸收 从不输出.. 之前每次想输出时，都会很在意每一个答案 每一个评论，慢慢得变成一种心智负担，索性 不输出了..

   A: 哈哈 关注了！

   A: 我之前也在学，然后去实习就停了。。看的这个教程 <http://learnyouahaskell.com/>

   C: 巧了，一样 我看的是纸质的趣学指南\~
10. 激荡60年——垃圾回收与Go的选择

    <https://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651442959&idx=3&sn=83882fbdc628e48d054c000d499be4f4>

    与V8垃圾回收有异曲同工之妙。


# 5

1. 每日一句分享:

   不要构建系统，而要构建子系统。 这就像 Unix 哲学：每个工具做好一件事，不同的工具协同工作。


# 4

1. 每日一句分享:

   企业雇佣你，是为了让你帮它们完成某个可以增加收入、降低成本的项目，而不是为了让你追求个人的软件成就。
2. 网站分享:

   Toddler Password

   <https://www.toddlerpassword.com/>

   摘要: Max is 1.5 years old and really enjoys hitting the keyboard randomly on his parents' laptop! He also loves placing his finger tips on the screen and pointing fiercely on things!

   Almost every day Max joins his father in the home office, typing randomly and wild on the keyboard. After a couple of weeks a big random accumulation of characters was created which is expanded every day. This is the basis for this toddler password generator.

   Let him generate a secure password for you in a way no password before has been generated!

   一个随机生成密码的网站, 生成的方式是 通过家里小孩胡乱摁键盘...

   这个创意太可爱了\~
3. 项目分享:

   hutool <https://github.com/looly/hutool>

   摘要: Hutool是一个小而全的Java工具类库，通过静态方法封装，降低相关API的学习成本，提高工作效率，使Java拥有函数式语言般的优雅，让Java语言也可以“甜甜的”。

   之前看过此库的源码, 质量还行, 完全可以用作学习.
4. ![image-20201204153710651](/files/-MPZDbbS1WUTY5CrOjHd)

   图像分享: 新冠 ICU 里 病人与家属做临终告别时用的 iPad。

   为什么许多人对新冠病毒在全世界造成的大量死亡感到麻木，因为对于我们大多数人来说，这场疫情的最惨痛经历是目击不到的。
5. 快餐文分享:

   深入typescript类型系统(二): 泛型和类型元编程

   <https://zhuanlan.zhihu.com/p/96046788>

   摘要: 本文主要讨论Typescript的泛型设计和类型元编程能力。泛型和子类型几乎是正交的两个概念，当然两者也可以配合使用(Bounded Polymorphism)。

   文章 Demo 质量都挺高的，建议刷下。
6. 快餐文分享：

   Uncommon Use Cases For Pseudo Elements

   <https://ishadeed.com/article/unusual-use-cases-pseudo-elements/>

   摘要：Pseudo-elements are in use for a long time. However, there are some uses cases that I feel they are not entirely known across developers. I wrote down this article to shed light on them so they can be used more.

   作者用多个案例 介绍了 CSS 伪类的使用场景。
7. 快餐文分享：

   Windows Subsystem for Linux: The lost potential

   摘要：If you have followed Windows 10 at all during the last few years, you know that the **Windows Subsystem for Linux**, or **WSL** for short, is *the* hot topic among developers. You can finally run your Linux tooling on Windows as a first class citizen, which means you no longer have to learn PowerShell or, god forbid, suffer through the ancient `CMD.EXE` console.

   Windows Linux 子系统（简称 WSL）使得 Windows 可以运行 Linux 程序，但是它有两个版本，并且同时都在开发，简单说，WSL 1 是内核子系统，WSL 2 是 Linux 虚拟机。

   我最近一直使用的是 WSL 2，虽然说 它比 WSL 1 更加稳定了，但是要想在 WSL2 里运行 Windows 的原生程序 还无法做到, 开发环境一直隔离。
8. 快餐文分享：

   中国南北差距已经到了最严峻时刻

   <https://www.huxiu.com/article/397502.html>

   摘要：除京沪以外，南方各城市GDP总量几乎都是相对应北方城市的2倍。考虑到中国城市的庞大体量，2倍已是一个很悬殊的差距。这或意味着，中国南北差距已经到了最严峻时刻。

   大多数北方城市在所有制上高度依赖国有企业，民间经济活力不足，计划经济残余尾大不掉。加之国家对环保要求从严，譬如曾长期跻身TOP 20城市之列的唐山，就是因钢铁去产能和环保限令，跌出了TOP 20。

   虎嗅今日热文。
9. 日常分享 TypeScript 代码片段：

   ```typescript
   type Split<S extends string, D extends string> =
       string extends S ? string[] :
       S extends '' ? [] :
       S extends `${infer T}${D}${infer U}` ? [T, ...Split<U, D>] :
       [S];

   type T40 = Split<'foo', '.'>;  // ['foo']
   type T41 = Split<'foo.bar.baz', '.'>;  // ['foo', 'bar', 'baz']
   type T42 = Split<'foo.bar', ''>;  // ['f', 'o', 'o', '.', 'b', 'a', 'r']
   type T43 = Split<any, '.'>;  // string[]
   ```
10. ![image-20201204183530034](/files/-MPZDbbWup8_NtW_cUC1)

    最近 我真的是被 TS 迷住了...

    ```
    [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth] , 做 递归下降

    Depth extends -1 ? "done" : "recur"  , hash做终止条件

    Arr extends ReadonlyArray<infer InnerArr> 做模式匹配..
    ```

    太酷了.. 打表去做递减, 真是第一次见到 这种用法...
11. A: 各位有什么 vscode 主题推荐一下？\[让我看看]

    B: ![image-20201204184255403](/files/-MPZDbbYa-MMUMk76P-n)

    ​ 我只用这两个.. 一个白天主题 一个夜晚主题\~
12. 招聘分享: \[杭州] \[有赞] 招技术 ，面试流程快，无套路

    <https://v2ex.com/t/732196>

    ![image-20201204184808810](/files/-MPZDbb_D6e7tyzj-cV4)
13. ![Post image](/files/-MPZDbbaUVh2xPwvTdvi)
14. ![Post image](/files/-MPZDbbbgLZzLaowr3gb)
15. ![Post image](/files/-MPZDbbczoWj3JYYtsWS)

    hah 笑死我了
16. ![image-20201204201929908](/files/-MPZDbbeLQXxHqoI3bxu)

    <https://www.reddit.com/r/ProgrammerHumor/>

    reddit ProgrammerHumor 这频道 里面好玩得太多了..
17. 为什么编译器过度优化导致线程安全问题？ - invalid s的回答 - 知乎 <https://www.zhihu.com/question/388121842/answer/1195382979>
18. 高级语言有中断这个概念吗? - invalid s的回答 - 知乎 <https://www.zhihu.com/question/341367635/answer/817583000>
19. 程序员基础掌握得好学新东西真的就快么？ - invalid s的回答 - 知乎 <https://www.zhihu.com/question/332732069/answer/737894772>
20. Redux数据流管理架构有什么致命缺陷,未来会如何改进? - 张立理的回答 - 知乎 <https://www.zhihu.com/question/277623017/answer/1517983092>


# 3

1. CDN工作原理及其在淘宝图片业务中的应用

   <https://www.tuicool.com/wx/faq2Uvm>

   没想到图片业务能如此复杂，需要动态生成，控制缓存..
2. 快餐文分享:

   Defensive BASH Programming

   <https://kfirlavi.herokuapp.com/blog/2012/11/14/defensive-bash-programming/> 摘要: Here is my Katas for creating BASH programs that work. Nothing is new here, but from my experience pepole like to abuse BASH, forget computer science and create a [Big ball of mud](http://en.wikipedia.org/wiki/Big_ball_of_mud) from their programs. Here I provide methods to defend your programs from braking, and keep the code tidy and clean.

   由于 Shell 的糟糕设计, 作者提出了 防御性编程规范...
3. 每日一句分享:

   我们的计算机的知识就像一座金字塔，底层是数学，上面是数字电路，然后是汇编，再往上是操作系统、网络，数据库、高级编程语言、框架等等......

   我们每个人不可能精通这个金子塔的每一层， 但是要掌握、理解构成这个金字塔的核心概念。
4. ![image-20201203135444934](/files/-MPZDc3o-LYn2g3-KdGZ)
5. 计算机科学的先驱 Alan Perlis 给低层语言（low-level languages）下的定义是：

   > “A programming language is low level when its programs require attention to the irrelevant.” \[5]

   如果用一门语言编写的程序**需要处理不相关的东西**，那这就是一门低层语言。
6. 快餐文分享:

   Go-通道用例大全

   <https://gfw.go101.org/article/channel-use-cases.html>

   摘要: 文章详细地解释了通道类型和通道值，以及各种通道操作的规则细节。本文的目的是展示尽量多的通道用例。但是，我们应该知道通道并不是Go支持的唯一同步技术，并且通道并不是在任何情况下都是最佳的同步技术。

   这篇文章 我之前已经读过很多遍了，每次读完都有不同的感受，通过 channel 去模拟并发原语，并天然在语法层面上支持 coruntine，这就是 Golang 的设计魅力所在。
7. 分享一篇刚刚在 V社刷到的帖子：

   突然有点迷茫，关于学历的问题

   <https://v2ex.com/t/731679>

   我看了下这老哥的 Github，star 有 28k 多，可以说技术水平非常强了，并且有6年的工作经验，最近跳槽大厂时 还是因为 学历被卡了。哎，这也太难了。
8. 快餐文分享：

   ECMAScript 双月报告：TC39 11月会议提案进度汇总

   <https://mp.weixin.qq.com/s?__biz=MzI5NjM5NDQxMg==&mid=2247488302&idx=1&sn=6dd21d69db461379c0be9a50929b5b63>

   摘要：这次 TC39 会议是 2020 年度最后一次全员会议。这次会议中没有任何提案争取到从 Stage 2 进入 Stage 3 的共识，也没有提案从 Stage 3 进入 Stage 4。

   我喜欢 proposal-extensions 这个提案，现在的语言早就应该支持 Pointfree 特性了，就像管道似的\~
9. 分享一道面试题：

   ```typescript
   interface Logger {
     time: number;
     asyncLog:(msg: string) => Promise<string>;
     syncLog:(msg: string) => number;
   }

   type Translate<T> = /** 你需要实现的部分 **/;

   // 要求 Translate
   //  1. 提取出为函数类型的属性，丢弃掉其它类型的属性
   //  2. 将函数返回类型调整为形参类型(假定有且只有一个参数)

   // 实现效果如下:
   type T0 = Translate<Logger>;

   // 等价于
   type T0 = {
       // 其它属性被丢弃
       asyncLog: (arg: string) => string; 
       // return 类型被调整为跟 arg 保持一致
       syncLog: (arg: string) => string; 
       // return 类型被调整为跟 arg 保持一致
   }

   const result: T0 = {
       asyncLog(msg: string) { return msg }
   };
   ```

   1. 先实现一个类型可以提取出指定类型，用来筛选出所有为函数类型的属性

   ```typescript
   type FilterTypes<T, U> = {
       [Key in keyof T]: T[Key] extends U ? Key : never
   };

   // 看看阶段性成果
   type T = FilterTypes<Logger, Function>;
   // type T = {
   //     time: never;
   //     syncLog: "syncLog";
   //     asyncLog: "asyncLog";
   // }
   ```

   1. 在 1 的基础上剔除 `never`，取出所有 key

   ```typescript
   type FilterKeys<T, U> = FilterTypes<T, U>[keyof T];

   // 看看阶段性成果
   type T = FilterKeys<Logger, Function>;
   // type T = "syncLog" | "asyncLog"
   ```

   1. 在 2 的基础上我们可以使用 `Pick` 提取出子类型

   ```typescript
   type SubType<T, U> = Pick<T, FilterKeys<T, U>>;

   // 看看阶段性成果，此时我们已经成功提取出了所有类型为函数的属性，满足要求
   type T = SubType<Logger, Function>;
   // type T = {
   //     syncLog: (msg: string) => number;
   //     asyncLog: (msg: string) => Promise<string>;
   // }
   ```

   1. 在 3 的基础上我们再使用 `infer` 将函数的返回类型改为形参类型

   ```typescript
   // 将参数类型作为返回类型
   type ArgAsReturn<T> = {
       [K in keyof T]: T[K] extends ((arg: infer U) => any) ? ((arg: U) => U): never;
   }

   // 我们最终得到了 Translate
   type Translate = ArgAsReturn<SubType<Logger, Function>>;

   // 看看最后效果，满足要求
   type T = Translate<Logger>;

   // type T0 = {
   //     asyncLog: (arg: string) => string;
   //     syncLog: (arg: string) => string;
   // }
   ```

   文中部分示例来自[TypeScript 官网 - 高级类型](https://www.typescriptlang.org/docs/handbook/advanced-types.html)，面试题灵感来自[中国 LeetCode](https://github.com/LeetCode-OpenSource/hire/blob/master/typescript_zh.md?rgh-link-date=2020-04-13T15%3A04%3A56Z)，原题太绕且有 Redux 倾向，因此做了简单改造，基本思路一致甚至更全面。
10. 分享一个代码优化技巧：

    如何将优化双分支的代码？ ![image-20201203162454394](/files/-MPZDc3xg55onZRXDZiz)

    `condition ? A : B` 在大多数弱类型语言中可转换为 `[A, B][condition]`

​


# 2

1. 再见，MySQL !

   <https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665523082&idx=1&sn=49765d7975ad8a2543c9a1140db34b79>
2. Slack 被收购，创新值 277 亿

   <https://mp.weixin.qq.com/s?__biz=MjM5ODQ2MDIyMA==&mid=2650718268&idx=1&sn=cebb9737a17ab7dfb35441dab6ef9b1c>
3. 恭喜您被选为CSDN插件内测用户：点此领取福利

   <https://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650797670&idx=1&sn=d01b39c3737026b8f4c83ad7112dd6d1>

   这也太魔幻了，csdn 官方自己出插件 优化站内广告..
4. LLVM IR指令集能否实现所有高级语言？ - 向往真善美吧的回答 - 知乎 <https://www.zhihu.com/question/432890562/answer/1605900370>
5. 你在java面试中被问过什么让你觉得对方逼格很高的问题？ - 剽悍一小兔的回答 - 知乎 <https://www.zhihu.com/question/53673888/answer/1580644211>

   ```
   M：tomcat了解么

   Y：小时候看过。。现在也喜欢看
   ```

   A: 哈哈哈，笑死了这个哈哈哈

   B: java 和 js 的 **他居然没在逗我**

   C:

   ```
   面试官:Java和JavaScript是什么关系?

   应聘者:雷锋和雷锋塔的关系吧。

   老婆跟老婆饼的关系
   ```
6. 日常分享 TS 代码片段:

   ```typescript
   type Whitespace = ' ' | '\n' | '\r' | '\t'

   type TrimStart<S extends string, P extends string = Whitespace> =
     S extends `${P}${infer R}` ? TrimStart<R, P> : S
   ```
7. 每日一句分享: 从某个角度来讲，孔子就是2500年前创业者，他从鲁国起家，有自己一套idea，然后有一套business plan，他希望怎么治国，但他需要获得支持，在本地没有得到支持他就到处游走，去募资，去获取资源，希望能够把他的idea变成现实去改变世界，这是孔子一生的故事。
8. Deno = V8(JS 引擎) + Rust(标准库) + Tokio(事件模型)

   现在有大厂用 Deno 嘛? 感觉国内 还没有第一个吃螃蟹 的人.. Deno 国内的 没有布道者嘛.. 除了 JJC 偶尔发些文章.. 其他一点浪花也没有..
9. ![image-20201202194022778](/files/-MPZDdGyTs-zbJLJY26a)

   我就简单多了

   ![image-20201202194044134](/files/-MPZDdH-mC-K8QdzXBSS)
10. A: 大佬们都是用什么来写博客的，readme？

    B: ![image-20201203131909783](/files/-MPZDdH1Cb2C7RM6gTUq)

    更新下，现在所以的子项目都是用 react 了。

    我不看重 网站访问速度，日活，SEO权重，所以不一定符合你需求。


# 1

1. 【第 21 期】一个架构师的缓存修炼之路

   <https://mp.weixin.qq.com/s?__biz=MzI5NjcxNDM3Mg==&mid=2247485523&idx=1&sn=fd4c678071da504d474523bc90f4bc2c>
2. 有没有比黑暗森林更黑暗的理论？ - invalid s的回答 - 知乎 <https://www.zhihu.com/question/418127358/answer/1500028870>
3. 每日一句分享: 世界上只有一种真正的英雄主义，那就是看清生活的真相后依然热爱生活。
4. Go 语言：全面分析为什么我们需要泛型

   <https://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651443700&idx=1&sn=1b0c8e0eb989bd3eeebefb613925e700>
5. 漫画 | 前端发展史的江湖恩怨情仇

   <https://mp.weixin.qq.com/s?__biz=MzUyNDYxNDAyMg==&mid=2247487283&idx=1&sn=a8062df3c5cf44e2921fa77919ce5f75>
6. 每日一句分享: 资本家只要钱，不要命，这是我读历史悟出来的 最善良的劫匪。
7. Deno1.6 版本新功能：可将 TS 文件直接编译成 ELF 格式...

   这意味着 Deno 不满足于 只做一个安全的 JS、TS 运行时了...

   可能有同学不太明白这个功能意味着什么，它代表的不只是便捷性，更多的是 Deno 可以让开发者无缝融入 可执行应用的生态中...

   <https://github.com/denoland/deno/issues/986>

   这件事挺可怕的.. 我要去学 Deno 了, 趁 Deno 生态还没起来, 赶紧造几个轮子 蹭蹭\~
8. ![image-20201201152236021](/files/-MPZDczP2t7-muGv4KBj)

   最近 QQ 被人脱库了，找个网站一查，果然自己信息已被暴漏...
9. 故事分享：

   中年程序员这悲催的一天

   <https://mp.weixin.qq.com/s?__biz=MzIyNjMxOTY0NA==&mid=2247487740&idx=1&sn=4699b156a889d5d21e1a9b876b5e4062>

   读完感觉挺无奈的。
10. 快餐文分享：

    彻底搞懂 IO 底层原理

    <https://xie.infoq.cn/article/c3a39fa8476144179d53664fc>

    摘要：谈起IO的模型，大多数人脑子里肯定是一坨混乱的概念，“阻塞”、“非阻塞”，“同步”、“异步”有什么区别？很多同学傻傻分不清，有尝试去搜索相关资料去探究真相，结果又被淹没在茫茫的概念之中。

    文章从底层讲解了下从BIO到NIO的一个过程，着重介绍了IO多路复用的几个系统调用select()、poll()、epoll()，分析了下各自的优劣，技术都是持续发展演进的，目前也有很多的痛点。
11. 快餐文分享：

    篇一 | 想全面了解 Rust 语言 ？ 你想知道的都在这里

    <https://mp.weixin.qq.com/s/F_38SD34nDl7cZYJqZFNww>

    摘要：对 Rust 语言感兴趣，但被网上的各种评价 Rust 语言的观点和看法所困扰，到底 Rust 语言是什么样的一门语言呢？那么看本文就对了。
12. 热文分享:

    互联网巨头正在夺走卖菜商贩的生计

    <https://www.huxiu.com/article/396749.html>

    摘要: 一个社会，应该鱼龙混杂，大要有大的活法，小也应该有小的活路，就像海洋，鲸鱼能活，小鱼小虾甚至海藻单细胞生物也能活，这才叫良好生态，不能只让鲸鱼活下去，而把小生物都淘汰掉。**一个社会，大资本大企业应该干什么？难道是要倾尽它们的力量与小民争利吗？大企业用他们无可匹敌的狼性和富可敌国的资本把升斗小民赖以为生的小生意都抢走，就叫发展吗？社会的进步和发展难道就是钱都被大资本赚走，让无助的个体深陷失业和穷困的泥沼而找不到希望吗？**

    文章点出了 科技发展与社会发展的冲突，就像之前的电商时代，我家附近大多数卖衣服的小店因此倒闭了。 我个人觉得 作者杞人忧天了，社会的进步都是通过淘汰劣质资源产生的，这是无法避免的。
13. 面试题分享:

    LeetCode-OpenSource

    <https://github.com/LeetCode-OpenSource/hire>

    LeetCode 官方面试题集锦，前端同学有空可以看一下。


# 16

1. 快餐文分享:

   社交行为的底层逻辑：六亿人的孤独从何而来

   <https://www.huxiu.com/article/399728.html>

   摘要: 人的一切社交行为，都拥有两个底层逻辑：**一是人性的本质是动物性，二是人类本身具有群体性。**&#x4E5F;就是人类的社交都是在做两件事，要么在寻找配偶，要么在维系关系。

   孤单感，其实是一种包括动物性和群体性的综合感受，这种感受既可能包括了动物性的性欲望，也包括了群体性的认同感。而每个人对于孤独的实际感受不同，则源于个人经历影响所带来的的两种底层逻辑的占比不同。

   文章第一部分讲孤独感的来源, 说得非常好 有理有据, 动物性与群体性 引起我了很多思考.

   第二部分社交压力 有点强求了, 并且整篇文章与互联网产品 并没有多大联系..


# 15

1. 快餐文分享:

   前端工程化 - 剖析npm的包管理机制（完整版）

   <https://mp.weixin.qq.com/s?__biz=MzA3NTM0Njk1Nw==&mid=2247485938&idx=1&sn=8598190147c8fa4cd17eeea0d8c09842>

   摘要: 本文从三个角度：`package.json`、版本管理、依赖安装 结合具体实例对 `npm` 的包管理机制进行了详细分析。

   ![图片](/files/-MPZDb_ZtD4v865gXFlF)
2. 短信息分享:

   Pornhub is removing all videos on its site that weren't uploaded by official content partners or members of its model program, a fundamental shift in the way one of the largest porn sites in the world operates. This means a significant portion of its videos will disappear.

   P站因最近发生的儿童色情事件 及 多方压力, 开始彻底整改视频资源.

   链接:

   Pornhub Just Purged All Unverified Content From the Platform

   <https://www.vice.com/en/article/jgqjjy/pornhub-suspended-all-unverified-videos-content>
3. 招聘分享: \[上海] 米哈游内推 12 月更新～ <https://v2ex.com/t/731744>
4. 快餐文分享:

   Simple Dark-Light toggle with VanillaJs <https://dev.to/vaishnavme/simple-dark-light-toggle-with-vanillajs-2cbj>

   Dark mode designs and functionality that enable to toggle between Dark and Light theme is trending UI/UX Design. So, here's the guide to create Simple dark-light toggle.

   借助 CSS variable 可以很轻松实现 主题切换效果, 但文章比较简单, 主题切换的难点 除了 颜色搭配, 还有 本地配置化加载.

   假如说设置了 dark theme, 持久化了本地, 下次加载是 肯定会经历从 白色到黑色的一个过程, 这是无法避免, 当然 解决方案也有, 比如加一个 全局 mask 在切换主题之前, 或者 分为两个站点..
5. 工具分享:

   <https://github.com/antfu/ni> Use the right package manager

   ![266e6f5e-5e22-4c09-a727-6f3bd60fc2ba](/files/-MPZDb_cYfwz9ZxFZabi)
6. 快餐文分享:

   逃离大厂

   <https://www.huxiu.com/article/399901.html>

   摘要: 我马上就到30岁，我需要生活，需要家庭，但是在公司，生活和工作很难平衡，我只能离职。

   文字很素, 故事很真实, 可能是在贩卖焦虑, 但归根结底还是整个环境的问题.
7. 快餐文分享:

   2020，巨人们的短视频战争史

   <https://www.huxiu.com/article/399708.html>

   摘要: 因为这两家平台和创作者之间的博弈，国内的PUGC视频生态空前繁荣，养活了一大批原创视频创作者，让他们能借助视频获得相对体面的收入，甚至成为了一种新的职业业态，这在以前是从来没有过的。

   文章简单介绍了 国内巨头们的短视频布局, 为了争夺用户时间 在内容化上的行动.


# 14

1. 每日一句分享:

   为了利用多核CPU的计算能力，HTML5提出Web Worker标准，允许JavaScript脚本创建多个线程，但是子线程完全受主线程控制，且不得操作DOM。所以，这个新标准并没有改变JavaScript单线程的本质。


# 12

1. 文章分享:

   <https://github.com/microsoft/TypeScript/wiki/Performance>

   文章汇总了一些能提高 Typescript 编译性能的使用方法和配置技巧。
2. 2020 CSS 现状报告

   <https://2020.stateofcss.com/>

   CSS 在 2020 年使用现状统计，涉及到了 CSS 的一些特性、框架、规范。
3. 今日虎嗅热文分享:

   拼多多突袭支付宝

   <https://www.huxiu.com/article/399413.html>

   摘要: 拼多多自成立就以渗透供应链见长，不论农产品的供应链环节，还是其上游新农人、农业合作社模式，都少不了稳定的金融支持。进入2020年，拼多多开始快速推动金融布局。**支付于拼多多而言不是单纯的通道，更多是协调整体资源，解决上下游环节资金问题、缓解自身增长脚步放缓的必要环节之一。**

   虎嗅最近质量明显下降了.. 好久没分享过虎嗅好文了.
4. 每次一句分享: 操作系统的一个主要功能是提供抽象的接口，另外一个主要功能是管理硬件资源。
5. 快餐文分享:

   多线程那些事，硬核有趣

   <https://mp.weixin.qq.com/s?__biz=MzUxODAzNDg4NQ==&mid=2247487160&idx=2&sn=b3f86df179f5ba65e61fbdf2700a3e23>

   摘要: 用户级线程做不到并发只能并行, 但是，**内核级线程是可以利用多核CPU的，即可以并行**！

   本文通过 聊天的方式 将多个知识点一一道来, 文中干货较多 既涉及到 操作系统的线程模型, 也与 JVM 应用层相呼应, 推荐阅读.


# 11


# 21

1. 框架分享: Tailwind CSS - <https://tailwindcss.com/>

   Tailwind CSS 是一个高度可定制的基础层 CSS 框架，与其它 CSS 框架不同的是，Tailwind 并不提供预先设计好的内建组件。相反，Tailwind 提供了更基础的工具类（utility classes），可以让你直接在 HTML 源码上构建一个完全定制化的设计。

   并且 Tailwind 是我见到各种框架官网中 设计得最优雅简洁的, 看一下官网Demo, 就很想去尝试使用它.
2. 今天看到一则文章 <「编程猫」再获13亿元D轮融资，成为国内少儿编程领域最大的一轮融资> 让我想到了 之前的少儿编程领域的国际巨头 Scratch. Scratch 在中国的发展 就像之前外企在国内的命运一样. 被人投毒, 被人举报, 然后国内copy同样的产品 迅速占领国内市场..

   相关链接: <https://www.36kr.com/p/975848397078276> <https://zhuanlan.zhihu.com/p/225556864>
3. 快餐文分享： Android Developer Roadmap <https://roadmap.sh/android>

   摘要：The intent of this guide is to give you an idea about the Android development landscape and to help guide your learning if you are confused.

   文章介绍了原生Android开发时需要学习的技术栈，不涉及混和开发。
4. 文章分享： 浑水做空YY全文：一个由机器人构成的虚拟王国 <https://www.huxiu.com/article/394887.html>

   摘要： 我们想对百度说：“当你用接近7%市值相等的现金，收购一个完全虚假的业务时，你的尽职调查哪里去了？尽调怎么可能没有发现如此大规模的欺诈行为？如果百度认为自己尊重市场道德与法律，那就让我们看看。”

   浑水继上次成功做空瑞幸咖啡，这次把目标转移到了最近刚被百度收购的YY上。哈哈，直播风口已经过去，泡沫是时候该破灭了。
5. 快餐分享： The Illustrated Children’s Guide to Kubernetes <https://www.cncf.io/the-childrens-illustrated-guide-to-kubernetes/> 用儿童动画的视角，讲述了 服务、Docker容器、K8S、Pod等相关云服务概念。
6. 视频分享： Getting Closure on React Hooks by Shawn Wang | JSConf.Asia 2019 <https://www.youtube.com/watch?v=KJP1E-Y-xyo&ab_channel=JSConf>

   视频讲解了 如何用40行代码去模拟实现 React Hooks 特性。 对 React Hooks 有兴趣的同学可以了解下，其中的原理是使用到了闭包。
7. ![image-20201122150746995](/files/-MPZDb30qFIplU5je2sV)
8. 公共汽车的间隔时间为10分钟，那么平均等待时间应该为5分钟，但是如果进行抽样，你会发现抽样得到的平均时间为10分钟，这是为什么？简单说，原因就是等待时间越长的人，越容易被抽样到。
9. <https://bruno-simon.com/> 这是我见过的最酷炫的个人主页，设计游戏让访客产生互动，自行探索信息，创意极佳。
10. 应用分享： sql-trainer <https://app.bytescout.com/sql-trainer/index.html>

    通过在线关卡的方式 一步一步引导你 如何写出基本的 SQL 语句。 可以花几分钟刷一下，很好玩\~
11. 图片分享:

    Maeklong railway market - Bangkok <https://www.behance.net/gallery/107926937/Maeklong-railway-market-Bangkok>
12. Q: 好像很多编程语言都有hooks hooks是干啥的啊

    A: 呃，react 的hooks 和你常见的hook 并不是一种概念.

    一个是 事件监听的钩子，就好比 观察者模式； 一个是 生命周期的钩子，就好比 Servlet 中的 destroy 方法。

    钩子这种概念不仅存在于 应用层，像底层的 epoll io机制，事件循环 都有相似的概念。

    说白了 hook 就是暴漏给你的signal

    顾名思义，钩子嘛..

    Q: 他是做什么的呢

    A: 它暴漏给你一些入口， 你把逻辑注入进去， 等到合适时机 执行你的逻辑。时机啊，入口啊 这些设计可是很讲究 抽象能力的。
13. 函数式编程是否适用于超大型项目？ - 灵剑的回答 - 知乎 <https://www.zhihu.com/question/340251796/answer/791560176>
14. ![image-20201122151814869](/files/-MPZDb32fNpz90fs1ZFA)


# 20

1. Cache的基本原理 - smcdef的文章 - 知乎 <https://zhuanlan.zhihu.com/p/102293437>
2. 我女儿刚刚学会走路，我是否该在她会识字后就立马教她Python？ - Jason5Lee的回答 - 知乎 <https://www.zhihu.com/question/384252884/answer/1130708274>
3. 如果你们想要自创一个编程语言，你们希望它有什么特色? - doodlewind的回答 - 知乎 <https://www.zhihu.com/question/393746244/answer/1223160359>


# 30

1. ![微信图片\_20201130202432](/files/-MPZDbaUzUsGJ027Pc8b)

   免费送书啦，一人限一本，可私我。

   ![image-20201201134849697](/files/-MPZDbaWE_b7dvzAEDKn)

   还剩这些，想要的同学 私我即可。

   A: 想要也拿不到啊\[裂开]

   B: 给你邮去 包邮，免费送\~

   A: 那我就不客气了 除了英语和数学都要了

   B: 行，那私聊把信息发给我吧\~
2. 怎么深刻理解面向切面编程？ - invalid s的回答 - 知乎 <https://www.zhihu.com/question/61441658/answer/1603120111>


# 19

1. ![image-20201122151223459](/files/-MPZDbk-VqmBZOrsnIvK)
2. ![image-20201122151229577](/files/-MPZDbk2YES7b1GJ4fM7)


# 29

1. 每日一句分享: 不乱于心，不困于情。不畏将来，不念过往。如此，安好。——丰子恺
2. ![image-20201129141341653](/files/-MPZDcGriEA_usJAWV8t)

   A: 马老师发生瑟么事了

   B: 我大意了 没有闪
3. ![image-20201129141405617](/files/-MPZDcGuTohX_5wuhQrt)

   Rust 之父 近日加入了 亚马逊..
4. 快餐文分享:

   现代化 Web 开发实践之 PWA

   <https://www.infoq.cn/article/jS2oC7UgFjdJdgJLdaRs>

   摘要: PWA 具有快速、可靠、粘性的特点。快速即快速响应，通过独立的线程进行资源缓存，提高页面的加载时间；可靠指在不稳当的网络环境下， App 也能瞬间加载并展现内容，在离线环境下也提供用户有效反馈；粘性则是通过沉浸式的用户界面、桌面图标、消息推送等手段来增强用户的粘度。

   字体跳动团队的一篇软文，前言介绍的不错，后面实践部分有点浅了。
5. 网站分享:

   分享几个我经常刷的图像网站:

   1. <https://www.behance.net/>
   2. <https://unsplash.com/>
   3. <https://www.pexels.com/zh-cn/>
6. 视频分享:

   【FunnyCoder第0期】非科班前端老司机从2K到40K之路

   <https://www.bilibili.com/video/BV1cV411Y77T>

   收获最重要的一点是: 学习是终身的任务，这是个漫长的过程 也是一个值得付出的过程。
7. 快餐文分享:

   2万字20个实例解析Java8 Stream，带你玩转集合四大点！

   <https://juejin.cn/post/6900424495937355783>

   大家可以看看文中 demo，去体会 stream 背后的意义。

   stream 代表得正是 命令式编程与函数式编程的差异。

   而我经常发现很多同学 coding 时没有此抽象能力。

   就比如，我想求一个数组的和，命令式代码如下：

   ```javascript
   const getSum = arr => {
       let sum = 0
       for(let i = 0 ; i < arr.length; i++) {
           sum += arr[i]
       }
       return sum
   }
   ```

   函数式代码如下：

   ```javascript
   const sum = arr.reduce((a,b)=>a+b)
   ```

   看起来，函数式代码更短小，但demo的意义不在于此。

   我想表达的是，很多时候 完全不用把行为的逻辑分为一个个“原子”操作。

   这样会增加心智负担，并且维护性也不好。

   有很多行为可以抽象一个原子，当这些行为可组合起来时，收益将是无穷的。
8. ```typescript
   export type JsonObject = {[Key in string]?: JsonValue};
   export interface JsonArray extends Array<JsonValue> {}
   export type JsonValue = string | number | boolean | null | JsonObject | JsonArray;
   ```

   三行代码定义 json schema 简直酷毙了
9. ```typescript
   export type Split<S extends string, D extends string> =
   string extends S ? string[] :
   S extends '' ? [] :
   S extends `${infer T}${D}${infer U}` ? [T, ...Split<U, D>] :
   [S];
   ```

   我突然明白了 TypeScript String Template Type 的意义了，原来是在类型系统是 实现了一套模式匹配... 远不止修饰 key 那么简单，哇哦。 TypeScript 给我太多惊喜了...
10. 字面类型与类型系统 天然冲突。 以后我们不使用 TypeScript 编程，而是使用 Type 编程 - JJC
11. 人物分享: 安德斯·海尔斯伯格（Anders Hejlsberg） <https://baike.baidu.com/item/%E5%AE%89%E5%BE%B7%E6%96%AF%C2%B7%E6%B5%B7%E5%B0%94%E6%96%AF%E4%BC%AF%E6%A0%BC/2152925>

    1960年12月出生于丹麦哥本哈根，曾在丹麦科技大学学习工程学，计算机科学家。Turbo Pascal编译器的主要作者，Delphi、C#和TypeScript之父，.NET(dotnet)创立者。

    <https://www.welcometothejungle.com/en/articles/anders-hejlsberg-microsoft-career> 安德斯大叔的一次访谈, 讲了他做过的项目初衷.
12. ![image-20201129213020631](/files/-MPZDcH-FP-yTwVCon2H)
13. ```javascript
    class Counter extends HTMLElement {
      #xValue = 0;

      get #x() { return #xValue; }
      set #x(value) {
        this.#xValue = value;
        window.requestAnimationFrame(this.#render.bind(this));
      }

      #clicked() {
        this.#x++;
      }

      constructor() {
        super();
        this.onclick = this.#clicked.bind(this);
      }

      connectedCallback() { this.#render(); }

      #render() {
        this.textContent = this.#x.toString();
      }
    }
    window.customElements.define('num-counter', Counter);
    ```

    <https://github.com/tc39/proposal-private-methods>

    JS 私有变量的提案已经通过, 现在又来了个 私有方法提案...

    每次看到 这个`#var` 就头疼, 太丑了吧..

    这设计得毫无美感可言...


# 18

1. 快餐文分享:

   为什么阿里巴巴这一次能扛得起 11 亿的流量？没有发生崩溃！ <https://mp.weixin.qq.com/s?__biz=MjM5NTg2NTU0Ng%3D%3D&mid=2656616259&idx=1&sn=d981ce87c2898bc333e5476310bc060d&chksm=bd5de9e68a2a60f0d48baf17e4aca89ca6cbfbcd78b11dc0289972c679261265b7d23d8b0369&scene=0&xtrack=1#rd>

   这篇文章是去年淘宝架构演进文章的升级版, 可当成饭后甜点阅读..
2. 深入理解 Typescript 高级用法 <https://github.com/hannq/ppt-share/blob/master/courseware/ts-advance-usage/README.md>

   摘要: 有人说 Typescript = Type + Javascript，那么抛开 Javascript 不谈，这里的 Type 是一门完备的编程语言吗？

   文章用多个案例, 展示了 TS 面向 Type 编程的特性.. 目前 TypeScript 不只是 带有 Type 的 JS 了.. 其类型系统 已经演化得十分强大... 所有编程语言都远不及..

   但是这样这么强大的类型系统, 真的有必要吗? Type 只是一种重要的上下文信息, 在 coding 时, 应该追求简单明了的类型建模, 而不应为了 Type 增加心智负担, 照这样下去, 免不了要 debug Type... 那就多少有点魔幻了..

   现在 TS 的发展已经趋向于是两种语言的融合: 一种是 JavaScript, 另一种是 <加粗>Type<加粗>Script...

   ![image-20201122151800661](/files/-MPZDb3TYr1DpK9KFpE-)
3. 好文分享:

   clean-code-typescript <https://github.com/labs42io/clean-code-typescript>

   教你如何写干净的代码, 文章中的思想,技巧 总结得还是很全面的. 另: 学习不要被编程语言限制, 要有个做科学家的心.
4. 故事分享: 空气币操盘者口述：租豪宅、坑学妹，我割韭菜狂赚2000万元 <https://www.36kr.com/p/973051916872963>

   摘要: 现在的社会，不是你赚别人，就是别人赚你，年轻人没必要和钱过不去。 人的一生有无数个成为混蛋的机会，我只是紧抓了其中一个。

   来自 36Kr 的一篇故事, 写的还不错, 赌博之前请搞清风险.
5. ![image-20201122150449343](/files/-MPZDb3U5QHszlmNq68c)

   上图来自 2020.8.5日 Telegram 创始人 Durov 谈 美国 ban TikTok.

   其中有句话让我印象很深刻: If you want to access the markets of other countries, you should also open your market to them – that would be fair.
6. ![image-20201122150510146](/files/-MPZDb3VMxkUIrXpR2Ff)
7. ![image-20201122150516492](/files/-MPZDb3WWlV2Rpr9drjI)
8. ![image-20201122150524404](/files/-MPZDb3XAbe4bZ_b8BCG)

   我写了一段伪代码 关于用户的登录逻辑, 其中有一片段是判断 密码是否一致, 如果一致 则成功登录, 如果不一致则拒绝登录.

   此判断密码一致的代码片段 存在很大的安全问题, 有人知道吗?

   ok, 如果没人想回应, 那我继续说了, 在后端开发中, 这样判断密码一致的逻辑是很容易被黑客攻击的.

   这种攻击叫做 记时攻击, 我举些例子 让大家理解.

   1. 长度不一致

      数据库 用户原密码: 123456789

      hacker 输入的密码: 123456

   当运行到 判断密码一致 的逻辑时, 因为两个密码长度不一致, 直接返回 登录失败响应.

   1. 长度一致

      数据库 用户原密码: 123456789

      hacker 输入的密码: 12abc456

   当运行到 判断密码一致 的逻辑时, 因为两个密码长度相同, 会进入到 for 循环逐个字符 判断, 当遍历到 3 与 a 时 应该相应位置的字符不一样, 返回 登录失败响应.

   这两个例子 被攻击的关键原因 是因为 它们都提前返回了.

   可不要小看 这个 提前返回, 当hacker 使用大量输入 去测试登录接口时, 是完全可以分析到 正确的密码长度, 当然这个过程需要去掉很多网络噪音.

   陈皓叔 有篇文章 很好地讲解了 分时攻击的细节. <https://coolshell.cn/articles/21003.html>
9. 据报道称“浏览器内核有上千万行代码”，浏览器内核真的很复杂吗？ - 龙泉寺扫地僧的回答 - 知乎 <https://www.zhihu.com/question/290767285/answer/1200063036>


# 28

1. 快餐文分享：

   An ex-Googler's guide to dev tools <https://about.sourcegraph.com/blog/ex-googler-guide-dev-tools/>

   摘要：In many ways, the dev tools inside Google are the most advanced in the world. Google has been a pioneer not only in scaling their own software systems but in figuring out how to build software effectively at scale.

   文章讲述了 作者（sourcegraph 创始人）离开 Google 后的感受：因为无法带走Google的基建，只能去找替代品，但 Google 之外的世界还远不够...
2. 面试题分享:

   reactjs-interview-questions

   <https://github.com/sudheerj/reactjs-interview-questions>

   摘要: List of top 500 ReactJS Interview Questions & Answers....Coding exercise questions are coming soon!!

   前端同学可以有空刷一下, 此项目 star 近 9k 是我没想到的..
3. ![图像](/files/-MPZDc2VVETNfpfOvQ1A)
4. Objective-C 语法上有什么优点吗？ - doodlewind的回答 - 知乎 <https://www.zhihu.com/question/24115153/answer/1597551264>
5. ![img](/files/-MPZDc2YBfEkNx_QyUJG)

   图片分享: Ruins-14-abandoned-Abandoned-house <https://www.behance.net/gallery/107115063/Ruins-14-abandoned-Abandoned-house> 阳光依旧，但已人去楼空。
6. 快餐文分享：

   抱歉，“大数据杀熟”无药可救

   <https://www.huxiu.com/article/396137.html> 摘要：假如我平时浏览服装和宠物用品时间比较多，那么某宝在给我推荐这类产品时，需要推荐相似但性价比高的产品，因为花费了较多时间，会产生“价格敏感”——因为常用，我会对这些商品价格区间更为熟稔。反之，当我突然开始浏览平时不怎么看的产品，比如机械键盘，男生球鞋，且浏览时间不长，那么算法就会倾向于推荐价格较高的产品。

   资本永远是逐利的，学会了算法，丢掉了信任。
7. 快餐文分享：

   张一鸣背后重要的五个人

   <https://www.36kr.com/p/985827657521801> 今日头条早期的融资故事，可以见得 在国内无论多么牛x的产品也需要投资人带路。

   如果没有资本注入，很可能在早期就死掉。
8. 每日一句分享:

   孙正义时间机器理论: 所有美国兴起的东西，在未来几年后都会在日本兴起，从发达国家到相对不那么发达的国家。
9. 无意间刷到了篇垃圾文章, 真是被恶心到了..

   ![image-20201128150537157](/files/-MPZDc2_T_DCv2Gdm-jC)

   如此妖魔化的产物 说成 中国在世界上的科技创新...

   正是因为这些巨头, 这些傻X产物, 让国内的互联网不再互联.

   现在国内的互联网就是一个个孤岛..只知道增强壁垒, 吸引流量, 他们应有的责任义务 早抛掷脑后了..
10. 一图看清 Linux 权限说明

    ![img](/files/-MPZDc2bSXStQ43jCDMz)

    在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。

    * 当为 **d** 则是目录
    * 当为 **-** 则是文件；
    * 若是 **l** 则表示为链接文档(link file)；
    * 若是 **b** 则表示为装置文件里面的可供储存的接口设备(可随机存取装置)；
    * 若是 **c** 则表示为装置文件里面的串行端口设备，例如键盘、鼠标(一次性读取装置)。

    接下来的字符中，以三个为一组，且均为 **rwx** 的三个参数的组合。其中， **r** 代表可读(read)、 **w** 代表可写(write)、 **x** 代表可执行(execute)。 要注意的是，这三个权限的位置不会改变，如果没有权限，就会出现减号 **-** 而已。
11. 知识分享：

    chmod: 改变文件权限

    文件权限有两种设置方法，一种是数字权限，一种是符号权限。

    Linux 文件的基本权限就有九个，分别是 **user/group/others(拥有者/组/其他)** 三种身份各有自己的 **read/write/execute** 权限。

    1. 符号权限方式：

       `chmod [-R] [u,g,o] [+,-,=] [文件或目录]`

       `-R`: 目录下的所有文件都会变更

       user/group/others(拥有者/组/其他) 分别对应的缩写为 u,g,o

       `+` 代表增加权限，`-` 代表删除权限，`=`代表设置权限

       例：`chmod u=rwx,g=rx,o=r 文件名`
    2. 数字改变权限方式

       各权限的分数对照表

       * r:4
       * w:2
       * x:1

       rwx = 4 + 2 + 1 = 7

       wx = 2 + 1 = 3 rx = 4 + 1 = 5

       rw = 4 + 2 = 6

       `chmod [-R] xyz 文件或目录`

       `-R`: 目录下的所有文件都会变更

       xyz : 就是刚刚提到的数字类型的权限属性，为 rwx 属性数值的相加。

       例：`chmod 777 .bashrc` => -rwxrwxrwx
12. 好文分享:

    收割者：腾讯阿里的20万亿生态圈

    <https://www.huxiu.com/article/392908.html>

    摘要：十年时间，阿里、腾讯已各自铸就10万亿市值生态圈。**一个腾讯或阿里，就相当于一座一线城市的资本能量。**&#x800C;构建如此庞然大物的投资组合，**主要目的是布局产业生态。**

    **在中国的创业人群中，流传着一句话，创业离不开三种结局，生，死和BAT。**&#x9047;上A和T，金钱与流量，是对创业者最好的投喂。阿里和腾讯，则可以强化自身的流量入口地位。中国成为全球互联网应用最发达的国家之一，与二者的示范、扶持不无关系。然而，如此之高的富人占比，不由让人思考，这一互生互促链条，是否带来了创富机遇的内卷？

    通常意义上，竞争，比垄断，带来更多的创新。而创新，才能最本质地创造消费者福利。财富，则是对创新的一种激励机制。如果巨头剑指之处，创富机遇也呈集中之势，创新生态也可能变形甚至扭曲。

    深度好文，捋清了国内互联网企业局势以及巨头的战略布局，值得阅读。 前不久市监局发布了《关于平台经济领域的反垄断指南（征求意见稿）》，下一次市场变革拭目以待。
13. 招聘分享： 字节跳动客户增长北京前端研发： 校招/社招/实习， 有意向的小伙伴把简历发过来呦，可以发简历到我的邮箱：<3137252538@qq.com>, 或者公司邮箱地址： <wangshicheng@bytedance.com>, 建议投递到我的私人邮箱，可以及时回复，希望大家可以找到满意的job
14. 快餐文分享:

    TypeScript 高级技巧

    <https://juejin.cn/post/6844903863791648782>

    文中的 demo 都挺有趣的。
15. 代码片段分享: JS 利用 Symbol.iterator 实现遍历器

    ![image-20201128212044766](/files/-MPZD_WHTvrbAD7mDsxA)

    为什么 ES6 要给 JS 添加诸如 Python 那样的魔法函数呢..

    魔法函数: JS obj\[Symbol.属性] Python `__func__`

    C++ 运算符重载 Kotlin 后缀中缀函数表达式

    诸如此类 可以改变默认行为的特性..

    C++ 和 Kotlin 我倒是可以想象到使用场景, 当实现内部 dsl 时很有用

    但 ES6 中的各种Symbol属性 提供的自定义函数, 真是多此一举了.. 我找了很多资料, 就没发现一个有意义的demo... 都是为了用而用..

    反正 JS 莫名其妙的设计挺多的, 也不缺这一个..

    ![image-20201128213106040](/files/-MPZD_WIF34bkkEFAaKo)

    ![image-20201128213109783](/files/-MPZD_WJkAEcaSDZUizM)

    JS 完全可以借助 Proxy 实现内部DSL! 太酷了\~

    ![image-20201128213230810](/files/-MPZDc2lvJjfIboicdxc)


# 17

1. 进来看看，TypeScript居然还能这么玩 - 晓黑板前端技术的文章 - 知乎 <https://zhuanlan.zhihu.com/p/296277982>
2. [漫话：如何给女朋友解释什么是Linux的五种IO模型？](https://juejin.cn/post/6844903687626686472)


# 27

1. 每日一句分享:

   浏览器起初只是一个简单的远程文档查看器，后来被迫成为一个应用程序平台。由于浏览器一开始没设计为这个用途，后来互联网的诸多问题都是这个事实造成的。
2. 快餐文分享:

   php8 发布 <https://www.php.net/releases/8.0/en.php>

   摘要: PHP 8.0 is a major update of the PHP language. It contains many new features and optimizations including named arguments, union types, attributes, constructor property promotion, match expression, nullsafe operator, JIT, and improvements in the type system, error handling, and consistency.

   PHP无论怎么更新，给我感觉还是一如既往的丑，设计得毫无章法。
3. 快餐文分享：

   The Few, the Tired, the Open Source Coders

   <https://www.wired.com/story/open-source-coders-few-tired/>

   摘要：But open source success, Thornton quickly found, has a dark side. He felt inundated. Countless people wrote him and Otto every week with bug reports, demands for new features, questions, praise. Thornton would finish his day job and then spend four or five hours every night frantically working on Bootstrap—managing queries, writing new code. “I couldn't grab dinner with someone after work,” he says, because he felt like he'd be letting users down: *I shouldn't be out enjoying myself. I should be working on Bootstrap!*

   文章以 BootstrapUI 作者 Thornton 为例，描述了 在没有资本背书的情况下 开源工作者的现状，很残酷也很无奈。开源代表的就是一份责任，如果没有一个良好的反馈机制，很难走下去。
4. 每日一句分享: 2005年的一天，伊利诺伊州的一位母亲注册了 Flickr，上传了自己孩子的一些照片，然后忘记了这个帐户的存在。 多年以后，这些孩子的照片被发现存储在一个数据库中，用于训练世界最复杂的一些人脸识别的智能系统。
5. 好文分享:

   和死神赛跑：趁父亲还在世，我想用人工智能留住他

   <https://mp.weixin.qq.com/s/yVcCRpIrCN-O8eekJYNzmw>

   摘要: 机器人应该永远以我父亲的口吻说话吗，还是应该有的时候停止扮演父亲的角色，承认它是计算机？机器人应该知道我父亲患有癌症吗？

   这是一个真实且感人至深的故事，文章翻译得很好，值得阅读。
6. 快餐文分享：

   A nice app on Elm street

   <https://madewithlove.com/using-elm-with-react-a-nice-app-on-elm-street/>

   摘要：Elm is both a language and an architecture – it is a functional, compiled to JS, strictly-typed, immutable and pure, opinionated language to build web applications.

   Elm 是 Facebook react 开发团队近些年推出的编程语言，是一种构建 web 应用的方式。

   其设计思想以及语法特性 与 Haskell 很相近。

   说句不好听的，这种学术派的产物 就算有大厂背书也很难推广到实际业务。

   Haskell 的命运我们都看到了，除了狂热粉一直在吹捧，其他连点浪花都没有。
7. 快餐文分享：

   The Eco-Programmer's Guide

   <http://john.mercouris.online/eco-programmer-guide.html>

   摘要：Emissions from CPUs a big a problem. Due to the nature of software scaling, small performance increases lead to massive differences in power consumption and global CO2 emissions. 文章呼吁开发者 为了更好的环境，更少的排放，应停止使用 Electron 等构建HTML5应用的技术。
8. 之前积累过的环保观点：
   1. 4G 上网的二氧化碳排放比 WIFI 上网高4～7倍。
   2. cloudflare 公司宣布，新推出的 Bot fight 功能所释放的二氧化碳，将通过种树弥补。根据计算，一个 CPU 内核每年释放8公斤二氧化碳，而一棵树吸收21公斤二氧化碳，因此计算量每新增2.5个 CPU 年，该公司将种植一棵树。
   3. 训练一个大型 AI 模型会排放近30吨二氧化碳，相当于5辆小汽车终身的二氧化碳排放量（包含制造期间的二氧化碳）。
9. 每日一句分享：Web 2.0时代最大的思想革命本质不是前后端分离，而是把网页当作独立的应用程序（app）。前后端分离只是实现这一新架构的必然结果。
10. 快餐文分享:

    New language features since Java 8 to 15

    <https://advancedweb.hu/new-language-features-since-java-8-to-15/>

    文章介绍了 Java 8 - 15 版本以来的新特性，并附有代码。
11. 书籍分享：

    introduction-to-bash-scripting

    <https://github.com/bobbyiliev/introduction-to-bash-scripting>

    书中介绍了 Shell 的基本语法特性，并用多个案例带你实战。

    虽然此书一共才122页，但内容很全面，由浅入深。值得阅读。


# 16

1. 好文分享:

   连字节跳动都“扶不起”的那些产品，长什么样？ <https://www.huxiu.com/article/393849.html>

   摘要: 目前字节跳动已经被验证成功的产品，被外界归结为“图文内容/短视频—AI推送—广告变现”的商业模式，算法、流量、组织能力、高效率商业化，是其被反复验证的四大优势，也是它攻城略地的杀手锏。

   文章列举了 字节失败过的产品, 并阐述了 字节的布局战略, 产品变现方式.
2. 好文分享:

   Inside look at modern web browser

   <https://developers.google.com/web/updates/2018/09/inside-browser-part1>

   该系列由 Google 技术专家编写, 分为 4 个部分: 第一部分讲了 现代浏览器的架构. 第二部分讲了 页面导航时 浏览器内部发生的活动 第三部分讲了 浏览器如何渲染一个页面 第四部分讲了 浏览器处理事件时的动作

   非常建议 前端同学花点时间 阅读下该系列文章的, 是很有帮助的.
3. V8 运行 JS 的过程

   1. 源代码(source code) 通过解析器(parser) 解析后 生成抽象语法树(AST)
   2. 抽象语法树 通过 解释器(interpreter-Ignition) 生成了字节码(bytecode), 此字节码作为基准执行模型, 字节码等同于 25%-50% 机器码大小. 并且 此时抽象语法树被彻底清除掉了, 释放其内存空间.
   3. 生成后的字节码 直接被 解释器执行 (解释执行),
   4. 在代码不断的运行过程中, 解释器收集到了很多可以优化代码的信息, 比如变量的类型, 哪些函数执行的频率较高.
   5. V8引擎的编译器(compiler-TruboFan) 会根据这些信息和字节码 来编译出经过优化的机器代码

   一些常见的优化规则:

   * 函数只是声明未被调用, 那么该函数不会生成到 AST
   * 函数如果只被调用一次, 字节码则直接被解释执行了
   * 如果函数被调用多次, 可能会被标记为热点函数, 会被编译成机器代码
   * 随着不断执行, 会有越来越多的代码被标记为热点代码, 然后被编译成机器码.

   所以 JS 运行的过程 正是一个从解释执行到编译执行的过程.

   ![image-20201122150314021](/files/-MPZDdpIrL_pC1LKh-9I)
4. 用户进程在系统中运行时，大部分时间是处在用户态空间里的，在其需要操作系统帮助完成一些用户态没有特权和能力完成的操作时就需要切换到内核态。那么用户进程如何切换到内核态去使用那些内核资源呢？答案是：1) 系统调用（trap），2) 异常（exception）和 3) 中断（interrupt）。
5. ![image-20201122150247031](/files/-MPZDdpKKG69BDsYWuDx)
6. ![image-20201122150252900](/files/-MPZDdpLiMreBACgO57f)

   C# 判断一个字符串为空的写法...


# 26

1. 快餐文分享：

   万字长文：谷歌进入到退出中国市场的前因后果

   <https://coffee.pmcaff.com/article/AOQv8yeYkR>

   摘要：李开复后来在《AI·未来》中表达了他在谷歌中国时的困境。“我们发展每一项新功能，都要与总部打一场硬仗，这让我们动作迟缓，也让我们精疲力竭。许多谷歌中国的员工厌倦了和总公司的斗争，沮丧地离开了。”

   无论多么牛逼的外企 在大陆都很难有容身之地。哪怕是Google，微软这种巨头。
2. 图片分享:

   <https://www.behance.net/gallery/106497393/Walking-the-Dog>

   ![img](/files/-MPZDbhlAfA0Rx1JbIe4)


# 15

1. 昨天看到了一篇很好的文章, 关于如何更好地写 React。

   今天翻译了下，值得前端同学 一读。

   <https://tomotoes.com/blog/7-code-smells-in-react-components/>
2. 哇 我发现了一个宝藏 up 主 , objtube的卢克儿 下面是他的一个视频: 【干货】浏览器是如何运作的？

   <https://www.bilibili.com/video/BV1x54y1B7RE>

   讲的很不错, 有空可以看看
3. 前端学习路线 : <https://objtube.github.io/front-end-roadmap/#/>
4. 分享一篇在虎嗅看到的好文: 中国互联网反垄断简史 <https://www.huxiu.com/article/393669.html>

   有句话让我印象深刻: 投资人问他，“美团拼多多阿里都在做这事，你拿什么跟它们打？”他答不上来。仔细琢磨之后，他放弃独立发展，打算找某个巨头融一笔钱，借助巨头的资源，抓住时间窗口迅速把项目做大，然后卖给巨头套现。
5. 好文分享:

   市面上各大JS引擎 内存系统的设计 <https://mathiasbynens.be/notes/shapes-ics>

   阅读完之后发现, 虽然 JS 可以从语法层面直接定义一个对象, 但是底层的存储设计 还是根据对象的结构 ,去设计出对应的template 来存储数据的.
6. 作为前端，工作中处理过什么复杂的需求，如何解决的? - 孟健的回答 - 知乎 <https://www.zhihu.com/question/362103682/answer/1024196584>
7. Martial desgin 之于 Google， 就好比 Cupertino design 之于 Apple 不过现在 Apple 又推出了新的版本： Big Sur。 相比之下 Windows 更像是一个缝合怪，平面设计与 Fluent Design 共存。
8. ![image-20201122150208414](/files/-MPZDbi5KdarCoR2Sg8A)
9. 为什么现在又流行服务端渲染html？ - Damon DanceForMe的回答 - 知乎 <https://www.zhihu.com/question/59578433/answer/332545815>
10. ![image-20201122151631637](/files/-MPZDbi7UoVTG0a4L6jS)

    C# 求 斐波那契数列

    多返回值的设计很好, 但 为什么还要支持 返回键名引用..

    我猜测 多返回值 在内部的类型就是一个数据类....

    甜得齁得慌..

    我最欣赏的两门语言 Go, Kotlin, 在我看来他们的设计者才真正的懂语言..

    其他语言 就像是各种特性的缝合怪..
11. 最难调试修复的 bug 是怎样的？ - doodlewind的回答 - 知乎 <https://www.zhihu.com/question/21991014/answer/1513267624>


# 25

1. 快餐文分享: M1 暴打 Intel？——x86 与 ARM 的爱恨情仇 <https://blog.liangyueyong.cn/p/b013.html>

   摘要: 事实上，CPU 做的事情很简单也最核心，简单来说就是接收指令+运算。CPU 和千千万打工人一样，首先要有正常的**工作能力**（即执行能力/运算能力），然后又有足够的**逻辑能力**（能明白做事的顺序），最后还要有一定的**理解能力，能听懂别人的话**（即指令集），才能正常工作。而把这些**集中在一起**就构成了所谓的「**架构」**。你可以将「架构」理解为一&#x5957;**“工具”、“方法”和“规范”的集合**。
2. 好文分享: A Brief Notebook on Cryptography <https://davidlowryduda.com/a-brief-notebook-on-cryptography/>

   摘要: Recall the basic setup of cryptography. We have two people, Anabel and Bartolo. Anabel wants to send Bartolo a secure message. What do we mean by “secure?” We mean that even though that dastardly Eve might intercept and read the transmitted message, Eve won’t learn anything about the actual message Anabel wants to send to Bartolo.

   文章讲述了密码学的历史发展, 以及现在常用的RSA非对称加密原理, 并都给出了代码实现, 非常建议阅读.
3. ![image-20201126104734266](/files/-MPZDbcJ69U3BGoL_AJQ)


# 14

1. 分享一篇我今天看的好文, 值得前端同学读. <https://3perf.com/talks/web-perf-101/>

   摘要: This is an introduction to the modern web loading performance. Learn why performance is important, what performance optimizations exist and what tools help to understand if your app is doing well.
2. java 1.8 的 nio 在windows、linux、macosx、solaris上的实现分别用的是select、epoll、kqueue、poll。
3. sql 在我看来最大的优点 就是 语法层面上 设计 偏自然语言，就比如 select name from student。
4. 在你的认知中 数据库索引 是什么？ 数据结构。
5. Kernel 内核 在计算机科学中是一个用来管理软件发出的数据I/O（输入与输出）要求的计算机程序，将这些要求转译为数据处理的指令并交由中央处理器（CPU）及计算机中其他电子组件进行处理，是现代操作系统中最基本的部分。

   而Shell 就是内核的"外壳"

   A shell is a program that prints a prompt, reads a line of input from you, and then interprets it as one or more commands to manipulate files or run other programs. Before the invention of the GUI, the shell was the primary user interface of an OS.
6. 前端Question: 如何判断一个函数 是箭头函数 还是 function 定义的函数.

   答案是 箭头函数是没有原型链的, 也就是 prototype 属性为空

   还有一种方式，箭头函数无法实例化，可以 在try catch 中 new func() 捕获异常，有异常就是箭头函数
7. 简历中 技术能力熟练度参考表 了解：见过名字 熟悉：看过文档 掌握：用过 熟练：调试过 精通：准备过面试
8. [Linux系统调用详解（实现机制分析）](https://mp.weixin.qq.com/s?__biz=MjM5NTEwMTAwNg==\&mid=2650234968\&idx=2\&sn=ac66f50ab865f063b86620c970c029df\&chksm=befe60798989e96fb5083482a41c85c248b460fcf0514a4f64bf8099aa6a4537d27caab31676\&mpshare=1\&scene=1\&srcid=11142yPKPW3WuUYBzuK3EokC\&sharer_sharetime=1605363487361\&sharer_shareid=765a226e8a94a0d2fa33e57e9363afac\&key=29a501fbe6d282a45bd111ba4fd954778d62b6559d909de6d8ddffe3b99a817ec3bd844d3ddfeb6a0c9f0df941e9e0ab5c92fc5a0ca1e95c79b8c47b9432d7e537e9827500d98eb0ce7a767187579ab865692be105a2492c53cccd3eedef92c375f62e613c5bc641dd6785b8418b580d95b01794c12abfadc571983b57639ba7\&ascene=1\&uin=MzA1OTU5NTc0\&devicetype=Windows+10+x64\&version=6300002f\&lang=zh_CN\&exportkey=AxzKkI9tPkDQa0lLx3WZmw0%3D\&pass_ticket=SgzS0tNZCexKGAoYVX6Ti8IwGWyAv%2BQfFRa5bUFUlvkEAgmSXJ03rdvqroRZOQYI\&wx_header=0)
9. ![image-20201122151623196](/files/-MPZDaPZDdYgIZ1voQfU)


# 24

1. 好文分享：

   一个名字叫“喂”的女人

   <https://www.huxiu.com/article/391585.html>

摘要：李新梅记得，妈妈的枕头下面总是横放着一把刀。有时候是水果刀，有时候是剪刀，刀柄朝向床外，刀刃向内。

这是一个真实动人的故事，催人泪下。

1. 每日一句分享： 群友: 为什么我的室友码代码的时候时常要发出"嘶..嘶"的声音? 沙雕群友: 因为他在写 python
2. 图片分享：

   ![图像](/files/-MPZDc0vn81AXjS8vzIa)
3. 招聘信息分享：

   \[上海]错过这班车你还要再等多久？字节跳动前端架构团队需要你

   <https://v2ex.com/t/726846#reply34>
4. 短信息分享: 财联社11月24日讯，根据彭博亿万富翁指数显示，马斯克的净资产升至1280亿美元，超越比尔·盖茨，跃升成为全球第二大富豪，仅次于亚马逊创始人贝索斯。
5. `const React = state => view`
6. TypeScript 设计中的最大槽点就是支持鸭子类型。

   ![image-20201124113306313](/files/-MPZDc0xL-JuAMAE5C6d)

   每次看到具有该特性的代码, 都令我无法忍受.

   在我看来 这种设计只有坏处:

   1. 上下文更难以分析, 数据会无意间具有另一个身份（Type）
   2. 更难以追踪接口, 只能借助编辑器
   3. 与静态类型的原则相违背
7. 快餐文分享：

   1.2W字 | 了不起的 TypeScript 入门教程

   <https://juejin.cn/post/6844904182843965453>

   基础的语法，知识点都有提到。

   一份不可多得的 TS 学习指南（1.8W字） <https://juejin.cn/post/6872111128135073806>
8. 快餐文分享：

   The Tech Stack of a One-Man SaaS

   <https://panelbear.com/blog/tech-stack/>

   文章列举了作者搭建私有分析服务项目时所用到的技术栈，很全面并都有相应介绍。
9. 快餐文分享：

   每个开发者都应该知道的 SOLID 原则

   <https://mp.weixin.qq.com/s?__biz=MjM5MTA1MjAxMQ==&mid=2651241242&idx=1&sn=e51b1519bf59ad6793567f5d81b915f7>

   1. 单一职责原则
   2. 开闭原则
   3. 里氏替换原则
   4. 接口隔离原则
   5. 依赖倒置原则
10. 女拳主义与 Github 的故事 <https://github.com/CNwoman-bot/evil-man>
11. 招聘信息分享: \[社招] \[校招] 字节跳动前端后端招聘 <https://v2ex.com/t/728851#reply0>
12. Spring是否代表着目前Java技术的顶峰，未来的Java将如何发展？ - 大宽宽的回答 - 知乎 <https://www.zhihu.com/question/387902282/answer/1198090641>
13. 会不会出现不同编程语言的使用者对同一个的概念理解不一致的现象？ - 大宽宽的回答 - 知乎 <https://www.zhihu.com/question/366449539/answer/981637860>
14. 为什么 Java 坚持多线程不选择协程？ - 大宽宽的回答 - 知乎 <https://www.zhihu.com/question/332042250/answer/734115120>
15. 为什么只有Java多线程有可见性问题？ - 大宽宽的回答 - 知乎 <https://www.zhihu.com/question/330803860/answer/724901797>
16. 编程究竟难在哪？ - 大宽宽的回答 - 知乎 <https://www.zhihu.com/question/311432227/answer/681616817>
17. 函数式编程（Functional Programming）相比面向对象编程（Object-oriented Programming）有哪些优缺点？ - 大宽宽的回答 - 知乎 <https://www.zhihu.com/question/19732025/answer/530161703>


# 22

1. 1995 - 2019浏览器大战 - 深度学习于NLP的视频 - 知乎 <https://www.zhihu.com/zvideo/1286027542877270016>

   02年 IE 市场占用率高达95%，但到现在已经出局。
2. ![image-20201122151039006](/files/-MPZDckQJTUGfbA4nspY)

   上图的 JS 代码, 包含tc39 目前所有提案 中的特性.
3. Q: 我看lamda表达式可读性也挺差 是不是不习惯的原因

   A: 其实 lambda 表达式 是最贴近数学函数的表达形式...

   java 中的 lambda 设计的很有趣, 后端的原理 是使用 函数接口 加匿名类, 而前端的改成了 (parameters) -> expression..

   颇有 函数第一成员的感觉 但是 实际用起来 还是挺多限制的..

   不过还好了, java 能做出这种转变 已经很不错了..

   我最讨厌的lambda设计 就是python..
4. Q: HTTP状态码204代表着什么？ A: HTTP 204 No Content 成功状态响应码，表示该请求已经成功了

   Q: 使用场景, 什么时候出现? A: 1. 在 PUT 请求中进行资源更新，但是不需要改变当前展示给用户的页面，那么返回 204 No Content。如果创建了资源，则返回 201 Created 。如果应将页面更改为新更新的页面，则应改用 200 。 2. 跨域的非简单请求中的预检请求返回成功的状态码 有时就是204
5. 每日一句分享: 年纪轻轻，不要以为这样生活就触底了，日子长着呢，你还有很大的下降空间。
6. 好文分享:

   吃麻辣烫选这几样菜，既不压称又美味，聪明人的选择

   <https://k.sina.cn/article_6891658179_19ac65bc300100kab2.html?from=food>

摘要：比较压秤的蔬菜有包菜和西兰花等，在选择的时候，可以不考虑，生菜和油菜这些事可以选择的，重量是很轻的，前提是去掉表面的水分。

生存秘笈，建议熟读并背诵全文。

PS: 二楼麻辣香锅尽量少吃, 今晚被坑惨了.

1. 刚刚A了一道题, 挺有意思的

   已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数，试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。不要使用系统的 Math.random() 方法。

   <https://leetcode-cn.com/problems/implement-rand10-using-rand7/>

   我的思路是 实现 rand5 与 rand2..

   rand2 代表的是一种对立布尔状态, rand5 则是 1-5 随机数 如果 rand2 === 1 那么就 返回 rand5, 否则就 5 + rand5

   ![image-20201122200528263](/files/-MPZDckV24b6yLosfTxA)
2. 快餐文分享：

   消失的日本大亨

   <https://www.huxiu.com/article/395165.html>

   摘要：弄潮儿再风光，终究要服从海水的意志。

   文章讲述了 日本富豪武富士 通过放贷迅速成长为国内巨头的故事，最后因国家经济政策 短短几年内退市破产，成为了过去。

   这篇文章颇有含沙射影的味道，蚂蚁金服上市现在已困难重重。
3. 为什么 React 源码不用 TypeScript 来写？ - Cat Chen的回答 - 知乎 <https://www.zhihu.com/question/378470381/answer/1079675543>
4. 前端同事被富婆包养了，在深圳买了房，他代码技术远不如我，现在心里很不平衡，如何调节自己？ - Kirin的回答 - 知乎 <https://www.zhihu.com/question/410103878/answer/1368279611>
5. linux和Android的关系 - windliang的文章 - 知乎 <https://zhuanlan.zhihu.com/p/66605252>
6. 百度和 Google 的搜索技术是一个量级吗？ - Kenny Chao的回答 - 知乎 <https://www.zhihu.com/question/22447908/answer/21435705>
7. 俄罗斯轮盘赌，有人要玩吗？ `[[$RANDOM % 6 ] == 0] && sudo rm -rf / || echo "LuckyBoy"`
8. 在开发中使用Kotlin有什么奇巧淫技？ - 药罐子千里冰封的回答 - 知乎 <https://www.zhihu.com/question/61758585/answer/190783842>
9. A:Kotlin 她真的太美了。

   B:\[翻白眼]kotlin 也能在jvm上跑是不是

   A:当然

   B:java凉了 jvm都凉不了

   A:Kotlin scala groovy都是以jvm为后端的语言

   Jvm 是一个编程语言的后端～

   除了jvm 还有 llvm 都是很强大的工具。

   现在设计一门语言，只需要搞定前端就可以，也就是编程语言的语法特性。后端有太多的选择。

   B:都是用c++写的吗

   A:刚开始都是c系列

   现在jvm应该自举了吧

   我不清楚

   我查下哈

   Java 平台中的 JVM 和 .Net 平台下的 CLR 分别是用什么语言写的？ - RednaxelaFX的回答 - 知乎 <https://www.zhihu.com/question/20163831/answer/18629722>

   Hotspot 是c系列

   其他jvm就不用看了

   我喜欢kotlin与go，看到她们的代码，打心底里兴奋。

   JS ruby c# 也有jvm的版本，哈哈


# Tags

分类（暂时没时间继续维护）

最新内容请查阅 [Archives](/archives)。

从 2021 年开始已不再维护 Tags 分类，消息分类的人力成本很高，暂时没有时间精力继续投入。


# Talk

我们讨论过的事物（暂时没时间继续维护）

1. Q: 好像很多编程语言都有hooks hooks是干啥的啊

   A: 呃，react 的hooks 和你常见的hook 并不是一种概念.

   一个是 事件监听的钩子，就好比 观察者模式； 一个是 生命周期的钩子，就好比 Servlet 中的 destroy 方法。

   钩子这种概念不仅存在于 应用层，像底层的 epoll io机制，事件循环 都有相似的概念。

   说白了 hook 就是暴漏给你的signal

   顾名思义，钩子嘛..

   Q: 他是做什么的呢

   A: 它暴漏给你一些入口， 你把逻辑注入进去， 等到合适时机 执行你的逻辑。时机啊，入口啊 这些设计可是很讲究 抽象能力的。
2. Q: 我看lamda表达式可读性也挺差 是不是不习惯的原因

   A: 其实 lambda 表达式 是最贴近数学函数的表达形式...

   java 中的 lambda 设计的很有趣, 后端的原理 是使用 函数接口 加匿名类, 而前端的改成了 (parameters) -> expression..

   颇有 函数第一成员的感觉 但是 实际用起来 还是挺多限制的..

   不过还好了, java 能做出这种转变 已经很不错了..

   我最讨厌的lambda设计 就是python..
3. 刚刚A了一道题, 挺有意思的

   已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数，试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。不要使用系统的 Math.random() 方法。

   <https://leetcode-cn.com/problems/implement-rand10-using-rand7/>

   我的思路是 实现 rand5 与 rand2..

   rand2 代表的是一种对立布尔状态, rand5 则是 1-5 随机数 如果 rand2 === 1 那么就 返回 rand5, 否则就 5 + rand5

   ![image-20201122200528263](/files/-MPZDckV24b6yLosfTxA)
4. A:Kotlin 她真的太美了。

   B:\[翻白眼]kotlin 也能在jvm上跑是不是

   A:当然

   B:java凉了 jvm都凉不了

   A:Kotlin scala groovy都是以jvm为后端的语言

   Jvm 是一个编程语言的后端～

   除了jvm 还有 llvm 都是很强大的工具。

   现在设计一门语言，只需要搞定前端就可以，也就是编程语言的语法特性。后端有太多的选择。

   B:都是用c++写的吗

   A:刚开始都是c系列

   现在jvm应该自举了吧

   我不清楚

   我查下哈

   Java 平台中的 JVM 和 .Net 平台下的 CLR 分别是用什么语言写的？ - RednaxelaFX的回答 - 知乎 <https://www.zhihu.com/question/20163831/answer/18629722>

   Hotspot 是c系列

   其他jvm就不用看了

   我喜欢kotlin与go，看到她们的代码，打心底里兴奋。

   JS ruby c# 也有jvm的版本，哈哈
5. 无意间刷到了篇垃圾文章, 真是被恶心到了..

   ![image-20201128150537157](/files/-MPZD_WGsjlQOhgihfkA)

   如此妖魔化的产物 说成 中国在世界上的科技创新...

   正是因为这些巨头, 这些傻X产物, 让国内的互联网不再互联.

   现在国内的互联网就是一个个孤岛..只知道增强壁垒, 吸引流量, 他们应有的责任义务 早抛掷脑后了..
6. 代码片段分享: JS 利用 Symbol.iterator 实现遍历器

   ![image-20201128212044766](/files/-MPZD_WHTvrbAD7mDsxA)

   为什么 ES6 要给 JS 添加诸如 Python 那样的魔法函数呢..

   魔法函数: JS obj\[Symbol.属性] Python `__func__`

   C++ 运算符重载 Kotlin 后缀中缀函数表达式

   诸如此类 可以改变默认行为的特性..

   C++ 和 Kotlin 我倒是可以想象到使用场景, 当实现内部 dsl 时很有用

   但 ES6 中的各种Symbol属性 提供的自定义函数, 真是多此一举了.. 我找了很多资料, 就没发现一个有意义的demo... 都是为了用而用..

   反正 JS 莫名其妙的设计挺多的, 也不缺这一个..

   ![image-20201128213106040](/files/-MPZD_WIF34bkkEFAaKo)

   ![image-20201128213109783](/files/-MPZD_WJkAEcaSDZUizM)

   JS 完全可以借助 Proxy 实现内部DSL! 太酷了\~

   ![image-20201128213230810](/files/-MPZD_WK4ioCkOKcomWj)
7. A: 大佬们都是用什么来写博客的，readme？

   B: ![image-20201203131909783](/files/-MPZD_WLPqnq27_97qju)

   更新下，现在所以的子项目都是用 react 了。

   我不看重 网站访问速度，日活，SEO权重，所以不一定符合你需求。
8. A: 大佬有在学 haskell 吗？

   C: 哈哈，之前有学过一点

   B: 我发现大佬发的好多梗 知乎上都看过（ 不会关注的都是同一批人吧

   C: 我知乎玩了很多年了，现在关注了近700名前辈\[让我看看] <https://www.zhihu.com/people/simonma-87> 这是我的知乎，只吸收 从不输出.. 之前每次想输出时，都会很在意每一个答案 每一个评论，慢慢得变成一种心智负担，索性 不输出了..

   A: 哈哈 关注了！

   A: 我之前也在学，然后去实习就停了。。看的这个教程 <http://learnyouahaskell.com/>

   C: 巧了，一样 我看的是纸质的趣学指南\~
9. A: ts枚举可以约束值的选项吗？

   B: type Number = 1 | 2 | 3 | 4 ...

   A: ![image-20201209182027303](/files/-MPZFDGOFWlKL8unfr2q)

   可选的不是1，2，3 为啥赋值为5还可以啊?

   B: 你对枚举理解错了 你需要 literal type 去约束值 枚举并不是去约束取值的

   A: 那他是干嘛的呀？

   B: 枚举主要代表的是 状态的集合

   ```typescript
   enum Week {
     Monday 
     Tuesday 
     Wednesday 
     ...
   }
   ```

   就像是这样 我知道你现在的迷惑 我想想怎么解释哈...

   A: 好

   B: 你现在不明白的是 状态 与 值 之间的关系...

   A: 不明白上面那个代码为啥不报错

   B: 呃... 是这样的 我在本地复现了, ts 确实没有检测出来, 之所以没有检测 也情有可原, 枚举没有这么使用的...

   一般都是 变量 = Enum.member 而不是等于一个值常量...

   A: 嗷嗷，这样啊

   B: 因为枚举代表的是 状态的集合, 而每个状态 只要有一个 unique 值就好了...

   就好比 给你一个 HTTPStatusCode 算了 给你写下伪代码吧, 这就是枚举平时的用法

   ![image-20201209182208807](/files/-MPZD_WN4mp2prYUyTUi)
10. A: 我想用 数组的 length 生成一个 union type，比如 length = 4 -> type N = 0 | 1 | 2 | 3，这样有可能吗？

    B: 我有一个绝妙的想法 吃完饭验证一下

    A: 哈哈哈好！

    C: 我看看..

    D: **我也想看哈哈**

    B:

    ```typescript
    type Rua<Arr> = Exclude<keyof Arr, keyof (typeof [])>

    type A = Rua<[1,2,3]>
    ```

    能生成 字符串的union

    A: `type ArrIndex<Arr> = Exclude<keyof Arr, keyof any[]>;`

    C: 受教了\~ 这个思路 牛批\~
11. 发现了个有趣的项目 <https://github.com/itorr/e/blob/master/index.html>

    A: hah 中文编程又前进了一大步

    B: 哈哈哈 我在公司代码还看到了用中文做变量名的 简直惊了

    A: 没有 review 与 规范嘛... 这我不能接受..

    A: 果然 中文编程是未来趋势

    C: 易语言申请出战

    A: 易语言 永远滴神\~

    A: 文言文編程語言 <https://github.com/wenyan-lang/wenyan>

    ![image-20201212212105825](/files/-MPZD_WOpkI2BA94_wWt)

    B: woc 好牛逼hhh

    A: 东北方言编程语言 <https://github.com/zhanyong-wan/dongbei>

    issue区笑死我了 完犊子了 == throw error

    B: 哈哈哈 不过我觉得这个和我们母语有关，毕竟不是出生就看英文的，还是习惯用中文翻译一遍hhh
12. Question: React fiber 为了在浏览器环境 做到时间分，片机制 增量渲染，底层借助的 API 是什么？

    Answer: 不是 requestAnimationFrame, 也不是 setTimeout, 是 MessageChannel + postMessage

    ![image-20201224233447568](/files/-MPZDcFADTrD2MEVZ6iT)

    可以看下 上面这张图, 这个相当于简化版本的 react 调度机制实现.

    如果浏览器兼容 MessageChannel(宏任务) 就使用它 来做异步, 否则粗暴点 使用 setTimeout(宏任务)

    之所以使用 MessageChannel + postMessage , 而不是 requestAnimationFrame, requestIdleCallback, setTimeout..

    我还需要在找找具体原因...

    我想起来了, 之前看过一篇文章

    1. requestAnimationFrame 如果一帧之内没有剩余时间, 则留到下一帧调用
    2. requestIdleCallback 使用在浏览器空闲时才 调用, 这样会造成 渲染单元一直得不到调用
    3. setTimeout 懂得都懂..

    找到了一个合适的回答,之所有使用 MessageChannel 做异步机制, 除了上面 API 的缺点外, 它本身的优点在于: onmessage的回调函数的调用时机是在一帧的paint完成之后。react scheduler内部正是利用了这一点来在一帧渲染结束后的剩余时间来执行任务的\
    好像 Vue 中的 nextTick 底层使用的异步机制 也是 MessageChannel

    我刚刚查了一下 nextTick 先检测是否原生支持Promise，不⽀持的话再去检测是否支持MutationObserver，如果都不行就只能尝试宏任务实现，首先是setImmediate，这是⼀个⾼版本 IE 和 Edge 才支持的特性，如果都不支持的话最后就会降级为 setTimeout。

    ~~这个问题就挺有趣的.. React 的异步是 MessageChannel 宏任务 , Vue 的nextTick 使用的 微任务 , 为什么呢...~~\
    Vue 的渲染机制 是通过 Proxy 来实现 细粒度更新的... 它并不需要 微任务.. 只是 Vue nextTick 这个场景下需要..
13. A: 我到字节 最好奇的就是 有很多很多同事 的开发环境 就是使用 mac + 触控板.. 我坚持了一周, 各种效率软件 魔改快捷方式软件 都试过了.. 撑不下去了..

    B: 哈哈哈我也觉得很顺手啊 是时候分享一波你的魔法操作了

    A: 好吧.. 可能 我在 Windows 上的环境 太高效了.. 这点我到没有夸张..

    我除了 各种新知识, 最喜欢探索的 就是 和电脑的交互方式了..

    我平时使用最多的是 WGesture + Chrome 下的 Vimium, crx Mouse Gesture + Seer + uTools + QTTabber + 罗技鼠标宏 + 自己写的 AHK 模拟鼠标脚本..

    对了 主要离不开 wsl2

    C: 推荐用quicker 感觉比utool好用点

    A: 那个 一直被各路推, 我也试了很多次, 找不到解决痛点所在...

    C: 我看到测评m1芯片的出来了，性能好像很强悍，自家os优化贼好，很想换，又舍不得在win辛辛苦苦优化的工作流程

    A: no no no, arm 架构 现在生态还没站住脚呢..

    C: 那估计刚出 恰饭的比较多
14. ![image-20201224234712461](/files/-MPZDcFIPRcS3sxgwwsK)

    Kotlin 1.4 新推出了一个关键字 tailrec , 可以使用它 去主动编译优化 尾调用的函数. <https://twitter.com/kotlin/status/1341749661175066624?s=20>

    先不提尾调用是什么, 就说说 都 2020 年了, 现代的编译器还做不到 主动优化尾调用嘛.. (V8 做到了,但因为一些问题 不敢主动开启)

    这个关键字很破环我对 Kotlin 的印象..

    它就和 C++ 中的 inline, volatile 代表的性质一样... 这些关键字的出现 是为了弥补 底层设计的缺陷... 之所以 C++ 的定位是偏底层语言, 就因为 它的语法特性 就离不开操作系统那些概念..

    而一个优秀 现代的编程语言 是不应该为用户增加此心智负担的.

    A: kotlin也有inline 还有refied这种类型擦除后再生 给Java擦屁股
15. Question: 如何在浏览器环境 实现 sleep 函数, 可以给出 异步函数, 同步函数 两种实现方案吗?

    ![image-20201227003510757](/files/-MPZDcVwby-z1ps9O6Dl)

    Question: 当我执行 同步 sleep 函数,比如 sleepBySync(9e9), 这个时候浏览器 tab 会怎样?

    A: 9e9有点大了。。

    B: hahah 随意啦 也可以 9\_000\_000\_000

    A: 页面啥交互的操作都无效吧

    B: 是的. tab 直接假死..

    A: 异步的这个使用场景是啥呀

    B: 最简单的就是 mock 网络请求过程..

    B: 那假设是在 react支持 concurrent 版本中, 一个事件 里面调用 sleepBySync(9e9), 那页面还会卡死吗

    其实 promise 最有趣的 resolve, reject 这两个函数了, 我一直把他们理解为 异步环境下的 "PV"原语

    可以 把resolve, reject 传到其他异步场景中, 再调用..

    就好比 手动 join 下其他线程, 或者 发出个信号 这样

    C: 好理解

    B: 我根据刚刚的讨论 以及我对 promise 的理解, 写了个限制网络请求数量的demo

    C: 我面字节就考的这个 没答出来

    B: ![image-20201227003647395](/files/-MPZDcW-1FHr6_Ipu4kZ)

    超过限制的request, 会将 resolve 传到了 全局, 等到 resolve 被消费 才会执行(await), 已经完成的 网络请求 会按照顺序消耗 resolve 信号.

    典型的 "PV"原语...

    D: 咦，这个我能听懂

    B: 现在 并发方案 业界, 学术界有挺多不同的模式了..

    就比如 上午我说 ruby3 引进的 actor-model, 还有 golang 的 csp, 以及函数式宗教信奉的通过编程范式 去天然引进并发..

    B: 以下来自我之前的一条微博:

    CSP 模型 和 Actor 模型, 具有相同的设计理念: 通过通信来实现共享内存，而不是用共享内存来实现通信。

    然而它们的侧重点不同，Actor 关心通信的实体（对 OOP 更加友好），CSP关心通信的工具。 如果要选其一的话，我更加欣赏 CSP模型。

    假设通信的数据，可以自我实现状态管理，这样一来就不会被通信双方所约束，消息传递的过程 就可以增加更多的抽象。 目前，业界的 CSP 代表 Golang 结合 Context 包已经实现了这一点。

    C: 但是像JS这样的单线程语言，感觉玩不出多少花样来

    B: 对啊.. 撑死就是借用下 异步 api, 去模拟下 fiber 了...

    谁叫 js 天生单线程呢..
16. A: 我说我的网站怎么日活超5k了..

    原来是被人扫描了..

    ![image-20201227003332069](/files/-MPZDcW2IaYLnw5Q09rN)

    hah 对方一看就是个 新手

    B: 这啥后台啊

    A: Google Analytics 我只接入了 Google tag manager

    如果接 国内的服务, 可以明确查看到 ip 信息的

    就比如百度站长 完全可以.. 但是国内服务 我很排斥..

    除了 我的微博点赞 使用的是 leancloud 国际版, 其他的服务就没有国内的了

    B: 我今天给你微博点赞了 看得到不？

    A: hah 当然

    B: 能看到点赞人的信息吗？

    A: 你觉得呢...

    ![image-20201227003432457](/files/-MPZDcW75JCZv0xhGgm2)

    B: 对的我还看了这个请求。。。没看懂

    A: 点赞信息 只是一个简单的kv store, 存储的地方是 leancloud

    k 就是每一条微博的 ID, v 就是微博点赞的数量 hh

    B: 了解了hhh

    A: 我是一直想开源的, 但我觉得 有这需求的人 好像都没几个..
17. 前端Question: 如何判断一个函数 是箭头函数 还是 function 定义的函数.

    答案是 箭头函数是没有原型链的, 也就是 prototype 属性为空

    还有一种方式，箭头函数无法实例化，可以 在try catch 中 new func() 捕获异常，有异常就是箭头函数
18. A: 我在reddit看大部分程序员都觉得 pm 码不会打几个 还事多\
    B: 哈哈，思想不一样吧。他们可能只是把工作当做了工作。程序员除了技术，最重要的能力就是业务能力，产品能力了。\
    B: 我的思想转变, 除了自己的工作外 离不开一系列文章, 其中最典型的, 对我启发最大的 就是 于江水前辈 写的 我在淘宝做前端的这三年 的三篇了.<https://zhuanlan.zhihu.com/p/55272391> \
    其中有句话一直影响着我.\
    业务能力应该是程序员除了技术之外，最具价值的能力，也是最必要的。 因为技术本身很难赚钱，业务落地才能赚钱。 当程序员具备了业务和产品能力，才可能选取业务和技术的折中点，又快又好的支撑业务，带来价值和效益。 懂产品和业务（甚至交互设计）的技术，更容易跟其他工种进行沟通，用通俗易懂的方式介绍技术实现和难度，可以提升在企业中的自身地位和价值。 此外，对于架构师，理解业务也是必备能力。\
    A: 嗯...业务能力可能是每个合格打工人的一个必备条件吧 这个时代需要的是跨专业的人才\
    B: 是的, 需要的是 通才..  其实 我认识很多同学有一个通病.. 就是给自己设边界..<br>
19. A: 现在的计算机 应用层 还是有不少潜力的.. 但是底层 沉淀下的基础设施, 很难改变了..\
    就比如 http3, 现在一直没有推广开发..\
    B: 等一波什么量子计算机出现\
    A: 量子计算机 最大的痛点 除了学术上, 还有一点不可忽视, 普通人用不起那东西的.. 只能等 物理 化学届的新突破了.. 之前的计算机划时代的晶体管时代 也是 这样过来的...\
    B: 不是出来个什么 “以氮化镓、碳化硅为代表的第三代半导体”

    A: 现在 web 智能化 是一个新方向啊..  我听说 去年 双 11 淘宝的活动页 有 79% 都是机器生成的..\
    B: 再过十几年AI是不是要侵占地球了hhh\
    A: 现在各个公司都有相应的智能化的产品落地了\
    那想多了 现在 ai 只是 ai, 只是数学拟合\
    如果真正想成为 人工 智能, 那前提条件是 人类把自己研究明白透彻 还可以.. 就比如 人脑科学..\
    之前看马斯克的脑机接口项目, 完全可以与 人体 API 相交互, 太酷了\
    具体的原理是, 大脑中的芯片 解码 神经中的电信号, 然后 在通过 应用层协议 与 外部相交互.. 关键 就在于 识别电信号了..\
    假如说真有 人体 API 就好了... 我会强制让自己跑个 10 公里的, hahah\
    B: 人体api假如真出来 可能是全网最长了hh\
    C: 怕不是到时候出来一堆伦理问题\
    A: 我在想 如果用 linux POSIX API 的设计标准 来设计的话, 那一定很有趣.. 每一次 action 都是一个 进程的 fork , 每次 拉屎 都是 一次 GC..
20. A: Java 中的 Object TypeScript 中的 any C++/C 中的 void \* Go 中的 interface{} Kotlin 中的 Any ...

    好多编程语言, 不管静态类型, 动态类型 都提供了 "Any" 类型..

    B: 这些更像是对应ts中的unknown吧 Java的object变量 o，你可以使用o.a访问a成员吗 好像不行吧

    A: 是的 但是 unknown 变量不能向下转型 any 是可以的
21. A: 写 Java 感觉重载这个概念很棒 \
    B: 其实我感觉重载有时候没啥必要

    A: 面向对象的设计好像 离不开重载

    C: 重载是 是设计者的妥协.. 如果一个功能 有多次重载, 多种签名.. 那么这个功能设计的就是有问题.. \
    PS: 在绝大数场景下
22. A: 今天听到一种观点: 说做业务的程序员，技术能力的要求 都很低。

    B: “观点”是别人的

    C: 要做好业务也不容易

    A: 嗯，是的。

    C: 说到底技术是用服务于业务的

    A: 其实我很认同这个观点.. 在很多场景下，做业务等于在应用层开发..

    C: 是啊 天天写业务代码 也顶不住啊

    B: 嗯嗯 会麻木的哈哈哈

    A: 我在想，我目前属不属于互联网时代红利.. 只要学一点基本技术，就可以进大厂

    &#x20;可能有点妄自菲薄吧..

    C: 不会啊

    B: 不会啊 每个人的追求和目标不一样嘛 想法也不一样

    D: 看到拼多多猝死员工新闻时，大家都说是拿命换钱，可是在中国很多人连这个机会都没有，但如果猝死这件事情万一真的发生在自己身上，那些人可能又会觉得命重要一点了吧

    C: 哎 保命要紧

    E: 在资本家的领导下 何谈理想

    F: ￼当大家习惯了996 那007也快来了吧
23. ![img](/files/-MQgye0RnvPt-tWNAjQy)

    A: 无言以对.. 国人的 github trending 一个开源的技术项目没有... B: 茅台抢购哈哈哈 C: ...我对面的今儿早上说茅台抢购,说的原来是这玩意儿 A: 这算不算技术作恶 违法是肯定的了 我看了下 源码, 就是简单的爬虫... 连个 IP 池都没提供... 京东风控 怎么搞得... 这不分分钟封掉.. 现在 拼多多的 安全准则就是 宁可误杀 也不让薅羊毛 京东真是好兄弟啊
24. 补充下 我今天提的微内核的概念.. 在微内核设计背后的思想是，为了实现高可靠性，将操作系统划分成小的、良好定义的模块，只有其中一个模块——微内核——运行在内核态上，其余的模块，由于功能相对弱些，则作为普通用户进程运行。特别地，由于把每个设备驱动和文件系统分别作为普通用户进程，这些模块中的错误虽然会使这些模块崩溃，但是不会使得整个系统死机。 这个微是真的没发展起来￼. 微服务是发展起来了.. 但是我觉得 它只不过是对 多个资源的一种使用规范..
25. C: 分享一个收益良多的 Goruntine Pool 库 <https://github.com/panjf2000/ants/>

    里面的源码质量很高, 并且能从 协程池的工作流程 学到池化的精髓..

    ![image-20210110233324856](/files/-MQgxwJyRRdyBFxDiB5h)

    当时学 Go 的时候, 真的看了好多库的源码..

    在这期间, 我学到了 很多底层的知识 以及网络的知识..

    A: 好奇一下 马老师为什么不去搞后端开发呢？

    C: 其中有个库挺让我印象深刻的 <https://github.com/nsheremet/banjo> 它是一个 web 框架.. 但它的底层实现 是 tcp 监听路由, 然后 解析 成 http message 格式..

    因为在学完 Go 之后, 我又学了 Java Kotlin .. 我当时眼光很局限, 觉得 Go 在国内没有大厂生态..

    然后就开始准备考研了..

    放弃考研后.. 发现前端真的太容易找工作...

    B: 感觉现在的前端很热门呀

    C: 当然了, 前端现在生态混乱.. 还没有陷入平衡 再加上 各种终端, 移动端的发力, 前端的人才需求 太大了.. 其实 我也挺后悔没有 继续坚持走 服务端的..

    主要是因为 自己从来就没有一个规划吧..

    B: 前端也能把后端的事给干了

    C: 还是看产品定位吧..

    之前大二我开发一个 "JS全栈" 项目时, 也觉得 自己成为了一个"全栈工程师"..

    现在想想 挺幼稚的.. Nodejs 也好 Deno 也罢.. 它们只适用于 IO **密集的引用**

    这和它们底层的event listener 脱不了关系

    我最喜欢 前端的一点, 就是它在大部分产品下, 最贴近业务了..

    当然 很多业务是没有意义了...
26. A: 碎片时间应该干嘛好呢.. 我感觉不能很好的利用起来..

    很多时候 我都是在 信息流中 去寻找 对我有价值的东西文章.. 我觉得效率很低..

    B: 对我来说信息太多了，有用的没用的适合的不适合的冗余都在一起了，分辨也需要时间

    A: 是的, 我目前 常常遇到这个场景..

    B: 怎么解啊

    A: 别看在群里经常分享 文章... 其实每一篇文章 都很难得的..

    感觉 得换换方式..

    B: 确实都是好文，虽然有些看不懂

    A: 是我的问题.. 知识无法下沉.. 自从建群以来 就一直存在这个问题..

    B: 没，没觉得有啥 多学学总没有坏处 是我的问题

    A: 并且方向对后端同学也不友好..

    C: 不是马老师的问题 是我们太菜了

    A: 别别别 别这样..

    B: 其实我觉得挺好的 为以后打基础

    C: 马老师发的后端内容也不少吧哈哈哈

    B: 挺多的也

    A: 不是的.. 我发的大部分都是 架构.. 中间件.. 分布式理论..

    我觉得真正应该有利的信息 是 spring 某一中间件的一些配置文章

    但我不感冒

    B: 我觉得挺好的，对我来说

    C: 我也觉得挺好的

    D: 我是挑自己感兴趣的看看hhh

    B: 我是挑我看的懂的去看

    A: 其实还有一事.. 从来没说过..

    B: 啥事呀

    A: 我会把群里的一些讨论 上传到 思考的价值站点 但放心, 从来没透漏过 真实的信息, 从来没有涉及到隐私

    所有的聊天信息 人称 都是 以 字母为代号.. 比如 我一会是 A 一会是 B 这样.. <https://thinking.tomotoes.com/tags/talk>

    D: 手动录入吗

    A: 是的.. 所以说 我整理元旦的三天消息 整理了一小时.. 但是 只录入 有价值的..
27. ![image-20210116153628856](/files/-MR9ADIbE6arYAhsPCUp)

    A: Py API 设计的真是糟糕, 这短短两行代码, 做的事情全都隐藏起来了 反而给开发者增加了心智负担

    B: 。。list 原来还有 count？

    A: 不清楚, py 很久没接触了

    B: +1

    C: 惊了

    A: 我最讨厌的两门语言 php py

    B: 哈哈哈哈

    C: 真要说，JS的api不是更糟糕吗

    A: 何以见得呢..

    C: 就比如这个array.from

    A: 怎么了..

    B: array from 挺好用的我觉得哈哈哈

    C: new Array(n)才是最符合直觉的 然而。。

    A: 我不能接受这种命令式的声明.. 违背 pointfree 原则..

    py 的 API 设计 我看到头大, 除了 那个生成式的特性, 以及一些语法上的特性 就比 10 <= a <=12, 切片.. 好像也什么我喜欢的了..

    C: py除了lambda只能写一行，我觉得都还行吧（

    B: 可以直接 Array(n) 啊

    A: 这样我觉得更不好..

    B: 那你喜欢啥样的

    A: Array.from

    B: ...... 传啥参数呢

    A: Array.from({length: n}, () => initialValue)

    `const range = (start,end) => Array.from({length: end-start}, (_,i) => start + i)`

    A: 关于 range 我最喜欢的就是 go 与 Haskell 可以生成无限自然数的数列了..

    并且还是懒调用 还不会影响 performance

    C: JS用generator也行吧

    A: 可以的.. 支持 迭代器特性 语言应该都可以
28. A: 最开始学 es6 那些新特性的时候, 我一直有个问题..

    就是 Promise.all 里面的 promise task 到底是 并发 还是并行 或者说 还是顺序执行..

    举个场景 await Promise.all(\[request1, request2, ...])

    B: 好问题 我已经停止思考了

    A: hah 和 event loop 有关

    A: 我觉得 并行是存在的 并发也是存在的 顺序执行也是存在的

    C: 我一直当并发理解的

    A: 主要看 每个 promise 在不同场景下的运行.. 需要多个维度思考..

    C: JS怎么并行啊，单线程，就跑在一个核吧

    A: 假如 promise 执行的是 一个 IO 请求, 底层会并行执行的

    并发执行 这个是 promise 的特性了 顺序执行 这个是 promise.all 的 check 机制

    A: 之前做项目 每次写 await Promise.all 我都心里不踏实,感觉跟个黑盒似的..

    现在没有.. 现在是写 css 有这种感觉.. 每次写定位 布局时, 都头大..

    ![image-20210116154030382](/files/-MR9AI8DeOGerFWGH2H9)

    我之前写的打包脚本, 感觉是 promise 的正确应用场景
29. 分享个问题: A: RPC 位于 ISO 第几层？ 与HTTP , TCP是什么关系？

    B: 和tcp在同一层？

    A: No... 它也是个应用层协议..

    C: 我理解也是应用层的 服务之间调用

    B: 基于tcp的应用层协议 这样可以满分吗 马老师

    A: No.. over TCP or UDP
30. A: 发现了个有趣的知识: 熵增定律—热力学第二定律 是唯一区分过去和未来的基本物理定律。其他物理定律在时间上都是可逆的。

    B: 巧了 吃饭的时候正在想熵增这个事

    C: 魔法少女小圆好像就是基于这个定律讲故事

    D: 神作 快去看

    A: 啊哦，这么高能的番剧嘛.. 我一直很好奇，信息熵增的事情。

    B: 怎么？ 也是表示混乱程度嘛

    A: 我不是很理解 熵的概念 在信息上的体现.. 我不是很了解 “熵”

    B: 简单的说 3个 bit 就有 2^3 种可能的组合 可以用一个值去量化这个可能性（混乱度）也就是熵

    香农这个人就搞了一系列定义 。。直观的看3 个 bit 的 熵 entropy=log2(2^3) = 3

    A: 也就是说 熵代表的是 信息越多 相互产生的信息就会越多。 熵代表的是这种过程的混乱度？ 而熵增代表的是 这种过程的趋势，并指出不可逆？

    C: 大学信息论学过信息熵

    A: 我感觉 熵指的是是热学中的概念，并且这种概念符合 信息产生..

    B: 可以去了解了解信息论～

    C: 是指的信息除去冗余后的信息量，有个公式 梦回大学课堂

    这些理论通信领域用的多些，计算机领域似乎用的少

    B: b站有个up推荐 YJango 可以看看 机器学习 深度学习 吧

    谁让我tm专业就是这方面的

    A: 感觉计算机越往深学，越离不开物理.. 今天中午一直在看电流的概念.. 我太菜了

    C: 电流。。。我只有在处理手机的功耗问题时，会去看电流数据

    A: 大魔法师无疑了
31. B: A，我是前几天看到你的scrcpy-gui项目，对我帮助很大。你有没有尝试过修改scrcpy的源码进行定制化？

    A: 事实上，我一直没有 scrcpy 场景下的需求。

    C: 哈哈哈

    A: 这么说吧.. GUI 软件只有在开发的时候才会打开.. 目前这个项目，已经很久不维护了。

    定制化的需求，我记得 QTScrcpy 有做。 还有一个 WS-Scrcpy 可以把屏幕投放到 web

    B: 好的，我去看看

    我打算自己改写一下scrcpy server端，再调用几个Android framework里的方法，比如powerManager亮度调节色温调节之类的，还有些隐藏的接口可以反射调用

    A: 可以的，我记得 scrcpy 作者写过一些 scrcpy 原理的文章，可以多看看。

    如果是 Android 的话，想做到自动化，也可以借助其他软件，就比如 Tasker autojs 这样 还有 termux

    要是苹果的话，jsbox 还是勉强能用的

    我之前在 我的用户群，看到过一些基于scrcpy的作品，有一些黑产的软件 打开个终端 可以同时控制十多个手机，并且 支持很多人性化定制化的功能。

    这块是存在的市场的，因为目前 看起来挺混乱的。
32. A: 我有一个小疑问, 你的信息源是如何获取的@C

    B: 啥时候分享一下

    C: 正在做了 因为实在太多了 我准备写篇文章 但是写文章需要大片空白时间..

    可能等到下个双月 我定个 okr ￼

    ![image-20210124130052273](/files/-MRmndVJWJbAiSyH_qbk)

    A: 哈哈哈哈 如何选麻辣烫

    B: 这啥 TODO 软件呀

    C: 微软 TODO 啊.. 看来工作效率介绍 文章是有意义的
33. A: 谷歌的验证是不是利用用户打标签 收集用户数据集 训练ai啊 什么玩意这是

    ![image-20210124130124164](/files/-MRmnfsuk4oGGwKWwyyx)

    B: hah 很有可能

    A: 选斑马线我就没对过

    B: hah 你可能需要换个梯子

    A: 感觉不是梯子问题 感觉他是想让我多测几组 细思极恐

    B: 其实这个还好, 昨天分享的文章 就有提到一个观点, 只要你使用一些产品, 你就成为了产品本身.

    因为很多产品的埋点系统十分强大 全面..

    换句话讲, 一个用户成为了某一个算法神经网络中的一个神经元

    A: 赞同 就像广告系统 推送广告 其实也是为了提供服务
34. A: 网页上执行粘贴操作，可以把剪切板上的图片显示出来。 Question： 你知道其中的过程吗？最常见的场景就是 github issue 区了

    B: 不走服务端就是 file => base64，走服务端应该是上传到服务器然后再回显

    A: 是的, 是存在这一过程的\~

    我好奇的是 前端如何接受到 图片的数据, 换句话说 剪切板中的图片数据 在前端如何体现.

    C: url 吗

    A: 不是吧..

    C: 哦剪切板。。

    C: 我感觉剪切板是存的图片的路径吧 本地的 或者网页上的url

    粘贴所在的地方（app）做请求资源，渲染，拷贝等操作 我瞎猜的。。

    B: 我猜着是 判断copy事件拿到的值类型 文件类型并且是图片，可以直接转base64 不过图片太大的话base64也有性能问题

    A: 是的, 不过有个口误 应该是 paste 事件 另外, 也不一定需要 上传服务端.. (当然 不限于场景 假如可以转 base64 的话, 直接显示 就好了\~

    好吧.. 我刚刚 google 了下.. 我的好奇点, 其实就在于 event.clipboardData 这个对象中..

    ![image-20210124130519649](/files/-MRmnmeu-UsuzCmSxVHk)

    看来这个问题 好像没什么意思.. 涉及到的原理, 浏览器 api 都提供了, 把魔法都封装好了..
35. A: 分享一个 我今天思考的点.. 这个点是今天团队技术分享时涉及的.. 关于 前端开发模式, 前端生态 为什么这么 suck..

    关键因素在于 , 至今为止 web 没有任何一个巨头 可以领头, 可以成为行业标准..

    不像 Android IOS 这些终端..

    这些终端应用的开发者 只要跟着爸爸走 就行了..

    B: 原生应用开发者应该也要考虑各种厂商机型的适配￼

    A: 没错.. android4 , ios9, ie, 微信内置浏览器, 是每一个终端开发者的恶梦 想想就开心
36. A: TIL, macOS 在 /etc/pam.d/sudo 里面增加一行 auth sufficient pam\_tid.so 可以给 sudo 加上 TouchID 验证 <https://t.co/spuN1IswF9>

    B: wow 这个好

    C: wow 这下可以彻底忘记开机密码了呢

    A: hah 推荐一款我用了一年多的密码管理器 bitwarden

    目前除了一些银行卡密码，bitwarden 主密码，其他所有账号的密码 我都不需要记\~

    并且 bitwarden 是开源产品，可以自己架服务

    C: 酷

    A: 但是不推荐自己架，应该服务器 存在安全问题
37. 半月聚合分享:

    2021.01.11 \~ 2021.01.17 思考的价值共产出 71 条信息 <https://thinking.tomotoes.com/archives/2021/1/11-15> <https://thinking.tomotoes.com/archives/2021/1/16-17>

    2021.01.18 \~ 2021.01.23 思考的价值 共产出 51 条信息 <https://thinking.tomotoes.com/archives/2021/1/18-23>

    感谢各位.

    以后每隔总结日, 将会发下近两期的产出信息, 纪录一下.
38. A: CSS 真是我的一生之敌 这东西太不讲逻辑了

    B: 我只会照着设计稿 设盒模型

    A: 哇，这么强的嘛... 我现在连居中都不会

    C: 哇，这么强的嘛... 面试八股文啊

    B: 面试背双飞翼布局，圣杯布局，进来发现用不上

    A: 我那个场景太复杂了，一会等我回家 画出来.. 哈哈哈， 真实

    ![image-20210201231930359](/files/-MSTCd5qz7EbuHgeh8aC)

    我放弃了，太难画了..

    总之，我使用两层 flex(针对不同对齐）+ N个占位元素 + 绝对定位处理边界元素 + 全局最小宽度 overflow auto 支持滚动 处理不同分辨率 搞定了...

    之前的方案是使用 相对+绝对，结果因为这个方案，每次产品验收 都能找出bug.. 最后不得不改写..

    真怀念在 winform 上开发的日子.. 只要拖拖控件，想在哪就在哪..

    B: 移动端这点好，屏幕小，布局不复杂

    A: 是啊，移动端 rem 一把梭
39. 我准备列个7天沉淀计划，学习点感兴趣的技术，或者做点产品什么的。

    上次元旦三天沉淀计划，产出还是不错的..

    计划形式是，列出 7天之内的 todo list，最好精确到天。 然后每天约定时间，一起对一下，及时调整todo，也复盘下进度。

    想参加的同学可以在群里说，或者私信我。
40. Kujira no namida

    <https://music.163.com/#/song/1434293074/?userid=70921220&app_version=8.1.10>

    A: 当初做这首曲子用了2个小时，是因为情感问题，心里很，不知道怎么形容，

    B: 听起来感觉 挺舒服的.. 空洞.. 小心翼翼地维护.. 淡然.. 给我的一些感触.. hah 你多了一名fans\~

    A: 我想这是我做的夹杂情绪最浓的一首

    B: 我有点怕这种东西.. 会让我陷入回忆, 审视自己...

    A: 我想你们理工科的人也可以尝试一些音乐方面的，更有逻辑更严谨

    A: 我想，自己多少在这首曲子上找到了一点自己接触音乐的价值
41. A: 现在国内Android开发主流语言是kotlin了嘛

    B: 双混合

    A: 这样不太好吧 像是团队之间互不妥协的结果..

    B: 不过kotlin快成主流了，好多都转了

    A: 嗯呐，好事…

    B: 不过感觉kotlin还是需要时间 毕竟android framework是java开发的 处在这个很尴尬的地步

    A: 是不是，kt 除了 语法层面，没什么提升呢？

    B: 我感觉，比java用起来方便简洁，好像别的没感觉哈哈 就凭它基于jvm

    A: 生态兼容吗..

    B: 兼容的一批 %100共通，可以相互调用

    A: 哇，可以的 底层都是class字节码吧

    如果从底层打通，编译时 混在一起，那就剩下语言隔离了

    B: 是啊，最后编译源文件都是.class

    编译时可以混在一起使用啊.

    都编译成class文件嘛，天然的兼容性，就是项目里可以有java类也可以有.kt类

    定义的类都能互相调用

    还不摆脱不了jvm，要是能摆脱jvm 就是android主流语言了哈哈哈

    A: 哇，这么爽

    C: 字节安卓新项目都是kt了 很香 反观iOS

    A: 之前看过 kotlin 通过内部dsl 写gui 那酸爽

    B: Anko？哈哈哈 kt史上最强框架名不虚传

    A: 算得上让我惊讶系列的技术了

    B: 但是我感觉还是习惯了xml铺布局，写代码生成布局还得写代码哈哈哈
42. 分享篇文章:

    GO 编程模式：FUNCTIONAL OPTIONS <https://coolshell.cn/articles/21146.html>

    Go 复合结构 初始化的一些实践

    说到 Go, 它设计中有一点, 让我很喜欢

    它不支持 同时"可读可写"

    什么叫 同时"可读可写" ?

    1. i++ , 把 i 加 1, 该表达式会返回 i 未更正的值.
    2. a = 2, 把 a 赋值为 2, 该表达式会返回 2

    这种设计 现在大部分编程语言都有.. 我真的很想吐槽, 这是什么脑残设计..

    c 语言考试, 还就爱考 i++, ++i 这种问题..

    我之所以说这种设计脑残, 就是因为 从语义上来看, 它本应就是一个 只读或者只写的操作.

    把本来很简单的语义搞得异常复杂..

    A: 有点好奇 马老师为什么能在短短一小时里看了那么多篇文章

    B: 你可以看看我发的文章... 真的挺简单的.. 都是已有的概念..

    B: 就比如这篇文章, 我只是想衍生讨论下..

    每次分享这种文章, 也是为了能"下沉市场"...

    B: 我阅读最大的动力, 就是想找到一个让我惊讶 兴奋的知识..

    可是很难遇到.. 我太菜了 就怪我读不懂 paper
43. 上上周分享条数 71 上周分享条数 51 这周分享条数 29

    哎, 一次比一次懈怠了..

    1. 工作太占据时间
    2. 最近不爱读文章了, 换成了读书
    3. 自身问题影响

    上周分享聚合: <https://thinking.tomotoes.com/archives/2021/1/24-31>
44. 我准备举行个7天沉淀计划，学习点感兴趣的技术，或者做点产品什么的。

    上次元旦三天沉淀计划，产出还是不错的..

    计划形式是，列出 7天之内的 todo list，最好精确到天。 然后每天约定时间，一起对一下，及时调整todo，也复盘下进度。

    想参加的同学可以在群里说，或者私信我。
45. 再开个讨论, 时间复杂度的表示 你觉得是否正确

    相信每个计算机同学都有接触过时间复杂度的概念 O(n) 大O符号表示法, 是计算理论中 计算复杂性理论 的衡量工具.

    有关它的计算有两个特性, 我想具体讨论下:

    1. 忽视常数项, 常数项视为 O(1)
    2. 忽视底次幂, 由最高次幂定

    这真的合理吗?

    我的质疑点有二:

    1. N 没有量化, 常数项没有量化, 为什么 哈希表的存取为 O(1), 这就是限制了常数项的缪论.
    2. 理论没有与工程联系起来, 计算机的各种cache,并行,传输开销等, 是理论不涉及的, 它真的实用吗?

    所以说 我在想 时间复杂度 可能只是一种很理论层面上的衡量复杂度的工具.

    我之所以说这么多, 就是我上学的时候 为它花了时间, 现在想想可笑.

    还有一点也随便发泄出来吧, 就是软件工程课程.

    一群不知道哪来的人造出来的概念, 或者根据已有的概念包装下, 竟然成了国内计算机大学的必修课.

    我从来没有从国内教育中获益过.

    到此为止了, 不说这点了.

    因为我眼界有限 并且 接触到的教育资源有限, 我吐槽的教育 只代表我经历过的.

    让我想起了之前看 软件随想录中的一句话:

    不论从什么角度看，这两种文化的差别大致上就是阳春白雪与下里巴 人之间的差别。 事实上，它很精确地反映在全国各个计算机系的课程设置 上。 在常春藤联盟 的院校中，只教授 UNIX 、函数式编程、状态机理论。 当你顺着排名的顺序往下看到那些越来越少人问津的学校，你就会看到 Java 语言开始在课程中出现了。 你再往下看，大概就会看到有一些课程起了这样的名字 ： Microsoft Visual Studio 2005的101 课程，3个学分。 等到你看到2年制学院的部分，会发现有些课程的名字，同 “21天 SQLServer书课程”差不多，简直如同周末有线电视中的广告 一样。 想找好工作吗？现在正是你最好的时机开始学习（另一个声音出来说 ） Java Enterprise Beans !
46. A: 我真的很羡慕基建 可以纯粹搞技术

    B: 能真正纯粹搞技术的岗位很少的，脱离了业务，技术敏锐度也会下降的
47. ![image-20210206223725990](/files/-MSrm-p1YeZie5yhxZZs)

    A: 刚刚又突然想到了 惊讶系列分享中的一张图(已经分享过, 重温下思想)

    让我吃惊的是, 完全可以通过 fetch 指定 url 的内容 并设置到 innerHTML, 实现爬虫.. 在浏览器就可以跑, 什么库也不需要..

    最后 eval(code) 真的很惊艳..

    B: 恭喜你发现了 qiankun 的秘密

    A: 不过建议使用 new Function, Function 比 eval 安全性要高, 并且执行时性能也高

    B: new Function 主要不会污染全局

    A: 还有一点, new Function 仅需要处理传入的字符串一次，后面重复执行都是同一个函数，而eval需要每次都处理，性能更高

    A: 哈哈, qiankun 那个源码使用 new Proxy 代理 假window, new Function 执行代码的

    A: ![image-20210206223810223](/files/-MSrm1i0p2KuJrjysGjV)

    qiankun 沙箱的核心思想... 可能有误, 烦请指正..

    B: 大体上是这样，有很多细节要小心处理 比如 fakewindow 上 freeze 的变量什么的
48. 被马斯克一夜引爆的Clubhouse，到底是怎么回事？ <https://www.huxiu.com/article/407961.html>

    等一波国内竞品

    A: 打个赌，不出一个月，国内必有一个打着高知社区为主的特色版clubhouse出现。

    Club house 国内的下一个泡沫…

    B: 感觉只是一阵风，不会成为主流社交方式，甚至跟 yy 十几年前的模式有点像

    C: 感觉就是玩的一阵新鲜

    D: 没邀请码到现在都没进去看过啥样

    A: 会被炒一阵的 现象级应用资本不会放过

    A: 出现了 clubhouse 复刻品 <https://github.com/bestony/neshouse> NESHouse.com —— An open source implementation of ClubHouse
49. 我最近fo了一位大佬: <https://mikukonai.com/>

    看他的灵感片段 受益良多...

    ![image-20210206222015093](/files/-MSrlGWtMwTJ5AAc4hha)

    ![image-20210206222229987](/files/-MSrlBq29b11QngrCCL6)

    ![image-20210206222400834](/files/-MSrlDc3M_1VSSd3CSUX)

    ![image-20210206222314925](/files/-MSrl9lFWiovz65E-Uic)

    A: 关于上图的灵感主题, 我有些共鸣.. 也是最近困扰我的一件事..

    A: 我发现 我的系统完全做不到理性驱动, 那些我认为非高质量的信息 往往能给我很大的幸福感, 比如 B站的一些好玩视频..

    B: 刷视频真的好快乐哈哈哈

    C: 会有平衡点 我觉得都是需要的

    A: 哎, 但每次花时间在这些信息上面, 都有很大的负罪感..

    C: 怎么会

    A: 我觉得对我没有任何实质的帮助, 浪费了自己的时间, 我是罪人..

    C: 开心放松就完了，放松放松会冲劲更大

    A: 呃.. 好吧..

    A: 目前的做法是, 睡觉半小时之前吃褪黑素, 然后看会b站.. 就不会浪费太多时间.. 因为看着看着就睡着了...

    D: 我玩一天以后可能晚上会有负罪感，然后睡一觉第二天接着玩

    A: 太真实了....

    E: 以前我会有负罪感，现在一点都没有了上班那么累，多玩会儿不行吗

    A: hah 晚上再不学 一天就白过
50. B: 2020美团技术年货-合集：<http://dpurl.cn/uuHl2zr> 2020美团技术年货-前端篇：<http://dpurl.cn/1Ri23Fo> 2020美团技术年货-后台篇：<http://dpurl.cn/CcyQ7Ai> 2020美团技术年货-算法篇：<http://dpurl.cn/AMEswIw> 2020美团技术年货-顶会论文精选：<http://dpurl.cn/OLtVREA>

    A: 美团博客 网易云音乐博客 腾讯AlloyTeam博客 淘宝前端团队博客

    这几个官方博客,几乎每篇文章都没有水文..

    咦, 字节怎么没有.. 好吧, 字节技术沉淀还是不行.. 照阿里还是有差距的..

    C: 拼多多

    A: 拼多多就算了

    B: 华为：你直接念我名字得了 是不是点我

    A: 华为不是互联网企业嘛, 还能理解.. 不过华为开源产出还是有的

    字节好像没什么开源的产品 字节Github 官方仓库, star 最多的是 一个开源图标库 3k多..
51. 本周分享汇总： <https://thinking.tomotoes.com/archives/2021/2/1-6>

    共分享 92 条数，暂时未分类，实在太多了...

    上周分享条数 51 上上周分享条数 29 上上上周分享条数 71

    92 条信息 逐个分类，头疼...

    早知道不学这么多东西了...

    整整花了两个小时 整理完了...

    效率太低了...
52. A: 整理，一定要精简，精简，精简

    阅读的目的不就是为了，取其精华，去其糟粕嘛

    记得我们以前老师这样讲，读书就是为了把一本书理解为一句话，同时也能把一句话写成一本书

    B: 是这样的流程。

    1. 从手机里 把一周的选择消息记录都转发到电脑 （一次只能发99条）
    2. 把消息记录中的内容复制到 Typora （本地的一款编辑器） 如果遇到单纯的链接，还需要打开链接把对应的标题复制过来 如果遇到对话，还需要把每个人前面标志上字母代称 如果遇到图片，还需要调整下格式
    3. 把整理好的内容上传到 gitbook
    4. 由于图片不会自动上传，需要手动的上传遍所有图片
    5. 所有的信息条目本地分类
    6. 分类好的信息再复制到对应的 gitbook 上的分类
    7. 由于图片不会自动上传，需要手动的上传遍所有图片

    A: 这流程也太多了吧，哈哈哈哈

    B: 整理很好时间， 分类也很花时间，因为有的信息很难划分。 就比如下面这4篇

    ![image-20210207001652329](/files/-MSs8h1-c_xPQJfMzKXx)

    A: 你是喜欢整理，还是真的需要这些

    B: 由于使用微信群的方式，很多时候 有价值的信息都会被时间掩埋，并且当卸载微信或者换手机时，聊天记录也会丢失。 基于这些痛点，我创建了个站点：<https://thinking.tomotoes.com/> 站点里的内容 皆来自于 思考的价值 微信群，它记录了 自从建群以来 每天有价值的信息。

    算是一种记录吧。

    其实几乎没有同学看的。

    但意义不在于此。

    在于我怎么看这件事。

    可以看下我的年终总结 自己的热爱一章 <https://tomotoes.com/blog/2020/>

    A: 可以的 我的建议还是精简一些

    B: 没办法精简啊，都是信息流。

    A: 某个问题的具体描述，一些看法，引发的思考，等等；但基本上篇幅过长，引用的东西太多，而且中文表达的意思过于零模两可

    B: 我明白，但你说的这种场景不适合 信息流聚合。

    就比如刚刚的4篇文章图片，你觉得应该精简呢？

    A: 我是说，自己可以根据看完的文章，自己做一个简单的文本记录

    B: 哦，了解了，大部分好文，我会简单提两句，有的文章只是快餐而已。

    A: 那你就是喜欢整理了，哈哈哈哈

    B: 你可能不了解计算机，很多快餐文 没必要做记录的。

    我明白，其实知识内化部分 我有待提高，的确有的知识可以看完再梳理下。

    A: 既然你认为是快餐文，还有需要整理的必要性？

    B: 快餐文也好 好文也好，最重要的初衷是分享给大家。

    A: 了解，明白 但这样会累吧 乐此不疲但也还好

    B: 但是 每个人的爱好 都不一致。就比如我分享一些好文，有很多同学都不一定感兴趣，这也是一个大问题。

    A: 我不太看文章

    B: 是啊，所以 我在群规的第一条是 如果你觉得不舒服或者因为其他原因，可以随时退群。 在我看来 这是双向选择的事情，我完全理解。

    计算机太广了，不可能照顾到每一位同学的。

    A: 哈哈哈哈哈，还是能接触到了一些很有趣的事的

    B: 谢谢，这句话对我很有意义。
53. 我准备下一步获取知识，通过一些 paper 了。

    我目前的困境就在于此，信息获取的质量一直不高，不管是读书还是看文章。

    虽然平时我在群里分享很多文章，但这些文章一是质量一般，很少有好文章，二是找到这些质量一般的文章 也需要花时间。

    这不利于我进步。
54. A: 你的站点是自己建的的嘛？ 用的哪的服务器

    B: 关于 Tomotoes <https://tomotoes.com/blog/tomotoes/> 这篇文章有介绍，除了域名 整个网站还没花过钱。

    A: 服务器免费？很好奇，你没有备案，怎么没有被封掉，服务器是国外的，厉害了

    B: 托管服务器： GithubPage

    很简单，无论是技术方面的信息，还是其他方面，我都不会涉及中国大陆法律禁止的条令。 并且，我不会输出负能量。 然后，一个坏掉的番茄永不备案，永不迁入大陆服务器。 平时都很讨厌GFW的存在，但这个时候 我并不觉得有什么大碍。 我的微博，我网站的评论都需要站在墙外才能输入输出。 这样挺好的，避免了熟人发现我的情感弱点，避免了无意义的评论。 至于SEO，我不会主动去做。 我知道，这样做的后果就是网站流量太低。 哎，对于我来说，没什么，一个坏掉的番茄 是为我服务的。 每天就几十日活，很好，我的信息得到了分享，完全够了。

    A: 好的，待会去了解一下


# Information Theory

信息论（暂时没时间继续维护）

1. 分享篇文章:

   信息论入门教程 <http://www.ruanyifeng.com/blog/2019/08/information-theory.html>

   A: 总结下: 信息熵 表示随机信息的期望, 果然最本质的语言 还是数学. 它在通信中提供的最重要思想是 编码机制 (大概率信息分配短码), 和霍夫曼编码是一种实现机制.

   我对信息熵的概念 不是很感兴趣.. 大家口中常说的熵 其实指的是 事情发展的混乱趋势..且不可逆的..

   信息熵 与 热学熵 之间的关联.. 就是它们看待的介质不同.. 它们的思想是相同的..

   大家口中常说的熵, 是 熵 在现实事件中的引申意义.. 并不是熵 如果有哪里错误.. 请告知我哈..

   B: 信息论里面的信息熵是香农借鉴的热学熵，去解决通信领域具体的信息传输问题。广义的熵，是个更抽象玄学的概念

   A: 赞同, 我对广义的熵 理解就是 混乱度的不可逆性..


# Web

前端（暂时没时间继续维护）


# Vue

1. ![image-20201212212012129](/files/-MPZDaUPcCDB1WwKsv2J)
2. 分享8个非常实用的Vue自定义指令\
   <https://segmentfault.com/a/1190000038475001>


# Roadmap

1. 前端学习路线 : <https://objtube.github.io/front-end-roadmap/#/>


# CSS

1. 框架分享: Tailwind CSS - <https://tailwindcss.com/>

   Tailwind CSS 是一个高度可定制的基础层 CSS 框架，与其它 CSS 框架不同的是，Tailwind 并不提供预先设计好的内建组件。相反，Tailwind 提供了更基础的工具类（utility classes），可以让你直接在 HTML 源码上构建一个完全定制化的设计。

   并且 Tailwind 是我见到各种框架官网中 设计得最优雅简洁的, 看一下官网Demo, 就很想去尝试使用它.
2. 快餐文分享：

   Uncommon Use Cases For Pseudo Elements

   <https://ishadeed.com/article/unusual-use-cases-pseudo-elements/>

   摘要：Pseudo-elements are in use for a long time. However, there are some uses cases that I feel they are not entirely known across developers. I wrote down this article to shed light on them so they can be used more.

   作者用多个案例 介绍了 CSS 伪类的使用场景。
3. 分享一个练习 CSS-Flex 语法的游戏

   <https://flexboxfroggy.com/>

   一共24关, 通过写 Flex, 让小青蛙移动到合适的位置 即可过关.
4. ![image-20201212212132061](/files/-MPZDbqr98A_b95AwM0M)
5. 2020 CSS 现状报告

   <https://2020.stateofcss.com/>

   CSS 在 2020 年使用现状统计，涉及到了 CSS 的一些特性、框架、规范。
6. [如何只使用CSS提升页面渲染速度](https://mp.weixin.qq.com/s/aPguK-dZr7JMA-s2OOFyjg)
7. 好文分享:

   CSS Utility Classes and "Separation of Concerns"

   <https://adamwathan.me/css-utility-classes-and-separation-of-concerns/>

   摘要: Over the last several years, the way I write CSS has transitioned from a very "semantic" approach to something much more like what is often called "functional CSS."\
   这篇文章介绍了 HTML-CSS 编写的多种范式 以及 各种范式之间的差异与感触.本文的作者同时也是 TailWind CSS 的作者, 值得一读. 说实话 我几乎没有思考过 CSS HTML 之间的依赖, 一直按照文中的第一种 或者 BEM 规范去写, 原来它们之间一直没有做到 关注点分离, 一直存在依赖. 不过 现在 CSS IN JS, CSS Module 方案已经从编译方面打开了新出路
8. 快餐文分享: \
   来自新时代的 CSS \
   <https://mp.weixin.qq.com/s/pPtzhXbAaXfoTV2q3u0Dww>\
   文中列举很多关于 CSS 现在发展的一些技术 特性. \
   1\. css 命名规范, 遗憾的是 文章只提了 结构与样式分离的规范: BEM, 应该扯扯 构建函数单元的 css 命名规范 \
   2\. 简单介绍预处理器: less sass stylus \
   3\. 发展了很多年也没有声音的 CSS Houdini, 还不如说 css in js \
   4\. postcss, postcss 之于 css 就好比 babel 之于 js \
   5\. css module: 没说清楚.. \
   6\. stylelint 规范工具 \
   7\. postcss-preset-env 的规范: cssdb
9. 3行核心CSS代码的rate评分组件，秀到你怀疑人生

   <https://mp.weixin.qq.com/s/FE3IuNu66VxLDgHCHWIRVA>
10. 分享篇文章，讲的挺好的

    Facebook 重构：抛弃 Sass / Less ，迎接原子化 CSS 时代 <https://mp.weixin.qq.com/s/NmHUYZh_ILG-Phe53NcoEg>
11. ![image-20210116154309783](/files/-MR9AgI5oiX3wVfyfCnA)
12. 动漫版 flexbox cheat sheets，图示敲可爱\~

    <https://dev.to/joyshaheb/flexbox-cheat-sheets-in-2021-css-2021-3edl?utm_source=digest_mailer&utm_medium=email&utm_campaign=digest_email>
13. CSS 目前的三种趋势: \
    CSS-in-CSS (e.g. CSS, Preloader, CSS Modules) \
    CSS-in-JS (e.g. Styled Components, Emotion) \
    Utility-First-CSS (e.g. Tailwind CSS)
14. 点击网页的按钮, 如何只利用 CSS 发起网络请求:

    .some-button:active { background-image: url('some\_image.jpg') }

    点击按钮时, 触发 按钮 active 状态, 然后应用到 CSS 规则的 background-image: url(图片地址) 这就相当于对 图片地址 发起了一次网络请求..
15. 分享个网站: cssdb <https://cssdb.org/>

    cssdb is a comprehensive list of CSS features and their positions in the process of becoming implemented web standards.

    未来 CSS 的新feature 都可以在这里找到\~

    @media (480px <= width < 768px) {}

    关于媒体查询器, 新的语法方案, 看起来挺期待的.
16. 快餐文分享:

    CSS Tips you won't see in most tutorials <https://denic.hashnode.dev/css-tips-you-wont-see-in-most-tutorials>
17. 快餐文分享: CSS Grid 网格布局教程 <http://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html>

    摘要: Grid 布局与 Flex 布局有一定的相似性，都可以指定容器内部多个项目的位置。但是，它们也存在重大区别。 Flex 布局是轴线布局，只能指定"项目"针对轴线的位置，可以看作是一维布局。Grid 布局则是将容器划分成"行"和"列"，产生单元格，然后指定"项目所在"的单元格，可以看作是二维布局。Grid 布局远比 Flex 布局强大。
18. 快餐文分享: Scoping CSS using Shadow DOM <https://blog.bitsrc.io/scoping-css-using-shadow-dom-a548985b73af>

    使用 Shadow DOM 去隔离 不同应用之间的样式

    应用场景 太适合 微前端了..
19. Chrome 88 支持新的 CSS 属性`aspect-ratio`，可以设置容器的长宽比。

    这么常见的UI构建功能，现在才出现...

    ![image-20210206215650285](/files/-MSrkeXnha1BjGyQFKr8)
20. 分享篇好文： \
    Things You Can Do With CSS Today \
    <https://www.smashingmagazine.com/2021/02/things-you-can-do-with-css-today/>

    总结：

    1. grid 网格布局
    2. is 伪类选择器 .post :is(h1, h2, h3)
    3. where 选择器
    4. min max clamp 函数
    5. ch ex 字体尺寸单位
    6. text decoration 的一些 rule
    7. scroll-margin-top
    8. 之前分享过的 aspect-ratio 尺寸等比划分
    9. content-visibility：google 带头提出的一个特性，刚出的时候让我很惊艳，具体做的是：With content-visibility: auto, you can tell the browser not to worry about rendering the elements in there while they are outside of the viewport, which can have a massive impact on initial loading speeds.
    10. 支持嵌套选择
21. 分享篇文章: \
    CSS奇思妙想 -- 使用 background 创造各种美妙的背景 \
    <https://juejin.cn/post/6925600887947657224>

    chokcoco 每篇文章都很有艺术气息aaa..
22. 快餐文分享：

    如何把css'content的操作跟价值发挥到最大\
    <https://juejin.cn/post/6844903917348732936>

    counter 函数 与 content 中的字符拼接 可以关注一下
23. 惊讶系列分享，文中 画板的例子太秀了。 \
    你可能不知道的 transition 技巧与细节 \
    <https://juejin.cn/post/6924114612799406093>
24. CSS奇思妙想 -- 使用 CSS 创造艺术 \
    <https://juejin.cn/post/6922257014840098830> \
    我愿称为大艺术家chokcoco\~
25. Tailwind CSS （可能）是名过其实的 \
    <https://juejin.cn/post/6930196913119576077> \
    分享篇文章，文中的观点很赞同：对于原子类的使用，一直有这样的痛点：当封装的粒度太小时，会显得异常繁琐，反之想自定制化时又经常不合适。
26. 快餐文分享：

    CSS现状和如何学习 \
    <https://mp.weixin.qq.com/s/ztU1tESHy-5kF2iFpZbgfw>

    hah 我曾经也写过 CHSS，文章实在太长了...

    摘要：CSS与其编程语言不同，她没有循环、逻辑和其他概念，它只是声明式的语言，因此，CSS很容易上手。也许正是因为如此，它才获得了简单的美誉。在 "不复杂 "的意义上，它是简单的，但这并不意味着它很容易。把 "简单 "误认为是 “容易”，只会让人心痛”。
27. CSS 专业技巧 一个帮你提升 CSS 技巧的收藏集。

    <https://github.com/AllThingsSmitty/css-protips/tree/master/translations/zh-CN>

    文章中一些技巧很有实践意义，总结了下:

    1. all: unset; 可以用all简写來指定所有元素的属性。
    2. 安装字体时，使用 local 函数检查是否本地安装
    3. a\[href^="http"]:empty::before { content: attr(href); }
28. 好文分享：

    An Interactive Guide to CSS Transitions \
    <https://www.joshwcomeau.com/animation/css-transitions/>

    摘要：The world of web animations has become a sprawling jungle of tools and technologies. Libraries like GSAP and Framer Motion and React Spring have sprung up to help us add motion to the DOM.

    The most fundamental and critical piece, though, is the humble CSS transition. It's the first animation tool that most front-end devs learn, and it's a workhorse. Even the most grizzled, weathered animation veterans still reach for this tool often.

    文章很有价值，建议阅读。总结下自己从文章受益的点：

    1. 有的规则不能被子像素渲染，比如 margin，所以过渡时无论是 cpu 还是 gpu 渲染都需要 round to the nearest pixel, creating a stepped, janky effect.
    2. 过渡行为中定义的 transition 其实是在过渡行为结束后 才会起作用，这一点可以和之前分享过 chokcoco 你可能不知道的 transition 技巧与细节一文 联系在一起。 （可以在群记录中搜索 画板例子太秀了 关键词）
    3. Doom flicker，触发动画的元素 与 动画运动元素 一定要分清
    4. @media (prefers-reduced-motion: reduce) 可以使用此选择器禁用动画 关于最后一点，确实 动画太多，整个页面看起来较油腻，建议设计时 动画要小而精美。


# React

1. 昨天看到了一篇很好的文章, 关于如何更好地写 React。

   今天翻译了下，值得前端同学 一读。

   <https://tomotoes.com/blog/7-code-smells-in-react-components/>
2. 视频分享： Getting Closure on React Hooks by Shawn Wang | JSConf.Asia 2019 <https://www.youtube.com/watch?v=KJP1E-Y-xyo&ab_channel=JSConf>

   视频讲解了 如何用40行代码去模拟实现 React Hooks 特性。 对 React Hooks 有兴趣的同学可以了解下，其中的原理是使用到了闭包。
3. 为什么 React 源码不用 TypeScript 来写？ - Cat Chen的回答 - 知乎 <https://www.zhihu.com/question/378470381/answer/1079675543>
4. `const React = state => view`
5. 面试题分享:

   reactjs-interview-questions

   <https://github.com/sudheerj/reactjs-interview-questions>

   摘要: List of top 500 ReactJS Interview Questions & Answers....Coding exercise questions are coming soon!!

   前端同学可以有空刷一下, 此项目 star 近 9k 是我没想到的..
6. 为什么 react 还比 vue 火？ - 阿白的回答 - 知乎 <https://www.zhihu.com/question/51690331/answer/1112468309>
7. ![image-20201212212006821](/files/-MPZFCrdXXDjKQTfXx-B)
8. 快餐文分享: [使用 hooks 的开发模式](https://github.com/dt-fe/weekly/blob/v2/080.%E7%B2%BE%E8%AF%BB%E3%80%8A%E6%80%8E%E4%B9%88%E7%94%A8%20React%20Hooks%20%E9%80%A0%E8%BD%AE%E5%AD%90%E3%80%8B.md)
9. ![image-20201224233406549](/files/-MPZFCrf4MTadFWgd0eV)

   ​ A: 这条推笑死了, 未来的 React 编程方式.

   ​ B: hahah 未来 react 的全栈吗

   ​ A: 我看到这图的第一想法是, 这敢上线 数据库不分分钟被打穿.

   ​ Dan 发的, 我觉得有可能 hah
10. [React RFC Server Components是什么，有啥用](https://mp.weixin.qq.com/s/7AT5iNaJyRdAKaE3Rr321w)

    A: 这前后端 合久必分，分久必合..

    B: 快进到react全栈

    A: 做个BFF层还是不错的
11. 分享一个 111 页的PPT

    Intro to React, Redux, and TypeScript <https://blog.isquaredsoftware.com/presentations/react-redux-ts-intro-2020-12/#/>

    PPT 中简明扼要地讲了 React, Hooks, Styling, Redux, React-Redux, Redux-Toolkit, TypeScript 的基本概念, 以及使用场景.. 最后的推荐阅读链接 也不错
12. 短信息分享: You may not be familiar with his name but React’s original creator, Jordan Walke, has left Facebook. This comes after ten years with the company where he put an indelible stamp on both React and Reason. In announcing his departure he simply said he is “starting a new company” but also goes to say that he will also be investing in startups in the React/Reason ecosystems which is great.
13. 为什么不使用一个全局变量替代redux？ - 江湖术士的回答 - 知乎 <https://www.zhihu.com/question/428851039/answer/1673506867>

    暴躁老哥，在线答疑
14. Redux-toolkit The official, opinionated, batteries-included toolset for efficient Redux development \
    <https://github.com/reduxjs/redux-toolkit>

    建议了解下 我准备在项目中落地下 这个库, 看起来比原始使用 redux 香很多 自带 reselect, redux-thunk, immer, 还提供了 多种 action creator..

    reselect redex-thunk 都很让我印象深刻.. 之前看源码时.. 就短短一百行.. star 高达上万..

    ![image-20210116154210717](/files/-MR9A_bk7fe8n6-g5FU0)\
    这是 redux-thunk 的源码... 说白了 就是将 dispatch 传进函数中... <https://github.com/reduxjs/reselect/blob/master/src/index.js> 这个是 reselect 源码, 就是做了个 memories 的事情... 这就是 redux 的生态
15. 开发组件时，经常把 UI state 与 data state 混合在一起，看起来乱哄哄，这方面有什么好的实践嘛？ 我发现大部分的时间都是在调ui 调交互..
16. 分享一本刚刚整理的 React - Hooks 小册 - Dig deep into Hooks.\
    里面包括了一些 推荐阅读的源码库, 以及一些经典的 Hooks 片段. 前端的同学有空可以读一下\~ 对掌握 Hooks 会更有帮助的.\
    [Dig deep into Hooks](https://thinking.tomotoes.com/tags/docs/dig-deep-into-hooks)\
    这个小册没有包括 ahooks 中的一些例子, 因为 ahooks 每个 hook 之间存在耦合, 不容易整理成代码片段..\
    其他参考链接中的 hooks , 对我产生价值的 都整理了..
17. 快餐文分享: \
    5 Recommended Tools for Optimizing Performance in ReactJS \
    <https://blog.bitsrc.io/5-recommended-tools-for-optimizing-performance-in-reactjs-29eb2a3ec46d>\
    文章列举了检查 react performance 的一些工具: \
    1\. React 提供的 Profiler 组件 \
    2\. React Developer tools plugin \
    3\. why-did-you-render \
    4\. Chrome Devtools - Performance timeline
18. 好文分享: \
    将 React 作为 UI 运行时 \
    <https://overreacted.io/zh-hans/react-as-a-ui-runtime/>\
    摘要: \
    1\. React 程序通常会输出一棵会随时间变化的树。 它有可能是一棵 DOM 树 ，iOS 视图层 ，PDF 原语 ，又或是 JSON 对象 。然而，通常我们希望用它来展示 UI 。我们称它为“宿主树”，因为它往往是 React 之外宿主环境中的一部分 — 就像 DOM 或 iOS 。宿主树通常有它自己的命令式 API 。而 React 就是它上面的那一层。\
    2\. 请记住 React 元素并不是永远存在的 。它们总是在重建和删除之间不断循环着。\
    3\. 我喜欢将 React 元素比作电影中放映的每一帧。它们捕捉 UI 在特定的时间点应该是什么样子。它们永远不会再改变。\
    4\. 令人讽刺地是，React 并没有使用“反应式”的系统来支持细粒度的更新。换句话说，任何在顶层的更新只会触发协调而不是局部更新那些受影响的组件。 这样的设计是有意而为之的。对于 web 应用来说交互时间是一个关键指标，而通过遍历整个模型去设置细粒度的监听器只会浪费宝贵的时间。此外，在很多应用中交互往往会导致或小（按钮悬停）或大（页面转换）的更新，因此细粒度的订阅只会浪费内存资源。\
    \
    我喜欢将 React 元素比作电影中放映的每一帧, 它们捕捉 UI 在特定的时间点应该是什么样子。\
    这句话很有价值.. 这就是 React 的 render 原理体现.
19. <https://usehooks.com/useKonamiCode/> \
    分享一个有趣的 hooks, up up down down left right left right B A 的按键 彩蛋
20. 分享篇有关 React Hook 使用例子的文章: \
    useEncapsulation \
    <https://kyleshevlin.com/use-encapsulation>

    指出了 使用 hooks 典型的场景.
21. 分享篇文章: \
    5 React Custom Hooks You Should Start Using (Explained) \
    <https://dev.to/alterclass/5-react-custom-hooks-you-should-start-using-explained-5d18?utm_source=digest_mailer&utm_medium=email&utm_campaign=digest_email>

    文章写得挺好的，建议阅读。
22. 分享篇文章：

    React 事件系统工作原理 \
    <https://musicfe.dev/react-event/>

    摘要：React 为我们提供了一套虚拟的事件系统，这套虚拟事件系统是如何工作的，笔者对源码做了一次梳理，整理了下面的文档供大家参考。
23. Question: 以下组件 存在什么问题?

    ```
    const handleClick = () => {}
    <Button type="primary" onClick={() => handleClick()}> Click me </Button> 
    ```

    A: 每次渲染都会重复构造一遍这个回调函数\
    B: 好家伙，我垃圾代码看多了，这种没放在 usecallback 的函数我已经习以为常了。。。\
    C: 嗯 每次 render 时, onClick 都是一个新的函数, 而函数是引用类型, 所以 每次render 时 都会重新 render Button 组件...

![](/files/-MPr7-5D8G-CK16-HtHZ)

![ 分享下今天 coding 时对 React 的重新思考..](/files/-MPrDE0t6YMtC-dOytN3)

![设计优秀的代码, 看起来就像诗一样的优美..](/files/-MQD4blmGmRcFAm_lfJd)


# Index

1. 作为前端，工作中处理过什么复杂的需求，如何解决的? - 孟健的回答 - 知乎 <https://www.zhihu.com/question/362103682/answer/1024196584>
2. 为什么现在又流行服务端渲染html？ - Damon DanceForMe的回答 - 知乎 <https://www.zhihu.com/question/59578433/answer/332545815>
3. 每日一句分享:

   浏览器起初只是一个简单的远程文档查看器，后来被迫成为一个应用程序平台。由于浏览器一开始没设计为这个用途，后来互联网的诸多问题都是这个事实造成的。
4. 每日一句分享：Web 2.0时代最大的思想革命本质不是前后端分离，而是把网页当作独立的应用程序（app）。前后端分离只是实现这一新架构的必然结果。
5. 漫画 | 前端发展史的江湖恩怨情仇

   <https://mp.weixin.qq.com/s?__biz=MzUyNDYxNDAyMg==&mid=2247487283&idx=1&sn=a8062df3c5cf44e2921fa77919ce5f75>
6. 面试题分享:

   LeetCode-OpenSource

   <https://github.com/LeetCode-OpenSource/hire>

   LeetCode 官方面试题集锦，前端同学有空可以看一下。
7. ![image-20201207230402682](/files/-MPZDbKgVStGjJGTXTdA)

   【Mannequin.js: An Articulated Mannequin Figure Library】<https://boytchev.github.io/mannequin.js/>

   Mannequin.js: 关节式人体模型库。
8. 好文分享: [2020年大前端技术趋势解读](https://juejin.cn/post/6908713513271689224)
9. 快餐文分享: \
   Fetch API 教程 \
   <http://www.ruanyifeng.com/blog/2020/12/fetch-tutorial.html>
10. 快餐文分享:\
    [RxJS——给你如丝一般顺滑的编程体验（篇幅较长，建议收藏）](https://juejin.cn/post/6910943445569765384)\
    文章很长，大部分的篇幅都是在讲 rxjs 的一些概念与api，并没有结合实际场景，对rxjs感兴趣的同学可以了解下。
11. 分享个视频: 下一代 Web 应用的超能力：机器学习 \
    <https://www.youtube.com/watch?v=dDIk1Tmnj9A&ab_channel=GoogleChromeDevelopers>

    视频讲解了主流的AI概念, 以及 AI 为前端赋能 的应用场景..
12. 好文分享:

    前端生产方式：过去 10 年回顾和未来 10 年展望 \
    <https://mp.weixin.qq.com/s/c6-9wnxKTq5w3BVqlBFxPQ>

    摘要: 要看一个行业的未来发展怎样，就看这个行业的人才目前和未来在市场上被密集需要的地方在哪、规则最混浊或混乱的地方在哪。如果说这个行业的规则出奇地清晰、人才的供给又出奇的冷静，那么基本上来说，这个行业在市场的发展已经达到平衡状态，而能打破这种平衡重新建立平衡的也肯定是另外的行业的发展渗入。

    文章前半部分讲了 作者在阿里经历的变化, 后半部分则说明了 no-code 以及智能化 对传统前端带来的利与弊.

    最后，我还是带着大家一起展望一下前端智能化的未来 10 年（以如今的互联网发展节奏看，或许下面的 5 年内就达到也是有可能的）：

    2\~3 年内，前端智能化从业者数量翻倍，AI 在前端领域内或多或少有一些产品形态上的应用，终端开始浮现各种前端机器学习框架，用户产品在智能化体验方面的设计也有对应的倾斜，社区上也开始浮现出各种前端智能化的工程框架、训练框架和 AI 平台；

    3\~5 年内，前端智能化从业者数量继续增长，传统前端已经被淘汰，前端领域内智能化在特定领域内小有成绩，可以解决特定领域内的一些业务或人力生产效率问题，终端智能体验会趋渐成熟，给用户带来的沉浸式体验增强，线上线下无屏化无差异体验趋近相同，社区上开始开源一些前端的智能化产品；

    5\~10 年内，前端智能化从业市场已趋近饱和，端智能体验设计者应该在市场上比较吃香（如沉浸式人机对抗游戏等），nocode 问题应该能彻底解决，但同时带来其他的消费诉求，可能会引入新的领域难题。

    如今危机四伏，未来无限可期，所以大家还是要未雨绸缪，提前做好准备。

    以上摘抄自 文章最后一段, 结合我目前的经历来看 我觉得作者预测得并不是没有道理..
13. 好文分享:

    基于 Web 技术栈的动态化跨平台漫谈 \
    <https://mp.weixin.qq.com/s/0QViGHkt6R5fOZms-EpwAA>

    摘要: 随着互联网红利的消失，整个移动市场的关注从“流量”转成了“留量”，大部分的移动产品也都告别了初期的抢占市场，进入了 A/B 实验和快速试错的阶段，现有 App 都开始对用户的时间进行激烈的争夺。普通的 App 不断的扩展领域和内容来满足长尾需求、超级 App 们也不断的提高护城河构建自有生态。所以无论是流量分发、精细化运营、还是提升时长，都需要 App 不断的增加平台化的属性，高效的响应调整和变化。 技术趋势一定是顺应行业发展的，在提升效率这样的行业背景下，App 整体的架构和技术选型，也都到了进行服务于效率的架构升级，拥抱工程化敏捷的时候了。

    而 App 中的敏捷工程化 代表的正是 Web 与 Native 结合了. 文中讲了目前的 Web 在移动端的发展 很全面. 背景,意义,业界实践, 都说的很细致.
14. 快餐文分享: 【第1892期】GPU加速在前端的应用 <https://mp.weixin.qq.com/s/T8g8uSn6K_5gz2DiPBWk9Q>

    文章简单介绍了 GPU 做计算的优势, 以及前端如何借助 浏览器渲染机制利用 GPU 渲染. 原理就是 将 layer 提升成一个单独的图层..

    目前 利用 GPU 计算 在业界已经有对应的产品落地了.. 就比如 常见的 webgl 库 three.js pixel.js 也有利用 GPU 做计算的数据库 等..
15. 分享篇短文

    2020 前端技术发展回顾

    <https://mp.weixin.qq.com/s/b0pFJFXgBSyB56Ce86YMUg>
16. 分享两个名词:
    1. 动效 == 交互动画 界面动效能加强用户认知且增加活力。
    2. 品质建设 == 优化应用 就如 前端品质建设 主要为了解决白屏渲染, 提高 FCP, FP 指数.
17. 好文分享:

    前端架构发展史 <https://tomotoes.com/blog/history-of-front-end-architecture/>

    摘要: 在1990年，Tim Berners-Lee 在他的 NeXT 电脑上部署了第一套“主机-网站-浏览器”构成的Web系统，这标志着前端的开始。 在最初，前端是一片荒芜的，经过浏览器大战，W3C 标准化的过程 前端才慢慢成长了起来。

    这篇文章 读了很多遍, 主要讲了 前端改革 30 年，从一片荒芜到微前端兴起, 很有价值, 并且文笔很好, 推荐阅读.

    本文作者 是我一朋友￼, 狗头
18. 分享篇文章:

    微前端到底是什么？

    <https://zhuanlan.zhihu.com/p/96464401?utm_source=wechat_session&utm_medium=social&utm_oi=1088870436204318720&utm_campaign=shareopn>
19. 分享篇文章:

    JS Bridge 通信原理

    <https://mp.weixin.qq.com/s/cBsmunLXLBEtR14cFfy1LQ>

    可以着重看下概念与前端调用的方式
20. (2020.11.14) 分享一篇我今天看的好文, 值得前端同学读. <https://3perf.com/talks/web-perf-101/>

    摘要: This is an introduction to the modern web loading performance. Learn why performance is important, what performance optimizations exist and what tools help to understand if your app is doing well.
21. 快餐文分享:

    JavaScript: Conditional JavaScript, only download when it is appropriate to do so

    <https://umaar.com/dev-tips/242-considerate-javascript/>

    如何根据终端的配置来进一步优化 UX 呢?这篇文章给出了一些例子.
22. 快餐文分享: \
    页面的加载优化方案 \
    <https://blog.serenader.me/ye-mian-de-jia-zai-xing-neng-you-hua-fang-an>

    涉及了一些常见的点，可以简单刷下。
23. 哇 我发现了一个宝藏 up 主 , objtube的卢克儿 下面是他的一个视频: 【干货】浏览器是如何运作的？

    <https://www.bilibili.com/video/BV1x54y1B7RE>

    讲的很不错, 有空可以看看
24. ![image-20201122150208414](/files/-MPZFDCHdh1cf4XoBhrr)
25. 好文分享:

    Inside look at modern web browser

    <https://developers.google.com/web/updates/2018/09/inside-browser-part1>

    该系列由 Google 技术专家编写, 分为 4 个部分: 第一部分讲了 现代浏览器的架构. 第二部分讲了 页面导航时 浏览器内部发生的活动 第三部分讲了 浏览器如何渲染一个页面 第四部分讲了 浏览器处理事件时的动作

    非常建议 前端同学花点时间 阅读下该系列文章的, 是很有帮助的.
26. 据报道称“浏览器内核有上千万行代码”，浏览器内核真的很复杂吗？ - 龙泉寺扫地僧的回答 - 知乎 <https://www.zhihu.com/question/290767285/answer/1200063036>
27. 1995 - 2019浏览器大战 - 深度学习于NLP的视频 - 知乎 <https://www.zhihu.com/zvideo/1286027542877270016>

    02年 IE 市场占用率高达95%，但到现在已经出局。
28. Things you can do with a browser in 2020 <https://github.com/luruke/browser-2020>
29. 快餐文分享: \
    Introducing: The Async Cookie Store API \
    <https://medium.com/nmc-techblog/introducing-the-async-cookie-store-api-89cbecf401f>

    摘要: Are you sick and tired of weird ways to get cookies fromdocument.cookie ? Hate it that you don’t know whether the cookie you set was actually saved or not? Introducing: Cookie Store API, available on Chrome version 87!

    有生之年系列.
30. JS 在浏览器环境中 真正的并行执行..

    ![image-20210104232415831](/files/-MQD4KD9yG5JEO0GmtNS)

    通过 Worker API 去实现

    分享一篇没建群之前看过的好文

    Web Worker 文献综述 <http://www.alloyteam.com/2020/07/14680/>

    是腾讯 AlloyTeam 团队写的, 文章写的有深度, 该介绍的都介绍了.
31. 快餐文分享: \
    浅谈移动端开发技术 \
    <https://mp.weixin.qq.com/s/TXBRUVoOBDxr8P9Iw5FpTQ>

    文章花大篇幅讲了 hybrid 在移动端的一些原理

    在移动端 昂贵的不是 触发 render 的次数, 而是通信的次数.

    都说了 还是扩展下吧: web 的性能瓶颈 在于单线程模型, 这就是为什么 react 16 提出了 增量化 fiber 架构 移动端的 hybrid 的性能瓶颈 在于 线程通信, 不过 RN 从一开始就常用的 vdom, 可以将多次修改 增量化
32. 分享篇个人文章:

    前端架构发展史 \
    <https://juejin.cn/post/6923779473053581320>

    之前分享过一次, 不过那次写的比较糙, 这次重新润色了下, 并添加了微前端架构的使用场景..
33. Question: 怎么将不同技术栈的页面组合在一个页面，且不存在样式冲突，数据冲突。

    具体场景是，一个 vue 搭建的页面，一个 react 搭建的页面，继承进其他页面这样。

    这其实就是一道典型的前端面试题，考你的知识广度与深度。 只不过是我出的。

    Answer:

    1. Iframe
    2. Web components
    3. 构建时，打包多个子应用
    4. 微件化，远程 load js chunk
34. 换一个角度分析，网页性能优化

    <https://mp.weixin.qq.com/s/o8HOvYfUNUKPGydSak1mxA>
35. 你辛苦学会的 Webpack dll 配置，可能已经过时了 \
    <https://mp.weixin.qq.com/s/jtIbVc9Bl50TIs7YilWbFg>

    之前一直没想过前端工程与dll之间的关系..


# Webassembly

1. javascript为什么不像java一样直接事先编译成字节码然后跑在v8上？ - windliang的回答 - 知乎 <https://www.zhihu.com/question/429597199/answer/1575867910>

   它不是一种语言，而是规定了一种虚拟指令集，可以作为各个语言的编译目标，然后通过wasm的虚拟机运行到浏览器还有其他各个平台中。 对于前端领域，当前Webassembly在某些场景下可以有效提高前端项目的性能，并且可以将C/C++领域的一些优秀的库通过编译直接运行到浏览器中。如果前端遇到了性能的问题，不妨可以考虑下WebAssmbly的方案。

   ![image-20201207225633527](/files/-MPZFCrVm7QJCYHeuhmV)
2. 从 JS 引擎谈到 WebAssembly

   <https://mp.weixin.qq.com/s/p2a8P6_Ww8UAWOZqbgyAsg>

   文章写得不错，建议阅读.

   感觉这东西最大帮助就是扩展 web 生态，比如游戏迁移，调用opengl这些库啊.

   我一直觉得大部分场景下，web应用的性能瓶颈是单线程所致。


# Redux

1. Redux数据流管理架构有什么致命缺陷,未来会如何改进? - 张立理的回答 - 知乎 <https://www.zhihu.com/question/277623017/answer/1517983092>


# PL

编程语言（暂时没时间继续维护）


# Ruby

1. 快餐文分享:

   Ruby 3.0.0 Released

   <https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/>

   迭代了近5年的Ruby 3.0 发布了, 主要的提升聚集在三方面: 性能 并发 类型

   Matz(作者) 声明 Ruby3 比 Ruby2 快3倍.

   性能方面: 主要引入了 JIT 即时编译技术, 算得上几乎所有现代语言的编译器内置功能了

   并发方面: Ruby 的实现居然是 Erlang 的 Actor-model 方案, 这就有点意思了

   并且对于 block 操作, Ruby 还引入了 Fiber Scheduler 设计..

   哈哈, async await 的思想算是现代语言标配了

   其余信息可以查阅上面链接\~
2. 分享个项目： \
   rails/kredis <https://github.com/rails/kredis>

   基于 Redis 封装的数据模型，可以理解为高度集成的 orm， 支持元编程的语言就是硬气。。
3. 分享篇文章： \
   Ruby 编程语言入门 \
   <https://hutusi.com/articles/ruby-quickstart>

   ```
   一些我欣赏的特性：
   ​
   a = []
   a << 1        # [1]
   a << 2 << 3   # [1, 2, 3]
   ​
   a = [1, 2, 3, 4, 5]
   a[-2]         # 4, 负数下标从最后一个倒数
   ​
   # 获取子数组 切片
   a[1, 2]       # [2, 3] 第一个下标数字表示起始下标，第二个表示子数组长度
   a[1, 0]       # [] 
   a[0...-1]     # [1, 2, 3, 4]
   ​
   3.times { action }
   ​
   a << 1 这种命令式的符号表达 看起来挺好玩的。
   ```


# Lisp

1. 分享篇文章：

   State of the Common Lisp ecosystem, 2020 🎉 \
   <https://lisp-journey.gitlab.io/blog/state-of-the-common-lisp-ecosystem-2020/>

   了解下 Lisp 的生态\~
2. Podcast分享： <https://moon.fm/share/episode/3453/>\
   🎙Ep 07. Lisp 程序员眼中的 Python?

   讲了很多语言特性，编程范式，可以当做饭后零食\~


# Scala

1. 分享篇文章：

   6 Reasons Scala is Better Than Java \
   <https://levelup.gitconnected.com/6-reasons-scala-is-better-than-java-c328cfb410d1>

   一篇介绍 scala 的软文... Both Scala and Java run on JVM. So their code must be compiled into bytecode before running on JVM. But Scala compiler supports an optimization technique called tail call recursion. The optimization makes the Scala code compile faster than Java code.

   ？？？ 几乎每个语言都有自己的狂热爱好者，他们在社区里推销自己想法时，往往把语言包装成 能解决各种问题的银弹。尤其是这些学术派语言...


# OCaml

1. Podcast 分享： \
   OCaml编程语言 - 张宏‪波‬ \
   <https://podcasts.apple.com/cn/podcast/ocaml%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80-%E5%BC%A0%E5%AE%8F%E6%B3%A2/id1098682510?i=1000396401474>


# Python

1. ![image-20210206215723966](/files/-MSrkguM0eq2a-9VG5TW)

   喜欢列表生成器的语义
2. 分享个练习 Python 的站点, 一共有36道题目..都挺基础的 <http://www.practicepython.org/>
3. Podcast分享： <https://moon.fm/share/episode/3453/>\
   🎙Ep 07. Lisp 程序员眼中的 Python?

   讲了很多语言特性，编程范式，可以当做饭后零食\~


# Elm

1. 快餐文分享：

   A nice app on Elm street

   <https://madewithlove.com/using-elm-with-react-a-nice-app-on-elm-street/>

   摘要：Elm is both a language and an architecture – it is a functional, compiled to JS, strictly-typed, immutable and pure, opinionated language to build web applications.

   Elm 是 Facebook react 开发团队近些年推出的编程语言，是一种构建 web 应用的方式。

   其设计思想以及语法特性 与 Haskell 很相近。

   说句不好听的，这种学术派的产物 就算有大厂背书也很难推广到实际业务。

   Haskell 的命运我们都看到了，除了狂热粉一直在吹捧，其他连点浪花都没有。


# PHP

1. 快餐文分享:

   php8 发布 <https://www.php.net/releases/8.0/en.php>

   摘要: PHP 8.0 is a major update of the PHP language. It contains many new features and optimizations including named arguments, union types, attributes, constructor property promotion, match expression, nullsafe operator, JIT, and improvements in the type system, error handling, and consistency.

   PHP无论怎么更新，给我感觉还是一如既往的丑，设计得毫无章法。


# JavaScript

1. 好文分享:

   市面上各大JS引擎 内存系统的设计 <https://mathiasbynens.be/notes/shapes-ics>

   阅读完之后发现, 虽然 JS 可以从语法层面直接定义一个对象, 但是底层的存储设计 还是根据对象的结构 ,去设计出对应的template 来存储数据的.
2. V8 运行 JS 的过程

   1. 源代码(source code) 通过解析器(parser) 解析后 生成抽象语法树(AST)
   2. 抽象语法树 通过 解释器(interpreter-Ignition) 生成了字节码(bytecode), 此字节码作为基准执行模型, 字节码等同于 25%-50% 机器码大小. 并且 此时抽象语法树被彻底清除掉了, 释放其内存空间.
   3. 生成后的字节码 直接被 解释器执行 (解释执行),
   4. 在代码不断的运行过程中, 解释器收集到了很多可以优化代码的信息, 比如变量的类型, 哪些函数执行的频率较高.
   5. V8引擎的编译器(compiler-TruboFan) 会根据这些信息和字节码 来编译出经过优化的机器代码

   一些常见的优化规则:

   * 函数只是声明未被调用, 那么该函数不会生成到 AST
   * 函数如果只被调用一次, 字节码则直接被解释执行了
   * 如果函数被调用多次, 可能会被标记为热点函数, 会被编译成机器代码
   * 随着不断执行, 会有越来越多的代码被标记为热点代码, 然后被编译成机器码.

   所以 JS 运行的过程 正是一个从解释执行到编译执行的过程.

   ![image-20201122150314021](/files/-MPZDbWiDBb2ikTiE1dd)
3. ![image-20201122151039006](/files/-MPZDbWjIHEZo5GJgHLB)

   上图的 JS 代码, 包含tc39 目前所有提案 中的特性.
4. 代码片段分享: JS 利用 Symbol.iterator 实现遍历器

   ![image-20201128212044766](/files/-MPZD_WHTvrbAD7mDsxA)

   为什么 ES6 要给 JS 添加诸如 Python 那样的魔法函数呢..

   魔法函数: JS obj\[Symbol.属性] Python `__func__`

   C++ 运算符重载 Kotlin 后缀中缀函数表达式

   诸如此类 可以改变默认行为的特性..

   C++ 和 Kotlin 我倒是可以想象到使用场景, 当实现内部 dsl 时很有用

   但 ES6 中的各种Symbol属性 提供的自定义函数, 真是多此一举了.. 我找了很多资料, 就没发现一个有意义的demo... 都是为了用而用..

   反正 JS 莫名其妙的设计挺多的, 也不缺这一个..

   ![image-20201128213106040](/files/-MPZD_WIF34bkkEFAaKo)

   ![image-20201128213109783](/files/-MPZD_WJkAEcaSDZUizM)

   JS 完全可以借助 Proxy 实现内部 DSL! 太酷了\~

   ![image-20201128213230810](/files/-MPZDbWkd2j_Ugodh8lE)
5. 快餐文分享：

   ECMAScript 双月报告：TC39 11月会议提案进度汇总

   <https://mp.weixin.qq.com/s?__biz=MzI5NjM5NDQxMg==&mid=2247488302&idx=1&sn=6dd21d69db461379c0be9a50929b5b63>

   摘要：这次 TC39 会议是 2020 年度最后一次全员会议。这次会议中没有任何提案争取到从 Stage 2 进入 Stage 3 的共识，也没有提案从 Stage 3 进入 Stage 4。

   我喜欢 proposal-extensions 这个提案，现在的语言早就应该支持 Pointfree 特性了，就像管道似的\~
6. <https://www.instagram.com/p/CFeevK7g6ES/?igshid=1vfezo09h0sir>

   ![image-20201207230225367](/files/-MPZDbWl4bd_omGjxvSQ)

   A: copywithin？

   B: <https://es6.ruanyifeng.com/#docs/array#%E6%95%B0%E7%BB%84%E5%AE%9E%E4%BE%8B%E7%9A%84-copyWithin>

   ![image-20201207230254351](/files/-MPZDbWm-KNsq7UBYrfs)

   这个API 表示从未用过..

   C: 惊了

   B: 又是一个具有副作用的API...

   A: 好家伙

   B: 每次看到这种API 就头疼，pop,push,shift,unshift,splice,sort,copyWithin..

   我可能被函数式熏陶傻了

   C: 那用immutable.js继续嗨

   B: 哈哈，可以，全都是纯操作\[让我看看]
7. ![image-20201207230451095](/files/-MPZDbWncA-3yZlNowxI)

   A: \[让我看看]答案是 2

   B: 我和C都觉得是1, 我们答错了

   A: 这道题，确实有点问题

   B: 理解下来感觉像是 形参 被放到 arguments 对象，然后 a 指向 arguments\[0]

   A: 我回去查查资料，我越想越想不明白。

   B: 我也是瞎猜的哈哈哈

   D: 形参不是会和arguments形成映射吗

   A: 可是形参是基本类型啊，不存在引用啊。

   B: 你要是查到资料也告诉我们

   A: 就好比 const arr = \[1] const a = arr\[0] arr\[0] = 2 a === 1 => true

   B: ![image-20201207230614060](/files/-MPZDbWoCdZpUxACTUv1)

   ![image-20201207230624797](/files/-MPZDbWpP3vCxrAKk80j)

   C: 哇 果然 但是并没有解释到底是如何互相影响的

   A: 嗯，我在查

   D: 严格模式参数不会与arguments形成映射，使用es6默认参数自动使用严格模式

   A: <https://stackoverflow.com/questions/54323086/changing-javascript-functions-parameter-value-using-arguments-array-not-working>

   D: 非严格模式下arguments虽然和参数是两个独立的，但是会形成映射，一个还另一个会跟着改, 对不对，A？

   A: ![image-20201207230741720](/files/-MPZDbWqEVClRPHuO80n)

   对，不过有点瑕疵。

   es6 默认参数 是一个语法特性。

   E: 我啪的一声就站起来了奥 马老师发生社么事了

   A: 你说的映射其实可以衍生出两个概念。

   第一个是 arguments 本身代表的是函数内置参数，它是一个对象，类数组。

   第二个是 不严格模式下，里面的每一个数组元素都定义了 getter setter，而这些实现都是 native code，这就是映射的底层。

   所以造成的现象是，在不严格模式时，每次读取arguments，都会代表最新\[修改后]的参数。因为 setter 会同步修改函数栈里的参数。

   而严格模式，只有 getter ，也就是最初传递进来的参数。

   A: 我在找找具体的协议规范。

   A: 学 JS 这一点 一直让我不爽，想找 native code，只能去翻 V8 源码。

   A: ![image-20201207230822031](/files/-MPZDbWr0CANOPHBO2CL)

   <http://es5.github.io/#x10.6>

   “映射”后面的规范标准。

   ![image-20201207230844681](/files/-MPZDbWsfGHFGqTumEFc)

   D: 哎呀，这大英文

   A: 跟我上面中总结的雷同，只不过我用了 getter,setter 抽象了 share 这个概念。

   A: 没事，如果真遇到 这种面试题，你说映射 以及在严格模式的差异 就行。

   A: 并且要加一句，自己的观点。

   D: 好滴，感谢A的分享

   A: 就比如，修改参数会模糊数据的流向。

   D: 模糊数据的流向是啥意思？

   A: 这个就可以说说了，有些新手没有这个意识。

   假如你解释清楚，面试就十拿九稳。

   大部分的情况下 模糊数据流的情况 就是副作用函数 和 引用类型了。

   说白了，就是 修改了一个引用数据，这就会模糊数据流。

   我觉得，面试的时候是说白话挺减分的。

   最好从更高的抽象去回答问题，让面试官 对你印象深刻。

   C: 面试能回答出这个 可能你就是ssp了

   A: 面试嘛，就是个博弈的过程，要懂得表现的机会，要懂得如何通过小动作装出来，最关键是该懂的必须懂。 面试大忌就是 直接回答问题。 一定要说清楚 问题的背景，其代表的意义，业界的探索，最后再说答案，然后加一两句个人观点。

   A: 总之就是通过表演把答案回答得更丰满，更立体。

   A: 呃，我是菜鸡，这只是我的方法，意义不大。

   C: 感觉还是看硬实力
8. ![image-20201122151623196](/files/-MPZDbhoD6Zg2OHM4n6Y)
9. 解构的妙用

   ![image-20210107192120580](/files/-MQRbUEK9RAQHC5YFih9)
10. List of languages that compile to JS: \
    <https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS>

    JS 简直就是新时代的 跨平台 指令集. PS: wasm 的出现, 让编译成 JS 没有了太大意义..
11. Sorts an array of numbers, using the bucket sort algorithm. <https://www.30secondsofcode.org/js/s/bucket-sort>

    桶排序的 JS 实现
12. ![image-20210116152216996](/files/-MR9A4-bf7GtenTdIe5-)

    这个 snippet 太精彩了.. 只需短短几行代码 实现加权随机样本..
13. ![image-20210116153706363](/files/-MR9AAVAdDdO-d5tqt7g)
14. ![image-20210116154045754](/files/-MR9AOGOvMHHPYAGmvCj)
15. A: 最开始学 es6 那些新特性的时候, 我一直有个问题..

    就是 Promise.all 里面的 promise task 到底是 并发 还是并行 或者说 还是顺序执行..

    举个场景 await Promise.all(\[request1, request2, ...])

    B: 好问题 我已经停止思考了

    A: hah 和 event loop 有关

    A: 我觉得 并行是存在的 并发也是存在的 顺序执行也是存在的

    C: 我一直当并发理解的

    A: 主要看 每个 promise 在不同场景下的运行.. 需要多个维度思考..

    C: JS怎么并行啊，单线程，就跑在一个核吧

    A: 假如 promise 执行的是 一个 IO 请求, 底层会并行执行的

    并发执行 这个是 promise 的特性了 顺序执行 这个是 promise.all 的 check 机制

    A: 之前做项目 每次写 await Promise.all 我都心里不踏实,感觉跟个黑盒似的..

    现在没有.. 现在是写 css 有这种感觉.. 每次写定位 布局时, 都头大..

    ![image-20210116154030382](/files/-MR9AI8DeOGerFWGH2H9)

    我之前写的打包脚本, 感觉是 promise 的正确应用场景
16. 分享一个JS清单: <https://github.com/DrkSephy/es6-cheatsheet>
17. ![image-20210118000520853](/files/-MRG5s09q1GM2W9fJ_3P)

    两行代码实现全排列..
18. 快餐文分享: \
    🦸‍♂️ 11 JavaScript Tips and Tricks to Code Like A Superhero (Vol.2) <https://dev.to/orkhanjafarovr/11-javascript-tips-and-tricks-to-code-like-a-superhero-vol-2-mp6>

    我喜欢这个片段
19. 分享个项目: \
    In-JavaScript-we-trust \
    <https://github.com/yeungon/In-JavaScript-we-trust>

    In JS we trust - The best way to learn is by building/coding and teaching. I create the challenges to help my friends learn JavaScript and in return it helps me embrace the language in much deeper level. Feel free to clone, fork and pull.

    刷了两道就不想看了, js 奇怪的特性太多了
20. 分享篇文章： \
    You-Dont-Need-Lodash-Underscore \
    <https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore>

    文章介绍了常见的 工具函数的JS实现，有兴趣的同学可以刷一下。
21. 分享个项目: \
    gpu.js \
    <https://github.com/gpujs/gpu.js>

    GPU.js is a JavaScript Acceleration library for GPGPU (General purpose computing on GPUs) in JavaScript for Web and Node. GPU.js automatically transpiles simple JavaScript functions into shader language and compiles them so they run on your GPU.

    底层是使用的 webgl 调 gpu

    智能硬件，gpu 并行计算，这些领域都有待挖掘..
22. 好文分享:

    Future JavaScript: what is still missing? \
    <https://2ality.com/2019/01/future-js.html>

    摘要: In recent years, JavaScript has grown considerably in size. This blog post explores what’s still missing. Notes: I’m only listing the missing features that I find most important. Many others are useful, but there is also a risk of adding too much. My choices are subjective. Almost everything mentioned in this blog post is on TC39’s radar. That is, it also serves as a preview of a possible future JavaScript.

    面向未来的 JavaScript 应该是什么样.

    不得不说 JS 的历史包袱太重了.
23. ![image-20210206222156542](/files/-MSrlJ6MQncmPJznpzeJ)

    stage 3
24. 梳理下 Promise API:
    1. Promise.allSettled (ES2020) 返回每个 promise 结果, 不管是 fulfilled 还是 rejected
    2. Promise.all (ES2015) 如果有一个 promise rejected, 则立刻返回 reject; 否则等待所有 promise fulfilled
    3. Promise.race (ES2015) 如果有一个 promise fulfilled or reject 则立刻返回, 可以用于 网络超时 你想到了嘛?
    4. Promise.any (ES2021) 如果有一个 promise fulfilled 则立刻返回
25. ![image-20210206221646099](/files/-MSrky8JJ62-0JINXmmn)
26. 你不知道的 Proxy

    <https://mp.weixin.qq.com/s/SN8HqiGA30-IJ7OZ3WMr3g>
27. 假如重新设计 JavaScript 它会是什么样的？ - 贺师俊的回答 - 知乎 <https://www.zhihu.com/question/442622908/answer/1715676739>
28. ![image-20210206223725990](/files/-MSrm-p1YeZie5yhxZZs)

    A: 刚刚又突然想到了 惊讶系列分享中的一张图(已经分享过, 重温下思想)

    让我吃惊的是, 完全可以通过 fetch 指定 url 的内容 并设置到 innerHTML, 实现爬虫.. 在浏览器就可以跑, 什么库也不需要..

    最后 eval(code) 真的很惊艳..

    B: 恭喜你发现了 qiankun 的秘密

    A: 不过建议使用 new Function, Function 比 eval 安全性要高, 并且执行时性能也高

    B: new Function 主要不会污染全局

    A: 还有一点, new Function 仅需要处理传入的字符串一次，后面重复执行都是同一个函数，而eval需要每次都处理，性能更高

    A: 哈哈, qiankun 那个源码使用 new Proxy 代理 假window, new Function 执行代码的

    A: ![image-20210206223810223](/files/-MSrm1i0p2KuJrjysGjV)

    qiankun 沙箱的核心思想... 可能有误, 烦请指正..

    B: 大体上是这样，有很多细节要小心处理 比如 fakewindow 上 freeze 的变量什么的
29. ES6 提出 class 关键字是希望解决什么问题？它是不是鸡肋？ - 大宽宽的回答 - 知乎 <https://www.zhihu.com/question/432832293/answer/1719931291> \
    宽老师居然来飞书做架构师了..
30. 分享篇文章：

    Writing JavaScript tools in other languages – a new trend\
    <https://2ality.com/2020/10/js-plus-other-languages.html>

    摘要：Recently, we have seen an uptick of JavaScript tools being written in languages other than JavaScript. This blog post lists a few examples and explains the appeal of not using JavaScript.
31. <https://weibo.com/1787076481/K15Zi8Xk2?type=repost>

    JavaScript 2020 年度普查 (2) · 技术章 | 程序员黄玄 - 2020 年最受关注的技术 —— 横跨 JS 方言、前端/后端/测试框架、数据层、构建工具、桌面端移动端 App 开发方案。

    视频做的很棒，建议观感\~
32. 好文分享：

    深入理解JSCore \
    <https://tech.meituan.com/2018/08/23/deep-understanding-of-jscore.html>
33. 快餐文分享：

    聊聊 JavaScript 的并发、异步和事件循环 \
    <https://musicfe.dev/eventloop/>

    文章涉及了一些基本的概念，可以简单看下。
34. 好文分享：

    JavaScript Promises: 9 Questions \
    <https://danlevy.net/javascript-promises-quiz/>

    My goal is to try a new ‘quiz tool’ I built for my blog, and get feedback on how well you learned from the excercise.

    除了第一个比较特例，剩下的都正确了，文章是以题目+讲解的形式 去学习 Promise 。
35. 好文分享：

    随机数的故事 - 李银城的文章 - 知乎 \
    <https://zhuanlan.zhihu.com/p/205359984>

    文中涉及了一些知识，概况一下：

    1. v8 Math.random 是借助系统上的随机数能力实现的
    2. 系统上随机数 是不安全的，在大的数据量下会有特征
    3. 可以借助window\.crypto.getRandomValue实现更安全的随机
    4. 真随机的实现有多重多样，文中说的 根据系统运行时的噪音生成、大气噪音、量子随机等等

​


# Haskell

1. 函数式宗教文化:一见Haskell，立刻想到纯函数式，立刻想到Monad，立刻想到范畴论，立刻想到数学，立刻想到自己是小天才。程序员的想象惟在这一层能够如此跃进。
2. Rust相较于Haskell除了效率还有何优势？ - parker liu的回答 - 知乎 <https://www.zhihu.com/question/31644802/answer/1720583773>


# Go

1. Go 语言：全面分析为什么我们需要泛型

   <https://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651443700&idx=1&sn=1b0c8e0eb989bd3eeebefb613925e700>
2. 快餐文分享:

   Go-通道用例大全

   <https://gfw.go101.org/article/channel-use-cases.html>

   摘要: 文章详细地解释了通道类型和通道值，以及各种通道操作的规则细节。本文的目的是展示尽量多的通道用例。但是，我们应该知道通道并不是Go支持的唯一同步技术，并且通道并不是在任何情况下都是最佳的同步技术。

   这篇文章 我之前已经读过很多遍了，每次读完都有不同的感受，通过 channel 去模拟并发原语，并天然在语法层面上支持 coruntine，这就是 Golang 的设计魅力所在。
3. 激荡60年——垃圾回收与Go的选择

   <https://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651442959&idx=3&sn=83882fbdc628e48d054c000d499be4f4>

   与V8垃圾回收有异曲同工之妙。
4. Golang 主题分享:

   Go2 泛型设计草案更新 <https://v2ex.com/t/733860> 泛型提案终于迭代了.. 个人感觉这次提案的更新 挺赞的, 符合 Golang 大道至简的观念.
5. <https://www.golangprograms.com/go-language/concurrency.html>

   快餐文分享，操作系统中经典案例的Golang实现，Demo 值得阅读。
6. 快餐文分享: \
   maybedoer: the Maybe Monoid for Go\
   <https://christine.website/blog/maybedoer-2020-05-23>\
   函数式编程中 maybe monod 在 Go 中的实现.
7. 快餐文分享: \
   Go语言的设计哲学之三：并发 \
   <https://www.imooc.com/read/87/article/2340>\
   文中讲了传统语言的并发方案的缺点 如下, 以及 Goruntine 模型的简单介绍.\
   摘要: \
   并发单元间通信困难，易错：多个 thread 之间的通信虽然有多种机制可选，但用起来是相当复杂；并且一旦涉及到 shared memory，就会用到各种 lock，死锁便成为家常便饭 对于很多网络服务程序，由于不能大量创建 thread，就要在少量 thread 里做网络多路复用，即：使用 epoll/kqueue/IoCompletionPort 这套机制，即便有 libevent、libev 这样的第三方库帮忙，写起这样的程序也是很不易的，存在大量 callback，给程序员带来不小的心智负担。\
   nodejs deno 在底层全是用的 epoll/kqueue/IoCompletionPort 这套机制 , 只不过在应用层 nodejs 使用的是 libuv, deno 使用的是 Tokio..
8. Go 语言网络轮询器的实现原理

   <https://mp.weixin.qq.com/s/wwyxfWrvNMRhB1fLrZQRww>
9. 分享篇文章:

   GO 编程模式：FUNCTIONAL OPTIONS \
   <https://coolshell.cn/articles/21146.html>

   Go 复合结构 初始化的一些实践

   说到 Go, 它设计中有一点, 让我很喜欢

   它不支持 同时"可读可写"

   什么叫 同时"可读可写" ?

   1. i++ , 把 i 加 1, 该表达式会返回 i 未更正的值.
   2. a = 2, 把 a 赋值为 2, 该表达式会返回 2

   这种设计 现在大部分编程语言都有.. 我真的很想吐槽, 这是什么脑残设计..

   c 语言考试, 还就爱考 i++, ++i 这种问题..

   我之所以说这种设计脑残, 就是因为 从语义上来看, 它本应就是一个 只读或者只写的操作.

   把本来很简单的语义搞得异常复杂..

   A: 有点好奇 马老师为什么能在短短一小时里看了那么多篇文章

   B: 你可以看看我发的文章... 真的挺简单的.. 都是已有的概念..

   B: 就比如这篇文章, 我只是想衍生讨论下..

   每次分享这种文章, 也是为了能"下沉市场"...

   B: 我阅读最大的动力, 就是想找到一个让我惊讶 兴奋的知识..

   可是很难遇到.. 我太菜了 就怪我读不懂 paper
10. 调度系统设计精要

    <https://mp.weixin.qq.com/s/R3BZpYJrBPBI0DwbJYB0YA>

    调度系统其实就是调度器（Scheduler），我们在很多系统中都能见到调度器的身影，就像我们在上面说的，不止操作系统中存在调度器，编程语言、容器编排以及很多业务系统中都会存在调度系统或者调度模块。这些调度模块的核心作用就是对有限的资源进行分配以实现最大化资源的利用率或者降低系统的尾延迟，调度系统面对的就是资源的需求和供给不平衡的问题。

    在操作系统的进程调度器中，待调度的任务就是线程，这些任务一般只会处于正在执行或者未执行（等待或者终止）的状态；而用于处理这些任务的 CPU 往往都是不可再分的，同一个 CPU 在同一时间只能执行一个任务，这是物理上的限制。简单总结一下，操作系统调度器的任务和资源有以下特性： 任务 —— Thread 状态简单：只会处于正在执行或者未被执行两种状态； 优先级不同：待执行的任务可能有不同的优先级，在考虑优先级的情况下，需要保证不同任务的公平性； 资源 —— CPU 时间 资源不可再分：同一时间只能运行一个任务；

    除了操作系统和编程语言这种较为底层的调度器之外，容器和计算任务调度在今天也很常见，Kubernetes 作为容器编排系统会负责调取集群中的容器，对它稍有了解的人都知道，Kubernetes 中调度的基本单元是 Pod，这些 Pod 会被调度到节点 Node 上执行： 任务 —— Pod 优先级不同：Pod 的优先级可能不同，高优先级的系统 Pod 可以抢占低优先级 Pod 的资源； 有状态：Pod 可以分为无状态和有状态，有状态的 Pod 需要依赖持久存储卷； 资源 —— Node 类型不同：不同节点上的资源类型不同，包括 CPU、GPU 和内存等，这些资源可以被拆分但是都属于当前节点； 不稳定：节点可能由于突发原因不可用，例如：无网络连接、磁盘损坏等；
11. 快餐文分享：

    Go 并发编程范例 \
    <https://steeed.gitee.io/gotour-concurrency-coding-example.html>

    Goruntine + channel 实现多种并发模型 真的不要太简单。
12. 好文分享：

    Let's Create a Simple Load Balancer With Go \
    <https://kasvith.me/posts/lets-create-a-simple-lb-go/>

    摘要：Load Balancers plays a key role in Web Architecture. They allow distributing load among a set of backends. This makes services more scalable. Also since there are multiple backends configured the service become highly available as load balancer can pick up a working server in case of a failure.

    文章写的很好，由浅入深 先介绍了 负载均衡常见的策略，然后给出了实践，重试机制，心脏检测都有涉及，可惜的是反向代理的核心流量转发 使用的是 Go library 中的 ReverseProxy..
13. 文章分享：

    go-patterns - Semaphore

    <https://hxangel.gitbooks.io/go-patterns/content/synchronization/semaphore.html>

    使用 channel 实现 信号量，代码很简单，文章很短，建议阅读。


# CSharp

1. ![image-20201122151631637](/files/-MPZDbpD6HUvq2TCCee2)

   C# 求 斐波那契数列

   多返回值的设计很好, 但 为什么还要支持 返回键名引用..

   我猜测 多返回值 在内部的类型就是一个数据类....

   甜得齁得慌..

   我最欣赏的两门语言 Go, Kotlin, 在我看来他们的设计者才真正的懂语言..

   其他语言 就像是各种特性的缝合怪..
2. ![image-20201122150252900](/files/-MPZDbpFHvtCdyNhyHk4)

   C# 判断一个字符串为空的写法...
3. 快餐文分享:

   C# Updates for the Absent C# Developer (C# 6.0 and newer overview)

   <https://gamlor.info/posts-output/2020-12-05-csharp-for-the-absent/en/>

   摘要: It has been a while since I actively developed in C#. I mostly worked with C# and .NET during the 3.0 to 4.5 days and I did async/await work very early on, so I skip over that as well. After a job change, I didn’t touch C# for actual work. I mostly just watched the development from the sidelines via news. Today, I take a short look at some features. I will skip a lot and just add some of my highlights tour.

   文章介绍了 C# 6.0 以来的新特性语法。


# Shell

1. 书籍分享：

   introduction-to-bash-scripting

   <https://github.com/bobbyiliev/introduction-to-bash-scripting>

   书中介绍了 Shell 的基本语法特性，并用多个案例带你实战。

   虽然此书一共才122页，但内容很全面，由浅入深。值得阅读。
2. 知识分享：

   chmod: 改变文件权限

   文件权限有两种设置方法，一种是数字权限，一种是符号权限。

   Linux 文件的基本权限就有九个，分别是 **user/group/others(拥有者/组/其他)** 三种身份各有自己的 **read/write/execute** 权限。

   1. 符号权限方式：

      `chmod [-R] [u,g,o] [+,-,=] [文件或目录]`

      `-R`: 目录下的所有文件都会变更

      user/group/others(拥有者/组/其他) 分别对应的缩写为 u,g,o

      `+` 代表增加权限，`-` 代表删除权限，`=`代表设置权限

      例：`chmod u=rwx,g=rx,o=r 文件名`
   2. 数字改变权限方式

      各权限的分数对照表

      * r:4
      * w:2
      * x:1

      rwx = 4 + 2 + 1 = 7

      wx = 2 + 1 = 3 rx = 4 + 1 = 5

      rw = 4 + 2 = 6

      `chmod [-R] xyz 文件或目录`

      `-R`: 目录下的所有文件都会变更

      xyz : 就是刚刚提到的数字类型的权限属性，为 rwx 属性数值的相加。

      例：`chmod 777 .bashrc` => -rwxrwxrwx
   3. ![image-20201202194022778](/files/-MPZDbnlrUTtH6orISd0)

      我就简单多了

      ![image-20201202194044134](/files/-MPZDbnm6HRoxBQKzy9y)
   4. 快餐文分享:

      Defensive BASH Programming

      <https://kfirlavi.herokuapp.com/blog/2012/11/14/defensive-bash-programming/> 摘要: Here is my Katas for creating BASH programs that work. Nothing is new here, but from my experience pepole like to abuse BASH, forget computer science and create a [Big ball of mud](http://en.wikipedia.org/wiki/Big_ball_of_mud) from their programs. Here I provide methods to defend your programs from braking, and keep the code tidy and clean.

      由于 Shell 的糟糕设计, 作者提出了 防御性编程规范...
3. Shell的魅力

   ![image-20210206215911726](/files/-MSrkk-wwly3r-B7fD86)

   A: jq 不会是 jquery 吧。？

   B: 不是 Go写的 查询 json 的一个知名工具
4. sudo=速冻 cd=吃的 ls=零食 ps=披萨 ssh=熟食 scp=水产品
5. alias please=sudo


# Index

1. 会不会出现不同编程语言的使用者对同一个的概念理解不一致的现象？ - 大宽宽的回答 - 知乎 <https://www.zhihu.com/question/366449539/answer/981637860>
2. LLVM IR指令集能否实现所有高级语言？ - 向往真善美吧的回答 - 知乎 <https://www.zhihu.com/question/432890562/answer/1605900370>
3. 计算机科学的先驱 Alan Perlis 给低层语言（low-level languages）下的定义是：

   > “A programming language is low level when its programs require attention to the irrelevant.” \[5]

   如果用一门语言编写的程序**需要处理不相关的东西**，那这就是一门低层语言。
4. 为什么编译器过度优化导致线程安全问题？ - invalid s的回答 - 知乎 <https://www.zhihu.com/question/388121842/answer/1195382979>
5. 高级语言有中断这个概念吗? - invalid s的回答 - 知乎 <https://www.zhihu.com/question/341367635/answer/817583000>
6. <https://juejin.cn/post/6903456514355232776>

   <http://www.yinwang.org/blog-cn/2017/05/23/kotlin>

   A: 分享两篇关于 Checked Exception 机制的文章，我个人赞同垠神的观点，异常检查没有银弹可言。但也正如掘金郭霖前辈所说 绝大多数的方法其实都是没有抛出异常的。

   业界的其他语言 不管是 Go 还是 Rust，错误处理都一直被人诟病，这也代表了开发的复杂性，有的时候 不能不正视 逻辑下隐含的异常，而各种 try catch , 多返回值，Optional 等各种设计方案 就是为了处理这种脏活出现的。

   的确没有 CE 是方便了开发者，但稳定性，维护性 很难得到保证。

   另，Rust 的错误处理方案 如果你熟悉函数式的话，其实是一套理论..

   相比之下 JS 就像个小孩子... 还是傻了吧唧的那种（缺乏类型系统）..

   B: rust的错误处理我觉得还挺优雅的 比go高到不知道哪里去了

   B: ce设计初衷没问题 强迫程序员处理错误 但是程序员都比较懒

   A: 懒惰才是第一生产力
7. 好文分享:

   编程语言学习心得 （完全版） -- 不要害怕遗忘和混淆

   <https://mp.weixin.qq.com/s?__biz=MzI2MjQ3Njk2MQ==&mid=2247483875&idx=1&sn=4b693ca650cc952fae47fcad7280d612>

   摘要: 很多工程师往往把学习语言的重点放在了学习不同语言的语法上，而忽略了语言背后的思想及适合的应用场景。

   其实对于编程语言的学习，意义最大，收获最大的就是对于编程思想的学习。正如著名的计算机学者，首位图灵奖获得者，Alan Perlis说的那样如果一个编程语言不能够影响你的编程思维，这个语言便不值得学习。
8. “A language that doesn’t effect the way you think about programming, is not worth knowing.” - Alan Perlis\
   正确有效的学习编程语言对于我们编程思维的提高有着很重要的影响，即使是去学习的一些暂时 还用不到的编程语言。
9. 快餐文分享:

   漫画 | Java小子和C老头儿的硬盘夜话

   <https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665523198&idx=1&sn=206c2ed4035207aaae049aeab8dd83a0>

   A: 多线程学了三套 Windows的方法到Linux下，还得自己研究怎么实现

   B: mingw
10. 我确认我的串讲主题了, 不讲 组件化了, 这东西 老生常谈 感觉没什么新东西. 我还是讲 编程语言, 刚刚确定了一些 子主题:

    1. 编程语言的三种阵营 (学术派, 底层派, 应用派)
    2. 编程语言 与 语义学
    3. 决定编程语言所在领域的关键因素
    4. 不同编程语言的不同 IO 模型
    5. 编程语言 与 DSL
    6. 编程语言常见范式: FP OOP 命令式
    7. 编程规范: 防御性编程, SOLID 五大原则, 抽象的颗粒度, API 的优雅设计, 对输入有所限制 对输出包容等
    8. 编程语言的类型系统
    9. 元编程
    10. 如何实现一门编程语言 (利用现在后端的技术 llvm), 以及之前我写过的 Brainfuck 解释器
    11. 编程语言的历史/重要人物/ 可引申出 学多门语言对编程思想的重要性
    12. 常见编程语言的编译步骤 (AST, 中间字节码, 收集数据优化..)
    13. 未来编程语言的设想
    14. 不同编程语言处理异常的不同做法
    15. 内存管理, 常见的 GC 机制
    16. 不同编程语言的工具链/生态
    17. 不同语言下的模式匹配,可用 TS 中的 refer 引出共鸣
    18. 揭秘设计模式 就是一个营销概念
    19. 编程与工程之间的关系, 可以说说 软件工程的知名营销概念
    20. 编程语言与操作系统之间的关系: 现代编程语言 不可避免的复杂性 离不开操作系统的最初设计

    嘿嘿, 主题就叫 漫谈编程语言.
11. 编程语言的关键词个数: <https://github.com/e3b0c442/keywords>

    ![image-20210201232452774](/files/-MSTD8PCuvSU97G8EKyN)

    甜得齁人的C#位居第二 107 关键词 大道至简的 Golang 25 关键词
12. 分享篇文章:

    漫谈编程语言 <https://tomotoes.com/blog/talking-about-programming-language/>

    本文来自于 我在公司内部的一次分享。 主要简述了编程语言的阵营，语义的表达形式，不同的思维范式，以及常见规范和执行机制。 感兴趣的朋友可以读一下\~
13. 分享篇文章: FIZZBUZZ IN 10 LANGUAGES! <https://iolivia.me/posts/fizzbuzz-in-10-languages/>

    FizzBuzz 是一个简单编程题, 从 1 到 100 的数列中, 遇到3的倍数输出Fizz, 遇到5的倍数输出Buzz, 遇到3与5的共同倍数输出FizzBuzz, 否则输出数字本身

    文中给出了 10种不同编程语言的实现.. 其中 rust 的模式匹配特性 与其他语言格格不入..

    如果是我的话, 我会这么写

    ```
    const solution = () => Array.from({ length: 100 }, (_, i, a = !((i + 1) % 3), b = !((i + 1) % 5)) => a && b ? 'FuzzBuzz' : a ? 'Fuzz' : b ? 'Buzz' : (i + 1)).forEach(i => console.log(i))
    ```


# Objective-C

1. Objective-C 语法上有什么优点吗？ - doodlewind的回答 - 知乎 <https://www.zhihu.com/question/24115153/answer/1597551264>
2. 好文分享：

   深入理解JSCore \
   <https://tech.meituan.com/2018/08/23/deep-understanding-of-jscore.html>


# C

1. 分享篇老文 \
   Tutorial - Write a Shell in C \
   <https://brennan.io/2015/01/16/write-a-shell-in-c/>

   之前使用 Golang 写过 一个简易的 Shell，原理很简单。

   文中介绍了下：Let’s look at a shell from the top down. A shell does three main things in its lifetime.

   Initialize: In this step, a typical shell would read and execute its configuration files. These change aspects of the shell’s behavior. Interpret: Next, the shell reads commands from stdin (which could be interactive, or a file) and executes them. Terminate: After its commands are executed, the shell executes any shutdown commands, frees up any memory, and terminates.


# TypeScript

1. 进来看看，TypeScript居然还能这么玩 - 晓黑板前端技术的文章 - 知乎 <https://zhuanlan.zhihu.com/p/296277982>
2. 深入理解 Typescript 高级用法 <https://github.com/hannq/ppt-share/blob/master/courseware/ts-advance-usage/README.md>

   摘要: 有人说 Typescript = Type + Javascript，那么抛开 Javascript 不谈，这里的 Type 是一门完备的编程语言吗？

   文章用多个案例, 展示了 TS 面向 Type 编程的特性.. 目前 TypeScript 不只是 带有 Type 的 JS 了.. 其类型系统 已经演化得十分强大... 所有编程语言都远不及..

   但是这样这么强大的类型系统, 真的有必要吗? Type 只是一种重要的上下文信息, 在 coding 时, 应该追求简单明了的类型建模, 而不应为了 Type 增加心智负担, 照这样下去, 免不了要 debug Type... 那就多少有点魔幻了..

   现在 TS 的发展已经趋向于是两种语言的融合: 一种是 JavaScript, 另一种是 <加粗>Type<加粗>Script...

   ![image-20201122151800661](/files/-MPZDb3TYr1DpK9KFpE-)
3. 好文分享:

   clean-code-typescript <https://github.com/labs42io/clean-code-typescript>

   教你如何写干净的代码, 文章中的思想,技巧 总结得还是很全面的. 另: 学习不要被编程语言限制, 要有个做科学家的心.
4. TypeScript 设计中的最大槽点就是支持鸭子类型。

   ![image-20201124113306313](/files/-MPZDdSAJHhKfh0xDkMs)

   每次看到具有该特性的代码, 都令我无法忍受.

   在我看来 这种设计只有坏处:

   1. 上下文更难以分析, 数据会无意间具有另一个身份（Type）
   2. 更难以追踪接口, 只能借助编辑器
   3. 与静态类型的原则相违背
5. 快餐文分享：

   1.2W字 | 了不起的 TypeScript 入门教程

   <https://juejin.cn/post/6844904182843965453>

   基础的语法，知识点都有提到。

   一份不可多得的 TS 学习指南（1.8W字） <https://juejin.cn/post/6872111128135073806>
6. 快餐文分享:

   TypeScript 高级技巧

   <https://juejin.cn/post/6844903863791648782>

   文中的 demo 都挺有趣的。
7. 日常分享 TS 代码片段:

   ```typescript
   type Whitespace = ' ' | '\n' | '\r' | '\t'

   type TrimStart<S extends string, P extends string = Whitespace> =
     S extends `${P}${infer R}` ? TrimStart<R, P> : S
   ```
8. 分享一道面试题：

   ```typescript
   interface Logger {
     time: number;
     asyncLog:(msg: string) => Promise<string>;
     syncLog:(msg: string) => number;
   }

   type Translate<T> = /** 你需要实现的部分 **/;

   // 要求 Translate
   //  1. 提取出为函数类型的属性，丢弃掉其它类型的属性
   //  2. 将函数返回类型调整为形参类型(假定有且只有一个参数)

   // 实现效果如下:
   type T0 = Translate<Logger>;

   // 等价于
   type T0 = {
       // 其它属性被丢弃
       asyncLog: (arg: string) => string; 
       // return 类型被调整为跟 arg 保持一致
       syncLog: (arg: string) => string; 
       // return 类型被调整为跟 arg 保持一致
   }

   const result: T0 = {
       asyncLog(msg: string) { return msg }
   };
   ```

   1. 先实现一个类型可以提取出指定类型，用来筛选出所有为函数类型的属性

   ```typescript
   type FilterTypes<T, U> = {
       [Key in keyof T]: T[Key] extends U ? Key : never
   };

   // 看看阶段性成果
   type T = FilterTypes<Logger, Function>;
   // type T = {
   //     time: never;
   //     syncLog: "syncLog";
   //     asyncLog: "asyncLog";
   // }
   ```

   1. 在 1 的基础上剔除 `never`，取出所有 key

   ```typescript
   type FilterKeys<T, U> = FilterTypes<T, U>[keyof T];

   // 看看阶段性成果
   type T = FilterKeys<Logger, Function>;
   // type T = "syncLog" | "asyncLog"
   ```

   1. 在 2 的基础上我们可以使用 `Pick` 提取出子类型

   ```typescript
   type SubType<T, U> = Pick<T, FilterKeys<T, U>>;

   // 看看阶段性成果，此时我们已经成功提取出了所有类型为函数的属性，满足要求
   type T = SubType<Logger, Function>;
   // type T = {
   //     syncLog: (msg: string) => number;
   //     asyncLog: (msg: string) => Promise<string>;
   // }
   ```

   1. 在 3 的基础上我们再使用 `infer` 将函数的返回类型改为形参类型

   ```typescript
   // 将参数类型作为返回类型
   type ArgAsReturn<T> = {
       [K in keyof T]: T[K] extends ((arg: infer U) => any) ? ((arg: U) => U): never;
   }

   // 我们最终得到了 Translate
   type Translate = ArgAsReturn<SubType<Logger, Function>>;

   // 看看最后效果，满足要求
   type T = Translate<Logger>;

   // type T0 = {
   //     asyncLog: (arg: string) => string;
   //     syncLog: (arg: string) => string;
   // }
   ```

   文中部分示例来自[TypeScript 官网 - 高级类型](https://www.typescriptlang.org/docs/handbook/advanced-types.html)，面试题灵感来自[中国 LeetCode](https://github.com/LeetCode-OpenSource/hire/blob/master/typescript_zh.md?rgh-link-date=2020-04-13T15%3A04%3A56Z)，原题太绕且有 Redux 倾向，因此做了简单改造，基本思路一致甚至更全面。
9. 快餐文分享:

   深入typescript类型系统(二): 泛型和类型元编程

   <https://zhuanlan.zhihu.com/p/96046788>

   摘要: 本文主要讨论Typescript的泛型设计和类型元编程能力。泛型和子类型几乎是正交的两个概念，当然两者也可以配合使用(Bounded Polymorphism)。

   文章 Demo 质量都挺高的，建议刷下。
10. 日常分享 TypeScript 代码片段：

    ```typescript
    type Split<S extends string, D extends string> =
        string extends S ? string[] :
        S extends '' ? [] :
        S extends `${infer T}${D}${infer U}` ? [T, ...Split<U, D>] :
        [S];

    type T40 = Split<'foo', '.'>;  // ['foo']
    type T41 = Split<'foo.bar.baz', '.'>;  // ['foo', 'bar', 'baz']
    type T42 = Split<'foo.bar', ''>;  // ['f', 'o', 'o', '.', 'b', 'a', 'r']
    type T43 = Split<any, '.'>;  // string[]
    ```
11. ![image-20201204183530034](/files/-MPZDbbWup8_NtW_cUC1)

    最近 我真的是被 TS 迷住了...

    ```
    [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth] , 做 递归下降

    Depth extends -1 ? "done" : "recur"  , hash做终止条件

    Arr extends ReadonlyArray<infer InnerArr> 做模式匹配..
    ```

    太酷了.. 打表去做递减, 真是第一次见到 这种用法...
12. A: 我想用 数组的 length 生成一个 union type，比如 length = 4 -> type N = 0 | 1 | 2 | 3，这样有可能吗？

    B: 我有一个绝妙的想法 吃完饭验证一下

    A: 哈哈哈好！

    C: 我看看..

    D: **我也想看哈哈**

    B:

    ```typescript
    type Rua<Arr> = Exclude<keyof Arr, keyof (typeof [])>

    type A = Rua<[1,2,3]>
    ```

    能生成 字符串的union

    A: `type ArrIndex<Arr> = Exclude<keyof Arr, keyof any[]>;`

    C: 受教了\~ 这个思路 牛批\~
13. 文章分享:

    <https://github.com/microsoft/TypeScript/wiki/Performance>

    文章汇总了一些能提高 Typescript 编译性能的使用方法和配置技巧。
14. 分享一个项目： <https://github.com/type-challenges/type-challenges> Collection of TypeScript type challenges with online judge

    可做 TS 体操
15. 分享个 TS snippet 助助兴

    ![image-20210104231703062](/files/-MQD3UO_fi2Xs4ASLV45)
16. 函数重载的另一种方式.. 除此之外还有:

    func(签名1); func(签名2); ... func(签名3) {}

    &#x20;![image-20210104231731702](/files/-MQD3_xcKuArvuuVffua)
17. (type as any) as targetType 可以将 任意 type 转换成 targetType..
18. TypeScript 官方提供了一种注解的元编程库.. TypeScript 在 编译成 JS 的这一层 可以增加好多抽象哇..

    <https://jkchao.github.io/typescript-book-chinese/tips/metadata.html>
19. 怎么过滤 Type Model/Object 中的不需要的 Key

    `type filter<T extends object> = { [K in keyof T]: condition ? ... : never }[keyof T]`

    关键在于 最后一行, 它其实隐含了两点:

    1. `[keyof T] keyof T => key1 | key2 | key3 ...`

    `[key1 | key2 | key3 ...]` 可以看成 `[Literal type]` 而 `[literal type]` 会执行 "遍历 每一个可成立的字面量"的...

    &#x20;  2\. `{k1:nerver, k2: value}['k1'|'k2]` 此类型返回值是 value 也就是说 会自动过滤掉 `never`

    ![image-20210104232004043](/files/-MQD3YlAM-8ctAVVnZkg)

    B: 可以当分配律来理解`A[x|y]=A[x]|A[y]`

    `T|never=T T&never=never`

    A: 这个受教了 是的, 就应该是理解的
20. 第一次见到泛型组件的用法.. 有趣..

    ![image-20210104232045105](/files/-MQD3QLcUx-A5glHVfrx)

    &#x20;`<Component<Generic Type> attributes... />`
21. 快餐文分享: 10++ TypeScript Pro tips/patterns with (or without) React <https://medium.com/@martin_hotell/10-typescript-pro-tips-patterns-with-or-without-react-5799488d6680>

    使用 TS 开发 React 项目时需要注意的一些点, 这篇文章是 2018 年写的, 在 medium 上有 8.9k 点赞.. 文章有很多 现在看来的 明显的错误...

    就比如 `Don’t use FunctionComponent<P>/FC<P> to define a function component`

    果然发展的快, 沉淀就成了个问题..
22. 利用接口 实现 构造函数约束..

    ![image-20210104232245968](/files/-MQD4MMCUcPNeJ5_nY7g)
23. TS 类本身内部居然也支持 定义限制条件...

    ![image-20210104232327963](/files/-MQD4R4CSS1jZIhGREiE)
24. hah 每次看到 + - 修饰符, 都觉得使用这两个符号 类型显得很清晰易懂

    ![image-20210104232351383](/files/-MQD4UFk7wS-p4DUDgIy)
25. 好文分享:

    Learn Advanced TypeScript Types \
    <https://medium.com/free-code-camp/typescript-curry-ramda-types-f747e99744ab>

    摘要: Despite the popularity of currying and the rise of functional programming (and of TypeScript), it is still a hassle today to make use of curry and have proper type checks. Even famous libraries like Ramda do not provide generic types for their curry implementations (but we will). However, you need no functional programming background to follow this guide. The guide is about currying but it is only a topic of my choice to teach you advanced TypeScript techniques. You just need to have practised a bit with TypeScript’s primitive types. And by the end of this walk-through, you will be a real TS wizard.

    文章主要讲述了, 使用 TypeScript 为 Curry 函数建模的过程

    文章前面花大篇幅讲解了 curry, 与 TS 的基础概念.. 然后借助这个概念 创建了一个个类型工具, 再利用这些工具 达成最后 curry 模型.. 并且最后还增加了 placeholder 支持..

    整篇文章读了3遍.. 耗时半个多小时... 很久没这么耗费心智看一篇文章了...

    PS: 文章中存在一处错误 CurryV3 的递归名词 应该是 CurryV3

    这篇文章真的非常棒, 非常推荐阅读.

    <https://github.com/millsp/ts-toolbelt/blob/master/src/Function/Curry.ts>

    这是文章最终的产出

    哎, 虽然 TS 只提供了 type extends infer 很少的关键字, 但已经做到 类型系统上 图灵完备了..
26. TypeScript 4.2 Beta 发布 \
    <https://www.oschina.net/news/126465/typescript-4-2-beta-released>

    语法新feature

    1. 元祖类型的 Rest 元素支持放置在元组中的任何位置
    2. 模板字面量表达式已具有模板字面量类型
27. TypeScript 中提升幸福感的 10 个高级技巧

    <https://juejin.cn/post/6919478002925453320>

    快餐文分享，第一条 与 第四条 都是之前没有想过的用法。
28. 🌚如何更容易上手 Typescript 类型计算？ \
    <https://juejin.cn/post/6924848590544207885> \
    摘要： 最近在国内的前端圈流行一个名词“TS 体操”，TS 对应 TypeScript，“体操”是 TC 的戏称，而 TC 就是 turing completeness （图灵完备）的意思，具体就是指验证 TypeScript 的 Type-level programming （编译时（compile time）的相关语法）是图灵完备的，经过传播之后，也泛指以一个 TS 类型作为输入，通过写 TS 代码输出另外一个类型的实践。

    文章分享，写的很不错，demo也值得刷一下。


# Rust

1. 快餐文分享：

   篇一 | 想全面了解 Rust 语言 ？ 你想知道的都在这里

   <https://mp.weixin.qq.com/s/F_38SD34nDl7cZYJqZFNww>

   摘要：对 Rust 语言感兴趣，但被网上的各种评价 Rust 语言的观点和看法所困扰，到底 Rust 语言是什么样的一门语言呢？那么看本文就对了。
2. Rust相较于Haskell除了效率还有何优势？ - parker liu的回答 - 知乎 <https://www.zhihu.com/question/31644802/answer/1720583773>


# SQL

1. sql 在我看来最大的优点 就是 语法层面上 设计 偏自然语言，就比如 select name from student。
2. 应用分享： sql-trainer <https://app.bytescout.com/sql-trainer/index.html>

   通过在线关卡的方式 一步一步引导你 如何写出基本的 SQL 语句。 可以花几分钟刷一下，很好玩\~




---

[Next Page](/llms-full.txt/1)

