Similar to Robocode, I attempted a few kata in assist in familiarizing myself with manipulating data received from WattDepot. The following kata were given:
Kata 1: SourceListing
Implement a class called SourceListing, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a list of all sources defined on that server and their descriptions, sorted in alphabetical order by source name. Use the System.out.format method to provide a nicely formatted list. For example:
Server: http://server.wattdepot.org:8190/wattdepot/
Source Description
Bar Represents the energy consumed by the Bar building.
Baz Represents the energy consumed by the Baz floor of the Bar building.
Foo Energy generated by the Foo power plant.
Qux The energy meter associated with the Qux household.
Kata 2: SourceLatency
Implement a class called SourceLatency, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a list of all sources defined on that server and the number of seconds since data was received for that source, sorted in ascending order by this latency value. If no data has every been received for that source, indicate that. Use the System.out.format method to provide a nicely formatted list. For example:
Server: http://server.wattdepot.org:8190/wattdepot/
Source Latency (in seconds, as of 12-Oct-2011 14:32:12)
Baz 9
Bar 10
Foo 14
Qux No data received.
Kata 3: SourceHierarchy
Implement a class called SourceHierarchy, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a hierarchical list of all sources defined on that server. The hierarchy represents the source and subsource relationship between sources. For example:
Server: http://server.wattdepot.org:8190/wattdepot/
Source Hierarchy
Baz
Bar
Zob
Zob-A
Zob-B
Foo
Qux
Thus, the source Baz has two subsources, Bar and Zob. The source Zob has two subsources, Zob-A and Zob-B. Foo and Qux have no subsources. The hierarchy is represented by two space indentation.
Kata 4: EnergyYesterday
Implement a class called EnergyYesterday, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a list of all sources defined on that server and the amount of energy in watt-hours consumed by that source during the previous day, sorted in ascending order by watt-hours of consumption. If no energy has every been consumed by that source, indicate zero. Use the System.out.format method to provide a nicely formatted list. For example:
Server: http://server.wattdepot.org:8190/wattdepot/
Source Energy consumed in watt-hours (19-Oct-2011)
Baz 932
Bar 1025
Foo 1436
Qux 2357
Kata 5: HighestRecordedPowerYesterday
Implement a class called HighestRecordedPowerYesterday, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a list of all sources defined on that server and the highest recorded power associated with that source during the previous day, sorted in ascending order by watts. Also indicate the time when that power value was observed. If no power data is associated with that source, indicate that. Use the System.out.format method to provide a nicely formatted list. For example:
Server: http://server.wattdepot.org:8190/wattdepot/
Source Highest recorded power in watts (12-Oct-2011)
Baz 10,034 10:30am
Bar 10,456 2:45pm
Foo 14,876 12:30pm
Qux 23,578 4:15pm
This is a little tricky due to the presence of both virtual and non-virtual sources. For non-virtual sources, you could retrieve all of the sensor data and just iterate through to find the maximum power value. However, virtual sources represent an aggregate of non-virtual sources, so there is no sensor data associated with them directly, and it is unlikely that the sensor data timestamps for its constituent sources will be synchronized exactly.
One reasonable way to deal with this is to request the computed power at (say) 15 minute intervals for the entire day, which provides 96 data points per source whether it is virtual or non-virtual.
Kata 6: MondayAverageEnergy
Implement a class called MondayAverageEnergy, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a list of all sources defined on that server and the average energy consumed by that source during the previous two Mondays, sorted in ascending order by watt-hours. Use the System.out.format method to provide a nicely formatted list. For example:
Server: http://server.wattdepot.org:8190/wattdepot/
Source Average energy for last two Mondays in watt-hours (24-Oct-2011, 17-Oct-2011)
Baz 10,034
Bar 10,456
Foo 14,876
Qux 23,578
Kata 1 was fairly straight forward and did not take much time; maybe around 15 minutes. This is because the provided SimpleApplication.java file provided nearly all the method calls needed to solve it. All it took was slight formatting.
Kata 2 took a little longer; maybe around 30 minutes mainly because I was not familiar with Java's Calendar, Date, and XMLGregorianCalendar classes. After much reading into the API and a lot of guess and check works, I was able to format the outputs to correctly show the current date and time.
Kata 3 is where it started getting a bit difficult and took me a couple of hours to complete, mainly because I was reading through the API trying to figure out how to find the subsources. The formatting was also quite difficult and was not able to get it to work very nicely and resulted in me hardcoding the indentations. It works nicely for this problem, but if the code were to be used where a subsource contains a subsource, the indentations may be off.
Kata 4 was even more difficult than Kata 3 and also took me a few hours to complete, mainly because it took me some time to get used to the XMLGregorianCalendar class required in one of the methods. It also took me quite some time to figure out how to set the days correctly so it would get "yesterday's" data, rather than "today's".
Kata 5 was a bit confusing at first because a lot of problems happened while writing it. The first thing wrong (I guess you could say) is the fact that the system times out after a certain amount of time because it takes too long run run the queries if the increment time was small (ie. 5 or 15 minutes). Because of this, I had to set my intervals to 60 minutes so that it the program stopped timing out. Another problem I had and was unable to fix was not being able to display the actual time where the most energy was consumed.
The final kata, kata 6 was the one I was unable to finish. I am currently still working on manipulating the time based variables and was unable to manipulate it so that it would give me the time for "Monday". The could seemed simple enough, but I would always get errors when I tried passing it my variables as arguments and/or trying to get the manipulation to work.
Like Robocode, I learned quite a bit from doing these Kata. It was my first time really dealing with real world data that was always changing. I also learned that because the data is coming from real time, the results can sometimes be insanely slow and even time out, which can frustrate even the most patient programmer since you aren't always able to check if the outputs are correct. I hope to continue working on these Kata to really practice manipulating the times.
No comments:
Post a Comment