- 博客(242)
- 收藏
- 关注
原创 docker推拉时的数据交换详解
docker用了这么久了, 有没有想过, 在执行和命令的时候, 数据是如何传递的呢?换句话说, 如果要实现一个镜像仓库, 针对推拉的服务, 如何实现接口呢?根据的描述, 已经对整个推拉过程中要调用的接口有描述了. 但是, 纸上学来终觉浅, 我还是决定针对harbor仓库进行推拉操作的抓包, 看看实际上接口调用是怎样的.以下所有抓包, 均为本地搭建的harbor仓库(在实现上可能与OCI 略有差异).
2024-03-24 16:21:02 665
原创 聊聊 Go 边界检查消除
在中碰巧看到了Go边界检查消除相关的讨论. 我也借此简单聊聊.根据之前到这里, 就要引出Go边界检查的概念了. 我们都知道, 在数组访问越界的时候会触发panic, 这个其实是编译期在编译期间额外添加边界检查代码实现的. 可以给go build命令添加参数来查看哪些地方触发了边界检查:在每次数组访问前都会进行边界检查.而如果我们将其改造成这样, 就只需要2次边界检查.
2024-02-25 14:04:52 575
原创 一种计数算法
常见的一个问题: 给定一个整形数组, 统计其中有多少唯一的元素.常见的思路有哪些呢?以上空间复杂度均与元素数量关联, 如果允许损失精度, 是否可以使用较低的空间占用来统计呢?但是, 我在看到了一种全新的思路. 尽管并不建议在生产环境中使用, 但仍不失为一种思路.
2024-01-21 16:40:13 552 1
原创 使用Go实现一个百行聊天服务器
作为客户端连接, 实现的功能简单来说就是一个大的聊天室, 用户发的消息会同步发给所有用户. (因代码篇幅和复杂度原因, 就不对代码做详细说明了)但总得来说, 作为一个玩具还是可以的, 而且也达到百行的要求咯.(这也是我改了几版才改到百行的…于是, 心血来潮下, 我也整了个。语言版本的聊天服务器嘛,, 代码量拢共不过百行.
2023-12-16 22:11:21 730
原创 正则表达式使用文档
在平常进行字符串匹配的时候如何做呢?比如希望从字符串Hello Word中匹配到第一个单词, 我们就会拿着Hello子串进行匹配.正则表达式的表示与其相同, 区别是在子串匹配时每个字符都会进行原样匹配, 而正则表达式中会存在一些特殊符号, 这些符号会代表一些特殊的含义, 如a+的意思是匹配任意多个连续的a字符, 是不是十分简单?如此说来, 要使用正则表达式, 关键点就在于了解其中的特殊字符上.分类字符含义单字符任意字符(换行符除外)\d任意数字\D非数字\w字母数字下划线\W。
2023-09-12 10:20:44 371
原创 容器镜像静态扫描原理
以上, 就是镜像的静态扫描原理了. 看完之后是不是发现特别的简单?但其实写起来并没有想象中那么简单, 比如合并的操作就比较繁琐. 不过这里只介绍原理, 知道是怎么回事就行了.还有一些扫描是动态扫描, 会将镜像启动, 然后通过攻击行为来判断是否存在某种漏洞. 不在本文的说明范围内.
2023-06-11 18:35:13 2163
原创 Docker镜像存储
在中有说过容器目录的隔离机制. 今天来分析一下镜像的文件系统.Docker 已经用了很久了, 也知道镜像存储的时候是分层存储的(从时分层下载就能看出), 但是具体是如何将多层进行聚合并生成最终展示的文件, 这个过程从未深究过. 既然不知道, 又难掩好奇, 就抽时间康康它具体是怎么做的吧。
2023-06-04 11:13:22 663
原创 k8s 中 pod 是如何做到网络共享的
在k8s中, pod是编排的最小单位, 在同一个pod中, 容器之间能够共享hostnamenetwork等内容.共享network, 简单说就是同一个pod中的容器, 可以通过访问localhost互相访问, 且端口占用会冲突.在之前的介绍中提到过, 容器的隔离是通过namespace技术实现的, 网络隔离自然也是通过实现. 每个中都有自己的一套网络资源, 比如: IP地址, 路由表, 网卡等.那么网络共享的原理, 自然也就是将多个容器加入到同一个中咯.令多个容器共用一套, 在docker。
2023-05-23 15:13:53 1197 2
原创 容器目录挂载原理
就我目前的对容器的了解, 使用namespace技术实现隔离, 使用cgroups技术实现资源限制. 但是具体是如何实现却从未深究过.闲来无事, 挑其中的来康康, 容器是如何实现目录隔离的.
2023-05-20 18:09:01 654
原创 go test main包报错
先提出问题, 再说明原因. 有如下一段代码:当执行go test测试时, 会报如下错误:main.test什么意思?导入main包失败?Why?maingo.modmoduledemo.go综上, 只有对根目录的main包方法执行test时会报错.
2023-04-15 22:57:42 715 1
原创 零拷贝简介
什么是零拷贝呢? 这个词想必听过不止一次了吧, 但一直没有认真的研究一下这到底是个什么玩意.在很久之前, 一次IO 操作的流程大致是这样的:假设, 这里的 IO 设备是磁盘, 那么磁盘的一次操作流程如下:在上面的数据获取的过程中, 发生了3次数据的拷贝, 其中2次是 CPU 全程参与的. 而这个过程, CPU 忙于拷贝数据, 无暇做其他工作.为了减轻 CPU 的压力, 应运而生.做的事情, 简单说来就是上图步骤2. 数据从 IO 设备缓冲区到内核缓冲区的拷贝工作, 不需要CPU 参与, 也就腾出一定的时间来
2023-04-08 17:53:23 623
原创 Go内存逃逸
很久以前就听过过**内存逃逸**这个词, 最近了解了一下, 才发现是个很简单的概念. 只要把前言部分看完, 就已经了解了. 来吧...
2023-01-15 17:40:56 582
原创 Go内存更新问题
在开始之前, 先来引出问题. 有这样一段go这段代码可能会有哪些结果呢?但是, 如果你多跑几次, 就会发现,x=0, y=0这种我们以为不会出现的情况, 是真的会出现的.不过这种情况为什么发生想必也都心知肚明, 就简单聊一聊吧.
2022-12-24 23:41:20 1048
原创 Docker kill 1无效
我们在平常强制停用一个进程的时候, 会选择什么命令?一般在测试使, 不考虑程序突然中断带来的影响, 直接使用强制停止就行.但是, 就在刚刚, 我启动了一个docker容器, 进入容器后执行命令kill -9 1没有任何效果???啊这, 为什么呀?
2022-11-08 22:09:04 1131
原创 Golang 接口原理
以上, 简单的了解了GO接口的内部实现, 发现接口在实现上和普通的结构体变量十分不同, 其内部是通过一个特定的结构体来记录信息的. 知道了接口的实现, 我们在平常开发时, 碰到接口就应该注意一下, 若interface判断不为nil, 存储的值也可能为nil.最后,GO1.18之后增加了泛型的支持, 以前使用interface接收任意参数的场景 也可以使用泛型替代了....
2022-08-03 17:34:06 161
原创 RESTful API规范
我现在工作的公司是在毕业前实习的公司, 实习结束后直接转正, 因此也是我任职过的唯一一家公司.在日常工作进行 HTTP 接口的开发时, 发现了一个疑惑, 只用到了和请求, 但我们知道 还有等等, 为什么不用呢?并且, 接口的响应码也只有200, 接口是否出错, 会在响应体中额外添加字段来标识. 当然, 偶尔也会碰到之类的响应码, 不过他们都还没有到业务层就返回了, 因此并不是我们主动涉及的响应码. 但是, HTTP 响应码辣么多, 为什么不用呢?就在我苦苦思索仍不得其解的时候, 我去翻看了一下 HTTP 协
2022-07-10 21:57:20 346
原创 PHP require/include 区别
在中, 载入文件可以选择使用, 也可以使用, 那么那他们有什么区别呢? 看了网上的一些文章, 说他们使用场景不同, 一般在文件开头引入文件, 一般在函数中动态引入文件.但是我觉得并不是这么简单, 是作为语言结构(关键字)出现的, 关键字这玩意对于语言设计者来说一般都是越少越好, 关键字少了语言才简单嘛. 于是我决定深入到源码级别来康康他们的区别.通过查看, 这几个方法翻译后是同一个函数.如何拿到这个函数可看这篇文章: https://hujingnb.com/archives/836查看方法:方法的处理方式
2022-06-25 19:43:29 170
原创 PHP获取Opcode及C源码
在开始之前, 必须要先介绍一下是什么.众所周知, 在执行的时候, 会将后缀的文件预先编译为字节码文件, 加载字节码文件进行解释执行. 而字节码文件存在的意义, 就是为了加速执行.那么的与之类似, 也是从文件到执行的过程中, 所生成的预编译中间文件.或者也可以这样粗鲁的理解, 程序是由写的二进制程序, 就是将文件翻译为代码的结果.有什么用我们最后再说, 先让我们看一下它长什么样子如何获得文件的呢? 在的源码中, 可以通过函数获取代码解析后的. 但是我们要是为了获取得深入到, 是在有些得不偿失. 好在, 已经有
2022-06-25 13:18:32 1345
原创 Golang Context 简介
在写程序调用各种第三方库的时候, 经常会传一个叫做的参数. 之前基本上见到接, 根本不管是干什么用的, 直接无脑.但是, 传着传着就不免发生一些小疑问, 这个参数到底是干什么用的呢? 这么多库都在使用, 至少说明其是中的一个共识, 一个基础元素. 除了一定还有其他的值, 否则也不会作为参数来接收了.用了这么久, 都不知道它的作用, 这实在有点说不过去了, 于是抽时间来好好研究研究在中的作用.在源码包中, 很贴心的给出来官网介绍的文章: https://blog.golang.org/context在中, 协
2022-06-18 15:53:38 665
原创 CPU的分支预测
最近在进行性能调优的时候, 碰到了这样的一段代码(为了展示问题而简化的代码):其中的两次运行操作基本一致, 均完成了十亿次循环. 按理说他们的运行时间应该是一样的呀. 但是, 浅看结果:虽然每次运行的时间都不一样, 但是, 第二种方式每次都要比第一种多出来2-3秒.what? why? 于是我想, 有没有可能是运行顺序的原因. 因此我将第二种放到前面运行, 结果也相应的颠倒了.因此, 得出结论. 多层遍历时, 相比于由大到小(外圈大, 内圈小), 由小到大要运行的快一些. 上一边子去, 这算哪门子结论.
2022-06-10 09:17:31 1004
原创 GO/testing包
前言之前在写GO单元测试的时候, 使用了这个结构testing.T. 进来无事翻了翻, 发现testing包中还有一些其他的结构体, 想来是不同用处. 没想到GO的testing包竟然默默做了这么多支持, 之前竟然不知道.在testing包中包含一下结构体:testing.T: 这就是我们平常使用的单元测试testing.F: 模糊测试, 可以自动生成测试用例testing.B: 基准测试. 对函数的运行时间进行统计.testing.M: 测试的钩子函数, 可预置测试前后的操作.testin
2022-05-28 10:11:35 637
原创 进程切换时是如何保存上下文的
前言当前操作系统大部分采用分时的进程调度, 既每个进程运行一小段时间, 然后切换到下一个进程运行, 依次往复.当进程运行的时候是独占CPU的, 此时操作系统是无法强行介入的, 为了将执行权让出来, 就需要硬件的配合了. 硬件每个一个时钟周期(比如10ms), 就会产生一个时钟中断, 而这个时钟中断会将执行权强行交给操作系统的调度进程, 然后由调度进程进行后续处理.以上, 就是我在第一遍看操作系统时留下的印象, 但有几个问题当时没有搞明白:如何保存进程的上下文? 在将进程暂停后, 为了之后再次运行,
2022-05-22 13:09:41 2498
原创 printf缓冲区踩坑
问题碰到了这样一段代码(经过简化的):#include "stdio.h"#include "unistd.h"#include "sys/wait.h"int main(){ fork(); printf("1\n"); fork(); printf("1\n"); wait(NULL); return 0;}这里我们简单算一下, 结果会打印几个1嘞?进程数: 2, line: 6进程数: 2, line: 7 打印数: 2进程数
2022-05-14 18:09:22 316
原创 shell重定向
前言在编写shell脚本的时候, 可能这种命令经常写: command > ./a.log. 这段很容易理解, 就是将command命令的输出写入到a.log文件中. 但有时还需要处理输入流 或者错误流.甚至于又时看到别人写的命令, 也有种看不懂的感觉, 比如 :command 1>&- 2>/dev/null &cat >1.txt<<EOF文件内容EOF在经历了一段时间的困惑后, 决定好好看看重定向的具体方式.介绍先来简单介绍在重
2022-05-09 16:36:57 2391
原创 自旋锁与互斥锁
前言在编程中经常需要使用到互斥. 互斥就是, 这个事情只能有一个人干, 我正在做着的时候, 别人要想做这件事就得等我做完了.互斥的实现是通过锁的机制, 也就是我把这块锁上了, 别人就进不来了, 等我做完再把锁释放掉.但是, 前辈们已经证明了, 要想单纯的在软件层面上实现锁的机制是很难的, 即使是简单的一条加1的操作, 在CPU执行时也需要如下几步:将变量从内存读到寄存器寄存器中的值加1将寄存器中的值写回内存而中间任何一步发生切换, 都可能导致锁机制的失败. 因此, 在软件层面的实现代价是很
2022-05-04 13:52:12 408
原创 常用搜索引擎及语法
在平常需要进行搜索的时候是不是只知道Google Baidu ?? 他们其实是全文搜索引擎, 还有一些特定领域的搜索引擎. 而且, 搜索时可以添加特定语法, 让你的搜索事半功倍.本文整理各种场景下使用的搜索引擎, 以及各个搜索引擎支持的语法, 不定期进行更新.如果你知道其他搜索引擎, 也欢迎在下方留言告诉我呦~汇总搜索引擎类型名称地址备注全文搜索引擎谷歌https://www.google.com/全文搜索引擎谷歌一家独大百度https://www.baidu
2022-04-22 10:47:12 589
原创 hbase/thrift/go连接失败
问题在通过Go连接hbase的过程中, 发现 get操作可以查到数据, 但是scanner命令访问数据失败, 也没有报错, 就是单纯的查不到数据. 而且Python PHP都一切正常.这里简单复述一下我出现问题的情况, 安装过程和网上大部分内容一致, 这里简单列一下, 只是为了查询问题时参考安装过程的差异:# 安装hbasewget -O /opt/hbase.tar.gz https://dlcdn.apache.org/hbase/2.4.11/hbase-2.4.11-bin.tar.gzt
2022-04-17 14:05:55 477
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人