嵌入式Python、决策树算法、SQLite、Flask、树莓派、机器学习:基于算法自主决策的智能家居系统(代码示例)

项目概述

随着物联网技术的快速发展,智能家居系统越来越普及,成为现代家庭生活的重要组成部分。本文将介绍一个基于Raspberry Pi和Arduino的智能家居算法控制系统的硬件平台。该系统能够通过传感器采集环境数据,并利用机器学习算法进行分析与控制,从而实现智能化的家居管理。

系统设计

硬件架构

智能家居控制系统的硬件平台主要由以下几个部分组成:

  • 主控制器:Raspberry Pi
  • 辅助控制器:Arduino
  • 传感器
    • 温度传感器(如DHT22)
    • 湿度传感器(如DHT22)
    • 光照传感器(如BH1750)
  • 执行器
    • 恒温器(智能恒温器模块)
    • 加湿器(继电器控制的加湿器)
    • 灯光控制(智能灯泡或通过继电器控制的灯)

硬件平台及功能

  • Raspberry Pi

    • 功能:作为主控制器,负责运行机器学习算法和管理传感器及家居设备。
    • 优点:计算能力强,支持多种编程语言和库,具有丰富的I/O接口。
  • Arduino

    • 功能:作为辅助控制器或传感器数据采集节点。
    • 优点:低功耗,易于与传感器和执行器集成。

软件技术栈

  • 操作系统:Raspberry Pi OS(基于Debian的Linux发行版)

  • 编程语言

    • Python:主要用于算法实现和系统集成。
  • 机器学习库

    • scikit-learn:用于实现决策树和随机森林算法。
    • NumPy 和 Pandas:用于数据处理和分析。
  • 传感器和设备控制库

    • Adafruit_DHT:用于读取DHT22传感器数据。
    • RPi.GPIO:用于控制Raspberry Pi的GPIO引脚,管理执行器。
    • pyserial:用于与Arduino通信(如果使用Arduino作为辅助控制器)。
  • 数据存储和处理

    • SQLite 或 InfluxDB:用于存储传感器数据和系统日志。
    • pandas:用于数据处理和分析。
  • 通信协议

    • MQTT:用于设备间通信,特别是在智能家居系统中。
    • HTTP/REST:用于与其他智能家居设备或服务通信。
  • Web界面和API

    • Flask 或 Django:用于创建Web API和管理界面。
    • Bootstrap:用于前端界面设计。

系统架构图

硬件端代码实现

接下来,我们将展示一些关键的代码实现,并提供详细的注释以方便读者理解。

1. 温湿度传感器数据采集

import Adafruit_DHT
import time# 设置传感器类型和GPIO引脚
sensor = Adafruit_DHT.DHT22
pin = 4def read_sensor():# 读取温湿度数据humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)if humidity is not None and temperature is not None:print(f'Temperature = {temperature:.1f}°C, Humidity = {humidity:.1f}%')else:print('Failed to retrieve data from humidity sensor')while True:read_sensor()time.sleep(2)  # 每2秒读取一次

代码说明

  • 导入Adafruit_DHT库用于读取DHT22传感器数据。
  • 使用read_retry方法读取温度和湿度数据,并在控制台打印结果。

2. 控制执行器

import RPi.GPIO as GPIO
import time# 设置GPIO引脚
HEATER_PIN = 17  # 设定加热器连接的GPIO引脚
LIGHT_PIN = 27   # 设定灯光控制的GPIO引脚# GPIO引脚模式设置
GPIO.setmode(GPIO.BCM)
GPIO.setup(HEATER_PIN, GPIO.OUT)
GPIO.setup(LIGHT_PIN, GPIO.OUT)def control_heater(state):"""控制加热器的状态"""if state:GPIO.output(HEATER_PIN, GPIO.HIGH)  # 加热器开启print("加热器已开启")else:GPIO.output(HEATER_PIN, GPIO.LOW)   # 加热器关闭print("加热器已关闭")def control_light(state):"""控制灯光的状态"""if state:GPIO.output(LIGHT_PIN, GPIO.HIGH)   # 灯光开启print("灯光已开启")else:GPIO.output(LIGHT_PIN, GPIO.LOW)    # 灯光关闭print("灯光已关闭")try:while True:# 示例:根据温度条件控制加热器和灯光current_temp = 25  # 假设当前温度为25°C,实际应由传感器读取if current_temp < 22:control_heater(True)  # 温度低于22°C,开启加热器else:control_heater(False)  # 温度高于22°C,关闭加热器# 假设光照条件,光照强度为300lxlight_intensity = 300  # 实际应由光照传感器读取if light_intensity < 200:control_light(True)  # 光照强度低于200lx,开启灯光else:control_light(False)  # 光照强度高于200lx,关闭灯光time.sleep(5)  # 每5秒检查一次状态except KeyboardInterrupt:print("程序已终止")
finally:GPIO.cleanup()  # 清理GPIO状态

代码说明

  • 我们使用RPi.GPIO库来控制GPIO引脚。
  • HEATER_PIN 和 LIGHT_PIN 分别指定了加热器和灯光控制的GPIO引脚。
  • control_heater 和 control_light 函数根据输入的状态控制加热器和灯光的开关状态,并打印相关信息。
  • 在主循环中,假设温度和光照强度由传感器读取,基于这些数据控制相应的设备。

 

3. 机器学习算法实现

在智能家居系统中,我们可以使用机器学习算法来预测和优化家居环境。下面是使用scikit-learn库实现简单的决策树模型的示例代码。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score# 假设我们有一个环境数据集
data = {'Temperature': [22, 20, 25, 19, 30, 28],'Humidity': [30, 35, 40, 50, 55, 60],'Light': [100, 150, 200, 250, 300, 350],'Heater_On': [1, 0, 1, 0, 1, 1]  # 1表示开启,0表示关闭
}df = pd.DataFrame(data)# 特征和标签
X = df[['Temperature', 'Humidity', 'Light']]
y = df['Heater_On']# 数据集分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建决策树模型
model = DecisionTreeClassifier()
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f'模型准确率: {accuracy:.2f}')

代码说明

  • 我们创建了一个简单的环境数据集,包含温度、湿度、光照强度等特征和加热器的开关状态。
  • 使用train_test_split将数据集分为训练集和测试集,构建决策树模型,并对测试集进行预测。
  • 最后,我们使用accuracy_score来评估模型的准确率,并打印结果。该模型的准确率可以帮助我们了解算法在预测加热器状态方面的有效性。

数据存储和处理实现

1. 使用SQLite存储传感器数据

在智能家居系统中,使用SQLite可以方便地存储和查询传感器数据。以下是一个示例代码,展示如何创建SQLite数据库、创建表格以及插入和查询数据。

import sqlite3
import time# 创建或连接到SQLite数据库
conn = sqlite3.connect('smart_home.db')
cursor = conn.cursor()# 创建传感器数据表
cursor.execute('''
CREATE TABLE IF NOT EXISTS sensor_data (id INTEGER PRIMARY KEY AUTOINCREMENT,timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,temperature REAL,humidity REAL,light REAL
)
''')def insert_sensor_data(temperature, humidity, light):"""插入传感器数据到数据库"""cursor.execute('''INSERT INTO sensor_data (temperature, humidity, light)VALUES (?, ?, ?)''', (temperature, humidity, light))conn.commit()def query_sensor_data():"""查询所有传感器数据"""cursor.execute('SELECT * FROM sensor_data')rows = cursor.fetchall()for row in rows:print(row)try:while True:# 假设这些数据是从传感器读取的temperature = 22.5  # 示例温度humidity = 45.0     # 示例湿度light = 300.0       # 示例光照强度# 插入传感器数据insert_sensor_data(temperature, humidity, light)# 查询并打印传感器数据print("当前传感器数据:")query_sensor_data()time.sleep(10)  # 每10秒读取一次数据except KeyboardInterrupt:print("程序已终止")
finally:conn.close()  # 关闭数据库连接

代码说明

  • 我们使用sqlite3库创建一个名为smart_home.db的数据库。
  • 创建一个名为sensor_data的表,包含ID、时间戳、温度、湿度和光照等字段。
  • insert_sensor_data函数用于将传感器数据插入到数据库中。
  • query_sensor_data函数用于查询并打印所有传感器数据。
  • 在主循环中,假设温度、湿度和光照强度是从传感器读取的,并定期将这些数据存入数据库。

2. 使用Pandas进行数据处理和分析

在存储数据后,我们可以使用Pandas进行数据分析。以下是一个示例代码,展示如何从SQLite数据库中读取数据,并使用Pandas进行分析。

import pandas as pd
import sqlite3# 连接到SQLite数据库
conn = sqlite3.connect('smart_home.db')# 从数据库中读取数据到Pandas DataFrame
df = pd.read_sql_query('SELECT * FROM sensor_data', conn)# 关闭数据库连接
conn.close()# 数据分析示例
print("传感器数据概览:")
print(df.head())  # 显示前5行数据# 计算温度和湿度的平均值
average_temperature = df['temperature'].mean()
average_humidity = df['humidity'].mean()
average_light = df['light'].mean()print(f"平均温度: {average_temperature:.2f}°C")
print(f"平均湿度: {average_humidity:.2f}%")
print(f"平均光照: {average_light:.2f}lx")# 绘制温度变化图
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)
df['temperature'].plot(title='温度变化图', ylabel='温度 (°C)', xlabel='时间')# 显示图形
import matplotlib.pyplot as plt
plt.show()

代码说明

  • 通过pandasread_sql_query函数从SQLite数据库中读取传感器数据,并存入DataFrame中。
  • 使用head()方法查看数据的前五行。
  • 计算传感器数据中的平均温度、湿度和光照强度,并打印结果。
  • 使用matplotlib绘制温度变化图,展示随时间变化的温度数据。

Web 界面和 API 实现

1. 使用 Flask 创建 Web API 和管理界面

Flask 是一个轻量级的 Web 应用程序框架,非常适合快速构建 Web API 和管理界面。以下是一个简单的 Flask 应用程序示例,展示如何创建 API 接口以获取传感器数据,以及如何使用 HTML 页面展示数据。

1.1 安装 Flask

如果尚未安装 Flask,可以使用以下命令安装:

pip install Flask
1.2 Flask 应用程序代码
from flask import Flask, jsonify, render_template
import sqlite3app = Flask(__name__)# 连接到 SQLite 数据库
def get_db_connection():conn = sqlite3.connect('smart_home.db')conn.row_factory = sqlite3.Row  # 使得查询结果以字典形式返回return conn@app.route('/api/sensor_data', methods=['GET'])
def get_sensor_data():"""API 接口,返回传感器数据的 JSON 格式"""conn = get_db_connection()cursor = conn.cursor()cursor.execute('SELECT * FROM sensor_data')rows = cursor.fetchall()conn.close()# 将查询结果转换为字典列表sensor_data = []for row in rows:sensor_data.append({'id': row['id'],'timestamp': row['timestamp'],'temperature': row['temperature'],'humidity': row['humidity'],'light': row['light']})return jsonify(sensor_data)  # 返回 JSON 格式的数据@app.route('/')
def index():"""主页面,展示传感器数据"""conn = get_db_connection()cursor = conn.cursor()cursor.execute('SELECT * FROM sensor_data ORDER BY timestamp DESC LIMIT 10')  # 获取最新的10条数据rows = cursor.fetchall()conn.close()return render_template('index.html', data=rows)if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)  # 运行 Flask 应用
1.3 HTML 模板

在项目根目录下创建一个名为 templates 的文件夹,并在其中创建 index.html 文件,用于展示传感器数据的网页界面。

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>智能家居传感器数据</title><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body><div class="container"><h1 class="mt-5">智能家居传感器数据</h1><table class="table table-bordered mt-3"><thead><tr><th>ID</th><th>时间戳</th><th>温度 (°C)</th><th>湿度 (%)</th><th>光照 (lx)</th></tr></thead><tbody>{% for row in data %}<tr><td>{{ row['id'] }}</td><td>{{ row['timestamp'] }}</td><td>{{ row['temperature'] }}</td><td>{{ row['humidity'] }}</td><td>{{ row['light'] }}</td></tr>{% endfor %}</tbody></table></div>
</body>
</html>

代码说明

  • Flask 应用程序

    • get_db_connection 函数用于连接到 SQLite 数据库并返回连接对象。
    • /api/sensor_data 路由提供 API 接口,返回所有传感器数据的 JSON 格式。
    • / 路由返回主页面,展示最新的传感器数据。
  • HTML 页面

    • 使用 Bootstrap 框架简化网页设计,使其具有良好的响应式布局。
    • 通过 Jinja2 模板引擎将数据库中的传感器数据动态插入到 HTML 表格中。

2. 启动 Flask 应用程序

在终端中运行以下命令启动 Flask 应用程序:

python app.py

然后,您可以在浏览器中访问 http://localhost:5000 来查看智能家居传感器数据的管理界面。您将看到一个表格,展示最新的传感器数据,包括温度、湿度和光照强度等信息。通过这个简单的 Web 界面,用户可以方便地查看实时的环境数据。

3. 测试 API 接口

您还可以通过访问 API 接口来获取传感器数据的 JSON 格式。在浏览器中访问 http://localhost:5000/api/sensor_data,您将看到类似如下的 JSON 数据格式:

[{"id": 1,"timestamp": "2024-07-27 10:00:00","temperature": 22.5,"humidity": 45.0,"light": 300.0},{"id": 2,"timestamp": "2024-07-27 10:05:00","temperature": 23.0,"humidity": 40.0,"light": 320.0}// 更多数据...
]

4. 整合 Flask 和前端

为了更好地整合 Flask 应用程序与前端界面,您可以进一步扩展功能,例如添加按钮来控制执行器,或通过 AJAX 请求实时更新数据。以下是如何使用 AJAX 来实现自动更新传感器数据的示例。

4.1 修改 HTML 模板以支持 AJAX

在 index.html 文件中,添加以下 JavaScript 代码以实现定时刷新传感器数据:

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>function fetchSensorData() {$.getJSON('/api/sensor_data', function(data) {var tbody = '';$.each(data, function(index, row) {tbody += '<tr>';tbody += '<td>' + row.id + '</td>';tbody += '<td>' + row.timestamp + '</td>';tbody += '<td>' + row.temperature + '</td>';tbody += '<td>' + row.humidity + '</td>';tbody += '<td>' + row.light + '</td>';tbody += '</tr>';});$('tbody').html(tbody);  // 更新表格内容});}$(document).ready(function() {fetchSensorData();  // 页面加载时获取数据setInterval(fetchSensorData, 10000);  // 每10秒刷新数据});
</script>

代码说明

  • 使用 jQuery 的 $.getJSON 方法从 /api/sensor_data 接口获取最新的传感器数据,并动态更新表格内容。
  • setInterval 方法用于每隔 10 秒自动调用 fetchSensorData 函数,从而实现实时数据更新。

项目总结

本项目展示了一个基于Raspberry Pi和Arduino的智能家居算法控制系统,结合了传感器数据采集、机器学习模型应用、数据存储与处理、以及Web界面和API的构建。通过这一系统,我们能够实现对家庭环境的智能监控与管理,提升生活的便利性和舒适度。

关键要点

  1. 硬件平台

    • Raspberry Pi 作为主控制器,负责数据处理和设备管理,具有强大的计算能力和丰富的I/O接口。
    • Arduino 作为辅助控制器,低功耗并易于与多种传感器和执行器集成,增强了系统的灵活性。
  2. 传感器与执行器

    • 系统整合了多种传感器,如温度传感器(DHT22)、湿度传感器、光照传感器等,实时采集环境数据。
    • 执行器部分包括加热器、灯光控制和加湿器等,能根据传感器数据智能化地调节家庭环境。
  3. 数据存储与处理

    • 使用 SQLite 数据库存储传感器数据和系统日志,便于后续数据分析和管理。
    • 利用 Pandas 进行数据分析,方便地计算平均值、绘制数据变化图等,帮助用户理解环境变化。
  4. Web 界面与 API

    • 通过 Flask 框架构建了一个简洁的Web接口,提供了动态数据展示和API访问,用户可通过浏览器实时监控家居环境。
    • HTML 前端使用 Bootstrap 框架设计,使得界面美观且响应式,增强用户体验。
  5. 机器学习应用

    • 采用 scikit-learn 实现机器学习模型(如决策树),对环境数据进行分析和预测,提升系统智能化水平,从而优化设备的控制策略。

未来展望

本项目具备良好的扩展性,未来可以考虑以下方向的改进和增强:

  • 设备控制优化:结合更多的机器学习算法(如随机森林或神经网络)进行更复杂的环境预测和设备控制策略。
  • 用户管理系统:实现用户登录和权限管理,支持多用户环境下的个性化设置。
  • 移动应用开发:为用户开发手机应用,便于远程监控和控制家居设备。
  • IoT 集成:与其他智能家居平台(如Amazon Alexa、Google Home等)进行集成,实现语音控制功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3269570.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 资源 之 Pop It 3D 解压玩具与双人AI游戏 Unity 资源包分享

精彩呈现&#xff1a;Pop It 3D 解压玩具与双人AI游戏 Unity 资源包分享 一、Pop It 3D 解压玩具的魅力二、双人游戏的互动乐趣三、Unity 游戏资源包的优势四、如何获取资源包 亲爱的游戏爱好者们&#xff0c;今天为大家带来一款令人兴奋的游戏资源——Pop It 3D 解压玩具双人带…

VMware虚拟机中CentOS7自定义ip地址并且固定ip

配置固定ip(虚拟机) 前提&#xff1a;虚拟机网络配置成&#xff0c;自定义网络并选择VMnet8(NAT 模式) 操作(如下图)&#xff1a;点击虚拟机–》设置–》–》硬件–》网络适配器–》自定义&#xff1a;特定虚拟网络–》选择&#xff1a;VMnet8(NAT 模式) 虚拟机网络设置 需要记…

数据分析中常用的数据分析工具

在数据分析中&#xff0c;常用的数据分析工具种类繁多&#xff0c;它们各自具有不同的特点和优势&#xff0c;适用于不同的数据分析场景和需求。以下是一些常用的数据分析工具分类及具体介绍&#xff1a; 一、Excel生态工具 Excel是微软开发的一款电子表格软件&#xff0c;广…

【最接近原点的 K 个点】python刷题记录

R2-排序算法 有点像快速排序 快排&#xff1f;根本不用 class Solution:def kClosest(self, points: List[List[int]], k: int) -> List[List[int]]:#直接按照欧几里得距离排序points.sort(keylambda x:sqrt(x[0]**2x[1]**2))ret[]for i in range(k):ret.append(points[i]…

NLP-使用Word2vec实现文本分类

Word2Vec模型通过学习大量文本数据&#xff0c;将每个单词表示为一个连续的向量&#xff0c;这些向量可以捕捉单词之间的语义和句法关系。本文做文本分类是结合Word2Vec文本内容text&#xff0c;预测其文本标签label。以下使用mock商品数据的代码实现过程过下&#xff1a; 1、…

干货|永久免费SSL证书申请——七步实现网站HTTPS

在数字化时代&#xff0c;网站的安全性成为了衡量其专业性和可信度的重要标准之一。启用HTTPS协议&#xff0c;即通过安装SSL证书&#xff0c;可以确保数据在用户浏览器和服务器之间传输时的加密性&#xff0c;保护用户隐私和数据安全。对于个人博客、小型企业或预算有限的组织…

最佳CEO的钱袋子道出了哪些财富密码?

被贴上“华尔街史上经营最成功的基金经理人之一”、“投资天才”等标签的迈克尔斯坦哈特曾说过&#xff1a;保持相对机敏&#xff0c;要随时研究可能带来财富的一切领域&#xff0c;要比别人更早感知大势的变化。 但问题是&#xff0c;其中的“可能带来财富的一切领域”又该如…

Ubuntu18中MySQL的安装

文章目录 一、背景说明二、安装步骤2.1、安装包的获取2.2、解压并移动2.3、创建用户和用户组2.4、给数据目录赋权限2.5、配置my.conf2.6、初始化MySQL2.7、启动MySQL服务2.8、修改root用户密码2.9、创建外网访问用户2.10、设置开机启动 三、问题3.1、如何查看用户组和用户&…

【C++刷题】优选算法——队列+宽搜

N 叉树的层序遍历 vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if (root nullptr) return ret;queue<Node*> q;q.push(root);ret.push_back({root->val});int size 1;while (!q.empty()) {vector<int> v…

深入解读 Java 中的 `StringUtils.isNotBlank` 与 `StringUtils.isNotEmpty`

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

Windows Server搭建局域网NTP时间服务器与客户端通实现

1.服务器环境&#xff1a; win11更改注册表 winR输入regedit win11更改注册表 winR输入regedit 2.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config&#xff0c;找到Config目录&#xff0c;双击Config目录下的AnnounceFlags&#xff0c;设为5。 3.HKEY_L…

简单几步,教你使用scikit-learn做分类和回归预测

经常听到初学python的小伙伴在抱怨&#xff0c;python安装第三方库太慢&#xff0c;很容易失败报错&#xff0c;如果安装pandas、tensorflow这种体积大的库&#xff0c;简直龟速。 为什么pip会很慢&#xff1f; 先来了解下pip&#xff0c;pip是一个非常流行的python包管理工具…

C语言数组练习--扫雷

一.游戏规则 扫雷的基本规则&#xff1a; 点击方格&#xff0c;如果是地雷&#xff0c;游戏失败&#xff1b;找到所有方格而不踩到地雷则游戏胜利。左键翻开方格&#xff0c;右键标记地雷。双击左键&#xff08;或者左右键一起点&#xff09;可以看到数字的可点击范围。数字表示…

Temu卖家必读:测评补单策略,提升销量与转化率!

拼多多旗下的跨境电商平台Temu&#xff0c;凭借其独特的广告和低价策略&#xff0c;迅速在美国市场站稳脚跟&#xff0c;并在欧美市场取得初步成功后&#xff0c;马不停蹄地迈向了更广阔的海外市场。去年七月&#xff0c;Temu正式进军亚洲市场&#xff0c;日本与韩国成为其首批…

redis:清除缓存的最简单命令示例

清除redis缓存命令(执行命令列表见截图) 1.打开cmd窗口&#xff0c;并cd进入redis所在目录 2.登录redis redis-cli 3.查询指定队列当前的记录数 llen 队列名称 4.清除指定队列所有记录 ltrim 队列名称 1 0 5.再次查询&#xff0c;确认队列的记录数是否已清除

MySQL练习(5)

作业要求&#xff1a; 实现过程&#xff1a; 一、触发器 &#xff08;1&#xff09;建立两个表&#xff1a;goods&#xff08;商品表&#xff09;、orders&#xff08;订单表&#xff09; &#xff08;2&#xff09;在商品表中导入商品记录 &#xff08;3&#xff09;建立触发…

Milvus × RAG助力快看多业务应用

快看介绍 快看漫画创办于2014年&#xff0c;集漫画阅读、创作互动、线下漫画沉浸体验、周边衍生品购买等体验于一体&#xff0c;是年轻人的一站式漫画生活方式平台。截止到2023年底&#xff0c;快看总用户超过3.8亿&#xff0c;在中国漫画市场渗透率超过50%。经过9年的创作者生…

Linux:文件管理(文件信息、文件类型、访问权限、文件压缩和解压、文件查找)

文件管理 (1)查看文件信息 查看文件的权限&#xff08;读写和执行&#xff09;、文件所属用户和文件所属组、文件大小、文件创建时间、文件名称等 ls -lahF l表示文件属性&#xff1b;F表示目录后面添加/&#xff1b;a表示显示隐藏的文件&#xff1b;h表示以友好的方式显示文件…

GLSL教程 第4章:编写第一个片段着色器

目录 4.1 片段着色器的作用 4.2 片段输出和颜色 4.3 编写第一个片段着色器的步骤 4.4 实际应用和调试 小结 在本章中&#xff0c;我们将学习如何编写一个基本的片段着色器。片段着色器是图形管线中的关键阶段&#xff0c;负责处理图形渲染中的每个像素&#xff08;即片段&…

【图论】Bellman-Ford

算法-Bellman-Ford 前置知识 图论 思路 Bellman-Ford 是一种单源最短路算法&#xff0c;可以得到一个不含有负环的图上由一个点出发的最短路&#xff08;即单源最短路&#xff09;。 我们记录 d d d 数组为距离数组。 每次我们遍历每一条边 ( u , v , w ) (u,v,w) (u,v,w)&…