python中int变量定义x y_Python-变量与基础数据类型

·变量(variable) 笔记: 变量本质上是一个占位符。变量可以用来存储整数、字符串、列表等。简单的可以理解为一个座位,可以坐老人也可以坐小孩,可以坐男孩,也可以坐女孩。 在python里,标识符(identifier)由字母、数字、下划线组成。 在python中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。python中的标识符是区分大小写的。 以下划线开头的标识符是有特殊意义的。以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如__init__()代表类的构造函数。 @ 变量的命名规则: 变量名只能包含字母、数字、下划线: 如:my_car,fly_air 变量不能包含空格、不能以数字打头: 如:bas ic,6car,7fly 变量不能是Python关键字、函数名: 如:def,class,print等 python中包含的全部保留字: import keyword #导入模块 print(keyword.kwlist) 打印结果: ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] @ 命名规则拓展 大驼峰:每个单词第一个字母均大写: 如:MyCar,StudyBasic,FlyAir #适用于类命名 小驼峰:第一个单词大写: 如:Mycar,Studybasic、,lyair #适用于函数命名 posix命名法:单词全部小写,且所有单词之间以下划线连接: 如:my_car,fly_air

python游戏代码运行不了_PYTHON游戏编程----敲入ENTER键后游戏开始(加入按键游戏不动,去掉游戏运行)...

from tkinter import * import time import random class Ball: def __init__(self, canvas, paddle, color): self.canvas = canvas self.paddle = paddle self.id= canvas.create_oval(10, 10, 25, 25, fill=color) canvas.move(self.id, 245, 100) randirect = [-3, -2, -1, 1, 2, 3] random.shuffle(randirect) self.x = randirect[0] self.y = -1 self.window_height = self.canvas.winfo_height() self.window_width = self.canvas.winfo_width() self.hit_bottom = False def hit_paddle(self, pos): paddle_pos = self.canvas.coords(self.paddle.id) if paddle_pos[0] <= pos[2] and pos[0] <= paddle_pos[2]: if paddle_pos[1] <= pos[3] and pos[3] <= paddle_pos[1]:

d3 svg path添加文本_dagre-d3绘制流程图实用指南

写在前面 之前有小伙伴问我如何使用 D3 在前端绘制流程图,今天在这里给安排上,与大家分享。 明确一点,只要你的数据计算能力足够强,使用原生D3绘制流程图绝对可以的,但是,为了让大家更容易上手,避免重复造轮子,给大家推荐一个专门绘制流程图的 D3 插件 dagre-d3。 首先认识下 dagre。dagre 是专注于有向图布局的 javascript 库,由于 dagre 仅仅专注于图形布局,需要使用其他方案根据 dagre 的布局信息来实际渲染图形,而 dagre-d3 就是 dagre 基于 D3 的渲染方案。 dagre 项目地址: dagrejs/dagre​github.com dagre-d3 项目地址: dagrejs/dagre-d3​github.com 下面使用 D3 与 dagre-d3 绘制新冠疫情期间的流动人员检测流程图,老规矩先上效果图。 绘制基本流程图 数据准备 流程图作为一种有向图,与树图、网络图一样,数据由节点以及两点之间的边组成。 let 绘图 使用 dagre-d3 绘制流程图分为以下个步骤 引入 d3.js 以及 dagre-d3.js 两个文件。使用 dagre-d3 创建 Graph 对象,并添加节点和边。创建渲染器并在 svg 上绘制流程图。 //引入 d3,dagre-d3 这样,前面的流程图就绘制出来了,如此简单,赶紧动手试一试! 如果你的需求远不止如此,要绘制更加高级的流程图,那么,还需要了解一下 dagre 里的基本概念以及相关配置项,深入掌握 dagre 与 d3-dagre 。 基本概念 dagre 是基于《A Technique for Drawing Directed Graphs》[1] 的理论实现图布局的。这篇文章的理论包含了以下5个重要概念:

计算加减乘除混合运算python实现_python,实现计算器程序,加减乘除混合运算加括号,完善实现...

importre#detect error input s = input("Expression:") s= re.sub('\s',"",s)if re.findall('[^0-9\+\-\*/\)\(]',s):print("Error input,Stop!") exit()defjudge1(sign):if sign == '*': obj= re.compile('\*')elif sign == '/': obj= re.compile('/')return(obj)defjudge2(sign):if sign == '+': obj= re.compile('\+')elif sign == '-': obj= re.compile('\-')return(obj)defFormat(s): s= s.replace(' ','') s= s.replace('++','+') s= s.replace('+-','-') s= s.replace('-+','-') s= s.replace('--','+')return(s)defcalculate(s):while re.search('[\*,/]',s): s=Format(s) obj= judge1(re.search('[\*,/]',s).group()) res=obj.split(s) first= re.search('[\d,\.]+$',res[0]).group() second= re.search('^[\d,\.,\-]+',res[1]).group()if re.search('\.',first): fir=float(first)else: fir=int(first)if re.search('\.',second): sec=float(second)else: sec=int(second)if re.search('[\*,/]',s).group() == '*': result= str((fir *sec)) s= re.sub('%s\*%s'%(first,second),result,s)print('s=',s)elif re.search('[\*,/]',s).group() == '/': result= str(fir /sec)

【Python基础】random.shuffle()的用法

函数用法 random.shuffle()用于将一个列表中的元素打乱顺序,值得注意的是使用这个方法不会生成新的列表,只是将原列表的次序打乱。 代码案例 # shuffle()使用样例 import random x = [i for i in range(10)] print(x) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] random.shuffle(x) print(x) [2, 5, 4, 8, 0, 3, 7, 9, 1, 6] 源码及注释 def shuffle(self, x, random=None): """Shuffle list x in place, and return None. 原位打乱列表,不生成新的列表。 Optional argument random is a 0-argument function returning a random float in [0.0, 1.0); if it is the default None, the standard random.

Win10家庭版出现了Windows Defender 安全中心提示:windows defender 页面不可用解决办法

win10系统:你的IT管理员已经限制对此应用一些区域的访问 解决方法 Win10家庭版出现了Windows Defender 安全中心提示:windows defender 页面不可用,你的IT管理员已经限制对此应用一些区域的访问,你尝试访问的项目不可用。有关详细信息,请与你的IT支持人员联系。 话说电脑基本都是自己用,win10竟然提出如此无理的要求,也罢,先不管他,本文中winwin7给大家分享介绍下win10系统:你的IT管理员已经限制对此应用一些区域的访问 解决方法! win10系统:你的IT管理员已经限制对此应用一些区域的访问 解决方法: 1、首先我们先按下win+s打开Cortana,在框中输入命令提示符,右键管理员身份运行; 2、急着在命令提示符中复制下面这段代码:reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender" /v "DisableAntiSpyware" /d 1 /t REG_DWORD /f 按下回车键,显示操作成功完成。 3、等待上一条命令执行完毕后接着输入:reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender" /v "DisableAntiSpyware" /d 0 /t REG_DWORD /f 同样按下回车键执行即可! 关闭计算机,重新打开计算机,问题解决。 通过以上步骤3个步骤进行操作即可完成修复,解决windows defender出现限制的故障了~ 最后的终极大招,如果上述操作都无法解决问题的话,请再最后试试下面这个办法: 新建一个文本文件,将下面这部分内容复制进去。 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender] "DisableAntiSpyware"=dword:00000000 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection] "DisableBehaviorMonitoring"=dword:00000000 "DisableIOAVProtection"=dword:00000000 "DisableOnAccessProtection"=dword:00000000 "DisableRealtimeMonitoring"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService] "Start"=dword:00000002 然后Ctrl+S保存,关闭该文本文件,修改文件扩展名为reg,双击运行即可。 懒得复制的同学请直接下载:https://download.csdn.net/download/anmin8888/16675280

ansible 普通用户执行root权限操作

https://blog.csdn.net/qq_35702095/article/details/90486379?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242 ansible 普通用户执行root权限操作 熟悉开机关机重启 2019-05-23 19:53:05 8757 收藏 6 分类专栏: ansible 文章标签: ansible root 版权 ansible -h可以看到有 --become (-b) --become-method --become-user --ask-become-pass (-K)大写K 四个参数,利用这四个参数可以在ansible命令和playbook中用普通用户执行root操作。 命令: ansible 10.12.3.27,10.31.2.38 -m shell -a 'date' -b --become-method su --become-user root --ask-become-pass(-K)大写K 输入密码后,相当于用root执行了date命令,可以把date换成 cat /etc/shadow验证root权限。 多个ip(主机列表)的主机需要相同的root密码(只用输入一次),密码不同可以分多次或者直接配好密码。 如果想配好密码,可以在/etc/ansible/hosts为每个机器添加密码或者为组添加密码。例如: [groupa] 10.10.10.1 ansible_become_pass=rootpwd1 10.10.10.2 ansible_become_pass=rootpwd2 [groupb] 10.10.10.3 10.10.10.4 [groupb:vars] ansible_become_pass=rootpwd34 如果失败可能是ssh过去后,执行su -后没有提示输入密码,应该是编码问题,在受控机器上执行echo export en_CN.utf-8 >>~/.bashrc,然后再执行ansible命令试试。 playbook: --- - hosts: 10.12.3.28,10.12.3.27 become: yes become_user: root become_method: su tasks:

这里告诉你到底该怎么区分java的==和equals

这里告诉你到底该怎么区分java的==和equals 网上总有一些迷惑性文章,说了半天我也是没能理解。 == 是比较内存地址的。只要记住这个就行了。 equals是用户自己的。在很多情况下== 和eqals是等价的 因为 在java中Object是所有类的祖宗,所有类都继承了它。所以在任何一个没有重写equals方法的类里,且它的父类中除Object外都没写。那么==和equals是等价的。因为Object的equals是下面这个样子的: //这个是Object的源码,equals方法 public boolean equals(Object obj) { return (this == obj); } 还是 == 。-_-! 所以equals是java给我们用户自己写的判等。也就是你可以在你的类中这么干: @Override public boolean equals(Object obj) { return true; } 不管你的实例equals谁都会true。 这也是为什么在java中string要想判断相等要用equals。因为String里的equals是这个样子的: //java的String的equals的源码 public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.

定义学生类包含姓名和成绩两个数据成员,重载比较运算符(按成绩和按姓名两个模式比较)和输出运算符

C++模板【定义学生类包含姓名和成绩两个数据成员,重载比较运算符(按成绩和按姓名两个模式比较)和输出运算符】 · 完整代码 实现下列功能。 1)定义学生类包含姓名和成绩两个数据成员,重载比较运算符(按成绩和按姓名两个模式比较)和输出运算符。 2)实现greater_than函数模板,用于比较两个对象的大小,如果a>b,返回true,否则返回false。 3)实现less_than函数模板,用于比较两个对象的大小,如果a<b,返回true,否则返回false。 4)实现Print函数模板,用于打印一维数组。 5)实现冒泡排序的函数模板,输入参数是数组、数组大小和用于比较的数组元素的函数指针。 void bubble_sort(T arr[], int len, bool(*compare)(T&, T&)); //学生类部分 enum SortType{ BY_SCORE,BY_NAME }; static SortType sort_type ; class Student{ public: Student(string name, int score):name_(name),score_(score){ } bool operator > (const Student& rhs){ if(sort_type == BY_SCORE){ if(score_>rhs.score_){ return true; } return false; } else if(sort_type == BY_NAME){ if(name_>rhs.name_){ return true; } return false; } } bool operator < (const Student& rhs){ if(sort_type == BY_SCORE){ if(score_<rhs.

python连接数据库mysql失败_python操作MySQL数据库报错问题解决

#coding:utf8 '''定义对mysql数据库操作的封装 1、包括基本的单条语句操作,如删除、修改、插入 2、独立地查询单条、多条数据 3、独立地添加多条数据''' importlogging, os, pymysqlfrom public importconfigclassOperationDbInterface(object):#定义初始化数据库连接 def __init__(self, host_db='127.0.0.1', user_db='root', password_db='123456', name_db='interface_test', port_db=3306, link_type=0):''':param host_db: 数据库服务主机IP :param user_db: 数据库连接用户名 :param password_db: 数据库密码 :param name_db: 数据库名称 :param port_db: 数据库端口号,整型数据 :param link_type: 连接类型,用于设置输出数据是元祖还是字典,默认是字典,link_type=0 :return:游标''' try:if link_type ==0:#创建数据,返回字典 self.conn = pymysql.connect(host=host_db, user=user_db, password=password_db, db=name_db, port=port_db, charset='utf8', cursorclass=pymysql.cursors.DictCursor)else:#创建数据库,返回元祖 self.conn = pymysql.connect(host=host_db, user=user_db, password=password_db, db=name_db, port=port_db, charset='utf8') self.cur=self.conn.cursor()print("输出:%s" %self.cur)exceptpymysql.Error as e:print("创建数据库连接失败|Mysql Error %d: %s" % (e.args[0], e.args[1])) logging.basicConfig(filename=config.src_path + '/log/syserror.log', level=logging.

Spring Bean 如何重新注入?

故事背景: 以spring cache redis为例,Nacos配置中心配置了cacheManager的ttl参数,以@NacosValue的形式注入并配置为cacheManager的参数。 了解spring cache的朋友们应该明白,这里的cacheManager是spring初始化时初始化的一个Bean,这个Bean在初始化时从Nacos获取了一个ttl参数并配置在这个Bean上。 需求: 修改Nacos的配置,cacheManager自动更新,使得ttl这bean能够刷新。 实现思路: 通过事件监听机制,监听到Nacos配置变更的动作:实现ApplicationListener接口,实现其方法onApplicationEvent(NacosConfigReceivedEvent event) 。在监听接口中解析nacos配置内容。从配置内容取出ttl参数。通过spring的ApplicationContext取出DefaultListableBeanFactory,使用DefaultListableBeanFactory移除cacheManager这个bean。加入新参数ttl,重新生成cacheManager Bean,并放入spring容器中。 4,5不好描述,参考代码如下: DefaultListableBeanFactory autowireCapableBeanFactory = (DefaultListableBeanFactory )ApplicationContextUtil.getContext().getAutowireCapableBeanFactory(); autowireCapableBeanFactory.removeBeanDefinition(beanName); AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(implBeanClz).getBeanDefinition(); autowireCapableBeanFactory.registerBeanDefinition(beanName,beanDefinition);

matlab模拟传感器节点_「实例」西门子Smart的模拟量编程

1.普通模拟量模块接线 模拟量类型的模块有三种:普通模拟量模块、RTD模块和TC模块。普通模拟量模块可以采集标准电流和电压信号。其中,电流包括:0-20mA、4-20mA两种信号,电压包括:+/-2.5V、+/-5V、+/-10V三种信号。注意:S7-200 SMART CPU普通模拟量通道值范围是0~27648或-27648~27648。普通模拟量模块接线端子分布如下图1 模拟量模块接线所示,每个模拟量通道都有两个接线端。 图1 模拟量模块接线 模拟量电流、电压信号根据模拟量仪表或设备线缆个数分成四线制、三线制、两线制三种类型,不同类型的信号其接线方式不同。四线制信号指的是模拟量仪表或设备上信号线和电源线加起来有4根线。仪表或设备有单独的供电电源,除了两个电源线还有两个信号线。四线制信号的接线方式如下图2模拟量电压/电流四线制接线所示。 图2 模拟量电压/电流四线制接线 三线制信号是指仪表或设备上信号线和电源线加起来有3根线,负信号线与供电电源M线为公共线。三线制信号的接线方式如下图3 模拟量电压/电流三线制接线所示。 图3 模拟量电压/电流三线制接线 两线制信号指的是仪表或设备上信号线和电源线加起来只有两个接线端子。由于S7-200 SMART CPU模拟量模块通道没有供电功能,仪表或设备需要外接24V直流电源。两线制信号的接线方式如下图4 模拟量电压/电流两线制接线所示。 图4 模拟量电压/电流两线制接线 不使用的模拟量通道要将通道的两个信号端短接,接线方式如下图5 不使用的通道需要短接所示。 图5 不使用的通道需要短接 2. RTD模块接线 RTD热电阻温度传感器有两线、三线和四线之分,其中四线传感器测温值是最准确的。S7-200 SMART EM RTD模块支持两线制、三线制和四线制的RTD传感器信号,可以测量PT100、PT1000、Ni100、Ni1000、Cu100等常见的RTD温度传感器,具体型号请查阅《S7-200 SMART系统手册》。S7-200 SMART EM RTD模块还可以检测电阻信号,电阻也有两线、三线和四线之分。EM RTD模块的接线方法如下图6 传感器RTD/电阻信号接线所示。 图6 RTD传感器/电阻信号接线 3. TC模块接线 热电偶测量温度的基本原理是:两种不同成份的材质导体组成闭合回路,当两端存在温度梯度时回路中就会有电流通过,此时两端之间就存在电动势。S7-200 SMART EM TC模块可以测量J、K、T、E、R&S和N型等热电偶温度传感器,具体型号请查阅《S7-200 SMART系统手册》。TC模块的接线说明参考图7 TC信号接线。 二.模拟量模块编程详细介绍 1.组态模拟量输入 单击"系统块"(System Block) 对话框的"模拟量输入"(Analog Inputs) 节点为在顶部选择的模拟量输入模块组态选项。 图1.模拟量输入设置窗口 对于每条模拟量输入通道,都将类型组态为电压或电流。为偶数通道选择的类型也适用于奇数通道:为通道 0 选择的类型也适用于通道 1 ,为通道 2 选择的类型也适用于通 道 3 。然后组态通道的电压范围或电流范围。可选择以下取值范围之一:● +/- 2.5v ● +/- 5v ● +/- 10v ● 0 - 20mA(电话/微信:17888133330)

mysql between and 包含边界吗_MySQL | SQL语法(一)

本篇使用的数据库管理工具是Navicat for MySQL,以3个数据源表table1,table2,table3为例,简单举例陈述SQL中数据查询语言的使用。 一、DB、DBMS与SQL DB(Database),即数据库,相当于一个仓库,用于有组织地存储数据。 DBMS(Database Management System),即数据库管理系统,用于操作和管理数据库。主要分为两大类:RDBMS、NoSQL。 RDBMS:关系型数据库管理系统,主要实现对结构化数据的管理,为二元关系模型。如Oracle、MySQL、SQL Server、DB2等。NoSQL:非关系型数据库管理系统,弥补关系型数据库管理系统的不足。如Redis、MongoDB等。 SQL(Structured Query Language),即结构化查询语言,是关系型数据的一门通用语言,用于实现对数据库的查询、更新和管理。其语言主要分为四个部分:DDL、DML、DCL和DQL。 DDL(Data Definition Language),数据定义语言,它用来定义我们的数据库对象,包括数据库、数据表和列。通过使用DDL,我们可以创建、删除和修改数据库及表结构。DML(Data Manipulation Language),数据操作语言,我们用它操作和数据库相关的记录,比如增加、删除、修改数据表中的数据。DCL(Data Control Language),数据控制语言,我们用它来定义访问权限和安全级别。DQL(Data Query Language),数据查询语言,我们绝大多数情况下都是在和查询打交道,因此学会编写正确且高效的查询语句非常重要。 三者的关系是:数据库管理系统(DBMS)使用SQL语句管理数据库(DB)。注:所有的DBMS使用的SQL语句基本相同,只存在个别不兼容。 二、DQL:数据查询语言 1.查询表中所有的数据 select * from table_name select Navicat for MySQL运行结果如下: *代表所有列,table_name代表表的名称,结果显示table1中全部35条数据。 2.查询表中指定字段的数据 select column1,column2,... from table_name select Navicat for MySQL运行结果如下: 3.按条件查询表中的数据(单一条件) select * from table_name where column 运算符 value select Navicat for MySQL运行结果如下: 4.按条件查询表中的数据(组合and) select * from table_name where column1 运算符 value1 and column2 运算符 value2

SpringBoot项目引入token设置

一. 先了解熟悉JWT(JSON Web Token) 看这些介绍、结构之类的,确实挺无聊的;想直接进入主题的话,就跳过第一大步。望各位同仁给出相关意见,以备我来更加深入的学习。 1. JSON Web Token是什么鬼? 这个东西,反正理解成一个标准就行了,啥标准我也不知道。反正就是用于各种信息的安全性传输。 1. JSON Web令牌应用的场景 1.授权,在用户登录后会给用户一个token,在用户后续的所有请求后台资源的操作都将携带这个token,只有被token允许的操作才能执行。 2.信息交换,应用于各种数据信息交换的场景;目前这种场景我也没有涉及到过,嘿嘿! 2. JSON Web令牌结构 JSON Web Tokens由dot(.)分隔的三个部分组成:Header、Payload、Signature; 因此token的形式是: xxxxx.yyyyy.zzzzz 2.1 Header 标头通常由两部分组成:令牌的类型,即JWT,以及正在使用的签名算法,例如HMAC SHA256或RSA。 { "alg": "HS256", "typ": "JWT" } 然后,这个JSON被编码为Base64Url,形成JWT的第一部分 2.2 Payload 这一部分是声明,有三种类型:注册,公开和私有声明; 注册 这些是一组预定义声明,不是强制性的,但建议使用,以提供一组有用的,可互操作的声明。其中一些是:iss (issuer), exp (expiration time), sub (subject), aud(audience)等 注:请注意,声明名称只有三个字符,因为JWT意味着紧凑。公开 这些可以由使用JWT的人随意定义。但为避免冲突,应在 IANA JSON Web令牌注册表中定义它们,或者将其定义为包含防冲突命名空间的URI私有 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息 payload示例: { "sub": "1234567890", "name": "John Doe", "admin": true } 然后,payload经过Base64Url编码,形成JSON Web令牌的第二部分 请注意:对于签名令牌,此信息虽然可以防止被篡改,但任何人都可以读取。除非加密,否则不要将秘密信息放在JWT的payload或header中。 2.3 Signature 要创建签名部分,必须采用 header, payload, secret,标头中指定的算法,并对其进行签名。

Docker Swarm集群管理

文章目录 1. 简介2. 架构3. Swarm的核心概念2.1 集群2.2 节点2.3 服务和任务2.4 负载均衡 4. Swarm的工作模式4.1 node4.2 Service4.3 任务与调度4.4 服务副本与全局服务 5. Swarm的调度策略6. Swarm Cluster模式特性7. Swarm安装8. Swarm集群搭建8.1 创建新集群8.2 查看集群状态和节点信息8.3 添加工作节点到集群8.4 更改节点的availablity状态8.5 发布服务到集群8.6 在Swarm中动态扩展服务(scale)8.7 更新服务8.8 节点管理 1. 简介 Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。 Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。 从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。 Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。 2. 架构 docker swarm是docker官方提供的一套容器编排系统,是Docker公司推出的官方容器集群平台。基于 Go语言实现。它的架构如下:

no suitable HttpMessageConverter found for response type 异常

报错: org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [...] and content type [text/html;charset=utf-8] 解决办法: HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "text/html;charset=utf-8"); HttpEntity requestEntity=new HttpEntity<>(headers); RestTemplate restTemplate = getRestTemplate(timeOut); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setSupportedMediaTypes(Arrays.asList(MediaType.ALL)); restTemplate.getMessageConverters().add(0, converter); ResponseEntity baseResultVOResponseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, //返回值类型 new ParameterizedTypeReference<ResponseDTO<SomeResponseDTO>>() { }); } private static RestTemplate getRestTemplate(Integer timeout) { SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setConnectTimeout(timeout); return new RestTemplate(requestFactory); }

Linux用户/用户组/权限相关命令

1. 用户组的管理 1.1 cat /etc/group 查看用户组 命令:cat /etc/group 查看所有的用户组备注:/etc/group是用户组存放的地址 名词解释组名组名是用户组的名称,由字母或数字构成。与/etc/passwd中的登录账号重复口令口令字段存放的是用户组加密后的口令字。一般为空或x组标识号组标识号与用户标识号类似,也是一个整数,被系统内部用来标识组,又称GID 以kmem: x: 9为例,kmem是组名,9是组ID,自动生成,修改组名后ID不变 1.2 增加/修改/删除用户组 含义格式举例增加用户组groupadd 组名groupadd test21修改用户组groupmod –n 新组名 旧组名groupmod –n test2121 test21删除用户组groupdel 组名groupdel test2121 2. 用户管理 2.1 cat /etc/passwd 查看用户 命令:cat /etc/passwd 用户字段说明 字段说明用户名代表用户账号的字符串,通常长度不超过8个字符,登录名中不能使用冒号,因为冒号在这里是分隔符。为了兼容起见,还应包含点字符,且不能使用连字符(-)和加号开头口令存放着加密后的用户口令字,存放一个特殊的字符,例如x或*,加密后的用户口令字存放在/etc/shadow文件中用户标识号是一个整数,系统内部用它来标识用户,一般情况下它与用户名是一一对应的组标识号字段记录的是用户所属的用户组,它对应着/etc/group文件中的一条记录 2.2 useradd 增加用户 格式 useradd 用户名 –c 用户描述 –g 所属用户组 备注:所属用户组可以是组名,也可以是组ID 参数 参数含义-c指定一段注释性描述-g指定用户所属的用户组 备注 -c和-g都可以不加,当只使用useradd创建一个用户名时,此用户名不属于已有的任何组,系统会自动创建一个和用户名同名的组 举例 useradd test1 –c danshiju –g test21(创建一个属于test21用户组的test1用户,用户的描述是danshiju) 2.3 usermod 修改用户 参数格式含义-lusermod –l 新用户名 旧用户名指定一个新账号,即将原来的用户名改为新的用户名-cusermod –c 新描述 用户名修改描述-gusermod –g 新用户组 用户名修改用户所属的用户组 2.

关于\x开头的字符串编码转换中文解决方法

做爬虫可能经常遇到爬取到的数据存在编码问题,简直让人头疼,比如爬取到的是这样的: 例如: \xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c 中文是: 你好世界 上面这个是utf-8编码,但数据类型是字符串类型,而不是bytes类型的utf-8编码。 这样会导致一个结果:如果直接输出,显示的是乱码,也不能使用decode进行utf-8解码得到中文。 在python2中,中文指定utf-8格式,字符串存入内存就是utf-8编码格式,直接输出就是中文,就不存在这个问题; 而python3中,字符串存入内存是以unicode编码格式存入的,输出的是默认的utf-8编码格式,所以得到的是乱码。 可能有人会说,既然得到的是utf-8编码,在前面加上 " b " ,字符串就是bytes类型了,再利用decode进行解码不就可以得到中文吗?但显然,这是行不通的,你不可能去手动一个个添加,那有没有其他方法呢? 答案肯定是有的,既然知道这个字符串是utf-8编码的,那么我换种方式,只要将字符串中的 " \x " 改为 " % " 利用urllib中的unquote方法解码就可以得到中文了,因为url中的中文utf-8编码和这里的区别就是url中编码是%开头。 那么其实只要对utf-8字符串反向转换就行,先将字符串编码指定为unicode_escape s = '\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c' s = s.encode('unicode_escape') 得到bytes类型数据(单斜杠变成双斜杠) b'\\xe4\\xbd\\xa0\\xe5\\xa5\\xbd\\xe4\\xb8\\x96\\xe7\\x95\\x8c' 接着再对bytes类型进行utf-8解码,得到字符串,将字符串中的 " \x " 替换为 " % " ss = s.decode('utf-8').replace('\\x', '%') 替换作用就是将字符串改为url的utf-8编码格式 %e4%bd%a0%e5%a5%bd%e4%b8%96%e7%95%8c 最后利用urllib中的unquote方法将url编码解码,得到中文 un = parse.unquote(ss)

php环境配置_使用Rancher在K8S上部署高性能PHP应用程序

介 绍 PHP是网络上最流行的编程语言之一,许多被广泛使用的内容管理系统都使用它开发,如WordPress和Drupal,并为现代服务器端框架(如Laravel和Symfony)提供核心代码。 尽管PHP很受欢迎,但是其缓慢和难以维护也是众所周知的。近几年这两个毛病已经没有那么严重了,但是高性能的PHP应用程序依然会需要两个功能:OPcache和PHP FastCGI进程管理器(PHP-FPM)。 在本文中,你将了解到在Kubernetes上如何使用自定义OPcache和PHP-FPM配置部署一个PHP应用程序以提高其性能。你将使用Rancher来部署一个PHP应用程序,该应用程序使用自定义环境变量来动态配置OPcache和PHP-FPM。我们将展示如何在你的Docker镜像中构建PHP-FPM配置选项并在容器中使用环境变量调整它们。 在PHP中的性能 首先,了解PHP应用程序中如何处理网络请求将对本文接下来的内容很有帮助。 PHP通常运行在web服务器旁边,处理请求并将它们发送到PHP应用程序中。你可以使用PHP-FPM或mod_PHP来运行你的应用程序,但在本文中我们将使用PHP-FPM,因为其性能优势并且NGINX是最常与PHP-FPM一起使用的web服务器。 OPcache介绍 OPcache通过在首次调用脚本时将脚本存储在内存中来加速PHP应用程序。进而,随后的请求将从内存而不是文件系统加载,这可以使你的速度提高74%。 OPcache提供了一些设置,你可以调整这些设置来提高应用程序的性能和可靠性。在本篇教程中,你将了解到如何设置一个PHP Docker镜像,该镜像可以调整OPcache的内存限制、缓存文件数量以及重新验证缓存频率。 PHP-FPM介绍 PHP-FPM(FastCGI进程管理器)会启动一个或多个进程以运行你的PHP应用程序。与mod_PHP(将PHP捆绑为Apache模块)不同,PHP-FPM使你可以精确控制服务器(或容器)运行的进程数量,以及它们应该如何启动和停止。 找到一个理想的PHP-FPM配置高度依赖于你的应用程序以及它所服务的请求数量和容器中的内存和CPU限制。我推荐你阅读Hayden James关于这个主题的文章并且在负载测试环境下测试几种不同的配置。 在K8S上部署一个PHP应用程序 前期准备 在你进行本篇教程之前,你需要做好以下准备: 在你本地机器上安装好的DockerDocker Hub或其他Docker镜像仓库上的账号Rancher部署(如果你还没部署,可以按照Quick start进行www.rancher.cn/quick-start/)通过Rancher管理的Kubernetes集群(可以根据文档进行操作:https://rancher2.docs.rancher.cn/docs/cluster-provisioning/_index) 在本教程中使用的所有代码都可以在Github中获取(https://github.com/karllhughes/rancher-php),或者你可以按照以下步骤从头开始构建应用程序。 PHP应用程序 你将要使用的应用程序是一个显示当前日期的PHP文件。创建一个新文件并将其命名为index.php: <?phpecho 'The current date is ' . date('F jS, Y'); 创建Dockerfile和配置文件 在Docker Hub上,你可以获得很多PHP Docker镜像,但它们都没有提供使用环境变量来修改OPcache或PHP-FPM配置的简便方法。使用环境变量的优势在于,您无需每次要调整PHP-FPM或OPcache设置时都需要重建PHP映像。这可以让你快速调整你的应用程序以提升性能。 首先,创建一个名为opcache.ini的新文件。你将复制该文件到PHP镜像中并在Dockerfile中为每个环境变量添加默认值。 # See https://www.php.net/manual/en/opcache.configuration.php for all available configuration options.[opcache]opcache.enable=${PHP_OPCACHE_ENABLE}opcache.memory_consumption=${PHP_OPCACHE_MEMORY_CONSUMPTION}opcache.max_accelerated_files=${PHP_OPCACHE_MAX_ACCELERATED_FILES}opcache.revalidate_freq=${PHP_OPCACHE_REVALIDATE_FREQUENCY}opcache.validate_timestamps=${PHP_OPCACHE_VALIDATE_TIMESTAMPS} 接下来,创建另一个名为www.conf的新文件。该文件将存储PHP-FPM配置选项,你可以通过环境变量对其进行更新: ; See https://www.php.net/manual/en/install.fpm.configuration.php for all available configuration options; Required user, group, and port options[www]user = www-datagroup = www-datalisten = 127.

matlab axis函数_MATLAB二维图形

7.2.5 双坐标图和子图 本小节介绍双坐标图形的绘制方法。另外前面已经有例子涉及了子图的绘制,读者应该有所了解,本小节将详细介绍子图的绘制方法。 1.双坐标图 在实际应用中,常常会提出这样一种需求:把同一自变量的两个不同量纲、不同数量级的函数量的变化绘制在同一张图上。例如希望在同一张图上表现温度、湿度随时间的变化;温度、压力的响应曲线;人口数量、GDP的变化曲线;放大器输入、输出电流变化曲线等。为满足这种需求,MATLAB提供了以下几个命令。 (1)plotyy(X1,Y1,X2,Y2):以左右不同纵轴绘制X1-Y1、X2-Y2两条曲线。 (2)plotyy(X1,Y1,X2,Y2,function):以左右不同纵轴,把X1-Y1、X2-Y2绘制成function指定形式的两条曲线。 (3)plotyy(X1,Y1,X2,Y2,'function1','function2') 以左右不同纵轴,把X1-Y1、X2-Y2绘制成function1、function2指定的不同形式的两条曲线。 (4)[AX,H1,H2] = plotyy(...):函数plotyy将创建的坐标轴句柄保存到返回参数AX中,将绘制的图形对象句柄保存在返回参数H1和H2中。其中,AX(1)中保存的是左侧轴的句柄值,AX(2)中保存的是右侧轴的句柄值。 【例7-12】 双坐标轴绘图示例。 Ex_7_12.m clear x = 0:0.01:20; % x坐标 y1 = 200*exp(-0.05*x).*sin(x); % Y1 y2 = 0.8*exp(-0.5*x).*sin(10*x); % Y2 [AX,H1,H2] = plotyy(x,y1,x,y2,'plot'); % 绘制双坐标轴图形 set(get(AX(1),'Ylabel'),'String','Slow Decay') % 纵轴标签1 set(get(AX(2),'Ylabel'),'String','Fast Decay') % 纵轴标签2 xlabel('Time (\musec)') % x标签 title('Multiple Decay Rates') % 图形标题 set(H1,'LineStyle','--') % 线形1 set(H2,'LineStyle',':') % 线形2 以上代码运行的结果如图7-15所示。 2.子图 MATLAB允许用户在同一个图形窗口内布置几幅独立的子图,具体的调用语法如下。 (1)subplot(m,n,P):使(m x n)幅子图中的第k幅成为当前幅。子图的编号顺序是左上方为第1幅,向右向下依次排序。 (2)subplot('Position',[left bottom width height]):在指定位置上绘制子图,并成为当前图。

mac安装brew失败的巧妙解决方式

mac安装brew失败的巧妙解决方式 我们按照官网的方式,在终端运行命令即可安装,由于众所周知的原因,我们会安装失败。 原因是访问不了这个脚本文件。 工具:服务器一台、脚本文件(终端不行,web端就简单多了)方式:根据官网的命令,在浏览器打开地址 打不开就用下载工具(迅雷之类的),反正想办法下载下来,然后放在自己的服务器,改一下命令就行啦! 虽然慢,但是起码能安装了。 不喜勿喷!

creo分割实体_SolidWorks、creo、UG哪个更适合机械设计?

机械设计太广了。综合地讲机械工程师用Creo,UG,机械人员用SOLIDWORKS. 以下是对三个软件的综合比较: Creo,UG的价格都很贵的。SolidWork便宜多了。 注意:CREO,catia等是ACIS内核,这个内核是偏曲面设计的。 UG,solidworks等是Parasolid是偏实体设计的。 所以面曲是Creo及Catia的强项. Creo,UG,CATIA是同一个档次的产品。千万不拿来和SOLIDWORKS等一些低端的大众化的产品比。 如果要说只画个三维用哪个都可以。如果你要偏设计和有逻辑性的产品用Creo。在工业设计领域Creo是最强大的。在加工领域UG是最强大的。 SOLIDWORKS。怎么说呢,这样比喻不知对不对,就像LINUX和WINDOWS一样。你想运行大的程序和要求稳定和性能就用Linux。想做点事要求也不高就用WINDOWS。运行的速度Creo确实甩Solidworks几条街。大型的机械公司如徐工,潍柴等Creo,UG是主角,Solidworks是配角。关键的技术和产品不会交给Solidworks作为文件存档的。 Unigraphics NX技术实力强大,难逢对手Unigraphics起源于美国麦道公司的产品,早年运行在工作站的Unix的系统下,受Pro/Engineer打压,1991年11月被并购入美国通用汽车公司EDS分部,Unigraphics由其独立子公司UGS开发,后与同样被并购入的SDRC公司I-deas软件整合,推出UnigraphicsNX,是一个高端的CAD机械工程辅助系统,适用于航空、航天、汽车、通用机械以及模具等的设计、分析及制造工程。 UG是德国产品,Creo是美国产品。德国人的机械加工和模具是强项。美国的产品设计和软件是强性,这就是为什么Creo的性能可以甩UG几条街的原因。为什么我们要用UG的同时也为硬件厂商项献呢?但在机加工和模具方面Creo比UG是弱一点。因为美国的机械设计方面也不比德国差多少。模具设计如果CREO+EMX+PDX就比UG强大太多了。机加工Cimatron有超UG的趋势。只是一个市场的问题。就像马自达车和大众车一样。两者差距大吗?各有千秋。 你没有发现UG最近的版本更新所谓的快吗?一月一个小补丁,半年一个大补丁,现在是1867了。说明什么呢?软件开发是它的弱项,没有严格的软件质量管理方案。体现了德国不是软件强国。 Creo对于很多的初学者来说那个相关性的参数让你头痛。但是当你是一名成熟的设计师你会对Creo爱不释手。就象很多人做事一样很有条理,很有逻辑。不是哪些错了临时补一下。UG就是可以实现修补的(非参),修补总是会顾此失彼对吧?所以Creo是对那些做事讲究完美或逻辑性强的人用的。UG是为那些做一个产品或完成一项工作的人用的。我举个例子吧UG里有个槽功能吧,在圆柱体的表面开一圈槽。这么简单的特征确要单独列出一个功能来。在Creo不就是绕一个圆柱的表面用扫描的方法按一定的形状切除材料吗?这个形状你可以随意的,也可以在它里面切个看不到的水槽也行。操作步骤:草绘》扫描》草绘截面》选切材料》OK。你看UG会弹出多少对话框呀。这就是思维缜密的表现。 有人说catia主要应用领域是汽车和飞机制造,CREO主要应用领域是产品制造,NX主要应用领域是模具制造.这是错误的理解,一些大型的公司CREO,CATIA,UG同时用,在不同的部门用的。你不能说一线的加工部门用Catia吧(女人何苦为难女人呢)。否则你会融入不进那个圈子的。你是搞Creo,Catia的,你偏要与用SOLIDWORKS,Autodesk Inventor,Solidedge(UG简化版)等为伍。你肯定会受到排挤的。就像你一个文化人你非要去和吸毒为伍。。哈哈。 说说SOLIDWORKS.首先我声明不是黑它。我实事求是。。。。它的性能很差劲,我怀疑是不是在帮硬件厂买硬件。Bug也是相当的多。这个创始人是从Creo离职出来的想和Creo竞争---自不量力。就象我们现在中国的一软件公司技术员出来自已也搞一个与打工的公司一样的产品---哪一个成功的呢?再说Solidworks用的是人家Solidedge的内核!每年老老实实的要向人家交钱!人家不卖的话,你这个软件就只有倒闭了!最后还是被收购的命运。 产品千变万化,从软件层面讲,除了与产品定位相关的分型面只能去适应产品而做不到自动化外,其余则都应做到自动化及智能化,最大限度提高设计效率,减少重复劳动!而CREO的参数化则从战略上提供了这种条件。而UG则只能在战术上去适应,你再这么熟练软件,离开了参数化,到老了还是手动模式。可惜,要真正领略参数化,需要在前期付出巨大的工作量才能达到,就是所谓的厚积薄发! 但同样是手动模式,在没有战略支持的情况下,CREO在战术上没有UG那样的灵活,这就是99%的人干不过过UG的原因! 总的来说,用UG做模具设计的都是去掉参数不保留参数的做法,没有了参数就不会像CREO那样方便了,不要说什么UG没参数还好修改,这只不过是针对单一一个零件而言的,当很多零件存在很多关系时没有参数就麻烦了,所以为什么做产品设计的用UG不多的原因,还有一个因素是UG入门比较方便,入门容易,不会像CREO那样存在着参数化的理念,如果不懂它的理念,你画图时很容易再生出错误,而因为之前选的参照混乱,所以很多时候都不知道错在哪里而让你发狂,这都是不会选参照的原因,所以很多人觉得它不好用,只不过是那些人还不明白这个软件的理念原理才说它不好不如哪个软件等等不负责任的言论出现,它不像UG,UG可以随时把参数干掉,就不会存在再生错误了,而UG操作起来确实是比CREO方便一些,用替换功能比CREO好,而且UG是可以多实体存在的,而CREO要多实体只能在装配模块里才能实现,不过现在CREO 4.0好像在分模模块也可以运用到了柔性建模的功能,封闭曲面的面也可以替换了吧,要知道之前的版本如果不是实体是不能用曲面替换曲面的,总的来说,各有优缺点,就看用它的人是什么水平了. 很多大型家具厂都在用UG,比如全友,宜家,掌上明珠等等。但是个人认为真的适合做家具的软件 UG,solidedge,ThinkDesign,TopSolidWood,Rhino都可以完爆Solidworks! CREO有二十多个模块供用户选择,故能将整个设计和生产过程集成在一起。在最近几年CREO已成为三维机械设计领域里最富有魅力的软件,在台湾模具工厂得到了非常广泛的应用。这就是为什么台湾的产品质量比大陆好一些的原因。模具设计EMX FOR CREO,是PTC公司合作伙伴BUW公司的产品。绝对把UG模具设计PK掉。不过很多人不知道有个低调的EMX和PDX.它和Creo是如此的完美配合 机械设计范围太广,一般来说,结构复杂的都使用CREO, 例如发动机,手机,空调..据我所知,康明斯,AVL,三菱都使用CREO设计发动机。一些航空研究所都使用使用PCREO设计。6 X/ K0 d+ n) m6 `特灵空调,美的,海尔,sharp,siemens(没错西门子就是UG的主人),WHIRLPOOL, PHILIPS,panasonic,OTIS, lenovo, kohler,Huawei, GE,Emerson,ericsson,东风,danfoss,CATERPILLAR,alstom都是CREO用户---重工行业,三一,柳工,夏工,现代都是。 就说做分型面分开上下模来说,UG并不一定就比creo好,只能说是各有优缺点,就拿UG那个模具专用模块分模和creo的模具制造模块来说,如果说到自动创建分型面补孔什么的,CREO的速度要比UG快很多,UG每补一个孔都是按正规的做面方法一步步生成特征而来的,你打开那个特征树看一下就知了,补一个很简单的孔都要用到几个特征,几个特征放在一个组就是一个补孔的特征,如果孔不是很多,那速度可能也不比creo慢很多,如果是补很多的孔?呵,你用UG那个自动补孔功能,你可能只能呆坐那里慢慢等它补好计算完毕了,这过程对于争分夺秒的模具设计过程来说,是很漫长的等待。不像creo一个裙边就可以数秒把图形中的所有不是很不规则的孔补好了,当然不是不规则的就补不出来,只是自动补出来的效果不好,根本是不能拿来用的,当然不是说creo的自动补孔功能不够强,所以不规则复杂些就不行,那些不规则复杂的孔creo补不上或者效果不好的,放在UG里也是一样的结果,没有多大区别,一样是要把那些不好的补孔删除,自己手动去创建。 CREO的自动创建分形面的方法不多,也是阴影和裙边这两个吧,阴影可能是极少有人用到的,毕竟它的可用处不大,但如果是做某些简单的最外围大分型面是平面的而且是一模出很多穴的模具那它可以派上用场了,一个阴影就可以迅间把分型面做出来了,而且分割成功率是最高的,当然在CREO里用得比较多的还是裙边那个自动创建分型面的命令,很多用CREO分模的人可能还是很少用到这个命令的,但不得不否认这个裙边命令是很好用的,某些人可能习惯于手动创建分型面,他们根本没有深入了解或者是还不怎么会利用这个命令就说它不好,其实用它来创建最外围的分型面和补孔效率是很高的,我是经常用这个命令来分模,一个裙边命令就可以把产品中的所有孔补上来,当然有些孔是补不上的,补不上的原因是你创建的侧面影象曲线没有闭合,或者是孔极不规则,例如补那些螺丝孔,一个产品图形可能有很多这样上螺丝的孔,如果你用燕秀那个什么都是拉伸一个封闭面组来做的话,不做累你才怪,如果是同一个高度还方便,可以在同一个特征里就可以全部做出来,但很多时候那些孔也是高低不一样的,你按燕秀分模法去做,只能一个孔拉伸一个特征,如果不是平面还要做一个曲面来和拉伸合并才能补好,一个图型有多个孔不知你要做多少个特征多长时间才补好呢?当你只补好这些孔时,我用我的综合分模法已经分出上下模了,只能说碰到什么情况就要用到最合适的方法,不要让自己走进死胡同里。软件是死的不变的,都是一样的命令一样的结果,关键是人是灵活的可变的,想一想用什么方法最合适最快最简单做出来才是你比别人优势的地方,在这里不得提一下裙边还有一个好处就是用裙边做出来的分型面分割的成功率是非常之高的,用裙边创建出来的分型面里出现问题是很少了,如果你的侧面影像曲线做得好,生成的面没有自交断开或者是重叠,基本上是没问题的,它的使用技巧在这里我就不说了。 UG对电脑硬件的要求确实是要比CREO高一些,我用UG分过一些并不是很大很复杂的图形,当创建了多个特征时,电脑运行速度变慢,有时打开一个命令都要等上十多几十秒的时间,这样的响应速度对于设计工作者来说,真的是令人很恼火的,只能埋怨公司或者是自己的电脑配置不行,当然我公司的电脑配置已经不算低了,I5 CPU、4G内存,显示卡中等以上都是这样。 显然现在很多人用UG分模都是不在那个专门的模具模块里搞的,都是手动分模占多数,特别是遇到复杂的图形时,这个应该说是建模方式的分模方法,只是会经常用到模具模块里提供的那几个补孔创建分型面命令。UG分模比CREO灵活,操作起来也是比CREO方便很多,应该说CREO在那几个主流的三维机械类软件里操作最繁琐最不人性化最麻烦的软件了,现在最新版本CREO比以前所有的CREO版本操作起来方便人性化一些,但本质上也是没有多大区别的,只是界面变化比较大比较图标化而已。CREO的优势在于参数化比较强,修改起来比较容易。如果是单从分模来说,我觉得CREO有些情况要比UG方便,只不过是UG可以多实体操作的,布尔运算很方便,这点CREO只能在组件模式下才能实现,但效率和操作起来就更加麻烦了。CREO最不好的地方或者应该说是最拖分割时间的地方是经常会遇到分割失败,有经验的人遇到分割失败时都会有自己的解决方法,当然解决问题的快慢是很难定义的,有时可能创建分型面用的时间很短,但偏偏分割里就分不开,这时你只能找到分不开的原因是什么,可能你找了很久试了N种方法都不知问题在哪里,对于PREO分割不开处理能力经验不够多的人来说就会抱怨和着急起来了,同事老板在催促怎么那么久还没搞定?难受!但问题还是会有解决方法的,用CREO没有分不开的模具,关键在于用它的人道行到了什么地步。这也是为什么有很多人说CREO分模比不过UG的原因之一。当然用UG就并不是没有分割不开的时候,UG也会经常遇到割不开的,原因其实也是和CREO割不开是一样的道理。 如果你要用UG那个模具模块分模,你一保存就会生成很多个文件,这个比CREO还麻烦,不过生成的都是有派上用场的文件吧,不像CREO一保存就会保存很多个版本,以前的旧版本如果你不删掉的话,它会一直累积下来的,到时可能一个文件可是几百KB的容量,到最后可能累积到上百MB的情况,视你保存的次数而定。UG自动分模必须要先定义型芯和型腔的颜色面,这点比CREO不方便,虽然UG可以通过颜色选面,同时也是在模具分型上是必须要做的,那这也是很麻烦,很多时候有些不能定义在前模或者是在后模上的面,要手动拆分分类才能定义好,这确实也是很累人的。当然UG也可以不用选择产品的所有面来分型,用手动分模也是只补好孔就行了,先用产品图形和补孔的实体和模坯料求差,最后用面或者是实体分割还有连接的地方就可以分出上下模了。 就分模来说,CREO并不比UG差,甚至比UG还快还方便,CREO速度比不UG主要是在做全三D的模具设计之上,UG有很多外挂可安装使用,相反在CREO上好用的外挂很少,好像没有多少人愿意为CREO开发软件一样,这不得不说是UG的优势所在,如果是做整套模具的三维设计,当然是用UG比CREO要方便效率要高些。 上面这些说到的都是本人的一些浅见,软件用得并不是很深,但都懂得它们的原理,大家平时要多聊些技术上的话题少聊软件哪个好哪个强的比较问题,这本身就是很无聊的问题,关键在于我们自己是否已经掌握了这个行业的专业知识才是最重要的,如果你只懂得用UG或者是CREO,但你并不懂模具结构不懂模具行业的专业知识,那么UG或者是CREO对于你来说是工具,但你就只是专业人士的绘图工具。 本文章不代表本公众号观点,大家有什么想法呢?可以评论区讨论。 小编用的是Solidworks,建模简单方便,装配体方便。我觉得每种软件都有他的优势,也有他的缺点。存在即合理,用着方便才是硬道理。

求解随机数的算法流程图_规划求解Solver: 三种求解方法的应用(原创)

Frontline 公司的规划求解, 在90年代的Excel就开始配备了, 不过这么多年过去了, 求解算法还是没有什么大改进, 可能是想大家去买他们公司的升级版Analytic Solver, 以便得到更快的求解速度和更多变量和约束(基础版的,也就是Excel内置的, 限制200个变量, 100个约束, 超过就报错). 三种求解方法: GRG Non-Linear 中文翻译是: 非线性GRG, GRG 代表Generalized Reduced Gradient, 这是一种常见的非线性规划求解的方法, 大部分时候, 求解的方法, 是根据输入的数值(变量)的变化, 根据目标函数的变化率, 判断是否得到一个局部最优解. 如果得到了局部最优解, 就停止搜索. Excel默认是非线性GRG 求解法. Simplex 单纯形法 线性规划的话, 可以用Simplex单纯形法进行求解. 怎么判断一个模型是线性规划模型, 建议大家看这个百度百科. 线性规划_百度百科​baike.baidu.com 如果是线性规划, 用Simplex法比Non Linear GRG 快得多. 跟GRG不同的地方是, Simplex法求得的是全局最优解. 而GRG法只是求局部最优解. 什么是全局最优?什么是局部最优? 看下图, 红色这个G点, 就是局部最优. 从开始出发, GRG找呀找, 找到一个低谷, 就停止搜索了, 返回这个解, 就是局部最优. 其实最低的点, 应该是在蓝色S点(全局最优)那个地方. Simplex这个求解器, 如果是普通线性规划, 用的是单纯形算法; 如果是整数线性规划, 用的是分支定界法. 另外, 生活工作中大部分的线性规划, 都是整数线性规划, 注意把整数最优率设置为0(默认是1%), 如下图. 如果用默认的, 可能只能得到的非全局最优的整数解. 设置为0的话, 可以得到全局最优整数解, 但很多情况下会导致速度的下降.

Postman 安装使用和配置

目录 安装 配置: 1,配置Interceptor 2,导入标签 问题处理 1,postman黑屏 安装 Postman最早是作用chrome浏览器插件存在的,可以到chrome商店搜索下载安装。但2018年初Chrome停止对Postman 插件的支持。不过目前商店里面支持: Tabbed Postman插件。 安装后,配置下 Headers 就可以用了 比如配置: Content-Type application/json;charset=utf-8 不过Tabbed Postman 不支持文件夹,查看起来比较麻烦,所以还是会想使用Postman 目前Postman提供了独立的安装包,不再依赖于Chrome浏览器了。同时支持MAC、Windows和Linux, Postman 下载地址:postman 下载地址 根据自己电脑的版本去进行下载安装 配置: 1,配置Interceptor 配置好Interceptor就会默认保存登录信息 2,导入标签 导入文件后,点击一个进行测试,可以访问说明OK (PS: 在换电脑前,可以先备份下原来postman的内容,新电脑安装后就可以直接导入了) 问题处理 1,postman黑屏 现象: 时不时会出现黑屏的情况,关了postman重新开也一样,用起来就很麻烦。重启指标不治本,还麻烦。 解决方式: 添加系统环境变量POSTMAN_DISABLE_GPU = true。 0,打开电脑的属性 1.打开高级系统设置; 2.在“高级”选项卡中,单击“环境变量”; 3.添加一个新的系统变量; 4.关闭Postman并重新打开(或者重启电脑) 目前关于postman的操作先到这里面,后面有遇到新的再添加 PS: 平时记录下软件操作的一些内容,再遇到的时候,打开来看看,就方便很多了

简易计算器python_python 简易四则运算计算器

# c=a if 成立就用c=a表达式 else b , 不成立c=b import re s_input="1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )" def Judging_Conformity(x):#判断式子里面是否只有数字和*/+-()空格或者有**、//、+*、*.、等错误形式 flag=True if re.findall("[^*/+\-() \d]|[*/+\-.]+[*/+\-.]+|\([*/+]+|\.\d*\.",x): flag=False return flag def format_replace(x):#格式化去掉空格 x=x.replace(" ","") return add_sub(remove_md(x)) def add_sub(x): x=re.sub("\+-|-\+","-",x) x=re.sub("--|\+\+","+",x) if not re.findall("[\d]+[+\-][\d]+",x): if x[0]=="+":#去掉最后在数字前面的+ x=x[1:] return x else: k=re.search("-?[\d.]+[+-][\d.]+",x).group() k3=k if x[0]=="-":#如果开头有-号 k=k[1:] k2=float("-"+k.split("+")[0])+float(k.split("+")[1]) if "+" in k else float("

数据挖掘常见算法整理 (国科大 刘莹)

数据预处理 - 四分位法 例子: 3、5、9、11、17、19、35 先计算位置,在通过位置计算对应的数值 Q1:(n+1)*0.25=2 Q2:(n+1)*0.5=4 Q3:(n+1)*0.75=6 当下标正好为整数时,对应的数值为Q1=5、Q2=11、Q3=19 13, 15, 16, 16, 19, 20, 20, 21 Q1:(n+1)*0.25=2.25 Q2:(n+1)*0.5=4.5 Q3:(n+1)*0.75=6.75 当计算的下标不是整数时,介于第二和第三位之间,但是更靠近第二位。所以第二位数权重占75%,第三位数权重占25% Q1=(15*0.75+16*0.25)=15.25、Q2=17.5、Q3=(20*0.25+20*0.75)= 20 IQR = Q3-Q1 five-number-summary: min Q1 middle Q3 max 处理异常数据的常见方法:bin方法,回归,聚类,人机检查结合 Bin方法 (a) Bin1 5,10,11,13 mean:9.75 Bin2 15,15,15,55 mean:25 Bin3 60,60,65,65 mean:62.5 (b) Bin1 5,13,13,13 Bin2 15,15,15,55 Bin3 60,60,65,65 (c) W = (B-A)/N = (65-5)/3 = 20 Bin1: 5,10,11,13,15,15,15 mean:12 Bin2: NULL Bin3: 55,60,60,65,65 mean:61 Normalization归一化 (a) 0 0.

Linux系统管理命令

1、hostname 显示主机名称 参数: -i 显示主机的IP地址 使用hostname -i查看ip地址命令不常用,常用的是ifconfig命令 2、clear 清屏 clear将会刷新屏幕,本质上只是让终端显示页向前翻了一页,如果往上滚动屏幕,还可以看到之前的操作信息。一般使用这个命令会让屏幕更加清爽。 3、top 动态的显示当前系统中耗费资源最多的进程 相当于Windows的任务管理器 4、ps 用来显示当前进程的状态 参数含义-e显示所有进程-f显示程序间的关系 举例:ps –ef 标识含义UID用户IDPID进程IDPPID父进程CCPU占用率STIME系统启动时间TIY登入者的终端机位TIME耗时 ps –ef | grep python 查找Python进程 5、date 显示或设置系统当前时间 应用场景 ①一般不用,在系统时间不准的时候使用。 ②不加参数,默认显示系统当前时间 参数 -s 将系统时间设为所设定的时间 项目命令格式举例修改日期date –s 日期时间date –s 2020-11-11修改时间date –s 时间date –s 15:30:11同时修改时间和日期date -s ‘日期时间 时间’date –s ‘2020-11 15:30:11’ 6、kill 杀掉进程 举例: kill 8963 杀掉pid号为8963的进程,进程号是会变的,不固定,每次要杀掉进程时需要使用最新的进程号 参数 -9 强制杀掉进程(适用于只使用kill却杀不掉的情况) 7、其他命令 命令含义备注shutdown关机不要随便使用,会很麻烦logout注销退出当前登录用户,断开连接reboot重启ping确定网络和各外部主机的状态在还没连接或连接不上时使用此命令,查看本地与要登录的服务器之间网络是否畅通

python生成100以内随机数_python 随机产生0-100以内的随机数,找到最大值和最小值并交换位置...

[code]import random #随机模块 number = [] #创建一个列表 for i in range(0,100): #循环随机数100位 num = random.randint(0,100) #num得到随机数 number.append(num) #append是添加 随机数添加到number列表 print(number) #打印随机数 print(min(number),max(number)) #打印最大小 m = number.index(min(number)) #统计出现次数 n = number.index(max(number)) # number[m],number = number ,number[m] #最大与最小交换位置 print(number) #打印出交换的列表 python 随机产生0-100以内的随机数,找到最大值和最小值并交换位置

局域网内建立共享硬盘服务器(基于windows共享硬盘,ubuntu可访问)

局域网内建立共享硬盘服务器 Author: 杭州电子科技大学-自动化学院-智能系统和机器人研究中心-Jolen Xie 一、Windows连接Windows的共享硬盘服务器 1. 打开电脑共享功能 首先进入网络和共享中心打开共享设置 2. 修改wifi权限 如果是连的局域网wifi需要改为专用网络,直接网线连接应该会自动设置为专用网络,否则你的共享文件夹别人看不见。 3. 设置共享文件夹 首先建立一个文件夹,右击打开属性,配置共享权限 选择共享权限,一般选择Everyone 在这里如果没有Everyone就添加一个Everyone用户,如下图 此外还可能遇到其他电脑不能访问的问题,这是因为everyone对文件夹的安全操作权限未打开,如下图打开 4. 检查是否共享成功 可以在自己电脑我的电脑主页下的网络中查看是否有自己共享的文件,也可在同一局域网下的其他电脑上查看是否能看到共享文件夹。 可以看到共享文件的主机名字,点击后会出现登录界面,只要输入那台电脑的用户名和密码(可以根据第5点在主机上新建一个用户)就可看到共享文件夹。 5. 在服务器上新建用户,以便于登录 在“此电脑”右击并点击管理,根据以下操作,在第3部右击,建立新用户 根据自己的特殊喜好,建立你的用户名和密码,靠此账户可以登录服务器。 二、Ubuntu访问Windows的共享硬盘服务器 1. 安装samba和smbclient sudo apt-get install samba samba samba-common smbclient 2. 修改配置文件 由于windows和ubuntu的文件传输协议不一样所以需要修改以下配置文件。 sudo gedit /etc/samba/smb.conf 在文件中的[global]下面加入以下两句命令 client min protocol = CORE client max protocol = SMB3 如下图 刷新服务 sudo service smbd restart 3. 连接服务器 打开ubantu“文件”,左侧看到“连接服务器” 服务器地址输入:·smb://你服务器地址· 回车后会让你输入账户和密码,成功登录后就能看到里面的文件和数据了。 如果出现报错 请返回第二章第2个步骤哦。 如果还解决不了,请自行百度。

统计学与统计机器学习1--连续型变量相关性分析

文章目录 一、简单相关性分析1、变量间的关系分析(1)函数关系(2)相关关系i、平行关系ii、依存关系iii、两者关系 2、简单相关分析(1)计算两变量之间的线性相关系数i、协方差定义、柯西-施瓦尔兹不等式a、协方差定义b、柯西-施瓦尔兹不等式 ii、Pearson相关系数(样本线性相关系数)注意:数据不服从正态分布时--spearman相关系数 iii、ρ=0,相关系数的假设检验a、引入假设检验的原因 iv、t-检验的解读a、简历检验假设b、构造 t 统计量,计算相关系数 r 的 t 值c、计算 t 值和 P ,作结论 3、深度探讨ρ=0 二、多变量相关性分析(一个因变量和多个自变量)1、偏相关或复相关2、意义与用途3、分析方法(1)样本相关系数矩阵、相关系数检验(2)复相关分析(3)决定系数R^2^ (RMSE的介绍) 4、小结 一、简单相关性分析 1、变量间的关系分析 变量之间的关系可分为两类:函数关系、相关关系。 (1)函数关系 存在完全确定的关系 (2)相关关系 不存在完全确定的关系:虽然变量间有着十分密切的关系,但是不能由一个或多个变量值精确的求出另一个变量的值,称为相关关系,存在相关关系的变量称为相关变量。 相关变量的关系也可分为两种:平行关系、依存关系 i、平行关系 两个及以上变量间相互影响相关分析是研究呈平行关系的相关变量之间的关系 ii、依存关系 一个变量变化受另一个变量的影响回归分析是研究呈依存关系的相关变量之间的关系 iii、两者关系 回归分析和相关分析都是研究变量之间关系的统计学课题,两种分析方法相互结合和渗透 2、简单相关分析 相关分析:通过对大量数字资料的观察,消除偶然因素的影响,探求现象之间的相关关系的密切程度和表现形式主要研究内容:现象之间是否相关、相关的方向、密切程度等,不区分自变量与因变量,也不关心各变量的构成形式主要分析方法:绘制相关图、计算相关系数、检验相关系数 (1)计算两变量之间的线性相关系数 所有相关分析中最简单的就是两个变量间的线性相关,一变量数值发生变动,另一变量数值会随之发生大致均等的变动,各点的分布在平面图上大概表现为一直线;线性相关分析,就是用线性相关系数来衡量两变量的相关关系和密切程度给定二元总体(X,Y) 总体相关系数用ρ表示:cov(X,Y)是x与y的协方差 i、协方差定义、柯西-施瓦尔兹不等式 a、协方差定义 设(X,Y)是二维随机变量,若E[(X-E(X))(Y-E(Y))]存在 则称cov(X,Y)=E[(X-E(X))(Y-E(Y))],叫X与Y的协方差,也叫X与Y的相关(中心)矩 即X的偏差(X-E(X))与Y的偏差(Y-E(Y))乘积的期望 解读: 当cov(X,Y)>0,X的偏差(X-E(X))与Y的偏差(Y-E(Y)),有同时增加或同时减少的倾向,又由于E(X)和E(Y)都是常数,所以就能够等价于X与Y有同时增加或减少的倾向,称X与Y正相关当cov(X,Y)<0,X的偏差(X-E(X))与Y的偏差(Y-E(Y)),有X增加Y减少的倾向,或Y增加X减少的倾向,称X与Y负相关当cov(X,Y)=0,称X与Y不相关,这时可能是X与Y取值毫无关联,也可能是某种特殊的非线性关系 b、柯西-施瓦尔兹不等式 根据柯西-施瓦尔兹不等式 变形得ρx,y在区间[-1,1] ρx,y是没有单位的,因为分子协方差的量纲除以了分母的与分子相同的量纲 两变量线性相关性越密切,|ρx,y|越接近于1两变量线性相关性越低,|ρx,y|越接近于0|ρx,y|=0的情况跟上面cov(X,Y)=0情况一样,两变量取值毫无关联或有某种特殊的非线性关系 协方差与相关系数的关系,就像绝对数与相对数的关系(绝对数相当于统计中常用的总量指标;相对数是两个有联系的指标的比值,从数量上反应两个相互联系的现象之间的对比关系。) ii、Pearson相关系数(样本线性相关系数) 一般用样本线性相关系数来估计总体线性相关系数,数据必须服从正态分布 设(X,Y)是二元总体,简单随机抽样(x1,y1),(x2,y2),……(xn,yn) 样本均值: 样本方差: 样本协方差: 样本相关系数: lxx为x的离差平方和,lyy为y的离差平方和,lxy为x与y离差乘积之和(可正可负) 实际计算可按下面简化: python代码(人的身高体重相关性关系): import numpy as np import matplotlib.pyplot as plt x=np.

【数字信号处理】FIR 滤波器基础理论

FIR 滤波器设计基础理论 FIR 滤波器是数字滤波器的一种,相比于模拟滤波器,其滤波精度高,稳定,可随时修改,不需要考虑阻抗等问题,可以实现特殊要求的幅频特性,同时满足一定条件的FIR滤波器具有线性相位,因此FIR滤波器在实际工程中得到了较为广泛的应用,例如图像处理、通信以及雷达等。 本文主要讲述线性相位的 FIR 滤波器的基本原理和 并行结构基础,其次阐述了并行结构中常用到的 FFA 算法和快速卷积算法。 目录 1.FIR 滤波器的基本原理 一个 N 阶的 FIR 滤波器输出公式 y(n) 如下: 式1中 h(k)为滤波器的系数,x(n-k)为x(n)延时k个周期。系统的传输函数H(z)可表示成公式2: 从式1看出:滤波过程主要是一组特定的系数与信号完成卷积的过程。从式2看出,在有限的Z平面内它有N-1个零点同时其 N-1个极点全部位于 z=0 中,因此 FIR 滤波器也被称为全零点滤波器,是一个单位脉冲响应有限长的稳定系统。 FIR滤波器在系数满足一定条件的情况下,它的相频特性是线性的,可以有效的保留信号的相位信息,因此线性相位的 FIR 滤波器在实际工程中有着较为广泛的应用。FIR网格结构的特点是没有反馈支路,也就是说没有环路。下面将介绍三种 FIR滤波器中常用到的网格结构。 1.1 FIR 滤波器基本结构 直接型:按照公式1或者2直接画出的结构就是直接型结构。直接型结构是将公式中的x(n-k)延时链展开,将延时后的数据先进行乘法运算后进行累加操作,如图 1 所示。将直接型结构进行转置(转置原理),先进行乘法运算后续进行延时 和累加操作即可得到转置型网格结构,如图2 所示。 图1 直接型网格结构 图2 转置型网格结构 级联型:把系统函数进行因式分解,将其中成对的零点排列在一起,得到 1 阶或者2 阶的基本直接型结构,将基本结构互相级联即可得到级联结构。 式3中[N/2]表示对 N/2 取整。当 N 为奇数的时候,为 0。FIR 滤波器的级联结构如图 2.3 所示。 图2.3 级联型网格结构 级联型结构使用的乘法器较多,滤波器阶数越高越难分解,因此在实际中应用较少。 **线性相位结构:**FIR 滤波器因其线性相位特性和系数对称性而在实际工程中被广泛使用,可以保留初始相位信息。它的单位脉冲响应满足如下公式4: 式4中,+表示第一类线性相位结构,-表示第二类线性相位结构。当 N 为偶数时: 当 N 为奇数时: 因此,根据公式画出线性相位结构如下:

plt绘制柱状图

先上效果图 数据保存在txt文件中,一列数据。格式如下: 代码如下: import matplotlib.pyplot as plt import numpy as np def show_sub(): all_values = [] x_range = np.arange(-0.05,0.3,0.05) x_cell = ['~-0.05','-0.05~0','0~0.05','0.05~0.10','0.10~0.15','0.15~0.20','0.20~0.25','0.25~'] y_values = np.zeros(len(x_range)) file = open('sim_sub.txt', 'r') c = 0 for line in file.readlines(): # if c == 50: # break # c += 1 v = line.strip() all_values.append(v) file.close() all_values_arr = np.array(all_values) all_values_arr = all_values_arr.astype(np.float) already = 0 for i,x in enumerate(x_range): idxs = np.where(all_values_arr < x) y_values[i] = len(idxs[0])-already if x<=0: y_values[i] *= -1 already = len(idxs[0]) print(y_values[i]) #all_values = list(all_values_arr) x_range = list(x_range) y_values = list(y_values) x_range.

iview一级菜单、二级菜单、三级菜单路由配置

一级菜单: { path: '/realTime', name: 'realTime', meta: { icon: 'md-cloud-uploads', title: '实时监控' }, component: Main, children: [{ path: 'realTime', name: 'realTime', meta: { icon: 'md-occupation', title: '实时监控' }, component: (resolve) => require(['@/view/realTime/realTime.vue'], resolve) }, ] }, 二级菜单: { path: '/configuration', name: 'configuration', meta: { icon: 'md-cloud-uploads', title: '配置中心' }, component: Main, children: [{ path: 'userInfo', name: 'userInfo', meta: { icon: 'md-occupation', title: '员工管理' }, component: () => import('@/view/configuration/userInfo.vue') }, ] }, 三级菜单

Flink编码:FlinkSQL全面指南

文章目录 1. FlinkSQL定位2. 流与表的对偶性3. 持续查询/增量计算4. 回撤流5. Flink 1.11关于SQL的增强5.1 DDL写法5.2 主键5.3 Catalog 6. JOIN算子6.1 双流JOIN原理6.1.1 Inner Join6.1.2 Left Join6.1.3 State数据结构 7. 窗口7.1 OverWindow7.1.1 基于数据条目的overwindow7.1.2 基于时间的overwindow 7.2 GroupWindow7.2.1 滚动窗口7.2.2 滑动窗口7.2.3 Session窗口 1. FlinkSQL定位 通过SQL开发人员可以只关注业务逻辑,学习成本低,容易理解,而且内置了很多的优化规则,可以简化开发复杂度,通过SQL还能在高层应用上实现真正的批流一体。 Hive SQL,Spark SQL,Flink SQL给开发人员带来了极大便捷,让开发人员只需关注业务场景,而无需关注复杂的API编写。 2. 流与表的对偶性 以下是利用FlinkSQL做CDC的场景,mysql表可以转成CDC流,CDC流又可以落盘成mysql表。 表的重要属性:schema,data,DML操作时间/时间字段 流的重要属性:schema(debezium、canal、ogg),data,processTime/eventTime 流与表具备相同的特征,可以信息无损的相互转换,我称之为流表对偶(duality)性。流与表的对偶性,是flinkSQL的理论基石。而理解流与表的对偶性的前提,是要充分理解FlinkSQL的增量查询和双流join原理,见下节。 参考:https://developer.aliyun.com/article/667566?spm=a2c6h.13262185.0.0.36a07e18Wn3kay 3. 持续查询/增量计算 流上的数据源源不断的流入,我们既不能等所有事件流入结束(永远不会结束)再计算,也不会每次来一条事件就像传统数据库一样将全部事件集合重新整体计算一次。 在持续查询的计算过程中,Apache Flink采用增量计算的方式,也就是每次计算都会将计算结果存储到state中,下一条事件到来的时候利用上次计算的结果和当前的事件进行聚合计算。 如以下案例: // 求订单总数和所有订单的总金额 select count(id) as cnt,sum(amount)as sumAmount from order_tab; 将count和sum更新到在state中;当最新一条数据到来时,count+1,sum+amount。 4. 回撤流 Flink中,Kafka Source/Sink是非回撤流,Group By是回撤流。所谓回撤流,就是可以更新历史数据的流,更新历史数据并不是将发往下游的历史数据进行更改,要知道,已经发往下游的消息是追不回来的。更新历史数据的含义是,在得知某个Key(接在Key BY / Group By后的字段)对应数据已经存在的情况下,如果该Key对应的数据再次到来,会生成一条delete消息和一条新的insert消息发往下游。 聚合算子和Sink算子都有回撤的概念,但是又不尽相同。聚合算子的回撤用于聚合状态的更新,保证了FlinkSQL持续查询/增量查询的正确语义;Sink算子的回撤则更多的是应用于CDC场景,保证了CDC场景下的append、upsert、retract等语义的正确性。

web 打印条码 有虚线_【Dynamic Web TWAIN教程】条码读取器(上)

使用条形码识别在文档数字化中自动分类 介绍 现在,无纸化办公的想法越来越受欢迎,纸质文件的数字化已经成为一种趋势。与此同时,许多行业,如医院,银行等,仍然需要打印文件,然后再将其数字化。那么这将会导致一种情况:由于不同操作之间的时间差异,很可能会堆积大量纸质文档并且正等待扫描。然后,我们需要对多个文档进行一次性扫描,在此期间需要对文档进行分类。当然,这些任务可以手动完成,但自动化可以节省大量的时间和精力。在本文中,我们将分享如何通过Web应用程序中的条形码实现自动化。 环境 Windows 本地Web服务器 步骤 步骤1 创建一个新目录DocumentsSeparation在其中创建一个新页面index.html Documents Separation 步骤2 参考核心JavaScript库 Documents Separation 注意:此处引用了在线JavaScript文件。在项目中,你应该引用项目中的相应文件。如果你以前在本地安装了Dynamic Web TWAIN产品,也可以在以下目录中找到相同的文件。 C:Program Files (x86)DynamsoftDynamic Web TWAIN SDK {version number} {Trial}Resource 步骤3 添加DIV和几个按钮 效果如下: 步骤4 添加初始化代码 步骤5 在浏览器中打开index.html。如果之前未安装,请按照页面上的提示安装相应的扫描和条形码识别控件。此安装过程只需在每台计算机上完成一次 通常的安装路径为 C:WindowsSysWOW64DynamsoftDynamsoftService 以下是本文中使用的主要文件。 DynamsoftService.exedwt_trial_14.1.0.0828.dllDynamsoftBarcodeReaderx86_6.3.dlldbr_6.3.0.0723.dll 步骤6 添加按钮的代码 function AcquireImage() { if (DWObject) { DWObject.SelectSource(function () { var OnAcquireImageSuccess, OnAcquireImageFailure; OnAcquireImageSuccess = OnAcquireImageFailure = function () { DWObject.CloseSource(); }; DWObject.OpenSource(); DWObject.IfDisableSourceAfterAcquire = true; DWObject.AcquireImage(OnAcquireImageSuccess, OnAcquireImageFailure); }, function () { console.

2019 vs 安装odt_VS Code C/C++ 扩展:2019年7月更新

近日,VS开发团队隆重宣布:VS Code C/C++扩展2019年7月更新正式发布。这个扩展包含了许多激动人心的新功能,其中包括:语义着色,IntelliSense配置界面增强以及IntelliSense缓存。 对于我们这些热爱C++的人来说,这证明了C++在VS开发团队心目中的地位,确实是一个好消息。那么,我们就来看看这些新的功能。 语义着色 长久以来,语义着色一直是开发者希望VS开发团队增加的一项特性。但是这项功能对于VS开发团队来说,确实是一个极大的挑战。VS虽然具备二次开发API,但是在其设计之初,并没有对应语义高亮的API,同时在VS Code server protocol中,也没有提供对语义着色的支持。另外,他们也无法通过编程的方式来访问主题的颜色配置。开发团队一度认为这个是一个不可能的任务,幸运的是,他们找到一种方法克服了种种困难,终于实现了这一特性。在这个实现方法中,他们通过TextEditorDecorations来对Token进行管理,同时通过对主题文件和VS Code配置来应用当前的配色。闲话不多说,看看下图: 语义着色支持对上下文之外的Token进行着色,因此,它超越了传统的语法着色。举个栗子,如果你使用了一个在其他地方定义的变量,那么在语义着色的加持下,你可以看到如下的变化: 亲爱的朋友们,你们看到右图中的颜色变化了吗:是不是牛逼炸了? 结构体box在main函数之外定义,当在main函数使用它时,它的颜色已经变化了。这就是传说中的按语义来着色。 主题 我们可以通过VS Code中的颜色管理模块,来自定义语义着色中的颜色。具体还是需要参考VS Code的有关主题的文档,这里就不赘述了。 有一个需要注意的地方是,有许多没有被默认的C/C++ TextMate语法直接识别的Token,这些Token是不能被现有的VS Code主题所着色的,你当然可以在VS Code中自定义颜色。但是,你也可以通过全局设置或者主题设置来进行配置。主题的作者也可以在创建一个新的主题时参考这些配置项。 在全局设置中自定义颜色 找到你的settings.json文件,然后通过修改tokenColorCustomizations这个设置项来自定义主题颜色。如下图所示: 为一个主题自定义颜色 当然,你也可以在某一个主题上自定义颜色。在下面的例子中,我们可以修改VS的暗黑主题的颜色配置: 开发团队还创建了一些用于自定义VS暗黑和轻量主题的模板,基于这些模板,我们可以方便快速的自定义主题的颜色。 IntelliSense配置编辑器 VS开发团队分享到,开发IntelliSense配置编辑器的主要目的是提供另一种更加人性化的方式来配置IntelliSense,之前我们使用的方法时修改c_cpp_properties.json这个配置文件来达到这个目的。这个图形化的界面比配置文件更加简单,同时也可以更加容易的理解IntelliSense的各个配置的含义。很善解人意有没有? 选择,修改和添加配置 建立多个IntelliSense配置有时候会是一个很好的主意。比如,你可能需要在Debug模式需要尽可能丰富的代码结构化信息,但是在Release模式下,你主要是为了编译发行版本,代码的结构化信息也许不那么重要了,所以我们可以为Debug和Release这两种模式来创建各自对应的IntelliSense配置,这样在两种模式下切换时,可以自动加载各自的配置,从而提高编辑器的响应速度。我们可以选择一个已经存在的配置,如下图所示: 当然,你也可以编辑选择的配置: 编译器路径列表 在编辑器中的”compiler path”下拉框中,我们可以看到被系统检测到的所有编译器的路径,可以根据项目的实际情况进行配置,如下图所示: 话说这罗马确实不是一天就建成的,VS之所以成为灭霸级的开发IDE,是因为有这样一波人,每天更新一点新特性,日积月累才建立起来的。好了,接下来继续新特性讲解。 IntelliSense缓存 在2019年3月的更新中,VS开发团队引入了IntelliSense缓存这一设计。设计这个缓存的目的,主要是为对头文件信息进行缓存,从而加快IntelliSense的工作速度。开发团队收到了许多来自GitHub社区的反馈,他们决定在2019年7月更新中对IntelliSense的默认路径进行一些修改。 默认路径 在之前的版本中,默认的IntelliSense的缓存路径是在工作空间(${workspaceFolder}/.vscode)的”.vscode”目录下。修改这个默认路径,可以解决一些在工作空间进行源码管理的问题。而且,因为缓存的大小被应用在缓存所在的位置上,另外如果总是在同一个地方存放缓存的话,会减少总体磁盘的缓存使用率。 具体来说,在新版本中,C_Cpp.intelliSenseCachePath配置的默认值有了变化: 在Linux和macOS上,它的值是:~/.vscode-cpptools, 在Windows上,它的值是:%LocalAppData%/Microsoft/vscode-cpptools 值得注意的一点是,如果你使用的是旧的IntelliSense缓存路径,那么这个扩展将会移除上次之前添加到${workspaceFolder}/.vscode目录的所有缓存。朋友们,别被这个地方给坑了! 期待您的反馈 一如既往的,VS开发团队十分重视各位开发者对新特性的反馈和建议。有兴趣的朋友,可以下载这个扩展并安装到你的VS Code,尝尝鲜,吃吃瓜,提提意见。 感谢阅读,本文来自Visual Studio博客。

python定义字符串数组_python 入门之 – 数组类型(十二)

关于数组类型,有过编程基础的都知道是怎么回事儿,最为代表的其实就是JOSN格式的数据了,在python中定义数组,其实就是和JS中可以说一摸一样,如: arr = [] print(type(arr)) 我先用 type() 方法判断一下变量 arr 的类型,打印出来了是 list 语义话的意思其实就是列表或者说数组集合,其实数组里面有好多种操作,如: 1、创建数组 2、查询数组 3、数组切片 4、数组增加 5、数组修改 6、数组删除 7、数组排序 8、数组拼接 创建数组 创建数组的方式有很多种,第一种: arr = [] 这是创建的一个空数组,里面没有任何数据 第二种: arr = ['张三','李四','王五','赵六'] 这是赋值的情况下创建的,一创建里面就已经有了数据 第三种: arr = list() 这一种比较特别了,如上方第一个演示,我用 type() 操作符判断数组类型打印出来的就是 list 类型,所以这种方式和 js 里面的构造函数比较类似 查询数组 查询数组其实就是查询某个元素在那个位置,可以通过下标查询得到值,也可以通过字符串查询出下标,还可以统计指定元素的个数 下标查询如: arr = ['张三','李四','王五','赵六'] arr[0] #通过索引值下标查询,0 代表第一个,等于 '张三' arr[-1] #从右往左查询,-1 代表最后一个,以此类推,等于 '赵六' 在数组里面,python提供了一个操作方法,可以直接返回出对应值的下标,如: arr = ['张三','李四','王五','赵六'] arr.index('张三') #返回出下标 0 arr.index('李四') #返回出下标 1 arr.index('王五') #返回出下标 2

element admin 动态路由_vueelementadmin权限管理之路由解读

权限问题一直是一个比较让人头疼的事情,以前前后端不分离的时候,后端负责权限的处理,根据用户或角色的权限来渲染页面,现在随着前后端分离的流行,权限管理是否可以交给前端的讨论也慢慢浮出水面,前端管理权限的优势是显而易见的,就是极大的减轻了后端的负担,使得页面渲染更快更方便,代价就是安全性难以得到保证,因为我们需永远记住——用户是不可靠的。 权限控制最简单的一种方式是路由控制,即根据用户或者角色的权限来决定哪些路由是可以访问的,比如新闻管理员只能访问新闻管理的页面,商品管理的页面他是访问不了的。较为复杂的权限控制则需要对访问的数据进行控制(比如有些帖子普通会员看不了图片),这个前端就很难实现了。我们在这里讨论路由控制的情况。 路由文件为src/router/index.js,代码较长,重复部分省略之: import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) import Layout from '@/layout' export const constantRoutes = [ { path: '/redirect', component: Layout, hidden: true, children: [ { path: '/redirect/:path(.*)', component: () => import('@/views/redirect/index') } ] }, { path: '/login', component: () => import('@/views/login/index'), hidden: true }, { path: '/', component: Layout, redirect: '/dashboard', children: [ { path: 'dashboard', component: () => import('@/views/dashboard/index'), name: 'Dashboard', meta: { title: 'Dashboard', icon: 'dashboard', affix: true }

Qt 绘制图片自适应窗口大小(QImage,QPixmap,QLabel)

工作过程中需要用某个控件展示本地图片文件,但又不想图片比例发生变化,导致文件查看时有变形感。因为只是极小一部分内容就直接使用QLable控件来完成此功能。 下面简单介绍一下我个人使用Label展示图片常用方法,若有错误欢迎指正 填充整个控件 ui->imgLable->setPixmap(QPixmap(imgpath));//label 加载图片imgpath ui->imgLable->setScaledContents(true); //根据label大小缩放图片 效果:图片填充整个label,且可以随label变化而变化,缺点则会改变图片比例导致有些图片显示不正常 // 根据label宽度等比例缩放图片 ui->imgLable->setPixmap(pix.scaledToWidth(ui->imgLable->width())); // 根据label高度等比例缩放图片 ui->imgLable->setPixmap(pix.scaledToHeight(ui->imgLable->height())); 效果:图片根据指定高度或宽度进行等比例变换,缺点是当label控件为preferred将会导致窗口忽大忽小,友好度较差; 等比例填充 QPixmap pix(imgpath); int scalHeight = ui->imgLable->height(); int scalWidth = pix.scaledToHeight(scalHeight).width();//根据label高度计算得到控件目标宽度 if(ui->imgLable->width() < scalWidth) {//再次调整,确保图片能够在控件中完整显示 scalWidth = ui->imgLable->width(); scalHeight = pix.scaledToWidth(scalWidth).height(); } ui->imgLable->setPixmap(pix.scaled(scalWidth,scalHeight,Qt::KeepAspectRatio)); 效果:此时图片比例不发生变化,且不会出现忽大忽小的现象。缺点是当主窗口改变大小时label图片大小不随之变化,需要主动做刷新操作; 以上操作还有更简单办法: pix = pix.scaled(ui->imgLable->width(),ui->imgLable->height(),Qt::KeepAspectRatio); ui->imgLable->setPixmap(pix); 注意scale参数AspectRatioMode,此参数用于控制缩放时是否保留原有比例关系: enum AspectRatioMode { IgnoreAspectRatio, KeepAspectRatio, KeepAspectRatioByExpanding }; 查看Qt帮助文档: 计算显示窗大小 int size_w = FIX_WIDTH;//展示框宽 int size_h = FIX_HEIGHT;//展示框高 QPixmap pix(imagefile); int width = pix.width(); int height = pix.

Python 爬虫进阶必备 | 关于某免费 IP 发布平台网页加密参数逻辑分析

今日网站 aHR0cHM6Ly93d3cuYmFpYmlhbmlwLmNvbS9ob21lL2ZyZWUuaHRtbA== 之前的一些简单的网站实例,要么改版要么网站都凉了,所以补充一个 eval 混淆的例子 抓包与定位 网站打开的显示是这样的,但是在ip地址这里做了简单的混淆 ip 这一栏在response这里显示的是一个函数名,明显是做了解密的操作 通过搜索函数名FFsheepishness 可以找到下面这个 js 在打开的 js 文件中可以看到下面这样的 js 代码 但是这里的ddip又找不到具体的逻辑,检索出来的结果ddip在下面第二段的eval中 所以就需要这里做个解密,并把解密好的代码复制出来,查看ddip的具体逻辑 通过console.log(xxx)打印的方式将打包后的代码解密出来 这里的xxx是网页index.js中eval包起来的代码 将两段eval混淆好的代码解出之后就可以看到ddip了 补全加密 接下来就是缺少补啥了,像我下面的截图里一样补全一下,直接运行代码看看代码缺少什么(这个文件里就只有上面亮两段eval解出来的 js 代码) 根据提示缺少的是$ 我们回到网页的index.js中继续找 只找到下面这个匿名函数 那应该就是这个了,我们把这段代码全复制出来,粘贴到刚刚报错代码的上方 在运行提示jQuery没有定义 这个时候不要去搞什么jQuery,我们看下逻辑,这里的jQuery都没用到,是上面发请求才用到的,这里直接改成传参$再次运行 还是提示的$没有定义,这里是因为我们的传入的参数在这个js文件中没有定义,所以我们要定义下$ 将$定义为{}再次运行就可以了 比对下网页的结果是一致的 好了,今天的文章到这里就结束了,我们下次再会~ Go 与 Python 混合开发的文章还在写,刚刚开始都是基础,大家可以自学 Love&Share [ 完 ] 对了,看完记得一键四连,这个对我真的很重要。

利普希茨连续(Lipschitz continuous)及其应用

参考链接: https://www.zhihu.com/question/51809602 https://zhuanlan.zhihu.com/p/27554191 https://blog.csdn.net/FrankieHello/article/details/105739610 目录 通俗解释 定义 ​​ 直观解释 通俗解释 以陆地为例。 岛屿:不连续 一般陆地:连续 丘陵:李普希兹连续 悬崖:非李普希兹连续 山包:可导 平原:线性 半岛:非凸 想了半天用什么来表达亚连续(semi-continuity),好像只能用瀑布了 稍微具体点的话,李普希兹连续就是说,一块地不仅没有河流什么的玩意儿阻隔,而且这块地上没有特别陡的坡。其中最陡的地方有多陡呢?这就是所谓的李普希兹常数。 悬崖的出现导致最陡的地方有“无穷陡”,所以不是李普希兹连续。 定义 Lipschitz连续,要求函数图像的曲线上任意两点连线的斜率一致有界,就是任意的斜率都小于同一个常数,这个常数就是Lipschitz常数。 从局部看:我们可以取两个充分接近的点,如果这个时候斜率的极限存在的话,这个斜率的极限就是这个点的导数。也就是说函数可导,又是Lipschitz连续,那么导数有界。反过来,如果可导函数,导数有界,可以推出函数Lipschitz连续。从整体看:Lipschitz连续要求函数在无限的区间上不能有超过线性的增长,所以这些和函数在无限区间上不是Lipschitz连续的。 其中常数L 称为f 在区间Q 上的Lipschitz常数。 除了Lipschitz continuous之外,Lipschitz continuous gradient 和 Lipschitz continuous Hessian也是常用到的概念,它们都是由Lipschitz continuous概念延伸出来的。值得一提的是,很多论文中,尤其是关于凸优化的问题,Lipschitz continuous gradient的应用更为常见。 直观解释 Lipschitz continuous: 函数被一次函数上下夹逼 Lipschitz continuous gradient :函数被二次函数上下夹逼 Lipschitz continuous Hessian :函数被三次函数上下夹逼 在我看来,Lipschitz continuous 用在函数值上是为了不让函数值变化的太快;用在导函数上,是为了不让导函数变化的太快;用在Hessian上,是为了让Hessian不变化的太快。但他们都导致了一个很有意思的结果:这个Lipschitz continuous不管用在什么上,都使的函数被多项式上下夹逼,一方面便于我们处理,另一方面至少我们能控制一下函数的包络信息。

git2.29.2.2怎么安装_制作Win10安装U盘时install.wim大于4G怎么办?

MS酋长之前已经分享过“最简单的Win10系统安装U盘制作方法”,只需要把Win10 ISO镜像的所有文件和文件夹都复制到U盘根目录下即可。因为考虑到兼容性,所以建议U盘格式化为FAT32格式。但是这就带来一个问题,64位Win10系统的安装镜像文件install.wim通常是大于4G的,而FAT32文件系统是无法存储大于4G的文件的。这时候我们只需按照以下的方法分割install.wim镜像文件,把它分割为小于4G的两个文件即可,一样不影响正常安装系统。 把下载好的Win10 ISO镜像文件解压或者用虚拟光驱加载。假如install.wim文件的路径为G:sourcesinstall.wim ,你想把分割后的文件保存到 F:Win10-2004 目录下。 右键点击Win10开始按钮,或按 Win + X 组合键,在弹出的系统快捷菜单中选择“Windows PowerShell(管理员)”,打开“管理员:Windows PowerShell”窗口。输入并回车运行以下命令: Dism /Split-Image /ImageFile:"G:sourcesinstall.wim" /SWMFile:F:Win10-2004 /FileSize:4000 DISM系统映像部署工具就会开始分割install.wim文件,把它分割为小于4G的swm文件保存到指定的 F:Win10-2004 目录下。 当提示操作成功完成,我们就可以在 F:Win10-2004 目录下看到已被分割成的install.swm和install2.swm两个文件了。如图: 现在你就可以把install.swm和install2.swm按照和原来的install.wim一样的路径放到FAT32格式的U盘里制作Win10系统安装U盘了。

Servlet基础知识(自学笔记)

使用工具:intellij idea2018版 需准备: (1)安装intellij idea (2)安装jdk (3)安装Tomcat (4)可以在创建工程之前配置好环境,也可以如下视频在创建过程中配置 1.servlet的简单介绍 servlet全称java Servlet,是用java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态web内容。是JavaWeb的三大组件之一(Filter和Listener) 作用:接受客户端发来的请求数据,处理数据,将处理结果通过响应发送给客户端 2.servlet的两种创建方式 (1)servlet3.0之前,通过web.xml部署描述文件,如下视频 第一个servlet.mp4 (2)servlet3.0之后,可以通过注解的方式创建,详细步骤基本同上,区别如下: a. 在new时选择servlet,然后输入名字即可 b.不用web.xml文件部署,在开头部署,如下标识 剩下的操作和视频1中是基本一样的。 3.request与response package com.study.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; @WebServlet(name = "RequestServlet",urlPatterns = "/request") public class RequestServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.

摄像头最多的ip段精品分享_米家的几款智能摄像头到底能同时供几个手机实时观看?...

今天测试了一下同时可以多少个设备查接入到米家app的摄像头 水哥智能家居:新房装修、老房智能改造都在这里--水哥智能家居精华帖索引 测试了以下型号摄像头: 1、小白智能摄像机大众版(99元) 高清画质,支持最多4个手机同时观看,不算很稳定,看的时间长了会断 平均速率100KB/s以下 2、大方1080P高清云台摄像机(149元) 高清画质,支持最多4个手机同时观看,稳定 3、小方智能摄像机(119元) 高清画质,支持最多4个手机同时观看,稳定 4、小米米家智能摄像机(119元) 高清画质,支持最多3个手机同时观看,稳定 目前看除了米家智能摄像机,其他3款都能支持到4个手机同时观看实时视频。 水哥费神码字作图,各位看官觉得本文对自己有用,还请举手点一下赞,不胜感激^_^

这么简单的三目运算符,竟然这么多坑?

最近在一个业务改造中,使用三目运算符重构了业务代码,没想到测试的时候竟然发生 NPE 的问题。 重构代码非常简单,代码如下: // 方法返回参数类型为 Integer // private Integer code; SimpleObj simpleObj = new SimpleObj(); // 其他业务逻辑 if (simpleObj == null) { return -1; } else { return simpleObj.getCode(); } 看到这段 if 判断感觉很是繁琐,于是使用三目运算符重构了一把,代码如下: // 方法返回参数类型为 Integer SimpleObj simpleObj = new SimpleObj(); // 其他业务逻辑 return simpleObj == null ? -1 : simpleObj.getCode(); 测试的时候,第四行代码抛出了空指针,这里代码很简单,显然只有 simpleObj#getCode才有可能发生 NPE 问题。 但是我明明为 simpleObj做过判空判断,simpleObj 对象肯定不是 null,那么只有 simpleObj#getCode 返回为 null。但是我的代码并没有对这个方法返回值做任何操作,为何会触发 NPE? 难道是又是自动拆箱导致的 NPE 问题? 在解答这个问题之前,我们首先复习一下三目运算符。 三目运算符 三目运算符,官方英文名称:Conditional Operator ?

联想m7400pro更换墨粉盒怎么清零_联想几种机型原装硒鼓加粉清零方法

本教程适用于联想M7615、M7605、M7675、LJ2605、LJ2405、M7455、M7405 LJ2605D/LJ2655DN/M7655DHF/M7675DXF/M7455DNF等 工具/原料 十字螺丝刀 碳粉 废报纸 方法/步骤 加粉方法 2.粉盒加完墨粉后,有的用户直接安装入打印机,但打印机仍然提示“墨粉用尽”,这时是没有对粉盒进行清零(或叫粉盒复位),下面介绍怎样粉盒清零 3.上面介绍联想原装粉盒加粉和清零过程. 注意事项 要是还是显示墨粉不足 说明清零齿轮没有安装到位 拆下安装以上方法重新安装即可本教程也适用于部分兄弟的机型

Mac电脑flutter安装成功了但是仍然提示flutter command not found

官方文档明确说明需要更新环境变量(明确来说就是需要配置全局的环境变量) 您在命令行只能更新当前会话的PATH变量,如Clone Flutter repo所示。 但是,您可能需要的是永久更新此变量,以便您可以运行flutter命令在任何终端会话中。 对于所有终端会话永久修改此变量的步骤是和特定计算机系统相关的。通常,您会在打开新窗口时将设置环境变量的命令添加到执行的文件中 打开命令行工具 输入 vim ./.bash_profile // 或者 sudo vi ~/.bash_profile 然后编辑该文件, 输入i即可进入编辑模式添加如下命令 // 这里是flutter安装的路径,每个人会有差异,找到自己正确的路径 export PATH=/Users/admin/Downloads/flutter/flutter/bin:$PATH 保存 .bash_profile 文件,按键盘上的ESC退出编辑模式,然后输入:wq保存并退出文件刷新 .bash_profile 文件 source $HOME/.bash_profile // 或者 source ~/.bash_profile 此时全局环境变量已经配置成功,可以在命令行输入flutter doctor 命令如果能正常运行,说明已经配置成功,若还是提示flutter command not found 则需要再进行配置(出现这个的原因:Mac电脑加载的是.zshrc文件,下面是解决方案)命令行输入 sudo vi ~/.zshrc 编辑 .zshrc文件, 输入i进入到编辑模式,在最后一行输入 source ~/.bash_profile 保存.zshrc 文件,按ESC退出编辑模式,输入:wq保存退出刷新.zshrc 文件 source ~/.zshrc 然后再在命令行中输入 flutter doctor ,这时候会看到相关信息