文章目录 自动化测试1. 自动化测试介绍2. Selenium介绍与环境搭建2.1 介绍2.2 Selenium原理2.3 Selenium+Java环境搭建 3. webdriver API3.1 元素的定位3.2 操作测试对象3.3 添加等待3.4 打印信息3.5 浏览器操作3.6 键盘事件3.7 鼠标事件3.9 特殊使用3.10 浏览器关闭3.11 切换窗口3.12 截图 4. 实现自动化测试 自动化测试 1. 自动化测试介绍 自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。
自动化测试包括 UI自动化 ,接口自动化 ,单元测试自动化 。
单元测试 :最大的投入应该在单元测试上,单元测试运行的频率也更加高。java的单元测试框架是Junit。
接口自动化 :接口测试就是API测试,相对于UI自动化,API自动化更加容易实现,执行起来也更稳定。
特点:
- 可在产品前期,接口完成后介入。 - 用例维护量小。 - 适合接口变动较小,界面变动频繁的项目。 常见的接口自动化测试工具有RobotFramework,JMeter,SoapUI,TestNG+HttpClient,Postman等。
UI自动化 :虽然测试金字塔告诉我们尽量多做API层的自动化测试,但是UI层的自动化测试更加贴近用户的需求和软件系统的实际业务。并且有时候我们不得不进行UI层的测试。
特点:
用例维护量大。页面相关性强,必须后期项目页面开发完成后介入。UI测试适合与界面变动较小的项目。 UI层的测试框架比较多,比如Windows客户端测试的AutoIT,web测试的selenium以及TestPlant eggPlant,Robot framework,QTP等。
以下将介绍的就是web应用中基于UI的自动化测试框架Selenium的使用;
2. Selenium介绍与环境搭建 2.1 介绍 Selenium是web应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言。早期的selenium RC已经被现在的webDriver所替代,可以简单的理解为selenium1.0+webdriver构成现在的Selenium2.0。它有由Selenium IDE,Webdriver,Selenium Grid组成。
Selenium IDE :用于Selenium测试的完成集成开发环境,可以 录制在浏览器的用户操作,并且能回放,编辑和调试测试脚本。调试过程中可以逐步进行或调整执行的速度,并且可以在底部浏览日志出错信息。 录制的测试脚本可以以多种语言导出,比如java,C#,Python,Ruby等,方便掌握不同语言的测试人员操作。
Webdriver :Selenium RC 在浏览器中运行 JavaScript 应用,会存在环境沙箱问题,而WebDriver可以跳出沙箱,针对不同的浏览器创建更健壮的,分布式的,跨平台的自动化测试脚本。基于特定语言绑定来驱动浏览器对Web元素进行操作和验证。
一、Java8之前日期类所存在的问题 在Java8之前通常会使用Date结合 SimpleDateFormat、Calender来处理时间和日期的相关需求。
但是这些API也存在明显的缺点:
可读性差、易用性差、使用起来冗余繁琐
java.util.Date 是非线程安全的
java.util.Date 存在千年虫问题、并且不支持国际化和时区、故大部分方法被声明为过时、不建议再使用
java.util和java.sql两包中都有Date类,设计上并不合理
而java8在java.time包下重新实现了日期相关类。
每个类功能明确清晰、类之间协作简单、API 定义清晰、功能强大无需借助外部工具类,并且线程安全。
二、Java8新增日期类 Java8新增的日期类主要有三个:
LocalDate:表示日期(年月日)
LocalTime :表示时间(时分秒)
LocalDateTime:表示时间+ 日期 (年月日时分秒),是java8最常用的日期类
这些类使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,有点类似于String类。
因此它们都是线程安全的。
2.1 LocalDate 2.1.1 常用API 方法描述static LocalDate now()获取默认时区的当前日期对象static LocalDate now(Clock clock)从指定时钟获取当前日期对象static LocalDate now(ZoneId zone)获取指定时区的当前日期对象of根据指定年月日创建LocalDate对象getYear获得年份getMonthValue获得月份(1-12)getMonth获得月份枚举值getDayOfMonth获得月份中的第几天(1-31)getDayOfWeek获得星期几getDayOfYear获得年份中的第几天(1-366)lengthOfYear获得当年总天数lengthOfMonth获得当月总天数toEpochDay与时间纪元(1970年1月1日)相差的天数plusDays加天plusWeeks加周plusMonths加月plusYears加年minusDays减年minusWeeks减周minusMonths减月minusYears减年withYear替换年份withMonth替换月份withDayOfMonth替换月份中的第几天(1-31)withDayOfYear替换年份中的第几天(1-366)isBefore是否日期在之前isAfter是否日期在之后isEqual是否是当前日期isleapYear是否是闰年 2.1.2 使用示例 1)创建方法 LocalDate now1 = LocalDate.now(); // 当前日期 LocalDate now2 = LocalDate.now(ZoneId.of("Asia/Shanghai")); // 当前日期 (指定时区) LocalDate now3 = LocalDate.now(Clock.systemDefaultZone()); // 当前日期 (指定时钟) LocalDate localDate = LocalDate.of(2023, 1, 1); // 指定日期 2023-01-01 2)获取方法 LocalDate now = LocalDate.
文章目录 引言1、准备环节1.1设备基本要求1.2安装包 2、修改相关信息2.1修改ip2.2修改ip映射 3、安装与部署3.1.上传安装包3.2.解压安装包3.3.配置HBASE_HOME3.3.1修改hbase-env.sh3.3.2修改core-site.xml3.3.4拷贝文件 4、启动4.1启动zookeeper4.2启动hdfs4.3启动hbase 5、问题详情及解决方式5.1.启动报错5.2.启动后只有一个相关进程5.3.启动成功了,但是HMster掉线了5.3.1.防火墙设置5.3.2.时间同步5.3.3.hdfs与hbase端口号一致 6、hbase操作6.1.建表6.2.插入数据6.3.查看数据6.4.删除表 7.停止hbase收获总结 引言 HBase是一种基于列存储的分布式数据库系统,它能够快速地存储和处理大规模数据。与传统的关系型数据库不同,HBase采用了分布式的架构,能够实现数据的高可靠性、高可扩展性和高性能。在实际应用中,正确地安装和部署HBase集群是非常重要的。
1、准备环节 1.1设备基本要求 在安装hbase之前,需要虚拟机满足以下几个条件:
1.HBase集群需要依赖Hadoop和Zookeeper,所以 必须保证自己的集群装好了hadoop和zookeeper。在Hadoop中,需要配置HDFS和YARN,以支持HBase的分布式部署和资源管理。在Zookeeper中,需要配置Zookeeper集群,以支持HBase的分布式环境下的协调和管理。
2.存储:HBase需要大量的内存来存储数据,建议虚拟机的磁盘空间不少于100GB。如果虚拟机的存储空间不足,可能会导致HBase无法存储数据或者出现存储空间不足的错误。
3.虚拟化技术:HBase可以在虚拟机中运行,需要选择支持硬件虚拟化的虚拟化技术,例如Hyper-V、VMware等,如图1所示。
图1·更新后的VMware 1.2安装包 在安装和部署HBase时,需要注意Hadoop与HBase的版本兼容性问题。因为HBase依赖于Hadoop的分布式文件系统HDFS和资源管理框架YARN,而且HBase的各个版本都会对Hadoop的版本有一定的要求。如果选用了不兼容的版本,可能会导致HBase无法正常工作或者出现各种错误。
想要快速了解自己使用的hadoop版本与hbase版本是否兼容,可参考下图。
下图没有的,可以打开该网址进行查看:hadoop与hbase版本兼容性查看
本文使用的hadoop版本与hbase版本分别是hadoop-2.7.1,hbase-1.4.8。
需要下载hbase安装包的可以去以下网址:hbase安装包下载
2、修改相关信息 本文所使用的虚拟机来自于队友,与队友使用的机器不是同一台,所以需要修改IP和IP映射。假如你也是从其他渠道取到别人配置好的hadoop与zookeeper环境的虚拟机,记得修改哦,否则导致无法连接网络等一系列问题。
2.1修改ip 输入一下命令,进入ifcfg-ens33这个文件修改ip,所有集群都要改。
进入后按以下说明修改:
1.设置IP,要和你电脑的VMnet8的IP在同一个网段。假设VMnet8的IP是192.168.233.1,子网掩码是255.255.255.0,那么你的IP就可以设置192.168.233.3 ~ 192.168.233.254中的任意一个IP。
2.设置子网掩码,和你电脑VMnet8的子网掩码一致
3.设置网关,默认xxx.XXX.XXx.2,网段和VMnet8一致
vi /etc/sysconfig/network-scripts/ifcfg-ens33 修改完后输入以下命令重启网卡,重启后ping一下外网,能ping通的话就说明成功了。
systemctl restart network 2.2修改ip映射 输入以下命令,编辑/etc/hosts文件,修改ip映射,所有集群都要改,与前面修改好的ip一致。
vi /etc/hosts 3、安装与部署 3.1.上传安装包 将hbase-1.4.8.tar.gz上传到虚拟机的/usr/local路径。
3.2.解压安装包 解压hhbase-1.4.8.tar.gz到当前路径。
tar -xzvf hbase-1.4.8.tar.gz 3.3.配置HBASE_HOME 3.3.1修改hbase-env.sh 进入hbase-1.4.8/conf/路径下,输入以下命令编辑hbase-env.sh文件,配置JAVA环境变量。
vi hbase-env.sh 3.3.2修改core-site.xml 输入以下命令编辑hbase-site.xml文件, 配置文件如下,可直接复制。然后根据实际情况进行修改。
以下是几个比较重要的配置信息说明:
hbase.rootdir
这个目录是region server的共享目录,用来持久化HBase。URL需要是’完全正确’的。例如,要表示hdfs中的’/hbase’目录,namenode 运行在namenode.example.org的9090端口。则需要设置为hdfs://namenode.example.org:9000/hbase。默认情况下HBase是写到/tmp的。不改这个配置,数据会在重启的时候丢失。
默认: file:///tmp/hbase-${user.name}/hbase
hbase.master.port
目录
一.前言
二.SQLite数据库介绍
1.什么是SQLite数据库
2.特点
3.SQLite 操作API
4.SQLite数据类型
三.SQlite数据库的使用
1.创建类继承SQLiteOPenHelper
2.创建数据库
3.创建数据库表
4.更新表添加字段
完整代码
扩展
总结
一.前言 我们在使用Android进行开发的时候不可避免的要使用到数据,那么就需要用到数据库,来对数据进行操作。而Android系统就内置了SQlite。
二.SQLite数据库介绍 1.什么是SQLite数据库 SQLite是一款轻量级的关系型数据库,它运算速度快,占用资源少,在内存中只需要占用几百KB的存储空间。
2.特点 轻量级独立性隔离性跨平台安全性多语言接口 3.SQLite 操作API Android SDK提供了一系列对数据库进行操作的类和接口。常用的数据库操作类有:
SQLiteOpenHelper 类(我们今天使用到的是这个)
SQLiteOpenHelper类中常用的方法 onCreate(SQliteDatabase db)数据库第一次创建时,会调用onIpgrade(SQliteDatabase db, int i, int i1)数据库升级时自动调用getWritableDatabase()打开可读/写的数据库getReadableDatabase()打开可读的数据库close()关闭数据库 • 该类是一个抽象类,用于创建数据库和数据库版本更新。
SQLiteDatabase 类
• 该类是一个数据库访问类,封装了一系列数据库操作的API,可以对数据进行增删改查操作。
Cursor接口
• 是一个游标接口,在数据库操作中作为返回值,相当于结果集ResultSet。
4.SQLite数据类型 integer:整型real:浮点型text:文本类型blob:二进制类型 三.SQlite数据库的使用 1.创建类继承SQLiteOPenHelper 1.先创建一个项目,然后创建一个类,我这里创建的是MySQLiteOpenHelper类,可以再建一个db包把该类放在该目录下。
2.继承SQLiteOPenHelper,并点击实现onCreate方法和onUpgrade方法用于创建、升级数据库。
飘红不要害怕,点击红色小灯泡构造一下它的构造函数就可以了。
2.创建数据库 我们重写MySQLiteOpenHelper的构造方法,把后面的3个参数都写死,方便后面可以调用,然后写数据库名,还有数据库版本。
//部分代码 public class MySQLiteOpenHelper extends SQLiteOpenHelper { Context mContext; public MySQLiteOpenHelper(@Nullable Context context) { super(context, "
一、爬虫的原理 爬虫是什么?把互联网上的数据,抓取下来,存到自己的本地。
以百度为例,爬取一个个的网页,存到自己库中,当我们搜索的时候,去百度的数据库中搜索,显示在前端,点击某个页面,直接跳转到真正的地址。
基本原理:
发送http请求(requests)---->返回数据----->解析数据(数据清洗,bs4,re…)---->入库(文件,excel,mysql,redis,mongodb)
注:
爬取数据时,如果被禁止了,一定是你模拟的不像。
爬虫协议:
每个网站,都有爬虫协议,规定了哪些允许你爬,哪些不允许你爬(君子协议)
robots.txt---->只是一个协议
反爬:
验证码封ip封账号js逆向:js比较不错app爬取:加密app逆向:java,动态调试so文件---->汇编 爬虫所需工具:
请求库:requests,selenium
解析库:正则,beautifulsoup,pyquery
存储库:文件,MySQL,Mongodb,Redis
爬虫常用框架:
scrapy
二、请求库requests基本使用 模拟发送http请求(只要http请求有的东西,都可以使用requests发送出去)。
python内置的urllib2、urllib3,不太好用,用起来比较麻烦。
大神基于urllib3封装了requests,python界非常出名的第三方库,只能发送http请求,不能解析;
又封装了一个requets-html库,把request和解析库封装到一起了。
安装:pip3 install requests
1.基本使用
import requests # res对象中会有,响应体,响应头,cookie。。。。 # 请求头中带User-Agent,是客户端类型 # 加入请求头 res = requests.get('https://dig.chouti.com/',headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36' }) print(res.text) # 响应体,转成了字符串 with open('a.html','w',encoding='utf-8') as f: f.write(res.text) # 另外一种使用 requests.request('post',cookies={}) 2.带参数的GET请求
# 方式一:get请求参数,直接拼接在路径中 response = requests.get('https://www.baidu.com/s?wd=美女', headers={ 'User-Agent': 'Mozilla/5.
1.R-CNN论文背景
2. R-CNN算法流程
3. R-CNN创新点
一、R-CNN论文背景 论文网址https://openaccess.thecvf.com/content_cvpr_2014/papers/Girshick_Rich_Feature_Hierarchies_2014_CVPR_paper.pdf
RCNN(Region-based Convolutional Neural Networks)是一篇由Ross Girshick等人于2014年发表的论文,题为《Rich feature hierarchies for accurate object detection and semantic segmentation》(准确的物体检测和语义分割的丰富特征层级)。该论文提出了一种基于深度学习的目标检测算法,该算法在当时取得了显著的突破,为目标检测领域的研究带来了重要的影响。
在RCNN之前,目标检测通常基于手工设计的特征和传统的机器学习算法,如SVM(支持向量机)和随机森林。这些方法在复杂的场景中往往无法提供准确的检测结果。RCNN通过引入深度学习的卷积神经网络(CNN),利用其强大的特征学习能力,极大地改进了目标检测的准确性和性能。
RCNN的创新之处在于将深度学习引入目标检测的各个阶段。通过使用CNN提取特征,RCNN能够学习到更具有判别性的特征表示,从而提高了目标检测的准确性。此外,RCNN还引入了候选区域的生成机制,避免了对整个图像进行密集的滑动窗口搜索,从而大大提高了算法的效率。
RCNN的成功标志着深度学习在目标检测领域的广泛应用。自此之后,研究人员提出了一系列基于RCNN的改进算法,如Fast R-CNN、Faster R-CNN和Mask R-CNN等,进一步提升了目标检测的性能,并推动了计算机视觉领域的发展。
二、R-CNN算法流程 RCNN的核心思想是将目标检测问题转化为一系列的候选区域(region proposal)的分类问题。首先,它使用一个基于选择性搜索(Selective Search)的方法生成一组可能包含目标的候选区域。然后,对每个候选区域,RCNN通过在该区域上进行前向传播来提取固定长度的特征向量。这些特征向量随后被输入到一个独立的SVM分类器中,以判断该区域是否包含目标,同时还有一个边界框回归器用于精确定位目标的位置。
RCNN算法分为4个步骤:
(1)获取候选区域:对于一张输入的图像,首先使用selective search算法获取2000个左右的候选区域,由于selective search生成的候选区域是大小不一致的区域,而后续的卷积神经网络中的全连接层需要保证固定大小的输入,因此在输入卷积网络之后将其缩放至固定大小的图像;
(2)获取图像特征:将图像输入到卷积神经网络中获取图像特征,这一部分可以采用常用的图像卷积神经网络如VGGNet,AlexNet等。
(3)获取区域类别:在初步获得目标的位置之后,需要获取目标的类别,这一步采用SVM分类器来判断当前区域属于哪个类别。
(4)微调区域位置:尽管候选区域已经初步目标的位置,但是这个区域比较粗糙,因此使用回归器对区域位置进行微调
1.候选区域生成:获取候选区域 1.使用一种过分割手段,将图像分割成小区域 (1k~2k 个)
2.查看现有小区域,按照合并规则合并可能性最高的相邻两个区域。重复直到整张图像合并成一个区域位置
3.输出所有曾经存在过的区域,所谓候选区域
其中合并规则如下: 优先合并以下四种区域:
颜色(颜色直方图)相近的
纹理(梯度直方图)相近的
合并后总面积小的: 保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域 (例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh)
合并后,总面积在其BBOX中所占比例大的: 保证合并后形状规则。
首先目标检测问题很重要的一个因素是:一张图像中可能存在多个物体需要分别定位和分类。显然,在训练分类器之前,需要使用一些方法将图像划分为小的区域,这些方法统称为Region Proposal Algorithms。一张图像中包含的信息非常丰富,图像中的物体有不同的形状、尺寸、颜色、纹理,而且物体间还有层次(hierarchical)关系。因此不能通过单一的策略来区分不同的物体,需要充分考虑图像物体的多样性(diversity),除此之外,在图像中物体间的布局还有一定的层次关系。这个时候,作者就给了几种区域提议方法。
(1)传统方法:
Exhaustive Search
一开始是穷举法,遍历图像的每一个像素,但导致搜索的范围很大,计算量也很大,改进的穷举法产生100000多个提议区域,这对后面的区域特征提取和分类器训练带来不小的压力,所以不合适使用复杂的特征提取算法和分类器,一般使用HOG+SVM。
一、一些迹象 逛社区,偶然看到了这张图片:
嗯……我眉头一皱,久久不语,心想,有这么夸张吗,假的吧?
突然想到,最近我在社区发了个前端招聘的信息,结果简历漫天纷飞,塞爆邮箱。
莫非,前端这个岗位真的不再是供不应求了?🤔
二、原因分析 我细想下,也差不多到时候了。
从16年到现在,算算,7年的时间了。
前端大火就是从16年开始的,多种原因,包括:
移动互联网的兴起,传统行业的数字化转型,大前端技术的普及等。
紧接着是Vue为代表的前端框架和工具的兴起,使得前端开发的门槛进一步降低,前端也成为进入互联网圈子的最快最容易的跳板,促使前端圈进一步繁荣。
然而,连王菲都知道,没有什么是长盛不衰的。
发展,稳定,衰落是亘古不变的事物发展规律。
各种迹象表明,无论是有意还是无意,目前互联网的发展似乎进入了平稳期,这也意味着岗位的需求也开始变得平稳,而涌入这个行业的新人却没有停止,这就必然导致到了某个时间点,前端从业人员会达到饱和,于是那些没有竞争力的人就会遇到求职困境。
遇困的人多了,在社区的声音多了,自然也就会出现“前端已死”这样的言论。
三、破局之道 想要改变这种现状,只能是下面两种方法。
一是烧香拜佛,祈祷互联网大环境好转,最好再来一波生产力或生产环境的变革,让前端行业再赶上一波发展的春风,催生更大的岗位需求,何愁就业?
但显然,寄希望于大环境是不靠谱的,生产力虽然一定是往上走的,但说不定不是助力行业的发展,而是革了行业的命。
比方说现在很火的chatGPT,你说是会增加前端岗位呢,还是空窗加倍绝绝子?
所以,要想前端碗端得稳,前端饭吃得香,还是得靠下面这个方法,也就是想办法提高个人的核心竞争力。
提高核心竞争力 所谓核心竞争力,说白了,就是你能干别人干不了的活,能做别人做不了的事情。
更直白一点,就是你能给团队创造比别人更多的价值。
很普通的一句话,对不对?但是意识到和意识不到,那可是天差地别。
最近虽然收到了很多简历,但是看完之后都只能无奈摇头,不能说一模一样嘛,可以说极其雷同,缺少区分度。
专业技能均是全覆盖,工作描述均是自己用了什么前端框架,做了什么什么工作。
没有任何吸引人的信息,给人感觉,就是个普通的前端从业人员,领导安排个需求,然后接受,排期,完成开发,上线,这种。
这就……对吧,不是不给机会,实在是给不了。
一百份简历竞争一个招聘HC,肯定是把面试机会留给那些有突出亮点的人的。
拿工作描述举例,你一个一个罗列你做的项目,用了哪些技术有什么用?所有投简历的人都有做项目,都有使用前端技术,你的这些描述完全就是废话,简历扔垃圾箱的那种。
不需要扯那么多,你就说你比别人牛在什么地方!
注意,这个牛,不一定就是技术水平或者业务成果,任何亮点都可以,只要是能够做到别人做不到的事情,同时是对团队有帮助的,都可以。
举几个例子:
– 我参与了团队所有项目的开发,“所有”就是亮点,隐约让人觉得你是可信任的。
– 我是团队下班最晚的,工作最积极的。也是亮点,可以提,工时越长,通常产出越多,性价比就越高。
– 我在团队里做了很多看不见的工作。亮点,主动承担边缘工作不是所有人都可以做到的。
– 我是团队内分享(面授或文章都可以)次数第一。亮点,加分,帮助团队成长也是一种价值产出。
– 我连续获得四星五星荣誉,或者优秀员工称号,加分,公司的认可比自己在简历上吹上天都有用。
甚至是工作以外的特长都可以,我是钓鱼大佬,我是跑步达人,我是综艺专家,我是健身狂人,都可以,因为一个人能坚持自己的爱好并做到出众,也是不简单的。
可偏偏问题就在于,能够获得面试机会的亮点如此简单,很多人却没有,一个也没有。
因为在日常工作中就没有这种意识,就是我要做得比别人更好、我要强化我的优势、我要想办法让团队变得更好的意识。
平时工作就是浑浑噩噩的状态,等需求,写代码,上线,拿钱,一切都是在被动进行,仅把前端当作职业而非事业,总是希望干活少,拿钱多。
所以做事难以精益求精,也不会为了更好的未来努力让当下的自己变得更好,也不会主动做那些工作以外的对团队有帮助的事情,典型的被网上的躺平言论给忽悠瘸了。
弄错了因果,即,我给老板加班,又不会给我涨薪,我为什么要加班?我学习更底层的技术,平时又用不到,我为什么要学?我平时工作那么忙,还要我去写文档做分享,我为什么要做?
所以,找不到工作就不要怨天尤人了,也别说什么“前端已死”,前端行业好着呢,优秀的前端不知道多缺,年薪不知道有多高!
框架的能力 很多人做开发非常熟练,各种得心应手,于是就会觉得自己是个挺有竞争力的前端开发人员。
高启强没有说话,只是呵呵一笑。
这是不小心把框架的能力当作自己的能力了。
大家不妨冷静想一想,借助一个成熟的框架,开发出一个合格的Web应用,他的难度有多高?
更具体点,我们经常使用的各种小程序和快应用,让一个培训班里培训了3个月的新人,以及充足的时间,他能不能捣鼓出来?
答案显而易见,肯定可以,至少绝大多数人都可以。
因为使用一个东西的难度要比创造一个东西的难度低多了。
也就是,基于Vue等前端框架的开发,它是需要技术的,但是,它并不需要的很高的技术。
这种状态最容易迷惑人,所谓满瓶不动半瓶摇。
如果不能跳出自己所处的环境,正在更高的视角看待自己,非常容易对自己在行业所处的层次造成误判,譬如,我明明干活很利索,怎么没有面试机会,一定是我们这个行业出问题了。
这就是误判,有问题的不是行业,而是自己的竞争力不足。
我再说一遍,希望大家不要嫌啰嗦,使用工具的能力,并不能作为核心竞争力,因为现在学习资料很丰富,社区很活跃,什么问题都可以找到解决方案,你能做到的别人也能做到,没有任何优势,不属于竞争力。
反而是下面这些能力有足够的区分度。
比他人涉猎更广,例如音视频处理、图形表现实现或者Node开发有较多经验;JS、CSS等前端基本功扎实,积累深厚,各种API特性了然于心,最佳实践信手捏来;具有设计审美或者产品嗅觉灵敏,开发的产品体验非常好,干活很细。 拥有这些能力或特质,并在简历上表现出来,最好有材料佐证,那找到一份满意的工作是非常轻松的事情。
就怕一年经验十年用,从此外卖天天送。
当然,不可否认,虽说框架与工具让很多人陷入了温床,但对于国家整个数字化转型和互联网的发展是做出了重大贡献的。
本学期学习了Android Studio这门课程,本次使用Android Studio自带的sqlite数据库实现一个简单的登录注册功能。
目录
一、了解什么是Android Studio?
二、了解什么是sqlite?
三、创建项目文件
四、创建活动文件和布局文件。
五、创建数据库,连接数据库
六、创建实体类,实现注册功能
七、实现登录功能
八、总结
一、了解什么是Android Studio? Android Studio 是开发 Android 应用程序的官方 IDE,基于 Intellij IDEA。你可以从官网Android Studio下载下载最新版本的 Android Studio。在项目开始之前,请确认已经安装好Android Studio和完成相关的环境配置。
二、了解什么是sqlite? SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。他有诸多的优点。
轻量级:SQLite是一个嵌入式数据库,它以一个独立的、自给自足的文件形式存在,不需要额外的服务器进程或配置。它的库文件大小较小,占用的系统资源较少,适合在资源有限的环境中使用。
易于使用:SQLite提供了简单的API和易于理解的SQL查询语言,使得开发人员可以轻松地进行数据库操作。它使用标准的SQL语法,并提供了广泛的查询、插入、更新和删除功能。
高性能:由于SQLite是一个本地文件数据库,它可以直接访问数据,而无需网络连接。这使得数据库操作的速度非常快,并且可以在本地执行复杂的查询和事务。
跨平台支持:SQLite数据库可以在多个操作系统和平台上运行,包括Windows、Linux、Mac和移动设备平台(如Android和iOS)。这使得开发人员可以使用相同的数据库技术来开发跨平台的应用程序。
想要学习sqlite数据库的可以点击了解sqlite教程,本文不做过多介绍。
三、创建项目文件 打开Android Studio,创建一个新的空白项目。
接下来设置应用程序的基本信息,如应用程序名和包名,指定程序的安卓版本等。
设置完成后点击完成,完成一个空项目的创建。 四、创建活动文件和布局文件。 在项目工程结构下的Java目录下的包含你项目名的软件包下新建活动文件。一般项目会自带有一个默认活动。(叫这个名字👉MainActivity)
右击软件包,创建一个名为RegisterActivity的活动,勾选第一个选项,创建完成活动后Android Studio会自动帮你创建对应的一个布局文件。
因为刚创建出来的布局文件是空白的,需要我们自己添加按钮或者文本,以下是一个布局页面的示例,可以根据自己需求更改。布局元素自行了解,不再过多叙述。 activity_register.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".RegisterActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="注册" android:textSize="40dp" android:layout_gravity="center" /> <LinearLayout android:layout_width="
文章目录 前言一、动态是什么?二、使用步骤1.导入相应的包2.定义接口3.定义接口实现类4.实现InvocationHandler接口5.实现代理 三、整体实例四、输出结果总结 前言 动态代理提供了一种灵活且非侵入式的方式,可以对对象的行为进行定制和扩展。它在代码重用、解耦和业务逻辑分离、性能优化以及系统架构中起到了重要的作用。
增强对象的功能:通过动态代理,可以在不修改原始对象的情况下,对其方法进行增强或添加额外的行为。可以在方法执行前后进行一些操作,比如日志记录、性能监测、事务管理等。
解耦和业务逻辑分离:动态代理可以将对象的特定操作从业务逻辑中解耦,使得代码更加模块化和可维护。代理对象可以负责处理一些通用的横切关注点,而业务对象可以专注于核心业务逻辑。
实现懒加载:通过动态代理,可以延迟加载对象,只有在真正需要使用对象时才会进行创建和初始化,从而提高性能和资源利用效率。
实现远程方法调用:动态代理可以用于实现远程方法调用(RPC)和分布式系统中的服务代理。客户端通过代理对象调用远程服务,并隐藏了底层网络通信的细节。
实现AOP编程:动态代理是实现面向切面编程(AOP)的基础。通过代理对象,可以将横切关注点(如日志、事务、安全性)与业务逻辑进行解耦,提供更高层次的模块化和可重用性。
一、动态是什么? 动态代理是一种设计模式,它允许在运行时创建代理对象,并将方法调用重定向到不同的实际对象。它使我们能够在不修改现有代码的情况下增加或改变某个对象的行为。
二、使用步骤 1.导入相应的包 在Java中,可以使用Java的反射机制来实现动态代理。Java提供了java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; 2.定义接口 // 定义接口 interface UserService { void addUser(String username); } 3.定义接口实现类 // 实现接口的具体类 class UserServiceImpl implements UserService { public void addUser(String username) { System.out.println("添加用户:" + username); } } 4.实现InvocationHandler接口 // 实现InvocationHandler接口 class MyInvocationHandler implements InvocationHandler { // 声明一个私有变量 private Object target; // 构造函数 public MyInvocationHandler(Object target) { this.target = target; } // 实现InvocationHandler接口的invoke方法,该方法在代理对象调用方法时被触发。 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.
第1关:通过主索引设置实体完整性 本关任务:建立主索引可以保证数据的实体完整性。 即数据表的每行记录不与其他记录重复
use library; #代码开始 alter table book add primary key txm(txm) ; #代码结束 insert into book(txm,sm) values("P0000001","苏东坡全集"); 第2关:通过check设置域完整性 对于图书数据表book(已经建立并插入记录),对于价格字段sj设置约束sjgd,要求价格必须大于0且小于等于5000
use library; #代码开始 alter table book add constraint sjgd check (sj>0 and sj<=5000); #代码结束 insert into book(txm,sm,sj) values("P0000099","四库全书一",8000); 第3关:设置借阅表和读者表的参照完整性 在借阅表和读者表设置参照完整性 当删除读者表的数据时,借阅表的相关记录一起删除 当修改读者表的读者证号时,借阅表的相关记录的读者证号一起被修改
use library; #代码开始 alter table borrow add constraint dzzh foreign key (dzzh) references reader(dzzh) on delete cascade on update cascade; #代码结束 delete from reader where dzzh="001"; update reader set dzzh="
前言: 一、电脑配置要求 二、安装Anaconda 三、cuda和cudnn安装 四、Stable-Diffusion开源代码下载和依赖安装 五、启动服务 前言:
为什么本地部署?Stable-Diffusion是完全开源的,本地部署不受限于网络压力,自由出图,效率高,速度快,非常适合有一定电脑基础的同学们。当然跟着我这篇,无基础的小白也能迅速部署。
一、电脑配置要求
虽然可以本地部署,但是电脑配置还是有一定的要求:
需要配置一张N卡,最少得4G显存,最好20系以上的卡;网上说A卡无法本地部署(这个有待考证)Win10及以上系统;科学上网,没有梯子基本寸步难行;题主的电脑配置RTX3070+10700F+16G内存,一张512*512的图大概在5s左右; 二、安装Anaconda
已经安装过额同学们可以跳过这节,安装很简单,参考下面步骤
Anaconda | The World’s Most Popular Data Science Platform下载对应版本的安装包; 双击安装包进行安装,选择安装路径,一路下一步到这步,点击install即可 在左下角开始菜单找到这个Anaconda Prompt,点击打开conda命令行窗口 创建Stable-Diffusion专用虚拟环境,采用Python3.10.6,一路按确认即可创建环境; conda create --name stable-diffusion python=3.10.6
当前在base环境下,切换环境为我们刚创建的stable-diffusion, conda activate stable-diffusion
以上就完成了Anaconda的安装和虚拟环境创建了,下面我们会进行虚拟环境依赖的安装。
三、cuda和cudnn安装
官网下载地址https://developer.nvidia.com/cuda-toolkit-archive,根据自己的显卡型号下载对应的cuda和cudnn,需要科学上网具体参考:CUDA与cuDNN安装教程(超详细)_kylinmin的博客-CSDN博客,不过多追赘述,如有不清楚的可以私信我 四、Stable-Diffusion开源代码下载和依赖安装
下载Stable-Diffusion开源代码,有两种方法,电脑中有Git的使用git下载 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
没安装git的同学们,直接登录网站下载zip压缩包,
解压下载的Stable-Diffusion源码,将命令行窗口切换值源码目录,输入以下命令安装依赖。 pip install -r requirements.txt
注意网上的教程大多是运行webui-user.bat,该脚本文件实在源码目录下新建一个venv,将依赖全部下载该虚拟环境下,与我们使用的Anaconda不同,我们避免需要避免该操作,否则会遇到gfpgan一直安装不了的一系列问题。
下面是重点,pip install -r requirement.txt也会存在不少资源安装不了的情况,对于安装失败的依赖包我们可以切换豆瓣源进行安装,举例安装gfpgan,可以使用如下的命令 pip install gfpgan -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
pip install 库名称 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
安装完成之后的输入pip list,查看依赖是否都安装完成,缺少的重复上一步,至此依赖环境都安装完成。 五、启动服务
知了: Note.js它是干什么的?
Note.js它是一个开源和跨平台的JavaScript运行环境,Note.js它还是任何类型项目流行的工具
Note.js在浏览之外运行V8 JavaScript引擎(Google Chrome的内核),这也使得Note.js性能非常的好,非常的大家的喜爱。
Note.js它能做什么?
开发桌面应用程序;比如qq、微信、VisualStudioCode(简化的代码编译器‘VSCode’)就是note.js开发的开发服务器应用程序 我们为什么要学习Note.js
开发省时省力,节省时间因为Note.js是单线程的,没有切换线程的损耗,和线程之间的‘竞争’IO处理的非常快速 Note.js安装与配置 第一、安装Note.js 下载安装添加环境变量第二、验证是否安装成功第三、修改默认模板下载位置 查看默认npm存放位置在Note.js安装目录下,添加两个文件 node_globalnode_cache修改默认文件夹然后测试文件夹是否修改成功第四、设置淘宝镜像 将npm默认的‘registry’修改位淘宝的‘registry’最后全局安装基于淘宝源的cnpm 第一、安装Note.js 1、下载Note.js https://nodejs.org/en
根据系统进行对应安装,我是Windows系统的
放到C盘还是D盘什么盘的,自己选择
2、安装Note.js 1)点击直接点击Next下一步
2)把协议勾上,点击Next下一步
3)选择自己的要存放的目录,然后点击Next下一步
4)直接点击Next下一步
5)用红框框起来的,可以不用管,看自己情况,我是直接点击Next下一步
6)直接点击Install进行安装
7)正在安装中.....等会就好了
8)直接点击Finish完成安装
3、添加环境变量 1)打开‘此电脑属性’
2)找到高级设置—>点击环境变量—>进入系统变量‘Path’ 变量
3)点击新建,把你Note.js安装目录复制粘贴到里面,然后点击确定
二、验证是否安装成功 进入cmd命令行窗口,输入node -v查看nodejs版本;注意:最好用管理员身份运行
node -v
输入npm -v查看版本
npm -v
运行结果:
三、修改默认模板下载位置 提示:可以根据自身的情况进行修改
1、查看默认npm存放位置 使用 npm get prefix 查看npm全局模块默认的存放的路径
npm get prefix 使用 npm get cache 查看npm默认缓存存放的路径
npm get cache
运行结果:
如上图所示:我是已经修改过来了的,第一次在电脑上配置的人,模块默认存放位置和缓存默认存放位置是在C盘的User用户目录xxxx目录下的
2、在Note.js安装目录下,添加两个文件 node_global 文件夹
目录 一、JSP概述(一)什么是JSP1、JSP的概念2、JSP的特征(1)跨平台(2)业务代码相分离(3)组件重用(4)预编译 (二)编写第一个JSP1、创建Web项目2、修改Artifact名称,重新部署项目3、创建欢迎JSP页面4、启动服务器,查看结果 (三)JSP运行原理1、JSP的工作模式2、JSP的运行原理图3、JSP的运行过程(1)执行步骤(2)运行过程总结 二、JSP基本语法(一)JSP页面的基本构成1、JSP页面构成2、案例演示 - 显示系统当前时间 一、JSP概述 (一)什么是JSP 目标:了解JSP的概念与特征,能够知道JSP用于做什么 1、JSP的概念 JSP全名是Java Server Pages,即Java服务器页面。它是Servlet更高级别的扩展。在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态内容的显示。最终,JSP文件会通过Web服务器的Web容器编译成一个Servlet,用来处理各种请求。 2、JSP的特征 (1)跨平台 由于JSP是基于Java语言的,使用JSP开发的Web应用是跨平台的,可以应用于不同的系统中,如Windows、Linux等。当从一个平台移植到另一个平台时,JSP和JavaBean的代码并不需要重新编译,这是因为Java的字节码是与平台无关的,这也符合了Java语言“一次编译,到处运行”的特点。 (2)业务代码相分离 在使用JSP技术开发Web应用时,可以将界面的开发与应用程序的开发分离开。开发人员使用HTML设计界面,使用JSP标签和脚本动态生成页面上的内容。在服务器端,JSP容器负责解析JSP标签和脚本程序,生成所请求的内容,并将执行结果以HTML页面的形式返回给浏览器。 (3)组件重用 JSP中可以使用JavaBean编写业务组件,也就是使用一个JavaBean封装业务处理代码或者作为一个数据存储模型,在JSP页面中,甚至在整个项目中,都可以重复使用这个JavaBean,同时,JavaBean也可以应用到其他Java应用程序中。 (4)预编译 预编译就是在用户第一次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译。编译好的代码将被保存,在用户下一次访问时,会直接执行编译好的代码。这样不仅节约了服务器的CPU资源,还大大提升了客户端的访问速度。 (二)编写第一个JSP 目标:掌握JSP文件的编写 1、创建Web项目 创建Java Enterprise,添加Web Application
设置项目名称与保存位置
单击【Finish】按钮
2、修改Artifact名称,重新部署项目 在项目结构窗口里修改Artifact名称
在服务期配置窗口里,重新部署项目
切换到【Server】选项卡,设置默认浏览器
3、创建欢迎JSP页面 在web目录里创建welcome.jsp
注意:由welcome.jsp页面可知,新创建的JSP文件与传统的HTML文件几乎没有什么区别,唯一的区别是默认创建时,页面代码最上方多了一条page指令,并且该文件的后缀名是jsp,而不是html。
修改welcome.jsp
4、启动服务器,查看结果 启动服务器,访问http://localhost:8080/JSPDemo/welcome.jsp
注意:welcome.jsp的标签中添加的内容已被显示出来,这说明HTML元素可以被JSP容器解析。实际上,JSP只是在原有的HTML文件中加入了一些具有- - Java特点的代码,这些称为JSP的语法元素。
课堂练习:修改首页,显示如下图所示
(三)JSP运行原理 目标:熟悉JSP的运行原理
1、JSP的工作模式 JSP的工作模式是请求/响应模式,客户端首先发出HTTP请求,JSP程序收到请求后进行处理并返回处理结果。一个JSP文件第一次被请求时,JSP容器把该JSP文件转换成为一个Servlet,而这个容器本身也是一个Servlet。
2、JSP的运行原理图 如果是第一次访问JSP文件,被服务器翻译成一个对应的Java文件(Sevlet),然后,再被编译成.class文件并加载到内存中。如果是第二次访问JSP,那就可以直接调用内存中的JSP实例,所以之后访问JSP速度会比之前快一些。
3、JSP的运行过程 (1)执行步骤 第1步、客户端发出请求,请求访问JSP文件。
第2步、JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果发现JSP文件中存在任何语法错误,则中断转换过程,并向服务端和客户端返回出错信息。
第3步、如果转换成功,则JSP容器将生成的Java源文件编译成相应的字节码文件*.class。该class文件就是一个Servlet,Servlet容器会像处理其他Servlet一样来处理它。
第4步、由Servlet容器加载转换后的Servlet类(.class文件)创建一个该Servlet(JSP页面的转换结果)的实例,并执行Servlet的jspInit()方法完成初始化。jspInit()方法在Servlet的整个生命周期中只会执行一次。
第5步、JSP容器执行jspService()方法处理客户端的请求。对于每一个请求,JSP容器都会创建一个新的线程来处理它。如果多个客户端同时请求该JSP文件,则JSP容器会创建多个线程,使得每一个客户端请求都对应一个线程。JSP运行过程中采用的这种多线程的执行方式可以极大地降低对系统资源的消耗,提高系统的并发量并缩短响应时间。需要注意的是,由于第 4 步生成的Servlet实例是常驻内存的,所以响应速度非常快。
第6步、如果JSP文件被修改了,则服务器将根据新的设置决定是否对该文件进行重新编译。如果需要重新编译,则使用重新编译后的结果取代内存中常驻的Servlet实例,并继续上述处理过程。
第7步、虽然JSP效率很高,但在第一次调用的时候往往由于需要转换和编译,会产生一些轻微的延迟。此外,由于系统资源不足等原因,JSP容器可能会以某种不确定的方式将Servlet实例从内存中移除,发生这种情况时,JSP容器首先会调用jspDestroy()方法,然后Servlet实例会被加入“垃圾收集”处理。
第8步、当请求处理完成后,响应对象由JSP容器接收,并将HTML格式的响应信息发送回客户端。
(2)运行过程总结 了解了JSP的运行原理后,完全可以利用其中的一些步骤来做一些工作,例如,可以在jspInit()中进行一些初始化工作(建立数据库的连接、建立网络连接、从配置文件中获取一些参数等),可以在jspDestroy()中释放相应的资源等。
二、JSP基本语法 (一)JSP页面的基本构成 目标:熟悉JSP的页面的基本构成
编译安卓内核前需要准备的东西。
一台支持解锁bootloader的手机官方开源地址,或者第三方整合好的也行一个linux环境,虚拟机、wsl、termux等都可以看得懂中文 开始操作!
一、 从你的手机里面提取config.gz文件,在/proc/config.gz路径,这个文件是构建你手机内核的配置文件,这个默认是官方的,如果没有这个文件,那你需要通过解包boot.img来获取,稍后会说。
二、拉取你官方开源的内核源码以及设备树(安卓9以后,默认只开源内核了,设备树这些,都不再开放了)。
从你的品牌官方获取开源代码,比如小米开源地址,摩托罗拉开源地址,真我手机开源地址。把源码拉取到本地。
如果你不想用官方的,想用第三方的,比如LineageOS,Crdroid也可以。
你没有官方开源也没有第三方官方支持,那你可以不用看了,省点流量跟电量,去做别的事情吧- - 。
#git拉取示例 #--depth=1代表只拉取最新的源码,可以极大减少拉取后的体积,缩减拉取时间 git clone --depth=1 https://github.com/ProjectBlaze-Devices/kernel_xiaomi_chime 三、配置基本构建环境。
1.安装Linux环境。(wsl、vm虚拟机、双系统实体机的Linux,都可以)
2.安装编译工具。
Debian系列:(包括Ubuntu、Linux mint、优麒麟、Uos、termux)
#Debian系列: apt-get install -y bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev ArchLinux系列
pacman -Syu git cd ~ git clone https://aur.archlinux.org/aosp-devel.git cd aosp-devel makepkg -si 其它系列,自行查找对应的工具安装.
实现效果 测试类 public class ChartTest { // 开始行 public static int chartRowStart = 3; // 结束行 public static int chartRowEnd = 20; public static ChartPosition chartPosition; public static void main(String[] args) throws IOException { // 填充数据 XSSFWorkbook workbook = createExcel(); FileOutputStream fileOut = null; try { // 将输出写入excel文件 String filename = UUID.randomUUID() + ".xlsx"; fileOut = new FileOutputStream(filename); workbook.write(fileOut); DesktopHelpers.openFile(filename); } catch (Exception e) { e.printStackTrace(); } finally { workbook.
1.背景介绍 在开发一款微信小程序时,需要用户进行微信登录,获取用户的手机号码来作为用户的唯一标识(userId),于是探索获取用户手机号码的方式;
(当然,通过wx.login来获取code,进而换取用户的openid也是可以的)
目前版本的微信小程序获取用户手机号码的方式如下:
前端开发参考:手机号快速填写组件 | 微信开放文档
后端开发参考:
手机号快速填写 | 微信开放文档
步骤如下:
①利用手机号快速填写的功能,将button组件 open-type 的值设置为 getPhoneNumber
②用户点击按钮,弹出申请获取用户手机号的弹窗:
③如果用户点击允许,则可以通过bindgetphonenumber事件回调获取到动态令牌code(注意这里的code和wx.login的code不一样,而且获取用户手机号码不需要提前调用wx.login获取code了)
④把code传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机号
注意一点,获取手机号的功能好像只允许经过认证的小程序使用,如果未认证只能使用测试号才可以
否则便会报错:
2.前端代码 开发环境:Uniapp框架
微信小程序调试基础库的版本:2.32.1
基本思路:通过按钮绑定监听事件,获取用户授权,得到code,传到后端换取用户手机号:
代码如下:
按钮:
<button open-type="getPhoneNumber" class="login_button" @getphonenumber="login" v-show="!logged">登录</button> login函数:
//登录按钮 login(e) { console.log(e) var detail = e.detail if (detail.errMsg == "getPhoneNumber:ok") { console.log("用户同意授权") var code = detail.code uni.request({ url: "http://localhost:8081/getPhoneNumber", //调用接口 method: 'POST', header: { 'content-type': 'application/json' }, data: { code: code, //请求体中封装code }, success(e) { console.
Django新手必看:如何创建应用和定义数据表。 1. Django创建应用1.1 创建应用1.2 应用的添加 2. Django ORM2.1 定义数据表2.2 定义项目数据表2.3 通用字段选项2.4 外键使用2.5 应用数据库迁移 🏘️🏘️个人简介:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读!
🎁🎁:文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。
1. Django创建应用 Django 项目就是基于 Django 框架开发的 Web 应用,它包含了一组配置和多个应用,我们把应用称之为App,在前文中对它也做了相应的介绍,比如 auth、admin,它们都属于 APP。一个 App 就是一个 Python 包,通常一个 App 可以包含模型、视图、模板和 URL 配置文件,可以被应用到多个 Django项目中,因为它们的本质就是可被重用的 Python 软件包。 1.1 创建应用 Django 的设计目标是让开发者关注应用的功能逻辑的实现。
所以,创建应用的过程是非常简单的,利用 manage.py 提供的 startapp 命令就可以创建一个APP。
具体命令如下所示:
语法:
python manage.py startapp 应用名
python manage.py startapp index startapp 同样也属于 manage.py 的子命令,用来创建 Django 的应用。 执行这个命令不会在命令行看到任何输出,但是可以在 manage.py 的同级目录下看到多出了一个 index 目录:
我们对这些文件做逐一的解释:
要求实现功能: (1)学生、课程、教师等信息的录入和维护,一门课只由一位教师上,一位教师可上多门课
(2)学生进行选课,一学期约20学分
(3)教师在每门课结束后给出学生成绩,不及格则补考后记录补考成绩
(4)能明细查询某学生的选课情况及某课程的选修学生情况
(5)能统计查询出某学生的成绩单(总成绩、平均成绩、不及格门数等)及某门课的选课人数、最高分、最低分、平均成绩等统计信息
目录
一、引言 1.1课题背景 1.2课程设计目的 1.3课程设计任务 二、需求分析 三、统数据库设计 3.1 概念结构设计 3.1.1学生E-R图 3.1.2教师E-R图 3.1.3课程E-R图 3.1.4选课E-R图 3.1.5整体E-R图 3.2 逻辑结构设计 3.2.1 将总体概念结构E-R图转化成关系模型 3.2.2数据模型的优化 3.3 物理结构设计 四、数据库实现 4.1创建数据库 4.2数据库表的创建 4.2.1创建学生信息表 4.2.2创建教师信息表 4.2.3创建课程信息表 4.2.4创建选课信息表 4.3关系图如下 4.4插入数据 4.5数据更新 4.5.1向学生表添加一个学生信息 4.5.2修改陈畅的手机号 4.5.3删除陈畅的个人信息 4.6数据查询 4.6.1简单查询 4.6.2嵌套查询 4.6.3模糊查询 4.6.4连接查询 4.6.5分组查询 4.6.6查询的排序 4.6.7聚合函数 4.7视图 4.7.1 创建一个关于补考信息的成绩表,包含所有列 4.7.2 创建一个仅包含专业基础课的课程信息表 五、总结 一、引言 1.1课题背景 随着信息化时代的到来,计算机技术也得到了广泛应用,为高等院校的管理提供了更加先进、方便和高效的方法。针对大学教务管理的问题,开发一个学生信息管理系统已经成为一项十分重要和必要的工作。而数据库实验学生信息管理系统就是基于数据库技术开发的一种高校管理软件。
该系统的主要目的是管理学生的基本信息、课程信息、成绩信息、选课信息等。在学生信息管理系统中,可以对学生基本信息进行统一管理,如姓名、学号、性别、出生日期、籍贯、联系方式等,以及学生成绩和选课情况的管理。同时,该系统具备权限控制功能,能够有效防止信息被盗取或修改。通过该系统,可实现对学生进行全面细致的管理,大大提高了工作效率,减少了人力资源的投入。
1.2课程设计目的 (1)实践使用数据库技术:学生信息管理系统作为一个基础型数据库应用,操作基本,涉及的表和字段不多,但是很实用,让学生能够快速上手操作数据库软件,了解数据库的常见概念和基本功能。
(2)学习数据库的设计与实现:学生信息管理系统涉及多张关联表的设计,通过学习系统的设计和实现,使学生了解到数据库设计的方法和技巧,包括实体和关系建模、表的设计、属性的定义、索引的设置以及语法的使用等。
(3)培养学生信息管理能力:学生信息管理系统的功能比较全面,可以使学生通过信息的录入、查询、管理等方面,学习信息管理的基本方法和技巧,提高信息管理能力。
(4)提高学生综合应用能力:学生信息管理系统的设计和实现需要涉及到多个学科的知识,如数据结构、算法、数据库技术等,通过实践能够提高学生的综合应用能力。
1.3课程设计任务 1. 需求分析:明确学生信息管理系统的使用、功能、性能和质量等方面的需求,制定相应的产品需求规格说明书。
2. 概念设计:根据需求规格说明书,进行实体和关系的建模,设计ER图和表结构,明确数据库的存储要求。
3. 逻辑设计:设计系统的逻辑架构,包括数据库的建模、SQL语句和数据字典的编写等。
文章目录 一、前言二、本地化部署的要求三、使用的项目Stable diffusion WebUI项目四、电脑环境配置4.1 安装Anaconda4.2 看版本4.3 配置库包下载环境,加快网络速度4.4 创建环境4.5 激活环境4.6 安装git4.7 安装cuda 五、Stable diffusion环境配置5.1 下载Stable diffusion源码5.2 下载Stable diffusion的训练模型5.3 安装GFPGAN5.4 准备开启运行AI绘图程序sd-webui 六、测试 一、前言 本地部署指的是将软件应用程序或服务部署在本地计算机或本地服务器上,而不是使用云服务或远程服务器。以下是一些常见的原因,解释为什么选择本地部署:
数据隐私和安全性:对于某些敏感数据或关键业务功能,保持数据在本地环境中更有保障。本地部署可以提供更高的控制权和数据安全性,以满足合规性要求。高速和低延迟:对于需要快速响应和低延迟的应用程序,本地部署通常可以提供更快的性能。由于数据和计算资源都位于本地,可以减少与远程服务器之间的网络延迟。网络限制和可靠性:某些地区或组织可能面临网络限制或不稳定的互联网连接。在这种情况下,本地部署可以提供更可靠的解决方案,确保应用程序的可用性和连续性。自定义需求:本地部署可以更容易地满足特定的定制需求。根据组织的具体要求,可以灵活地配置和定制本地部署的应用程序,以适应特定的业务流程和工作流程。成本控制:虽然云服务提供了灵活的计算资源和付费模型,但对于长期运行的应用程序,本地部署可能具有更可控的成本。一次性购买和配置本地服务器可能更经济实惠,并且在长期使用中,可能比云服务更具成本效益。 因为没有生成数量的限制,不用花钱,不用被NSFW约束,生成时间快,不用排队,自由度高很多,可以调试和个性化的地方也更多。
NSFW是"Not Safe for Work"的缩写,意为“不适合工作环境”。它用于描述那些可能包含裸露、色情、暴力、血腥或其他令人不适的内容的图像、视频、文字或链接。NSFW约束通常用于在互联网上警告用户某个内容不适合在公共或工作场所打开,以避免触犯道德、引起不适或违反组织的政策。
NSFW约束的目的是提醒用户注意内容的性质,并使其可以自主选择是否查看或接触这些内容。这种约束常见于社交媒体、在线论坛、电子邮件或其他互联网平台上,以确保用户能够遵循适当的使用规范,并保持工作环境的适宜和友好。
需要注意的是,不同的组织或平台对于NSFW的定义和约束标准可能会有所不同。一些平台会使用过滤机制或标记机制来警示用户,而其他平台可能会完全禁止或限制NSFW内容的发布和传播。因此,在使用互联网时,用户应该遵守相应的使用规则和平台政策,并对自己的行为负责。
如果说,会用各大在线的AI绘图平台来生成图像的话,算是AI绘画的小学生级别。那么,如果会使用本地化部署来运行AI绘画的话,那就已经算得上是高中毕业,进入成年啦。等你能够使用AI绘图指哪打哪,想怎么画怎么画,那就已经是大学毕业,学成归来的牛逼人物啦。
二、本地化部署的要求 本地化部署运行虽然很好,但是也有一些基本要求:
需要拥有NVIDIA显卡,GT1060起,显存4G以上。(已经不需要3080起,亲民不少)操作系统需要win10或者win11的系统。电脑内存16G或者以上。最好会魔法上网,否则网络波动,有些网页打不开,有时下载很慢。 我的电脑配置供大家参考,Win11,12代I7,NVIDIA RTX3060 6G,16G。生成一张20step的图大概10-20s(若使用更高性能的电脑,生成速度更快。)
三、使用的项目Stable diffusion WebUI项目 Stable diffusion大家都知道,是当前最多人使用且效果最好的开源AI绘图软件之一。
不过,Stable diffusion项目本地化的部署,是纯代码界面,使用起来对于非程序员没那么友好。
而Stable diffusion WebUI,是基于Stable diffusion 项目的可视化操作项目。
通过可视化的网页操作,更方便调试prompt,及各种参数。
同时也附加了很多功能,比如img2img功能,extra放大图片功能等等。
四、电脑环境配置 4.1 安装Anaconda 这个是用来管理Python版本的,他可以实现Python的多版本切换。安装时按默认的一路next就行。
这里就不再介绍了。
4.2 看版本 打开conda prompt,输入conda -V 弹出版本号即为正确安装:
显示conda版本,那就对了!
4.3 配置库包下载环境,加快网络速度 替换下载库包地址为国内的清华镜像站。
执行下面:
conda config --set show_channel_urls yes 生成.
分享几个实用的C站AI模型平替网站
部分用户可能没有mofa工具访问Civitai ( C站)下载AI模型,所以给大家分享几款国内版AI模型素材库,无障碍访问下载Stable diffusion模型。
1、LiblibAI
访问速度快,作品墙、有提示词参考,无需登录即可下载模型。
地址 : https://www.liblibai.com/#/
2、炼丹阁
访问速度快,有完整参数 + 提示词,需要登录才可下载模型。
地址 : https://www.liandange.com/
3、i-DESAI
访问速度快,作品墙,需登录才可下载模型。
地址:https://www.i-desai.com/#/
4、Hugging Face
程序员风格的界面,内含各种AI工具,超全的模型库,美中不足是没有缩略图、没有作品展示区。
地址 : https://huggingface.co/models
5、Stable Diffusion WebuI
便捷的一键下载方式,模型名字清晰明了,但没有缩略图,本地部署安装之后,有菜单一键下载模型。
GitHub顶目 : https://github.com/AUTOMATIC1111/stable-diffusion-webui
GitHub不解正常访问,可以下载个Wat Toolkit( 原Steam++)。
分享几个实用的C站AI模型平替网站
部分用户可能没有mofa工具访问Civitai ( C站)下载AI模型,所以给大家分享几款国内版AI模型素材库,无障碍访问下载Stable diffusion模型。
1、LiblibAI
访问速度快,作品墙、有提示词参考,无需登录即可下载模型。
2、炼丹阁
访问速度快,有完整参数 + 提示词,需要登录才可下载模型。
3、i-DESAI
访问速度快,作品墙,需登录才可下载模型。
4、Hugging Face
程序员风格的界面,内含各种AI工具,超全的模型库,美中不足是没有缩略图、没有作品展示区。
5、Stable Diffusion WebuI
便捷的一键下载方式,模型名字清晰明了,但没有缩略图,本地部署安装之后,有菜单一键下载模型。