mysql 检查自带mariadb数据库 并删除 #查看mariadb rpm -qa|grep mariadb #删除mariadb yum remove mariadb-libs 把下载好的 mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz 放到 /opt 目录下 解压,移动并重命名 tar -zxvf /opt/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz mv /opt/mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql 递归修改权限为 mysql组 mysql用户 useradd -g mysql mysql chown mysql.mysql -R /usr/local/mysql 在/usr/local/mysql/support-files/路径下创建 my.cnf vim /usr/local/mysql/support-files/my_default.cnf 粘贴复制以下内容 [mysqld] #设置mysql的安装目录 basedir =/usr/local/mysql #设置mysql数据库的数据存放目录 datadir = /usr/local/mysql/data #设置端口 port = 3306 socket = /tmp/mysql.sock #设置字符集 character-set-server=utf8 #日志存放目录 log-error = /usr/local/mysql/data/mysqld.log pid-file = /usr/local/mysql/data/mysqld.pid #允许时间类型的数据为零(去掉NO_ZERO_IN_DATE,NO_ZERO_DATE) sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION #ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 拷贝覆盖 /etc/my.cnf cp /usr/local/mysql/support-files/my.
新配置了一台深度学习服务器,但是预装系统为windows10,与需求不符。于是,自己动手安装ubuntu(18.04)。此文为过程记录。
主要步骤: 准备一个u盘,用来制作ubuntu镜像安装ubuntu安装完成之后,没有网卡驱动,需要手动安装。(安装驱动的时候,发现gcc、g++和make也没有安装,而安装网卡的时候需要make命令)更新软件包列表,更新软件 详细过程: u盘镜像制作 下载镜像http://releases.ubuntu.com/18.04.5/ubuntu-18.04.5-desktop-amd64.iso下载安装刻录软件最新UltraISO官方免费下载 - UltraISO软碟通中文官方网站刻录 (1)点击“文件”,选择下载好的ubuntu镜像
(2)点击“启动”,选择“写入硬盘镜像”
(3)选择合适的写入方式,点击“格式化”后,再点击“写入”,等待写入完成(100%)。如若写入失败,提示重新格式化后再试,这种情况是u盘有问题,更换u盘再试。
ubuntu安装 插入刚刚制作好的ubuntu镜像u盘,重启电脑。进入BIOS(F2),选择从u盘启动系统。
在此步骤中需要注意的是,因为原本有windows系统,所以我们在分区的时候应该选择手动分区,将硬盘原本的windows内容(也可以删除全部分区)全部删除,重新分区。这样就变成了一个纯净的ubuntu单系统了。
注意事项:一定要设置efi分区
目录建议大小格式描述EFI300Mefi安装启动引导器的设备/boot1Gext4空间起始位置swap物理内存2倍swap交换空间/200Gext4根目录/home剩余空间ext4用户工作目录 网卡驱动等软件安装 安装好ubuntu18.04是没有网卡驱动的,所以没有办法上网,需要继续安装驱动。在安装驱动的时候发现还需要依赖make命令,但是很不幸,make也没有安装。于是乎,安装顺序变为先安装make,再安装网卡驱动。
make 不需要额外去下载软件包,这些软件包在制作镜像的u盘的pool/main目录下。
查看依赖,以下目录都在pool/main/下
cd pool/main/ find -name gcc* 进入/g/gcc-8/
sudo dpkg -i lib*.deb 进入pool/main/l/linux/
sudo dpkg -i linux-libc-dev_4.15.0-76.86_amd64.deb 进入/g/glibc
sudo dpkg -i lib*.deb 进入/g/gcc-7
sudo dpkg -i lib*.deb sudo dpkg -i g*.deb 进入/g/gcc-8
sudo dpkg -i lib*.deb 进入/m/make-dfsg
sudo dpkg -i make_4.1-9.1ubuntu1_amd64.deb 安装完gcc、g++和make之后,需要设置软链接,例如sudo ln -s /usr/bin/工具名-x.xxx /usr/bin/工具名,工具名可在/usr/bin目录下查看。
设置gcc软连接的示例
sudo ln -s /usr/bin/gcc-7 /usr/bin/gcc 网卡驱动安装 首先查看适配的网卡驱动
问题描述 设备:联想拯救者R7000
摄像头显示如下图
尝试过网上的命令行以及设备管理器等操作,还是不如下面的操作有效
解决方法 下载联想电脑管家
管网安装后点击电源键并点击摄像头
这个页面为什么自己会打开断点处理? - SegmentFault 思否
总的来说就是
打开 F12
进入 sources / 源代码 点击 这个蓝色钻头 停用所有断点 即可
Js生成json数据并导出json文件 目录
前言
一、生成数据
二、导出json文件
三、完整代码
前言 在实际开发中或者自己学习中经常需要使用到json数据,这时候这个就可以自己
搞定。
一、生成数据 InitDataFun() { let ListData = []; let FirstContentData = []; let SecondContentData = []; let ThirdContentData = []; let FourContentData = []; for (var i = 0; i < 16; i++) { if (i < 6) { FirstContentData.push({ Name: "一级水厂" + (i + 1), Label: "一级水厂" + (i + 1), Status: 0, Msg: [], IsFather: true, Depth: 1, Time: "
1、挂载主机目录,常用于日志文件挂载和hosts文件挂载
volumeMounts:
- mountPath: /etc/hosts
name: hosts
subPath: hosts
- mountPath: /www/logs/
name: clife-sleep-commons-web-push-business-logs
volumes:
- hostPath:
path: /etc/
type: ""
name: hosts
- hostPath:
path: /data/services/logs/new-county/
type: ""
name: clife-sleep-commons-web-push-business-logs
2、挂载configmap
创建configmap资源
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
data:
my.cnf: |
[mysqld]
datadir=/var/lib/mysql
log-error=/var/log/mysql/error.log
slow_query_log=ON
slow_query_log_file=/var/log/mysql/tmp_slow.log
default-storage-engine=INNODB
character_set_server=utf8
lower_case_table_names=1
table_open_cache=128
max_connections=2000
max_connect_errors=6000
innodb_file_per_table=1
innodb_buffer_pool_size=1G
max_allowed_packet=64M
transaction_isolation=READ-COMMITTED
innodb_flush_method=O_DIRECT
innodb_lock_wait_timeout=1800
innodb_flush_log_at_trx_commit=0
sync_binlog=0
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
skip-name-resolve
[mysql]
default-character-set=utf8
[mysql.server]
default-character-set=utf8
init.sql: |
一、概述
计算机编程语言顾名思义,是用来和计算机进行沟通的语言。计算机编程语言伴随着计算机的发明,作为计算机领域各种软件的基础,不断推动着计算机技术的发展。本文中,将主要关注设计开发一种计算机编程语言,对于其他类似的语言,比如MarkDown、数据查询语言、数据交换语言等不涉及。
计算机编程语言自从诞生以来,不断发展,很多已经逐渐消失在历史的长河中,当前(2022年)最流行的几门语言包括(**排名不分先后**):Python、Java、Javascript、C++、Kotlin、R、PHP、Go、C、Swift、C#等。使用计算机编程语言可能是本文读者在日常工作和生活中经常做的一件事情,那么计算机编程语言是如何设计的呢?设计和实现一门计算机编程语言复杂吗?我们什么时候有必要设计一门计算机编程语言呢?如何实现一门计算机编程语言呢?希望这篇文章能够解答上面的疑惑。
二、TinyLanguage定义及功能
很多人学习的第一门编程语言是C语言,C语言作为一门很古老的语言(1967年发明),至今已经有50多年的历史,但是当今依然非常流行。比如现在已经渗透到大家生活中方方面面的Linux操作系统就是主要用C语言开发的,大家在生活中见到的各种以单片机为主控的嵌入式设备也是大部分以C语言作为编程语言的。这里想表达的意思是,C语言除了历史悠久、非常流行之外,它也拥有独特的设计之美、简洁之美。我们来看一下一个简单的C语言程序:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i, n; int t1 = 0, t2 = 1; int nextTerm = t1 + t2; if (argc != 2) { fprintf(stderr, "please input one number\n"); return -1; } n = atoi(argv[1]); for (i = 3; i <= n; ++i) { t1 = t2; t2 = nextTerm; nextTerm = t1 + t2; } printf("%dth value is %d\n"
C语言编程作业 Week1编程作业1 C程序必看
平均数 从键盘输入某同学的3科成绩,输出这3科成绩的平均分
#include <stdio.h> main(){ float a,b,c,avg; scanf("%f,%f,%f",&a,&b,&c); printf("%.2f",avg=(a+b+c)/3); } 和、差、积、商与余数 输入2个整数 num1 和 num2,计算并输出它们的和、差、积、商与余数
#include <stdio.h> int main(){ int a,b; scanf("%d%d",&a,&b); printf("%d + %d = %d\n",a,b,a+b); printf("%d - %d = %d\n",a,b,a-b); printf("%d * %d = %d\n",a,b,a*b); printf("%d / %d = %d\n",a,b,a/b); printf("%d %% %d=%d\n",a,b,a%b); return 0; } 字母大小写转换 #include <stdio.h> int main(void) { //ASCII码表中: // A-Z: 65-90 //a-z: 97-122 char cLetter; char cDifference = 'a' - 'A'; // 计算出大写字母与小写字母的ASCII值的差,97-65等于32 printf("
文章目录 一、node常用命令二、镜像源1.使用配置2.cnpm3.使用nrm 一、node常用命令 查看npm命令
npm help 安装模块(包):
// 全局安装 npm install 模块名 -g // 本地安装 npm install 模块名 // 一次性安装多个 npm install 模块1 模块2 模块n --save // 安装运行时依赖 npm install 模块名 --save or npm install 模块名 -S npm install 模块名 --save-dev 查看安装目录:
// 查看本地安装的目录 npm root // 查看全局安装的目录 npm root -g 卸载模块(包):
// 卸载本地模块 npm uninstall 模块名 // 卸载全局模块 npm uninstall -g 模块名 更新模块(包):
npm update 模块名 npm update 模块名 -g 查看当前安装的模块(包):
什么是函数式编程 允许将函数本身作为参数传入另一个函数还允许返回一个函数 高阶函数 函数本身可以赋值给变量函数名本身就是指向函数的变量 可以将函数名指向其他对象 若一个函数可以接受另一个函数作为参数,该函数称之为高阶函数 def high_func(x,y,f): return f(x) + f(y) map & reduce map(func,Iterable) 将传入的函数一次作用到序列的每个元素上并将结果作为新的Iterator返回Iterator是一个惰性序列哦, 可以使用list将其转换成Iterable, 从而消除惰性 eg: 将列表中所有元素转换成字符串 list(map(str,[1,2,3,4,5])) reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4) 要求f必须接收两个参数会将前面的结果作为第一个参数, 和Iterable中的参数进行运算是一种递归的感觉? eg : 序列累加 reduce(add,[1,2,3,4,5]) # practice def normalize(name): return name[0].upper() + name[1:].lower() filter 就是一个过滤器,根据设定好的函数作为条件,然后对Iterable进行过滤,并返回一个Iteratoreg: 筛选素数 # 奇数生成器 def _odd_iter(): n = 1 while True: n = n + 2 yield n # 筛选条件 def _not_divisible(n): return lambda x: x% n > 0 # 生成素数 def primes(): yield 2 it = _odd_iter() while True: n = next(it) yield n it = filter(_not_divisible(n),it) 感觉还是别试图去搞清楚它的具体细节,是先生成奇数再过滤还是怎样 # 筛选出回文数 def is_palindrome(num): s = str(num) i,j = 0,-1 while i<=len(s)/2: if s[i]!
Vue中的控制属性要用‘background-color’加引号,而纯html是不用的;
1.前提是微信公众号后台已经配置了 业务域名地址和网络授权地址
2.例如在首页授权登录,在当前页面引入对应的js
import { isWXBrowser, getWechatCode } from "@/utils/common"; 3.common.js
// 判断是否微信环境 export const isWXBrowser = (() => { const ua = window.navigator.userAgent.toLowerCase() return /(micromessenger|webbrowser)/g.test(ua) })() import axios from 'axios' // 判断是否为微信环境 const isWechat = () => { return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger"; } export const getUrlCode = () => { // 截取url中的code方法 var url = location.search; var theRequest = new Object(); if (url.indexOf("?") != -1) { var str = url.
C语言实现各种排序算法 冒泡排序选择排序插入排序希尔排序(插入方式)(非交换方式)快速排序归并排序(分治思想)基数排序(桶排序)基数排序的基本思想(典型的空间换时间方式): 冒泡排序 #include <stdio.h> #include <stdlib.h> #include <string.h> //数组的首地址传进去 void bubbleSorting(int *arr,int arrLength){ for (int i = 0; i < arrLength; ++i) { for (int j = 0; j < arrLength-i-1; ++j) { if(arr[j]>arr[j+1]){ int temp = arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp; } } } } int main(){ int arr[]={3,9,-1,10,20}; int length = sizeof(arr)/sizeof(int); printf("%d\n",length); bubbleSorting(arr,length); for (int i = 0; i < length; ++i) { printf("%d ",arr[i]); } return 0; } 选择排序 #include <stdio.
文章目录 说明一、生成二维码,指定跳转路径二、进入指定的H5页面,并获取openid总结 说明 功能:需要生成二维码,识别二维码后进入指定H5页面,获取到使用人的openid,然后进行自己其他操作。
这篇文章主要记录的是生成二维码、跳转到指定页面的模块。
使用框架如下:
后端:jeecgboot
Web、 H5:Vue3
一、生成二维码,指定跳转路径 方式1、微信提供了生成二维码的接口,可直接调用获取
文档地址:微信公众开发者文档
避坑点:开启公众号的服务器配置,JS域名配置等,白名单配置;具体的可以看一看微信公众号开发。
方式2【推荐】:使用草料二维码进行生成,带有扫描后进入的页面路径
生成地址:草料二维码生成地址
注意:跳转到自己的后台微信验证方法,并获取到openid拼接到H5页面,在H5页面通过截取的方式获取到openid。
1、确定回调域名并构造URL,一个参考地址
https://open.weixin.qq.com/connect/oauth2/authorize?appid=微信公众号id&redirect_uri=后端验证方法接口&connect_redirect=1#wechat_redirect 参数说明:【网址需要encodeURL】
2、后端验证方法接口方法:使用WxOAuth2AccessToken类进行微信验证
(1)引入依赖
<dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>4.1.0</version> </dependency> (2)验证的方法:
@Slf4j @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @RequestMapping("wx/redirect/{appid}") public class WxRedirectController { private final WxMpService wxMpService; private final WxMpProperties properties; private final RedisUtil redisUtil; private final IWxUserService wxUserService; /** * 微信验证 * @param req : * @param resp : * @return org.jeecg.common.api.vo.Result * @author 张雪 */ @GetMapping("
面向对象之接口 1.抽象类 引言 当我们编写一个类时,常常会在该类中定义一些方法,这些方法通常情况下是具体的,但在某些情况下,我们无法准确的知道这些方法的细节,这时候就需要我们创建一个抽象类,这些方法就是抽象方法。抽象类一般指父类,专门用来让子类继承,抽象方法必须被子类重写。我们通过添加abstract关键字来使该类变成抽象类,同样添加abstract关键字使方法变成抽象方法。 什么是抽象类 abstract 修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。抽象类存在的意义:提高开发效率 抽象类要求 抽象类,不能使用 new 关键字来创建对象,它是用来让子类继承的。
抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
接口中可以有普通成员变量,抽象类中没有普通成员变量
子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法;否者该子类也要声明为抽象类,然后由子子类实现抽象方法。
注意事项: 1.不能 new 这个抽象类,只能靠子类去实现它;只是约束 2.抽象类中可以写普通方法 3.抽象方法必须在抽象类中4.抽象类中可以有构造器,接口中不能有构造器5.抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法 抽象类中可以有构造器,接口中不能有构造器原因: 在接口里写入构造方法时,编译器提示:Interfaces cannot have constructors。 1.构造方法用于初始化成员变量,但是接口成员变量是常量,无需修改。接口是一种规范,被调用时,主要关注的是里边的方法,而方法是不需要初始化的2.类可以实现多个接口,若多个接口都有自己的构造器,则不好决定构造器链的调用次序3.构造器是属于类自己的,不能继承。因为是纯虚的,接口不需要构造器。 在抽象类中 可以有构造方法。 在抽象类中可以有构造方法,只是不能直接创建抽象类的实例对象,但实例化子类的时候,就会初始化父类,不管父类是不是抽象类都会调用父类的构造方法,初始化一个类,先初始化父类。 1.1 抽象类代码演示: package oopdemo01.demo10; //abstract:抽象类 类 extends,单继承; (接口可以多继承) public abstract class Action { public static final int a =66; public void doSomething(){};//抽象类中可以写普通的方法,抽象类里的普通方法可以不需要子类实现 //约束~ 有人帮我们实现 //abstract:抽象方法,只有方法名字,没有方法的实现! public abstract void toDoSomething();//如果光写方法不写实现会爆红,但是加上abstract 关键字后就成为了抽象方法 //1.不能new这个抽象类,只能靠子类去实现它:约束! //2.抽象方法必须在抽象类中,抽象类中可以写普通的方法 } package oopdemo01.demo10; public class A extends Action{ //抽象类的所有方法,继承了他的子类,都必须要实现它得方法 //除非子类也是抽象方法,那就由子子类实现 @Override public void toDoSomething() { System.
背景 在开发uniapp 项目打包成微信小程序,语音播放功能在安卓机上获取时长一直为0(开发者工具中可以正常获取),我也百度了很多方法,其中就有在onPlay()方法里面使用定时器获取,但是依然没有解决获取时长的问题
解决方法 在这里我也就不啰嗦了,直接上代码 核心代码在audioInit()方法
methods里面写一个audioInit方法,然后在mounted生命周期里面调用即可(或者直接写在mounted或onLoad生命周期里面)
该方法的主要思路是,进页面先执行播放操作,将音量置为0,然后拿到时长,结束播放,然后关闭播放, 将音量置为1.
data(){ return{ initAudio: true, firstPlay: true, start: false, currentTime: 0, isScrolling: false, durationFormat: '00:00', duration: 100, currentTimeFormat: '00:00', backgroundAudioId: null, backgroundAudioPause: null, innerAudioContext: null } }, methods: { audioInit() { // 创建一个音频对象 this.innerAudioContext = uni.createInnerAudioContext() // 音频的数据链接 this.innerAudioContext.src = encodeURI(this.audioSrc) // 执行播放 this.innerAudioContext.play() // 将音量置为0(若不置0的话会出现进入页面就播放出声音) this.innerAudioContext.volume = 0 uni.showLoading({ title: '加载中...' }) // 核心代码start this.innerAudioContext.onCanplay(() => { setTimeout(() => { // initAudio 进入页面为true,只要点击了播放置为false,避免出现bug if (this.
1、检查
首先出现这种情况的话,建议先检查下服务器安全性,检查是不是被设置植入了自动重启木马,从而导致的自动重启,如果是这种情况,找出删除加固服务器安全就可以了。
2、排查
第二步是排查,看是不是服务器本身设置了,安排重启回收服务器系统资源的时候,导致资源不足从而引起的重启。
3、查看组件
接下来查看是不是服务器安装了必要的组件,重新安装组件的时候,会自动重启安装,组件的安装才能生效。
4、检查系统
最后建议检查一下系统检查更新是否开启,如果系统自动更新的话,重启才会生效,更新完成会自动重启的,所以面对这种情况,可以把系统更新关闭,设置成手动去检查安装更新,有选择性的点击安装更新重启。
5、服务器硬件问题
如果以上问题都排除了,不是这类问题的话,很大可能是出自服务器硬件,这时候,需要机房技术彻底解决的话,需要花时间,排除具体什么硬件问题。
参考 Keras基本用法 - 云+社区 - 腾讯云
Keras是目前使用最为广泛的深度学习工具之一,它的底层可以支持TensorFlow、MXNet、CNTK和Theano。如今,Keras更是被直接引入了TensorFlow的核心代码库,成为TensorFlow官网提供的高层封装之一。下面首先介绍最基本的Keras API,下面给出一个简单的样例,然后介绍如何使用Keras定义更加复杂的模型以及如何将Keras和原生态TensorFlow结合起来。
1、Keras基本用法 和TFLearn API类似,Keras API也对模型定义、损失函数、训练过程等进行了封装,而且封装之后的整个训练过程和TFLearn是基本一致的,可以分为数据处理、模型定义和模型训练三个部分。使用原生态的Keras API需要先安装Keras包,安装的方法如下:
pip install keras 以下代码展示了如何使用原生态Keras在MNIST数据集上实现LeNet-5模型。
# -*- coding: utf-8 -*- import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D from keras import backend as K num_classes = 10 img_rows, img_cols = 28, 28 (trainX, trainY), (testX, testY) = mnist.load_data() if K.image_data_format() == 'channels_first': trainX = trainX.reshape(trainX.shape[0], 1, img_rows, img_cols) testX = testX.
输入列表: [[1,2,3], [2,1], [3,4], [5], [6,7]] ,把其中有相同值的列表进行合并
输出列表:[[1, 2, 3, 4], [5], [6, 7]]
代码:
def found_idx(lst, k): """ lst: [[1,2,3], [2,1], [3,4], [5], [6,7]] k = 3 return: [0,2], [1,2,3,4] # idx, which '3' in [1,2,3], [3,4] """ idx = [] for i,js in enumerate(lst): for j in js: if j == k: idx.append(i) continue mg_lst = [] for x in idx: mg_lst += lst[x] return idx, list(set(mg_lst)) def merge_lst(lst): "
Student student= studentDao.selectOne(new LambdaQueryWrapper<Student >() .eq(Student ::getAgentCode, agentCode) .last("limit 1"));
简版Vue的实现 MVVM的实现代码实现创建vue_simple项目项目目录编写过程测试代码 hvue.html明确实现hVue.js的过程数据响应式模版编译 MVVM的实现 MVVM框架的三要素:数据响应式、模版引擎及其渲染
数据响应式:监听数据变化并在视图中更新
Object.defineProperty(),Vue2中的实现Proxy,Vue3中的实现 模版引擎:提供描述视图的模版语法
插值:{{}}指令:v-bind, v-on, v-model, v-for, v-if 渲染:如何将模版转换成html
模版=> vdom => dom 代码实现 创建vue_simple项目 vue create vue_simple
项目目录 其中hvue.html是我们测试效果的代码,hvue.js就是我要写的简版vue的代码。
编写过程 测试代码 hvue.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>简版vue的实现</title> </head> <body> <div id="app"> <p>{{counter}} <span>{{sum}}</span> </p> </div> </body> <script src="../node_modules/vue/dist/vue.js"></script> <script> const app = new Vue({ el:'#app', data:{ counter:1, sum:1 } }) </script> </html> 这里可以看到,此时使用的还是vue的,在接下来就要引用我们写的kvue.js。现在的页面效果如下:
概览 操作符将一个或多个DataStream转换为一个新的DataStream。程序可以将多个转换组合成复杂的数据流拓扑。
本节将描述基本的转换、应用这些转换后的有效物理分区以及对Flink的 operator chain(链)的深入了解。
DataStream 各种转换算子 Map DataStream → DataStream
获取一个元素并生成一个元素。将输入流的值加倍的map函数:
DataStream<Integer> dataStream = //... dataStream.map(new MapFunction<Integer, Integer>() { @Override public Integer map(Integer value) throws Exception { return 2 * value; } }); flatMap DataStream → DataStream
接受一个元素并生成0、1或多个元素。一个将句子分割为单词的flatmap函数:
dataStream.flatMap(new FlatMapFunction<String,String>(){ @Override public void flatMap(String value,Collector<String> out) throw Exception{ for(String word: value.split(" ")){ out.collect(word); } } }) Filter DataStream → DataStream
对每个元素求布尔函数值,并保留函数返回true的元素。一种过滤掉零值的过滤器:
SingleOutputStreamOperator<String> filter = dataStream.filter(new FilterFunction<String>() { @Override public boolean filter(String s) throws Exception { return s.
使用vscode开发,安装了vscode-spring-boot ,报错如下
解决方案,增加对yml文件的识别
新增.vscode/settings.json
内容如下:
{ "files.associations": { "*.yml": "yaml" } }
阅读本文需要 Integer.MAX_VALUE 分钟。
故事背景 笔者所在的公司主营业务是智能家居,笔者在公司负责的Android端App的开发。关于智能家居,估计现在百分之八九十的童鞋都听过,但真正了解或者使用过的估计就不占多数了。本文不谈行业前景,只谈技术。
为了方便大家更加了解故事的背景,顺便科普一下智能家居,想直奔WebSocket主题的童鞋可以直接第二章节。
智能家居,算是物联网的一个典型应用场景。什么是物联网呢,字面意思就是把众多物体连接起来组成一个网络,英文是Internet of things(IoT)。小到一个你的手机跟蓝牙耳机,大到一个城市的各个角落,究极形态就是“万物互联”。(为什么突然想起万佛朝宗 -_-!)
IoT其实不在意网络的协议,也不在意连接的到底是什么东东,就这种形态本身而言,就是IoT。其实这个概念其实很早就有了,在笔者上大学那会,不怕暴露年龄的说是在09到10年左右就听说过物联网这个词。还记得实验课的GPRS智能抄表系统么,你可能没有觉得多么高大上,不就是水表上插个SIM卡,定期把值发到客户端上么,再也不怕被人上门查水表啦~ 没错,这也是IoT的一种体现。
但这么多年,物联网但一直不温不火。至于为什么最近几年又被提出来呢,智能家居在其中扮演了很重要的作用。另外AI这把火也起到了推波助澜的作用,任何产品都要加上智能二字。所以有了AI + IoT,也就是AIOT。具体就不详述了,以后可以再单开一文详细介绍下物联网。
说回智能家居,智能家居是家庭为单位的物联网,简单说就是你可以通过家里中控或者App控制制家里的灯、插座、监控、电器等等。
文字算个球,一图解千愁,上架构图
简单解释一下,网关的作用是负责连接屋内的所有设备,网关和设备之间一般不会采用HTTP(个别单品除外),而会采用比如zigbee、lora等近场通信协议(或者直接用有线方式更稳定),因为功耗低,比较省电,你想家里如果装了几十个开关面板,总归每个月也能节约十几二十块钱的电费吧。当然最重要的原因还是因为方案也比较成熟。所以使用这类设备之前需要有个“组网”的操作,把设备组到网关上。如果断开了,网关就认为设备离线了。
网关会将设备的状态上报给云平台,云平台就将状态下发给客户端了。同样,客户端控制设备就是个反向的过程。当然如果以后5G普及了,设备直接通过5G网络连接云平台,因为5G功耗低、延迟低、速度快,就可以不需要网关了。
整体的架构还算是比较简单的,当然中间也有很多复杂的逻辑,涉及到比如设备状态、人员、权限、房屋的管理等等这里就不关注了。
在服务器下发设备状态的时候就涉及到了推送。因为智能家居有情景模式的概念,比如回家模式,执行一个请求,咔咔打开十几个灯,所以靠请求的返回值判断状态是不太现实的,只能依靠推送。
由于业务的特殊性,智能家居的推送需要有较高的实时性,比如用户打开了灯(无论在app上打开或者直接打开),app上的灯的状态都需要立即变成开。如果等个3、5秒状态再发生改变,这样的用户体验很不好。
我们最早使用的是某光推送,发现延迟严重,有时需要等十几秒才收到推送,毕竟适用场景毕竟不一样。所以决定自建长连接当推送。经过选型,决定采用本文的主角,WebSocket。
WebSocket状态管理现存的问题 市面上有很多现成的WebSocket连接库,比较著名的有Java-WebSocket,OkHttp也自带WebSocket支持。
最初因为项目内已经接入了OkHttp,所以直接使用了OkHttp。使用的方式很简单,熟悉OkHttp的童鞋应该很懂,
OkHttpClient client = OkHttpClient.Builder().build(); Request request = new Request.Builder().build(); client.newWebSocket(request, new WebSocketListener() { @Override public void onOpen(okhttp3.WebSocket webSocket, Response response) {} @Override public void onMessage(okhttp3.WebSocket webSocket, String text) {} @Override public void onClosed(okhttp3.WebSocket webSocket, int code, String reason) {} @Override public void onFailure(okhttp3.WebSocket webSocket, Throwable t, Response response) {} }); 复制代码 调用方便,回调状态也很清晰。Java-Websocket也差不多类似,但总体来说有以下几个问题:
ubuntu安装ssh-contact-service出现以下报错
ubuntu@ubuntu-virtual-machine:~/桌面$ sudo apt-get install ssh-contact-service [sudo] ubuntu 的密码: E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1188(unattended-upgr)持有 N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的系统。 E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它? 解决办法
可使用该命令强制解锁
ubuntu@ubuntu-virtual-machine:~/桌面$ sudo rm /var/lib/dpkg/lock-frontend ubuntu@ubuntu-virtual-machine:~/桌面$ sudo rm /var/lib/dpkg/lock 解锁成功后,就可以了
ubuntu@ubuntu-virtual-machine:~/桌面$ sudo apt-get install openssh-server 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 将会同时安装下列软件: ncurses-term openssh-sftp-server ssh-import-id 建议安装: molly-guard monkeysphere ssh-askpass 下列【新】软件包将被安装: ncurses-term openssh-server openssh-sftp-server ssh-import-id 升级了 0 个软件包,新安装了 4 个软件包,要卸载 0 个软件包,有 144 个软件包未被升级。 需要下载 751 kB 的归档。 解压缩后会消耗 6,046 kB 的额外空间。 您希望继续执行吗? [Y/n] y 获取:1 http://cn.
一、关于gitee gitee(中文名:码云 ,原名 Git@OSC)是开源中国推出的基于git的代码托管服务。
国内访问GitHub速度比较慢,如果想托管自己的代码到云端,gitee是个不错的选择,华为的鸿蒙2.0源码也是放在gitee上的。
二、安装git 要使用gitee,需要先安装git工具。
git工具下载:Git - Downloads
安装完成后,在命令行输入git --version可以查看到git的版本。
右键菜单也会出现相应的菜单。
三、登录gitee 我们先在 gitee上注册账号并登录。
gitee官网:https://gitee.com/
四、生成SSH公钥 由于我们的本地 git仓库和 gitee仓库之间的传输是通过SSH加密的,所以我们需要配置SSH公钥。
注:安装了git工具,就可以使用ssh命令
打开cmd命令行,输入命令
ssh-keygen -t rsa -C "xxxxx@xxxxx.com" 注意:这里的xxxxx@xxxxx.com只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。
按照提示完成三次回车,即可生成ssh key。
可以看到,我们生成的公钥文件id_rsa.pub路径:C:\User\Adminstrator/.ssh/id_rsa.pub
进入该目录用文本编辑器打开
即可看到SSH公钥,下文中将会用到这个SSH公钥。
五、配置SSH公钥 在gitee网站点击设置
点击SSH公钥
输入公钥标题,拷贝刚刚的SSH公钥到框中,点击确定
配置成功
六、创建一个项目 点击右上角的 +号,新建仓库
如下,填写仓库信息,最后点击创建即可。
七、克隆仓库到本地 点击克隆/下载,然后点击SSH,复制git链接
接着,在本地目录空白处右键菜单,点击Git Bash Here。
输入git clone 刚刚的git链接,如下
git clone git@gitee.com:linxinfa/mytest.git 成功后,本地目录即可看到克隆下来的README文件。
八、关联本地工程到远程仓库 有时候,我们可能是先在本地有了工程文件,然后再在gitee上创建仓库的。
此时,可在本地库上使用命令 git remote add把它和 gitee 的远程库关联,如下
git remote add origin git@gitee.
前言
大多数人接触UEFI都是在PC的应用场景上,有在PC上安装过多操作系统的经历的同学,通常会进入UEFI界面设置操作系统引导顺序、CPU虚拟化等设置。UEFI诞生之初也确实是作为BIOS的替代者,主要应用在PC电脑上。随着手机/平板等移动设备的发展,高通从MSM8998开始使用UEFI替代LK(Little Kernel)作为手机的Bootloader,作为一个嵌入式开发者势必比较好奇,UEFI相比嵌入式常见Bootloader(u-boot、LK等)区别在哪?
UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)定义了操作系统和平台固件之间的接口,它是UEFI Forum发布的一种标准。它只是一种标准,没有提供实现。下面让我们通过Tianocore社区提供的EDK2源码一窥UEFI的具体实现,相比其他的Bootloader有什么优势特点。
一、UEFI入门
1. 启动过程
UEFI系统从上电到关机可分为7个阶段:SEC-> PEI-> DXE-> BDS-> TSL -> RT-> AL
开源嵌入式的Bootloader大多分两个阶段(Stage1、Stage2)。
Stage1:系统资源环境较少情况下部分硬件初始化,为Stage2准备执行环境。
Stage2:系统硬件进一步初始化,定制化功能的实现和操作系统的引导。
进行类比,SEC/PEI可以看作是Stage1,DXE/BDS/TSL可以看作是Stage2。
l SEC阶段/PEI阶段
SEC:Security Phase
PEI:Pre-EFI Initalization
顾名思义,这两个阶段的主要工作是安全校验相关和前期硬件初始化,最重要的是RAM的初始化,让后面的阶段可以执行在外置RAM中。
l DXE阶段/BDS阶段
DXE:Driver Exection Environment
BDS:Boot Device Select
DXE阶段加载各个驱动模块,驱动模块通过Protocol结构体为后续的应用功能执行提供服务,DXE驱动服务在内存中常驻。BDS实现操作系统的启动顺序的设置。
l TSL阶段
TSL:Transient System Load
OSLoader的执行阶段,一般以UEFI应用程序的形式存在。以Android系统为例,需要完成AVB校验,加载Linux Kernel到内存,解析DTB和Kernel cmdline的设置等。
高通的UEFI实现有所精简,SEC和PEI作为Stage1放到了一个Module中实现。
2. EDK2目录
EDK2根目录下很多以*Pkg命令的文件夹,称之为一个Package,是一组功能的集合。例如MdePkg是基础静态库的集合,MdeModulePkg是PEI、DXE启动过程和常见通用驱动框架服务的集合。Package下各个功能目录称之为Module,Module可编译成efi文件动态加载/卸载。
dsc和inf文件相当于是Makefile,定义了Module的编译,生成哪些efi文件,fdf文件将众多的efi文件组织打包成烧录镜像。
二、UEFI的特点
LK、u-boot等开源的Bootloader都是结构简单的轻量级系统,开发门槛低。UEFI系统虽然较为复杂,但其具有模块扩展性、多任务实现等类操作系统的特性,更易实现复杂功能,且具有较好的开发灵活性,因而高通使用UEFI替换LK作为手机的Bootloader也就不奇怪了。
1. 扩展性
UEFI-统一可扩展固件接口,可扩展性是UEFI的突出优势。这主要体现在UEFI可以动态地加载其它编译好的efi镜像,而u-boot在编译完后并不能动态地加载其它定制化的驱动或者命令。那UEFI是如何实现这一特性地呢?
DXE是UEFI的核心阶段,这一阶段初始化了Boot Services(后面简称BS),BS为后面的引导过程和应用程序的执行提供了几乎所有基础服务接口。看一下BS的结构:
BS中的提供了Image和Protocol的管理接口,Image相关接口提供了efi镜像加载&启动功能,Protocol相关接口则可以找到镜像提供的功能服务。下图描述了Image和Protocol加载到内存后的存储结构,该存储结构揭示了Portocol管理接口如何在Image中找到对应的Protocol服务:接口(HandleProtocol)传入了对应的ImageHandle,则直接通过GUID在IHANDLE的Protocols链表中查找,接口(LocateHandle)没有传对应的ImageHandle则直接在包含所有Protocol的链表中查找。
efi镜像的加载过程:
BDS跳转至TSL阶段时BS调用CoreLoadImage()函数加载TSL的efi镜像,调用过程如下:
CoreLoadImage->CoreLoadImageCommon->CoreInstallProtocolInterfaceNotify
可以看到CoreLoadImage最终申请了一个IHADNLE结构体,并将节点挂到gHandleList列表中。
而后调用CoreStartImage函数最终执行Image的EntryPoint(定义在inf文件中)。
驱动服务模块一般在ModuleEntry中将自身的Protocol注册到ImageHandle中。Protocol的管理接口如何使用就不在赘述。
2. 设备驱动模型
UEFI驱动实现了一种类Linux系统的驱动模型,实现了Host Bus、Driver和Device的架构解耦。(DXE_DRIVER可以看做是一种驱动类型的功能服务,不一定需要硬件支持)
matlab线条加粗是为了图像显示的更加清晰。我们一般会把所画的图像,插入到latex中或者word中。有些时候如果图像线条不加粗,会造成显示不清晰,下面介绍下加粗的具体方。
命令加粗 x=0:0.1:8*pi; y=sin(x); plot(x,y,'LineWidth',5) 这里plot(x,y,'LineWidth',5) 中的5表示:设置线条宽度为5,也可以设置成其他数字或者小数。
也可以直接在图片上修改,图像处于编辑模式,然后左键单击选中所画的曲线,然后右键,找到linewith,修改参数
如果需要更改颜色或者加上标记也是可以添加的,
也可以通过:file--》export setup 这里来修改,也即是修改图片输出的参数
设置好合适的参数之后,点击右侧的应用于图片
参考 MATLAB修饰线条 - 云+社区 - 腾讯云
深度神经网络加速库cuDNN简介 简介 NVIDIA® CUDA深度神经网络库 (cuDNN: CUDA Deep Neural Network ) 是用于深度神经网络的 GPU 加速基元库。它提供了 DNN 应用程序中经常出现的例程的高度调整实现:
Convolution forward and backward, including cross-correlationMatrix multiplicationPooling forward and backwardSoftmax forward and backwardNeuron activations forward and backward: relu, tanh, sigmoid, elu, gelu, softplus, swishArithmetic, mathematical, relational and logical pointwise operationsTensor transformation functionsLRN, LCN and batch normalization forward and backward cuDNN 卷积示例旨在实现与此类示例的最快的基于 GEMM(矩阵乘法)的实现具有竞争力的性能,同时使用显着更少的内存。
cuDNN 功能包括可定制的数据布局,支持灵活的维度排序、跨步以及用作其所有例程的输入和输出的 4D 张量的子区域。这种灵活性允许轻松集成到任何神经网络实现中,并避免了基于 GEMM 的卷积有时需要的输入/输出转置步骤。
cuDNN 提供了一个基于上下文的 API,可以轻松实现多线程和(可选)与 NVIDIA® CUDA® 流的互操作性。
Echarts社区已停止运营,下面存在开源网站
第一个:www.isqqw.com/#/homepage,多个分类, 可在线调试和切换版本。
第二个:http://www.ppchart.com 多个分类,可在线调试。
新增一个网址,跟之前开源社区网址很像,但是不确定是否是同一个,功能很全:www.makeapie.cn/echarts
官方最初版本,已停止运营 :https://gallery.echartsjs.com
百度收购后的开放社区版本,已停止运营:https://www.makeapie.com/explore.html
在Ubuntu系统中,每个用户执行过的命令会保存在.bash_history文件中。该文件会保存用户近期使用过的几百条命令,通过cat命令可以直接查看。
cat /home/username/.bash_history 实际使用时,上面的username替换成对应的用户名即可。
此外,还可以通过history命令来查看。
history 相比于直接cat历史文件,history命令的好处是打印输出会加上行号,看起来更清晰。
1、就是循环条件,当循环条件返回的值是一个false的时候,循环自动结束。
2、就是在循环中如果遇见break的执行,自动跳出循环结构。
3、就是在循环中遇见的是continue的时候,循环也会跳出,但是跳出的是当下的这次循环,循环跳出这次循环以后会继续进行下面的循环。
目录 一、图的定义二、图的存储方式1、邻接表2、邻接矩阵3、其他自己熟悉的方式 三、图的遍历1、广度优先遍历2、深度优先遍历 四、图的拓扑排序五、最小生成树1、概念2、kruskal算法3、prim算法 六、最短路径1、BFS求最短路径2、Dijkstra算法求单源最短路径3、Floyd算法求各定点之间的最短路径4、三种最短路径算法比较 一、图的定义 定义:图是由一组顶点和一组能够将两个顶点相连的边组成的。
二、图的存储方式 假设有这样一张图
1、邻接表 表示从该点出发能到达的直接邻居列表
2、邻接矩阵 表示每个点之间的关系(∞为无法直接到达的点)
3、其他自己熟悉的方式 如通过边与点的对象存储:(出发点,终点,边的权值)
三、图的遍历 1、广度优先遍历 利用队列实现从源节点开始依次按照宽度进队列,然后弹出每弹出一个点,把该节点所有没有进过队列的邻接点放入队列直到队列变空 //从Node出发,进行广度优先遍历 public class BFSTest { //从Node出发,进行广度优先遍历 public static void bfs(Node node) { if(node==null) { return; } Queue<Node> queue=new LinkedList<>(); HashSet<Node> set=new HashSet<>(); //记录已经访问过的节点,避免出现重复访问 queue.add(node); set.add(node); while(!queue.isEmpty()) { Node cur=queue.poll(); System.out.println(cur.value); for(Node next:cur.nexts) { //遍历当前节点能直接到达的节点 if(!set.contains(next)) { set.add(next); queue.add(next); } } } } } 2、深度优先遍历 利用栈实现从源节点开始把节点按照深度放入栈,然后弹出没弹出一个点,把该节点下一个没有进过栈的邻接点发放入栈直到栈变空 public class DFSTest { public static void dfs(Node node) { if(node==null) { return; } Stack<Node> stack=new Stack<>(); HashSet<Node> set=new HashSet<>(); stack.
文章目录 一分钟看懂IDEA中的GIT LOG视图引言:分支信息:提交历史:提交信息: 一分钟看懂IDEA中的GIT LOG视图 引言: 在日常工作中,我们通常用IDEA作为开发工具进行编码,在其中众多的插件中,GIT可以说是经常用得到,下面我们花大概一分钟时间了解下,GIT中Log视图的强大的内容。
在IDEA中的默认配置情况下,GIT的LOG视图在IDEA中的左下角,GIT的Log视图包含三部分内容,最左侧的分支信息视图,中间的提交历史和最右侧的提交信息视图。
分支信息: HEAD:表示当前工作区所指向的提交,通常与分支指针保持一致。Local: 表示本地仓库中分支列表,其实就是本地的分支的指针,叫本地是因为在本地的仓库中才会有这个指针。Remote: 表示远程仓库分支信息,实际是各个跟踪分支的信息,默认按照 ‘origin/分支名称’ 来命名。 感悟:其实这些都是指向某次提交的指针,而由提交构成的树状结构始终都是一个,只是各个指针指向的提交不一样而已。
提交历史: 这里通过三种不同的颜色图标,标记出了HEAD、Local、Remote所指向的提交,可以清醒的看出各个指向的前后顺序变化。
最左侧的提交视图是按照提交的时间顺序,依次按照分支从左至右排序。
提交信息: 这里看到具体的提交的文件内容并且可以比对前后代码的变化,下面可以看到提交的信息。
以比对前后代码的变化,下面可以看到提交的信息。
https://kalacloud.com/blog/how-to-install-nginx-on-ubuntu-20-04/
#!/bin/bash sudo apt update sudo apt install nginx
面向对象三大特性 1.多态 什么是多态 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类)好处:动态编译,类型可扩展性更强 多态存在的条件 有继承关系子类重写父类方法父类引用指向子类对象 不能重写的方法: 1.static 方法,属于类,它不属于实例:静态的方法随着类加载,不属于实例化的对象,不在堆中 2.final 常量 ,被final修饰的无法修改,属于常量池 3.private 私有方法,不能被重写 注意事项: 1.多态是方法的多态,属性没有多态性2.父类和子类,有联系才能转换,不然会异常!类型转换异常:ClassCastException3.存在条件:继承关系,方法需要重写,父类引用指向子类对象!Father f1 = new son();4.父类型的引用可以指向new出的子类型的对象,但不能调用子类中的方法,如果需要会进行强制类型转换,父类转子类后调用。5.具有继承关系的父子类,父类中的public非静态方法在子类中被重写,则用父类型的引用和子类型的引用去调用都是输出子类中重写后的方法。6.对象能执行哪些方法,主要看对象左边的类型,和右边关系不大! 1.1 多态代码演示: package oopdemo01.demo07; public class Person { public void run(){ System.out.println("老子跑了起来"); } } package oopdemo01.demo07; public class Student extends Person{ @Override //子类重写 public void run() { System.out.println("小子跑了起来"); } // 子类独有的方法,父类不能调用 public void eat(){ System.out.println("吃饭"); } } package oopdemo01.demo07; public class Application { public static void main(String[] args) { // 一个对象的实际类型是确定的,new出的是什么对象,就是什么对象 // 但可以指向的引用类型就不确定了,父类的引用指向子类 //new Student(); //new Person(); //student 子类能调用的方法都是自己的或继承父类的 Student s1 = new Student(); //父类可以指向子类,但是不能调用子类独有的方法 Person s2 = new Student(); Object s3 = new Student(); //对象能执行哪些方法,主要看对象左边的类型,和右边关系不大 s1.
目录
1--前言
2--解决方法
3--验证
4--待解决问题
5--参考
1--前言 背景:Anaconda3原安装在/home盘,现移动至/civi盘,且原/home盘的Anaconda3文件全删除。
原路径:/home/anaconda3
现路径:/civi/anaconda3
尝试了单纯修改bashrc的内容,以及建立软连接等方法均不能很好地解决问题。
2--解决方法 ①修改bashrc的内容
sudo gedit ~/.bashrc #打开bashrc文件 ##修改路径后,执行 source ~/.bashrc ②修改Conda
cd /civi/anaconda3/bin sudo gedit conda 将 #!/home/anaconda3/bin/python 修改为 #!/civi/anaconda3/bin/python
③修改conda.sh和conda.csh
cd /civi/anaconda3/etc/profile.d sudo gedit conda.sh 将前四行的内容修改为移动后的路径,类似地修改conda.csh的内容。
修改后,执行两个文件。
bash conda.sh bash conda.csh ④修改创建的conda环境的pip和pip3
cd /civi/anaconda3/envs/mmdeploy/bin sudo gedit pip 将 #!/home/anaconda3/envs/mmdeploy/bin/python 修改为 #!/civi/anaconda3/envs/mmdeploy/bin/python
类似地,修改pip3和其它conda环境的pip和pip3.
3--验证 重新打开终端,查看虚拟环境,输入:
conda env list 如果报错,请先执行:
conda init 接着测试python,和pip list等是否正常。
4--待解决问题 虽然进行上述方法能够在终端使用conda环境,但速度比以前要慢,有时还容易卡死,目前不知道问题的缘由。
5--参考 参考方法1
6--补充问题 ①今天使用you-get库下载文件时,报错误:bash: /civi/anaconda3/bin/you-get: /root/anaconda3/bin/python: bad interpreter: No such file or directory
参考 keras.utils - 云+社区 - 腾讯云
Keras utilities.
Classes class CustomObjectScope: Provides a scope that changes to _GLOBAL_CUSTOM_OBJECTS cannot escape.class GeneratorEnqueuer: Builds a queue out of a data generator.class HDF5Matrix: Representation of HDF5 dataset to be used instead of a Numpy array.class OrderedEnqueuer: Builds a Enqueuer from a Sequence.class Progbar: Displays a progress bar.class Sequence: Base object for fitting to a sequence of data, such as a dataset.class SequenceEnqueuer: Base class to enqueue inputs.
参考 keras.preprocessing.image - 云+社区 - 腾讯云
Set of tools for real-time data augmentation on image data.
Classes class DirectoryIterator: Iterator capable of reading images from a directory on disk.class ImageDataGenerator: Generate batches of tensor image data with real-time data augmentation.class Iterator: Base class for image data iterators.class NumpyArrayIterator: Iterator yielding data from a Numpy array. Functions apply_affine_transform(...): Applies an affine transformation specified by the parameters given.apply_brightness_shift(...): Performs a brightness shift.
近期开发系统过程中遇到的一个需求,系统给定一个接口,用户可以自定义开发该接口的实现,并将实现打成jar包,上传到系统中。系统完成热部署,并切换该接口的实现。
定义简单的接口
这里以一个简单的计算器功能为例,接口定义比较简单,直接上代码。
public interface Calculator {
int calculate(int a, int b);
int add(int a, int b);
}
该接口的一个简单的实现
考虑到用户实现接口的两种方式,使用spring上下文管理的方式,或者不依赖spring管理的方式,这里称它们为注解方式和反射方式。calculate方法对应注解方式,add方法对应反射方式。计算器接口实现类的代码如下:
@Service
public class CalculatorImpl implements Calculator {
@Autowired
CalculatorCore calculatorCore;
/**
* 注解方式
*/
@Override
public int calculate(int a, int b) {
int c = calculatorCore.add(a, b);
return c;
}
/**
* 反射方式
*/
@Override
public int add(int a, int b) {
return new CalculatorCore().add(a, b);
}
}
这里注入CalculatorCore的目的是为了验证在注解模式下,系统可以完整的构造出bean的依赖体系,并注册到当前spring容器中。CalculatorCore的代码如下:
第二讲:开发环境搭建 安装GCC,GDB ##安装任何软件之前,都要运行sudo apt update指令 sudo apt update #通过以下命令那装编译器和调试器 sudo apt install build -es sential gdb ##如果已经布置了docker,sudo apt update是会让当前docker停止的 安装成功的确认 ##以下命令确认每个软件是否安装成功 #如果安装成功,则显示版本号 gcc --version g++ --version gdb --version 2.2 CMake安装 ##通过以下命令安装编译器和调试器 sudo apt install cmake 安装成功确认 ##确认是否安装成功 #如果安装成功,则显示版本号 cmake --version
在开发代码过程中,某一天import org.apache.commons.lang.StringUtils报红。
现在解决办法如下。
首先要找到当前lang3包的位置。
然后右键项目-Project Structure-Libraries
找到当前jar包路径 导入即可
这样就解决了import org.apache.commons.lang.StringUtils报红的问题。
1.以管理员身份运行打开cmd 2.输入route print查看路由表 3.查看对应网卡 4.配置无线外网的DNS 5.添加永久路由 执行具体内网ip走对应的网卡16
指定0.0.0.0对应的网卡是9,代表所有ip走此外网网卡
route delete 0.0.0.0
route add -p 0.0.0.0 mask 0.0.0.0 192.168.1.1 if 9
此处9代表的是外网网卡,192.168.1.1是外网的默认网关
route add -p [ip] mask 255.255.255.0 192.168.1.1 if 16
此处16代表的是内网的网址,192.168.1.1代表的是内网的默认网关
解释:
route add -p 0.0.0.0 mask 0.0.0.0 192.168.1.1 if 9
add 添加
-p 永久添加路由
第一个0.0.0.0 所有ip数据包全部由192.168.1.1路径转发
第二个0.0.0.0是子网掩码
192.168.1.1 网关
9 端口号 是指定网卡用的
6.配合完的路由可以通过命令查看 cmd窗口输入route print
向下拉可以看到配置成功的
7.删除路由 不想用的时候删除路由
route delete 0.0.0.0
sed -n -e '/python/p' -e 'PYTHON/p' sed.txt
sed -n -f edit.sed sed.txt
sed -n -r '/python|PYTHON/p' sed.txt
sed -i 's/love/like/g' sed.txt sed -n "17p" sed.txt
sed -n "10,20p" sed.txt
sed -n "10,+5p" sed.txt
sed -n "/^root/p" sed.txt
sed -n "/^ftp/,/^mail/p" sed.txt --打印以ftp开头的行,到以mail开头的行
sed -n "4,/^mail/p" sed.txt --打印从第4行开始,直到匹配到以mail开头的行结束
sed -n "/root/,10p" --打印匹配到root的行开始,到第10行结束 查询:
1、p ------打印
删除
2、d ------删除
sed '1d' passwd
sed -i '1d' passwd
sed -i '1,3d' passwd
sed -i '/\/sbin\/nologin/d' passwd
安装ubuntu-20.04.1-live-server-amd64虚拟机 [转] 主要参考:使用VMWare安装ubuntu-20.04.1-live-server-amd64虚拟机,并使用XShell通过root用户进行SSH远程连接 - 糖果墙 - 博客园 主机设置(后面是有NAT模式)
点击vmnet8右键-》属性进行修改 然后右键禁用vmnet8,然后再右键启用Vmware客户端的配置,编辑->虚拟网络编辑器【注】 如果主机无法ping通Ubuntu虚拟机,则禁用vmnet8,然后右键启用 参考:
使用VMWare安装ubuntu-20.04.1-live-server-amd64虚拟机:使用VMWare安装ubuntu-20.04.1-live-server-amd64虚拟机,并使用XShell通过root用户进行SSH远程连接 - 糖果墙 - 博客园Ubuntu20.04开启root账户: Ubuntu20.04开启root账户_缀梦的博客-CSDN博客_ubuntu20.04开启root登录镜像源:Ubuntu20.04软件源更换 - 知乎 安装步骤:
这里光标调到第二项,把动态分配的IP改成静态的,也可以后面系统安装完了进行入系统以后再改;这里是选择后者。 这里的代理地址一定要改,后面的安装会用到网络下载一些软件的依赖。如果不改的话,后面下载就会特别慢。 到了分区的步骤了,如果大家嫌麻烦可以跟我一样选第一个,然后下面的 LVM的选项勾一下,这个LVM是磁盘扩容技术,在生产环境中可是很重要的,当一个我们部署的应用把一个硬盘写满了的时候。如果没有用这个技术的话,只能暂停服务,更改应用写的路径,或者将原数迁移到一个更大的硬盘中之后,再将更大的硬盘替换掉原来的硬盘,这个过程非常麻烦,用了LVM之后就可以对几块个硬盘挂在到应用相同的写路径下面,从而完成了动态扩容。所以推荐大家勾上。 这里无论是用户选择了自主分区还是系统默认分区都会显示一个最后的分区结果 到这一步就会弹出一个确认框,这里需要注意了,一旦点继续了就意味着不能回退了,如果前面有哪一项没有配置妥当,就只能全部重来了。 这里自己看着办吧,自己玩儿密码还是简单点好,忘了可就得不偿失,只能重装了。 这个选项必勾,是后面使用XShell或者其他工具进行SSH连接的前提。 这里可以根据需求勾选需要用到的软件,我为了系统的精简和干净就没勾。 到这里了等待一会儿就行了,网速快的话,估计分分钟就好了 出现绿色的reboot选项,说明系统就装好了,重启即可 重启之后如果进入不去系统就把光驱的连接手动断开 看 虚拟机-》可以移动设备-》CD/DVD 是否勾选,若勾选则关闭重启后,输入刚才设置的账号密码就能登录成功,就可以进入Ubuntu应用的部署了 参考:VM Ubuntu18.04 设置静态ip(NAT模式) Ubuntu-20.04-server的NAT8静态网络配置及连接互联网 :Ubuntu-20.04-server的NAT8静态网络配置及连接互联网_柳城伤的博客-CSDN博客Ubuntu20.04 NAT 网络配置_艺俊的博客-CSDN博客_ubuntu20.04网络配置Ubuntu18 安装ubuntu-18.04.5-live-server-amd64 安装及更新介绍 - 西瓜君~ - 博客园下面是Ubuntu18的静态配置: # This is the network config written by 'subiquity' network: version: 2 renderer: networkd ethernets: ens33: dhcp4: no addresses: - 192.
Django 对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用API,可以根据不同的业务需求选择不同的数据库。 如需了解更多,请访问: https://www.emperinter.info/2022/05/29/django-models/
ORM 概述 对象-映射-模型 任务 根据对象的类型生成表结构将对象、列表的操作转换为sql语句将SQL语句查询的结果转换为对象、列表 优点 极大的减轻了开发人员的工作量,不需要面对因数据库的变更而修改代码 流程 配置数据库 在__init__.py文件中添加选定的数据库Package。 import pymysql pymysql.version_info = (2,0,3,"final",0) pymysql.install_as_MySQLdb() 在settings.py文件中修改数据库配置。 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'sunck', # 数据库名 'USER': 'sunk', # 数据库用户名 'PASSWORD': 'sunk', # 数据库密码 'HOST': 'localhost', # 数据库主机 'PORT': '3306', # 数据库端口 } } 在models.py 添加模型类 一个模型类都在数据库中对应一张表 定义模型 模型、属性、表、字段间的关系 一个模型类在数据库中对应一张表模型类中定义的属性,对应模型对照表中的字段 定义属性 概述 Django根据属性的类型确定以下信息 当前选择的数据库支持字段的类型渲染管理表单时使用的默认html控件在管理站点最低限度的验证 Django会为表增加自动增加的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则Django不会再生成默认的主键列。属性命名限制 不能是Python的保留关键字(遵循标识符命名规则)由于Django的查询方式,不允许使用连续的下划线 库 定义属性时,需要字段类型,字段类型被定义再django.db.modles.fields目录下,为了方便使用,被导入到django.db.modles中使用方式: 导入from django.db import models通过modles.Field创建字段类型的对象,赋值给属性 逻辑删除 对于重要数据都做逻辑删除 ,不能做物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False。 字段类型 字段类型说明AutoField一个根据实际ID自动增长的IntergerField,通常不指定,如果不指定一个主键字段将自动添加到模型中CharField(max_length=字符长度)字符串,默认的表单样式是TextInputTextField大文本字段,一般超过4000字节使用,默认的表单控件是textAreaIntegerField整数DecimalFiled(max_digits=None,decimal_places=None)使用Python的Decimal实例表示的十进制浮点数,max_digits表示位数总数,decimal_places表示小数点后的数字位数。[[精确的浮点运算-Decimal]]FloatField用Python的Float实例来表示的浮点数BooleanFieldtrue/false字段,此字段的默认表单控制是CheckboxInputNullBolleanField支持null、true、false三种值DateField([auto_now=False,auto_now_add=False])使用Python的Datetime.
日常开发中我们在一个接口中需要处理多个任务,通常都是串行的,这样导致接口的响应时间是每个任务的执行时间的总和。为了缩短响应时间,通常会使用异步处理多任务。
需求举例:查询书籍基本信息,书籍详细信息,作者信息并将结果数据返回。
假设查询书籍基本信息花费500毫秒,查询书籍详细信息花费500毫秒,查询作者信息花费500毫秒,共计1500毫秒,使用异步处理时间一般都是远小于1500毫秒的。
下面使用异步调用方式优化接口
1、异步任务类 实现 Callable 接口,用来处理带返回结果的任务。taskId 用来区别返回结果集数据
package com.example.demo.task; import java.util.concurrent.Callable; /** * 异步任务 * @param <T> */ public class AsynTaskCallable<T> implements Callable<T>{ private String taskId; private Callable<T> task; public AsynTaskCallable(String taskId, Callable<T> task) { this.taskId = taskId; this.task = task; } @Override public T call() throws Exception { T callResult = task.call(); TaskResult result = new TaskResult(); result.setTaskId(taskId); result.setData(callResult); return (T) result; } } 2、异步任务调用类 用来调用异步任务辅助类,completionService 用来指定线程池执行异步任务,tasks 为带返回结果的任务,可以实现多场景复用,减少重复编写相似的代码。
centos服务器永久开启端口 1.查看防火墙状态 systemctl status firewalld.service // 查看 systemctl start firewalld // 开启 systemctl stop firewalld // 关闭 2.查看端口情况 firewall-cmd --list-all 3.打开端口 firewall-cmd --add-port=80/tcp --permanent 4.重启防火墙 sudo firewall-cmd --reload
刚学 route 和 router 的时候一脸的雾水,明明相差一个字母,难道不一样吗?后来随着学习的深入,发现还真的不一样,哈哈哈,一起来看看吧!!!
router为VueRouter的实例,相当于一个全局的路由器对象,里面含有很多属性和子对象,例如history对象。经常用的跳转链接就可以用this.$router.push,和router-link跳转一样。
route相当于当前正在跳转的路由对象。每一个路由都会有一个router对象,可以从里面获取name,path,params等。
1.route 通过 $route.params 获取动态路由参数 在动态路由渲染出来的组件中,可以使用 this.$route.params 对象访问到动态匹配的参数值。this.$route 里面存放的是当前页面路由的相关信息。 2.router vue-router 提供了许多编程式导航的 API,其中最常用的导航 API 分别是: ① this.$router.push('hash 地址') 跳转到指定 hash 地址,并增加一条历史记录 ② this.$router.go(数值 n) 实现导航历史前进、后退
面向对象三大特性 1.封装 引言 在我们的项目中只有一个实现类main,在main中将类实例化为对象,通过对象来调用类中的方法,属性,有参与无参构造函数,对私有属性private的访问get/set方法在类中具有方法,属性,有参与无参构造函数,对私有属性private的访问get/set方法 该露的露,该藏得藏 我们程序设计要追求 “高内聚,低耦合”。高内聚就是将类的内部数据操作细节自己完成,不允许外部干涉;低耦合:尽量暴露少量的方法给外部使用。 封装(数据的隐藏) 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。 通过private 达到属性私有;通过 get / set来访问数据 ; 有时候我们可在set方法中做一些数据安全性的判断。 封装的好处: 1.提高程序的安全性,保护数据2.隐藏代码的实现细节3.统一接口4.系统可维护性增加了 1.1 封装代码演示: package oopdemo01; import oopdemo01.demo03.Pet; import oopdemo01.demo04.Student; public class Application { public static void main(String[] args) { Student s1 = new Student(); System.out.println(s1.getName());//null s1.setName("小明");//通过get/set方法来给实例化后的对象的某些私有属性赋初值 s1.setAge(100);//不合法 System.out.println(s1.getName());//输出快捷键:s1.getName().sout+回车 System.out.println(s1.getAge()); } } package oopdemo01.demo04; public class Student { //类 private:属性私有 private String name;// 名字 private int age; // 年龄 private int id; // 学号 private char sex; // 性别 public void study(){ } //提供一些可以操作这个属性的方法 //public的get,set方法 // set/get 快捷键 Alt+insert 选get and set 按住Ctrl加鼠标是多选 //get 获得这个数据 public String getName(String name){ return name; } // set 给这个数据设置值 public void setName(String name){ this.