在使用antd的过程中,组件Modal中嵌套了一个form表单,需要点击table表格中的编辑按钮,该行数据可以在form表单中进行回显。
表格编辑按钮:
const edit = (record:DataType) => { (childRef.current as any).showModalEdit(record); }; form表单
1.Modal中destroyOnClose={true}搭配form表单preserve={false}使用,可以做到关闭modal,form表单数据清空
<Modal title="创建" open={isModalOpen} okText="提交" cancelText="取消" destroyOnClose={true} onOk={handleOk} onCancel={handleCancel} forceRender> <Form name="basic" form={form} style={{ maxWidth: 600 }} initialValues={{ remember: true }} onFinish={onFinish} onFinishFailed={onFinishFailed} autoComplete="off" preserve={false} > </Form> </Modal> 2.点击编辑按钮,传递该行数据record,在form组件中声明recordobject,点击编辑,modal弹出,将record赋值给recordobject,利用useEffect监督recordobject的变化,并在useEffect中通过form.setFieldsValue设置表单的值。
const [recordobject, setIsRecord] = useState({}); const [form] = Form.useForm(); useEffect(() => { form.setFieldsValue({...recordobject}) }, [recordobject]) const showModal = () => { setIsModalOpen(true); }; const showModalEdit = (record:any) => { setIsModalOpen(true); setIsRecord(record); };
Java面试题-并发篇 一、线程 1. 线程和进程有什么区别? 线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
执行过程:每个独立的进程有程序运行的入口. 顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
2. 创建线程的三种方式的对比? 1)采用实现Runnable. Callable接口的方式创建多线程。
优势是:
线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU. 代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
劣势是:
编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。
2)使用继承Thread类的方式创建多线程
优势是:
编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。
劣势是:
线程类已经继承了Thread类,所以不能再继承其他父类。
3)Runnable和Callable的区别
Callable规定(重写)的方法是call(),Runnable规定(重写)的方法是run()。Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。Call方法可以抛出异常,run方法不可以。运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。 3. 为什么要使用多线程呢? 从计算机底层来说: 线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。从当代互联网发展趋势来说: 现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。 从计算机底层来说:
单核时代: 在单核时代多线程主要是为了提高 CPU 和 IO 设备的综合利用率。举个例子:当只有一个线程的时候会导致 CPU 计算时,IO 设备空闲;进行 IO 操作时,CPU 空闲。我们可以简单地说这两者的利用率目前都是 50%左右。但是当有两个线程的时候就不一样了,当一个线程执行 CPU 计算时,另外一个线程可以进行 IO 操作,这样两个的利用率就可以在理想情况下达到 100%了。多核时代:多核时代多线程主要是为了提高 CPU 利用率。举个例子:假如我们要计算一个复杂的任务,我们只用一个线程的话,CPU 只会一个 CPU 核心被利用到,而创建多个线程就可以让多个 CPU 核心被利用到,这样就提高了 CPU 的利用率。 4. 线程的状态流转 线程的生命周期及五种基本状态:
MVVM 一、概述二、演变2.1 MVC2.2 MVP 三、MVVM2.1 ViewModel2.1.1 基本用法2.1.2 本地存储数据 2.2 LiveData2.2.1 基本使用 一、概述 MVVM(Model-View-ViewModel)和MVC、MVP一样,也是一种项目架构模式,目前广泛应用在Android程序设计。MVVM主要由三部分组成,Model数据模型部分,View视图展示部分,ViewModel则是一个特殊的部分,为视图与数据模型的中间件。大概的结构如下图
这张图中,将程序分为了若干层。其中,UI控制层包含了我们平时写的Activity、Fragment和布局文件等与界面相关的东西。ViewModel层用于持有和UI元素相关的数据,以保证这些数据在屏幕旋转等动作时不会丢失,并且还要提供接口给UI控制层调用以及和仓库层进行通信。仓库层要做的主要工作是判断调用方请求的数据应该是从本地数据源中获取还是从网络数据源中获取,并将获取到的数据返回给调用方。本地数据源可以使用数据库、SharedPreferences等持久化技术来实现,也可以用网络数据源,通常访问服务器提供的Webservice接口来实现。并且,图中的所有箭头都是单向的,即是单向引用,具体原因下面会给到解释。
二、演变 所谓前人栽树,后人乘凉,项目架构也是如此,现在的架构,取老架构的精华,去其糟粕,变得越来越完善,但是掌握老架构能让我们对新架构有更好的理解
2.1 MVC 最经典的还是MVC,MVC架构中,很多的逻辑代码都写在了Activity中,后期需求的增加或者变更,Activity就会变得过于庞大,这时候的MVC变得难以维护,一度被吐槽为Massive-View-Controller(意为沉重的Controller),这种情况下,MVP出现了
2.2 MVP MVP架构的核心就是View与Presenter都被抽象成了接口,面向接口编程。因为面向接口,所以实现了依赖隔离。通俗点的解释View层只负责UI渲染,不再需要处理对应的业务逻辑,Presenter在获取到Model的数据,并进行处理后,通过View层暴露的接口调用去更新UI,这样View层和Model层不互相持有引用,保证是隔离和解耦的。
MVP架构将我们从庞大的Activity中解救出来,只需定义好View与Presenter的接口,即可实现UI与业务逻辑独立开发,并且业务逻辑只在Presenter中进行维护,遵循了单一职责类的设计原则,提升了代码的可维护性;接口请求及缓存策略只在Model中进行维护,同Presente 一样,遵循了单一职责类的设计原则。View、Presenter、Model 类的体积都不会太大,提升了代码的可读性与可维护性。
看起来已经很完善的MVP同样也有缺点
1、Presenter层中,需要处理的业务逻辑过多,复杂的业务逻辑会使Presenter层非常庞大和臃肿,且Presenter中除了业务逻辑以外,还有大量的View->Model,Model->View的手动同步逻辑,维护困难
2、接口及接口中声明的方法粒度不好把控。MVP的架构不是固定的,可能会随着实际需求的不同而有不同的改动。P层就是一个变化比较多的地方,P层的意义是使V与M层解耦。如果粒度太小,那么一旦业务多起来,我们的P层会非常臃肿。而如果粒度太大,那么我们一个P层确实可以达到复用,可却导致了我们不同需求的V层复用同一个P层接口时,实现了过多不需要的方法,这就是非常典型的违背了接口隔离,接口的实现类不应该实现没有的方法。而其中有些方法是否会用到以及是否会增加或删减还需要后续进一步确认。
3、Activity中需要声明大量跟UI相关的方法,而相应的事件通过Presenter调用相关方法来实现。两者互相引用和调用,存在耦合。一旦View层的UI视图发生改变,接口中的方法就需要改变,View层和P层同时都需要修改。
总结就是形式上解耦,职责分工却耦合,结构清晰,写起来不方便。
三、MVVM MVP的一些缺点,在MVVM中得到很好的改善,MVVM的运用,离不开Jetpack的一些组件。
Jetpack是一个开发组件工具集,它的主要目的是帮助我们编写出更加简洁的代码,并简化我们的开发过程。Jetpack中的组件有一个特点,它们大部分不依赖于任何Android系统版本,这意味着这些组件通常是定义在AndroidX库当中的,并且拥有非常好的向下兼容性。
Jetpack主要可以分为基础、架构、行为、界面这四部分。这四部包含了大量组件,许多架构组件都是专门为MVVM架构量身打造的。
2.1 ViewModel 2.1.1 基本用法 ViewModel 应该可以算是Jetpack 中最重要的组件之一了 ,可以帮助Activity 分担一部分工作,专门用于存放与界 面相关的数据的。也就是说,只要是界面上能看得到的数据,它的相关变量都应该存放在 ViewModel 中,而不是Activity 中,这样可以在一定程度上减少Activity 中的逻辑。
ViewModel 还有一个非常重要的特性。我们都知道,当手机发生横竖屏旋转的时候, Activity 会被重新创建,同时存放在Activity 中的数据也会丢失。而ViewModel 的生命周期和 Activity 不同,它可以保证在手机屏幕发生旋转的时候不会被重新创建,只有当Activity 退出的 时候才会跟着Activity 一起销毁。因此,将与界面相关的变量存放在ViewModel 当中,这样即使旋转手机屏幕,界面上显示的数据也不会丢失。下图是ViewModel的生存期。
下面是创建一个基本的ViewModel实例,需要注意的是ViewModel的实例化,不能直接实例化,而是需要通过ViewModelProvider去获取,之所以不能直接创建实例,是因为ViewModel有其独立的生命周期,并且其生命周期要长于Activity。
打个比方我们在onCreate()方法中创建ViewModel的实例,那么每次onCreate()方法执行的时候,ViewModel都会创建一个新的实例,这样当手机屏幕发生旋转的时候,就无法保留其中的数据了。
MainActivity.java
private TextView textView; private Button plusOneBtn; private MainViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.
WEB服务器、应用程序服务器、HTTP服务器有何区别?IIS、Apache、Tomcat、Weblogic、WebSphere 都各属于哪种服务器?这些问题困惑了很久,今天终于梳理清楚了:
Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。与客户端的网络浏览器配合。因为Web服务器主要支持的协议就是HTTP,所以通常情况下HTTP服务器和WEB服务器是相等的(有没有支持除HTTP之外的协议的web服务器,作者没有考证过),说的是一回事。
应用程序服务器(简称应用服务器),我们先看一下微软对它的定义:”我们把应用程序服务器定义为“作为服务器执行共享业务应用程序的底层的系统软件”。 就像文件服务器为很多用户提供文件一样,应用程序服务器让多个用户可以同时使用应用程序(通常是客户创建的应用程序)”
通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑 (business logic)。
以Java EE为例,Web服务器主要是处理静态页面处理和作为 Servlet容器,解释和执行servlet/JSP,而应用服务器是运行业务逻辑的,主要是EJB、 JNDI和JMX API等J2EE API方面的,还包含事务处理、数据库连接等功能,所以在企业级应用中,应用服务器提供的功能比WEB服务器强大的多。
以这样的定义,IIS、Apache、Tomcat都可以属于Web服务器,Weblogic、WebSphere都属于应用服务器。
Apache
在Web服务器中,Apache是纯粹的Web服务器,经常与Tomcat配对使用。它对HTML页面具有强大的解释能力,但是不能解释嵌入页面内的服务器端脚本代码(JSP/Servlet)。
Tomcat
早期的Tomcat是一个嵌入Apache内的JSP/Servlet解释引擎Apache+Tomcat就相当于IIS+ASP。后来的Tomcat已不再嵌入Apache内,Tomcat进程独立于Apache进程运行。 而且,Tomcat已经是一个独立的Servlet和JSP容器,业务逻辑层代码和界面交互层代码可以分离了。因此,有人把Tomcat叫做轻量级应用服务器。
IIS
微软早期的IIS,就是一个纯粹的Web服务器。后来,它嵌入了ASP引擎,可以解释VBScript和JScript服务器端代码了,这时,它就可以兼作应用服务器。当然,它与J2EE应用服务器根本无法相比,但是,从功能上说,从原理上说,它勉强可以称之为应用服务器。确切地说,它是兼有一点应用服务器功能的Web服务器。
综上:
Apache是纯粹的web服务器,而Tomcat和IIS因为具有了解释执行服务器端代码的能力,可以称作为轻量级应用服务器或带有服务器功能的Web服务器。Weblogic、WebSphere因为能提供强大的J2EE功能,毫无疑问是绝对的应用服务器。对于处于中间位置的Tomcat,它可以配合纯Web服务器Apache一起使用,也可以作为应用服务器的辅助与应用服务器一起部署:
一、Tomcat与应用服务器 到目前为止,Tomcat一直被认为是Servlet/JSP API的执行器,也就所谓的Servlet容器。然而,Tomcat并不仅仅如此,它还提供了JNDI和JMX API的实现机制。尽管如此,Tomcat仍然还不能算是应用服务器,因为它不提供大多数J2EE API的支持。
很有意思的是,目前许多的应用服务器通常把Tomcat作为它们Servlet和JSP API的容器。由于Tomcat允许开发者只需通过加入一行致谢,就可以把Tomcat嵌入到它们的应用中。遗憾的是,许多商业应用服务器并没有遵守此规则。
对于开发者来说,如果是为了寻找利用Servlet、JSP、JNDI和JMX技术来生成Java Web应用的话,选择Tomcat是一个优秀的解决方案;但是为了寻找支持其他的J2EE API,那么寻找一个应用服务器或者把Tomcat作为应用服务器的辅助,将是一个不错的解决方案;第三种方式是找到独立的J2EE API实现,然后把它们跟Tomcat结合起来使用。虽然整合会带来相关的问题,但是这种方式是最为有效的。。
二、Tomcat与Web服务器 Tomcat是提供一个支持Servlet和JSP运行的容器。Servlet和JSP能根据实时需要,产生动态网页内容。而对于Web服务器来说, Apache仅仅支持静态网页,对于支持动态网页就会显得无能为力;Tomcat则既能为动态网页服务,同时也能为静态网页提供支持。尽管它没有通常的Web服务器快、功能也不如Web服务器丰富,但是Tomcat逐渐为支持静态内容不断扩充。大多数的Web服务器都是用底层语言编写如C,利用了相应平台的特征,因此用纯Java编写的Tomcat执行速度不可能与它们相提并论。
一般来说,大的站点都是将Tomcat与Apache的结合,Apache负责接受所有来自客户端的HTTP请求,然后将Servlets和JSP的请求转发给Tomcat来处理。Tomcat完成处理后,将响应传回给Apache,最后Apache将响应返回给客户端。
而且为了提高性能,可以一台apache连接多台tomcat实现负载平衡。
关于WEB服务器、应用程序服务器的更详细区别可以参考下面这篇文章:
通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑 (business logic)。
下面让我们来细细道来:
Web服务器(Web Server) Web服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应 (response),例如送回一个HTML页面。为了处理一个请求(request),Web服务器可以响应(response)一个静态页面或图片,进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序例如CGI脚本,JSP(JavaServer Pages)脚本,servlets,ASP(Active Server Pages)脚本,服务器端(server-side)JavaScript,或者一些其它的服务器端(server-side)技术。无论它们(译者注:脚本)的目的如何,这些服务器端(server-side)的程序通常产生一个HTML的响应(response)来让浏览器可以浏览。
要知道,Web服务器的代理模型(delegation model)非常简单。当一个请求(request)被送到Web服务器里来时,它只单纯的把请求(request)传递给可以很好的处理请求 (request)的程序(译者注:服务器端脚本)。Web服务器仅仅提供一个可以执行服务器端(server-side)程序和返回(程序所产生的)响应(response)的环境,而不会超出职能范围。服务器端(server-side)程序通常具有事务处理(transaction processing),数据库连接(database connectivity)和消息(messaging)等功能。
虽然Web服务器不支持事务处理或数据库连接池,但它可以配置(employ)各种策略(strategies)来实现容错性(fault tolerance)和可扩展性(scalability),例如负载平衡(load balancing),缓冲(caching)。集群特征(clustering—features)经常被误认为仅仅是应用程序服务器专有的特征。
应用程序服务器(The Application Server) 根据我们的定义,作为应用程序服务器,它通过各种协议,可以包括HTTP,把商业逻辑暴露给(expose)客户端应用程序。Web服务器主要是处理向浏览器发送HTML以供浏览,而应用程序服务器提供访问商业逻辑的途径以供客户端应用程序使用。应用程序使用此商业逻辑就象你调用对象的一个方法 (或过程语言中的一个函数)一样。
应用程序服务器的客户端(包含有图形用户界面(GUI)的)可能会运行在一台PC、一个Web服务器或者甚至是其它的应用程序服务器上。在应用程序服务器与其客户端之间来回穿梭(traveling)的信息不仅仅局限于简单的显示标记。相反,这种信息就是程序逻辑(program logic)。正是由于这种逻辑取得了(takes)数据和方法调用(calls)的形式而不是静态HTML,所以客户端才可以随心所欲的使用这种被暴露的商业逻辑。
在大多数情形下,应用程序服务器是通过组件 (component) 的应用程序接口(API)把商业逻辑暴露(expose)(给客户端应用程序)的,例如基于J2EE(Java 2 Platform, Enterprise Edition)应用程序服务器的EJB(Enterprise JavaBean)组件模型。此外,应用程序服务器可以管理自己的资源,例如看大门的工作(gate-keeping duties)包括安全(security),事务处理(transaction processing),资源池(resource pooling),和消息(messaging)。就象Web服务器一样,应用程序服务器配置了多种可扩展(scalability)和容错(fault tolerance)技术。
#{}和${}的区别是什么? {}和${}的区别是什么?
在Mybatis中,有两种占位符
#{}解析传递进来的参数数据${}对传递进来的参数原样拼接在SQL中#{}是预编译处理,${}是字符串替换。使用#{}可以有效的防止SQL注入,提高系统安全性。 当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”> select order_id id, order_no orderno ,order_price price form orders where order_id=#{id}; </select> 复制
第2种: 通过来映射字段名和实体类属性名的一一对应的关系
<select id="getOrder" parameterType="int" resultMap="orderresultmap"> select * from orders where order_id=#{id} </select> <resultMap type=”me.gacl.domain.order” id=”orderresultmap”> <!–用id属性来映射主键字段–> <id property=”id” column=”order_id”> <!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–> <result property = “orderno” column =”order_no”/> <result property=”price” column=”order_price” /> </reslutMap> 复制
我认为第二种方式会好一点。
如何获取自动生成的(主)键值? 如何获取自动生成的(主)键值?
如果我们一般插入数据的话,如果我们想要知道刚刚插入的数据的主键是多少,我们可以通过以下的方式来获取
需求:
user对象插入到数据库后,新记录的主键要通过user对象返回,通过user获取主键值。 解决思路:
系列文章 第十三章 手把手教你:基于python的文本分类(sklearn-决策树和随机森林实现)第十二章 手把手教你:岩石样本智能识别系统第十一章 手把手教你:基于TensorFlow的语音识别系统 目录 系列文章一、项目简介二、任务介绍三.界面简介四.数据简介五、代码功能介绍1.依赖环境集IDE2.数据处理3.模型构建及训练4.模型测试5.Django展示界面构建 六、代码下载地址 一、项目简介 本文主要介绍如何使用python语言,基于bert的文本分类和Django的网站设计实现一个:基于Django和bert的新闻文本分类可视化系统,如果有毕业设计或者课程设计需求的同学可以参考本文。本项目同时使用了深度学习框架TensorFlow 1.X的版本,IDE为pycharm。完整代码在最下方,想要先看源码的同学可以移步本文最下方进行下载。
博主也参考过文本分类相关模型的文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个可视化系统即可。
也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。
如果您有以上想法,那就找对地方了!
不多废话,直接进入正题!
二、任务介绍 本次任务是一个较为复杂的新闻文本分类的任务,首先需要使用bert模型对新闻文本进行分类,然后使用Django构建一个文本分类结果查询的可视化系统。
我们的任务是要构建一个模型,任意输入一篇新闻文章,可以将新闻文本分为以下几类:
label: ['体育', '财经', '房产', '家居', '教育', '科技', '时尚', '时政', '游戏', '娱乐'] 三.界面简介 系统完成后界面如下:
页面一:一个文本输入界面,可以将需要分类的新闻文本写入对话框。
页面二:根据输入的文本调用后台模型进行预测并分类,我这里任意找了一个娱乐新闻,可以看到文本被正确分类了。 点我下载本项目全部代码! 四.数据简介 本次使用的数据为标注后的文本,共计10类:['体育', '财经', '房产', '家居', '教育', '科技', '时尚', '时政', '游戏', '娱乐'],见下图:
五、代码功能介绍 1.依赖环境集IDE 本项目使用的是anaconda的jupyter notebook编译环境,如不清楚如何使用的同学可以参考csdn上其他博主的基础教程,这里就不进行赘述。
tensorflow 1.9.0以上
sklearn
pandas
python3
2.数据处理 我们先通过脚本将数据集分为:train.tsv、dev.tsv、test.tsv、pre_test.tsv,四部分 class TextProcessor(object): """按照InputExample类形式载入对应的数据集""" """load train examples""" def get_train_examples(self, data_dir): return self._create_examples( self._read_file(os.path.join(data_dir, "train.tsv")), "
【浏览器调试工具精讲】Chrome Dev Tools精讲,前端必看!
文章目录 命令菜单主题切换截屏窗口停放位置 常用Tabelement查找ID修改样式、样式文件定位 样式的来源如继承、自定义等让某个状态常驻如鼠标悬停全局、部分样式的的选择与取消复制样式某个样式属性的选择 compted console错误级别组grouptime计时 sourcenetworkApplication 命令菜单 主题切换 Command shift P 输入主题关键字:可以切主题
截屏 screen shot 部分截屏
full size screenshot 全截屏(包含滚动条下的内容)
node screen shot截取node
node screen shot截取node: 1选择元素, 2node screen shot进行截取
窗口停放位置 依次为:底部、左侧、独立窗口、
常用Tab element 检查元素: 选中元素,右键检查
把鼠标放在element上的网盘元素上,左侧页面出现两种颜色:蓝色是本我的大小,橘色是magin。可以尝试element的其他元素,如更多会出现绿色padding
查找DOM元素,
快捷键:command + F
查询方式: 文本查询、css选择器、Xpath
文本查询
输入关键词即可
css选择器
查找session, : session
查找ID为head的div: div#head
Xpath
//div/div/a 意思://不指定某个元素,即在全局内查找。A/B指定在元素A下查找元素B
整体意思:
查找ID 修改样式、样式文件定位 样式的来源如继承、自定义等 user agent 浏览器内置的
让某个状态常驻如鼠标悬停 全局、部分样式的的选择与取消 全局样式的选择与取消
部分样式的选择与取消
问:
您好,我是永兴证券的,我咨询下生产中遇到2个的问题,想听听您的建议。
1.我们目前没有成熟的CMDB,我们正常维护资产信息是通过Excel表单的形式的CMDB,我们对Zabbix的使用覆盖度较高,基本上所有的系统上架的流程中都有监控的添加,添加后也会使用标签区分。在实际的使用过程中,我发现去查关键信息时,把Zabbix信息看成了CMDB的一部分。例如:我需要集很多资产,其中一部分是通过标签加入的,如此Zabbix中的信息就会全面。我想咨询下:把Zabbix当作CMDB来用,比CMDB使用更深入,长期如此会不会出现问题?
答:
您在Zabbix中配置主机的标签,并且深入使用是否会对Zabbix系统有响应的影响。您是根据具体的情况去配置的,使用深入是很好的。能够实现您具体的一些功能,但是您担心可能是后续的维护。当您公司的发展规模越来越大后必定会有相应的分拆(即,最小化的配置&响应工具的拆分)。故此,需要根据您公司的运维规划合理设置。
问:
2.我对一个主机中添加标签,我需要加多少?有无上限?我加多了会不会有问题?例如:我使用信息时通过API去查主机的信息,查取后,我定义的标签过多,是否会对我的主机信息或Zabbix性能有影响?
答:
标签使用多了是否对性能有影响?标签本身就是偏向静态的,其本身是不会对你的性能带来太大的开销,而且,如果您的资产对应的标签能够满足您的要求,您可以去添加,添加得太多反而会影响使用,这个就没有太大的必要了。因为就像数据采集一样,你什么数据都采集,但是你到实际情况时根本不知道要看什么数据,故此,这需要根据实际情况,哪一些是需要的,另外有一些不需要的就完全没有必要添加进去。
问:
何老师您好,我在项目中经常会碰到有些客户会问针对标签方面的问题,目前6.0刚出来,在实施的过程中的权限问题。在Zabbix6.0之前的版本,是通过组的形式来控制权限,我想问用户如何更方便的控制权限,针对于查看触发器、监控项,可以做到这一步嘛?
答:
关于这一块我也咨询过原厂的首席培训师,Zabbix能否做到监控指标维度的权限控制,这一块也常在用户现场被提问。例如:某一块的数据并不是要全部开放,我只想给它开放CPU、内存的一些信息,目前是实现不了的,但是后面也会进一步做到监控指标的权限控制。因为我们把监控指标都添加了标签,标签的使用场景越来越多了,故此,向这一步细化的可能性会很大。
本文整理自上海宏时数据 Zabbix培训师 何星 在2022Zabbix峰会演讲分享。ppt可在公众号后台回复“ppt"。
1、Zabbix标签的介绍
Zabbix标签主要分5类有6个类型,前面几个类型是使用得最多的,后面则为比较新的标签。有我们比较熟悉的,如:模板、主机、监控项和触发器的标签。
标签既然有如此多的维度,那他们之间是否有相应的继承关系呢?确实是有继承关系的!Zabbix的数据流,模板上定义监控项标签,将模板与主机进行关联,开始采集数据并且去评测采集的数据是否满足对应的条件,以上是我培训的时候最常讲的,是最基本的一个数据流。
当模板与主机进行关联之后,对应的监控项和触发器会继承到对应的标签,最后在事件当中反映出来。
以下介绍Zabbix具体的使用场景。对应的事件、主机、监控项的过滤、对应的信息查询以上是最常用的。除了查询之外,我们还可以做一些稍微高级的配置,如:我们根据用户群组做对应的事件权限的控制,以及在触发剂动作条件中去配置标签作为条件。
配置维护期时,也可以根据标签来作为他的条件。此外的使用场景:触发器对应恢复。前面我的同事王军讲SNMP Trap的对应恢复时提到SNMP Trap会有较多的事件,一个事件恢复之后才会产生新的事件,这是不合理的。有可能一次性出现很多事件,可以通过标签做到对应的事件恢复。
事件压制和全局事件的关联,Zabbix是内置有事件压制的功能,当然得根据你的实际情况去使用。可计算的监控项,也可以根据标签做对应的一个过滤。
2、资产自动维护场景
将标签应用到实际运维场景中。大家可能会好奇,资产自动维护是怎样自动维护的呢?资产是否与CMDB有关系呢?
将资产分为几类,如:常用的操作、系统、数据库、中间键、虚拟化、存储、硬件设备。可能您的公司较大,建设有一套完整的CMDB系统;可能您的公司较小,大家需要用表格维护,都没有问题。以上都是资产,都是对公司有用的信息。当然一般都建议使用CMDB,需要有一定的成熟度,它的数据相对而言较可靠,当然并不要求完全可靠。
Zabbix和CMDB联动较重要的功能是:Zabbix能推动CMDB的建设。
讲一个最基本的、也是客户提出来的需求:我有很多Zabbix监控的主机和资产,我想知道产生事件的时候我要去联系谁?
例如:当该事件出来后,他的第一联系人是谁呢?从事这个工作的人员,当有事件出来,“叮”有个声音告警,需要打电话,突然出现一个没有联系的,那打给谁呢?打给值班的。目前是通过第三方平台去实现的,如:事件平台、告警平台。
为避免部署多套系统,在Zabbix中怎样去实现呢?
上图中有用户、触发器、标签。前面讲到了最基本的需求——我该联系谁?
肯定得有用户,用户从哪里去拿?1.你的CMDB当中或者说HR管理系统中去获取联系人信息,添加到Zabbix用户当中。Zabbix用户就是一些普普通通的用户,你可以去设置登录。其他的统一告警管理平台,就是张表。你需要做到对应的一些增删改。
比如:新员工入职了,要让他管一些系统;老员工离职了,要把他踢出去。不至于他人离职了还给他发短信、邮件,这又不归他管。此外有可能在职员工的手机号码变更了,肯定需要进行更新维护。
更新维护怎样与事件关联呢?需要通过触发器的标签,为什么此处要选择标签而不选择资产呢?
CMDB就是资产,Zabbix里面有主机的资产,但是Zabbix里面的资产字段是固定的,不能做修改的。很多时候一台主机上既监控操作系统数据库或者中间键。当在主机层面直接去配置资产时,根本做不到对应的类型显示对应的资产。
所以我们最终选择在标签层面、触发器层面,进行标签的配置。最终显示的模板上的标签
或者触发器监控项的标签,最终都会汇总到事件中,可以在事件中查看对应的标签信息。
一台主机上有操作系统、数据库、中间键,肯定是改对应的资产类型,改操作需要进行过滤,一台主机上所有的触发器修改了,它的标签也随着修改了,这肯定是不合理的。
前面有演讲嘉宾讲到,对应的CMDB需要有一个唯一的字段,否则无法进行关联。无法进行对应的数据治理,CMDB与Zabbix对接也是一样的。必须要有一个唯一的字段才能够建立相应的关联关系。通过这个字段可以知道它是增加、删除或是修改的。
普通的触发器在主机层面是可以直接修改标签的,但是,如果是触发器原型生成的触发器是没法直接进行修改的。所以需要直接在触发器原型中进行配置。
举例一个场景,如:监控多实例的对象,多实例的对象可能联系人都不同。
这个时候有人可能说做不到这个层面,对应的一个IP的数据库,即使多实例也发给相同的管理人员,可能有一些人不纠结,有一些人比较纠结,可能说这个并不是我管的CMDB里面有对应的数据你发给我干嘛?那这个时候怎么做呢?
通过Zabbix的触发器原型就可以实现,以上看起来会有点复杂,要实现功能比较强大。因为它的标签名称和标签值中都可以使用LLD宏和用户宏,前面讲了这么多理论,要实现相应的功能,具体怎样实现呢?我们需要去调Zabbix API。
那常用的一些功能,我们可以写成一个方法去统一调用。做成共用 的方法可以避免以下2个问题1.具体要怎么去配置?2.其他人共同参与应该怎样?
获取也是一样的,修改之后需要做比对。修改的是否正确,后面实现相应的纳管率的显示。具体是怎样的效果呢?
例如此处为相同IP上挂了操作系统数据库,数据库为多实例的,需要显示不同的资产信息,在标签中可以进行查看,如:操作系统的对应的资产信息、主题名称、主题管理员中有相应的名称、电话号码、邮箱信息,此外它的应用类型、所属的部门 、业务系统,这些信息都可以拿到。
此外在同一台主机上的数据库也一样可以获取到对应数据库管理员的信息,以及数据库的字段。另外实例也是同样的,可以显示不同的数据库管理员的信息以做到精准匹配。
前面讲到了对应的修改,建设历程是相较麻烦的,对应的需要去了解它的准确率以及纳管率。
纳管率,之前的演讲嘉宾讲到了,拉出来CMDB资产后,是否完全纳管?有哪些没有纳管呢?我该怎样去做?领导说:“纳管率需要达到多少。有没有数据?”以上都能给到一个直观的印象。可以通过触发器标签实现以上应用场景,建设不可能是一蹴而就的,需要分批跑,可以先选择一种类型。这也不影响CMDB,即使它的数据不完全准确,但是通过edx的联动后,告警发出去,相应岗位的同事肯定会有反馈的,从而促使CMDB的进一步完善。
我们在安装了 Visual Studio 之后,Visual Studio 会在右键菜单自动添加“在 Visual Studio 中打开”选项,有时候稍不注意就会点中打开 Visual Studio 带来不必要的麻烦,而且一般我们也不需要这个选项。
这里总结了两种方式,皆为通过修改注册表的方式删除“在 Visual Studio 中打开”选项。
方法一 按下 win+R 打开运行,输入 regedit 打开注册表编辑器。
删除 HKEY_CLASSES_ROOT\Directory\background\shell\AnyCode
删除 HKEY_CLASSES_ROOT\Directory\shell\AnyCode
方法二 新建一个文本文档(.txt),输入以下内容: Windows Registry Editor Version 5.00 [-HKEY_CLASSES_ROOT\Directory\Background\shell\AnyCode] [-HKEY_CLASSES_ROOT\Directory\shell\AnyCode] 将文件后缀名改为 .reg ,双击运行文件。
注册表编辑器会提示是否继续,选择继续即可。
CSS navbar 导航栏vertical navbar 垂直导航栏horizontal navbar 水平导航栏overflow: hidden navbar 导航栏 易用的导航对于任何网站都很重要
通过使用 CSS 可以将无聊的 HTML 菜单转换为美观的导航栏
导航栏 = 链接列表
导航栏需要标准 HTML 作为基础
在我们的实例中,将用标准的 HTML 列表构建导航栏
导航栏基本上就是链接列表,因此使用 和 元素会很有意义 <!DOCTYPE html> <html> <body> <ul> <li><a href="#home">Home</a></li> <li><a href="#news">News</a></li> <li><a href="#contact">Contact</a></li> <li><a href="#about">About</a></li> </ul> <p class="note"><span>注释:</span>将href="#'用于测试链接,在实际网站中使用的是URL</p> </body> </html> 从列表中删除项目符号及其默认的外边距和内边距(填充)
ul { list-style-type: none; margin: 0; padding: 0; } /* list-style-type: none; - 删除项目符号,导航条不需要列表项标记 设置 margin: 0; 和 padding: 0; 删除浏览器的默认设置 上例中的代码是垂直和水平导航栏中使用的标准代码 */ vertical navbar 垂直导航栏 /* 构建垂直导航栏可以在列表中设置 <a> 元素的样式 背景色被添加到链接以显示链接区域 注意整个链接区域都是可单击的而不仅仅是文本 display: block */ ul { list-style-type: none; margin: 0; padding: 0; width: 60px; } li a { display: block; width: 60px; background-color: #dddddd; } /* display: block; - 将链接显示为块元素可以使整个链接区域都可以被单击(而不仅仅是文本),我们还可以指定宽度(如果需要,还可以指定内边距、外边距、高度等) width: 60px; - 默认情况下,块元素会占用全部可用宽度。我们需要指定 60 像素的宽度 */ 垂直导航栏实例
图片|Photo by BoliviaInteligente on Unsplash
©自象限原创
作者|罗辑
编辑|黑豆
排版|李帛锦
可能是大模型,把周鸿祎激活了。
6月27日,周鸿祎,突然晒出了清华大学的博士录取通知书,“终于考上了,希望360智脑帮我顺利毕业”。
要知道,虽然360近年来的表现不算亮眼,他个人生活也不算顺利;但他也早已功成名就,不必在53岁时,这么和年轻人拼了。
他正处于,或者在努力证明360也处于这种极具生命力的状态之中。
半个月前,360举办了智脑大模型应用发布会,宣布智脑升级到4.0版本。这是一个月内,360的第二场大模型发布会。期间他亲自在各种场合,分发邀请码。
相比之下,同一个时间点,百度的文心一言、阿里的通义千问,或是商汤等,都只开了一场发布会,没有智脑这么“着急”。
他甚至向自己“开炮”。
“我认为所有做搜索的企业都应该抽自己几个耳光。”
发布会上,周鸿祎反思:“其实,包括360在内的做搜索的公司,早几年就关注大模型了,但是缺乏ChatGPT的创新精神。当时大家的心态都比较鸡贼,主要想着解决实际问题,比如怎么让广告卖的更好,怎么让推荐更准确,让用户欲罢不能。”
其中的懊恼溢于言表。毕竟从2015年开始,他几乎没错过任何热点。从2015年的花椒直播、2016年的互联网金融(360数科),到2017年做360手机、奶糖短视频,再到2021年投资哪吒汽车……结果……反正这些没有让360像上一个十年那样,持续站在互联网大舞台中央。
如果这就是“鸡贼”,那这种鸡贼正是过去十年互联网公司浮躁氛围的体现。
但毕竟他是周鸿祎,曾成功让资本市场为一个独特的中国的商业模式买单,并差一点就像乔布斯那样做成“big thing”的人。
所以现在,每一个关注他的人都会发现,他的不甘心已经明明白白写在脸上。他要追回失去的时光,他要做big thing,他要重回舞台中央。
从2月11日到现在,他在抖音发布了近80条和AI大模型相关的内容,占比超过90%。此外,他的所有直播,张朝阳对话、与冯仑坐谈、还是在俞敏洪的直播间卖货,都是三句话不离大模型。
大模型,就是这个初代目互联网大佬最后的倔强。
谋局 这种倔强,大概率来自于周鸿祎的焦虑。
从2019年开始,360的营收就在负增长;2022年,360年度营收跌破百亿大关,这一年里,360所有与互联网相关的业务都在下滑,其中广告及服务收入下滑最大,收入47.10亿,同比下降25.32%,且这块业务在360整体营收中占比达到49.47%。
▲ 数据来源360财报
可以说,360已经进入一个尴尬且糟糕的局面,急需一场谷底反弹。这也是2022年初,周鸿祎为什么要在内部讲话中提出,要驱动360全面转型数字安全公司的一个重要原因。
2022年,安全及其他业务是360唯一增长的板块,收入17.91亿,同比增长29.72%。转型是有效的,但无论从任何角度来讲,政企安全业务都没有AI大模型性感,且具有想象力。
所以今年初,周鸿祎又在公司内部喊出了“All in AI”的口号。
但周鸿祎显然不想做个稀松平常的大模型。他说:“GPT时代中国自研大模型弯道超车的关键在于发展多模态”。
所以他思考大模型的下一个阶段,并试图以此抢得先手。
“数据”就是这个先手的切入口。
有研究表明,目前互联网上可用的高质量数据大约会在2026年耗尽,低质量数据大约会在2050年耗尽,视觉图像数据预计在2060年耗尽。
周鸿祎说,“很多人在发愁,说人类生产的知识用来训练大模型已经快不够。但我说你不用担心,只要大模型有了多模态的能力,把全世界很多摄像头和它接上,它观看摄像头的过程,也是一个训练的过程。”
就如探矿,一个能找到新型矿产,并率先使用的公司,很容易成为下一个超级公司。而周鸿祎判断,物联网就是下一个超级富矿。
北京智源研究院院长黄铁军教授也曾提到:“图书、黄页数据确实有限,但这只是一类数据。这个世界数据其实很丰富,比如物联网数据、自动驾驶数据,现在机器人进入家庭和工厂,感知数据才刚刚开始出现,自动驾驶车辆如果打开全部传感器,产生的数据也会比今天的数量庞大得多。”
由于360的安全背景,物联网也是诸多感知数据中,三六零最容易入手的。
近期,他已经开始着手布局。比如360发布视觉大模型,并将其与智能摄像头等产品结合。
自象限推测,这并不简单是为了将大模型用上,进行产业化落地。这些接入视觉大模型的安防摄像头、行车记录仪、智能家居等物联网硬件,能在现实世界布控无数的触角,从而为数字世界不断“供血”。
当大家还在既有数据中“内卷”时,周鸿祎的“野心”已经延伸到了下个场景。
毕竟既有数据即将耗尽,但物联网、视觉场景下的数据却具有稀缺性,而从声音到画面,它具备了目前用来训练大模型的文献数据所不具备的更多维度。
如果这些成立,那么在训练感知数据得技术和算法上,360大模型也能赢得先机。毕竟感知数据的数量,是传统数据的指数倍,且能持续生产。
路径 一个初代目大佬的路径在逻辑上必然成立。
但成功与否,还取决于它为此设置了怎样的路径,以及谁在认同他。
从目前产品性能上来看,360智脑并不能算是一款“出色”的大模型。
360智脑发布之后,「自象限」曾拿到内测资格,经过体验之后,我们觉得360智脑的水平与目前市面上的其他类ChatGPT产品相比仍然具有差距,其中比较严重的问题,如问题回答表浅,逻辑简单、不清晰,胡说八道情况较多等等。
▲ 图:360智脑对话截图
5月初,周鸿祎在央视财经《对话》栏目上专门提到了一个AI商店的概念。他想要在浏览器中做一个AI导航,将市面上已有的AI写作、AI画图、AI做音乐等数百种工具做一个分类梳理。周鸿祎认为,通过这样的方式,既可以可降低普通用户使用AI工具的门槛,也能为那些基于大模型开发AI应用的小公司提供流量。
但这种想法被年轻的极客们嫌弃。
▲ 图:GPT-3 demo 导航网站,集中了全球800多个基于GPT-3的大模型应用
他们觉得,这事情乍一听似乎有理,但细想下来其实和PC互联网的“黄页”,移动互联网的“应用商店”并无两样。而这两个产品的结局却已经非常明确,黄页逐步退出互联网的舞台,应用商城越来越和手机终端绑定。
主要是,当下的年轻人更喜欢那种更“轻巧”的公司和产品。在国外,已有很多类似的网站出现,而且就是由几个人的小团队迅速搭建起来的。
他们觉得,这种只能在特殊时期提供价值,无论是从长远性,还是从体量上,都不应该是360这般体量的公司重点投入的事情。
甚至他们觉得,这是周鸿祎在重复PC时代从安全到浏览器到搜索的老路子。“周鸿祎的对于企业战略的决策可能仍然停留在互联网的门户时代,他还在用互联网1.0时代的方法论来解决AI2.0时代的企业发展问题。”上述人士表示。
这些看法,周鸿祎倒也未必在意。
一方面,既然他的视角在GPT下一阶段,他未必介意将行进中的智脑时时示人。
另一方面,推翻前人本就是年轻人或者说颠覆者的特点,当年他也走过类似的路,也获得过足够的“大众基础”。今天由于大模型绝对用户量还不多,他的“黄页”想法是否适合大众只能等时间来检验。
随着互联网的发展,实时音视频通话功能已经成为远程办公、社交娱乐和在线教育等领域中不可或缺的一项重要功能。WebRTC作为一种开放标准的实时通信协议,能轻松实现浏览器之间的实时音视频通信。
本次主要分享基于WebRTC的音视频通话技术,讲解WebRTC原理和音视频传输等关键概念,
通过案例实践,带大家掌握如何搭建一个音视频通话应用。
背景 随着互联网技术的飞速发展,实时音视频通话已经成为在线教育、远程办公、社交媒体等领域的核心且常用的功能。WebRTC(Web Real-Time Communication)作为一项开放的实时通信标准,为开发者提供了快速构建实时音视频通话系统的能力。在本课程中,我们将从0到1使用 WebRTC 构建一个基于 P2P 架构的音视频通话的应用案例。
应用场景 点对点视频聊天:如 微信视频 等实时视频通话应用。多人视频会议:企业级多人视频会议系统,如飞书、钉钉、腾讯会议等。在线教育:如腾讯课堂、网易云课堂等。直播:游戏直播、课程直播等。 P2P通信原理 P2P 通信即点对点通信。
要实现两个客户端的实时音视频通信,并且这两个客户端可能处于不同网络环境,使用不同的设备,都需要解决哪些问题?
主要是下面这 3 个问题:
如何发现对方?
不同的音视频编解码能力如何沟通?
如何联系上对方?
下面我们将逐个讨论这 3 个问题。
如何发现对方? 在 P2P 通信的过程中,双方需要交换一些元数据比如媒体信息、网络数据等等信息,我们通常称这一过程叫做“信令(signaling)”。
对应的服务器即“信令服务器 (signaling server)”,通常也有人将之称为“房间服务器”,因为它不仅可以交换彼此的媒体信息和网络信息,同样也可以管理房间信息。
比如:
1)通知彼此 who 加入了房间;2)who 离开了房间 3)告诉第三方房间人数是否已满是否可以加入房间。
为了避免出现冗余,并最大限度地提高与已有技术的兼容性,WebRTC 标准并没有规定信令方法和协议。在本课程中会使用websocket来搭建一个信令服务器
不同的音视频编解码能力如何沟通? 不同浏览器对于音视频的编解码能力是不同的。
比如: 以日常生活中的例子来讲,小李会讲汉语和英语,而小王会讲汉语和法语。为了保证双方都可以正确的理解对方的意思,最简单的办法即取他们都会的语言,也就是汉语来沟通。
在 WebRTC 中:有一个专门的协议,称为 Session Description Protocol(SDP),可以用于描述上述这类信息。
因此:参与音视频通讯的双方想要了解对方支持的媒体格式,必须要交换 SDP 信息。而交换 SDP 的过程,通常称之为媒体协商。
如何联系上对方? 其实就是网络协商的过程,即参与音视频实时通信的双方要了解彼此的网络情况,这样才有可能找到一条相互通讯的链路。
理想的网络情况是每个客户端都有自己的私有公网 IP 地址,这样的话就可以直接进行点对点连接。实际上呢,出于网络安全和其他原因的考虑,大多数客户端之间都是在某个局域网内,需要网络地址转换(NAT)。
在 WebRTC 中我们使用 ICE 机制建立网络连接。ICE 协议通过一系列的技术(如 STUN、TURN 服务器)帮助通信双方发现和协商可用的公共网络地址,从而实现 NAT 穿越。
01 什么是智慧城市三维大数据可视化 智慧城市就是运用信息和通信技术手段感测、分析、整合城市运行核心系统的各项关键信息,从而对包括民生、环保、公共安全、城市服务、工商业活动在内的各种需求做出智能响应。其实质是利用先进的信息技术,实现城市智慧式管理和运行,进而为城市中的人创造更美好的生活,促进城市的和谐、可持续成长。
而智慧城市三维可视化管理平台则是实现对政府部门管辖的各类对象和数据进行管理的系统平台。借助三维地理信息的融合技术,构建3D场景化展示,实现从地球、到省、市、区县、园区到重点建筑的逐级可视;对地理信息底图、道路、建筑、水系、等高线地形、重点建筑等的三维可视。
02 三维可视化技术在智慧城市建设中的典型应用场景解析 智慧城市平战一体化平台的作战指挥 智慧城市平战一体化平台的作战指挥 前景互联利用3DGIS技术,将地图这种对视觉化效果有特殊要求的数据与地理分析功能输入数据库系统进行集成操作。当其作用于智慧城市建设时在消防规范、抗震救灾以及城市公共场所的选取等方面不仅能够对城市的整体运行状况进行整体把控还能根据监测功能对可能出现的问题进行预测、预警。例如GIS技术应用于城市抗震救灾建设时相关人员能通过处理属性与空间的具体数据进而为城市安全发展提供重要助力。
倾斜摄影测绘建模
倾斜摄影测绘技术通过在无人机上安装尽可能多的传感器,从多个角度去拍摄以达到采取地理信息的目的,最后带给客户最真实的视觉感受。前景互联运用倾斜摄影所输出三维立体模型带给用户最直观的视觉体验,把三维视觉场景完美地融入城市的GIS地理信息建设中去,进一步提供多元化的地理信息,加强用户的使用感,同时减少三维城市模型建设的浪费。
智慧园区 管线走向及数据
智慧消防平台 BIM(建筑信息模型)是以三维技术为技术基础包含了建筑工程项目各种信息的工程数据模型详尽地表达了工程项目各相关信息。它包含了建筑物的几何信息,还包含了建筑构件的物理性质和功能特性及相关的项目生命周期信息。
前景互联充分利用BIM技术的优势,在智慧消防、智慧园区、智慧热网等领域,将地下管线、建筑内部情况等肉眼无法直接观测的场景抽丝剥茧地展示在用户面前,让用户在最短的时间内直观了解空间和数据信息。
03 三维场景搭建流程 一般从三维建模到最终城市效果呈现的过程大致如下:
常用城市模型类型: 白膜,工具cesiumlab
规则建筑建模,工具CityEngine
倾斜摄影,工具GeoScene Pro
精细模型,工具3D MAX,blender等
建筑白膜制作流程
规则建筑建模流程
实景三维建筑模型处理流程 实景三维建筑模型处理流程
三维模型包发布流程
数据类型转换参考下图 04 三维GIS开发工程师招聘要求
三维GIS开发工程师必学开发技术 05 三维GIS开发职业发展路径 三维GIS开发开发职业晋升道路
比赛规则: ·学校举行一场演讲比赛,共有12个人参加。比赛共两轮,第一轮为淘汰赛,第二轮为决赛。·每名选手都有对应的编号,如10001~10012 ·比赛方式:分组比赛,每组6个人;
·第一轮分为两个小组,整体按照选手编号进行抽签后顺序演讲。 ·十个评委分别给每名选手打分,去除最高分和最低分,求的平均分为本轮选手的成绩·当小组演讲完后,淘汰组内排名最后的三个选手,前三名晋级,进入下一轮的比赛。 ·第二轮为决赛,前三名胜出·每轮比赛过后需要显示晋级选手的信息 程序功能: ·开始演讲比赛:完成整届比赛的流程,每个比赛阶段需要给用户一个提示,用户按任意键后继续下一个阶段 ·查看往届记录:查看之前比赛前三名结果,每次比赛都会记录到文件中,文件用.csV后缀名保存 ·清空比赛记录:将文件中数据清空 ·退出比赛程序:可以退出当前程序 一.头文件 1.speaker.h #pragma once #include <iostream> using namespace std; //选手类 class Speaker { public: string m_Name;//姓名 double m_Score[2];//分数 最多有两轮得分 }; 2.speechManager.h #pragma once #include <iostream> using namespace std; #include <vector> #include <map> #include "speaker.h" #include <algorithm> #include <numeric> //设计演讲管理类 class SpeechManager { public: //构造函数 SpeechManager(); //菜单功能 void show_Menu(); //退出系统 void exitSystem(); //析构函数 ~SpeechManager(); //初始化容器 void initSpeech(); //创建12名选手 void createSpeaker(); //开始比赛 比赛整个流程控制函数 void startSpeech(); //抽签 void speechDraw(); //成员属性 //保存第一轮比赛选手的编号容器 vector<int>v1; //第一轮晋级选手编号容器 vector<int>v2; //胜出前三名选手编号容器 vector<int>vVictory; //存放编号以及对应具体选手容器 map<int, Speaker>m_Speaker; //比赛 void speechContest(); //记录比赛轮次 int m_Index; //显示比赛结果 void showScore(); //保存记录 void saveRecord(); //读取记录 void loadRecord(); //显示往届记录 void showRecord(); //判断文件是否为空 bool fileIsEmpty; map<int, vector<string>>m_Record; //清空文件 void clearRecord(); }; 二.
记录 2023-06-29
图片内容的base64编码
图片内容(base64编码前)的md5值
public void Test(String imagePath) { String imagePath = messageReq.getImagePath(); byte[] imageBytes; // 图片内容的base64编码 String base64 = null; // 图片内容(base64编码前)的md5值 String md5 = null; try { if (imagePath.startsWith("http")) { // imageBytes = netWorkImage9(imagePath); imageBytes = netWorkImage(imagePath); } else { // imageBytes = localImage9(imagePath); imageBytes = localImage(imagePath); } base64 = Base64.getEncoder().encodeToString(imageBytes); md5 = DigestUtils.md5Hex(imageBytes); } catch (Exception e) { e.printStackTrace(); } } @NotNull private byte[] netWorkImage9(String imageUrl) throws IOException { URL url = new URL(imageUrl); HttpURLConnection connection = (HttpURLConnection) url.
Java高级编程——Java9&Java10&Java11新特性 Oracle官网了解新特性https://blogs.oracle.com/java/post/the-arrival-of-java-20
一、Java 9 的新特性 二、Java 10 的新特性 三、Java 11 的新特性 看看就行,因为目前java更新很快,已经到jdk20,因此在以后慢慢了解,不是重点。
这里写目录标题 一、子系统及其封装1. 子系统的创建1.1 通过 Subsystem 模块建立子系统1.2 通过已有的模块建立子系统 2. 子系统的条件执行2.1 使能子系统2.2 触发子系统2.3 使能加触发子系统 3. 子系统的封装3.1 lcon & Ports 选项卡的参数设置3.2 Parameters & Dialog 选项卡的参数设置3.3 Initialization 选项卡的参数设置3.4 Documentation 选项卡的参数设置 一、子系统及其封装 当模型的规模较大或较复杂时,用户可以把几个模块组合成一个新的模块,这样的模块称为子系统。子系统把功能上有关的一些模块集中到一起保存,能够完成几个模块的功能。建立子系统的优点是,减少系统中的模块数目,使系统易于调试,而且可以将一些常用的子系统封装成一些模块,这些模块可以在其他模型中直接作为标准的 Simulink 模块使用。 1. 子系统的创建 建立子系统有两种方法:通过 Subsystem 模块建立子系统和将已有的模块转换为子系统。两者的区别是,前者先建立子系统,再为其添加功能模块;后者先选择模块,再建立子系统。 1.1 通过 Subsystem 模块建立子系统 新建一个仿真模型,打开 Simulink 模块库中的 Ports & Subsystems 模块库,将 Subsystem 模块添加到模型编辑窗口中。双击 Subsystem 模块打开子系统编辑窗口,窗口中已经自动添加了相互连接的一个输入模块和输出模块(表示子系统的输入端口和输出端口)。将要组合的模块插入到输入模块和输出模块中间并重新连接,一个子系统就建好了。若双击已建立的子系统,则打开子系统内部结构窗口。 1.2 通过已有的模块建立子系统 先选择要建立子系统的模块,然后执行创建子系统的命令,原来的模块变为子系统。例如,PID 控制器是在自动控制中经常使用的模块,PID 控制器由比例单元(P)、积分单元(I)和微分单元(D)组成,PID 控制器的传递函数为 G ( S ) = K P + K i S + K d S G(S)=K_{P}+\frac{K_{i}}{S}+K_{d}S G(S)=KP+SKi+KdS 我们建立 PID 控制器的模型并建立子系统。我们先建立 PID 控制器的模型,该模型具体如下图所示。 需要注意的是,模型中含有 3 个变量 K p K_{p} Kp、 K i K_{i} Ki 和 K d K_{d} Kd,仿真时这些变量应该在 MATLAB 工作空间中赋值。选中模型中所有模块,在模型编辑窗口选择 Diagram ⟶ \longrightarrow ⟶Subsystem & Model Deference ⟶ \longrightarrow ⟶Create Subsystem from Selection 命令,或按 Ctrl+G 键建立子系统,所选模块将被一个 Subsystem 模块取代,具体如下图所示。 2.
在 Windows 计算机上执行多任务时,一些应用程序和程序会进入后台,而其他窗口则在前台。 然后,在后台运行的应用程序和程序只剩下最少的系统资源(包括 CPU)来运行它们的操作,而大部分资源则保留给在前台运行的应用程序。
默认情况下,Windows 操作系统只为低优先级任务保留 20% 的 CPU 资源,这意味着它们在后台运行。 如果您的应用程序在运行于其他应用程序之上时表现良好,但在转移到后台时性能下降,那么您可以通过增加为低优先级任务预留的 CPU 资源来获益。
在本文中,大眼仔将向您展示如何增加 Windows 计算机上后台应用程序的预留 CPU 资源。
为低优先级任务保留的 CPU 资源 Windows 注册表是写入操作系统操作的所有策略、规则和参数的地方。 简而言之,它是一个大型数据库,告诉 Windows 操作系统如何运行以及其他关键值。
注册表中的一个值是“SystemResponsiveness”,它是一个 DWORD。 此 DWORD 负责控制为 Windows 计算机上的低优先级任务保留的 CPU 百分比。 您可以更改其值以控制后台任务应允许的百分比。
“SystemResponsiveness”DWORD 可以在 Windows 注册表中的以下路径中找到:
1
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile
如果将注册表设置保留为默认值,您会发现所有低优先级和后台应用程序和程序的总 CPU 消耗超过 20% 时都会受到影响。 这将导致运行速度变慢。
在下面的下一步中,我们将向您展示如何修改此注册表以允许更多 CPU 资源用于后台和低优先级任务。
增加为后台任务和低优先级任务预留的 CPU 资源 通过提高低优先级和后台任务的预留限制,可以确保应用或程序进入后台时,不会因为 CPU 使用率而影响其运行。 现在,由您决定是允许后台应用程序 100% 使用 CPU,还是只增加一定数量。
注册表编辑器
无论哪种方式,请使用以下步骤将 Windows 注册表中保留的 CPU 限制增加到最适合您的百分比:
1.icons8(网址:https://igoutu.cn/icons) 这个图标库具备各种类型的icon图标,满足各种机构或公司的风格,有动态、静态、diy的图标等等,但有些图标使用是需要注明出处的,如果自己写demo倒无所谓,如果商用请防止侵权行为发生给自己带来不便
2.阿里图标库(网址:https://www.iconfont.cn/) 阿里图标库作为大厂出品,icon质量,icon风格都是极具审美特性,使用也方便,都是免费图标,但是动效图标不太丰富,个人认为不能大范围满足使用,但是日常的icon使用是没有问题的
安装Anoconda 直接看下面的教程就行了:
WSL中安装Anaconda3并建立独立环境_wsl安装anaconda_马鹏森的博客-CSDN博客
原来一直用pytorch,今天需要使用TensorFlow,结果死活装不上GPU版本,我无语了
查看是否可以使用TensorFlow-GPU:
import tensorflow as tf # import tensorflow.compat.v1 as tf # print(tf.__version__) print(tf.test.is_gpu_available()) print(tf.config.list_physical_devices('GPU')) 一、官网查看版本关系: CUDA与cuDNN 的对应关系一定要对
Build from source on Windows | TensorFlow
二、Ubuntu安装CUDA与cuDNN CUDA Toolkit Archive | NVIDIA Developer
打开官网:CUDA Toolkit 11.2 Downloads | NVIDIA Developer
运行:
wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda_11.2.0_460.27.04_linux.run sudo sh cuda_11.2.0_460.27.04_linux.run --override 一直安装就可以了
2、设置环境变量
vim ~/.bashrc
export PATH=/usr/bin:$PATH
export PATH=/usr/local/cuda-11.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64:$LD_LIBRARY_PATH
source ~/.bashrc
输入 nvcc -V 验证 显示
nvcc: NVIDIA (R) Cuda compiler driver