预计更新 一、 爬虫技术概述
1.1 什么是爬虫技术
1.2 爬虫技术的应用领域
1.3 爬虫技术的工作原理
二、 网络协议和HTTP协议
2.1 网络协议概述
2.2 HTTP协议介绍
2.3 HTTP请求和响应
三、 Python基础
3.1 Python语言概述
3.2 Python的基本数据类型
3.3 Python的流程控制语句
3.4 Python的函数和模块
3.5 Python的面向对象编程
四、 爬虫工具介绍
4.1 Requests库
4.2 BeautifulSoup库
4.3 Scrapy框架
五、 数据存储和处理
5.1 数据存储格式介绍
5.2 数据库介绍
5.3 数据处理和分析
六、 动态网页爬取
6.1 动态网页概述
6.2 Selenium工具介绍
6.3 PhantomJS工具介绍
七、 反爬虫技术
7.1 反爬虫技术概述
7.2 User-Agent伪装
7.3 IP代理池
八、 数据清洗和预处理
8.1 数据清洗和去重
8.2 数据预处理和分析
九、 分布式爬虫和高并发
项目地址:rany2/edge-tts: Use Microsoft Edge's online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an API key (github.com)
Edge-TTS是由微软推出的文本转语音Python库,通过微软Azure Cognitive Services转化文本为自然语音。适合需要语音功能的开发者,GitHub上超3000星。作为国内付费TTS服务的替代品,Edge-TTS支持40多种语言和300种声音,提供优质的语音输出,满足不同开发需求。
1.安装部署 首先,你需要通过Python包管理工具pip来安装Edge-TTS库。只需在命令行中输入以下命令(没有python环境的自行配置一下):
pip install edge-tts 如果只想使用edge-tts和edge-playback命令,最好使用 pipx:
pipx install edge-tts 安装完成后,你就可以开始使用Edge-TTS来将文本转换为语音了。Edge-TTS支持多种语言和不同的声音选项,你可以根据需要选择合适的声音。
2.文本转语音 我们先来个hello world,只需要一行代码!
edge-tts --text "hello world" --write-media hello.mp3 执行完毕之后,会在你执行的目录下,生成hello.mp3文件
如果你想立即播放带有字幕的内容,可以使用以下edge-playback命令:
edge-playback --text "Hello, world!" 注意以上需要安装mpv命令行播放器。所有命令也都edge-tts可以工作。edge-playback
3.支持的语言和音色 edge-tts支持英语、汉语、日语、韩语、法语等40多种语言,共300多种可选声音,执行以下命令查询:
edge-tts --list-voices 如下图所示:
查询结果中的Gender为声音的性别,Name为声音的名字,如zh-CN-YunjianNeural,其中zh表示语言,CN表示国家或地区,可以根据需求选择不同的声音。
使用--voice参数来指定声音名称,下面我使用zh-CN-YunyangNeural声音来合成一个中文音频。
edge-tts --voice zh-CN-YunyangNeural --text "大家好,欢迎关注语音之家,语音之家是一个助理AI语音开发者的社区。" --write-media hello_in_cn.mp3 4.调整语速、音量和音调 可以对生成的语音进行细微修改。
$ edge-tts --rate=-50% --text "
前言 在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式被广泛应用于前后端交互以及数据存储场景。阿里巴巴开源的fastjson库提供了一个简单易用且高效的JSON处理方式,其中com.alibaba.fastjson.JSON.toJSONString()方法用于将Java对象转换为JSON字符串,本文将详细解读其用法及应用场景。
一、引入依赖 首先,确保你的项目已经引入了Fastjson库,Maven配置如下:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency> 二、JSON.toJSONString()方法详解 JSON.toJSONString()方法的主要功能是将Java对象转换成JSON字符串格式。基本语法如下:
import com.alibaba.fastjson.JSON; // 假设有一个User对象 public class User { private String name; private int age; // 省略getter和setter方法... } // 创建一个User对象实例 User user = new User(); user.setName("Tom"); user.setAge(25); // 使用JSON.toJSONString()方法转换为JSON字符串 String jsonString = JSON.toJSONString(user); 上述代码执行后,jsonString变量将保存如下的JSON字符串:
{ "name": "Tom", "age": 25 } 此方法支持序列化大部分Java类型,包括基础类型、集合、数组、Map以及自定义对象等。
三、高级用法 序列化时排除某些字段
如果不想将对象的某个属性转化为JSON字符串,可以通过@JSONField(serialize=false)注解来标记。
public class User { @JSONField(serialize=false) private String password; // 不序列化密码字段 // 其他字段和方法... } 日期格式化
Linux系统版本MySql版本CentOS Linux release 7.9.20095.7.43 一. 安装准备 1. 官网根据系统版本等信息下载合适的Mysql安装包并上传Linux。 MySQL :: Download MySQL Community Server (Archived Versions)
使用SFTP上传到服务器
2. 确保当前Linux系统上无MySQL或mariaDB数据库。(有些系统会自带) #检查有无Mysql rpm包 rpm -qa|grep mysql #检查有无mariadb rpm包 rpm -qa|grep mariadb #有的话使用以下命令删除 rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 3. 检查依赖库 Mysql需要libaio与net-tools库
#检查是否有依赖库 rpm -qa|grep libaio rpm -qa|grep net-tools 不存在则需要安装
yum -y install libaio net-tools 二. 安装步骤 1. 把mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar文件解压,解压后可见多个rpm包。 tar -xvf mysql-5.7.43-1.el7.x86_64.rpm-bundle.tar 2. 开始安装 #使用rpm命令安装一下四个包 rpm -ivh mysql-community-common-5.7.43-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-5.7.43-1.el7.x86_64.rpm rpm -ivh mysql-community-client-5.7.43-1.el7.x86_64.rpm rpm -ivh mysql-community-server-5.
前言 在小程序的日常迭代中,有一些场景我们可能需要在小程序发布后,用户能够马上感知并更新,比如上线新活动、修复高危漏洞等,如果用户因为各种原因未能及时更新小程序,这就可能导致一些功能无法正常使用或者存在安全隐患,因此,实现小程序的强制更新功能就显得尤为重要。本文将探讨小程序如何做到强制更新,以确保用户始终使用最新、最安全的小程序版本。
小程序的运行机制 在这之前,我们得先来了解一下小程序的生命周期,从启动到销毁它都是如何进行的
生命周期 小程序的启动 广义的小程序启动可以分为两种情况,一种是冷启动,一种是热启动。
从小程序生命周期的角度来看,我们一般讲的「启动」专指冷启动,热启动一般被称为后台切前台。
冷启动:如果用户首次打开,或小程序销毁后被用户再次打开,此时小程序需要重新加载启动,即冷启动。热启动:如果用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时小程序并未被销毁,只是从后台状态进入前台状态,这个过程就是热启动。 前台与后台 前台:小程序的「前台」状态一般指的是小程序处于打开状态,页面正在展示给用户后台:当用户关闭小程序时小程序并没有真正被关闭,而是进入了「后台」状态 切后台的方式包括但不限于以下几种:
点击右上角胶囊按钮离开小程序iOS 从屏幕左侧右滑离开小程序安卓点击返回键离开小程序小程序前台运行时直接把微信切后台(手势或 Home 键)小程序前台运行时直接锁屏 挂起 小程序进入「后台」状态一段时间后(目前是 5 秒),微信会停止小程序 JS 线程的执行,小程序进入「挂起」状态。此时小程序的内存状态会被保留,但开发者代码执行会停止,事件和接口回调会在小程序再次进入「前台」时触发。
当开发者使用了后台音乐播放、后台地理位置等能力时,小程序可以在 「后台」 持续运行,不会进入到 「挂起」 状态
销毁 当小程序进入后台或被挂起时,它并不会一直保留在后台,当满足以下两点时,小程序会被销毁
当小程序进入后台并被「挂起」后,如果很长时间(目前是 30 分钟)都未再次进入前台,小程序会被销毁。当小程序占用系统资源过高,可能会被系统销毁或被微信客户端主动回收。 小程序的更新机制 小程序默认的更新机制可以分为两类:启动时同步更新、启动时异步更新
启动时同步更新 在以下情况下,小程序启动时会同步更新代码包。同步更新会阻塞小程序的启动流程,影响小程序的启动耗时。
定期检查发现版本更新,微信运行时定时检查下载更新,如果有更新,下次小程序启动时会同步进行更新,更新到最新版本后再打开小程序用户长时间未使用小程序,会强制同步更新 启动时异步更新 即使启动前未发现更新,小程序每次冷启动时,都会异步检查是否有更新版本。如果发现有新版本,将会异步下载新版本的代码包。但当次启动仍会使用客户端本地的旧版本代码,即新版本的小程序需要等下一次冷启动才会使用 强制更新 在启动时异步更新的情况下,如果开发者希望立刻进行版本更新,可以使用 wx.getUpdateManagerAPI 进行处理,该API会返回一个UpdateManager实例
UpdateManager 对象为小程序提供了四种关键的方法,用于管理和监控小程序的更新过程。
UpdateManager.applyUpdate():在小程序新版本已经下载完成的情况下(即接收到 onUpdateReady 回调后),此方法用于强制小程序重启并启用新版本。
UpdateManager.onCheckForUpdate(function callback):此方法用于监听向微信后台发起的更新检查结果事件。微信小程序在冷启动时会自动进行更新检查,开发者无需主动触发。
UpdateManager.onUpdateReady(function callback):此方法用于监听小程序的新版本更新就绪事件。一旦新版本可用,客户端会自动触发下载过程(无需开发者额外操作),并在下载成功后调用此回调函数。
UpdateManager.onUpdateFailed(function callback):此方法用于监听小程序更新失败的事件。当小程序有新版本且客户端尝试自动下载更新时(同样无需开发者干预),如果因网络问题或其他原因导致下载失败,将会触发此回调函数。
根据以上API,我们就能够在小程序法版后,通知用户进行强制更新
if (taro.canIUse('getUpdateManager')) { const updateManager = taro.getUpdateManager(); updateManager.onCheckForUpdate(function (res) { console.log('onCheckForUpdate====', res); if (res.hasUpdate) { // 小程序已更新 updateManager.
一、概述 Android studio 的Profiler可用来分析cpu和memory问题,下来进行说明介绍。
二、Android studio CPU调试 从开发模拟器或设备中启动应用程序;
在 Android Studio 中,通过选择View > Tool Windows > Profiler启动分析器。
应用程序启动后,单击 + 分析器中的按钮以查看下拉菜单。选择设备,然后在其他可分析进程下选择应用程序的条目。
选择监测CPU,可以看到线程和CPU占用信息
官网解释:
事件时间线:显示应用程序中在生命周期中不同状态之间转换的活动,并指示用户与设备的交互,包括屏幕旋转事件。有关在运行 Android 7.1(API 级别 25)及更低版本的设备上启用事件时间线的信息,请参阅 启用高级分析。CPU 时间线:显示应用程序的实时 CPU 使用情况(占总可用 CPU 时间的百分比)以及应用程序正在使用的线程总数。时间线还显示其他进程(例如系统进程或其他应用程序)的 CPU 使用情况,因此您可以将其与应用程序的使用情况进行比较。您可以通过沿着时间线的水平轴移动鼠标来检查历史 CPU 使用率数据。线程活动时间线:列出属于您的应用程序进程的每个线程,并使用下面列出的颜色沿着时间线指示其活动。记录跟踪后,您可以从此时间线中选择一个线程,以在跟踪窗格中检查其数据。 绿色:线程处于活动状态或准备好使用 CPU。也就是说,它处于正在运行或可运行状态。黄色:线程处于活动状态,但正在等待 I/O 操作(例如磁盘或网络 I/O),然后才能完成其工作。灰色:线程正在休眠,不消耗任何 CPU 时间。当线程需要访问尚不可用的资源时,有时会发生这种情况。线程要么进入自愿睡眠状态,要么内核将线程置于睡眠状态,直到所需的资源可用。CPU Profiler 还报告 Android Studio 和 Android 平台添加到应用程序进程中的线程的 CPU 使用情况,例如JDWP、 Profile Saver、Studio:VMStats、 Studio:Perfa和Studio:Heartbeat(尽管线程活动时间线中显示的确切名称可能有所不同)。Android Studio 会报告此数据,以便您可以确定线程活动和 CPU 使用率实际上是由应用代码引起的。
三、Android studio Memory调试 选择监测memory:
官网说明:
Java: Memory from objects allocated from Java or Kotlin code.
目录
一.Devin的登场是突破也是导火索
二.Devin的"逆天"能力
1、端到端构建和部署程序
2、自主查找并修复bug
3、训练和微调自己的AI模型
4、修复开源库
5、成熟的生产库也能做贡献
6、学习能力
三.Devin的出现甚至整个AI领域的进步,编程还有未来吗?
1.业内大佬的看法
2.回首当初AI的初衷
3.程序员真的会被AI代替吗
一.Devin的登场是突破也是导火索 2024年3月14日,初创公司Cognition AI宣布世界上第一位AI软件工程师Devin诞生。根据官方给出的案例,Devin可以像人类程序员一样写代码,并修复了意外出现的bug,从而构建和部署了一个可视化的网站。此外,Devin还能完成更加复杂的任务,并且有较强的学习和调整能力。
Cognition AI将一篇文章的链接发给Devin,里面介绍了如何通过ControlNet 等插件,在AI图像里嵌入精准的文本。Devin通过自行阅读和学习知识,迅速输出了带有用户英文名字的电脑壁纸。值得注意的是,Devin远远超过了GPT-4、Claude2等一众前辈。
这无疑是计算机领域的一项重大突破,但也无疑再次激起了程序员对AI的忌惮和自己是否会被代替的担忧
有一个很有意思的玩笑:
有朋友去OpenAi上班了,他告诉我,其实GPT-5已经内测了,真的非常强大,用了以后98%的人类工作将被替代,输入内测编码就可以免费用正版GPT-5,我把key分享给你们:KFC-CRAZY-THURSDAY-VME50
其实这段key翻译过来就是疯狂星期四V我50,但其实大部分人第一反应都不在这个点上,在看到"其实GPT-5已经内测了,真的非常强大,用了以后98%的人类工作将被替代"这句话时,有多少人愣了一下?这无疑有效地从侧面反映出程序员内心深处的忧虑
二.Devin的"逆天"能力 1、端到端构建和部署程序 Devin可以帮我们解决的不只有是代码,还包括与之相关的整个工作流。
比如,当我们需要设计一个网页游戏时,Devin不仅能生成网页,还能直接完成服务端的部署,然后直接发布上线,省去了中间的人工操作。
只需要告诉Devin,我们想做一个个人网站,里面运行一个Devin定制版的生命游戏。
然后Devin表示自己会先搭建网站的基本架构,并询问了有没有更具体的需求。
在明确要求之后,Devin给出了这样一份任务清单:
创建React应用,安装UI模块等依赖
用React和UI模组搭建前端环境
部署服务器并确保其在私有IP下运行
通过CDN向首页添加p5.js库
在React中部署并验证游戏的功能和资源是否正确配置
接着,Devin就会按照自己设计的这个清单开始编写代码,然后部署服务……
△Devin部署后端服务器的过程
最终完成全部工作之后,一个即点即玩的游戏链接就呈现在了我们面前。
2、自主查找并修复bug 不仅能一气呵成完成开发部署,Devin的debug能力也是一流。
开发者给Devin一个GitHub链接,让它先熟悉项目情况,然后一会儿要准备数据进行测试。
接着,Devin就会按部就班地编写测试用的程序并准备好有关数据,然后运行。
结果,在开发者已经发布的完整项目之中,Devin还真的找到了连开发者自己都没有发现的漏洞。
发现漏洞之后,Devin会回溯报错出现的位置及对应的数据,然后分析原因并给出解决方案。
最终经过调试,程序的bug被成功修复,完美通过了测试。
3、训练和微调自己的AI模型 除了这些一般的程序或项目,作为一个全能型AI助手,Devin还有能力帮助人类训练和微调其他AI。
对于一些常见的模型(比如示例中的Llama),用户只需要在promot中提及模型的名称,Devin就直接知道要训练哪个模型。
而在这个示例中,微调的具体方法(QLoRA)是以GitHub链接的形式输入给Devin的。
接到指令后,Devin还是像处理平常的程序一样边规划边执行,所需环境和依赖,还有模型本体,都会自动下载安装。
这些准备都完成之后,微调工作就会有条不紊地进行,而且其中的状态可以实时监控。
4、修复开源库 Devin的能力不仅在于开发者自己本身的项目,开源社区里的,它也能hold住。
比如我们只需要把GitHub项目的issue链接丢给Devin,它就能立即完成所需的所有配置,并自动收集上下文信息,然后开始解决问题。
当然,开源项目的功能请求(feature request)也没问题,和修问题的流程一样,自己搞好配置,收集上下文,然后就开始编码。
5、成熟的生产库也能做贡献 还没完,业已成熟的生产库,Devin也能给咱秀一把。
官方介绍,sympy Python代数系统中有一个对数计算的错误,就被Devin顺利解决:
配置环境、重现bug,自行编码并修复、测试,再次一气呵成。
△就是这个库
6、学习能力 最后,遇到自己不会的技能,Devin可以直接现学,并迅速付诸应用。
把你新刷到的技术文章链接直接丢给Devin:
Hi Devin!我在这个博客文章中(附网址)发现,可以生成带有隐藏文本的图像。文中提到了一个脚本,你能配置好它,然后为我真的生成一些图片吗?
Ps. 就是利用ControlNet来做这件事。
概述 本文主要介绍一种通过修改配置文件来解决新版Edge浏览器右上角不显示Copilot图标的方法,该方法适用于Edge的正式版和Dev版。
经测试,此方法适用于windows、macOS和linux系统下的Edge浏览器。
另外,文章最后还补充了一种通过下载旧版Edge浏览器解决这个问题的方法,以备将来第一种方法失效。
前提 需要科学上网,对节点没有限制。但如果使用规则/分流模式,需要让 *.bing.com 域名的流量走代理
操作系统:Windows10, macOS Catalina, Debian
测试Edge版本:
正式版:120.0.2210.91 (正式版本) (64 位) 和121.0.2277.83 (正式版本) (64 位)
Dev版:122.0.2353.0 (Official build) dev (64-bit)
解决思路 经过逐步排查发现,正式版Edge浏览器会把用户数据保存在下面这个目录:
Windows系统: %APPDATA%\..\Local\Microsoft\Edge\User Data
linux系统: $HOME/.config/microsoft-edge
macOS系统: $HOME/Library/Application Support/Microsoft Edge
而Dev版Edge浏览器会把用户数据保存在下面的目录:
Windows系统: %APPDATA%\..\Local\Microsoft\Edge Dev\User Data
linux系统: $HOME/.config/microsoft-edge-dev
macOS系统: $HOME/Library/Application Support/Microsoft Edge Dev
而决定浏览器右上角Copilot图标显示与否的开关就藏在浏览器用户数据目录下的某个配置文件中,120版本在 Local State 文件,121及以上版本在 Default 文件夹的 Preferences 文件中。
如此,只需要稍微修改一下这个文件就可以了。
具体步骤 1. 彻底关闭Edge浏览器 (1)Windows和Linux系统关闭Edge 需要彻底关闭浏览器,以防有插件让Edge还在后台运行。
点击浏览器右上角三个点,点击下拉列表的 关闭 Microsoft Edge
在Windows系统中,为了确认Edge浏览器已经完全退出,可以在任务管理器的详细信息中查找是否有名为 msedge.exe 的进程,若有则需要手动结束进程,若无说明Edge浏览器已完全退出。
一、需求 在ODPS上我们有如下数据:
idcategory_idattr_idattr_nameattr_value205348100000462最优粘度["0W-40"]205348100000461基础油类型["全合成"]205348100000463级别["BMW Longlife 01"] 我们希望得到的结果如下:
(205348, 10000046, "基础油类型:全合成\n最优粘度:0W-40\n级别:BMW Longlife 01\n")
需求解读:
需要将(id, category_id)作为key,然后将(attr_id, attr_name, attr_value)进行reduce操作,在reduce之后的数据中对attr_id进行排序,再将attr_name和attr_value合并在一起。
二、reduce操作之字符串方式 这个是最简单的方式,大致思路如下:
首先,将(id, category_id)作为key。
然后,将attr_id、attr_name、attr_value合并成一个字符串attr_info:attr_id + "#" + attr_name + "#" + attr_value,然后attr_info再通过"&"进行合并。
示例代码如下:
xx.map{case(id, category_id, attr_id, attr_name, attr_value) => ((id, category_id), attr_id + "#" + attr_name + "#" + attr_value)} .reduceByKey(_ + "&" + _, 100) 然后在接下来的流程中首先split("#")得到不同的attr信息,再通过split("&")得到不同的attr的列信息。这就要求attr_id,attr_name,attr_value中不能包含"#"和"&"字符串。
所以这种方式有缺陷,就是当attr_id,attr_name,attr_value包含了"#"和"&"字符串时需要先replace一下,这样就改变了原数据的值。
三、reduce操作之列表方式 这种方式相对复杂一点,需要对输入数据进行预处理,但是逻辑清晰。
输入数据中(id, category_id)是key保持不变,(item_id, item_name, item_value)是一组tuple。
reduce操作会在同一个partition中,不同的partition之间进行数据合并,这要求数据的输入、输出类型保持不变。
我们的初步想法:将item_id, item_name, item_value分别放到3个列表中,合并时就是列表之间的合并,合并完毕后使用时只需要遍历列表即可。
因为reduce操作的输入、输出类型不能变化,所以先放item_id, item_name, item_value初始化为一个列表,然后再进行列表之间的合并。
示例代码如下:
搭建完kafka,一般都是使用本地来链接虚拟机的,初次链接会出现各种神奇的问题,特此记录一下。
首先,请先对生产者,消费者,topic有一个大概的认识
-----本地的工作 先在本地idea写生产者的代码
package com.example.kafkademo.demos; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Properties; public class ProducerQuickStart { public static void main(String[] args) { // Properties prop=new Properties(); //kafka链接地址 prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.12.130:9092"); //序列化 prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer"); prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer"); //创建对象 KafkaProducer<String,String> producer=new KafkaProducer<String, String>(prop); //发送 /** * topic key value */ ProducerRecord<String,String> kvProducerRecord =new ProducerRecord<String,String>("mytopic","key-001","hello kafka1"); producer.send(kvProducerRecord); //必须关闭 producer.close(); } } 看不懂复制粘贴到gpt
这里可知道,我们对
192.168.12.130:9092 虚拟机kafka的发了一个("mytopic","key-001","hello kafka1"); 向mytopic这个主题发送了一个ello kafka1。 -------本地防火墙的工作 我们要打开本地9092的端口来和虚拟机进行交流
具体教程站内有,有需要请移步,关键词 win防火墙 ,端口
总之
打开9092端口(kafka默认工作在9092)
1、均值化混音算法 不适合商用,声音的损失比较大,不建议用,建议用第二种声音混音
short remix(short pcm1,short pcm2){
int value = pcm1+ pcm2;
return (short)(value/2)
}
2、归一化混音算法 输入数据为48Khz-2-16bit音频数据
方法:为避免发生溢出,使用一个可变的衰减因子对语音进行衰减。这个衰减因子也就代表语音的权重,衰减因子随着音频数据的变化而变化,所以称为自适应加权混音。当溢出时,衰减因子较小,使得溢出的数据在衰减后能够处于临界值以内,而在没有溢出时,又让衰减因子慢慢增大,使数据较为平缓的变化。(PCM音频混合的方法_pcm混音算法-CSDN博客)
//归一化混音 void mix(char **src_data, char *mix_data, int channels, int buffer_size)
{
int const MAX = 32767;
int const MIN = -32768;
double f = 1;
int output;
int i = 0, j = 0;
for (i = 0; i < buffer_size / channels; i++)
{
int temp = 0;
for (j = 0; j < channels; j++)
“Python开发团队认为Python 3.11要比 3.10 快10%~60%。”
引言
Python是目前非常流行的编程语言之一,而Python的最新版本3.11在速度、异常处理、类型注解等方面都有不少改进,因此开发者们对其推出表示欢迎。本文将详细介绍如何在Windows系统上安装Python 3.11。
第一步:下载Python 3.11安装程序
首先,我们需要从官方网站下载Python 3.11的安装程序。由于Python官网是纯英文外网,国内用户下载会有一些不适,这里我们把安装程序放在百度网盘上,地址见文末。
第二步:运行安装程序
下载完成后,找到下载文件并双击运行。在弹出的安装程序界面中,可以选择"Add Python to PATH",这样就可以在命令行中直接使用Python命令。
这时可以点击"Install Now"直接安装,然后可以跳到本教程的第五步。
也可以选择"Customize installation"(自定义安装)选项。
在自定义安装选项界面,我们可以设置Python的安装位置以及其他一些选项。
第三步:选择组件
在选择组件界面,可以选择需要安装的组件。通常情况下,我们会选择所有组件,并确保每个组件都处于选中状态。然后,点击"Next"进行下一步。
第四步:选择安装目录
在“Advaced Options”界面,如无特殊要求可以保持默认,确认“Add Python to environment variables”已经默认选中。
在选择安装目录界面,可以选择Python的安装目录。通常情况下,我们会将Python安装在默认的位置。然后,点击"Install"继续。
第五步:等待安装完成
安装程序将自动将Python 3.11的文件复制到指定的目录,并进行相关的配置。在此过程中,请耐心等待,直到安装完成。
第六步:完成安装
安装程序完成后,会显示一个安装完成的界面。可以选择"Disable path length limit",以避免在将来使用过长的文件路径时出现问题。
然后会弹出“Setup was successful"界面,点击"Close"完成安装。
第七步:验证安装
为了验证Python是否成功安装,可以打开命令提示符或者PowerShell,并输入以下命令:
python --version 如果安装成功,会显示Python的版本号。此时应该显示为"Python 3.11.8"。
以上就是“史上最快 Python版本 Python 3.11 安装教程”的全部内容,希望对你有所帮助。
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考
系统程序文件列表 系统的选题背景和意义 选题背景:
在信息技术迅猛发展的今天,互联网已经成为农产品销售的重要渠道。传统的农产品销售模式受限于地域、时间、信息不对称等因素,往往难以满足现代消费者对于便捷、高效以及个性化购物体验的需求。而农产品销售网站的出现,正是为了解决这一问题。通过构建一个线上平台,农民可以直接将新鲜的农产品展示给全国乃至全球的消费者,而消费者也可以足不出户,便选购到来自各地的优质农产品。这种销售方式不仅拓宽了农产品的市场范围,还提高了交易的效率和透明度,有助于促进农业产业的现代化进程。
意义:
农产品销售网站的建立和发展对于推动农业与互联网深度融合具有重大意义。首先,它能够为农民提供一个更为广阔的销售渠道,帮助他们增加收入,改善生活。其次,网站的存在使得农产品的销售过程更加透明化,消费者可以直观地了解产品来源、生产过程等信息,这有助于提升消费者对农产品的信任度,促进健康消费。再者,随着物流技术的进步,农产品销售网站能够保证农产品的新鲜度和品质,满足消费者对高品质生活的追求。最后,这种新型销售模式还能促进农村电子商务的发展,带动相关产业链的建设,为农村经济的转型升级提供动力,具有深远的社会和经济影响。
以上选题背景和意义内容是根据本选题撰写,非本作品实际的选题背景、意义或功能。各位童鞋可参考用于写开题选题和意义内容切勿直接引用。本成品的实际功能和技术以下列内容为准。
系统部署环境: 数据库:MySQL 5.7: 流行的开源关系型数据库管理系统,用于存储和检索数据。
开发工具
Eclipse: 开源的集成开发环境(IDE),广泛用于Java应用开发。IntelliJ IDEA: 一先进的IDE,用于Java开发,提供了丰富的工具和功能。 运行环境和构建工具
Tomcat 7.0: 开源的Java Servlet容器和Web服务器。JDK 1.8: Java开发工具包,用于开发Java应用程序。Maven 3.3.9: 用于项目构建和依赖管理的工具。 开发技术:
前端技术
HTML: 超文本标记语言,用于创建和设计网页的结构。CSS: 层叠样式表,用于定义网页的布局和样式。JavaScript (JS): 一种脚本语言,用于增加网页的交互性和动态功能。Vue.js: 一种渐进式JavaScript框架,用于构建用户界面和单页应用程序。 后端技术
Java: 广泛使用的编程语言,适用于构建跨平台应用。Spring: 开源的Java平台,提供了全面的编程和配置模型。MyBatis: Java持久层框架,支持定制化SQL、存储过程以及高级映射。Maven: 项目管理和构建自动化工具,用于Java项目。 开发流程: • 在这种开发技术模式下,系统的开发流程主要是前端专注于使用Vue.js构建动态和响应式的用户界面,同时通过Ajax技术与后端进行数据交换,实现了前后端的逻辑分离。后端SSM框架结合了Spring的依赖注入和事务管理、SpringMVC的模型-视图-控制器架构以及MyBatis的数据持久化功能,为后端开发提供全面的支持。在部署阶段,前端编译生成的静态文件(HTML, CSS, JavaScript等)和后端编译的Java代码一同部署在Tomcat服务器上,从而使得整个Web应用能够在服务器上运行并被用户访问。
程序界面: 源码文末获取↓↓↓↓:
随着技术的不断发展,我们现在可以使用稳定扩散技术(Stable Diffusion)来生成同一角色但不同姿势的人脸图片。本文将介绍这一方法的具体步骤,以及如何通过合理的提示语和模型选择来生成出更加真实和多样化的人脸图像。
博客首发地址:用Stable Diffusion生成同角色不同pose的人脸 - 知乎
1.拼模版 首先,我们需要将同一个人的不同姿势的照片按照相应的姿势拼接在一起,形成一个模版。这样可以为后续的生成过程提供参考。
本照片用sd生成
2.获取轮廓 利用拼接好的模版图像,我们可以轻松地获取到人脸的轮廓信息,这对于后续的处理步骤至关重要。
3. 生成监督图 接下来,我们可以利用一些预训练好的模型,如 controlnet 中的 openpose 模型或 depth 模型,来生成对应的 pose 图或深度图。这些监督图将有助于我们更好地控制生成过程。
4.输入提示语生成图片 在生成过程中,我们可以选择使用 pose 图或深度图作为输入,并选择使用 canny 或 Lineart 这样的边缘检测技术。同时,结合合适的提示语,我们可以使用两个 controlnet 模型来生成图像。
5. 效果展示 接下来,让我们来展示一些使用 Stable Diffusion 生成的同角色不同 pose 的人脸图片,以展示其效果。
a girl, long hair, happy
a girl, short hair, happy
a girl, short hair, happy,be wearing glasses,
a girl,short hair, happy,he wore a mask over his mouth,
a girl,short hair, happy,wear sunglasses,
大家好,我是程序员晓晓
Logo,作为品牌的视觉核心,其重要性不言而喻。它不仅是品牌的标识,更是品牌精神和文化的体现。一个成功的Logo能够简洁而有力地传达品牌的信息和特质,使消费者在短时间内就能对品牌产生深刻的印象。
在Logo的设计过程中,极简与象征性是关键要素。极简的设计可以让Logo更易于识别和记忆,而象征性则能让Logo更具深度和内涵,与品牌的核心价值紧密相连。
今天,我将分享如何使用Stable Diffusion来进行Logo设计。
我参考其他示例,整理了个提示词的简单模板仅供参考,根据情况进行适当调整变换:
【提示词模板】
(风格) logo of (logo中要出现的元素),minimal graphic,(背景颜色)background,by (设计师)
下面我们详细解释这个指令的构成及用法:
风格: 填写你想要的Logo的风格,如“flat vector”(平面矢量),3D,minimal line(简约线条), letter “A”(字母风格);
元素: 填写你想要的Logo的主题元素,如“cat”(猫);
背景颜色: 填写你想要的Logo的背景。如on a transparent white (透明白色背景)
设计师: 填写您喜欢的设计师风格,如“Rob Janoff”(苹果Logo设计师)
设计师风格参考:
● Saul Bass —— Vertigo电影海报的设计师
● Massimo Vignelli —— 纽约市地铁地图的设计师
● Rob Janoff —— Apple Logo的设计师
● Sagi Haviv —— 美国网球公开赛和国家地理Logo的设计师
● Ivan Chermayeff —— Chase 和 Pan Am 徽标的设计师
● Steff Geissbuhler —— NBC 和时代华纳有线徽标的设计师
● Yoji Shinkawa —— 合金装备系列设计师
往期文章:
浅谈非内存对抗类和AI自瞄类FPS作弊程序原理及常用反反作弊措施与反作弊应对手段(上)
3. 基于虚拟化技术的KVM-内存外挂 Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM已成为学术界的主流VMM之一。
KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。
在游戏作弊领域,由于各种作弊功能的实现需要依靠获取游戏的内存数据,获取数据的方法大多是外挂作者编写或者购买专门用于绕过反作弊的内存读写驱动,从操作系统的内核态读取数据。但是这样的驱动程序往往受到了反作弊团队的高度重视,反作弊程序从某种方面来说可以是一个专门用于驱动对抗的程序,所以大部分情况下一个编写好的驱动往往才使用了很小一段时间就会被反作弊程序定位,进而封禁。驱动对抗领域反反作弊的成本居高不下,出于减小对抗成本,简化外挂开发流程,追求更加稳定的外挂使用周期,外挂作者将目光放在了KVM虚拟机技术。
简单来说,KVM就是将游戏程序放在一个干净的、专门提供给游戏运行的独立的虚拟机当中。专门用来运行游戏的虚拟机系统经过深度优化定制,完全移除了任何可能被游戏反作弊系统检测到并标记为虚拟机的特征,它与正常的操作系统无疑,并且高度简化的操作系统,使得游戏调用计算机资源更加高效,往往游戏的画面表现、游戏帧率都有极大优化。
当游戏运行在虚拟机上的时候,游戏会正常地将游戏过程中需要的各项数据保存到内存当中,而外挂作者通过读取虚拟机的内存数据加上特定的偏移量,就可以间接地获取到游戏的内存数据。而这种读取的行为在游戏反作弊视角看来是完全“无痕”的,因为外挂是直接读取的虚拟机程序的内存数据,并没有直接读取游戏的数据,在反作弊看来,这只是操作系统正常的调用行为。虚拟机中运行游戏,主机上运行外挂,并且将诸如透视、物品信息等信息绘制在主机的屏幕上,再将虚拟机的游戏画面全屏,从视觉效果上与传统内存外挂的界面别无二致。
KVM技术,相当于将游戏及其反作弊放在了沙箱中运行,与本机的操作系统环境完全隔离,反作弊的各种检测手段在沙箱中便形同虚设,只能通过诸如行为检测等被动检测方法来检测异常行为,但往往外挂程序以及在这一方面做的滴水不漏,高度拟真的鼠标移动轨迹、非直接的敌方目标显示(比如CSGO的声纳外挂)再加上作弊者主观的高超“演技”,使得反作弊的行为检测变得不那么有效。
从代码层面来说,传统的外挂作者只需要想办法定位到虚拟机中游戏内存地址的偏移量,其余的写法直接参考内存外挂的正常写法即可实现KVM内存外挂。
但是KVM技术现如今不仅仅局限于内存外挂作弊,事实证明传统的找色外挂、新兴的AI外挂也可以结合KVM虚拟机技术达到规避反作弊检测的目的。
4. 基于物理外设硬件的DMA外挂 原理部分直接po了百度百科的内容过来。
直接内存访问(DMA,Direct Memory Access)是一些计算机总线架构提供的功能,它能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。
外设与存储器之间以及存储器与存储器之间的数据传输,通常采用程序中断方式、程序查询方式和DMA控制方式。程序中断方式和程序查询方式都需要CPU发出输入/输出(In/Out,I/O)的指令,然后等待I/O设备完成操作之后返回,期间CPU需要等待I/O设备完成操作。DMA在传输存储器和I/O设备的数据时,无须CPU来控制数据的传输,直接通过DMA控制器(direct memory access controller,DMAC)完成外设与存储器之间以及存储器与存储器之间的数据高速传输。 [3]
DMA传输原理
一个完整的DMA传输包括DMA请求、DMA响应、DMA传输和DMA结束4个步骤。DMA传输原理如图1所示,图中I/O设备为源端设备,由I/O设备向目的端设备(存储器)传输数据,其DMA的基本传输过程如下:①CPU对总线控制器进行初始化,制定工作内存空间,读取DMAC中的寄存器信息,了解DMAC的传输状态[1];②I/O设备向DMAC发送DMA请求(DMA request,DREQ),DMAC收到此信号后,向CPU发出总线保持信号(HOLD); ③CPU当前总线周期执行结束后发出总线响应信号保持确认(hold acknowledgment,HLDA); ④DMAC收到总线授权后,向I/O设备发送DMA响应信号DMA确认(DMA acknowledgment,DACK),表示允许I/O设备进行DMA传送;⑤开始传输时,DMAC首先从源地址读取数据并存入内部缓存中,再写入目的地址,完成总线数据从源地址到目的地址的传输[1];⑥DMA传输完成后,DMAC向CPU发出结束信号,释放总线,使CPU重新获得总线控制权。一次DMA传输只需要执行一个DMA周期,相当于一个总线读/写周期,因而能够满足外设数据高速传输的需要。 [3]
DMA是所有现代电脑的重要特色,它允许不同速度的硬件设备来沟通,而不需要依于中央处理器的大量中断负载。否则,中央处理器需要从来源把每一片段的数据复制到寄存器,然后把它们再次写回到新的地方。在这个时间中,中央处理器对于其他的工作来说就无法使用。
DMA传输常使用在将一个内存区从一个设备复制到另外一个。当中央处理器初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存去。像是这样的操作并没有让处理器工作拖延,使其可以被重新调度去处理其他的工作。DMA传输对于高性能嵌入式系统算法和网络是很重要的。 举个例子,个人电脑的ISADMA控制器拥有8个DMA通道,其中的7个通道是可以让计算机的中央处理器所利用。每一个DMA通道有一个16位地址寄存器和一个16位计数寄存器。要初始化数据传输时,设备驱动程序一起设置DMA通道的地址和计数寄存器,以及数据传输的方向,读取或写入。然后指示DMA硬件开始这个传输动作。当传输结束的时候,设备就会以中断的方式通知中央处理器。
"分散-收集"(Scatter-gather)DMA允许在一次单一的DMA处理中传输数据到多个内存区域。相当于把多个简单的DMA要求串在一起。同样,这样做的目的是要减轻中央处理器的多次输出输入中断和数据复制任务。 DRQ意为DMA要求;DACK意为DMA确认。这些符号一般在有DMA功能的电脑系统硬件概要上可以看到。它们表示了介于中央处理器和DMA控制器之间的电子信号传输线路。
为了提高DMA设备的数据拷贝效率,针对DMA原理设计出来了PCIE接口的外置DMA设备,通过专用的芯片及独立的PCIE通道,加上诸如Type-C高速USB接口,使得数据拷贝速度再创新高。DMA设备的设计本意就是为了绕过CPU直接去访问内存数据,用于工业及其余领域中数据采集或者数据同步的作用。
由于FPS领域的游戏外挂,其核心就是对于游戏内存数据的读写,外挂稳定性也与读写行为是否会被反作弊系统检测挂钩,既然DMA可以直接绕过CPU,就可以直接物理绕过操作系统驱动层面的反作弊检测,基于内核编写的检测也失去作用。
DMA作弊往往是与双机技术相结合。DMA在获取到了主机上的游戏内存数据后,将数据同步传输到第二天电脑也就是副机上,副机上运行的外挂程序可以对这些数据进行分析,再将画面绘制输出到副机上,通过视频融合器:一种可以将外挂绘制画面与输入画面混合后输出的专门设备,将画面与主机的游戏画面融合,输出到显示器上。或者通过Kmbox等第三方键鼠设备,模拟鼠标移动控制主机达到自动瞄准等功能。
对于主机来说,既没有直接的内存数据读写,又没有可疑的重叠窗口绘制(内存外挂往往会把诸如人物坐标的框框和物品等信息绘制在一个透明的窗口上,再将窗口叠放在游戏的窗口之上,针对这一绘制行为反作弊有针对性检测),所以早期对于DMA的作弊,反作弊都不能起到有效的检测。
而且从外挂作者的视角来看,拥有了DMA设备之后,就不需要再将精力放在数据读取之上,因为传统的内存外挂作者往往需要费尽心思去寻找反作弊程序的检测代码,利用驱动和汇编知识将检测代码处理,比如直接用汇编语言将部分检测代码直接NOP掉。DMA设备往往会提供封装好的DLL供程序员调用,外挂作者只需要获取游戏的进程ID,再加上特定数据的内存地址和偏移量就可以轻而易举的获取到关键数据来开发外挂功能。
以Apex英雄举例:
int main(){ const char* cl_proc = "cleaner.exe"; const char* ap_proc = "R5Apex.exe"; //const char* ap_proc = "EasyAntiCheat_launcher.exe"; PrintVarsToConsole(); //Client "add" offset uint64_t add_off = 0x5650; std::thread aimbot_thr; std::thread actions_thr; std::thread itemglow_thr; std::thread vars_thr; std::thread recoil_thr; std::thread debug_thr; while(active) { if(apex_mem.
1.NVL函数 1.1 函数语法 -- nvl(value,default_value) - Returns default value if value is null else returns value Example: > SELECT nvl(null,'bla') FROM src LIMIT 1; bla Function class:org.apache.hadoop.hive.ql.udf.generic.GenericUDFNvl Function type:BUILTIN 1.2 函数说明 NVL: 给值为NULL的数据赋值,它的格式是NVL( value,default_value)。
功能:如果value为NULL,则NVL函数返回default_value的值,否则返回value的值
如果两个参数都为NULL ,则返回NULL。
2.COALESCE函数 2.1 函数语法 -- COALESCE(T v1, T v2, ...) - Returns the first v that is not NULL, or NULL if all v's are NULL. Example: > select coalesce(null,null,1,null,3,5,7); 1 2.2 函数说明 COALESCE: Hive SQL 中的一种聚合函数,它可以返回第一个非空值
现在开源大模型一个接一个的,而且各个都说自己的性能非常厉害,但是对于我们这些使用者,用起来就比较尴尬了。因为一个模型一个调用的方式,先得下载模型,下完模型,写加载代码,麻烦得很。
对于程序的规范来说,只要东西一多,我们就需要一个集中管理的平台,如管理python 的pip,管理js库的npm等等,而这种平台是大家争着抢着想实现的,这就有了Ollama。
Ollama Ollama 对于管理开源大模型是认真的,使用起来非常的简单,先看下如何使用:
github地址
linux 下的安装:
curl -fsSL https://ollama.com/install.sh | sh 等进度条跑完,如果不出意外的话,Ollama就已经安装成功了。
用命令试一试,比如我们想用下Dolphin Phi:
ollama run dolphin-phi 提示如下:
pulling manifest pulling 4eca7304a07a... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████▏ 1.6 GB pulling 876a8d805b60... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████▏ 10 KB pulling a47b02e00552... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████▏ 106 B pulling 8b586b146d99... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████▏ 40 B pulling f02dd72bb242... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████▏ 59 B pulling c87a43ded80f... 100% ▕███████████████████████████████████████████████████████████████████████████████████████████████▏ 555 B verifying sha256 digest writing manifest removing any unused layers success >>> 有没有一种使用docker的感觉,Ollama 帮我们把大模型下了,还帮我们做了适配,在提示符下就可以使用了:
备注:文中所指username皆是电脑或服务器到用户名 一 应用商店中搜索Remote-SSH并安装 二 点击远程资源管理器、新建远程
三 在窗口上方弹出的命令框中输入:ssh name@ip,name是你服务器的用户名,如果没有创建用户则填root,ip是你的服务器ip地址
回车后会弹出选择更新配置文件,点击第一个路径,会自动生成一个config文件
四 (重要)重置config,否则后续登录不了 进入cd /Users/username/.ssh/
sudo cp config config.bak sudo rm -rf config cp config.bak config 五 生成密钥 ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa_mac 一路回车。
六 添加公钥到服务器 copy刚刚生成的公钥 cat /Users/username/.ssh/id_rsa_mac.pub进入服务器vim /home/username/.ssh/authorized_keys黏贴进去,记得保存 七 添加私钥到本地 进入四中的config
vim /Users/username/.ssh/config Host 192.168.X.X#(刚刚输入的远程ip地址) HostName 192.168.X.X#(刚刚输入的远程ip地址) Port 22#(刚刚输入的远程ip端口) User root#(刚刚输入的远程服务器用户名) #只需增加下面这一句话 IdentityFile /Users/username/.ssh/id_rsa_mac 八 初次登陆如出现长时间等待,退出vscode重新打开即可 我登陆的时候出现了设置 SSH 主机 正在初始化 VS Code 服务器 OpenSSH_9.0p1, LibreSSL 3.
1.mac本地设置一个定时任务每小时执行一次,在/Users/xxx/go/src/runing目录下执行命令:./git_push.sh
在macOS中,你可以使用crontab来设置定时任务。打开终端并执行以下步骤:
1.打开当前用户的crontab编辑器:
crontab -e
2.如果是第一次编辑,可能会提示选择编辑器,选择你喜欢的编辑器或者使用默认编辑器。
在编辑器中添加以下行:
0 * * * * cd /Users/xxx/go/src/runing && ./xxxx.sh
这将在每小时的第0分钟执行指定的命令,即每小时执行一次。
3.保存并退出编辑器。在大多数编辑器中,你可能需要按下特定组合键,例如在vim中,按下Esc键,然后输入":wq"(不带引号),然后按Enter键。
4.这样就设置好了每小时执行一次命令"./xxx.sh"的定时任务