Category: Software Engineering Practices

  • AIGC体验2-midjourney使用配置对生成的图片进行约束和限制

    上篇短文主要向大家介绍了midjourney的基本使用,在文生图的时候,有时作者期望有更多的控制条件,比如生成图片的大小和横竖比,生成图片的风格等。 首先可以通过命令/settings进行相关版本,以及模式的设置,输出结果为如下图示,具体关于这些模式的含义可以参考引文,这里不做赘述。 下面主要介绍一个使用一些约束和控制的示例 输出的结果如下图所示 点击“U4”后显示结果为: 加上图片风格和长宽比之后的示例如下: 点击“U4”后显示结果为: 后面将继续介绍相关使用的一些技能点。欢迎读者反馈意见和建议。 Reference

  • AIGC体验1-midjourney的初步使用

    midjourney在图片生成方向上有较高的质量,这篇博客简要记录一下其初步的使用方法。欢迎读者给出意见和建议,以及补充相关的说明。 注册后(注册过程忽略),可以建立自己的频道,方法如下几个图示。 然后就可以在对应的服务器里用相关命令生成图片了,这里举个示例,假设提示词为“Bright forest, little bunny Lily in front of home, sunlight shining on the grass”,则生成后的效果如下图所示: 具体后面更多的使用经验将在后续的体验过程中进一步加以记录。 References

  • 新时期的数字化工程应用技术教育教学新需求

    今天有幸受邀参加华为和合作伙伴举行的产教融合教育方面的研讨活动,记录一下相关的产业和教育相关的信息以备后需。 随着harmony os及相关的一系列的自主信息化技术的发展及逐渐普及,相关工程技术的教育教学也需要同步的跟进,这里据我了解的情况和背景做一点说明,如有需要补充的地方,请大家联系我补充更新。 一、鸿蒙生态开发,鸿蒙os的应用范围逐渐增多,从手机,平板到各种物联设备(如美的等智能家电),还有一些To B的专业设备如高铁,机场等的嵌入式物联网设备,都部署了鸿蒙系统,鸿蒙系统通过soft bus实现了跨设备的数据共享(不同设备感觉可以成为相互的外围设备一样),众多的android上的应用要移植到鸿蒙系统上来,就需要大量的相关app开发人才,这起码在近几年都是一个显性的应用开发人才需求,应用本科和高职的技术技能人才是比较适合这个方向的; 二、人工智能,人工智能的技术发展也很快,但是除了门槛比较高的人工智能新算法设计发明外,还有一类就是人工智能应用工程师,这类开发主要在利用人工智能的技术去搭建具体的场景应用,包括怎么去做prompt enginerring。怎么利用人工智能已有的sdk和开发套件搭建机械狗,小车,机械臂等具体的场景应用,怎么利用大模型商城代码等等这类也是应用技术型人才所适合的工作方向; 三、云原生技术,很多公司的数据平台和业务都会部署在云平台,这些公司只需关注自己的业务,而不用太专注计算设备平台的物理环境和基础软件的部署和配置。包括IaaS基础设施,PaaS如各种实验平台,大数据平台等; 四、低代码开发,低代码开发以后也会成为应用开发的主要形式,据了解大约在2025年会有70%的应用以低代码的形式开发出来,低代码开发到时候可能也是人人都可以学习的开发技术,通过拖拽和一些简单的操作就可以人人开发出自己的应用来,这方面了解的不多,以后有机会再多关注一下; 还有更多的自主技术,如操作系统,数据库,软硬件协同开发(物联网IOT,AIOT等),以及AI等方方面面需要进一步的推广和普及,关于工程应用开发的大量需求,培养这方面的工程师也是当前较为紧迫的,怎么和企业合作高效培养和对接工作需求,怎么培养同学的实践能力并且达到举一反三,自主学习新技术的能力和方法,也是职业和应用技术教育需要去讨论,总结并将好的思路,实践加以推广从而达到更好的应用工程师工程素养培养的目标。

  • gitlab服务部署

    gitlab是在软件开发过程管理中比较有影响力的开源产品,其基于ruby等实现,而现在一般的部署基本上也是基于docker镜像,因此只需拉取编译好的docker镜像环境,然后采用正确的启动脚本启动,配置一些属性项,就可以部署gitlab服务了。 gitlab服务可以提供几个有代表性的功能:1、代码仓库管理,可以按group,subgroup来组织project,有master,maintainer,developer,reporter等角色,方便比较大的平台和组织中不同小组和个人的仓库访问范围和权限管理。2、管理issue,milestone等,将issue和代码的review以及提交等想结合,管理项目进度,可视化项目完成项和待完成项,以便更合理的管理项目进度;3、支持和其他Devops工具和服务集成,如jekins等,后续如有机会也将进一步学习实践并给与介绍。 下面介绍一下部署步骤,希望能对有关读者有用,如有问题,欢迎大家反馈更正。 下面是启动的脚本示例供参考: 进入docker容器,编辑/etc/gitlab/gitlab.rb文件,然后更新如下的配置项 然后在docker容器里执行如下的两个命令启动服务。 这里将gitlab容器内部的nginx服务关闭,可以通过宿主机上的nginx的反向代理服务(proxy_pass)进行访问。如在宿主机的/etc/nginx/conf.d目录下,建立gitlab.conf文件,里边的配置方式示例如下: 其中上述的ssl_certificate 和ssl_certificate_key 需要在去购买SSL证书,这样就可以启动https协议服务了。然后在宿主机上重新加载配置文件,通过命令nginx -s reload就可以更新nginx服务配置,进而可以访问gitlab服务了。

  • einsum is all you need-einsum函数在数值计算中的应用示例说明

    在深度学习框架和numpy等数值计算库中,记住不同的矩阵计算,如内积(dot products)、外积(outer products)、矩阵转置(transposes ),矩阵和向量相乘,以及矩阵和矩阵的乘法这些运算的函数名称和参数是容易混淆的一件事情,而爱因斯坦和(einsum)是通过一种领域语言(domain-specific language),用一种优雅的方式去解决这个问题,同时更进一步还可以描述更复杂的tensor的操作。 einsum函数采用如下的格式,einsum(equation,operands),下面为一个模板:result=einsum(“□□,□□□,□□->□□”,arg1,arg2,arg3)。其中□为占位符,表示张量的一个维度,如前面的equation的形式为“□□,□□□,□□->□□”,表示的含义为由三个输入参数,第一个和第三个为矩阵,第二是阶数为3的张量。计算的结果为矩阵。 下面将解释一些使用示例: 其中张量的缩并(tensor contraction)操作是两个多维张量中的分别两个大小相同的维度的内积,具体可以参考链接1中的示例。其中广播操作(broadcast)的实现方式可以参考引文7中的示例说明。 关于示例和相关说明,后面再根据实践会进一步补充更新或进行相关的修正,欢迎读者提出问题意见和建议。 References

  • WordPress本地备份重部署方法

    WordPress作为最有名的开源博客系统之一,由于其便捷的部署方式和丰富的样式和插件,使得其在个人博客,中小型内容管理系统(CMS,content management system)中广受欢迎。这篇博客将记录部署和维护wordpress的一些细节方法和技巧,后续有更多的会继续在文章后面进行补充。 1、部署,docker技术可以使得部署wordpress系统非常便捷,wordpress基本依赖两个docker镜像,mysql和wordpress。部署方式可以通过下面的两个脚本命令启动相关容器进行。在公有云如阿里华为上部署时一般还要配置nginx的conf,购买SSL证书并进行签名部署等操作,一般公有云上也会有相关文档说明,这里不做特别说明。 2、备份,这里用比较笨拙的全量备份到本地并进行本地部署的方式进行介绍。环境为windows10/11和WSL的ubuntu18.04。1、首先通过scp将在服务器上的mysql目录和wordpress的目录全量拷贝到本地。2、拉取两个docker镜像,wordpress和mysql:5.7。3、启动对应的两个docker容器,启动方式为上述的启动脚本示例。 3、进入mysql容器内部(docker exec -it containerid bash),登录到sql服务器(mysql -uroot -ppassword),选择数据库(use databasename),通过sql指令更新本地定义的域名。 4、配置SSL和本地域名解析。具体方法为:1、在WSL的ubuntu环境中生成本地ssl证书,2、检查WSL中的ip;3、在windows原生系统中添加一行本地域名解析(C:\Windows\System32\drivers\etc目录下的hosts文件),格式为:wsl ip:new_domain。其中前两点的CLI(command line interface)命令如下: 5、在WSL中安装配置nginx,conf的配置方法和云平台中的配置方法类似,阿里云华为云上也有相关的配置说明,这里不做赘述。配置好后,通过命令nginx -s reload更新配置属性。然后就可以在windows系统的浏览器的状态栏中输入https://new_domain就可以访问备份的博客系统了。 References

  • Windows系统上安装配置docker环境

    Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。 docker的应用场景挺多,比如一般的AI云平台都是基于docker镜像提供的系统环境,一般的软件开发也会基于docker软件编译和运行环境(如apollo系统的编译运行环境就是基于docker的)。 docker是对于开发者非常友好的工具,从个人经验来看,在docker环境下做开发和部署有如下的好处和便捷:1、docker镜像的开发环境和机器原生系统隔离,机器本身的软件环境不受影响;2、不同的开发环境比如依赖库等可以构建不同的docker镜像来进行隔离(有点类似于anaconda的虚拟环境);3、镜像一次构建后很容易分发共享,如通过docker hub进行push和pull就可以推送本地镜像和远程拉取所需的镜像。这样的镜像机制也同时方便团队合作以及系统生产环境的部署。 在linux系统如ubuntu或其他发行版本上使用docker相对比较容易,而我们平时用windows机器的场景也挺多,本文将记录在windows平台上构建docker开发环境的方法。 1、首先在windows10/11上安装WSL(windows subsystem for linux)环境,由底层虚拟机平台所支持,因此需要开启相关服务。方法为:在桌面底部的搜索栏输入“控制面板”后选择程序-》启用或关闭windows功能后勾选两项:1、适用于Linux的Windows子系统;2、虚拟机平台;3、开启虚拟机服务平台,执行此命令行后继续进行相关的操作。dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart和wsl –set-default-version 2。中间可能需要重启系统以更新相关服务。 2、在桌面底部状态栏中输入“store”选择Windows Store中搜索ubuntu 18.04。然后选择下载,下载完成后即可运行。 3、下载docker desktop for windows程序并安装后既可以通过启动图标来启动docker engine。然后就可以在windows上的Ubuntu系统里使用docker命令了。 Reference

  • Apollo 粗粒度结构及系统启动流程简介

    Apollo系统是智能驾驶领域很有影响力的开源系统,本篇文章从粗粒度上介绍Apollo系统的结构,并分析其其启动流程。后续有机会再介绍细节,不正确的地方欢迎批评指正。 Apollo系统是个比较复杂的系统应用,首先其实现了通信及任务调度的中间件CyberRT(在代码仓的apollo\cyber目录下),也称为Apollo系统的运行时环境(RT即为Runtime),Apollo系统的各个业务逻辑模块,包括感知perception,规划planning,控制control等等各上层的模块,都是基于CyberRT的基础上进行构建的。CyberRT提供了两个核心的运行时功能,1为任务调度,基于协程,多线程实现的不同任务可以按照智能驾驶的业务逻辑编排成高效的执行模式运行,2为通信模式,借鉴了ROS里边的node发布订阅模式,实现了进程内(intra),shm(共享内存单机多进程间通信),rtsp(实时发布订阅协议,多个host之间的网络通信协议),以及hybrid(混合模式,基于component之间通信的物理状态动态选择上述三种模式以达高效通信)。在CyberRT的实现里,一个任务以component为载体,里边的业务处理逻辑通过协程来实现,同时其有对应node,实现了reader和writer,也就是可以接收和发送消息(不同的消息以channel来区分,类似于ros里的topic)。关于通信的实现可以参考apollo\cyber\transport目录下面的代码,引文2中也有相关的介绍。 CyberRT可以理解为在底层操作系统之上构建的一个RTOS,在Apollo的源码仓里,系统的各个模块的逻辑实现依赖于CyberRT提供的接口,这些模块的代码在目录apollo\modules里。具体阅读相关代码实现。 这里以一个模块的启动为例进行说明,一般来说,每一个模块都有一个启动的文件(dag有向无环图文件),如下面的路径为摄像头bev感知模块的dag文件:apollo\modules\perception\camera_detection_bev\dag\camera_detection_bev.dag。一般通过mainboard程序启动一个module。mainboard即为cyberrt运行时编译后生成的可执行文件,会加载CyberRT运行时环境,load相应模块的so文件(一个module可以由多个component组成)。而整个新系统将会是很多个module组成的大系统,因此会有很多个mainboard程序启动,整个智能驾驶系统将是一个多进程程序(不同进程有可能会跨不同的主机host)。具体的启动方式的介绍在引文3中有详细介绍,在此不做赘述。 References

  • Apollo CyberRT的两种任务调度策略实现代码简要说明

    Apollo CyberRT为智能驾驶的中间件(middle ware),提供了类似于ROS概念(并优于ROS平台)的机器人运行时环境。CyberRT在任务的调度上进行了优化的设计,提供了经典调度模式和编排调度模式,使得系统的诸多任务可以按照任务之间的逻辑拓扑结构来进行编排,从而在执行性能上得到很好的保证。同时CyberRT在通信上也做了很好的支持,在单机内部,多机之间的不同component都能够进行高效的通信。这里主要就任务调度方式来做一下说明,也是加以记录以备后面查阅,不正确的地方欢迎批评指正。 首先,在CyberRT实现里,Processor类对应着线程的封装,CRoutine类是对协程的封装,Component类对应着组件(任务)的封装,在Component类里,会创建协程来处理任务。 经典调度模式(ClassicContext):在经典调度模式下,可以将任务进行分组,分组的目的主要是在基于NUMA架构的计算环境上,实现资源的隔离,在同一个组的任务会安排在同一个NUMA节点下运行,这样保证了同一组的任务之间的通信不会由于跨NUMA节点而带来更多的资源消耗和计算时长。而且每一个组下面维护一个多优先级的协程(CRoutine)队列,每一个优先级下面维护一个协程的数组。ClassicContext类对经典调度模式的上下文进行了建模,而且在CyberRT实现里,每一个Processor对应着一个ClassicContext,并且任务(component,以协程的方式实现)的优先级队列作为ClassicContext类成员的静态变量,在不同的线程里边实现共享。ClassicContext调度任务时,会从高优先级的任务里优先调度。在这里补充说明一下,CRoutine的同一个实例可以在不同的线程里调度,CRoutine类里有thread_local类型的相关变量,保证了同一个协程在不同的线程里有对应的相关变量的副本。 编排调度模式(ChoreographyContext):在编排调度模式下,一个Processor对应着一个ChoreographyContext,并且封装了一个multimap类型的变量,key为协程的优先级,value为协程,保证了可以支持同等的优先级下的多个协程。而且这个变量不是静态变量,在多个线程(Processor)之间不共享,保证了执行的协程任务的CPU亲和性(不会在多个cpu之间调度同一个协程),可以基于此通过配置文件来实现任务的编排(如定义某些任务在某些cpu上执行)。 更多的代码细节建议阅读官方开源的代码仓的关键部分,如apollo\cyber\scheduler,apollo\cyber\croutine,apollo\cyber\component等,上述的文字说明都可以在这几个目录的代码里找到实现。 References

  • Windows上vscode建立C/C++开发环境

    这里以在windows 10/11上建立开发环境为例,由于vscode IDE比较轻量级而且开源免费,支持多种高级编程语言,插件工具支持丰富,是现在广泛普及的编程IDE。在windows平台上开发c/c++程序可以使用两种编译器环境。(1)、用原生windows系统,使用开源的c++编译器,可以参考引文下载链接。(2)、用WSL的linux环境,用linux环境下的gcc,g++编译器;通过如下命令安装:sudo apt install g++ gdb make。 这里以第(2)种情况来做说明,首先要在windows系统上安装好WSL。具体安装方法可以参考引文。 在vscode IDE中要按ctrl+shift+p弹出”WSL:Connect to WSL using Distro…. “,选择安装的WSL对应的ubuntu版本,然后打开特定的工程目录文件,在vscode当前打开的根目录下建立.vscode目录并创建launch.json文件。内容如下: 在.vscode同一级目录下建立tasks.json。内容如下: References