关于ESP8266反复启动问题的解决

ESP8266刷不同固件后,有时会出现反复启动的问题,可能是FLASH里有未擦除干净的区域。 网上有很多清除方法,基本都是介绍在Python环境下擦除FLASH,对于菜鸟来说有点复杂。 无意中发现,乐鑫 官网提供的FLASH工具,里面就有ERASE,使用十分方便, 乐鑫 Flash 下载工具 版本低的可能没有这个选项 擦除后再刷固件就正常了。 如果擦除不正常,请检查端口COM是否正确 

Windows server WSUS补丁服务器搭建

写在前面 关于微软Windows操作系统补丁更新,针对于客户生产环境补丁更新,为了安全起见不得不建议搭建相应的补丁服务器,利用自动或者手动更新指定服务器的最新补丁。借用闲暇时间做相应的总结,方便后期工作中参考。 搭建条件 首先安装相应的.NET环境,IIS环境, 存放补丁包,需要充裕的磁盘空间。 搭建过程 首先下载Wsus 3.0的安装文件,这里给出简体中文版的下载地址,速度还是不错的, http://download.microsoft.com/download/ 下载完成后安装文件的名称为WSUSSetup_30SP1_x64.exe,以下是通过Windows Server2008 R2操作系统上部署WSUS,,另外,在Windows Server 2008 R2 版本,可以不需要下载WSUS安装包,具体部署过程如下。 安装 1. 安装之前首先通过操作系统功能------>"添加功能"----->“.NET” 2、通过添加角色---> "Web服务器(IIS)"或"Windows Server Update Services" 3.该过程直接点击下一步。 4.这里出现一个安装程序正在准备安装的对话框,不过等待时间非常短。如果你这时还想到不要安装Wsus 3.0的话就可以点击这个“取消”了。 5.如果上一步没有点击取消,就会进入“许可协议”的对话框,当然你得选择“我接受许可协议条款”,并“下一步” 6.接着出现了一个提示对话框“使用管理UI所需的组件”,提示我的计算机上没有安装 “Mircrosoft Report viewer 2008 Redistributable”组件,不过这个没关系,可以在安装完Wsus 3.0后再单独安装这个组件。点击“下一步”! 7.“选择更新源”对话框,“本地存储更新”是决定把更新包下载到本地服务器的硬盘上供客户端下载安装,还是让客户端直接去微软的服务器下载。这里当然选择“本地存储更新”了,这里可以说一个本地存储的好处,假如你的局域网内有其它机器不能上网的话,安肯定要选择这一项了,但选择这一项必须要求存储磁盘为NTFS格式,并且有足够的空间。点击“浏览”选择好储路径,并“下一步”。 8.进入“数据库选项”,指定Wsus 3.0数据存储的位置,如果你的局域网中安装有其它的SQL 2005数据库服务器就可以选择第三项或第一项,否则选第一项,这里我选第一项,但不更改了数据库程序的安装位置为D盘,并下一步。 9.进入“网站选择”对话框,这里如果你的服务器上这安装有其它的网站一定要选第二项,否则会有冲突,但现在我的服务器上没有其它网站所以选择默认的第一项。并“下一步”。如果选择第二项就会重新在服务器上建立一个IIS站点并且端口为8530,其它设置一样。 10.进入“准备安装Wsus 3.0”的对话框,这里将显示出上面步骤的设置情况,可以检视一下,如果没有问题点击“下一步”开始安装。 11.进入“正在安装”的对话框。耐心等待一段时间,当然这时候你可以去下载上面提到的“Mircrosoft Report viewer 2008 Redistributable”方便接下来的安装。 12.等了大约7-8 分钟终于安装完成了,点击“完成”。 配置 1.安装完成后会自动进入“Wsus 3.0配置向导”,这里没有可设置项,直接点击下一步。 2.进入“加入Mircrosoft Update改善计划”对话框,这里我我没有选择“是的,我希望加入Mircosoft Update改善计划”,可以取不选择改善计划。“下一步”。 3.进入“选择<上游服务器>”的对话框,这里选择默认即可,如果你的局域网中已经有另一台Wsus服务器存在,那么也可以选择第二项,从向一个Wsus服务器同步更新。不过需要设置好另一个Wsus服务器的服务器名和端口号。设置好后点击“下一步”。 4.进入“指定代理服务器”对话框,如果你的这台服务器是通过代理上网的,这里就需要设置代理参数了。如果服务器直接可以上网,就无需任何设置,直接“下一步”。 5.进入“连接到上游服务器”的对话框,这里可以点击“开始连接”测试跟上游服务器是否连通,并下载一些信息,连接的时间会比较长。等了几分钟终于下载成功,“下一步”。 6.进入“选择语”对框,选择更新下载的语言,这里可以根据你服务器和客户机操作系统的语言种类,选择是“简体中文”或者“繁体中文”。并点击下一步。 7. 手同动步,点击左边树形菜单的同步,出现同步界面如下,正中间上面显示的是历史同步记录,下面显示的是同步详细信息。点击右边操作栏的“立即同步”就可以马上与上游更新服务器同步下载更新了 8、这里补丁服务已部署完成。 测试过程 通过打开WSUS客户端,测试相关功能,通过以下界面可以看到当前所有的更新情况。 如下就可以添加需要更新的计算机或者服务器操作系统: 查看当前WSUS补丁同步情况: 查看相关报告,该过程查看需要提前安装好“Mircrosoft Report viewer 2008 Redistributable”

List用一行代码添加元素

有时候List作为参数,只需要添加一个元素还要用两行代码: List<String> list = new ArrayList<String>(); list.add("test"); 如果想一行代码搞定,可以: 1. 使用Arrays.asList(...args) 直接返回一个List List<String> s = Arrays.asList("1","2","3") 2. 如果引入了Guava的工具包,可以使用他的Lists.newArrayList(...args)方法 List<String> list = Lists.newArrayList("1","2","3") 3. 如果是Java9,可以使用自带的List类 List<String> s = List.of("1","2","3")

Spring Boot项目制作Jar包和Jar包结构的分析

1简介 在出差的过程中,在项目执行的初期,由于需要给客户提供一个可执行的程序,由于当时时间的缘故,采用了提供jar包的形式,因为jar包只要通过 java -jar ***.jar 就可以作为一个独立的程序,可以让其他的程序进行调用服务。现在简单的介绍这个jar包的制作过程和jar包中的结构。 2Jar包制作 可参考博客 Springboot项目(包含第三方jar包)打成jar包方法, 2.1项目结构和jar包制作过程 项目结构如下: jar包制作过程 2.2pom.xml修改位置 2.2.1pom中待修改位置 修改位置如下图所示: 2.2.2项目发布形式修改为jar <packaging>jar</packaging> 2.2.2编译时包含第三方lib 其中如果要制作jar,需要在< plugins >中添加maven插件maven-compiler-plugin,具体的代码如下: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>1.8</source> <target>1.8</target> <skip>true</skip> <encoding>UTF-8</encoding> <compilerArguments> <extdirs>${project.basedir}/src/main/resources/lib</extdirs> </compilerArguments> </configuration> </plugin> 否则在执行maven package时会提示编译时找不到导入的第三方包中相关类的. 2.2.3打包时打入BOOT-INF/lib <!-- 主要配置:将引用的第三方 jar 包打进生成的 jar 文件的 BOOT-INF/lib 目录中 --> <resources> <resource> <directory>src\main\resources\lib</directory> <targetPath>BOOT-INF\lib</targetPath> <!-- <includes> <include>**/*.jar</include> </includes>--> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> 这样在打包时首先执行clean,然后执行package即可完成jar包制作。 3 Jar包结构分析 3.1 jar包目录结构 把jar包使用好压解压之后可以看到jar包中的目录结构如下: 3.2 META-INF 在META-INF目录中有三个较为重要的文件,pom.xml和pom.properties和与maven同级的MANIFEST.MF,其中pom.xml即项目对应的pom.xml,

解决无法使用VI的问题

今天在一台sun solaris 5.10系统使用vi报错: # vi a Unable to setup term:'unknown' missing in the terminfo database: No such file or directory 从这个信息我们很难定位问题,我们用truss命令跟踪一下vi的命令需要调用那些东西: # truss vi execve("/usr/bin/vi", 0xFFBFFE1C, 0xFFBFFE24) argc = 1 resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = 12 resolvepath("/usr/bin/vi", "/usr/bin/vi", 1023) = 11 stat("/usr/bin/vi", 0xFFBFFBF8) = 0 open("/var/ld/ld.config", O_RDONLY) Err#2 ENOENT stat("/lib/libmapmalloc.so.1", 0xFFBFF718) Err#2 ENOENT ...... access("/usr/share/lib/terminfo/", F_OK) = 0 Unable to setup term:'unknown' missing in the terminfo databasewrite(2, " U n a b l e t o s e"

StatefulWidget initState()方法

这个方法的使用一定要注意一点 不然在渲染页面的时候 不会第一个走initState方法 @override void initState() { // TODO: implement initState super.initState(); _getList("服务商家"); //先初使用化数据 } ####要注意的是 一定要调用super.initState()方法 不然的话 界面渲染的时候不会先走这个方法,不调用super的话 会在build之后走这个方法

JVM之内存布局

目录 一、引言 二、经典JVM内存布局 1.Heap(堆区) 2.Metaspace(元空间) 3.JVM Stack(虚拟机栈) 4.Native Method Stacks(本地方法栈) 5.Program Counter Register(程序计数寄存器) 三、线程共享角度的内存结构 一、引言 内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略 ,保证了 JVM 的高效稳定运行。不同的 JVM 对于内存的划分方式和管理机制存在着部分差异。 二、经典JVM内存布局 1.Heap(堆区) Heap 是 OOM (Out Of Memory 内存用尽)故障最主要的发源地,它存储着几乎所有的实例对象,堆由垃圾收集器自动回收,堆区由各子线程共享使用。通常情况下,它占用的空间是所有内存区域中最大的,但如果无节制地创建大量对象,也容易消耗完所有的空间。堆的内存空间既可以固定大小,也可以在运行时动态地调整,通过如下参数设定初始值和最大值,比如 -Xms256M -Xmx1024M ,其中-X 表示它是 JVM 运行参数,ms 是 memory start 的简称,mx 是 memory max 的简称,分别代表最小堆容量和最大堆容量。但是在通常情况下,服务器在运行过程中,堆空间不断地扩容与回缩,势必形成不必要的系统压力,所以在线上生产环境中,JVM 的 Xms 和 Xmx 设置成一样大小,避免在GC(Garbage Collection 垃圾回收)后调整堆大小时带来的额外压力。 堆分成两大块:新生代和老年代。对象产生之初在新生代,步入暮年时进入老年代,但是老年代也接纳在新生代无法容纳的超大对象。新生代= 1 个 Eden 区+ 2 个Survivor 区。绝大部分对象在 Eden 区生成,当 Eden 区装填满的时候,会触发Young Garbage Collection,即 YGC。

关于求解最长公共子序列的两种思路

一、题目描述 求取两个给定序列的最长子序列,仅需要求取出其中一个最长子序列即可。 比如序列 X 为 ABCBDAB ,序列 Y 为 BDCABA,则其公共最长子序列之一为 BCBA(可能不唯一)。 关于求解所有最长公共子序列的思路可以移步我的另一篇博文: https://blog.csdn.net/qq_40697071/article/details/89059844 二、解题思路 这道题的解法一般来说有两种思路,第一种就是普通的暴力穷举法,即对每一种情况都进行列举,然后将两个序列的子序列从头到尾的全部进行比较,因为对于一个序列若其所含元素的数量为 m 时,其所具有的子集的数量为 2^m,然后对于其中每一个子集与另一个序列进行比较时的时间复杂度为 O(n),因此可以计算出穷举法的时间复杂度为 O(n^(2^m)),这种时间复杂度可以说是很可怕了,所以我们不采取这种解法。 另一种解法是通过使用是用动态规划的思路来进行求解,求解的过程类似于 0、1背包问题,其主要的思路是从后向前对两个序列进行判断,因为当我们从后向前进行判断的时候,只存在两种情况,即两个序列的最后元素相等,或者不相等,假如两个序列的最后一个元素相等,那么就是说最后这个元素肯定是其最长公共子序列的最后一个元素,所以将其记录,然后两个序列同时抛弃最后一个元素。假如两个序列的最后元素不相等,那么就再分两种情况,一种是第一个序列抛弃最后一个元素然后在与第二个序列进行比较,另一种是第二个序列抛弃最后一个元素然后再与第一个元素进行比较,之后的过程其实就是一个重复之前操作的过程。 通过上面的思路,其实我们已经可以大致确定这道题的一个解题的思路,而且我们可以发现这个解法其实就是一种动态规划的思想,即对之前已经计算出来的结果进行保存,后面的计算可以直接依赖于之前的计算结果,这样的话我们可以将两个序列抽象为一个二位数组,行为一个序列,列为一个序列,每个点对应的是从开头到当前为止最长的公共子序列长度,这样的话对于每一个点,假如当前其所对应的在两个序列中的元素相等,即为上面说的第一种情况,那么我们就可以直接使用其西北角的已经计算出来的值加一,相当于直接在之前最长公共子序列的长度加一就可以,反之,假如当前的位置在两个序列中对应的元素不相等,那么就直接取其上方值或者左方值中的最大值即可,因为其上方值和左方值分别对应着上面的第二种情况中的两种情况,即当两个序列的最后一个元素不相等的时候,中间一个序列不动,另一个抛弃尾元素,当两个都这样操作后,取其最大值即可。 之后就是对于这种思路的两种实现方式,一种是使用两个数组,即一个数组保存上述的数据,另一个数组则用来进行标志保存,第二数组的目的是为了最后去求取最长的公共子序列,注意,对于上面的解法也就是单个数组的时候,数组中保存的仅仅是当前位置所对应的最长公共子序列,我们还需要通过另一个方法来确定最后的子序列。用标志数组进行保存的目的是记录当前最长子序列的对于上一步的选择,是直接加一还是抛弃一个尾元素,然后再通过从数组的右下角向左上角递归求解,来求得最后的最长公共子序列。 在上面一种解法中,我们需要创建两个数组,但其实通过思考,我们发现其实只通过一个数组就可以完全满足我们的需要,即当当前位置的上方和当前位置的最长公共子序列长度相等时,我们就默认选择向上走,而不相等的时候就可以认为当前元素为两个序列的一个公共元素,所以直接添加即可。需要注意的是,对于第一个数组初始化,我们应当默认多创建一行和一列,来便于对两个序列的首元素进行判断。 三、代码实现 // 思路一:利用标志数组求解 #include <iostream> // 根据标志数组求解最长公共子序列 void printLcs(vector<char> charArray, vector<vector<int>> recordRoadArray, int row, int col){ if(row == 0 || col == 0) return; if(recordRoadArray[row][col] == 1){ printLcs(charArray, recordRoadArray, row-1, col-1); cout << charArray[row-1]; }else if(recordRoadArray[row][col] == 2) printLcs(charArray, recordRoadArray, row-1, col); else printLcs(charArray, recordRoadArray, row, col-1); } // 求解标志数组和整理动态规划数组 void lcsLength(vector<char> firstCharArray, vector<char> secondCharArray, int rowLength, int colLength){ vector<vector<int>> recordArray = vector<vector<int>>(rowLength, vector<int>(colLength, 0)); vector<vector<int>> recordRoadArray = vector<vector<int>>(rowLength, vector<int>(colLength, 0)); for(int i = 1; i < rowLength; ++i) for(int j = 1; j < colLength; ++j){ if(firstCharArray[i-1] == secondCharArray[j-1]){ recordArray[i][j] = recordArray[i-1][j-1] + 1; recordRoadArray[i][j] = 1; }else if(recordArray[i-1][j] >= recordArray[i][j-1]){ recordArray[i][j] = recordArray[i-1][j]; recordRoadArray[i][j] = 2; }else{ recordArray[i][j] = recordArray[i][j-1]; recordRoadArray[i][j] = 3; } } printLcs(firstCharArray, recordRoadArray, rowLength-1, colLength-1); } int main() { vector<char> firstCharArray = {'A', 'B', 'C', 'B', 'D', 'A', 'B'}; vector<char> secondCharArray = {'B', 'D', 'C', 'A', 'B', 'A'}; lcsLength(firstCharArray, secondCharArray, firstCharArray.

Ulimit配置

vi /etc/security/limits.conf * hard nofile 655350 * soft nofile 655350 * hard memlock unlimited * soft memlock unlimited * soft core unlimit * hard core unlimit * soft fsize unlimited * hard fsize unlimited * soft data unlimited * hard data unlimited * soft nproc 65535 * hard nproc 63535 * soft stack unlimited * hard stack unlimited 或者: * - nofile 100000 * - nproc 100000 无限制配置: # vim /etc/security/limits.

参加第十届蓝桥杯C语言A组后的感受

二零一九年三月二十四日,我有幸参加了第十届蓝桥杯编程比赛。比赛结束后,一直想写点什么,却又不知道从何处动笔。只能遍码字遍想了。 首先,我很早就有用文档记录生活的习惯,不过将其写至博客上,还是头一次。所以,今晚上所幸借CSDN宝地一用,开始写点技术博客和一点生活的感悟。 另外还希望,如果能找到知音亦或有相同困恼的朋友,我将高兴与你结识。 其实,我并不是计算机专业的只是生物本科在读,本来专业是与计算机毫无关系的,但是机缘巧合下,开始了我的自学之路。 关于蓝桥杯。我在寒假准备之时已经树立了目标,就是要以赛促学,通过参加比赛的压力,来推动学习。事实证明,这一个方法是可行的,以前的寒假,往往是以休息为主,说白就是玩手机,连脑子都不动一下。然鹅,这次假期,有了开学就要比赛的压力后,我就每天上网上看视频或看书进行编程的学习,这是打下基础的第一步。 在寒假之前,我仅有的编程基础,就是大一下学期的C语言 的公修课,但是当时并不太喜欢这个老师,所以就没有听课,仅仅零零散散的听了一点点,还是最终到期末时,拿出谭浩强编写的书,进行了第一次自学。就是这次自学,虽说是仅仅是皮毛,但是我同时发现编程并没有我想象中的无聊。 后来升大二的暑假,因为一些原因,我开始计算机专业的自学,这个以后在谈。 大二开学的前几天,我就已经到了学校,花了一上午的时间,用来上网查询计算机专业的自学方向以及考研的要求。经过决定,我决定了开始数据结构的自学。可以说大二的上学期所有的课外时间,我都奉献给了数据结构。 但是这期间,我并没有真正的敲代码,仅仅看书上的代码。在十一月偶然了解到蓝桥杯后,我就有了参加的打算,所以,我注册HDUOJ的账号,从第十一页的入门的一百题,开始刷,但是刷到三十题时,我就因为,要准备本专业的期末考试的缘由,停止了刷题。因为对于当时的我来说,刷题吞噬了我大量的课外时间,我一直努力平衡生物专业的学习和计算机专业的学习,当时,一度非常迷茫,我害怕顾此失彼。 最终在期末考试的压力下,我停下了刷题与数据结构的学习,开始期末的全天的复习,生物学科大多以记忆为主。 当放了假后,真正的看视频进行刷题,并通过网上总结的资料,快速看了c++的基本语法,并学习STL与基本的容器。 也就是说,我实际备赛的时间,只有两个月多一点。当时的想法就是,体验一下氛围,感受一下题的难度。并没有拿奖的打算,我也知道那概率几乎没有。随着,学习的推进,我逐渐了解了DFS与BFS,并且知道一些基本的算法,这就是现在的我的全部家底了,真的是非常的弱。正是了解的越多,就知道了自己不懂的地方就越多。随着时间的流逝,蓝桥杯比赛就近在了眼前。前一周,我就开始了焦虑。因为,我怕一题也写不出来,我怕四个小时的比赛,我干瞪眼四个小时。我开始了自我的怀疑,自我的否定,怀疑自己的能力。那一段时间,真是太难熬了。我逼自己太狠了。负面情绪导致我做模拟题时,一点思路都没有,我真正的陷入了恶性循环。我心情不爽到爆炸,极其讨厌身边任何一个触怒我的人,我心头仿佛压了一座大黑山。 一切都源于我太急功近利了,或者说是,太贪了。我渴望得到认可。这折磨着我。放在别人身上,可能没什么大不了的。但是我太急了,我急于证明自己,我自卑又自傲。 三月二十三日,是院运动会,我报了两个一百米接力和拔河。到了比赛的当天,其实我是腰酸背疼的。当日,我六点起床了,匆匆吃了前天的面包,这也是,破天荒的一次,因为我是不怎末吃甜食的。伴随着朝阳,孤独的一个人做了一个小时的地铁到达了赛点。(搁笔,夜已深) 好了,终于要回到正题了。我写了蓝桥杯的第一道填空题,就是整数各位数字的求解,一般思路,由于,以前总结过,所以就写了出来。但是,接下来的几道填空题,却一点头绪,也没有,特别是密码破译的那一题,就是需要分解质因数,找不到思路,遂放弃。还有一个迷宫问题,是个三十乘十列的,第一个感觉就是,如果用深度搜索的话,极易超时,并且要按照字典序最小排序,又尴尬的放弃了。之后,又零零散散的做了四道大题。有一道大题是平衡二叉树,好像是计算最大权值,如果有多个答案则要求是输出最小深度。我简要说一下思路,就是根据给的节点数算出深度是多少,也就是有几层,然后卡每一深度,算出这层的权值并放入数组中,最后用sort 排序,并注意根据深度重载cmp。还有一题是外卖的优先级问题,我开了二维的vector数组,一维放店家,二维放时刻,(1-T)如果有订单,则对应的数组加二,如果没有,则赋值为-1,最后第二维求和,如果中间和小于零,则变为零。然后进行统计。还有一题是吃糖果问题,我似乎用的是dfs,估计用bfs会更好。还有就是修改数组这题,思路挺简单的,我是开了两个数组,不过写的时候注意查重(ps:可以用数组下标法进行查重)详细的题解等到出成绩后再重新写一写发出来。 今年的蓝桥杯的大题,我并没有碰到DP?(难道是太菜,没想到?)感觉挺常规。结合蓝桥杯联络群反映的情况,今年的题应该是简单的。但是我觉得要是想过了所有样例还是得提升算法的。 但是,随着人流,走出赛场的那一刻,我是几天来头一次,感觉到了快乐,真是久违的感觉。因为,我并没有一道题,也没写出来,达到这个标准,我心里轻松多了。 其实,截至现在,分数并没有出来,就算出来,也无所谓了,因为,这个比赛带给我的快乐,是真真切切的,是真金白银也买不来的。 谨以此文,纪念我的第一次参赛经历,也作为写博客记录的开端! 赛点学校建筑挺美的!

group_concat字符长度限制

使用方法 group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 基本查询 mysql> select * from aa; +------+------+ | id| name | +------+------+ |1 | 10| |1 | 20| |1 | 20| |2 | 20| |3 | 200 | |3 | 500 | +------+------+ 6 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,逗号分隔(默认) mysql> select id,group_concat(name) from aa group by id; +------+--------------------+ | id| group_concat(name) | +------+--------------------+ |1 | 10,20,20| |2 | 20 | |3 | 200,500| +------+--------------------+ 3 rows in set (0.

CycleGAN(二)数据集重做与训练测试

目的:我们需要在我们的数据集上实现CycleGAN。 参考:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/blob/master/docs/datasets.md 目录 一、数据集制作 1.1 数据集格式 1.2 我们的数据集 二、训练 1.1 命令行 1.2 不显示结果 二、训练命令行 2.1 norText_2_cotton 2.2 norText_2_falText 三、测试 3.1 测试相关命令行及含义 两点注意 3.2 测试 四、存储结果位置 4.1 测试结果位置 html 4.2 训练结果位置 五、loss常见值 5.1 norText_2_falText_cyclegan 开始 一、数据集制作 1.1 数据集格式 To train a model on your own datasets, you need to create a data folder with two subdirectories trainA and trainB that contain images from domain A and B. You can test your model on your training set by setting --phase train in test.

面试之sql——删除冗余数据

昨天去面试,又碰到一个头痛的sql题,软肋呀!特总结备用; 这是重复数据。 1、我们先查询出里面的冗余数据; mysql> select *from user1 where id not in (select min(s.id) from (select * from user1) s group by s.name,s.age); 可见,mysql这是查询的是除id以外一样的数据(只是多的部分),那我们把这部分删除掉就可以了。 mysql> delete from user1 where id not in (select min(s.id) from (select * from user1) s group by s.name,s.age); Query OK, 3 rows affected (0.09 sec)//显示删除三行; 我们再次查询数据; 完成删除冗余数据操作;

UE4C++ 常用游戏算法

1.锁定敌人 void AARPGPlayerController::LockAI() { /**获取自己的位置*/ FVector pos = myCharacter->GetActorLocation(); /**获取所有AI对象*/ UGameplayStatics::GetAllActorsOfClass(GetWorld(), AAICharacter::StaticClass(), AiArray); int aiNum = AiArray.Num(); if (aiNum>0) { /**求出最短距离*/ float MainDistance = FVector::Dist(pos, AiArray[0]->GetActorLocation()); /**距离玩家最近的AI*/ AActor * MainDistActor = AiArray[0]; /*遍历所有敌人*/ for (int i =0;i<aiNum;++i) { /**判断敌人是否死亡*/ if (Cast<AAICharacter>(AiArray[i])->isDie) { continue; } /**获取距离*/ float dist = FVector::Dist(pos, AiArray[i]->GetActorLocation()); /**判断最近距离*/ if (MainDistance>=dist) { MainDistance = dist; MainDistActor = AiArray[i]; } } /**如果在附近 就进行朝向玩家*/ if (MainDistance<+400) { FRotator rot = UKismetMathLibrary::FindLookAtRotation(pos, MainDistActor->GetActorLocation());

Hashcat 破解 wifi WPA2 PMKID

Hashcat 破解 wifi 1,系统环境2,环境搭建 1,系统环境 $ cat /etc/issue Ubuntu 18.04.2 LTS \n \l 2,环境搭建 安装hashcat $ apt-cache search hashcat # apt install -y hashcat # apt install -y git # git clone https://github.com/ZerBea/hcxtools.git 参考: Cracking WPA2 Passwords Using the New PMKID Hashcat Attack

C语言编程中的8位、16位、32位整数的分解与合并

在单片机的编程中对于8位、16位、32位整数的分解与合并用的比较多,今天做了简要学习,后面还需要加以总结。 练习在VC++6.0编程环境中进行,源程序: #include <stdio.h> #include "string.h" int main(int argc, char* argv[]) { unsigned int Data_Uint32=0x12345678; unsigned short int Data_Uint16_1,Data_Uint16_2; unsigned char Data_Uint8_1,Data_Uint8_2,Data_Uint8_3,Data_Uint8_4; struct StructByte8{ unsigned char Byte01:1; unsigned char Byte02:1; unsigned char Byte03:1; unsigned char Byte04:1; unsigned char Byte05:1; unsigned char Byte06:1; unsigned char Byte07:1; unsigned char Byte08:1; } Test1; unsigned char C1[]="A"; //定义16位的指针将32位地址强制转为16位,高位丢弃取低位 unsigned short int *p16=(unsigned short int *)(&Data_Uint32); unsigned short int Data_Uint16_2p,Data_Uint16_1p; printf("32位整数:0x%x\n",Data_Uint32); printf("-------------------通过指针运算-------------------\n"); Data_Uint16_2p=*(unsigned short int *)p16; Data_Uint16_1p=*((unsigned short int *)p16+1); printf("

python实现批量修改文件名

实现自动批量修改文件名 import os root='./images' #文件目录 files=os.listdir(root) file=os.path.splitext(files[0]) filename, type=file for i in range(len(files)): os.rename(files[i], str[i]+type) #str[i]为新名字,可以改为其他的

Postman使用细则说明一:Manage Cookies、GENERATE CODE SNIPPETS(生成代码段)、Collections管理接口、Setting

一、Postman的简介 是一款强大的网页调试工具,除了可以调试简单的css、html、脚本等网页基本信息,它还可以发送很多类型的HTTP请求;其使用形式可以是:Google Chrome插件、也可是App(Postman APP分为Postman Native APP和Postman Chrome APP两种); 二、Postman的安装 postman的安装方法分好几种,下面分为两种安装模式介绍: 1、chrome浏览器postman 插件安装 postman谷歌浏览器的插件,在安装了谷歌浏览器后还需要在谷歌网上应用店中下载所需要的Postman插件,其下载方式如下: 若不可加载该页面,则尝试:chrome安装postman 2、Windows安装postman app 下载安装文件,运行安装程序;不用多说; 3、Postman的功能简介 参数的添加可以支持多种形式,类型: 4、接口请求简介 4.1 get请求方式: GET请求:点击Params,输入参数及value,可输入n个,并且即时显示在URL链接上,所以,GET请求的请求头与请求参数如在接口文档中无特别声明时,可以不填; postman页面send GET请求后,会有响应 状态码、时间、大小;响应体:响应的格式可以有几种,如:百度,响应的是 html ,一般情况下,自定义接口响应就是 以json格式为主的响应体;如下图: 4.2 post请求方式:(token放在请求header中,body里放参数,json格式要注意都号,关键字引号) 请求头中的Content-Type与请求参数的格式之间是有关联关系的,比如: post参数格式请求头中Content-Type参数示例表单格式提交application/x-www-from-urlencodedusername=zhangs&password=123456JSON格式提交application/json{"username":"zhangs","password":"123456"}xml格式提交text/xml<?xml version="2.0" encoding="gbk"?><name>美女</name> POST请求一:表单格式提交 根据上面所传的参数格式,在Headers中会自动生成一个Content-Type; 同样的道理: POST请求二:json格式提交,当我们选择JSON(application/json) 是会自动帮我们设置 headers 为 application/json; POST请求三:xml格式提交 POST请求四:二进制文件提交 请自行研究:其它请求方式如PUT,DELETE 大致流程,基本GET,POST 差不多; 5、Collections管理接口 Collections集合:将多个接口请求可以放在一起,方便管理。基础原则:一个工程一个Collection,这样方便查找及统一处理数据 (当然也不一定哈,自己有自己的方式) 第一步, 创建Collections,如下图: 第二步,将history中接口添加至Collections中; 另:collections 管理精细化, 可针对不同的请求方式进行分组,添加子文件夹 6. Manage Cookies(Cookies管理) 7.GENERATE CODE SNIPPETS (生成代码段) 主要作用:将所在也界面的request,生成代码段,可以选择支持很多语言; 8、Console(控制台) postman有两个控制台,可以帮助大家了解系统后台到底发生了什么。 1.View-->Show Postman Console:

Python安装出现严重错误的解决方法_0x80070643-安装时发生严重错误

Python安装出现严重错误的解决方法_0x80070643-安装时发生严重错误 送给读者的话我的安装环境错误截图出现错误可能原因解决上述错误方法 送给读者的话 当你看到这里时,恭喜你大概已经安装和卸载Python各版本N次了,本来一腔热血冲向Python,没想到众人口口声声说的贼**好用的Python到我们手里像*一样,安装到怀疑人生。 首先说明,我就是个小白,为了学习NLP才安装的Python,而且是安装了好几个版本,基本上能遇到的问题都遇到了。 这里,Python安装出现:_0x80070643-安装时发生严重错误,这个问题我在网上搜了不少方法,也尝试过但几乎都是没用的,还有许多也看不懂。 心灰意冷地准备重装系统之前,偶然的解决了,但我不知道为什么,但是就是解决了,所以和大家分享一下,很简单。 我的安装环境 操作系统: Windows 8.1 安装Python版本: Python2.7.16、Python3.6.8、Python3.7.2 安装目录: 自定义的D盘一个目录(例:D:\Python\Python37) 错误截图 以上错误出现在所有的Python版本安装过程。 出现错误可能原因 我出现该错误很可能是误删了C盘某个重要文件,之前觉得C盘垃圾太多,就在网上找了个.bat的小代码,然后试了。其实,清理效果并不怎么样,自从这之后,Python就安装不了了,之前Python可以自由的安装和卸载的。 冤有头债有主: @echo off echo 正在清除系统垃圾文件,请稍等… del /f /s /q %systemdrive%*.tmp del /f /s /q %systemdrive%*._mp del /f /s /q %systemdrive%*.log del /f /s /q %systemdrive%*.gid del /f /s /q %systemdrive%*.chk del /f /s /q %systemdrive%*.old del /f /s /q %systemdrive%\recycled*.* del /f /s /q %windir%*.bak del /f /s /q %windir%\prefetch*.*

web性能压力测试工具之--linux环境下ApacheBench(ab)安装与使用详解

一、前言 之前写过一篇压力测试工具locust的入门使用教程,也是我日常测试中比较常用的一款工具,它的好处就是可以扩展,可以自己定义脚本运行的行为准则,没有那么多的条条框框,而且依赖的是python的编写框架与各种开源包,相比于jmeter显得更加的轻量级,从它自己使用的协程(微线程)就可以看出来,那么本篇就来介绍另一款测试工具--ApacheBench,简称ab; 如果说测试过程中并没有自己定义脚本的需求,只是临时调用工具检查一下web服务器的性能,那么ab就再合适不过了,因为ab本身属于Apache,只是apache工具包中的其中一种工具,缺点就是只能定向的查看性能指标而无法自定义它的行为准则,优点就是简单、便捷 二、ApacheBench命令原理与相关参数 1、运行原理 ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力 2、相关参数(这里把ab所使用的基本参数都列出来,方便大家使用的时候方便对照) 格式:ab [options] [http://]hostname[:port]/path 最常用的两个参数就是-c、-n两个参数,上面列举的参数并不全,有兴趣的同学可以去其他博客看下参数详解; 三、ApacheBench的安装 ps:本篇只介绍linux下的安装方法,windows下的安装方法可以参考博客 https://blog.csdn.net/dongdong9223/article/details/49248979 安装目的: 操作系统:CentOS 7.4 查看服务器系统版本号:cat /etc/redhat-release ApacheBench:2.3 查看ApacheBench版本:ab -V(这里的v要大写) 1、linux下安装使用yum命令安装就可以了,可以安装Apache底下的工具包apache httpd 这个工具包中就包含工具ApacheBench,也就是说把这个工具包安装完成之后就可以使用ApacheBench的命令了 命令:yum -y install httpd-tools ps:当然使用这个命令缺不了要用到yum命令,很多服务器是默认没有安装yum命令的,这个时候要先安装yum命令在进行第一步操作,传送门:https://jingyan.baidu.com/article/ce09321bbde1de2bff858f9a.html 2、完成步骤1的操作就说明可以使用ApacheBench工具了,这个时候可以查看一下刚刚安装的ApacheBench版本信息了(命令见步骤1上方) 3、安装完成后可以使用命令【ab -】查看该工具的所有参数,具体参数对照请参考第二步参数解释: 四、ApacheBench的使用 使用命令:ab [options] [http://]hostname[:port]/path 常用参数: 示例: 测试网址:http://www.baidu.com/请求数:100并发数:10命令:ab -n 100 -c 10 http://www.baidu.com/path 运行结果: 五、响应参数释义 六、结语 其实ApacheBench在印象中都是做web页面性能测试的工具,似乎除了web页面在其他地方没有发力的地方,其实ApacheBench对接口也是可以进行性能测试的,具体内容可以参考https://blog.csdn.net/achang21/article/details/46380769 该篇博文比较详细介绍了如何使用ApacheBench对API进行性能测试,这里就不多讲了,后面在我的其他博客会介绍其他的性能测试工具;

七牛播放器SDK的crash坑

03-21 16:57:20.729 23518-23518/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 03-21 16:57:20.729 23518-23518/? A/DEBUG: Build fingerprint: 'vivo/PD1709/PD1709:8.1.0/OPM1.171019.011/compil01191501:user/release-keys' 03-21 16:57:20.729 23518-23518/? A/DEBUG: Revision: '0' 03-21 16:57:20.730 23518-23518/? A/DEBUG: ABI: 'arm64' 03-21 16:57:20.730 23518-23518/? A/DEBUG: pid: 23121, tid: 23509, name: CHTTPIO2 >>> com.pili.pldroid.playerdemo <<< 03-21 16:57:20.730 23518-23518/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x12000c00120073 03-21 16:57:20.730 23518-23518/? A/DEBUG: x0 0012000c0012000b x1 00000078d8cbcfa0 x2 0000000000000001 x3 00000078d89db180

面试题:写一个左中右布局占满屏幕,其中左右两块是固定宽度200 , 中间自适应宽,要求先加载中间块,请写出结构及样式:

html <h3>test</h3> <div class="left"></div> <div class="right"></div> <div class="middle"></div> css html,body{ margin: 0; padding:0; } h3{ color: blue; text-align: center; } .left{ width: 200px; height: 100px; background: lightcoral; position:absolute; left: 0; } .right{ width: 200px; height: 100px; position: absolute; right:0; background: lightblue; } .middle{ margin: 0 200px; height: 100px; background:lightgrey; }

KEIL 5 在debug调试时停留在Reset_Handler

KEIL 5 在debug调试时停留在Reset_Handler 在写STM32的Printf函数重定向时,出现程序在debug调试时,程序总是停留在“STM32F10x.s”文件中的 Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main LDR R0, =__main BX R0 ENDP 如果把printf语句删除掉,就不会出现这个问题。但我们需要printf语句的功能,只能是 KEIL 5环境没有没有设置好。 解决方式: Use MicroLIB 要勾上 Printf函数重定向时,要加头文件#include<stdio.h>

windows使用ip地址访问本地的mysql数据库

Mysql 默认只允许使用 localhost 或者 127.0.0.1连接数据库,如果想用ip地址连接,例如 192.168.1.* ,来访问mysql ,需要手动去开启这个权限。 1. 打开cmd窗口,假设你已经将mysql配置到系统服务,或者你可以先使用mysql -V查看一下版本,然后 使用 mysql -u用户名 -p你的密码 去连接mysql; 2. 执行以下命令分配新用户: grant all privileges on *.* to '用户名'@'IP地址' identified by '密码'; 3. 执行完上述命令后用下面的命令刷新权限 flush privileges; 4. 之后关闭mysql服务,然后启动mysql服务,大功告成

在notepad++运行python程序

转载: https://baijiahao.baidu.com/s?id=1606573927720991570&wfr=spider&for=pc http://www.cnblogs.com/zhcncn/p/3969419.html https://blog.csdn.net/Yunyung2/article/details/78591630 第一步:下载Python安装包 在Python的官网 www.python.org 中找到最新版本的Python安装包,点击进行下载,请注意,当你的电脑是32位的机器,请选择32位的安装包,如果是64位的,请选择64位的安装包; 第二步:安装Python A.双击下载好的安装包,弹出如下界面: 这里要注意的是,将python加入到windows的环境变量中,如果忘记打勾,则需要手工加到环境变量中;在这里我选择的是自定义安装,点击“自定义安装”进行下一步操作; B.进入到下一步后,选择需要安装的组件,然后点击下一步: C.在这里可以自定义路径选择安装: D.点击下一步后,就开始真正安装了: E:安装完成后,会有一个安装成功的提示界面: 第三步:测试版本 python安装好之后,我们要检测一下是否安装成功,用系统管理员打开命令行工具cmd,输入“python -V”,然后敲回车,如果出现如下界面,则表示我们安装成功了; 这句话的意思是显示python的版本信息; 第四步:写程序测试 安装成功之后,当然要写第一个python程序了,按照惯例,我们写一个“hello world”; 还是打开cmd,输入“python”后敲回车, 进入到python程序中,可以直接在里面输入,然后敲回车执行程序,我们打印一个“hello world”看看,在里面输入 print(“hello world”),敲回车,所有程序员都会遇到的第一个程序就出现啦; 第五步:安装notepad++ 百度搜索“Notepad++”直接就可以找到主页; 主页有中文版的,其实也就那么几个字,然后选择红色框了的下载; 跳转到下载界面,下载最新版本就行了,好多种格式的直接安装的,还有压缩包; 直接下载exe格式就行! 打开下载好的exe程序,显示有中文,直接点“ok”就可以了; 继续,这里点“下一步”; 然后点击“我接受”; 选择好一个路径,然后点击“下一步”; 可以根据自己的需要选择插件,然后“下一步”; 组件选择,知道的解释都写上了,选择好了然后点击“安装”; 等待安装完成; 点击“完成” 第六步:notepad++运行python Notepad++ ->"运行"菜单->"运行"按钮 在弹出的窗口内输入以下命令: cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT 然后点击“保存”,随意取一个名字,比如“RunPython”,为方便,配置一下快捷键(比如 Ctrl + F5),点OK即可。之后运行Python文件只要按配置的快捷键或者在运行菜单上点“RunPython”即可。 注意不要跟已有的快捷键冲突。查看已有的快捷键,可以点击"运行"菜单->"管理快捷键"按钮 查看 第七步:添加notepad++插件 插件下载地址,注意下载位数: PluginManager https://github.com/bruderstein/nppPluginManager/releases Jsonviewer https://github.com/zbeboy/Jsonviewer2/releases ComparePlugin https://github.com/pnedev/compare-plugin/releases/tag/v2.0.0 下载解压后,将动态链接库放在路径:

抓取前程无忧51job岗位数据,实现数据可视化——心得体会

最近找工作,经常浏览51job,刚好学了python一段时间了,所以有了一个想法:为什么不将我需要的岗位信息给爬出来呢? 在51job网站搜索“数据分析师”,查看源代码,发现每一个招聘公告包含岗位、公司、薪资、地区等信息。所以可以实现如下几个目的: 1.根据关键词抓取招聘信息; 2.连接mysql,创建表格,并插入数据; 3.初步清洗数据,实现可视化 一、网页抓取函数 https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare= 这个是搜索“数据分析师”的网址,乍一看十分复杂,立马就没弄下去的欲望了。 发现这么一长串url只有 https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,1.html 是必须的。而 %25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588 则正好是“数据分析师”的urlencode,那么我们可以利用这一点,更改搜索关键词 而且%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,1.html中html前的数字对应着页码 因此可以通过更改keyword和页码,进一步选择我们需要的信息。 def Get_html(data,i): Url="https://search.51job.com/list/000000,000000,0000,00,9,99,"+data+",2,%s.html"%i #data是自定义搜索关键词,i的大小则直接控制了爬取信息量 header = {'User-Agent':'Mozilla/5.0'} #头部信息 r=requests.get(Url,headers=header) print(r.url) print(r.status_code) r.encoding=r.apparent_encoding #print(r.text) return(r.text) #函数返回html 万里长征完成第一步o.o 接下来就是解析html,进一步爬取岗位、公司、薪资、地区和url信息。 这个阶段卡了2个多小时(习惯用beautifulsoup爬取)。 代码1: def Get_data(html): soup=BeautifulSoup(html,"html.parser") for div in soup.find_all("div",class_="el"): #find_all()遍历结果为列表 print(div) 输出结果: <div class="el"> <p class="t1 "> <em class="check" name="delivery_em" οnclick="checkboxClick(this)"></em> <input class="checkbox" jt="0" name="delivery_jobid" style="display:none" type="checkbox" value="109229565"/> <span> <a href="https://jobs.51job.com/shenyang/109229565.html?s=01&amp;t=0" οnmοusedοwn="" target="_blank" title="数据分析师"> 数据分析师 </a> </span>

在python中round()方法的作用

** ** python中round()方法的作用** ** round()方法的作用是对于浮点数进行四舍五入。 round(x) 返回浮点数x的四舍五入的值 >>> round(2.6) 3 >>> round(2.5) 2 >>> round(2.4) 2 >>> round(2.51) 3 round(x,n) 返回浮点数x的四舍五入的小数点后的n位数值 >>> round(2.244,2) 2.24 >>> round(2.246,2) 2.25 >>> round(2.285,2) 2.29 >>> round(2.675,2) 2.67 >>> round(2.135,2) 2.13 >>> round(2.135002,2) 2.14 >>> round(2.145002,2) 2.15 从以上结果可以发现round()方法的功能“四舍五入”和我们普通理解的“四舍五入”差别还是很大。 原因是round()方法采用的四舍五入的标准是“四舍六入五成双”的方法。 四舍六入五成双是一种比较科学的计数保留法,是一种数字修约规则,它的精确和科学是基于统计学上的。 所以,1~4舍去, 6~9进位,当5时,如果5后面还有数字则进位,如果5后面没有数字的情况下,5前面的数字偶数则进位,5前面的数字是奇数则舍去。

npm install 出现npm ERR! cb() never called!错误

npm install 出现npm ERR! cb() never called!错误 解决办法: 一、首先要以管理员模式打开cmd清除你的npm缓存 : npm cache clean -f 二、清除完缓存后,安装最新版本的Node helper: npm install -g n 注意:如果出现npm ERR! notsup Unsupported platform for n@2.1.8: wanted {“os”:"!win32",“arch”:“any”} (current: {“os”:“win32”,“arch”:“x64”}) 这样错误信息 然后执行以下 npm install -g n --force 三、告诉助手(n)安装最新的稳定版Node:n stable 四、完成上一个命令后,您将获得最新信息。让我们再次运行安装: npm install 如果在执行npm install 非常缓慢的时候,可以试着更换镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 如图: 然后再执行npm install

Canvas render mode 设置为World Space不响应事件问题排查

排查: 被其他render mode 的UI或者canvas遮挡了,关闭掉其他所有的canvas看下You have to select a camera, in "Canvas < Render Mode < Event Camera" If its not the case also try removing check on Graphic Raycaster > Ingore Reversed Graphics on WorldSpace Canvas which worked for me. Check your Canvas. If your UI is in World Space have you specified the proper Camera? Does the UI component with your canvas attached also have an enabled Graphic Raycaster attached?

从零开始丨INDEMIND双目视觉惯性模组ROS平台ORB-SLAM教程及记录

本文涉及很多代码及文字,排版、文字错误请见谅。 阅读时间预计30分钟 本文涉及图像、数据均由INDEMIND双目视觉惯性模组采集 文章涉及所有代码修改皆已上传至Github,大家自行修改后可对比参照 下载链接:Github 文章目录 一:环境介绍二:下载SDK及ORB-SLAM源码三:修改源码1 . 源码路径2 . 修改stereo_euroc.cc文件1)将其橙色区域改成2)添加时间转换函数3)删除LoadImages函数4)添加回调函数imagelCallback5)添加show_ORB函数6)ros初始化7)删除 LoadImages函数 3 . 新建FileYaml.h文件4 . 新建FileYaml.cc文件5 . 修改CMakeLists.txt文件1)2)3)4)5) 6. 编译1) 7. 执行1)2)3) 一:环境介绍 系统:Ubuntu 16.04 ROS ORB依赖库:Pangolin、OpenCV、Eigen3、DBoW2、g2o,ros 二:下载SDK及ORB-SLAM源码 下载地址: SDK:http://indemind.cn/sdk.html ORB-SLAM:https://github.com/raulmur/ORB_SLAM2 三:修改源码 1 . 源码路径 下载好SDK之后,进入SDK-Linux/demo_ros/src目录。将下载好源码的放在该目录下,并对其改名,改为 ORB_SLAM 2 . 修改stereo_euroc.cc文件 进入ORB_SLAM2/Examples/Stereo目录下,修改stereo_euroc.cc文件。 1)将其橙色区域改成 代码如下: #include<iostream> #include<algorithm> #include<fstream> #include<iomanip> #include<chrono> #include<opencv2/core/core.hpp> #include<System.h> #include "ros/ros.h" #include <cv_bridge/cv_bridge.h> #include <sensor_msgs/Image.h> #include "std_msgs/String.h" #include "FileYaml.h" #include <queue> #include <mutex> #include <thread> #include <condition_variable> using namespace std; ros::Subscriber image_l_sub; ros::Subscriber image_r_sub; int image_l_count = 0; queue<cv::Mat> que_image_l; queue<cv::Mat> que_image_r; queue<long double> que_stamp; std::mutex limage_mutex; std::mutex rimage_mutex; std::condition_variable left_data_cond; std::condition_variable right_data_cond; // std::lock_guard<std::mutex>lock(rimage_mutex); // std::thread show_thread{show_image}; //visualization thread // show_thread.

NAS 详细搭建方案 - 安装Emby

目录 1 准备工作2 安装硬件和操作系统 2.1 安装宿主系统ESXI 6.52.2 安装NAS操作系统2.3 安装Windows Server2.3.1 添加磁盘2.4 安装Ubuntu Server 3 安装软件 3.1 安装MySQL3.2 安装aria23.3 安装Emby3.4 安装NextCloud3.5 安装shadowsocks 服务端 Emby 官网 emby是个很强大的多媒体中心,服务端和安卓端免费,但是IOS要收费 1 服务端的下载与安装 下载地址 我此时的最新版是3.5.3 sudo wget https://github.com/MediaBrowser/Emby.Releases/releases/download/3.5.3.0/emby-server-deb_3.5.3.0_amd64.deb sudo dpkg -i emby-server-deb_3.5.3.0_amd64.deb 现在试着访问http://IP:8096,能打开网页就算成功了。 2 基本配置 2.1 首次配置 欢迎页。语言选Chinese Simplified ,简体中文,下一步。登录页。随便填个名字,emby 账号不用管,下一步。添加影视库。先跳过。首选语言。语言选Chinese ,国家选People’s Republic of China ,下一步。配置远程访问。都勾上,下一步。服务条款。勾上,下一步。完成。重新打开网页,刷新配置。 2.2 配置媒体库 先在NAS中建立两个文件夹,一个用来做播放缓存,另一个放电影图片等。同时设置好文件夹的权限,文件夹必须打开smb 共享并可以公开免密访问。

ImageNet图像数据集介绍

ImageNet图像数据集始于2009年,当时李飞飞教授等在CVPR2009上发表了一篇名为《ImageNet: A Large-Scale Hierarchical Image Database》的论文,之后就是基于ImageNet数据集的7届ImageNet挑战赛(2010年开始),2017年后,ImageNet由Kaggle(Kaggle公司是由联合创始人兼首席执行官Anthony Goldbloom 2010年在墨尔本创立的,主要是为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台)继续维护。 WordNet是一个由普林斯顿大学认识科学实验室在心理学教授乔治·A·米勒的指导下建立和维护的英语字典。开发工作从1985年开始。由于它包含了语义信息,所以有别于通常意义上的字典。WordNet根据词条的意义将它们分组,每一个具有相同意义的字条组称为一个synset(同义词集合)。WordNet为每一个synset提供了简短,概要的定义,并记录不同synset之间的语义关系。WordNet中的每个有意义的概念(concept)(可能由多个单词或单词短语描述)被称为"同义词集(synonym set)"或"synset"。 ImageNet是根据WordNet层次结构组织的图像数据集。在ImageNet中,目标是为了说明每个synset提供平均1000幅图像。 每个concept图像都是质量控制和人为标注的(quality-controlled and human-annotated)。 在完成之后,希望ImageNet能够为WordNet层次结构中的大多数concept提供数千万个干净整理的图像(cleanly sorted images)。 ImageNet是一项持续的研究工作,旨在为世界各地的研究人员提供易于访问的图像数据库。目前ImageNet中总共有14197122幅图像,总共分为21841个类别(synsets),大类别包括:amphibian、animal、appliance、bird、covering、device、fabric、fish、flower、food、fruit、fungus、furniture、geological formation、invertebrate、mammal、musical instrument、plant、reptile、sport、structure、tool、tree、utensil、vegetable、vehicle、person。 ImageNet有5种下载方式,如下图所示: (1). 所有图像可通过url下载:不需要账号登录即可免费下载,下载链接:http://www.image-net.org/download-imageurls ,在SEARCH框中输入需要下载的synset,如tree,结果如下图所示,也可按类别下载即WordNet ID,下载链接:http://www.image-net.org/synset?wnid=n02084071 ,其中好像个别url已失效。 (2). 直接下载原始图像:需要自己申请注册一个账号,然后登录,经验证普通非学校邮箱无法注册。对于希望将图像用于非商业研究或教育目的的研究人员,可以在特定条件下通过ImageNet网站提供访问权限。 (3). 下载图像sift features:不需要账号登录即可免费下载,包括原始sift descriptors、quantized codewords、spatial coordiates of each descriptor/codeword。提features前,需要缩放图像大小到最大边长不超过300像素。通过VLFeat开源软件提前sift features。并没有对所有的synsets图像提取sift。下载链接:http://www.image-net.org/api/download/imagenet.sbow.synset?wnid=n02119789 ,后面的n02119789为WordNet ID,可在http://www.image-net.org/api/text/imagenet.sbow.obtain_synset_list 中查看有哪些WordNet ID包括sift features并可点击直接下载,下载下来的是一个Matlab文件(.mat),如n02119789.sbow.mat,在每个.mat文件中,每个sift descriptor有5个字段:x, y, norm, scale, word。word字段是cluster(k-means clustering of a random subset of 10 million SIFT descriptors)中心的索引,是一个0到999之间的一个整数。 (4). 下载Object Bounding Boxes:不需要账号登录即可免费下载,bounding boxes是通过亚马逊土耳其机器人(Amazon Mechanical Turk)进行标注和验证的。目前标注过的synsets已经超过3000种,可从http://www.image-net.org/api/text/imagenet.bbox.obtain_synset_list 中查看和下载已标注的种类。对于每种synset,平均有150张带有边界框(bounding boxes)的图像。图像标注以PASCAL VOC格式保存在XML文件中,用户可以使用PASCAL Development Toolkit解析标注。注意:在边界框标注中,有两个字段(width和height)表示图像的大小。标注文件中边界框的位置和大小与此大小有关。但是,此大小可能与下载的包中的实际图像大小不同。(原因是标注文件中的大小是图像显示给标注器的显示大小)。因此,要在原始图像上找到实际像素,可能需要相应地重新缩放边界框。可以通过http://www.

蓝桥杯2018 C/C++ B组训练

历届蓝桥杯C/C++程序设计省赛个人题解 ----------------2018 年 标题:第几天 2000 年的 1 月 1 日,是那一年的第 1 天。 那么,2000 年的 5 月 4 日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容。 标题:明码 汉字的字形存在于字库中,即便在今天,16 点阵的字库也仍然使用广泛。 16 点阵的字库把每个汉字看成是 16x16 个像素信息。并把这些信息记录在字节中。 一个字节可以存储 8 位信息,用 32 个字节就可以存一个汉字的字形了。把每个字节转为 2 进制表示,1 表示墨迹,0 表示底色。每行 2 个字节,一共 16 行,布局是: 第 1 字节,第 2 字节 第 3 字节,第 4 字节 … 第 31 字节, 第 32 字节 这道题目是给你一段多个汉字组成的信息,每个汉字用 32 个字节表示,这里给出了字节作为有符号整数的值。 题目的要求隐藏在这些信息中。你的任务是复原这些汉字的字形,从中看出题目的要求,并根据要求填写答案。 这段信息是(一共 10 个汉字): 4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0

与、或、非、与非、或非、异或、同或

首先把中文意思和英文简写一一作出对应: 与:and 或:or 非:not 与非:nand 或非:nor 异或:xor 同或:xnor 想要准确长久记住这些逻辑运算,有一个对应法则口诀: 与:and -> 有0出0,全1出1 例如:1 ,1–>1 1 ,0–>0 0 ,1–>0 0 ,0–>0 或:or -> 有1出1,全0出0 例如:1 ,1–>1 1 ,0–>1 0 ,1–>1 0 ,0–>0 非:not ->有1出0,有0出1 例如:1 -->0 0–>1 与非:nand ->先按与的操作,然后结果取反 例如:1 ,1–>0 1 ,0–>1 0 ,1–>1 0 ,0–>1 或非:nor ->先按或的操作,然后结果取反 例如:1 ,1–>0 1 ,0–>0 0 ,1–>0 0 ,0–>1 异或:xor ->相异为1,相同为0 例如:1 ,1-->0 1 ,0-->1 0 ,1-->1 0 ,0-->0 同或:xnor ->相同为1,相异为0 例如:1 ,1-->1 1 ,0-->0 0 ,1-->0 0 ,0-->1 作者:好久不见shi

老程序员被新程序员拍在沙滩上?

这次去深圳的时候,抽空参加了一个深圳本地的线下沙龙,去的时候这个活动已经进行开始,刚坐下来不久,就听一个新程序员问一个老程序员的一个问题,引起了大家的热议。 年轻的程序员的问题是这样子的,他说现在新技术更新太频繁了,过个两三年就会出现一个新的框架,比如早些年非常流行的 Struts 说淘汰就淘汰了,好不容易掌握了 Spring ,现在又出现了 Spring Boot、Spring Cloud 框架,根本就学不过来。 那么作为一名老程序员和一名新程序员在面对新技术的时候是站在一个水平线上的,但明显刚入行的程序员精力更旺盛一些,学习热情又强,那么老程序员的优势体现在哪里呢? 感受了一下,这不就是新程序员要把老程序员拍到沙滩上吗? 估计前端开发人员看到这个问题硬是要吐出一口老血了,前端框架的更替那叫一个火箭速度呀。今天还在 AngularJS ,明天突然就出现个 React,当 React 快要掌握的时候,市场上 Vue 大火,并且经常出现最新版本不能往后兼容,坑X呀。要想精通所有框架,对每个程序员来讲,那真的是臣妾做不到呀。 那如果真按照新程序员说的那样,那老程序员不是早被淘汰了,为什么市面上老程序员的工资比新程序员高好几倍呢?难道 Hr 都是脑瘫。 其实呢不是这样子的。 就拿招聘来讲吧,我们经常看到的面试条件会写到2/3年以上开发经验,某某行业背景的优先。就说这面试总要求多年以上的开发经验,这到底是要求什么样的能力?可以很负责任的讲,这种能力就是解决问题的能力。 老程序解决问题的能力比新程序员要强 N 倍。新程序员开发过程中,突然遇到一个问题卡住了,有可能就这个问题就卡一两天,当他拿着这个问题去问老程序员的时候,可能老程序员就抽了一眼,说怎样怎样试一把,问题就解决了。 老程序员的学习能力其实是更强的,因为前面有了积累很容易掌握类似的技术,比如当你精通了 Java ,我相信经过很少时间的刻意学习,你就会学会 Python 开发。语言和技术只是一种工具,它的本质是为了解决问题,当你脑中有了解决方案后,其实仅仅剩下语法实现了而已。 至于具体怎么实现用什么语言,那只是一种技巧而已。 特别是生产出现问题的时候,一个牛逼的程序员要顶 N 个程序员,解决生产问题的程序员要面对,超强压力,超复杂情况,快速定位问题的能力,这些能力都不是一朝一夕能够积累出来的,都是从一个坑一个坑里面爬出来后所积累的。 程序员毕竟还是一个比较烧脑的行业,没有几年的积累,很难成为一个老练成熟的开发工程师。 这里说的是普遍努力的老程序员,不排除有些老程序员,工作了一天,重复了三年的这种情况,也不包括很多刚毕业就很凶猛的年轻程序员们,这里讲的都是广大的普通程序员的对比。 我对程序员们的一些建议: 在刚毕业三年内的时候,优先全面提高自己的技术,快速响应完成工作的能力。积极主动的工作,每次工作完成后主动汇报,向领导要求更具有挑战一些的工作,工作担子越重,成长越快。 毕业三年后的程序员最好确定一个行业方向沉淀下来,一个优秀的架构师,必须同时精通业务和技术,所有行业内才经常会有业务架构和系统架构两个说法,只有同时精通通业务和技术,才能贴合公司业务设计出高效、可扩展、稳定的、适合公司发展的技术架构。 毕业三年左右的程序员重点是,找一个自己喜欢的行业沉淀下来,找一块自己喜欢的技术,挖精挖透。 毕业六年后,如果你毕业六年中到处换行业,并且技术上没有太多的沉淀,那六年后你的竞争力会越来越小。刚毕业的六年内,也就是大多数人的30岁以内,你的职场生涯是急剧上升的,前几年每年工资翻一倍都是很正常的现象。 但是到了6年后,也就是30岁以后,由于各种原因你的精力肯定被有所分散,同时熬夜需要恢复的时间也越来越长,如果没有建立起自己的竞争力,那么未来职场生涯并不好走。 所以不论是老程序员还是新程序员都有自己的优势,年轻程序员有时间有精力,老程序员有行业和技术积累。有了老程序的指引,新程序的成长会更快速;没有新成员的加入,哪有中国 IT人的明天。 最后,欢迎新程序员们把我们拍在沙滩上,这样中国 IT 才更有希望。 -END- 纯洁的微笑 一个有故事的程序员

CentOS7安装mysql5.7数据库

废话不多说,直接上干货 1.从官网下载 mysql5.7相关资源 如果linux系统可以联网,直接输入命令: # wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz下载 如果不能需要去下载:mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz文件再传入CentOS系统 2.将CentOS7系统自带的数据库删除 需要卸载所有的mariadb软件(完全兼容mysql的另一个数据库,mysql原创者所写),通过命令可以查看到系统安装的所有 mariadb 数据库 # rpm -qa|grep mariadb 通命令可以删除这些数据库 # yum remove mariadb* 也可以通过命令一条一条删除 # rpm -e --nodeps mariadb-libs-5.5.41-2.el7_0.x86_64 查看是否还有mysql数据库 # rpm –qa|grep -i mysql 查看残留的目录: # whereis mysql 如果有应该会输出 /usr/lib64/mysql /usr/bin/mysql等多个目录 删除mysql目录: # rm –rf /usr/lib64/mysql 3.安装mysql系统 将mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz文件解压并放到usr/local/mysql目录下面 添加系统mysql组和mysql用户 添加系统mysql组 # groupadd mysql 添加mysql用户 # useradd -r -g mysql mysql(添加完成后可用id mysql查看) 切换到mysql目录 # cd /usr/local/mysql 修改当前目录拥有者为mysql用户 # chown -R mysql:mysql .

Android Q Beta 发布

原文发布者:Dave Burke,工程副总裁 2019年,移动创新比以往任何时候都更加强大,从5G到边缘到边缘显示器甚至可折叠屏幕的新技术。Android正处于这一创新周期的中心,并且由于数十亿设备的广泛合作伙伴生态系统,Android有助于突破硬件和软件的界限,为用户带来新的体验和功能。 随着移动生态系统的发展,Android专注于帮助用户利用最新的创新,同时确保用户的安全和隐私始终是首要任务。基于Google Play Protect和运行时权限等工作,Android Q为用户带来了许多额外的隐私和安全功能,以及可折叠的增强功能,用于连接的新API,新媒体编解码器和相机功能,NNAPI扩展,Vulkan 1.1支持,更快的应用启动等等。 今天我们正在为早期采用者发布Android Q的Beta 1,并为开发人员发布预览SDK。您可以通过注册任何Pixel设备开始使用Beta 1 (包括原始的Pixel和Pixel XL,我们已根据大众需求扩展支持!)请告诉我们您的想法!继续阅读以了解Android Q中的内容,我们将在5月份的Google I / O上看到您,我们将分享更多内容。 建立在Android的隐私保护之上 Android在中心设计了安全和隐私。随着Android的成熟,我们添加了一系列功能来保护用户,例如基于文件的加密,需要应用程序在访问敏感资源之前请求权限的操作系统控件,锁定相机/麦克风后台访问,锁定模式,加密备份,Google Play Protect(每天扫描超过500亿个应用以识别可能有害的应用并将其删除)等等。在Android Q中,我们进行了更多增强功能以保护用户。其中许多增强功能都是我们在Strobe项目中工作的一部分。 让用户更好地控制位置 借助Android Q,操作系统可帮助用户更好地控制应用何时获取位置信息。与以前版本的操作系统一样,只有在应用程序请求您许可后,应用程序才能获取位置,并且您已授予该权限。 一个特别敏感的事情是应用程序未使用时(在后台)应用程序访问位置。Android Q允许用户授予应用程序权限,以便永远不会看到他们的位置,仅在应用程序正在使用(运行)时,或始终(在后台)。 例如,要求用户的食物递送位置的应用程序是有意义的,并且用户可能想要授予它执行该操作的能力。但由于应用程序可能不需要位于当前正在使用的位置之外,因此用户可能不希望授予该访问权限。Android Q现在提供更高级别的控制。阅读开发人员指南,了解有关如何针对此新控件调整应用的详细信息。在即将到来的Betas中寻找更多以用户为中心的改进。与此同时,我们的目标是非常敏感,始终通过这些更改尽可能多地给予开发人员注意和支持。 Android Q中的更多隐私保护 除了位置变化之外,我们还会进行进一步的更新,以确保透明度,让用户控制并保护个人数据。 在Android Q中,操作系统使用户可以更好地控制应用程序,控制对共享文件的访问。用户将能够通过新的运行时权限控制应用程序对照片和视频或音频集合的访问。对于下载,应用必须使用系统文件选择器,允许用户决定应用可以访问哪些下载文件。对于开发人员,应用程序可以在外部存储上使用共享区域的方式发生了变化。请务必阅读Scoped Storage更改以获取详细信息。 我们还看到,当应用程序意外跳转到前台并重新关注时,用户(和开发人员!)会感到不安。为了减少这些中断,Android Q将阻止应用在后台启动活动。如果您的应用程序处于后台并且需要快速引起用户的注意 - 例如来电或闹钟 - 您可以使用高优先级通知并提供全屏意图。有关更多信息,请参阅文档。 我们限制访问不可重置的设备标识符,包括设备IMEI,序列号和类似标识符。阅读最佳实践以帮助您为用例选择正确的标识符,并在此处查看详细信息。我们还默认连接到不同的Wi-Fi网络时随机化设备的MAC地址 - 这是Android 9 Pie中可选的设置。 我们会尽早为您提供这些更改,因此您可以尽可能多地准备时间。我们还努力为开发人员提供详细的信息,我们建议您查看有关隐私更改的详细文档,并立即开始测试。 吸引用户的新方法 在Android Q中,我们正在启用新方法,将用户引入您的应用,并在从其他应用转换时简化体验。 可折叠和创新的新屏幕 可折叠设备开辟了一些创新体验和用例。为了帮助您的应用利用这些和其他大屏幕设备,我们在Android Q中进行了一些改进,包括对onResume和onPause的更改,以支持多重简历,并在重点关注时通知您的应用。我们还更改了resizeableActivity清单属性的工作方式,以帮助您管理应用在可折叠和大屏幕上的显示方式。为了开始构建和测试这些新设备,我们一直在努力更新Android Emulator以支持多显示器类型切换 - 更多细节即将推出! 分享快捷方式 当用户想要与另一个应用中的某人共享照片等内容时,该过程应该很快。在Android Q中,我们使用“共享快捷方式”让用户更快更轻松,这样用户就可以直接跳转到另一个应用程序来共享内容。开发人员可以发布在其应用中添加内容的特定活动的共享目标,并在共享UI中向用户显示这些目标。因为它们是预先发布的,所以共享UI可以在启动时立即加载。 共享快捷方式机制类似于应用程序快捷方式的工作方式,因此我们扩展了ShortcutInfo API,使两个功能的集成更加容易。新的ShareTarget AndroidX库也支持这个新的API。这允许应用程序使用新功能,同时允许pre-Q设备使用Direct Share工作。您可以在此处找到包含源代码的早期示例应用。 设置面板 您现在还可以通过新的设置面板API直接在应用程序的上下文中显示关键系统设置,该API利用了我们在Android 9 Pie中引入的切片功能。 设置面板是一个浮动UI,您可以从应用程序调用该UI以显示用户可能需要的系统设置,例如Internet连接,NFC和音量。例如,浏览器可以显示具有连接设置的面板,如飞行模式,Wi-Fi(包括附近的网络)和移动数据。没有必要离开应用程序; 用户可以从面板中根据需要管理设置。要显示设置面板,只需使用新的Settings.

Java求3个数的最小公倍数(3个数都是正整数)

最近研究算法的时候突然发现目前国内网上发布的关于这道题的文章有很多都是错误的(都是些新手写的,至少在这篇文章之前是这样的),自己写完以后发现这其中的算法复杂程度的确不是新手就能够驾驭的。 相关导读: Java求3个数的最大公约数(3个数都是正整数) https://blog.csdn.net/number1killer/article/details/83895741 Java求3个数的最大公约数算法优化(3个数都是正整数) https://blog.csdn.net/number1killer/article/details/84069833 Java求3个数的最大公约数算法再优化(短路求值) https://blog.csdn.net/number1killer/article/details/84143395 Java求3个数的最大公约数算法第3次改进 https://blog.csdn.net/number1killer/article/details/84143451 话不多说,直接上代码:

打包2阶段-使用reshacker修改打包信息

一、了解reshacker 用于修改可执行文件如exe的信息。内部资源的资源修改工具。 就是如下图所示((✿◡‿◡)遮挡的有点多哈嘻嘻嘻嘻)的修改这些内容的软件。 二、下载reshacker 百度下载reshacker好多下载的页面 自己去找吧 下载成功之后打开如下: 三、应用 双击上图的.exe文件 进入应用程序 选中打包步骤一里面的生成的.exe文件 在这就可以更改信息 比如版本号公司名称等 改完编译 然后另保存。然后就可以去你另保存的文件查看信息改变没有。

七大查找算法(Python)

查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。 查找表(Search Table):由同一类型的数据元素构成的集合 关键字(Key):数据元素中某个数据项的值,又称为键值 主键(Primary Key):可唯一的标识某个数据元素或记录的关键字 查找表按照操作方式可分为: 1.静态查找表(Static Search Table):只做查找操作的查找表。它的主要操作是: ①查询某个“特定的”数据元素是否在表中 ②检索某个“特定的”数据元素和各种属性 2.动态查找表(Dynamic Search Table):在查找中同时进行插入或删除等操作: ①查找时插入数据 ②查找时删除数据 顺序查找 算法简介 顺序查找又称为线性查找,是一种最简单的查找方法。适用于线性表的顺序存储结构和链式存储结构。该算法的时间复杂度为O(n)。 基本思路 从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1。 优缺点 缺点:是当n 很大时,平均查找长度较大,效率低; 优点:是对表中数据元素的存储没有要求。另外,对于线性链表,只能进行顺序查找。 算法实现 # 最基础的遍历无序列表的查找算法 # 时间复杂度O(n) def sequential_search(lis, key): length = len(lis) for i in range(length): if lis[i] == key: return i else: return False if __name__ == '__main__': LIST = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]

windows系统composer安装使用

windows系统使用composer.exe安装一直安装不上(php.ini扩展php_openssl已开启) 使用第二种安装方式 1、下载百度网盘资源composer.phar 提取码:z4n1 2、使用命令输入 echo @php "%~dp0composer.phar" %*>composer.bat 生成批处理文件 3、镜像至国内镜像可以加快下载速度 composer config -g repo.packagist composer https://packagist.phpcomposer.com composer -v 正确输出就可以使用composer了 转载于:https://www.cnblogs.com/get-rich/p/10527701.html

group_concat() 长度限制

今天发现MySQL group_concat() 函数居然有长度限制 啊啊啊啊啊 之前真的不知道 今天有个需求是 将500+人的名字拼接在一起,以","分割。 结果发现每次执行只有一部分被拼接 约 100+条 于是乎就去查了一个 group_concat() 函数 才发现有长度限制 原来group_concat的长度只有1024 解决方式: //查看group_concat_max_len的valuevalue show variables like "group_concat_max_len"; //给它设置一个较大的值 SET SESSION group_concat_max_len=102400;

Fluttter中让 Container 充满整个屏幕

在Contianer节点添加 width 和height属性 body: Center( // widthFactor: double.infinity, child: Container( width: double.infinity, height: double.infinity, child: Image.network("http://jspang.com/static/myimg/WechatIMG12.jpeg"), color: Colors.lightBlue, // color: Color.fromARGB(255, 255, 0, 0), ), 就可以解决了

zabbix-server配置文件

# This is a configuration file for Zabbix server daemon # To get more information about Zabbix, visit http://www.zabbix.com ############ GENERAL PARAMETERS ################# #基本参数 ### Option: ListenPort # Listen port for trapper. # # Mandatory: no # Range: 1024-32767 # Default: # ListenPort=10051 # 说明zabbix服务端监听端口,用于接收客户端的采集数据 ### Option: SourceIP # Source IP address for outgoing connections. # # Mandatory: no # Default: # SourceIP= #说明:服务端监听IP ### Option: LogType # Specifies where log messages are written to:

Java乱码总结

昨天项目遇到了乱码问题,在自己电脑上是没问题的然而在服务器上就出现的乱码的问题,所以就以乱码为点来仔细的了解一下Java中的乱码。 先简单了解一下java的字符串的编码到存储的过程: java在字符串中统一用Unicode表示。 对于任意一个字符串:String string = “测试字符串”; 如果源文件是GBK编码,操作系统默认环境编码也为GBK,那么编译的时候,JVM将按照GBK编码将字节数组解析为字符,然后将字符转换为Unicode格式的字节数组,作为内部存储(字节数组→字符→Unicode字节数组)。当打印这个字符串时,JVM根据操作系统本地的语言环境,将Unicode转换为GBK,然后操作系统将GBK格式的内容显示出来。 当源码文件是UTF-8, 我们需要通知编译器源码的格式,javac -encoding utf-8 … , 编译时,JVM按照utf-8 解析成字符,然后转换为unicode格式的字节数组, 那么不论源码文件是什么格式,同样的字符串,最后得到的unicode字节数组是完全一致的,显示的时候,也是转成GBK来显示(跟OS环境有关) 一、Java常见的编码方式 ASCII码:众所周知,这是最简单的编码。它总共可以表示128个字符,0~31是控制字符如换行、回车、删除等,32~126是打印字符,可以通过键盘输入并且能够显示出来的。 ISO-8859-1:它是基于ASCII码基础上扩展的,它总共能表示256个字符,涵盖了大多数西欧语言字符。详见 ISO-8859-1 编码 该编码不支持中文,举个中文编码栗子 :字符串“I am 君山”用 ISO-8859-1 编码,下面是编码结果 由于ISO-8859-1 是单字节编码且不支持中文,直接将中文字符转成‘3f’, 3f也就是常见的"?"字符 GB2312: 它是双字节编码,共包含6763个汉字。 GBK:汉字内码扩展规范,是基于GB2312上拓展的,加入了更多的汉字,能表示21003个汉字。它的编码是和GB2312兼容的。也就是说用GB2312编码的汉字可以用GBK来解码,并且不会乱码。倒过来就不完全可以了,因为GB2312描述的汉字比GBK少。 UTF-16:UTF-16是基于Unicode上定义的, 用两个字节来表示Unicode的转换格式,它采用定长的表示方法,即不能什么字符都可以用两个字节表示。两个字节是16个bit,所以就做UTF-16。(Unicode 囊括了世界上所有语言,所有语言均可通过Unicode来相互翻译,详解 Unicode 编码) UTF-8:由于UTF-16统一采用两个字节来表示一个字符, 有很多字符用一个字节表示即可。所以存储空间放大了一倍,还会增加网络传输的流量,所以推出了UTF-8。 UTF-8采用了一种变长技术,每个编码区域有不同的字码长度。 二、常见乱码问题分析 乱码指的是程序显示出来的字符文本无法用任何语言去解读。一般情况下会包含大量的?。本质上都是由于字符串原本的编码格式与读取时解析用的编码格式不一致导致的。 中文变成看不懂的字符:如果一串中文字符变成了一串看不懂的字符如:"Ì Ô £ ¡Î Ò Ï²»¶ £ ¡",这种情况通常是编码字符集与解码时所用的字符集不一致所造成的。比如使用GBK编码,如果使用ISO-8859-1解码的话结果就是这样。一个汉字变成了一个问号:如果编码和解码的字符集都是一致的,那么可以确定该字符编码不支持中文,例如:ISO-8859-1一个汉字变成了两个问号:中文经过多次编码且其中有一次编码或者解码使用了不支持中文的字符集 三、常见案例分析 参数传输乱码 背景:从jsp中传参数(包括中文)请求后台数据,在后台获取到的请求参数乱码。 1、前端编码设置,先讲解下jsp中编码的配置: a、其中contentType中charset用来设置服务器发送给客户端时的内容编码;pageEncoding 用来设置JSP源文件本身和响应正文中的字符编码。通俗的说pageEncoding是jsp文件本身的编码,如果pageEncoding设置为ISO-8859-1,则jsp页面中不能保存中文字符,会自动提示你是否要设置为UTF-8. b、jsp文件编码字符集默认为ISO-8859-1, JSP源文件字符集时,优先级为pageEncoding>contentType。如果都没有设置,默认ISO-8859-1。 c、设置响应输出的字符集时,优先级为contentType>pageEncoding。如果都没有设置,默认ISO-8859-1。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 综上所述,解决该问题乱码的第一步要设置jsp中的编码,最好统一为UTF-8。 exmaple(乱码示例): 页面效果如下:

ViewModel源码分析

一、ViewModel的简介 2018年谷歌IO大会上正式发布了JetPack组件,其中包括Databing、Lifecycles、LiveData、Navigation、Paging、Room、ViewModel、WorkManager等一系列框架。并且发布androidx包,这些框架的最新版本组件将引入到androidx包下。 JetPack架构组件的发布,意味着google终于拿出了官方推荐的Android开发架构,一直以来在Android开发上老生常谈三种开发模式,MVC、MVP、MVVM。整体的思想就是做一些代码封装和操作上的分离,具体三种架构的区别不在这详细描述。说一点儿个人对这三中开发模式的理解。 MVC:Activity承担C的任务,强行carry大量业务和数据代码。 MVP:Presenter承担主要代码任务,连接数据层和视图层的交互。 MVVM:Model负责数据、View负责展示、ViewModel负责Model和View的交互,同时,最好的一点是View层自动监听ViewModel的数据变化。 在JetPack组件出现之前,一直以来构建MVVM架构的方式都是代用Databing来充当ViewModel,而Databing是采用标签方式写入布局文件中的,这样一来当出现问题的时候不是太好进行调试。所以ViewMode的出现对于MVVM模式开发具有重大的意义。 二、ViewModel的用法和特点 ViewModel的使用是要结合LiveData框架进行的,LiveData框架也是JetPack组件的一部分,这里先不详细进行介绍。ViewModel有两个特点,一是更加方便的保存数据,第二个特点,也是最重要的特点,就是保证数据不受Activity的销毁重建所影响,当Activity销毁重建后仍然能收到之前的数据。 1)继承ViewModel class MainViewModel : ViewModel() { private val repertory: MainRepository by lazy { MainRepository() } var data: MutableLiveData<JsonBean> = MutableLiveData() fun getDataFromServer(){ repertory.getDataFromServer(data) } } 复制代码 ViewModel中持有LiveData,LiveData是ViewModel持有数据的载体。 2)Activity通过ViewModelProviders获取ViewModel class MainActivity : AppCompatActivity() { private lateinit var mModel: MainViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) initData() } private fun initData() { mModel = ViewModelProviders.of(this)[MainViewModel::class.java] mModel.data?.observe(this, Observer { val mainAdapter = MainAdapter(this, it) val linearLayoutManager = LinearLayoutManager(this) rv.

使用STM32Cube生成的工程在使用JLink下载调试时遇到的问题

最近在学习使用STM32Cube这种比较新的方法来写STM32程序,但是在刚开始学的时候就遇到了一个让自己很头疼的问题,在使用JLink下载程序时,程序能够烧写进板子,但是却出现一个莫名其妙的警告。 并且在使用在线调试功能时,点击全速运行,出现一堆错误。 在网上找了许多的解决方案,也有很多遇到类似问题的,但是试了以后都没有解决,最后自己一步一步的找原因,最后发现在STM32Cube生成的工程中的stm32f1xx_hal_msp.c文件中的第78行有这样一行代码。 /**DISABLE: JTAG-DP Disabled and SW-DP Disabled */ __HAL_AFIO_REMAP_SWJ_DISABLE(); 这行代码将SW-DP关闭了,所以我们在仿真的时候程序运行到这里因为SW-DP被关闭,仿真功能就不能使用了,程序就会执行不下去,所以就报了上面那样的一堆错误。在把这行代码注释掉以后问题得到解决。 上面的解决方法是我一步步运行找出来的,归根结底的原因是在用Cube设计时,要将和SW-DP相关的引脚定义成仿真引脚,这样Cube生成的代码就会自动将上面的那行代码改掉。 然后在Pinout里将SYS里面的Debug设置成Serial Wire,这样问题得到解决

Oracle数据库的备份与恢复常用方法 详解

Oracle数据库的备份与恢复 在Oracle数据库的使用过程中,备份与恢复是经常遇到的操作。Oracle中的备份分为两大类:逻辑备份和物理备份。其中物理备份又分为两类:冷备份和热备份。本节将简要讲述如何利用各种备份手段进行Oracle数据库的备份与恢复。 1 逻辑备份/恢复(导出/导入) 逻辑备份是指利用exp命令进行备份。利用该命令进行备份,简单易行,也不影响正常的数据库操作。因此,经常被作为日常备份的手段。exp命令可以添加多个参数选项,以实现不同的导出策略。可以通过exp –?命令进行查看。其中,常用参数包括:owner、table和inctype。 1.必备参数 对于一个导出命令,可以只使用必备参数,如范例1所示。 【范例1】演示导出命令的使用。 C:\Documents and Settings\Administrator>exp system/abc123 file=d:/b.dmp 【代码说明】system/abc123为登录数据库时所使用的用户名和密码;file=d:/b.dmp指定数据导出所存放的文件完整路径。这里需要注意的是,该命令并未指定登录到哪个数据库实例,因此,将使用系统环境变量ORACLE_SID所指定的数据库实例。 注意:另外一种特殊情况为,在环境变量列表中找不到ORACLE_SID,那么,可以在注册表中搜索ORACLE_SID项。Oracle也会参考注册表中该项的值来设置环境。 2.owner参数 owner参数,可以指定一个用户名列表。导出时,将只导出用户名列表中用户所拥有的对象,如范例2所示。 【范例2】演示owner参数的使用。 C:\Documents and Settings\Administrator>exp system/abc123 owner=(test, oracle) file=d:/b.dmp 【代码说明】owner=(test, oracle)指定exp命令仅仅导出test和oracle两个用户所拥有的对象。如果某个用户不存在,例如,本例中用户oracle不存在,那么将给出相应警告,但不会影响对于用户test的对象的导出。 3.tables参数 当使用exp命令时,同样可以指定tables参数。该参数用于指定导出哪些数据表。范例3演示了该参数的使用。 【范例3】演示tables参数的使用。 exp system/abc123 tables=(people, employees) file=d:/b.dmp 【代码说明】tables=(people, employees)指定了要导出的数据表列表,在exp命令执行时,将只导出用户system的people和employees表。如果要导出的表不存在,那么将给出警告信息。但不会影响其他表的导出工作。 4.关于inctype参数 在Oracle 9i之前的版本中,可以利用inctype参数指定导出的增量类型。但是,在Oracle 9i及以后的版本中,该参数不再使用。范例4演示了在Oracle 10g中使用该参数的错误信息。 【范例4】Oracle 10g中参数inctype已经废除。 C:\Documents and Settings\Administrator>exp system/abc123 inctype= complete file=d:/b.dmp 【代码说明】在exp命令中使用inctype参数,Oracle将抛出错误错误信息, 对于逻辑备份,相应的恢复命令为imp。如果数据库遭到破坏,可以利用如下命令进行恢复: C:\Documents and Settings\Administrator>imp system/abc123 file=d:/b.dmp imp命令同样可以指定参数。例如,使用owner参数只导入特定用户的对象;使用tables参数只导入特定表,代码如下: C:\Documents and Settings\Administrator>imp system/abc123 file=d:/b.dmp tables=(people, employees) 该命令将只导入名为people与employees的表。 2 物理备份/恢复 物理备份,是指直接备份数据库的文件。物理备份又分为两种:冷备份和热备份。

nodejs异步和回调

什么是异步 比如早上起来,我需要洗口3min,烧水3min,冲牛奶,做这三件事的过程我们分析一,假设烧水只需要按一下开关,冲牛奶不耗时 异步:烧水,洗口–>冲牛奶=3min 同步:洗口–>烧水–>冲牛奶=6min nodejs机制 nodejs是单线程语言,所有事件都是放在一个堆栈中去进行,必须把当前函数栈清空才会去执行后面代码,但是是不是就不能做到异步呢,也不是,它有特例,nodejs针对io操作和部分网络请求提供了异步操作,接下来看一下下面例子 同步例子 function runSync() { for (var i = 0; i < 5; i++) { var waitUnit = new Date().getTime() + 1000; while (waitUnit > new Date().getTime()) { } console.log('doing'); } } runSync(); console.log('end'); 输出结果: doing doing doing doing doing end 以上就是一个同步的例子,必须等待函数runSync执行完成才会执行下面的log 异步例子 var fs = require('fs') function read_file(path){ fs.readFile(path,"UTF-8",function(err,data){ if(data){ resolve(data); console.log('resolve'); }else{ reject(err); console.log('reject'); } }); } read_file('/Users/jemy/Desktop/player_sdk2.1.5.zip'); console.log('end'); 输出信息如下: end resolve 发现先打印了end,这个是为什么呢,因为node内部的io会将readFile这个事件起一个辅助线程,然后就不管它了,而readFile是一个耗时操作,所以会先打印log(‘end’),当readFile这个耗时操作执行完时会回调告知已经执行完毕