disassemble_section

Breakpoint 1, disassemble_section (abfd=0x6555f0, section=0x6588f8, inf=0x7fffffffd8f0) at ./objdump.c:3668 3668 unsigned int opb = pinfo->octets_per_byte; (gdb) p *section $11 = {name = 0x65985c ".plt", next = 0x65b838, prev = 0x6587c8, id = 28, section_id = 0, index = 12, flags = 283, user_set_vma = 1, linker_mark = 0, linker_has_input = 0, gc_mark = 0, compress_status = 0, segment_mark = 0, sec_info_type = 0, use_rela_p = 1, sec_flg0 = 0, sec_flg1 = 0, sec_flg2 = 0, sec_flg3 = 0, sec_flg4 = 0, sec_flg5 = 0, vma = 4198432, lma = 4198432, size = 32, rawsize = 0, compressed_size = 0, output_offset = 0, output_section = 0x0, relocation = 0x0, orelocation = 0x0, reloc_count = 0, alignment_power = 4, filepos = 4128, rel_filepos = 0, line_filepos = 0, userdata = 0x0, contents = 0x0, lineno = 0x0, lineno_count = 0, entsize = 0, kept_section = 0x0, moving_line_filepos = 0, target_index = 0, used_by_bfd = 0x65a978, constructor_chain = 0x0, owner = 0x6555f0, symbol = 0x65aa60, symbol_ptr_ptr = 0x6589e0, map_head = {link_order = 0x0, s = 0x0, linked_to_symbol_name = 0x0}, map_tail = {link_order = 0x0, s = 0x0, linked_to_symbol_name = 0x0}, already_assigned = 0x0, type = 0} (gdb) c Continuing.

BC140 KiKi设计类继承

描述 KiKi理解了继承可以让代码重用,他现在定义一个基类shape,私有数据为坐标点x,y, 由它派生Rectangle类和Circle类,它们都有成员函数GetArea()求面积。派生类Rectangle类有数据:矩形的长和宽;派生类Circle类有数据:圆的半径。Rectangle类又派生正方形Square类,定义各类并测试。输入三组数据,分别是矩形的长和宽、圆的半径、正方形的边长,输出三组数据,分别是矩形、圆、正方形的面积。圆周率按3.14计算。 输入描述: 输入三行, 第一行为矩形的长和宽, 第二行为圆的半径, 第三行为正方形的边长。 输出描述: 三行,分别是矩形、圆、正方形的面积。 示例1 输入: 7 8 10 5 输出: 56 314 25 解答: class Shape(object): def __init__(self, x, y): self.x = x self.y = y class Rectangle(Shape): """矩形的长和宽""" def GetArea(self): """求面积""" return self.x * self.y class Circle(Shape): """圆的半径""" def __init__(self, r): self.r = r self.area = 3.14 * self.r ** 2 def GetArea(self): """求面积""" if self.area - int(self.area) == 0: # 如果整数则输出整数,否则输出浮点数 return int(self.

qemu -s参数

先看一下,运行qemu,带-version参数,根据资料会显示版本信息,试了一下,没出错,也没显示任何信息, 单独运行qemuxxxxxx.exe,会出来一个硬件的启动界面; 根据资料,-s参数, 表示在 1234 端口开启 GDB 调试端口;加上-s,小写,看一下, 硬件启动以后,再打开一个cmd,输入下图命令,看一下1234端口是否打开;打开了, 然后关闭qemu的硬件虚拟界面,再运行查找端口命令,看一下,1234端口关闭了; 当前是win10环境,有时间继续;

BC110 井字棋

描述 KiKi和BoBo玩 “井”字棋。也就是在九宫格中,只要任意行、列,或者任意对角线上面出现三个连续相同的棋子,就能获胜。请根据棋盘状态,判断当前输赢。 输入描述: 三行三列的字符元素,代表棋盘状态,字符元素用空格分开,代表当前棋盘,其中元素为K代表KiKi玩家的棋子,为O表示没有棋子,为B代表BoBo玩家的棋子。 输出描述: 如果KiKi获胜,输出“KiKi wins!”; 如果BoBo获胜,输出“BoBo wins!”; 如果没有获胜,输出“No winner!”。 示例1 输入: K O BO K BB O K 输出: KiKi wins! 解法一: """ n n n 0 1 2 m m m 0 1 2 j j j 0 1 2 """ n = input().split() # 列表n m = input().split() # 列表m j = input().split() # 列表j if n[0] == m[1] == j[2] == 'K' or n[2] == m[1] == j[0] == 'K': # 正对角线 和 反对角线 print('KiKi wins!

样本熵(SampEn)计算时间序列复杂度(Python程序)

关于样本熵,Python有第三方包sampen可以直接引用,但是对于某些序列总会出现错误(我猜测说的是分母为0,计算逻辑的错误) 本来想顺着三方包进行检查,但是原包过于复杂,于是就结合网上的代码进行了修改。 样本熵的原理网上有很多,具体如下: 但是我有个疑惑,如果在一个时间序列中没有符合约束的距离即Ai和Bi,那么两者相除的时候就会返回错误(因为分母是不能为0的)。此时就说明了样本熵的值是无穷∞大的,也就说明该序列是很复杂的。 def SampEn(U, m, r): """ 用于量化时间序列的可预测性 :param U: 时间序列 :param m: 模板向量维数 :param r: 距离容忍度,一般取0.1~0.25倍的时间序列标准差,也可以理解为相似度的度量阈值 :return: 返回一个-np.log(A/B),该值越大,序列就越复杂 """ def _maxdist(x_i, x_j): """ Chebyshev distance :param x_i: :param x_j: :return: """ return max([abs(ua - va) for ua, va in zip(x_i, x_j)]) def _phi(m): x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)] C = [len([1 for j in range(len(x)) if i !

Why kernl miss __blk_account_io_start kprobe

Why kernl miss __blk_account_io_start kprobe ENV os: fedora37 x86_64kernel: 6.1.10-200.fc37.x86_64LLVM/Clang version 15.0.7gcc (GCC) 12.2.1 20221121Python 3.11.1 Error biosnoop.py $ sudo ./biosnoop.py cannot attach kprobe, probe entry may not exist Traceback (most recent call last): File "/home/sdb/Git/bcc/tools/./biosnoop.py", line 258, in <module> b.attach_kprobe(event="blk_account_io_start", fn_name="trace_pid_start") File "/usr/lib/python3.11/site-packages/bcc/__init__.py", line 840, in attach_kprobe raise Exception("Failed to attach BPF program %s to kprobe %s" % Exception: Failed to attach BPF program b'trace_pid_start' to kprobe b'blk_account_io_start' biotop.

Java 记事本-窗体程序 有详细设计文档和报告

开发环境 开发语言为Java,开发环境Eclipse或者IDEA都可以,无数据库。运行主JAVA文件,或者执行打开JAR文件即可以运行本程序。 系统框架 利用JDK自带的SWING框架开发,不需要安装第三方JAR包。纯窗体模式,直接运行Main文件即可以。同时带有详细得设计文档。 主要功能 课程设计主要通过编写一个简单的记事本程序使我们深入理解并实践在本课程中所学的有关Java程序设计方面的语言基础、异常处理、事件处理、小应用程序以及图形用户界面设计等内容。要求程序有合理的界面设计,能够进行输入文字操作,并具有新建、打开、保存文件,复制、粘贴、剪切,退出等功能,界面美观。具体如下: 1.新建操作 用户可以根据需要,建立新的记事本文档,进行操作。 2.打开操作 用户在可以打开任何文本内容进行操作。 3.保存操作 用户在对文本操作进行以后,可以按照需求进行保存操作。 4.撤销操作 若文本内容不符合用户的需求,可以撤销当前的操作。 5.剪切操作 用户可以可按照需求,对需要的内容进行剪切,将其移植其他处。 6.复制操作 移植的内容可以进行复制,这样更方便用户修改相应内容。 7.粘贴操作 将要复制的内容进行粘贴。 8.删除操作 删除不需要的内容。 9.查找操作 该功能为了方便用户进行查找文本内容中需要的内容。 10.替换操作 用户根据需要选择自己需要替换的内容,方便使用。 11.全选操作 全选内容方便用户进行相应的剪切,复制,粘贴等内容。 12.格式操作 用户可根据需求将文本内容进行字体设置。 13.退出操作 用户不需要进行任何操作时候,可以退出。 功能效果 关键代码 package com.txt; import java.awt.*; import java.awt.event.*; import java.util.*; import java.io.*; import javax.swing.undo.*; import javax.swing.*; import javax.swing.event.*; import java.awt.datatransfer.*; public class Notepad extends JFrame implements ActionListener, DocumentListener { // 菜单 JMenu fileMenu, editMenu, formatMenu, viewMenu, helpMenu,settingMenu; // 右键弹出菜单项 JPopupMenu popupMenu; JMenuItem popupMenu_Undo, popupMenu_Cut, popupMenu_Copy, popupMenu_Paste, popupMenu_Delete, popupMenu_SelectAll; // “文件”的菜单项 JMenuItem fileMenu_New, fileMenu_Open, fileMenu_Save, fileMenu_SaveAs, fileMenu_Exit; // “编辑”的菜单项 JMenuItem editMenu_Undo, editMenu_Cut, editMenu_Copy, editMenu_Paste, editMenu_Delete, editMenu_Find, editMenu_FindNext, editMenu_Replace, editMenu_GoTo, editMenu_SelectAll, editMenu_TimeDate; // “格式”的菜单项 JCheckBoxMenuItem formatMenu_LineWrap; JMenuItem formatMenu_Font; // “查看”的菜单项 JCheckBoxMenuItem viewMenu_Status; // “帮助”的菜单项 JMenuItem tongjiMenu, qianjinMenu,backgroudMenu; JMenuItem helpMenu_HelpTopics, helpMenu_AboutNotepad; // “文本”编辑区域 JTextArea editArea; // 状态栏标签 JLabel statusLabel; // 系统剪贴板 Toolkit toolkit = Toolkit.

Line 1065: Char 9: runtime error: addition of unsigned offset to 0x7ffd8d782

LeetCode 第151题碰到的错误: 第1065行:Char 9:运行时错误:添加无符号偏移到0x7ffd8d782520溢出到0x7ffd8d78251f (basic_string.h)(来自有道翻译) string reverseWords(string s) { reverseExtraSpace(s); reverse(s,0,s.size()-1); int start=0,end=0; bool entry=false; for(int i=0;i<s.size();i++) { if((!entry)||(s[i-1]==' '&&s[i]!=' '))→if((!entry)||(s[i]!=' '&&s[i-1]==' ')) { start=i; entry=true; } if(entry&&s[i-1]!=' '&&s[i]==' ')→if((!entry)||(s[i]==' '&&s[i-1]!=' ')) { end=i-1; entry=false; reverse(s,start,end); } if(entry&&(i==(s.size()-1))&&s[i]!=' ') { end=i; entry=false; reverse(s,start,end); } return s; }

基于SC-LeGO-LOAM的建图和ndt_localizer的定位

基于SC-LeGO-LOAM的建图和ndt_localizer的定位 链接: link. SC-LeGO-LOAM 链接: link. ndt_localizer 将建图和定位两部分分开,利用SC-LeGO-LOAM进行建图,相比于LeGO-LOAM,其采用了Scan Context方法,对点云地图进行闭环检测和姿态图优化后闭环效果更好。后续采用ndt进行定位。 一、利用SC-LeGO-LOAM建图 下载源码包 git clone https://github.com/AbangLZU/SC-LeGO-LOAM.git // 编译 cd .. catkin_make 原作者使用的是Ouster OS1-64雷达,本文采用velodyne 16线激光雷达,对utility.h文件要做以下修改 首先是pointCloudTopic和imuTopic # 将原本的这两行注释或者直接修改 // extern const string pointCloudTopic = "/os1_points"; // extern const string imuTopic = "/imu/data"; # 修改为对应的雷达和IMU的Topic extern const string pointCloudTopic = "/velodyne_points"; extern const string imuTopic = "/imu/data"; 再将原本的这行注释掉,添加以下代码 # 注释 // Ouster OS1-64 //extern const int N_SCAN = 64; //extern const int Horizon_SCAN = 1024; //extern const float ang_res_x = 360.

redis常见面试题及答案(持续总结更新)

什么是 Redis?它是什么样的数据结构? Redis是一种开源的内存数据存储系统,它的主要特点是快速的读写性能。Redis 支持多种数据结构,如字符串、列表、集合、哈希表、有序集合等。 Redis 的优势是什么? Redis的优势有很多,如: 高性能:Redis的读写性能非常快,是目前大多数关系型数据库和缓存系统无法匹敌的。 支持多种数据结构:Redis支持多种数据结构,从而可以很好地适用于多种不同的使用场景。 支持持久化:Redis可以通过把内存数据定期写入磁盘来实现数据的持久化,从而避免因内存数据丢失导致的数据丢失。 支持分布式:Redis支持分布式,从而可以通过分布式集群提高性能和可用性。 Redis 如何保证数据的高可用性? Redis可以通过主从复制和Sentinel机制来保证数据的高可用性。在主从复制中,有一个主节点和多个从节点,主节点负责执行写操作在主从复制中,主节点负责执行写操作,从节点负责复制主节点的数据并执行读操作。当主节点不可用时,从节点可以选举一个新的主节点,从而保证了数据的可用性。 Sentinel机制是一种监控和自动故障转移机制,它可以监控主节点和从节点的状态,并在主节点不可用时自动进行故障转移,从而保证了数据的高可用性。 Redis 支持哪些数据类型? Redis支持多种数据类型,如: 字符串(String) 列表(List) 集合(Set) 哈希表(Hash) 有序集合(Sorted Set) Redis 如何解决数据冗余问题? Redis可以通过数据的分片和复制来解决数据冗余问题。在分片中,数据被分配到多个节点上,每个节点负责存储一部分数据,从而减少了单个节点的数据冗余。在复制中,数据被复制到多个节点上,从而保证了数据的高可用性。 Redis 是否支持事务? 是的,Redis支持事务。Redis的事务使用MULTI,EXEC,DISCARD命令实现,它们可以组合多个命令,并确保这些命令要么全部执行,要么全部不执行,从而保证了数据的原子性。 Redis 是否支持持久化? 是的,Redis支持持久化。Redis提供两种持久化方法:RDB持久化和AOF持久化。RDB持久化是将内存中的数据快照写入磁盘,以便在重新启动Redis时进行恢复。AOF持久化是将每个写操作写入磁盘,以便在重新启动Redis时进行重放。 Redis 是否支持分布式? 是的,Redis支持分布式。Redis提供了一种分布式方案,称为Redis Cluster,它可以将数据分布在多个节点上,从而提高数据的存储能力和可用性

OpenCV对图片进行边缘像素填充

1、概述 图像在卷积的时候边界像素不能被卷积,原因在于边界没有完全和kernel重叠,所以当3x3滤波时有一像素边缘没有被处理,当5x5滤波的时有2像素的边缘没有被处理。如下图所示: OpenCV中常见的边缘填充方式主要有4种: 1.BORDER_DEFAULT:默认模式 2.BORDER_CONSTANT:用指定像素值填充边缘 3.BORDER_REPLICATE:用已知的边缘像素填充边缘像素 4.BORDER_WRAP:用另外一边的像素来补偿填充 边缘填充函数介绍:copyMakeBorder( - Mat src, // 输入图像 - Mat dst, // 添加边缘后的图像 - int top, // 边缘长度,一般上下左右都取相同值, - int bottom, - int left, - int right, - int borderType // 边缘类型主要是如上的四种类型 - Scalar value ,//如果边缘填充类型为BORDER_CONSTANT,则可以设置填充边缘的颜色值 ) 2、代码示例 Mat src = imread(filePath); Mat constant = src.clone(); Mat replicate = src.clone(); Mat wrap = src.clone(); if(src.empty()){ return; } imshow("src",src); Mat border_default; copyMakeBorder(src,border_default,50,50,50,50,BORDER_DEFAULT);//系统默认填充方式 imshow("border_default",border_default); Mat border_constant; copyMakeBorder(constant,border_constant,50,50,50,50,BORDER_CONSTANT);//填充边缘,用指定的像素值 imshow("

青龙面板教程(五):代理设置

一.前言 在某些情况下我们需要脚本通过代理来请求,尤其是容器部署在公网服务器上的时候,IP会出现被限制的情况。 注意,IP限制有两种情况,一种是限制IP请求频率,一种是限制IP类型(来源)。对于后者,可以将下面链接在浏览器中打开(更换IP为要测试的IP)。 https://ip.useragentinfo.com/json?ip=223.104.73.26 你将得到下面的内容,请注意 'net'字段,如果为'数据中心',服务器大概率判定该请求来源于云端而加以限制。 {"country": "中国", "short_name": "CN", "province": "广东省", "city": "东莞市", "area": "", "isp": "移动", "net": "城域网", "ip": "223.104.73.26", "code": 200, "desc": "success"} 下面介绍为青龙面板脚本网络请求设置代理的方法。 二.正文 青龙面板运行的脚本编程语言主要是Python和JavaScript,下面介绍这两种类型脚本的代理设置。 1.Python设置代理 1.1局部代理 局部代理主要针对开发者来使用,如果是自己写的脚本,配置代理就是配置requests模块的代理: proxies = {"http":"http://ip:port","https":"http://ip:port"} requests.get(url,proxies=proxies) 1.2全局代理 Python会默认使用系统环境变量代理设置,因此我们只需要在面板中添加http_proxy、https_proxy环境变量即可: 2.JavaScript设置代理 JavaScript脚本(.js)并不像Python那样默认使用系统代理变量,如果需要使用代理进行请求,那只能在代码中设置。 2.1global-agent介绍 global-agent支持对js脚本配置网络代理,只需要简单的配置环境变量即可。 1.安装global-agent依赖 2.设置环境变量 有如下两种变量设置,一般选第二种就行,注意两种设置的代理协议均是http //仅支持http代理 export GLOBAL_AGENT_HTTP_PROXY=http://ip:port //支持http和https代理 export GLOBAL_AGENT_HTTPS_PROXY=http://ip:port 在青龙面板中设置环境变量即可 3.使用 global-agent的使用也有两种形式,第一种是在js脚本中设置: //js脚本开头加入这段代码 require('global-agent/bootstrap'); 第二种是在命令行中执行脚本时使用node的-r参数把 global-agent导入 node -r 'global-agent/bootstrap' your-script.js 2.2局部代理 通过以上的介绍,可以知道js脚本要使用代理,只需要配置好环境变量,然后在该脚本开头加入一行代码: //js脚本开头加入这段代码 require('global-agent/bootstrap'); 但这种方法有很大的问题,一是如果你不是库作者,库文件一更新就要重新加入代码,二是库文件多时逐个加入很麻烦。 2.3全局代理 青龙面板是使用node命令来执行js脚本的,因此我们可以设置node运行-r参数来达到全局代理的目的:

[CVPR 2017] Look Closer to See Better: Recurrent Attention Convolutional Neural Network for FGVC

Contents Recurrent Attention Convolutional Neural Network (RA-CNN)ExperimentsReferences Recurrent Attention Convolutional Neural Network (RA-CNN) Multi-task formulation:上图展示了 3 scales 的 RA-CNN 网络,由上到下,网络能逐渐识别出更细粒度的语义特征,并且通过不断堆叠网络结构,可以构造出更细粒度的识别流程。每层网络都由 APN + cls head 组成Attention Proposal Network (APN):假设每层的输入图像为 X X X,则 X X X 先由 CNN 抽取出语义特征 f X f_X fX​,APN 由 f X f_X fX​ 得到 attended region (a square): [ t x , t y , t l ] = g ( f X ) [t_x,t_y,t_l]=g(f_X) [tx​,ty​,tl​]=g(fX​)其中 t x , t y t_x,t_y tx​,ty​ 为中心坐标, t l t_l tl​ 为边长的一半, g g g 为两个全连接层。之后 APN 就将 attended region 进行双线性插值放大后当作下一层网络的输入来抽取更细粒度的特征。为了确保 crop 操作可导,作者将一个二维窗函数用作 attention mask 来近似 crop 操作。窗函数定义如下:

UmiJS学习

UmiJS4学习笔记 起步 官网学习:https://umijs.org/ 开发环境 Umi.js 需要使用 Node.js来进行开发,因此请先确保电脑已经安装了 Node.js 且版本在 14 以上。 安装pnpm:npm install pnpm -g 创建项目 Umi 官方提供了一个脚手架 ,可以轻松快速创建一个项目: pnpm dlx create-umi@latest 创建时会进行三个选择: Pick Umi App Template ? > Simple App // 普通项目 > Ant Design Pro // 使用了umi max > Vue Simple App // vue项目 Pick Npm Client ? > npm > cnpm > tnpm > yarn > pnpm (推荐) Pick Npm Registry ? > npm > taobao (推荐) 选择完成 -> 等待项目创建。

antd-mobile中Picker选项更新的问题

antd-mobile中Picker选项更新的问题 需求 如图,Picker按钮上显示的数值是设备的设定温度,可以在点击后通过弹窗选项来修改这个设定温度。同时,设备端或其他手机端也可以修改这个温度,所以这个设定温度是随着设备的实际状态而实时变化的。 每次打开弹窗时,选中项和当前显示的应该一致,即设备实际设定温度。 问题 如果按照上述需求直接写,picker中引入value值,则弹框变成可控组件,就会出现选中项被设备实时温度改变的情况。比如,当前设定108度,打开弹窗选成110度后还没有点击确定,这时在设备上或其他手机上把温度改为105度,则picker选项会被更新一下,表现出来的bug就是选中的110度突然跳变成105度了。 改进 不要value了,将当前实时温度放到defaultValue中,这样首次进入,加载的选中项是对的,选择过程中也不会收实时温度参数变化的影响,但又出了一个问题,第二次以后再打开,picker的选中项是上次选中下发的,如果期间设备设定温度改变了打开又会不一致。比如,原来是108度,点开弹框滑动到110下发了,这时再打开弹框是110度被选中没问题,但如果关闭弹框用设备或其他手机改变设定的温度为105度,这时再打开弹框仍然被选中110度——新的bug又诞生了。 这个问题在以前项目使用antd-modile-v2的时代遇到过,翻了一下找到了class时代留下的印记。一年后用useMemo重写,原理和这个差不多。 结果 现在已经到了antd-modile-v5时代,弹框显隐由state控制,想想需求实际上是在弹框显隐变化时刷新一下即可。经过仔细琢磨,启用了key属性,值为控制显隐的state,目的达到了,代码依然优雅简洁! // 控制弹框显隐 const [temPickerVisible, setTemPickerVisible] = useState(false) // bakeTargetTemperature-设备上报的设定温度 <Picker key={temPickerVisible} columns={...} visible={temPickerVisible} onClose={() => setTemPickerVisible(false)} defaultValue={bakeTargetTemperature} onConfirm={async v => { // 下发设定温度 ... }} />

后台管理系统

用户管理 1. 概述: 用户管理通过后台管理用户的账号信息,包括用户信息的展示、添加、修改、删除、角色分配、账号启用/注销等功能。 用户信息列表展示添加用户修改用户删除用户启用或禁用用户用户角色分配 2. 实现功能 用户头部:面包屑导航 el-breadcrumb 栅栏系统使用的是el-row 表格布局是 el-table、el-pagination 用户状态列和操作列 作用域插槽(为什么使用它,插槽(Slot)是vue的组件封装者 提供的能力。允许开发者在封装组件时,把 不确定的、希望由用户指定的部分 定义为插槽。) 接口调用 async getUserList () { const { data: res } = await this.$http.get('users', { params: this.queryInfo }) if (res.meta.status !== 200) return this.$message.error('获取用户列表失败!') this.userList = res.data.userList this.total = res.data.total } 表格数据分页 <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="queryInfo.pagenum" :page-sizes="[1, 2, 5, 10]" :page-size="queryInfo.pagesize" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination> // 监听pagesize改变的事件 handleSizeChange (newSize) { this.

解决SSL routines:ssl3_get_record:wrong version number

一.问题描述 使用JavaScript脚本通过代理进行网络请求的时候,经常会报这个错误。 SSL routines:ssl3_get_record:wrong version number 二.解决方案 这个错误通常是因为客户端与服务器之间使用了不同版本的SSL/TLS协议。它指出客户端尝试使用一个不正确的SSL/TLS版本来请求一个页面,而服务器却不支持它。 解决这个问题的一种方法是确保服务器支持客户端使用的SSL/TLS版本。想在Linux环境下强制禁用SSL v3和TLS v1,并强制使用更高版本的TLS协议,可以通过设置环境变量来实现。在Node.js环境下,可以使用以下代码: //JavaScript process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; process.env.NODE_TLS_MIN_PROTOCOL_VERSION = "TLSv1.2"; //shell export NODE_TLS_REJECT_UNAUTHORIZED="0" export NODE_TLS_MIN_PROTOCOL_VERSION="TLSv1.2" 如果你想使用其他语言,可以通过查找其官方文档了解该语言是否支持设置环境变量禁用SSL v3和TLS v1,并强制使用更高版本的TLS协议。

Java开发学习(四十六)----MyBatisPlus新增语句之id生成策略控制及其简化配置

在前面有一篇博客:Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发,我们在新增的时候留了一个问题,就是新增成功后,主键ID是一个很长串的内容。 我们更想要的是按照数据库表字段进行自增长,在解决这个问题之前,我们先来分析下ID该如何选择: 不同的表应用不同的id生成策略 日志:自增(1,2,3,4,……) 购物订单:特殊规则(FQ23948AK3843) 外卖单:关联地区日期等信息(10 04 20200314 34 91) 关系表:可省略id …… 不同的业务采用的ID生成方式应该是不一样的,那么在MyBatisPlus中都提供了哪些主键生成策略,以及我们该如何进行选择? 在这里我们又需要用到MyBatisPlus的一个注解叫@TableId 知识点1:@TableId 名称@TableId类型属性注解位置模型类中用于表示主键的属性定义上方作用设置当前类中主键属性的生成策略相关属性value(默认):设置数据库表主键名称 type:设置主键属性的生成策略,值查照IdType的枚举值 1、环境构建 在构建条件查询之前,我们先来准备下环境 创建一个SpringBoot项目 参考Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析 pom.xml中添加对应的依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.itheima</groupId> <artifactId>mybatisplus_03_dml</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>1.8</java.version> </properties> <dependencies> ​ <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency> ​ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> ​ <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> ​ <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ​ <dependency> <groupId>org.

Vue2仿网易云风格音乐播放器(附源码)

Vue2仿网易云风格音乐播放器 1、整体效果2、使用技术3、实现内容4、源码5、使用图片 1、整体效果 2、使用技术 使用了HTML5 + CSS3进行页面布局及美化使用Vue2进行数据渲染与页面交互使用Axios发送http请求获取数据 3、实现内容 实现了搜索歌曲功能,输入歌手或歌曲关键字可获取对应的内容实现了歌曲播放功能,点击歌名或左侧超链接可播放对应的歌曲实现了封面黑胶旋转效果,歌曲播放时旋转,歌曲未播放时停止旋转实现了展示歌曲热门评论的功能,会显示当前歌曲排名前20的热门评论实现了播放MV的功能,点击右侧超链接弹出播放MV 4、源码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue仿网易云音乐</title> <link rel="icon" href="http://s1.music.126.net/style/favicon.ico?v20180823"> <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <style> body { background-image: linear-gradient(to left, rgba(248, 121, 248, 0.623), rgba(216, 160, 6, 0.795)); } #app { position: relative; width: 1300px; height: 800px; background-color: aliceblue; margin: 50px auto; } header { width: 100%; height: 60px; background-color: #ec4141; } .

java记录操作日志(对象修改细节)

背景 由于业务涉及收入敏感信息,需记录数据变更前的内容和变更后的内容,但是不能为完成任务而硬编码,要适用于不同bean。针对这种情况,本文使用泛型、反射和基于AOP的自定义注解技术来完成,对对象属性的描述通过自定义注解来完成,读取里面的属性进而记录修改历史。 需求分析 利用泛型、反射和自定义注解技术,分别比较修改前后两个Bean实例的、所有添加了自定义注解的成员变量,当值不一致时,记录变量名称和修改前后的值。 这种方法适用于处理不同的bean,可以达到一次编码,多处复用的效果。 工具类定义如下: import com.swagger.demo.bean.ChangePropertyMsg; import com.swagger.demo.bean.PropertyMsg; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * * @param <T> */ @Slf4j public class BeanChangeUtil<T> { /** * 传入两个相同类型的对象,对比属性得到修改信息 * @param oldBean * @param newBean * @return 属性修改信息 */ public static <aClass> String getChangeInfo(Object oldBean, Object newBean){ Class aClass = oldBean.getClass(); BeanChangeUtil<aClass> t = new BeanChangeUtil<>(); ChangePropertyMsg cfs = t.contrastObj(oldBean, newBean); if (StringUtils.