1.gin框架原理详解(gin框架是框分什么)
2.MFC编程 -- 高级列表框添加数据
3.AI与PDE(七):AFNO模型的源代码解析
4.swin transformerç解è¦ç¹
5.UE4源码剖析——Actor蓝图之CDO与SCS
6.如何改变框架网页标题
gin框架原理详解(gin框架是什么)
Gin的启动过程、路由及上下文源码解读
Engine是类源类框gin框架的一个实例,它包含了多路复用器、码分中间件和配置中心。框分
gin通过Engine.Run(addr...string)来启动服务,类源类框最终调用的码分街机跑马源码是/手败gin-gonic/gin
一个简单的例子:
packagemain
import"github.com/gin-gonic/gin"
funcmain(){
//Default返回一个默认的路由引擎
r:=gin.Default()
r.GET("/ping",func(c*gin.Context){
//输出json结果给调用方
c.JSON(,gin.H{
"message":"pong",
})
})
r.Run()//listenandserveon0.0.0.0:
}
编译运行程序,打开浏览器,框分访问页面显示:
{ "message":"pong"}
gin的类源类框功能不只是简单输出Json数据。它是码分一个轻量级的WEB框架,支持RestFull风格API,框分支持GET,类源类框POST,码分PUT,框分PATCH,类源类框DELETE,码分OPTIONS等/gin-gonic/gin"
)
funcmain(){
router:=gin.Default()
//静态资源加载,本例为css,js以及资源
router.StaticFS("/public",/ffhelicopter/tmm/website/static"))
router.StaticFile("/favicon.ico","./resources/favicon.ico")
//Listenandserveon0.0.0.0:
router.Run(":")
}
首先需要是生成一个Engine,这是gin的核心,默认带有Logger和Recovery两个中间件。
router:=gin.Default()
StaticFile是字节项目源码加载单个文件,而StaticFS是加载一个完整的目录资源:
func(group*RouterGroup)StaticFile(relativePath,filepathstring)IRoutes
func(group*RouterGroup)StaticFS(relativePathstring,fs/gin-gonic/gin
如果安装失败,直接去Githubclone下来,放置到对应的目录即可。
(2)代码中使用:
下面是一个使用Gin的简单例子:
packagemain
import(
"github.com/gin-gonic/gin"
)
funcmain(){
router:=gin.Default()
router.GET("/ping",func(c*gin.Context){
c.JSON(,gin.H{
"message":"pong",
})
})
router.Run(":")//listenandserveon0.0.0.0:
}
简单几行代码,就能实现一个web服务。使用gin的Default方法创建一个路由handler。然后通过HTTP方法绑定路由规则和路由函数。不同于net/e"}。
注:Gin还包含更多的返回方法如c.String,c.HTML,c.XML等,请自行了解。可以方便的返回HTML数据
我们在之前的组v1路由下新定义一个路由:
下面我们访问
可以看到,通过c.Param(“key”)方法,Gin成功捕获了url请求路径中的参数。同理,gin也可以捕获常规参数,如下代码所示:
在浏览器输入以下代码:
通过c.Query(“key”)可以成功接收到url参数,c.DefaultQuery在参数不存在的情况下,会由其默认值代替。
我们还可以为Gin定义一些默认路由:
这时候,unicloud上传源码我们访问一个不存在的页面:
返回如下所示:
下面我们测试在Gin里面使用Post
在测试端输入:
附带发送的数据,测试即可。记住需要使用POST方法.
继续修改,将PostHandler的函数修改如下
测试工具输入:
发送的内容输入:
返回结果如下:
备注:此处需要指定Content-Type为application/x-www-form-urlencoded,否则识别不出来。
一定要选择对应的PUT或者DELETE方法。
Gin框架快速的创建路由
能够方便的创建分组
支持url正则表达式
支持参数查找(c.Paramc.Queryc.PostForm)
请求方法精准匹配
支持处理
快速的返回给客户端数据,常用的c.Stringc.JSONc.Data
MFC编程 -- 高级列表框添加数据
一、设计界面
在MFC编程中,首先设计界面,添加按钮、编辑框以及高级列表框,为接下来的程序设计打下基础。
二、高级列表框的视图属性设置
接着,针对高级列表框,将其视图属性调整为Report模式。同时,修改其他控件的led驱动源码名称,以符合程序的逻辑需求。
三、初始化列表列名
初始化阶段,需设置列表的列名,明确显示数据的分类和格式。
四、双击添加按钮,添加代码
双击添加按钮,编写相应的代码,实现数据的添加功能。确保代码逻辑清晰,易于理解。
五、运行效果
运行程序后,高级列表框将显示已添加的数据,用户可以根据需求进行查看和管理。
六、项目下载
如需获取完整的项目源代码,可关注编程有你公众号,源码公式输出后台回复“”获取资源。
AI与PDE(七):AFNO模型的源代码解析
本文旨在解析AFNO模型的源代码,帮助读者理解模型细节与主干结构。首先,AFNO模型的主干框架在afnonet.py文件中定义,通过类AFNONet实现。模型的核心功能封装在多个类与函数中,依据代码注释逐步解析。
在代码中,forward_features函数负责模型的核心逻辑,包括patch切割与mixing过程。这些操作由PatchEmbed类实现。位置编码self.pos_embed通过高斯初始化得到,增加模型的表示能力。
关键模块AFNO2d位于代码中,它基于FNO的原理,负责处理输入数据。AFNO2d模块在forward_features函数中通过循环调用,实现数据的转换与混合。
经过数个L layer处理后,模型进入类似解码器的结构,用于将中间结果映射为目标结果。这一过程通过self.head(x)实现,以解决特定分类问题。
本文通过梳理代码流程与结构图,直观展示了AFNO模型的工作原理。读者可参考AFNO的GitHub源代码与论文,深入理解细节。后续文章将继续探讨基于AFNO模型框架的其他应用,如FourCastNet。
swin transformerç解è¦ç¹
è¿æ¯è·éçå类以ååå²æºç ä»ç»ï¼å¤§å®¶æéè¦å¯ä»¥åèä¸ä¸ï¼1ã Swin-Transformeråç±»æºç (å·²è·é)
2ã Swin-Transformeråå²æºç (å·²è·é)
3ã Swin-Unet(åå²æ¹ç¼)
æ们å设å¾çç大å°æ¯Ãçï¼çªå£å¤§å°æ¯åºå®çï¼7Ã7ãè¿éæ¯ä¸ªæ¹æ¡é½æ¯ä¸ä¸ªçªå£ï¼æ¯ä¸ªçªå£æ¯åºå®æ7Ã7个patchï¼ä½æ¯patchç大å°æ¯ä¸åºå®çï¼å®ä¼éçpatch mergingçæä½èåçååãæ¯å¦æ们çè¿å¿ï¼patch大å°æ¯4Ã4çï¼é£æä¹åæ8Ã8å¢ï¼æ们æå¨è¾¹4个çªå£çpatchæ¼å¨ä¸èµ·ï¼ç¸å½äºpatchæ©å¤§äº2Ã2åï¼ä»èå¾å°8Ã8大å°çpatchã
æ们åç°ç»è¿è¿ä¸ç³»åçæä½ä¹åï¼patchçæ°ç®å¨åå°ï¼æåæ´å¼ å¾åªæä¸ä¸ªçªå£ï¼7个patchãæ以æ们å¯ä»¥è®¤ä¸ºééæ ·æ¯æ让patchçæ°éåå°ï¼ä½æ¯patchç大å°å¨å大ã
è¿ä¾¿æ¯å¯¹ViTçä¸ä¸ªæ¹è¿ï¼ViTä»å¤´è³å°¾é½æ¯å¯¹å ¨å±åself-attentionï¼èswin-transformeræ¯ä¸ä¸ªçªå£å¨æ¾å¤§çè¿ç¨ï¼ç¶åself-attentionç计ç®æ¯ä»¥çªå£ä¸ºåä½å»è®¡ç®çï¼è¿æ ·ç¸å½äºå¼å ¥äºå±é¨èåçä¿¡æ¯ï¼åCNNçå·ç§¯è¿ç¨å¾ç¸ä¼¼ï¼å°±åæ¯CNNçæ¥é¿åå·ç§¯æ ¸å¤§å°ä¸æ ·ï¼è¿æ ·å°±åå°äºçªå£çä¸éåï¼åºå«å¨äºCNNå¨æ¯ä¸ªçªå£åçæ¯å·ç§¯ç计ç®ï¼æ¯ä¸ªçªå£æåå¾å°ä¸ä¸ªå¼ï¼è¿ä¸ªå¼ä»£è¡¨çè¿ä¸ªçªå£çç¹å¾ãèswin transformerå¨æ¯ä¸ªçªå£åçæ¯self-attentionç计ç®ï¼å¾å°çæ¯ä¸ä¸ªæ´æ°è¿ççªå£ï¼ç¶åéè¿patch mergingçæä½ï¼æçªå£åäºä¸ªå并ï¼å继ç»å¯¹è¿ä¸ªå并åççªå£åself-attentionç计ç®ã
å ¶å®è¿è¾¹å°æ°äºæä¸å°ä¸ï¼å 为æ们å°è±¡ä¸ééæ ·é½æ¯åCNNä¸æ ·ï¼ä¼åå°ï¼ä½æ¯swin transformer没æç»æ们åå°çæè§ãå ¶å®è¿å°±æ¯æåé没ç解å°ä½çé®é¢ï¼CNNå°æåï¼è®¾è®¡éå½ï¼æåä¸ä¸ªç¹å¾å¾çæåéæ¯å¯ä»¥æ¾å¤§å°æ´å¼ å¾çï¼swin transformeræåä¸ä¸ªstageä¹æ¯ä¸ä¸ªçªå£æ¶µçäºæ´å¼ å¾ã
Swin-transformeræ¯æä¹æå¤æ度éä½çå¢ï¼ Swin Transformer Blockè¿ä¸ªæ¨¡ååæ®éçtransformerçåºå«å°±å¨äºW-MSAï¼èå®å°±æ¯éä½å¤æ度计ç®ç大åè£ã
å ³äºå¤æ度ç计ç®ï¼æç®åçç»å¤§å®¶ä»ç»ä¸ä¸ï¼é¦å æ¯transformeræ¬èº«åºäºå ¨å±çå¤æ度计ç®ï¼è¿ä¸åå¿è®²èµ·æ¥æç¹å¤æï¼æå ´è¶£çåå¦æ们å¯ä»¥ä¼åä¸èµ·æ¢è®¨æ¨å¯¼è¿ç¨ãå¨è¿éï¼æ们å设已ç¥MSAçå¤æ度æ¯å¾å大å°çå¹³æ¹ï¼æ ¹æ®MSAçå¤æ度ï¼æ们å¯ä»¥å¾åºAçå¤æ度æ¯(3Ã3)²ï¼æåå¤æ度æ¯ãSwin transformeræ¯å¨æ¯ä¸ªlocal windows(红è²é¨å)计ç®self-attentionï¼æ ¹æ®MSAçå¤æ度æ们å¯ä»¥å¾åºæ¯ä¸ªçº¢è²çªå£çå¤æ度æ¯1Ã1çå¹³æ¹ï¼ä¹å°±æ¯1çå次æ¹ãç¶å9个çªå£ï¼è¿äºçªå£çå¤æ度å åï¼æåBçå¤æ度为9ã
W-MSAè½ç¶éä½äºè®¡ç®å¤æ度ï¼ä½æ¯ä¸éåçwindowä¹é´ç¼ºä¹ä¿¡æ¯äº¤æµï¼æ以æ³è¦çªå£ä¹é´çä¿¡æ¯ææ交æµï¼é£ä¹å°±å¯ä»¥æå·¦å¾æ¼åæå³å¾è¿æ ·ï¼ä½æ¯è¿å°±äº§çäºä¸ä¸ªé®é¢ï¼å¦æ¤æä½ï¼ä¼äº§çæ´å¤çwindowsï¼å¹¶ä¸å ¶ä¸ä¸é¨åwindowå°äºæ®éçwindowï¼æ¯å¦4个window -> 9个windowï¼windowsæ°éå¢å äºä¸åå¤ãè¿è®¡ç®éåä¸æ¥äºãå æ¤æ们æ两个ç®çï¼Windowsæ°éä¸è½å¤ï¼windowä¹é´ä¿¡æ¯å¾æ交æµã
æ们çå°ï¼åæ¥çå¾è¢«ååäº9个çªå£ï¼ä¸é´çåºåAå°±æ¯ä¿¡æ¯äº¤æµçè¯æãæ们å æå·¦ä¸é¨å(èè²ä»¥å¤ççªå£)移å¨å°å³ä¸ï¼ç¶ååç¨ååååçæ¹æ³å»åè¿ä¸ªå¾çï¼è¿æ¶ååºåA就被éåºæ¥äºï¼è¾¾å°äºæ们æ³è¦çææã
transformerçåºç°å¹¶ä¸æ¯ä¸ºäºæ¿ä»£CNNãå 为transformeræçCNN没æçåè½æ§ï¼å®ä¸ä» å¯ä»¥æåç¹å¾ï¼è¿å¯ä»¥åå¾å¤CNNåä¸å°çäºæ ï¼æ¯å¦å¤æ¨¡æèåãèswin transformerå°±æ¯ä¸ä¸ªè¶å¿ï¼å°CNNä¸transformeråèªçä¼å¿ææçç»åäºèµ·æ¥ãè¿æ¯ææ¶å¯¹å®çä¸äºç»èè¡¥å ãæè¿å¬è¯´MLPåºæ¥äºï¼è¿æ²¡æç»çï¼æ¶ä»£è¿å±æªå ä¹å¤ªå¿«äºï¼æéé对ViTæ¹è¿çæç« è¿æ²¡æåºå»ï¼å°±å·²ç»å¼å§è¦ç«ä¸ä½èäºã
å¸æå¯ä»¥å¸®å©å°å¤§å®¶ï¼å¦æä½ è§å¾è¿ç¯æç« å¯¹ä½ æä¸å®ç帮å©ï¼é£å°±ç¹ä¸ªèµæ¯æä¸ä¸å§ï¼å¦ææä»ä¹é®é¢çè¯ä¹å¯ä»¥å¨æç« ä¸é¢è¯è®ºï¼æ们ä¸èµ·äº¤æµè§£å³é®é¢ï¼
以ä¸æ¯ææææç« çç®å½ï¼å¤§å®¶å¦ææå ´è¶£ï¼ä¹å¯ä»¥åå¾æ¥ç
👉æ³å³è¾¹ï¼ æå¼å®ï¼ä¹è®¸ä¼çå°å¾å¤å¯¹ä½ æ帮å©çæç«
UE4源码剖析——Actor蓝图之CDO与SCS
在UE的日常使用中,蓝图(UBlueprint)是我们接触最多的资产类型。每个蓝图在创建时需要选择一个父类,这决定了蓝图的类型,比如Actor蓝图、Component蓝图、Widget蓝图、动作蓝图等。以Actor蓝图为例,本文将深入探讨蓝图的基础架构,并学习如何通过代码读取蓝图资产在蓝图编辑器中的属性值。此外,本文还将重点介绍如何利用SCS框架管理新组件,并在运行时加载这些组件。
在实际开发中,我们经常需要对蓝图进行处理,例如在大型项目中,制定一套资源规范并开发一套资源检测工具。这些工具往往需要遍历特定目录下的蓝图并执行某些条件判断和处理。本文将帮助大家了解如何实现这些功能。
**实战需求**:
1. **例1**:要求所有放置在“Buildings”文件夹下的蓝图必须包含`StaticMeshComponent`组件,且`StaticMesh`字段不能为空。
2. **例2**:要求“Cars”文件夹下的所有蓝图的`SceneComponent`组件移动性必需为`Movable`。
**蓝图的父类与Actor蓝图**:
1. **蓝图的父类**:创建蓝图时,编辑器面板中选择的父类决定蓝图的类型,例如`TestActorChild2`的父类为`TestActorChild1`,而`TestActorChild1`的父类为`TestBlueprintActor`。
2. **Actor蓝图**:若蓝图的父类层级链最顶层是`Actor 类`,则该蓝图为`Actor蓝图`。
**蓝图产生类**:蓝图的`_C`后缀代表蓝图产生类,它用于在编译时生成C++类,包含蓝图中的信息。
**蓝图类(UBlueprint)**:加载蓝图包时,通过`LoadObject`函数获取到的是`UBlueprint`类。
**蓝图骨骼类(SkeletonGeneratedClass)**:以`SKEL_`前缀和`_C`后缀加载,表示蓝图的基础信息,通常在编辑器中修改时会重新生成。
**蓝图产生类(GeneratedClass)**:仅以`_C`为后缀加载,用于在运行时创建蓝图对象。
**前后缀声明**:`UBlueprint.h`中的`GetBlueprintClassNames`函数定义了这些前缀。
**Actor蓝图产生类的实例化与阶段拆分**:
1. **CDO的构建**:`ClassDefaultObject`是每个类的默认对象,用于提供默认属性值和行为。
2. **SCS组件附加**:通过蓝图编辑器的组件面板添加组件,这些组件存储在`SimpleConstructionScript`中,用于在运行时添加组件。
**CDO与SCS**:
- **CDO**:存储默认属性值与行为,节省数据传输和存储,支持配置化。
- **SCS**:简化组件添加过程,通过蓝图编辑器直观操作组件。
**需求回顾与实现**:通过遍历CDO和SCS,判断组件属性值,实现特定条件的检测,如`StaticMeshComponent`的`StaticMesh`字段是否为空。
本文从实际需求出发,全面介绍了蓝图的基本概念、内部分类、构建流程以及如何利用SCS管理组件。希望本文内容能帮助开发者更深入地理解蓝图的工作原理,提高资源管理与组件处理的效率。
如何改变框架网页标题
1、使用代码视图,在框架控制面板中选择一个框架,单击代码视图,在源代码页面头部的之间设置框架集的标题。
2、使用菜单,在框架控制面板上选择一个框架,点击修改菜单,选择页面属性项,打开页面属性对话框,在左侧的分类栏下面,选择标题,编码项,在右侧的标题,编码栏下面的标题框中填写标题内容,设置好标题后,单击,确定按钮即可。
3、在框架源代码头部之间找到设置标题的代码行,输入想要设的标题。