librdkafka编译及简单使用过程简介

2023-11-17

librdkafka 使用了 C++11,使用 VS2010 无法编译,需要使用更高版本的 VS 才能编译,我这里使用的是 VS2017。

1、编译版本

编译环境:windows VS2017
openssl 版本:openssl-1.0.2t(如果不想编译,可下载 Win32OpenSSL-1_0_2t.exe安装,同时编译库文件路径不使用 …\lib\VC\static,改为…\lib\VC即可)
librdkafka 版本:librdkafka-1.2.1(下载的是releases版本,相对提交版本较稳定,不建议下载最新版本)

2、编译openssl

1)安装 ActivePerl 初始化的时候,需要用到 perl 解释器
下载一个安装包,然后一直下一步就行,没有特殊处理;
2)打开 VS2017 开发命令提示符,进入 openssl 解压目录
3)配置 config 脚本
在提示符中执行下例语句:

#  编译release32位:
perl Configure VC-WIN32 no-asm --prefix=D:\openssl_win32

#  编译release64位:
perl Configure VC-WIN64A

#  编译debug32位:
perl Configure debug-VC-WIN32

#  编译debug64位:
perl Configure debug-VC-WIN64A

我只使用过 VC-WIN64A 和 VC-WIN32 ,–prefix 是指定头文件、库文件路径生成路径,no-asm 使用是因为编译时报错,错误如下:

tmp32dll\sha1-586.asm(1432) : error A2070:invalid instruction operands
tmp32dll\sha1-586.asm(1576) : error A2070:invalid instruction operands
NMAKE : fatal error U1077:"E:\Visuol Studio 2012\VC\BIN\cl.EXE": 返回代码“0x1

还有另外一个错误需要禁用IPV6,这个错误我没有遇到,不过还是记录一下:

#  使用
perl Configure VC-WIN32 -DOPENSSL_USE_IPV6=0
#  错误
tmp32dll\sha1-586.asm(1432) : error A2070:invalid instruction operands
tmp32dll\sha1-586.asm(1576) : error A2070:invalid instruction operandsN
MAKE : fatal error U1077:"E:\Visuol Studio 2012\VC\BIN\cl.EXE": 返回代码“0x2

4)创建 makefile 文件
在提示符中执行下例语句:

#  创建32位makefile文件
ms\do_ms.bat
#  创建64位makefile文件
ms\do_win64a.ba

5)执行编译命令
在编译过程中,不论是32位还是64位编译,编译动态库都报错 (LIBEAY32.def : error LNK2001: 无法解析的外部符号 OPENSSL_rdtsc),编译静态库可以成功
(1)、编译动态库:
在提示符中执行下例语句:

#  编译dll
nmake -f ms\ntdll.mak
#  测试dll
nmake -f ms\ntdll.mak test

(2)、编译静态库:
在提示符中执行下例语句:

#  编译lib
nmake -f ms\nt.mak 
#  测试lib
nmake -f ms\nt.mak test

6)库安装

#  生成lib库
nmake -f ms\nt.mak install
#  测试dll
nmake -f ms\ntdll.mak install

最终会在指定路径,生成如下文件:
在这里插入图片描述
7)清理编译内容

nmake -f ms\nt.mak clean
nmake -f ms\ntdll.mak clean

如果要重新编译,只需执行清理指令,再按1-6步骤重新执行即可。

3、编译 librdkafka

1)错误修改
1、若直接运行,会报以下错误

1、Error This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.

修改方法:
找到 项目文件.csproj,打开后,移除下面的内容

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

2、未包含 zlib.h 文件
这个是应该 NuGet 管理包的问题,我也不是很熟悉,我找到的解决方法是从 win32/packages/ 文件中找到 zlib 库文件及头文件,添加到附加库目录中。
2)添加库文件及头文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3)编译 librdkafkacpp
若库文件编译只编译 librdkafka,在后续使用代码编译报错:

librdkafka.dll : fatal error LNK1107: 文件无效或损坏: 无法在 0x3A8 处读取

后续代码中的库应使用 librdkafkacpp 编译出来的 librdkafka.dll 与 librdkafkacpp.dll 动态库。

4、librdkafka的使用

编译完的 librdkafka 库还是无法在 VS2018 中使用,可以编译通过,但是运行报错。
1)创建项目,添加库文件
头文件:头文件:\src-cpp\rdkafkacpp.h \src\rdkafka.h ;
库文件:配置 librdkafka.dll 与 librdkafkacpp.dll 动态库(debug 和 release 路径中 kafka 库文件还需要 libzstd.dll 和 zlib.dll);
2、生产者代码
KafkaProducerClient.h

#ifndef KAFKAPRODUCERCLIENT_H
#define KAFKAPRODUCERCLIENT_H
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <list>
#include <kafka/rdkafkacpp.h>
#include <vector>
#include <fstream>

using namespace std;
using std::string;
using std::list;
using std::vector;
using std::fstream;

class KafkaProducerDeliveryReportCallBack : public RdKafka::DeliveryReportCb {
public:
	void dr_cb(RdKafka::Message &message) {
		std::cout << "Message delivery for (" << message.len() << " bytes): " <<
			message.errstr() << std::endl;
		if (message.key())
			std::cout << "Key: " << *(message.key()) << ";" << std::endl;
	}
};
class KafkaProducerEventCallBack : public RdKafka::EventCb {
public:
	void event_cb(RdKafka::Event &event) {
		switch (event.type())
		{
		case RdKafka::Event::EVENT_ERROR:
			std::cerr << "ERROR (" << RdKafka::err2str(event.err()) << "): " <<
				event.str() << std::endl;
			if (event.err() == RdKafka::ERR__ALL_BROKERS_DOWN)
				break;
		case RdKafka::Event::EVENT_STATS:
			std::cerr << "\"STATS\": " << event.str() << std::endl;
			break;
		case RdKafka::Event::EVENT_LOG:
			fprintf(stderr, "LOG-%i-%s: %s\n",
				event.severity(), event.fac().c_str(), event.str().c_str());
			break;
		default:
			std::cerr << "EVENT " << event.type() <<
				" (" << RdKafka::err2str(event.err()) << "): " <<
				event.str() << std::endl;
			break;
		}
	}
};
class KafkaProducerClient
{
public:
	KafkaProducerClient(const string &brokers, const string &topics, int nPpartition = 0);
	virtual ~KafkaProducerClient();
	bool Init();
	void Send(const string &msg);
	void Stop();
private:
	RdKafka::Producer *m_pProducer;
	RdKafka::Topic *m_pTopic;
	KafkaProducerDeliveryReportCallBack m_producerDeliveryReportCallBack;
	KafkaProducerEventCallBack m_producerEventCallBack;
	std::string m_strTopics;
	std::string m_strBroker;
	bool m_bRun;
	int m_nPpartition;
};
#endif // KAFKAPRODUCERCLIENT_H

KafkaProducerClient.cpp

#include <stdafx.h>
#include "KafkaProducerClient.h"

KafkaProducerClient::KafkaProducerClient(const string &brokers, const string &topics, int nPpartition /*= 1*/)
    : m_bRun(true), m_strTopics(topics), m_strBroker(brokers), m_nPpartition(nPpartition)
{
	m_pTopic = NULL;
	m_pProducer = NULL;
	m_nPpartition = 0;
}

KafkaProducerClient::~KafkaProducerClient()
{
    Stop();
}

bool KafkaProducerClient::Init()
{
    string errstr = "";

    /*
     * Create configuration objects
     */
    RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);
    RdKafka::Conf *tconf = RdKafka::Conf::create(RdKafka::Conf::CONF_TOPIC);

    /*Set configuration properties,设置broker list*/
    if (conf->set("metadata.broker.list", m_strBroker, errstr) != RdKafka::Conf::CONF_OK){
        std::cerr << "RdKafka conf set brokerlist failed :" << errstr.c_str() << endl;
    }
    /* Set delivery report callback */
    conf->set("dr_cb", &m_producerDeliveryReportCallBack, errstr);
    conf->set("event_cb", &m_producerEventCallBack, errstr);

    /*
     * Create producer using accumulated global configuration.
    */
    m_pProducer = RdKafka::Producer::create(conf, errstr);
    if (!m_pProducer) {
        std::cerr << "Failed to create producer: " << errstr << std::endl;
        return false;
    }
    std::cout << "% Created producer " << m_pProducer->name() << std::endl;

    /*
     * Create topic handle.
    */
    m_pTopic = RdKafka::Topic::create(m_pProducer, m_strTopics,
                                      tconf, errstr);
    if (!m_pTopic) {
        std::cerr << "Failed to create topic: " << errstr << std::endl;
        return false;
    }
    return true;
}
void KafkaProducerClient::Send(const string &msg)
{
    if (!m_bRun)
        return;
    /*
     * Produce message
    */
    RdKafka::ErrorCode resp = m_pProducer->produce(m_pTopic, m_nPpartition,
                                                   RdKafka::Producer::RK_MSG_COPY /* Copy payload */,
                                                   const_cast<char *>(msg.c_str()), msg.size(),
                                                   NULL, NULL);
    if (resp != RdKafka::ERR_NO_ERROR)
        std::cerr << "Produce failed: " << RdKafka::err2str(resp) << std::endl;
    else
        std::cerr << "Produced message (" << msg.size() << " bytes)" << std::endl;

    m_pProducer->poll(0);

    /* Wait for messages to be delivered */  //firecat add
    while (m_bRun && m_pProducer->outq_len() > 0) {
        std::cerr << "Waiting for " << m_pProducer->outq_len() << std::endl;
        m_pProducer->poll(100);
    }
}

void KafkaProducerClient::Stop()
{
    delete m_pTopic;
    delete m_pProducer;
}

KafkaProducer.cpp

#include "stdafx.h"
#include <iostream>
#include "KafkaProducerClient.h"

int _tmain(int argc, _TCHAR* argv[])
{
	KafkaProducerClient* KafkaprClient_ = new KafkaProducerClient("10.10.10.182:9092", "test", 1);
	KafkaprClient_->Init();

	char str_msg[] = "Hello Kafka!";

	while (fgets(str_msg, sizeof(str_msg), stdin))
	{
		size_t len = strlen(str_msg);
		if (str_msg[len - 1] == '\n')
		{
			str_msg[--len] = '\0';
		}

		if (strcmp(str_msg, "end") == 0)
		{
			break;
		}

		KafkaprClient_->Send(str_msg);
	}

	return 0;
}

3、生产者代码
KafkaConsumerClient.h

#ifndef KAFKACONSUMERCLIENT_H
#define KAFKACONSUMERCLIENT_H

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <csignal>
#include <cstring>
#include <list>
#include <kafka/rdkafkacpp.h>
#include <vector>
#include <fstream>

using namespace std;

class KafkaConsumerClient {
public:
	KafkaConsumerClient(const std::string& brokers, const std::string& topics, std::string groupid, int32_t nPartition = 0, int64_t offset = 0);
	virtual ~KafkaConsumerClient();
	//初始化
	bool Init();
	//开始获取消息
	void Start(int timeout_ms);
	//停止
	void Stop();

private:
	void Msg_consume(RdKafka::Message* message, void* opaque);

private:
	std::string m_strBrokers;
	std::string m_strTopics;
	std::string m_strGroupid;
	int64_t m_nLastOffset;
	RdKafka::Consumer *m_pKafkaConsumer;
	RdKafka::Topic    *m_pTopic;
	int64_t           m_nCurrentOffset;
	int32_t           m_nPartition;
	bool m_bRun;
};
#endif // KAFKACONSUMERCLIENT_H

KafkaConsumerClient.cpp

#include <stdafx.h>
#include "KafkaConsumerClient.h"


KafkaConsumerClient::KafkaConsumerClient(const std::string& brokers, const std::string& topics, std::string groupid, int32_t nPartition /*= 0*/, int64_t offset /*= 0*/)
    :m_strBrokers(brokers),
      m_strTopics(topics),
      m_strGroupid(groupid),
      m_nPartition(nPartition),
      m_nCurrentOffset(offset)
{
	m_nLastOffset = 0;
	m_pKafkaConsumer = NULL;
	m_pTopic         = NULL;
	m_nCurrentOffset  = RdKafka::Topic::OFFSET_BEGINNING;
	m_nPartition      = 0;
	m_bRun = false;
}

KafkaConsumerClient::~KafkaConsumerClient()
{
    Stop();
}

bool KafkaConsumerClient::Init() {
    std::string errstr;
    RdKafka::Conf *conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL);
    if (!conf) {
        std::cerr << "RdKafka create global conf failed" << endl;
        return false;
    }
    /*设置broker list*/
    if (conf->set("metadata.broker.list", m_strBrokers, errstr) != RdKafka::Conf::CONF_OK) {
        std::cerr << "RdKafka conf set brokerlist failed ::" << errstr.c_str() << endl;
    }
    /*设置consumer group*/
    if (conf->set("group.id", m_strGroupid, errstr) != RdKafka::Conf::CONF_OK) {
        std::cerr << "RdKafka conf set group.id failed :" << errstr.c_str() << endl;
    }
    std::string strfetch_num = "10240000";
    /*每次从单个分区中拉取消息的最大尺寸*/
    if (conf->set("max.partition.fetch.bytes", strfetch_num, errstr) != RdKafka::Conf::CONF_OK){
        std::cerr << "RdKafka conf set max.partition failed :" << errstr.c_str() << endl;
    }
    /*创建kafka consumer实例*/ //Create consumer using accumulated global configuration.
    m_pKafkaConsumer = RdKafka::Consumer::create(conf, errstr);
    if (!m_pKafkaConsumer) {
        std::cerr << "failed to ceate consumer" << endl;
    }
    std::cout << "% Created consumer " << m_pKafkaConsumer->name() << std::endl;
    delete conf;
    /*创建kafka topic的配置*/
    RdKafka::Conf *tconf = RdKafka::Conf::create(RdKafka::Conf::CONF_TOPIC);
    if (!tconf) {
        std::cerr << "RdKafka create topic conf failed" << endl;
        return false;
    }
    if (tconf->set("auto.offset.reset", "smallest", errstr) != RdKafka::Conf::CONF_OK) {
        std::cerr << "RdKafka conf set auto.offset.reset failed:" << errstr.c_str() << endl;
    }
    /*
     * Create topic handle.
     */
    m_pTopic = RdKafka::Topic::create(m_pKafkaConsumer, m_strTopics, tconf, errstr);
    if (!m_pTopic) {
        std::cerr << "RdKafka create topic failed :" << errstr.c_str() << endl;
    }
    delete tconf;
    /*
     * Start consumer for topic+partition at start offset
     */
    RdKafka::ErrorCode resp = m_pKafkaConsumer->start(m_pTopic, m_nPartition, m_nCurrentOffset);
    if (resp != RdKafka::ERR_NO_ERROR) {
        std::cerr << "failed to start consumer : " << errstr.c_str() << endl;
    }
    return true;
}
void KafkaConsumerClient::Msg_consume(RdKafka::Message* message, void* opaque) {
  switch (message->err()) {
    case RdKafka::ERR__TIMED_OUT:
      break;

    case RdKafka::ERR_NO_ERROR:
      /* Real message */
      std::cout << "Read msg at offset " << message->offset() << std::endl;
      if (message->key()) {
        std::cout << "Key: " << *message->key() << std::endl;
      }
      printf("%.*s\n",
        static_cast<int>(message->len()),
        static_cast<const char *>(message->payload()));

      m_nLastOffset = message->offset();
      break;

    case RdKafka::ERR__PARTITION_EOF:
      /* Last message */
      cout << "Reached the end of the queue, offset: " << m_nLastOffset << endl;
      //Stop();
      break;
    case RdKafka::ERR__UNKNOWN_TOPIC:
    case RdKafka::ERR__UNKNOWN_PARTITION:
      std::cerr << "Consume failed: " << message->errstr() << std::endl;
      Stop();
      break;

    default:
      /* Errors */
      std::cerr << "Consume failed: " << message->errstr() << std::endl;
      Stop();
      break;
  }
}
void KafkaConsumerClient::Start(int timeout_ms){
    RdKafka::Message *msg = NULL;
    m_bRun = true;
    while (m_bRun) {
        msg = m_pKafkaConsumer->consume(m_pTopic, m_nPartition, timeout_ms);
        Msg_consume(msg, NULL);
        delete msg;
        m_pKafkaConsumer->poll(0);
    }

    m_pKafkaConsumer->stop(m_pTopic, m_nPartition);
    m_pKafkaConsumer->poll(1000);

    if (m_pTopic) {
        delete m_pTopic;
        m_pTopic = NULL;
    }

    if (m_pKafkaConsumer) {
        delete m_pKafkaConsumer;
        m_pKafkaConsumer = NULL;
    }

    /*销毁kafka实例*/ //Wait for RdKafka to decommission.
    RdKafka::wait_destroyed(5000);
}

void KafkaConsumerClient::Stop()
{
    m_bRun = false;
}

KafkaConsumer.cpp

#include "stdafx.h"
#include <iostream>
#include "KafkaConsumerClient.h"

int _tmain(int argc, _TCHAR* argv[])
{
	KafkaConsumerClient *KafkaConsumerClient_ = new KafkaConsumerClient("10.10.10.182:9092", "test", "0", 0, RdKafka::Topic::OFFSET_BEGINNING);//OFFSET_BEGINNING,OFFSET_END

	if (!KafkaConsumerClient_->Init())
	{
		fprintf(stderr, "kafka server initialize error\n");
		return -1;
	}

	KafkaConsumerClient_->Start(1000);

	return 0;
}

5、kafka测试

1、下载 kafka
下载 kafka,并解压
2、启动 zookeeper
正式运行需要安装 zookeeper,若测试只需在解压的 kafka 路径下执行:

.\bin\windows\zookeeper-server-start.bat config\zookeeper.properties

zookeeper.properties是zookeeper配置文件,默认 zookeeper 监听本地2181端口
3、启动 kafka,执行以下语句:

.\bin\windows\kafka-server-start.bat config\server.properties

# kafka文件内还有测试的生成和消费
.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test

# 消息
.\bin\windows\kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
# 0.90版本之后消费者启动:
.\bin\windows\kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

4、启动编写的 kafka 程序,验证库文件是否异常
测试结果:
在这里插入图片描述

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

librdkafka编译及简单使用过程简介 的相关文章

  • 关系型数据库特点分析

    1970年E F Codd发表的那篇阐述新型数据库设计方式的论文 数据管理技术才开始发生了巨大变化 特点分析 形式化的数学模型 使用关系代数来描述数据及数据间的关系 数据结构的逻辑排布方式同它们的物理存储方式相分离 消除数据异常 保证数据一
  • 互联网时代的营销方法

    随着新型互联网时代的到来 金融社会也跟随着发生剧变 出现了许多新兴的营销方式 他们或多或少都与互联网有着不可分离的关系 在这里 我简单向大家介绍几种我较为认可的营销方式 一 饥饿营销 饥饿营销是指商品提供者有意调低产量 以期达到调控供求关系
  • Java知识点二

    20世纪90年代 硬件领域出现了单片式计算机系统 这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意 因为使用它可以大幅度提升消费类电子产品 如电视机顶盒 面包烤箱 移动电话等 的智能化程度 Sun公司为了抢占市场先机 在1991年
  • 【概率论】大数定律

    概要 首先介绍了切比雪夫不等式 然后介绍大数定律概念和3种大数定律及证明 切比雪夫不等式 已知随机变量X的期望EX和方差DX 对 可得的一个上界 解释 不论X服从什么分布 X在E x 的 邻域内取值的概率不小于1 Dx 2 证明 本质 随机
  • echarts 配置问题

    饼图标签重叠 超出 series type pie name 数据来源 radius 40 60 avoidLabelOverlap true 是否启用防止标签重叠策略 minAngle 20 最小的扇区角度 0 360 用于防止某个值过小
  • leetcode算法刷题:长度最小的子数组

    目录 题目如下 输入输出 思路 题目链接 209 长度最小的子数组 力扣 LeetCode 题目如下 输入输出 思路 使用快慢指针 设置指针end 和start指针 一开始end和start从0开始 以及区间最小长度minLen变量设为In
  • java怎么把字符串转换成日期类型

    1 java怎么把字符串转换成日期类型 2 Java如何将指定字符串转化为指定日期格式 3 求JAVA高手解答 有关于字符串类型转换成日期型 4 Java中怎么把字符串转换成日期格式啊 5 java中怎样将字符串转换成日期形式存入数据库 j
  • 3分钟即可了解 FHub中转站文件摆渡新技能

    说到文件摆渡的方式 有很多种 比较传统一点的 像U盘拷贝 FTP等 自动化一点的 像网闸 网盘等 还有一些企业会通过一些技术手段进行摆渡 比如防火墙技术等 这些方式都能在一定程度上解决跨隔离网文件摆渡的问题 为什么这么说呢 且听下文分析 1
  • java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)...

    内存分配的策略 按照编译原理的观点 程序运行时的内存分配有三种策略 分别是静态的 栈式的 和堆式的 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求 因而在编 译时就可以给他们分配固定的内存空间 这种分配策略要求程序代码
  • 联想万全服务器告警信息在哪里看,华为网络设备查看告警信息

    检查设备是否出现故障以及近期是否有重要的告警信息 前提条件 已经完成登录设备 操作步骤 执行命令display alarm all 查看所有活动的硬件告警信息 以判断设备是否发生故障 display alarm all Info NO al
  • Python运维开发:基于openstack RestfulAPI上传镜像和创建云主机

    基础环境 python 脚本文件头建议加入 encoding utf 8 避免编码错误 测试脚本代码用python3命令执行与测试 在linux系统中安装Python3 并安装request等依赖包 配置 有一台搭建好的open stack
  • CSS3渐变

    以前我们如果想要做到一个颜色到另一个颜色的渐变 Gradients 效果 需要用ps之类的应用程序做出一张背景图片 然后放到元素上 这样子不仅麻烦 而且不利于代码的维护 当用户界面大小发生改变时 显示效果也不好 CSS3提供给了我们一种渐变
  • 正定Hermiltian矩阵分解的两种方法

    对于正定Hermiltian矩阵 B B B 想要求解 D D D 使其满足
  • 单价数量和总价的公式_小学数量关系计算公式汇总,收藏起来写作业不用翻书了!...

    点击上方蓝字 关注我们 要想数学学得好 就要公式记得牢 公式是为了孩子更好的解题来用的 很多孩子数学学习过程中经常出现 平时不记 考试捉急 的现象 虽然数学是一门非常注重逻辑思维能力的一个学科 但是想要取得好的成绩 离不开基础知识的掌握 只

随机推荐

  • 【经典】SpringBoot 过滤器和拦截器

    过滤器 创建过滤器 MyFilter 实现Filter接口 实现doFilter方法 在SpringbootwebApplication java中添加一个过滤器注册方法 具体实现如下 如果要不拦截静态资源 则可以在Filter中设置 当然
  • 项目架构图

    前言 前段时间一直在找工作 面试过程终于到了不少问题 有些是自己会的 有些是自己看过却无法整理出来的 说到底是理解不够透彻 记忆不够深刻 当然还有些是完全懵逼的 下面就来说下经常被问及 自己却无法当场整理出来的一个问题 那就是让你画出自己做
  • DNS服务-笔记

    DNS 域名解析服务 PC访问DNS用的是 UDP 53端口 主辅同步数据用的是 TCP 53端口 工作原理 当解析一台主机域名时 首先会访问电信 网通等提供的DNS服务器地址上的DNS服务器 去访问 根域 也就是根域 大概有13台 然后根
  • 数字三角形之动态规划(C语言实现)

    算法步骤 1 首先构造三个数组 第一个是存储三角形初始值的数组data 第二个是存储顶点到该点最大值的res 数组 第三个是存储该点上一个点的loc 数组 这里要对res 数组进行初始化 1 2 按照三角形的层次结构 从上到下 从左到右依次
  • mysql存储过程游标之loop循环

    mysql存储过程游标 一共有3中循环方式 while repeat loop loop DELIMITER CREATE PROCEDURE DAY081002 BEGIN 定义参数 后面使用 DECLARE a INT DECLARE
  • 前端面试总结

    1 引言 最近参加了大量的招聘会 投递了大量的简历 整整体会了从 随便找个厂上一下 还是的找个大厂 没人要 急了急了 海投一波 工资有点尬 海投中 简单说一下自己的一些感受吧 现在的前端属实有点尴尬 前端的基础教程特别多 最开始本来是觉得自
  • Stata输出统计结果到Excel或word

    目录 一 安装外部包 二 相关命令 三 实例 1 描述性统计结果输出 2 相关性结果输入 3 回归结果输出 1 单模型结果 2 多模型结果 参考 一 安装外部包 在Stata内安装外部包 estout和logout ssc install
  • CSPNET: A NEW BACKBONE THAT CAN ENHANCE LEARNING CAPABILITY OF CNN

    摘要 本文从网络体系结构的角度出发 提出了跨阶段局部网络 CSPNet 来解决以往工作中需要大量推理计算的问题 本文将问题归结为网络优化中的重复梯度信息 所提出的网络通过从网络阶段的开始和结束集成特征映射来注重梯度的可变性 CSPNet易于
  • Flink常用算子总结

    Streaming 算子 Map 将元素处理转换 再输出 map算子对一个DataStream中的每个元素使用用户自定义的Mapper函数进行处理 每个输入元素对应一个输出元素 最终整个数据流被转换成一个新的DataStream 输出的数据
  • 2020年黑苹果硬件配置推荐

    前言 黑苹果硬件配置推荐是一件众口难调的事情 但是为了更多的苹果Mac爱好者能够早日开心顺利的使用上macOS系统 mac996站长还是会200 的努力做好这件事情 也请大家大家多给一些支持和鼓励 注 本文仅针对黑苹果台式机做硬件推荐 不涉
  • 协同过滤算法的一些报错及python函数学习

    文章目录 1 cannot import name jaccard similarity score 2 DataFrame object has no attribute dtype 3 sort values 4 sort index
  • 2023前端面试题及答案整理(JS笔试题)

    JS笔试题 JS类型相关 typeof 没定义的变量会报错吗 typeof let定义了的呢 未声明的变量使用 typeof 返回字符串 undefined typeof 一个 let 定义的变量会因为暂时性死区报错 前提 let cons
  • go语言面试题

    文章目录 1 下面这段代码输出什么 2 下面代码输出什么 3 同级文件的包名不允许有多个 是否正确 4 下面的代码有什么问题 请说明 1 下面这段代码输出什么 func main count 0 for i range 256 struct
  • webpack 学习笔记(二) 打包 AMD模块时 js路径错误

    在使用webpack打包模块的时候遇到的问题 各种百度一直无法解决这个问题 真的对新手太不友好了 webpack 作为 一个模块打包工具 它可以将AMD CMD CommonJs ES6 模块都进行打包 这里推荐一个讲解模块比较详细的博客
  • 华为机考108题(c++)(1-16)

    HJ1 字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度 单词以空格隔开 字符串长度小于5000 注 字符串末尾不以空格为结尾 输入描述 输入一行 代表要计算的字符串 非空 长度小于5000 输出描述 输出一个整数 表示输入字符
  • C语言算法--冒泡排序

    C语言算法 冒泡排序 1 什么是冒泡排序 冒泡排序是一种简单的排序算法 它通过比较相邻元素的大小 并根据需要交换它们的位置来排序数据 它的名称来自于越小的元素会慢慢 冒泡 到数组的开头 冒泡排序的基本思想是从数组的第一个元素开始 依次比较相
  • 修改本机localhost映射dns解析

    去C Windows System32 drivers etc目录下找到hosts文件 进入修改 最后一行添加127 0 0 1 空格 写自己的域名映射 增加后进入cmd命令行窗口输入ipconfig flushdns刷新dns解析 此后就
  • 开源微服务如何选型?Spring Cloud、Dubbo、gRPC、Istio 详细对比

    不论您是一名开发者 架构师 CTO 如果您曾深度参与在微服务开发中 那么相信您一定有过开源微服务框架或体系选型的疑问 Apache Dubbo Spring Cloud gRPC 以及 Service Mesh 体系产品如 Istio 到底
  • Vinted店铺为什么被封?如何应对?

    Vinted是一家在线二手交易平台 专门用于买卖衣物和时尚配件 自从2022年以来 Vinted也越来越向综合性跨境电商平台转变 细心的伙伴都会发现 近来Vinted这阵子封号确实很严重 感觉是风控变严格了 但是万变不离其宗 说到底封控还是
  • librdkafka编译及简单使用过程简介

    librdkafka 使用了 C 11 使用 VS2010 无法编译 需要使用更高版本的 VS 才能编译 我这里使用的是 VS2017 1 编译版本 编译环境 windows VS2017 openssl 版本 openssl 1 0 2t