介绍
计算机的世界有很多好玩的东西,可以发表一下,给自己和大家增加乐趣。
本文长期更新,地址不变,欢迎常来看看,发现惊喜。
更新记录
- 2022-03-25 发布第一版
- 2024-04-20 增加 框架入侵性的解释
- 2024-04-22 增加 cache和buffer的对比
- 2024-04-28 增加了TPU的介绍,张量和数组的区别,幂等的解释,增加了端到端的解释
- 2024-05-21 增加关于显卡的介绍,增加了亚秒的介绍,增加分类和调整文章结构
目录
-
localhost与127.0.0.1的区别
-
0.1+0.2 !=0.3 的背后
-
幂等
-
异或运算
-
张量
-
操作系统
- SELinux
-
硬件
- GPU,CPU,TPU
localhost 与 127.0.0.1 的区别
参考
1 简单了解:localhost 与 127.0.0.1 的区别 - 掘金 (juejin.cn)
区别
当你使用 localhost时,系统会通过DNS(域名系统)解析来将其转换为相应的IP地址。一般情况下,这个过程很快,因为大多数操作系统都会在本地的 hosts文件中对 localhost进行映射,使其指向 127.0.0.1或类似的环回地址。
相反,使用 127.0.0.1时,由于它本身就是一个IP地址,因此无需通过DNS解析,数据包直接在本机内部路由。
性能差异
虽然这两者之间的性能差异微乎其微,但在某些高性能要求的环境中,避免即使是最小的延迟也是至关重要的。
- 使用
localhost可能会引入微小的延迟,因为需要经过DNS解析的过程。 127.0.0.1则可以省略这一步骤,稍微提升效率。
IPv6环境
在IPv6环境下,localhost的解析和使用还具有更多的考量。
localhost在IPv6中通常解析为::1,这是IPv6下的环回地址。- 直接使用
127.0.0.1无法利用IPv6的优势,因此在IPv6优先的网络环境中,推荐使用localhost。
0.1+0.2 != 0.3
参考
作者:谢千星,链接:juejin.cn/post/732231…,0.1+0.2等于多少?
计算机科学里的小数
十进制小数转成二进制,一般采用"乘2取整,顺序排列"方法,如0.625转成二进制的表示为0.101。 但是,并不是所有小数都能转成二进制,如0.1就不能直接用二进制表示,他的二进制是0.000110011001100… 这是一个无限循环小数。所以,计算机是没办法用二进制精确的表示0.1的 人们想出了一种采用一定的精度,使用近似值表示一个小数的办法。这就是IEEE 754 IEEE754中,一个浮点数由符号位、尾数和阶码组成。符号位用于表示正数或负数,尾数是有效数字的部分,而阶码用于表示指数
面试官:0.1+0.2等于多少?我:0.3000000000000004 面试官:为什么不是0.3?我:因为采用了IEEE754码制,十进制浮点数无法完全精确转换为二进制浮点数 面试官:那你能实现0.1+0.2==0.3吗 我:(0.1* 10 + 0.2 *10)/10==0.3面试官:你还会别的实现方法吗 我:使用BigDecimal类存储0.1和0.2,然后再用add方法相加!
幂等
参考
1 作者:程序员老猫,链接:juejin.cn/post/732418…,前任开发在代码里下毒了,支付下单居然没加幂等
场景
小猫做的是一个标准的积分兑换商城,以前和客户合作的时候,客户直接用的是小猫单位自己定制的h5页面。这次合作了一家公司有点特殊,由于公司想要定制化自己个性化的H5,加上本身A公司自己有开发能力,所以经过讨论就以接口的方式直接将相关接口给出去,A客户H5开发完成之后自己来对接。
之前好好的业务一直没有问题是因为商城的本身H5页面做了防重复提交,由于量小,并且一般对接方式用的都是纯H5,所以都没有什么问题,然后这次是直接将接口给出去了,完了接口居然没有加幂等......
总结,后端接口也要加上幂等。
幂等的必要性
为什么需要幂等呢?
- 用户进行提交动作的时候,由于网络波动等原因导致后端同步响应不及时,这样用户就会一直点点点,这样机会发生重复提交的情况。
- 分布式系统之间调用的情况下,例如RPC调用,为了防止网络波动超时等造成的请求失败,都会添加重试机制,导致一个请求提交多次。
- 分布式系统经常会用到消息中间件,当由于网络原因,mq没有收到ack的情况下,就会导致消息的重复投递,从而就会导致重复提交行为。
- 还有就是恶意攻击了,有些业务接口做的比较粗糙,黑客找到漏洞之后会发起重复提交,这样就会导致业务出现问题。打个比方,老猫曾经干过,邻居小孩报名了一个画画比赛,估计是机构培训发起的,功能做的也差,需要靠投票赢得某些礼品,然后老猫抓到接口信息之后就模拟投票进行重复刷了投票。
那么哪些接口需要做幂等呢?
首先我们说是不是所有的接口都需要幂等?是不是加了幂等就好呢?显然不是。 因为接口幂等的实现某种意义上是要消耗系统性能的,我们没有必要针对所有业务接口都加上幂等。
这个其实并不能做一个完全的定义说哪个就不用幂等,因为很多时候其实还是得结合业务逻辑一起看。但是其中也是有规律可循的。
既然我们说幂等就是多次调用,接口最终得到结果一致,那么很显然,查询接口肯定是不要加幂等的,另外一些简单删除数据的接口,无论是逻辑删除还是物理删除,看场景的情况下其实也不用加幂等。
但是大部分涉及到多表更新行为的接口,咱们最好还是得加上幂等。
接口幂等实战方案
前端防抖处理
前端防抖主要可以有两种方案,一种是技术层面的,一种是产品层面的:
- 技术层面:例如提交控制在100ms内,同一个用户最多只能做一次订单提交的操作。
- 产品层面:当然用户点击提交之后,按钮直接置灰。
基于数据库唯一索引
- 建立一张去重表,其中某个字段需要建立唯一索引,例如小猫这个场景中,咱们就可以将订单提交流水单号作为唯一索引存储到我们的数据库中,就模型上而言,可以将其定义为支付请求流水表。
- 客户端携带相关流水信息到后端,如果发现编号重复,那么此时就会插入失败,报主键冲突的错误,此时我们针对该错误做一下业务报错的二次封装给到客户另一个友好的提示即可。
后端生成token
这个方案的本质其实是引入了令牌桶的机制,当提交订单的时候,前端优先会调用后端接口获取一个token,token是由后端发放的。当然token的生成方式有很多种,例如定时刷新令牌桶,或者定时生成令牌并放到令牌池中,当然目的只有一个就是保住token的唯一性即可。
生成token之后将token放到redis中,当然需要给token设置一个失效时间,超时的token也会被删除。
当后端接收到订单提交的请求的时候,会先判断token在缓存中是否存在,第一次请求的时候,token一定存在,也会正常返回结果,但是第二次携带同一个token的时候被拒绝了。
异或运算?
异或运算, xor,通俗来讲,就是说 检查是不是 不相等, 记为 “!=” ,但是它又不完全等于 不等于,因为它是一个按位运算的符号。
0 xor 1 = 1, 解释:0和1不一样,返回1,1表示True
0 xor 0 = 0,解释: 0和0一样,返回False,即为 0
0 xor a = a, 解释: a表示任意数字,把a变成二进制,和0做异或运算,其各位的0和1都不会变化的,所以其值不变。
http1.0和http1.1的区别 TODO
参考
张量
在数学和物理学中,张量是一个广义的概念,它表示一个多维数组,这些数组在坐标变换下遵循一定的规则。张量在数学上用于描述线性映射,而在物理学中用于表示物理量,这些物理量具有特定的变换性质。
张量的关键特性是它们在坐标变换下的“不变性”。这意味着张量在从一个坐标系转换到另一个坐标系时,其分量会按照特定的规则变化,以保持张量表示的物理量或几何关系不变。这种性质使得张量成为描述和理解自然界中各种现象的有力工具,特别是在相对论、连续介质力学、电磁学和其他物理领域。
在机器学习和深度学习中,张量被用作数据结构来存储和操作多维数据。例如,一个图像可以表示为一个三维张量,其中两个维度表示图像的宽度和高度,第三个维度表示颜色通道(如RGB)。在深度神经网络中,输入数据、权重、激活函数的输出等都是作为张量来处理的。
张量的概念在深度学习框架中非常重要,如TensorFlow、PyTorch和Theano等,这些框架提供了丰富的张量操作库,使得研究人员和开发者能够高效地构建和训练复杂的神经网络模型。在这些框架中,张量可以具有任意数量的大小、形状和类型,从而能够灵活地表示和处理数据。
一个具体的张量例子可以是简单的一维数组,也可以是更复杂的多维数组。在深度学习中,最常见的是二维、三维和四维张量。 以下是一些具体的张量例子:
-
一维张量(向量) :
- 一个长度为5的一维张量,表示五个学生的分数:[70, 80, 90, 85, 95]。
-
二维张量(矩阵) :
-
一个2x2的二维张量,可以表示一个方阵:
[[1, 2], [3, 4]] -
一个3x3的二维张量,可以表示一个旋转矩阵或者一个图像的小块:
[[0, 1, 0], [0, 0, 1], [1, 0, 0]]
-
-
三维张量:
-
一个3x3x3的三维张量,可以表示一个三维空间中的数据点集合或者一个小体积的图像数据:
[[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[10, 11, 12], [13, 14, 15], [16, 17, 18]], [[19, 20, 21], [22, 23, 24], [25, 26, 27]]]
-
-
四维张量:
-
一个4x4x4x4的四维张量,可以表示一系列三维数据的集合,这在处理视频数据时很常见,其中每个三维张量可以表示一个视频帧:
[[[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]], [[17, 18, 19, 20], [21, 22, 23, 24], [25, 26, 27, 28], [29, 30, 31, 32]], [[33, 34, 35, 36], [37, 38, 39, 40], [41, 42, 43, 44], [45, 46, 47, 48]], [[49, 50, 51, 52], [53, 54, 55, 56], [57, 58, 59, 60], [61, 62, 63, 64]]], ...(更多的三维张量)...]在实际应用中,张量的维度和大小会根据具体的问题和数据类型而有所不同。例如,在处理图像时,一个典型的三维张量会有高度、宽度和颜色通道这三个维度。在处理视频或序列数据时,会增加时间维度,形成四维张量。
-
为什么张量不直接叫数组
在数学和物理学中,张量是一个高度抽象的概念,它不仅仅是一个多维数组,而是具有特定变换法则的对象。然而,在计算机科学和深度学习中,张量的概念被简化为一个多维数组,这种简化主要是为了实际计算和编程的方便。 在深度学习领域,将多维数组称为张量的原因包括:
- 通用性:在机器学习中,数据可以是标量、向量、矩阵或更高维度的数组。使用“张量”这个词可以统一表示所有这些不同维度的数据结构。
- 变换性质:虽然深度学习中的张量不严格遵守数学中的变换法则,但它们在坐标变换(如卷积神经网络中的图像旋转、缩放等)下保持了一定的不变性,这与数学张量的概念相呼应。
- 灵活性:张量的概念允许数据具有任意的维度和大小,这使得深度学习模型能够处理从简单到复杂的不同数据结构。
- 符号表示:在数学符号中,不同的符号被用来区分不同维度的对象(如标量、向量、矩阵)。使用“张量”这个词可以避免引入过多的新符号,简化了数学表示。
- 历史原因:深度学习的发展受到了物理学和数学的强烈影响,其中张量是描述物理现象和几何关系的重要工具。因此,深度学习社区借鉴了这个术语来表示多维数组。 尽管在深度学习中使用的张量与数学中的张量定义有所不同,但这个术语仍然提供了一个强大而灵活的框架来处理复杂的数据结构。通过使用张量,深度学习研究人员和开发者能够构建和训练各种类型的神经网络模型,这些模型能够处理从简单的标量到复杂的图像和视频数据。
框架侵入性的通俗解释
2022-03-25101阅读2分钟
编辑
什么叫做一个框架的侵入性?可能很多人很难像别人解释清楚.
我想了个例子,很好的说明了什么叫侵入性.
初级解释:
A是侵入性的,B代码中使用A,那么如果以后不用A了(用另外一个工具代替),必须修改B的代码。 反之,如果A是非侵入性的,B不用A,用C了,代码不需要改,改改配置文件什么的,就可以了。
进阶解释: Spring和hibernate都是通过声明式配置文件, 就可以实现我们所要的功能,很少用他们的API 进行编码,估计这是叫低侵入性吧, EJB则相反。
最终解释
上面两个是网上找的,这个是我自己打比方解释的,你们感受一下
入侵性, 国家A 要为国家B提供某种服务, 比如国防保护吧, 他提供了武器装备和一些武器使用的军事人员, 国家A和国家B 界限清白,单纯的武器交易关系,这就叫做低侵入性,如果A国家直接在B国家建立军事基地, 还要B国家出钱啊,整天军演招摇过市, 影响百姓生活,影响一个国家的正常行为,这就叫做高入侵性.
放到程序里,一个框架的低入侵性, 就是说,想不使用这个框架的时候, 需要改的代码很少,因为这个框架可以通过配置xml ,properties文件等等 而单独发挥作用, 如果一个框架的高入侵性, 就是说, 如果突然不想使用这个框架, 那么需要改的代码特别多,因为 这个框架影响了整个代码编写, 到处都要使用它提供的方法, 其他代码对这个框架的方法 依赖性特别高.
最早发表的网址:blog.csdn.net/silly119505…
cache和buffer的对比
在计算机科学中,cache 和 buffer 是两个经常被提及的术语,它们都用于存储数据,但是它们的用途和设计意图有所不同。 Cache(缓存) :
Cache是一种存储技术,用于临时存储频繁访问的数据或最近访问的数据,以便快速访问。- 它的主要目的是提高数据检索性能,通过减少访问延迟较高的主存储器(如硬盘或网络)的需要。
Cache通常用于存储指令、数据和磁盘块。Cache的管理通常由硬件(如CPU缓存)或软件(如浏览器缓存、数据库缓存)自动进行。Cache中的数据可能会随着新的数据被访问而替换掉,遵循一定的替换策略,如最近最少使用(LRU)。 Buffer(缓冲区) :Buffer是一块内存区域,用于临时存储数据,尤其是在数据从一个地方移动到另一个地方时。- 它的主要目的是平滑数据流,防止数据生产者和消费者之间的速度不匹配。
Buffer通常用于输入/输出操作,如磁盘I/O、网络通信和视频播放。Buffer的管理可以是自动的,也可以是手动的,取决于具体的应用场景。Buffer中的数据一旦被消费,就会被清空或替换为新数据。 简而言之,cache和buffer都用于临时存储数据,但cache更侧重于提高访问速度,而buffer更侧重于平滑数据流和处理速度不匹配的问题。
端到端
"端到端"(End-to-End)这个术语通常用于描述一个系统、流程或服务中的全程覆盖,意味着从起始点到终点的一切都包含在内。在不同的上下文中,"端到端"的具体含义可能会有所不同,但总体上它强调的是完整性和全面性。 以下是一些不同领域中"端到端"的例子:
-
通信和网络:
- 在网络通信中,端到端可以指数据从源头传输到目的地的整个过程,包括所有必要的路由、传输和转换步骤。
-
软件开发:
- 在软件开发中,端到端测试是指对软件应用从用户界面到数据库层的全面测试,以确保所有组件协同工作无误。
-
供应链管理:
- 在供应链管理中,端到端管理指的是从原材料采购到最终产品交付给消费者的整个供应链流程的管理和优化。
-
业务流程:
- 在企业管理和业务流程中,端到端流程是指涵盖整个过程的所有步骤,从需求识别到客户服务和支持,确保业务目标的实现。
-
机器学习:
- 在机器学习中,端到端学习是指模型直接从原始数据输入到最终决策输出的整个过程,而不需要多个独立的处理步骤。
-
产品开发:
- 在产品开发中,端到端开发指的是从产品概念到市场推广的整个产品生命周期管理。 端到端的方法通常强调系统或过程的整体性能和效率,确保每个环节都能够无缝对接,以达到预期的结果。在设计和实施端到端解决方案时,需要考虑各个环节的相互作用和依赖关系,以及如何优化整个系统而不是单个部分。
String类能存多少字符
1 首先String的length方法返回是int。所以理论上长度一定不会超过int的最大值
2 编译器源码如下,限制了字符串长度大于等于65535就会编译不通过。
TODO 具体再了解一下。
参考
1 面试官问我String能存储多少个字符? - 掘金 (juejin.cn)
为什么Java中的String是不可变的
TODO
操作系统
SELinux
SELinux(Security-Enhanced Linux)是一个Linux内核的安全模块,它为Linux提供了增强的强制访问控制(MAC)机制。它是由美国国家安全局(NSA)开发的,旨在通过最小权限原则来限制进程可以访问的资源,从而提高系统的安全性。 在传统的Linux系统中,访问控制主要基于用户ID(UID)和组ID(GID),这种模型被称为自主访问控制(DAC)。而SELinux提供了额外的安全层,通过策略规则来控制文件、进程、网络接口和用户的交互。这些策略规则定义了哪些主体(如进程)可以访问哪些对象(如文件),以及可以执行哪些操作。 SELinux有三种模式:
- 强制模式(Enforcing) :SELinux策略被强制执行,违反策略的行为将被阻止并记录到日志中。
- 许可模式(Permissive) :SELinux策略不被强制执行,但违反策略的行为会被记录到日志中,用于调试和策略改进。
- 关闭模式(Disabled) :完全关闭SELinux,不执行任何SELinux策略。
- SELinux可以显著提高系统的安全性,尤其是在面对未知攻击和零日漏洞时。然而,配置和管理SELinux可能比较复杂,需要理解其工作原理和策略规则。
硬件
GPU和CPU和TPU
参考
1 作者:xuejianxinokok,AI时代每个程序员都应该了解 GPU 基础知识 juejin.cn/post/732457…
GPU
为了提高顺序执行性能,多年来 CPU 设计中引入了许多功能。重点是减少指令执行延迟,以便 CPU 能够尽快执行指令序列。这包括指令流水线、乱序执行、推测执行和多级缓存等功能(仅列出一些)。
另一方面,GPU 专为大规模并行性和高吞吐量而设计,但代价是 较高的指令延迟。这一设计方向受到了它们在视频游戏、图形、数值计算和现在深度学习中的使用的影响。所有这些应用程序都需要以非常快的速度执行大量线性代数和数值计算,因此人们对提高这些设备的吞吐量投入了大量关注度。
让我们考虑一个具体的例子。由于指令延迟较低,CPU 可以比 GPU 更快地计算两个数字加法。他们将能够以比 GPU 更快的速度 连续执行多项此类计算。然而,当进行数百万或数十亿次此类计算时,GPU 由于其巨大的并行性而比 CPU 更快地完成这些计算。
CPU 将大量芯片面积专门用于可减少指令延迟的功能,例如大缓存(蓝色部分)、更少的 ALU (绿色部分)和更多的控制单元(黄色部分)。相比之下,GPU 使用大量 ALU(绿色部分) 来最大化其计算能力和吞吐量。它们使用非常少量的芯片区域作为缓存和控制单元,从而减少 CPU 的延迟。
我们只需要知道,GPU 是专门为了多线并行,提高吞吐量做了特殊设计,可以一下子计算很多,但是单位延迟稍高。
TPU
相对于CPU(中央处理单元)和GPU(图形处理单元),TPU(Tensor Processing Unit)是一种专门为机器学习和深度学习计算设计的处理器。TPU是由谷歌开发的,它优化了用于神经网络计算的矩阵乘法和向量计算,这些计算在传统的CPU和GPU上可能效率不高。 TPU的特点包括:
- 专门化:TPU针对深度学习中的张量操作进行了优化,这些操作是神经网络计算的核心。
- 低延迟:TPU设计用于减少数据传输的延迟,使得在执行计算时能够更快地处理数据。
- 高吞吐量:TPU能够处理大量的并行计算,这对于大规模的神经网络训练和推理非常重要。
- 能效比:相对于传统的CPU和GPU,TPU在执行深度学习任务时能够以更高的能效比进行工作。 TPU通常用于在数据中心进行大规模的机器学习训练和推理,以及在一些边缘设备上进行实时数据处理。谷歌的TPU已经发展了多个版本,包括TPU v1、TPU v2(也称为TPU Pod)、TPU v3、TPU v4等,每个版本都在性能和能效方面有所提升。 总的来说,TPU是人工智能领域中的一个重要创新,它为深度学习应用提供了专门的硬件加速,使得这些应用能够更快、更高效地运行。
显卡的名字
英伟达的一个显卡, NVIDIA GeForce GTX 1080 Ti 怎么理解这么长的名字?
NVIDIA GeForce GTX 1080 Ti 这个名字包含了多个部分,每个部分都有其特定的含义:
- NVIDIA:这是公司的名称,NVIDIA(英伟达)是一家设计和制造图形处理单元(GPU)和其他高性能半导体公司的知名企业,总部位于美国加利福尼亚州圣克拉拉。
- GeForce:这是NVIDIA为其消费级显卡产品线所起的名字,主要面向个人电脑游戏和娱乐市场。
- GTX:这是GeForce产品线中的一个子品牌,通常代表着高端的显卡性能,主要用于游戏和高级图形处理。
- 1080:这个数字传统上代表着显卡的性能级别。数字越高,通常意味着性能越强。1080表示它是2016年发布的产品系列中的一款,相对于之前的型号(如980)有显著的性能提升。
- Ti:这是“Titanium”(钛)的缩写,通常用于表示同一系列中更高端、性能更强的版本。在这里,GTX 1080 Ti 是 GTX 1080 的加强版,提供了更高的性能和更多的功能。 将这些部分组合起来,NVIDIA GeForce GTX 1080 Ti 就代表了一款由 NVIDIA 公司生产的、属于 GeForce 高端游戏系列、具有 GTX 级别性能,并且在 GTX 1080 基础上进一步提升了性能的显卡。这样的命名方式有助于消费者快速了解产品的定位和性能等级。
七彩虹也有一个显卡,名字叫 GTX 1080 Ti 吗,所以GTX是一个行业术语吗?
实际上,七彩虹(Colorful)和其他显卡制造商,如华硕(ASUS)、微星(MSI)、技嘉(GIGABYTE)等,也会使用类似的命名方式来命名他们的显卡产品。这些公司通常生产基于 NVIDIA GeForce GTX GPU 的显卡,并会按照 NVIDIA 的产品命名规则来命名。
在这种情况下,"GTX" 不是一个行业术语,而是 NVIDIA 的一个品牌和产品线名称。当其他显卡制造商使用 "GTX" 这个词时,它通常意味着他们的产品是基于 NVIDIA 提供的 GTX 系列 GPU 设计的。因此,即使是不同品牌的显卡,如果它们都使用了 "GTX 1080 Ti" 这个名字,那么它们都是基于 NVIDIA GeForce GTX 1080 Ti GPU 的设计,只是散热方案、外观设计、时钟速度、内存配置或其他功能可能会有所不同。
这种命名方式有助于消费者识别不同品牌显卡的基本性能级别,因为它们都基于相同的 NVIDIA GPU 核心。
关于七彩虹本身, 是一家总部位于中国深圳的电子产品制造商,主要生产和销售显卡、主板、固态硬盘、台式机、笔记本电脑等电脑硬件和相关配件。七彩虹成立于1995年,是中国较大的硬件制造商之一,以其多样化的产品线和相对亲民的价格而闻名。
七彩虹与多家知名半导体公司,如NVIDIA和AMD,都有合作关系,因此它们能够生产基于这些公司技术的显卡产品。七彩虹的产品不仅在中国市场有很高的知名度,也在全球市场上占有一定的份额。
时间的概念
亚秒
"亚秒级"这个术语通常用来描述非常短的时间间隔,它指的是小于一秒的时间。具体来说,"亚秒"指的是一秒的一小部分,但通常不是指毫秒(千分之一秒)以下的精确时间。在日常生活中,人们可能会用"亚秒级"来形容几乎立即发生的事情,而在科学和技术领域,它可能指的是几十毫秒到几百毫秒之间的时间范围。
例如,在计算机科学和数据处理中,亚秒级的响应时间通常指的是系统或应用程序在处理请求时所需的时间非常短,通常在几百毫秒以下。这种性能水平对于需要快速响应的应用场景,如高频交易、实时控制系统等,是非常重要的。