java快读快写

某为笔试经常卡输入输出,什么都不写光输入输出就能超时; 传统方式: Scanner s=new Scanner(System.in); while(s.hasNext()){ int a=s.nextInt(); System.out.println(a); } 弊端:超时,会发生cpu溢出; 快读快写: StreamTokenizer s=new StreamTokenizer(new InputStreamReader(System.in)); s.whitespaceChars(',',','); while(s.nextToken()!=StreamTokenizer.TT_EOF){ int a = (int)s.nval; System.out.println(a); } whitespacechars用来设置分割符号,默认是空格; 每一次读取之前都需要使用s.nextToken; 读取只有s.nval和s.sval前者读数字,后者读字符串;需要强转,但是字符默认只支持数字、字符汉字; 使用 wordChars('A', 'Z')添加; BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); PrintWriter r=new PrintWriter(new OutputStreamWriter(System.out)); String p; if(( p=b.readLine())!=null){ r.println(p); // System.out.println(p); } r.flush(); 按照行来进行读取的时候,可以这么做,但是需要手动split; 参考: Java StreamTokenizer-CSDN博客 【Java基础】StreamTokenizer使用详解-CSDN博客

Python优化闲谈

Numba使用心得 在优化Python的过程中,了解到Numba可以对Python原生代码进行CPU和GPU加速。于是体验了一下。 代码: from numba import jit @jit def test(value): a = 0 for i in range(value): a += i def run(): start = time.time() test(10000) print("time1:", (time.time()-start)) # 不使用numba的时间:0.0012049674987792969s # 使用numba的时间:1.4513230323791504s run() 想来想去感觉根本不是那么回事,不是说numba是原生Python的代码几十倍吗? 继续探索把10000改成100000000效果如下: # 不使用numba的时间:16.057264804840088s # 使用numba的时间:1.8022119998931885s 发现随着数据增大后,使用numba所消耗的时间并没有明显变长,而这1.8s的时间内应该是编译时间占了大头。 继续探索,改一下代码,还是使用numba: def run(): start = time.time() test(100000000) print("time1:", (time.time()-start)) start = time.time() test(100000001) print("time2:", (time.time()-start)) time1: 1.577368974685669 time2: 2.1457672119140625e-06 大吃一惊,time2的速度是真的飞起来了。 好了,我想你应该对numba的实用性方面有个概念了。

减小windows或linux虚拟机导出ova体积大小

减小windows或linux虚拟机导出ova体积大小 删除无用的文件,比如日志或者命令,程序等;去除磁盘碎片将不用的内存空间填充为0,便于vmdk压缩。 例子: 日志文件置空: 批量置空 /sf/data/log/ 目录下的日志文件,执行命令:for i in `ls /sf/data/log/*.log`; do cat /dev/null > $i; done linux碎片化处理: free -h /sbin/swapoff -a # 关闭缓存使用 free -h # 确认是否关闭 dd if=/dev/zero of=/null.dat # 创建全0的大文件,占满所有磁盘空间,视剩余空间大小而定,耗时大约20min rm -f /null.dat # 删除该文件

js数字排序

解题思路:数字=》字符串=》数组=》排序 let num = 1654 /* step one:数字转为字符串 1.num.toString() 2.String(num) */ let str = num.toString() /* step two:字符串转为数组 1.str.split('') 2.[...str] */ let arr = str.split('') /* step3:数组排序 .sort() */ let newArr = arr.sort((a, b) => a - b) //升序 /* step4:数组转为字符串 .join('') */ let newNum = Number(arr.join('')) console.log(newNum) //1456

etcd故障-recovering backend from snapshot error: failed to find database snapshot file

一、问题描述 服务器意外宕机,k8s无法启动,查看kubelet日志提示node “master” not found,查看etcd 的日志报错如下面: 很明显是数据库文件损坏了 [root@master01 ~]# journalctl -u etcd -f ... Oct 08 19:13:40 master01 etcd[66468]: recovering backend from snapshot error: failed to find database snapshot file (snap: snapshot file doesn't exist) Oct 08 19:13:40 master01 etcd[66468]: panic: recovering backend from snapshot error: failed to find database snapshot file (snap: snapshot file doesn't exist) 二、解决问题 进一步查看发现:etcd1 和etcd2 都存在上面的报错,但是3没有 2.1 备份 etcd1和etcd2上执行: mv /var/lib/etcd/member /opt/ 2.2 复制数据 将etcd3上的正常数据复制到etcd1和etcd2上

卸载宝塔面板

使用卸载命令进行卸载宝塔面板 1.宝塔官方有提供宝塔面板的卸载命令,使用这个卸载命令,我们就能将宝塔面板卸载掉。 Ps:这里有一点需要注意的,如果卸载宝塔面板的同时,也希望将 Nginx、MySQL、PHP 等组件卸载掉,那么我们应该先在宝塔面板里面卸载掉以上软件后,再进行下面的步骤。 登录VPS后,我们复制以下卸载命令并回车执行,即可一键卸载宝塔面板: /etc/init.d/bt stop && chkconfig --del bt && rm -f /etc/init.d/bt && rm -rf /www/server/panel 使用脚本进行卸载宝塔面板 除了使用卸载命令进行卸载外,我们也可以使用官方提供的卸载脚本进行卸载,同时这个卸载脚本会更暴力一些。 同样也是需要通过SSH登录后,我们复制以下命令,然后依次执行即可: wget http://download.bt.cn/install/bt-uninstall.sh sh bt-uninstall.sh 执行第二行命令后,会让我们进行以下选择: 卸载宝塔卸载宝塔及运行环境(可能影响站点、数据库及其他数据) 如果是单纯的卸载宝塔,需要保留 LNMP 等运行环境,则选择1选项;如果是想卸载宝塔和运行环境,则选择2选项。 按照自己的需求,选择对应的选择,回车后即可卸载宝塔面板。

node内置模块——fs文件系统模块

文章目录 文件系统的定义文件系统的重要作用fs模块同步和异步调用目录的创建创建目录重命名目录 目录的删除目录的读取包含文件的目录的删除文件的写入文件的同步和异步写入打开文件向文件写内容保存并关闭 简单文件写入文件追加写入文件写入的特点文件的打开状态流式文件写入 文件的读取同步文件读取异步文件读取简单文件读取流式文件读取 流式文件实现文件的读取和写入传统写法简单写法 文件的删除fs的其他操作 文件系统的定义 文件系统:文件系统简单来说就是通过Node来操作系统中的文件 。 文件系统的重要作用 在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端。 fs模块 Node通过fs模块来和文件系统进行交互。 fs模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。 fs是核心模块,直接引入不需要下载。 var fs = require("fs") 同步和异步调用 fs模块中所有的操作都有两种形式可供选择同步和异步: 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。异步的方法都有回调函数 我们更常用的是异步方法。 目录的创建 创建目录 // 创建目录 fs.mkdir("./avatar", (err) => { console.log(err) if (err && err.code === 'EEXIST') { console.log('目标已存在') } }) 重命名目录 fs.rename("./avatar", "./avatar2", (err) => { console.log(err) if (err && err.code === 'ENOENT') { console.log('目录不存在') } }) 目录的删除 // 删除 fs.rmdir("./avatar2", err => { console.log(err) if (err && err.

按键状态机(实现单击,长按,双击)的模块分享

目录 一、相关说明 二、分析 三、模块代码 三、代码讲解 四、作者的话 一、相关说明 1.需要的资源:一个定时器,一个按键。 2.相关设置:利用定时器计时中断,10ms进行一次按键扫描。 3.使用说明:定时器中断的优先级要设置高一点,相关的宏定义可以自行定义。 4.实现功能:区分单个按键的单击,双击,长按。 5.规定:双击:2次按下的间隔不超过200ms属于双击。 单击:第一次按下持续时间小于1s属于单击。 长按:第一次按下持续时间不小于1s属于长按。 (时间长短可自己调整) 6.目标:帮助理解按键的状态机。 二、分析 1.时间线分析和状态概览 2.状态分析和编程思路 说明:一般按键有两种状态,按下和弹起,这里将按键按下的状态拆分为两种状态,以长按1s的标志触发为断点,拆分为按键按下到标志触发状态和标志触发到按键弹起的状态。而对于单击和双击可直接理解为按下状态,只是形式上作了拆分。而且按下抖动的状态实际编程中没有编写,有兴趣的小伙伴可以尝试添加。 那为什么要拆分按键按下的状态? 定时器会10ms进行实时检测。 长按标志到时会实时清零,如果不拆分状态只能等待按键弹起进入1状态,但此时长按标志已被清零,系统错乱,误判为单击。 要想长按标志不被清零,就不能在按下状态动态清零,所以只能设计为松手反馈。 而拆分状态后可将1s前要做的事和1s后要做的事拆分开,1s到时即可实时反馈。 三、模块代码 1.相关宏 #define KEY GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) #define KEY_Up 1 //按键弹起 #define KEY_DownShake 2 //按下抖动 #define KEY_Down 3 //按键按下 #define KEY_wait 4 //等待状态 #define SHORT_KEY 1 //短按反馈 #define LONG_KEY 2 //长按反馈 #define DOUBLE_CLICK 3 //双击反馈 #define FALSE 0 #define TRUE 1 2.函数主体 /** * @brief KEY_Scan();// 按键检测 * @note 按键检测,返回单击,双击,长按 * @param 无 * @retval 无 * @author 常州工学院电子协会22级团体 PS:key_return属于外部全局变量,用于接受反馈信息 */ void KEY_Scan(void) { //反馈系统 static uint8_t Click_Buf = FALSE; //第一次弹起标志,用与区分双击的第一次按下和第二次按下 static uint8_t KEY_flag= FALSE;//标志触发判断标志位,用于在反馈结束后统一清零 static uint8_t Click = FALSE;//单击判断标志位 static uint8_t Long_Press = FALSE; //长按判断标志位 static uint8_t Double_Click = FALSE;//双击判断标志位 //计时系统 //定时器10ms进入一次函数 static uint8_t Long_Cnt = 100;//长按计时时长1s static uint8_t Twice_Cnt = 20;//双击间隔计时时长200ms Long_Cnt--; Twice_Cnt--; //状态系统 switch(key_state) { /*状态1:空闲状态(单击)和按键弹起后(双击)*/ case KEY_Up: { if(KEY == 0) { key_state = KEY_Down;//切换到状态3 Long_Cnt = 100;//长按计时开始 } else { //判断是否为按键弹起状态 if(Click_Buf == TRUE) { //弹起时间超过200ms,双击判定时间失效,且一定不为长按,直接判断为单击 if(Twice_Cnt<=0) { KEY_flag = TRUE; Click = TRUE; } } } break; } // /*状态2:按下抖动(过渡状态)*/ // case KEY_DownShake: // { // if(KEY == 0) // key_state = KEY_Down;//确认按下,切换到状态3 // break; // } /*状态3:按键按下到长按标志触发状态*/ case KEY_Down: { if(KEY == 1) { key_state = KEY_Up;//切换到状态4 //不是长按操作,则判断是不是双击操作 if(Long_Press == FALSE) { //双击检测 //前面已经单击一次,这次就判断为双击操作 if(Click_Buf == TRUE) { KEY_flag = TRUE; Double_Click = TRUE; } else { //这是单击或双击的第一次点击,标志位置1 Click_Buf = TRUE; //双击计时器开始计时 Twice_Cnt = 20; } } } else { //长按检测(一直在按下,第一次弹起不会触发) if(Long_Press == FALSE&&Click_Buf == FALSE) { //1s时间到就判断为长按 if(Long_Cnt<=0) { key_state = KEY_wait;//切换到状态4 KEY_flag = TRUE; Long_Press = TRUE; } } } break; } /*状态4:标志触发到等待按键弹起状态*/ case KEY_wait: { if(KEY == 1) key_state = KEY_Up;//完成一次按键动作,切换到状态1 break; } default: key_state = KEY_Up;//默认情况都切换到状态1 break; } //标志触发,反馈结果 //PS:key_return属于外部全局变量,用于接受反馈信息 if(KEY_flag == TRUE) { //单击动作 if(Click == TRUE) key_return = SHORT_KEY; //长按动作 else if(Long_Press == TRUE) key_return = LONG_KEY; //双击动作 else if(Double_Click == TRUE) key_return = DOUBLE_CLICK; //按键状态位清零,为下一次按下准备 KEY_flag= FALSE; Click_Buf = FALSE; Click = FALSE; Long_Press = FALSE; Double_Click = FALSE; } } 三、代码讲解 为了使代码更加清晰,可读性更强,我将按键状态机的代码做了分区,分成了三个系统,分别是反馈系统,计时系统,状态系统。

《qt quick核心编程》笔记三

9 C++和QML混合编程 9.1 在QML中使用C++类和对象 qt提供两种方式在QML环境中使用C++对象: 在C++中实现一个类,注册为QML环境的一个类型,在QML环境中使用该类型创建对象在C++中构造一个对象,将这个对象设置为QML的上下文属性,在QML环境中直接使用该属性 9.1.1 前提条件:定义可以导出的C++类 一个C++类必须满足以下条件才能够导出到QML环境中使用: 从QObject或QObject的派生类继承使用Q_OBJECT宏 QML中使用C++导出的类,只能使用以下特征的属性和方法: 信号和槽Q_INVOKABLE宏修饰的成员函数Q_ENUM宏修饰的枚举类型Q_PROPERTY宏修饰的成员属性(常用READ、WRITE、NOTIFY标记) <colormaker.h>头文件 #ifndef COLORMAKER_H #define COLORMAKER_H #include <QObject> #include <QColor> class ColorMaker : public QObject { Q_OBJECT Q_PROPERTY(QColor color READ getColor WRITE setColor NOTIFY colorChanged) Q_PROPERTY(QColor timeColor READ timeColor) public: explicit ColorMaker(QObject *parent = nullptr); ~ColorMaker(); enum GenerateAlgorithm{ RandomRGB, RandomRed, RandomGreen, RandomBlue, LinearIncrease}; Q_ENUM(GenerateAlgorithm) Q_INVOKABLE ColorMaker::GenerateAlgorithm algorithm() const; Q_INVOKABLE void setAlgorithm(ColorMaker::GenerateAlgorithm algorithm); QColor getColor() const; void setColor(const QColor &color); QColor timeColor() const; signals: void colorChanged(const QColor &color); void currentTime(const QString &strTime); public slots: void start(); void stop(); protected: void timerEvent(QTimerEvent *e); private: GenerateAlgorithm m_algorithm; QColor m_currentColor; int m_nColorTimer; }; #endif // COLORMAKER_H <colormaker.

《qt quick核心编程》笔记四

11 Model/View Delegate实际上可以看成是Item的一个模板 11.1 ListView ListView用于显示一个条目列表,数据来自于Model,每个条目的外观来自于Delegate 要使用ListView必须指定一个Model、一个Delegate Model可以是QML内建类型,如ListModel、XmlListModel,也可以是C++中实现的QAbstracItemModel或QAbstractListModel的派生类 import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 Window { width: 560 height: 300 color: "#EEEEEE" visible: true Component { id: phoneModel ListModel { ListElement { name: "iPhone 3GS" cost: "1000" manufacturer: "Apple" } ListElement { name: "iPhone 4" cost: "1800" manufacturer: "Apple" } ListElement { name: "iPhone 4S" cost: "2300" manufacturer: "Apple" } ListElement { name: "

CTF 全讲解:[SWPUCTF 2021 新生赛]Do_you_know_http

文章目录 参考环境题目hello.php雾现User-Agent伪造 User-AgentHackBarHackBar 插件的获取修改请求头信息 雾散 a.php雾现本地回环地址与客户端 IP 相关的 HTTP 请求头X-Forwarded-For 雾散 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型、ChatGPTMDN Web Docshttps://developer.mozilla.org/zh-CN/ 环境 项目描述HackBar1.2.2浏览器Chrome 题目 项目描述得分项HTTP 请求头题目来源NSSCTF hello.php 雾现 访问题目首页 hello.php 得到如下界面: 意在希望我们使用名为 WLLM 的浏览器访问页面。如何解决?我们似乎也没有听说过名为 WLLM 的浏览器。那就从原理出发,浏览器是如何知道我们使用什么工具访问浏览器的呢?答案是 User-Agent 请求头。 User-Agent HTTP 请求报文中的 User-Agent 请求头是一个用来 标识发送请求的客户端(通常是浏览器或其他网络应用程序)的字符串。这个字符串通常包含了客户端的应用程序名称、版本号、操作系统信息和一些其他相关的信息,用来 帮助服务器识别请求的来源。User-Agent 请求头的 主要目的 是为了让服务器能够根据客户端的不同特性来适配响应内容,以提供更好的用户体验。 User-Agent 请求头的示例如下: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Web开发人员和服务器管理员通常使用 User-Agent 请求头来识别客户端的类型和版本,以确保网站或应用程序能够提供适当的内容或功能。但需要注意的是,User-Agent 是可以伪造的,因此不能完全依赖它来确定客户端的真实性。有些浏览器或工具可以通过设置自定义的 User-Agent 字符串来隐藏其真实身份。因此,在安全性要求较高的情况下,应该使用其他方式来验证客户端的身份。 伪造 User-Agent 让浏览器认为我们使用 WLLM 浏览器可以通过伪造 User-Agent 来实现。可问题是我们该如何修改发送的请求头信息呢?可以试试 HackBar 浏览器插件。

【Godot】时间线(技能)节点

4.1 游戏中一般都会有各种各样的技能,或者其他需要按一定的时间顺序去执行的功能。 这里我写出了一个时间线节点,就像是在播放动画一样,按一定的阶段去执行某些功能 #============================================================ # Timeline #============================================================ # - author: zhangxuetu # - datetime: 2023-09-24 23:10:53 # - version: 4.1 #============================================================ class_name _TimeLine extends Node ## 执行完这个阶段时发出这个信号 signal executed_stage(stage, data) ## 手动停止执行 signal stopped ## 暂停执行 signal paused ## 继续执行 signal resumed ## 执行完成 signal finished ## process 执行方式 enum ProcessExecuteMode { PROCESS, ## _process 执行 PHYSICS, ## _physics_process 执行 } enum { UNEXECUTED, ## 未执行 EXECUTING, ## 执行中 PAUSED, ## 暂停中 } ## 时间阶段名称。这关系到 [method execute] 方法中的数据获取的时间数据 @export var stages : Array = [] ## process 执行方式。如果设置为 [member PROCESS] 或 [member PHYSICS] 以外的值, ## 则当前节点的线程将不会执行 @export var process_execute_mode : ProcessExecuteMode = ProcessExecuteMode.

【Proteus仿真】【STM32单片机】智能饮水机

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用OLED液晶、按键、语音播放模块、DS18B20温度传感器、加热器和水泵等。 主要功能: 系统运行后,OLED显示温度、温度阈值,系统工作模式开关等状态信息;系统默认处于自动模式,可按下K1键切换为手动模式; 手动模式下,可通过K2和K3键控制加热开关;通过K4键控制出水开关;自动模式下,可通过K2和K3键调节温度阈值; 当温度到达阈值,则关闭加热,否则打开加热。 二、软件设计 /* 作者:嗨小易(QQ:3443792007) */ //系统数据显示 void sys_data_show(void) { u8 buf[5]; while(1) { //温度显示 buf[0]=sys_ctrl.temp/100+0x30; buf[1]=sys_ctrl.temp%100/10+0x30; buf[2]='.'; buf[3]=sys_ctrl.temp%100%10+0x30; buf[4]='\0'; OLED_ShowString(2*16+8,0,buf,16); //温度阈值显示 buf[0]=sys_ctrl.temph/100+0x30; buf[1]=sys_ctrl.temph%100/10+0x30; buf[2]='.'; buf[3]=sys_ctrl.temph%100%10+0x30; buf[4]='\0'; OLED_ShowString(3*16+8,6,buf,16); //加热状态显示 if(sys_ctrl.jrflag==1) { OLED_ShowCHinese(3*16,2,14);//开启 OLED_ShowCHinese(4*16,2,15); } else { OLED_ShowCHinese(3*16,2,16);//关闭 OLED_ShowCHinese(4*16,2,17); } //出水状态显示 if(sys_ctrl.csflag==1) { OLED_ShowCHinese(3*16,4,14);//开启 OLED_ShowCHinese(4*16,4,15); } else { OLED_ShowCHinese(3*16,4,16);//关闭 OLED_ShowCHinese(4*16,4,17); } break; } } //系统数据设置 void sys_data_set(void) { u8 key=0; key=KEY_Scan(0); //自动/手动切换 if(key==KEY1_PRESS) { sys_ctrl.

Runtime Transform Gizmos☀️ 实现实用的拓展功能

目录 📢 本章前言 🟥 按下某按钮,选中某些物体 🟧 开启关闭网格线 📢 本章前言 Runtime Transform Gizmos已有介绍很详细的博客。因此本章不再介绍基础功能了。转而实现拓展功能。基础功能介绍博客:传送门 我们根据该博客完成项目的基础配置,然后进行如下拓展功能的实现。 🟥 按下某按钮,选中某些物体 本功能效果如下: 实现方法: EditorObjectSelection脚本添加如下代码: public void Skode_Press() { _selectedObjects.Clear(); _selectedObjects.Add(GameObject.Find("Cube")); _selectedObjects.Add(GameObject.Find("Cube (1)")); _selectedObjects.Add(GameObject.Find("Cube (2)")); FindObjectOfType<EditorGizmoSystem>().GetComponent<EditorGizmoSystem>().ChangeActiveGizmo(GizmoType.Translation); } 🟧 开启关闭网格线 网格线会在Game视图、打包出来的游戏中显示。 开启与关闭的方法: 大家还有什么问题,欢迎在下方留言! 如果你有 技术的问题 或 项目开发 都可以加下方联系方式 和我聊一聊你的故事🧡

ER图转换成关系模式集的算法

联系类型的转换:不同的情况做不同的处理。 二元联系类型的转换: ①若实体间联系是1:1,可以在两个实体类型转换成的两个关系模式中任意一个关系模式的属性中加入另一个关系模式的键和联系类型的属性。 ②若实体间联系是1:n,则在n端实体类型转换成的关系模式中加入1端实体类型的键和联系类型的属性。 ③若实体间联系是m:n,则将联系类型也转换成关系模式,其属性为两端实体类型的键加上联系类型的属性,而键为两端实体键的组合。 例:假定每个学生选修若干门课程,且每个学生每选一门课只有一个成绩,每个教师只担当一门课的教课,一门课由若干教师任教。“学生"有属性:学号、姓名、年龄、性别。“教师"有属性:员工号、教师姓名、职称。“课程"有属性:课程号、课程名。 问:1)试画出ER图,注明属性和联系种类。2)将E-R图变换成关系模型,并注明主码 答: 1)ER图: 以课程为参考:一门课程由多个老师任教,所以在【课程--教师】关系线上的教师那头标注x 以教师为参考:一个教师只教一门课程,所以在在【课程--教师】关系线上的课程那头标注1 其他的实体间的联系以此类推,进行标注,完成ER图 2) 学生关系模型:学号、姓名、年龄、性别 课程关系模型:课程号、课程名 教师关系模型:员工号、教师姓名、职称、课程号 选修关系模型:学号、课程号、成绩

RTC 时间、闹钟

实时时钟RTC是一个独立的定时器。RTC模块拥有一个连续计数的计数器,在软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。 在掉电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。相对于通用定时器TIM 外设,它十分简单,只有很纯粹的计时和触发中断的功能;但从掉电还继续运行的角度来说,它却是32 中唯一一个具有如此强大功能的外设。所以RTC外设的复杂之处并不在于它的定时功能,而在于它掉电还继续运行的特性。 以上所说的掉电,是指主电源VDD 断开的情况,为了RTC 外设掉电继续运行,必须接上锂电池给STM32 的RTC、备份发卡通过VBAT 引脚供电。当主电源VDD 有效时,由VDD 给RTC 外设供电;而当VDD 掉电后,由VBAT 给RTC 外设供电。但无论由什么电源供电,RTC 中的数据都保存在属于RTC 的备份域中,若主电源VDD 和VBAT 都掉电,那么备份域中保存的所有数据将丢失。备份域除了RTC 模块的寄存器,还有42 个16 位的寄存器可以在VDD 掉电的情况下保存用户程序的数据,系统复位或电源复位时,这些数据也不会被复位。 RCT特征: ● 可编程的预分频系数:分频系数高为220。 ● 32位的可编程计数器,可用于较长时间段的测量。 ● 2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟 频率的四分之一以上)。 可以选择以下三种RTC的时钟源: ● HSE时钟除以128; ● LSE振荡器时钟; ● LSI振荡器时钟 2个独立的复位类型: ● APB1接口由系统复位; ● RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位 3个专门的可屏蔽中断: ● 1.闹钟中断,用来产生一个软件可编程的闹钟中断。 ● 2.秒中断,用来产生一个可编程的周期性中断信号(长可达1秒)。 ● 3.溢出中断,指示内部可编程计数器溢出并回转为0的状态。 结构框图: UNIX时间戳 由于RTC_CNT是32位寄存器,可存储的最大值为2^32-1,即这样计时,它将在136年时溢出。假如某个时刻读取到计数器的数值为X = 606024*2,即两天时间的秒数,而假设又知道计数器是在2011 年1 月1 日的0 时0 分0 秒置0 的,那么就可以根据计数器的这个相对时间数值,计算得这个X 时刻是2011 年1 月3 日的0 时0 分0 秒了。而计数器则会在(2011+136) 年左右溢出,也就是说到了(2011+136)年时,如果我们还在使用这个计数器提供时间的话就会出现问题。在这个例子中,定时器被置0 的这个时间被称为计时元年,相对计时元年经过的秒数称为时间戳,也就是计数器中的值。

关于GIS数据分类方式

GIS数据有很多种分类方式,按照数据结构可分为矢量数据、栅格数据、DEM数据,还可以再细致的分为数据库格式、点云格式、3D格式,也可以按照各厂家和标准类别来分等等。 笔者也是GIS小白,在这里把收集到的素材略加整理,万一碰到形形色色的GIS文件,不至于显得太意外。 一、栅格数据 栅格数据由像素组成。它们通常间隔规则且呈方形,但不必如此。栅格通常看起来像素化,因为每个像素都有自己的值或类。 1. netCDF(网络通用数据格式): 美国大学大气研究中心(UCAR)的Unidata项目支持,符合(Climate and Forecast metadata standard)CF规范。 特点: 自我描述的:具有源文件,描述文件内数据分布 兼容性好:可以被具有不同整数、字符和浮点数存储方式的计算机访问 可扩展:可以很容易访问其部分数据(subset) 可附加的:后续增减数据可以直接附加 方便:一个制作者和多个读者可以同时访问该文件 支持性好:所有早期形式的nc格式文件都被友好支持 类型(都被广泛支持) 2. HDF(层次数据格式): 美国国家超级计算应用中心(NCSA)设计,目前由HDF小组开发和维护。 支持多维数组、光栅图像、表格等不同数据模型 类型(格式之间完全不同) HDF4 HDF5 3. GeoTIFF(标签图像文件格式): 具有地理参考的TIFF文件,广泛用于光栅图像和航空摄影,已成为GIS和卫星遥感应用的行业图像标准文件 GeoTIFF主要包括.TIF、.TIFF、.OVR等文件类型,也包括一些其他文件 .TFW:存储TIFF文件所处的空间位置信息; .XML:GeoTIFF可选文件,存储元数据; .AUX:存储投影和其它信息; .OVR:存储影像金字塔,用于快速的访问和影像显示缩放 4、其他 ERDAS Imagine IMG (.IMG)、American Standard Code for Information Interchange ASCII Grid(.ASC)、IDRISI Raster(.RST、.RDC)、Envi RAW Raster(BIL、.BIP、.BSQ)、PCI Geomatics Database File (.PiX)、ER Mapper Enhanced Compression Wavelet(.ECW)、Joint Photographic Experts Group JPEG2000(.JP2)等等 二、矢量数据格式 矢量数据不是由像素网格组成的,而是由顶点和路径组成。矢量数据的三种基本符号类型是点、线和面(面)。 1. ESRI shapefile(shp文件): 地理空间软件公司ESRI在1998年发布的shapefile格式规范开发,一个形状文件由3个(或更多)文件组成,需要有相同的名称,并存储在同一个目录(文件夹)中,有点类似于一个小型数据库。最主要的是: .shp:包含所有特征的几何图形的文件。 .shx:为几何图形编制索引的文件。

WOL唤醒配置(以太网、PHY、MAC)

目录 wol 以太网 MAC PHY RMII 通信配置 总结 wol Wake-on-LAN简称WOL,WOL(网络唤醒) 是一种标准网络协议,它的功效在于让已经进入休眠状态或关机状态的计算机,透过局域网(多半为以太网)的另一端对其发令,使其从休眠状态唤醒、恢复成运作状态,或从关机状态转成引导状态。WoL 技术通过将魔术数据包从服务器传输到特定计算机来运行。幻数据包是一个特殊的数据包,其中包含目标计算机的媒体访问控制 (MAC) 地址和网络广播地址以及 WoL 配置。WoL 通常从具有 IP 地址管理软件的服务器广播。 WoL 的目的是远程在设备上执行唤醒操作。它可以帮助网络管理员自动执行不需要任何手动干预的定期唤醒计划。 消息通常由在连接到同一局域网的设备上执行的程序发送到目标计算机。 以太网连接(包括家庭和工作网络、无线数据网络和 Internet 本身)都基于计算机之间发送的帧。 WoL 是使用一种特殊设计的称为魔术包的帧来实现的,魔术包被发送到网络中的所有计算机,其中包括要被唤醒的计算机。 魔术分组包含目的地计算机的 MAC 地址、内置在计算机中的每个网络接口卡(“NIC”)或其它以太网设备中的标识号,其使得它能够在网络上被唯一地识别和寻址。 具有 LAN 唤醒功能的已关机或关闭的计算机将包含能够在系统关机时以低功耗模式“侦听”传入数据包的网络设备。 如果接收到指向设备 MAC 地址的魔术包,网卡会向计算机的电源或主板发出信号,以启动系统唤醒,其方式与按下电源按钮的方式相同。 魔术分组在数据链路层(OSI 模型中的第 2 层)上被发送,并且当被发送时,使用网络广播地址被广播到给定网络上的所有附接的设备;不使用 IP 地址(OSI 模型中的第 3 层)。 由于 LAN 唤醒是基于广播技术构建的,因此通常只能在当前网络子网内使用。 不过,也有一些例外情况,LAN 唤醒实际上可以在任何网络上运维,只要配置和硬件适当,包括通过互联网进行远程唤醒。为了使 LAN 唤醒工作,网络接口的某些部分需要保持打开状态。 功耗控制(MCU ARM-cortex M3内核): 待机模式特点: 以太网 以太网 不是一种具体的网络,而是一种网络技术标准,既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构、访问控制方式、传输速率等。 以太网中的所有主机,共享一个通信信道,当一台主机给目标主机发送数据后,处于同一个局域网的所有主机都能够收到,它们都会对比自己的 MAC 地址和数据中的目的 MAC 地址,除了目标主机的对比是相等的之外,其余主机的对比都是不相等的,所以其余主机都会丢弃,只有目标主机会将其解包并向上交付。 以太网电路的基本构成 对于上面框图三个部分,并不是每个部分都是独立的芯片,一般有几种情况: CPU内部集成了MAC和PHY,难度较高CPU内部集成MAC,PHY采用独立芯片(主流方案目前用的最多)CPU不集成MAC和PHY,MAC和PHY采用独立芯片或者集成芯片(高端采用) PHY整合了大量模拟硬件,而MAC是典型的全数字硬件,芯片面积及模拟/数字混合架构是为什么先将MAC集成进微控制器而将PHY留在片外的原因。更灵活,密度更高的芯片技术已经可以实现MAC和PHY的单芯片整合。 常用的CPU内部集成MAC,PHY采用独立的芯片方案,CPU和MAC集成在一起,PHY芯片通过MII接口与CPU上的MAC互联。

Java计算Date类相距天数、月数、年数、直接获取年月日

计算Date类相距天数、月数、年数、直接获取年月日 Java中如何计算两个时间Date类像距离的天数 在Java中,您可以使用java.util.Date类来计算两个日期之间的天数差异。以下是一个简单的示例代码,演示如何计算两个日期之间的天数差异: import java.util.Date; import java.util.concurrent.TimeUnit; public class DateDifferenceExample { public static void main(String[] args) { // 创建两个日期对象 Date date1 = new Date(); // 第一个日期 Date date2 = new Date(); // 第二个日期 // 计算日期之间的毫秒差值 long differenceInMilliseconds = date2.getTime() - date1.getTime(); // 转换毫秒差值为天数 long differenceInDays = TimeUnit.MILLISECONDS.toDays(differenceInMilliseconds); System.out.println("天数差值:" + differenceInDays + "天"); } } 在这个示例中,首先创建了两个Date对象,然后计算了它们之间的毫秒差值,最后通过将毫秒差值转换为天数来获取天数差异。 然而,需要注意的是,java.util.Date类在Java 8及更早版本中被认为是不推荐使用的,因为它存在一些问题。更现代和可靠的日期和时间处理方法是使用java.time包中的类,如LocalDate。以下是使用java.time.LocalDate计算两个日期之间天数差异的示例代码: import java.time.LocalDate; import java.time.temporal.ChronoUnit; public class LocalDateDifferenceExample { public static void main(String[] args) { // 创建两个LocalDate对象 LocalDate date1 = LocalDate.

Spring学习笔记 加载Bean(其他方式)

更多看这里吧😁 除了这些常见的加载Bean方式,还有这些方式 文章目录 @Conditional注解@Import注解ImportSelector接口ImportBeanDefinitionRegistrar接口 FactoryBean接口 @Conditional注解 这个注解可以按条件加载某些类 1.创建Windows类,和Linux两个类 public class Windows { } public class Linux { } 2.创建配置类MyConfig4 @Configuration public class MainConfig4 { // 只有在满足WindowsCondition的条件下加载Windows这个类 @Conditional(value = {WindowsCondition.class}) @Bean public Windows windows() { return new Windows(); } // 只有在满足LinuxCondition的条件下加载Linux这个类 @Conditional(value = {LinuxCondition.class}) @Bean public Linux linux() { return new Linux(); } } 创建WindowsCondition和LinuxCondition两个类 matches方法返回true表示满足条件可以加载这个注解标注的类 public class WindowsCondition implements Condition { public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment env = context.