Copter Pilot John Li

Copter Pilot John Li reporting in for the ROFLCopter Squad, a group in the Fall 2008 CEN3031 Software Engineering course at the University of Florida.

Timesheet

This is my timesheet. There are many like it, but this one is mine.

DateActivityEst. TimeActual time
2008-09-02Discussion0:500:50
2008-09-03Email exchange with group about version control0:150:30
2008-09-03Create individual web page and timesheet0:300:30
2008-09-03Research distributed revision control systems2:002:30
2008-09-03Set up example Mercurial hosting site (freehg.org)0:300:01
2008-09-08Group meeting0:200:20
2008-09-09Discussion0:500:55
2008-09-09Group meeting0:450:55
2008-09-09CodeDivers subgroup meeting1:301:45
2008-09-15Group meeting0:200:20
2008-09-15Research GatorMail framework technologies
JSP, Tomcat, Jakarta, authentication, Model-View-Controller, Struts
2:002:30
2008-09-16Discussion0:500:50
2008-09-17Further research into GatorMail backend to determine specifics1:001:00
2008-09-17Contact the GatorMail maintainer to inquire about how webmail.ufl.edu is set up.0:150:30
2008-09-19Set up an Apache Tomcat server1:000:30
2008-09-20Attempt to set up a sample GatorMail system.
* Read Tomcat documentation, including deployment guide
* Struggled to get GatorMail instance running. Getting 404 errors, bizarrely.
* Suspect that the gatormail.xml file in the $CATALINA_HOME/webapps is not being read properly.
2:003:30
2008-09-22Send project requirements to the Requirements Team:
* Check for attachments when "attach" appears in message body
* Change "<<", "^", and ">>"links to more descriptive, longer text
* Change "Add Another Attachment" button when no attachments uploaded
* Nested/hierarchical display for message threads
0:450:45
2008-09-22Further attempts to set up sample GatorMail system.
* Progress: no 404, now there is a 500. Detailed exception error message mentioning permissions
* Though, still no cigar.
2:001:30
2008-09-23Discussion0:500:50
2008-09-26Further work on server.
* Read Struts technologies primer.
* Fixed previous permissions issue.
* New issues: "Exception processing TLD". Suspected cause: different version incompatibilities.
2:302:45
2008-09-27Continue to work on setting up GatorMail instance.
* Read Tomcat deployment guide.
* Fixed previous TLD processing issue.
* Got a running instance working.
** No authentication issues: was able to use my Gatorlink credentials.
** Error: could not access address book (because it's stored in a database, which hasn't been set up).
3:003:30
2008-09-28Research requirements proposed by me. See above.2:001:00
2008-09-28Examine what code is throwing the address book and user information errors.1:301:45
2008-09-29Added a page to internal wiki linking to various parts of the software stack, which will be useful for looking up documentation.0:150:15
2008-09-29Wrote how-to document for setting up personal test server on Linux. Windows portion not there yet.1:151:00
2008-09-30Discussion0:500:50
2008-09-30Further examined code to figure out how to plug a database into GatorMail. Limited success. Did figure out that GatorMail uses "DataSource" and not "DriverManager" (whatever that means).0:451:00
2008-10-02Attended JSP/Struts group tutorial session.1:000:45
2008-10-02Researched Java DataSource objects: javax.sql API, Java JBDC guide, Tomcat JNDI DataSource how-to.1:000:40
2008-10-02Work on setting up a database, resolving address book errors. Despite initially high hopes, still not solved. Documentation on what the database holds is essentially nonexistent. And I don't know how to debug Java. God I miss Lisp.2:301:30
2008-10-03Learn about log4j and how to turn on more informative debug information.2:301:00
2008-10-06More: Work on setting up a database, resolving address book errors.2:302:00
2008-10-07Discussion0:500:50
2008-10-08Finally finish setting up database: configured Tomcat and GatorMail to use DataSource3:005:00
2008-10-09Implement requirement 17: improved message view browsing controls.0:300:15
2008-10-09Finish how-to document for setting up personal test server (MySQL setup, DataSource configuration).1:000:30
2008-10-13Update all requirements with the manager for it on internal documentation.0:300:30
2008-10-14Discussion0:500:50
2008-10-16Attended managers meeting. Discussed goals for the upcoming few weeks.1:000:45
2008-10-16Modified database server configuration to: (1) not require having the user's plaintext password in the db, (2) not require logging in as root.0:450:45
2008-10-16Investigated user preferences db error. Discovered it was not a DB error, but a libraries thing. Worked at fixing, not done.1:301:45
2008-10-20Attended managers meeting. Discussed what to talk about with implementors, the presentation, and what was required for discussion tomorrow.0:200:15
2008-10-20Worked on test plan for attachment reminder with Marlies. Helped her set up a build.0:300:45
2008-10-20Completed design for the attachment reminder requirement.0:150:20
2008-10-20Completed story card, test plan, and design for the "simplified add attachment" requirement.0:300:30
2008-10-21Discussion0:500:50
2008-10-23Added visual changes to mark the code as the Roflcopters fork.0:300:30
2008-10-23Read about JNDI, tried to load the ManageSieve library, but failed.2:001:45
2008-10-26Tried to load the decompiled ManageSieve code that Hat John sent me. Failed.1:000:45
2008-10-26Commented out ManageSieve code to work around the preferences page error.0:300:30
2008-10-26Reconfigured JavaMail to use authenticated, encrypted SMTP on port 587 instead of 25. Allows us to send mail when using an ISP that blocks outbound connections on port 25.1:300:45
2008-10-27Worked on implementing the attachment reminder requirement with Marlies. Got some basic coding done, but discovered that the system is not configured correctly for uploading attachments.2:001:30
2008-10-27Read about ant ("make" in XML for Java). Configured the system to allow attachments for both Linux and Windows.1:001:00
2008-10-28Discussion0:500:50
2008-10-28Further work on attachment reminder requirement with Marlies. Function now searches the message body and subject line, and began work on the frontend and backend for a global preference to turn off the reminder.2:002:30
2008-10-28Prepare for the CodeDivers portion of the presentation. Time how long it takes to talk and do the demo.0:452:30
2008-10-29Read Robert's (very good) Struts tutorial.0:300:30
2008-10-30Read more Struts tutorials online.1:000:45
2008-10-30Further work on attachment reminder. The user is not kept from sending the email if the warning has already been displayed. Learned quite a bit about Struts in the process of this.1:301:15
2008-11-01Met with Marlies to finish the attachment reminder global preference and integrate our work. Spent an annoying amount of time wresting with TortoiseSVN.1:001:45
2008-11-01Did research on other requirements, will likely pick up the drafts requirement next.0:300:30
2008-11-02Made attachment reminder testing slightly more intelligent - it won't warn when the string "attach" is a substring of a subject line that begins with "Re:" (e.g., a reply to another message). Bulk of time was spent wrestling with multiline CRLF regular expressions, which I ended up giving up on.1:002:30
2008-11-02Fixed exception-causing error in attachment reminder code, triggered by trying to access a preference that has not been set through the Preferences page yet.0:300:30
2008-11-03Worked on message view pattern matching code. Original code would rewrite URLs into clickable HTML links. Now, the code also rewrites email addresses into mailto: links, rewrites street addresses into Google Maps links, and rewrites Youtube URLs to include the embedded video.1:301:30
2008-11-03Practiced Code Divers portion of presentation. Can get it done in ~6.5 minutes.0:300:45
2008-11-04Discussion0:500:50
2008-11-04Practiced demo portion of presentation. Mailed Gram how much time I'll need.0:450:30
2008-11-05Discussed Code Diver work during presentation in class today. Presented a demo of the system, showing the WYSIWYG editor, the i18n work we've done, the attachment reminder, and the message text rewriting.0:500:50
2008-11-06Worked on researching, designing thread-view requirement with Marlies. Spent some time explaining how "In-Reply-To" and "References" headers work. Wrestled with TortoiseSVN. Created separate "awesomeThreads" branch.2:003:00
2008-11-06Read Javamail FAQ. Sent Evan, Andy, and Patrick an email pointing them to a discussion of MIME multipart/alternative messages, which they'll need to implement for the WYSIWYG editor.0:300:30
2008-11-06Added proper "In-Reply-To" and "References" header support to GatorMail. Now people receiving email from others using GatorMail can display the message thread properly.1:301:30
2008-11-06Read Javascript tutorials. Learned where to place Javascript, basic programming constructs, how to trigger functions on events like mouse clicks, how to display alert boxes, how to look up elements in the HTML document, and how to change display properties of those elements0:451:00
2008-11-06Tried to understand message list display code. Played around with adding data structures for keeping track of which message is the last in a thread. Played with CSS and Javascript code for hiding all parent messages in a thread, using knowledge acquired above. Currently, code only hides the non-leaf nodes, as opposed to hiding all but the most recent message in a thread. Considering building a real tree, and perhaps using the YUI TreeView module to display it.2:003:30
2008-11-07Further experimented with message list display code. Wrote Javascript function to toggle the visibility of non-leaf nodes in the message display. Added buttons to call the function, so messages in the thread can be collapsed and expanded dynamically.2:001:30
2008-11-07Came up with initial design for better display of message list. The design enables hiding entire threads as opposed to only hiding interior nodes of the thread tree. Decided to use sets to hold the messages for each thread, with each set identified by the root of the thread (1st message sent for the thread). To display only 1 row per thread in the message list, each set will be sorted by date and the last (most recent) message will be the one displayed. Upon clicking on a button next to this message, all other messages in the thread will appear, allowing the user to go to any specific message.

To build all the sets for the threads: iterate through the list of messages to be displayed; if there is a "References" header, add the message to the set of messages for its thread, if there is no "References" header, move the message to the "postprocessing" list; after all messages have been either moved to the "postprocessing" list or added to a thread set, iterate through the "postprocessing" list; two possibilities: the message is the 1st message in a thread, or the message was sent by a bad email client that doesn't add a "References" header; if the former, add the message to the appropriate thread set, if the latter, do guessing based on subject line.

1:301:30
2008-11-07Researched the spell checker requirement Prof. Dobbins surprised us with in class. Decided to use Speller Pages. It is open source and the demo worked better than most solutions I found (including closed-source, for-pay solutions).0:300:15
2008-11-07Worked on integrating Speller Pages into the GatorMail compose page. Configured to check the subject line and main message composition text area. Speller Pages calls out to a server-side script to do the actual spell checking, with PHP, Perl, and ColdFusion scripts available. Configured Tomcat to run CGI scripts in order to run the Perl version with the help of this tutorial. Installed GNU Aspell for the actual spell checking functionality. Integrated Speller Pages into compose page (uses bean:message for button text: ripe for i18n!). Added preference to turn off spell checking functionality. Created "plaintext-spellchecker" branch in repository. Commited all my work for fully functioning spell checker, a scant 4 hours after it was assigned (which includes going to another class, the commute back home, researching a solution, and making coffee).0:451:30
2008-11-09Worked on using Speller Pages for the compose page for the FCK Editor WYSIWYG compose page as well. The WYSIWYG team was supposed to look into enabling spell checking for the WYSIWYG compose page, but were having trouble. FCK's spell checking is based on a customized version of Speller Pages, so I took responsibility for implementing WYSIWYG spell checking.

I simply copied FCK's modified Speller Pages script to the same directory (/src/webapp/WEB-INF/cgi/) as the script for plain text spell checking. With my previous Tomcat CGI configuration in place, a rebuild and restart resulted in working WYSIWYG spell checking.

1:001:30
2008-11-10Met with Marlies to discuss message threads design. Realized that we would need to create at least one new class for a message thread object, which would be composed of an array of messages as well as a key (the Message-ID field of the "root" of the thread). The real object we're interested in is a list of message threads, which we will iterate through for the message list. However, this does not require another class. In the FolderAction class (which populates the "messages" object for the messageList.jsp display), we will build the message thread list object.

Instead of having a separate message thread list object, we'll have a hash table, keyed by "thread key" (Message-ID of root message). The value will be the array of messages for the thread.

The result of this design will enable us to move a lot of logic out of messageList.jsp (currently, cross-referencing threads based on subject line is Javascript, done by the user's browser!).

As part of this design work, I read parts of the documentation for Java sets, arrays, lists, arraylists, hashtables, hashmaps, and all the documentation for LinkedHashTables, which is what we will be using.

2:002:00
2008-11-11(No Discussion)N/AN/A
2008-11-16Met with Marlies to begin implementation of message threads design. Had some problems, namely: an opaque Java error that we thought we understood how to solve, but remains unsolved. Iterating through a LinkedHashMap in the JSP display code throws a cast error, saying the entry cannot be cast to an ArrayList. However, the entry is most certainly an ArrayList. The LinkedHashMap generics stuff is set as String, ArrayList, so the problem is quite confusing. Because of this basic error, it's difficult to tell how much work the main body of the code still requires.3:005:00
2008-11-18Discussion0:500:50
2008-11-20Worked around previous error. LinkedHashMaps do not have an iterator() method, so replaced Struts "foreach" code in messageList.jsp with Java for loops, iterating over the threads and the messages. Continued work on the back-end buildThreads method. Appears to build the threads objects correctly, but had trouble with front-end code for displaying the information. Productive.3:004:00
2008-11-21Met with Marlies, finished front-end code in messageList.jsp. Also displays number of messages in thread as the button text when thread is collapsed. Doesn't display a collapse button for "threads" with single messages. Doesn't try to match based on subject line, so messages sent by mail clients that don't set "References" and "In-Reply-To" properly will not be threaded properly.4:004:00
2008-11-24Met with Marlies and began testing of the EAP team's requirements. Discovered that the Unicode requirement, which that team thought was not completely correct, works fine on my computer. Currently, we suspect that Tomcat on Windows behaves differently in a way that selectively (apparently randomly) mangles characters, but that Tomcat on Linux works fine.1:301:30
2008-11-24Had an informal managers' meeting with Patrick and Hat John, tested the code from a few other branches. Discussed issues we need to address in discussion tomorrow.1:301:300
2008-11-25Discussion0:500:50
2008-11-26Polished the attachment reminder a bit. There was some uncommited code on my computer that handled some bugs that Patrick found while testing. The code enabled case-insensitive matching, as well as detecting if instances of "attach" actually appeared in a reply. However, the code only correctly detected reply subject lines, not quoted reply text. So, the line "> see my attachments" would trigger the warning, even though that line is from the original messages being replied to. After much testing, I figured out a set of regexes to match all the cases I could think of.1:302:00
2008-11-30Worked on integration. Reapplied r124, which Patrick accidentally overwrote when he was merging EAP into trunk. Merged my own EAP-FCK-spell-checking branch into trunk. Merged awesomeThreads branch into trunk. No major difficulties (yay git). Did brief testing after each merge.1:001:30
2008-11-30Tested Hat John's ubersearch branch. Did not perform slowly on my system, which he was worried about. I like the simplified appearance. However, the branch only has 1 commit, and that commit appears to touch the entire codebase, not just the few files that should have required changes. Emailed Hat John about it.0:150:15
2008-12-01Worked on integrating the abkTeam branch. Git auto-merged most conflicts, and most of the remaining conflicts were easy to handle. As I thought, it wasn't as hard as originally imagined. However, it did cause a weird bug with the navigation bar. Convinced that it wouldn't be too difficult to fix, I didn't spend much time on it. Debugging will just be saving a working and a bugged copy of the page and diff.2:001:30
2008-12-02Discussion0:500:50
2008-12-02Implemented Firefox 3 mailto handling (requirement 6), mostly. Big John didn't realize that actual code had to be added to GatorMail to handle the protocol. The code is straight-forward: it simply parses the URL for an "extsrc" parameter. If it's set to "mailto", then we know that the Firefox user clicked a mailto link. Then we just have to parse the URL for the email address and possible subject line. Took longer than I anticipated, because I wasn't sure how to parse the URL with regexes in Java. Also spent way too much time figuring out how to get the GET parameters from the request.

This is not completely finished, because the user needs a way to make Firefox use GatorMail as the mailto protocol handler. Joir-dan was supposed to add the link "soon". If he doesn't by tomorrow, I will.

1:302:30
2008-12-03Did some quick integration work, in case of having to do the demo in class. No real difficult-to-solve conflicts. Did not integrate Hat John's ubersearch branch. Applied my mailto handling code from yesterday, though.1:301:45
2008-12-07Hat John essentially did the same work I did on Wednesday (though not in time for me to adequately test, before the presentation). However, people have made more commits to the abkTeamStable branch since Wednesday. Unhelpfully, many of the commits do not have commit messages, making integration slightly more difficult, but it was completed.

Did basic integration testing. Noticed some brokenness with drafts and complex HTML layouts, sent a message to the mailing list about it. Fixed a small drafts bug that threw an exception. Modified the attachment reminder code to integrate with drafts and the HTML compose page better.

1:302:15
2008-12-09Discussion0:500:50

Schedule

Here's my schedule. It'd be great to meet in the middle of some of those 3 hour gaps I have every single day, but immediately before (after) my first (last) classes is also fine.

   Per       Monday   Tuesday  Wednesday Thursday Friday
   1   7:25
   2   8:30
   3   9:35
   4   10:40 EEL3701C COP4600  EEL3701C  COP4600  EEL3701C
   5   11:45          CEN3031            COP4600
   6   12:50
   7   1:55
   8   3:00  CEN3031           CEN3031            CEN3031
   9   4:05  COP4620  EEL3701C COP4620   COP4600  COP4620
   10  5:10           EEL3701C
   11  6:15           EEL3701C
   E1  7:20
   E2  8:20
   E3  9:20

Responsibilities

Inspiring ROFLCopter Images

From left-to-right, top-to-bottom: an animated ASCII ROFLCopter found online; a ROFL Apache, based on an image from Wikimedia Commons; a ROFL Chinook, found online.

Keep on rofling.