文章目录 见的开源WebGIS平台1.uDig2.QGIS3.GeoServer4.MapServer5.OpenLayers6.OpenScales WebGIS(网络地理信息系统)是指基于网络平台,客户端应用软件采用网络协议,运行在网络上的地理信息系统,即将GIS所能提供的功能通过网络展现给用户。顾名思义,WebGIS就是展现在网络上的GIS,是GIS 与Web 融合的产物。GIS 通过Web功能得以扩展,使得GIS冲破专业圈子,真正成为大众化的GIS。如今,网络已成为日常生活中不可或缺的工具,人们可以在网上订餐、购物、查找路线信息、实现定位分析等。地理信息普惠大众,越来越多的人使用地理信息服务,享受地理信息所带来的便利与乐趣。
随着技术的不断发展,GIS经历了单机环境应用向网络环境应用发展的过程。从21世纪开始,网络进入了爆发式增长阶段,这为 WebGIS 的发展提供了坚实的基础。网络环境 GIS应用从C/S(Client/Server,客户机/服务器)模式向网络环境下的B/S(Browser/Server,浏览器/服务器)架构发展,逐步成为GIS应用的主流。相比C/S架构,B/S架构的WebGIS具有部署方便、使用简单、便于推广等优势,为地理信息服务的发展奠定了基础。于是,WebGIS应用需求剧增,基于B/S架构的GIS系统越来越多地开始提供服务,并且随着RIA技术、Ajax技术等的涌现和成熟,WebGIS能够以更好的视觉效果与交互效果展现,越来越受到广大用户的关注。
网络的大发展为人类创造了极大的物质财富和精神财富,各种信息资源通过手指轻轻一点便可轻易获取。网络与GIS的融合成为GIS应用的催化剂,标志着GIS迎来一个新的时代,GIS真正走向大众化,其应用全面融入人们的工作与生活,并彰显出了巨大的活力。WebGIS激活了GIS大众应用的市场。网络的嗅觉早已敏锐地嗅到了商机,大量资本与外界力量进驻,网络巨头纷纷跨界布局地图领域,Google地图、百度地图等服务提供商的大规模扩张便是最好的证明。
移动互联网成功的关键是为用户提供优质便捷的生活服务,地图则是实现移动端增值服务的最佳入口。因此,当移动互联网遇上无处不在的地理信息位置服务时,LBS 应用市场需求旺盛,移动端必将涌现出更多意想不到的特色应用。随着终端定位能力、网络及资费等外部条件的成熟,位置服务可能会在很多应用上成为标配,更有希望基于位置信息维度重新组织网络中的海量信息,创新地理信息价值。如今,GIS 早已融入人们的日常生活,网络在线地图不再限于导航,人们可以通过地图快速获取周围的景点、餐馆信息,甚至能在同一种应用下实现订餐、订房、支付等一站式服务。有了移动互联网的支撑,地图所承载的应用会更加丰富、多元化,WebGIS应用将更加宽泛和深入。随着网络新技术的发展,广义WebGIS 被赋予了更多内容。我们所讨论的WebGIS 通常为狭义的WebGIS,即仅仅是指基于B/S架构通过Web浏览器访问的WebGIS。
WebGIS的应用非常广泛,几乎可以应用到所有的领域,主要分为行业应用与大众应用。行业应用通常为传统专业领域的应用,如地矿、国土、公安、市政、应急防灾等领域;大众应用则主要为互联网方向服务于人们日常生活的GIS应用,诸如百度地图等在线地图产品,以及旅游、餐饮、购物、公交出行等各类 WebGIS 应用系统,而公众接触最多的也就是这些大众应用类产品,只是很多时候我们并不清楚这些就是WebGIS应用而已。
得益于网络的发展,WebGIS快速发展前进,开发工具与平台也呈现出百花齐放之势。目前,涌现出大量用于二次开发的WebGIS产品,主要包括开发API、开源与商业WebGIS开发平台等。在互联网方向,如百度地图API、天地图API、高德地图API、腾讯地图API、Google地图API等;在行业应用方向,有很多诸如GeoServer的开源WebGIS平台,还有中地数码、超图、ESRI等GIS厂商提供的专业WebGIS开发平台产品,如MapGIS IGServer、ArcGIS for Server等相关产品。
见的开源WebGIS平台 WebGIS市场需求旺盛,更多的人开始关注WebGIS应用,很多开发者投身于GIS开发大军,催生了众多开源GIS项目,推动了WebGIS的普及。部分开源GIS项目如表1-1所示。
1.uDig uDig是一个开源的桌面应用程序框架,是构建在Eclipse RCP 和GeoTools(一个开源基于Java的GIS工具包)上的桌面GIS。uDig作为一款开源桌面GIS软件,基于Java和Eclipse平台,可以进行shp格式地图文件的编辑和查看,是一个开源空间数据查看器与编辑器。uDig页面如图1-1所示。
2.QGIS QGIS是一个用户页面友好的桌面GIS,可运行在Linux、UNIX、Mac OS X和Windows等平台之上。QGIS是基于Qt(跨平台的图形工具软件包)、使用C++开发的一个用户页面友好、跨平台的开源版桌面地理信息系统。
3.GeoServer GeoServer是OpenGIS Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易地在用户之间迅速共享空间地理信息。GeoServer是社区开源项目,可以直接通过社区网站(如中文社区网站http://www.opengeo.cn/)下载相关资料。
GeoServer 支持 OGC 标准规范的系列服务,支持 PostgreSQL、MySQL 等数据库以及ArcSDE、Shapefile等中间件和文件资源,能够将网络地图输出为jpeg、png、KML等多种图片和数据格式,可以运行在任何基于 J2EE/Servlet 的容器之上,支持多种客户端框架,如OpenLayers等。
4.MapServer MapServer是美国明尼苏达大学(University of Minnesota)在20世纪90年代利用C语言开发的开源WebGIS项目。
MapServer是一套基于胖服务器端/瘦客户端模式的实时地图发布系统,当客户端发送数据请求时,服务器端实时处理空间数据,并将生成的数据发送给客户端。MapServer的核心部分是 C 语言编写的地图操作模块,它本身许多功能的实现依赖一些开源或免费的库。MapServer遵循OGC标准规范,可以集合PostGIS和开源数据库PostgreSQL对空间数据进行存储和查询操作,同时还支持其他客户端API实现空间数据的传输与表达。
5.OpenLayers OpenLayers是一个专为WebGIS客户端开发提供的JavaScript类库,用于访问以标准格式发布的地图数据,实现访问空间数据的方法都符合行业标准,支持各种公开的和私有的数据标准和资源。OpenLayers采用纯面向对象的JavaScript方式开发,同时借用了Prototype框架和Rico库的一些组件。
OpenLayers是一个开源的项目,其目的是为互联网客户端提供强大的地图展示功能,包括地图数据显示与相关操作,并具有灵活的扩展机制。目前,OpenLayers已经成为一个拥有众多开发者和帮助社区的成熟、流行的框架。目前OpenLayers 3 已经升级为OpenLayers 5,可从其官方网站(http://openlayers.org/)下载相关资源
6.OpenScales OpenScales是一个基于Flex的优秀的前台地图框架,开发者可以在此开发各种网络版、手机版和桌面版的地图程序。
OpenScales是基于ActionScript 3和Flex开发的,能够支持各种标准的地图服务,如WMS、WFS、TMS、OSM等。OpenScales是开源的、免费的客户端开发框架,基于LGPL开源协议,并且基于 FlashPlayer 运行,可以运行在各个浏览器上,具有很好的跨平台特性。OpenScales作为一个开源的 GIS 客户端框架,具有非常大的应用潜力,可从其官方网站(http://www.openscales.org/)下载相关资源,如图1-5所示。
图1-5 OpenS cales官网
OpenCv中提供了VideoCapture类的构造方法VideoCapture() cv2.VideoCapture()具有两个功能,一是可以完成摄像头的初始化,打开摄像头;二是可以完成视频文件的初始化。
摄像头的初始化: capture = cv2.VideoCapture(index) 参数说明:
capture:要打开的摄像头
index:摄像头的设备索引,对于笔记本电脑来说,为0时,一般打开的是电脑的内置摄像头,为1时,打开的为外接的摄像头。
下面是一段打开摄像头并展示画面的代码示例:
import cv2 capture = cv2.VideoCapture(0) # 打开笔记本内置摄像头 while capture.isOpened(): # 笔记本摄像头被打开 retval, image = capture.read() # 从摄像头中实时读取画面 cv2.imshow("Video", image) # 在窗口显示读取到的视频 key = cv2.waitKey(1) # 等待用户按下键盘按键的时间为1毫秒 if key == 32: # 如果按键为空格,就跳出循环 break capture.release() # 关闭摄像头 cv2.destroyAllWindows() # 销毁窗口 视频文件的初始化: video = cv2.VideoCapture(filename) 参数说明:
video:要打开的视频
filename:打开的视频文件名,可以为相对路径或绝对路径(在我电脑上,这里文件名为中文也是可以正常运行的),可以支持各种格式的视频文件,例如:MP4、AVI、MOV、WMV、FLV等后缀名,在不同操作系统中所支持的视频文件格式不同。但是不同操作系统都支持以“.avi”为后缀的视频文件
下面是一段播放本地视频的代码示例:
import cv2 as cv video = cv.VideoCapture("gs.mp4") # 打开视频文件 while video.isOpened(): ret, img = video.
目录
编辑
4.5 元组
4.5.1 定义元组
dimensions.py
4.5.2 遍历元组中的所有值
4.5.3 修改元组变量
4.6 设置代码格式
4.6.1 格式设置指南
4.6.2 缩进
4.6.3 行长
4.6.4 空行
4.6.5 其他格式设置指南
4.7 小结
第5章
if语句
5.1 一个简单示例
cars.py
5.2 条件测试
5.2.1 检查是否相等
5.2.2 检查是否相等时不考虑大小写
5.2.3 检查是否不相等
toppings.py
往期快速传送门👆(在文章最后):
4.5 元组 列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的,这对处理网 站的用户列表或游戏中的角色列表至关重要。然而,有时候你需要创建一系列不可修改的元素, 元组可以满足这种需求。Python将不能修改的值称为不可变的,而不可变的列表被称为元组。
4.5.1 定义元组 元组看起来犹如列表,但使用圆括号而不是方括号来标识。定义元组后,就可以使用索引来 访问其元素,就像访问列表元素一样。
例如,如果有一个大小不应改变的矩形,可将其长度和宽度存储在一个元组中,从而确保它 们是不能修改的:
dimensions.py 1 dimensions = (200, 50) 2 print(dimensions[0]) print(dimensions[1]) 我们首先定义了元组dimensions(见1),为此我们使用了圆括号而不是方括号。接下来,我 们分别打印该元组的各个元素,使用的语法与访问列表元素时使用的语法相同(见2):
200 50 下面来尝试修改元组dimensions中的一个元素,看看结果如何:
dimensions = (200, 50) 1 dimensions[0] = 250 1处的代码试图修改第一个元素的值,导致Python返回类型错误消息。由于试图修改元组的 操作是被禁止的,因此Python指出不能给元组的元素赋值:
环境准备 kali
windows
burpsuite
夜神模拟器 Android7.0以上 版本V7.0.2.2000
Charles
postern
工具简介 Charles 下载地址:
https://www.charlesproxy.com/latest-release/download.do Charles是一款非常强大的HTTP抓包工具,通过对该软件的设置让其成为系统网络访问服务器,即所有的网络访问都要通过该软件来完成,这样它就可以轻松获得所有HTTP、HTTPS的数据封包,监视所有的流量包括所有的浏览器和应用进程,方便开发人员查看计算机与Internet之间的所有通信。
Charles下载后有30天免费使用权限,过了之后可以选择重新下载或者购买,未激活的Charles每次只能开30分钟,需要再次手动开启。
Postern 下载地址1:https://soft.clbug.com/soft/postern/
下载地址2:https://www.malavida.com/en/soft/postern/android/
Postern下载:
http://www.xsssql.com/wp-content/uploads/2022/12/2022122807462925.zip Postern是一个Android下的全局代理工具。
详细配置 安装Postern 下载安装包后直接拖进模拟器中就会开始安装。
安装Charles 一路下一步就ok,首先需要确保电脑里没有charles。
破解方法 在线工具:
https://www.zzzmode.com/mytools/charles/ 随便输入一个字符串生成license key。
打开charles-help填进去就行。
如图:
安卓导入Charles系统级证书 生成一个.pem的证书,但是安卓系统级的证书是.0结尾的,所以需要转换一下,我们通过kali中的openssl来计算出文件名就可以。
此处参考文章:https://www.cnblogs.com/YenKoc/p/14376653.html
拷贝pem文件charles.pem到KALI系统的opt目录,使用命令:
openssl x509 -subject_hash_old -in charles.pem`` ``mv charles.pem 3ce07b0d.0 # 3ce07b0d为上步中的hash值
接着通过adb shell来把文件传到/system/etc/security/cacerts/目录中
连接命令:
.\nox_adb.exe connect 127.0.0.1:62001``.\nox_adb.exe devices 拷贝证书文件到/data/local/tmp,然后连接shell
.\nox_adb.exe push Q:\3ce07b0d.0 /data/local/tmp``.\nox_adb.exe shell` `su 执行下面命令,进行拷贝证书到系统证书目录:
mount -o rw,remount -t auto /system``cp /data/local/tmp/3ce07b0d.0 /system/etc/security/cacerts``chmod 777 /system/etc/security/cacerts/3ce07b0d.
目录 1- 单播模式,只有一个消费者组2- 广播模式,多个消费者组3- Java实践 kafka是由Apache软件基金会开发的一个开源流处理平台。kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。
kafka中partition类似数据库中的分表数据,可以起到水平扩展数据的目的,比如有a,b,c,d,e,f 6个数据,某个topic有两个partition,一般情况下partition-0存储a,c,e3个数据,partition-1存储b,d,f另外3个数据。
1- 单播模式,只有一个消费者组 topic只有1个partition,该组内有多个消费者时,此时同一个partition内的消息只能被该组中的一个consumer消费。当消费者数量多于partition数量时,多余的消费者是处于空闲状态的,如图1所示。topic,test只有一个partition,并且只有1个group,G1,该group内有多个consumer,只能被其中一个消费者消费,其他的处于空闲状态。
该topic有多个partition,该组内有多个消费者,比如test 有3个partition,该组内有2个消费者,那么可能就是C0对应消费p0,p1内的数据,c1对应消费p2的数据;如果有3个消费者,就是一个消费者对应消费一个partition内的数据了。图解分别如图2,图3.这种模式在集群模式下使用是非常普遍的,比如我们可以起3个服务,对应的topic设置3个partiition,这样就可以实现并行消费,大大提高处理消息的效率。
2- 广播模式,多个消费者组 如果想实现广播的模式就需要设置多个消费者组,这样当一个消费者组消费完这个消息后,丝毫不影响其他组内的消费者进行消费,这就是广播的概念。
多个消费者组,1个partition;
该topic内的数据被多个消费者组同时消费,当某个消费者组有多个消费者时也只能被一个消费者消费.
多个消费者组,多个partition
该topic内的数据可被多个消费者组多次消费,在一个消费者组内,每个消费者又可对应该topic内的一个或者多个partition并行消费,如图
3- Java实践 这里使用Java服务进行实践,模拟2个parition,然后同一个组内有2个消费者的情况:
首先创建一个发送消息的controller方法:
@ApiOperation(value = "向具有kafka-2个partition的topic发送信息") @RequestMapping(value = "/testSendMessage2", method = RequestMethod.POST) public String testSendMessage(@RequestParam("msg") String msg) { KafkaTemplate.send(KafkaTopicEnum.TEST_TWO_PARTITION_MSG.code,msg); System.out.println("发送的消息是:"+msg); return "2个partition的topic数据!--ok"; } 然后再创建一个监听类监听该topic,这里的监听类即为消费者。
/** * @date 2020-09-24 * 两个partition的topic,同一个组的两个消费者就可以并行的消费了,需要kafka也是集群才行,单机版并不支持 * @param consumerRecord * @param acknowledgment */ @KafkaListener(topics = "two-partition-msg",groupId ="serverGroup1",containerFactory = "ackContainerFactory") public void receiveKafkaTwoParMsg(ConsumerRecord<?,?> consumerRecord, Acknowledgment acknowledgment){ InetAddress address = null; try { address = InetAddress.
1.背景 在数据仓库开发中,遇到了读取数据任务导致锁表问题,发现是因为补数据或月度大任务跨天运行,此时凌晨定时的写入操作就会被阻塞进入等待状态(如果超过最大等待时间会失败),直到读取任务完成写入任务才可以继续运行,导致当天结果层数据输出延迟。因此分析并总结下锁表机制原理以及解决方式。
2.锁机制及原理分析 Hive 目前主要有两种锁,SHARED(共享锁 S)和 Exclusive(排他锁 X),同时又分表锁与分区锁,分区锁为最小粒度。
解释:
1)表锁与分区锁,分区锁为最小粒度(如果表锁未锁写入的分区,是可以执行写入任务的)
2)查询操作使用共享锁(S锁),共享锁是可以多重、并发使用的(就是说其他查询也可以挂S锁,并发查询不会阻塞修改会阻塞)
3)修改表操作使用独占锁(X锁),它会阻止其他的查询、修改操作
4)S锁和X锁同时出现会出现死锁情况(查询和写入不可同时发生)
3.解决方式 Hive锁机制会影响我们数据仓库输出效率,如果在已知表/分区的解锁对正运行的任务没有影响情况下我们可以在session 中关闭锁,通常我们会在X锁操作任务加上set hive.support.concurrency=false; 这个参数为 false 既能保证session忽略任何锁强行操作数据,又能保证session里的SQL对表不加任何锁;非分区表慎用由于不加锁写入时候同时读取会导致数据一致性问题。
show locks tableName; #查看表锁 show locks tableName partition(dt='2014-04-01'); #查看分区锁 unlock table; unlock table partition(dt='2014-04-01'); #解锁表 set hive.support.concurrency=false; #在 session 中关闭锁默认为true, 4.拓展分析 SHOW LOCKS <TABLE_NAME>; #查看HIVE表是否被锁 SHOW LOCKS <TABLE_NAME> EXTENDED;#查看哪一个SQL锁了HIVE表 SHOW LOCKS <TABLE_NAME> PARTITION (<PARTITION_DESC>); #查看HIVE表分区是否被锁 SHOW LOCKS <TABLE_NAME> PARTITION (<PARTITION_DESC>) EXTENDED;#查看哪一个SQL锁了HIVE表分区 hive锁的几个配置,可以在锁冲突时 fail fast 或者 重试等待锁释放
(hive默认的sleep时间是60s,比较长,在高并发场景下,可以减少这个的数值来提供job的效率)
hive.lock.numretries #重试次数 hive.
目录 什么是UniAPP X如何学习UniAPP X1. 学习官方文档2. 学习UTS语言3. 关注UniAPP X的Vue规范 原生安卓商城的开发使用easyX组件库和模板库应用打包应用上线 什么是UniAPP X uni-app x,是下一代 uni-app,是一个跨平台应用开发引擎。
uni-app x 没有使用js和webview,它基于 uts 语言。在App端,uts在iOS编译为swift、在Android编译为kotlin,完全达到了原生应用的功能、性能。
更重要的是,UniAPP X未来也会支持鸿蒙,这里引用DCloud社区的官方答复
DCloud有资源第一时间得到鸿蒙无apk手机的上市计划。我们和华为保持着紧密沟通,会把握好节奏,不用担心。大家可以观察一个信号,等微信的鸿蒙next版敲定了,鸿蒙无apk手机就可以明确上市计划了。鸿蒙的开发语言是arkTS,uni-app x是uts,都是变种ts,uni-app x编译到鸿蒙是靠谱的。
而把uni-app的js编译成arkTS不靠谱。除非编个h5跑在鸿蒙的webview里,但这个体验估计没多少人能接受。
如何学习UniAPP X 1. 学习官方文档 UniAPPX 官方文档官方组件库easyX-为UniApp X设计的免费开源电商业务组件库UTS语言 这里的重点和难点应该是UTS语言,因为UTS语言需要编译成Kotlin语言,所以有强类型要求,会TypeScript的同学适应起来会快一些,只是习惯js的同学可能上手会难,可以参考官方组件库和easyX的写法,多多学习。
2. 学习UTS语言 UTS语言是TS的变种,建议先学习TS。就连鸿蒙原生开发用的ArkTS也是TS的变种(笔者最近在开发鸿蒙原生应用,会TS上手很快),可见TS的重要性。学习TS可以参考如下教程:
TypeScript 教程
上手TS之后,需要重点关注UTS和TS的区别。
UTS为Kotlin和Swift新增了一些专有数据类型;UTS有一些特殊的内置对象和API 其实这些区别主要是为了原生开发的,但是比直接上手安卓和iOS原生开发要简单太多。
3. 关注UniAPP X的Vue规范 uni-app x的vue规范,按照vue3规范实现,但目前不支持setup组合式写法,仅支持option选项式写法。而且有些Vue3的api也不支持。大家在开发过程中遇到问题,要查看官方文档里重点列出的差异
UniAPP X的Vue实现
原生安卓商城的开发 前面的学习铺垫,是为了大家开发过程更加顺利。实际上,easyX已经封装好了常见的电商业务组件,并且已经上线了一些模板。即使是小白,也可以直接用easyX开发出一个原生商城。先看效果
这个页面的代码可以查看Gitee示例代码, 大家直接复制粘贴即可。
使用easyX组件库和模板库 使用easyX有两种方式,一种是从Gitee下载源码,另一种是从UniAPP插件市场下载源码
Gitee下载地址:https://gitee.com/liuming9157/easyx
插件市场下载地址:https://ext.dcloud.net.cn/plugin?id=15602
下载源码之后解压,找到components目录,将该目录下的所有内容复制到你的UniAPP X项目下的components目录即可使用。
eaxyX支持按需引用,各个组件的具体使用可以查看相关easyX组件文档
当然,您也可以直接下载安卓easyX的安卓apk体验。
easyX演示包下载安装链接
easyX采用MIT协议开源,组件库和模板库仍在不断扩充。对于开发原生商城应用的同学来说,是个宝藏库。等UniAPPX支持鸿蒙后,easyX用来开发鸿蒙原生商城,想想真是吊炸天的开发利器。
应用打包 安卓打包是需要证书的。如果想省事,直接使用Dcloud的公共云证书,傻瓜式操作,不过因为有人滥用这个证书,现在很多品牌的手机会报毒,所以还是建议自己申请证书。
免费证书申请攻略
应用上线 如果要上架到华为、小米、oppo等应用市场,那就需要软件著作权和应用备案了。软件著作权的申请周期比较长,大概3个月,应用备案就快很多了。网上很多服务商提供这两项服务,大家也可以私信我,公司业务可以按照市场最低价给大家服务,个人业务可以提供一些免费指导然后你自己操作。
我是刘明,十年创业老兵,开源技术爱好者。
有问题欢迎私信。
在使用php对mysql进行连接的过程中,出现了Fatal error: Uncaught Error: Class "mysqli" not found in的问题
解决方案 这个错误通常表示您的PHP代码中缺少MySQL扩展或者没有启用MySQL扩展。
我们首先确认一下PHP环境中已经安装了MySQL扩展。检查一下自己的php路径下有没有php_mysqli.dll这个文件,如果有证明你的php是可以连接mysql的。
找到php.ini文件,打开并查找extension=mysqli,并将前面的分号去掉
4. 查找 extension=mysqli,并把其前面的 ; 去掉 (PS. 有两个关于extension=mysqli的查找结果,注意修改的位置) 5. 查找 extension_dir,找到 extension_dir = "ext" 一行,也是将其前面的 ; 去掉 (PS. 注意 extension_dir = "ext" 位于 ; On windows: 的下方),并将ext改为PHP环境中ext文件夹的绝对路径 然后重启一下Apache服务器,
在.php文件中输入phpinfo();查看mysqli是否成功连接,显示有mysqli就表示成功连接上了
php :PHP 8.2 (8.2.13),,【8.新版,目前最新只有这个版本,配置mysql无问题,这个新版PHP 8.3 (8.3.0),版本存在配置链接异常】 <?php $host='localhost'; // 数据库主机名 $username="root"; // 数据库用户名 $password="a6"; // 数据库密码 $dbname="mysql"; // 数据库名 $connID=mysqli_connect($host,$username,$password,$dbname); // 建立数据库连接 if (mysqli_select_db($connID,$dbname)) { // 选择数据库 echo "
目录
一、 需求分析 3
二、数据库设计 3
2.1 确定联系集及E-R图 3
2.2 画出E-R图 4
2.3课程管理系统总E-R图 5
三、逻辑数据库设计阶段 6
3.1 班级表(Student) 6
3.2 学生信息表(Student) 6
3.3 教室表(Room) 7
3.4 课程表(Course) 7
3.5 教师表(Teacher) 7
3.6 选课表(Choose) 7
3.4 排课表(Arrange) 8
四、建表 8
4.1 创建数据库 8
4.2 创建数据表 8
五、数据库的运行和维护 11
5.1 定义 11
5.1.1 基本表的创建,建表语句 11
5.1.2 基本表的删除 14
5.2 数据操作 14
5.2.1 单表查询: 16
5.2.2 连接查询 17
5.2.3 操作结果集查询 17
5.2.4 嵌套查询 18
一、下载MySQL 下载地址:MySQL :: MySQL Community Downloads
web社区版对应网页版本安装,全社区版对应于本地安装
弹出一个新页面,单击注册,仅下载
二、MySQL安装 1、双击安装包,进入程序安装 这里我们选择自定义安装,选择以后点击next进入下一步
2、进行安装目录以及数据目录设置 设置mysql安装位置及数据存放位置
3、安装mysql 设置完成以后点击next并一直点击并进入以下内容,单击Execute安装mysql
安装完成单击next进入下一步
打击next即可 4、进行MySQL的配置 (1)、基本设置 默认不需要改动,直接点击next即可
默认不需要改动,直接点击next即可
(2)、身份认证及密码设置 这里选择身份认证类型,我选择旧的身份认证类型,单击next继续
5、以下保持一致即可 三、配置环境变量 1、配置变量 在系统变量中,找到Path,单击后,点击“编辑”,添加以下内容
C:\Program Files\MySQL\MySQL Server 8.0\bin(mysql的安装路径bin目录)
2、测试
使用win+r打开运行窗口,输入cmd,点击确定,进入PowerShell窗口
运行以下命令
mysql --version 当出现mysql的版本号时,即配置成功。如图:
四、navicat连接mysql
兼容版本环境:
DolphinScheduler 3.2.0
CDH 6.3.2
Zookeeper 3.4.5
curater-client-4.2.0
curator-recipes-4.2.0
curator-famework-4.2.0
官网:
集群部署、数据源配置:
https://dolphinscheduler.apache.org/zh-cn/docs/3.2.0/guide/installation/clusterss
https://github.com/apache/dolphinscheduler/blob/3.2.0-release/docs/docs/zh/guide/howto/datasource-setting.md
其他:
1、dolphin3.0在伪集群模式下总是会报zookeeper Failed to delete registry key,我该怎么排查这个问题 · apache/dolphinscheduler · Discussion #11948 · GitHub
2、Apache DolphinScheduler 3.0.0 升级到 3.1.8 教程 - 腾讯云开发者社区-腾讯云
3、Jar查找,Jar下载,class文件,Maven仓库查询,Gradle引入代码 -时代Java
注意:无论standalone还是集群模式搭建过程中,涉及修改配置都需要执行
# Mysql元数据初始化 bash tools/bin/upgrade-schema.sh 以及
# 集群启动初始化,ust006 scp免密安装分发到其他节点 bash ./bin/install.sh 另外,部署时,保持查看dolphinscheduler集群状态、worker-server的日志
bash ./bin/status-all.sh tail -f logs/dolphinscheduler-worker.log 再次启动后,若出现问题:
[ERROR] 2020-12-10 15:35:03.650 org.apache.dolphinscheduler.remote.NettyRemotingServer:[167] - NettyRemotingServer bind fail bind(..) failed: 地址已在使用, exit io.netty.channel.unix.Errors$NativeIoException: bind(.
HTML + JavaScript 实现网页录制音频与下载 HTML + JavaScript 实现网页录制音频与下载简介getUserMediaMediaRecorder获取和处理音频流实现音频的录制和播放音频效果的处理实时语音通话的应用兼容性和 Latency 问题 项目代码运行实例参考源码下载 HTML + JavaScript 实现网页录制音频与下载 简介 在这个数字化的时代,网页端的音频处理能力已经成为一个非常热门的需求。本文将详细介绍如何利用 getUserMedia 和 MediaRecorder 这两个强大的 API,实现网页端音频的录制、处理和播放等功能。
getUserMedia getUserMedia 和 MediaRecorder 是 HTML5 中两个非常重要的 API,用于访问设备媒体输入流并对其进行操作。
getUserMedia 允许网页端访问用户设备的媒体输入设备,比如摄像头和麦克风。通过该 API,在获得用户授权后,我们可以获取这些媒体流的数据,并用于各种网页应用场景中。
典型的使用方式如下:
// 请求获取音频流 navigator.mediaDevices.getUserMedia({ audio: true }) .then(stream => { // 在此处理音频流 }) getUserMedia 接受一个 constraints 对象作为参数,通过设置配置来请求获取指定的媒体类型,常见的配置有:
audio:Boolean 值,是否获取音频输入。video:Boolean 值,是否获取视频输入。以及更详细的各种音视频参数设置。 MediaRecorder MediaRecorder API 可以获取由 getUserMedia 生成的媒体流,并对其进行编码和封装,输出可供播放和传输的媒体文件。
典型的用法如下:
// 获取媒体流 const stream = await navigator.mediaDevices.getUserMedia({ audio: true }) // 创建 MediaRecorder 实例 const mediaRecorder = new MediaRecorder(stream); // 注册数据可用事件,以获取编码后的媒体数据块 mediaRecorder.
一直就没有太搞清楚基于人工智能出现的这几个名词都具体是什么含义,区别是什么。稍微花了点儿时间在网上找了些概念和定义,这里做下总结。
一、AI 全称 Artificial Intelligence,中文为「人工智能」。Ta 是指一种特定类型的人工智能,即专门针对特定任务或领域开发的智能系统。这些系统通过大量的数据和算法进行训练,以实现特定的目标,如图像识别、语音识别、自然语言处理等。AI 系统通常只能在其预定义的领域中表现出色,而在其他领域则表现不佳。
二、AIGC 全称 AI Generated Content,又称「生成式 AI」,中文为「人工智能生成内容」。例如:AI 文本续写,文字转图像的 AI 图、AI 主持人等,都属于 AIGC 的应用。
三、AGI 全称 Artificial General Intelligence,中文为「通用人工智能」。Ta 是一种更高级别的人工智能,它具备广泛的智能能力,可以在多个领域中执行各种任务。AGI 系统不仅能够学习和适应新的任务,还能够像人类一样进行推理、解决问题和创造新的想法。AGI 的目标是开发出一种具有与人类智能相媲美的通用智能系统。
四、AI 和 AGI 的区别 最后再说下 AI 与 AGI 的区别,主要从以下三个方面进行阐述:
任务与问题理解
AI 作为一个工具,可以执行任务并与人类交互。而 AGI 则需要不仅能执行任务,还需要理解它所面临的问题。这种理解使得 AGI 能够更具适应性和生存能力。
决策能力
AI 通常只能按照预定的规则执行任务,而 AGI 则需要有能力做出独立的决策,这是其更具可靠性的重要因素。
普遍人类智能水平
尽管 AI 在某些领域的智能已经超越了人类,但 AI 仍被视为一种弱人工智能。而 AGI 则被视为一种通用人工智能,它大致等同于一台拥有一个普通人所拥有的全部智慧能力的计算机,包括使用自然语言交流、解决问题、推理、感知环境等能力,与一个普通人处于同等或者更高等级的智能水准。
如果您在尝试安装并运行一个Android应用(APK文件)时遇到错误消息“此应用专为旧版Android打造, 因此可能无法运行”,或者应用在启动时立即崩溃,以下是一些您可以尝试的解决步骤:
图片来源:手机显示此应用专为旧版android打造,因此可能无法运行,点击应用后闪退的问题解决方案
了解问题
首先,了解问题的本质是重要的。这个错误信息通常意味着应用是为较旧版本的Android系统设计的,而您的设备运行的是更新的系统版本。Android不断迭代,有时候较老的应用会不兼容最新的系统版本。
解决步骤
检查系统兼容性:
确认应用支持的最低和最高系统版本。这通常可以在应用的Play商店页面或官方网站中找到。
检查您的设备的Android版本是否在支持范围内。
尝试安装旧版本的应用:
如果应用的较新版本无法在您的设备上正常运行,尝试找到并安装该应用的较旧版本,可能更符合您当前的Android系统。
更新您的设备系统:
如果设备系统较旧,尝试系统更新。前往“设置”->“关于手机”->“系统更新”,检查是否有可用更新。
开启应用兼容模式:
在设备的“设置”中,找到有关应用的部分,尝试开启“兼容模式”或类似的设置选项。
清除应用缓存和数据:
前往“设置”->“应用管理”->找到出问题的应用,点击“清除缓存”和“清除数据”。这可能会解决崩溃问题,但是会丢失应用数据。
联系应用开发者:
如果以上步骤无效,联系应用的开发者询问支持,并报告你的问题和设备信息。
开发者角度进行应用更新
如果你的朋友是应用的开发者,以下是他需要关注的事项:
更新应用的Target SDK:
确保应用使用的是最新的Android SDK并针对新版本进行了测试。
适配API变化:
阅读Android官方文档,了解系统更新会影响应用的哪些API,并进行适配修改。
实施良好的测试策略:
在多种设备和不同版本的Android系统上测试应用,以确保广泛的兼容性。
内购问题的特别注意:
确认内购逻辑符合Google Play的政策,并且嵌入的支付系统已更新到最新版本以支持当前安全标准。
上架前的检查清单:
提交前要详细检查应用的描述、隐私政策、应用内的元数据以及其他Google Play要求。
避免上架时被驳回
遵循Google Play政策:
在上传之前确保应用完全符合Google Play的政策和要求。
准备好全面的Material:
包括截图、描述和分类等都要专业且反映应用的实际功能。
及时处理反馈:
如果应用被驳回,仔细阅读Google的反馈,按照反馈进行修改后再次提交。
用户数据保留和删除
应用程序需要定义清晰的用户数据保留和删除策略。开发者应该明确用户的数据保留期限,并在用户注销或删除账户时,及时删除用户的个人数据。
实现用户隐私合规和数据保护合规需要开发者在应用程序开发的各个环节都要注意,从数据收集到存储再到数据访问权限控制和数据删除都要符合相关法律法规,以保护用户的隐私和数据安全。希望本文的方案和建议能够对开发者有所帮助。
前言:在前面的文章中,我们讲解了顺序表,单链表,双向链表。而我们今天要分享的栈则是基于之前的数据结构上搭建的,但是相较于顺序表和链表来说,栈的实现就非常简单了。
目录
一.栈(Stack)的概念
二.栈的数据结构
三.栈的实现
判断栈已满
判断栈非空
入栈push
出栈pop
查看栈顶元素
完整代码
Java版本
c语言版
一.栈(Stack)的概念 栈是一种先进后出(LIFO)的数据结构,在其中元素的的添加(称为“入栈”)和删除(称为“出栈”)仅在栈的顶部进行。因此,最后一个插入到栈中的元素是第一个从栈中删除的元素。
它通常有两个主要操作:
push:在栈的顶部插入一个元素。pop:从栈的顶部移除一个元素。 栈的push入栈图解:
栈的pop出栈图解 :
我们可以看见对于栈的操作,我们都是在栈顶上操作的,先进来的元素会被后面的元素覆盖,而最后一个进来的元素也就是栈顶,因此我们称为先进后出(LIFO)
像传统的狙击步枪的弹夹就属于是一种栈的结构 二.栈的数据结构 对于栈的实现,我们通常使用数组,当然也可以使用链表,不过相对而言数组的实现是更容易的。
而对于一个栈的数据结构,他首先得有存放元素的位置,我们这里选择用数组来存放,其次还得有栈内元素个数的记录:
public class MyStack { public int[] elem; public int usedSize; } 三.栈的实现 对于一个栈,他应该有以下这些功能:
入栈出栈判断栈是否为空判断栈已满查看栈顶元素 判断栈已满 当已经使用的数组的大小等于数组本身的大小的时候,栈就相当于满了
public boolean isFull() { return usedSize == elem.length; } 判断栈非空 当数组内一个元素都没有,也就是已经使用的数组大小为0的时候,栈就是空的
public boolean isEmpety() { return usedSize == 0; } 入栈push 当我们要将元素放入栈内的时候,先进行判断,只有在栈内还有剩余空间的情况下,我们才会进行入栈操作,如果没有剩余空间,我们就进行扩容
public void push(int val) { if (isFull()) { //扩容 elem = Arrays.
JavaScript 是一种强大的编程语言,它提供了许多字符串操作方法来处理文本数据。然而,有些方法在新的 JavaScript 版本中已经被标记为不推荐使用或已弃用。substr() 方法就是其中之一。本文将介绍如何替代 substr() 方法,并提供了一些现代化的替代方案,以使代码更清晰、更可靠。
1.描述问题 Math.random().toString(16).substr(2, 8) 首先,substr() 方法已被标记为已弃用,因为它存在一些问题,并且有更好的替代方法可以使用。该方法有时会导致一些不直观的行为,而且不够清晰。为了替代 substr() 方法,您可以使用 substring() 或者更为现代的方法来完成同样的操作。
2.什么是 substr() 方法?为什么它被标记为已弃用? substr() 方法是用于提取字符串中指定位置的子字符串的 JavaScript 方法。它接受两个参数:起始位置和需要提取的字符数。然而,substr() 方法存在一些问题,比如当第一个参数为负数时会导致不直观的行为,这可能会引起错误的理解和使用。因此,JavaScript 社区建议不再使用 substr() 方法,并推荐使用更为可靠和清晰的替代方法。
3.替代方案:substring() 和 slice() 在修复使用 substr() 方法的代码时,可以考虑使用 substring() 或 slice() 方法来获取字符串的子串。这两个方法都能接受起始和结束位置作为参数,并返回指定范围内的子字符串。
1.使用 substring() 方法 let randomString = Math.random().toString(16).substring(2, 8); 2.使用 slice() 方法 let randomString = Math.random().toString(16).slice(2, 8); 4.结论 在 JavaScript 中,遇到已弃用的方法时,我们应该考虑使用更现代的替代方案。在处理字符串时,substring() 和 slice() 方法提供了更直观、更可靠的方式来截取子字符串。这些方法的使用能够提高代码的可读性,并减少潜在的错误和混淆,从而使代码更易于维护和理解。
pip会大量缓存,如果全部堆在系统盘,会造成别的无法使用
windows和linux通用
一、linux linux是在命令行操作
1.查看缓存位置 pip cache dir 我这里默认是在/root/.cache/pip
2.查看大小 du -sh /root/.cache/pip 结果如下:
3.清理(推荐) 使用pip自己的命令即可,这种方法不会清理完,因为有些是可能需要用到的,pip不会进行清理
pip cache purge 4.彻底清理(谨慎选择) 请谨慎选择这种方式
rm -rf /root/.cache/pip/* 二、windows windows的命令在cmd或者powershell下操作
1.查看缓存位置 pip cache dir 2.查看大小 注意:这里使用了环境变量作为目录,表示的是你的用户数据目录,例如:c:\users\xxx\appdata\local
dir /a/s %LocalAppData%\pip\cache 3.清理(推荐) 使用pip自己的命令即可,这种方法不会清理完,比如认为后面可能使用的,pip不会进行清理
pip cache purge 4.彻底清理(谨慎选择) 请谨慎选择这种方式
rmdir /s /q %LocalAppData%\pip\Cache
文章目录 下载安装修改Sdk的位置创建项目修改Gradle的位置查看AS版本工具栏–View项工具栏–Build下的功能说明Build Variants视图说明下载模拟器(avd)/安卓虚拟设备 屏幕熄灭功能关闭虚拟设备功能删除自己开发的应用软件将开发的应用运行到虚拟设备上。 修改模拟器的位置 下载 下载地址:官方下载地址
打开后往下拉,直到最后的I agree to the terms.
这里选择的android studio版本是:2021.2.1.16,也可以根据自己的需要下载其他的版本。
至此下载的过程讲解完毕,由于官网的界面会不定时的变动。以后有变动了,再更新下载方式。
安装 双击上面的exe文件
点击Next
点击Next
点击Next
点击Install
点击Next
点击Finish
修改Sdk的位置 点击OK
创建项目 修改Gradle的位置 由于第一次,创建AS项目后,Android sutdio第一次打开一个工程巨慢怎么办?
Android Studio怎么知道该用哪个Gradle呢?AS一个项目所用的Gradle是由我们的工程中下面这个文件决定的:
{your project}/gradle/wrapper/gradle-wrapper.properties
distributionBase:下载的Gradle压缩包解压后存储的主目录
distributionPath:相对于distributionBase的解压缩后的Gradle压缩包的路径
zipStoreBase:同distributionBase,只不过是存放zip压缩包的
zipStorePath:同distributionPath,只不过是存放zip压缩包的
distributionUrl:Gradle发行版压缩包的下载地址
最后一排的distributionUrl 决定了这个项目使用的gradle版本,也就是说不同的项目可以使用不同的gradle版本。
原理:Android Studio打开一个工程时,首先会读取gradle-wrapper.properties 文件,从而知道这个工程需要哪个版本的gradle ,然后就会去保存gradle的文件夹GRADLE_USER_HOME 去找看存不存在这个版本的gradle,不存在则会去distributionUrl 去下载 搞清楚了这个流程,现在是不是明白了,为什么第一次打开一个工程会巨慢了吧,因为AS会去下载gradle。
修改:gradle-wrapper.properties文件,如果想要指定版本的gradle,修改distributionUrl中的版本,只改后面的版本就行,防止自动下载慢,可以把提前下载的好的zip包,放到(C:\Users\Administrator.gradle\wrapper\dists\gradle-7.x.x-bin\6a41zxkdtcxs8rphpq6y0069z目录下,注意不要解压)。然后再次打开工程,会跳过下载gradle,并自动解压。然后下载工程所需依赖jar包(若有)。
下面说下修改:GRADLE_USER_HOME
修改:GRADLE_USER_HOME变量的路径,默认为C:\users{user name}.gradle,默认情况下,下载的gradle版本以及工程中根据gradle下载的依赖jar包都在这个C:\users{user name}.gradle路径下。
可以在系统环境变量里重新指定GRADLE_USER_HOME路径,然后把C:\users{user name}.gradle下的内容都拷贝的新路径下,防止C盘越来越大。
我们也可以采取另外一种方式,来指定当前项目使用的gradle版本及位置。gradle下载的依赖的包的存储路径,这种方式我们就不使用gradle-wrapper.properties文件了。
1.去gradle官网下载gradle版本。
Gradle下载地址:https://services.gradle.org/distributions/
例如:这里我们下载个7.3.2版本
手动解压:
然后配置gradle的全局环境变量:
检验配置是否成功。
出现上面的版本信息就表示配置成功了。
手动创建gradle下载的依赖包的存储路径:
D:\software\gradle-repository
打开项目
这样再重启项目:就不再自动读取gradle-wrapper.properties文件。
这样可以清理一些配置缓存。以便使用新的配置。
注意:这里有个小插曲,在读取gradle配置时,gradle 提示不能小于7.3.3(由于我们前面下载的是7.3.2),在运行程序时提示,JDK 不能低于 11。
💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 量化交易简介 量化交易是一种利用计算机算法执行交易策略的交易方法,它依赖于严格定义的规则和数学模型,而非人的主观判断。这种交易方式借助大量的金融数据和技术分析工具来执行交易,以期获得更好的交易结果。
为什么量化交易越来越受欢迎?
提高交易效率和速度: 量化交易利用计算机执行交易,消除了人为因素和情绪对交易决策的影响,同时能在瞬息万变的市场中实现高效的交易。数据驱动的决策: 量化交易利用大数据和技术分析工具进行决策,通过系统化的方法分析市场情况,更准确地评估风险和回报。回测和优化: 通过历史数据回测,可以评估和优化交易策略,使其更适应不同市场情况,提高稳定性和盈利能力。风险管理: 量化交易更注重风险管理,能够设置严格的止损规则和仓位管理,降低交易风险。技术的发展: 随着技术的进步和算法的发展,量化交易系统变得更加复杂和精细,可以处理更多的数据和变量,提高了交易策略的准确性。开放性和透明度: 许多量化交易策略和工具是开源的,这为更多的投资者提供了机会去学习、使用和改进这些策略。 人工智能在量化交易中的应用 人工智能在量化交易中的应用对于提升交易策略的精度和效率起到了重要作用。以下是人工智能在量化交易中的一些应用:
预测和模式识别: 人工智能可以利用机器学习和深度学习算法分析大量历史数据,发现隐藏在数据中的模式和趋势。这种能力可以用于预测市场走势、价格变化和交易信号的生成。自适应性策略: AI可以实时分析市场情况并调整策略,根据市场变化自动优化交易策略。它可以识别不同市场状态下的最佳交易策略,并根据环境的变化进行调整,提高适应性和稳健性。情绪分析: 人工智能可以分析社交媒体、新闻和其他非结构化数据,以捕捉市场参与者的情绪和舆论。这有助于更好地理解市场情绪,为交易决策提供更全面的信息。风险管理: AI技术可以利用大数据和算法识别风险,并制定相应的风险管理策略。它能够识别潜在的风险因素并快速作出反应,有效降低投资组合的风险。高频交易: 人工智能在高频交易中具有显著优势,因为它能够以非常高的速度和准确性处理大量的数据,快速执行交易策略。智能决策支持: AI可以为交易员提供智能决策支持,根据市场数据和模型的预测结果提供建议,帮助交易员作出更明智的决策。 当涉及量化交易和金融数据时,涉及到的代码通常涉及数据获取、处理、模型建立和交易执行等步骤。以下是一个简单示例,演示如何使用Python中的Pandas库获取股票数据并运用简单的移动平均策略进行交易决策:
import pandas as pd import yfinance as yf # 获取股票数据 data = yf.download('AAPL', start='2022-01-01', end='2023-01-01') # 计算移动平均线 data['MA50'] = data['Close'].rolling(window=50).mean() data['MA200'] = data['Close'].rolling(window=200).mean() # 简单的交易策略 data['Signal'] = 0 data.loc[data['MA50'] > data['MA200'], 'Signal'] = 1 # 当短期均线上穿长期均线时买入 # 模拟持有股票 data['Position'] = data['Signal'].diff() # 计算持有头寸 # 可视化 import matplotlib.
文章目录 1 解决办法1.1 修改当前表的字符编码:仅对当前表有效1.2 修改数据库的字符编码:对所有表有效1.3 建议:创建数据库时指定字符编码 2 原因分析3 错误演示4 扩展4.1 查看 Mysql 版本4.2 查看数据库的字符编码4.3 查看表的字符编码 1 解决办法 1.1 修改当前表的字符编码:仅对当前表有效 alter table 表名 convert to character set utf8mb4 collate utf8mb4_unicode_ci; -- 查看是否修改过来 show create table 表名; 1.2 修改数据库的字符编码:对所有表有效 -- 修改数据库的字符编码(注意:set 命令重启数据库后失效!) set character_set_database=utf8; set character_set_server=utf8; -- 修改表的字符编码(与数据库一致) ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8; -- 查看是否修改过来 SHOW VARIABLES LIKE '%character_set%'; show create table 表名; 1.3 建议:创建数据库时指定字符编码 -- 对所有表有效 create database 数据库名 character set utf8mb4 collate utf8mb4_unicode_ci; 2 原因分析 Mysql 版本默认使用的字符集不支持非 ASCII 字符的字符串根据 Mysql 版本和配置,可能使用的是 latin1 字符集。这些字符集不支持 Unicode 字符,因此在插入或更新数据时会出现错误 3 错误演示 -- 创建数据库(不指定字符编码) create database db_demo; -- 创建测试表 create table char_test( sno int, sname varchar(50) ); -- 测试 insert into char_test(sno, sname) values(1, '张三'); 4 扩展 4.