Source: https://www3.cs.stonybrook.edu/~amione/CSE307_Course/archive/Fall2019/materials/assignments/Assignment_4.Installing_PLY.pdf