构建一个rust生产应用读书笔记四(实战3)
从这一节开始,我们将继续完善邮件订阅生产级应用,根据作者的选型sqlx作为数据库操作的类库,它有如下优点:
它旨在提供高效、安全且易于使用的数据库交互体验。sqlx
支持多种数据库,包括 PostgreSQL、MySQL 和 SQLite,并且通过异步 I/O 提供了高性能的数据访问能力。(如果实在不理解,就当做JDBC吧)
主要特点
异步支持:
sqlx 利用了 Rust 的异步/等待(async/await)特性,允许你编写非阻塞的数据库操作代码,这对于高并发的应用尤其有用。
类型安全:
sqlx
提供了编译时的类型检查,确保查询语句中的列名和表名与数据库模式匹配。这可以通过宏(如 query!
和 query_as!
)实现。
宏支持:
sqlx 提供了一些宏来简化常见的数据库操作,例如 query! 用于执行查询并返回结果,query_as! 用于将查询结果直接映射到 Rust 结构体。
连接池:
sqlx 内置了连接池支持,可以方便地管理和复用数据库连接,提高性能。
事务支持:
sqlx 提供了事务管理功能,允许你在多个数据库操作之间保持一致性。
多种数据库支持:
sqlx 支持 PostgreSQL、MySQL 和 SQLite,你可以根据项目需求选择合适的数据库。
回顾测试问题
#[tokio::test]
async fn subscribe_returns_a_200_for_valid_form_data() {let app_address = spawn_app();let client = reqwest::Client::new();let body = "name=le%20guin&email=ursula_le_guin%40gmail.com";let response = client.post(&format!("{}/subscriptions", &app_address)).header("Content-Type", "application/x-www-form-urlencoded").body(body).send().await.expect("Failed to execute request .");//此处我们希望返回200,但是很明显/subscriptions路径根本不存在,应该返回404assert_eq!(200, response.status().as_u16());
}
上面的单元测试代码,我们无法仅通过查看 API 响应来判断所需的业务结果是否已经实现。而我们感兴趣的是数据是否已成功存储。具体来说,我们想确认新订阅者的详细信息是,否已被持久化。
为此,我们有两个选择:
- 利用公共 API 的另一个端点来检查应用程序的状态;
- 在测试用例中直接查询数据库。
在条件允许的情况下,建议优先选择第一种方法:通过公共 API 进行检查。这样,测试代码不会依赖于 API 的内部实现细节(例如底层数据库的技术和架构),因此未来的重构不太可能影响这些测试。
然而,我们的 API 目前没有提供任何公共端点来验证订阅者是否存在。虽然可以考虑添加一个 GET /subscriptions 端点来获取现有订阅者的列表,但这会带来安全性问题:我们不希望在没有任何身份验证的情况下将订阅者的姓名和电子邮件暴露在公网上。虽然我们未来可能会添加这样的端点(毕竟我们不希望每次都需要登录生产数据库来检查订阅者列表),但现在为了测试当前功能而专门开发新功能也并不合适。
因此,我们决定暂时在测试用例中编写一个小查询来直接检查数据库。当有更好的测试策略可用时,我们将移除这一临时解决方案。
数据库设置
原文中作者使用的是postgresql 官方镜像,学习的过程中发现国内docker镜像已经不能使用了,如果同学们发现同样的问题,干脆就在本地按照一个postgresql吧,具体怎么安装就不在赘述了,百度上可以找到。
安装完成之后,新建数据库信息如下
数据库账号和密码: postgres / postgres
数据库schema:newsletter
端口: 5432
安装sqlx-cli
cargo install --version=0.5.7 sqlx-cli --no-default-features --features postgres
构件数据库
rust sqlx提供了强大的数据库管理工具,通过脚本 sqlx migration脚本就可以完成数据的表创建,这个和.net core有些类似,原文中脚本使用了docker,由于我本地没有安装docker因此在原有的基础上修改后使用
#!/usr/bin/env bash
set -x
set -eo pipefail
DB_USER=${POSTGRES_USER:=postgres}
DB_PASSWORD="${POSTGRES_PASSWORD:=postgres}"
DB_NAME="${POSTGRES_DB:=newsletter}"
DB_PORT="${POSTGRES_PORT:=5432}">&2 echo "Postgres is up and running on port ${DB_PORT}!"
export DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@localhost:${DB_PORT}/${DB_NAME}
sqlx database create
了解shell脚本的应该都清楚上面的脚本是啥意思,这里就简单的说明一下:
set -x
: 这个命令开启脚本的调试模式,它会将执行的每一条命令及其参数输出到标准错误输出(通常是终端)。这对于调试脚本非常有用,因为它可以帮助您了解脚本运行时实际执行了哪些操作。set -e
: 这个命令告诉shell在任何命令返回非零状态(即失败)时立即退出脚本。这可以防止一个错误导致后续命令执行失败或产生意外的结果,从而提高脚本的健壮性。set -o pipefail
: 在使用管道连接多个命令时,pipefail
选项确保整个管道的退出状态为管道中最后一个非零退出状态的命令的状态,而不是默认情况下只考虑管道最后一个命令的退出状态。这对于确保脚本能够正确响应管道中任何一个命令的失败非常重要。
接着定义数据库的用户名,密码登,然后重点是sqlx database create, 根据定义的文件创建了一个名称为newsletter的schema
数据库
接着上面的脚本我们新建一个表,执行命令
#!/usr/bin/env bash
set -x
set -eo pipefail
DB_USER=${POSTGRES_USER:=postgres}
DB_PASSWORD="${POSTGRES_PASSWORD:=postgres}"
DB_NAME="${POSTGRES_DB:=newsletter}"
DB_PORT="${POSTGRES_PORT:=5432}">&2 echo "Postgres is up and running on port ${DB_PORT}!"
export DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@localhost:${DB_PORT}/${DB_NAME}
# sqlx database create
sqlx migrate add create_subscriptions_table
如果不出意外在工程下会创建一个这样的目录和文件 {timestamp}_create_subscriptions_table.sql
执行完建表命令后返回的结果
在新建的sql文件中加入建表语句
-- Add migration script here
CREATE TABLE subscriptions(id uuid NOT NULL,PRIMARY KEY (id),email TEXT NOT NULL UNIQUE, name TEXT NOT NULL,subscribed_at timestamptz NOT NULL
);
字段说明
- id: 使用
uuid
类型来唯一标识每个订阅者。NOT NULL
约束表示此字段不能为空。 - email: 存储订阅者的电子邮件地址。
TEXT
类型用于存储文本数据,NOT NULL
表示此字段不能为空,UNIQUE
约束确保每个电子邮件地址都是唯一的。 - name: 存储订阅者的名字。
TEXT
类型用于存储文本数据,NOT NULL
表示此字段不能为空。 - subscribed_at: 存储用户订阅的时间。
timestamptz
类型表示带时区的时间戳,NOT NULL
表示此字段不能为空。
原文中此处使用的都是docker完成整个表构件过程,我在网上找了一些资料,找到了一种适合中国程序员的构件方法, 可以忽略上面的步骤
- 安装
cargo install sqlx-cli
- 新增配置文件
touch .env
- 在.env文件中新建
DATABASE_URL=postgres://postgres:postgres@127.0.0.1:5432/newsletter
4. 执行
# 创建数据库
sqlx database create
# 创建表脚本
sqlx migrate add create_subscription_table
# 在创建的{timestamp}_create_subscription_table.sql 中增加
-- Add migration script here
CREATE TABLE subscriptions(id uuid NOT NULL,PRIMARY KEY (id),email TEXT NOT NULL UNIQUE, name TEXT NOT NULL,subscribed_at timestamptz NOT NULL
);
执行sql
sqlx migrate run
最终数据库里面实现的结果如下,此处如果是第一次操作,可能会有些莫名奇妙的问题,删除后重新来就行了:
开始第一个查询
Cargo.toml
是 Rust 项目中的一个文件,用于定义项目的元数据以及依赖关系,使用表格样式的 TOML 语法可以让配置更清晰易读。下面是使用表格样式重新格式化的 sqlx
配置
[dependencies.sqlx]
version = "0.5.7"
default-features = false
features = ["runtime-actix-rustls","macros","postgres","uuid","chrono","migrate",
]
添加这些依赖的说明:
runtime-actix-rustls
:
- 用途: 指示 sqlx 使用 Actix 运行时来处理其异步操作,并使用 rustls 作为 TLS 后端。
- 场景: 如果你的应用基于 Actix Web 框架,并且需要安全的数据库连接(如通过 HTTPS),这个特征是非常有用的。
macros
:
- 用途: 提供对 sqlx::query! 和 sqlx::query_as! 宏的访问。
- 场景: 这些宏可以简化 SQL 查询的编写和执行,特别是在需要从查询结果中直接映射到 Rust 结构体时。你将在项目中广泛使用这些宏。
postgres
:
- 用途: 解锁 PostgreSQL 特定的功能,包括非标准的 SQL 类型。
- 场景: 如果你使用 PostgreSQL 作为数据库,这个特征是必需的,因为它提供了对 PostgreSQL 特有类型的全面支持。
uuid
:
- 用途: 添加对 SQL UUID 类型的支持,将其映射到 uuid crate 中的 Uuid 类型。
- 场景: 如果你的表中有 UUID 类型的列(例如 id 列),这个特征可以帮助你无缝地在 SQL 和 Rust 之间进行类型转换。
chrono
:
- 用途: 添加对 SQL timestamptz 类型的支持,将其映射到 chrono crate 中的 DateTime<T> 类型。
- 场景: 如果你的表中有时间戳类型的列(例如 subscribed_at 列),这个特征可以确保时间数据在 SQL 和 Rust 之间的正确转换。
migrate
:
- 用途: 提供对 sqlx-cli 工具内部使用的相同函数的访问,用于管理数据库迁移。
- 场景: 这个特征对于测试和开发阶段非常有用,可以帮助你自动化数据库模式的管理和更新。
配置管理
配置管理在应用程序开发中非常重要,尤其是在需要连接数据库等外部服务时。使用配置文件可以让你更灵活地管理不同的环境(如开发、测试和生产),而不需要硬编码敏感信息或在代码中频繁修改。
代码重新整理
touch src/configuration.rs
mkdir src/routes
touch src/routes/mod.rs
touch src/routes/health_check.rs
touch src/routes/subscriptions.rs
touch startup.rs
src 目录展示
总结
这一节内容重点在于数据库的配置,由于内容比较多,把写代码的心得放在下一章,感谢点赞、收藏、关注,你们的支持是我最大的动力
注:各位亲爱的小伙伴们,今年是我从事软件行业的第20年,通过博客记录的方式将我知道的、理解的、有帮助的都分享给大家。同时,也提供就业指导,专业简历优化服务。你们的支持是我最大的动力
相关文章:
构建一个rust生产应用读书笔记四(实战3)
从这一节开始,我们将继续完善邮件订阅生产级应用,根据作者的选型sqlx作为数据库操作的类库,它有如下优点: 它旨在提供高效、安全且易于使用的数据库交互体验。sqlx 支持多种数据库,包括 PostgreSQL、MySQL 和 SQLite&…...
idea无法识别文件,如何把floder文件恢复成model
前景: 昨天,我在之前的A1214模块包下新增了一个demo类,然后又新建了一个A1216模块,写了算法题,后面打算用git提交,发现之前的A1214模块下的demo类和新建的模块源文件都已经被追踪了,都是绿色的&…...
更新数据时Redis的操作
一般做法是在数据库更新后删除Redis中对应的缓存数据,而非更新数据。那么为什么要这么做呢? 以下是一些拙见 场景使用 金融交易系统:在金融领域,数据的准确性至关重要。任何数据不一致都可能导致严重的财务损失。因此࿰…...
Flink CDC 读取oracle库数据性能优化
通过综合考虑Oracle数据库配置、Flink作业配置以及其他优化措施,可以显著提升Flink CDC读取Oracle库数据的性能和效率。可以从以下几个方面进行: 一、Oracle数据库配置优化 开启归档日志: 通过执行sqlplus /assysdba或sqlplus/nolog命令…...
学习记录:js算法(一百二十三):不同路径 II
文章目录 不同路径 II思路一 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。 网格中的障碍物…...
mybatis 的动态sql 和缓存
动态SQL 可以根据具体的参数条件,来对SQL语句进行动态拼接。 比如在以前的开发中,由于不确定查询参数是否存在,许多人会使用类似于where 1 1 来作为前缀,然后后面用AND 拼接要查询的参数,这样,就算要查询…...
You need to call SQLitePCL.raw.SetProvider()
在.NET环境中使用Entity Framework Core(EF Core)连接SQLite数据库时,报错。 使用框架 .NET8 错误信息: Exception: You need to call SQLitePCL.raw.SetProvider(). If you are using a bundle package, this is done by calling…...
MYSQL执行一条update语句,期间发生了什么
客户端先通过连接器建立连接,连接器自会判断用户身份; 因为这是一条 update 语句,所以不需要经过查询缓存,但是表上有更新语句,是会把整个表的查询缓存清空的,所以说查询缓存很鸡肋,在 MySQL 8…...
《安全工程师自我防护指南:直面数字威胁的有效策略与实践》
一、法律层面的保护 获取授权 在对目标系统进行任何测试之前,确保已经获得了合法的授权。这可以是来自目标组织(如企业的信息安全部门)的书面授权或者合同协议。例如,一家公司聘请外部安全团队来测试其网络安全防御能力ÿ…...
SpringBoot2+Vue2开发工作管理系统
项目介绍 在工作中使用的管理系统,可以随手记录一些笔记、可以汇总一些常用网站的链接、可以管理自己负责的项目、可以记录每日日报和查看历史日报、可以记录加班情况、可以记录报销内容、可以编写文章文档。 系统功能 我的笔记快捷入口项目管理今日日报我的日报…...
华为HarmonyOS实现跨多个子系统融合的场景化服务 -- 7 地图选点Button
场景介绍 本章节将向您介绍如何使用地图选点Button功能,开发者可调用Button组件拉起Map Kit的地图选点页面,用户在地图中选择位置后,位置相关信息返回Button界面。 说明 该场景暂不支持2in1设备。 前提条件 参见开发准备。 效果图展示 …...
Web项目图片视频加载缓慢/首屏加载白屏
Web项目图片视频加载缓慢/首屏加载白屏 文章目录 Web项目图片视频加载缓慢/首屏加载白屏一、原因二、 解决方案2.1、 图片和视频的优化2.1.1、压缩图片或视频2.1.2、 选择合适的图片或视频格式2.1.3、 使用图片或视频 CDN 加速2.1.4、Nginx中开启gzip 三、压缩工具推荐 一、原因…...
Java系统对接企业微信审批项目流程
若依做的一个系统需求需要对接企业微信的人员去审核订单 回款之类,以下是详细步骤. 1.首先登入企业微信管理后台: 企业微信 2.找到应用管理 3.自建一个应用 4.这些数据都可以拿到 5.配置可信Ip 6.进入有两种方法让你去配置 ,第一种用公司的…...
MacOS 命令行详解使用教程
本章讲述MacOs命令行详解的使用教程,感谢大家观看。 本人博客:如烟花般绚烂却又稍纵即逝的主页 MacOs命令行前言: 在 macOS 上,Terminal(终端) 是一个功能强大的工具,它允许用户通过命令行直接与系统交互。本教程将详细介绍 macOS…...
易语言鼠标轨迹算法(游戏防检测算法)
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
java-使用druid sqlparser将SQL DDL脚本转化为自定义的java对象
java-使用druid sqlparser将SQL DDL脚本转化为自定义的java对象 一、引言二、环境三、待解析的DDL四、解析后的对象结构五、完整的UT类六、控制台输出总结 一、引言 在日常开发中,有些需要对SQL进行解析的场景,比如读取表结构信息,生成文档、…...
靜態IP與DHCP的區別和用法
IP地址可以是靜態的,即固定不變,也可以是動態的,定期更改或每次連接後更改。 什麼是靜態 IP? 靜態IP地址是固定的,手動分配的IP地址,不會隨時間而變化。分配後,此 IP 保持不變,並由…...
【C#】Debug和Release的区别和使用
在 C 或 C# 开发中,Debug 和 Release 是两种不同的编译配置,主要用于开发过程中的不同阶段。它们的主要区别如下: 1. Debug 版本 Debug 版本是为了开发和调试程序而优化的构建模式。 特点: 包含调试信息: Debug 版本…...
Element plus 下拉框组件选中一个选项后显示的是 value 而不是 label
最近刚进行 Vue3 Element plus 项目实践,在进行表单二次封装的时候,表单元素 select 下拉框组件选中一个选项后显示的是 value 而不是 label,下面上代码: 原来的写法: <el-selectv-if"v.type select"…...
Redis - 消息队列 Stream
一、概述 消息队列 定义 消息队列模型:一种分布式系统中的消息传递方案,由消息队列、生产者和消费者组成消息队列:负责存储和管理消息的中间件,也称为消息代理(Message Broker)生产者:负责 产…...
【多维DP】【hard】力扣1269. 停在原地的方案数
有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处。 每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指针不能被移动到数组范围外)。 给你两个整数 steps 和 arrLen ,请你计算并返回&…...
Android显示系统(11)- 向SurfaceFlinger申请Surface
Android显示系统(01)- 架构分析 Android显示系统(02)- OpenGL ES - 概述 Android显示系统(03)- OpenGL ES - GLSurfaceView的使用 Android显示系统(04)- OpenGL ES - Shader绘制三角…...
OpenCV实验篇:识别图片颜色并绘制轮廓
第三篇:识别图片颜色并绘制轮廓 1. 实验原理 颜色识别的原理: 颜色在图像处理中通常使用 HSV 空间来表示。 HSV 空间是基于人类视觉系统的一种颜色模型,其中: H(Hue):色调,表示颜色…...
鸿蒙-应用内悬浮窗
//悬浮窗工具类 import { window } from kit.ArkUI; import { BusinessError } from kit.BasicServicesKit; import { Logger } from mbbase/common-ui; import * as FloatedWindowPage from ./FloatedWindowPage; // 导入命名路由页面 const TAG [FloatedWindowUtils]; ex…...
Ubuntu Linux操作系统
一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shuttleworth)创办的基于Debian Linux的操作系统,于2004年10月公布。Ubuntu是一个以桌面应用为主的Linux发行版操作系统。Ubuntu拥有庞大的社区力量,用户可以方便地从社区获得帮助。其官方网…...
Linux下SVN客户端保存账号密码
参考文章:解决:Linux上SVN 1.12版本以上无法直接存储明文密码_linux svn 保存密码-CSDN博客新版本svn使用gpg-agent存储密码-CSDN博客svn之无法让 SVN 存储密码,即使配置设置为允许_编程设计_ITGUEST 方法一:明文方式保存密码 首…...
【DBeaver】连接带kerberos的hive[Apache|HDP]
目录 一、安装配置Kerberos客户端环境 1.1 安装Kerberos客户端 1.2 环境配置 二、基于Cloudera驱动创建连接 三、基于Hive原生驱动创建连接 一、安装配置Kerberos客户端环境 1.1 安装Kerberos客户端 在Kerberos官网下载,地址如下:https://web.mit.edu/kerberos…...
Android-Glide详解
目录 一,介绍 二,使用 三,源码分析思路 四,with源码分析 五,模拟Glide生命周期管理 一,介绍 Glide目前是安卓最主流的加载图片的框架,也是源码最为复杂的框架之一。 要想完完全全吃透Glide的源…...
【容器】k8s学习笔记原理详解(十万字超详细)
Pod详解 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个: 可以以它为依据&am…...
SQL Server通过存储过程实现自定义邮件格式并定时发送
在 SQL Server 中,可以通过存储过程实现自定义邮件格式并定时发送。这通常涉及以下几个步骤: 1. 配置 Database Mail:首先需要配置 SQL Server 的 Database Mail 功能。 2. 创建存储过程:编写存储过程来生成自定义邮件格式并发送邮件。 3. 设置 SQL Server 代理作…...
通过增强的 vSphere 集成增强你的 vSphere 监控
作者:来自 Elastic Ishleen Kaur•Lalit Satapathy vSphere 是 VMware 的云计算虚拟化平台,提供一套功能强大的虚拟化资源管理套件。它允许组织创建、管理和优化虚拟环境,提供高可用性、负载平衡和简化资源分配等高级功能。vSphere 可以高效利…...
C++ 并发专题 - C++线程同步的几种方法
一:概述 线程同步是多线程编程中的一个重要概念,它用于控制多个线程之间对共享资源的访问,避免竞态条件(race condition)和数据不一致的问题。线程同步确保在多线程环境中,多个线程访问共享数据时能够按照某…...
[java]网络编程
java.net.*包下提供了网络编程的解决方案 通信架构 CS架构 客户端 客户端需要开发 用户需要安装 服务端 需要开发 BS架构 浏览器 不需要开发 需要安装浏览器 服务器 需要开发 网络通信三要素 IP地址 是设备在网络中的唯一标识, 全称 互联网协议地址 分类 公网IP 可…...
[C++]类的继承
一、什么是继承 1.定义: 在 C 中,继承是一种机制,允许一个类(派生类)继承另一个类(基类)的成员(数据和函数)。继承使得派生类能够直接访问基类的公有和保护成员…...
2024安装hexo和next并部署到github和服务器最新教程
碎碎念 本来打算写点算法题上文所说的题目,结果被其他事情吸引了注意力。其实我之前也有过其他博客网站,但因为长期不维护,导致数据丢失其实是我懒得备份。这个博客现在部署在GitHub Pages上,github不倒,网站不灭&…...
【spring】@Qualifier注解
目录 1. 说明2. 用法示例2.1 标注在字段上2.2 标注在方法上2.3 标注在类上2.4 在自定义注解上的应用 3. 注意事项 1. 说明 1.Qualifier是Spring框架中的一个注解,主要用于解决依赖注入时的歧义性问题。2.定义:Qualifier是一个限定符注解,用于…...
uniapp 应用的生命周期、页面的生命周期、组件的生命周期
uniapp 作为一款跨平台的移动应用开发框架,其生命周期分为应用生命周期、页面生命周期和组件生命周期。下面分别介绍这三种生命周期的具体内容: 应用生命周期 应用生命周期仅适用于整个应用,在 App.vue 中可以监听到以下生命周期函数&#…...
热更新解决方案4——xLua热补丁
概述 运行时不在执行C#中的代码,而是执行Lua中的代码,相当于是打了个补丁。 1.第一个热补丁 2.多函数替换 3.协程函数替换 在原HotfixMain脚本中只加个协程函数即可(和在Start中启动协程函数) 4.索引器和属性替换 在HotfixMain中…...
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...
3.2.1.2 汇编版 原子操作 CAS
基本原理说明 在 x86 和 ARM 架构上,原子操作通常利用硬件提供的原子指令来实现,比如 LOCK 前缀(x86)或 LDREX/STREX(ARM)。以下是一些关键的原子操作(例如原子递增和比较交换)的汇…...
关于llama2:从原始llama-2-7b到llama-2-7b-hf的权重转换教程
1.首先,我是从各个教程里面选了一个实际操作的教程(这样更加靠谱):下载llama2-7b并转hf模型_huggingface 下载llama2-7b-chat-hf-CSDN博客 2.但是,其实我在另外一篇更好的教程里面看到过一个坑(这篇好像是腾…...
物理机内网穿透
前言: 本文主要讲述如何使用内网穿透以及其安全性。 将带领大家在公网上搭建几个常用靶场。 一,什么是内网穿透。 大多数情况下,我们的个人电脑都处于内网,即没有可公开访问的独立 IP 地址,因此其他内网用户找不到…...
构建一个rust生产应用读书笔记四(实战1)
我们需要从访客那里收集哪些信息,以便将其登记为电子邮件通讯的订阅者? 电子邮件地址:这是最基本的要求,因为我们需要通过电子邮件地址向订阅者发送内容。姓名:虽然这不是强制性的,但我们希望收集一个名字…...
[LeetCode-Python版]206. 反转链表(迭代+递归两种解法)
题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例 3࿱…...
shardingsphere分库分表跨库访问 添加分片规则
shardingsphere分库分表跨库访问 添加分片规则 建立 JDBC 环境 创建表 t_order: CREATE TABLE t_order (tid bigint(20) NOT NULL,tname varchar(255) DEFAULT NULL,goods_id bigint(20) DEFAULT NULL,tstatus varchar(255) DEFAULT NULL,PRIMARY KEY (tid) ) E…...
【NLP 15、深度学习处理文本】
目录 一、反向传播 编辑 1.反向传播运算过程 2.前向传播和反向传播的作用 前向传播 反向传播 3.定义模型(torch包) 4.手动实现 ① 线性层 ② sigmoid激活函数 ③ 手动实现MSE均方差损失函数 ④ 前向传播 ⑤ 手动实现梯度计算 ⑤ 权重的更新:…...
Android Studio创建新项目并引入第三方so外部aar库驱动NFC读写器读写IC卡
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单,选择 要创建的项目模版,点击 Next 二、输入项目名称…...
3D视觉[一]3D计算机视觉
3D视觉[一]3D计算机视觉 3D计算机视觉概述 像机标定 文章目录 3D视觉[一]3D计算机视觉前言一、人类视觉二、计算机视觉2.1 计算机视觉的研究目的2.2 计算机视觉的研究任务2.3 计算机视觉的研究方法2.4 视觉计算理论2.5 马尔框架中计算机视觉表达的四个层次2.5.1 图像ÿ…...
Linux权限(超详细彻底搞懂Linux的权限)
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:Linux常见指令(初学者必看) 🔖流水不争,争的是滔滔不 一、Linux下的两种用户超级用户&…...
Ubuntu22.04安装docker desktop遇到的bug
1. 确认已启用 KVM 虚拟化 如果加载了模块,输出应该如下图。说明 Intel CPU 的 KVM 模块已开启。 否则在VMware开启宿主机虚拟化功能: 2. 下一步操作: Ubuntu | Docker Docs 3. 启动Docker桌面后发现账户登陆不上去: Sign in | …...