- 博客(64)
- 资源 (2)
- 收藏
- 关注
原创 Wifi 认证,关联,四次握手(WPA/WPA2/WPA3-SAE)
SAE 采用了“互联网工程任务组(IETF)”RFC7664 规范中定义的 “蜻蜓(Dragonfly)” 握手协议,将其应用于 Wi-Fi 网络以进行基于密码的身份验证。SAE 采用了“互联网工程任务组(IETF)”RFC7664 规范中定义的 “蜻蜓(Dragonfly)” 握手协议,将其应用于 Wi-Fi 网络以进行基于密码的身份验证。站在用户的角度,设备连接这两种协议(WPA2-personal 和 WPA3-SAE)的热点没有任何操作上的区别。其中 四次 eapol key 属于四次握手的过程。
2023-03-20 20:25:06 11733 5
原创 利用 update-alternatives 控制 Python 版本
什么是 update-alternativesupdate-alternatives 是 Linux 系统用来 控制软件切换的 命令。这次我们主要针对 Ubuntu 系统 控制 python 版本。
2022-04-01 15:40:02 6163
原创 Wifi_认证 、关联 和 四次握手(WPA/WPA2)
帮助理解 WIFI 连接 过程中,认证 关联 以及 WPA/WPA2 -PSK 认证过程,从抓包 到 图解,初步窥探 WIFI 无线通信技术的魅力。
2021-12-28 19:46:48 18633 23
原创 从 sendMessage 到 handleMessage探寻 Handler 源码
Handler从 sendMessage 到 handleMessage跟着我的节奏 按下 Ctrl,鼠标点击 Handler,开始快乐! Skr!!先找到我们最常用的方法 sendMessage(message)它直接调用了 sendMessageDelayed(message, delayMillis)然而 sendMessageDelayed 也只是做了一点校验操作(针对delayMillis的非负校验)然后 它 直接调用了 sendMessageAtTime(message,Sys
2021-08-25 15:23:19 329 3
原创 设计模式——状态模式
设计模式——状态模式对多态的灵活运用。举个栗子帮助治疗一下我总是喜欢 举例子给出一个场景:你有一个女朋友,她的情绪比较不稳定,时而悲伤,时而高兴。当你在不同状态下留意她的动作时,会得到截然相反的结果。比如:高兴的时候,语言表达多以笑为主。悲伤的时候,多以哭为主。但无论哪个状态下,这些动作都有着统一性。所以给出GirlFriendState抽象类:public abstract class GirlFriendState { //表达 prote
2021-08-16 20:30:22 121
原创 设计模式——抽象工厂模式
抽象工厂模式这个模式比较抽象,我们先给一个定义:抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,无需指定他们具体的类。我(菜鸡):没错 , 这很抽象。适用场景:客户端(应用层)不依赖于产品类 实例 如何被 创建 和 实现 等细节。强调一系列相关的产品对象(属于同产品族)一起使用创建对象需要大量的重复代码。提供一个产品类库,所有产品以同样的接口出现,从而使客户端不依赖其具体的实现。(进一步抽象)换一句话说, 抽象工厂模式就是 工厂的工厂 !在实际的场景业务中:
2021-08-14 18:22:28 228
原创 设计模式——工厂模式(简单工厂 和 方法工厂)
简单工厂模式场景 : 当某一类型的 实例对象 创建过程较为复杂时,我们可以采用此设计思想。拿线程池的创建举个例子,看看 这么多参数!每次在创建的时候 都要考虑很多。于是有了工厂模式的思想:我们把繁杂的创建过程 交给工厂去做,将面对客户的方法简单化。场景分析:现在我们有一个车场的需求,每生产一辆车要创建一个车的实例。比如 生产一个 特斯拉:new Tesla("tesla",1,2);特斯拉对应类:public class Tesla{ private String
2021-08-14 16:16:31 268
原创 JUC——线程池
先说思想池化技术是一种设计思想:预先创建好资源并保留,避免资源的频繁创建 和 销毁 而浪费CPU资源。常见场景:线程池对象池连接池线程池的三大方法单一线程的线程池public static void main(String[] args) { //创建单一(大小)线程池 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); try { for(
2021-05-25 20:44:33 179
原创 自定义有向图的深度优先遍历(DFS)
何为图(Graph)形似如下抽象结构:这看起来的确有点抽象 ̄□ ̄||。。我们再看一张:这是一张二叉树,我在之前图的基础上减去了几根“联系”就变成了树。所以在一定程度上,可以把图理解为树延伸(图进一步的打破了树的“规矩”)。程序中的“图”图的存储需要一个集合(Set)来存储我们的节点元素。需要一个映射(HashMap)来存储节点是否被访问过。需要一个 HashMap<T, ArrayList> 来存储节点间的通路。如下图所示:代码实现DFS深度优先遍历
2021-05-24 23:10:13 6763 11
转载 Java中 “>>“ 与 “>>>“ 的区别
负数同理,注意高位空出来的补 “1”。正数右移高位补0,负数右移高位补1。右移示例:4 >> 2。无论是正数还是负数,
2021-01-08 22:11:31 473 2
原创 一起来学Netty吧——NIO简单实现群聊
基于NIO实现群聊系统先来简单阐述一下思路:服务器端package netty.GroupChat;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.util.Iterator;import java.util.Set;/** * @ClassName GroupChatServ
2021-01-05 21:18:46 180
转载 (转)Linux常用命令大全(非常全!!!)
系统信息arch 显示机器的处理器架构uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)hdparm -i /dev/hda 罗列一个磁盘的架构特性hdparm -tT /dev/sda 在磁盘上执行测试性读取操作cat /proc/cpuinfo 显示CPU info的信息cat /proc/interrupts 显示中断cat /proc/meminfo 校验内存使用cat /
2021-01-04 17:27:56 238 1
原创 JUC——异步回调(CompletableFuture)
概述何为异步?在了解这个问题之前 先来看看什么是同步。线程发出一个请求,在这个请求的相应没回来之前,此线程啥也不能做,只能等着。就好比你现在 在看这篇博客,饿了想吃东西,于是出去买饭,你不得不终止现在的事情,等卖完饭回来在看。再来看异步:线程发出一个请求,此线程不必等着响应回来,可以继续处理其他事情。就好比你在看博客,饿了点了外卖,然后继续看,外卖到了会给你打电话。这个电话就是响应。...
2021-01-01 23:44:59 379 2
原创 Excel 的 生成和 读取
生成 Excel/** * 生成 Excel 文件 */ public static void makeDataToExcel() { //生成 Excel 表格 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); HSSFSheet sheet = hssfWorkbook.createSheet(); for (int i = 0; i < DAY_NUM +
2020-12-25 15:48:16 197
转载 File.separatorChar 分隔符
File.separatorChar表明文件路径区分符,比如在中英文下就是"",日文下"¥",Unix下"/";用File.separatorChar会根据系统自动代替这些字符,比直接用有更好的通用性。比如:public static String localConfigPath = "D:"+ File.separator + "sky" + File.separator + "song.txt";...
2020-12-17 16:32:12 2403
原创 JUC——安全容器类(CopyOnWriteArrayList,CopyOnWriteArraySet 和 ConcurrentHashMap)
引入在多线程下,List ,Set ,Map 都是不安全的。先拿List举个例子。
2020-12-16 01:42:07 341 1
转载 java正则表达式获取xml文件中指定节点的值
/** * 获取指定标签中的内容 * * @param xml 传入的xml字符串 * @param label 指定的标签 */ public static List<String> getFieldListByRegex(String xml, String label) { //正则表达式 String regex = "<" + label + ">(.*?)</" + la.
2020-12-11 10:51:17 1117
转载 Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念(转)
PO(persistant object) 持久对象在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了。通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理。可以看成是与数据库中的表相映射的 java 对象。最简单的 PO 就是对应数据库中某个表中的一条记录,多个记录可以用 PO 的集合。PO 中应该不包含任何对数据库的操作。DO(Domain Object)领域对象就是从现实世界中抽象出来的有形或无形的业务实体。一般和数据中的表结构对应。
2020-12-04 17:27:02 183
转载 遍历hashmap 的四种方法
以下列出四种方法public static void main(String[] args) {Map<String,String> map=new HashMap<String,String>(); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3"); map.put("4", "value4");//第一种:普通使用,二次取值(性能差) Sys
2020-12-04 11:10:48 739 2
原创 JUC——volatile关键字(从JMM理论基础到单例模式实践)
概述你对 volatile 关键词了解多少。首先 volatile 是个Java关键词。volatile 是Java虚拟机提供的一种 轻量级同步机制1. 保证可见性2. 不保证原子性3. 禁止指令重排阐述volatile 保证可见性。那什么是可见性?研究这个之前,我们不妨先来了解一下 JMM (Java内存模型)。JMM 的一些约定:线程释放锁前,必须把共享变量值 刷回 主存中去线程获得锁前,必须先把主存中最新的共享变量值读取到自己工作内存中。加
2020-12-01 18:06:27 200
原创 一听说我没写日志,啪!就把锅甩过来了,,很快啊!!!
日志的作用写日志是项目开发过程中非常重要的一环。日志可以帮助你快速定位问题。这里可能有人会说,出了问题可以调试。线上怎么调试?把服务停了吗?调坏了怎么办?肯定是尽最大可能避免线上调试的。所以日志就显得尤为重要了。日志是你作为一个后端开发 和 测试 运营 产品 以及前端 等各大势力对峙的武器。塔们说,你这肾么回事。发来两张截图。一张说是点击没有反应,,一张说是调的接口无效。。你能怎么办,你一个后端上哪截图去??所以,这个日志就显得尤为重要了,接口调没调,看
2020-11-27 16:15:33 165 4
原创 JUC——ForkJoin(分而治之)
引用ForkJoin框架是处理任务的一种决策——“大事化小,小事化了”是其主要思想。分而治之利用此框架的思想,将比较大的任务拆分成小任务,再借助多线程分别处理计算,最后在把结果合并起来,返回最终的结果。上图:可见画功了得!!啊呸!!!实现通过实现一个小例子来理解这个过程。实现从 1 加到 10亿。创建任务类:import java.util.concurrent.RecursiveTask;/** * “这看起来很像递归,有关类的递归” * “淦!就是
2020-11-25 15:41:26 281 2
原创 Java——Stream流计算(java.util.stream)
什么是流(Stream)这个问题可以换种方式来问——流(Stream)的干什么的。流是用来计算的。流没有存储空间,流不是存储元素的数据结构;相反,它通过计算操作的流水线传送诸如数据结构,阵列,生成器功能或I / O通道的源的元件。这是JDK1.9说明文档的原话。进一步解释:我们处理数据无非就分为两种,一种是存储,另一种则是计算了。Stream流就是负责计算的一种元件。我们通过一个小例子在理解一下流的使用。实例import java.util.Arrays;impor
2020-11-23 17:32:55 779
原创 Java——函数式接口(java.util.function)
定义一个接口里有且仅有一个抽象方法,但是可以有多个非抽象方法,这样的接口称之为——函数式接口引入常见的函数式接口:Runnable只有一个抽象方法——run();四大基本函数式接口是 java.util.function 包下最基本的四个函数式接口。FunctionFunction 接口的 apply 方法,就是让你传入一个参数,返回一个值。并且在泛型中体现了 传入 和 返回 的参数类型。实例:import java.util.function.Function;
2020-11-22 17:39:17 6778 4
原创 一起来学Netty吧——开篇——BIO和NIO
Netty是什么它是基于NIO的再度封装,修复了JDK 原有NIO的诟病,而近乎完美的网络通信框架。那什么是NIO?关于这个问题,我们可以先从 Java 最原始的 BIO说起。首先强调一下,对 Java基本网络编程 的理解很重要,因为这是一层套一层的关系。如图:这是个逐层封装和优化的过程。其中的核心主体一直都是网络。我们这里先重点说一下BIO,也就是我们的传统Java网络编程。Java网络编程(BIO)我们首先给出结论,稍后我们代码验证。如图:当有一个客户端向服务器发
2020-11-20 22:06:12 192
原创 设计模式——观察者模式详解(边边奋斗史)
场景气象站发布 和 更新 天气信息,第三方站点 获取的过程。思路_1:第三方站点主动去调用气象站的数据。表面上看没什么问题,但从具体情况出发就会显得略显不妥。第三方只能定时的去获取,这可能会不准确,也可能会浪费系统资源。因为第三方无法知道气象站的更新时间思路_2:气象站主动给第三方推送。这样似乎解决了思路_1的问题,但有出现了新的问题:如果要想让气象站推送的话,那么第三方站点就需要被气象站维护。换言之,就是气象站类依赖于第三方站点类。这样的话,当第三方站点数量和
2020-11-19 17:09:24 146
原创 Leecode:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数
题目/*** 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。* 示例 1:* 输入: [1,3,4,2,2]* 输出: 2* 示例 2:* 输入: [3,1,3,4,2]* 输出: 3* 说明:* 不能更改原数组(假设数组是只读的)。* 只能使用额外的 O(1) 的空间。* 时间复杂度小于 O(n2) 。* 数组中只有一个重复的数字,但它可能不止
2020-11-10 14:07:31 2922 7
原创 JUC——Callable与Runnable
Callable与Runnable的关系异同点:他们都可以作为线程的实现接口Callable有返回值,而 Runnable没有返回值Callable可以抛出异常,而Runnable不能Callable的实现方法为 Call() ,Runnable的实现方法为Run()这些都是我们明面上能看到的区别。二者与Thread的关系Thread 是我们最常用的 线程实现类,他和 Runnable 有着 很直接的关系:Thread 实现了 Runnable 接口,是的,,这相当直接。但
2020-11-06 16:35:26 202 1
原创 JUC——走进并发编程(java.util.concurrent)
什么是JUC它是java.util 下的一个工具包 concurrent,里面装着与并发编程相关的类等。回顾线程创建,发现不同首先是我们熟悉的 RunnableRunnable 这个接口是 java.lang 包下的。当我们创建线程类的时候,会直接或间接的实现这个接口:直接实现 Runnable 接口继承 Thread 类(Thread类也是实现了Runnable 接口的)再来看Callable,它也是个接口,并且是属于java.util.concurrent包下的接口
2020-11-06 14:47:59 149
原创 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它
题目给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路代码先看链表节点结构:(这里用一个静态内部
2020-11-04 20:37:05 889
原创 LeetCode:给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序
题目给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例 1:输入:[-4,-1,0,3,10]输出:[0,1,9,16,100]示例 2:输入:[-7,-3,2,3,11]输出:[4,9,9,49,121]提示:1 <= A.length <= 10000-10000 <= A[i] <= 10000A 已按非递减顺序排序。思路情况①数组里的元素都是非负数。这种情况就比较好解决了,直接按
2020-11-03 22:18:53 2434 2
原创 JUC——阻塞队列(边边奋斗史)
明确主体什么是 阻塞队列?这次我们讨论的主体是 BlockingQueue ,他是一个interface(接口)尝试思考 阻塞队列 的使用场景。多线程开发线程池四组API(存取)通过对 阻塞队列 的 “存”、“取”,来了解 BlockingQueue 的四组 API:方式抛出异常不抛异常阻塞等待限时等待添加add(E e)offer(E e)put(E e)offer(E e,long time,TimeUnit unit)移除rem
2020-10-27 17:31:12 167 1
原创 JUC——深刻理解锁(边边奋斗史)
引入今天我们将通过几个场景来深刻的理解几个问题。如下:什么是锁?是谁的锁?锁的是谁?场景1import java.util.concurrent.TimeUnit;/** * @ClassName test1 * @Description * @Author SkySong * @Date 2020-10-11 18:13 */public class test1 { public static void main(String[] args) throws I
2020-10-11 21:00:00 555 4
原创 初识JVM——GC算法
引用计数法给每个已占空间都设置上一个引用计数器,当指向这块空间的引用数为0时,便清理这块儿空间。这个方法实现起来比较简单,但问题较多。因为计数器本身就有较大的资源消耗,很多场景都不适用。复制算法给新生代再次划分,分为 伊甸区(Eden)和 两个幸存区(from 和 to)。此方法运行时效性好,比较快。但:两个幸存区中 一定有一个是空的,这样就相当于浪费了一部分空间。标志-清除-压缩过程如图:标志 和 清除可以很好的利用空间,但这样会产生较多的空间碎片,降低了空间的利
2020-10-04 16:33:14 149
WPA3_Specification_v3.0 WIFI联盟WPA3 官方文档
2022-04-22
Drawer.rar
2020-05-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人