谈谈软件行业普遍存在的`立即数`和`引用数`

Markdown链接跳转错误?`[id]`引用的唯一性校验脚本 摘要: 本文针对Markdown文档中因重复[id]引用导致的链接跳转错误问题,提出了一套完整的检测与修复方案。通过分析典型错误场景(如批量生成文档、多人协作中的标签冲突),对比正则表达式、Markdown解析器等技术方案,并给出Python实现脚本,可快速定位重复标签和未定义引用。文章还提供了标题ID校验、自动化修复等进阶技巧,以及命名规范、CI/CD集成等最佳实践。最终方案通过脚本化检测和流程优化,有效解决了Markdown链接跳转失效的常见痛点,适用于技术文档协作等场景。 阅读详情

事情是这样的, 最近没事玩玩前端的polyfill, 就是填充浏览器的标准库, 之前写了几篇, 比如<Fuck标准库系列:Object.prototype.filter>, <赶在标准化前构造一个RegExp.escape方法>, 然后昨天公司里做Vue前端路由的时候需要实现一个url参数的封装, 就封装了一个window.location.parameter.

 

Fuck标准库系列: location.parameter

整个url中从左到右分别是: 协议, 主机名, 域名, 端口号, 路径, 查询参数, 于是window.location对象有:

  • location.href
  • location.protocol
  • location.host
  • location.port
  • location.pathname

但是唯独缺少了最后面的查询参数, 于是我们封装一下吧, 通过location.href后面分割"?", "&", 以及"="字符来把键值对封装成一个js对象, 于是我写了一句话代码:


location.param = (decodeURIComponent(location.href).split('?')[1] || '')
  .split('&')
  .map(p => p.split('='))
  .reduce(
    (p, [key, value]) => (key ? Object.assign(p, { [key]: value }) : p),
    {},
  );

测试一下, 打开 https://www.baidu.com/s?ie=UTF-8&wd=JavaScript , 输入以上代码, 然后打印location.parameter:

location.parameter;

> {ie: "UTF-8", wd: "JavaScript"}

嗯, 效果不错, 没啥技术含量, 只是用到MapReduce有点绕, 仔细看看就能明白.

反正才写了一点点, 就扯点别的吧, 打发下时间.


`立即数`和引用的普世思想

上面提到的url参数是在url中寄存了一些轻量的数据, 而不是将数据放在请求返回的结果中, 这2种数据存放方式有一个很经典的区别: 前者是"立即数", 后者是引用. 立即数是直接存放在地址中的数据, 而引用是需要通过地址, 经过一次查找后才能得到的数据.

这看上去很明显啊? 为啥非要写出来呢? 因为这种现象在软件行业非常常见, 上升到一个普遍适用的哲学地位. 下面举几个例子:

 

有请求的url和无请求的url

以一个图片url为例, 通常都是通过一个图片地址比如https://example.com/test.png来获取图片, 但如果图片很小, 就可以直接将图片的数据信息放在url中, 比如复制下面这个url会在浏览器中打开一张svg图片, 但没有发送任何请求:

data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve" height="100px" width="100px">
<g>
    <path d="M28.1,36.6c4.6,1.9,12.2,1.6,20.9,1.1c8.9-0.4,19-0.9,28.9,0.9c6.3,1.2,11.9,3.1,16.8,6c-1.5-12.2-7.9-23.7-18.6-31.3   c-4.9-0.2-9.9,0.3-14.8,1.4C47.8,17.9,36.2,25.6,28.1,36.6z"/>
    <path d="M70.3,9.8C57.5,3.4,42.8,3.6,30.5,9.5c-3,6-8.4,19.6-5.3,24.9c8.6-11.7,20.9-19.8,35.2-23.1C63.7,10.5,67,10,70.3,9.8z"/>
    <path d="M16.5,51.3c0.6-1.7,1.2-3.4,2-5.1c-3.8-3.4-7.5-7-11-10.8c-2.1,6.1-2.8,12.5-2.3,18.7C9.6,51.1,13.4,50.2,16.5,51.3z"/>
    <path d="M9,31.6c3.5,3.9,7.2,7.6,11.1,11.1c0.8-1.6,1.7-3.1,2.6-4.6c0.1-0.2,0.3-0.4,0.4-0.6c-2.9-3.3-3.1-9.2-0.6-17.6   c0.8-2.7,1.8-5.3,2.7-7.4c-5.2,3.4-9.8,8-13.3,13.7C10.8,27.9,9.8,29.7,9,31.6z"/>
    <path d="M15.4,54.7c-2.6-1-6.1,0.7-9.7,3.4c1.2,6.6,3.9,13,8,18.5C13,69.3,13.5,61.8,15.4,54.7z"/>
    <path d="M39.8,57.6C54.3,66.7,70,73,86.5,76.4c0.6-0.8,1.1-1.6,1.7-2.5c4.8-7.7,7-16.3,6.8-24.8c-13.8-9.3-31.3-8.4-45.8-7.7   c-9.5,0.5-17.8,0.9-23.2-1.7c-0.1,0.1-0.2,0.3-0.3,0.4c-1,1.7-2,3.4-2.9,5.1C28.2,49.7,33.8,53.9,39.8,57.6z"/>
    <path d="M26.2,88.2c3.3,2,6.7,3.6,10.2,4.7c-3.5-6.2-6.3-12.6-8.8-18.5c-3.1-7.2-5.8-13.5-9-17.2c-1.9,8-2,16.4-0.3,24.7   C20.6,84.2,23.2,86.3,26.2,88.2z"/>
    <path d="M30.9,73c2.9,6.8,6.1,14.4,10.5,21.2c15.6,3,32-2.3,42.6-14.6C67.7,76,52.2,69.6,37.9,60.7C32,57,26.5,53,21.3,48.6   c-0.6,1.5-1.2,3-1.7,4.6C24.1,57.1,27.3,64.5,30.9,73z"/>
</g>
</svg>

截图:

同理, 各种mime类型都可以通过data:协议来实现无请求的url, 或者"立即得到"的媒体

 

粘贴板

电脑的粘贴板一般只能存放一种类型的数据,比如一段文本,一张图片,但如果你尝试复制一个文件或者很大的一张图片,粘贴板中的内容将不再是文件本身而变成一份引用,文件移除后引用将失效,对吧?

 

软链接文件和硬链接文件

我们知道文件系统都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据即文件数据块 (data block),是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。下图展示了程序通过文件名获取文件内容的过程。

可以类比面向对象语言中变量与对象之间的关系: 变量是对对象的引用, 用户只能通过变量来和暗箱中的对象打交道. 这里元数据就是变量, 数据块就是对象. 我们日常接触的每一个文件都分成这2个部分, 元数据和数据块一一对应才有意义, 那有没有这样一个很小的文件, 它只有元数据(文件头), 没有文件块呢? 还真有, 这就是硬链接文件.

为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名.

软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制.

举个通俗的例子, 你创建一个txt文档, 打开在里面写上: "file:////Users/test/hello.png", 保存关闭, 然后重新命名为hello.png.softlink, 再写一个简单的程序向OS注册.softlink的文件打开方式, 读取其中的文本内容后调用系统的默认打开方式打开目标路径的文件, 这样一个软链接系统就完成了.

下图说明了软链接和硬链接的区别:

 

变量和对象

这个不再陌生了, 基础数据类型和引用数据类型的最大区别就是前者将数据直接存放在栈空间中, 特点是查找速度快, 后者通过栈空间的引用定位到堆空间的数据, 特点是数据容量大. 这种模式和文件系统很像: 使用栈空间来节省成本, 提高查询速度; 使用堆空间来提高系统灵活度, 为数据共享提供可能.

我们的认知过程大致是先意识到栈空间的存储能力, 再意识到可以把较大的数据存放到堆中; 但真实的发展模式是, 将所有数据存在堆中, 通过变量栈暴露给用户一个索引, 之后优化的时候再将一些比较轻巧的数据比如数字, 字符和boolean直接存到变量中.

 

CPU的立即寻址和直接寻址

CPU的设计也遵守着堆栈的思想.

cpu的寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址的方式,现在情况很鲜明了, CPU每次得到的这几个字节即有可能是相关数据的地址(即直接寻址), 也有可能是数据地址的地址(即间接寻址), 还有可能就是数据本身(即立即寻址). 如果非要和文件系统的操作做一个对照的话:

  • 立即寻址 ---> 删除一个硬链接文件
  • 直接寻址 ---> 读取一个普通文件
  • 间接寻址 ---> 读取一个软链接文件

完.


深入理解`Python`的`垃圾回收`机制:`分代回收`与`循环引用`检测算法。 Python的垃圾回收机制,特别是分代回收和循环引用检测算法,是Python内存管理的核心。在C/C++等语言中,程序员需要手动分配和释放内存,这带来了很大的灵活性,但也容易出错,比如忘记释放内存导致内存泄漏,或者释放了已经被释放的内存导致程序崩溃。根据程序的特点,调整垃圾回收的阈值,可以提高垃圾回收的效率。虽然Python的垃圾回收机制可以自动管理内存,但在某些情况下,仍然需要手动优化垃圾回收,以提高程序的性能。当一个对象的引用计数变为0时,意味着没有任何变量引用该对象,该对象就变成了垃圾,可以被回收。 阅读详情

相关推荐

【数据挖掘】心跳信号分类预测 之 特征工程 —— 学习笔记(三)

三、特征工程 3.1 看书 常言道,“巧妇难为无米之炊”。在 ML 中,数据和特征将作“米”,模型和算法则为“妇”。若无数量充足的数据、良好表示的特征,再强大的模型也难以得到满意的结果 (garbage in,garbage out)。对于 ML 问题,数据和特征往往决定了结果的上限,而模型、算法的选择及优化则是在逐步接近该上限。 特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。在本质上,特征工程是一个表示和展现数据的过程。在实际中,特征工程旨在去除...

闻韶 3358

汇编中的立即数存在哪

最常见的汇编指令: MOV R0, #1 MOV RO, R1 老师告诉我们,第一条指令的意思是将立即数1传送到R0这个寄存器;第二条指令的意思是将R1的内容传送到R0。十分容易理解。 我们知道,R1的内容本来存储在R1这个通用寄存器里面,那么,对于第一条指令,立即数1存放在哪里呢? 其实立即数就存放在指令里。 MOV这类数据处理指令,格式为: xxxx000a aa

wangzibigan的博客 9557

自适应滤波算法综述

自适应滤波算法综述

xdzhujy的博客 5万+

立即数,操作数

c是指参与计算的数据或变量。在计算指令中,操作数可以是立即数、寄存器中存储的值、内存中的数据等。这里的立即数5是直接嵌入到指令中的,而不是存储在寄存器或内存中。通过执行这个指令,计算机将从R2中获取一个值,然后将立即数5添加到该值上,并将结果存储到R1中。举个例子,假设R2的值为10,那么执行指令后,R1的值将变为15,因为10 + 5 = 15。简而言之,立即数是指直接嵌入到指令中的常量值,而操作数是参与计算的数据或变量。在这个指令中,R1和R2是两个寄存器,代表两个操作数,而#5是一个立即数。

qq_40113966的博客 4171

用树莓派Pico低成本更新USB-C PD控制器固件实战指南

固件更新是嵌入式系统开发与维护中的核心环节,它直接决定了硬件设备的功能、性能与兼容性。其原理通常是通过特定的通信接口(如SWD、JTAG、UART或USB)与设备内部的Bootloader建立连接,将新的程序代码安全写入非易失性存储器。在USB Power Delivery(PD)和Type-C生态中,固件更新技术尤为重要,它能修复协议握手Bug、适配新设备并提升供电策略的灵活性。本文聚焦于一个典型的工程实践场景:如何利用广泛普及且成本极低的树莓派Pico开发板,作为USB-C协议到I²C协议的转换桥,实现

weixin_27869497的博客 458

ubuntu emto-cpa安装与编译

ubuntu emto-cpa安装与编译

qq_45834835的博客 1436

立即数的存储区

在为MSP430程序做优化的时候,tu

Lion Chen i 咖啡 2744

智元机器人开源具身仿真框架 Genie Sim 入门教程

GenieSim是AgiBot推出的具身智能仿真框架,提供完整闭环开发管道,包括轨迹生成、模型训练和基准测试。框架支持Docker容器化部署,要求Ubuntu 22.04和NVIDIA硬件环境。主要功能涵盖: 支持12种基准测试任务 提供ADER评估框架 集成UniVLA/RDT等基线模型 支持PICO/键盘遥操作 具备轨迹记录回放功能 提供完整API控制接口 开发者可通过Hugging Face获取场景资产,使用标准化ROS主题与仿真环境交互。框架特别优化了碰撞检测和抓取物理模拟,适用于从简单抓取到复杂操

2506_90492529的博客 2542

mysql的` `和‘ ‘用处和区别

对mysql的符号` `与' '进行深入的剖析和解读,帮助大家解决创建库、表时等引号的符号问题,用最精简的案例,最简单的方法来帮助大家理解。

m0_64882384的博客 6219

GStreamer中h264parse元素

h264parse是 GStreamer 中处理 H.264 视频流的关键元素,主要负责解析和准备 H.264 流以便后续处理。

深之JohnChen的专栏 1026

【图像超分】论文复现:经典超分 | SAN的Pytorch源码复现,跑通源码,适配高版本的python/pytorch/cuda,使用EDSR-PyTorch进行训练和测试

本文介绍了单幅图像超分辨率重建方法SAN(二阶注意网络)的代码实现。文章详细说明了在高版本Python/Pytorch环境下适配SAN源码的方法,并提供了修改后的完整代码和预训练模型下载链接。 主要亮点包括: 将SAN模型实现整合到EDSR-Pytorch框架中,解决了高版本环境下的兼容性问题 提供了完整的数据集准备指南(DIV2K训练集和5个测试集) 给出了详细的测试命令,涵盖x2、x3、x4不同放大倍率 公开了预训练模型和可视化结果的下载资源 提供了修改后的适配高版本环境的代码。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1412

RV32G下lui/auipc和addi结合加载立即数时的补值问题

一、问题描述与解决思路 在32位下,lui/auipc通常用来取一个32位数的高20位,并且是带符号操作,将最高位默认为符号位。那么,取完最高位20位之后,再取低12位的时候,会面临一个补值问题。 假设这个32位内容为正数,lui/auipc取高20位的时候本身没问题,但是后续再对剩余的12位数字进行操作的时候,如果第11位是1,那么这一位会被当成是符号位,就将一个12位的正数变成了一个11位的负数。这种情况之下,lui/aupic和addi的合并操作的计算结果就不对了,就变成了高20位减去了一个低11

SHINING的博客 2140

UNet改进(24):注意力机制-从基础原理到高级融合策略

本文系统探讨了如何通过引入各类注意力机制增强UNet在医学图像分割中的性能。文章分为基础篇、进阶篇和高级篇三个层级:基础篇介绍了时序注意力、可变形注意力、分层注意力等8种基础机制;进阶篇提出了5种混合注意力设计;高级篇则探讨了全局+局部+多尺度等复杂组合机制。实验表明,这些注意力模块在心脏MRI、肺部感染等任务中能提升2-15%的分割精度。文章还提供了硬件适配建议和完整实现代码,为研究者提供了全面的技术参考。未来方向包括NAS优化、量子注意力等前沿探索,为UNet在医疗影像等领域的应用革新提供了理论指导。

2501_91516851的博客 764

mysql中 ' 和 ` 的区别

mysql中 ' 和  ` 的区别 两者在linux下和windows下不同,linux下不区分,windows下区分。 主要区别就是 单引号( ' )或双引号主要用于 字符串的引用符号 如: mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '/'hello';   数据库、表、索

龙腾四海365的专栏 2946

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ 指针和对象成员访问的区别:`.` 与 `->` 的使用指南

在学习 C++ 时,常常会遇到访问对象成员的两种符号:`.` 和 `->`。这两个符号看似简单,但它们的正确使用却需要理解指针和对象的本质差异。对于 C/C++ 小白来说,这篇文章将详细解释它们的区别,帮助你在编程时少踩坑。

XuanRan的博客 4358

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java 中 `==` 和 `equals()` 的区别详解

本文将深入探讨== 和 equals() 之间的区别,并通过示例解释如何正确使用它们。

YT的博客 7795

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

卡特兰数[catalan数]`

定义: 卡特兰

1731

C++20新特性:`[[no_unique_address]]`、`[[likely]]`和`[[unlikely]]`的探索与

C++20引入的[[likely]]和属性为开发者提供了更强大的优化工具。可以优化空类成员的存储,减少不必要的空间占用;而[[likely]]和则可以帮助编译器更好地进行分支预测,提升代码性能。这些特性在现代C++编程中具有重要的应用价值,值得开发者深入学习和使用。希望本文能帮助你更好地理解和应用这些C++20的新特性。如果你对这些内容感兴趣,欢迎继续探索更多C++20的特性!

码事漫谈 1848

Python中`*`和`**`是什么? 如何如此重要??

Python中`*` 和 `**`介绍以及使用思路!!

AI Agent 首席体验官 3091

软件模块扇出数(Fan-out)

扇出数是衡量软件模块耦合复杂度的关键指标,指一个模块直接调用的外部模块数量。高扇出会导致维护困难、测试复杂和系统脆弱,理想范围为3-7。优化策略包括引入门面模式封装依赖、应用依赖倒置原则通过抽象降低耦合,以及聚合服务减少直接调用。研究表明,扇出数超过7时缺陷密度显著增加,需及时重构优化架构健康度。

luotuo28的博客 1377

在 Vue 中,使用 `{}` 和 `()` 的场景

{{ message }}

m0_57836225的博客 691

`Python`的`垃圾回收`机制:`引用计数`与`分代回收`的协同工作原理。

Python的垃圾回收机制,依赖于引用计数的基础和分代回收的补充,实现了自动化的内存管理。理解并合理利用这些机制,可以帮助我们写出更高效、更稳定的Python程序。优化策略包括减少循环引用、及时解除引用、调整回收阈值等,这些都是提升程序性能的重要手段。

weixin_41455464的博客 1048

Rust - 引用和借用

这个跟变量的作用域有所不同。变量的作用域是从创建的位置向下持续到作用域的关闭花括号“ } ”

日拱一卒无有尽,功不唐捐终入海 1625
上一篇: 关于HTTP的几个个人预言
下一篇: 重新维护这个公众号
xosg
xosg 领域专家: 网络协议与安全技术领域 领域专家: 网络协议与安全技术领域
博客等级 码龄9年 1986粉丝 864原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xosg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值