├── .github
├── ISSUE_TEMPLATE
│ └── course-bugs.md
└── workflows
│ ├── auto-pr.yml
│ ├── prettier-lab-docs.yml
│ └── sync-lab-docs.yml
├── .gitignore
├── 1-Linux-基础入门-free
├── 01-1-Linux 系统简介.sy.md
├── 02-2-基本概念及操作.sy.md
├── 03-3-用户及文件权限管理.sy.md
├── 04-59-Linux 目录结构及文件基本操作.sy.md
├── 05-60-环境变量与文件查找.sy.md
├── 06-2687-寻找文件.tz.md
├── 07-61-文件打包与解压缩.sy.md
├── 08-62-文件系统操作与磁盘管理.sy.md
├── 09-1917-Linux 下的帮助命令.sy.md
├── 10-1918-Linux 任务计划 crontab.sy.md
├── 11-2697-备份日志.tz.md
├── 12-63-命令执行顺序控制与管道.sy.md
├── 13-337-简单的文本处理.sy.md
├── 14-346-数据流重定向.sy.md
├── 15-2698-历史命令.tz.md
├── 16-354-正则表达式基础.sy.md
├── 17-2699-数据提取.tz.md
├── 18-356-Linux 下软件安装.sy.md
├── 19-1943-Linux 进程概念.sy.md
├── 20-1944-Linux 进程管理.sy.md
├── 21-1945-Linux 日志系统.sy.md
└── README.md
├── 1035-Git-与-GitHub-入门实践-free
├── 01-7166-Git 与 GitHub 简介.sy.md
├── 02-9805-Git 基础操作.sy.md
├── 03-9816-Git 分支操作.sy.md
├── 04-9817-多人协作 GitHub 部分.sy.md
├── 05-9824-多人协作 Git 部分.sy.md
├── 06-10369-Git tag 和 GitHub releases.sy.md
└── README.md
├── 106-Redis-简明教程-free
├── 01-891-Redis 安装介绍.sy.md
├── 02-911-Redis 数据类型.sy.md
├── 03-913-Redis 系统管理.sy.md
├── 04-915-Redis 高级应用.sy.md
└── README.md
├── 11-Go-语言简明教程-free
├── 01-49-Go 语言介绍.sy.md
├── 02-54-Go 语言基础.sy.md
├── 03-58-Go 语言顺序编程.sy.md
├── 04-127-面向对象编程.sy.md
├── 05-128-并发编程.sy.md
├── 06-129-词频统计综合案例.sy.md
├── 07-142-IDE 及环境配置.sy.md
└── README.md
├── 115-操作系统原理与实践-free
├── 00-2704815-使用本课程上课说明.wd.md
├── 10-374-熟悉实验环境 .sy.md
├── 20-568-操作系统的引导.sy.md
├── 30-569-系统调用.sy.md
├── 40-570-进程运行轨迹的跟踪与统计.sy.md
├── 50-571-基于内核栈切换的进程切换.sy.md
├── 60-572-信号量的实现和应用.sy.md
├── 70-573-地址映射与共享.sy.md
├── 80-574-终端设备的控制.sy.md
└── 90-575-proc文件系统的实现.sy.md
├── 12-MongoDB-基础教程-free
├── 01-50-数据库和集合基本操作.sy.md
├── 02-53-数据查询.sy.md
├── 03-57-文档基本操作.sy.md
├── 04-77-查询、索引与聚合.sy.md
├── 05-78-高级查询与索引.sy.md
├── 06-2789-挑战:管理员工的基本信息.tz.md
└── README.md
├── 1230-Java-简明教程-free
├── 01-9465-基础语法(上).sy.md
├── 02-9466-基础语法(下).sy.md
├── 03-9467-面向对象.sy.md
├── 04-9468-常用类.sy.md
├── 05-9469-泛型和集合.sy.md
├── 06-9470-异常.sy.md
├── 07-9471-Lambda.sy.md
├── 08-9472-IO.sy.md
├── 09-9473-网络编程.sy.md
├── 10-9474-多线程.sy.md
├── 11-11047-JDBC.sy.md
├── 12-11048-反射.sy.md
├── 13-11049-正则表达式.sy.md
├── 14-11050-设计模式.sy.md
└── README.md
├── 1238-JavaScript-基础入门-free
├── 01-9786-JavaScript 基础.sy.md
├── 02-9787-JavaScript 关键特性.sy.md
├── 03-9788-JSON.sy.md
├── 04-9789-Web API.sy.md
├── 05-9802-值类型和引用类型以及异常.sy.md
├── 06-9803-面向对象编程.sy.md
├── 07-9804-函数进阶.sy.md
└── README.md
├── 1262-Vue.js-基础入门-free
├── 01-10292-Vue 简介与安装使用.sy.md
├── 02-10336-模版语法.sy.md
├── 03-10337-计算属性和侦听属性与过滤器.sy.md
├── 04-10338-class 与 style 绑定.sy.md
├── 05-10339-条件与循环渲染.sy.md
├── 06-10340-事件处理.sy.md
├── 07-10341-表单处理.sy.md
├── 08-10342-组件.sy.md
├── 09-10343-过渡与动画.sy.md
├── 10-10344-Vue 进阶引导.sy.md
└── README.md
├── 1265-Python-实现常见数据结构-free
├── 01-10282-数据结构(上).sy.md
├── 02-10284-数据结构(下).sy.md
├── 03-10285-哈希.sy.md
├── 04-10286-数学算法.sy.md
├── 05-10345-线性代数.sy.md
├── 06-10346-搜索算法.sy.md
├── 07-10347-排序算法.sy.md
├── 08-10364-字符串.sy.md
└── README.md
├── 1330-Python-新手入门课-free
├── 01-11060-进入编程大门.sy.md
├── 02-11061-认识 Linux.sy.md
├── 03-11071-创建代码文件.tz.md
├── 04-11072-认识 Python.sy.md
├── 05-11073-Python 的流程控制.sy.md
├── 06-11076-逢 7 就跳过.tz.md
├── 07-11077-Git 和 Github.sy.md
├── 08-11102-最终挑战:提交代码.tz.md
├── 09-11923-不是结束,而是开始.sy.md
└── README.md
├── 1403-Linux-运维新手入门课-free
├── 01-12915-认识 Linux.sy.md
├── 02-12916-挑战:创建代码文件.tz.md
├── 03-12917-部署 Nginx Web 服务器.sy.md
├── 04-12918-挑战:让实验楼网站恢复访问.tz.md
├── 05-12919-Zabbix 监控平台搭建.sy.md
├── 06-12920-Zabbix 监控 Nginx Web 服务.sy.md
└── README.md
├── 144-HTML-实现扫雷游戏-free
├── 01-435-HTML 实现扫雷游戏.sy.md
└── README.md
├── 1485-Julia-简明教程-free
├── 01-16789-Julia 简介和安装.sy.md
├── 02-16790-变量和数据类型.sy.md
├── 03-16791-元组、字典和集合.sy.md
├── 04-16792-函数.sy.md
├── 05-16793-流程控制和异常处理.sy.md
├── 06-16794-变量作用域和类型.sy.md
├── 07-16802-按照要求打印学生信息.tz.md
└── README.md
├── 1499-通过例子学-Rust-free
├── 01-16545-Hello World.sy.md
├── 02-16546-原生类型.sy.md
├── 03-16547-自定义类型.sy.md
├── 04-16548-变量绑定.sy.md
├── 05-16549-类型系统.sy.md
├── 06-16550-类型转换.sy.md
├── 07-16551-表达式.sy.md
├── 08-16552-流程控制.sy.md
├── 09-16553-函数.sy.md
├── 10-16554-模块.sy.md
├── 11-16555-crate.sy.md
├── 12-16556-cargo.sy.md
├── 13-16557-属性.sy.md
├── 14-16558-泛型.sy.md
├── 15-16559-作用域规则.sy.md
├── 16-16560-特性 trait.sy.md
├── 17-16561-使用 macro_rules! 来创建宏.sy.md
├── 18-16562-错误处理.sy.md
├── 19-16563-标准库类型.sy.md
├── 20-16564-标准库更多介绍.sy.md
├── 21-16565-测试.sy.md
├── 22-16566-不安全操作,兼容性与补充.sy.md
└── README.md
├── 2-Vim-基础入门-free
├── 01-16-Vim 快速入门.sy.md
├── 02-17-Vim 文档编辑.sy.md
├── 03-18-Vim 查找替换.sy.md
├── 04-19-Vim 高级功能.sy.md
└── README.md
├── 2023-TypeScript-基础入门-free
├── 01-29200-初见 TypeScript.sy.md
├── 02-29201-基本数据类型.sy.md
├── 03-29202-接口.sy.md
├── 04-29203-类(Class).sy.md
├── 05-29204-函数.sy.md
├── 06-29205-模块.sy.md
├── 07-29206-命名空间.sy.md
└── README.md
├── 22-jQuery-基础入门-free
├── 01-122-Jquery 介绍.sy.md
├── 02-130-jQuery 选择器.sy.md
├── 03-131-Query 中的 DOM 操作.sy.md
├── 04-132-jQuery 中的事件和动画.sy.md
├── 05-133-Query 对表单、表格的操作.sy.md
├── 06-11140-jQuery AJAX.sy.md
├── 07-11141-jQuery 插件的使用和写法.sy.md
└── README.md
├── 23-PHP-编程入门-free
├── 01-189-PHP简介.sy.md
├── 02-190-基本语法.sy.md
├── 03-191-数据类型(一).sy.md
├── 04-192-数据类型(二).sy.md
├── 05-193-变量.sy.md
├── 06-194-常量.sy.md
├── 07-195-运算符.sy.md
├── 08-196-控制结构(一).sy.md
├── 09-197-控制结构(二).sy.md
├── 10-198-函数.sy.md
├── 11-199-类与对象(一).sy.md
├── 12-200-类与对象(二).sy.md
└── README.md
├── 237-Hadoop-基础入门-free
├── 00-2437210-版本更新说明.sy.md
├── 01-764-Hadoop 介绍与安装.sy.md
├── 02-1032-HDFS 原理及操作.sy.md
├── 03-1033-MapReduce 原理及操作.sy.md
├── 04-1034-MapReduce 应用案例.sy.md
├── 05-2414413-Spark介绍和安装部署.sy.md
├── 06-1042-Hive 介绍和安装部署.sy.md
├── 07-1044-HBase安装与应用案例.sy.md
├── 08-1045-Sqoop 安装与操作.sy.md
├── 09-1046-Flume 介绍与安装.sy.md
├── 10-776-Hadoop2.X 64 位编译(选学).sy.md
├── 11-1029-Hadoop2.X 64 位环境搭建(选学).sy.md
├── 12-1035-Pig 安装与应用案例.sy.md
├── 13-1043-Mahout 安装与应用案例.sy.md
├── 14-1047-Chukwa 介绍与安装部署.sy.md
└── README.md
├── 35-Hadoop-部署及管理-free
├── 01-134-Hadoop课程介绍.sy.md
├── 02-135-Hadoop单机模式安装.sy.md
├── 03-162-Hadoop伪分布模式配置部署.sy.md
└── README.md
├── 3584-Oeasy-教您玩转-Python-free
├── 001-87321-先跑起来.sy.md
├── 002-87323-你好世界.sy.md
├── 003-87333-继续运行.sy.md
├── 004-87374-调试程序.sy.md
├── 005-87382-程序本质.sy.md
├── 006-87385-hello-world.sy.md
├── 007-87487-字符本质.sy.md
├── 008-87675-ASCII 码表.sy.md
├── 009-87338-换行字符.sy.md
├── 010-87991-不换行输出.sy.md
├── 011-87992-输出时间.sy.md
├── 012-87993-刷新时间.sy.md
├── 013-87995-整合程序.sy.md
├── 014-87996-直接运行.sy.md
├── 015-88007-设置路径.sy.md
├── 016-88008-查看进程.sy.md
├── 017-88353-回到开头.sy.md
├── 018-95601-深度整合.sy.md
├── 019-88354-换行回车.sy.md
├── 020-88730-电传打字机.sp.md
├── 021-88731-teletype 历史.sy.md
├── 022-87343-转义序列.sy.md
├── 023-89703-转义字符.sy.md
├── 024-87341-光标位置.sy.md
├── 025-104140-字体样式.sy.md
├── 026-87346-修改颜色.sy.md
├── 027-95632-背景颜色.sy.md
├── 028-89900-更多颜色.sy.md
├── 029-89935-各种符号.sy.md
├── 030-92241-编码进化.sy.md
├── 031-92402-各语言字符编码.sy.md
├── 032-92414-unicode.sy.md
├── 033-92423-utf-8.sy.md
├── 034-92554-另类字符.sy.md
├── 035-92555-Python 历史.sy.md
├── 036-188456-啥是变量.sy.md
├── 037-188458-定义变量.sy.md
├── 038-188464-接收输入.sy.md
├── 039-188465-相加运算.sy.md
├── 040-188729-尝试捕获异常.sy.md
├── 041-188728-自制模块.sy.md
├── 042-188730-主控程序.sy.md
├── 043-188731-版本控制 git.sy.md
├── 044-188727-注释说明.sy.md
├── 045-188787-帮助手册.sy.md
├── 046-188798-动态类型.sy.md
├── 047-188803-字符串类型.sy.md
├── 048-188814-整型数字变量.sy.md
├── 049-188908-进制转化.sy.md
├── 050-188921-加法运算.sy.md
├── 051-188926-键盘输入.sy.md
├── 052-188927-随机数字.sy.md
├── 053-189035-随机字符.sy.md
├── 054-189036-颜色常量.sy.md
├── 055-188928-减法运算.sy.md
├── 056-188929-负数表示.sy.md
├── 057-189359-补码系统.sy.md
├── 058-188930-乘法运算.sy.md
├── 059-189507-除法运算.sy.md
├── 060-189509-取整操作.sy.md
├── 061-189513-浮点类型.sy.md
├── 062-189617-分数类型.sy.md
├── 063-189618-深入浮点型数字.sy.md
├── 064-189619-深入整型数字.sy.md
├── 065-189506-乘方运算.sy.md
├── 066-189668-开方和对数运算.sy.md
├── 067-189669-虚数类型.sy.md
├── 068-189673-表达式 expression.sy.md
├── 069-189722-打开文件.sy.md
├── 070-189725-读取细节.sy.md
├── 071-189732-命令行参数.sy.md
├── 072-190174-写入文件.sy.md
├── 073-190199-二进制模式.sy.md
├── 074-190203-二进制文件流存取整数.sy.md
├── 075-190458-二进制文件流存取浮点数.sy.md
├── 076-190459-Python 的进化.sy.md
├── 077-190650-拷贝程序.sy.md
├── 078-191368-文件锁.sy.md
├── 079-190654-追加写入.sy.md
├── 080-190651-序列化-serialize.sy.md
├── 081-190652-多文件读写.sy.md
├── 082-192165-执行外部命令.sy.md
├── 083-190653-编码 encoding.sy.md
├── 084-233669-系统命令.sy.md
├── 085-192174-with 关键字.sy.md
├── 086-192219-列表-类型.sy.md
├── 087-192220-列表-增减.sy.md
├── 088-192221-列表-构造-范围-range.sy.md
├── 089-192241-列表-索引 index.sy.md
├── 090-192242-列表-运算.sy.md
├── 091-192294-列表-切片 slice.sy.md
├── 092-192295-列表-排序 order.sy.md
├── 093-192296-列表-嵌套 embeded.sy.md
├── 094-192304-元组-tuple.sy.md
├── 095-192403-字符串序列-string.sy.md
├── 096-192405-字节流序列-bytes.sy.md
├── 097-192411-集合-set-元素操作.sy.md
├── 098-192413-集合运算.sy.md
├── 099-192414-字典-dictionary.sy.md
├── 100-192423-字典操作.sy.md
├── 101-201638-容器总结.sy.md
├── 102-203868-容器对象的腌制和存储.sy.md
├── 103-197319-分支开始.sy.md
├── 104-198696-缩进细节.sy.md
├── 105-199151-调试程序.sy.md
├── 106-199155-比较运算符.sy.md
├── 107-203062-序列类容器的比较运算.sy.md
├── 108-203075-映射类和集合类容器比较运算.sy.md
├── 109-203108-是否等于-is.sy.md
├── 110-203370-是否是某类型实例-isinstance.sy.md
├── 111-203367-是否属于-in.sy.md
├── 112-203369-取反运算-not.sy.md
├── 113-203372-双分支结构-else.sy.md
├── 114-203373-三目运算符.sy.md
├── 115-203374-嵌套条件语句.sy.md
├── 116-203376-多分支条件语句-elif.sy.md
├── 117-203377-跳过-pass-猜丁壳.sy.md
├── 118-203381-逻辑与-and.sy.md
├── 119-203409-数字区间.sy.md
├── 120-203387-逻辑或-or.sy.md
├── 121-203872-优先级-precedence.sy.md
├── 122-203873-综合练习-玩骰子-dices.sy.md
├── 123-203874-位运算符-按位与或非.sy.md
├── 124-205644-移位运算符.sy.md
├── 125-206033-条件分支流程总结.sy.md
├── 126-233735-循环起来.sy.md
├── 127-233736-循环条件.sy.md
├── 128-233769-break-中断条件.sy.md
├── 129-233772-循环细节.sy.md
├── 130-233773-else-不满足循环条件时.sy.md
├── 131-233775-continue-继续.sy.md
├── 132-233791-for-循环-玲珑塔.sy.md
├── 133-233802-iterable-可迭代对象-元组-列表.sy.md
├── 134-233828-可迭代对象-集合-sorted.sy.md
├── 135-233829-for-遍历字符串和字节序列.sy.md
├── 136-233927-for-遍历字典 dict.sy.md
├── 137-234325-zip-缝合.sy.md
├── 138-234326-enumerate-编号.sy.md
├── 139-234327-二重循环.sy.md
├── 140-234372-遍历文件流.sy.md
├── 141-253312-for 的总结.sy.md
├── 142-253313-列表推导式.sy.md
├── 143-255133-集合推导式.sy.md
├── 144-255813-字典推导式.sy.md
├── 145-259389-循环总结.sy.md
├── 146-259358-字符串 raw.sy.md
├── 147-192569-浏览过程 请求 响应 状态码.sy.md
├── 148-192576-requests-模块.sy.md
├── 149-192577-lxml 元素-树形结构.sy.md
├── 150-192598-lxml-属性-attrib.sy.md
├── 151-192644-lxml-文本-text.sy.md
├── 152-192645-lxml-遍历-iteration.sy.md
├── 153-192646-lxml-从 str 生成 etree.sy.md
├── 154-193105-lxml-结合-requests.sy.md
├── 155-193139-xpath-筛选.sy.md
├── 156-194109-xpath-属性筛选.sy.md
├── 157-194111-xpath-路径表达式.sy.md
├── 158-263198-xpath-选择器练习.sy.md
├── 159-263197-xpath-提取文本方法text()_string().sy.md
├── 160-194366-综合练习-爬取网站.sy.md
├── 161-194455-综合练习-遍历链接.sy.md
├── 162-250373-爬取百度.sy.md
├── 163-250390-百度指数.sy.md
├── 164-250391-爬取图片.sy.md
├── 165-252877-爬取图片进阶.sy.md
├── 166-253240-爬取图像数据.sy.md
└── README.md
├── 37-HBASE-基础入门-free
├── 01-364-HBase 简介.sy.md
├── 02-365-HBase 安装配置.sy.md
├── 03-756-HBase 基本操作.sy.md
├── 04-1973-Hbase rowkey 设计.sy.md
├── 05-7098-HBase 布隆过滤器.sy.md
└── README.md
├── 3821-Java-新手入门课-free
├── 01-114201-进入编程大门.sy.md
├── 02-116488-认识 Linux.sy.md
├── 03-121602-第一个 Java 程序.sy.md
├── 04-121603-Java 基础语法.sy.md
├── 05-121604-Java 流程控制.sy.md
├── 06-121605-逢 7 就跳过.tz.md
├── 07-121606-Git 和 GitHub.sy.md
├── 08-121607-最终挑战:提交代码.tz.md
├── 09-121608-不是结束,而是开始.sy.md
└── README.md
├── 39-Apache-Mahout-基础入门-free
├── 01-785-Mahout 简介.sy.md
├── 02-786-Mahout 安装配置.sy.md
├── 03-805-Mahout 聚类算法.sy.md
├── 04-806-Mahout 分类算法.sy.md
└── README.md
├── 3946-Python 3 新特性快速上手-free
├── 01-529698-Python 3.11 新特性.sy.md
├── 02-137602-结构模式匹配.sy.md
├── 03-137599-更好的错误信息.sy.md
├── 04-137603-与类型提示相关的新功能.sy.md
├── 05-137604-其他新功能.sy.md
├── 06-138776-Python 3.9 新特性.sy.md
├── 07-139538-Python 3.8 新特性.sy.md
├── 08-139541-Python 3.7 新特性.sy.md
├── 09-139543-Python 3.6 新特性.sy.md
└── README.md
├── 43-HTML5-简明教程-free
├── 01-151-HTML 概述.sy.md
├── 02-152-HTML 常用标签.sy.md
├── 03-175-HTML 表格与 DIV 应用.sy.md
├── 04-176-HTML 表单.sy.md
├── 05-177-HTML 图像与框架.sy.md
├── 06-178-HTML5 简介.sy.md
├── 07-10032-HTML5 表单.sy.md
├── 08-19130-HTML5 Canvas API.sy.md
├── 09-19131-HTML5 视频音频与拖放.sy.md
├── 10-19132-HTML5 Web Storage 和文件上传.sy.md
└── README.md
├── 44-Node.js-基础入门-free
├── 01-158-Node.js 简介及简单使用.sy.md
├── 02-246-Node.js 模块.sy.md
├── 03-247-Node.js 函数.sy.md
├── 04-304-Node.js 事件.sy.md
├── 05-336-Node.js http 模块 和 fs 模块.sy.md
├── 06-1153-Node.js Express 框架.sy.md
└── README.md
├── 539-Java-函数式编程-free
├── 01-1829-Lambda 表达式.sy.md
├── 02-1831-函数式接口.sy.md
├── 03-1832-Streams 流.sy.md
└── README.md
├── 57-C-语言简明教程-free
├── 01-280-C 语言简单剖析.sy.md
├── 02-2781-输出 I love shiyanlou.tz.md
├── 03-285-数据类型.sy.md
├── 04-297-运算符和数据转换.sy.md
├── 05-2782-摄氏转华氏温度.tz.md
├── 06-315-选择程序设计.sy.md
├── 07-335-循环程序设计.sy.md
├── 08-2783-序列求和.tz.md
├── 09-357-C 语言数组.sy.md
├── 10-367-模块化程序设计.sy.md
├── 11-368-指针(一).sy.md
├── 12-378-指针(二).sy.md
├── 13-2784-修复指针使用错误.tz.md
├── 14-409-文件和文件的输入与输出.sy.md
├── 15-2785-复制文件内容.tz.md
└── README.md
├── 596-Python3-简明教程-free
├── 01-2036-开始 Python 之旅.sy.md
├── 02-2037-变量和数据类型.sy.md
├── 03-2038-运算符和表达式.sy.md
├── 04-2772-挑战:圆的面积.tz.md
├── 05-2039-控制流 If-else.sy.md
├── 06-2040-循环.sy.md
├── 07-2041-数据结构.sy.md
├── 08-2042-字符串.sy.md
├── 09-2043-函数.sy.md
├── 10-2044-文件处理.sy.md
├── 11-2773-挑战:字符串操作.tz.md
├── 12-2045-异常.sy.md
├── 13-2774-挑战:玩转函数.tz.md
├── 14-2046-类 .sy.md
├── 15-2047-模块.sy.md
├── 16-2048-Collections 模块.sy.md
├── 17-2775-挑战:类和Collection模块.tz.md
├── 18-2049-PEP8 代码风格指南.sy.md
├── 19-2050-迭代器、生成器、装饰器.sy.md
├── 20-2051-Virtualenv.sy.md
├── 21-2052-测试.sy.md
├── 22-2053-项目结构.sy.md
├── 23-2054-Flask 介绍.sy.md
└── README.md
├── 63-新手入门指南之玩转蓝桥云课-free
├── 10-53598-你好,蓝桥云课 👋.wd.md
├── 20-292-Linux 桌面环境使用指南.sy.md
└── 30-53599-WebIDE 环境使用指南.sy.md
├── 68-Linux-命令基础入门-free
├── 01-301-Linux操作命令(一).sy.md
├── 02-302-Linux操作命令(二).sy.md
├── 03-303-Linux操作命令(三).sy.md
├── 04-341-Linux操作命令(四).sy.md
├── 05-348-Linux操作命令(五).sy.md
├── 06-353-Linux操作命令(六).sy.md
├── 07-369-Linux操作命令(七).sy.md
├── 08-370-Linux操作命令(八).sy.md
├── 09-371-Linux操作命令(九).sy.md
├── 10-393-Linux操作命令(十).sy.md
└── README.md
├── 70-Python-实现文本解析器-free
├── 01-307-Python 实现文本解释器.sy.md
└── README.md
├── 75-C-语言实现简单计算器-free
├── 01-314-C 语言制作简单计算器.sy.md
└── README.md
├── 7635-Apache-Log4j-2-远程代码执行漏洞详解-free
├── 01-282645-Apache Log4j2 远程代码执行漏洞详解.sy.md
└── README.md
├── 855-R-语言基础入门-free
├── 01-3105-R 语言入门:基础数据结构.sy.md
├── 02-3136-R 语言入门:tidyverse 生态链.sy.md
└── README.md
├── 9-MySQL-基础课程-free
├── 01-48-SQL 介绍及 MySQL 安装.sy.md
├── 02-56-创建数据库并插入数据.sy.md
├── 03-73-SQL 的约束.sy.md
├── 04-2769-搭建简易成绩管理系统数据库.tz.md
├── 05-74-SELECT 语句详解.sy.md
├── 06-75-数据库及表的修改和删除.sy.md
├── 07-76-其它基本操作.sy.md
└── README.md
├── 90-正则表达式基础入门-free
├── 01-779-正则表达式介绍与基础.sy.md
├── 02-780-grep 命令与正则表达式.sy.md
├── 03-781-sed 命令与正则表达式.sy.md
├── 04-782-正则表达式扩展应用.sy.md
├── 05-2788-Linux 用户信息编辑.tz.md
└── README.md
├── 944-高级-Bash-脚本编程指南-free
├── 01-3556-bash介绍与入门.sy.md
├── 02-3557-挑战:简单的热身.tz.md
├── 03-3558-bash特殊字符(上).sy.md
├── 04-3559-bash特殊字符(下).sy.md
├── 05-3560-变量和参数.sy.md
├── 06-3561-基本运算符.sy.md
├── 07-3562-挑战:矩形的面积和周长.tz.md
├── 08-3563-流程控制.sy.md
├── 09-3564-挑战:最大值.tz.md
├── 10-3565-挑战:偶数之和.tz.md
├── 11-3570-函数.sy.md
└── README.md
├── 98-TCP-IP-网络协议基础入门-free
├── 01-448-TCP IP简介.sy.md
├── 02-458-链路层介绍.sy.md
├── 03-474-IP网际协议.sy.md
├── 04-496-网络层其它协议.sy.md
├── 05-541-传输层:UDP协议.sy.md
├── 06-556-传输层:TCP协议.sy.md
├── 07-565-应用层协议.sy.md
└── README.md
├── LICENSE
├── PULL_REQUEST_TEMPLATE.md
└── README.md
/.github/ISSUE_TEMPLATE/course-bugs.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: 报告课程问题
3 | about: Course Bugs
4 | title: "请简要描述问题"
5 | labels: ""
6 | assignees: ""
7 | ---
8 |
9 | ## 内容路径
10 |
11 | - [请复制粘贴仓库文件夹名称](请复制粘贴仓库文件夹路径)
12 |
13 | ## 问题描述
14 |
15 | 请详细阐述已知问题描述。
16 |
--------------------------------------------------------------------------------
/.github/workflows/auto-pr.yml:
--------------------------------------------------------------------------------
1 | name: 自动同步文档到蓝桥云课
2 | on:
3 | push:
4 | branches:
5 | - master
6 | jobs:
7 | auto-pr:
8 | runs-on: ubuntu-latest
9 | steps:
10 | - uses: actions/checkout@v2
11 | with:
12 | ref: product
13 | - name: Reset promotion branch
14 | run: |
15 | git fetch origin master:master
16 | git reset --hard master
17 | - name: Create Pull Request
18 | uses: peter-evans/create-pull-request@v3
19 | with:
20 | branch: product-promotion
21 | reviewers: yanwydxf
22 | title: "自动同步文档到蓝桥云课"
23 | labels: 自动同步
24 | body: |
25 | 说明:
26 |
27 | - 这是一个自动生成的 PR,将保持 master 和 product 分支内容一致。
28 | - 课程内容,会在此 PR 合并之后自动同步上线。
29 |
--------------------------------------------------------------------------------
/.github/workflows/prettier-lab-docs.yml:
--------------------------------------------------------------------------------
1 | name: 自动格式化文档
2 | on:
3 | pull_request:
4 | branches:
5 | - master
6 | jobs:
7 | auto-prettier:
8 | runs-on: ubuntu-latest
9 | steps:
10 | - name: Checkout
11 | uses: actions/checkout@v2
12 | with:
13 | ref: ${{ github.head_ref }}
14 | - name: Get File Changes
15 | uses: trilom/file-changes-action@v1.2.4
16 | with:
17 | githubToken: ${{ secrets.GITHUB_TOKEN }}
18 | output: '" "'
19 | - name: Run Prettier
20 | run: npx prettier --write "${{ steps.get_file_changes.outputs.files }}"
21 | continue-on-error: true
22 | - name: Auto Commit
23 | uses: stefanzweifel/git-auto-commit-action@v4.3.0
24 | with:
25 | commit_message: 自动格式化文档
26 | branch: ${{ github.head_ref }}
27 |
--------------------------------------------------------------------------------
/.github/workflows/sync-lab-docs.yml:
--------------------------------------------------------------------------------
1 | name: 同步文档到蓝桥云课
2 | on:
3 | push:
4 | branches:
5 | - product
6 | jobs:
7 | sync-lab-docs:
8 | runs-on: ubuntu-latest
9 | steps:
10 | - name: Checkout
11 | uses: actions/checkout@v2
12 | with:
13 | ref: ${{ github.head_ref }}
14 | - name: 获取变更文件
15 | uses: trilom/file-changes-action@v1.2.4
16 | with:
17 | output: "json"
18 | fileOutput: "json"
19 | - name: 安装 labdocs-update-cli
20 | run: |
21 | git clone https://${{ secrets.ACCESS_TOKEN }}@github.com/lanqiao-courses/labdocs-update-cli.git
22 | cd labdocs-update-cli && pip install --editable .
23 | - name: 同步文档至蓝桥云课
24 | # 同步修改和新增文件
25 | run: |
26 | labdocs login
27 | echo "===== 同步修改文件 ====="
28 | labdocs update --file $HOME/files_modified.json
29 | echo "===== 同步新增文件 ====="
30 | labdocs update --file $HOME/files_added.json
31 |
32 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 |
--------------------------------------------------------------------------------
/1-Linux-基础入门-free/06-2687-寻找文件.tz.md:
--------------------------------------------------------------------------------
1 | # 挑战:寻找文件
2 |
3 | ## 介绍
4 |
5 | 有一个非常重要的文件(`sources.list`)但是你忘了它在哪了,你依稀记得它在 `/etc/` 目录下,现在要你把这个文件找出来,然后设置成自己(shiyanlou 用户)可以访问,但是其他用户并不能访问。
6 |
7 | ## 目标
8 |
9 | 1. 找到 `sources.list` 文件
10 | 2. 把文件所有者改为自己(shiyanlou)
11 | 3. 把权限修改为仅仅只有自己可读可写
12 |
13 | ## 提示语
14 |
15 | - find
16 | - chmod
17 | - chown
18 | - sudo
19 |
20 | 注意:如果是实验楼的海外用户,由于环境差异可能会找到两个 `sources.list` 文件,不需要修改 shiyanlou 目录下的 `sources.list`,因为这个文件是从实验环境外部挂载到环境中的,是无法修改的。
21 |
22 | ## 参考答案
23 |
24 | 注意:请务必自己独立思考解决问题之后再对照参考答案,一开始直接看参考答案收获不大。
25 |
26 |
27 | 参考答案
28 |
29 | ```bash
30 | sudo find /etc -name sources.list
31 | sudo chown shiyanlou /etc/apt/sources.list
32 | sudo chmod 600 /etc/apt/sources.list
33 | ```
34 |
35 |
36 |
--------------------------------------------------------------------------------
/1-Linux-基础入门-free/11-2697-备份日志.tz.md:
--------------------------------------------------------------------------------
1 | # 挑战:备份日志
2 |
3 | 小明是一个服务器管理员,他需要每天备份论坛数据(这里我们用 `alternatives.log` 日志替代),备份当天的日志并删除之前的日志。而且备份之后文件名是 `年-月-日` 的格式。`alternatives.log` 在 `/var/log/` 下面。
4 |
5 | ## 目标
6 |
7 | 1. 为 `shiyanlou` 用户添加计划任务
8 | 1. 每天凌晨 3 点的时候定时备份 `alternatives.log` 到 `/home/shiyanlou/tmp/` 目录
9 | 1. 命名格式为 `年-月-日`,比如今天是 2017 年 4 月 1 日,那么文件名为 `2017-04-01`
10 |
11 | ## 提示语
12 |
13 | - date
14 | - crontab
15 | - cp 命令
16 | - 用一条命令写在 crontab 里面即可,不用写脚本
17 |
18 | 注意 crontab 的计划任务设定的用户:
19 |
20 | ```bash
21 | crontab -e 表示为当前用户添加计划任务
22 | sudo crontab -e 表示为root用户添加计划任务
23 | ```
24 |
25 | 注意使用下面的命令启动 crontab:
26 |
27 | ```bash
28 | sudo cron -f &
29 | ```
30 |
31 | ## 参考答案
32 |
33 | 注意:请务必自己独立思考解决问题之后再对照参考答案,一开始直接看参考答案收获不大。
34 |
35 |
36 | 参考答案
37 |
38 | ```bash
39 | sudo cron -f &
40 | crontab -e # 添加
41 | 0 3 * * * sudo rm /home/shiyanlou/tmp/*
42 | 0 3 * * * sudo cp /var/log/alternatives.log /home/shiyanlou/tmp/$(date +\%Y-\%m-\%d)
43 | ```
44 |
45 |
46 |
--------------------------------------------------------------------------------
/1-Linux-基础入门-free/15-2698-历史命令.tz.md:
--------------------------------------------------------------------------------
1 | # 挑战:历史命令
2 |
3 | ## 介绍
4 |
5 | 在 Linux 中,对于文本的处理和分析是极为重要的,现在有一个文件叫做 data1,可以使用下面的命令下载:
6 |
7 | ```bash
8 | cd /home/shiyanlou
9 | wget https://labfile.oss-internal.aliyuncs.com/courses/1/data1
10 | ```
11 |
12 | data1 文件里记录是一些命令的操作记录,现在需要你从里面找出出现频率次数前 3 的命令并保存在 `/home/shiyanlou/result`。
13 |
14 | ## 目标
15 |
16 | 1. 处理文本文件 `/home/shiyanlou/data1`
17 | 2. 将结果写入 `/home/shiyanlou/result`
18 | 3. 结果包含三行内容,每行内容都是出现的次数和命令名称,如“100 ls”
19 |
20 | ## 提示
21 |
22 | 1. cut 截取 (参数可以使用 `-c 8-`,使用 man cut 可以查看含义)
23 | 2. `uniq -dc` 去重
24 | 3. sort 的参数选择 `-k1 -n -r`
25 | 4. 操作过程使用管道,例如:
26 |
27 | ```bash
28 | cd /home/shiyanlou
29 | cat data1 |....|....|.... > /home/shiyanlou/result
30 | ```
31 |
32 | ## 来源
33 |
34 | 2016 年百度校招面试题
35 |
36 | ## 参考答案
37 |
38 | 注意:请务必自己独立思考解决问题之后再对照参考答案,一开始直接看参考答案收获不大。
39 |
40 |
41 | 参考答案
42 |
43 | ```bash
44 | cat data1 |cut -c 8-|sort|uniq -dc|sort -rn -k1 |head -3 > /home/shiyanlou/result
45 | ```
46 |
47 |
48 |
--------------------------------------------------------------------------------
/1-Linux-基础入门-free/17-2699-数据提取.tz.md:
--------------------------------------------------------------------------------
1 | # 挑战:数据提取
2 |
3 | ## 介绍
4 |
5 | 小明在做数据分析的时候需要提取文件中关于数字的部分,同时还要提取用户的邮箱部分,但是有的行不是数组也不是邮箱,现在需要你在 data2 这个文件中帮助他用正则表达式匹配出数字部分和邮箱部分。
6 |
7 | 数据文件可以使用以下命令下载:
8 |
9 | ```bash
10 | $ cd /home/shiyanlou
11 | $ wget https://labfile.oss-internal.aliyuncs.com/courses/1/data2
12 | ```
13 |
14 | 下载后的数据文件路径为 `/home/shiyanlou/data2`。
15 |
16 | ## 目标
17 |
18 | 1. 在文件 `/home/shiyanlou/data2` 中匹配数字开头的行,将所有以数字开头的行都写入 `/home/shiyanlou/num` 文件。
19 | 2. 在文件 `/home/shiyanlou/data2` 中匹配出正确格式的邮箱,将所有的邮箱写入 `/home/shiyanlou/mail` 文件,注意该文件中每行为一个邮箱。
20 |
21 | ## 提示
22 |
23 | 1. 邮箱的格式匹配
24 | 2. 注意符号 `.` 的处理
25 |
26 | ## 来源
27 |
28 | 2016 年 TapFun 校招面试题
29 |
30 | ## 参考答案
31 |
32 | 注意:请务必自己独立思考解决问题之后再对照参考答案,一开始直接看参考答案收获不大。
33 |
34 |
35 | 参考答案
36 |
37 | ```bash
38 | grep '^[0-9]' /home/shiyanlou/data2 > /home/shiyanlou/num
39 | grep -E '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$' /home/shiyanlou/data2 > /home/shiyanlou/mail
40 | ```
41 |
42 |
43 |
--------------------------------------------------------------------------------
/1-Linux-基础入门-free/README.md:
--------------------------------------------------------------------------------
1 | # Linux 基础入门
2 |
3 | 本课程教你如何熟练地使用 Linux,本实验中通过在线动手实验的方式学习 Linux 常用命令,用户与权限管理,目录结构与文件操作,环境变量,计划任务,管道与数据流重定向等基本知识点。
4 |
5 | - 作者: [Edward](https://www.lanqiao.cn/users/20406/)
6 | - 链接: https://www.lanqiao.cn/courses/1
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/1035-Git-与-GitHub-入门实践-free/README.md:
--------------------------------------------------------------------------------
1 | # Git 与 GitHub 入门实践
2 |
3 | 本课程为 Git 与 GitHub 的入门课程,本着实用的原则,针对零基础同学,以图文的形式详细介绍了 Git & GitHub 结合使用的基本操作。课程包括:在 GitHub 上创建仓库、克隆 GitHub 上的仓库到本地、添加修改到暂存区以及撤销修改、配置个人信息、版本回退、处理提交时间线分叉问题、使用本地提交变化记录、添加 SSH 关联授权等方方面面的知识点。
4 |
5 | - 作者: [幺幺哒](https://www.lanqiao.cn/users/310176/)
6 | - 链接: https://www.lanqiao.cn/courses/1035
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/106-Redis-简明教程-free/README.md:
--------------------------------------------------------------------------------
1 | # Redis 简明教程
2 |
3 | Redis 是一个开源,支持网络且基于内存和键值对的存储数据库,本课程将介绍 Redis 的基本配置和使用方法。
4 |
5 | - 作者: [lcf](https://www.lanqiao.cn/users/42227/)
6 | - 链接: https://www.lanqiao.cn/courses/106
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/11-Go-语言简明教程-free/07-142-IDE 及环境配置.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # GO 语言 IDE 及环境配置
8 |
9 | ## 实验介绍
10 |
11 | 本实验将简要介绍当前 Go 语言的主流 IDE,并对其环境配置进行详细介绍。
12 |
13 | #### 知识点
14 |
15 | - 常用开发工具及其环境配置
16 |
17 | ## Go 开发工具
18 |
19 | #### GOROOT 与 GOPATH
20 |
21 | 在介绍常用 IDE 之前,我们先来了解一下 Go 的环境变量配置,实际上在之前的课程中我们已经有所介绍了。
22 |
23 | **GOROOT**
24 |
25 | 就是 go 的安装路径。在 `~/.bash_profile` 中添加下面语句:
26 |
27 | ```bash
28 | GOROOT=/usr/local/go
29 | export GOROOT
30 | ```
31 |
32 | 当然,要执行 go 命令和 go 工具,就要配置 go 的可执行文件的路径。
33 | 操作如下:
34 |
35 | 在 `~/.bash_profile` 中配置如下:
36 |
37 | ```bash
38 | export $PATH:$GOROOT/bin
39 | ```
40 |
41 | **GOPATH**
42 |
43 | GOPATH 是作为编译后二进制的存放目的地和 import 包时的搜索路径 (其实也是你的工作目录,你可以在 src 下创建你自己的 go 源文件,然后开始工作)。
44 |
45 | GOPATH 之下主要包含三个目录:
46 |
47 | - `bin`:目录主要存放可执行文件;
48 | - `pkg`:目录存放编译好的库文件;
49 | - `src`:目录下主要存放 Go 的源文件。
50 |
51 | 不要把 GOPATH 设置成 Go 的安装路径,可以自己在用户目录下面创建一个目录,如 gopath。操作如下:
52 |
53 | ```bash
54 | cd ~
55 | mkdir gopath
56 |
57 | # 在 ~/.bash_profile 中添加如下语句:
58 | GOPATH=/Users/username/gopath
59 | ```
60 |
61 | ### 常用开发工具
62 |
63 | Go 语言在刚推出时并没有专门针对 Go 语言开发的 IDE,不过还好 Go 提供的插件比较完善。开发者可以使用 IDEA、Eclipse 工具安装 Go 插件进行 Go 语言开发。直到 2017 年著名的捷克公司 JetBrains 才发布了第一款专门针对 Go 语言开发的 IDE:Goland。本节内容也着重为大家介绍 IDEA 与 Goland。这两款软件都来自 JetBrains 公司,大家可以在[官网](https://www.jetbrains.com/)下载。由于实验环境不支持安装这两款软件,大家可以自行在本地电脑进行安装。
64 |
65 | **IDEA**:IntelliJ idea 是一款非常强大的 IDE,支持丰富的插件。安装配置都是非常简单的,主要需要安装插件 Go,也可以安装 Markdown 的插件,便于读写 Markdown 文件。
66 |
67 | 首先打开 IDEA,然后点击左上角”File->Settings->Plugins”;
68 |
69 | 
70 |
71 | 然后点击 "Browse repositories";然后在搜索栏搜索插件 `GO`;选择名为 `GO` 的插件进行安装。
72 |
73 | 
74 |
75 | 插件安装完成后重启 IDEA, 再打开 `setting`,添加 `go sdk`。再点击 `GO` 对 `SDK` 进行设置,首先添加 `GOROOT` 也就是 GO 的安装路径,再设置 `GOPATH`。
76 | 然后就可以在 `GOPATH` 下的 `src` 目录下新建源文件了。
77 |
78 | **Goland**: Goland 是专门针对 Go 开发的一款 IDE,功能强大且整合了 IntelliJ 平台的有关 go 语言的编码辅助功能和工具集成特点。但是比较遗憾的是它没有免费社区版,想要使用它必须要购买注册码。
79 |
80 | 和 IDEA 一样,使用同样的方法进行下载安装,没有注册码的同学可以选择 30 天免费试用,然后打开设置,无需下载 GO 插件,直接进行添加 `GOROOT` 和 `GOPATH` 就可以新建项目进行开发了。对安装和配置步骤存在疑问的同学,可以在评论区留言提问,也可以在网上自行查阅相关教程。
81 |
82 | ## 实验总结
83 |
84 | 到目前为止,这门课程就结束了。在这门课程中我们学习了 Go 语言的基础知识,如数据类型、面向对象编程、并发编程等。可以看到 Go 语言的关键词非常少,使用起来相当灵活,相对于 C、C++ 等语言很大程度上提高了开发效率。想要进一步熟练 Go 语言,多看别人的源码,多加练习,多做项目即可,贵在坚持。
85 |
86 | #### 代码获取
87 |
88 | 本课程中的所有源码可以通过以下命令下载:
89 |
90 | ```bash
91 | wget https://labfile.oss-internal.aliyuncs.com/courses/11/Golang_Programming.zip
92 | ```
93 |
94 | #### 参考文档
95 |
96 | 本课程的文档部分参考了以下文档。
97 |
98 | - [Go 语言官方文档](http://golang.org/doc/)
99 | - [Go 入门指南](https://github.com/Unknwon/the-way-to-go_ZH_CN)
100 | - [Go web 编程](https://github.com/astaxie/build-web-application-with-golang/blob/master/LICENSE.md)
101 |
--------------------------------------------------------------------------------
/11-Go-语言简明教程-free/README.md:
--------------------------------------------------------------------------------
1 | # Go 语言简明教程
2 |
3 | Go 语言是来自 Google 的一门静态编译型语言,它拥有媲美 C 语言的强大性能。设计者赋予了它大道至简的设计理念,使它具有简洁、高效且灵活多变的特性。特别是在支持高并发的分布式集群系统中,Go 语言拥有得天独厚的优势。
4 |
5 | - 作者: [小码农](https://www.lanqiao.cn/users/20417/)
6 | - 链接: https://www.lanqiao.cn/courses/11
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/115-操作系统原理与实践-free/00-2704815-使用本课程上课说明.wd.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 说明
8 |
9 | **由于服务器资源有限,近期使用本课程上课老师较多,为避免学生同时开启环境,导致服务器超载,请各位使用本课程上课的老师认真阅读下列说明,做好资源扩容报备,以避免影响您的上课体验!**
10 |
11 | 院校老师上课需知:
12 |
13 | 为满足老师的授课需求,请使用此课程授课的老师,**至少提前一天**填写此登记表提前报备(**每次课前均要报备**),以便扩充课程资源!
14 |
15 | **如未提前登记直接开课,则可能出现资源满载学生无法开启环境的情况。**
16 |
17 |
18 | 开课登记表👉:https://lanqiao-product.feishu.cn/share/base/form/shrcni82J0ddxUPclYPnGYuuYvc (点击链接,填写表单进行报备)。
--------------------------------------------------------------------------------
/115-操作系统原理与实践-free/80-574-终端设备的控制.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 字符显示的控制
8 |
9 | ## 1. 课程说明
10 |
11 | 难度系数:★★☆☆☆
12 |
13 | 本实验是 [操作系统之外设与文件系统 - 网易云课堂](https://mooc.study.163.com/course/1000002009#/info) 的配套实验,推荐大家进行实验之前先学习相关课程:
14 |
15 | - L26 I/O 与显示器
16 | - L27 键盘
17 |
18 | > Tips:点击上方文字中的超链接或者输入 https://mooc.study.163.com/course/1000002009#/info 进入理论课程的学习。
19 | > 如果网易云上的课程无法查看,也可以看 Bilibili 上的 [操作系统哈尔滨工业大学李治军老师](https://www.bilibili.com/video/av17036347)。
20 |
21 | ## 2. 实验目的
22 |
23 | - 加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念;
24 | - 通过实践掌握 Linux 0.11 对键盘终端和显示器终端的处理过程。
25 |
26 | ## 3. 实验内容
27 |
28 | 本实验的基本内容是修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。
29 |
30 | 在初始状态,一切如常。用户按一次 F12 后,把应用程序向终端输出所有字母都替换为“\*”。用户再按一次 F12,又恢复正常。第三次按 F12,再进行输出替换。依此类推。
31 |
32 | 以 ls 命令为例:
33 |
34 | 正常情况:
35 |
36 | ```bash
37 | # ls
38 | hello.c hello.o hello
39 | ```
40 |
41 | 第一次按 F12,然后输入 ls:
42 |
43 | ```bash
44 | # **
45 | *****.* *****.* *****
46 | ```
47 |
48 | 第二次按 F12,然后输入 ls:
49 |
50 | ```bash
51 | # ls
52 | hello.c hello.o hello
53 | ```
54 |
55 | 第三次按 F12,然后输入 ls:
56 |
57 | ```bash
58 | # **
59 | *****.* *****.* *****
60 | ```
61 |
62 | ## 4. 实验报告
63 |
64 | 完成实验后,在实验报告中回答如下问题:
65 |
66 | - 在原始代码中,按下 F12,中断响应后,中断服务程序会调用 func?它实现的是什么功能?
67 | - 在你的实现中,是否把向文件输出的字符也过滤了?如果是,那么怎么能只过滤向终端输出的字符?如果不是,那么怎么能把向文件输出的字符也一并进行过滤?
68 |
69 | ## 5. 评分标准
70 |
71 | - F12 切换,40%
72 | - 输出字符隐藏,40%
73 | - 实验报告,20%
74 |
75 | ## 6. 实验提示
76 |
77 | 本实验需要修改 Linux 0.11 的终端设备处理代码(`kernel/chr_drv/console.c` 文件),对键盘输入和字符显示进行非常规的控制。
78 |
79 | ### 6.1 键盘输入处理过程
80 |
81 | 键盘 I/O 是典型的中断驱动,在 `kernel/chr_drv/console.c` 文件中:
82 |
83 | ```c
84 | void con_init(void) //控制台的初始化
85 | {
86 | // 键盘中断响应函数设为 keyboard_interrupt
87 | set_trap_gate(0x21, &keyboard_interrupt);
88 | }
89 | ```
90 |
91 | 所以每次按键有动作,keyboard_interrupt 函数就会被调用,它在文件 `kernel/chr_drv/keyboard.S`(注意,扩展名是大写的 S)中实现。
92 |
93 | 所有与键盘输入相关的功能都是在此文件中实现的,所以本实验的部分功能也可以在此文件中实现。
94 |
95 | 简单说,`keyboard_interrupt` 被调用后,会将键盘扫描码做为下标,调用数组 `key_table` 保存的与该按键对应的响应函数。
96 |
97 | ### 6.2 输出字符的控制
98 |
99 | `printf()` 等输出函数最终都是调用 `write()` 系统调用,所以控制好 `write()`,就能控制好输出字符。
100 |
--------------------------------------------------------------------------------
/12-MongoDB-基础教程-free/06-2789-挑战:管理员工的基本信息.tz.md:
--------------------------------------------------------------------------------
1 | ## 管理员工的基本信息
2 |
3 | ### 介绍
4 |
5 | 某公司随着员工人数的增加,现需要开发一个系统用于管理员工的基本信息,请你根据给出的要求帮他们设计并实现该系统的数据库。
6 |
7 | 公司员工的信息如下:
8 |
9 | 
10 |
11 | 注意服务器中的 MongoDB 服务还没有启动,需要先用 `sudo service mongodb start` 启动服务,然后以 `mongo` 命令进入 MongoDB shell 。
12 |
13 | ### 目标
14 |
15 | 1. MongoDB 服务处于运行状态;
16 | 2. 新建的数据库名称为 shiyanlou;
17 | 3. 在 shiyanlou 中新建集合 employee ,用于存储员工的基本信息;
18 | 4. 将上述表中的信息插入到集合 employee 中,包括: sid,sname,age,gender,phone,address,其中 address 以嵌入式关系进行存储,包括 city,district;
19 | 5. 员工 Tom 的电话换成了 18200753159,家从 jinniu 区 搬到了 chenghua 区,更新 Tom 的信息;
20 | 6. 在列**工号(sid)**和**姓名(sname)**上建立索引,加快查询速度。
21 |
22 | ### 提示
23 |
24 | - 工号为数值型
25 | - 更新子文档信息
26 | - 由于插入数据量太大,手动输入容易出错,可以拷贝参考答案中的插入数据进行操作
27 |
28 | ### 参考答案
29 |
30 | 创建数据库以及插入数据
31 |
32 | ```bash
33 | $ sudo service mongodb start
34 | $ mongo
35 | use shiyanlou
36 | db.employee.insert([{"sid":1001,"sname":"Tom","age":35,"gender":"male","phone":13981234567,"address":[{"city":"Chengdu","district":"jinniu"}]},{"sid":1002,"sname":"Jack","age":26,"gender":"male","phone":13981357913,"address":[{"city":"Chengdu","district":"wuhou"}]},{"sid":1003,"sname":"Rose","age":31,"gender":"female","phone":13980246802,"address":[{"city":"Chongqing","district":"jiangbei"}]},{"sid":1004,"sname":"Bob","age":29,"gender":"male","phone":13987654321,"address":[{"city":"Chongqing","district":"yuzhong"}]},{"sid":1005,"sname":"Gavin","age":24,"gender":"male","phone":13989753197,"address":[{"city":"Chengdu","district":"jinniu"}]},{"sid":1006,"sname":"Amy","age":27,"gender":"female","phone":13988642086,"address":[{"city":"Shanghai","district":"xuhui"}]},{"sid":1007,"sname":"Anne","age":23,"gender":"female","phone":18211237894,"address":[{"city":"Chengdu","district":"qingyang"}]},{"sid":1008,"sname":"John","age":33,"gender":"male","phone":18219638521,"address":[{"city":"Chongqing","district":"jiangbei"}]},{"sid":1009,"sname":"Tony","age":36,"gender":"male","phone":18211478523,"address":[{"city":"Chengdu","district":"jinniu"}]},{"sid":1010,"sname":"Betty","age":28,"gender":"female","phone":18218520369,"address":[{"city":"Beijing","district":"chaoyang"}]}])
37 | ```
38 |
39 | 接着上面的步骤,进行更新,导出等操作:
40 |
41 | ```bash
42 | > db.employee.update({"sname":"Tom"},{$set:{"phone":"18200753159"}})
43 | > db.employee.update({"sname":"Tom"},{$set:{"address.0.district":"chenghua"}})
44 |
45 | // 如果嵌入文档未加'[]'。即不是以数组的方式,则修改子文档的命令为 db.employee.update({"sname":"Tom"},{$set:{"address.district":"chenghua"}})
46 |
47 | > db.employee.ensureIndex({"sid":1,"sname":1})
48 | ```
49 |
--------------------------------------------------------------------------------
/12-MongoDB-基础教程-free/README.md:
--------------------------------------------------------------------------------
1 | # MongoDB 基础教程
2 |
3 | 目前 MongoDB 是 IT 行业非常流行的一种非关系型数据库(NoSQL),其灵活的数据存储方式备受当前 IT 从业人员的青睐。本课程是 MongoDB 基础教程,介绍了 MongoDB 基本的集合操作、高级查询以及索引与聚合。
4 |
5 | - 作者: [Edward](https://www.lanqiao.cn/users/20406/)
6 | - 链接: https://www.lanqiao.cn/courses/12
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/1230-Java-简明教程-free/13-11049-正则表达式.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 正则表达式
8 |
9 | ## 简介
10 |
11 | > 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE ),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
12 |
13 | Java 通过 `java.util.regex` 包支持正则表达式的的功能。
14 |
15 | #### 知识点
16 |
17 | - java.util.regex
18 |
19 | ## 匹配
20 |
21 | **这里只说明如何在 Java 中使用正则表达式,关于表达式的更多内容,请在实验楼搜索相关内容学习。**
22 |
23 | Java 使用正则表达式匹配非常简单,这里我们以匹配邮箱地址为例。在 `/home/project` 目录下新建一个源代码文件 `RegexDemo.java`。
24 |
25 | ```java
26 | import java.util.regex.Matcher;
27 | import java.util.regex.Pattern;
28 |
29 | public class RegexDemo {
30 | public static void main(String[] args) {
31 | // Pattern类 正则表达式的编译表示。
32 | Pattern pattern = Pattern.compile("^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$");
33 | String[] emails = {"shiyanlou@shiyanlou.com", "shiyanlou"};
34 | for (String email :
35 | emails) {
36 | //Matcher 通过解释Pattern对字符序列执行匹配操作的引擎
37 | Matcher matcher = pattern.matcher(email);
38 | System.out.println(email + "匹配结果:" + matcher.matches());
39 | }
40 | }
41 | }
42 | ```
43 |
44 | 编译运行:
45 |
46 | ```bash
47 | $ javac RegexDemo.java
48 | $ java RegexDemo
49 | shiyanlou@shiyanlou.com匹配结果:true
50 | shiyanlou匹配结果:false
51 | ```
52 |
53 | ```checker
54 | - name: 检查是否存在 RegexDemo
55 | script: |
56 | #!/bin/bash
57 | ls /home/project/RegexDemo.java
58 | error: |
59 | 没有找到 /home/project/RegexDemo.java 文件
60 | ```
61 |
62 | ## 练习题:正则表达式
63 |
64 | 在 `/home/project` 目录下新建一个源代码文件 `RegexTest.java`。你需要完成以下要求:
65 |
66 | - 从控制台输入一串字符串,使用正则表达式判断其是不是 11 位手机号码。
67 | - 如果是 11 位手机号码,输出 `true`,如果不是输出 `false`。
68 |
69 | 示例:
70 |
71 | ```bash
72 | 输入:
73 | 13408199578
74 | 输出:
75 | true
76 | ```
77 |
78 | ```checker
79 | - name: 检查是否存在 RegexTest
80 | script: |
81 | #!/bin/bash
82 | ls /home/project/RegexTest.java
83 | error: |
84 | 没有找到 /home/project/RegexTest.java 文件
85 | - name: 输出结果检测
86 | script: |
87 | #!/bin/bash
88 | javac /home/project/RegexTest.java -d . ;echo 13408199484 | java RegexTest | grep true
89 | error: |
90 | 输出结果错误
91 | timeout: 20
92 | ```
93 |
94 | ### 参考答案
95 |
96 | **注意:请务必先独立思考获得 PASS 之后再查看参考代码,直接拷贝代码收获不大**。
97 |
98 | ```java
99 | import java.util.Scanner;
100 | import java.util.regex.Matcher;
101 | import java.util.regex.Pattern;
102 |
103 | public class RegexTest {
104 | public static void main(String[] args) {
105 | Pattern pattern = Pattern.compile("^1([34578])\\d{9}$");
106 | Scanner in = new Scanner(System.in);
107 | String phone = in.nextLine();
108 | Matcher matcher = pattern.matcher(phone);
109 | System.out.println(matcher.matches());
110 | }
111 | }
112 | ```
113 |
114 | ## 总结
115 |
116 | 本节内容相对简单,仅说明了如何在 Java 中使用正则表达式。主要知识点为:
117 |
118 | - java.util.regex
119 |
120 | 到此,Java 语言编程基础我们就学完了。在学完基础知识之后,还请多勤加练习,多写代码巩固相关知识内容。
121 |
--------------------------------------------------------------------------------
/1230-Java-简明教程-free/README.md:
--------------------------------------------------------------------------------
1 | # Java 简明教程
2 |
3 | 本课程作为 Java 编程的入门内容,是每个 Java 初学者都必须掌握的基础知识。课程从常量与变量、运算符、流程控制、数组和方法等 Java 基础语法开始,层层递进,逐步带你认识了解如何通过 Java 实现面向对象的三大特征继承、封装,多态。同时,课程还会涉及 Java 中常用类、字符串、集合框架和异常处理的相关操作使用。
4 |
5 | - 作者: [Chamber](https://www.lanqiao.cn/users/441493/)
6 | - 链接: https://www.lanqiao.cn/courses/1230
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/1238-JavaScript-基础入门-free/README.md:
--------------------------------------------------------------------------------
1 | # JavaScript 基础入门
2 |
3 | 课程从什么是 JavaScript 开始,一步步讲解 JavaScript 基础语法、关键特性、JSON、WebAPI 等知识点。内容将会涉及网页窗口交互的方法以及通过 DOM 进行网页元素的相关操作。
4 |
5 | - 作者: [哦嗨哟 L](https://www.lanqiao.cn/users/897174/)
6 | - 链接: https://www.lanqiao.cn/courses/1238
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/1262-Vue.js-基础入门-free/README.md:
--------------------------------------------------------------------------------
1 | # Vue.js 基础入门
2 |
3 | 本课程是一门 Vue.js 的入门课程,介绍了 Vue 的安装和使用,带领大家学习 Vue 模板语法,核心指令,计算和侦听属性,条件和循环渲染元素,以及怎样去绑定元素 class 和 style,处理基础事件,Vue 组件开发等。
4 |
5 | - 作者: [linki](https://www.lanqiao.cn/users/940410/)
6 | - 链接: https://www.lanqiao.cn/courses/1262
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/1265-Python-实现常见数据结构-free/README.md:
--------------------------------------------------------------------------------
1 | # Python 实现常见数据结构
2 |
3 | 使用 Python 实现各种算法,主要知识点包括数据结构,哈希,数学算法,线性代数,搜索算法,排序算法,字符串。
4 |
5 | - 作者: [寒冰团长](https://www.lanqiao.cn/users/890547/)
6 | - 链接: https://www.lanqiao.cn/courses/1265
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/1330-Python-新手入门课-free/03-11071-创建代码文件.tz.md:
--------------------------------------------------------------------------------
1 | # 挑战:创建代码文件
2 |
3 | ## 介绍
4 |
5 | 在这个挑战中,你需要在指定的目录下创建一个代码文件,然后拷贝到指定的目录。
6 |
7 | 挑战全程在 Xfce 终端中操作,忘记命令时可以翻阅上节的笔记,这是你的第一个挑战,加油!
8 |
9 | ## 目标
10 |
11 | 1. 请在 `/home/shiyanlou` 目录下创建 `shiyanlou.py` 文件。
12 | 2. 在文件中输入以下内容:
13 |
14 | ```python
15 | print('hello shiyanlou')
16 | ```
17 |
18 | 3. 进入 `Code` 目录,新建名为 `test` 的目录,然后将刚创建的 `/home/shiyanlou/shiyanlou.py` 文件复制到目录 `/home/shiyanlou/Code/test` 中。
19 |
20 | ## 提示语
21 |
22 | 1. `touch` 创建文件
23 | 2. 可使用 `Sublime、gedit、Vim` 等编辑器
24 | 3. `mkdir` 创建目录
25 | 4. `cd ~` 返回 `home` 目录
26 | 5. `cp` 复制
27 | 6. 使用 `Sublime` 写入代码后,注意保存的位置。
28 |
29 | 
30 |
31 | **请务必注意文件的路径,确保文件路径为 `/home/shiyanlou/shiyanlou.py` 和 `/home/shiyanlou/Code/test/shiyanlou.py`。可使用 `pwd` 命令自查,否则将无法通过检测。**
32 |
33 | ## 知识点
34 |
35 | - Linux 目录结构
36 | - Linux 文件操作
37 | - cp 命令
38 | - mkdir 命令
39 |
--------------------------------------------------------------------------------
/1330-Python-新手入门课-free/06-11076-逢 7 就跳过.tz.md:
--------------------------------------------------------------------------------
1 | # 挑战:逢 7 就跳过
2 |
3 | ## 介绍
4 |
5 | 不知道你有没有玩过“逢 7 过”的游戏,游戏规则很简单:
6 |
7 | 几个人轮流报数,凡遇到 7 的倍数,或含 7 的数字就要跳过,否则就算失败。
8 |
9 | 今天我们就用 Python 来打印 1 到 100 之间,所有满足条件的数字。
10 |
11 | 
12 |
13 | ## 目标
14 |
15 | 1. 请在 `/home/shiyanlou` 目录下创建 `jump7.py` 文件(请确保目录正确,否则无法通过挑战)
16 | 2. 在文件中写入代码,打印 1 到 100 之间(包含 1 和 100),不是 7 的倍数、且不含 7 的数字,每行打印一个数字。
17 | 3. 完成挑战后,请把文件复制到 `/home/shiyanlou/Code` 目录内,然后点击右侧工具栏的「 下载代码 」,把代码下载到本地, **我们在下个挑战中还会用到这段代码**。
18 |
19 | ## 知识点
20 |
21 | - Python 开发环境
22 | - int 类型
23 | - 变量
24 | - 运算符
25 | - while 循环
26 | - 条件判断
27 |
28 | ## 提示
29 |
30 | **⚠️ 前方高能,有剧透风险,喜欢挑战的同学请先独立思考,然后借着百度、谷歌来解出题目。**
31 |
32 | 在实际的开发工作中,大部分工作也是靠着经验 + 思考 + 搜索引擎来完成的,你可以提前熟悉这个感觉。
33 |
34 | #### 💡(一)
35 |
36 | 开发中,我们经常要先构思框架,再优化功能。
37 |
38 | 所以在这个挑战中,你可以先用循环,写出打印出 1 到 100 间的数字的程序,之后再往里面加条件判断。
39 |
40 | #### 💡(二)
41 |
42 | 7 的倍数,可以理解为除以 7 余数为 0 的数;
43 |
44 | ```python
45 | a % 7 == 0
46 | ```
47 |
48 | 在 1 到 100 这个区间里:
49 |
50 | - 个位上是 7 的数,即除以 10 余 7 的数;
51 |
52 | ```python
53 | a % 10 == 7
54 | ```
55 |
56 | - 十位上是 7 的数,即除以 10 取整数为 7 的数。
57 |
58 | ```python
59 | a // 10 == 7
60 | ```
61 |
62 | 如果满足这些条件,就跳过;如不满足,则打印。可以用 `elif` 或 `or` 来加判定条件~
63 |
64 | #### 💡(三)
65 |
66 | **请保证文件名和存储路径都满足题目要求。**
67 |
68 | PS:还记得我们在第一节实验中,体验过的那个对战小游戏吗?其实你现在已经可以把那个游戏编写出来了!完成挑战后,不妨尝试一下~如果有什么问题,记得在群里和小伙伴们讨论一下。
69 |
70 |
71 | 参考答案
72 | 使用 while:
73 |
74 | a = 0
75 | while a < 100:
76 | a = a + 1
77 | if a % 7 == 0 or a % 10 == 7 or a // 10 == 7:
78 | continue
79 | else:
80 | print(a)
81 |
82 | 使用 for:
83 |
84 | for a in range(1,101):
85 | if a % 7 == 0 or a % 10 == 7 or a // 10 == 7:
86 | continue
87 | else:
88 | print(a)
89 |
90 |
91 |
--------------------------------------------------------------------------------
/1330-Python-新手入门课-free/08-11102-最终挑战:提交代码.tz.md:
--------------------------------------------------------------------------------
1 | # 挑战:提交我的代码
2 |
3 | ## 介绍
4 |
5 | 我们已经有了 Github 账号,现在需要你能新建一个仓库,并向仓库中提交上一个挑战的代码。你需要完整地执行一次对 GitHub 仓库的创建、克隆、提交、推送操作。
6 |
7 | ## 目标
8 |
9 | 1. 在自己电脑中的浏览器上打开 GitHub 页面,登录账号后创建 `shiyanlou-code` 仓库。
10 | 2. 在实验环境中,克隆你的仓库到 `/home/shiyanlou/Code` 目录下。
11 | 3. 进入 `cd /home/shiyanlou/Code/shiyanlou-code` 中,新建 `jump7.py` 文件,并把你上个挑战的通过代码,复制进文件中保存。
12 | 4. 将全部修改添加到暂存区、创建提交、推送到自己的 GitHub 远程 `shiyanlou-code` 仓库
13 | 5. 本挑战没有标准答案,完成整个上传仓库的流程即可。
14 |
15 | ## 提示语
16 |
17 | 1. `git clone https://github.com/你的Github账号/仓库名称` 克隆仓库
18 | 2. 用右侧工具栏的「剪切板」,可以复制代码。
19 | 3. `git add .` 添加修改到暂存区
20 | 4. `git commit -m 备注信息` 创建新的提交版本
21 | 5. `git push` 将提交推送到远程仓库
22 |
23 | ## 知识点
24 |
25 | - Github 操作
26 | - git clone
27 | - git add
28 | - git commit
29 | - git push
30 |
--------------------------------------------------------------------------------
/1330-Python-新手入门课-free/README.md:
--------------------------------------------------------------------------------
1 | # Python 新手入门课
2 |
3 | 极度舒适的新手入门课程,面向完全没有编程基础的同学。你将在一下午入门 Linux、Python 基础和 Github 常用命令,为未来的编程大楼打下稳固的基础。
4 |
5 | - 作者: [实小楼](https://www.lanqiao.cn/users/8504/)
6 | - 链接: https://www.lanqiao.cn/courses/1330
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/1403-Linux-运维新手入门课-free/02-12916-挑战:创建代码文件.tz.md:
--------------------------------------------------------------------------------
1 | # 挑战:创建代码文件
2 |
3 | ## 介绍
4 |
5 | 在这个挑战中,你需要在指定的目录下创建一个代码文件,然后拷贝到指定的目录。
6 |
7 | 挑战全程在 Xfce 终端中操作,忘记命令时可以翻阅上节的笔记,遇到问题时请在微信答疑群里 **@助教**,我们会帮助你解决问题。
8 |
9 | ## 目标
10 |
11 | 1. 请在 `/home/shiyanlou` 目录下创建 `shiyanlou.py` 文件
12 | 2. 在文件中输入以下内容:
13 |
14 | ```python
15 | print('hello shiyanlou')
16 | ```
17 |
18 | 3. 进入 `Code` 目录,新建名为 `test` 的目录,然后将 `shiyanlou.py` 复制到目录 `/home/shiyanlou/Code/test` 中
19 |
20 | ## 提示语
21 |
22 | 1. `touch` 创建文件
23 | 2. 可使用 `Sublime、gedit、Vim` 等编辑器
24 | 3. `mkdir` 创建目录
25 | 4. `cd ~` 返回 `home` 目录
26 | 5. `cp` 复制
27 | 6. 使用 `Sublime` 写入代码后,注意保存的位置。
28 |
29 | 
30 |
31 | ## 知识点
32 |
33 | - Linux 目录结构
34 | - Linux 文件操作
35 | - cp 命令
36 | - mkdir 命令
37 |
--------------------------------------------------------------------------------
/1403-Linux-运维新手入门课-free/04-12918-挑战:让实验楼网站恢复访问.tz.md:
--------------------------------------------------------------------------------
1 | # 挑战:让实验楼网站恢复访问
2 |
3 | ## 介绍
4 |
5 | 小楼这次闯下大祸,不小心把线上的实验楼网站搞挂了。实验楼的网站使用的是 nginx 服务,目前无法启动。
6 |
7 | 右边给你的是实验楼的服务器,请尝试在最短的时间内让实验楼恢复访问。你所节省的每一分钟,都能挽留上百名实验楼的用户。
8 |
9 | **注意**:实验楼网站页面目录为 `/home/shiyanlou/page`。
10 |
11 | ## 目标
12 |
13 | 恢复访问的要求如下:
14 |
15 | 1. Nginx 服务处于运行状态
16 | 2. 在实验环境中使用 Firefox 浏览器访问本地 `http://localhost` 可以进入实验楼的主页,如下图:
17 |
18 | 
19 |
20 | 实验环境的桌面如果没有 Firefox 图标,可以在下图所示的位置找到打开的入口:
21 |
22 | 
23 |
24 | ## 提示
25 |
26 | 要注意,环境中的 Apache 可能会导致 Nginx 启动失败,可以执行 `sudo service apache2 stop` 来停止它。
27 |
28 | 如果启动失败,可以使用 `sudo nginx -t` 来排查配置文件的错误哟 ~
29 |
30 | 赶紧启动 Nginx 吧!
31 |
32 | ## 知识点
33 |
34 | 1. nginx 服务配置
35 | 2. nginx 日志分析
36 |
--------------------------------------------------------------------------------
/1403-Linux-运维新手入门课-free/README.md:
--------------------------------------------------------------------------------
1 | # Linux 运维新手入门课
2 |
3 | Linux 运维的新手入门课程,面向完全没有 Linux 基础的同学。你将在一下午入门 Linux、Nginx 基础和 Zabbix 监控系统,为未来的 Linux 服务器运维工作打下基础。
4 |
5 | - 作者: [实小楼](https://www.lanqiao.cn/users/8504/)
6 | - 链接: https://www.lanqiao.cn/courses/1403
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/144-HTML-实现扫雷游戏-free/README.md:
--------------------------------------------------------------------------------
1 | # HTML 实现扫雷游戏
2 |
3 | 本课程带领大家实现经典小游戏扫雷,你可以通过实践 JavaScript 和 CSS 等基本的 Web 开发知识,学习如何对游戏中的对象进行抽象和封装。
4 |
5 | - 作者: [atwal](https://www.lanqiao.cn/users/21657/)
6 | - 链接: https://www.lanqiao.cn/courses/144
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/1485-Julia-简明教程-free/07-16802-按照要求打印学生信息.tz.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: false
5 | ---
6 |
7 | # 挑战:按照要求打印学生信息
8 |
9 | ## 介绍
10 |
11 | 我们已经学习了很多 Julia 的基本语法,现在完成这个挑战巩固一下其中的一些知识点。
12 |
13 | 首先根据「实验 1」中的方法安装 Julia ,打开终端命令行切换到 Code 目录下:
14 |
15 | ```bash
16 | $ cd ~/Code
17 | ```
18 |
19 | 执行如下命令安装:
20 |
21 | ```bash
22 | wget https://labfile.oss-internal.aliyuncs.com/courses/1485/julia-1.3.1-linux-x86_64.tar.gz
23 | tar xzvf julia-1.3.1-linux-x86_64.tar.gz
24 | cd /usr/bin
25 | sudo ln -s /home/shiyanlou/Code/julia-1.3.1/bin/julia julia
26 | cd -
27 | ```
28 |
29 | 如上所示,最后一个命令回到 /home/shiyanlou/Code 目录下,然后创建 test.jl 文件:
30 |
31 | ```bash
32 | $ touch test.jl
33 | ```
34 |
35 | 已知一个学生的信息保存在字典中,包括 name 、age 、height 、score 、school 等信息,现在要将它们按照这样的格式打印出来:
36 |
37 | ```bash
38 | NAME: 小明
39 | HEIGHT: 130
40 | SCORE: 89
41 | SCHOOL: No.1 Middle School
42 | AGE: 12
43 | ```
44 |
45 | 已知文件内容如下,可以将其复制到实验环境中:
46 |
47 | ```julia
48 | student = Dict("name" => "小明", "age" => 12, "score" => 89,
49 | "height" => 130, "school" => "No.1 Middle School")
50 |
51 | function print_info(stu)
52 | # TODO
53 | end
54 |
55 | print_info(student)
56 | ```
57 |
58 | 如上所示,需要在 test.jl 文件中定义一个函数 print_info ,最后调用函数打印 student 字典中的信息,注意 key 要全大写。
59 |
60 | 完成代码后,在命令行执行 `julia test.jl` 命令:
61 |
62 | 
63 |
64 | #### 知识点
65 |
66 | - for 循环
67 | - Dict 数据类型
68 | - \$ 格式化打印
69 | - 函数的定义
70 | - uppercase 函数的使用
71 |
72 | 点击下一页查看参考答案。
73 |
74 | ## 参考代码
75 |
76 | 注意:文件要放到指定目录下,文件名要拼写正确
77 |
78 | ```julia
79 | student = Dict("name" => "小明", "age" => 12, "score" => 89,
80 | "height" => 130, "school" => "No.1 Middle School")
81 |
82 | function print_info(stu)
83 | for (key, value) in student
84 | println("$(uppercase(key)): $value")
85 | end
86 | end
87 |
88 | print_info(student)
89 | ```
90 |
--------------------------------------------------------------------------------
/1485-Julia-简明教程-free/README.md:
--------------------------------------------------------------------------------
1 | # Julia 简明教程
2 |
3 | 本课程作为 Julia 这门编程语言的入门教程,旨在介绍其基础语法,希望大家能够通过本课程的学习,熟练掌握 Julia 的语法风格和编程习惯。
4 |
5 | - 作者: [幺幺哒](https://www.lanqiao.cn/users/310176/)
6 | - 链接: https://www.lanqiao.cn/courses/1485
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/1499-通过例子学-Rust-free/07-16551-表达式.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 表达式
8 |
9 | ## 实验介绍
10 |
11 | 本节实验通过一个简短的示例介绍下 Rust 的表达式,包括代码块、语句、左值、右值等基本概念。
12 |
13 | #### 知识点
14 |
15 | 本节实验的主要内容包括以下知识点:
16 |
17 | - 表达式
18 | - 代码块
19 | - 左值
20 | - 右值
21 |
22 | #### 安装环境
23 |
24 | 在实验开始之前,我们首先需要安装 rust 开发环境,
25 |
26 | ```bash
27 | sudo apt update
28 | sudo apt install rustc -y
29 | ```
30 |
31 | 
32 |
33 | 安装完成后可以通过 `rustc --version` 验证。
34 |
35 | 
36 |
37 | ## 语句构成
38 |
39 | Rust 程序(大部分)由一系列语句构成:
40 |
41 | ```rust
42 | fn main() {
43 | // 语句
44 | // 语句
45 | // 语句
46 | }
47 | ```
48 |
49 | Rust 有多种语句。最普遍的语句类型有两种:一种是绑定变量,另一种是表达式带上分号:
50 |
51 | ```rust
52 | fn main() {
53 | // 变量绑定
54 | let x = 5;
55 |
56 | // 表达式;
57 | x;
58 | x + 1;
59 | 15;
60 | }
61 | ```
62 |
63 | 代码块也是表达式,所以它们在赋值操作中可以充当右值(r-values)。代码块中的最后一条
64 | 表达式将赋给左值(l-value)。需要注意的是,如果代码块最后一条表达式结尾处有分号,那
65 | 么返回值将变成 `()`。
66 |
67 | > 译注:代码块中的最后一条语句是代码块中**实际执行**的最后一条语句,而不一定是代码块中最后一行的语句。
68 |
69 | ```rust
70 | fn main() {
71 | let x = 5u32;
72 |
73 | let y = {
74 | let x_squared = x * x;
75 | let x_cube = x_squared * x;
76 |
77 | // 将此表达式赋给 `y`
78 | x_cube + x_squared + x
79 | };
80 |
81 | let z = {
82 | // 分号结束了这个表达式,于是将 `()` 赋给 `z`
83 | 2 * x;
84 | };
85 |
86 | println!("x is {:?}", x);
87 | println!("y is {:?}", y);
88 | println!("z is {:?}", z);
89 | }
90 | ```
91 |
92 | ## 实验总结
93 |
94 | 本节实验通过一个简短的示例学习了 Rust 的表达式。
95 |
96 | 请务必按照实验步骤将示例代码在实验环境中完整输入一遍,并完成动手练习题目。只有真正动手去做才会有最大的收获,遇到问题欢迎在 [实验楼讨论区](https://www.shiyanlou.com/questions/) 中发帖与同学讨论交流。
97 |
--------------------------------------------------------------------------------
/1499-通过例子学-Rust-free/11-16555-crate.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # crate
8 |
9 | ## 实验介绍
10 |
11 | crate(中文有 “包,包装箱” 之意)是 Rust 的编译单元。当调用 `rustc some_file.rs` 时,`some_file.rs` 被当作 **crate 文件**。如果 `some_file.rs` 里面含有 `mod` 声明,那么模块文件的内容将在编译之前被插入 crate 文件的相应声明处。换句话说,模块**不会**单独被编译,只有 crate 才会被编译。
12 |
13 | #### 知识点
14 |
15 | 本节实验的主要内容包括以下知识点:
16 |
17 | - `crate` 概念
18 | - 创建方式
19 | - `extern crate`
20 |
21 | #### 安装环境
22 |
23 | 在实验开始之前,我们首先需要安装 rust 开发环境,
24 |
25 | ```bash
26 | sudo apt update
27 | sudo apt install rustc -y
28 | ```
29 |
30 | 
31 |
32 | 安装完成后可以通过 `rustc --version` 验证。
33 |
34 | 
35 |
36 | ## `crate` 概念
37 |
38 | crate(中文有 “包,包装箱” 之意)是 Rust 的编译单元。当调用 `rustc some_file.rs` 时,`some_file.rs` 被当作 **crate 文件**。如果 `some_file.rs` 里面含有 `mod` 声明,那么模块文件的内容将在编译之前被插入 crate 文件的相应声明处。换句话说,模块**不会**单独被编译,只有 crate 才会被编译。
39 |
40 | crate 可以编译成二进制可执行文件(binary)或库文件(library)。默认情况下,`rustc` 将从 crate 产生二进制可执行文件。这种行为可以通过 `rustc` 的选项 `--crate-type` 重载。
41 |
42 | ## 创建方式
43 |
44 | 让我们创建一个库,然后看看如何把它链接到另一个 crate。
45 |
46 | 新建 `rary.rs` 文件,编写代码如下:
47 |
48 | ```rust
49 | pub fn public_function() {
50 | println!("called rary's `public_function()`");
51 | }
52 |
53 | fn private_function() {
54 | println!("called rary's `private_function()`");
55 | }
56 |
57 | pub fn indirect_access() {
58 | print!("called rary's `indirect_access()`, that\n> ");
59 |
60 | private_function();
61 | }
62 | ```
63 |
64 | 在实验楼 WebIDE 终端中执行以下命令:
65 |
66 | ```bash
67 | $ rustc --crate-type=lib rary.rs
68 | ```
69 |
70 | 执行的结果如下所示:
71 |
72 | 
73 |
74 | 默认情况下,库会使用 crate 文件的名字,前面加上 “lib” 前缀,但这个默认名称可以使用 `crate_name` 属性覆盖。
75 |
76 | ## `extern crate`
77 |
78 | 要把上一节创建的库链接到一个 crate,必须使用 `extern crate` 声明。这不仅会链接库,还会用一个与库名相同的模块来存放库里面的所有项。于模块的可见性规则也适用于库。
79 |
80 | ```rust
81 | // 链接到 `rary` 库,导入其中的项
82 | extern crate rary;
83 |
84 | fn main() {
85 | rary::public_function();
86 |
87 | // 报错! `private_function` 是私有的
88 | //rary::private_function();
89 |
90 | rary::indirect_access();
91 | }
92 | ```
93 |
94 | 在实验楼 WebIDE 终端中执行以下命令:
95 |
96 | ```bash
97 | # library.rlib 是已编译好的库的路径,这里假设它在同一目录下:
98 | $ rustc executable.rs --extern rary=./library.rlib && ./executable
99 | ```
100 |
101 | 执行的结果如下:
102 |
103 | 
104 |
105 | ## 实验总结
106 |
107 | 本节实验中我们学习了以下的内容:
108 |
109 | - `crate` 概念
110 | - 创建方式
111 | - `extern crate`
112 |
113 | 请务必按照实验步骤将示例代码在实验环境中完整输入一遍,并完成动手练习题目。只有真正动手去做才会有最大的收获,遇到问题欢迎在 [实验楼讨论区](https://www.shiyanlou.com/questions/) 中发帖与同学讨论交流。
114 |
--------------------------------------------------------------------------------
/1499-通过例子学-Rust-free/README.md:
--------------------------------------------------------------------------------
1 | # 通过例子学 Rust
2 |
3 | Rust 是一门注重安全(Safety)、速度(Speed)和并发(Concurrency)的现代系统编程语言。Rust 通过内存安全来实现以上目标,但不用垃圾回收机制。《通过例子学 Rust》由一系列可运行的实例组成,通过这些例子阐明了各种 Rust 的概念和基本库。
4 |
5 | - 作者: [云课管理员](https://www.lanqiao.cn/users/1735818/)
6 | - 链接: https://www.lanqiao.cn/courses/1499
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/2-Vim-基础入门-free/README.md:
--------------------------------------------------------------------------------
1 | # Vim 基础入门
2 |
3 | 本课程将带大家学习使用强大的 Vim 编辑器。Vim 是从 vi 发展出来的一个文本编辑器,在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。适合所有想要学习编程和想要在蓝桥云课学习的人。
4 |
5 | - 作者: [Edward](https://www.lanqiao.cn/users/20406/)
6 | - 链接: https://www.lanqiao.cn/courses/2
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/2023-TypeScript-基础入门-free/03-29202-接口.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 接口(Inferfaces)
8 |
9 | ## 简介
10 |
11 | 在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型。接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法。
12 |
13 | #### 知识点
14 |
15 | - 接口的基本概念
16 | - 可选属性
17 | - 任意属性
18 | - 只读属性
19 |
20 | ## 接口的基本概念
21 |
22 | 在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型,在面向对象编程中接口都是比较常见且重要的概念。
23 |
24 | **接口的作用:**
25 |
26 | 1. 对类的一部分行为进行抽象(类的部分后续会讲到)
27 | 2. 描述对象的形状
28 |
29 | ```ts
30 | interface Person {
31 | name: string;
32 | age: number;
33 | }
34 |
35 | let tom: Person = {
36 | name: "tom",
37 | age: 18,
38 | };
39 | ```
40 |
41 | 上面的例子中,我们定义了一个接口 `Person`,接着定义了一个变量 `tom`,它的类型是 `Person`。这样,我们就约束了 `tom` 的形状必须和接口 `Person` 一致。
42 |
43 | **注意:**
44 |
45 | 接口一般首字母大写,也可以在接口之前加大写 `I` ,赋值的时候,变量的形状必须和接口的形状保持一致。不允许添加未定义的属性。
46 |
47 | ## 可选属性
48 |
49 | 有时我们希望不要完全匹配一个形状,那么可以用可选属性。
50 |
51 | ```ts
52 | interface Person {
53 | name: string;
54 | age?: number;
55 | }
56 |
57 | let tom: Person = {
58 | name: "Tom",
59 | };
60 | ```
61 |
62 | 
63 |
64 | 在属性后使用 `?` 表示这个属性是可选属性,可选属性的含义是该属性可以不存在,但是仍然不允许添加未定义的属性。
65 |
66 | ## 任意属性
67 |
68 | 有时候我们希望一个接口允许有任意的属性,可以使用如下方式。
69 |
70 | ```ts
71 | interface Person {
72 | name: string;
73 | age?: number;
74 | [propName: string]: any;
75 | }
76 |
77 | let tom: Person = {
78 | name: "Tom",
79 | gender: "male",
80 | };
81 | ```
82 |
83 | 
84 |
85 | 使用 `[propName: string]` 定义了任意属性取 `string` 类型的值。
86 |
87 | ## 只读属性
88 |
89 | 有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用 `readonly` 定义只读属性:
90 |
91 | ```ts
92 | interface Person {
93 | readonly id: number;
94 | name: string;
95 | age?: number;
96 | [propName: string]: any;
97 | }
98 |
99 | let tom: Person = {
100 | id: 123,
101 | name: "Tom",
102 | gender: "male",
103 | };
104 | ```
105 |
106 | 
107 |
108 | 如果使用 `readonly` 定义的属性 `id` 初始化后,又被赋值了,那么就会报错了:
109 |
110 | 
111 |
112 | ## 总结
113 |
114 | 本实验我们学习了以下内容:
115 |
116 | - 接口的基本概念
117 | - 可选属性
118 | - 任意属性
119 | - 只读属性
120 |
121 | 希望各位学员能够多动手敲代码,才能更熟悉。
122 |
--------------------------------------------------------------------------------
/2023-TypeScript-基础入门-free/README.md:
--------------------------------------------------------------------------------
1 | # TypeScript 基础入门
2 |
3 | 本课程是 TypeScript 基础入门课程。课程从什么是 TypeScript 开始,一步步讲解到基本数据类型、接口、类、函数、模块、命名空间等知识点。
4 |
5 | - 作者: [Sny](https://www.lanqiao.cn/users/1226977/)
6 | - 链接: https://www.lanqiao.cn/courses/2023
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/22-jQuery-基础入门-free/README.md:
--------------------------------------------------------------------------------
1 | # jQuery 基础入门
2 |
3 | jQuery 是一个优秀的轻量级 Javascript 库,兼容 CSS3,还兼容各种浏览器,在 Web 前端开发中广泛使用。课程将从 jQuery 基础入手,我们会学习到 jQuery 的具有鲜明特征的用法,例如 jQuery 选择器、jQuery 的事件和动画等,最终达到熟练掌握 jQuery 的目的。
4 |
5 | - 作者: [Christian](https://www.lanqiao.cn/users/20407/)
6 | - 链接: https://www.lanqiao.cn/courses/22
7 |
8 | 
9 |
--------------------------------------------------------------------------------
/23-PHP-编程入门-free/01-189-PHP简介.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # PHP 简介
8 |
9 | ## 实验介绍
10 |
11 | 本节介绍了什么是 PHP 和 PHP 的应用,然后介绍如何运行 PHP 文件。
12 |
13 | #### 实验知识点
14 |
15 | - PHP 基础知识
16 |
17 | #### 实验环境
18 |
19 | - PHP 7.4
20 |
21 | ## 实验步骤
22 |
23 | - PHP 是什么
24 | - PHP 能做什么
25 | - PHP 如何运行
26 |
27 | ### PHP 是什么
28 |
29 | PHP(全称 Hypertext Preprocessor,超文本预处理器的字母缩写)是一种服务器端脚本语言,它可嵌入到 HTML 中,尤其适合 WEB 开发。
30 |
31 | 一个简单的 PHP 文件示例
32 |
33 | ```php
34 |
35 |
36 | Example
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | ```
46 |
47 | 其中被 `` 包围的内容即是 PHP 程序,在装了 PHP 解释器的服务端运行该文件时,PHP 程序能够被解析到 HTML 页面中,上例中结果为
48 |
49 | ```html
50 |
51 |
52 | Example
53 |
54 |
55 |
56 | Hello ShiYanLou!
57 |
58 |
59 | ```
60 |
61 | ### PHP 能做什么
62 |
63 | - **服务端脚本**。这是 PHP 最传统,也是最主要的目标领域。需要具备以下三点:PHP 解析器(CGI 或者服务器模块),WEB 服务器(如 Nginx,Apache)和浏览器。
64 |
65 | - **命令行脚本**。可以编写一段 PHP 脚本,并且不需要任何服务器或者浏览器来运行它,仅需要 PHP 解析器来执行。
66 |
67 | - **桌面应用程序**。桌面应用程序可以通过 PHP 高级特性 PHP-GTK 来编写。PHP-GTK 是 PHP 的一个扩展,在通常发布的 PHP 包中并不包含它。
68 |
69 | ### PHP 如何运行
70 |
71 | - 命令行脚本文件
72 |
73 | 在目录 `/home/project` 创建 hello.php,并编辑内容
74 |
75 | ```php
76 | $a = 'Hello World';
116 | php > echo $a;
117 | Hello World
118 | ```
119 |
120 | - 直接运行代码
121 |
122 | ```bash
123 | php -r "echo 'Hello World!';"
124 | Hello World
125 | ```
126 |
127 | - 服务器端
128 | - cgi,如 Nginx 的 fast-cgi。
129 | - 模块,如 Apache 的 mod_php。
130 |
131 | 在开发和测试阶段还可以使用 PHP 内置服务器
132 |
133 | ```bash
134 | cd /home/project
135 | php -S localhost:8080
136 | ```
137 |
138 | 端口号 8080 可以自定义
139 |
140 | 浏览器输入 http://localhost:8080/hello.php
141 |
142 | ```html
143 | Hello World
144 | ```
145 |
146 | ```checker
147 | - name: 检查是否创建hello.php
148 | script: |
149 | #!/bin/bash
150 | ls -l /home/project/hello.php
151 | error: |
152 | 我们发现您还没有编辑 hello.php
153 | ```
154 |
155 | ## 课后习题
156 |
157 | 请编写一个 PHP 脚本,在命令行输出
158 |
159 | ```bash
160 | hello shiyanlou
161 | ```
162 |
163 | ## 参考文档
164 |
165 | 本实验课程基于《PHP 参考手册》中文版本制作,可查看原版链接:http://php.net/manual/zh/
166 |
--------------------------------------------------------------------------------
/23-PHP-编程入门-free/02-190-基本语法.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # PHP 基本语法
8 |
9 | ## 实验介绍
10 |
11 | 本节介绍了 PHP 标记,指令分隔符和注释
12 |
13 | #### 实验知识点
14 |
15 | - PHP 标记
16 | - 从 HTML 中分离
17 | - 指令分隔符
18 | - 注释
19 |
20 | #### 实验环境
21 |
22 | - PHP 7.4
23 |
24 | ## 实验步骤
25 |
26 | - PHP 标记
27 | - 从 HTML 中分离
28 | - 指令分隔符
29 | - 注释
30 |
31 | ### PHP 标记
32 |
33 | 通常 PHP 标记为 ``,输出内容可使用短格式 `` 和 `?>`。所有这些标签内的部分都会被 PHP 解析器解析。
34 |
35 | 如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白。
36 |
37 | ```php
38 | `
45 |
46 | 在 PHP5.4 以后短标签无需任何设置,都是合法标签。
47 |
48 | ```php
49 | ="Hello Wolrd"?>
50 | ```
51 |
52 | 注意:在 PHP7 中以下两个标记方式已经不再适用
53 |
54 | - ``
55 | - `<%` 和 `%>`
56 |
57 | ### 从 HTML 中分离
58 |
59 | 通常情况下可以使用 `echo` 输出 HTML 页面
60 |
61 | 编辑 `/home/project/html.php`
62 |
63 | ```php
64 |
69 |
70 |
71 | This is a paragraph
72 |
73 |
74 |