【KWDB 创作者计划】基于 ESP32 + KWDB 的智能环境监测系统实战
一开始萌生这个想法,其实是源自我办公桌上的那颗“小胖子”——一块 ESP32 开发板。它陪我度过了不少调试夜,也让我对物联网有了真正的感知。恰逢 KaiwuDB 举办征文活动,我便想着,何不将我日常积攒下来的一些硬件和数据库实战经验结合起来,做一个既能落地,又能完整体现“AIoT + 时序数据库”的项目出来?
于是,这个智能环境监测系统便诞生了。
一切从一块 ESP32 开始
我手里有一块常见的 NodeMCU-32S 模块,搭载的是乐鑫的 ESP32-WROOM-32 芯片,内建 Wi-Fi + BLE,对于小规模的 IoT 应用来说简直是理想选项。而用于监测的传感器,我选的是 DHT22 —— 价格便宜、读取简单,足够应对温湿度的采集需求。当然后续你完全可以扩展成 BME280、SHT31 甚至是多参数的空气质量传感器,这就是系统的可扩展性所在。
而在云端,我选择了 KWDB 2.2.0 作为数据核心。为什么不是 InfluxDB 或 TimescaleDB?因为我对比之后发现,KWDB 在写入吞吐上更胜一筹,尤其适合高频环境监测数据的采集与分析,而且 SQL 查询能力让我轻松做各种聚合、统计与实时告警,何乐而不为。
项目整体架构长什么样?
构建这个系统的时候,我先画了一个草图,后来逐步抽象成了一张完整的结构图,它大概是这样的:
这套结构很清晰地划分了三层:数据采集(ESP32)→ 数据中转(中间件)→ 数据存储&展示(KWDB + 可视化)。也方便我后续对每个部分进行独立优化。
硬件部分:ESP32 与 DHT22 的握手初体验
ESP32 开发板上的 GPIO 多得让人眼花,我最后选了 GPIO 4 接 DHT22 的数据线。整个电路连接其实很简单,用杜邦线就能快速搭好原型。
我使用的是 Arduino 开发环境,直接引入 DHT.h
库就能读取数据。下面是我的设备端代码核心部分:
#include "DHT.h"
#include <WiFi.h>
#include <HTTPClient.h>#define DHTPIN 4
#define DHTTYPE DHT22const char* ssid = "your_wifi_ssid";
const char* password = "your_wifi_password";
const char* serverUrl = "http://your_server_ip:5000/upload";DHT dht(DHTPIN, DHTTYPE);void setup() {Serial.begin(115200);WiFi.begin(ssid, password);dht.begin();while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("WiFi connected");
}void loop() {float temperature = dht.readTemperature();float humidity = dht.readHumidity();if (isnan(temperature) || isnan(humidity)) {Serial.println("Failed to read from DHT sensor!");return;}if (WiFi.status() == WL_CONNECTED) {HTTPClient http;http.begin(serverUrl);http.addHeader("Content-Type", "application/json");String payload = "{\"temperature\": " + String(temperature, 2) +", \"humidity\": " + String(humidity, 2) + "}";int httpResponseCode = http.POST(payload);Serial.println("Sent: " + payload);Serial.println("Response code: " + String(httpResponseCode));http.end();}delay(60000); // 每分钟上传一次
}
这一段代码的亮点在于:ESP32 直接通过 HTTP 向我的服务器 POST 数据,避免中间复杂协议的折腾,非常适合快速实验与调试。
中间件:Python Flask 架起数据桥梁
我服务器端用的是 Flask 框架,一个 Python 界里的轻量级王者。它负责接收 ESP32 发送来的数据、解析 JSON,然后将其写入 KWDB 中。
当然,要连接 KWDB,我们可以使用 HTTP API,也可以用 KaiwuDB 提供的 Python SDK。如果你喜欢走“原生”风,我推荐用 RESTful 的方式进行写入,速度也不差。
这部分代码如下:
from flask import Flask, request, jsonify
import requests
import timeapp = Flask(__name__)@app.route('/upload', methods=['POST'])
def upload():data = request.get_json()temperature = data.get('temperature')humidity = data.get('humidity')payload = {"db": "environment","table": "sensor_data","data": [{"ts": int(time.time() * 1000), # 毫秒时间戳"temperature": temperature,"humidity": humidity}]}# 假设你部署在本地resp = requests.post("http://localhost:8080/api/put", json=payload)return jsonify({"status": "ok", "kwdb_resp": resp.text})if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
当这个 Flask 服务跑起来后,ESP32 发送的数据就能被及时存入数据库了。一个小时之后我打开数据库一查,几十条温湿度数据已经乖乖地躺在那里,安静得仿佛一群等待分析的小妖精。
在我确认中间件成功写入数据后,下一步便是将 KWDB 2.2.0 部署在一台小型服务器上,并在其中建模存储。说来简单——几行 Docker 命令就能跑起来——但其中的每一句都隐含着对性能与可维护性的考量。
# 拉取 KaiwuDB 镜像并启动
docker pull kwdb/kwdb:2.2.0
docker run -d --name kwdb \-p 8080:8080 \-p 26257:26257 \-v ~/kaiwudb/data:/var/lib/kaiwudb \kwdb/kwdb:2.2.0
我记得当时看着日志里那一行行“Server started on port 8080”,内心有种“千呼万唤始出来”的满足感。随即,我通过浏览器访问 http://<服务器IP>:8080
,看到了简洁的 Web UI,确认能够执行 SQL 查询与表结构管理。
接下来,我在 KWDB 中创建了一个名为 environment.sensor_data
的时序表。表结构并不复杂,只需一个时间戳列和两列传感器数据,但我特意加了标签(tag)支持,将来如果要扩展多节点、多设备,就可以用标签区分来源。建表语句大致如下:
CREATE DATABASE IF NOT EXISTS environment;
USE environment;CREATE TABLE IF NOT EXISTS sensor_data (ts TIMESTAMP NOT NULL,temperature DOUBLE,humidity DOUBLE
) WITH (TAGS = ('device_id'));
写完这段 SQL,我在 Web UI 的控制台粘进去,点击“执行”,片刻之后,sensor_data
就静静地躺在那里,等待下一次数据流入。
为了让前端能够根据设备 ID 分屏显示,我还顺手在中间件代码里加了一行,将 ESP32 的 MAC 地址当作 device_id
标签一并写入。这一改动看似小,却为后续的多节点展示留足了空间。
前端设计:从线框到精美可视化
用户访问系统的第一眼体验来源于前端展示。起初我在纸上随手画了一堆方框,标注了“当前温度”“实时曲线”“历史数据切换”“告警日志”几块区域。转化成数字化线框后,它看起来像这样:
在实现阶段,我选用了 Vue 3 + ECharts。Vue 的组件化理念让我把每块面板都当成一个小模块来写,方便后面维护和重用。ECharts 则提供了丰富而灵活的图表类型,我只需定义好数据接口,就能一键生成折线图、柱状图等。
界面配色上,我选用了一套清新蓝绿搭配,卡片四角稍微圆润,阴影轻飘。在 CSS 中,我用 box-shadow: 0 2px 8px rgba(0,0,0,0.1)
来突出每个卡片的层次感;按钮与切换控件则使用了柔和的渐变背景,让操作看起来更现代、更有质感。
下面是一段核心的 Vue 组件代码,用于绘制实时温度曲线。大家不妨感受一下数据流动到画面的那种畅快。
<template><div ref="chart" class="chart-container"></div>
</template><script>
import * as echarts from 'echarts';export default {props: ['deviceId'],data() {return {chart: null,seriesData: []};},mounted() {this.chart = echarts.init(this.$refs.chart);this.fetchData();setInterval(this.fetchData, 60000);},methods: {async fetchData() {const res = await fetch(`/api/query?sql=SELECT ts,temperature FROM environment.sensor_data WHERE device_id='${this.deviceId}' ORDER BY ts DESC LIMIT 60`);const json = await res.json();this.seriesData = json.rows.map(r => [r.ts, r.temperature]);this.updateChart();},updateChart() {this.chart.setOption({xAxis: { type: 'time' },yAxis: { type: 'value', name: '℃' },series: [{data: this.seriesData.reverse(),type: 'line',smooth: true,areaStyle: {}}]});}}
};
</script><style>
.chart-container {width: 100%;height: 300px;
}
</style>
这样,一个能够动态滚动的温度图表就完成了。湿度曲线与之类似,只需替换字段即可。至此,系统的“数据采集→中转→可靠存储→实时可视化”闭环基本兜住。
实时告警:让系统“会说话”
监测系统最关键的一环,就是当环境异常时能够及时发出告警。最初我试图在前端用长轮询去检测数据,一旦超阈就弹窗。但这样用户得一直打开页面,而且前端对数据库的访问不够细粒度。最后,我将告警逻辑放到后端,用一个简单的 Python 定时任务:
import schedule
import time
import requestsTHRESHOLD_TEMP = 30.0def check_alert():sql = f"SELECT LAST(temperature) FROM environment.sensor_data WHERE device_id='ESP32_01'"res = requests.get(f"http://localhost:8080/api/query?sql={sql}")last_temp = res.json()['rows'][0][1]if last_temp > THRESHOLD_TEMP:notify(f"温度告警:当前温度 {last_temp}℃ 已超出阈值!")def notify(message):# 这里可以接入企业微信、邮件、短信等多种方式print(message)schedule.every(1).minutes.do(check_alert)while True:schedule.run_pending()time.sleep(1)
每分钟,这段代码会向 KWDB 发起一次 LAST
查询,拿到最新的温度值,再和阈值比较。如果触发,就调用 notify
,而这个函数里你可以根据需求对接邮件服务器或微信机器人,实现真正的“推送到手机”体验。我当时便设置了企业微信机器人,测试时一旦温度飙到 31℃,微信里秒收告警——那种“技术产物成活”的快感,至今回味无穷。
性能测试
性能测试要从“量”开始。我把测试分成两部分:写入吞吐和查询延迟。先说写入,我用一个简单的 Python 脚本模拟了 10 个 ESP32 节点同时向中间件推送数据,每分钟 60 条,相当于每秒 10 条。脚本大概这样写:
import threading, time, requests, randomSERVER = "http://localhost:5000/upload"
NODES = 10
RUN_SECONDS = 60def send_data(node_id):for _ in range(RUN_SECONDS):temp = round(20 + random.random() * 10, 2)hum = round(30 + random.random() * 40, 2)payload = {"temperature": temp,"humidity": hum,"device_id": f"ESP32_{node_id:02d}"}try:requests.post(SERVER, json=payload, timeout=1)except Exception as e:print(f"节点 {node_id} 发送失败:{e}")time.sleep(1)threads = []
start = time.time()
for i in range(NODES):t = threading.Thread(target=send_data, args=(i+1,))threads.append(t)t.start()for t in threads:t.join()
end = time.time()print(f"总耗时:{end-start:.2f}s,发送总数:{NODES*RUN_SECONDS}")
脚本跑完后,控制台打印出总耗时大约 62 秒,考虑网络与中间件处理,算下来几乎达到了 10×1 条/秒的预期。接着,我在 KWDB 的监控中看到写入峰值近 150 条/秒,这说明中间件的批量写入和数据库的写入优化都在发挥作用。最令我惊喜的是,即便在并发写入高峰,KWDB 的 CPU 使用率也只是被拉到 40% 左右,内存占用平缓增长,证明其在资源利用方面非常节省。
写完写入,再看查询延迟。我在中间件那儿做了一个并发查询测试:同时发起 20 个 SELECT LAST(temperature)
请求。测试脚本和上面的很像,只不过改成循环请求查询接口。这次每次响应时间平均在 15ms 左右,99% 请求都在 25ms 内完成,没有出现明显的抖动。对比我之前用过的一个小型 InfluxDB 集群,同样配置下平均响应在 35ms 左右,偶有超时重试的情况;而 KWDB 在这方面表现要稳定流畅得多。
做完测试,趁热打铁,我又在前端加了一个“压力模式”开关,打开后仪表盘会每秒刷新一次,同时显示请求延迟的实时曲线。看着那条抖动不大的橙色延迟曲线缓缓滑过屏幕,让我对整套系统的健壮性更有信心了。
测试结束后,我整理了一张性能对比图:
这张图虽简单,却把核心差异一目了然地摆了出来。
到这里,整个系统从硬件采集到数据库存储,再到前端可视化与告警,再到性能测试和调优,已经跑通并且稳定。我在项目里学到最关键的一点是:分层解耦,才能让每一环都发挥最大效率。ESP32 专注采集与网络,中间件负责协议和批量处理,KWDB 兢兢业业地做存储与查询,前端专心展示与交互。
当然,万物皆可升级。如果下一步拓展,我会考虑把中间件改成无状态的微服务,接入 Kubernetes 做弹性伸缩;把前端静态资源部署到 CDN,降低访问延迟;还可以引入机器学习模块,对历史温湿度数据做趋势预测,提前几小时给出“未来环境变化预警”。这些想法都很激动人心,也为后续深入探索打开了更多可能。
最后,回头看看整个项目,我从一块小小的 ESP32、一个 DHT22 传感器,走到一套完整的 AIoT 环境监测与告警系统,不仅锤炼了硬件调试、网络编程、数据库设计、前端开发和系统运维的能力,也深刻体会到 KWDB 在高并发写入和实时查询上的威力。
如果你手头也有 ESP32,或者想搭一个轻量级的时序数据库平台,不妨跟着这篇实战,一步一步把原型跑通。希望我的经历能够让你少走弯路,迅速享受“设备上线后数据源源不断涌入、仪表盘实时跳动”那份成就感。
相关文章:
【KWDB 创作者计划】基于 ESP32 + KWDB 的智能环境监测系统实战
一开始萌生这个想法,其实是源自我办公桌上的那颗“小胖子”——一块 ESP32 开发板。它陪我度过了不少调试夜,也让我对物联网有了真正的感知。恰逢 KaiwuDB 举办征文活动,我便想着,何不将我日常积攒下来的一些硬件和数据库实战经验…...
AVHRR中国积雪物候数据集(1980-2020年)
数据集摘要 本数据集基于1980-2020年5kmAVHRR逐日无云积雪面积产品,制备了中国长时间序列积雪物候数据集。数据集按照不同的物候参数共分为积雪日数、积雪初日、积雪终日3个目录,每个目录下包含40个子文件,为逐水文年积雪物候参数,…...
PCB设计中电感封装的选型
在PCB设计中,电感封装的选型直接影响电路性能、布局效率、热管理能力及系统可靠性。合理的封装选择不仅能优化空间利用率,还能提升电磁兼容性(EMC)和长期稳定性。以下从封装类型、尺寸参数、应用场景适配、布局协同设计、热管理策…...
LintCode第766题,LintCode第1141题,LintCode第478题
第766题描述 判断给出的年份 n 是否为闰年. 如果 n 为闰年则返回 true 闰年是包含额外一天的日历年. 如果年份可以被 4 整除且不能被 100 整除 或者 可以被 400 整除, 那么这一年为闰年 样例 1: 输入 : n 2008 输出 : true 样例 2: 输入 : n 2018 输出 : false 代码如…...
三十一、基于HMM的词性标注
基于HMM的中文词性标注 1 实验目标 理解HMM模型的原理和基本问题理解HMM的实现命名实体识别的具体步骤掌握HMM模型实现命名实体识别的方法 2 实验环境 HMM的中文词性标注的实验环境。 3 实验步骤 该项目主要由3个代码文件组成,分别为hmm.py、tagging.py和run.p…...
MCUboot 中的 BOOT_SWAP_TYPE_PERM 功能介绍
目录 概述 1 Image 数据结构 1.1 Image介绍 1.2 Swap info 2 BOOT_SWAP_TYPE_PERM 功能 2.1 功能定义 2.2 典型工作流程 3 BOOT_SWAP_TYPE_xx的其他功能 3.1 BOOT_SWAP_TYPE_REVERT 3.2 三中模式的比较 4 使用机制 4.1 实现细节 4.2 使用场景 4.3 开发者注意事…...
数学复习笔记 2
前言 朋友和我讨论了一个二重积分题,非常有意思。内容非常细致。整理如下: 二重积分 题目来源是 1000 上面的 16 题,积分区域是一个偏心圆,偏心圆的圆心在 y 轴上面,偏心圆是关于 y 轴对称的,可以看关于…...
从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 5 |地图匹配与轻量 SLAM:HMM/Viterbi 与简化图优化
Part 5 |地图匹配与轻量 SLAM:HMM/Viterbi 与简化图优化 在本章中,我们将在 ESP32-S3 这样的资源受限平台上,实现 地图匹配(Map Matching)和轻量级图优化(Lightweight SLAM)功能。通过 隐马尔可夫模型(HMM)+ Viterbi 算法,以及简化的图优化思路,校正定位轨迹,提升…...
Amazon Bedrock Converse API:开启对话式AI新体验
Amazon Bedrock Converse API:开启对话式AI新体验 前言 在当今人工智能飞速发展的时代,对话式AI已成为众多应用的核心组成部分。从智能客服到智能助手,对话式AI为用户带来了便捷且高效的交互体验。而Amazon Bedrock Converse API的出现&…...
软考 系统架构设计师系列知识点之杂项集萃(54)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(53) 第87题 某银行系统采用Factory Method方法描述其不同账户之间的关系,设计出的类图如下所示。其中与Factory Method的“Creator”角色对应的类是(ÿ…...
第三章 - 软件质量工程体系
1 概述 系统工程学的思想 系统工程学是为了研究多个子系统构成的整体系统所具有的多种不同目标的相互协调,以期系统功能的最优化、最大限度地发挥系统组成部分的能力而发展起来的一门科学。 软件质量工程体系的建立 建立和实施质量管理体系的方法 确定顾客和其…...
#基础Machine Learning 算法(上)
机器学习算法的分类 机器学习算法大致可以分为三类: 监督学习算法 (Supervised Algorithms):在监督学习训练过程中,可以由训练数据集学到或建立一个模式(函数 / learning model),并依此模式推测新的实例。…...
【YOLO11改进】改进Conv、颈部网络STFEN、以及引入PIOU用于小目标检测!
改进后的整体网络架构 改进一:RFD模块(Conv) YOLOv11模型的跨步卷积下采样虽然快速聚合了局部特征,并且实现了较高的计算效率,但其固有的信息压缩机制会导致细粒度特征的不可逆丢失。针对特征保留与计算效率的平衡问题,本文采用RFD模块替换跨步卷积下采样模块。RFD模块通…...
算法之上的权力——空域治理的政治哲学
当AI算法成为空域资源分配的核心机制,我们不得不直面一个核心问题:谁拥有算法,谁控制算法,谁审查算法?调度系统表面上是中立技术,实则承载了深刻的价值判断与权力结构。本章提出“算法即治理”命题…...
虚幻引擎作者采访
1万小时编程_哔哩哔哩_bilibili https://www.youtube.com/watch?v477qF6QNSvc 提姆斯温尼是一位传奇性的视频游戏程序员,Epic Games 的创始人兼首席执行官。 该公司开发了虚幻引擎、堡垒之夜、战争机器、虚幻竞技场等许多开创性和有影响力的视频游戏。 他哥哥…...
CodeBlocks25配置wxWidgets3.2
一、下载CodeBlocks 25.03版本 1.去Sourceforge.net Code::Blocks - Browse /Binaries/25.03/Windows at SourceForge.net 下载codeblocks-25.03mingw-nosetup.zip 2.解压到d盘,并把目录改为codeblocks 二、.下载wxWidgets 3.2.8 1. 去Sourceforge.net wxWidg…...
Python 整理3种查看神经网络结构的方法
1. 网络结构代码 import torch import torch.nn as nn# 定义Actor-Critic模型 class ActorCritic(nn.Module):def __init__(self, state_dim, action_dim):super(ActorCritic, self).__init__()self.actor nn.Sequential(# 全连接层,输入维度为 state_dim…...
【Bootstrap V4系列】学习入门教程之 组件-卡片(Card)
Bootstrap V4系列 学习入门教程之 组件-卡片(Card) 卡片(Card)一、Example二、Content types 内容类型2.1 Body 主体2.2 Titles, text, and links 标题、文本和链接2.3 Images 图片2.4 List groups 列表组2.5 Kitchen sink 洗涤槽…...
AI Agent开发第50课-机器学习的基础-线性回归如何应用在商业场景中
开篇 虽然我们这个系列主讲AI Agent,但是这个系列是一个喂饭式从0到深入的全AI类计算机教程系列,它主要面向的是培养出一个个AI时代的程序员,不是像外部那种很水的只是做做套壳、聊天、绘图小工具的急功近利式教学。而机器学习是现代AI的基础与基石,一些机器学习、深度学习…...
代码随想录第34天:动态规划7(打家劫舍问题:链式、环式、树式房屋)
一、背包问题小结 1.递推公式: 1.问能否能装满背包(或者最多装多少):dp[j] max(dp[j], dp[j - nums[i]] nums[i]) 2.问装满背包有几种方法:dp[j] dp[j - nums[i]] 3.问背包装满最大价值:dp[j] max…...
网络安全自动化:找准边界才能筑牢安全防线
数字时代,企业每天要面对成千上万的网络攻击。面对庞大的服务器群、分散的团队和长期不重启的设备,很多企业开始思考:哪些安全操作适合交给机器自动处理?哪些必须由人工把关?今天我们就用大白话聊聊这件事。 一、这些事…...
ctfshow——web入门361~368
最近练习ssti 当 Web 应用程序使用模板引擎动态生成 HTML 页面或其他类型的输出时,如果用户输入未经过充分验证或转义就被直接嵌入到模板中,就可能发生 SSTI 攻击。攻击者可以利用这个弱点注入恶意模板代码,该代码将在服务器端执行。 常见的…...
备忘录模式(Memento Pattern)
🧠 备忘录模式(Memento Pattern) 备忘录模式 是行为型设计模式之一。它通过将对象的状态存储在一个备忘录中,允许对象在不暴露其内部结构的情况下,保存和恢复自己的状态。该模式允许将对象的状态保存到备忘录中&#…...
五一假期作业
sub_process.c #include <stdio.h> // 标准输入输出库 #include <pthread.h> // POSIX线程库 #include <sys/ipc.h> // IPC基础定义(如消息队列/共享内存) #include <sys/msg.h> // 消息队列操作相关…...
Multi Agents Collaboration OS:专属多智能体构建—基于业务场景流程构建专属多智能体
背景 随着人工智能技术的飞速发展,大型语言模型(LLM)的能力不断突破,单一智能体的能力边界逐渐显现。为了应对日益复杂的现实世界任务,由多个具备不同能力、可以相互协作的智能体组成的多智能体系统 (Multi-Agent Sys…...
数据库的二级索引
二级索引 10.1 二级索引作为额外的键 表结构 正如第8章提到的,二级索引本质上是包含主键的额外键值对。每个索引通过B树中的键前缀来区分。 type TableDef struct {// 用户定义的部分Name stringTypes []uint32 // 列类型Cols []string // 列名Indexes …...
湖北理元理律师事务所:债务法律服务的民生价值重构
当前我国居民杠杆率达62.3%(央行2023年数据),债务问题已从经济议题演变为社会议题。湖北理元理律师事务所通过构建覆盖咨询、备案、规划的全链条服务,试图在法律框架内探索债务危机的社会化解决方案。 民生导向的服务设计 1.阶梯…...
DotNetBrowser 3.2.0 版本发布啦!
包含来自 Chromium 135 的安全修复支持自定义用户代理客户端提示(User Agent Client Hints)在 Avalonia 离屏渲染模式中支持拖放(Drag & Drop)功能 🔗 点击此处了解更多详情。 🆓 免费试用 30 天。...
PyTorch 张量与自动微分操作
笔记 1 张量索引操作 import torch # 下标从左到右从0开始(0->第一个值), 从右到左从-1开始 # data[行下标, 列下标] # data[0轴下标, 1轴下标, 2轴下标] def dm01():# 创建张量torch.manual_seed(0)data torch.randint(low0, high10, size(4, 5))print(data->,…...
C语言数据在内存中的存储详解
在 C 语言的编程世界里,理解数据在内存中的存储方式是非常重要的,它能帮助我们更好地掌握数据类型、内存管理和程序性能优化等内容。今天,我就来给大家详细讲解数据在内存中的存储,包括整数、大小端字节序和浮点数的存储方式&…...
【AI大模型】SpringBoot整合Spring AI 核心组件使用详解
目录 一、前言 二、Spring AI介绍 2.1 Spring AI介绍 2.2 Spring AI主要特点 2.3 Spring AI核心组件 2.4 Spring AI应用场景 2.5 Spring AI优势 2.5.1 与 Spring 生态无缝集成 2.5.2 模块化设计 2.5.3 简化 AI 集成 2.5.4 支持云原生和分布式计算 2.5.5 安全性保障…...
linux-文件操作
在 Linux 系统中,文件操作与管理是日常使用和系统管理的重要组成部分。下面将详细介绍文件的复制、移动、链接创建,以及文件查找、文本处理、排序、权限管理等相关知识。 一、文件的复制 在 Linux 里,cp 命令可用于复制文件或目录ÿ…...
丢失的数字 --- 位运算
目录 一:题目 二:算法原理 三:代码实现 一:题目 题目链接: 268. 丢失的数字 - 力扣(LeetCode) 二:算法原理 三:代码实现 class Solution { public:int missingNumb…...
从Rtos到Linux:学习的策略
这里目的只是为了学习,哪天工作需要用上了能更顺利的上手,写文章的目的是为了记录和便于查询。工作的前两年主要是以mcu裸机为主,目的是压缩资源以最少的ram和flash实现最多的功能,后来五年做的东西越来越复杂的跑的rtosÿ…...
BUUCTF——Mark loves cat
BUUCTF——Mark loves cat 进入靶场 简单的看了一下功能点 扫一下目录吧 扫目录发现一个.git 下一下源码看看 找到个flag.php和index.php <?php$flag file_get_contents(/flag);再看看index.php(代码有点长,所以只留了后面有用的) &…...
C/C++滑动窗口算法深度解析与实战指南
C/C滑动窗口算法深度解析与实战指南 引言 滑动窗口算法是解决数组/字符串连续子序列问题的利器,通过动态调整窗口边界,将暴力解法的O(n)时间复杂度优化至O(n)。本文将系统讲解滑动窗口的核心原理、C/C实现技巧及经典应用场景,助您掌握这一高…...
Webug4.0靶场通关笔记15- 第19关文件上传(畸形文件)
目录 第19关 文件上传(畸形文件) 1.打开靶场 2.源码分析 (1)客户端源码 (2)服务器源码 3.渗透实战 (1)构造脚本 (2)双写绕过 (3)访问脚本 本文通过《…...
黑马点评大总结
8.2.1 短信登录 首先是用户提交手机号,后端将生成的验证码以及用户信息存入session中,用户登录时进行拦截并从session中拿出来信息校验,并把用户信息存入ThreadLocal中session共享问题:每个tomcat有自己的一份session,…...
LeetCode:返回倒数第k个结点
1、题目描述 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 注意:本题相对原题稍作改动 示例: 输入: 1->2->3->4->5 和 k 2 输出: 4 说明: 给定的 k 保证是有效的。 2、…...
zotero pdf中英翻译插件使用
最近发现一个pdf中英翻译的神器zotero-pdf2zh,按照官方安装教程走一遍的时候,发现一些流程不清楚的问题, 此文就是整理一些安装需要的文件以及遇到的问题: 相关文件下载地址 Zotero 是一款免费的、开源的文献管理工具࿰…...
Java后端程序员学习前端之CSS
什么是css Cascading Style Sheet 层叠级联样式表 表现 (美化网页) 字体,颜色,边距,高度,宽度,背景图片,网页定位,网页浮动.. 发展史 CSS1.0 CSS2.0 DIV(块)CSS,HTML与CSS结构分离…...
MySQL——数据库基础操作
学习MySQL之前,要先配置好相关环境与软件下载,怎么就不展开了:找找网上对应环境下的教程即可 目录 数据库与MySQL 案例使用 MySQL架构 SQL指令分类 储存引擎 库操作 创建数据库 编码集与校验规则 校验规则的影响 删除数据库 数…...
[低代码 + AI] 明道云与 Dify 的三种融合实践方式详解
随着低代码平台和大语言模型工具的不断发展,将企业数据与智能交互能力融合,成为提高办公效率与自动化水平的关键一步。明道云作为一款成熟的低代码平台,Dify 则是一个支持自定义工作流的开源 LLM 应用框架。两者结合,可以实现灵活、高效的智能化业务处理。 本文将详解明道…...
湖北理元理律师事务所:规模化债事服务的探索与实践
在个人债务问题日益普遍化的当下,如何通过合法、系统化的服务帮助债务人化解危机,成为法律服务业的重要课题。湖北理元理律师事务所作为经国家司法局批准设立的债事服务机构,其构建的“法律技术金融”服务模式,为债务优化领域提供…...
MySQL JOIN详解:掌握数据关联的核心技能
一、为什么需要JOIN? 在关系型数据库中,数据通常被拆分到不同的表中以提高存储效率。当我们需要从多个表中组合数据时,JOIN操作就成为了最关键的技能。通过本文,您将全面掌握MySQL中7种JOIN操作,并学会如何在实际场景中…...
深入浅出数据库规范化的三大范式
数据库的“成长之路”:从1NF到3NF的规范化进化 在数据库的世界里,关系模式就像一个“孩子”,需要一步步学习“规矩”,才能健康成长。今天,我们就来聊聊数据库的规范化历程——从第一范式(1NF)出…...
精益数据分析(39/126):SaaS与移动应用商业模式的关键要点剖析
精益数据分析(39/126):SaaS与移动应用商业模式的关键要点剖析 在创业和数据分析的探索之旅中,每一次深入研究不同的商业模式都是一次宝贵的学习机会。今天,依旧怀揣着与大家共同进步的期望,深入解读《精益…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.3 数据脱敏与安全(模糊处理/掩码技术)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL数据脱敏实战:从模糊处理到动态掩码的全流程解析4.3 数据脱敏与安全:模糊处理与掩码技术深度实践4.3.1 数据脱敏的核心技术体系4.3.1.1 技…...
nginx面试题
nginx 返回状态码413 Nginx 状态码 413 表示“请求实体过大”(Request Entity Too Large),意味着客户端发送的请求体大小超过了服务器允许的限制。 解决方法 修改 Nginx 配置文件: 找到 Nginx 配置文件,通常位于 /etc…...
flink rocksdb状态说明
文章目录 1.默认情况2.flink中的状态3.RocksDB4.对比情况5.使用6.RocksDB架构7.参考文章8.总结提示:以下主要考虑flink 状态永久存储 rocksdb情况,做一些简单说明 1.默认情况 当flink使用rocksdb存储状态时。无论是永久存储还是临时存储都可能会落盘写文件(如果没有配置存储…...