RocketMQ4.4.0搭建过程记录

版本选型

https://zhuanlan.zhihu.com/p/573949726

官方demo

https://rocketmq.apache.org/zh/docs/quickStart/01quickstart/

官方部署方案选型

https://rocketmq.apache.org/zh/docs/deploymentOperations/01deploy

rocketmq-client官方支持

https://github.com/apache/rocketmq-clients/tree/rocketmq-client-java-5.0.0/java

官方只提供5.0以上的原生客户端支持,而且JDK需要11+,不适用公司框架

我司采用4.4.0版本,选用rocketmq-spring-boot-starter客户端sdk包

		<!-- MQ 消息中间件 --><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.2</version><exclusions><exclusion><artifactId>fastjson</artifactId><groupId>com.alibaba</groupId></exclusion></exclusions></dependency>

本地环境部署:

ip:192.168.1.214

踩坑笔记:

进入官网下载的二进制包解压目录:

cd /usr/local/ksb/rocketmq-all-4.4.0-bin-release/

  1. 启动namesrv路由服务: (类似于nacos服务发现和注册中心)

sudo nohup sh bin/mqnamesrv -n 192.168.1.214:9876 &

sudo tail -f /root/logs/rocketmqlogs/namesrv.log

查看端口是否正常开放:

netstat -ntlp | grep 9876

坑1:服务启动命令没有效果, 在当前目录nohub.out日志里,发现提示日志目录不存在

需要root权限执行, 统一加上sudo

坑2:服务启动命令依旧没有效果, 查看nohup.out日志文件, 提示JAVA_HOME没配置:

mjs@test-reguler:/usr/local/ksb/rocketmq-all-4.4.0-bin-release$ which java
/usr/lib/jvm/java-8-openjdk-amd64/bin/java

环境变量配置

sudo vi /etc/profile

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH

export NAMESRV_ADDR=127.0.0.1:9876

source /etc/profile

echo $JAVA_HOME

echo $NAMESRV_ADDR

再次依然没有用......

官方文档并没有交代这个问题, 查看mqnamesrv启动文件源码, 发现这行[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java[疑问]

不理解官方为何又把JAVA_HOME默认配置为/usr/java路径

于是手动修改bin/目录下runserver.sh和runbroker.sh文件里的JAVA_HOME变量配置:

#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

修改启动配置内存

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"

#!/bin/sh# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{echo "ERROR: $1 !!"exit 1
}[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
# [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8  -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT}  -XX:-UseLargePages"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"$JAVA ${JAVA_OPT} $@

  1. 启动broker服务: (同时承担计算和存储的功能, 5.0之后拆分为代理proxy和broker存储组件, 更利于云原生环境下的资源解耦)

sudo nohup sh bin/mqbroker -n 192.168.1.214:9876 -c conf/broker.conf autoCreateTopicEnable=true &

sudo tail -f /root/logs/rocketmqlogs/broker.log

查看端口是否正常开放:

netstat -ntlp | grep 10909

netstat -ntlp | grep 10911

  1. 启动管理后台:

sudo docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.1.214:9876" -p 8782:8080 -t apacherocketmq/rocketmq-dashboard:latest

http://192.168.1.214:8782/#/

再次启动:

sudo docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.1.214:9876" -p 8782:8080

  1. 查看进程:

ps -aux | grep rocket

mjs@test-reguler:~$ ps -aux | grep rocket
root       425  0.0  0.0   4636   812 ?        S    Feb17   0:00 sh /usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup -n 192.168.1.214:9876
root       438  0.1  0.6 3795328 211288 ?      Sl   Feb17   1:49 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow -XX:-UseLargePages -Djava.ext.dirs=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../lib -cp .:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../conf: org.apache.rocketmq.namesrv.NamesrvStartup -n 192.168.1.214:9876
root      3147  0.0  0.0   4636   824 ?        S    Feb17   0:00 sh /usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -n 192.168.1.214:9876 -c conf/broker.conf autoCreateTopicEnable=true
root      3184  2.5  1.3 5766664 438064 ?      Sl   Feb17  35:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -server -Xms256m -Xmx256m -Xmn128m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=15g -XX:-UseLargePages -XX:-UseBiasedLocking -Djava.ext.dirs=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../lib -cp .:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../conf: org.apache.rocketmq.broker.BrokerStartup -n 192.168.1.214:9876 -c conf/broker.conf autoCreateTopicEnable=true
root      8940  0.0  0.0   4336   736 ?        Ss+  Feb17   0:00 sh -c java $JAVA_OPTS -jar /rocketmq-dashboard.jar
root      9718  0.3  0.8 12057696 264940 ?     Sl+  Feb17   5:18 java -Drocketmq.namesrv.addr=192.168.1.214:9876 -jar /rocketmq-dashboard.jar
mjs       9802  0.0  0.0  13140  1048 pts/2    S+   16:22   0:00 grep --color=auto rocket

  1. 官方测试用例:

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

  1. 关闭服务:

sudo sh bin/mqshutdown broker

sudo sh bin/mqshutdown namesrv

  1. 在java客户端服务上调试

坑3:在服务器上可以收发消息,但外部java客户端连接提示超时:

org.springframework.messaging.MessagingException: sendDefaultImpl call timeout;

修改超时时间配置为6s后解决,首次发送同时要创建主题较慢:

# 消息发送超时时长,默认3s
rocketmq.producer.send-message-timeout=6000

题外话: 在亲手搭建完后, 再回过头比较一下ChatGPT给出的答案是怎么样的?

第一次较模糊的提问:

以下是ChatGPT答复内容:

1、下载和解压RocketMQ
首先,下载RocketMQ最新发布的压缩包。可以在官网查看最新发布链接:http://rocketmq.apache.org/release_notes/release-notes-4-7-1/。解压之后会得到一个名为rocketmq-all-4.7.1-bin-release.zip的文件,这里下载的是4.7.1版本。解压到你想要的文件夹中。2、准备环境和Java
RocketMQ需要先准备环境,包括Java和Linux环境,先安装JDK 8或者更新版本的Java,建议Java 8。3、配置环境变量
在Linux下,需要修改/etc/profile文件,将RocketMQ的安装路径,以及JAVA_HOME的路径定义到文件中:export ROCKETMQ_HOME=/opt/rocketmq
export PATH=$ROCKETMQ_HOME/bin:$JAVA_HOME/bin:$PATH4、启动NameServer
NameServer即服务器节点,需要修改RocketMQ源码中conf目录下的2个配置文件: broker.conf和namesrv.conf。- 先修改broker.conf,注释掉broker启动配置部分
- 然后修改,namesrv.conf,修改NameServer启动端口,默认9876修改完之后,在安装文件夹中运行如下命令:sh mqnamesrv即可启动NameServer。5、启动broker
在RocketMQ安装目录中,修改conf/2个配置文件,broker.conf和namesrv.conf,在和上面步骤相反的顺序下进行操作,先解开broker的配置注释,注意修改几个参数:broker.name=default_broker  // 修改broker名称
broker.id=0  // 修改broker ID然后再配置namesrv.conf,添加NameServer端口,默认为9876:#在这里配置NameServer地址
namesrv.addr=127.0.0.1:9876修改完毕后,在安装路径中运行如下命令:sh mqbroker -n 127.0.0.1:9876即可启动broker。6、启动监控中心
RocketMQ提供了方便的监控中心,可以用来监控broker和nameServer的状态,监控中心可在conf文件中进行配置,具体的配置可查看官方文档,通常配置如下:# Web 监控中心配置
# web.resources 是web资源文件路径,将静态资源解压到该路径
web.resources=/opt/rocketmq/web
# web.port配置监控中心的端口号
web.port=8080
# web.context 配置web启动的根路径
web.context=/web.resources目录中有个文件,rocketmq-plugins.tgz,解压到web.resources的目录,修改完配置后,运行如下命令:sh mqweb即可启动监控中心web页面,即可使用浏览器打开:http://localhost:8080 来访问监控中心,进行相关操作。7、停止和启动
在RocketMQ安装路径下运行如下命令,进行停止或启动:停止运行:
sh mqshutdown开始运行:sh mqstart以上就是RocketMQ安装和启动的全部过程,一般来说安装和启动还是比较简单的,写文件和修改配置对环境有要求,这点需要注意一下。

第二次较精准的提问?

1. 访问Apache RocketMQ 主页,https://rocketmq.apache.org/,选择“download”,下载 RocketMQ v4.4.0 的部署文件。2. 将 apache-rocketmq-4.4.0-bin-release.zip 文件解压到你的机器上,假设解压目录为/opt/rocketmq。3. 创建软件目录,在 /usr/local 下面创建一个 rocketmq 的文件夹,并将刚才解压的文件 rocketmq-4.4.0 复制到这个文件夹;4. 导入RocketMQ环境变量,让系统能够知道RocketMQ的安装目录,编辑 profile 文件:vi /etc/profile增加以下语句: 
export ROCKETMQ_HOME=/usr/local/rocketmq
export PATH = $PATH:$ROCKETMQ_HOME/bin保存profile 文件后,使配置文件生效:source /etc/profile 5. 修改 bin 目录下的 runbroker.sh 文件,将 JAVA_HOME 设置为 JDK的安装目录:vi $ROCKETMQ_HOME/bin/runbroker.sh修改其中的 JAVA_HOME 配置,例如: 
-export JAVA_HOME=/usr/local/jdk86. 配置 NameServer 地址,打开 conf 目录下的 2个配置文件broker.conf和namesrv.conf,分别将里面的 IP 设置为服务器的当前 IP 地址 。7. 启动 NameServer,cd 到 RocketMQ 目录下的 bin 目录,然后运行:sh mqnamesrv & 8. 启动 Broker,cd 到 RocketMQ 目录下的 bin 目录,然后运行:sh mqbroker -n localhost:9876 &9. 查看启动结果,可以使用 jps 命令查看当前进程中有没有名为“NameServer”和“Broker”的进程,即可知道 RocketMQ 已经启动成功了###  前台启动
1.停止RocketMQ服务,在bin目录下执行命令
```
./mqshutdown broker
```2.启动RocketMQ服务,在bin目录下执行命令
```
./mqbroker -n localhost:9876 
```
![](img/1.jpg)###  后台启动1.停止RocketMQ服务,在bin目录下执行命令
```
./mqshutdown broker
```
2. 后台启动,可以使用 nohup 命令运行 Broker: 
```
nohup sh mqbroker -n localhost:9876  &
```
如果需要查看启动日志可以用 tail 命令:
```
tail -f ~/logs/rocketmqlogs/broker.log
```## 
#### 四:常见问题1.mqshutdown 移除broker失败,提示绑定的实例数为0
解决方案:
打开namesrv的配置文件 `$ROCKETMQ_HOME/conf/namesrv.conf`,查看日志
```
#是否开启DeleteTopic流程删除topic,建议关闭,避免误操作
enablePropertyFilter=false
```把上面的值改为`enablePropertyFilter=true`
然后重启mqnameerver2.停止Broker失败,报错信息`Failed to invoke the command, please check if the Native Process Plugin is enabled`
解决方案:
编辑broker的配置文件 `/conf/broker.conf`,查看日志
```
#最大允许的broker拉取的未被消费的消息的总字节数 getMaxAccumulation。当设置为-1,则不拉取
#maxAccumulationMsgByteSize=-1
```把上面的值改为`maxAccumulationMsgByteSize=1638400`
然后重启mqbangker即可。3. Broker 日志中报 `No route info of this topic`的错误。解决方案:使用 DefaultMQAdmin 这个工具,设置 Topic 名字的可见性:
```
sh mqadmin updateTopic
```4. Broker 启动失败,报错信息`Start mqbroker failed`解决方案: 
1. 打开 `conf` 目录下的 2个配置文件broker.conf和namesrv.conf,查看`brokerIP1`和`brokerIP2`配置项是否正确。
2. 确认相应的端口号是否已经打开, 可以使用 `netstat -an` 命令查看。

可以看出确实能提升自己去网上查资料的效率,有些操作的坑也已经直接给出了答案(但没有交代为什么这么做的背景), 虽然太细节的基础问题还是得开发自己去排查.

可以提升查询文档的效率,过滤掉网上的信息噪音是值得肯定的.

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北大直博保送生论文涉嫌抄袭?原作者实名举报,北大南开火速调查

【导读】保送北大直博的学生被扒出抄袭了川大学生的SCI论文&#xff0c;还是从论文机构买的&#xff1f; 南开保送北大直博的学生&#xff0c;抄袭川大学生的SCI论文发了本普刊&#xff0c;还是直接英翻中&#xff1f; 更为离奇的是&#xff0c;这篇抄袭论文似乎是从论文辅导…

完成童年的梦想,用python画一个奥特曼

上班闲来无事 画个凹凸曼给女同事博博她开心。 首先奥特曼是由斜的椭圆&#xff0c;圆角矩形&#xff0c;圆形&#xff0c;以及曲线的组成的。此处绘制中&#xff0c;主要应用了曲线的的绘制&#xff0c;将奥特曼画的比较饱满。 本次绘制过过程中&#xff0c;自己编写了两个函…

OpenAI大动作|山姆·奥特曼亲探 GPT4: 极速+便宜将变成现实!

Laf 公众号已接入了 AI 绘画工具 Midjourney&#xff0c;可以让你轻松画出很多“大师”级的作品。同时还接入了 AI 聊天机器人&#xff0c;支持 GPT、Claude 以及 Laf 专有模型&#xff0c;可通过指令来随意切换模型。欢迎前来调戏&#x1f447; <<< 左右滑动见更多 &…

Sam Altman 山姆奥特曼:强化学习进展 Reinforcement Learning Progress

目录 Reinforcement Learning Progress 强化学习进展 PPO(近端策略优化)

Sam Altman 山姆奥特曼:How To Invest In Startups如何投资初创公司

How To Invest In Startups 如何投资初创公司 There is a lot of advice about how to be a good startup founder. But there isn’t very much about how to be a good startup investor. 关于如何成为一名优秀的创业公司创始人&#xff0c;有很多建议。但是&#xff0c;关于…

危险试探,产品经理赋予AI人格来打造品牌忠诚度

图片来源&#xff1a;由无界 AI工具生成 你可能不会相信&#xff0c;你的手机很可能变成你的虚拟情人&#xff0c;升级情人需要升级手机&#xff0c;而你从此再也不想换其他品牌手机。 AI时代&#xff0c;赋予产品以人格&#xff0c;让用户爱上产品&#xff0c;这或许是接下来产…

爬虫 post请求百度翻译 v2transapi 爬取信息失败

问题&#xff1a;在写爬虫的时候&#xff0c;使用到了eidtplus&#xff0c;将图中的表单数据复制下来之后&#xff0c;放入eidtplus添加成字典数据格式的时候&#xff0c;没有注意到query后面的单词的空格&#xff0c;导致爬虫爬取信息失败。 解决办法&#xff1a;将love单词前…

QT接入百度翻译api实现翻译

思路&#xff1a;将自己需要翻译的内容添加到百度翻译的api里面&#xff0c;然后通过get方法发送请求&#xff0c;异步接收返回的json格式数据并解析&#xff0c;然后将解析后的内容显示到界面。 步骤&#xff1a; 1.要实现该功能首先需要百度api的相关信息&#xff0c;因此需…

百度翻译API的调用

首先需要注册一个账号并申请成为个人开发者获取APP ID和密匙 百度翻译开放平台进入该网站注册即可 完成之后即可点击开通翻译其他服务 选择通用翻译并选择标准版&#xff0c;然后填入信息即可&#xff0c;服务器地址百度搜索IP地址&#xff0c;然后填写搜到的本机地址就可以了…

调用百度翻译api(超简单)

&#xff08;一共十行代码在最下面&#xff09; 1.打开百度翻译官网network找api 2.查看网址 和请求方式 3.查看传入的字典参数 4.返回的参数解析 返回的参数 s{errno: 0, data: [{k: good, v: adj. 好的; 优秀的; 有益的; 漂亮的&#xff0c;健全的 n. 好处&#xff0c;利益…

【基于stm32】【附代码】两块蓝牙模块HC-05进行通讯,不占用串口一的代码教程

目录 前言 一、两块hc-05蓝牙通讯的连接 二、使用步骤 1.hc-05从机&#xff0c;该教程主要是应用于【收数据】 usar.h代码 usart.c代码&#xff08;只引用stm32的串口2&#xff0c;串口一用于烧程序&#xff09; main.c 2.hc-05主机&#xff0c;该教程主要是应用于【发…

chatgpt赋能python:烧录单片机程序:Python的力量

烧录单片机程序&#xff1a;Python的力量 随着技术的发展和人类渴求的不断追求&#xff0c;电子设备的普及程度越来越高。在一个电子设备内部&#xff0c;单片机的应用非常广泛。然而&#xff0c;单片机作为计算机的重要组成部分&#xff0c;也需要相对应的程序来实现不同的功…

51单片机串口

该部分的笔记来自视频教程链接https://www.bilibili.com/video/BV1bt4y197NR/?spm_id_from333.788&vd_sourceb91967c499b23106586d7aa35af46413 一、51单片机串口基础介绍 一般的应用层的协议中采用和校验或CRC校验&#xff0c;而奇偶校验还是解决基本通信中的帧格式中的…

初学者入门:认识STM32单片机

本教程含有较多专业词汇&#xff0c;大部分时候&#xff0c;不完全理解并不影响继续往下阅读&#xff0c;大家只需要了解大致的概念即可。当然&#xff0c;也鼓励大家多查百度和多问chatgpt&#xff0c;让自己学会的更多。 什么是单片机&#xff1f; 单片机&#xff0c;就是把…

chatgpt赋能python:Python单片机:从入门到实践

Python单片机&#xff1a;从入门到实践 近年来&#xff0c;Python在嵌入式领域越来越受到开发者的青睐。Python具有易学易用的特点&#xff0c;方便开发者快速实现单片机的开发。本文将介绍Python单片机的基础知识以及实践应用。 Python单片机的基础知识 Python单片机用的是…

chatgpt赋能python:Python烧录单片机:快速的开发工具

Python烧录单片机&#xff1a;快速的开发工具 简介 Python是一种高级的编程语言&#xff0c;被广泛应用于各种领域&#xff0c;包括机器学习、数据分析和物联网等领域。Python的易用性和简洁性已经成为其成功的关键因素之一。Python也能在烧录单片机时提供极大的方便性和灵活…

推荐给程序员的书:七月图书推荐

七月&#xff0c;图灵原创书相继出炉&#xff0c;并在网店的排行榜上荣登前三甲&#xff0c;图灵原创书的作者皆是各社区的领军人物&#xff0c;有着相当深厚的技术功底&#xff0c;这是图灵原创书在《结网》后的一个跨越。 本月推荐&#xff0c;是本版书与外版书相结合&#x…

这五本 Python 急速入门必读的书,送给正在学习 Python 的你!

书籍是人类进步的阶梯&#xff0c;这句话从古至今都是适用的。为什么会这么说呢&#xff1f;书籍&#xff0c;它记录了人们实践的经验&#xff0c;这些经验有助于我们快速的学习&#xff0c;对于编程学习来说也不例外&#xff0c;今天就给大家带来了以下的书籍干货&#xff0c;…

人际沟通必看的书推荐

人际沟通与口才训练方面的书籍我推荐你看两本&#xff08;并且看这两本就完全足够了&#xff09;&#xff0c;一本是《沟通与说服必读12篇》&#xff0c;另一本是《演讲与口才必读12篇》&#xff0c;注意这两本书都仅能从12READS官网购买&#xff0c;避免广告&#xff0c;地址请…

学会演讲必看的五本书籍推荐

有哪些演讲必看的书值得推荐&#xff1f;今天小编为大家精选了以下这五本学会演讲必看的经典书籍&#xff0c;提升口才与演讲能力必读哦。首推榜首的《演讲与口才必读12篇》&#xff0c;虽然比其他的书要贵&#xff0c;但是真的有东西。 演讲必看的书推荐之一&#xff1a;《演…