首页 > 其他分享 >MIT-Missing-Semester8: Metaprogramming

MIT-Missing-Semester8: Metaprogramming

时间:2024-11-30 18:34:14浏览次数:10  
标签:Metaprogramming make echo paper PDF pdf Semester8 MIT name

A. Lecture Notes: Course overview

Build systems

依赖的库的版本。
对于8.1.4,三个数字分别表示:major、minor、patch
加功能:major
添加库:minor
安全修补:patch

lock文件用于冻结版本。
持续集成系统,会有budge的显示,显示了:
版本号、测试的覆盖、依赖。
在这里插入图片描述
cmake:编c
maven:java
在最顶层用make。
遇到要求不同的版本号的c时,则编译会失败。需要升级b,以依赖和a相同版本号的c。
在这里插入图片描述

A brief aside on testing

大多数大型软件项目都附带了“测试套件”。您可能已经熟悉了测试的一般概念,一些简单的、可能遇到的测试术语:

  • 测试套件:所有测试的统称
  • 单元测试:一种单独测试特定功能的“微测试”
  • 集成测试:一种“宏测试”,运行系统的大部分,以检查不同的功能或组件是否协同工作。
  • 回归测试:实现以前导致错误的特定模式的测试,以确保错误不会再次出现。
  • 模拟:用假实现替换函数、模块或类型,以避免测试无关的功能。例如,您可以“模拟网络”或“模拟磁盘”。

Exercises

1、大多数makefile都提供了一个名为clean的目标。这不是为了生成一个名为clean的文件,而是为了清理任何可以通过make重建的文件。将其视为“撤消”所有构建步骤的一种方式。为上面的paper.pdf Makefile实现一个干净的目标。你必须让目标变得虚假。您可能会发现git ls-files子命令很有用。这里列出了许多其他非常常见的make目标。

Makefile:

# 定义变量
TEX = paper.tex
PDF = paper.pdf
PLOT_DATA = plot-data.png
AUX_FILES = $(TEX:.tex=.aux) $(TEX:.tex=.log) $(TEX:.tex=.out) $(TEX:.tex=.toc)

# 默认目标: 生成 paper.pdf
all: $(PDF)

# 生成 paper.pdf
$(PDF): $(TEX) $(PLOT_DATA)
        pdflatex $(TEX)

# paper.pdf: paper.tex plot-data.png
#       pdflatex paper.tex

# 生成图表
plot-%.png: %.dat plot.py
        ./plot.py -i $*.dat -o $@

# 清理目标
.PHONY: clean
clean:
        -@rm -f $(PDF) $(PLOT_DATA) $(AUX_FILES)
        -@git clean -Xdf

# 其他常见的Makefile目标

# 查看PDF文件
.PHONY: view
view: $(PDF)
        xdg-open $(PDF)

.PHONY: help
help:
        @echo "Available targets:"
        @echo "  all       - Build the paper (default)"
        @echo "  clean     - Clean up generated files"
        @echo "  view      - View the generated PDF"
        @echo "  help      - Show this help message"
~                                                               

2、看看在Rust的构建系统中为依赖项指定版本要求的各种方法。大多数包存储库支持类似的语法。对于每一个(插入符号、波浪号、通配符、比较和倍数),试着想出一个用例,在这个用例中,这种特定的需求是有意义的。

3、Git本身可以作为一个简单的CI系统。在任何git存储库中的.git/hocks中,您都可以找到在发生特定操作时作为脚本运行的(当前处于非活动状态)文件。编写一个预提交钩子,运行make paper.pdf,如果make命令失败,则拒绝提交。这应该可以防止提交中有无法构建的论文版本。

进入./git/hooks,新建pre-commit。代码:

#!/bin/bash

# 输出提示信息
echo "Running 'make paper.pdf' to ensure the paper can be built..."
 
# 运行 make paper.pdf
make paper.pdf

# 检测 make 命令的退出状态
if [ $? -ne 0 ]; then
    echo "Error: 'make paper.pdf' failed. Please fix the build and try again."
    exit 1
fi

# 如果 make 成功,允许提交
echo "Build successful, procedding with commit."
exit 0

4、设置一个简单的自动发布的 GitHub Pages 页面,并添加一个 GitHub Action 来运行 shellcheck 检查仓库中的所有 shell 文件。

在仓库页面的顶部菜单栏中,点击 Settings 选项卡->
在 Settings 页面中,向下滚动找到 GitHub Pages 部分->
在 GitHub Pages 部分,选择发布源为 master 分支。

仓库中创建 .github/workflows 目录:
$ mkdir -p .github/workflows

在 .github/workflows 目录下创建一个名为 shellcheck.yml 的文件,并添加以下内容:
name: ShellCheck

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  shellcheck:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Run ShellCheck
        run: |
          sudo apt-get update
          sudo apt-get install -y shellcheck
          find . -name "*.sh" -exec shellcheck {} \;
          
提交并推送更改:
$ git add .github/workflows/shellcheck.yml
$ git commit -m "Add GitHub Action for shellcheck"
$ git push origin main

5、构建自己的GitHub操作来运行proselint或在存储库中的所有.md文件上编写良好。在您的存储库中启用它,并通过提交一个有拼写错误的拉取请求来检查它是否正常工作。

在 .github/workflows 目录下创建一个名为 markdown-lint.yml 的文件,并添加以下内容:

name: Markdown Lint

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  markdown-lint:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.x'

      - name: Install proselint
        run: |
          pip install proselint

      - name: Run proselint
        run: |
          find . -name "*.md" -exec proselint {} \;

参考:
1、MIT-Missing-Semester

标签:Metaprogramming,make,echo,paper,PDF,pdf,Semester8,MIT,name
From: https://blog.csdn.net/AN15107549921/article/details/144129656

相关文章

  • Unity类银河战士恶魔城学习总结(P154 Audio Distance Limite音频距离限制)
    【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/本章节给骷髅战士加上了音频,并且限制了产生音效的范围可爱的骷髅战士AudioManager.cs      关键字段AudioManagerinstance实现单例模式,确......
  • 中间人攻击(Man-in-the-Middle Attack, MITM)
    目录中间人攻击的基本过程常见的中间人攻击类型防范措施中间人攻击(Man-in-the-MiddleAttack,MITM)是一种网络攻击形式,攻击者通过介入受害者与目标实体之间的通信,在双方不知情的情况下拦截、窃听或篡改数据。这种攻击的关键在于攻击者能够悄无声息地插入到两个通信方之间,并使......
  • PolarDB MySQL limit m,n Top K问题优化
    现有的limitm,n处理方式堆排序,topK算法归并排序时基于offset和limit做truncateSelf-sharpeninginputfilter算法假如有若干个sortedrun有序数组,则取第K大的元素(这个元素称为cutoffvalue)以及之前的值,其余的值都过滤掉,然后再用这个cutoffvalue值过滤其他sorte......
  • 软件许可证Apache 2.0、GPL 和 MIT对比
    开源软件许可证的选择通常由项目的目标和使用场景决定。在实际开发中,不同的许可证(如Apache2.0、GPL和MIT)已被大规模使用在各类流行项目上。以下是基于这些许可证的大型开源项目的总结和对比,包括常用的.NET库(如Newtonsoft.Json、AutoMapper、依赖注入框架等)以及其他行业内的......
  • Golang - json omitempty的用法
    omitempty的作用是在json数据结构转换时,当该字段的值为该字段类型的零值时,忽略该字段。packagemainimport("fmt""encoding/json")typeStudentstruct{Namestring`json:"name"`Ageint`json:"age"`Gradestring`json:"......
  • 论文解读《Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural
    发表时间:2019期刊会议:IEEESymposiumonSecurityandPrivacy(S&P)论文单位:UCSantaBarbara论文作者:BolunWang,YuanshunYao,ShawnShan,HuiyingLi,BimalViswanath,HaitaoZheng,BenY.Zhao方向分类:BackdoorAttack论文链接开源代码摘要深度......
  • [Vue] Typescript for Vue3 (defineProps, withDefaults, defineEmits)
    Defineacomponentwithpropsanddefualtpropsvalue<scriptsetuplang="ts">import{ref,onMounted}from'vue'importfetchCountfrom'../services/fetchCount'interfaceProps{limit:number,alertMessageOnLim......
  • 撤回最近的 git commit
    在Git中,如果你想撤回最近的gitcommit,可以根据不同的需求选择不同的操作。以下是几种常见的撤回方式:1. 撤回最后一次commit,但保留修改(softreset)如果你想撤销gitcommit,但保留修改的文件(即文件内容不变),可以使用:gitreset--softHEAD~1HEAD~1 指的是上一个commit,--s......
  • MITRE公布2024 年“CWE TOP 25”
    MITRE分享了从2023年6月至2024年6月期间披露的31,000多个漏洞背后最常见和最危险的25个软件弱点列表。软件弱点是指在软件的代码、架构、实现或设计中发现的缺陷、错误、漏洞和错误。攻击者可以利用这些弱点来破坏运行易受攻击软件的系统,从而能够控制受影响的设备并......
  • MIT 操作系统6.S081第一章
    1.1进程和内存fork父进程中fork返回子进程的PID子进程中fork返回0exitexit会让当前进程停止执行并释放资源(包括内存和打开的文件)通常:0表示成功1表示失败waitwait系统调用并返回当前进程已退出或杀死的进程PID,并将子进程的状态复制到wait的地址另外:如果子进......