当前位置: 首页 > news >正文

REDHAWK——连接(续)

文章目录

  • 前言
  • 一、突发 IO
    • 1、数据传输
      • ①、输入
      • ②、输出
    • 2、突发信号相关信息 (SRI)
    • 3、多输出端口
    • 4、使用复数数据
      • ①、在 C++ 中转换复数数据
    • 5、时间戳
    • 6、端口统计
      • ①、C++
  • 二、消息传递
    • 1、消息生产者
      • ①、创建一个消息生产者
      • ②、发送消息
    • 2、消息消费者
      • ①、创建消息消费者
      • ②、注册接收消息
    • 3、查看消息
    • 4、连接生产者和消费者
    • 5、连接回调
      • ①、C++
    • 6、自定义 IDL 接口
      • ①、连接反馈
      • ②、连接选择
      • ③、方法映射
      • ④、读取属性
      • ⑤、写入属性


前言

续上文


一、突发 IO

对于那些需要小型且可能是非连续的数据块(或突发)以及频繁变化的元数据的应用程序,突发输入/输出(BurstIO)提供了满足这些要求的数据传输容器和接口。这个接口仅支持数据向量的传输:float, double, octet (int8/uint8), short (int16), ushort (uint16), long (int32), ulong (uint32), longlong (int64), 和 ulonglong(uint64)。与批量输入/输出(BulkIO)类似,BurstIO 提供了突发信号相关信息(SRI)和精确时间戳,但是它通过每个数据突发中的带内信息提供这些信息。由于元数据的增加的开销要求,通过将多个突发分组为单次传输,无论是通过编程还是通过可配置的策略设置,BurstIO 可以实现其最高吞吐量,以尝试最大化效率并限制延迟

1、数据传输

突发输入/输出(BurstIO)数据传输通过 REDHAWK 资源(组件或设备)的 BurstIO 端口对象的 pushBurst()pushBursts() 方法调用来实现。资源可以使用这些 push 方法将突发及其关联的元数据从一个资源传输到另一个资源,这一过程在资源的服务功能内进行。与批量输入/输出(BulkIO)相似,BurstIO 接口为突发的每个数据向量提供相同的 BULKIO::PrecisionUTCTime 时间戳。BurstIO 定义了一个新的 BurstSRI 信号相关信息(SRI)对象,使开发人员能够进一步描述信号环境和数据转换。这些字段在突发信号相关信息(SRI)中有进一步的描述。

①、输入

拥有提供端口(输入端口)的资源,使用 getBurst() 方法从端口抓取数据。此方法从输入端口的数据队列返回一个 PacketType 对象(在突发包访问器中描述),如果队列为空,则返回 null/None 值。

以下代码片段是 getBurst() 方法的一个示例。

/**Grab data from the port's getBurst method*/
burstio::BurstShortIn::PacketType *pkt;
pkt = inShortPort->getBurst( bulkio::Const::NON_BLOCKING );// check if a valid packet was returned
if ( pkt == NULL ) {return NOOP;
}// check for EOS
if ( pkt->getEOS() ) {outShortPort->pushBurst(pkt->getSequence(), pkt->getSRI(), pkt->getEOS());
}...  perform algorithm on the data: pkt->getData() ... or pkt->getSequence()

在这里插入图片描述

②、输出

由于 BurstIO 数据的异步性,该接口使开发者能够控制从资源中输出(输出)突发。将突发数据从一个资源推送到另一个资源的两个主要方法调用是:pushBursts()pushBurst()pushBursts() 允许直接将多个突发作为 BurstType 对象的序列直接下游发送而 pushBurst() 提供了一个接口来排队推送单个突发,但根据突发的数量、总队列大小和发送间隔遵循策略指令。这两种方法都使用指定的路由约束和连接过滤器路由突发数据,这些可以通过以下接口控制:

// this route streams with Stream ID == "data-stream-one" to a connection
// identified as "connection-one"
shortBurstPort->addConnectionFilter("data-stream-one", "connection-one");

或者:

// update connection filter using the Component's connection property
// "myConnectionTable"
shortBurstPort->updateConnectionFilter(myConnectionTable);// this sets the stream filter to only route streams to specific connections
shortBurstPort->setRoutingMode(burstio::ROUTE_CONNECTION_STREAMS);

在这里插入图片描述
pushBurst()pushBursts() 方法之间的主要区别在于管理数据传输的方式和时间的能力。只有使用 pushBurst() 排队的突发流量受到策略约束的控制,而对 pushBursts() 的调用则直接发送到下游连接的资源。

// this method will limit the maximum number of bursts that
// can be queued  before they are sent
shortBurstPort->setMaxBursts(size_t count);// this method will enable threshold monitoring for the amount of sample
// data that exceeds this limit before sending data downstream
shortBurstPort->setByteThreshold(size_t bytes);// this method will enable the latency time between the sending of
// available data downstream
shortBurstPort->setLatencyThreshold( long usec );

以下代码片段是一个使用 pushBurst() 方法调用将向量数据样本排队到端口的示例。

std::vector< BurstShortOut::NativeType > data;
my_transform(data);BURSTIO::BurstSRI  sri;
burstio::BurstShortOut::BurstType burst;
burst.SRI = sri;
burst.EOS = false;
burst.T = burstio::utils::now();
burst.data.length(data.size());
for(int i=0; i< data.size(); i++ ) burst.data[i] = data[i];// this queues a single burst
shortBurstPort->pushBurst( burst );// orstd::vector< BurstShortOut::NativeType > data;
my_transform(data);// this queues a single burst
shortBurstPort->pushBurst( data, sri, burstio::utils::now() );

以下代码片段是一个使用 pushBursts() 方法调用的向量数据样本的示例。此调用中的突发直接传递到下游的连接资源。

std::vector< BurstShortOut::NativeType > data;
my_transform(data);BurstShortOut::BurstSequenceType bursts;
bursts.length(1);
burstio::BurstShortOut::BurstType burst;
burst.SRI = sri;
burst.EOS = false;
burst.T = burstio::utils::now();
burst.data.length(data.size());
for(int i=0; i< data.size(); i++ ) burst.data[i] = data[i];
bursts[0] = burst;// this pushes the burst directly downstream because
// it is a sequence of bursts
shortBurstPort->pushBursts(bursts);

2、突发信号相关信息 (SRI)

BurstSRI 对象随每个数据突发一起传送,并描述数据生产者的数据负载和处理状态。下表仅描述了在资源之间传递突发数据时数据结构的必需字段。
在这里插入图片描述

3、多输出端口

每个输出突发输入/输出(BurstIO)端口类型都提供了基于流 ID 和连接 ID 过滤来自资源的突发数据的能力。要使用端口的多出能力,资源必须包含类似于以下的代码:

<structsequence id="connectionTable"><struct id="connectionTable::connection_descriptor"name="connection_descriptor"><simple id="connectionTable::connection_id" name="connection_id"type="string"><kind kindtype="configure"/></simple><simple id="connectionTable::stream_id" name="stream_id" type="string"><kind kindtype="configure"/></simple><simple id="connectionTable::port_name" name="port_name" type="string"><kind kindtype="configure"/></simple></struct><configurationkind kindtype="configure"/>
</structsequence>

为了将特定的数据流引导到特定的连接,需要将 connectionTable 对象传递给端口的 updateConnectionFilter 方法。当路由模式设置为 ROUTE_CONNECTION_STREAMS 时,端口将会将过滤状态应用于通过资源的 BurstIO 端口传出的任何突发流量。要将突发传递给现有连接,端口的过滤器表中必须存在与下游资源的突发的流 ID 和连接 ID 匹配的项。

4、使用复数数据

每个传入数据的 BurstPacket 提供了 getComplex()` 方法,以表示向量是否包含复数样本(它由实部和虚部组成)。复数数据以交替的实部和虚部值发送。开发者可以以任何方式处理这些数据;然而,本节描述了将数据转换为更易于处理形式的常用方法。

①、在 C++ 中转换复数数据

在 C++ 中,传入的突发输入/输出(BurstIO)数据向量可以被强制转换为复数值的 std::vector。例如:

BurstShortIn::BurstPacket *pkt = myShortPort->getPacket(bulkio::Const::BLOCKING);
if ( pkt->isComplex() ) {BurstShortIn::ComplexType cplx_data = pkt->getComplexData();// ... do some processing with cplx_data
}

5、时间戳

以下代码段提供了一个示例,展示如何构造一个要在突发信号相关信息(SRI)中发送的 BULKIO::PrecisionUTCTime 时间戳。

/*** To create a time stamp from the current time of day*/BULKIO::PrecisionUTCTime tstamp = burstio::utils::now();

6、端口统计

所有突发输入/输出(BurstIO)端口支持批量输入/输出(BulkIO)统计接口,并添加了跟踪特定于突发的指标的额外关键词。统计数据是在 10 次 pushBurst 调用的窗口中跟踪的。输入端口包含单个 PortStatistics 结构,而输出端口包含一系列 PortStatistics 结构;每个连接一个结构。有关 BULKIO::PortStatistics 的更多信息,请参见端口统计。输入和输出端口的额外 BurstIO 指标在以下表格中描述:

①、C++

以下示例说明了一个组件,该组件对传入的突发数据进行转换,并将结果向下游推送。

burstio::BurstShortIn::PacketType *pkt;
pkt = inShortPort->getPacket(bulkio::Const::NON_BLOCKING);// check if a valid packet was returned
if ( pkt == NULL ) {return NOOP;
}// check for EOS
if ( pkt->getEOS() ) {outShortPort->pushBurst(pkt->getSequence(), pkt->getSRI(), pkt->getEOS());
}// do some processing.....to the burst contents
BurstShortOut::SequenceType  data =  do_some_magic(pkt->getSequence());// we changed the data so calc new time stamp....
BULKIO::PrecisionUTCTime newTS = calc_timestamp(pkt->getTime());  outShortPort->pushBurst(data, pkt->getSRI(), newTS, pkt->getEOS());

二、消息传递

消息传递依赖于 CORBA 的事件结构作为传输结构。在 CORBA 的事件 API 中,消息通过使用函数 push() 以 Any 类型传递。

虽然 CORBA 管理数据的编组和传递,但它并未提供任何固有于事件的机制来描述 Any 类型的内容。REDHAWK 决定利用现有的负载结构描述符来描述消息的负载,即属性接口描述语言(IDL)。选择此接口消除了创建描述消息的新 IDL 的需要。此外,已有一种 XML 结构映射到高效的二进制数据结构,允许使用 XML 来描述消息内容,同时消除了在消息传递机制中引入 XML 解析器的需要。

为了支持这项额外功能,REDHAWK 扩展了属性描述符,允许属性具有消息类型。唯一可以具有有效消息类型的属性是结构。

1、消息生产者

在创建新组件或编辑现有组件时,可以创建一个消息生产者。创建消息生产者后,您必须注册您的代码,以便从端口发送消息。以下程序解释了如何创建消息生产者并发送消息。

①、创建一个消息生产者

使用 REDHAWK IDE 向组件或设备添加消息生产者端口,请遵循以下步骤:

  • 1)从项目资源管理器视图中,双击组件的软件包描述符(SPD)文件。此时将显示组件编辑器。

  • 2)在组件编辑器中,选择“属性”标签。组件编辑器的属性标签页将被显示。
    在这里插入图片描述

  • 3)要添加结构属性,请点击“添加结构”。此时将显示属性标签的结构属性部分。
    在这里插入图片描述

  • 4)在结构属性部分,输入产生的消息的名称。ID 默认为您输入的名称。从“类型(Kind)”下拉菜单中,选择“消息(message)。
    在这里插入图片描述

  • 5)在“所有属性(All Properties)”部分,选择您添加的结构属性。默认情况下,已经存在一个简单成员。您可以修改它并为结构属性创建额外的成员。有关属性结构、类型和种类的更多信息,请参考管理和定义属性。修改和/或创建这些成员后,结构的成员和相应的属性信息将被显示。
    在这里插入图片描述

  • 6)选择“端口(Ports)”标签,点击“添加(Add)”,并在“名称(Name)”字段中输入名称。在“端口详情(Port Details)”部分,在“方向(Direction)”下拉菜单中选择“出(out )”。在“接口(Interface)”字段旁,点击“浏览(Browse)”。将显示“选择接口(Select an Interface)”对话框。从显示的接口列表中,选择“ExtendedEvent> MessageEvent”并点击“确定(OK)”。此时将显示消息生产者端口的信息。
    在这里插入图片描述

  • 7)重新生成组件。创建消息生产者后,您可以从消息生产者端口发送消息。

②、发送消息

以下代码示例演示了如何在 C++中从组件的消息输出端口向事件通道或另一个组件的消息输入端口发送外发消息。

出于以下示例的目的,假设结构如下:

  • id: foo
  • 包含两个成员:
    • name: some_string, type: string
    • name: some_float, type: float
  • 组件的 uses 端口称为 message_out
  • 组件的名称是 message_producer
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在每个示例中,通过声明该类型的变量来创建消息。然后,设置其状态,并使用消息端口的 sendMessage() 方法发送消息,消息变量作为参数。

C++:
要生成消息,可以在实现文件的 serviceFunction() 方法中添加以下代码。

foo_struct my_msg;
my_msg.some_string = "hello";
my_msg.some_float = 1.0;
this->message_out->sendMessage(my_msg);
// Send a message to a specific connection by providing a `connectionId` parameter.
// If `connectionId` does not match any connection, an `std::illegal_argument` exception is thrown.
this->message_out->sendMessage(my_msg, "connection_1");

在这里插入图片描述

2、消息消费者

在创建新组件或编辑现有组件时,可以创建消息消费者。创建消息消费者后,您必须注册您的代码以从端口接收消息。以下程序解释了如何创建消息消费者并注册代码以处理消息。

①、创建消息消费者

流程同上消息生产者流程,与创建消息消费者流程不同之处只是在端口详细信息部分的方向下拉列表中,选择bi-dir<uses/provides>

②、注册接收消息

以下示例解释了如何在 C++中注册代码以处理传入消息。

出于以下示例的目的,假设结构如下:

  • id: foo
  • 包含两个成员:
    • name: some_string, type: string
    • name: some_float, type: float
  • 组件的 uses/provides 端口称为 message_in
  • 组件的此消息的回调函数为 messageReceived()
  • 组件的名称是 message_consumer

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果此组件与消息生产者或事件通道之间存在连接,则以下代码示例将处理传入消息。

任何带有属性 ID foo 的消息都将触发回调函数 messageReceived()。

C++ :
鉴于事件的异步性质,为消费者选择了回调模式。在组件头文件中,声明以下回调函数:

void messageReceived(const std::string &id, const foo_struct &msg);

在这里插入图片描述
在组件源文件中,实现回调函数:

void message_consumer_i::messageReceived(const std::string &id, const foo_struct &msg) {LOG_INFO(message_consumer_i, id<<" "<<msg.some_float<<" "<<msg.some_string);
}

在这里插入图片描述
在构造器(constructor())方法中,注册回调函数:

message_in->registerMessage("foo", this, &message_consumer_i::messageReceived);

在这里插入图片描述

3、查看消息

消息是事件,其有效负载定义与组件属性中的结构相关联。查看消息可以使用用于查看事件的相同技术。
要在终端窗口查看发送到事件通道的事件和消息:

eventviewer <domain name> <event channel>

实用程序的帮助:

eventviewer --help

eventviewer REDHAWK_DEV testchan
示例输出:
在这里插入图片描述
这里出现了错误,还未找到解决办法,待后续找到后修改

4、连接生产者和消费者

生产者和消费者可以点对点连接,也可以通过IDE 中的事件通道连接。将生产者直接连接到消费者不需要应用程序,并且可以在沙箱中完成:

from ossie.utils import sb
sb.catalog()
#['structs_test', 'm_in', 'prop_changes', 'm_out','pass']
prod=sb.launch("m_out")
cons=sb.launch("m_in")
prod.connect(cons)
#True
sb.start()

在这里插入图片描述
这里出现了错误,还未找到解决办法,待后续找到后修改

5、连接回调

在组件中,许多 REDHAWK 中的 Uses 端口类支持在连接建立或断开时进行通知。支持的端口类型和语法因语言而异。

①、C++

在 C++ 中,Bulk 输入/输出(BulkIO)、Burst 输入/输出(BurstIO)和消息 Uses 端口的连接通知机制已标准化。连接和断开回调被注册在端口上。

以下示例假设一个 C++ 组件具有 BulkIO 浮点输出端口,dataFloat_out;然而,对于 BurstIO 和消息端口,语法是相同的。

在组件头文件中,将回调声明为私有成员函数。连接和断开回调都接收单一参数,连接 ID(一个引用的 std::string):

void dataFloatConnected(const std::string& connectionId);
void dataFloatDisconnected(const std::string& connectionId);

在组件源文件中,实现回调函数:

void MyComponent_i::dataFloatConnected(const std::string& connectionId)
{LOG_INFO(MyComponent_i, "New connection " << connectionId << " on dataFloat_out");
}void MyComponent_i::dataFloatDisconnected(const std::string& connectionId)
{LOG_INFO(MyComponent_i, "Disconnected " << connectionId << " on dataFloat_out");
}

然后,在组件 constructor() 中注册回调函数

dataFloat_out->addConnectListener(this, &MyComponent_i::dataFloatConnected);
dataFloat_out->addDisconnectListener(this, &MyComponent_i::dataFloatDisconnected);

addConnect Listener()addDisconnectListener() 接受两个参数:目标对象(通常是this)和一个指向成员函数的指针。

没有必要同时注册连接和断开回调。

6、自定义 IDL 接口

REDHAWK提供前端接口(FEI)和标准核心框架(CF)接口(如 CF::Resource),用于控制实体并促进互操作性。在某些用例中,您可能会发现需要使用自定义接口描述语言(IDL)来控制实体。对于这些用例,您可以在 IDE 中创建自定义 IDL 项目。

将端口从 FEI 接口或自定义 IDL 接口添加到组件或设备中,允许该实体通过 CORBA 控制其他实体。由于这些端口的通用性质,不可能创建像 BulkIO 这样的语言映射,因此交互是通过标准的 CORBA API 进行的,其完整描述超出了本手册的范围。然而,REDHAWK 代码生成器将生成简化与端口交互的端口。以下部分解释了使用(输出)端口的情况,因为它们最有可能被生成,例如,用于控制 FEI 设备。

①、连接反馈

在所有三种支持的语言中,FEI、标准 CF 或自定义 IDL 端口将有所有方法和属性映射到端口,并且端口将委托调用给远程连接。在 REDHAWK 中,端口可能没有连接、有一个连接或多个连接。这些条件中的每一个都可能为使用端口进行通信的人创建问题;例如,如果发送了一个控制请求并且没有连接,那么用户应该被告知请求没有发送到任何地方。

同时,并非所有方法都是相同的。一些方法只在一个方向上推送数据,一些方法有返回值,一些方法有作为指针的参数,需要用信息填充(输出或输入/输出参数)。当调用端口方法并且端口无法进行调用或调用无法明确时(例如,如果存在两个连接并且函数包含返回值),则在用户代码中引发 PortCallError。下表描述了满足的方法签名标准及其对应的行为。
在这里插入图片描述
如果一个方法作为其非异常 API 的一部分有任何形式的返回值(表现为非 void 返回值,或一个输出或输入/输出参数),那么如果端口有多于一个的连接,就会引发一个异常。此外,如果尝试调用时实际上没有连接,就会引发一个错误。

②、连接选择

虽然当所需的连接不明确时,生成的端口类会触发一个错误,但它也包含一个 API,允许开发者选择应该使用哪个连接。每个方法都有一个可选参数,connection_id,允许调用者明确应该使用哪个连接。默认值行为将使用最后建立的连接。如果指定的 connection_id 不存在,将引发 PortCallError。

在以下部分中,用于明确连接的相同模式在所有三种支持的语言中都提供了。

以下代码示例使用调用 CF::File 接口的 read 方法时的默认行为。

 CF::OctetSequence_var _data = new CF::OctetSequence();CF::OctetSequence_out data(_data);this->file_out->read(data, 10); // read 10 characters from the last connection made to the port

以下代码示例将读取调用明确指向一个特定的连接,connection1。

 CF::OctetSequence_var _data = new CF::OctetSequence();CF::OctetSequence_out data(_data);this->file_out->read(data, 10, "connection1"); // read 10 characters from the connection called "connection1"

要查看可用的连接,请使用以下代码:

 std::vector<std::string> _connection_ids = this->file_out->getConnectionIds();

③、方法映射

方法名称映射遵循在连接选择中描述的模式;即方法名称与 IDL 中描述的名称相同,但增加了一个额外的参数(可选地使用),可以指定应使用哪个连接。属性被映射为对 CORBA 对象的函数。REDHAWK 提供额外的 API 来消除对多个连接的调用的歧义。

④、读取属性

通过调用属性的名称作为函数来执行读取属性。例如,如果端口 my_port 包含字符串属性 greeting,则可以如下检索 greeting 的值:

 std::string _greeting = this->my_port->greeting();

要从特定连接检索值,需要_get_前缀:

 std::string _greeting = this->my_port->_get_greeting("some_connection_name");

⑤、写入属性

在 C++ 中写入属性涉及使用适当的参数调用函数:

 this->my_port->greeting("hello"); // write "hello" to the attribute "greeting"this->my_port->greeting("hello", "some_connection_name"); // write "hello" to the attribute "greeting" over connection "some_connection_name"

我的qq:2442391036,欢迎交流!


相关文章:

REDHAWK——连接(续)

文章目录 前言一、突发 IO1、数据传输①、输入②、输出 2、突发信号相关信息 (SRI)3、多输出端口4、使用复数数据①、在 C 中转换复数数据 5、时间戳6、端口统计①、C 二、消息传递1、消息生产者①、创建一个消息生产者②、发送消息 2、消息消费者①、创建消息消费者②、注册接…...

9.Python从入门到精通—Python 字符串格式化,三引号,Unicode 字符串

9.Python从入门到精通—Python 字符串格式化,三引号,Unicode 字符串 Python 字符串格式化Python 三引号Unicode 字符串创建 Unicode 字符串Python 的字符串内建函数 Python 字符串格式化 Python中的字符串格式化是指将一个字符串中的占位符替换为指定的值。Python中有多种字符串…...

O2OA(翱途)开发平台系统安全-用户登录IP限制

O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]支持对指定的用户设置可以连接的客户端计算机的IP地址&#xff0c;以避免用户在不安全的环境下访问系统。本篇主要介绍如何开启O2OA用户登录IP限制。 一、先决条件&#xff1a; 1、O2Server服务器正常运行&#xff0c;系统安装部…...

DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x800c000d

报出这个问题&#xff0c;应该是对给的url解析不正确&#xff0c;我给的是rtsp的视频流地址&#xff0c;应该是对该格式解析异常。 所以参考两篇文&#xff1a; QT无法播放视频&#xff1a;报错&#xff1a;DirectShowPlayerService::doRender: Unresolved error code 0x8004…...

【测试流程及规范】8000字超详细完整版

前言&#xff1a; 首先注明该文由本人原创&#xff0c;转载时需注明出处&#xff1b;团队背景&#xff1a;测试团队加上我一共5名&#xff0c;Java开发10多位&#xff0c;前端3位&#xff0c;产品4位&#xff0c;还有架构工程师、运维等&#xff1b;公司IT团队开发的系统仅供内…...

第十四届蓝桥杯省赛真题 Java C 组【原卷】

文章目录 发现宝藏【考生须知】试题 A \mathrm{A} A : 求和试题 B: 分糖果试题 C: 三国游戏试题 D : \mathrm{D}: D: 平均试题 E \mathrm{E} E : 填充试题 F : \mathrm{F}: F: 棋盘试题 G: 子矩阵试题 H: 公因数匹配试题 I: 异或和之差试题 J : \mathrm{J}: J: 太阳 发现宝…...

v-model 粗略解析

v-model 粗略解析 v-model是什么&#xff1f; 双向数据绑定&#xff0c;可以从data流向页面&#xff0c;也可以从页面流向data通常用于表单收集&#xff0c;v-model 默认绑定 value 值书写形式&#xff1a; v-model:value"" 或 v-model v-model原理是什么&#xf…...

【vue elementUI】修改el-dropdown样式

实现效果如下&#xff1a; 代码如下&#xff1a; <el-dropdown trigger"click" command"handleCommand" active-text-color"#606266"><span class"product-card">{{getCategoryName(categoryId)}}</span><el-dro…...

6语言交易所/多语言交易所php源码/微盘PHP源码

6语言交易所PHP源码&#xff0c;简单测试了一下&#xff0c;功能基本都是正常的。 由于是在本地测试的运行环境的问题&#xff0c;K线接口有点问题&#xff0c;应该在正式环境下是OK的。 源码下载地址&#xff1a;6语言交易所/多语言交易所php源码/微盘PHP源码.zip 程序截图…...

动态规划——传球问题

题目链接&#xff1a;1.传球游戏 - 蓝桥云课 (lanqiao.cn) 本题关键在于动态规划的数组设计&#xff0c;以及围坐一圈时索引的变化。 首先是动态规划&#xff0c;由于是求球传递m次回到第一位同学&#xff0c;那么就可以设计成一个二维数组&#xff0c;每个位置代表的是&#x…...

Spring: 文件服务使用spring.web.resources.static-locations配置实现文件预览功能

文章目录 一、spring.web.resources.static-locations配置实现文件预览功能1、来实现文件预览的步骤2、总结 二、其他的文件预览实现方式1、使用Controller处理文件预览请求2、集成第三方文件预览库3、使用专门的文件预览服务4、配置Nginx等反向代理进行文件预览5、注意事项&am…...

分享常用的62 个九宫格抽奖及各种宫格效果源码

九宫格抽奖及各种宫格效果详细介绍 功演示效果及源码下载地址&#xff1a;https://www.erdangjiade.com/js/17-0-0-0 九宫格抽奖盘是一种常见的抽奖形式&#xff0c;由九个格子组成&#xff0c;每个格子代表一个奖项。抽奖时&#xff0c;指针会随机旋转&#xff0c;最终落在某…...

【Stable Diffusion】入门-03:图生图基本步骤+参数解读

目录 1 图生图原理2 基本步骤2.1 导入图片2.2 书写提示词2.3 参数调整 3 随机种子的含义4 拓展应用 1 图生图原理 当提示词不足以表达你的想法&#xff0c;或者你希望以一个更为简单清晰的方式传递一些要求的时候&#xff0c;可以给AI输入一张图片&#xff0c;此时图片和文字是…...

数学建模-多目标规划算法(美赛建模)

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是viperrrrrrr~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff…...

安装、配置MySQL

安装相关软件 MySQL Server、MySQL Workbench MySQL Server&#xff1a;专门用来提供数据存储和服务的软件 MySQL Workbench&#xff1a;可视化的 MySQL 管理工具 官网安装 https://www.mysql.com/ 官网 MySQL :: Download MySQL Installer 安装包路径 在这里选择版本和和对应…...

C++面试100问(九)

C中typdef和#define区别&#xff1f; #define是预处理命令&#xff0c;在预处理是执行简单的替换&#xff0c;不做正确性的检查&#xff1b;typedef是在编译时处理的&#xff0c;它是在自己的作用域内给已经存在的类型一个别名。 C中有哪些调试程序的方法&#xff1f; windows…...

出海品牌必备指南:海外网红营销5大底层逻辑解析

随着全球化的推进&#xff0c;品牌出海已经成为许多企业拓展市场的重要策略之一。在这个过程中&#xff0c;海外网红营销成为品牌吸引目标受众、提升知名度的有效工具。然而&#xff0c;要在海外市场取得成功&#xff0c;并不仅仅是找准网红合作伙伴&#xff0c;更需要深入了解…...

Linux/Ubuntu/Debian的终端中和的区别

下边举例说明&#xff1a; “cd /home & wine ps.exe”和“cd /home && wine ps.exe”之间的区别在于命令在类 Unix shell 环境&#xff08;例如 Linux 或 macOS&#xff09;中执行的方式&#xff1a; ‘cd /home & wine ps.exe’: 在此命令中&#xff0c;“…...

docker compose部署opensearch集群

docker compose 配置 假设有两台电脑 A电脑的ip为192.168.1.100 B电脑的ip为192.168.1.103 A电脑的docker compose 配置 version: 3services:opensearch:image: opensearchproject/opensearch:2.1.0container_name: opensearch-node-1environment:- cluster.nameopensearch-c…...

粤嵌6818开发板通过MobaXterm使用SSH连接开发板

链接&#xff1a;https://pan.baidu.com/s/18ISP4Ub1HtQx6jCvTQTUHw?pwdfjmu 提取码&#xff1a;fjmu 1.把SSH_config.tar.bz 下载到开发板中 2.解压 SSH_config.tar.bz 解压命令&#xff1a;tar -xzvf SSH_config.tar.bz 3.配置SSH 进入SSH/openssh目录&am…...

Python实战:Flask轻量级web框架入门

Flask是一个轻量级的Web框架&#xff0c;它是由Armin Ronacher开发的&#xff0c;使用Python语言编写。Flask易于上手&#xff0c;具有高度的可扩展性&#xff0c;非常适合快速开发Web应用程序。 一.Flask简介 Flask是一个基于Werkzeug WSGI工具箱和Jinja2模板引擎的Web框架。…...

docker 安装minio,详细图解

废话不多说&#xff0c;直接上干货 docker 安装minio 拉取镜像 docker pull minio/minio创建数据目录、配置目录 mkdir /opt/minio/data mkdir /opt/minio/config启动容器 docker run -p 9000:9000 -p 9090:9090 \--name minio \-d --restartalways \-e "MINIO_ACCESS_KE…...

【SpringBoot】请求与响应参数 IoC与DI 总结

文章目录 ① —— 请求 ——一、简单参数 RequestParam1.1 参数与形参 命名相同1.2 参数与形参 命名不同 二、实体参数2.1 简单实体对象2.2 复杂实体对象 三、数组集合参数3.1 数组3.2 集合 RequestParam 四、日期参数 DateTimeFormat五、JSON参数 RequestBody六、路径参数 Pat…...

100道面试必会算法-05-字符串转换整数 (atoi)

100道面试必会算法-05-字符串转换整数 (atoi) 实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格检查…...

Ypay源支付2.8.8免授权聚合免签系统

本帖最后由 renleixiaoxu 于 2024-3-15 09:46 编辑 产品介绍 XPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决 知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的Thin…...

从零到一构建短链接系统(三)

1.根据数据库表&#xff0c;利用在线网站https://jully.top/generator/ 根据数据库Info自动生成代码 2.在entity中创建UserDO Data TableName("t_user") public class UserDO { /** * id */ private Long id; /** * 用户名 */ private String username; /** * 密码…...

C语言易错知识点:scanf函数

scanf在C语言学习中比较常用&#xff0c;但因为其涉及屏幕缓冲区导致有的时候会调入陷阱&#xff0c;下面分享一下常见的需要注意的事项&#xff1a; 1.输入末尾带有回车\n 当我们输入数据后&#xff0c;最后按下回车时&#xff0c;屏幕缓冲区的末尾都会含有这个字符 scanf的…...

如何实现图片上传至服务器

在绝大多数的项目中都会涉及到文件上传等&#xff0c;下面我们来说一下技术派中是如何实现原生图片上传的&#xff0c;这个功能说起来简单&#xff0c;但其实对于技术还是有考验的。图片的上传涉及到IO读写&#xff0c;一个文件上传的功能&#xff0c;就可以把IO流涉及到的知识…...

OSPF协议全面学习笔记

作者&#xff1a;BSXY_19计科_陈永跃 BSXY_信息学院 注&#xff1a;未经允许禁止转发任何内容 OSPF协议全面学习笔记 1、OSPF基础2、DR与BDR3、OSPF多区域4、虚链路Vlink5、OSPF报文6、LSA结构1、一类/二类LSA&#xff08;Router-LSA/Network-LSA&#xff09; 更新完善中... 1、…...

acwing算法提高之搜索--剪枝

目录 1 介绍2 训练 1 介绍 本专题用来记录使用dfs剪枝技巧求解的题目。 剪枝有以下思路&#xff1a; 优化搜索顺序。可行性剪枝。最优性剪枝。唯一性剪枝&#xff0c;也叫去除冗余。记忆化搜索&#xff0c;也叫dp。 2 训练 题目1&#xff1a;165小猫爬山 C代码如下&#…...

沈阳网站建设 网络服务/永久免费不收费的污染app

A3 B6 1.let算术运算表达式 let C$A$B2.$[算术运算表达式] C$[$A$B] 3.$(()) C$(($A$NB)) 转载于:https://www.cnblogs.com/zhangsubai/p/5175015.html...

php网站开发 薪资 东莞/站长之家关键词挖掘工具

1. 问题描述&#xff1a;判断一棵二叉树是否是完全的BST&#xff08;Binary Search Tree 二叉搜索树&#xff09; 二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;&#xff08;二叉搜索树或者称为二叉排序树&#xff09;它或者是一棵空树&#xff0c;或者…...

网站推广属于什么行业/百度贴吧人工客服电话

最近在做ns 任天堂略坑.. 他想做成一键安装,可总是有些问题,这样再去找就很麻烦了.都是包在里面的,要看很多文档 第一个问题是 NintendoSDK Configuration Manager 这个东西本来要做成一键式配置,但NDI里显示安装了 NitendoSDK VsExtension,可vs里就是没有 要在NDI里再装一次&a…...

wordpress怎样显示子类目/搜索引擎优化的简称

这个程序是根据《数据结构》算法6.12用c语言实现的程序&#xff0c;赫夫曼树就很少说了&#xff0c;直接看代码&#xff0c;代码上都有注释。ios下面代码&#xff1a;算法#include#include#include#include#include#define MAX_NUM 100#define inf 2000000000using namespace s…...

网站建设 文档下载/百度推广网址

原文地址&#xff1a;http://flychao88.iteye.com/blog/2192259 https://blog.csdn.net/bohu83/article/details/51124058 原文如下 一、常用命令分析 1. jstat -gc pid 可以显示gc的信息&#xff0c;查看gc的次数&#xff0c;及时间。 其中最后五项&#xff0c;分别是you…...

网站使用标题做路径/seo推广关键词公司

说好的这次写一个图形编程书单……但是看起来不是很好整理&#xff0c;这类书散落的家里到处都是…… 先把经典Windows编程的书整理一下吧&#xff0c;不过Windows的也到处都是很多都找不到了&#xff0c;只能把找到的拍个照&#xff0c;可能很多这次拍个照就永远压箱底了。 按…...