导航

内容来源于网络

前言

分享Github开源项目,在玩的过程中学习,2023年每天的目标就是研究几个项目,寻找点乐趣。

开源项目

001.cpr

C++ 版 Request for human在线文档

示例代码:

1
2
3
4
5
6
7
8
9
10
11
#include <cpr/cpr.h>

int main(int argc, char** argv) {
cpr::Response r = cpr::Get(cpr::Url{"https://api.github.com/repos/whoshuu/cpr/contributors"},
cpr::Authentication{"user", "pass", cpr::AuthMode::BASIC},
cpr::Parameters{{"anon", "true"}, {"key", "value"}});
r.status_code; // 200
r.header["content-type"]; // application/json; charset=utf-8
r.text; // JSON text string
return 0;
}
002.libco

腾讯的开源项目——libco 是微信后台大规模使用的 C/C++ 协程库,2013 年至今稳定运行在微信后台的数万台机器上。

  • 无需侵入业务逻辑,把多进程、多线程服务改造成协程服务,并发能力得到百倍提升
  • 支持 CGI 框架,轻松构建 Web 服务
  • 支持 gethostbyname、mysqlclient、ssl 等常用第三方库
  • 可选的共享栈模式,单机轻松接入千万连接
  • 完善简洁的协程编程接口
    • 类 pthread 接口设计,通过 co_create、co_resume 等简单清晰接口即可完成协程的创建与恢复
    • __thread 的协程私有变量、协程间通信的协程信号量 co_signal
    • 语言级别的 lambda 实现,结合协程原地编写并执行后台异步任务
    • 基于 epoll/kqueue 实现的小而轻的网络框架,基于时间轮盘实现的高性能定时器
003.json

C++ 的 JSON 库

004.simhash

此项目用来对中文文档计算出对应的 simhash 值。simhash 是谷歌用来进行文本去重的算法,现在广泛应用在文本处理中。

特征:

  • 使用 CppJieba 作为分词器和关键词抽取器
  • 使用 jenkins 作为 hash 函数
  • hpp 风格,所有源码都是 .hpp 文件里面,方便使用。没有链接,就没有伤害。
  • 本项目的副产品项目:simhash_server 提供了简单的 simhash HTTP 服务。
005.bfs

百度文件系统,架构图如下:

006.SQLAdvisor

美团点评公司 DBA 团队开源的一个分析 SQL 并给出索引优化建议的工具,开源内容和内部使用保持一致,文档齐全

007.RedisDesktopManager

Redis 桌面管理工具

008.vnote

Markdown 编辑软件。舒适的 Markdown 编辑体验,Vim 操作模式,编辑时代码块高亮

009.robomongo

免费、开源的 MongoDB 跨平台桌面管理工具,支持 Windows、Linux、Mac

010.OpenCC

中文简繁转化开源项目,在线尝试

  • 严格区分 “一简对多繁” 和 “一简对多异”
  • 完全兼容异体字,可以实现动态替换
  • 严格审校一简对多繁词条,原则为 “能分则不合”
  • 支持异体字和地区习惯用词转换,如 “裏” “裡”、“鼠標” “滑鼠”
  • 词库和函数库完全分离,可以自由修改、导入、扩展
  • 支持 C++、Python、PHP、Java、Ruby、Node.js 等
  • 兼容 Windows、Linux、Mac 平台

011.cpp-cheat-sheet

能够帮你通过 Google 和 NASA 面试的 C++ 数据结构和算法的 cheat sheet(英文)

012.taskflow

一个 C++ 头文件库,让你以简单的几行代码就可以实现高效的并发。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <taskflow/taskflow.hpp>  // Taskflow is header-only

int main(){

tf::Executor executor;
tf::Taskflow taskflow;

auto [A, B, C, D] = taskflow.emplace( // create four tasks
[] () { std::cout << "TaskA\n"; },
[] () { std::cout << "TaskB\n"; },
[] () { std::cout << "TaskC\n"; },
[] () { std::cout << "TaskD\n"; }
);

A.precede(B, C); // A runs before B and C
D.succeed(B, C); // D runs after B and C

executor.run(taskflow).wait();

return 0;
}

013.CppCon2018

CppCon 2018 幻灯片和资料

014.2048.cpp

C++ 写的终端 2048 游戏

015.BurstLinker

主要为 Android 开发的一个 C++ GIF 编码器。支持多种常见的颜色量化算法、颜色抖动算法

016.oatpp

轻量、高性能、零依赖,纯 C++ 实现的 Web 框架。

示例代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ENDPOINT_INFO(getUserById) {
info->summary = "Get one User by userId";

info->addResponse<Object<UserDto>>(Status::CODE_200, "application/json");
info->addResponse<Object<StatusDto>>(Status::CODE_404, "application/json");
info->addResponse<Object<StatusDto>>(Status::CODE_500, "application/json");

info->pathParams["userId"].description = "User Identifier";
}
ENDPOINT("GET", "users/{userId}", getUserById,
PATH(Int32, userId))
{
return createDtoResponse(Status::CODE_200, m_userService.getUserById(userId));
}
017.LeetCodeAnimation

用动画的形式呈现解 LeetCode 题目的思路

018.playerdemo

开源、入门级视频播放器跨平台视频播放器。该播放器拥有视频播放器基本功能,适合学习播放器开发技术,音频、视频技术

019.TrafficMonitor

一款用于 Windows 平台的网速监控悬浮窗软件。可以显示当前网速、CPU及内存利用率、任务栏显示、更换皮肤、历史流量统计等功能

020.FLIF

免费、新颖的无损图像格式。压缩比方面优于 PNG、lossless WebP、lossless BPG、lossless JPEG2000 等格式

021.apollo

百度自主研发、开源的全面开放自动驾驶平台。它将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统

022.incubator-brpc

百度开源的 RPC 框架,拥有超过 100 万个实例和 500 多种服务

023.MyTinySTL

用 C++11 实现的小型 STL(容器库+算法库)。代码结构清晰规范、包含中文文档与注释,并且自带一个简单的测试框架,适合新手学习与参考。

024.tinytetris

一个用 C++ 编写的终端版俄罗斯方块游戏。提供了两个版本的源码,分为注释版和库版,注释较多易于理解和学习

025.calculator

微软 Windows 系统预装的计算器工具开源了。该工具提供标准、科学、程序员计算器的功能,以及各种度量单位和货币之间的转换功能。实现语言为 C++ 代码并不复杂,快来看看微软工程师编写的代码吧!运行效果如下:

026.muduo

一个依赖 Boost 的非阻塞 IO 和事件驱动 C++ 网络库。实现了对底层系统调用的封装、高性能异步日志的设计、Reactor 多线程并发模式设计、简单的 HTTP 协议的解析。适合开发 Linux 下的多线程服务端应用程序,通过阅读源码还可学习到 C++ 语言、Linux 网络编程等后端知识

Examples of Muduo network library:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
0) src             - source file
1) bazel - build with Bazel
2) cmake-submodule - build with CMake, checking out muduo as a git submodule
3) cmake - build with CMake
2) makefile - build with Makefile

1) build with bazel
cd bazel
bazel build -c opt :all

2) build with CMake with git submodule
git submodule update --init
mkdir build
cd build
cmake ../cmake-submodule
make

Assuming Muduo is installed in $HOME/build/debug-install

3) build with CMake
mkdir build
cd build
cmake ../cmake
make
# echo binary is in ./bin/

4) build with GNU make
cd makefile
make
# echo binary is in ./
027.CppCon2019

C++ 2019 大会的幻灯片和相关材料集合

028.CppNet

一个封装在 Tcp 协议上的 Proactor 模式 multi-thread 网络库。包含 OS 接口调用、回调处理、定时器、缓存管理等,这里有从操作系统到应用层的所有网络细节,便于初学者学习和实践。

  • 简单:只导出了最少量的接口,其声明都类似系统 socket API。对客户端而言,只新增了一个 buffer 类型
  • 快速:采用性能最优的 epoll 和 IOCP 做事件驱动,惊群处理交由内核。每个连接都独享一个内存池,从内存池中申请的内存都由智能指针管理
  • 清晰:结构上分为事件驱动,会话管理,接口三层,通过回调向上通知。模块之间职责分工明确,最大的类不超过 500 行代码
029.dbg-macro

打日志是 C++ 开发中必不可少的一种 debug 方式,dbg-macrorust-lang 中 的 dbg 启发,提供比 printf 和 std::cout 更好的宏函数。

主要有如下特点:

  • 美观的彩色输出(当输出不是交互式终端时,颜色将自动禁用)
  • 兼容 C++11,并且是 header-only
  • 支持基础类型和 STL 容器类型的输出
  • 除了基本信息外,还输出变量名和类型
  • 启用 DBG_MACRO_DISABLE 生成 release 版

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <vector>
#include <dbg.h>

// You can use "dbg(..)" in expressions:
int factorial(int n) {
if (dbg(n <= 1)) {
return dbg(1);
} else {
return dbg(n * factorial(n - 1));
}
}

int main() {
std::string message = "hello";
dbg(message); // [example.cpp:15 (main)] message = "hello" (std::string)

const int a = 2;
const int b = dbg(3 * a) + 1; // [example.cpp:18 (main)] 3 * a = 6 (int)

std::vector<int> numbers{b, 13, 42};
dbg(numbers); // [example.cpp:21 (main)] numbers = {7, 13, 42} (std::vector<int>)

dbg("this line is executed"); // [example.cpp:23 (main)] this line is executed

factorial(4);

return 0;
}
030.awesome-modern-cpp

Wow Awesome!你想将 modern cpp 运用自如吗?那就来看 Awesome-modern-cpp 吧!这里列出了一些有关现代 C++ 的最佳实践、书籍、会议、谈话、播客、博客、网站、各种各样的库以及一些工具,让你不禁 Wow Awesome,这就是你独享的 moment

031.fmt

这是一个开源的 C++ 格式库。它可以作为 (s)printf 和 iostreams 的安全和快速替代品,也是 C++ 20 中 std::format 的一个实现。它的格式化字符串语法类似于 Python 中的 str.format,支持用户自己定义的类型,还比 printf 和 iostreams 的常见标准库实现更快!而且 fmt 还非常安全,格式字符串中的错误可以在编译时报告,还可以防止缓冲区溢出错误。

示例代码:

1
2
3
4
5
6
7
8
9
10
#include <fmt/color.h>

int main() {
fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold,
"Hello, {}!\n", "world");
fmt::print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |
fmt::emphasis::underline, "Hello, {}!\n", "мир");
fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
"Hello, {}!\n", "世界");
}
032.pika

一个企业级开源的可持久化的大容量(百G)redis 存储服务。兼容 redis 的绝大部分接口,解决 redis 由于存储数据量巨大而导致内存不够用的容量瓶颈。并且可以像 redis 一样,通过 slaveof 命令进行主从备份,支持全同步和部分同步

033.ThreadPool

一个简单的 C++11 线程池实现,代码加起来不到 100 行。

示例代码:

1
2
3
4
5
6
7
8
// create thread pool with 4 worker threads
ThreadPool pool(4);

// enqueue and store future
auto result = pool.enqueue([](int answer) { return answer; }, 42);

// get result from future
std::cout << result.get() << std::endl;
034.xournalpp

一款支持 PDF 手写注释的笔记软件,支持 Linux、Windows、macOS 平台。看书的时候喜欢标注、做笔记,那这款工具肯定适合你。下载地址

035.nebula

Nebula Graph 是一款开源图数据库,目标是为超大规模的图数据提供高并发、低延时的读、写及计算服务。目前是世界上唯一能够容纳千亿个顶点和万亿条边、并提供毫秒级查询延时的图数据库解决方案。

特点:

  • 全对称分布式架构
  • 可扩展
  • 高可用
  • 数据强一致
  • 类 SQL 查询语言

036.terminal

微软开源的一个全新、现代、功能丰富、高效的 Windows 终端应用程序。它支持 Windows 命令行社区最常用的许多命令,还支持选项卡、富文本、全球化、可配置性、主题和样式等功能。

037.marksentence

这是一个在托福听力中标记句子的工具(即精听工具)。在听力时可文本对照,并且对听力音频中没听懂片段进行标记,并选择标记理由,方便日后的反复复习

038.pprint

一个让输出变得更漂亮的 C++ 库。就像 python 语言的 pprint 库,它对基本类型、字符串、复数、enum 类型、STL 容器等做了输出格式优化,有了缩进和分行才更容易发现这个世界的美好。

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Construct a vector of values
std::vector<std::variant<bool, int, int *, float, std::string, std::vector<int>,
std::map<std::string, std::map<std::string, int>>,
std::pair<double, double>>> var;
var.push_back(5);
var.push_back(nullptr);
var.push_back(3.14f);
var.push_back(std::string{"Hello World"});
var.push_back(std::vector<int>{1, 2, 3, 4});
var.push_back(std::map<std::string, std::map<std::string, int>>{{"a",{{"b",1}}}, {"c",{{"d",2}, {"e",3}}}});
var.push_back(true);
var.push_back(std::pair<double, double>{1.1, 2.2});

// Print the vector
pprint::PrettyPrinter printer;
printer.indent(2);
printer.quotes(true);
printer.print(var);
039.musikcube

一个使用 C++ 编写的终端的音乐播放器,也可以作为一个音频引擎、元数据索引器和服务器。musikcube 可以在 Windows、MacOS 、Linux 以及带有 raspbian 的树莓派上轻松编译和运行。虽然它只能在终端上使用,但是功能应有尽有。使用方法详见 User Guide

040.Sourcetrail

一个免费开源、跨平台的可视化源码探索项目。能够十分高效的帮助使用者探索、熟悉陌生的代码,支持 C、C++、Python 和 Java 语言,同时提供了相关 SDK 用于拓展支持其它语言,相信在未来会提供更多语言的支持。程序员在它的帮助下可以快速熟悉陌生项目、学习开源项目、框架等,此等利器赶快去试试吧

041.flameshot

操作简单、功能强大的截图工具

042.ChineseChess

基于 Qt5 开发的中国象棋网络对战平台,支持单机和网络对战

043.CnC_Remastered_Collection

EA 发布的《红警》和《泰伯利亚黎明》游戏源代码

044.workflow

搜狗开源的 C++ 服务器引擎。支撑搜狗几乎所有后端 C++ 在线服务,包括所有搜索服务、云输入法、广告等,每日处理超百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数 C++ 后端开发需求

To quickly build an HTTP server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include "workflow/WFHttpServer.h"

int main()
{
WFHttpServer server([](WFHttpTask *task) {
task->get_resp()->append_output_body("<html>Hello World!</html>");
});

if (server.start(8888) == 0) { // start server on port 8888
getchar(); // press "Enter" to end.
server.stop();
}

return 0;
}
045.design-patterns-cpp

常见设计模式 C++ 语言实现版

046.indicators

一个使用 C++ 编写的进度条库,你可以用它在命令行中实现美观的进度条。它使用方便、线程安全、支持多种进度条样式

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <chrono>
#include <indicators/cursor_control.hpp>
#include <indicators/progress_bar.hpp>
#include <thread>

int main() {
using namespace indicators;

// Hide cursor
show_console_cursor(false);

indicators::ProgressBar bar{
option::BarWidth{50},
option::Start{" ["},
option::Fill{"█"},
option::Lead{"█"},
option::Remainder{"-"},
option::End{"]"},
option::PrefixText{"Training Gaze Network 👀"},
option::ForegroundColor{Color::yellow},
option::ShowElapsedTime{true},
option::ShowRemainingTime{true},
option::FontStyles{std::vector<FontStyle>{FontStyle::bold}}
};

// Update bar state
while (true) {
bar.tick();
if (bar.is_completed())
break;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}

// Show cursor
show_console_cursor(true);

return 0;
}
047.sudoku

C++ 实现的命令行数独游戏。600 余行代码,初学者也可以轻松学习

048.GuiLite

引用方便的 C++ 全平台 GUI 库。能够使用在 PC 端、移动设备、物联网设备甚至是没有操作系统的单片机,还支持多种开发语言和三方库

049.html-plus-plus

这个库让你可以使用 C++ 模板编写 HTML。HTML 文档被表示为一个单一的、深层嵌套的类型,相当于 HTML 的模版引擎。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include "html++.h"

int main()
{
html<
head<
title<"Help Me.">
>,
body<
h1<"The horror!">,
p<"Someone has probably done this before, but I can see why it didn't catch on.">,
a<"href=https://github.com/csb6/html-plus-plus", "For science">
>
> page;

std::cout << page.content;
return 0;
}
050.CPlusPlusThings

这是一个适合 C++ 初学者从入门到进阶的教程。解决了面试者想要深入 C++ 及如何入坑 C++ 的问题。除此之外,该仓库拓展了更加深入的语法分析、多线程并发等的知识,是一个比较全面的 C++ 从入门学习到进阶提升的项目

051.modern-cpp-features

该项目介绍了现代 C++(C++11 以及之后的版本)语言和库的新特性。它能够帮助大家更快地入手新时代的 C++

052.drogon

一款 C++ 的异步非阻塞高性能 Web 框架。功能强大、上手容易,使得用 C++ 语言构建各种类型的高性能 Web 应用,变得更加方便。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
#include <drogon/drogon.h>
using namespace drogon;
int main()
{
app().setLogPath("./")
.setLogLevel(trantor::Logger::kWarn)
.addListener("0.0.0.0", 80)
.setThreadNum(16)
.enableRunAsDaemon()
.run();
}

053.hplayer

一个基于 C++ 实现的多画面播放器。能播放文件源、网络源、设备捕获源,界面为多画面监控网格,可自由切换多画面风格,支持拖拽与合并。适合想要入门音视频、播放器开发的小伙伴们学习,该项目用到的技术栈:

  • Qt 实现界面
  • FFmpeg 获取帧、编解码、转码
  • OpenCV 处理图片
  • OpenGL 渲染视频帧

054.interview

C/C++ 技术面试知识集合项目。包括语言、程序库、数据结构、算法、链接装载库等知识

055.contour

一个使用 C++ 17 开发的终端模拟器。可在 Windows、Linux 和 MacOS 三大平台使用,支持字体连字 Font Ligatures(例如 Fira Code 字体)、GPU 加速渲染、背景模糊(Win10、KDE)、256 色、True Color 和配色主题

056.milvus

一款开源的、针对海量特征向量的相似性搜索引擎。相比 Faiss 和 SPTAG 这样的算子库,Milvus 提供完整的向量数据更新,索引与查询框架。Milvus 利用 GPU 进行索引加速与查询加速,能大幅提高单机性能。部署使用简单,降低了 AI 应用落地的难度

057.FlowChar

一个用来把伪代码生成纯字符流程图的小工具。让使用者仅需要写一段简单的伪代码,便可以生成对应的流程图。该项目结构清晰、使用简单,代码量少适合使用和“把玩”。

流程图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
              +-------------+                   
| be born |
+-------------+
|
V
N /-----------\
+--------------| alive |<------------------+
| \-----------/ |
| | Y |
| V |
| Y /-----------\ N |
| +----| happy |----+ |
| | \-----------/ | |
| | | |
| V V |
| +-----------+ +---------------------+ |
| | smile | | try to be happy | |
| +-----------+ +---------------------+ |
| | | |
| +--------->O<---------+ |
| | |
| V |
| O-------------------------+
|
|
| +---------+
+-------------->| die |
+---------+
058.notepanda

这是一个用 C++ 和 Qt 开发的记事本项目。支持代码高亮、自定义字体样式,还可以命令行呼出:notepanda main.cpp,支持 Windows、Linux 和 MacOS 三大系统。可作为学习 Qt、如何做开源项目的实战

059.yuzu

免费开源的 Nintendo Switch 模拟器。刚刚开源的项目,目前仅支持 Windows、Linux,部分主流游戏:塞尔达传说、宠物小精灵、马里奥等

060.leocad

用来创建虚拟乐高模型的 CAD 工具。适用于 Windows、Linux 和 macOS 系统

061.ppsspp

能够运行在 Android 和 PC 上的开源 PSP 模拟器。下载地址

062.bpftrace

Linux 高级追踪工具和语言。该工具基于 eBPF 和 BCC 实现了通过探针机制采集内核和程序运行的信息,然后用图表等方式将信息展示出来,帮助开发者找到隐藏较深的 Bug、安全问题和性能瓶颈

063.Cataclysm-DDA

《大灾变:黑暗之日》是一款以世界末日为背景的生存游戏。游戏中没有任何任务,唯一的目标就是活下去。玩家可以通过寻找食物、装备等资源建造避难所,还支持车辆改装、制作物品等特色机制,支持 Windows、Linux、macOS、Android 系统。下载地址

064.cutter

一款免费开源的逆向工程平台。采用 Rizin 作为核心引擎并集成了 Ghidra 反编译器,它界面简洁功能强大,深受逆向工程师们的喜爱

  • 支持多种语言和主题
  • 二进制搜索
  • 十六进制编辑器
  • Python 脚本和插件
  • 支持 Linux、macOS、Windows

065.ChordNova

一款开源免费的和弦生成工具。

066.CGraph

无第三方依赖的 DAG 调度框架。实现了依赖节点依次执行、无依赖节点并发执行的逻辑。项目结构清晰、文档齐全,不仅代码中包含关键注释,还有示例代码和讲解文章。初学者可以通过该项目学到图调度方式、模块开发、模板编程、多线程编程、设计模式和通用算法的知识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "MyNode.h"

using namespace CGraph;

int main() {
/* 创建一个流水线,用于设定和执行流图信息 */
GPipelinePtr pipeline = GPipelineFactory::create();
GElementPtr a, b, c, d = nullptr;

/* 注册节点,其中MyNode1和MyNode2必须为GNode的子类,否则无法通过编译 */
CStatus status = pipeline->registerGElement<MyNode1>(&a, {}, "nodeA"); // 将名为nodeA,无执行依赖的node信息,注册入pipeline中
status += pipeline->registerGElement<MyNode2>(&b, {a}, "nodeB"); // 将名为nodeB,依赖a执行的node信息,注册入pipeline中
status += pipeline->registerGElement<MyNode1>(&c, {a}, "nodeC");
status += pipeline->registerGElement<MyNode2>(&d, {b, c}, "nodeD"); // 将名为nodeD,依赖{b,c}执行的node信息,注册入pipeline中
if (!status.isOK()) {
return; // 对以上所有CGraph接口的返回值做判定
}

/* 执行流图框架 */
status = pipeline->process();
GPipelineFactory::remove(pipeline);

return 0;
}
067.oclint

强大的静态代码分析工具。可以用来检查 C、C++ 和 Objective-C 代码,发现潜在的 Bug 提高代码质量

068.timg

在终端查看图片、动图、视频的命令行工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
timg some-image.jpg                # display a static image
timg -g50x50 some-image.jpg # display image fitting in box of 50x50 pixel

# Multiple images
timg *.jpg # display all *.jpg images
timg --title *.jpg # .. show name in title (short option -F)
timg --title="%b (%wx%h)" *.jpg # show short filename and image size as title
timg --grid=3x2 *.jpg # arrange in 3 columns, 2 rows in terminal
timg --fit-width --grid=3 *.jpg # maximize use of column width (short: -W)
timg --grid=3 -t5 *.gif # Load gifs one by one in grid. Play each for 5sec.

# Putting it all together; making an alias to list images; let's call it ils = 'image ls'
# This prints images two per row with a filename title. Only showing one frame
# so for animated gifs only the first frame is shown statically.
# With hi-res iTerm or Kitty terminals, consider more columns, e.g --grid=4x1
# Put this line in your ~/.bashrc
alias ils='timg --grid=2x1 --upscale=i --center --title --frames=1 '

# ... using this alias on images outputs a useful column view
ils *.jpg *.gif

# Read the list of images to load from a file. One filename per line.
locate "*.jpg" > /tmp/allimg.txt ; timg -f /tmp/allimg.txt

# Show a PDF document, use full width of terminal, trim away empty border
timg -W --auto-crop some-document.pdf
timg --frames=1 some-document.pdf # Show a PDF, but only first page

# Reading images from a pipe. The filename '-' means 'read from stdin.
# In this example generating a QR code and have timg display it:
qrencode -s1 -m2 "http://timg.sh/" -o- | timg -

# Here, using gnuplot output right in the shell
echo "set terminal png; plot sin(x);" | gnuplot | timg -

# Open an image from a URL. URLs are internally actually handled by the
# video subsystem, so it is treated as a single-frame 'film', nevertheless,
# many image-URLs just work. But some image-specific features, such as trimming
# or scrolling, won't work.
timg --center https://i.kym-cdn.com/photos/images/newsfeed/000/406/282/2b8.jpg

# Sometimes, it is necessary to manually crop a few pixels from an
# uneven border before the auto-crop finds uniform color all-around to remove.
# For example with --auto-crop=7 we'd remove first seven pixels around an image,
# then do the regular auto-cropping.
#
# The following example loads an image from a URL; --auto-crop does not work with
# that, so we have to get the content manually, e.g. with wget. Piping to
# stdin works; in the following example the stdin input is designated with the
# special filename '-'.
#
# For the following image, we need to remove 3 pixels all around before
# auto-crop can take over removing the remaining whitespace successfully:
wget -qO- https://imgs.xkcd.com/comics/a_better_idea.png | timg --auto-crop=3 -

timg multi-resolution.ico # See all the bitmaps in multi-resolution icons-file
timg --frames=1 multi-resolution.ico # See only the first bitmap in that file

timg some-video.mp4 # Watch a video.

# Play content of webcam (This assumes video4linux2, but whatever input devices
# are supported on your system with libavdevice-dev)
timg /dev/video0

# If you read a video from a pipe, it is necessary to skip attempting the
# image decode first as this will consume bytes from the pipe. Use -V option.
youtube-dl -q -o- -f'[height<480]' 'https://youtu.be/dQw4w9WgXcQ' | timg -V -

# Show animated gif, possibly limited by timeout, loops or frame-count
timg some-animated.gif # show an animated gif forever (stop with Ctrl-C)
timg -t5 some-animated.gif # show animated gif for 5 seconds
timg --loops=3 some-animated.gif # Loop animated gif 3 times
timg --frames=3 --loops=1 some-animated.gif # Show only first three frames
timg --frames=1 some-animated.gif # Show only first frame. Static image.

# Scroll
timg --scroll some-image.jpg # scroll a static image as banner (stop with Ctrl-C)
timg --scroll=100 some-image.jpg # scroll with 100ms delay

# Create a text with the ImageMagick 'convert' tool and send to timg to scroll
convert -size 1000x60 xc:none -fill red -gravity center -pointsize 42 \
-draw 'text 0,0 "Watchen the blinkenlights..."' -trim png:- \
| timg --scroll=20 -

# Scroll direction. Horizontally, vertically; how about diagonally ?
timg --scroll --delta-move=1:0 some-image.jpg # scroll with dx=1 and dy=0, so horizontally.
timg --scroll --delta-move=-1:0 some-image.jpg # scroll horizontally in reverse direction.
timg --scroll --delta-move=0:2 some-image.jpg # vertical, two pixels per step.
timg --scroll --delta-move=1:1 some-image.jpg # diagonal, dx=1, dy=1

# Background color for transparent images (SVG-compatible strings are supported)
# and generally useful if you have a transparent PNG that is otherwise hard
# to see on your terminal background.
timg -b auto some-transparent-image.png # use terminal background if possible
timg -b none some-transparent-image.png # Don't use blending
timg -b lightgreen some-transparent-image.png
timg -b 'rgb(0, 255, 0)' some-transparent-image.png
timg -b '#0000ff' some-transparent-image.png

# Checkerboard/Photoshop-like background on transparent images
timg -b lightgray -B darkgray some-transparent-image.png

# .. with adjustable size.
timg -b lightgray -B darkgray --pattern-size=4 some-transparent-image.png
069.fast-cpp-csv-parser

读取 CSV 文件的 C++ 库(仅头文件)。

示例代码:

1
2
3
4
5
6
7
8
9
10
# include "csv.h"

int main(){
io::CSVReader<3> in("ram.csv");
in.read_header(io::ignore_extra_column, "vendor", "size", "speed");
std::string vendor; int size; double speed;
while(in.read_row(vendor, size, speed)){
// do stuff with the data
}
}
070.godot

一款功能丰富的开源游戏引擎。最初它只是一款 2D 引擎,近期拓展了 3D 部分的能力。相较于 UE4 或者 Unity 这样的成熟商业引擎来说,Godot 还很年轻不够成熟,尤其 3D 方面的能力。但它拥有简易的开发方式,上手简单。而且社区活跃、文档覆盖全面、有较为丰富的示例代码,对于刚入门的游戏开发者友好。同时开源引擎底层代码完全开源,开发者可以阅读和贡献代码,而不是只停留在游戏逻辑开发层面。总而言之 Godot 是一个极有潜力的游戏引擎,推荐给想学习游戏开发的同学

071.UNO

使用 C++ 编写的命令行 UNO 纸牌游戏。操作方便支持人机或联机对战,游戏基于 Asio 网络库和现代 C++ 开发,也有对 C++17 的尝试。分别实现了服务端、客户端,代码简单对 C++ 新手友好,UNO 的爱好者快来玩一玩吧!

072.winmerge

一个用 C++ 编写的 Windows 比较和合并工具。它可以比较文件和文件夹,以直观的可视化格式来显示两者甚至三者之间的差异,操作简单

073.jwEngine

一个跨平台、轻量级、支持 C++ 和 Lua 的 Web 框架。支持 TCP、KCP、WebSocket、HTTP 等协议,底层采用 libuv 异步 IO 提高并发,避免多线程上下文切换开销和破坏代码美感,网络部分和逻辑部分使用一个主事件循环驱动。

支持 Lua 提高开发效率,适用于小型游戏开发,示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class INetEvent : public NetEvent
{
public:
virtual void onAccept(NetConnect * conn){}
virtual void onClose(NetConnect * conn){}
virtual void onMsg(NetConnect * conn, int msgtype, NetPacket * pack){}
};

int main()
{
EventLoop::Instance()->init();

INetEvent eve;
NetServer server(EventLoop::Instance(), &eve);
server.listen("127.0.0.1", 3001);

return EventLoop::Instance()->run();
}
074.Serial-Studio

一款 C++ 写的数据可视化桌面工具。支持多平台,效果和操作步骤如下:

075.rocksdb

用 C++ 编写的高性能键值存储引擎。该项目是由 Fackbook 数据库团队基于 levelDB 开发,键值均支持二进制流,能够充分利用多核 CPU 获得高性能,并兼容 levelDB 的 API 可谓是青出于蓝而胜于蓝。RocksDB 当下十分流行,一些开源数据库底层存储用的就是它

076.Plants-vs.-Zombies-Online-Battle

在没有游戏源代码的前提下,通过逆向工程和代码注入实现植物大战僵尸局域网对战模式。成功加载后解密模式的最后一关,会变为网络对战关卡。玩法为其中一个玩家放置植物进行防御,另一玩家放置僵尸进攻。项目结合逆向工程、C++和汇编相关技术,在无源代码的前提下为游戏增加功能。对逆向工程感兴趣的小伙可以看看源码

077.xpack

实现 C++ 结构体和 JSON/XML/BSON 互转的库。C++ 初学者可以通过该项目学到高阶的宏技巧和初级的 SFINAE 写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include "xpack/json.h" // Json包含这个头文件,xml则包含xpack/xml.h

using namespace std;

struct User {
int id;
string name;
XPACK(O(id, name)); // 添加宏定义XPACK在结构体定义结尾
};

int main(int argc, char *argv[]) {
User u;
string data = "{\"id\":12345, \"name\":\"xpack\"}";

xpack::json::decode(data, u); // json转结构体
cout<<u.id<<';'<<u.name<<endl;

string json = xpack::json::encode(u); // 结构体转json
cout<<json<<endl;

return 0;
}
078.incubator-kvrocks

基于 RocksDB 并兼容 Redis 协议的 NoSQL 数据库。磁盘类型的 Redis 为降低存储成本而生,存储成本可以降到 Redis 的 1/3 以上

079.btop

界面酷炫的命令行资源监视器。可以显示处理器、内存、磁盘、网络和进程的使用情况和统计信息,还支持鼠标操作

080.libqalculate

使用 C++ 编写的多功能计算器桌面应用、库和 CLI 程序。它易于使用功能强大,支持大型可定制函数库、单位计算和转换、符号计算(包括积分和方程)。作为用户你可以直接在命令行中使用,作为开发者你也可以在自己的项目中使用这个库。

官方还制作了 QtGTK 两个版本的 GUI 计算器应用

081.TinyWebServer

Linux 下的 C++ 轻量级 Web 服务器。该项目不仅可以用来搭建 Web 服务,也适合 C++ 初学者作为网络编程实战项目。作者还写了文章讲解相关代码和原理,帮助初学者更好的掌握网络编程相关知识

082.filament

轻量级实时物理渲染引擎。能够用来做游戏渲染引擎或者音视频编辑工程,当你需要处理 3D 渲染效果,又不想引入庞大的游戏引擎时,可以考虑使用它尤其是 Android 平台

083.simdjson

每秒可解析千兆字节的高性能 JSON 解析库

示例代码:

1
2
3
4
5
6
7
8
9
#include <iostream>
#include "simdjson.h"
using namespace simdjson;
int main(void) {
ondemand::parser parser;
padded_string json = padded_string::load("twitter.json");
ondemand::document tweets = parser.iterate(json);
std::cout << uint64_t(tweets["search_metadata"]["count"]) << " results." << std::endl;
}
084.NanaZip

基于 7-Zip 的开源压缩工具。包含多种压缩算法和美观的 Win11 风格 UI,同时适配 Win11 右键菜单操作

085.nvui

跨平台现代的 Neovim 前端。它使用起来流畅,动画效果细腻、美观,你可以用 Neovim 和 nvui 自由定制出一个高颜值、最懂你的编辑器

086.spdlog

快速、上手简单的 C++ 日志库。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "spdlog/spdlog.h"

int main()
{
spdlog::info("Welcome to spdlog!");
spdlog::error("Some error message with arg: {}", 1);

spdlog::warn("Easy padding in numbers like {:08d}", 12);
spdlog::critical("Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
spdlog::info("Support for floats {:03.2f}", 1.23456);
spdlog::info("Positional args are {1} {0}..", "too", "supported");
spdlog::info("{:<30}", "left aligned");

spdlog::set_level(spdlog::level::debug); // Set global log level to debug
spdlog::debug("This message should be displayed..");

// change log pattern
spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");

// Compile time log levels
// define SPDLOG_ACTIVE_LEVEL to desired level
SPDLOG_TRACE("Some trace message with param {}", 42);
SPDLOG_DEBUG("Some debug message");
}
087.srpc

搜狗基于 C++ Workflow 的高性能 RPC 框架。与 thrift/brpc 协议兼容,支持 protobuf/thrift IDL一键迁移,核心代码量仅 1w 行。

接口描述、协议和通信层次介绍:

示例代码:

server.cc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <signal.h>
#include "example.srpc.h"

using namespace srpc;

class ExampleServiceImpl : public Example::Service
{
public:
void Echo(EchoRequest *request, EchoResponse *response, RPCContext *ctx) override
{
response->set_message("Hi, " + request->name());
printf("get_req:\n%s\nset_resp:\n%s\n",
request->DebugString().c_str(), response->DebugString().c_str());
}
};

void sig_handler(int signo) { }

int main()
{
signal(SIGINT, sig_handler);
signal(SIGTERM, sig_handler);

SRPCServer server_tcp;
SRPCHttpServer server_http;

ExampleServiceImpl impl;
server_tcp.add_service(&impl);
server_http.add_service(&impl);

server_tcp.start(1412);
server_http.start(8811);
getchar(); // press "Enter" to end.
server_http.stop();
server_tcp.stop();

return 0;
}

client.cc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include "example.srpc.h"

using namespace srpc;

int main()
{
Example::SRPCClient client("127.0.0.1", 1412);
EchoRequest req;
req.set_message("Hello, srpc!");
req.set_name("workflow");

client.Echo(&req, [](EchoResponse *response, RPCContext *ctx) {
if (ctx->success())
printf("%s\n", response->DebugString().c_str());
else
printf("status[%d] error[%d] errmsg:%s\n",
ctx->get_status_code(), ctx->get_error(), ctx->get_errmsg());
});

getchar(); // press "Enter" to end.
return 0;
}
088.async_simple

阿里开源的轻量级 C++ 异步框架。提供了基于 C++20 无栈协程(Lazy)、有栈协程(Uthread) 以及 Future/Promise 等异步组件,能够轻松完成 C++ 异步的开发,广泛应用于阿里的图计算引擎、时序数据库、搜索引擎等系统。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include "async_simple/coro/Lazy.h"
#include "async_simple/coro/SyncAwait.h"

using namespace async_simple::coro;

using Texts = std::vector<std::string>;

Lazy<Texts> ReadFile(const std::string &filename) {
Texts Result;
std::ifstream infile(filename);
std::string line;
while (std::getline(infile, line))
Result.push_back(line);
co_return Result;
}

Lazy<int> CountLineChar(const std::string &line, char c) {
co_return std::count(line.begin(), line.end(), c);
}

Lazy<int> CountTextChar(const Texts &Content, char c) {
int Result = 0;
for (const auto &line : Content)
Result += co_await CountLineChar(line, c);
co_return Result;
}

Lazy<int> CountFileCharNum(const std::string &filename, char c) {
Texts Contents = co_await ReadFile(filename);
co_return co_await CountTextChar(Contents, c);
}

int main() {
int Num = syncAwait(CountFileCharNum("file.txt", 'x'));
std::cout << "The number of 'x' in file.txt is " << Num << "\n";
return 0;
}

089.folly

Facebook 开源的 C++ 工具库。包含一系列高性能的 C++ 组件库,方便且高效在 Facebook 内部被广泛应用。该项目不仅代码规范测试用例充足,而且源码中包含丰富的注释。同样功能的函数为什么别人写的性能好还健壮,这次终于可以一探究竟了。

090.Cytopia

免费开源的像素风模拟城市建设游戏

091.FileCentipede

一个用 C++ 和 Qt 编写的跨平台文件下载器。它界面简洁、下载速度快、支持多协议,还有浏览器插件可用来下载网页中的视频和音频

092.ydb

Yandex 开源的企业级分布式 SQL 数据库。具有高可用、易扩展、事务、强一致性、灾后自动恢复等特点,提供 Web 平台方便查询以及 Go、Java、Python、JavaScript 等多种编程语言 SDK

093.annoy

用于近似最近邻搜索的算法库。近似最近邻(ANN)方法是指一系列解决最近邻查找问题的近似算法,多用于内容推荐、搜索等场景。该项目是封装好的 C++/Python Annoy 算法库。Annoy 是用树为数据结构的 ANN 算法实现,它通过随机投影创建二叉树构建索引提升查询效率,采用优先队列和“森林”查询方法提高准确率,实现海量数据下的实时搜索。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from annoy import AnnoyIndex
import random

f = 40 # Length of item vector that will be indexed

t = AnnoyIndex(f, 'angular')
for i in range(1000):
v = [random.gauss(0, 1) for z in range(f)]
t.add_item(i, v)

t.build(10) # 10 trees
t.save('test.ann')

# ...

u = AnnoyIndex(f, 'angular')
u.load('test.ann') # super fast, will just mmap the file
print(u.get_nns_by_item(0, 1000)) # will find the 1000 nearest neighbors
094.RedPanda-CPP

易用的轻量级 C/C++ 集成开发环境。小熊猫 C++ 是一款专为编程新手和学生准备的 IDE,它没有复杂的安装和配置过程开箱即用。支持开发所需的自动补全、语法高亮、编译运行和调试 C/C++ 程序等功能。不仅如此,它还整合了 ege、海龟作图、raylib 等多种学习库,以及试题集和 OJ 功能,便于编程新手学习和使用。

095.Stockfish

强大的国际象棋引擎。它在众多国际象棋引擎评级列表中均名列前茅,棋艺基本上是吊打职业选手。它不仅可以对战,还支持棋局分析、评估棋艺,帮助国际象棋爱好者提升棋技。虽然这是一个引擎不能单独运行,但是社区提供了丰富的 GUI 软件下载就能用,甚至还可以用来解说国际象棋比赛。

096.KODI

强大自由的媒体中心软件。这是一个媒体播放器软件,但折腾一下就是家庭媒体娱乐中心。它不仅支持播放本地视频,还能够安装各种插件以及播放网络存储设备(NAS)、投屏、直播、电视、播客等源。能够运行在 Linux、macOS、Windows、Android、iOS 等设备,界面支持中文更多功能等待你的挖掘。

097.coost

在 C++ 上实现类似 Go goroutine 的库。它实现了协程同步事件、协程锁、协程池、channel、waitgroup,内存占用少实测 1000 万协程占用 2.8G 内存

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "co/co.h"

int main(int argc, char** argv) {
flag::init(argc, argv);

co::WaitGroup wg;
wg.add(2);

go([wg](){
LOG << "hello world";
wg.done();
});

go([wg](){
LOG << "hello again";
wg.done();
});

wg.wait();
return 0;
}
098.Cpp_Primer_Practice

《C++ Primer》中文版第 5 版的学习笔记。该项目不仅包含学习笔记还有课后习题的答案

099.polybar

超酷的 Linux 桌面状态栏工具。使用时无需精通 shell 就能上手,轻松完成高度自定义的状态栏。还有更多现成的主题,拿来即用点击查看

100.serenity

开源桌面操作系统。一款披着复古外衣现代的类 Unix 开源操作系统。从内核到 Web 浏览器均采用 C++ 编写,没有依赖现成的第三方库,外观模仿 90 年代操作系统界面的风格,我认为这是一封极客致敬经典的情书

101.30dayMakeCppServer

从零编写一个 C++ 服务器的教程。该项目包含图文教程和源码,讲解了 socket、epoll、线程池、CMake 等知识点,适合有一定 C/C++ 基础的小伙伴学习。

102.ImHex

保护视力的十六进制编辑器。面向逆向工程师和程序员的编辑器,可用来查看、解码、分析和编辑二进制数据。它功能丰富、界面炫酷、多彩高亮,而且项目更新积极,比如最初不支持中文路径的问题,现已解决可正常使用。

103.NotepadNext

Notepad++ 的替代品。采用 C++ 重写的跨平台文本编辑器,拥有和 Notepad++ 相似的界面和功能。

104.srs

一款简单、高效的实时视频服务器。高性能的流媒体服务器,支持 RTMP、WebRTC、HLS 和 HTTP-FLV 等协议,常用来构建直播和视频会议的后端服务。

105.CppCoreGuidelines

C++ 核心指南。一份由 C++ 之父 Bjarne Stroustrup 领导的 C++ 编码指南,目的是为了帮助大家更好地使用现代 C++。这个项目主要讨论的是关于 C++ 编写接口、内存管理、并发等方面的问题,适合有一定 C++ 基础想要进阶的小伙伴。

106.flatbuffers

谷歌开源的高性能序列化库。类似 Protocol Buffers 的序列化格式,但解析速度更快、占用内存更少,多用于对解析耗时敏感的 Android 应用和游戏。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "flatbuffers/flatbuffers.h"
#include "monster_test_generate.h"
#include <iostream> // C++ header file for printing
#include <fstream> // C++ header file for file access


std::ifstream infile;
infile.open("monsterdata_test.mon", std::ios::binary | std::ios::in);
infile.seekg(0,std::ios::end);
int length = infile.tellg();
infile.seekg(0,std::ios::beg);
char *data = new char[length];
infile.read(data, length);
infile.close();

auto monster = GetMonster(data);
107.imgui

游戏行业内流行的轻量级 C++ 图形界面库。这是个即时模式的 GUI 框架,控件都需要手绘。优点是更加灵活和轻量,可以快速构建功能简单、体积小的 GUI 程序,但不适合用来实现复杂动画的 GUI 应用,多用于开发游戏内的 GUI 工具。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Create a window called "My First Tool", with a menu bar.
ImGui::Begin("My First Tool", &my_tool_active, ImGuiWindowFlags_MenuBar);
if (ImGui::BeginMenuBar())
{
if (ImGui::BeginMenu("File"))
{
if (ImGui::MenuItem("Open..", "Ctrl+O")) { /* Do stuff */ }
if (ImGui::MenuItem("Save", "Ctrl+S")) { /* Do stuff */ }
if (ImGui::MenuItem("Close", "Ctrl+W")) { my_tool_active = false; }
ImGui::EndMenu();
}
ImGui::EndMenuBar();
}

// Edit a color stored as 4 floats
ImGui::ColorEdit4("Color", my_color);

// Generate samples and plot them
float samples[100];
for (int n = 0; n < 100; n++)
samples[n] = sinf(n * 0.2f + ImGui::GetTime() * 1.5f);
ImGui::PlotLines("Samples", samples, 100);

// Display contents in a scrolling region
ImGui::TextColored(ImVec4(1,1,0,1), "Important Stuff");
ImGui::BeginChild("Scrolling");
for (int n = 0; n < 50; n++)
ImGui::Text("%04d: Some text", n);
ImGui::EndChild();
ImGui::End();
108.aseprite

开源、专业的像素画编辑软件。一款主要用于像素画和 Sprite 动画的图像编辑软件,它拥有图层、自由手绘模式、阴影墨水、自定义笔刷、轮廓线、宽像素、命令行界面、Lua 脚本等特色功能。该软件虽然专业版收费但并不贵,也可选择免费版但无法保存作品。

109.Cemu

任天堂 Wii U 游戏机模拟器。用 C++ 编写的开源 Wii U 模拟器,能够运行绝大多数的 Wii U 游戏和自制游戏,支持 Windows、Linux、macOS 操作系统。

110.kys-cpp

游戏《金庸群侠传》的 C++ 复刻版。基于 SDL2 开发的《金庸群侠传》游戏,资源大部分来自 DOS 版本,目前已完工可以正常运行。

111.wiliwili

专为手柄控制设计的第三方 B 站客户端。一个用 C++ 编写的适用于 Nintendo Switch 的 B 站客户端,拥有接近 B 站官方 PC 客户端的浏览体验,同时支持触屏与手柄按键操控。

112.GASDocumentation

虚幻引擎 5 之 GAS 插件上手教程。该项目是讲解如何使用虚幻引擎 5 的 GameplayAbilitySystem 插件,作者从什么是 GAS 开始,最后用 GAS 做出了一个简单的多人射击游戏。如果你对虚幻引擎 5 感兴趣而且会 C++ 的话,那么看完这份教程一定会让你有所收获。

113.organicmaps

一款免费、没广告的离线地图应用。适用于旅行者、游客、徒步旅行者和骑行者的 Android 和 iOS 离线地图应用,它使用 OpenStreetMap 数据,支持详细的离线地图、骑行路线、语音导航、等高线、海拔剖面、山峰和坡度等功能。

114.tesseract

一款“老当益壮”的 OCR 引擎。这个项目最早诞生于 1985 年,几经易主在 2005 年的时候 HP 将其开源。目前,Tesseract 已经成为 OCR 领域 Star 数最多的开源项目,它支持包括中文在内的 100 多种语言,具有精准度高、跨平台等特点。

115.Magisk

Android 获取 Root 权限的工具。它可以快速、无痛地获得 Android 的超级用户权限,支持 Android 5.0 以上的设备。

116.osquery

像数据库一样查询设备的工具。它将操作系统抽象成一个数据库,让用户可以通过 SQL 查询操作系统的运行情况,比如运行中的进程、网络连接、文件和用户。攻击者一般会在运行恶意程序后删掉程序,通过 osquery 可以轻松找到没有源文件的进程。

1
2
3
4
osquery> SELECT name, path, pid FROM processes WHERE on_disk = 0;
name = Drop_Agent
path = /Users/jim/bin/dropage
pid = 561

117.finalcut

用于创建基于文本的用户界面的 C++ 库。它除了支持鼠标操作和同时处理多个文本窗,还提供了常见的对话框、按钮、复选框、单选按钮、输入行、列表框、状态栏等控件

118.vcpkg

微软开源的 C/C++ 包管理工具。安装和管理 C/C++ 依赖的命令行工具,适用于 Windows、Linux 和 macOS 操作系统。快速入门

119.albert

Linux 平台下类似于 Mac Alfred 效率神器。支持开机自启动、自定义快捷键等功能

持续更新中…