【Unity功能集】TextureShop纹理工坊(三)图层(下)
项目源码:在终章发布
索引
- 图层
- 渲染绘画区域
- 图层Shader
- 编辑器
- 编辑模式
- 新建图层
- 设置当前图层
- 上、下移动图层
- 删除图层
- 图层快照
图层
在PS
中,图层
的概念贯穿始终(了解PS图层),他可以称作PS
最基础也是最强大的特性之一。
那么,在TextureShop
中,我们的第一个任务也即是设计并完成图层
的功能。
渲染绘画区域
接上篇,为了实现渲染绘画区域
的逻辑,我们添加一个控制变量:
/// <summary>/// 图层/// </summary>public sealed class TextureLayer{//图层是否为脏的,将触发重新生成渲染源private bool _isTextureDirty = false;}
然后,在帧轮询方法OnUpdate
中,检测并重新生成渲染源:
/// <summary>/// 图层/// </summary>public sealed class TextureLayer{/// <summary>/// 图层更新/// </summary>public void OnUpdate(){//当图层改变时(被标记为脏的)if (_isTextureDirty){_isTextureDirty = false;for (int x = 0; x < _texture.width; x++){for (int y = 0; y < _texture.height; y++){//通过偏移值(锚点),从绘画板中提取颜色,填充到_texture(渲染源)中Color bColor = _plate.GetColor(x + Offset.x, y + Offset.y);_texture.SetPixel(x, y, bColor);}}_texture.Apply();}}}
_isTextureDirty
变量的控制至关重要,它使得即便在同一帧多次改变了图层数据,也仅仅只会进行一次生成渲染源
,而不是图层每改变一次便触发一次生成渲染源
,那将带来极大的性能开销。
图层Shader
再者是图层持有的Shader TextureLayer.shader
,在TextureLayer
类的构造方法中,他已将渲染源
设置给了Shader:
_material.SetTexture("_PaintTex", _texture);
那么在TextureLayer.shader
中将是我们自行编写的渲染逻辑,只不过此时我们没有额外的处理,直接原封不动的输出了渲染源
中的颜色:
Shader "Hidden/TextureShop/TextureLayer"
{Properties{[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}[HideInInspector] _PaintTex("图层纹理", 2D) = "white" {}}SubShader{Tags{"Queue" = "Transparent""IgnoreProjector" = "True""RenderType" = "Transparent""PreviewType" = "Plane""CanUseSpriteAtlas" = "True"}Cull OffLighting OffZWrite OffZTest[unity_GUIZTestMode]Blend SrcAlpha OneMinusSrcAlphaPass{Name "Default"CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#include "UnityCG.cginc"#include "UnityUI.cginc"struct VertData{float4 vertex : POSITION;fixed4 color : COLOR;float2 texcoord : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct FragData{float4 vertex : SV_POSITION;fixed4 color : COLOR;float2 texcoord : TEXCOORD0;float4 worldPosition : TEXCOORD1;UNITY_VERTEX_OUTPUT_STEREO};sampler2D _PaintTex;FragData vert(VertData IN){FragData OUT;UNITY_SETUP_INSTANCE_ID(IN);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);OUT.worldPosition = IN.vertex;OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);OUT.texcoord = IN.texcoord;OUT.color = IN.color;return OUT;}fixed4 frag(FragData IN) : SV_Target{//原封不动输出颜色half4 color = tex2D(_PaintTex, IN.texcoord);return color;}ENDCG}}
}
编辑器
我们需要定义一个最顶层的控制器类,也将作为我们整个程序的入口,TextureShop
的编辑器:
/// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{}
回顾图层的尺寸等参数,所有的图层应当拥有一样的尺寸大小
,所以将他们加入到编辑器中,以公开到外部设置:
/// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 绘画区域宽度/// </summary>public int PaintAreaWidth = 512;/// <summary>/// 绘画区域高度/// </summary>public int PaintAreaHeight = 512;/// <summary>/// 绘画板宽度/// </summary>public int PlateWidth = 2048;/// <summary>/// 绘画板高度/// </summary>public int PlateHeight = 2048;}
编辑模式
编辑模式
目前暂定为如下几种:
编辑模式 | 描述 |
---|---|
无 | 不可进行任何编辑操作 |
移动 | 选中选区时,移动选区内容,否则移动绘画板内容 |
选取 | 以矩形方式选择选区 |
套索 | 以套索方式选择选区 |
魔术棒 | 以魔术棒方式选择选区 |
修剪 | 进行高自由度修剪选区 |
仿制图章 | 按住Alt锚定一片区域,然后在其他地方可复制该区域 |
画笔 | 使用鼠标进行绘画 |
橡皮擦 | 使用鼠标进行擦除 |
/// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 编辑模式/// </summary>[SerializeField] private EditMode _mode = EditMode.None;}/// <summary>/// 编辑模式/// </summary>public enum EditMode{/// <summary>/// 无/// </summary>None,/// <summary>/// 移动/// </summary>Move,/// <summary>/// 选取/// </summary>Choose,/// <summary>/// 套索/// </summary>Noose,/// <summary>/// 魔术棒/// </summary>MagicWand,/// <summary>/// 修剪/// </summary>Trim,/// <summary>/// 仿制图章/// </summary>CloneStamp,/// <summary>/// 画笔/// </summary>Paint,/// <summary>/// 擦除/// </summary>Erase}
新建图层
新建图层
时,传入尺寸、图像数据等参数(如果传入了图像,将该图像颜色数据载入新建的图层中,否则新建一个空图层):
/// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{//图层渲染器放置的根节点private RectTransform _textureLayerRoot;/// <summary>/// 所有的图层/// </summary>public List<TextureLayer> TextureLayers { get; private set; } = new List<TextureLayer>();/// <summary>/// 新建一个图层/// </summary>/// <param name="layerName">图层名称</param>/// <param name="texture">图层图像</param>/// <param name="offset">偏移值</param>/// <returns>图层</returns>public TextureLayer NewTextureLayer(string layerName, Texture2D texture, Vector2Int offset = default){layerName = string.IsNullOrEmpty(layerName) ? "新建图层" : layerName;TextureLayer textureLayer = new TextureLayer(layerName, PaintAreaWidth, PaintAreaHeight, PlateWidth, PlateHeight, _textureLayerRoot, texture, offset);TextureLayers.Add(textureLayer);return textureLayer;}}
设置当前图层
只有当前图层
不为空,才能进一步编辑当前图层:
/// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 当前选中的图层/// </summary>public TextureLayer CurrentLayer { get; private set; }/// <summary>/// 设置当前激活的图层/// </summary>/// <param name="layer">图层</param>public void SetCurrentLayer(TextureLayer layer){if (CurrentLayer == layer)return;CurrentLayer = layer;}}
上、下移动图层
图层越靠下(在图层列表中越靠后),其显示层级越高,也即是能在视觉上挡住之前的图层:
/// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 向上移动当前图层(显示层级降低)/// </summary>public void MoveLayerUpwards(){if (CurrentLayer != null){int index = TextureLayers.IndexOf(CurrentLayer);if (index > 0){index -= 1;TextureLayers.Remove(CurrentLayer);TextureLayers.Insert(index, CurrentLayer);//移动图层渲染器实体,改变其在父级中的位置CurrentLayer.Entity.transform.SetSiblingIndex(index);}}}/// <summary>/// 向下移动当前图层(显示层级升高)/// </summary>public void MoveLayerDownwards(){if (CurrentLayer != null){int index = TextureLayers.IndexOf(CurrentLayer);if (index < TextureLayers.Count - 1){index += 1;TextureLayers.Remove(CurrentLayer);TextureLayers.Insert(index, CurrentLayer);CurrentLayer.Entity.transform.SetSiblingIndex(index);}}}}
删除图层
/// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 删除一个图层/// </summary>/// <param name="layer">图层</param>public void DeleteTextureLayer(TextureLayer layer){if (layer == null)return;if (CurrentLayer == layer){SetCurrentLayer(null);}layer.Dispose();TextureLayers.Remove(layer);}}
图层快照
在进行某些操作时,如果用户未点击确认
,而是点击了取消
,则之前的操作将被还原,如下:
为了实现这个功能,我们引入图层快照
(当然,更高级的应当引入命令模式,但这不在本系列的学习范畴内):
/// <summary>/// 图层快照/// </summary>public sealed class TextureLayerSnapshot{internal Plate _plate;internal Plate _region;internal Vector2Int _offset;/// <summary>/// 图层快照/// </summary>public TextureLayerSnapshot(int paintAreaWidth, int paintAreaHeight, int plateWidth, int plateHeight){_plate = new Plate(plateWidth, plateHeight, true);_region = new Plate(paintAreaWidth, paintAreaHeight, false);_offset = new Vector2Int((_plate.Width - _region.Width) / 2, (_plate.Height - _region.Height) / 2);}/// <summary>/// 释放图层快照资源/// </summary>public void Dispose(){if (_plate != null){_plate.Dispose();_plate = null;}if (_region != null){_region.Dispose();_region = null;}}}
任何图层,都可以为其创建快照
,并在之后的某一时刻还原到快照
,快照能够记录一个图层在某一时刻的完整状态:
/// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 当前的图层快照/// </summary>public TextureLayerSnapshot CurrentSnapshot { get; private set; }/// <summary>/// 为当前图层创建快照/// </summary>public void CreateLayerSnapshot(){if (CurrentLayer != null){CurrentLayer.OutputToSnapshot(CurrentSnapshot);}}/// <summary>/// 将当前图层还原到快照/// </summary>public void RestoreLayerSnapshot(){if (CurrentLayer != null){CurrentLayer.InputOfSnapshot(CurrentSnapshot);}}}
至于图层如何创建快照
,如何还原到快照
,将由他自己定夺:
/// <summary>/// 图层/// </summary>public sealed class TextureLayer{/// <summary>/// 输出到快照/// </summary>/// <param name="snapshot">快照</param>internal void OutputToSnapshot(TextureLayerSnapshot snapshot){_plate.CopyTo(snapshot._plate);_region.CopyTo(snapshot._region);snapshot._offset = Offset;}/// <summary>/// 通过快照输入/// </summary>/// <param name="snapshot">快照</param>internal void InputOfSnapshot(TextureLayerSnapshot snapshot){snapshot._plate.CopyTo(_plate);snapshot._region.CopyTo(_region);Offset = snapshot._offset;//图层为脏的,触发重新生成渲染源_isTextureDirty = true;}}
到此,图层的功能就实现得差不多了。
相关文章:
【Unity功能集】TextureShop纹理工坊(三)图层(下)
项目源码:在终章发布 索引 图层渲染绘画区域图层Shader 编辑器编辑模式新建图层设置当前图层上、下移动图层删除图层图层快照 图层 在PS中,图层的概念贯穿始终(了解PS图层),他可以称作PS最基础也是最强大的特性之一。…...
基于 SSM 框架 Vue 电脑测评系统:引领电脑评测新方向
4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…...
Android笔记【19】
具体示例 run: val result someObject.run {// 这里可以使用 thisthis.someMethod() }let: val result someObject?.let {// 这里使用 itit.someMethod() }with: val result with(someObject) {// 这里使用 thissomeMethod() }apply: val obj SomeClass().apply {// 这里使…...
Redis 中 IntSet 底层数据结构
IntSet 底层数据结构 序言: 像字符串 SDS 只是保存了一个变量的值,但是像 Redis 中也是需要保存一些集合元素的,这里就介绍一下其中一种集合 IntSet,由于是 Set 所以也有 Set 的一些特性,不过也多加了一些特性: ● 唯…...
自然语言处理:我的学习心得与笔记
Pytorch 1.Pytorch基本语法 1.1 认识Pytorch 1.2 Pytorch中的autograd 2.Pytorch初步应用 2.1 使用Pytorch构建一个神经网络 2.2 使用Pytorch构建一个分类器 小节总结 学习了什么是Pytorch. 。Pytorch是一个基于Numpy的科学计算包,作为Numpy的替代者,向用户提供使用GPU强大…...
Altair: 轻松创建交互式数据可视化
Altair: 轻松创建交互式数据可视化 Altair 是一个基于 Vega-Lite 的 Python 数据可视化库,它旨在简化数据可视化的创建过程,尤其适用于统计图表的生成。Altair 强调声明式编码方式,通过简单的语法,用户能够快速创建复杂的交互式图…...
【NLP】序列到序列(seq2seq)建模工具fairseq使用详解
文章目录 一、fairseq简介二、安装方式2.1 pip安装2.2 源码安装 三、fairseq命令工具3.1 fairseq-preprocess3.2 fairseq-train3.3 fairseq-generate3.4 fairseq-interactivate3.5 fairseq-score3.6 fairseq-eval-lm 4. 常见报错报错1 参考资料 一、fairseq简介 fairseq 是 Fa…...
[极客大挑战 2019]HardSQL 1
[极客大挑战 2019]HardSQL 1 打开实例,发现是个登陆页面,查看源代码,发现又是GET提交check.php 万能密码尝试 不太行,怀疑字段或者空格被过滤,尝试闭合不加其他东西 确认空格、union、and等都被过滤了,尝试…...
天空分割代码
目录 依赖项: 分割源代码: 依赖项: groundingdino Grounded-Segment-Anything 分割源代码: generate_sky_mask.py import os, syssys.path.append(os.getcwd()) # Change to your folder here sys.path.append(Grounded-Segment-Anything)import argparse import os…...
Leetcode 三角形最小路径和
算法思想与代码详解 这段代码采用的是**动态规划(Dynamic Programming)**的思想,用来解决“120. 三角形最小路径和”问题。动态规划通过将问题分解成更小的子问题,并通过保存子问题的解来避免重复计算,从而提高效率。…...
[Unity]Unity跨平台开发之Android入门
安卓环境配置 安装依赖项 推荐使用Unity Hub进行安装,安装时勾选Android Build Support、Android SDK & NDK Tools、OpenJDK。或者指定已安装的依赖项。(注意:指定的依赖项需要是从UnityHub安装的。比如之前安装Unity2022时勾选了上述依…...
搭建Flume
title: 搭建Flume date: 2024-11-30 23:59:00 categories: - 服务器 tags: - Flume - 大数据搭建Flume 本次实验环境:Centos 7-2009、JDK 8、Flume-1.11.0 开始安装 1. 下载安装文件到服务器 # 使用wget命令下载flume文件(二选一) wget …...
【从零开始入门unity游戏开发之——C#篇10】循环结构——while、do-while、for、foreach的使用
文章目录 一、while 循环1、语法:2、示例: 二、 do-while 循环1、语法:2、示例: 三、for 循环1、语法:2、示例: 四、foreach 循环1、语法:2、示例: 五、总结对比六、注意事项七、使用…...
flask flask-socketio创建一个网页聊天应用
应用所需环境: python 3.11.11 其他 只需要通过这个命令即可 pip install flask3.1.0 Flask-SocketIO5.4.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 最好是用conda创建一个新的虚拟环境来验证 完整的pip list如下 Package Version ----…...
MVCC了解
MVCC(多版本并发控制)学习指南及代码示例 一、学习MVCC前先了解什么 1. MVCC的定义和作用 MVCC是一种并发控制机制,用于解决并发事务访问数据库时可能出现的问题,如脏读、不可重复读和幻读。它通过为每个数据行维护多个版本来实…...
LabVIEW随机扫描成像系统
利用LabVIEW开发了一套随机扫描成像系统,利用硬件时钟实现声光偏转器(AOD)的频率控制与信号采集之间的高速时间同步。系统利用了高精度的时钟同步技术,确保了成像精度和重复性,从而有效提高了成像速度和质量。 项目背景…...
系统移植——Linux 内核顶层 Makefile 详解
一、概述 Linux Kernel网上下载的版本很多NXP等有自己对应的版本。需要从网上直接下载就可以。 二、Linux内核初次编译 编译内核之前需要先在 ubuntu 上安装 lzop 库 sudo apt-get install lzop 在 Ubuntu 中 新 建 名 为 “ alientek_linux ” 的 文 件夹 , …...
【一文了解】C#重点-委托1
本篇文章来学习一下C#的委托,委托是C#中的一个重要概念,它允许将方法作为参数传递给其他方法。C#中的委托类似于C或C中的函数指针,并且类型安全。 委托 1.委托的定义 委托(delegate)是方法的代理/代表,委托…...
LeetCode hot100-87
https://leetcode.cn/problems/longest-increasing-subsequence/?envTypestudy-plan-v2&envIdtop-100-liked 300. 最长递增子序列 已解答 中等 相关标签 相关企业 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列&a…...
项目26:简易在线论坛 --- 《跟着小王学Python·新手》
项目26:简易在线论坛 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握Pyth…...
知乎 PB 级别 TiDB 数据库集群管控实践
以下文章来源于知乎技术专栏 ,作者代晓磊 导读 在现代企业中,数据库的运维管理至关重要,特别是面对分布式数据库的复杂性和大规模集群的挑战。作为一款兼容 MySQL 协议的分布式关系型数据库,TiDB 在高可用、高扩展性和强一致性方…...
Intel(R) Iris(R) Xe Graphics安装Anaconda、Pytorch(CPU版本)
一、Intel(R) Iris(R) Xe Graphics安装Anaconda 下载网址:https://repo.anaconda.com/archive/ 双击Anaconda3-2024.10-1-Windows-x86_64,一直下一步,选择安装的路径位置,一直下一步就安装完成了。打开Anaconda PowerShell Promp…...
RK3588 , mpp硬编码rgb, 保存MP4视频文件.
RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode Init MppMPP_RET init_mpp...
揭开 Choerodon UI 拖拽功能的神秘面纱
01 引言 系统的交互方式主要由点击、选择等组成。为了提升 HZERO 系统的用户体验、减少部分操作步骤,组件库集成了卓越的拖拽功能,让用户可以更高效流畅的操作系统。 例如:表格支持多行拖拽排序、跨表数据调整、个性化调整列顺序࿱…...
常用网络协议简述
网络协议是计算机网络中规定数据交换格式和交换规则的一套标准。以下是一些常用的网络协议及其简要解释: HTTP(HyperText Transfer Protocol,超文本传输协议) 用于从网络传输超文本数据到本地浏览器的传输协议。基于TCP协议&…...
本地电脑使用命令行上传文件至远程服务器
将本地文件上传到远程服务器,在本地电脑中cmd使用该命令: scp C:/Users/"你的用户名"/Desktop/environment.yml ws:~/environment.yml 其中,C:/Users/“你的用户名”/Desktop/environment.yml是本地文件的路径, ~/en…...
笔记day2
文章目录 1 NavigationDuplivated警告错误2 Home模块组件拆分3 三级联动组件完成4 完成其余静态组件5 POSTMAN测试接口6 axios二次封装6.1 为什么需要进行二次封装axios?6.2 在项目中经常API文件夹【axios】6.3 axios基础不好,可以参考git|NPM关于axios文…...
排序算法(3)——归并排序、计数排序
目录 1. 归并排序 1.1 递归实现 1.2 非递归实现 1.3 归并排序特性总结 2. 计数排序 代码实现 3. 总结 1. 归并排序 基本思想: 归并排序(merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法࿰…...
【5】C#期末复习第5套
1.int a[3][2]{2,4,6,8,10.12};则*(a[1]1)的值是8 指向(a[1]的第二个元素) 再* 2.合并字符串库函数strcat 3.比较字符串库函数strcmp 4.执行结果是x3,y3 int x3,y; int *px&x; y*px; (优先级高于*) 5.*p[5]没…...
jquery虚拟键盘插件jqkeyboard
jqKeyboard是一款jquery虚拟键盘插件。该虚拟键盘插件依赖于jquery ui,通过该插件,可以在页面中生成一个扁平风格的虚拟键盘面板。 在线预览 下载 安装 可以通过npm来安装jqKeyboard虚拟键盘插件。 npm install jq keyboard --save 使用方法 在页面…...
IMX6ULL开发板把屏幕刷黑(黑屏)的程序
承接博文 IMX6ULL开发板基础实验:Framebuffer驱动程序的简单应用实例代码详细分析 很容易写出把屏幕刷黑的程序… Ubuntu中的目录/home/book/mycode下新建目录C0003_draw_lcd_black,然后把把博文中的源码/home/book/mycode/C0002_show_pixel复制到目录C0003_draw_l…...
OpenCV基本图像处理操作(三)——图像轮廓
轮廓 cv2.findContours(img,mode,method) mode:轮廓检索模式 RETR_EXTERNAL :只检索最外面的轮廓;RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;RETR_CCOMP:检索所有的轮廓,并将他们组…...
C语言学习day24:DLL给程序打上窗口破解补丁
简言 在上一章节我们知道了DLL,编写DLL以及最重要的导出DLL,这一章节我们学习如何给应用打上窗口破解补丁(DLL)。 流程 工具:studyPE 操作: 把要补丁的程序拖入PE中点击导入菜单,导入dll函…...
大模型呼出机器人的应用场景
大模型呼出机器人的应用场景 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 大模型呼出机器人的应用场景十分广泛,涵盖了多个行业和服务领域。以下是对其应用场景的详细归纳: 一、客户…...
el-date-picker筛选时间日期选择范围
el-date-picker 选择时间日期范围-> 昨天 近7天 30天<template><div class"main"><div class"header"><el-form :model"form" label-width"auto"><el-button plain click"setTimeToYesterday&q…...
【Apache Paimon】-- 10 -- Paimon 0.9.0 集成 Hive 3.1.3
参考官方 0.9.0 版本文档:https://paimon.apache.org/docs/0.9/engines/hive/ 1、下载依赖包到 hive lib 下 $ cd $HIVE_HOME/$ mkdir auxlib$ cd auxlib$ wget https://repo.maven.apache.org/maven2/org/apache/paimon/paimon-hive-connector-3.1/0.9.0/paimon-hive-connec…...
vue2如何写一个轮播图
需求描述 写一个轮播图,可以实现如下效果: 页面上展示三个轮播图元素默认状态下,进行自动轮播,循环播放一旦鼠标移入轮播图范围内,并停留在元素a上,则轮播图停止自动播放,同时将元素a放大 核…...
基础库httpx的使用
urllib 库和 requests 库的使用,已经可以爬取绝大多数网站的数据,但对于某些网站依然无能为力。什么情况?这些网站强制使用HTTP/2.0协议访问,这时 urllib 和requests 是无法爬取数据的,因为它们只支持 HTTP/1.1,不支持…...
MYSQL 利用concat函数 生成更新或者插入SQL
有时候需要批量运维一批数据,一条一条写SQL比较麻烦,可以使用下面的方法批量生成select sales_order_number,a.sog_line_id,actual_price,sales_goods_unit_price,b.id,concat(update your_table set actual_price, sales_goods_unit_price, where id,b…...
Backend For Frontend的学习分享
晚上公司开了一个技术分享会,主要内容就是公司的项目架构,会中讲解了项目整体架构是BFF架构,就是在微服务之上多加了一层。 除此之外,还讲解了DDD设计思想,主要用于各个业务中台,如订单中台、用户中台等。…...
KS曲线python实现
目录 实战 实战 # 导入第三方模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 自定义绘制ks曲线的函数 def plot_ks(y_test, y_score, positive_flag):# 对y_test重新设置索引y_test.index np.arange(len(y_test))# 构建目标数据集target_dat…...
【GO环境安装】mac系统+GoLand使用
文章目录 下载安装包环境配置GoLandGo Modules 下载安装包 地址:GO下载地址 下载好后直接进行安装: 进入terminal,查看是否安装成功: 环境配置 在文稿下面创建工作目录: 在文稿下新建Go_Works文件夹,在…...
2025年入职/转行网络安全,该如何规划?网络安全职业规划
网络安全是一个日益增长的行业,对于打算进入或转行进入该领域的人来说,制定一个清晰且系统的职业规划非常重要。2025年,网络安全领域将继续发展并面临新的挑战,包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…...
linux中 umask 命令
Umask Umask(User File Creation Mode Mask)是Linux系统中的一项命令,用于设定新创建文件和目录的默认权限。 一、umask的作用 Umask通过掩码操作,限制新文件和目录的访问权限。在Linux中,所有的文件和目录都被分配…...
OpenCV函数及其应用
1. 梯度处理的Sobel算子函数 功能 Sobel算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导,用于计算图像亮度的空间梯度。 参数 src:输入图像。 dst:输出图像。 ddepth:输出图像的深度。 dxÿ…...
使用ENSP实现NAT(2)
一、NAT的类型 二、静态NAT 1.项目拓扑 2.项目实现 路由器AR1配置: 进入系统视图 sys将路由器命名为AR1 sysname AR1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为192.168.10.254/24 ip address 192.168.10.254 24进…...
欢迎 PaliGemma 2 – 来自 Google 的新视觉语言模型
我们很高兴迎来 Google 全新的视觉语言模型 PaliGemma 2,这是 PaliGemma 的一个新版本。与其前代产品一样,PaliGemma 2 使用强大的SigLIP进行视觉处理,但在文本解码部分升级到了最新的 Gemma 2。 https://hf.co/collections/google/siglip-65…...
C++ List(双向链表)
是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个 信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定 的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中&#…...
pip使用方法
1. 安装包: pip install :安装指定的 Python 包。 pip install :安装特定版本的 Python 包。 pip install -r requirements.txt:从文件中读取依赖列表并安装所有列出的包。 pip install --pre :允许安装预发布或开发版…...
websocket再项目中的使用
WebSocket在项目中的使用主要包括以下几个方面: WebSocket的基本概念和原理: 定义:WebSocket是一种基于TCP的协议,实现了浏览器与服务器之间的全双工通信。它通过HTTP/1.1协议的101状态码进行握手,建立连接…...