Qt广告机客户端(下位机)
目录
- 功能
- 结构
- adClient.pro
- main.cpp
- adclient.h 客户端
- adclient.cpp 客户端
- addate.h 时间处理
- addate.cpp 时间处理
- adsocket.h 客户端Socket处理
- adsocket.cpp 客户端Socket处理
- weather.h 天气信息处理
- weather.cpp 天气信息处理
- rollmassege.h 滚动信息处理
- rollmassege.cpp 滚动信息处理
- 效果
功能
- 连接服务器(上位机)
- 广告图片播放模块
- 日期显示模块
- 天气显示模块
- 信息提示模块
结构
adClient.pro
QT += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11TARGET = adClient
TEMPLATE = appSOURCES += main.cpp\adclient.cpp \addate.cpp \adsocket.cpp \weather.cpp \rollmassege.cppHEADERS += adclient.h \addate.h \adsocket.h \tcp_MSG.h \weather.h \rollmassege.hFORMS += adclient.uiRESOURCES += \res.qrc
main.cpp
#include "adclient.h"
#include <QApplication>
#include <QDebug>
#include <QDir>
int main(int argc, char *argv[])
{QApplication a(argc, argv);// 判断当前运行环境是否为Linux或Windows。
#ifdef Q_OS_LINUXqDebug() << "Current OS is Linux";
#elif defined(Q_OS_WIN)qDebug() << "Current OS is Windows";
#elseqDebug() << "Unknown OS";
#endifQString folderName = "pic";//QString folderPath = QDir::currentPath() + "/" + folderName;QString folderPath = QApplication::applicationDirPath() + "/" + folderName;QDir folder(folderPath);if (!folder.exists()){bool success = folder.mkpath("."); // 创建文件夹if (success)qDebug() << "文件夹创建成功";elseqDebug() << "文件夹创建失败";}elseqDebug() << "文件夹已存在";QDir::setCurrent(folderPath);// 设置文件生成路径AdClient w;w.show();return a.exec();
}
adclient.h 客户端
#ifndef ADCLIENT_H
#define ADCLIENT_H#include <QMainWindow>
#include "addate.h"
#include "adsocket.h"
#include "weather.h"
#include "rollmassege.h"
#include <QLabel>
#include <QProgressDialog>
#include "stdlib.h"
#include <QThread>
#include <QTimer>
#include <QFile>
#include <QMessageBox>
#include <QNetworkInterface>
#include <QTcpSocket>
#include <QHostAddress>
#include <QAbstractSocket>
#include <QLineEdit>
#include <QPushButton>namespace Ui {
class AdClient;
}class AdClient : public QMainWindow
{Q_OBJECTpublic:explicit AdClient(QWidget *parent = 0);~AdClient();void saveFile();// 保存文件void InitStatusBar();// 初始化底部状态栏QString GetLocalIP();// 获取本地IPpublic slots:void showImage(QImage);// 图片显示void showProgressBar(int currentProgress,int finish);//进度条显示void autoPlayTimeOut();//自动播放void GUI_WarningMsg(QString title,QString text,QString buttons,QString defaultButton);//设置警报void connectToServer();// 链接到服务器
private:Ui::AdClient *ui;AdDate *date;AdSocket *socket;Weather *weater;RollMassege *rollmsg;QProgressDialog *progress;// 创建进度条QTimer autoPlayTimer;int index;QLabel *mLocalIP;QLabel *serverIP_lb;QLineEdit *serverIP;QLabel *serverPort_lb;QLineEdit *serverPort;QPushButton *connectTcp;};#endif // ADCLIENT_H
adclient.cpp 客户端
#include "adclient.h"
#include "ui_adclient.h"
#include <QDebug>QMap<QString,QImage> qMapPicturePath;// 图片路径//QTcpSocket 的默认缓存区大小是 64KB(65536字节)
AdClient::AdClient(QWidget *parent) :QMainWindow(parent),ui(new Ui::AdClient)
{ui->setupUi(this);this->setWindowIcon(QIcon(":/client.jpg"));date = new AdDate(ui->date_lb);//时间socket = new AdSocket;// TCP客户端weater = new Weather(ui->weather_lb);// 接收天气信息绘制rollmsg = new RollMassege(ui->msg_lb, ui->msg_lb);// 滚动信息connect(socket, SIGNAL(sig_showWeather(QString,QString,QString)), weater, SLOT(showWeather(QString,QString,QString)));connect(socket, SIGNAL(sig_showTxt(QString)), rollmsg, SLOT(showTxt(QString)));connect(socket, SIGNAL(sig_showImage(QImage)), this, SLOT(showImage(QImage)));connect(socket, SIGNAL(sig_showProgressBar(int,int)), this, SLOT(showProgressBar(int,int)),Qt::QueuedConnection);connect(socket, SIGNAL(GUI_WarningSignal(QString,QString,QString,QString)), this, SLOT(GUI_WarningMsg(QString,QString,QString,QString)));date->start();//更新时间progress = nullptr;autoPlayTimer.stop();connect(&autoPlayTimer, SIGNAL(timeout()), this, SLOT(autoPlayTimeOut()));InitStatusBar();// 初始化底部状态栏
}AdClient::~AdClient()
{delete socket;delete ui;
}// 保存文件
void AdClient::saveFile()
{QString fileName=qMapPicturePath.lastKey();qDebug()<<"lastKey:"<<fileName;QImage image=qMapPicturePath.last();image.save(fileName);
}// 初始化底部状态栏
void AdClient::InitStatusBar()
{mLocalIP=new QLabel(this);mLocalIP->setMinimumWidth(230);QString ip = GetLocalIP();// mLocalIP->setText("本地IP:"+ip);mLocalIP->setText("本地IP:"+tr("<font color=\"red\">%1</font>").arg(ip));serverIP_lb=new QLabel(this);serverIP_lb->setMinimumWidth(100);serverIP_lb->setText("服务器IP:");serverIP=new QLineEdit(this);serverIP->setMinimumWidth(200);serverIP->setInputMask("000.000.000.000");serverPort_lb=new QLabel(this);serverPort_lb->setMinimumWidth(60);serverPort_lb->setText("Port:");serverPort=new QLineEdit(this);serverPort->setMinimumWidth(60);serverPort->setPlaceholderText("8888");connectTcp=new QPushButton("链接",this);connectTcp->setMinimumWidth(100);ui->statusBar->addWidget(mLocalIP);ui->statusBar->addWidget(serverIP_lb);ui->statusBar->addWidget(serverIP);ui->statusBar->addWidget(serverPort_lb);ui->statusBar->addWidget(serverPort);ui->statusBar->addWidget(connectTcp);connect(connectTcp, SIGNAL(clicked()), this, SLOT(connectToServer()));
}// 获取本地IP
QString AdClient::GetLocalIP()
{QList<QHostAddress> list=QNetworkInterface::allAddresses();foreach(QHostAddress address,list){if(address.protocol()==QAbstractSocket::IPv4Protocol){qDebug()<<address.toString();return address.toString();}}return "";
}// 图片显示
void AdClient::showImage(QImage image)
{qDebug()<<"显示图片"<<__LINE__;QPixmap pixmap=QPixmap::fromImage(image);// 内容是否自动缩放,参数true自动缩放ui->video_lb->setScaledContents(true);//显示图片的全部// 将图片缩放到指定大小,参数ui->label->size()表示缩放的大小,Qt::KeepAspectRatio表示保持图片的宽高比,Qt::SmoothTransformation表示使用平滑缩放算法ui->video_lb->setPixmap(pixmap.scaled(ui->video_lb->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));qDebug()<<"图片数量:"<<qMapPicturePath.count();qDebug()<<"定时器状态:"<<autoPlayTimer.isActive();if(qMapPicturePath.count()>=2){if(!autoPlayTimer.isActive()){// 两张以上图片开启播放autoPlayTimer.start(5000);index=0;}}else{autoPlayTimer.stop();}if(qMapPicturePath.count()>=1){// 功能没问题,调试注释,避免多次保存//saveFile();// 保存文件}
}//进度条显示
void AdClient::showProgressBar(int currentProgress, int finish)
{qDebug()<<"进度条显示"<<__LINE__;if (!progress){//创建进度条progress = new QProgressDialog("接收中....", "取消", 0, 100, this);progress->setWindowModality(Qt::WindowModal);progress->setFixedSize(this->width()*0.3,this->height()*0.3);progress->setVisible(true);}//usleep(500);//在Windows环境下已被弃用QThread::msleep(50);//休眠50毫秒//更新进度条progress->setValue(currentProgress * 100 / finish);//如果任务已经完成,隐藏进度条if (currentProgress == finish){qDebug()<<"进度条显示完成"<<__LINE__;progress->hide();delete progress;progress = nullptr;}
}//自动播放
void AdClient::autoPlayTimeOut()
{QList<QString> keyList = qMapPicturePath.keys();//存放的就是QMap的key值if(index>=qMapPicturePath.count())// 删除广告时有可能 >index=0;QImage image=qMapPicturePath.value(keyList.at(index));qDebug()<<"自动播放:"<<keyList.at(index);showImage(image);index++;
}
//设置警报
void AdClient::GUI_WarningMsg(QString title, QString text, QString buttons, QString defaultButton)
{Q_UNUSED(buttons)//忽略编译器发出的警告,表明变量event未使用Q_UNUSED(defaultButton)QMessageBox *box=new QMessageBox(QMessageBox::Warning,title,text,QMessageBox::Cancel,this);QTimer::singleShot(5000,this,[=](){if(!box->isHidden()&&box->isVisible()){box->accept();}});// 5s后必执行box->exec();return;
}// 链接到服务器
void AdClient::connectToServer()
{if(serverIP->text().isEmpty()||serverPort->text().isEmpty()){QMessageBox::warning(this,"提示","请输入IP或Port");return;}socket->id=GetLocalIP();socket->address=serverIP->text();qDebug()<<"服务器IP:"<<socket->address;socket->port=serverPort->text().toInt();qDebug()<<"服务器Port:"<<socket->port;qDebug()<<"是否已经连接:"<<socket->isValid();if(socket->isValid())// 如果套接字有效并且可以使用,则返回true;否则返回false。{socket->disconnectFromHost();// 与服务器断开连接// 无需再手动连接,只要更新IP和Port就行,AdSocket::conAgain会重新发起连接.}else{socket->connectToHost(QHostAddress(socket->address), socket->port);}qDebug()<<"是否已经连接:"<<socket->isValid();
}
addate.h 时间处理
#ifndef ADDATE_H
#define ADDATE_H#include <QTime>
#include <QDate>
#include <QLabel>
#include <QTimer>class AdDate : public QObject
{Q_OBJECT
public:AdDate(QLabel *_mlabel, QObject *parent = 0);~AdDate();void start();// 定时器开启
public slots:void updateTime();// 定时器1s超时执行一次
private:QLabel *mlabel;QTimer *mtimer;
};#endif // ADDATE_H
addate.cpp 时间处理
#include "addate.h"AdDate::AdDate(QLabel *_mlabel, QObject *parent):QObject(parent)
{mlabel = _mlabel;mtimer = new QTimer;connect(mtimer, SIGNAL(timeout()), this, SLOT(updateTime()));
}AdDate::~AdDate()
{delete mtimer;
}void AdDate::start()
{mtimer->start(1000);
}void AdDate::updateTime()
{QString time = QTime::currentTime().toString("hh:mm:ss")+"\n"+QDate::currentDate().toString("yy/MM/dd ddd");mlabel->setText(time);
}
adsocket.h 客户端Socket处理
#ifndef ADSOCKET_H
#define ADSOCKET_H#include <QTcpSocket>
#include <QHostAddress>
#include <QAbstractSocket>
#include <QAbstractSocket>
#include <QImage>
#include <QLabel>
#include <QBuffer>
#include <QTime>
#include "string.h"
#include "tcp_MSG.h"class AdSocket : public QTcpSocket
{Q_OBJECT
public:explicit AdSocket(QObject *parent = 0);~AdSocket();QString id;QString address;int port;int readMsgType;signals:void sig_showWeather(QString city,QString area,QString wt);// 发送天气信息void sig_showTxt(QString tcp_Txt);// 发送文字信息void sig_showImage(QImage tcp_image);// 发送文字信息void sig_showProgressBar(int currentProgress, int finish);// 发送进度条信息void GUI_WarningSignal(QString title,QString text,QString buttons,QString defaultButton);//设置警报public slots:void readMsg();// 接收信息void conSuc(); // 成功建立连接void conAgain();// 重新连接void conAgain(QAbstractSocket::SocketError);// 重新连接private:int needFileSize;int currentReceiveSize;QByteArray currentReceiveByte;int milsec;QString fileName;
};#endif // ADSOCKET_H
adsocket.cpp 客户端Socket处理
#include "adsocket.h"
#include <QDebug>extern QMap<QString,QImage> qMapPicturePath;// 图片路径// QTcpSocket会自动处理大小端问题
AdSocket::AdSocket(QObject *parent) :QTcpSocket(parent)
{//注册tcp_MSG类型qRegisterMetaType<tcp_MSG>("tcp_MSG");id = "0011";/* 每当有新的输入数据时,就会发出这个信号。请记住,新传入的数据只报告一次;如果您不读取所有数据,这个类会缓冲数据,您可以稍后读取它,但是除非新数据到达,否则不会发出信号。*/connect(this, SIGNAL(readyRead()),this, SLOT(readMsg()));//该信号在调用connectToHost()并成功建立连接之后发出。connect(this, SIGNAL(connected()),this, SLOT(conSuc()));// 该信号在套接字断开连接时发出connect(this, SIGNAL(disconnected()),this, SLOT(conAgain()));address="127.0.0.1";port=8888;//connectToHost(QHostAddress(address), port);// 默认连接127.0.0.1 8888//该信号在错误发生后发出。socketError参数描述发生错误的类型connect(this, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(conAgain(QAbstractSocket::SocketError)));readMsgType=MsgType::Init;milsec=0;
}AdSocket::~AdSocket()
{}// 接收信息
void AdSocket::readMsg()
{//读取缓冲区数据QByteArray buffer = readAll();qDebug()<<"进来了"<<__LINE__;if(readMsgType==MsgType::Init){tcp_MSG *msg=(tcp_MSG *)buffer.data(); //强转为结构体,需要用结构体指针接收qDebug()<<"进来了"<<__LINE__;qDebug()<<"类型"<<msg->type;switch (msg->type){case WEATHER://天气{QString city=msg->city;QString area=msg->area;QString weather=msg->weather;//weather="\t\t"+city+"\t"+area+"\n"+weather;emit sig_showWeather(city,area,weather);// 发送天气信息break;}case MASSEGE:// 留言{QString tcp_Txt=msg->txt;qDebug()<<"文字信息:"<<tcp_Txt;emit sig_showTxt(tcp_Txt);// 发送文字信息break;}case VIDEO:// 视频qDebug()<<"发送视频信息:";break;case AD_add://添加广告{qDebug()<<"添加广告"<<__LINE__;qDebug()<<"文件名"<< QString(msg->fileName);qDebug()<<"编号"<< msg->index;qDebug()<<"总数"<< msg->allAd_Num;needFileSize=msg->fileSize;currentReceiveSize=0;currentReceiveByte.clear();QByteArray sendTcpData;//使用字节数组,将结构体转为字符数组,发送的是字符数组(数据在传输过程中都是byte类型的)//直接sizeof(senddata)内存会变小,设置了对齐方式解决sendTcpData.resize(sizeof(tcp_backMSG));tcp_backMSG backMsg={};strcpy(backMsg.id,id.toUtf8().data());backMsg.state=1;backMsg.type=MsgType::Write_back;//将封装好的结构体转为QByteArray数组,因为传输都是Byte类型memcpy(sendTcpData.data(),&backMsg,sizeof(tcp_backMSG));this->write(sendTcpData);// 回复fileName.clear();fileName=QString(msg->fileName);readMsgType=MsgType::AD_add;break;}case AD_delete://删除广告{qDebug()<<"删除广告"<<__LINE__;qDebug()<<"文件名"<< QString(msg->fileName);int success= qMapPicturePath.remove(QString(msg->fileName));if(success){if(qMapPicturePath.count()>=1){// 有图片emit sig_showImage(qMapPicturePath.first());}else{// 没有图片QImage image(100, 100, QImage::Format_RGBA8888);image.fill(QColor(0, 0, 0, 0));// 纯透明图片emit sig_showImage(image);}emit GUI_WarningSignal("提示","删除广告成功",NULL,NULL);}else{emit GUI_WarningSignal("提示","删除广告失败",NULL,NULL);}break;}default:qDebug()<<"";break;}}else if(readMsgType==MsgType::AD_add){qDebug()<<"添加广告"<<__LINE__;qDebug()<<"需要接收大小:"<<needFileSize;// 记录开始时间QTime startTime = QTime::currentTime();currentReceiveSize+=buffer.size();currentReceiveByte+=buffer;qDebug()<<"当前接收大小:"<<currentReceiveSize;emit sig_showProgressBar(currentReceiveSize,needFileSize);// 记录结束时间QTime endTime = QTime::currentTime();// 计算运行时间milsec += startTime.msecsTo(endTime);if(needFileSize==currentReceiveSize){qDebug()<<"图片接收完成";startTime = QTime::currentTime();QByteArray Ret_bytearray = QByteArray::fromBase64(currentReceiveByte);QBuffer buffer(&Ret_bytearray);buffer.open(QIODevice::WriteOnly);QPixmap imageresult;imageresult.loadFromData(Ret_bytearray);qMapPicturePath.insert(fileName,imageresult.toImage());// 先插入键值emit sig_showImage(imageresult.toImage());readMsgType=MsgType::Init;endTime = QTime::currentTime();milsec += startTime.msecsTo(endTime);qDebug()<<"接收消耗时间"<<milsec<<"毫秒";}}
}
// 成功建立连接
void AdSocket::conSuc()
{QByteArray sendTcpData;//使用字节数组,将结构体转为字符数组,发送的是字符数组(数据在传输过程中都是byte类型的)//直接sizeof(senddata)内存会变小,设置了对齐方式解决sendTcpData.resize(sizeof(tcp_backMSG));tcp_backMSG msg={};strcpy(msg.id,id.toUtf8().data());msg.state=0;msg.type=MsgType::Init;//将封装好的结构体转为QByteArray数组,因为传输都是Byte类型memcpy(sendTcpData.data(),&msg,sizeof(tcp_backMSG));this->write(sendTcpData);qDebug()<<"connect success";
}// 重新连接
void AdSocket::conAgain()
{qDebug()<<"套接字断开连接时重新连接";abort();// 终止当前连接并重置套接字connectToHost(QHostAddress(address), port);
}
// 重新连接
void AdSocket::conAgain(QAbstractSocket::SocketError error)
{qDebug()<<"连接失败:"<<error;readMsgType=MsgType::Init;abort();// 终止当前连接并重置套接字if(error==QAbstractSocket::ConnectionRefusedError){connectToHost(QHostAddress(address), port);}
}
weather.h 天气信息处理
#ifndef WEATHER_H
#define WEATHER_H#include <QObject>
#include <QLabel>
#include <QDebug>
class Weather : public QObject
{Q_OBJECT
public:explicit Weather( QLabel *_label,QObject *parent = 0);signals:public slots:void showWeather(QString city,QString area,QString weather);private:QLabel *label;QString _city;QString _area;
};#endif // WEATHER_H
weather.cpp 天气信息处理
#include "weather.h"Weather::Weather( QLabel *_label, QObject *parent) :QObject(parent)
{label = _label;
}void Weather::showWeather(QString city,QString area,QString weather)
{_city=city;qDebug()<<"城市:"<<_city;_area=area;qDebug()<<"地区:"<<_area;weather="\t\t"+_city+"\t"+_area+"\n\t"+weather;label->setText(weather);
}
rollmassege.h 滚动信息处理
#ifndef ROLLMASSEGE_H
#define ROLLMASSEGE_H#include <QLabel>
#include <QEvent>
#include <QTimer>
#include <QRect>
#include <QPainter>
#include <QFont>class RollMassege : public QLabel
{Q_OBJECT
public:explicit RollMassege(QWidget *parent = 0);explicit RollMassege(QLabel *_label, QWidget *parent = 0);void paintEvent(QPaintEvent *event);
signals:public slots:void updateMsg();void showTxt(QString tcp_Txt);
private:QString txt;QRect rect;int offset;//偏移量QTimer *timer;
};#endif // ROLLMASSEGE_H
rollmassege.cpp 滚动信息处理
#include "rollmassege.h"
#include <QDebug>RollMassege::RollMassege(QWidget *parent) :QLabel(parent)
{
}RollMassege::RollMassege(QLabel *_label, QWidget *parent) :QLabel(parent)
{rect = _label->geometry();rect.setWidth(798);rect.setHeight(80);setGeometry(rect);show();qDebug()<<rect.width()<<" "<<rect.height();offset = rect.width();//偏移量txt = "暂无信息";timer = new QTimer;connect(timer, SIGNAL(timeout()), this, SLOT(updateMsg()));timer->start(50);
}
// 绘画事件
void RollMassege::paintEvent(QPaintEvent *event)
{Q_UNUSED(event); //忽略编译器发出的警告,表明变量event未使用QPainter painter(this);QFont font;font.setPointSize(16);painter.setFont(font);painter.drawText(rect.x()+offset, rect.y()+30, txt);// 绘制文字,x+偏移量
}void RollMassege::updateMsg()
{offset--;if(offset<0) offset = rect.width();update();// 刷新,触发绘画事件paintEvent
}void RollMassege::showTxt(QString tcp_Txt)
{txt =tcp_Txt;update();
}
效果
相关文章:
Qt广告机客户端(下位机)
目录功能结构adClient.promain.cppadclient.h 客户端adclient.cpp 客户端addate.h 时间处理addate.cpp 时间处理adsocket.h 客户端Socket处理adsocket.cpp 客户端Socket处理weather.h 天气信息处理weather.cpp 天气信息处理rollmassege.h 滚动信息处理rollmassege.cpp 滚动信息…...
JavaScript新手学习手册-基础代码(二)
与上篇博客相接 一:函数: 案例:通过函数实现绝对值的输出 方法一: function absoluate(x){if(x>0){return x;}else{ return -x;}} 在控制台调用函数 方法二: var demo1 function(x){if(x>0){return x;}els…...
wireshark 抓包使用记录
文章目录前言wireshark 抓包使用记录一、wireshark的基础使用二、wireshark的常用功能1、开始混杂模式2、过滤器操作2.1、抓包过滤器2.2、显示过滤器3、时间格式显示4、统计流量图5、标记显示6、导出数据包7、增加、隐藏、删除显示列前言 如果您觉得有用的话,记得给…...
pd dataframe 读取处理 有合并单元格的excel方式
from pathlib import Path import openpyxl 拆分所有的合并单元格,并赋予合并之前的值。 由于openpyxl并没有提供拆分并填充的方法,所以使用该方法进行完成 def unmerge_and_fill_cells(worksheet): all_merged_cell_ranges list( worksheet.merged_…...
七,iperf3源代码分析:状态机及状态转换过程--->运行正向TCP单向测试时的服务端代码
本文目录一、测试用命令二、iperf3状态机中各个状态解析三、iperf3状态机迁移分析K-初始化测试对象(NA--->初始化状态):A-服务器端测试对象开始运行(初始化状态--->IPERF_START状态):B-建立控制连接(初始化状态-…...
【网络篇】----- 传输层协议 之 UDP(协议格式,协议特性和编程影响三方面详细分析)
文章目录 前言1、UDP协议2、协议格式 2.1、协议格式模型2.2、字段分析3.协议特性4.编程影响总结前言 1、UDP协议 UDP协议,又名数据报传输协议,是传输层协议之一!!! 在TCP/IP五层模型中,在传输层中ÿ…...
【基于STM32的多功能台灯控制】
基于STM32的多功能台灯控制 在之前一篇博文中已出过智能台灯相关的介绍,在这里对之前的模块以及功能上进行了优化和功能上的改进,需源码或实物可私【创作不易-拒绝白嫖】 功能说明 1、按键模式多功能台灯在设计上使用了4个按键分别做为 按键1模式的切换…...
Mac 编译x264源码No working C compiler found 错误
在mac上编译x264源码时,报错No working C compiler found 。网上找了一圈方案也无法解决 只能硬着头皮看configure这个脚本,通过一步一步抽丝拨茧终于是在mac上可以编译了。 这里只当记录一下,为后续同学遇到同样问题提供一个辅助解决方案。…...
如何有效地降低软件开发风险?
1、科学分析风险 高风险自动预警 一般对风险进行科学分析,主要从3个维度进行划分:影响的严重性、发生的可能性、产生的影响性。 根据风险对项目的影响程度,从3个维度将其划分5个等级:很低、比较低、中等、比较高、很高。这样我们能…...
【python】剑指offer代码大集合2
本文是【python】剑指offer代码大集合的姊妹篇,用于完善标识todo的代码! 刷题网站:https://leetcode.cn/problem-list/xb9nqhhg/ 剑指 Offer 14- I. 剪绳子 https://leetcode.cn/problems/jian-sheng-zi-lcof/ todo 剑指 Offer 14- II. 剪绳子 II https://leetcode.cn/pr…...
经纬恒润再传佳讯,斩获大奖
阳春二月,经纬恒润屡传佳讯,凭借产品、研发等多方面的出色表现,再次斩获东风柳汽“优秀供应商”和广汽传祺“科技创新奖”,以实力印证良好口碑,不忘初心,载誉而行! 东风柳汽:优秀供…...
说说转义字符 “\”
转义字符-escape character character 表示字符,包含两层含义, 1.字母 2.符号 转义: 改变含义 字符: 字母、符号 转义字符: 把 字母、符号 的含义改变了注意:这里有 2 个常常被忽视、忽略、轻视的转义规则&…...
2023高质量设计竞赛汇总,想证明自己实力的快来
对于设计师来说,参加设计比赛不仅能够提升自己的设计能力,也是一条证明实力最好的捷径。小编也收集整理了不少近期设计大赛,分别标注了截止日期和官网等,宝子们记得码住收藏,赶紧SHOW起来!优酷X站酷 一千零…...
MongoDB与MySQL有区别吗?用一个表格跟你说明
MongoDB MySQL 数据库模型 非关系型 关系型 存储方式 虚拟内存持久化 不同引擎有不同存储方式 查询语句 独特MongoDB查询方式 传统SQL语句 架构特点 可通过副本集和分片实现高可用 常见有单点、M-S、MHA、MMM、Cluster等架构方式 数据处理方式 基于内存…...
ElasticSearch - 分布式文档索引、搜索、更新和删除文档的过程
文章目录1. 分布式文档存储1. 路由一个文档到一个分片中2. 主分片和副本分片如何交互3. 新建、索引和删除文档4. 取回一个文档5. 局部更新文档2. ElasticSearch相关问题1. 路由计算方式?2. 分片控制3. 分布式文档写入(索引)的过程?4. 分布式文档搜索的过…...
Python之re库用法细讲
文章目录前言一、使用 re 模块的前期准备工作二、使用 re 模块匹配字符串1. 使用 match() 方法进行匹配2. 使用 search() 方法进行匹配3. 使用 findall() 方法进行匹配三、使用 re 模块替换字符串四、使用 re 模块分割字符串总结前言 在之前的博客中我们学习了【正则表达式】的…...
MATLAB | 如何绘制github同款日历热力图
应粉丝要求,出一个类似于github热图的日历热力图,大概长这样: 依旧工具函数放在文末,如有bug请反馈并去gitee下载更新版。 使用教程 使用方式有以下几种会慢慢讲到: heatmapDT(Year,T,V)heatmapDT(Year,T,V,MonLim)h…...
认识适配器模式
适配器模式 一、定义 在不修改原来代码的情况下,适配器模式使接口不兼容的那些类可以一起工作。 二、适配器结构 1、Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或者接口,也可以…...
JavaSe第6次笔记
1.不建议使用c语言的数组的表示方法。 2.二维数组表示方法 3.数组整体初始化时,只能在定义时初始化。 int[] array; array new int[]{1, 2}; 4. boolean类型数组,默认值是false,String类型数组,默认是null,其它是…...
单例设计模式
介绍 单例模式是一种创建型设计模式,其主要特点包括: 只有一个实例:单例模式确保系统中只有一个实例对象存在,所有对该对象的访问都是对同一个对象的引用全局访问:单例模式可以全局访问该实例对象,避免了多个对象之间的冲突和竞争延迟初始化:单例模式通常使用延迟初始化技术,…...
第七章 opengl之光照(基础光照)
OpenGL基础光照环境光照漫反射光照镜面光照基础光照 主要需要理解一个模型是冯氏光照模型,主要结构由3个分量组成:环境,漫反射,镜面光照。下面分别描述下这三个光照: 环境光照(Ambient Lighting):即使在黑…...
不考虑分配与合并情况下,GO实现GCMarkSweep(标记清除算法)
观前提醒 熟悉涉及到GC的最基本概念到底什么意思(《垃圾回收的算法与实现》)我用go实现(因为其他的都忘了,(╬◣д◢)ムキー!!) 源码地址(你的点赞,是我开源的…...
性能分析利器:火焰图
什么是火焰图 火焰图(FlameGraph)是是由 Linux 性能优化大师 Brendan Gregg 发明的。通过 perf 等工具分析得到结果,看起来就像是火焰,这也是它的名字的由来。火焰图以一个全局的视野来看待时间分布,它从底部往顶部&am…...
八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令
layout: post title: 八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令 description: 八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令 tag: 八股总结 文章目录操作…...
概率论小课堂:条件概率和贝叶斯公式(机器翻译的工作原理)
文章目录 引言I 条件概率1.1 条件概率的定义1.2 条件概率的计算II 贝叶斯公式2.1贝叶斯公式的本质2.2 机器翻译的原理引言 对于几乎所有的随机事件来讲,条件概率由于条件的存在,它通常不等于本身的概率。 贝叶斯公式的本质:在数学上条件和结果可以互换,通过这种互换,可以…...
流量与日志分析
文章目录1.流量与日志分析1.1系统日志分析1.1.1window系统日志与分析方法1.1.2linux 系统日志与分析方法1.2 web日志分析iis 日志分析方法apache日志分析**access_log****error_log**nginx日志分析tomcat 日志分析主流日志分析工具使用1.流量与日志分析 日志,是作为…...
英文论文写作常用例句整理汇总(持续更新)
ContentsGeneral introductionProblem definitionGaps in literatureProblems solutionStudy motivationAims & objectivesSignificance and advantages of your work参考资料General introduction Research on __ has a long tradition For decades, one of the most pop…...
[N0wayBack 练习题] My_enc,Euler,EasyLock,RRRRSA,EasyNumber,pwn
加入一个队,队里的练习题不少,还有WP真好My_enc原题from secret import flag import randomdef Cyber_key(LEN):Key [[] for i in range(row)]for x in range(row):for i in range(LEN):Key[x].append(random.randint(0, 2023))return Keydef Punk_enc(Key, msg):out []for l…...
网分线缆测试和dc-block
今天的好苹果和坏苹果 好苹果:是校准件和网分都是好的,又给了我一次复盘的机会 网分测试线缆: 1.网分直接复位,如果网分复位是校准状态,且解的是精密转接头,BNC的,可以不校准,结果差…...
Java创建线程的方式只有一种:Thread+Runnable
Java创建线程的方式其实只有一种👨🎓一、继承Thread👨🎓二、实现Runnable接口👨🎓三、实现Callable接口👨🎓四、通过线程池创建👨🎓五、总结一般我…...
excel网站做链接/app宣传推广方案
[iOS]获取工程代码总量 昨天公司让填申请软件著作权的资料,需要知道代码总量,于是找了方法这里备注一下。 1.打开"终端"用cd命令切换工作目录 cd 拖入工程中指定的某个文件夹 2.执行指令 返回代码总量的同时还会返回目录下各文件的代码…...
企业网站模板文件管理/小程序怎么引流推广
发现把含main()函数放到gdu_xmp下就编译正常,放到工程根目录下编译报错,好像找不到含main()的.c文件...
网络运营者应当对其收集的用户信息严格保密/专业seo关键词优化
通过加速,国内用户能够快速访问最流行的 Docker 镜像。 仓库 registry.docker-cn.com 包含流行的公有镜像。私有镜像仍需要从 Docker Hub 镜像库中拉取。 以下命令直接从镜像加速地址进行拉取: $ docker pull registry.docker-cn.com/myname/myrepo:myta…...
免费自制app软件靠谱么/网站搜索优化方法
Nginx默认没有开启利用多核CPU,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核CPU。CPU是任务处理,计算最关键的资源,CPU核越多,性能就越好。配置Nginx多核CPU,worker_cpu_affinity使用方法和范例1. 2核CPU,开启2个进…...
wordpress多用户商城/数据分析师要学什么
本文收集整理关于python如何解一元二次方程的相关议题,使用内容导航快速到达。 内容导航: Q1:python 使用try except解一元二次方程问题 12345678910111213141516171819报错UnboundLocalError:localvariableareferencedbeforeassignment这个报…...
数字企业管理系统/漯河搜狗关键词优化排名软件
- 题目大意 输入几个单词,让你判断不同的单词有几个(不必区分大小写)。 - 解题思路 因为不区分大小写,所以现将单词换位统一格式,然后只需用set容器即可(因为set中不会有重复的元素出现)。 - 代…...