コンピュータ教育で欠けている授業-MIT-L 8-メタプログラミング

5569 ワード

https://missing.csail.mit.edu/
https://missing-semester-cn.g...
https://www.bilibili.com/vide...
思否ホームページ:https://segmentfault.com/u/wi...

メモ


メタプログラミングは通常オペレーティングプログラム用プログラムを指し、講座では開発プロセスについて議論されています.

システムの構築


システムの構築は、一連の構築プロセスを実行するのに役立ちます.構築プロセスには、ターゲット(targets)、依存(dependencies)、ルール(rules)が含まれます.構築システムに具体的な構築目標を伝える必要があります.システムのタスクは、これらの目標を構築するために必要な依存を見つけ、最終目標が構築されるまで、ルールに基づいて必要な中間生成物を構築することです.
理想的には、ターゲットの依存が変更されず、以前の構築からこれらの依存を多重化できる場合、それに関連する構築ルールは実行されません.makeは最も一般的な構築システムの1つであり、UNIXベースのほとんどのシステムにインストールされていることがわかります.makeのチュートリアルはチェン一峰のこの文章を参考にすることができます:Makeコマンドチュートリアル.
その他の一般的な構築システム/ツール:
  • CとC++:Cmakeは、CMake入門実戦
  • を参照することができる.
  • Java:Maven,Ant,Gradle
  • フロントエンド開発:Grunt,Gulp,Webpack
  • Ruby:Rake
  • Rust:Cargo

  • 依存管理


    ソフトウェアウェアハウス

  • Ubuntu:aptというツールでUbuntuパッケージウェアハウス
  • にアクセスできます.
  • CentOS,Redhat:yumというツールでソフトウェアウェアハウス
  • にアクセス
  • Archlinux/Manjaro:pacmanツールを使用してArchlinuxソフトウェアウェアハウスとArchユーザーソフトウェアウェアハウス(AUR,Arch User Repository)
  • にアクセス
  • Ruby:gemツールでRubyGems
  • にアクセス
  • Python:pipツールでPypi
  • にアクセス

    バージョン番号


    異なるプロジェクトで使用されるバージョン番号は、その具体的な意味は完全に同じではありませんが、比較的一般的に使用される標準はセマンティックバージョン番号であり、このバージョン番号は異なる意味を有し、そのフォーマットはmajor.minor.patch(プライマリ・バージョン番号.セカンダリ・バージョン番号.パッチ番号).関連ルールは次のとおりです.
  • 新しいバージョンでAPIが変更されていない場合は、パッチ番号を増やします.
  • APIを追加し、この変更が後方互換性がある場合は、セカンダリ・バージョン番号を増やします.
  • APIを変更しても後方互換性がない場合は、プライマリ・バージョン番号を増やします.

  • これには、たとえば、プロジェクトがプロジェクトに基づいて構築されている場合、最新バージョンのプライマリ・バージョン番号が変更されていない限り安全であり、セカンダリ・バージョン番号が以前に使用したバージョンよりも低くなければ、多くのメリットがあります.言い換えれば、私が依存しているバージョンが1.3.7であれば、1.3.81.6.1、さらには1.3.0を使用することができます.バージョン番号が2.2.4であれば、プライマリバージョン番号が増加したため、必ずしも使用できるとは限りません.

    持続的統合システム


    継続的な統合、またはCIという傘用語(umbrella term)は、「コードが変更されると自動的に実行されるもの」を指し、クラウド構築システムと考えられます.
    市場には、Travis CI、Azure Pipelines、GitHub Actionsなど、さまざまなCIツールを提供する会社がたくさんあります.
    使用方法は大きく異なります.eventsとactionsを含むルールを記述するコードウェアハウスにファイル(recipe)を追加します.
    最も一般的なルールは、誰かがコードをコミットした場合、テストキットを実行することです.このイベントがトリガーされると、CIプロバイダは1つ以上の仮想マシンを起動し、作成したルールを実行し、通常は関連する実行結果を記録します.いくつかの設定を行うことで、テストキットが失敗した場合に通知を受け取ることができます.または、テストがすべて合格した場合、倉庫のホームページにバッジが表示されます.
    Githubには、依存関係を維持するCIツールDependabotもあります.
    GitHub Pagesは良い例です.Pagesは、masterでコードが更新されるたびにJekyllブログソフトウェアを実行し、サイトにGitHubドメイン名でアクセスできるようにします.私たちにとってこれらのことはあまりにも些細で、私は今ローカルで修正してgitを使ってコードを提出して、遠隔地に公開するだけです.CIは自動的に後続のことを処理してくれます.

    テスト

  • テストキット(Test suite):すべてのテストの総称
  • ユニットテスト(Unit test):パッケージの特性をテストするための「マイクロテスト」
  • 統合テスト(Integration test):システムの大部分に対して行われる「マクロテスト」で、異なる特性やコンポーネントが協働して動作するかどうかをテストします.
  • 回帰テスト(Regression test):以前に問題が発生したバグが
  • に再発しないことを保証するために使用されます.
  • シミュレーション(Mocking):関数、モジュール、またはタイプを置換するために偽の実装を使用し、テストに関連しないコンテンツをブロックします.たとえば、「ネットワーク接続のシミュレーション」または「ハードディスクのシミュレーション」
  • レッスン後の練習


    練習問題1


    いくつかの有用なmake 構築目標(例えば、本題はphonyを用いた).
    .PHONY: clean
    clean:
          git ls-files -o | xargs rm
          #   gitignore  , 
          #  
          # rm plot-*.png
          # rm paper.pdf

    練習問題3

    #!/bin/sh
    #
    # An example hook script to verify what is about to be committed.
    # Called by "git commit" with no arguments.  The hook should
    # exit with non-zero status after issuing an appropriate message if
    # it wants to stop the commit.
    
    # Redirect output to stderr.
    exec 1>&2
    
    if (! make)
    then
        cat <

    練習問題4


    GitHub Pagesに基づいて、自動公開可能なページを作成します.GitHub Actionを倉庫に追加し、倉庫内のすべてのshellファイルに対してshellcheck(メソッドの1つ)を実行します.

    練習問題5


    構築 GitHub actionは、倉庫内のすべての.mdファイルに対してproselintまたはwrite-goodを実行し、倉庫でこの機能を開き、エラーを含むファイルを提出して機能が有効かどうかを確認します.