興趣是最好的老師,HelloGitHub 就是幫你找到興趣!
簡介
分享 GitHub 上有趣、入門級的開源專案。
這是一個面向程式設計新手、熱愛程式設計、對開源社群感興趣 人群的月刊,月刊的內容包括:各種程式語言的專案、讓生活變得更美好的工具、書籍、學習筆記、教程等,這些開源專案大多都是非常容易上手,而且非常 Cool。主要是希望大家能動手用起來,加入到開源社群中。
- 會程式設計的可以貢獻程式碼
- 不會程式設計的可以反饋使用這些工具中的 Bug
- 幫著宣傳你覺得優秀的專案
- Star 專案⭐️
在瀏覽、參與這些專案的過程中,你將學習到更多程式設計知識、提高程式設計技巧、找到程式設計的樂趣。
? 最後 HelloGitHub 這個專案就誕生了 ?
以下為本期內容|每個月 28 號釋出最新一期|點選檢視往期內容
C 專案
1、smartdns:一個執行在本地的 DNS 伺服器。能夠提高網路訪問速度等諸多妙用,架構圖如下:
2、xmake:一個基於 Lua 的輕量級跨平臺自動構建工具。支援在各種主流平臺上構建專案,主要用於解決 C/C++ 專案的跨平臺構建,同時支援與其他語言的混合編譯。工程配置語法簡單易讀,對初學者友好、上手方便
add_requires("libuv master", "ffmpeg", "zlib 1.20.*", "tbox >1.6.1")
target("test")
set_kind("shared")
add_files("src/*.c")
add_packages("libuv", "ffmpeg", "tbox", "zlib")
複製程式碼
C# 專案
3、gui.cs:支援 Windows 和 Linux/Unix 的 .NET 終端 UI 工具庫。方便實現終端 GUI 工具,並且可以實現終端中用滑鼠啦
4、Blog.Core:基於 ASP.NET Core 和 Vue 從零開始搭建前後端分離專案教程+實戰專案。該專案從 .NET Core 基礎講起,內容完整、系統,對初學者和有一定基礎的小夥伴都有借鑑和學習的價值
C++ 專案
5、ThreadPool:一個簡單的 C++11 執行緒池實現,程式碼加起來不到 100 行。示例程式碼:
// 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;
複製程式碼
6、xournalpp:一款支援 PDF 手寫註釋的筆記軟體,支援 Linux、Windows、macOS 平臺。看書的時候喜歡標註、做筆記,那這款工具肯定適合你。下載地址
7、pika:一個企業級開源的可持久化的大容量(百G)redis 儲存服務。相容 redis 的絕大部分介面,解決 redis 由於儲存資料量巨大而導致記憶體不夠用的容量瓶頸。並且可以像 redis 一樣,通過 slaveof 命令進行主從備份,支援全同步和部分同步
Go 專案
8、pg_flame:Postgres 資料庫效能分析工具,把 EXPLAIN ANALYZE
結果通過火焰圖展示
9、goproxy:Go 模組安裝代理工具。還在因為安裝 Go 專案依賴失敗而抓耳撓腮嗎?快試試這個專案吧
10、gods:簡單易用的 Go 語言各種資料結構和演算法,並封裝成了一個庫,開箱即食。示例程式碼:
type Stack interface {
Push(value interface{})
Pop() (value interface{}, ok bool)
Peek() (value interface{}, ok bool)
containers.Container
// Empty() bool
// Size() int
// Clear()
// Values() []interface{}
}
複製程式碼
11、gowp:Go 高效能非同步併發執行緒池。介面呼叫簡單、支援錯誤返回、無論排隊多少任務,都不會阻止提交任務。可用於控制併發訪問、併發執行。示例程式碼:
package main
import (
"fmt"
"time"
"github.com/xxjwxc/gowp/workpool"
)
func main() {
wp := workpool.New(10) //設定最大執行緒數
for i := 0; i < 20; i++ { //開啟20個請求
ii := i
wp.Do(func() error {
for j := 0; j < 10; j++ { //每次列印0-10的值
time.Sleep(1 * time.Second)
}
return nil
})
}
wp.Wait()
fmt.Println("down")
}
複製程式碼
12、gf:一款高效能、功能豐富的 Go Web 框架。特點:
- 模組化、鬆耦合設計
- 模組豐富,開箱即用
- 簡便及可維護性為宗旨
- 詳盡的開發文件及示例
- 完善的本地中文化支援
- 等等
Java 專案
13、SnowJena:基於令牌桶演算法實現的分散式無鎖限流框架。簡單易用的 API,開箱即用、支援熔斷降級、動態配置規則、視覺化監控等功能。示例程式碼:
public class AppTest {
Logger logger = LoggerFactory.getLogger(getClass());
/**
* 本地限流
*/
@Test
public void test1() {
// 1.配置規則
RateLimiterRule rateLimiterRule = new RateLimiterRuleBuilder()
.setLimit(1)
.setPeriod(1)
.setUnit(TimeUnit.SECONDS) //每秒令牌數為1
.build();
// 2.工廠模式生產限流器
RateLimiter limiter = RateLimiterFactory.of(rateLimiterRule);
// 3.使用
while (true) {
if (limiter.tryAcquire()) {
logger.info("ok");
}
}
}
}
複製程式碼
14、holer:一個將區域網中的應用對映到公網訪問的埠對映軟體,支援轉發基於 TCP 協議的報文。內網穿透工具,包含 Web 後臺管理系統。用到的技術如下:
- 服務端採用 SpringBoot 和 Netty 實現
- 客戶端採用 Java Netty 和 Go 語言實現
15、miaosha:一款秒殺系統設計與實現。高併發大流量的秒殺是面試常見問題,該專案不僅有具體問題的解決思路,還有具體程式碼實現和示例 demo,全部理解、學習後相信秒殺問題再也攔不住你啦
JavaScript 專案
16、postwoman:一款基於 Node.js 的免費開源、便捷美觀的 API 除錯工具。它是除錯介面的利器,能夠儘快的發現問題提高開發效率。相信體會過 Postman 的同學,看到這個專案的名字就已經躍躍欲試了
17、react-text-loop:實現文字迴圈展示的 React 元件
18、uform:一款面向企業級複雜場景的高效能表單解決方案。特性:
- ? 高效能,欄位分散式渲染,大大減輕 React 渲染壓力
- ? 支援 Ant Design/Fusion Next 元件體系
- ? JSX 標籤化寫法/JSON Schema 資料驅動方案無縫遷移過渡
- ? 副作用邏輯獨立管理,涵蓋各種複雜聯動校驗邏輯
- ? 支援各種表單複雜佈局方案
19、rc-bullets:基於 CSS3 Animation 使用 React 構建的彈幕元件。演示地址,支援功能:
- 管理彈幕:暫停、隱藏、清屏等
- 設定彈幕:速度、迴圈次數、延遲播放、自定義動畫型別等
import React, { useEffect, useState } from 'react';
import BulletScreen, { StyledBullet } from 'rc-bullets';
const headUrl='https://zerosoul.github.io/rc-bullets/assets/img/heads/girl.jpg';
export default function Demo() {
// 彈幕螢幕
const [screen, setScreen] = useState(null);
// 彈幕內容
const [bullet, setBullet] = useState('');
useEffect(() => {
// 給頁面中某個元素初始化彈幕螢幕,一般為一個大區塊
let s = new BulletScreen('.screen');
// or
// let s=new BulletScreen(document.querySelector('.screen));
setScreen(s);
}, []);
// 彈幕內容輸入事件處理
const handleChange = ({ target: { value } }) => {
setBullet(value);
};
// 傳送彈幕
const handleSend = () => {
if (bullet) {
// push 純文字
screen.push(bullet);
// or 使用 StyledBullet
screen.push(
<StyledBullet
head={headUrl}
msg={bullet}
></StyledBullet>
);
// or 還可以這樣使用,效果等同使用 StyledBullet 元件
screen.push({msg:bullet,head:headUrl,color:"#eee" bgColor:"rgba(2,2,2,.3)"})
}
};
return (
<main>
<div className="screen" style={{ width: '100vw', height: '80vh' }}></div>
<input value={bullet} onChange={handleChange} />
<button onClick={handleSend}>傳送</button>
</main>
);
}
複製程式碼
20、react-loading:一款輕量、開箱即用並且支援按需載入的 React 動畫元件庫。示例程式碼:
import React from 'react';
import { DisappearedLoading } from 'react-loadingg';
const Container = () => <DisappearedLoading ></DisappearedLoading>;
export default Container;
複製程式碼
Kotlin 專案
21、SketchyComponent:一款 Android 上的手繪風格元件庫。該庫提供了一些基礎圖形和 icon,以及便捷的自定義能力。之前介紹過手繪風格的圖表庫大家很喜歡,這回是 Android 元件庫不知道對不對大家的胃口。示例程式碼:
// 1. 建立 Sketchy 圖形
val skSquareDrawable = SkSquareDrawable().apply {
// 2. 設定屬性
fillColor = resources.getColor(android.R.color.holo_orange_dark)
}
// 3. 給 View 設定背景
text.background = skSquareDrawable
複製程式碼
Python 專案
22、memory_profiler:Python 程式記憶體佔用分析工具。示例程式碼:
# 採用裝飾器的方式引用,不影響現有程式碼
@profile
def my_func():
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a
if __name__ == '__main__':
my_func()
# 執行命令:python -m memory_profiler example.py
# 輸出:
Line # Mem usage Increment Line Contents
==============================================
3 @profile
4 5.97 MB 0.00 MB def my_func():
5 13.61 MB 7.64 MB a = [1] * (10 ** 6)
6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7)
7 13.61 MB -152.59 MB del b
8 13.61 MB 0.00 MB return a
複製程式碼
23、PySimpleGUI:Python GUI 程式設計庫,它是將 tkinter、Qt、Remi、WxPython 封裝成更人性化的介面。示例程式碼和效果如下:
import PySimpleGUI as sg
sg.theme('DarkAmber') # 設定主題顏色
# 介面內包含的東西
layout = [ [sg.Text('Some text on Row 1')],
[sg.Text('Enter something on Row 2'), sg.InputText()],
[sg.Button('Ok'), sg.Button('Cancel')] ]
# 建立視窗
window = sg.Window('Window Title', layout)
# 監聽事件
while True:
event, values = window.read()
if event in (None, 'Cancel'): # 使用者點選取消按鈕事件
break
print('You entered ', values[0])
window.close()
複製程式碼
24、mitmproxy:基於 Python 語言開發的抓包工具。支援命令列、Web 平臺的形式展示抓包結果,還能通過 Python 引用庫來攔截、控制響應和請求。下圖展示為命令列使用介面(類 vim 操作)
25、PythonPlantsVsZombies:Python 語言編寫的植物大戰殭屍。學習如何使用 Python 編寫小遊戲的極佳例子,執行步驟:
1. 需要 Python 3
2. 安裝依賴庫:pip install pygame
3. python main.py
複製程式碼
Ruby 專案
26、pghero:Postgres 效能監控服務。讓你對 pg 資料庫的效能瞭如指掌
其它
27、clean-code-javascript:《Clean Code JavaScript》(JavaScript 程式碼整潔之道),這是根據《程式碼整潔之道》作者多年經驗整理的 JS 程式碼優化建議,但也僅僅只是一份建議。中文
28、wenyan-lang:文言文程式語言。文言文語法,可以編譯成 JavaScript、Python 或者 Ruby,你見過用文言文編寫程式嗎?快來試試吧。線上嘗試
29、short_url:Elixir 語言開發的支援自定義短碼的短連結服務。新手可以參考該專案原始碼和原理解析,理解、實現短連結服務的同時,體驗用 Elixir 語言開發一個 Web 服務。線上嘗試
30、pytest-chinese-doc:pytest 自動化測試框架的官方文件(5.1.3 版本)的中文翻譯。但不僅僅是簡單的翻譯:
- 更多的示例:所有的示例程式碼都在 docs 目錄下,以章節劃分,儘量覆蓋每個知識點
- 更多的擴充閱讀:新增了學習時所查閱的資料、閱讀的原始碼等,也是作者學習和思考的歷程
開源書籍
31、machine-learning-systems-design:一本關於機器學習系統設計的小冊子附有練習題
32、front-end-handbook-2019:《Front-End Developer Handbook 2019》(前端開發者手冊 2019 版)。該書適合任何階段的人用來了解前端開發實踐的指南,它概述和討論了前端工程的實踐:如何學習前端、在 2019 年進行前端實踐時應該使用哪些工具。線上閱讀
機器學習
33、SSD-Pytorch:完整的目標檢測專案。結構簡潔明瞭,中文註釋。適宜新手入門、目標檢測任務參考,甚至直接基於本專案實現目標檢測任務。示例程式碼:
# 例項化模型:模型的具體各種引數在 Config 檔案中進行配置
net = SSD(cfg)
# 將模型移動到 GPU 上,cfg.DEVICE.MAINDEVICE 定義了模型所使用的主 GPU
# 模型的引數更新會在主 GPU 上進行
net.to(cfg.DEVICE.MAINDEVICE)
# 初始化訓練器:訓練器引數已通過 cfg 進行配置;也可傳入引數進行配置(但不建議)
trainer = Trainer(cfg, max_iter=None, batch_size=None,
train_devices=None, model_save_step=None,
model_save_root=None, vis = None, vis_step=None)
# 訓練器開始:在資料集上訓練模型
trainer(net, train_dataset)
複製程式碼
34、AIDungeon:一個基於機器學習的地下城文字遊戲。此專案介紹瞭如何使用機器學習構建一個遊戲,程式碼簡單清晰適合 AI 愛好者深入研究
35、face_recognition:上手快速、簡單易用的人臉識別庫。該庫使用 dlib 頂尖的深度學習人臉識別技術構建,在戶外臉部檢測資料庫基準(Labeled Faces in the Wild benchmark)上的準確率高達 99.38%。同時提供了一個簡單的面部識別命令列工具,允許您對來自命令列的影像資料夾進行面部識別。完整的開發文件和應用案例,並且相容樹莓派系統(對配置要求低),對於初學者來說可以通過這個專案感受人臉識別或機器學習帶來的樂趣。示例程式碼:
# 定點陣圖片中的所有人臉:
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_locations = face_recognition.face_locations(image)
# 識別人臉關鍵點,包括眼睛、鼻子、嘴和下巴
import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)
複製程式碼
“看完了,還不夠?<往期內容> | 還不過癮,那就看看每天更新的前端日報吧 <今日前端>”
如果你發現了好玩、有意義的開源專案 點選這裡 分享你覺得有趣的專案。
最後
如果你發現了 GitHub 上有趣的專案,歡迎在 HelloGitHub 專案提 issues 告訴我們。