This week, I worked on a series of code katas for the WattDepot API, an open-source interface used to retrieve data on daily power and energy generation and use from remote sensors. The WattDepot API is intended to give users the tools to process technical, obtuse, automatically generated energy data and put it into a form that means something to the people who will use it.
I was able to complete the first Kata, SourceListing, in one or two hours; it asked for an alphabetical listing of all the Sources on the WattDepot server and their descriptions. Most of the code for this can be attributed to the SimpleApplication.java example program included in the distribution, as a Source object includes a name and a description.
The second Kata, SourceLatency, which required a program that calculated latency for each Source and printed the sources in ascending order based on latency, took two days. I had somehow managed to finish ICS 211 without learning how to use Hashtable
The third Kata, SourceHierarchy, required a program which printed Sources and their SubSources with increasing indentation for each level of sub-source. This kata also took two days, mostly because I sought clarification on how to parse the SubSources. The major issue I had at first, which turned out to be a non-issue when I figured out the actual format of the assignment, was that the SubSources returned by Source.getSubSources are not a recursive data structure (that is, a SubSource does not contain the Source data for its SubSources, only their URIs), and it was not possible to construct the hierarchy recursively. The trick, as Professor Johnson said, was to make a single pass through the list to figure out which sources were SubSources, and then use that to create the hierarchy. The solution I eventually implemented parsed the URIs to retrieve the SubSource names and did not print any Source which was listed as another source's SubSource.
The fourth Kata, EnergyYesterday, required a program which totaled up the energy used by each source on the previous day and printed each Source and its energy use in ascending order by energy use. This was similar in design to SourceLatency; in both cases, I used Hashtables to store Lists of Sources with identical energy or latency values, using the energy or latency values as the keys to retrieve them, then iterating through the lists and printing each Source with its associated key. Once I had fixed my SourceLatency issues, it did not take much editing to create EnergyYesterday; the main additional problem was the simple task of creating a timestamp which was rolled back by one day.
The fifth Kata, HighestRecordedPowerYesterday, required a program to print the highest recorded power for each source for the previous day, sorted in ascending order. It took up almost all of Monday, and several hours of Tuesday morning; this blog entry is being written at 6:00 AM on Tuesday morning, November 8, and the last kata still isn't finished. I had to write several utility methods for this class, mostly to generate the timestamps for power data requests and to parse the timestamps back into AM/PM format. The kata appears to be working correctly, except for one thing: I was never able to figure out whether it was a bug, or just a reflection of college study habits, but the peak power measured for every single sensor was at 12:00 AM midnight:
// My output for Kata 5 is reproduced below: Connected successfully to: http://server.wattdepot.org:8190/wattdepot/ Server: http://server.wattdepot.org:8190/wattdepot/ Source Highest recorded power in watts ( 07-Nov-2011 ) Lokelani-12-telco 1,203 12:00am Lehua-10-telco 1,263 12:00am Mokihana-08-telco 1,390 12:00am Mokihana-04-telco 1,612 12:00am Ilima-12-telco 1,818 12:00am Lehua-04-telco 1,868 12:00am Ilima-10-telco 2,227 12:00am Lokelani-04-telco 2,432 12:00am Mokihana-10-telco 2,662 12:00am Lokelani-06-telco 2,890 12:00am Ilima-08-telco 3,276 12:00am Ilima-08-lounge 4,036 12:00am Lokelani-10-lounge 4,204 12:00am Ilima-10-lounge 4,285 12:00am Lokelani-06-lounge 4,667 12:00am Ilima-06-lounge 5,208 12:00am Ilima-A 5,237 12:00am Lokelani-04-lounge 5,458 12:00am Mokihana-12-lounge 5,665 12:00am Lokelani-D 5,845 12:00am Mokihana-A 5,862 12:00am Lehua-08-lounge 6,233 12:00am Ilima-D 6,512 12:00am Mokihana-10-lounge 6,612 12:00am Mokihana-C 6,877 12:00am Lehua-B 7,258 12:00am Mokihana-E 7,484 12:00am Lehua-C 7,760 12:00am Ilima-B 8,022 12:00am Lokelani-08-lounge 9,564 12:00am Ilima 33,961 12:00am Mokihana 35,322 12:00am
The sixth kata, MondayAverageEnergy, required me to write out the average energy consumed by a Source over the previous two Mondays. It is probable that I did not finish this kata in the hours remaining before the deadline. The main problem is in figuring out if today is Monday, then subtracting the number of days since the last Monday (to generate the first data set), then rolling back the date seven days to the previous Monday (to generate the second data set), and if I had had more time I would most likely have been able to reuse some of the code from EnergyYesterday to do this. I would have to put most of the blame for my poor scheduling on the two days of time I used to try to sort two arrays simultaneously for the second and fourth katas.
You should take time to program outside of class and do katas on your own. Doing so will help improve your Java programming skills. I speak from experience.
ReplyDeleteThat's good advice. Thank you.
ReplyDelete