32 |
The Project
33 |
34 |
Contributing Guide •
35 |
API for this project •
36 |
Issues •
37 |
Pull Requests •
38 |
License
39 |
40 |
41 |
42 |
51 |
52 |
53 |
54 | ---
55 |
56 |
57 |
58 |
88 |
89 |
90 |
91 | ---
92 |
93 |
94 |
95 | ## Index
96 |
97 | - [Animals](#animals)
98 | - [Anime](#anime)
99 | - [Anti-Malware](#anti-malware)
100 | - [Art & Design](#art--design)
101 | - [Authentication & Authorization](#authentication--authorization)
102 | - [Blockchain](#blockchain)
103 | - [Books](#books)
104 | - [Business](#business)
105 | - [Calendar](#calendar)
106 | - [Cloud Storage & File Sharing](#cloud-storage--file-sharing)
107 | - [Continuous Integration](#continuous-integration)
108 | - [Cryptocurrency](#cryptocurrency)
109 | - [Currency Exchange](#currency-exchange)
110 | - [Data Validation](#data-validation)
111 | - [Development](#development)
112 | - [Dictionaries](#dictionaries)
113 | - [Documents & Productivity](#documents--productivity)
114 | - [Email](#email)
115 | - [Entertainment](#entertainment)
116 | - [Environment](#environment)
117 | - [Events](#events)
118 | - [Finance](#finance)
119 | - [Food & Drink](#food--drink)
120 | - [Games & Comics](#games--comics)
121 | - [Geocoding](#geocoding)
122 | - [Government](#government)
123 | - [Health](#health)
124 | - [Jobs](#jobs)
125 | - [Machine Learning](#machine-learning)
126 | - [Music](#music)
127 | - [News](#news)
128 | - [Open Data](#open-data)
129 | - [Open Source Projects](#open-source-projects)
130 | - [Patent](#patent)
131 | - [Personality](#personality)
132 | - [Phone](#phone)
133 | - [Photography](#photography)
134 | - [Programming](#programming)
135 | - [Science & Math](#science--math)
136 | - [Security](#security)
137 | - [Shopping](#shopping)
138 | - [Social](#social)
139 | - [Sports & Fitness](#sports--fitness)
140 | - [Test Data](#test-data)
141 | - [Text Analysis](#text-analysis)
142 | - [Tracking](#tracking)
143 | - [Transportation](#transportation)
144 | - [URL Shorteners](#url-shorteners)
145 | - [Vehicle](#vehicle)
146 | - [Video](#video)
147 | - [Weather](#weather)
148 |
149 | ### Animals
150 |
151 | | API | Description | Auth | HTTPS | CORS |
152 | | ---------------------------------------------------------------- | ---------------------------------------- | -------- | ----- | ------- |
153 | | [AdoptAPet](https://www.adoptapet.com/public/apis/pet_list.html) | Resource to help get pets adopted | `apiKey` | Yes | Yes |
154 | | [Axolotl](https://theaxolotlapi.netlify.app/) | Collection of axolotl pictures and facts | No | Yes | No |
155 | | [xeno-canto](https://xeno-canto.org/explore/api) | Bird recordings | No | Yes | Unknown |
156 | | [Zoo Animals](https://zoo-animal-api.herokuapp.com/) | Facts and pictures of zoo animals | No | Yes | Yes |
157 |
158 | **[⬆ Back to Index](#index)**
159 |
160 | ### Anime
161 |
162 | | API | Description | Auth | HTTPS | CORS |
163 | | -------------------------------------------------------- | ------------------------------------------------------------------------ | -------- | ----- | ------- |
164 | | [AniAPI](https://aniapi.com/docs/) | Anime discovery, streaming & syncing with trackers | `OAuth` | Yes | Yes |
165 | | [AniDB](https://wiki.anidb.net/HTTP_API_Definition) | Anime Database | `apiKey` | No | Unknown |
166 | | [AniList](https://github.com/AniList/ApiV2-GraphQL-Docs) | Anime discovery & tracking | `OAuth` | Yes | Unknown |
167 | | [Waifu.im](https://waifu.im/docs) | Get waifu pictures from an archive of over 4000 images and multiple tags | No | Yes | Yes |
168 | | [Waifu.pics](https://waifu.pics/docs) | Image sharing platform for anime images | No | Yes | No |
169 |
170 | **[⬆ Back to Index](#index)**
171 |
--------------------------------------------------------------------------------
/db.ts:
--------------------------------------------------------------------------------
1 | import {
2 | fromMarkdown,
3 | gfm,
4 | gfmFromMarkdown,
5 | gfmToMarkdown,
6 | render,
7 | toMarkdown,
8 | } from "./deps.ts";
9 | import {
10 | DayInfo,
11 | DBIndex,
12 | DBMeta,
13 | ExpiredValue,
14 | File,
15 | FileInfo,
16 | Item,
17 | WeekOfYear,
18 | } from "./interface.ts";
19 | import log from "./log.ts";
20 | import formatMarkdownItem from "./format-markdown-item.ts";
21 | import {
22 | getDayNumber,
23 | getDbContentHtmlPath,
24 | getDbContentPath,
25 | getDbItemsPath,
26 | getWeekNumber,
27 | parseDayInfo,
28 | parseWeekInfo,
29 | readJSONFile,
30 | readTextFile,
31 | writeJSONFile,
32 | writeTextFile,
33 | } from "./util.ts";
34 | export type StringOrNumber = string | number;
35 | export function getFile(
36 | sourceIdentifier: string,
37 | filepath: string,
38 | ): Promise
{
39 | const fileDbPath = getDbContentPath(sourceIdentifier, filepath);
40 | return readTextFile(fileDbPath);
41 | }
42 | export function getHtmlFile(
43 | sourceIdentifier: string,
44 | filepath: string,
45 | ): Promise {
46 | const fileDbPath = getDbContentHtmlPath(sourceIdentifier, filepath);
47 | return readTextFile(fileDbPath);
48 | }
49 | export async function updateFile(
50 | fileInfo: FileInfo,
51 | content: string,
52 | stars: Record,
53 | ) {
54 | const file = fileInfo.filepath;
55 | const sourceConfig = fileInfo.sourceConfig;
56 | const sourceIdentifier = sourceConfig.identifier;
57 | // check items length
58 | const tree = fromMarkdown(content, "utf8", {
59 | extensions: [gfm()],
60 | mdastExtensions: [gfmFromMarkdown()],
61 | });
62 |
63 | // format link etc.
64 | const overviewMarkdownTree = await formatMarkdownItem(tree, fileInfo, stars);
65 | const overviewMarkdownContent = toMarkdown(
66 | overviewMarkdownTree,
67 | {
68 | extensions: [gfmToMarkdown()],
69 | },
70 | );
71 | const dbContentPath = getDbContentPath(sourceIdentifier, file);
72 | await writeTextFile(dbContentPath, overviewMarkdownContent);
73 | // also write html
74 | const dbContentHtmlPath = getDbContentHtmlPath(sourceIdentifier, file);
75 | const htmlContent = render(overviewMarkdownContent, {
76 | allowIframes: true,
77 | });
78 | await writeTextFile(dbContentHtmlPath, htmlContent);
79 | }
80 | export async function updateItems(
81 | fileInfo: FileInfo,
82 | items: Record,
83 | dbIndex: DBIndex,
84 | ) {
85 | const file = fileInfo.filepath;
86 | const sourceConfig = fileInfo.sourceConfig;
87 | const sourceIdentifier = sourceConfig.identifier;
88 | const sourceCategory = sourceConfig.category;
89 | const itemKeys = Object.keys(items);
90 | if (itemKeys.length === 0) {
91 | return;
92 | }
93 | const dbItemsPath = getDbItemsPath(
94 | fileInfo.sourceConfig.identifier,
95 | fileInfo.filepath,
96 | );
97 | await writeJSONFile(dbItemsPath, items);
98 |
99 | // write to index
100 | // delete old index
101 | const keys = Object.keys(dbIndex);
102 | for (const key of keys) {
103 | if (key.startsWith(sourceIdentifier + ":")) {
104 | delete dbIndex[key];
105 | }
106 | }
107 | for (const itemKey of itemKeys) {
108 | const item = items[itemKey];
109 | dbIndex[`${sourceIdentifier}:${fileInfo.filepath}:${item.sha1}`] = {
110 | t: new Date(item.updated_at).getTime(),
111 | d: item.updated_day,
112 | w: item.updated_week,
113 | };
114 | }
115 | }
116 |
117 | export interface UpdatedItemsParam {
118 | since_date: Date;
119 | source_identifiers?: string[];
120 | }
121 | export interface ItemsResult {
122 | items: Record;
123 | since_id: number;
124 | has_next: boolean;
125 | }
126 | export function getItems(
127 | sourceIdentifier: string,
128 | file: string,
129 | ): Promise> {
130 | const dbItemsPath = getDbItemsPath(sourceIdentifier, file);
131 | return readJSONFile(dbItemsPath) as Promise>;
132 | }
133 | export async function getItemsByDays(
134 | days: number[],
135 | dbIndex: DBIndex,
136 | isDay: boolean,
137 | ): Promise> {
138 | const keys = Object.keys(dbIndex);
139 | const items: Record = {};
140 | const indexKey = isDay ? "d" : "w";
141 | const todos: Record = {};
142 | for (const key of keys) {
143 | const item = dbIndex[key];
144 |
145 | if (days.includes(item[indexKey])) {
146 | const arr = key.split(":");
147 | const sourceIdentifier = arr[0];
148 | const file = arr[1];
149 | const sha1 = arr[2];
150 | const dbItemsPath = getDbItemsPath(sourceIdentifier, file);
151 | if (!todos[dbItemsPath]) {
152 | todos[dbItemsPath] = [];
153 | }
154 | todos[dbItemsPath].push(sha1);
155 | }
156 | }
157 | const todoKeys = Object.keys(todos);
158 | const promises: Promise[] = [];
159 | for (const todoKey of todoKeys) {
160 | promises.push(readJSONFile(todoKey));
161 | }
162 | let rIndex = 0;
163 | const results = await Promise.all(promises) as unknown as Record<
164 | string,
165 | Item
166 | >[];
167 | for (const result of results) {
168 | for (const sha1 of todos[todoKeys[rIndex]]) {
169 | if (!result[sha1]) {
170 | throw new Error(`sha1 ${sha1} not found in ${todoKeys[rIndex]}`);
171 | }
172 | items[sha1] = result[sha1];
173 | }
174 | rIndex++;
175 | }
176 | return items;
177 | }
178 | export async function getDayItems(
179 | dayNumber: number,
180 | dbIndex: DBIndex,
181 | isDay: boolean,
182 | ): Promise> {
183 | const keys = Object.keys(dbIndex);
184 | const items: Record = {};
185 | const indexKey = isDay ? "d" : "w";
186 |
187 | const todos: Record = {};
188 | for (const key of keys) {
189 | const item = dbIndex[key];
190 | if (item[indexKey] === dayNumber) {
191 | const arr = key.split(":");
192 | const sourceIdentifier = arr[0];
193 | const file = arr[1];
194 | const sha1 = arr[2];
195 | const dbItemsPath = getDbItemsPath(sourceIdentifier, file);
196 | if (!todos[dbItemsPath]) {
197 | todos[dbItemsPath] = [];
198 | }
199 | todos[dbItemsPath].push(sha1);
200 | }
201 | }
202 |
203 | const todoKeys = Object.keys(todos);
204 | const promises: Promise[] = [];
205 | for (const todoKey of todoKeys) {
206 | promises.push(readJSONFile(todoKey));
207 | }
208 | let rIndex = 0;
209 | const results = await Promise.all(promises) as unknown as Record<
210 | string,
211 | Item
212 | >[];
213 | for (const result of results) {
214 | for (const sha1 of todos[todoKeys[rIndex]]) {
215 | if (!result[sha1]) {
216 | throw new Error(`sha1 ${sha1} not found in ${todoKeys[rIndex]}`);
217 | }
218 | items[sha1] = result[sha1];
219 | }
220 | rIndex++;
221 | }
222 | return items;
223 | }
224 | export function getUpdatedFiles(
225 | options: UpdatedItemsParam,
226 | dbIndex: DBIndex,
227 | ): File[] {
228 | const filesSet: Set = new Set();
229 | const keys = Object.keys(dbIndex);
230 | for (const key of keys) {
231 | const item = dbIndex[key];
232 | const arr = key.split(":");
233 | const sourceIdentifier = arr[0];
234 | const file = arr[1];
235 | if (options.since_date) {
236 | if (item.t < options.since_date?.getTime()) {
237 | continue;
238 | }
239 | }
240 | if (options.source_identifiers && options.source_identifiers.length > 0) {
241 | if (!options.source_identifiers.includes(sourceIdentifier)) {
242 | continue;
243 | }
244 | }
245 | filesSet.add(`${sourceIdentifier}:${file}`);
246 | }
247 | const files: File[] = [];
248 |
249 | for (const file of filesSet) {
250 | const arr = file.split(":");
251 | const sourceIdentifier = arr[0];
252 | const filepath = arr[1];
253 | files.push({
254 | source_identifier: sourceIdentifier,
255 | file: filepath,
256 | });
257 | }
258 |
259 | return files;
260 | }
261 | export function getUpdatedDays(
262 | dbIndex: DBIndex,
263 | options: UpdatedItemsParam,
264 | isDay: boolean,
265 | ): (DayInfo | WeekOfYear)[] {
266 | const days: (DayInfo | WeekOfYear)[] = [];
267 | const daysSet: Set = new Set();
268 | const keys = Object.keys(dbIndex);
269 | const indexKey = isDay ? "d" : "w";
270 | for (const key of keys) {
271 | const item = dbIndex[key];
272 | const arr = key.split(":");
273 | const sourceIdentifier = arr[0];
274 | const file = arr[1];
275 | const sha1 = arr[2];
276 | if (options.since_date) {
277 | if (item.t < options.since_date?.getTime()) {
278 | continue;
279 | }
280 | }
281 | if (options.source_identifiers && options.source_identifiers.length > 0) {
282 | if (!options.source_identifiers.includes(sourceIdentifier)) {
283 | continue;
284 | }
285 | }
286 | daysSet.add(item[indexKey]);
287 | }
288 | return Array.from(daysSet).sort((a, b) => b - a).map((day) => {
289 | if (isDay) {
290 | return parseDayInfo(day);
291 | } else {
292 | return parseWeekInfo(day);
293 | }
294 | });
295 | }
296 |
--------------------------------------------------------------------------------
/fetch-sources.ts:
--------------------------------------------------------------------------------
1 | import {
2 | getDayNumber,
3 | getDbCachedStars,
4 | getDbIndex,
5 | getDbMeta,
6 | getWeekNumber,
7 | sha1,
8 | writeDbCachedStars,
9 | writeDbIndex,
10 | writeDbMeta,
11 | writeJSONFile,
12 | } from "./util.ts";
13 | import parser from "./parser/mod.ts";
14 | import log from "./log.ts";
15 | import {
16 | FileInfo,
17 | Item,
18 | ParsedItemsFilePath,
19 | RepoMetaOverride,
20 | RunOptions,
21 | } from "./interface.ts";
22 | import initItems from "./init-items.ts";
23 | import Github from "./adapters/github.ts";
24 | import { getItems, updateFile, updateItems } from "./db.ts";
25 | import renderMarkdown from "./render-markdown.ts";
26 | export default async function (options: RunOptions) {
27 | const force = options.forceFetch;
28 | const isRebuild = options.rebuild;
29 | const config = options.config;
30 | const file_min_updated_hours = config.file_min_updated_hours;
31 | const sourcesMap = config.sources;
32 | let sourceIdentifiers = options.sourceIdentifiers;
33 | let isSpecificSource = true;
34 | if (sourceIdentifiers.length === 0) {
35 | isSpecificSource = false;
36 | sourceIdentifiers = Object.keys(sourcesMap);
37 | }
38 | // limit
39 | const limit = options.limit;
40 | if (limit && limit > 0) {
41 | sourceIdentifiers = sourceIdentifiers.slice(0, limit);
42 | }
43 | const dbMeta = await getDbMeta();
44 | const dbIndex = await getDbIndex();
45 | const dbCachedStars = await getDbCachedStars();
46 | const dbSources = dbMeta.sources;
47 |
48 | const invalidFiles: ParsedItemsFilePath[] = [];
49 | let sourceIndex = 0;
50 |
51 | try {
52 | for (const sourceIdentifier of sourceIdentifiers) {
53 | sourceIndex++;
54 | log.info(
55 | `[${sourceIndex}/${sourceIdentifiers.length}] Fetching source: ${sourceIdentifier}`,
56 | );
57 | const source = sourcesMap[sourceIdentifier];
58 | const files = source.files;
59 |
60 | if (!dbSources[sourceIdentifier] || (isSpecificSource && isRebuild)) {
61 | // need to init source
62 | await initItems(source, options, dbMeta, dbIndex, dbCachedStars);
63 | continue;
64 | } else {
65 | // check is all files is init
66 | const dbSource = dbSources[sourceIdentifier];
67 | const dbFiles = dbSource.files;
68 | const dbFileKeys = Object.keys(dbFiles);
69 | const isAllFilesInit = Object.keys(files).every((file) => {
70 | return dbFileKeys.includes(file);
71 | });
72 | if (!isAllFilesInit) {
73 | // need to init source
74 | await initItems(source, options, dbMeta, dbIndex, dbCachedStars);
75 | continue;
76 | }
77 | }
78 |
79 | const dbSource = dbSources[sourceIdentifier];
80 | const dbFiles = dbSource.files;
81 | const api = new Github(source);
82 | const fileKeys = Object.keys(files);
83 | let fileIndex = 0;
84 | // get file content and save it to raw data path
85 | for (const file of fileKeys) {
86 | fileIndex++;
87 | const dbFileMeta = dbFiles[file];
88 | let isRebuild = false;
89 |
90 | if (dbFileMeta) {
91 | const dbFileMetaUpdatedAt = new Date(dbFileMeta.updated_at);
92 | if (dbFileMetaUpdatedAt.getTime() === 0) {
93 | log.info(
94 | `[${fileIndex}/${fileKeys.length}] ${source.identifier}/${file} is parsed failed, try to rebuild it.`,
95 | );
96 | isRebuild = true;
97 | }
98 | }
99 |
100 | if (!dbFileMeta) {
101 | // reinit items
102 | isRebuild = true;
103 | }
104 |
105 | if (isRebuild) {
106 | await initItems(source, options, dbMeta, dbIndex, dbCachedStars);
107 | break;
108 | }
109 |
110 | // check is updated
111 |
112 | const dbFileUpdated = new Date(dbFileMeta.checked_at);
113 |
114 | const now = new Date();
115 | const diff = now.getTime() - dbFileUpdated.getTime();
116 |
117 | if (!force && (diff / 1000 / 60 / 60) < file_min_updated_hours) {
118 | // add max number function
119 | // not updated
120 | log.info(
121 | `${fileIndex}/${fileKeys.length}${sourceIdentifier}/${file} updated less than ${file_min_updated_hours} hours, skip`,
122 | );
123 | continue;
124 | } else if (force) {
125 | log.info(
126 | `${sourceIdentifier}/${file} updated less than ${file_min_updated_hours} hours, force update`,
127 | );
128 | }
129 | log.info(
130 | `${sourceIndex}/${sourceIdentifiers.length} try updating ${sourceIdentifier}/${file}`,
131 | );
132 | const content = await api.getConent(file, source.default_branch);
133 | const contentSha1 = await sha1(content);
134 | const dbFileSha1 = dbFileMeta.sha1;
135 | log.debug(
136 | "dbFileSha1",
137 | dbFileSha1,
138 | "latest file contentSha1",
139 | contentSha1,
140 | );
141 |
142 | if (dbFileSha1 === contentSha1 && !force) {
143 | log.info(`${file} is up to date, cause sha1 is same`);
144 | // update checked_at
145 | dbFileMeta.checked_at = new Date().toISOString();
146 | continue;
147 | } else {
148 | let items: Record = {};
149 | try {
150 | items = await getItems(sourceIdentifier, file);
151 | } catch (e) {
152 | log.warn(`get items error`, e);
153 | // try to reinit
154 | await initItems(source, options, dbMeta, dbIndex, dbCachedStars);
155 | continue;
156 | }
157 | const fileInfo: FileInfo = {
158 | sourceConfig: source,
159 | filepath: file,
160 | sourceMeta: dbSource,
161 | };
162 |
163 | const docItems = await parser(content, fileInfo, dbCachedStars);
164 | //compare updated items
165 | const newItems: Record = {};
166 | let newCount = 0;
167 | let totalCount = 0;
168 | let fileUpdatedAt = new Date(0);
169 |
170 | for (const docItem of docItems) {
171 | const itemSha1 = await sha1(docItem.rawMarkdown);
172 | totalCount++;
173 | // check markdown
174 | if (items[itemSha1]) {
175 | // it's a old item,
176 | // stay the same
177 | newItems[itemSha1] = {
178 | source_identifier: sourceIdentifier,
179 | file,
180 | sha1: itemSha1,
181 | markdown: docItem.formatedMarkdown,
182 | html: renderMarkdown(docItem.formatedMarkdown),
183 | category: docItem.category,
184 | category_html: renderMarkdown(docItem.category),
185 | updated_at: items[itemSha1].updated_at,
186 | checked_at: now.toISOString(),
187 | updated_day: items[itemSha1].updated_day,
188 | updated_week: items[itemSha1].updated_week,
189 | };
190 | if (new Date(items[itemSha1].updated_at) > fileUpdatedAt) {
191 | fileUpdatedAt = new Date(items[itemSha1].updated_at);
192 | }
193 | } else {
194 | newCount++;
195 | const now = new Date();
196 | // yes
197 | // this is a new item
198 | // add it to items
199 | newItems[itemSha1] = {
200 | source_identifier: sourceIdentifier,
201 | file,
202 | sha1: itemSha1,
203 | markdown: docItem.formatedMarkdown,
204 | html: renderMarkdown(docItem.formatedMarkdown),
205 | category: docItem.category,
206 | category_html: renderMarkdown(docItem.category),
207 | updated_at: now.toISOString(),
208 | checked_at: now.toISOString(),
209 | updated_day: getDayNumber(now),
210 | updated_week: getWeekNumber(now),
211 | };
212 | if (now > fileUpdatedAt) {
213 | fileUpdatedAt = now;
214 | }
215 | }
216 | }
217 |
218 | await updateFile(fileInfo, content, dbCachedStars);
219 | await updateItems(fileInfo, newItems, dbIndex);
220 |
221 | dbFiles[file] = {
222 | ...dbFiles[file],
223 | updated_at: fileUpdatedAt.toISOString(),
224 | checked_at: now.toISOString(),
225 | sha1: contentSha1,
226 | };
227 | log.info(
228 | `${sourceIndex}/${sourceIdentifiers.length} ${sourceIdentifier}/${file} updated, ${newCount} new items, ${totalCount} total items`,
229 | );
230 | if (totalCount < 10) {
231 | invalidFiles.push({
232 | sourceIdentifier,
233 | originalFilepath: file,
234 | });
235 | }
236 | // if total count is 0, print it``
237 | // also update repoMeta
238 |
239 | const metaOverrides: RepoMetaOverride = {};
240 | if (source.default_branch) {
241 | metaOverrides.default_branch = source.default_branch;
242 | }
243 | const meta = await api.getRepoMeta(metaOverrides);
244 | dbSource.meta = meta;
245 | dbMeta.sources[sourceIdentifier].meta = {
246 | ...dbSource.meta,
247 | ...meta,
248 | };
249 | }
250 | }
251 | dbMeta.sources[sourceIdentifier].files = dbFiles;
252 | dbMeta.sources[sourceIdentifier].updated_at = new Date().toISOString();
253 | }
254 | // write to dbMeta
255 | await writeDbMeta(dbMeta);
256 | await writeDbIndex(dbIndex);
257 | await writeDbCachedStars(dbCachedStars);
258 | } catch (e) {
259 | // write to dbMeta
260 | await writeDbMeta(dbMeta);
261 | await writeDbIndex(dbIndex);
262 | await writeDbCachedStars(dbCachedStars);
263 | throw e;
264 | }
265 | if (invalidFiles.length > 0) {
266 | log.error(`Some files is invalid, please check it manually`);
267 | log.error(invalidFiles);
268 | await writeJSONFile("temp-invalid-files.json", invalidFiles);
269 | }
270 | }
271 |
--------------------------------------------------------------------------------
/example/data/1-raw/EbookFoundation/free-programming-books/books/markdownlist_free-programming-books-zh.md:
--------------------------------------------------------------------------------
1 | ## 目录
2 |
3 | - [语言无关](#语言无关)
4 | - [版本控制](#版本控制)
5 | - [编程艺术](#编程艺术)
6 | - [编辑器](#编辑器)
7 | - [编译原理](#编译原理)
8 | - [操作系统](#操作系统)
9 | - [程序员杂谈](#程序员杂谈)
10 | - [大数据](#大数据)
11 | - [分布式系统](#分布式系统)
12 | - [管理和监控](#管理和监控)
13 | - [函数式概念](#函数式概念)
14 | - [计算机图形学](#计算机图形学)
15 | - [其它](#其它)
16 | - [软件开发方法](#软件开发方法)
17 | - [设计模式](#设计模式)
18 | - [数据库](#数据库)
19 | - [项目相关](#项目相关)
20 | - [在线教育](#在线教育)
21 | - [正则表达式](#正则表达式)
22 | - [智能系统](#智能系统)
23 | - [IDE](#ide)
24 | - [Web](#web)
25 | - [WEB 服务器](#web服务器)
26 | - [语言相关](#语言相关)
27 | - [Android](#android)
28 | - [Assembly](#assembly)
29 | - [AWK](#awk)
30 | - [C](#c)
31 | - [C#](#csharp)
32 | - [C++](#cpp)
33 | - [CoffeeScript](#coffeescript)
34 | - [Dart](#dart)
35 | - [Elasticsearch](#elasticsearch)
36 | - [Elixir](#elixir)
37 | - [Erlang](#erlang)
38 | - [Fortran](#fortran)
39 | - [Golang](#golang)
40 | - [Haskell](#haskell)
41 | - [HTML and CSS](#html-and-css)
42 | - [HTTP](#http)
43 | - [iOS](#ios)
44 | - [Java](#java)
45 | - [JavaScript](#javascript)
46 | - [AngularJS](#angularjs)
47 | - [Backbone.js](#backbonejs)
48 | - [D3.js](#d3js)
49 | - [Electron.js](#electronjs)
50 | - [ExtJS](#extjs)
51 | - [jQuery](#jquery)
52 | - [Node.js](#nodejs)
53 | - [React.js](#reactjs)
54 | - [Vue.js](#vuejs)
55 | - [Zepto.js](#zeptojs)
56 | - [LaTeX](#latex)
57 | - [LISP](#lisp)
58 | - [Lua](#lua)
59 | - [Markdown](#markdown)
60 | - [MySQL](#mysql)
61 | - [NoSQL](#nosql)
62 | - [Perl](#perl)
63 | - [PHP](#php)
64 | - [Laravel](#laravel)
65 | - [Symfony](#symfony)
66 | - [PostgreSQL](#postgresql)
67 | - [Python](#python)
68 | - [Django](#django)
69 | - [R](#r)
70 | - [reStructuredText](#restructuredtext)
71 | - [Ruby](#ruby)
72 | - [Rust](#rust)
73 | - [Scala](#scala)
74 | - [Scheme](#scheme)
75 | - [Scratch](#scratch)
76 | - [Shell](#shell)
77 | - [Swift](#swift)
78 | - [TypeScript](#typescript)
79 | - [Angular](#angular)
80 | - [Deno](#deno)
81 | - [VBA](#vba-microsoft-visual-basic-applications)
82 | - [Vim](#vim)
83 | - [Visual Prolog](#visual-prolog)
84 |
85 | ## 语言无关
86 |
87 | ### 版本控制
88 |
89 | - [沉浸式学 Git](https://web.archive.org/web/20191004044726/http://igit.linuxtoy.org:80/index.html)
90 | - [猴子都能懂的 GIT 入门](http://backlogtool.com/git-guide/cn/)
91 | - [学习 Git 分支](https://learngitbranching.js.org)
92 | - [Git - 简易指南](http://rogerdudler.github.io/git-guide/index.zh.html)
93 | - [Git 参考手册](http://gitref.justjavac.com)
94 | - [Git-Cheat-Sheet](https://github.com/flyhigher139/Git-Cheat-Sheet) - flyhigher139
95 | - [Git Community Book 中文版](http://gitbook.liuhui998.com)
96 | - [git-flow 备忘清单](http://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html)
97 | - [Git magic](http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/zh_cn/)
98 | - [Git Magic](http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/zh_cn/)
99 | - [Git 教程](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000) - 廖雪峰
100 | - [Github 帮助文档](https://github.com/waylau/github-help)
101 | - [GitHub 秘籍](https://snowdream86.gitbooks.io/github-cheat-sheet/content/zh/)
102 | - [Got GitHub](https://github.com/gotgit/gotgithub)
103 | - [GotGitHub](http://www.worldhello.net/gotgithub/index.html)
104 | - [HgInit (中文版)](https://zh-hginit.readthedocs.io/en/latest/)
105 | - [Mercurial 使用教程](https://www.mercurial-scm.org/wiki/ChineseTutorial)
106 | - [Pro Git](https://git-scm.com/book/zh/v2)
107 | - [Pro Git 第二版 中文版](https://bingohuang.gitbooks.io/progit2/content) - Bingo Huang
108 | - [svn 手册](http://svnbook.red-bean.com/nightly/zh/index.html)
109 |
110 | ### 编程艺术
111 |
112 | - [编程入门指南](http://www.kancloud.cn/kancloud/intro-to-prog/52592)
113 | - [程序员编程艺术](https://github.com/julycoding/The-Art-Of-Programming-by-July)
114 | - [每个程序员都应该了解的内存知识 (第一部分)](http://www.oschina.net/translate/what-every-programmer-should-know-about-memory-part1)
115 |
116 | ### 编辑器
117 |
118 | - [所需即所获:像 IDE 一样使用 vim](https://github.com/yangyangwithgnu/use_vim_as_ide)
119 | - [exvim--vim 改良成 IDE 项目](http://exvim.github.io/docs-zh/intro/)
120 | - [Vim 中文文档](https://github.com/vimcn/vimcdoc)
121 |
122 | ### 编译原理
123 |
124 | - [《计算机程序的结构和解释》公开课 翻译项目](https://github.com/DeathKing/Learning-SICP)
125 |
126 | ### 操作系统
127 |
128 | - [开源世界旅行手册](http://i.linuxtoy.org/docs/guide/index.html)
129 | - [理解 Linux 进程](https://github.com/tobegit3hub/understand_linux_process)
130 | - [命令行的艺术](https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md)
131 | - [鸟哥的 Linux 私房菜 服务器架设篇](http://cn.linux.vbird.org/linux_server/)
132 | - [鸟哥的 Linux 私房菜 基础学习篇](http://cn.linux.vbird.org/linux_basic/linux_basic.php)
133 | - [嵌入式 Linux 知识库 (eLinux.org 中文版)](https://tinylab.gitbooks.io/elinux/content/zh/)
134 | - [Docker — 从入门到实践](https://github.com/yeasy/docker_practice)
135 | - [Docker 入门实战](http://yuedu.baidu.com/ebook/d817967416fc700abb68fca1)
136 | - [Docker 中文指南](https://github.com/widuu/chinese_docker)
137 | - [FreeBSD 使用手册](http://www.freebsd.org/doc/zh_CN.UTF-8/books/handbook/)
138 | - [Linux 构建指南](http://works.jinbuguo.com/lfs/lfs62/index.html)
139 | - [Linux 系统高级编程](http://sourceforge.net/projects/elpi/)
140 | - [Linux Documentation (中文版)](https://tinylab.gitbooks.io/linux-doc/content/zh-cn/)
141 | - [Linux Guide for Complete Beginners](http://happypeter.github.io/LGCB/book/)
142 | - [Linux 工具快速教程](https://github.com/me115/linuxtools_rst)
143 | - [Mac 开发配置手册](https://aaaaaashu.gitbooks.io/mac-dev-setup/content/)
144 | - [Operating Systems: Three Easy Pieces](http://pages.cs.wisc.edu/~remzi/OSTEP/)
145 | - [The Linux Command Line](http://billie66.github.io/TLCL/index.html)
146 | - [Ubuntu 参考手册](http://wiki.ubuntu.org.cn/UbuntuManual)
147 | - [uCore Lab: Operating System Course in Tsinghua University](https://www.gitbook.com/book/objectkuan/ucore-docs/details)
148 | - [UNIX TOOLBOX](https://web.archive.org/web/20210812021003/cb.vu/unixtoolbox_zh_CN.xhtml) _(:card_file_box: archived)_
149 |
150 | ### 程序员杂谈
151 |
152 | - [程序员的自我修养](http://www.kancloud.cn/kancloud/a-programmer-prepares)
153 |
154 | ### 大数据
155 |
156 | - [面向程序员的数据挖掘指南](http://dataminingguide.books.yourtion.com)
157 | - [数据挖掘中经典的算法实现和详细的注释](https://github.com/linyiqun/DataMiningAlgorithm)
158 | - [Spark 编程指南简体中文版](https://aiyanbo.gitbooks.io/spark-programming-guide-zh-cn/content/)
159 |
160 | ### 分布式系统
161 |
162 | - [走向分布式](http://dcaoyuan.github.io/papers/pdfs/Scalability.pdf) (PDF)
163 |
164 | ### 管理和监控
165 |
166 | - [ElasticSearch 权威指南](https://www.gitbook.com/book/fuxiaopang/learnelasticsearch/details)
167 | - [Elasticsearch 权威指南(中文版)](https://web.archive.org/web/20200415002735/https://es.xiaoleilu.com/) _(:card_file_box: archived)_
168 | - [ELKstack 中文指南](http://kibana.logstash.es)
169 | - [Logstash 最佳实践](https://github.com/chenryn/logstash-best-practice-cn)
170 | - [Mastering Elasticsearch(中文版)](http://udn.yyuap.com/doc/mastering-elasticsearch/)
171 | - [Puppet 2.7 Cookbook 中文版](https://www.gitbook.com/book/wizardforcel/puppet-27-cookbook/details)
172 |
173 | ### 函数式概念
174 |
175 | - [傻瓜函数编程](https://github.com/justinyhuang/Functional-Programming-For-The-Rest-of-Us-Cn)
176 |
177 | ### 计算机图形学
178 |
179 | - [LearnOpenGL CN](https://learnopengl-cn.github.io)
180 | - [OpenGL 教程](https://github.com/zilongshanren/opengl-tutorials)
181 |
182 | ### 其它
183 |
184 | - [深入理解并行编程](http://ifeve.com/perfbook/)
185 | - [SAN 管理入门系列](https://community.emc.com/docs/DOC-16067)
186 | - [Sketch 中文手册](http://sketchcn.com/sketch-chinese-user-manual.html#introduce)
187 |
188 | ### 软件开发方法
189 |
190 | - [傻瓜函数编程](https://github.com/justinyhuang/Functional-Programming-For-The-Rest-of-Us-Cn) (《Functional Programming For The Rest of Us》中文版)
191 | - [硝烟中的 Scrum 和 XP](http://www.infoq.com/cn/minibooks/scrum-xp-from-the-trenches)
192 |
193 | ### 设计模式
194 |
195 | - [深入设计模式](https://refactoringguru.cn/design-patterns)
196 | - [史上最全设计模式导学目录](http://blog.csdn.net/lovelion/article/details/17517213)
197 | - [图说设计模式](https://github.com/me115/design_patterns)
198 |
199 | ### 数据库
200 |
201 |
202 |
203 | ### 项目相关
204 |
205 | - [编码规范](https://github.com/ecomfe/spec)
206 | - [开源软件架构](http://www.ituring.com.cn/book/1143)
207 | - [让开发自动化系列专栏](https://wizardforcel.gitbooks.io/ibm-j-ap)
208 | - [追求代码质量](https://wizardforcel.gitbooks.io/ibm-j-cq)
209 | - [GNU make 指南](http://docs.huihoo.com/gnu/linux/gmake.html)
210 | - [Gradle 2 用户指南](https://github.com/waylau/Gradle-2-User-Guide)
211 | - [Gradle 中文使用文档](http://yuedu.baidu.com/ebook/f23af265998fcc22bcd10da2)
212 | - [Joel 谈软件]()
213 | - [selenium 中文文档](https://einverne.gitbook.io/selenium-doc/)
214 |
215 | ### 在线教育
216 |
217 | - [51CTO 学院](http://edu.51cto.com)
218 | - [黑马程序员](http://yun.itheima.com)
219 | - [汇智网](http://www.hubwiz.com)
220 | - [极客学院](http://www.jikexueyuan.com)
221 | - [计蒜客](http://www.jisuanke.com)
222 | - [慕课网](http://www.imooc.com/course/list)
223 | - [Codecademy](https://www.codecademy.com/?locale_code=zh)
224 | - [CodeSchool](https://www.codeschool.com)
225 | - [Coursera](https://www.coursera.org/courses?orderby=upcoming&lngs=zh)
226 | - [Learn X in Y minutes](https://learnxinyminutes.com)
227 | - [shiyanlou](https://www.shiyanlou.com)
228 | - [TeamTreeHouse](https://teamtreehouse.com)
229 | - [Udacity](https://www.udacity.com)
230 | - [xuetangX](https://www.xuetangx.com)
231 |
232 | ### 正则表达式
233 |
234 | - [正则表达式-菜鸟教程](http://www.runoob.com/regexp/regexp-tutorial.html)
235 | - [正则表达式 30 分钟入门教程](https://web.archive.org/web/20161119141236/http://deerchao.net:80/tutorials/regex/regex.htm)
236 |
237 | ### 智能系统
238 |
239 | - [一步步搭建物联网系统](https://github.com/phodal/designiot)
240 |
241 | ### IDE
242 |
243 | - [IntelliJ IDEA 简体中文专题教程](https://github.com/judasn/IntelliJ-IDEA-Tutorial)
244 |
245 | ### Web
246 |
247 | - [3 Web Designs in 3 Weeks](https://www.gitbook.com/book/juntao/3-web-designs-in-3-weeks/details)
248 | - [关于浏览器和网络的 20 项须知](http://www.20thingsilearned.com/zh-CN/home)
249 | - [浏览器开发工具的秘密](http://jinlong.github.io/2013/08/29/devtoolsecrets/)
250 | - [前端代码规范 及 最佳实践](http://coderlmn.github.io/code-standards/)
251 | - [前端开发体系建设日记](https://github.com/fouber/blog/issues/2)
252 | - [前端资源分享(二)](https://github.com/hacke2/hacke2.github.io/issues/3)
253 | - [前端资源分享(一)](https://github.com/hacke2/hacke2.github.io/issues/1)
254 | - [一站式学习 Wireshark](https://community.emc.com/thread/194901)
255 | - [移动前端开发收藏夹](https://github.com/hoosin/mobile-web-favorites)
256 | - [移动 Web 前端知识库](https://github.com/AlloyTeam/Mars)
257 | - [正则表达式 30 分钟入门教程](http://deerchao.net/tutorials/regex/regex.htm)
258 | - [Chrome 开发者工具中文手册](https://github.com/CN-Chrome-DevTools/CN-Chrome-DevTools)
259 | - [Chrome 扩展及应用开发](http://www.ituring.com.cn/minibook/950)
260 | - [Chrome 扩展开发文档](http://open.chrome.360.cn/extension_dev/overview.html)
261 | - [Growth: 全栈增长工程师指南](https://github.com/phodal/growth-ebook)
262 | - [Grunt 中文文档](http://www.gruntjs.net)
263 | - [Gulp 入门指南](https://github.com/nimojs/gulp-book)
264 | - [gulp 中文文档](http://www.gulpjs.com.cn/docs/)
265 | - [HTTP 接口设计指北](https://github.com/bolasblack/http-api-guide)
266 | - [HTTP/2.0 中文翻译](http://yuedu.baidu.com/ebook/478d1a62376baf1ffc4fad99?pn=1)
267 | - [http2 讲解](https://www.gitbook.com/book/ye11ow/http2-explained/details)
268 | - [JSON 风格指南](https://github.com/darcyliu/google-styleguide/blob/master/JSONStyleGuide.md)
269 | - [Wireshark 用户手册](https://web.archive.org/web/20200415002730/http://man.lupaworld.com/content/network/wireshark/index.html)
270 |
271 | ### WEB 服务器
272 |
273 | - [Apache 中文手册](http://works.jinbuguo.com/apache/menu22/index.html)
274 | - [Nginx 教程从入门到精通](http://www.ttlsa.com/nginx/nginx-stu-pdf/) - 运维生存时间 (PDF)
275 | - [Nginx 开发从入门到精通](http://tengine.taobao.org/book/index.html) - 淘宝团队
276 |
277 | ## 语言相关
278 |
279 | ### Android
280 |
281 | - [Android Note(开发过程中积累的知识点)](https://github.com/CharonChui/AndroidNote)
282 | - [Android6.0 新特性详解](http://leanote.com/blog/post/561658f938f41126b2000298)
283 | - [Android 开发技术前线(android-tech-frontier)](https://github.com/bboyfeiyu/android-tech-frontier)
284 | - [Google Android 官方培训课程中文版](http://hukai.me/android-training-course-in-chinese/index.html)
285 | - Google Material Design 正體中文版 ([译本一](https://wcc723.gitbooks.io/google_design_translate/content/style-icons.html),[译本二](https://github.com/1sters/material_design_zh))
286 | - [Material Design 中文版](http://wiki.jikexueyuan.com/project/material-design/)
287 | - [Point-of-Android](https://github.com/FX-Max/Point-of-Android)
288 |
289 | ### Assembly
290 |
291 | - 逆向工程权威指南 《Reverse Engineering for Beginners》 - Dennis Yurichev, Antiy Labs, Archer
292 | - [逆向工程权威指南 《Reverse Engineering for Beginners》 Vol.1](https://beginners.re/RE4B-CN-vol1.pdf) - Dennis Yurichev, Antiy Labs, Archer (PDF)
293 | - [逆向工程权威指南 《Reverse Engineering for Beginners》 Vol.2](https://beginners.re/RE4B-CN-vol2.pdf) - Dennis Yurichev, Antiy Labs, Archer (PDF)
294 | - [C/C++面向 WebAssembly 编程](https://github.com/3dgen/cppwasm-book/tree/master/zh) - Ending, Chai Shushan (HTML, [:package: examples](https://github.com/3dgen/cppwasm-book/tree/master/examples))
295 |
296 | ### AWK
297 |
298 | - [awk 程序设计语言](https://github.com/wuzhouhui/awk)
299 | - [awk 中文指南](http://awk.readthedocs.org/en/latest/index.html)
300 |
301 | ### C
302 |
303 | - [新概念 C 语言教程](https://github.com/limingth/NCCL)
304 | - [Beej's Guide to Network Programming 簡體中文版](https://beej-zhtw-gitbook.netdpi.net) - Brian "Beej Jorgensen" Hall, 廖亚伦译
305 | - [C 语言常见问题集](http://c-faq-chn.sourceforge.net/ccfaq/ccfaq.html)
306 | - [Linux C 编程一站式学习](https://web.archive.org/web/20210514225440/http://docs.linuxtone.org/ebooks/C&CPP/c/) _(:card_file_box: archived)_
307 |
308 | ### C\#
309 |
310 | - [精通 C#(第 6 版)](http://book.douban.com/subject/24827879/)
311 |
312 | ### C++
313 |
314 | - [100 个 gcc 小技巧](https://github.com/hellogcc/100-gcc-tips/blob/master/src/index.md)
315 | - [100 个 gdb 小技巧](https://github.com/hellogcc/100-gdb-tips/blob/master/src/index.md)
316 | - [简单易懂的 C 魔法](https://web.archive.org/web/20210413213859/http://www.nowamagic.net/librarys/books/contents/c) _(:card_file_box: archived)_
317 | - [像计算机科学家一样思考(C++版)](http://www.ituring.com.cn/book/1203) (《How To Think Like a Computer Scientist: C++ Version》中文版)
318 | - [C 语言编程透视](https://tinylab.gitbooks.io/cbook/content/)
319 | - [C/C++ Primer](https://github.com/andycai/cprimer) - andycai
320 | - [C++ 并发编程指南](https://github.com/forhappy/Cplusplus-Concurrency-In-Practice)
321 | - [C++ FAQ LITE(中文版)](http://www.sunistudio.com/cppfaq/)
322 | - [C++ Primer 5th Answers](https://github.com/Mooophy/Cpp-Primer)
323 | - [C++ Template 进阶指南](https://github.com/wuye9036/CppTemplateTutorial)
324 | - [CGDB 中文手册](https://github.com/leeyiw/cgdb-manual-in-chinese)
325 | - [Cmake 实践](https://web.archive.org/web/20170615174144/http://sewm.pku.edu.cn/src/paradise/reference/CMake%20Practice.pdf) (PDF)
326 | - [GNU make 指南](http://docs.huihoo.com/gnu/linux/gmake.html)
327 | - [Google C++ 风格指南](http://zh-google-styleguide.readthedocs.org/en/latest/google-cpp-styleguide/contents/)
328 | - [ZMQ 指南](https://github.com/anjuke/zguide-cn)
329 |
330 | ### CoffeeScript
331 |
332 | - [CoffeeScript 编程风格指南](https://github.com/elrrrrrrr/coffeescript-style-guide/blob/master/README-ZH.md)
333 | - [CoffeeScript 编码风格指南](https://github.com/geekplux/coffeescript-style-guide)
334 | - [CoffeeScript 中文](http://coffee-script.org)
335 |
336 | ### Dart
337 |
338 | - [Dart 语言导览](https://web.archive.org/web/20200415002731/dart.lidian.info/wiki/Language_Tour) _(:card_file_box: archived)_
339 |
340 | ### Elasticsearch
341 |
342 | - [Elasticsearch 权威指南](https://github.com/looly/elasticsearch-definitive-guide-cn) (《Elasticsearch the definitive guide》中文版)
343 | - [Mastering Elasticsearch(中文版)](http://udn.yyuap.com/doc/mastering-elasticsearch/)
344 |
345 | ### Elixir
346 |
347 | - [Elixir 编程语言教程](https://elixirschool.com/zh-hans) (Elixir School)
348 | - [Elixir Getting Started 中文翻译](https://github.com/Ljzn/ElixrGettingStartedChinese)
349 | - [Elixir 元编程与 DSL 中文翻译](https://github.com/Ljzn/MetaProgrammingInElixirChinese)
350 | - [Phoenix 框架中文文档](https://mydearxym.gitbooks.io/phoenix-doc-in-chinese/content/)
351 |
352 | ### Erlang
353 |
354 | - [Erlang 并发编程](https://github.com/liancheng/cpie-cn) (《Concurrent Programming in Erlang (Part I)》中文版)
355 |
356 | ### Fortran
357 |
358 | - [Fortran77 和 90/95 编程入门](http://micro.ustc.edu.cn/Fortran/ZJDing/)
359 |
360 | ### Golang
361 |
362 | - [深入解析 Go](https://tiancaiamao.gitbooks.io/go-internals/content/zh) - tiancaiamao
363 | - [学习 Go 语言](http://mikespook.com/learning-go/)
364 | - [Go 编程基础](https://github.com/Unknwon/go-fundamental-programming)
365 | - [Go 官方文档翻译](https://github.com/golang-china/golangdoc.translations)
366 | - [Go 简易教程](https://github.com/songleo/the-little-go-book_ZH_CN) - Song Song Li (《[The Little Go Book](https://github.com/karlseguin/the-little-go-book) - Karl Seguin》中文版)
367 | - [Go 命令教程](https://github.com/hyper-carrot/go_command_tutorial)
368 | - [Go 入门指南](https://github.com/Unknwon/the-way-to-go_ZH_CN) (《The Way to Go》中文版)
369 | - [Go 语法树入门](https://github.com/chai2010/go-ast-book)
370 | - [Go 语言标准库](https://github.com/polaris1119/The-Golang-Standard-Library-by-Example)
371 | - [Go 语言高级编程(Advanced Go Programming)](https://github.com/chai2010/advanced-go-programming-book)
372 | - [Go 语言设计与实现](https://draveness.me/golang) - draveness
373 | - [Go 语言实战笔记](https://github.com/rujews/go-in-action-notes)
374 | - [Go 指南](https://tour.go-zh.org/list) (《A Tour of Go》中文版)
375 | - [Go Web 编程](https://github.com/astaxie/build-web-application-with-golang)
376 | - [Go 实战开发](https://github.com/astaxie/go-best-practice)
377 | - [Go 语言博客实践](https://github.com/achun/Go-Blog-In-Action)
378 | - [Java 程序员的 Golang 入门指南](http://blog.csdn.net/dc_726/article/details/46565241)
379 | - [Network programming with Go 中文翻译版本](https://github.com/astaxie/NPWG_zh)
380 | - [Revel 框架手册](https://web.archive.org/web/20190610030938/https://gorevel.cn/docs/manual/index.html) _(:card_file_box: archived)_
381 | - [The Little Go Book 繁體中文翻譯版](https://github.com/kevingo/the-little-go-book) - Karl Seguin, KevinGo, Jie Peng ([HTML](https://kevingo.gitbooks.io/the-little-go-book/))
382 |
383 | ### Groovy
384 |
385 | - [Groovy 教程](https://www.w3cschool.cn/groovy) - W3Cschool
386 |
387 | ### Haskell
388 |
389 | - [Haskell 趣学指南](https://learnyouahaskell.mno2.org)
390 | - [Real World Haskell 中文版](http://cnhaskell.com)
391 |
392 | ### HTML and CSS
393 |
394 | - [前端代码规范](http://alloyteam.github.io/CodeGuide/) - 腾讯 AlloyTeam 团队
395 | - [通用 CSS 笔记、建议与指导](https://github.com/chadluo/CSS-Guidelines/blob/master/README.md)
396 | - [学习 CSS 布局](http://zh.learnlayout.com)
397 | - [Bootstrap 4 繁體中文手冊](https://bootstrap.hexschool.com) - 六角學院
398 | - [Bootstrap 5 繁體中文手冊](https://bootstrap5.hexschool.com) - 六角學院
399 | - [CSS3 Tutorial 《CSS3 教程》](https://github.com/waylau/css3-tutorial)
400 | - [CSS 参考手册](http://css.doyoe.com)
401 | - [Emmet 文档](http://yanxyz.github.io/emmet-docs/)
402 | - [HTML5 教程](http://www.w3school.com.cn/html5/index.asp)
403 | - [HTML 和 CSS 编码规范](http://codeguide.bootcss.com)
404 | - [Sass Guidelines 中文](http://sass-guidelin.es/zh/)
405 |
406 | ### iOS
407 |
408 | - [网易斯坦福大学公开课:iOS 7 应用开发字幕文件](https://github.com/jkyin/Subtitle)
409 | - [Apple Watch 开发初探](http://nilsun.github.io/apple-watch/)
410 | - [Google Objective-C Style Guide 中文版](http://zh-google-styleguide.readthedocs.org/en/latest/google-objc-styleguide/)
411 | - [iOS7 人机界面指南](http://isux.tencent.com/ios-human-interface-guidelines-ui-design-basics-ios7.html)
412 | - [iOS 开发 60 分钟入门](https://github.com/qinjx/30min_guides/blob/master/ios.md)
413 | - [iPhone 6 屏幕揭秘](http://wileam.com/iphone-6-screen-cn/)
414 |
415 | ### Java
416 |
417 | - [阿里巴巴 Java 开发手册]() (PDF)
418 | - [用 jersey 构建 REST 服务](https://github.com/waylau/RestDemo)
419 | - [Activiti 5.x 用户指南](https://github.com/waylau/activiti-5.x-user-guide)
420 | - [Apache MINA 2 用户指南](https://github.com/waylau/apache-mina-2.x-user-guide)
421 | - [Apache Shiro 用户指南](https://github.com/waylau/apache-shiro-1.2.x-reference)
422 | - [Google Java 编程风格指南](http://hawstein.com/2014/01/20/google-java-style/)
423 | - [H2 Database 教程](https://github.com/waylau/h2-database-doc)
424 | - [Java 编程思想](https://java.quanke.name) - quanke
425 | - [Java 编码规范](https://github.com/waylau/java-code-conventions)
426 | - [Java Servlet 3.1 规范](https://github.com/waylau/servlet-3.1-specification)
427 | - [Jersey 2.x 用户指南](https://github.com/waylau/Jersey-2.x-User-Guide)
428 | - [JSSE 参考指南](https://github.com/waylau/jsse-reference-guide)
429 | - [MyBatis 中文文档](http://mybatis.github.io/mybatis-3/zh/index.html)
430 | - [Netty 4.x 用户指南](https://github.com/waylau/netty-4-user-guide)
431 | - [Netty 实战(精髓)](https://github.com/waylau/essential-netty-in-action)
432 | - [Nutz-book Nutz 烹调向导](http://nutzbook.wendal.net)
433 | - [Nutz 文档](https://nutzam.com/core/nutz_preface.html)
434 | - [REST 实战](https://github.com/waylau/rest-in-action)
435 | - [Spring Boot 参考指南](https://github.com/qibaoguang/Spring-Boot-Reference-Guide) (:construction: _翻译中_)
436 | - [Spring Framework 4.x 参考文档](https://github.com/waylau/spring-framework-4-reference)
437 |
438 | ### JavaScript
439 |
440 | - [命名函数表达式探秘](http://justjavac.com/named-function-expressions-demystified.html) - kangax、为之漫笔(翻译) (原始地址无法打开,所以此处地址为 justjavac 博客上的备份)
441 | - [你不知道的 JavaScript](https://github.com/getify/You-Dont-Know-JS/tree/1ed-zh-CN)
442 | - [深入理解 JavaScript 系列](http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html)
443 | - [现代 JavaScript 教程](https://zh.javascript.info) - Ilya Kantor
444 | - [学用 JavaScript 设计模式](http://www.oschina.net/translate/learning-javascript-design-patterns) - 开源中国
445 | - [Airbnb JavaScript 规范](https://github.com/adamlu/javascript-style-guide)
446 | - [ECMAScript 6 入门](http://es6.ruanyifeng.com) - 阮一峰
447 | - [Google JavaScript 代码风格指南](https://web.archive.org/web/20200415002735/bq69.com/blog/articles/script/868/google-javascript-style-guide.html) _(:card_file_box: archived)_
448 | - [JavaScript 标准参考教程(alpha)](http://javascript.ruanyifeng.com)
449 | - [javascript 的 12 个怪癖](https://github.com/justjavac/12-javascript-quirks)
450 | - [JavaScript 秘密花园](http://bonsaiden.github.io/JavaScript-Garden/zh/)
451 | - [《JavaScript 模式》](https://github.com/jayli/javascript-patterns) (《JavaScript patterns》译本)
452 | - [JavaScript 原理](https://web.archive.org/web/20170112164945/http://typeof.net/s/jsmech/)
453 | - [JavaScript Promise 迷你书](http://liubin.github.io/promises-book/)
454 | - [JavaScript 编程指南](http://pij.robinqu.me) ([源码](https://github.com/RobinQu/Programing-In-Javascript))
455 | - [JavaScript 核心概念及实践](http://icodeit.org/jsccp/) (PDF)
456 |
457 | #### AngularJS
458 |
459 | > :information_source: See also … [Angular](#angular)
460 |
461 | - [构建自己的 AngularJS](https://github.com/xufei/Make-Your-Own-AngularJS/blob/master/01.md) - Xu Fei (HTML)
462 | - [在 Windows 环境下用 Yeoman 构建 AngularJS 项目](http://www.waylau.com/build-angularjs-app-with-yeoman-in-windows/) - Way Lau (HTML)
463 | - [AngularJS 入门教程](https://github.com/zensh/AngularjsTutorial_cn) - Yan Qing, Hou Zhenyu, 速冻沙漠 (HTML) (:card_file_box: _archived_)
464 | - [AngularJS 最佳实践和风格指南](https://github.com/mgechev/angularjs-style-guide/blob/master/README-zh-cn.md) - Minko Gechev, Xuefeng Zhu, Shintaro Kaneko et al. (HTML)
465 |
466 | #### Backbone.js
467 |
468 | - [Backbone.js 入门教程](http://www.the5fire.com/backbone-js-tutorials-pdf-download.html) (PDF)
469 | - [Backbone.js 入门教程第二版](https://github.com/the5fire/backbonejs-learning-note)
470 | - [Backbone.js 中文文档](https://web.archive.org/web/20200916085144/https://www.html.cn/doc/backbone/) _(:card_file_box: archived)_
471 |
472 | #### D3.js
473 |
474 | - [楚狂人的 D3 教程](http://www.cnblogs.com/winleisure/tag/D3.js/)
475 | - [官方 API 文档](https://github.com/mbostock/d3/wiki/API--%E4%B8%AD%E6%96%87%E6%89%8B%E5%86%8C)
476 | - [张天旭的 D3 教程](http://blog.csdn.net/zhang__tianxu/article/category/1623437)
477 | - [Learning D3.JS](http://d3.decembercafe.org) - 十二月咖啡馆
478 |
479 | #### Electron.js
480 |
481 | - [Electron 中文文档](https://wizardforcel.gitbooks.io/electron-doc/content) - WizardForcel
482 | - [Electron 中文文档](https://www.w3cschool.cn/electronmanual) - W3Cschool
483 |
484 | #### ExtJS
485 |
486 | - [Ext4.1.0 中文文档](http://extjs-doc-cn.github.io/ext4api/)
487 |
488 | #### jQuery
489 |
490 | - [简单易懂的 JQuery 魔法](https://web.archive.org/web/20201127045453/http://www.nowamagic.net/librarys/books/contents/jquery) _(:card_file_box: archived)_
491 | - [How to write jQuery plugin](http://i5ting.github.io/How-to-write-jQuery-plugin/build/jquery.plugin.html)
492 |
493 | #### Node.js
494 |
495 | - [七天学会 NodeJS](http://nqdeng.github.io/7-days-nodejs/) - 阿里团队
496 | - [使用 Express + MongoDB 搭建多人博客](https://github.com/nswbmw/N-blog)
497 | - [express.js 中文文档](http://expressjs.jser.us)
498 | - [Express 框架](http://javascript.ruanyifeng.com/nodejs/express.html)
499 | - [koa 中文文档](https://github.com/guo-yu/koa-guide)
500 | - [Learn You The Node.js For Much Win! (中文版)](https://www.npmjs.com/package/learnyounode-zh-cn)
501 | - [Node debug 三法三例](http://i5ting.github.io/node-debug-tutorial/)
502 | - [Node.js 包教不包会](https://github.com/alsotang/node-lessons)
503 | - [Node.js Fullstack《從零到一的進撃》](https://github.com/jollen/nodejs-fullstack-lessons)
504 | - [Node 入门](http://www.nodebeginner.org/index-zh-cn.html)
505 | - [Nodejs Wiki Book](https://github.com/nodejs-tw/nodejs-wiki-book) (繁体中文)
506 | - [nodejs 中文文档](https://www.gitbook.com/book/0532/nodejs/details)
507 | - [The NodeJS 中文文档](https://www.gitbook.com/book/0532/nodejs/details) - 社区翻译
508 |
509 | #### React.js
510 |
511 | - [Learn React & Webpack by building the Hacker News front page](https://github.com/theJian/build-a-hn-front-page)
512 | - [React-Bits 中文文档](https://github.com/hateonion/react-bits-CN)
513 | - [React Native 中文文档(含最新 Android 内容)](http://wiki.jikexueyuan.com/project/react-native/)
514 | - [React webpack-cookbook](https://github.com/fakefish/react-webpack-cookbook)
515 | - [React.js 入门教程](http://fraserxu.me/intro-to-react/)
516 | - [React.js 中文文档](https://discountry.github.io/react/)
517 |
518 | #### Vue.js
519 |
520 | - [Vue.js 中文文档](https://cn.vuejs.org/v2/guide/)
521 | - [Vue3.0 学习教程与实战案例](https://vue3.chengpeiquan.com) - chengpeiquan
522 |
523 | #### Zepto.js
524 |
525 | - [Zepto.js 中文文档](https://web.archive.org/web/20210303025214/https://www.css88.com/doc/zeptojs_api/) _(:card_file_box: archived)_
526 |
527 | ### LaTeX
528 |
529 | - [大家來學 LaTeX](https://github.com/49951331/graduate-project-102pj/blob/master/docs/latex123.pdf) (PDF)
530 | - [一份不太简短的 LaTeX2ε 介绍](http://ctan.org/pkg/lshort-zh-cn)
531 | - [LaTeX 笔记](http://www.dralpha.com/zh/tech/tech.htm)
532 |
533 | ### LISP
534 |
535 | - [ANSI Common Lisp 中文翻译版](http://acl.readthedocs.org/en/latest/)
536 | - [Common Lisp 高级编程技术](http://www.ituring.com.cn/minibook/862) (《On Lisp》中文版)
537 |
538 | ### Lua
539 |
540 | - [Lua 5.3 参考手册](https://www.runoob.com/manual/lua53doc/)
541 |
542 | ### Markdown
543 |
544 | - [献给写作者的 Markdown 新手指南](http://www.jianshu.com/p/q81RER)
545 | - [Markdown 語法說明](https://markdown.tw)
546 |
547 | ### MySQL
548 |
549 | - [21 分钟 MySQL 入门教程](http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html)
550 | - [MySQL 索引背后的数据结构及算法原理](http://blog.codinglabs.org/articles/theory-of-mysql-index.html)
551 |
552 | ### NoSQL
553 |
554 | - [带有详细注释的 Redis 2.6 代码](https://github.com/huangz1990/annotated_redis_source)
555 | - [带有详细注释的 Redis 3.0 代码](https://github.com/huangz1990/redis-3.0-annotated)
556 | - [Disque 使用教程](http://disque.huangz.me)
557 | - [Redis 命令参考](http://redisdoc.com)
558 | - [Redis 设计与实现](http://redisbook.com)
559 | - [The Little MongoDB Book](https://github.com/justinyhuang/the-little-mongodb-book-cn/blob/master/mongodb.md)
560 | - [The Little Redis Book](https://github.com/JasonLai256/the-little-redis-book/blob/master/cn/redis.md)
561 |
562 | ### Perl
563 |
564 | - [Master Perl Today](https://github.com/fayland/chinese-perl-book)
565 | - [Perl 5 教程](https://web.archive.org/web/20150326073235/http://net.pku.edu.cn/~yhf/tutorial/perl/perl.html)
566 | - [Perl 教程](http://www.yiibai.com/perl)
567 |
568 | ### PHP
569 |
570 | - [深入理解 PHP 内核](http://www.php-internals.com/book/)
571 | - [CodeIgniter 使用手冊](https://web.archive.org/web/20210624143822/https://codeigniter.org.tw/userguide3/) _(:card_file_box: archived)_
572 | - [Composer 中文文档](http://docs.phpcomposer.com)
573 | - [Phalcon7 中文文档](https://web.archive.org/web/20220330065727/myleftstudio.com/) _(:card_file_box: archived)_
574 | - [PHP 之道](http://wulijun.github.io/php-the-right-way/)
575 | - [PHP 标准规范中文版](https://psr.phphub.org)
576 | - [PHP 中文手册](http://php.net/manual/zh/)
577 | - [Yii2 中文文档](http://www.yiichina.com/doc/guide/2.0)
578 |
579 | #### Laravel
580 |
581 | - [Laravel 5.4 中文文档](http://d.laravel-china.org/docs/5.4)
582 | - [Laravel 6 中文文档](https://learnku.com/docs/laravel/6.x)
583 | - [Laravel 7 中文文档](https://learnku.com/docs/laravel/7.x)
584 | - [Laravel 8 中文文档](https://learnku.com/docs/laravel/8.x)
585 |
586 | #### Symfony
587 |
588 | - [Symfony 2 实例教程](https://wusuopu.gitbooks.io/symfony2_tutorial/content)
589 | - [Symfony 5 快速开发](https://web.archive.org/web/20210812222957/symfony.com/doc/current/the-fast-track/zh_CN/index.html) _(:card_file_box: archived)_
590 |
591 | ### PostgreSQL
592 |
593 | - [PostgreSQL 8.2.3 中文文档](http://works.jinbuguo.com/postgresql/menu823/index.html)
594 | - [PostgreSQL 9.3.1 中文文档](http://www.postgres.cn/docs/9.3/index.html)
595 | - [PostgreSQL 9.4.4 中文文档](http://www.postgres.cn/docs/9.4/index.html)
596 | - [PostgreSQL 9.5.3 中文文档](http://www.postgres.cn/docs/9.5/index.html)
597 | - [PostgreSQL 9.6.0 中文文档](http://www.postgres.cn/docs/9.6/index.html)
598 |
599 | ### Python
600 |
601 | - [简明 Python 教程](https://web.archive.org/web/20200822010330/https://bop.mol.uno/) - Swaroop C H、沈洁元(翻译)、漠伦(翻译) _(:card_file_box: archived)_
602 | - [人生苦短,我用 python](https://www.cnblogs.com/derek1184405959/p/8579428.html) - (内含丰富的笔记以及各类教程)
603 | - [深入 Python 3](https://github.com/jiechic/diveintopython3)
604 | - [Matplotlib 3.0.3 中文文档](http://www.osgeo.cn/matplotlib/) - (Online)
605 | - [Numpy 1.16 中文文档](http://www.osgeo.cn/numpy/) - (Online)
606 | - [Python 3 文档(简体中文) 3.2.2 documentation](http://docspy3zh.readthedocs.org/en/latest/)
607 | - [Python 3.8.0a3 中文文档](http://www.osgeo.cn/cpython/) - (目前在线最全的中文文档了,Online)
608 | - [Python 中文学习大本营](http://www.pythondoc.com)
609 | - [Python 最佳实践指南](https://pythonguidecn.readthedocs.io/zh/latest/)
610 | - [Python Cookbook 第三版](http://python3-cookbook.readthedocs.io/zh_CN/latest/) - David Beazley、Brian K.Jones、熊能(翻译)
611 | - [Python 教程 - 廖雪峰的官方网站](http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000)
612 | - [Python 进阶](https://interpy.eastlakeside.com) - eastlakeside
613 | - [Python 之旅](https://web.archive.org/web/20191217091745/http://funhacks.net/explore-python/) - Ethan _(:card_file_box: archived)_
614 | - [Tornado 6.1 中文文档](http://www.osgeo.cn/tornado/) - (网络上其他的都是较旧版本的,Online)
615 |
616 | #### Django
617 |
618 | - [Django 1.11.6 中文文档](https://www.yiyibooks.cn/xx/Django_1.11.6/index.html)
619 | - [Django 2.2.1 中文文档](http://www.osgeo.cn/django/) - (这个很新,也很全,Online)
620 | - [Django 搭建个人博客教程 (2.1)](https://www.dusaiphoto.com/article/detail/2) - (杜赛) (HTML)
621 | - [Django book 2.0](http://djangobook.py3k.cn/2.0/)
622 | - [Django Girls 教程 (1.11)](https://tutorial.djangogirls.org/zh/) (HTML)
623 |
624 | ### R
625 |
626 | - [153 分钟学会 R](http://cran.r-project.org/doc/contrib/Liu-FAQ.pdf) (PDF)
627 | - [统计学与 R 读书笔记](http://cran.r-project.org/doc/contrib/Xu-Statistics_and_R.pdf) (PDF)
628 | - [用 R 构建 Shiny 应用程序](https://web.archive.org/web/20200220023703/yanping.me/shiny-tutorial/) (《Building 'Shiny' Applications with R》中文版) _(:card_file_box: archived)_
629 | - [R 导论](http://cran.r-project.org/doc/contrib/Ding-R-intro_cn.pdf) (《An Introduction to R》中文版) (PDF)
630 |
631 | ### reStructuredText
632 |
633 | - [reStructuredText 入门](http://www.pythondoc.com/sphinx/rest.html)
634 |
635 | ### Ruby
636 |
637 | - [笨方法学 Ruby](http://lrthw.github.io)
638 | - [Rails 风格指南](https://github.com/JuanitoFatas/rails-style-guide/blob/master/README-zhCN.md)
639 | - [Ruby 风格指南](https://github.com/JuanitoFatas/ruby-style-guide/blob/master/README-zhCN.md)
640 | - [Ruby on Rails 实战圣经](https://ihower.tw/rails4/)
641 | - [Ruby on Rails 指南](https://ruby-china.github.io/rails-guides/)
642 | - [Sinatra](http://www.sinatrarb.com/intro-zh.html)
643 |
644 | ### Rust
645 |
646 | - [通过例子学习 Rust](https://github.com/rustcc/rust-by-example/)
647 | - [Rust 官方教程](https://github.com/KaiserY/rust-book-chinese)
648 | - [Rust 语言学习笔记](https://github.com/photino/rust-notes)
649 | - [RustPrimer](https://github.com/rustcc/RustPrimer)
650 | - [Tour of Rust](https://tourofrust.com/00_zh-cn.html)
651 |
652 | ### Scala
653 |
654 | - [Effective Scala](http://twitter.github.io/effectivescala/index-cn.html)
655 | - [Scala 初学者指南](https://www.gitbook.com/book/windor/beginners-guide-to-scala/details) (《The Neophyte's Guide to Scala》中文版)
656 | - [Scala 课堂](http://twitter.github.io/scala_school/zh_cn/index.html) (Twitter 的 Scala 中文教程)
657 |
658 | ### Scheme
659 |
660 | - [Scheme 入门教程](http://deathking.github.io/yast-cn/) (《Yet Another Scheme Tutorial》中文版)
661 |
662 | ### Scratch
663 |
664 | - [创意计算课程指南](http://cccgchinese.strikingly.com)
665 |
666 | ### Shell
667 |
668 | - [Shell 编程范例](https://tinylab.gitbooks.io/shellbook/content) - 泰晓科技
669 | - [Shell 编程基础](http://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80)
670 | - [Shell 脚本编程 30 分钟入门](https://github.com/qinjx/30min_guides/blob/master/shell.md)
671 | - [shell-book](http://me.52fhy.com/shell-book/)
672 | - [The Linux Command Line 中文版](http://billie66.github.io/TLCL/book/)
673 |
674 | ### Swift
675 |
676 | - [《The Swift Programming Language》中文版](https://www.gitbook.com/book/numbbbbb/-the-swift-programming-language-/details)
677 |
678 | ### TypeScript
679 |
680 | - [TypeScript 教程](https://www.runoob.com/typescript/ts-tutorial.html) - runoob (HTML)
681 | - [TypeScript 入门教程](https://www.runoob.com/w3cnote/getting-started-with-typescript.html) - runoob (HTML)
682 | - [TypeScript 中文网](https://www.tslang.cn) (HTML)
683 | - [TypeScript Deep Dive 中文版](https://github.com/jkchao/typescript-book-chinese) - 三毛 (HTML)
684 | - [TypeScript Handbook(中文版)](https://www.runoob.com/manual/gitbook/TypeScript/_book/) - Patrick Zhong (HTML)
685 |
686 | #### Angular
687 |
688 | > :information_source: See also … [AngularJS](#angularjs)
689 |
690 | - [Angular 文档简介](https://angular.cn/docs) - Wang Zhicheng, Ye Zhimin, Yang Lin et al. (HTML)
691 | - [Angular Material 组件库](https://material.angular.cn) - Wang Zhicheng, Ye Zhimin, Yang Lin et al. (HTML)
692 | - [Angular Tutorial (教程:英雄之旅)](https://angular.cn/tutorial) - Wang Zhicheng, Ye Zhimin, Yang Lin et al. (HTML)
693 |
694 | #### Deno
695 |
696 | - [Deno 钻研之术](https://deno-tutorial.js.org)
697 | - [Deno 进阶开发笔记](https://chenshenhai.com/deno_note) - 大深海
698 |
699 | ### VBA (Microsoft Visual Basic Applications)
700 |
701 | - [简明 Excel VBA](https://github.com/Youchien/concise-excel-vba)
702 |
703 | ### Vim
704 |
705 | - [大家來學 VIM](http://www.study-area.org/tips/vim/index.html)
706 |
707 | ### Visual Prolog
708 |
709 | - [Visual Prolog 7 边练边学](http://wiki.visual-prolog.com/index.php?title=Visual_Prolog_for_Tyros_in_Chinese)
710 | - [Visual Prolog 7 初学指南](http://wiki.visual-prolog.com/index.php?title=A_Beginners_Guide_to_Visual_Prolog_in_Chinese)
711 |
--------------------------------------------------------------------------------