前言
前几天心血来潮,想把自己船上的Win10更新到18年10月的版本(1809),结果易升下载了更新之后,安装时提示“我们无法更新系统保留的分区”,于是一脸懵逼。
坑也是要慢慢踩的。熬了两夜,终于成功解决了这个问题,将Win10升级到了最新版本。
踩坑记录
原因分析
遇到这个问题后,笔者第一时间google百度了下解决方案,看到了以下几条:
最近一直在探索Lua的C API编程部分,上次实现了一个函数执行时间统计库:lfunctimer,这次就果断写了一个lnodelist
来玩玩。在这期间,遇到了许多纠结的问题,因此果断做下分享~
测试用例现在贼少= =想要试用的同学可以走lnodelist
的Github传送门,或者luarocks install lnodelist
,就可以开始干起~
在Lua里,table充当着array以及hashmap两个角色,提供了简单的insert、remove、concat等功能。lnodelist
则是独立于table之外建立一个崭新的list/array
数据结构,暂时是一个双向链表。API的需求上,则兼并java的LinkedList跟js的array两种体系,列表如下:
数据挖掘(Data Mining),一般指从海量抓取的数据中经过一定的数据处理、算法,从而提取出有价值的信息的过程。它大体基于统计学、机器学习(Machine Learning)等原理,辅佐了人类的信息处理工作,为人工智能(AI)铺下道路。
幸运的是,似乎正是因数据挖掘而生的那样,Python社区中有各种数据挖掘相关的package,能够满足各种数据处理与算法模型构建需求。我们只需要pip/conda install 包名
,然后查查api文档,熬几十行代码,就能玩一玩数据挖掘。
为此,在这一话,我们以自然语言处理(NLP)的文本分类(Text Classification)为例,设计一个最simple的,最old school的,以Python为例的,从数据获取到产生数据挖掘结果的流程。
昨天更新了一下lfunctimer,主要把hook更改为c api的形式,并且初步加了util和config的扩展
想要试用的同学的话可以点击上面clone下来,或者安装luarocks后执行下面命令安装~
luarocks install --server=http://luarocks.org/manifests/utmhikari lfunctimer
言归正传,利用lua原生的c api做debug相关操作会比lua自带的debug.getinfo
来的快许多,我们可以来一探究竟
我们可以从官方下载源码搜索debug.getinfo
的实现,此处以版本5.3.5为例。
debug.getinfo
对应的源码是ldblib.c
的db_getinfo
函数,我们可以简单在ldblib.c
的末尾中查到~
一直以来,爬虫都是许多同学学Python的目的之一,就连我敬爱的领导,也经常不耻下问一些爬虫方面的问题。因此,我们开始实战——以豆瓣Top 250为例,试水一下基础的爬虫。
“玩转豆瓣二百五”系列分为上下两部,所有代码,可以在我的Github里Douban_250找到~
工欲善其事,必先利其器。以下浏览器操作,都基于最新版Chrome~
爬虫爬虫,实质还是抓取网络数据= =爬虫不得急,可要一步步来——首先,我们希望获得每一个电影的链接,把它们存起来,留着后续爬取具体内容备用。
打开豆瓣Top 250首页,会看到电影列表的页面,往下翻,会看到总共有10页,每页25个电影。打开第二页,可以看到浏览器的地址变成了https://movie.douban.com/top250?start=25&filter=
,咱们观察一下链接——链接有一部分,start=25
,是不是很突兀?按这样推算,第三页应该是start=50
,第一页就是start=0
嘛= =试了一下,果真是的= =
因此,爬取250个电影链接,不难规划。具体如下:
在白盒性能测试(profiling)中,函数时间统计是一项重要的指标。对于整个以lua为基础的系统架构而言,函数时间统计数据是性能优化的直接参照。
因此,本次Lua杂谈,将会分享一种函数执行时间统计的实现~
单个函数执行时间的获取相对较为简单,例子如下:
1 | local function test() |
在函数的开头与结尾调用lua内置的os.clock(内核实现为time.h的中clock()
时间戳除以CLOCKS_PER_SEC
统计量,单位为秒),可以轻而易举地获得该函数的执行时间
学python的时候,我们一定会接触到dict(字典)这个数据结构。
dict结构展示了数据间(key与value)一一对应的关系,key作为一个查询索引,是不允许有重复的,而不同key所对应的value,则允许重复值的存在。
比如说,我们定义一群boys&girls,打出整个dict,再打出girls有哪些,可以这样操作:
1 | import pprint |
打出来的效果是:
1 | {'boy': ['大碗宽面'], 'girl': ['迪丽热巴', '王鸥', '鬼鬼']} |
我们可以很直观地看到这种对应关系
像dict数据结构给我们展现的一样,数据间的对应关系,我们可以统称为:映射(Mapping)
如同第一话所说,程序的本质即为输入->函数->输出。输入和输出,就是一种映射关系,而实现这种映射的规则,就是函数。在dict里面,实现映射的函数,可以简化如下:
Lua 杂谈系列,就以代码覆盖率测试的 luacov 开头吧
说到 lua 的覆盖率测试,我们一般都会想到用luacov做代码覆盖率测试
在干货|使用 luacov 统计 lua 代码覆盖率一文中,介绍了基本的 luacov 用法,但是缺少对 luacov 深入挖掘的相关内容。并且同时,原生的 luacov 提供了一套简洁的覆盖率测试实现以及报告输出形式,但是在实际许多场景中,采用原生 luacov 还是远远满足不了需求的
因此,本文旨在通过分析 luacov 的实现,帮助希望了解 lua 代码覆盖率测试或是使用、二次开发 luacov 的同学尽快上手
luacov 获取代码覆盖率数据,得益于 lua 自带的 debug 库。我们从 luacov 的主类 runner 中,可以一探究竟
这个年代,连小学生都会Python了,我家领导还是一行代码都打不出。
网上的Python教程一抓一大把,但出于让人更加深刻理解以及实用的目的(尤其是我家领导),Easy Python,开始挖坑!
这个没有教程= =,请安装3.*最新版Python
编辑器建议为vscode 、sublime之类(记得装插件),如若觉得装插件烦可直接上pycharm
Easy Python系列不展现实时交互式命令~
学程序的第一行代码,大概都是Hello World吧!
1 | print('Hello World!') |
然后命令行里,就会输出:
1 | Hello World! |
那如果要打出1行100个Hello World的话,该怎么办呢?
如果这样的话:
1 | for i in range(100): |
试试看,会打出100行HelloWorld,不符合我们的需求
这个时候,该怎么办?