HiKariのTechLab

光の技术屋


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 站点地图

  • 搜索

【Lua杂谈】探索C API,开坑lnodelist

发表于 2019-04-20 | 更新于 2024-04-07 | 分类于 Lua杂谈

前言

最近一直在探索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两种体系,列表如下:

阅读全文 »

【Easy Python】第五话:小试scikit-learn数据挖掘——newsgroup数据处理与文本分类

发表于 2019-04-14 | 更新于 2024-04-07 | 分类于 Easy Python

前言

数据挖掘(Data Mining),一般指从海量抓取的数据中经过一定的数据处理、算法,从而提取出有价值的信息的过程。它大体基于统计学、机器学习(Machine Learning)等原理,辅佐了人类的信息处理工作,为人工智能(AI)铺下道路。

幸运的是,似乎正是因数据挖掘而生的那样,Python社区中有各种数据挖掘相关的package,能够满足各种数据处理与算法模型构建需求。我们只需要pip/conda install 包名,然后查查api文档,熬几十行代码,就能玩一玩数据挖掘。

为此,在这一话,我们以自然语言处理(NLP)的文本分类(Text Classification)为例,设计一个最simple的,最old school的,以Python为例的,从数据获取到产生数据挖掘结果的流程。

文本分类是什么?

阅读全文 »

【Lua杂谈】debug.getinfo源码分析——使用C API重写lfunctimer

发表于 2019-04-07 | 更新于 2024-04-07 | 分类于 Lua杂谈

前言

昨天更新了一下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源码分析

我们可以从官方下载源码搜索debug.getinfo的实现,此处以版本5.3.5为例。

debug.getinfo对应的源码是ldblib.c的db_getinfo函数,我们可以简单在ldblib.c的末尾中查到~

阅读全文 »

【Easy Python】第四话:爬虫初探——玩转豆瓣二百五(下)

发表于 2019-03-31 | 更新于 2024-04-07 | 分类于 Easy Python

前言

在上篇,我们获得了豆瓣二百五的电影URL,然后存储在了一个文件里。接下来,我们要访问每一个电影URL,深入敌后,获取情报~

所有的代码都已存储在我的Github仓库:Douban_250当中~

设置爬取规则

对于每一个电影,我们选择爬取如下内容(虽然电影列表页就能爬得到= =):

1
2
标题(title)、年份(year)、时长(time)、
导演(director)、类型(genre)、评分(score)

随意点击一个电影页面,用上篇所说的提取CSS选择器的方法,我们可以制作出每一种内容与内容提取规则的映射。如下所示:

阅读全文 »

【Easy Python】第三话:爬虫初探——玩转豆瓣二百五(上)

发表于 2019-03-31 | 更新于 2024-04-07 | 分类于 Easy Python

前言

一直以来,爬虫都是许多同学学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个电影链接,不难规划。具体如下:

阅读全文 »

【Lua杂谈】Lua性能测试:函数执行时间统计

发表于 2019-03-25 | 更新于 2024-04-07 | 分类于 Lua杂谈

前言

在白盒性能测试(profiling)中,函数时间统计是一项重要的指标。对于整个以lua为基础的系统架构而言,函数时间统计数据是性能优化的直接参照。

因此,本次Lua杂谈,将会分享一种函数执行时间统计的实现~

函数执行时间获取

单个函数执行时间的获取相对较为简单,例子如下:

1
2
3
4
5
6
local function test()
local start = os.clock()
...
local end = os.clock()
print(tostring(end - start))
end

在函数的开头与结尾调用lua内置的os.clock(内核实现为time.h的中clock()时间戳除以CLOCKS_PER_SEC统计量,单位为秒),可以轻而易举地获得该函数的执行时间

hook实现

阅读全文 »

【Easy Python】第二话:映射——输入、输出与函数的纽带

发表于 2019-03-16 | 更新于 2024-04-07 | 分类于 Easy Python

从dict开始说起

学python的时候,我们一定会接触到dict(字典)这个数据结构。

dict结构展示了数据间(key与value)一一对应的关系,key作为一个查询索引,是不允许有重复的,而不同key所对应的value,则允许重复值的存在。

比如说,我们定义一群boys&girls,打出整个dict,再打出girls有哪些,可以这样操作:

1
2
3
4
5
6
7
8
import pprint
d = dict()
d['girl'] = ['迪丽热巴', '王鸥', '鬼鬼']
d['boy'] = ['大碗宽面']
# 用pprint.pprint函数打印数据结构,使得其排版更加pretty~
pprint.pprint(d, indent=2)
# 单用pprint.pformat,可以返回一个排版过后的字符串,打印出来要额外print操作~
print('Girls are: %s' % pprint.pformat(d['girl']))

打出来的效果是:

1
2
{'boy': ['大碗宽面'], 'girl': ['迪丽热巴', '王鸥', '鬼鬼']}
Girls are: ['迪丽热巴', '王鸥', '鬼鬼']

我们可以很直观地看到这种对应关系

映射

像dict数据结构给我们展现的一样,数据间的对应关系,我们可以统称为:映射(Mapping)

如同第一话所说,程序的本质即为输入->函数->输出。输入和输出,就是一种映射关系,而实现这种映射的规则,就是函数。在dict里面,实现映射的函数,可以简化如下:

阅读全文 »

【Lua杂谈】解锁lua代码覆盖率测试:luacov源码分析

发表于 2019-03-10 | 更新于 2024-04-07 | 分类于 Lua杂谈

Lua 杂谈系列,就以代码覆盖率测试的 luacov 开头吧

简介

说到 lua 的覆盖率测试,我们一般都会想到用luacov做代码覆盖率测试
在干货|使用 luacov 统计 lua 代码覆盖率一文中,介绍了基本的 luacov 用法,但是缺少对 luacov 深入挖掘的相关内容。并且同时,原生的 luacov 提供了一套简洁的覆盖率测试实现以及报告输出形式,但是在实际许多场景中,采用原生 luacov 还是远远满足不了需求的
因此,本文旨在通过分析 luacov 的实现,帮助希望了解 lua 代码覆盖率测试或是使用、二次开发 luacov 的同学尽快上手

获取代码覆盖率数据

luacov 获取代码覆盖率数据,得益于 lua 自带的 debug 库。我们从 luacov 的主类 runner 中,可以一探究竟

阅读全文 »

【Easy Python】第一话:print('HelloWorld')——输入、输出与函数

发表于 2019-03-09 | 更新于 2024-04-07 | 分类于 Easy Python

前言

这个年代,连小学生都会Python了,我家领导还是一行代码都打不出。
网上的Python教程一抓一大把,但出于让人更加深刻理解以及实用的目的(尤其是我家领导),Easy Python,开始挖坑!

安装Python

这个没有教程= =,请安装3.*最新版Python
编辑器建议为vscode 、sublime之类(记得装插件),如若觉得装插件烦可直接上pycharm
Easy Python系列不展现实时交互式命令~

HelloWorld

学程序的第一行代码,大概都是Hello World吧!

1
print('Hello World!')

然后命令行里,就会输出:

1
Hello World!

那如果要打出1行100个Hello World的话,该怎么办呢?
如果这样的话:

1
2
for i in range(100):
print('Hello World')

试试看,会打出100行HelloWorld,不符合我们的需求
这个时候,该怎么办?

阅读全文 »
1…1819
ひかり.HDQ

ひかり.HDQ

talk is cheap, code is rich
189 日志
14 分类
417 标签
GitHub Mail CSDN Juejin Steam Bilibili
© 2019 – 2025 ひかり.HDQ
|