首页 文章 精选 留言 我的

精选列表

搜索[个人博客],共10006篇文章
优秀的个人博客,低调大师

个人隐私安全该何去何从-大量APP秘密收集追踪个人信息

研究人员在上周的IEEE欧洲议会上表示,他们在近期的一项研究中发现了234种安卓应用会向用户发出“允许使用麦克风”的请求,以此通过超声波信号追踪用户信息。基于超声波跨设备追踪技术(Ultrasonic Cross-Device Tracking,uXDT)是许多市场和广告公司的“宠儿”。 超声波音频信标可以植入电视广告或网页广告,而装有接收器的移动APP则可以收集这些信标。由此,广告商可以通过此项技术跨设备追踪用户信息,创建用户的个性化档案,通过分析设备收集的数据了解用户的兴趣所在,从而为每位用户推荐他们感兴趣的广告。 越来越多的APP开始使用uXDT技术 在这项研究中,研究人员针对VirusTotal服务的数百万Android应用进行了分析,他们发现一小部分应用采用名为Shopkick和Lisnr的超声波音频技术。还有不少应用则采用了SilverPush SDK,这是个可让开发者对用户进行跨设备追踪的SDK。SilverPush、Lisnr和Shopkick都是为开发者准备的SDK,这三款SDK都采用超声波信标给移动设备发送信息。 开发者可以通过SilverPush跨多个设备追踪用户信息,而 Lisnr 和Shopkick 则用于对用户进行位置追踪。研究人员在分析了大量Android应用之后发现,使用 Lisnr和Shopkick SDK的厂商并不多,但是使用SilverPush SDK的却大有人在。这份报告还提到,在研究人员走访的35家德国零售商店中,就有4家店内存在超声波信标。 早在2015年,就有一份研究显示,样本中有6-7个APP使用了SilverPush SDK,该企业由此监视了大约1800万台智能手机,但这一数量正在不断上升。 在2016年的BlackHat黑客大会上就有研究人员对uXDT技术进行了展示,并指出这种技术可以通过反匿名暴露Tor用户的真实信息。(例如,在正常情况下,用户通过比特币进行交易不会留下真实的身份信息,但一家恶意网站可以追踪出用户的真实身份,或揭露出通过匿名网络,如Tor洋葱网络,浏览网页的用户身份。) 隐私安全将何去何从? 虽然uXDT技术的应用目前尚未“误入歧途”,但它仍然引发了许多对隐私的担忧——app只需通过麦克风接收超声波就可进行追踪活动,而无需任何移动网络或无线网络。该研究报告提到: “SilverPush的存在实际上缩小了监控和合法追踪之间的距离。SilverPush和Lisnr采用相似的通讯协议和信号处理方式。即便用户指导Lisnr会进行地理位置追踪,SilverPush也不会公开采用这种追踪功能的应用名称。” 2014年斯诺登事件曝光后,泄露文档提到美国情报机构如何获取国外旅客在不同城市间的动向:机场会收集这些人所用设备的MAC地址,而全国各地咖啡厅、餐厅和零售店的WiFi热点也会进行MAC地址识别,情报机构再对两者进行比对。国外媒体认为,超声波技术对于夸设备追踪用户动向甚至会有更好的效果。 如何进行自我保护? 既然我们无法阻止超声波信号在自己周围传输,那么为了减少智能手机被监听的风险,最好的方法就是严格限制通过APP对设备发起的“请求”。 换而言之,这里我们只需运用自己的常识。例如,如果Skype请求“使用麦克风”,显然十分合理的,因为在Skype中将用到这一功能。但倘若美妆或服饰APP发送这一请求,结果又将如何?作为用户,应该严格拒绝请求。 为了取消这些不需要的APP请求,一些Android手机厂商,例如一加为用户提供了一种叫做“隐私指南”(Privacy Guard)的功能,用户可以通过这一功能禁止一些与APP基本功能无关的请求。 Android 7和iOS 10用户同样可以通过设置实现这一操作。 【本文为51CTO专栏“柯力士信息安全”原创稿件,转载请联系原作者(微信号:JW-assoc)】 戳这里,看该作者更多好文 作者:柯力士信息安全 来源:51CTO

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.9.5 版本

主要更新内容 文章归档功能 文章页打印样式 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.9.3 版本

主要更新内容 许可协议可以被隐藏 TOC 支持自定义配置 优化重载事件触发 修改文字计数逻辑 略微缩短导航栏二级菜单的宽度 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.9.2 版本

主要更新内容 兼容hexo-blog-encrypt插件 优化 MathJax 加载 修复多处BUG 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.9.1 版本

主要更新内容 略微增加分页按钮的间隔 当创建与更新日期相同时,不显示更新日期 升级第三方库默认版本 修复上个版本的若干问题 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.9.0 版本

主要更新内容 全新的文章页版权信息栏 全新的多语言配置功能 增加代码注入功能,多种组件改为注入式加载 多语言增加西班牙语 遵循"请勿追踪"功能 代码高亮等多个组件支持了暗色模式 重构引入 script 和 css 的逻辑 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.8.14 版本

主要更新内容 增加对滚动条颜色的配置项 TOC 增加光标样式 表格适配暗色模式 代码高亮适配缩进代码块 固定 highlight 代码行数 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.8.13 版本

主要更新内容 LeanCloud 增加忽略本地路径的配置项 文章可自动生成description属性 修改阅读时长的默认值和计算 更新iconfont和hint的 CDN 链接 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.8.12 版本

主要更新内容 增加 OpenGraph 配置项 增加字间距的配置项 暗色模式按钮悬停动效 字体在苹果系统下抗锯齿 评论图片支持缩放功能 备案信息不再强制对称居中 优化无障碍条件 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.8.11 版本

主要更新内容 支持Cusdis评论插件 多语言增加世界语(Esperanto) 大部分评论插件的配置项现在可以自行追加 升级第三方库默认版本 优化搜索框代码 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

优秀的个人博客,低调大师

博客大赛】Netty面试灵魂15问

写在之前 Netty有很多不错的考察点,今天就来总结一下常见的 Netty 面试题,面试题主要来自于牛客网网友分享的面经,答案为自己参考《Netty实战》及众多资料,避免闭门造车。 由于 Netty 知识可考察的点比较多,本文主要针对于 Netty 基础提出15连问,基本上都是面试常考题目。 准备发车 1. Netty 是什么 Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器 和客户端。 2. 为什么要使用Netty? 这个问题也有其他的问法,比如原生NIO有什么问题呢。 NIO 的类库和API繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。 JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector空轮询,最终导致 CPU 100%。直到 JDK 1.7 版本该问题仍旧存在,没有被根本解决。 3. Netty有什么优点 主要从以下几个方面展开回答。 设计: 统一的 API,支持多种传输类型,阻塞的和非阻塞的 简单而强大的线程模型 真正的无连接数据报套接字支持 链接逻辑组件以支持复用 易用性: 详实的 Javadoc 和大量的示例集 性能: 拥有比 Java 的核心 API 更高的吞吐量以及更低的延迟 得益于池化和复用,拥有更低的资源消耗 最少的内存复制 健壮性: 不会因为慢速、快速或者超载的连接而导致 OutOfMemoryError 消除在高速网络中 NIO 应用程序常见的不公平读/写比率 安全性: 完整的 SSL/TLS 以及 StartTLS 支持 可用于受限环境下,如 Applet 和 OSGI 4. netty高性能主要依赖了哪些特性 IO 线程模型:同步非阻塞,用最少的资源做更多的事。 内存零拷贝:尽量减少不必要的内存拷贝,实现了更高效率的传输。 内存池设计:申请的内存可以重用,主要指直接内存。内部实现是用一颗二叉查找树管理内存分配情况。 串形化处理读写:避免使用锁带来的性能开销。 高性能序列化协议:支持 protobuf 等高性能序列化协议。 5. 为什么BIO比NIO性能差?简单讲讲区别 BIO:服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。 传统IO的缺点:第一,在任何 时候都可能有大量的线程处于休眠状态,只是等待输 入或者输出数据就绪,这可能算是一种资源浪费第 二,需要为每个线程的调用栈都分配内存,其默认值 大小区间为 64 KB 到 1 MB,具体取决于操作系统第 三,即使 Java 虚拟机(JVM)在物理上可以支持非常大数量的线程,但是远在到达该极限之前,上下文切换所带来的开销就会带来麻烦 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理,相对于BIO来说比较灵活。 6. 简单说下 BIO、NIO 和 AIO区别 概念本质不同 BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 AIO:一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。 底层实现区别 BIO 以流的方式处理数据,而 NIO 以块的方式处理数据,块 I/O 的效率比流 I/O 高很多 BIO 是阻塞的,NIO 则是非阻塞的 BIO基于字节流和字符流进行操作,而 NIO 基于 Channel(通道)和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道 7. 说说NIO的主要组成 1、Buffer 一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。与 Channel 进行交互,数据是从Channel 读入缓冲区,从缓冲区写入 Channel 中的。 2、Channel NIO的通道类似于流,但有些区别 通道可以同时进行读写,而流只能读或者只能写 通道可以实现异步读写数据 通道可以从缓存读数据,也可以写数据到缓存 channel与Buffer关系 3、Selector 能够检测多个注册的通道上是否有事件发生(注意:多个Channel以事件的方式可以注册到同一个Selector),如果有事件发生,便获取事件然后针对每个事件进行相应的处理。这样就可以只用一个单线程去管理多个通道,也就是管理多个连接和请求。 8. 说说对于Netty的零拷贝理解 什么是零拷贝? 从操作系统的角度来看,文件的传输不存在CPU的拷贝,只存在DMA拷贝(直接内存拷贝,不使用CPU完成)。零拷贝是网络编程的关键,很多性能优化都离不开它。 Netty对于零拷贝方式 Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接内存中,然后才写入Socket中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。 Netty 提供了组合 Buffer 对象,可以聚合多个 ByteBuffer 对象,用户可以像操作一个 Buffer 那样方便的对组合 Buffer 进行操作,避免了传统通过内存拷贝的方式将几个小 Buffer 合并成一个大的 Buffer。 Netty 的文件传输采用了 transferTo 方法,它可以直接将文件缓冲区的数据发送到目标 Channel,避免了传统通过循环 write 方式导致的内存拷贝问题。 9. 说说Netty线程模型 Netty线程模型主要基于主从 Reactor 多线程模型做了一定的改进,其中主从Reactor多线程模型有多个 Reactor。 内部实现了两个线程池,boss 线程池和 work 线程池,其中 boss 线程池的线程负责处理请求的连接事件,当接收到连接事件的请求时,把对应的socket封装到一个NioSocketChannel 中,并交给 work 线程池,其中 work 线程池负责请求的 read 和 write 事件,由对应的 Handler 处理。 其本质将线程连接和具体的业务处理区分开来。 10. Netty中有哪些重要组件 1、Bootstrap、ServerBootstrap:一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 是服务端启动引导类。 2、Future、ChannelFuture:Netty 中所有的 IO 操作都是异步的,不能立刻得知消息是否被正确处理。但是可以过一会等它执行完成或者直接注册一个监听,具体的实现就是通过 Future 和 ChannelFutures,他们可以注册一个监听,当操作执行成功或失败时监听会自动触发注册的监听事件。 3、Channel:Netty 网络操作抽象类,它除了包括基本的 I/O 操作,如 bind、connect、read、write 等 4、Selector:基于 Selector 对象实现I/O多路复用,通过 Selector 一个线程可以监听多个连接的 Channel 事件,Selector 内部的机制就可以自动不断地查询(Select) 这些注册的 Channel是否有已就绪的I/O 事件(例如可读,可写,网络连接完成等) 5、ChannelHandler:充当了所有处理入站和出站数据的逻辑容器。ChannelHandler 主要用来处理各种事件,这里的事件很广泛,比如可以是连接、数据接收、异常、数据转换等。 6、EventLoop:主要是配合 Channel 处理 I/O 操作,用来处理连接的生命周期中所发生的事情 7、ChannelPipeline:为 ChannelHandler 链提供了容器,当 channel 创建时,就会被自动分配到它专属的 ChannelPipeline,这个关联是永久性的。 8、ChannelHandlerContext:包 含 一 个 具 体 的 事 件 处 理 器 ChannelHandler , 同 时ChannelHandlerContext 中也绑定了对应的 pipeline 和 Channel 的信息,方便对 ChannelHandler进行调用。 11. 说说什么是拆包和粘包 TCP 是面向连接的,面向流的,提供高可靠性服务。 收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样做虽然提高了效率,但是接收端就难于分辨出完整的数据包了,由于TCP无消息保护边界,需要在接收端处理消息边界问题。这就是拆包和粘包问题。 比如: 拆包和粘包图解 假设客户端同时发送了两个数据包D1和D2给服务端,由于服务端一次读取到字节数是不确定的,固可能存在以下四种情况: 服务端分两次读取到了两个独立的数据包,分别是 D1 和 D2 ,没有粘包和拆包 服务端一次接受到了两个数据包,D1 和 D2 粘合在一起,称之为 TCP 粘包 服务端分两次读取到了数据包,第一次读取到了完整的 D1 包和 D2 包的部分内容,第二次读取到了 D2 包的剩余内容,这称之为 TCP 拆包 服务端分两次读取到了数据包,第一次读取到了 D1 包的部分内容 D1_1 ,第二次读取到了D1包的剩余部分内容D1_2和完整的D2包。 12. Netty如何解决拆包和粘包问题 主要思路:在数据包的前面加上一个固定字节数的数据长度,如加上一个 int(固定四个字节)类型的数据内容长度。 就算客户端同时发送两个数据包到服务端,当服务端接受时,也可以先读取四个字节的长度,然后根据长度获取消息的内容,这样就不会出现多读取或者少读取的情况了。 Netty解决拆包和粘包问题示意图 13. Netty主要采用了哪种设计模式 Netty中利用到了众多的设计模式,有很多常见的设计模式,比如观察者模式、策略模式(在初始化 EventLoopGroup 时选择何种 DefaultEventExecutorChooserFactor-newChooser 时使用了),但是使用的最多的还是属于责任链模式,pipeline 就像一个责任链,ChannelHandler 就是其中处理逻辑的节点,通过自定义 Handler 来决定每个业务的执行逻辑。 14. 说说netty中的责任链设计模式 netty的 pipeline 设计,就采用了责任链设计模式,底层采用双向链表的数据结构,将链上的各个处理器(Handler)串联起来。 客户端每一个请求的到来,netty 认为,pipeline 中的所有的处理器都有机会处理它,因此,对于入栈的请求,全部从头节点开始往后传播,一直传播到尾节点。 开发者可以自主的删除或者添加责任链中的某个节点。 15. Netty 是如何保持长连接的 什么是长连接? 客户端和服务器之间定期发送的一种特殊的数据包,通知对方自己还在线, 以确保 TCP 连接的有效性。但是由于网络不稳定性,有可能在 TCP 保持长连接的过程中,由于某些突发情况, 例如网线被拔出, 突然掉电等。 会造成服务器和客户端的连接中断。在这些突发情况下, 如果恰好服务器和客户端之间没有交互的话,那么它们是不能在短时间内发现对方已经掉线的。 如何保持长连接? 利用心跳维护长连接信息。 在服务器和客户端之间一定时间内没有数据交互时,即处于 idle 状态时,客户端或服务器会发送一个特殊的数据包给对方,当接收方收到这个数据报文后, 也立即发送一个特殊的数据报文, 回应发送方, 此即一个 PING-PONG 交互。 当某一端收到心跳消息后, 就知道了对方仍然在线, 这就确保 TCP 连接的有效性。 Netty有三种类型保持心跳类型 readerIdleTime:为读超时时间(即测试端一定时间内未接受到被测试端消息)。 writerIdleTime:为写超时时间(即测试端一定时间内向被测试端发送消息)。 allIdleTime:所有类型的超时时间。 总结 针对于 Netty ,本身利用比较广泛,比如国内流行的 RPC 框架 Dubbo ,由于开发者本身无须深入了解其原理就可以很好的进行业务开发,因此许多人对于Netty了解甚少,但是想要了解一些进阶的 Java 编程,Netty 是一个不错的学习框架,本篇文章结合面试题开发,整体串起 Netty 的核心知识。

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.8.10 版本

主要更新内容 增加文章图片放大后可加载原图片的配置 升级依赖库版本 优化放大字号后的样式 优化懒加载代码 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

优秀的个人博客,低调大师

博客大赛】浅析go切片与排序

切片是Go语言中引入的用于在大多数场合替代数组的语法元素。切片是一种长度可变的同类型元素序列,它原则上不支持存储不同类型的元素,当然了作为打工人是非常清楚“原则上”的潜台词就是“某种情况下允许” special := []interface{}{“hello go”, 2021, 4.15} 这种允许的情况有机会我们另外讨论,这个不是本次的讨论范围,本文就事论事,还不至于深入到原理。 正所谓有序列的地方就有排序的需求。在各种排序算法都已经成熟的今天,我们完全可以针对特定元素类型的切片手写排序函数/方法,但多数情况下不推荐这么做,因为Go标准库内置了sort包可以很好地帮助我们实现原生类型元素切片以及自定义类型元素切片的排序任务,但话又说回来,工程项目中我们大概率都是拿来主义的,也只有是在平常刷题练习中才会自己考虑实现相关的算法。 对于sort Go 的排序思路和 C 和 C++ 有些差别。 C 默认是对数组进行排序, C++ 是对一个序列进行排序, Go 则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是一个slice (分片, 类似于数组),或是包含 slice 的一个对象。 这个包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。但是这四种排序方法是不公开的,它们只被用于sort 包内部使用。因此在对数据集合排序时不必考虑应当选择哪一种排序方法,只要实现了 sort.Interface 定义的三个方法: 获取数据集合长度的Len() 方法 比较两个元素大小的Less() 方法 交换两个元素位置的Swap()方法 完成之后可以顺利对数据集合进行排序【无时不刻在等待泛型的出现啊,重复写真的烦:)】 sort 包会根据实际数据自动选择高效的排序算法。 除此之外,为了方便对常用数据类型的操作,sort 包提供了对[]int切片、[]float64 切片和[]string 切片完整支持,主要包括: 对基本数据类型切片的排序支持 基本数据元素查找 判断基本数据类型切片是否已经排好序 对排好序的数据集合逆序 数据集合排序 前面已经提到过,对数据集合(包括自定义数据类型的集合)排序需要实现 sort.Interface 接口的三个方法,我们看以下该接口的定义: type Interface interface { // 获取数据集合元素个数 Len() int // 如果 i 索引的数据小于 j 索引的数据,返回 true,且不会调用下面的 Swap(),即数据升序排序。 Less(i, j int) bool // 交换 i 和 j 索引的两个元素的位置 Swap(i, j int) } 数据集合实现了这三个方法后,即可调用该包的Sort() 方法进行排序。Sort() 方法定义如下: func Sort(data Interface) Sort() 方法使用的惟一参数就是待排序的数据集合。 此外该包还提供了一个方法可以判断数据集合是否已经排好顺序,毕竟方法的内部实现依赖于我们自己实现的 Len() 和 Less() 方法: func IsSorted(data Interface) bool { n := data.Len() for i := n - 1; i > 0; i-- { if data.Less(i, i-1) { return false } } return true } 最后一个方法:Search() func Search(n int, f func(int) bool) int 该方法会使用“二分查找”算法来找出能使f(x)(0&lt;=x&lt;n) 返回 ture 的最小值 i。 前提条件 : f(x)(0&lt;=x&lt;i) 均返回false,f(x)(i&lt;=x&lt;n) 均返回ture。 如果不存在 i 可以使 f(i) 返回 ture, 则返回 n。 Search() 函数一个常用的使用方式是搜索元素 x 是否在已经升序排好的切片 s 中: x := 11 s := []int{3, 6, 8, 11, 45} // 注意已经升序排序 pos := sort.Search(len(s), func(i int) bool { return s[i] >= x }) if pos < len(s) && s[pos] == x { fmt.Println(x, " 在 s 中的位置为:", pos) } else { fmt.Println("s 不包含元素 ", x) } 排序原理 截至目前Go 1.15版本,Go还不支持泛型。因此,为了支持任意元素类型的切片的排序,标准库sort包定义了一个Interface接口和一个接受该接口类型参数的Sort函数: type Interface interface { Len() int Less(i, j int) bool Swap(i, j int) } func Sort(data Interface) { n := data.Len() quickSort(data, 0, n, maxDepth(n)) } 为了应用这个排序函数Sort,我们需要让被排序的切片类型实现sort.Interface接口,以整型切片为例 type IntSlice []int func (p IntSlice) Len() int { return len(p) } func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] } func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func main() { sl := IntSlice([]int{89, 14, 8, 9, 17, 56, 95, 3}) fmt.Println(sl) // [89 14 8 9 17 56 95 3] sort.Sort(sl) fmt.Println(sl) // [3 8 9 14 17 56 89 95] } 从sort.Sort函数的实现来看,它使用的是快速排序quickSort。我们知道快速排序是在所有数量级为O(nlogn)的排序算法中其平均性能最好的算法,但在某些情况下其性能却并非最佳,Go sort包中的quickSort函数也没有严格拘泥于仅使用快排算法,而是以快速排序为主,并根据目标状况在特殊条件下选择了其他不同的排序算法,包括堆排序(heapSort)、插入排序(insertionSort)等。 sort.Sort函数不保证排序是稳定的,要想使用稳定排序,需要使用sort.Stable函数。 sort包的“语法糖”排序函数 我们看到,直接使用sort.Sort函数对切片进行排序是比较繁琐的。如果仅仅排序一个原生的整型切片都这么繁琐(要实现三个方法),那么sort包是会被喷惨的。还好,对于以常见原生类型为元素的切片,sort包提供了类“语法糖”的简化函数,比如:sort.Ints、sort.Float64s和sort.Strings等。上述整型切片的排序代码可以直接改造成下面这个样子: func main() { sl := []int{89, 14, 8, 9, 17, 56, 95, 3} fmt.Println(sl) // [89 14 8 9 17 56 95 3] sort.Ints(sl) fmt.Println(sl) // [3 8 9 14 17 56 89 95] } 原生类型有“语法糖”可用了,那么对于自定义类型作为元素的切片,是不是每次都得实现Interface接口的三个方法呢?Go团队也想到了这个问题! 所以在Go 1.8版本中加入了sort.Slice函数,我们只需传入一个比较函数实现即可: type Lang struct { Name string Rank int } func main() { langs := []Lang{ {"rust", 2}, {"go", 1}, {"swift", 3}, } sort.Slice(langs, func(i, j int) bool { return langs[i].Rank < langs[j].Rank }) fmt.Printf("%v\n", langs) // [{go 1} {rust 2} {swift 3}] } 同理,如果要进行稳定排序,则用sort.SliceStable替换上面的sort.Slice。 总结 本文主要是通过对go中切片的分析,由于go中的排序不同于c、c++、python这些语言的排序习惯,又由于其不支持泛型,且正处于野蛮生长期,我们在学习应用的过程中,也难得的可以体验其发育带来痛苦,正因为没有体会相同的痛苦,就不能感同身受,成熟的语言如java、python用多了,一直用别人的轮子,实在体会不到轮子内部的精妙之处,我们在学习的过程中可以自己实现相关的排序算法,见证社区的发展,反而可以一步步推演内核的进化,进而触类旁通猜测其他语言的设计思想,不胜荣幸。 参考资料 https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter03/03.1.html https://golang.org/pkg/sort/ https://tonybai.com/2020/11/26/slice-sort-in-go/ https://itimetraveler.github.io/2016/09/07/%E3%80%90Go%E8%AF%AD%E8%A8%80%E3%80%91%E5%9F%BA%E6%9C%AC%E7%B1%BB%E5%9E%8B%E6%8E%92%E5%BA%8F%E5%92%8C%20slice%20%E6%8E%92%E5%BA%8F/

优秀的个人博客,低调大师

Hexo Fluid 博客主题更新 1.8.9 版本

主要更新内容 重构懒加载代码 FrontMatter 可以设置keywords参数 增加分类文章排序字段 增加评论插件配置字段 关于 Fluid Fluid 是一款基于 Hexo 框架的 Material Design 风格主题。 该主题相较于其他主题的优势: 1. 优雅的颜值,使用 Material Design 风格突出层次感,但又不失简约,让用户能专注于写作; 2. 提供大量定制化配置项,使每个用户使用该主题都能具有独特的样式; 3. 响应式页面,适配手机、平板等设备,包括极端的分辨率都能轻松应对; 4. 主题中少有的整合了 LaTeX 和 mermaid 的支持 目前具有的功能特性: 图片懒加载 自定义代码高亮方案 内置多语言 支持多款评论插件 支持使用数据文件存放配置 自定义静态资源 CDN 无比详实的用户文档 内置文章搜索 页脚备案信息 网页访问统计 支持脚注语法 支持 LaTeX 数学公式 支持 mermaid 流程图 暗色模式 详情查看:https://github.com/fluid-dev/hexo-theme-fluid

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册