摘要:Java中的泛型与数组平时开发用的很多,除了偶尔遇到"NullPointerException"和"IndexOutOfBoundsException"一般也不会遇到太大问题。可是如果深入研究,可能会发现这两种类型有很多奇怪的特点。我查了一些资料,发现包括《Java编程思想》在内对这些问题的解释都含 阅读全文
posted @ 2020-02-15 17:31 冷豪 阅读 (7) 评论 (0) 编辑
摘要:继上一篇介绍如何在多种语言之间使用SSL加密通信,今天我们关注Java端的证书创建以及支持SSL的NioSocket服务端开发。完整源码 一、创建keystore文件 网上大多数是通过jdk命令创建秘钥文件,但是有时候我们需要将配套的秘钥以及证书让多个模块来使用,他们很可能是由不同语言开发。在这样的 阅读全文
posted @ 2020-02-14 11:47 冷豪 阅读 (106) 评论 (0) 编辑
摘要:本文将详细介绍如何在Java端、C++端和NodeJs端实现基于SSL/TLS的加密通信,重点分析Java端利用SocketChannel和SSLEngine从握手到数据发送/接收的完整过程。本文也涵盖了在Ubuntu系统上利用OpenSSL和Libevent如何创建一个支持SSL的服务端。文章中介 阅读全文
posted @ 2020-02-02 12:34 冷豪 阅读 (108) 评论 (0) 编辑
摘要:本文的第一部分将介绍protobuf使用基础以及如何利用protobuf设计通信协议。第二部分会给出smss项目的协议设计规范和源码讲解。 一.Protobuf使用基础 什么是protobuf protobuf是谷歌研发的一种数据序列化和存储技术。主要可以用来解决网络通讯中异构系统的通讯和数据持久化 阅读全文
posted @ 2020-01-16 11:11 冷豪 阅读 (228) 评论 (0) 编辑
摘要:libevent是一套轻量级的网络库,基于事件驱动开发。能够实现多线程的多路复用和注册事件响应。本文将介绍libevent的基本功能以及如何利用libevent开发一个线程池。 一. 使用指南 监听服务和注册连接事件 libevent是一个基于事件驱动的网络库,通过在一个事件循环上注册不同的事件以完 阅读全文
posted @ 2020-01-11 15:13 冷豪 阅读 (244) 评论 (0) 编辑
摘要:项目介绍 SMSS是一个由我个人发起的开源项目,目的是建立一套轻量化,高可用,高安全和方便扩展的业务支撑框架。SMSS面向TCP/IP层开发,适合扩展上层业务接口。数据结构传输序列化通过Protobuf实现。传输过程中的数据经过OpenSSL加密再由接收端进行解密,文件传输也需要由发送方的秘钥首先做 阅读全文
posted @ 2020-01-04 14:56 冷豪 阅读 (147) 评论 (2) 编辑
摘要:2019年终于还是熬了过来,曾经一度想中途放弃的我依然在路上蹒跚前进。去年跳槽到的新公司,实实在在的感受到什么是孤独的奋斗者,如果用一个字来形容,那就是——烦。如果对于一个开发来说,应付各种花样繁多的产品需求是一种崩溃的话。我遇到的则是连产品需求都提不出来却依然要按照工作量来作为考核的困境,于是我必 阅读全文
posted @ 2019-12-31 22:36 冷豪 阅读 (14) 评论 (0) 编辑
摘要:当前与网络相关的业务主要是基于tcp/ip或http,熟悉j2ee的同学一定会对http场景下的开发比较了解。但是,精通tcp/ip以及如何构建一个直接基于tcp/ip层通讯的知识却不太多见。恰巧,最近一年来我参与了一些基于tcp/ip应用的开发工作。总算有所收获,今天在博客中做些分享,希望对有兴趣 阅读全文
posted @ 2019-11-03 12:19 冷豪 阅读 (316) 评论 (1) 编辑
摘要:作为一名产品开发,一套顺手的集成开发环境必不可少。大多数时候,开发经理将精力投入在产品需求分析上而忽视了研发质量甚至连基本的集成开发环境都没有统一。当然,如果你们的项目仅仅需要部署在单一的环境中或没有跨语言开发需求,通常这样做还不会造成严重问题。可是一旦你需要面对一套相对复杂的系统,异构系统间的通讯 阅读全文
posted @ 2019-10-20 13:22 冷豪 阅读 (204) 评论 (0) 编辑
摘要:在数据可视化领域利用webgl来创建三维场景或VR已经越来越普遍,各种开发框架也应运而生。今天我们就通过最基本的threejs来完成第一人称视角的场景巡检功能。如果你是一位threejs的初学者或正打算入门,我强烈推荐你仔细阅读本文并在我的代码基础之上继续深入学习。因为它将是你能够在网上找到的最好的 阅读全文
posted @ 2019-09-22 11:35 冷豪 阅读 (1199) 评论 (4) 编辑
摘要:对大多数程序员来说,递归算法都不算陌生。甚至很多时候,使用递归算法解决一些简单问题是基础教材的起步课程。但是,当递归算法遇到稍微复杂的数据结构,如二叉搜索树的时候。别说让你直接写出算法,就是把标准答案摆在你的面前让你理解,我们恐怕都会抓耳挠腮。如果你也有类似的困扰请不要灰心,因为包括我在内几乎我遇到 阅读全文
posted @ 2019-06-07 23:16 冷豪 阅读 (256) 评论 (1) 编辑
摘要:业务处理上,有时会直接对字节进行操作。例如实现私有协议,对校验位进行检测,敏感数据加密等。博主查了 一下网上的资料,发现有不少都是错误的。甚至连《Thinking in Java》的解释都很令人困惑,以下是从书中摘录的原文: 如果对char、byte或者short类型的数值惊醒移位处理,那么在移位之 阅读全文
posted @ 2019-05-01 16:53 冷豪 阅读 (190) 评论 (0) 编辑
摘要:自从996.icu在github上收获了18万点赞以来,超时工作,超负荷劳动似乎成了天下所有“无产阶级者”的共同点。对于这样的剥削制度,我想再多的批评和抨击都不为过。但是今天我想说3个小故事,只为引起一些“多余”的思考。 故事一: 张小跳是一家新成立的互联网企业的创始人,就在今天晚上刚从投资人那里拿 阅读全文
posted @ 2019-04-19 22:58 冷豪 阅读 (219) 评论 (1) 编辑
摘要:在C++中通过动态创建的对象,我们只能获得一个指针,并通过指针控制它。指针是存放对象的内存地址值,更准确的描述是对象的起始地址值。每一个指针都有一个相关的类型,不同数据类型的指针之间的区别不在指针的描述上,也不在指针所持有的地址上。而在于编译器如何解释特定内存地址上的内容。例如,在32位机器上,一个 阅读全文
posted @ 2019-03-01 15:35 冷豪 阅读 (196) 评论 (0) 编辑
摘要:先举一个例子解释一下生活中的适配器模式:公司老总要求工程部经理来汇报一下公司内部的消防设备使用和维护情况。接到通知后,工程部经理老宋找了专门负责消防设备统计的维护人员小王,请他调出了去年全年的维护记录。然后老宋前去向总经理汇报工作。 在这个例子中,总经理的任务是:找工程部经理(接口)了解一下消防设备 阅读全文
posted @ 2019-03-01 15:22 冷豪 阅读 (78) 评论 (0) 编辑
摘要:内容概要: 摄像头 => FFmpeg => Nginx服务器 => 浏览器 从摄像头拉取rtsp流 转码成rtmp流向推流服务器写入 利用html5播放 1.开发流程 1.1 通过FFmpeg视频采集和转码 在音视频处理领域,FFmpeg基本是一种通用的解决方案。虽然作为测试我们也可以借助OBS等 阅读全文
posted @ 2019-01-12 11:51 冷豪 阅读 (2780) 评论 (0) 编辑
摘要:不知不觉,时光荏苒。我们都从芳华走来,遇见过美丽的天空也路过了荆棘的小径,有时又会飘荡在广阔的海面,无边无际却也无所依归。回想起来,我的人生似乎总绵延着低沉的音符,虽偶有幸福闪过,却都显得那么短暂。或许有这样感觉的不仅仅是我一人吧,而唯一一直支撑着我的唯有对一些信念的坚持与追求。我不幻想变得优秀,更 阅读全文
posted @ 2018-12-30 14:07 冷豪 阅读 (82) 评论 (0) 编辑
摘要:Kafka是当下对海量数据提供了最佳支持的MQ中间件,无论是高并发的处理,还是依托zookeeper的水平拓展都有不俗的特性。由于公司最近也在尝试如何将它应用到开发中以对业务更好的支撑,因此特地分享一些安装和使用的心得。 一、安装与启动 服务器环境采用CentOS 7 x64位系统。实际使用中Kaf 阅读全文
posted @ 2018-12-22 17:29 冷豪 阅读 (1382) 评论 (0) 编辑
摘要:写在前面的话: 我之前写过两篇与shiro安全框架有关的博文,居然能够广受欢迎实在令人意外。说明大家在互联网时代大伙对于安全和登录都非常重视,无论是大型项目还是中小型业务,普遍都至少需要登录与认证的逻辑封装。相较于SpringSecurity而言,Shrio更轻量无过多依赖和便于独立部署的特点更收到 阅读全文
posted @ 2018-12-09 12:20 冷豪 阅读 (2635) 评论 (0) 编辑
摘要:前言:前后端分离,业务分离,网关路由等已经成为当下web application开发的流行趋势。前端以单页面路由为核心的框架为主体,可以单独部署在nodejs或nginx上。后端以springboot为代表的分布式微服务框架为主体,可以独立运行在任何端口上。相互通过符合restful规范的接口访问或 阅读全文
posted @ 2018-11-17 20:42 冷豪 阅读 (3033) 评论 (0) 编辑
摘要:上一章我大概说明了什么是图论以及无向图的基础概念,本章我们要研究一种更普遍的算法——连通性算法。它属于图论的分支,也是一种抽象算法。在深入算法之前,我们先提出一个具体的问题:假设在空间中存在N个点,我们可以通过线段连接任意两点,相互连接的点属于同一组连通分量,我们如何计算点p和点q之间是否连通。算法 阅读全文
posted @ 2018-11-04 19:19 冷豪 阅读 (127) 评论 (0) 编辑
摘要:在计算机应用中,我们把一系列相连接的节点组成的数据结构,叫做图。今天我们将要介绍它的一种形式——无向图,以及针对这种结构的深度优先搜索和路径查找算法。 一、无向图数据结构 接口: 实现类: 二、深度搜索优先算法 对于图的处理我们常常通过系统地检查每一个顶点和每一条边来获取图的各种性质。对于图的问题我 阅读全文
posted @ 2018-10-13 21:01 冷豪 阅读 (347) 评论 (0) 编辑
摘要:前言:06年7月的某日,不才创作了一篇题为《30分钟学会如何使用Shiro》的文章。不在意之间居然斩获了22万的阅读量,许多人因此加了我的联系方式咨询源码工程,只可惜当时并没有专门保留。2年后的今天在机缘巧合之下,我又重拾此话题。希望能带给小伙伴们在Springboot下如何使用Shiro,当然若各 阅读全文
posted @ 2018-10-06 13:06 冷豪 阅读 (30353) 评论 (30) 编辑
摘要:前言:Springboot怎么使用想必也无需我多言,Mybitas作为实用性极强的ORM框架也深受广大开发人员喜爱,有关如何整合它们的文章在网络上随处可见。但是今天我会从实战的角度出发,谈谈我对二者结合与使用的最佳实践。 一、依赖与pom 目前SpringBoot官方的最新版本是2.0.4.RELE 阅读全文
posted @ 2018-10-02 13:09 冷豪 阅读 (4026) 评论 (3) 编辑
摘要:算法描述:散列表是一种在时间和空间上做出权衡的查找算法。使用查找算法分为两步。第一步是通过散列函数将被查找的键转化未数组的一个索引。理想情况下,不同的键都能转为不同的索引值。当然,这只是理想情况,所以我们需要面对两个或多个键都被散列到相同索引值的情况。因此,散列查找的第二部就是处理碰撞冲突的过程。 阅读全文
posted @ 2018-09-23 19:24 冷豪 阅读 (68) 评论 (0) 编辑
摘要:算法描述:二叉查找树时一种能够将链表插入的灵活性和有序数组查找的高效性结合起来的符号表(SymbolTable)实现。具体来说,就是使用每个节点含有两个链接的二叉树来高效地实现符号表。一颗二叉查找树时一颗二叉树,其中每个节点都含有一个Comparable的键且每个节点的键都大于其左子树中的任意节点的 阅读全文
posted @ 2018-09-23 18:33 冷豪 阅读 (70) 评论 (0) 编辑
摘要:从标准二叉树的极端情况我们推导出2-3树这样的数据结构具备自平衡的特性,但是要实现这个特性在算法上相当复杂。考虑在大部分情况下,对于检索的指数级时间消费O(lgN)要求并不严格。因此,我们会看到如何将一颗标准的2-3树转变成红黑树的过程。 一、局部变换 考虑如果在2-节点上挂新的键并不会破坏2-3树 阅读全文
posted @ 2018-09-09 15:39 冷豪 阅读 (81) 评论 (0) 编辑
摘要:序言:红黑树是数据结构与算法中最重要的知识点之一,也是最难掌握的。网上有关它的讨论很多,我曾经试图阅读那些“一篇文章让你熟悉红黑树”之类,可能是智力的缘故,效果平平。最终,我发现要想理解红黑树的特性和相关算法其实并无捷径可走。所以,我打算通过多篇博客来解释这个众所周知却又少有人精通的数据结构——Re 阅读全文
posted @ 2018-09-09 13:31 冷豪 阅读 (73) 评论 (0) 编辑
摘要:算法描述:许多应用程序都需要按照顺序处理任务,但是不一定要求他们全部有序,或是不一定要一次就将他们排序。很多情况下我们只需要处理当前最紧急或拥有最高优先级的任务就可以了。面对这样的需求,优先队列算法是一个不错的选择。 算法图示: 算法解释:上图所展示的是最大优先队列(大顶堆)的算法逻辑,在这个标准的 阅读全文
posted @ 2018-08-25 22:15 冷豪 阅读 (282) 评论 (0) 编辑
摘要:算法描述:快速排序是一种分治的排序算法。它将数组分为两个子数组,并将两部分独立的排列。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了。 算法图示: 算法解释:选择标的元素(5) 阅读全文
posted @ 2018-08-18 13:26 冷豪 阅读 (86) 评论 (0) 编辑
摘要:算法描述:将两个较小的有序数组合并成为一个较大的有序数组是比较容易的事情。我们只需要按照相同的顺序依次比较最左侧的元素,然后交替的放进新数组即可。这就是自顶向下的归并排序的实现思路。与之前的算法不同的是,归并排序需要使用额外的存储空间,用空间换时间的做法也是在排序算法中经常需要做的选择。 算法图示: 阅读全文
posted @ 2018-08-18 11:35 冷豪 阅读 (1912) 评论 (0) 编辑
摘要:算法描述:希尔排序是一种基于插入排序的快速排序算法,相比于传统的相邻插入,希尔排序更加适合大规模乱序数组的排序。和插入算法一样,我们也可以优化插入和移动的过程从而进一步提升算法效率。 算法图示: 希尔排序算法的实质是首先将一个大的乱序数组变成几个小的有序数组,再逐步调整数组长度。最后一步依然是做一次 阅读全文
posted @ 2018-08-18 11:10 冷豪 阅读 (176) 评论 (0) 编辑
摘要:算法描述:通常人们在整理扑克的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。在算法的实现中,为了给要插入的元素腾出1个空间,我们需要将其余所有元素在插入之前都向右移动1位。这种算法叫插入算法。 算法图示: 算法解释:在基础版本中通常的做法是,当新元素需要被插入有序数组的时候,从右 阅读全文
posted @ 2018-08-12 00:08 冷豪 阅读 (81) 评论 (0) 编辑
摘要:算法描述:一种最简单的排序算法是这样的:首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置。再次,再剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,知道将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。 算法图示: Java代码示例 阅读全文
posted @ 2018-08-11 23:25 冷豪 阅读 (88) 评论 (0) 编辑
摘要:适用场景:当需要在大量有序数据中查找的时候,推荐使用二分查找法(BinarySearch)。 下图演示的是在有序数组[10,11,12,16,18,23,29,33,48,54,57,68,77,84,98]中命中23和未命中50的情况: Java代码示例: Qt/C++代码示例: 相关附件: wh 阅读全文
posted @ 2018-08-10 22:31 冷豪 阅读 (157) 评论 (0) 编辑
摘要:最近一直在忙项目,不知不觉2个多月没有更新博客了。正好自学了几天docker就干脆总结一下,也顺带增加一篇《30分钟入门系列》。网上能够查到的对于docker的定义我就不再重复了,说说我自己对它的理解:Docker一个方便多次部署的虚拟化Linux容器,与当下流行的SpringBoot和微服务框架搭 阅读全文
posted @ 2018-08-04 23:55 冷豪 阅读 (1122) 评论 (2) 编辑
摘要:上一章我用一个demo函数演示了基于Qt的音视频采集到编码的完整流程,最后经过测试我们也发现了代码中存在的问题。本章我们就先处理几个遗留问题,再对代码进行完善,最后把编码功能做基础封装。 一、遗留问题和解决方法 (1)如何让音视频的录制保持同步? 在我们的演示代码中之所以发现音视频录制不同步的主要原 阅读全文
posted @ 2018-05-20 01:31 冷豪 阅读 (1097) 评论 (1) 编辑
摘要:前两讲演示了基本的解码流程和简单功能封装,今天我们开始学习编码。编码就是封装音视频流的过程,在整个编码教程中,我会首先在一个函数中演示完成的编码流程,再解释其中存在的问题。下一讲我们会将编码功能进行封装并解释针对不同的输出环境代码上需要注意的地方。最后我们还会把之前做好的解码器添加进开发环境,实现P 阅读全文
posted @ 2018-05-06 00:26 冷豪 阅读 (2770) 评论 (3) 编辑
摘要:与解码相关的主要代码在上一篇博客中已经做了介绍,本篇我们会先讨论一下如何控制解码速度再提供一个我个人的封装思路。最后回归到界面设计环节重点看一下如何保证播放器界面在缩放和拖动的过程中保证视频画面的宽高比例。 一、解码速度 播放器播放媒体文件的时候播放进度需要我们自己控制。基本的控制方法有两种: 媒体 阅读全文
posted @ 2018-04-29 13:34 冷豪 阅读 (1587) 评论 (2) 编辑
摘要:前言:对于从未接触过音视频编解码的同学来说,使用FFmpeg的学习曲线恐怕略显陡峭。本人由于工作需要,正好需要在项目中使用。因此特地将开发过程总结下来。只当提供给有兴趣的同学参考和学习。 由于FFmpeg是使用C语言开发,所有和函数调用都是面向过程的。以我目前的学习经验来说,通常我会把一个功能的代码 阅读全文
posted @ 2018-04-29 00:59 冷豪 阅读 (4368) 评论 (1) 编辑