首页 文章 精选 留言 我的

精选列表

搜索[bug],共10000篇文章
优秀的个人博客,低调大师

夜莺监控发布 8.2 版本,修复了几个 Bug

变更记录 fix: MySQL 数据源告警,客户端连接问题 fix: 修复 Elasticsearch 告警规则的 "文档最小值" 字段名不生效问题 fix: 修复 SSO 登出功能,如有 SSO Logout 地址则跳转到该地址 fix: 批量修改告警规则的通知规则时数据错乱问题 refactor: 优化 Prometheus 告警规则导入逻辑 refactor: 新增和调整部分文案说明 这个版本没有新增 feature,所以不会引入新问题,同时做了一些老的 bugfix,所以建议升级。 夜莺简介 夜莺监控(Nightingale)是一款侧重告警的监控类开源项目。类似 Grafana 的数据源集成方式,夜莺也是对接多种既有的数据源,不过 Grafana 侧重在可视化,夜莺是侧重在告警引擎、告警事件的处理和分发。 夜莺监控项目,最初由滴滴开发和开源,并于 2022 年 5 月 11 日,捐赠予中国计算机学会开源发展委员会(CCF ODC),为 CCF ODC 成立后接受捐赠的第一个开源项目。 夜莺的工作逻辑 很多用户已经自行采集了指标、日志数据,此时就把存储库(VictoriaMetrics、ElasticSearch等)作为数据源接入夜莺,即可在夜莺里配置告警规则、通知规则,完成告警事件的生成和派发。

优秀的个人博客,低调大师

FreeBSD 13.2-RC6 发布,继续修复 Bug

FreeBSD 13.2-RC4 本来应该是 13.2 版本的最后一个候选版本,但随后又发布了附带修复程序 的13.2-RC5 ,将发布拖到 4 月。进入 4 月后,由于始终存在尚未解决和新出现的问题,FreeBSD 13.2 又发布了第六个候选版本, 发布了另一个修复程序。 FreeBSD 13.2-RC6 修复了在 AMD64 唤醒代码期间重新计算缓解措施的问题。这种缓解措施的重新计算可以解决某些笔记本电脑型号的挂起/恢复问题。 可以通过发布公告查看并下载FreeBSD 13.2-RC6 。 FreeBSD 13.2 包含非常多新内容,比如将 WireGuard 驱动程序重新引入其流行的开源安全 VPN 隧道的源代码树、默认情况下为 64 位可执行文件启用 ASLR(地址空间布局随机化)、Bhyve 管理程序增强功能、改进的 Intel Alder Lake 支持、Kdump支持解码 Linux 系统调用,以及一系列其他软件更新和对内核的其他改进。 此外,FreeBSD 14.0 预计将在 7 月中旬作为一项重大功能版本更新。

优秀的个人博客,低调大师

Containerd 的 Bug 导致容器被重建!如何避免?

作者简介 邓宇星,SUSE Rancher 中国区软件架构师,6 年云原生领域经验,参与Rancher 1.x 到 Rancher 2.x 版本迭代,目前负责 Rancher For openEuler(RFO)项目开发。 最近我们关注到一个关于containerd 运行时的issue,该问题在 containerd v1.6.9/v1.5.15 被引入。出现的问题是,当 containerd 重启后,在其中运行的 Pod 元数据中关于网络相关的数据(如 pod ip)丢失,核心原因在于部分数据没有落盘。 受影响的版本: v1.6.9 ~ v1.6.14,问题在 v1.6.15 版本中被修复。 v1.5.15 ~ v1.5.16,问题在 v1.5.17 版本中被修复。 通过以下步骤,可以快速重现该问题,并验证该问题的修复情况。 本文使用 rke2 为例进行演示,版本为 rke2 v1.24.9+rke2r1,该版本使用了 k3s-containerd v1.6.12-k3s1,受该 containerd 问题影响。 在 containerd 的默认行为中,重启 containerd 服务不会影响正在运行的业务容器,并在启动容器时,通过将容器父进程绑定 Pid 1 的方式进行体现。即使使用 systemctl 对服务进行重启,也不会影响到已经在运行的容器状态。 问题重现 # 配置rke2使用国内镜像仓库下载镜像 mkdir -p /etc/rancher/rke2 echo "system-default-registry: registry.cn-hangzhou.aliyuncs.com" > /etc/rancher/rke2/config.yaml # 使用命令安装 rke2,以下命令使用了我们在国内维护的 rke2 安装镜像脚本,会从aliyun OSS下载RKE2资源 curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/rke2/install.sh | INSTALL_RKE2_MIRROR=cn INSTALL_RKE2_VERSION=v1.24.9+rke2r1 sh - # [INFO] using v1.24.9-rke2r1 as release # [INFO] downloading checksums at https://rancher-mirror.rancher.cn/rke2/releases/download/v1.24.9-rke2r1/sha256sum-amd64.txt # [INFO] downloading tarball at https://rancher-mirror.rancher.cn/rke2/releases/download/v1.24.9-rke2r1/rke2.linux-amd64.tar.gz # [INFO] verifying tarball # [INFO] unpacking tarball file to /usr/local # 启动 rke2 服务,并等待服务启动成功 systemctl start rke2-server # 配置 rke2 相关的 PATH 路径以及 kube-config 路径 export KUBECONFIG=/etc/rancher/rke2/rke2.yaml export PATH=/var/lib/rancher/rke2/bin:$PATH # 使用 kubectl 查询当前集群状态 kubectl get po -A | grep rke2-metrics-server-5b987d776b-gqxv9 # kube-system rke2-metrics-server-5b987d776b-gqxv9 1/1 Running 0 15m 至此,rke2 单节点服务启动完成,但我们的目标是 containerd,接下来继续操作: # 配置 containerd 相关环境变量 export CRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/containerd/config.toml CONTAINER_RUNTIME_ENDPOINT=unix:///var/run/k3s/containerd/containerd.sock # 使用 crictl 查询pods以及container信息 crictl pods | grep rke2-metrics-server # bfad445917423 18 minutes ago Ready rke2-metrics-server-5b987d776b-gqxv9 kube-system 0 (default) crictl ps | grep rke2-metrics-server # db5d6392a310e f6dc23a68f5fb 18 minutes ago Running metrics-server 0 bfad445917423 rke2-metrics-server-5b987d776b-gqxv9 我们以 metrics-server 的 pod 为例,查询 pod 详情中的网络部分内容,并对 containerd 进行重启,对问题进行重现: # 查询 metrics-server pod的详情 crictl inspectp bfad445917423 | jq .status.network # { # "additionalIps": [], # "ip": "10.42.0.6" # } # 停止rke2-server服务并单独启动containerd,避免kubelet影响重现结果 systemctl stop rke2-server # 单独启动 containerd containerd -c /var/lib/rancher/rke2/agent/etc/containerd/config.toml -a /run/k3s/containerd/containerd.sock --state /run/k3s/containerd --root /var/lib/rancher/rke2/agent/containerd 通过新的 terminal,使用 crictl 查询 containerd 运行状态 crictl pods | grep rke2-metrics-server # bfad445917423 24 minutes ago Ready rke2-metrics-server-5b987d776b-gqxv9 kube-system 0 (default) # 再次查询metrics-server pod详情 crictl inspectp bfad445917423 | jq .status.network # { # "additionalIps": [], # "ip": "" # } 从最后的返回结果可以看出,containerd 重启后容器的 IP 丢失。 问题影响 通过在上述例子中重启 rke2-server 可以看到,由于 ip 信息丢失,导致了业务容器被重建,带来了业务中断的风险。 # 在中断 containerd进程后,重启rke2-server进程(以下数据为重新验证后的数据) systemctl restart rke2-server kubectl get po -A |grep rke2-metrics-server-5b987d776b-8vg69 # kube-system rke2-metrics-server-5b987d776b-8vg69 1/1 Running 2 (115s ago) 23m crictl pods | grep rke2-metrics-server # caba6d8d15823 41 seconds ago Ready rke2-metrics-server-5b987d776b-8vg69 kube-system 1 (default) # 2dec6a11fd36f 22 minutes ago NotReady rke2-metrics-server-5b987d776b-8vg69 kube-system 0 (default) 可以看到,在 rke2-server 重启后,使用了 cni 的 pod 发生了重启,在 crictl pods 返回中可以看到重新创建的 pods。 问题修复验证 下载新版本 containerd,这次验证使用 k3s-containerd v1.6.14+k3s1。该版本为 Rancher 在 containerd v1.6.15 发布前紧急发布的修复补丁版本。 # 拉取新镜像 docker pull rancher/hardened-containerd:v1.6.14-k3s1-build20230105 mkdir container-new cd container-new # 从镜像中获取新版本containerd docker run --rm -it -v ${PWD}:/output rancher/hardened-containerd:v1.6.14-k3s1-build20230105 cp -r /usr/local/bin /output ./output/bin/containerd --version # containerd github.com/k3s-io/containerd v1.6.14-k3s1 6f9c63d571f5026e85a0768f0f2ef03d1c8dbc6e # 关闭当前运行的容器 pkill -f /var/lib/rancher/rke2/data/v1.24.9-rke2r1-d4d8faf800d0/bin/containerd-shim-runc-v2 # 替换containerd binary版本 cp ./bin/* /var/lib/rancher/rke2/bin /var/lib/rancher/rke2/bin/containerd --version # containerd github.com/k3s-io/containerd v1.6.14-k3s1 6f9c63d571f5026e85a0768f0f2ef03d1c8dbc6e # 启动 rke2 systemctl start rke2-server # 此时使用 crictl 查询新的 metrics-server pod crictl pods | grep " Ready" |grep metrics-server # ad8b101f819df 3 minutes ago Ready rke2-metrics-server-5b987d776b-gqxv9 kube-system 1 (default) # 停止 rke2 并使用命令行启动 containerd systemctl stop rke2-server containerd -c /var/lib/rancher/rke2/agent/etc/containerd/config.toml -a /run/k3s/containerd/containerd.sock --state /run/k3s/containerd --root /var/lib/rancher/rke2/agent/containerd 通过新的 terminal,使用 crictl 查询 containerd 运行状态 crictl inspectp ad8b101f819df | jq .status.network # { # "additionalIps": [], # "ip": "10.42.0.13" # } 可以看到 containerd 重启后,pod ip 没有丢失。 RKE2 与 RFO RKE2 以下版本受该 issue 影响: v1.23.15+rke2r1 v1.24.9+rke2r1 v1.25.5+rke2r1 v1.26.0+rke2r1 该 issue 在 2022 年 12 月 20 日被提交,RKE2 团队在 2023 年 1 月 6 日紧急合并了 containerd 中修复该 issue 的 commit,发布了 k3s-containerd v1.6.14+k3s1 版本,并发布了新的 rke2 rc 版本进行测试验证。 最终在 1 月 11 日,RKE2 团队发布以下已经修复 containerd 问题的版本: v1.23.16+rke2r1 v1.24.9+rke2r2 v1.25.5+rke2r2 v1.26.0+rke2r2 RFO 是 Rancher For openEuler 的缩写,顾名思义,目的在于面向 openEuler 打造 Rancher 基础平台。 由于 RFO 版本发布周期在 RKE2 之后,RFO 并没有受到该 issue 影响,并在近期发布了以下版本: v1.23.16+rfor1 v1.24.9+rfor1 v1.24.10+rfor1 v1.25.5+rfor1 v1.25.6+rfor1 v1.26.0+rfor1 v1.26.1+rfor1 写在最后 由于操作系统的软件包发布存在一定的时间延后性,在大部分情况下都无法及时修复软件出现的问题。像 CVE、功能缺陷等问题都比较紧急,等待操作系统供应商提供修复版本将是一个漫长的过程,甚至有时候由于一些限制,操作系统提供商无法提供新版本的软件包,这会给系统运行带来不确定因素。 在这种情况下,将软件自身依赖的组件打包到自己的 rootfs 中进行分发,能更好地对其进行管理和升级,避免给系统运行带来风险以及潜在的损失。 关于 RFO 的项目说明和部署使用,请点击《Rancher RFO 正式 GA》。

优秀的个人博客,低调大师

OpenZFS 2.1.8 发布,兼容 Linux 6.1~6.2、修复 bug

OpenZFS 2.1.8 已发布,这是开源 ZFS 文件系统实现的最新版本,与现代 Linux 和 FreeBSD 系统兼容。 虽然备受期待的 OpenZFS 3.0 还没有像最初希望的那样在 2022 年实现,但 OpenZFS 2.x通过修复和其他更新来继续完善这个开源 ZFS 文件系统实现,目前正在日渐成熟。 随着 OpenZFS 2.1.8 的发布,现在已经正式兼容到 Linux 6.1 稳定内核系列。除了针对 Linux 6.1 的兼容性修复,还包含针对 Linux 6.2 兼容性的改进,但还不清楚最终是否能在 2 月发布的 Linux 6.2 稳定版上工作,因为未来仍有可能出现问题。 除了兼容 Linux 6.1 内核,v2.1.8 版本还为这个开源 ZFS 文件系统实现增加了对 zfs diff 彩色输出的支持、对 FreeBSD 的修复、修复文档,以及其他一些常规修复。 详情查看 Release Notes。

优秀的个人博客,低调大师

Visual Studio Code 1.67.2 已发布,修复若干 Bug

Visual Studio Code 1.67.2 更新已发布,该小版本修复了以下问题: 部分终端启动配置参数被双重转义 #149283 build[macos]: 上传用于 Bing 设置搜索的配置时超时 #149089 1.67 版本中,禁用的工具栏图标不会变暗 #149075 启动快捷方式的选择指示器不会自动清理 #148893 1.67 版本中,调试器的 STDIN/STDOUT 重定向不起作用 #148887 2022 年 4 月 - Recovery 2 #148935 详情可查看 Issue Page 。

优秀的个人博客,低调大师

GCC 11.3 发布,修复了近 200 个 bug

GCC 11.3 现已发布,这是 GCC 11 分支的错误修复版本,距离上一个版本GCC 11.2 发布隔了近 9个月的时间。此版本包含了对 GCC 11.2 中回归和严重错误的重要修复,自上一个版本以来修复了超过 189个 错误。GCC 12(GCC 12.1 稳定版)计划在未来几周内发布。 根据介绍,GCC 11.3 中包含了针对各种 Darwin/macOS 问题的修复、许多 C++ 和 libstdc++ 修复、许多 RISC-V 修复;并且确实向后移植了IBM z16 的官方检测,其中的 GCC 11 代码到目前为止已经被确定为"arc14"。 更多详情可查看官方公告。

优秀的个人博客,低调大师

上手 WebRTC DTLS 遇到很多 BUG?浅谈 DTLS Fragment

上一篇《详解 WebRTC 传输安全机制:一文读懂 DTLS 协议》详细阐述了 DTLS。本文将结合 DTLS 开发中遇到的问题,详细解读 DTLS 的一些基础概念以及 Fragment 的机制,并进一步深究 DTLS 协议。 作者|泰一 审校|进学、莫战 前言 最近在做 J 和 G 这两套 RTC 系统的 DTLS-SRTP 握手加密工作,要求使用 CA 机构颁发的证书。在本机调试的过程中发现:G 系统使用 CA 证书,DTLS 握手成功,而 J 系统则握手失败。 经过几番调试与分析,定位到了原因:J 系统相较于 G 系统多了一个 TURN 转发模块,该模块设置的接收缓冲区的上限值为 1600 字节,而 CA 证书的大小则有近 3000 字节,因此 TURN 模块转发给客户端的证书不完整,导致 DTLS 握手失败。 大家都知道, WebRTC 的 DTLS 使用的是自签名的证书,这个证书一般不会太大,如下图所示,只有 286 字节。 然而,如果要使用 CA 颁发的证书,那么这个证书可能会很大,如下图所示,竟达到了 2772 字节,显然超出了 TURN 模块的接收缓冲区的大小。 上图中,你可能注意到了这个 CA 证书被分成了两片(two fragments),这其实是 DTLS 协议层做的。不过值得思考的是,CA 证书的每一片的大小都未超出 TURN 模块接收缓冲区的 1600 字节的限制,但是为什么 J 系统的 TURN 转发模块依然会接收失败呢? 这是因为证书虽然被分片,但是在发送到 TURN 模块时并没有按照分片独立发送,仍然是全部打包到了同一个 UDP 数据报中进行发送,所以接收肯定会失败。 下面,我们将一起了解下 DTLS Fragment 的机制。首先要理清几个概念。 Message、Record、Flight DTLS 协议分为两层:底层的 record protocol 和上层的 handshake protocol、change cipher spec protocol、alert protocol 以及 application data protocol。 Remark:握手协议、密码规格变更协议、警告协议、应用数据协议均在 DTLS 记录协议的上层,这四种协议统称为 DTLS 握手协议。 Note:关于记录和握手这两层协议各自的作用,这里就不再赘述,可以参考 WebRTC 中 DTLS 的应用。 DTLS Message 是一条完整的 DTLS 消息。比如握手消息:Client Hello、Certificate、Client Key Exchange 等;比如密码规格变更消息:Change Cipher Spec。 DTLS Record 是记录层(Record Layer)的概念,可以认为它是一个壳子,里面装载着 DTLS Message,如下图: Message 和 Record 是一对一或者一对多的关系。也就是说,一个 Record 不一定装了一条完整的 Message。因为有可能是多个 Record 组成一个完整的 Message。 如果 Message 很小,未超过 MTU 的限制,那么一个 Record 足以装下一条 Message;如果 Message 很大,超过 MTU 的限制,那么就需要多个 Record 来装这条 Message。即这条 DTLS Message 会被分割为多个 Fragment,然后分别装入多个 Record。 Remark:最大传输单元(Maximum transmission Unit, MTU)是数据链路层的概念,MTU 限制的是数据链路层的 payload 大小,也就是其上层协议的大小,比如 IP、ICMP。在以太网中,链路层的 MTU 是 1500 字节。 比如,Certificate 这个握手消息,证书大小很容易就超过 MTU 的限制,那么这个消息就会被分割为多个 Fragment 并被分别存放到多个 DTLS Record,每个 Fragment 的大小要保证不超过 MTU 的限制(PS:导读的第二张图就是一个实际的例子)。 Flight 中文解释为 “航班” 或者 “航程”,是一个或者一组打包好的 Message,这组 Message 属于同一个 “航程”,视为一个整体,通过单个 UDP 数据报发送。 如上图所示,本次 DTLS 握手一共有 4 个 Flight。Flight2 是 Server Hello、Certificate、Server Hello Done 这三条 Message 的组合,其中 Certificate 这条 Message 被分割为两个 Fragment,装到两个 Record 中。Flight2 通过大小为 2969 字节的 UDP 数据报发送出去。 Remark:Flight2 这个 2969 字节的 UDP 包是在本机环境下调试、抓包得到的,并不代表 MTU 有这么大,在实际的网络中,不会出现这种远超 MTU 限制的数据包。 到这里,关于 Message、Record、Flight 的概念就讲完了,三者之间的关如下图: Fragment 下面我们谈谈,DTLS 为什么要对 DTLS Message 做分片。 我们知道,受以太网 MTU 影响,UDP 数据报最大为 1500 字节,超出这个限制就会被 IP 层分片(PS:以太网 MTU 设置为 1500 字节是为了最大化信道传输利用率)。 但是如果 IP 层分片机制被禁止呢?这就会导致大于 1500 字节的 UDP 数据报在 IP 层被丢弃。因此,DTLS 要对消息做分片,来满足 IP 层对报文大小的要求。DTLS1.2: Message Size 这一节解释了这个原因。 By contrast, UDP datagrams are often limited to < 1500 bytes if IP fragmentation is not desired. In order to compensate for this limitation, each DTLS handshake message may be fragmented over several DTLS records, each of which is intended to fit in a single IP datagram. 因此,DTLS 的分片机制很简单:在发送时把 DTLS Message 分割成多个连续的 DTLS Record,在接收时缓存分片,直到拥有完整的 DTLS Message。 我们可以使用 OpenSSL 的这两个 API 设置 MTU 的大小: SSL_set_options(dtls, SSL_OP_NO_QUERY_MTU); SSL_set_mtu(dtls, 1500); 上面的代码设置了 MTU 为 1500,那么当 DTLS Message 大小超过 1500 字节,就会触发 DTLS 的分片机制,同理,如果设置 MTU 为 300,那么当 DTLS Message 大小超过 300 字节,就会分片。如果不进行设置,那么 MTU 会走默认值,如下图所示,证书消息被分割成了若干个大小为 288 字节的固定的 Fragment。 Remark:TLS 底层是 TCP 协议,为字节流式传输,因此 TLS 没有消息分片机制。 我们还可使用下面的 API 设置 Fragment 的大小的上限: SSL_set_max_send_fragment(dtls, 1500); 最后,我们回到导读描述的问题:证书消息实际上确实被分割为两片并分别存储到两个 Record,但是由于在发送的时候还是打包到了一个 UDP 数据报,因此,过大的 UDP 数据报导致 TURN 模块并未接收完整。 更详细的原因是:我们使用的是内存型的 BIO,在应用层调用 BIO_get_mem_data 得到的是关于 DTLS Message 的一块连续的内存(虽然这块内存中的证书消息已经被 DTLS 切成两个连续的 Fragment 并存在两个 Record 中),而应用层在获取到这块内存后就直接通过 sendto 函数发送给了对端,因此,这个 UDP 报文当然还是特别大,导致接收失败。 回过头来再看下导读中证书消息分片的这张图,两个 Record 的 message sequence 字段值相同,说明这是同一个 DTLS Message 的两个 Fragment。且每个 Record 都有 fragment offset 和 fragment length 这两个字段,用来标识分片的边界。所以,我们可以根据这两个字段去解析出每一个独立的 Fragment。 当然,根据 Record 头部的 Length 字段足以确定边界,这会使应用层的解析更加方便。所以,要解决这个问题,应用层要做的是:对从 BIO 获取到的这块消息内存进行解析,得到每个 Record 的边界,然后将每个 Record 以独立的 UDP 报文发送出去。具体的解析代码这里就不贴出来了,非常简单。 最后,在实践中发现,DTLS Record 不能跨 UDP 数据报发送,DTLS 1.2: Transport Layer Mapping 这一节也交代了这一点。也就是说,应用层要严格的按照 Record 的边界解析出每一个 Record,分别通过独立的 UDP 数据报发送,而不能按照自己的意愿随意划分为若干个 UDP 数据报发送。因为这可能会导致某个 DTLS Record 被切分到多个 UDP 数据报发送,从而导致接收端 DTLS 无法将收到的 DTLS Records 重组为完整的 DTLS Message。 下图是 DTLS 分片独立发送后的效果: 有兴趣的读者可以参考我写的 DTLS demo,它实现了简单的 DTLS 握手和分片独立发送。也可以参考 开源视频服务器 SRS 的 DTLS 实现,更加简洁和详尽。 总结 对于超过 MTU 限制的 DTLS Message,DTLS 会把它分割为多个 Fragment, 并分别存储到各个 DTLS Record 中,因此一个 Fragment 一定是一个 DTLS Record。对于未超过 MTU 限制的 DTLS Message,则不会被分片,也是存储到 DTLS Record 中,因此一个 DTLS Record 不一定是一个 Fragment,也有可能是一个完整的 DTLS Message。另外,MTU 的大小以及 Fragment 的最大值都可以使用 OpenSSL 的 API 进行设置。 由于我们通过内存型 BIO 获取到了存储了各个 DTLS Message 的这块连续内存后,直接将其打包为 Flight,并通过单独的 UDP 数据报文发送,因此这个 UDP 包仍然还是那么大,超出了 TURN 模块接收缓冲区的上限和 MTU 的限制。所以为了做到真正的分片独立发送,需要应用层自己去做 Fragment 的解析(其实就是解析 Record 的边界),并分别通过独立的 UDP 报文发送。 我们在解决了一个问题后,还要再问一下自己有没有引入新的问题。 独立发送每个 DTLS Record,虽然解决了 DTLS Message 超过 MTU 限制的问题,但是这也增加了 UDP 报文的数量,因此丢包的概率也会相应的增加,DTLS 重传次数增加,握手的成功率降低。解决这个问题的一个方法是:不必每个 DTLS Record 都单独 UDP 发送,可以多个 DTLS Record 发送,只要能保证它们加起来的大小不超过 MTU 的限制就可以。 同时,我们也要问一下自己有没有更好的方法。 比如目前的解决方法是应用层自己实现 Record 解析并独立发送,那么 OpenSSL 是否已经有相关的 API 实现类似的功能,再比如 BIO 有没有相关的 API 可以告诉我们读取的内存数据中 Record 的数量以及每个 Record 的边界?这个问题,以后有时间再调研吧。 感谢阅读。 参考 DTLS 1.2 TLS 1.2 「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。公众号后台回复【技术】可加入阿里云视频云技术交流群,和作者一起探讨音视频技术,获取更多行业最新信息。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册