工具:
Jadclipse插件,下载地址 JadClipse - Eclipse plugin download | SourceForge.net
Jad反编译工具,下载地址 http://varaneckas.com/jad/
百度云资源:链接: https://pan.baidu.com/s/1i4YaVotByU1sQ9CFh9m6xg 提取码: 9j8u
使用方法:
1、将Jadclipse插件也就是net.sf.jadclipse_3.3.0.jar放入Eclipse安装目录的plugins目录下。
2、将下载的Jad反编译工具(jad.exe)放入JDK的bin目录下。
3、打开eclipse,点击:Window->Preferences->Java->JadClipse,假如没有找到JadClipse,检查插件安装的版本是否与你安装的eclipse版本
Path to decompiler 这里设置反编译工具jad的绝对路径,比如:D:\jdk1.8.0_131\bin\jad.exe.
若你在环境变量中设置了 PATH 指向Java安装路径的bin下就不用改了,默认是jad。
Directory for temporary files 这里设置临时文件夹路径。
4、点击:Windows-> Perference->General->Editors->File Associations,修改“*.class”默认关联的编辑器为“JadClipse Class File Viewer”,选中“JadClipse Class File Viewer”后点击 Default,如果没有找到,可以点击 Add 添加,一般插件会自动关联。
设置完之后就可以使用了,按住Ctrl点击想要查看的内容
我们经常会看到别人发的各种好看搞笑的动态gif表情包,非常的有趣。那么,这种gif表情包是怎么来的呢?事实上,很多gif表情包都是自己制作的,接下来就给大家讲一讲gif表情包如何制作的吧!很简单只需要使用gif图片制作(https://www.gif5.net/)工具,上传图片一键就可以在线生成gif图,方便快捷,具体的操作步骤如下:
打开GIF5工具网,点击“GIF合成”按钮。
上传图片后,设置生成gif图片的宽、高以及播放速度的参数等,点击开始生成gif。
动态图片在线制作后,在图片预览弹窗中点击下载图片即可。
根据以上步骤操作就可以快速制作gif动态图了,无需下载任何软件,操作简单新手也可以快速上手。另外,GIF5工具网还支持视频转gif制作的功能以及动图在线压缩、动态图片拼接、gif裁剪的功能欢迎大家前来体验。
1.什么是网络同步 所谓同步,就是要多个客户端表现效果是一致的,比如我们玩王者荣耀的时候,需要十个玩家的屏幕显示的英雄位置完全相同、技能释放角度、释放时间完全相同,这个就是同步。 2.为什么要有网络同步 略
3.如何使用网络同步,使用网络同步的不同方案比较。 3.1 状态同步 将其他玩家的状态行为同步的方式(请求其他玩家的状态并显示在NPC上),一般情况下AI逻辑,技能逻辑,战斗计算都由服务器运算,将运算的结果同步给客户端,客户端只需要接受服务器传过来的状态变化,然后更新自己本地的动作状态、Buff状态,位置等就可以了,但是为了给玩家好的体验,减少同步的数据量,客户端也会做很多的本地运算,减少服务器同步的频率以及数据量。(就是客户端需要哪个对象的状态,就请求哪个对象的状态,或者服务的把这个物体的状态信息推过来,然后更新这个对象的显示)
3.1.1 状态同步优点 第一,它的安全性非常高,外挂基本上没有什么能力从中收益。
第二,状态同步对于网络的带宽和抖动包有更强的适应能力,即便出现了200、300的输入延迟再恢复正常,玩家其实也感受不到不太舒服的地方。
第三,在开发游戏过程中,它的断线重连比较快,如果我的游戏崩溃了,客户端重启之后只需要服务器把所有重要对象的状态再同步一次过来,重新再创建出来就可以了。
第四,逻辑性能优化有优势,它的客户端性能优化优势也比较明显,比如优化时可以做裁剪,玩家看不到的角色可以不用创建,不用对它进行运算,节省消耗。
3.1.2 状态同步缺点 第一,它的开发效率低(人力消耗),相对帧同步而言要差一些,很多时候你需要保证服务器与客户端的每一个角色对象的状态之间保持一致,但事实上你很难做到一致。
比如客户端和服务器端更新的频率,对优化的一些裁剪,网络的抖动等等,你要让每一个状态在客户端同步是比较难的,而你要想调试这些东西,来优化它带来的漏洞、不一致的现象,花费的周期也会比较长,想要达到优化好的水平也比较难。
第二,打击感差(表现效果),它比较难做出动作类游戏打击感和精确性。比如说你要做一个射击类角色,他的子弹每秒钟要产生几十颗,基于状态同步来做是比较难的,因为系统在很短时间内,会产生很多数据,要通过创建、销毁、位置运算来同步。
第三,它的流量会随着游戏的复杂度,而逐渐增长(流量消耗),比如角色的多少。希望在3G、4G的网络条件下也能够玩PvP,所以我们希望它对付费流量的消耗能控制在比较合理的水平,不希望打一局游戏就消耗几十兆的数据流量。(比如一个角色放了个AOE,一片角色都要进行状态更新)
3.2 帧同步 帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏。
简单来说,就是相同的状态+相同的指令+ 按帧顺序执行=相同的结果。
状态:所有客户端确保逻辑一致,接收一样的随机种子(randomseed),一样的房间信息;
指令:服务器只负责收集接收每个客户端操作指令(cmd),转发指令,服务器以恒定帧率(30帧1秒)派发指令,没有指令或指令没有变化也需要派发;
执行:真正游戏逻辑由各个客户端单独计算 ,客户端需要收到服务器派发的指令才能推进逻辑,没有收到指令时不能推进逻辑(LockStep)
3.2.1 基本实现流程及思路可以概括为: 1.所有客户端每帧上传操作指令集到服务器;
2.服务端将这些操作指令集保存到对应帧序列字典,并记录帧号,并在下一帧将其广播给所有客户端;
3.客户端收到指令集后,分别按帧序,帧号进行执行指令集中的操作命令。
3.2.2 帧同步基础知识 一.顺序执行
帧同步会必定按到从第一帧开始一帧一帧的执行,才能保证运行结果一样,跳帧会导致逻辑不一样,如果玩家网络不好,则会在当前帧等待至下一帧的接受,如果丢包超时,则会再次发出需要帧的请求。
二.追帧
什么是追帧:当前玩家播放到帧比服务器的帧落后时,服务器下发多个帧,玩家便要开始快进到服务器当前帧
为什么要追帧:如果网络波动,服务器会有最晚的接受帧时间,
做法:超过则下次发送多个帧,然后快进播放(多次DoAction),快进期间,不播放特效音效等不影响运行结果的逻辑
三.重连
做法:接受从0开始所有帧重新快速播放到当前帧,如果帧列表count大于规定速度则按照最大速度播放,否则按照剩余的count播放相应次数的帧。
四.Lock-Step
我们把游戏的前进分为一帧帧,这里的帧和游戏的渲染帧率并不是一个,只是借鉴了帧的概念,自定义的帧,我们称为turn。游戏的过程就是每一个turn不断向前推进,每一个玩家的turn推进速度一致。
每一帧只有当服务器集齐了所有玩家的操作指令,也就是输入确定了之后,才可以进行计算,进入下一个turn,否则就要等待最慢的玩家。之后再广播给所有的玩家。如此才能保证帧一致。
Lockstep的游戏是严格按照turn向前推进的,如果有人延迟比较高,其他玩家必须等待该玩家跟上之后再继续计算,不存在某个玩家领先或落后其他玩家若干个turn的情况。使用Lockstep同步机制的游戏中,每个玩家的延迟都等于延迟最高的那个人。
由于大家的turn一致,以及输入固定,所以每一步所有客户端的计算结果都一致的。
我们来看看具体的执行流程:
上图中我们可以明显看到,这种囚徒模式的帧同步,在第二帧的时候,因为玩家1有延迟,而导致第二帧的同步时间发生延迟,从而导致所有玩家都在等待,出现卡顿现象。
五.Bucket Synchronization(乐观锁)
囚徒模式的帧同步,有一个致命的缺陷就是,若联网的玩家有一个网速慢了,势必会影响其他玩家的体验,因为服务器要等待所有输入达到之后再同步到所有的c端。另外如果中途有人掉线了,游戏就会无法继续或者掉线玩家无法重连,因为在严格的帧同步的情况下,中途加入游戏是从技术上来讲是非常困难的。因为你重新进来之后,你的初始状态和大家不一致,而且你的状态信息都是丢失状态的,比如,你的等级,随机种子,角色的属性信息等。 比如玩过早期的冰封王座都知道,一旦掉线基本这局就废了,需要重开,至于为何没有卡顿的现象,因为那时都是解决方案都是采用局域网的方式,所以基本是没有延迟问题的。
后期为了解决这个问题,如今包括王者荣耀,服务器会保存玩家当场游戏的游戏指令以及状态信息,在玩家断线重连的时候,能够恢复到断线前的状态。不过这个还是无法解决帧同步的问题,因为严格的帧同步,是要等到所有玩家都输入之后,再去通知广播client更新,如果A服务器一直没有输入同步过来,大家是要等着的,那么如何解决这个问题?
采用“定时不等待”的乐观方式在每次Interval时钟发生时固定将操作广播给所有用户,不依赖具体每个玩家是否有操作更新。如此帧率的时钟在由服务器控制,当客户端有操作的时候及时的发送服务器,然后服务端每秒钟20-50次向所有客户端发送更新消息。如下图:
上图中,我们看到服务器不会再等到搜集完所有用户输入再进行下一帧,而是按照固定频率来同步玩家的输入信息到每一个c端,如果有玩家网络延迟,服务器的帧步进是不会等待的,比如上图中,在第二帧的时候,玩家A的网速慢,那么他这个时候,会被网速快的玩家给秒了(其他游戏也差不多)。但是网速慢的玩家不会卡到快的玩家,只会感觉自己操作延迟而已。
Bucket Synchronization 是 Lock-Step 的改良算法. 算法流程可以参考下图:
Bucket Synchronization 算法应用于网状网络, 网络中有一个 master 节点(也是 client).
#include <ESP8266WiFi.h> #include <SimpleDHT.h> //wifi配置 const char *ssid = "9--202";//这里写入网络的ssid const char *password = "*****";//wifi密码 const char *host = "183.230.40.33";//修改为Server服务端的IP,即你电脑的IP,确保在同一网络之下。 WiFiClient client; const int tcpPort = 80;//修改为你建立的Server服务端的端口号,此端口号是创建服务器时指定的。 //DHT11配置 int pinDHT11 = 5; //IO5 SimpleDHT11 dht11(pinDHT11); byte temperature = 0; byte humidity = 0; void setup() { Serial.begin(115200); pinMode(LED_BUILTIN,OUTPUT); delay(10); Serial.println(); Serial.print("Connecting to ");//会通过usb转tll模块发送到电脑,通过ide集成的串口监视器可以获取数据。 Serial.println(ssid); WiFi.begin(ssid, password);//启动 //在这里检测是否成功连接到目标网络,未连接则阻塞。 while (WiFi.status() != WL_CONNECTED) { delay(500); } //几句提示 Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "
element文档上面对于这些功能是有介绍的,但是文档写的不是很清楚,而且是多个例子,没有进行整合,这是我使用后的一个例子。
我这里的需求是可以选择每一级,,并且只显示选择的哪一级数据。
show-all-levels设置为false的时候显示的就是选择的最后一级
props是级联选择器的配置项
checkStrictly为true的情况下可以遵守父子节点不互相关联,可以选择任意一级
expandTrigger是控制次级菜单的展开方式
children是指定选项的子选项为选项对象的某个属性值
这样配置好之后,虽然展示的值是单个的,但是绑定的值还是一个拥有全部路径的数组,假如想得到一个和展示的数据一样的字符串,获取绑定值这个数组的下标为数组长度-1的数据就行。
下载实践 DownloadListener /** * Description * <p> * 定义一个回调接口,用于对下载过程中的各种状态进行监听和回调 * @author qricis on 2020/8/28 15:14 * @version 1.0.0 */ public interface DownloadListener { void onProgress(int progress); void onSuccess(); void onFailed(); void onPaused(); void onCanceled(); } DownloadTask /** * Description * <p> * 下载功能类服务类 * 第一个泛型表示要传入一个字符串给后台任务 * 第二个泛型表示使用整型数据来作为进度的显示单位 * 第三个泛型表示使用整型数据来反馈执行结果 * @author qricis on 2020/8/28 15:28 * @version 1.0.0 */ public class DownloadTask extends AsyncTask<String,Integer,Integer> { /** * 定义四个整型表示下载状态成功、失败、暂停、取消 * */ public static final int TYPE_SUCCESS = 0; public static final int TYPE_FAILED = 1; public static final int TYPE_PAUSED = 2; public static final int TYPE_CANCELED = 3; /** * 在构造中通过传入的该参数进行回调 * */ private DownloadListener mDownloadListener; private boolean isCanceled = false; private boolean isPaused = false; private int lastProgress; public DownloadTask(DownloadListener listener) { mDownloadListener = listener; } /** * 用于在后台执行具体的下载逻辑 * 在子线程运作 * 参数为下载地址 * 返回当前执行进度可以调用publishProgress * */ @Override protected Integer doInBackground(String.
一、前端拖拽实现-数据库的静态标签信息未更改 增加节点拖拽功能即实现通过拖拽节点从而改变父子关系和层级结构的功能。只需要给el-tree添加属性draggable就可以拖拽节点,但会出现超出设置的三层菜单的层级限制,需要额外添加属性**:allow-drap=“allowDrop”,并在method中定义方法allowDrop(draggingNode,dropNode,type),其中draggingNode表示当前节点,dropNode是目标节点,type有三种情况:‘prev’,'inner’和’next’分别表示放置在目标节点前,目标节点中和目标节点后,allowDrop返回的标记决定是否能够放置。另外额外提取了一个countNodeLevel(node)**方法用来递归调用计算当前节点的子节点最大层数。
具体方法编写如下:
//判断节点是否可以被拖拽 其中draggingNode表示当前节点,dropNode是目标节点,type有三种情况: //'prev','inner'和'next'分别表示放置在目标节点前,目标节点中和目标节点后 allowDrop(draggingNode, dropNode, type) { //判断依据 当前被拖动的节点的深度+目标节点层级不能大于3 //当前节点的深度(待拖动节点加上子节点有几层) = 当前节点的子节点的最大层级maxLevel - 当前节点所处层级catlevel + 1 //console.log("allowDrop", draggingNode, dropNode, type); //1.计算当前节点的深度 即 当前节点的子节点的最大层级maxLevel - 当前节点所处层级catlevel + 1 //1.1 求出当前节点的子节点最大层级 值更新在this.maxlevel中 // draggingNode.data中是Node节点中从后台数据库获取到的静态信息,这里不使用 因为没有更新层级改变此处数据有可能失真 this.countNodeLevel(draggingNode); //console.log("当前节点的子节点最大层级",this.maxLevel) //1.2 计算深度 let deep = this.maxLevel - draggingNode.level + 1; //console.log("当前拖拽节点深度",deep) //2 判断是否可以拖动 拖动到目标节点内或者前后两种情况 if (type == "inner") { //拖动到目标节点内 只需要当前节点深度+目标节点层级<=3即可 let isDrag = deep + dropNode.level <= 3; console.log(`拖拽类型${type}: 当前节点的子节点最大层级:${this.maxLevel}--当前节点层级:${draggingNode.level} --当前节点深度:${deep}--目标节点层级:${dropNode.
问题描述 su切换至非root用户安装金仓数据库KingbaseES时,提示不支持用户界面模式安装程序,安装失败。 解决方法 直接用所需安装KingbaseES的用户ssh登录到虚拟机后执行sh setup.sh。
注意:不要用root登录后su去切换,su切换会出现上述安装不成功的问题。
场景 目前做了一个接口:邀请用户成为某课程的管理员,于是我感觉有能在用户被邀请之后能有个立马通知他本人的机(类似微博、朋友圈被点赞后就有立马能收到通知一样),于是就闲来没事搞了一套。
涉及技术栈 SpringbootWebsocket 协议JWT(非必要)RabbitMQ 消息中间件 Websocket 协议 :star:推荐阅读: Websocket 协议简介
WebSocket协议是基于TCP的一种新的 网络协议 。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。
为什么使用Websocket?
因为普通的http协议一个最大的问题就是: 通信只能由客户端发起,服务器响应(半双工)****, 而我们希望可以全双工通信。
因此一句话总结就是:建立websocket(以下简称为ws)连接是为了让服务器主动向前端发消息,而无需等待前端的发起请求调用接口。
业务逻辑 我们现在有:
用户A用户BSpringboot 服务器场景: 用户A调用接口邀请用户B成为课程成员涉及数据库 MySQL 的数据表: course_member_invitation ,记录课程邀请记录,其形式如下(忽略时间等列): idcourse_idaccount_idadmin_idis_acceptedbind_message_id邀请id课程id受邀用户id邀请人id(因其本身为课程管理员)受邀用户是否接受了邀请绑定的消息id course_message ,记录消息记录,其形式如下(忽略时间等列): idtypeaccount_idsource_idis_readis_ignored消息id消息类型收信人用户id发信人用户id是否已读收信人是否忽略 (图中没有体现) course_message_type ,记录消息类型,其形式如下 idnamedescription消息类型id消息类型名称描述 涉及 RabbitMQ (因不是重点,所以此处暂不讨论,最后一章叙述) 业务步骤主要涉及两个方法 addCourseMemberInvitation 与 sendMessage 和一个组件 CourseMemberInvitationListener ,分别做:
addCourseMemberInvitation :
用户A 调用接口,邀请 用户B 成为某门课程的管理员Springboot 服务器收到请求,将这一请求生成邀请记录、消息记录,写入下表: course_member_invitation course_message 写入DB后,调用 sendMessage 处理发送消息的业务。将执行的结果返回给 用户A sendMessage :
将消息记录放入 RabbitMQ 中对应的消息队列。 CourseMemberInvitationListener :
持续监听其绑定的消息队列一旦消息队列中有新消息,就尝试通过ws连接发送消息。 用户B 在Springboot中配置Websocket
python 接口自动化unittest+DingtalkChatbot机器人消息封装 安装DingtalkChatbot: pip install DingtalkChatbot
钉钉配置机器人:
智能群助手
给机器人取一个名字~
webhook需要保存好,需要传入钉钉DingtalkChatbot()方法内
自定义关键词,这里需要注意一下,自定义关键词内的文案在msg内一定要有,否则无法触发机器人报警
钉钉模块内有很多种类型的消息场景,我的目的是接口自动化巡检,所以只需要消息场景就可以,其他的场景感兴趣的可以查一下场景字段参数~
把自己想要的日志内容写在msg内,并且单独封装一个方法获取需要的消息参数内容
# WebHook地址 from dingtalkchatbot.chatbot import DingtalkChatbot class DingDing: def __init__(self): self.yhn = "9z7_66n6cmbqy" self.webhook = "https://oapi.dingtalk.com/robot/send?access_token=6e3cc2451e89506e630b5be62de31ef28501a32bd2ef1181aaaa968527624b9b" def run_error(self, *args): xiaoding = DingtalkChatbot(self.webhook) xiaoding.send_text( msg=f'监测预警,测试用例数量:{args[0]},用例异常数量: {args[1]}' f'\n测试用例名称:{args[2]}\n日志内容:{args[3]}' f'\n链接地址:{args[4]} 请注意及时处理!', at_dingtalk_ids=[self.yhn], is_at_all=False ) def run_normal(self, *args): xiaoding = DingtalkChatbot(self.webhook) xiaoding.send_text( msg=f'监测预警,接口自动化case执行完毕\n测试用例数量:{args[0]},用例异常数量: {args[1]}' f'\n测试报告地址:{args[2]} 请关注~', at_dingtalk_ids=[self.yhn], is_at_all=False ) def run_trigger(self, list_dict, if_print=True): """ 触发钉钉机器人 :param list_dict: case_list列表 :param if_print: 是否需要过滤测试通过的case True为是不会触发机器人 False不会过滤 :return: "
modbus协议使用【android串口通信】 本文的目的是android端与上位机之间使用modbus协议进行串口通信。通过串口与其他设备进行通信,传递数据。可以理解为电脑和键盘、鼠标通信。
关于modbus协议我已经上传
modbus协议下载
串口连接 android端连接串口方法,其实就是设置串口的参数,打开底层的串口文件,android开发的朋友也可以让驱动人员帮忙写,当然谷歌也有官方框架,这里我使用的是第三方框架,参考的是这位大神的文章
参考大神链接
调试精灵
首先在gradle配置:
implementation 'tp.xmaihh:serialport:2.1'
全部源码 import java.io.ByteArrayOutputStream; public class ByteArrayWriter extends ByteArrayOutputStream { public ByteArrayWriter() { super(); } public void writeInt8(byte b) { this.write(b); } public void writeInt8(int b) { this.write((byte)b); } public void writeInt16(int n) { byte[] bytes = ByteUtil.fromInt16(n); this.write(bytes, 0, bytes.length); } public void writeInt16Reversal(int n){ byte[] bytes=ByteUtil.fromInt16Reversal(n); this.write(bytes,0,bytes.length); } public void writeInt32(int n) { byte[] bytes = ByteUtil.fromInt32(n); this.
一、集合 集合的定义: 每一个SQL查询的结果就是一个集合。
关键词:
并集:union、union all 取两个集合(查询结果)中所有的元素
两者的区别:union all 不会将相同的数据合并,而union会将查询的结果排序删除重复的元素,因此union的效率不如union all 但是在实际的运用中要选择合适的关键词进行查询。
交集:intersect 取两个集合(查询结果)中相同的元素
差集:minus 取第一个集合减去两个集合中相同部分的元素
举例:
并集 SELECT * FROM EMP WHERE SAL>1000 UNION ALL SELECT * FROM EMP WHERE SAL>2000; SELECT * FROM EMP WHERE SAL>1000 UNION SELECT * FROM EMP WHERE SAL>2000; 交集 SELECT * FROM EMP WHERE SAL>2000 INTERSECT SELECT * FROM EMP WHERE SAL<2500; SELECT * FROM EMP WHERE SAL>2000 AND SAL<2500; 差集 SELECT * FROM EMP WHERE SAL>1000 MINUS SELECT * FROM EMP WHERE SAL>2000; 使用这些关键词时,第一条查询结尾处不加“;”第二条查询结尾处一定要加“;”
简易的墩墩代码,大家可以随意修改,望增添更多色彩。
将你的“墩”整活起来。 import turtle turtle.title("BingDwenDwen") # 速度 turtle.speed(100) # 左手 turtle.penup() turtle.goto(177, 112) turtle.pencolor("lightgray") turtle.pensize(3) turtle.fillcolor("white") turtle.begin_fill() turtle.pendown() turtle.setheading(80) turtle.circle(-45, 200) turtle.circle(-300, 23) turtle.end_fill() # 左手内 turtle.penup() turtle.goto(182, 95) turtle.pencolor("black") turtle.pensize(1) turtle.fillcolor("black") turtle.begin_fill() turtle.setheading(95) turtle.pendown() turtle.circle(-37, 160) turtle.circle(-20, 50) turtle.circle(-200, 30) turtle.end_fill() # 轮廓 # 头顶 turtle.penup() turtle.goto(-73, 230) turtle.pencolor("lightgray") turtle.pensize(3) turtle.fillcolor("white") turtle.begin_fill() turtle.pendown() turtle.setheading(20) turtle.circle(-250, 35) # 左耳 turtle.setheading(50) turtle.circle(-42, 180) # 左侧 turtle.setheading(-50) turtle.circle(-190, 30) turtle.circle(-320, 45) # 左腿 turtle.
题意: 有一个长度为n的序列,给出m条限制,给出区间[l,r]和parity(中文意思是奇偶性)。
①parity == "odd" 表示[l,r]区间内'1'的个数是奇数。
②parity == "even" 表示[l,r]区间内'1'的个数是偶数。
请你输出最小的不满足条件的编号减一,如果全部满足,输出限制条件总数m。
思路: 对于本题我们可以有两种做法,第一种是“边带权”并查集,第二种是“扩展域”并查集。两种做法的运行效率差不多,不过第二种会更好写,且更容易理解,现在我们先讲边带权并查集。
一、
由题意,我们很容易了解到,这个题描述的是区间关系,而并查集只能作用于两个点的关系,因此我们要进行关系转换。
如果我们用sum数组表示序列s的前缀和,那么,在输入问题每一个小A的回答中:
(1)s[l~r]中有偶数个1,等价于sum[r]-sum[l-1]的值为偶数,即(s[r]-s[l-1])%2==0,也即sum[l-1]和sum[r]奇偶性是相同的(因为两个奇数或两个偶数相减的结果无论如何都是偶数)
(2)s[l~r]中有奇数个1,等价于sum[r]-sum[l-1]的值为奇数,即(s[r]-s[l-1])%2==1,也即sum[l-1]和sum[r]奇偶性是不同的(因为一个奇数和一个偶数相减无论如何都是奇数)
(注意,我们并没有真正求出sum数组,我们只是把sum视作变量,这时,这道题与之前的AcWing 237. 程序自动分析(第二类离散化 并查集) 一题就非常相像了,共同点:都是给定若干变量和关系,判定这些关系是否满足的问题。不同点:传递关系不一样)
二、
另外,题目中还提到,输入序列的长度n非常的大,达到了1e9,但是输入的问题数m却很少,只有1e5,而每个问题中包含2个区间的端点值,因此我们首先要用离散化将每个问题的两个整数:l-1和r缩小到等价的1~2m,即1~2e5以内的范围。
我们是用的是第二类离散化,不要求保序:
int idx; unordered_map<int, int> umi; int get(int x) { if(!umi.count(x)) return umi[x] = ++idx; return umi[x]; } 三、
为了处理多种传递关系,我们是用“边带权”的并查集解决。
定义边权数组d[],d[x]=0表示x与父节点p[x]的奇偶性相同,d[x]=1表示x与父节点p[x]奇偶性相反。(注意是父节点,父节点也可以是根节点的)
我们在find函数中进行路径压缩的时候,联系dfs的思想,我们发现,在递归到尽头后回溯的时候对x到其所属的根节点路径上所有边权进行异或运算(xor),就可以轻松得到x和根节点的奇偶性关系。
(由于按位加法运算在模2的意义下等价于按位异或运算,因此也可以用相加模2来代替。注意,一定要加上“按位”俩字,按位即按二进制位,只有0、1参与操作,如果 任给两个整数相加模2 的结果当然可能不会等于 两个整数异或的结果。可详见此处。)
find函数:
int find(int x) { if(p[x]!=x) { //先用一个变量root记录根节点find(p[x]),那么p[x]指向的还会是它的父亲而不是根节点,这时已经递归到了最底层, //所以一步步冒泡 d[x]+=d[p[x]] 就是将x一直到根节点一段段加起来,最后用完p[x]之后再将p[x]指向根节点。 int root = find(p[x]); d[x]^=d[p[x]];//联系dfs的思想,我们在回溯的时候对x到其所属的根节点路径上所有边权进行异或运算,也可写为:d[x] = (d[x] + d[p[x]]) % 2; p[x] = root;//路径压缩 } return p[x]; } 四、
LabVIEW崩溃后如何排查故障
解决方案
LabVIEW内部错误和崩溃的初步故障排除步骤:
通过LabVIEW Crash Reporter对话框将崩溃报告发送给北京瀚文网星。添加任何有助于北京瀚文网星诊断崩溃的相关信息。
确定是否可以一致地重现崩溃。这将使故障源的诊断更加容易。如果可以重现崩溃,请尝试在知识库和北京瀚文网星社区中搜索类似的崩溃。包括十六进制代码以及崩溃发生时的操作。
安装最新的LabVIEW补丁 。
查看您的LabVIEW版本的LabVIEW已知问题列表。
进一步的故障排除步骤:
尝试缩小警告的范围。减少代码量并减少用于创建崩溃的最小重现情况的硬件数量。如果您可以消除与崩溃无关的部分,则更有可能找到此特定崩溃的根本原因。请参阅以下故障排除步骤以帮助实现此目的:
如果崩溃是由可执行文件发生的,请检查从LabVIEW开发环境运行VI时是否发生相同的行为。这样做可能指向运行引擎出现问题。
尝试使用禁用结构来禁用部分代码。这可以帮助缩小崩溃发生在代码中的位置。
尝试卸下所有硬件。如果仍然看到崩溃,则可以继续对软件进行故障排除。如果卸下硬件解决了崩溃问题,则可以将原因缩小到硬件。尝试使用其他类型的硬件,以查看崩溃是否特定于硬件类型。
检查在另一台计算机上是否看到相同的行为。崩溃可能与计算机环境有关。
监视内存以检查内存泄漏。
使用WinDbg对崩溃进行故障排除 。如果崩溃是可重现的,则将此工具连接至LabVIEW进程,并导致崩溃再次发生。该工具可以让您更深入地了解崩溃的根源。
如果使用硬件,请在程序结束时确保关闭所有内存引用。对引用的任何滥用都可能导致内存泄漏。
确保所有错误簇均已连接并受到监视。您可能没有意识到之前发生了一个错误。错误编号用于指定出了什么问题,可以在“ 解释错误”对话框(“ 帮助”»“解释错误...” )中进行搜索,以找到有关错误的说明。
如果您使用的是.NET Framework或DLL,请尝试将其删除以查看崩溃是否仍然发生。您可以参考dll崩溃的解决办法 。
如果只有一个VI发生崩溃,请尝试将程序框图的全部内容复制到新的VI。有时,这可以消除可能导致崩溃的损坏。
批量编译您的VI 。如从较早版本升级了LabVIEW,则可能有一些较旧的VI尚未更新。
崩溃也可能是由于代码中出现“ Insane Object or fsane.cpp ”错误引起的。
如果要处理实时系统的问腿,请查看LabVIEW错误日志或实时系统错误日志 。
如果可执行文件发生崩溃,请确保在部署计算机上安装了所有必需的驱动程序。
添加自定义日志记录步骤 ,以获取有关崩溃可能发生位置的更多信息。
关闭防火墙,然后尝试运行您的项目。某些防病毒软件(例如SentielOne)包含导致LabVIEW崩溃的dll。
确保您未超出框图或前面板的最大大小 。
使用LabVIEW Desktop Execution Trace Toolkit进行动态代码分析,以执行高级调试。
其他疑难解答步骤:
如果可以确定崩溃的根本原因,则下一步是找到解决方法或以最小的规模重现崩溃。如果是LabVIEW错误,则可以通过联系北京瀚文网星技术支持来提出纠正措施请求(CAR)。附上演示崩溃的示例VI以及通过上述步骤获得的所有补充文件。这将帮助我们的技术支持工程师复制并最好地理解问题。
该问题可能与软件甚至操作系统的损坏有关。如果您尝试了上述故障排除步骤,但仍无法解决,则可能需要考虑重新映像计算机。
相关信息
LabVIEW内部错误是什么?
LabVIEW内部错误表示LabVIEW内部发生了错误或意外。根据严重程度,退出或重启LabVIEW时,您可能会立即或稍后收到错误对话框。三种严重性级别是DAbort , DWarn和DWar北京瀚文网星nternal 。
DAbort不可恢复,LabVIEW将立即退出。这样可以避免进一步的损坏,并且您将看到与上面的类似的“ LabVIEW崩溃报告”对话框。
DWarn和DWar北京瀚文网星nternal是可恢复的错误,不会导致LabVIEW退出,但是它们仍然是意外的,需要报告。从LabVIEW退出时,可能会看到一个内部警告报告对话框,具体取决于您的LabVIEW设置。
资料下载地址:http://www.bjcyck.com/nd.jsp?id=381#_np=2_358
1.概述 转载:Java 动态调试技术原理及实践
一、动态调试要解决的问题 断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径。但断点调试会在断点位置停顿,使得整个应用停止响应。在线上停顿应用是致命的,动态调试技术给了我们创造新的调试模式的想象空间。本文将研究Java语言中的动态调试技术,首先概括Java动态调试所涉及的技术基础,接着介绍我们在Java动态调试领域的思考及实践,通过结合实际业务场景,设计并实现了一种具备动态性的断点调试工具Java-debug-tool,显著提高了故障排查效率。
二、Java Agent技术 JVMTI (JVM Tool Interface)是Java虚拟机对外提供的Native编程接口,通过JVMTI,外部进程可以获取到运行时JVM的诸多信息,比如线程、GC等。Agent是一个运行在目标JVM的特定程序,它的职责是负责从目标JVM中获取数据,然后将数据传递给外部进程。加载Agent的时机可以是目标JVM启动之时,也可以是在目标JVM运行时进行加载,而在目标JVM运行时进行Agent加载具备动态性,对于时机未知的Debug场景来说非常实用。下面将详细分析Java Agent技术的实现细节。
2.1 Agent的实现模式 JVMTI是一套Native接口,在Java SE 5之前,要实现一个Agent只能通过编写Native代码来实现。从Java SE 5开始,可以使用Java的Instrumentation接口(java.lang.instrument)来编写Agent。无论是通过Native的方式还是通过Java Instrumentation接口的方式来编写Agent,它们的工作都是借助JVMTI来进行完成,下面介绍通过Java Instrumentation接口编写Agent的方法。
2.1.1 通过Java Instrumentation API 实现Agent启动方法
Java Agent支持目标JVM启动时加载,也支持在目标JVM运行时加载,这两种不同的加载模式会使用不同的入口函数,如果需要在目标JVM启动的同时加载Agent,那么可以选择实现下面的方法:
[1] public static void premain(String agentArgs, Instrumentation inst); [2] public static void premain(String agentArgs); JVM将首先寻找[1],如果没有发现[1],再寻找[2]。如果希望在目标JVM运行时加载Agent,则需要实现下面的方法:
[1] public static void agentmain(String agentArgs, Instrumentation inst); [2] public static void agentmain(String agentArgs); 这两组方法的第一个参数AgentArgs是随同 “– javaagent”一起传入的程序参数,如果这个字符串代表了多个参数,就需要自己解析这些参数。inst是Instrumentation类型的对象,是JVM自动传入的,我们可以拿这个参数进行类增强等操作。
指定Main-Class
Agent需要打包成一个jar包,在ManiFest属性中指定“Premain-Class”或者“Agent-Class”:
Premain-Class: class Agent-Class: class 挂载到目标JVM
将编写的Agent打成jar包后,就可以挂载到目标JVM上去了。如果选择在目标JVM启动时加载Agent,则可以使用 “-javaagent:[=]“,具体的使用方法可以使用“Java -Help”来查看。如果想要在运行时挂载Agent到目标JVM,就需要做一些额外的开发了。
Mybatis-Plus条件构造器笔记 Mybatis-Plus官方文档:https://baomidou.com/pages/10c804/
本文主要讨论Mybatis-Plus条件构造器的区别和用法
QueryWrapper、UpdateWrapperlambdaQueryWrapper、LambdaUpdateWrapperQueryChainWrapper、UpdateChainWrapperLambdaQueryChainWrapper、LambdaUpdateChainWrapper 创建Wrapper 以 Query* 为例:
// 创建QueryWrapper QueryWrapper queryWrapper1 = Wrappers.query(); QueryWrapper queryWrapper2 = new QueryWrapper(); // 创建LambdaQueryWrapper LambdaQueryWrapper lambdaQueryWrapper1 = Wrappers.query().lambda(); LambdaQueryWrapper lambdaQueryWrapper2 = new QueryWrapper().lambda(); // 创建QueryChainWrapper QueryChainWrapper<User> userQueryChainWrapper = ChainWrappers.queryChain(userMapper); // 创建LambdaQueryChainWrapper LambdaQueryChainWrapper<User> userLambdaQueryChainWrapper = ChainWrappers.lambdaQueryChain(userMapper); Wrapper区别 带 lambda 的 wrapper 进行列名匹配时,使用的是 Lambda 的语法,属于函数式编程,偏向于对象。反之不带lambda的就需要手动指定列名(即进行硬编码数据库中的字段名)
不带 chain 的 wrapper(QueryWrapper、lambdaQueryWrapper等)执行时,需要将封装的 wrapper 提供给 Mapper,调用Mapper的方法,才可以使用。而带 chain 的 wrapper (QueryChainWrapper、LambdaQueryChainWrapper等)可以直接链式调用数据执行操作的方法
Wrapper用法 Query操作 根据条件查询列表
条件构造器 // 1.几乎不会使用这种方法,局限很大 HashMap<String, Object> map = new HashMap<>(); map.
python正常打包,我们只需要在Terminal里输入 pyinstaller -F +项目 即可,如下图
但是呢,有一天我的新项目里 添加了pyecharts这个库,但是打包后,发现用不了.总是报错,具体报错忘记了.查了很多文章都不好使,
方法一:可以将pyecharts库包放入你的项目里.然后pytinstaller -D +项目.(但是这样打包及其不美观,是一个整体文件夹,)
pyinstaller没有把pyecharts的一些数据模版文件拷贝过来导致错误,拷贝过来即可,如下图那个目录,不过这个修改只适用于-D参数打包的情形,-F整体打包就不行了
以上方法缺点:
1、找这个main.exe文件有点麻烦
2、还需要拷贝pyecharts文件夹到指定目录,文件比较多且占空间
方法二如下,如果你和我一样想携库一并打包(一个exe文件) 可以使用以下方法,
首先找到你python环境中pyecharts库安装根目录位置,我的安装位置为:D:\Python\Lib\site-packages\pyecharts
然后命令如下pyinstaller --add-data="D:\Python\Lib\site-packages\pyecharts;pyecharts" -F 项目文件.py
如果使用 pyinstaller 打包,则需要在打包时指定这些外部资源 (比如在命令行中使用 --add-data 参数),将其和源码(及依赖)一起打包到生成的程序中。
用法:pyinstaller x.py --add-data=“源地址;目标地址”。 windows以;分割,linux以:分割
例如:将 config 目录的所有文件打包到目标的 config 文件夹(不存在会自动创建)下
pyinstaller x.py --add-data “.\config\*;.\config”
例:
将原路径(绝对路径或者相对路径都可
通过在命令行中使用 --add-data 命令添加资源文件路径就可以成功打包并运行。
pyinstaller --add-data=“D:\install\Python37\Lib\site-packages\pyecharts;pyecharts” -F
一、执行sudo不输入密码 方法:修改sudoers文件
编辑文件
sudo vim /etc/sudoers 有两种修改方式:
1. 将某用户的权限设置为与root相同 在
root ALL=(ALL:ALL) ALL 下面添加一行:
tangzhe ALL=(ALL) ALL # tangzhe is your username 结果:tangzhe(某用户名)执行sudo 命令时不需要密码
2. 将sudo命令设置为无密码即可执行的命令 将
%sudo ALL=(ALL:ALL) ALL 改为
%sudo ALL=(ALL:ALL)NOPASSWD: ALL 结果:所有用户执行sudo命令时都不需要密码
:wq!强制保存。(最好不要修改sudoers的读写权限,修改后会报错,如果报错请看下一条:)
二、报错:/etc/sudoers 可被任何人写 报错内容:
sudo: /etc/sudoers 可被任何人写 sudo: 没有找到有效的 sudoers 资源,退出 sudo: 无法初始化策略插件 原因:修改过sudoers的读写权限
解决方式:将权限改回只读
pkexec chmod 555 /etc/sudoers pkexec chmod 555 /etc/sudoers.d/README
需求才是学习的第一生产力,学习VBA是因为要帮测试同学解决excel中的值校验问题。具体来讲,需要对指定单元格做数据格式校验,必须是json,不是json或者格式不对的,要有提示。
解决问题的方案很多,可以写个python脚本,本地执行(测试同学说没有python环境)。也可以在工具工程中,增加一个接口,长传文件做校验。但我觉得上述的方案都太重,如果excel本地就能解决自然是最好的。
OK,那就进入正题,看看是怎么解决的。主要有两步,第一步是基本的宏(VBA)的创建和使用,第二步是具体的执行代码编写。
第一步,宏(VBA)的创建和使用 1、先在页面上创建一个命令按钮,后续点击这个按钮就可以触发宏
2、点击查看代码,编写代码(红框为编写的代码)
不熟悉代码的,可以先写个 Private Sub CommandButton1_Click() MsgBox "弹窗,测试" End Sub 3、保存&运行
第二步,json格式校验代码编写 先吐槽VBA,这个语言和笔者一样大的年纪,是真的难用。网上的资料也比较零碎,估计在这个任务之后,非特殊情况也不会再尝试VBA了。
OK,直接上代码。
Private Sub CommandButton1_Click() '定义变量' Dim aa, y As Object '错误定义,遇到错误不会报错,而是继续执行后续代码' On Error Resume Next '打印当前选择的单元格的列数' MsgBox (ActiveCell.EntireColumn.Column) col = ActiveCell.EntireColumn.Column '定义一个对象,并设置为js语言,可以使用对应的函数' Set x = CreateObject("ScriptControl"): x.Language = "JScript" '循环对选中列的每个单元格对校验,从第二个开始,第一个是表头' For i = 2 To UsedRange.Rows.Count aa = Cells(i, col) If IsEmpty(aa) Then '为空跳过,因为VBA没有continue关键字,只能用嵌套if语句实现判断跳过' Else If x.eval("eval(" & aa & ")") Is Nothing Then 'MsgBox Cells(i, col), , "
参考文档:
Git忽略规则.gitigonore梳理
问题:使用git add 命令时提示如下
warning: LF will be replaced by CRLF in package-lock.json. The file will have its original line endings in your working directory 解决:
在命令行中执行如下操作
git config --global core.autocrlf true 感谢:
https://www.cnblogs.com/youpeng/p/11243871.html
payload模块的三种类型 payload 模块主要有以下三种类型:Single、Stager、Stage。
Single是一种完全独立的Payload,而且使用起来就像运行 calc.exe 一样简单,例如添加一个系统用户或删除一份文件。由于Single Payload是完全独立的,因此它们有可能会被类似 netcat 这样的非metasploit处理工具所捕捉到。
Stager这种Payload负责建立目标用户与攻击者之间的网络连接,并下载额外的组件或应用程序。一种常见的Stager Payload就是reverse_tcp,它可以让目标系统与攻击者建立一条tcp连接,让目标系统主动连接我们的端口(反向连接)。另一种常见的是bind_tcp,它可以让目标系统开启一个tcp监听器,而攻击者随时可以与目标系统进行通信(正向连接)。
Stage是Stager Payload下的一种Payload组件,这种Payload可以提供更加高级的功能,而且没有大小限制。
在 Metasploit 中,我们可以通过Payload的名称和使用格式来推断它的类型:
Single Payload的格式为:<target>/ <single> 如:windows/powershell_bind_tcp Stager/Stage Payload的格式为:<target>/ <stage> / <stager> 如:windows/meterpreter/reverse_tcp Stager中几种常见的payload windows/meterpreter/bind_tcp #正向连接 windows/meterpreter/reverse_tcp #反向连接,常用 windows/meterpreter/reverse_http #通过监听80端口反向连接 windows/meterpreter/reverse_https #通过监听443端口反向连接 正向连接使用场景:我们的攻击机在内网环境,被攻击机是外网环境,由于被攻击机无法主动连接到我们的主机,所以就必须我们主动连接被攻击机了。但是这里经常遇到的问题是,被攻击机上开了防火墙,只允许访问指定的端口,比如被攻击机只对外开放了80端口。那么,我们就只能设置正向连接80端口了,这里很有可能失败,因为80端口上的流量太多了
反向连接使用场景:我们的主机和被攻击机都是在外网或者都是在内网,这样被攻击机就能主动连接到我们的主机了。如果是这样的情况,建议使用反向连接,因为反向连接的话,即使被攻击机开了防火墙也没事,防火墙只是阻止进入被攻击机的流量,而不会阻止被攻击机主动向外连接的流量。
反向连接80和443端口使用场景:被攻击机能主动连接到我们的主机,还有就是被攻击机的防火墙设置的特别严格,就连被攻击机访问外部网络的流量也进行了严格的限制,只允许被攻击机的80端口或443端口与外部通信
参考 https://www.cnblogs.com/qi-yuan/p/13780899.html
当页面访问失败时,就发生熔断,此时需要提供用户友好界面在服务消费者pom文件中加入hysrtix依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> 然后创建feign的实现类,实现feign中的方法 package com.offcn.feign; import com.offcn.pojo.Movie; import org.springframework.stereotype.Service; @Service public class MovieFeignExceptionServiceImpl implements MovieFeign{ @Override public Movie getMovie(Integer id) { return new Movie(-1,"没有此电影"); } } 在feign接口的FeignClient注解中加上fallback属性,值是feign实现类的字节码文件 @FeignClient(value = "MOVIEPROVIDER01",fallback = MovieFeignExceptionServiceImpl.class) 在主启动类上加上允许hysrtix的注解@EnableHystix在配置文件中设置开启熔断功能 #开启feign的熔断功能 feign: hystrix: enabled: true
svn图标消失解决办法
电脑时间使用长了,难免有点卡,就用360优化了下,导致svn图标显示不出来
打开百度,搜索svn图标消失原因,千篇一率的是修改注册表,重命名,结果没有效果。
1.打开注册表编辑器 找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers
然后将Tortoise的几个目录重命名前面加空格,测试无效
2. svn设置 右键->TortoiseSVN->setting->Icon Overlays->Status cache->default/Shell。
或者 右键->TortoiseSVN->setting->Icon Overlays->Drive Types>fixed Drives
重启资源管理器后依旧无效
3.重新安装svn 做到这一步的时候我找到之前的安装包,点开后发现有一个Repair
然后试着点击修复,修复完成后小图标果然都回来了,所以并不需要重新安装或者更新新版,只需要通过安装包repair一下就可以了
最后重启电脑,问题解决。
目录
partial
Required
Pick
Exclude (排除)
Omit Record
partial 作用:将传入属性变为可选项
源码:
type Partial<T> = { [P in keyof T]?: T[P] };
用例:
interface Foo {
name: string;
age: number;
}
type B = Partial<Foo>;
// 最多只能够定义 name, age 中的属性(可以不定义)
let b: B = {
name: '1',
age: 3,
};
Required 作用:将传入的属性变为必选项
源码:
type Required<T> = { [P in keyof T]-?: T[P] };
Pick 作用:取出一系列k的属性
源码:
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
Skynet入门实例 一、下载和编辑二、运行解析三、理解skynet3.1 配置文件说明:3.2 目录结构: 四、skynetAPI五、skynet实例程序4.1 PingPong4.2 聊天室(Echo的升级,收到的信息广播给所有在线玩家)4.3 做留言板,使用数据库4.4 监控服务状态4.5 使用节点集群建立分布式系统 六、使用skynet注意事项5.1 协程的作用5.2 扣除金币的Bug 一、下载和编辑 CentOS7.7安装相应软件:
yum install git #git,用于下载源码 yum install gcc #用于编译源码 yun install autoconf #用于编译源码 yum install readline-devel #编译Lua会用到 下载skynet源码:
git clone https://github.com/cloudwu/skynet.git 编译:
cd skynet #进入skynet目录 make linux #编译 执行指令“make linux”会自动下载第三方库“jemalloc"到/skynet/3rd/目录中,如果下载过程太慢或者失败,可以自行到https://github.com/jemalloc/jemalloc/下载,然后解压到/skynet/3rd/目录中,然后重新执行指令“make linux”进行编译。
注意:gcc版本需要大于4.9(因为用到c++11新特性),所以类似ubuntu14等低版本需要下载gcc-4.9以上的版本,然后替换gcc、g++软连接到gcc-4.9、g++-4.9。
二、运行解析 启动skynet需要指定一份配置文件,例如:
./skynet examples/config 运行结果如下:
[:01000002] LAUNCH snlua bootstrap [:01000003] LAUNCH snlua launcher [:01000004] LAUNCH snlua cmaster [:01000004] master listen socket 0.0.0.0:2013 [:01000005] LAUNCH snlua cslave [:01000005] slave connect to master 127.
一开始后端项目里是没有引入security的 使用配置类来处理跨域 有效
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CrosConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { //项目中的所有接口都支持跨域 registry.addMapping("/**") //所有地址都可以访问,也可以配置具体地址 .allowedOriginPatterns("*") //允许的请求方式 .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") //是否支持跨域Cookie .allowCredentials(false) // 跨域允许时间 .maxAge(3600); } } 但是不知道为什么在引入了security之后该配置类失效 前端一直提示跨域问题 离谱的是状态码是200 后端执行了代码 甚至把请求头里都放了jwt 但是请求体发不回来
解决方案: 1、添加一个过滤器 import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class OptionsRequestFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if (request.
文章目录 前言一、定时器代码生成二、数码管断码获取总结 前言 本文主要给大家介绍蓝桥杯的两个小技巧
一、定时器代码生成 把TF0=0改成EA=0和ET0=0即可。
二、数码管断码获取 这里的数码管断码是共阴的断码,而我们使用的单片机采用的是共阳的断码,所以想使用这个断码的话需要对其取反再使用。
总结 使用上面的技巧可以在比赛时帮助我们节省时间。
系列文章目录 实践数据湖iceberg 第一课 入门
实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式
实践数据湖iceberg 第三课 在sqlclient中,以sql方式从kafka读数据到iceberg
实践数据湖iceberg 第四课 在sqlclient中,以sql方式从kafka读数据到iceberg(升级版本到flink1.12.7)
实践数据湖iceberg 第五课 hive catalog特点
实践数据湖iceberg 第六课 从kafka写入到iceberg失败问题 解决
实践数据湖iceberg 第七课 实时写入到iceberg
实践数据湖iceberg 第八课 hive与iceberg集成
实践数据湖iceberg 第九课 合并小文件
实践数据湖iceberg 第十课 快照删除
文章目录 系列文章目录前言1.基于hive的catalog,对表进行小文件合并代码2. 合并运行过程3.是否能多次合并?总结 前言 如第九课所讲,对文件进行合并,只是生成新的合并文件和快照文件,没有对原来的小文件进行删除。 本节,测试一下旧的数据删除,删旧数据,需要通过删旧快照进行,详情请看下文 1.基于hive的catalog,对表进行小文件合并代码 package org.example import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment import org.apache.hadoop.conf.Configuration import org.apache.iceberg.catalog.{Namespace, TableIdentifier} import org.apache.iceberg.flink.{CatalogLoader, TableLoader} import org.apache.iceberg.flink.actions.Actions import org.apache.log4j.{Level, Logger} import org.slf4j.LoggerFactory import java.util import java.util.concurrent.TimeUnit object FlinkDataStreamSmallFileCompactTest { private var logger: org.
在项目中遇到了后端返回的PDF文件,不是以一个PDF链接返回给前端,是以Base64文件流的格式返回给前端。
前端需要通过Vue-pdf去预览PDF
vue-pdf插件的使用在我之前的文章VUE-PDF 实现pdf在线预览有提到,感兴趣的同学可以去看看。
后端返回数据格式
{ "code": 0, "data": { "result": "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dGhzIDc5IDAgUj4+CmVuZG9iago3OCAwIG9iago8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0Rlc2NlbnQgLTIxNi9TdGVtViA0MC9Gb250V2VpZ2h0IDQwMC9MZWFkaW5nIDQyL0F2Z1dpZHRoIDQwMS9Gb250QkJveFstNTY4IC0yMTYgMjA0NiA2OTNdL0NhcEhlaWdodCA2OTMvTWF4V2lkdGggMjYxNC9GbGFncyAzMi9YSGVpZ2h0IDI1MC9Gb250TmFtZS9UaW1lc05ld1JvbWFuUFNNVC9Bc2NlbnQgODkxL0l0YWxpY0FuZ2xlIDA+PgplbmRvYmoKNzkgMCBvYmoKWzI1MF0KZW5kb2JqCjcxIDAgb2JqCjw8L1BhcmVudCAyMSAwIFIvVHlwZS9QYWdlcy9Db3VudCA2L0tpZHNbNzAgMCBSIDgwIDAgUiA4MSAwIFIgODIgMCBSIDgzIDAgUiA4NCAwIFJdPj4KZW5kb2JqCjgwIDAgb2JqCjw8L1BhcmVudCA3MSAwIFIvVHlwZS9QYWdlL0NvbnRlbnRzIDg1IDAgUi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSV0vWE9iamVjdDw8L1hmMTIgODYgMCBSPj4+Pi9NZWRpYUJveFswIDAgNTk1LjMyIDg0MS45Ml0+PgplbmRvYmoKODUgMCBvYmoKPDwvTGVuZ3RoIDUzL0ZpbHRlci9GbGF0ZURlY29kZT4+c3RyZWFtCnicK+RyCuEyNlOwMDDVszRSCEnhcg3hCuQqVDBUMABCCJmcq6AfkWZopOCSrxDIBQASngq8CmVuZHN0cmVhbQplbmRvYmoKODYgMCBvYmoKPDwvVHlwZS9YT2JqZWN0L1Jlc291cmNlczw8L0V4dEdTdGF0ZTw8L0dTOCAzMyAwIFIvR1M3IDM0IDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFnZUMvSW1hZ2VJXS9Gb250PDwvRjEgMzUgMCBSL0YyIDM2IDAgUi9GMyAzNyAwIFIvRjQgMzggMCBSL0Y1IDc0IDAgUi9GNiA3NSAwIFI+Pj4+L1N1YnR5cGUvRm9ybS9CQm94WzAgMCA1OTUuMzIgODQxLjkyXS9NYXRyaXhbMSAwIDAgMSAwIDBdL0Zvcm1UeXBlIDEvTGVuZ3RoIDMyMDQvRmlsdGVyL0ZsYXRlRGVjb2RlPj5zdHJlYW0KeJy1XFmPHLcRfl9g/0M/ygHcy+JNYCGgTyNBDNjWBgkg+EFxZMUPlhxlgyD/PlUkq6dnpmebI3MsC5rt6YP86vrq6H3oPj//8vO7n56bx8eH7vn53U//fP+P5u1D/+n5+dOvPz48/e+39w/fvfvwy8d3z798+vjw5j9/f6ZD86dPz+8/v37d9OPQ/Ov+TrSC/vPeQSMaE0yrZOM1tEE2n9/f3/31D83H+7v+6f7uYYYmNE8/39/RmaLBn/BiqRsDrdfN0694yjdvXPPh33jX5kP8yeefvrm/e/uq+erH5ulP93cT3uz7+7vih6dzZVCtCI0OrdZNaPG5AK3Qq/OKTtreSb7usJO4gbju5mtapWqefnr7CuBsC1/6RCVkK2HziVtIfR//b6Zvh6Z5+I5k/u3wx7ERXyZI1YBojd0SpjO+lfZ0RY/CCC+HXis5Ta8BHuXsJwh+ps8AkwI/dPGz64T2AuizkIN/LaV7FKPx8UsflB6ChtHGk4UfvTbBxs961NrqdFz3PfTO0GetjBJG9vF6YzvhrRVWjPG7IQTQg07feQW9iQvixabrvZZg46JFp6bzRY1mWN+QLnh9BP8Z6lAfdS1bu4G67WY9eKGnIa5PuN5opWcGJq6VjuN5Aobtdb/57d3HZeny4c/vPn5oXr3/+PVf3nz1ZfuwG/sAr1vjL+zjVJ/PAFX1AAU0P0BApWtFWohsnj43olUC8Jb/PQZYAQpf9wOMqEhZ04RzI2npPpi6ApjyApihdA+74Jr64OI/eh9cNDUttBL4r4HJBghhUtPYk7WRpaFaZ3NHszQiu4GpI9NFU/X4dxDBzegvotmSqcveQjZxy9eD72bws2H/xL6J/RL5pGgx6JeEHN2+YO2NBKvRuQZfiN+uYF11wVq80JcKth+iYEfTiU6A7PXMPpz8dxQM+vDob6NgZyNGEMniVFBWGdRzS+6XYsCiDJ1ffDfYuQPrBZ47gNHo+jpH37Fwy4TpbyVM5dpgCjHbFWaoL0wvOJIXWGmIwrR4Cngj5t6JuVMEtlQOcoB2JOgY/UnYGD9J4HuxsiJFkWg+zpVujDUxauGioS5pJukTatO+9gDcSH2UNq0t3cwrJXb0B2Q9nBXi7ItxFrMJwgAqjbbRdRcREVC3MkvUfmNKcd0zS9D17dJq5kj71ESFRE28PuKC+/CaCvCay9xktYmr4LR14RSysZh6iXPqzLSeiEZ0WTDPEgyc5xcJ2kT/D1SbiMb6eopPouuHRDgGwylDPL7kN4fjMEhL5EX0LhIbOYUJICVJhRbibsTVtTAthAvA7YvQ17cIpUr4ZLSIUfRrixCz0rJTtgDOcGOLOGziGjhlxfjIFgGOGcmpRejBacy6xVGymxNITtvJAoRJVkCUneJmZnNeKvL0zO6QJOiUvUcmhxk4WxezOW2mCb8T6bim3HVeJ9vLeTAi5Yf4HIohy7owkycryuek7F0bE7P39Y12WIisn7JbKuCo85Q9eOS1CIzpsh9Q07oWseVrYloPY0RfAYpodV5hWl8jr4ctyqVda+HCZveVu2JiLzWamWuMt61V++QvK3pUWHS7yvdSWOci8VtBrywm/Fa9rEfHUNfI+rf8CPLsVh9t8CqoK6b50phWQ2NwQWIfanLHVGFTRlvRSYdZWYE7lrfKsZXwsbBatPhX/d8kZjwgRdjE93jJNQLypuRtXOtqyVdJvnJAxghiSAHOfRvzG/TwyeuPVI8dffL0wVKAzgWdmN+f1m+ZTy35PUwW9JgM0UMn+8SjpOzGpS6MHp8jAz+fIlky2ONoVugraxCBTV4FpnXmAnj7NdD6RMCo0PqNEJXFgDE3hyKpKQQtNXsKsFyoO43UFOmF65Js0J9qmJZ6DabZE/5dCnnMi9kJJzknR8xZOC2CFpCifTezDpw+f7NnkLP69Xc7REDVJwJG6i0iwAZBxpAiDTpINIa0UXm0OTSXdHw8SCKm0qtEZWlcgE4IRy7lQspIoA/aQbLEATxJaW1xi/QmzNOD8JyREO9aHhYfoMIm9C+a+Q7kFSsTDDn6+PMYufiao8UjF4ufrZKLf4kM8yAKIgQL8z0hlsTn0sa7kbjcgtYku4SiEwhE0r9pmMgfUdE7oa/GMp+kalRDtnyScir6pE3A9n1SxepH5m+a+qXl/E0EG8VJxSX6LHuixzawKNfhpYy/qVtVRjJ/W23wKqgrVkYyf9POcSCqz99UDTL0An8rW/zC32C7Pnq85BqdAH2Zv62WLFqQEtcsMQ8XrQ7N5w8bB38o04zKrQEkBpisbxGDWvyOo8/p9Ydev+rW/Z7TsLjU7KjXsxX3Nzght/LZccR7fA2iMIHW4kYO2Ai0xUuI78peV6QrudimtWW6UlB+FuQdWCaLrPfhrFGPeKHYttrEVXBWHjQgU1KCCiRXc2xickS01nbDvHlhb8izmWOzPRDHzlz70DMlzmJSvYgC4+l9t2wociAzRx6uhOqFNuPR4o56fdr2ywJ5sTtQV6QOmfVRfiU2oD4lyaD9I3raDGc/ncKxwGaGUbrg0nlmFMFN/J2UGhD+1C7o+gGZ+bikMrEAagK3ThNuneklAirNlHxZJ4UYbeKBwXZ0YfRReDG1WuMNaKKBV7pujHOitXaYrBx7uFesA2XcVQhEJ85wR8/NoxcLK0aKlpQm0TTWyCQXguxU1XH3WmW78ESp6SQYgrapmqw1zJdmw1BFnTBGr2MJqmqqLei+w0s7Xg0ElQQdMCGIuSg9KEuWChGJwMuOiwvrrexhXpG7MeZetf6yW6HRmKg0susvYQ5T3rGb7VKBxhxReGV/3xCZvhX3Q2tswV3Y/L53r9+ZUjaS0RuPkd24M7XaxFVzY5ULUgSnkRwsX5woQI8gPOpq8LOYLaBWKk76IvfbqEuRHyatZo2O2lyUyZgaEx5b8Eu0ZaXWm74K/oplE4ZfOQ6gpXN7RC3kKNMsXnQ+w8DOJNITnttjijh1IYoP6bkKk0PDOGpnRdqRC1XkiMpGuEyN8sh25V23YNbAXCWi+sMhSgLH2uIJPOo2YqSTcuopGoKdDY1UJqs4J24cQWEAgSJU6B70aewmi+MgiOF/PlhfkbhuVmLBK/DSFUhXiavy8AmJC7M7X2xRccZO+i7oUQmuZlEIP6JKRSHY3KoXJWnoOKw3dhXE9UMwedHiEPyl41LmxiF4tYlr4LT1e0LSxUH989L5ATIuhfOs9dm4Ux6DOhuPwlhB5/J3NAKVnMjGGNTOxivWPchbQLi08TRYnntWufa/bCp4w3nxuv5fZqL2Vu9aaGkvb2hfp+q/bCHTWPtt57fsreYu2EQPm7gKzsqvV5CJatWqc01dvzrBJqeQXKY8Dh/D5sYt3Fhd6ITItY5+eXfCdQ5xd+uAzyUiGHsNnmsiuuPSE/G5hfeFSCokl6mIIIhuBm5Kqs6k0jBeux7qovNSao4EA3N9Wgd/l81K7fmF+pk2BTy35RCnWOpBZpWcINo+kuCURSPJXYfsS1N0cXweyXMGXXEvkabqog+hbutZRWRKN16/LXOa7KAHnRDEXCc6LsEcFdNPX3Y79W5xSm0H8oqvmTDkIFs4h5xH5S62ZnP9lEblaEyOFf+6UTlbowu05ZYlWCpebG9u349U7PKgWrU2NBAsB4iSVit3a+LbONTJtnaAUY14LBWCkbgqPebOTuoZ7sPtajRWNvuEzlJnu2yT++9SVSQcuf0KXpRExS9rv7oa5OKF9mvZ4g/tV9hvv7pbvfGR26+FS97VhPpJPVjDAb205bbjlF1N1qFl6+V6kVs94Vx7t5v92HVUye9YX+rPkhdJRGG0caPkWVD9y5y3u9nUKIKg1QUQ9nWm/quYoAPTktLK857O1MzNs84cFnn6psFFOYfc3goo8FWPB3oP0KU5wL2oE4miNOKRFVAbVEzog3AhvYgzzUKq9KrfizdAhpffWbDdenpxWcEOpBWDduZGoPQWN+JdnJiMShQSd0E7iFBYBbT9Szge3YAbnJiU0QsL8TjKRYm5Zzp5Ksfldyks44irjP/QiIOZyHNeUEBhh7UzYDlRJfhMUV6G3Nf/lRcAfqsyEBFa+pbaz+zSYlpgVWbp+GftIqkmziWD3Gy7ZAoLZ6WG9VkxJb+BQw3qE//qufsXkypWbRi6ZbUQVODONuUHdIMXV+EvZOAr3OsPzoKQbdj4pRfe9JS2UsqamrKJi55qdFnE8LciSuA0Jevbm9iNGL7mmzGJ7nvXquLXSgV6CUH+d+17fz/b97f6lRiZ7RftcRP8/wPdx+CkCmVuZHN0cmVhbQplbmRvYmoKODEgMCBvYmoKPDwvUGFyZW50IDcxIDAgUi9UeXBlL1BhZ2UvQ29udGVudHMgODcgMCBSL1Jlc291cmNlczw8L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFnZUMvSW1hZ2VJXS9YT2JqZWN0PDwvWGYxMyA4OCAwIFI+Pj4+L01lZGlhQm94WzAgMCA1OTUuMzIgODQxLjkyXT4+CmVuZG9iago4NyAwIG9iago8PC9MZW5ndGggNTMvRmlsdGVyL0ZsYXRlRGVjb2RlPj5zdHJlYW0KeJwr5HIK4TI2U7AwMNWzNFIISeFyDeEK5CpUMFQwAEIImZyroB+RZmis4JKvEMgFABKlCr0KZW5kc3RyZWFtCmVuZG9iago4OCAwIG9iago8PC9UeXBlL1hPYmplY3QvUmVzb3VyY2VzPDwvRXh0R1N0YXRlPDwvR1M4IDMzIDAgUi9HUzcgMzQgMCBSPj4vUHJvY1NldFsvUERGL1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZUldL0ZvbnQ8PC9GMSAzNSAwIFIvRjIgMzYgMCBSL0YzIDM3IDAgUj4+Pj4vU3VidHlwZS9Gb3JtL0JCb3hbMCAwIDU5NS4zMiA4NDEuOTJdL01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9MZW5ndGggMzE1OS9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQp4nLVc3W8cuQ1/N+D/YR59BW4sUt+AEWA+Dy16wF3jog/BPbhpLs3DOdfURdH/vqQ0Ws/GM5HW0ARJPLue2aV+pPgjKUq33ZenT78+vH9q7u5uu6enh/f//PCP5t1t//np6fNvv9ze/+/3D7c/PXz89Pjw9Onz4+3b//z9id+aP39++vDlzZumH4fmX9dXohX8xzkLjWi0163ExiloPTZfPlxf/e0PzeP1VX9/fXU7Q+Ob+1+vr/hO0dArehhVo6F1qrn/jW754a1tPv6bPrX5GF655dUP11fvbprvfmnu/3R9NdGH/Xx9Vfzl8V70shW+Ub5VqvEtfS9AK9TqvqKbtkeyPPc8kjCAIHfzPUspm/v3724AXwzhtd8oBbYIm9+4hdTP4W8z/Tg0ze1PrPMfhz+OjXidImUDotXmTCAguUE1VrsWTZAIm/svjWilAPrI/55JeCdBD0JJD6OHN2fCvpARKsqosHVYKiOMchRuBOmlFCOqTTnf/v7weBIVb//88Pixufnw+P1f3373OrlxS26nWn+G7Te0/QJAWVfJggAkHM0LQe6EEaMaPClVzW8A7tSASthe87XAwb1BtHdyGvvwxnIzX8NoOkLahYe0p99oJ3QXPgR77ZSeLV9LIXuh9Bie7wRgH78IeqvVMAzhHiPJsrQVs4HwerKDFp0J1xZJo0P4fhjQRKGkPxNGqKkjwI2w8SH6IgvOuYyZqnooL37Rom3FBsos32Q8eD/FAY49yx8R955/H64Jbf6b0BedgvX9Z+PthAjXeujF3MdnlOyVcTJ8loIZeheehw5VmhrhPhgKpoY+aGqQulvwO1hlp4apPzXoh9pQGg6KABX0M04H73Sy6Dx49ii/YkyLezLfaJFBz1VEz/pW7oJn/aDsPEQLBZ18CnhhTi4DR5sH0h8EJGpsrd0DMmeFUJmGyQwNPej2zLAfkhkqIwFx8ss8lvw6OF00il+ne9Rgok+wU49ywvQ76PSIvVk8fIkGAI5SgfOtgZ2B51WA9VXgxAZbJ0/gTyrQfpJmniK8ViMqldQBHHUEQ/fI90V+m6dCqOVRUCsboN4cYB7qikyZoDZqMx5hqEfRr6A2SvdLKGAA5ymGIiMKMfXRop0VapSBDXHoFfsY8DgmlYhOdiefU8R8cBj1CdGC3Rl8Xg2VuY9if0NZjCiM/UktHPsrqaXQ2JPlc0BSAudhZBiD7LJB5OGtSY4LvFImdvkWvOtQI8WJbNUhqB6JKAnwYOm679O1nOfg7zlYht7M5HkAO2kURb5qAMczId0HMHQppoQBwucBaRHQaRzRUdws1/EhhZc0f2A6zSgz0/0eC53YUZStBYFaiGlW21g/kTZgE5HltJ3JTLBmBo3Q2mLZKNLIyVaTdyUyH5UDp1P4k7j2a56VFJbG/DSaM+ehKQcllrCcf7JJpxAK+sGfwiYKmdbhkiIPR57OhGvda743fA99B4xOpOeVNJ5z3rLpgUdx/DI9irDMT4/KlM/Tg+tfssr00NWnR6FsFAXmZKtJ0sv0KAZOrysFqSqiRRemB5dUUqUhePXearByZgYRynRlsREeReboaVyycLB5+61P5tqZ1uTVEOukgyqok6KvXigtFDIFcWpwZBLDmNe7FMcGcSvBL6qU1mTKmJpoSz9eSJIvlVKEdLeeezHbfq7SFWB8VDUa0bba7ozsBnMYVyxHo9St8nsYI2jgvCLgS6yamT+yIkmhsa3Qe4JxOBH0SCHFSdlK9lo47AoUe1hCifTWHpx5xVbkKomu1fAtxSbeeZ4wyt1hH2v+4AadSuI8eUTXD+s1hzShOCWSEAmNXCyelcU7mSv5S1u95q81WfSGu+jkEBYsvA3uQvTWUMwZBOd8LCLAFiXjmgUxcIEhucO8sG1R7wzmRucMqSaR0RNgtyXhlVlAXpiNroID9yxm6ijmQjC7kr67gVwtXlWkLkS/r75LsDqMgTRFIlmt3kDO0lRNLjKyVTugvc7S1GGVcrUrKbn5rKVVzJfQUyghv2lpo4jLtZOXZTmFMkfRo/St3sUtF1uqimSBJIkhoqYfrjSH6AcJIFIJHKD3wnoH0yxQ2gAxus5LNZpY8fCUy5qpAO6jSERa01pdOMg8/DVJZUnhUJVk0gF+68eCFE7XLCMuKVyZkJf3uuijFvJSClckeFbvuv7CHoXpG8llYUrHpZFwY+xWWS9JpTmpTEzzuJRyFt5+3eXB9Zi4bNgZ7lKJoa9zqUNkWTqctlpu+B7uEImrvRbPJPy6pST16OTMtyKdLvGw4va4Dazd6Bi6dUbMryOk0b1FZPx2EH9uykcxLVjFjmJ7EDdtznRrFiZDf8UOmmsS+Do33UOVnwm2Q8/xCk+4HmESXi69GTAIJDLJo38YXyvbSr2HftZxVOTrxXEoazeTu2XBLje7ahYhJQbD3BVI54SpXGzUbleYTkDqDWQftDa8UN1f3l+3sUjRdajh1EeBdpbR0U2n9RlhJyt8p9IaTBi0Lu5jMUflgclqN9HIN7TVr2AqAykA+1YrEemJ6ChSnxjOHUQhpIeli0Jzv8r2QPKQVu6fRUOpnUmxzW5rUEaomitqMVLcEYoIYDi1jkrspRax53ZFGkHwTvfPEY2fTm0C2o7pPkWaOK2PrvueaH6D6mSMeijzYFJBkUKnLBgViVISUaLd11CRIddgNNgSzvmWHl0L1wIixcboDP2vfPPl48abfykz9AMYTwqeebnGLFCD5s7sl3ZVBPdhZUx6QuidQeThrJxxMpxAAu3AqejfRkvh5XDaw9bmFjg3B5GF09ZnNul9q3bgpIQ9wYnYjSEMzghYM9M0kkOiHQHRTz12S7/i5fo9rC0UDOt3W+i8fuu3hUonW7c3XShI/Fq/fN0bigFjN8432W4vsVwNqGadlIJCK/cGVGKcFRfnUDteqdgRJiDoR5vQ5FjwDM2MoBVJSCLw3pAdQU8qzQhUMe2SFGntCdR8r1sVlgjYLgun8lHNkVLb1sMOctmp7OrvZ5DG8XbHHVd91uGdam7ox/nU1X2xl3SH7VNYvOTmgPLQ1i9nSo27MZpyJxaU3azSVg9ESqMvzu/cYcQT87vtgeQhPYB4pN2N07yFzf0IGofQcrAqBL+w3KL1L3dUewiJEfz+5uDyMNffb8D+fYk0CvYay9ftN3AH7zcoG0Qe3votigRU8v7l+w2itYYGad6g6yeRunTUAJOaYp8K7yvgZujQObo0XofCnUYlDN0n4+pFeSO0O4wKVSgfl4GRVZOvv1GAW12xVE2xXodS2WUDkwTnpBw1nHrdec/vPKu0YCRs11/Wk+4Po07reZdl2YDzqqhMpawKqzhtK5wxoc6XOIAX/ZQeZIK63N/7I/M5LQsHlYe7/h4ATkR8Hu5lAb4vWID3NZfcYlm1UMjLe6j9UetmCzGVCZ7Xe/2qIpJLlu7yBXil9R2MeuBGlxBzqdEEo2CmATMlpkosdr6uOXfrrUDxGU2hWhdXoJXsWHdL2gu5FtTT+2Oc69yGylR41qa6xIPc/Zkz3Ir0vyy9c5u3fYlyakPlFtQw2GlV6y9zWEdRNWgZzGNT8IJd+BW5eenQQqCEv9BDESFwh5YgKuYeDN5ow5tszgzuVR1aII4i5KVFq2yUBQqoz8jgTQkjRwW4kh4tEDXXAyNHFEp5eZMWiMNaWyJJrCS/TNU1iTayAmUUia8uPpRo6/ycrTOATr97xfk78Yt4x8FOO9ZZO5e1cfM0TKfN18kjPO9eIPXOftsDrLGumHkv3ABGbzGwsg7jXtrYRMSBrPQ+nuPkvE85hvDDzNIHKJct5OsRJiSIRV0iSGXnUczafl0gSc9E+AcBZpTMUeG+jsaq43lPfOJO2Wk7II5K+aW33Dm4jd6NzHVeg6jI8opnjd3TJB+5s6A+8Pb+aJe9DrudJ4jGbpRitkpayNphxQXRZIfKb8Yoi6MsPKADDlvxRGDvuC1l3klC5SVP5kOpigMSb+GVR3TAwQfhlY2iAODKrT0MMLgiKt85mCMdynGqwCyHcgRvtnMwh5x7eG7hPfeoewdzpEM5TinPcihHeRQPcFRooYxvdSmSBUquHGqwkgW2vvCgG673K/p1QWRZ9UgeHXLkQkkvrz7Acefw0BNariW/TN2VC+EUWTrbyo3TpaqVG5Y5mba1ckmBywnxQ52osav1FJyuSgopSkrZ/HpD6SV+4LATevgtt43+ph38H39B084KZW5kc3RyZWFtCmVuZG9iago4MiAwIG9iago8PC9QYXJlbnQgNzEgMCBSL1R5cGUvUGFnZS9Db250ZW50cyA4OSAwIFIvUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGL1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZUldL1hPYmplY3Q8PC9YZjE0IDkwIDAgUj4+Pj4vTWVkaWFCb3hbMCAwIDU5NS4zMiA4NDEuOTJdPj4KZW5kb2JqCjg5IDAgb2JqCjw8L0xlbmd0aCA1My9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQp4nCvkcgrhMjZTsDAw1bM0UghJ4XIN4QrkKlQwVDAAQgiZnKugH5FmaKLgkq8QyAUAEqwKvgplbmRzdHJlYW0KZW5kb2JqCjkwIDAgb2JqCjw8L1R5cGUvWE9iamVjdC9SZXNvdXJjZXM8PC9FeHRHU3RhdGU8PC9HUzggMzMgMCBSL0dTNyAzNCAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSV0vRm9udDw8L0YxIDM1IDAgUi9GMiAzNiAwIFIvRjMgMzcgMCBSL0Y0IDM4IDAgUi9GNiA3NSAwIFI+Pj4+L1N1YnR5cGUvRm9ybS9CQm94WzAgMCA1OTUuMzIgODQxLjkyXS9NYXRyaXhbMSAwIDAgMSAwIDBdL0Zvcm1UeXBlIDEvTGVuZ3RoIDQ1MzgvRmlsdGVyL0ZsYXRlRGVjb2RlPj5zdHJlYW0KeJy1XNuO5LiRfW+g/0EvBsYGRsUggzeg0ICuhhc2YGN6sQ8DP7Rne2bnwd3e2TIM//1G8KJUZpKSskY1MNxZKYoKHgZPnAhS+dT98vLzj59+eGmen5+6l5dPP/zP5/9uvn/qv768fP37X58+/vsfn5/+/Omnn798evn565en7/75txf+av769eXzLx8+NP04NP/7/p1oBf/nnIVGNNrrVsnGIbReNr98fv/uv37XfHn/rv/4/t3TDI1vPv74/h23FA39RTdLbDS0DpuPf6cmv//ONj/9H/Xa/BT+cumv379/9/03zW//2nz8j/fvJursL+/fHX54bCu9aoVv0LeIjW/puQCtwFW7Q43KI0n3XUYSBhDsbr5lK1Xz8YfvvwF1N4TXPlEJ2UooPrGE1F/C/5rpT0PTPP2Z5/xPwx/GRrxuIlUDotXmGgLlW+Mbq10rTbBINh9/aUSrBFCX/7qy8FmBHsQoegUghAYl0HRo6K9pFjCqUbgRPgA8S9d5haPhzzB6kGCmD1eDS2P67h+fvizDgqc/fvryU/PN5y/f/ud3v33dGGVhjMqa1uqDY7ydhTvw5XngAzkNYGNRtuYg+N6CwH5gUIuAXuxUJ9qpVavcUTuzIyivlBgl7k88vtHEA92h1UG7dydenzvxQjZW2laYWx54FkaMOHgPI844EIC0ioTttZCDCyvKKy+ttwIGH66hHskxpvh56qREELYD0fVD+G6UIxqn+DMizAJHRINd6At6L6wP/UpFaxqGCfppDA7G9+q+p+d0H7QQz9kANY19NjIucdPRjIdrqL3BkXiuN5Cv7XiqOQ/YFJss4YsFYMlGto8HHUH1Dlwvop16Zhrjz1rwCjMRoLFHBiV8ZmBWgPG9fF/4TPfyfeHzIE3AitiVLhgP3k8l4Hi2UEob0JdWLjcxetwwIEqNuWF8IhqaWiM6YePfzuVrTMgwynkHbXs62oZudPdoB0/QNBBnE8JqGQeNoleTHRaPoXbx+xhMwnhgOMAd7o24g0JWC7Yytl2u8KcHCePE4QgdgoTyvIZRaVrVshfWstcdABTE27LxsYHsIgxwPsQGj8Q3WqRI8Ar6V+fFzT4uRu3ESAufAA/+TtSZP6t5RvJnxT4PvZlpoYLslEFLK3oAJ4ceY7semAiC/xMZwAChP4rAAqTTcpSO1r9aiy1aUl6OEAiG+wEzU3tPZDLaA9Mt32i6tSBQD2K6P9tnqpk02yTexdHZ7gee7YXREtejMl72OsQC4edOaRfYjeXuQfTfSvpIdJxoHBvkPvwnax+GX6kcog8sNr8T1OBEDQFKMkEdN1DvGXdiyAXSsk4eNU5piYLcNTvqsZAKbxVTcwQ4ZHzFKa8t9SdYChvKBhxx2KPBX56ZnzvLhQbDdQO1O99o506gLa+WK+TkGck2lpJtEYnnYvBD0J2cXVOSpZ1pzZ0lrC6JxLs583eW5llxZ/2fc4aoVGerhOqjOh3FB7SWszF75Gah3cD1kqj7KUGa59AeEDSF9NBHbHcxKoTzvsOU5XVsQDA2G8H5AhpD0UdFzeFJZJDG0KIzSUOrHXaSJ4bWXBq0hHwBcuNY/EwcKi+IxDyURyK0NXvG4on+YVSr3drYTZ5HUlyEMiO8Z+SZ0ZLukL6K6Jict9OakRQ5aSU5mv0px4CY8HY9uBFjOraqLgRpOvbcT/Q16su7+FnbEbyItTzUhlPQZcF0qoufZ63Aek6QY6LsgPuP64Ge8S2Ig/mcNCcQkynqUd2irCC5T0xnxvBETJoMKhOTctBJawLO0nQT5cTqjnQoUViKCEp2iTyITPLySt+jciZfk32cFAC35BzSj7OY+lgeMiTbHYb8W04GxWhnMDrWGjSXlCJp8b1sZPhMhko/hXtQprJRiZhwlFY42R8lJnc+MSnfunvIYZgQp3kKRoX6Df09gst/S6U7KQ3mv7UevPCdjdlXvE/YhMAoffi7k2J9XVoY8xLi7/JzQlvKGuNS6biop0DFJQZKh74kTUos5Hm42ESzOUklyREyoGRzx/ccBfjEKkUGWGIh7D8zOHlwK4C7bGgGT9h5WAYoBw+UxhSBGpVd3Nx2RoKO+w7k3rxeootPijnpeClJnVH5KKlJsoM3IMrg7FKPOrnSwdRDIq2iicCqWczR/yjv7aG3eqEeZTBQT0kwLWVICpTh3w5mnFi/DBeHDB0MIJZysx9tFErEIbkGInrimejxmXvYEqFTVVVZ/XxAK6gTtaTypBX0GreTtII6UX2h1OxflcklWncE4/VcCDv0Gd+4mIhSGP999lAnSrHEHsi7qgXLDTGxQSOV6bOqXjOJwG6hQJkCEExCce0geqLuWXeCVJid6qad/qBTBzCZXM8ZAYdFHsXGhuQ8MVTqiOnlILXot6IW61oPFeT2qeXMskmkFlInNVVzDdMZj5TACr72yNU2F3mOzT6ORlF8pVk+3RyHW+YwgZ7+SJp3A7VHwpD2poiyM6NyiOTNQN4IjCv/gtIV33dqivt92pP0c2qhCOL5tO+fJCPlq6uSN+84RLkp+6UDykennJNyAqGM0mRF0pWpI06UzwYoM4uBkvDjYi6PQ85Tco19YFjq5jwry21JmWx2LdXP8X5v5iWkUUq+5P7HCMO+FWHQV+wxRUD2CeNETZ4JA01RMhJhxHp73DrldFRyPA3+7EijGFh0CcBFl8Cou7WzH6rN8Jaqjjkub8lwzrvUX9YPixvgFDfHqGHqiVqIGGQVyanwBS26q+W19ITzXv1Yna/TUQUvuAOdcAsEkUBXJidFUvP6nCTM8mp8uSVfoMzDZ9SEU0Y43W9OXcYglxRINxGtxLyJi/7MEgJtoh09MqWETlijYtxr5zZ5mcVDD+rqQfEhZH7YOuedhPVN28DjiYXcDDzoVhSAT5az1dFdDBwjCjyjkFsiCt5p4GhWNHiXKPD8Qq7yvsUCdJkoMNVPHVLqKJakJSywENCib5dyl7sDLLngS32qKR72wNFLKafo4Vot6UpwtNHO+XCMQIogKcXhYiwMJq6QiZZSN6RtWkHhTz6Qm6J6o2mmkNcqrIC7P81n1mPTNDvVuvI0Q0+hd4oQ0nQJhCl+nknfxDiwlOPD94UzSgvlO9kJ38s4TZRZ+iFqpVH5q34pxGcCD8SWp7kDs+TJZAuXQDP5Xd2fDmHxd1wePTjdb5UvoPNhuosg70/3+fmCMmG/qDbd96Lw3qiTt1eJ9CpGkbQdVdYjWkafC2e8uBw76uHW6YjSHdO6gliTQhjlUsNad4ZqOuS03Fcu9Y6sJlLRka4vQZAMo0R1WCKslDbUXHJk5A745j1Yzy+/UtAtqY48z4AqigsaNfYqyoBeTzyilH4PyyhpZMsRQzdoRm1VgZqKlSlPLN3bKNYmT2JteECR41vtNafqYBmcI7vg+q3qlnnalL2XAI1snQ/H4xv6b+/o7PmHtYpGpToDxKOdrOSL6cI+omcciiqKKuNbqNi+fwD5zENQFvlIdwXFWo33Viet86xcH+AMh4sHMSXy45XaD3tXKf/PZ1iFMyTS4sYj2nlcNDDvPUE6wkzTuXTkp56jNUfqWD/wUmh3ybt2UDy/bqkklJQpIeHCqZt1CsIjTyQ1Kitjqdz2I2gnS5AzeS0naD3oPOqLFqGOubaQDynjQPjnA8rs+TKU2C9Z1qGEeCWWc9qaJ3VJ2yiapZMJ6ek7wJ+4LZ6BF7qkFTME2ZMoqkuFqSzDtfkulni4dMUHY69DZYYpJJ9c5+oSo9hx7e81vPNk8SF46DWfFFzOcvA5rHi/dqj66PJ6tld9pWgnTIx2y5nwALOPi49DV3joDuTnH62X9G9BGgVPOxRH9VtVtpKgLBu4T67nV7akDfXgorQlLQM4xh1hh6TNnMvhKZMvssOZyzke6VKdCeYx7FSAixJp7tTyqseqkLWuhoSN0bR9EhzRCCBmidmPdNPBqXszCeSRJVAZsN2pMyeWaZK6kNq1vjJ1pFKX+q/1A/ECLAmBSbo7nNPQegmk0tKNJm6+rWUun9UWdloyR4FdnFNPQdHPsZLVTz4f9OEHAnYx1uGING1qKUTw6QAtcyWtzz7BNUqwZs7P4GfGvibN7TJhsSTee1PnRB1HyxSQkMbwbtkdnxDBBUBW2j8w4Y6BZ5adSBv5qn0UJXKVhw/kU8aIyySuJi5ONGmAwsQtE7K8ayW5QpnKnYojv4+ZoiXHGG0OW+F1gJwtksOwsyQiWcuL1f2kzgwpt8L9NLy98rM594BgmHRpW1tYXryVxICkE0gM1JUDHGIpc8aZ+rJ4V62t2L5PUucfoZcgWyiTFLkg0X3cV6P0mN8jiYJeSdJykWO4sHksHTJnnMkrIUq6vbWqMpAipPRQrtF4pOVpOFiAMK2UjSVEzOqZV9CvCkSHbt5OmygugJV8X+2Nt3y0N5Rq9tGtHbd/wNbyG2whtyvbWgQ3brlK9K3RYTdbkZMJSvQpNKsWa/CutqeO3LtxykaSDPANeHN/6p4Ls67oyrsA21p95Li15dfKbat02doavE/L7zf09EW4gWcZDT2daAUb0aIL/yfSrwn8+LvDTTzmJslXbhvxeMFu9pMgSU0SJLeNUMtWr7sR5GevapRGlmYgWLTgv7K4ej0+ZHWZH3LVIrNGnuu4mDQ2aFvpKi5t4d5JqjduvLyhdbjViMsKTOomyv/lCC2f99/341pV6qCJRZLwtmjiBj+QsGhB5afxBIkdNFcC4tDNGwwBoex4jyiObsqn4A8gWZMID5hXpATEFu1jaGoSFRBuoYXgHWkL3GJbu9IRR+7dOtNIa8dfx4f41thxHGvC4LhlJRgRVNGyY6y6cIriN7erLBdoZbtJiA2hica7BkqoVQO6ar2/7yY7VGyVHOquEaEl1dqcEldmTGOrhGmZdXd6ygjF2amzbu16HvpyPQz9ukka0qWLO2ZOpm60yNydR76sSrm5Quy9H9bv3FgfxnJRAjBskK/WB28dKyHKP7RwvT5q0u6oXUWSca5o1wbJIE2Y8je0tgXhStIduXfjTDKEk4kFEHOlav8XHmry7bhl8uZnmFC5olWPEYz2bVrxVYLZaJIX0dKkzB9pHV062qKG2Cq40x0xkJTzsPe4DOnSUYmu0sLdNimDFCenzjG16xme5XqdYy5d3HNMGvVGL2k0G53cJp6kQbTJGptbyut1dO29tfNZx3rbeJka+d1kkHjjwn6nEOHk62wo/zCU4UL3nRHPwOWqfHKGa4wwyrxpeGDF1w47/VrMpKB17wug7WfD8ZEa9ye8pi33e9owXCNvdN0bLlojfrN/RMDVzhMdN+rmp/Mc8HvpjyCZpVB81IquN9GsKsxDvW1EUeH5xdrXI1rbxnrMsJufB1Q6CN9HUE3UvzzuACXtqZKtvjYQ1a51tmA8EARHEK3tLj1i1g2eTregH8IzR8CHvNTvSZTXeikSYenSAETrj2Dqa9HnMcNu1RPyuwOHUS2rJ8Vls6yMQli+qWXFFpdS1lWblXyo9LIqikDK366urwQGrPXQTaOlHgArOXTd5iJDYC2H7holwQ+LQLtqsZIqdXtWkrdqz0XQ1M3JkxCnP6svjff6rN4iA7i0yNrqqlEC59JNklfrRnnomz2lYW12dKPUKFEybi0TNlZwrbZ2oKtdjSYE/0zsmhHF3u/HqVdYUP6RC2jVvQVBoOW9QH7tIh4qGeUxgeZrGudXoSWB1ogtwLWrzuLzdCGnvTZ7RwXVutnXZXcmH+Xnmrw5aFFZlD0AYCK4+JxaYeDa5B3hs9XVvhx7NZBVTXPcqrIWewTMSPLLs3ZJZ0fx1DvaV2H3nHNMhdGNv9aosgZ7AMcU5R5wShA7Qud1Xpnl12u9EkQtrDxgVll8HYWzLL4oiopKXWqVYwvXbO8kbvWzyiyF2yqgL31sFtBjq50C+sWcrSrZ0lW9SrZt00o812266JUNk9J8RDe4L4JdLsvNneHtBjEgy525rNlwuVx5xCVUyY1pXrov1PGWFnLPDUKbbSe4jOOukHdpIfecJD+o6iIb47m0qI/nsv6r44kOtDGcpUF9NAeaBKL4f37hyoAKZW5kc3RyZWFtCmVuZG9iago4MyAwIG9iago8PC9QYXJlbnQgNzEgMCBSL1R5cGUvUGFnZS9Db250ZW50cyA5MSAwIFIvUmVzb3VyY2VzPDwvUHJvY1NldFsvUERGL1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZUldL1hPYmplY3Q8PC9YZjE1IDkyIDAgUj4+Pj4vTWVkaWFCb3hbMCAwIDU5NS4zMiA4NDEuOTJdPj4KZW5kb2JqCjkxIDAgb2JqCjw8L0xlbmd0aCA1My9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQp4nCvkcgrhMjZTsDAw1bM0UghJ4XIN4QrkKlQwVDAAQgiZnKugH5FmaKrgkq8QyAUAErMKvwplbmRzdHJlYW0KZW5kb2JqCjkyIDAgb2JqCjw8L1R5cGUvWE9iamVjdC9SZXNvdXJjZXM8PC9FeHRHU3RhdGU8PC9HUzggMzMgMCBSL0dTNyAzNCAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSV0vRm9udDw8L0YxIDM1IDAgUi9GMiAzNiAwIFIvRjMgMzcgMCBSL0Y1IDc0IDAgUi9GNiA3NSAwIFI+Pj4+L1N1YnR5cGUvRm9ybS9CQm94WzAgMCA1OTUuMzIgODQxLjkyXS9NYXRyaXhbMSAwIDAgMSAwIDBdL0Zvcm1UeXBlIDEvTGVuZ3RoIDMzOTQvRmlsdGVyL0ZsYXRlRGVjb2RlPj5zdHJlYW0KeJy1W1uP3LYZfV9g/4NeCqwDrIb3C7BdQBpJQYoEcOBt+2DkwXVt1w+2U3eLov8+38eLRiORomZXG8S2hqTIw/NdeEjOHJrvj58/vnv/WN3dHZrHx3fv//Xhn9XbQ/vt8fHbl98ODcPh9btPn7++e/z87evhzX//8YhFw7dvjx++399XbXes/n19RWqC/xmjaUUqaWXNWWUErS2rvn+4vvr7D9XX66v24frqMNDKVg8fr6+wJangE7zMRCVpbUT18AWa/PhGV5/+A71Wn9wnEz79eH319qZ69Vv18Jfrqx46+/X6avPgvi2zvCa2ErYWorI1jEtpTcSk3aZG6ZmE904zcRNwuKtbRMmrh/dvb6hYTOGpI3LCakaTI6aY+tX9X/W/OKNRwWorKi0UGKCiRNWMVYzXgk0Hrg6v0Tl+Of7UVeRk8W0ve9Qc6mupzpBTYWpaaalrbebI76jsetK1rZBNd0/pneBSMxaepVX3ZxNz86kOb35/93VESg8/v/v6qbr58PX2r29ePQ02S8BmYBfKM7jnjDtgwcBgWiXjuFKkeD6bAMtMoNzRCngpapMj/eaQAD8DxZ8NahYwiqDbX8wmJ8JZwY8Hg1NSZlRkwG/rLM8qJxCw2UmQ2pI/lZmVu4CbJQcua/kUdiWvIZWexkxmhTP4Kgd/Q1crzEpTG52bAATiFmb1DtBmvBpZU3k5r4LwmtsLvdZk4G/rLM+tIKaW2Uls5NbuAu6cXcEhSV2aYQ+jjmmhwL2AmV6oSiu3ppJaGP8Xjv/xh231uFL4+rBSnLXArEd1voeYFX29FOe1HDg61UKVttbMm/jg900CjectwIkZn0IghC6boJ+PncxmIUBCWLqKI5ozj0NIVstVGOUW0SDeaVzVxGWmhOdbRFLHFm4y80aBtFM3iGXWKNKy2lOY1GpHc7XFWE3FVHlktBZNiK21d4tSi/PahnjyIktIRS2BP5yhsGLHVjxDcJUUVxl7UrJw5kJgBn6D0vLjBS2Sz6+0JLRy/ZRl1hzzBoFFSwqrhCatr7azF1OOH2eSuVcYLAmrtb7KsmqOfaOgoiVFtQVVWk9dwGbIveNYiYg/R10SUvmeyjJqjnvjIk9LCqqMKa2ftvMYF6BLvLIknJ7mlVE2PZXLkmK63CujXtrI5rlSGtdc8Ow1EeTr10RQrodxa+jqcyJofDsvgnyTNRF0gpAVQWMnGRG0gmPUtFkcUQ3kYUS6vZVHAbMgM1cf6RrrR1GyIOPURdQki8mu9BKmstLJTNYoa2qmNsgatpQ1q+8WZQ3F48OpriFS90KJATVM1C+kaY/4TAS38Ll3egf0zTZtwwraZsMEkjoB3lZ2OYOyuAkDFsUNK4ibbD9lcbMAvUHdsIK6KcJJq5sL+AvJJAy0aSFhBXmz2ldZ3izAb1xJWEHfbIKV1jeX8Onz6mmwksBhBYGz0lNZ4CS4FJu4LCicDaDSCucCJsPycpFnFiTOEz0zSpwns1nQOE/wzKhxtvKZFjmM1kqtiBxfvyZycj2MuzNXnxM549t5keObrImcE4SsyBk7yYicFRyjDM3iiMogDyPQHcycFTnZ+kDXqT4rciZd5ETOWi9+KmudzEWOFttEDk+InLV3SyJHGTUXObpRRBLlBIwTOe0GIcNLQqYMMpUxqCVuyZmj3CBk/IBFIcNLQibXT1HILEFvuQcrCZkSnKSQuYS/uMr7gTYtF7wkZNb6KgqZJfiNBzW8JGS2wEoKmYv4DCv9OFhJyPCSkMn3VBQyS+AbRSEvCZkyqKSQuYTJuMpf4pklIfM0zwxC5umeWRIyl3tmEDKb+UwKGWXd1VhWyIT6FSGT7WHciLn6jJA5vZ0VMqHJipCZQMgJmVMnaSGzhmPUmlkccfXPw4h0ezNHoSLZsgHP26NU71ZdXrJXFsLYIDPEuCDxNYOO3UeRNBlhbMOLRvdN1ox+mkfQWtOBYhtedIxxoIxjrM1nbJOfzxjf2fkE51mbTmySn025RchKJ2EpJsLyku/cJaUlhaamUoqj200vBs3R3N8KcUePVPsHy61/6DhUcX4naEddCadH34YweEtIPGLrXIHgPXdtoYT4JkI2rsR3AyV45+gba+pLiOHKv4X9cRH6mw45w4dt6VHg2NAvcQWSEpNqiyMZQn1//bELsEbErfRVctDxdenbKOJR0CPz+HjftZMqfP1o7bkG38FK4duRCuNYnVmpU01grPNTdHsBh7rtSZhHKBFceowcDz8dZZLpkwmKa6HI7RwumV967wBN+XJ+N+bVLWM35NUtJTfpxXoSFmy/sGCgGphMEO6crExUbmvwXKIY9Tp7QVRKOpyRI/bPGSCwrTmB8Fnr4b3PHRhqGGUuwMqE5fT/sz1LKry9mGN9e/PnEmFqR8IUxdugBQgXo+PmHaKTh1sJjEtClMFnTDGYXVxigc8Y8i7aw60G6Afm32kG1krj23BD24a4cuxn74TEJXFr8HJGODKmW0QBLsA5a90zoim7QW7r8lw3wMUctzALNyjGjdk3bkApKEZrLmZJZRCD7YU23pS0I7DauosrSZoe/ih/cdU3SRIneO2OeOENQRN4EWt0NdLINricRfyc9f34RaLBuzNtj7aAW+6oaZixtdUpn, "type": "2" }, "msg": "查询成功" } 前端解析代码:
getCarElectronicInfo({policyNo: this.policyNo}).then(res => { if(res.status == '0' && res.data) { if(res.data.type == '1') { //pdf链接 //window.open(res.data.result) window.location.href = res.data.result } else if(res.data.type == '2'){ // pdf二进制数据 let fileURL = null var blob = new Blob([res.data], {type: 'application/pdf'}) if (window.createObjectURL != undefined) { // basic fileURL = window.createObjectURL(blob); }else if (window.webkitURL !
关于52版本的火狐浏览器的安装问题,资源信息包含安装说明 资源地址https://download.csdn.net/download/baidu_41604826/79670376
日常问题总结: 1.attachEvent问题 解决
if (window.event) { window.attachEvent('onload',function(){ }) }else { window.addEventListener('onload',function(){ }) }
做项目的时候,遇到在一个组件中上传了图片,跳转到其他组件,依然需要用到该图片信息;
项目中我利用了vuex 进行状态管理,刚开始我是把上传的图片用fileReader的方式把上传的图片变成base64格式,然后存在vuex中,代码如下:
getBase64(img, callback) { const reader = new FileReader(); reader.addEventListener("load", () => callback(reader.result)); reader.readAsDataURL(img); }, 这时候就遇到第一个问题:上传大像素图片后,base64占用的空间大小几乎是图片的2倍,vuex存的方式用的是localstorage存的,无法存储超过5m的数据。
解决方法:用canvas的方式把图片压缩再获取被压缩后图片的base64格式;代码如下:
getBase64(file) { // console.log(file) this.fileList = [file]; let _this = this; let img = document.createElement('img'); let cvs = document.createElement('canvas'); // let file = me.files[0]; // 获取到文件对象 // 上传的图片大于 500KB 时才压缩 if (file && (file.size / 1024 > 500)) { let reader = new FileReader(); reader.readAsDataURL(file); // 转成 base64 编码 reader.onload = function (e) { let naturalBase64 = e.
我这里是通过传给后端视频文件地址请求后端接口,后端返回给我对应文件的二进制文件流;
然后我是选择用blob的方式进行处理二进制文件流
在这一步遇到的问题是:mp4和flv对应的blob的type是什么?
到网上找了好久才然后还问了同事,最后找到:
flv: "flv-application/octet-stream",
mp4: "video/mpeg4",
然后接着处理文件流:
这里遇到第二个问题: 下载下来的文件是没有带.flv 或者 .mp4的后缀的!
刚开始我还以为依然是blob的type不对,亦或者是代码写的有问题 导致下载的文件不对,最后尝试手动给下载的文件加.flv、.mp4的后缀,然后一看文件竟然可以正常打开和播放!
备注:
1.这里加后缀是利用我传给后端的文件地址进行判断是flv格式 还是 mp4格式的
2.type不等于flv或者mp4时 处理的是图片下载
目录
一、环境概况
二、安装
三、集成测试
参考资料
由于以前公司自己集成了一个浏览器供客户使用,而原来的浏览器使用的是IWebBrowser2的技术,而IWebBrowser2技术支持的IE框架只能到ie11,但由于现在新的js框架横行,而且加上windows放弃了IE浏览器,而有的客户项目中需要向下去兼容框架版本,导致很多没有必要的麻烦。因此集成新的chromium内核版本的浏览器势在必行。
经过长时间的资料查询,在webview2技术没有出现之前,一直考虑的是libcef。但libcef太臃肿,一直想尝试而没有开始动,再加上最新的win11系统虽然摒弃掉了ie11,但IWebBrowser2控件还保留,因此也没有进行替换。
去年都一直关注WebView2技术,但当时只是预览版本,没有经过测试。但现在WebView2已经成了正式版本,更新到了1.0.1083,对应的Edge浏览器版本为:98.0.1108.50。因此就来进行尝试替换一下IWebBrowser控件。该系列文章主要记录替换过程中出现的问题以及使用到的webbview2的相关代码。
由于集成IWebBrowser2技术使用的开发语言是C++,因此替换成WebView2控件时,也继续使用C++。
一、环境概况 我目前windows的版本是Win10。 如下图所示:
我使用的VS的IDE是用的VS2022(安利一下VS2022,编译代码不再受到 4GB 内存的限制,很好用)。版本如下图所示: WebView2的相关简介以及环境支持,可以详见官方文档:Microsoft Edge WebView2 简介 - Microsoft Edge Development | Microsoft Docs。
二、安装 安装WebView2有两种方式:
1、直接去WebView2 - Microsoft Edge Developer网站下载独立安装程序,这个适合于后续产品发布时去使用。
2、开发环境,直接导入对应的开发包,可以详见官网(不在进行叙述): Win32 应用中的 WebView2 入门 - Microsoft Edge Development | Microsoft Docs
由于我使用的是开发环境,因此使用第二种方法导入的,而网站上放了详细的demo,具体的集成测试就不在详细叙述了。
三、集成测试 C++集成测试,我建议详细查看这个https://github.com/MicrosoftEdge/WebView2Samples/tree/master/SampleApps/,有详细的接口说明,我后续只是记录一下我使用的大部分接口,真的,比IWebBrowser2技术集成好了很多。
参考资料 1、 Win32 应用中的 WebView2 入门 - Microsoft Edge Development | Microsoft Docs
2、WebView2 Win32 C++ Reference | Microsoft Docs 3、WebView2 Win32 C++ Reference | Microsoft DocsMicrosoft Edge WebView2 简介 - Microsoft Edge Development | Microsoft DocsWebView2 Win32 C++ Reference | Microsoft Docs
22年1月算法笔记
文章目录 RE&&WA错误排列组合Scanner特殊符号printf大小写字母转换数据类型的转化integer.toString和String.valueOf的区别 char类型转化为int类型char转化为Strng String与int互相转换Int----->String(4种方法)String---->Int (2种) 设置小数点位数 && 有效数字方法一:String.foramt("%.f",d)方法二:使用DecimalFormat类方法三:方法四:浮点型强制转型(int)等于向下取整 格式化数字“001”科学计数法算数平方根数组集合排序基本数据类型的默认值:sort(一)给数组{2,3,1,5}按自小到大排序(二)把数组从大到小排序 Sort对数组升序降序 集合集合反转 数组标法记某个数出现的次数把ArrayList转换成普通数组大数字精度问题BigInteger、BigDecimal 字符串删除字符串 求最大公约数检测代码运行时间求最小值质数判断&&数字反转数字反转2质数判断数字反转 Math类的常用方法HashSet不重复集合Map遍历方法Map综合利用求集合出现最多次数 截取字符串&&替换字符串substring() 方法截取v字符串 替换字符串中的片段替换字符串中的一个字符拆分字符串split()split() 方法根据匹配给定的正则表达式来 字符串反转&&字符串拆分判断字符串开头结尾indexOf函数两种用法计算某字符串中特定字符串出现次数的几种算法利用indexOf()方法出现次数 = (原字符串长度 - 替换后字符串长度) / 目标子串长度indexOf()方法 搭配 subString()方法 在指定位置拼接和插入字符串末尾插入位置插入字符后插入 String [StringBuffer](https://so.csdn.net/so/search?q=StringBuffer&spm=1001.2101.3001.7020) StringBuilder 转换正则正则表达式中的 .*? 或 .*+ 或.* HashSet不重复集合 标题算法学习前的初步了解java知识集合学习Maphashmap遍历 1.随机数2.转义符3.substring() 方法截取v字符串4.判断两个对象是否等价5.随机数控制概率6.toCharArray() 获取字符串的每个字符7.BigInterger操作大数8.Math类的常用方法9.HashSet不重复集合10.长度不固定数组11.把ArrayList数组转换成普通数组12.替换字符串中的片段13.替换字符串中的一个字符14、科学计数法15、split() 方法根据匹配给定的正则表达式来拆分字符串16、将数值转化为字符串17、测试运行时间18、compareTo()方法比较字符串19、hasNextInt()判断控制台是否输入数字20、char型数字转为int型21、Scanner资源关闭22、array排列数组23、String与int互相转换Int----->String(4种方法)String---->Int (2种) 24、Calendar 的用法25、indexOf() 方法26、scanner接受char类型字符27、正则表达式匹配字符串28、答案输出为txt文件(简化try/catch)29、进制转换30、java.util.Collections.ncopies()方法31、String.join()拼装字符串32、String.contains()用法34、两次回车结束运行 算法方法1.二分法查找2.冒泡排序查找 Typora加超链接实现页内跳转的三种方法_AZZJXHDSGIRL的博客-CSDN博客_typora超链接怎么用
RE&&WA错误 1.数组开太小
2.数组开太大
3.出现了除以0
4.算法不够优化
排列组合 有顺序用排列
无顺序用组合
Scanner String num = sc.nextLine(); String[] arr = num.split(" "); 以空格为分割,存到数组中 特殊符号 0为false 1为true
1、ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告.
方法:清除旧的公钥信息
-f 是文件名,-r 删除。
如何安装adb包
第一种方法:
下载adb包
链接:https://pan.baidu.com/s/1vv37epgVcybckuN02CmJJw 提取码:shy7
,解压此文件到D盘 解压完成后,部署环境,搜索栏中搜环境变量,点击编辑
点击环境变量,点击Path,在变量值里加上刚才adb解压的路径,每个路径要用英文字母下的分号 ; 区分开,添加好后确认保存。
验证adb是否能使用
打开cmd命令窗口,输入adb version
如图所示,能看到adb版本号,表示安装成功
第二种方法:
解压好adb包后,直接在文件路径中输入cmd
缺点:每次要使用adb都要在此路径输入cmd
声明:本文只作学习研究,禁止用于非法用途,否则后果自负。如果侵权到了您的权益,请立即联系我删除!
前言 这是一个群友发的需求,返回的m3u8数据是加密的,本着互帮互助的原则,顺手就给他弄了,也写(水)篇文章。
目标网站:
抓包 老规矩,先抓个包看看。
可以看到,m3u8这个包里的data是加密的,接下来咱们就搞它。
寻找加密位置 像这种响应数据是加密的,可以通过搜索.decrypt或者.decyrpt(这种字眼去定位加密的位置,这次也是比较幸运,搜出来的结果比较少,很容易就找到对应的位置了。
这个n.data.data就是之前的密文。
加密逻辑分析 还原数据的语句:
r = xxtea.toString(xxtea.decrypt(n.data.data, xxtea.toBytes(i + sectionID))) 这个i是一串hash值,通过以下代码生成:
e = new Rusha t = sectionID + "icq" i = e.digest(t).substr(0, 32) 把Rusha方法扣出来即可。
然后再分别把xxtea.decrypt和xxtea.toString扣出来,没什么难的,缺什么就扣什么。
值得一提的是,需要用到atob方法,可以用Buffer.from替代:
var atob = function(a){ return Buffer.from(a, 'base64').toString('binary') } 运行效果如下:
写完了,好像有点短😂
Love & Peace,下回见。
1.变量的本质 变量本质上就是代表一个“可操作的存储空间”,空间位置是确定的,但是里面放的值不确定。可通过变量名访问“对应的存储空间”,从而操纵这个“存储空间”存储的值。java是一种强制性语言,每个变量都必须声明其数据类型,变量的数据类型决定了变量占据存储空间的大小。 1.1,使用变量时应注意 使用变量注意:
Java 中每个变量必须先声明,后使用;使用变量名来访问这块区域的数据;变量的作用域:其定义所在的一对{ }内;变量只有在其作用域内才有效;同一个作用域内,不能定义重名的变量; 1.2,声明变量 语法:<数据类型> <变量名称>例如:int var; 1.3、变量的赋值 语法:<变量名称> = <值>
例如:var = 10;
2.基本数据类型 变量的分类-按数据类型 2.1整数类型:byte、short、int、long
类型 占用存储空间 表数范围
byte 1字节 -128 ~ 127
short 2字节 -2^15~ 2^15-1
int 4字节 -2^31~ 2^31-1 (约21亿)
long 8字节 -2^63~ 2^63-1
2.2浮点类型:float、double
float:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求。
double:双精度,精度是float的两倍。通常采用此类型。
2.3字符类型:char
char 型数据用来表示通常意义上“字符”(2字节)Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。字符型变量的三种表现形式:字符常量是用单引号(‘ ’)括起来的单个字符。例如:char c1 = ‘a’; char c2 = ‘中’; char c3 = ‘9’;
2.4布尔型:boolean//① 只能取两个值之一:true 、false//② 常常在条件判断、循环结构中使用 按照数据类型来分: 基本数据类型:
整型:byte \ short \ int \ long
在mybatis中使用注解
但是没有什么用 当修改注入的参数依旧 实际执行的SQL依然不变
解决方案是配置xml文件(好像只能同时使用一个拦截器)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="useGeneratedKeys" value="true"/> <setting name="useColumnLabel" value="true"/> <!--<setting name="mapUnderscoreToCamelCase" value="true"/>--> <setting name="logPrefix" value="mybatis.sql."/> <!-- 打开延迟加载的全局开关 --> <setting name="lazyLoadingEnabled" value="true" /> <setting name="aggressiveLazyLoading" value="false" /> <setting name="mapUnderscoreToCamelCase" value="false" /> </settings> <!--<typeAliases>--> <!--<typeAlias alias="user" type="com.gaolian.business.oldservice.bean.User"/>--> <!--</typeAliases>--> <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.kdy.common.util.MybatisInterceptor"> <!-- 设置数据库类型Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库 --> </plugin> <!-- <plugin interceptor="com.kdy.common.pagehelper.PageInterceptor">--> <!-- <!– 设置数据库类型Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库 –>--> <!-- </plugin>--> </plugins> </configuration>
本地存储
重新理解:
LocalStorage 只能存储字符串格式
如果你存储的是对象,你需要用JSON.stringify(包裹)
然后取这个存储的字符串的时候,如果你取只能取到字符串
所以你需要把字符串弄成对象,需要用 JSON.parse()
//读取本地存储的数据 function getData() { var data = localStorage.getItem('todolist'); if (data != null) { // 本地存储里面的数据是字符串格式的,但我们需要的是对象格式 return JSON.parse(data); } else { return []; } } //保存本地存储数据 function saveData(data) { localStorage.setItem('todolist', JSON.stringify(data)); } // 3.删除操作 $('ol,ul').on('click', 'a', function () { // 先获取本地存储 var data = getData(); // 删除数据 var index = $(this).attr('id'); // console.log(index); data.splice(index, 1); // 保存到本地存储 saveData(data); // 重新渲染页面 load(); }) function load() { var todoCount = 0;//正在进行的个数 var doneCount = 0;//已经完成的个数 // 先读取本地存储数据 var data = getData(); console.
Spark作为一个分布式计算框架,可以很好的适用于Hadoop。那么Spark是否可以与关系型数据库较好的进行兼容呢?以Spark作为计算,以关系型数据库(例如Oracle)作为存储?
答案当然是可以,笔者经过不断地测试和优化,终于将Spark与Oracle进行了兼容匹配与读写优化。
1、环境准备
在本次测试环境中,用6台机器搭建了CDH的Hadoop平台,Spark2.2版本搭配Yarn进行资源分配。
Spark通常采用JDBC来读写Oracle,所以在Spark环境下需要确保包含了JDBC包。笔者下载了ojdbc7.jar,放置在spark2的lib/spark2/jars目录下,避免每次spark2-submit指定jar包。
2、PySpark读写Oracle的基本代码
PySpark读取Oracle数据表的常规代码案例如下
ods_bdz = spark.read.format(“jdbc”)
.option(“url”, “jdbc:oracle:thin:@”+dbstring)
.option(“dbtable”, “ODS_BDZ”)
.option(“user”, dbuser)
.option(“password”, dbpasswd)
.load()
代码实现的功能是将数据库中的ODS_BDZ的表读取到名为ods_bdz的Dataframe中。其中dbstring为数据库连接字符串、dbuser为数据库用户名、dbpasswd为数据库用户对应的密码,具体的值根据你读取的数据库来填写。
如果ODS_BDZ的数据量比较小,这种获取方式是可行的。如果ODS_BDZ的数据量达到了百万级、千万级或更多,这种方式的效率就会很低。
PySpark写入数据到Oracle的常规代码案例如下
ods_bdz.write.jdbc(“jdbc:oracle:thin:@”+dbstring,
‘ODS_BDZ’,
‘append’,
{‘user’:dbuser,‘password’:dbpasswd,‘driver’:‘oracle.jdbc.driver.OracleDriver’}
)
以上实现的功能是将ods_bdz这个Dataframe中的数据以append的方式追加到表ODS_BDZ。
3、基于分区键的读优化
如果ODS_BDZ这个表有一个数值的字段,叫PART_NUM,数值范围为1-20,那么我们可以优化成如下代码:
ods_bdz = spark.read.format(“jdbc”)
.option(“url”, “jdbc:oracle:thin:@”+dbstring)
.option(“dbtable”, “ods_bdz”)
.option(“user”, dbuser)
.option(“password”, dbpasswd)
.option(“numPartitions”, 20)
.option(“partitionColumn”, “part_num”)
.option(“lowerBound”, 1)
.option(“upperBound”, 21)
.load()
这样子在oracle数据里面就会生成20条SQL:
Select * from ods_bdz where part_num<2;
Select * from ods_bdz where part_num<3 and part_num>=2;
Select * from ods_bdz where part_num<4 and part_num>=3;
PCIe总线规定了两个复位方式:conventional Reset和FLR(FunctionLevel Reset),而Conventional Reset由进一步分为两大类:Fundamental Reset和Non-Fundamental Reset。Fundamental Reset方式包括Cold和Warm Reset方式,可以将PCIe将设备中的绝大多数内部寄存器和内部状态都恢复成初始值;而Non-FundamentalReset方式为Hot Reset方式。
1.1 传统复位方式(conventional)
传统的复位方式分为Cold、Warm和Hot Reset。PCIe设备可以根据当前的设备的运行状态选择合适的复位方式,PCIe总线提供多种复位方式的主要原因是减小PCIe设备的复位延时。其中传统复位方式的延时大于FLR方式。使用传统复位方式时,Cold Reset使用的时间最长,而Hot Reset使用的时间最短。
1.2 Cold Reset
当一个PCIe设备的Vcc电源上电后,处理器系统将置该设备的PERST#信号为有效,此时将引发PCIe设备的复位方式,这种方式属于Fundamental Reset。PCIe设备进行Clod Reset时,所有使用Vcc进行供电的寄存器和PCIe端口逻辑将无条件进入初始状态。但是使用这种方式依然无法复用使用Vaux(备用电源)供电的寄存器和逻辑,这些寄存器和逻辑只能在处理器完全掉电时彻底复位。
1.3 Warm Reset
在PCIe的设备完成上电后,也可能重新进行Fundamental Reset,这种复位方式也被称为Warm Reset。PCIe并没有定义WarmReset的具体实现方式。
1.4 Hot Reset
当PCIe设备出现某种异常时,可以使用软件手段对该设备进行复位。如系统软件将Bridge Control Register 的Secondary Bus Reset位置为1,该桥片将secondary总线上的PCI/PCIe设备进行Hot Reset。CPIe总线将通过TS1和TS2序列对下游设备进行Hot Reset。
在TS1和TS2序列中包含一个Hot Reset位。当下游设备收到一个TS1和TS2序列,而且Hot Reset位为1时,下游设备将使用HotReset方式进行复位操作。
HotReset方式并不属于FundamentalReset。PCIe设备进行Hot Reset方式时,也可以将PCIe设备的多数寄存器和状态恢复为初始值。
同时,在PCIe总线中,如果需要对链路的Link Width进行改变时,也将会用到Hot Reset。具体的流程如下:
1. Ensurethe Link is in the L0 LTSSM state
2. Program the 6-bit “Link Mode Enable” field of the “Port LinkControl Register” on page 732.
一、首先在虚拟机中调整硬盘容量
二、在linux系统中进行配置
1、查看硬盘:fdisk -l
[root@localhost .ssh]# fdisk -l Disk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000ccdc8 Device Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 41943039 19921920 8e Linux LVM Disk /dev/mapper/centos-root: 18.
vue启动警告问题 记录一个vue启动报错的问题(vue启动的时候会提示一个警告错误): fsevents的是兼容在ios上面的模块,提示的时候可以使用命令:npm fund 定位问题,npm audit fix 再次定位,如果不行把package-lock.json删除,再用npm install初始化后npm run dev启动就ok了。 npm WARN deprecated fsevents@1.2.13: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.3.1 (node_modules\watchpack\node_modules\chokidar\node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {“os”:“darwin”,“arch”:“any”} (current: {“os”:“win32”,“arch”:“x64”})
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.
1. springboot启动过程中,首先会收集需要加载的bean的定义,作为BeanDefinition对象,添加到BeanFactory中去。
由于BeanFactory中只有getBean之类获取bean对象的方法,所以将将BeanDefinition添加到BeanFactory中,是通过BeanDefinitionRegistry接口的void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;方法来完成的。
所以我们的BeanFactory的实现类如果需要具备通过beanName来返回bean对象和添加删除BeanDefinition的能力,至少实现BeanFactory和BeanDefinitionRegistry的这两个接口。
这里我们就来看看springboot是如何查找bean的定义,添加到BeanFactory中的。
由于我们这里只是关注查找bean对象的定义,所以这里我们这里提到的BeanFactory主要会关注BeanDefinitionRegistry这个接口。
我们本地主要分析springboot扫描加载bean的配置,和我们的代码关系不大,所以我们的代码就用最简单的吧。具体代码如下:
package com.example.bootargs; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class BootargsApplication { public static void main(String[] args) { SpringApplication.run(BootargsApplication.class, args); } } 后面提到的主类统一是com.example.bootargs.BootargsApplication
2. Springboot 查找bean的定义主要是通过ConfigurationClassPostProcessor这个类来完成的。
ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor接口。BeanDefinitionRegistryPostProcessor接口就是通过postProcessBeanDefinitionRegistry方法来给BeanDefinitionRegistry的实现类来添加bean的定义。
BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口,而BeanFactoryPostProcessor接口主要是用来对BeanFactory进行增强。在springboot启动过程中首先会创建BeanFactory,再调用BeanFactoryPostProcessor对BeanFactory
进行增强,最后才会去创建bean对象。
通过BeanFactoryPostProcessor对BeanFactory进行增强,主要是通过PostProcessorRegistrationDelegate的静态方法来完成的。在这过程中就会调用到ConfigurationClassPostProcessor这个类。
由于ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor接口,PostProcessorRegistrationDelegate就会调用ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法中,就会调用到processConfigBeanDefinitions方法来查找bean的定义。我们就从这里作为入口来看吧。
3. 下面我们就去看看ConfigurationClassPostProcessor的processConfigBeanDefinitions方法
/** * Build and validate a configuration model based on the registry of * {@link Configuration} classes. */ public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) { List<BeanDefinitionHolder> configCandidates = new ArrayList<>(); String[] candidateNames = registry.
使用宏定义程序段可以在头文件中定义程序段而不会有multiple definition的错误。
例子:
#define DLT_INITIALIZER(...) \ do { \ dlt_with_session_id(1); \ dlt_with_timestamp(1); \ dlt_with_ecu_id(1); \ dlt_verbose_mode(); \ DLT_REGISTER_APP(DLT_LOG_APP_ID, "Test Application for Logging"); \ DLT_REGISTER_CONTEXT(dlt_context, __CLASS_NAME__, "Context for Debug"); \ } while (0)
物理层 如何连接到网络?
用网线,光纤。
数据链路层 链接了如何传输信息?发送0或者1的电信号。
如何知道发给谁?网卡 MAC全球唯一地址。以太网传输协议,规定一组电信号为一帧,协议头和数据,标头记录了发送者mac地址和接收者mac地址,通过原始的广播方式发送给其他内网的计算机,其它计算机判断接收方mac地址和自己是否一致,如果一致就可以接收消息。
网络层 如何将消息发送到外网计算机上?
原始的广播方式消耗大,这时就引入ip协议,这个时候计算机会判断是给内网的计算机数据还是外网的,如果是内网则会采用广播方式,否则采用ip路由方式。
传输层 接收到数据,计算机有这么多程序,到底交给谁处理? 如qq,qq浏览器,这是计算机安排了端口,一台计算机有0~65535多个端口,其中0~1023是系统占用。
会话层 建立,管理,终止连接。
表示层 加密数据编码的转换。
应用层 FTP,HTTP
自从换了苹果M1之后,一开始写Java,oracle装不了不说了,好像plsql装起来也没有意义,大概率不能装plsql。
后来因为工作变动转写C#,公司的环境一大堆exe软件,把我弄的很头疼。所以干脆出手了M1,是8+512的,买的时候花了七千多好像,加老电脑2015MacBook Air抵了2000,所以总共花了应该是小一万。然后apple store里面5200出的,总之来说是亏的,毕竟还是9成新。
紧接着京东下单联想小新Air15,不知道为什么win11的系统用起来格外清切,可能因为底部菜单和苹果风格类似吧,玩了7年苹果电脑,到最后还是觉得各有各的优点,要不是工作需要应该不会把自己的M1置换成windows,当然小新的风扇是我不满意的,但是价格在那里了也不多说什么了。可能有的人问我为什么不选择全都要,我只想说结婚后的成年男人由不得自己。
京东下单买了电脑后发现系统是家庭版,因为公司的软件家庭版装不了,所以又斥巨资808购买了专业版,然而头疼的事情发生了,居然升级失败报错,此时我心里一万个草泥马飞过。几经周折微软客服帮我远程更改了产品密钥,终于升级成win11专业版。
总之M1搞开发,我劝你慎用。买来玩玩,编辑视屏还可以。搞代码、日常办公还是windows吧。
扩展运算符(spread)是三个点(…)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。
关于 扩展运算符的一些简单的使用
第一种
将数组转化为数值
第二种
合并多个数组
第三种
克隆数组
js 中的 ‘=’ 不是在内存中重新开辟一个内存存放,而是复制内存路径 所以更改数组数据是会发生问题,se6中可以使用扩展运算符来实现 数组的克隆
普通的 = 复制 是浅拷贝 而使用扩展运算符是深拷贝
第四种
结合结构复制
这种方式的扩展运算符只能发在最后一个参数,不然会报错
在vue2中我们已经使用过provide和inject来实现祖孙组件之间的数据传递,但是在vue3中由于我们使用setup,此时我们应该如何去使用provide和inject函数呢?
在vue中帮我们提供了provide和inject的函数,我们可以直接在setup函数中使用即可。
一、provide和inject的基本使用
如上图所示,此时我们将一个普通对象进行传递,然后在Home组件中通过inject函数来接收。
我们也可以通过ref和reactive进行传递。
上面代码我们可以看出在Home.vue文件中可以更改App.vue通过provide传递过去的数据,但是在一些情况下,我们是不允许的,此时我们可以采用readonly来进行设置。
如果我们确实希望改变父组件的数据,此时我们可以在父组件中设置方法,通过provide将该方法传递给子组件,保证数据是数据提供的位置进行修改。
一、镜像的导出和导入 1.镜像的保存 [root@k8s-master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ae513a47849c 2 months ago 109MB debian jessie 4eb8376dc2a3 2 months ago 127MB rabbitmq 3.6.8 8cdcbee37f62 15 months ago 179MB [root@k8s-master tmp]# docker save ae513a47849c > nginx-save.tar [root@k8s-master tmp]# ls -lh total 108M -rw-r--r-- 1 root root 108M Jul 4 09:32 nginx-save.tar 第二种写法: docker save -o nginx-save.tar ae513a47849c 2.镜像的导入 可以将导出的nginx-save.tar包传到需要的docker主机上面,然后执行导入命令.
[root@k8s-master tmp]# ls -lh total 108M -rw-r--r-- 1 root root 108M Jul 4 09:32 nginx-save.
前言 最近换工作了,开发的是Oculus Quest2,百度搜相关的开发流程,得到的回答太少了,趁大家都还是摸着石头开发,我先出个开发流程小样儿,后续会持续更新一段时间关于这方面的,敬请期待。话不多说,开搞。这里的Unity版本是Unity 2019.4.21f1c1(LTS)
分步指南
1.设置正确的Unity版本
2.添加模块
3.将XR相关的Unity软件包添加到您的项目中
4.项目构建设置
5.创建一个快速场景
6. Android工具和侧载时间
7.准备好手机和Quest
步骤1.设置正确的Unity版本 Unity通过创建新版本来不断更新和改进其软件。为了选择我们需要的版本,您需要执行一些步骤:
下载Unity Hub
无论您使用的是免费版还是付费版,都需要创建一个许可证才能使用Unity。
点击个人资料图标旁边右上角的齿轮图标。
导航到“许可证管理”,然后单击蓝色的“激活新许可证”按钮。
在弹出的窗口中,选择将要使用的适当许可证。(不多说明)
安装Unity Hub后,您可以下载Unity。从安装中,选择正确的Unity版本:
使用Unity Hub中的“安装”选项卡查找并选择您要使用的版本:
注意:要支持XR Interaction Toolkit(即VR功能),必须是2019.4或更高版本。
理想情况下,选择具有长期支持(LTS)的版本。这里是2019.4.21f1c1。
步骤2.添加模块 “安装”选项卡下,将以下模块添加到您的Unity版本中:
如果这是您第一次使用Unity,则需要添加``Microsoft Visual Studio 2019’’; 这是一个非常不错的集成开发环境(IDE),用于在Unity中使用C#进行编码(大多数Unity开发人员使用)。
由于Oculus Quest在技术上是Android设备,因此您需要选中“ Android Build Support”复选框(Quest在自定义版本的Android 7上运行,而Quest 2在Android 10上运行。)
步骤3.将XR相关的Unity软件包添加到您的项目中 注意:添加XR所需的Unity软件包将是您对每个新的Oculus Quest项目重复的过程。随着时间的流逝,您将习惯它。
从Unity Hub创建一个新的Unity项目。
确保将项目保存在以后可以找到的地方。
对于“模板”,在3D,带有Extras的3D和Universal Render Pipeline之间进行选择的细节过于详尽,无法在本文中进行解释。但是,我们可以告诉您,尽管两者都适用于入门级VR项目,但“通用渲染管线”具有更优化的图形(随着您进一步进入VR开发,您将学到欣赏)。
选择“通用渲染管道”。
选择后,点击“创建”按钮。
现在您的项目已创建并打开,使用Unity的“包管理器”将几个与VR相关的包导入到您的项目中:
在左上角的下拉菜单中,找到“Window > Package Manager”,然后打开“Package Manager”。
出现“软件包管理器”窗口后,您可以滚动列表或在搜索栏中键入以查找软件包。
在包管理器中,单击“Advanced> Show Preview Packages”。
现在,使用窗口右下角的“安装”按钮查找并安装这三个软件包:
“ XR Interaction Toolkit”软件包
1、将需要等长的网络,创建一个组 match group...
2、设置规则条件
0 mil:120 mil 复制黏贴即可:
3、设置等长参考对象
3.1 set TARGET
4. analyze 分析网络
4.1 选择MGRP,右击analyze,右则显示黄色(分析规则不完整?)
5、建立拓扑仿真模型 sigxplorer
5.1 sigxplorer 窗口 设置规则 5.2 设置网络模型端点,及等长规则,add...
5.3 add 后。。。点击OK;
5.4 更新模型,否则不能生效。 5.5 模型更新后,规则检查器就有眉目了(更新了)
原来的网络,没有REPP属性,建立模型后,好了。。。
5.6 接下来,调整红色(不合格)网络长度,就可以了;规则检查表会实时更新。
php中::(双冒号)是什么意思?和PHP中的->有什么区别
PHP中的:: (双冒号)是一种内置的语法解析符号,又叫做“范围解析操作符”。
:: 通常是用来访问静态成员的,也就是说可以不用实例化对象直接使用
class Test{
public static $test = 1;
public static function test(){
}
}
Test::$test; //获取$test属性的值bai static 静态的
Test::test(); //调用静态方法test()
PHP中的->是用于引用类实例的方法和属性
class Test{
function add(){return $this->var++;}
var $var = 0;
}
$a = new Test; //实例化对象名称
echo $a->add();
echo $a->var;
总结:
PHP中 :: 和->的区别是 ::用来访问静态方法和属性,
->访问实例化后的方法和属性
题目描述 输入三个自然数 N,i,j(1≤i≤n,1≤j≤n),输出在一个 N×N 格的棋盘中(行列均从 1 开始编号),与格子(i,j) 同行、同列、同一对角线的所有格子的位置。
如:n=4,i=2,j=3表示了棋盘中的第二行第三列的格子,
当 n=4,i=2,j=3 时,输出的结果是:
(2,1)(2,2)(2,3)(2,4) 同一行上格子的位置。
(1,3)(2,3)(3,3)(4,3) 同一列上格子的位置。
(1,2)(2,3)(3,4) 左上到右下对角线上的格子的位置。
(4,1)(3,2)(2,3)(1,4)左下到右上对角线上的格子的位置。
输入格式 一行,三个自然数 N,i,j,相邻两个数之间用单个空格隔开 (1≤N≤10)。
输出格式 第一行:从左到右输出同一行格子位置;
第二行:从上到下输出同一列格子位置;
第三行:从左上到右下输出同一对角线格子位置;
第四行:从左下到右上输出同一对角线格子位置。
其中每个格子位置用如下格式输出:(x,y),x 为行号,y 为列号,采用英文标点,中间无空格。相邻两个格子位置之间用单个空格隔开。
#include<stdio.h> main() { int n,x,y; int i,j; scanf("%d%d%d",&n,&x,&y); for(i=1;i<=n;i++) { printf("(%d,%d) ",x,i); } printf("\n"); for(i=1;i<=n;i++) { printf("(%d,%d) ",i,y); } printf("\n"); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i-j==x-y) printf("(%d,%d) ",i,j); } } printf("\n"); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i+j==x+y) printf("(%d,%d) ",j,i); } } printf("
<template> <div id="dicom_canvas" ref='dicom_canvas'></div> </template> <script> import * as cornerstone from 'cornerstone-core' import * as dicomParser from 'dicom-parser' import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader' export default { data() { return { ImageId: "", loaded: false } }, props: { Select_url: { type: [String, Number], default: "", //默认值为空现在测试阶段 }, }, mounted() { var element = document.getElementById('dicom_canvas'); cornerstone.enable(element); cornerstoneWADOImageLoader.external.dicomParser = dicomParser cornerstoneWADOImageLoader.external.cornerstone = cornerstone; cornerstoneWADOImageLoader.configure({ beforeSend: function(xhr) { // Add custom headers here (e.
pymongo之find_one_and_update原子性操作(管道操作) 为什么要使用原子性操作
众所周知大家在面临高并发的时候操作数据库需要确保数据的原子性,为什么要确保数据的原子性呢,因为如果不确保数据的原子性就会出现脏读,脏写
的现象,这些现象会导致数据库里面的数据变得更加混乱,我在使用mongodb的find_one_and_update的时候遇到了一些比较尴尬的问题,就是在查询的时候
某些字段是不能当作查询条件的,但是在做更新或写入操作的时候这些字段又要更具不同的判断条件去写入不同的值,所以这时候就陷入一个很大的问题,
find_one_and_update提供的逻辑运算符中是没有if判断的,但是不巧的是mongodb 官方给find_ond_and_update 提高了聚合的管道操作,这就使得
find_one_and_update 可以使用聚合查询的运算符,但是官方文档并没有给出一个详细的操作案例,下面的代码是使用find_one_and_update操作的时候
使用了if判断来对不同的字段在不同的条件下设置不同的值的操作。
getattr(mg_db_write, 'table_name').find_one_and_update( {"user_id": user_id, "product_id": product_id, "appid": appid, "valid": True}, [{ "$set":{ "earn_end_time":{ "$cond": [ {"$gt": [ get_datetime_last_day(), {"$add": ["$earn_end_time",30*24*60*60]} ] }, get_datetime_last_day(), {"$add": ["$earn_end_time",30*24*60*60]} ] }, "redeemed_bonus_count":{ "$cond":[ { "$ifNull":["$redeemed_bonus_count",None] },{"$add": ["$redeemed_bonus_count",0]},0 ] }, "create_time":{ "$cond":[ { "$ifNull":["$create_time",None] },"$create_time",get_now_datetime() ] }, "earn_bonus_count":{ "$cond":[ { "$ifNull":["$earn_bonus_count",None] },{"$add": ["$earn_bonus_count",earn_bonus_count]},earn_bonus_count ] }, }, }, ], upsert = True )
有一学生成绩表,包括学号、姓名、3门课程成绩。请实现如下删除功能:输入一个学生的学号,删除该学生的所有信息。
输入格式: 首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个学号num。
输出格式: 若要删除的学号不存在,则输出error!;否则,输出删除该学生后的所有记录。
样例">输入样哩: 在这里给出一组输入。例如:
3 202016040201 Zhangling 78 95 55 202016040202Wangli 87 99 88 202016040203 Fangfang 68 76 75 202016040201 输出样例: 在这里给出相应的输出。例如:
202016040202 Wangli 87 99 88 202016040203 Fangfang 68 76 75 #include<stdio.h> #include<string.h> struct student { char ID[20]; char name[30]; int a,b,c; }; int main() { int n,i,m=0,j=0,q=0; scanf("%d",&n); struct student stu[n]; for(i=0;i<n;i++) { scanf("%s %s %d %d %d",stu[i].ID,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c); } char num[20]; scanf("%s",num); for(i=0;i<n;i++) { if(strcmp(stu[i].
操作前提条件:系统已经安装go
项目代码:
hello.go
//package hello package main func main() { println("hello golang!") } 方法1:直接终端运行.go文件
命令:go run hello.go
方法2:编译.go文件后,终端运行.exe文件
编译后会产生一个 .exe编译文件,可直接运行
方法3:golang编辑器中运行
注意golang中运行需要保证golang已经设置GOROOT.
1、Linux下执行shell脚本报错如下: 2、原因: 是Windows和Linux的.sh脚本文件格式不同,如果在脚本中有空行,脚本是在Windows下进行编辑之后上传到linux上去执行的话,就会出现这个问题。
windows 下的换行符是\r\n,而 linux 下的换行符是\n,没有识别/r,所以会导致上述的报错,这个属于脚本编码的问题。
3、解决方法:(运行以下命令即可修改该脚本格式) 在start.sh对应脚本目录下,执行以下命令即可。
vim start.sh :set ff=unix :wq 保存退出后,恢复到原先步骤,继续执行原来的脚本命令即可。例如 ./start.sh start
4、命令行解释: # 用vim编辑器打开文件,open、edit(E)、recover、delete
根据提示选择首字母进入文件编辑状态(键盘E),
vim start.sh 直接输入:冒号后,命令行会自动跳至最后一行进行编辑
#转换格式,设置脚本格式为Linux形式。
:set ff=unix #保存文件并退出,w写入q退出。
:wq -------------------------------------------------------以下无正文--------------------
注:仅供学习,记录问题和参考,共勉!
这里直接是安装和演示的过程,概念理论部分自行到官网学习,就不再赘述了。
Ingress 介绍:https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
一、k8s 安装 ingress-nginx 下载 Ingress-nginx yaml文件
[root@k8s-master01 ingress-nginx]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml [root@k8s-master01 ingress-nginx]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml [root@k8s-master01 ingress-nginx]# ls mandatory.yaml service-nodeport.yaml mandatory.yaml下载后需要添加hostNetwork: true,否则无法通过 K8s 节点 IP 地址绑定域名外部访问。
ingress-controller 会直接使用 K8s 物理机的 DNS 来解析域名,而不再使用 K8s 内部的 DNS 来解析域名。
mandatory.yaml配置修改如下:
... apiVersion: apps/v1 kind: Deployment metadata: name: nginx-ingress-controller namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx template: metadata: labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx annotations: prometheus.
1、关于GD32 Flash GD32 flash官方称为FMC。
2、关于GD32L233CCT6 flash 本次使用的GD32L233CCT6 flash大小为256k;
可以看出,分为64页,从0-63页,每页大小为4kb;
手册上说,支持32位整字和16位半字编程,但是库函数只有整字编程。
3、代码实现 #define FLASH_PAGE_SIZE 0x1000 //4k void FlashWrite(uint16_t len,uint8_t *data,uint32_t addr_start) { uint16_t i=0; uint32_t temp=0; uint32_t addr=addr_start; fmc_state_enum fmc_state=FMC_READY; fmc_unlock(); for(i=0;i<len/4;i++) { temp = (data[0]<<0)+(data[1]<<8)+(data[2]<<16)+(data[3]<<24); fmc_state=fmc_word_program(addr, temp); if(fmc_state!=FMC_READY) { return; } fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR); data += 4; addr += 4; } if((len % 4)==3) { temp = (data[0]<<0)+(data[1]<<8)+(data[2]<<16); temp = temp | 0xff000000; fmc_state=fmc_word_program(addr,temp); fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR); } else { if((len % 4)==2) { temp = (data[0]<<0)+(data[1]<<8); temp = temp | 0xffff0000; fmc_state=fmc_word_program(addr,temp); fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR); } else { if((len % 4)==1) { temp = (data[0]<<0); temp = temp | 0xffffff00 ; fmc_state=fmc_word_program(addr,temp); fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR); } } } fmc_lock(); } void FlashRead(uint16_t len,uint8_t *outdata,uint32_t addr_start) { uint32_t addr; uint16_t i; addr = addr_start; for(i=0;i<len;i++) { *outdata = *(uint8_t*) addr; addr = addr + 1; outdata++; } } void FlashErase(uint32_t start, uint32_t end) { uint32_t EraseCounter; fmc_state_enum fmc_state=FMC_READY; /* unlock the flash program/erase controller */ fmc_unlock(); /* clear all pending flags */ fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR); /* erase the flash pages */ while(start < end) { EraseCounter = start/FLASH_PAGE_SIZE; fmc_state=fmc_page_erase(EraseCounter*FLASH_PAGE_SIZE); if(fmc_state!
技术出现背景 NAT技术的出现主要是为了解决IPV4地址枯竭的问题,回想下上一篇,学过了几种主流接入Internet的方式,但是这几种方式都是配置在防火墙上面,防火墙访问外网没问题,但是下面的终端设备呢?不管是DHCP还是PPPOE拨号都只有一个可以上网的地址分配下来,而固定专线可能有几个,对于一个局域网几十台、几百台终端设备的场景显然可上网地址就不够用了,就需要利用NAT技术了。NAT技术里面分为两大类,这一篇我们来讲解源NAT技术,也就是解决局域网下多个终端通过一个或者数个可上网地址来复用共享上网。
案例中了解源NAT实现原理
接口部分的配置
dhcp enable
#
interfaceGigabitEthernet1/0/1
undo shutdown
ip address 192.168.11.254 255.255.255.0
service-manage http permit
service-manage https permit
service-manage ping permit
service-manage ssh permit
dhcp select interface
dhcp server ip-range 192.168.11.1192.168.11.250
dhcp server gateway-list 192.168.11.254
dhcp server dns-list 223.5.5.5 114.114.114.114
#
interfaceGigabitEthernet1/0/2
undo shutdown ip address 192.168.12.254 255.255.255.0
service-manage http permit
service-manage https permit
service-manage ping permit
service-manage ssh permit
dhcp select interface
dhcp server ip-range 192.168.12.1192.168.12.200
 列:被称为字段(colum) 每个字段应该包括哪些属性?
字段名数组类型相关约束 SQL语句分类 DQL(数据查询语言):查询语句,凡是select语句都是DQL。DML(数据操作语言):insert delete update,对表当中的数据进行增删改。DDL(数据定义语言):create drop alert,对表结构的增删改。TCL(事务控制语言):commit提交事务,rollback回滚事务(TCL中的T是Transation)。DCL(数据控制语言):grant授权、revoke撤销权限等。 在DOS窗口下使用的一些命令 登录mysql:mysql -u用户名 -p密码查看数据有哪些数据库:show databases; (这个不是SQL语句,是MySQL的命令)创建自己的数据库:create database 数据库名使用某个数据库:use 数据库名;(这个不是SQL语句,是MySQL的命令)查看当前数据库有哪些表格:show tables;(这个不是SQL语句,是MySQL的命令)dos执行.sql文件:source 文件路径查看某个表的结构:desc 表名;\c命令:结束一条语句exit退出mysqlselect version(); 查看mysql的版本号select database(); 查看当前使用的是哪个数据库 查询语句 简单的查询语句(DQL) 语法格式:
select 字段1,字段2,字段3,… from 表名;
提示:
1、任何一条sql语句以“;”结尾
2、sql语句不区分大小写
3、字段可以参数数学运算
4、给查询结果的列重命名:select ename, sal * 12 as 别名(中文要用品哪个单引号包起来) from 表名(as关键字可以省略)
条件查询 语法格式:
select 字段,字段… from 表名 where 条件;
执行顺序:先from,然后where,最后select
条件查询字符表
运算符说明=等于<>或!=不等于<小于<=小于等于>大于>=大于等于between … and …两个值之间,等同于>= and <=is null为null(is not null 不为空)and并且or或者in包含,相当于多个or(not in 不在这个范围中)notnot 可以去非,主要用在is 或 in 中likelike称为模糊查询,支持%(代表任意多个字符)或下划线(_代表任意1个字符)匹配 数据排序(升序、降序) 语法:
如果Force Push为灰色不能点击,设置操作如下。
CF链接
官方题解
EM水题略过
B.Reverse Game 当时推了个奇怪的结论过了,如果按照逆序对进行考虑题目就十分简单(因为是翻转操作)
I. Modulo Permutations 题目大意:给出 n n n,求在 n ! n! n!种排列中,有多少种排列满足所有的 i i i满足 p i + 1 % p i < = 2 p_{i+1}\%p_i<=2 pi+1%pi<=2(环形排列) n < = 1 e 6 n<=1e6 n<=1e6 观察发现:可以把数组分为两段,一段从1开始,一段从2开始。每一段都要满足后一个数%前一个数<=2
例如:n=8的一种情况: [ 1 , 3 , 5 , 7 ] , [ 2 , 4 , 6 , 8 ] [1,3,5,7],[2,4,6,8] [1,3,5,7],[2,4,6,8],合并为 [ 1 , 3 , 5 , 7 , 2 , 4 , 6 , 8 ] [1,3,5,7,2,4,6,8] [1,3,5,7,2,4,6,8]即为合法答案
flink新版本无bat启动文件的解决办法 下载或复制老版本的放在bin目录下即可 下载或复制老版本的放在bin目录下即可 https://download.csdn.net/download/popi2268/80472654
如:函数
原始图像为M*N,缩小后图像大小要求为m*n,则须要将图像划分为(M*N)/(m*n)大小的互不相交的小块,计算小块的平均值,该值做为缩小图像对应的像素值。atom
以下图:spa
咱们把16*16的图像缩小成4*4的图像:code
最后对应的值以下:
在Opencv里面图片缩放函数以下图片
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
前两个参数分别为输入和输出图像。dsize表示输出图像的大小,若是为0,则
ci
dsize=Size(round(fx∗src.cols),round(fy∗src.rows))dsize=Size(round(fx∗src.cols),round(fy∗src.rows))
dsize和fx、fy不能同时为0。fx、fy是沿x轴和y轴的缩放系数;默认取0时,计算以下
fx=(double)dsize.width/src.colsfx=(double)dsize.width/src.cols
fy=(double)dsize.height/src.rowsfy=(double)dsize.height/src.rows
/
在实现图像窗口展示的时候,经常出现图像过大或过小而无法有效的展示全图,opencv提供了cvResize()和resize()两个函数进行相应的缩放操作
默认图片的坐标
1、cvResize:函数原形
CVAPI(void) cvResize( const CvArr* src, CvArr* dst,
int interpolation CV_DEFAULT( CV_INTER_LINEAR ));
其中interpolation 为修改、插补的方法,取值如下:
·CV_INTER_NN - 最近-邻居插补
·CV_INTER_LINEAR - 双线性插值(默认方法)
·CV_INTER_AREA - 像素面积相关重采样。当缩小图像时,该方法可以避免波纹的出现。当放大图像时,类似于方法CV_INTER_NN。
·CV_INTER_CUBIC - 双三次插值。
示例:
<pre name="code" class="cpp">int main()
{
IplImage *src = cvLoadImage("1.jpg");
IplImage *dst;
CvSize size;
无法登录谷歌账号,提示次浏览器或应用可能不安全 无法登陆 此浏览器或应用可能不安全。 请尝试使用其他浏览器。如果您使用的是受支持的浏览器,则可以刷新屏幕,然后重新尝试登录。
解决方法:
方法1.找到浏览器的设置,在其中搜索JavaScript,打开JavaScript方法2.关闭所有扩展插件,再打开谷歌浏览器,登录谷歌账号方法3.关掉Google浏览器,在Google安装目录下,打开chrome_proxy.exe就可以登录
1、信号槽基本概念 所谓信号槽,实际就是观察者模式_百度百科 (baidu.com)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。(这里提一句,Qt 的信号槽使用了额外的处理来实现 ,并不是 GoF 经典的观察者模式的实现方式。)
信号和槽是Qt特有的信息传输机制,是Qt设计程序的重要基础,它可以让互不干扰的对象建立一种联系。
槽的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数几乎没有区别,它可以是虚函数;也可以被重载;可以是公有的、保护的、私有的、也可以被其他C++成员函数调用。唯一区别的是:槽可以与信号连接在一起,每当和槽连接的信号被发射的时候,就会调用这个槽。
信号槽是基于Object类型的,Object是Qt的核心类,
C++ ——Qt的信号和槽的详解 - 简书 (jianshu.com)
2、信号槽使用方法 参考Qt的信号槽基本用法总结_hanxiaoyong_的博客-CSDN博客
3、Qt信号槽的实现 任何实现信号槽或者属性的对象,都必须包含Q_OBJECT宏,且在源文件上运行Meta Object Complier(moc工具),才可生成Class_moc.cpp文件,Class_moc.cpp文件会将特定信号与特定的槽函数关联起来,后面会讲解Class_moc.cpp文件。另:在任何定义的QObject的所有子类中都应添加Q_OBJECT宏。Q_OBJECT的官方定义如下:
The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.
Q_OBJECT宏必须出现在声明自己的信号和槽或使用Qt元对象系统提供的其他服务的类定义的私有部分中。注:基于Object类,且包含Q_OBJECT的宏,通过moc工具会生成Class_moc.cpp文件。
打开qobjectdefs.h头文件,可以看到Q_OBJECT宏内容如下:
/* qmake ignore Q_OBJECT */
#define Q_OBJECT \
public: \
QT_WARNING_PUSH \
Q_OBJECT_NO_OVERRIDE_WARNING \
static const QMetaObject staticMetaObject; \
SQL大小写规范和 sql_mode 一、SQL大小写规范1、Windows和Linux平台区别2、Linux下大小写规则设置3、SQL编写建议 二、sql_mode的合理设置(了解即可,一般不动)1、 宽松模式 vs 严格模式2、模式查看和设置 一、SQL大小写规范 1、Windows和Linux平台区别 在 SQL 中,关键字和函数名是不用区分字母大小写的,比如 SELECT、WHERE、ORDER、GROUP BY 等关键字,以及 ABS、MOD、ROUND、MAX 等函数名。
不过在 SQL 中,你还是要确定大小写的规范,因为在 Linux 和 Windows 环境下,你可能会遇到不同的大小写问题。 windows系统默认大小写不敏感 ,但是linux系统是大小写敏感的。
通过如下命令查看
SHOW VARIABLES LIKE '%lower_case_table_names%' Windows系统下:
Linux系统下:
lower_case_table_names参数值的设置: 默认为0,大小写敏感。设置1,大小写不敏感。创建的表,数据库都是以小写形式存放在磁盘上,对于sql语句都是转换为小写对表和数据库进行查找。设置2,创建的表和数据库依据语句上格式存放,凡是查找都是转换为小写进行 两个平台上SQL大小写的区别具体来说: 下面这个记住
MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
1、数据库名、表名、表的别名、变量名是严格区分大小写的;
2、关键字、函数名称在 SQL 中不区分大小写;
3、列名(或字段名)与列的别名(或字段别名)在所有的情况下均是忽略大小写的;
MySQL在Windows的环境下全部不区分大小写
2、Linux下大小写规则设置 当想设置为大小写不敏感时,要在 my.cnf 这个配置文件[mysqld] 中加入
lower_case_table_names=1 ,然后重启服务器。
但是要在重启数据库实例之前就需要将原来的数据库和表转换为小写,否则将找不到数据库名。
此参数适用于MySQL5.7。在MySQL 8下禁止在重新启动 MySQL 服务时将lower_case_table_names 设置成不同于初始化 MySQL 服务时设置的lower_case_table_names 值。
如果非要将MySQL8设置为大小写不敏感,具体步骤为:
1、停止MySQL服务 2、删除数据目录,即删除 /var/lib/mysql 目录 3、在MySQL配置文件( /etc/my.cnf )中添加 lower_case_table_names=1 4、启动MySQL服务 3、SQL编写建议 1.
有一学生成绩表,包括学号、姓名、3门课程成绩。请实现如下查找功能:输入一个学生的姓名,输出该学生学号、姓名、3门课程成绩
输入格式: 首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个姓名name。
输出格式: 若姓名name存在,输出所有该姓名学生的学号、姓名、3门课程成绩;若该姓名不存在,则输出Not Found。
输入样例: 在这里给出一组输入。例如:
3 202016010101 Hanmeimei 89 78 95 202016040201 Lilei 85 87 99 202016040202 Hanmeimei 85 68 76 Hanmeimei 输出样例: 在这里给出相应的输出。例如:
202016010101 Hanmeimei 89 78 95 202016040202 Hanmeimei 85 68 76 代码: #include<stdio.h> #include<string.h> struct student { char ID[20]; char name[30]; int a,b,c; }; int main() { int n,i,p,k,h=0; scanf("%d",&n); struct student stu[n]; for(i=0;i<n;i++) { scanf("%s %s %d %d %d",stu[i].ID,stu[i].name,&stu[i].a,&stu[i].b,&stu[i].c); } char name2[30]; scanf("
新手navicat登录oracle的常见问题 1:ORA-12541:TNS:无监听程序 问题的解决办法就是,在登录界面中填写主机信息,如果是本机登录是填写localhost或者127.0.0.1
2:使用sys用户登录显示,ORA-01017:用户名/口令无效;登录被拒绝 解决办法是,在登录界面,选择高级–>选择角色–>选择sysdba【默认是default】
点击测试连接,结果连接成功【不要忘记填写主机地址】
3:登录后之前的查询文件不见了 解决办法是查看oracle的文件存储位置,然后在我的计算机中找到该位置
点击你上一次的登录名称,进入文件夹内部
选择后缀为.sql的文件,将其复制到你当前登录的账户下就行了
放图很难受,调不好位置所以就不放了。
注意: 登录后之前的查询文件不见了,想要在登录的账户下恢复上一次登录的账户的查询文件前提是,你得查询文件已经在上次保存过了。再说,看到navicat的用户文件保存你可能看懂了,navicat的登录界面的连接名称就是你的文件名称,如果不填写连接名称,它会使用主机名+端口号+服务名的方式进行用户文件夹的创建。
对于会用的人来说没毛病,但是新手是会踩坑的,就比如我。一旦第一次登录没有输入连接名称,第二次登录时,虽然登录的是oracle的同一个用户,但是之前在navicat的查询文件会找不到。oracle可不提供查询文件的保存,不然还要可视化软件干嘛。
oracle的同一个用户,但是之前在navicat的查询文件会找不到。oracle可不提供查询文件的保存,不然还要可视化软件干嘛。
连接名称是随便输入的,但是不能是不同oracle账户使用同一个连接名称,同一个oracle账户也可以使用多个连接名称,但是没必要。连接与操作是可视化工具navicat的功能,与oracle的用户信息无关。
说明: 本文是郭霖《第一行代码-第3版》的读书笔记
6.1 广播机制简介 Android中的广播分为两种类型:标准广播和有序广播。
标准广播:完全异步执行的广播,在广播发出后,所有的BroadcastReceiver几乎会在同一时刻接收到该广播,因此是无序的,效率会比较高
有序广播:是一种同步执行的广播,在广播发出后,同一时刻只有一个BroadcastReceiver接收到这条广播消息,当这个BroadcastReceiver中的逻辑执行完毕后,才能继续传给其他接收者,此时的BroadcastReceiver是有先后顺序的,优先级高的先收到消息,并且前面的还可以截断正在传递的广播
同步和异步的区别:同步是阻塞模式,异步是非阻塞模式。在操作系统中,
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
6.2 接收系统广播 Android中内置了许多系统级别的广播,我们可以在应用程序中监听这些广播来得到系统的状态信息,例如手机开机会发送一条广播,电池的电量发生变化会发送广播、系统时间改变也会发出广播,若想接收这些广播,需要使用BroadcastReceiver。
我们可以通过自由地注册BroadcastReceiver的方式自由地选择要接收哪些广播,注册的方式分为两种:
在代码中注册,也称为动态注册在AndroidManifest.xml中注册,也称为静态注册 6.2.1 动态注册监听时间变化 要创建一个BroadcastReceiver,只需新建一个类,让他继承自BroadcastReceiver并重写父类的onReceive()方法就可以了。感觉很像Qt里的信号槽的机制。触发事件然后接收。
class MainActivity : AppCompatActivity() { lateinit var timeChangeReceiver: TimeChangeReceiver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //注册接收器 val intentFilter = IntentFilter() intentFilter.addAction("android.intent.action.TIME_TICK") timeChangeReceiver = TimeChangeReceiver() registerReceiver(timeChangeReceiver, intentFilter) } override fun onDestroy() { super.onDestroy() unregisterReceiver(timeChangeReceiver) } inner class TimeChangeReceiver: BroadcastReceiver() { override fun onReceive(p0: Context?, p1: Intent?) { Toast.makeText(p0, "Time has changed.", Toast.
将一台Redis服务器的数据复制到其他Redis服务器上,前者称为主节点(master),后者称为从节点(slave),主节点用来写入数据,从节点用来读取数据,数据的复制是单向的,只能从主节点到从节点,每个主节点可以有多个从节点,一个从节点只能有一个主节点
每一台Redis服务器启动的时候,默认都是主节点
主从复制策略: 全量同步(slave初始化阶段) slave连接master,发送sync命令master接收到sync命令后,执行bgsave生成rdb文件master的bgsave命令结束后,向所有slave发送rdb文件快照,发送期间所有写命令存到缓冲区slave收到文件快照以后,替换旧的文件快照,并载入数据master完成rdb文件传输以后,把缓冲区中的所有写命令发送给slaveslave完成数据载入接收到master请求,并执行写操作master每执行一个写操作,就会给slave发送写命令,slave接收到并执行写命令 增量同步(初始化完成之后) master为复制流维护了一个内存缓冲区,里面存放着复制偏移量和master run id,当slave重新连接master,如果master run id一样并且复制偏移量有效,就会从上次复制的地方继续开始,如果有一个条件不满足,就会进行完全重新同步
配置步骤 1.官网下载安装包 https://redis.io/ 此实例用的是 redis-5.0.8.tar.gz
2.上传到Linux服务器,并进行解压解压安装包 tar -zxvf redis-5.0.8.tar.gz
3.Redis默认不是后台启动,修改属性设置默认为后台启动 4.复制多个配置文件做主从模式配置(单机主从需要修改,多台机器配置忽略) 5.修改配置文件(单机主从需要修改,多台机器配置忽略) 端口号修改pid文件名字修改log日志文件名字修改dump.rdb文件名字修改 6.主从配置 开启主从配置以后,从节点只能进行数据读取,不能写入
命令行模式配置主从复制 配置命令: slaveof host port
命令行配置从机重新启动配置会失效
配置文件配置 7.哨兵模式Sentinel 新建一个文件名为sentinel.conf并设置内容,要监听的主机,端口号,数字1代表主机挂了,从机进行投票选举新的主机
启动哨兵
将6380停止,故障自动转移,6379升级为master,当6380再次上线,成为6379的slave
实现18 层的深度残差网络 ResNet18,并在 CIFAR10 图片数据集上训练与测试。标准的 ResNet18 接受输入为224 × 224 大小的图片数据,我们将 ResNet18 进行适量调整,使得它输入大小为32 × 32,输出维度为 10。调整后的 ResNet18 网络结构如图:
一、数据集加载以及数据集预处理 def preprocess(x, y): # 将数据映射到-1~1 x = 2 * tf.cast(x, dtype=tf.float32) / 255. - 1 y = tf.cast(y, dtype=tf.int32) # 类型转换 return x, y (x, y), (x_test, y_test) = load.load_data() # 加载数据集 y = tf.squeeze(y, axis=1) # 删除不必要的维度 y_test = tf.squeeze(y_test, axis=1) # 删除不必要的维度 print(x.shape, y.shape, x_test.shape, y_test.shape) train_db = tf.data.Dataset.from_tensor_slices((x, y)) # 构建训练集 # 随机打散,预处理,批量化 train_db = train_db.
参考的 步进电机S(SigMoid)曲线加减速【查表法】_Renjiankun的博客-CSDN博客_步进电机s曲线
自己用C#花了大半天搞了一个,直接copy生成的数组使用;
源码可下载步进电机生成S曲线上位机-嵌入式文档类资源-CSDN下载
目录
1.什么是cookie
2.cookie免密登录
3.cookie的优缺点
1.什么是cookie Cookie是服务器发送到用户浏览器并保持在本地的一小块信息,他会在浏览器下次向服务器发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器。
2.cookie免密登录 登录界面login.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> </head> <body onload="get()"> <form action="/JiuYueServices/login" method="get"> 用户名:<input type="text" name="username"/> 密码:<input type="text" name="password"/> <input type="submit" value="登录"> </form> </body> <script> function get(){ var flge = getCookie("flge"); if(flge!=""){ alert("欢迎再次访问"); } } function getCookie(cname){ var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i<ca.length; i++) { var c = ca[i].trim(); if (c.
给新生的软件网站工具推荐 目录 前言Windows基本使用学习打字练习网站Keybr Windows10基本操作所用Windows版本: Windows10教育版 1909一、键盘键位基本按键及快捷键键盘按键快捷键基本快捷键常用快捷键 二、常用功能截图(必会)1. PrtSc键(全屏截图)2. Alt + Prt Sc快捷键3. 截图工具3. 截图和草图5. QQ自带截图6. 输入法截图功能7. 截图软件 屏幕键盘剪贴板 软件工具自行搜索 推荐软件分类一、日常必备软件1. WPS Office(办公软件)Windows系统自带的OfficeWPS会员免费获取 2. 新版Microsoft Edge浏览器(推荐)3. 谷歌浏览器Chorme4. everything(文件搜索工具,十分推荐)5. Snipaste(截图贴图工具,十分推荐)6. bandizip(压缩包工具)7. Geek Uninstaller(卸载工具)8. Visual Studio Code(代码编辑器)9. Notepad++ 二、推荐工具工具箱(多工具集合)1. Quicker2. uTools3. 图吧工具箱 录屏工具1. GifCam(Gif录制工具)2. ScreenToGif(Gif录制工具) 压缩工具docsmall(在线) P图工具图片去水印1. Inpaint PDF工具APP1. 扫描全能王 Windows应用1. WPS Office2. Adobe Acrobat DC3. PDF Element(万兴PDF)4. 福昕高级PDF编辑器 在线工具1. I love PDF(在线PDF处理)2. 超级PDF(在线PDF处理)3. PDF Converter 提升效率工具1. Ditto(剪切板管理器) 文件管理工具1. TreeSize(磁盘空间占用分析工具)2. QTTabBar(文件资源管理器插件) 任务管理1. Process Explorer 论文工具1.
关于springboot集成swagger使用@EnableSwagger2爆红(报错问题),我发现是版本问题
报错时使用的版本
1.
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.3</version> 2.
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>3.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>3.0.0</version> </dependency> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.tang</groupId> <artifactId>swagger-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>swagger-demo</name> <description>swagger-demo</description> <properties> <java.version>11</java.version> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>3.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>3.0.0</version> </dependency> 然后发现编译时使用
@EnableSwagger2会报错 然后我决定使用狂神说视频里的版本
1.
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.7.RELEASE</version> 2.
<!-- https://mvnrepository.
文章目录 前言一、什么是人工智能?“自适应机器学习”(adaptive machine learning),即AML“老式人工智能”(Good Old-fashioned AI),简称GOFAI图灵测试哲学争论 二、巨型拼图之谜“巨型拼图”——人脑的思维过程智能行为 三、知识与行为超越刺激与反应知识与信念意向立场智能行为 四、真智能还是假智能问题导入图灵测试-谈话机器人回归GOFAI 五、有经验的学习与没有经验的学习我们如何学习词语?我们如何超越经验? 六、书本智慧与市井智慧书本智慧书本中的市井智慧 七、长尾理论与培训的界限长尾现象带来的难题如何处理突发事件无意识与有意识 八、符号与符号处理符号的逻辑运算 九、基于知识的系统符号知识表示假说知识表示和推理 十、人工智能技术应用人工智能的未来自动化是好是坏?超越智能与奇点真正的风险 总结 前言 注意:该科普书籍主要介绍‘老式人工智能’,并不是当今人工智能学习主流。
附:本文主要作为个人学习笔记,且是第一次写博客,并不专业,请多谅解。
一、什么是人工智能? “自适应机器学习”(adaptive machine learning),即AML 设计理念:让计算机系统通过对大量数据进行分析,掌握智能行为方式(关键词——大数据) 吴恩达:“你将海量数据输入程序,让数据说话,让软件自动从数据中学习。”(关键词——无监督的自动学习数据) AML的成功因素:
1、拥有可供分析处理的海量数据;
2、掌握功能强大的能够处理这些数据的计算技术;
3、高速计算机 “老式人工智能”(Good Old-fashioned AI),简称GOFAI 发展愿景:不致力于分析海量数据,而是专注于常识。(补充:‘愿景’是因为现在的潮流是机器学习即AML,所以该理念一直都没能实现,只能称为愿景) 麦卡锡:“如果一款程序可以根据已知信息和指令,自主推断由此可能导致的各种直接结果,我们就说这款程序具有常识” 注:AML和GOFAI都需要学习经验,但强调重点不同:AML——数据;GOFAI——语言。
图灵测试 为什么人类语言在老式人工智能领域有举足轻重的作用?
1、利用先前通过语言获得的信息解决新问题、新情况;
2、语言是研究智能行为的绝佳媒介。 图灵在论文中建议:我们应该将注意力从如何制造机器、机器外观如何以及其内部结构如何运转等方面转移到可观察的外部行为上。 由此↑↑↑ 推出了“图灵测试”
图灵测试的几个方面
1、实验依据——语言是测试智力的终极手段;
2、测试关键——对话可以涉及任何话题;
3、探讨目的——机器能像具有思考能力的人一样运行吗? 哲学争论 理论依据——《中文房间理论》(在此不做详细介绍) 哲学家约翰·瑟尔(John Searle)提出,理解(思维或智能)的内涵远大于可观察的外部行为,即便这种行为可以与所谓的模仿游戏一样涉及范围较大。 本书作者批驳此观点的理由是:
1、无法证明瑟尔在记下这本手册的同时未掌握汉语;
2、根据所需知识量和难度,根本不可能存在这种手册 二、巨型拼图之谜 “巨型拼图”——人脑的思维过程 在对人脑的思维过程的研究途中,各个不同领域的科学家都提出了他们自己的见解 我们需要关注语言,因为心智需要通过语言来明确表达观点。我们需要关注心理学,即人的思维方式是什么,以及人与其他动物相比有何异同。我们需要关注神经学,即大脑如何形成心智。我们需要关注进化论,即人类这一物种在进化的压力下如何继续发展。… 但是这些观点,都只能称之为拼图碎片,而我们在面对人脑思维这个复杂巨大的谜团时,妄图把一个拼图碎片当整体是不行的,所以我们应该承认我们仅仅是在处理拼图的一部分,并尽己所能去发现要如何与其他碎片有效组合。为参考方便,把拼图的几个拼块混称为整个拼图的错误称为“巨型拼图”问题 智能行为 在本书中我们关注智能行为,即行为主体对下一步该做什么做出的判断,称为智能选择行为。为什么我们关注智能行为?而不选择上述列出的其他科学家的观点?在此列举心理学和神经科学的局限性。 心理学的局限——大多仅能从外部观察研究对象,因此在研究过程张受到极大的限制。神经科学的局限——最多只能观察到运行过程,而多种不同运行的原理可能可以导致同种运行过程,所以难以解析背后真正的原理。 由飞行器制造得到的灵感,我们研究思维是如何引导智能行为有两种途径
1、研究人脑(及其他生物的大脑);
2、将注意力放在思维过程本身,找到适用于人脑及其他思考行为的普遍原理。
设计立场总结:我们无须在细节上纠结人脑如何工作,而应将注意力转移到人脑所作的工作上,研究人脑是如何完成这项工作的,发现在此过程中什么因素起到了作用,什么未起作用。
当然,这种设计立场也同时存在缺陷,我们无法了解到意识思维的主观感受(思维结果带给思维主体的感受),但在本书中的研究对象是可观察的智能行为以及产生的过程,所以在此不讨论缺陷部分。
三、知识与行为 超越刺激与反应 约翰·麦卡锡发现:人们在日常行为中表现出的突出特点就是知识的决定作用;他首次提出:若想理解智能行为,我们就应研究在背后支持智能行为的知识,以及这些知识是如何影响人类行为决策的。 从“谈论《2001:太空漫游》”这个故事中得到的观点:掌握知识,并利用知识对自身行为施加影响,是构成人类行为的本质。人类会采取行动以应对刺激:
1.格式化:用format方法,用来将Date对象转换成String。
要格式化一个当前语言环境下的日期,需要通过下面的方法来完成。DateFormat是抽象类,我们需要使用其子类SimpleDateFormat来创建对象。
SimpleDateFormat可以将一个Date对象转换为一个符合指定格式的字符串,也可以将一个符合指定格式的字符串转为一个Date对象。
当出现y时,会将y替换成年当出现M时,会将M替换成月当出现d时,会将d替换成日当出现H时,会将H替换成时当出现m时,会将m替换成分当出现s时,会将s替换成秒 public class Demo { public static void main(String[] args) throws ParseException { //2019-3-12 10:31:43 //2019年3月12日10:31:43 //日期格式化:format // 父类 DateFormat // 子类 SimpleDateFormat DateFormat df1 = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); Date date = new Date(); String s = df1.format(date); System.out.println(s); 2.解析时间:用parse方法,用来将String转换成Date(转换时,该String要符合指定格式,否则不能转换。
解析时间时,时分秒默认为零,所以需要解析的字符串只需要写到年月日。
public class Demo { public static void main(String[] args) throws ParseException { //解析时间 //将字符串 2019年3月12日10:39:42 转成Date对象 String s2 = "2021年2月12日"; DateFormat df2 = new SimpleDateFormat("yyyy年MM月dd日"); //抛异常,解析时可能会出现问题,原数据匹配规则不一致 Date date2 = df2.
1.LDCE\LDPE是什么? LDCE:异步清零的latch
LDPE:异步置位的latch
都包含G端口。G端口(gate)需要接时钟,可以看到系统自动加上了BUFG。
2.如何用verilog描述LDCE\LDPE? `timescale 1ns / 100ps module top( input i_a , input i_b , output reg o_c , input i_a1 , input i_b1 , output reg o_c1 , input i_a2 , output reg o_c2 ); always@(*)begin if (i_a) o_c = 1; else if (i_b) o_c = 0; else o_c = o_c; end always@(*)begin if(i_a1) o_c1 = 0; else if(i_b1) o_c1 = 1; else o_c1 = o_c1; end always@(*)begin if(i_a2) o_c2 = 0; else o_c2 = 1; end endmodule 3.
动态局部重构Dynamic Partial Reconfiguration(DPR),顾名思义,局部重构是当下载了全部的bit 配置以后,可以通过下载局部分区bit 文件来动态修改对应分区的逻辑功能,同时其余分区的逻辑功能持续运行而不中断。
典型应用 局部重构优化了传统的FPGA 应用,通过这项技术减少了尺寸,重量,功耗和成本。
一个典型的例子是网络交换机。每个网络交换机都具有多个端口,每个端口能够支持多种接口,比如10GigE ,OC48和光纤等等。然而在FPGA配置之前,无法预测用户将会使用哪一种网络接口,于是只能将每个端口的所有的接口控制逻辑都在FPGA 中实现。如下图所示:
显然这种方式浪费了FPGA内部的资源,增加了FPGA 的面积和功耗。局部重构能够实现更有效的设计方法,如下图所示:
在设个设计中,我们将各种类型的网络接口的控制逻辑预先设计并编译成为bitstream 文件,存储在处理机的存储空间或者SD card 上,当用户配置某一类型的网络接口时,将相应的bitstream 下载到相关的局部重构块中。
局部重构技术在工业控制器设计中同样是需要的。例如在模块化PLC 中,有多种IO模块存在,使用背板FPGA 实现高速IO 逻辑,例如高速PWM信号,脉冲计数,解码器接口,和模拟量采集,每个IO模块的插槽有十几根IO控制线。但是每个插槽对应的FPGA 的控制逻辑与插入的IO模块相对应,在PLC 出厂时是无法确定的。因此,可以使用FPGA的 动态局部逻辑配置的功能。当处理器通过IO模块内部的EEPROM 的数据确定IO模块的类型。然后将对应逻辑的bit 下载到局部分区中。
动态局部配置与matlab /simulink算法 matlab是著名的科学计算软件。而simulink是在matlab基础上构建的建模。仿真和分析的软件。不仅如此,matlab/simulink 能够生成产品级 C、C++、CUDA、PLC、Verilog 和 VHDL 代码,并直接部署到您的嵌入式系统。现在,matlab、simulink 的应用已经非常广泛,包括了无线通信,电力电子,控制系统,机器人,高级驾驶辅助系统,数字孪生,人工智能等领域。 matlab/simulink 采用了基于模型的设计方法,直接生成各种产品级代码,实现了从“模型到代码”的设计自动化。这是最受欢迎的功能之一。省去了大量编码和FPGA 设计繁琐工作,大大提高了原型设计的效率。
基于模型设计的思想受到各类行业工程师的欢迎,不过,实现这一理想是复杂的过程,目前matlab 支持的Xilinx 和Intel的FPGA 系列。实现matlab to fpga 的过程大至如下
1 使用matlab/simulink 建模与仿真 2 导出算法的verilog 语言。 3 使用FPGA 设计软件将verilog 算法添加到vivado 的工程中。产生一个IP 核。 4 Simulink 通过以太网与ZYNQ 处理器通信,ZYNQ 处理器通过AXI接口访问IP核。 5 处理器通过FPGA 的PCAP(Processor Configuration Access Port )和ICAP(Internal Configuration Access Port)实现FPGA 的配置。 6 结合FPGA的动态局部重构技术实现Matlab to FPGA 的功能。 根据IP 核的具体要求,可以选择不同的AXI接口,例如使用AXI_DMA 实现IP核与处理器之间的高速数据传输,通过AXI_Lite 实现寄存器访问和配置。
使用GCC新建工程的好处是windows 与 linux 系统无需更改项目,都能进行编译
1. ARM-GCC 下载与安装 进入GNU Arm Embedded Toolchain Downloads ,下载gcc-arm-none-eabi-10-2020-q4-major-win32.exe
下载完毕安装后,将安装路径 D:\GNU Arm Embedded Toolchain\10 2020-q4-major\bin (根据你的安装安装路径) 添加到系统变量,打开命令行工具,输入命令 arm-none-eabi-g++.exe -v 出现如图版本号信息,表示arm-gcc安装成功
Target: arm-none-eabi
Configured with: /mnt/workspace/workspace/GCC-9-pipeline/jenkins-GCC-9-pipeline-100_20191030_1572397542/src/gcc/configure --…
…
Thread model: single
gcc version 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599] (GNU Tools for Arm Embedded Processors 9-2019-q4-major)
PS C:\Users>
2. 安装mingw-make 下载mingw安装 Mingw;mingw访问较慢,可下载Dev C++软件,自带mingw,Dev c++下载;下载安装完成后打开安装目录,进入MinGW64\bin,将mingw32-make.exe复制一份并重命名为make.exe;将 DevC++ 安装目录下的MinGW64\bin,添加到系统变量,打开命令行输入make,出现下列提示表示安装成功。 make: *** No targets specified and no makefile found. Stop.
##1.一个时间格式的整数:20210118,利用数值计算取出它的年月日
##提示:呈现出2020年01月18日(涉及字符串拼接)
##解答:
##方法一:
date=int(input('请输入年月日(如:20220201):'))
n=date//10000 #年的计算值
y=(date-n*10000)//100 #月的计算值
r=date-n*10000-y*100 #日的计算值
print('%d年%02d月%02d日\n'%(n,y,r)) #输入****年**月**日
##方法二:
time=int(input('请输入一个日期:'))
year=time//10000 #年的计算值
month=time//100%100 #月的计算值
day=time%100 #日的计算值
print(f'{year}年{month:02}月{day:02}日')
print('%d年%02d月%02d日'%(year,month,day))
.gitignore 介绍 在项目编译过程中,会生成一些中间文件,或者在项目中的部分文件是不需要进行版本管理的。对于这些文件应该对于 Git 来讲是透明的。Git 提供这种功能,可以自己指定哪些文件可以不被管理。
具体方法是在版本管理的根目录下(与 .git 文件夹同级)创建一个 .gitignore(gitignore 是隐藏文件,所以前面有个点)在进行协作开发代码管理的过程中,常常会遇到某些临时文件、配置文件、或者生成文件等,这些文件由于不同的开发端会不一样,如果使用 git add . 将所有文件纳入 git 库中,那么会出现频繁的改动和 push,这样会引起开发上的不便。Git 可以很方便的帮助我们解决这个问题,那就是建立项目文件过滤规则。
Git 中提供两种过滤机制:
1)全局过滤机制,即对所有的 Git 都适用;
2)针对某个项目使用的过滤规则;
常用的是第二种,在项目下创建 .gitignore 文件。
创建 .gitignore windows:创建一个文件,文件名为:“.gitignore.”,注意前后都有一个点。保存之后系统会自动重命名为“.gitignore”
linux:touch .gitignore
配置语法 以斜杠 “/” 开头表示跟目录,放在末尾表示跟目录以及子目录下的所有该文件夹;
以星号 “*” 通配多个字符;
以问号 “?” 通配单个字符;
以方括号 “[]” 包含单个字符的匹配列表;
以叹号 “!” 表示不忽略(跟踪)匹配到的文件或目录;
此外,Git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;
示例 fd1/*
说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略
/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容
/mtk/do.c
说明:过滤某个具体文件
/*
tf.keras 参考 https://github.com/tensorflow/docs/blob/529ba4346b8fc5e830e762a2f0ee87b3c345c0c9/site/en/r1/guide/keras.ipynb
# Save weights to a TensorFlow Checkpoint file model.save_weights('./weights/my_model') # Restore the model's state, # this requires a model with the same architecture. model.load_weights('./weights/my_model') 也可以保存为 Keras HDF5 格式
# Save weights to a HDF5 file model.save_weights('my_model.h5', save_format='h5') # Restore the model's state model.load_weights('my_model.h5') 注意,h5 可能会遇到这个问题 https://stackoverflow.com/questions/53740577/does-any-one-got-attributeerror-str-object-has-no-attribute-decode-whi
即 model.load_weights('my_model.h5') 时会报错 'str' object has no attribute 'decode'。解决办法:
pip freeze | grep h5py pip install h5py==2.10.0 tf.train.Saver 可以保存指定参数。参考 https://www.tensorflow.org/api_docs/python/tf/compat/v1/train/Saver
entity public class Goods { public Goods(String name, int wight) { this.name = name; this.wight = wight; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getWight() { return wight; } public void setWight(int wight) { this.wight = wight; } private String name; //商品名 private int wight ; //权重 } VO public class Container { public Container(String name, int num) { this.
@Configuration public class RedisConfig { @Bean @SuppressWarnings("all") public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { // 我们为了自己开发方便,一般直接使用 <String, Object> RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(factory); // Json序列化配置 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY); jackson2JsonRedisSerializer.setObjectMapper(om); // String 的序列化 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 template.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } } 模仿b站狂神,拿来自己开发使用。
可以使用 pygame.transform.rotate(图片对象,旋转角度)来实现。
一开始是我按下方红框写代码,但是火箭并未被旋转。
实际上pygame.transform.rotate(Surface,旋转角度)是返回一个经过旋转的Surface,如果输出的不是这个返回的Surface,就达不到旋转的效果。
调整后代码如下:
运行得到了旋转后的火箭图片
submodule 常用命令
git submodule: 显示所有 submodule, 等同于git submodule status
添加 submodule 到现有项目 Run git submodule add -b <branch> --name <name> <repo-url> <local dir>Commit both files on the superproject 从当前项目移除 submodule git submodule deinit -f <submodule_path>rm -rf .git/modules/<submodule_path>git rm -f <submodule_path> 复制含 submodule 项目到本地 Clone the superproject as usualRun git submodule init to init the submodulesRun git submodule update to have the submodules on a detached HEAD 或者直接执行 git clone --recurse-submodules <repo-url>
环境变量 1、getenv:C语言获取环境变量2、环保变量相关命令3、环境变量的组织方式**main函数的参数:argc、argv[]****main函数的参数:env[]** 1、 env:查看所有环境变量 2、 echo $PATH :查看PATH下的环境变量 问:为什么运行我们生成的test可执行文件需要./test,但是运行ls等命令就可以直接用呢?
答:不指定路径,系统会在PATH里的路径里找,PATH:辅助系统进行指令查找
PATH=$PATH:/home/xupeng/101/lesson10:将/home/xupeng/101/lesson10添加到环境变量;这样运行就可以不用带./指定当前路径了(这种设置是一次性的,重启失效,想永久,必须更改.bash_profile文件)
(PATH不小心被自己清空后,关机重登就可以,PATH是个变量,他是被系统开启时赋值的)
1、getenv:C语言获取环境变量 3 #include "stdlib.h" 4 7 int main() { 8 9 printf("%s\n", getenv("PATH")); 10 printf("%s\n", getenv("HOME")); 11 return 0; 19 } MY_ENV="hello env"设置本地变量;export MY_ENV导为全局变量后可以被别的进程获取到
[xupeng@VM-4-13-centos lesson10]$ MY_ENV="hello env" [xupeng@VM-4-13-centos lesson10]$ echo $MY_ENV hello env [xupeng@VM-4-13-centos lesson10]$ export MY_ENV [xupeng@VM-4-13-centos lesson10]$ vim proc.c [xupeng@VM-4-13-centos lesson10]$ make gcc proc.c -o proc [xupeng@VM-4-13-centos lesson10]$ ./proc /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xupeng/.local/bin:/home/xupeng/bin:/home/xupeng/101/lesson10 /home/xupeng hello env [xupeng@VM-4-13-centos lesson10]$ 2、环保变量相关命令 env只可以显示环境变量,set可以显示环境变量和本地变量
Step1:查询域名对应的IP地址
使用工具:https://www.ipaddress.com/
查询 raw.githubusercontent.com 的IP地址
查询 github.com的IP地址
这里假设第一个IP地址是185.199.108.133
这里假设第二个IP地址是140.82.112.3
Step2:修改 /etc/hosts 文件
命令行输入
sudo vi /etc/hosts Unix基本操作:
输入i Enter (文件必须是可写的,这样是插入模式)
修改完毕后 ESC shift 冒号 wq (保存并退出)
Step3:安装brew
键入以下命令
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装过程如下
国内镜像源
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
学习思想而非学技术,技术日新月异,唯有思想长盛不衰,润泽后生
学习资料:
【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili
Docker快速入门总结笔记_huangjhai的博客-CSDN博客
(74条消息) docker 进阶 之容器数据卷 DockerFile Docker网络 — 狂神说_cheng的博客-CSDN博客
官网:https://www.docker.com/
文档地址: https://docs.docker.com/ (Docker 官网文档超级详细)
仓库地址:https://hub.docker.com/
Docker中文文档 Docker概述-DockerInfo
Docker 中文文档(译)_nickDaDa的博客-CSDN博客_docker中文文档
1、Docker概述 1.1 Docker 为什么会出现 一款产品上线:面临问题:
问题1:开发 和 上线 俩套环境
问题2:开发人员 和 运维人员 ,开发测试可运行,上线就运行不了
问题3:环境配置十分麻烦,每个机器都要部署环境(集群 Redis、ES、Hadoop 等等)
问题4: 发布 jar包 时 又要 部署(Mysql、ES、Redis、jdk 等等)费时的环境,希望jar + 环境一起发布
问题5:部署的环境不能跨平台 windows 与 Linux
Docker 给以上问题提出了解决方案
传统:开发打jar包 给运维来部署
现在:开发即负责打包又负责部署,全栈开发
开发人员 打jar包带上环境(这里的环境称为镜像) – Docker 仓库(商店) – 运维人员下载 镜像 可直接运行
docker 的 思想 来源于 集装箱 ,打包装箱,相互隔离
1、java指定日期格式(精确到微秒)
yyyy-MM-dd HH:mm:ss.SSSSSS y-年,M-月,d-日,H-24小时制(0-23),h-12小时制(1-12),m-分钟,s-秒,S-毫秒
java只能取到毫秒,微秒级别全是零,但是可以取出到微秒的这种格式化时间戳形式:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"); LocalDateTime now = LocalDateTime.now(); System.out.println(now.format(dateTimeFormatter)); //2022-01-06 11:18:20.044000 2、Oracle指定日期格式(精确到微秒)
sql书写格式: TO_CHAR(systimestamp,'YYYY-MM-DD HH24:MI:SS.FF6') java日期格式含义(全):
yyyy:年MM:月dd:日hh:1~12小时制(1-12)HH:24小时制(0-23)mm:分ss:秒S:毫秒E:星期几D:一年中的第几天F:一月中的第几个星期(会把这个月总共过的天数除以7)w:一年中的第几个星期W:一月中的第几星期(会根据实际情况来算)a:上下午标识k:和HH差不多,表示一天24小时制(1-24)K:和hh差不多,表示一天12小时制(0-11)z:表示时区
主机的网口可能有多个,有些连的是外网,有些连的是内网,如果默认的网口连接的是内网,则Hyper-V创建是连接的就是这个内网,就无法上网了了。
想要Hyper-V的虚拟机支持不同的网卡,就要使Hyper-V这个容器连接多个网卡。
设置步骤如下:
1. 打开多网卡的设置界面
2. 创建一个新网卡
3. 选择对应的物理网卡
4. 为虚拟机创建网络或直接选择网络
5. 虚拟机应该能自动发现新的网络了