当前位置: 首页 > news >正文

模拟频谱分析仪(Linux c++ Qt)

        此Demo由三个小项目组成,分布是模拟的硬件采集频谱数据端,后台处理端以及qt前端,于Linux系统下进行开发,使用的软件为clion和QtCreator,编程语言为c++,使用了linux下的boost库(1.72),多线程和TCP,UDP以及c++的一些新特性,为本人自己想的练手的小项目.

1.项目架构

        整体设计采集端不断产生数据,通过udp广播给后台处理端,后台处理端将数据通过tcp传给qt前端,而控制指令由qt前端通过udp传给采集端(理论上应该是qt前端到后台处理端再传给采集端(作者偷懒了,直接前端连接采集端)[后续也可以封装自己独特的通讯协议]


2.运行结果

模拟硬件采集频谱数据端运行结果:

 后台处理端运行结果:

  qt前端运行结果:

 

3.实现过程

        a.模拟硬件采集端实现

        项目结构如图:

 

        整个项目使用Cmake进行管理,结果清晰.

        config.h为配置文件,定义了udp端口地址以及频谱相关的参数, 方便更改代码如下,其中的关键字constexpr可以在编译时进行求值,能提高程序运行效率

//配置文件#ifndef FPGADEMO_CONFIG_H
#define FPGADEMO_CONFIG_H#include <cstdlib> //c++头文件  主要用于定义一些常量 关键字constexpr 可以在编译时进行求职 提高程序运行效率//UDP广播配置
constexpr u_int16_t Udp_BroadCasT_Port = 8888;   //udp端口号  广播端口用于在网络中向所有设备发送消息。
constexpr const char * Udp_BroadCast_IP = "255.255.255.255"; //定义了 UDP 广播的 IP 地址,值为 "255.255.255.255",这是一个特殊的 IP 地址,表示向本地网络中的所有设备发送广播消息//控制端口配置
constexpr u_int16_t Udp_Config_Port = 8889; //控制端口用于接收和处理控制命令//数据配置/*Sample_Rate:定义了采样率,值为 44100 Hz。采样率表示每秒对信号进行采样的次数,44100 Hz 是音频处理中常用的采样率。FFT_Size:定义了快速傅里叶变换(FFT)的大小,值为 1024。FFT 是一种用于将时域信号转换为频域信号的算法,FFT 大小决定了频域分辨率。Data_Interval_Ms:定义了数据发送的时间间隔,单位为毫秒,值为 20 毫秒。这个参数用于控制数据发送的频率。Spectrum_Size:定义了频谱数据的大小,值为 FFT_Size / 2。在 FFT 变换中,频谱数据的有效部分通常是 FFT 结果的一半。* */
constexpr int Sample_Rate = 44100; //采样率
constexpr int FFT_Size = 1024;  //FFT大小
constexpr int Data_Interval_Ms = 20; //数据发送间隔
constexpr int Spectrum_Size = FFT_Size / 2; //频谱数据大小// 套接字重用配置
constexpr bool REUSE_ADDRESS = true;      // 允许地址重用 在网络编程中,地址重用允许在同一端口上同时绑定多个套接字,避免因端口被占用而导致的错误#endif //FPGADEMO_CONFIG_H

        logger.h是封装的一个打印日志的实例(另外一个博客中封装介绍了更好的版本)


#ifndef FPGADEMO_LOGGER_H
#define FPGADEMO_LOGGER_H#include <iostream>
#include <string>
#include <iomanip>  //输入输出流操作符库 用于格式化输出
#include <chrono>   //时间处理库英语获取当前时间 添加时间的时间戳/*** @brief 日志记录类,提供不同级别的日志输出功能** 使用单例模式确保全局唯一日志实例* 支持不同级别的日志输出:INFO, WARNING, ERROR* 自动添加时间戳和日志级别前缀*/
class Logger {
public:// 日志级别枚举enum class Level{INFO,WARNING,ERROR};// 获取单例实例static Logger& getInstance(){static Logger instance;return instance;}// 禁用拷贝和赋值,确保单例的正确性Logger(const Logger&) = delete;Logger& operator=(const Logger&) = delete;// 日志输出方法void log(Level level, const std::string& message){auto now = std::chrono::system_clock::now();auto now_time = std::chrono::system_clock::to_time_t(now);std::cout << "[" << std::put_time(std::localtime(&now_time), "%Y-%m-%d %H:%M:%S") << "] ";switch(level) {case Level::INFO: std::cout << "[INFO] "; break;case Level::WARNING: std::cout << "[WARNING] "; break;case Level::ERROR: std::cout << "[ERROR] "; break;}std::cout << message << std::endl;}private:Logger() = default; // 私有构造函数确保单例
};// 日志宏定义,方便使用
#define LOG_INFO(msg) Logger::getInstance().log(Logger::Level::INFO, msg)
#define LOG_WARNING(msg) Logger::getInstance().log(Logger::Level::WARNING, msg)
#define LOG_ERROR(msg) Logger::getInstance().log(Logger::Level::ERROR, msg)#endif //FPGADEMO_LOGGER_H

         data_generator类用于生成频谱数据

#ifndef FPGADEMO_DATA_GENERATOR_H
#define FPGADEMO_DATA_GENERATOR_H#include <vector>
#include <cstdint>
#include <random>
#include <mutex>
#include <boost/noncopyable.hpp>/*** @brief 模拟数据生成器,生成频谱数据*/class data_generator : private boost::noncopyable {public:data_generator();~data_generator() = default;/*** @brief 生成模拟频谱数据* @return 包含频谱数据的vector,大小为SPECTRUM_SIZE*/std::vector<float> generateSpectrumData();/*** @brief 设置基频* @param freq 基频频率(Hz)*/void setBaseFrequency(float freq);private:float baseFrequency;                 // 当前基频std::mt19937 rng;                    // 随机数生成器std::uniform_real_distribution<float> noiseDist; // 噪声分布std::mutex mutex_;                   // 保护基频的互斥锁
};#endif //FPGADEMO_DATA_GENERATOR_H

        udp_Brodcaster用于广播频谱数据以及接受前端发送的指令,接收和发送互不影响

//
// Created by Administrator on 2025/4/25.
//#ifndef FPGADEMO_UDPBROADCASTER_H
#define FPGADEMO_UDPBROADCASTER_H#include <vector>   //容器
// 包含 Boost.Asio 库的头文件,Boost.Asio 是一个跨平台的网络和底层 I/O 编程库,用于实现异步网络操作
#include <boost/asio.hpp>
// 包含 Boost.Thread 库的头文件,用于实现多线程编程
#include <boost/thread.hpp>
// 包含 Boost.Atomic 库的头文件,提供原子操作,可用于多线程环境下的同步
#include <boost/atomic.hpp>
//包含 Boost.Signals2 库的头文件,用于实现信号与槽机制,允许对象之间进行松耦合的通信
#include <boost/signals2.hpp>
#include "config.h"
/*** @brief UDP广播器类,负责发送频谱数据和接收控制命令** 使用Boost.Asio进行异步网络操作* 使用独立线程进行数据广播* 支持地址重用选项解决"Address already in use"问题*/
class UdpBroadcaster {
public:UdpBroadcaster();~UdpBroadcaster();/*** @brief 开始广播*/void startBroadcasting();/*** @brief 停止广播*/void stopBroadcasting();/*** @brief 设置要广播的数据* @param data 频谱数据*/void setBroadcastData(const std::vector<float>& data);/*** @brief 信号:当收到控制命令时触发*/// 定义一个信号,当收到控制命令时,会调用所有连接到这个信号的槽函数boost::signals2::signal<void(float)> onControlCommandReceived;private:void broadcastThread();               // 广播线程函数,用于在独立线程中进行数据广播void startReceiveControl();          // 开始接收控制命令,启动异步接收操作//处理接收到的控制指令的回调函数,当接收到控制指令命令时会被调用void handleControlCommand(const boost::system::error_code& error,std::size_t bytes_transferred);// Boost.Asio 的 I/O 服务对象,负责管理异步操作的事件循环boost::asio::io_service ioService_;// UDP 广播套接字,用于发送频谱数据boost::asio::ip::udp::socket broadcastSocket_;// UDP 控制套接字,用于接收控制命令boost::asio::ip::udp::socket controlSocket_;// 广播端点,指定广播数据的目标地址和端口boost::asio::ip::udp::endpoint broadcastEndpoint_;// 控制端点,指定接收控制命令的本地地址和端口boost::asio::ip::udp::endpoint controlEndpoint_;// 远程端点,记录发送控制命令的客户端地址和端口boost::asio::ip::udp::endpoint remoteEndpoint_;// 广播线程对象,用于执行广播线程函数boost::thread broadcastThread_;// I/O 服务线程对象,用于运行 I/O 服务的事件循环boost::thread ioServiceThread_;// 原子布尔变量,用于表示广播是否正在运行,可在多线程环境下安全访问boost::atomic<bool> running_;// 当前要广播的频谱数据,使用 vector 存储浮点数std::vector<float> currentData_;// 互斥锁,用于保护 currentData_ 的并发访问,确保线程安全boost::mutex dataMutex_;// 控制命令缓冲区,用于存储接收到的控制命令,大小为一个浮点数的字节数std::array<char, sizeof(float)> controlBuffer_;
};#endif //FPGADEMO_UDPBROADCASTER_H

         fpga_simulator拥有协调数据生成和广播,处理控制指令以及提供运行状态

#ifndef FPGADEMO_FPGASIMULATOR_H
#define FPGADEMO_FPGASIMULATOR_H
#include "data_generator.h"
#include "UdpBroadcaster.h"
#include "Logger.h"
/*** @brief FPGA模拟器主类** 负责协调数据生成和广播* 处理控制命令* 提供运行状态管理*/class FpgaSimulator {
public:FpgaSimulator();~FpgaSimulator();/*** @brief 运行模拟器*/void run();void stop();
private:data_generator dataGen_;              // 数据生成器UdpBroadcaster broadcaster_;         // UDP广播器boost::atomic<bool> running_;
};#endif //FPGADEMO_FPGASIMULATOR_H
        b.后台处理端实现

          项目结构如图:

        此部分也是Cmake进行管理,其中config,logger以及udp相关与上面的模拟端类似,不再说明

        tcpserver用于作为tcp的服务端,负责处理客户端连接和数据广播,线程池处理多个客户端以及提供连接断开事件通知

//
// Created by Administrator on 2025/4/30.
//#ifndef BACKEND_SERVER_TCPSERVER_H
#define BACKEND_SERVER_TCPSERVER_H#include <vector>
#include <set>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/signals2.hpp>
#include "config.h"
#include "Logger.h"
#include <boost/asio/post.hpp>  // Required for boost::asio::post
/*** @brief TCP服务器类** 处理客户端连接和数据广播* 使用线程池处理多个客户端* 提供连接/断开事件通知*/
class TcpServer {
public:using ClientConnectedCallback = std::function<void(boost::asio::ip::tcp::socket&)>;using ClientDisconnectedCallback = std::function<void(boost::asio::ip::tcp::socket&)>;TcpServer();~TcpServer();void start();void stop();void broadcastData(const std::vector<float>& data);void setClientConnectedCallback(ClientConnectedCallback callback);void setClientDisconnectedCallback(ClientDisconnectedCallback callback);private:void acceptThread();void startAccept();void handleAccept(boost::asio::ip::tcp::socket* socket,const boost::system::error_code& error);void clientHandler(boost::asio::ip::tcp::socket* socket);boost::asio::io_service ioService_;boost::asio::ip::tcp::acceptor acceptor_;boost::thread acceptThread_;boost::asio::thread_pool ioThreadPool_; //线程池boost::atomic<bool> running_;std::set<boost::asio::ip::tcp::socket*> clients_;boost::mutex clientsMutex_;ClientConnectedCallback clientConnectedCallback_;ClientDisconnectedCallback clientDisconnectedCallback_;const size_t threadPoolSize_ = 4;  // 显式存储线程池大小
};#endif //BACKEND_SERVER_TCPSERVER_H

         backendServer部分用于整和UDP接收和TCP服务功能,管理数据转发流程,

#ifndef BACKEND_SERVER_H
#define BACKEND_SERVER_H#include "UdpReceiver.h"
#include "TcpServer.h"
#include "Logger.h"
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <csignal>/*** @brief 后端服务器主类* * 整合UDP接收和TCP服务功能* 管理数据转发流程* 提供完整的生命周期管理*/
class BackendServer {
public:BackendServer();~BackendServer();void run();void stop();private:void onUdpDataReceived(const std::vector<float>& data);void onTcpClientConnected(boost::asio::ip::tcp::socket& socket);void onTcpClientDisconnected(boost::asio::ip::tcp::socket& socket);UdpReceiver udpReceiver_;TcpServer tcpServer_;std::vector<float> lastReceivedData_;boost::mutex dataMutex_;boost::atomic<bool> running_;
};#endif // BACKEND_SERVER_H
        c.qt前端实现

        项目结构如图:

        整个项目有qt的.pro文件进行管理(可以封装成qmake管理的形式)

        logger类负责日志打印不进行介绍

        spectrumwidget封装了项目需要的频谱控件

#ifndef SPECTRUMWIDGET_H
#define SPECTRUMWIDGET_H#include <QWidget>
#include <QVector>class SpectrumWidget : public QWidget
{Q_OBJECTpublic:explicit SpectrumWidget(QWidget *parent = nullptr);void setData(const QVector<float>& data);void setColorGradient(const QLinearGradient& gradient);void setBackgroundColor(const QColor& color);void setBarWidthRatio(float ratio);protected:void paintEvent(QPaintEvent *event) override;private:QVector<float> spectrumData;QLinearGradient gradient;QColor backgroundColor;float barWidthRatio;
};#endif // SPECTRUMWIDGET_H

         tcp,udp类不再讲解,mainwindow主要绘制了界面,整和这些功能

4.知识点总结

        1. UDP协议

        理论

                无连接协议,发送数据前不需要建立连接

                不保证数据顺序和可靠性,但传输效率高

                适合实时性要求高、可容忍少量丢失的场景(如视频流、实时游戏)

        基础实现

// 创建UDP socket
boost::asio::ip::udp::socket socket(ioService);
socket.open(boost::asio::ip::udp::v4());// 设置地址重用
socket.set_option(boost::asio::socket_base::reuse_address(true));// 绑定端口
socket.bind(boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port));// 异步接收
socket.async_receive_from(buffer(data), senderEndpoint,[](const boost::system::error_code& error, size_t bytes) {// 处理接收数据});
         2. TCP协议

        理论

                面向连接的可靠传输协议

                保证数据顺序和完整性

                适合需要可靠传输的场景(如文件传输、远程控制)

        基础实现

// 创建TCP acceptor
boost::asio::ip::tcp::acceptor acceptor(ioService,boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port));// 异步接受连接
boost::asio::ip::tcp::socket socket(ioService);
acceptor.async_accept(socket, [](const boost::system::error_code& error) {// 处理新连接});// 异步读写
boost::asio::async_read(socket, buffer(data),[](const boost::system::error_code& error, size_t bytes) {// 处理读取数据});
        3. 多线程编程

        理论

                并发执行多个任务

                提高CPU利用率

                需要处理线程同步问题

        基础实现

#include <thread>
#include <vector>void worker(int id) {std::cout << "Worker " << id << " running\n";
}int main() {std::vector<std::thread> threads;// 创建线程for(int i = 0; i < 5; ++i) {threads.emplace_back(worker, i);}// 等待所有线程完成for(auto& t : threads) {t.join();}
}
        4. 原子量(atomic)

        理论

        不可分割的操作

        无需锁的线程安全访问

        适合简单变量的并发访问

        基础实现

#include <atomic>std::atomic<int> counter(0);void increment() {for(int i = 0; i < 1000; ++i) {counter.fetch_add(1, std::memory_order_relaxed);}
}// 多线程安全访问
std::thread t1(increment);
std::thread t2(increment);
         5. C++信号槽绑定

         理论

                观察者模式的实现

                松耦合的事件通知机制

                信号发出时自动调用连接的槽函数

        基础实现

#include <boost/signals2.hpp>// 定义信号
boost::signals2::signal<void(int)> valueChanged;// 连接槽函数
valueChanged.connect([](int newValue) {std::cout << "Value changed to " << newValue << "\n";
});// 触发信号
valueChanged(42);
        6. 回调函数

        理论

                函数作为参数传递

                异步操作完成后调用

                实现控制反转

        基础实现

// 定义回调类型
using Callback = std::function<void(const std::string&)>;void fetchData(Callback callback) {// 模拟异步操作std::thread([callback]() {std::this_thread::sleep_for(std::chrono::seconds(1));callback("Data loaded");}).detach();
}// 使用回调
fetchData([](const std::string& result) {std::cout << result << "\n";
});
        7. auto关键字

        理论

                自动类型推导

                编译时确定类型

                简化复杂类型声明

        基础实现

auto i = 42; // int
auto d = 3.14; // double
auto v = std::vector<int>{1, 2, 3}; // std::vector<int>// 结合lambda
auto func = [](int x) { return x * 2; };
        8. Lambda表达式

        理论

                匿名函数对象

                可以捕获上下文变量

                简化回调和小函数定义

        基础实现

// 基本形式
auto sum = [](int a, int b) { return a + b; };// 捕获局部变量
int factor = 3;
auto multiply = [factor](int x) { return x * factor; };// 在算法中使用
std::vector<int> nums{1, 2, 3};
std::sort(nums.begin(), nums.end(), [](int a, int b) { return a > b; });
9. vector容器

        理论

                动态数组

                连续内存存储

                自动管理内存

        基础实现

#include <vector>// 创建和初始化
std::vector<int> numbers = {1, 2, 3};// 添加元素
numbers.push_back(4);// 遍历
for(auto n : numbers) {std::cout << n << " ";
}// 预分配空间
numbers.reserve(100);
        10. 线程池

        理论

                预先创建一组线程

                避免频繁创建销毁线程开销

                任务队列管理待执行任务

        基础实现

#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>class ThreadPool {
public:ThreadPool(size_t threads) {for(size_t i = 0; i < threads; ++i) {workers.emplace_back([this] {while(true) {std::function<void()> task;{std::unique_lock<std::mutex> lock(queueMutex);condition.wait(lock, [this] { return stop || !tasks.empty(); });if(stop && tasks.empty()) return;task = std::move(tasks.front());tasks.pop();}task();}});}}template<class F>void enqueue(F&& f) {{std::unique_lock<std::mutex> lock(queueMutex);tasks.emplace(std::forward<F>(f));}condition.notify_one();}~ThreadPool() {{std::unique_lock<std::mutex> lock(queueMutex);stop = true;}condition.notify_all();for(std::thread &worker : workers)worker.join();}private:std::vector<std::thread> workers;std::queue<std::function<void()>> tasks;std::mutex queueMutex;std::condition_variable condition;bool stop = false;
};

 

     

相关文章:

模拟频谱分析仪(Linux c++ Qt)

此Demo由三个小项目组成,分布是模拟的硬件采集频谱数据端,后台处理端以及qt前端,于Linux系统下进行开发,使用的软件为clion和QtCreator,编程语言为c,使用了linux下的boost库(1.72),多线程和TCP,UDP以及c的一些新特性,为本人自己想的练手的小项目. 1.项目架构 整体设计采集端不…...

从实列中学习linux shell5: 利用shell 脚本 检测硬盘空间容量,当使用量达到80%的时候 发送邮件

下面是用于检测硬盘空间并在使用量达到80%时发送邮件的Shell脚本 第一步 编写脚本 #!/bin/bash# 邮件配置 recipient"zhaoqingyou99qhzt.com" subject"磁盘空间警报" mail_cmd"/usr/bin/mail" # 根据实际邮件命令路径修改# 检查是否安装邮件工…...

NLP 分词技术学习

文章目录 分词1. 分词方法2. 分词工具3. 分词难点 分词 分词是将连续的中文字符串序列切分成有意义的词语序列的过程&#xff0c;是 NLP 的基础任务之一。需要掌握以下内容&#xff1a; 1. 分词方法 基于规则/词典的方法&#xff08;字符串匹配&#xff09;&#xff1a; 正向…...

大模型——使用 StarRocks 作为向量数据库

大模型——使用 StarRocks 作为向量数据库 本章节介绍了 StarRocks,这是一款高性能的分析数据库,并演示了如何将其用作向量数据库。内容涵盖了设置、文档加载、标记化、创建向量数据库实例以及构建一个能够检索的问答系统。 StarRocks StarRocks 是一个次世代的亚秒级 MPP…...

涨薪技术|0到1学会性能测试第44课-apachetop模块监控

前面的推文我们认识了apache目录结构与配置知识&#xff0c;今天我们继续来看下apache监控技术&#xff0c;究竟是怎么做性能监控???后续文章都会系统分享干货&#xff0c;带大家从0到1学会性能测试。 Apache监控技术 关于apache监控通常会有两种方法&#xff1a; 一是&…...

MySQL 基本查询(一)

文章目录 Create(insert)指定列的单行插入和全列插入多行全列插入和指定列的多行插入如果主键存在&#xff0c;要插入替换存在的值replace 基本select全列查询指定列查询where子句where子句案例语文成绩在 [80, 90] 分的同学及语文成绩数学成绩是 58 或者 59 或者 98 或者 99 分…...

Chrome 136 H265 WebRTC 支持 正式版本已包含

时间过的真快&#xff0c;去年8月份写过一篇文章介绍如何加参数方式启动Chrome H265 硬件解码器&#xff0c; 现在的136版本已经包含在内&#xff0c;至此WebRTC已经完整包含了H264和H265解码器&#xff0c;这个事情应该从2015年开始&#xff0c;Google强推VP9 AV1&#xff0c…...

涨薪技术|0到1学会性能测试第43课-apache status模块监控

前面的推文我们认识了apache目录结构与配置知识,今天我们继续来看下apache监控技术,究竟是怎么做性能监控的。后续文章都会系统分享干货,带大家从0到1学会性能测试。 Apache监控技术 关于apache监控通常会有两种方法: 一是:使用apache自带的status监控模块进行监控; 二是…...

一、Javaweb是什么?

1.1 客户端与服务端 客户端 &#xff1a;用于与用户进行交互&#xff0c;接受用户的输入或操作&#xff0c;且展示服务器端的数据以及向服务器传递数据。 例如&#xff1a;手机app&#xff0c;微信小程序、浏览器… 服务端 &#xff1a;与客户端进行交互&#xff0c;接受客户…...

研发效率破局之道阅读总结(4)个人效率

研发效率破局之道阅读总结(4)个人效率 Author: Once Day Date: 2025年4月30日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...

word模板填充导出-(支持word导出、pdf导出)

word模板填充转pdf导出处理 关于word模板填充示例java根据word模板填充数据并导出-五官一体即忢 相关依赖插件【LibreOffice】 安装 LibreOffice&#xff1a;从LibreOffice 官方网站下载并安装适合 Windows 系统或者Linux系统的版本 启动 LibreOffice 服务&#xff1a;打开…...

【Kubernets知识】Secret组件更新大全

文章目录 Kubernetes Secret 更新机制详解及场景指南一、直接替换式更新&#xff08;全量覆盖&#xff09;操作命令特点适用场景风险提示 二、JSON Patch 精准更新操作命令特点适用场景示例流程 三、Strategic Merge Patch&#xff08;策略合并&#xff09;操作命令特点适用场景…...

《分词算法大揭秘:BPE、BBPE、WordPiece、ULM常见方法介绍》

分词算法是自然语言处理&#xff08;NLP&#xff09;中的一个重要预处理步骤&#xff0c;它将文本分割成更小的单元&#xff08;如单词、子词或字符&#xff09;。以下是几种常见的分词算法&#xff1a;Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram…...

MySQL RR (Repeatable Read) 隔离级别规则细节

准备 测试表&#xff1a; CREATE TABLE transaction_test (id int,value int,mtime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id) ) ENGINE InnoDB;mysql设置&#xff1a; transaction_isolation REPEATABLE-READ auto…...

iOS HTTPS 抓包踩坑记:几种方案尝试与替代工具记录

iOS HTTPS 抓包踩坑记&#xff1a;几种方案尝试与替代工具记录 最近负责一个 iOS App 的调试任务&#xff0c;遇到了 HTTPS 接口抓包难题&#xff0c;顺手做个记录&#xff0c;顺带分享一些试过的工具和方案。 背景 这个 App 启用了 HTTPS 双向认证和证书 pinning&#xff0…...

第十一节:Shell脚本编程

理论知识 Shell 脚本的基本概念&#xff1a;Shell 脚本是一种为 shell 编写的脚本程序&#xff0c;它可以将一系列的命令组合在一起&#xff0c;实现自动化任务。Shell 脚本通常以 .sh 为扩展名。Shell 脚本的执行方式&#xff1a;可以将 Shell 脚本作为可执行程序执行&#x…...

Electron Forge【实战】带图片的 AI 聊天

改用支持图片的 AI 模型 qwen-turbo 仅支持文字&#xff0c;要想体验图片聊天&#xff0c;需改用 qwen-vl-plus src/initData.ts {id: 2,name: "aliyun",title: "阿里 -- 通义千问",desc: "阿里百炼 -- 通义千问",// https://help.aliyun.com/z…...

Learning vtkjs之OutlineFilter

过滤器 外轮廓包围盒生成 介绍 vtkOutlineFilter - 一个为较大单元生成三角形的过滤器 vtkOutlineFilter 是一个将具有三个以上点的单元转换为三角形的过滤器。 感觉就是一个包围盒生成的算法&#xff0c;而且试用下来&#xff0c;只能支持一个InputConnection 效果 核心逻…...

腾讯云CodeBuddy初体验

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴”&#xff1b; 最近AI编程很火&#xff0c;据说我司程序员现在每天可以准点下班&#xff0c;AI起到了很大的作…...

加速LLM大模型推理,KV缓存技术详解与PyTorch实现

随着大型语言模型(LLM)规模和复杂度的指数级增长&#xff0c;推理效率已成为人工智能领域亟待解决的关键挑战。当前&#xff0c;GPT-4、Claude 3和Llama 3等大模型虽然表现出强大的理解与生成能力&#xff0c;但其自回归解码过程中的计算冗余问题依然显著制约着实际应用场景中的…...

江西省电价新政发布!微电网源网荷储充一体化平台重塑企业能源格局!

一. 江西省发改委发布发布 4月25日&#xff0c;江西省发改委发布关于公开征求《关于进一步完善分时电价机制有关事项的通知&#xff08;征求意见稿&#xff09;》意见的公告。征求意见提出&#xff1a; 江西省&#xff1a;中午3小时谷段电价&#xff0c;电价下浮60%~70% 除1…...

深夜突发:OpenAI紧急修复GPT-4o“献媚”问题

凌晨三点&#xff0c;OpenAI首席执行官Sam Altman发布官方声明&#xff0c;宣布针对GPT-4o的“献媚”问题展开紧急修复。这场突如其来的技术风波&#xff0c;源于近期大量用户对模型行为模式的不满。许多用户发现&#xff0c;当他们向GPT-4o提出类似“你觉得我怎么样”或“如果…...

Webpack 和 Vite 中静态资源动态加载的实现原理与方法详解

静态资源动态加载 需求背景&#xff1a;现在需要加载指定文件夹下的对应图片&#xff0c;需要根据用户选的参数自动加载对应图片 一、前言&#xff1a;模块化开发的演进需求 在现代前端工程中&#xff0c;随着SPA应用复杂度的提升&#xff0c;静态资源动态加载已成为优化首屏性…...

SMMU相关知识

1. 使用smmu的作用 支持具有DMA能力设备的虚拟化实现解决32位系统访问超过4G空间的地址解决系统动态分配大块连续内存 2. 为什么需要使用2级页表 SMMU&#xff08;系统内存管理单元&#xff09;采用二级页表架构的核心原因可归结为地址空间管理效率、内存资源优化以及虚拟化…...

2025年数字创意设计与图像处理国际会议 (DCDIP 2025)

2025 International Conference on Digital Creative Design and Image Processing 【一】、大会信息 会议简称&#xff1a;DCDIP 2025 大会地点&#xff1a;中国济南 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 【二…...

39.RocketMQ高性能核心原理与源码架构剖析

1. 源码环境搭建 1.1 主要功能模块 ​ RocketMQ的官方Git仓库地址&#xff1a;GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. ​ RocketMQ的官方网站上下载指定版…...

SVTAV1 编码函数 svt_aom_is_pic_skipped

一 函数解释 1.1 svt_aom_is_pic_skipped函数的作用是判断当前图片是否可以跳过编码处理。 具体分析如下 函数逻辑 参数说明&#xff1a;函数接收一个指向图片父控制集的指针PictureParentControlSet *pcs, 通过这个指针可以获取与图片相关的各种信息&#xff0c;用于判断是否跳…...

C++负载均衡远程调用学习之基础TCP服务

目录 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 3.LARS的reactor框架的组成部分 4.Lars_reactor的项目目录构建 5.Lars_tcp_server的基础服务开发 6.Lars_tcp_server的accept实现 7.LarsV0.1总结 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 # Lars系统开发 …...

WebRtc09:网络基础P2P/STUN/TURN/ICE

网络传输基本知识 NATSTUN&#xff08;Session Traversal Utilities for NAT&#xff09;TURNICE NAT 产生的原因 IPV4地址不够出于网络安全的原因 NAT种类 完全锥型NAT(Full Cone NAT)地址限制型NAT(Address Restricted Cone NAT)端口限制型NAT(Port Restricted Cone NAT…...

UDP/TCP协议知识及相关机制

一.UDP协议 UDP是一种无连接、不可靠、面向报文、全双工传输层的协议~ 1.无连接 &#xff1a; 知道对端的端口号和IP可以直接传输&#xff0c;不需要建立连接 2..不可靠&#xff1a;没有确认机制&#xff0c;没有重传机制&#xff0c;不知道数据包能否能正确到达对端&#xff0…...

windows 下 oracle 数据库的备份与还原

1、备份 创建备份出来的文件存放的位置。 创建目录对象&#xff0c;在数据库中创建一个目录对象&#xff0c;该对象指向文件系统中用于存储导出文件的实际目录&#xff08; sql 命令&#xff0c;可以在 plsql 中执行&#xff09;。 -- 创建目录对象&#xff0c;\D:\Oracle19c\…...

LeetCode41☞缺失的第一个正数

关联LeetCode题号41 本题特点 数组&#xff0c;哈希表 本题思路 找缺失的最小正数&#xff0c;看举例说明缺失的正数&#xff0c;一种情况是连续的最小的正数&#xff0c;一种是缺失连续但不是最小的正数验证数组内数组是否连续&#xff0c;可以通过 nums[i]1 是否存nums组…...

毕业论文 | 基于STM32的自动烟雾报警系统设计

基于STM32的烟雾报警系统 一、系统设计原理1. **系统架构**2. **工作原理**二、核心公式与算法1. **MQ-2传感器浓度计算**2. **温度传感器数据处理**3. **校准与滤波**三、关键代码实现1. **ADC初始化与数据读取(以MQ-2为例)**2. **报警逻辑与阈值设置**3. **EEPROM存储阈值*…...

iOS 性能调优实战:三款工具横向对比实测(含 Instruments、KeyMob、Xlog)

iOS 性能调优实战&#xff1a;三款工具横向对比实测&#xff08;含 Instruments、KeyMob、Xlog&#xff09; 在日常 iOS 开发中&#xff0c;性能问题往往是最难排查、最影响体验的部分。无论是 CPU 峰值、内存飙升&#xff0c;还是偶发卡顿、异常崩溃&#xff0c;背后都隐藏着…...

flutter 专题 五十八 关于Flutter提示Your Xcode project requires migration的错误

最近&#xff0c;升级了Flutter后&#xff0c;运行之前的项目报了一个如下的错误&#xff1a; Your Xcode project requires migration. See https://flutter.dev/docs/development/ios-project-migration for details. Error launching application on iPhone 11 Pro.想到之前…...

【c++】【STL】list详解

目录 list的作用list的接口构造函数赋值运算符重载迭代器相关sizeemptyfrontbackassignpush_frontpop_frontpush_backpop_backinserteraseswapresizeclearspliceremoveremove_ifuniquemergesortreverse关系运算符重载&#xff08;非成员函数&#xff09; list的模拟实现结点类迭…...

redis 数据类型新手练习系列——List类型

redis 数据类型 Redis 主要支持以下几种数据类型&#xff1a; &#xff08;1&#xff09;string&#xff08;字符串&#xff09;: 基本的数据存储单元&#xff0c;可以存储字符串、整数或者浮点数。 &#xff08;2&#xff09;hash&#xff08;哈希&#xff09;:一个键值对集…...

文章记单词 | 第52篇(六级)

一&#xff0c;单词释义 grasp&#xff1a;英 [ɡrɑːsp] 美 [ɡrsp]&#xff0c;v. 抓住&#xff1b;紧握&#xff1b;理解&#xff1b;领会&#xff1b;n. 紧握&#xff1b;控制&#xff1b;理解glue&#xff1a;英 [ɡluː] 美 [ɡluː]&#xff0c;n. 胶水&#xff1b;胶…...

【今日三题】kotori和气球(排列) / 走迷宫(BFS最短路) / 主持人调度(二)(贪心+优先级队列)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 kotori和气球(排列)走迷宫(BFS最短路)主持人调度&#xff08;二&#xff09;(贪心优先级队列) kotori和气球(排列) kotori和…...

Mysql数据库高可用解决方案-Mysql Router

目录 一.MySQL Router介绍 1. 什么是 MySQL Router&#xff1f; 2. MySQL Router 的主要用途 3. MySQL Router 的工作原理 4. MySQL Router 的核心组件 5. MySQL Router 的部署和配置 6. MySQL Router 的优势 7. 注意事项 8. MySQL Router 与其他工具的对比 9. 总结 …...

windows系统 压力测试技术

一、CPU压测模拟 工具&#xff1a;CpuStres v2.0 官网&#xff1a;https://learn.microsoft.com/en-us/sysinternals/downloads/cpustres 功能&#xff1a;是一个工具类&#xff0c;用来模拟在一个进程中启动最多64个线程&#xff0c;且可以独立控制任何一个线程的启动/暂停、…...

汽车免拆诊断案例 | 2015款奔驰C200L车发动机起动延迟

故障现象  一辆2015款奔驰C200L车&#xff0c;搭载274发动机&#xff0c;累计行驶里程约为15.6万km。该车发动机起动延迟&#xff0c;且发动机故障灯异常点亮。 故障诊断  用故障检测仪检测&#xff0c;发动机控制单元中存储有故障代码“P001685 进气凸轮轴&#xff08;气缸…...

Python AI图像艺术创作:核心技术与实践指南

Python与AI技术的结合为图像艺术创作开辟了全新维度,通过生成对抗网络(GANs)、扩散模型(如Stable Diffusion)和神经风格迁移等技术,创作者可以轻松生成具有高度创意和艺术性的图像作品。 这些技术不仅突破了传统艺术创作的局限性,还大幅降低了专业创作门槛,使艺术创作…...

比亚迪再获国际双奖 以“技术为王”书写中国汽车出海新篇章

近日&#xff0c;全球汽车行业权威奖项“2025世界汽车大奖”&#xff08;World Car Awards&#xff09;在纽约国际车展举行颁奖典礼&#xff0c;比亚迪海鸥&#xff08;BYD SEAGULL/BYD DOLPHIN MINI&#xff09;摘得“2025世界城市车&#xff08;World Urban Car&#xff09;”…...

虚幻商城 Quixel 免费资产自动化入库(2025年版)

文章目录 一、背景二、问题讲解1. Quixel 免费资产是否还能一键入库?2. 是不是使用了一键入库功能 Quixel 的所有资产就能入库了?3. 一键入库会入库哪些资产?三、实现效果展示四、实现自动化入库五、常见问题1. 出现401报错2. 出现429报错3. 入库过于缓慢4. 入库 0 个资产一…...

斯坦福RGA软件 老版本和兼容Windows 11版本可选

斯坦福RGA软件 老版本和兼容Windows 11版本可选...

RHCSA Linux 系统 文件系统权限

1. 文件的一般权限 &#xff08;1&#xff09;文件权限标识解读 drwxr - xr - x. 12 root root 144 Feb 17 16:51 usr ➤d&#xff1a;文件类型&#xff08;d 表示目录&#xff09; ➤rwx&#xff1a;文件所有者权限&#xff08;读 r&#xff0c;写 w&#xff0c;执行 x&am…...

【补题】Codeforces Global Round 20 D. Cyclic Rotation

题意&#xff1a;偷懒 思路&#xff1a; D. Cyclic Rotation - Yaqu - 博客园 1.有个观察&#xff0c;如果操作过的序列&#xff0c;一定是连续相同的数字&#xff0c;当然这不代表一定操作过了&#xff0c;由于操作过1次后连续就没有意义&#xff0c;可以假设全都操作…...

2025年“深圳杯”数学建模挑战赛C题-分布式能源接入配电网的风险分析

布式能源接入配电网的风险分析 小驴数模 背景知识&#xff1a; 随着我国双碳目标的推进&#xff0c;可再生分布式能源在配电网中的大规模应用不可避免&#xff0c;这对传统配电网运行提出挑战。为了量化分析配电网中接入分布式能源的风险&#xff0c;需要对其进行建模与分析…...

微调 LLaMA 2:定制大型语言模型的分步指南

微调 LLaMA 2&#xff1a;定制大型语言模型的分步指南 深入了解如何运用新技术在 Google Colab 平台上对 Llama-2 进行微调操作&#xff0c;从而有效克服内存与计算方面的限制&#xff0c;让开源大型语言模型变得更加易于获取和使用。自从 Meta 发布了 LLaMA 的首个版本后&…...