当前位置: 首页 > 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 不同隔离级别…...

Robust Self-Augmentation for Named Entity Recognition with Meta Reweighting

摘要 近年来&#xff0c;自我增强成为在低资源场景下提升命名实体识别性能的研究热点。Token substitution and mixup &#xff08;token替换和表征混合&#xff09;是两种有效提升NER性能的自增强方法。明显&#xff0c;自增强方法得到的增强数据可能由潜在的噪声。先前的研究…...

Java基础-xml

1.xml 1.1概述 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为止&#…...

TCP的Nagle算法和delayed ack---延时发送和延时应答与稍带应答选项

本文目录提高TCP的网络利用率的二个思考解决方案&#xff1a;Nagle算法和delayed ack&#xff08;延时发送和延时应答与稍带应答选项&#xff09;Nagle算法和delayed ack算法同时启动可能会导致的问题提高TCP的网络利用率的二个思考 我们都知道&#xff0c;TCP是一个基于字节流…...

智能拣配单解决方案

电子货架标签系统&#xff08;ESLs&#xff09;&#xff0c;是一种放置在货架上、可替代传统纸质价格标签的电子显示装置&#xff0c; 每一个电子货架标签通过有线或者无线网络与商场计算机数据库相连&#xff0c; 并将最新的商品价格通过电子货架标签上的屏显示出来。 电子…...

如何防御入侵服务器

根据中华人民共和国刑法&#xff1a; 第二百八十六条违反国家规定&#xff0c;对计算机信息系统功能进行删除、修改、增加、干扰&#xff0c;造成计算机信息系统不能正常运行&#xff0c;后果严重的&#xff0c;处五年以下有期徒刑或者拘役&#xff1b;后果特别严重的&#xff…...

[软件工程导论(第六版)]第4章 形式化说明技术(课后习题详解)

文章目录1. 举例对比形式化方法和欠形式化方法的优缺点。2. 在什么情况下应该使用形式化说明技术&#xff1f;使用形式化说明技术时应遵守哪些准则&#xff1f;3. 一个浮点二进制数的构成是&#xff1a;一个可选的符号&#xff08;&#xff0b;或&#xff0d;&#xff09;&…...

Premiere基础操作

一&#xff1a;设置缓存二&#xff1a;ctrI导入素材三&#xff1a;导入图像序列四&#xff1a;打开吸附。打开吸附后素材会对齐。五&#xff1a;按~键可以全屏窗口。六&#xff1a;向前选择轨道工具。在时间线上点击&#xff0c;向前选中时间线上素材。向后选择轨道工具&#x…...

Prometheus监控案例-tomcat、mysql、redis、haproxy、nginx

监控tomcat tomcat自身并不能提供监控指标数据&#xff0c;需要借助第三方exporter实现&#xff1a;https://github.com/nlighten/tomcat_exporter 构建镜像 基于tomcat官方镜像&#xff0c;重新制作一个镜像&#xff0c;将tomcat-exporter和tomcat整合到一起。Ddockerfile如…...

如何寻找SAP中的增强

文章目录0 简介1 寻找一代增强2 寻找二代增强2.2 在包里也可以看到2.3 在出口对象里输入包的名字也可以找到2.4 通过以下函数可以发现已有的增强2.5 也可以在cmod里直接找2.6 总结3 寻找第三代增强0 简介 在SAP中&#xff0c;对原代码的修改最不容易的是找增强&#xff0c;以下…...

算法刷题打卡第95天: 最大平均通过率

最大平均通过率 难度&#xff1a;中等 一所学校里有一些班级&#xff0c;每个班级里有一些学生&#xff0c;现在每个班都会进行一场期末考试。给你一个二维数组 classes &#xff0c;其中 classes[i] [passi, totali] &#xff0c;表示你提前知道了第 i 个班级总共有 totali…...

找人做网站被骗/襄阳seo

zend studio12.0.1 下载链接&#xff1a;http://pan.baidu.com/s/1ntkOQz3 这是我学习的时候用的版本&#xff0c;应该后续也是大同小异。在这里初学者往往面对一个陌生的开发工具会很迷茫&#xff0c;作为开发工具来讲最重要的就是调试功能了&#xff0c;这里我们介绍一下…...

wordpress 特色照片/中国时事新闻网

矩阵的乘方运算与开方运算 在matlab7.0中&#xff0c;可以使用A^p来计算A的p次方&#xff0c;使用sqrtm()来对矩阵开方运算&#xff0c;如果有X*XA,则有sqrtm(A)X; 矩阵的开方运算与乘方运算互为逆运算。 矩阵的指数运算用expm函数来实现&#xff0c;expm(X)V*diag(exp(diag(…...

建设网站的网站叫什么/如何推广好一个产品

我确实理解准备好的语句是寻求防止sql注入的最终方法.但是,它们以有限的方式提供覆盖;例如,在我让用户决定操作顺序如何(即ASC或DESC等等)的情况下,我没有用准备好的语句覆盖那里.我知道我可以将用户输入映射到预定义的白名单.但是,这只有在事先可以创建或猜测白名单时才有可能…...

国外比较好的设计网站/seo的内容怎么优化

...

崇明专业网站建设/爱战网关键词

前言 在前几篇文章中我们介绍过了AbstractAssignAnalyzer.visitIf(JCIf),该方法是用来判断在if语句中变量的初始化情况的.例如如下代码: public void assgin(){int c;int a 0;if(c ! 0){} }在IDE 中会提示 The local variable c may not have been initialized,那么它是如何…...

如何做导航网站/做电商必备的几个软件

题目链接&#xff1a;https://www.codechef.com/SEPT17/problems/MINPERM 求最小的错排 奇偶要分类讨论 偶数个时把[1,n]两两分组&#xff0c;每组两个交换&#xff0c;如[1,2]&#xff0c;[3,4]等 偶数个时前面一样&#xff0c;后面三个特殊处理&#xff0c;n−2,n−1,n变…...