【LAMMPS学习】三、构建LAMMPS(11)开发构建选项

3. 构建 LAMMPS

3.11.开发构建选项 

LAMMPS 中的构建过程提供了一些在开发、测试或调试期间有用的额外选项。

3.11.1.监视编译标志(仅限 CMake)

有时需要验证 CMake 构建生成的编译标志的完整序列。要在编译期间启用更详细的输出,可以使用以下选项。

-D CMAKE_VERBOSE_MAKEFILE=value    # value = no (default) or yes

无需重新配置即可执行此操作的另一种方法是调用 make,并将变量 VERBOSE 设置为 1:

make VERBOSE=1

3.11.2.使用 clang-tidy 启用静态代码分析(仅限 CMake)

clang-tidy 工具是一种静态代码分析工具,用于诊断(并可能修复)典型的编程错误或编码风格违规。它有一个模块化的测试框架,可以进行调整,以帮助在问题变成错误之前识别问题,并帮助实现大型代码库(如 LAMMPS)的现代化。可以使用以下 CMake 标志为所有 C++ 代码启用它

-D ENABLE_CLANG_TIDY=value    # value = no (default) or yes

启用此标志后,所有源文件将被处理两次,首先进行编译,然后进行分析。请注意,分析可能比编译本身更耗时。

3.11.3.报告缺失和不需要的“#include”语句(仅限 CMake)

LAMMPS 编程风格中记录了 LAMMPS 中如何、何时使用和排序 include 语句的约定。为了帮助遵循这些约定,可以使用“包括您使用的内容”工具。该工具仍在开发中,对于像 LAMMPS 这样的大型复杂项目,存在一些误报,因此建议的更改需要手动验证。建议至少使用0.16版本,该版本的错误报告比早期版本要少得多。要安装IWYU工具包,您需要安装clang编译器及其开发包。下载与 clang 编译器版本匹配的 IWYU 版本,配置、构建并安装它。

生成报告的必要步骤可以在 CMake 配置期间通过 CMake 变量启用。

-D ENABLE_IWYU=value    # value = no (default) or yes

这将检查是否可以在路径中找到所需的二进制文件(include-what-you-use 或 iwyu)和 python 脚本脚本(iwyu-tool 或 iwyu_tool 或 iwyu_tool.py)。然后可以开始分析:

make iwyu

这可能首先运行一些编译,因为分析依赖于记录进行编译所需的所有命令。

3.11.4.地址、未定义行为和线程清理程序支持(仅限 CMake)

GCC 和 Clang 等编译器支持生成检测二进制文件,这些二进制文件使用不同的清理程序库来检测运行时代码中的问题。他们可以检测到以下问题:

内存泄漏

未定义的行为

数据竞赛

请注意,这种仪器通常会带来性能影响(但比使用 Valgrind 等具有更低级别方法的工具要少得多)。为了启用这些功能,需要将额外的编译器标志添加到编译和链接阶段。这是通过在配置期间设置 ENABLE_SANITIZER 变量来完成的。例子:

-D ENABLE_SANITIZER=none       # no sanitizer active (default)
-D ENABLE_SANITIZER=address    # enable address sanitizer / memory leak checker
-D ENABLE_SANITIZER=leak       # enable memory leak checker (only)
-D ENABLE_SANITIZER=undefined  # enable undefined behavior sanitizer
-D ENABLE_SANITIZER=thread     # enable thread sanitizer

3.11.5.代码覆盖率和单元测试(仅限 CMake)

LAMMPS 代码在开发过程中要经过多个级别的自动化测试:

  • 集成测试(即代码是否可以在各种平台上以及使用各种编译器和设置进行编译),
  • 单元测试(即代码的某些函数或类是否针对给定输入产生预期结果),
  • 运行测试(即所选输入卡组是否可以运行完成而不会因多种配置而崩溃),
  • 回归测试(即选定的输入示例是否在给定误差范围内通过给定数量的步骤和操作重现相同的结果)。

可以在 https://ci.lammps.org 上查看此自动化测试的状态。

用于集成、运行和回归测试的脚本和输入保存在 GitHub 上 LAMMPS 项目的单独存储库中。一些测试也作为 GitHub Actions 运行,它们的配置文件位于 LAMMPS git 树的 .github/workflows/ 文件夹中。

单元测试工具集成到 LAMMPS 源代码分发本身的 CMake 构建过程中。可以通过在 CMake 配置步骤中设置 -D ENABLE_TESTING=on 来启用它。它需要 YAML 库和匹配的开发标头进行编译(如果在本地找不到这些库,则将下载该库的最新版本并与 LAMMPS 和测试程序一起编译),并将下载并编译特定版本的 GoogleTest C++ 测试用于实施测试的框架。

软件版本和 LAMMPS 配置要求

测试框架的编译器和库版本要求比LAMMPS的主要部分更严格。例如,RHEL/CentOS 7.x(版本 4.8.x)的默认 GNU C++ 和 Fortran 编译器是不够的。 CMake 配置将尝试检测不兼容的版本,并跳过不兼容的测试或因错误而停止。此外,可用测试的数量将取决于已安装的 LAMMPS 软件包、开发环境、操作系统和配置设置。

编译完成后,使用 ctest 命令在 build 文件夹中启动单元测试,该命令是 CMake 软件的一部分。该命令的输出将如下所示:

  $ ctest
   Test project /home/akohlmey/compile/lammps/build-testing
        Start   1: RunLammps
  1/563 Test   #1: RunLammps ..........................................   Passed    0.28 sec
        Start   2: HelpMessage
  2/563 Test   #2: HelpMessage ........................................   Passed    0.06 sec
        Start   3: InvalidFlag
  3/563 Test   #3: InvalidFlag ........................................   Passed    0.06 sec
        Start   4: Tokenizer
  4/563 Test   #4: Tokenizer ..........................................   Passed    0.05 sec
        Start   5: MemPool
  5/563 Test   #5: MemPool ............................................   Passed    0.05 sec
        Start   6: ArgUtils
  6/563 Test   #6: ArgUtils ...........................................   Passed    0.05 sec
      [...]
        Start 561: ImproperStyle:zero
561/563 Test #561: ImproperStyle:zero .................................   Passed    0.07 sec
        Start 562: TestMliapPyUnified
562/563 Test #562: TestMliapPyUnified .................................   Passed    0.16 sec
        Start 563: TestPairList
563/563 Test #563: TestPairList .......................................   Passed    0.06 sec

100% tests passed, 0 tests failed out of 563

Label Time Summary:
generated    =   0.85 sec*proc (3 tests)
noWindows    =   4.16 sec*proc (2 tests)
slow         =  78.33 sec*proc (67 tests)
unstable     =  28.23 sec*proc (34 tests)

Total Test time (real) = 132.34 sec

ctest 命令有很多选项,最重要的是:

Option

Function

-V

verbose output: display output of individual test runs

-j <num>

parallel run: run <num> tests in parallel

-R <regex>

run subset of tests matching the regular expression <regex>

-E <regex>

exclude subset of tests matching the regular expression <regex>

-L <regex>

run subset of tests with a label matching the regular expression <regex>

-LE <regex>

exclude subset of tests with a label matching the regular expression <regex>

-N

dry-run: display list of tests without running them

-T memcheck

run tests with valgrind memory checker (if available)

在其完整实施过程中,单元测试框架将包括以不同编程语言(C++、C、Python、Fortran)实施的多种测试,并测试 LAMMPS 软件及其功能的不同方面。测试将适应 LAMMPS 的编译设置,因此,如果先决条件功能在 LAMMPS 中不可用,则将跳过测试。

ctest 程序所示的测试是 unittest 目录树中的 CMakeLists.txt 文件中定义的命令行。一些测试只是使用特定的命令行标志执行 LAMMPS 并检查屏幕上的输出是否有预期的内容。大量单元测试是使用 GoogleTest 框架并链接到 LAMMPS 库的特殊测试程序,用于测试单个函数或创建 LAMMPS 类实例、执行一个或多个命令并检查 LAMMPS 类层次结构内的数据。还有针对 LAMMPS 的 C 库、Fortran 和 Python 模块接口的测试。 Python 测试使用 Python“unittest”模块的方式与其他测试使用 GoogleTest 的方式类似。这些特殊的测试程序被构造为在内部执行多个单独的测试,并且每个测试都包含对内部数据按预期更改的多项检查(也称为断言)。

强制计算或修改样式(例如,非绑定和绑定交互的样式以及选定的修复程序)的测试是通过使用更通用的测试程序来运行的,该程序从 YAML 格式的文件中读取其输入。 YAML 文件提供了有关如何自定义测试程序以测试特定样式以及(如果需要)特定设置的信息。要添加另一种类似样式(例如新的配对样式)的测试,通常添加合适的 YAML 文件就足够了。手册的程序员指南部分提供了添加测试的详细说明。下面给出了测试期间发生的情况的描述。

力类型的单元测试 

LAMMPS 的很大一部分是通过pair_style 命令、bond_style 命令、angle_style 命令、dihedral_style 命令、improperty_style 命令和 kspace_style 命令选择的用于计算非键和键相互作用的不同“样式”。由于这些都共享通用接口,因此可以编写通用测试程序,为少于 100 个原子的小型测试系统调用这些通用接口,并将结果与​​预先记录的参考结果进行比较。测试运行是多个单独测试运行的集合,每个测试运行与基于模板输入文件、单独命令设置、相对误差范围和存储在带有 .yaml 后缀的 YAML 格式文件中的参考数据的参考结果进行多次比较。目前已实现程序 test_pair_style 、 test_bond_style 、 test_angle_style 、 test_dihedral_style 和 test_improper_style 。他们将在 run 0 计算之后以及在使用修复 nve 进行 MD 的几个步骤之后比较所有原子的力、能量和(全局)应力,每个步骤都有不同设置的多个变体以及多个加速样式。如果缺少先决条件样式或包,则会跳过各个测试。所有强制样式测试都将在单个 MPI 进程上执行,因此使用 CMake 选项 -D BUILD_MPI=off 可以显着加快测试速度,因为这将跳过每次测试运行的 MPI 初始化。下面是一个示例命令和输出:

$ test_pair_style mol-pair-lj_cut.yaml
[==========] Running 6 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 6 tests from PairStyle
[ RUN      ] PairStyle.plain
[       OK ] PairStyle.plain (24 ms)
[ RUN      ] PairStyle.omp
[       OK ] PairStyle.omp (18 ms)
[ RUN      ] PairStyle.intel
[       OK ] PairStyle.intel (6 ms)
[ RUN      ] PairStyle.opt
[  SKIPPED ] PairStyle.opt (0 ms)
[ RUN      ] PairStyle.single
[       OK ] PairStyle.single (7 ms)
[ RUN      ] PairStyle.extract
[       OK ] PairStyle.extract (6 ms)
[----------] 6 tests from PairStyle (62 ms total)

[----------] Global test environment tear-down
[==========] 6 tests from 1 test suite ran. (63 ms total)
[  PASSED  ] 5 tests.
[  SKIPPED ] 1 test, listed below:
[  SKIPPED ] PairStyle.opt

在这种特殊情况下,进行了 6 组测试中的 5 组,跳过 lj/cut/opt 对样式的测试,因为测试可执行文件不包含它。要了解执行哪些单独的测试,您(当前)需要阅读源代码。您可以使用代码覆盖率记录(请参阅下一节)来确认测试覆盖各个源文件中的代码路径的程度。

力类型测试程序有一组通用选项:

Option

Function

-g <newfile>

regenerate reference data in new YAML file

-u

update reference data in the original YAML file

-s

print error statistics for each group of comparisons

-v

verbose output: also print the executed LAMMPS commands

ctest 工具没有直接将标志传递给各个测试程序的机制,但已经实现了一种解决方法,可以在环境变量  TEST_ARGS 中设置这些标志。例子:
env TEST_ARGS=-s ctest -V -R BondStyle

要添加尚未涵盖的样式的测试,通常最好将类似样式的 YAML 文件复制到新文件,编辑样式的详细信息(如何调用它,如何设置其系数)并然后使用 -g 运行测试命令,并使用重新生成的文件或 -u 选项替换初始测试文件。如果生成运行未完成,-u 选项将破坏原始文件,因此建议使用 -g,除非 YAML 文件经过充分测试并正常工作。

有些强制风格测试运行起来相当慢,有些则对 CPU 架构、编译器工具链、编译器优化等微小差异非常敏感。这些测试被标记为“慢”和/或“不稳定”标签,因此可以使用  -LE 标志选择性地排除这些测试,或者使用  -L 标志选择这些测试。
YAML 文件的建议和注意事项:
  • 应在未启用任何代码优化或相关编译器标志的情况下记录参考结果。
  • epsilon 参数定义参考结果必须满足的相对精度。测试几何结构通常具有高能和低能部分,因此浮点数学截断误差会产生重大影响。某些函数形式和势比其他函数形式和势的噪声更大,因此需要调整此参数。通常可以使用 1.0e-13 左右的值,但在某些情况下可能需要大至 1.0e-8。
  • OPT、OPENMP 和 INTEL 对类型的测试是使用自动重新调整的 epsilon 执行的,以考虑代码优化和不同求和顺序带来的额外精度损失。
  • 当使用(积极的)编译器优化进行编译时,某些测试可能会失败。建议详细检查各个测试,以确定特定属性的特定错误是否可以接受(通常是),或者这可能表明代码编译错误(或由于显着地重新排序操作,从而减少错误取消)。

时间步长相关修复的单元测试 

在 MD 时间步长期间定期调用修复样式的重要子集,并操纵每个原子的属性,例如位置、速度和力。对于这些修复样式,测试可以以与力场非常相似的方式完成,因此有一个测试程序 test_fix_timestep 与上一节中描述的力场样式测试器共享大量代码、属性和命令行标志。

该测试仪将设置一个小分子系统,以 verlet 运行方式运行 4 个 MD 步骤,然后编写二进制重新启动并继续执行另外 4 个 MD 步骤。此时,坐标和速度被记录并与参考数据进行比较。然后系统被清除、重新启动并再次运行第二个 4 MD 步骤,并将数据与相同的参考进行比较。随后再次重新启动,之后将每原子类型质量替换为每原子质量,并再次重复第二个 4 MD 步骤并与相同的参考进行比较。还记录并比较了修复的全局标量和矢量数据。如果修复是恒温器,因此可以提取内部属性 t_target ,则将其与参考数据进行比较。使用 respa 运行方式重复测试。

如果修复程序在 OPENMP 包中具有多线程版本,则也会针对该版本重复整套测试。

为此,YAML 格式测试输入必须满足一些附加条件。

  • 要测试的修复(并且仅此修复)应在 prerequisites: 部分中列出
  • 要测试的修复必须在 post_commands: 部分中使用修复 ID test 指定。本节可能包含其他命令和其他修复(例如,用于测试恒温器或力操纵修复的修复 nve 实例)
  • 对于可以统计对全局维里贡献的修复,行 fix_modify test virial yes 应包含在测试输入的 post_commands: 部分中。
  • 对于恒温器修复,目标温度应从任意值(例如 50K)渐变到输入为 ${t_target} 的预定义目标温度。
  • 对于包含恒温支持但未在输入中启用的修复(例如,使用默认设置修复刚性), post_commands: 部分应包含行 variable t_target delete 来禁用目标温度斜坡检查以避免误报。

当 ENABLE_TESTING 处于活动状态时,使用自定义链接器可缩短链接时间

当编译启用测试的 LAMMPS 时,大多数测试可执行文件将需要链接到 LAMMPS 库。由于当启用许多包时,这可能是一个包含许多 C++ 对象的非常大的库,因此在使用 GNU BFD 链接器(例如 Linux 系统)的计算机上,链接时间可能会变得非常长。诸如 mold 链接器、LLVM 项目的 lld 链接器或 GNU binutils 提供的 gold 链接器等替代方案可以大大加快此步骤(按此顺序)。默认情况下,CMake 将测试是否可以启用这三个中的任何一个,并在 ENABLE_TESTING 处于活动状态时使用它。也可以通过 CMAKE_CUSTOM_LINKER CMake 变量手动选择。允许的值为 mold 、 lld 、 gold 、 bfd 或 default 。 default 选项将使用系统默认链接器,否则将显式选择链接器。此选项仅适用于 GNU 或 Clang C++ 编译器。

其他组件和实用功能的测试 

验证实用功能或 LAMMPS 特定组件的其他测试作为独立可执行文件实现,可能需要也可能不需要创建合适的 LAMMPS 实例。这些测试更加具体,不需要 YAML 格式的输入文件。要添加测试,需要扩展现有源文件或添加新文件,这又需要向源文件夹中的 CMakeLists.txt 文件添加内容。

收集并可视化代码覆盖率指标 

您还可以在运行 LAMMPS 或测试时收集代码覆盖率指标,方法是在 CMake 配置期间启用代码覆盖率支持:

-D ENABLE_COVERAGE=on  # enable coverage measurements (off by default)

这将检测所有目标文件,以将有关在执行期间访问哪些代码行的信息写入相应目标文件旁边的文件中。可以对它们进行后处理,以直观地显示覆盖程度以及访问哪些代码路径和未采用哪些代码路径。在进行单元测试时(见上文),这对于确定代码的哪些部分未执行以及仍然缺少哪种测试非常有帮助。覆盖率数据是累积的,即每次新运行都会添加新数据。

启用代码覆盖率还将添加以下构建目标,以在运行 LAMMPS 可执行文件或单元测试后生成覆盖率报告:

make gen_coverage_html   # generate coverage report in HTML format
make gen_coverage_xml    # generate coverage report in XML format
make clean_coverage_html # delete folder with HTML format coverage report
make reset_coverage      # delete all collected coverage data and HTML output

这些报告需要安装 GCOVR。最简单的方法是通过 pip 安装它:

pip install git+https://github.com/gcovr/gcovr.git

使用 gen_coverage_html 进行后处理后,结果位于文件夹 coverage_html 中,可以使用网络浏览器查看。下图说明了数据的呈现方式。

_images/coverage-overview-top.png

Top of the overview page
概览页面顶部

_images/coverage-overview-manybody.png

Styles with good coverage
遮盖力好的款式

_images/coverage-file-top.png

Top of individual source page
单个源页面顶部

_images/coverage-file-branches.png

Source page with branches
带有分支的源页面

3.11.6.编码风格实用程序 

为了帮助在 LAMMPS 中实施一些编码风格约定,添加了一些额外的构建目标。这些需要 Python 3.5 或更高版本,并且只能在类 Unix 操作系统和文件系统上正常工作。
可以使用以下选项。

make check-whitespace    # search for files with whitespace issues
make fix-whitespace      # correct whitespace issues in files
make check-homepage      # search for files with old LAMMPS homepage URLs
make fix-homepage        # correct LAMMPS homepage URLs in files
make check-errordocs     # search for deprecated error docs in header files
make fix-errordocs       # remove error docs in header files
make check-permissions   # search for files with permissions issues
make fix-permissions     # correct permissions issues in files
make check-docs          # search for several issues in the manual
make check-version       # list files with pending release version tags
make check               # run all check targets from above

这些应该有助于使源文件和文档文件符合 LAMMPS 开发人员的某些编码风格偏好。

3.11.7. Clang 格式支持 

对于 unittest 和 src 树中的代码,我们正在转换为使用 clang-format 工具来帮助保持一致的源代码格式样式。需要与 Clang 版本 8.0 或更高版本捆绑在一起的 clang-format 命令。配置位于相应文件夹中名为 .clang-format 的文件中。由于 clang-format 的修改可能很重要,而且 - 特别是对于“遗留样式代码” - 它们并不总是提高可读性,因此目前大量文件的顶部有一个 // clang-format off ,这将禁用加工。截至 2021 年秋季,所有文件都已通过这种方式“受到保护”,或者启用了全部或部分 clang 格式处理。随着时间的推移,“受保护”的文件将被重构和更新,以便 clang-format 也可以应用于它们。

建议所有新贡献的文件在编写代码时使用clang-format处理或者进行编码风格处理(包括上一段提到的脚本)

如果 clang-format 可用,则可以使用如下命令单独更新文件:

clang-format -i some_file.cpp

以下目标可用于 GNU make 和 CMake:

make format-src       # apply clang-format to all files in src and the package folders
make format-tests     # apply clang-format to all files in the unittest tree

3.11.8. GitHub 命令行界面 

GitHub 正在开发一个命令行工具,通过名为 gh 的命令与 GitHub 网站进行交互。当使用 GitHub 上托管的 Git 存储库(如 LAMMPS)时,这非常方便。因此强烈建议在进行 LAMMPS 开发时安装它。

gh 命令的功能正在不断扩展,请参阅 https://cli.github.com/manual/ 上的文档

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DenseNet《Densely Connected Convolutional Networks》

DenseNet学习笔记 摘要引言DenseNetsResNetsDense connectivityResNet 和 DenseNet 的对比DenseBlock 向前传播的过程Composite functionPooling layersGrowth rateBottleneck layersCompression 压缩实现细节 实验训练 代码复现 摘要 最近的研究表明&#xff0c;如果卷积网络…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(自定义组件的生命周期)

自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期&#xff0c;这些回调函数是私有的&#xff0c;在运行时由开发框架在特定的时间进行调用&#xff0c;不能从应用程序中手动调用这些回调函数。 说明&#xff1a; 本模块首批接口从API version 7开始支持&#x…

c语言(动态内存管理函数)

1. 为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有&#xff1a; int arr[10] {0}; char a; 但是上述的开辟空间的⽅式有两个特点&#xff1a; 但是上述的开辟空间的⽅式有两个特点&#xff1a; • 空间开辟⼤⼩是固定的。 • 数组在申明的时候&#xff0c;必须指…

php 对接Mintegral汇量海外广告平台收益接口Reporting API

今天对接的是Mintegral广告reporting api接口&#xff0c;拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Mintegral后台就能看到文档地址以及参数&#xff1a; 文档地址&#xff1a;https://cdn-adn-https.rayjump.com/cdn-adn/reporting_api/MintegralRA.…

Java基于微信小程序的二手交易系统的实现(V2.0)

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、Python 技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#…

C++初阶:string类相关练习题

目录 1. 字符串相加2. 反转字母3. 字符串中唯一字母4. 字符串中最后一个单词5. 验证回文串6. 反转字符II7. 反转字符串中的单词8. 字符串相乘 1. 字符串相加 题目信息&#xff1a; 题目连接&#xff1a; 字符串相加 class Solution { public:string addStrings(string num1, s…

Ubuntu24.04即将发布,支持Linux内核6.8。该版本会有哪些亮点?

更多内容在 Canonical 计划 2024 年 4 月发布 Ubuntu 24.04 LTS 发行版&#xff0c;将获得长达 12 年的支持。Ubuntu 24.04 LTS&#xff0c;代号“Noble Numbat”&#xff0c;是Ubuntu发行版的最新长期支持&#xff08;LTS&#xff09;版本。12年的支持意味着你会得到 五年的维…

谷歌DeepMind推出3D游戏AI代理SIMA,实现自然语言操控游戏新纪元

近日&#xff0c;谷歌DeepMind研究团队推出了一款名为SIMA的创新AI代理&#xff0c;专为3D游戏环境设计。这款代理独树一帜&#xff0c;无需访问游戏源代码或依赖定制API&#xff0c;仅通过输入图像和简单的自然语言文本指令&#xff0c;便能实现与人类玩家相当的游戏操作。 AI…

C++有关内存的那些事

个人主页&#xff1a;PingdiGuo_guo 收录转栏&#xff1a;C干货专栏 前言 本篇博客是讲解关于C内存的一些知识点的。 文章目录 前言 1.内存函数 1.1memcpy函数 1.2memmove函数 1.3 memset函数 2.各数据类型占用 2.1bool类型 2.2char类型 2.3short、int、long类型及整数…

计算机硕士,毕业直接后端开发岗,选择C++还是java?

我自己是一名工作多年的C程序员&#xff0c;大学学习的编程语言就是C/C&#xff0c;参加工作后自学了Python、Java、Golang等语言。 现在从事自动驾驶行业的工作&#xff0c;工作中主要使用的编程语言是C和Python。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整…

canopen使用

CAN 总线协议 1&#xff09;、启动SDO 下载协议 ccs&#xff1a;客户端 指定命令 1&#xff1a;开始下载请求 •scs&#xff1a;服务器命令符 3&#xff1a;开始下载响应 •n&#xff1a;只有当e 1和s1&#xff0c;否则为0。如果有效则表示字节在d不这样做的数量有效包…

外包干了20天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入杭州某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…

3个好用的WP免费主题

免费wordpress模板下载 高端大气上档次的免费wordpress主题&#xff0c;首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html 经典的红色免费wordpress主题 这是一款经典的免费wordpress主题&#xff0c;被广泛应用于多个行业的网站。 https…

SQL:窗口函数之OVER()

窗口函数 通用格式 “函数 OVER (PARTITION BY 分组 ORDER BY 排序依据 升降序)”。 这里记录下OVER() 以及搭配LEAD/LAG函数的使用方法&#xff08;执行平台Impala&#xff09; 目录 OVER函数1、不加条件的OVER函数——得到所有的汇总结果2、仅有排序的OVER函数——得到按顺序…

HAL库W25Q16+fatfs文件系统移植

配置时钟树 配置时钟树时钟频率为72 SPI1外挂SPIflash 其他不用改这里挂的是一个W25Q16 文件分类管理 生成原始代码 加入W25Q16的驱动代码 忘记配片选线了&#xff0c;这里加上 /*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin GPIO_PIN_4;GPIO_InitStruct.Mode GPIO_…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.5 科目余额查询理

SAP提供了强大的科目余额查询功能&#xff0c;可以查询科目的借贷方及余额&#xff0c;同时&#xff0c;也可以追溯到明细凭证。在凭证记账后&#xff0c;科目的余额就会同步得到更新。预制凭证是不更新科目余额的。 科目余额查询及追溯的操作步骤 路径&#xff1a;SAP菜单&g…

我的春招求职面经

智能指针在面试时经常被问到&#xff0c;最近自己也在写&#xff0c;有一点思考&#xff0c;于是找到了这样一个题目&#xff0c;可以看看&#xff0c;上面这个代码有什么问题&#xff1f;留言区说出你的答案吧&#xff01; 最后分享一下之前的实习->春招->秋招等文章汇总…

atomgit访问令牌就创建的时候显示一下

AtomGit 是开放原子开源基金会提供的代码托管平台&#xff0c;帮助团队更快、更安全地交付更好的软件。 在创建访问令牌的时候&#xff0c;发现创建之后点不出来令牌字段&#xff0c;不像其它网站会在令牌列表那里显示出来。在“我的令牌”页面只能看到令牌名字和权限&#xff…

设计模式—组合模式

定义: 组合模式&#xff08;Composite Pattern&#xff09;又称为合成模式、部分-整体模式&#xff08;Part-Whole&#xff09;&#xff0c;主要用来描述部分与整体的关系。 定义&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;使用户对单个对象和…

适用于vue3的vant4组件 没有日期时间选择器

项目中需要用到日期和时间一同选择的场景 本来想用 如下代码 van-datetime-picker 发现咋整也不好使 刚开始还以为是引入的问题 后来发现是vant4根本就没这玩应了… <van-datetime-pickerv-model"currentDate"type"datetime"title"选择完整时间&q…