basic course content added, more TODO

This commit is contained in:
Thomas (Tom) C. Gorordo 2026-02-22 18:07:24 -08:00
commit 76468828e3
Signed by: tgorordo
GPG key ID: 0CBED22BB0D94490
94 changed files with 22022 additions and 0 deletions

54
files/forms/carousel.cgi Normal file
View file

@ -0,0 +1,54 @@
#!/usr/bin/env -S uv run python
import cgi, cgitb
import sys, os
import html
cgitb.enable()
form = cgi.FieldStorage()
if 'spreadsheet' in form:
message = """
<h1>Matching:</h1>
<p><a href="../carousel.html">Go Back</a></p>
"""
else:
message = """
<h1>Error</h1>
<p>No file field found in the form.</p>
<p><a href="../carousel.html">Go Back</a></p>
"""
response = f"""
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> Carousel - Stable Matching </title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 40px auto;
padding: 20px;
}
h1 {
font-size: 24px;
margin-bottom: 20px;
}
</style>
</head>
<body>
{message}
</body>
<footer>
<hr>
<p>Author: <a href="https://pages.uoregon.edu/tgorordo">Thomas (Tom) C. Gorordo</a>
Source: <a href="https://github.com/tgorordo/pages.uoregon.edu">pages.uoregon.edu/tgorordo</a>,
<a href="https://github.com/tgorordo/carousel">carousel</a></p>
</footer>
"""
print(response)

77
files/forms/carousel.html Normal file
View file

@ -0,0 +1,77 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> Carousel - Stable Matching </title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 600px;
margin: 40px auto;
padding: 20px;
}
h1 {
font-size: 24px;
margin-bottom: 20px;
}
label {
display: block;
margin-bottom: 8px;
}
input[type="file"] {
margin-bottom: 15px;
}
input[type="submit"] {
padding: 8px 16px;
}
</style>
</head>
<body>
<h1>Carousel: Stable Matcher - CGI Application Upload</h1>
<div class="form-container">
<form action="/files/forms/carousel.cgi" method="POST" enctype="multipart/form-data">
<label for="spreadsheet">Upload a preferences spreadsheet (.xlsx, .xls, .csv):</label>
<input type="file" id="spreadsheet" name="spreadsheet" accept=".xlsx,.xls,.csv" required>
<br>
<input type="submit" value="Upload and Match!">
</form>
</div>
<div class="explanation-container">
<h2>About</h2>
<p>This is an upload form for the <a href="https://github.com/tgorordo/carousel">carousel</a> stable matcher (intended only for small matchings), mainly to help assign UO Physics TAs to classes according to preference. This form uses the <a href="https://service.uoregon.edu/TDClient/2030/Portal/KB/ArticleDet?ID=43069">UO pages.uoregon.edu CGI Capability</a>, so the implementation of carousel being invoked can be
<a href="https://pages.uoregon.edu/tgorordo/files/carousel/"> inspected here</a>
and you may also inspect the source of this page to verify that <a href="https://pages.uoregon.edu/tgorordo/files/forms/carousel.cgi">this script<a> is called to invoke it.
</p>
<p>The <a href="https://en.wikipedia.org/wiki/Stable_matching_problem">Stable Matching Problem</a>
(actually the "college admissions" variant of the problem) solved by carousel is to find a
"stable" set of assignments between courses/roles and TAs. A stable assignment,
in this context, is one in which there is no pair of TA and course role
which would prefer each other to their respective assignment given under the matching.
This form uses default carousel settings to run a version of the the
Gale-Shapley (1962) deferred-acceptance algorithm which finds the stable matching that is
optimal for the TA preferences. If other stable solutions are desired, you will need to
run carousel as a python application yourself.
<h3>Input: Expected Spreadsheet Format</h3>
<p>A spreadsheet for matching should be organized as a list of TA assignment preferences
and a list of course preferences/constraints, i.e. with the following structure:</p>
<ul>
<li><strong>Column A:</strong> Name (text)</li>
</ul>
<h3>Output: Matching Result Format</h3>
<p>This form will return a matching in the form of </p>
</div>
</body>
<footer>
<hr>
<p>Author: <a href="https://pages.uoregon.edu/tgorordo">Thomas (Tom) C. Gorordo</a>
Source: <a href="https://github.com/tgorordo/pages.uoregon.edu">pages.uoregon.edu/tgorordo</a>,
<a href="https://github.com/tgorordo/carousel">carousel</a></p>
</footer>
</html>

BIN
files/haskell-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

52
files/tgorordo-pub.pgp Normal file
View file

@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
8p6I8+YsOgBOjdjPU18Abyas/eD/Xql3
=6xCA
-----END PGP PUBLIC KEY BLOCK-----