Docker配置阿里云镜像后仍报错问题

Kubernetes需要使用docker作为运行时,在Linux机器上安装docker后,尝试拉取hello-world镜像时出现问题 安装docker时一切都很顺利: sudo apt update sudo apt install docker.io sudo systemctl start docker sudo systemctl enable docker 但在进行docker pull hello-world拉取镜像时报错: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceed ed while awaiting headers) 解决方法 首先需要更换docker源,这里使用阿里云镜像加速器与另一个自己收集的源。进入/etc/docker/daemon.json文件中如此配置: { "registry-mirrors": [ "https://ok5mwqnl.mirror.aliyuncs.com", "https://docker.1ms.run" ] } 配置完成后执行sudo systemctl restart docker重启docker服务 重启后运行docker pull hello-world仍失败,报错信息与先前一致 这时考虑DNS配置问题,进入/etc/resolv.conf文件,在原有的若干nameserver之上再增加两条: # Generated by NetworkManager nameserver 8.8.8.8 nameserver 8.8.4.4 # 此处为原有的若干行nameserver # ... 配置完成后运行docker pull hello-world,成功拉取镜像,执行sudo docker images查看本地镜像: ...

January 13, 2025

网安数基复习

中国剩余定理 设$m_1,m_2,\dots,m_k$两两互素,则方程组: $$ \begin{equation} \begin{cases} x\equiv a_1(\bmod\space m_1) \\ x\equiv a_2(\bmod\space m_2) \\ \dots \\ x\equiv a_k(\bmod\space m_k) \end{cases} \end{equation} $$有唯一解:$x\equiv M_1M_1^{-1}a_1+M_2M_2^{-1}a_2+\dots+M_kM_k^{-1}a_k(\bmod\space m)$ 其中,$m=m_1m_2\dots m_k$,$M_i=\frac m{m_i}$,$M_iM_i^{-1}\equiv 1(\bmod\space m_i)$ RSA密码算法 密钥生成 选择两个保密的大素数$p$、$q$ 取$n=p*q$,并计算$n$的欧拉函数值:$\varphi(n)=(p-1)*(q-1)$ 选择一个介于1与$\varphi(n)$之间的整数$e$,且满足$\gcd(\varphi(n),e)=1$,即与$\varphi(n)$互素 计算$e^{-1}(\bmod\space\varphi(n))$得到$d$ 将公钥设为$(e,n)$,私钥为$(d,n)$ 加密 $$ c\equiv m^e(\bmod\space n) $$解密 $$ m\equiv c^d(\bmod\space n) $$Rabin密码算法 密钥生成 固定了$e=2$,且p、q的阶需要相同 公钥为$n$,私钥为$(p,q)$ 加密 $$ c\equiv m^2(\bmod\space n) $$解密 相当于求解二次同余方程$x^2\equiv c\bmod n$,等价于求解$x^2\equiv c\bmod p$与$x^2\equiv c\bmod q$,即: $$ \begin{equation} \begin{cases} x\equiv \sqrt c\bmod p \\ x\equiv \sqrt c\bmod q \\ x\equiv -\sqrt c\bmod p \\ x\equiv -\sqrt c\bmod q \end{cases} \end{equation} $$求解后一共会产生四组解,逐个验证并选择有意义的一项作为明文即可 ...

January 1, 2025

复杂网络复习

随机网络和相关统计量 上课所指的是G(N, p)模型的生成 假设有N个节点,每次选中其中两个节点,然后生成一个0到1之间的随机数,如果这个随机数小于p,则在这两节点直接增加一个链接,否则不放置链接 统计量: 度:邻居数量 平均度:所有节点度的平均数 度分布:随机选取一个节点,其度值恰好为k的概率 路径 距离与网络直径:网络中的最大距离称为网络直径 介数:通过该节点的最短路径条数(或一个节点在网络中所有最短路径中出现的频率),条数越多,说明这个节点越重要 集聚系数:刻画某个节点相邻的两个节点彼此也相邻的概率 一个度为$k_i$的节点i的聚类系数$C_i$定义为$C_i=\frac{2E_i}{(k_i(k_i-1))}$,其中$E_i$是节点i的$k_i$个邻居节点之间实际存在的邻居对的数目 整个网络的集聚系数就是所有节点聚类系数的平均值,是一个0到1之间的值,越偏向0说明网络越松散,否则越集聚(每个节点都相连) 同配性:考察度值相近的节点是否倾向于互相连接 如果总体上度大的节点倾向于连接度大的节点(趋于和它近似的节点相连),那么就称网络的度正相关的,或称网络是同配的;如果总体上度大的节点倾向于连接度小的节点,那么就称网络的度负相关的,或者称网络是异配的 用同配系数来度量,-1为负相关(异配性),+1为正相关(同配性),0为不存在相关 邻接矩阵:描述一个网络拓扑结构 网络模型 无标度网络:是一种度分布(即对复杂网络中节点度数的总体描述)服从或者接近幂律分布(一个量是另一个量的幂次方)的复杂网络 BA无标度网络:首先,过去的网络没有考虑现实网络的增长特性(网络的规模是不断扩大的);其次,没有考虑现实网络的优先连接特征(新的节点更倾向于与那些具有较高度的“大”节点相连接),基于此提出BA无标度网络,其中包含了网络的增长和优先连接特点 增长:在网络中每次增加一个节点,这个节点与网络中的一部分原有节点连接(可以是全部原有,也可以仅仅是一部分) 优先连接:一个新节点与一个已经存在的节点相连接的概率与节点的度成正比 拷贝模型:主要是考虑到例如互联网中互相引用的静态网页,当新增一个网页,大概率是会与其他类型相似的静态网页引用相同的内容,此时就需要对网络结构进行拷贝复制 无标度性、高聚类系数、层次结构和模块化 每次增加一个新节点,对于这个新节点,选择一个母节点并复制其所有连接,最后再以一定概率删除一部分连接 复制模型更加自然地模拟了基于“模仿”的连接机制,而 BA 模型强调“富者愈富”的优先连接原则 配置模型:在复杂网络研究中用于生成具有特定度分布(但边的具体连接方式随机)的随机网络模型 度分布、随机连接、无偏结构(在给定度分布的条件下具有最大随机性) 给定一个网络度序列$\{k_1,k_2,\ldots,k_N\}$,然后为每一个独立的节点配置数量为$k_i$的半边,最后将所有的半边与另一节点的半边随机两两连接起来 可以生成任意指定的度分布,不要求是幂律的;是一种静态模型,只需要输入度序列,无需生长机制 仅能保证度的分布,但无法生成复杂结构;此外还可能会有自环和多重边的出现 隐藏参数模型:通过引入一些未直接观察到的“隐藏参数”来解释节点之间的连接概率,这些隐藏参数通常代表节点的某些潜在特性或属性,这些特性影响节点之间形成连接的可能性 灵活性、解释性、适用性 为每个节点分配一个或多个隐藏参数$\theta_i$,再定义一个连接概率函数(通常就是隐藏参数的函数)$P(i,j)=f(\theta_i,\theta_j)$,然后再根据这个连接概率函数在两个节点之间生成边 更关注节点的隐藏属性 选择合适的隐藏参数和连接函数可能较为复杂;计算和优化隐藏参数可能需要大量的计算资源 评价网络是否同配 同配是指网络中度数大的节点更倾向于与同样度数大的节点连接 全统计描述(Full Statistical Description) 使用 $e_{jk}$ 矩阵表示随机选择的边两端的节点分别具有度数 $j$ 和 $k$ 的概率 如果网络没有度相关性,$e_{jk}$ 应满足特定的公式:$e_{jk} = q_j q_k$,其中 $q_k$ 是具有度数 $k$ 的节点出现在边上的概率 也就是说,如果网络没有同配关系,那么理应有【左右两端节点概率】等于【左端节点概率】乘【右端节点概率】 偏离该预测的情况可以作为度相关性的标志,即同配 / 异配 ...

December 25, 2024

Vue+TailwindCSS实现输入框动效

实现目标: 静态属性:输入框位于页面顶端、居中,圆角,框体内部为白色,1/5屏幕宽度,无外边框、框体阴影,闪烁光标为蓝色 动态属性:鼠标悬停时框体微微变大;聚焦后出现蓝色外边框,宽度增长且仍保持居中,框体阴影变为蓝色 其他:聚焦输入框时,背景逐渐模糊,取消聚焦后恢复 静态设计 HTML中的<input>标签可以承担基本的输入功能,创建文件SearchItem.vue,接下来使用TailwindCSS对默认输入框标签的样式进行调整 对于输入框位置与默认宽度的要求,可以使用网格布局,每行5列,而输入框位于第三列,这一布局设定应当在上层的文件中,而非SearchItem文件,所以这里先不对其进行设置 圆角、无外边框、框体阴影和蓝色光标可以使用rounded-xl、outline-none、shadow-xl、caret-blue-500来实现 考虑到后续会添加样式切换的动效,需要再加上transition-all以保证样式更改过程是平滑的 动态设计 TailwindCSS中,鼠标悬停的样式只需要使用hover:即可;获取焦点时的样式只需要使用focus: 悬停时框体变大:hover:scale-105 为了使悬停 -> 聚焦之后框体大小保持稳定,同时设置focus:scale-105 聚焦后出现蓝色外边框:focus:border-2、border-blue-500 宽度增长且仍居中,可以将元素左移的同时将宽度增加与之相同的长度:focus:-translate-x-40、focus:w-[40rem] 框体阴影变为蓝色:focus:shadow-blue-300/50 另外,可以设置转化的时长,这里设置400ms:duration-[400ms] 至此,对输入框的样式设计完成: <template> <input placeholder="搜索" class="shadow-xl duration-[400ms] hover:scale-105 focus:-translate-x-40 focus:w-[40rem] focus:border-2 focus:shadow-blue-300/50 focus:scale-105 border-blue-500 px-5 py-3 rounded-xl w-full transition-all outline-none caret-blue-500" name="search" type="search" /> </template> 上层结构 在上层文件中引入SearchItem.vue,然后设置网格布局并使这一模板位于5列中的第三列: <script setup lang="ts"> import searchItem from "./components/SearchItem.vue"; </script> <template> <div> <div class="grid grid-cols-5 gap-4 mt-2"> <searchItem class="col-start-3" /> </div> </div> </template> 效果如下: 为了使输入框能够输入内容,需要将输入的文字绑定至Vue中: <script setup lang="ts"> import { ref } from "vue"; defineOptions({ name: "searchItem", }); const input = ref(""); </script> <template> <input placeholder="搜索" class="shadow-xl duration-[400ms] hover:scale-105 focus:-translate-x-40 focus:w-[40rem] focus:border-2 focus:shadow-blue-300/50 focus:scale-105 border-blue-500 px-5 py-3 rounded-xl w-full transition-all outline-none caret-blue-500" name="search" type="search" v-model="input" /> </template> 背景模糊 接下来添加背景模糊 ...

December 19, 2024

基于归并排序的逆序数统计

问题定义 给定一个长度为n的整数数组,计算数组中的逆序对的数量并返回 逆序对的定义如下:对于数组的第i个和第j个元素,如果满足i<j且a[i]>a[j],则其为一个逆序对;否则不是。 数据范围 1≤n≤100000,数组中的元素的取值范围 [1,1e9]。 示例:输入[2,3,4,5,6,1],输出5 解释:逆序对共5对,[2, 1], [3, 1], [4, 1], [5, 1], [6, 1] 本题暴力硬解的复杂度为$O(n^2)$,较为繁琐,于是考虑是否存在复杂度为$O(nlogn)$的算法 要求逆序数,就不能在寻找数对时未经相关处理就更改数组元素顺序打乱原有顺序,因此要找到一种在实施过程中能够在一定程度上保留元素顺序关系的算法。 设想一种很理想的情况:元素a与b满足逆序数的定义(即a>b且i<j),同时还已知有一批比a大的数,那么很容易推知这一批数都可以与b构成逆序数,其个数就等于这批数的个数 以上情况正好符合归并排序的过程,首先在这里复习一下归并排序的原理: 归并排序 归并排序先递归地两两划分数组,每轮递归中都将整个数组分为左右两个部分,然后在每一次左右划分完成后,为左右两个数组各设置一个指针i与j,比较大小并将小者放入一个临时数组中(这个临时数组的长度是本轮划分左右数组的总长),放入一边的指针前进一步,再继续比较。当某一边全部比较完后,将可能还未放完的另一边数组元素全部放入临时数组 代码可以是: class Solution { public int[] mergeSort(int[] nums, int l, int r) { // l=r证明已经划分到单个元素,返回的排序数组就是以这个单元素组成的数组 if (l == r) return new int[]{nums[l]}; int mid = (l + r) / 2; int[] leftNums = mergeSort(nums, l, mid); int[] rightNums = mergeSort(nums, mid+1, r); // 能执行到这里,说明左右划分都已完成,此时如果左右都是单元素数组[2][3],则这个栈会返回[2,3] // 此时如果左右都是多元素数组,那至少能保证这两个数组各自的内部是有序的 int[] tempNums = new int[leftNums.length + rightNums.length]; int i = 0, j = 0, m = 0; // i左j右,m是临时数组索引 while (i < leftNums.length && j < rightNums.length) tempNums[m++] = leftNums[i] < rightNums[j] ? leftNums[i++] : rightNums[j++]; // 接下来处理一边走完一边还没走完的情况,由于单边必定已经有序,所以直接顺序放入即可 while (i < leftNums.length) tempNums[m++] = leftNums[i++]; while (j < rightNums.length) tempNums[m++] = rightNums[j++]; return tempNums; } } 题解 回到本题,核心在于:在归并排序比较leftNums[i]与rightNums[j]的大小关系时,如果正好左大于右,(即满足逆序数的定义),则可以直接确定这两个数之间的数都满足逆序数的定义 ...

December 11, 2024