开源社区分析报告背后的数据支撑: GH Archive

最近应老板要求看了一个 X-lab 针对 GitHub 开源项目的分析报告,发现了一个背后非常好用并且强大的数据集。所以简单介绍一下这个数据集的收集方式和使用方法。 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue. 简介 前段时间过年的时候老板给我发来了一个 X-lab 实验室做的 GitHub 开源项目的分析报告想让我看看我们是否可以学习和利用其中的分析方法和数据集。我就看了看这个报告,发现它其实背后是使用了另外一个开源项目 GH Archive 归档的数据集并配合 ClickHouse 生成了分析报告。所以我就简单的看了看这个项目,下面是这个 GitHub 归档项目的实现思路和使用方法。 GH Archive 设计和实现思路 GH Archive 采取了一个非常暴力但是非常有效的归档方式,他们将 GitHub 所有的事件的都利用 GitHub 提供的 Event API 爬取了下来,然后按照 JSON 的格式存了下来。 他们使用 ruby 来调用 GitHub API 进行爬取,具体的代码在 crawler.rb。有效的代码不超过一百行,所以就不具体展开解读了。主要就是调用 API 并且将数据按照日期整理为 JSON 格式的文件。 同步至 BigQuery 数据集 GH Archive 通过爬取的方式整理好数据之后提供了 JSON 数据集的下载服务,我们可以通过 HTTP 客户端下载这些数据集,例如使用 wget: wget https://data.gharchive.org/2015-01-01-15.json.gz 这样我们就可以下载 2015 年 1 月 1 日 GitHub 所有公开仓库的所有事件。...

March 7, 2021 · 2 min · Rustin liu

TiDB High Performance 课程实验 1

大家好,我是 Rustin. 最近开始做贵司推出的 TiDB High Performance 课程,所以开个课程实验记录的坑! 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue. 简介 在高性能挑战赛的 文档 中找到第一节课的实验描述,实验需要分别下载和编译 TiDB, TiKV 和 PD, 并且需要修改 TiDB 源码让其在启动事务的时候,打印一句 hello transation 的日志。下面我就简单记录一下整个实验过程。 克隆源码并编译 需要分别克隆和编译 TiDB, TiKV 和 PD. 这三个库分别对应了 TiDB 中的计算,存储和调度三个层面。具体内容可以参考课程文档中对应的三篇文章。 编译 TiDB git clone https://github.com/Rustin170506/tidb 在编译之前,需要我们安装 make 工具,因为三个项目的 build 都是用 makefile 来组织的。查看 makefile 可以看到 .PHONY 中有个 server 的伪目标。内容如下: server: ifeq ($(TARGET), "") CGO_ENABLED=1 $(GOBUILD) $(RACE_FLAG) -ldflags '$(LDFLAGS) $(CHECK_FLAG)' -o bin/tidb-server tidb-server/main.go else CGO_ENABLED=1 $(GOBUILD) $(RACE_FLAG) -ldflags '$(LDFLAGS) $(CHECK_FLAG)' -o '$(TARGET)' tidb-server/main....

September 3, 2020 · 3 min · Rustin liu

从 pingcap tidb 学习使用静态检查工具提升代码质量

大家好,我是 Rustin 。今天想跟大家简单介绍一下如何使用一些 golang 的静态代码检查工具来提升代码质量! 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue。 简介 从去年接触到 TiDB 就开始尝试在社区帮忙修复一些简单的 Bug。最近,我在阅读代码的过程中发现 TiDB 的代码库中有大量的没有必要的类型转换,我就用 GoLand 分析检查出大部分的无效的类型转化, 然后提了一个 PR (CEO 半夜 review 代码,哈哈哈)修复。在这个 PR 中 zz-jason 大神 评论希望能够通过静态检查工具来检测无效的类型转换。 我经过一些研究,决定使用 unconvert 来检测无效的类型转换,然后在这个 PR 解决了这个问题。 最近我终于有机会在公司写 Go了,所以我也想在公司的项目上配置和使用一些静态检查工具来提升代码质量。 在经过一下午的努力之后终于把 TiDB 的大部分检查工具移植到了公司项目上,并且在 github 上创建了一个模板项目 go-boilerplate 。下面我就简单介绍一下这个模板的构建过程和使用的方式。 init 项目,添加代码 我最近使用的 Go 版本 1.13.8,所以就使用 go mod 来初始化和管理项目。 go mod init github.com/Rustin170506/go-boilerplate 然后我添加了 main 文件和一个用作例子的 foo 文件,目录结构如下所示: . ├── foo.go ├── foo_test.go ├── go.mod ├── go....

April 25, 2020 · 4 min · Rustin liu

Raft 领导人选举实现

大家好,我是 Rustin。最近在做 6.824 的实验 lab2,今天想写一篇文章记录一下前段时间做的 Raft 领导人选举机制的实现。 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue。 简介 6.824 是 MIT 的分布式系统公开课,今年还有官方的视频资料放出。 目前也有国内的同学正在进行翻译工作,可以参考一下。 课程质量非常高,国内也有一些整理好的相关资料可以参考。 下面我就简单描述一下 Raft 领导人选举机制实现过程和一些踩过的坑,我会尽可能的聚焦在实现实验的细节上,因为我可能对 Raft 目前的理解也比较浅显。所以如果您对这篇文章感兴趣,请您先阅读论文和观看课程视频并尝试实现。 领导人选举规则分析 在 Raft 中分别有三种角色分别是:Leader, Follower 和 Candidate。在整个系统正常运行过程中,只会有一个 Leader 节点,其他的都是 Follower 节点。只有在需要重新选举的阶段,节点会尝试将自己转换为 Candidate,然后向所有的节点发出投票 RPC 消息展开选举。 我觉得而一个比较好的切入思路就是搞明白何时需要进行 Leader 的选举?我们阅读论文会发现主要有两种情况需要进行选举,一种就是当 Raft 集群启动之后开始第一次选举,另外一种就是 Leader 出现故障,无法使用心跳机制维持自己的统治, 导致选举超时机制触发,节点开始尝试新的一轮的选举(需要注意的是,选举有可能在一个 Term 中没有结果,那么就在下个 Term 中继续选举直到选出 Leader)。 搞清楚何时进行选举,我们再来看看选举的 RPC 请求和回复的数据结构: Request 参数 解释 term 候选人的任期号 candidateId 请求选票的候选人的 Id lastLogIndex 候选人的最后日志条目的索引值 lastLogTerm 候选人最后日志条目的任期号 Reply 返回值 解释 term 当前任期号,以便于候选人去更新自己的任期号 voteGranted 候选人赢得了此张选票时为真 从数据结构中我们可以看到能够影响到选举的主要有两个部分,一个是 Term,另外一个就是候选人的最后一条日志条目。那我们就尝试从这两点方面去消化和理解选举的规则:...

April 12, 2020 · 5 min · Rustin liu

如何快速的成为 Ant Design 的 contributor

大家好,我是 Rustin。今天想跟大家介绍下如何快速的成为 antd 的贡献者,希望能够对想要加入 antd 社区贡献的同学有帮助! 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue。 简介 其实 antd 几乎不需要做任何的介绍,大家都知道它是中国甚至世界都炙手可热的 UI 设计框架。他们的口号是:企业级产品设计体系,创造高效愉悦的工作体验。 我对这个框架感情颇深,从大二开始接触到这个框架至今已经陪我走过了 3 个年头,在校和实习期间用它愉悦的完成了数不清的作业和任务。去年在毕业设计期间,终于为它贡献了第一份力量。 最近我还在为它持续贡献力量,所以萌生了写一篇有关如何给 antd 贡献的文章的念头。言归正传,下面我会用我前两天帮 antd 修复一个 Bug 的例子来带大家熟悉一下在 antd 社区贡献的简单流程。 熟悉 PR 流程,阅读贡献指南 在我开始介绍我的例子之前,我觉得如果你刚开始尝试在 Github 的社区开始贡献,建议你读一下 Github 官方的文档。 官方的文档介绍了一些很基础但是很重要的关于 PR 的规则,当你熟悉如何在 Github 创建一个 PR 之后,你还应该在 antd 的 README 中找到贡献指南,README 是每个开源项目很重要的入口, 你基本上在 README 中可以找到所有与该库相关的链接。 对于 antd 来说,他们把自己贡献指南挂在自己的官网当中,既有中文版也有英文版。你可按照自己的情况仔细阅读完贡献指南。 我觉得目前我们可以从贡献指南获取的要点信息是: 开发准则 对于开发准则来说,最主要的我觉得就是要保持尊重和礼貌,无论是对贡献者还是社区协作者,我们都应该保持绝对的尊重和礼貌。 一个要点就是在和社区交流的时候多用:please, could, thanks,这在哪个社区都适用。 分支管理 这个是一个很重要的点,因为每个项目可能都有自己的开发和发布流程,在 antd 我们要注意的是:修复 Bug 需要将 PR 发送到 master 分支,添加新功能则需要将 PR 发送到 feature 分支。 提交 Bug 报告...

April 2, 2020 · 2 min · Rustin liu

解决 macOS 10.15 Catalina 无法运行 qmeu 的问题

最近在学习 Rust,并且在尝试使用 Rust 来做内核,跟着 Writing an OS in Rust{:target="_blank"} 系列博客学习,这个博客质量非常高,深入浅出。 但是最近遇到一个qemu的问题,当我将系统升级到最近的 macOS 10.15 Catalina 之后,qemu 无法运行,启动之后卡死。如下: {:height=“360px” width=“450px”} 解决方案 实际上卡死的原因是 Catalina 操作系统底层 API 变化导致的死锁。该死锁会导致 qemu 的 UI Cocoa 无法正常工作。 所以我们目前运行 qemu 的非 GUI 模式是正常的。 后来我在 qemu 的论坛发现有人报告这个 bug,并且有人已经修复了这个问题,但是还没有 release。但是也有人给出了其他解决方案,可以通过自己编译切换 UI 来解决这个问题。 步骤如下(我使用homebrew安装,其他安装方式也一样,重新编译就行): brew edit qemu 添加依赖:sdl2,depends_on "sdl2" 关闭 cocoa,将--enable-cocoa 改为 --disable-cocoa 打开 sdl,将--disable-sdl 改为 --enable-sdl brew reinstall --build-from-source qemu 最终的 Formula 文件: class Qemu < Formula desc "x86 and PowerPC Emulator" homepage "https://www....

November 3, 2019 · 2 min · Rustin liu