告别分类焦虑:让笔记自然生长流动
起点:被分类束缚的笔记时光在学生时代,我养成了体系化学习的习惯,这种习惯延伸到笔记管理上,就表现为严格的分类存储——每次创建笔记时,首先思考的是“这个文件应该放在哪个文件夹”。这种基于文件夹分类的组织方式,在整理时确实直观清晰,让我能够快速定位到需要的资料。 困境:当分类遇到复杂知识然而,随着接触的知识领域越来越广,我逐渐发现一个棘手的问题:现实世界中的知识往往是多维交叉的,一份笔记很难被简单地归入单一分类。 遇到的挑战: 同一份笔记既属于A类别,也属于B类别 记录灵感闪念时,难以立即找到合适的分类 创建笔记前的分类思考成了额外的心智负担 知识之间的关联被文件夹结构人为割裂 尝试:标签系统的希望与失望为了解决多分类问题,我开始尝试使用标签系统。理论上,标签能够为笔记提供多维度的分类方式,打破文件夹的线性束缚。 实践结果: ✅ 确实解决了笔记的多分类问题 ❌ 标签数量失控增长 ❌ 部分标签下只有1-2个文件,失去分类意义 ❌ 大量标签反而增加了管理复杂度 ❌ 最终还是陷入了“如何打标签”的新一轮思考负担 标签系统在理论上很美好,但在实践中,我发现自己陷入了...
进制转换与数据编码
进制转换R进制转十进制R进制转十进制使用按权展开法,具体操作是将R进制的每一位数值使用$R^K$的形式表示,K表示该位与小数点的距离,当该位位于小数点左边,K表示该位和小数点之间间隔数字的个数,当该位位于小数点右侧,K是负数,其绝对值是该位与小数点之间数字个数加1 例如:二进制 转 十进制 $$ 10100.01 = 1 \cdot 2^4 + 1 \cdot 2^2 + 1 \cdot 2^{-2} $$七进制 转 十进制 $$ 604.01 = 6\cdot7^2+4\cdot7^0+1\cdot7^{-2} $$ 十进制转R进制十进制转R进制使用短除法例如将94转换成二进制数 123456794 ÷ 2 = 47 余 047 ÷ 2 = 23 余 123 ÷ 2 = 11 余 111 ÷ 2 = 5 余 15 ÷ 2 = 2 余 12 ÷ 2 = 1 余 01 ÷ 2 = 0 余 1 将余数从后往前书写就是对应的二进制 1011110 二进制转八进制二进制的 111 表示 八进制的 7,000表示八进制的0,二进制转换成八进制时,将二...
高并发基石:IO多路复用深度剖析
用户空间-内核空间我们通常将操作系统内核和应用程序运行的空间分为内核空间和用户空间,这是为了提供保护和控制。下面将详细解释这两个概念,并给出它们之间的区别和交互方式。 用户空间(User Space):这是应用程序运行的空间。它只能访问受限的资源,不能直接访问硬件设备等敏感资源。如果应用程序需要执行特权操作(如读写磁盘、发送网络数据包等),它必须通过系统调用(System Call)请求内核代为执行。 内核空间(Kernel Space):这是操作系统内核运行的空间,具有最高的特权级别,可以访问所有硬件资源和内存。内核负责管理进程调度、内存管理、设备驱动、系统安全等。 为什么要有这样的分离? 稳定性与安全性:如果应用程序可以直接访问硬件和内核数据,那么一个应用程序的错误可能导致整个系统崩溃。通过分离,即使应用程序崩溃,也不会影响内核和其他应用程序。 多任务与资源管理:内核可以公平地分配资源给多个应用程序,并防止应用程序之间相互干扰。 虚拟内存:每个进程都有自己的虚拟地址空间,其中一部分映射到内核空间,一部分映射到用户空间。这样,每个进程都认为它独占了整个内存,而实际上...
避免这些编程陷阱:七种让你代码失控的开发风格
散弹枪编程火力覆盖,蒙中就行 “嗯,这个报错……把参数从 false 改成 true 试试?还不行?那把这行注释掉看看?” 开发者使用非常随意的方式对待代码,像持散弹枪般,不加分析地向问题盲目射击,通过随机、反复地修改代码来碰运气,直到错误消失。这是一种极其消极的调试方式,往往在解决一个表面问题的同时,制造了多个隐藏更深的 Bug。 代码被破坏,逻辑变得不可预测,且无人理解为何这样改能“工作”。 撞大运编程迷糊前进,侥幸过关 “这段代码为啥能跑通?我也不太确定,但先别动它!” 比散弹枪编程更温和,但也更常见。程序员对模块的内在逻辑一知半解,依靠直觉和偶然的成功编写代码。一旦出现问题,会面临关键抉择:一是停下来,理解一下程序,找到出错的原因,二是使用散弹枪编程方式开始解决问题。 项目充满了“神秘代码”,后人不敢轻易触碰,形成知识黑洞。 Cargo-Cult 编程Cargo Cults 这个词儿来自二战期间的某些太平洋上小岛里的土著人。在战争期间,美国利用这些小岛作为太平洋战场上的补给站。他们在这些小岛上修建自己的飞机跑道以用来运输战争物资。而那些小岛上的土著人从来没有见过飞机,当他...
如何做好技术面试?
在公司承担技术面试的职责,刚开始的时候可能会感到困惑,不知道如何去面试别人,这里总结了一些技术面试的经验,以及一些在面试过程中的一些思考 技术面试应该要问些什么?技术面试通常是对于候选人的技术能力的评估和相关知识进行评估的面试环节,在技术面试中,面试官通常要评估候选人在以下方面的职责: 技术基础知识和基础:面试官应该要问技术相关职位相关领域的技术知识问题,以验证其对基本概念、原理和技术的了解程度 编程能力:面试官要一定程度上考察候选人的编码能力,包括熟练掌握相应的编程语言、数据结构和算法相应的知识,以及解决问题和实现功能的能力 技术经验:面试官应该要结合候选人简历,沟通项目和工作中涉及的技术栈、开发流程、工具和框架等方面的知识,以评估其实际应用能力和项目经验 系统设计能力:面试官应该要考察候选人在系统设计和架构方面的能力,包括对系统组件、模块化、拓展性、可靠性和安全性等方面的理解和实践 问题解决和沟通能力:面试官有时也应该根据候选人的沟通情况,提出一些实际问题或场景,评估候选人解决问题的能力、思维方式和沟通表达能力 自我学习和技术热情:面试官应该要和候选人沟通学习的知识或者...
Obsidian打造个人知识库
之前都是使用Typora编辑笔记和文档,Markdown写笔记或者文档简直不要太方便,熟练语法后,双手可以不离开键盘,目光始终聚焦再文字上面,写作体验非常流畅。 随着文档的增多,发现文档越来越不好管理,尝试语雀、印象笔记、腾讯文档、飞书文档等软件,功能虽然很多但是总感觉和自己不太搭,而且软件商业化的原因开始绑架免费用户,虽然能够理解但还是很不爽。尝试了Obsidian觉得眼前一亮,颜值是第一吸引力,可以自由搭配的插件以及主题可以解决我的需求。 数据同步身为一名资深的白嫖党,果断拒绝了Obsidian自带的同步功能,可以使用GitHub进行替代,无限容量,私人仓库也是完全免费,用来管理笔记文档简直是降维打击。总的来说就是建立一个git仓库,把笔记都丢进去,将一些文件和目录都忽略掉,然后使用Obsidian打开这个git仓库作为Obsidian的仓库使用。由于Obsidian使用过程中有些自带的文件一直变化,直接忽略掉。 由于国内网络的问题,我使用的是阿里云效的代码仓库进行托管 .gitignore 文件内容 123456789101112## obsidian的工作区配置.ob...
性能优化全景图:七大维度深度解析
代码之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,首先想到的是缓存、异步、JVM等。实际上,第一步就应该是分析相关的代码,找出相应的瓶颈,再来考虑具体的优化策略。有一些性能问题,完全是由于代码写的不合理,通过直接修改一下代码就能解决问题的,比如for循环次数过多、作了很多无谓的条件判断、相同逻辑重复多次等。 数据库数据库的调优,总的来说分为以下三部分: SQL调优这是最常用、每一个技术人员都应该掌握基本的SQL调优手段(包括方法、工具、辅助系统等)。这里以MySQL为例,最常见的方式是,由自带的慢查询日志或者开源的慢查询系统定位到具体的出问题的SQL,然后使用explain、profile等工具来逐步调优,最后经过测试达到效果后上线。 架构层面的调优这一类调优包括读写分离、多从库负载均衡、水平和垂直分库分表等方面,一般需要的改动较大,但是频率没有SQL调优高,那么什么时候需要做这些事情?我们可以通过内部监控报警系统,定期跟踪一些指标数据是否达到瓶颈,一旦达到瓶颈或者警戒值,就需要考虑这些事情。 连接池调优我们的应用为了实现数...
翻译翻译什么是惊喜:一次线上问题的思考
💡TIP在线上商城的一次功能迭代中,我们遇到了一个线上问题。虽然很快解决,但是觉得这个问题在软件设计开发中非常典型,对问题产生的原因以及如何避免类似问题的产生做一次复盘分析 背景商城的用户具有不同的会员等级,包括黄金会员、白银会员和普通会员。根据会员等级的不同,商品的价格策略也不同。具体来说,黄金会员购买商品时享受黄金会员价,普通会员购买时享受普通会员价,白银会员比较特殊购买时享受黄金会员价。 商品的后台管理功能只维护商品的黄金会员价和普通会员价,白银会员的价格显示和购买时的价格计算在业务代码中进行判断,如果是白银会员价格按照黄金会员执行。 数据库设计:一个商品sku和会员价格存在一对多的关系 产生问题在优惠券功能迭代中,产品要求增加商品兑换券的功能,兑换券在进行商品购买时==优惠金额 = 商品价格 - 0.01元==,由于不同会员等级享受的商品价格不同,那么同一个兑换券对于不同的会员来说,优惠金额也就不一样,优惠金额需要根据使用优惠券时当前会员等级以及能够兑换的商品进行计算。 在功能开发时,遗漏了一个场景,...
计算机组成原理
计算机结构计算机的经典结构是冯·诺依曼结构,它由五大部件组成:运算器、控制器、存储器、输入设备和输出设备。现代计算机结构通常包括中央处理器(CPU)、内存、存储设备、输入/输出设备以及连接这些设备的总线系统。 运算器 算数逻辑单元(ALU):执行算数和逻辑运算 累加寄存器(AC):通用寄存器,为ALU提供一个工作区,用在暂存数据 数据缓冲寄存器(DR):读/写内存时,暂存指令或数据 状态条件寄存器(PSW):存状态标志与控制标志 软考中存在争议,也有将其归为控制器的 控制器 程序计数器(PC):存储下一条要执行指令的地址 指令寄存器(IR):存储正在执行的指令 指令译码器(ID):对指令中的操作码字段进行分析解释 时序部件:产生时钟脉冲(Clock Pulse),为整个CPU提供基准时序信号 计算机体系结构分类-FlynnSISD - 单指令流单数据流 (Single Instruction, Single Data) 描述: 单指令流:在任何时钟周期,只有一个控制单元(CU)从内存中取出一条指令。 单数据流:该指令在单个处理单元(PU)上操作一个数据...
使用nvs工具切换node版本
安装nvs官方仓库 nvs 有跨平台的特性,支持 Windows 、 macOS和 Linux 系统,下面分别介绍两种安装方法。 windows推荐通过 msi 的方式安装,就跟正常安装软件一下,双击下一步即可: https://github.com/jasongin/nvs/releases mac用下面三行命令即可: 1export NVS_HOME="$HOME/.nvs" git clone https://github.com/jasongin/nvs "$NVS_HOME" . "$NVS_HOME/nvs.sh" install 常见命令添加Node版本如果你想安装最新的 LTS 版本,可以用命令: 1nvs add lts 如果你需要新增一个 Node.js 16的版本,可以用以下命令: 1nvs add 16 更新当前的 Node 小版本如果你想要升级 Node 小版本,比方说从 20.13.1升级到20.14.0(当前大版本的最新版),可以使用如下命令: 1nvs upgrade 配置默认 N...
蒙提霍尔问题-经典的三扇门问题
问题设定 三扇门:一扇后面有汽车(奖品),两扇后面有山羊。 你随机选择一扇门(比如 1 号门)。 主持人(知道汽车在哪里)打开另一扇门,露出一只山羊(比如 3 号门)。 主持人问你:是否换到剩下的那扇门(2 号门)? 关键点 主持人 总是 会打开一扇有山羊的门,且不会打开你选的门。 主持人的行动不是随机的,而是根据你的选择和门后的情况刻意为之,这提供了额外信息。 概率分析初始概率 你第一次选择时,选中汽车的概率是 1/3,选中山羊的概率是 2/3。 两种情形 你第一次选中了汽车(概率 1/3) 剩下的两扇门都是山羊。 主持人打开其中一扇山羊门。 如果你 换门,会换到另一扇山羊门 → 失败。 如果你 不换,保留原来的门 → 获胜。 你第一次选中山羊(概率 2/3) 剩下的两扇门中,一扇是汽车,一扇是山羊。 主持人 只能 打开剩下的那扇山羊门(因为不能打开你的门,也不能直接打开汽车门)。 如果你 换门,一定会换到剩下的那扇汽车门 → 获胜。 如果你 不换,保留原来的山羊门 → 失败。 总结策略结果...
事件驱动架构:业务解耦与异步处理
1. 事件驱动架构概述事件驱动是一种经典的编程和系统设计模式,其核心思想是系统的运作由事件来驱动。当事件发生时,系统的各个组件会对事件做出反应并执行相应的操作。这些事件可以是外部触发的(如用户点击、网络请求),也可以是系统内部产生的(如状态变更、定时调度)。 2. 事件驱动在业务系统中的价值2.1 接口解耦在业务系统中,事件驱动机制被广泛用于接口解耦。以电商系统为例: 商品发布、订单变更等都可以作为事件进行发布 商品信息同步、订单信息推送等操作可以作为事件监听器 主业务流程只需关注核心业务逻辑,使功能更加内聚,耦合性更低 2.2 划分主业务流程与事件消费者的方法一个简单的判断标准是:如果某些操作不执行,仅从业务域本身考虑,系统是否仍能正常运行?如果答案是肯定的,那么这些操作就可以被定义为事件的消费者。 示例分析:在电商系统的商品发布流程中,将商品信息同步给下游系统如果失败或未执行,商品系统本身仍应能正常发布商品。同步问题可以通过定时推送、失败补偿等机制解决,因此商品信息同步操作适合作为事件消费者。 3. 实践中的挑战与解决方案3.1 下游系统约束的处理当下游系统对业务有约束...







