Git 清理 fetch 失败占用的磁盘空间

最近在下载 chromium 源码,下载完之后需要切换到指定的分支,这时候使用 git fetch 进行切换,但是不是一次就能成功。

所以需要不断执行 git fetch ,但是随着执行的次数增多,我发现磁盘的空间却越来越少。

也就是 git fetch 失败后占用了磁盘空间并没有释放。

在查找资料后发现使用 git prune 可以解决这个问题。

git prune 会删除没有使用的 hash 文件,由于我们这边 fetch 失败了,所以这些文件是没有使用的。

执行之后磁盘瞬间释放70G空间。

Android Cronet 构建

前言

CronetChromium 浏览器中用于网络请求的库,支持 HTTP1/2SPDYQUIC 等协议。并且还支持移动端。

需要注意的是编译 Android 需要在 Linux 下进行,并且只支持 UbuntuDebian 的发行版,其它的不支持。

GDB调试

前言

gdbGNU 下的一款调试器,支持常见的语言,例如 C/C++GoRust 等等。

调试器对我们开发程序的时候有非常大的帮助,是每一个开发都需要学会的调试技能。

今天来了解一下 gdb 的使用。

Emacs中使用Forge管理GitHub Pull Request

前言

使用 GitHub 与其他开发者合作需要频繁的创建 Pull Request 或者 Review 别人提交的 Pull Request

自从我使用 Emacs 来管理 Git 仓库后一直用的很舒服,但是这也仅限于自己的仓库。创建 Pull Reqeust 也是用的网页,这样的操作体验就不一致了,需要在 Emacs 和浏览器来回切换。

于是我搜索一圈发现在 Emacs 里可以使用 Forge 来创建 Pull Request ,所以本文会描述如何在 Emacs 中使用 Forge 来管理 GitHub Pull Request

cout打印uint8_t

前言

最近在调试的时候使用 cout 打印 uint8_t 类型数据,结果却什么都没有打印出来,一直以为程序有问题,调试了半天发现 cout 会使用 char 类型来打印 uint8_t

对单一职责的理解

前言

今天来聊一聊单一职责原则

背景

有两个端,移动端和服务端,起先设计是有两个接口,一个接口用于查询,一个用于更新。

客户端要求在更新接口在没有查询到对应数据的时候可以把数据更新到数据库。但是服务端却没有做这个功能,他把这个功能做到了查询接口,也就是要想更新一条新的数据要先调用查询接口。

安装RTags

前言

使用 RTags 预处理 C/C++这篇文章中提到了 rtags 的使用,于是我在 Linux 中使用的时候碰到了安装的问题并顺利解决了。

然后又在 Mac 上进行了尝试,也碰到了问题,记录一下,希望能帮助需要的人。

Google Test 框架

前言

使用 C/C++ 开发的项目,在进行测试的时候,要么自己写一些简单的例子进行测试,要么使用第三方框架。自己写简单的例子对于大项目来说效率就不高,而且输出的结果就不是很专业,不能得到一个测试报告。

所以我们有必要选择一个比较好的测试框架来对代码进行测试,今天要介绍的就是谷歌的测试框架 google/googletest: GoogleTest - Google Testing and Mocking Framework

C/C++ 包依赖管理

前言

在开发过程中,我们难免会使用到第三方库,在 C/C++ 中使用第三库都是把源码下载下来,然后进行编译。

在多人协作的时候,每个人都需要在自己的电脑上编译一遍,非常的麻烦,编译时间也会随着库的增加不断增加。

其它语言也有这个问题,它们有包管理工具来管理这些依赖,比如 JavaMavenGradleRustcargoPythonpipNodenpmyarn 等,使用起来非常方便。

C/C++ 在包依赖管理工具上一直没有一个较好的,不过还是有一些工具的,我们今天要介绍的就是 JFrog 推出的 Conan

HTTP/2

前言

最近被问到 HTTP/2 有什么特点,我只答了个多路复用,当时脑子还想到了二进制分帧和头部压缩,我以为是 HTTP/3 的就没答上来。

由于 HTTP/2 普及率不高,而且最近 IETF 将 QUIC 发布为 RFC9000,这意味着 HTTP/3 即将到来。所以很有可能会跳过 HTTP/2 直接进入 HTTP/3 ,所以对 HTTP/2 没有了解太多。

不过既然被问到了那就好好学一下 HTTP/2

探秘 AIDL 为什么不支持 short

前言

前阵子复习 AIDL 相关的知识,知道 AIDL 不支持 short 类型,但是我却发现同样使用 AIDLMessenger 却可以。

这是怎么回事,本文将探索这其中原因。

mmap 探索

前言

之前研究 mmap 发现有一个地方不是非常理解,为什么使用 mmap 完成了文件到进程地址空间的映射还要调用 msync 来进行同步?

我经过查找资料后找到了答案,由于讲到的人比较少,所以便有了此文,希望对同样有困惑的人有帮助。

IPC 之 Messenger

Messenger是什么?

MessengerAndroid 中和 AIDL 一样,用于进程间通信的技术,也是基于 AIDL 的封装。

使用 RTags 预处理 C/C++

前言

先来看一个动图 我们在使用 C/C++ 的时候,或多或少都会碰到宏,不论是自己写的还是别人写的。在使用宏的时候,如果有点复杂那很难看懂,并且非常容易出错,如果能够在编写代码的时候就知道宏展开之后的样子,将会大大提高编码效率,提高正确性。

本篇文章将要介绍在 Emacs 中使用 RTags 来查看宏展开后的样子。

对比C++与Java变量初始化

前言

最近发现在 C++ 的代码中还有不少是 C 语言的代码,于是想要把 C 的写法改成 C++ 的写法。

其中碰到了 C++ 初始化的问题,查阅资料后发现有坑,于是便有了此文。

Application 启动流程

前言

Zygote 这篇文章中提到, Zygote 在收到创建新进程的请求之后,会创建新的进程,当时没有继续往下探索了,今天来探索一下 Application 是如何创建的。

Magit 使用技巧

Magit 介绍

MagitEmacs 中的一个用于管理 Git 的工具,可以理解为 Git 的前端操作界面。和 SourceTree 客户端类似,不过功能却强大太多了,这也是我使用 Emacs 的一个重要理由。

Magit 中有许多非常强大的功能,这里介绍几个非常有用,但是又不容易记住的。

本文的 Magit 所使用的快捷键需要配合 evil-mode 使用。

SystemServer

前言

Zygote 这篇文章中,我们提到 Zygote 会创建 SystemServer 进程,当时我们没有去了解。

今天就来聊一聊 SystemServer