CTK框架介绍和环境搭建

2023-11-20

CTK框架介绍和环境搭建

概述

本人第一次接触CTK的时候是看的一去、二三里大佬的博客。

  1. CTK框架实际应用比较可靠,但网上资料很少,官网提供的API链接也已经无法打开了,目前还没有找到很好的官方的使用介绍。
  2. 网上目前找到的CTK的介绍或者是博客都没有非常具体的项目,都是一些简单的demo。
  3. 按照下面列出的参考的文档和大佬们的博客,来写代码的时候会碰到一些奇奇怪怪的问题,我这里也是重写一下这个框架的介绍和基本的使用方法,方便后来的人使用。

本篇文章参考的: 来唧唧歪歪

环境准备

CTK介绍

CTK 为支持生物医学图像计算的公共开发包,其全称为 Common Toolkit。CTK插件框架的设计有很大的灵感来自OSGi并且使得应用程序由许多不同的组件组合成一个可扩展模型。这个模型允许通过那些组件间共享对象的服务通信。

当前,CTK 工作的主要范围包括:

  • DICOM:提供了从 PACS 和本地数据库中查询和检索的高级类。包含 Qt 部件,可以轻松地设置服务器连接,并发送查询和查看结果。
  • DICOM Application Hosting:目标是创建 DICOM Part 19 Application Hosting specifications 的 C++ 参考实现。它提供了用于创建主机和托管应用程序的基础设。
  • Widgets:用于生物医学成像应用的 Qt Widgets 集合。
  • Plugin Framework:用于 C++ 的动态组件系统,以 OSGi 规范为模型。它支持一个开发模型,在这个模型中,应用程序(动态地)由许多不同(可重用的)组件组成,遵循面向服务的方法。
  • Command Line Interfaces:一种允许将算法编写为自包含可执行程序的技术,可以在多个终端用户应用程序环境中使用,而无需修改。

使用 CTK Plugin Framework 的好处

由于 CTK Plugin Framework 基于 OSGi,因此它继承了一种非常成熟且完全设计的组件系统,这在 Java 中用于构建高度复杂的应用程序,它将这些好处带给了本地(基于 Qt 的)C++ 应用程序,并适应于 CTK Plugin Framework:。

以下内容摘自 《OSGi官方文档》 (aliyun.com),并且做了一定的修改:

  • 降低复杂性

    使用 CTK Plugin Framework 开发意味着开发插件,它们隐藏了内部实现,并通过定义良好的服务来和其它插件通信。隐藏内部机制意味着以后可以自由地更改实现,这不仅有助于 Bug 数量的减少,还使得插件的开发变得更加简单,因为只需要实现已经定义好的一定数量的功能接口即可。

  • 复用

    使用 CTK Plugin Framework 开发意味着,我们可以规定标准化的组件模型,使得在应用程序中使用第三方组件变得非常容易。

  • 现实情况

    CTK Plugin Framework 是一个动态框架,它可以动态地更新插件和服务。在现实世界中,有很多场景都和动态服务模型相匹配。因此,应用程序可以在其所属的领域中重用 Service Registry 的强大基元(注册、获取、用富有表现力的过滤语言列表、等待服务的出现和消失)。这不仅节省了编写代码,还提供了全局可见性、调试工具以及比为专用解决方案实现的更多的功能。在这样的动态环境下编写代码听起来似乎是个噩梦,但幸运的是,有支持类和框架可以消除大部分(如果不是全部的话)痛苦。

  • 开发简单

    CTK Plugin Framework 不仅仅是组件的标准,它还指定了如何安装和管理组件。标准化的管理 API 使得在现有和未来的系统中集成 CTK Plugin Framework 变得非常容易。

  • 动态更新

    CTK Plugin Framework 组件模型是一个动态模型,插件可以在不关闭整个系统的情况下被安装、启动、停止、更新和卸载。

  • 自适应

    OSGi 组件模型是从头设计的,以允许组件的混合和匹配。这就要求必须指定组件的依赖关系,并且需要组件在其可选依赖性并不总是可用的环境中生存。Service Registry 是一个动态注册表,其中插件可以注册、获取和监听服务。这种动态服务模型允许插件找出系统中可用的功能,并调整它们所能提供的功能。这使得代码更加灵活,并且能够更好地适应变化。

  • 透明性

    插件和服务在CTK 插件环境中是最高级的。管理 API 提供了对插件的内部状态的访问,以及插件之间的连接方式。可以停止部分应用程序来调试某个问题,或者可以引入诊断插件。

  • 版本控制

    在 CTK Plugin Framework 中,所有的插件都经过严格的版本控制,只有能够协作的插件才会被连接在一起。

  • 简单

    CTK 插件相关的 API 非常简单,核心 API 不到 25 个类。这个核心 API 足以编写插件、安装、启动、停止、更新和卸载它们,并且还包含了所有的监听类。

  • 懒加载

    懒加载是软件中一个很好的点,OSGi 技术有很多的机制来保证只有当类真正需要的时候才开始加载它们。例如,插件可以用饿汉式启动,但是也可以被配置为仅当其它插件使用它们时才启动。服务可以被注册,但只有在使用时才创建。这些懒加载场景,可以节省大量的运行时成本。

  • 非独占性

    CTK Plugin Framework 不会接管整个应用程序,你可以选择性地将所提供的功能暴露给应用程序的某些部分,或者甚至可以在同一个进程中运行该框架的多个实例。

  • 非侵入

    在一个 CTK 插件环境中,不同插件均有自己的环境。它们可以使用任何设施,框架对此并无限制。CTK 服务没有特殊的接口需求,每个 QObject 都可以作为一个服务,每个类(也包括非 QObject)都可以作为一个接口。

CTK的项目结构

我这里使用的是CMake对项目进行管理的,因此我这边直接贴出CMake代码

主项目的代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.19)
project(CTKPlugin)
# debug需要覆盖对应的dll, 并且需要删除configuration文件夹,让它重新生成
# 指定C++标准
set(CMAKE_CXX_STANDARD 17)
# 指定输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/output)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/output)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/output)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/output)
# 自动编译QT文件
# set(CMAKE_PREFIX_PATH "C:/Qt/6.5.1/msvc2019_64")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
# 开启包含当前编译目录
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 指定QT版本和对应的库
set(QT_VERSION 5)
set(REQUIRED_LIBS Core Gui Widgets OpenGL Sql
#        Core5Compat
        )
set(REQUIRED_LIBS_QUALIFIED Qt${QT_VERSION}::Core Qt${QT_VERSION}::Gui Qt${QT_VERSION}::Widgets Qt${QT_VERSION}::OpenGL Qt${QT_VERSION}::Sql
#        Qt${QT_VERSION}::Core5Compat
        )
# 包含的插件项目目录
add_subdirectory(core)
# 寻找QT库
find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)
# 包含的头文件目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src
        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/CTK/include/ctk-0.1
        ${CMAKE_CURRENT_SOURCE_DIR}/third_party/qmqtt/include
        )
# 需要编译的头文件
file(GLOB HEADERS
        ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h
        )
# 需要编译的cpp文件
file(GLOB SOURCES
        ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp
        )
# 需要编译的ui文件
file(GLOB UIS
        ${CMAKE_CURRENT_SOURCE_DIR}/src/*.ui
        )
# 根据不同的模式加载不同的CTK库(DEBUG和RELEASE)
if (CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
    file(GLOB LIB_CTK ${PROJECT_SOURCE_DIR}/third_party/CTK/libd/ctk-0.1/*.lib)
    link_directories(${PROJECT_SOURCE_DIR}/third_party/CTK/libd/ctk-0.1)
else ()
    file(GLOB LIB_CTK ${PROJECT_SOURCE_DIR}/third_party/CTK/lib/ctk-0.1/*.lib)
    link_directories(${PROJECT_SOURCE_DIR}/third_party/CTK/lib/ctk-0.1)
endif ()
# 指定格式为utf-8
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
# 使用指定的源文件来生成目标可执行文件
add_executable(${PROJECT_NAME} WIN32 main.cpp ${HEADERS} ${SOURCES} ${UIS})
target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBS_QUALIFIED} ${LIB_CTK} ${LIB_MQTT})

main.cpp

#include <QApplication>
#include <iostream>
#include <QStyleFactory>
#include <QDir>
#include <QDirIterator>
#include "ctkPluginFrameworkFactory.h"
#include "ctkPluginFramework.h"
#include "ctkPluginException.h"
#include "ctkPluginContext.h"
#include "ctkPluginFrameworkLauncher.h"
#include "imainwindow.h"

int main(int argc, char* argv[])
{
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);
    app.setApplicationName("ctktest");
    QString path = QCoreApplication::applicationDirPath();
    // 在插件的搜索路径列表中添加一条路径
#ifdef _DEBUG
    ctkPluginFrameworkLauncher::addSearchPath(path + "/libs/debug");
#else
    ctkPluginFrameworkLauncher::addSearchPath(path + "/libs/release");
#endif // _DEBUG
    // 设置并启动 CTK 插件框架
    try {
        ctkPluginFrameworkLauncher::start("org.commontk.eventadmin");
    }
    catch (ctkException e)
    {
        std::cout << e.message().toStdString() << std::endl;
    }
    // 启动插件工厂
    ctkPluginFrameworkFactory* ctkFrameWorkFactory = new ctkPluginFrameworkFactory;
    QSharedPointer<ctkPluginFramework> framework= ctkFrameWorkFactory->getFramework();
    try{
        framework->init();
        framework->start();
    }
    catch(const ctkPluginException& e)
    {
        std::cout << "framework init fail" << std::endl;
    }
    return app.exec();
}

以上只要可以将插件的工厂正常启动则表示插件库加载完成。

注意: ctkPluginFrameworkFactory* ctkFrameWorkFactory = new ctkPluginFrameworkFactory;

这边我看基本上所有的教程中都是这么写的ctkPluginFrameworkFactory ctkFrameWorkFactory而我这边给换成了指针。这个是一个小坑,我踩了因此这边也给到一个特殊标注。如果是使用的临时变量,临时变量在main函数退出的时候会析构,这里可能是因为ctkFrameWorkFactory析构太早的问题,导致整个程序在最后退出的时候崩溃,如果换成指针则让程序完成退出之后收回内存,这样不会产生因ctkFrameWorkFactory析构而退出崩溃的问题。

或者是什么其他原因呢?这个地方有没有大佬可以帮忙指正一下,因为除了这种方式以外,我没有找到比较好的方式去解决这个问题造成的崩溃。

Core插件的代码

Core插件和主程序的CMake在同级目录即可。

CMakeLists.txt

cmake_minimum_required(VERSION 3.19)
project(Core)
#指定C++标准
set(CMAKE_CXX_STANDARD 17)
#指定输出目录,这里将插件输出到统一的目录方便后续的加载工作
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../output/plugins)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../output/plugins)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../output/plugins)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../output/plugins)
#自动编译QT文件
#set(CMAKE_PREFIX_PATH "C:/Qt/6.5.1/msvc2019_64")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
#开启包含当前编译目录
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#指定QT版本和对应的库
set(QT_VERSION 5)
set(REQUIRED_LIBS Core Gui Widgets Network WebEngineCore WebEngineWidgets
#        Core5Compat
        )
set(REQUIRED_LIBS_QUALIFIED Qt${QT_VERSION}::Core Qt${QT_VERSION}::Gui Qt${QT_VERSION}::Widgets Qt${QT_VERSION}::Network Qt${QT_VERSION}::WebEngineCore Qt${QT_VERSION}::WebEngineWidgets
#        Qt${QT_VERSION}::Core5Compat
        )
#寻找QT库
find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)
# 这里又包含了一个子项目
add_subdirectory(QCodeEditor)

include_directories(src
        ../third_party/CTK/include/ctk-0.1
        ../third_party/qadvance/include
        QCodeEditor/include
        )
file(GLOB HEADERS
        src/*.h
        )
file(GLOB SOURCES
        src/*.cpp
        )

file(GLOB UIS
        src/*.ui
        )
# 指定格式为utf-8
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")

if (CMAKE_BUILD_TYPE AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
    file(GLOB LIB_CTK ${PROJECT_SOURCE_DIR}/../third_party/CTK/libd/ctk-0.1/*.lib)
    link_directories(${PROJECT_SOURCE_DIR}/../third_party/CTK/libd/ctk-0.1)
    file(GLOB LIB_ADVANCEDOC ${PROJECT_SOURCE_DIR}/../third_party/qadvance/libd/*.lib)
    link_directories(${PROJECT_SOURCE_DIR}/../third_party/qadvance/libd)
else ()
    file(GLOB LIB_CTK ${PROJECT_SOURCE_DIR}/../third_party/CTK/lib/ctk-0.1/*.lib)
    link_directories(${PROJECT_SOURCE_DIR}/../third_party/CTK/lib/ctk-0.1)
    file(GLOB LIB_ADVANCEDOC ${PROJECT_SOURCE_DIR}/../third_party/qadvance/lib/*.lib)
    link_directories(${PROJECT_SOURCE_DIR}/../third_party/qadvance/lib)
endif ()

#使用指定的源文件来生成目标可执行文件
add_library(${PROJECT_NAME} SHARED resources.qrc resources2.qrc ${HEADERS} ${SOURCES} ${UIS})
target_link_libraries(${PROJECT_NAME} ${REQUIRED_LIBS_QUALIFIED} ${LIB_CTK} ${LIB_ADVANCEDOC} QCodeEditor)

本篇文章先写到这,后续会出更加详细的介绍

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CTK框架介绍和环境搭建 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 最新网络工程毕设选题题目推荐

    文章目录 0 简介 1 如何选题 2 最新网络工程选题 2 1 Java web SSM 系统 2 2 大数据方向 2 3 人工智能方向 2 4 其他方向 4 最后 0 简介 学长搜集分享最新的网络工程专业毕设毕设选题 难度适中 适合作为毕
  • python爬虫,多线程与生产者消费者模式

    使用队列完成生产者消费者模式 使用类创建多线程提高爬虫速度 https sc chinaz com tupian index html https sc chinaz com tupian index 2 html https sc chi
  • elasticsearch 安装教程

    一 jdk安装 es要求jdk版本在1 8以上 所以先安装jdk1 8 安装步骤 1 安装完Centos6 5的Base Server版会默认安装OpenJDK 首先需要删除OpenJDK 命令 rpm qa grep java 显示如下
  • 头条员工自爆:拿遍BAT和TMD的offer,面试过于NB!

    最近看到一位今日头条员工在脉脉发帖称 最近两次找工作 BAT TMD的offer几乎拿了个遍 但一般一家只能待两年 原因是面试的时候表现过于NB 导致下家对自己期望值过高 实际工作中面临的阻力很大的时候就会退缩 自己的能力项可能是面试 每次
  • Android 网络管理

    系统中对网络的判断和选在是在Connectivityervice这个服务中来处理的 在系统启动的时候会启动这个系统服务 系统启动完毕后 ConnectivityService在系统启动的时候就启动了 在android内部 用framewor
  • 如何学好C语言的数据结构与算法?

    C语言的数据结构与算法 难就难在链表 学会了链表 可能后面就一点都不难了 书籍推荐 数据结构与算法分析 C语言描述版 要深入学习的话可以选择这本书 因为针对链表的讲解是比较详细的 所以可以很快理解链表 跟着书上一点点实现基本操作 增删改查
  • Vue中的过滤器

    过滤器 定义 对要显示的数据进行特定格式化后再显示 适用于一些简单逻辑的处理 语法 1 注册过滤器 Vue filter name callback 全局 或 new Vue filters 局部 2 使用过滤器 xxx 过滤器名 或 v
  • 动态修改日志级别,太有用了!

    首发于公众号 BiggerBoy 背景 我们在系统中一般都会打印一些日志 并且在开发 测试 生产各个环境中的日志级别可能不一样 在开发过程中为了方便调试打印了很多debug日志 但是生产环境为了性能 为了节约存储资源 我们会将日志级别设置为
  • linux shell进行数值计算

    出于项目需要 需要用脚本执行计算 最简单的方法1 这里写算式 可以写变量 Desktop cat test sh a 102 c a 123 echo a a echo a 123 c Desktop test sh a 102 a 123
  • 【软件测试】用例篇

    一 什么是测试用例 测试用例 向被测试系统发起的一组集合 这组集合包含测试数据 测试步骤 测试平台 预期结果 二 为什么在测试前要设计测试用例 三 基于需求设计测试用例 3 1测试是我们测试人员进行测试的依据 3 2测试人员首先要分析需求
  • A-LOAM总结-(前端+后端)算法流程分析

    文章目录 scanRegistration cpp 雷达信息预处理进程 laserOdometry cpp laserMapping cpp A LOAM算法流程 主要运行以下3个cpp文件 流程框图在文末 scanRegistration
  • (C语言)输出数组的最大值及其对应下标的最小值

    本题源自pintia cn 题目要求 代码 测试结果图 PTA测试结果 题目要求 本题要求编写程序 找出给定的n个数中的最大值及其对应的最小下标 下标从0开始 输入格式 输入在第一行中给出一个正整数n 1
  • 为什么学完Python后的薪资这么高?

    人工智能和大数据概念的兴起 带动了Python的快速增长 Python语言逻辑简洁 入门简单 生态丰富 几乎成为几个新兴领域的不二选择 而除了这两个领域 Python还有更多的适用领域 爬虫 web 自动化运维等领域都非常适合Python发
  • 详细的Python Flask的操作

    本篇文章是Python Flask 建站框架入门课程 编程实战微课 w3cschool微课的学习笔记 根据课程整理而来 本人使用版本如下 Python 3 10 0 Flask 2 2 2 简介 Flask是一个轻量级的可定制的web框架
  • 推荐|5种商业AI产品的技术架构设计!

    来源 达观数据 概要 今天我们就特别推荐达观数据的几个商业产品设计技术架构 希望对于广大技术有帮助 做任何一个商业产品设计 技术架构都是首先要考虑的 特别是面对海量数据的AI商业项目更是如此 今天我们就特别推荐达观数据的几个商业产品设计技术
  • Vue中key

    相信很多小伙伴跟我一样在使用v for的时候对key值的存在和必要性有疑问 通过ESlint进行代码检查的时候不加上key还会报错 想知道key为什么存在可以先想想key为什么产生 会不会是尤雨溪灵光一闪就给Vue添加上了key 也有可能
  • 大数据简介

    预备篇 目录 知识 大数据简介 计算机单位 大数据的五个 v Hadoop Hadoop概述 Hadoop的历史 Hadoop三大发行版本 1 Apache Hadoop 2 Cloudera Hadoop 3 Hortonworks Ha
  • 野外偷拍_野外紧急设计

    关于本系列 本系列文章旨在为人们经常讨论但难以捉摸的软件体系结构和设计概念提供新的视角 通过具体的示例 尼尔 福特为您提供了进化架构和紧急设计的敏捷实践的坚实基础 通过将重要的架构和设计决策推迟到最后一个负责任的时刻 可以防止不必要的复杂性
  • 武汉大学空间智能化处理复习

    空间数据处理智能化的重要性 提高地理信息处理的效率 减轻人在地理信息处理中的劳动量 使一般的地理信息用户也能让专家一样解决问题 大型的空间决策服务需要归纳 分析多种方案 智能化处理方法的来源 常常来自于人工智能学科的研究成果 如 知识工程
  • CTK框架介绍和环境搭建

    CTK框架介绍和环境搭建 概述 本人第一次接触CTK的时候是看的一去 二三里大佬的博客 CTK框架实际应用比较可靠 但网上资料很少 官网提供的API链接也已经无法打开了 目前还没有找到很好的官方的使用介绍 网上目前找到的CTK的介绍或者是博