(Watch this space for any schedule changes, clarifications, and other important class-related news)
Friday, June 8 | Turning in your VisorsAfter Project 2 is done, we ask that you turn in all Handspring Visors you may have borrowed. Either come by our office or bring them to the final exam and turn them in there. |
Friday, June 8 | Modification to turnin instructionsIn response to student questions, I've slightly modified the turnin instructions for Project 2. The changes are in blue. |
Friday, June 8 | Review questionsA list of review questions for the final exam. |
Friday, June 8 | Turning in your Project 2Instructions for Turning in Project 2 |
Thursday, June 7 | MakePalmAppWe have a new version of j2me that includes a working version of MakePalmApp. See/local/apps/Java/j2me_cldc-1.0.2 .
Here are Brad's comments on running MakePalmApp:
OK, I got it to work! It is quite a long command to run it, though. From /local/apps/Java/j2me_cldc-1.0.2/api/classes, the following command creates test.prc in home directory for YOURID from test.class which is also in the home directory (the command must be written on a single line): java palm/database/MakePalmApp -bootclasspath /local/apps/Java/j2me_cldc-1.0.2/api/classes -classpath /local/apps/Java/j2me_cldc-1.0.2/api/classes:/nfs/home/users/YOURID -o /nfs/home/users/YOURID/test.prc testYou must specify the bootclasspath and the classpath. The bootclasspath must be the path to the j2me classes. The classpath must include both the path to the j2me classes and the path to your working directory. You must also specify the path to where the .prc file is to be placed. This is the -o command. If you don't specify this, MakePalmApp will attempt to place it in its local directory which we don't have permission to write to. |
Saturday, June 2 | Grading criteria for Project 2I have added a clarification of the grading criteria for Project 2 at the end of the project description. |
Friday, June 1 | Gerd's Peer to Peer talkGerd gave a talk on P2P in class. Be able to answer a question on how Proem fits with P2P. Here are slides he used if you want to verify your notes. Gerd slides. |
Thursday, May 31 | A Hedge ProjectI've posted an extra credit project: Hedge Project. It is a hedge project because it may not do you any good. Read the description for details. |
Thursday, May 31 | New project 2 dateA student asked if the project 2 deadline could be moved given the final in 425. The answer is yes, we will move it to 5PM Sunday (two days beyond). However, we placed it on Friday so 422 staff could be around to answer questions. By moving it to Sunday, you lose this consultation over the weekend. We may be able to answer email sporadically, but won't be around for help in lab. That's the downside of the move.On the same topic, Ted and I are working to put out a summary of answers to some of the project 2 questions we have received, mostly focused on what is required in project 2. If you do not see your question/answer on this list, see one of us. List should come out in next couple of days. |
Friday, May 25 | More J2MEGerd turned up this site for lots of J2ME stuff. |
Thursday, May 24 | Tuesday, May 29 readingThe reading assignment for Tuesday, May 29, is Chapter 21. Steve has also prepared some reading notes for this chapter. The notes highlight key points that will be useful for understanding Stuart's talk. |
Wednesday, May 23 | Table from Tuesday ClassHere is a Word version of the table I had on the board Tuesday. gomoku-table.doc. I've also included some notes on (1) need for synchronization, and (2) some thoughts on the design of your GUI client. |
Wednesday, May 23 | I have a Handspring Modem!I purchased a modem for the class. Any groups want to try it? It does *not* give you wireless. Best it can do is to allow you to try our your emulator code on the real device (with a wired connection). First come, first serve. Not sure how I will distribute among groups as of yet. |
Monday, May 21 | A follow up to our discussion of future of CS ThursdayPollack article.And here is another Thursday-related link: Cell phones and games. And it looks like there will be plenty of jobs for software engineers in next four years: Glitches to Send Smartphones Off Course for Years. |
Monday, May 21 | Status of Handspring cradle connectionBrad has been doing more sleuthing on using the cradle for hot-synching a handspring using J2ME. (You do *not* need this if you use simulator only.) Here is what he has found:I've been working on the database stuff, trying to get it to work for a conduit. I found a posting where somebody was having the exact same problems that I am having. It was recently responded to by Eric Giguere, the author of the J2ME book that is optional for the class. He says: "I wouldn't bother with Java yet for this kind of stuff, the J2ME implementations for the Palm are somewhat lacking." "The basic problem is that the classes you're using are completely unsupported and quite lame to begin with. They just don't expose all the functionality you need to use Palm databases in a real fashion, they're just there as a demo for J2ME implementors. If you really need to do database stuff on the Palm you should either wait for the MIDP to arrive (this summer) or else switch to using something like IBM's J9 (which has full support for all PalmOS APIs) or esmertec's Jbed." However, he goes on to say that as educational users, we have the flexibility to recompile the VM and add in some missing functionality to the database class without needing a license.I've asked Brad to look at the recompilation angle. However, if any of you want to take this on, it is clearly worth extra credit and suspect you will pick up a better view of what J2ME is about. |
Thursday, May 17 | Simple socket exampleIf your group is still hung up on a multi-threaded server, this page may help. The top discusses a *single* threaded server, but the bottom has examples of a multi-threaded version. http://java.sun.com/docs/books/tutorial/networking/sockets/clientServer.html. I want your group to use the multi-threaded version, please.Note that the example does not really implement a protocol. There is no notion of one client being in a state such as "your turn". My suggestion is to use the GOF state pattern as an addition to the example code - it can implement whatever gomoku protocol you like. Only tricky bit is that you have one resource (the class that implements the state pattern) shared by two clients. Make sure they do not bump into each other as they attempt to interact with the state pattern. For example, what if both attempt to send an event to the state table simultaneously (because both clients send a message simultaneously)? Race condition! A synchronized method or set of methods in your state pattern interface should solve the problem. Get a hold of a good Java ref manual and read up on synchronization. |
Thursday, May 17 | Midterm GradesI have the grades listed, by last 4 numbers in SID, on midterm grades page. The average was 75.66. Once you get your exam back (I'll be around tomorrow afternoon.), both Ted and I would be happy (ok, maybe not happy, but at least willing :) to discuss any issues you have with grading. I (Steve) did all the grading so buck will eventually end up with me. |
Tuesday, May 15 | J2ME "sockets"A student noted that they could not find a Socket class in J2ME. True. I think you will find what you need for socket-like connections at this J2ME site. |
Friday, May 11 | Tuesday TopicsMy goal is to use some tools from lecture and Sommerville to help define your project 2. I'll look at a possible state-table for a socket-based server, and will also go over some of the architectures discussed in chapter 11 of your textbook. I suspect I will still have time to allow groups to meet and answer questions your group may have.If we have time Thursday, I'd like to do a little group exercise in class. More later. |
Tuesday, May 8 | J2ME FAQA student found this site which may be of interest to those contemplating a Palm client: J2ME FAQ. |
Tuesday, May 8 | Prime ServerA student wrote to say that they could not get BigIntegers to work with J2ME. I would not be surprised. The prime server project is a spike solution for running under J2SE (not the palms). It is meant to give you an idea of how hard the *server* will be to write, not the client. If you want to turn it into a Palm problem, i.e., write a palm client, you will have to replace BigInteger. No problem - use an int instead. But I would tend to recommend getting the J2SE solution working first before taking on a J2ME client. |
Monday, May 7 | Useful RMI linkLam recommends this for those thinking about RMI: RMI tutorial. |
Monday, May 7 | Useful J2ME linkA student turned this up: J2ME Tech Tips. |
Thursday, May 3 | Turning in Project 1We have decided not to use .jar files for turning in your project. Instead, we will look at your files in your CVS repository. Sometime before midnight Friday, do acvs update
of your last, best version of the system. Do not do any cvs update commands
after midnight Friday. We will check out your files from your repositories over the weekend.
We must be able to build a complete version of your
system by typing the single command Also include in your system a file called
cvs add and cvs commit sequence.
We do want your JUnit tests to be included in the distribution and want these to be runnable. Your Makefile should build these files as well as the ones for running your system. However, we do not care about any JUnit tests or other testing files you might have to test your Viewer or GUI. Since the only way to verify the success of these tests is by watching the GUI flash by, we won't be looking at them. |
Thursday, May 3 | Group evaluations will not affect Project 1 gradeWhen we handed out the preliminary group evaluations for Project 1, we told you that we were not going to use that for grading. However, the grading criteria for Project 1 (written before the term began) state that group evaluations will be used.We will stand by our announcement in class: The evaluations you have turned in will not be used for grades. At the end of the term we will hand out another set of evaluations, covering the entire term. These will affect your class grade. |
Wednesday, May 2 | Midterm review sheet availableThe midterm review is now available for downloading (Word, PDF). |
Wednesday, May 2 | Illegal Access Exception on loading a PlayerIf you get an IllegalAccessException for PlayerI when you load a player from another directory, the problem may be because you haven't updated your copy of project1_base. We recently made all project_base classes and interfaces public, which will avoid the exception. However, you'll continue to get the exception so long as you're using an old version of project1_base. |
Monday, April 30 | Midterm moved to Tuesday, May 8Many students are taking both CIS 422 and CIS 425. Both classes have midterms scheduled for Thursday, May 3. In addition, our project 1 is due Friday, May 4.In order for students to be able to focus on one (or at least fewer) things at a time, we've moved the 422 midterm to Tuesday, May 8. |
Saturday, April 28 | Loading classes from HTTP URLsHere's how to load classes from outside your current directory. First of all, URLClassLoader apparently always looks first in the current directory for a class file. Thus, if you have a file in the current directory it will shadow any files with the same name in the URL you give. If you want to test loading a class file from your public_html directory, for example, you need to make sure that no .class file with the same name is in your project1/422gX directory.Second, the string you pass to URLClassLoader is the URL to search for the .class files. It
does not include the class file name. You specify the class file name to
|
Friday, April 27 | How the View knows player colorSeveral groups have asked how the View knows the player color. The simplest solution is to adopt a convention that the first player will always be represented by black (or white). The Viewer determines the identity of the first player with a state variable. When the Viewer receives a GameStartedEvent, it sets the state variable to "waiting-for-first-player". When it receives a MoveCompleted while in that state, it records the identity of the player who made that move (which must be the first player) and changes its state to "first-player-known". This is the outline of a solution; we leave it to you to figure out the details. |
Thursday, April 26 |
In Steve's sequence diagrams, |
Thursday, April 26 | Throwing and handling SquareOutOfBoundsExceptionSteve asked that all exceptions be handled in the Controller. This is only possible for exceptions that are declared withthrows clauses in the method interface
specifications. Consider the following declaration from PlayerI :
makeMove can throw a CannotMoveException but not a
SquareOutOfBoundsException .
If PlayerI.makeMove receives a SquareOutOfBoundsException , it must catch
it internally. What should you do in the catch clause? You have two choices: Either throw
a CannotMoveException (because you can't move) or try a different move. If you
can correct the situation, great. Most of the time, though, you get a SquareOutOfBoundsException
at a completely unexpected time. It usually indicates a serious error in either the BoardI implementation
or the caller of BoardI. In such cases, you should just throw some sort of other exception to your
caller (an exception listed in your throws clause) and assume that the game is about
to end.
|
Thursday, April 16 | Plug and PlayPlug and Play---mixing the Model, View, Controller, and Players from different teams---is a laudable goal but probably not possible to achieve with the current interface design. Different teams could correctly implement the same interface incompatibly. The interfaces are somewhat ambiguous (you may have noticed this...) and there's ample leeway for different decisions.Our solution for now is to ask you to think about these issues but we will not expect people's classes to be interchangeable. That is, we will not reduce your grade if your code doesn't work with other groups. Do your best to be compatible but if you encounter a design choice where there's several right ways to do it, pick one way, document it somewhere, and just implement that one. Note that we do expect you to remain within the interface specifications. For example, we want all communication between the GMI and the RulesI to use the RulesI interface. Don't define new method calls in RulesI and have your GMI call them. Of course, you will have to define constructors for your classes, and different groups have given their classes different names (some groups call their implementation of GMI MyGMI, others GameMaster, others GoMoKu, etc.). This is one of the ambiguities in the specification and we accept that. (Note that there is no syntax in Java for ensuring that implementations of an interface have a fixed name.) But all other communication between the Model, View, and Controller must go through method calls defined in the interfaces. With respect to the saved game history files, we do not ask you to be compatible with other groups. That is, you don't have to be able to read in anyone else's history file nor does your file have to be readable by anyone else. Put whatever you need in that file, in whatever order you want. |
Thursday, April 16 | Loading player classesSee Saturday, April 28 for the solution to this problem.Groups are having many problems loading player files from other directories. We're not sure how to do this reliably yet. So for now, just load players from your personal directory. Once we've figured out how to load them from other directories, we'll post a solution. |
Wednesday, April 25 | CVS error on checkoutIf you're getting a CVS error related to the directory.rsrc , delete that directory and all files in it.
You may find copies of that directory in /cs/classes/cis422/S01/CVSARCHIVE/project1/422gX/.rsrc
as well as in your working directory. Delete both copies of .rsrc .
These .rsrc directories are created when someone
attaches your CVS directory from a Mac. (And by the way, don't try to attach a CVS archive
from a Mac---it gives CVS fits.)
|
Wednesday, April 25 | Pair ProgrammingSome teams seem to be doing modified versions of Pair Programming or else not doing it at all. People advance several reasons for this:
I think part of the problem is that people don't understand the mechanics of actually working in teams of two as part of a larger team. I'll deal with these mechanics first, then discuss the pragmatic concerns of finding compatible schedules. MechanicsFirst of all, understand that pairs should be forming and reforming regularly. Don't break your group up into two pair, each with completely separate responsibilities, and spend the rest of the term working with that one person. Instead, keep working with a different partner. There's many ways of doing this. For example, you might have responsibility for implementing one method, say RulesI.getWinningLines (). If you work on this in three different sessions, you might arrange to work with three different people. Or two people might be assigned to work on RulesI.getWinningLines () while the other two work on some other methods. Then once that's done, exchange partners. Experiment with ways that work for your group's style. Just be sure to keep mixing up the partnerships. The second principle is that the team, not the individual programmers, owns all the code. I've noticed that some teams have a "RulesI pair", while someone else is a "GMI pair", and so forth. This almost always leads to fixed pairs. It also makes it difficult to debug problems in the "other pair's" code. It's all your code. Period. And the best way to get that understanding is to work on different parts of the project, with different programming partners. The third principle is that pairs should regularly switch who is at the keyboard. Let's call the person at the keyboard the driver and the person sitting next to them the partner. Nothing's so deadly as sitting watching someone else type for hours on end. Don't just let the fastest typist always be the driver. Don't just let the "most experienced programmer" be the driver. How on earth would the "less experienced" programmer ever get experience that way? Switch off regularly. How often? That's a personal thing, but here are a few tips:
The fourth principle is that both the driver and the partner are fully engaged in writing the code. From eXtreme Programming Installed, p. 88: A cat is not a dog, we are told, and pair programming isn't one programmer looking over another's shoulder as she bangs in code. Pair programming is two programmers, side by side, working together to write the program. The programmer currently doing the typing is called the driver, and the other is called the partner. The partner isn't sitting idly by, but is actively engaged and helping every minute.They go on to list the division of labor (p. 89). The driver is responsible for:
The partner is responsible for
Scheduling with your partner and teamSome of the limitations of scheduling amongst group members are overcome when you view pair programming as fluid partnerships with any other member of the team. You now can schedule with three other people rather than only your "designated partner".Even in that case, you may still have a radically different schedule from other group members. Do the best you can. Program as much as possible with other group members. If you must program by yourself for some time, walk through your completed work later with another group member as soon as possible. Observe the difference between your work when you program alone and when you program in pairs. In which circumstance do you make more mistakes? Over the long run, which code seems to last the longest without requiring fixes? |
Tuesday, April 24 | For a class to be written out by Java Serialization, the class must declare
that it implements the java.io.Serializable interface. Furthermore, every
class that it points to, and so on recursively, must also implement that interface.
If you are getting a java.io.NotSerializableException from a class, that is an
indication that it needs to implement the interface.
You do not need to write any code to actually implement java.io.Serializable. The JVM does that for you. You merely need to declare that your class implements the interface:
If such a class implementing java.io.Serializable is Serialized out, the JVM will write it in a standard format for you.
|
Friday, April 20, | The sequence diagrams that I went over in class are up. As of this moment,
the last one is wrong - I asked Aina to correct it so it matches what I had
on the board Thursday - it should end up throwing a GameMechanicsException.
If you see that it does, then you know Aina has corrected it.
BTW: I think it is *extremely* useful to critique designs. Given there is no perfect design (we would all use it if there was), every design has assumptions and tradeoffs. Recognizing what those are is key. So I don't mind questions about the design handed you. But ... at this point I want to get a wrap on at least the first prototype of your system. So I am more interested in a common spec than design refactoring. However, Ted and I want to give you a chance to do your own designs. Then we can ask you pointed questions :) So you can expect that project 2 will give you more freedom to do design. So keep all those critiques of our project 1 design in back of your mind - you can use them to make sure you don't fall into the same traps. |
Wednesday, April 18, | Several students have asked how to detect the different error conditions
that RulesI.okMove() and RulesI.compareBoards return.
Our only hard and fast rule is that you return RulesI.OK for legal moves and
some other value for illegal moves. If it's easy for you to detect a given
condition, such as ALREADY_OCCUPIED , by all means return the
specific code. But we don't mind if you always return OTHER_NO_GOOD_MOVE
for every illegal move.
|
Wednesday, April 18 | Several important changes to the system:
|
Wednesday, April 18 | The state pattern does not seem to display with IE. I can get it to display with netscape on unix and mac. Have not tried netscape on PC. Hope this is enough to allow you to get a printout if you want it. |
Wednesday, April 18 | You can turn in your group evals either to Cheri (in main CIS office) or in class tomorrow. We need them by Friday morning. |
Wednesday, April 18 | Several more student questions worth repeating (I'll go over this in
class tomorrow in more detail. email me (Steve) if you need more info earlier.)
|
Wednesday, April 18 | Three tips about loading classes:
|
Mon, April 16 |
A student writes:
We have some questions also about Week 3 Deliverable Does the rule need to know if a player move one after another? (Doesn't change turn) or is it not possible since the flow of turn is controlled by Controller? Are these what we need to do for week 3? 1.Rules class + Junit Test 2.HonestPlayer class + Junit Test 3.nextMove + Controller + working test (not Junit) Are these the correct assumptions? We have the tester for nextMove and controller that actually show the "playing state" on the viewer, not JUnit. Also what are the basic week 3 skill? It says TBD. Thank you.Steve responds: The rules should note that a player made two moves in one turn, i.e., on one call of makeMove, a player puts two pieces on the board instead of the one allowed it. 1.Rules class + Junit Test [YES, THAT IS CORRECT.] 2.HonestPlayer class + Junit Test [YES, SOUNDS GOOD.] 3.nextMove + Controller + working test (not Junit) [YES, JUnit DOES NOT DO MUCH GOOD WITH A GUI. SO YOU NEED A SEPARATE DRIVER TO SHOW THE VIEWER.] On the basic skill front, we are looking for evidence that all team members know what is going on in the *whole* project. We want to avoid the "knowledge bottleneck" where one or two members have knowledge or skills that are critical. General idea is that in real world, the knowledge bottleneck can sink a project if certain people leave the company. I've asked the GTFs to probe to see if all members know what is going on. Make sure each person in your group has some idea of your system as it evolves. Good questions :) |
Sun, April 15 | I reorganized the top-level course page. The announcements page has been moved to the top, since that is the most-frequently-used page at this point in the course. I removed the FAQ page (we're posting answers to any frequent questions in this announcements page) and references to assignments other than the two projects (there will be no other homework assignments). I also made the Schedule page accessible. You can now look there to see what readings are associated with each day's lectures. |
Thu, April 12 | The GoMokuWinningLines class now has extensive comments describing its use. |
(Wed, April 13) | A student writes:
How smart does this honest player have to be? For instance, can we have it make moves based on a process that randomly selects an unoccupied square? Or do we need to consider previous moves?Steve replies: you can make the honest player play randomly. A good honest player is optional. Spend your time instead on building a dishonest player that does not get caught: if it can't cheat, it makes a legal move; if it can cheat (finds a loophole in the rules), it does. |
(Wed, April 11) |
A clarification: The View receives all its information from the Model,
not the Controller:
|
(Wed, April 11) | We have moved the copy of the Makefile from project1/Makefile to project1_base/Makefile.student. The move was prompted by security concerns (to allow students to check out files from project1, we had to give the world write access to the directory). The copy of Makefile in project1 has been deleted. The documentation on using the Makefile has been updated to reflect this. |
(Wed, April 11) | A student writes:
Also I feel there is "leakage" with all these various classes appearing like mushrooms in the Project-base plus the methods that my team players have been working on. I no longer have all my parts. Maybe at least you could put out an annoucement when these new classes appear so at least I can maintain a handle on my composting and harvesting duties.Steve replies: As I noted in my goals for the course, I see 422 as the stepping stone from academia to industry. When you move to a group project in industry, you will need to get into certain habits. In particular, I think your group needs to get in the habit of doing a synch on (1) your own group's archive and (2) the project1_base *everytime* you log in. Maybe even define a macro or shell script to do both actions for you. You might read the cvs documentation on watchers - they will email you anytime someone edits a file you target. But getting in the habit of doing the synch is best. In general, when you are working in a group project using cvs, broadcast announcements are not made on all changes. Up to you to track things. |
(Tue, April 10) | Unfortunately, the file project1_base/RunJUnit.java requires junit 3.5 (not 3.4) to compile. While it's a hassle to download the new version, having that version will allow you to run a complete unit test on your entire system---which will become increasingly useful as the term progresses. I encourage you to download the latest version. Until then, you can just edit out the references to RunJUnit from the project1_base Makefile and you will be able to proceed with your builds. |
(Tue, April 10) | We have changed RulesI.java from an abstract class to an interface. This should eliminate the
problems you may be experiencing getting this code to work. It also cleans up our design.
This change will require several modifications to your code:
Your Rules class will now have to say " If you have written code that uses your Rules class, you may need to change that as well: Since all the methods of RulesI are now instance methods rather than class (static) methods, you must instantiate your Rules class and pass that instance around rather than than pass the class itself:
This is the normal way you use classes, so this should be easier than the coding style required when
RulesI was a class.
|
(Mon, April 9) | New versions of the Makefiles have been released. This should fix errors people were having with compiling their code Sunday night. The bad news is that those of you who have already incorporated the old Makefile need to update your version. See the Makefile page for details. If you have problems or questions about the make system, contact Ted (ted@cs.uoregon.edu). |
(Sat., April 7) | NEVER open your .cshrc file or the makefile with pico, because it automatically breaks a line in two lines if it is too long, which will be interpreted by the Unix system as two separate commands. |
(Sat., April 7) | Group meeting time with the GTFs. |
(Friday, April 6) | Blame where it is due: I (Steve) alone should be held up to ridicule for the bad style of some classes in project1_base. For example, RulesI is *not* an interface so should not have a name that implies it is. Sorry. My only excuse is that it started as an interface, but I did not change the name when it transformed into an abstract class. I'm sure you will find other sloppy style. My bad. My co-instructor and GTFs should be absolved of any wrong doing. It is yet another lesson in trying to do too many things against a hard deadline. I'm sure there is something in the XP pages that tell you what a bad idea this is :) |
(Friday, April 6) | There is now a Makefile available for building your project. |
(Friday, April 6) | There is a mistake in the junit tutorial with regard to how to set up the
classpath. The tutorial assumes that you already have a classpath variable
defined in your .cshrc file; if no classpath is defined, then you should
include this line (instead of the one on the web page):
setenv CLASSPATH=.:/nfs/home/users/lnguyen/junit3.4/junit.jar:/nfs/home/users/lnguyen/junit3.4 In addition, the .cshrc file has to be "run" before the CLASSPATH variable will actually be changed in your shell environment. The easiest way to do this is just to open a new console. |
(Tuesday, April 3) | Aina notes that you must be careful when giving a url to load classes from. The url should end with a slash to designate that it is a directory. |
(Tuesday, April 3) | I'm trying to see if we can get some lab time on campus for the class. I'll let you know what I find out. BTW: you can bring a laptop into room 100 and plug in to a jack if that works. Or two people can work at a laptop anywhere once you have files downloaded from cvs. Main point is to do pair programming, no matter where it happens to be. |
(Tuesday, April 3) | You need to save your JUnit tests in your cvs dir as well as your MVC code. Any member of your group should be able to pull the tests up at anytime and run them. The GTFs may ask you to do this at a meeting. |
(Friday, April 6) |
A group asks the following question:
Our question is what are the deliverable for this meeting? 1.Board class tested 2.Testing class (is it Board_TestSuite?) 3.Test results (should we print the Applet result? or just write them down) 4.Is the swing view class included? 5.Testing harness just to show a board changes?The deliverables for the first meeting are as follows:
If a group has spent a lot of time on rules, you can substitute that for the viewer for the first meeting. But in that case, GTFs will be looking for JUnit tests of the rule methods. I am expecting that meetings will be held in room 100 so you can show your work to GTF. |