专注于做有价值的技术原创

0%

前言

有挺长时间没有更新博客了。一来是公司比较忙,二是自己也在思考一些新的问题。最近一个月,在我脑海回想最多的一个词语是“插件化架构”。作此文,也是想简单分享一下我对这个问题的见解。

来自 Webpack 的启发

去年有参与过 Udacity 前端课程翻译。其中我翻译了构建工具部分。Webpack 作为当前主流构建工具,深刻影响着前端开发工作流的变革,正如课程中所说,Webpack 聚合当前前端构建工具所有最热门的构建技术,甚至可以说,它可以作任何构建工具能作的事。那么 Webpack 为什么这么全能,是因为 Webpack 自身这么能干,精通十八般武艺?No !事实上 Webpack 比想象的要“无能”,它的全能是因为它能容万物只所能。因为 Webpack 本身是一个高度插件化设计的系统,它所表现的能力都借助于真正身怀绝技的插件的赋能。当然,我这里所说的插件包含了 Webpack 的内置插件以及通过配置传入的plugins。可以说,Webpack 只抽象了一个软件运行时环境,在不关心和改动这个系统已有代码的前提下,却能独立开发新的插件来充实整个系统的能力。这不就是软件设计中所要追求的开闭原则的最佳实践吗?从 Webpack 的插件化架构设计上所表现出系统良好的开放性,可持续的简洁性,我自然想象到,为何不在业务系统中采用这样的插件化架构。

阅读全文 »

前言

距离尤雨溪首次公开 Vue3 (vue-next)源码有一个多月了。青笔观察到,刚发布国庆期间,出现不少解读 Vue3 源码的文章。当然不少有追风蹭热之嫌,文章草草讲讲响应式原理,或者只是做了一些上层的导读,告诉读者应该先看哪再看哪。不能说这些文章就没有一点价值,它确实能够让你在短时间内,不用过多思考就能了解到一些 Vue3 重中之重的“干货”。但是过于干货的未必就是好的。因为干货通常是经过作者咀嚼过后的产物,大部分营养其实只被作者消化了。留给读者的只是一些看似很有料,实则没有营养的残渣。就像一块啃到只剩骨头的排骨。这样的文章通常适合于媒体传播,仅用于快速捕获眼球。但是对于想更细致了解 Vue3 的专业前端开发,这显然远远不够。

阅读全文 »

每一个程序员都有一款心心念叨的代码编辑器。而在众多妖颜魅惑的编辑器偶像团体前,vim 就像个不加粉饰的农村姑娘,咋一看是那样朴实无华,难有倾心。但只要走近一点,来个亲密接触,又会被她的似水柔情所俘获。

这是青笔亲身经历。公司从腾讯空降技术总监,时不时会分享一些他的开发经验。其中说到编辑器,他的脸上总会泛起淡淡桃花,“我就喜欢 vim!” 。尽管我们曾一致向他引荐当下红极一时集美貌与才华于一身的 vscode 。他却依然心有所属,不为所动。

多少次,我百思不得其解,这个“相貌平平”的 vim 到底有何魔力,能牢牢扣住总监的心弦。在我真正走进她的内心世界,多次昼夜相伴之后。我最终也被她的清新脱俗所拜倒。

接下来就让我们一起来了解这名神秘的“女子”。

阅读全文 »

所有示例都只调用一个函数:get_jobs(城市, 职业)。执行成功后,函数返回一个 pandas.DataFrame 对象,用做进一步数据分析,其中 平均月薪 已经通过 薪资描述 计算出来(已考虑月薪数,默认12薪)。同时将数据保存到当前目录下的 excel 文件,文件名格式为 城市-职业.xlsx 。例如 北京-人工智能.xlsx 表示北京的人工智能岗位。

阅读全文 »

昨天一个朋友说最近想换工作。想让我帮看下Boss现在的招聘情况如何。正好想到上个月写了个开源爬虫框架kcrawler,最后添加了一个Boss类支持,可以实现快速根据关键词查询不同岗位,不同行业的的招聘情况。有现成可用的库,帮助朋友也是举手之劳。

1. 安装

kcrawler是开源的。开发同学可以选择clone源码。但是如果想省事,就直接pip install,然后导入项目使用即可。

1
pip install kcrawler

2. 使用

提供两个类。

  • Crawler: 简单配置爬取任意网站
  • Boss: Boss专用(本文推荐)

2.1 爬虫基类 Crawler

kcrawler 提供了一个爬虫基类 Crawler , 它封装了一个通用型爬虫的基础功能。通过传入配置字典来实例化一个网站的crawler对象,然后调用对象的crawl方法,即可实现指定目标数据的爬取。支持html,json,图像的爬取。以下为Boss的配置示例。

阅读全文 »

1. 基于比较的排序(comparison-based sorting)

使用比较运算符” < ”和” > ”,将相容的序放到输入中,且除了赋值运算符外,这两种运算是仅有的允许对输入数据进行的操作,在这些条件下的排序叫做“基于比较的排序”。本文介绍的除了桶式排序都是基于比较的排序。

2. 插入排序(insertion sort)

最简单的排序算法之一是插入排序。插入排序由 N-1 趟(pass)排序组成。对于 P=1 趟到 P=N-1 趟,插入排序保证从位置 0 到位置 P 上的元素为已排序状态。

阅读全文 »

1. 表,栈和队列

表,栈和队列是计算机科学中最简单和最基本的三种底层数据结构。事实上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,而栈则在程序中总是要间接地用到,不管你在程序中是否做了声明。

1.1 抽象数据类型(ADT)

在计算机软件编程中,我们会接触到诸如整型,浮点型,字符型,布尔型等基本数据类型,也有一些更为复杂的复合数据类型,如数组,字典(散列表),元组等。如果我们抛开这些数据类型具体实现,进一步抽象,给出更一般的定义,即每一种数据类型实际是一些特定操作的集合。我们称这些操作的集合抽象数据类型abstract data type, ADT)。ADT 是数学意义上的抽象,它不约束各个操作的具体实现,对于每种 ADT 并不存在什么法则来告诉我们必须要有哪些操作,这只是一个设计决策。

阅读全文 »

前言

本文所有 shell 命令均在阿里云ECS服务器上测试过,以确保每行代码都是百分百可用的。测试使用的服务器配置信息如下:

  • 2核8G内存 40G SSD云盘
  • CentOS 7.6 64位

为了精简篇幅,同时又方便直观的了解各命令执行的效果。本文对命令输出的处理方式分为以下三种:

  1. 在提供必要的输出信息的命令行前加上 $ , 代表该行为要执行的命令,同时也意味着紧接着的是该命令执行后的输出信息,直到遇到下一个以 $ 开始的行,用于区分命令和命令的输出,实际运行不用加 $

  2. 未加 $ 的整个代码块,都不提供输出信息;

  3. 输出信息量大,但又有一些影响我们了解重要信息的输出,通过管道,使用实用程序 grep 过滤重要信息,格式:$ command | grep xxx

阅读全文 »