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

0%

前言

距离尤雨溪首次公开 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

阅读全文 »

前言

在数据量不大时,我们的程序只需要考虑能否实现功能。但随着用户量的增长以及随之而来的用户行为数据和各种业务数据的急剧增加,那些仅仅能满足功能的代码,就不得不再考虑它的运行效率。如果运行过于漫长,就算实现了功能,这样的程序在实际生产中也是不能用的,必须对程序算法进行分析,给出时间复杂度更低的改进算法。本文从初学者角度介绍算法分析的数学基础,以及如何使用大 O 法分析程序或算法的时间复杂度和常用的分析法则。

1. 为什么要做算法分析?

设想解决同一个问题有两个算法,算法 1 花费的时间为 T_1(N)=100N ,算法 2 花费的时间为 T_2(N)=N^2 。其中 N 代表解决问题要处理的数据量,当 N 相等时,要判断哪个算法更快,取决于 N 的大小,或者说要处理的数据量大小。当数据量很小时,算法1要比算法2花费更多时间;当 N 超过某个临界值后(这里是 100),算法2的花费时间急剧增加,远超算法1,相对而言,算法1却增长平缓。 

阅读全文 »