April 29, 2009 Tests from yester year
April 27, 2009 End of course survey
April 27, 2009 MTDemo.java
April 24, 2009 I think I am going to cry
|
Updated versionMovie and TheaterOn your honor do not look at the file until after you complete the quiz. The final homework assignment is to write three of its methods. The total amount of code you need to write is about twelve lines.First righteous praiseI saw a bunch of code before class, during class, and after class. I have been impressed with the quality of your solutions. If you are not yet done, review my new notes and the previous notes. Make sure you read carefully. Now gotchas, help, and adviceThere are two IM.java methods for determining folder names: getXimuLocation() and getXimuPage().
To tests two strings if they look the same, uses the equals() method. For example, to see performs some action if string word has the value "here", then the code would be:
if ( word.equals( "here" ) {
// person is logged on ...
Some people have never run the Setup program or never done it correctly. To run it correctly:
Some people have more than one version of IM.java, ConsoleIM.java, and XIMU.java on their machines. Mismatches then occur when the programs are run and you get et errors even though your IM.java is okay. To make sure this is not happening to you.
If you run XIMU.java and a window pops up with a single button, your files are out of sync and perform the action list suggested above. Whenever you make a change to IM.java, recompile it, before running ConsoleIM.java or XIMU.java. If the folder for a Connection is not a web folder, then you can use that Connection to help you print to the file that the Connection represents. You can do so because every Connection has a behavior method getWriter(). The getWriter() method for a Connection returns a PrintStream object. Every PrintStream object has methods print() and println(). When a PrintStream object uses it print() and println() methods it updates the output source. If a PrintSteam object is System.out, then the print() and println() methods update your desktop. If the PrintSteam object is tied to a file, then those methods update the file. For example, suppose the string variable message has the text you want to display and Connection variable c is the Connection object for the file whose contents are to be updated, then the following code causes the file to be modified. PrintStream output = c.getWriter(); output.println( message ); It may be that the other IM.java methods that you were responsible for writing are preventing your getMessage() and sendMessage() from working. Below are the two methods most previously required. The other two are posted further below. |
|
April 23, 2009 Tomorrow is class picture day!
|
Updated versionMovie and TheaterRemember you were asked to thing about for tomorrow what attributes constructors, and behaviors would be appropriate for a Movie class concerned with keeping track for a movie at what theaters it is playing, and for a Theater class that would be keeping track of what movies it is showing. IMThe two methods currently under consideration are sendMessage() and getMessage().
void sendMessage( String person, String contents ): sets the current message for person to be contents String getMessage( String person ): returns the current message from person |
April 22, 2009 What a day
|
ReviewA Java class allows us to define a new type of object. The intent of a Java object is to model some piece of information or real word obect. Like real world objects, software objects have to be made. The making of a software object is called construction. Also like real word objects, a software object can have attributes and behaviors. To support the making of objects, Java allows a software designer to specify special methods called constructors. The purpose of a constructor is to configure the attributes a new object. A designer typically defines a default constructor. The default constructor configures the attributes of a new object to appropriate default values. A designer also oftens defines other constructors called specific constructors. A specific constructor has information passed to it through its parameters that guide (specify) how the object is to be configured. Constructor definitions are easy to spot with in a class definition. As a constructor is a method, its definition resembles other method definitions except in two ways. The name of a constructor is always the same as the name of the class. The requirement seems reasonable to most. The constructor makes the object so why not name it after the class. In addition, a constructor does not have a return type. The reason being its seems redundant. A constructor for some class by its nature always produces an object of that class so why be verbose. The attributes of an object are specified using variables. Some software developers refer to attributes as fields. This name harkens back to how information was represented in an earlier programming languages. I for one do not use the term. An object is a more powerful and natural device and deserves a more suitable terminology. Programmers also refer to attributes as instance variables. Although appropriate -- an object is a particular instance of its class type and the attributes are the variables that hold values that describe the instance -- the name is awkward (especially for new programmers). So I try to consistently use attributes when describing an object. It is easy to tell whether a variable definition is defining an attribute or a local variable. Local variables are defined within methods, and attribute variables are not. Another thing to know about attribute variables is that even before a constructor configures a new object, Java has assigned values to the attributes. Numeric attributes are preset to 0, logical attributes are preset to false, and all other attributes are preset to null. The members of a class are defined one after another within the curly braces demarking the definition. A member can be an attribute, a constuctor, or a method describing an object behavior. A method describing an object behavior is often called a message method. It has this name because using the method is essentially sending a message to the object to carry out the behavior. A message method is different than the service methods we considered earlier. A service method performs an action independent of a particular object. A service method is often called class method -- the method belongs to the class itself rather than being associated with an object. For example, throughs its Math library Java provides a service method tan() for determining tangents. The method invocation Math.tan( 1 ) tells the Math library to compute and return the tangent for the angle whose degree is 1 radian. As an example of an object behavior,
the message method contains() from ArrayList queries a list
whether it contains a particular value. If list was an
ArrayList You can tell from the beginning of the method's definition whether it is a message method or a class method. A class method must use the keyword static; a message method is not allowed used to the keyword static. Methods we intend for users of the class to use are given the label public; methods intended for just internal use by the class can be given the label private. A private method cannot be accessed outside of its class. Attributes are often made private for safe keeping. Users of the class are made use to accessor and mutator methods to access and manipulate the attribute. We call this information hiding. The accessor and mutator methods can be written to ensure that the object is always treated sensibly. For example, an object to represent rational numbers could make sure that its mutators never allow the denominator to become zero. Accessor methods are colloquially called getter methods -- they give the user access to an attribute value. Mutator methods are analogouslly called setter methods -- they give the user the ability to set an attribute value. For commonality, Java ensures that every object has three behaviors. They are the clone() method that returns a duplicate of the object; the toString method that returns a text representation of the object; and the equals() method that tests whether the object passed to the method matches the object being sent the equals message. I and others, as well, call methods clone(), toString(), and equals(), "the gang of three". If a class designer does not define one of the gang, then the class inherits one. The inherited methods are typically unsuitable, so a good class designer explicitly provides them. Constructor and message definitions have access variable named this. Consider the this variable to be one automatically set by Java. For a constructor, the value of the this variable is the new object itself. For a message method, the value of the this variable is the object being sent the message. To consider a particular class on which to consider for the review, we use the simple class Article for representing the title and author of an article. 01. public class Article {
IMThe two methods currently under consideration are initializeFriends() and updateWhoseOnline().
|
April 20, 2009 What did we learn today
|
Nuts and boltsOne Calculator question came up multiple times. What happens if the value of parameter n to method divide() is zero. The answer is do nothing and be silent about it (no warnings are necessary or even wanted). After the quiz, we spent a lot of time making sure we all had the right mental model of how our instant messenger makes use of local folders and files and use of web folders and pages. Suppose your email id mst3k. We saw that the home directory subfolder J:\public_htm\ximu and the web folder http://www.people.virginia.edu/~mst3k/ximu are two different ways to refer to the same folder. The class IM provides two methods for getting a hold of ximu folders. If im is an IM object, then
defines and sets lx to be the name of the local folder. If the user was mst3k, then lx would be "J:\ximu". And the defintion
defines and sets wx to be the name of the web folder for person named by p. If the person p was myself, then wx would be "http://www.people.virginia.edu/~jpc/ximu". Both getXimuLocation() and getXimuPage() are already implemented for you. Sweet. We reviewed the attributes of an IM object. One of the attributes is an ArrayList of friends. The IM getter method getFriends() gets us access to the list.
defines and sets list to refer to the friends by the user of the IM. We remembered that every ArrayList object has a message method contains(). If list is an ArrayList object, then list.contains( v ) reports whether one of the elements of list has the same value as v. We saw that class Connection can be pretty handy. Consider the statement
creates a new Connection named c. Object c represents a connection to the file named by n within the folder named by f. It got mentioned (stressed) that with a Connection object we can set up a Scanner to read from the associated file (regardless whether the file is a local file or a web page).
It also got mentioned that with a Connection object we can set up a PrintStream object to write to the associated file (the file must be a local file).
And with that PrintStream object we can issue println() and print() instructions to put text into the file.
IM method isFriend() has a simple implementation.
IM method isLoggedOn() is also not that difficult to implement.
People asked how can we test the two IM methods due Tuesday. My suggestion modify method main() of ConsoleIM.java to try out the methods. For example, if im is and IM object, then
should display false as Craig was not added to anyone's friend list. The code segment
should display true as "jpc" was added to everyone's friend list. The code segment
should display false both times as Craig is not a friend and Blake always has her status set to gone. The code segment
should display true as I am a friend who is always logged on. You could also test out yourself. If you are running the instant messenger then you are logged on. |
April 20, 2009 May I have your attention please
|
Files of ongoing interestNow back to our regularly scheduled showDeveloping your object-oriented skills has been our focus for the last couple of weeks. The primary examples have been:
That was then, this is nowIts now time to develop a class for something cool -- instant messenging. Something for you to show your friends and relatives how much you have learned.Believe it or not, the instant messenger we are going to develop is relatively simple to implement. So let's begin. The two most important features of an instant messenger are its abilities to receive and send text. To get or send a message, a network connection between your instant messenger and your friend's instant messager needs to be established. Java provides sophisticated resources that can ensure proper and secure linkage between the instant messengers but we are not going to use them. They are a little cumbersome to use and figuring them out is not the purpose of this assignment. What I want and what you need is practice doing class design and implementation -- developing a nontrivial collection of attributes, constructors and message methods that provide the expected capabilities for some object type. To send and get messages we are going to make use of one of the nice services that UVA provides to all members of our community -- the home directory folder. As part of the home directory client we can make some of our files readable on the world-wide-web. We are going to use that ability to put messages in a web-readable subfolder for our friends to read and get messages from their corresponding web-readable subfolder. We have been reading web files for most of the semester so doing that is no big deal, but we have not written files. I guess that situation is my fault. To make reading and writing files simple, I have developed a class called Connection. This class allows you to develop an object associated with either a local file or web page. The class provides a method to get a hold of a Scanner by which you can read its text. The class also provides a method that lets you get a hold of a writer that lets you display text to the file (the file has to be locally named and owned -- you cannot arbitrarily write pages to someone else web folders).
Our instant messenger class will be named IM.java. Every IM object will have four attributes:
Surprisingly -- at least is seems surprising to me -- its easier to send a message then to get a message.
if the person is a friend and is online then Write the contents to a file name by person in the user's ximu folder. Suggestion: use class Connection to get a PrintScream that can handle the printing. Do nothing if the person is not an online friend then return null return null Set up a Scanner (think Connection for
help) that reads from the the file whose name matches the
user's name from the person's online ximu web
folder.
| |
April 17, 2009
|
Weekend update
|
April 17, 2009
|
Nothing pithy
|
April 15, 2009
|
I see light |
April 13, 2009
|
Time is slipping into the future
|
April 10, 2009
|
Its a triple play
|
April 8, 2009
|
When you need a friend
A is for objectTriple |
April 6, 2009
|
Objects
|
April 3, 2009
|
Object
WahoosaLet's design and implement a photo manipulator. We will use as a starting point: |
April 1, 2009
|
Test resources |
March 30, 2009
|
Simply fabulous
But what about the past
|
March 27, 2009
Welcome class of 2013See you in August. Current most favored studentsPlease consider participating in the focus group:
The following files will be our focus today.
|
March 25, 2009
|
Focus group participation:When: Wednesday, April 8 right after class. Location: 236D Olsson Hall. Participation: sign up Put something even pithier here
|
March 23, 2009
|
Put something pithy here
|
March 20, 2009
|
Remember
Psst
Array hurray hurray
|
March 18, 2009
|
Hurray for arrays 2.0
|
March 17, 2009 Happy Saint Patrick's Day
|
Tomorrow
Why are we here
Terminology |
|
March 16, 2009 Fabulous
|
Due diligence
|
March 13, 2009 Help yourself
|
Diligence |
March 11, 2009: If you think about it, it makes sense
|
Diligence
|
March 9, 2009: But wait there's more
|
Thanks
Homework reminder
The Seth approach
|
March 9, 2009: Welcome back
|
Sign in right here
For your viewing pleasureFor your testing pleasure |
February 27, 2009: Come fly away
|
What's going on Consider the following program? What does it output? Consider the following program interaction: Enter coefficients for quadratic equation: .005 .1 20 Enter coefficients for another quadratic equation: .001 .1 20 Enter coefficients for another quadratic equation: .003 .1 15 The desired result is:
Supposed you were the software architect for this task. How might you develop such a program? How might you farm out the activities to accomplish the task? Consider for your downloading edification: |
February 25, 2009: Blowing in the wind was another day
|
Homework updateI have the homework page to include the current assignments Self-examination and moreThe teaching assistants have suggested we try something different to improve your mastery of methods (actually they gave me a push and I chose this direction): Suppose you have been tasked to design individual solutions for the activities listed below (i.e., methods). How would you accomplish these tasks? How might you test your solutions? Define the methods in Activity.java and the testing of the methods in TestActivity.java.
|
February 23, 2009: The selection of the day
|
Please download |
February 21, 2009: Keep it fresh
|
One more time |
February 20, 2009: Now back to the show
|
Repeat that |
February 18, 2009: I think you can! I think you can! ...
|
Downloads |
February 16, 2009: How far have we come
|
DocumentsI have updated the document section to have the permissible links to class material that you can use during the test. Preparation XThe image to the left tells much of what we have done. But it is does not speak of the underlying reason. What we are trying to accomplish is improve our problem-solving skills, where computing is the implementation platform. To do so, knowledge of computational concepts are paramount. I believe it is safe to say that we have all used numeric calculators, but most of us have never used their MS and MR keys that allow the saving and recalling of an intermediary calculation in the calculator memory. Although a calculator's memory is generally limited to maintaining a single value, that simple ability can still be very helpful. The ability to remember, name, organize, and manipulate multiple values is one of the major ways programming languages transform our PCs from expensive calculators to general purpose computing systems. Without naming, sophisticated computations would be all but impossible -- try to give the relatively simple formula of the area of a circle with out using any names. Some languages -- especially the ones of which I am a fan -- are what is called, strongly typed. A strongly-typed language requires that during its existence a named value hold only one type of value (e.g., integer, decimal, logical, string, color, ...). Programs written in a strongly-typed languages are generally less likely to use misuse values. Java is a strongly-typed language. As such, we must define our variables and indicate with what type of value are they associated. While naming is important for our own cognizance, the allowing of named values to be updated over time is critical. Assignment updates allow us to keep track of and understand the nature of the changes. Ambiguity is universally recognized as an important contributor to the making of mistakes. The designers of programming languages try to ensure that nothing is left to misinterpretation. One way they help is precisely describing how calculations are carried out. The rules of operator precedence guarantee each expression has only one legal evaluation. For example in Java, the expression a + b * c always evaluates to a + (b * c) rather than to (a + b) * c. Another way that PCs differ from calculators is their abilities to take actions only if a condition does or does not hold; and to repeat actions while the appropriate conditions hold. Without these abilities to selectively execute and iterate, the instructions for describing how to carrying out some tasks would be intolerable. For example, we would need a different set of instructions for each size of list to be handled. So, the ability to precisely give instructions that name, record, manipulate, evaluate, decide, and iterate, are a big part of what make programming languages so important. Without them we cannot produce the software so integral to our society. Some of what we have come to appreciate in Java is it rich set of libraries. The libraries we have seen so far allow us to easily represent lists, graphical elements, text, files, and web sites to name just a few of many types of objects Java supports. As we shall soon see, Java also provides the ability for us to define and manipulate new types of objects. In a programming language taxonomy, Java is called an object-oriented language. This upcoming exploration should go smoothly, as you are already able to work with objects of so many different types. So what does the preceding rambling tell you -- some of the most important things we have considered are:
The soon to be here testing should serve as an impetus to make sure you are paying sufficient attention to these concepts. More practically, it provides a measure of your ability to make use of these computational concepts. To accomplish its two missions, a first test will have you
|
February 14, 2009: Testing, 1, 2, 3, testing
|
The past is often said to be the best definition of future. Others say, your mileage may differ.The past. |
February 13, 2009: Delegate it
|
What's your methodology for cs101xologyWe want life to be interesting. The focus now is increasing your ability to problem solve so that you work and solve important problems. We will concentrate on both designing and implementing solutions. For design, we will work on breaking down problems into their component tasks. We can then implement those tasks in Java through methods. I expect today's class to go extremely well as you have all done the reading. In the reading, you should have learned about four kinds of methods.
A method is a named section of code. Sometimes a Java designer wants to limit what other Java code can use the designer's methods. For now, we want to make our methods available to all. We do so, by starting each method definition with the keyword public. Java has two fundamentally different kinds of methods. Methods that are just actions and methods that send a message to an object. We are going to start by writing methods that are just actions. Such methods need to use the keyword static as part of their definition. We can define a method that never returns a value to its user -- such methods are called void methods, because they use the keyword void in the definition. We can also define a method that always returns a value to its user. The type of the return value must be part of the method definition. Programmers call it the method's return type. A method definition must always specify what kind of information is to be passed (given) to it. Information is given to a method using parameters. In a definition, the designer must give for each parameter, the type and the name by which the parameter is to be called within the method. People refer to the parameters specified in the definition as the formal parameters. In the example method definitions, the formal parameters to method2() are int variables named a and b; and the formal parameters to method4() are an int variable named c and a double variable named d. The act of using a method to accomplish a task is known as invocation. The following example shows a single invocation of each of the methods. Observe that the invocations specify the library from which they come. Such specification is necessary when using methods from other libraries. FourMethods.method1(); FourMethods.method3( 5, 10 ); int i1 = FourMethods.method2(); double d1 = FourMethods.method4( 4, 9.5 ); The values given to a method as part of its invocation are called the actual parameters. In the following code segment, the first invocation of method2() has 5 and 7 as the actual parameters; the second invocation has 3 and 9 as the actual parameters. The first invocation of method4() has 1 and 2.25 as the actual parameters; the second invocation has 6 and 2.5 as the actual parameters. FourMethods.method2( 5, 7 ); FourMethods.method2( 3, 9 ); double d3 = FourMethods.method4( 1, 2.25 ); double d4 = FourMethods.method4( 6, 2.5 ); We consider our exploration with |
February 11, 2009: The next big thing
|
Idiosyncratic idiomsThe if else statement can solve all your decision needs. Sometimes the normal indentation of nested if else statements does a bad job of telling people what is really go on. The idiom if else if might be the way to go -- I certainly find it useful. Very occasionally the Java switch statement might be useful. I will demonstrate both today. The if else if will come again, but not the switch. Many times problem solving involves massaging data to put it in a different form. For many contexts, the data needs to be processed line by line where the processing of the line requires actions word by word. For example, read text in one language and translate it to another. I want to stress that one most important things you can do this semester is to give multiple thorough attempts with the readings on methods on methods. We will sneak peek at methods using Next class we will tackle I expect it go well as you will all have done the reading. |
February 10, 2009: The next big thing
|
Method actingWe are going to finish out decision making on Wednesday and start considering method definitions. In the text book you should have already read all of the material on the if statement, if else statement, and the if else if idiom. The text talks about the switch statement. Be aware of it. I will show at most one example. The most important thing you can is to check out the reading on methods. We have been trying for small steps, but this one is going to be the biggest. You are ready for it. Doing the reading is imperative for you to get what you need out of class time. Give a good glance for Wednesday, a deep read for Friday. We will be looking on Wednesday at We will sneak peek at methods using Next class we will tackle |
February 9, 2009: The cat is away
|
DecisionsPlease checkout the readings on HashSet and ArrayList. Please consider filling out the following anonymous surveys:
Please download the following files |
February 6, 2009: The road less traveled
|
DecisionsPlease download the following files |
February 4, 2009: Up, up and away
|
TextingMost problem solving requires text processing to get the information describing the particulars. The following programs could be templates for processing text. For the greater goodAlthough the while statement can handle all our looping needs. Java also supplies the for statement to do looping. For some tasks you should find it much more convenient to use. The for loop basics can be found with the following programs. Its time to use our powers to do something coolWe are going to divide into groups of 2 or 3. Our task is to develop a program that reports the weather for one of the zip codes that you provided me before class. I used the zip codes to create a web page that you will find help for our task. The web page consists of many pairs of lines. The first line in each pair is a zip code; the second line is the National Weather Service's forecast page for that zip code. I have divided the program into six parts. Our task is very doable because the National Weather Service displays forecasts in a very consistent matter. In broad terms, the program parts develop a HashMap that maps zip codes to weather sites; determine the zip code of interest; use the zip code to get the right National Weather Service page; process the web page to find the current forecast on the indicated National Weather service page; and display the forecast. We will discuss our solutions after 25 minutes or so. After class I will make my solution available. |
February 2, 2009: Say that again
|
DictionariesSometimes a problem requires that have access to an object with dictionary-like capabilities. We might need a bunch of entries with each entry having two components. The first component is called the key. The second component is the value we associate with that key. For example, we could have entries whose keys are the names of grocery store items, the value for an item might be its cost. To create a dictionary in Java use HashMap. To see a HashMap in action examine IterationOur problem solving abilities have been limited because each action we wanted to take required that we supply a statement for that action. Often a problem requires that some action be performed multiple times. Like many programming languages, Java supplies several ways to express that an action is to be repeated. In formal terms, Java supplies iteration constructs; informally, Java lets set up loops. The basic Java looping construct is the while statement. A while state has the form:
while ( condition ) {
actions
}
When during the execution of your program Java reaches a while statement,
it will repeatedly execute the while loop actions as long as the
condition stays true.
The actions in the while loop are often called the body of the loop. We will look at several programs. We start by looking at a program that sums ten user inputs. To be more flexible, we next look a program, that asks the user how many numbers to sum and then sums that many input numbers. For maximal flexibility, we look at a program that sums numbers as long as there are more inputs to process. Having the user enter the numbers is not always convenient. So, we will also look at programs that sum numbers from a file or that can be found on a web page. The while loop programs are
|
January 30, 2009 Objectifying
|
I have been asked how can you prepare for class. Well for this class spend time rereading Chapter 3, looking at the official description of the File library. I also strongly suggest that you print the following examples, look at them, may be make notes on them, and bring the copies to class. We first used variables to remember simple values for us like integers, decimals, and logical values. We moved on to using a variable to keep of a Scanner object that we could use to get input. And then there was an explosion of uses -- to name just a few we used variables to keep track of web pages, windows, colors, graphics, and strings. This meeting will have us manipulate File objects for representing the files on our compute. Class File comes from the java.io library. We will also use class Random a resource from the java.util library for creating and manipulating number generators. The generators are able to produce number sequences that pass important statistical tests indicating randomness. The number generators play important roles in simulating scenarios from the real world and from virtual worlds. If time permits, we will also play with The program generates cool pictures. |
January 28, 2009 Objectifying
|
The previous class started us getting serious about using objects:
We saw in our object usage that when we need a new object, the first thing to do is to tell Java how to construct it. Afterwards, we can manipulate the object by sending it messages. A Java library designer must specify which messages its objects will process. Some messages to objects include information to assist the object in taking the right action. The information comes as parameters. Parameters are passed to a message through a parenthesized list following the message name. If there is more than one parameter, then they are separated by commas. Java requires a library designer to specify the order that parameters are to be given in a parameter list. So be careful when sending a message to object that you know how it wants information to be passed. For example, the fillRect() message of a Graphics object takes four int parameters. The first two parameters specify the (x, y) location for where the box is to occur. The next two parameters specify the width and height of the box. Next time we will further explore the Graphics library to draw and paint different kinds of shapes. We will also get a peek look of a topic from textbook Chapter 6 -- iteration. Iteration is a fancy word for the repeated execution of a list of statements within a program. The more often-used word is looping -- going around and around. We will also look at some of the capabilities that Java provides for manipulating strings. To prepare for class, spend time rereading Chapter 3 and considering the following examples: |
January 26, 2009 新年快乐
|
Getting classyYou will often find when problem solving and doing design that the approach you taking in developing solutions requires you to be able to represent as objects, the attributes and behaviors of the components under manipulation. This approach goes under the title, object-oriented design. I strongly believe before you can effectively develop your own problem-specific representations that you need background experiences on the mechanics of object manipulation. The way I recommend is that you create and manipulate objects derived from some of the standard resources that are already available. Out of your experiences can come an understanding and appreciation for the object-oriented approach. Today we concentrate primarily on resources that support the use of objects for accessing web-based images and text, and objects of graphical nature. We will use them to create windows where we can display images and draw shapes. Properly speaking because the generators use an algorithm to produce their sequences, the numbers are properly called pseudo-random numbers. Most people are sloppy about the use of pseudo. Today we will spend time considering the following examples: |
January 23, 2009 When you least expect it
|
Please download
|
January 21, 2009 Change is good
|
Please download |
January 16, 2009 Tally ho
|
Please download
|
January 14, 2009 Is there a doctor in the house
|
Make sure you still have
|
January 13, 2009: The future is now
|
When requested, please download
|
January 12, 2009: Tomorrow is the big day
|
Download
Readings
Watch
|
January 8, 2009: Welcome
|
This semester we are going to work on becoming chrestomaticians!The class textbook is
|




























