IBM DMC运行在RedHat 9的FIPS模式

文章目录

  • 环境
  • 步骤
    • 打开RedHat的FIPS模式
    • 安装DMC
    • nssdb
    • pk12util和certutil
    • 导入certificate
      • 导入Liberty的SSL key
      • 导入Java的certificate
      • 查看nssdb(可选)
    • 配置jvm.options
    • 配置server.xml
    • 配置java.security
    • 配置dswebserver_override.properties
    • 重启DMC
    • 验证
  • 常见问题
    • RedHat 7没有fips-mode-setup
    • secmod.db
  • 参考

环境

  • Red Hat Enterprise Linux release 9.2 (Plow)
  • IBM Data Management Console 3.1.12 for Linux (x86)
    • WebSphere Application Server Version 23.0.0.9 Liberty - (23.0.0.9-cl230920230904-1158)
    • JRE:
[root@kai12071 bin]# $CONSOLE_DIR/java/jre/bin/java -version
java version "17.0.8" 2023-07-18
IBM Semeru Runtime Certified Edition 17.0.8.0 (build 17.0.8+7)
Eclipse OpenJ9 VM 17.0.8.0 (build openj9-0.40.0, JRE 17 Linux amd64-64-Bit Compressed References 20230718_477 (JIT enabled, AOT enabled)
OpenJ9   - d12d10c9e
OMR      - e80bff83b
JCL      - 30f808c1763 based on jdk-17.0.8+7)

步骤

打开RedHat的FIPS模式

查看当前FIPS模式:

[root@kai12071 ~]# cat /proc/sys/crypto/fips_enabled
0

或者:

[root@kai12071 ~]# fips-mode-setup --check
FIPS mode is disabled.

打开FIPS模式:

[root@kai12071 ~]# fips-mode-setup --enable
Kernel initramdisks are being regenerated. This might take some time.
Setting system policy to FIPS
Note: System-wide crypto policies are applied on application start-up.
It is recommended to restart the system for the change of policies
to fully take place.
FIPS mode will be enabled.
Please reboot the system for the setting to take effect.

按照提示,重启一下电脑。

然后再次查看FIPS模式:

[root@kai12071 ~]# cat /proc/sys/crypto/fips_enabled
1

或者:

[root@kai12071 ~]# fips-mode-setup --check
FIPS mode is enabled.

可见,FIPS模式已打开。

安装DMC

DMC下载地址为: https://epwt-www.mybluemix.net/software/support/trial/cst/programwebsite.wss?siteId=1120&tabId=2917 ,如下图所示:

在这里插入图片描述

我下载的是DMC 3.1.12 for Linux (x64)的命令行安装包,文件名为: ibm-datamgmtconsole-3.1.12-linux.tgz

将其下载到 /root/Downloads/dmc3112 目录下。

解压: tar -zxvf ibm-datamgmtconsole-3.1.12-linux.tgz

运行 setup.sh ,安装DMC,具体安装过程略。

安装好DMC以后,用以下两个链接登录:

  • http://kai12071.fyre.ibm.com:11080/console
  • https://kai12071.fyre.ibm.com:11081/console

添加repo DB和monitored DB,确保DMC工作正常:

在这里插入图片描述

nssdb

确保系统已安装 nssdb

[root@kai12071 ~]# ll /etc/pki/nssdb
total 28
-rw-r--r-- 1 root root  9216 Dec  8 18:19 cert9.db
-rw-r--r-- 1 root root 11264 Dec  8 18:19 key4.db
-rw-r--r-- 1 root root   451 Mar 22  2023 pkcs11.txt

注:此处没有 secmod.db 文件,我们也不需要该文件,但是在我的测试中,若缺少该文件则会有问题(详见文末的常见问题)。解决办法就是创建一个空的 secmod.db 文件:

[root@kai12071 bin]# touch /etc/pki/nssdb/secmod.db

pk12util和certutil

确保系统已安装 pk12utilcertutil

[root@kai12071 ~]# which pk12util
/usr/bin/pk12util
[root@kai12071 ~]# which certutil
/usr/bin/certutil

注:可用 man pk12utilman certutil 查看用法。

列出nssdb里的certificate:

[root@kai12071 ibm-datamgmtconsole]# certutil -L -d /etc/pki/nssdb

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

可见,目前nssdb是空的。

导入certificate

为了方便,先export一些变量。

创建文件 export.sh 如下:

#!/bin/bash
export CONSOLE_DIR=/root/Downloads/dmc3112/ibm-datamgmtconsole
export NSSDB_PATH=/etc/pki/nssdb
export liberty_dsweb=${CONSOLE_DIR}/wlp/usr/servers/dsweb
export KEYSTORE_PASSWORD=password
export CONSOLE_CONF_DIR=${CONSOLE_DIR}/Config
export console_conf_file=${CONSOLE_CONF_DIR}/dswebserver_override.properties

添加 x 属性( chmod +x export.sh ),并运行脚本( . ./export.sh )。

导入Liberty的SSL key

[root@kai12071 ~]# pk12util -i ${CONSOLE_DIR}/wlp/usr/servers/dsweb/resources/security/key.p12 -W "$KEYSTORE_PASSWORD" -d $NSSDB_PATH -K "$KEYSTORE_PASSWORD"
pk12util: PKCS12 IMPORT SUCCESSFUL

查看nssdb:

[root@kai12071 ~]# certutil -L -d /etc/pki/nssdb

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

default                                                      u,u,u

注:本例中Certificate Nickname是 default ,在别的系统上有可能不同,一定要先看一下。

修改certificate属性:

[root@kai12071 ~]# certutil -M -n "default" -t "CT,CT,CT" -d ${NSSDB_PATH}

再次查看nssdb:

[root@kai12071 ~]# certutil -L -d /etc/pki/nssdb

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

default                                                      CTu,Cu,Cu

可见,属性并没有变成 CT,CT,CT ,不过貌似也没有关系。

注:对属性值 CTu 的解释,可参见 man certutil 。摘录如下:

  • C: Trusted CA (implies c)
  • T: trusted CA for client authentication (ssl server only)
  • u: means that there is a private key associated with the certificate. It is a dynamic flag and you cannot set it with certutil.

导入Java的certificate

通过Java自带的 keytool 工具,把cacerts由 JKS 类型转换为 PKCS12 类型,再导入nssdb。

首先确认 cacerts 文件已存在:

[root@kai12071 ~]# ls -al $CONSOLE_DIR/java/jre/lib/security/cacerts
-rw-r--r-- 1 root root 167595 Dec  8 18:08 /root/Downloads/dmc3112/ibm-datamgmtconsole/java/jre/lib/security/cacerts

转换类型:

[root@kai12071 ~]# $CONSOLE_DIR/java/jre/bin/keytool -noprompt -importkeystore -srckeystore $CONSOLE_DIR/java/jre/lib/security/cacerts -destkeystore /tmp/cacerts.p12 -srcstoretype JKS -deststoretype PKCS12 -deststorepass changeit -srcstorepass changeit
Importing keystore /root/Downloads/dmc3112/ibm-datamgmtconsole/java/jre/lib/security/cacerts to /tmp/cacerts.p12...
Entry for alias _,cro,ocertsign_sa,oucertsign_root_ca_g2 [jdk] successfully imported.
Entry for alias _,ccn,obeijing_certificate_authority,cnbjca_global_root_ca2 [jdk] successfully imported.
......
......

确保已生成目标文件:

[root@kai12071 ~]# ls -al /tmp/cacerts.p12
-rw-r--r-- 1 root root 187680 Dec  8 18:43 /tmp/cacerts.p12

导入nssdb:

[root@kai12071 ~]# pk12util -i /tmp/cacerts.p12 -W changeit -d $NSSDB_PATH
pk12util: PKCS12 IMPORT SUCCESSFUL

删除无用文件:

[root@kai12071 ~]# rm -f /tmp/cacerts.p12

查看nssdb:

[root@kai12071 ~]# certutil -L -d $NSSDB_PATH

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

default                                                      CTu,Cu,Cu
_,cro,ocertsign_sa,oucertsign_root_ca_g2 [jdk]               ,,
_,ccn,obeijing_certificate_authority,cnbjca_global_root_ca2 [jdk] ,,
_,cus,stillinois,lchicago,otrustwave_holdings,_inc,cntrustwave_global_certification_authority [jdk] ,,
......
......

修改certificate属性:

[root@kai12071 ~]# certutil -L -d $NSSDB_PATH | grep ",," | sed 's/ ,,.*//' | sed 's/ *$//' | while IFS= read -r line; do echo "Trust ${line} ..."; certutil -M -n "$line" -t "CT,CT,CT" -d $NSSDB_PATH; done
Trust _,cro,ocertsign_sa,oucertsign_root_ca_g2 [jdk] ...
Trust _,ccn,obeijing_certificate_authority,cnbjca_global_root_ca2 [jdk] ...
Trust _,cus,stillinois,lchicago,otrustwave_holdings,_inc,cntrustwave_global_certification_authority [jdk] ...
......
......

再次查看nssdb:

[root@kai12071 ~]# certutil -L -d $NSSDB_PATH

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

default                                                      CTu,Cu,Cu
_,cro,ocertsign_sa,oucertsign_root_ca_g2 [jdk]               CT,C,C
_,ccn,obeijing_certificate_authority,cnbjca_global_root_ca2 [jdk] CT,C,C
_,cus,stillinois,lchicago,otrustwave_holdings,_inc,cntrustwave_global_certification_authority [jdk] CT,C,C
......
......

查看nssdb(可选)

前面的工作都完成后,查看一下nssdb:

[root@kai12071 ~]# certutil -K -d ${NSSDB_PATH}
certutil: Checking token "NSS FIPS 140-2 Certificate DB" in slot "NSS FIPS 140-2 User Private Key Services"
< 0> rsa      642041b44793a07b6d67a9ef6f24ebac63caeb71   default

注: -K 表示列出key ID。

[root@kai12071 ~]# certutil -L -d ${NSSDB_PATH}

Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

default                                                      CTu,Cu,Cu
_,cro,ocertsign_sa,oucertsign_root_ca_g2 [jdk]               CT,C,C
_,ccn,obeijing_certificate_authority,cnbjca_global_root_ca2 [jdk] CT,C,C
_,cus,stillinois,lchicago,otrustwave_holdings,_inc,cntrustwave_global_certification_authority [jdk] CT,C,C
......
......

配置jvm.options

${liberty_dsweb}/jvm.options 文件备份一下,然后修改文件,添加如下内容:

-Dsemeru.fips=true
-Djava.security.debug=semerufips
-Djavax.net.ssl.trustStoreType=PKCS11
-Djavax.net.ssl.trustStore=NONE
-Djavax.net.ssl.trustStoreProvider=SunPKCS11-NSS-FIPS

配置server.xml

${liberty_dsweb}/server.xml 文件备份一下,然后修改文件,找到如下内容:

<include location="${dshome}/Config/SSLConfig.xml" optional="true"/>

将其修改为:

<include location="${dshome}/Config/FIPSSSLConfig.xml" optional="true"/>

注: SSLConfig.xml 文件内容如下:

<server>
	<keyStore id="defaultKeyStore" password="${wlp.keystore.password}" location="${wlp.keystore.location}" type="${wlp.keystore.type}"/>
	<keyStore id="defaultTrustStore" password="${wlp.truststore.password}" location="${wlp.truststore.location}" type="${wlp.truststore.type}"/>
</server>

FIPSSSLConfig.xml 文件内容如下:

<server description="FIPS liberty SSL configuration">
	<!-- The FIPS SSL configuration. See https://www.ibm.com/support/pages/node/6612693 for more details -->
	<!-- Kesytore as defined by documentation: https://www.ibm.com/support/pages/node/6612693 -->
	<!-- Truststore not specified, will default to the specified keystore -->
	<!-- TLSv1.2 only although it might be enforced by FIPS already -->
	<!-- Ciphers list not specified, letting underlying FIPS configuration to decide which ciphers are appropriate -->
	<ssl id="defaultSSLConfig" keyStoreRef="defaultKeyStore" sslProtocol="TLSv1.2"/>
	<keyStore id="defaultKeyStore" location="${dshome}/Config/pkcs11cfg.cfg" type="PKCS11-NSS-FIPS" fileBased="false" password="changeit" provider="SunPKCS11-NSS-FIPS"/>
</server>

配置java.security

${CONSOLE_DIR}/java/jre/conf/security/java.security 文件备份一下,然后修改文件,找到 # Java Restricted Security Mode 部分,添加如下内容:

RestrictedSecurity1.jce.provider.5 = SunJCE [{SecretKeyFactory, PBKDF2WithHmacSHA1, *}, \
    {SecretKeyFactory, PBKDF2WithHmacSHA224, *}, \
    {SecretKeyFactory, PBKDF2WithHmacSHA256, *}, \
    {SecretKeyFactory, PBKDF2WithHmacSHA384, *}, \
    {SecretKeyFactory, PBKDF2WithHmacSHA512, *}]

配置dswebserver_override.properties

备份 ${CONSOLE_CONF_DIR}/dswebserver_override.properties 文件,然后修改文件,添加如下内容:

FIPS_MODE=true

重启DMC

/root/Downloads/dmc3112/ibm-datamgmtconsole/bin 目录下,重启DMC:

[root@kai12071 bin]# ./restart.sh
Fri Dec  8 07:18:05 PM PST 2023 Stopping IBM Db2 Data Management Console

Stopping server dsweb.
Server dsweb stopped.
Fri Dec  8 07:18:07 PM PST 2023 Successfully stopped IBM Db2 Data Management Console.
Updating the application server bootstrap and environment properties ...
Updating the applications ...
Fri Dec 8 07:18:18 PM PST 2023 Starting IBM Db2 Data Management Console.

Starting server dsweb.
Server dsweb started with process ID 5287.
Fri Dec 8 07:18:20 PM PST 2023 Successfully started IBM Db2 Data Management Console.
******************************************************************************

Summary
	* Web console HTTP URL
 		http://kai12071.fyre.ibm.com:11080/console

	* Web console HTTPS URL
 		https://kai12071.fyre.ibm.com:11081/console

注:也可以先 ./stop.sh ,再 ./startup.sh

验证

登录DMC:

  • http://kai12071.fyre.ibm.com:11080/console
  • https://kai12071.fyre.ibm.com:11081/console

确保DMC工作正常。

在这里插入图片描述

至此,工作全部完成。

常见问题

RedHat 7没有fips-mode-setup

RedHat 8和9自带 fips-mode-setup ,可以直接用,但ReHat 7并没有该工具。

官网提供了在RedHat 7上如何手工打开FIPS模式的文档: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/chap-federal_standards_and_regulations#sect-Federal_Information_Processing_Standard

注:我没有实际测试过。

secmod.db

在RedHat 8上, /etc/pki/nssdb 目录下的文件为:

[root@kai12101 ~]# ls /etc/pki/nssdb/
cert8.db  cert9.db  key3.db  key4.db  pkcs11.txt  secmod.db

在RedHat 8上, /etc/pki/nssdb 目录下的文件为:

[root@kai12071 ~]# ls /etc/pki/nssdb
cert9.db  key4.db  pkcs11.txt

我们实际使用时,并不需要 secmod.db 文件,但是在我的测试中,最后启动DMC的时候,虽然貌似能启动,但是实际并没有启起来。在Liberty的log文件 $CONSOLE_DIR/logs/messages.log 里,报错如下:

[12/8/23, 19:18:19:882 PST] 00000021 LogService-9-com.ibm.ws.config                               E CWWKE0701E: FrameworkEvent ERROR org.osgi.framework.BundleException: Exception in com.ibm.ws.config.internal.WSConfigActivator.start() of bundle com.ibm.ws.config.
        at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:839)
        at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:767)
......
......
Caused by: java.lang.ExceptionInInitializerError
        at java.base/java.lang.J9VMInternals.ensureError(Unknown Source)
        at java.base/java.lang.J9VMInternals.recordInitializationFailure(Unknown Source)
......
......
Caused by: java.security.ProviderException: Could not initialize NSS
        at sun.security.pkcs11.SunPKCS11.<init>(Unknown Source)
        at jdk.crypto.cryptoki/sun.security.pkcs11.SunPKCS11$1.run(Unknown Source)
......
......
Caused by: java.io.FileNotFoundException: /etc/pki/nssdb/secmod.db
        at jdk.crypto.cryptoki/sun.security.pkcs11.Secmod.initialize(Unknown Source)
        ... 42 more

注意其中的 java.io.FileNotFoundException: /etc/pki/nssdb/secmod.db ,可能Liberty启动时还是会检查该文件是否存在。

解决办法就是创建一个空的 secmod.db 文件:

[root@kai12071 bin]# touch /etc/pki/nssdb/secmod.db

参考

  • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/security_hardening/using-the-system-wide-cryptographic-policies_security-hardening#switching-the-system-to-fips-mode_using-the-system-wide-cryptographic-policies
  • https://epwt-www.mybluemix.net/software/support/trial/cst/programwebsite.wss?siteId=1120&tabId=2917
  • https://openliberty.io/docs/latest/enable-fips.html
  • https://stackoverflow.com/questions/11538988/nss-shared-db-not-working-with-sunpkcs11
  • https://www.ibm.com/docs/en/was-liberty/nd?topic=liberty-setting-up-fips-compliance
  • https://wiki.archlinux.org/title/Network_Security_Services

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

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

相关文章

解读 | 为什么有很多名人让人们警惕人工智能

大家好&#xff0c;我是极智视界&#xff0c;欢迎关注我的公众号&#xff0c;获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;https://t.zsxq.com/0aiNxERDq 这个话题总能引起很…

Firewalld 防火墙配置

文章目录 Firewalld 防火墙配置1. Firewalld 概述2. 区域名称及策略规则3. Firewalld 配置方法4. Firewalld 参数和命令5. Firewalld 两种模式6. Firewalld 使用 Firewalld 防火墙配置 1. Firewalld 概述 firewalld 是一个动态防火墙管理器&#xff0c;作为 Systemd 管理的防…

串口通信(1)-硬件知识

本文讲解串口通信的硬件知识。让读者快速了解硬件知识&#xff0c;为下一步编写代码做基础。 目录 一、概述 二、串口通信分类 2.1信息的传送方向进行分类 2.2同步通信和异步通信 三、串口协议 3.1 RS232 3.1.1 电气特性 3.1.2 连接器的机械特性 3.1.3 连接类型 3.1…

算法:买卖股票的最佳时机(快慢指针和动态规划)

快慢指针 时间复杂度 O(n) 空间复杂度 O(1) /*** param {number[]} prices* return {number}*/ var maxProfit function (prices) {let l 0let r 1let temp 0while (r < prices.length - 1) {// 如果当前左值大于右值说明当前不是最佳买入时机// 所以将右指针赋值给左指…

痤疮分割 实验心路历程

数据集的制作 将labelme生成的标注文件记普通的json文件转成coco数据集格式的json文件 图像分辨率过大 如果不做任何调整&#xff1a; 会出现“killed”的报错&#xff0c;表示图片像素过大&#xff0c;显卡内存不够&#xff0c;无法支撑训练 显卡 换成更高性能的显卡&am…

视频剪辑:视频创意制作,背景图片融合视频制作画中画效果

随着社交媒体的兴起&#xff0c;视频制作不再仅仅是专业人士的专利。每个人都可以通过一些技巧&#xff0c;创作出独特而富有吸引力的视频内容。视频剪辑是一种非常重要的技术&#xff0c;它能让视频从平淡无奇变为生动有趣。背景图片融合视频制作画中画效果&#xff0c;也能增…

APD--传感器

#1 Current temperature coeffiency Hamamastu Si APD S8664, with same bias, **low temperature**, **higher gain**, it means that **higher current output**. #2, PD

市场全局复盘 20231211

昨日回顾&#xff1a; SELECT TOP 10000 CODE,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅,所属行业,主力净额,DDE大单净量,CONVERT(DATETIME, 最后涨停时间, 120) AS 最后涨停时间 FROM dbo.全部&#xff21;股20231208_ALL WHERE 连板天 > 1AND DDE大单净量 > …

C#科学绘图之scottPlot绘制多个图像

文章目录 示例移除图像图例信号图 scott系列&#xff1a;绘图初步 示例 从名字就能看出&#xff0c;ScottPlot的绘图函数AddScatter的作用是为图窗添加数据点&#xff0c;换言之&#xff0c;每调用一次AddScatter&#xff0c;就可以在图窗中添加一组图像。下面添加两个按钮&a…

Java最全面试题专题---2、Java集合容器(1)

集合容器概述 什么是集合 **集合框架&#xff1a;**用于存储数据的容器。 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。 任何集合框架都包含三大块内容&#xff1a;对外的接口、接口的实现和对集合运算的算法。 **接口&#xff1a;**表示集合的抽象数据类…

文件扩展名修改:txt文本如何批量修改为word文档格式,高效修改一步到位

在日常工作中&#xff0c;经常要处理各种类型的文本文件&#xff0c;其中txt文件和Word文档是最为常见的两种格式。有时候&#xff0c;要将大量的txt文件修改为Word文档格式&#xff0c;以便在Microsoft Word中打开、编辑和排版。虽然可以手动将txt文件重命名为.docx格式&#…

InsCode实践分享:如何实现自动化代码审查和质量控制?

文章目录 文章目录 概要 整体架构流程 InsCode的解释 技术展示 小结 概要 InsCode是一款面向中小型企业的代码审查和自动化质量控制工具。本文将分享如何使用InsCode来实现自动化代码审查和质量控制&#xff0c;帮助企业在代码开发和维护过程中降低风险&#xff0c;提高效率和…

Volatility3内存取证工具安装及入门在Linux下的安装教程

1-1. Volatility3简介 Volatility 是一个完全开源的工具&#xff0c;用于从内存 (RAM) 样本中提取数字工件。支持Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android等多类型操作系统系统的内存取证。 针对竞赛这块&#xff08;CTF、技能大赛等&#xff09;基本上都…

PP和PVC可以相互粘接吗?

PP&#xff08;聚丙烯&#xff09;和PVC&#xff08;聚氯乙烯&#xff09;是两种不同类型的塑料&#xff0c;它们的化学性质和表面特性不同&#xff0c;因此直接的粘接会比较困难。这是因为它们的分子结构和化学成分不太相容&#xff0c;不易产生牢固的粘接。通常情况&#xff…

使用NVM切换不同版本的node

什么情况会切换不同版本 今天在拉取一个项目之后需要安装一下依赖&#xff0c;然后就出现了下边的问题&#xff1a; 可以看出我目前node是18.18.0&#xff0c;该项目需要8 || 10 || 12 || 14 || 16 || 17&#xff0c;那我总不能去把node卸载再重新下个版本&#xff0c;那么现…

查询优化与事务处理——触发器、事务、锁

一、认识触发器&#xff1a; 触发器是在对表进行插入&#xff0e;更新或删除操作时自动执行的存储过程。触发器通常用于强制业务规则&#xff0c;是--种高级约束&#xff0e;可以定义比用CHECK约束更为复杂的约束&#xff0c;可执行复杂的SQL语句〈如F/WHLE/CASE)&#xff0c;…

OpenHarmony创新赛人气投票活动,最佳人气作品由你来定!

12月1日至12月15日 十大入围作品线上投票激战正酣 最佳人气作品&#xff0c;由你来定&#xff01; 投票链接&#xff1a;OpenHarmony创新赛人气作品投票正式开启——最佳人气作品&#xff0c;由你来定&#xff01; - 文章 OpenHarmony开发者论坛

C语言leetcode集训二:字符串(1):字符串遍历

今天集训的内容是字符串中的字符串遍历题&#xff0c;仍然是简单题&#xff0c;但也可以掌握一些字符串所必要的知识&#xff0c;加深对字符串的理解&#xff0c;关于字符数组和字符串&#xff0c;字符串的输入输出在这就不再做过多赘述&#xff0c;关于字符串的问题&#xff0…

《IT圈里的“鄙视链”:看不起谁又被谁看不起?》

文章目录 每日一句正能量前言一、编程语言篇二、工具篇三、操作系统篇四、硬件篇五、职场篇后记 每日一句正能量 人的结构就是相互支撑&#xff0c;众人的事业需要每个人的参与。 前言 每个领域都存在着错综复杂的鄙视链,这一点在IT 领域更为突出。从编程语言、工具&#xff0…

简单的 u-popup 弹出框

uniapp中的popup组件可以用于弹出简单的提示框、操作框、菜单等。它可以通过position属性控制弹出框的位置&#xff0c;不同的position值会使得弹出框呈现不同的弹出形式 目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 …