掀桌子

掀桌子(来源:攻防世界) 1.关卡描述 2.解题步骤 分析: 给了一份报文: c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2 这是DDCTF2018,不会太简单,看着上面像16进制转ASCII一下: 利用base全家桶解密一下: 都没有得到有效的信息,没有任何思路。 ================= 参考别人的writeup 思路:分析字符串的频率 import string total = 0 cipertext = "c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2" for i in string.printable: if i in cipertext: print(i) total = total + 1 print("总共有字符:",total,"个") all = 0 for i in cipertext: all = all + 1 print("所有字符有:",all) (对这个脚本还有一点想说的是,空格是可打印的字符,也就是说如果我们的字符串很多时,使用“”“存在的空格也会计算,利用防斜杆\处理,计算总共字符没问题,但计算所有字符会出现问题,但可以利用读取文件的方式进行解决,需要修改代码) 从脚本你的结果上看我们的进攻方向是在16进制上 实际上我们大致看也能看出来,知道方向后,我们让其16进制转ASCII码,发现一堆乱七八糟的字符,那么如何去解,字符是16进制,且118是2的倍数,我们可以两个两个拆分出来: 再回去观察一下这段十六进制字符,每两位一组,(注:这里的字符串与攻防世界提供的字符串不一样,理解原理即可) ['d4', 'e8', 'e1', 'f4', 'a0', 'f7', 'e1', 'f3', 'a0', 'e6', 'e1', 'f3', 'f4', 'a1', 'a0', 'd4', 'e8', 'e5', 'a0', 'e6', 'ec', 'e1', 'e7', 'a0', 'e9', 'f3', 'ba', 'a0', 'c4', 'c4', 'c3', 'd4', 'c6', 'fb', 'b9', 'b2', 'b2', 'e1', 'e2', 'b9', 'b9', 'b7', 'b4', 'e1', 'b4', 'b7', 'e3', 'e4', 'b3', 'b2', 'b2', 'e3', 'e6', 'b4', 'b3', 'e2', 'b5', 'b0', 'b6', 'b1', 'b0', 'e6', 'e1', 'e5', 'e1', 'b5', 'fd']

pdf

pdf (来源:攻防世界) 1.关卡描述 2.解题步骤 分析: 我们下载附件后,是一个pdf文件,打开之后看到的是一张图片,想到题目描述也说了给了一张图片,图片下面什么也没有,这说明图片的下面应该是有flag,这是一道pdf隐写题 我们使用editor进行查看: 发现这里比较特殊,不知道怎么做了,没做过pdf隐写题,那就去百度搜集一下: 搜集的信息比较杂乱,简单的试了一下没有成功、 =========================================== 参考writeup: 思路一: 使用在线网站将pdf转换成doc,可以得到flag PDF转Word在线免费 - PDF怎么转换成Word - 迅捷PDF转换器在线免费版 (一开始转了好几次都没有成功,最后试了试又可以了,原因没有找到) 思路二: 直接利用浏览器打开,然后使用ctrl+f进行搜索flag,但我没有成功,但是我发现鼠标放在这个位置,鼠标变成了编辑模式,于是我点击左键往右,就可以看到有信息藏在里面,复制下来即可 或者直接利用 ctrl+a 就能马上显示下面的蓝色部分 思路三:(经测试该工具需要下载) 用linux自带的工具pdftotext将pdf 装换为txt格式,打开即可看到flag ,或者用命令行搜索flag : cat flag.txt |grep flag pdftotext的使用方法 https://blog.csdn.net/github_33934628/article/details/50815430

如来十三掌

如来十三掌(来源:攻防世界) 1.关卡描述 2.解题步骤 分析: 题目提示如来十三掌,想到ROT13,我们先下载附件,发现是一个word文件 里面有一段话,看样子像是社会主义核心价值观编码,发现解不开,说明解码不对。 ============== 参考: 这一题的关键就在于解密上面的密文: 在线网站:与佛论禅:与佛论禅 解密之后,又得到一串密文,想到提示如来十三掌,那就是ROT13解码 MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9 又得到一段密文: ZmxhZ3tiZHNjamhia3ptbmZyZGhidmNraWpuZHNrdmJramRzYWJ9 ROT13: 对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。(数字不进行替换则不变) 首先我们要知道ROT13是一个替换码,再次替换就变成原先的了,所以我们不可能再次替换,那么就观察替换后的暗码,发现符合base64,我们进行解码: flag{bdscjhbkzmnfrdhbvckijndskvbkjdsab} ======================= 总结: 关键点在于知道上面的与佛论禅密文如何解码。 注意一下这个网站: 新约佛论禅/佛曰加密 - PcMoe!

gif

gif (来源:攻防世界) 1.关卡描述 2.解题步骤 分析: 题目说是动态图,实际上却是一大堆分离出来的图片: 103张黑白图片(实际是104张,没有计算0张图片),猜测会不会是白对应1,黑对应0,或者白0黑1,猜测为二进制: 简单的试了一部分,发现不对,(笔记:简易以后要么测试8位,或者是16位等,不要只测某个部分的) 那么观察16进制: 黑色有这些字符特征 白色: 没有任何的头绪: 看看其他writeup是如何做的: ============================= 自己出现的问题,为什么想到了思路,却没有做出来,是因为测试的方法不对,没有添加空格, 下面的这个工具就不用考虑空格,他会自动处理 =========== 看了writeup知道了错在哪里,我们知道了白色代表0,黑色代表1,手动搞的话,这里就不说了,我们使用脚本进行: 脚本一: 通过 黑白图片的md5不一样,写python脚本提取 (笔记:libnum库是一个关于各种数学运算的函数库,它包含common maths、modular、modular squre roots、primes、factorization、ECC、converting、stuff等方面的函数) #coding:utf-8 import libnum import hashlib #主要通过 md5判断0或者1 #白代表0,黑代表1 #n0 with open("0.jpg","rb") as f: md5i=hashlib.md5() md5i.update(f.read()) n0=md5i.hexdigest() print n0 #n1 with open("1.jpg","rb") as f1: md5i=hashlib.md5() md5i.update(f1.read()) n1=md5i.hexdigest() print n1 flag="" for i in range(0,104): with open(str(i)+".jpg","rb") as f2: md5i = hashlib.md5() md5i.update(f2.read()) n3 = md5i.hexdigest() if n3==n0: flag+="

echarts 堆叠柱状图 顶端圆角

echarts 堆叠柱状图被很多项目广泛的使用。需求是 堆叠柱状图 顶端圆角,下面是实现过程。 安装或引入echarts,正常的使用方法可以看官方文档,直接上代码: option = { xAxis: [ { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] } ], yAxis: [ { type: 'value' } ], series: [ { name: 'Google', type: 'bar', stack: 'Search Engine', emphasis: { focus: 'series' }, data: [120, 8, 101, 134, 290, 230, 220], }, { name: 'Bing', type: 'bar', stack: 'Search Engine', emphasis: { focus: 'series' }, data: [60, 72, 71, 74, 190, 130, 110] }, { name: 'Others', type: 'bar', stack: 'Search Engine', emphasis: { focus: 'series' }, data: [62, 82, 91, 84, 109, 110, 120], itemStyle: { barBorderRadius: [12, 12, 0, 0], } } ] }; 代码效果:黄色other 绿色Bing 蓝色Google

SpringBoot整合Nacos和Dubbo

SpringBoot整合Nacos和Dubbo 文章目录 SpringBoot整合Nacos和Dubbo前言一、 Nacos安装二、 SpringBoot整合Nacos和Dubbo1. 添加依赖2. 编写配置文件内容2.1 服务结构说明2.2 服务提供者2.3 服务消费者 3. 创建服务提供者与消费者代码3.1 服务提供者部分代码3.2 服务消费者部分代码 三、 项目启动总结 前言 在分布式微服务框架中,比较重要的就是远程方法调用了,阿里巴巴推出的Nacos+Dubbo框架是一种很不错的解决方案,其中Nacos不但可以作为注册中心,还可以作为配置中心,并且Dubbo也内置了几种很不错的负载均衡算法,这二者的组合可以取得不错的效果,目前也是一种主流的分布式微服务中间件。 我之前就写过一篇类似的文章,方法和过程都差不多,感兴趣的话可以瞅一眼,Nacos实现服务注册与消费(传送门)。现在重新整理一下,以供参考。 本文完整代码可见:https://github.com/BraisedPanda/xiqing-study-project.git 一、 Nacos安装 Nacos安装与启动直接去看官方文档就行,那里有最新的Nacos安装包,Nacos官方文档 安装完运行后,输入http://ip地址:8848/nacos/#/login,就可以进入登录界面了,用户名和密码默认都是nacos 这是登录后的页面,常用的界面就是配置中心以及注册中心了。 二、 SpringBoot整合Nacos和Dubbo 1. 添加依赖 首先第一步当然是添加相关的依赖了,网上添加Nacos和Dubbo的依赖多种多样,这里提供一下我依赖的maven配置,这里需要注意下nacos和dubbo的对于版本,版本不对可能会造成项目的启动失败。 <!-- nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.5.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.5.RELEASE</version> </dependency> <!-- dubbo --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.0.2.1</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.0.2.1</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>3.0.2.1</version> </dependency> 2. 编写配置文件内容 接下来就是编写配置文件,注明Nacos和Dubbo的地址、命名空间和应用名称等信息,这里有个坑,建议把这些配置写入bootstrap.yaml文件中,否则可能会造成服务无法注册在正确的地址上。这个坑可以看我之前记录的文章,Nacos配置了远程地址,项目启动时却一直连接本地问题解决方法 2.1 服务结构说明 微服务中一般分为服务消费者与服务提供者,通常来讲,服务消费者一般是请求的入口,集成了大量的controller,请求通过controller调用服务提供者提供的service接口,请求数据。因此,服务提供者与服务消费者的配置文件也稍微不同(不同之处主要在于消费者需要配置提供者的服务名称)。 2.2 服务提供者 bootstrao.

PHP大文件分片上传、断点续传、上传进度条

目录 【前言】 分片上传原理 断点续传原理 进度条显示 用到的工具及引入的附件 html代码 js代码 PHP代码 【前言】 因公司有大文件上传后处理的需求,但是nginx和php都有做文件大小的限制,所以要用到分片上传;因为文件比较大,可能会遇到 网络断开、误关闭页面、服务端暂不可用等问题,所以要实现断点续传的功能。 分片上传原理 前端将大文件按照固定大小切分,每次上传单个分片二进制流,最后一片上传完毕后后端对文件进行分片合并。 断点续传原理 服务端记录某个文件的上传进度; 好多人都是每次上传分片都检测下上传进度,没必要; 我的例子中是首次上传时先从后端获取分片位置【position】,然后从上次上传position开始继续上传,中间有任何异常,都会重置是否获取 position的变量,再重新获取上传进度,接着上传; 这样会减少很多没必要的请求,不会有任何问题。 进度条显示 很简单, 已上传的分片进度 / 总分片数 * 100 用到的工具及引入的附件 redis 、jquery jquery-1.8.0.min.js 和 md5.js 都是公用的,网上一查就有,我没找到上传附件的地方... html代码 <html> <head> <script src="html/js/jquery-1.8.0.min.js"></script> <script src="html/js/md5.js"></script> </head> <body> <input type="file" id="zipfile-inputEl"> <button id="upload">点击上传</button> <br> <p style="display: inline"> 上传进度: <p id="progressBar" style="display: inline">0</p> % </p> </body> </html> js代码 /** * 分片上传相关变量 */ var nowIndex = 0; // 计算分片上传文件切片设置,默认从0开始 var getPosition = true; // 获取分片上传位置,默认获取(断点续传) /** * 文件分片上传 * file 文件对象 * filemd5 整个文件的md5值 */ function shardToUpload(file, fileMd5) { var fileName = file.

Vue项目 - css 使用 js 变量值

做项目时遇到以下问题: 组件中需要使用变量的值作为某元素的背景颜色,但 style 标签中无法直接使用变量值作为样式 解决方法如下 为需要设置变量的元素样式做如下设置(使用) background-color: var(--theme-color); –theme-color为此处的自定义名称 包裹该元素的任意元素标签做以下设置(定义) <div class="content" :style="{ '--theme-color': themeColor }"> ... </div> themeColor 为 script 标签中设置的变量 完成 方法参考 MDN 相关文档: https://developer.mozilla.org/zh-CN/docs/Web/CSS/var()

存入数组数据,找出最大值和最小值

这个问题我们需要考虑两点:1.存入数组的数据2.找出数组的最大值还有最小值。 解决问题1:我们可以利用for循环依次输入数据进入数组中。 解决问题2:我们可以设定两个值max和min,让他们俩的初始值为0也就是数组的第一位假如数组为a[size],那么就可以设max=min=a[0],然后用for循环读出数组的每个元素,要是大于max,那么max就等于嘞个元素,要是小于min,那么min就等于嘞个元素。这样就得出了结果 我的代码如下 #include<stdio.h> int main() { int a[10]; int i, b, MAX, MIN; for (i = 0; i < 10; i++) { printf("输入第%d个数:", i + 1); scanf_s("%d", &a[i]); } MAX = MIN = a[0]; for (b = 0; b < 10; b++) { if (MAX < a[b]) MAX = a[b]; if (MIN > a[b]) MIN = a[b]; } printf("最大值为:%d,最小值为: %d", MAX, MIN); return 0; } 最后运行一下下子 成功运行!

可重入锁(ReentrantLock为例)

什么是可重入锁 STFW得到以下两种主流解释 解释一:可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。 解释二:可重入锁又称递归锁,是指同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提是锁对象得是同一个对象),不会因为之前已经获取过锁还没有释放而阻塞。 疑惑 解释一中提到了可以再次获取锁,“再次获取锁”是如何进行判断的呢? 解释二中提到了可重入锁称为递归锁,因此就想当然的理解为可重入锁是某段代码方法中,一个锁里面嵌套着某个锁。那么难道锁不进行嵌套就不是可重入锁了吗? 解释一和解释二总感觉描述的不是一个东西。 证明 首先,我们已知ReentrantLock是可重入锁,那么它的可重入是怎么实现的呢,源码中有这样一段代码。 protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } if (current == getExclusiveOwnerThread())这一段就是进行可重入锁的判断,因此可以得知,可重入锁就是在加锁时判断当前线程是否是已经获取到锁的线程,如果是的话,锁的次数会+1。需要注意的是既然多次加锁,就需要多次释放锁。

halcon中sort_region标定板之9点标定mark点各方向排序

目录 做的视觉处理项目多了也遇到了很多麻烦事,也少不了掉几根头发 有次项目处理的过程中对精度要求高,但是来料大,视野范围受限等问题 采用了单工位多相机进行视觉处理 这个过程就是让两个相机的图像坐标绑定到同一块标定板上 这个过程就用到了常用的九点标定法 但是由于机构问题的安装的相机方向有点差异,导致 标定板上面的坐标带有方向 想到2个解决方法: ①是旋转旋转图像,让他们方向一致即可—(推荐) 实现功能的halcon算子 rotate_image (, ImageRotate, 90, 'constant') 还可以是相机自带的采图镜像转换 ②就是不旋转,标定的时候,获取的点重新排列----于是便有了下面的排列方式 *二值化处理--只获取标定板上面的Mark点 threshold (ImageReduced, Region, 0, 150) *填充显示--黄色显示 dev_set_color ('yellow') dev_set_draw ('fill') *分割图像,将mark点整体分割 connection (Region, ConnectedRegions) *去噪---面积筛选,只允许150-99999 select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999) *获取面积及mark区域中心--刚好9个 area_center (SelectedRegions, Area, Row, Column) *设置字体显示的颜色 dev_set_color ('black') *序号显示--不排序显示 for Index := 1 to |Area| by 1 set_tposition (3600, Row[Index-1], Column[Index-1]) write_string (3600, Index) endfor set_display_font (3600, 16, 'mono', 'true', 'false') disp_continue_message (3600, 'black', 'true') *按F5继续 dev_close_window () dev_open_window (Row1, Column1, 512, 512, 'black', WindowHandle) dev_display (Image1) dev_set_color ('pink') *排序之后在显示row先使用行值,column先使用列值排序--可以看到使用column排序的时候不稳定 sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column') area_center (SortedRegions, Area1, Row3, Column3) dev_set_color ('black') for Index := 1 to |Area1| by 1 set_tposition (3600, Row3[Index-1], Column3[Index-1]) write_string (3600, Index) endfor *为了解决排序的问题我打算换一种先求一列的或者一行的,然后在排序 dev_close_window () dev_open_window (Row1, Column1, 512, 512, 'black', WindowHandle) dev_display (Image1) dev_set_color ('blue') *这样子是以列排序,从左上角开始,那么可以从做小角开始吗?也可以 *左下角√,右下角√,右上角√ *行排序,左上角,右上角,左下角√,右下角也是可以的 *差不多就是这个道理--这样排序就相对稳定许多,用上两个for循环 sort_region (SelectedRegions, SortedRegions, 'first_point', 'false', 'row') for Index1 := 1 to 3 by 1 dev_set_color ('red') *选择第Index1列的第1个 select_obj (SortedRegions, ObjectSelected1, 1+ 3*(Index1-1)) *选择第Index1列的第2个 select_obj (SortedRegions, ObjectSelected2, 2+ 3*(Index1-1)) *选择第Index1列的第2个 select_obj (SortedRegions, ObjectSelected3, 3+ 3*(Index1-1)) *这样就筛选出第Index1列了,用上数组,循环3此就是区分开3列 *将每列的形成一个整体 union2 (ObjectSelected1, ObjectSelected2, RegionUnion) union2 (RegionUnion, ObjectSelected3, RegionUnion1) *将整体再次分割 connection (RegionUnion1, ConnectedRegions1) *再次排序--用上row值排序 sort_region (ConnectedRegions1, SortedRegions1, 'first_point', 'true', 'column') area_center (SortedRegions1, Area2, Row4, Column4) *写序号 dev_set_color ('black') for Index2 := 1 to 3 by 1 set_tposition (3600, Row4[(Index2-1)], Column4[(Index2-1)]) write_string (3600, Index2+(Index1-1)*3) endfor endfor PS:关注收藏,不迷路,分享项目小难点。

Java中List排序的3种方法!

作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表,但列表默认是以用户编号从小到大进行排序的,而我们的系统需要按照用户的年龄从大到小进行排序,这个时候,我们就需要对 List 集合进行自定义排序操作了。 List 排序的常见方法有以下 3 种: 使用 Comparable 进行排序; 使用 Comparator 进行排序; 如果是 JDK 8 以上的环境,也可以使用 Stream 流进行排序。 下面我们分别来看各种排序方法的具体实现。 1.使用 Comparable 排序 按照本文设计的场景,我们需要创建一个包含了用户列表的 List 集合,并按用户的年龄从大到小进行排序,具体实现代码如下: public class ListSortExample { public static void main(String[] args) { // 创建并初始化 List List<Person> list = new ArrayList<Person>() {{ add(new Person(1, 30, "北京")); add(new Person(2, 20, "西安")); add(new Person(3, 40, "上海")); }}; // 使用 Comparable 自定的规则进行排序 Collections.

视觉SLAM十四讲笔记 -- 第二讲

第二讲:课后题 1.阅读文献[1]和[14],你能看懂其中的内容吗? 文献1:A survey of monocular simultaneous localization and mapping 可以从百度学术上自行下载 本文献是一篇SLAM的综述,首先从AR(Augmented reality 增强现实)切入,讲了SLAM的重要性以及视觉SLAM可以带来的好处,然后以此展开总体的概括了SLAM的发展情况,也分析和介绍了各不同SLAM的性能区别,对各个特性进行了对比和分析,最后总体讲了现有SLAM技术的不足以及对SLAM日后发展的憧憬。 感兴趣的同学可以参考这个博客:https://blog.csdn.net/zhuquan945/article/details/79712506 文献14:Graph-based SLAM: A Survey 又是一篇关于视觉SLAM的文献综述。本文从帧间配准、环形闭合检测以及优化技术 3 个主要方面对基于图优化的同时定位与地图创建进行综述.对每一个方面,阐述其关键技术,介绍最新研究进展,并探讨相关难点问题及解决思路.最后,对基于图优化的同时定位与地图创建的发展作出展望。 2.*阅读SLAM的综述文献,例如[9,15-18]等。这些文献中关于SLAM 的看法与本书有何异同? 文献9:Past, Present, and Future of Simultaneous Localization and Mapping: Toward the Robust-Perception Age 文献15:Visual Simultaneous Localization and Mapping: A Survey 感兴趣的同学可以参考这个博客:https://blog.csdn.net/shyjhyp11/article/details/104375922 文献16:Topological simultaneous localization and mapping: a survey 这个论文下载不了… 文献17:Kalman Filter for Robot Vision: A Survey 文献18:Recent advances in simultaneous localization and map-building using computer vision

调度算法抢占式和非抢占式

一.作业调度算法(进程也可用) 1.FCFS 先来先服务 非抢占式 2.SJF/SPF 短作业/进程优先 抢占式/非抢占式 3.HRRN 高响应比优先 非抢占式 二.进程调度 4.RR 时间片轮转 抢占式 5.优先级调度 抢占式/非抢占式 6.FB 多级反馈队列 抢占式 三.实时调度算法 7.EDF 最早截止时间 抢占式/非抢占式 8.LLF 最低松弛度 抢占式

C#中的数组

一、数组的特点 1、 在一个数组中存放的值都是同一数据类型的。 2、 数组中某个指定的元素是通过索引来访问的。 3、 所有的数组都是由连续的内存位置组成的。 4、 数组从零开始建立索引,即数组索引从零开始。 二、二维数组 一维数组在数组中最常用,即将一组值存放到一个数组中,并为其定义一个名称, 通过数组中元素的位置来存取值。 举例如下: 1、//定义 int 类型的数组 2、int[] a = {1,2,3}; 3、//输岀数组中的一个元素 4、Console.WriteLine(a[0]); 5、//输出数组中的最后一个元素 6、Console.WriteLine(a[a.Length‐1]); 三、多维数组 多维数组是指二维或二维以上的数组,多维数组与一维数组的定义非常类似,每多一个维度则在定义时的[ ]中增加一个“,”。存取数组中的值也是将下标用“,”隔开。 举例如下: 1、static void Main(string[] args) 2、{ 3 、int[,] arr = new int[2, 2] { { 2, 3 }, { 4, 5 } }; 4、 5 、for(int i = 0; i < arr.GetLength(0);i++) 6、 { 7、 for (int j = 0; j < arr.

算法和数据结构 (哔哩哔哩-左神算法学习笔记-持续更新)

马士兵-左神算法-哔哩哔哩地址 1.复杂度、二分、对数器、异或运算 1.评估算法的优劣的核心指标 1.时间复杂度(流程决定) 分析过程,得出表达式,忽略掉系数、常数项、低阶项,只留下最高阶,最高阶系统去掉 例如:表达式-> ax^3+bx+c 时间复杂度就是:O(x^3) 为什么:当样本量达到一定的次数的时候,就会发现系数、低阶项、常数项都不重要了。 100万*N^2+200万*N +600万,当N->∞, 系数和常数算个毛线啊 2.空间复杂度(流程决定) 3.常数项时间(流程决定) 定义:如果一个操作的执行时间不以样本量转移,每次都是固定时间,就叫做常数操作。 常见的固定时间操作: 常见的算术预算(加减乘除) 常见的位运算(>>,>>> ,<<,|,&,^) 赋值,比较,自增,自减操作 数组寻址操作 >> 带符号右移 右移的时候,左边部位用符号位补位,如果正数就用0补位,负数1补位 >>> 不带符号右移 都用0补位 时间复杂度的意义: 抹掉了好多东西,只剩下了一个最高阶项啊…那这个东西有什么意义呢? 当我们要处理的样本量很大很大时,我们会发现低阶项是什么不是最重要的; 每一项的系数是什么,不是最重要的。真正重要的就是最高阶项是什么。 这就是时间复杂度的意义,它是衡量算法流程的复杂程度的一种指标, 该指标只与数据量有关,与过程之外的优化无关。 如何确定算法流程的总操作数量和样本数量之间的表达式关系? 1.想象该算法流程所处理的数据状况,要按照最差情况来 2.把整个流程彻底拆分为一个个基本动作,保证每个动作都是常数时间的操作 3.把整个流程彻底拆分为一个个基本动作,保证每个动作都是常数时间的操作 选择排序流程: arr[0~n-1] 范围上找到最小值,交换到0位置 arr[1~n-1] 范围上找到最小值,交换到1位置 arr[2~n-1] 范围上找到最小值,交换到2位置 arr[n-2~n-1] 范围上找到最小值,交换到n-2位置 选择排序图解 ​ 选择排序时间复杂度: 等差数列 1+2+3...+n-1,n*(n-1)/2 O(n^2)​ 选择排序代码 /** * 选择排序 * @param arr */ public static void SelectSort(int[] arr) { if (arr == null || arr.

解决-win10软件默认安装路径为C盘——修改注册表

标题修改注册表: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 双击修改地址即可,然后不要关闭注册表窗口。 安装完想安装的程序后,再将地址改回原来的地址。如果不改回,可能会导致原来装的软件无法使用。

山东省历年高考人数(2005-2021)

山东省历年高考人数(2005-2021) 年份人数(万人)200573.1200677.1200777.75200878.1200970.2201065.6201158.8201251201350201455.8201569.61201660.2201758.3201859.2201975.6202078.2202179.5

VSCode - 设置自定义 shell

文章目录 环境前言setting.jsonselect default 环境 Windows 10 VSCode v1.63.1 前言 在使用 VSCode 编辑器时,有时想要在当前目录启动 shell 进行一些命令行操作,直接快捷键 Ctrl + `,但一般打开的都是系统默认的命令行。 如上图所示,windows 10 默认的就是 PowerShell。其实我本地还有一个自己安装的 shell,但选择默认列表里不存在,那我想要作为 VSCode 的终端 shell 需要怎么办呢? setting.json 要设置自己安装的终端作为 VSCode 的默认终端,则可以修改 VSCode 的 setting.json 文件。 打开设置 打开 setting.json 设置终端软件 "terminal.integrated.profiles.windows": { "nu": { "path": "C:\\Users\\xxx\\.cargo\\bin\\nu.exe" } } 我这边使用的是 nushell select default 根据步骤设置完保存,再 Ctrl + `,就可以看到我们设置的终端可以选择了 选择最下面的 Select Default Profile,选中 nu 关闭当前终端,Kill Termial 再次 Ctrl + `,即可进入我们新设置的终端。

springboot 多模块

新建项目: 新建好的项目呢,咱们把多余的删掉,没有什么用处了,新建的作为父容器 然后开始新建两个Module,一个为start(启动类),一个为info info也如上图一样建立就可以了 然后在父级模块(根目录)下的pom中引入两个模块 记得添加packaging 为pom 然后呢将两个模块的pom.xml中的parent改为父工程中的数据(groupId、artifactId、version),将父级的三个值复制过来即可,info模块也如下图所示 然后start下的pom.xml中将info作为依赖也引入进来,然后删除info模块的InfoApplication类,新建一个普通类,我这边新建了一个controll类 ,代码如下 如果在书写的时候返现找不到@RestController注解,在start模块中增加@ComponentScan("com.example")扫描 接下来我们就可以在start中的startApplication类上启动啦,启动后,浏览器中http://localhost:8080/hello 就可以访问到输出的hello啦

mysql 8.0 + Last_IO_Error: error connecting to master ‘root@XXX:3306‘ - retry ...

一、问题 在进行两台linux机器进行MySQL8.0.13主从配置的时候,配置主从之后,在从库mysql进行显示信息 show slave status \G; 出现了 Last_IO_Error: error connecting to master 'root@XXX:3306' - retry-time: 60 retries: 1 二、分析 1.在mysql的data目录下 ,用linux cat命令打开XX.err错误日志文件 cat XXX.err 一直有重试信息 2.尝试ping主库,连通性没有问题 ping xxx 3.可能是主机授权相关有问题,还有本机change master相关命令有问题。 三、实际解决 1.主库开发ip访问 首先得确认主库是否都正常,本地都能连接代表访问是没有问题的。 mysql 8.0 + 向所有IP 开放连接_ycsdn10的博客-CSDN博客 2.重新处理从库同步 (1)关闭从库配置 stop slave; (2)重新配置 ##重新改master_host为主库ip,原先是域名 change master to master_host='XXX',master_port=3306,master_user='root',master_password='123456' ,master_log_file='mysql-bin.000003',master_log_pos=195; (3)重新开启 start slave; 3.查看结果 show slave status \G; 成功进行同步 

关于VS那些宏定义(输出目录,中间目录,解决方案目录)

输出目录 输出目录在对应的项目配置属性-》常规-》输出目录里面设置 默认路径的话是下面的路径 ( S o l u t i o n D i r ) (SolutionDir) (SolutionDir)(Platform)$(Configuration) 这几个都是宏定义,如果想看他们具体的解释的话, 点击浏览-》即可查看这个这个路径$(SolutionDir)所对应的地方 $(SolutionDir) 解决方案配置文件所在的路径,即.sln文件所在的地方 如果想知道这个路径具体是在哪-》点击编辑 如果想编辑这个路径,或者想查看这个宏所代表的路径-》点击右下角那个宏 具体哪个宏的定义都可以看到他们的定义,如果想在路径里面添加宏的话,选中对应的宏-》点击插入 也可以像这样,宏定义加自定义路径 $(SolutionDir)includes\aoi\halcon\include

VS2022安装教程和使用说明来了

我看很多小伙伴已经开始迫不及待的安装VS2022了,虽然我也安装了VS2022,但是我依旧使用VS2019。因为我觉得适合我的才是最好的,并非是最新的,所以大家在使用的时候,根据实际需求选择开发工具,不要一味追求最新,要考虑是否符合你当下的开发。 下面我把VS2022开发工具安装教程分享给大家,同时大家想去下载这个,可以在公众号中输入“VS2022”,我提供的是社区版本。如需其它版本,自行去到微软官方下载。 下面我就将VS2022的安装过程和使用过程给喜欢的小伙伴分享一下,首先我们来看一下他的安装步骤,安装步骤极其简单,如果安装过其他版本的小伙伴,就会非常熟悉。 01 — 安装教程 第一:先下载VS2022社区版,下载的方式,可以通过微软官方下载,也可以通过在当前微信公众号中输入“VS2022”关键字进行下载。 第二:双击下载好的.exe文件,如下所示。 第三:开始加载资源进入安装,如下所示。 第四:选择需要安装的工作负荷,通常我们会用VS开发Web应用程序以及桌面应用程序,所以这两个是必须选择的,如果涉及到其它需要的,可以现在勾选上,也可以等需要用的时候再进行添加。 第五:选择单个组件,注意VS2022侧重跨平台开发,所以VS2022不需要单独勾选.NET Core,此工具已经将.NET Core和.NET Framework集成到一起了。如果想要创建基于.NET Framework的Web项目,需要把.NET Framework项目和项模板勾选上,如下图所示 第六:语言包,选择中文(简体)。 第七:安装位置。 提示:安装前,一定要先查看自己的硬盘是否有足够的存储空间,尤其是系统盘,因为VS和SQLServer安装,有一些程序会默认选择系统盘。 第八:配置完成后,点击安装按钮,进入安装的状态,如下所示。 提示:这个过程会根据你电脑的运行速度,所以耐心等待,可以选择喝点咖啡,等待安装完成。如果安装过程中出现任何问题,那么会存在安装失败的问题,碰到安装失败的问题,查一下具体失败的原因,找到解决办法。 安装完成后如下所示: 如果在安装过程中可能忘记勾选某个版本程序集,此时可以点击上图所示的“修改”按钮,重新勾选,进行安装即可。 怎么样,VS安装是不是很简单,它比起安装SQL Server可要轻松多了,因为SQL Server会涉及到系统的一些权限等等,失败的概率比较高,但是干净的系统安装SQL Server是没有问题的。 如果想知道SQL Server怎么安装的,可以查看公众号中关于SQL Server2019的安装步骤。 打开后显示的起始界面如下所示: 下面我们进入到第二个环节,看看如何使用VS2022创建项目。 02 — VS2022基本使用 第一:打开安装好的VS2022快捷键,会进入到启动页,如上图所示,然后进入到如下图所示的界面。 怎么样,看起来是否熟悉,这和你VS2019一样,那下面我们点击创建新项目。 第二:创建一个控制台应用程序。 配置完成后,点击创建即可。 从图上可以看出,除了图表颜色有点区别,其他的都一样。 第三:创建一个窗体应用程序。 选择基于.NET Framework,这个和VS2019一样,这一步配置部分我就省略了,和控制台配置一样。 同样,除了图标稍微有区别,结构都是一样的。 第三:创建Web应用程序。 创建Web应用程序,如果在安装单个组件的时候没有选择.NET Framework项目和项模板,会找不到基于.NET Framework版本Web项目,所以想要使用基于.NET Framework版本的,需勾选上此选项,这个版本更侧重.NET Core的开发。 配置如下所示: 项目创建完成的结构如下所示: 如果要创建.NET Core跨平台项目,选择.NET Core即可,可以放心安装VS2022吧,因为它针对.NET Core做了更多的改进和封装。 VS2022是64位的,运行效率也是非常高的,而且从2019开始就有了热重载,也就是你运行过程中,也能对代码进行修改。 VS2022还集成了很多其它的前端框架,以及其它语言的开发集成。 OK,VS2022开发工具安装和基本使用,我就给大家分享到这儿,如果还不够清楚的,可以去官方看看说明,根据实际情况选择安装版本。 喜欢的小伙伴记得给我点赞加关注,这样我才更有动力为大家去分享更多的内容。

参加美赛能给计算机保研er带来些什么?

寒假临近,保研er们可以好好利用这个假期全方面地提升自身背景,例如参加各类比赛或者制作一些项目。一般情况下寒假期间可以参加的竞赛较少,但有这样一项竞赛正是此期间开展——数学建模美赛。竞赛经历缺乏的同学可以好好把握住这个机会,认真准备,争取获得不错的名次。今天,岛主就来谈一谈计算机保研er参加美赛能收获什么? 一、走进数学建模美赛 1. 简介 美赛全称为美国大学生数学建模竞赛,是由美国数学及其应用联合会主办,是唯一的国际性数学建模竞赛,也是世界范围内影响力最大的数学建模竞赛,每年都会有来自世界各个国家上万只队伍参赛。 赛题内容涉及经济、管理、环境、资源、生态、医学、安全、未来科技等众多领域。竞赛要求三人为一组,在四天时间内,就指定的问题完成从建立模型、求解、验证到论文撰写的全部工作,体现了参赛选手解决问题的能力、创新思维以及团队合作精神。 2. 奖项设置 美赛一共设置六个奖项,获奖难度由高到低分别是Outstanding Winner(美赛特等奖)、Finalist(美赛特等奖提名)、Meritorious Winner(美赛一等奖)、Honorable Mention(美赛二等奖)、Successful Participant(成功参赛奖)、Unsuccessful Participant(不成功参赛)。这几个奖项,分别被缩写为O奖、F奖、M奖、H奖、S奖、U奖。其中,O奖 从近几年的获奖情况来看,O奖的获奖比例在历年中不超过1%;F奖获奖队伍比O奖略多,但占比在1%左右;M奖的获奖比例基本上在5%~10%之间;H奖人数较多,占比基本在30%±10%;S奖为成功参与奖,只要成功提交不跑题的论文就能拿到。而U奖则是颁给论文抄袭、违反规则、论文未按时提交的团队。 3.含金量 数学建模比赛面向各个专业开放,对于计算机专业的同学来说,编程能力相比于其他专业的同学更具优势。如果能获得H及以上奖项,对各位都有不小的帮助。数学建模比赛不仅考察大家的建模能力,更是对作品的创新性有一定的要求。 不少导师在招生时比较喜欢参加过数学建模并获得优秀成绩的同学。因此,美赛对于计算机保研具有一定的含金量。虽然其含金量略低于ACM等竞赛,但其时间成本相对来说较低。对于缺乏竞赛经历的同学来说是不错的选择,美赛的获奖经历能帮助大家丰富自身背景。 二、 参加美赛能为大家带来什么? 1. 提高建模能力、英语写作能力 美赛相比于国赛来说比赛时间更长,是四天,而且语言要求是英语,且题目相对于与国赛来说更加具有开放性与创新性。美赛题目共两类六题(MCM与ICM各三题),其中MCM题目的数理思想较强,ICM体现在交叉领域,要求知识面较为宽泛。参与美赛不管最后选择做哪个题,本身就是一个挑战。很多保研的同学没有接触过英文论文的写作与阅读,参与美赛在帮助大家提升自身建模能力的同时也会提高各位的英文能力。美赛时间集中在过年寒假放假期间,大家可以选择晚回家几天或者和队友线上进行讨论答题等方式。相信任何同学在参与了比赛之后都会有新的体验。 2. 获奖对保研有帮助 美赛获奖有一定含金量,很多院校的老师也会关注美赛获奖的等级。因为美赛参与的人数较多,并且获奖率相比于国赛来说较高,因此很多老师认为美赛获奖是一项加分项,具体加分多少需要看各位获奖等级。美赛O奖、F奖是一个较大的加分项,因为每年一道题只有很少很少的队伍才能拿到这样的奖项,拿到这类奖项的同学可以在简历中重点突出。拿到M奖是一个很好的成绩,大约只有7%左右的同学会拿到这类等级的奖项,拿到H奖也是个不错的成绩,每年只有不到30%的同学能获得这一等级奖项。 美赛的获奖经历对各位保研是有一定的加分,但是具体情况还得看大家报考的院校的层次以及拿到奖项的等级。但需要注意的是,在计算机保研中大多数的同学都会有建模经历,拿一个相对来说不错成绩还是有一定的说服力的。 3. 有利于参加其他竞赛 数学建模比赛重点考察大家建模能力、编程能力以及论文写作能力,通过准备建模比赛,同学们的各项能力将有所提升。考虑到美赛一般要求3人参加,这三人的任务分工应有所侧重。对于计算机专业的同学来说,在数学建模比赛中主要负责编程实现,需要大家具备较强的编程能力。 编程实现模型使用到的算法比同学们在课上学的基本算法要难出不少,所以大家在备赛阶段更需要注重对建模经典算法的学习,了解每一种算法的适用范围,在此基础上学习深层次的内容,如神经网络等知识。一般情况下,神经网络中的相关模型在数学建模比赛中发挥着不小的作用。因此,计算机专业低年级的学生若尚未接触相关领域,可选择自学相关内容。 同学们在备赛的过程中自学了经典算法、神经网络等知识,对于大家参加其他竞赛也有不小的帮助。另外,数学建模美赛和国赛需要准备的内容相差不大,大家在认真准备美赛后对参加下半年的国赛也有不小的帮助。 4. 对找工作有帮助 如果同学们在校期间参加建模比赛并获奖,这能为大家的简历添上重要的一笔,对于今后找工作面试有一定的帮助。 美赛需要大家在规定时间内完成对某一课题的研究,而这也相当于一个小型的项目,大家可以在此基础上进行不断改进,做出一个完整的项目,在面试的时候可以向面试官介绍自己做的这一项目。 另外,在数学建模中,数据占据十分重要的地位。大家在选题的时候就应该考虑到数据的来源、在研究过程中需要对数据进行处理、在得出结论的时候需要对数据进行分析。这一过程需要同学们具备许多数据分析处理相关的技能,掌握了这些技能有利于大家今后从事数据分析相关岗位。 5. 参赛论文能转化为论文发表 美赛需要大家最终提交一篇英文论文,对大家几天研究成果进行总结。在此过程中,同学们对英文论文撰写的相关要求也有了一定的了解。在参加完比赛后,美赛论文还有很大的价值等待大家挖掘,即转换为论文发表。 各位可以研究参赛论文中具有科研价值的点,将其放大并做相关研究,便可以把参加论文转换为一篇论文发表。如果大家对此没有经验,可以联系计算机保研岛,有资深的学长学姐对大家进行指导。 如果同学们能在比赛中拿到较高的奖项,这绝对是一个加分项,对于申请顶尖的院校也有不小的帮助。大家可以在优秀参赛论文的基础上产出其他成果。若各位在本科阶段便有论文发表经历,这对于大家今后保研、找工作都有很大的帮助。所以岛主建议大家尽量参与这项比赛。 三、 关于参加美赛的一些建议 1. 对保研来说含金量不如ACM等,但值得尝试 对于顶尖的院校比如清北交浙这几个计算机专业强校,美赛的奖项在某些评审老师来看是没有特别大的加分项的,他们更看重ACM、Kaggle等知名的编程算法类竞赛。但此类比赛一般比较硬核,如果不是长时间系统训练过的同学很难拿到优异的成绩,时间成本较大。与之相比,美赛的时间成本较低,获奖相对来说较容易,对于大部分同学来说是一个不错的选择。 2. 尽量跨学院组队,队友很重要 美赛一般需要3人组队参加,同学们在选择队员的时候尽量跨学院组队。对于计算机专业的同学来说,可以选择数学学院、英语学院的同学组队参加。一般来说,数学学院的同学数学建模能力较强,英语学院的同学论文写作能力较强,而来自计算机学院的各位编程能力较强。跨学院组队才能最大限度地发挥团队的优势,大家各司其职,在规定的时间内完成指定任务。 另外,同学们在选队友的时候尽量选择靠谱的队友,有参赛经历优先。团队合作需要大家共同努力,才能在短时间内完成任务。而一旦有一方临阵脱逃,这将在一定程度上加大其他队友的工作量,也会影响大家的进度。 3. 注重英文写作,LATEX用起来 美赛需要大家提交英文论文,这对同学们的英文写作水平有着不低的要求。大家在备赛的过程中可以多阅读历年获奖的优秀论文,学习他人使用的高级词汇、表达方式等,并将其运用到自己的论文中。另外,岛主建议大家尽量使用LATEX排版,不会的同学应尽早学习。 4. 选题需谨慎,数据很重要 比赛一般会为大家提供几个赛题,同学们在选择的过程中一定要谨慎。在阅读完所有题目后,应该选择各位把握度最高、有较多想法的题目,这样有利于大家后续工作的开展、在研究中体现创新性。 同时,在选题时需要考虑数据来源,尽量选择有公开数据集的题目,能找到数据支撑。岛主不太建议大家自己造数据,往往会带来不小的麻烦。 四、总结 数学建模美赛能很好地锻炼大家各方面的能力,如英文能力、建模能力、沟通能力等。同学们在参赛的过程中收货了知识、增长了才干、结识了新的朋友,是各位大学时期较为珍贵的经历。若能成功获奖,在丰富自身简历的同时对今后的各类面试也有帮助。因此,岛主建议大家尽早报名,认真备赛,预祝同学们都能取得满意的成绩。

esp01s如何烧录、接线///arduino串口想输出字符串,但是输出了数字

esp01s与usb转ttl接线: esp01s连线usb转ttl3V3---------3V3GND---------GNDRX---------TXDTX---------RXDIO0---------GND IO0接地作用是:进入烧录模式, IO0接地之后需要断电,重新上电。 完成烧录后需要 断开 IO0与GND否则程序无法运行。 arduino串口想输出字符串,但是输出了数字 int RXString; if(Serial.available()>0) { RXString = Serial.read(); Serial.write(RXString); } 这是一个串口透传代码:即接收到来自串口数据就立即发送出去。 遇到的问题是,串口输入字符串,输出的是数字。 比如输入A,输出65 实际上,65是ASCII码的“A”,所以arduino的串口输出并无错误。 那么如何输出“A”呢,只需要将输出RXString转换成char即可 int RXString; if(Serial.available()>0) { RXString = Serial.read(); Serial.write(char(RXString)); }

vxe-table的样式,涉及边框

vxe-tabel 相关样式 关于table //每一行悬浮 .vxe-table--render-default .vxe-body--row.row--hover{ background: rgba(25,254,255,0.10) } //展开三角箭头效果 .vxe-table--render-default .vxe-tree--node-btn{ color: rgba(25,254,255,0.20); } //展开三角箭头悬浮效果 .vxe-table--render-default .vxe-tree--node-btn:hover{ color: rgba(25,254,255); } //表头边框颜色 .vxe-table .vxe-table--header-wrapper .vxe-table--header-border-line{ border-bottom-color: rgba(25,254,255,0.10); } //表内容的边框颜色 .vxe-table--render-default.border--inner .vxe-body--column { background-image: linear-gradient(rgba(25,254,255,0.10),rgba(25,254,255,0.10)); } 有关于多选框 //修改多选框还未选中的样式--涉及背景和边框 .vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--icon:before{ background-color: transparent; border-color: #19feff; } //悬浮的样式 .vxe-table--render-default .vxe-cell--checkbox:not(.is--disabled):hover .vxe-checkbox--icon:before{ background-color: transparent; border-color: #19feff; } //选中时对勾的颜色 .vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--checked-icon:after{ border-color: #19feff; } //子集选择之后,父级多选框-(横条)的颜色 .vxe-table--render-default .is--indeterminate.vxe-cell--checkbox .vxe-checkbox--icon:before{ background-color: transparent; border-color: #19feff; } //父级选中后,子集的多选框颜色 .

cesium 地图无法加载 报错401 缺少token

cesium 地图无法加载 报错401 缺少token 首先,报错401 说明用户没有访问权限,需要进行身份认证,也就是cesium需要密钥,也是最近实行的吧,因为之前不用也能加载出地图。 token 密钥获取 token 获取地址[https://cesium.com/ion/tokens?page=1] (https://cesium.com/ion/tokens?page=1) 首先需要注册登录 进行如上操作后,右边栏就是你的token 使用的时候只需要复制token,再地图viewer创建前声明 即可加载地图 initMap() { Cesium.Ion.defaultAccessToken = "你的token" var viewer = new Cesium.Viewer('mapcontainer'); return viewer },

SpringCloud-Spring Cloud Alibaba Nacos集群架构(Day11)

Nacos集群架构 nacos默认自带的是嵌入式数据库derby,在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤: 安装数据库,版本要求:5.6.5+初始化mysq数据库,数据库初始化文件: nacos-mysql.sql修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。 ############################################################ spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456 修改数据库 修改集群地址配置 cp cluster.comf.example cluster.conf 192.168.0.135:3333 192.168.0.135:4444 192.168.0.135:5555 修改Nacos启动脚本 while getopts ":m:f:s:p:" opt do case $opt in m) MODE=$OPTARG;; f) FUNCTION_MODE=$OPTARG;; s) SERVER=$OPTARG;; p) PORT=$OPTARG;; ?) echo "Unknown parameter" exit 1;; esac done # start echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 & nohup $JAVA -Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 & echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out" 启动  ~/Downloads/nacos/bin/ .

手把手教写拖拽和布局插件(求小星星)

最近看了《某科学的一方通行》,突然就很喜欢一方通行大爷的性格和爽朗的笑声,于是打算写一个小插件碰瓷一下一方通行大爷的名字。 插件地址 功能 定位拖拽(可用键盘上下左右键控制)(可通过选框多选拖拽)缩放参考线吸附 安装 npm install acceleratorkunn然后就可以使用了,需要传入一个DOM对象,这个DOM对象必须要拥有父元素 import {Accelerator} from 'acceleratorkunn' const domEl = document.createElement('div') document.body.appendChild(domEl) new Accelerator(domEl) 如果是在vue中使用的话有更加简单的方式: import { VueAccelerator } from 'acceleratorkunn' Vue.use(VueAccelerator) 然后就会全局注册一个v-accelerator的vue指令,和一个accelerator组件。 指令使用方法: <div v-accelerator></div> 组件使用方法: <accelerator></accelerator> 更复杂的用法后面再讲。 参数 new Accelerator(domEl,config)接收两个参数: domEl : 之前解释过,这个参数必须是一个DOM对象,而且必须拥有父元素。必填。config : 配置,(Object) config.x (String | Number) 默认值:'0px’ domEl的x坐标,等同于绝对定位中的left。这个值可以是数字,也可以是字符串,但只支持’px’和’%‘两种单位,没有单位则默认是’px’,例:10,‘10’,‘10px’,'20%'等等。 注意,当单位是’%'的时候,如果父元素的尺寸发生改变,domEl的x坐标会根据百分比来重新计算改变位置,例:父元素宽度为800px,设x为20%,那么此时domEl的left应该是160px。当父元素宽度变为1000px时,此时domEl的left会重新计算变成200px。注意,当没有传这个参数时,如果domEl本身就是绝对定位元素,会优先取该元素的left值,单位为’px’ config.y (String | Number) 默认值:'0px’ domEl的y坐标,等同于绝对定位中的top。这个值可以是数字,也可以是字符串,但只支持’px’和’%‘两种单位,没有单位则默认是’px’,例:10,‘10’,‘10px’,'20%'等等。 注意,当单位是’%'的时候,如果父元素的尺寸发生改变,domEl的y坐标会根据百分比来重新计算改变位置。例:父元素高度为800px,设y为20%,那么此时domEl的top应该是160px。当父元素高度变为1000px时,此时domEl的top会重新计算变成200px。注意,当没有传这个参数时,如果domEl本身就是绝对定位元素,会优先取该元素的top值,单位为’px’ config.width (String | Number) 默认值:'200px’ domEl的宽度。这个值可以是数字,也可以是字符串,但只支持’px’和’%‘两种单位,没有单位则默认是’px’,例:10,‘10’,‘10px’,'20%'等等。 注意,当单位是’%'的时候,如果父元素的尺寸发生改变,domEl的宽度会根据百分比来重新计算改变位置。例:父元素宽度为800px,设width为20%,那么此时domEl的宽度应该是160px。当父元素宽度变为1000px时,此时domEl的宽度会重新计算变成200px。注意,当没有传这个参数时,会优先取domEl元素的宽度width,单位为’px’ config.height (String | Number) 默认值:'200px’ domEl的高度。这个值可以是数字,也可以是字符串,但只支持’px’和’%‘两种单位,没有单位则默认是’px’,例:10,‘10’,‘10px’,'20%'等等。

手把手教写拖拽布局插件(多选以及多选拖拽篇)

之前的拖拽缩放开发完了,但是只能单个单个操作,很多时候布局的时候是想多个元素作为一组一起移动的,所以还需要多选功能。先放效果图: 完成这个功能有几个问题需要考虑: 虚线选框怎么写怎么判断哪些元素被虚线选框选中了被多选的元素怎么一起移动 问题解决 1.虚线选框怎么写? 虚线选框我直接使用的div元素配合css样式来实现。 在window上绑定mousedown、mousemove和mouseup事件。 mousedown事件记录鼠标点下的位置,并将虚线选框的定位定到这个位置。 mousemove事件实时更新虚线选框的宽度和高度 mouseup事件将选框隐藏 2.怎么判断哪些元素被选中了? 在mousemove事件中判断。判断选没选中就是判断两个元素有没有相交。相交的方式多种多样,不是很好写,那我们证明相交可以换一种思路,可以证明两个元素不相交,两个长方形在什么情况下不相交呢?看下图: 这是两个不相交的长方形,这两个长方形不相交需要满足以下两个条件的其中一条即可: 区间 [a1,a2] 和区间[x1,x2]没有重叠部分区间 [b1,b2] 和区间[y1,y2]没有重叠部分 使用getBoundingClientRect()方法得到两个div的left,top,width,heigh。然后判断这两个元素如果没有不相交,即是相交。 3.被选中的元素怎么一起移动? 拖拽并移动的时候,先判断一下当前被选中的有几个元素,如果只有一个元素被选中,那被拖动的就是当前的这个元素。如果有不止一个元素被选中,那就让所有被选中的元素都按照鼠标拖动的规律一起动。

手把手教写拖拽布局插件(环境搭建篇)

最近看了《某科学的一方通行》,突然就很喜欢一方通行大爷的性格和爽朗的笑声,于是打算写一个小插件借鉴一下一方通行大爷的名字。 这个插件主要功能设想是赋予任何元素任意定位,可以拖拽,可以缩放大小,解决的问题是方便页面布局,然后封装vue指令,方便在vue项目中使用,任何变态布局都可以轻松通过可视拖拽完成。 设想设想,这个只是设想,不代表都会实现哈 环境搭建 首先是环境搭建,由于我也是个小菜鸡,写之前构思了一下思路: 由于我要写的是js插件,所以当然是使用webpack来将es6解析成es5,然后打包成一个文件在开发时我需要启动一个本地服务来运行我写的开发用的例子打包的时候需要压缩代码,并且能够输出实际的代码可以发布npm包,供我自己爽一下 来一一解决问题: webpack来将es6解析成es5,然后打包成一个文件: 使用 @babel/core,@babel/preset-env,babel-loader,webpack,webpack-cli 在开发时我需要启动一个本地服务来运行我写的开发用的例子: 使用 html-webpack-plugin,webpack-dev-server 打包的时候需要压缩代码,并且能够输出实际的代码: 编写两套webpack配置 可以发布npm包,供我自己爽一下 后面有,后面有,首先注册一个npm的账号哈 1.安装依赖 npm install @babel/core @babel/preset-env babel-loader webpack webpack-cli html-webpack-plugin webpack-dev-server -D 2.编写webpack.dev.config.js const path = require('path') // 引入path路径 const HtmlWebpackPlugin = require('html-webpack-plugin') // 引用解析html module.exports = { // 默认导出 mode: 'development', // 打包模式为development,开发环境,代码不会压缩 entry: path.join(__dirname, 'example', 'index.js'), // 需要打包的代码路径,入口文件,webpack会从改入口文件不断延伸查找所需依赖 output: { // 打包完成输出的配置 libraryTarget: 'umd', //类库加载方式 filename: 'bundle.js', // 输出的文件名 path: path.join(__dirname, 'example' ,'dist') // 输出的文件夹 }, module: { rules: [ { test: /\.

vue3 配置storybook报错 : Cannot find module ‘vue/dist/vue.esm.js‘

前言 之前想让自己的组件库更完善所以配置jest,搞了好久,在解析jsx语法中的slots.default!()这句话是就报错,最终搁置了,今天想让自己的组件库添加storybook,感觉被官网坑了一上午,不过好歹成功了 报错产生原因 Cannot find module ‘vue/dist/vue.esm.js’ 我就是按照官网执行了初始化命令 初始化的时候没报错 结果一执行下一步 npm run storybook 就出现了此问题 、 解决方法 后来 搜谷歌 地址:https://github.com/storybookjs/storybook/issues/10654 我直接把node moudules删掉重来 npm i 执行 npx sb@next init 重新初始化ok了 注意你的package.json vue3 不能没有3 不然不是一个东西

react中使用Iframe嵌入HTML页面

react中使用Iframe 安装 react-iframe插件父组件掉用子组件iframe向父组件传递数据(我用的是jq写的iframe页面) 安装 react-iframe插件 import React from "react"; import ReactDOM from "react-dom"; import Iframe from "react-iframe"; export default class FrameLoader extends React.Component { constructor(props) { super(props); this.state = { iFrameHeight: this.props.height ? this.props.height : 0, // 设置iframe的高度 }; } componentDidMount() {} render() { return ( <Iframe onLoad={() => { const obj = ReactDOM.findDOMNode(this); this.setState({ iFrameHeight: obj.contentWindow.document.body.scrollHeight + "px", }); }} frameBorder="0" height="100%" width="100%" position="absolute" scrolling="no" // 接收到的 Iframe 的URL地址 url={this.

一次macOS的升级填坑(macOS Catalina - macOS Monterey)

目录 小序一、升级前操作二、升级中三、问题填坑1、像我一样长时间卡在一个进度条怎么办2、在更新途中重启过电脑(完整流程填坑)3、安装之后不能开机,如何紧急拷贝资料4、安装不成功,如何重新安装系统5、找客服 四、总结 小序 在开始唠叨之前,请先容我唠叨一下事情的经过。在 2021 年 6 月 7 日的苹果 WWDC 开发者大会上发布macOS Monterey,本着尝鲜的态度,想要去体验一波(说实话在之前压根没看更新了啥内容,因为我这个本子从买来之后就一直没升过级,版本很落后,界面很low,就想升级一下版本,再加上从某哩某哩听了某个大佬的一顿吹捧,我踏上了一条不归路)。而且还是没有任何准备的内种,本以为和iphone升级一样,等一等就好了,可是!它变成了这个样子,卡在了这里,一动不动。接下来我会从升级成功的角度,教大家怎么做。 一、升级前操作 **错误示范:**先看一下我的本子配置,在升级之前,没有多想,因为我这个本子相对来说比较新,就直接开始升级了。流程大概就是,在自己的系统偏好设置里面下载了最新的系统,然后直接重启更新。 正确示范: 应该先去官方了解是否需要更新,如果更新的内容你八百年都用不到,那我建议你打消这个念头。比如我想要用到XCode这个软件,但是发现他现在只支持11.3以上的mac系统,而我的是10.15,这也是我升级的原因之一。苹果的官网还是比较全面的,你去搜一下系统的名字就可以找到对应的更新点了。例如:macOS Monterey你应该了解你的硬件设施是否支持此次更新,比如你用了一台骨灰级别的mac,现在想要更新最新的系统,这就好比有了窜天猴想造火箭,比登天还难。同样这个信息也可以在官网中查找到。 去某哩某哩或某SDN上找找前人的填坑经历,很有用,先看完,了解到你可能遇到的风险及解决方案,然后再去做。去一个网络好的环境,最好是家里内种WIFI,切记不要公司内网,也不要连网线。断掉一切外界设备,例如,显示器外屏,转接口等,不要断电源哦,要保持电源畅通。备份自己的资料。很重要!很重要!很重要!如果你只有一个mac电脑,没有iphone和其他苹果设备,请记得抄一下序列号,或者找到装mac电脑的盒子(有序列号),方便最后实在没办法去找客服。 二、升级中 错误示范: 看见自己的电脑卡着不动了,就想重启它把它放在一边不管 正确示范: 偶尔看一下自己的电脑,让自己的电脑不要熄灭。即使遇到卡顿,长时间不动也不要管他。尤其是大版本升级,会有可能长时间卡到一个点,就比如我这个从10-12,本来升级就需要更多的时间,结果心急重启了。 三、问题填坑 1、像我一样长时间卡在一个进度条怎么办 如果时间在一个小时之内,我觉得你可以再等等,因为考虑到网络延迟、电脑硬件等问题确实会造成更新版本卡顿的问题。如果像我一样手贱重启过电脑,那你可能需要进行下一步操作(请看第2点) 2、在更新途中重启过电脑(完整流程填坑) 首先,恭喜你,你离一块砖很近了!其次,先不要想让自己的电脑恢复如初了,先要想一下自己的电脑里有没有什么贵重的资料、种子什么的。如果有,那么请问是否备份,如果没备份,那么再次恭喜你,和我一样了,请按如下步骤操作: 1、把电脑关机。 2、同时按住电脑右shift(为什么是右shift?因为左shift没试过。)和电源开机键不要撒手,观看是否能开开机。按照上述操作是打开了苹果的安全模式,如果能开开机,说明你这个电脑只是简单的没有装上系统,一会可以重新装一下。如果不能开机,那么恭喜你,去找客服吧(请见第5点) 3、能开开机的情况下,你可以耐心的去把自己的电脑按提示操作好(其实就是和一开始买机子一样,选择语言注册账号,巴拉巴拉的,不过需要提示的是,安全模式会非常非常卡,这很正常,需要你保持一个良好的心…态) 4、打开安全模式的目的其一在于校验你这个电脑是否不可由你操作(自己能不能搞定),其二在于可以进入系统拷贝资料(如果已经备份,可忽略4、5点)。因为进入安全模式的情况下,你的磁盘是没被格式化的,拷贝资料的目的在于以防后续更新系统之后,丢失文件(有一定几率)。至于怎么找到资料,可以通过前往->电脑->磁盘->用户->具体你自己的用户来找到(因为macOS和linux都是秉承着一切皆文件的思想去管理你的东西,所以可以在文件中找到对应的信息)。 5、然后进入下一步,拷贝资料。首先安全模式是不能识别外接U盘等设备的,所以不能通过硬件设备拷,方法一:通过邮件,将你的文件打包发出去。方法2:下载能够上传文件的软件,比如阿里云盘(不限速)、百度网盘等,这个前提是你知道系统管理员的账号和密码,能够下载软件。如果和我一样手贱将管理员和普通用户搞的乱七八糟,那你只能通过其他方法了。方法3:可以通过移动硬盘当启动盘,然后在插入U盘将你的文件拷走。(我没试过,但是很肯定能用) 6、开始准备重新装系统。把自己的电脑关机,将 Mac 开机并立即按住 Command (⌘)-R,直至看到 Apple 标志或其他图像。然后稍等片刻你可以看到如下场景: 同样,如果你有备份,可以选择从时间机器恢复。如果和我一样,没有备份,那你可以尝试点击第二个重新安装系统。需要注意的是,选择第二个有可能会失败。如果和我一样失败了,那么恭喜你可以进行下一步了。附:官方重新安装macOS 7、重复操作6中的开机操作,选择第四项,抹掉磁盘,然后重装系统,如下图。 8、经过漫长的等待,你也许成功了,如果没有,那么你可能需要找客服了。 3、安装之后不能开机,如何紧急拷贝资料 参考第二点中(12345小点),打开安全模式并备份或插入U盘当启动盘备份。 4、安装不成功,如何重新安装系统 参考第二点中(6小点),重新安装macOS或重新安装macOS 5、找客服 首先,在苹果官网找到对应的问题 其次,然后填入自己的序列号。填邮箱,手机号,姓氏,姓名等信息。尽可能打电话,因为更简单。PS:客服小姐姐态度非常好,而且很专业。 四、总结 其实还有一种用mac重装mac系统的方法没有展示,因为需要另外准备一台电脑然后下载Apple Configurator2进行重装。 不打无准备的仗,不要想一出是一出,不要过于信赖机器。及时拷贝资料,安装。或找专业人士安装才是正道。不懂就去多百度,也就是因为在网上找不到我这种例子,我才去写这个玩意。可以去苹果官网转转,因为苹果的生态还是比较健全,服务也比较好,毕竟钱摆在这里了。接下来会连续发一些环境或软件的安装,毕竟我只拷贝了重要资料,其他的app都丢了。在日常开发,尽量要登录账号,然后上到云端,这个时候你重装软件只需要登个账号就都解决了

自定义Gradle插件实现打包上传到蒲公英

上一篇文章提到了关于如何写Gradle自定义插件Plugin,本篇文件介绍下如何写gradle插件实现打包上传到pgy。 要实现打包上传到蒲公英必须要弄清楚以下问题: 1、什么时候打包完成?监听到打包完成才能执行下一步的上传操作 Gradle的打包也是一组组的Task任务,每个任务都有一个dependsOn()方法,我们只要在Assemble打包任务执行完了以后,再执行就可以了,即让我们的上传任务dependsOn打包任务就可以了。 2、怎么上传? 蒲公英api文档:http://www.pgyer.com/doc/api#uploadApp 3、build.gradle文件内配置的参数怎么获取? 通过org.gradle.api.Project这类获取。Project是支持扩展的,我们可以自定义一个Extension的数据类型,作为Project的一个扩展。 在Project里面有个回调方法afterEvaluate(),它会在构建完成后执行。我们需在这个方法里,获取自定义的Extension就可以了,即执行:project.getExtensions().create(PLUGIN_EXTENSION_NAME, PGYExtension.class) 先看下工程目录: 具体实现: 1、包含配置参数的模型: package com.shengqf.plugin; import org.gradle.api.Project; public class PGYExtension { public String uKey; public String apiKey; public String installType; //1:公开,2:密码安装,3:邀请安装。默认为1公开 public String password; 安装密码 public String updateDescription; //版本更新描述,请传空字符串,或不传 public PGYExtension() { } public PGYExtension(String uKey, String apiKey, String installType, String password, String updateDescription) { this.uKey = uKey; this.apiKey = apiKey; this.installType = installType; this.password = password; this.updateDescription = updateDescription; } public static PGYExtension getConfig(Project project) { PGYExtension extension = project.

给定一个整数数组和目标值,在该数组找出和为目标值的两个整数并返回下标

#include<iostream> using namespace std; #include<vector> class sum { public: void two(vector<int>p, int dst) { for (int i = 0; i < p.size(); i++) { for (int j = 0; j <i; j++) { if (i != j) { int sum = p[i] + p[j]; if (sum == dst) { cout << "目标元素1:" << p[i] << "\t下标:" << i << endl; cout << "目标元素2:" << p[j] << "\t下标:" << j << endl; } } } } } }; void test() { vector<int>p; p.

gradle打包流程(一)--- 整体把控

前言: 关于gradle打包流程,大的可以分为以下几个方面: 一、对gralde打包流程的整体把控。 二、对gradle的进一步理解,这其中包括:gradle到底是什么,gradle的项目层次结构,gradle的一些依赖指令,gradle wrapper,自定义task,手写插件。 三、对gradle的深入分析,这其中包括:gradle的主要task分析等等。 这篇文章先说下对gradle打包流程的整体把控。 Android构建系统编译应用资源和源代码,然后将它们打包成可测试、部署、签署和分发的APK或Android App Bundle。 我们使用Android Studio开发的时候,使用gradle构建工具包来自动执行和管理构建流程,同时也可以 灵活地自定义构建配置。 Gradle和Android插件是独立于Android Studio运行的,所以我们除了可以在Android Studio上构建Android应用外,还可以通过命令行构建Android应用。 构建流程图: 编译器将源代码转换成DEX文件(Dalvik可执行文件,其中包括在Android设备上运行的字节码),并将其他所有内容转换成编译后的资源。打包器将DEX文件和编译后的资源组合成APK或AAB。必须先为APK或者AAB签名,然后才能将应用安装到Android设备或分发到Google Play等应用商店。打包器使用调试或发布密钥库为APK或AAB签名。在生成最终APK之前,打包器会使用zipalign工具(zipalign 是一种 zip 归档文件对齐工具。它可确保归档中的所有未压缩文件相对于文件开头都是对齐的。)对应用进行优化,以减少其在设备上运行时所占用的内存。 build配置文件: Android Studio会与Android Plugin for Gradle这个构建工具包协作,当我们在Android Studio中开始一个新项目时,会自动创建一些文件,并为其填充合理的默认值。Android应用模块的默认项目结构如下: 创建自定义build配置需要对这些build配置文件(即build.gradle文件)做出更改。这些纯文本文件使用领域特定语言(DSL)以Groovy描述和操作构建逻辑。其中Groovy是一种适用于Java虚拟机(JVM)的动态语言。 Gradle设置文件(settings.gradle文件)位于项目的根目录下,用于指示Gradle在构建应用时应将哪些模块包含在内。对于多模块项目需要指定应包含在最终build中的每个模块。顶层构建文件(顶层build.gradle文件)位于项目的根目录下,用于定义适用于项目中所有模块的构建配置。默认情况下,顶层构建文件使用buildscript代码块定义项目中所有模块共用的Gradle代码库和依赖项。注意,模块的依赖项不要放在顶层build.gradle文件的buildscript中,而应该放在具体模块的build.gradle文件中。对于包含多个模块的项目,可能有必要在项目级别定义某些属性并在所有模块之间共享这些属性,为此,可以将额外的属性添加到顶层build.gradle文件内的ext代码块中。(当然,实际上我们应该避免这样做,因为这样会导致共享这些属性的模块相互结合,使得以后将模块作为独立项目导出更加困难。)模块级构建文件(模块级build.gradle文件)位于每个project/module/目录下,用于为其所在的特定模块构建设置。我们可以通过配置这些构建设置提供自定义打包选项(如额外的构建类型和产品变种),以及替换main/应用清单或顶层build.gradle文件中的设置。Gradle属性文件。Gradle还包含两个属性文件,它们位于项目的根目录下,可用于指定Gradle构建工具包本身的设置:gradle.properties和local.properties。我们可以在gradle.properties文件中配置项目全局Gradle设置,比如使用androidX(android.useAndroidX=true)。我们可以在local.properties文件中为构建系统配置本地环境属性,其中包括sdk.dir(SDK的路径)、ndk.dir(NDK的路径,不过此属性已被弃用,NDK的所有下载版本都安装在Android SDK目录下的ndk目录中)、cmake.dir(CMake的路径)、ndk.symlinkdir(在Android Studio 3.5及更高版本中,创建指向NDK的符号链接,该符号链接的路径可比NDK安装路径短)

前端图片下载功能

通过a标签download属性下载 .container { display: flex; } figure { display: flex; flex-direction: column; } img { width: 200px; } 复制代码 <div class="container"> <figure> <figcaption>本地图片:</figcaption> <img src="images/gao.jpg" alt="" /> <a href="images/gao.jpg"> 下载图片1 </a> </figure> <figure> <figcaption>远程图片:</figcaption> <img src="https://ssyerv1.oss-cn-hangzhou.aliyuncs.com/picture/337f923e0cbd4b7b9a328135dec89c62.jpg?x-oss-process=image/resize,w_400" alt="" /> <a href="https://ssyerv1.oss-cn-hangzhou.aliyuncs.com/picture/337f923e0cbd4b7b9a328135dec89c62.jpg?x-oss-process=image/resize,w_400"> 下载图片2 </a> </figure> </div> 复制代码 css和html代码如上,首先我们以File 协议打开页面,就是我们平时最常用的双击一个html文件自动打开的协议格式,类似于 file:///Users/xxx/Desktop/index.html 这种形式的. 点击下载图片就会直接在浏览器打开图片并显示,如下图: 同样的,假如我们启动一个http 服务器,以http 协议来打开页面,比如 vscode 安装了 Live Server 等插件,url格式类似于http://192.168.104.72:8080/index.html 这种形式的. 再次点击两个下载图片结果还是一样的,都是直接在浏览器中打开了. 那么我们有没有什么办法通过a标签来实现直接下载图片呢?有的,在MDN文档中提到了,a标签具有一个叫做 download 的属性.这个属性会指示浏览器去下载URL而不是导航到它.如果这个属性有一个值的话,比如 download="test.png",那么这个test.png 将作为下载下来的图片的图片名.但是这个属性仅适用于同源URL.至于同源URL是啥,这个就不在这里做详细的解释了,不清楚的同学去MDN 看看就明白了,说白了就是浏览器的同源策略. 到现在我们明白了,HTML5中a标签给我们提供了download 属性,就是让我们用来下载的.下面我们将此属性加入进去.修改后的代码如下,其余部分同上面保持一致,这里就不写出来了. <a href="

计算原矩阵Jaccard相似度和签名矩阵的Jaccard相似度

M1和M4的Jaccard相似度为 3/6 M1和M2的Jaccard相似度为 1/7 M2和M4的Jaccard相似度为 2/5 Jaccard相似度是数所求两列中出现1的行数作为分母,都出现1的行数作为分子 基于A的签名矩阵为 [2 3 2 3] 基于B的签名矩阵为 [1 3 3 1] 基于C的签名矩阵为 [1 3 1 1] 所以签名矩阵S为 S1和S2的Jaccard相似度为0 S1和S4的Jaccard相似度为 2/3 S2和S4的Jaccard相似度为 1/3

Java学习笔记 - 微服务的链路追踪

Java学习笔记 - 微服务的链路追踪 1、微服务架构下的问题2、Spring Cloud Sleuth2.1 Sleuth简介2.2 相关概念2.3 链路追踪Sleuth入门案例 3、Zipkin的概述4、Zipkin Server的部署和配置5、客户端Zipkin+Sleuth整合6、基于消息中间件收集数据6.1 RabbitMQ的安装与启动6.2 服务端启动6.3 客户端配置 7、存储跟踪数据7.1 准备数据库7.2 配置启动服务端 1、微服务架构下的问题 在大型系统的微服务化构建中,一个系统会被拆分成许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能部署在了几千台服务器,横跨多个不同的数据中心,也就意味着这种架构形式也会存在一些问题: 如何快速发现问题?如何判断故障影响范围?如何梳理服务依赖以及依赖的合理性?如何分析链路性能问题以及实时容量规划? 分布式链路追踪(Distributed Tracing) 就是将一次分布式请求还原成调用链路,进行日志记录、性能监控,并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。 目前业界比较流行的链路追踪系统如:Twitter的Zipkin、阿里的鹰眼、美团的Mtrace、大众点评的cat等,大部分都是基于google发表的Dapper(http://bigbully.github.io/Dapper-translation/)。Dapper阐述了分布式系统,特别是微服务架构中链路追踪的概念、数据表示、埋点、传递、收集、存储与展示等技术细节。 2、Spring Cloud Sleuth 2.1 Sleuth简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,只需要在pom文件中引入相应的依赖即可。 2.2 相关概念 Spring Cloud Sleuth 为Spring Cloud提供了分布式追踪的解决方案,它大量借用了Google Dapper的设计。 先来了解一下Sleuth中的术语和相关概念,Spring Cloud Sleuth采用的是Google的开源项目Dapper的专业术语。 Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过一个64位ID唯一标识,trace以另一个64位ID表示,span还有其他数据信息,比如摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(通常是IP地址),span在不断的启动和停止同时记录了时间信息,当你创建了一个span,你必须在未来的某个时刻停止它。 Trace:一系列spans组成的一个树状结构,例如,如果你正在跑一个分布式大数据工程,你可能需要创建一个trace。 Annotation:用来及时记录一个事件的存在,一些核心annotations用来定义一个请求的开始和结束。 Annotation介绍: cs - Client Sent:客户端发起一个请求,这个annotion描述了这个span的开始。sr - Server Received:服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络延迟。ss - Server Sent:注解表明请求处理的完成(当请求返回客户端),如果ss减去sr时间戳便可得到服务端需要的处理请求时间。cr - Client Received:表明span的结束,客户端成功接收到服务端的回复,如果cr减去cs时间戳便可得到客户端从服务端获取回复的所有所需时间。 2.3 链路追踪Sleuth入门案例 接下来通过之前博客中的项目案例整合Sleuth,完成入门案例的编写。 (1) 配置依赖 修改相关微服务工程的pom.xml引入Sleuth依赖。 <!--sleuth链路追踪--> <dependency> <groupId>org.

第27课 老狼老狼几点钟 《小学生C++趣味编程》

#include <iostream> using namespace std; int main() { cout<<"老狼老狼几点钟? 1点钟。"<<endl; cout<<"老狼老狼几点钟? 2点钟。"<<endl; cout<<"老狼老狼几点钟? 3点钟。"<<endl; cout<<"老狼老狼几点钟? 4点钟。"<<endl; cout<<"老狼老狼几点钟? 5点钟。"<<endl; cout<<"老狼老狼几点钟? 6点钟。"<<endl; cout<<"老狼老狼几点钟? 7点钟。"<<endl; cout<<"老狼老狼几点钟? 8点钟。"<<endl; cout<<"老狼老狼几点钟? 9点钟。"<<endl; cout<<"老狼老狼几点钟? 10点钟。"<<endl; cout<<"老狼老狼几点钟? 11点钟。"<<endl; cout<<"老狼老狼几点钟? 12点钟。"<<endl; cout<<"狼来了,快跑!"<<endl; return 0; } #include<iostream> using namespace std; int main() { int i; for(i=1;i<=120;i++) { cout<<"老狼老狼几点钟? "<<i<<"点钟。"<<endl; cout<<"看谁跑的快!!"<<endl<<endl; } cout<<"天黑了。"<<endl; return 0; }

SpringBoot日志配置-logback和log4j2

SpringBoot默认使用的 commons-logging 日志框架, 默认的日志输出级别: info 使用commons-logging 配置文件对日志的配置: //只需要在配置文件中更改默认值 //设置日志输出级别为debug Debug=true //日志文件名,比如:suke.log,或者是 /var/log/suke.log logging.file=suke.log //设置目录 logging.path=/var/log //日志级别配置,比如: logging.level.org.springframework=DEBUG logging.level.*=info logging.level.org.springframework=DEBUG 不够灵活, 多环境切换的时候, 对日志文件经常进行修改 使用logback(推荐) spring boot默认会加载:classpath:logback-spring.xml 注意:如果logback的配置文件不叫:logback-spring.xml // 如果日志配置文件名不是logback-spring.xml, 需要在springBoot配置文件中指明使用哪个文件 // logging.config=logback配置文件 logging: config: classpath:logback-demo.xml logback-spring.xml : <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 文件输出格式 --> <property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" /> <!-- test文件路径 : 测试环境,日志保存路径 更改文件夹地址,文件夹不存在会自动创建**(更改)--> <property name="TEST_FILE_PATH" value="d:/opt/hj/logs" /> <!-- prod文件路径 :生产环境 , linux系统--> <property name="

linux安装mysql

linux版本mysql下载地址 文章目录 linux版本mysql下载地址1.安装lrzsz2.上传文件3.解压4.移动并修改权限5.创建数据目录并赋权限6.配置my.cnf7.初始化数据库8.修改root密码解决linux下无法输入中文字符 本用户使用centos8 1.安装lrzsz yum install -y lrzsz 2.上传文件 输入 rz 选择官网下载下来的包进行上传 3.解压 tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz 4.移动并修改权限 mv mysql-5.7.26-linux-glibc2.12-x86_64 /usr/local/mysql groupadd mysql useradd -r -g mysql mysql 5.创建数据目录并赋权限 mkdir -p /data/mysql chown mysql:mysql -R /data/mysql 6.配置my.cnf vim my.cnf [mysqld] bind-address=0.0.0.0 port=3306 user=mysql basedir=/usr/local/mysql datadir=/data/mysql socket=/tmp/mysql.sock log-error=/data/mysql/mysql.err pid-file=/data/mysql/mysql.pid #character config character_set_server=utf8mb4 symbolic-links=0 explicit_defaults_for_timestamp=true 7.初始化数据库 ./mysqld --defaults-file=/usr/local/mysql/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql --user=mysql --initialize 8.修改root密码 查看root密码 cat /data/mysql/mysql.err 将mysql.server放置到/etc/init.d/mysql中 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql 启动

SpringCloud-SpringCloud Bus服务总线的介绍(Day9)

Spring Cloud Bus服务总线 在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。 Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新。Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。Spring Clud Bus目前支持RabbitMQ和Kafka消息队列中间件。 Config Client实例都监听MQ中同一个topic(默认是Spring Cloud Bus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。 使用Spring Cloud Bus的两种方式 通知Config服务端 推荐使用·这种方式,我们仅通知Config服务端,服务端会同时通知所有的客户端进行配置的更新。这样的设置避免了依次调用客户端进行更新而产生工作量问题。 通知Config客户端(客户端传递) 不推荐使用这种方式,我们的客户端本来就有业务在运行,如果那个需要传递消息的客户端节点发生了宕机或其他的问题的话,我们的动态刷新就做不到全局。其次就是破坏了服务端各个节点的功能对等性,最后还有在服务进行迁移是,网络地址发生变化,就会增加更多的修改工作量。

配置本地DNS服务器地址

PC端使用公共DNS Windows系统 1. 在电脑右下角的网络图标上单击鼠标右键可以看到"打开网络和共享中心"选项,点击进入设置 2. 点击左侧的"更改适配器设置" 3. 在选中的网络连接上单击鼠标右键,选择"属性" 4. 单击"网络"选项卡。在"此连接使用下列项目"下,选中"Internet 协议版本 4 (TCP/IPv4)",然后点击"属性",或者直接双击"Internet 协议版本 4 (TCP/IPv4)" 5. 勾选"使用下面的DNS服务地址",然后在"首选DNS服务器"和"备用DNS服务器"框中,键入主DNS服务器地址180.76.76.76和辅助DNS服务器的地址114.114.114.114,点击确定即设置完成 Linux系统 1. 以下设置对所用的Linux系统如Redhat/Ubuntu/Debian/CentOS等都有效,但您必须是管理员root或者具有管理员权限 vim /etc/resolv.conf 2. 在其中加入: nameserver 180.76.76.76 nameserver 114.114.114.114 3. 保存退出,使用nslookup或者dig验证是否可以通过180.76.76.76正常解析www.baidu.com Mac系统 1. 单击最左上角的苹果图标,在下拉菜单中点击"系统偏好设置"进入设置 2. 单击"网络"图标进入网络设置 3. 从列表中选择相应的网络连接服务,然后单击"高级"选项 4. 点击DNS的选项卡,然后点击左下角"+",添加180.76.76.76和114.114.114.114,单击"好" 5. 返回到上一级,单击"应用" 6. 在浏览器中测试打开 http://www.baidu.com是否正常

射线法判断一个点是否在多边形内部(js版)

原理 首先我们先随便画一个多边形,为了避免有特殊性,我就画得随意一点: 怎么样,够不够复杂刁钻,然后判断一下P这个点在不在多边形里面,你别告诉我用眼睛看,我打不死你哦。 射线法原理 那到底要怎么办呢,有种方法叫射线法(别问,这方法不是我想出来的),即从P点引出一条射线,看这条射线和多边形相交的次数。 假如P点在多边形外,那么P点射线和多边形相交情况一定是: 穿入 -> …(中间可能有N次穿入穿出)… ->穿出,即穿入穿出的次数是偶数次,交点是偶数个。 假如P点在多边形内,那么P点射线和多边形相交的情况一定是: 穿出 -> …(后面可能有N次穿入穿出)…,总之最后一定是穿出,交点是奇数个。 是不是听不懂,我写得也有点晕乎,接下来看图吧: 一般情况 首先是P点在多边形外: 要么一个相交点也没有,要么是双数个 然后是P点在多边形内: 相交点总共是1个或者奇数个 特殊情况 因为所有方向的射线都是一样的,所以为了分析方便,我们使用从P点开始的一条水平线作为射线来分析。 然而还有特殊情况: P点在多边形顶点上 这个还是很好判断,通过对比P的坐标和多边形顶点坐标就可以了 P点在多边形线段上 可以求P点射出的射线和线段AB的交点,假如交点的坐标等于P点,那么P点就在多边形的线上 P点和多边形的交点是顶点 实际上明眼很容易看出P点不在多边形内或多边形上,但是交点只有A点一个,这样就不符合射线法的判断标准了。因为我们变通一下,判断一下,P点的射线,和AB,AC线段有没有相交,如果相交次数是偶数,就没有在多边形里,相交次数是奇数,就算在多边形里。 判断线段有没有和射线P相交,只需要判断线段的两个端点是不是在P点两侧,将A点判定为在射线的上侧,那么现在就可以判定,射线P和AB,AC都相交,相交两次为偶数。 P点的射线刚好经过多边形的一条边 按照刚刚第三点的解决方案,线段AB的两个顶点都在射线P上侧,所以没有和P相交,射线P和AF,BC线段相交两次为偶数,所以P在多边形外。 而射线P1,根据第三点的方案,ED两个顶点都在线段上方,所以线段ED没有和P1相交,线段FE,CD也没有和P1相交,相交次数为0,所以P在多边形外。 P点的射线刚好经过多边形一条边,并且P点在这条边上 这种情况按照第四点的解析方法会判定成不相交,所以还需要判定一下,假如E点D点P点y坐标相等,同时P点的x坐标在ED的x坐标中间,就可以判定为第五种特殊情况。 代码解析 原理分析完毕,现在开始撸代码,js版本哦,我只会js了: /** * p :[x,y] ,带判定的P点 * poly: [[x0,y0],[x1,y1]......] 多边形的路径 */ function rayCasting(p, poly) { // px,py为p点的x和y坐标 let px = p[0], py = p[1], flag = false //这个for循环是为了遍历多边形的每一个线段 for(let i = 0, l = poly.

SPSS配对T检验

参考 SPSS如何进行配对样本T检验 SPSS如何验证是否符合正态分布 问题对象:配对样本T检验用来检验来自两配对总体的均值是否在统计上有显著性。即两总体的均值是否真正存在“差异”,而不仅仅是由于实验对象差异所产生的差异,其实并没有区别的情况。