Trackle Reports – Extending with care

One of the hardest things to do is to know what not to add to an app. To know how to get to the essence of a piece of functionality, and not add more than that. When you put it the feature in the hands of users, they will tell you what is missing, but you will rarely get specific feedback on the things that aren’t needed. Instead you get feedback like “it is too complicated”.

In my case I have received feedback about Trackle both in person, and through feedback in the App Store. Trackle needs a reporting feature, and some way to let me export my data.

Is that one feature, or two? How should export work? As a consultant for Neudesic, I am required to track my time to be able to bill our clients. We have a time and billing system where I have to put my time every day. For me personally, Export might mean “Put my time into Neudesic’s time and billing system”, but such a feature would be very user-specific (though I’m sure my co-workers would be super happy!)

And how about Reporting? Do I just dump the data into a CSV file and let you pull it into a spreadsheet? That would be flexible, but not much fun for the user, as it puts it on them to query data for even the most basic need. However, it does meet the “Export” requirement.

I felt like I needed to be able to pull data out in a way that let you go back in time. To see summaries of what had been captured, but without making the feature too complex. I had to retain the simplicity that gives Trackle its flavor.

In the end I put in a fairly simple reporting view that let me see roll ups of my time in various date ranges. Rather than have the user provide start/end dates (those picker wheels aren’t much fun), I chose to offer a fixed set of date window sizes in multiples of weeks or months. You can swipe to go back through time.

To make the view more useful, I allow categories to now be marked as Billable vs. Non-billable, which makes it easier to see whether you have met your billable target in a given week.

As for Exporting, I decided to start simple. For version 1 of this feature I integrated the LibXL library, which allowed me to create an Excel spreadsheet (for Excel® 2007 and later). This spreadsheet contains the same report data you see on screen, but also includes separate sheets for all of the daily total and planned hours in the given date range. With this I felt the end user could get to the data they needed, but without me making it super specific to any one use-case.

I chose Excel format, as it is widely supported, including by Apple’s own Numbers® app, as you can see on the screenshot on the left.

Of course, I am open to feedback, and I’m sure I will get it. I deliberately left a space in the toolbar at the top-left for me to add settings and customizations. It would be interesting to allow for a custom date range. I would like to make it so that if you click on a row in the report, you get a full-screen graph plotting how your total and planned hours changed over the time period. I could probably add both of these without cluttering the app too much. I also considered letting you click on the hours shown to switch between total and planned hours.

One last thing I had to consider was how to monetize Trackle so I could make something back for all of the time I have invested in it. Rather than charge for the app itself, I decided to make the more advanced parts of the reporting only available to users that paid to unlock those features through an in-app purchase, which includes the Export feature. This will let me keep the app itself totally free, and only monetize the features that cost me money to add (the LibXL library is sadly not free).

Trackle 3.1 will be available in the App Store in the next week or so, once approved by Apple. Let’s hope I got the balance right.

Trackle – time tracking made quick and easy

Your work requires you to track your time so you can bill your clients. Or perhaps you just want to know how much time you spend at the gym, watching TV or playing video games.

If you need to track your time quickly and easily, now there’s Trackle.

Trackle starts with a list of categories that you define. Add your various clients in, or create categories for Gym time, or whatever you want to track.

From here you can start time using simple VCR-like play/pause controls. Easy at that.

Use the Edit button to quickly re-order, rename, or add new categories.

Once a category is no longer required you can archive it. This will hide it from you list, but it can quickly be brought back – your data is not lost.

Click to start another category and your previous timer stops running.

Once you are tracking time, you can use the Schedule view to get a month-by-month snapshot of the time you have captured.

The schedule view lets you go back through all of your captured time. With a single click you can filter to show or hide your archived projects. You can control how your time is rounded, either to the nearest minute, to nearest 15 or 30 minutes or the closest hour, which is extremely useful when you have to report your time.

Finally, for each category you are able to define how much time you planned to spend on a daily basis. With that information on hand, Trackle can tell you how you are doing against your plan. See your actual capture time, your planned time or the difference between actual vs planned – great for keeping you on track.

Clicking on a day in the schedule will open up the Daily/Weekly view seen below. From here you can see how that day’s total is made up. Click on a category here to quickly adjust the captured time using our easy to use adjustment dial. The adjustment dial defaults to adjusting in 5 minute increments, but can be changed to 1, 10 or 15 minute increments. You can also update your planned time, and even edit notes about the work you performed that day. These notes then appear in the daily view to give you an at-a-glance information about what you did and how long you spent on that task.

Trackle is available now from the App Store.

Click here to learn more.

Simple async file access using Windows 8, part 2

In the previous article I presented a helper library for reading and writing to the file system using the new Windows Runtime asynchronous file APIs.

One downside of the code I presented is that the actual reading and writing was still happening on the main UI thread. While this may not be a problem in a simple application, it is undesirable for complex documents.

The challenge is that we still need to be on the UI thread when we collect the data we want to save, but the writing itself could be on a background thread.

In this article I will cover a way to extend the API I presented previously, to allowing reading and writing via a background thread.

Read More

Simple async file access using Windows 8

This article refers to pre-release software. Some or all of what is presented could change between now and release.

This week at the Build Windows conference, Microsoft announced Windows 8 and introduced the new Windows Runtime APIs for the developers.

As a C# developer, one of the defining features of the Runtime is that a lot of the .NET Framework is “gone”, or moved to new namespaces. Nowhere is this more true than in System.IO, which is now fairly barren. The reason is that most of the file I/O APIs in the Windows Runtime are designed to be asynchronous, and as these new APIs are in the Runtime, they’ve moved into the Windows.* namespace.

As it turns out, reading and writing files using the new asynchronous APIs is a little convoluted. OK, its a lot convoluted, but I’ve put together some code that should simplify it for you, while also taking you through the steps involved.

Read More

My Daily submitted to the App Store

I have just submitted a new app to the App Store called My Daily.

The purpose of the My Daily is to simplify entry into the Calendar for situations where you are given a daily schedule of back-to-back tasks.

My Daily main screen

The app allows you to set a daily start time. When you add an event, you pick the name from a list of names you define. Each name can be associated with a color swatch, allowing you to classify similar names with the same color.

Your first event will start at the daily start time, and subsequent events will start right after the previous event. Now you can add an event to your calendar by simply picking a name and clicking Save!

My Daily edit screen

The neat thing is: if you delete an event, change its duration, or re-order the event, the start/end times are automatically updated. And the whole time, all of your changes are being synced into your iPhone’s Calendar, so you get all the same automatic alerts you expect.

And because My Daily syncs to your iPhone’s Calendar, each event can also have a reminder alert a few minutes before it is due to start. Reminders are also picked with a single click (no more navigating between screens).

* Update – My Daily is now live in the App Store.

iPad HD… let it be true

Strictly one from the rumor mill, but I’m pretty pumped about the rumors of an upcoming iPad HD (or whatever they decide to call it).

The short version is: a pro-sumer iPad intended for users of Apple’s pro-sumer apps such as Final Cut Pro. The device is rumored to have a 2048×1536 Retina display (around 300dpi). I’d also expect to see 128GB of storage and LTE to store and move those big media files around.

Less sure is what it will look like. There were some rumors a few weeks ago that Apple was testing a black powder coat treatment for the MacBook Air, but then an alleged Apple engineer claimed it had been abandoned because of fingerprints. I guess I’m expecting the case to be black or dark grey to match the look of the pro-sumer apps, and to distinguish it from the regular (and much cheaper!) iPad 2. Apple even has an agreement to use LiquidMetal, which is darker than the aluminum on the “2″.

In other news, there was a rumor that Apple was looking to add a second manufacturer for the iPad alongside Foxconn, but this was quickly rebuffed with a statement to the effect of “Foxconn is still the exclusive manufacturer”. But what if what is happening is: Foxconn will start building the iPad HD at their Chengdu plant, while the existing Shenzen plant continues to build the iPad. So in that regard, the original rumor and the rebuff are both true.

Whatever it turns out to be, I know I’m going to want one.

Sharing a Mac screen via Live Meeting

For those of you using a Mac in a largely Windows-based company, you may have times where you need to present content on your Mac from a PC running Live Meeting.

One fairly simple way to achieve this is by enabling Screen Sharing via System Preferences:

Once Screen Sharing is enabled, you can run UltraVNC on your PC to connect to your Mac using the URL shown in the Screen Sharing window.

Now in Live Meeting, share your Desktop (or just share the UltraVNC window).

Note: it is also possible to do this from inside a virtual machine on your Mac using VMWare Fusion or Parallels. However, the Mac Screen Sharing feature will share all of your screens, including the one where VMWare is running, meaning once you get VNC running in your virtual machine, you will want to use Cmd-H to immediately hide the virtual machine or get an infinitely recursing window tunnel!

Alternatively, Simon Guest informs me that RealVNC Server for the Mac will let you specify which monitor is shared. You would want to use RealVNC Server in place of Mac Screen Sharing if you are going to try it this way. (You’ll get errors trying to use both on the same Mac as they would both be trying to use the same ports.

If you are doing this using a separate PC talking to your Mac, don’t forget you are simply sharing your Mac screen, so the Mac keyboard and mouse can be used to control the action, making it more responsive than trying to use the PC keyboard and mouse via VNC.

You can download UltraVNC here: http://www.ultravnc.com/

Location-aware mobile web testing in iOS5

One cool addition to Xcode 4.2 with iOS5 is the ability to test your location-aware application directly from inside Xcode through the same Edit Scheme screen you use to set up Environment Variables and command line arguments.

One current limitation is you can’t directly leverage this to test your mobile web sites, although the Simulator does provide some boilerplate locations built in.

A workaround is to create a small Universal iOS app in Xcode, and tell it to load your mobile web site’s URL during applicationDidFinishLaunching.

- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSURL* url = [NSURL URLWithString:@"http://www.google.com/"];
    [application openURL:url];
 
    exit(0); // remove this to keep the debugger running!
 
    return YES;
}

I can now use Edit Scheme to set my location, or create multiple schemes each for a different location. When I run this application, the GPS will be initialized with my prescribed location, then Safari will be invoked to open the URL I provided.

(Notice how in the second image Google is providing the “See Places Near” using the London location I provided).

By removing the exit(0) statement, it should even be possible to leverage the GPS automation capabilities provided by the new version of Instruments to automate the location over time and have Safari pick that up, though I haven’t had time to test this.

ContentBundle demo updated

I’ve updated the demo app for the ContentBundle application. The application now presents a UIWebView showing HTML from the ZIP file.

An Update button causes the app to reach out to the server and reload the page.

The screenshots below show the app before and after updating:

Read More

We love you, Grand Rapids, MI

What a great rebuttal to being put on Newsweek’s list of “dying cities”…

Page 1 of 212»