使用vue2+axios+chart.js画折线图 ,出现 RangeError: Maximum call stack size exceeded 错误

news2024/9/24 13:22:13

目录

 

效果图

解决方案

修正要点


效果图

修改前App.vue代码:

<template>
    <div id="app">
        <canvas id="myChart"></canvas>
    </div>
</template>

<script>
import axios from 'axios';
import { Chart, registerables } from 'chart.js';
import 'chartjs-adapter-luxon';

Chart.register(...registerables);

export default {
    name: 'App',
    data() {
        return {
            chart: null,
            remainingData: [],
            speedData: []
        };
    },
    mounted() {
        this.fetchData();
        setInterval(this.fetchData, 60000);  // 每分钟更新数据
    },
    methods: {
        fetchData() {
            axios.get('/data.json')
                .then(response => {
                    console.log('接收数据:', response.data);
                    // 确保转换后的时间戳格式正确,使用 new Date(item.timestamp) 而不是 Date(item.timestamp)
                    this.remainingData = response.data.map(item => {
                        return { x: new Date(item.timestamp), y: item.remaining };
                    });
                    this.calculateSpeed();
                    // 确保remainingData和speedData不为空,防止图例点击时出现undefined错误
                    if (this.remainingData.length === 0) {
                        this.remainingData = [{ x: new Date(), y: 0 }];
                    }

                    if (this.speedData.length === 0) {
                        this.speedData = [{ x: new Date(), y: 0 }];
                    }

                    // 防止无限递归调用,只在数据确实有更新时更新图表
                    if (!this.chart) {
                        this.updateChart();
                    } else {
                        // 更新数据并重新渲染
                        this.chart.data.datasets[0].data = this.remainingData;
                        this.chart.data.datasets[1].data = this.speedData;
                        this.chart.update();  // 只更新已有的图表
                    }
                })
                .catch(error => {
                    console.log('获取数据异常:', error);
                });
        },
        calculateSpeed() {
            const speeds = [];
            for (let i = 1; i < this.remainingData.length; i++) {
                const speed = this.remainingData[i].y - this.remainingData[i - 1].y;
                speeds.push({ x: this.remainingData[i].x, y: speed });
            }
            this.speedData = speeds;
        },
        updateChart() {
            this.chart = new Chart(
                document.getElementById('myChart').getContext('2d'),
                {
                    type: 'line',
                    data: {
                        datasets: [
                            {
                                label: 'Remaining',
                                data: this.remainingData,
                                borderColor: 'rgb(75, 192, 192)',
                                tension: 0.1,
                                fill: false
                            },
                            {
                                label: 'Speed',
                                data: this.speedData,
                                borderColor: 'rgb(255, 99, 132)',
                                tension: 0.1,
                                fill: false
                            }
                        ]
                    },
                    options: {
                        scales: {
                            x: {
                                type: 'time',  // 使用时间轴
                                time: {
                                    unit: 'minute',  // 设为 minute 使点不聚集
                                    tooltipFormat: 'yyyy-MM-dd HH:mm',
                                    displayFormats: {
                                        minute: 'HH:mm'  // X 轴时间格式化
                                    }
                                },
                                ticks: {
                                    source: 'auto',
                                    autoSkip: true,
                                    maxRotation: 0,  // 防止时间戳旋转
                                }
                            },
                            y: {
                                beginAtZero: true  // 保证 Y 轴从 0 开始
                            }
                        },
                        plugins: {
                            tooltip: {
                                mode: 'index',
                                intersect: false
                            },
                            legend: {
                                onClick: (e, legendItem, legend) => {
                                    const datasetIndex = legendItem.datasetIndex;
                                    const dataset = legend.chart.data.datasets[datasetIndex];

                                    // 确保点击图例时,数据集存在并且被初始化
                                    if (!dataset || !dataset.data || !Array.isArray(dataset.data)) {
                                        console.log('数据集不存在或者未初始化');
                                        return;
                                    }

                                    // 切换数据集的显示状态
                                    dataset.hidden = !dataset.hidden;
                                    legend.chart.update();
                                }
                            }
                        },
                        responsive: true,
                        maintainAspectRatio: false
                    }
                }
            );
        }
    }
}
</script>

出现 RangeError: Maximum call stack size exceeded 错误,可能是由于 setInterval 直接引用了 fetchData,而 fetchData 中又更新了图表或页面元素,导致无限递归问题。每次调用 fetchData 可能会触发多次图表更新,最终导致栈溢出。

为了解决这个问题,你可以通过以下方式优化:

解决方案

  1. 使用箭头函数传递上下文:避免 setInterval 中的上下文丢失,确保 this 的正确性。
  2. 防止重复图表创建:在 fetchDataupdateChart 中,确保图表只在需要的时候更新,避免重复调用造成栈溢出。
  3. 处理异步调用:确保每次 fetchData 的数据处理逻辑正确,避免多个请求导致的图表过度更新。

修改后的App..vue 代码:

<template>
    <div id="app">
        <canvas id="myChart"></canvas>
    </div>
</template>

<script>
import axios from 'axios';
import { Chart, registerables } from 'chart.js';
import 'chartjs-adapter-luxon';

Chart.register(...registerables);

export default {
    name: 'App',
    data() {
        return {
            chart: null,
            remainingData: [],
            speedData: [],
            lastFetchedData: null,  // 存储上次的数据
            intervalId: null  // 存储 setInterval 的 ID
        };
    },
    mounted() {
        this.fetchData();
        this.intervalId = setInterval(this.fetchData, 60000);  // 每分钟更新数据
    },
    beforeUnmount() {
        // 清理定时器,防止组件销毁时继续触发
        if (this.intervalId) {
            clearInterval(this.intervalId);
        }
    },
    methods: {
        fetchData() {
            axios.get('/data.json')
                .then(response => {
                    console.log('接收数据:', response.data);
                    const newData = response.data.map(item => {
                        return { x: new Date(item.timestamp), y: item.remaining };
                    });

                    // 判断数据是否真的有变化,只有在变化时才更新图表
                    if (JSON.stringify(newData) !== JSON.stringify(this.remainingData)) {
                        console.log('数据发生变化,更新图表');
                        this.remainingData = newData;
                        this.calculateSpeed();

                        // 确保remainingData和speedData不为空
                        if (this.remainingData.length === 0) {
                            this.remainingData = [{ x: new Date(), y: 0 }];
                        }

                        if (this.speedData.length === 0) {
                            this.speedData = [{ x: new Date(), y: 0 }];
                        }

                        // 防止无限递归调用,只在数据确实有更新时更新图表
                        if (!this.chart) {
                            this.updateChart();
                        } else {
                            this.chart.data.datasets[0].data = this.remainingData;
                            this.chart.data.datasets[1].data = this.speedData;
                            this.chart.update();  // 只更新已有的图表
                        }
                    } else {
                        console.log('数据未变化,不更新图表');
                    }
                })
                .catch(error => {
                    console.log('获取数据异常:', error);
                });
        },
        calculateSpeed() {
            const speeds = [];
            for (let i = 1; i < this.remainingData.length; i++) {
                const speed = this.remainingData[i].y - this.remainingData[i - 1].y;
                speeds.push({ x: this.remainingData[i].x, y: speed });
            }
            this.speedData = speeds;
        },
        updateChart() {
            this.chart = new Chart(
                document.getElementById('myChart').getContext('2d'),
                {
                    type: 'line',
                    data: {
                        datasets: [
                            {
                                label: 'Remaining',
                                data: this.remainingData,
                                borderColor: 'rgb(75, 192, 192)',
                                tension: 0.1,
                                fill: false
                            },
                            {
                                label: 'Speed',
                                data: this.speedData,
                                borderColor: 'rgb(255, 99, 132)',
                                tension: 0.1,
                                fill: false
                            }
                        ]
                    },
                    options: {
                        scales: {
                            x: {
                                type: 'time',
                                time: {
                                    unit: 'minute',
                                    tooltipFormat: 'yyyy-MM-dd HH:mm',
                                    displayFormats: {
                                        minute: 'HH:mm'
                                    }
                                },
                                ticks: {
                                    source: 'auto',
                                    autoSkip: true,
                                    maxRotation: 0,
                                }
                            },
                            y: {
                                beginAtZero: true
                            }
                        },
                        plugins: {
                            tooltip: {
                                mode: 'index',
                                intersect: false
                            },
                            legend: {
                                onClick: (e, legendItem, legend) => {
                                    const datasetIndex = legendItem.datasetIndex;
                                    const dataset = legend.chart.data.datasets[datasetIndex];

                                    if (!dataset || !dataset.data || !Array.isArray(dataset.data)) {
                                        console.log('数据集不存在或者未初始化');
                                        return;
                                    }

                                    dataset.hidden = !dataset.hidden;
                                    legend.chart.update();
                                }
                            }
                        },
                        responsive: true,
                        maintainAspectRatio: false
                    }
                }
            );
        }
    }
}
</script>

data.json:

[
    {
        "remaining": 32.76,
        "timestamp": "2024-09-10 11:51:19"
    },
    {
        "remaining": 32.78,
        "timestamp": "2024-09-10 11:50:14"
    },
    {
        "remaining": 32.81,
        "timestamp": "2024-09-10 11:49:11"
    },
    {
        "remaining": 32.85,
        "timestamp": "2024-09-10 11:48:06"
    },
    {
        "remaining": 32.88,
        "timestamp": "2024-09-10 11:47:02"
    },
    {
        "remaining": 32.9,
        "timestamp": "2024-09-10 11:45:57"
    },
    {
        "remaining": 32.93,
        "timestamp": "2024-09-10 11:44:53"
    },
    {
        "remaining": 32.95,
        "timestamp": "2024-09-10 11:43:49"
    },
    {
        "remaining": 32.98,
        "timestamp": "2024-09-10 11:42:46"
    },
    {
        "remaining": 33.0,
        "timestamp": "2024-09-10 11:41:41"
    },
    {
        "remaining": 33.03,
        "timestamp": "2024-09-10 11:40:36"
    },
    {
        "remaining": 33.05,
        "timestamp": "2024-09-10 11:39:32"
    },
    {
        "remaining": 33.08,
        "timestamp": "2024-09-10 11:38:27"
    },
    {
        "remaining": 33.1,
        "timestamp": "2024-09-10 11:37:22"
    },
    {
        "remaining": 33.13,
        "timestamp": "2024-09-10 11:36:17"
    },
    {
        "remaining": 33.15,
        "timestamp": "2024-09-10 11:35:12"
    },
    {
        "remaining": 33.2,
        "timestamp": "2024-09-10 11:34:07"
    },
    {
        "remaining": 33.22,
        "timestamp": "2024-09-10 11:33:02"
    },
    {
        "remaining": 33.24,
        "timestamp": "2024-09-10 11:31:57"
    },
    {
        "remaining": 33.26,
        "timestamp": "2024-09-10 11:30:52"
    },
    {
        "remaining": 33.29,
        "timestamp": "2024-09-10 11:29:47"
    },
    {
        "remaining": 33.31,
        "timestamp": "2024-09-10 11:28:42"
    },
    {
        "remaining": 33.33,
        "timestamp": "2024-09-10 11:27:37"
    },
    {
        "remaining": 33.36,
        "timestamp": "2024-09-10 11:26:32"
    },
    {
        "remaining": 33.38,
        "timestamp": "2024-09-10 11:25:28"
    },
    {
        "remaining": 33.4,
        "timestamp": "2024-09-10 11:24:23"
    },
    {
        "remaining": 33.43,
        "timestamp": "2024-09-10 11:23:18"
    },
    {
        "remaining": 33.45,
        "timestamp": "2024-09-10 11:22:15"
    },
    {
        "remaining": 33.47,
        "timestamp": "2024-09-10 11:21:12"
    },
    {
        "remaining": 33.52,
        "timestamp": "2024-09-10 11:20:07"
    },
    {
        "remaining": 33.54,
        "timestamp": "2024-09-10 11:19:04"
    },
    {
        "remaining": 33.56,
        "timestamp": "2024-09-10 11:18:02"
    },
    {
        "remaining": 33.57,
        "timestamp": "2024-09-10 11:16:57"
    },
    {
        "remaining": 33.57,
        "timestamp": "2024-09-10 11:15:52"
    },
    {
        "remaining": 33.58,
        "timestamp": "2024-09-10 11:14:47"
    },
    {
        "remaining": 33.59,
        "timestamp": "2024-09-10 11:13:42"
    },
    {
        "remaining": 33.6,
        "timestamp": "2024-09-10 11:12:39"
    },
    {
        "remaining": 33.61,
        "timestamp": "2024-09-10 11:11:34"
    },
    {
        "remaining": 33.62,
        "timestamp": "2024-09-10 11:10:31"
    },
    {
        "remaining": 33.62,
        "timestamp": "2024-09-10 11:09:26"
    },
    {
        "remaining": 33.63,
        "timestamp": "2024-09-10 11:08:21"
    },
    {
        "remaining": 33.64,
        "timestamp": "2024-09-10 11:07:16"
    },
    {
        "remaining": 33.65,
        "timestamp": "2024-09-10 11:06:12"
    },
    {
        "remaining": 33.66,
        "timestamp": "2024-09-10 11:05:07"
    },
    {
        "remaining": 33.67,
        "timestamp": "2024-09-10 11:04:04"
    },
    {
        "remaining": 33.68,
        "timestamp": "2024-09-10 11:03:00"
    },
    {
        "remaining": 33.69,
        "timestamp": "2024-09-10 11:01:55"
    },
    {
        "remaining": 33.7,
        "timestamp": "2024-09-10 11:00:50"
    },
    {
        "remaining": 33.71,
        "timestamp": "2024-09-10 10:59:46"
    },
    {
        "remaining": 33.72,
        "timestamp": "2024-09-10 10:58:41"
    },
    {
        "remaining": 33.72,
        "timestamp": "2024-09-10 10:57:36"
    },
    {
        "remaining": 33.73,
        "timestamp": "2024-09-10 10:56:33"
    },
    {
        "remaining": 33.74,
        "timestamp": "2024-09-10 10:55:30"
    },
    {
        "remaining": 33.75,
        "timestamp": "2024-09-10 10:54:28"
    },
    {
        "remaining": 33.75,
        "timestamp": "2024-09-10 10:53:25"
    },
    {
        "remaining": 33.76,
        "timestamp": "2024-09-10 10:52:20"
    },
    {
        "remaining": 33.76,
        "timestamp": "2024-09-10 10:51:15"
    },
    {
        "remaining": 33.77,
        "timestamp": "2024-09-10 10:50:11"
    },
    {
        "remaining": 33.78,
        "timestamp": "2024-09-10 10:49:06"
    },
    {
        "remaining": 33.78,
        "timestamp": "2024-09-10 10:48:01"
    },
    {
        "remaining": 33.79,
        "timestamp": "2024-09-10 10:46:56"
    },
    {
        "remaining": 33.79,
        "timestamp": "2024-09-10 10:45:51"
    },
    {
        "remaining": 33.8,
        "timestamp": "2024-09-10 10:44:45"
    },
    {
        "remaining": 33.81,
        "timestamp": "2024-09-10 10:43:40"
    },
    {
        "remaining": 33.81,
        "timestamp": "2024-09-10 10:42:35"
    },
    {
        "remaining": 33.82,
        "timestamp": "2024-09-10 10:41:32"
    },
    {
        "remaining": 33.82,
        "timestamp": "2024-09-10 10:40:27"
    },
    {
        "remaining": 33.83,
        "timestamp": "2024-09-10 10:39:24"
    },
    {
        "remaining": 33.83,
        "timestamp": "2024-09-10 10:38:56"
    },
    {
        "remaining": 34.83,
        "timestamp": "2024-09-10 02:12:51"
    },
    {
        "remaining": 34.83,
        "timestamp": "2024-09-10 02:11:44"
    },
    {
        "remaining": 34.84,
        "timestamp": "2024-09-10 02:10:38"
    },
    {
        "remaining": 34.84,
        "timestamp": "2024-09-10 02:09:31"
    },
    {
        "remaining": 34.84,
        "timestamp": "2024-09-10 02:08:28"
    },
    {
        "remaining": 34.85,
        "timestamp": "2024-09-10 02:07:21"
    },
    {
        "remaining": 34.85,
        "timestamp": "2024-09-10 02:06:16"
    },
    {
        "remaining": 34.86,
        "timestamp": "2024-09-10 02:05:11"
    },
    {
        "remaining": 34.86,
        "timestamp": "2024-09-10 02:04:06"
    },
    {
        "remaining": 34.87,
        "timestamp": "2024-09-10 02:03:03"
    },
    {
        "remaining": 34.87,
        "timestamp": "2024-09-10 02:01:58"
    },
    {
        "remaining": 34.87,
        "timestamp": "2024-09-10 02:00:52"
    },
    {
        "remaining": 34.88,
        "timestamp": "2024-09-10 01:59:48"
    },
    {
        "remaining": 34.88,
        "timestamp": "2024-09-10 01:58:43"
    },
    {
        "remaining": 34.89,
        "timestamp": "2024-09-10 01:57:40"
    },
    {
        "remaining": 34.89,
        "timestamp": "2024-09-10 01:56:35"
    },
    {
        "remaining": 34.9,
        "timestamp": "2024-09-10 01:55:30"
    },
    {
        "remaining": 34.92,
        "timestamp": "2024-09-10 01:54:27"
    },
    {
        "remaining": 34.94,
        "timestamp": "2024-09-10 01:53:22"
    },
    {
        "remaining": 34.96,
        "timestamp": "2024-09-10 01:52:18"
    },
    {
        "remaining": 34.98,
        "timestamp": "2024-09-10 01:51:15"
    },
    {
        "remaining": 35.01,
        "timestamp": "2024-09-10 01:50:09"
    },
    {
        "remaining": 35.03,
        "timestamp": "2024-09-10 01:49:02"
    },
    {
        "remaining": 35.05,
        "timestamp": "2024-09-10 01:47:59"
    },
    {
        "remaining": 35.05,
        "timestamp": "2024-09-10 01:46:55"
    },
    {
        "remaining": 35.05,
        "timestamp": "2024-09-10 01:45:50"
    },
    {
        "remaining": 35.06,
        "timestamp": "2024-09-10 01:44:46"
    },
    {
        "remaining": 35.08,
        "timestamp": "2024-09-10 01:43:41"
    },
    {
        "remaining": 35.1,
        "timestamp": "2024-09-10 01:42:38"
    },
    {
        "remaining": 35.12,
        "timestamp": "2024-09-10 01:41:34"
    },
    {
        "remaining": 35.14,
        "timestamp": "2024-09-10 01:40:31"
    },
    {
        "remaining": 35.15,
        "timestamp": "2024-09-10 01:39:26"
    },
    {
        "remaining": 35.17,
        "timestamp": "2024-09-10 01:38:21"
    },
    {
        "remaining": 35.19,
        "timestamp": "2024-09-10 01:37:18"
    },
    {
        "remaining": 35.21,
        "timestamp": "2024-09-10 01:36:13"
    },
    {
        "remaining": 35.22,
        "timestamp": "2024-09-10 01:35:10"
    },
    {
        "remaining": 35.22,
        "timestamp": "2024-09-10 01:34:05"
    },
    {
        "remaining": 35.26,
        "timestamp": "2024-09-10 01:31:29"
    },
    {
        "remaining": 35.28,
        "timestamp": "2024-09-10 01:30:24"
    },
    {
        "remaining": 35.3,
        "timestamp": "2024-09-10 01:29:21"
    },
    {
        "remaining": 35.31,
        "timestamp": "2024-09-10 01:28:26"
    },
    {
        "remaining": 35.33,
        "timestamp": "2024-09-10 01:27:24"
    },
    {
        "remaining": 35.35,
        "timestamp": "2024-09-10 01:26:19"
    },
    {
        "remaining": 35.37,
        "timestamp": "2024-09-10 01:25:13"
    },
    {
        "remaining": 35.38,
        "timestamp": "2024-09-10 01:24:09"
    },
    {
        "remaining": 35.39,
        "timestamp": "2024-09-10 01:23:03"
    },
    {
        "remaining": 35.41,
        "timestamp": "2024-09-10 01:21:58"
    },
    {
        "remaining": 35.43,
        "timestamp": "2024-09-10 01:20:53"
    },
    {
        "remaining": 35.47,
        "timestamp": "2024-09-10 01:19:06"
    },
    {
        "remaining": 35.49,
        "timestamp": "2024-09-10 01:18:01"
    }
]

修正要点

  1. 使用箭头函数在 setInterval 中绑定正确的 this 上下文

    • 使用 setInterval(() => { this.fetchData(); }, 60000),确保 fetchData 在每次调用时使用正确的组件上下文,避免函数指针错误。
  2. 防止重复创建图表

    • 检查 this.chart 是否已存在,只有在首次创建时调用 updateChart,在后续更新中只调用 this.chart.update(),防止不断创建新图表导致的栈溢出。
  3. 优化 fetchData 的数据处理逻辑

    • 确保每次数据更新只更新已有图表,不会触发多余的重绘或递归调用。

通过以上优化,可以避免无限递归和重复调用引发的 Maximum call stack size exceeded 错误。

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

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

相关文章

(rs系列)rs6之补环境

网址&#xff1a;aHR0cHM6Ly93d3cubm1wYS5nb3YuY24vZGF0YXNlYXJjaC9ob21lLWluZGV4Lmh0bWw rs6同样是两次html请求&#xff0c;第一次是412&#xff0c;cookie的差异性跟4、5同理&#xff0c;需要注意的是rs6无限debugger有三个&#xff0c;并且第三个需要注入hook代码才能过掉。…

从0开始搭建自动化测试平台,构建自动化测试平台的最全指南!

前言 随着软件开发的不断进步&#xff0c;测试工程师也需要跟上趋势并适应新的测试方法。自动化测试已成为现代测试领域中不可或缺的一部分。它可以提高测试效率、减少测试成本&#xff0c;并且可以避免人为错误对测试结果的影响。在这篇文章中&#xff0c;我们将介绍如何构建…

基于STC12C5A60S2单片机的LED汉字显示系统的设计

本设计基于单片机的LED汉字显示装置&#xff0c;该设计以STC12C5A60S2单片机为核心&#xff0c;利用最小系统和多个模块完成设计&#xff0c;包括点阵驱动模块、时钟模块、串口通信模块、红外线接收模块以及LED点阵屏。其中&#xff0c;点阵驱动模块采用74HC245芯片设计完成&am…

基于Python的电影推荐系统设计与实现---附源码80129

摘要 本项目旨在基于Python设计和实现一个电影推荐系统&#xff0c;旨在为用户提供个性化的电影推荐服务。通过分析用户的观影历史、评分和偏好等数据&#xff0c;系统将利用推荐算法为用户推荐符合其口味的电影。该系统将结合Python编程语言和数据分析技术&#xff0c;实现智能…

让AI给你写代码(10.2)具备调用本地库能力的AI小助手代码资源及简单介绍

接上一篇让AI给你写代码(10.1): 按接口编程的思想,统一利用内部和外部的接口,逐步扩展和提升AI编程能力 这篇我们将对照需要解决的问题,比较详细介绍一下AI小助手相关代码架构、实体,相关方法和工具。 对照10.1 新版AI小助手的需要做的流程如下: 与10.1流程图基本一致…

Docker部署nginx容器无法访问80端口

问题说明 在阿里云ECS服务器上部署一台CentOS服务器&#xff0c;然后在里面安装了docker服务。用docker部署了nginx&#xff0c;开启docker中的nginx服务&#xff0c;映射宿主机端口80 把阿里云服务器上面的安全组放开了80端口 但是还是无法访问nginx的80web界面 问题分析 查…

油猴脚本安装,3种安装方法

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

并发编程:AQS(上)

一、AQS 是什么&#xff1f; AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。 AQS 就是一个抽象类&#xff0c;主要用来构建锁和同步器。 public abstract class AbstractQueuedSynch…

怎么抓住威士忌蓝海市场?

​前些天和朋友吃饭&#xff0c;聊起来威士忌。 朋友说&#xff0c;这个威士忌啊&#xff0c;最近几年增值特别快&#xff0c;甚至超过了黄金、名表、艺术品、红酒这些经典的投资品类。而且存放得越久&#xff0c;升值的幅度就越大。 再加上&#xff0c;中国的威士忌市场现在…

3GPP NTN定义了哪些band?

卫星频段主要包括以下几种&#xff1a; L波段(1–2 GHz)&#xff1a;主要用于移动卫星通信、导航系统和无线电测绘。例如&#xff0c;全球定位系统 (GPS) 运营商以及卫星移动电话&#xff0c;如 Iridium和 Inmarsat提供海上、陆地和空中通信。 S波段(2–4 GHz)&#xff1a;广泛…

【C++ Primer Plus习题】13.3

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <string> #inc…

[Unity]如何让选择区域(照射范围)内的物体实时高亮

前言 最近希望在Unity里实现这样一个功能&#xff1a; 黄色半透明部分是一个手电筒&#xff0c;我希望手电筒范围内的小球会高亮轮廓&#xff0c;且手电筒移出去后小球会恢复原来的样子&#xff1a; 一开始我把整个问题想的太复杂了&#xff0c;想着在Update()函数里暴力检…

使用Python自动抓取亚马逊网站商品信息

全量数据抓取不现实&#xff0c;但可以自动化、小批量采集亚马逊数据&#xff0c;现在可用的工具也非常多&#xff0c;包括Python以及一些专门的爬虫软件&#xff0c;我用过几个比较好入手的&#xff0c;像web scraper、八爪鱼、亮数据。 比如亮数据爬虫&#xff0c;它提供数据…

408:强化笔记|王道|DS|OS|CO|计网

目录 DS 数据结构算法题一、快速排序二、二路归并排序三、链表(2.3课后习题)四、二叉树五、图应用题 OS 操作系统第二章 进程与线程零、大观一、PV操作 第三章 内存管理一、内存管理大题 CO 计算机组成原理第三章 存储系统一、Cache大题二、TLB大题 第二章 数据的表示和运算第四…

Nginx之日志切割,正反代理,HTTPS配置

1 nginx日志切割 1.1 日志配置 在./configure --prefixpath指定的path中切换进去&#xff0c;找到log文件夹&#xff0c;进去后找到都是对应的日志文件 其中的nginx.pid是当前nginx的进程号&#xff0c;当使用ps -ef | grep nginx获得就是这个nginx.pid的值 在nginx.conf中…

安全测试:全面指南!

引言 随着互联网技术的快速发展&#xff0c;网络安全威胁日益增多。企业不仅需要保护其数据资产免受外部攻击&#xff0c;还需要确保内部系统的安全性。安全测试作为软件开发生命周期中的关键环节&#xff0c;旨在识别潜在的安全漏洞和风险点&#xff0c;从而提高产品的整体安…

Return arguments from function calling with OpenAI API when streaming?

题意&#xff1a;在使用OpenAI API进行流式传输时&#xff0c;如何返回函数调用的参数&#xff1f; 问题背景&#xff1a; Ive made a simple OpenAI API example with function calling. Im only using function calling to format the response, Im not calling multiple fu…

沪农商行半年报“双正增”:分红率提升,业绩增速却放缓明显

《港湾商业观察》施子夫 王璐 虽然上半年业绩增速上有所放缓&#xff0c;但沪农商行(601825.SH)33%的分红率至少对投资者来说无疑是个好消息。 今年上半年&#xff08;报告期内&#xff09;&#xff0c;沪农商行实现营业收入139.17亿元&#xff0c;同比增长0.23%&#xff1b…

TikTok运营需要的独立IP如何获取?

TikTok作为当下炙手可热的社交媒体平台&#xff0c;吸引了众多个人创作者和企业进驻。在进行TikTok运营时&#xff0c;许多经验丰富的用户都倾向于选择独立IP。那么&#xff0c;TikTok运营为什么需要独立IP&#xff1f;又该如何获取呢&#xff1f;本文将详细为您解答这些问题。…

HivisionIDPhotos

在服务器Ubuntu22.04系统下&#xff0c;HivisionIDPhotos的部署 一、安装环境&#xff1a;ubuntu基本环境配置1.更新包列表&#xff1a;2. 安装GPU驱动程序3.查看显卡信息4.下载并安装 CUDA 12.3 二、安装miniconda环境1. 下载miniconda32. 安装miniconda33. 打开用户环境编辑页…