diff --git a/.vitepress/config.js b/.vitepress/config.js index 811b2d2..145c222 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -1,102 +1,11 @@ // import { defineConfig } from 'vitepress' import { withMermaid } from "vitepress-plugin-mermaid-xyxsw"; -import mathjax3 from 'markdown-it-mathjax3'; import { main_sidebar, chapter2, chapter3, chapter4, chapter5, chapter6, chapter7, chapter8, chapter9 } from './sidebar.js'; import { nav } from './nav.js'; import PanguPlugin from 'markdown-it-pangu' import { fileURLToPath, URL } from 'node:url' import VueMacros from 'unplugin-vue-macros/vite' -const customElements = [ - 'mjx-container', - 'mjx-assistive-mml', - 'math', - 'maction', - 'maligngroup', - 'malignmark', - 'menclose', - 'merror', - 'mfenced', - 'mfrac', - 'mi', - 'mlongdiv', - 'mmultiscripts', - 'mn', - 'mo', - 'mover', - 'mpadded', - 'mphantom', - 'mroot', - 'mrow', - 'ms', - 'mscarries', - 'mscarry', - 'mscarries', - 'msgroup', - 'mstack', - 'mlongdiv', - 'msline', - 'mstack', - 'mspace', - 'msqrt', - 'msrow', - 'mstack', - 'mstack', - 'mstyle', - 'msub', - 'msup', - 'msubsup', - 'mtable', - 'mtd', - 'mtext', - 'mtr', - 'munder', - 'munderover', - 'semantics', - 'math', - 'mi', - 'mn', - 'mo', - 'ms', - 'mspace', - 'mtext', - 'menclose', - 'merror', - 'mfenced', - 'mfrac', - 'mpadded', - 'mphantom', - 'mroot', - 'mrow', - 'msqrt', - 'mstyle', - 'mmultiscripts', - 'mover', - 'mprescripts', - 'msub', - 'msubsup', - 'msup', - 'munder', - 'munderover', - 'none', - 'maligngroup', - 'malignmark', - 'mtable', - 'mtd', - 'mtr', - 'mlongdiv', - 'mscarries', - 'mscarry', - 'msgroup', - 'msline', - 'msrow', - 'mstack', - 'maction', - 'semantics', - 'annotation', - 'annotation-xml', -]; - // https://vitepress.dev/reference/site-config export default withMermaid({ lang: 'zh-CN', @@ -104,7 +13,28 @@ export default withMermaid({ description: "HDU 计算机科学讲义", lastUpdated: true, cleanUrls: true, - head: [['script', { async: "async", src: 'https://umami.hdu-cs.wiki/script.js', "data-website-id": "3f11687a-faae-463a-b863-6127a8c28301", "data-domains": "wiki.xyxsw.site,hdu-cs.wiki" }]], + head: [ + ['script', { async: "async", src: 'https://umami.hdu-cs.wiki/script.js', "data-website-id": "3f11687a-faae-463a-b863-6127a8c28301", "data-domains": "wiki.xyxsw.site,hdu-cs.wiki" }], + ['link', { rel: 'icon', href: '/favicon.ico' }], + ["meta", { "name": "description", "content": "HDU计算机科学讲义" }], + ["meta", { "property": "og:url", "content": "https://hdu-cs.wiki/" }], + ["meta", { "property": "og:type", "content": "website" }], + ["meta", { "property": "og:title", "content": "HDU-CS-WIKI | HDU-CS-WIKI" }], + ["meta", { "property": "og:description", "content": "HDU计算机科学讲义" }], + ["meta", { "property": "og:image", "content": "https://cdn.xyxsw.site/og-img.png" }], + ["meta", { "name": "twitter:card", "content": "summary_large_image" }], + ["meta", { "property": "twitter:domain", "content": "hdu-cs.wiki" }], + ["meta", { "property": "twitter:url", "content": "https://hdu-cs.wiki/" }], + ["meta", { "name": "twitter:title", "content": "HDU-CS-WIKI | HDU-CS-WIKI" }], + ["meta", { "name": "twitter:description", "content": "HDU计算机科学讲义" }], + ["meta", { "name": "twitter:image", "content": "https://cdn.xyxsw.site/og-img.png" }], + ["link", { "rel": "apple-touch-icon", "sizes": "180x180", "href": "/apple-touch-icon.png" }], + ["link", { "rel": "icon", "type": "image/png", "sizes": "32x32", "href": "/favicon-32x32.png" }], + ["link", { "rel": "icon", "type": "image/png", "sizes": "16x16", "href": "/favicon-16x16.png" }], + ["link", { "rel": "manifest", "href": "/site.webmanifest" }], + ["link", { "rel": "mask-icon", "href": "/safari-pinned-tab.svg", "color": "#5bbad5" }], + ["meta", { "name": "msapplication-TileColor", "content": "#2b5797" }], + ], themeConfig: { // https://vitepress.dev/reference/default-theme-config nav: nav(), @@ -145,17 +75,9 @@ export default withMermaid({ markdown: { lineNumbers: true, config: (md) => { - md.use(mathjax3); md.use(PanguPlugin); }, - }, - vue: { - template: { - compilerOptions: { - isCustomElement: (tag) => customElements.includes(tag), - }, - }, - + math: true }, sitemap: { hostname: 'https://hdu-cs.wiki' diff --git a/.vitepress/sidebar.js b/.vitepress/sidebar.js index 249165e..e716d9b 100644 --- a/.vitepress/sidebar.js +++ b/.vitepress/sidebar.js @@ -243,11 +243,13 @@ export function chapter3() { collapsed: true, items: [ { text: '3.Y 附加模块:Linux', link: '/3.编程思维体系构建/3.Y 附加模块:Linux' }, - { text: '3.Y.1VMware的安装与安装Ubuntu22.04系统', link: '/3.编程思维体系构建/3.Y.1VMware的安装与安装Ubuntu22.04系统' }, - { text: '3.Y.2WSL的安装', link: '/3.编程思维体系构建/3.Y.2WSL的安装' }, - { text: '3.Y.3Linux初探索', link: '/3.编程思维体系构建/3.Y.3Linux初探索' }, - { text: '3.Y.4Vim初探索', link: '/3.编程思维体系构建/3.Y.4Vim初探索' }, - { text: '3.Y.5linux小任务', link: '/3.编程思维体系构建/3.Y.5linux小任务' }, + { text: '3.Y.1Linux概念普及', link: '/3.编程思维体系构建/3.Y.1Linux概念普及' }, + { text: '3.Y.2双系统安装和发行版推荐', link: '/3.编程思维体系构建/3.Y.2双系统安装和发行版推荐' }, + { text: '3.Y.3VMware的安装与安装Ubuntu22.04系统', link: '/3.编程思维体系构建/3.Y.3VMware的安装与安装Ubuntu22.04系统' }, + { text: '3.Y.4WSL的安装', link: '/3.编程思维体系构建/3.Y.4WSL的安装' }, + { text: '3.Y.5Linux初探索', link: '/3.编程思维体系构建/3.Y.5Linux初探索' }, + { text: '3.Y.6Vim初探索', link: '/3.编程思维体系构建/3.Y.6Vim初探索' }, + { text: '3.Y.7linux小任务', link: '/3.编程思维体系构建/3.Y.7linux小任务' }, ] } ] diff --git a/.vitepress/theme/style.css b/.vitepress/theme/style.css index 76ba62b..a93ed8d 100644 --- a/.vitepress/theme/style.css +++ b/.vitepress/theme/style.css @@ -5,17 +5,7 @@ /** * Colors * -------------------------------------------------------------------------- */ - -@import url('https://fonts.loli.net/css2?family=Noto+Sans+Mono:wght@400&family=Noto+Sans+SC:wght@400;500;700&display=swap'); - -@font-face { - font-family: 'Noto Color Emoji'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(https://gstatic.loli.net/s/notocoloremoji/v25/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.9.woff2) format('woff2'); - unicode-range: U+200d, U+261d, U+2620, U+2639-263a, U+2665, U+270a-270d, U+2728, U+2763-2764, U+2b50, U+fe0f, U+1f31a-1f31f, U+1f32b, U+1f383, U+1f389, U+1f3fb-1f3ff, U+1f440-1f450, U+1f463-1f465, U+1f479-1f47b, U+1f47d-1f480, U+1f485, U+1f48b-1f48c, U+1f493-1f49f, U+1f4a4-1f4a6, U+1f4a8-1f4ab, U+1f4af, U+1f525, U+1f573, U+1f590, U+1f595-1f596, U+1f5a4, U+1f5e3, U+1f600-1f644, U+1f648-1f64a, U+1f64c, U+1f64f, U+1f90c-1f925, U+1f927-1f92f, U+1f932-1f933, U+1f970-1f976, U+1f978-1f97a, U+1f9a0, U+1f9b4-1f9b7, U+1f9bb, U+1f9be-1f9bf, U+1f9d0, U+1f9e0-1f9e1, U+1fa75-1fa79, U+1fac0-1fac2, U+1fae0-1fae6, U+1fae8, U+1faf0-1faf8; -} +@import url('https://fonts.googleapis.com/css2?family=Noto+Color+Emoji&family=Noto+Sans+Mono:wght@400;600;700&family=Noto+Sans+SC:wght@400;600;700&display=swap'); .dark .vp-doc a,#loading, .dark .vp-doc a>code, .dark .VPNavBarMenuLink.VPNavBarMenuLink:hover, .dark .VPNavBarMenuLink.VPNavBarMenuLink.active, .dark .link.link:hover, .dark .link.link.active, .dark .edit-link-button.edit-link-button, .dark .pager-link .title { color: var(--vp-c-brand-3); diff --git a/1.杭电生存指南/1.12选课原则与抢课技巧.md b/1.杭电生存指南/1.12选课原则与抢课技巧.md index 8c4719c..d931140 100644 --- a/1.杭电生存指南/1.12选课原则与抢课技巧.md +++ b/1.杭电生存指南/1.12选课原则与抢课技巧.md @@ -1,8 +1,9 @@ # 选课原则与抢课技巧 > author: ek1ng -> -> 本文编写自2021.07.31,也许有些内容已经过时,请选择性参考。 +> +> 本文编写自 2021.07.31,也许有些内容已经过时,请选择性参考。 + ## 选课原则 ### 要选哪些课 @@ -17,15 +18,16 @@ ### 学校开什么课 -学校开展体育课(大一大二4学期分别修读不同类别的体育课程4次)、通识选修课 ~~(通常各专业需要修读人文类、国际类、科技类学分4、4、2个)~~ +学校开展体育课(大一大二 4 学期分别修读不同类别的体育课程 4 次)、通识选修课 ~~(通常各专业需要修读人文类、国际类、科技类学分 4、4、2 个)~~ :::warning -2023年更新:现在是国际类、人文类、艺术类、科技类学分4、2、2、2个(不管怎么变应该加起来都是10分) +2023 年更新:现在是国际类、人文类、艺术类、科技类学分 4、2、2、2 个(不管怎么变应该加起来都是 10 分) ::: ### 选什么课好 -在杭电换客群或者与认识的室友、同学、朋友等等交流开展某课程的某老师教学情况,打听情报以选择合适的老师。此处的情报通常指老师的教学方式如何,采取怎样的签到方式等等。如果曾经上过某老师开展的a课程,那么通常对于他开展的b课程,签到情况和给分情况都仍然能够适用,但是教学情况则未必。 -### 常见问题Q&A +在杭电换客群或者与认识的室友、同学、朋友等等交流开展某课程的某老师教学情况,打听情报以选择合适的老师。此处的情报通常指老师的教学方式如何,采取怎样的签到方式等等。如果曾经上过某老师开展的 a 课程,那么通常对于他开展的 b 课程,签到情况和给分情况都仍然能够适用,但是教学情况则未必。 + +### 常见问题 Q&A Q1:我该如何安排我这一学期的课程? @@ -33,9 +35,9 @@ A1:尽可能按照培养计划给出的每学期修读建议修读,适当先 Q2:选课所谓第一轮选课第二轮选课到底是如何进行的? -A2:第一轮选课可以选择的课为体育课、通识选修课(英语拓展课、大学军事、公选课都包括在内)、推荐课表上的课程。第二轮选课可以跨年级跨学院跨专业选课,只要能搜到的课都是可以上的,不过请注意,思修近代史毛概马原形策等课程并不能提前修读。第二轮选课通常进行到开学后3周,在开学前3周,可以通过签课的方式即在授课老师、学院的批准通过下选上自己没有抢到的课,理论上任何课(需要注意公选课、体育课一般无法签课,老师是否同意签课通常看老师的个人情况,学院通常会在老师批准的情况下通过批准)只要经过批准都可以签课成功后出现在课表上。请注意,学分上限为32.5(不包括暑假短学期课程),转专业后学分上限自动扩为40,若非转专业学生可以在绩点3.0以上的情况下开学前3周内提出扩学分请求。 +A2:第一轮选课可以选择的课为体育课、通识选修课(英语拓展课、大学军事、公选课都包括在内)、推荐课表上的课程。第二轮选课可以跨年级跨学院跨专业选课,只要能搜到的课都是可以上的,不过请注意,思修近代史毛概马原形策等课程并不能提前修读。第二轮选课通常进行到开学后 3 周,在开学前 3 周,可以通过签课的方式即在授课老师、学院的批准通过下选上自己没有抢到的课,理论上任何课(需要注意公选课、体育课一般无法签课,老师是否同意签课通常看老师的个人情况,学院通常会在老师批准的情况下通过批准)只要经过批准都可以签课成功后出现在课表上。请注意,学分上限为 32.5(不包括暑假短学期课程),转专业后学分上限自动扩为 40,若非转专业学生可以在绩点 3.0 以上的情况下开学前 3 周内提出扩学分请求。 :::warning -Update: 新系统学分上限为36,扩学分后上限为40。 +Update: 新系统学分上限为 36,扩学分后上限为 40。 ::: Q3:大一上如何选课? @@ -46,26 +48,26 @@ A3:大一上选课的安排在最后时间段,体育被默认选了太极拳 ### 选课背景 -2021年上学期的选课中,杭电更换了正方全新的选课平台http://newjw.hdu.edu.cn ,目前选课平台的特性为,在选课时间内开放至公网ip可以访问,可以并发请求,~~并不会网页卡崩~~,抢课全靠手速。 +2021 年上学期的选课中,杭电更换了正方全新的选课平台 ,目前选课平台的特性为,在选课时间内开放至公网 ip 可以访问,可以并发请求,~~并不会网页卡崩~~,抢课全靠手速。 :::tip -1. 鉴于杭电复杂的网络环境,在**内网**抢课甚至不如**公网**😅,所以建议在寝室里连上网线(公网)抢课。 +鉴于杭电复杂的网络环境,在**内网**抢课甚至不如**公网**😅,所以建议在寝室里连上网线(公网)抢课。 -2. **网页会卡崩**,刚开始选课0~5分钟系统会未响应甚至将你踢出登录,还会让你浏览器爆掉显示 *欧呦,崩溃啦* 之类的字样,一切听天由命。 +1. **网页会卡崩**,刚开始选课 0~5 分钟系统会未响应甚至将你踢出登录,还会让你浏览器爆掉显示 *欧呦,崩溃啦* 之类的字样,一切听天由命。 ::: ## 具体技巧 -#### 系统开放前 +### 系统开放前 通常系统开放前可以查询开课情况,那么可以根据开课情况自己提前规划安排想上的课程。 -#### 系统开放时 +### 系统开放时 -##### 第一轮选课、第二轮选课开放系统时 +#### 第一轮选课、第二轮选课开放系统时 提前在粘贴板中剪切/复制第一手要抢的课程,并且在选课平台开放时间前几秒,不停点击刷新,直至选课平台显示的内容不为非选课时间而是可以搜索,粘贴课程名并且点击抢课即可第一手抢到最想抢的课程,再依次抢接下来准备上的课。若课表上已经被系统默认选的课占了想要选的课的位置,那么就需要先退课再选课。 -##### 假期以及开学前三周 +#### 假期以及开学前三周 这时候会有同学因为不想选某门课程或者通过将课卡在其他人号上想在假期“转移”到自己号上,选课系统中的课程余量就会时不时出现波动,此时可以上去系统看看说不定能捡漏哦。签课以及扩学分在开学前三周进行,请关注学校通知并且通过签课选上自己没能选上的课程。 diff --git a/2.高效学习/2.2优雅的使用工具.md b/2.高效学习/2.2优雅的使用工具.md index 6618b05..9f0ae9a 100644 --- a/2.高效学习/2.2优雅的使用工具.md +++ b/2.高效学习/2.2优雅的使用工具.md @@ -20,7 +20,7 @@ - [uTools](https://www.u.tools/) :自由组合插件集(最好用的是 Alt+Space 搜索功能)非常强大,比如安装 fileshare 可以在局域网共享超大文件,而且是跨平台的。 - [PowerToys](https://github.com/microsoft/PowerToys) :微软官方出品,包含诸多功能,解决 windows 下一些小痛点。 - [Connect to Work or Games from Anywhere | Parsec](https://parsec.app/) :串流小工具,简单来说你就是可以在手机上玩电脑了,远程操作,极致体验~~(也可以玩游戏)~~ -- [VMware workstation](../3.%E7%BC%96%E7%A8%8B%E6%80%9D%E7%BB%B4%E4%BD%93%E7%B3%BB%E6%9E%84%E5%BB%BA/3.Y.1VMware%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E5%AE%89%E8%A3%85Ubuntu22.04%E7%B3%BB%E7%BB%9F.md):虚拟机就用它!但是最好自己找找盗版,正版要钱。 +- [VMware workstation](../3.%E7%BC%96%E7%A8%8B%E6%80%9D%E7%BB%B4%E4%BD%93%E7%B3%BB%E6%9E%84%E5%BB%BA/3.Y.3VMware%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E5%AE%89%E8%A3%85Ubuntu22.04%E7%B3%BB%E7%BB%9F.md):虚拟机就用它!但是最好自己找找盗版,正版要钱。 - [cloc](https://github.com/AlDanial/cloc): 统计代码行数(空白行,注释行,代码行)的小工具 - mv & cp 命令显示进度条:在复制大文件的时候非常友好,可以通过以下脚本安装(Linux 系统) @@ -58,7 +58,7 @@ rm coreutils-8.32 coreutils-8.32.tar.xz - [MarkText](https://github.com/marktext/marktext) 免费的,平替 Typora。 - [MiaoYan](https://github.com/tw93/MiaoYan) 仅支持 apple,界面挺清爽。 - [思源笔记](https://b3log.org/siyuan/) 一个国产开源的笔记/知识库软件,优势是 本地化、双链、Markdown 语法,与 Obsidian 定位相似,但 Geek 成分和自定义空间相对更高 -- [Zotero](https://www.zotero.org/):协助文献阅读还有写笔记,支持与平板同传(同时他是开源的,所以可以添加一些插件) +- [Zotero](https://www.zotero.org/):协助文献阅读还有记录笔记,支持与平板同传(同时他是开源的,所以可以添加一些插件) ![](https://cdn.xyxsw.site/boxcnO1PEsVd4KY7reeU64spShf.jpg) diff --git a/3.编程思维体系构建/3.1该使用哪个编辑器???.md b/3.编程思维体系构建/3.1该使用哪个编辑器???.md index 2a14a07..c20140b 100644 --- a/3.编程思维体系构建/3.1该使用哪个编辑器???.md +++ b/3.编程思维体系构建/3.1该使用哪个编辑器???.md @@ -78,7 +78,7 @@ C 语言代码由固定的词汇按照固定的格式组织起来,简单直观 Java: [JetBrains](https://www.jetbrains.com/zh-cn/idea/),[IntelliJ](https://www.jetbrains.com/zh-cn/idea/),[IDEA](https://www.jetbrains.com/zh-cn/idea/) -C: [Visual Studio(宇宙第一 IDE)](https://visualstudio.microsoft.com/zh-hans/vs/), [JetBrains Clion](https://www.jetbrains.com/zh-cn/clion/), Visual Studio Code(编辑器 IDE 化需要额外配置) +C: [Visual Studio(宇宙第一 IDE)](https://visualstudio.microsoft.com/zh-hans/vs/), [JetBrains Clion](https://www.jetbrains.com/zh-cn/clion/),Visual Studio Code(编辑器 IDE 化需要额外配置) Python: [JetBrains Pycharm](https://www.jetbrains.com/zh-cn/pycharm/) diff --git a/3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge).md b/3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge).md index 6c48141..c254565 100644 --- a/3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge).md +++ b/3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge).md @@ -119,7 +119,7 @@ Div.1、Div.2、Div.3、Div.4 数字越小难度越大。 这是一场笔者之前赛后补过的 Div.2,画面右下角分别为赛后公告和题解,右侧便是开启 VP 的按钮。 ![](https://cdn.xyxsw.site/wenjing10.png) -*VP模拟赛时的好处就是在虚拟参赛中获得真实比赛才能积累的经验,比如这里笔者发现通过前三题后,我应该先去看看 F 题,因为做出来的人更多,我有更大的可能性做出来,ACM 中题目并不是 100% 按难度排序。* +*VP 模拟赛时的好处就是在虚拟参赛中获得真实比赛才能积累的经验,比如这里笔者发现通过前三题后,我应该先去看看 F 题,因为做出来的人更多,我有更大的可能性做出来,ACM 中题目并不是 100% 按难度排序。* ![](https://cdn.xyxsw.site/wenjing11.png) diff --git a/3.编程思维体系构建/3.4.1FAQ:常见问题.md b/3.编程思维体系构建/3.4.1FAQ:常见问题.md index 1872180..2b42708 100644 --- a/3.编程思维体系构建/3.4.1FAQ:常见问题.md +++ b/3.编程思维体系构建/3.4.1FAQ:常见问题.md @@ -47,10 +47,10 @@ NJU-ICS-PA 南京大学计算机系统基础 ## 我总觉得文章没写清楚 -你毕业后进入公司/课题组, 不会再有讲义具体地告诉你应该做什么,总有一天你需要在脱离讲义的情况下完成任务。我们希望你现在就放弃"讲义和框架代码会把我应该做的一切细节清楚地告诉我"的幻想,为自己的成长负起责任: +你毕业后进入公司/课题组,不会再有讲义具体地告诉你应该做什么,总有一天你需要在脱离讲义的情况下完成任务。我们希望你现在就放弃"讲义和框架代码会把我应该做的一切细节清楚地告诉我"的幻想,为自己的成长负起责任: - 不知道在说什么,说明你对知识点的理解还不够清楚,这时候你应该去看书/看手册 -- 不知道要做什么/怎么做, 说明你的系统观好是零碎的,理解不了系统中各个模块之间的联系,这时候你应该 RTFSC, 尽自己最大努力梳理并理解系统中的一切细节 +- 不知道要做什么/怎么做,说明你的系统观好是零碎的,理解不了系统中各个模块之间的联系,这时候你应该 RTFSC, 尽自己最大努力梳理并理解系统中的一切细节 - bug 调不出来,说明你不清楚程序正确的预期行为,你需要 RTFSC 理解程序应该如何运行; 此外也说明你不重视工具和方法的使用,你需要花时间去体验和总结它们 如果你发现自己有以上情况,你还是少抱怨,多吃苦吧。 diff --git a/3.编程思维体系构建/3.4.4C语言前置概念学习.md b/3.编程思维体系构建/3.4.4C语言前置概念学习.md index 90f0c33..331e006 100644 --- a/3.编程思维体系构建/3.4.4C语言前置概念学习.md +++ b/3.编程思维体系构建/3.4.4C语言前置概念学习.md @@ -14,6 +14,10 @@ 4.Web:[CNote](https://github.com/coderit666/CNote)(例子密集,学习曲线平滑,覆盖面广且具有深度) +::: tip 📥 +《C Primer Plus》(第六版中文版)(216MB)附件下载 +::: + 5.Book:**教材替换用书——《C Primer Plus》!**(基础且深入的恰到好处,有一定拓展,可能后面的章节有点难懂,是一本不可多得的好书,不要忽视课本习题及 Projects) 6.MOOC:[Introductory C Programming 专项课程](https://www.coursera.org/specializations/c-programming)(**全英文**,好处是涉及到计算机思维,包含许多常用 tools 的教学例如 git、make、emacs、gdb,视频讲解结合文档阅读,对于 C 的重要核心知识讲解透彻,难度颇高,建议用作提升) diff --git a/3.编程思维体系构建/3.4.6.4.创建对象.md b/3.编程思维体系构建/3.4.6.4.创建对象.md index 635883c..1665537 100644 --- a/3.编程思维体系构建/3.4.6.4.创建对象.md +++ b/3.编程思维体系构建/3.4.6.4.创建对象.md @@ -9,9 +9,9 @@ 所以,为了表示这个物品,我们可以使用如下[结构](http://en.wikipedia.org/wiki/Struct_(C_programming_language)): -- **description: ****对物品的描述** -- **tag: ****物品的类型** -- **location: ****物品所在****的位置。这是****对应****上一章中定义的****物品****位置****的指针。** +- **\*description: 对物品的描述** +- **\*tag: 物品的类型** +- **\*location: 物品所在的位置。这是对应上一章中定义的物品位置的指针。** ```c struct object { @@ -104,9 +104,9 @@ for (obj = objs; obj < objs + 5; obj++) 但是,对象通常具有同样有效的其他特征: -- **Locations:通过****道路****连接(将在后面介绍)。如果一个物体无法通过一条通道到达,那么它就不是一个位置。就是这么简单。** -- **Items:玩家唯一可以捡起的物品;****可以给他们整一个重量的属性** -- **Actors:玩家唯一可以与之交谈,交易,战斗的对象;当然,前提是他们还活着!****可以加一个 HP 属性** +- **Locations:通过道路连接(将在后面介绍)。如果一个物体无法通过一条通道到达,那么它就不是一个位置。就是这么简单。** +- **Items:玩家唯一可以捡起的物品;可以给他们整一个重量的属性** +- **Actors:玩家唯一可以与之交谈,交易,战斗的对象;当然,前提是他们还活着!可以加一个 HP 属性** 我们还要向数组中添加一个对象:玩家自己。 @@ -163,7 +163,7 @@ OBJECT objs[] = { }; ``` -**注意:**要编译此模块,编译器*必须*支持 Constant folding。这排除了一些更原始的编译器,如 [Z88DK](http://en.wikipedia.org/wiki/Z88DK)。 +注意:要编译此模块,编译器*必须*支持 Constant folding。这排除了一些更原始的编译器,如 [Z88DK](http://en.wikipedia.org/wiki/Z88DK)。 以下模块将帮助我们找到与指定名词匹配的对象。 diff --git a/3.编程思维体系构建/3.4.6.5.捡起物品.md b/3.编程思维体系构建/3.4.6.5.捡起物品.md index a899ae7..574e9de 100644 --- a/3.编程思维体系构建/3.4.6.5.捡起物品.md +++ b/3.编程思维体系构建/3.4.6.5.捡起物品.md @@ -32,7 +32,7 @@ 如果你可以在不参考下面内容的情况下就写出基本内容会有很大收获的 ::: -## **parsexec.c** +## parsexec.c ```c #include @@ -91,7 +91,7 @@ bool parseAndExecute(char *input) 新命令由以下模块实现。 -## **inventory.h** +## inventory.h ```c extern void executeGet(const char *noun); @@ -101,7 +101,7 @@ extern void executeGive(const char *noun); extern void executeInventory(void); ``` -## **inventory.c** +## inventory.c ```c #include diff --git a/3.编程思维体系构建/3.5git与github.md b/3.编程思维体系构建/3.5git与github.md index 27aef66..11836ae 100644 --- a/3.编程思维体系构建/3.5git与github.md +++ b/3.编程思维体系构建/3.5git与github.md @@ -127,7 +127,7 @@ type为commit的类型 style: 代码格式修改 test: 测试用例修改 chore: 其他修改, 比如构建流程, 依赖管理. - pref: 性能提升的修改 + perf: 性能提升的修改 build: 对项目构建或者依赖的改动 ci: CI 的修改(ci是自动构建 感兴趣可以搜搜 github workflow ) revert: revert 前一个 commit ( 撤销前一个commit ) @@ -145,6 +145,8 @@ subject为commit概述 其中详细内容可以参照 [约定式提交](https://www.conventionalcommits.org/zh-hans/v1.0.0/) +附上 [语义化版本 2.0.0 规范](https://semver.org/lang/zh-CN/) + 你可以使用 `git log` 查看存档记录,你应该能看到刚才编辑的注释。 ### 读档(回溯到某一个 commit) diff --git a/3.编程思维体系构建/3.6.4.5阶段五:迭代生成.md b/3.编程思维体系构建/3.6.4.5阶段五:迭代生成.md index 09996a0..cc2567f 100644 --- a/3.编程思维体系构建/3.6.4.5阶段五:迭代生成.md +++ b/3.编程思维体系构建/3.6.4.5阶段五:迭代生成.md @@ -78,7 +78,7 @@ StopIteration **Analogy**: An iterable is like a book (one can flip through the pages) and an iterator for a book would be a bookmark (saves the position and can locate the next page). Calling `iter` on a book gives you a new bookmark independent of other bookmarks, but calling `iter` on a bookmark gives you the bookmark itself, without changing its position at all. Calling `next` on the bookmark moves it to the next page, but does not change the pages in the book. Calling `next` on the book wouldn't make sense semantically. We can also have multiple bookmarks, all independent of each other. -## 生成器:懒人迭代器! +## 生成器:懒人迭代器! ```python def test_iterator(): diff --git a/3.编程思维体系构建/3.Y 附加模块:Linux.md b/3.编程思维体系构建/3.Y 附加模块:Linux.md index 6cd2248..ed37e4d 100644 --- a/3.编程思维体系构建/3.Y 附加模块:Linux.md +++ b/3.编程思维体系构建/3.Y 附加模块:Linux.md @@ -52,10 +52,12 @@ 任务:装 Ubuntu22.04 或者 debian,如果你想删了自己的系统,可以试试 deepin,当然,也会有一些兼容性问题,不过会支持一些中文软件 -tip1:推荐这个 [3.Y.1VMware 的安装与安装 ubuntu22.04 系统](3.Y.1VMware%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E5%AE%89%E8%A3%85Ubuntu22.04%E7%B3%BB%E7%BB%9F.md) +tip1:推荐这个 [3.Y.3VMware 的安装与安装 ubuntu22.04 系统](3.Y.3VMware%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E5%AE%89%E8%A3%85Ubuntu22.04%E7%B3%BB%E7%BB%9F.md) -tip2:可以使用 WSL[3.Y.2WSL 的安装](3.Y.2WSL%E7%9A%84%E5%AE%89%E8%A3%85.md),但是我更建议实装到电脑上双系统之类的,正好锻炼一下装系统倒腾的能力。大可不必删了 windows 换成 ubuntu。 +tip2:可以使用 WSL[3.Y.4WSL 的安装](3.Y.4WSL%E7%9A%84%E5%AE%89%E8%A3%85.md),但是我更建议实装到电脑上双系统之类的,正好锻炼一下装系统倒腾的能力。大可不必删了 windows 换成 ubuntu。 -tip3:前两个 tip 二选一 +tip3:前两个 tip 二选一。 + +在开始之前,建议先阅读[3.Y.1Linux概念普及](3.Y.1Linux概念普及.md),了解一些基本概念,**免得把系统搞坏了**,尤其是 WSL 有可能把 Windows 也一块带走,**之前就有群友做到过**。 任务:阅读 GUI 与命令行之间对比的文章,尝试开始阅读英文文章 diff --git a/3.编程思维体系构建/3.Y.1Linux概念普及.md b/3.编程思维体系构建/3.Y.1Linux概念普及.md new file mode 100644 index 0000000..fb31972 --- /dev/null +++ b/3.编程思维体系构建/3.Y.1Linux概念普及.md @@ -0,0 +1,171 @@ +# Linux 概念普及 + +## Before Start + +在使用 Linux 之前,请确保自己会使用计算机。如果 Windows 都玩不转的,可以先补下基础知识。 + +- 什么是文件?什么是文件系统? +- 操作系统是干什么的? +- 软件是怎么运行起来的? + +## What is Linux Distribution + +Linux 不同于 Windows 和 macOS 这类系统,它没有官方维护的版本。Linux 的官方只负责维护核心,而给这个核心加上各种软件变成能用的操作系统的重任,就交给了下游的各个组织和公司。所谓发行版,就是把一系列的软件和核心放在一起,经过测试之后,做成一个完整的系统,分发给用户。 + +这个模式给 Linux 提供了多样性。用户可以选择适合自己的发行版。虽然在早期这使适配软件变得有些困难,使不同发行版割裂开来,给 Linux 的发展带来了阻碍。但是现在是 2023 年,随着包管理的规范化和新一代打包系统的兴起,这个状况得到了极大的改善。现在我们可以自由选取发行版,而不用过度担心软件适配的问题。 + +简而言之,GNU/Linux 加包管理加桌面约等于发行版,虽然不严谨,但是差不多贴近事实。 + +### Package Manager + +一般来说,一个 Linux 的发行版最核心的部分是包管理模式。这通常通过包管理器和软件源实现。 + +包(package)类似 Windows 的安装包,它包含了要安装的软件以及一些额外的信息,但是同 Windows 安装包不同,它只是一个压缩包,不能自己运行安装,必须经过包管理器。用户很少需要直接下载安装它,而是通过包管理器。我们也不鼓励安装不在仓库里面的包,如果系统软件源里面没有可以去 flatpak。至于某些专有软件,我更推荐丢进 Windows 10 LTSC 虚拟机。 + +包管理器(package manager)负责安装和管理软件包。它读取软件包,按照软件包的要求去安装它的依赖(通常是一些运行库,就像 Windows 下面的 VC++ 和 .NET),然后自动把包安装到规定的位置。 + +软件源(repository)是用来存放软件包的网站。包管理器就是从软件源服务器上下载包的。因为软件源通常在国外,软件包下载可能会比较慢。所以我们一般使用国内各个高校的镜像源,修改软件源的地址就是所谓换源。 + +有些人可能会纠结软件装到哪里去了,是装在什么盘上面了。这个不需要管。因为 Linux 的目录的定义和 Windows 有很大不同,这使得一些 Windows 上面的繁琐操作在 Linux 上面很多余。 + +这些常见的包管理器 + +- apt(dpkg): apt 是 Debian 系发行版的包管理器。基本上提供 Linux 安装包的软件都会支持。 +- pacman: Arch 系的包管理器。可以使用 AUR(Arch User Repository),这里也能找到很多软件。 +- rpm: Red Hat 系的包管理器。包比较少。只是由于中文互联网有很多死去的 CentOS 的教程遗留,所以提出来介绍一下。 +- dnf: Fedora 的包管理器。 +- flatpak: 通用包管理器,是个 Linux 桌面端都能安装使用。使用的 flathub 软件源上面有非常丰富的桌面软件支持(甚至有 QQ),建议发行版软件源里面没有的都可以先看看 flathub 有没有,如果有就 flatpak 安装,而不是拿着网站上面下过来的 deb 文件手动安装,这样很容易搞坏系依赖管理。 +- snap: 通用包管理器,只有 Ubuntu 强推。我建议使用 Ubuntu 的把这个卸载了换成 flatpak 避免影响使用体验。 + +不同的包管理器决定了不同的发行版。因此一般用包管理器做发行版的分类依据。 + +### Desktop Environment + +桌面环境对用户而言当然也是很重要的,很大程度决定了用户体验。在 Linux 上面,桌面只是一些普通的程序,可以随便安装和更改。所以会有很多的桌面可供选择。不过这个选择一般来说发行版都帮你选好了。 + +#### Gnome + +Gnome 曾一度成为 Linux 桌面的代名词,因为很多发行版默认会安装这个桌面。Gnome 的风格比较独特,有点类似 macOS ,但是有不少自己的东西。对触控板手势的适配不错。 + +开箱状态连任务栏和桌面图标都没有,好在可以手动安装。一般各个发行版默认安装了 dash-to-dock(任务栏), desktop-icons(桌面图标) 这些插件。 + +设置比较少,不过可以通过 gnome-tweaks 补上。这样基本的设置都能覆盖。 + +#### KDE + +KDE 也是非常热门的桌面。类似 Windows 的操作逻辑和极强的可定制性让他更适合 Linux “玩家”。 + +比较旧的版本里面可能会默认单击打开文件夹,可以在工作区(workspace)设置中改成双击。 + +KDE 的 GUI 功能做的还是不错的。而且提供了不少有用的套件。 + +Discover 应用商店可以直接使用发行版包管理器和 flatpak 进行安装,收录了很多软件,并且可以自动进行系统更新检查。 + +设置里面的选项很多,可以随便改。喜欢折腾的可以去看看 Theme,只是系统自带的主题安装器需要哈利波特才能使用。 + +自带的代理设置有些软件不会读,比如 Firefox, 给这些软件单独设置一下就行。 + +#### Cinnamon + +Cinnamon 目前大众的发行版只有 Linux Mint 在支持,但是这也是个不错的桌面,适合小白。 + +#### Xfce || LXQT + +如果你有一台老爷机,这两个桌面也许是个不错的选择。 + +#### Display Manager + +在开机登陆用户的时候,那个让你输密码的界面并不是桌面,而是 DM(Display Manager),如果你有多个桌面,可以在这里切换。 + +我建议不要管这个,发行版用什么就跟着用。如果要自己安装都建议 SDDM 。 + +#### Wayland and X11 + +显示服务器是比桌面更底层的东西,处在系统内核和桌面之间,用来管理窗口。这个一般碰不到,只要了解你使用的是 X11 还是 Wayland 就行。X11 是老的,Wayland 是新的。 + +现在(2023年)的时间点非常尴尬,处于 X11 和 Wayland 换代的节点上面。一方面 X11 太老旧了(十几年没有大更新了)对有些新事物支持不好,比如 2k 屏幕 1.5 倍缩放的屏幕撕裂问题。另一方面 Wayland 支持虽然已经大致完善,但是有些死硬派没跟上,说的就是你,Nvidia! + +好在大多数发行版并不需要纠结这些。非 N 卡的 Gnome 和 KDE 桌面基本都是 Wayland 了,其他的桌面环境或者使用 N 卡都会用 X11。 + +但是有些发行版可能忘了给 N 卡换 X11, **如果你桌面登不进去**,请检查自己的环境是否是 Wayland,如果是,**换成 X11**。 + +如果你 N 卡要强开 Wayland,请参照自己使用的发行版的 wiki 以及 Arch Linux wiki, 看看有什么需要注意的点。 + +## Distro + +大多数发行版是基于某几个特定的发行版魔改的。所以会有“系”的说法。常见的有 Debian 系, Arch 系 Red Hat 系和 SUSE 系。其中 Red Hat 系主要面向企业,桌面版除了 Fedora 并不多见。 + +服务器发行版建议 Debian ,用 Ubuntu 也是可以的。如果在中文互联网找资料可能会见到 CentOS,但是 CentOS 如今已经停止维护了,所以看到之后绕着走就行。 + +在[3.Y.2双系统安装和发行版推荐](./3.Y.2双系统安装和发行版推荐.md) 推荐的发行版都是针对**双系统/单系统方案**的,因为在实机安装日常使用的时候,发行版对体验的影响才会体现出来,这样我写下的文字就会帮你剩下不少时间。 + +**对于虚拟机**,你不会在乎用户体验的,安装完新鲜感一过肯定就不打开了,偶尔遇到什么必须要用 Linux 的需求才会突然想起来有这个虚拟机。所以发行版**选择 Ubuntu 即可**,毕竟人气最高。要是对着百度上面刚刚找到的教程一顿猛敲之后,发现发行版不一样,那 Linux 就又风评被害了。 + +在安装系统的时候,建议安装时统一使用 English,装好之后再换成中文或者干脆不换。 + +对某些很新的硬件,比如 13 代酷睿和 40 系 N 卡(2023 年),在其他发行版出现兼容性问题的情况下,可以使用 Debian 或者 Arch Linux 等等靠近上游的发行版,他们通常支持得比较好。 + +## Linux How to? + +### Directory + +在 Linux 中,文件目录结构与 Windows 完全不同。Windows 存在 C 盘、D 盘等盘符,而在 Linux 中不存在这些划分,最上层的目录是根目录,路径为 `/` ,并以一个树形结构从此向下一级一级区分。没有盘符,只有路径。虽然可以多分区,但是分区是挂载到某个路径的,而不是分配盘符。用 Windows 的思维去理解就是盘符没了,全部挂进文件夹里面了,从 / 开始是根分区,就像 C 盘,`/` 底下有 `usr` `home` `var` 等等文件夹,这些文件夹可以是普通文件夹,也可以让其他磁盘分区当这个文件夹。分区还可以挂载到 `/media/root/abcd` 。这样的好处很明显,就是在路径上面模糊了分区,分区的地位和普通文件夹差不多了,非常简单,对写程序很友好。 + +因为舍弃了盘符的概念,一般我们在 Linux 系统上仅仅使用一个挂载到 `/` 的分区(简称 `/` 分区)或者一个 `/` 分区和一个 `/home` 分区。这样分区可以得到充足的空间,所以不会出现 C 盘装满了或者 C 盘文件多导致开机慢的情况,也就没有必要支持自定义的安装目录。 + +对于 Linux 的树形文件结构,存在相对路径与绝对路径之分。绝对路径是代表从根路径 `/` 开始的完整路径,如 `/home/testuser/Download`。相对路径代表从当前目录,到目标目录的一个部分路径。比如当前你所在的目录为 `/home/testuser`,那么切换到绝对路径 `/home/testuser/Download` 的相对路径即为 `./Download`。其中 `./` 代表从当前目录,再向下寻找。另外,`..` 这种两个句点代表的是向上层寻找,比如你当前所在的路径为 `/home/testuser/Download`,向上寻找到 `/home/testuser/Desktop` 的相对路径即为 `../Desktop`。 + +当前用户的 home 文件夹简称为 `~/`,假设我们的用户名是 `user`: + +```bash +user@computer:~$ cd ~/ +user@computer:~$ pwd +/home/user +``` + +### User + +Linux 在设计之初就是一个多用户操作系统,不像潜伏在多用户操作系统里面的纯正单用户操作系统 Windows。 + +![](https://cdn.xyxsw.site/windows-single-user.jpeg) + +因此,Linux 对于用户和权限的管理比较严格,可能经常要你输 root 密码。 + +简单来说,Linux 中存在两类用户。第一类用户即为 root 用户,也称为超级用户,它拥有系统中最高的权限。第二类用户就是除了 root 用户的普通用户,他们可以拥有不同等级的权限。使用 root 权限时需要十分小心。 + +一般情况下,我们使用的都是普通用户。但是要进行一些涉及较高权限的操作,比如安装软件和修改系统设置的的时候,我们就会使用 sudo 软件临时切换到 root 用户进行操作。 + +```bash +# 一些例子。 +# 当你尝试安装 vim ,却忘记了 sudo +$ apt install vim +E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied) +E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root? +# 这样就可以安装了 +$ sudo apt install vim +``` + +切记,root 权限的使用要小心,不要随便粘贴指令!一条命令就可以干掉整个系统,比如 `sudo rm -rf /*`! + +### 本土化 + +想要正常使用系统,哈利波特是必须的。建议跟着[这篇教程](https://arch.icekylin.online/guide/rookie/transparent.html)走,但是 Debian 系没有这个软件,自己去 Github 上面找这个软件。 + +发行版会有一个全局的代理设置,但是有些软件就是不肯自己读取,点名 Firefox。不过好办,分别单独设置就行。 + +由于海外的服务器下载慢,我们会把软件源换成国内各个高校的镜像。这点参考镜像站给出的教程。 + +输入法一律推荐 fcitx5 搭配 fcitx5-chinese-addons,并打开云拼音。不推荐 rime,太老了。强烈不推荐搜狗,搜狗根本不懂 Linux。一般来说 Debian 系的发行版都有一个叫做 im-config 的软件包负责管理输入法,快捷方式名字通常是叫做 Input Method,在这里切换到 fcitx5 就行。Arch Linux 系则需要自己设置环境变量。 + +### 如何寻求帮助 + +首先阅读[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md),这对提升个人素养很有帮助。也有助于和能够提供帮助的人有效交流。 + +一般来说,各个发行版都有自己的 Wiki,里面介绍了发行版本身的特点,常用的软件和各种问题的解法。但是有些发行版的 wiki 年久失修,可能会过时或者缺失内容导致无法解决问题。这时候可以其他发行版的 wiki ,只要了解发行版之间的差异,自己适度发挥,也能解决问题。推荐的有 [Arch Linux wiki](https://wiki.archlinux.org) (神中神,非常推荐) 和 [Debian wiki](https://wiki.debian.org) (Debian 系可以看),他们的社区比较活跃,维护比较积极。 + +社区是 Linux 当中重要的组成部分。发行版通常有自己的论坛,邮件组和 IRC 频道。如果你确信你面对的是一个全新的问题,网上找不到已有的解决方案。或者你的能力不足以找到解决方案。可以尝试在这些地方求助。保持良好的态度,尽可能详细地描述问题,相信会有志愿者来解答的。 + +### 推荐阅读 + +- [archlinux 简明指南](https://arch.icekylin.online/): 虽然是 Arch Linux 的教程,但是写的很好,其他发行版也能参考。 +- [Linux 就该这样学](https://www.linuxprobe.com/docs/LinuxProbe.pdf): 不错的书,适合长期看。 diff --git a/3.编程思维体系构建/3.Y.2双系统安装和发行版推荐.md b/3.编程思维体系构建/3.Y.2双系统安装和发行版推荐.md new file mode 100644 index 0000000..0fb830c --- /dev/null +++ b/3.编程思维体系构建/3.Y.2双系统安装和发行版推荐.md @@ -0,0 +1,613 @@ +# Distro + +这篇文章是关于双系统的发行版推荐,如果只是想尝试 Linux, 暂时没有长期使用的打算,可以直接跳过。 + +## 前言 + +我接触桌面版 Linux 有些年头了。 +Linux 省了我不少时间,也花了我不少时间。也算用出点心得了,知道 Linux 有多必要,也知道有多坑。 +曾经我试图寻找一个“最好的”版本向新人推荐,事实证明这样的想法是走了弯路。 +现在我敢说没有一个发行版能完全做到“新手友好”,都或多或少存在一点坑。与其寻找一个“终极”发行版,不如列一个发行版选择清单,可以根据自己的需求选择。给常见坑摘要,提供修复方法,或者给出某个发行版出现致命问题时给出替代选择。争取让入门 Linux 难度降下来。 + +## Notice + +::: warning +再次声明:这篇文章是关于双系统的发行版推荐,如果只是想尝试 Linux, 暂时没有长期使用的打算,可以直接跳过。 +请仔细阅读本文,并按照步骤操作,否则可能会**导致系统无法使用甚至丢失数据**。建议提前**备份数据**,避免手误。 +::: + +双系统安装时,**关闭快速启动,关闭安全启动,关闭 Bitlocker**! + +已知快速启动开启时,Windows 会锁定无线网卡和硬盘等硬件,导致 Linux 无法使用。关闭快速启动可以在主板或者 Windows 上面设置。建议在 Windows 上面设置。[如何关闭快速启动(知乎)](https://zhuanlan.zhihu.com/p/589927741) + +大部分 Linux 发行版不支持安全启动,因为要给微软交保护费。事实上这个功能对安全性没有作用,只是阻止了没交保护费的系统的启动而已。请在主板的 BOIS 设置内关闭。 + +Bitlocker 可能会自杀最好关掉。如果你很确信自己有加密需求,建议提前备份所有重要数据,并准备 [WePE](https://www.wepe.com.cn/download.html) 和 [Windows 安装镜像](https://www.microsoft.com/en-us/software-download/windows10),随时准备修复。 + +我们始终建议使用包管理器。目前已知的除了 VSCode 需要手动安装,其他的都尽量使用系统自带和 Flatpak。 + +## USB-live + +在开始之前,请准备一个空的 U 盘。 + +建议使用 [Ventoy](https://www.ventoy.net/cn/index.html) 这款工具制作可启动 U 盘,这样可以直接把 ISO 文件拖进 U 盘,在先后安装不同发行版的时候不需要反复烧录 U 盘。 + +但是这个方案无法使用某些 iso ,比如 Debian 的 DVD 镜像就会因为找不到挂载点而失败。这时候你可能需要使用 [rufus](https://rufus.ie/zh/) 对 U 盘进行烧录。 + +## Beginner + +列出常见的开箱即用发行版,不一定推荐,但是总觉得得提两句,方便选择。 + +### Debian based + +由于大部分 Debian 系发行版使用同样的安装程序,只有一些细微的差别,所以我只给出 Linux Mint 的详细安装教程,其他发行版提出一些要点即可举一反三。 + +这类发行版使用的都是 apt 包管理器,大多数软件都是互通的。 + +#### Linux Mint + +就我个人认为,对新手来说 Linux Mint 是个不错的入门发行版。它基于 Ubuntu ,软件生态好。Cinnamon 桌面可能不是很惊艳,但是简洁直观。 + +Mint 对很多需要打命令的操作都做了 GUI,这样新手更容易使用。这是我见过为数不多的把开箱即用和可定制结合的比较好的主流发行版。 + +首先去 Mint 官网 下载 Cinnamon 版本。如果你使用新硬件可以下载 Cinnamon Edge。 + +点击 Download 之后会跳转到下载页面,你可以下拉列表选择 China 源进行下载,速度会很快。 + +如果有 Windows 存在的情况下,Mint 可以自动选择一个最大的分区,让你划出一定大小的空间用来安装。如果你分了很多盘,你可以在 Windows 下提前使用 Diskgenius 之类的分区软件整理你的分区,把剩余空间集中到一个盘上面,好让 Mint 自动缩小你想要缩小的盘,而不是手动指定。操作页面就像这样。 + +![mint windows size](https://cdn.xyxsw.site/mint-windows-size.png) + +##### 安装 + +用手机打开这个教程,插上你的 U 盘,关机。我们就可以开始安装了。 + +首先要启动到 U 盘,这个请自行查阅你们的电脑的启动方法。如果成功,你就可以看到这个页面。按下回车,耐心等待,就可以进入安装页面了。在这个页面按下回车。 + +![boot](https://cdn.xyxsw.site/mint-install-1.png) + +不久就进入这个页面。打开左上角的安装程序可以进行安装。如果使用 Ventoy 让你 umount 什么点确定就可以了。 + +![live](https://cdn.xyxsw.site/mint-install-2.png) + +建议使用英文进行安装,以后自己手动设置中文,这样配置不容易出错。所以这里点击 Continue 就行 + +![language](https://cdn.xyxsw.site/mint-install-3.png) + +continue + +![keyboard](https://cdn.xyxsw.site/mint-install-4.png) + +勾选,然后 continue. 这样 mp4 一类的格式就可以默认正常打开。 + +![multimedia](https://cdn.xyxsw.site/mint-install-5.png) + +由于我这里是虚拟机,只有清空磁盘的选项。你们如果已经有 Windows 的机子可以选择 install alongside Windows。 + +![install type](https://cdn.xyxsw.site/mint-install-6.png) + +在地图上找到中国,点击。 + +![location](https://cdn.xyxsw.site/mint-install-7.png) + +输入你的用户名和密码。密码建议别太简单,以后如果要跑公网服务给打烂了就不好了。这里的密码就是反面教材,字典两分钟打爆的那种。 + +![user](https://cdn.xyxsw.site/mint-install-8.png) + +等待安装。 + +![installing](https://cdn.xyxsw.site/mint-install-9.png) + +你可以查看安装程序的输出。 + +![still installing](https://cdn.xyxsw.site/mint-install-10.png) + +准备重启。 + +![install complete](https://cdn.xyxsw.site/mint-install-11.png) + +##### 配置 + +第一次启动。可以看到画风还是很贴近 Windows 的。 + +![first boot](https://cdn.xyxsw.site/mint-install-12.png) + +默认使用的软件源在国外,下载很慢,我们要换成国内源。 + +Linux Mint 的很多操作都是有对应的软件的的,非常方便。通过按 Win 键左下角的启动菜单,直接搜索名字就能打开相应的软件。很多人从 Windows 那里带来了放一桌面的快捷方式的习惯。Linux 的软件一般不放桌面快捷方式,而是通过菜单打开,这样更清爽高效。 + +在左下角搜索 software sources, 进入换源页面。其他软件也可以用这样的方式打开。 + +![software source](https://cdn.xyxsw.site/mint-install-13.png) + +输入密码。 + +![opening](https://cdn.xyxsw.site/mint-install-14.png) + +分别将 Main 和 Base 的源都换成国内源。我这里换成中科大的源,你们也可以换其他的。 + +![initial source](https://cdn.xyxsw.site/mint-install-15.png) + +换源的页面长这样,可以点击选择,然后 右下角 Apply 即可 + +![select mirror](https://cdn.xyxsw.site/mint-install-16.png) + +这里选 Main 的源。 + +![USTC](https://cdn.xyxsw.site/mint-install-17.png) + +Base 的源。 + +![next mirror](https://cdn.xyxsw.site/mint-install-18.png) + +可以看到源换好了,按下 OK 就可以保存更改。 + +![mirror](https://cdn.xyxsw.site/mint-install-19.png) + +接下来就是安装输入法。打开 Synaptic 包管理器,这是一个 apt 的 GUI 页面,比较适合新手。点开 Search, 输入 fcitx5,搜索。 + +![install fcitx5](https://cdn.xyxsw.site/mint-install-20.png) + +勾选 fcitx5, 在弹出的窗口点击确定。然后勾选 fcitx5-chinese-addons。因为 fcitx5 只是一个框架,输入法在 fcitx5-chinese-addons 里面,所以两个都要安装。 + +点击左上方的 Apply 就可以安装了。 + +![select fcitx5 and install](https://cdn.xyxsw.site/mint-install-21.png) + +安装完成之后,打开 input method,将输入法从 none 切换到 fcitx5, 保存。 + +![change input method](https://cdn.xyxsw.site/mint-install-22.png) + +现在已经切换成功了。 + +![fcitx5](https://cdn.xyxsw.site/mint-install-23.png) + +打开 Fcitx5 Configuration,在右侧的可用输入法页面中搜索 Pinyin,选中,点击两个分页面中间的左箭头即可添加 pinyin 到 fcitx5. 然后点击下方 Apply 即可。 + +![add pinyin](https://cdn.xyxsw.site/mint-install-24.png) + +可以点击 Global Options 的标签页来修改快捷键。 + +![global options](https://cdn.xyxsw.site/mint-install-25.png) + +下一步,在 Language Settings 里面修改当前的语言为中文。 + +![langauge settings](https://cdn.xyxsw.site/mint-install-26.png) + +如果你是 Nvidia 显卡,现在可以打开 Driver Manager 安装 Nvidia 的驱动。我因为是虚拟机截不到图。建议 40 系显卡使用 525 版本的驱动,而不是他的推荐的 535,亲测崩溃。 + +![setting up driver](https://cdn.xyxsw.site/mint-install-27.png) + +这些都完成了就可以重启了。重启之后会问你要不要更新路径,选择保留就的名称(Keep Old Names).这很重要,如果你不想在 bash 中 cd 来 cd 去的时候切换输入法的话。 + +![next boot](https://cdn.xyxsw.site/mint-install-28.png) + +![fcitx5 font size](https://cdn.xyxsw.site/mint-install-29.png) + +![flatpak change mirror](https://cdn.xyxsw.site/mint-install-30.png) + +![boot](https://cdn.xyxsw.site/mint-install-31.png) + +剩下就是一些安装后常用的操作了。Mint 默认自带 Flatpak,所以也不需要手动安装了。 + +#### Ubuntu + +Ubuntu 可能是最热门的发行版,某些情况下提到 Linux 就是 Ubuntu。但是 Ubuntu 有时候会作出对开发者而言比较迷惑的操作。 + +wiki 已有安装教程,我就不自己写了。 + +那么如何配置? + +##### 卸载 snap + +首先卸载 Snap 。注意这样会直接干掉 Firefox,所以确保你已经阅读下面所有内容再开始操作。可以先复制到文本编辑器当中。 + +打开 Software Update(软件与更新),修改 ppa,从 `http://ppa.launchpad.net` 换成 `https://launchpad.proxy.ustclug.org`。这是为了后面安装 Firefox 做准备 + +![](https://cdn.xyxsw.site/ubuntu-ppa.png) + +关闭这个窗口,打开终端,输入 + +```bash +sudo systemctl disable snapd.service +sudo systemctl disable snapd.socket +sudo systemctl disable snapd.seeded.service +sudo snap remove firefox +sudo snap remove snap-store +sudo snap remove gtk-common-themes +sudo snap remove gnome-3-38-2004 +sudo snap remove core18 +sudo snap remove snapd-desktop-integration +sudo rm -rf /var/cache/snapd/ +sudo apt autoremove --purge snapd +rm -rf ~/snap +``` + +接着禁用 firefox 的 snap。 + +打开配置文件: + +```bash +sudo nano /etc/apt/preferences.d/firefox-no-snap +``` + +在文件中粘贴以下内容,保存: + +```text +Package: firefox* +Pin: release o=Ubuntu* +Pin-Priority: -1 +``` + +把 Firefox 请回来 + +```bash +sudo add-apt-repository ppa:mozillateam/ppa +sudo apt update +sudo apt install firefox +``` + +##### 安装输入法 + +参考[Ubuntu22.04安装Fcitx5中文输入法(知乎)](https://zhuanlan.zhihu.com/p/508797663)。基本都可以照做,但是不要跟着他往 `~/.bash_profile` 和 `/etc/profile` 里面丢垃圾。环境变量要写到 `~/.pam_environment` 里面,内容如下,不要和他一样带 `export`: + +```text +XMODIFIERS=@im=fcitx +GTK_IM_MODULE=fcitx +QT_IM_MODULE=fcitx +``` + +提示一下,`~/` 是当前用户文件夹的简称,假如用户名是 `user`,对应的路径就是 `/home/user/`。 + +#### Pop! OS + +这个不是很热门,感觉也一般,只是带了 N 卡的开箱支持,所以 N 卡用户不行可以试试看。 + +Pop! OS 的安装程序会直接无视 Windows,建议先在 Windows 下面用 Diskgenius 之类的软件划出一个 1G 的 FAT32 分区和一个 200G 以上的 EXT4 分区,然后在安装选项里面选择高级选项,把 FAT32 分区作为 EFI,EXT4 分区作为 `/`。 + +#### Zorin OS + +不得不吐槽这帮人把时间都用到魔改 Gnome 外观上面了。到现在还基于 Ubuntu focal, 都 2023 年了。连装个 fcitx5 都费劲。 + +自带 Wine 支持,听说不错,我反正“网络不好”没安装上。 + +#### MX Linux + +distrowatch 上面排名挺高,但是结合发行版实际情况感觉很有刷榜嫌疑。没有很肯定的理由选择的话,还是用 Mint 吧。 + +### Arch based + +因为 Arch Linux 太强势,这里系列主要用的比较多的就是 Manjaro,所以先只写 Manjaro 。后面可能会继续添加。 + +#### Manjaro + +基于 Arch Linux 的开箱即用的发行版,有 Arch Linux 的部分优点,而且对新手更加易用。 + +有过忘记更新证书的黑历史,不过这两年消停会了。 + +安装过程如图。 + +![](https://cdn.xyxsw.site/manjaro-1.png) + +![](https://cdn.xyxsw.site/manjaro-2.png) + +![](https://cdn.xyxsw.site/manjaro-3.png) + +![](https://cdn.xyxsw.site/manjaro-4.png) + +![](https://cdn.xyxsw.site/manjaro-5.png) + +这里要留意一下 + +![](https://cdn.xyxsw.site/manjaro-6.png) + +如果有 Windows 这么选 + +![](https://cdn.xyxsw.site/manjaro-install-alongside.png) + +![](https://cdn.xyxsw.site/manjaro-7.png) + +![](https://cdn.xyxsw.site/manjaro-8.png) + +![](https://cdn.xyxsw.site/manjaro-9.png) + +安装完成,重启。 + +输入法是没有安装的,自己安装。 + +```zsh +sudo pacman -S fcitx5 fcitx5-configtool fcitx5-qt fcitx5-gtk fcitx5-chinese-addons kcm-fcitx5 fcitx5-lua +kate ~/.pam_environment +``` + +kate 会打开 `~/.pam_environment`,接着把下面的环境变量写进去: + +```text +GTK_IM_MODULE=fcitx +QT_IM_MODULE=fcitx +XMODIFIERS=@im=fcitx +``` + +### Others + +#### Deepin + +目前还是 Debian 系,鉴于他们官宣要脱离 Debian,那我就放 Other 里面了。 + +Deepin 的本土化做的很不错,支持一些国内常用的软件。 + +但是总是让我感觉不够 Linux,手感比较奇怪。定位类似产品而不是工具。如果想要在国内替代 Windows 可以试试看。我之前使用的时候太不稳定,小 bug 一堆。现在不知道好点没有。我建议写程序还是少用,设计哲学不一样,容易把自己带偏。 + +#### UOS + +反正不是给我们用的。毕竟 root 权限还要注册他们的账号登陆,没绷住。 + +![](https://cdn.xyxsw.site/uos-3.png) + +![](https://cdn.xyxsw.site/uos-4.png) + +顺便说下我至今没找到 UOS 的源码,只看到[一篇干巴巴的新闻](https://www.zgswcn.com/article/202212/202212211344581036.html)声称“开源了开源了真的在开源了”。也就欺负 Linux Foundation 不打跨国官司。本来不想挂人的,但是[如果 UOS 用户就这素质](https://bbs.chinauos.com/post/7543)我真忍不了: + +![troll](https://cdn.xyxsw.site/uos-troll.png) + +## Advanced(Debian, Arch Linux, etc.) + +面向桌面用户的进阶发行版。Red Hat 根本看不上个人用户,所以我就不自找麻烦了。 + +### Debian + +Debian 的招牌就是稳定。在服务端这个优点非常明显。虽然在桌面端有些软件拖后腿导致它没那么稳,但是比起其他发行版还是更加稳定的。Debian 主要面向专业人士,桌面端不够开箱即用,需要很多额外的配置。祖传的安装界面对新手也不太友好。好在有 live 版本可以使用。 + +Debian 的兼容性非常优秀,在其他发行版挂掉的情况下面都能稳定跑。如果遇到兼容性问题那就直接上 Debian 吧,再怎么样也比 Arch Linux 容易安装一点。而且安装配置结束基本就不会再挂了。最近的 11 和 12 两个大版本一改老旧的形象,积极拥抱新事物,值得尝试。 + +不建议使用 Ventoy 启动 Debian 的镜像,因为 Ventoy 和 Debian 都很喜欢 hack,两者加起来容易爆炸。老老实实用 Rufus 烧录空 U 盘吧。 + +官网下的 ISO 文件是真的多。我这里推荐下载 [Live 镜像](https://mirrors.ustc.edu.cn/debian-cd/current-live/amd64/iso-hybrid/),因为安装相对来说比较方便直观。。下载页面很传统,而且可选的很多,但是不要紧,kde 和 gnome 二选一即可,老爷机就 lxqt。 + +如果你的 Live 镜像出了什么锅炸掉了,可以试试 [DVD 镜像](https://mirrors.ustc.edu.cn/debian-cd/current/amd64/iso-dvd/),祖传的安装页面很不友好,但有时候是唯一的选择。 + +#### Live 安装 + +这里以 Live KDE 为例子,Gnome 也是一样的。 + +首先是祖传的选择系统。直接回车。 + +![](https://cdn.xyxsw.site/debian-live-1.png) + +进来之后是不是很懵?哪里有 Install 呢?多半因为打包的志愿者忘了放快捷方式,自己左下角菜单点出来就好了。 + +![](https://cdn.xyxsw.site/debian-live-2.png) + +这样点出来。 + +![](https://cdn.xyxsw.site/debian-live-3.png) + +还要输入密码,密码也没告诉你。我去网上搜了一下,这个密码是 `live`。 + +![](https://cdn.xyxsw.site/debian-live-4.png) + +这样就打开了安装页面了。一路下一步吧。 + +![](https://cdn.xyxsw.site/debian-live-5.png) + +![](https://cdn.xyxsw.site/debian-live-6.png) + +![](https://cdn.xyxsw.site/debian-live-7.png) + +到这里,我们需要选择安装方式。我这里是虚拟机,只能看到 Erase disk 这个选项。如果有是 Windows 会出现别的选项。 + +![](https://cdn.xyxsw.site/debian-live-8.png) + +在已经有 Windows 安装好的情况下面是这样的。 + +![](https://cdn.xyxsw.site/debian-live-alongside.png) + +用户名和密码 + +![](https://cdn.xyxsw.site/debian-live-9.png) + +双系统的用户在这一页面检查一下,别把 Windows 干掉了。 + +![](https://cdn.xyxsw.site/debian-live-10.png) + +重启吧。 + +![](https://cdn.xyxsw.site/debian-live-11.png) + +#### 传统安装 + +有时候只能传统安装。思路和 Live 是差不多的,只是程序有点丑,然后有些不是很直观。看仔细点就行。一般很少用到。 + +#### 配置系统 + +##### 通用部分 + +打开 Konsole(KDE) 或者 Terminal(Gnome) 准备打命令。Gnome 用户按下 Win 键即可呼出搜索。 + +先[换源](https://mirrors.ustc.edu.cn/help/debian.html),再[安装输入法](https://wiki.debian.org/I18n/Fcitx5)和 [flatpak](https://flathub.org/setup/Debian),顺便换个 [flathub 源](https://mirror.sjtu.edu.cn/docs/flathub)。下面把这些教程整合起来。 + +依次输入这些命令,看清楚要求。 + +```bash +# 换源 +sudo sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list +sudo sed -i 's/security.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list +sudo apt update && sudo apt upgrade +``` + +如果出现类似 `E: 仓库 "http://mirrors.ustc.edu.cn/debian/ bookworm-security Release" 没有 Release 文件` 的报错,请用 `sudo nano /ect/apt/sources.list` 打开,手动将 `http://mirrors.ustc.edu.cn/debian/ bookworm-security` 改成 `http://mirrors.ustc.edu.cn/debian-security/ bookworm-security`,并再次 `sudo apt update`。 + +```bash +# 时间同步 +sudo apt install systemd-timesyncd +# 安装输入法 +sudo apt install --install-recommends fcitx5 fcitx5-chinese-addons +``` + +```bash +# flatpak +sudo apt install flatpak +# 下面两个命令二选一即可 +sudo apt install plasma-discover-backend-flatpak # 对于 KDE 桌面 +sudo apt install gnome-software-plugin-flatpak # 对 Gnome 桌面 +# 添加仓库 +flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo +# 换源 +flatpak remote-modify flathub --url=https://mirror.sjtu.edu.cn/flathub +``` + +对于 Nvidia 显卡,还要[安装驱动](https://wiki.debian.org/NvidiaGraphicsDrivers#Debian_12_.22Bookworm.22)。 + +我们需要把 `non-free contrib` 这两个仓库加上。可以在文件管理器中打开 `/etc/apt/` 这个目录, 双击 `sources.list` 文件。(Gnome 的文件管理器按 Win+L 可以输入路径) + +Gnome 会弹出一个窗口,全勾起来保存就行。 + +![sources.list](https://cdn.xyxsw.site/sources.png) + +KDE 会用 Kate 打开它,每行都加上 `non-free contrib`,保存,Over. + +![sources.list](https://cdn.xyxsw.site/debian-kde-source.png) + +接下来打开命令行,执行: + +```bash +sudo apt update +sudo apt install nvidia-driver firmware-misc-nonfree +``` + +结束之后,重启。KDE 重启之后记得在登录页面把左下角桌面设置换成 X11。 + +##### KDE 部分 + +安装完大概是这样的。 + +![](https://cdn.xyxsw.site/debian-live-12.png) + +打开 input method,修改输入法。注意不要开错了。 + +![](https://cdn.xyxsw.site/debian-live-13.png) + +OK + +![](https://cdn.xyxsw.site/debian-live-14.png) + +YES + +![](https://cdn.xyxsw.site/debian-live-15.png) + +选中 fcitx5 + +![](https://cdn.xyxsw.site/debian-live-16.png) + +OK + +![](https://cdn.xyxsw.site/debian-live-17.png) + +打开 Fcitx 5 的设置。 + +![](https://cdn.xyxsw.site/debian-live-18.png) + +现在还没自动运行。平时也可以在这里启动设置。 + +![](https://cdn.xyxsw.site/debian-live-19.png) + +点击右下角 Add Input Method + +![](https://cdn.xyxsw.site/debian-live-20.png) + +搜索 Pinyin,选中,Add。 + +![](https://cdn.xyxsw.site/debian-live-21.png) + +默认的字体非常小,建议更改。点击 Configure addons,因为 UI 属于 Addon。至于快捷键可以在另一个设置里面改。 + +![](https://cdn.xyxsw.site/debian-live-22.png) + +设置 Classic User Interface + +![](https://cdn.xyxsw.site/debian-live-23.png) + +这里可以更改字体。 + +![](https://cdn.xyxsw.site/debian-live-24.png) + +然后就能使用了。 + +![](https://cdn.xyxsw.site/debian-live-25.png) + +可以更改 Language 为中文了。 + +![](https://cdn.xyxsw.site/debian-live-26.png) + +Flathub 上面的软件可以通过 KDE 自带的 Discover 应用中心安装。 + +这里我们看到 flatpak 已经启用了。 + +![](https://cdn.xyxsw.site/debian-live-27.png) + +##### Gnome + +Gnome 开箱状态就是残废,本来应该是官方做的事情,结果 Gnome 摆 Debian 也摆,都丢给用户了。 + +Gnome 一上来就让你改语言,改中文就行,然后一路下一步。下次重启可能会问你是否更改文件名称,选择否。 + +![](https://cdn.xyxsw.site/debian-live-gnome1.png) + +然后按下 Win 键进入菜单,呼出 Terminal, 安装一些插件。 + +![](https://cdn.xyxsw.site/debian-live-gnome2.png) + +![](https://cdn.xyxsw.site/debian-live-gnome3.png) + +```bash +sudo apt install gnome-shell-extension-dashtodock gnome-shell-extension-desktop-icons-ng gnome-shell-extension-kimpanel +``` + +我们之前已经装好 fcitx5, 所以这里启用就行。 + +![](https://cdn.xyxsw.site/debian-live-gnome4.png) + +![](https://cdn.xyxsw.site/debian-live-gnome5.png) + +一切完成,重启。 + +![](https://cdn.xyxsw.site/debian-live-gnome6.png) + +打开 Extension,启用任务栏,桌面图标和输入法面板的拓展。 + +![](https://cdn.xyxsw.site/debian-live-gnome10.png) + +![](https://cdn.xyxsw.site/debian-live-gnome7.png) + +打开 tweaks, 启用最大化和最小化按钮。当然 2k 屏幕也可以改改缩放。 + +![](https://cdn.xyxsw.site/debian-live-gnome8.png) + +![](https://cdn.xyxsw.site/debian-live-gnome9.png) + +差不多能用了,剩下可以自己折腾。 + +#### Trouble shooting + +##### 没有 sudo 权限 + +多半是打包的忘了加上去,自己加一下就好了。 + +```bash +su root +sudo usermod -a -G sudo <你的用户名> +``` + +### Arch Linux + +邪教教主。好用是真的好用,邪教也是真的邪教。建议有事没事看那边的 wiki,写的是真的很好。 + +安装教程我就不再班门弄斧了,可以自己看。 + +### Fedora + +以后写吧,不会比 Debian 难的。 + +### OpenSUSE + +为数不多官方 KDE 的发行版,可能是因为他们总部都在德国。感觉 SUSE 中规中矩,这么多年都没搞出什么大新闻。 diff --git a/3.编程思维体系构建/3.Y.1VMware的安装与安装Ubuntu22.04系统.md b/3.编程思维体系构建/3.Y.3VMware的安装与安装Ubuntu22.04系统.md similarity index 99% rename from 3.编程思维体系构建/3.Y.1VMware的安装与安装Ubuntu22.04系统.md rename to 3.编程思维体系构建/3.Y.3VMware的安装与安装Ubuntu22.04系统.md index e7edef8..c73908c 100644 --- a/3.编程思维体系构建/3.Y.1VMware的安装与安装Ubuntu22.04系统.md +++ b/3.编程思维体系构建/3.Y.3VMware的安装与安装Ubuntu22.04系统.md @@ -1,6 +1,6 @@ # VMware 的安装与安装 Ubuntu22.04 系统 -::: warning 💡 +::: warning 一般与 wsl 安装二选一,因为都是虚拟系统,安装了 wsl 不用 VMware 文章撰写于 2022 年,可能其中的一些内容已过时。 @@ -36,7 +36,6 @@ 这里推荐使用多线程下载器下载,比如 [IDM](../2.高效学习/2.2优雅的使用工具.md),如果直接用浏览器下载(线程少)可能会出现下载慢、下载失败的情况。 ::: - 下好回到 VMware ![](https://cdn.xyxsw.site/boxcnGHnjgZvtcBrm0XXitFl4Jg.png) diff --git a/3.编程思维体系构建/3.Y.2WSL的安装.md b/3.编程思维体系构建/3.Y.4WSL的安装.md similarity index 100% rename from 3.编程思维体系构建/3.Y.2WSL的安装.md rename to 3.编程思维体系构建/3.Y.4WSL的安装.md diff --git a/3.编程思维体系构建/3.Y.3Linux初探索.md b/3.编程思维体系构建/3.Y.5Linux初探索.md similarity index 99% rename from 3.编程思维体系构建/3.Y.3Linux初探索.md rename to 3.编程思维体系构建/3.Y.5Linux初探索.md index 0868f69..f635ad3 100644 --- a/3.编程思维体系构建/3.Y.3Linux初探索.md +++ b/3.编程思维体系构建/3.Y.5Linux初探索.md @@ -100,7 +100,7 @@ cd Templates 可以完成目录的切换。注意在输入目录名时,`tab` 键可以提供联想。 -#### ** 你感到键入困难吗?** +#### 你感到键入困难吗? ::: warning 💡 你可能会经常要在终端里输入类似于 diff --git a/3.编程思维体系构建/3.Y.4Vim初探索.md b/3.编程思维体系构建/3.Y.6Vim初探索.md similarity index 100% rename from 3.编程思维体系构建/3.Y.4Vim初探索.md rename to 3.编程思维体系构建/3.Y.6Vim初探索.md diff --git a/3.编程思维体系构建/3.Y.5linux小任务.md b/3.编程思维体系构建/3.Y.7linux小任务.md similarity index 100% rename from 3.编程思维体系构建/3.Y.5linux小任务.md rename to 3.编程思维体系构建/3.Y.7linux小任务.md diff --git a/3.编程思维体系构建/3.编程思维体系构建.md b/3.编程思维体系构建/3.编程思维体系构建.md index 227724b..ea7cf28 100644 --- a/3.编程思维体系构建/3.编程思维体系构建.md +++ b/3.编程思维体系构建/3.编程思维体系构建.md @@ -24,7 +24,7 @@ python 内容完成后,基本学习到如何使用 python 当一门工具使 如果你要开始,推荐你从 3.0 开始阅读,然后挑选你喜欢的内容 -[【计算机科学速成课】[40集全/精校] - Crash Course Computer Science](https://www.bilibili.com/video/BV1EW411u7th) +[【计算机科学速成课】[40 集全/精校] - Crash Course Computer Science](https://www.bilibili.com/video/BV1EW411u7th) @@ -51,3 +51,7 @@ python 内容完成后,基本学习到如何使用 python 当一门工具使 [learn vim](https://github.com/wsdjeg/Learn-Vim_zh_cn) Book:教材替换用书——《C Primer Plus》 + +::: tip 📥 +《C Primer Plus》(第六版中文版)(216MB)附件下载 +::: diff --git a/3.编程思维体系构建/static/debian-kde-source.png b/3.编程思维体系构建/static/debian-kde-source.png new file mode 100644 index 0000000..c1048cc Binary files /dev/null and b/3.编程思维体系构建/static/debian-kde-source.png differ diff --git a/3.编程思维体系构建/static/debian-live-1.png b/3.编程思维体系构建/static/debian-live-1.png new file mode 100644 index 0000000..9cefb7a Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-1.png differ diff --git a/3.编程思维体系构建/static/debian-live-10.png b/3.编程思维体系构建/static/debian-live-10.png new file mode 100644 index 0000000..3ebf293 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-10.png differ diff --git a/3.编程思维体系构建/static/debian-live-11.png b/3.编程思维体系构建/static/debian-live-11.png new file mode 100644 index 0000000..9a750d3 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-11.png differ diff --git a/3.编程思维体系构建/static/debian-live-12.png b/3.编程思维体系构建/static/debian-live-12.png new file mode 100644 index 0000000..90b5ba5 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-12.png differ diff --git a/3.编程思维体系构建/static/debian-live-13.png b/3.编程思维体系构建/static/debian-live-13.png new file mode 100644 index 0000000..49c28be Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-13.png differ diff --git a/3.编程思维体系构建/static/debian-live-14.png b/3.编程思维体系构建/static/debian-live-14.png new file mode 100644 index 0000000..6d14d02 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-14.png differ diff --git a/3.编程思维体系构建/static/debian-live-15.png b/3.编程思维体系构建/static/debian-live-15.png new file mode 100644 index 0000000..a292524 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-15.png differ diff --git a/3.编程思维体系构建/static/debian-live-16.png b/3.编程思维体系构建/static/debian-live-16.png new file mode 100644 index 0000000..59d767f Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-16.png differ diff --git a/3.编程思维体系构建/static/debian-live-17.png b/3.编程思维体系构建/static/debian-live-17.png new file mode 100644 index 0000000..f385910 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-17.png differ diff --git a/3.编程思维体系构建/static/debian-live-18.png b/3.编程思维体系构建/static/debian-live-18.png new file mode 100644 index 0000000..bf7face Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-18.png differ diff --git a/3.编程思维体系构建/static/debian-live-19.png b/3.编程思维体系构建/static/debian-live-19.png new file mode 100644 index 0000000..b79faee Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-19.png differ diff --git a/3.编程思维体系构建/static/debian-live-2.png b/3.编程思维体系构建/static/debian-live-2.png new file mode 100644 index 0000000..bf067e9 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-2.png differ diff --git a/3.编程思维体系构建/static/debian-live-20.png b/3.编程思维体系构建/static/debian-live-20.png new file mode 100644 index 0000000..11f7aae Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-20.png differ diff --git a/3.编程思维体系构建/static/debian-live-21.png b/3.编程思维体系构建/static/debian-live-21.png new file mode 100644 index 0000000..0b6e46c Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-21.png differ diff --git a/3.编程思维体系构建/static/debian-live-22.png b/3.编程思维体系构建/static/debian-live-22.png new file mode 100644 index 0000000..646c321 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-22.png differ diff --git a/3.编程思维体系构建/static/debian-live-23.png b/3.编程思维体系构建/static/debian-live-23.png new file mode 100644 index 0000000..9695959 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-23.png differ diff --git a/3.编程思维体系构建/static/debian-live-24.png b/3.编程思维体系构建/static/debian-live-24.png new file mode 100644 index 0000000..3e6197c Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-24.png differ diff --git a/3.编程思维体系构建/static/debian-live-25.png b/3.编程思维体系构建/static/debian-live-25.png new file mode 100644 index 0000000..47b35cc Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-25.png differ diff --git a/3.编程思维体系构建/static/debian-live-26.png b/3.编程思维体系构建/static/debian-live-26.png new file mode 100644 index 0000000..9fe0b39 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-26.png differ diff --git a/3.编程思维体系构建/static/debian-live-27.png b/3.编程思维体系构建/static/debian-live-27.png new file mode 100644 index 0000000..3e0799d Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-27.png differ diff --git a/3.编程思维体系构建/static/debian-live-3.png b/3.编程思维体系构建/static/debian-live-3.png new file mode 100644 index 0000000..5ce92d8 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-3.png differ diff --git a/3.编程思维体系构建/static/debian-live-4.png b/3.编程思维体系构建/static/debian-live-4.png new file mode 100644 index 0000000..c914577 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-4.png differ diff --git a/3.编程思维体系构建/static/debian-live-5.png b/3.编程思维体系构建/static/debian-live-5.png new file mode 100644 index 0000000..9bb1cfd Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-5.png differ diff --git a/3.编程思维体系构建/static/debian-live-6.png b/3.编程思维体系构建/static/debian-live-6.png new file mode 100644 index 0000000..baa8b08 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-6.png differ diff --git a/3.编程思维体系构建/static/debian-live-7.png b/3.编程思维体系构建/static/debian-live-7.png new file mode 100644 index 0000000..04bbf45 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-7.png differ diff --git a/3.编程思维体系构建/static/debian-live-8.png b/3.编程思维体系构建/static/debian-live-8.png new file mode 100644 index 0000000..1f769fd Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-8.png differ diff --git a/3.编程思维体系构建/static/debian-live-9.png b/3.编程思维体系构建/static/debian-live-9.png new file mode 100644 index 0000000..351b7e4 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-9.png differ diff --git a/3.编程思维体系构建/static/debian-live-alongside.png b/3.编程思维体系构建/static/debian-live-alongside.png new file mode 100644 index 0000000..4f17e6c Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-alongside.png differ diff --git a/3.编程思维体系构建/static/debian-live-gnome1.png b/3.编程思维体系构建/static/debian-live-gnome1.png new file mode 100644 index 0000000..33da085 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-gnome1.png differ diff --git a/3.编程思维体系构建/static/debian-live-gnome10.png b/3.编程思维体系构建/static/debian-live-gnome10.png new file mode 100644 index 0000000..bf6fa2d Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-gnome10.png differ diff --git a/3.编程思维体系构建/static/debian-live-gnome2.png b/3.编程思维体系构建/static/debian-live-gnome2.png new file mode 100644 index 0000000..548fa4b Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-gnome2.png differ diff --git a/3.编程思维体系构建/static/debian-live-gnome3.png b/3.编程思维体系构建/static/debian-live-gnome3.png new file mode 100644 index 0000000..a57450f Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-gnome3.png differ diff --git a/3.编程思维体系构建/static/debian-live-gnome4.png b/3.编程思维体系构建/static/debian-live-gnome4.png new file mode 100644 index 0000000..49bbe43 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-gnome4.png differ diff --git a/3.编程思维体系构建/static/debian-live-gnome5.png b/3.编程思维体系构建/static/debian-live-gnome5.png new file mode 100644 index 0000000..ae23a13 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-gnome5.png differ diff --git a/3.编程思维体系构建/static/debian-live-gnome6.png b/3.编程思维体系构建/static/debian-live-gnome6.png new file mode 100644 index 0000000..1cb6254 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-gnome6.png differ diff --git a/3.编程思维体系构建/static/debian-live-gnome7.png b/3.编程思维体系构建/static/debian-live-gnome7.png new file mode 100644 index 0000000..65060a6 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-gnome7.png differ diff --git a/3.编程思维体系构建/static/debian-live-gnome8.png b/3.编程思维体系构建/static/debian-live-gnome8.png new file mode 100644 index 0000000..27b53a5 Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-gnome8.png differ diff --git a/3.编程思维体系构建/static/debian-live-gnome9.png b/3.编程思维体系构建/static/debian-live-gnome9.png new file mode 100644 index 0000000..d7f08fc Binary files /dev/null and b/3.编程思维体系构建/static/debian-live-gnome9.png differ diff --git a/3.编程思维体系构建/static/manjaro-1.png b/3.编程思维体系构建/static/manjaro-1.png new file mode 100644 index 0000000..aac0244 Binary files /dev/null and b/3.编程思维体系构建/static/manjaro-1.png differ diff --git a/3.编程思维体系构建/static/manjaro-2.png b/3.编程思维体系构建/static/manjaro-2.png new file mode 100644 index 0000000..6640546 Binary files /dev/null and b/3.编程思维体系构建/static/manjaro-2.png differ diff --git a/3.编程思维体系构建/static/manjaro-3.png b/3.编程思维体系构建/static/manjaro-3.png new file mode 100644 index 0000000..31de019 Binary files /dev/null and b/3.编程思维体系构建/static/manjaro-3.png differ diff --git a/3.编程思维体系构建/static/manjaro-4.png b/3.编程思维体系构建/static/manjaro-4.png new file mode 100644 index 0000000..628c424 Binary files /dev/null and b/3.编程思维体系构建/static/manjaro-4.png differ diff --git a/3.编程思维体系构建/static/manjaro-5.png b/3.编程思维体系构建/static/manjaro-5.png new file mode 100644 index 0000000..3d3bd4a Binary files /dev/null and b/3.编程思维体系构建/static/manjaro-5.png differ diff --git a/3.编程思维体系构建/static/manjaro-6.png b/3.编程思维体系构建/static/manjaro-6.png new file mode 100644 index 0000000..65b4d92 Binary files /dev/null and b/3.编程思维体系构建/static/manjaro-6.png differ diff --git a/3.编程思维体系构建/static/manjaro-7.png b/3.编程思维体系构建/static/manjaro-7.png new file mode 100644 index 0000000..6bc2dee Binary files /dev/null and b/3.编程思维体系构建/static/manjaro-7.png differ diff --git a/3.编程思维体系构建/static/manjaro-8.png b/3.编程思维体系构建/static/manjaro-8.png new file mode 100644 index 0000000..4e7de86 Binary files /dev/null and b/3.编程思维体系构建/static/manjaro-8.png differ diff --git a/3.编程思维体系构建/static/manjaro-9.png b/3.编程思维体系构建/static/manjaro-9.png new file mode 100644 index 0000000..f398f68 Binary files /dev/null and b/3.编程思维体系构建/static/manjaro-9.png differ diff --git a/3.编程思维体系构建/static/manjaro-install-alongside.png b/3.编程思维体系构建/static/manjaro-install-alongside.png new file mode 100644 index 0000000..3a19594 Binary files /dev/null and b/3.编程思维体系构建/static/manjaro-install-alongside.png differ diff --git a/3.编程思维体系构建/static/mint-install-1.png b/3.编程思维体系构建/static/mint-install-1.png new file mode 100644 index 0000000..69c605c Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-1.png differ diff --git a/3.编程思维体系构建/static/mint-install-10.png b/3.编程思维体系构建/static/mint-install-10.png new file mode 100644 index 0000000..e1736d8 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-10.png differ diff --git a/3.编程思维体系构建/static/mint-install-11.png b/3.编程思维体系构建/static/mint-install-11.png new file mode 100644 index 0000000..754ad94 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-11.png differ diff --git a/3.编程思维体系构建/static/mint-install-12.png b/3.编程思维体系构建/static/mint-install-12.png new file mode 100644 index 0000000..e99a654 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-12.png differ diff --git a/3.编程思维体系构建/static/mint-install-13.png b/3.编程思维体系构建/static/mint-install-13.png new file mode 100644 index 0000000..2ca8233 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-13.png differ diff --git a/3.编程思维体系构建/static/mint-install-14.png b/3.编程思维体系构建/static/mint-install-14.png new file mode 100644 index 0000000..e334719 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-14.png differ diff --git a/3.编程思维体系构建/static/mint-install-15.png b/3.编程思维体系构建/static/mint-install-15.png new file mode 100644 index 0000000..0209583 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-15.png differ diff --git a/3.编程思维体系构建/static/mint-install-16.png b/3.编程思维体系构建/static/mint-install-16.png new file mode 100644 index 0000000..9a0098f Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-16.png differ diff --git a/3.编程思维体系构建/static/mint-install-17.png b/3.编程思维体系构建/static/mint-install-17.png new file mode 100644 index 0000000..7d39d54 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-17.png differ diff --git a/3.编程思维体系构建/static/mint-install-18.png b/3.编程思维体系构建/static/mint-install-18.png new file mode 100644 index 0000000..cb05979 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-18.png differ diff --git a/3.编程思维体系构建/static/mint-install-19.png b/3.编程思维体系构建/static/mint-install-19.png new file mode 100644 index 0000000..f3108bc Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-19.png differ diff --git a/3.编程思维体系构建/static/mint-install-2.png b/3.编程思维体系构建/static/mint-install-2.png new file mode 100644 index 0000000..b371df0 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-2.png differ diff --git a/3.编程思维体系构建/static/mint-install-20.png b/3.编程思维体系构建/static/mint-install-20.png new file mode 100644 index 0000000..9f32d8d Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-20.png differ diff --git a/3.编程思维体系构建/static/mint-install-21.png b/3.编程思维体系构建/static/mint-install-21.png new file mode 100644 index 0000000..563613c Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-21.png differ diff --git a/3.编程思维体系构建/static/mint-install-22.png b/3.编程思维体系构建/static/mint-install-22.png new file mode 100644 index 0000000..9ce5bdd Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-22.png differ diff --git a/3.编程思维体系构建/static/mint-install-23.png b/3.编程思维体系构建/static/mint-install-23.png new file mode 100644 index 0000000..6a89af5 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-23.png differ diff --git a/3.编程思维体系构建/static/mint-install-24.png b/3.编程思维体系构建/static/mint-install-24.png new file mode 100644 index 0000000..4c61cb1 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-24.png differ diff --git a/3.编程思维体系构建/static/mint-install-25.png b/3.编程思维体系构建/static/mint-install-25.png new file mode 100644 index 0000000..894cb7a Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-25.png differ diff --git a/3.编程思维体系构建/static/mint-install-26.png b/3.编程思维体系构建/static/mint-install-26.png new file mode 100644 index 0000000..9fea5b8 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-26.png differ diff --git a/3.编程思维体系构建/static/mint-install-27.png b/3.编程思维体系构建/static/mint-install-27.png new file mode 100644 index 0000000..bda4ed7 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-27.png differ diff --git a/3.编程思维体系构建/static/mint-install-28.png b/3.编程思维体系构建/static/mint-install-28.png new file mode 100644 index 0000000..3819df1 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-28.png differ diff --git a/3.编程思维体系构建/static/mint-install-29.png b/3.编程思维体系构建/static/mint-install-29.png new file mode 100644 index 0000000..d3e5912 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-29.png differ diff --git a/3.编程思维体系构建/static/mint-install-3.png b/3.编程思维体系构建/static/mint-install-3.png new file mode 100644 index 0000000..6b51b0e Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-3.png differ diff --git a/3.编程思维体系构建/static/mint-install-30.png b/3.编程思维体系构建/static/mint-install-30.png new file mode 100644 index 0000000..5c5f810 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-30.png differ diff --git a/3.编程思维体系构建/static/mint-install-31.png b/3.编程思维体系构建/static/mint-install-31.png new file mode 100644 index 0000000..5f62c01 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-31.png differ diff --git a/3.编程思维体系构建/static/mint-install-32.png b/3.编程思维体系构建/static/mint-install-32.png new file mode 100644 index 0000000..af6804f Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-32.png differ diff --git a/3.编程思维体系构建/static/mint-install-4.png b/3.编程思维体系构建/static/mint-install-4.png new file mode 100644 index 0000000..1042fb4 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-4.png differ diff --git a/3.编程思维体系构建/static/mint-install-5.png b/3.编程思维体系构建/static/mint-install-5.png new file mode 100644 index 0000000..1395f89 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-5.png differ diff --git a/3.编程思维体系构建/static/mint-install-6.png b/3.编程思维体系构建/static/mint-install-6.png new file mode 100644 index 0000000..8ba924e Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-6.png differ diff --git a/3.编程思维体系构建/static/mint-install-7.png b/3.编程思维体系构建/static/mint-install-7.png new file mode 100644 index 0000000..ad76778 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-7.png differ diff --git a/3.编程思维体系构建/static/mint-install-8.png b/3.编程思维体系构建/static/mint-install-8.png new file mode 100644 index 0000000..a6efcfb Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-8.png differ diff --git a/3.编程思维体系构建/static/mint-install-9.png b/3.编程思维体系构建/static/mint-install-9.png new file mode 100644 index 0000000..1262c12 Binary files /dev/null and b/3.编程思维体系构建/static/mint-install-9.png differ diff --git a/3.编程思维体系构建/static/mint-windows-size.png b/3.编程思维体系构建/static/mint-windows-size.png new file mode 100644 index 0000000..53d8a9d Binary files /dev/null and b/3.编程思维体系构建/static/mint-windows-size.png differ diff --git a/3.编程思维体系构建/static/sources.png b/3.编程思维体系构建/static/sources.png new file mode 100644 index 0000000..167a452 Binary files /dev/null and b/3.编程思维体系构建/static/sources.png differ diff --git a/3.编程思维体系构建/static/ubuntu-ppa.png b/3.编程思维体系构建/static/ubuntu-ppa.png new file mode 100644 index 0000000..e49542f Binary files /dev/null and b/3.编程思维体系构建/static/ubuntu-ppa.png differ diff --git a/3.编程思维体系构建/static/uos-3.png b/3.编程思维体系构建/static/uos-3.png new file mode 100644 index 0000000..415decf Binary files /dev/null and b/3.编程思维体系构建/static/uos-3.png differ diff --git a/3.编程思维体系构建/static/uos-4.png b/3.编程思维体系构建/static/uos-4.png new file mode 100644 index 0000000..984e97a Binary files /dev/null and b/3.编程思维体系构建/static/uos-4.png differ diff --git a/3.编程思维体系构建/static/uos-troll.png b/3.编程思维体系构建/static/uos-troll.png new file mode 100644 index 0000000..3f84071 Binary files /dev/null and b/3.编程思维体系构建/static/uos-troll.png differ diff --git a/3.编程思维体系构建/static/windows-single-user.jpeg b/3.编程思维体系构建/static/windows-single-user.jpeg new file mode 100644 index 0000000..9af0d8e Binary files /dev/null and b/3.编程思维体系构建/static/windows-single-user.jpeg differ diff --git a/4.人工智能/4.3.4.1程序示例.md b/4.人工智能/4.3.4.1程序示例.md index 8e0d0bc..b7a8f42 100644 --- a/4.人工智能/4.3.4.1程序示例.md +++ b/4.人工智能/4.3.4.1程序示例.md @@ -265,7 +265,7 @@ solution = backtrack(dict()) print(solution) ``` -使用命令`pip install python-constraint`安装constraint库 +使用命令`pip install python-constraint`安装 constraint 库 ```python from constraint import * @@ -308,14 +308,15 @@ for solution in problem.getSolutions(): 2. Steepest-ascent hill-climbing,每次都从相同的初始状态开始 3. Stochastic hill-climbing,每次从不同的初始状态开始 4. Stochastic hill-climbing,每次都从相同的初始状态开始 - 5. 无论是steepest-ascent还是stochastic hill climbing,只要你总是从同一个初始状态开始 - 6. 无论是steepest-ascent还是stochastic hill climbing,只要每次都从不同的初始状态开始 + 5. 无论是 steepest-ascent 还是 stochastic hill climbing,只要你总是从同一个初始状态开始 + 6. 无论是 steepest-ascent 还是 stochastic hill climbing,只要每次都从不同的初始状态开始 7. 没有任何版本的爬山算法能保证每次都能得到相同的解决方案 2. 下面两个问题都会问你关于下面描述的优化问题。 - 一位农民正在尝试种植两种作物,作物1和作物2,并希望实现利润最大化。农民将从种植的每英亩作物1中获得500美元的利润,从种植的每英亩作物2中获得400美元的利润。然而,农民今天需要在早上7点到晚上7点之间的12个小时内完成所有的种植。种植一英亩的作物1需要3个小时,种植一英亩作物2需要2个小时。农民在供应方面也很有限:他有足够的供应种植10英亩的作物1,有足够的资源种植4英亩的作物2。假设变量C1表示要种植的作物1的英亩数,变量C2表示要种植作物2的英亩数。 + 一位农民正在尝试种植两种作物,`作物 1` 和`作物 2`,并希望实现利润最大化。农民将从种植的每英亩`作物 1` 中获得 500 美元的利润,从种植的每英亩`作物 2` 中获得 400 美元的利润。然而,农民今天需要在早上 7 点到晚上 7 点之间的 12 个小时内完成所有的种植。种植一英亩的`作物 1` 需要 3 个小时,种植一英亩`作物 2` 需要 2 个小时。农民在供应方面也很有限:他有足够的供应种植 10 英亩的`作物 1`,有足够的资源种植 4 英亩的`作物 2`。假设变量 C1 表示要种植的`作物 1` 的英亩数,变量 C2 表示要种植`作物 2` 的英亩数。 对于这个问题,什么是有效的目标函数? + 1. 10 \* C1 + 4 \* C2 2. -3 \* C1 - 2 \* C2 3. 500 \* 10 \* C1 + 400 \* 4 \* C2 @@ -330,10 +331,11 @@ for solution in problem.getSolutions(): 4. 下面的问题将问你以下考试安排约束满足图,其中每个节点代表一个课程。每门课程都与可能的考试日的初始域相关联(大多数课程可能在周一、周二或周三;少数课程已经被限制在一天内)。两个节点之间的边意味着这两个课程必须在不同的日子进行考试。 - 在对整个问题满足弧一致性之后,变量C、D和E的结果域是什么? - 1. C的域是\{Mon,Tue\},D的域是\{Wed\},E的域是\{Mon\} - 2. C的域是\{Mon\},D的域是\{Wed\},E的域为\{Tue\} - 3. C的域是\{Mon\},D的域是\{Tue\},E的域为\{Wed\} - 4. C的域是\{Mon\},D的域是\{Mon,Wed\},E的域是\{Tue,Wed\} - 5. C的域是\{Mon,Tue,Wed\},D的域是\{Mon,Wed\},E的域是\{Mon,Tue,Wed\} - 6. C的域是\{Mon\},D的域是\{Mon,Wed\},E的域是\{Mon,Tue,Wed\} + 在对整个问题满足弧一致性之后,变量 C、D 和 E 的结果域是什么? + + 1. C 的域是\{Mon,Tue\},D 的域是\{Wed\},E 的域是\{Mon\} + 2. C 的域是\{Mon\},D 的域是\{Wed\},E 的域为\{Tue\} + 3. C 的域是\{Mon\},D 的域是\{Tue\},E 的域为\{Wed\} + 4. C 的域是\{Mon\},D 的域是\{Mon,Wed\},E 的域是\{Tue,Wed\} + 5. C 的域是\{Mon,Tue,Wed\},D 的域是\{Mon,Wed\},E 的域是\{Mon,Tue,Wed\} + 6. C 的域是\{Mon\},D 的域是\{Mon,Wed\},E 的域是\{Mon,Tue,Wed\} diff --git a/4.人工智能/4.3.4.2项目:填词游戏.md b/4.人工智能/4.3.4.2项目:填词游戏.md index 19597a3..cead1ef 100644 --- a/4.人工智能/4.3.4.2项目:填词游戏.md +++ b/4.人工智能/4.3.4.2项目:填词游戏.md @@ -12,65 +12,67 @@ 编写一个人工智能来完成填词游戏。 -```txt +能够实现将文字转换为图片。 + +```shell $ python generate.py data/structure1.txt data/words1.txt output.png -██████████████ -███████M████R█ -█INTELLIGENCE█ -█N█████N████S█ -█F██LOGIC███O█ -█E█████M████L█ -█R███SEARCH█V█ -███████X████E█ -██████████████ +|█|█|█|█|█|█|█|█|█|█|█|█|█|█| +|█|█|█|█|█|█|█|M|█|█|█|█|R|█| +|█|I|N|T|E|L|L|I|G|E|N|C|E|█| +|█|N|█|█|█|█|█|N|█|█|█|█|S|█| +|█|F|█|█|L|O|G|I|C|█|█|█|O|█| +|█|E|█|█|█|█|█|M|█|█|█|█|L|█| +|█|R|█|█|█|S|E|A|R|C|H|█|V|█| +|█|█|█|█|█|█|█|X|█|█|█|█|E|█| +|█|█|█|█|█|█|█|█|█|█|█|█|█|█| ``` ![4.3.4.2-0](static/4.3.4.2-0.png) ## 背景 -你如何生成一个填字游戏?考虑到填字游戏的结构(即网格中哪些方格需要填入字母),以及要使用的单词列表,问题就变成了选择哪些单词应该填入每个垂直或水平的方格序列。我们可以将这种问题建模为一个约束满足问题。每一个方格序列都是一个变量,我们需要决定它的值(在可能的单词域中哪个单词将被填入该序列)。考虑一下下面的字谜结构。 +你如何生成一个填字游戏?考虑到填字游戏的结构 (即网格中哪些方格需要填入字母),以及要使用的单词列表,问题就变成了选择哪些单词应该填入每个垂直或水平的方格序列。我们可以将这种问题建模为一个约束满足问题。每一个方格序列都是一个变量,我们需要决定它的值 (在可能的单词域中哪个单词将被填入该序列)。考虑一下下面的字谜结构。 ![4.3.4.2-1](static/4.3.4.2-1.png) -在这个结构中,我们有四个变量,代表了我们需要填入这个字谜的四个单词(在上图中每个单词都用数字表示)。每个变量由四个值定义:它开始的行(`i`值),它开始的列(`j`值),单词的方向(纵向或横向down or across),以及单词的长度。例如,`变量1`将是一个由第1行(假设从顶部计数的0索引)、第1列(假设从左边计数的0索引)、方向为`across`和`4`的长度表示的变量。 +在这个结构中,我们有四个变量,代表了我们需要填入这个字谜的四个单词 (在上图中每个单词都用数字表示)。每个变量由四个值定义:它开始的行 (`i`值),它开始的列 (`j`值),单词的方向 (纵向或横向 down or across),以及单词的长度。例如,`变量1`将是一个由第 1 行 (假设从顶部计数的 0 索引)、第 1 列 (假设从左边计数的 0 索引)、方向为`across`和`4`的长度表示的变量。 -与许多约束满足问题一样,这些变量有一元和二元约束。变量的一元约束是由其长度决定的。例如,对于`变量1`来说,数值`BYTE`可以满足一元约束,但是数值`BIT`则不能(它有错误的字母数量)。因此,任何不满足变量的一元约束的值都可以立即从变量的域中删除。 +与许多约束满足问题一样,这些变量有一元和二元约束。变量的一元约束是由其长度决定的。例如,对于`变量1`来说,数值`BYTE`可以满足一元约束,但是数值`BIT`则不能 (它有错误的字母数量)。因此,任何不满足变量的一元约束的值都可以立即从变量的域中删除。 -变量的二元约束是由其与相邻变量的重合度给出的。`变量1`有一个邻居:`变量2`。`变量2`有两个邻居:`变量1`和`变量3`。对于每一对相邻的变量,这些变量都有一个重叠部分:一个它们共同的单方块。我们可以将这种重叠表示为每个变量有用相同字符位置的索引对。例如,`变量1`和`变量2`之间的重叠可以表示为一对`(1, 0)`,这意味着`变量1`在索引1处的字符必然与`变量2`在索引0处的字符相同(再次假设索引从0开始)。因此,`变量2`和`变量3`之间的重叠将被表示为一对`(3, 1)`,`变量2`的值的字符`3`必须与`变量3`的值的字符`1`相同。 +变量的二元约束是由其与相邻变量的重合度给出的。`变量1`有一个邻居:`变量2`。`变量2`有两个邻居:`变量1`和`变量3`。对于每一对相邻的变量,这些变量都有一个重叠部分:一个它们共同的单方块。我们可以将这种重叠表示为每个变量有用相同字符位置的索引对。例如,`变量1`和`变量2`之间的重叠可以表示为一对`(1, 0)`,这意味着`变量1`在索引 1 处的字符必然与`变量2`在索引 0 处的字符相同 (再次假设索引从 0 开始)。因此,`变量2`和`变量3`之间的重叠将被表示为一对`(3, 1)`,`变量2`的值的字符`3`必须与`变量3`的值的字符`1`相同。 对于这个问题,我们将增加一个额外的约束条件,即所有的单词必须是不同的:同一个单词不应该在谜题中重复出现多次。 -那么,接下来的挑战是写一个程序来找到一个满意的赋值:为每个变量提供一个不同的词(来自给定的词汇表),从而满足所有的一元和二元约束。 +那么,接下来的挑战是写一个程序来找到一个满意的赋值:为每个变量提供一个不同的词 (来自给定的词汇表),从而满足所有的一元和二元约束。 ## 理解 -这个项目中有两个Python文件:`crossword.py`和`generate.py`。第一个文件已经完全为你写好了,第二个文件有一些函数留给你去实现。 +这个项目中有两个 Python 文件:`crossword.py`和`generate.py`。第一个文件已经完全为你写好了,第二个文件有一些函数留给你去实现。 -首先,让我们看一下`crossword.py`。这个文件定义了两个类,`Variable`(代表填字游戏中的变量)和`Crossword`(代表填字游戏本身)。 +首先,让我们看一下`crossword.py`。这个文件定义了两个类,`Variable`(代表填字游戏中的变量) 和`Crossword`(代表填字游戏本身)。 -注意,要创建一个变量,我们必须指定四个值:它的第`i`行,第`j`列,它的方向(常数`Variable.ACROSS`或常数`Variable.DOWN``),以及它的长度(`length``)。 +注意,要创建一个变量,我们必须指定四个值:它的第`i`行,第`j`列,它的方向 (常数`Variable.ACROSS`或常数`Variable.DOWN``),以及它的长度(`length``)。 -字谜类需要两个值来创建一个新的字谜:一个定义了字谜结构的`structure_file`(`_`用来代表空白单元格,任何其他字符都代表不会被填入的单元格)和一个定义了字词列表(每行一个)的`word_file`,用来作为游戏的词汇表。这些文件的三个例子可以在项目的数据目录中找到,也欢迎你自己创建。 +字谜类需要两个值来创建一个新的字谜:一个定义了字谜结构的`structure_file`(`_`用来代表空白单元格,任何其他字符都代表不会被填入的单元格) 和一个定义了字词列表 (每行一个) 的`word_file`,用来作为游戏的词汇表。这些文件的三个例子可以在项目的数据目录中找到,也欢迎你自己创建。 特别要注意的是,对于任何一个字谜对象的字谜,我们都会存储以下的数值: - `crossword.height`是一个整数,代表填字游戏的高度。 - `crossword.width`是一个整数,代表填字游戏的宽度。 -- `crossword.structure`是一个二维列表,代表字谜的结构。对于任何有效的第i行和第j列,如果该单元格是空白的,`crossword.structure[i][j]`将为真(必须在该单元格中填入一个字符),否则将为假(该单元格中没有字符要填)。 +- `crossword.structure`是一个二维列表,代表字谜的结构。对于任何有效的第 i 行和第 j 列,如果该单元格是空白的,`crossword.structure[i][j]`将为真 (必须在该单元格中填入一个字符),否则将为假 (该单元格中没有字符要填)。 - `crossword.words`是一个包含所有单词的集合,在构建填字游戏的时候,可以从这些单词中提取。 -- `crossword.variables`是谜题中所有变量的集合(每个变量都是一个Variable对象)。 -- `crossword.overlaps`是一个字典,它将一对变量映射到它们的重合处。对于任何两个不同的变量v1和v2,如果这两个变量没有重叠,`crossword.overlaps[v1, v2]`将是`None`,如果这两个变量有重叠,则是一对整数`(i, j)`。这对`(i, j)`应被解释为:`v1`的第`i`个字符的值必须与`v2`的第`j`个字符的值相同。 +- `crossword.variables`是谜题中所有变量的集合 (每个变量都是一个 Variable 对象)。 +- `crossword.overlaps`是一个字典,它将一对变量映射到它们的重合处。对于任何两个不同的变量 v1 和 v2,如果这两个变量没有重叠,`crossword.overlaps[v1, v2]`将是`None`,如果这两个变量有重叠,则是一对整数`(i, j)`。这对`(i, j)`应被解释为:`v1`的第`i`个字符的值必须与`v2`的第`j`个字符的值相同。 `Crossword`对象还支持一个方法`neighbors`,它可以返回与给定变量重叠的所有变量。也就是说,`crossword.neighbors(v1)`将返回一个与变量`v1`相邻的所有变量的集合。 -接下来,看一下`generate.py`。在这里,我们定义了一个`CrosswordCreator`类,我们将用它来解决填字游戏。当一个`CrosswordCreator`对象被创建时,它得到一个填字游戏的属性,它应该是一个`Crossword`对象(因此具有上面描述的所有属性)。每个`CrosswordCreator`对象还得到一个域属性:一个字典,它将变量映射到该变量可能作为一个值的一组词。最初,这组词是我们词汇表中的所有词,但我们很快就会写函数来限制这些域。 +接下来,看一下`generate.py`。在这里,我们定义了一个`CrosswordCreator`类,我们将用它来解决填字游戏。当一个`CrosswordCreator`对象被创建时,它得到一个填字游戏的属性,它应该是一个`Crossword`对象 (因此具有上面描述的所有属性)。每个`CrosswordCreator`对象还得到一个域属性:一个字典,它将变量映射到该变量可能作为一个值的一组词。最初,这组词是我们词汇表中的所有词,但我们很快就会写函数来限制这些域。 -我们还为你定义了一些函数,以帮助你测试你的代码:`print`将向终端打印你的填字游戏的一个给定的赋值(每个赋值,在这个函数和其他地方,是一个字典,将变量映射到它们相应的词)。同时,`save`将生成一个与给定作业相对应的图像文件(如果你无法使用这个函数,你需要`pip3 install Pillow`)。 `letter_grid`是一个被`print`和`save`使用的辅助函数,它为给定的赋值生成一个所有字符在其适当位置的2D列表:你可能不需要自己调用这个函数,但如果你想的话,欢迎你这样做。 +我们还为你定义了一些函数,以帮助你测试你的代码:`print`将向终端打印你的填字游戏的一个给定的赋值 (每个赋值,在这个函数和其他地方,是一个字典,将变量映射到它们相应的词)。同时,`save`将生成一个与给定作业相对应的图像文件 (如果你无法使用这个函数,你需要`pip3 install Pillow`)。 `letter_grid`是一个被`print`和`save`使用的辅助函数,它为给定的赋值生成一个所有字符在其适当位置的 2D 列表:你可能不需要自己调用这个函数,但如果你想的话,欢迎你这样做。 -最后,注意`solve`函数。这个函数做了三件事:首先,它调用`enforce_node_consistency`来强制执行填字游戏的节点一致性,确保变量域中的每个值都满足一元约束。接下来,该函数调用`ac3`来强制执行弧一致性,确保二元约束得到满足。最后,该函数在最初的空赋值(空字典dict())上调用`backtrack`,试图计算出问题的解决方案。 +最后,注意`solve`函数。这个函数做了三件事:首先,它调用`enforce_node_consistency`来强制执行填字游戏的节点一致性,确保变量域中的每个值都满足一元约束。接下来,该函数调用`ac3`来强制执行弧一致性,确保二元约束得到满足。最后,该函数在最初的空赋值 (空字典 dict()) 上调用`backtrack`,试图计算出问题的解决方案。 -不过,`enforce_node_consistency`、`ac3`和`backtrack`等函数还没有实现(以及其他函数)。这就是你的任务。 +不过,`enforce_node_consistency`、`ac3`和`backtrack`等函数还没有实现 (以及其他函数)。这就是你的任务。 ## 明确 @@ -80,8 +82,7 @@ $ python generate.py data/structure1.txt data/words1.txt output.png - 回顾一下,当对每个变量来说,其域中的每个值都与该变量的一元约束一致时,就实现了节点一致性。在填字游戏的情况下,这意味着要确保变量域中的每个值的字母数与变量的长度相同。 - 要从一个变量`v`的域中移除一个值`x`,因为`self.domains`是一个将变量映射到数值集的字典,你可以调用`self.domains[v].remove(x)`。 - 这个函数不需要返回值。 - -- `revise`函数应该使变量x与变量y保持弧一致性。 +- `revise`函数应该使变量 x 与变量 y 保持弧一致性。 - `x`和`y`都是`Variable`对象,代表谜题中的变量。 - 回顾一下,当`x`的域中的每一个值在`y`的域中都有一个不引起冲突的可能值时,`x`就与`y`保持弧一致性。(在填字游戏的背景下,冲突是指一个方格,两个变量对它的字符值意见不一)。 - 为了使`x`与`y`保持一致,你要从`x`的域中删除任何在`y`的域中没有相应可能值的值。 @@ -90,15 +91,15 @@ $ python generate.py data/structure1.txt data/words1.txt output.png - 如果对`x`的域进行了修改,该函数应返回`True`;如果没有修改,则应返回`False`。 - `ac3`函数应该使用`AC3`算法,对问题实施弧一致性。回顾一下,当每个变量域中的所有值都满足该变量的二进制约束时,就实现了弧一致性。 - - 回顾一下,`AC3`算法保持着一个要处理的弧的队列。这个函数需要一个叫做`arcs`的可选参数,代表要处理的弧的初始列表。如果`arcs`是`None`,你的函数应该从问题中的所有弧的初始队列开始。否则,你的算法应该从一个初始队列开始,该队列中只有在列表`arcs`中的弧(其中每个弧是一个变量`x`和另一个变量`y`的元组`(x,y)`)。 + - 回顾一下,`AC3`算法保持着一个要处理的弧的队列。这个函数需要一个叫做`arcs`的可选参数,代表要处理的弧的初始列表。如果`arcs`是`None`,你的函数应该从问题中的所有弧的初始队列开始。否则,你的算法应该从一个初始队列开始,该队列中只有在列表`arcs`中的弧 (其中每个弧是一个变量`x`和另一个变量`y`的元组`(x,y)`)。 - 回顾一下,为了实现`AC3`,你要一次一次地修改队列中的每个弧。不过,任何时候你对一个域做了改变,你可能需要在队列中增加额外的弧,以确保其他弧保持一致。 - 你可能会发现在`ac3`的实现中调用`revise`函数是很有帮助的。 - 如果在执行弧一致性的过程中,你从一个域中删除了所有剩余的值,则返回`False`(这意味着问题无解,因为这个变量已经没有可能的值了)。否则,返回`True`。 - - 你不需要担心在这个函数中强制执行词的唯一性(你将在`consistent`函数中实现这个检查。) + - 你不需要担心在这个函数中强制执行词的唯一性 (你将在`consistent`函数中实现这个检查。) -- `assignment_complete`函数应该(如其名所示)检查一个给定的赋值是否完成。 +- `assignment_complete`函数应该 (如其名所示) 检查一个给定的赋值是否完成。 - `assignment`是一个字典,其中键是`Variable`对象,值是代表这些变量将采取的单词的字符串。 - - 如果每个字谜变量都被分配到一个值(不管这个值是什么),那么这个赋值就是完整的。 + - 如果每个字谜变量都被分配到一个值 (不管这个值是什么),那么这个赋值就是完整的。 - 如果赋值完成,该函数应该返回`True`,否则返回`False`。 - `consistent`函数应该检查一个给定的`assignment`是否一致。 @@ -112,21 +113,21 @@ $ python generate.py data/structure1.txt data/words1.txt output.png - 请注意,在`assignment`中出现的任何变量都已经有了一个值,因此在计算相邻未赋值变量被排除的值的数量时不应该被计算在内。 - 对于排除相邻变量相同数量可能选择的域值,任何排序都是可以接受的。 - 回顾一下,你可以访问`self.crossword.overlaps`来获得两个变量之间的重叠,如果有的话。 - - 首先通过返回一个任意顺序的数值列表来实现这个函数可能会有帮助(这仍然会产生正确的填字游戏)。一旦你的算法开始工作,你就可以回去确保这些值是以正确的顺序返回的。 - - 你可能会发现根据一个特定的key来对一个[列表](https://docs.python.org/3/howto/sorting.html)进行排序是很有帮助的: Python 包含一些有用的函数来实现这一点。 + - 首先通过返回一个任意顺序的数值列表来实现这个函数可能会有帮助 (这仍然会产生正确的填字游戏)。一旦你的算法开始工作,你就可以回去确保这些值是以正确的顺序返回的。 + - 你可能会发现根据一个特定的 key 来对一个[列表](https://docs.python.org/3/howto/sorting.html)进行排序是很有帮助的:Python 包含一些有用的函数来实现这一点。 - `select_unassigned_variable`函数应该根据最小剩余值启发式,然后是度启发式,返回字谜中尚未被赋值的单个变量。 - `assignment`是一个字典,其中键是`Variable`对象,值是代表这些变量将承担的单词的字符串。你可以假设赋值不会是完整的:不是所有的变量都会出现在`assignment`中。 - - 你的函数应该返回一个`Variable`对象。你应该返回在其域中剩余数值最少的变量。如果变量之间存在平局,你应该在这些变量中选择度最大的变量(拥有最多的邻居)。如果在这两种情况下都相同,你可以在相同的变量中任意选择。 - - 首先通过返回任意未分配的变量来实现这个函数可能是有帮助的(这应该仍然会产生正确的填字游戏)。一旦你的算法开始工作,你就可以回去修改这个函数确保你是根据启发式方法返回一个变量。 - - 你可能会发现根据一个特定的key来对一个列表进行[排序](https://docs.python.org/3/howto/sorting.html)是很有帮助的:Python 包含一些有用的函数来实现这一点。 + - 你的函数应该返回一个`Variable`对象。你应该返回在其域中剩余数值最少的变量。如果变量之间存在平局,你应该在这些变量中选择度最大的变量 (拥有最多的邻居)。如果在这两种情况下都相同,你可以在相同的变量中任意选择。 + - 首先通过返回任意未分配的变量来实现这个函数可能是有帮助的 (这应该仍然会产生正确的填字游戏)。一旦你的算法开始工作,你就可以回去修改这个函数确保你是根据启发式方法返回一个变量。 + - 你可能会发现根据一个特定的 key 来对一个列表进行[排序](https://docs.python.org/3/howto/sorting.html)是很有帮助的:Python 包含一些有用的函数来实现这一点。 - `backtrack`函数应该接受一个部分赋值`assignment`作为输入,并且使用回溯搜索,如果有可能的话,返回一个完整的令人满意的变量赋值。 - `assignment`是一个字典,其中键是`Variable`对象,值是代表这些变量将承担的单词的字符串。你可以假设赋值不会是完整的:不是所有的变量都会出现在`assignment`中。 - 如果有可能生成一个令人满意的字谜,你的函数应该返回完整的赋值:一个字典,其中每个变量是一个键,值是该变量应该承担的单词。如果不可能产生令人满意的赋值,该函数应该返回`None`。 - - 如果你愿意,你可能会发现,如果你把搜索和推理交织在一起,你的算法会更有效率(比如每次做新的赋值时都要保持弧一致性)。我们不要求你这样做,但允许你这样做,只要你的函数仍然产生正确的结果。(正是由于这个原因,`ac3`函数允许一个`arcs`的参数,以防你想从不同的弧队列开始)。 + - 如果你愿意,你可能会发现,如果你把搜索和推理交织在一起,你的算法会更有效率 (比如每次做新的赋值时都要保持弧一致性)。我们不要求你这样做,但允许你这样做,只要你的函数仍然产生正确的结果。(正是由于这个原因,`ac3`函数允许一个`arcs`的参数,以防你想从不同的弧队列开始)。 -除了要求你实现的函数外,你不应该修改`generate.py`中的任何其他东西,尽管你可以编写额外的函数和/或导入其他Python标准库模块。如果你熟悉`numpy`或`pandas`,你也可以导入它们,但是你不应该使用任何其他的第三方Python模块。你不应该修改`crossword.py`中的任何东西。 +除了要求你实现的函数外,你不应该修改`generate.py`中的任何其他东西,尽管你可以编写额外的函数和/或导入其他 Python 标准库模块。如果你熟悉`numpy`或`pandas`,你也可以导入它们,但是你不应该使用任何其他的第三方 Python 模块。你不应该修改`crossword.py`中的任何东西。 ## 提示 @@ -134,4 +135,4 @@ $ python generate.py data/structure1.txt data/words1.txt output.png - 要运行你的程序,你可以运行类似`python generate.py data/structure1.txt data/words1.txt`的命令,指定一个结构文件和一个单词文件。如果可以进行赋值,你应该看到打印出来的赋值。你也可以为图像文件添加一个额外的命令行参数,如运行`python generate.py data/structure1.txt data/words1.txt output.png`,可以为生成的填字游戏生成一个图像表示。 -- `Crossword`类有一个`neighbors`函数,可以用来访问某个特定变量的所有邻居(即重叠的变量)。在你需要确定某个特定变量的邻居时,请随时使用这个函数。 +- `Crossword`类有一个`neighbors`函数,可以用来访问某个特定变量的所有邻居 (即重叠的变量)。在你需要确定某个特定变量的邻居时,请随时使用这个函数。 diff --git a/4.人工智能/4.3.4最优化.md b/4.人工智能/4.3.4最优化.md index db11e76..4121466 100644 --- a/4.人工智能/4.3.4最优化.md +++ b/4.人工智能/4.3.4最优化.md @@ -2,13 +2,13 @@ 最优化是指从一组可能的选项中选择最佳选项。我们已经遇到过试图找到最佳选项的问题,比如在极大极小算法中,今天我们将学习一些工具,可以用来解决更广泛的问题。 -## 局部搜索(Local Search) +## 局部搜索 (Local Search) 局部搜索是一种保持单一节点并通过移动到邻近的节点进行搜索的搜索算法。这种类型的算法与我们之前看到的搜索类型不同。例如,在解决迷宫的过程中,我们想找到通往目标的最快捷的方法,而局部搜索则对寻找问题的最佳答案感兴趣。通常情况下,局部搜索会带来一个不是最佳但 "足够好 "的答案,以节省计算能力。考虑一下下面这个局部搜索问题的例子:我们有四所房子在设定的位置。我们想建两所医院,使每所房子到医院的距离最小。这个问题可以形象地描述如下: ![4.3.4-0](static/4.3.4-0.png) -在这幅图中,我们看到的是房屋和医院的可能配置。它们之间的距离是用曼哈顿距离(向上、向下和向两侧移动的次数;在[搜索](4.3.1搜索.md) 中详细讨论)来衡量的,从每个房子到最近的医院的距离之和是17。我们称其为成本 __(cost)__,因为我们试图使这个距离最小化。在这种情况下,一个状态将是房屋和医院的任何一个配置。 +在这幅图中,我们看到的是房屋和医院的可能配置。它们之间的距离是用曼哈顿距离 (向上、向下和向两侧移动的次数;在[搜索](4.3.1搜索.md) 中详细讨论) 来衡量的,从每个房子到最近的医院的距离之和是 17。我们称其为成本 __(cost)__,因为我们试图使这个距离最小化。在这种情况下,一个状态将是房屋和医院的任何一个配置。 把这个概念抽象化,我们可以把每一种房屋和医院的配置表现为下面的状态空间图。图中的每一条都代表一个状态的值,在我们的例子中,它是房屋和医院配置的成本。 @@ -17,15 +17,15 @@ 从这个可视化的角度来看,我们可以为我们接下来的讨论定义几个重要的术语: - 目标函数 __(Objective Function)__ 是一个函数,我们用它来最大化解决方案的值。 -- 成本函数 __(Cost Function)__ 是一个我们用来最小化解决方案成本的函数(这就是我们在房屋和医院的例子中要使用的函数。我们想要最小化从房屋到医院的距离)。 +- 成本函数 __(Cost Function)__ 是一个我们用来最小化解决方案成本的函数 (这就是我们在房屋和医院的例子中要使用的函数。我们想要最小化从房屋到医院的距离)。 - 当前状态 __(Current State)__ 是指函数目前正在考虑的状态。 - 邻居状态 __(Neighbor State)__ 是当前状态可以过渡到的一个状态。在上面的一维状态空间图中,邻居状态是指当前状态两侧的状态。在我们的例子中,邻居状态可以是将其中一家医院向任何方向移动一步所产生的状态。邻居状态通常与当前状态相似,因此,其值与当前状态的值接近。 请注意,局部搜索算法的工作方式是考虑当前状态下的一个节点,然后将该节点移动到当前状态的一个邻节点处。这与极大极小算法不同,例如,在极大极小算法中,状态空间中的每一个状态都被递归地考虑。 -## 爬山算法(Hill Climbing) +## 爬山算法 (Hill Climbing) -爬山算法是局部搜索算法的一种类型。在这个算法中,邻居的状态与当前的状态进行比较,如果其中任何一个状态更好,我们就把当前的节点从当-的状态改为该邻居的状态。“好状态”的定义是由目标函数决定的,倾向于一个较高的值,或一个递减函数,倾向于一个较低的值。 +爬山算法是局部搜索算法的一种类型。在这个算法中,邻居的状态与当前的状态进行比较,如果其中任何一个状态更好,我们就把当前的节点从当 - 的状态改为该邻居的状态。“好状态”的定义是由目标函数决定的,倾向于一个较高的值,或一个递减函数,倾向于一个较低的值。 一个爬山算法在伪代码中会有以下样子: @@ -45,7 +45,7 @@ function Hill-Climb(problem): ![4.3.4-2](static/4.3.4-2.png) -在这个状态下,成本是11,比初始状态的成本17有所提高。然而,这还不是最佳状态。例如,将左边的医院移到左上角的房子下面,会使成本达到9,比11好。然而,这个版本的爬山算法无法达到这个目标,因为所有的邻居状态都至少和当前状态的成本一样高。从这个意义上说,爬坡算法是短视的,它经常满足于比其他一些解决方案更好的解决方案,但不一定是所有可能的解决方案中最好的。 +在这个状态下,成本是 11,比初始状态的成本 17 有所提高。然而,这还不是最佳状态。例如,将左边的医院移到左上角的房子下面,会使成本达到 9,比 11 好。然而,这个版本的爬山算法无法达到这个目标,因为所有的邻居状态都至少和当前状态的成本一样高。从这个意义上说,爬坡算法是短视的,它经常满足于比其他一些解决方案更好的解决方案,但不一定是所有可能的解决方案中最好的。 ### 局部和全局最小值和最大值 @@ -57,7 +57,7 @@ function Hill-Climb(problem): ![4.3.4-4](static/4.3.4-4.png) -爬山算法的问题是,它们可能会在局部最小和最大中结束。一旦算法到达一个点,其邻居状态就目标函数而言,比当前状态更糟糕,算法就会停止。特殊类型的局部最大值和最小值包括平坦的局部最大值/最小值 __(flat local maximum/minimum)__,即多个数值相同的状态相邻,形成一个plateau,其邻居状态的数值更差;以及 __shoulder__ ,邻居状态既可以更好,也可以更差。从plateau的中间开始,算法将无法向任何方向推进。 +爬山算法的问题是,它们可能会在局部最小和最大中结束。一旦算法到达一个点,其邻居状态就目标函数而言,比当前状态更糟糕,算法就会停止。特殊类型的局部最大值和最小值包括平坦的局部最大值/最小值 __(flat local maximum/minimum)__,即多个数值相同的状态相邻,形成一个plateau,其邻居状态的数值更差;以及 __shoulder__,邻居状态既可以更好,也可以更差。从 plateau 的中间开始,算法将无法向任何方向推进。 ![4.3.4-5](static/4.3.4-5.png) @@ -69,11 +69,11 @@ function Hill-Climb(problem): - Stochastic: 从值较高的邻居状态中随机选择。这样做,我们选择去任何比我们的值更高的方向。 - __First-choice__: 选择第一个值较高的邻居状态。 - __Random-restart__: 进行多次爬山。每次都从一个随机状态开始。比较每次试验的最大值,并在这些最大值中选择一个。 -- __Local Beam Search__: 选择值最高的k个邻居状态。这与大多数本地搜索算法不同,它使用多个节点进行搜索,而不是只有一个节点。 +- __Local Beam Search__: 选择值最高的 k 个邻居状态。这与大多数本地搜索算法不同,它使用多个节点进行搜索,而不是只有一个节点。 虽然局部搜索算法并不总是给出最好的解决方案,但在考虑所有可能的状态在计算上不可行的情况下,它们往往能给出足够好的解决方案。 -## 模拟退火算法(Simulated Annealing) +## 模拟退火算法 (Simulated Annealing) 尽管我们已经看到了可以改进爬山算法的变种,但它们都有一个共同的错误:一旦算法达到局部最大值,它就会停止运行。模拟退火算法允许算法在卡在局部最大值时"摆脱"自己。 @@ -92,9 +92,9 @@ function Simulated-Annealing(problem, max): return current ``` -该算法将一个`problem`和`max`作为输入,`max`是它应该重复的次数。对于每个迭代,`T`是用一个`Temperature`函数来设置的。这个函数在早期迭代中返回一个较高的值(当`t`较低时),在后期迭代中返回一个较低的值(当`t`较高时)。然后,随机选择一个邻居状态,并计算`ΔE`,使其量化邻居状态比当前状态好的程度。如果邻居状态比当前状态好(`ΔE>0`),像以前一样,我们将当前状态设置为邻居状态。然而,当邻居状态较差时(`ΔE<0`),我们仍然可能将我们的当前状态设置为该邻居状态,并且我们以$e^{ΔE/t}$的概率这样做。这里的意思是,更小的`ΔE`将导致邻居状态被选择的概率降低,而温度`t`越高,邻居状态被选择的概率越高。这意味着邻居状态越差,被选择的可能性就越小,而算法在其过程中越早,就越有可能将一个较差的邻居状态设置为当前状态。这背后的数学原理如下:`e`是一个常数(大约2.72),`ΔE`是负数(因为这个邻居比当前状态更糟糕)。温度`t`越高,ΔE/`t`就越接近于0,使概率更接近于1。 +该算法将一个`problem`和`max`作为输入,`max`是它应该重复的次数。对于每个迭代,`T`是用一个`Temperature`函数来设置的。这个函数在早期迭代中返回一个较高的值 (当`t`较低时),在后期迭代中返回一个较低的值 (当`t`较高时)。然后,随机选择一个邻居状态,并计算`ΔE`,使其量化邻居状态比当前状态好的程度。如果邻居状态比当前状态好 (`ΔE>0`),像以前一样,我们将当前状态设置为邻居状态。然而,当邻居状态较差时 (`ΔE<0`),我们仍然可能将我们的当前状态设置为该邻居状态,并且我们以$e^{ΔE/t}$的概率这样做。这里的意思是,更小的`ΔE`将导致邻居状态被选择的概率降低,而温度`t`越高,邻居状态被选择的概率越高。这意味着邻居状态越差,被选择的可能性就越小,而算法在其过程中越早,就越有可能将一个较差的邻居状态设置为当前状态。这背后的数学原理如下:`e`是一个常数 (大约 2.72),`ΔE`是负数 (因为这个邻居比当前状态更糟糕)。温度`t`越高,ΔE/`t`就越接近于 0,使概率更接近于 1。 -### 旅行商问题(Traveling Salesman Problem) +### 旅行商问题 (Traveling Salesman Problem) 在旅行商问题中,任务是连接所有的点,同时选择最短的距离。例如,这就是快递公司需要做的事情:找到从商店到所有客户家的最短路线,然后再返回。 @@ -102,27 +102,27 @@ function Simulated-Annealing(problem, max): | ------------------------------ | ------------------------------ | | ![4.3.4-6](static/4.3.4-6.png) | ![4.3.4-7](static/4.3.4-7.png) | -在这种情况下,邻居状态可以被看作是两个箭头互换位置的状态。计算每一个可能的组合使得这个问题在计算上要求很高(10个点给了我们10!或者说3,628,800条可能的路线)。通过使用模拟退火算法,可以以较低的计算成本找到一个好的解决方案。 +在这种情况下,邻居状态可以被看作是两个箭头互换位置的状态。计算每一个可能的组合使得这个问题在计算上要求很高 (10 个点给了我们 10! 或者说 3,628,800 条可能的路线)。通过使用模拟退火算法,可以以较低的计算成本找到一个好的解决方案。 -## 线性规划(Linear Programming) +## 线性规划 (Linear Programming) -线性规划是一个优化线性方程(y=ax₁+bx₂+...形式的方程)的问题系列。 +线性规划是一个优化线性方程 (y=ax₁+bx₂+...形式的方程) 的问题系列。 线性规划有以下内容: -- 一个我们想要最小化的成本函数:c₁x₁ + c₂x₂ + ... + cₙxₙ。这里,每个x是一个变量,它与一些成本c相关联。 -- 一个约束条件,它表示为一个变量的总和,它要么小于或等于一个值(a₁x₁+a₂x₂+...+aₙxₙ≤b),要么正好等于这个值(a₁x₁+a₂x₂+...+aₙxₙ=b)。在这种情况下,x是一个变量,a是与之相关的一些资源,而b是我们可以为这个问题投入多少资源。 -- 变量的域(例如,一个变量不能是负数),形式为lᵢ≤xᵢ≤uᵢ。 +- 一个我们想要最小化的成本函数:c₁x₁ + c₂x₂ + ... + cₙxₙ。这里,每个 x 是一个变量,它与一些成本 c 相关联。 +- 一个约束条件,它表示为一个变量的总和,它要么小于或等于一个值 (a₁x₁+a₂x₂+...+aₙxₙ≤b),要么正好等于这个值 (a₁x₁+a₂x₂+...+aₙxₙ=b)。在这种情况下,x 是一个变量,a 是与之相关的一些资源,而 b 是我们可以为这个问题投入多少资源。 +- 变量的域 (例如,一个变量不能是负数),形式为 lᵢ≤xᵢ≤uᵢ。 请考虑以下例子: -- 两台机器,X₁和X₂。X₁的运行成本为50美元/小时,X₂的运行成本为80美元/小时。我们的目标是使成本最小化。这可以被表述为一个成本函数:50x₁+80x₂。 -- X₁每小时需要5个单位的劳动力。X₂每小时需要2个单位的劳动力。总共需要花费20个单位的劳动力。这可以被形式化为一个约束条件:5x₁ + 2x₂ ≤ 20。 -- X₁每小时生产10个单位的产品。X₂每小时生产12个单位的产品。公司需要90个单位的产出。这是另一个约束条件。从字面上看,它可以被改写为10x₁+12x₂≥90。然而,约束条件必须是(a₁x₁+a₂x₂+...+aₙxₙ≤b)或(a₁x₁+a₂x₂+...+aₙxₙ=b)。因此,我们乘以(-1),得到一个所需形式的等价方程:(-10x₁)+(-12x₂)≤-90。 +- 两台机器,X₁和 X₂。X₁的运行成本为 50 美元/小时,X₂的运行成本为 80 美元/小时。我们的目标是使成本最小化。这可以被表述为一个成本函数:50x₁+80x₂。 +- X₁每小时需要 5 个单位的劳动力。X₂每小时需要 2 个单位的劳动力。总共需要花费 20 个单位的劳动力。这可以被形式化为一个约束条件:5x₁ + 2x₂ ≤ 20。 +- X₁每小时生产 10 个单位的产品。X₂每小时生产 12 个单位的产品。公司需要 90 个单位的产出。这是另一个约束条件。从字面上看,它可以被改写为 10x₁+12x₂≥90。然而,约束条件必须是 (a₁x₁+a₂x₂+...+aₙxₙ≤b) 或 (a₁x₁+a₂x₂+...+aₙxₙ=b)。因此,我们乘以 (-1),得到一个所需形式的等价方程:(-10x₁)+(-12x₂)≤-90。 -线性规划的优化算法需要几何学和线性代数的背景知识,而我们并不想假设这些知识。相反,我们可以使用已经存在的算法,如Simplex和Interior-Point。 +线性规划的优化算法需要几何学和线性代数的背景知识,而我们并不想假设这些知识。相反,我们可以使用已经存在的算法,如 Simplex 和 Interior-Point。 -下面是一个使用Python中scipy库的线性规划例子: +下面是一个使用 Python 中 scipy 库的线性规划例子: ```python import scipy.optimize @@ -145,17 +145,17 @@ else: 约束满足问题是一类需要在满足某些条件下为变量赋值的问题。 -约束条件满足问题具有以下特性: +约束条件满足问题具有一下特性: - 变量集合{x₁,x₂,...,xₙ}。 - 每个变量域的集合{D₁, D₂, ..., Dₙ}。 -- 一组约束条件C +- 一组约束条件 C -数独可以表示为一个约束满足问题,每个空方块是一个变量,域是数字1-9,而约束是不能彼此相等的方块。 +数独可以表示为一个约束满足问题,每个空方块是一个变量,域是数字 1-9,而约束是不能彼此相等的方块。 ![4.3.4-8](static/4.3.4-8.png) -再考虑一个例子。每个学生1-4都在选修A、B、...、G中的三门课程。每门课程都需要有考试,可能的考试日是星期一、星期二和星期三。但是,同一个学生不能在同一天有两次考试。在这种情况下,变量是课程,域是天数,约束条件是哪些课程不能在同一天安排考试,因为是同一个学生在考试。这可以直观地显示如下: +再考虑一个例子。每个学生 1-4 都在选修 A、B、...、G 中的三门课程。每门课程都需要有考试,可能的考试日是星期一、星期二和星期三。但是,同一个学生不能在同一天有两次考试。在这种情况下,变量是课程,域是天数,约束条件是哪些课程不能在同一天安排考试,因为是同一个学生在考试。这可以直观地显示如下: ![4.3.4-9](static/4.3.4-9.png) @@ -165,22 +165,22 @@ else: 关于约束满足问题,还有几个值得了解的术语: -- 硬约束(Hard Constraint)是指在一个正确的解决方案中必须满足的约束。 -- 软约束(Soft Constraint)是一种约束,表示哪种解决方案比其他解决方案更受欢迎。 -- 一元约束(Unary Constraint)是指只涉及一个变量的约束。在我们的例子中,一元约束是指课程A在周一不能有考试{A≠周一}。 -- 二元约束(Binary Constraint)是一种涉及两个变量的约束。这就是我们在上面的例子中使用的约束类型,表示两个课程不能有相同的值{A ≠ B}。 +- 硬约束 (Hard Constraint) 是指在一个正确的解决方案中必须满足的约束。 +- 软约束 (Soft Constraint) 是一种约束,表示哪种解决方案比其他解决方案更受欢迎。 +- 一元约束 (Unary Constraint) 是指只涉及一个变量的约束。在我们的例子中,一元约束是指课程 A 在周一不能有考试{A≠周一}。 +- 二元约束 (Binary Constraint) 是一种涉及两个变量的约束。这就是我们在上面的例子中使用的约束类型,表示两个课程不能有相同的值{A ≠ B}。 -### 节点一致性(Node Consistency) +### 节点一致性 (Node Consistency) 节点一致性是指一个变量域中的所有值都满足该变量的一元约束。 -例如,让我们拿两门课程,A和B。每门课程的域是{Monday, Tuesday, Wednesday},约束条件是{A≠Mon,B≠Tue,B≠Mon,A≠B}。现在,A和B都不是一致的,因为现有的约束条件使它们不能取其域中的每一个值。然而,如果我们从A的域中移除Monday,那么它就会有节点一致性。为了实现B的节点一致性,我们必须从它的域中删除Monday和Tuesday。 +例如,让我们拿两门课程,A 和 B。每门课程的域是{Monday, Tuesday, Wednesday},约束条件是{A≠Mon,B≠Tue,B≠Mon,A≠B}。现在,A 和 B 都不是一致的,因为现有的约束条件使它们不能取其域中的每一个值。然而,如果我们从 A 的域中移除 Monday,那么它就会有节点一致性。为了实现 B 的节点一致性,我们必须从它的域中删除 Monday 和 Tuesday。 -### 弧一致性(Arc Consistency) +### 弧一致性 (Arc Consistency) -弧一致性是指一个变量域中的所有值都满足该变量的二元约束(注意,我们现在用"弧"来指代我们以前所说的 "边")。换句话说,要使X对Y具有弧一致性,就要从X的域中移除元素,直到X的每个选择都有Y的可能选择。 +弧一致性是指一个变量域中的所有值都满足该变量的二元约束 (注意,我们现在用"弧"来指代我们以前所说的 "边")。换句话说,要使 X 对 Y 具有弧一致性,就要从 X 的域中移除元素,直到 X 的每个选择都有 Y 的可能选择。 -考虑到我们之前的例子,修改后的域:A:{Tuesday, Wednesday}和B:{Wednesday}。如果A与B是弧一致的,那么无论A的考试被安排在哪一天(从它的域来看),B仍然能够安排考试。A与B是弧一致的吗?如果A取值为Tuesday,那么B可以取值为Wednesday。然而,如果A取值为Wednesday,那么就没有B可以取的值(记住,其中一个约束是A≠B)。因此,A与B不是弧一致的。为了改变这种情况,我们可以从A的域中删除Wednesday。然后,A的任何取值(Tuesday是唯一的选择)都会给B留下一个取值(Wednesday)。现在,A与B是弧一致的。让我们看看一个伪代码的算法,使一个变量相对于其他变量是弧一致的(注意,csp代表 "约束满足问题")。 +考虑到我们之前的例子,修改后的域:A:{Tuesday, Wednesday}和 B:{Wednesday}。如果 A 与 B 是弧一致的,那么无论 A 的考试被安排在哪一天 (从它的域来看),B 仍然能够安排考试。A 与 B 是弧一致的吗?如果 A 取值为 Tuesday,那么 B 可以取值为 Wednesday。然而,如果 A 取值为 Wednesday,那么就没有 B 可以取的值 (记住,其中一个约束是 A≠B)。因此,A 与 B 不是弧一致的。为了改变这种情况,我们可以从 A 的域中删除 Wednesday。然后,A 的任何取值 (Tuesday 是唯一的选择) 都会给 B 留下一个取值 (Wednesday)。现在,A 与 B 是弧一致的。让我们看看一个伪代码的算法,使一个变量相对于其他变量是弧一致的 (注意,csp 代表 "约束满足问题")。 ```python function Revise(csp, X, Y): @@ -192,9 +192,9 @@ function Revise(csp, X, Y): return revised ``` -这个算法从跟踪X的域是否有任何变化开始,使用变量revised,这在我们研究的下一个算法中会很有用。然后,代码对X的域中的每一个值进行重复,看看Y是否有一个满足约束条件的值。如果是,则什么都不做,如果不是,则从X的域中删除这个值。 +这个算法从跟踪 X 的域是否有任何变化开始,使用变量 revised,这在我们研究的下一个算法中会很有用。然后,代码对 X 的域中的每一个值进行重复,看看 Y 是否有一个满足约束条件的值。如果是,则什么都不做,如果不是,则从 X 的域中删除这个值。 -通常情况下,我们感兴趣的是使整个问题的弧一致,而不仅仅是一个变量相对于另一个变量的一致性。在这种情况下,我们将使用一种叫做AC-3的算法,该算法使用Revise: +通常情况下,我们感兴趣的是使整个问题的弧一致,而不仅仅是一个变量相对于另一个变量的一致性。在这种情况下,我们将使用一种叫做 AC-3 的算法,该算法使用 Revise: ```python function AC-3(csp): @@ -209,21 +209,21 @@ function AC-3(csp): return true ``` -该算法将问题中的所有弧添加到一个队列中。每当它考虑一个弧时,它就把它从队列中删除。然后,它运行Revise算法,看这个弧是否一致。如果做了修改使其一致,则需要进一步的行动。如果得到的X的域是空的,这意味着这个约束满足问题是无法解决的(因为没有任何X可以取的值会让Y在约束条件下取任何值)。如果问题在上一步中没有被认为是不可解决的,那么,由于X的域被改变了,我们需要看看与X相关的所有弧是否仍然一致。也就是说,我们把除了Y以外的所有X的邻居,把他们和X之间的弧添加到队列中。然而,如果Revise算法返回false,意味着域没有被改变,我们只需继续考虑其他弧。 +该算法将问题中的所有弧添加到一个队列中。每当它考虑一个弧时,它就把它从队列中删除。然后,它运行 Revise 算法,看这个弧是否一致。如果做了修改使其一致,则需要进一步的行动。如果得到的 X 的域是空的,这意味着这个约束满足问题是无法解决的 (因为没有任何 X 可以取的值会让 Y 在约束条件下取任何值)。如果问题在上一步中没有被认为是不可解决的,那么,由于 X 的域被改变了,我们需要看看与 X 相关的所有弧是否仍然一致。也就是说,我们把除了 Y 以外的所有 X 的邻居,把他们和 X 之间的弧添加到队列中。然而,如果 Revise 算法返回 false,意味着域没有被改变,我们只需继续考虑其他弧。 虽然弧一致性的算法可以简化问题,但不一定能解决问题,因为它只考虑了二元约束,而没有考虑多个节点可能的相互连接方式。我们之前的例子中,4个学生中的每个人都在选修3门课程,对其运行AC-3后,仍然没有变化。 我们讲过[搜索](4.3.1搜索.md)问题。一个约束满足问题可以被看作是一个搜索问题: -- 初始状态(Initial state):空赋值(所有变量都没有分配任何数值)。 -- 动作(Action):在赋值中加入一个{变量=值};也就是说,给某个变量一个值。 -- 过渡模型(Transition model):显示添加赋值如何改变变量。这没有什么深度:过渡模型返回包括最新动作后的赋值的状态。 -- 目标测试(Goal test):检查所有变量是否被赋值,所有约束条件是否得到满足。 -- 路径成本函数(Path cost function):所有路径的成本都是一样的。正如我们前面提到的,与典型的搜索问题相比,优化问题关心的是解决方案,而不是通往解决方案的路线。 +- 初始状态 (Initial state):空赋值 (所有变量都没有分配任何数值)。 +- 动作 (Action):在赋值中加入一个{变量=值};也就是说,给某个变量一个值。 +- 过渡模型 (Transition model):显示添加赋值如何改变变量。这没有什么深度:过渡模型返回包括最新动作后的赋值的状态。 +- 目标测试 (Goal test):检查所有变量是否被赋值,所有约束条件是否得到满足。 +- 路径成本函数 (Path cost function):所有路径的成本都是一样的。正如我们前面提到的,与典型的搜索问题相比,优化问题关心的是解决方案,而不是通往解决方案的路线。 然而,把约束满足问题作为一个普通的搜索问题来处理,是非常低效的。相反,我们可以利用约束满足问题的结构来更有效地解决它。 -### 回溯搜索(Backtracking Search) +### 回溯搜索 (Backtracking Search) 回溯搜索是一种考虑约束满足搜索问题结构的搜索算法。一般来说,它是一个递归函数,只要值满足约束,它就会尝试继续赋值。如果违反了约束,它将尝试不同的赋值。让我们看看它的伪代码: @@ -248,13 +248,13 @@ function Backtrack(assignment, csp): ![4.3.4-11](static/4.3.4-11.png) -我们从空赋值开始。然后,我们选择变量A,并给它赋值`Mon`。然后,使用这个赋值,我们再次运行算法。既然A已经有了一个赋值,算法将考虑B,并将`Mon`赋值给它。此赋值返回`false`,因此算法将尝试在`Tue`为B赋值,而不是在给定上一个赋值的情况下为C赋值。这个新的赋值满足约束条件,在给定这个赋值的情况下,下一步将考虑一个新的变量。例如,如果将`Tue`或`Wed`也赋值给B会导致失败,那么算法将回溯并返回到考虑A,为其分配另一个值,即`Tue`。如果`Tue`和`Wed`也失败了,那么这意味着我们已经尝试了所有可能的赋值,该问题是无法解决的。 +我们从空赋值开始。然后,我们选择变量 A,并给它赋值`Mon`。然后,使用这个赋值,我们再次运行算法。既然 A 已经有了一个赋值,算法将考虑 B,并将`Mon`赋值给它。此赋值返回`false`,因此算法将尝试在`Tue`为 B 赋值,而不是在给定上一个赋值的情况下为 C 赋值。这个新的赋值满足约束条件,在给定这个赋值的情况下,下一步将考虑一个新的变量。例如,如果将`Tue`或`Wed`也赋值给 B 会导致失败,那么算法将回溯并返回到考虑 A,为其分配另一个值,即`Tue`。如果`Tue`和`Wed`也失败了,那么这意味着我们已经尝试了所有可能的赋值,该问题是无法解决的。 在源代码部分,您可以从头开始实现的回溯算法。然而,这种算法被广泛使用,因此,多个库已经包含了它的实现。 -## 推理(Inference) +## 推理 (Inference) -尽管回溯搜索比简单搜索更有效,但它仍然需要大量的算力。另一方面,满足弧一致性需要的算力较低。通过将回溯搜索与推理交织在一起(满足弧一致性),我们可以得到一种更有效的算法。该算法被称为“保持弧一致性” __(Maintaining Arc-Consistency)__ 算法。该算法将在每次新的回溯搜索分配之后满足弧一致性。具体来说,在我们对X进行新的赋值后,我们将调用`AC-3`算法,并从所有弧(Y,X)的队列开始,其中Y是X的邻居(而不是问题中所有弧的队列)。以下是一个经过修订的Backtrack算法,该算法保持了弧的一致性。 +尽管回溯搜索比简单搜索更有效,但它仍然需要大量的算力。另一方面,满足弧一致性需要的算力较低。通过将回溯搜索与推理交织在一起(满足弧一致性),我们可以得到一种更有效的算法。该算法被称为“保持弧一致性”__(Maintaining Arc-Consistency)__ 算法。该算法将在每次新的回溯搜索分配之后满足弧一致性。具体来说,在我们对 X 进行新的赋值后,我们将调用`AC-3`算法,并从所有弧 (Y,X) 的队列开始,其中 Y 是 X 的邻居 (而不是问题中所有弧的队列)。以下是一个经过修订的 Backtrack 算法,该算法保持了弧的一致性。 ```python function Backtrack(assignment, csp): @@ -274,28 +274,28 @@ function Backtrack(assignment, csp): return failure ``` -Inference函数运行AC-3算法,如前所述。它的输出是通过满足弧一致性可以做出的所有推断。从字面上看,这些是可以从以前的赋值和约束满足问题的结构中推导出来的新赋值。 +Inference 函数运行 AC-3 算法,如前所述。它的输出是通过满足弧一致性可以做出的所有推断。从字面上看,这些是可以从以前的赋值和约束满足问题的结构中推导出来的新赋值。 还有其他方法可以提高算法的效率。到目前为止,我们随机选择了一个未分配的变量。然而,有些选择比其他选择更有可能更快地找到解决方案。这需要使用启发式方法。启发式是一条经验法则,这意味着,通常情况下,它会比遵循随机的方法带来更好的结果,但不能保证总是更优。 -__最小剩余值(Minimum Remaining Values(MRV))__ 就是这样一种启发式方法。这里的想法是,如果一个变量的域被推理限制了,现在它只剩下一个值(甚至是两个值),那么通过进行这种赋值,我们将减少以后可能需要进行的回溯次数。也就是说,我们迟早要做这个赋值,因为它是从满足弧一致性中推断出来的。如果这项任务失败了,最好尽快发现,避免以后的回溯。 +__最小剩余值 (Minimum Remaining Values(MRV))__ 就是这样一种启发式方法。这里的想法是,如果一个变量的域被推理限制了,现在它只剩下一个值 (甚至是两个值),那么通过进行这种赋值,我们将减少以后可能需要进行的回溯次数。也就是说,我们迟早要做这个赋值,因为它是从满足弧一致性中推断出来的。如果这项任务失败了,最好尽快发现,避免以后的回溯。 ![4.3.4-12](static/4.3.4-12.png) -例如,在给定当前赋值的情况下缩小变量的域后,使用MRV启发式,我们接下来将选择变量C,并以Wed为其赋值。 +例如,在给定当前赋值的情况下缩小变量的域后,使用 MRV 启发式,我们接下来将选择变量 C,并以 Wed 为其赋值。 -__度(Degree)__ 启发式依赖于变量的度,其中度是指将一个变量连接到其他变量的弧数。通过一次赋值选择度最高的变量,我们约束了多个其他变量,从而加快了算法的进程。 +__度 (Degree)__ 启发式依赖于变量的度,其中度是指将一个变量连接到其他变量的弧数。通过一次赋值选择度最高的变量,我们约束了多个其他变量,从而加快了算法的进程。 ![4.3.4-13](static/4.3.4-13.png) -例如,上面所有的变量都有相同大小的域。因此,我们应该选择一个度最高的域,它将是变量E。 +例如,上面所有的变量都有相同大小的域。因此,我们应该选择一个度最高的域,它将是变量 E。 这两种启发式方法并不总是适用的。例如,当多个变量在其域中具有相同的最小值时,或者当多个变数具有相同的最高度时。 -另一种提高算法效率的方法是,当我们从变量的域中选择一个值时,使用另一种启发式方法。在这里,我们使用 __最小约束值(Least Constraining Values)__ 启发式,在这里我们选择将约束最少其他变量的值。这里的想法是,在度启发式中,我们希望使用更可能约束其他变量的变量,而在这里,我们希望这个变量对其他变量的约束最少。也就是说,我们希望找到可能是最大潜在麻烦源的变量(度最高的变量),然后使其尽可能不麻烦(为其赋值约束其他变量最少的值)。 +另一种提高算法效率的方法是,当我们从变量的域中选择一个值时,使用另一种启发式方法。在这里,我们使用 __最小约束值 (Least Constraining Values)__ 启发式,在这里我们选择将约束最少其他变量的值。这里的想法是,在度启发式中,我们希望使用更可能约束其他变量的变量,而在这里,我们希望这个变量对其他变量的约束最少。也就是说,我们希望找到可能是最大潜在麻烦源的变量 (度最高的变量),然后使其尽可能不麻烦 (为其赋值约束其他变量最少的值)。 ![4.3.4-14](static/4.3.4-14.png) -例如,让我们考虑变量C。如果我们将`Tue`分配给它,我们将对所有B、E和F施加约束。然而,如果我们选择`Wed`,我们将只对B和E施加约束。因此,选择`Tue`可能更好。 +例如,让我们考虑变量 C。如果我们将`Tue`分配给它,我们将对所有 B、E 和 F 施加约束。然而,如果我们选择`Wed`,我们将只对 B 和 E 施加约束。因此,选择`Tue`可能更好。 总之,优化问题可以用多种方式来表述。在这,我们考虑了局部搜索、线性规划和约束满足。 diff --git a/4.人工智能/ch02/ch2.2/ch2.2.5/2.2.5.0.md b/4.人工智能/ch02/ch2.2/ch2.2.5/2.2.5.0.md index c1e37e2..c277745 100644 --- a/4.人工智能/ch02/ch2.2/ch2.2.5/2.2.5.0.md +++ b/4.人工智能/ch02/ch2.2/ch2.2.5/2.2.5.0.md @@ -118,7 +118,7 @@ def Shared_Bottom(dnn_feature_columns, num_tasks=None, task_types=None, task_nam 参考资料: -[https://developer.aliyun.com/article/793252](https://link.zhihu.com/?target=https%3A//developer.aliyun.com/article/793252) +[https://developer.aliyun.com/article/793252](https://developer.aliyun.com/article/793252) https://zhuanlan.zhihu.com/p/291406172 diff --git a/5.富有生命的嵌入式/5.1嵌入式是什么?可以吃吗?.md b/5.富有生命的嵌入式/5.1嵌入式是什么?可以吃吗?.md index 7b64644..a5ac40c 100644 --- a/5.富有生命的嵌入式/5.1嵌入式是什么?可以吃吗?.md +++ b/5.富有生命的嵌入式/5.1嵌入式是什么?可以吃吗?.md @@ -14,7 +14,7 @@ 而我也常常遇到学弟学妹们去向我提问:什么是嵌入式? -**我觉得以我通俗的话来讲就是:在硬件设备上写软件代码。**虽然这种说法并不是完全准确,但是对于初学者而言暂时性的保持这样的认知,在探索嵌入式的过程中不断完善自己的学习体系,已是极好。 +我觉得以我通俗的话来讲就是:在硬件设备上写软件代码。虽然这种说法并不是完全准确,但是对于初学者而言暂时性的保持这样的认知,在探索嵌入式的过程中不断完善自己的学习体系,已是极好。 不如举一个大学里玩嵌入式的常见概念吧:机器人。 @@ -33,8 +33,10 @@ 在嵌入式开发者的眼里,这会是一款成功的作品(当然考虑到了它的营销方面),它用通用嵌入式操作系统 + 应用软件的高端嵌入式系统结构,在满足系统对功能、功耗等要求的前提下,能将产品价格维持在一个较低的水平上,并且在我看来其 GUI 设计非常的令人舒适。 塞一个我认为很帅的 DIY 自行车码表,其 UI 设计也相当的棒。 + 还有一个我最近关注的一个博主,我喜欢其富有想法的创造力与强大的执行力。 + ## 想说的话 diff --git a/5.富有生命的嵌入式/5.2New meaning of C.md b/5.富有生命的嵌入式/5.2New meaning of C.md index 87af6b3..35ae1fd 100644 --- a/5.富有生命的嵌入式/5.2New meaning of C.md +++ b/5.富有生命的嵌入式/5.2New meaning of C.md @@ -26,11 +26,7 @@ Intel 的 STC89C51\C52 系列早在上世纪 80 年代就已经广泛运用, [https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng](https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng) 提取码:gdzf,链接里压缩包的解压密码:51,如果打不开请复制链接到浏览器再打开 -### 一些简单的任务 -咳咳,摆烂一下,放一下 22 年实验室的培养计划(只给第一期,不能再多了): - -在学习完这些内容后,你可以尝试如下的工程实践: ## 寄存器(VERRY--IMPORTANT!!!) diff --git a/6.计算机安全/6.1Web安全.md b/6.计算机安全/6.1Web安全.md index b4647f4..86f789c 100644 --- a/6.计算机安全/6.1Web安全.md +++ b/6.计算机安全/6.1Web安全.md @@ -69,6 +69,11 @@ HTTP 请求和响应的具体内容可以使用浏览器(推荐使用 Chrome - [HTML CSS 基础](https://www.w3cschool.cn/) - JS:《JavaScript DOM 编程基础》 - C:《C Primer Plus》 + + ::: tip 📥 + 《C Primer Plus》(第六版中文版)(216MB)附件下载 + ::: + - PHP:《PHP 和 MySQL Web 开发》 - Python: 《Python 从入门到实践》的入门部分 - HTTP:《图解 HTTP》 diff --git a/6.计算机安全/6.2二进制安全.md b/6.计算机安全/6.2二进制安全.md index 2a38468..3309fbe 100644 --- a/6.计算机安全/6.2二进制安全.md +++ b/6.计算机安全/6.2二进制安全.md @@ -26,6 +26,10 @@ reverse 主要研究软件破解,软件加固,计算机病毒等。 ## 为了打好基础,我应该怎么学? +::: tip 📥 +《C Primer Plus》(第六版中文版)(216MB)附件下载 +::: + - C 语言推荐阅读《C Primer Plus》,C 语言领域的圣经。二进制对 C 语言的最低要求:熟练地使用链表完成约瑟夫环问题。 - x86 汇编语言推荐阅读王爽的《汇编语言》,在本文编辑时已经出到了第四版。x86 是目前最常用的 CPU 架构之一,目前基本上所有的电脑,服务器都采用的 x86 架构。因此在初期的二进制学习中,学习 x86 汇编语言是没有什么问题的。x86 汇编语言历史比较悠久,从 Intel 公司的第一代处理器 8086 采用的 16 位 x86 汇编语言开始,已经逐步发展到现在的 32 位/64 位。王爽的《汇编语言》讲的就是 16 位 x86 汇编语言。可能有人会问,现在学 16 位汇编语言还有什么用吗?其实 x86 的基础命令,对汇编语言来说只是寄存器的命名有所不同,寄存器的宽度也由 16 位升到 32 位再到 64 位而已。比如在 16 位汇编中,加法命令是 `add ax,bx`(意思是 ax=ax+bx,ax 和 bx 都是 16bit 的寄存器),而到了 32 位汇编中是 `add eax,ebx`,64 位汇编中是 `add rax,rbx`。虽然这些语句翻译成字节码是有区别的,但对于汇编语言来说差别并不大,因此由 16 位汇编入门,简单易上手,后面扩展到 32/64 位也很容易,是非常合适的。 - Python 的基本语法,Python 之所以没有作为“基础”,是因为在二进制安全中,Python 由于其简单,开发周期短的特性,往往充当一个锦上添花的工具的角色,比如在做逆向工程领域的研究时,使用 Python 来编写一些加解密脚本要比使用 C 语言快速。感受一下: diff --git a/6.计算机安全/6.5学习资料推荐.md b/6.计算机安全/6.5学习资料推荐.md index b6f6290..98c041f 100644 --- a/6.计算机安全/6.5学习资料推荐.md +++ b/6.计算机安全/6.5学习资料推荐.md @@ -42,6 +42,5 @@ - - - -- - - diff --git a/7.网络应用开发/7.1.1.1基础部分.md b/7.网络应用开发/7.1.1.1基础部分.md index c51a2af..47f575f 100644 --- a/7.网络应用开发/7.1.1.1基础部分.md +++ b/7.网络应用开发/7.1.1.1基础部分.md @@ -23,11 +23,11 @@ ::: warning 🎈 **快速上手的参考建议** -**HTML**** **可以先认知常用标签( body / div / span / a / img 等)及其常用属性 +**HTML**可以先认知常用标签(body / div / span / a / img 等)及其常用属性 **CSS**了解常见的颜色属性(字体颜色 / 背景颜色 / 边框颜色 等)、字体相关属性(字号 / 字重 / 行高 等)、盒子模型(padding / border / margin)、用于布局的属性(float / flex / grid)、单位(px / rem / em / vh / vw 等)、选择器(id 选择器 / 类选择器 等) -**JS**** **了解基本语法(变量定义 / 判断 / 循环 / 函数定义 / etc)与 DOM 操作 +**JS**了解基本语法(变量定义 / 判断 / 循环 / 函数定义 / etc)与 DOM 操作 涉及**前后端交互**的部分可以了解 fetch 的使用 @@ -39,7 +39,7 @@ ### 🥂 助手介绍网页的重写 -设计部姐姐给了前端部一个助手介绍网页的设计稿,但是 psyq 觉得[目前的助手介绍网页](https://site.hduhelp.com/)写得不是很还原,你可以帮 psyq 重写一个更好看的网页吗? +设计部姐姐给了前端部一个助手介绍网页的设计稿,但是 psyq 觉得[目前的助手介绍网页](https://www.hduhelp.com/)写得不是很还原,你可以帮 psyq 重写一个更好看的网页吗? 设计稿如下: @@ -81,7 +81,7 @@ - 书写/引入 js 使用 `