同步锁:
java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。
java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,知道线程B释放这个锁,如果B线程不释放这个锁,那么A线程将永远等待下去。(目的:只有一个线程可执行)
两者区别:
1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;
2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
7.最重要的是Lock是一个接口,而synchronized是一个关键字,synchronized放弃锁只有两种情况:①线程执行完了同步代码块的内容②发生异常;而lock不同,它可以设定超时时间,也就是说他可以在获取锁时便设定超时时间,如果在你设定的时间内它还没有获取到锁,那么它会放弃获取锁然后响应放弃操作。
synchronized关键字的用法示例:分别分析这两种用法在对象锁和类锁上的效果。
对象锁的synchronized修饰方法和代码块:
public class TestSynchronized { public void test1() { synchronized(this) { int i = 5; while( i-- > 0) { System.out.println(Thread.currentThread().getName() + " : " + i); try { Thread.sleep(500); } catch (InterruptedException ie) { } } } } public synchronized void test2() { int i = 5; while( i-- > 0) { System.out.println(Thread.currentThread().getName() + "
一、问题描述 git 操作远程仓库代码时,出现如下错误:
Authentication failed for 'http://example.git/' 二、错误原因 出现这种问题可能有以下几点:
git的密码输入错误或密码修改后没有及时更新;
git的账户被锁定。这个也是本人出错的原因,这儿跟大家分享一下解决方法。
三、解决 1、如果是第一条原因引起的,则:在控制面板的凭据管理器中找到windows凭据,将git的密码修改成已经改过的新密码,或直接删除(下次操作时会要求重新输入账号和密码)。如下:
2、如果是第二条原因引起的,找相关人员解锁账户即可。
系列文章 Git专栏 Git使用(一):安装与配置
Git使用(二):创建项目并提交到远程仓库
Git使用(三):分支管理,创建分支、合并分支、合并分支的某一次提交等
Git使用(四):提交管理,修改提交信息、合并多次提交、版本回退、撤销本地文件修改等
Git使用(五):解决冲突以及如何避免冲突
SmartGit 安装及使用(一):安装及配置
SmartGit 安装及使用(二):工作界面介绍、提交代码以及防止代码冲突等操作
SmartGit 安装及使用(三):修改提交记录、合并多次提交、撤销本地文件修改、版本回退等操作
SmartGit 安装及使用(四):创建、合并分支、合并某一次提交以及解决冲突等操作
SmartGit 安装及使用(附录):注册非商业许可证
【Git】如何生成SSH key
【Git】.gitignore文件语法以及修改后无效的解决办法
【Git】Authentication failed for 错误解决
【Git】SSL certificate problem: unable to get local issuer certificate错误的解决办法
【Git】error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR
1.关于表
表示数据库存储数据的基本单位。一个表可以包含若干个字段或者是记录。表的操作包括创建表、修改表、删除表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性约束的过程。
1.创建表:
数据表属于数据库,在创建数据表之前,应该使用“USE <数据库名>”移动到指定的数据库下。
如果没有选择数据库,创建表时会报错;
创建表的语法:
CREATE TABLE table_name
(
字段1 数据类型 [完整性约束条件],
字段2 数据类型 [完整性约束条件],
…
);
mysql> create table hahaha //创建表
-> (
-> id INT(10),
-> name VARCHAR(25),
-> sex VARCHAR(10)
-> );
mysql> show tables; //查看表
±-------------+
| Tables_in_hy |
±-------------+
| hahaha |
±-------------+
mysql> desc hahaha; //查看表的结构
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
1、检查SSH keys是否存在 在命令行中输入:
ls -al ~/.ssh 如果有文件 id_rsa 和 id_rsa.pub ,则直接进入步骤3将SSH key添加到GitHub中,否则进入第二步生成SSH key。
2、生成新的ssh key 在命令行中输入:
ssh-keygen -t rsa -C "email@example.com" 默认会在(/home_path)路径下生成 id_rsa 和 id_rsa.pub 两个文件,如下:
3、将ssh key添加到GitHub中 用编辑器(或用 vim命令 )打开 id_rsa.pub 文件,然后将里面的信息制到 GitHub 的 Add SSH key 页面即可。
系列文章 Git专栏 Git使用(一):安装与配置
Git使用(二):创建项目并提交到远程仓库
Git使用(三):分支管理,创建分支、合并分支、合并分支的某一次提交等
Git使用(四):提交管理,修改提交信息、合并多次提交、版本回退、撤销本地文件修改等
Git使用(五):解决冲突以及如何避免冲突
SmartGit 安装及使用(一):安装及配置
SmartGit 安装及使用(二):工作界面介绍、提交代码以及防止代码冲突等操作
SmartGit 安装及使用(三):修改提交记录、合并多次提交、撤销本地文件修改、版本回退等操作
SmartGit 安装及使用(四):创建、合并分支、合并某一次提交以及解决冲突等操作
SmartGit 安装及使用(附录):注册非商业许可证
【Git】如何生成SSH key
【Git】.gitignore文件语法以及修改后无效的解决办法
【Git】Authentication failed for 错误解决
【Git】SSL certificate problem: unable to get local issuer certificate错误的解决办法
当我敲完随机森林的代码然后运行时出现如下balabala一堆东西:
D:\anaconda\envs\anaconda3\lib\site-packages\sklearn\model_selection\_validation.py:515:
DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples,), for example using ravel().
estimator.fit(X_train, y_train, **fit_params)
后来发现是做标签的时候出问题了,原本做标签的代码是这样:
def Label(a,b): label = [] for i in range(a): if i1 < b: label.append(1) else: label.append(0) label = np.array(label).reshape(a,1) return (label) 我给样本做标签时多敲了一段代码,将这段代码直接zhus注释掉就行了
https://www.jianshu.com/p/722bb3cab5ff
docker swarm leave --force
[root@bogon ~]# docker swarm init --advertise-addr 192.168.56.104
Error response from daemon: This node is already part of a swarm. Use “docker swarm leave” to leave this swarm and join another one.
加入集群的时候报错,可以尝试,强制离开集群。
docker swarm leave --force
iOS开发检测是否关闭了某个APP的蜂窝移动网络
//https://www.jianshu.com/p/e48d3e438377保活
1.判断开启蜂窝
方法1:(APP启动时就开始监听) CTCellularData *cellularData = [[CTCellularData alloc] init]; // 状态发生变化时调用 cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState restrictedState) { switch (restrictedState) { case kCTCellularDataRestrictedStateUnknown: NSLog(@"蜂窝移动网络状态:未知"); break; case kCTCellularDataRestricted: NSLog(@"蜂窝移动网络状态:关闭"); break; case kCTCellularDataNotRestricted: NSLog(@"蜂窝移动网络状态:开启"); break; default: break; } }; // 方法2:(在需要用到的地方获取) #pragma mark 获取蜂窝移动数据限制状态 /* kCTCellularDataRestrictedStateUnknown, // 未知 kCTCellularDataRestricted, // 关闭 kCTCellularDataNotRestricted // 开启 */ + (CTCellularDataRestrictedState)getCellularDataRestrictionState { CTCellularData *cellularData = [[CTCellularData alloc] init]; CTCellularDataRestrictedState restrictedState = cellularData.restrictedState; return restrictedState; } //两种方法的比较 //方法1:蜂窝移动数据状态发生变化时会触发这个方法。关闭时状态为kCTCellularDataRestricted,开始时状态为kCTCellularDataNotRestricted。这里有一点要注意:测试时发现,当改变其他应用的蜂窝移动数据状态时,也会触发这个应用的此方法。 //方法2:无论此应用的蜂窝移动数据是开启或关闭状态,此方法获取到的状态一直是 //说明:此方法只是用于获取某个应用的蜂窝移动数据的开启/关闭状态,与是否连接WiFi无关。 判断设备WiFi是否打开
面试题66. 构建乘积数组 题目描述:
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1], 其中B中的元素 B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 (注意:规定 B[0]= A[1] * A[2] * ... * A[n-1], B[n-1] = A[0] * A[1] * ... * A[n-2];) 解题思路:
//B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1] //从左到右算 B[i]=A[0]*A[1]*...*A[i-1] //从右到左算B[i]*=A[i+1]*...*A[n-1] class Solution { public: vector<int> multiply(const vector<int>& A) { int n=A.size(); vector<int> b(n); int ret=1; for(int i=0;i<n;ret*=A[i++]){ b[i]=ret; } ret=1; for(int i=n-1;i>=0;ret*=A[i--]){ b[i]*=ret; } return b; } }; 面试题67. 把字符串转换成整数 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0.
输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 解题思路:
**题目描述
生成一个整型元素的动态数组,依次添加10个[0-100]的整型随机数。
输出这个动态数组,和其中的最大值。
【知识点:ArrayList类的使用,随机数的使用】
输入描述
无
输出描述
分两行分别输出这个动态数组,和其中的最大值。
输入样例
无
输出样例
生成的动态数组为: [43, 39, 20, 40, 81, 89, 16, 96, 93, 81]
动态数组中最大值为: 96
**
import java.util.*; public class Main { public static void main(String []args) { ArrayList a1=new ArrayList();//创建一个ArrayList实例 for(int i=0;i<10;i++) { double d=Math.random()*(100-1+1)+1; a1.add((int)d); } int max=(int)a1.get(0); for(int i=0;i<a1.size();i++) { if(max<(int)a1.get(i)) { max=(int)a1.get(i); } } System.out.println("生成的动态数组为: "+a1); System.out.println("动态数组中最大值为: "+max); } }
**题目描述
随机生成100个0-1000之间的整数,并按照从小到大的顺序排序显示,排序算法自选。
输入描述
无
输出描述
按每行10个数据输出显示
输入样例
无
输出样例
无
**
public class Main { public static void main(String []args) { int a[]=new int[100]; int temp; for(int i=0;i<100;i++) { final double d = Math.random()*1000; final int c = (int)(d*100); a[i]=c; } for(int i=0;i<100;i++) { for(int j=i;j<100;j++) { if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(int i=0;i<100;i++) { System.out.printf("%d ",a[i]); if((i+1)%10==0) System.out.println(); } } }
**题目描述
编写一个程序,用于计算体质指数BMI,并打印结果。
BMI = 体重(kg)除以身高(m)的平方
BMI结果:
偏瘦:<18.5
正常:< 25
偏胖:< 28
肥胖:>=28
输入描述
输入身高 体重值
输出描述
输出体质指数BMI
输入样例
75 1.72
输出样例
您的体重偏胖!
**
import java.util.*; public class Main { public static void main(String []args) { Scanner input=new Scanner(System.in); float g=input.nextFloat(); float h=input.nextFloat(); if((g/Math.pow(h, 2))<18.5) System.out.println("您的体重偏瘦!"); else if((g/Math.pow(h, 2))>=18.5&&(g/Math.pow(h, 2))<25) System.out.println("您的体重正常!"); else if((g/Math.pow(h, 2))>=25&&(g/Math.pow(h, 2))<28) System.out.println("您的体重偏胖!"); else if((g/Math.pow(h, 2))>=28) System.out.println("您的体重肥胖!"); input.close(); } }
**题目描述
一弹跳小球从120米高度自由落下,每次落地后反跳回原高度的一半;计算n次落地经过的路线总长度和下次反弹的高度。
输入描述
输入第几次落下
输出描述
输出经过的路线总长度和下次反弹的高度。
(中文冒号,数据保留两位小数)
输入样例
5
输出样例
总运动距离为:345.00m
下次反弹高度为:3.75m
**
import java.util.*; public class Main { public static void main(String []args) { float sum=120;//总路程 float s = 120; int a=0; Scanner input=new Scanner(System.in); int n=input.nextInt(); for(int i=1;i<=n-1;i++) { s=(float) (s/2); sum+=s*2; } s=(float) (s/2); System.out.printf("总运动距离为:%.2fm\n",sum); System.out.printf("下次反弹高度为:%.2fm\n", s); } }
最近在刷一些Verilog的题,希望对后续的找工作有所帮助吧。。。
一般而言对于类似多位输出赋值,一般而言是这样的:
wire a[MSB:LSB]; assign a=b[MSB:LSB]; 这里的MSB 和LSB 都需要是常数而不能是变量,那么现实中很有可能需要对变量来进行操作,比如多路选择器等等,那么就可以用到 -:和+:操作符了,具体用法如下:
module top_module( input [1023:0] in, input [7:0] sel, output [3:0] out ); assign out=in[sel*4+3 -:4]; endmodule 来自刷题网站一道题,这里需要根据sel的值来确定选择哪个位段的数据,因为有变量sel,所以不能采用传统的如[sel*4+3:sel*4]这类用法。这里-:4代表数据是4位且是按照[MSB:LSB]格式来的,简单点理解如下:
a=[15-:8]==[15:8] a=[0+:8]==[7:0]
在运行时突然报了这个错
com.intellij.execution.ExecutionException: Cannot load D:\project\refuse_classification_server\target\wx_refuse_classification_server\META-INF\context.xml: D:\project\refuse_classification_server\target\wx_refuse_classification_server\META-INF\context.xml (系统找不到指定的文件。) 试过了网上的一些其他方法,比如clean完再install,重新rebuild都还是不行;
解决方法
在idea里面把原来的tomcat删除,再添加一个新的
Kafka Mirror Maker 是用于在两个集群之间同步数据的工具,原理是从源集群消费消息,然后将消息生产到目标集群中,就是普通是生产者和消费者。只需要在启动 Kafka Mirror Make 时指定一些简单的消费端和生产端配置就可以实现准实时的数据同步。
如图,我们需要将 Cluster1 的数据同步到 Cluster2 中。就需要通过 Kafka Mirror Maker做一个中转站。
上一节中的 Kafka Connect 和 Kafka Mirror Maker的区别在于:Kafka Connect 用于其他数据存储系统与 Kafka 之间的数据复制,而不是 Kafka 与 Kafka 之间的数据复制。
Kafka Mirror Maker 可以在两个不同的数据中心(两个集群位于不同的数据中心)中同步(镜像)数据。我们可以在两个不同的数据中心中部署一个集群,各个数据中心持有集群中的部分 broker 节点,通过将副本分散到不同的数据中心来实现不同数据中心的数据同步。但这样有一个严重的问题,即高延迟,这个问题会严重影响 Kafka 和 ZooKeeper 的性能,还有可能引发严重的异常。
Kafka Mirror Maker的使用具体对应 Kafka 中的 kafka-mirror-maker.sh 脚本。参考上图,我们演示从 Cluster 1 中将主题 topic-mrror 的数据同步打 Cluster 2 中,首先创建两个配置文件,consumer.properties 和 producer.properties 这两个配置文件中的配置对应消费者客户端和生产者客户端的配置,参考如下:
# consumer.properties的配置 bootstrap.servers=cluster1:9092 group.id=groupIdMirror client.id=sourceMirror partition.assignment.strategy=org.apache.kafka.clients.consumer.RoundRobinAssignor # producer.properties的配置 bootstrap.servers=cluster2:9092 client.id=sinkMirror 启动 Kafka Mirror Maker :
冒泡排序(改进) 冒泡排序的排序思路是: 通过无序区的相邻元素的比较和位置的交换,使最大的元素往上移动每一轮排序选出无序区的最大的元素,加入有序区中不止可以得到升序排序,稍微改变下交换逻辑也可以得到降序排序 冒泡排序算法参考我的另一篇博客:链接
冒泡排序存在的问题: 假如我们运气好,用了1轮就已经将整个序列排序好了,整个数列已然是有序的了。可是我们的排序算法仍然“兢兢业业”地继续执行第2轮、第3轮、直至n-1轮,这就很没必要。也就是说如果序列已经有序,每一轮排序还是会继续比较相邻的元素,这就相当于做了一些没用的操作。
冒泡排序改进思路: 这种情况下,如果我们能判断出数列已经有序,并且做出标记,剩下的几轮排序就可以不必执行,提早结束工作。因此我们可以用一个标志变量来标准序列是否有序,当一次冒泡过程中发现没有交换操作时,表明序列已经排好序了,便终止冒泡操作。用一个标志变量 标记在比较过程中是否发生了数据交换。
改进后的冒泡排序的代码实现: #include <stdio.h> /* 冒泡排序的排序思路是: 通过无序区的相邻元素的比较和位置的交换,使最大的元素往上移动 每一轮排序选出无序区的最大的元素,加入有序区中 */ void bubble_sort(int value[],int n) { //n-1轮排序 (排序n-1轮剩下的那个数自然是最小的) for(int i=0; i<n-1; i++) { //使用标志变量判断序列是否有序 bool isSorted = true; //每一轮排序选出无序区的最大的元素,加入有序区中 //循环终止条件是 j<n-i-1 //n代表数组总共有n个数,i表示已经有i个排序好了 //因为每次是和后面的元素比较,所以要 -1 (防止数组越界) for(int j=0; j<n-i-1; j++) { //每一次和后一个元素,进行比较,较大的后移 if( value[j] > value[j+1]) { //交换两个元素的值 int temp = value[j]; value[j] = value[j+1]; value[j+1] = temp; //若是发送交换元素,说明序列还是无序 isSorted = false; } } //如果序列已经有序结束循环 if(isSorted){ break; } } } int main() { int value[] = {8,3,6,2,4,5,7,1,9,0}; printf("
个人原创博客:德鲁大叔撸代码
对zip文件直接进行解析(一条记录对应一行数据)
public void readZipCvsFile(File file) throws Exception { //获得输入流,文件为zip格式, //zip可以包含对个文件,如果只有一个文件,则只解析一个文件的,包含多个文件则分别解析 ZipInputStream in = new ZipInputStream(new FileInputStream(file)); //不解压直接读取,加上gbk解决乱码问题 BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf-8")); ZipEntry zipFile; //循环读取zip中的cvs/txt文件,zip文件名不能包含中文 while ((zipFile=in.getNextEntry())!=null) { //如果是目录,不处理 if (zipFile.isDirectory()){ System.err.println("当前路径为目录:"+zipFile.getName()); } //获得cvs名字 String fileName = zipFile.getName(); //检测文件是否存在 if (fileName != null && fileName.indexOf(".") != -1) { System.out.println("---------------------开始解析文件:"+fileName+"-----------------------------"); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } } //关闭流 br.close(); in.close(); } 测试方法
知识储备 JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。 JSP原理 浏览器将JSP文件发给服务器,服务器将jsp文件翻译成JAVA文件,然后在编译成字节码文件(.class)最后再返回给服务器
然后可以再服务器下的work文件夹下\work\Catalina\localhost找到这个路径,并且打开你项目会有下面的文件
login.jsp.java
login.jsp
JSP语法 JSP模版元素
网页的静态内容。如:html标签和文本。JSP的脚本
2.1、小脚本 <% java代码 %>
2.1、表达式 <%= 2+3 %> 等价于out.print(2+3);
login.jsp:
login.jsp.java:
页面效果:
2.3、声明 <%! %> 表示在类中定义全局成员,和静态块。JSP注释
JSP注释:<%-- 被注释的内容 --%> 特点:安全,省流量
网页注释: 特点:不安全,费流量指令
语法:
<%@ 指令名称 属性1=“属性值1” 属性2=“属性值2”。。。%>
或者:
<%@ 指令名称 属性1=“属性值1”%>
<%@ 指令名称 属性2=“属性值2”%> Page指令 page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。属性:
2.1 import 和java代码中的import是一样的
<%@ page import=“java.util.Date,java.util.List”%>
或者:
<%@ page import=“java.util.Date”%>
<%@ page import=“java.util.List”%>
JSP会自动导入以下的包:
import java.lang.;
import javax.servlet.;
import javax.servlet.http.;
import javax.
百度了半天,给出的方案是
net.ipv4.tcp_fin_timeout = 20 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_tw_buckets = 1000 都不好使,最后同事给一个参数
net.ipv4.tcp_max_tw_buckets = 1000
time_wait立刻降到1000以下,这个参数限制time_wait的最大数量,记录一下
public class JsonUtils { public static String getJson(Object object){ return getJson(object,"yyyy-MM-dd HH:mm:ss"); } public static String getJson(Object object,String dateFormat){ ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false); SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat); mapper.setDateFormat(simpleDateFormat); try { return mapper.writeValueAsString(object); } catch (JsonProcessingException e) { e.printStackTrace(); } return null; } }
首先要有C语言环境 就是安装gcc并添加到系统变量里。windows里并没有自带C语言环境,所以要自己安装。
编译好的同名.exe文件会在源目录下。
1,直接在运行里打入代码 打开notepad++,直接在运行程序名里加入以下一行代码
cmd /k gcc -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" "$(FULL_CURRENT_PATH)" && CLS && "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" & PAUSE & EXIT 然后保存,设置快捷键。运行。
2,利用插件NppExec 安装NppExec,在 notepad+±>插件->管理插件 里
点击Execute像里填入
npp_save cd "$(CURRENT_DIRECTORY)" cmd /c del "$(NAME_PART)".o "$(NAME_PART)".exe *.o gcc -o $(NAME_PART) $(FILE_NAME) npp_run "$(NAME_PART)".exe save保存,后运行
结语 notepad++可以用来做轻量级语言开发是非常方便的,在有相应语言环境下还可以运行很多其他语言。
UUID 简介 UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。
UUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的。UUID可以被任何人独立创建,并按需发布。UUID没有集中管理机构,因为它们是不会被复制的独特标识符。属性协议允许设备使用UUID识别属性类型,从而不需要用读/写请求来识别它们的本地句柄。
作用 UUID 的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。
组成 当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。时钟序列。全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。 UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单地生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。
标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。
在 hibernate(Java orm框架)中, 采用 IP-JVM启动时间-当前时间右移32位-当前时间-内部计数(8-8-4-8-4)来组成UUID。
操作流程 1.启动Hadoop 2.导入相关的jar包 右键项目属性,选择Property,在弹出的对话框左侧列表中选择Java Build Path,如下图所示:选择Add External JARs,就可以逐个(也可以选择多个,但是限制在同一个文件夹中)添加第三方引用jar包。
3.调用Java Api进行编程 3.1检查文件是否存在
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HDFSFileIfExist { public static void main(String[] args){ try{ String fileName = "test"; Configuration conf = new Configuration();//创建环境 conf.set("fs.defaultFS", "hdfs://localhost:9000");//加载环境 conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem"); FileSystem fs = FileSystem.get(conf);//封装DistributedFileSystem对象 if(fs.exists(new Path(fileName))){ //相对路径 System.out.println("文件存在"); }else{ System.out.println("文件不存在"); } }catch (Exception e){ e.printStackTrace(); } } } 2.写操作
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.Path; public class Chapter3 { public static void main(String[] args) { try { Configuration conf = new Configuration(); conf.
XILINX ARTIX-7 FPGA 可以使用GTP 传送最高3G-SDI的信号。本文记录 GTP调用方法,与SDI IP的互联方法等,最后实现1080p60彩条内部产生后经SDI回环后接收,仅适用于ARTIX-7或更高系列。组建工程部分参考赛灵思 xapp1097 实例。
操作概览:
调用GTP IP取出xxx_gt.v和xxx_common.v备用 → 调用3G-SDI IP → 下载 xapp1097.zip → 包装3G-SDI IP → 实现1080p60彩条内部产生后经SDI回环然后接收,使用VIO调试观察接收端锁定情况。
IP说明:
需要调用两个IP:SMPTE SD/HD/3G-SDI 和 7 Series FPGAs Transceivers Wizard(使用GTP)
需要下载一个文件:xapp1097
SDI IP 将使用到顶层和以下所有代码(SDI IP须命名为smpte_sdi),使用xapp1097内模块后 SDI IP被包装成名为a7gtp_sdi_rxtx_wrapper.v 的模块。
GTP IP 使用 xxx_gt.v作为顶层,其内部包含的.v文件也可以从GTP IP示例工程中获得。xxx_common.v可以从GTP IP 示例工程中获得。
1. 新建一个vivado工程,我使用2017.4版本。添加GT IP核 7 Series FPGAs Transceivers Wizard
2. IP核命名为 a7gtp_sdi_wrapper,按照下图设置
3. 翻到第二页,协议必须选择hd sdi,根据xapp1097即使用3g-sdi也必须选择hd sdi。一个GTP收发器使用两个PLL,确保两个PLL都使能,因为最后的应用需要TX端动态切换两个PLL,由于板子上只有148.5Mhz video OSC只能连接到一个时钟源,因此,不支持发送1.485/1.001 Gb/s HD-SDI和2.97/1.001 Gb/s 3G-SDI。但是,接收端因为有CDR unit,只有148.5Mhz晶振也可以接收5种SDI信号。(按照下图连接时钟源后TX端切换PLL并不能改变频率)
Spring Boot Redis 集成 Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer'
一、原因:redis集群环境没有开启Keyspace notifications
二、解决办法 @Configuration public class HttpSessionConfig { /** * 解决redis集群环境没有开启Keyspace notifications导致的 * * Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in class path resource * * */ @Bean public static ConfigureRedisAction configureRedisAction() { return ConfigureRedisAction.NO_OP; } }
df1 = pd.DataFrame([['a', 'b'], ['c', 'd']], index=['row 1', 'row 2'], columns=['col 1', 'col 2']) df1.to_excel("output.xlsx", engine='xlsxwriter') 原因:是没有项目没有默认安装 xlsxwriter库,所以需要自己安装即可;
今天给大家介绍一个python将数据保存为pdf的包:fpdf
安装代码为:pip install fpdf
我是用的是win10上的anaconda的python3.7版本
写一个简单的pdf代码 from fpdf import FPDF pdf = FPDF() #加一页 pdf.add_page() #设置字体的大小和字体 pdf.set_font('Arial', size=15) #加一个单元 pdf.cell(200, 10, txt='hello world', ln=1, align='C') #加一个新的单元格 pdf.cell(200, 10, txt='this is a article.', ln=2, align='C') pdf.output('test.pdf') 改字体 q:有人会问如果我想保存的pdf是A5大小的,怎么办? A: 不用担心,因为这个可以设置, pdf = FPDF(orientation='P', unit='mm', format='A4') 这个包里内置了很多字体:
self.core_fonts={'courier': 'Courier', 'courierB': 'Courier-Bold', 'courierBI': 'Courier-BoldOblique', 'courierI': 'Courier-Oblique', 'helvetica': 'Helvetica', 'helveticaB': 'Helvetica-Bold', 'helveticaBI': 'Helvetica-BoldOblique', 'helveticaI': 'Helvetica-Oblique', 'symbol': 'Symbol', 'times': 'Times-Roman', 'timesB': 'Times-Bold', 'timesBI': 'Times-BoldItalic', 'timesI': 'Times-Italic', 'zapfdingbats': 'ZapfDingbats'} from fpdf import FPDF def change_fonts(): pdf = FPDF() pdf.
安装配置Anaconda 这个我就不自己写了,找了个很详细的Anaconda 的安装教程。
配置Hadoop 我们首先需要下载一个文件,我放到网盘网盘了如下所示。
链接:https://pan.baidu.com/s/1DSzClPJyM5s6MpNx9sv2fA 提取码:pbke 下载解压之后,就可以就配置HADOOP_HOME的环境变量了,我的电脑上是把文件都放在了E盘根目录下。
右键此电脑->属性->点击左边的高级系统设置->环境变量->点击系统变量下的新建。
配置Spark 然后就是配置SPARK_HOME的环境变量了,我的电脑上是吧文件都放在了E盘根目录下。
右键此电脑->属性->点击左边的高级系统设置->环境变量->点击系统变量下的新建。
PyCharm配置 保证anaconda已经安装完成,此时PyCharm中就可以创建conda的虚拟环境了。创建新项目,选Pure Python,然后选择Conda虚拟环境,python版本为3.7,设置名称后点击create。
然后点击左上角的File->settings
点击右边的+号,添加py4j和pyspark以及psutil包,使用搜索栏查到包后点击Install Package即可。
点击下图中的倒三角后选择最后一个Show All…
点击下图标记1对应红色方框中的按钮,再点击标记2对应的新窗口右上角的+号把%SPARK_HOME%\python和%SPARK_HOME%\python\lib\py4j-0.10.8.1-src.zip添加到变量中即可,能看到我是已经添加过的。
测试Pyspark 在pycharm中新建py文件写入代码如下。
from pyspark import SparkContext sc = SparkContext('local') doc = sc.parallelize([['a', 'b', 'c'], ['b', 'd', 'd']]) words = doc.flatMap(lambda d: d).distinct().collect() word_dict = {w: i for w, i in zip(words, range(len(words)))} word_dict_b = sc.broadcast(word_dict) def wordCountPerDoc(d): dict_new = {} wd = word_dict_b.value for w in d: if wd[w] in dict_new: dict_new[wd[w]] += 1 else: dict_new[wd[w]] = 1 return dict_new print(doc.
在《SpringBoot视频教程全家桶》系列教程中,我们分别讲解了StringRedisTemplate和RedisTemplate的使用和区别。
但在实践中,有朋友遇到这样的问题,就是存储到Redis数据取不到值。
两种Template的源码分析 这是为什么呢?是因为他同时使用了StringRedisTemplate和RedisTemplate在Redis中存储和读取数据。它们最重要的一个区别就是默认采用的序列化方式不同(在课程中已经讲到)。这里我们再来回顾一下相关源码,StringRedisTemplate的部分源码如下:
public class StringRedisTemplate extends RedisTemplate<String, String> { /** * Constructs a new <code>StringRedisTemplate</code> instance. {@link #setConnectionFactory(RedisConnectionFactory)} * and {@link #afterPropertiesSet()} still need to be called. */ public StringRedisTemplate() { setKeySerializer(RedisSerializer.string()); setValueSerializer(RedisSerializer.string()); setHashKeySerializer(RedisSerializer.string()); setHashValueSerializer(RedisSerializer.string()); } } 通过该源码我们可以看到StringRedisTemplate采用的是RedisSerializer.string()来序列化Redis中存储数据的Key的。
下面再来看看RedisTemplate中默认采用什么形式来序列化对应的Key。
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware { // 省略其他源码 private @Nullable RedisSerializer<?> defaultSerializer; private @Nullable ClassLoader classLoader; /* * (non-Javadoc) * @see org.springframework.data.redis.core.RedisAccessor#afterPropertiesSet() */ @Override public void afterPropertiesSet() { super.
二、使用petalinux创建工程,生成u-boot,uimage
前面我们已经设置好了硬件资源,并配置了fsbl,现在我们将硬件资源和FSBL放到ubuntu中。
找到项目文件夹
将此文件夹放入ubuntu中,这里建议使用15版本的虚拟机,因为12版本的虚拟机从windows中拷贝文件到ubuntu中会出错、卡死。
进入ubuntu,启动petalinux
source ~/petalinux19.1/settings.sh
创建工程
petalinux-create -t project --template zynq --name csdn_test 将硬件资源导入,配置为工程
petalinux-config --get-hw-description=~/csdn_sys_wrapper_hw_platform_0 运行这条指令后会出现配置画面,你可以进行相关配置,我选择的是默认配置,只是把其中一个分区改打了一些,不改大分区,会导致分区重叠。
将0x20000 改为0x200000
配置完成后,保存(Save)然后退出。就会出现以下画面,代表配置成功。
编译项目
petalinux-build
注意:petalinux-build可能失败,可能是由于一些库没有安装到位,需要添加库,如何添加请看我那篇关于petalinux-build错误的文章。
petalinux-build的时间比较长,成功后会出现几个文件夹,如下图所示:
进入images文件夹,进入Linux文件夹,可以看到相关文件
现在我们将在SDK中生成的csdn_fsbl.elf 文件放到这个文件夹中
通过petalinux-package --boot --fsbl <FSBL image> --fpga <FPGA bitstream> --u-boot --kernel 命令可以生成BOOT.BIN文件,后面的–kernel表示生成的这个BOOT.BIN已经包含了uimage,可以直接启动系统。
将生成的BOOT.BIN复制到windows下,顺便把csdn_fsbl.elf文件也一起复制过去。
回到我们的SDK软件,准备开始烧写。
1、进入xilinx-----> Program FPGA
将FPGA文件烧录进去
2、进入xilinx-----> Program Flash 烧录BOOT.BIN 和csdn_fsbl.elf
烧录完成后,重启开发板,可以看到系统成功启动,并且掉电不会丢失,重启依然存在。
用户名和密码都是 root
概述 maven打包时,遇到奇怪的问题,setting文件指定了远程中央仓库为http://maven.aliyun.com/nexus/content/groups/public,正常情况下,仅当本地仓库没有pom或者jar文件时,才会去远程中央仓库下载。但在实际打包中,本地文件存在,却依旧从远程仓库去下载的问题。问题解决过程记录如下。
问题复述 Maven打包时,报错从远程仓库下载不到依赖文件。报错信息如下:
Could not transfer artifact org.apache.servicecomb:java-chassis-dependencies:pom:1.0.0.B003.47RC from/to nexus-aliyun (http://maven.aliyun.com/nexus/content/groups/public): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 奇怪的是,本地仓库路径下明明有对应的文件,为啥还要去远程仓库找。
解决方案: 将本地仓库对应目录下的_remote.repositories文件删除,然后重新maven clean install。
如果还报错,把lastUpdated文件也删除。
——记录一下发现的几个关于字体的问题以及解决方案。
目录 1.界面字体模糊的问题2.代码中的中文注释显示乱码或显示“??”的问题3.可选字体过少的问题 1.界面字体模糊的问题 Keil软件安装后会有字体模糊不清的问题,这个问题也普遍存在与其他软件,解决方法也很简单:右键属性-兼容性-更改高DPI设置-选中“替代高DPI缩放行为”即可。
引用博主廖BUG仙的文章
https://blog.csdn.net/qq_37416258/article/details/84838450
2.代码中的中文注释显示乱码或显示“??”的问题 在添加中文注释时发现会有中文无法显示的问题,是由于解码造成的,只需将设置-Editor-Encoding中改为Chinese GB2312(Simplified)即可。
更改后效果:
3.可选字体过少的问题 由于软件默认限制了只能选择“monospaced”字体,只需将设置-Editor-最下面的Use monospaced font 去掉勾选即可。
这里我只用到了.asm文件,所以只对一项进行了更改
更改后效果:
微软雅黑等大部分字体已经可以使用
0.前言
随着医疗健康、可穿戴设备的发展,华为、小米、vivo等大厂都在做智能手环、手表等可穿戴设备。未来,蓝牙设备的开发也会越来越多。
关于蓝牙BLE起源发展,各种类型蓝牙芯片介绍,以及蓝牙手环的硬件开发等在之前的文章已经有过详细介绍。
本文主要介绍蓝牙手环开发中,如何构建一个最小的BLE系统框架,以及使用的模块。
总结一句话:能让芯片的蓝牙协议栈跑起来,手机能连接上蓝牙手环设备。
要让蓝牙功能跑起来,需要将注意力放在BLE开发的程序框架和模块的整体功能上,之后再深入学习各个模块。
1.BLE程序框架
智能手环的核心除了各种传感器算法,最重要的就是蓝牙了。一个BLE程序通常至少包含4个必要部分:系统初始化、启动、空闲管理和事件处理。如下图所示。
(1)系统初始化
这个系统初始化看起来很简单,小学生貌似都能懂,不就是初始化系统吗?
的确是初始化系统,那需要初始化什么呢?
a.日志打印初始化:说白了就是为了方便我这种开发狗看上电启动的Log信息以及后续输出调试信息。不是必须的,但很重要。
b.APP定时器初始化:初始化APP定时器,用于实现各种定时任务。很重要。
c.硬件初始化:如指示灯初始化、OLED屏幕初始化、电源管理初始化等。
d.BLE相关初始化:包含蓝牙协议栈初始化、广播、首选连接参数、GAP层、服务等初始化配置。这部分初始化完成后,整个BLE部分的程序就会按照我们自己设置的参数运行。
(2)启动
对于外围设备来说,如手环,启动的是广播,启动之后系统开始按照配置的广播间隔开始发送广播,等待中心设备连接,也就是等待手机连接。
对于中心设备(手机)而言,启动的是扫描,扫描周围的蓝牙设备。
(3)空闲管理
空闲管理说白了就是为了省电,实现低功耗。你戴个手环,总不希望天天充电吧。空闲管理就是在你不看手环时候让手环进入到低功耗模式。若有事件唤醒,如抬手腕亮屏等,就会恢复工作模式。
若程序中启用了日志打印功能,空闲管理还处理挂起的日志信息。
(4)事件处理
应用程序通过注册“事件监听”来监视BLE协议栈事件。开发过Android就比较容易理解,如Button就需要监听,看看Button是否按下等。
蓝牙中如外围设备和中心设备连接后,SoftDevice会提交 “连接事件”,应用程序会在事件处理函数中接收该事件并执行操作。
对于一开始接触蓝牙开发的人而言,看完这些感到一丝丝懵逼也是很正常的。开发过蓝牙的话,这些就很容易理解了。
没关系,下面开始实战。
本次开发选用 Nordic nRF52832蓝牙芯片,相关开发板某宝也有很多卖。关于Nordic芯片之前的文章有过介绍,翻阅历史文章。
2.先看Main函数
Main函数中主要调用各个模块的初始化函数,如硬件初始化、IIC屏幕初始化等,这些模块初始化本文暂不深入,主要是讲蓝牙架构。其中最重要的是蓝牙初始化。
弄懂了蓝牙初始化,蓝牙就能跑起来。
int main(void) { //Log 初始化 APP_ERROR_CHECK(NRF_LOG_INIT(NULL)); NRF_LOG_DEFAULT_BACKENDS_INIT(); NRF_LOG_INFO("log init ok."); NRF_LOG_FLUSH(); //硬件初始化,APP timer,led,power Manager等 my_ble_init_harder(); //twi初始化,iic设备扫描,iic_sacn.c iic_scan_address(); nrf_delay_ms(2000); //蓝牙初始化 my_ble_init(); } //蓝牙初始化函数 void my_ble_init(void) { NRF_LOG_INFO("Hello world BLE developer\n"); NRF_LOG_INFO("BLE Template example:Log use uart as output terminal"
问题: 1、Could not load dynamic library ‘cudart64_100.dll’; dlerror: cudart64_100.dll not found
2、Could not load dynamic library ‘cudart64_101.dll’; dlerror: cudart64_101.dll not found
背景: 安装tensorflow-gpu后,先用cmd命令窗口执行以下:
python
import tensorflow as tf 时出现类似上面的报错。后在PyCharm上直接试tensorflow-gpu是否能用,结果也报了上面的错误。
解决方法: 出现该问题的原因:
tensorflow-gpu的版本和cuda、cudnn版本不兼容问题,导致找不到相对于的文件。
上面两个问题实际上属于同一个问题类型,就是在以下路径中:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin 找不到对应的cudart64_100.dll或者cudart64_101.dll文件。所以,最直接的方法就是去下载缺少的文件,然后把它放在该文件夹就可以啦。
下载文件地址:https://cn.dll-files.com/
在网站中直接搜索对应缺少的文件,例如搜索“cudart64_100.dll”,下载后解压,把.dll文件放在:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin 额。。。如果又出现以下问题:
就不要一个一个下载了,有些文件网站里没有,也就只能老老实实重新安装cuda和cudnn了。这个网站为tensorflow-gpu+cuda+cudnn版本对应要求:
https://tensorflow.google.cn/install/source_windows#gpu
只有按照这个标准才能安装成功。
另外,如果 “pip install tensorflow-gpu==版本号” 出现time out ,可以先挂清华镜像,再下载,速度会快很多。清华镜像:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 顺便总结一下,Windows10安装tensorflow-gpu版本的大致步骤:
Anaconda–>tensorflow-gpu–>cuda–>cudnn–>配置环境变量–>VC–>Pycharm
提到编程语言,我们所了解的也是比较广为人知的一些主流编程语言,如Java、C/C++、Python、PHP等。那除了这些编程语言,你有了解过中文编程语言吗?如果没有,那今天这篇文章就带你简单了解一些有趣的中文编程语言。
1、易语言
易语言可以说是中文编程语言的老大,拥有独立的编译器。易语言并不是把现存的编程工具进行表面汉化而成的,和其他国外语言相比,“易语言"最大的不同是彻底中文化,且拥有自下而上的全部自主知识产权。
易语言的全新版本叫做“易语言.飞扬”,包含垃圾收集机制,是完全面向对象的中文编程语言:
和其他中文编程语言相比,它是最成熟的,而且同时具备了一套完整的开发环境。
2、习语言
习语言即中文版的C语言,由一套完备的编程语法和相配套的工具组成,旨在将计算机及软件编程大众化,普及化,中文化,提高程序的维护性而诞生。
习语言家族:
3、丙正正
丙正正是一个能令人使用中文开发程序的编译器,提出者为魏泽人。它是中文编程语言的尝试。丙正正会将含有中文的原始码变成可被gcc编译的[C+ + ]原始码,并透过宏定义(#define) ,达到完全使用中文开发程序的目的。后期的版本中,编译器gcc及除错器gdb传
回的变量名称,也会被翻成中文,以利于除错。
4、PerlYuYan
PerlYuYan是一个能令人使用中文文言文开发程式Perl程式的Perl模组,由唐凤于2002年一月发表,只花了两个小时就实作完成。它是中文编程语言的尝试。作者利用中文的特质,将许多指令改成以一个中国汉字来表示,因而造成了文言语法的感觉。
5、中蟒
中蟒是一套基于Python即时编译语言的中文编程语言。除了保留字,变量名称可用中文外,很多内建数据类型的操作都可用中文來进行。
6、周蟒
周蟒,又名zhpy,是一个轻量的,与Python 语言互相兼容的中文Python 语言。让使用者可以使 周蟒用纯中文语句(繁体或简体)来编写程式。目前主要适用于教学上。
7、O语言
O语言是一款中文计算机语言( 或称套装) , 包括O汇编语言、O中间语言和O高级语言等,其中窗口设计、界面描述语言、O中间语言 已经能很好的整合在一起。 https://m.weibo.cn/status/4436019342307734
O中间语言可以说是汇编语言的抽象,它和汇编语言-样, 使用单句的语法,除了基本的条件句和函数调用外,基本的一条指令对应一条语句,因此,它比C语言在语法上更低级一些。这样设计的目的是为了保持底层足够大的灵活性,使前端代码比较容易地映射到中间语言。C语言毋庯置疑是很强大, Pascal语言也非常强大,但是你很难将两者代码进行相互转换,如果使用中间语言作为中间层,就能够兼容两者的语法。
8、中文培基
中文培基是Basic语言的中文本地化版本(八十年代初就有了,不可思议吧,可是,第一门中文编程语言其实从七十年代就有了,其平台是DOS 。
其实,中文perl、中文Pascal、 中文Cobol、中文LOGO和中文Basic这些明显的本地化语言都是有的。
我觉得中文编程语言可以按照中文的深度这样两种:
01 本地化其它编程语言。比如上文介绍过的“丙正正”(题外话:为什么叫“丙正正”呢?因为原语言叫“C++”嘛……)。
02 汉语内核语言。包括“易语言”等。这种语言才能说是一门“真正的语言”,要不然只能说是语言+一个汉化包而已……
最后,来看一个轻松一点的。
以上就是对一些中文编程语言的简单介绍,所以以后在看到一些奇怪的编程语言名称,可不要以为是打错字了哦。
1、权限管理的概念 SQL中DCL语句的增删改查与授权就是权限管理。一般的情况下,开发与测试都不会涉及到这方面的操作。通常是由DBA(数据库管理员)操作的,但是咱们必须要了解。MySQL中有mysql库,其中有张user表,这就是存放用户信息的。
2、管理用户 查询用户 -- 1. 切换到mysql数据库 USE myql; -- 2. 查询user表 SELECT * FROM USER; -- 3.Host列表示可以访问的主机,%号就表示可以在任意主机访问 查询用户结果 添加用户 -- 语法: CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; --其中用户名是登录名,主机名是IP地址,并且@左右千万不能有空格,不然会报错 添加用户结果 删除用户 -- 语法: DROP USER '用户名'@'主机名'; 删除用户结果 修改用户密码 -- 修改密码的方法一: UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名'; -- 修改密码的方法二: SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码'); -- 这两个修改的效果是一样的,只是第一种更符合SQL语法规则,第二种是简化方式,看到这里应该都会了,不演示了 小技巧:我忘了root密码怎么办? cmd – > net stop mysql 停止mysql服务(需要管理员运行该cmd)使用无验证方式启动mysql服务: mysqld --skip-grant-tables打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功use mysql;update user set password = password(‘你的新密码’) where user = ‘root’;关闭两个窗口打开任务管理器,手动结束mysqld.
# scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None) # 解释: # fun: 求最小值的目标函数 # x0:变量的初始猜测值,如果有多个变量,需要给每个变量一个初始猜测值。minimize是局部最优的解法 # args:常数值,fun中没有数字,都以变量的形式表示,对于常数项,需要在这里给值 # method:求极值的方法,官方文档给了很多种。一般使用默认 # constraints:约束条件,针对fun中为参数的部分进行约束限制 # 1.计算 1/x+x 的最小值 from scipy.optimize import minimize import numpy as np #计算 1/x+x 的最小值 def fun(args): a=args v=lambda x:a/x[0] +x[0] return v if __name__ == "__main__": args = (1) #a x0 = np.asarray((1.4)) # 初始猜测值 res = minimize(fun(args), x0, method='SLSQP') print(res.fun) print(res.success) print(res.
很多同学会发现,为什么我训练网络的时候loss一直居高不下或者准确度时高时低,震荡趋势,一会到11,一会又0.1,不收敛。 又不知如何解决,博主总结了自己训练经验和看到的一些方法。
首先你要保证训练的次数够多,不要以为一百两百次就会一直loss下降或者准确率一直提高,会有一点震荡的。只要总体收敛就行。若训练次数够多(一般上千次,上万次,或者几十个epoch)没收敛,则试试下面方法:
1. 数据和标签
数据分类标注是否准确?数据是否干净?数据库太小一般不会带来不收敛的问题,只要你一直在train总会收敛(rp问题跑飞了不算)。反而不收敛一般是由于样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题
2. 学习率设定不合理
在自己训练新网络时,可以从0.1开始尝试,如果loss不下降的意思,那就降低,除以10,用0.01尝试,一般来说0.01会收敛,不行的话就用0.001. 学习率设置过大,很容易震荡。不过刚刚开始不建议把学习率设置过小,尤其是在训练的开始阶段。在开始阶段我们不能把学习率设置的太低否则loss不会收敛。我的做法是逐渐尝试,从0.1,0.08,0.06,0.05 ......逐渐减小直到正常为止,
有的时候候学习率太低走不出低估,把冲量提高也是一种方法,适当提高mini-batch值,使其波动不大。,
3.网络设定不合理
如果做很复杂的分类任务,却只用了很浅的网络,可能会导致训练难以收敛,换网络换网络换网络,重要的事情说三遍,或者也可以尝试加深当前网络。
4.数据集label的设置
检查lable是否有错,有的时候图像类别的label设置成1,2,3正确设置应该为0,1,2。
5、改变图片大小
博主看到一篇文章,说改变图片大小可以解决收敛问题,具体博主没试过,只看到有这个方法,具体文章链接:https://blog.csdn.net/Fighting_Dreamer/article/details/71498256
感兴趣的可以去看看。
6、数据归一化
神经网络中对数据进行归一化是不可忽略的步骤,网络能不能正常工作,还得看你有没有做归一化,一般来讲,归一化就是减去数据平均值除以标准差,通常是针对每个输入和输出特征进行归一化
————————————————
版权声明:本文为CSDN博主「搞视觉的张小凡」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/comway_Li/article/details/81878400
几道常见面试题来看 JavaScript 执行机制
前面的话 根据 JavaScript 的运行环境,锁定它为单线程,任务需要排队执行,如果网站资源比较大,这样会导致浏览器加载会很慢,但实际上并没有,大家肯定立刻想到了同步和异步。
所谓的同步和异步也是在排队,只是排队的地方不同。
同步和异步 同步任务进入主线程排队,异步任务进入事件队列中排队
同步任务和异步任务进入到不同的队列中,也就是上面讲的在不同地方排队。
同步任务进入主线程,异步任务进入事件队列,主线程任务执行完毕,事件队列中有等待执行的任务进入主线程执行,直到事件队列中任务全部执行完毕。
开胃菜 console.log('a') setTimeout(function(){ console.log('b') }, 200) setTimeout(function(){ console.log('c') }, 0) console.log('d') 结果:a d c b
从上到下,该进入主线程的进入主线程,该进入事件队列的进入事件队列。
那么主线程中存在 console.log('a') 和 console.log('d'),定时器 setTimeout 延迟一段时间执行,顾名思义异步任务进入事件队列中,等待主线程任务执行完毕,再进入主线程执行。
定时器的延迟时间为 0 并不是立刻执行,只是代表相比于其他定时器更早的进入主线程中执行。
加一盘 for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i) }, 1000) } 结果:十个10
每次 for 循环遇到 setTimeout 将其放入事件队列中等待执行,直到全部循环结束,i 作为全局变量当循环结束后 i = 10 ,再来执行 setTimeout 时 i 的值已经为 10 , 结果为十个10。
在Linux系统中,新安装docker,输入命令,如:docker images
结果却报异常了
简单理解就是当前用户的连接被拒绝了
解决方案一:
使用管理员权限,命令前加sudo
解决方案二:
给当前用户加入到docker用户组中
sudo groupadd docker #添加docker用户组,这个用户组应该是已存在了
sudo gpasswd -a $USER docker #将当前用户加入到docker用户组中
newgrp docker #更新用户组docker
再执行 docker images
这个就可以正常使用了
/*用户输入运算数和四则运算符,输出计算结果*/ #include <stdio.h> #include <conio.h> void main (void) { double a,b,c; char op;//op表示运算符 printf ("请输入两个运算数,空格隔开\n"); scanf ("%lf %lf",&a,&b); fflush(stdin);//这句话必须要有,清空缓冲区m否则下面的输入操作符的scanf语句无法正常运行 printf ("请输入运算符\n"); scanf ("%c",&op); switch(op) { case '+':c=a+b;break; case '-':c=a-b;break; case '*':c=a*b;break; case '/':c=a/b;break; } printf ("计算结果为%lf\n",c); getch(); }
文章目录 1. 管理数据1.1 插入数据1.2 多行插入1.3 测试外键1.4 删除数据1.5 更新数据1.6 删除表格 参考资料 1. 管理数据 在上一篇文章中,我们介绍了如何创建一个数据库,充分考虑了表格设计,列限制以及表的关系。而在本文中,我们将学习 INSERT(插入)、DELETE(删除)和 UPDATE(更新)记录,事实上,这些操作比 SELECT 语句更简单。
1.1 插入数据 在一个关系数据库中,数据只有在接收到记录时才会产生。INSERT 正是将记录插入数据库的语句,你可以选择只选择某几列来添加数据,然后让其他的保留缺失值 null 或者默认值。
首先我们将会在上一篇文章建立的 SurgeTech 数据库中插入数据,首先导入数据库:
使用Jupyter Notebook 运行 SQL 语句需安装 ipython-sql
%sql 以及 %%sql 为在 Notebook 中运行 SQL 语句,在 SQLite 命令行或 SQLite Stiduo 中不需要 %sql 或 %%sql
载入 SQL 以及连接 SQLite:
%load_ext sql %sql sqlite:///DataBase/surgetech_conference2.db 'Connected: @DataBase/surgetech_conference2.db' 图1 SurgeTech Conference 数据库 Schema 你可以将你的名字插入到数据库中:
%%sql INSERT INTO attendee (first_name, last_name) VALUES('Thomas', 'Nield') * sqlite:///DataBase/surgetech_conference2.
Flutter - 极速构建漂亮的原生应用 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。
快速开发富有表现力和灵活的UI原生性能 1. 工具和相关文档 1.1 相关工具 Windows 7 或更高系统 (64-bit)Git命令行工具 下载Git工具Android Studio 或 VSCode 1.2 相关文档 Flutter中文网,包含教程、文档、示例等。pub.dev,Flutter第三方插件仓库。 建议有稳定的翻墙工具,否则过程可能比较痛苦!
建议有稳定的翻墙工具,否则过程可能比较痛苦!
建议有稳定的翻墙工具,否则过程可能比较痛苦!
2 安装 Flutter SDK Dart SDK 已经捆绑在 Flutter 里,无需再单独安装 Dart。
2.1 配置国内镜像 国内访问Flutter有时可能会受到限制,Flutter官方为中国开发者搭建了临时镜像,大家可以将如下环境变量加入到用户环境变量中。此镜像为临时镜像,并不能保证一直可用,读者可以参考详情请参考 Using Flutter in China 以获得有关镜像服务器的最新动态。 export PUB_HOSTED_URL=https://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn 2.2 安装 Flutter SDK 推荐:使用 Git 克隆 Flutter 库到本地。(如克隆到 C:/Flutter 下,不要放在高权限的文件夹下,如 C:\Program Files\,尽量使用英文路径)
git clone -b stable https://github.com/flutter/flutter.git 其他方法(以下方法鄙人都失败了,运行报错且下载慢,你可以试试):
Flutter官网下载其最新可用的安装包,下载Flutter Github 项目去下载安装包 ,前去 在安装目录的文件下找到 flutter_console.
1.Jmeter聚合报告介绍:
Jmeter聚合报告(Aggregate Report)是性能测试比较常用的监听器(Listener),用来聚合测试过程中请求的响应时长以及相关的百分位数据。
2.Add Aggregate Report:
3.聚合报告值详解:
整体结构如图所示:
具体参数
Label:The label of the sample.请求的名称
#Samples:The number of the samples with the same label(请求的数量)
Average:The average time of a set of results(该请求的平均响应时长)
Median:The time in the middle of a set of results(50%的请求响应时长在该时间以内)
90%Line:90% of the samples took no more than this time(90%的请求响应时长在该时间以内)
95%Line:95% of the samples took no more than this time(95%的请求响应时长在该时间以内)
99%Line:99% of the samples took no more than this time(99%的请求响应时长在该时间以内)
Average=[12,11,7,7,6,5]; Variance=[0.5,0.4,0.3,1,0.3,0.5]; Time=0:1:5; errorbar(Time, Average,Variance,'-or'); xlabel('Time'); ylabel('Value'); Time是横坐标,Average是○处值,Variance是误差值,有点像蜡烛线的这个就是Variance。
当然,我们如果希望Error Bar的竖线上下长度不一样,也可以参考如下的例子:
Average=[12,11,7,7,6,5]; low=[0.5,0.4,0.3,1,0.3,0.5]; high = [0.3,0.2,0.6,0.4,1,0.2]; Time=0:1:5; errorbar(Time, Average,low,high,'-or'); xlabel('Time'); ylabel('Value'); low和high两个向量分别给了Bar竖线的下部和上部的长短大小。
JDBC: 1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库 * JDBC本质:是一套操作所有关系型数据库的规则,即接口。数据库公司去实现这套接口,提供jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。 2. 快速入门: * 步骤: 1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar 1.1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下 1.2.右键-->Add As Library 2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); 3.获取数据库连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root"); 4.定义sql语句 String sql = "update account set balance = 500 where id = 1"; 5.获取执行sql的对象 Statement Statement stmt = conn.createStatement(); 6.执行sql int count = stmt.executeUpdate(sql); 7.处理结果 System.out.println(count); 8.释放资源 stmt.close(); conn.close(); 3. 用到的对象: 1. DriverManager:驱动管理对象 (mysql5之后的驱动jar包可以省略注册驱动) * 功能: 1. 注册驱动:告诉程序该使用哪一个数据库驱动jar static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。 写代码使用: Class.
Java ConcurrentModificationException异常原因和解决方法 Java ConcurrentModificationException异常原因和解决方法
在前面一篇文章中提到,对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。下面我们就来讨论以下这个异常出现的原因以及解决办法。
以下是本文目录大纲:
一.ConcurrentModificationException异常出现的原因
二.在单线程环境下的解决办法
三.在多线程环境下的解决方法
若有不正之处请多多谅解,并欢迎批评指正 一.ConcurrentModificationException异常出现的原因 先看下面这段代码:
1
2
3
4
5
6
7
8
9
10
11
12
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(2);
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
Integer integer = iterator.next();
if(integer==2)
list.remove(integer);
}
}
}
运行结果:
从异常信息可以发现,异常出现在checkForComodification()方法中。
我们不忙看checkForComodification()方法的具体实现,我们先根据程序的代码一步一步看ArrayList源码的实现:
首先看ArrayList的iterator()方法的具体实现,查看源码发现在ArrayList的源码中并没有iterator()这个方法,那么很显然这个方法应该是其父类或者实现的接口中的方法,我们在其父类AbstractList中找到了iterator()方法的具体实现,下面是其实现代码:
1
2
3
public Iterator<E> iterator() {
return new Itr();
}
文章目录 1. Join1.1 表联合1.2 内联合1.3 左联合1.4 其他联合类型1.5 多表联合1.6 分组联合 参考资料 1. Join 我们在上一篇中介绍了 Case 子句
,接下来我们将使用 join ,对表格进行合并。
使用Jupyter Notebook 运行 SQL 语句需安装 ipython-sql
%sql 以及 %%sql 为在 Notebook 中运行 SQL 语句,在 SQLite 命令行或 SQLite Stiduo 中不需要 %sql 或 %%sql
载入 SQL 以及连接 SQLite:
%load_ext sql %sql sqlite:///DataBase/rexon_metals.db 'Connected: @DataBase/rexon_metals.db' 本文将使用 rexon_metals.db 数据库,其中包含了 CUSTOMER、CUSTOMER_ORDER 和 PRODUCT 三张表。
1.1 表联合 Joining 是 SQL 内置的一个子句,但却和其他的子句不同。当我们讨论一个关系数据库时,
里面通常有着几张表,表与表之间通过某一列数据相联系。举个例子,在这样 CUSTOMER_ORDER
表中,有这 CUSTOMER_ID 这一列:
%%sql select * from customer_order limit 0,5; * sqlite:///DataBase/rexon_metals.
和客户对接过程中,发现对方请求的字段都不符合驼峰命名法,例如 OrderNo、User等
后端接收时一直报错,org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "Xxxxx"
面对客户如此无礼的要求,也只能选择默默忍受,在注释里吐槽把字段全改成首字母大写,
但是还是接收不到,但是标准的驼峰命名法就可以,如orderNo
原来,JavaBean规范就是规定必须使用驼峰命名法,但是这就没办法了么?并不是
可能springMVC的开发者们也遇到了这般无礼的要求,所以提供了一种注解的方法
springMVC使用的是Jackson来解析json格式的请求报文,
所以可以使用@JsonProperty注解来实现强制要求接受字段,如:
@JsonProperty("OrderNo)
private String orderNo;
这样就可以接收到了