From 7a73162607544204032aa66cce755daf21edebda Mon Sep 17 00:00:00 2001 From: Matt Strapp Date: Tue, 24 May 2022 11:18:46 -0500 Subject: Graduate Signed-off-by: Matt Strapp --- csci4131/hw4/strap012/403.html | 11 ++ csci4131/hw4/strap012/404.html | 11 ++ csci4131/hw4/strap012/Coffman.html | 14 ++ csci4131/hw4/strap012/Coffman_N_OuttaSpace.html | 27 +++ csci4131/hw4/strap012/MyContacts.html | 114 ++++++++++++ csci4131/hw4/strap012/MyForm.html | 56 ++++++ csci4131/hw4/strap012/MyServer.html | 42 +++++ csci4131/hw4/strap012/MyWidgets.html | 149 ++++++++++++++++ csci4131/hw4/strap012/OuttaSpace.html | 18 ++ csci4131/hw4/strap012/OuttaSpace.mp3 | Bin 0 -> 735638 bytes csci4131/hw4/strap012/Untitled.png | Bin 0 -> 91 bytes csci4131/hw4/strap012/carlson.jpg | Bin 0 -> 39588 bytes csci4131/hw4/strap012/coffman.jpg | Bin 0 -> 7610 bytes csci4131/hw4/strap012/coffman.png | Bin 0 -> 161853 bytes csci4131/hw4/strap012/contacts.js | 221 ++++++++++++++++++++++++ csci4131/hw4/strap012/gophers-mascot.png | Bin 0 -> 82836 bytes csci4131/hw4/strap012/johnston.jpg | Bin 0 -> 47355 bytes csci4131/hw4/strap012/morrill.jpg | Bin 0 -> 48670 bytes csci4131/hw4/strap012/passwordcheck.css | 60 +++++++ csci4131/hw4/strap012/passwordcheck.js | 42 +++++ csci4131/hw4/strap012/private.html | 10 ++ csci4131/hw4/strap012/shepherd.jpg | Bin 0 -> 675244 bytes csci4131/hw4/strap012/snyder.jpg | Bin 0 -> 45356 bytes csci4131/hw4/strap012/strap012.py | 147 ++++++++++++++++ csci4131/hw4/strap012/style.css | 118 +++++++++++++ csci4131/hw4/strap012/walter.jpg | Bin 0 -> 150800 bytes 26 files changed, 1040 insertions(+) create mode 100644 csci4131/hw4/strap012/403.html create mode 100644 csci4131/hw4/strap012/404.html create mode 100644 csci4131/hw4/strap012/Coffman.html create mode 100644 csci4131/hw4/strap012/Coffman_N_OuttaSpace.html create mode 100644 csci4131/hw4/strap012/MyContacts.html create mode 100644 csci4131/hw4/strap012/MyForm.html create mode 100644 csci4131/hw4/strap012/MyServer.html create mode 100644 csci4131/hw4/strap012/MyWidgets.html create mode 100644 csci4131/hw4/strap012/OuttaSpace.html create mode 100644 csci4131/hw4/strap012/OuttaSpace.mp3 create mode 100644 csci4131/hw4/strap012/Untitled.png create mode 100644 csci4131/hw4/strap012/carlson.jpg create mode 100644 csci4131/hw4/strap012/coffman.jpg create mode 100644 csci4131/hw4/strap012/coffman.png create mode 100644 csci4131/hw4/strap012/contacts.js create mode 100644 csci4131/hw4/strap012/gophers-mascot.png create mode 100644 csci4131/hw4/strap012/johnston.jpg create mode 100644 csci4131/hw4/strap012/morrill.jpg create mode 100644 csci4131/hw4/strap012/passwordcheck.css create mode 100644 csci4131/hw4/strap012/passwordcheck.js create mode 100644 csci4131/hw4/strap012/private.html create mode 100644 csci4131/hw4/strap012/shepherd.jpg create mode 100644 csci4131/hw4/strap012/snyder.jpg create mode 100644 csci4131/hw4/strap012/strap012.py create mode 100644 csci4131/hw4/strap012/style.css create mode 100644 csci4131/hw4/strap012/walter.jpg (limited to 'csci4131/hw4/strap012') diff --git a/csci4131/hw4/strap012/403.html b/csci4131/hw4/strap012/403.html new file mode 100644 index 0000000..b73e28f --- /dev/null +++ b/csci4131/hw4/strap012/403.html @@ -0,0 +1,11 @@ + + + 403: FORBIDDEN + + +
+

403: FORBIDDEN


+ Go back to main page +
+ + diff --git a/csci4131/hw4/strap012/404.html b/csci4131/hw4/strap012/404.html new file mode 100644 index 0000000..304d6a0 --- /dev/null +++ b/csci4131/hw4/strap012/404.html @@ -0,0 +1,11 @@ + + + 404: NOT FOUND + + +
+

404: NOT FOUND


+ Go back to main page +
+ + diff --git a/csci4131/hw4/strap012/Coffman.html b/csci4131/hw4/strap012/Coffman.html new file mode 100644 index 0000000..1d68c4b --- /dev/null +++ b/csci4131/hw4/strap012/Coffman.html @@ -0,0 +1,14 @@ + + + + + A well known building + + +
+ Coffman +
+ + + + \ No newline at end of file diff --git a/csci4131/hw4/strap012/Coffman_N_OuttaSpace.html b/csci4131/hw4/strap012/Coffman_N_OuttaSpace.html new file mode 100644 index 0000000..655baa5 --- /dev/null +++ b/csci4131/hw4/strap012/Coffman_N_OuttaSpace.html @@ -0,0 +1,27 @@ + + + + + Gopher and Important Announcement + + + +
+ Coffman +
+

+ OuttaSpace +

+ + + + + \ No newline at end of file diff --git a/csci4131/hw4/strap012/MyContacts.html b/csci4131/hw4/strap012/MyContacts.html new file mode 100644 index 0000000..d30a03e --- /dev/null +++ b/csci4131/hw4/strap012/MyContacts.html @@ -0,0 +1,114 @@ + + + + + My Contacts + + + + + + + + +
+

University Contacts

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameCategoryLocationInformationEmailURL
Joan GabelIndustry100 Church Street SE
202 Morrill Hall
Minneapolis MN 55455
President of the University of Minnesota
upres@umn.eduHome Page
Mostafa KavehIndustry117 Pleasant St SE
105 Walter Library
Minneapolis MN 55455
Dean of the College of Science and Engineering
mos@umn.eduHome Page
John ColemanIndustry101 Pleasant Street SE
215 Johnston Hall
Minneapolis MN 55455
Dean of the College of Liberal Arts
coleman@umn.eduHome Page
Valery ForbesIndustry1475 Gortner Avenue
123 Snyder Hall
St. Paul MN 55108
Dean of the College of Biological Sciences
cbsdeans@umn.eduHome Page
Sri ZaheerIndustry321 19th Avenue S
Suite 4-300 Carlson School of Management
Minneapolis MN 55455
Dean of the Carlson School of Management
szaheer@umn.eduHome Page
+ + Goldy Gopher
+ + +
+
+
+
+
+ +
+ Directions to
+
+ + + + + +
+
+
+ + + + + diff --git a/csci4131/hw4/strap012/MyForm.html b/csci4131/hw4/strap012/MyForm.html new file mode 100644 index 0000000..43529cd --- /dev/null +++ b/csci4131/hw4/strap012/MyForm.html @@ -0,0 +1,56 @@ + + + + + + There is no form + + + + +
+

Simple Form

+
+

+ + + + + + +

+

+ + +

+
+
+ + diff --git a/csci4131/hw4/strap012/MyServer.html b/csci4131/hw4/strap012/MyServer.html new file mode 100644 index 0000000..7a2da07 --- /dev/null +++ b/csci4131/hw4/strap012/MyServer.html @@ -0,0 +1,42 @@ + + + MyServer + + + +
+

MyServer Page


+
+ + +
+
+ + + +
+
+
+
+ Go to MyForm page +
+ + diff --git a/csci4131/hw4/strap012/MyWidgets.html b/csci4131/hw4/strap012/MyWidgets.html new file mode 100644 index 0000000..cffd3b5 --- /dev/null +++ b/csci4131/hw4/strap012/MyWidgets.html @@ -0,0 +1,149 @@ + + + + My Widgets + + + + + + + + +

+ + + + + diff --git a/csci4131/hw4/strap012/OuttaSpace.html b/csci4131/hw4/strap012/OuttaSpace.html new file mode 100644 index 0000000..1ca6c63 --- /dev/null +++ b/csci4131/hw4/strap012/OuttaSpace.html @@ -0,0 +1,18 @@ + + + + +Sound Test + + +

+OuttaSpace +

+ + + + + \ No newline at end of file diff --git a/csci4131/hw4/strap012/OuttaSpace.mp3 b/csci4131/hw4/strap012/OuttaSpace.mp3 new file mode 100644 index 0000000..84d11e3 Binary files /dev/null and b/csci4131/hw4/strap012/OuttaSpace.mp3 differ diff --git a/csci4131/hw4/strap012/Untitled.png b/csci4131/hw4/strap012/Untitled.png new file mode 100644 index 0000000..92a4aa1 Binary files /dev/null and b/csci4131/hw4/strap012/Untitled.png differ diff --git a/csci4131/hw4/strap012/carlson.jpg b/csci4131/hw4/strap012/carlson.jpg new file mode 100644 index 0000000..d82c37c Binary files /dev/null and b/csci4131/hw4/strap012/carlson.jpg differ diff --git a/csci4131/hw4/strap012/coffman.jpg b/csci4131/hw4/strap012/coffman.jpg new file mode 100644 index 0000000..603870a Binary files /dev/null and b/csci4131/hw4/strap012/coffman.jpg differ diff --git a/csci4131/hw4/strap012/coffman.png b/csci4131/hw4/strap012/coffman.png new file mode 100644 index 0000000..f23b52c Binary files /dev/null and b/csci4131/hw4/strap012/coffman.png differ diff --git a/csci4131/hw4/strap012/contacts.js b/csci4131/hw4/strap012/contacts.js new file mode 100644 index 0000000..8518ef6 --- /dev/null +++ b/csci4131/hw4/strap012/contacts.js @@ -0,0 +1,221 @@ +function change(small, row) { + document.getElementsByClassName("smol")[row].src = small; +} +function lucky() { + var image = ["carlson.jpg", "johnston.jpg", "morrill.jpg", "shepherd.jpg", "snyder.jpg", "walter.jpg"]; + document.getElementById("bigboi").src = image[Math.floor(6 * Math.random())]; +} +let isRotating=0; +function dizzy() { + if (!isRotating) { + document.getElementById("bigboi").classList.remove("isntRotating"); + } else { + document.getElementById("bigboi").classList.add("isntRotating"); + } + isRotating^=1; +} +function check(value) { + if(value==="Other") + document.getElementById('others').style.display = 'block'; + else + document.getElementById('others').style.display = 'none'; +} +let map; +var center = { lat: 44.9727, lng: -93.23540000000003 }; +function initMap() { + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition( + (position) => { + curLoc = { + lat: position.coords.latitude, + lng: position.coords.longitude, + }; + }, + () => { + alert("Geolocation failed. Directions will not work."); + } + ) + } + map = new google.maps.Map(document.getElementById("map"), { + center: center, + zoom: 14, + }); + + var service = new google.maps.places.PlacesService(map); + entries = document.getElementsByClassName("entry"); + locations = []; + for (e=0; e" + + "" + newEntry.getElementsByClassName("name")[0].textContent + "" + "
" + + newEntry.getElementsByClassName("category")[0].textContent + "
" + + newEntry.getElementsByClassName("room")[0].textContent + " " + newEntry.getElementsByClassName("street")[0].textContent + "
" + + newEntry.getElementsByClassName("city")[0].textContent + + "", + }, + }); + marker.addListener('click', function () { + if (!this.infoWindow) { + this.infoWindow = new google.maps.InfoWindow({ + content: this.data.content, + }); + this.infoWindow.open(map, this); + } + }) + } +} +var service; +var otherRadius; +var searchMarker = []; +function searchPlaces() { + var request; + if (document.getElementById("places").value!="Other") { + request = { + location: center, + radius: document.getElementById("distance").value, + type: document.getElementById("places").value, + }; + service = new google.maps.places.PlacesService(map); + service.nearbySearch(request, (results, status) => { + if (status === google.maps.places.PlacesServiceStatus.OK && results) { + addPointsSearch(results, false); + } + }); + } else { + request = { + location: center, + radius: document.getElementById("distance").value, + query: document.getElementById("others").value, + }; + otherRadius = request.radius; + service = new google.maps.places.PlacesService(map); + service.textSearch(request, (results, status) => { + if (status === google.maps.places.PlacesServiceStatus.OK && results) { + addPointsSearch(results, true); + } + }); + } +} + +function addPointsSearch(locations, isOther) { + deleteMarkers(); + for (x in locations) { + var marker; + if (isOther) { + if (google.maps.geometry.spherical.computeDistanceBetween(locations[x].geometry.location, map.getCenter()) < parseInt(otherRadius)) { + marker = new google.maps.Marker({ + map, + title: locations[x].name, + position: locations[x].geometry.location, + data: { + content: "" + locations[x].name + "" + + "
" + locations[x].formatted_address + }, + }); + } + } else { + marker = new google.maps.Marker({ + map, + title: locations[x].name, + position: locations[x].geometry.location, + data: { + content: "" + locations[x].name + "" + + "
" + locations[x].vicinity + }, + }); + } + if (marker) { + marker.addListener('click', function () { + if (!this.infoWindow) { + this.infoWindow = new google.maps.InfoWindow({ + content: this.data.content, + }); + this.infoWindow.open(map, this); + } + }) + searchMarker.push(marker); + } + + } +} +function deleteMarkers() { + for (let i = 0; i < searchMarker.length; i++) { + searchMarker[i].setMap(null); + } + searchMarker = []; +} + +var curLoc, directionsService, directionsRenderer; +function directions () { + directionsService = new google.maps.DirectionsService(); + directionsRenderer = new google.maps.DirectionsRenderer(); + document.getElementById("transitList").textContent = ""; + directionsRenderer.setPanel(document.getElementById("transitList")); + directionsRenderer.setMap(map); + var selectedMode = document.getElementById('means').value; + var dest = { + query: document.getElementById("destination").value, + fields: ['name', 'geometry'], + }; + service = new google.maps.places.PlacesService(map); + service.findPlaceFromQuery(dest, function (results, status) { + if (status === google.maps.places.PlacesServiceStatus.OK) { + console.log(results); + doDirections(results[0]); + } + }); +} + +function doDirections(input) { + var means; + var mean = document.getElementsByName('means'); + for (var i = 0; i < mean.length; i++) { + if (mean[i].checked) { + means = mean[i].value; + } + } + + var request = { + origin: curLoc, + destination: input.geometry.location, + // Note that JavaScript allows us to access the constant + // using square brackets and a string value as its + // "property." + travelMode: google.maps.TravelMode[means] + }; + directionsService.route(request, function (result, status) { + if (status == 'OK') { + directionsRenderer.setDirections(result); + } + }); +} + +function initForm() { + map = new google.maps.Map(document.getElementById("formap"), { + center: center, + zoom: 14, + }); +} \ No newline at end of file diff --git a/csci4131/hw4/strap012/gophers-mascot.png b/csci4131/hw4/strap012/gophers-mascot.png new file mode 100644 index 0000000..44e62fa Binary files /dev/null and b/csci4131/hw4/strap012/gophers-mascot.png differ diff --git a/csci4131/hw4/strap012/johnston.jpg b/csci4131/hw4/strap012/johnston.jpg new file mode 100644 index 0000000..b8b7f68 Binary files /dev/null and b/csci4131/hw4/strap012/johnston.jpg differ diff --git a/csci4131/hw4/strap012/morrill.jpg b/csci4131/hw4/strap012/morrill.jpg new file mode 100644 index 0000000..144d458 Binary files /dev/null and b/csci4131/hw4/strap012/morrill.jpg differ diff --git a/csci4131/hw4/strap012/passwordcheck.css b/csci4131/hw4/strap012/passwordcheck.css new file mode 100644 index 0000000..beceb1c --- /dev/null +++ b/csci4131/hw4/strap012/passwordcheck.css @@ -0,0 +1,60 @@ +#password{ + margin: 0; + padding: 0; + font-family: 'Raleway', sans-serif; + font-size: 15px; + line-height: 1.5; +} +#container { + width: 535px; + background: #ffffff; + padding: 20px; + margin: 90px auto; + border-radius: 5px; + height: 150px; + border: 2px solid gray; +} +#header { + text-align: center; + background-color: #FEFFED; + border-radius: 5px; + margin: -39px -20px 10px -20px; +} +.password{ + padding-top: 10px; +} +#content { + margin-left: 57px; + margin-top: 40px; +} +#register label{ + margin-right:5px; +} +#register input { + padding: 5px 14px; + border: 1px solid #d5d9da; + box-shadow: 0 0 9px #0E34F5 inset; + width: 272px; + font-size: 1em; + height: 25px; +} +#register .short{ + font-weight:bold; + color:#FF0000; + font-size:larger; +} +#register .weak{ + font-weight:bold; + color:orange; + font-size:larger; +} +#register .good{ + font-weight:bold; + color:#2D98F3; + font-size:larger; +} +#register .strong{ + font-weight:bold; + color: limegreen; + font-size:larger; +} diff --git a/csci4131/hw4/strap012/passwordcheck.js b/csci4131/hw4/strap012/passwordcheck.js new file mode 100644 index 0000000..97a2918 --- /dev/null +++ b/csci4131/hw4/strap012/passwordcheck.js @@ -0,0 +1,42 @@ +var input; +var result = document.querySelector("span"); +window.addEventListener('DOMContentLoaded', (event) => { + input = document.getElementsByName("password")[0]; +}); +function checkStrength() { + var password = input.value; + var strength = 0; + if (password.length < 6) { + result.removeAttribute("class"); + result.classList.add('short'); + result.innerHTML = "Too short"; + return; + } + if (password.length > 7) { strength += 1;} + // If password contains both lower and uppercase characters, increase strength value. + if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) { strength += 1;} + // If it has numbers and characters, increase strength value. + if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) { strength += 1;} + // If it has one special character, increase strength value. + if (password.match(/([!,%,&,@,#,$,^,*,?,_,~])/)) { strength += 1;} + // If it has two special characters, increase strength value. + if (password.match(/(.*[!,%,&,@,#,$,^,*,?,_,~].*[!,%,&,@,#,$,^,*,?,_,~])/)) { strength += 1;} + // Calculated strength value, we can return messages + // If value is less than 2 + if (strength < 2) { + result.removeAttribute("class"); + result.classList.add('weak'); + result.innerHTML = 'Weak'; + return; + } else if (strength == 2) { + result.removeAttribute("class"); + result.classList.add('good'); + result.innerHTML = 'Good'; + return; + } else { + result.removeAttribute("class"); + result.classList.add('strong'); + result.innerHTML = 'Strong'; + return; + } +} diff --git a/csci4131/hw4/strap012/private.html b/csci4131/hw4/strap012/private.html new file mode 100644 index 0000000..85c0635 --- /dev/null +++ b/csci4131/hw4/strap012/private.html @@ -0,0 +1,10 @@ + + + Private + + +
+

This file should trigger a 403 response!!!


+
+ + diff --git a/csci4131/hw4/strap012/shepherd.jpg b/csci4131/hw4/strap012/shepherd.jpg new file mode 100644 index 0000000..d1262f8 Binary files /dev/null and b/csci4131/hw4/strap012/shepherd.jpg differ diff --git a/csci4131/hw4/strap012/snyder.jpg b/csci4131/hw4/strap012/snyder.jpg new file mode 100644 index 0000000..4531a58 Binary files /dev/null and b/csci4131/hw4/strap012/snyder.jpg differ diff --git a/csci4131/hw4/strap012/strap012.py b/csci4131/hw4/strap012/strap012.py new file mode 100644 index 0000000..31668af --- /dev/null +++ b/csci4131/hw4/strap012/strap012.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +# See https://docs.python.org/3.2/library/socket.html +# for a decscription of python socket and its parameters +import socket +import os +import stat + + +from threading import Thread +from argparse import ArgumentParser +from urllib.parse import unquote + +BUFSIZE = 4096 +CRLF = '\r\n' +NOT_FOUND = 'HTTP/1.1 404 NOT FOUND{}Connection: close{}{}'.format(CRLF, CRLF, CRLF) +FORBIDDEN = 'HTTP/1.1 403 FORBIDDEN{}Connection: close{}{}'.format(CRLF, CRLF, CRLF) +METHOD_NOT_ALLOWED = 'HTTP/1.1 405 METHOD NOT ALLOWED{}Allow: GET, HEAD, POST {}Connection: close{}{}'.format(CRLF, CRLF, CRLF, CRLF) +OK = 'HTTP/1.1 200 OK{}Connection: close{}'.format(CRLF, CRLF) # head request only + +# check file permissions -is file world readable? +def check_perms(resource): + stmode = os.stat(resource).st_mode + return(getattr(stat, 'S_IROTH') & stmode) > 0 + +# Puts together the HTML for the POST form return +def POST(form): + form = unquote(form) + form = form.replace("+", " ").split("&") + contents = "" + if len(form) == 0: + return contents + for x in form: + x = x.split("=") + contents = contents + "\n" + x[0] + "\n" + x[1] + "\n\n" + table = "" + contents + "
" + ret = "\n\n\n\n\nTest\n\n\n

\nFollowing Form Data Submitted Successfully:


\n{}\n\n".format(table) + return ret +#For Content Type +def getType(type): + if type == "html": + return "text/html" + elif type == "css": + return "text/css" + elif type == "js": + return "text/javascript" + elif type == "mp3": + return "audio/mpeg" + elif type == "jpg" or type == "jpeg": + return "image/jpeg" + elif type == "png": + return "image/png" + else: + raise TypeError + +def getContents(type, file, contents): + if type =="POST": + return b"".join( + [OK.encode(), "{}".format(CRLF).encode(), POST(contents).encode(), "{}{}".format(CRLF, CRLF).encode()]) + returnValue = "".encode() + try: + if file.split("?")[0] == "redirect": + contents = file.split("?")[1].split("=")[-1] + return "HTTP/1.1 307 TEMPORARY REDIRECT{}Connection: close{}Location:{}{}{}".format(CRLF, CRLF, "https://youtube.com/results?search_query=" + contents, CRLF, CRLF).encode() + if not check_perms(file): + raise PermissionError + content = open(file, 'rb') + except FileNotFoundError: + returnValue = NOT_FOUND.encode() + with open("404.html", "rb") as fof: + returnValue = b"".join( + [returnValue, fof.read(), "{}{}".format(CRLF, CRLF).encode()]) + except PermissionError: + returnValue = FORBIDDEN.encode() + with open("403.html", "rb") as forb: + returnValue = b"".join( + [returnValue, forb.read(), "{}{}".format(CRLF, CRLF).encode()]) + else: + returnValue = OK.encode() + if type == "HEAD": + returnValue = b"".join( + [returnValue, "{}{}".format(CRLF, CRLF).encode()]) + elif type == "GET": + ext = getType(file.split(".")[1]) + returnValue = b"".join( + [returnValue, "Content Type: {}".format(ext).encode(), "{}{}".format(CRLF, CRLF).encode()]) + returnValue = b"".join( + [returnValue, content.read(), "{}{}".format(CRLF, CRLF).encode()]) + else: + returnValue= METHOD_NOT_ALLOWED.encode() + content.close() + return returnValue + +def client_recv(client_sock, client_addr): + print('talking to {}'.format(client_addr)) + data = client_sock.recv(BUFSIZE) + data = data.decode('utf-8').strip("\r") + print(data) + data = data.split("\n") + request = data[0].split(" ") + if len(request) > 1: + want = getContents(request[0], request[1][1:], data[-1]) + client_sock.send(want) + client_sock.shutdown(1) + client_sock.close() + + print('connection closed.') + + +class EchoServer: + def __init__(self, host, port): + print("Server") + print('listening on port {}'.format(port)) + self.host = host + self.port = port + + self.setup_socket() + + self.accept() + + self.sock.shutdown() + self.sock.close() + + def setup_socket(self): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.bind((self.host, self.port)) + self.sock.listen(128) + + def accept(self): + while True: + (client, address) = self.sock.accept() + th = Thread(target=client_recv, args=(client, address)) + th.start() + +def parse_args(): + parser = ArgumentParser() + parser.add_argument('--host', type=str, default='localhost', + help='specify a host to operate on (default: localhost)') + parser.add_argument('-p', '--port', type=int, default=9001, + help='specify a port to operate on (default: 9001)') + args = parser.parse_args() + return (args.host, args.port) + + +if __name__ == '__main__': + (host, port) = parse_args() + EchoServer(host, port) + diff --git a/csci4131/hw4/strap012/style.css b/csci4131/hw4/strap012/style.css new file mode 100644 index 0000000..9f28572 --- /dev/null +++ b/csci4131/hw4/strap012/style.css @@ -0,0 +1,118 @@ +/* Global */ +body { + background-color:antiquewhite; +} +.linkTable { + border: 1px solid black; + margin-left: 20px; + background-color: white; + border-collapse: separate; +} + +/* Contacts */ +table, th, td { + max-width: 80%; + overflow-x:auto; + border: 1px solid black; + border-collapse: collapse; +} +table { + float:left; + max-width: 60%; +} +tr:nth-child(even) { + background-color:blanchedalmond; +} +tr:nth-child(odd) { + background-color: burlywood; +} +.smol { + max-height: 100%; + width: 6em; +} +.large { + float: right; + max-width: max-content; +} +#bigboi { + width: 25em; + height: 15em; + object-fit: cover; + margin-right: 0; +} +.isRotating { + animation:5s rotate infinite linear; +} +.isntRotating { + animation-play-state: paused; +} +@keyframes rotate{ + 100%{ transform:rotate(1turn) } +} +#map, #formap { + /* clear: both; */ + float: left; + padding-top: 30%; + margin-top: 1em; + margin-left: .2em; + width: 50%; + height: 30%; + max-height: 40%; +} +#formap { + float: right; +} +#transitList { + float: left; + width: 20%; + color: white; +} +.id { + text-align: center; +} +#googlymap { + width: 100%; + overflow: auto; + /* display: flex; */ + /* position: absolute; */ +} + +.inputBox { + float: left; + border: 1px solid black; + width: 25%; +} +.inputBox:nth-child(even) { + background-color:blanchedalmond; +} +.inputBox:nth-child(odd) { + background-color: burlywood; +} +#others { + display:none; +} + +/* Form */ +.Form { + float: left; + background-color: whitesmoke; + padding-left: 5%; + max-width: 25%; +} +/* Widgets */ +.grid { + align-content: center; + display: inline-grid; + grid-template-columns: 40% 40%; + grid-template-rows: 30%; + gap: .1em 10%; +} +.griditem { + padding: 10%; +} +iframe { + border: 0px; +} + + + diff --git a/csci4131/hw4/strap012/walter.jpg b/csci4131/hw4/strap012/walter.jpg new file mode 100644 index 0000000..37d0d56 Binary files /dev/null and b/csci4131/hw4/strap012/walter.jpg differ -- cgit v1.2.3