aspeed2600 openbmc对mctp over pcie的支持分析(支持mctp over pcie)

news2024/9/20 1:10:39

遍搜全网,竟然关于openbmc mctp over pcie的支持说明情况了无文章,这不是一个艰难的问题,服务器BMC也不是一个超级精尖的产品,想当年分享stm32资料,都是满天飞。可能服务器市场大家对于文章上的分享并无兴趣。

此篇文章只是一个最基本的简单的说明文章,弥补一下openbmc资源匮乏吧。另外,本片文章只是一个简单的开篇文章,有错漏,有知识不全面,请尽管评论。

注意: 本章涉及的代码可以查看代码仓库:https://gitee.com/wit_yuan/yuan_mctpd/tree/yuan_modified_mctpd

1.官方活跃的mctp支持情况

官方活跃的2个仓库有:https://github.com/CodeConstruct/mctp和https://github.com/openbmc/libmctp,这一套下来还需要kernel的支持, 代码的提交可以参考如下链接:
https://lore.kernel.org/netdev/20210729022053.134453-1-jk@codeconstruct.com.au/
简单来讲,可以参考内核这几个文件:

build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/af_mctp.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/device.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/neigh.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/route.c
build/ast2600-default/workspace/sources/linux-aspeed/net/socket.c

这几个文件是核心的整个mctp架构代码。

如下几个文件是驱动代码,对接到硬件上:

build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i2c.c
build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i3c.c
build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-serial.c

可以看到,这里面没有一个直接的针对mctp-pcie.c文件,粗浅看,这个架构是不支持mctp over pcie的。

补充一点,文件:build/ast2600-default/workspace/sources/linux-aspeed/drivers/soc/aspeed/aspeed-mctp.c是内核的mctp over pcie驱动文件,但是说了与不说一样,因为架构上没支持(差一个驱动程序)。

简单看一下文件:build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i2c.c中的mctp_i2c_add_netdev()函数:

static int mctp_i2c_add_netdev(struct mctp_i2c_client *mcli,
			       struct i2c_adapter *adap)
---> struct net_device *ndev = NULL;
---> ndev = alloc_netdev(sizeof(*midev), namebuf, NET_NAME_ENUM, mctp_i2c_net_setup);
---> rc = mctp_register_netdev(ndev, &mctp_i2c_mctp_ops);

可以反推,目前的架构是不支持mctp over pcie的。当前的架构情况是kernel mctp + lib + dbus服务组成。

2.intel-mctp的支持情况

留意: intel已经对这一块不再维护了。

可以在intelopenbmc仓库里面,找到链接:

  • 1.libmctp链接:https://github.com/Intel-BMC/libmctp
  • 2.pmci链接:https://github.com/Intel-BMC/pmci
  • 3.mctpd链接:https://github.com/Intel-BMC/pmci/tree/master/mctpd

mctpd仓库代码,基本上看到是支持mctp over pcie的并且BMC是支持作为endpoint的。这符合我的需求。

我的需求如下:

1.bios作为bus owner,负责分配eid
2.bmc作为endpoint,访问其他pcie设备

2.1 libmctp分析

libmctp的代码仓库如下:
https://github.com/Intel-BMC/libmctp

对于mctp over pcie的支持,可查看文件:

build/ast2600-default/workspace/sources/libmctp-intel/libmctp.h
build/ast2600-default/workspace/sources/libmctp-intel/astpcie.c

库的功能实现用的是.c文件,实现基本的ioctl(),对于C++来说不好和kernel交互的代码。这里是实现就没什么可说的。

2.2.intel-bmcmctpd的实现

mctpd的代码仓库如下:
https://github.com/Intel-BMC/pmci/tree/master/mctpd

这一块的作用是作为一个dbus service,供其他client调用接口。代码结构比较清晰。

注意,这里面有一个yaml的文件需要导入,作为serverclient等的支持的头文件。

文件可以参考一个patch: https://github.com/Intel-BMC/openbmc/blob/ac27a5095790a2d49a44d7c46440e375a8f84812/meta-openbmc-mods/meta-common/recipes-phosphor/dbus/phosphor-dbus-interfaces/0032-update-meson-build-for-MCTP-interfaces.patch#L33,具体需要修改:
在这里插入图片描述
与:
在这里插入图片描述

2.3 导入intel bmc mctp over pcie的实现

注意:这里导入只是一个基本的功能测试mctp over pcie,不是实际功能开发。

参考git仓库上的.bb文件,资源路径:
https://github.com/Intel-BMC/openbmc/tree/1-release/meta-openbmc-mods/meta-common/recipes-phosphor/pmci.

在目录: meta-aspeed-sdk/recipes-phosphor/mctpd/中导入https://github.com/Intel-BMC/openbmc/blob/1-release/meta-openbmc-mods/meta-common/recipes-phosphor/pmci/mctpd.bb文件。

修改mctpd.bb文件名,改为:mctpd_1.0.bb,内容如:

SUMMARY = "MCTP Daemon"
DESCRIPTION = "Implementation of MCTP (DTMF DSP0236)"

LICENSE = "CLOSED"
SRC_URI = "file://mctpd.tar.gz"

S = "${WORKDIR}"
PV = "1.0+git${SRCPV}"

OECMAKE_SOURCEPATH = "${S}"

inherit cmake systemd

FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"

DEPENDS += " \
    libmctp-intel \
    systemd \
    sdbusplus \
    phosphor-logging \
    boost \
    i2c-tools \
    cli11 \
    nlohmann-json \
    gtest \
    phosphor-dbus-interfaces \
    udev \
    "


PACKAGECONFIG[systemd] = ",,systemd,libsystemd"
SYSTEMD_AUTO_ENABLE:${PN} = "enable"


do_install:append(){
    install -d ${D}/${systemd_system_unitdir}
    install -d ${D}/${bindir}
    install -d ${D}/${datadir}/mctp/

    install -m 755 ${WORKDIR}/${PN}-${PV}/mctpd ${D}/${bindir}
    install -m 0644 ${S}/configurations/mctp_config.json ${D}/${datadir}/mctp/mctp_config.json
    install -m 0644 ${S}/service_files/xyz.openbmc_project.mctpd@.service \
            ${D}/${systemd_system_unitdir}/xyz.openbmc_project.mctpd@.service
}

FILES:${PN} += "${systemd_system_unitdir}"
FILES:${PN} += "${datadir}/mctp/"
FILES:${PN} += "${bindir}"

如上,是因为当前使用的openbmc代码未加入intel mctp.bb文件,故把mctpd的代码从intel-bmc网站上下载下来之后,打包成:mctpd.tar.gz,整个目录结构如下:

在这里插入图片描述
采取命令:

# devtool modify mctpd

之后,需要修改build/ast2600-default/tmp/work/armv7ahf-vfpv4d16-openbmc-linux-gnueabi/mctpd/1.0+git/CMakeLists.txt中的内容:

set(CMAKE_CXX_STANDARD 23)
 -Wnull-dereference \  //需要去掉
install(FILES ${SERVICE_FILES} DESTINATION /usr/lib/systemd/system/) //修改为/usr目录下

另外,修改文件build/ast2600-default/workspace/sources/mctpd/src/SMBusBinding.cpp,注释掉其中的内容:

void SMBusBinding::readResponse()
{
    // smbusReceiverFd.async_wait(
    //     boost::asio::posix::descriptor_base::wait_error, [this](auto& ec) {
    //         if (ec)
    //         {
    //             phosphor::logging::log<phosphor::logging::level::ERR>(
    //                 "Error: mctp_smbus_read()");
    //             readResponse();
    //         }
    //         // through libmctp this will invoke rxMessage and message assembly
    //         mctp_smbus_read(smbus);
    //         readResponse();
    //     });
    phosphor::logging::log<phosphor::logging::level::ERR>(
                    "mctpd yuan modify it, Error: SMBusBinding::readResponse()");
}

另外,修改文件:build/ast2600-default/workspace/sources/mctpd/include/hw/aspeed/PCIeMonitor.hpp中的:

    static constexpr const char* astUdevPath =
        "/sys/devices/platform/ahb/ahb:apb/1e6e8000.mctp/misc/aspeed-mctp0";

修改文件:meta-aspeed-sdk/recipes-aspeed/packagegroups/packagegroup-oss.bb中的内容:

# delete mctp , wityuan noted 2024/08/25.
SUMMARY:${PN}-apps = "Open Source Applications"
RDEPENDS:${PN}-apps = " \
    mdio-tool \
    gperf \
    iperf3 \
    pciutils \
    ethtool \
    mmc-utils \
    i3c-tools \
    i2c-tools \
    xdma-test \
    libpeci \
    dhrystone \
    nbd-client \
    iozone3 \
    ncsi-netlink \
    hdparm \
    stressapptest \
    e2fsprogs-mke2fs \
    nvme-cli \
    ${@d.getVar('PREFERRED_PROVIDER_u-boot-fw-utils', True) or 'u-boot-fw-utils'} \
    aer-inject \
    fio \
    memtester \
    coremark \
    "

删掉了其中的mctp.

之后,执行如下命令,编译mctpd:

# bitbake -c build mctpd

2.4 导入intel-bmc libmctp pcie的实现

当前的openbmc代码实际上是包含libmctp-intel的实现的。修改libmctp-intelbb文件:
修改meta-aspeed-sdk/recipes-phosphor/pmci/libmctp-intel_git.bb文件,内容如:

SUMMARY = "libmctp:intel"
DESCRIPTION = "Implementation of MCTP(DMTF DSP0236)"

SRC_URI = "git://github.com/Intel-BMC/libmctp.git;protocol=https;branch=master"
SRCREV = "21dc38e911a27af2e914f834b2e2b775f7dad520"

S = "${WORKDIR}/git"

PV = "1.0+git"

LICENSE = "Apache-2.0 | GPL-2.0-or-later"
LIC_FILES_CHKSUM = "file://LICENSE;md5=0d30807bb7a4f16d36e96b78f9ed8fae"

inherit cmake systemd
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"

DEPENDS += "i2c-tools"

#FILES:${PN}-dev += ""
FILES:${PN} += " ${libdir}"

LIBVER = "0.1.0"

do_install:append() {
    install -d ${D}${libdir}
    install -m 755 ${WORKDIR}/${PN}-${PV}/libmctp_intel.so.${LIBVER} ${D}/${libdir}/
}

修改build/ast2600-default/workspace/sources/libmctp-intel/CMakeLists.txt文件,增加内容:

SET_TARGET_PROPERTIES(mctp_intel PROPERTIES VERSION 0.1.0 SOVERSION 0)

修改内容:

add_library (mctp_intel SHARED alloc.c asti3c.c astlpc.c core.c log.c libmctp.h serial.c astpcie.c smbus.c)

接着修改文件:build/ast2600-default/workspace/sources/libmctp-intel/astpcie.h中的内容:

/* driver device file */
#define AST_DRV_FILE "/dev/aspeed-mctp0"

注意,还需要修改文件:meta-aspeed-sdk/recipes-core/images/obmc-phosphor-image.bbappend:

IMAGE_INSTALL:append = " \
        webui-vue \
        libmctp \
        entity-manager \
        dbus-sensors \
        "

libmctp改为libmctp-intel.

执行编译操作:

# bitbake -c build libmctp-intel

编译成功后,启动BMC,或者在文件:build/ast2600-default/workspace/sources/libmctp-intel/oe-workdir/libmctp-intel-1.0+git中可以看到如下信息:

# ls /usr/lib/libm* -al
-rwxr-xr-x    1 root     root        271756 Mar  9  2018 /usr/lib/libm.so.6
lrwxrwxrwx    1 root     root            16 Mar  9  2018 /usr/lib/libmapper.so.1 -> libmapper.so.1.0
-rwxr-xr-x    1 root     root         13548 Mar  9  2018 /usr/lib/libmapper.so.1.0
lrwxrwxrwx    1 root     root            22 Mar  9  2018 /usr/lib/libmctp_intel.so.0 -> libmctp_intel.so.0.1.0
-rwxr-xr-x    1 root     root         34064 Mar  9  2018 /usr/lib/libmctp_intel.so.0.1.0
lrwxrwxrwx    1 root     root            15 Mar  9  2018 /usr/lib/libmnl.so.0 -> libmnl.so.0.2.0
-rwxr-xr-x    1 root     root         17748 Mar  9  2018 /usr/lib/libmnl.so.0.2.0
lrwxrwxrwx    1 root     root            17 Mar  9  2018 /usr/lib/libmount.so.1 -> libmount.so.1.1.0
-rwxr-xr-x    1 root     root        407264 Mar  9  2018 /usr/lib/libmount.so.1.1.0

在这里插入图片描述

注意:
BMC的驱动名称已经改变:

# ls /dev/aspeed-mctp0  -al
crw-------    1 root     root       10, 111 Sep 20 11:23 /dev/aspeed-mctp0

接着修改文件:build/ast2600-default/conf/local.conf,添加内容:

...
IMAGE_INSTALL:append = " mctpd"

以上,改完之后,编译生成镜像:

# bitbake obmc-phosphor-image

最终,启动BMC,在BMC串口下执行命令:

# /usr/bin/mctpd -b pcie &

然后检查是否成功启动dbus mctp服务。

  • 1.查看mctpd服务
# busctl | grep mctp
:1.71                                                  425 mctpd           root             :1.71         serial-getty@ttyS4.service                    -
xyz.openbmc_project.MCTP-pcie                          425 mctpd           root             :1.71         serial-getty@ttyS4.service 

在这里插入图片描述

  • 2.查看检查到哪些endpoint
# busctl tree xyz.openbmc_project.MCTP-pcie
`- /xyz
  `- /xyz/openbmc_project
    `- /xyz/openbmc_project/mctp
      `- /xyz/openbmc_project/mctp/device
        |- /xyz/openbmc_project/mctp/device/10
        |- /xyz/openbmc_project/mctp/device/29
        |- /xyz/openbmc_project/mctp/device/61
        `- /xyz/openbmc_project/mctp/device/8

在这里插入图片描述

  • 3.检查endpoint属性信息
# busctl introspect  xyz.openbmc_project.MCTP-pcie  /xyz/openbmc_project/mctp/device/10
NAME                                                 TYPE      SIGNATURE RESULT/VALUE                             FLAGS
org.freedesktop.DBus.Introspectable                  interface -         -                                        -
.Introspect                                          method    -         s                                        -
org.freedesktop.DBus.Peer                            interface -         -                                        -
.GetMachineId                                        method    -         s                                        -
.Ping                                                method    -         -                                        -
org.freedesktop.DBus.Properties                      interface -         -                                        -
.Get                                                 method    ss        v                                        -
.GetAll                                              method    s         a{sv}                                    -
.Set                                                 method    ssv       -                                        -
.PropertiesChanged                                   signal    sa{sv}as  -                                        -
xyz.openbmc_project.Common.UUID                      interface -         -                                        -
.UUID                                                property  s         "bca4af17-8995-5632-be7d-53f1697c7912"   emits-change
xyz.openbmc_project.Inventory.Decorator.LocationCode interface -         -                                        -
.LocationCode                                        property  s         ""                                       emits-change
xyz.openbmc_project.Inventory.Decorator.PCIDevice    interface -         -                                        -
.Bus                                                 property  y         57                                       emits-change
.Device                                              property  y         0                                        emits-change
.Function                                            property  y         0                                        emits-change
xyz.openbmc_project.MCTP.Endpoint                    interface -         -                                        -
.Mode                                                property  s         "xyz.openbmc_project.MCTP.Base.Bindin... emits-change
.NetworkId                                           property  q         0                                        emits-change
xyz.openbmc_project.MCTP.PCIVendorDefined            interface -         -                                        -
.MessageTypeProperty                                 property  aq        1 83                                     emits-change
.VendorID                                            property  s         "0x590"                                  emits-change
xyz.openbmc_project.MCTP.SupportedMessageTypes       interface -         -                                        -
.Ethernet                                            property  b         false                                    emits-change
.MctpControl                                         property  b         true                                     emits-change
.NCSI                                                property  b         false                                    emits-change
.NVMeMgmtMsg                                         property  b         false                                    emits-change
.PLDM                                                property  b         true                                     emits-change
.SPDM                                                property  b         false                                    emits-change
.VDIANA                                              property  b         false                                    emits-change
.VDPCI                                               property  b         true                                     emits-change
root@ast2600-default:~#

在这里插入图片描述

  • 4.检查另外一个endpoint:
# busctl introspect  xyz.openbmc_project.MCTP-pcie  /xyz/openbmc_project/mctp/device/8
NAME                                                 TYPE      SIGNATURE RESULT/VALUE                             FLAGS
org.freedesktop.DBus.Introspectable                  interface -         -                                        -
.Introspect                                          method    -         s                                        -
org.freedesktop.DBus.Peer                            interface -         -                                        -
.GetMachineId                                        method    -         s                                        -
.Ping                                                method    -         -                                        -
org.freedesktop.DBus.Properties                      interface -         -                                        -
.Get                                                 method    ss        v                                        -
.GetAll                                              method    s         a{sv}                                    -
.Set                                                 method    ssv       -                                        -
.PropertiesChanged                                   signal    sa{sv}as  -                                        -
xyz.openbmc_project.Common.UUID                      interface -         -                                        -
.UUID                                                property  s         "00000000-0000-0000-0000-000000000000"   emits-change
xyz.openbmc_project.Inventory.Decorator.LocationCode interface -         -                                        -
.LocationCode                                        property  s         ""                                       emits-change
xyz.openbmc_project.Inventory.Decorator.PCIDevice    interface -         -                                        -
.Bus                                                 property  y         0                                        emits-change
.Device                                              property  y         20                                       emits-change
.Function                                            property  y         6                                        emits-change
xyz.openbmc_project.MCTP.Endpoint                    interface -         -                                        -
.Mode                                                property  s         "xyz.openbmc_project.MCTP.Base.Bindin... emits-change
.NetworkId                                           property  q         0                                        emits-change
xyz.openbmc_project.MCTP.PCIVendorDefined            interface -         -                                        -
.MessageTypeProperty                                 property  aq        1 256                                    emits-change
.VendorID                                            property  s         "0x8086"                                 emits-change
xyz.openbmc_project.MCTP.SupportedMessageTypes       interface -         -                                        -
.Ethernet                                            property  b         false                                    emits-change
.MctpControl                                         property  b         true                                     emits-change
.NCSI                                                property  b         false                                    emits-change
.NVMeMgmtMsg                                         property  b         false                                    emits-change
.PLDM                                                property  b         false                                    emits-change
.SPDM                                                property  b         false                                    emits-change
.VDIANA                                              property  b         false                                    emits-change
.VDPCI                                               property  b         true                                     emits-change

如此,基本的mctp over pcie代码逻辑基本上跑通了。

3.问题与解决

3.1 报错libmctp-intel rdepends on libmctp-intel-dev

出现报错信息如下:

ERROR: libmctp-intel-1.0+git-r0 do_package_qa: QA Issue: libmctp-intel rdepends on libmctp-intel-dev [dev-deps]
ERROR: libmctp-intel-1.0+git-r0 do_package_qa: QA Issue: -dev package libmctp-intel-dev contains non-symlink .so '/usr/lib/libmctp_intel.so' [dev-elf]

针对此问题,解决办法如:
CmakeFile中添加:

SET_TARGET_PROPERTIES(mctp_intel PROPERTIES VERSION 0.1.0 SOVERSION 0)

这样可以生成:

lrwxrwxrwx  1 wityuan wityuan     18 826 23:19 libmctp_intel.so -> libmctp_intel.so.0
lrwxrwxrwx  1 wityuan wityuan     22 826 23:19 libmctp_intel.so.0 -> libmctp_intel.so.0.1.0
-rwxr-xr-x  1 wityuan wityuan 150972 826 23:19 libmctp_intel.so.0.1.0

然后: .bb 中添加:

do_install:append() {
    install -d ${D}${libdir}
    install -m 755 ${WORKDIR}/${PN}-${PV}/libmctp_intel.so.${LIBVER} ${D}/${libdir}/
}

或者使用静态库?!!, 暂时改为动态库了。

3.2 报错Pseudo log: path mismatch

报错信息如下:

ERROR: Task (/home/wityuan/Desktop/sdk_v09.01/openbmc/meta-aspeed-sdk/recipes-phosphor/mctpd/mctpd_1.0.bb:do_install) failed with exit code '1' 
Pseudo log:
path mismatch [3 links]: ino 21059040 db '/home/wityuan/Desktop/sdk_v09.01/openbmc/build/ast2600-default/tmp/work/armv7ahf-vfpv4d16-openbmc-linux-gnueabi/mctpd/1.0+git/package/usr/src/debug/mctpd/1.0+git/src/main.cpp' req '/home/wityuan/Desktop/sdk_v09.01/openbmc/build/ast2600-default/workspace/sources/mctpd/src/main.cpp'.

可以删除文件:

build/ast2600-default/tmp/work/armv7ahf-vfpv4d16-openbmc-linux-gnueabi/mctpd/1.0+git/pseudo/files.db

然后再次编译即可。目前比较好的办法还没找到。^_ ^

参考资料:https://wiki.yoctoproject.org/wiki/Pseudo_Abort,
解释信息如下:

Pseudo can suffer from problems where files are created or modified in pseudo's fakeroot context, then deleted outside of it. 
In particular, the inode number for that file may be reused. 
If some later access under pseudo uses that inode number, pseudo can see this and become confused about whether the files are the same file or not. 
Under older behaviour for pseudo, the modes of the old file may be applied to the new one, causing mode permission corruption.

3.3 报错package is not obeying usrmerge distro feature

报错信息如下:

<packagename> package is not obeying usrmerge distro feature. /<path> should be relocated to /usr. [usrmerge]

yocto上看到解释如下:

If usrmerge is in DISTRO_FEATURES, this check will ensure that no package installs files to root (/bin, /sbin, /lib, /lib64) directories. 
If you are seeing this message, it indicates that the do_install step (or perhaps the build process that do_install is calling into, 
e.g. make install is using hardcoded paths instead of the variables set up for this (bindir, sbindir, etc.), and should be changed so that it does.

修改办法直接是修改cmakelist中,将install目录改为/usr下。

3.4 报错Files/directories were installed but not shipped in any package

报错信息具体内容如:

<recipename>: Files/directories were installed but not shipped in any package [installed-vs-shipped]

具体解释可以查看文档:https://docs.yoctoproject.org/ref-manual/qa-checks.html,重点是:

Files have been installed within the do_install task but have not been included in any package by way of the FILES variable

修改办法:

Add the files to FILES for the package you want them to appear in (e.g. FILES:${PN} for the main package).
Delete the files at the end of the do_install task if the files are not needed in any package.

也就是需要对应修改:

FILES:${PN} += "..."
do_install:append() {
	...
}

最后,解决问题,需要多看官方文档:https://docs.yoctoproject.org/ref-manual/,一遍不够,多看几遍吧。另外,多分析bitbake源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2082947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全总结②

上一篇&#xff1a;网络安全总结① 下一篇&#xff1a; 传统防火墙 传统防火墙 技术&#xff1a;访问控制、代理技术、会话机制 工作层次&#xff1a;应用层一下 防御模式&#xff1a;通过防御设备划分边界&#xff0c;基于IP/端口和特征进行判断&#xff1b;以隔离为基础&am…

【Spring Boot 3】自定义拦截器

【Spring Boot 3】自定义拦截器 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或…

茶余饭后(六)

有人孤立你&#xff0c;证明你强大&#xff1b;有人嫉妒你&#xff0c;证明你出众&#xff1b;有人诋毁你&#xff0c;证明你有能力&#xff1b;有人议论你&#xff0c;证明你有价值&#xff1b;有人利用你&#xff0c;证明你有能力。所以原谅那些诋毁你的人&#xff0c;至少他…

到处在裁员,这个行业却在疯狂招人!

1.裁员浪潮不断 8月26日&#xff0c;IBM中国方面确认了将关闭中国研发部门的消息&#xff0c;这一决策涉及员工数量超过1000人。技术迭代浪潮前&#xff0c;哪怕是名企&#xff0c;攻守防退之间的转换也只在一瞬间。AI引发大裁员&#xff1f;这表明IBM正在积极适应技术变革&am…

win10配置adb环境变量

初始状态&#xff1a; 最简单的配置方案&#xff0c;直接复制adb所在路径&#xff1a; 粘贴进来确定即可&#xff1a; 然后打开 cmd 查看已经配置成功了&#xff1a;

MATLAB 手写Ply文件点云读取类(86)

MATLAB 手写Ply文件点云读取类(86) 一、算法介绍二、算法实现1.PLYReader.m 类文件2.可视化一、算法介绍 PLY是一种常见的点云文件格式,这里尝试手写一个读点云的类,查看是否能正常读取,结果将可视化,具体代码如下: 二、算法实现 1.PLYReader.m 类文件 classdef PLYR…

优秀的开源项目

目录 热key 多线程并行 秒级百G级日志工具 ES操作工具 消息推送平台 HTTP 客户端 业务层的分布式限流组件 企业级微服务解决方案 热key hotkey: 京东App后台中间件&#xff0c;毫秒级探测热点数据&#xff0c;毫秒级推送至服务器集群内存&#xff0c;大幅降低热key对数…

MinIo - java代码 实现图片上传至Minio桶

MinIO是一款开源的高性能、可伸缩、安全的对象存储系统,专为云原生和容器化环境而设计 (基于minio已经集成在服务器中) 第一步,毫无疑问肯定是创建一个桶(用于存放的容器) 这个Name根据自己的需求自定义 然后点击Create Bucket 可以看见新创建的桶已经完成 点击新创建的…

es集群详解

1、集群的介绍&#xff1a; 1.1、单机的elasticsearch做数据存储 必然面临两个问题&#xff1a;海量数据存储问题、单点故障问题。海量数据存储问题&#xff1a;将索引库从逻辑上拆分为N个分片&#xff08;shard&#xff09;&#xff0c;存储到多个节点。从逻辑上&#xff0c…

docker 镜像仓库的管理

目录 1 docker 镜像仓库介绍 1.1 什么是docker仓库 1.2 docker hub 2 docker仓库的工作原理 2.1 仓库中的三个角色 2.2 pull原理 2.3 push原理 3 使用互联网上提供的托管镜像仓库 3.1 docker hub 镜像仓库 3.1.1 docker hub 镜像仓库介绍 3.1.2 docker hub的使用方法 4 搭建doc…

数据仓库系列11:ETL的主要步骤是什么,它们分别有什么作用?

你是否曾经感觉被海量数据淹没?是否在寻找一种方法来有效地整合、转换和加载这些数据?如果是,那么你来对地方了。今天,我们将深入探讨ETL(Extract, Transform, Load)过程的三个关键步骤,这是每个大数据开发者都应该掌握的核心技能。准备好踏上成为数据整合大师的旅程了吗?让…

Dubbo源码解析之@DubboService、@DubboReference(Dubbo源码一)

更好的阅读体验&#xff1a;Dubbo源码解析之DubboService、DubboReference&#xff08;Dubbo源码一&#xff09; 视频讲解&#xff1a;https://www.bilibili.com/video/BV1nBsMejEbL 对于Dubbo用的最多的就是DubboService、DubboReference&#xff0c;与之对应的就是服务的提供…

diskgenuis打开vmdk文件提示读扇区错误

使用DiskGenius_V5_2_x86打开iKuai-0.vmdk 读扇区错误&#xff01; 磁盘: 起始于 0 扇区 共 1 个扇区。 (Err:0) 读扇区错误&#xff01; 磁盘: VD0:iKuai-0.vmdk(2GB) 起始于 0 扇区 共 2 个扇区。 (Err:0) 更换官网最新版本 https://www.diskgenius.cn/download.php 可…

一个PPT做3天?有这3个AI做PPT工具再也不发愁!

ppt是什么东西&#xff1f; ppt是英文Powerpoint的缩写&#xff0c;它是微软出品的演示文稿软件&#xff0c;因为其在演示领域的领导地位&#xff0c;也让它成为幻灯片或演示文稿的代名词。 一个完整的ppt&#xff0c;通常包含很多要素&#xff0c;如ppt封面页、ppt目录页、p…

解决Java中Long类型的序列化与JDK8时间的序列化

1.背景 SpringBoot与前端交互 这个场景下Long类型与前端JS交互时会存在精度丢失&#xff0c;根本原因是JS的Number支持不到19位&#xff0c;所以需要后端将Long类型的值转为StringJDK8的时间类 JDK8的时间类比如LocalDateTime、LocalDate 在交互时序列化默认格式是 “yyyy-MM-…

LLM 应用开发入门 - 实现 langchain.js ChatModel 接入火山引擎大模型和实现一个 CLI 聊天机器人(上)

前言 Langchain 是一个大语言模型(LLM)应用开发的框架,提供了 LLM 开发中各个阶段很多非常强大的辅助工具支持。对于进行 LLM 开发是必不可少的工具库。 本文将通过一个实际的开发例子来入门 LLM 开发基础工具链,并实现 langchain.js ChatModel 接入火山引擎大模型和基于…

【Python入门】第4节 函数

&#x1f4d6;第4节 函数 ✅函数介绍✅函数的定义✅函数的参数✅函数的返回值&#x1f9ca;None类型的应用场景 ✅函数说明文档✅函数的嵌套调用✅变量的作用域 ✅函数介绍 函数是&#xff1a; 组织好的、可重复使用的、用来实现特定功能的代码段使用函数的好处是&#xff1a;…

erlang学习:用OTP构建系统1

书上案例学习并测试 23.1 通用事件处理 -module(event_handler). %% API -export([make/1, add_handler/2, event/2]).%% 制作一个“什么都不干”的事件处理器Name&#xff08;一个原子&#xff09;。这样消息就有地方发送了。 make(Name) ->register(Name, spawn(fun() -…

SpringSpring搭建SpringJdbcTemplateSpring Bean管理Spring结合Mybatis

Spring基础 Spring是什么 Spring是一个轻量级的IOC和AOP的一站式Java开发框架,是为了简化企业级开发而生的 轻量级 框架体积小(核心模块) IOC Inversion Of Control (控制反转)缩写为IOC,是由Spring管理对象,而非传统实现中由程序代码直接操控,将创建对象的控制权反转给s…

8月28日

思维导图 作业&#xff1a; 使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 代码&#xff1a; #include <iostream>using namespace std;using datatype int; #define MAX 30struct SeqList {private:datatype *data;int size 0;int l…