1.CAD内核:几何建模引擎分类
2.实例讲解Debian系的Linux中软件包的安装与管理命令用法
3.带你走进电脑病毒的庞大帝国 真正认识电脑病毒
4.mmdetection框架和工程实践
5.PyQt5系列教程(53):欢乐斗地主QMdiArea的使用
6.Unity 与 Unreal 引擎,哪个适合实时 VFX渲染?
CAD内核:几何建模引擎分类
几何建模引擎是3D建模系统的核心,用于精确表示产品三维形状并管理模型。内核的价值在于为应用程序提供功能,CAD系统通过图形用户界面向用户提供内核功能的访问。世界上有几十个知名的netsql源码带后台数学内核,包括来自EDS的Parasolid、Spatial Corp的ACIS、Matra Datavision的Open CASCADE,以及Thinkdesign、VX Overdrive、KOMPAS-3D和CrownCAD等。
使用相同的内核,产品的功能和限制相似,主要区别在于用户界面。几何建模引擎分为三种类型:许可、专有和源代码形式提供。
许可内核由公司开发和维护,授权给其他CAD系统的用户。例如,Parasolid和ACIS内核广泛用于CAD,其中Parasolid是Unigraphics的核心,ACIS由Dassault Systemes开发。这两个内核在实体建模、混合建模和广义网格建模方面提供技术。
专有内核由CAD开发人员开发和维护,专门用于其应用程序,提供更深入的集成。例如,Thinkdesign和VX Overdrive内核分别作为Think3和Varimetrix产品的基础。
源代码形式的内核允许用户拥有内核的源代码,便于定制。Open CASCADE和SMLib是著名的开源内核,前者免费,后者需要付费。
使用购买的聚投诉源码核心成本包括在产品价格中,购买格式的导入导出模块需要额外费用。自定义内核成本较低,管理更灵活。购买核心并不意味着绝对可靠性,错误可以通过修改内核得到纠正。
CAD开发人员选择内核时需考虑成本、功能和集成深度。许可内核提供了广泛的兼容性和功能,但成本较高。专有内核集成度高,适用于特定需求,成本较低。源代码内核允许定制,但维护成本较高。选择哪种内核取决于CAD系统的特定需求和预算。工业公司购买CAD时,内核能力、打磨程度和成本都应考虑。多数情况下,企业会购买几个高级CAD工作站和数十个较便宜的许可证来满足不同设计需求。在某些情况下,所有工作场所都配备高级CAD可能在俄罗斯不可行。
实例讲解Debian系的Linux中软件包的安装与管理命令用法
apt-get用法:apt-get [选项] 命令
apt-get [选项] install|remove pkg1 [pkg2 ...]
apt-get [选项] source pkg1 [pkg2 ...]
apt-get 是一个下载安装软件包的简单命令行接口。
最常用的命令是update(更新)
和install(安装)。
命令:
update - 重新获取软件包列表
upgrade - 进行更新
install - 安装新的软件包
remove - 移除软件包
autoremove - 自动移除全部不使用的软件包
purge - 移除软件包和配置文件
source - 下载源码档案
build-dep - 为源码包配置编译依赖
dist-upgrade - 发行版升级, 参见 apt-get(8)
dselect-upgrade - 依照 dselect 的选择更新
clean - 清除下载的归档文件
autoclean - 清除旧的的已下载的归档文件
check - 检验是否有损坏的依赖
选项:
-h 本帮助文件。
-q 输出到日志 - 无进展指示
-qq 不输出信息,错误除外
-d 仅下载 - 不安装或解压归档文件
-s 不实际安装。模拟执行命令
-y 假定对所有的询问选是,不提示
-f 尝试修正系统依赖损坏处
-m 如果归档无法定位,尝试继续
-u 同时显示更新软件包的列表
-b 获取源码包后编译
-V 显示详细的版本号
-c=? 阅读此配置文件
-o=? 设置自定的配置选项,如 -o dir::cache=/tmp
例:
复制代码
代码如下:
apt-cache search packagename搜索包
复制代码
代码如下:
apt-cache show packagename获取包的相关信息,如说明、大小、版本等
复制代码
代码如下:
apt-get install packagename安装包
复制代码
代码如下:
apt-get install packagename - - reinstall重新安装包
复制代码
代码如下:
apt-get -f install修复安装-f = --fix-missing
复制代码
代码如下:
apt-get remove packagename删除包
复制代码
代码如下:
apt-get remove packagename - - purge删除包,包括删除配置文件等
复制代码
代码如下:
apt-get update更新源
复制代码
代码如下:
apt-get upgrade更新已安装的交付源码要求包
复制代码
代码如下:
apt-get dist-upgrade升级系统
复制代码
代码如下:
apt-get dselect-upgrade使用 dselect 升级
复制代码
代码如下:
apt-cache depends packagename了解使用依赖
复制代码
代码如下:
apt-cache rdepends packagename是查看该包被哪些包依赖
复制代码
代码如下:
apt-get build-dep packagename安装相关的编译环境
复制代码
代码如下:
apt-get source packagename下载该包的源代码
复制代码
代码如下:
apt-get clean清理无用的包
复制代码
代码如下:
apt-get autoclean清理无用的包
复制代码
代码如下:
apt-get check检查是否有损坏的依赖
pacman
Pacman 是一个 软件包管理器, 作为 ArchLinux发行版的一部分. 它最早由 Arch Linux 的 Judd Vinet开发. Pacman 可以解决安装过程中的依赖问题,自动下载并且安装所有需要的软件包。Pacman包管理器是Arch Linux的一大亮点。它将一个简单的二进制包格式和易用的构建系统结合了起来。Pacman使得简单的管理与自定义软件包成为了可能,而不论他们来自于官方的Arch软件库或是用户自己创建的
复制代码
代码如下:
[zhangy@BlackGhost ~]$ pacman -h用法: pacman 操作 [...]
操作:
pacman { -h --help} //帮助
pacman { -V --version} //查看版本
pacman { -D --database} 选项 软件包 //pacman管理数据库选项
pacman { -Q --query} [选项] [软件包] //查询安装包
pacman { -R --remove} [选项] 软件包 //删除安装包
pacman { -S --sync} [选项] [软件包] //安装安装包
pacman { -U --upgrade} [选项] 文件 //更新安装包
使用 'pacman { -h --help}' 及某个操作以查看可得的选项
复制代码
代码如下:
[zhangy@BlackGhost ~]$ pacman -D --help用法: pacman { -D --database} 选项 软件包
选项:
--asdeps 标记为非单独指定安装的软件包
--asexplicit 标记为单独指定安装的软件包
--config 路径 指定另外的配置文件
--logfile 路径 指定另外的日志文件
--noconfirm 不询问确认
--noprogressbar 下载文件时不显示进度条
--noscriptlet 不执行安装小脚本
-v, --verbose 循环执行
-- debug 显示除错信息
-r, --root 路径 指定另外的安装根目录
-b, --dbpath 路径 指定另外的数据库位置
--cachedir 目录 指定另外的软件包缓存位置
--arch 架构 设定另外的架构
复制代码
代码如下:
[zhangy@BlackGhost ~]$ pacman -Q --help用法: pacman { -Q --query} [选项] [软件包]
选项:
-c, --changelog 查看某软件包的更新日志
-d, --deps 列出所有作为依赖关系安装的软件包 [过滤器]
-e, --explicit 列出所有单独指定安装的软件包 [过滤器]
-g, --groups 查看某软件包组所属的所有软件包
-i, --info 查看软件包信息 (-ii 查看备份文件)
-k, --check 检查该软件包拥有的文件是否存在
-l, --list 列出被查询软件包的内容
-m, --foreign 列出没有在同步数据库时找到的已安装软件包 [过滤器]
-o, --owns 文件 查询哪个软件包拥有 文件
-p, --file 软件包 从某个软件包而不是数据库查询
-s, --search 搜寻符合指定字符串的已安装本地的软件包
-t, --unrequired 列出所有不被其他软件包要求的软件包 [过滤器]
-u, --upgrades 列出所有可升级的软件包 [过滤器]
-q, --quiet 在查询或搜索时显示较少的信息
--config 路径 指定另外的配置文件
--logfile 路径 指定另外的日志文件
--noconfirm 不询问确认
--noprogressbar 下载文件时不显示进度条
--noscriptlet 不执行安装小脚本
-v, --verbose 循环执行
-- debug 显示除错信息
-r, --root 路径 指定另外的安装根目录
-b, --dbpath 路径 指定另外的数据库位置
--cachedir 目录 指定另外的软件包缓存位置
--arch 架构 设定另外的架构
复制代码
代码如下:
[zhangy@BlackGhost ~]$ pacman -R --help用法: pacman { -R --remove} [选项] 软件包
选项:
-c, --cascade 删除软件包及所有的依赖于此的软件包
-d, --nodeps 略过依赖关系检查
-k, --dbonly 只删除数据库记录,不删除文件
-n, --nosave 同时删除配置文件
-s, --recursive 同时删除 (不会破坏其他软件包的) 依赖关系(-ss也包括单独指定安装的依赖关系)
-u, --unneeded 同时删除不需要的 (且不会破坏其他软件包的) 依赖关系
--print 仅打印目标而不执行操作
--print-format 字符串指定如何打印目标
--config 路径 指定另外的配置文件
--logfile 路径 指定另外的日志文件
--noconfirm 不询问确认
--noprogressbar 下载文件时不显示进度条
--noscriptlet 不执行安装小脚本
-v, --verbose 循环执行
-- debug 显示除错信息
-r, --root 路径 指定另外的安装根目录
-b, --dbpath 路径 指定另外的数据库位置
--cachedir 目录 指定另外的软件包缓存位置
--arch 架构 设定另外的架构
复制代码
代码如下:
[zhangy@BlackGhost ~]$ pacman -S --help用法: pacman { -S --sync} [选项] [软件包]
选项:
--asdeps 作为非单独指定安装的软件包安装
--asexplicit 作为单独指定安装的软件包安装
-c, --clean 从缓存目录中删除旧软件包 (-cc 清除所有)
-d, --nodeps 略过依赖关系检查
-f, -force 强制安装,覆盖存在冲突的文件
-g, --groups 查看某软件包组所属的所有软件包
-i, --info 查看软件包信息
-l, --list 软件库 查看在该软件库中的软件包清单
-s, --search 按照指定字符串查询远端软件库
-u, --sysupgrade 升级所有已安装的软件包 (-uu 可启用降级)
-w, --downloadonly 下载但不安装/升级软件包
-y, --refresh 从服务器下载新的软件包数据库
--needed 不重新安装已经为最新的软件包
--ignore 软件包 升级时忽略某个软件包 (可多次使用)
--ignoregroup 软件包组升级时忽略某个软件包组 (可多次使用)
--print 仅打印目标而不执行操作
--print-format 字符串指定如何打印目标
-q, --quiet 在查询或搜索时显示较少的信息
--config 路径 指定另外的配置文件
--logfile 路径 指定另外的日志文件
--noconfirm 不询问确认
--noprogressbar 下载文件时不显示进度条
--noscriptlet 不执行安装小脚本
-v, --verbose 循环执行
-- debug 显示除错信息
-r, --root 路径 指定另外的安装根目录
-b, --dbpath 路径 指定另外的数据库位置
--cachedir 目录 指定另外的软件包缓存位置
--arch 架构 设定另外的架构
复制代码
代码如下:
[zhangy@BlackGhost ~]$ pacman -U --help用法: pacman { -U --upgrade} [选项] 文件
选项:
--asdeps 作为非单独指定安装的软件包安装
--asexplicit 作为单独指定安装的软件包安装
-d, --nodeps 略过依赖关系检查
-f, -force 强制安装,覆盖存在冲突的文件
-k, --dbonly 添加数据库记录,不安装或保持现存文件
--print 仅打印目标而不执行操作
--print-format 字符串 指定如何打印目标
--config 路径 指定另外的配置文件
--logfile 路径 指定另外的日志文件
--noconfirm 不询问确认
--noprogressbar 下载文件时不显示进度条
--noscriptlet 不执行安装小脚本
-v, --verbose 循环执行
-- debug 显示除错信息
-r, --root 路径 指定另外的安装根目录
-b, --dbpath 路径 指定另外的数据库位置
--cachedir 目录 指定另外的软件包缓存位置
--arch 架构 设定另外的架构
例1:
(1).安装或者升级单个软件包
复制代码
代码如下:
pacman -S mysql(2),有时候在不同的软件仓库中,一个软件包有多个版本(比如extra和community)。你可以选择一个来安装
复制代码
代码如下:
pacman -S extra/mysql(3),步包数据库并且安装一个软件包
复制代码
代码如下:
pacman -Sy mysql例2
删除包
(1),删除单个软件包,保留其全部已经安装的依赖关系
复制代码
代码如下:
pacman -R mysql(2),删除指定软件包,及其所有没有被其他已安装软件包使用的依赖关系:
复制代码
代码如下:
pacman -Rs mysql例3
升级系统
复制代码
代码如下:
pacman -Syu例4
查询包
查询可用安装包
复制代码
代码如下:
pacman -Ss mysql要查询已安装的软件包:
复制代码
代码如下:
pacman -Qs mysql例5
其他用法
清理当前未被安装软件包的缓存
复制代码
代码如下:
pacman -Sc下载包而不安装
复制代码
代码如下:
pacman -Sw mysql带你走进电脑病毒的庞大帝国 真正认识电脑病毒
现如今电脑病毒问题日益突出,不夸张地说有网络的地方就有病毒。见过身边现存的电脑病毒 你是否已经有些头大了。小编告诉你现在认识的病毒无异于是管中窥豹!电脑病毒可是拥有着庞大的种族帝国的。接下来,小编带你一起走入电脑病毒的世界,真正的认识病毒!
什么是病毒
病毒能够实现自我复制,并且感染其它文件,程序和计算机。每一种病毒都有感染机制;譬如,有的病毒可以直接插入主机或是数据文件。病毒的威力可大可小,有些可能只是小恶作剧,还有可能是相当恶意的攻击。
电脑病毒分类:
电脑病毒类型一、可编译病毒
可编译病毒的源代码可以经由编译器程序转换为操作系统可以直接运行的程序格式。可编译病毒包括以下三种:
■文件感染器(fileinfector)这种病毒一般将其附加在可执行程序中,譬如word,电子表格和电脑游戏。逍遥传世源码一旦病毒感染程序,就直接影响系统中的其它程序,还有使用系统作为共享的感染程序。Jerusalem和Cascade就是两种最出名的文件感染病毒
■引导区(bootsector)引导区病毒一般感染硬盘驱动的MBR或是硬驱和移动媒介的引导区。引导区,顾名思义就是存储信息的硬盘或是磁盘的开始部分。MBR是磁盘上比较独特的区域,因为电脑的基本输出/输入系统(BIOS)可以加载启动程序的地方就在此。一旦电脑启动的时候,如果硬驱中有感染的磁盘,病毒就自动执行。引导区病毒隐藏性很强,成功率高,破坏性强。其表现就是启动的时候出现错误信息或是启动不稳定。Form,,Michelangelo和Stoned是很典型的引导区病毒。
■混合体(Multipartite)混合体病毒使用多种感染方式,典型的是感染文件和引导区。相应地,混合体病毒有上述两种病毒的特征。典型例子:Flip和Invader
除了感染文件之外,可编译病毒还可以躲藏在感染系统的内存中,这样每次执行新的程序的时候就可以感染新的程序。在上述三种病毒中,启动区域病毒最有可能存在于内存中。相比那些非存在于内存中的病毒而言,这种病毒危害性更大,更加频繁。
电脑病毒类型二、演绎性病毒
与可编译病毒有操作系统执行不同的是,这种病毒的源代码只能由特定程序来实现。这种病毒以其简单易操作深受欢迎。即使一个不是幸运生肖源码太熟练的黑客也可以借此编写和修正代码,感染计算机。这种病毒的变体很多,最主要的两种是宏病毒(macrovirus)和脚本病毒(scriptingvirus)
宏病毒是这种病毒中最流行最成功的。病毒一般附加到word,电子表格等,并且使用这些程序的宏编译语言来执行病毒。它们利用的正是很多流行软件的宏编译语言功能,譬如说,微软的办公软件。由于人们共享具有宏功能文档的增多,这种病毒也越来越流行。一旦宏病毒感染发生,就会感染程序的建立和打开文件夹模板程序。一旦模板被感染,所有藉由此模板建立和打开的文件都会被感染。Concept,Marker,和Melissa就是很出名的宏病毒。
脚本病毒与宏病毒类似。最大区别在于,宏病毒是以特定软件程序语言为基础,而而脚本病毒是以操作系统理解的语言编程,譬如说Windows脚本主机功能就可以执行VB脚本语言。典型的脚本病毒有First和LoveStages病毒。
看完了小编的介绍,大家是否对电脑病毒有了进一的了解!电脑病毒何其多,做好防范才是最关键的!
mmdetection框架和工程实践
MMDetection框架详解与工程实践
1. 引入与安装
MMDetection是一个模块化的目标检测框架,通过组合不同组件构建自定义模型,支持多种算法和模型,具有高效和性能优势。它基于COCO 目标检测竞赛冠军团队的代码库,适用于Linux系统,Windows支持有限。
2. 框架结构与设计
框架采用模块化编程,便于重复使用和模块化搭建。__init__.py文件的使用和管理,如定义__all__属性,有助于代码复用和维护。设计模式如构造者模式和注册器模式,分别用于分离构建过程和简化对象创建过程,实现代码扩展性。
3. 配置与模型构建
配置文件详细描述了模型的参数设置,如Cascade RCNN的RPN和Fast R-CNN结构。mmdetection将模型细分为多个模块,如Backbone、Neck等,每个模块负责特定任务。配置文件的分析显示,不同IOU阈值在训练和推理阶段可能导致性能不匹配,Cascade RCNN通过多阶段结构解决此问题。
4. 推理与训练源码解析
测试代码如test.py展示了单GPU和多GPU测试过程,以及如何通过配置文件和模型进行检测。训练代码train.py则涉及模型构建、数据集注册和训练步骤。自定义数据集的构建包括数据读取、图像增强和COCO/VOC格式转换。
5. 实践技巧
如使用Kmeans聚类优化边界框,热力图绘制用于特征可视化,以及利用Visdom和Hook进行训练过程可视化。工程应用方面,C++与Python和TorchScript的交互提供了一种灵活的插件解决方案。
总结:
MMDetection框架通过模块化设计、丰富的算法支持和高效的执行,为用户提供了强大的目标检测工具。框架结构、配置管理和源码解析展示了如何构建、调整和优化模型。实践技巧部分提供了与C++交互和模型优化的实用方法,方便开发者在实际工程中灵活应用。
PyQt5系列教程():欢乐斗地主QMdiArea的使用
上期文章中,我们一起探讨了QTabWidget、QStackedWidget和QDockWidget的运用,通过这些工具,我们能够实现在一个窗口内集成更多的组件。本期,我们转向学习QMdiArea,一个强大的工具,它提供了一个展示MDI窗口的区域,类似于Windows在一个屏幕上同时维护多个应用程序窗口,也适用于在一个显示区域内管理多个文件窗口。
QMdiArea的功能类似于MDI窗口的窗口管理器。它绘制并管理它所包含的窗口,提供级联或平铺布局,通常作为QMainWindow的中心部件用于创建MDI应用,但也可以放置在任何布局中。通过将区域添加到主窗口,代码如下所示:
添加QMdiArea到主窗口的代码片段。
每个子窗口都是QMdiSubWindow实例,通过addSubWindow()函数添加到MDI区域。通常会传递QWidget作为内部窗口部件,或直接传递QMdiSubWindow。子窗口继承QWidget,支持与正常顶层窗口相同的API编程。
子窗口在获取键盘焦点或调用setFocus()时变为活动状态。用户通过常规方式移动焦点来激活窗口。MDI区域在活动窗口改变时发出subWindowActivated()信号,而activeSubWindow()函数返回当前活动子窗口。
subWindowList()函数返回所有子窗口的列表,可用于创建包含窗口列表的弹出式菜单。
子窗口按照当前窗口排序,用于subWindowList()、activateNextSubWindow()和activatePreviousSubWindow()。在使用cascadeSubWindows()和tileSubWindows()进行窗口级联或平铺时,此排序规则同样重要。
QMdiArea提供内置的布局策略cascadeSubWindows()和tileSubWindows()。这些功能轻松集成到菜单条目中,用于管理窗口布局。
详细信息请参考官方文档。
本期实验通过模拟发放扑克牌,具体步骤包括发1张牌、随机发放5张牌和收牌清空操作。我们通过自定义QLabel类,赋予每个对象随机的扑克牌素材,将每一个QLabel视为一个QWidget,借助QMdiArea的相关函数实现这一过程。
使用QMdiArea的一部分代码展示。代码量并不繁重。
为了在工具栏上实现不同功能的按钮,可以参考相关知识点。若希望在工具栏按钮上显示文字,需添加特定代码。
新建QMdiArea对象,设置为主窗口的中心部件。cardlist为包含扑克牌文件名的列表。发1张牌,从cardlist随机选取一个元素即可。随机发放5张牌,从cardlist中选取包含5个元素的随机子列表。
发1张牌的代码示例。随机获取扑克牌文件名。
QMdiSubWindow是QMdiArea提供的子窗口类,代表MDI区域中的顶级窗口,包含窗口标题栏、内部窗口部件等,视样式可能还包括窗口框架和尺寸夹点。
构建QMdiSubWindow最常用方法是使用内部窗口部件调用QMdiArea.addSubWindow()。也可以自行创建子窗口,通过setWidget()设置内部窗口部件。
与常规顶级窗口编程类似,您可以使用相同的API,如show()、hide()、showMaximized()和setWindowTitle()等函数。
在代码中,通过setWidget()将自定义的QLabel类Card作为内部窗口部件,并通过addSubWindow()添加子窗口。
子窗口通常有最小化、最大化和关闭按钮。显示的扑克牌通过设置setWindowFlags(Qt.WindowMinimizeButtonHint)来仅显示最小化按钮。同时调整窗口大小并显示。
发5张牌的函数与上述功能类似,不再赘述。
通过这个函数可以快速关闭所有子窗口。
收牌的函数实质上是对子窗口进行排列,以级联模式排列所有子窗口。
平铺模式排列所有子窗口的方法是QMdiArea.tileSubWindows(),有兴趣的读者可以尝试。
本次学习内容较为基础,详细实现请下载源代码自行探索。
文章至此,希望大家喜欢本篇文章。如果你觉得有帮助,请给我点赞、赞赏或分享给好友。关注微信公众号:学点编程吧,发送“pyqt”获取本期代码。加油!(ง •̀_•́)ง (*•̀ㅂ•́)
Unity 与 Unreal 引擎,哪个适合实时 VFX渲染?
Unity 与 Unreal 引擎在实时 VFX渲染上各有优势,选择取决于具体需求和团队背景。以下是两者在不同方面的对比:
1. 编程语言:Unity 采用C#,易上手,对新手友好,且内存管理自动化。虚幻引擎则用C++,尽管复杂但功能强大,许多应用都是基于此,适合希望深入VFX制作的开发者。
2. 可访问性:虚幻引擎所有用户都能访问源代码,而Unity专业版和企业版用户才能访问。对于自定义代码需求高的人,虚幻引擎更具吸引力。
3. 可视化脚本:Unity的Bolt和Playmaker提供可视化编程,Playmaker直观但收费,Bolt复杂度更高。虚幻引擎的Blueprints免费且强大,但灵活性逊于C++。
4. VFX系统:Unity的VFX Graph和粒子系统各有优势,VFX Graph更适合大量粒子和定制行为,而虚幻的Cascade和Niagara适用于更高级别的实时VFX。
5. 图形:Unity擅长2D风格化,虚幻引擎在3D超现实效果上更出色,但Unity的图形技术发展迅速。
因此,选择Unity还是Unreal Engine,取决于您是否愿意投入更多时间学习C++,以及是否需要源代码访问和高级VFX功能。对于初期开发者或2D项目,Unity可能是更佳选择;对于大规模3D项目和定制需求,Unreal Engine可能更适合。