浅尝辄止

理论是灰色的,而生命之树常青。这里是@Dilettante258 的个人博客,用于记载和分享学习。

现邮科协第11周授课

Dilettante258's avatar
| 0 views

想要成为一个合格的程序员必须要掌握 GitHub 的用法。

这是我的Github 主页,接下来我将以一些仓库为例,讲解一些必须得了解的知识。

Github

GitHub是一个面向开发者的基于互联网的代码托管平台。它提供了一个集中式的位置,供开发者存储、管理和协作开发他们的软件项目。GitHub的主要功能和特点有:

  1. 代码托管:开发者可以将他们的代码存储在GitHub上,这使得代码的版本控制和备份变得非常方便。GitHub支持Git,一个分布式版本控制系统,这使得开发者可以轻松跟踪代码的变化和协同工作。
  2. 协作和社交:GitHub为开发者提供了一系列的协作工具,如问题跟踪、合并请求、讨论区、代码审查等。这使得多人团队能够更容易地协同开发项目,并与其他开发者交流。
  3. 开源社区:GitHub是一个开源社区的中心,许多开源项目都托管在GitHub上。开发者可以浏览和贡献开源项目,从中学习,也可以分享自己的开源项目。
  4. 部署和持续集成:GitHub提供了集成的部署和持续集成工具,可以帮助开发者自动化构建、测试和部署他们的应用程序。
  5. 项目管理:GitHub还提供了项目管理工具,如项目面板、任务列表、里程碑等,帮助开发者更好地组织和跟踪项目的进展。

代码托管

Github相当于一个面向的代码的云盘,在上面不仅仅可以储存代码,还能记录你的提交/修改历史。

这是我的博客Commits记录,下面贴出我的一次Commit。

image-20231107110344087

可以看见,在上面红框框中的区域中,用颜色标记了哪些行有修改,以及具体修改是什么。左边的那一栏列出了这一次Commit里提交、修改、删除了哪些文件。

协作和社交

这里我们以OpenAI的SpinningUp为例,它是由OpenAI制作的教育资源,使大家可以更容易地学习深度强化学习。

Issues

首先看到Issues。Issues是GitHub上的一种功能,用于跟踪项目的问题、错误、建议和任务。它允许开发者和团队成员创建问题,分配责任人(Assignee),添加标签(Label),设置里程碑(Milestones),以便更好地组织和管理项目。

这里我们简单了解一下。打开它的Issues区。Issues一般被分为两类:Open / Closed。Open就是还没有解决的,Closed就是已经解决并关闭的。当你们开始做科研或者做项目时,假如用到了别人的一些开源代码、资源,遇到问题时,就可以留下一个Issue来请求帮助。

image-20231107112317603

Issues也可以当作一个讨论区在其中中进行评论,提供反馈和建议,以促进协作和问题解决。今年我就提供了两个Issues。

Pull Requests

**Pull Requests(合并请求)**是一种协作功能,用于将代码的更改合并到项目的主分支或其他分支。开发者可以创建Pull Request,通常包括自己所做的更改、目的、解决的问题等信息。同时其他clone/fork了这个项目的可以提交自己的Pull Request,这种Pull Request一般都是维修bug。团队成员可以审查Pull Request中的代码,提出评论和建议,确保更改的质量。一旦Pull Request被审核并获得批准,代码可以被合并到主分支中。其他人也都能收到这个更新。

部署和持续集成

Actions

GitHub Actions是一种自动化工作流程工具,用于在代码仓库中自动执行各种任务,例如构建、测试、部署等。开发者可以创建自定义的工作流程(Actions)并将其与特定事件(如Push到仓库、创建Pull Request等)关联。这些工作流程可以用于自动化重复性任务,提高开发效率,并确保项目的质量。

例如,Python的一些第三方库,开发者设置好了触发条件,当仓库更新时就会自己打包编译,提供不同版本环境下的文件,一些多平台的开源软件也是这样,当这些设置好后,开发者就不用在自己的电脑上手动编译然后发布release了。

不知道你们有没有听说过YesPlayMusic。它是一款高颜值的第三方网易云播放器。这里我们看一看他的actions。顺便讲一讲release。(这个软件的维护比较活跃,因此也开放了Discussion

image-20231107114420797

可以看到,有3个Jobs,对应了3种系统环境,Actions编译好的软件包就发布到releases去了。这里可以看见有很多很多版本,也教教大家以后在Github上下载软件怎么选择适合你的系统的安装包。

首先需要了解你的操作系统和计算机架构。下面是一些常见的操作系统和架构的说明:

  • arm64:通常用于基于ARM架构的计算机,如某些移动设备、嵌入式系统等。
  • x86_64amd64x64:三者其实差不多,指64位x86架构,通常用于台式电脑和服务器。
  • universal:通常表示通用的、跨架构的二进制文件,可以在不同的架构上运行。这里只有苹果的dmg有。

img

根据你的操作系统和计算机架构,你可以选择相应的安装包。以下是一些示例:

  • 如果你使用的是Windows操作系统,通常会选择以.exe为扩展名的文件。
  • 如果你使用的是macOS操作系统,可以选择以.dmg为扩展名的文件,如YesPlayMusic-mac-0.4.7-arm64.dmgYesPlayMusic-mac-0.4.7-x64.dmg,具体选择哪个需要根据你的处理器来。
  • 如果你使用的是Linux操作系统,并且知道自己的计算机架构,可以选择对应的.deb.rpm文件,如yesplaymusic_0.4.7_amd64.debyesplaymusic_0.4.7_arm64.deb.deb一般是为debian系系统的,如Ubuntu。.rpm指RedHat Package Managerment,用于Fedora 、Redhat系统。
  • 如果你使用的是Linux操作系统,但不确定计算机架构,可以尝试选择.tar.gz文件下载源文件,然后根据需要进行手动安装。

上面提到的自动编译打包对我们来说似乎太有难度,这里我展示一下我大一寒假时自学Python写的一个寝室清洁安排程序的 Actions。

因为带点自学的性质,所以实现了几个可能没什么用的功能,如检查语法,创建输出日志等。

image-20231107120231209

简单看一看它的Workflow file。我在写这个的时候网上没有什么写的特别好的教程,也没有ChatGPT,所以我就一点点参考别人的yml文件和微软的文档一点点学。

# 学习yml文件写法: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python

name: Common Execution

on:
  workflow_dispatch:                  # 手动触发workflow
  schedule:
    - cron: '20 23 * * *'
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]              # 修改时启动workflow

env: 
  MAIL: ${{ secrets.MAIL }}
  ROSTER: ${{ secrets.ROSTER }}
  PRINAME: ${{ secrets.PRINAME }}
  PASSWORD: ${{ secrets.PASSWORD }}
  MAILS: ${{ secrets.MAILS }}
  TOKEN: ${{ secrets.TOKEN }}

jobs:
  build:
    runs-on: ubuntu-latest            # 最新版乌班图
    strategy:
      fail-fast: false                # 快速失败

    steps:
    - uses: szenius/set-timezone@v1.0 # 设置执行环境的时区
      with:
        timezoneLinux: "Asia/Shanghai"      # 中国上海

    - uses: actions/checkout@v3       # 导入文件

    - name: Set up Python 3.10        # 建立Python环境
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'        # Python版本
        architecture: 'x64'
    - name: Install dependencies      # 安装依赖项
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Lint with flake8          # 引入语法检查模块
      run: |                          # 检查语法,如果存在Python语法错误或未定义的名称,停止生成。检查长度功能已禁用。
        pip install flake8
        flake8 .
      continue-on-error: true         # 开启以防止工作流失败
    - name: Retrieve secret & Caches
      uses: actions/cache@v3.2.2
      with: 
        path: /home/runner/work/-Auto_ChoresImpact/-Auto_ChoresImpact      # 要缓存和恢复的文件、目录和通配符模式的列表
        key: TOKEN                                         # 控制缓存密码
    - name: Run the execution         # 运行程序
      run: |
        python Judge.py
    - uses: actions/upload-artifact@v2
      with:
        name: ProgramLog
        path: ProgramLog.txt

以下是这段代码完成的主要任务:

  1. 触发条件:
    • 通过手动触发(workflow_dispatch)可以手动启动工作流程。
    • 定时触发,每天 23:20 分(schedule)启动工作流程。
    • 当代码推送到 “main” 分支时(push),也会触发工作流程。
    • 当有 “main” 分支的 Pull Request 时(pull_request),也会触发工作流程。
  2. 环境变量(env):
    • 定义了一些环境变量,其中包括敏感信息,如邮箱、密码、令牌等,这些信息从 GitHub 仓库的 Secrets 中获取(在项目的设置里)。
  3. 作业(jobs):
    • 定义了一个名为 “build” 的作业。
    • 作业运行在最新版的 Ubuntu 操作系统上(ubuntu-latest)。
  4. 步骤(steps):
    • 设置操作系统的时区为 “Asia/Shanghai”。
    • 使用 actions/checkout 插件来检出代码库中的文件。
    • 设置 Python 环境为 3.10 版本,并安装项目依赖项。
    • 使用 flake8 工具对 Python 代码进行语法检查,如果检查失败,仍然继续后续操作。
    • 使用 actions/cache 插件来缓存指定路径的文件/目录,以加速后续的执行。
    • 运行名为 “Judge.py” 的 Python 程序。
    • 使用 actions/upload-artifact 插件上传 “ProgramLog.txt” 文件作为工件(artifact)。

可以看到,语法很简单,也没有什么复杂的逻辑过程。学起来是比较简单的。

开源社区

GitHub是一个开源社区的中心,许多开源项目都托管在GitHub上。许多开源项目都使用不同类型的开源许可证来规定其他人可以如何使用其代码。下面列了一些常见的GitHub开源许可证:

  1. MIT许可证:麻省理工学院许可协议允许你任意的使用、复制、修改原MIT许可的代码库,随便你卖钱还是开源,只要他们在所有副本中包含原许可证和版权声明。这个许可证通常用于非限制性的开源项目。
  2. GNU通用公共许可证 (GPL):GPL有多个版本,最常见的是GPLv2和GPLv3。GPL协议的目的就是强制代码开源和免费使用。其最大的特点就是“开源的传染性”。也就是说,假设某公司使用了具有GPL协议的代码库,那么他理论上也必须把自己的代码库开源。此外,它不允许更换协议,对于代码的变更需要有文档进行说明改了哪些地方。
  3. Apache许可证:Apache许可证是一种较为宽松的许可证,它允许修改和分发代码,但要求在每个许可文件中,必须保留再分发代码中的任何原始著作权、专利、商标等。它通常用于大型开源项目,例如百度的深度学习框架Paddle使用了Apache协议。
  4. GNU宽通用公共许可证 (LGPL):LGPL与GPL类似,但对于与LGPL许可的代码链接的非开源软件有更多的灵活性。它通常用于共享库和可插拔组件。
  5. BSD许可证:BSD许可证通常非常宽松,允许几乎无限制地使用、修改和分发代码,只要原许可证和版权声明得以保留。BSD-3 要求开发者不能利用前人的名义做宣传。比如我不能以某某升级版,某某加强版的名义来宣传我的软件。
  6. Mozilla公共许可证:Mozilla公共许可证是BSD系协议和GPL系协议的折中,允许个人使用、商业使用、专利授权、复制、分发和修改,作者免责,需要保留版权信息、必须开源,不允许更换协议(但允许更换成某些GNU协议),不允许使用商标。
  7. Unlicense:Unlicense是一种完全免费无约束的许可证,允许任何人以任何方式使用、修改和分发代码,甚至不需要提供原许可证或版权声明。
  8. None / No License:如果你在使用GitHub中,没有选择协议默认是 No License, 这并不是代码什么协议也没有, 它表示: 不允许他人进行复制、分发、使用和修改。但是如果你把它上传到了github,那么默认允许他人查看(view)源码、分叉(fork)到自己的仓库,只是不能使用、修改而已。

以上除了None以外还有一个特点就是作者免责,使用代码干的任何事情与作者无关,

MarkDown

Markdown是一种轻量级标记语言,用于简单和易读的文本格式化。它的设计目标是让人们可以使用纯文本编辑器编写文本,同时可以轻松地将其转换为HTML或其他格式,例如PDF。Markdown由约翰·格鲁伯(John Gruber)和亚伦·斯沃茨(Aaron Swartz)于2004年创建。

Markdown使用一些简单的符号和约定来表示文本中的文本格式、标题、列表、链接、图片等元素。以下是一些Markdown的常见用法示例:

  1. 标题:

    # 这是一级标题
    ## 这是二级标题
    ### 这是三级标题
  2. 列表:

    - 项目1
    - 项目2
      - 子项目1
      - 子项目2
    1. 有序项目1
    2. 有序项目2
  3. 链接:

    [文本](URL)
  4. 图片:

    ![替代文本](图片URL)
  5. 强调和粗体:

    *斜体文本*
    **粗体文本**
  6. 引用:

    > 这是引用的文本

Markdown非常流行,因为它易于学习和使用,同时生成的文本在纯文本格式和渲染后的HTML之间切换非常方便。许多在线平台、博客系统和文本编辑器都支持Markdown格式,使其成为文本编辑和发布的常用工具。

我现在讲课的课件就是用Markdown写的,他真的太流行了,而且方便好用,真的不得不学。Github的Repository的readme用Markdown写的,Python的Jupyter Notebook要做说明就是用的MarkDown。很多博客的文章也都是用Markdown写的,我的用的Hexo框架,但是这个框架过去了好几年已经有点过时了(推荐阅读:Hexo 的表演该落幕了,让它退场吧。)这个一般部署在服务器上,这里我动了一点巧思将它部署在了Vercel上,下面讲一讲。

软件推荐:Typora(收费)、ObsidianLogseq

Vercel

Vercel是一家云端部署和托管服务提供商,它专注于现代Web应用程序和静态网站的托管和自动化部署。Vercel的目标是帮助开发者快速、轻松地将他们的前端项目部署到互联网上,以提供卓越的性能和开发体验。以下是Vercel的一些主要特点和用途:

  1. 静态网站托管:Vercel专注于托管静态网站,这意味着它可以轻松地托管包括HTML、CSS、JavaScript等文件的静态网站,而无需自己管理服务器或后端基础设施。
  2. 自动化部署:Vercel提供了强大的自动化部署功能,它能够与代码托管平台(如GitHub、GitLab、Bitbucket)无缝集成,当你的代码库发生变化时,Vercel会自动构建和部署你的应用程序,确保最新版本在线上可用。
  3. 全球CDN:Vercel使用全球内容分发网络(CDN),确保你的网站内容快速传送给全球访问者,提供更快的加载速度和更好的性能。

这是我的博客托管的Github仓库:Hexo_blog

这里插入讲一讲.gitignore,当我们上传代码,部署项目时,有一些内容我们是并不希望他上传的,可能是因为它只是运行过程的临时文件,或者这是在本地的配置文件,换了环境需要重新配置,那么我们就可以在根目录用相对路径的方式来设置,如下所示。

.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
.env
.env.build
.vercel
source/_posts/images

我们进入Vercel的Dashboard,可以看到这上面有我配置的几个项目,不过他一般只能部署静态网页,然后服务器在国外很容易连不上。

这里我们从零部署一个项目吧,本来想过部署什么留言板的,但是这里就部署一个属于自己的ChatGPT吧。用到的仓库:QAChat

这里不作文字演示,我将现场操作。(如果有卡壳请见谅,因为这仓库之前没部署过)

如果要配置自己的域名,那么你需要购买一个域名,并配置好CDN 加速服务。我用的是Cloudflare,免费的,效果够用。如果你们感兴趣可以讲讲。

另:因为网页托管在Vercel上,所以就不像服务器上部署的方式,Vercel每一次就像从一个只安装了基础环境的服务器上开始搭建,所以Build & Development Settings的命令行值得重视。

image-20231107125113775

(选做)搭建博客

如果有时间的话演示。

Jekyll也是一个不错的框架,如果你想基于 GitHub Page 搭建你的个人博客,那么你可以用 Jekyll 。但是我个人不是很推荐,因为 github.io 的速度不是很好,用来当当个人名片或者学术主页是很不错的。

Python Flask

Python Flask模块是一个轻量级的Web框架,用于构建Web应用程序。它基于Python语言,并提供了简单而灵活的方式来处理HTTP请求和响应。Flask模块提供了许多功能,包括路由管理、模板引擎、会话管理和错误处理等。它的设计理念是简单而易于扩展,可以根据项目的需求选择性地添加扩展功能。Flask模块易于学习和使用,适用于从小型应用到大型应用的各种规模的项目。

这是我大一寒假写的一个爬虫项目,学了点运维知识和前后端知识后部署了一个网站。TiebaCrawler

之前还是可以访问的,访问量几千差不多快一万,但是跑这个项目的服务器一个月前被我拿去做frp内网穿透了,如果有时间的话,现在我们重新部署一下试试。

我觉得你们可以试试搭个网站玩,很能提升动手能力。我那个TiebaCrawler的项目在Windows应该跑不了,因为用的文件路径是Linux格式的。

最近阿里云推出了个云工开物计划,高校学生可以免费领300元无门槛优惠券,然后自己也有新用户折扣,或者免费试用几个月。有些带点社会实践性质的项目,就需要一个前段的网页来展示啥的。

Git和Github Desktop(选讲)

前面讲过了,Github是一个代码托管平台,那么代码该如何上传和下载呢?

在Windows端的话,偷懒可以用Github Desktop,有图形化界面,只要点点鼠标就能解决。

但是像Linux环境下就没有,就必须使用Git指令。(在此之前你需要先配置git)

cd xx/xx	# 定位到仓库所在位置
git add ./source/_posts/ ./source/images	#根据相对路径添加需要更新的文件,"."即是所有
git commit -m "Comment" # 备注,必填
git push	# 提交,也就是push;拉取是pull

下期授课

可以讲:

  • Python:带你们入门,讲环境配置、语法。其实校科协的课也可以去听一下。
  • 深度学习(会的不是很多,但是深度学习现在运用场景很多)
  • 强化学习(我的主要学习方向)
  • 这一期内容的扩展。
  • 你们感兴趣的其他内容。

一些个人想法

略,线下说明。

参考:

  1. GitHub开源协议详解及常用协议介绍
  2. GPL、MIT、Apache…一文讲清楚开源协议间的区别
  3. ChatGPT