Appium+python自动化(二十三)- 真假美猴王Monkeyrunner与Monkey傻傻的分不清楚(超详解)

news2024/12/25 12:55:28

简介

  看《西游记》第五十七回,说是“六耳猕猴”化作孙悟空的摸样,伤了唐僧,后又和孙悟空大打出手…… 这位假孙悟空,实力不用多说了吧,和真孙悟空一般无二,大战孙悟空,闹到上天入地下海。 在唐僧那:念紧箍咒,两个都喊疼,自然看不出哪个真假; 到天宫:拖塔天王拿照妖镜照,也看不出; 又到观音那:观音也看不出。最后到幽冥处阎罗那,经“谛听”听过之后,“谛听”却说:“我看出来了,却不敢说” 最后还是如来老佛爷道出六耳真身并用金钵盂罩住,才被孙悟空一棍子打死。想必各位小伙伴都看过这以精彩片段。不过据知情人士说真假美猴王存在阴谋,这里有黑幕:说是真的孙悟空被打死了,活下来的是假的。好了废话少说,还是回到今天的主题:真假美猴王Monkeyrunner与Monkey傻傻的分不清楚。

  今天宏哥就带着各位小伙伴和童鞋们再当一回和尚:如来佛祖辨一辨真假美猴王,前边我们已经对monkey做过一些详细的介绍和讲解,今天我们就再来介绍和讲解一下monkeyrunner。看看他们之间的到底是一样还是有区别的。

monkeyrunner简介

1.monkeyrunner工具使用Jython,这是一种使用Java编程语言的Python实现。Jython允许monkeyrunner API与Android框架轻松交互。使用Jython,您可以使用Python语法来访问API的常量,类和方法。MonkeyRunner工具是使用Jython(使用Java编程语言实现的

Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制Android设备app,测试其稳定性并通过截屏可以方便地记录出现的问题。

2.我们来看一下monkeyrunner官网是如何介绍monkeyrunner的:

官网介绍(已翻译成中文)宏哥在这里给小伙伴截取一段翻译,如下:

  monkeyrunner工具提供了一个API,用于编写从Android代码外部控制Android设备或模拟器的程序。使用monkeyrunner,您可以编写一个Python程序,安装Android应用程序或测试包,运行它,向其发送击键,截取其用户界面,并在工作站上存储屏幕截图、

monkeyrunner工具主要用于测试功能/框架级别的应用程序和设备以及运行单元测试套件,但您可以将其用于其他目的。

monkeyrunner工具与UI / Application Exerciser Monkey无关 ,也称为monkey工具。该monkey工具adb直接在设备或仿真器上的shell中运行, 并生成用户和系统事件的伪随机流。相比之下,monkeyrunner工具通过从API发送特定命令和事件来控制工作站中的设备和

仿真器。

3.monkeyrunner即android SDK中自带的工具之一,此工具提供API可按制android设备或模拟器。

4.有兴趣的小伙伴们或者童鞋可以查看一下monkeyrunner官网:monkeyrunner | Android中文API

5.monkeyrunner 路径:Andriod_SDK\tools

MonkeyRunner工具独特功能

1.多设备控制:monkeyrunner API可以跨多个设备或仿真器应用一个或多个测试套件。您可以物理连接所有设备或立即启动所有模拟器(或两者),以编程方式依次连接到每个设备,然后运行一个或多个测试。您还可以以编程方式启动模拟器配置,运行一个或多个测试,然后关闭模拟器。

2.功能测试:monkeyrunner可以对Android应用程序进行自动化的从头到尾的测试。您可以通过击键或触摸事件提供输入值,并将结果视为屏幕截图。

3.回归测试 - monkeyrunner可以通过运行应用程序并将其输出屏幕截图与一组已知正确的屏幕截图进行比较来测试应用程序的稳定性。

4.可扩展的自动化 - 由于monkeyrunner是一个API工具包,您可以开发一个基于Python的模块和程序的整个系统来控制Android设备。除了使用monkeyrunner API本身,您还可以使用标准的Python os和 subprocess 模块来调用Android工具,例如 Android Debug Bridge。

您还可以将自己的类添加到monkeyrunner API中。这在“ 使用插件扩展monkeyrunner ”一节中有更详细的描述 。

Monkeyrunner与Monkey区别

monkeyrunner和money没有什么直接的关系,monkey是在设备直接运行adb shell命令生成随机事件来进行测试的。相比较而言,monkeyrunner则是通过API发送特定的命令和事件来控制设备。

为了支持黑盒自动化测试的场景,Android SDK提供了monkey和monkeyrunner两个测试工具,这两个测试工具除了名字类似外,还都可以向待测应用发送按键等消息,往往容易产生混淆,以下是他俩的不同之处。

Monkey:

Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。

1.monkey运行在设备或者模拟器上边,可以脱离PC运行,其运行时如下图所示。

Monkeyrunner:

Monkeyrunner工具是在工作站上通过API定义的特定命令和事件控制设备或模拟器。

而monkeyrunner运行在PC上,需要通过服务器/客户端的的模式向设备或者模拟器上的android应用发送指令来执行测试,其运行时如下图所示。

2.普遍的做法是将monkey作为一个向待测应用发送随机按键消息的测试工具,验证待测应用在这些随机性的输入面前是否会有闪退或者崩溃。而monkeyrunner则接受一个明确的测试脚本(使用python语言编写的)。

3.虽然monkey也可以根据一个指定的命令脚本发送按键消息,但其不支持条件判断,也不支持读取界面的信息来执行验证操作。而monkeyrunner的测试脚本中有明确 的条件判断等语句,可用来做功能测试。

 总结:

  实际操作中,monkey由于缺少必要的条件判断等命令,难以在功能测试上有所作为,只能作为生成一些随机事件的工具,测试应用程序的健壮程度,待测应用崩溃后可以根据monkey打印的日志,再用monkey创建一个重现步骤,供开发调试。monkey服务器模式更适合用于黑盒测试,不建议用于自动化测试。

  而Monkeyrunner虽然有Python和Java类库的强大支持,但其自身提供的API有限,还得需要插件扩展其功能。

monkeyrunner API

monkeyrunner API包含在包中的三个模块中 com.android.monkeyrunner

1.MonkeyRunner:monkeyrunner程序的一类实用方法。此类提供了将monkeyrunner连接到设备或模拟器的方法。它还提供了为monkeyrunner程序创建UI以及显示内置帮助的方法。

2.MonkeyDevice:表示设备或模拟器。此类提供了安装和卸载软件包,启动Activity以及向应用程序发送键盘或触摸事件的方法。您还可以使用此类来运行测试包。

3.MonkeyImage:表示屏幕捕获图像。此类提供捕获屏幕,将位图图像转换为各种格式,比较两个MonkeyImage对象以及将图像写入文件的方法。

在Python程序中,您可以将每个类作为Python模块进行访问。monkeyrunner工具不会自动导入这些模块。要导入模块,请使用Python from语句:

1 from com.android.monkeyrunner import <module>

<module>您要导入的类名 在哪里。from通过用逗号分隔模块名称,可以在同一语句中导入多个模块。

运行monkeyrunner

您可以从文件中运行monkeyrunner程序,也可以在交互式会话中输入monkeyrunner语句。您可以通过调用SDK目录子目录中的monkeyrunner命令来执行这两项操作tools/。如果提供文件名作为参数,则该monkeyrunner命令将文件的内容作为Python程序运行; 否则,它会启动一个交互式会话。

monkeyrunner命令的语法是

1 monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>

表1解释了标志和参数。

表1. monkeyrunner标志和参数。

参数描述
-plugin <plugin_jar>(可选)指定.jar包含monkeyrunner插件的文件。要了解有关monkeyrunner插件的更多信息,请参阅 使用插件扩展monkeyrunner。要指定多个文件,请多次包含该参数。
<program_filename>如果提供此参数,则该monkeyrunner命令将该文件的内容作为Python程序运行。如果未提供参数,则该命令将启动交互式会话。
<program_options>(可选)<program_file>中程序的标志和参数。
 

运行monkeyrunner

命令语法为:

monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>

方式一:在CMD命令窗口直接运行monkeyrunner

方式二:使用Python编写测试代码文件,在CMD中执行monkeyrunner hongge.py运行

不论使用哪种方式,您都需要调用SDK目录的tools子目录下的monkeyrunner命令。

注意:在运行monkeyrunner之前必须先运行相应的模拟器或连接真机,否则monkeyrunner无法连接到设备

运行模拟器有两种方法:1、通过eclipse中执行模拟器 2、在CMD中通过命令调用模拟器

这里介绍通过命令,在CMD中执行模拟器的方法

emulator -avd test

上面命令中test是指模拟器的名称。

附:这部分前边已经讲解过,在这里就不再赘述)

问题:CMD运行提示monkeyrunner不是内部或外部命令,也不是可运行的程序或批处理文件。

解决:电脑环境变量未配置,将monkeyrunner所在目录配在环境变量里。

变量名:Path

变量值:D:\android\android-sdk-windows\tools;D:\android\android-sdk-windows\platform-tools

实例

实例一:卸载旧的APP,安装新的APP 

*准备

a. 连接安卓夜神模拟器设备

b. 运行CMD,检测是否连接成功

CMD>adb devices

附:(这部分前边已经讲解过,在这里就不再赘述)

问题:CMD运行提示adb不是内部或外部命令,也不是可运行的程序或批处理文件。

解决:电脑环境变量未配置,将adb所在目录配在环境变量里。  

*方式一: 

1.打开CMD,运行monkeyrunner

2.进入monkeyrunner的shell命令交互模式后,逐条输入以下命令

1 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
2 device = MonkeyRunner.waitForConnection()
3 device.removePackage('com.taobao.taobao')
4 device.installPackage('C:\\Users\\DELL\\Desktop\\702757.apk')

(1)输入命令前的夜神模拟器:

(2)输入第三行命令后的夜神模拟器

(3)输入第四行的夜神模拟器

注:每条命令的作用,请见方法二中的注解

实操如图:

c.检查手机app是否已更新 

*方式二:

a. 编写Python测试代码

 1 # File:   Test1.py
 2 # Vision: V1.0
 3 # Author: hongge  QQ群:707699217
 4 # 引入本程序所用到的模块
 5 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
 6 
 7 # 连接手机设备
 8 device = MonkeyRunner.waitForConnection()
 9 
10 # 截图
11 result = device.takeSnapshot()
12 # 将截图保存到文件 
13 result.writeToFile('E:\\JAVA\\monkeyrunner\\Test1\\Test1_001.png','png')
14 
15 # 卸载APP
16 device.removePackage('cn.richinfo.thinkdrive')
17 print ('Uninstall Success!')
18 
19 # 暂停5秒
20 MonkeyRunner.sleep(5)
21 
22 # 截图
23 result = device.takeSnapshot()
24 result.writeToFile('E:\\JAVA\\monkeyrunner\\Test1\\Test1_002.png','png')
25 
26 # 安装新的APP
27 device.installPackage('E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk')
28 print ('Install Success!')
29 
30 # 截图
31 result = device.takeSnapshot()
32 result.writeToFile('E:\\JAVA\\monkeyrunner\\Test1\\Test1_003.png','png')

注:拷贝运行时请去掉中文注释;或者在开头加入 #coding=utf-8 

b.执行Test1.py脚本

Monkeyrunner C:\Users\DELL\Desktop\test.py

实操如图:

c.检查手机app是否已更新

d.查看截图文件夹,截图和上边逐条输入命令,宏哥截得模拟器一模一样的。

e.注意如果截图不一样自己加个等待时间,就会一样,参考代码:

 1 #coding=utf-8 
 2 # File:   Test1.py
 3 
 4 # Vision: V1.0
 5 
 6 # Author: hongge  QQ群:707699217
 7 
 8 # 引入本程序所用到的模块
 9 
10 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
11 
12 
13 
14 # 连接手机设备
15 
16 device = MonkeyRunner.waitForConnection()
17 
18 
19 
20 # 截图
21 
22 result = device.takeSnapshot()
23 
24 # 将截图保存到文件 
25 
26 result.writeToFile('C:\\Users\\DELL\\Desktop\\test\\Test1_001.png','png')
27 
28 
29 
30 # 卸载APP
31 
32 device.removePackage('com.taobao.taobao')
33 
34 print ('Uninstall Success!')
35 
36 
37 
38 # 暂停5秒
39 
40 MonkeyRunner.sleep(5)
41 
42 
43 
44 # 截图
45 
46 result = device.takeSnapshot()
47 
48 result.writeToFile('C:\\Users\\DELL\\Desktop\\test\\Test1_002.png','png')
49 
50 
51 # 暂停5秒
52 
53 MonkeyRunner.sleep(5)
54 
55 
56 # 安装新的APP
57 
58 device.installPackage('C:\\Users\\DELL\\Desktop\\702757.apk')
59 
60 print ('Install Success!')
61 
62 # 暂停5秒
63 
64 MonkeyRunner.sleep(5)
65 
66 # 截图
67 
68 result = device.takeSnapshot()
69 
70 result.writeToFile('C:\\Users\\DELL\\Desktop\\test\\Test1_003.png','png')

monkeyrunner内置帮助

您可以通过运行以下命令为monkeyrunner生成API参考:

1 monkeyrunner help.py <format> <outfile>

论点是:

  • <format>或者是text纯文本的输出或html用于HTML输出。
  • <outfile> 是输出文件的路径限定名称。

使用插件扩展monkeyrunner

您可以使用Java编程语言编写的类扩展monkeyrunner API,并将其构建为一个或多个.jar文件。您可以使用此功能使用您自己的类扩展monkeyrunner API或扩展现有类。您还可以使用此功能初始化monkeyrunner环境。

要为monkeyrunner提供插件,请monkeyrunner使用表1中-plugin <plugin_jar>描述的参数 调用该命令 。

在你的插件代码,你可以导入和扩展的主要monkeyrunner类 MonkeyDeviceMonkeyImageMonkeyRunnercom.android.monkeyrunner(见的monkeyrunner API)。

请注意,插件不允许您访问Android SDK。您无法导入包等com.android.app。这是因为monkeyrunner与框架API级别下的设备或模拟器交互。

插件启动类

.jar插件 的文件可以指定在脚本处理开始之前实例化的类。要指定此类,请将密钥添加 MonkeyRunnerStartupRunner.jar文件的清单中。该值应该是启动时要运行的类的名称。以下代码段显示了如何在ant构建脚本中执行此操作:

1 <jar jarfile="myplugin" basedir="${build.dir}">
2 <manifest>
3 <attribute name="MonkeyRunnerStartupRunner" value="com.myapp.myplugin"/>
4 </manifest>
5 </jar>

要访问monkeyrunner的运行时环境,启动类可以实现 com.google.common.base.Predicate<PythonInterpreter>。例如,此类在默认命名空间中设置一些变量:

 1 package com.android.example;
 2 
 3 import com.google.common.base.Predicate;
 4 import org.python.util.PythonInterpreter;
 5 
 6 public class Main implements Predicate<PythonInterpreter> {
 7     @Override
 8     public boolean apply(PythonInterpreter anInterpreter) {
 9 
10         /*
11         * Examples of creating and initializing variables in the monkeyrunner environment's
12         * namespace. During execution, the monkeyrunner program can refer to the variables "newtest"
13         * and "use_emulator"
14         *
15         */
16         anInterpreter.set("newtest", "enabled");
17         anInterpreter.set("use_emulator", 1);
18 
19         return true;
20     }

monkeyrunner环境搭建

1.安装并配置好jdk环境

2.安装android sdk

3.安装python 

4.monkeyrunner环境变量配置: {Path}\Andriod_SDK\tools

安装结果检测

在docs命令控制台输入命令:monkeyrunner出现如下显示内容则说明安装成功

Tips:退出monkeyrunner命令行模式可以 使用快捷键 ctrl+D退出。

小结

1.在方式二运行monkeyrunner报错(190724 14:33:20.837:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] Script terminated due to an exception)

解决方法,报出该错误是使用的notepad++编码格式问题,notepad++默认编码格式是ansi,我们使用的monkeyrunner脚本格式是utf-8,因此有冲突

修改方法如下

首先,看我们的脚本编码格式是什么,我这里的是utf-8,因此不用再做修改

3.如果编码格式不是utf-8的,就要对它进行修改了,点击格式,选择utf-8,再保存,也可选择无BOM格式的

4.再来运行一下,这次成功了

2.monkeyrunner常用的知识点

#引入程序所用的模块

1 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage 

#引入程序所用的模块,使用别名

1 from com.android.monkeyrunner import MonkeyRunner as mr
2 from com.android.monkeyrunner import MonkeyDevice as md
3 from com.android.monkeyrunner import MonkeyImage as mi
4 #如果给导入的模块起了别名,就必须使用别名,否则会出现错误。
5 #比如连接设备或模拟器,起了以上别名后,命令应该如下:
6 device=mr.waitForConnection()

#连接到设备或模拟器

1 #参数1:超时时间,单位秒,浮点数。默认是无限期地等待。
2 #参数2:串deviceid,指定的设备名称。默认为当前设备(手机优先,比如手机通过USB线连接到PC、其次为模拟器)。
3 #默认连接:
4 device = MonkeyRunner.waitForConnection()
5 #参数连接:
6 device = MonkeyRunner.waitForConnection(1.0,'4df74b8XXXXXXX') 

#向设备或模拟器安装APK 

1 #以下两种方式都是对的
2 device.installPackage('E:/JAVA/monkeyrunner/Test1/ThinkDrive_new.apk')
3 device.installPackage('E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk')
4 #参数可以为绝对路径,也可为相对路径

#卸载设备或模拟器中的APK 

1 #参数为APK包名
2 device.removePackage('cn.richinfo.thinkdrive') 

#启动任意的Activity

1 #device.startActivity(component="包名/启动Activity")
2 #以下两种都OK
3 device.startActivity(component="cn.richinfo.thinkdrive/cn.richinfo.thinkdrive.ui.activities.NavigateActivity")
4 device.startActivity(component="cn.richinfo.thinkdrive/.ui.activities.NavigateActivity")

#手机截图 

1 #获取设备的屏蔽缓冲区,产生了整个显示器的屏蔽捕获。(截图)
2 result=device.takeSnapshot()
3 #返回一个MonkeyImage对象(点阵图包装),我们可以用以下命令将图保存到文件
4 result.writeToFile('E:\\JAVA\\monkeyrunner\\Test1\\Test1_001.png','png')

#暂停 

1 #暂停目前正在运行的程序指定的秒数
2 #MonkeyRunner.sleep(秒数,浮点数) 
3 MonkeyRunner.sleep(5)

#字符串发送到键盘 

1 #device.type('字符串')
2 device.type('hongge')

#唤醒设备屏幕

1 #锁屏后,屏幕关闭,可以用下命令唤醒
2 device.wake()

#重起手机

1 device.reboot()

#模拟滑动

1 #device.drag(X,Y,D,S)
2 #X 开始坐标
3 #Y 结束坐标
4 #D 拖动持续时间(以秒为单位),默认1.0秒
5 #S 插值点时要采取的步骤。默认值是10
6 device.drag((100,1053),(520,1053),0.1,10)

#在指定位置发送触摸事件 

1 #device.touch(x,y,触摸事件类型)
2 #x,y的单位为像素
3 #触摸事件类型,请见下文中Findyou对device.press描述
4 
5 device.touch(520,520,'DOWN_AND_UP')

#发送指定类型指定键码的事件

 1 #device.press(参数1:键码,参数2:触摸事件类型)
 2 #参数1:见android.view.KeyEvent
 3 #参数2,如有TouchPressType()返回的类型-触摸事件类型,有三种。
 4 #1、DOWN 发送一个DOWN事件。指定DOWN事件类型发送到设备,对应的按一个键或触摸屏幕上。
 5 #2、UP 发送一个UP事件。指定UP事件类型发送到设备,对应释放一个键或从屏幕上抬起。
 6 #3、DOWN_AND_UP 发送一个DOWN事件,然后一个UP事件。对应于输入键或点击屏幕。
 7 以上三种事件做为press()参数或touch()参数
 8 
 9 #按下HOME键
10 device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP) 
11 #按下BACK键
12 device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP) 
13 #按下下导航键
14 device.press('KEYCODE_DPAD_DOWN',MonkeyDevice.DOWN_AND_UP) 
15 #按下上导航键
16 device.press('KEYCODE_DPAD_UP',MonkeyDevice.DOWN_AND_UP) 
17 #按下OK键
18 device.press('KEYCODE_DPAD_CENTER',MonkeyDevice.DOWN_AND_UP) 

 3.好了时间也不早了,今天就啰嗦、水到这里吧,哈哈!晚安。好梦!!!

   每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问)或者微信搜索: 北京宏哥  公众号提前解锁更多干货。

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1860027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ai】李沐 动手深度学学v2 环境安装:anaconda3、pycharm、d2

cuda-toolkit cuda_12.5.0_windows_network.exe 官方课程网站 第二版资源下载release版本 pycharm版本 李沐 【动手学深度学习v2 PyTorch版】 课程笔记 CUDA 选择11, 实际下载 12.5.0

扫描电镜工作时镜筒内的一般真空度要求

扫描电镜&#xff08;Scanning Electron Microscope, SEM&#xff09;是一种强大的表面分析工具&#xff0c;它依赖于高度真空的环境来实现高质量的电子成像。在这篇文章中&#xff0c;我们将探讨扫描电镜在工作时所需的一般真空度要求&#xff0c;以及这些要求对成像质量的影响…

【最佳实践】Eslint 配置、使用技巧、代码检查的过程、肝这一篇就够了!

大家好&#xff0c;我是DX3906 目录 Eslint 配置 文件配置 .eslintrc.js 或者eslint.config.mjs 文件 eslintrc 总配置参考文档&#xff0c;按需使用&#xff1a; 在vscode中使用eslint插件 配置.eslintignore 文件 在setting中搜所eslint 代码检查的过程通常如下【面试…

基于java+springboot+vue实现的社团管理系统(文末源码+Lw)270

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

革新校园环境:轻空间打造上海六十中学多功能气膜馆

在现代教育环境中&#xff0c;舒适、环保和多功能的建筑越来越受到重视。上海六十中学多功能气膜馆的建设正如火如荼地进行中&#xff0c;这个项目由轻空间&#xff08;江苏&#xff09;膜科技有限公司全力打造&#xff0c;将为学校师生带来全新的活动体验。 项目进展 自项目启…

Kotlin设计模式:深入解析Facade模式

Kotlin设计模式&#xff1a;深入解析Facade模式 在软件开发中&#xff0c;随着系统复杂度的增加&#xff0c;管理和使用多个相关接口变得越来越困难。这时候&#xff0c;Facade模式&#xff08;外观模式&#xff09;就显得尤为重要。本文将深入探讨Kotlin中的Facade模式&#…

史上最全涵盖在线离线nginx安装手册(含国产信创环境下麒麟V10)

下载安装包略 下载地址&#xff1a;http://nginx.org/download/nginx-版本.tar.gz 配合下载资源食用更佳 https://download.csdn.net/download/ProGram_BlackCat/89480431 安装 tar -zxvf nginx-1.16.1.tar.gz && cd nginx-1.16.1# 创建安装目录(默认路径↓) mkdir /u…

创建App

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Django项目中&#xff0c;推荐使用App来完成不同模块的任务&#xff0c;通过执行如下命令可以启用一个应用程序。 python manage.py startapp app…

读AI新生:破解人机共存密码笔记11智能爆炸

1. 大猩猩问题 1.1. 大约1000万年前&#xff0c;现代大猩猩的祖先创造了进化出现代人类的遗传谱系 1.1.1. 它们的物种基本上没有未来&#xff0c;除了我们屈尊所允许它们拥有的未来 1.1.2. 我们不希望在超级智能机器面前处于类似的地位 1.2. 大猩猩问题就是人类是否能在一个…

LoadBalance 负载均衡

什么是负载均衡 负载均衡(Load Balance&#xff0c;简称 LB),是⾼并发,⾼可⽤系统必不可少的关键组件. 当服务流量增⼤时,通常会采⽤增加机器的⽅式进⾏扩容,负载均衡就是⽤来在多个机器或者其他资源中,按照⼀定的规则合理分配负载. 负载均衡的⼀些实现 服务多机部署时,开发⼈…

有重复字符串的排列组合

题目链接 有重复字符串的排列组合 题目描述 注意点 字符都是英文字母字符串长度在[1, 9]之间 解答思路 本题与无重复字符串的排列组合类似&#xff0c;区别是字符串中有重复字符&#xff0c;所以组合数量不会是固定的n * (n - 1) * (n - 2) * … * 1首先想到的仍然是深度优…

研究发现GPT-4o等较新的多模态AI模型的安全机制有不足之处

在 ChatGPT 和类似的生成式人工智能模型推出后&#xff0c;很多人都在强调安全问题&#xff0c;政府也参与其中&#xff0c;OpenAI 甚至成立了一个超级协调小组&#xff0c;以阻止未来的人工智能失控&#xff0c;但由于对人工智能安全的发展方向存在分歧&#xff0c;该小组于今…

【排序算法】—— 希尔排序

目录 一、希尔排序原理 二、希尔排序的思路 三、希尔排序为什么快 四、如何取增量 五、源码 希尔排序是简单插入排序的一种升级版&#xff0c;它也是用了插入的思想&#xff0c;而插入排序相比冒泡排序和选择排序的效率要高的多&#xff0c;再将它优化为希尔排序后效率跟原…

有哪些好用的骨传导耳机是值得推荐的?五款非常好用的骨传导耳机推荐!

作为一个数码博主&#xff0c;我以前接触过很多种不同型号的骨传导耳机产品&#xff0c;骨传导耳机在传输声音时不直接经过内耳膜和外耳道&#xff0c;而是通过振动骨骼来传导声音&#xff0c;说明我们的耳朵是开放式的状态&#xff0c;时刻耳道保持清爽&#xff0c;可以避免耳…

前端基础——自学习梳理

超文本协议HTML <!DOCTYPE HTML> <html><head><meta charset"utf-8"> <style> /*Css*/.sty1{height:100px;width:100px;background-color: red;margin-top: 10px;float:left;margin-left: 10px;box-shadow: 10px 10px 10px #0000…

uni微信小程序使用lottie

在uni插件市场找到 lottie-uni https://ext.dcloud.net.cn/plugin?id1044按照文档要求安装 HBuilderX 引入 下载或导入示例获取插件 import lottie from /common/lottie-miniprogram.jsindex.vue <template><uni-popupref"popup"type"center"ba…

C++ | Leetcode C++题解之第172题阶乘后的零

题目&#xff1a; 题解&#xff1a; class Solution { public:int trailingZeroes(int n) {int ans 0;while (n) {n / 5;ans n;}return ans;} };

高考填报志愿策略 做好这几个步骤很重要

怎么填报合适的院校&#xff0c;怎么填报合适的专业&#xff0c;有时候比考试的分数还要重要&#xff0c;所谓“7分考&#xff0c;3分报”&#xff0c;要避免高分第就&#xff0c;那就得理清头绪&#xff0c;一起来了解一下高考填报志愿策略吧。 第1步从了解分数的基础上来了解…

MySQL锁、加锁机制(超详细)—— 锁分类、全局锁、共享锁、排他锁;表锁、元数据锁、意向锁;行锁、间隙锁、临键锁;乐观锁、悲观锁

文章目录 一、概述1.1 MySQL锁的由来1.2 锁定义1.3 锁分类 二、共享锁与排他锁2.1 共享锁&#xff08;S锁&#xff09;2.2 排他锁&#xff08;X锁&#xff09;2.3 MySQL锁的释放 三、全局锁3.1 介绍3.2 语法3.3 特点 四、表级锁4.1 介绍4.2 表锁4.3 元数据锁&#xff08;Meta D…

【资料集】软件全过程性资料整理(立项、标书、实施、研发、运维、结项、验收、合同、评审、测试、安全、方案)

资料获取&#xff1a;本文末个人名片直接获取。 在软件建设的过程中&#xff0c;会涉及多个阶段和相应的文档。以下是一个清晰的软件建设全文档列表&#xff0c;涵盖了从项目启动到交付维护的各个阶段&#xff1a; 1. 立项与可行性分析阶段 《项目建议书》&#xff1a;描述项…