c#实现计算器

原文件和代码需要的话私聊留邮箱我看见会发给你!,做到力所能及 这里是旧版计算器 优化 改过bug的 请移步至 新版计算器 c#计算器 visual studio 2019 这是我的样式 –接下来是代码 变量 声明开始 //-------------------------------------------------------------------------------- //变量声明and变量的作用开始 //记录程序第一次1启动 Boolean system_one = false; //判断用过小数点后,是否有输入数字如果没有输入数字就不能使用四则运算符 Boolean dian_number; //ji 计算 用过多少次等于号 int ji = 0; //sum 用来记录每一次的新值 double sum = 0; //value 是最后的结果 double value; //fh 是用来记录我们正在使用的符号 String fh; //eco 用来记录 用户摁过多少次等于号, eco = 0 就是还没用过, 如果用过的话 就++ int eco = 0; //temp 用来记录 一直被处理的数字 double temp = 0.0; //record 用来判断使用四则运算符后,是否输入数字,输入了就是true没有就是false Boolean record = true; //number 是用来判断数字键是否使用过,number = 0 就是没用过 等于 number =1 就是使用过; byte number = 0; //符号的次数 0就按原来的样式不等0就是其他样式 byte numberOfSymbols = 0; //用来装记忆的盒子 double memory = 0.

最优化理论笔记及期末复习(《数值最优化》——高立)

目录 一、预备知识二、无约束最优化方法的基本结构三、凸集和凸函数四、负梯度方法和Newton型方法五、共轭梯度法六、约束最优化问题的最优性理论七、罚函数方法八、期末复习8.1 知识点复习8.2 习题复习8.3 大实验代码8.3.1实验内容8.3.2实验目的8.3.3算法描述8.3.4程序中的参数设置、终止准则、关键技术(语句)等说明8.3.5实验代码8.3.5.1 目标函数8.3.5.2 计算梯度8.3.5.3 Armijo准则更新步长8.3.5.4最速下降法8.3.5.5 BFGS法8.3.5.6 FR共轭梯度法8.3.5.7 主程序 九、总结 一、预备知识 二、无约束最优化方法的基本结构 三、凸集和凸函数 四、负梯度方法和Newton型方法 五、共轭梯度法 六、约束最优化问题的最优性理论 七、罚函数方法 八、期末复习 8.1 知识点复习 8.2 习题复习 8.3 大实验代码 8.3.1实验内容 利用Matlab编程,实现采用简单Armijo非精确线搜索求步长的三种方法:负梯度法、BFGS法及FR共轭梯度法,并求解如下无约束优化问题: m i n f ( x ) = 10 ( x 1 3 − x 2 ) 2 + ( x 1 − 1 ) 2 min f(x) =10(x_1^3-x_2)^2+(x_1-1)^2 minf(x)=10(x13​−x2​)2+(x1​−1)2 通过实验过程进一步理解三种方法的原理和步骤,并对实验结果进行分析比较。 8.3.2实验目的 掌握无约束最优化算法的基本架构,并能熟练使用Matlab软件实现一些基本实用的算法并进行数值试验分析。 8.3.3算法描述 8.3.4程序中的参数设置、终止准则、关键技术(语句)等说明 8.3.5实验代码 8.3.5.1 目标函数 %%计算函数值 function f=func(X) f=10.

idea 启动报错 Command line is too long

idea 运行启动类报错 Command line is too long 启动报错信息:Error running ‘Application‘: Command line is too long. 翻译过来就是:启动命令过长! 解决方案 1、点开项目启动配置项目; 2、shorten command line 选项选择 JAR manifest 或者 classpath file 选项,点击 Apply 和 OK,然后重启项目; idea 运行测试类报错 Error running test: Command line is too long 上面是运行启动类报错的解决方案,运行测试类也可能会出现这种情况; 解决方案 1、项目右键打开本地文件夹; 2、打开*.idea* 文件夹下的 workspace.xml 文件,在<component name="PropertiesComponent"> 这个标签下加一行配置:<property name="dynamic.classpath" value="true" /> 整理自: https://blog.csdn.net/nbxinjian/article/details/124149401 https://blog.csdn.net/weixin_45886609/article/details/126394026

关于解决Linux内核配置过程make bzImage中出现的问题 --个人笔记

最近在学习制作U盘Linux系统,结果在途中遇到一些问题 以下为制作教程: (31条消息) 从0开始构建自己的U盘Linux(一)_Edeeen1的博客-CSDN博客 此教程已经比较详细了,但一些细节没有提及,在此将个人遇到的问题记录下来,以供参考。 当执行命令 make bzImage命令时出现如图一情况 因此可以知晓是因为没有安装包mipsel-linux-uclibc-gcc的问题,而命令也自动帮助安装,但最终出现无法定位安装包位置的情况,再次尝试后无果 “srcipts/extract-cert.c:21:10:fatal error:openssl/bio.h:没有哪个文件或目录” 查询文章如下:https://www.cnblogs.com/hjxzip/p/14702329.html (在写这篇笔记时又发现一个问题,虚拟机火狐浏览器可以访问这链接,主机微软无法访问,显示被删除,原因未知,如有了解情况的小伙伴可以告知一下) 看这链接文章后,得知报错可能时因为没有安装libssl-dev 因此尝试sudo apt-get install libssl-dev,出现图二所示 显示“无法获得锁”,“无法获得dpkg前端锁”,搜索资料,https://blog.csdn.net/weixin_37769711/article/details/88759474 查询之后得知,出现的原因是在之前下载未完成时久将窗口关闭,然而apt-get进程没没有结束导致,或者是搜索一个不存在的安装包,apt进程返回结果后你很快地再次使用apt命令,就造成进程阻塞现象。 使用ps aux命令查看 ps aux //可以查看系统中所有的进程 ps -le // 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级 ps -l // 只能看到当前 Shell 产生的进程; “grep”(全面搜索正则表达式并把行打印出来,配合使用查找锁定的apt-get进程的PID 输入ps aux | grep “apt-get” 等到终端返回apt-get的PID后,再使用sudo kill xxx就可以了。比如返回的PID是 1001 ,那你就sudo kill 1001. 然后,执行后效果不理想,如图三,无法找到进程。 于是,尝试方法二:强制解锁 直接输入以下两行命令,把进程锁的缓存文件删除,也可以达到同样效果。 sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock 执行过后成功解决进程锁问题 然而在make bzImage时仍然有报错 看到一篇博客终于稍微明白一点,https://www.cnblogs.com/gongzi-blog/p/14206685.html, 在编译x86内核之前需要提前安装一些包,因为在过程中回用到,如果没有则会出现错误, 包如下 #apt-get install make #apt-get install gcc #apt-get install flex #apt-get install bison #apt-get install libcurses-dev #apt-get install libssl-dev #apt-get install libelf-dev 在将上述进行安装时,发现libelf-dev和libcurses-dev的安装出现问题,“无法定位软件位置”

通过fopen、fscanf函数实现账户登录

实现过程: //写一个usr.txt文档,文档中每一行的格式为:姓名 密码 例如: //hangsan 123456 //lisi abcdef //任务: //要求从终端输入账户,密码; //与文件中的账户密码比较 //如果账户不存在,则输出用户不存在 //如果账户存在,密码错误,则输出密码错误 //如果账户密码均正确,输出登录成功 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { //打开一个仅读文件 FILE *p=fopen("./usr.txt","r"); if(p==NULL) { printf("打开失败\n"); return -1; } printf("打开usr.txt文件成功\n"); //定义两个数组存储终端输入的账户密码 char get_name[20]={},get_password[20]={}; //定义两个数组存储文件读取的账户密码 char file_name[20]={},file_password[20]={}; //定义两个标记符输入的账户密码的存在与否,为0不存在,为1存在 int flag_name=0,flag_password=0; printf("请输入账户>>>"); scanf("%s",get_name); //循环判断文件中是否有该账户存在 while(1) { if(fscanf(p,"%s %s",file_name,file_password)==EOF) { flag_name=0; break; } if(strcmp(file_name,get_name)==0) { flag_name=1; break; } } //判断账户标记符 if(flag_name==0) { printf("用户不存在\n"); } else { printf("请输入密码>>>"); scanf("%s",get_password); //循环判断密码是否正确 while(1) { //判断是否遍历完文件中的数据 if(fscanf(p,"

如何在 Debian 和 Ubuntu 系统上安装/升级 PHP 8.2

PHP 8.2带来了主要的新特性,例如只读类、新random扩展、敏感参数编辑以及语言精简更改,包括弃用动态属性和与字符串插值相关的弃用。 注意:PHP 8.2 尚未达到 GA 版本,但 PHP 8.2 计划于 11 月 24 日发布。当发布第一个稳定的 PHP 8.2 版本时,将删除此通知。在此之前,指南的其余部分将安装最新的 PHP 8.2 候选版本。对于生产服务器,建议等到 GA 发布。 目前,Debian 或 Ubuntu 的默认软件存储库中未提供 PHP 8.2 软件包,但 PHP 8.2 软件包可从Ondřej Surý维护的存储库中获得。Ondrej 的存储库是主要的和最新的存储库,为基于 Debian 和 Ubuntu 的操作系统提供 PHP 包和 PECL 扩展,并用于所有 PHP.Watch 在这些系统上安装 PHP 的指南。 PHP 8.2 中的新功能和更改 PHP 8.2 带来了一个健康的安全和性能新功能列表,以及一些可能会在现有遗留系统上发出额外警告的弃用,因为它弃用了动态属性,以及一些其他弃用。 有关 PHP 8.2 中新功能和更改内容的完整列表,请参阅PHP 8.2:新功能和更改内容 值得注意的扩展和 INI 更改 PHP 8.2 不包含任何会影响安装或升级过程的显着变化。PHP 8.2 实际上添加了一个名为 的新扩展random,但是这个扩展始终是一个捆绑扩展,没有它就无法编译 PHP。 PHP 的 INI 设置和文件的一个显着变化是 PHP 8.

【C语言】在数组中查找指定元素。

#include <stdio.h> #define N 81 int search(int list[],int n,int x); int main() { int n; int a[N]; int i,j; int x,t; printf("Input n:");scanf("%d",&n); printf("Input %d integers:",n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } printf("Input x:");scanf("%d",&x); t=search(a,n,x); if(t==-1) { printf("Not Found"); } else { printf("index=%d",t); } return 0; } int search(int list[],int n,int x) { int i,j; int count=-1; for(i=0;i<n;i++) { if(list[i]==x) { count=i; break; } } if(count==-1) { return -1; } else { return count; } } 问题描述】5.

【C语言】判断是否为上三角矩阵

#include <stdio.h> #define N 81 int main() { int n; int a[N][N]; int i,j; int t=1; printf("Input n:"); scanf("%d",&n); printf("Input array:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&a[i][j]); } } for(i=0;i<n;i++) { for(j=0;j<i;j++) { if(a[i][j]!=0) { t=0;//如果不是0,可以直接确定主对角线以下不是0,直接退出循环 break; } } } if(t==0) { printf("NO"); } else if(t==1) { printf("YES"); } return 0; } 【问题描述】4.9 判断是否为上三角矩阵。 输入一个正整数n(1<n=<6)和n阶矩阵a中的元素,如果a是上三角矩阵,输出YES;否则,输出NO。 (上三角矩阵,即主对角线以下的元素都为0,主对角线为从矩阵的左上角至右下角的连线)。 【输入形式】 从键盘输入一个正整数n和矩阵阵列。 【输入输出样例1】 Input n:3 Input array:(输出后换行) 1 2 3 0 4 5 0 0 6

【C语言】整数出现次数

#include <stdio.h> #include<string.h> #define N 81 int main() { int a[N],a1[N],b[N],c[N],d[N]; int i,j,k; int count; int n; int max; int temp; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=0;i<n;i++) { a1[i]=a[i]; }/*笔者担心后序会需要数组a,所以提前后面将a数组赋值于另一个数组,尽管有点多此一举*/ for(i=0;i<n;i++) { count=1; for(j=i+1;j<n;j++) { if(a1[i]==a1[j]) { count++; for(k=j;k<n-1;k++) { a1[k]=a1[k+1]; } n--; } else { continue; } } b[i]=count; }/*将次数存在另一个数组,同时删去相同的数,便于次数与数一一对应,且便于升序处理*/ max=b[0]; for(i=1;i<n;i++) { if(b[i]>max) { max=b[i]; } }/*找出一个最大数*/ k=0; for(i=0;i<n;i++) { if(max==b[i]) { c[k]=b[i]; d[k]=a1[i]; k++; }/*防止出现多个最大数,将不同的数存在另一个数组*/ } /*for(i=0;i<k;i++) { printf("

【C语言】打印菱形。

#include <stdio.h> int main() { int i,j,n; scanf("%d",&n); for(i=1;i<n;i++) { for(j=1;j<=n-i;j++) printf("%c",' '); for(j=1;j<=2*i-1;j++) printf("%c",'*'); printf("\n"); } for(i=1;i<=n;i++) { for(j=1;j<=i-1;j++) printf("%c",' '); for(j=1;j<=2*n-(2*i-1);j++) printf("%c",'*'); printf("\n"); } return 0; } 【问题描述】3.2.15 打印图形。 【样例输入】4 【样例输出】输出结束有换行符。

J1939-21数据链路层多帧协议PDU解析

一、协议数据单元(PDU) P 是优先级,R 是保留位,DP 是数据页,PF 是PDU 格式,PS 是特定PDU,SA 是源地址 优先级(P):这三位仅在总线传输中用来优化消息延迟,接收机必须对其做全局屏蔽(即忽略)。消息优先级可从最高0(000)设置到最低7(111),当消息被添加到应用层,将给出一个推荐的优先级。OEM 可以对网络做相应调整。PDU 格式(PF):确定PDU 的格式,也是确定数据域对应参数组编号的域之一。特定PDU(PS):它的定义取决于PDU 格式,根据PDU 格式它可能是目标地址或者组扩展。 若PDU 格式(PF)域的值小于240,特定PDU 域是目标地址。若PF 域的值在240 和255 之间,特定PDU 包含组扩展(GE)值,所以可用参数组的总数目:(240 +(16*256))*2 = 8672。源地址(SA):网络中一个特定源地址只能匹配一个设备。因此,源地址域确保CAN 标识符符合CAN 协议中的唯一性要求。地址管理和分配在SAE J1939-81中有详细介绍。 二、首帧PDU格式 首帧报文ID定义 参数组名称: 传输协议——连接管理(TP.CM) 定义: 用于 9 字节及以上的数据的参数组的传输 重复传输速度: 由传送的参数组编号决定 数据长度: 8 个字节 数据页位(DP): 0 PDU 格式(PF): 236 特定 PDU(PS): 目标地址(FF代表广播,如:18ECFFxx) 默认优先级: 7 参数组编号(PGN): 60416(00EC0016) 本参数组功能所使用的参数范围 控制字节: 0-15,18,20-31,33-254 保留给 SAE 分配(最常用的是广播形式Byte1=0x20) 整个消息大小的字节数: 9 到 1785(2 字节),0 到 8 和 1786 到 65535 禁用

MyBatis的各种查询功能4(查询多条数据为map集合)

查询多条数据为map集合 方式1(用的较多) 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,此时可以将这些map放在一个list集合中获取 方式2 将表中的数据以map集合的方式查询,一条数据对应一个map;若有多条数据,就会产生多个map集合,并且最终要以一个map的方式返回数据,此时需要通过@MapKey注解设置map集合的键,可以将查询的某个字段的值作为map的键,值是每条数据所对应的map集合 SelectMapper 接口 public interface SelectMapper { /** * 查询所有的用户信息为map集合 * @return */ //List<Map<String,Object>> getAllUserToMap(); @MapKey("id") Map<String,Object> getAllUserToMap(); } MyBatis的映射文件 SelectMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.atguigu.mybatis.mapper.SelectMapper"> <!--Map<String,Object> getAllUserToMap();--> <select id="getAllUserToMap" resultType="map"> select * from t_user </select> </mapper> 测试 public class SelectMapperTest { @Test public void testGetAllUserToMap(){ SqlSession sqlSession = SqlSessionUtil.getSqlSession(); SelectMapper mapper = sqlSession.getMapper(SelectMapper.class); // List<Map<String, Object>> list = mapper.

【C语言】交换最大、最小值。输入一个正整数n(1<n≤10),再输入n个整数(<=999),将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。

#include <stdio.h> #define N 1000 int main() { int n,i,a[N],count1=0,count2=0,t,min,max; printf("Input n:"); scanf("%d",&n); printf("Input %d integers:",n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } min=a[0]; for(i=0;i<n;i++) { if(min>a[i]) min=a[i]; } for(i=0;i<n;i++) { if(a[i]==min) break; count1++; } t=a[0]; a[0]=min; a[count1]=t; max=a[0]; for(i=0;i<n;i++) { if(max<a[i]) max=a[i]; } for(i=0;i<n;i++) { if(a[i]==max) break; count2++; } t=a[n-1]; a[n-1]=max; a[count2]=t; printf("After swapped:"); for(i=0;i<n;i++) { printf("%4d",a[i]); } return 0; } 【问题描述】4.4 交换最大、最小值。输入一个正整数n(1<n≤10),再输入n个整数(<=999),将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。 【输入输出样例】 【样例说明】 输入提示符后冒号为英文字符,后面没有空格。 输出整数序列时按照%4d格式输出。

VMware Fusion 13虚拟机如何安装win 11系统?mac运行win

VM虚拟机如何安装win 11系统?还不知道如何在VMware Fusion 13虚拟机中安装win 11的朋友来看看吧。 1、运行 VMware Fusion 13 虚拟机,在「新建虚拟机」界面上,拖拽下载的Win11 ARM 系统镜像 2、VMware会自动识别镜像,下一步窗口中选择「Windows 11 64位 ARM」 3、固件类型默认UEFI即可,点继续 4、选择加密窗口中,选择Partial Encryption,设置好密码,勾选Remember Password and store it in Mac’s KeychAIn,然后点继续; 5、出现「Press any key to boot from CD or DVD」字样时,需要快速按下任意键,如果错过了,需要重启虚拟机再试; 6、进入到Windows安装界面,大部分默认即可 7、安装类型选择第二个Custom「自定义:仅安装Windows」,密钥窗口点击「我没有密钥」文字,然后耐心等待安装完成即可。 下载VMware Fusion Pro for mac(vm虚拟机)

WHIOS协议规范如下(原文引用)

本文介绍的是一种查询域名所有权信息的方法。对于称为 WHOIS的IRC命令,请参阅Internet 中继聊天命令列表 § WHOIS。 WHOIS(发音为短语“who is”)是一种查询和响应协议,广泛用于查询存储注册用户或互联网资源受让人的数据库,例如域名、IP 地址块或自治系统, 但也用于更广泛的其他信息。该协议以人类可读的格式存储和传送数据库内容。[1] WHOIS 协议的当前版本由互联网协会起草,并记录在RFC 3912中。 Whois 也是大多数UNIX系统上用于进行 WHOIS 协议查询的命令行实用程序的名称。[2]此外,WHOIS 有一个名为Referral Whois ( RWhois ) 的姊妹协议。 内容 1个 历史 1.1 CRISP 和 IRIS 1.2 怪异和 RDAP 2个 协议 2.1 强化 3个 执行 3.1 精简查找和详细查找 3.2 软件 3.3 网络 4个 服务器 4.1 区域互联网注册机构 4.2 服务器发现 5个 查询示例 6个 推荐域名 7 批评 8个 信息的准确性 9 法律与政策 10 ICANN 提议废除 WHOIS 11 标准文件 12 也可以看看 13 参考

蚁群算法(ant system,AS)

蚁群算法 蚂蚁系统(ant system,AS)由Dorigo于1996年发表,文章题目为[《The Ant System : optimization by a colony of cooperating agents》](https://www.docin.com/p-1565494487.html)。在耳熟能详的TSP旅行商问题上AS算法有着不错的效果,这也是被大多数人认可的一种随机演化算法。 蚁群算法的思想来源于蚂蚁觅食的过程: 单个蚂蚁的行为比较简单但蚁群在不同的环境下,能寻找到达食物源的最短路径蚂蚁在其经过的路径上释放“信息素”蚁群内的蚂蚁会沿着“信息素”浓度较高的路径行走,形成正反馈人工蚂蚁可以超越真实蚂蚁,如具有有限记忆存储能力 一般而言机器智慧都是产生于多个个体之间的“交流”,如当下比较火的深度学习,层与层之间链接方式是尤为关键的,后续的传播方向就是由这些链接来决定的,又比如传统的群体智能优化算法PSO,一个种群之中个体和最优个体之间有一种交流,就是个体向最优个体学习,而蚁群算法中的个体交流像是人类阅读图书跟前人交流,蚂蚁通过“阅读”前人留下的“信息素”来更好的判断下一步要怎么走,人类社会中也有老话:不听老人言吃亏在眼前,所以蚂蚁跟着“信息素”走能够极大地保证单只蚂蚁的行为是普遍正确的。 如果蚁群中只有一只蚂蚁,这显然是不行的,单只蚂蚁的智慧能力比较局限,它只能和上一个自己进行“交流”并且效率十分低,所以一般认为单只蚂蚁是很难产生智慧的。一个蚁群就像是一个人类社会,无论在长江黄河流域还是在黄土高原地区,当地的人们总能找到一种适合自己生存的方式,而蚂蚁觅食也是如此,在一定时间的演化下,蚂蚁的“信息素”就如同人类社会的书籍一般宝贵。另外,人工蚂蚁相较于真实的蚂蚁具有很多优势,例如,只要计算机的内存足够大,那么蚂蚁的记忆是无限的,对于真实的生物来说,这显然是不能达到的,毕竟总要遗忘。 蚁群算法的过程: 初始化:城市数n、距离矩阵d、蚂蚁数量、沉积常数、挥发率、每条边的初始信息素。while 条件不满足构建每个蚂蚁的路径(随机比例+轮盘赌)计算每个蚂蚁的路劲总长度更新每条边的信息素(全局信息素更新:沉积+挥发)end 构建蚂蚁路径:第k只蚂蚁,已访问城市集合 C k C_{k} Ck​对每一个未访问的城市j,计算随机比例: p i j ( k ) = τ i j α / d i j β ∑ m ∉ C k τ i m α / d i m β p^{(k)}_{ij}=\frac{τ^{α}_{ij}/d^{β}_{ij}}{\sum_{m\notin{C_{k}}}τ^{α}_{im}/d^{β}_{im}} pij(k)​=∑m∈/​Ck​​τimα​/dimβ​τijα​/dijβ​​让蚂蚁k以上述随机比例(轮盘赌)到达城市j 信息素更新所有蚂蚁的路径构建完毕后,进行信息素的更新 τ i j = ( 1 − ρ ) τ i j + ∑ k = 1 N Δ τ i j ( k ) τ_{ij}=(1-ρ)τ_{ij}+\sum^{N}_{k=1}{\Delta \tau^{(k)}_{ij}} τij​=(1−ρ)τij​+k=1∑N​Δτij(k)​

【数据库与事务系列】多数据源切换

分库分表 不光是管理多个数据源,是对sql的优化、改写、归并等一系列操作的解决方案。关注的是sql语句。以shardingSphere为例,虽然也支持跟sql无关的hint策略提供路由功能,但是在sql改写以及归并过程中,依旧对sql有限制。 多数据源切换 如果只是简单的切换多个数据源,而对sql的逻辑没有任何限制,就不要选择分库分表了。直接选用多数据源切换多方案更简单。spring-jdbc模块提供了AbstractRoutingDataSource抽象类,其内部可以包含多个DataSource,只需要实现其抽象方法,在运行时就可以动态访问指定的数据库。但是需要自己实现一些aop的切换能力,这个mybaitis-plus都帮我们做好了。 业界主要有两种实现方案: AOP + ThreadLocal ,如:Mybatis-plus的多数据源(dynamic-datasource);语义解析,如:客户端侧:ShardingSphere-Jdbc,服务端侧:ShardingSphere-Proxy,阿里云、腾讯云proxy。 一、动态数据源切换 (AbstractRoutingDataSource实现) 我们来查看AbstractRoutingDataSource源码,来更好的理解多数据源配置。 首先查看该类的属性,根据名称我们能看出他们的作用。 private Map<Object, Object> targetDataSources; private Object defaultTargetDataSource; private boolean lenientFallback = true; private DataSourceLookup dataSourceLookup = new JndiDataSourceLookup(); private Map<Object, DataSource> resolvedDataSources; private DataSource resolvedDefaultDataSource; targetDataSources是目标数据源集合defaultTargetDataSource是默认数据源resolvedDataSources是解析后的数据源集合resolvedDefaultDataSource是解析后的默认数据源 对数据源赋值的代码如下: public void setTargetDataSources(Map<Object, Object> targetDataSources) { this.targetDataSources = targetDataSources; } public void setDefaultTargetDataSource(Object defaultTargetDataSource) { this.defaultTargetDataSource = defaultTargetDataSource; } 因为方法是set开头,我们便能把这两个方法配置在spring中,继续向下看。 public void afterPropertiesSet() { if (this.targetDataSources == null) { throw new IllegalArgumentException("

(附源码课件)10款Java小游戏满足你各种需求

游戏推荐 黄金矿工项目 飞机大战项目 超级玛丽项目 坦克大战项目 大鱼吃小鱼项目 飞翔的小鸟项目 扫雷项目 贪吃蛇项目 推箱子项目 本套视频课程包含: 1、王者荣耀项目 开发环境:jdk1.8 开发工具:eclipse JavaEE基础如下:变量、数据类型、判断语句、循环结构、数组、集合、随机数生成、简单窗口创建、图形图片绘制、双缓存技术、键盘事件、鼠标事件、物体的碰撞检测、三角函数、多边形绘制与移动。 2、飞机大战项目 Java技术:java变量、java数据类型、判断语句、循环结构、数组、Java集合、简单窗口创建、图形图片绘制、双缓存技术、事件-鼠标和键盘事件、物体的碰撞检测。 3、坦克大战项目 JavaEE基础如下:变量、数据类型、判断语句、循环结构、数组、集合、随机数生成、简单窗口创建、图形图片绘制、双缓存技术、键盘事件、物体的碰撞检测。 4、俄罗斯方块项目 开发环境: JDK1.8 开发工具: IDEA 涉及知识:Java变量、java数据类型、判断语句、循环结构、Java集合、简单窗口创建、图形图片绘制、双缓存技术、鼠标事件、物体的堆叠检测。 5、推箱子项目 Javaee基础如下:变量、数据类型、判断语句、循环结构、二维数组、集合、简单窗口创建、图形图片绘制、双缓存技术、事件-键盘事件、物体的碰撞检测。 6、飞翔的小鸟项目 开发环境:jdk1.8 开发工具:IDEA javaee基础如下:变量、数据类型、判断语句、循环结构、数组、集合、简单窗口创建、图形图片绘制、双缓存技术、事件-键盘事件、物体的碰撞检测、File 7、超级玛丽项目 Javase基础如下:变量、数据类型、容器、判断语句、循环结构、简单窗口创建、事件-键盘事件、JavaIO、Player类的使用、多线程、JOptionPane类的使用。 8、王者荣耀项目 JavaEE基础如下:变量、数据类型、判断语句、循环结构、类的继承、简单窗口创建、图形图片绘制、双缓存技术、鼠标事件、键盘事件。 9、扫雷项目 开发环境:jdk1.8 开发工具:IDEA JavaEE基础如下:变量、数据类型、判断语句、循环结构、数组、二维数组、递归、简单窗口创建、图形图片绘制、双缓存技术、鼠标事件 10、贪吃蛇项目 开发环境: jdk1.8 开发工具:IDEA 涉及知识:变量、数据类型、判断语句、循环结构、集合、简单窗口创建、图形图片 以上为本次Java游戏项目的分享,满足同学们的多种选择!希望大家可以在原本的课件基础上可以发挥自己的创作能力,制作出属于自己的游戏!!! 以上项目已经整理好了,需要的可以下方GZH拿 希望可以帮助到大家!

基于java GUI实现的一个日历记事本小项目

最近刚学了gui部分的内容,练手和两个同学一起做了一个小日历,第一次做没啥经验,代码多多少少有点不规范的,各位见谅,下面浅浅讲一下思路。 代码已给出了每段比较详细的注释,整体分FirstFrame和MainFrame,first上有两个按钮,分别加监听触发退出和进入主页面 然后main中是整体精华所在,通过不断setText每个按钮上的文字,来达到切换时,日期自动切换的功能,然后,有年份选择和月份选择两个列表框,通过获取列表框中的内容,来设置当前应该显示的时间。 这个是mainframe的页面: 然后本日历记事本还可以通过点击当天按钮,然后唤起一个文本框,可以输入想要记录的备忘事项,并且,当下次打开程序时,上次记录的事项可以通过文件可持续化保存,这也属于一个小功能。 整体项目分三个java文件,分别是TextBook:主要代码,TextFile:文件操作,封装在一个类中了,Start启动器 在文章底部有源码链接 下面是TextBook.java文件: package com.tt.Textbook; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; //初始页面 class FirstFrame extends JFrame { public FirstFrame(){ //container分为上下表格布局 Container FirstContainer = this.getContentPane(); FirstContainer.setLayout( new GridLayout(2,1) ); //需要两个面板,分别是标题和退出框以及进入按钮 Panel panel1 = new Panel( new BorderLayout() ); Panel panel2 = new Panel( new GridLayout(1,3) );//下部分的1行3列表格布局 Panel panel3 = new Panel( new GridLayout(2,1) );//下面中间的二层布局 Panel panel4 = new Panel( new FlowLayout() );//下中之一 Panel panel5 = new Panel( new FlowLayout() );//下中之二 //导入标题图片 ImageIcon Titleimg = new ImageIcon( "

IDEA运行缓慢卡顿,解决idea卡顿,控制台中文乱码 以及其它常用设置

IDEA运行缓慢卡顿,解决idea卡顿问题以及常用设置 IDEA卡顿原因优化IDEA配置 ---- 重点推荐的方法手动修改IDEA配置步骤其他卡顿优化(参考)1.idea启动时会有两个快捷方式2. 卸载不需要用的插件3.减少内存4.适当关闭idea的Inspections的检查或者开发时完全关闭Inspections的检查,等开发完后在开启检查 idea控制台中文乱码解决idea其他基本设置 IDEA卡顿原因 使用IDEA时,总是点一下卡一下,真的对人是一种折磨! 其实,这种情况主要因为IDEA默认启动配置,一款软件它要考虑低配置用户,所以初始化参数不高(默认最低128m,最高512m),导致启动慢,然后运行也不流畅。因此我们需要优化下启动和运行配置。 优化IDEA配置 ---- 重点推荐的方法 由于IDEA初始参数低,但是在工作中的电脑一般都是8G或者16G的运行内存,所以我们需要手动去修改默认的IDEA配置。使得我们的体验更加流畅! 这里是主要是 idea安装目录下的bin文件夹下的idea.exe.vmoptions文件! 手动修改IDEA配置步骤 找到IDEA安装目录,进入bin文件夹下,找到idea.exe.vmoptions文件! idea.exe.vmoptions:默认32位机器运行的idea64.exe.vmoptions:默认64位机器运行的 打开idea.exe.vmoptions 以及idea64.exe.vmoptions文件 关键的三个参数的说明 1、 -Xms 是最小启动内存参数 2、 -Xmx 是最大运行内存参数 3、 -XX:ReservedCodeCacheSize 保留代码占用的内存容量参数 手动修改 -Xms=512m-Xmx=1024m-XX:ReservedCodeCacheSize=300m 基本在原有基础增加一倍!如下图: 【如果你的电脑在8G以上,或者配置更好】 可以参考如下设置: -Xms=1024m-Xmx=2048m-XX:ReservedCodeCacheSize =500m 保存后,重新打开IDEA,会发现运行速度明显提高,流畅很多! 我们应根据具体情况更改合适的参数,并不一定完全按照我的参数!,但是只要增大参数,运行情况都会变得更优! 当然也可以分别改成 1024m 和 2048m,之后如果还卡,再往大了调,我估计应该也不会再卡了。 其他卡顿优化(参考) 1.idea启动时会有两个快捷方式 idea安装完后默认生成在桌面的是32位的idea的快捷方式,如果我们使用这个快捷方式运行大项目,一般都会很卡。解决方法是找到idea的安装目录,然后进入bin文件夹,找到名称为idea64的应用程序,右键他生成桌面快捷方式。以后每次启动都用它这个快捷方式就可以了。 2. 卸载不需要用的插件 对于Java开发,对于一些默认安装的什么安卓的google的app,前端的js框架 等插件可以卸载掉项目中根本不用不到的一些框架,Struts,Hibernate,Ant 等可以卸载 当然,具体应该根据我们的开发情况来停止一些不必要的插件! 3.减少内存 在设置项目的时候尽量不要将没有关系的项目放置在一个工程中,这样能够减少内存的使用 4.适当关闭idea的Inspections的检查或者开发时完全关闭Inspections的检查,等开发完后在开启检查 idea右下角(旧版)有一个 人头标志,可以点击,调准idea检查级别~ idea2021版本和企业版,都没有人头标志,在代码域右上角,如图,鼠标悬停! 主要用来设置当前编辑文档的代码检查等级 Inspections 为最高等级检查,可以检查单词拼写,语法错误,变量使用,方法之间调用等Syntax 可以检查单词拼写,简单语法错误None 不设置检查 IntelliJ IDEA 对于编辑大文件并没有太大优势,很卡,原因就是它有各种检查,这样是非常耗内存和 CPU 的,所以为了能加快大文件的读写,可以考虑暂时性设置为 None。 Power Save Mode 省电模式,也可以通过File -> Power Save Mode来设置,开启这种模式之后 IntelliJ IDEA 会关掉代码检查和代码提示等功能。如果在开发过程中遇到突然代码文件不能进行检查和提示可以来看看这里是否有开启该功能,但是为了代码正确率不建议开启!

利用redis + mysql 完成签到

//用户签到实现 @PostMapping(“/check”) public Result check(@PathVariable String id) { //首先拼接key String day = DateFormatUtils.format(new Date(), “yyyy-MM-dd”); String key = id + “:” +day; //redis中是否存在该key Boolean flag = redisTemplate.hasKey(key); if(flag){ return Result.error(500,“今日用户已签到”); }else{ //设置redis中的过期时间,凌晨0点清空; redisTemplate.opsForValue().set(key, day, getRefreshTime(), TimeUnit.SECONDS); //将未签到用户记录在mysql中 int i = iPlatUserService.insert(id); if(i > 0){ //签到成功 return Result.success(“用户成功签到”); }else { return Result.error(500,“由于不正常原因,用户签到失败!”); } } } /* * 获取当前时间离明天凌晨还有多少时间 * */ public static int getRefreshTime(){ Calendar calendar = Calendar.getInstance(); int now = (int) (calendar.

Vue Element Select选择器自定义验证规则

前言 在我们在做增删改查的时候,一般会遇到添加和修改的from表单需要表单验证。 一般常规的from表单是有自己的验证规则,from加一个 :rules="rules"但他需要v-model值和prop值要一样,这是常规情况。 我遇到的是,绑定多个负责人和对应的电话,加验证规则。 实际场景 1.我们在from表单绑定多个负责人就需要使用到 select 选择器,下拉的数据是点击打开弹框时发请求来的。 2.点击选中的时候,数据时对象形式,id 名字 电话 绑定在一起的。选中负责人的时候,我们是把一整个对象存到数组里面 3.因为我们用的是select下拉多选,也不能用常规的验证规则,他会不起作用,我们要写from表单自定义验证规则 select多选 下拉框数据 { id: '1', name: '秦大大', phonf: '15220730439' }, select下拉款选中时绑定的是对象 我们只需要给他绑定一个属性,value就可以直接绑定对象 具体下面有代码 // 这个值最好是id 是唯一的 value-key="id" 输入框表单事件 获取焦点:focus 失去焦点:blur 输入事件input 变化事件change 自定义表单验证在data下面写 在rules里面直接通过validator用 下面有代码 实际操作 1.添加form表单数据 <el-form-item label="负责人" prop="principalopen"> <!-- <el-input v-model.number="form.contact" autocomplete="off"></el-input> --> // 多选下拉框 // multiple 多选 // value-key="id" 给value绑定为一只 这样value就可以选中item <el-select v-model="principalopen" multiple value-key="id" placeholder="请选择负责人" style="width: 100%" > // 下拉框数据 <el-option v-for="

uniAPP 原生插件测试 提示 未配置AppKey或配置错误问题排查

1,申请 android平台的AppKey(说明文档). 申请地址 2,Android平台配置 (1) 获取到android平台的AppKey后!打开Android项目 配置主APP的Androidmanifest.xml文件, 导航到Application节点,创建meta-data节点,name为dcloud_appkey,value为申请的AppKey如下: <application ...> <meta-data android:name="dcloud_appkey" android:value="替换为自己申请的Appkey" /> (2) 主APP的build.gradle文件的android节点下配置 签名文件信息 如下: signingConfigs { config { keyAlias '签名别名' keyPassword '签名密码' storeFile file('xxx/xxx/xxx.keystore或xxx/xxx/xxx.jks') // 路劲为相对路径或绝对路径 storePassword '密码' v1SigningEnabled true //兼容v1 v2SigningEnabled true //兼容v2 } } buildTypes { debug { signingConfig signingConfigs.config ... } release { signingConfig signingConfigs.config ... } } (3)查看离线项目中dcloud_control.xml文件中的appid是否与申请AppKey时的appid一致。 (4)检测离线项目的包名是否申请AppKey时的包名是否一致。 详见文档: uniAPP离线打包key申请及注意事项

Nginx配置IP拦截

最近百家饭团队开源了一个Nginx日志分析工具APIcat,这周在生成报告的基础上,实现了基于Nginx的自动拦截防护,正好研究了一下Nginx配置IP拦截的配置 配置方式 nginx配置ip拦截基本是通过deny和allow两个配置关键字来实现的。可以配置单ip的拦截放行,也可以配置网段的拦截放行,比如: allow 1.2.3.4; deny 1.2.3.4/24; allow 1.2.3.4/16; deny all; 关键字后跟具体的IP或者CIDR格式的网段即可,注意加上; 否则会报格式错误。 配置和一般防火墙一样,匹配从上到下进行,匹配到的第一条就生效,比如上面这个例子,1.2.3.4会直接匹配第一条单IP的配置,而1.2.3.1会匹配第二条,1.2.4.1会匹配第三条。如果配置的顺序改变了,就会影响匹配效果,比如,如果写成这样: deny 1.2.3.4/24; allow 1.2.3.4; allow 1.2.3.4/16; deny all; 1.2.3.4会因为匹配到第一条而造成直接被deny。 配置的地点 一共有三个地方可以配置IP拦截。 配置为全局拦截 在nginx.conf里面我们可以配置全局的客户IP拦截,在配置的http段增加deny标识即可 http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #看这里 deny 1.2.3.4; #gzip on; include /etc/nginx/conf.d/*.conf; } 配置为单服务模式 如果只是对某个server配置IP拦截,则可以在server段配置,针对debian/ubuntu等,server配置在conf.d/里面,则可以不在nginx.conf里配置,而在conf.d里面的具体配置文件里配置。例如 server { listen 80; server_name localhost; # 看这里 deny 1.

Linux ab压力测试工具安装教程

直接执行命令 yum install httpd-tools 通过 命令查看使用详解 ab --help或者man ab 使用 ab参数选项 -n:即requests,用于指定压力测试总共的执行次数(常用)。 -c:即concurrency,用于指定的并发数(常用)。 -t:即timelimit,等待响应的最大时间(单位:秒)。 -b:即windowsize,TCP发送/接收的缓冲大小(单位:字节)。 -p:即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。 -u:即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。 -T:即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain。 -v:即verbosity,指定打印帮助信息的冗余级别。 -w:以HTML表格形式打印结果。 -i:使用HEAD请求代替GET请求。 -x:插入字符串作为table标签的属性。 -y:插入字符串作为tr标签的属性。 -z:插入字符串作为td标签的属性。 -C:添加cookie信息,例如:"Apache=1234"(可以重复该参数选项以添加多个)。 -H:添加任意的请求头,例如:"Accept-Encoding: gzip",请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。 -A:添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。 -P:添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。 -X:指定使用的和端口号,例如:"126.10.10.3:88"。 -V:打印版本号并退出。 -k:使用HTTP的KeepAlive特性。 -d:不显示百分比。 -S:不显示预估和警告信息。 -g:输出结果信息到gnuplot格式的文件中。 -e:输出结果信息到CSV格式的文件中。 -r:指定接收到错误信息时不退出程序。 -h:显示用法信息,其实就是ab -help。 结果 ##首先是apache的版本信息 This is ApacheBench, Version 2.3 <Revision:655654> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.xxx.xxx/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking xxx.xxx.com (be patient) Server Software: nginx Server Hostname: xxx.

Pycharm如何配置运行参数

# run_cnn.py文件中主函数的代码段 if __name__ == '__main__': if len(sys.argv) != 2 or sys.argv[1] not in ['train', 'test']: raise ValueError("""usage: python run_rnn.py [train / test]""") 这个主函数在执行时,需要传入参数。 有两种方式可以让这个.py文件执行起来: 1. 终端代码执行 python run_cnn.py train 这里的参数’train’不需要加双引号 2. pycharm中执行 在pycharm的右上角有个Run/Debug Configurations,在python下选中可执行文件run_cnn.py,第二行有个Parameters里填入train,不需要加引号 👏👏👏再看看我们以前的文章😃😃😃 🌺 Excel中数据分析工具库-相关系数篇 🌺 干货,手把手教会你做相关性分析 🌺 5年数据分析路,小结。 🌺 用户细分及画像分析 🌺 K-近邻算法及实践 欢迎关注,微信公众号“数据分析师之家” 扫描二维码 关注我们 💁提供职业规划、简历指导、面试辅导服务哦 QQ交流群:254674155 数据分析之家联合JEE RAY品牌为粉丝派发福利 添加粉丝福利派发官,领取粉丝福利哦

MySQL中按天、自然周、月、季度、年份统计

在Oracle数据库中,通过to_char()函数来操作日期变量,而在MySQL中,则通过date_format()函数实现日期相关周期的统计。date_format()函数一共有两个参数:date参数表示日期变量,format参数表示日期格式。 如果想查看date_format()函数的具体参数及其取值情况,可以搜索引擎中自行查询。比如输入“MYsql date_format”可以看到W3school中对该函数的详细介绍。 http://www.w3school.com.cn/sql/func_date_format.asp 1. 按天统计 format参数的取值为’%y%m%d’,可以按天输出统计结果。 SELECT DATE_FORMAT(postDateTime,'%y年%m月%d日') as d,count(*) FROM table GROUP BY DATE_FORMAT(postDateTime,'%y%m%d') ORDER BY d asc; 输出结果如下所示: 2. 按自然周统计 format()函数的format参数取值为’%y%u’时,可实现按年、年中的周来统计结果。如果在where条件中限制是某一年的周期,可以直接将format参数的值配置为’%u’,否则一定要用’%y%u’,不然会把不同年的第n周合并到一起而出现错乱。 SELECT DATE_FORMAT(postDateTime,'%y年%u周') as w,min(postDateTime) as st,count(*) FROM table GROUP BY DATE_FORMAT(postDateTime,'%y%u') ORDER BY w asc; 输出结果如下所示: 3. 按月统计 format()函数的format参数值为’%y%m’时,可实现按月份输出聚合结果。 SELECT DATE_FORMAT(postDateTime,'%y年%m月') as m,count(*) FROM table GROUP BY DATE_FORMAT(postDateTime,'%y%m') ORDER BY m asc 其统计结果如下所示: 4. 按季度统计 date_format()函数没有直接按照季节输出结果的功能,但这对于数据分析师并不是什么难事,自己利用月度聚合结果去加工以下即可: SELECT FLOOR((DATE_FORMAT(postDateTime,'%m')-1)/3)+1 as q,min(postDateTime) as st,count(*) FROM table WHERE DATE_FORMAT(postDateTime,'%Y') = 2018 GROUP BY FLOOR((DATE_FORMAT(postDateTime,'%m')-1)/3)+1 ORDER BY q asc; 使用到了floor函数,根据月份去判断所属季节,并输出季节对应的起始月份。

使用python查询Elasticsearch并导出所有数据

作为数据分析师,要学的可真多!但一旦触及到数据,无论它在藏在哪里,只要我们想要使用,就真是无所不用其极阿,python刀操起来~ 刚开始一直通过Kibana提供的工具来查询存储在Elasticsearch中的数据,统计个结果完全没问题。偶一日不仅仅是需要查询统计个结果,而是要对满足条件的结果近一步分析,此时发现手头的Kibana有点囧… 我神气的python出场啦 为了实现自己的需求,搬了会砖,又是修又是补,终于算是满足了自己的要求! 功能拆解 python连接Elasticsearch查询Elasticsearch打印结果导出所有结果数据将所有结果写入csv文件 1.打通python与Elasticsearch的通信 与python连接Oracle、MySQL差不多思路,这里需要用到Elasticsearch包,没有的赶紧使用pip install elasticsearch来安装。安装成功后,再使用from elasticsearch import Elasticsearch就不会报错了。 from elasticsearch import Elasticsearch es = Elasticsearch(hosts="http://192.168.21.33:9200/", http_auth=('abc','dataanalysis')) print(es.info()) 通过Elasticsearch()来配置连接,告诉它Elasticsearch所在服务器的IP地址,如果需要输入用户名密码,在http_auth参数中给出。如果打印连接的信息不报错,那就表明连接成功了 2.通过json查询体实现ES的查询 请求体与Kibana下使用的格式完全一致,如果不确定请求体写的对不对,可以放在Kibana下调试一下,调试正确了再放进来。 如下所示,通过"_source" : "title"可以限制返回结果只返回title字段。 query_json = { "_source": "title", "query": { "bool": { "must": [ {"match_phrase": { "content": "汽车" }}, {"match_phrase": { "content": "房子" }} ] } } } query = es.search(index='mydata',body=query_json) print(query) 正常情况下,打印query不报错的话就可以看到结果了。但是,你会发现返回的结果只有有限的几条。这是因为Elasticsearch默认情况下只会返回10或20条结果,如果你想要得到所有结果,接下来的工作才是重点。 3.借助游标导出所有结果数据 敲黑板,划重点: 先借助游标,将所有结果数据存储到内存中然后将内存中的结果数据写入到磁盘,也就是文件中 query = es.search(index='1485073708892',body=query_json,scroll='5m',size=100) results = query['hits']['hits'] # es查询出的结果第一页 total = query['hits']['total'] # es查询出的结果总量 scroll_id = query['_scroll_id'] # 游标用于输出es查询出的所有结果 for i in range(0, int(total/100)+1): # scroll参数必须指定否则会报错 query_scroll = es.

hive sql中between and

捣鼓了一下午,发现被复制结果集坑了。 哎感觉踩坑踩的像个无知的新手 select SUBSTRING(a.CREATED_TIME,0,7),dict_value,count(distinct a.mobile_no) as clues from dcs.NT_TP_P_CUSTOMERS a left join dcs.nt_sys_dictionary d on a.p_customer_from = d.dict_key where SUBSTRING(a.CREATED_TIME,1,7)>='2018-01' and SUBSTRING(a.CREATED_TIME,1,7)<= '2018-04' group by SUBSTRING(a.CREATED_TIME,0,7),dict_value order by clues desc 这两种写法的结果是完全一致的。 select SUBSTRING(a.CREATED_TIME,0,7),dict_value,count(distinct a.mobile_no) as clues from dcs.NT_TP_P_CUSTOMERS a left join dcs.nt_sys_dictionary d on a.p_customer_from = d.dict_key where SUBSTRING(a.CREATED_TIME,1,7) in ('2018-01','2018-02','2018-03','2018-04') group by SUBSTRING(a.CREATED_TIME,0,7),dict_value order by clues desc 但我不用in,单独使用筛选条件2018-01,2018-02,2018-03,2018-04然后将四份结果拼起来,发现大于between and的结果值。反复查才发现自己是掉到复制结果集的坑里了。结果集最多200行,所以全选复制后,就出错了。 👏👏👏再看看我们以前的文章😃😃😃 🌺 Excel中数据分析工具库-相关系数篇 🌺 干货,手把手教会你做相关性分析 🌺 5年数据分析路,小结。 🌺 用户细分及画像分析

Jupyter notebook转化为html文件,隐藏代码块,生成自动化报告

使用ppt制作周报或月报是一项非常耗费时间的活,不过做业务分析的同学还是免不了要用PPT,其他的自动化报告工具又不会,只能死磕PPT。 数据分析师就不一样了,自动化报告可以选择R Markdown或者使用Jupyter notebook与PyEcharts强强联合,生成自动化报告。 1.将notebook转化为html文件 notebook的前端页面集成了导出文件为html的功能,直接使用这个功能,导出的html文件中呢会包含代码块。 2. 隐藏html文件中的code 如果是生成自动化报告,代码块就没有必要展示出来,该如何操作呢? 打开终端后,运行shell命令 jupyter nbconvert --to html --no-input f:/Python/file/PyEcharts/Untitled1.ipynb 如果不加上–no-input,会默认在Untitled1.ipynb所在的路径下生成一个html文件Untitled1.html,这个html文件中含有代码块部分内容;加上–no-input参数,就会将notebook中的代码块隐藏,只显示代码块运营的结果及notebook中类型为“markdown”的cell。 运行shell命令后,打印以下结果,文件转化成功。 [NbConvertApp] Converting notebook f:/Python/file/PyEcharts/Untitled1.ipynb to html [NbConvertApp] Writing 385793 bytes to f:/Python/file/PyEcharts\Untitled1.html 👏👏👏再看看我们以前的文章😃😃😃 🌺 Excel中数据分析工具库-相关系数篇 🌺 干货,手把手教会你做相关性分析 🌺 5年数据分析路,小结。 🌺 用户细分及画像分析 🌺 K-近邻算法及实践 欢迎关注,微信公众号“数据分析师之家” 扫描二维码 关注我们 💁提供职业规划、简历指导、面试辅导服务哦 QQ群:753936858(原群已满,新群号) 数据分析之家联合JEE RAY品牌为粉丝派发福利 添加粉丝福利派发官,领取粉丝福利哦

第4季2:并口、MIPI、LVDS的简介

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 一、并口的简介 1、并口的含义 并口的含义,可以从AR0130或OV9712的原理图中形象地理解。 如下图所示,AR0130采用12bit的并口向SoC传输图像数据信息,而SoC和AR0130之间通过I2C接口来传递控制信息。 2、补充说明 (1)并口传输的是非差分的电平信号。 (2)并口sensor目前属于比较低端、老旧的产品。新型的像素比较高的sensor一般都采用MIPI、LVDS或HISPI接口,这些接口都采用差分信号传输信息。 二、LVDS的简介 1、LVDS的含义 LVDS是英文“low voltage differential signal”的缩写,中文意思是“低电压差分信号”。 2、补充说明 (1)接口由一组差分clock和若干组差分信号线组成。 (2)LVDS主要用于视频传输的两个领域,即视频采集领域(camera和主控)、显示领域(LCD与主控)。 (3)LVDS传输的是差分信号,其抗干扰性强,因此传输距离远,另外也允许通过提高时钟频率来提升带宽。 (4)LVDS数据线的组数越多则带宽越大,时钟频率越高则带宽越大(但时钟频率变高,抗干扰能力就会变差,传输距离就会变短)。 (5)并口、LVDS可以互相转换,但是需要专门的电平转换芯片。 三、MIPI 1、MIPI的含义 MIPI是“mobile industry processor interface”的缩写,中文意思是“移动工业处理器接口”。 2、补充说明 (1)MIPI接口由一组差分clock和1~4组差分信号线组成。 (2)MIPI和LVDS虽然都是差分对信号,但是不兼容,不能直接对接。 (3)MIPI的架构层次更分明,可以认为MIPI是LVDS的升级版。 (4)MIPI数据线的组数越多则带宽越大,时钟频率越高则带宽越大(但时钟频率变高,抗干扰能力就会变差,传输距离就会变短)。 (5)MIPI、LVDS、并口之间可以互相转换,但是需要专门的电平转换芯片。 (6)目前主流的sensor一般都使用MIPI接口。 四、总结 (1)低端、数据量小的就用电平信号接口,高端的、数据量大的就用差分信号接口。 (2)只有物理层、协议层、应用层对接,才能进行通信。 (3)因为历史原因,很多行业会使用不同的接口标准,必要时需要进行转换。

matlab图像的增强

1.灰度变换增强 (1)图像直方图 (2)图像直方图的均衡化 2.频域滤波增强 (1)低通滤波器 (2)高通滤波器 (3)同态滤波器 3.彩色增强 (1)真彩色增强 (2)伪彩色增强 (3)假彩色增强 4.小波变换在图像增强方面的应用 图像增强是图像处理中的基本技术之一,它是把原来不清晰的图像变得清晰,或者抑制图像的某些特征而使另一些特征得到增强。其主要目的是使处理后的图像质量得到改善,增加图像的信噪比,或者增强图像的视觉效果。 一、灰度变换增强 由于受各种拍摄条件的限制,图像的对比度有时比较差,图像的直方图分布有时也不够均衡,主要的元素集中在几个像素值附近,通过直方图均衡化,可使得图像中各个像素值尽可能均匀地分布或者服从一定形式的分布,从而提高图像的对比度。 (1)图像直方图 直方图是多种空间域处理技术的基础。直方图操作能有效地增强图像,直方图固有的信息在其他图像处理应用中也是非常有用的,如图像压缩与分割。 调用imhist函数可以显示一幅图像的直方图。 clc; %clc的作用就是清屏幕 clear; %clear是删除所有的变量 close all; %close all是将所有打开的图片关掉。 array=zeros(1,256); I=imread('E:\我的桌面\MATLAB\练习\2.jpg'); a=im2gray(I); %转换为灰度像素 subplot(121), imshow(a); %显示原图像 title('原始图像'); subplot(122), imhist(I); %显示其直方图 title('直方图'); (2)图像直方图的均衡化 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图。 调用histeq函数用于直方图均衡化 clc; %clc的作用就是清屏幕 clear; %clear是删除所有的变量 close all; %close all是将所有打开的图片关掉。 array=zeros(1,256); I=imread('E:\我的桌面\MATLAB\练习\2.jpg'); subplot(2,2,1); imshow(I); title('原始图像'); I=rgb2gray(I); subplot(2,2,2); imhist(I); title('原始图像直方图'); I1=histeq(I); %图像均衡化 subplot(2,2,3); imshow(I1); title('图像均衡化'); subplot(2,2,4); imhist(I1); title('直方图均衡化'); 二、频域滤波增强 利用图像变换方法将原来的图像空间中的图像以某种形式转换到其他空间中,然后利用该空间的特有性质方便地处理图像,最后再转换回原来的图像空间中,从而得到处理后的图像。 (1) 低通滤波器

SQL 分析与优化

SQL的快慢有些时候决定着系统的性能,作为一名 SQL BOY,SQL 优化已经成了必须掌握的技能,今天我们就来学习如何分析 SQL ,SQL 优化的案例以及一些 SQL 优化经验。 一. 数据准备 创建表 t1 和 t2 : CREATE TABLE `t1` ( `id` int NOT NULL AUTO_INCREMENT, `a` int DEFAULT NULL, `b` varchar(16) DEFAULT NULL, `c` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_a` (`a`), KEY `idx_b_a` (`b`,`a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `t2` ( `id` int NOT NULL AUTO_INCREMENT, `a` int DEFAULT NULL, `b` varchar(16) DEFAULT NULL, `c` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_a` (`a`), KEY `idx_b_c` (`b`,`c`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; sql 脚本循环插入数据:

idea 还原git merge

1、场景:错误的将分支代码 merge 到master, 此时我需要还原提交。 方法1.文件数比较少的时候,直接右击 revert 方法2.文件比较多的时候还原git 提交节点。 1、选择提交节点的id 2、 回滚代码到本地, 最后一步,还原到本地后,将代码再提交到服务器。 参考:IntelliJ Idea --- GIT 代码仓库还原到某一个提交的节点_兮家小二的博客-CSDN博客_idea代码还原到某个节点

2023年Java面试题及答案整理

本文分为十九个模块,分别是:「Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM」 ,如下图所示: 共包含 208 道面试题,本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单,下面一起进入主题吧。 下载链接:博主已将以上这些面试题整理成了一个面试手册,是PDF版的 互联网大厂面试题 1:阿里巴巴Java面试题 2:阿里云Java面试题-实习生岗 3:腾讯Java面试题-高级 4:字节跳动Java面试题 5:字节跳动Java面试题-大数据方向 6:百度Java面试题 7:蚂蚁金服Java面试题-中级 8:蚂蚁金服Java面试题-高级 9:京东Java面试题-中级 10:拼多多Java面试题-电商部 11:商汤科技Java面试题 12:中软国际Java面试题-初级 13:唯品会Java面试题 14:携程Java面试题-高级 15:软通动力Java面试题 Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。 JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。 具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。 == 和 equals 的区别是什么? 「== 解读」

springBoot整合spring security+JWT实现单点登录与权限管理前后端分离

在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与权限管理。 本文涉及的权限管理模型是基于资源的动态权限管理。数据库设计的表有 user 、role、user_role、permission、role_permission。 单点登录当中,关于访问者信息的存储有多种解决方案。如将其以key-value的形式存储于redis数据库中,访问者令牌中存放key。校验用户身份时,凭借访问者令牌中的key去redis中找value,没找到则返回“令牌已过期”,让访问者去(重新)认证。本文中的demo,是将访问者信息加密后存于token中返回给访问者,访问者携带令牌去访问服务时,服务提供者直接解密校验token即可。两种实现各有优缺点。大家也可以尝试着将本文中的demo的访问者信息存储改造成存在redis中的方式。文末提供完整的代码及sql脚本下载地址。 在进入正式步骤之前,我们需要了解以下知识点。 单点登录SSO 单点登录也称分布式认证,指的是在有多个系统的项目中,用户经过一次认证,即可访问该项目下彼此相互信任的系统。 单点登录流程 给大家画了个流程图 关于JWT jwt,全称JSON Web Token,是一款出色的分布式身份校验方案。 jwt由三个部分组成 头部:主要设置一些规范信息,签名部分的编码格式就在头部中声明。有效载荷:token中存放有效信息的部分,比如用户名,用户角色,过期时间等,但不适合放诸如密码等敏感数据,会造成泄露。签名:将头部与载荷分别采用base64编码后,用“.”相连,再加入盐,最后使用头部声明的编码类型进行编码,就得到了签名。 jwt生成的Token安全性分析 想要使得token不被伪造,就要确保签名不被篡改。然而,其签名的头部和有效载荷使用base64编码,这与明文无异。因此,我们只能在盐上做手脚了。我们对盐进行非对称加密后,在将token发放给用户。 RSA非对称加密 基本原理:同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端 。 公钥加密:只有私钥才能解密 私钥加密:私钥或者公钥都能解密 优缺点: 优点:安全、难以破解 缺点:耗时,但是为了安全,这是可以接受的 SpringSecurity+JWT+RSA分布式认证思路分析 通过之前的学习,我们知道了spring security主要是基于过滤器链来做认证的,因此,如何打造我们的单点登录,突破口就在于spring security中的认证过滤器。 用户认证 在分布式项目当中,现在大多数都是前后端分离架构设计的,因此,我们需要能够接收POST请求的认证参数,而不是传统的表单提交。因此,我们需要修改修 改UsernamePasswordAuthenticationFilter过滤器中attemptAuthentication方法,让其能够接收请求体。 关于spring security的认证流程分析,大家可以参考我上一篇文章《Spring Security认证流程分析--练气后期》。 另外,默认情况下,successfulAuthentication 方法在通过认证后,直接将认证信息放到服务器的session当中就ok了。而我们分布式应用当中,前后端分离,禁用了session。因此,我们需要在认证通过后生成token(载荷内具有验证用户身份必要的信息)返回给用户。 身份校验 默认情况下,BasicAuthenticationFilter过滤器中doFilterInternal方法校验用户是否登录,就是看session中是否有用户信息。在分布式应用当中,我们要修改为,验证用户携带的token是否合法,并解析出用户信息,交给SpringSecurity,以便于后续的授权功能可以正常使用。 实现步骤 (默认大家一已经创建好了数据库) 第一步:创建一个springBoot的project 这个父工程主要做依赖的版本管理。 其pom.xml文件如下 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <modules> <module>common</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <packaging>pom</packaging> <groupId>pers.

关于Maven配置出现的问题

问题一: 乱码与jdk版本问题 解决方案: 在settings.xml配置文件内设置全局jdk和编码类型 注意在<profiles>内添加如下代码 <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </profile> 问题二: Test单元测试打印乱码问题 解决方案: 在设置内设置编码格式 第一步: 进入设置页面 第二步 设置编码类型 -Dfile.encoding=GBK 问题解决 问题三: 新建项目需要重新设置maven问题 解决方案: 在设置内修改默认目录为maven目录 第一步 第二步 第三步 第四步 第五步 第六步 设置自己的maven相关信息 问题四: idea无法识别本地仓库 注意本地仓库的存放位置 与maven目录分开放, 问题解决

ES 如何实现向量搜索【以图搜图/语义搜索】

ES 如何实现向量搜索 在 ES 的使用过程中,通过设置分词器可以灵活地按照文本字面实现搜索和查询。但是在某些场景下,向量搜索非常有必要,比如 CV 方面的以图搜图和 NLP 领域的语义搜索。较新的 ES 版本支持稠密向量搜索,详情如下。相关片段设置重在强调特定的关键点,需要根据自己具体使用的工具或方式进行改动或设置。 设置 mappings 此处重点就是 “dense_vector” 的 type 设置,"dims"设置为具体的向量长度。 { "mappings": { "properties": { "entity_name": { "type": "keyword" }, "entity_name_embedding":{ # 此处为 mappings 中关于稠密向量设置的重点 "type": "dense_vector", "dims": 768 } } } } 新建 index 按照前面设置的 mappings 创建 index。 导入数据 以 BERT 预训练模型 [CLS] 位置的输出 768 维度的 embedding 为例,上传一维数组即可(python 中),但是长度必须严格和 mappings 中保持一致。 查询体 query body { "query": { # 通过 script score 来自定义查询的分值计算 "

C++-vector:vector中查找元素的下标

1、第一种 方法 auto it = find(a.begin(),a.end(),10); int index = it - a.begin(); 在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置 2、第二种 方法 int index = std::distance(std::begin(v),x);//x为要查找的数 3、第三种 方法 用第一个元素地址减去查找元素地址 vector<int> v; v.push_back(10); v.push_back(2); v.push_back(5); vector<int>::iterator it =find(v.begin(),v.end(),5); ///it 在这里时返回了5(值)的指针,而不是其下标,即其地址 printf("%d",*it);//可以输出5(值); vector<int>::iterator is =find(v.begin(),v.end(),10); ///因为其值的地址都是连续的所以可以用这个数在vector中的地址减去第一个数的地址 printf("%d",is-it); int index = is-it; printf("%d",v[index]); C++vector 迭代器查找元素返回下标_WGS.的博客-CSDN博客_vector返回下标 获取vector数组元素的下标的方法_发如雪Jay的博客-CSDN博客_vector查找元素下标 

c#计算器

基于winform 开发的简单计算器 直接放窗体的逻辑代码 ,就一个textbox空间 其他都是button空件,UI自己,然后参照逻辑代码实现事件,即可得到上图程序 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); firstInput = true; } decimal prv=0;//记数 bool firstInput = true;//记录第一次输入 char fu;//判断最后输入的运算符 private bool pan2(string test) { //判断前一个是否也是运算符 if(pan(test))return true; else return false; } private void panInputTail(char test) { //判断最后输入的运算符 比执行最后运算 switch (test) { case '+':prv += Convert.

Redis_16_Redis服务器中的数据库(键值对的存放和生存时间的存放)

文章目录 一、前言二、redis服务器中数据库三、从底层原理图讲解redis增删改查操作3.1 添加新键3.2 删除键3.3 更新键3.4 对键取值 四、生存时间在数据库的存储4.1 生存时间的设置与读取4.2 生存时间的底层保存(过期字典) 五、尾声 一、前言 Redis是一种基于键值对的非关系型数据库(ps: mongdb也是一种基于键值对的非关系型数据库),有五种基本类型,每一种的都是 key-value 键值对,本文介绍Redis服务端的数据库,说一下这些 key-value 键值对是如何在redis底层存放的。 1、redis的键值对在数据库中如何存放的,如何完成增删查改的。 2、redis的键值对的过期时间/生存时间ttl在数据库中如何存放的。 二、redis服务器中数据库 让我们来见识一下redis中的数据库结构,看一下这些 key-value 是如何在redis底层存放的。 struct redisServer{ // ... //一个数组,保存着服务器中的所有数据库 redisDb *db; //服务器的数据库数量 int dbnum; // ... }; 对于上述代码和示意图的解释是:Redis服务器将所有数据库都保存在服务器状态redis.h/ redisServer结构的db数组中,db数组的每个项都是一个 redis.h/redisDb结构,每个 redisDb结构(即代码中的redisDb *db)代表一个数据库,同时,程序会根据服务器状态的donum属性(即代码中的int dbnum)来决定应该创建多少个数据库。num属性的值由服务器配置的 database选项决定,默认情况下,该选项的值为16,所以 Redis服务器默认会创建16个数据库: 切换数据库:对于redis默认的16个数据库(db0-db15),在操作的时候可以选择将数据(五种类型均可)存放在哪个数据库中,只要将某个数据库设置成当前数据库就好(select 数目),宏观命令如下: 底层变化: 三、从底层原理图讲解redis增删改查操作 Redis是一个键值对(key- value pair)数据库服务器,服务器中的每个数据库都由一个 redis.h/ redisDb结构表示,其中, redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间( key space): 键空间和用户所见的数据库是直接对应的: 1)键空间的键也就是数据库的键,每个键都是一个字符串对象; 2)键空间的值也就是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象集合对象和有序集合对象中的任意一种Redis对象。 如图: 对于上图解释:redisDb即表示redis服务器中的数据库,里面有一个dict字典,里面存放数据实体(即key-value键值对),这里有三个key-value键值对,分别是 (key,value)=(“alpha”,“a b c”)为ListObjet类型, (key,value)=(“book”,“<name,Redis in Action><author,Josiah L.Carlson><publisher,Manning>”)为HashObject类型, (key,value)=(“alpha”,“hello world”)为StringObject类型

【Hadoop】在云服务器上部署Hadoop2.7.1伪分布式集群

文章目录 一、准备Hadoop压缩包并安装1、安装Hadoop(1)准备好hadoop压缩包(2)安装hadoop(3)查看是否安装成功 2、将hadoop添加到环境变量(1)在文件末尾添加以下内容(2)保存文件,刷新配置 二、伪分布式配置文件设置1、修改 `hadoop-env.sh`2、修改`core-site.xml`3、修改`hdfs-site.xml`4、拷贝`mapred-site.xml.template`文件内容并命名为`mapred-site.xml `5、修改`mapred-site.xml`6、修改 `yarn-site.xml` 三、启动Hadoop集群1、关闭防火墙2、格式化HDFS(namenode)第一次使用时要格式化3、启动HDFS4、启动YARN5、访问HDFS的WEB管理页面6、访问YARN的WEB管理页面7、停止HDFS和YARN服务 四、遇到问题NameNode启动报错:Cannot assign requested address重新格式化HDFS(1)删除残留文件(2)手动创建配置文件(3)重新格式化 我用到的资源 华为云轻量服务器一台 CentOS8JDK1.8Haddop-2.7.1.tar.gzSecureCRT(用来远程连接) 一、准备Hadoop压缩包并安装 1、安装Hadoop (1)准备好hadoop压缩包 (2)安装hadoop tar -zxvf hadoop-2.7.1.tar.gz -C /usr/local # 将hadoop安装到/usr/local目录下 (3)查看是否安装成功 /usr/local/hadoop-2.7.1/bin/hadoop version # 因为没有设置软链接,所以只能通过bin来查看 Hadoop 2.7.1 Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 15ecc87ccf4a0228f35af08fc56de536e6ce657a Compiled by jenkins on 2015-06-29T06:04Z Compiled with protoc 2.5.0 From source with checksum fc0a1a23fc1868e4d5ee7fa2b28a58a This command was run using /usr/local/hadoop-2.7.1/share/hadoop/common/hadoop-common-2.7.1.jar 2、将hadoop添加到环境变量 vim /etc/profile (1)在文件末尾添加以下内容 export HADOOP_HOME=/usr/local/hadoop-2.7.1 # PATH在安装jdk时已经设置,这里需要添加上HADOOP的路径 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin (2)保存文件,刷新配置 # 刷新配置文件 source /etc/profile # 测试是否生效 hadoop version 二、伪分布式配置文件设置 先进入haoop的配置文件目录

springboot 整合微信 APP支付

最近搞了个团油的项目,还是一个星期就干出来的项目,其中的事情就不多说了,过来人都知道。在这里介绍一下微信的APP支付吧 首先第一步,从网上找到微信的开发文档,看看你是哪种支付,是哪种支付就点哪种支付。我是APP支付就演示这个了。 到了这里 我建议开发者先去把业务流程仔细看一遍,知道我们后台要干啥,前台要干啥。(其实方便甩锅) 这里我就不再上业务流程的图了,直接说API 我没有做退款功能,只有支付功能,但是后台其实只用到了统一下单这个接口,让我们看一下需要哪些必填参数 微信后台可以直接给我们的有3个必填的参数,也是最重要的3个参数 应用id(APP_ID),商户号(MCH_ID),应用对应的秘钥(APP_KEY) 这3个参数可以从微信的商户平台取,我自己没有就不演示了 在这里上代码 我的配置类,涉及隐私的地方,我用*代替 package com.thundersdata.backend.basic.configure; import com.github.wxpay.sdk.WXPayConfig; import org.apache.poi.util.IOUtils; import java.io.InputStream; /** * @Author: wrc * @Classname MyWxpayConfig * @Description TODO * @Date 2020/5/28 13:38 * @Created wrc */ public class MyWxpayConfig implements WXPayConfig { private byte [] certData; public MyWxpayConfig() throws Exception{ InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/apiclient_cert.p12"); this.certData = IOUtils.toByteArray(certStream); certStream.close(); } /** * 微信开发平台应用ID, 从微信商户取 */ public static final String APP_ID = "

springboot集成微信app支付

一、准备工作(以下信息需要自行开通和申请): public static final String APP_ID = "";//app的id 需要app应用 public static final String KEY = "";//api密钥 商户账户信息里面去获取 public static final String MCH_ID = "";//商户的id,需要开通商户 maven项目添加依赖: <!-- 微信支付 --> <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency> 二、开发流程: 整个流程我们只需要两个接口即可: 1.微信支付的统一下单接口(本地项目请求微信): URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder 2.微信支付后的通知接口,是我们向外提供的(微信请求本地项目):接口地址自行定义 三、代码:我使用的springboot restful接口方式,详解请看注释 service层: import java.util.Map; public interface WeixinService { /** * * @方法名称 payBack * @功能描述 <pre>回调接口</pre> * @创建时间 2020年5月22日 下午12:50:15 * @param resXml * @return */ String payBack(String resXml); /**

第10章综合案例1广电大数据分析

第10章综合案例1广电大数据分析 实验目的及要求 (1)现有用户观看历史和用户信息两个广电大数据文件,将对用户数据进行大数据分析。 实验系统环境及版本 Linux Ubuntu 20.04 JDK1.8 Hadoop3.1.0 MySQL8.0.28 Hive3.1.2 实验任务 基本信息查询; 单个用户观看市场Top20; 用户观看时长Top20; 电视观看数Top20; 电视观看时长Top20; 用户正常状态及数量。 实验内容及步骤 1.创建存储格式为TextFile的表text_see和text_user(用于存储原始数据)。 观看历史表text_see: hive> create table text_see( > phone_no string, > duration int, > station_name string, > origin_time string, > end_time string, > res_name string, > owner_code string, > owner_name string, > category_name string, > res_type string, > vod_title string, > program_title string, > day string, > origin_time1 string, > end_time1 string,

vue3自动按需导入 unplugin-auto-import

第一步: npm i unplugin-auto-import -D 或者 yarn add unplugin-auto-import -D 第二步: 修改vite.config.js的配置文件(Ts配置方法) 1): 将第二步中的代码 enable:false 在src的同级新建一个目录 types 2): 运行项目 npm run dev 在types文件夹中生成一个文件 auto-imports.d.ts 3): 将第二步中enable:true 最后再重新运行项目 import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // 导入自动装配插件 import AutoImport from 'unplugin-auto-import/vite' // https://vitejs.dev/config/ export default defineConfig({ plugins: [ vue(), // 配置自动装载配置 AutoImport({ // 生成配置文件,如果是ts项目,通常我们会把声明文件放在根目录/types中,注意,这个文件夹需要先建好,否则可能导致等下无法往里生成auto-imports.d.ts文件 dts: 'types/auto-imports.d.ts', imports: ['vue', 'vue-router'], eslintrc: { // 默认false, true启用。生成一次就可以, // 避免每次工程启动都生成, // 一旦生成配置文件之后,最好把enable关掉,即改成false。 // 否则这个文件每次会在重新加载的时候重新生成,这会导致eslint有时会找不到这个文件。当需要更新配置文件的时候,再重新打开 enabled: true, // 生成json文件,可以不配置该项,默认就是将生成在根目录 filepath: '.

最新版Photoshop 2023(ps2023)特色功能有哪些?

​Photoshop 2023是一款图像处理软件,该版本已经更新到ps 2023版!最新的ps 2023中文版帮助你组合、修饰和重新混合您的照片,为您的旧黑白添加新颜色,让不需要的东西消失,或者将无聊的背景变成异国情调。 ps 2022中文版功能特色 让创意成为您的事业。 Chinzalée Sonami 是一位陶瓷艺术家,她在她的工作室、网上商店和全国各地的小商店出售她的彩色陶器。她使用 Photoshop 设计海报、传单、小册子、广告等来宣传她的业务。 修饰和重新混合您的照片。 Tropico Photo studio 背后的二人组 Forrest Aguar 和 Michelle Norris 使用 Photoshop 技术、创造性的色彩组合和尺寸将他们明亮的天堂版本带到任何地方。 Instagram 华丽图形的首选。 Nice Day Chinese Takeout 使用 Photoshop 为他们受欢迎的纽约外卖餐厅创建令人垂涎的社交帖子和滚动停止图形。 建立追随者和品牌。 Meg Lewis 使用 Photoshop 设计虚拟背景和图形,以展示她在社交上的多彩风格并建立她的个人品牌。 发现自己的艺术风格。 设计师和插画家 Aries Moross 使用 Photoshop 画笔进行绘画和绘画,将字母转化为个人艺术表达。 ps 2023系统要求 • macOS 11 或更高版本 • Apple Silicon 或 Intel Core 处理器

MySql对统计多个维度

数据准备 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `STU_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `STU_NAME` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学生姓名', `STU_AGE` int(11) NULL DEFAULT NULL COMMENT '学生年龄', `STU_ADDRESS` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学生地址', PRIMARY KEY (`STU_ID`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES (1, '李华', 23, '江西'); INSERT INTO `student` VALUES (2, '张三', 23, '广东'); INSERT INTO `student` VALUES (3, '李四', 24, '浙江'); INSERT INTO `student` VALUES (4, '王五', 22, '浙江'); INSERT INTO `student` VALUES (5, '赵六', 24, '福建'); INSERT INTO `student` VALUES (6, '张三', 24, '浙江'); SET FOREIGN_KEY_CHECKS = 1; 提出问题 平时开发中经常会遇到求总数的情况,mysql的count()函数能很好的解决我们的需求,例如查询姓名叫张三的总人数 select count() from student where stu_name = '张三' 现在改变上述需求,查询出姓名叫张三的总人数、地址为浙江的总人数、年龄为23的总人数。

如何在一台电脑上安装两个mysql

前言 现在网上大部分说的都是解压版的mysql,安装第二个mysql的时候,需要改大量的配置文件,环境变量之类的,这样操作总感觉不是很正规。 这篇文章介绍的是安装版的mysql,也就是说,之前用安装包安装了一个mysql,现在再用新版本的安装包安装新的mysql。 实际上也推荐使用安装版的mysql,安装版的有以下几点好处 安装时即可自定义软件安装路径及数据存储路径安装第二个mysql时不需要改配置文件、环境变量安装完软件后安装包还有用,可以很方便的升级软件版本、调整端口等,还有一些其它复杂操作 就比如改端口,安装第二个mysql时很可能会将第一个mysql的端口号改掉,如果采用安装包安装的mysql,那么改端口会变得非常的简单 安装第一个mysql 下载安装包,进行软件安装,注意软件的安装路径及数据的存储路径,可参考:https://blog.csdn.net/shuair/article/details/104603820 安装第二个mysql 与安装第一个mysql一样,下载安装包,进行软件安装,不过此时,运行安装包时,可能并不是安装的界面,可能是对第一个mysql升级的界面,点取消即可,最后会出现下面的界面 此时点击Add...(标记为1的位置)即可安装第二个mysql了 注意事项 两个mysql的服务名称及端口号要保证不同,软件安装路径及数据存储路径也要保证不同。 端口调整 如果需要改的端口号,可以运行安装包,进入到上图的界面,找到Quick Action列,点击对应版本mysql的Reconfigure(标记为2的位置)即可调整端口 细节:如果旧端口被占用(比如服务停掉后,端口被别的服务使用了),此时是修改不成功的,可以先将占用端口的服务停掉再进行端口修改(保证当前服务可以先使用一下旧端口)