-
安卓/鸿蒙模拟位置信息-Fake Location模拟虚拟定位打卡
一、软件下载安装 需要用到的软件就一个即:FakeLocation虚拟打卡定位 下载地址:FakeLocation虚拟打卡定位.app 二、手机端设置 打开手机设置-关于手机-版本信息-版本号,连续点击版本号直到出现已进入开发者模式字样,此时打开手机设置的搜索框,搜索开发者模式-开发者选项-位置-选择模拟位置信息应用(FakeLocation虚拟打卡定位)此时手机设置端操作完成。 注意:不同手机系统名称会有略微差别,但是大差不差。(测试手机一加12,ColorOS15.0系统,目前支持安卓/鸿蒙生态) 图示操作如下: 三、软件端设置 打开安装好的软件,依据软件提示打开相应的权限-根据自己手机是否root选择运行模式ROOT/NOROOT(某些功能上会有影响,但不影响使用)-点击+号-添加自己想要模拟的位置-选择位置启动模拟,设置操作完成。 图示操作如下: 四、应用实操 选择自己需要应用到模拟定位的软件/系统(如:钉钉/OA/其他,不一定都能使用,小编这里泛微OA系统可用且在NOROOT的环境下) 注意:如果定位失败,可以试着重新启动模拟紧随着重新打开需要模拟定位的软件即可 五:结语 看到这里,相信大家已经能自己动手操作整个过程,如果需要测试的定位,提示不在范围内,需要在选取的点位附近仔细寻找,这个软件虚拟定位范围只有50米,部分场景NOroot模式不行,大家可以试着来,方法就是这样,不用的时候可以关闭模拟,以免影响正常使用手机。 ———————————————— 版权声明:本文为CSDN博主「零域编程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/NiUNiUSHENTAO/article/details/144613199
SE_Wang 2025-12-12
115 0 0 -
GET与POST深度解析:区别、适用场景与dataType选型指南
在前后端交互开发中,GET和POST是最基础也最常用的HTTP请求方法。但很多新手开发者容易陷入“GET传参短、POST传参长”的浅层认知,忽略了二者在设计初衷、安全性、幂等性等核心维度的本质差异,进而在场景选型、dataType匹配等关键环节频繁踩坑。今天这篇文章,将从“底层区别-场景适配-dataType选型”三个核心维度层层拆解,结合真实开发案例给出具体指引,帮你彻底掌握GET与POST的正确用法,避开所有高频陷阱。 一、不止于“传参位置”:GET与POST的6大核心区别 很多人误以为GET和POST的唯一区别是参数是否显示在URL中,这是对HTTP协议的片面理解。二者的差异贯穿请求全过程,直接决定了适用场景的边界,具体可从以下6个关键维度清晰对比: 对比维度 GET请求 POST请求 核心语义 从服务器读取资源,属于“查询操作”,不改变服务器状态 向服务器提交资源,属于“写操作”,通常会改变服务器状态(如新增/修改数据) 参数传递 参数拼接在URL末尾,格式为 URL?key1=value1&key2=value2,肉眼可见 参数封装在请求体(Request Body)中,URL不可见,需通过抓包工具查看 长度限制 受浏览器和服务器双重限制(通常2KB-8KB),超过会被直接截断,导致参数传递失败 HTTP协议本身无限制,实际取决于服务器配置(如Nginx的client_max_body_size、Tomcat的maxPostSize),可承载MB级甚至GB级数据(如文件上传) 安全性 低风险:参数明文暴露在URL、浏览器历史记录、代理日志中,绝对禁止传递密码、身份证号等敏感信息 相对安全:参数隐藏在请求体,需专业抓包工具(如Charles、Fiddler)才能捕获;配合HTTPS加密后,可实现传输层安全,适合敏感数据传递 幂等性 严格幂等:多次执行相同请求,结果完全一致,不会对服务器数据产生任何副作用(如多次查询同一用户信息) 非幂等:多次执行可能产生不同结果,存在副作用(如重复提交……
SE_Wang 2025-12-11
52 0 0 -
Linux中的alarm函数详解:定时器信号处理指南
1. alarm函数简介 alarm()是Linux/Unix系统提供的一个简单定时器函数,它可以让进程在指定的时间后接收一个SIGALRM信号。这个函数属于POSIX标准的一部分,定义在<unistd.h>头文件中。 函数原型: unsigned int alarm(unsigned int seconds); 2. 工作原理 当调用alarm(seconds)时: 系统会为调用进程设置一个定时器 经过seconds秒后,内核会向进程发送SIGALRM信号 如果seconds为0,则取消任何先前设置的尚未触发的闹钟 每次调用alarm()都会覆盖之前设置的闹钟 函数返回先前设置的闹钟剩余时间(秒),如果没有设置则返回0 3. 基本使用示例 #include <unistd.h> #include <signal.h> #include <stdio.h> void alarm_handler(int signo) { printf("Received alarm signal!\n"); } int main() { signal(SIGALRM, alarm_handler); // 注册信号处理函数 printf("Setting alarm for 5 seconds...\n"); alarm(5); // 设置5秒后触发 pause(); // 暂停进程直到收到信号 return 0; } 4. 高级特性 4.1 取消闹钟 可以通过调用alarm(0)来取消先前设置的闹钟: unsigned int remaining = alarm(0); // 取消闹钟并获取剩余时间 printf("Remaining time: %u seconds\n", remaining); 4.2 精确控制 alarm()的精度是秒级,如果需要更高精度的定时器,可以考虑: setitimer():提供微秒级精度 timer_create()系列函数:更现代的POSIX定时器API select()/poll()/epoll()的超时机制 4.3 与其他信号交互 需要注意SIGALRM与其他信号的交互,特别是当信号处理函数执行时间较长时: void alarm_handler(int signo) { // 长时间操作... // 在此期间其他信号可能被阻塞 } 5. 实际应用场景 5.1 超时控制 void timeout_operation() { alarm(10); // 设置10秒超时 // 执行可能长时间运行的操作 alarm(0); // 操作完成,……
SE_Wang 2025-12-10
7 0 0 -
《Linux 信号入门:搞懂 “进程通信的紧急电话” 到底怎么用(初篇)》
【一】信号初识 (1)什么是“信号” “信号”是什么? “信号”用来给某个进程直接传达的命令,因此“信号”的发出对象为操作系统 那么每个进程都应该知道信号实行的方法。按照理论:被接收“信号”的受体可以选择: “默认执行”:直接按照信号的实现方法默认执行 “不执行”:选择无视信号 “自定义执行”:不顾具体的信号实行方法,自己按自己的方法实行 (2)“信号”查看 可以执行下面的命令查看所有的信号:可明显发现数字序号和对应的大写字符串其实是宏实现的 kill -l 其中:1~31号信号为普通信号,34~64号信号为实时信号(暂时不了解) (“Ctrl+C”在我们进程死循环时可以强制退出,它对应的实现是 2号信号) 在Linux中,会存在前台进程和后台进程: 前台进程:直接展现给用户的(默认打开的是 bash 进程),每次登录只能允许一个前台进程存在 后台进程:隐藏起来执行的进程 (3)补充:数据从键盘到显示器 我们知道操作系统和硬件之间夹着“驱动程序”,键盘输入时对应的“驱动程序”会发生“中断请求”给CPU,CPU接到请求知道了有数据需要从“键盘”读取,它会让操作系统拿数据到对应“缓冲区”,待操作系统有时间处理(感觉就是进入运行队列!)就会刷新到“显示器文件”,“显示器”拿到了数据 【二】发送信号 在学习发生信号的方式之前,我们需要先看一下另一个接口:signal() (注意:9号信号“强制终止”和19号信号“强制暂停”是无法被替换执行方法的) #include <signal.h> // 信号处理函数类型定义(参数为信号编号) typedef void (*sighandler_t)(int); // 注册信号处理函数 sighandler_t signal(int signum, sighandler_t handler); 参数: 第一个参数:信号 第二个参数:函数指针(用来自定义一个函数作为参数) 作用:执行该接口后,该信号默认执行方法失效,捕捉该信号执行自定义执行方法(即该函数) 当捕捉到 2 ……
SE_Wang 2025-12-09
10 0 0 -
【Linux】进程信号(一)信号原理、产生方式、调试技巧
信号快速认识 1、在现实世界中有各种各样的信号,如红绿灯,上下课铃声,当没有信号的时侯我们也能识别并处理这些信号,是因为我们以前见过,所以记住了信号的特征的信号的处理方法。 2、信号是异步产生的,并用于信息事件的通知。 3、信号到来的时候,我们可能正在做更重要的事情,所以信号的处理过程,可能不是立即进行的,而是在之后合适的时间处理,所以这就需要我们先把这个信号保存下来。 4、进程处理信号有三种行为: 默认动作 忽略信号 自定义捕捉 部分linux信号介绍(signal) 1、信号名本质就是宏,宏值就是对应信号的编号。 2、信号一共有62个,没有33、34。 3、1-31为普通信号,34-64为实时信号,我们只研究普通信号,实时信号常用于实时场景,实时操作系统用的更多。 4、man 7 signal 指令查看信号详细说明,如下所示(大部分信号的默认处理动作都是终止进程,如Core、Term): 5、系统调用signal可以用来更改进程收到信号后的默认行为(只用修改一次,后续该进程收到修改过默认行为的信号后都会执行自定义行为): 我们以ctrl+c为例,它会像当前进程发送2号信号SIG_INT,示例如下: #include <iostream> #include <sys/types.h> #include <unistd.h> #include <signal.h> void myhandler(int x) { std::cout << "当前进程:" << getpid() << "捕获到了一个信号:" << x << std::endl; } int main() { // signal(SIGINT, SIG_IGN); // signal(SIGINT, SIG_DFL); signal(SIGINT, myhandler); while (true) { std::cout << "我是一个进程,pid:" << getpid() << std::endl; sleep(1); } return 0; } 除了将默认行为改为我们自己实现的方法,也可以用系统提供的宏,如SIG_IGN(表示进程收到特定信号后……
SE_Wang 2025-12-08
7 0 0 -
Linux《Socket编程UDP》
1.Socket通信接口 在使用UDP来实现服务器和客户端之间的通信之前,先来详细的了解bind等Socket套接字当中提供的通信接口。 创建socket套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); 参数: domin:协议族 常见的有:AF_INET:IPv4 AF_INET6:IPv6 AF_UNIN:本地通信 type:套接字类型 常见的有:SOCK_STREAM:有连接的TCP SOCK_DGRAM:无连接UDP protocol:指定协议,正常填0即可,系统会自动选择合适的协议 返回值:成功返回套接字的文件描述符,失败返回-1 进行套接字的创建之后就需要使用到bind来进行ip和端口号的绑定 绑定端口 #include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 参数: sockfd:套接字文件描述符,即socket的返回值 addr:一个addr结构体的指针,在该结构体当中存储对应的ip和端口 addrlen:addr结构体大小 返回值: 当绑定成功时返回0,否则返回-1 通过以上就可以看出使用bind来进行绑定的,其中函数的参数包括之前使用socket创建出来的套接字文件描述符,除此之外还需要传入一个sockaddr的结构体指针。 在此我时需要使用UDP来进行客户端和服务器之间的连接通信,那么就是进行网络通信,那么在此就需要传一个sockaddr_in的结构体,并且在传入的时候要强制类型转换为sockaddr。 通过之前的学习我们知道sockaddr_in内有以下的成员变量: struct sockaddr_in { sa_family_t sin_family; // 地址族:AF_INET(IPv4) in_port_t sin_port; // 端口号(网络字节序) struct in_addr sin_addr; // IP地址 unsigned char s……
SE_Wang 2025-12-05
16 0 0 -
零基础学AI大模型之Milvus部署架构选型+Linux实战:Docker一键部署+WebUI使用
零基础学AI大模型之Milvus部署架构选型+Linux实战:Docker一键部署+WebUI使用 上一篇我们吃透了Milvus的“分区-分⽚-段”核心结构,知道了它如何高效组织海量数据。但理论再好,落地才是关键——到底该选哪种部署方式?Linux服务器上怎么快速部署?部署后怎么验证是否成功?今天就来解决这些“落地问题”,从部署架构选型到Linux Docker实战,再到WebUI使用,一步步带你搞定Milvus部署,新手也能跟着做! 一、部署架构选型:按项目阶段选对方案 Milvus提供多种部署选项,核心是“按需选择”——不同项目规模、不同阶段,对应不同部署方式,不用盲目追求复杂架构。 1. 三大核心部署方案对比 部署方案 适用场景 支持数据量 核心优势 限制 Milvus Lite 快速原型开发、Jupyter Notebook测试、边缘设备 最多几百万向量 轻量(Python库)、无需复杂部署、一键启动 不支持Windows系统、无高可用 Milvus Standalone(单机版) 个人学习、小团队测试、中型项目(非核心业务) 最高1亿向量 Docker一键部署、组件集成、支持主从复制高可用 横向扩展能力有限 Milvus Distributed(分布式版) 企业级生产、核心业务、大规模数据 1亿-千亿向量 云原生架构、水平扩展、冗余备份、高性能 部署复杂、需K8S集群、运维成本高 2. 额外选择:云服务版(懒人首选) 如果不想自己搭建和运维,直接选择云厂商提供的Milvus服务(如阿里云Milvus),开箱即用,支持弹性扩容,适合企业快速落地。 官方链接:阿里云Milvus文档 3. 选型建议 新手/学习者:优先选Milvus Standalone,部署简单,能覆盖大部分学习和测试场景; 原型开发:用Milvus Lite,直接集成到Python代码,快速验证想法; 生产环境:数据量1亿以下且预算有限,用Standalone+主从复制;数据量超1亿或核心业务,用Distributed(K8S部署)或云服务。 二、Milvus分层架构:看懂部署……
SE_Wang 2025-12-04
41 0 0 -
【Linux】信号机制详解:进程间通信的核心
1. 信号机制概述 信号是Linux内核提供的一种软件中断机制,用于通知进程某个特定事件已经发生。与管道、消息队列等IPC机制不同,信号是异步的——进程无需等待信号到达,可以继续执行其他任务,当信号到达时才会被中断处理。 1.1 信号的本质 信号可以理解为进程级别的"中断",它打断进程的正常执行流程,转而执行预定义的信号处理函数。处理完成后,进程可以选择恢复执行或终止。 1.2 信号的来源 信号可以来自多个来源: 硬件异常:如除零错误、非法内存访问(SIGSEGV) 用户操作:如按下Ctrl+C(SIGINT)、Ctrl+Z(SIGTSTP) 系统调用:如kill()、raise()、alarm()等 内核事件:如子进程终止(SIGCHLD)、管道破裂(SIGPIPE) 2. 信号的分类与常见信号 Linux系统定义了多达64种信号,可分为两大类: 2.1 标准信号(1-31号) 这些是传统UNIX信号,也称为不可靠信号。常见信号包括: 信号名 编号 默认动作 含义 SIGHUP 1 终止 终端挂起或控制进程终止 SIGINT 2 终止 键盘中断(Ctrl+C) SIGQUIT 3 终止+core 键盘退出(Ctrl+\) SIGKILL 9 终止 强制终止(不可捕获) SIGSEGV 11 终止+core 段错误(非法内存访问) SIGTERM 15 终止 终止信号(可捕获) SIGCHLD 17 忽略 子进程状态改变 SIGSTOP 19 停止 停止进程(不可捕获) 2.2 实时信号(34-64号) 实时信号是POSIX标准引入的可靠信号,支持排队、携带数据,且按发送顺序递送。信号范围为SIGRTMIN到SIGRTMAX。 3. 信号的生命周期 信号从产生到处理经历以下阶段: 3.1 信号的产生(Generation) 当事件发生时,内核为目标进程生成信号,并将该信号添加到进程的未决信号集(Pending Signal Set)中。 3.2 信号的递达(Delivery) 当进程从内核态返回用户态时,内核检查未决信号集。如果存在未被阻塞的信号,则执行相应的处理动作。 3.3 信号的阻塞(Blocking) 进……
SE_Wang 2025-12-03
22 0 0 -
HarmonyOS preview 预览文件 Kit 的入门讲解(配套后端代码)
HarmonyOS preview 预览文件 Kit 的入门讲解(配套后端代码) 本文以实际工程为例,快速上手 HarmonyOS 元服务 的文件预览能力(PreviewKit),并配套一个后端用于提供示例文件。示例工程路径: 客户端(HarmonyOS 端):client 后端(Node.js):server 为了方便演示功能,需要先将一些可以预览的文件下载到元服务的沙箱内,是基于这个原因我们才需要引入后端来模拟这个下载的环境,所以元服务内需要先实现下载文件,存储到沙箱,然后再使用预览API filePreview.openPreview预览沙箱内的文件。 1. 工程结构与目标 client/entry/src/main/ets/pages/Index.ets:演示并发下载 4 个文件(1.pdf、1.png、2.png、3.png)并一次性预览。 server/index.js 与 server/public/:提供静态文件下载接口 /file/:filename。 目标: 点击“下载”按钮,并发下载上述 4 个文件到应用沙箱目录。 下载成功后点击“预览”,一次性打开最多 4 个文件的预览窗口。 2. PreviewKit 的核心:filePreview.openPreview HarmonyOS 提供了预览能力包 @kit.PreviewKit。在 ETS 代码中引入: import { filePreview } from '@kit.PreviewKit'; import { fileUri } from '@kit.CoreFileKit'; 核心调用是: // 先准备多个文件的预览信息 const prewList: filePreview.PreviewInfo[] = [] for (let i = 0; i < count; i++) { const item = this.lastDownloadedList[i]; const fileInfo: filePreview.PreviewInfo = { title: item.name, // 预览标题 uri: fileUri.getUriFromPath(item.path), // 将沙箱路径转成 Uri mimeType: item.mime || 'application/octet-stream', // MIME 类型 }; prewList.push(fileInfo) } // 一次性打开多个预览窗口 filePreview.openPreview(uiContext, prewList) .then(() => { // 打开成功 }) .catch((err: Busine……
SE_Wang 2025-12-02
20 0 0 -
【Linux篇】信号从哪来?到哪去?—— Linux信号的产生方式与保存机制
一. 认识信号 首先我们应该知道信号和信号量之间没有任何关系。 生活中的信号比如说:闹钟,红绿灯,上课铃声,狼烟,电话铃声,肚子叫,脸色等。 闹钟响了我们就得起床,上课铃声响了我们就得进教室进行上课,狼烟起来了士兵们就知道要打仗了,电话铃声响了我们就知道来电话了,肚子叫我们就知道我们的肚子饿了,一个人的脸色不好,我们就能直到他可能生气了。 什么是信号?中断我们人正在做的事情,是一种事件的异步通知机制 其实进程就相当于我们的人,当进程收到信号时,进程就要中断进程正在做的事情,这种方式就叫做信号,所以信号是给进程发送的,用来进行事件异步通知的机制 信号的产生相对于进程的运行是异步的 信号是发给进程的 基本结论: 信号处理在信号没有产生时就知道该如何处理了 信号的处理不是立即处理,可以等一会再处理,在合适的时候进行处理 人能识别信号前提是被“教育”过的(红灯亮了要等一等),进程也是如此,OS程序员设计的进程,进程早已经内置的对于信号的识别和处理方式! 信号源是非常多的,给进程产生信号的信号源也非常多 二. 产生信号的方式 2.1 键盘产生信号 我们先编写一段代码testSig.cc #include <iostream> #include <unistd.h> int main() { while(true) { std::cout << "Hello world" << std::endl; sleep(1); } return 0; } 当这段代码运行起来后我么想终止,我们可以使用ctrl + c,但为什么ctrl + c可以终止呢? 因为ctrl + c是给目标进程发送信号的。相当一部分信号的处理动作就是让进程自己终止。 查看linux中的信号列表 指令:kill -l 在我们计算机中,信号就是一个整数的数字,我们未来想要用进程的话,可以用该数字向目标进程发送信号,但是数字的可读性不是很好,未来我们在使用的时候,会……
SE_Wang 2025-12-01
15 0 0
