7. Why are these tools like this?#

7.1. Discussion#

At your tables:

  • share your responses to the work in the prep work for today’s topic

  • discuss any similiarities or differences

  • if any, send back questions you have

  • if any, send points you want to share to the whole class

How did the processes, decisions, and practices that people at your table brought up compare to what you thought of?

7.2. Design#

In CS we tend to be more implicit about design, but that makes it hard to learn and keep track of.

Today’s goal is to be more explicit, disucssing some principles and seeing how you have already interacted wit them.

Today we’re going to do a bit more practical stuff, but we are also going to start to get into the philosophy of how things are organized.

Understanding the context and principles will help you:

  • remember how to do things

  • form reliable hypotheses about how to fix problems you have not seen before

  • help you understand when you should do things as they have always been done and when you should challenge and change things.

7.2.1. Why should we study design?#

  • it is easy to get distracted by implementation, syntax, algorithms

  • but the core principles of design organize ideas into simpler rules

7.2.2. Why are we studying developer tools?#

The best way to learn design is to study examples [Schon1984, Petre2016], and some of the best examples of software design come from the tools programmers use in their own work.

Software design by example

note

  • we will talk about some history in this course

  • I will not take a “great men of history” approach

This is because:

  • I think that history is important context for making decisions

  • Many of these “great men” are actually, in many ways, Not Great^TM

  • It is important to remember that all of this work was done by people

  • all people are imperfect

  • when people are deeply influential, ignoring their role in history is not effective, we cannot undo what they did

  • we do not have to admire them or even say their names to acknowledge the work

  • computing technology has been used in Very Bad ways and in Definitely Good ways

7.3. Unix Philosophy#

sources:

The tenets:

  1. Make it easy to write, test, and run programs.

  2. Interactive use instead of batch processing.

  3. Economy and elegance of design due to size constraints (“salvation through suffering”).

  4. Self-supporting system: all Unix software is maintained under Unix.

For better or worse unix philosophy is dominant, so understanding it is valuable.

This critique is written that unix is not a good system for “normal folks” not in its effectiveness as a context for developers which is where *nix (unix, linux) systems remain popular.

context:
“normal folks” is the author’s term; my guess is that it is attempting to describe a typical, nondeveloper computer user terminology to refer to people has changed a lot over time; when we study concepts from primary sources, we have to interpret the document through the lens of what was normal at the time the document was written, not to excuse bad behavior but to not be distracted and see what is there

Today we will work in your main repo

cd fall24-brownsarahm/

7.4. Philosophy in practice, using pipes#

open a codespace on the main branch of your KWL repo

To check if your gh CLI is working:

gh
  Work seamlessly with GitHub from the command line.

USAGE
  gh <command> <subcommand> [flags]

CORE COMMANDS
  auth:        Authenticate gh and git with GitHub
  browse:      Open the repository in the browser
  codespace:   Connect to and manage codespaces
  gist:        Manage gists
  issue:       Manage issues
  org:         Manage organizations
  pr:          Manage pull requests
  project:     Work with GitHub Projects.
  release:     Manage releases
  repo:        Manage repositories

GITHUB ACTIONS COMMANDS
  cache:       Manage GitHub Actions caches
  run:         View details about workflow runs
  workflow:    View details about GitHub Actions workflows

EXTENSION COMMANDS
  classroom:   Extension classroom

ALIAS COMMANDS
  co:          Alias for "pr checkout"

ADDITIONAL COMMANDS
  alias:       Create command shortcuts
  api:         Make an authenticated GitHub API request
  attestation: Work with artifact attestations
  completion:  Generate shell completion scripts
  config:      Manage configuration for gh
  extension:   Manage gh extensions
  gpg-key:     Manage GPG keys
  label:       Manage labels
  ruleset:     View info about repo rulesets
  search:      Search for repositories, issues, and pull requests
  secret:      Manage GitHub secrets
  ssh-key:     Manage SSH keys
  status:      Print information about relevant issues, pull requests, and notifications across repositories
  variable:    Manage GitHub Actions variables

HELP TOPICS
  actions:     Learn about working with GitHub Actions
  environment: Environment variables that can be used with gh
  exit-codes:  Exit codes used by gh
  formatting:  Formatting options for JSON data exported from gh
  mintty:      Information about using gh with MinTTY
  reference:   A comprehensive reference of all gh commands

FLAGS
  --help      Show help for command
  --version   Show gh version

EXAMPLES
  gh issue create
  gh repo clone cli/cli
  gh pr checkout 321

LEARN MORE
  Use `gh <command> <subcommand> --help` for more information about a command.
  Read the manual at https://cli.github.com/manual
  Learn about exit codes using `gh help exit-codes`
  

When we use it without a subcommand, it gives us help output a list of all the commeands that we can use. If it is not working, you would get a command not found error.

Let’s inpsect the action file that creates the issues for your badges.

cat .github/workflows/getassignment.yml 
cat .github/workflows/getassignment.yml 
name: Create badge issues (Do not run manually)
on:
  workflow_dispatch

jobs:
  check-contents:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    
    # Install dependencies
    - name: Set up Python 
      uses: actions/setup-python@v5
      with:
        python-version: 3.12
    
    - name: Install Utils
      run: |
        pip install git+https://github.com/compsys-progtools/courseutils@main
    - name: Get badge requirements
      run: |
        # prepare badge lines
        pretitle="prepare-"$(cspt getbadgedate --prepare)
        cspt getassignment --type prepare | gh issue create --title $pretitle --label prepare --body-file -
        # review badge lines
        rtitle="review-"$(cspt getbadgedate --review)
        cspt getassignment --type review | gh issue create --title $rtitle --label review --body-file -
        # practice badge lines
        pratitle="practice-"$(cspt getbadgedate --practice)
        cspt getassignment --type practice | gh issue create --title $pratitle --label practice --body-file -
      env:
        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
#  edit the run step above for the level(s) you want. 
#  You should keep the prepare, because they are required for experience badges 
#     You may choose to get only the review or only the practice (and change this any time) 
# added comment to fix

A lot of this is familiar, but we are focused today on the three highlighed lines

Here we see a few key things:

  • on the last line it uses a pipe | to connect a command sysgetassignment to the gh issue create command.

  • the gh issue create command uses the --body-file option with a value -; this uses std in, but since this is to the right of the pipe, it puts the output of the first command into this option

  • the 2nd to last line creates a variable (we will learn this more later) and the last line uses that variable

  • the Install Utils step, installs some custom code.

We know that this action is what is used to create badge issues, so this custom code must be what gets information from the course website to get the assignments and prepare them for your badge issues.

7.4.1. Installing from source#

As we saw in the action, we can install python packages from source via git. let’s install the new version of the code

pip install git+https://github.com/compsys-progtools/courseutils@main
Collecting git+https://github.com/compsys-progtools/courseutils@main
  Cloning https://github.com/compsys-progtools/courseutils (to revision main) to /private/var/folders/8g/px8bm7bj0_j31j71yh6mfd_r0000gn/T/pip-req-build-gicd88lk
  Running command git clone --filter=blob:none --quiet https://github.com/compsys-progtools/courseutils /private/var/folders/8g/px8bm7bj0_j31j71yh6mfd_r0000gn/T/pip-req-build-gicd88lk
  Resolved https://github.com/compsys-progtools/courseutils to commit 395ac8754c55a119ffa2b3670afabfe4ba082c9e
  Preparing metadata (setup.py) ... done
Requirement already satisfied: Click in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from syscourseutils==1.0.6) (8.1.7)
Requirement already satisfied: pandas in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from syscourseutils==1.0.6) (2.2.2)
Requirement already satisfied: lxml in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from syscourseutils==1.0.6) (5.3.0)
Requirement already satisfied: pyyaml in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from syscourseutils==1.0.6) (6.0.2)
Requirement already satisfied: numpy in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from syscourseutils==1.0.6) (2.1.1)
Requirement already satisfied: requests in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from syscourseutils==1.0.6) (2.32.3)
Requirement already satisfied: html5lib in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from syscourseutils==1.0.6) (1.1)
Requirement already satisfied: six>=1.9 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from html5lib->syscourseutils==1.0.6) (1.16.0)
Requirement already satisfied: webencodings in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from html5lib->syscourseutils==1.0.6) (0.5.1)
Requirement already satisfied: python-dateutil>=2.8.2 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pandas->syscourseutils==1.0.6) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pandas->syscourseutils==1.0.6) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pandas->syscourseutils==1.0.6) (2024.1)
Requirement already satisfied: charset-normalizer<4,>=2 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->syscourseutils==1.0.6) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->syscourseutils==1.0.6) (3.8)
Requirement already satisfied: urllib3<3,>=1.21.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->syscourseutils==1.0.6) (1.26.20)
Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->syscourseutils==1.0.6) (2024.8.30)
Building wheels for collected packages: syscourseutils
  Building wheel for syscourseutils (setup.py) ... done
  Created wheel for syscourseutils: filename=syscourseutils-1.0.6-py3-none-any.whl size=21580 sha256=9efce13a5eae8a7fd0d6a14dc2123117be62ecd35a9d09115ea0daa10a29f200
  Stored in directory: /private/var/folders/8g/px8bm7bj0_j31j71yh6mfd_r0000gn/T/pip-ephem-wheel-cache-6zv5pffq/wheels/74/14/ad/64dd25a774af520d19cd1f28a5e0d167ef58b12046c1fc7572
Successfully built syscourseutils
Installing collected packages: syscourseutils
  Attempting uninstall: syscourseutils
    Found existing installation: syscourseutils 1.0.6
    Uninstalling syscourseutils-1.0.6:
      Successfully uninstalled syscourseutils-1.0.6
Successfully installed syscourseutils-1.0.6

TO confirm it worked, we use its base command

cspt 
Usage: cspt [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  badgecounts     check if early bonus is met from output of `gh pr list...
  combinecounts   combine two yaml files by adding values
  createtoyfiles  from a yaml source file create a set of toy files with...
  earlybonus      check if early bonus is met from output of `gh pr list...
  exportac        export ac files for site from lesson
  exporthandout   export prismia version of the content
  exportprismia   export prismia version of the content
  getassignment   get the assignment text formatted
  getbadgedate    cli for calculate badge date
  grade           calculate a grade from yaml that had keys of...
  issuestat
  issuestatus     generate script to appy course issue statuse updates
  kwlcsv          generate the activity file csv file for the site...
  mkchecklist     transform input file to a gh markdown checklist, if the...
  parsedate       process select non dates
  prfixlist       check json output for titles that will not be counted...
  processexport   transform output from mac terminal export to myst...
  progressreport  list PR titles from json or - to use std in that have...
  titlecheck      check a single title

Let’s try the one we saw in the action

cspt getassignment --type prepare
404: Not Found

With default settings, it says 404.

We know that it goes online. So, for example, if you turn your wifi off and then try it again, you will get a different error.

To learn more about this, lets use the --help option.
A lot of CLI tools have this option. In this program, that I made, the Python library click that I used to make this, provides the help option automatically to show the documentation or lets me as the developer add help text to options.

cspt getassignment --help
Usage: cspt getassignment [OPTIONS]

  get the assignment text formatted

Options:
  --type TEXT  type can be {prepare, review, or practice}; default prepare
  --date TEXT  date should be YYYY-MM-DD of the tasks you want; default most
               recently posted
  --help       Show this message and exit.

Now we can see that it can take some options.

If we do not provide a date, I can tell you (and I should add to the documentation), it uses today’s date. Since we ran this on a day with class, before the badges were posted, the file it looked for did not exist, so we got 404.

We can use the options to get the last posted prepare work

cspt getassignment --type prepare --date 2024-09-26
- [ ] Think through and make some notes about what you have learned about design so far. Try to answer the questions below in `design_before.md`.  If you do not now know how to answer any of the questions, write in what questions you have. 

``` 
- What past experiences with making decisions about design of software do you have?
- what experiences studying design do you have? 
- What processes, decisions, and practices come to mind when you think about designing software?
- From your experiences as a user, how you would describe the design of command line tools vs other GUI based tools?
```
gh issue create --help
Create an issue on GitHub.

Adding an issue to projects requires authorization with the `project` scope.
To authorize, run `gh auth refresh -s project`.


USAGE
  gh issue create [flags]

ALIASES
  gh issue new

FLAGS
  -a, --assignee login   Assign people by their login. Use "@me" to self-assign.
  -b, --body string      Supply a body. Will prompt for one otherwise.
  -F, --body-file file   Read body text from file (use "-" to read from standard input)
  -e, --editor           Skip prompts and open the text editor to write the title and body in. The first line is the title and the remaining text is the body.
  -l, --label name       Add labels by name
  -m, --milestone name   Add the issue to a milestone by name
  -p, --project title    Add the issue to projects by title
      --recover string   Recover input from a failed run of create
  -T, --template file    Template file to use as starting body text
  -t, --title string     Supply a title. Will prompt for one otherwise.
  -w, --web              Open the browser to create an issue

INHERITED FLAGS
      --help                     Show help for command
  -R, --repo [HOST/]OWNER/REPO   Select another repository using the [HOST/]OWNER/REPO format

EXAMPLES
  $ gh issue create --title "I found a bug" --body "Nothing works"
  $ gh issue create --label "bug,help wanted"
  $ gh issue create --label bug --label "help wanted"
  $ gh issue create --assignee monalisa,hubot

  $ gh issue create --project "Roadmap"
  $ gh issue create --template "bug_report.md"

LEARN MORE
  Use `gh <command> <subcommand> --help` for more information about a command.
  Read the manual at https://cli.github.com/manual
  Learn about exit codes using `gh help exit-codes`

7.4.2. Interactive Design#

gh issue create
Creating issue in compsys-progtools/compsys-progtools-fa24-fall24-kwl-template

? Title tst
? Body <Received>
? What's next? Submit
https://github.com/compsys-progtools/compsys-progtools-fa24-fall24-kwl-template/issues/43
gh issue list
Showing 1 of 1 open issue in compsys-progtools/compsys-progtools-fa24-fall24-kwl-template

ID   TITLE  LABELS  UPDATED               
#43  tst            less than a minute ago
gh issue view 43
tst compsys-progtools/compsys-progtools-fa24-fall24-kwl-template#43
Open • brownsarahm opened about 1 minute ago • 0 comments


  No description provided


View this issue on GitHub: https://github.com/compsys-progtools/compsys-progtools-fa24-fall24-kwl-template/issues/43

COmment also allows us to work interactively.

gh issue comment 43

It uses nano which we have already been using, so you are well prepared for this!

- Press Enter to draft your comment in nano... 
? Submit? Yes
https://github.com/compsys-progtools/compsys-progtools-fa24-fall24-kwl-template/issues/43#issuecomment-2377554046

We can look again

gh issue view 43
tst compsys-progtools/compsys-progtools-fa24-fall24-kwl-template#43
Open • brownsarahm opened about 2 minutes ago • 1 comment


  No description provided


brownsarahm • 0m • Newest comment

  lksjflakjfladksjlf;kwhf;kwh                                                 


View this issue on GitHub: https://github.com/compsys-progtools/compsys-progtools-fa24-fall24-kwl-template/issues/43

We can also close issues

gh issue close 43
✓ Closed issue compsys-progtools/compsys-progtools-fa24-fall24-kwl-template#43 (tst)

7.5. Now with the pipe#

cspt getassignment --type prepare --date 2024-09-26 | gh issue create --title 'duplicatee' --body-file -
Creating issue in compsys-progtools/compsys-progtools-fa24-fall24-kwl-template

https://github.com/compsys-progtools/compsys-progtools-fa24-fall24-kwl-template/issues/44

we can aloso open t in browser to see more fully

gh issue view 44 --web
Opening github.com/compsys-progtools/compsys-progtools-fa24-fall24-kwl-template/issues/44 in your browser.

Important

If you are using GitBash on Windows see the mintty info to make gh work locally.

Since your repos are forks, they have two remotes, or upstream repositories, that you can pull from.

We can see with git remote

git remote
origin
upstream

it has a verbose option with the -v flag that shows more detail

git remote -v
origin	https://github.com/compsys-progtools/fall24-brownsarahm.git (fetch)
origin	https://github.com/compsys-progtools/fall24-brownsarahm.git (push)
upstream	https://github.com/compsys-progtools/compsys-progtools-fa24-fall24-kwl-template.git (fetch)
upstream	https://github.com/compsys-progtools/compsys-progtools-fa24-fall24-kwl-template.git (push)

We can change which of those is a default

gh repo set-default origin
expected the "[HOST/]OWNER/REPO" format, got "origin"

I forgot the format and tried to use the short name, origin when gh requires it tobe in owner/repo format, but this error is informative, so we know what to do:

Important

Do this step!! It will fix some of your errors


```{code-cell} bash
:tags: ["skip-execution"]
gh repo set-default compsys-progtools/fall24-brownsarahm
✓ Set compsys-progtools/fall24-brownsarahm as the default repository for the current directory

Hack the course

build and explore ideas

Develop new command line tools, github actions, VS Code (or other IDE) extensions, visual aids, etc that help future students in the course. This is a way for you to demonstrate your learning and contribute to open source repos that you can then link to on a portfolio website or resume.

You can participate in this at different levels (or multiple):

  • build: writing, documenting at the API level, and configuring major pieces (can be collaborative)

  • explore: writing example/tutorial style docs that another student (or team) build (mostly solo; open to justification for collab)

  • explore: adding summary/visuals to the notes

  • community: (test option): testing other students contributions and making descriptive issues or writing short reviews (~3-5 sentenccs); must not be spammy

  • community: (review option): reviewing PRs submitted by a classmate (can be within a collaborative build, but must be not your own code) a single PR can have multiple reivews if sensible and not duplicative; no spam

  • community: (contribution) add a glossary term to this site

see the bonus table for more information

Prepare for Next Class

  1. Learn about hacktoberfest

  2. check your plan for success PR for comments and reply or merge if approved

  3. read about conventional commits and find some opinions about them in dev blogs, forums (eg reddit) or similar

Badges

  1. Read today’s notes when they are posted. There are imporant tips and explanation to be sure you did.

  2. Most real projects partly adhere and at least partly deviate from any major design philosophy or paradigm. Review the open source project you looked at for the software.md file from before and decide if it primarily adheres to or deviates from the unix philosophy. Add a ## Unix Philosophy <Adherance/Deviation> section to your software.md, setting the title to indicate your decision and explain your decision in that section (pick one). Provide at least two specific examples supporting your choice, using links to specific lines of code or specific sections in the documentation that support your claims.

  1. Read today’s notes when they are posted. There are imporant tips and explanation to be sure you did and ideas for explore/build badges.

  2. Most real projects partly adhere and at least partly deviate from any major design philosophy or paradigm. Add a ## Unix Philosophy section to your software.md about how that project adheres to and deviates from the unix philosophy. Be specific, using links to specific lines of code or specific sections in the documentation that support your claims. Provide at least one example of both adhering and deviating from the philosophy and three total examples (that is 2 examples for one side and one for the other). You can see what badge software.md was previously assigned in and the original instructions on the KWL file list.

Experience Report Evidence

Questions After Today’s Class

Is there anything you can do in Github that you can’t do locally?

View PRs linked to issues easily is one example. It’s not a lot though

What should I do for prepare work?

see instructions

What is the cspt in get an assignment and what exactly is the getassignment command doing?

see its docs or source

Why did we type in the codepsace terminal on Git Hub and not on Bash?

the terminal in the codespace is bash on linux, where you all have exactly the same specs.

GitBash, the windows terminal program that allows you to use bash and git commands has and issue with mintty that you probably have to reinstall it to make gh work there, but the GitHub Codespace comes with gh installed.

Why did we use the pip install command?

pip is the package manager for python. pip install installs a package. We installed from the source repo

What are some examples of dev tools that we can use today

All the ones we use each class, every IDE you use, etc.

When should I use --help option?

Whenever you do not know the usage of a command. Not all programs provide it, but many modern ones do. Worst case it gives an error.

Why was the default repo set wrong?

That is the normal choice for github for forks, that issues go to the primary repo, not the fork. It is just not what we want for this class (we did not really want forks, but GitHub classrooms makes them now).