首页 文章 精选 留言 我的

精选列表

搜索[快速],共10000篇文章
优秀的个人博客,低调大师

探索开明软件包:应用开发指南轻松掌握,快速上手!

开明软件包格式,是openKylin社区Kaiming SIG为应对传统包格式存在的系统与应用无明确界限、发行版碎片化、兼容性等问题而开发的一款全新软件包格式,满足ISV(Independent Software Vendors)应用发布和应用独立发布需求,并支持沙箱隔离,允许共享部分基础库,为主要Linux桌面提供原生集成。 一、开明软件包框架结构 开明软件包主要包括部署文件(deploy)、应用数据(files)、元数据文件(matedata),导出文件(exports)四部分: 部署文件:存放开明包安装来源、安装大小、版本、安装时间等信息 应用数据:应用本身二进制、动态库、配置文件等 元数据文件:包含运行时依赖、扩展依赖、权限信息、二进制命令、环境变量等内容 导出文件:针对应用,主要包含desktop、icon、dbus.service等对外暴露的文件 开明软件包运行过程,首先解析元数据文件,获取到应用运行所需的上下文内容,然后通过mount namespace和bind mount构建应用运行的rootfs,通过xdg-dbus-proxy进行dbus转发,最后chroot进入rootfs环境执行二进制命令启动应用。接下来请跟随文章教程完成您的第一个开明包构建和安装运行。 二、开明命令介绍 以下是部分开明软件包使用命令介绍,更多命令详情可参考文末链接:开明命令使用手册。 kaiming install :安装开明应用 kaiming export :离线导出开明应用 kaiming list:列出所有已安装的应用 kaiming run:运行一个已安装的开明应用 kaiming enter :进入运行沙箱内部环境 kaiming uninstall:卸载开明应用 ...... 三、编译程序 1.安装开明命令包和开明编译包 $ sudo apt install kaiming kaiming-builder 其中,kaiming ( >= 0.15.9 )是包管理器客户端,提供了相关开明命令,用于管理开明包格式应用的安装、卸载、运行、更新、信息查看等操作。kaiming-builder提供了开明包对应的编译命令,可以将您的源码编译成开明软件包格式。 2.安装runtime和配套的SDK 开明包要求每个应用程序指定一个依赖的runtime。runtime由SDK和Platform组成,SDK在应用编译和调试时使用,Platform在应用执行时使用。在编译应用程序时,需要先将runtime下载到本地: $ sudo kaiming install top.openkylin.Sdk top.openkylin.Platform # 默认编译所需最小的runtime 3.创建应用程序 进入您的项目根目录,这里我们采用一个简单的脚本案例来说明。 #!/bin/shecho "Hello world, start your first kaiming app!" 现在将其粘贴到一个空文件中并将其另存为hello.sh。 4.配置源码所需清单 这里以top.openkylin.Hello.yaml清单文件为例,文件内容: id: top.openkylin.Hello # 应用程序名branch: stable # 应用分支runtime: top.openkylin.Platform # 所需runtimeruntime-version: '2.0' # runtime版本sdk: top.openkylin.Sdk # 配套的SDKcommand: hello.sh # runtime执行的命令modules: # 编译模块 - name: hello # 模块名称 buildsystem: simple # 使用的构建系统。如autotools、cmake、meson、simple、qmake等 build-commands: # 在构建期间运行的一组命令 - install -D hello.sh /app/bin/hello.sh # 执行 install 命令将hello.sh 安装到可执行目录 sources: # 包含一个指向源码指针,它们可以有多种类型,通过type属性来区分。 - type: file # 本地源码类型 path: hello.sh # 和type格式对齐,表示将复制到源目录的本地文件的路径 举例程序较为简单,在更复杂的应用程序中,清单将列出多个模块。由于yaml清单涉及内容较多,关于yaml清单的详细描述请参考官方文档说明(链接附在文末)。 5.构建应用程序 使用命令kaiming-builder来进行软件包编译: kaiming-builder build top.openkylin.Hello.yaml 如果您想共享该应用程序,可以将其放入存储库中。通过将--repo参数传递给来kaiming-builder来完成: $ rm -rf build/ repo/ .kaiming-builder/ #第二次编译时需要,删除当前的编译目录、缓存和存储库repo$ kaiming-builder build --repo=repo top.openkylin.Hello.yaml 此命令将构建清单中列出的每个模块并将其安装到本地存储库repo中。其中,生成的build目录是构建后的程序结构。如下图: 我们可以看到,hello.sh是在 files/bin/hello.sh下,这种情况就是正确编译结果,之后会通过kaiming install安装到系统的指定位置/opt/kaiming中。到这里,恭喜您已完成一个应用程序制作! 四、测试运行 1.安装应用程序 现在我们准备添加刚刚创建的存储库并安装应用程序。通过kaiming install命令完成,要验证构建后的包是否可以成功安装,请运行以下命令: $ sudo kaiming install --repo=repo top.openkylin.Hello # top.openkylin.Hello 为 top.openkylin.Hello.yaml 清单文件中的应用程序名 2.运行应用程序 接下来,通过以下命令来尝试运行该应用程序: $ kaiming run top.openkylin.Hello 运行成功,终端输出: Hello world, start your first kaiming app! 以上是编译开明软件包格式的简单流程,各位小伙伴你学会了吗?更多内容,敬请期待。 开明命令使用手册:https://gitee.com/openkylin/community/blob/master/sig/KaiMing/%E5%BC%80%E6%98%8E%E7%94%A8%E6%88%B7%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C/%E5%BC%80%E6%98%8E%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C/README.md#/openkylin/community/blob/master/sig/KaiMing/%E5%BC%80%E6%98%8E%E7%94%A8%E6%88%B7%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C/%E5%BC%80%E6%98%8E%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C/installation.md yaml清单说明: https://gitee.com/openkylin/community/blob/master/sig/KaiMing/%E5%BC%80%E6%98%8E%E7%94%A8%E6%88%B7%E6%93%8D%E4%BD%9C%E6%89%8B%E5%86%8C/%E5%BC%80%E6%98%8E%E7%BC%96%E5%8C%85%E6%89%8B%E5%86%8C/manifest.md​​​​​​​

优秀的个人博客,低调大师

nebula-br local-store 模式,快速搭建主备集群实践

因为线上图数据库目前为单集群,数据量比较大,有以下缺点: 单点风险,一旦集群崩溃或者因为某些查询拖垮整个集群,就会导致所有图操作受影响 很多优化类但会影响读写的操作不好执行,比如:compact、balance leader 等; 双集群在升级的时候也非常有优势,完全可以做到不影响业务运行,比如先升级备集群再升级主集群。总之为了线上数据库更加稳定和高可用需要搭建双集群。 选择 BR 工具的原因 目前,我这边了解到复制集群方案有: 新集群重新写入数据,这种情况要么就是写程序 scan 再导入新集群(太慢了),要么就基于底表数据通过 nebula-exchange 再导入新集群(必须得有历史数据) (不可靠)完整复制 nebula 数据拷贝到新集群,参考:【复制 data 方式导入】(不过,这个方式我在测试环境测试失败了) 通过 nebula-br 备份,再还原到新集群(本文就是基于这种方式) 因为我们线上很难回溯出完整的历史数据,无法基于底表重新构建,此外 scan 方式又太慢了,所以选择了 BR 的方式。 注意: 本文基于测试环境搭建验证,数据量比较小,线上还未做验证,仅供参考。此外附上官方的简单 BR 实践。 (很重要)使用 BR 工具备份一定要先去了解其限制,BR 文档 环境介绍 nebula 版本:3.6.0 nebula 安装路径:/usr/local/nebula nebula-metad 服务端口:9559 (可以通过安装目录下的 scripts/nebula-metad status 查看) backup 目录:/usr/local/nebula_backup 备份方式:full(全图备份,也可以指定部分 space) 3 台老集群机器(已经有历史数据的):192.168.1.2、192.168.1.3、192.168.1.4 3 台新集群机器(没有数据,待从老集群复制数据):192.168.2.2、192.168.2.3、192.168.2.4 备份前新集群 show hosts 情况: 备份前老集群 show hosts 情况: 大体步骤 老集群安装 agent(每台机器都要安装)和 br(选择任何其中一台机器安装)工具; 新集群安装 agent(每台机器都要安装); 在老集群安装 br 的机器上,利用 br 工具生成备份文件,备份 meta 执行老集群的 meta 地址; 复制 meta 文件,老集群中只有一台机器的备份目录有 meta,需要将 meta 复制到老集群其他机器; 在新集群机器创建和老集群一样的备份目录,比如:老集群备份目录为 /usr/local/nebula_bak/BACKUP_2023_09_14_13_57_33,新集群机器需要创建相同的目录:/usr/local/nebula_bak/BACKUP_2023_09_14_13_57_33; 复制老集群备份文件到新集群中,这里需要注意因为老集群每台机器都有自己的备份文件,这里需要将所有的备份文件复制到新集群中整合到一起,因为每台机器的 data 下的目录名称都是以 IP + PORT 的形式,所以不会有重复; 在老集群安装 br 的机器上,利用 br 工具恢复备份文件,恢复时 meta 指向新机器 meta 地址; 详细步骤 在老集群所有机器安装 agent,安装方法参考:angent 安装介绍,以当前示例为例,下载 nebula-agent 之后存放在 /usr/local/nebula/bin 目录下, 使用 chmod +x nebula-agent 赋予可执行权限: 192.168.1.2 nohup ./nebula-agent -agent="192.168.1.2:9999" -debug -meta="192.168.1.2:9559" > agent.log 2>&1 & 192.168.1.3 nohup ./nebula-agent -agent="192.168.1.3:9999" -debug -meta="192.168.1.3:9559" > agent.log 2>&1 & 192.168.1.4 nohup ./nebula-agent -agent="192.168.1.4:9999" -debug -meta="192.168.1.4:9559" > agent.log 2>&1 & 下载 br 工具到 nebula 的 bin 目录下,并命名为 nebula-br,并使用 chmod 命令赋予可执行权限。 此时老集群机器拓扑图: (老集群)选择安装 br 工具的 192.168.1.4 机器执行如下命令进行备份: ./nebula-br backup full --meta="192.168.1.4:9559" --storage="local:///usr/local/nebula_backup" (老集群)备份后每台机器的备份目录详情如图: (老集群)复制 meta 到其他机器的备份目录下: 这里是从 192.169.1.2(只有这台机器生成了 meta,这玩意只有在 meta 的 leader 节点生成)机器复制到 192.168.1.3 和 192.168.1.4 机器目录下: 新集群安装 agent: 192.168.2.2 nohup ./nebula-agent -agent="192.168.2.2:9999" -debug -meta="192.168.2.2:9559" > agent.log 2>&1 & 192.168.2.3 nohup ./nebula-agent -agent="192.168.2.3:9999" -debug -meta="192.168.2.3:9559" > agent.log 2>&1 & 192.168.2.4 nohup ./nebula-agent -agent="192.168.2.4:9999" -debug -meta="192.168.2.4:9559" > agent.log 2>&1 & 新集群服务拓扑图: 复制老集群的备份文件到新集群机器下,完成后的拓扑图: 从老集群机器 /usr/local/nebula_backup 拷贝数据到新集群机器 /usr/local/nebula_backup 目录下 (老集群) 选择安装 br 工具的 192.168.1.4 机器执行如下命令进行还原到新集群,这里的 meta 指向新集群机器其中一台 meta 地址,storage 地址为上一步新集群创建的备份地址: ./nebula-br restore full --meta="192.168.2.4:9559" --storage="local:///usr/local/nebula_backup" --name="BACKUP_2023_09_14_13_57_33" 观察日志,不报错的情况下完成了从老集群机器还原到了新集群,可使用 nebula-console 连接新集群查看 space 情况。 新集群 show hosts 情况: 小结 官方其实不推荐 local 模式去做备份还原,操作太过复杂,很容易出错,建议使用 S3 或者 NTF 进行挂载,这样就没必要做老集群拷贝到新集群的工作。 本文正在参加 NebulaGraph 技术社区年度征文活动,征文详情:https://discuss.nebula-graph.com.cn/t/topic/13970 如果你觉得本文对你有所启发,记得给我点个 ❤️ ,谢谢你的鼓励

优秀的个人博客,低调大师

企业级快速开发框架 nbsaas-boot 1.0.14-2023 发布

<parent> <groupId>com.nbsaas.boot</groupId> <artifactId>nbsaas-boot</artifactId> <version>1.0.14-2023</version> </parent> 在这个重要的更新中,我们带来了一系列的功能优化和 bug 修复,旨在提高用户体验并增强框架的稳定性。以下是本次更新的详细内容: 代码生成器优化:我们增加了 BeanExt 和 FormExtField 等注解,以方便扩展 Simple 对象和 Response 对象。这将使得开发者在生成代码时更加灵活,可以根据自己的需求进行扩展。 树形结构类保存时的层级数量问题:我们修复了在此前的版本中,树形结构类的层级数量始终保持为1的 bug。现在,树形结构类的层级数量将正确地根据开发者需要进行保存和显示。 单项目代码生成模块命名混乱问题:我们针对此问题进行了一系列的优化,使得单项目代码生成模块的命名更加规范和清晰,降低开发者在项目中出现命名冲突的概率。 nbsaas-admin 模块功能优化:我们对 nbsaas-admin 模块的部分功能进行了优化,包括但不限于界面交互、性能提升以及用户体验的优化。 nbsaas-boot-starter 模块增加微信支付功能:为了满足更多开发者的需求,我们在基础功能模块 nbsaas-boot-starter 中增加了微信支付功能。现在,开发者只需在项目中引入相应的依赖,即可轻松地使用微信支付功能。 nbsaas-admin-vue3 视图页面优化:我们对 nbsaas-admin-vue3 的视图页面进行了优化,以提供更流畅、更直观的用户体验。包括页面加载速度的提升、界面布局的优化以及交互效果的改进。 boot-nbsaas 具有以下特点: 自动建表:boot-nbsaas 提供了自动建表功能,根据用户定义的数据模型自动生成数据库表结构,减少手动操作,提高开发效率。 开发规范:boot-nbsaas 提供一套开发规范,包括代码风格、命名规范、注释规范等,使团队开发更加规范化和高效化。 代码生成器:boot-nbsaas 提供代码生成器,根据数据模型自动生成前端和后端代码,提高开发效率和代码质量。 多租户支持:boot-nbsaas 支持多租户,为不同客户提供独立的数据存储空间和访问权限,保证数据安全性和隔离性 通过 Command 处理复杂的业务 InputRequestObject context = new InputRequestObject(); context.setConfig(config); context.setFormBean(formBean); new DomainCommand() .after(new ApiCommand()) .after(new ConvertCommand()) .after(new ControllerFrontCommand()) .after(new RestCommand()) .after(new ExtApiCommand()) .after(new RepositoryCommand()) .after(new FieldCommand()) .after(new FinishCommand()).execute(context); 模型构建 @CatalogClass @FormAnnotation(title = "组织架构管理", model = "组织架构", menu = "1,27,88") @Data @Entity @Table(name = "sys_structure") public class Structure extends CatalogEntity { @FormField(title = "父分类名称") @Comment("父分id") @FieldName @FieldConvert(classType = "Integer") @ManyToOne(fetch = FetchType.LAZY) private Structure parent; @OneToMany(fetch = FetchType.LAZY, mappedBy = "parent") private List<Structure> children; } 通过模型数据提取,然后通过代码生成器生成后端代码 + vue3 后端管理代码 基础功能项目 https://gitee.com/cng1985/nbsaas-boot-starter 项目脚手架 https://gitee.com/cng1985/nbsaas-admin vue3 后台管理脚手架 https://gitee.com/cng1985/nbsaas-admin-vue3

优秀的个人博客,低调大师

潦草手写体也能轻松识别,快速提取文字不用愁

基于文本识别(OCR)技术的成熟与应用,日常生活中的大部分“印刷体识别”需求都能被满足,替代了人工信息录入与检测等操作,大大降低输入成本。 而对于复杂的手写体识别需求,业界识别质量却参差不齐。大部分手写体存在字迹潦草,排版不固定,背景复杂,且不同的字体风格各异等问题,给手写体识别带来极大的挑战,不过华为HMS Core机器学习服务的OCR文字识别技术可以帮助解决识别问题。 华为HMS Core 机器学习服务基于OCR识别技术推出最新手写体识别能力,使用拍照设备将纸质信息转化为图片,对图片中横排的手写中文、英文、阿拉伯数字等符号进行检测和识别,支持印刷体识别、手写体识别、行间混排等,可以精准返回手写体和印刷体的类别。同时,对字迹潦草、连笔等情况和试卷、书信等场景进行专项优化,识别准确率可达95%以上。 效果演示: 应用场景: 由于手写体字迹的随意性很大,如背景繁杂、字体大小不一、角度倾斜等,这些问题都有可能直接影响到字符的识别准确率。 基于此,HMS Core 机器学习服务通过海量样本集训练来提升其鲁棒性,不管是浅色背景、田字格、米字格、四方格,还是在有下划线的情况下,识别准确率均可达95%以上,同时支持45°倾斜字体的识别。 手写体识别具有很强的实用性,可广泛应用于试卷批改、笔记电子化、大规模的数据统计如人口普查、信息登记等场景中。 1.智能批改 使用手写体识别技术,对学生日常作业、考试试卷中的手写内容进行自动识别,实现学生作业、考卷的线上批改,大幅提升教师的工作效率和质量。 2.笔记电子化 针对纸质手写文档、手写笔记等内容,同时支持墨水屏识别,实现对手写文字内容的扫描及存储。 开发者只需集成手写体识别服务,就可以将手写纸质文档、笔记、发票等图片中的文字转换成文本格式,供文字处理软件进一步编辑加工。有了它,即使是潦草、模糊的手写信息也能够识别,可以有效解决人工录入速度慢、易出错的问题,从而大大节约时间成本,提高录入效率。 总之,不管是印刷体,还是手写体,HMS Core机器学习服务都能准确识别,开发者们可以根据自己的业务需求自主选择。 了解更多详情>> 访问华为开发者联盟官网 获取开发指导文档 华为移动服务开源仓库地址:GitHub、Gitee 关注我们,第一时间了解 HMS Core 最新技术资讯~

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册