vscode

一、代码提示功能 1、安装插件C/C++ Clang Command Adapter; 2、下载clang软件至windows并安装,勾选添加环境变量 http://releases.llvm.org/download.html 3、创建clang.exe快捷方式,复制到vscode安装目录下的./bin中。 二、code runner插件 中文乱码问题 1、ctrl+shift+p,输入setting,选择 "首选项:打开设置(json)"; 2、添加 "code-runner.runInTerminal":true, 三、code runner插件,运行时,提示gcc不是内部或外部的命令... 1、安装MinGW64; 2、解压后将文件拷贝至clang文件夹中,中途出现冲突时,选择合并; 3、cmd,分别输入clang和gcc命令验证下。 参考:https://www.zhihu.com/question/30315894 四、光标显示,括号不显示方框 首选项——>editor.Match Brackets

shell脚本各种括号 [] [[]] () (()) {}的含义

shell () ①作用域。相当于C++中{},在括号中的语句,可以使用;分隔,每句顺序执行,但是不能被括号外的语句使用其中定义的变量。 ②初始化数组。array=(1 2 3) for i in ${ar[@]} do echo $i done (()) ①进制转换。echo$((8#71))->57。8表示8进制,71表示具体8进制数据,转换10进制之后是57。 ②重定义变量。x=10;((x++));echo $x;输出6 ③用于运算以及判断。规则上符合C语言习惯,if(($n>=10))等价于if [ $n -eq 10 ]。 for((i=0;i<10;i++))等价于for i in {0..4} [] ①与test命令相同,-f判断是否文件,[ -f test.txt ]; ②运算符比较。==和!=,<用于字符串比较,-gt -eq用于整数比较。-a并且,-o或者 ③用于正则表达式。 ④描述数组元素。ar=(1 2 3) for i in {0..2}do echo ${ar[i]} done [[]] ①逻辑判断,例如&&、||、==等。shell脚本中可以多多使用[[]]以替代[] {} ①变量扩展。ls -al {a..c}.txt,展示a.txt,b.txt,c.txt的详细信息 ②触发变量值。例如${ar[2]}数组ar的第三号元素值 ③作用域。括号中的语句,使用;分隔,顺序执行。

jQuery的each方法

开发工具与关键技术:Visual Studio / each方法的应用 作者:郑名方 撰写时间:2019年6月 25日 为什么说jQuery中有个重要的方法.each(),因为大部分jQuery方法在内部都会调用.each,其中主要的原因就是jQuery的实例是一个元素集合。它可以找到所以“div”,并且都设置样式,css类只是一个方法,所以内部会调用.each()方法处理这个div的集合,给每个div都设置style属性。还有jQuery的大部分方法都是有针对性地对集合进行操作,所以jQuery会提供$(selector).each()方法来遍历jQuery对象,而且.each()只是处理jQuery对象的方法,jQuery还会提供一个通用的jQuery.each()方法,用来处理对象和数组的遍历。 each就是for循环方法的一个包装,内部就是通过for遍历数组与对象,通过回调函数返回内部迭代的一些参数,第一个参数是当前迭代成员在对象或数组中的索引值(从0开始计数),第二个参数是当前迭代成员(与this的引用相同jQuery.each()函数还会根据每次调用函数callback的返回值来决定后续动作。如果返回值为false,则停止循环(相当于普通循环中的break);如果返回其他任何值,均表示继续执行下一个循环。 除了jQuery对象.each()方法的调用,.each()的方法还可以同DOW对象,以每一个匹配的元素作为上下文来执行一个函数。每次执行传递进来的函数时,函数中的this关键字都指向一个不同的DOW(每次都是一个不同的匹配元素)。并且,在每次执行函数时,都会给函数传递一个表示作为执行环境的元素在匹配的元素集合中所处位置的数字值作为参数(从零开始的整型)。返回”false”将停止循环(就像在普通的循环中使用”break”)。返回”true”跳至下一个循环(就像在普通的循环中使用“continue”)。 代码图片来源老师。

C++实现的Prim算法(最小生成树)

1. 最小生成树 是一个在给定的无向图G(V,E)中求出一棵树T,使得这棵树拥有图G中的所有有顶点,且所有边都是来自于图G中的边,并且满足这棵树的边权之和是最小的 对于最小生成树需要掌握以下三个性质: ① 最小生成树是树,因此其边数是等于顶点数减1,而且树内一定不会有环 ② 对于给定的图G(V,E)其最小生成树可以是不唯一的,但是边权这个是唯一的 ③ 由于最小生成树是在无向图中产生的,所以其根节点可以是这棵树上的任意一个节点,于是题目中涉及了最小生成树的输出为了让最小生成树是唯一的,一般都是直接给出根节点 求解最小生成树的算法有两种,即Kruskal算法与prim算法,这两个算法都是采用了贪心的策略,只是贪心的策略是不一样 2. 下面使用的是prim算法求解最小生成树的过程,prim算法与Dijkstra算法是很类似的,只是有一个地方存在差别,就是d[]数组记录的含义是不一样的,Dijkstra算法中的是源点到其余顶点的最短距离,而这里的是顶点vi到集合S之间的距离 下面是算法的执行过程: ① 每次都是从集合V-S中选择与集合S最近的一个顶点,集合S中的顶点存放的是已经被访问过的顶点,将这个顶点记录为u,访问u并且将其加入到集合S中,同时将这条离集合S的边加入到生成树中 ② 令顶点u作为集合S与集合V-S连接的接口,优化从u能够到未访问顶点与集合S的最短距离 其实对于上面的算法,我自己的理解是是否需要更新到当前顶点的距离,每一次都是选择d[]中最小的而且未被访问过的顶点,然后决定是否更新到其余顶点的距离,所以d数组的含义也可以这样理解,其他顶点到当前我这个顶点的最短距离是多少 3. 下面是C++代码写的代码: #include<cstdio> #include<iostream> using namespace std; const int maxSize = 1000; const int INF = 2147483647; int n, m, G[maxSize][maxSize]; int d[maxSize]; bool vis[maxSize] = {false}; int prim(){ fill(d, d + maxSize, INF); d[0] = 0; int ans = 0; for(int i = 0; i < n; i++){ int u = -1, min = INF; for(int j = 0; j < n; j++){ if(vis[j] == false && d[j] < min){ u = j; min = d[j]; } } //找不到小于INF的d[u]则剩下的顶点和集合s不连通 if(u == -1) return -1; vis[u] = true; ans += d[u]; for(int v = 0; v < n; v++){ if(vis[v] == false && G[u][v] !

C语言int类型转换为char类型

/***************int类型转换为char类型*****************/ void IntOrChar(int x) { char a[]={"0"}; char wan,qian,bai,shi,ge,index; wan=x/10000; qian=x%10000/1000; bai=x%10000%1000/100; shi=x%10000%1000%100/10; ge=x%10000%1000%100%10; a[0]=wan; a[1]=qian; a[2]=bai; a[3]=shi; a[4]=ge; } void main(void) { IntOrChar(12345); for(index=0;index<5;index++) { printf("%s",a[index]); } }

React ant design表格导出数据为EXCEL表格数据

一、由于公司项目需要,需要将表格数据导出为EXCEL表格数据。环境React+Ant Design 二、安装插件js-export-excel yarn安装-记得以管理员身份执行 yarn add js-export-excel npm安装 npm install js-export-excel 三、代码事例 页面先引入安装的插件 import ExportJsonExcel from 'js-export-excel'; 按钮: return ( <div> <Button onClick={this.downloadExcel}>导出Excel表格</Button> </div> ) 调用: downloadExcel = () => { const datas = this.state.data ? this.state.data : '';//表格数据 var option={}; let dataTable = []; if (datas) { for (const data in datas) { if(data){ let obj = { id: data.id, organization_code: data.organization_code, organization_name: data.organization_name, } dataTable.push(obj); } } } option.

剑指Offer:30 连续子数组的最大和(最大子列和)

最大子列和问题,陈越老师的数据结构课第一节里就讲过,照着原来的代码写一遍发现出了问题: 1、一开始忘了初始化maxSum,导致里面是一个随机且很大的数,所以出错。 2、处理了问题1之后,只通过了1/3的case,原因是都为负数的时候返回值为0。 class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { int n = array.size(); if(array.empty()) return 0; int thisSum =0, maxSum = 0; for(int i=0; i<n; i++) { thisSum += array[i]; if(thisSum > maxSum){ maxSum = thisSum; } else if(thisSum<0){ thisSum = 0; } } return maxSum; } }; 照搬原来的代码行不通了,需要在原来的代码基础上改进。 看了书上的动态规划的思路,对之前的“在线式”算法,作了一些改动,即可通过。 class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { int n = array.size(); if(array.empty()) return 0; int curMaxSum =array[0], maxSum = array[0]; for(int i=1; i<n; i++) { if(curMaxSum<=0){ curMaxSum = array[i]; if(maxSum<array[i]) maxSum = array[i]; } else{ curMaxSum += array[i]; if(curMaxSum>maxSum) maxSum = curMaxSum; } } return maxSum; } }; 当然书上的代码写法更简洁,尤其是初始值选取的很恰当:

Ubuntu开机无法进入图形界面,自动进入emergency mode解决方法

ubuntu进入时显示You are in emergency mode,如下图: 出现此种情况原因是挂载的磁盘出现了问题,一般强制重启或者更改挂载会出现此问题。 1、直接在此界面输入密码,enter进入系统。 2、通过命令$ journalctl -xb 查看日志输出,搜索关键字 “fsck failed”(输入/,然后输入关键字后回车,通过N/n查看上一个/下一个匹配项),查找是哪块出现问题,如果没看出来,再进行下一步。 3、输入命令 $ vim /etc/fstab ,检查磁盘挂载信息,看看都用了哪块磁盘,然后依次进行如下测试: 执行命令 umount /dev/xxx 卸载设备执行命令 fsck -y /dev/xxx 执行fsck校验并修复文件 而我的系统是由于我在/etc/fstab中挂载了共享文件夹导致,所以把下图这句话注释掉,reboot之后就正常了。但是不知道是什么原因导致我的系统挂载失败,重启之后重新再挂载一次之后又正常了。

idea中直接运行spark程序

我们可以在IDEA中直接运行spark程序,来连接服务器上的HDFS或者是spark集群来跑spark任务。 提前工作 我们需要先解决idea直接运行程序远程访问HDFS的问题。 首先下载 hadoop-common-2.6.0-bin-master.rar 压缩包(需要和服务器上的Hadoop版本对应),解压到任意目录,然后在环境变量中添加 HADOOP_HOME ,变量值为解压的位置。在 PATH 变量中添加以下值:%HADOOP_HOME%\bin ,之后确认即可,如果后面在idea中运行程序报错: 则重启一下电脑,使上面的配置生效。 本地运行 本地调试是使用本地idea中编写的代码引入的spark的相关jar包来运行spark程序,将spark程序提交到本地spark(本地并不需要安装Windows版本的spark)运行。下面是获取SparkContext的代码: val config = new SparkConf().setAppName("WordCount").setMaster("local") val sparkContext = new SparkContext(config) 一定要调用setMaster()方法,方法参数设置为local。 之后直接运行主方法就可以运行该程序。 远程运行 远程运行是指经过代码设置,idea自动将代码打包并发布到指定的远程服务器上的spark上运行,远程服务器上的spark master接受jar包,并发布给worker运行,并可以在页面上看到master和worker中程序的执行情况。下面是获取SparkContext的代码: val config = new SparkConf().setAppName("WordCount").setMaster("spark://zb2:7077") .setJars(List("target/sparkdemo-1.0-SNAPSHOT-jar-with-dependencies.jar")) .setIfMissing("spark.driver.host", "172.16.72.251") val sparkContext = new SparkContext(config) 1. setMaster方法中设置远程spark服务的master地址; 2. setJars方法中传递一个Seq,里面写上jar包的位置(idea中打完jar包的位置); 3. setIfMissing方法中设置spark驱动的机器IP地址,也就是你Windows开发电脑的IP地址。 4. 之后直接运行主方法就可以运行该程序,idea自动打包并发布到远程spark服务器。 注意:你的Windows和虚拟机里面的spark所在的linux系统(或者是linux服务器)必须能够互相ping通才行,而且都得关闭防火墙,因为他们相互之间需要通信。

使用 idea查看类关系图形

idea使用Diagram图形查看类关系 标签:idea diagram 写在前面 最近在闲下来在看 spring 源码的时候,发现根本对 diagram 不熟,看到的类关系一脸懵逼,理解上也是烂七八糟,这次利用 idea diagram,结果真的是一目而然,好东西就要利用起来,就此分享。 1、查看图形 在 idea 中查看类关系,大家都会经常用到。步骤如下,①在类的标签页内。点击右键,选择 Diagram,其中 show 和 show …Poup,区别就是前者在新建的标签内,后者以复现的形式展示;②实际上还可以在项目目录树,对你想查看的类点击右键,同样选择 Diagrams 效果也是一样 然后就得到下面所示的继承关系,以 spring 中核心类DefaultListableBeanFactory 显而易见: 蓝色实现箭头是指继承关系 绿色虚线箭头是指接口实现关系 2、有时候需要我们优化继承链图形 2.1 去掉不关系的类 得到的继承关系图形,有些并不是我们想去了解的,比如上图的SuppressWarnings,我们只想关心Beanfactory重要的那几个继承关系,怎么办? 点击选择你想要删除的类,然后直接使用键盘上的delete键就行了。清理其他类的关系后图形如下 2、显示详细的类信息 有人说,诶,这怎么够呢,那继承下来的那些方法我也想看啊?简单,IDEA通通满足你。 在页面右键,选择 show categories,根据需要可以展开类中的属性、方法、构造方法等等;当然也可以使用工具栏 什么,方法里你还想筛选,比如说想看protected权限及以上范围的?简单,右键选择 Change Visibility Level,根据需要调整即可。 什么,你嫌图形太小你看不清楚?IDEA也可以满足你,按住键盘的Alt,竟然出现了放大镜,惊不惊喜,意不意外? 3、引入其它类 当我们还需要查看其他类和当前类是否有继承上的关系的时候,我们可以选择加其加入到当前的继承关系图形中来。 在页面点击右键,选择 Add Class to Diagram,然后输入你想加入的类就可以了: 查看具体代码 如果你想查看某个类中,比如某个方法的具体源码,当然,不可能给你展现在图形上了,不然屏幕还不得撑炸? 但是可以利用图形,或者配合IDEA的structure方便快捷地进入某个类的源码进行查看。 双击某个类后,你就可以在其下的方法列表中游走,对于你想查看的方法,选中后点击右键,选择 Jump to Source: 在进入某个类后,如果还想快速地查看该类的其他方法,还可以利用IDEA提供的structure功能: 选择左侧栏的structure之后,如上图左侧会展示该类中的所有方法,点击哪个方法,页面内容就会跳转到该方法部分去。

mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化 执行顺序

一、MYSQL数据库设计规范 1、数据库命名规范 a、采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’_'组成; b、命名简洁明确(长度不能超过30个字符); c、例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个前缀; d、除非是备份数据库可以加0-9的自然数:user_db_20151210; 2、数据库表名命名规范 a、采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’‘组成; b、命名简洁明确,多个单词用下划线’'分隔; 例如:user_login, user_profile, user_detail, user_role, user_role_relation, user_role_right, user_role_right_relation 注:表前缀’user_'可以有效的把相同关系的表显示在一起; 3、数据库表字段名命名规范 a、采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’‘组成; b、命名简洁明确,多个单词用下划线’'分隔; 例如:user_login表字段 user_id, user_name, pass_word, eamil, tickit, status, mobile, add_time; c、每个表中必须有自增主键,add_time(默认系统时间) d、表与表之间的相关联字段名称要求尽可能的相同; 4、数据库表字段类型规范 用尽量少的存储空间来存数一个字段的数据; 例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256); IP地址最好使用int类型; 固定长度的类型最好使用char,例如:邮编; 能使用tinyint就不要使用smallint,int; 最好给每个字段一个默认值,最好不能为null; 5、数据库表索引规范 命名简洁明确,例如:user_login表user_name字段的索引应为user_name_index唯一索引; 为每个表创建一个主键索引; 为每个表创建合理的索引; 建立复合索引请慎重; 6、简单熟悉数据库范式 1、第一范式(1NF):字段值具有原子性,不能再分(所有关系型数据库系统都满足第一范式); 例如:姓名字段,其中姓和名是一个整体,如果区分姓和名那么必须设立两个独立字段; 2、第二范式(2NF):一个表必须有主键,即每行数据都能被唯一的区分; 备注:必须先满足第一范式; 3、第三范式(3NF):一个表中不能包涵其他相关表中非关键字段的信息,即数据表不能有沉余字段; 备注:必须先满足第二范式; 备注:往往我们在设计表中不能遵守第三范式,因为合理的沉余字段将会给我们减少join的查询; 例如:相册表中会添加图片的点击数字段,在相册图片表中也会添加图片的点击数字段; 二、MYSQL数据库设计原则 1、核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先;往往牺牲范式) 拒绝3B(拒绝大sql语句:big sql、拒绝大事务:big transaction、拒绝大批量:big batch); 2、字段类原则 用好数值类型(用合适的字段类型节约空间);

nginx配置https服务

nginx安装的时候需要支持:with-http_ssl_module 模块 查看nginx是否支持:/application/nginx/sbin/nginx -V 证书生成 免费证书可使用阿里云申请获取,这里采用本地生成证书来配置 安装openssl工具yum install openssl yum install openssl-devel 生成证书 进入证书目录cd /application/nginx/conf/cert 创建本地私有密钥openssl genrsa -out ssl.silly.com.key 2048 按提示输入相关信息就可以openssl req -new -key ssl.silly.com.key -out ssl.silly.com.csr 创建证书crtopenssl x509 -req -days 1460 -in ssl.silly.com.csr -signkey ssl.silly.com.key -out ssl.silly.com.crt 创建证书pemopenssl dhparam -out ssl.silly.com.pem 2048 nginx配置文件 server_name : 未配置的域名,根据实际需求修改 配置443端口 server { listen 443 ssl; server_name ssl.silly.com; ssl_certificate /application/nginx/conf/cert/ssl.silly.com.crt; ssl_certificate_key /application/nginx/conf/cert/ssl.silly.com.key; #ssl_dhparam /application/nginx/conf/cert/ssl.silly.com.pem; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root html; index index.

STM32 CM3中APP和Boot跳转问题分析

本文主要是分析一下CM3中程序跳转原理以及需要注意的坑,CM4中跳转原理也是一样的。 一 应用场景 有时我们希望CM3上电后先运行一段bootloader程序,用于做一些前序的处理和控制,然后再跳转到APP代码去运行。 例如产品交付客户后发现需要升级一些功能,这个时候又不能打开产品外壳去重新下载程序,那么就可以通过这段bootloader程序来进行更新,那么这个bootloader就需要具有和外部通信的功能(例如使用CAN或者串口),可以接收传入的代码,并可以读写flash。 前序操作结束后,就需要跳转到APP代码去。总共需要2个Keil工程,一个bootloader的,一个APP的。 二 跳转代码 本文使用STM32F103RCT6,Keil 5.25来做的测试,期望的Flash代码结构如下, 跳转代码网上很多,本文也是从别的博客上copy过来的,如下(经过验证是OK的), #include <stdint.h> const uint32_t APP_FLASH_ADDRESS = 0X08008000; // APP代码在Flash上的起始地址 typedef void (*pFunction)(void); // 定义一个函数指针类型pFunction pFunction Jump_To_Application; // 定义一个函数指针变量 void JumpToApp(uint32_t target_address) { __disable_irq(); // 关闭总中断 // 代码的flash起始地址加4,就是Reset Handler的函数地址 uint32_t JumpAddress = *(__IO uint32_t*)(target_address+4); Jump_To_Application = (pFunction)JumpAddress; // 把这个地址转为函数指针 __set_MSP(*(__IO uint32_t*)target_address); // 设置栈顶地址 Jump_To_Application(); // 开始运行APP的Reset Handler } int main(void) { JumpToApp(APP_FLASH_ADDRESS); // 执行跳转命令 return 0; } 其对应的Keil配置如下, 编译好直接烧录就行了。

python虎扑社区论坛数据爬虫分析报告

以下是摘自虎扑的官方介绍: 虎扑是为年轻男性服务的专业网站,涵盖篮球、足球、F1、NFL等赛事的原创新闻专栏视频报道,拥有大型的生活/影视/电竞/汽车/数码网上交流社区,聊体育谈兴趣尽在虎扑。 二、数据说明 使用的数据来源: 2018/1/1~1/19 两周半内虎扑论坛步行街各子版块的所有帖子,去除关注度极低的帖子,总数为3.3W+; 上述3.3W+篇帖子中主干道版块的回复用户的个人信息,去重后用户总数为2.3W+。 三、虎扑论坛分析 1.各版块活跃度分析 在虎扑社区由10个分论坛,380个子版块构成,日发帖量达到70W+,其中哪一个最活跃呢?通过对比每个版块发帖量,可以发现,在大的分论坛中 【装备论坛】的发帖量最高,其次是【步行街】和【NBA】;在380个子板块中,【运动装备】]和【交易区】最热门,其次是【步行街主干道】和【湿乎乎的话题】;其中,【装备论坛】的发帖占比近7成,远高于其他,而【步行街】又高于【NBA】两倍。 可以看出,交易属性和社交属性是虎扑维持社区热度和用户的活跃度的关键。 各大分论坛发帖量占比 各子版块发帖量占比 2.步行街发帖内容分析 除了交易版块,【步行街】和【NBA】是虎扑活跃度最高的版块,【NBA论坛】的话题一般围绕赛事展开,而【步行街】的社交属性比较强,通过对【步行街】的分析,可以看到在体育赛事之余,虎扑的会员都在关注些什么。 ... 四、虎扑用户分析 1.用户性别 .... 2.用户所在地 ..... 3. 用户的运动爱好 ...... 4.用户日停留时长 .... 五、分析总结 总体上看,虎扑会员以年轻的男性和在校大学生为主,他们喜欢篮球等体育运动,关注NBA,英超等球类联赛;但在步行街社区,他们的话题不仅限于体育,八卦热点,情感咨询等都是他们关注的内容;并且他们每天在虎扑停留时间较长,可以说虎扑的内容很好的抓住了目前的用户群体。 还有问题?联系我们! 转载于:https://www.cnblogs.com/tecdat/p/11065354.html

amr文件怎么转换成mp3

AMR是一个很特殊的音频格式,常被手机各大厂商广泛认可的一种手机录音保存格式。AMR文件的容量非常小,每秒钟的音频文件可以控制在1KB左右,所以即使是长达1分钟的音频文件,亦可以控制在50KB左右,所以许多的彩信加载人声都是采用这个格式的,但是因为这个格式的音频体积非常小,所以音质就可想而知的,非常的差。许多人在拿到AMR音频的第一时间就会将这种格式的音频转换成MP格式3,那么怎么转换呢?下面我们一起来看看吧。 具体步骤: 首先我们在电脑上打开迅捷音频转换器,然后点击上方“音频转换”这个选项,进入音频格式转换界面。 随后我们点击“添加文件”或者“添加文件夹”将AMR格式音频导入,当然你也可以直接将音频从文件夹中直接拖入到软件中来。 之后,我们在“输出文件格式”下拉框中将我们音频的输出格式设置为MP3格式。 如果你需要设置转换音频的音质和声道,我们可以点击”高级设置”。设置好后,我们点击”确定”,即可保存更改。 下面一步,我们可以设置转换音频的保存路径,这样以后我们的音频转换完成了,我们就能在第一时间找到我们的音频文件了。点击“更改路径”,然后选择你需要保存的文件夹,设置好后,我们点击“选择文件夹”就行了。 最后,我们就可以开始转换音频了,点击界面底部的“开始转换”,软件便会开始转换我们的音频,然后耐心等待音频转换完成(转换一首歌整个过程大约一、两分钟)。 当音频转换好后,我们点击“打开文件夹”,即可找到我们转换好的音频文件。 以上便是amr文件怎么转换成mp3的全部步骤了,整个步骤介绍的还是比较详细的,大家认真的看一遍,然后跟着操作一下就行了,很轻易的就能学会。

组合类相关题目

定义一个组合类课程类Lesson,其数据成员有:课号id,课程名name,任课老师teacher,选课学生s,其中学生信息定义成学生类的数组。成员函数有:AddStudent增加选课学生信息,GetPassRate计算课程的及格率,ShowInfo显示课程信息。学生类包括学号、姓名及该门课的成绩。用上述类的组合实现课程的管理。 #include <iostream> #include <string.h> using namespace std; class Student{ public: Student(){} Student(string a,string b,float c):num(a),name(b),score(c){} void display(); //显示学生信息函数 private: string num; //学生学号 string name; float score; }; class Lesson{ public: Lesson(string x,string y,string z):id(x),name(y),teacher(z){} void AddStudent(); void GetPassRate(); void ShowInfo(); static int count; //使用静态变量更好 static int total; static float rate; private: string id; string name; string teacher; Student s[70]; //使用数组,能够灵活录入多个学生信息 }; int Lesson::count=0; //类外初始化变量 int Lesson::total=0; float Lesson::rate=-1; void Student::display() { cout<<"

hive中regexp_extract的用法总结

1。regexp_extract 语法: regexp_extract(string subject, string pattern, int index) 返回值: string 说明: 将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。 第一参数: 要处理的字段 第二参数: 需要匹配的正则表达式 第三个参数: 0是显示与之匹配的整个字符串1 是显示第一个括号里面的2 是显示第二个括号里面的字段... 注意,在有些情况下要使用转义字符(双斜杠了‘\\’)。 select regexp_extract('x=a3&x=18abc&x=2&y=3&x=4','x=([0-9]+)([a-z]+)',0), -- x=18abc regexp_extract('x=a3&x=18abc&x=2&y=3&x=4','^x=([a-z]+)([0-9]+)',0), -- x=a3 regexp_extract('https://detail.tmall.com/item.htm?spm=608.7065813.ne.1.Ni3rsN&id=522228774076&tracelog=fromnonactive','id=([0-9]+)',0), -- id=522228774076 regexp_extract('https://detail.tmall.com/item.htm?spm=608.7065813.ne.1.Ni3rsN&id=522228774076&tracelog=fromnonactive','id=([0-9]+)',1), -- 522228774076 regexp_extract('http://a.m.taobao.com/i41915173660.htm','i([0-9]+)',0), -- i41915173660 regexp_extract('http://a.m.taobao.com/i41915173660.htm','i([0-9]+)',1) -- 41915173660 select regexp_extract('hitdecisiondlist','(i)(.*?)(e)',0) ; 结果:itde select regexp_extract('hitdecisiondlist','(i)(.*?)(e)',1) ; 结果:i select regexp_extract('hitdecisiondlist','(i)(.*?)(e)',2) ; 结果:td select regexp_extract('x=a3&x=18abc&x=2&y=3&x=4','x=([0-9]+)([a-z]+)',2) from default.dual; 结果:abc

Apple Watch今年将能删除部分预装应用 包括闹钟、定时器等

【TechWeb】6月20日消息,据国外媒体报道,在2016允许iOS用户删除iPhone和iPad中的部分预装应用后,苹果今年在Apple Watch中也将加入删除预装应用这一功能。 从外媒的报道来看,在watchOS6操作系统正式推送之后,Apple Watch用户就能删除部分不喜欢的预装应用,这一新的Apple Watch操作系统在6月3日的苹果全球开发者大会上已正式发布,在今年下半年就将正式向用户推送。 可删除的预装应方面,外媒列出的包括闹钟、定时器、秒表、遥控器、相机遥控器、收音机、对讲机,也包括心电图、呼吸、噪音、周期跟踪等健康方面的预装应用,苹果本周也给出了这一些此前不可删除的预装应用的名单。 不过外媒在报道中也指出,并不是所有的Apple Watch预装应用都允许用户删除,一些核心的预装应用,如心率和信息等,用户依旧是无法删除的。 删除预装应用的方式方面,同目前用户删除第三方应用的方式仍是一样的,即长按要删除的预装应用,然后点击“X”就可删除。

selenium By八种方式定位元素

BY方式定位 使用selenium的By方式定位,首先得导入该模块 from selenium.webdriver.common.by import By id属性定位 find_element(By.ID,"id")name属性定位 find_element(By.NAME,"name")classname属性定位 find_element(By.CLASS_NAME,"claname")a标签文本属性定位 find_element(By.LINK_TEXT,"text")a标签部分文本属性定位 find_element(By.PARTIAL_LINK_TEXT,"partailtext")标签名定位 ·find_elemnt(By.TAG_NAME,"input")xpath路径定位 find_element(By.XPATH,"//div[@name='name']")css选择器定位 find_element(By.CSS_SELECTOR,"#id")

java 去除字符串中所有空格

Strim或者Trip都是只能去除头部和尾部的空字符串。中间的部分是不能够去除的! 推荐使用ApacheCommonse的StringUtils.deleteWhitespace("a b c"); 删除所有空格。 1. String.trim() trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾、中间 String str = " hell o "; String str2 = str.replaceAll(" ", ""); System.out.println(str2); 3.或者replaceAll(" +",""); 去掉所有空格 4.str = .replaceAll("\\s*", ""); 可以替换大部分空白字符, 不限于空格 \s 可以匹配空格、制表符、换页符等空白字符的其中任意一个 5.或者下面的代码也可以去掉所有空格,包括首尾、中间 public String remove(String resource,char ch) { StringBuffer buffer=new StringBuffer(); int position=0; char currentChar; while(position { currentChar=resource.charAt(position++); if(currentChar!=ch) buffer.append(currentChar); } return buffer.toString(); }

CoordinatorLayout+AppBarLayout+RecyclerView遇到的关于滑动的问题

如图 采用的是CoordinatorLayout+AppBarLayout+TabLayout+RecyclerView 点击tab标签时自动吸顶 滑动到上边也自动吸顶 遇到的问题 1: tablayout吸顶之后 在往上滑动一点recyclerview 往下滑动时先滑动的是AppBar 而不是Recyclerview 2:当recyclerView数据较少是 滑动不下来 appBar不能顺利展开 先说第一个问题 刚开始我以为是滑动冲突 找了很多资料 都没有解决 最后发现问题还真是有点尴尬 源于自己对CoordinatorLayout不理解 这是结构 其中linerLayout是滑动的部分 关于scrollFlags这个属性请自行翻阅资料 我这个原因就是因为多设置了enterAlways这个属性 去掉之后 从上往下滑动时 优先滑动的是RecyclerView 其次才是AppBar 第二个问题解决办法是把recyclerView的高度设置为match_parent 我之前用的是wrap_content 这个结构有点low 现在已经改为CoordinatorLayout+AppBarLayout+viewPager+RecyclerView

Required String parameter 'username' is not present问题解决

同样的一份代码,在测试环境下已经好用,准备上线确出现了这样的问题: Required String parameter 'username' is not present 排除是程序代码的问题,就检查环境是否存在问题。 测试环境是tomcat的6.0.9.0 正式环境的tomcat版本7.0.70.0: 相关的配置: 里面有一个maxPostSize的设置,原先默认为0 原来tomcat从7.0.63开始maxPostSize=-1为不限制,之前是0为不限制。修改完后重启,访问就可以正常了。 参考文章:https://blog.csdn.net/erlian1992/article/details/80209947

常见的新算法的标准测试函数

标准测试函数相关详细介绍请参考测试函数集:http://www.sfu.ca/~ssurjano/index.html。 目录 1、优化测试问题【Optimization Test Problems】 1)许多局部极小值 【Many Local Minima】 2)碗状【Bowl-Shaped】 3)板状【Plate-Shaped】 4)山谷状【Valley-Shaped】 5)陡峭的山脊/瀑布 【Steep Ridges/Drops】 6)其他【Other】 2、仿真/预测测试问题【Emulation/Prediction Test Problems】 1) Physical Models 2) Qualitative and Quantitative Inputs 3) Trigonometric 4) Exponential/Logarithmic 5) Rational 6) Other 3、不确定度量化测试问题【Uncertainty Quantification Test Problems】 1)Physical Models 2)Other 4、多保真仿真测试问题【Multi Fidelity Simulation Test Problems】 1) Physical Models 2) Other 5、校准/调谐测试问题【Calibration/Tuning Test Problems】 1)Physical Models 2)Other 6、筛选测试问题【Screening Test Problems】 1)Physical Models 2)Strong Interactions 3)High Dimensionality 4)Qualitative and Quantitative Inputs

python字符串常用方法及汇总

字符串常用方法 字符串基本特点引号创建字符串空字符串和 len()函数转义字符字符串拼接字符串复制不换行打印从控制台读取字符串str()实现数字转型字符串使用[]提取字符replace()实现字符串替换字符串切片 slice 操作split()分割和 join()合并拼接字符串要点:字符串驻留机制和字符串比较字符串比较和同一性成员操作符字符串常用方法汇总常用的查找方法去除首尾信息大小写转换格式排版其他方法 字符串的格式化format()基本用法填充与对齐数字格式化其他格式,供大家参考:可变字符串 Python的字符串内建函数 字符串基本特点 很多人初学编程时,总是担心自己数学不行,潜意识里认为数学好才能编程。实际上, 大多数程序员打交道最多的是“字符串”而不是“数字”。因为,编程是用来解决现实问题 的,因此逻辑思维的重要性远远超过数学能力。 字符串的本质是:字符序列。Python 的字符串是不可变的,我们无法对原字符串做任 何修改。但,可以将字符串的一部分复制到新创建的字符串,达到“看起来修改”的效果。 Python 不支持单字符类型,单字符也是作为一个字符串使用的。 字符串的编码 Python3 直接支持 Unicode,可以表示世界上任何书面语言的字符。Python3 的字符默认就是 16 位 Unicode 编码,ASCII 码是 Unicode 编码的子集。 使用内置函数 ord()可以把字符转换成对应的 Unicode 码; 使用内置函数 chr()可以把十进制数字转换成对应的字符。 >>> ord('A') 65 >>> ord('高') 39640 >>> chr(66) 'B' >>> ord('淇') 28103 引号创建字符串 我们可以通过单引号或双引号创建字符串。例如:a=’abc’; b=”sxt” 使用两种引号的好处是可以创建本身就包含引号的字符串,而不用使用转义字符。例如: >>> a = "I'm a teacher!" >>> print(a) I'm a teacher! >>> b = 'my_name is "TOM"' >>> print(b) my_name is "

Docker底层工作原理

Docker是怎么工作的 Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。 为什么Docker比较比VM快 (1)docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。 (2)docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

Springcloud Consul部署实战 -2

上一篇文章介绍了如何构建一个最简单consul集群,下面将继续详细介绍如何详细配置和使用consul。 consul是支持多配置文件加载的,可以在/etc/consul.d/ 路径下创建任意名字的.json文件,如config.json 可以在该文件中添加详细的consul agent配置。例如,设置如下json字段,设置log的级别为info,更改consul agent的节点的启动名字为nn1,设置本机ip可以通过http,https,grpc,dns对外开放,http、dns、grpc、serf_lan、serf_wan、consul server的默认地址分别为8500 8600 8400 8301 8302 8300,如果在配置文件中不显示指定,那么consul启动后可能会更改默认的端口号。如果当我们启动其他consul时,通过-retry-join 加入server端时报错,拒绝连接,原因就是因为server端的端口发生了改动,它默认去连接8301端口,此时-retry-join不能直接写ip地址,需要写对应的修改后的serf_lan端口 列如:-retry-join x.x.x.x:8311。下面是一个config.json的配置文件例子,目前我的测试集群就是这么配的。 { "log_level": "INFO", "node_name": "nn1", "addresses": { "https": "0.0.0.0", "http": "0.0.0.0", "gRPC": "0.0.0.0", "DNS": "0.0.0.0" }, "ports": { "https": 8501, "http": 8500, "gRPC": 8502, DNS: 8600" } } Consul UI 集群搭建成功后可以通过http://配置了UI的服务器ip:consul服务端口号/ui 访问consul的UI 服务注册和服务服务 consul 集群搭建好后,我们就可以把自己的微服务注册到consul集群,通过consul来管理和查询我们的微服务。以下大部分内容来自spring cloud官方文档,如果有理解不到位之处,请大家给与指正https://cloud.spring.io/spring-cloud-consul/multi/multi_spring-cloud-consul-discovery.html 如何引入服务发现 Consul通过HTTP API和DNS提供服务发现服务。 Spring Cloud Consul利用HTTP API进行服务注册和发现。 但这并不妨碍非Spring Cloud应用程序利用DNS接口。 Consul Agents服务器运行在cluster中,群集通过gossip protocol 协议进行通信并使用Raft一致性协议来保证各个agent的一致性。 要激活Consul Service Discovery,应该使用group id 为org.springframework.cloud和artifact id 为spring-cloud-starter-consul-discovery的starter。 利用Spring Cloud Release Train构建系统的详细信息,请参阅Spring Cloud Project页面。

Jquery中的Each方法

开发工具与关键技术:MVC Each是在内部都会调用的方法,其实主要的原因是它是一个元素集合,Jquery的大部分方法都是针对元素合集的操作,所以内部的会调用Each来处理Div这合集,.Each只是处理Jquery的对象方法,Jquery还提供一个通用的Jquery.Each的方法用来处理对象和数组的遍历。 Jquery.each(array, callback ) Jquery.each( object, callback ) 第一个参数传递的就是一个对象或数组,第二个则是回调函数, Each就是一个For循环方法的一个包装,内部是通过For循环遍历数组与对象,也可以通过回掉函数返回内部的一些参数,当第一个参数是当前成员在对象数组中的索引值(从0开始算起),第二个参数是当前的成员(Jquery.Each() 的函数还会根据每次调用的函数返回值来决定之后的操作,如果返回False,这停止停止循环)。 如果返回其他的值,则均表示继续执行下一个循环遍历。 还有一个在Jquery中查找数组的索引In Array,Jquery.In Array 的函数是用于数组中的搜索指定值,并返回索引值,如果数组中不存在这个值,则返回False。 用法较为简单,首先传递一个用于检测的目标值,然后传递原始的数组,之后可以通过规定来查找起始值,默认的数组是为0开始。 值得注意的是:如果要判断数组中是否存在指定值,你需要通过函数的返回值不等于-1来进行判断

C++实现的邻接表

1. 在学习图的存储方式中,邻接矩阵和邻接表是两种比较常用的存储图的方式,下面使用的是C语言实现的邻接表 2. 具体的实现过程如下: ① 首先使用结构体声明图的结构体,图中顶点的结构体,以及指向下一条边的结构体,这些可以参照严蔚敏版的数据结构来写出具体的数据结构: typedef struct ArcNode{ int adjvex;//该边所指向的节点的位置 struct ArcNode *nextarc; // 边的信息, 例如边的权重 int info; }ArcNode; typedef struct{ //顶点表存储当前顶点的信息 int data; //指向边的指针 ArcNode *firstarc; }Vnode; typedef struct{ //顶点数组 Vnode adjlist[maxSize]; //图中的顶点的数目和边的数目 int n, e; }AGraph ② 有了这些结构体之后那么我们需要声明一个指向图的一个指针,并且使用malloc函数为图分配内存空间,假如不分配的话那么在初始化顶点的第一条边的时候会出现错误,这个是与Java语言的不同的点 ③ 在一开始的时候需要对链表的第一个顶点指向的第一条边的指针进行赋值,赋值为NULL,这个是必不可少的步骤,假如没有程序就会出现错误 ④ 因为这里存储的是有向有权图,所以在控制台中需要输入顶点的数目,边的数目,和边的权重,新建一个新的ArcNode节点, 将节点的adjvex赋值为v,指向下一条边的指针赋值为NULL输入之后判断图中的起始顶点指向的第一条边的指针是否为空假如为空那么将当前顶点的firstarc指针指向这个节点加入不为空那么调用插入到链表中的insertNode方法,遍历链表将节点插入到链表的最后面 ⑤ 创建好了邻接表之后那么我们就可以来遍历图了,循环遍历顶点数组,判断当前顶点的下标对应的firstarc是否为空来进行遍历,为空说明当前顶点是没有出度的,有边的话那么我们需要使用while循环来遍历整个顶点链表 我感觉最重要的是要理解其中的数据结构每个元素表达的意思还有就是注意C语言中的指针在初始化的时候要为NULL否则会出现错误 测试数据如下: 3. 下面是具体的代码: #include<stdio.h> #include<iostream> #include<malloc.h> #define maxSize 1000 using namespace std; typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; int info; }ArcNode; typedef struct{ int data; ArcNode *firstarc; }Vnode; typedef struct{ Vnode adjlist[maxSize]; int n, e; }AGraph; AGraph *graph; void insertNode(ArcNode *node, ArcNode *newNode){ ArcNode *p = node; while(p->nextarc !

docker 删除 容器/镜像 方法

docker的删除有两种,一个是rm 删除容器,一个是rmi删除镜像 想要删除运行过的images(镜像) 必须首先删除它的container(容器) 首先查看并找到要删除的镜像 docker images 这里我们要删除hello-world镜像 使用rmi 加 镜像id docker rmi fce289e99eb9 报错,这是因为该镜像存在容器实例,不允许删除(必须先删除使用该镜像的容器) docker ps -a 将该容器删除 使用 rm 加 容器id docker rm 1a5fa469eadf 删除后再次查看,发现已经删除掉了 接下来再次执行删除镜像命令 docker rmi fce289e99eb9 再次查看镜像,发现已经删除掉了

C语言 char*和char[]用法

char []定义的是一个字符数组,注意强调是数组。char * 定义的是一个字符串指针,注意强调是指针。 char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以: 当char *s = “hello”;后,不能使用s[0]=‘a’;语句进行赋值。这是将提示内存不能为"written"。 当用char s[]=“hello”;后,完全可以使用s[0]=‘a’;进行赋值,这是常规的数组操作。 若定义: char s[] = "hello"; char *p = s; 也可以使用p[0] = ‘a’;因为这是p ==s,都是指向数组的指针。 char *s = (char *)malloc(n);//其中n为要开辟空间的大小 相当于 char s[n]; #include <stdio.h> int main(int argc, char* argv[]) { char* buf1 = "abcd1234"; char buf2[] = "abcd1234"; printf("size of buf1: %d\n", sizeof(buf1)); printf("size of buf2: %d\n", sizeof(buf2)); printf("长度为:%d %d\n", strlen(buf1), strlen(buf2)); return 0; size of buf1: 4

IDA F5 汇编转C的使用

我版本是IDA 68 很多人说按F5,我要是能只按F5就能用,还用发帖?百度了十几个结果一个说清楚都没有。 正确用法是这样:你按F5的同时,注意是同时,双击你选择程序。

form-data&mock&跨域

param获取路由里面的参数,query获取问号后面的参数 chalk包自定义字体颜色 form-data文件处理 input type=file上传文件, 要取到文件内容应该在dom选择后面加上.files[0] formidable 因为express本身不能接收formdata,所以需要这个包(或者multer)来处理文件上传 form-data前端处理 const avatar = document.querySelector("#avatar").files[0]; //把文件组合成ajax需要的数据要用到form-data //FormData是一个对象,用于ajax上传文件 const data = new FormData(); //使用append方法添加字段 //append第一个参数为后端所需要的参数名 data.append('avatar',avatar); //这里添加除了文件之外的其它字段 data.append('name','tom'); //使用fetch处理请求 fetch('/api/v1/upload',{ method:'post', body:data }) .then(response => response.json()) .then(resp => { if(resp.code === 200){ console.log(resp); avatarImg.setAttribute('src',resp.data.url); } }) form-data路由处理 router.post('/upload',(req,res,next)=>{ const form = new formidable.IncomingForm(); //设置上传目录,express的静态资源目录 form.uploadDir = path.join(process.cwd(),'public/uploads'); //保持文件后缀 form.keepExtensions = true; //解析请求 form.parse(req, function(err, fields, files) { //fields是除文件外的其它字段,files是文件,err是错误信息 //实际在后端工作时,还会去判断fields里面是否有关于权限的字段,比如token if(files){ //files.avatar.path为图片的路径 res.json({ code:200, data:{ errMsg: '上传成功', //extname获取文件扩展名,basename获取文件全部名字 url: '/uploads/' + path.

notepad++一键编译运行C语言

第一步:写入c代码 #include<stdio.h> int main() { printf("hello world"); return 0; } 第二步:按F5运行进行宏定义 cmd /k gcc -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" "$(FULL_CURRENT_PATH)" && CLS && "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" & PAUSE & EXIT 按下回车即可出结果选择保存后可以选择一个快捷键,下次直接按下快捷键即可完美运行! 第三步:完美运行 补充 编译: cmd /k gcc -Wall -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" "$(FULL_CURRENT_PATH)" & PAUSE & EXIT运行: cmd /k "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" & PAUSE & EXIT 关于脚本行:cmd /k gcc -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" "$(FULL_CURRENT_PATH)" && CLS && "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" & PAUSE & EXIT cmd /k是弹出cmd窗口并执行后续指令。&和&&表示连接作用,说明有多行指令合为一行。 gcc -o “$(CURRENT_DIRECTORY)$(NAME_PART).exe” “$(FULL_CURRENT_PATH)” 编译生成.exe文件,输出源文件所在目录。注意这里需要有引号,目的是为了在目录及文件名存在空格的情况下也能够正常运行。 && CLS 清屏。&&的意义在于,前面的语句出现错误,将不会执行该句。

MyBatis中用到的设计模式

面试官:“谈谈MyBatis中都用到了那些设计模式?”。 疯狂的蚂蚁 JavaGuide 本文转载自: https://dwz.cn/KFgol1De 由JavaGuide整理排版。 虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式。 目录 面试官:“谈谈MyBatis中都用到了那些设计模式?”。 1、Builder 模式 2、工厂模式 3、单例模式 4、代理模式 5、组合模式 6、模板方法模式 7、适配器模式 8、装饰者模式 9、迭代器模式 参考资料 Mybatis至少遇到了以下的设计模式的使用: Builder模式 : 例如 SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder; 工厂模式 : 例如SqlSessionFactory、ObjectFactory、MapperProxyFactory; 单例模式 :例如ErrorContext和LogFactory; 代理模式 :Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果; 组合模式 :例如SqlNode和各个子类ChooseSqlNode等; 模板方法模式 : 例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler; 适配器模式 : 例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现; 装饰者模式 : 例如cache包中的cache.decorators子包中等各个装饰者的实现; 迭代器模式 : 例如迭代器模式PropertyTokenizer; 接下来挨个模式进行解读,先介绍模式自身的知识,然后解读在Mybatis中怎样应用了该模式。 1、Builder 模式 Builder模式的定义是“将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”,它属于创建类模式,一般来说,如果一个对象的构建比较复杂,超出了构造函数所能包含的范围,就可以使用工厂模式和Builder模式,相对于工厂模式会产出一个完整的产品,Builder应用于更加复杂的对象的构建,甚至只会构建产品的一个部分。《effective-java》中第2条也提到:遇到多个构造器参数时,考虑用构建者(Builder)模式。 Builder模式 在Mybatis环境的初始化过程中,SqlSessionFactoryBuilder会调用XMLConfigBuilder读取所有的MybatisMapConfig.xml和所有的*Mapper.xml文件,构建Mybatis运行的核心对象Configuration对象,然后将该Configuration对象作为参数构建一个SqlSessionFactory对象。 其中XMLConfigBuilder在构建Configuration对象时,也会调用XMLMapperBuilder用于读取*.Mapper文件,而XMLMapperBuilder会使用XMLStatementBuilder来读取和build所有的SQL语句。 在这个过程中,有一个相似的特点,就是这些Builder会读取文件或者配置,然后做大量的XpathParser解析、配置或语法的解析、反射生成对象、存入结果缓存等步骤,这么多的工作都不是一个构造函数所能包括的,因此大量采用了Builder模式来解决。 对于builder的具体类,方法都大都用build*开头,比如SqlSessionFactoryBuilder为例,它包含以下方法: SqlSessionFactoryBuilder 即根据不同的输入参数来构建SqlSessionFactory这个工厂对象。 2、工厂模式 在Mybatis中比如SqlSessionFactory使用的是工厂模式,该工厂没有那么复杂的逻辑,是一个简单工厂模式。 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 简单工厂模式 SqlSession可以认为是一个Mybatis工作的核心的接口,通过这个接口可以执行执行SQL语句、获取Mappers、管理事务。类似于连接MySQL的Connection对象。 SqlSessionFactory 可以看到,该Factory的openSession()方法重载了很多个,分别支持autoCommit、Executor、Transaction 等参数的输入,来构建核心的SqlSession对象。

Python 去除字符串中的空行

Python 去除字符串中的空行 mystr = 'adfa\n\n\ndsfsf' print("".join([s for s in mystr.splitlines(True) if s.strip()])) 转载于:https://www.cnblogs.com/ibingshan/p/11017670.html

打开SQL Server 配置服务器时出现问题“无法连接到WMI提供程序。你没有权限或者该服务器无法访问...”的解决办法

一、检查一下 windows下的system32 中是否有framedyn.dll这个系统文件,如果没有到system32 下的wbem文件中拷贝framedyn.dll到system32 目录下,若System32文件夹下有framedyn.dll,而wbem文件中却没有,于是拷贝framedyn.dll到了wbem中(有可能没有作用)。 二、在系统运行中输入如下命令: 运行,cmd然后输入命令 (以管理员身份运行) mofcomp.exe "C:\Program Files (x86)\Microsoft SQL Server\100\Shared\sqlmgmproviderxpsp2up.mof" 这样就可以运行SQL Server 配置服务器了。

Flutter 使用中的版本冲突问题

目录 问题 1、bmob的版本与 dio ^2.1.0 冲突 2、AndroidX 版本问题 问题 1、bmob的版本与 dio ^2.1.0 冲突 Flutter 开发可以使用Bmob的数据作为测试使用,具体的使用方法参照Bmob的文档,本文只记录部分问题的解决方式! Bmob flutter 文档地址 http://doc.bmob.cn/data/flutter/ 没有什么好的方法 目前 bmob 官方的方法是基于 dio ^ 1.0.12 的 如果不想更改 自己项目里的dio的版本,那么只能下载 Bmob提供的源码,我们对源码的 dio版本修改成我们需要的版本。 下面放上我修改后的版本的bmob的源码 链接:https://pan.baidu.com/s/1v0pWe6VDyh6DSxeEFuTgdA 提取码:6yv2 需要在 pubspec.yaml 文件中添加以下依赖 dependencies 下面添加: dio: ^2.1.0 cupertino_icons: ^0.1.2 flutter_spinkit: ^1.0.0 json_annotation: ^2.0.0 web_socket_channel: ^1.0.12 dev_dependencies 下面添加 build_runner: ^1.0.0 json_serializable: ^2.0.0 注意缩进格式,参考下图 2、AndroidX 版本问题 在开发中部分版本需要使用到 AndroidX 这个时候会引发一系列的版本冲突。例如 appcompat 与 core 的版本问题。示例如下: Execution failed for task ':app:preDebugBuild'.

使用Keepalived实现MySQL主从高可用

初次使用keepalived做ip漂移小问题有很多,搜索引擎基本都解决了。 只有宿主机可以ping同虚拟ip。,其他机器ping不同。这时候要把虚拟ip和真实的ip放到同一网段,如果还不行 请运维人员解除网卡和ip的绑定 这个消耗了我很多时间,结果是网络环境的问题,排查问题可以参考,https://blog.csdn.net/charthyf/article/details/81456872 安装keepalived以及ip漂移: 参考文章: https://blog.csdn.net/wzy0623/article/details/80916567 https://blog.csdn.net/yabingshi_tech/article/details/50721841

通过java连接ftp下载指定目录下的所有文件,过滤掉临时文件。

通过java连接ftp下载指定目录下的所有文件,过滤掉临时文件。 采用递归的方式。 package com.qxj.word.timer; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; /******************************************************************************* 功能说明: 从ftp服务器指定目录复制文件到本地指定路径 @author qianshu @time 2012-6-25 ******************************************************************************/ public class FtpDownFiles { private FTPClient ftpClient; public FtpDownFiles() { this.ftpClient = new FTPClient(); } /** 功能说明:通过递归实现ftp目录文件与本地文件同步更新@param ftpfilepath 当前ftp目录 @param localpath 当前本地目录 */ public void ftpDownFiles(String ftpfilepath, String localpath) { try { String load1 = ftpfilepath; FTPFile[] ff = getFileDir(load1); //System.

Win10重装系统提示:在efi系统上windows只能安装到gpt磁盘

在重装系统的过程中遇到问题,提示信息是:在efi系统上windows只能安装到gpt磁盘。如下图所示。 当选中安装的系统盘时,提示Windows无法安装到这个磁盘,选中的磁盘具有MBR分区表。在EFI系统上,Windows只能安装到GPT磁盘。主要是由于BIOS方式对应MBR分区表;EFI方式则对应GPT分区。所以主要有两种解决方法: 1、让启动U盘以传统的BIOS方式启动来安装。 2、将电脑的系统盘由MBR修改为GPT。 下面说一下解决方法: 方法一:直接将启动U盘里的【efi】整个文件和【bootmgr.efi】文件删除后,再安装即可。 方法二:将系统盘由MBR格式修改为GPT格式。 1、在如下的Win10安装界面,按Shift+F10 2、将出现如下命令提示符窗口 3、在命令提示符窗口依次执行如下命令: 输入:diskpart 命令后,按enter键,进入到 DISKPART 模式。 输入:list disk 命令后,按enter键,查看电脑的硬盘。编号0,表示电脑的第一块硬盘;编号2,表示电脑的第二块硬盘;........。根据电脑的硬盘数量不同显示不同。 输入:select disk 0 命令后,按enter键,表示选中第一块硬盘。(select disk x 命令中的x,表示选中的硬盘编号)。 输入:clean 命令清除选中硬盘上的所有分区和数据。 执行:convert gpt 命令将选中的硬盘转换成GPT分区表格式。 输入:exit 命令退出 DISKPART 模式。 输入:exit 命令退出命令提示符模式。 4、然后再继续进行分区,安装即可。也可以只建立一个主分区,等系统安装完成后再进行分区。

VMware中设置Ubuntu静态IP并可上网

1、引言 在VMware使用虚拟机过程中遇到的三个问题: 如何修改虚拟机为静态IP并且生效;设置完静态IP后,无法上网;设置完静态IP且能上网后,宿主机无法ping通虚拟机; 那么,能够实现虚拟机使用静态IP,且虚拟机能够上网以及和宿主机通讯吗? 答案是肯定的,下面是相关的解决过程。 2、设置静态IP地址 VMware在默认安装完成之后,会创建三个虚拟的网络环境: VMnet0 :桥接网络VMnet1 :Host-onlyVMnet8 :NAT 其中,NAT表示VMWware内安装的Ubuntu将会在一个子网中,VMware通过网络地址转换,通过物理机的IP上网。 我们选择NAT方式实现Ubuntu的静态IP地址配置。 2.1 设置VMware 1、打开VMware,在顶部依次选择:编辑 > 虚拟网路编辑器,打开虚拟网路编辑器: 2、选定VMnet8,然后去掉如下图中的“使用本地DHCP服务奖IP地址分配给虚拟机”: 这里的子网IP为:192.168.8.0,子网掩码为:255.255.255.0,因此,在Ubuntu中,设置IP地址的时候,可以设置为192.168.8.x,x可以为1~255。 3、选择“NAT设置”,打开NAT设置面板: 查看自己的网关地址,例如,此处的网关应该为:192.168.8.2。 4、最后,在VMWare的虚拟机管理界面,选择Ubuntu的“编辑虚拟机设置”,打开Ubuntu这个虚拟的设置界面。 选择网络适配器,然后确定网络连接选中的是“自定义”中的VMnet8(NAT模式): VMWare设置完毕。 2.2 设置Ubuntu网络 打开Terminal,配置静态ip,命令如下: sudo vi /etc/network/interfaces 内容改为如下: auto lo iface lo inet loopback auto ens33 iface ens33 inet static address 192.168.8.100 netmask 255.255.255.0 gateway 192.168.8.2 注:Ubuntu15开始,网卡名eth0改成了ens33。 2.3 设置DNS 配置DNS,命令如下: sudo vi /etc/resolv.conf 在里面填入DNS,比如阿里的dns:223.5.5.5 ...... nameserver 223.5.5.5 ...... 防止重启Linux后DNS重置,设置永久修改DNS,命令如下: vim /etc/resolvconf/resolv.conf.d/base 内容如下: nameserver 223.5.5.5 nameserver 8.

ipv6在win7系统的通用设置方法

https://jingyan.baidu.com/article/2f9b480dfc24bd41cb6cc22f.html ipv6的脚步越来越近,我们终有一天要和ipv4 say goodbye,拥抱ipv6。其实目前ipv6在某些领域已经极具实用价值了。相信有些人还是对ipv6的设置有些陌生,网上有些帖子的设置可能仅仅对某一特殊网络环境好用,在其他的网络环境中就失效了。我经过几天摸索,总结出了相对通用的配置方法。。当然,还是有瑕疵,移动路由器组建的内网环境,貌似无法使用。这个是网络供应商的设置问题,本地设置无法突破网络供应商的限制。唯一的选择是ipv6tunnel,不在此讨论,如有人感兴趣,可以单独联系我。 现在开始配置win7,支持ipv6的访问。其余系统配置方法基本相同,可参考使用 工具/原料 电脑 互联网 方法/步骤 1 来到“控制面板”,点击“系统和安全” 2 选择“windows防火墙” 3 选择“还原默认设置” 4 点击“还原默认设置” 5 点击系统窗口左下角“开始”,在右边选择“运行”,来到运行窗口,输入“gpedit.msc”如图 运行后跳出组策略编辑器窗口,依次选择“管理模板”-“网络”-“TCP/IP设置”-“IPV6转换技术”如图。右侧所有设置项全部改为“未配置”。关闭窗口 再次来到“控制面板”,点击“查看网络状态和任务” 选择“更改适配器设置” 右键点击您正在使用的网络,如图为“无线网络连接”。您所使用的网络名称可能不同,请注意。 右键菜单内选择“属性”,来到属性窗口。分别修改TCP/IPV4和TCP/IPV6的属性如下图。 执行一键批处理开启 IPV6 操作,请将下列命令保存成 IPV6.BAT 文件并执行 @echo off net start "ip helper" netsh int ipv6 reset netsh int teredo set state default netsh int 6to4 set state default netsh int isatap set state default netsh int teredo set state server=teredo.remlab.net netsh int ipv6 set teredo enterpriseclient

MFC自定义消息的实现方法----(线程向主对话框发送消息)

在MFC中,我们一边在使用多线程时,经常会遇到在需要调用到新建的控件,此时建议不要在新建的线程中直接调用主对话框的控件,我们可以通过自定义消息,在新建线程中发送并触发主线程进行相关的界面控件操作。 以Dialog对话框程序为例,添加自定义消息的操作方法可以如下所示: 1. 在头文件stdafx.h中添加一个自定义消息宏: #define WM_USER_MSG_HDL (WM_USER + 1) 2. 在增加新消息的窗口或对话框类头文件中增加一个回调函数声明,注意要声明为public afx_msg LRESULT OnUserMsgHdl(WPARAM wParam, LPARAM lParam); 3. 在窗口或对话框的cpp文件的BEGIN_MESSAGE_MAP,END_MESSAGE_MAP中增加一行 ON_MESSAGE(WM_USER_MSG_HDL, OnUserMsgHdl) 4. 在窗口或对话框的cpp文件中添加回调函数的实现,如: //wParam和lParam为sendMessage或PostMessage传递过来的参数 LRESULT ThreadDialog::OnUserMsgHdl(WPARAM wParam, LPARAM lParam) { TRACE("WM_USER_MSG_HDL message /n"); return 0; } 5. 自定义消息的触发: ::PostMessage(GetSafeHwnd(), WM_USER_MSG_HDL, 0, 0); 其中,GetSafeHwnd()得到了一个当前窗口的句柄,此消息将发送给当前窗口,如果想发送消息给其他窗口只需改变这个句柄,前提示目的的窗口也实现了此消息的处理函数。 举例: //CtestDlg.h #define WM_UPDATE_STATIC (WM_USER + 100) //更新主界面static控件信息 DWORD m_dwThreadID; HANDLE m_hThread; static DWORD TestThread(LPVOID lpParam); afx_msg LRESULT OnUpdateStatic(WPARAM wParam, LPARAM lParam); //添加用户自定义消息 //CtestDlg.cpp BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx) ON_MESSAGE(WM_UPDATE_STATIC, &CtestDlg::OnUpdateStatic) END_MESSAGE_MAP() void CtestDlg::OnBnClickedButton4() { // TODO: 在此添加控件通知处理程序代码 m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TestThread, this, 0, &m_dwThreadID); } DWORD CtestDlg::TestThread(LPVOID lpParam) { CtestDlg* pInfo = (CtestDlg*)lpParam; ::PostMessage(pInfo->m_hWnd, WM_UPDATE_STATIC, 0, 0); return false; } LRESULT CtestDlg::OnUpdateStatic(WPARAM wParam, LPARAM lParam) { if (wParam == 0) { GetDlgItem(IDC_STATIC)->SetWindowText(L"

Java多线程超详解

引言 随着计算机的配置越来越高,我们需要将进程进一步优化,细分为线程,充分提高图形化界面的多线程的开发。这就要求对线程的掌握很彻底。 那么话不多说,今天本帅将记录自己线程的学习。 程序,进程,线程的基本概念+并行与并发: 程序:是为完成特定任务,用某种语言编写的一组指令的集合,即指一段静态的代码,静态对象。 进程:是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程,有它自身的产生,存在和消亡的过程。-------生命周期 线程:进程可进一步细化为线程,是一个程序内部的一条执行路径 即:线程《线程(一个程序可以有多个线程) 程序:静态的代码 进程:动态执行的程序 线程:进程中要同时干几件事时,每一件事的执行路径成为线程。 并行:多个CPU同时执行多个任务,比如:多个人同时做不同的事 并发:一个CPU(采用时间片)同时执行多个任务,比如秒杀平台,多个人做同件事 线程的相关API //获取当前线程的名字 Thread.currentThread().getName() 1.start():1.启动当前线程2.调用线程中的run方法 2.run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中 3.currentThread():静态方法,返回执行当前代码的线程 4.getName():获取当前线程的名字 5.setName():设置当前线程的名字 6.yield():主动释放当前线程的执行权 7.join():在线程中插入执行另一个线程,该线程被阻塞,直到插入执行的线程完全执行完毕以后,该线程才继续执行下去 8.stop():过时方法。当执行此方法时,强制结束当前线程。 9.sleep(long millitime):线程休眠一段时间 10.isAlive():判断当前线程是否存活 判断是否是多线程 一条线程即为一条执行路径,即当能用一条路径画出来时即为一个线程 例:如下看似既执行了方法一,又执行了方法2,但是其实质就是主线程在执行方法2和方法1这一条路径,所以就是一个线程 public class Sample{ public void method1(String str){ System.out.println(str); } public void method2(String str){ method1(str); } public static void main(String[] args){ Sample s = new Sample(); s.method2("hello"); } } 线程的调度 调度策略: 时间片:线程的调度采用时间片轮转的方式 抢占式:高优先级的线程抢占CPU Java的调度方法: 1.对于同优先级的线程组成先进先出队列(先到先服务),使用时间片策略 2.对高优先级,使用优先调度的抢占式策略 线程的优先级 等级: MAX_PRIORITY:10 MIN_PRIORITY:1