CMPSCI 187: Programming With Data Structures
David Mix Barrington
This is the home page for CMPSCI 187.
CMPSCI 187 is the second course in programming for undergraduate
computer science majors and deals with the design, use, and analysis
of important data structures, implemented in Java.
Instructor Contact Info:
David Mix Barrington, 210 CMPSCI
building, 545-4329, office hours for Fall 2011 Monday 11-12, Tuesday 3-4,
Wednesday 2:30-3:30, and
I generally answer my email fairly
TA Contact Info: Bobby Simidchieva,
firstname.lastname@example.org, office hours
Thursday 2:30-3:30, Navin Sharma,
office hours Wednesday 11:00-12:00,
and Hannah Blau,
(no office hours for rest of the term). TA office hours are in
LGRT 223 (changed as of 15 September) --
mine are in my office.
The course is primarily intended for undergraduates in computer science
and related majors such as mathematics or computer engineering. CMPSCI 121
(an introduction to Java programming) is a prerequisite. There is no formal
mathematics prequisite but readiness for MATH 131 (Calculus I for scientists
and engineers) is recommended.
The course meets for three lecture meetings a week, Monday, Wednesday,
and Friday, at 1:25-2:15, in Hasbrouck 134. (This room is near the north end
There is one discussion meeting per week, meeting on Wednesday morning.
There are two separate discussion sections, each to be led by one of the TA's.
Each section meets in ELAB 323 (on the west side of the building), Section 1
from 10:10-11:00 and Section 2 from 9:05-9:55.
Most discussions will have a written assignment which you
will carry out in groups, chosen randomly at the beginning of each discussion.
Discussion attendance is required,
so that missing a discussion
will incur a grade penalty. It is intended that the two discussion sections
be as interchangeable as we can make them.
The textbook is the third edition of Java Software Structures by
Lewis and Chase (Addison-Wesley, ISBN 0-13-607858-3). The first and second
editions of the book are substantially different and will not do. Lectures
will follow the book fairly closely (especially after the first few weeks)
but I will also make slides from the lectures available on this site.
The Lewis and Chase book is not a Java language manual. There are a
variety of ways to get information about the Java language -- two I like are
the official API's
for the language and the very inexpensive book Java Precisely by Peter Sestoft. Java
Precisely is intended more as a reference for people who already know the
language, but it has both all the details you aren't likely to ever memorize and
a very clear definition of exactly what the language is and what it does.
Announcements (27 December 2011):
- (27 Dec) The final exam solutions
are now posted. Happy Holidays!
- (25 Dec) The final exam is
posted -- the solutions will follow within a day or two.
- (23 Dec) I have graded the finals, computed final grades,
and posted them to SPIRE. I don't know when you will be able to see
them there, but if you email me I can send you your own grade as I
In general I think the final exam went well -- most people did
well on the first 80 points worth and the coding questions did a
good job of separating those who could write code from those who
The 90 final exam scores ranged from a high of 119 to a low of 34,
median of 82. I set the scale at A = 100, B = 84, C = 68, D = 52,
F = 36. The whole distribution:
- 110-119: 4
- 100-109: 10
- 90-99: 18
- 80-89: 20
- 70-79: 16
- 60-69: 6
- 50-59: 4
- 40-49: 7
- 30-39: 5
It turned out that 47 of the 90 benefited by having their final
exam counted as 40% of the course rather than 20%. The grade
of the course (for all 95 students registered, including five who
did not take the final) came out like this:
- A+ (on SPIRE as A, course citation issued): 4
- A (ordinary): 10
- A-: 12
- B+: 12
- B: 14
- B-: 11
- C+: 7
- C: 6
- C-: 6
- D+: 5
- D: 4
- F: 4 (none of whom took the final)
Student with grades below C should retake CMPSCI 187 before
a 200-level core course or any other course that has 187 as a
The department currently plans to offer 187 over the summer as
as this coming spring. If you retake a course when the first
is below C, only the second
figures into your GPA although both appear on your transcript.
I should have the final exam and solutions to it posted in
the next day or two. Thanks to all of you for an enjoyable
and for your thoughtful comments on the course evaluations. I
look forward to seeing around half of you next term in CMPSCI 250.
- (12 Dec) The solutions to
the practice final exam are finally up. Also, grades for
Project #7 are now posted to the edlab accounts.
- (10 Dec) I have posted solutions to
Project #7. I plan to post solutions to the practice exam
sometime tomorrow. On Monday 12 December, I will hold a review
session from 11 a.m. to noon in room 151 of the Computer Science
Building. I will also be generally around Monday afternoon to
- (7 Dec) I have just put up the practice exam and the Q&A pages for HW #4 and Project #7. I
will add to these Q&A's as I can tomorrow.
- (7 Dec) Friday's lecture will have a lot of review of the
entire course, after I say a bit about maps. I will have a review
session where I go over the solutions to the practice exam and
answer any questions -- this will be Monday 11 a.m. to noon,
somewhere in the CMPSCI building to be announced.
- (6 Dec) I didn't make clear until now that the "size" field of a
PrefixTree should store its number of leaves, not the number of nodes. (It
should tell how many strings the tree is storing, and the empty string in the
initial tree does not count. You may assume that all strings that are added
are the same length, so that every
addString operation with a new
string adds 1 to the size. (Things would be more complicated if we could add
a new string that was an extension of an old one.)
You will not lose points for handling "size" incorrectly, but the stub
driver checks your tree after it is created to see whether its size (number of
leaves) is 5757, the number of words in Knuth's list.
I have heard from two students who have finished the project and ran the
list ("*****"), which should create an array of all
5757 words, sorted by Scrabble score. One took an hour and a half to run, the
other just over a minute. The hour-and-a-half one is probably doing something
suboptimally, perhaps not using the prefix tree effectively to prune the search
- (6 Dec) A stub driver is now avialable in the
Project 7 solutions directory.
- (1 Dec) I've made some small changes in the stub code for Project 7
to facilitate our grading, and your code should include these changes. The
class PrefixTree.java now has a method
contains to test whether a particular string has a node
in the tree. This will allow us to test your tree, and you may want to use
it in your
list method and/or adapt it to make your
addString method. I have also added a
getTree method to
- (1 Dec) Project #5 grades have been released. As with earlier
projects, if you would like to dispute your grade on account of a small
error that the TA's were unable to correct, please (1) run your code with the
grading driver, which is available as Driver.java in the
Project 5 Solutions Directory, (2) determine whether small changes
will lead to much better performance, and (3) email new code and a description
of the changes to Bobby. This is not an invitation to massively
revise your project, but just to correct harsh treatment of certain minor
mistakes (and isn't it about time you stopped making those mistakes, or caught
them before submitting?).
- (27 Nov) Hannah will be unable to hold her office hours
for the remainder of the semester. Grading and other TA inquiries
should go to Bobby and Navin.
- (27 Nov) I hope you had a good holiday. I've now posted the last homework assignment and some more detail on the last programming
I emailed solutions for last week's
discussion, and text for that will be up later tonight. Those
had slight errors on Questions 1 and 2 -- I will email a corrected version.
- (20 Nov) I have posted lecture slides for last Friday and tomorrow, and a preliminary version of the
last project. I have done about 2/3 of
the grading, and set the scale at A = 84, B = 72, C = 60, D = 48, F
= 36. I may or may not finish before tomorrow's lecture -- I will
give it a shot.
- (19 Nov) I have posted the third
midterm and its solution. I hope
to return graded exams on Monday. I also owe you the Project #7
assignment, which I outlined at the end of lecture yesterday. I
hope to post this sometime this weekend.
- (14 Nov) A reminder that tonight's exam is in Morrill 2 room 131, the
same room as the second midterm.
- (14 Nov) I have just posted solutions
for Project #6, so you may look at them before the test Monday night.
- (13 Nov) Between my show and the set strike for it, I'm
going to be away from email until fairly late tonight. If you have
questions on Project #6, you could email all three TA's and it's
possible one of them will answer, though they have no obligation to
be working on the weekend.
- (12 Nov) I have posted the text
for Discussion #9, and emailed solutions to the whole class.
- (12 Nov) I have posted the practice
exam solutions. I owe you text and solutions for last
Wednesday's discussion, which I will post and email respectively,
- (12 Nov) I expressed some doubt in lecture last Wednesday as
to whether my quicksort code on page 6 of the lecture
slides was correct. I checked later and it is correct -- the only change I
made in L&C's code was to be consistent that the minimum element
of the range, rather than the middle element, is the chosen pivot.
thing I needed to check was that placing the element
min meets the spec, and it does.
- (11 Nov) I will post solutions to the practice exam
tomorrow, and go over those as part of the review during lecture
period on Monday.
- (10 Nov) The practice exam
is finally up -- sorry for the delay.
- (9 Nov) Ok, the driver that is up there should be fine now.
The problem we just fixed was that the driver assumed that you had a
getSortedTeam in the class
DogTeam, where we didn't tell you to use that name.
- (9 Nov) I somehow managed to break Navin's driver on the
Project #6 solutions page -- I will post here when it is fixed.
- (9 Nov) Graded HW#2's will be returned in lecture today. Project #4
grades will be posted to the edlab accounts soon, probably today or tomorrow.
I had hoped to post a practice exam last night but it will be tonight (you were
all working on homework anyway). There is now a more complete driver posted
for Project #6 (though note that passing this driver's tests is not a
guarantee of full credit).
- (9 Nov) This Friday is a holiday, but Hannah has generously offered to
hold her office hours anyway from 10-11 in the usual place.
- (8 Nov) I have started a Q&A page for Project #6.
- (7 Nov) I've corrected a few errors in the slides for today's lecture.
- (6 Nov) The lecture slides for tomorrow
are now posted. Note that the following lecture on Wednesday is the
last before the third midterm on 14 November, since Friday is a
holiday and the following Monday will be an optional review
session. The exam will cover chapters 6, 7, and 8 of the book,
though we won't get to say much about Section 8.3. I had hoped to get you a practice exam by tomorrow night,
but it will more likely be Tuesday night, 8 November. (As another
calendar note, we do have discussion this coming Wednesday, 9
November, but not the following Wednesday, 16 November, which UMass
has declared to be a Friday.
- (3 Nov) Note that there are now some corrections on the Homework #3 assignment page.
- (3 Nov)
I have just posted the text for yesterday's
discussion on Fibonacci numbers, and emailed the solutions to the class
roster. I've also posted the draft text and
code base for Project #6, which is due a week from
Sunday. There might be small changes in this if errors are discovered, but if
you are ready to start working on it, go for it -- your time will not be
- (3 Nov) I've heard from one student who is still without power and has been
unable to start Project #5. If you cannot make the new Friday deadline
because you are in that position, please let me know -- I may be able to do
something. I will be at an all-day faculty meeting off campus tomorrow but
I should be able to see email at least some of the time.
- (2 Nov) As I mentioned in lecture today, I am performing (as a chorus
member, a rural English dairyman with a hat like Tevye's in Fiddler on
the Roof) in Valley Light Opera's production
of Gilbert and Sullivan's The Sorcerer. There is a preview show
(only $10 general admission) this Friday, then evening shows on 5, 11, and
12 November and matinees on 6 and 13 November, all at Amherst High School.
It would be totally unethical, unfortunately, for me to give extra credit for
attending, so come only if you like music, silliness, brilliant sets and
costumes, and/or late Victorian England.
- (2 Nov) I have posted the third homework assignment,
due a week from today. I have power at home but so far no internet, so I
will not answer email tonight.
- (31 Oct) Navin's office hours on Wed 2 November will be 12-1 rather
- (31 Oct) I hope you are dealing successfully with the aftermath of the
snowstorm. We have lost today's lecture (and my office hours) -- as a result
I am extending the deadline for Project #5 to Friday 4 November at 11:59 p.m.,
and Lectures 22 and 23 will be on Wednesday and Friday. I will update the
syllabus sometime today. Project #6 will be posted
this week and due Sunday 13 November at 11:59 p.m., almost 24 hours before the
third midterm. HW #3 will be posted soon, probably today, and will be due in
lecture on Wednesday 9 November. We will have discussion as planned on
Wednesday, assuming that the University is open.
- (29 Oct) OK, the Project #5 Q&A is
- (29 Oct) I don't yet have the Q&A page for Project #5 or the
text of Homework #3, but I do have the slides for the lectures for
Monday and Wednesday finished. If I don't lose power
to the snowstorm (unfortunately a possibility, with the leaves still
on the trees) I might get the other things (and Lecture #24) done tonight.
- (28 Oct) We don't yet have our driver program for Project #5 up
yet, but we have posted a driver (untested by us) that was contributed by
a student and also a file with some of the preliminary alterations
necessary to the Project #4
Maze.java class to use it in this
project. See the Project #5 solutions page for
- (28 Oct) Text for Discussion #7 is up.
I'll email my solution later this morning. I found writing the code for the
add method particularly tricky. I'll be interested to see
what you come up with, and I may well wind up giving A's on the discussion
for groups that got everything else.
- (26 Oct) If you downloaded Lecture #20 before today's class, note
that I have corrected two errors in the code (on page 8 and 9) that were
pointed out there. Here is the new PDF version.
- (26 Oct) Graded midterms were returned today in discussion and lecture. I will have some more stats on them soon, but the scale was 82 = A and 54 = C as announced. The median score was in the B range, just as for the first midterm.
- (26 Oct) Project #3 has been graded. We gave you a "dummy driver" before the assignment was due, so that you could catch some of the errors that made your Project #2's not compile. We were very clear (I hope) that passing the dummy driver's tests was not a guarantee that your program was correct or even near correct. A large fraction of Project #3 submissions did not compile when the TA's tested them with a new, more thorough driver. They have been able to detect some systemic errors that caused some of these, but not all.
I know that a lot of you are unhappy with your Project #3 grades. I have
just put the grading driver in the project 3 solutions
directory on this web site. If you want to dispute your project 3 grade,
first run your code with that driver and determine for yourself what you would
need to change to make things work. If these changes are small, email your
new code to all three TA's and they may be able to reevaluate the grade.
- (24 Oct) The Project #5 assignment
is up. I have so far given you code for the new cell class -- over
the next few days we will give you a sample driver and a new
constructor for mazes. This project is due a week from Wednesday.
- (22 Oct) I have taken time out from grading midterms to
write and post solutions. I am over
half done and should have them ready by Wednesday. The scale will
in fact be A = 82, B = 68, C = 54, D = 40, F = 26. The median so
far is 68, exactly a B.
- (21 Oct) I have posted the text of
the second midterm. I will post the solutions after I have
done more of the grading.
- (20 Oct) I have started grading exams -- the scale will probably
be about ten points lower than for the first midterm, maybe A = 82
and C = 54. Since I will be away on Monday (Prof. Brian Levine will lecture
in my place), I will probably not have graded exams ready until Wednesday.
- (20 Oct) I have posted Discussion #6 and
will email out a solution this afternoon.
- (20 Oct) The assignment for Project #5 will be posted sometime over
the weekend and that project will be due on Wednesday 2 November. Project
#6 will be due sometime on the weekend of 12-13 November. Homework #3 will
be due on Wednesday 9 November in class. The third midterm will be on the
evening of Monday 14 November.
- (18 Oct) I have added Navin's solution (the
file) to the Project #4 solutions directory.
- (17 Oct) I have emailed out solutions to HW#4 (which
say "HW#2" on the first line. The Project #2 grades have been
in your directories on the edlab.
- (15 Oct) The solutions for the
practice midterm are now up.
- (15 Oct) I have just posted some questions and answers for
Homework #2 and Project
Next up will be practice exam solutions -- remember that Monday's
"lecture" will be a review for the second midterm, including going
the practice midterm solutions.
- (15 Oct) Navin will be away at a conference all next week
will not have his regular office hours.
- (12 Oct) I have posted the assignment
this morning's discussion, but I can't currently email you a
because SPIRE is hosed. (Perhaps I should go back to HW#1 and
deduct points from people who said how reliable it is?) I have put
solution code for Project #3 here, and have
the Cell, SCell, and QCell classes for Project #4
here. (The QCell class is not yet up on the edlab but will be
-- you may copy it from this site in the meantime.)
- (12 Oct) The practice exam is up.
- (10 Oct) The Project #4 assignment
is now ready, due a week from tonight. There are a
expected output for it on this site.
- (10 Oct) Here is
the dummy driver for Project 3. The intended output is
here. Note that this tests
only the basic functionality of the DropoutStack class, not resizing
or the ProjectThreeStack.
- (9 Oct) I've also started a Q&A page
Homework 2, which so far has one question which necessitated a
correction on the assignment page.
- (9 Oct) Also note that I have switched the topics for
lectures #15 and #16 (this Wednesday and Friday) because the
implementation of queues is emphasized more on the homework and the
upcoming exam. Remember that Monday 18 October's "lecture" is an
review for the exam, so Friday's is the last new material of the
quarter-term. The third quarter of the course will not be as rushed
as the second -- they came out slightly uneven in my planning,
mostly so you could have the second exam before the W-drop date.
- (9 Oct) I've posted the Q&A page for
Project #3, and the lectures for Tuesday and Wednesday.
- (6 Oct) I have just posted the HW #2 assignment,
due in lecture on Monday 17 October. Programming Project #4 will be due at
11:59 p.m. that night, and the test will be the next evening, Tuesday 18
October. I plan to post a practice test by this coming Tuesday.
- (6 Oct) Remember that Monday 10 October is a holiday and regular office
hours will not occur. Tuesday 11 October will be a Monday schedule, so lecture
and office hours will occur as for a Monday.
- (6 Oct) The TA's report that a disappointing number of Project #2
submissions do not compile in the presence of the driver, meaning that even if
the filed compiled individually, they had packages or incorrect class names
that made them incompatible. For Project #3, we will try to put up a dummy
driver that you can use to at least make sure that your code does not have
It would be reasonable to simply give an F to any submission that won't
compile, and we may be forced to do that if we keep having to spend lots of
grading time dealing with such submissions. Please test your code, both to
guide your own progress and to make it possible for us to evaluate your work.
Please also reread the notes from the TA's below in the entry for 26
- (4 Oct) Links should be fixed, and tomorrow's lecture is posted.
- (4 Oct) Midterm #1
solutions are up here,
and I will put in the links to them soon.
- (4 Oct) I am running a little behind -- text of the midterm is up, and the solutions
will follow later today or tonight along with tomorrow's lecture.
Of the 95 exams I graded, the high was 97, the median 80, and the
low 29. The scale was A = 92, B = 80, C = 68, D = 56, F = 44. I
handed out most of the graded exams in lecture yesterday, and I will
bring the rest to both discussion and lecture tomorrow.
- (30 Sept) The Project #3
assignment is now up. I've also just posted solutions for Project #2, which I meant to do
- (30 Sept) Project #1's are graded and individual files have been
put in your directories. (And since about 11:45 this morning they have been
readable.) The aggregate for the 103 people on the roster at the time is:
44 A's (including 3 A-), 33 B's (including 4 B+, 2 B-), 13 C's (including 1 C+,
2 C-), 6 D's, and 6 F's.
- (30 Sept) I plan to post the Project #3 assignment by tonight, and
the Midterm #1 exam and solutions sometime over the weekend, depending on how
the grading of midterms goes. Project #3 will be due Tuesday 11 October, and
Project #4 the following Monday -- I will thus try to make Project #4 brief!
- (29 Sept) I have just posted the Discussion
#3 assignment -- I will email out solutions shortly. Grades for Project
#1 should be released later today -- you will get a file in your edlab
- (29 Sept) Hannah will not hold her office hours tomorrow. There is
no current homework or project due, so I hope that won't be a problem. I will
post Project #3 sometime later on Friday -- it will be due on Tuesday 11
October and the brief Project #4 will be due on Monday 18 October.
- (29 Sept) By the way, the Red Sox suck and I hate them.
- (27 Sept) I emailed solutions to HW#1 last night -- I don't want to
put these on the web in case we want to reuse questions next term.
- (27 Sept) A reminder about the time and place of the midterm -- it
is Thursday 29 September, 7-9 p.m., in Marcus 131.
- (26 Sept) I have some important notes from the TA's about things
they observed with Project 1 and would like you to keep in mind for Project 2:
- Please make sure that your code conforms to the project specifications.
If the methods that the user is going to run do not have the given names, the
program is useless to the user (and difficult and time-consuming for the TA's
- Some students gave their methods the right name but the wrong return
type, making the signature wrong. A method that is meant to return a value
should return a value, even in a stub version -- declaring it void makes it
a different method entirely with the wrong signature.
- Java requires that each class be submitted in a separate .java file,
except in the case of inner or nested classes, which we are not doing in 187.
- Please do not put your classes in a package.
- Remember that starting with Project #2, the classes for each project
should be in a subfolder of your 187 folder, called for example "project2".
- (26 Sept) I've put up the lecture
for this afternoon and the
solution to the practice exam. At least staying up for the Sox
game was worthwhile tonight.
- (25 Sept) I've spent most of the afternoon posting answers to
questions on Homework #1 and
Project #2. I have almost finished the notes for Lecture #9 tomorrow, and
will probably post them tonight. I also hope to post the solutions for the
practice exam tonight.
- (25 Sept) I believe I have now had recent contact with everyone planning
to take the first midterm at other than the assigned time and place. If you
are such a person and have not had recent contact from me, please email me.
- (23 Sept) I have posted the practice
exam for Midterm #1. The exam will be next Thursday evening, 7-9
in Marcus 131. I hope I have now heard from everyone needing an
time for the exam.
- (19 Sept) As mentioned in lecture today, the library's
Learning Resource Center has group tutors available for long periods
Sunday through Thursday (not just Sunday and Monday as I said in
class). The LRC's schedule is here, and you can get the tutor
schedule from that page by clicking on "Tutor Schedule" and
scrolling down to CMPSCI 187. This service is free.
- (19 Sept) I have already gotten some good
questions and answers on Project #2, two of which have led me to
make corrections on the assignment. Clearly not everyone is working
feverishly on Project #1 today...
- (19 Sept) Ok, I am going to bed with Project 2 and Lecture
7 done, but not Lecture 8.
- (18 Sept) I have posted tomorrow's lecture
and hope to post Project #2 and Lectures #7 and #8 later tonight.
- (17 Sept) I have posted the first homework
assignment, due a week from Monday. I hope to post lecture notes for
week tomorrow afternoon, along with Programming Project #2.
- (15 Sept) We have moved the three TA office hours from LGRT 220 to
LGRT 223, to give physical access to the EdLab computers during the office
hours. Remember that these machine rooms are available to students only when
a TA is holding office hours there for some course. EdLab machines are always
- (15 Sept) Prof. Moll has graciously given all of you access to his
textbook for CMPSCI 121. What you need to do is (1) point a browser to
owl.cs.umass.edu, (2) Click on "Computer Science" in the list of UMass
entities at the bottom of that page, (3) log in to OWL using your 8-digit
student ID as your username and your last name as password (unless you
already have an OWL (not OIT, not EdLab) account in which case you use your
existing password), (4) go to the "iJava eBook only course" if you are not
taken there already, and (5) follow instructions there to read the book.
- (15 Sept) There is a department talk of general interest tomorrow at
4:00 in room 151 of the Computer Science Building. Gerry Tesauro of IBM will
speak on "How Watson Learns Superhuman Jeopardy! Strategies".
- (12 Sept) Question P1.10 on the Q&A
now has more advice about how to copy a file from your own
computer to an Edlab computer.
- (10 Sept) I have been reminded that the planned date for the
first evening exam, 29 September, is during Rosh Hashanah, affecting
at least one student. I would like to arrange for all affected
students to take a makeup at the same time if possible -- please
email me if you do not want to take the exam at the scheduled time
for religious reasons. Here is
the University policy on religious holidays and a list of the ones
they know about.
- (10 Sept) I have put more questions and answers on the Q&A page for Project 1. This includes
advice on how to get access to the EdLab, and a correction of a
small error of mine, found by a student. The assignment page has been corrected.
- (8 Sept) I've posted the first
assignment, due a week from Monday. I've also posted the first
question and answer on that assignment.
Check back at this page, as I will add more answers as I get more questions.
- (6 Sept) I cannot make my posted office hours today because
of the CNS Convocation.
- (2 Sept) Added adjustments to office hours, link to Sestoft book.
- (1 Sept) Syllabus is now complete, instructor and TA office hours
added. The class begins with the lecture at 1:25 on Wednesday 7 September
in Hasbrouck 134.
- (30 Aug) If you would like to take CMPSCI 187 but cannot register
on SPIRE, please email me and/or come to the first lecture.
- (19 Aug) This section of the main page is in effect a blog for
announcements about the course. Please check it frequently. Today I am putting
up this main page -- next goals are the requirements page and the syllabus.
Please email me if you have questions about enrollment in the course. We
have room for some more students, and if we want you in the course we can
override you in even if SPIRE will not admit you directly.
I last taught this course in the dark ages of Fall 2002, before I was
keeping course web pages. I thus can't, as usual, point you to prior web sites
for the same course, but you can see (off of my home page) my web sites for
Last modified 27 December 2011