自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

技术玄关

专注技术积累

  • 博客(63)
  • 资源 (3)
  • 收藏
  • 关注

原创 一键导出PDF文档中的高亮文字以及笔记(Python实现)

需求最近在阅读一些PDF格式的资料,经常会进行划线并做笔记,我希望这些内容在阅读结束之后能够方便地整理出来并回顾,于是探索了一下到处划线文字和笔记的方法。首先,我去确认PDF阅读器是否提供了需要的功能。以Foxit Reader为例,它的确提供了评论导出的功能,但是有局限性:只能导出高亮的文字到文本文件笔记内容只能导出到.fdf格式,这就需要后续处理而我希望的功能是将高亮文字以及其对应的笔记导出到文本文件,或者上传到某个App的云端。因此,我决定自己去实现,并在网上找了一些已有的Python模

2021-01-12 10:20:23 4585 2

原创 Groovy有何不同 —— 闭包篇

闭包与很多动态类型语言类似,Groovy也有对闭包的支持。这既能让程序更加灵活,也不像Java中匿名函数那么复杂。除了语法上的优雅,闭包还为函数将部分实现逻辑委托出去提供了一种简单、方便的方式。闭包可以作为函数的参数和返回值,这使得Groovy中也支持高阶函数。常用场景闭包能够扩充、优化或增强另一段代码,你可以理解为闭包在给函数打补丁。闭包有两个非常擅长的具体领域:一个是辅助资源清理,另一个是辅助创建内部的领域特定语言(DSL)。比如:def static consume(closure) {

2020-11-27 20:55:40 452

原创 Groovy有何不同 —— 类型篇

引言Groovy是一门运行在Java虚拟机上的语言,语言特性与Java很类似,又有所区别,既可以利用JDK中丰富的API,由有自己独特之处。我们熟悉的应用场景之一就是在CI工具Jenkins中编写集成脚本。这篇文章就从类型的角度来分享一下Groovy与Java的一些不同之处,供您参考。动态类型Groovy是动态强类型语言。静态类型语言的一个特点是编译时的类型检查,比如Java和C++语言。动态类型则可以把类型检查推迟到运行时。所谓类型的强弱,是指在运行时是否能及时发现类型错误。比如C++,如果把一

2020-11-25 20:22:52 969

原创 Linux命名空间与容器技术浅谈

前言本文来谈谈Linux命名空间的机制,以及基于该机制的容器技术是如何实现的。容器技术Linux命名空间

2020-10-23 10:23:05 914

原创 Jenkins Pipeline 手记(8)—— 踩坑 Docker + MSBuild + SonarScanner

问题最近工作中有这样的需求,需要针对MSBuild的项目,在pipeline中使用SonarQube进行静态代码分析。这就需要用到 SonarScanner For MSBuild 这个版本的扫描工具。如果直接在Jenkins的虚拟机节点上运行Build和Sonar Scan,没有问题。不过我们的Build是在Docker container中运行的,pipeline会启动一个windows container,其中包含了MSBuild和msbuld-sonarscanner等工具。在Sonar阶段就会遇

2020-09-29 19:35:37 997

原创 Jenkins Pipeline 手记(7)—— 发现 SonarQube Plugin 的 Bug

今天跟大家分享一个Bug的发现之路,由于这个应用场景比较特殊,其中的分析过程我觉值得记录下来。背景我们知道,SonarQube 是常用的静态代码扫描工具,可以帮助我们发现各种编程语言编写的项目中的代码问题。针对MSBUILD的项目,SonarQube还提供了专门的扫描工具sonarscanner-msbuild。想要在Jenkins Pipeline中使用这个工具,我们当然可以直接在命令行中调用,并传入需要的参数。但由于参数中有一些常用变量比如server的地址、项目名称等,写死在命令行中不是好办法,

2020-09-14 16:45:47 507

原创 Python序列:+和*的微妙之处

本文分享一下在Python序列上使用加号和乘号的特性,以及背后的一些有趣实现,供您参考。

2020-09-11 15:26:25 308

原创 Jenkins Pipeline 手记(6)—— 使用 Azure VM 作为动态节点

在Jenkins Pipeline实践中,有时需要分配并连接动态的build agent完成CI任务。相比于静态的VM节点,这样做的好处是可以优化资源的使用,动态地分配和释放所需要的物理资源,既不让资源闲置,也不会导致某些节点负载过重。Jenkins支持通过Cloud的方式配置动态节点,比如Kubernetes和Azure VM。本文就来分享一下如何配置并使用Azure VM来构建CI任务。准备工作首先,你要有一个Azure Subscription和Service Principal。使用Azure

2020-09-07 15:32:21 478

原创 Python 序列之切片(slice)

本文为Python列表切片功能的学习笔记,供您参考。基本用法Python中支持切片操作的序列类型有列表(list)、元组(tuple)以及字符串(str)。以列表为例,s[a:b]表示对于列表s,返回从下标a的元素到下标b的前一个元素的子列表。注意这里的包含关系是[a,b)。跟有的语言不同(比如JavaScript),python中切片的两个参数都是下标,而非一个是下标,另一个是长度。如果省略了某个参数,则表示从“第一个元素开始”或者“到最后一个元素”。例如:l = [10, 20, 30, 40

2020-09-04 15:14:20 1480

原创 Python Web API 入门 —— Flask实现

今天分享一下用Flask框架实现一套建议的Python API Service,参考资料https://www.fullstackpython.com/flask.htmlhttps://flask.palletsprojects.com/en/1.1.x/https://programminghistorian.org/en/lessons/creating-apis-with-python-and-flask...

2020-08-28 17:16:34 784

原创 Jenkins Pipeline 手记(5)—— Docker In Docker 那些事儿

引言在定义Jenkins CI Pipeline时,我们难免会用到Docker。将复杂Build/Test/Deploy的过程放到容器中,既可以重用环境设置和工具集,也能高效地使用资源。不过我们可能遇到如下场景:在build过程中需要使用Docker命令来启动新的容器或者build新的imageJenkins的master或者slave本身就是在容器中运行的无论哪种情况,本质都是在Docker容器内部运行Docker命令,即所谓的**Docker-In-Docker(DIND)**场景。本文简单

2020-08-14 17:39:30 880

原创 负载均衡概览

引言本文简要介绍负载均衡的一些基本概念、原理和工具,供大家参考。若有实际需求,可进一步查找资料详细了解。本文参考资料:书籍:《阿里云运维架构实践秘籍》乔锐杰著博文:https://www.cnblogs.com/Javi/p/6483214.html官网:LVS: http://www.linuxvirtualserver.org/Documents.html官网:Nginx: https://www.nginx.com/论文:http://www.linuxvirtualserver.org

2020-08-03 16:28:45 241

原创 Jenkins Pipeline 手记(4)—— 远程Powershell权限困局

背景在Jenkins Pipeline里面,我们经常会使用powershell脚本执行一些必要操作,比如Build项目、部署Service、配置网络等等。有时候我们还需要进行远程的操作,比如当目标机器是另一台虚拟机,或者是一个K8S的节点。本文探讨一个在远程执行powershell命令时遇到的小问题。问题重现我的项目里有一个需求是,将build出来的service部署到远端的server上。部署的过程其实就是文件拷贝的过程,在部署前需要调用Get-Service 判断service是否存在,以及用St

2020-07-28 14:59:03 807

原创 Jenkins Pipeline 手记(3)—— 自定义Checkout的陷阱

引言最近在pipeline中checkout代码时遇到了无法序列化的问题。这个问题只在特定的场景下能重现,虽然影响不大,但如果深入研究一下,可以加深对Jenkins Pipeline的理解。问题我们知道,在使用Multi-branch pipeline时,可以在job的配置中指定源代码的来源,如git url,credentials,clone options,submodule options等等。然后在pipeline中,可以直接调用:checkout scm下载代码。这个scm对象对象由J

2020-07-27 18:11:48 12488 1

原创 Jenkins Pipeline 手记(2)—— 调试小技巧

引言最近的工作中使用Jenkins进行CI的开发和维护,经常需要调试写好的Jenkinsfile。然而,每次小的改动都需要提交代码,然后push到远端,Jenkins master读取新版本的Jenkinsfile,查看效果。这样做一来比较麻烦,尤其是频繁改动或者加一些测试代码的时候。另外,有一些feature branch是大家共同开发维护的,经常提交改动会触发不必要的job build,浪...

2020-05-01 14:42:42 2202

原创 软件开发中的上游思维

最近学习了万维钢老师解读的新书《上游:在问题发生之前解决问题》,收获不少。联想和类比自己从事的行业,谈谈一些浅显的体会,也能借鉴书中的思想。首先,上游思维有三个条件。眼光在别人发不现问题时,你能看出问题。这里的重点是问题不易被察觉,因而目前不是紧急的事情。如果问题大家都能看出来,可能很快就被解决,也就失去上游的意义。如果问题亟需解决,不然就会遭受巨大损失,那么也没有上游的意义。你发现软...

2020-04-18 08:07:55 1312

原创 Jenkins Pipeline 手记(1)—— 什么是CPS编程

引言最近在工作中使用Jenkins进行持续集成任务,遇到这样一个问题:java.io.NotSerializableException: java.util.regex.Matcher经过调查发现这是Jenkins的CPS插件报出的,原因是在使用正则表达式相关操作的函数时,代码写法不规范,导致不能序列化。那么什么是CPS呢, Jenkins为什么又需要做序列化的操作呢?什么是CPS在函...

2020-04-10 09:00:37 2283

原创 《持续交付》(六)总结

引言本文是《持续交付》一书学习总结的最后一篇。主要内容是结合实际中的一些工具和实践,对持续交付这个话题做个总结。总结:工具和实践持续交付的核心是构建一个部署流水线,这个流水线起始于源代码,终止于用户界面,并长期地、反复地、持续地运行。我们采用持续交付的目的是,更加频繁地发布软件中最新的改动,增加产品迭代的次数,在适应快节奏需求的同时,保证产品的质量。对于源代码管理,我在项目中经常使用Gi...

2020-04-10 08:42:35 343

原创 《持续交付》(五)数据管理与版本控制实践

引言本文是《持续交付》一书学习总结的第五篇。主要内容涉及数据管理以及Git分支管理的实践。数据管理软件代码的部署可以简单地用新的版本替换旧的版本,但是数据可不是如此。自从产品上线后,数据就一直在增长,每个版本发布时,数据可能都是全新的。然而,有时我们的确有这样的需求,去改数据的结构或者内容。这就要求我们在做出修改的同时,保证产品运行和部署的可靠性。首先,数据库的部署也需要脚本化。与代码部...

2020-04-10 08:39:29 367

原创 《持续交付》(四)部署发布与基础架构管理

引言本文是《持续交付》一书学习总结的第四篇。主要内容涉及部署发布和基础架构管理的实践。部署和发布(一)这次我们来看看软件持续交付的最后一个步骤:部署和发布。在项目开始的时候,我们就要想好软件最终发布时要面临的问题,以此制定发布计划和策略。要考虑的问题包括但不限于:确定部署需要的技术。比如基于Azure平台的应用,部署时就需要微软的Powershell脚本来实现自动化。如何实现部署流...

2020-04-09 10:42:00 574

原创 《持续交付》(三)部署流水线与构建脚本

引言本文是《持续交付》一书学习总结的第三篇。主要内容涉及部署流线和部署脚本的设计实践。部署流水线(一)要实现持续交付,一般会定义一条部署流水线(deployment pipeline)。我们之前讨论过的持续集成过程,就是这个流水线的一部分。总的来说,部署流水线就是一套将代码从版本控制工具最终交付到用户手中的自动化流程。我们在前面看到了自动化的持续集成,以及验收测试。除此之外,部署...

2020-04-09 10:40:49 1405

原创 《持续交付》(二)持续集成与测试

引言本文是《持续交付》一书学习总结的第二篇。主要内容涉及持续集成以及持续交付中的测试实践。持续集成(一)关于持续集成(CI),我想程序员朋友都很熟悉了,现在很少有项目不采用持续集成了。我们来看一下其中的原则和实践。持续集成要达到的目的是,每当有开发者提交了改动,整个应用程序需要重新构建,并运行足够广泛的测试来保证质量,以使得应用程序始终处于能够正常工作的状态。一个典型的CI过程如图所示。...

2020-04-09 10:39:10 848

原创 《持续交付》(一)概念与配置管理

引言最近一段时间阅读了《持续交付》这本书,打算用几篇文章的篇幅总结一下阅读的收获。此为第一篇。我看的是英文原版的,书名是 Continuous Delivery,作者是 Jez Humble,由人民邮电出版社出版。概念:持续交付软件交付,就是软件从源代码形态到最终形成可交付的软件产品,并发布给用户的过程。那持续交付(Continuous Delivery)是什么意思呢?你可能听过持续集成(...

2020-04-09 10:36:36 677

原创 理解 TypeScript 类型

引言这篇文章谈谈有关 TypeScript 类型的一些概念和原理。学习资料来源于网络,欢迎讨论。感兴趣的朋友可以阅读参考资料中的原始文章。如何理解 TypeScript 类型首先,我们可以将TypeScript的类型理解为一组值(Values)的集合。如果变量a属于A类型,那么所有可以赋值给变量a的元素就组成了A类型的集合。例如:let a: A; /* a is of type A ...

2020-04-09 10:30:52 325

原创 React 组件重用探究

引言今天看了两篇关于React组件重用的文章,作者给出了一些小技巧,方便我们更好地考虑组件重用的设计。现在分享在这里。重用的思路我们通常意义理解的可重用,一般是指能适配多种用户常见,可以被其他用户使用,满足他们的需求。但是基于这种理解实现的可重用组件会有一个问题:忙于扩展功能以适应新需求,导致组件的实现越来越复杂,bug也可能越来越多。例如,如果想适配更多的用户需求,我们最直接的做法是增...

2020-04-09 10:28:46 297

原创 Git使用技巧(一)—— Git Revert 探究

引言今天跟大家分享一个Git Revert的实践。最近在项目中做一些跟持续集成(CI)相关的工作,其中有一块涉及代码的回退操作(Revert),我们需要自动化地实现这些功能,因此需要调用Git的命令来完成。回退代码的方式在使用Git作为代码管理工具时,常见的回退代码方式有两种,一是 reset 命令:git reset commit_id这条命令可以让本地的Git目录回退到指定的co...

2020-04-09 10:27:12 791

原创 Angular 启动过程简析

引言这篇文章简要介绍一下Angular应用程序的启动(Bootstrap)原理。这里的内容来源于网上的一些关于Angular的学习资料,只会涉及基本的原理和过程,不会涉及过于细节的源代码,感兴趣的话大家可以自己研究源代码。目前的Angular的大版本是8,即将发布Angular 9,这篇文章是基于Angular 8的。我们在开始学习Angular并动手做一些练习时,可能会好奇,一个简单的 ...

2020-04-09 10:24:03 758

原创 Angular 大列表性能优化

引言今天看到一篇文章,有关在Angular应用程序中,如何优化大列表的方法。当数据列表变得很大时,很多Web应用程序都会出现性能问题,作者认为这通常不是框架本身的问题,即框架是框架,代码不是好代码。很多呈现数据的代码没有很好地斟酌,导致了性能问题。下面来看具体的优化方案。方法一:使用虚拟滚动条(Virtual Scrolling)虚拟滚动条是Angular CDK实现的一个组件,它可以用来...

2020-04-09 10:22:23 1774

原创 Angular 变更检测探究

引言使用过现代JavaScript框架的开发者,都应该熟悉绑定(binding)的概念。绑定通常有两个方向。一是由用户交互驱动,在浏览器的页面上发生了输入、点击操作,导致应用程序的状态发生改变,这些改变需要反映到程序中特定变量上。另一个方向是,JavaScript代码的业务逻辑中改变了程序的状态,比如通过API请求拿到新的数据,而这些状态也需要反映的页面的控件上。很多框架如AngularJS就...

2020-04-09 10:20:22 506

原创 Angular Service 单例问题探究

引言Angular Service是一种实现代码抽象的方式。它可以帮助我们将业务逻辑从页面的呈现逻辑中分离出来,以保持Component功能的纯净,以及某些常见功能的重用。一些开发者认为Component应该只处理页面呈现以及用户交互方面的逻辑,其他的都应该抽象到service中,即所谓的Lean Angular Component思想。我们在使用Angular Service时会有这种场景...

2020-04-09 10:15:28 1541

原创 Angular 碎片 —— 样式封装

目录综述不封装仿真(Emulated)封装原生(Native)封装参考资料综述本文介绍Angular中的样式封装机制,以及背后的基本原理,供您参考。我们在写一个Angular Component的时候经常要指定该Component需要的样式。样式可以通过inline的方式在styles属性中定义,也可以通过指定一个外部样式文件定义需要的CSS。无论哪种方式,定义的样...

2018-08-26 19:52:35 949 1

原创 Angular 碎片 —— 自定义Directive

目录前言代码预览代码详解前言我们知道,AngularJS框架中,directive是一个重要的概念,是代码重用的基础。不过,该框架中directive的用法和配置稍显复杂。1.6版本后定义了新的component方法后,组件化编程相对更自然些。到了Angular框架中,component开始大行其道,出色的设计思想让组件化编程更为自然和易用了,而directive似乎销声匿迹了...

2018-08-25 22:55:57 363

原创 OAuth详解之二:过程

上篇文章介绍了OAuth协议大致的工作流程。本文对这个过程做个细化。

2017-09-15 15:36:41 1071 1

原创 OAuth详解之一:动机

最近正在学习OAuth协议,看了《OAuth 2 in Action》这本书。本文是对该书第一章内容的小结。第一章的核心内容就是在回答一个问题:为什么需要OAuth这个协议?用一句话说,该协议提供了一种,在不欺骗资源拥有者的前提下,通过某种方式以资源拥有者的名义访问资源的方法。这种方式就是资源拥有者对访问者的授权(authorization)。如图1.2(以下图片均来自该书)。具体到

2017-09-14 22:04:01 547

原创 ES6入门(一):块级作用域

我们知道,在ES5及之前的JavaScript标准中是没有定义块级作用域的。这导致在编程时会意外地犯一些微妙的错误。例如,局部变量提升会将全局变量的定义覆盖;for循环的局部变量在循环结束后依然有效等等。ES6标准引入了块级作用域的概念,结合let关键字,可以解决上述问题。一般的用法如下:function func() { let n = 1; if (true) { le

2016-10-29 12:13:17 1768

原创 关于跨域问题和安全性的一点理解

最近由于项目需要,在开发一系列浏览器插件,涉及的浏览器包括Chrome,Firefox和IE。在插件的实现中,部分功能需要通过跨域的API调用完成,这会导致一些问题,而问题在IE浏览器中尤为突出。首先要说明的是,跨域访问是不可避免的。原因是我们开发的是插件而不是页面,API的调用都是在当前页面的环境中完成的,而我们的API服务器是自己内部的域名。这个问题在Chrome和Firefox的插件

2016-08-15 18:41:11 20493

原创 AngularJS Scope 继承解析

AngularJS中scope之间的继承关系使用JavaScript的原型继承方式实现。本文结合AngularJS Scope的实现以及相关资料谈谈原型继承机制。基本原理在JavaScript中,每创建一个构造函数(constructor),就会同时给该函数生成一个指向原型对象的属性prototype。每个原型对象又获得一个constructor属性指向相应的构造函数,原型对象的其他属性和

2016-04-16 15:06:12 4977

原创 AngularJS Digest 过程解析

本文结合相关资料剖析Angular中的Digest过程。一、Digest 基本概念和原理Digest过程是Angular实现双向数据绑定的基础。由于对scope对象的改动需要及时反映的到HTML元素的属性上,Angular要不时地检查每个scope变量的变化,这个检查过程就是Digest(翻译中文为’消化‘,顾名思义,消化掉新的改变)。该过程由scope对象的$digest方法完成,通常不

2016-04-10 18:35:05 4429

原创 深入浅出NodeJS笔记(五)---- Promise的序列执行

书中第四章异步编程介绍的内容比较丰富,今天读到支持序列执行的Promise一节,为加深理解,将代码和体会整理如下。让Promise支持序列执行的初衷是减少编码量。如书中所言,直接使用回调函数嵌套或者事件监听(Emitter)会导致大量的重复或者丑陋代码。而Promise有then方法,如果级联起来,代码逻辑清楚,内容简洁。首先,定义Promise和Deferred对象:var Prom

2016-04-04 19:09:04 4696

原创 AngularJS 依赖注入解析

本文结合一些资料,谈谈AngularJS的依赖注入机制。主要参考资料有:1. AngularJS官方文档:https://docs.angularjs.org/guide/di2. Github文章:https://github.com/angular/angular.js/wiki/Understanding-Dependency-Injection3. 专著:Pro Angular

2016-03-26 16:42:15 20891 2

hadoop权威指南中文版

hadoop经典入门教程《hadoop权威指南》的中文扫描版。本书内容通俗易懂,适合hadoop的初学者。也建议结合英文版来理解内容。

2012-10-07

机器学习(经典入门教材)

机器学习和数据挖掘入门的经典教材 浅显易懂 内容全面 适合初学者

2012-08-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除