- 博客(35)
- 资源 (6)
- 收藏
- 关注
原创 重构技战术(一)——通用型重构技巧
书接上回,一文中我们讨论了重构的含义、意义以及时机,并说明了测试的重要性。从本文开始将介绍重构具体的技巧,首先登场的是一些通用型技巧。
2023-09-17 15:21:27 418
原创 重构从现在开始
重构,是一名程序员必备的职业技能。然而,大多数人对于重构的认知仍然停留在项目中期为了提升代码质量而做的并非不可不做的操作。对于重构的重要性和含义并没有充分的认知。本文,笔者将结合自身经验和阅读《重构,改善既有代码的设计》一书(下面简称《重构》)的心得,以系列文章的方式讲述重构的内功心法以及武功招式。
2023-09-16 15:20:46 439
原创 Vue+SpringBoot实现评论功能
评论系统相信大家并不陌生,在社交网络相关的软件中是一种常见的功能。然而对于初学者来说,实现一个完整的评论系统并不容易。本文笔者以 Vue+SpringBoot 前后端分离的架构细说博客评论功能的实现思路。
2022-11-07 14:53:30 11451 21
原创 【Flink源码】JobGraph构建过程
这里不能用 StreamNode.id 来代替,因为这是一个从 1 开始的静态计数变量,同样的 Job 可能会得到不一样的 id,如下示例的两个 job 是完全一样的,但是 source 的 id 却不一样了。书接上回,execute 方法中通过 getJobGraph 将 Pipeline 转换为 JobGraph,下面来看一下 getJobGraph 源码。为所有节点生成一个唯一的 hash id,如果节点在多次提交中没有改变(包括并发度、上下游等),那么这个 id 就不会改变,这主要用于故障恢复。
2022-11-07 11:24:32 339
原创 【Flink源码】JobManager源码之启动WebMonitorEndpoint
在【Flink源码】JobManager 启动流程 一文中,笔者分析了 JobManager 的启动流程,并讲到 JobManager 启动了 ResourceManager、Dispatcher 和 WebMonitorEndpoint 三大核心组件。本文将就其中 WebMonitorEndpoint 启动过程的源码进行探究首先,我们先要讲述一下 WebMonitorEndpoint 的主要功能:WebMonitorEndpoint 里面维护了很多 Handler,如果客户端通过 flink run
2022-11-06 22:44:40 426
原创 【Flink源码】JobManager启动流程
在一文中,笔者后来发现谬误颇多,且随着 Flink 版本的更迭,部分方法实现方式已发生较大改变。因此,思虑再三决定针对 JobManager 相关源码根据最新的 Flink 版本(1.17)单独成文。
2022-11-06 22:43:54 1121
原创 【Flink源码】Flink心跳机制
在一文中,我们在讲述 TaskExecutor 启动流程时,在 TaskExecutor 构造方法中讲到 TaskExecutor 维护了与 ResourceManager 和 JobMaster 的心跳服务同样在 ResourceManager 启动时也维护了与 JobMaster 和 TaskManager 的心跳接下来我们针对 ResourceManager 与 TaskManager 的心跳交互流程来深入探究 flink 的心跳机制。
2022-11-06 22:43:08 827
原创 【Flink源码】StreamGraph构建过程
前面我们说到 StreamGraph 最终由 StreamGraphGenerator 类生成其构造函数只是实例化了一些属性,之后调用了一些 setter 方法,设置了如状态后端、保存点路径等的配置,真正生成 StreamGraph 的是之后的 generate 方法(getStreamGraphGenerator(transformations).generate())
2022-11-06 22:42:17 507
原创 【Flink源码】再谈Flink程序提交流程(下)
书接上回,在一文的结尾我们完成了 JobManager 申请 slot 的探究按照 Flink 程序提交流程,接下来 TaskManager 即将启动我们来继续往下看。
2022-11-06 22:41:30 658
原创 【Flink源码】再谈Flink程序提交流程(中)
书接上回,一文中我们已经将程序从客户端提交给了 ResourceManager接下来我们就去 ResourceManager 中一探究竟。
2022-11-06 22:40:39 773
原创 【Flink源码】再谈Flink程序提交流程(上)
前面在一文中,我们着重探讨了 StreamExecutionEnvironment 的 execute 方法是如何提交一个任务的,当时为了省事,我们是以本地运行环境为例但是在实际的运行环境中,Flink 往往是架设在 Yarn 架构下以 per-job 模式运行的因此,为了还原真实场景下 Flink 程序的提交流程,我们有必要探讨 yarn-per-job 提交流程首先,让我们回顾一下 Flink 任务提交流程。
2022-11-06 22:38:33 1188
原创 【Flink源码】Flink程序启动的那些事儿
我想您一定曾经很好奇几个问题那就是 Flink 程序启动的时候究竟发生了什么?我们将用户程序提交上去之后它又是如何调用它的?本文就是为了解决您的这些疑惑在 Yarn 下 per-job 模式提交流程如下图。
2022-11-06 22:37:20 673
原创 【Flink源码】从StreamExecutionEnvironment.execute看Flink提交过程
相信大家对这一行代码都不陌生,其作用是执行 Flink 程序,相当于是一个总开关。很难想象,那么复杂的 Flink 架构,那么复杂的 Flink 程序仅仅需要这简单的一个函数就能启动,其背后究竟是怎样的过程?
2022-11-06 22:36:35 1378 1
原创 【Flink源码】从StreamExecutionEnvironment说起
本系列是针对 Flink 源码进行的一系列探究过程,旨在通过 Flink 源码全面地、详细地了解 Flink 原理根据 getExecutionEnvironment 可以自动获取可执行环境,那么具体过程究竟是怎样的呢?接下来我们从 StreamExecutionEnvironment 说起。
2022-11-06 22:35:27 928
原创 Java实现图的遍历
最近又在手撕数据结构的代码,温习一遍得到了一些新的感悟。在这里全面地总结一下关于图的遍历算法逻辑,并手写Java代码实现,力图将全部实现逻辑呈现在读者面前。本文主要讲解的图的遍历算法为深度优先遍历与广度优先遍历。一、图的实现图的实现主要有两种方式,一种是邻接矩阵,一种是邻接表。所谓邻接矩阵就是构建一个节点到节点的矩阵,每一行每一列都代表一个节点,矩阵的输入数据即为该位置所在的行和列对应的节点之间是否可达。一般而言,若该数值为表示不可达,为一个正数表示该条边的权值。矩阵对角线上的数值一般为0,表示
2021-01-22 19:20:42 2314
原创 张量(五):张量学习——BGCP
接下来的文章将主要介绍张量在交通领域的实际应用,包括预测、补全等问题。与其他模型相结合,针对具体问题,构建的一系列模型,我这里统称为“张量学习模型”。本文主要介绍Bayesian Gaussian CANDECOMP/PARAFAC tensor decomposition model(BGCP)。1 背景随着智能交通系统的发展和应用,大量城市交通数据通过各种来源如环路检测器、摄像机等被捕获,这些数据可用于交通运营和管理应用,包括路由、信号控制、出行时间预测等。通常,我们可以将时空交通数据组织成一个
2020-11-02 15:38:05 3806
原创 张量(四):张量补全(tensor completion)
现实情况下,往往由于采集数据工具(如采集交通数据的传感器)的故障以及其他异常情况导致数据中往往存在部分缺失值,对这些缺失值的修补称之为“补全”,张量领域的缺失值修复即张量补全。张量补全是根据已有数据对缺失值的影响和低秩假设实现缺失值补全,主要分为两类方法:一种是基于张量补全中给定的秩和更新因子 一种是直接最小化张量秩并更新低秩张量...
2020-10-08 16:29:49 11996 11
原创 张量(三):张量鲁棒主成分分析(TRPCA)
基于张量分解,张量鲁棒主成分分析法(TRPCA)是对鲁棒主成分分析(RPCA)的高阶扩展,在数据去噪等领域拥有广泛应用。本篇将对TRPCA以及其最新的改进模型做出介绍。一、RPCA在实际应用中,很多数据矩阵往往是低秩或近似低秩的。理想状态下,数据矩阵的行与行之间应当具有极强的相似性,整个矩阵应当是低秩的。但由于数据噪声的存在,破坏了这种低秩性。因此,为了恢复矩阵的低秩结构,可将矩阵D分解为两个矩阵之和,即低秩矩阵A和稀疏矩阵E,D=A+E。低秩矩阵为分离了噪声的真实矩阵,稀疏矩阵为分离出的噪声矩阵。
2020-10-07 22:12:20 8028 6
原创 张量(二):张量分解(tensor decomposition)
与矩阵分解一样,我们希望通过张量分解去提取原数据中所隐藏的信息或主要成分。当前主流的张量分解方法有CP分解,Tucker分解,t-SVD分解等,更新的方法大多是在他们的基础上做进一步的改进或引用。因此,张量分解也是张量算法的基础。下面分别做介绍。一、CP分解CP分解是将任意高阶张量分解成多个秩为1的“因子张量”之和。如下图,每个因子张量的单个维度上秩都为1。若一个三维张量的数据为,则其CP分解表达式为,其中R为张量秩的大小,向量之间的乘积是外积的形式。虽然CP分解的表达式很简洁,但对其秩的求解却是一
2020-10-06 16:23:31 18329 3
原创 张量(一):张量基础
从今天开始,笔者将会持续更新关于张量的相关知识和最新研究成果。我们这里所说的张量知识主要是关于张量低秩分解,张量补全等算法和应用。在如今神经网络大火的年代,张量补全等算法无疑为预测、去噪等问题提供了新的解决方法和思路。接下来,且听我娓娓道来。友情提醒:默认读者拥有线性代数的基础。一、何为张量?在本科阶段,我们接触到最多的数据结构就是矩阵与向量。一维的向量与二维的矩阵分别能表示数据的一种与两种信息。然而,现实世界里大多数数据都具有多重属性,例如一个人就有姓名、年龄、性别、民族等多种信息,因此单纯的
2020-10-05 22:22:52 7974 1
原创 日暮下的东汉-外戚、宦官与党锢
公元25年,光武帝刘秀建立东汉,又经过十余年的四方征战终于统一天下。后继之君明帝,章帝与民生息,发展生产,铸就“明章之治”。就在大汉臣民都沉浸于国泰民安的喜悦中时,殊不知朝堂上已是暗流涌动,东汉渐渐步入日暮的阴影中。 东汉历经一百九十五年,传十四帝,但自章帝之后便存在外戚、宦官、清流士大夫三股势力互相交错,争权夺利,爆发多次外戚专权,宦官乱政以及党锢之祸。同时,在此基础上加之察举制的施行,东汉一朝诞生诸多世家大族,魏晋南北朝时期九品中正制的推行进一步加强了世家大族对中央权力的掌...
2020-07-24 11:45:34 942
原创 从《Urban Anomaly Analytics: Description,Detection,and Prediction》说起
《Urban Anomaly Analytics: Description,Detection,and Prediction》是Mingyang Zhang,Yu Zheng等人于2020年4月发表的一篇综述性文章,该文概述了最新的城市异常检测技术的研究进展,涵盖所需的数据来源、数据表现形式、预测算法、异常检测算法等,对于从事交通领域研究的初学者颇具启发性意义。1 概述城市交通异常事件如交通拥堵、人群意外聚集等如果不处理好,可能会对公共安全与稳定造成巨大威胁。若我们能提前预测或检测到此类...
2020-05-17 20:30:02 1749
原创 Oracle11g导入DMP文件并导出为CSV文件过程全纪录
最近课题组在和某航务管理局合作完成一个模拟仿真项目,对方发来某地一年的AIS数据,以DMP格式呈现,大小足有100多G。对于这批数据的处理首先需将其还原至数据库中,并以CSV文件格式导出,此项任务最终分配给了笔者。在笔者着手完成的过程中,几天几夜,着实踩过不少坑。因此在此记录全过程以方便后来者。 众所周知,DMP文件(.dmp)通常来源于Oracle数据库,属于一种备份文件存储格式。询问合作方了解到这批数据产自Oracle 11g,对此笔者也是第一次接触。故而只得是走一步踩一步的坑...
2020-05-14 11:31:08 2915 3
原创 那些年我们追过的Scrapy
熟悉Python的人肯定知道,相比于其他编程语言,Python编写爬虫高效简洁,有着得天独厚的优势。对于简单的爬虫小程序只需要使用Python的urllib和Requests两个库下载页面,BeautifulSoup解析页面即可。但对于一些较为复杂的问题,大型爬虫,尤其是多线程,分布式的爬虫问题,以上三个库显得心有余而力不足。于是,我们不得不去探索更高级的爬虫框架:Scrapy。在这里,...
2019-08-06 14:37:23 135
原创 Dijkstra算法的原理与实现
主流的最短路径算法主要有Dijkstra和Floyd算法。相比于Floyd算法,笔者认为Dijkstra算法在理解上更具难度性。因此查阅并参考了诸多博客,书籍资料,浅谈对Dijkstra算法的理解。1. Dijkstra算法核心思想 Dijkstra算法是基于贪心算法思想的。所谓贪心算法即始终保持当前迭代解为当前最优解。意思就是在已知的条件下或是当前拥有的全部条...
2019-01-18 19:08:38 5329 2
原创 汇编语言那些事儿
相信有很多计算机爱好者或是计算机及相关专业的学生,计算机相关职业的工作者都曾一度对于计算机底层实现原理十分着迷,从而一度去学习《计算机组成原理》《编译原理》《汇编语言》等课程。在这些课程中,《汇编语言》是基础,也是初学者了解计算机如何执行程序命令的首选课程。但对于像我一样的小白来说,初学汇编语言一定会产生很多这样那样的疑惑。如果选择的学习教材不当,老师的授课方式不当,那么这门课程的思维便无法贯通,
2017-07-22 11:35:35 684
原创 Lucene学习笔记(4)
截止到现在,我们已经介绍完了全部的Lucene搜索过程,但似乎还遗忘了什么。没错,正是前面反复提到的分词以及它的StandardAnalyzer类。6. Lucene分析器6.1 分词所谓分词,就是将一段文本拆分成多个词。前面我们已经说过,在建立索引时,写入索引并能够被用户检索的是一个个的词条。词条就是通过分析器进行分词和相关处理后的文本单元。只有通过分词才可能让信息检索系统理解用户的
2017-07-21 23:03:32 297
原创 Lucene学习笔记(3)
很多读者认为搜索完成后只要输出,整个过程就应该结束了。事实确实如此。不过输出的过程存在着以下几个问题1. 以何种顺序输出?2. 搜索结果是否全部输出?3. 以什么形式输出?下面,我们来一一解决。4. 排序4.1 自然排序关于自然排序前面已经提到,是根据相关度进行排序。所谓相关度,就是前文提到过的文档得分。注意:文档的得分在每次执行查找时都是不一样的,需要根据
2017-07-20 18:18:35 295
原创 Lucene学习笔记(1)
搜索引擎是信息检索的工具,一个好的搜索引擎将为用户带来极大的便利。在目下大多数的网站、软件、app中都能看到搜索引擎的存在。有了搜索引擎,用户可以在网站等中快速获取信息。此外,搜索引擎常与网络爬虫配合使用。在Java中,最常使用的搜索引擎框架莫过于Lucene。下面,笔者将根据自己的亲身学习经历,谈谈学习Lucene的心得体会。开始之前,必须要先介绍几个概念。1. 基本概念1.
2017-07-18 15:15:29 545
原创 浅谈Maven
笔者大约是半年前第一次接触到Maven的概念,那时我刚刚学完SSH框架,不过对于框架的搭建都是依托于MyEclipse内置的框架或从外部导入jar包。当我听说Maven这个东西的时候,当真是一脸懵逼。什么是Maven?用来做什么?成了困扰笔者最大的两个问题。要知道,此前无论是编译运行或是依赖jar包的导入,在MyEclipse中都可以很方便的完成,因此一时间很难理解Maven的作用。
2017-06-28 22:56:12 291
原创 实现简易Java网络爬虫
网络爬虫,即网络机器人或网页spider。通常用来爬取网页数据与信息。随着蜘蛛自主爬行得越来越远,其挖掘的数据也便越来越多。
2017-06-27 21:29:07 376
原创 关于如何实现在整合struts2和hibernate4框架下对many-to-one级联数据的存储
在大多数的SSH框架教程上关于级联数据的存储往往是在Java Application下实现的。诸如User和Skill为many-to-one级联关系,User为many,Skill为one。代码如下:public static void main(String args[]){ User user = new User("张三","20",1); Skill skill = new
2017-05-12 21:59:39 391
原创 关于如何实现在整合struts2和hibernate4框架下实现many-to-one级联数据表在JSP页面中的输出
如何实现hibernate级联数据表的输出一直以来困扰了很多SSH框架初学者。笔者在这里结合自己的切身经历,提出hibernate和struts2配合使用的方法。
2017-05-12 09:50:57 612 1
模拟算卦——python实现
2019-10-24
美女图片网爬虫(python版)
2019-08-06
图书推荐系统-书趣
2019-01-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人