当前位置: 首页 > news >正文

共享单车之数据存储

文章目录

  • 第1关:获取工作簿中的数据
  • 第2关:保存共享单车数据


第1关:获取工作簿中的数据

相关知识
获取工作簿中的信息,我们可以使用Java POI(POI是一个提供API给Java程序对Microsoft Office格式档案读和写的功能)提供的Workbook类来操作。

为了完成本关任务,你需要掌握:如何获取Wookbook的数据。

读取一个Wookbook中数据
读取工作簿中的内容大致分为下列几个步骤:

使用WorkbookFactory新建一个工作簿(Wookbook)
InputStream resourceAsStream = SaveData.class.getClassLoader().getResourceAsStream(“data.xls”);//通过类加载器获取本地文件
Workbook workbook = WorkbookFactory.create(resourceAsStream);
获取给定索引处的Sheet对象。
Sheet sheet = workbook.getSheetAt(0);//拿到Wookbook中的第一个Sheet
说明:一个Wookbook中可能存在多个Sheet,因此需要指定索引,如下图:

通过Sheet对象获取指定行和行内单元格。
Row row = sheet.getRow(1);//首行一般为说明,因此我们直接从第一行进行获取
Cell cell = row.getCell(0);//获取当前行第一个单元格
获取单元格中的值。

上图观察表结构数据trip_id为数字类型,时间为字符类型,在获取数据时我们必须遵循类型规则,对应获取。

//1.获取第一行中trip_id列的第一个值(33404951)
double numericCellValue = row.getCell(0).getNumericCellValue();
DecimalFormat formatter = new DecimalFormat(“########”);//一个#表示一个数字
String trip_id =formatter.format(numericCellValue);//我们需要使用DecimalFormat将数据格式化
//2.获取第一行中开始时间单元格的值
FastDateFormat instance = FastDateFormat.getInstance(“MM/dd/yyyy HH:mm”);
String beginTimeValue = row.getCell(1).getStringCellValue();
//为了方便后面的数据分析计算我们将需要将时间格式转为时间戳
long begintime = instance.parse(beginTimeValue).getTime();
//3.获取第一行开始经度单元格的值
double start_longitude = row.getCell(7).getNumericCellValue();
DecimalFormat formatter = new DecimalFormat(“###.######”);//#表示一个数字,不包括0
String longitude = formatter.format(start_longitude);
获取当前sheet中的物理定义行数
//为了完整的将整个Sheet中的数据全部存储,我们需要知道整个Sheet中有多少条数据,然后对其遍历
int rows = sheet.getPhysicalNumberOfRows();
编程要求
在右侧编辑器Begin-End中补充代码,获取data.xls文件中的数据,具体获取以下数据并将结果打印:trip_id、开始时间、结束经度、车辆id。

文件数据格式如下:

trip_id 开始时间 结束时间 车辆id 出发地 目的地 所在城市 开始经度 开始纬度 结束经度 结束纬度
33404951 7/1/2017 0:09 7/1/2017 0:45 5996 韩庄村北782米 韩庄村北782米 河北省保定市雄县 39.043732 116.260139 39.043732 116.260139
33463211 7/1/2017 1:01 7/1/2017 11:13 6342 韩庄村北782米 39.043732 116.260139 NA NA
33415440 7/1/2017 1:59 7/1/2017 2:12 6273 擎天矿用材料有限公司北609米 河北省保定市雄县G45(大广高速) 河北省保定市雄县G45(大广高速) 39.041691 116.235352 39.044701 116.252441
注意:表中有非法数据,我们在获取时为了避免出错或者获取到空的数据,可以使用try-catch将其抛出。

测试说明
平台会对你编写的代码进行测试:

测试输入:无;
预期输出:
骑行id:33404951,开始时间:1498838940000,车辆id:5996,结束经度:39.043732
骑行id:33415440,开始时间:1498845540000,车辆id:6273,结束经度:39.044701

开始你的任务吧,祝你成功!
示例代码如下:

package com.educoder.savedata;
import java.io.InputStream;
import java.text.DecimalFormat;
import org.apache.commons.lang3.time.FastDateFormat;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class SaveWookbook {public static void main(String[] args) throws Exception {/******** **    Begin    ****** ****///1.通过类加载器获取本地文件并新建一个工作簿InputStream resourceAsStream = SaveWookbook.class.getClassLoader().getResourceAsStream("data.xls");Workbook workbook = WorkbookFactory.create(resourceAsStream);//2.拿到工作簿中第一个SheetSheet sheet = workbook.getSheetAt(0);//3.获取当前Sheet中的行数int rows = sheet.getPhysicalNumberOfRows();//4.对所有有效数据进行遍历并输出(期间无效数据通过异常捕获方式清除)for (int n = 1; n < rows; n++) {Row row = sheet.getRow(n);//通过异常方式清除格式不准确、数据不存在的无效行try {//trip_idDecimalFormat formatter1 = new DecimalFormat("########");String trip_id = formatter1.format(row.getCell(0).getNumericCellValue());//开始时间FastDateFormat instance = FastDateFormat.getInstance("MM/dd/yyyy HH:mm");String beginTimeValue = row.getCell(1).getStringCellValue();long begintime = instance.parse(beginTimeValue).getTime();//车辆idint car_id = (int)row.getCell(3).getNumericCellValue();//结束经度double start_longitude = row.getCell(9).getNumericCellValue();DecimalFormat formatter2 = new DecimalFormat("###.######");//#表示一个数字,不包括0String longitude = formatter2.format(start_longitude);System.out.println("骑行id:"+trip_id+",开始时间:"+begintime+",车辆id:"+car_id+",结束经度:"+longitude);} catch (Exception e) {}}/******** **    End    ******* ***/}
}

在这里插入图片描述

第2关:保存共享单车数据

相关知识
为了完成本关任务,你需要掌握:

如何创建HBase表;
如何读取文件;
了解共享单车数据表格式以及如何获取数据;
如何存储到HBase。
如何创建HBase表
com.util.HBaseUtil类封装了对应的创建Hbase表方法createTable

示例如下:

HBaseUtil.createTable(“t_shared_bicycle”, “info”);//创建拥有一个列族的info的表t_shared_bicycle,一个列族可拥有任意数量的列。
获取本地文件
文件存放目录为src/main/resources,我们可以通过类加载器加载共享单车数据文件dataResources.xls:

InputStream resourceAsStream = SaveData.class.getClassLoader().getResourceAsStream(“dataResources.xls”);
共享单车数据结构和获取
dataResources.xls文件格式如下:

trip_id 开始时间 结束时间 车辆id 出发地 目的地 所在城市 开始经度 开始纬度 结束经度 结束纬度
33404951 7/1/2017 0:09 7/1/2017 0:45 5996 韩庄村北782米 韩庄村北782米 河北省保定市雄县 39.043732 116.260139 39.043732 116.260139
33404950 7/1/2017 0:11 7/1/2017 0:45 5777 河北省保定市雄县G45(大广高速) 乡里乡情铁锅炖东499米 河北省保定市雄县 39.044159 116.251579 39.04652 116.237411
33404947 7/1/2017 1:59 7/1/2017 2:12 6342 韩庄村北782米 韩庄村北782米 河北省保定市雄县 39.043732 116.260139 39.043732 116.260139
如何存储到HBase
com.util.HBaseUtil类封装了对应的批量存储到Hbase表方法putByTable。示例如下:

List puts = new ArrayList<>();// 一个PUT代表一行数据,每个Put有唯一的ROWKEY
Put put = new Put(Bytes.toBytes(“33404951”)); //创建ROWKEY为33404951的PUT
byte[] family = Bytes.toBytes(“info”);
put.addColumn(family,Bytes.toBytes(“bicycleId”), Bytes.toBytes(String.valueOf(5996)));//在列族info中,增加字段名称为bicycleId,值为5996的元素
put.addColumn(family,Bytes.toBytes(“departure”), Bytes.toBytes(“韩庄村北782米”));//在列族info中,增加字段名称为departure,值为韩庄村北782米的元素
puts.add(put);
HBaseUtil.putByTable(“t_shared_bicycle”,puts);//批量保存数据到t_shared_bicycle
编程要求
根据提示,在右侧编辑器Begin-End中补充savaBicycleData方法,完成如下操作:

创建拥有列族info的表t_shared_bicycle;
将唯一骑行trip_id设为表的ROWKEY;
将出发地 = 目的地或者目的地 = 所在城市的无效数据清除;
把文件dataResources.xls中相应的数据存到Hbase表t_shared_bicycle中。
t_shared_bicycle表结构如下

列族名称 字段 对应的文件的描述 ROWKEY (格式为:骑行id)
info beginTime 开始时间 trip_id
info endTime 结束时间 trip_id
info bicycleId 车辆id trip_id
info departure 出发地 trip_id
info destination 目的地 trip_id
info city 所在城市 trip_id
info start_longitude 开始经度 trip_id
info stop_longitude 结束经度 trip_id
info start_latitude 开始纬度 trip_id
info stop_latitude 结束纬度 trip_id
提示:注意使用try-catch将无效数据或非法数据进行抛出。

测试说明
平台会对你编写的代码进行测试,数据量较大,评测时间可能较长,请耐心等待:

测试输入:37785165
预期输出:
rowCount–>331850
info:beginTime 1501500120000
info:bicycleId 6280
info:city 河北省保定市雄县
info:departure 东方红家园西南121米
info:destination 沙辛庄村南940米
info:endTime 1501500840000
info:start_latitude 116.13826
info:start_longitude 39.144981
info:stop_latitude 116.13237
info:stop_longitude 39.13525

说明:由于数据过多,我们将输出ROWKEY为37785165的信息。

开始你的任务吧,祝你成功!
示例代码如下:

package com.educoder.savedata;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang3.time.FastDateFormat;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import com.educoder.util.HBaseUtil;
/* 
* 读取共享单车城市行车数据
* 
*/
public class SaveData {public static void SaveBicycleData()  throws Exception {/******** **   Begin   ******* ***/HBaseUtil.createTable("t_shared_bicycle", "info");InputStream resourceAsStream = SaveData.class.getClassLoader().getResourceAsStream("dataResources.xls");Workbook workbook = WorkbookFactory.create(resourceAsStream);Sheet sheet = workbook.getSheetAt(0);int rows = sheet.getPhysicalNumberOfRows();List<Put> puts = new ArrayList<Put>();for (int n = 1; n < rows; n++) {// 通过异常方式清除格式不准确、数据不存在的无效行try {Row row = sheet.getRow(n);// 唯一骑行id,当作行rowkeyDecimalFormat formatter1 = new DecimalFormat("########");String trip_id = formatter1.format(row.getCell(0).getNumericCellValue());Put put = new Put(Bytes.toBytes(trip_id));byte[] family = Bytes.toBytes("info");// 开始时间FastDateFormat instance = FastDateFormat.getInstance("MM/dd/yyyy HH:mm");String beginTimeValue = row.getCell(1).getStringCellValue();Date parse = instance.parse(beginTimeValue);put.addColumn(family, Bytes.toBytes("beginTime"), Bytes.toBytes(String.valueOf(parse.getTime())));// 结束时间String endTimeValue = row.getCell(2).getStringCellValue();Date parse2 = instance.parse(endTimeValue);put.addColumn(family, Bytes.toBytes("endTime"), Bytes.toBytes(String.valueOf(parse2.getTime())));// 单车识别码int bicycleId = (int)row.getCell(3).getNumericCellValue();put.addColumn(family, Bytes.toBytes("bicycleId"), Bytes.toBytes(String.valueOf(bicycleId)));// 出发地String departure = row.getCell(4).getStringCellValue();put.addColumn(family, Bytes.toBytes("departure"), Bytes.toBytes(departure));// 目的地String destination = row.getCell(5).getStringCellValue();put.addColumn(family, Bytes.toBytes("destination"), Bytes.toBytes(destination));// 所在城市String city = row.getCell(6).getStringCellValue();put.addColumn(family, Bytes.toBytes("city"), Bytes.toBytes(city));// 清除目的地 = 所在城市 或者 出发地 = 目的地 的无效数据if (destination.equals(city)|| departure.equals(destination) ) {continue;}//开始经度DecimalFormat formatter2 = new DecimalFormat("###.######");String start_longitude = formatter2.format(row.getCell(7).getNumericCellValue());put.addColumn(family, Bytes.toBytes("start_longitude"), Bytes.toBytes(String.valueOf(start_longitude)));//开始纬度String start_latitude = formatter2.format(row.getCell(8).getNumericCellValue());put.addColumn(family, Bytes.toBytes("start_latitude"), Bytes.toBytes(String.valueOf(start_latitude)));//结束经度String stop_longitude = formatter2.format(row.getCell(9).getNumericCellValue());put.addColumn(family, Bytes.toBytes("stop_longitude"), Bytes.toBytes(String.valueOf(stop_longitude)));//结束纬度String stop_latitude = formatter2.format(row.getCell(10).getNumericCellValue());put.addColumn(family, Bytes.toBytes("stop_latitude"), Bytes.toBytes(String.valueOf(stop_latitude)));puts.add(put);} catch (Exception e) {}}HBaseUtil.putByTable("t_shared_bicycle", puts);/****** ****   End   ****** ****/}
}

在这里插入图片描述


相关文章:

共享单车之数据存储

文章目录 第1关&#xff1a;获取工作簿中的数据第2关&#xff1a;保存共享单车数据 第1关&#xff1a;获取工作簿中的数据 相关知识 获取工作簿中的信息&#xff0c;我们可以使用Java POI&#xff08;POI是一个提供API给Java程序对Microsoft Office格式档案读和写的功能&#…...

Flink(十一)【状态管理】

Flink 状态管理 我们一直称 Flink 为运行在数据流上的有状态计算框架和处理引擎。在之前的章节中也已经多次提到了“状态”&#xff08;state&#xff09;&#xff0c;不论是简单聚合、窗口聚合&#xff0c;还是处理函数的应用&#xff0c;都会有状态的身影出现。状态就如同事务…...

【三维目标检测/自动驾驶】IA-BEV:基于结构先验和自增强学习的实例感知三维目标检测(AAAI 2024)

系列文章目录 论文&#xff1a;Instance-aware Multi-Camera 3D Object Detection with Structural Priors Mining and Self-Boosting Learning 地址&#xff1a;https://arxiv.org/pdf/2312.08004.pdf 来源&#xff1a;复旦大学 英特尔Shanghai Key Lab /美团 文章目录 系列文…...

wefew

123212...

Springboot整合JSP-修订版本(Springboot3.1.6+IDEA2022版本)

1、问题概述&#xff1f; Springboot对Thymeleaf支持的要更好一些&#xff0c;Springboot内嵌的Tomcat默认是没有JSP引擎&#xff0c;不支持直接使用JSP模板引擎。这个时候我们需要自己配置使用。 2、Springboot整合使用JSP过程 现在很多的IDEA版本即使创建的项目类型是WAR工…...

Java核心知识点1-java和c++区别、隐式和显示类型转换

java和c区别 java通过虚拟机实现跨平台特性&#xff0c;但c依赖于特定的平台。java没有指针&#xff0c;它的引用可以理解为安全指针&#xff0c;而c和c一样具有指针。java支持自动垃圾回收&#xff0c;而c需要手动回收。java不支持多重继承&#xff0c;只能通过实现多个接口来…...

C++图论之强连通图

1. 连通性 什么是连通性&#xff1f; 连通&#xff0c;字面而言&#xff0c;类似于自来水管道中的水流&#xff0c;如果水能从某一个地点畅通流到另一个地点&#xff0c;说明两点之间是连通的。也说明水管具有连通性&#xff0c;图中即如此。 无向图和有向图的连通概念稍有差…...

SadTalker数字人增加视频输出mp4质量精度

最近在用数字人简易方案&#xff0c;看到了sadtalker虽然效果差&#xff0c;但是可以作为一个快速方案&#xff0c;没有安装sd的版本&#xff0c;随便找了个一键安装包 设置如上 使用倒是非常简单&#xff0c;但是出现一个问题&#xff0c;就是输出的mp4都出马赛克了 界面上却…...

swing快速入门(三十二)消息对话框

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.自定义对话框前列图标 2.消息对话框的若干种形式 package swing21_30;import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent;public class swing_test_30 {// 定义一个JFrameJFrame jFrame n…...

《Spring Cloud学习笔记:Nacos配置管理 OpenFeign LoadBalancer Getway》

基于Feign的声明式远程调用&#xff08;代码更优雅&#xff09;&#xff0c;用它来去代替我们之前的RestTemplate方式的远程调用 1. Nacos配置管理&#xff1a;Nacos Config 服务配置中心介绍 首先我们来看一下,微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相…...

深入解析 Flink CDC 增量快照读取机制

一、Flink-CDC 1.x 痛点 Flink CDC 1.x 使用 Debezium 引擎集成来实现数据采集&#xff0c;支持全量加增量模式&#xff0c;确保数据的一致性。然而&#xff0c;这种集成存在一些痛点需要注意&#xff1a; 一致性通过加锁保证&#xff1a;在保证数据一致性时&#xff0c;Debez…...

060:vue中markdown编辑器mavon-editor的应用示例

第060个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…...

使用SCP在Linux中安全复制文件:参数详解

SCP&#xff08;Secure Copy&#xff09;是一个在Linux和其他类Unix系统中使用的命令行工具&#xff0c;用于在本地和远程主机之间安全地复制文件和目录。本文将详细介绍SCP的多个常用参数&#xff0c;并通过示例进行说明。 基本语法 scp [options] source destination其中&a…...

【动态规划精选题目】3、简单多状态模型

此动态规划系列主要讲解大约10个系列【后续持续更新】 本篇讲解简单多状态模型中的9道经典题&#xff0c;会在讲解题目同时给出AC代码 目录 1、按摩师 2、力扣198:打家劫舍1 3、打家劫舍II 4、删除并获得点数 5、 粉刷房子 6、力扣309:买卖股票的最佳时机含冷冻期 7、 买…...

软件测试/测试开发丨Python 虚拟环境及pip环境管理

venv 虚拟环境管理 venv 虚拟环境的优点 独立的 Python 环境&#xff0c;不会产生冲突有助于包的管理删除和卸载方便 venv 使用方法 创建虚拟环境 python3 -m venv test 激活虚拟环境 切换指定文件夹Windows&#xff1a;/Scripts/macOS&#xff1a;/bin/ 执行指令&#xff…...

Mybatis SQL构建器类 - SQL类

下面是一些例子&#xff1a; // Anonymous inner class public String deletePersonSql() {return new SQL() {{DELETE_FROM("PERSON");WHERE("ID #{id}");}}.toString(); }// Builder / Fluent style public String insertPersonSql() {String sql new…...

海云安亮相2023北京国际金融安全论坛,助力金融企业数字化转型降本增效

近日&#xff0c;2023北京国际金融安全论坛暨金融科技标准认证生态大会在北京金融安全产业园成功举办。深圳海云安网络安全技术有限公司&#xff08;以下简称“海云安”&#xff09;受邀参展亮相此次大会。海云安作为国内领先的金融科技服务商&#xff0c;展示了开发安全系列产…...

nodeJS搭建免费代理IP池爬取贴吧图片实战

之前用python写过爬虫&#xff0c;这次想试试nodeJS爬虫爬取贴吧图片&#xff0c;话不多说代码如下&#xff0c;爬取制定吧的前十页所有帖子里的图片 爬取贴吧图片脚本 你得提前创建一个images文件夹 const axios require("axios"); const cheerio require("…...

基于图搜索的自动驾驶规划算法 - BFS,Dijstra,A*

本文将讲解BFS&#xff0c;Dijstra&#xff0c;A*&#xff0c;动态规划的算法原理&#xff0c;不正之处望读者指正&#xff0c;希望有兴趣的读者能在评论区提出一些这些算法的面试考点&#xff0c;共同学习&#xff0c;一起进步 0 图论基础 图有三种&#xff1a;无向图、有向…...

Spring系列学习四、Spring数据访问

Spring数据访问 一、Spring中的JDBC模板介绍1、新建SpringBoot应用2、引入依赖&#xff1a;3、配置数据库连接&#xff0c;注入dbcTemplate对象&#xff0c;执行查询&#xff1a;4&#xff0c;测试验证&#xff1a; 二、整合MyBatis Plus1&#xff0c;在你的项目中添加MyBatis …...

用LDA模型挖掘微信聊天秘密:Gensim实战教程(含pyLDAvis可视化)

用LDA模型挖掘微信聊天秘密&#xff1a;Gensim实战教程&#xff08;含pyLDAvis可视化&#xff09; 微信聊天记录中隐藏着大量有价值的信息&#xff0c;从日常对话到重要决策&#xff0c;这些文本数据就像一座未被充分挖掘的金矿。本文将带你用Python中的Gensim库构建LDA主题模型…...

2026年03月27日全球AI前沿动态

一句话总结AI领域覆盖通用/垂直大模型、智能体应用、物理机器人、硬件算力、企业战略、产品更新、投融资、行业观点、民生教育、研究资源全维度&#xff0c;国产技术密集突破、智能体全面落地、硬件自研提速、安全风险频发、老年AI教育落地&#xff0c;行业向实用化、国产化、安…...

省流量秘籍:ESP32+LittleFS构建超轻量级物联网WEB界面(附低功耗配置)

ESP32物联网低功耗WEB界面开发实战&#xff1a;从LittleFS优化到移动端适配 在野外环境或移动场景中部署物联网设备时&#xff0c;每毫安的电流消耗和每KB的流量都值得精打细算。ESP32作为一款高性价比的Wi-Fi/蓝牙双模芯片&#xff0c;其灵活的网络配置和丰富的外设接口使其成…...

Claude浏览器扩展漏洞允许通过任意网站实现零点击XSS提示注入

网络安全研究人员披露了Anthropic公司Claude谷歌浏览器扩展中存在的一个漏洞&#xff0c;攻击者只需诱使用户访问特定网页即可触发恶意提示注入。漏洞原理分析Koi Security研究员Oren Yomtov在提供给The Hacker News的报告中指出&#xff1a;"该漏洞允许任何网站静默地向该…...

Spring Boot 3.2项目实战:5分钟搞定Tomcat虚拟线程配置,让你的接口吞吐量翻倍

Spring Boot 3.2虚拟线程实战&#xff1a;Tomcat配置优化与性能飞跃指南 当你的电商大促接口突然面临每秒上万请求&#xff0c;或者文件上传服务在高并发下响应缓慢时&#xff0c;传统线程池往往成为性能瓶颈。Spring Boot 3.2与Java 21的虚拟线程组合&#xff0c;正在重新定义…...

YOLOv11分割模型实战:用C++和ONNXRuntime解析‘output0’和‘output1’双输出,实现像素级颜色分析

YOLOv11分割模型实战&#xff1a;C与ONNXRuntime双输出解析与像素级颜色分析 在计算机视觉领域&#xff0c;目标检测与实例分割技术的结合正成为工业应用的新标准。YOLOv11作为YOLO系列的最新成员&#xff0c;不仅延续了其高效检测的特性&#xff0c;更通过双输出结构实现了精准…...

从单片机到汽车座舱:ThreadX RTOS在嵌入式领域的真实应用场景与选型思考

ThreadX RTOS在汽车座舱与工业控制中的实战选型指南 当特斯拉Model S的17英寸触控屏在2012年首次亮相时&#xff0c;很少有人注意到支撑这套系统的幕后英雄——实时操作系统。如今&#xff0c;从智能手表到航空电子设备&#xff0c;实时操作系统(RTOS)已成为嵌入式世界的隐形支…...

突破运营商限制:中兴光猫配置文件解密工具完全指南

突破运营商限制&#xff1a;中兴光猫配置文件解密工具完全指南 【免费下载链接】ZET-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/ze/ZET-Optical-Network-Terminal-Decoder 一、用户痛点解析&#xff1a;你是否正遭遇这些网络管理困境…...

LeetCode 2946. 循环移位后的矩阵相似检查【数学周期性+原地比较】简单

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

如何解决3D视频无法在普通设备播放的难题?VR-Reversal让转换更简单

如何解决3D视频无法在普通设备播放的难题&#xff1f;VR-Reversal让转换更简单 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitco…...