常见家常菜做法
洋葱炒蛋准备工作: 3 个鸡蛋打到碗里,搅拌均匀 1 个洋葱切成丝 配菜少许青红椒切成丝 准备料汁: 生抽 + 耗油 + 盐 + 鸡精 + 一勺淀粉 + 一勺清水 将料汁搅拌均匀,在碗里备用 烹饪过程: 将锅烧热,加油适量,油开后加入蛋液,快速划熟划散后盛出备用 将洋葱丝和青红椒丝入锅,开大火翻炒 1 min,注意要加盐,否则会偏淡 倒入炒好的鸡蛋,淋上调好的料汁,大火随便翻炒几下入味即可
Nest.js学习
依赖注入是 Nest.js 的核心,使得开发者可以轻松管理应用程序中的依赖关系,提高代码的可测试性和可维护性。DI 是一种设计模式,它可以用来实现控制反转(IoC)—— 对象的创建和依赖关系的管理交给框架来处理而不是在代码中硬编码。 它的依赖注入主要有 3 个核心概念: Provider: 用于创建和管理的服务、仓库、工厂等的类,使用 @Injectable 装饰器进行标记,并可以在模块中注册。 Injection: 将提供者的实例自动传递给需要它们的类(如控制器、服务等),通过构造函数注入来实现这一点。 Module: NestJS 应用程序的基本组织单元,每个模块可以包含多个提供者,并且可以在其他模块中导入和使用这些提供者。 依赖注入的优势: 解耦:类之间的依赖关系更加松散,减少了代码的耦合度,提高了代码的可维护性 可测试性:通过依赖注入,可以轻松在测试中替换依赖项,使用模拟对象进行单元测试 可拓展性:新功能可以通过添加新的提供者来实现,而不需要修改现有代码
React学习
组件是 React.js 的基础 nest.js 默认使用 page.tsx 作为入口 12/ -> app/page.tsx/test -> app/test/page.tsx React HooksuseState 回调函数只有在第一次渲染的时候才会执行。 1234const [state, setState] = useState(() => { const expensiveValue = computeExpensiveValue(); // 只会在首次渲染时执行 return expensiveValue;}); 父子组件的通信请记住单向数据流。 父组件 -> 子组件:通过 props 属性传递 子组件 -> 父组件:通过 props 传递函数,触发父组件中的状态更新 在 vue 中父组件将 props 传递给子组件,子组件如果想要更改父组件中的值是通过抛出一个事件$emit通知父组件v-on来进行的。和原生 DOM...
浅谈在线文档中的协同编辑
这是我在面试一个后端 node.js 工程师的时候遇到的一个场景题目(公司是做 AI 知识库的,可能遇到这些问题)。 我当时回答了如下内容: 每一篇文档有 id, 作者,内容,版本号, 状态(编辑中,已发布) 用户在进入页面的时候,会从 DB 中拉取最新的版本,编辑的时候会向服务器发送一个请求,这个时候服务器将状态改变为编辑中,同时将版本号加一,通知其他所有客户端。将这个改动记录到日志中,便于回档。 其他用户收到消息的时候重新渲染页面。 这个结果的正确性应该是可以保证的,可以通过乐观锁的机制来保证旧版本不会覆盖新版本数据。问题是每次更新都是全量的,多客户端修改频繁,网络 IO, 频繁的 DB 修改都是问题。 抛开性能问题不谈?上面的方案有个核心问题:其他用户怎么看到当前用户的鼠标位置? 优化的一个方案就是只做增量修改,这方面可以联想到 rsync 的增量同步, git 中的 diff 算法。 下面搜索答案,其实业界有现成的算法 OT (Operational Transformation)广泛应用在 Goole Docs...
深入理解 https
加密算法对称加密的局限性在对称加密(例如:AES)中,加/解密使用相同的秘钥。这会带来 2 个问题: 秘钥分发问题:发送方和接受方必须通过某种安全方式共享秘钥。如果秘钥在传输时被截获,通信安全性就会被破坏。 秘钥管理问题:如果有多对用户需要通信,每对用户都需要一个独立的秘钥,秘钥数量会随着用户规模急剧增加(10个用户需要 45 个秘钥, n*(n-1)/2...
布隆过滤器
特点 精确判断不存在,但是可能会误判一个不在集合中的元素为存在(即:假阳) 不支持删除元素(几个 hash 函数计算出来的下标可能别的 key 也用到了) 总结来说就是:判断不存在的时候一定不存在,判断存在的时候大概率存在。 误判率可以通过调整参数来降低,但是无法完全消除。 数据结构的组成布隆过滤器由一个 bitSet 和一组 hash 函数组成,是一种空间效率非常高的概率算法和数据结构。在初始化的时候,bitSet 的每一位被初始化为 0,同时会定义一组 hash函数,例如有 3 组 hash 函数,hash1,hash2,hash3. 写入流程当我们要写入一个值时,过程如下,以“jionghui”为例: 首先将“jionghui”跟3组 Hash 函数分别计算,得到 bitSet 的下标为:1、7、10。 将 bitSet 的这3个下标标记为1。 假设我们还有另外两个值:java 和 diaosi,按上面的流程跟 3组 Hash 函数分别计算,结果如下: java:Hash 函数计算 bitSet 下标为:1、7、11 diaosi:Hash 函数计算 bitSet...
PyTorch 学习
入门容易,代码浅显易懂,动态图。 ML 中的一些专有名词 偏差(Bias): 模型在样本上的输出与真实值之间的误差 —— 模型本身的精确度 方差(Variance): 模型每一次的输出结果与模型输出期望之间的误差 —— 模型的稳定性 防止过拟合的方法 补充数据集(数据增强) 减少模型参数 Dropout Earlystopping 正则化 & 稀疏化(模型结构变得更简单的一种手段) 防止欠拟合的方法 加大模型参数 减少正则化参数 更充分的训练 在实际的 ML 中可能解决过拟合是更常见的需求。 Tensor标量是 0 维张量,向量是 1 维张量,矩阵是 2 维张量。 PCA 与特征值分解将 n 维特征映射到 k 维上(投影矩阵),这 k 维是全新的正交特征,也被称为主成分,是在原有的 n 维特征的基础上重新构造出来的 k 维特征。 PCA 算法的优化目标: 降维后同一维度的方差最大 不同维度的相关性为 0 协方差矩阵 参考资料 Visdom: 提供了大多数科学计算的可视化工具,支持 PyTorch、Torch、Numpy Torchvision: 独立于...
Python3学习
注意 py 中声明只有一个元素的元组的时候应该写成 t = (1,) 而不是 (1)。后者会被解释器解释为变量而非元组。 多继承和 java 有着显著区别,python3 的类允许多继承。多继承带来了菱形问题(Diamond Problem):如果多个父类继承同一个基类,可能导致方法调用冲突。如下所示: 12345 A / \B C \ / D 12345678910111213141516171819202122class A: def method(self): print("A")class B(A): def method(self): super().method() # 调用 A.method() print("B")class C(A): def method(self): super().method() # 调用 A.method() print("C")class D(B, C): def...
股票投资从入门到放弃
...
编程珠玑
位图排序 输入:一个包含n个正整数的文件,其中每个正整数都小于n,在这里n = 10^7,其中n个整数都是不可重复的。 输出:以升序排列的整数列表 约束:最多1MB内存,无限内存,时间最多几分钟,10s就可认为不需要优化了。 思考:一个整数占用4字节,10^7的整数占用的内存是4*10^7.一次性读取到内存中显然是不可能的。所以我们可以使用10^7/2^20 = 39趟归并排序,也就需要40次的IO操作,IO无疑是瓶颈。 我们可以使用10位长的字符串表示一个所有元素小于10的非负整数集合(集合3大特性),如:{1,2,3,5,8}可表示为: 10111010010 # 如果对应的位是1表示处于该集合 以上的方法非常巧妙,本来需要4个字节表示的数,仅仅通过一个位就实现了,空间瞬间剩下的几十倍,有不有? 这样就可以使用10^7个位表示10^7个整数,占用空间为10^7/2^20 =...