User:Paul Clark/Design Study

From CSSEMediaWiki
< User:Paul Clark(Difference between revisions)
Jump to: navigation, search
m
m (Reverted edits by Ebybymic (Talk); changed back to last version by Paul Clark)
 
(13 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
= Abstracted Motivation: A Points Oriented ToDo List & Scheduler =
 
= Abstracted Motivation: A Points Oriented ToDo List & Scheduler =
<small>The project name is still being worked on.</small>
+
[[Image:PaulClark-src-and-jar-2010.zip|My source and an executable .jar file]]
 
+
<small> Also, the page as it is now was written hastily and the sentence/paragraph structure isn't written to aid readability, this will be remedied shortly</small>
+
 
+
[[Paul Clark's Log|My Log]]
+
 
== Brief ==
 
== Brief ==
 
Some people (e.g. this author) are lazy, they don't do the things which would be most beneficial to them at all times[http://en.wikipedia.org/wiki/Perfect_rationality]. One possible solution to this problem of motivation is to mandate that rationality [http://lesswrong.com/lw/gn/the_martial_art_of_rationality/] and behavioral psychology be taught in schools, but even if you know are well versed in those fields, applying the concepts can be <i>hard</i>[http://lesswrong.com/lw/km/motivated_stopping_and_motivated_continuation/]. So sometimes (in my opinion) it is more efficient to manipulate people to do what is best. Or even to manipulate oneself to do what is probably best. This concept can be expanded to allow systems to be put in place which will ensure that the best option is more likely to be taken in any anticipated situation.  
 
Some people (e.g. this author) are lazy, they don't do the things which would be most beneficial to them at all times[http://en.wikipedia.org/wiki/Perfect_rationality]. One possible solution to this problem of motivation is to mandate that rationality [http://lesswrong.com/lw/gn/the_martial_art_of_rationality/] and behavioral psychology be taught in schools, but even if you know are well versed in those fields, applying the concepts can be <i>hard</i>[http://lesswrong.com/lw/km/motivated_stopping_and_motivated_continuation/]. So sometimes (in my opinion) it is more efficient to manipulate people to do what is best. Or even to manipulate oneself to do what is probably best. This concept can be expanded to allow systems to be put in place which will ensure that the best option is more likely to be taken in any anticipated situation.  
Line 11: Line 7:
  
 
So this program is all about augmenting <span title="Real Life" style="border-bottom:1px dotted">RL</span> with some of the things that motivate people to play games so often and with so much commitment. I am aware that this sounds like a rather broad goal, but hopefully the proposed OO nature of the design will make achieving this goal a matter of many small incremental additions beyond the scope of this project. Some people think that doing the work of ranking the relative value of a task and entering it into a PC program before even starting it will <i>not</i> motivate people. I think that once you make ranking tasks a habit &ndash; and if the quantified results of your decisions are highly visible &ndash; then you can become quite motivated, especially if you start out just ranking trivial tasks until you get some points built up in the system (i.e. make an investment in the virtual world).
 
So this program is all about augmenting <span title="Real Life" style="border-bottom:1px dotted">RL</span> with some of the things that motivate people to play games so often and with so much commitment. I am aware that this sounds like a rather broad goal, but hopefully the proposed OO nature of the design will make achieving this goal a matter of many small incremental additions beyond the scope of this project. Some people think that doing the work of ranking the relative value of a task and entering it into a PC program before even starting it will <i>not</i> motivate people. I think that once you make ranking tasks a habit &ndash; and if the quantified results of your decisions are highly visible &ndash; then you can become quite motivated, especially if you start out just ranking trivial tasks until you get some points built up in the system (i.e. make an investment in the virtual world).
 +
 +
<small>So basically this is a ToDo application. One in which the items on your ToDo list having a common value (points) attached to them.</small>
 +
 +
== Current Design ==
 +
 +
Currently the design consists of a rather minimal domain model (Task, Person Network), surrounded by a still evolving framework to build he application around it. The main aspects of the application which have been worked on up to now are the command line interface (CLI) and the scheduling framework. At the moment the scheduling framework needs the most work done to get to a stable state.
 +
 +
* The main feature of the CLI module are the dynamic reflection generated menu generation, using the state pattern to support sub-menus.
 +
* The main feature of the scheduling back end is the set based recurrencey framework based on Martin Fowler's writings.
 +
 +
== Reasoning/Rational ==
 +
 +
Initially I wanted to make a simple ToDo list. So made a Network class, a Person
 +
class, and a Task class--trying to keep it simple. For a while I was stuck on
 +
these few classes shuffling them around trying to make something pretty. So to
 +
try and further my design I just started implementing some logic in a 'CLI'
 +
class. The goal was to get a workable ToDo application so that I could find out what was missing.
 +
The first thing I found to be missing was persistence. So I implemented Java's
 +
'serialization' interface. Eventually this will have to be changed to a more flexible
 +
method of storing interesting fields.
 +
The next major thing to add was scheduling capabilities for recurring tasks. The
 +
first go at this was way to general. I tried to specify a very flexible syntax
 +
for declaring repeating patterns and that ended up having way too many edge
 +
cases and some features which were just plain absent (such as specifying an end
 +
to a repeating pattern). I decided to re-implement this using the interpreter
 +
pattern. More on this later...
 +
 +
=== Specific Features/Design Decisions ===
 +
 +
==== Schedule ====
 +
 +
[[Image:Paul Clark-TE.png|center|thumb|500px|alt=Some of Martin Fowler's temporal patterns used to create the scheduling subsystem|Some of Martin Fowler's temporal patterns used to create the scheduling subsystem]]
 +
 +
 +
For first attempt at implementing a scheduling system I saved a string specifying
 +
the base date and time of the event and extra arguments to specify the recurrence
 +
rules. I then generated a list of dates from that stored string when the task
 +
schedule was requested. The plan was (as always) to implement the functionality
 +
before making it a more maintainable OO design.
 +
This approach worked (in terms of functionality), the recurrence rule specification language was very
 +
flexible but that caused lots of edge cases while parsing it. Also, the parsing
 +
function was large and messy. So I figured I could implement the interpreter
 +
pattern. While I was looking around for a better way to handle dates in Java I
 +
found some patterns specified by Martin Fowler to deal with dates. More
 +
specifically, [http://martinfowler.com/eaaDev/TimePoint.html arbitrary precision time points],
 +
[http://martinfowler.com/eaaDev/Range.html Ranges (of time)], and
 +
[http://martinfowler.com/apsupp/recurring.pdf recurring events for calendars]).
 +
These look interesting and like they could be used, albeit with a little work,
 +
especially his recurring event language. I also found an implementation of the
 +
ideas discussed in Fowler's 'Recurring Events for Calendars' PLoS submission.
 +
This doesn't extend the functionality discussed in the paper though, so still
 +
some work needed. I have started to integrate this implementation into my design
 +
[http://chronicj.digitalclash.com/ ChronicJ] and as it stands now everything
 +
works, with less functionality than before started using ChronicJ code. I believe
 +
this is due to the fact that the project has been effectively dead since early
 +
2004, I plan to modify this project by ripping out the Schedul classes and adding
 +
TemporalExpressions to be more inline with [http://runt.rubyforge.org/ runt] for
 +
Ruby. Runt implements exactly the same ideas introduced in Fowler's paper but
 +
has been used a little more recently.
 +
 +
Referring to the picture above, the short story is that
 +
an event has a schedule. A schedule can have some sort
 +
of recurrence, that is where the <tt>TemporalExpresion</tt>s
 +
come in. These are based on a paper by Fowler entitled
 +
<i>Recuuring Events for Calendars</i>. The actual clases
 +
I am using at the moment were implemented as part of the
 +
(now apparently dead) [http://chronicj.digitalclash.com/ ChronicJ] project.
 +
These classes are not nearly all the classes required and
 +
they are unweiled in many cases, so eventually (ie over summer) they
 +
will be made a little more useable.
 +
 +
The way these temporal expressions are used is to create <i>Unions</i> and
 +
<i>Intersections</i> composed of <i>AbstractTemporalExpressions</i>. This way
 +
one can create a union of 'The first monday' and 'the last tuesday' of the
 +
month. Take the <i>difference</i> of that union and a <i>RangeInYear</i> of
 +
February to September. So the task would only actually repeat twice a month
 +
outside of February and September.
 +
 +
In summary my initial attempt at scheduling ended up being inelegant, and the
 +
replacement is currently incomplete an a little unwieldy. Taking into account
 +
the basic ideas of Fowler's paper (rather than the examples provided in it)
 +
should enable me to create a much more usable set-based date-recurrence
 +
framework, given a little free time.
 +
 +
==== CLI ====
 +
 +
[[Image:Paul Clark-CLI.png|center|thumb|600px|alt=The state pattern used to generate an interactive CLI menu|The state pattern used to generate an interactive CLI menu]]
 +
 +
I haven't had to write a GUI yet in my time at Uni (except for web based), and I had no extension of
 +
starting in my final year. Writing an interactive CLI app in java poses its own
 +
challenges though. After spending some time adding new methods to the CLI class,
 +
I got rather sick of modifying the menu which was printed out to the user (and
 +
the switch statement) to keep in-line with the new methods. So I implemented a
 +
system to dynamically generate a CLI menu base on method annotations and Java's
 +
reflection framework. Methods are designated
 +
as occuring in the CLI menu by annotating them with a custom annotation:
 +
<pre>
 +
@Retention(RetentionPolicy.RUNTIME)
 +
  @Target(ElementType.METHOD)
 +
  public @interface CLIMenu {
 +
    public String menuText();
 +
    public String menuID();
 +
    public int weighting() default 50;
 +
  }
 +
</pre>
 +
The menuText field is that which is printed to the console, the menuID specifies
 +
which menu this option should appear on, the weighting can modify the default
 +
ordering of the printed out list.
 +
There can be multiple sub-menus. Although I am keeping it at just one layer deep
 +
at the moment.
 +
The menus are formed using Java's reflection framework. All public methods of
 +
the CLI class are examined for annotations with a menuID that contains the name
 +
of the current menu (eg, menuID='Main Task' will appear in the menus named 'Main' and 'Task').
 +
The examining of the annotations of the methods is done in the Menu class, whenever
 +
a menu class is constructed it is passed the name of the menu, and all of the public
 +
methods of the creator class (CLI in all cases). Then menu.parseArg() is called
 +
repeatedly in the CLI class, and a pointer to the chosen method is returned for invocation.
 +
 +
Some methods necessitate the entry into a sub menu (such as 'View Tasks; from the main menu).
 +
Switching to a sub menu is handled by using the [[State | State pattern]]. Each sub-menu presents
 +
an option to 'go up one level' (usually in the place of 'exit' on the main menu), this keeps
 +
the hierarchy of sub-menus to just one deep at the moment.
 +
 +
This method of generating menus does cause some issues. I would rather be able
 +
to group menu items relating to similar tasks together, but at the moment menu
 +
items are sorted first by the weighting specified in the annotation, and then
 +
by the natural ordering of the text in menuText. Other than that, it is a
 +
relatively lightweight and flexible way of describing a interactive CLI.
 +
 +
The other option with regard to the state pattern is to implement it as
 +
recommended by the GoF. This could be achieved by moving the methods which are
 +
designated for particular methods to the relevant implementation of the 'Menu'
 +
interface. But in this particular application, there are methods which are
 +
common across multiple menus.
  
 
== Planned Features (including <i>Future Work</i>) ==
 
== Planned Features (including <i>Future Work</i>) ==
(Higher Level) There will be multiple views of the same basic scheduler/ToDo system i.e.
+
;(Higher Level) There will be multiple views of the same basic scheduler/ToDo system i.e.
* Classic (outlook) style view of calender with views of upcoming tasks sorted by priority or chronologically.
+
: Classic (outlook) style view of calender with views of upcoming tasks sorted by priority or chronologically.
* Avatar + stats + task lists as above (more in the style of epicWinApp
+
: Avatar + stats + task lists as above (more in the style of epicWinApp
* An XMPP extension so that you can use your points to get social status and give you even more motivation.
+
: An XMPP extension so that you can use your points to get social status and give you even more motivation.
  
  
(Lower Level) A reg-exp-y based scheduler e.g.
+
;(Lower Level) A reg-exp-y based scheduler e.g.
* This event occurs at 10/03/2010 0700 hrs + i*7 days (so it repeats at the same time every week). Java's calender class should be able to handle months with weird numbers of days &c.
+
: This event occurs at 10/03/2010 0700 hrs + i*7 days (so it repeats at the same time every week). Java's calender class should be able to handle months with weird numbers of days &c.
 +
 
 +
;(Lower Level) Tasks whose points increase or decrease over time e.g.
 +
: This task is worth 120 + 50*(%theDeadline%-(today + 1 day)) points. i.e. you get 170 points if you complete the task tomorrow, 120 if you complete it on the deadline, and the points rewarded decreases linearly with time, maybe you would even get less than 120 if you completed it after the deadline. Although when it got down into negative territory it would never get completed, so maybe there would have to be a <b>automatically applied penalty</b> to whomever the task was assigned to <b>after the deadline has passed</b>.
  
(Lower Level) Tasks whose points increase or decrease over time e.g.
 
* This task is worth 120 + 50*(%theDeadline%-(today + 1 day)) points. i.e. you get 170 points if you complete the task tomorrow, 120 if you complete it on the deadline, and the points rewarded decreases linearly with time, maybe you would even get less than 120 if you completed it after the deadline. Although when it got down into negative territory it would never get completed, so maybe there would have to be a <b>automatically applied penalty</b> to whomever the task was assigned to <b>after the deadline has passed</b>.
 
  
 +
;(Lower Level) Tasks can be completed by multiple people.
 +
: This task is worth 3 payouts of 60 points.
 +
:: So it is essentially a multi (3) stage task and each stage can be completed by different people (or the same person could complete all three stages)
 +
: This is kind of the same as the x% done in classic scheduling apps. It also <b>makes the execute() method an oversimplification</b>. <i>Or does it? If you want to fully finish a three stage task you can call execute() three times.</i>
  
 
Points to keep in mind:
 
Points to keep in mind:
Line 33: Line 168:
 
* Need user and network profile pages
 
* Need user and network profile pages
  
== Whiteboard (for further developing Planned Ideas) ==
 
[[Image:Paul_WIP_twoNetworks.png|center|thumb|1000px|Two different ideas for structuring these classes. Obviously not finalised yet, I am leaning toward "Try No. Two" because when tasks are assigned, they need to be assigned to a network and a person, but the tasks shouldn't know to whom they have been assigned (IMO). So the class which assigns the tasks needs to know that a network is different from a person. (See also the next point below.)]]
 
<br style="clear: both" />
 
=== Network as a composite ===
 
Now I am having issues deciding how to structure the three classes above. My issue with the composite design is that since the Network class has to hold at least all the un-assigned/claimed tasks, the assigner needs to know which Doer is a network (or does it, if the assigner just assigned the task to 'home, paul, josh', that would work.), and something would need to know which Doer was the network to find out which tasks were unclaimed too. So I am pretty sure the Composite pattern is out for this case.
 
=== Network as a ??? ===
 
Here the Network gets passed a task list and assignee list. It adds the task to it's list of tasks, and list of unclaimed tasks if the assignee list is empty (eerrghh). It also assigns the task to the relevant people which are also contained within the Network. ''This is the easiest implementation (right now) and so the one I will start with, it may ot be the best though.''
 
=== Network as a Chain ===
 
[[Image:Paul_WIP_chain.png|center|thumb|500px|This also suffers from hiding the interface of Network.]]
 
Issues with this implementation include: 1) The Doers have to pass themselves to the Request as parameters, again as I have designated that the network should contain at least the unclaimed tasks, then 2) if a GUI say were to display a list of unclaimed tasks It would have to go through the chain casting or calling lots of no-ops until it found all the Networks, 3) else it would have to do some kind of call back request, which would have to know about the implementation of both Network and the class it was to call back too.
 
=== Task ===
 
  
* Q)All tasks must be kept somewhere &ndash; even when they are not assigned to anyone &ndash; where? A) Maybe users should be part of a network, but a network should be more than a just an aggregate of people. This way if a user creates a task but doesn't assign it to anyone, it would still be a member of the network object and will be found when the group is queried for un-assigned tasks. A) Maybe a network should just be a type of doer, but when executing a task it just puts it into the unclaimed tasks list? <i>But then how does the task get assigned to someone? Maybe the class which gives the task to the network searches through the user list looking for the user who the task was assigned to.</i> But since the user list is stored in the network then the assigning class needs to know that there is a difference between a network and a person, and which doer is a network and not a person. <i>So there is no point using composite at all because the points always need to go to an individual person.</i>
 
* Q) More than one person can have a task, what does this mean for the Person.execute() method? &ndash; A) When the task is created (and/or later, maybe by a group op) it should be created as a x person task with y points per person (<i>or as a task worth x payouts of y, this would be analogous to a multistage task, harking back to the %done field of traditional <span title="Personal Information Management" style="border-bottom:1px dotted">PIM</span> apps </i>). Each person has to execute it or maybe it should be executed x times, no matter who by. The second option is probably more correct because a task shouldn't know who it has been assigned to.
 
* The task must have some way of recording who executed it.
 
* A reg-exp-y based scheduler e.g.
 
: This event occurs at 10/03/2010 0700 hrs + i*7 days (so it repeats at the same time every week). Java's calender class should be able to handle months with weird numbers of days &c.
 
* Maybe a Task object could have a getSchedule method which returns a list of all the dates at which the task occurs over the specified amount of time, or a year by default.
 
*Also need a setWorth method set the number of points the task is worth.
 
 
* Tasks whose points increase or decrease over time e.g.
 
: This task is worth 120 + 50*(%theDeadline%-(today + 1 day)) points. i.e. you get 170 points if you complete the task tomorrow, 120 if you complete it on the deadline, and the points rewarded decreases linearly with time, maybe you would even get less than 120 if you completed it after the deadline. Although when it got down into negative territory it would never get completed, so maybe there would have to be a <b>automatically applied penalty</b> to whomever the task was assigned to <b>after the deadline has passed</b>.
 
  
 
== User Stories ==
 
== User Stories ==
* [[Paul Clark US-001-Add Task]]
+
* [[../US-001-Add Task]]
* [[Paul Clark US-002-Assign Task]]
+
* [[../US-002-Claim an Open Task]]
* [[Paul Clark US-003-Execute Task]]
+
* [[../US-003-Execute Task]]
* [[Paul Clark US-004-View Unassigned Tasks]]
+
* [[../US-004-View Unassigned Tasks]]
* [[Paul Clark US-005-Edit Task Schedule]]
+
* [[../US-005-Edit Task Schedule]]
  
 
== External Links ==
 
== External Links ==
 
* [http://g4tv.com/thefeed/blog/post/702668/dice-2010-video-design-outside-the-box.html Jesse Schell's presentation at the DICE 2010 summit - a very enthusiastic look at <i>everything</i> being worth points]
 
* [http://g4tv.com/thefeed/blog/post/702668/dice-2010-video-design-outside-the-box.html Jesse Schell's presentation at the DICE 2010 summit - a very enthusiastic look at <i>everything</i> being worth points]
* [http://www.ted.com/talks/jane_mcgonigal_gaming_can_make_a_better_world.html Jane McGonigal's presentatino at TED - She concentrated on games which could harness gamers gaming hours and put them to use solving Big Problems] People wired up to solve big problems (like a lack of energy), that sounds familiar
+
* [http://www.ted.com/talks/jane_mcgonigal_gaming_can_make_a_better_world.html Jane McGonigal's presentation at TED - She concentrated on games which could harness gamers gaming hours and put them to use solving Big Problems] People wired up to solve big problems (like a lack of energy), that sounds familiar
 
* [http://www.epicwinapp.com/ An iPhone app which is presumably inspired by the same ideas espoused by Jesse Schell and Jane McGonigal]
 
* [http://www.epicwinapp.com/ An iPhone app which is presumably inspired by the same ideas espoused by Jesse Schell and Jane McGonigal]
 
* [http://www.worldofchorecraft.com/ Another (older) web app which gives points for 'chores']
 
* [http://www.worldofchorecraft.com/ Another (older) web app which gives points for 'chores']

Latest revision as of 03:21, 25 November 2010

Contents

Abstracted Motivation: A Points Oriented ToDo List & Scheduler

File:PaulClark-src-and-jar-2010.zip

Brief

Some people (e.g. this author) are lazy, they don't do the things which would be most beneficial to them at all times[1]. One possible solution to this problem of motivation is to mandate that rationality [2] and behavioral psychology be taught in schools, but even if you know are well versed in those fields, applying the concepts can be hard[3]. So sometimes (in my opinion) it is more efficient to manipulate people to do what is best. Or even to manipulate oneself to do what is probably best. This concept can be expanded to allow systems to be put in place which will ensure that the best option is more likely to be taken in any anticipated situation.

When looking to motivate people to do 'as they should be doing' one place which we can take inspiration from is games. The most successful games are those in which people are compelled to invest lots of time (and to do this, the games must be efficient at motivating people). Some of the aspects which make gaming so compelling may include: 1) Seeing the quantified benefit of a task completed (experience points, stats increases, leveling up), 2) working toward a definable goal (as opposed to a vague goal like 'achieve success'), 3) working toward an achievable goal (just 10,000 more exp points), and a biggie - 4) being able to see all the people you are better than, or the people who were better than you, but now are not.

So this program is all about augmenting RL with some of the things that motivate people to play games so often and with so much commitment. I am aware that this sounds like a rather broad goal, but hopefully the proposed OO nature of the design will make achieving this goal a matter of many small incremental additions beyond the scope of this project. Some people think that doing the work of ranking the relative value of a task and entering it into a PC program before even starting it will not motivate people. I think that once you make ranking tasks a habit – and if the quantified results of your decisions are highly visible – then you can become quite motivated, especially if you start out just ranking trivial tasks until you get some points built up in the system (i.e. make an investment in the virtual world).

So basically this is a ToDo application. One in which the items on your ToDo list having a common value (points) attached to them.

Current Design

Currently the design consists of a rather minimal domain model (Task, Person Network), surrounded by a still evolving framework to build he application around it. The main aspects of the application which have been worked on up to now are the command line interface (CLI) and the scheduling framework. At the moment the scheduling framework needs the most work done to get to a stable state.

  • The main feature of the CLI module are the dynamic reflection generated menu generation, using the state pattern to support sub-menus.
  • The main feature of the scheduling back end is the set based recurrencey framework based on Martin Fowler's writings.

Reasoning/Rational

Initially I wanted to make a simple ToDo list. So made a Network class, a Person class, and a Task class--trying to keep it simple. For a while I was stuck on these few classes shuffling them around trying to make something pretty. So to try and further my design I just started implementing some logic in a 'CLI' class. The goal was to get a workable ToDo application so that I could find out what was missing. The first thing I found to be missing was persistence. So I implemented Java's 'serialization' interface. Eventually this will have to be changed to a more flexible method of storing interesting fields. The next major thing to add was scheduling capabilities for recurring tasks. The first go at this was way to general. I tried to specify a very flexible syntax for declaring repeating patterns and that ended up having way too many edge cases and some features which were just plain absent (such as specifying an end to a repeating pattern). I decided to re-implement this using the interpreter pattern. More on this later...

Specific Features/Design Decisions

Schedule

Some of Martin Fowler's temporal patterns used to create the scheduling subsystem
Some of Martin Fowler's temporal patterns used to create the scheduling subsystem


For first attempt at implementing a scheduling system I saved a string specifying the base date and time of the event and extra arguments to specify the recurrence rules. I then generated a list of dates from that stored string when the task schedule was requested. The plan was (as always) to implement the functionality before making it a more maintainable OO design. This approach worked (in terms of functionality), the recurrence rule specification language was very flexible but that caused lots of edge cases while parsing it. Also, the parsing function was large and messy. So I figured I could implement the interpreter pattern. While I was looking around for a better way to handle dates in Java I found some patterns specified by Martin Fowler to deal with dates. More specifically, arbitrary precision time points, Ranges (of time), and recurring events for calendars). These look interesting and like they could be used, albeit with a little work, especially his recurring event language. I also found an implementation of the ideas discussed in Fowler's 'Recurring Events for Calendars' PLoS submission. This doesn't extend the functionality discussed in the paper though, so still some work needed. I have started to integrate this implementation into my design ChronicJ and as it stands now everything works, with less functionality than before started using ChronicJ code. I believe this is due to the fact that the project has been effectively dead since early 2004, I plan to modify this project by ripping out the Schedul classes and adding TemporalExpressions to be more inline with runt for Ruby. Runt implements exactly the same ideas introduced in Fowler's paper but has been used a little more recently.

Referring to the picture above, the short story is that an event has a schedule. A schedule can have some sort of recurrence, that is where the TemporalExpresions come in. These are based on a paper by Fowler entitled Recuuring Events for Calendars. The actual clases I am using at the moment were implemented as part of the (now apparently dead) ChronicJ project. These classes are not nearly all the classes required and they are unweiled in many cases, so eventually (ie over summer) they will be made a little more useable.

The way these temporal expressions are used is to create Unions and Intersections composed of AbstractTemporalExpressions. This way one can create a union of 'The first monday' and 'the last tuesday' of the month. Take the difference of that union and a RangeInYear of February to September. So the task would only actually repeat twice a month outside of February and September.

In summary my initial attempt at scheduling ended up being inelegant, and the replacement is currently incomplete an a little unwieldy. Taking into account the basic ideas of Fowler's paper (rather than the examples provided in it) should enable me to create a much more usable set-based date-recurrence framework, given a little free time.

CLI

The state pattern used to generate an interactive CLI menu
The state pattern used to generate an interactive CLI menu

I haven't had to write a GUI yet in my time at Uni (except for web based), and I had no extension of starting in my final year. Writing an interactive CLI app in java poses its own challenges though. After spending some time adding new methods to the CLI class, I got rather sick of modifying the menu which was printed out to the user (and the switch statement) to keep in-line with the new methods. So I implemented a system to dynamically generate a CLI menu base on method annotations and Java's reflection framework. Methods are designated as occuring in the CLI menu by annotating them with a custom annotation:

@Retention(RetentionPolicy.RUNTIME)
  @Target(ElementType.METHOD)
  public @interface CLIMenu {
    public String menuText();
    public String menuID();
    public int weighting() default 50;
  }

The menuText field is that which is printed to the console, the menuID specifies which menu this option should appear on, the weighting can modify the default ordering of the printed out list. There can be multiple sub-menus. Although I am keeping it at just one layer deep at the moment. The menus are formed using Java's reflection framework. All public methods of the CLI class are examined for annotations with a menuID that contains the name of the current menu (eg, menuID='Main Task' will appear in the menus named 'Main' and 'Task'). The examining of the annotations of the methods is done in the Menu class, whenever a menu class is constructed it is passed the name of the menu, and all of the public methods of the creator class (CLI in all cases). Then menu.parseArg() is called repeatedly in the CLI class, and a pointer to the chosen method is returned for invocation.

Some methods necessitate the entry into a sub menu (such as 'View Tasks; from the main menu). Switching to a sub menu is handled by using the State pattern. Each sub-menu presents an option to 'go up one level' (usually in the place of 'exit' on the main menu), this keeps the hierarchy of sub-menus to just one deep at the moment.

This method of generating menus does cause some issues. I would rather be able to group menu items relating to similar tasks together, but at the moment menu items are sorted first by the weighting specified in the annotation, and then by the natural ordering of the text in menuText. Other than that, it is a relatively lightweight and flexible way of describing a interactive CLI.

The other option with regard to the state pattern is to implement it as recommended by the GoF. This could be achieved by moving the methods which are designated for particular methods to the relevant implementation of the 'Menu' interface. But in this particular application, there are methods which are common across multiple menus.

Planned Features (including Future Work)

(Higher Level) There will be multiple views of the same basic scheduler/ToDo system i.e.
Classic (outlook) style view of calender with views of upcoming tasks sorted by priority or chronologically.
Avatar + stats + task lists as above (more in the style of epicWinApp
An XMPP extension so that you can use your points to get social status and give you even more motivation.


(Lower Level) A reg-exp-y based scheduler e.g.
This event occurs at 10/03/2010 0700 hrs + i*7 days (so it repeats at the same time every week). Java's calender class should be able to handle months with weird numbers of days &c.
(Lower Level) Tasks whose points increase or decrease over time e.g.
This task is worth 120 + 50*(%theDeadline%-(today + 1 day)) points. i.e. you get 170 points if you complete the task tomorrow, 120 if you complete it on the deadline, and the points rewarded decreases linearly with time, maybe you would even get less than 120 if you completed it after the deadline. Although when it got down into negative territory it would never get completed, so maybe there would have to be a automatically applied penalty to whomever the task was assigned to after the deadline has passed.


(Lower Level) Tasks can be completed by multiple people.
This task is worth 3 payouts of 60 points.
So it is essentially a multi (3) stage task and each stage can be completed by different people (or the same person could complete all three stages)
This is kind of the same as the x% done in classic scheduling apps. It also makes the execute() method an oversimplification. Or does it? If you want to fully finish a three stage task you can call execute() three times.

Points to keep in mind:

  • Different people are motivated by different things (thanks Simon)
  • Could sync stats and tasks with other platforms like phones, fb &c. to enhance the social re-enforcement aspect
  • When someone procrastinates they can choose to do a task because it seems like the most important thing to do now, when in-fact, the person doesn't actually qualitatively compare one potential task with another[4]. Indeed comparing apples with oranges is rather hard. Forcing someone to assign a worth (exp. points) to a task when it is first proposed means that the person has moved from comparing apples and oranges to comparing exp. points with exp. points, and if a points system manages to encapsulate the value of a task, then it is an unarguable that if one task has more points than another, it is more important.
  • Got any more ideas?
  • Need user and network profile pages


User Stories

External Links

Personal tools