Saturday, March 28, 2009

On the Dataset Builder

I wasn't sure how to incorporate these mockups into the Dataset Builder Project page on the wiki, so I've uploaded them to and posted them to my blog. At some point, I'll work on getting these converted to Balsamiq, but for now they will just have to remain as scanned paper mockups.

NOTE:This is just a rough draft. I'll clean this up when I get a chance. Oh and it would be great if someone could tell me how to embed HTML into mediawiki.

Create a Patient Dataset

Dataset Builder - Create a Patient Dataset

Create an Encounter Dataset (v1.1)

Dataset Builder - Create an Encounter Dataset (v1.1)

Create an Observation Dataset

Dataset Builder - Create an Obs Dataset (v1.0)

Create an Encounter Dataset

Dataset Builder - Create an Encounter Dataset (v1.0)

Examples of Datasets

Dataset Viewer - Dataset Examples

Create a Dataset (v1.0)

This is an early version of the Dataset Builder (circa 2008). Not too many features. You add some columns, choose a cohort and ... voila ... you get a dataset to play around with. There are some other features like moving/deleting columns, but the idea was to keep things simple.

Dataset Builder - Create a Dataset (v1.0)

Create a Dataset (v1.1)

The next version of the Create Dataset feature ...

Dataset Builder - Create a Dataset (v1.1)

Thursday, March 26, 2009

On the Quartz Scheduler Project

I have been trying (in vain) to get the Quartz Scheduler project page up on the OpenMRS wiki, but keep getting the following error when posting my changes:

So for now, the project page will just have to be left here.


There are many activities within a healthcare information system which benefit from automation. For example: daily clinic reports might need to be generated the morning before a clinic opening, decision support rules might need to be run over a patient group once every week, or healthcare data coming in from outside sources might need to be analyzed every 30 mins. To give end implementations the flexibility to define these sorts of automated conveniences, the OpenMRS community has added scheduler functionality to the core software application. The OpenMRS scheduler (based on the JDK Timer) currently supports executing tasks on regular basis (i.e. a task will execute every X seconds, minutes, hours, days). However, there's no way to schedule a task to recur at a particular time every week. The data model supports this type of feature (start time and repeat interval), but we need to add some logic to the Scheduler to handle triggering these tasks to occur at exact times.

We want to support more complex scheduling (i.e. cron-like) in the very near future, where we can specify rules that will allow Tasks to run more more/less frequently based on the day/time. For instance, an implementation might want to schedule a Task to run once every day at midnight, but also at 6pm on Saturday and Sunday. This type of scheduling would be difficult to support using the JDK Timer, so we would like to add an extension point to the scheduler to allow a developer (probably myself) to create a module based on the [ Quartz Scheduler]. This will allow us to handle more advanced scheduling requirements.


High Level Goals

  • Decide whether to build as a module to extend current functionality or as a core component to replace the current functionality.
  • Decide whether to include Quartz tables in the OpenMRS data model (there are about 7 Quartz-specific tables).
  • Implement a Quartz version of the scheduler to extend (possibly replace) the current JDK Timer implementation.
  • Implement features that allow a user to manage scheduled tasks.
  • Redesign the Manage Scheduler user interface to provide a more user-friendly and intuitive experience.
  • Create unit tests for each expected behavior of every method within the scheduler service and its domain objects.

User Stories

Student will be responsible for soliciting requirements (user stories) from users/implementers. Here are just a few examples of user stories that might be applicable to this project.

  • Allow a user to view all available tasks.
  • Allow a user to view all scheduled tasks.
  • Allow a user to create a scheduled task.
  • Allow a user to update a scheduled task.
  • Allow a user to delete a scheduled task.
  • Allow a user to schedule tasks to be run on an interval (i.e. every 30 seconds) or at specific moments in time (Tue, March 24 at 10:42pm).
  • Allow a user to schedule emails to be sent at a specific time.
  • Allow a user to schedule reports to be generated and sent to stakeholders at a specific time.
  • Allow a user to start an available task.
  • Allow a user to stop a scheduled task.
  • Allow a user to check whether a task is currently executing.

Planning Process

  1. Identify user roles that will be using the scheduler
  2. Identify user stories for each role by interviewing users / stakeholders
  3. Prioritize user stories using MoSCoW rating (Must, Should, Could, Want)
  4. Estimate user stories (a.k.a Planning Poker) using ideal days (0.5, 1, 2, 3, 5, 8, 13, 20)
  5. Discuss acceptance criteria (expected behavior) for each user story with stakeholders.
  6. Create a Release backlog for the current sprint / iteration
  7. Estimate / calculate velocity (i.e. 20 story points)
  8. Create an Iteration backlog of stories
  9. Create tasks for each user story in the iteration
  10. Assign estimated hours to each task
  11. Mockup user stories prior to start of sprint to solicit feedback.
  12. Run sprint for iteration duration (between one to two weeks)
  13. Deploy features completed during sprint to
  14. Solicit feedback from users/stakeholders
  15. Re-prioritize and re-estimate users stories / tasks
  16. Recalculate velocity
  17. Create an Iteration backlog for stories that fit into
  18. After X iterations, deliver final release


This section will be completed by the mentor and student.

  • Iteration #1:
  • Iteration #2:
  • Iteration #3:
  • Iteration #4:
  • Iteration #5:
  • Iteration #6:
  • Release:


This section will be completed by the student.


Still compiling questions/answers. Will post by Friday.


Project Resources

  • [ Project Discussion] (has not been created yet)
  • [ Release Backlog] (has not been created yet)
  • [ Iteration Backlog] (has not been created yet)

OpenMRS Resources

  • [ Scheduler API]
  • [ Quartz Scheduler Developer's Guide]
  • [ Quartz Scheduler User Guide]
  • [ Technical Discussion about existing Scheduler]
  • [[ticket:357|Ticket #357]]
  • [[ticket:359|Ticket #359]]
  • [[ticket:1056|Ticket #1056]]


  • [ Justin Miranda]
  • [ Student Blog]


  • For more information on Quartz, please see the [ Quartz Project] home page.
  • more resources to follow

Thursday, March 5, 2009

On Transparency and Staying On Task

The Problem
If you've ever wondered, "What the heck is Justin doing right now?" ... you're not alone. I often wonder what it is I do every day.

The Tangent
Sorry, this reminds me of a scene from Office Space, that I would be remiss to miss quoting:

Bob Slydell: What would you say ... ya do here?
Tom Smykowski: Well look, I already told you! I deal with the g*dd*mn customers so the engineers don't have to! I have people skills! I am good at dealing with people! Can't you understand that? What the hell is wrong with you people?

The Problem (again)
Most of the time, a day passes and I am absolutely exhausted, I feel like my mind hasn't stopped running all day and yet I don't feel like I've actually accomplished anything. I know that I have ... just probably not what I was supposed to be doing. Well, I'm tired of that feeling. Over the years, I've tried every possible system to help me with time/project management: simple ToDo lists, GTD, Agile, Agile + GTD, GTD + FYI + BTW, and even Tony Robbin's tapes. I've worked with systems like Jira/Trac to keep track of the larger tickets/projects, GTD with Day-Timers, GTW with hipster PDAs (moleskin), GTD with real PDAs (BlackBerry 8830) to keep track of the daily tasks, and SlimTimer (which is awesome, by the way) to keep track of actual time spent on tasks. I've used online todo lists with RememberTheMilk, simple todo lists on $1 notepads, electronic todo lists on $200 BlackBerries or in Thunderbird Tasks, or even in Notepad (ala Yaw Anokwa, who also incidentally gave us Bacon-wrapped OpenMRS).

Nothing seemed to work.

And I'm not entirely sure why these technologies and processes haven't helped, but I think it might to do with the fact that I have too many inputs: email, e-task list, paper-based task list, jira, trac, skype, meetings). Another problem is that I'm always "too busy" to follow up on the tasks I've worked on or completed, to leave notes about where I was or to close tickets, so my inbox just keeps growing and growing and the contexts for those tasks keep getting lost. Still not sure how to handle that problem other than to schedule some time every week for "cleanup" and assessment. Unfortunately, the time gets scheduled away with something else. How do others deal with that issue? I guess it's just a matter of will-power and stopping yourself when it's time to move onto the next thing.

The Solution (Staying on Task):
Anyway, I've come up with an approximation of a solution to the problem. I recently decided to try to integrate all of these various task/time/project/life management tools into something that will help me stay on task and keep everyone informed of what it is that I'm up to. It involves integration of a few key systems that each, by themselves, help solve a little piece of the puzzle and together, I'm hoping for better throughput and transparency all around.

Storing Tasks
I love Remember the Milk, but I hate logging into a web site to manage what I should be working on. Ideally, I'd rather have someone (or maybe something) tell me what I should be doing at any given time during the day. Unfortunately, I still haven't found a solution to that. However, RTM at least gives me a way to manage my todos, a database for all of my tasks. Which is a good first step. I've now got an @OpenMRS context in RTM with all of my daily todos from some of my in-progress and future OpenMRS/PIH tickets.

Managing Tasks
Now, I just need something to help me manage tasks, that doesn't require me to log into a web site several times a day. RTM has a great feature that allows you to sync with the BlackBerry (as well as iPhone). I am now using that service to manage tasks when I'm away from my computer. Unfortunately, it doesn't work so well when I'm sitting in front of my computer because it takes a few more seconds to type in the task using the BlackBerry's tiny keyboard. And seconds are hours in the software world (or maybe just in my world). So, I needed something that was sitting right there in front of me, on my laptop, whenever I needed it. I tried using the Thunderbird RTM Provider that integrates with RTM, but ran into a few bugs that were showstoppers. The add-on definitely has promise and I would highly recommend it once it matures for a few more weeks/months.

That brought me to Tasque, which is a neat Gnome project (for Ubuntu) that was developed during the 2008 Google Summer of Code. Tasque integrates with the RTM backend and allows me to add/remove/edit tasks from my desktop. There are still some quirks in Tasque (it won't let me move tasks to different contexts once they've been added), but the pro's far outweigh the con's.

Managing Time Spent
The final problem to tackle was that of "time spent" on tasks. This one was easy. Since, I always have at least one FireFox window open at all times, I use SlimTimer in the sidebar of Firefox to keep track of the time that I spend on individual tasks. I haven't perfected the system yet, but I current track high-level task categories, like Code Review, Design, Development, Testing, Meeting, and Troubleshooting. I will probably get more fine-grained at some point. Unfortunately, there's currently no way to integrate SlimTimer with RTM, so I have to add tasks to the SlimTimer sidebar manually. Keeping the tasks as high-level categories gives me the consistency I need to actually use SlimTimer every day.

The Solution (to the other problem ... "Transparency")
The other nicety from all of these systems working together is that I now I have a way to show what I'm working on all in one place. You can see some of the feeds I've set up for open tasks/tickets, as well as completed tasks/tickets (coming soon). Hopefully that will provide some needed transparency and help others give me feedback on what they think I should be working on.

The Conclusion
So in conclusion, what I settled on was a combination of Jira/Trac to manage big tickets, RTM + Tasque + BlackBerry Tasks to manage daily todos, and SlimTimer to manage the time spent on those tasks. We'll see how this new system goes.

Wednesday, March 4, 2009

On Features and Feedback

A few months ago, at an AspirationTech conference in Oakland, CA (one the best conferences I've ever been to - by the way), I found out about UserVoice ... a website that provides "users" [of a product] a chance to voice their opinions about what features that'd like or bugs they want fixed.

So, if you're an OpenMRS user and you have an idea for a feature, click on the "Feedback" link on the left edge of your browser to submit an idea to OpenMRS. This is kind of an experiment at the moment, but I'm hoping we can solicit some good suggestions from our users and give you guys "a seat at the table" as we start planning out our road map for the upcoming (already in-progress) year.

There's also GetSatisfaction. I haven't used it yet, but have heard some good reviews. If you have comments about either or another feedback tool, please let us know.