批量发送邮件解决方案

首先批量发邮件肯定不能是循环得让用户等待发送完毕 我有两种实现,其实说白了本质都是一样得 1.定时器+队列 2.定时器+数据库表 还有一种我没有尝试,不过我个人感觉可能不太好,如果有大佬希望可以指点一二 那就是新开一个线程异步得一直发送,主线程则直接返回一个结果给用户即可(描述不精准勿怪) 我两种方式都采用了得,不过我得场景用数据库表更为恰当舒适,我就仅贴数据库表+定时器得实现代码了。 我是用laravel实现的 先使用命令php artisan make:command ProcessEmailQueue创建一个新的 Artisan 命令 首先先把需要的数据全部查出来存入数据库中 public function sendEmail() { $authRepositories = new AuthRepositories(); $historyRepositories = new HistoryRepositories(); $userStr = $this->input['userIds']; $id = $this->input['historyId']; $content = $this->input['content'] ?? ''; $type = $this->input['type'] ?? 0; //0-正常发送 1-定时发送 $timing = $this->input['timing'] ?? null; if ($timing) { $timing = date('Y-m-d H:i:s', strtotime($timing)); } $model = $historyRepositories->findVersion($id); $now = $model->now; $fileId = $model->file_id; $Filename = $model->label; $userIds = explode(',', $userStr); $users = $authRepositories->selectIn($userIds); $time = $model->updated_at; $bulkData = []; foreach ($users as $user) { $bulkData[] = [ 'username' => $user->username, 'email' => $user->email, 'now' => $now, 'content' => $content, 'timing' => $type == 1 ?

STM32F1+HAL库+FreeTOTS学习7——列表和列表项

STM32F1+HAL库+FreeTOTS学习7——列表和列表项 列表和列表项简介列表列表项迷你列表项 列表项API函数介绍1. 初始化列表2. 初始化列表项3. 列表末尾插入列表项4. 列表插入列表项5. 移除列表项6. 补充:FreeRTOS中操作列表和列表项的宏 列表项的插入和删除实验总结 上一期我们学习了FreeRTOS的内核中断管理以及中断屏蔽控制函数,下面我们来学习临界端代码保护函数的使用 列表和列表项简介 列表是 FreeRTOS 中的一个数据结构,在FreeRTOS的源码中有大量的使用,本质上就是数据结构里面的双向循环链表,列表被用来跟踪 FreeRTOS中的任务。而列表项则是存放在列表中的元素,可以认为是链表里面的节点。下面是列表和列表项的关系: 列表 列表是 FreeRTOS 中最基本的一种数据结构,不同于数组,其在物理存储单元上是非连续、非顺序的。列表在 FreeRTOS 中的应用十分广泛,要注意的是,FreeRTOS 中的列表是一个双向链表,在list.h 文件中,有列表的相关定义,具体代码如下所示: typedef struct xLIST { listFIRST_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */ volatile UBaseType_t uxNumberOfItems; /* 列表中列表项的数量 */ ListItem_t * configLIST_VOLATILE pxIndex; /* 用于遍历列表 */ MiniListItem_t xListEnd; /* 最后一个列表项 */ listSECOND_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */ } List_t; 在该结构体中,包含了两个宏作为校验值,这两个宏用于存放确定已知常量,FreeRTOS通过检查这两个常量的值,来判断列表的数据在程序运行过程中,是否遭到破坏,类似这样的宏定义在列表项和迷你列表项中也有出现。该功能一般用于调试,默认是不开启的。uxNumberOfItems 用于记录列表中列表项的个数(不包含 xListEnd),当往列表中插入列表项时,该值加 1;当从列表中移除列表项时,该值减 1。pxIndex 用于指向列表中的某个列表项,一般用于遍历列表中的所有列表项。xListEnd 是一个迷你列表项,列表中迷你列表项的值一般被设置为最大值,用于将列表中的所有列表项按升序排序时,排在最末尾;同时 xListEnd 也用于挂载其他插入到列表中的列表项。 如下是列表的结构图: 列表项 列表项是列表中用于存放数据的地方,在 list.h 文件中,有列表项的相关结构体定义:

Docker 镜像导出与加载:从入门到精通

在容器化技术的世界中,Docker 镜像的导出与加载是开发与运维人员经常会用到的技能。本文将详细介绍如何导出 Docker 镜像为本地 tar 文件,并如何将其重新加载为 Docker 镜像,并分享一些操作中的小技巧与趣味总结。 一、Docker 镜像导出的秘籍 1. 准备工作 在进行 Docker 镜像导出之前,请确保已经正确安装了 Docker,并且拥有足够的权限。同时,请确认您的系统环境满足 Docker 的运行要求,如有足够的磁盘空间来存储导出的 tar 文件。 2. 具体命令与示例 导出 Docker 镜像为本地 tar 文件的命令格式如下: docker save -o <tar 文件路径> <镜像名称>:<标签> 例如,如果您有一个名为 myapp 的镜像,标签为 latest,可以使用以下命令: docker save -o myapp.tar myapp:latest 如果您只想导出镜像的特定版本,比如版本号为 1.0.0,则命令可以是: docker save -o myapp_1.0.0.tar myapp:1.0.0 3. 常见问题与解决 在导出镜像的过程中,可能会遇到权限问题。例如,如果在保存镜像时提示没有权限,可以尝试对保存的目标文件夹进行权限修改,使用以下命令: sudo chmod -R 777 <目标文件夹路径> 另外,有时候可能会因为正在运行的容器没有停止而导致无法导出镜像。此时,您需要先使用以下命令停止正在运行的容器: docker stop <CONTAINER_NAME> 然后再进行镜像导出操作。 二、本地 tar 文件加载成镜像的秘籍 1. 加载前的注意事项 在加载本地 tar 文件之前,请确保 Docker 服务正在运行,并且您拥有足够的权限进行操作。同时,要注意 tar 文件的完整性和准确性,以免出现加载失败的情况。

【GPT】Coze使用开放平台接口-【7】Dify 比较篇

个人主观,轻喷,没有什么绝对,只是相对 持续更新 用下来的感受是 coze 用于社交,dify 用来内部构建。抛开工作流,机器人,工具,coze 最大的区别在于可以直接发布到社交媒体上。所以,coze 对操作体验上也花了不少功夫,而 dify 就专注在帮助使用者打磨工作流。coze 各个大模块之前可以联动的机制也比较多,所以侧重点各不相同。 工作流页面布局 coze 工作流就专注在当下的工作流创建过程中,怎么调,谁调了,不管。就关注当下的测试,当前的版本。Dify 则会把工作流相关的都放在一个面板里面,编排好了测试,测试记录每一次的输入删除,节点的运行情况。怎么用,直接去访问 API 里面看,别人调用的去日志里面看,再去概览里面看调用情况。除了删除,从开始到调用,到分析,一条链路都有了,也不用一直开多个页面。 节点创建&连线 这点可能更主观一点,而且跟个人习惯更有关联。 有一个很大的区别就是,coze 可以把所有你想要的节点,先拉到画布上来,再去连线。 Dify 必须要一个节点跟着一个节点,添加下一个节点后,自动创建连线。唯一能创建节点的方式就是,用替换节点。替换节点的时候,节点的左右两条线都会清掉,不过这不方便。 有些过代码的同学可能会有点感受,有些同学可能写代码是先写完设计文档再写代码,有的同学是想一步写一步(Dify 当然可以画完全局然后再去画布上操作,不过我想大部分不会这样)。先写设计文档的,知道自己有哪些模块,拉进来相关节点,就相当于是写好了一个 func 的壳。再根据业务逻辑关系,去连线走逻辑。我个人是更倾向 coze 的方式,我看得到这个工作流的全貌。 撤销动作 Dify 不能 ctrl + z,非常痛苦。上面说到的替换节点,万一替换的节点不合适,是不能回撤到之前创建的节点的。如果之前节点是配置的一个 HTTP 或者大模型节点,会崩溃的(不要问我怎么知道的)。 工作流节点连接 coze 的节点可以连接多个 next 节点,Dify 只能连接 1 个,即使能拉线到另外一个节点,原本连接的线就会自动删除。 工作流节点输入参数引用方式 在节点输入参数的引用方式上,两边都可以输入,也都是用下拉框的形式。不过 coze 上直接点击就可以出现联级下拉框,相比 Dify 要输一个 / 来说方便一点。Dify 也有直接点击的,不过大部分是要用输入的。 coze 采用联级的方式的一个好处是,如果字段很多也不会那么担心。Dify 是直接展开来,在参数很多的情况下,并且你不对节点标明的话,会很痛苦。 节点参数输出 coze 相对 Dify 来说比较友好,不过这个友好的前提是,能够在创建工具的时候,或者在 HTTP 节点的时候花点时间配置好。Dify 贴一个 openApi 的 swagger json 就行,但是输出每次都要用代码执行节点重新转出来。这点的体验上来说,coze 的会更舒服一点,而且对之后要交接或者使用的人来说很直觉。要是 Dify 维护的人换了,还得去了解一下返回来的是什么。

【GPT】Coze使用开放平台接口-【5】API 调用

我们在机器人里面引用工作流,当然也可以通过 API 直接调用工作流,coze 也提供了这一套的 API 接口。coze 的 API 接口肯定也不只是接入工作流,Bots,文件,知识库等,都有相关接口。这个文档我们也只专注在工作流的 API 接口调用上,我们之后也会补充其他形式的 API 接口调用,尤其是对话的。 1. 创建授权 https://www.coze.cn/open/oauth/pats 所有的 API 请求都必须在请求头的 Authorization 参数中包含你的访问令牌(Access Token)。 我们这边只用来测试和调试,所以选择个人访问令牌,如果是生产的那种还是要选择 OAuth 令牌。个人访问令牌需要设置: 名称过期时间开通的权限:了每个模块里面有具体的细的权限,比如创建 bot 这种。 注意:创建好的令牌,会以弹窗形式展示,且只展示一次,要保存好。 2. 调用工作流参数 调用工作流有 3 个,执行工作流,执行工作流(流失响应),恢复运行工作流。后面 2 个明显是对话型的,跟我们之前的不符,所以我们用第一种的就可以了。 调用条件 已经发布的工作流 令牌开启工作流 run 的权限 不支持通过此 API 执行包括以下节点的工作流 消息节点开启了流式输出的结束节点问答节点 请求地址 POST:https://api.coze.cn/v1/workflow/run Header 参数取值说明AuthorizationBearer $Access_Token用于验证客户端身份的访问令牌,根据步骤 1 就可以生成了Content-Typeapplication/json解释请求正文的方式。 Body 我就列出来需要用到的字段,详细的见 https://www.coze.cn/docs/developer_guides/workflow_run#7232055f workflow_id 类型:String 是否可选:必选 说明: 已发布的工作流 ID,此 ID 在工作流编译页面的 URL 可以看到。如下图,workflow id 就是 73***47 parameters

【GPT】Coze使用开放平台接口-【2】创建工作流-语音伪造检测工作流

在Coze使用开放平台接口-【1】创建插件,我们已经成功创建了开放平台的插件,也创建了对应的工具。本文档就根据创建好的插件,来创建对应的工作流,来让接口能够用起来。 下面直接用现成的插件快商通AI开放平台,来创建语音伪造检测工作流,这个比较简单也比较容易上手。 1. 创建工作流 首先进到个人空间 -> 工作流 -> 点击右上角【创建工作流】,就会看到如下弹窗。 工作流名称跟描述,就看自己定义了。 1.1. 开始 刚创建好的工作流,只有开始和结束,2 个有且各自仅有 1 个。 这里不介绍每一个节点的功能,仅带过我们要用的节点。 因为我们用的是开放平台接口,所以流程就比较清晰,调用鉴权接口,再调用语音伪造接口,最后输出结果。 1.2. 配置开始节点 我们会用到鉴权接口和语音伪造接口,所以通过点击插件,找到快商通AI开放平台的插件(通过收藏也是可以的),然后添加对应的接口即可。 添加进来后,调整后,会如下图。 建议拉进来调整完后,就修改一下节点名称,避免之后混乱 所以我们就得到 4 个节点: 开始节点获取鉴权节点语音伪造检测节点结束节点 所以我们观察两个工具需要的传参后,给开始节点配置参数。为什么Authorization不用,因为可以由获取减去节点传给语音伪造检测节点。 变量类型还是相对丰富的: StringIntegerBooleanNumberObjectArray<String>Array<Integer>Array<Boolean>Array<Number>Array<Object> 1.3. 拉线 节点左右侧有个蓝点,可以通过点击,并拉到对应节点的蓝点上,就表示节点建立关系。注意,一条线上的节点,可以访问该节点之前的所有参数,包含输入或其中某个节点的输出。 每个节点,可以连接多个其他节点,而不是 1 对 1。 1.4. 配置获取鉴权节点输入 参数,可以通过引用,即在此节点之前的所有输入参数或者其中节点的输出参数,也可以直接通过输入的形式传参。 点击请选择即可以选择之前的所有参数。 1.5. 配置语音伪造检测节点输入 插件节点的输出是有参数格式的,所以在语音伪造检测节点选择输入的时候,可以很轻松地选择某个节点的输出。 想想在 Coze使用开放平台接口-【1】创建插件 受的苦是不是一切都值得了,为什么在添加节点后就修改名称,就会让每个节点在选择的时候更加清晰。 在 Authorization 这个参数上我们就可以选择,获取鉴权节点中输出参数的 access_token,其他的参数就选择开始的输入即可。 1.6. 添加代码节点 接口的返回就是 3 个参数,为了让结果返回地像是一句话,可以通过 代码 节点来对语音伪造检测节点的输出做一个规整。 代码一般我都选择 python,不会的同学也不要紧,直接让 gpt 帮忙写,因为我自己也不会。 1.7. 配置结束节点 结束节点就是给 output 配置结果规整节点的 result,回答模式如果是规整好的。可以直接选择使用设定的内容直接回答,不然如果选择 bot 自己回答,那可能会飞。

分布式:浅谈幂等

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和 setTrue()”函数就是一个幂等函数。简言之:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。 一、幂等有哪些技术解决方案 1、查询操作 查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select 是天然的幂等操作。 2、删除操作 删除操作也是幂等的,删除一次和多次删除都是把数据删除。注意:可能返回结果不一样,删除的数据不存在,返回 0,删除的数据多条,返回结果多个。 3、唯一索引 防止新增脏数据。比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建多个资金账户,那么给资金账户表中的用户 ID 加唯一索引,所以一个用户新增成功一个资金账户记录。 要点:唯一索引或唯一组合索引来防止新增数据存在脏数据(当表存在唯一索引,并发时新增报错时,再查询一次就可以了,数据应该已经存在了,返回结果即可。 4、token 机制 防止页面重复提交。 业务要求:页面的数据只能被点击提交一次; 发生原因:由于重复点击或者网络重发,或者 nginx 重发等情况会导致数据被重复提交; 解决办法: (1)集群环境,采用 token 加 redis(redis 单线程的,处理需要排队); (2)单JVM环境,采用 token 加redis或token加 jvm 锁。 处理流程: (1)提交前,向服务申请 token,token 放到 redis 或 jvm 内存,token设置有效时间; (2)提交后,后台校验 token,同时删除 token,生成新的 token 返回。 token 特点:要申请,一次有效性,可以限流。 注意:redis 要用删除操作来判断 token,删除成功代表 token 校验通过。 5、 TraceId 操作时TraceId是唯一的。 二、对外提供的API如何保证幂等 举例说明: 银联提供的付款接口,为了支持幂等调用,需要接入商户提交付款请求时附带source 来源,seq 序列号。source+seq 在数据库里面做做联合唯一索引,这样当第三方调用时,先在本方系统里面查询一下,是否已经处理过,返回相应处理结果;没有处理过,进行相应处理,返回结果。 注意,为了幂等友好,一定要先查询一下,是否处理过该笔业务,不查询直接插入业务系统,会报错,因为实际已经处理。

50ETF期权合约要素有哪些?50ETF期权合约组成构成分享

今天带你了解50ETF期权合约要素有哪些?50ETF期权合约组成构成分享。50ETF期权的买方有权利选择交易还是放弃交易,期权的行权日要在这天之前确定。如果你没有及时的进行平仓,那么你的合约价值就会归零。 50ETF期权合约 50ETF期权合约是基于上证50ETF的标准化期权合约,交易在中国的上海证券交易所。这些期权合约包含了几个关键要素,如下所述: 1.标的资产:50ETF,即追踪上证50指数的交易所交易基金。 2.期权类型:包括看涨期权(Call Option)和看跌期权(Put Option)。 3.执行价格:期权合约中约定的价格,持有者可以按此价格购买(看涨)或出售(看跌)标的资产。 4.到期日:期权的有效期限,到期后期权将失效。通常有多个到期日可供选择,如近月、次近月和远月等。 5.合约乘数:每个期权合约代表的50ETF的份额数量,通常是一个固定的数字,例如100份ETF。 6.期权费:购买期权时需支付的费用,由市场供需决定。 7.行权方式:大多数50ETF期权是欧式期权,只能在到期日行权。 这些要素共同定义了50ETF期权合约的具体内容和交易方式,投资者可以根据这些信息进行交易决策和风险管理。 50ETF期权合约组成 50ETF期权的代码由17位数组成,可以拆分为(50ETF代码)(认购或认沽)(合约时间)(行权价)。 举个例子,510050P2103M02900,简称50ETF沽3月2900,其中510050是50ETF的代码,P代表沽(看跌,若是认购的是C),2103代表2021年3月的期权合约,2900是行权价,即2.90元。 再举个例子,510050C2009M02350,简称50ETF购9月2350,C代表认购,2009代表2020年9月的期权合约,2350是行权价格,即2.35元。 至于期权和期货的区别,期权是一种选择权,对于买方来说,你支付权利金后,获得的是一种权利,到期可以执行也可以不执行,最多损失权利金而已。而期权是一种合约,你支付一定的保证金之后,到期就必须执行,否则就是违约。 以上就是“50ETF期权合约要素有哪些?50ETF期权合约组成构成分享”的全部内容,希望本文能给您带来帮助,在未来市场交易中收获满满,财源广进!

【数据结构】排序算法篇一

【数据结构】排序算法篇一 1. 插入排序(1)基本思想:(2)动态图解:(3)具体步骤:(4)代码实现:(5)特性总结: 2. 希尔排序( 缩小增量排序 )(1)基本思想:(2)静态图解:(3)具体步骤:(4)代码实现:(5)特性总结: 3. 堆排序(1)基本思想:(2)具体步骤:(3)代码实现:(4)特性总结: 4. 选择排序(1)基本思想:(2)动态图解:(3)具体步骤:(4)代码实现:(5)特性总结: 1. 插入排序 (1)基本思想: 由下图可以得出:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 (2)动态图解: (3)具体步骤: 当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移 (4)代码实现: void InsertSort(int *a,int aSize) { for (int i = 1; i < aSize; i++) { int end = i - 1; int tmp = a[i];//tmp需要保存的是数组i处的值(a[i]),如果存下标,会被a[end + 1] = a[end];该句代码覆盖 while (end >= 0) { if (tmp < a[end]) { a[end + 1] = a[end]; end--; } else { break; } a[end + 1] = tmp; } } } (5)特性总结: 元素集合越接近有序,直接插入排序算法的时间效率越高时间复杂度:O(N^2)空间复杂度:O(1),它是一种稳定的排序算法稳定性:稳定 2.

代码随想录算法训练营第五十七天 | 图论part07

53. 寻宝 prim算法 prim算法 #include <iostream> #include <vector> #include <fstream> #include <climits> using namespace std; int main() { int v, e; int v1, v2, val; ifstream infile("input.txt"); cin >> v >> e; vector<vector<int>> graph(v + 1, vector<int>(v + 1, INT_MAX)); while (e--) { cin >> v1 >> v2 >> val; graph[v1][v2] = val; graph[v2][v1] = val; } /*for (int i = 0; i < v + 1; ++i) { for (int j = 0; j < v + 1; ++j) { cout << "

一个比 Nginx 还简单的 Web 服务器

企业级的 Web 服务器非常多,Nginx、Tomcat、Apache、IIS、FastAPI、Flask 等。今天松哥再给大家介绍一个开源的 Web 服务器,这款服务器具备自动 HTTPS 功能和高度可配置性,它的名字是:Caddy。 Caddy 是一个 Go 编写的 Web 服务器,类似于 Nginx,Caddy 提供了更加强大的功能,随着 v2 版本发布,Caddy 已经可以作为中小型站点 Web 服务器的另一个选择。 相较于 Nginx 来说使用 Caddy 的优势如下: 自动HTTPS:Caddy 的自动 TLS 功能,让 HTTPS 变得触手可及,无需额外配置。配置简便性:Caddy 提供了两种配置方式——简洁的 Caddyfile 和功能丰富的 JSON 格式。配置灵活性:通过 JSON API,Caddy 允许实时更新配置,提供了极大的灵活性。代理能力:Caddy 的 HTTP 反向代理功能强大而灵活。静态资源托管:作为静态文件服务器,Caddy 已经证明了其在生产环境中的可靠性和扩展性。全平台支持:Caddy 支持 Linux、Windows、macOS 等多种操作系统。高性能:Go 语言的开发背景,保证了 Caddy 的高效性能和内存安全。 Caddy 轻量简单,对新手也比较友好,我们一起来看下 Caddy 的用法吧。 一 安装 可以直接使用 Linux 里边的包管理工具来安装 Caddy。 例如,在 Ubuntu 中我们可以使用如下命令安装: sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf 'https://dl.

1.3金融术语的宝典

各位未来的量化交易大师们,今天我们要揭开金融术语的神秘面纱,让它们不再是让人头大的拦路虎,而是成为我们通往财富之路的指南针! 首先,我们来聊聊基本面分析。 这就像中医看病,讲究“望闻问切”,通过分析公司的财务报表、行业地位、管理层能力等“内在”因素,来判断公司未来的发展前景。 比如说,你去看一家公司的财报,发现它的净利润持续增长,资产负债率低,那这家公司很可能是一只“绩优股”,值得投资。 然后,我们再来看看技术面分析。 这就像算命先生,通过观察股票价格和成交量的历史走势,来判断未来的走势。 比如说,你看到一只股票的价格在一段时间内一直在某个区间内震荡,成交量也相对稳定,那这只股票很可能处于“盘整阶段”,需要耐心等待突破时机。 接下来,我们来认识一下K线图。 这可是技术分析的灵魂啊!K线图就像股市的“心电图”,通过不同的K线组合,我们可以看出市场的情绪变化,从而判断未来的走势。 比如说,一根长长的阳线,代表着多头力量强劲,股价可能会继续上涨;而一根长长的阴线,则代表着空头力量强劲,股价可能会继续下跌。 首先,K线图到底是个啥? 想象一下,你和朋友去打台球,每次击球后,你都会在球桌上做一个标记,记录下击球的方向和力量。K线图就像股市的“台球记录表”,记录了每一根K线所代表的时间段内,股价的“开盘价、最高价、最低价和收盘价”这四个关键信息。 K线图长啥样? K线图就像一根根“小蜡烛”,分为“实体”和“影线”两部分: 实体: 表示开盘价和收盘价之间的距离,如果收盘价高于开盘价,实体就是空心的,我们称之为“阳线”;如果收盘价低于开盘价,实体就是实心的,我们称之为“阴线”。 影线: 表示最高价和最低价与开盘价/收盘价之间的距离,就像蜡烛的“灯芯”,越长代表价格波动越大。 K线图怎么用? K线图就像股市的“语言”,通过不同的K线组合,我们可以解读出市场的情绪和走势。 比如说: 阳线: 表示多头力量强于空头,股价上涨。 阴线: 表示空头力量强于多头,股价下跌。 十字星: 表示多空双方力量均衡,股价波动不大。 大阳线: 表示多头力量非常强劲,股价暴涨。 大阴线: 表示空头力量非常强劲,股价暴跌。 除了单根K线,我们还可以通过多根K线的组合来判断走势。 比如说: 早晨之星: 由一根阴线、一根十字星和一根阳线组成,表示市场从下跌转为上涨。 黄昏之星: 由一根阳线、一根十字星和一根阴线组成,表示市场从上涨转为下跌。 红三兵: 由三根连续的阳线组成,表示多头力量强劲,股价持续上涨。 黑三鸦: 由三根连续的阴线组成,表示空头力量强劲,股价持续下跌。 接下来,咱们再来看看技术指标。 技术指标就像股市的“雷达”,可以帮助我们更好地分析市场。 常见的技术指标包括: MACD: 用来判断市场的趋势,当MACD线从下往上穿过0轴时,表示市场处于多头趋势;当MACD线从上往下穿过0轴时,表示市场处于空头趋势。 RSI: 用来判断市场的超买或超卖,当RSI值超过70时,表示市场处于超买状态,股价可能会回调;当RSI值低于30时,表示市场处于超卖状态,股价可能会反弹。 布林带: 用来判断市场的波动幅度,当股价突破布林带上轨时,表示市场处于超买状态,股价可能会回调;当股价跌破布林带下轨时,表示市场处于超卖状态,股价可能会反弹。 技术指标怎么用? 技术指标就像股市的“指南针”,可以帮助我们更好地判断走势。 但是,技术指标并不是万能的,需要结合其他因素进行分析。 记住,K线图和技术指标只是分析工具,不能保证100%的准确率。 我们需要结合自己的交易经验和市场情况,灵活运用这些工具,才能更好地把握市场机会。 当然,这些只是冰山一角,金融术语的世界远比我们想象的要丰富多彩。 但是别担心,只要我们掌握了这些基础,就可以逐渐建立起自己的交易体系,成为真正的量化交易大师! 记住,金融术语不是洪水猛兽,而是我们通往财富之路的桥梁。 只要我们用心学习,就一定能够掌握它们,并利用它们来获取财富!

github怎么删除项目

github怎么删除项目 ‌在‌GitHub上删除项目可以通过网页端或‌Git命令行两种方式进行。‌ 通过网页端删除项目 打开GitHub官网并登录账号。进入需要删除的项目页面。点击页面右上角的“Settings”按钮。滚动页面到底部,找到“Danger Zone”区域。点击“Delete this repository”按钮。输入你的GitHub用户名和项目名称,然后点击“I understand the consequences, delete this repository”按钮。项目将被删除。‌12 通过Git命令行删除项目 安装Git,并使用Git命令行工具进入需要删除的项目所在的本地目录。在命令行中输入以下命令:git remote rm origin,这个命令将删除该项目与远程仓库之间的连接。输入以下命令:rm -rf .git,这个命令将删除本地项目的Git仓库。回到GitHub网站,进入需要删除的项目页面,点击页面右上角的“Settings”按钮。滚动页面到底部,找到“Danger Zone”区域。点击“Delete this repository”按钮。输入你的GitHub用户名和项目名称,然后点击“I understand the consequences, delete this repository”按钮。项目将被删除。 注意事项 在执行删除操作前,请确保你不再需要该项目,因为删除操作是不可逆的。删除项目后,与该项目相关的所有数据将无法恢复。

【爬虫】Python实现爬取淘宝商品信息(超详细)

目录 项目介绍 代码部分 引用第三方库 全局定义 主函数 爬虫主函数代码 翻页函数代码 ​编辑 获取商品列表信息代码 完整代码 项目介绍 项目基于Python的第三方库Selenium模拟浏览器运行、PyQuery解析和操作HTML文档,获取淘宝平台中某类商品的详细信息(商品标题、价格、销量、商铺名称、地区、商品详情页链接、商铺链接等),并基于第三方库openpyxl建立、存储于Excel表格中。 效果预览: 代码部分 引用第三方库 # 声明第三方库/头文件 from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from pyquery import PyQuery as pq import time import openpyxl as op #导入Excel读写库 【第三方库】主要运用到PyQuery、selenium、openpyxl等Python的第三方库;如若缺失,使用pip指令安装即可。 pip install pyquery pip install selenium pip install openpyxl 全局定义 # 全局变量 count = 1 # 写入Excel商品计数 # 启动ChromeDriver服务 options = webdriver.

【C++】AVL树

前言: 前面讲到了平衡搜索树(BST),但是不能会出现极端情况,出现线性的结构,今天介绍自平衡二叉搜索树(AVL) AVL树 AVL的介绍 AVL树是一种自平衡二叉搜索树:它以苏联科学家Georgy Adelson-Velsky和Evgenii Landis的名字命名。 在AVL树中,任何节点的两个子树的高度最多相差1,这保证了树的平衡性,从而使得树的操作(如插入、删除和查找)具有良好的最坏情况性能,时间复杂度为O(log n) AVL树的旋转操作是其自平衡机制的核心,包括左旋、右旋、左-右旋和右-左旋。这些旋转调整节点的位置,减少子树的高度差,恢复树的平衡。 AVL树特性 严格的平衡性:AVL树的每个节点的左右子树的高度差的绝对值不超过1,这保证了树的高度最小,从而使得操作(如插入、删除和查找)的时间复杂度保持在对数级别。旋转调整:当插入或删除操作导致节点的平衡因子超出允许范围时,AVL树会通过单旋转或双旋转来重新平衡树。高效的搜索、插入和删除操作:由于AVL树的高度平衡,这些操作的时间复杂度通常为O(log n),其中n是树中节点的数量。节点定义:AVL树的节点通常包含数据、指向左右子节点的指针、指向父节点的指针以及记录子树高度差的平衡因子。高度记录:在AVL树中,每个节点还会记录其子树的高度,这有助于快速计算平衡因子并在需要时进行调整。适用场景:AVL树适用于需要频繁进行数据插入、删除和查找操作的场景,尤其是在数据集合较大时,可以保持较高的效率。 AVL树的核心 AVL树是一种自平衡的二叉查找树,它通过旋转调整机制来维持树的平衡。当树在插入或删除操作后出现不平衡时,AVL树会执行以下四种旋转操作之一来恢复平衡: 单旋转: 左旋(LL型):当插入或删除操作导致某个节点的左子树的高度比右子树高2时,需要执行左旋操作。左旋操作涉及到将这个节点的右子树提升为新的根节点,并将原根节点作为左子节点挂接到新根节点上。右旋(RR型):与左旋相反,当某个节点的右子树的高度比左子树高2时,执行右旋操作,即将左子树提升为新的根节点。 双旋转: 左-右旋(LR型):当插入或删除操作导致某个节点的左子树的右子树的高度比左子树的右子树高时,先对左子树执行左旋,然后对原节点执行右旋。右-左旋(RL型):与左-右旋相反,当某个节点的右子树的左子树的高度比右子树的左子树高时,先对右子树执行右旋,然后对原节点执行左旋。 AVL插入实现 AVL树是基于BST结构,大主体就是BST问题的解决就是AVL的单旋和双旋以及需要旋转的条件。 AVL的存贮结构 在这里面利用KV结构进行存储数据左右节点,还有一个父亲节点为了保持平衡定义_bf(平衡因子:balance factor) template<class K, class V> struct AVLNode { pair<K, V> _kv; AVLNode<K, V>* _left; AVLNode<K, V>* _right; AVLNode<K, V>* _parent; int _bf; AVLNode(const pair<K, V>& kv) :_kv(kv) , _left(nullptr) , _right(nullptr) , _parent(nullptr) , _bf(0) {} }; template<class K, class V> class AVL { typedef AVLNode<K, V> Node; private: Node* _root; }; AVL的插入 如果根节点是nullptr时,进行特殊的判断,直接进行节点的创建查找插入的位置,大于在右边,小于在左边进行平衡因子的更新,左边插入,父亲节点-1,右边插入,父亲节点+1(可以反向操作)在节点更新的时候就要进行判断,只有发大于左右节点不平衡的时候需要旋转 左旋转 、右旋转、左右旋转、右左旋转(下面会详细介绍) bool insert(const pair<K, V>& kv) { //step 1 if (_root == nullptr) { _root = new Node(kv); return true; } Node* parent = nullptr; Node* cur = _root; //step 2 while (cur) { if (kv.

RESTful基本要求

文章目录 RESTful -Representational State Transfer1 什么是RESTful2 RESTful的特征3 如何设计符合RESTful 特征的API RESTful -Representational State Transfer 1 什么是RESTful 资源 (Resources) 网络上的一个实体,或者说是网络上的一个具体信息,并且每个资源都有一个独一无二得URI与之对应;获取资源-直接访问URI即可 表现层(Representation) 如何去表现资源 - 即资源得表现形式;如HTML , xml , JPG , json等 状态转化(State Transfer) 访问一个URI即发生了一次 客户端和服务端的交互;此次交互将会涉及到数据和状态得变化 客户端需要通过某些方式触发具体的变化 - HTTP method 如 GET, POST,PUT,PATCH,DELETE 等 2 RESTful的特征 每一个URI代表一种资源 客户端和服务器端之前传递着资源的某种表现 客户端通过HTTP的几个动作 对 资源进行操作 - 发生‘状态转化’ 3 如何设计符合RESTful 特征的API 协议 - http/https 域名 域名中体现出api字样,如 https://api.example.com or https://example.org/api/ 版本: https://api.example.com/v1/ 路径 - 路径中避免使用动词,资源用名词表示,案例如下 https://api.example.com/v1/users https://api.example.com/v1/animals HTTP动词语义 请求动词说明GET(SELECT)从服务器取出资源(一项或多项)POST(CREATE)在服务器新建一个资源PUT(UPDATE)在服务器更新资源DELETE(DELETE)从服务器删除资源具体案例如下:

RabbitMQ本地Ubuntu系统环境部署与无公网IP远程连接服务端实战演示

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 安装内网穿透工具3.1 安装cpolar内网穿透3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击跳转到网站】 前言 本文主要介绍如何在Ubuntu系统环境下,安装RabbitMQ与cpolar内网穿透工具实现无公网IP随时随地远程访问本地部署的MQ服务端。 RabbitMQ是一个在 AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。 由erlang开发的AMQP(Advanced Message Queue 高级消息队列协议 )的开源实现,由于erlang 语言的高并发特性,性能较好,本质是个队列,FIFO 先入先出,里面存放的内容是message. 1.安装erlang 语言 由于rabbitMQ是erlang语言实现的,所以我们需要安装erlang sudo apt-get install erlang-nox 2.安装rabbitMQ 安装最新版rabbitMQ sudo apt-get install rabbitmq-server 查看rabbitMQ状态,active(running)表示在线 sudo systemctl status rabbitmq-server 设置访问MQ用户名账号和密码,admin表示账号(可自定义),123456表示密码(可自定义) sudo rabbitmqctl add_user admin 123456 设置上面admin用户的角色,administrator表示是最高管理员 sudo rabbitmqctl set_user_tags admin administrator 设置admin角色权限 sudo rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" 以上信息设置好后,我们往下走。 3. 安装内网穿透工具 接着我们使用cpolar穿透本地MQ服务,使得远程可以进行访问连接,cpolar支持http/https/tcp协议,不限制流量,操作简单,无需公网IP,也无需路由器。 cpolar官网:https://www.cpolar.com/

安装vue-cli2.0并创建项目

文章目录 1 安装node2 安装vue-cli3 创建基于webpack模板的项目4 项目结构 1 安装node 之前写的博客中介绍了如何安装:NodeJS的安装【windows】。安装完毕后,可以在命令行中输入node -v和npm -v,若出现版本号,则安装成功。 2 安装vue-cli 输入npm install -g @vue/cli 。可能出现的错误:4048错误。 解决方法:以管理员身份运行命令提示符,然后安装。输入vue -v,若出现版本号,则安装成功。 3 创建基于webpack模板的项目 转到项目想要创建的文件夹,这里设置的是桌面:cd /d %userprofile%\Desktop。输入vue init webpack todolist。 这里可能会出现错误:Command vue init requires a global addon to be installed. Please run npm i -g @vue/cli-init and try again.,按照提示输入npm i -g @vue/cli-init 即可。(若出现上述错误)再次输入 npm i -g @vue/cli-init,然后根据提示依次输入即可。 项目创建成功,启动项目:cd todolist,npm run dev。 项目运行成功。在浏览器输入localhost:8080可显示该页面。 4 项目结构 build:项目的webpack配置文件。config:针对开发环境和线上环境的一些配置文件。node_modules:项目的依赖。src:源代码,src-main.js:整个项目的入口文件。static:静态资源。

IP网络协议

目录 一、IP协议简介 二、IP协议报头 三、IP网段划分(子网划分) 四、特殊的IP地址 五、IP地址的数量限制 六、私有IP地址和公网IP地址 七、路由 八、分片与组装 一、IP协议简介 IP指网际互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。 IP协议位于网络层 网络层解决的问题 传输层: 负责两台主机之间的数据传输。代表协议:TCP协议,确保数据可靠的从源主机发送到目标主机传输层的数据继续向下交付给网络层网络层: 负责地址管理和路由选择。代表协议:IP协议,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)TCP作为传输层控制协议,其保证的是数据传输的可靠性,但TCP提供的仅仅是数据传输的策略,而真正负责数据在网络中传输的则传输层之下的网络层和链路层 网络层要解决的问题就是:将数据从一台主机跨网络送到另一台主机,也就是数据的路由(路径选择) IP地址的核心作用就是用于定位主机IP具有将一个数据数据从A主机跨网络送到B主机的能力(主机到主机)有能力不一定能做到。TCP提供发送数据的策略,IP负责提供行动(发送数据)即网络层不能保证每次都能将数据成功送到对方主机,但在TCP提供的可靠性策略的保证下,最终网络层就一定能够将数据可靠的发送到对方主机 基本概念 主机:每台主机都配有IP地址,但是不进行路由控制的设备(现在实际上几乎不存在不进行路由控制的设备)路由器:即配有IP地址,又能进行路由控制(工作在网络层,现在的路由器有些已经具备应用层的功能)节点:主机和路由器的统称 路径选择 数据进行的网络传输一般都是跨网络的,而路由器就是连接多个网络的硬件设备,因此数据在进行跨网络传输时一定需要经过一个或多个路由器 比如,B主机发送数据给C主机,确定了C主机的地址后(目的IP),数据就可以进行路由了(目的IP决定了路径怎么走,为什么选择这条路径,而不选择另外一条路径)但数据在路由时无法自行进行路径选择,因为这个数据本身是“不认识路”的而路由器是认得路是怎么走的,它们将自己的“认路经验”都记录到路由表当中因此路由器可以通过查路由表找到去特定节点的最短路径因此数据在路由时,会不断通过路由器来进行路径选择,以此来一步步靠近目标网络或目标主机 二、IP协议报头 IP协议报头格式如下: 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是44位首部长度(header length):表示IP报头的长度,以4字节为单位(IP头部最大长度是60字节,基础报头长度为20字节) 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。比如对于ssh/telnet这样的应用程序,最小延时比较重要,而对于ftp这样的程序,最大吞吐量比较重要。 16位总长度(total length):IP报文(IP报头+有效载荷)的总长度,用于将各个IP报文进行分离16位标识(id):唯一的标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片对应的id都是相同的3位标志字段:第一位保留,保留的意思是现在不用, 但是还没想好说不定以后要用到。第二位表示禁止分片,表示如果报文长度超过MTU,IP协议就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1(最后一个分片报文该字段为0,类似于结束标志,类似于C语言的字符串以'\0'结尾)13位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是64,每经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环8位协议:表示上层协议的类型16位首部检验和:使用CRC进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分32位源IP地址(Source IP Address):指示发送该数据报的源主机的IP地址。32位目标IP地址(Destination IP Address):指示接收该数据报的目标主机的IP地址选项字段:不定长,最多40字节。 如何进行报头与有效载荷的分离??即如何解包 IP协议的报头与TCP协议的报头类似,当IP从底层获取到一个报文后,虽然IP不知道报头的具体长度,但IP报文的前20个字节是IP的基本报头,并且这20字节当中涵盖4位首部长度 IP解包的过程如下: IP从下层获取到一个报文后,首先读取报文的前20个字节,并从中提取出4位的首部长度,此时便获得了IP报头的大小注:IP基本报头的长度是20字节,无脑读取20字节IP报头当中的4位首部长度只有4个比特位,即4位首部长度的取值范围是0000 ~ 1111,即最大长度是15,又因为4位首部长度的基本单位是4字节,所以15*4=60字节即IP报头的最大长度是60字节,基本长度是20字节,即报头的取值范围是[20 ~ 60]报头还有一个字段16位总长度:IP报文(IP报头+有效载荷)的总长度拿到报头长度之后,就可以直接与有效载荷进行分离了 注:不同的协议层对数据包有不同的称谓,在传输层叫做数据段(segment),在网络层叫做数据报 (datagram),在链路层叫做数据帧(frame) IP如何决定将有效载荷交付给上层的哪一个协议?即如何分用 在IP报头当中有一个字段叫做8位协议,该字段(协议的编号)表示的就是上层协议的类型,IP就是根据该字段判定应该将分离出来的有效载荷交付给上层的哪一个协议的注:每个协议都有特定的编号 如何解包与分用已经解决,封装就是逆过来 8位生存时间 报文在网络传输过程中,可能因为某些原因导致报文无法到达目标主机,比如报文在路由时出现了环路路由的情况,此时这个报文就成了一个废弃的无用报文为了避免网络当中出现大量的无用报文(无用报文每转发一次就浪费一点路由器资源),于是在IP的报头当中就出现了一个字段,叫做8位生存时8位生存时间代表的是报文到达目的地的最大报文跳数,每当报文经过一次路由,这里的生存时间就会减一,当生存时间减为0时该报文就会被自动路由器丢弃,此时这个报文就会在网络中消散 32位源IP地址和32位目的IP地址 32位源IP地址和32位目的IP地址在路由转发过程中起着重要作用(路径选择)路由器根据这两个地址来决定如何转发数据包。它会查找路由表,找到最佳的路径将数据包从源地址发送到目的地址。这个过程称为路由转发。通过源IP地址和目的IP地址,路由器可以确定数据包的起始点和终点,并选择最佳的路径进行转发,以确保数据包能够快速、准确地到达目的地 三、IP网段划分(子网划分) IP地址的构成 IP地址由网络号和主机号两部分构成: 网络号:保证相互连接的两个网段具有不同的标识 主机号:同一网段内,主机之间具有相同的网络号,但是不同的主机必须有不同的主机号 P协议有两个版本,IPv4和IPv6。后序凡是提到IP协议,没有特殊说明的,默认都是指IPv4(IPv4与IPv6不兼容) 对于IPv4来说,IP地址是一个4字节,32位的正整数(32个比特位)在IP地址的后面加一个/,并在/后面加上一个数字,这就表示从头数到第几位为止属于网络标识(网络号) 例如,下图中路由器连接了两个网段(子网):

私人诊所|基于SprinBoot+vue的私人诊所管理系统(源码+数据库+文档)

私人诊所管理系统 基于SprinBoot+vue的私人诊所管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员功能实现 患者功能实现 医生功能实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Java领域优质创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️ 主要项目:小程序、SpringBoot、SSM、Vue、Html、Jsp、Nodejs等设计与开发。 🍅文末获取源码联系🍅 基于SprinBoot+vue的私人诊所管理系统 一、前言 私人诊所信息管理需要一个现代化的管理系统,进行私人诊所的管理。私人诊所管理系统的开发就是为了解决私人诊所信息管理的问题,私人诊所管理系统开发是基于Java语言编写实现,私人诊所管理系统用Mysql数据库搭建存储私人诊所数据。实现后的私人诊所管理系统基于用户需求分析搭建的,并且会有个人中心,患者管理,医生管理,科室管理,出诊医生管理,预约挂号管理,预约取消管理,病历信息管理,药品信息管理,处方开具管理,留言板管理,私人诊所系统管理等基本功能。不仅能满足人们对于私人诊所的需求,同时具有广阔的发展前景。 关键词:私人诊所; Java;B/S架构 二、系统设计 系统功能结构图 三、系统功能设计 系统功能实现 当人们打开系统的网址后,首先看到的就是首页界面。在这里,人们能够看到私人诊所管理系统的导航条。系统首页界面如图5-1所示: 图5-1 系统首页界面 后台模块实现 后台登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,进入操作系统进行操作;如图5-6所示。 图5-6后台登录界面 管理员功能实现 管理员进入主页面,主要功能包括对个人中心,患者管理,医生管理,科室管理,出诊医生管理,预约挂号管理,预约取消管理,病历信息管理,药品信息管理,处方开具管理,留言板管理,系统管理等进行操作。管理员主页面如图5-7所示: 图5-7 管理员主界面 患者功能实现 患者进入主页面,主要功能包括对个人中心,预约挂号管理,预约取消管理,病历信息管理,处方开具管理等进行操作。患者主页面如图5-13所示: 图5-13 患者主界面 医生功能实现 医生进入主页面,主要功能包括对个人中心,出诊医生管理,预约挂号管理,预约取消管理,病历信息管理,药品信息管理,处方开具管理等进行操作。医生主页面如图5-14所示: 图5-14 医生主界面 四、数据库设计 医生实体属性所示: 图4-6医生实体属性图 数据库表的设计,如下表: 处方开具表 字段名称 类型 长度 字段说明 主键 默认值 id bigint 主键 主键 addtime timestamp 创建时间 CURRENT_TIMESTAMP chufangbianhao varchar 200 处方编号 huanzhezhanghao