Java操作Influxdb2.x

本片文章不讲怎么安装,只讲安装后如何用JAVA代码操作库表

  • 1.创建数据库
  • 2.为bucket添加TELEGRAF配置
  • 3.TELEGRAF配置参数说明
  • 4.配置数据库的访问权限API TOKENS
  • 5.JAVA代码操作库表
    • 5.1 yaml
    • 5.2 pom依赖
    • 5.3 config
    • 5.4 controller
    • 5.5 查询方法、结果集提取方法

1.创建数据库

Influxdb2.x是有管理界面平台的,以本地为例,游览器访问 :http://127.0.0.1:8086,登录后,即可看到该界面,根据图片顺序操作即可

在这里插入图片描述

这里的bucket(桶)就是数据库

在这里插入图片描述

选择(配置)数据库数据保存策略

在这里插入图片描述

2.为bucket添加TELEGRAF配置

在这里插入图片描述

这里选择第1步创建的数据库

在这里插入图片描述

来源这里数据sys后会自动筛选,点击即可

在这里插入图片描述

点击后,右下角的创建按钮会亮起,点击按钮进行配置

在这里插入图片描述

数据库的配置文件名称后,点击保存和测试,配置内容不需要自己填写会自动生成

在这里插入图片描述

保存后出现该界面代表创建完成,会返回给两个配置信息:export INFLUX_TOKEN 和 telegraf --config
点击后关闭界面

在这里插入图片描述

点击配置文件名称会打开配置文件的内容

在这里插入图片描述

配置内容如下:

# Configuration for telegraf agent
[agent]## Default data collection interval for all inputsinterval = "10s"## Rounds collection interval to 'interval'## ie, if interval="10s" then always collect on :00, :10, :20, etc.round_interval = true## Telegraf will send metrics to outputs in batches of at most## metric_batch_size metrics.## This controls the size of writes that Telegraf sends to output plugins.metric_batch_size = 1000## Maximum number of unwritten metrics per output.  Increasing this value## allows for longer periods of output downtime without dropping metrics at the## cost of higher maximum memory usage.metric_buffer_limit = 10000## Collection jitter is used to jitter the collection by a random amount.## Each plugin will sleep for a random time within jitter before collecting.## This can be used to avoid many plugins querying things like sysfs at the## same time, which can have a measurable effect on the system.collection_jitter = "0s"## Default flushing interval for all outputs. Maximum flush_interval will be## flush_interval + flush_jitterflush_interval = "10s"## Jitter the flush interval by a random amount. This is primarily to avoid## large write spikes for users running a large number of telegraf instances.## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15sflush_jitter = "0s"## By default or when set to "0s", precision will be set to the same## timestamp order as the collection interval, with the maximum being 1s.##   ie, when interval = "10s", precision will be "1s"##       when interval = "250ms", precision will be "1ms"## Precision will NOT be used for service inputs. It is up to each individual## service input to set the timestamp at the appropriate precision.## Valid time units are "ns", "us" (or "µs"), "ms", "s".precision = ""## Log at debug level.# debug = false## Log only error level messages.# quiet = false## Log target controls the destination for logs and can be one of "file",## "stderr" or, on Windows, "eventlog".  When set to "file", the output file## is determined by the "logfile" setting.# logtarget = "file"## Name of the file to be logged to when using the "file" logtarget.  If set to## the empty string then logs are written to stderr.# logfile = ""## The logfile will be rotated after the time interval specified.  When set## to 0 no time based rotation is performed.  Logs are rotated only when## written to, if there is no log activity rotation may be delayed.# logfile_rotation_interval = "0d"## The logfile will be rotated when it becomes larger than the specified## size.  When set to 0 no size based rotation is performed.# logfile_rotation_max_size = "0MB"## Maximum number of rotated archives to keep, any older logs are deleted.## If set to -1, no archives are removed.# logfile_rotation_max_archives = 5## Pick a timezone to use when logging or type 'local' for local time.## Example: America/Chicago# log_with_timezone = ""## Override default hostname, if empty use os.Hostname()hostname = ""## If set to true, do no set the "host" tag in the telegraf agent.omit_hostname = false
[[outputs.influxdb_v2]]## The URLs of the InfluxDB cluster nodes.#### Multiple URLs can be specified for a single cluster, only ONE of the## urls will be written to each interval.##   ex: urls = ["https://us-west-2-1.aws.cloud2.influxdata.com"]urls = ["http://127.0.0.1:8086"]## Token for authentication.token = "$INFLUX_TOKEN"## Organization is the name of the organization you wish to write to; must exist.organization = "org"## Destination bucket to write into.bucket = "db2"## The value of this tag will be used to determine the bucket.  If this## tag is not set the 'bucket' option is used as the default.# bucket_tag = ""## If true, the bucket tag will not be added to the metric.# exclude_bucket_tag = false## Timeout for HTTP messages.# timeout = "5s"## Additional HTTP headers# http_headers = {"X-Special-Header" = "Special-Value"}## HTTP Proxy override, if unset values the standard proxy environment## variables are consulted to determine which proxy, if any, should be used.# http_proxy = "http://corporate.proxy:3128"## HTTP User-Agent# user_agent = "telegraf"## Content-Encoding for write request body, can be set to "gzip" to## compress body or "identity" to apply no encoding.# content_encoding = "gzip"## Enable or disable uint support for writing uints influxdb 2.0.# influx_uint_support = false## Optional TLS Config for use on HTTP connections.# tls_ca = "/etc/telegraf/ca.pem"# tls_cert = "/etc/telegraf/cert.pem"# tls_key = "/etc/telegraf/key.pem"## Use TLS but skip chain & host verification# insecure_skip_verify = false
# Read metrics about system load & uptime
[[inputs.system]]# no configuration

3.TELEGRAF配置参数说明

在这里插入图片描述

这四个key的值就对应的是JAVA应用程序中yaml中的配置的四个属性值,分别是url、token、org、bucket
注意:2.x版本是通过这四个属性来访问的,不再是账号和密码了
其中token需要提一嘴,token的值就是第二步创建完配置文件后返回的两个配置文件中的 export INFLUX_TOKEN

得到这四个配置属性后就可以操作数据库了吗 ???
NONONO,网上的资料比较杂乱,很多文章并没有讲到这一步,我是在这一步踩坑了,继续往看

经过测试发现了问题,注意这个TOKEN是数据库配置的TOKEN虽然可以连接到数据库并成功插入数据,但是并不具备访问的权限的,也就是说只能保存不能进行其他操作。查询报错:HTTP status code: 404; Message: failed to initialize execute state: could not find bucket “XX”

应用程序通过依赖中的API来访问的库,报错的原因其实就是缺少了最重要的API访问权限配置,网上的资料里没讲这块,贼坑

4.配置数据库的访问权限API TOKENS

在这里插入图片描述

勾选需要通过API访问的库和库的配置文件,其他权限根据自己情况来

在这里插入图片描述
点击创建后,会弹出生成的API访问的TOKENS,该TOKENS直接替换掉yaml配置文件中的token即可
在这里插入图片描述

5.JAVA代码操作库表

5.1 yaml

#influx配置
influx2:url: http://127.0.0.1:8086token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==写自己的org: orgbucket: db2

5.2 pom依赖

这里我没选择高版本依赖是因为和项目中的依赖存在冲突,高版本依赖提供了对2.x以上版本的兼容API
高版本和低版本的依赖都可以操作2.x版本,这里根据自己的实际情况来决定即可

        <!--InfluxDB--><dependency><groupId>com.influxdb</groupId><artifactId>influxdb-client-java</artifactId><!--<version>6.9.0</version>--><version>3.0.1</version></dependency>

5.3 config

package net.influx.com.config;import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author luo zhuo tao* @create 2023/8/29*/
@Configuration
@ConfigurationProperties(prefix = "influx2")
public class InfluxdbConfig {private static final Logger logger = LoggerFactory.getLogger(InfluxdbConfig.class);private String url;private String token;private String org;private String bucket;@Beanpublic InfluxDBClient influxDBClient(){InfluxDBClient influxDBClient = InfluxDBClientFactory.create(url,token.toCharArray(),org,bucket);//日志级别可用可不用influxDBClient.setLogLevel(LogLevel.BASIC);if (influxDBClient.ping()){logger.info("InfluxDB时序数据库2.x---------------------------------------------连接成功!");}else {logger.info("InfluxDB时序数据库2.x---------------------------------------------连接失败!");}return influxDBClient;}public void setUrl(String url) {this.url = url;}public void setToken(String token) {this.token = token;}public void setOrg(String org) {this.org = org;}public void setBucket(String bucket) {this.bucket = bucket;}
}

5.4 controller

package net.influx.com.controller;import com.alibaba.fastjson.JSON;
import com.influxdb.client.*;
import com.influxdb.client.domain.InfluxQLQuery;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;
import com.influxdb.query.FluxTable;
import com.influxdb.query.InfluxQLQueryResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.UUID;/*** @author luo zhuo tao* @create 2023/8/29*/@RestController
@RequestMapping("influxdb")
public class InfluxdbController {private static final Logger logger = LoggerFactory.getLogger(InfluxdbController.class);@Resourceprivate InfluxDBClient influxDBClient;@Value("${influx2.org:''}")private String org;@Value("${influx2.bucket:''}")private String bucket;private String table = "test1";@GetMapping("test")public String test() {/*** 写入:WriteApiBlocking 同步写入API WriteApi 异步写入API*/if (false) {WriteApiBlocking writeApiBlocking = influxDBClient.getWriteApiBlocking();Point point = Point.measurement(table).addField(String.valueOf(System.currentTimeMillis()), UUID.randomUUID().toString()).time(Instant.now(), WritePrecision.NS);writeApiBlocking.writePoint(point);}/*** 查询:QueryApi 同步查询API InfluxQLQueryApi SQL查询API*/if (false){InfluxQLQueryApi influxQLQueryApi = influxDBClient.getInfluxQLQueryApi();InfluxQLQuery influxQLQuery = new InfluxQLQuery("SELECT * FROM test1", bucket);InfluxQLQueryResult query = influxQLQueryApi.query(influxQLQuery);logger.info("query:{}", JSON.toJSONString(query));findAll();}/*** 删除*/DeleteApi deleteApi = influxDBClient.getDeleteApi();deleteApi.delete(OffsetDateTime.now(), OffsetDateTime.now(),"",bucket,org);return "查询成功";}/*** @param measurement 表名*/public void save(String measurement) {WriteOptions writeOptions = WriteOptions.builder().batchSize(5000).flushInterval(1000).bufferLimit(10000).jitterInterval(1000).retryInterval(5000).build();try (WriteApi writeApi = influxDBClient.getWriteApi(writeOptions)) {Point point = Point.measurement(measurement).addField("MMSI".concat(UUID.randomUUID().toString()), UUID.randomUUID().toString()).time(Instant.now(), WritePrecision.NS);writeApi.writePoint(bucket, org, point);}}public List<FluxTable> findAll() {String flux = "from(bucket: \"db3\")\n" +"  |> range(start:0)\n" +"  |> filter(fn: (r) => r[\"_measurement\"] == \"test1\")\n" +"  |> yield(name: \"mean\")";QueryApi queryApi = influxDBClient.getQueryApi();List<FluxTable> tables = queryApi.query(flux, org);logger.info("tables:{}", JSON.toJSONString(tables));return tables;}
}

5.5 查询方法、结果集提取方法

这里用了两种方式查询,一个是直接通过key查、一个是根据时间维度查询,具体的自己去研究flux语法这里不详细讲

package net.superlucy.departure.monitor.app.service.impl;import cn.hutool.core.collection.CollectionUtil;
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.QueryApi;
import com.influxdb.client.WriteApi;
import com.influxdb.client.WriteOptions;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import net.superlucy.departure.monitor.app.service.InfluxdbService;
import net.superlucy.departure.monitor.app.util.CommonUtil;
import net.superlucy.departure.monitor.dto.enums.InfluxdbEnum;
import net.superlucy.departure.monitor.dto.model.DepartureShipPosition;
import org.apache.commons.compress.utils.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author luo zhuo tao* @create 2023/9/4*/
@Service
public class InfluxdbServiceImpl implements InfluxdbService {private static final Logger logger = LoggerFactory.getLogger(InfluxdbServiceImpl.class);/*** 通过MMSI号查询SQL:响应单条数据*/private String queryValueFluxOne = "from(bucket: \"%s\") " +"|> range(start: %s) " +"|> filter(fn: (r) => r._measurement == \"%s\" and r._field == \"%s\")" +"" +"";/*** 通过时间范围查询SQL:响应多条数据*/private String queryValueFluxTwo = "from(bucket: \"%s\") " +"|> range(start: %s) " +"|> filter(fn: (r) => r._measurement == \"%s\")" +"" +"";@Resourceprivate InfluxDBClient influxDBClient;@Value("${influx2.org:''}")private String org;@Value("${influx2.bucket:''}")private String bucket;@Overridepublic Map<String, Object> findOne(InfluxdbEnum influxdbEnum, String mmsi) {String flux = String.format(queryValueFluxOne, bucket, 0, influxdbEnum.getValue(), mmsi);QueryApi queryApi = influxDBClient.getQueryApi();List<FluxTable> tables = queryApi.query(flux, org);return qryVal(tables);}public Map<String, Object> qryVal(List<FluxTable> tables) {Map<String, Object> map = new HashMap<>();if (CollectionUtil.isNotEmpty(tables)) {for (FluxTable table : tables) {List<FluxRecord> records = table.getRecords();for (FluxRecord fluxRecord : records) {map.put("value", fluxRecord.getValue().toString());map.put("field", fluxRecord.getField());map.put("valueTime", Date.from(fluxRecord.getTime()));}}}return map;}@Overridepublic List<Map<String, Object>> findList(InfluxdbEnum influxdbEnum, String date) {String flux = String.format(queryValueFluxTwo, bucket, date, influxdbEnum.getValue());QueryApi queryApi = influxDBClient.getQueryApi();List<FluxTable> tables = queryApi.query(flux, org);return qryValList(tables);}@Overridepublic Map<String, DepartureShipPosition> getDynamicList(InfluxdbEnum influxdbEnum, String date) {String flux = String.format(queryValueFluxTwo, bucket, date, influxdbEnum.getValue());QueryApi queryApi = influxDBClient.getQueryApi();List<FluxTable> tables = queryApi.query(flux, org);return dynamicList(tables);}/*** 查询所有船舶最新位置信息* @param tables* @return*/private Map<String, DepartureShipPosition> dynamicList(List<FluxTable> tables) {Map<String, DepartureShipPosition> map = new HashMap<>();if (CollectionUtil.isNotEmpty(tables)) {for (FluxTable table : tables) {List<FluxRecord> records = table.getRecords();//直接用时间维度查询,会出// 现同一个Field多条数据的情况,这里只需要最新的数据,时间的排序是从远到近的,所以直接拿最后一条即可FluxRecord fluxRecord = records.get(records.size() - 1);DepartureShipPosition position = new DepartureShipPosition();String mmsi = fluxRecord.getField();String value = fluxRecord.getValue().toString();/*** 动态格式转换方法是我自己业务里面的方法,不用管* String mmsi = fluxRecord.getField();* String value = fluxRecord.getValue().toString();* 这两个get方法是已经获取到存储的数据结果了,后续处理根据自己业务需求来即可*/// 动态格式转换DepartureShipPosition dynamic = CommonUtil.dynamic(position, value);map.put(mmsi,dynamic);}}return map;}/**** @param tables* @return*/public List<Map<String, Object>> qryValList(List<FluxTable> tables) {List<Map<String, Object>> mapList = Lists.newArrayList();if (CollectionUtil.isNotEmpty(tables)) {for (FluxTable table : tables) {List<FluxRecord> records = table.getRecords();//直接用时间维度查询,会出现同一个Field多条数据的情况,这里只需要最新的数据,时间的排序是从远到近的,所以直接拿最后一条即可FluxRecord fluxRecord = records.get(records.size() - 1);Map<String, Object> map = new HashMap<>(1);map.put("value", fluxRecord.getValue().toString());map.put("field", fluxRecord.getField());map.put("valueTime", Date.from(fluxRecord.getTime()));mapList.add(map);}}return mapList;}/*** @param measurement 表名* @param k           MMSI号* @param v           ASI数据*/@Overridepublic void save(String measurement, String k, String v) {WriteOptions writeOptions = WriteOptions.builder().batchSize(5000).flushInterval(1000).bufferLimit(10000).jitterInterval(1000).retryInterval(5000).build();try (WriteApi writeApi = influxDBClient.getWriteApi(writeOptions)) {Point point = Point.measurement(measurement).addField(k, v).time(Instant.now(), WritePrecision.NS);writeApi.writePoint(bucket, org, point);}}
}

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

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

相关文章

SpringBoot-插件化以及springboot扩展接口

插件化常用的实现思路 spi机制&#xff0c;Service Provider Interface &#xff0c;是JDK内置的一种服务发现机制&#xff0c;SPI是一种动态替换扩展机制约定配置和目录&#xff0c;利用反射配合实现springboot中的Factories机制Java agent&#xff08;探针&#xff09;技术S…

JavaScript中的Generator函数及其使用方式

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Generator函数⭐ 创建Generator函数⭐ 调用Generator函数⭐ Generator函数的应用1. 异步编程2. 生成器&#xff08;Generator&#xff09; ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧…

老板要我开发一个简单的工作流引擎-读后感与补充

概述 最近读了一篇《老板要我开发一个简单的工作流引擎》 幽默风趣&#xff0c;干货较多&#xff0c;作为流程引擎的设计者、开发者、探索者&#xff0c;写的很好&#xff0c;合计自己的理解&#xff0c;对每个功能补充说明&#xff0c;对于流程引擎的应用场景&#xff0c;做出…

vue中slot,slot-scope,v-slot的用法和区别

slot用于设置标签的属性值(slot“title”)slot-scopev-slot slot <el-menu-item v-if"!navMenu.children" :key"navMenu.id" :index"navMenu.id " click"itemClick(navMenu)" ><span slot"title">{{ navMenu.…

无涯教程-JavaScript - N函数

描述 N函数返回一个转换为数字的值。 语法 N (value) 争论 Argument描述Required/OptionalValue 要转换的值或对值的引用。 N转换下表中列出的值。 Required 值 N的返回值一个数字那个数字日期,采用Microsoft Excel中可用的内置日期格式之一该日期的序列号 TRUE 1 FALSE…

大数据课程L3——网站流量项目的系统搭建

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解网站流量项目的运行环境; ⚪ 了解网站流量项目的日志采集系统搭建; ⚪ 了解网站流量项目的离线业务系统搭建; ⚪ 了解网站流量项目的Hive做离线数据处理; ⚪ 了解网站流量项目的…

Java笔记:Java线程Dump分析

1 Thread Dump介绍 1.1 什么是Thread Dump Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力&#xff0c;虽然各个 Java虚拟机打印的thread dump略有不同&#xff0c;但是 大多都提供了当前活动线程的快…

【深度学习】 Python 和 NumPy 系列教程(廿七):Matplotlib详解:3、多子图和布局:散点矩阵图(Scatter Matrix Plot)

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 3、多子图和布局 1. subplot()函数 2. subplots()函数 3. 散点矩阵图&#xff08;Scatter Matrix Plot&#xff09; 一、前言 Python是一种高级编程语言&#xff0c;由Guido van Rossum于…

Web服务器解析:从基础到高级的全面指南

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 Web服务器是现代互…

前端实现符合Promise/A+规范的Promise

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 介绍&#xff1a; Promise/A规范简介 1. Promise的三种状态&#xff1a; 2. 状态转换&#xff1a; 3. Promise的…

盘点11种高效改进卷积神经网络(CNN)的优化方法【核心代码下载】

卷积作为神经网络的核心计算之一&#xff0c;在CV领域有着诸多突破性进展&#xff0c;因而近年来关于卷积神经网络的研究不断。由于卷积的计算十分复杂&#xff0c;而且神经网络运行时很大一部分时间都会耗费在计算卷积上&#xff0c;因此优化卷积计算就显得尤为重要。 那么如…

2023谷歌开发者大会直播详细脚本

主播:三掌柜 设备:手机+直播云台 平台:CSDN 角度:对Google技术感兴趣的人、技术爱好者 画风:言简意赅、通俗易懂,将难懂的内容转化为简洁的描述,旨在让每一位观众都能有所收获。 形式:直播互动,提高受众人群的范围,包括但不限于对Google感兴趣的任何人,以及对G…

【LeetCode-简单题】剑指 Offer 58 - II. 左旋转字符串

文章目录 题目方法一&#xff1a;连续双指针翻转 题目 方法一&#xff1a;连续双指针翻转 class Solution {public String reverseLeftWords(String s, int n) {StringBuffer sb new StringBuffer(s);reverseWord(sb,0,n-1);reverseWord(sb,n,sb.length()-1);return sb.revers…

OLED透明屏触控:引领未来科技革命的创新力量

OLED透明屏触控技术作为一项颠覆性的创新&#xff0c;正在引领新一轮科技革命。它将OLED显示技术与触摸技术相结合&#xff0c;实现了透明度和触控功能的完美融合。 在这篇文章中&#xff0c;尼伽将通过引用最新的市场数据、报告和行业动态&#xff0c;详细介绍OLED透明屏触控…

hutool的HttpRequest.post的使用-包括上传文档等多个传参【总结版本】

首先hutool已经为我们封装好了远程调用的接口&#xff0c;我们只要将对应的传参和方式对应填写即可 hutool官方文档 1实际应用 post 常见的使用json传参&#xff0c;contend type为application/json RequestMapping("login") ResponseBody public static String s…

用于非线性多载波卫星信道的多输入多输出符号速率信号数字预失真器DPD(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Docker】ubuntu20.04 X86机器搭建NVIDIA ARM64 TX2的Docker镜像

文章目录 1. 设置ubuntu为清华源1.1 备份源文件1.2 替换清华源1.3 更新清华源 2. Ubuntu Docker 安装3. 安装qemu4. 安装Nvidia TX2 Docker镜像5. 如何使用TX2容器6. 参考资料 1. 设置ubuntu为清华源 为了后面ubuntu下载安装软件快些&#xff0c;需要使用国内的源&#xff0c;…

conda常用命令及问题解决-创建虚拟环境

好久没写博文了&#xff0c;感觉在学习的过程中还是要注意积累与分享&#xff0c;这样利人利己。 conda包清理&#xff0c;许多无用的包是很占用空间的 conda clean -p //删除没有用的包 conda clean -y -all //删除pkgs目录下所有的无用安装包及cacheconda创建虚拟环境…

文件上传漏洞(CVE-2022-30887)

简介 多语言药房管理系统&#xff08;MPMS&#xff09;是用PHP和MySQL开发的&#xff0c;该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0c;并根据到期、产品等各种参数提供各种报告…

Flutter插件之阿里百川

上一篇&#xff1a;Flutter插件的制作和发布&#xff0c;我们已经了解了如何制作一个通用的双端插件&#xff0c;本篇就带领大家将阿里百川双端sdk制作成一个flutter插件供项目调用&#xff01; 目录 登录并打开控制台&#xff0c;创建应用&#xff1a;填写应用相关信息开通百川…