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

【Python】以邮件的方式定时发送一天的股票分析报告

【Python】以邮件的方式定时发送一天的股票分析报告

文章目录

  • 【Python】以邮件的方式定时发送一天的股票分析报告
    • 1、Python发送邮件
      • 1)`EmailSender`封装
      • 2)可能存在的问题
    • 2、jinja2动态渲染html页面
    • 3、阿里云OSS搭建图床
      • 1)Python上传图片到OSS中
      • 2)使用`PicGo`上传图片到OSS中
      • 3)图片链接访问报错解决
    • 4、APScheduler定时任务
      • 1)APScheduler四个组件
      • 2)配置scheduler调度器

假设我现在的需求是:

假设我已经实现了对某只股票的分时/日/周/月K线,以及对应指标(RSI,BOLL,OBV,MACD)的绘制。

在这里插入图片描述

如果我想让系统每天在股市结束后,给我发送关于几只自选股票的分析报告,我可以通过如下方式实现:

  • 1)让系统对今天几只股票的分时/日/周/月K线以及对应指标进行计算和绘制;

  • 2)绘制的图片自动上传到阿里云OSS中,并返回关于已上传图片的url链接;

  • 3)根据给定的html模板,利用Jinja2工具包,将今天的股票绘制结果动态渲染到html

  • 4)系统将生成的html文件以邮件的形式发送到指定的收件人中;

这里分成4个模块,依次对邮件发送、html模板渲染、图床搭建、定时任务进行介绍,这里并没有给出实现这个需求的完整代码。

1、Python发送邮件

参考资料:

  • 简单三步,用 Python 发邮件_程序员王饱饱的博客-CSDN博客_python 发送邮件

  • Python SMTP发送邮件 | 菜鸟教程

1)EmailSender封装

封装好的邮件发送类EmailSender代码如下:包括文本内容、带txtpdf、图片和html的附件发送。

  • MIMEMultipart可以允许带附件;

  • 如果想添加一个txt或者html文本附件,用MIMEText封装;

  • 如果想添加一个pdf文本附件, 用MIMEApplication封装,参考# 【Mail小技巧】如何使用Python优雅的发送带有pdf附件的电子邮件;

  • 如果想添加一个照片附件,用MIMEImage封装;

# 参考 https://blog.csdn.net/weixin_55154866/article/details/128098092
# 参考 https://www.runoob.com/python/python-email.html
# 参考 https://blog.csdn.net/YP_FlowerSky/article/details/124451913
import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import pdfplumber
from pathlib import Pathclass EmailSender:def __init__(self,mail_host,mail_user,mail_pass,sender):'''@param mail_host 设置登录及服务器信息,比如网易邮箱是smtp.163.com; type=str@param mail_user 邮箱用户名; type=str@param mail_pass 邮箱授权码; type=str@param sender 邮件发送方邮箱地址; type=str'''self.mail_host = mail_hostself.mail_user = mail_userself.mail_pass = mail_passself.sender = sender'''初始化一封邮件'''def init_email(self,receivers,content,subject):'''@param receivers 接收方邮箱集合,适合群发; type=list@param content 文本内容;type=str@param subject 主题; type=str'''# 参考 https://blog.csdn.net/YP_FlowerSky/article/details/124451913self.receivers = receivers# 添加一个MIMEmultipart类,处理正文及附件self.message = MIMEMultipart()    #MIMEMultipart可以允许带附件self.message['From'] = self.sender  #发送方邮箱地址self.message['To'] = ','.join(receivers)   #接收方邮箱地址, 将['1046474088@qq.com','2802428220@qq.com']处理成'1046474088@qq.com,2802428220@qq.com'的strself.message['Subject'] = subjectself.message.attach(MIMEText(content,'plain', 'utf-8')) # 文本内容 (plain文本格式,utf-8编码)'''为邮件添加附件'''def email_wrapper(self,filePath,fileType="text"):'''@param filePath 文件路径; type=str@param fileType 文件类型,可选 ['text','html','image'];  type=str'''if(fileType == 'text'):suffix = filePath.split(".")[-1]# 添加一个pdf文本附件, 用MIMEApplication封装 参考 https://blog.csdn.net/popboy29/article/details/126396549if (suffix == 'pdf'):with open(filePath, "rb") as f:pdf_attach = MIMEApplication(f.read(), _subtype="pdf")#如果出现邮件发送成功,但邮箱接收到的附件变为bin格式的情况时,检查add_header是否出错 参考https://blog.csdn.net/hxchuadian/article/details/125773738pdf_attach.add_header('Content-Disposition', 'attachment', filename=str(Path(filePath).name))self.message.attach(pdf_attach)else:#添加一个txt文本附件,用MIMEText封装with open(filePath,'r')as h:content2 = h.read()#设置txt参数text_attach = MIMEText(content2,'plain','utf-8')#附件设置内容类型,方便起见,设置为二进制流text_attach['Content-Type'] = 'application/octet-stream'#设置附件头,添加文件名text_attach['Content-Disposition'] = f'attachment;filename="{filePath}"'self.message.attach(text_attach)if (fileType == 'html'):# 推荐使用html格式的正文内容,这样比较灵活,可以附加图片地址,调整格式等with open(filePath,'r') as f:# 设置html格式参数html_attach = MIMEText(f.read(), 'base64', 'gb2312')  # 将html文件以附件的形式发送html_attach['Content-Type'] = 'application/octet-stream'html_attach.add_header('Content-Disposition', 'attachment',filename=str(Path(filePath).name))  # filename是指下载的附件的命名self.message.attach(html_attach)if (fileType == 'image'):# 添加照片附件,用MIMEImage封装with open(filePath, 'rb') as fp:picture_attach = MIMEImage(fp.read())# 与txt文件设置相似picture_attach['Content-Type'] = 'application/octet-stream'picture_attach['Content-Disposition'] = f'attachment;filename="{filePath}"'# 将内容附加到邮件主体中self.message.attach(picture_attach)#登录并发送def sendEmail(self):try:smtpObj = smtplib.SMTP()smtpObj.connect(self.mail_host, 25)smtpObj.login(self.mail_user, self.mail_pass)smtpObj.sendmail(self.sender, self.receivers, self.message.as_string())  #receivers群发, receivers是一个列表['1046474088@qq.com','2802428220@qq.com']print('success')smtpObj.quit()except smtplib.SMTPException as e:print('error', e)

2)可能存在的问题

参考

  • 如果出现list‘ object has no attribute ‘encode‘_list' object has no attribute 'encode,主要原因是self.message['To']赋值有误,要想实现群发,需要将['1046474088@qq.com','2802428220@qq.com']处理成'1046474088@qq.com,2802428220@qq.com'str类型

    参考Selenium /Python 配置QQ邮箱后台自动发送邮件unittest//发送多人邮件报错: ‘list‘ object has no attribute ‘encode‘_list’ object has no attribute 'encode

  • 如果出现邮件发送成功,但邮箱接收到的附件变为bin格式的情况时,检查add_header是否出错。可参考Python 发送邮件时图片附件变为bin格式的解决方案

2、jinja2动态渲染html页面

参考Python之jinja2模板引擎生成HTML_宗而研之的博客-CSDN博客_python 生成html

html模板如下:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<html align='left'><body><h1>{{today}}股票分析报告</h1><table>{% for stock in stocks %}<tr align='center'><td>{{ stock.code }}</td><td>{{ stock.codeName }}</td><td><a href="{{stock.minute_kline_path}}">分时K线图</a> </td><td><a href="{{stock.daily_kline_path}}">日K线图</a> </td><td><a href="{{stock.week_kline_path}}">周K线图</a> </td><td><a href="{{stock.month_kline_path}}">月K线图</a> </td></tr>{% endfor%}</table></body>
</html>

python代码如下:

import datetimefrom jinja2 import Environment, FileSystemLoader
import datetimeimport sys
import os
from pathlib import Path
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)imgDir = os.path.join(rootPath,"html_task/temp/")def generate_html(today, stocks):env = Environment(loader=FileSystemLoader('./'))template = env.get_template('template.html')with open("result.html", 'w+') as fout:html_content = template.render(today=today,stocks=stocks)fout.write(html_content)if __name__ == "__main__":today = datetime.datetime.now().strftime("%Y-%m-%d")stocks = []stock1_path = os.path.join(imgDir,"sh601728")stock2_path = os.path.join(imgDir,"sz000722")stock1 = {'code': 'sh601728', 'codeName': '中国电信','minute_kline_path': stock1_path + "/" + "minute_K_line.png",'daily_kline_path': stock1_path + "/" + "daily_K_line.png",'week_kline_path': stock1_path + "/" + "week_K_line.png","month_kline_path" : stock1_path + "/" + "month_K_line.png", }stock2 = {'code': 'sz000722', 'codeName': '湖南发展','minute_kline_path': stock2_path + "/" + "minute_K_line.png",'daily_kline_path': stock2_path + "/" + "daily_K_line.png",'week_kline_path': stock2_path + "/" + "week_K_line.png","month_kline_path" : stock2_path + "/" + "month_K_line.png", }stocks.append(stock1)stocks.append(stock2)generate_html(today, stocks)  #图片无法正常显示,会报错:Not allowed to load local resource# 图片无法正常显示 解决方法参考 http://www.kuazhi.com/post/319149.html

生成的html可视化效果如下:

在这里插入图片描述

但是存在一个问题 - 点击链接并不能正常下载或访问图片,主要原因是:浏览器出于安全方面的考虑,禁止网页访问本地文件,因为图片是存在项目目录下的,所以无法通过本地的url进行访问。(参考浏览器报错:Not allowed to load local resource 原因及解决办法_扭不开瓶盖的三水的博客-CSDN博客)

因此这里打算用图床返回的图片url链接来解决Not allowed to load local resource问题。

3、阿里云OSS搭建图床

参考

  • 阿里云 oss 服务 —— 上传图片,获取url

  • 阿里云OSS使用流程

  • 使用阿里云OSS搭建图床 - 简书

1)Python上传图片到OSS中

使用python将图片上传到阿里云OSS(挺便宜的,买了1年9 rmb的资源包)中,然后通过url链接访问图片。其中建议使用RAM用户ACCESS_KEY_IDACCESS_KEY_SECRETBUCKET_NAME是购买的OSS实例名称,ENDPOINT是这个OSS实例的地域节点,具体获取方式参考阿里云OSS使用流程

# 使用阿里云OSS + picGo搭建图床 参考 https://www.jianshu.com/p/111ce9603ea6l# -*- coding: utf-8 -*-
import datetime
import oss2
import unittest# 阿里云OSS使用流程 参考 https://zhuanlan.zhihu.com/p/567771838
ACCESS_KEY_ID = "LTAI5*****Hu6m"  #RAM账号access_key_id,如果没有用主账号登录工作台创建并授权,关于RAM角色参考 https://ram.console.aliyun.com/roles
ACCESS_KEY_SECRET = "mkit8YsLh*****TYmoh1QRzK"  #RAM账号access_key_secret
ENDPOINT = "oss-cn-shenzhen.aliyuncs.com"  #可以在bucket中获取地域节点endpoint 参考 https://zhuanlan.zhihu.com/p/567771838
BUCKET_NAME = "w*****i-20200401"#参考 https://www.likecs.com/show-308529932.html#sc=900
class Oss:"""oss存储类上传bytes流,返回状态码和url"""def __init__(self, access_key_id=ACCESS_KEY_ID, access_key_secret=ACCESS_KEY_SECRET,endpoint=ENDPOINT, bucket_name=BUCKET_NAME):# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。auth = oss2.Auth(access_key_id, access_key_secret)# Endpoint以杭州为例,其它Region请按实际情况填写。'http://oss-cn-hangzhou.aliyuncs.com'self.bucket = oss2.Bucket(auth, endpoint, bucket_name)def upload_bytes(self, file_bytes, image_name):"""上传bytes文件"""result = self.bucket.put_object('{}'.format(image_name), file_bytes)class OSSTest(unittest.TestCase):def test_oss_uploadFile(self):oss_obj = Oss()with open("temp/sh601728/minute_K_line.png","rb") as f:oss_obj.upload_bytes(f.read(),"minute_K_line.png")def test_oss_downloadFile(self):# 上传后,可以访问的 url 的组成photo_name = 'minute_K_line.png'domain = f'https://{BUCKET_NAME}.{ENDPOINT}/'url_photo = domain + photo_nameprint(url_photo)#访问该图片时可能会报错:You have no right to access this object because of bucket acl.# 解决方法:在bucket的权限控制中,将私有修改为公共读 参考 https://blog.csdn.net/zsy3757486/article/details/126938973

2)使用PicGo上传图片到OSS中

在官网[Releases · Molunerfinn/PicGo · GitHub](https://github.com/Molunerfinn/PicGo/releases)下载安装好PicGo之后,在图床配置中配置好阿里云OSS的ACCESS_KEY_IDACCESS_KEY_SECRETBUCKET_NAME存储区域地址后,即可实现图片上传,具体参考使用阿里云OSS搭建图床 - 简书

3)图片链接访问报错解决

正常情况下上传到图片可以通过如下链接访问:

https://{BUCKET_NAME}.{ENDPOINT}/photo_name   #photo_name是上传到图片名称

但是在测试图片url连接时可能会报错:You have no right to access this object because of bucket acl.

解决方法:bucket的权限控制中,将私有修改为公共读。参考【阿里云OSS】You have no right to access this object because of bucket acl._路遥叶子的博客-CSDN博客

4、APScheduler定时任务

参考

  • Python 定时任务的实现方式
  • BlockingScheduler与BackgroundScheduler区别
  • APScheduler 定时任务详解

APScheduler定时框架:终于找到了可以每天定时喊我起床的方式了

APScheduler是一个 Python 定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及 crontab 类型的任务,并且可以持久化任务、并以 daemon 方式运行应用

使用 APScheduler 需要安装

pip install apscheduler

首先来看一个周一到周五每天早上6点半喊我起床的例子

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime
# 输出时间
def job():print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# BlockingScheduler
scheduler = BlockingScheduler()
scheduler.add_job(job, 'cron', day_of_week='1-5', hour=6, minute=30)
scheduler.start()

1)APScheduler四个组件

APScheduler 四个组件分别为:触发器(trigger),作业存储(job store),执行器(executor),调度器(scheduler)

a、触发器(trigger)

包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行。除了他们自己初始配置意外,触发器完全是无状态的
APScheduler 有三种内建的 trigger:

date: 特定的时间点触发
interval: 固定时间间隔触发
cron: 在特定时间周期性地触发

b、作业存储(job store)

存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中。一个作业的数据讲在保存在持久化作业存储时被序列化,并在加载时被反序列化。调度器不能分享同一个作业存储。
APScheduler 默认使用 MemoryJobStore,可以修改使用 DB 存储方案

c、执行器(executor)

处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。
最常用的 executor 有两种:

ProcessPoolExecutor
ThreadPoolExecutor

d、调度器(scheduler)

通常在应用中只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。

2)配置scheduler调度器

APScheduler提供了许多不同的方式来配置调度器,你可以使用一个配置字典或者作为参数关键字的方式传入。你也可以先创建调度器,再配置和添加作业,这样你可以在不同的环境中得到更大的灵活性。

下面来看一个简单的 BlockingScheduler 例子

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetimedef job():print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# 定义BlockingScheduler
sched = BlockingScheduler()
sched.add_job(job, 'interval', seconds=5)
sched.start()

上述代码创建了一个 BlockingScheduler,并使用默认内存存储和默认执行器。(默认选项分别是 MemoryJobStoreThreadPoolExecutor,其中线程池的最大线程数为10)。配置完成后使用 start() 方法来启动。

如果要给job传参,可以在add_job中使用args参数,如果要给job设置指定id,可以使用id参数

rom datetime import datetimefrom apscheduler.schedulers.blocking import BlockingSchedulerdef func(name):now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')print(now + f" Hello world, {name}")scheduler = BlockingScheduler()
scheduler.add_job(func, 'interval', seconds=3, args=["desire"], id="func")
scheduler.start()

移除job

  • 1)通过job的ID来调用remove_job方法
  • 2)通过在add_job()中得到的job实例调用remove()方法
  • 如果一个job完成了调度(例如他的触发器不会再被触发), 它会自动被移除

如果job_id不存在,remove_job会报错,可以用try - except来处理

# remove
job = scheduler.add_job(func, 'interval', seconds=3, args=["desire"], id="job_remove")
job.remove()# remove_job
scheduler.add_job(func, 'interval', seconds=3, args=["desire"], id="job_remove")
scheduler.remove_job(job_id="job_remove")

终止调度器中的执行器

scheduler.shutdown()  #终止调度器中的任务存储器以及执行器
scheduler.shutdown(wait=False)

默认情况,会终止任务存储器以及执行器,然后等待所有目前执行的job完成后(自动终止),wait=False 此参数不会等待任何运行中的任务完成,直接终止。但是如果scheduler没有执行,shutdown()会报错。

相关文章:

【Python】以邮件的方式定时发送一天的股票分析报告

【Python】以邮件的方式定时发送一天的股票分析报告 文章目录【Python】以邮件的方式定时发送一天的股票分析报告1、Python发送邮件1&#xff09;EmailSender封装2&#xff09;可能存在的问题2、jinja2动态渲染html页面3、阿里云OSS搭建图床1&#xff09;Python上传图片到OSS中…...

mybatis条件构造器(二)

mybatis条件构造器(二) 1 准备工作 1.1 建表sql语句(Emp表) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int NOT NU…...

C++【类与对象】

文章目录类与对象&#xff08;1&#xff09;类与对象一1.0.面向过程和面向对象初步认识1.1.类的引入1.2.类的定义1.3.类的访问限定符及封装1.4.类的作用域1.5.类的实例化1.6.类的对象大小的计算1.8.类成员函数的this指针&#xff08;2&#xff09;类与对象二2.0类的6个默认成员…...

假设检验选择统计量重点-----正态总体参数的假设检验

文章目录单个正态总体参数的假设检验单个正态总体N(μ,σ2)N(\mu,\sigma^2)N(μ,σ2)的均值μ\muμ的假设检验1.σ2\sigma^2σ2已知(U检验法)单个正态总体方差的假设检验单边检验简介--计算拒绝域两个正态总体参数的假设检验方差已知的两正态总体均值的假设检验均值未知的两正态…...

华为OD机试 - 通信误码(Python) | 机试题算法思路 【2023】

最近更新的博客 华为OD机试 - 自动曝光(Python) | 机试题算法思路 【2023】 华为OD机试 - 双十一(Python) | 机试题算法思路 【2023】 华为OD机试 - 删除最少字符(Python) | 机试题算法思路 【2023-02】 华为OD机试 - Excel 单元格数值统计(Python) | 机试题算法思路 …...

设计模式之装饰者模式

文章の目录一、什么是装饰者模式二、优势三、缺点四、应用场景五、示例参考写在最后一、什么是装饰者模式 装饰者模式也称为包装器模式&#xff0c;在不改变原有对象的基础上为其动态的添加上新的功能。 装饰者模式有以下特点&#xff1a; 添加功能时不改变原对象结构。装饰…...

【第31天】SQL进阶-写优化- 插入优化(SQL 小虚竹)

回城传送–》《31天SQL筑基》 文章目录零、前言一、练习题目二、SQL思路&#xff1a;SQL进阶-写优化-插入优化解法插入优化禁用索引语法如下适用数据库引擎非空表&#xff1a;禁用索引禁用唯一性检查语法如下适用数据库引擎禁用外键检查语法如下适用数据库引擎批量插入数据语法…...

SpringBoot自动装配的原理

前言 在开发SpringBoot项目时&#xff0c;当我们引入spring-boot-starter-xxx依赖后&#xff0c;想要使用依赖中的bean&#xff0c;直接就用Autowired拿来用了&#xff0c;不需要用xml或者注解的方式把它先注入到Spring容器中。这就是自动装配的特性&#xff0c;本文来讲述Spri…...

Vue3电商项目实战-分类模块5【12-二级类目-结果区-排序组件、13-二级类目-结果区-数据加载、14-二级类目-结果区-进行筛选】

文章目录12-二级类目-结果区-排序组件13-二级类目-结果区-数据加载14-二级类目-结果区-进行筛选12-二级类目-结果区-排序组件 目的&#xff1a;封装排序组件&#xff0c;完成排序切换效果 大致步骤&#xff1a; 定义一个组件 sub-sort&#xff0c;完成基础布局在 sub.vue 组件…...

计算机操作系统概述

文章目录1.0 操作系统概述1.1 操作系统的目标1.2 操作系统的功能1.3 操作系统结构1.4 操作系统接口1.5 操作系统的发展1.6 操作系统的特征2.0 进程管理2.1 进程调度2.2 进程调度算法2.3 进程间通信2.4 进程间的同步2.5 软件实现互斥的方法2.6 硬件实现互斥的方法2.7 信号2.8 管…...

面试官让你说说react状态管理?

hooks 为什么不能放在条件判断里 以 setState 为例&#xff0c;在 react 内部&#xff0c;每个组件(Fiber)的 hooks 都是以链表的形式存在 memoizeState 属性中 update 阶段&#xff0c;每次调用 setState&#xff0c;链表就会执行 next 向后移动一步。如果将 setState 写在条…...

CUDA线程块的分配

为了确保能够真正地了解线程块的分配&#xff0c;接下来我们写一个简短的内核程序来输出线程块、线程、线程束和线程全局标号到屏幕上。现在&#xff0c;除非你使用的是 3.2 版本以上的 SDK否则内核中是不支持 printf的。因此&#xff0c;我们可以将数据传送回 CPU 端然后输出到…...

史密斯圆图

在射频、微波中&#xff0c;常常使用史密斯圆图来做阻抗匹配。在不涉及复杂的数学推导&#xff0c;仍能把圆图用起来。 比如&#xff0c;共轭匹配。 RL1jX&#xff0c;需要找到-jX来抵消jX&#xff0c;消掉虚部之后&#xff0c;只留下实部&#xff0c;最终等效为RL‘1。 史密…...

Spring国际化实现

Java国际化 Java使用Unicode来处理所有字符。 Locales 国际化主要涉及的是数字、日期、金额等。 有若干个专门负责格式处理的类。为了对格式进行控制&#xff0c;可以使用Locale类。它描述了&#xff1a; 一种语言一个位置(通常包含)一段脚本(可选&#xff0c;自Java SE7开…...

10- 天猫用户复购预测 (机器学习集成算法) (项目十) *

项目难点 merchant: 商人重命名列名: user_log.rename(columns{seller_id:merchant_id}, inplaceTrue)数据类型转换: user_log[item_id] user_log[item_id].astype(int32)主要使用方法: xgboost, lightbm竞赛地址: 天猫复购预测之挑战Baseline_学习赛_天池大赛-阿里云天池…...

对于《MySQL 实战45讲》的理解

一.理论 一条SQL执行过程 连接器分析器优化器执行器 索引 索引的出现其实就是为了提高数据查询的效率&#xff0c;就像书的目录一样 常见索引数据结构(每碰到一个新数据库&#xff0c;我们需要先关注它的数据模型&#xff0c;这样才能从理论上分析出这个数据库的适用场景) 哈希…...

XQuery 函数

XQuery 1.0、XPath 2.0 以及 XSLT 2.0 共享相同的函数库。 XQuery 函数 XQuery 含有超过 100 个内建的函数。这些函数可用于字符串值、数值、日期以及时间比较、节点和 QName 操作、序列操作、逻辑值等等。您也可在 XQuery 中定义自己的函数。 XQuery 内建函数 XQuery 函数命…...

Elasticsearch的安装及常用操作

文章目录一、Elasticsearch的介绍1、Elasticsearch索引2、Elasticsearch的介绍二、Elasticsearch的安装1、安装ES服务2、安装kibana3、Docker安装ES4、Docker安装Kibana三、ES的常用操作1、索引操作2、文档操作3、域的属性3.1 index3.2 type3.3 store总结一、Elasticsearch的介…...

网络安全应急响应服务方案怎么写?包含哪些阶段?一文带你了解!

文章目录一、服务范围及流程1.1 服务范围1.2 服务流程及内容二、准备阶段2.1 负责人准备内容2.2 技术人员准备内容&#xff08;一&#xff09;服务需求界定&#xff08;二&#xff09;主机和网络设备安全初始化快照和备份2.3市场人员准备内容&#xff08;1&#xff09;预防和预…...

11、事务原理和实战,MVCC

事务原理和实战 1. 认识事务2. 事务控制语句2.1 开启事务2.2 事务提交2.3 事务回滚3. 事务的实现方式3.1 原子性3.2 一致性3.3 隔离性3.3 持久性4purge thread线程5事务统计QPS与TPS5.1 QPS5.2 TPS6. 事务隔离级别6.1 隔离级别6.2 查看隔离级别6.3 设置隔离级别6.4 不同隔离级别…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...