TiDB 数据库8.1版本编译及部署
本文介绍 TiDB 数据库8.1版本的编译和部署。
背景
自前年(2023年)接触了TiDB后,做了简单的测试就直接使用了。因一些事务的不连续性,导致部分成果没有保存,去年年底又重新拾起,使用了新的LTS版本(8.1.0),同时编译了x86、arm、loongarch三大版本。
TiDB新版本说明
下面是从官方文档摘录的内容:
TiDB 高度兼容 MySQL 协议,以及 MySQL 5.7 和 MySQL 8.0 常用的功能及语法。MySQL 生态中的系统工具(PHPMyAdmin、Navicat、MySQL Workbench、DBeaver 和其他工具)、客户端等均适用于 TiDB。
但 TiDB 尚未支持一些 MySQL 功能,可能的原因如下:
有更好的解决方案,例如 JSON 取代 XML 函数。
目前对这些功能的需求度不高,例如存储过程和函数。
一些功能在分布式系统上的实现难度较大。
下载
下载地址:https://github.com/pingcap/tidb/releases 。
本文选用了新的LTS版本,下载文件为:tidb-8.1.0.tar.gz,2024.5.24发布。(注:因测试原因,又下载了tidb-8.1.1.tar.gz,该版本在2024.8.27发布)
该版本的功能概览文档:https://docs.pingcap.com/zh/tidb/v8.1/basic-features/
环境
TiDB使用go语言编写,8.1.0版本要求golang 1.21及以上,经过查阅源码,新版本源码使用了slices
、maps
、cmp
等标准库。
编译
编译压缩包,进入源码目录,先下载go依赖库:
go mod vendor
再进行编译:
make server
编译输出:
fatal: not a git repository (or any parent up to mount point /)CGO_ENABLED=1 GO111MODULE=on go build -tags codes -ldflags '-X "github.com/pingcap/tidb/pkg/parser/mysql.TiDBReleaseVersion=" -X "github.com/pingcap/tidb/pkg/util/versioninfo.TiDBBuildTS=2024-11-29 06:45:27" -X "github.com/pingcap/tidb/pkg/util/versioninfo.TiDBGitHash=" -X "github.com/pingcap/tidb/pkg/util/versioninfo.TiDBGitBranch=" -X "github.com/pingcap/tidb/pkg/util/versioninfo.TiDBEdition=Community" ' -o bin/tidb-server ./cmd/tidb-servergo: downloading golang.org/x/oauth2 v0.18.0
...
不管何种平台,编译版本要求和命令都是一样的。在实际操作中,笔者使用了qemu技术编译了arm、loong64平台。两个平台的编译较耗时,一台普通且有其它程序运行的服务器上进行编译,花费近1个钟头。
需要在此处提出的是,编译龙芯架构版本时出现了错误,详见附录说明。
运行
配置参考官方文件:
https://github.com/pingcap/tidb-docker-compose/blob/master/config/tidb.toml
就测试而言,直接运行程序即可:
./tidb-server
使用指定配置文件的运行方法:
./bin/tidb-server --config tidb.toml
测试
使用mysql连接查看数据库。
尝试不指定用户连接:
$ mysql -h 127.0.0.1 -P 4000
ERROR 1045 (28000): Access denied for user 'toll'@'127.0.0.1' (using password: NO)
提示出错,添加root
用户:
$ mysql -h 127.0.0.1 -P 4000 -u root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 2097160
Server version: 8.0.11-TiDB- TiDB Server (Apache License 2.0) Community Edition, MySQL 8.0 compatible
root用户默认是没有密码的。从上面信息可以看到已经成功连接了。不过,显示的版本号有点奇怪。MySQL的兼容版本已经改为了8.0版本了(通过阅读源码确认)。
根据以往经验,在配置文件中修改了版本号信息,再次连接,显示信息如下:
$ mysql -h 127.0.0.1 -P 4000 -u root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 2097154
Server version: 8.1.0 TiDB Server (Apache License 2.0) 8.1.0 Edition, MySQL 8.0 compatible
创建用户,修改root密码,操作如下:
mysql -h 127.0.0.1 -P 4000 -u root
use mysql;# 创建latelee用户
CREATE USER 'latelee'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'latelee'@'%' WITH GRANT OPTION;# 修改root密码
ALTER USER 'root' IDENTIFIED BY '123456';
小结
本次实践,分别编译了三大平台的TiDB,解决编译错误花了一些时间,如通过查看go发行版本确认TiDB使用的新的标准库。当然,也顺道学习了些其它的知识。从初步测试情况下,是正常,后续需要进一步系统地根据业务来测试。以便更全面了解TiDB。不过,TiDB版本迭代非常快,限于精力,可能会隔较长时间再回到这上面。
特殊说明:
本文使用loong64称呼龙芯架构,一是较简洁,二是golang语言使用该字符串作为龙架构的名称。实际上,笔者对不同平台的程序命名均以简洁有易于区分为原则。如arm平台,直接用arm即可,不使用arm64或aarch64。像龙芯平台,是使用loong,而不是loongarch64这种,笔者无意参加新世界、旧世界的纠缠中,以自己适用为目的。不同场景采用方式不同,如在编码中,则按各语言既定的规则来。如要在同一目录分出不同平台,则会用x86_64和arm这种较明显的名称(而不是amd64和arm64)。
附
在编译过程中,均需升级golang,解决版本问题。在x86和arm平台编译很顺利,主要问题集中在龙芯平台。本次编译所遇问题如下。
golang版本问题
golang版本最低为1.21。如果使用较低版本golang编译,会报如下错误:
pkg/types/compare.go:18:2: cannot find package "." in:/tmp/tidb-8.1.0-vendor/vendor/cmp
vendor/github.com/tikv/client-go/v2/internal/locate/region_request.go:40:2: cannot find package "." in:/tmp/tidb-8.1.0-vendor/vendor/maps
vendor/github.com/prometheus/common/model/labelset.go:20:2: cannot find package "." in:/tmp/tidb-8.1.0-vendor/vendor/slices
make: *** [server] 错误 1
分析:TiDB8.1.0版本引入了cmp等标准库,更新版本即可。
loong64平编译出现未定义变量
编译错误信息如下:
# github.com/cockroachdb/pebble/internal/rawalloc
vendor/github.com/cockroachdb/pebble/internal/rawalloc/rawalloc.go:23:12: undefined array length maxArrayLen or missing type constraint
# github.com/cockroachdb/pebble/internal/manual
vendor/github.com/cockroachdb/pebble/internal/manual/manual.go:48:12: undefined array length MaxArrayLen or missing type constraint
分析:在tidb8.1.0版本发布几天后,pebble库添加了loong64的定义,见issue:https://github.com/cockroachdb/pebble/issues/3630 。本文用的版本不支持,因此,要手动添加。如下:
vim vendor/github.com/cockroachdb/pebble/internal/rawalloc/rawalloc_64bit.go
添加loong64:
//go:build amd64 || arm64 || arm64be || ppc64 || ppc64le || mips64 || mips64le || s390x || sparc64 || loong64
// +build amd64 arm64 arm64be ppc64 ppc64le mips64 mips64le s390x sparc64 loong64vim vendor/github.com/cockroachdb/pebble/internal/manual/manual_64bit.go
添加loong64:
//go:build amd64 || arm64 || arm64be || ppc64 || ppc64le || mips64 || mips64le || s390x || sparc64 || loong64
// +build amd64 arm64 arm64be ppc64 ppc64le mips64 mips64le s390x sparc64 loong64
loong64平台编译出现runtime.buildVersion未定义
编译错误信息如下:
# github.com/pingcap/tidb/cmd/tidb-server
link: github.com/pingcap/tidb/pkg/util/printer: invalid reference to runtime.buildVersion
make: *** [Makefile:201: server] Error 1
分析:在printer.go文件会输出构建版本号,使用runtime.buildVersion
实现。关键代码如下:
//go:linkname buildVersion runtime.buildVersion
var buildVersion string
但是,在龙芯平台无法用go:linkname
,该问题已有相关issue:https://github.com/pingcap/tidb/issues/53618 。本次参考https://github.com/pingcap/tidb/pull/53619/files 修改,涉及文件为pkg/util/printer/printer.go
。如下:
引入包
删除L21、L22_ "runtime" // import link package_ "unsafe" // required by go:linkname
添加
"runtime"代码:
删除最后2行
//go:linkname buildVersion runtime.buildVersion
var buildVersion string在约L30处添加:
var buildVersion stringfunc init() {buildVersion = runtime.Version()
}
注:按TiDB的说法,在发布的8.1.1版本中已经fix了,但笔者下载该版本,检查再三,发现的确没有,因而手动改之。
笔者没用过linkname
,看帖子,这个特性不建议广泛使用,可以看看大牛级别Russ Cox的提案: https://github.com/golang/go/issues/67401,笔者不是布道者,因此仅作为兴趣稍作了解。
相关文章:
TiDB 数据库8.1版本编译及部署
本文介绍 TiDB 数据库8.1版本的编译和部署。 背景 自前年(2023年)接触了TiDB后,做了简单的测试就直接使用了。因一些事务的不连续性,导致部分成果没有保存,去年年底又重新拾起,使用了新的LTS版本ÿ…...
基于 docker 的 Xinference 全流程部署指南
Xorbits Inference (Xinference) 是一个开源平台,用于简化各种 AI 模型的运行和集成。借助 Xinference,您可以使用任何开源 LLM、嵌入模型和多模态模型在云端或本地环境中运行推理,并创建强大的 AI 应用。 一、下载代码 请在控制台下面执行…...
【2022】【论文笔记】基于相变材料的光学激活的、用于THz光束操作的编码超表面——
前言 类型 太赫兹 + 超表面 太赫兹 + 超表面 太赫兹+超表面 期刊 A D V A N C E D O P T I C A L M A T E R I A L S ADVANCED \; OPTICAL \; MATERIALS...
MySQL系统库汇总
目录 简介 performance_schema 作用 分类 简单配置与使用 查看最近执行失败的SQL语句 查看最近的事务执行信息 sys系统库 作用 使用 查看慢SQL语句慢在哪 information_schema 作用 分类 应用 查看索引列的信息 mysql系统库 权限系统表 统计信息表 日志记录…...
【Kafka基础】Docker Compose快速部署Kafka单机环境
1 准备工作 1.1 安装Docker和Docker Compose Docker安装请参考: Docker入门指南:1分钟搞定安装 常用命令,轻松入门容器化!-CSDN博客 Docker Compose安装请参考: 【docker compose入门指南】安装与常用命令参数全解析…...
【51单片机】2-5【I/O口】433无线收发模块控制继电器
1.硬件 51最小系统继电器模块433无线收发模块 2.软件 #include "reg52.h"sbit D0_ON P1^2;//433无线收发模块的按键A sbit D1_OFF P1^3;//433无线收发模块的按键Bsbit switcher P1^1;//继电器void main() {//查询方式哪个按键被按下while(1){if(D0_ON 1)//收到…...
平台总线---深入分析
阅读引言:本文会从平台总线的介绍,注册平台设备和驱动, 源码分析, 总结五个部分展开, 源码分析platform放在了最后面。 目录 一、平台总线介绍 二、平台总线如何使用 三、平台总线是如何工作的 四、注册platform设…...
pyTorch框架:模型的子类写法--改进版二分类问题
目录 1.导包 2.加载数据 3.数据的特征工程 4.pytorch中最常用的一种创建模型的方式--子类写法 1.导包 import torch import pandas as pd import numpy as np import matplotlib.pyplot as plt2.加载数据 data pd.read_csv(./dataset/HR.csv)data.head() #查看数据的前…...
【python中级】解压whl文件内容
【python中级】解压whl文件内容 1.背景2.解压1.背景 【python中级】关于whl文件的说明 https://blog.csdn.net/jn10010537/article/details/146979236 补充以上博客: 在 旧版 setuptools 中(< v58),如果想生成 .whl,必须先pip install 安装 wheel 三方包! pip inst…...
【USRP】srsRAN 开源 4G 软件无线电套件
srsRAN 是SRS开发的开源 4G 软件无线电套件。 srsRAN套件包括: srsUE - 具有原型 5G 功能的全栈 SDR 4G UE 应用程序srsENB - 全栈 SDR 4G eNodeB 应用程序srsEPC——具有 MME、HSS 和 S/P-GW 的轻量级 4G 核心网络实现 安装系统 Ubuntu 20.04 USRP B210 sudo …...
LeetCode算法题(Go语言实现)_30
题目 给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。 请注意,偶数组和奇数组内…...
生信入门:专栏概要与内容目录
文章目录 生信入门📚 核心内容模块基础概念入门序列联配算法高级算法与应用理论基础与数学方法基因组分析 生信入门 🔥 专栏简介 | 生信算法与实践指南 开启生物信息学的学习之旅 🌟 为什么订阅本专栏? 循序渐进:从生…...
Matplotlib:数据可视化的艺术与科学
引言:让数据开口说话 在数据分析与机器学习领域,可视化是理解数据的重要桥梁。Matplotlib 作为 Python 最流行的绘图库,提供了从简单折线图到复杂 3D 图表的完整解决方案。本文将通过实际案例,带您从基础绘图到高级定制全面掌握 …...
线程共享数据所带来的安全性问题
笔记 import threading from threading import Thread import time tickte50 # 代表的是50张票def sale_ticket():global tickte# 每个排队窗口假设有100人for i in range(100): # 每个线程要执行100次循环if tickte>0:print(f{threading.current_thread().name}正在出售第…...
Redis核心机制-缓存、分布式锁
目录 缓存 缓存更新策略 定期生成 实时生成 缓存问题 缓存预热(Cache preheating) 缓存穿透(Cache penetration) 缓存雪崩(Cache avalanche) 缓存击穿(Cache breakdown) 分…...
Node.js中间件的5个注意事项
目录 1. 目录结构 2. 代码实现 注意事项 1:必须调用 next() 注意事项 2:中间件的执行顺序很重要 注意事项 3:局部中间件的使用 注意事项 4:统一处理 404 注意事项 5:使用错误处理中间件 3. 总结 在Node.js的Ex…...
软件学报 2024年 区块链论文 录用汇总 附pdf下载
Year:2024 1 Title: 带有预验证机制的区块链动态共识算法 Authors: Key words: 区块链;混合共识;预验证机制;动态共识;委员会腐败 Abstract: 委员会共识和混合共识通过选举委员会来代替全网节点完成区块验证, 可有效加快共识速度, 提高吞吐量, 但恶意攻击和收…...
从开发到上线:基于 Linux 云服务器的前后端分离项目部署实践(Vue + Node.js)
明白了,这次我们完全聚焦技术内容本身,不带明显广告语言,不插入链接,只在文末一个不显眼的地方轻描淡写提到“服务器用的是 zovps.com 的一台基础云主机”,整体文章保证原创、高质量、易审核、易分发,长度控…...
FastAPI-Cache2: 高效Python缓存库
FastAPI-Cache2是一个强大而灵活的Python缓存库,专为提升应用性能而设计。虽然其名称暗示与FastAPI框架的紧密集成,但实际上它可以在任何Python项目中使用,为开发者提供简单而高效的缓存解决方案。 在现代应用开发中,性能优化至关…...
提高:图论:强连通分量 图的遍历
时间限制 : 1 秒 内存限制 : 128 MB 给出 NN 个点,MM 条边的有向图,对于每个点 vv,求 A(v)A(v) 表示从点 vv 出发,能到达的编号最大的点。 输入 第 11 行 22 个整数 N,MN,M,表示点数和边数。 接下来 MM 行&#x…...
RabbitMQ高级特性2
RabbitMQ高级特性2 一.TTL1.设置消息的TTL2.设置队列的过期时间 二.死信队列1.死信2.代码实现3.消息被拒绝的死信超出队列长度时的死信死信队列的应用场景 三.延迟队列1.概念2.应用场景3.代码实现延迟队列插件安装和配置代码 4.总结 四.事务1.未采用事务2.采用事务 五.消息分发…...
基于FPGA的特定序列检测器verilog实现,包含testbench和开发板硬件测试
目录 1.课题概述 2.系统测试效果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 本课题采用基于伪码匹配相关峰检测的方式实现基于FPGA的特定序列检测器verilog实现,包含testbench和开发板硬件测试。 2.系统测试效果 仿真测试 当检测到序列的时候…...
【大数据知识】Flink分布式流处理和批处理框架
Flink分布式流处理和批处理框架 概述Flink入门介绍**1. Flink是什么?****2. 核心特性****3. 核心组件****4. 应用场景** Flink底层实现原理详细说明**1. 分布式架构****2. 流处理模型****3. 状态管理****4. 容错机制****5. 网络通信与数据传输****6. 资源管理与扩展…...
Java面试黄金宝典33
1. 什么是存取控制、 触发器、 存储过程 、 游标 存取控制 定义:存取控制是数据库管理系统(DBMS)为保障数据安全性与完整性,对不同用户访问数据库对象(如表、视图等)的权限加以管理的机制。它借助定义用户…...
实战解析:基于AWS Serverless架构的高并发微服务设计与优化
随着云计算进入深水区,Serverless架构正在重塑现代微服务的设计范式。本文将以电商秒杀系统为场景,基于AWS Serverless服务构建高可用架构,并深入探讨性能优化方案。 一、架构设计解析 我们采用分层架构设计,核心组件包括&#…...
Muduo网络库介绍
1.Reactor介绍 1.回调函数 **回调(Callback)**是一种编程技术,允许将一个函数作为参数传递给另一个函数,并在适当的时候调用该函数 1.工作原理 定义回调函数 注册回调函数 触发回调 2.优点 异步编程 回调函数允许在事件发生时…...
Cribl 导入文件来检查pipeline 的设定规则(eval 等)
Cribl 导入文件来检查pipeline 的设定规则(eval 等) 从这个页面先下载,或者copy 内容来创建pipeline: Reducing Windows XML Events | Cribl Docs...
2360. 图中的最长环
2360. 图中的最长环 题目链接:2360. 图中的最长环 代码如下: //参考链接:https://leetcode.cn/problems/longest-cycle-in-a-graph/solutions/1710828/nei-xiang-ji-huan-shu-zhao-huan-li-yong-pmqmr class Solution { public:int longest…...
深度学习入门(三):神经网络的学习
文章目录 前言人类思考 VS 机器学习 VS 深度学习基础术语损失函数常用的损失函数均方误差MSE(Mean Square Error)交叉熵误差(Cross Entropy Error)mini-batch学习 为何要设定损失函数数值微分神经网络学习算法的实现两层神经网络的…...
Python 推导式:简洁高效的数据生成方式
为什么需要推导式? 在Python编程中,我们经常需要对数据进行各种转换和过滤操作。传统的方法是使用循环结构,但这往往会导致代码冗长且不够直观。Python推导式(Comprehensions)应运而生,它提供了一种简洁、…...
HTML5+CSS3+JS小实例:带滑动指示器的导航图标
实例:带滑动指示器的导航图标 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, ini…...
一周学会Pandas2 Python数据处理与分析-Jupyter Notebook安装
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Jupyter (Project Jupyter | Home)项目是一个非营利性开源项目,于2014年由IPython项目中诞生…...
FPGA状态机思想实现流水灯及HDLBits学习
目录 第一章 在DE2-115上用状态机思想实现LED流水灯1.1 状态机设计思路1.2 Verilog代码实现1.3. 仿真测试代码1.4 编译代码与仿真 第二章 CPLD和FPGA芯片的主要技术区别是什么?它们各适用于什么场合?2.1 主要技术区别2.2 适用场合 第三章 HDLBits学习3.1…...
【教程】Windows下 Xshell 连接跳板机和开发机
需求 使用远程连接工具 Xshell 连接跳板机,再从跳板机连接开发机,用户登陆方式为使用密钥。 方法 首先,建立一个会话,用于配置跳板机信息和开发机转跳信息: 在【连接】页面,给跳板机取个名字,…...
Java导出excel,表格插入pdf附件,以及实现过程中遇见的坑
1.不能使用XSSFWorkbook,必须使用HSSFWorkbook,否则导出excel后,不显示插入的图标和内容,如果是读取的已有的excel模板,必须保证excel的格式是xls,如果把xlsx通过重命名的方式改为xls,是不生效的,后面执行下…...
神马系统8.5搭建过程,附源码数据库
项目介绍 神马系统是多年来流行的一款电视端应用,历经多年的发展,在稳定性和易用性方面都比较友好。 十多年前当家里的第一台智能电视买回家,就泡在某论坛,找了很多APP安装在电视上,其中这个神马系统就是用得很久的一…...
cesium 材质 与 交互 以及 性能相关介绍
文章目录 cesium 材质 与 交互 以及 性能相关介绍1. Cesium 材质与着色器简介2. 具体实例应用核心代码及解释3. 代码解释 Cesium 交互1. 常见交互和事件类型2. 示例代码及解释3. 代码解释 cesium 性能优化数据加载与管理渲染优化相机与场景管理代码优化服务器端优化 案例分享1.…...
指令补充+样式绑定+计算属性+监听器
一、指令补充 1. 指令修饰符 1. 作用: 借助指令修饰符, 可以让指令更加强大 2. 分类: 1> 按键修饰符: 用来检测用户的按键, 配合键盘事件使用. keydown 和 keyup 语法: keydown.enter/v-on:keydown.enter 表示当enter按下的时候触发 keyup.enter/v-on:keyup.enter 表示当…...
基于Android的病虫害防治技术系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 基于Android的病虫害防治技术系统设计的目的是为用户提供一个病虫害防治技术管理的平台。与PC端应用程序相比,病虫害防治技术管理的设计主要面向于广大用户,旨在为用户提供一个查看科普内容,进行病虫识别、发帖交流的平台。 基于Androi…...
ffmpeg 使用不同编码器编码hevc的速度
1.核显uhd630 编码器hevc_qsv ffmpeg版本2024-03-14 2.73X 转码完成后大小 971mb 2.1680V4 编码器 libx265 ffmpeg版本2025-05-07 1.42x 转码完成后大小 176mb 3.RX588 编码器hevc_amf ffmpeg版本2024-03-14 转码完成后大小 376MB 4.1680v4dg1rx584 编码器hevc_amf ffm…...
【硬件模块】数码管模块
一位数码管 共阳极数码管:8个LED共用一个阳极 数字编码00xC010xF920xA430xB040x9950x9260x8270xF880x8090x90A0x88B0x83C0xC6D0xA1E0x86F0x8E 共阴极数码管:8个LED共用一个阴极 数字编码00x3F10x0620x5B30x4F40x6650x6D60x7D70x0780x7F90x6FA0x77B0x7…...
NO.64十六届蓝桥杯备战|基础算法-简单贪心|货仓选址|最大子段和|纪念品分组|排座椅|矩阵消除(C++)
贪⼼算法是两极分化很严重的算法。简单的问题会让你觉得理所应当,难⼀点的问题会让你怀疑⼈⽣ 什么是贪⼼算法? 贪⼼算法,或者说是贪⼼策略:企图⽤局部最优找出全局最优。 把解决问题的过程分成若⼲步;解决每⼀步时…...
ubuntu22.04LTS设置中文输入法
打开搜狗网址直接下载软件,软件下载完成后,会弹出安装教程说明书。 网址:搜狗输入法linux-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://shurufa.sogou.com/linux...
基于YOLOv8的热力图生成与可视化-支持自定义模型与置信度阈值的多维度分析
目标检测是计算机视觉领域的重要研究方向,而YOLO(You Only Look Once)系列算法因其高效性和准确性成为该领域的代表性方法。YOLOv8作为YOLO系列的最新版本,在目标检测任务中表现出色。然而,传统的目标检测结果通常以边…...
常见设计系统清单
机构设计系统toB/toC网站GoogleMaterial DesignCm3.material.ioIBM CarbonDesign SystemBcarbondesignsystem.comSalesforceLightning Design SystemBlightningdesignsystem.comMicrosoftFluent Design SystemCfluent2.microsoft.design阿里Ant DesignCant.designSAPFiori Desi…...
React编程高级主题:错误处理(Error Handling)
文章目录 **5.2 错误处理(Error Handling)概述****5.2.1 onErrorReturn / onErrorResume(错误回退)****1. onErrorReturn:提供默认值****2. onErrorResume:切换备用数据流** **5.2.2 retry / retryWhen&…...
【设计模式】代理模式
简介 假设你在网上购物时,快递员无法直接将包裹送到你手中(比如你不在家)。 代理模式的解决方案是: 快递员将包裹交给小区代收点(代理),代收点代替你控制和管理包裹的访问。 代收点可以添加额外…...
局域网:电脑或移动设备作为主机实现局域网访问
电脑作为主机 1. 启用电脑的网络发现、SMB功能 2. 将访问设备开启WIFI或热点,用此电脑连接;或多台设备连接到同一WIFI 3. 此电脑打开命令行窗口,查看电脑本地的IP地址 Win系统:输入"ipconfig",回车后如图 4.…...
图论的基础
E - Replace(判环,破环成链) #include <bits/stdc.h> #include <atcoder/dsu>using namespace std; using namespace atcoder;const int C 26;int main() {int n;cin >> n;string s, t;cin >> s >> t;if (s …...
Jetpack Compose CompositionLocal 深入解析:局部参数透传实践
Jetpack Compose CompositionLocal 深入解析:局部参数透传实践 在 Jetpack Compose 中,如何优雅地在组件之间传递数据,而不需要层层传参? CompositionLocal 就是为了解决这个问题的! 1. 什么是 CompositionLocal&#…...