Roomr 4.0, the first beta

This morning I submitted the first build of Roomr 4.0 to Apple for Beta Testing.

I know it has only been three months since I released 3.0, but I’ve decided that since I’ll adding two or three large new features, that 4.0 seemed more appropriate.

So what is coming in 4.0?

With Roomr, there have been a few consistent feature requests.

  1. Browse all the rooms like I do in Outlook.
  2. Invite people to meetings.
  3. View the details of a meeting.

I’ve resisted implementing some of these (2 & 3) because I felt they were in keeping with the spirit of the app.  Request 1 was due to sheer complexity. Roomr uses Exchange Web Services for availability, but this doesn’t offer any access to the Address Book within Exchange.

Browse all the things!

After pushing back, I decided to roll up my sleeves and try to tackle request 1. Lots of people had written to me asking why they couldn’t browse rooms. When I explained that you could using Exchange Room Lists, I was met with blank stares and comments like “My IT guys won’t do that”. I took the stance of “sorry, but hard cheese”.

On reflection, this wasn’t the best idea I ever had.

You see, Browse required an upgrade to Pro or the purchase of the Pro version.

You can imagine that a lot of people were quite pissed off that, having upgraded, they still couldn’t browse. I’ve seen quite a few refunds issued because of this. I mean, I don’t blame people, in spite of the fact it was clearly stated in the description of the app that Room Lists were required. People see it work in one bit of software and expect it to work like that everywhere.

I rolled up my sleeves.

Exchange implements a protocol named MAPI. This, traditionally, is accessed using RPC. RPC is hard and really low level (we’re talking TCP streams).  I wrote RPC implementations in C back in 2002, so I was no stranger to it.

Thankfully, Microsoft have “upgraded” this over time, offering RPC over HTTP. I read the specification. Twice. And decided that wasn’t going to happen anytime soon. With Exchange 2013, Microsoft added MAPI over HTTP. Not exactly JSON based, but doable. It was still binary, just blobs of bytes sent over HTTP, which, in reality, is no different from a JSON based request. Old School.

I read the docs and set about building an implementation in C# that used lots and lots of Byte[]. After lots of short bursts of work spanning a few weeks, I got it working. I then ported it to Objective-C and, after more trickery, I got it working with Roomr.

Simulator Screen Shot 29 Mar 2016, 09.31.04

This screen shot shows the updated Browse view, where you can see the All Rooms address list and the Room Lists.

Expanding the All Rooms list shows all the meeting rooms within Exchange.

Simulator Screen Shot 29 Mar 2016, 09.31.09

I’m pretty proud of myself right now.

I hope this will make Roomr much more useful to people, since they won’t be replying on their IT guys to create and maintain Room Lists. I also hope it’s more accessible.

I’m planning on making Browse “free”, so it won’t require the upgrade.  I hope this will encourage more use and by making other features premium ones, such as booking and opening appointments, I’ll encourage more conversions.

I will only know if I try.

If you’d like get an early look at Roomr 4.0, please get in touch and I’ll invite you to the Beta. This

This stuff is all quite new, so the more instances of Exchange it is tested against, the better.

Thanks for reading,

Tom

PS I’ll be writing up a post on how I got MAPI over HTTP working. I’m sure about four people in the world will find it interesting, but it’s been an experience trawling through 9 different PDFs and reading hex code Smile

Advertisements

Explain FreeAgent bank transactions using email receipts

As part of my ongoing efforts to integrate email and FreeAgent, I’ve created a short screencast that shows how Invoice Porter can automatically explain bank transactions based on email receipts sitting in your inbox.

 

The product is in beta right now, so if you’re interesting in trying the service, you can hop on over to https://invoiceporter.azurewebsites.net/ and signup.

I’d love to get your feedback!

Introducing InvoicePorter for Email

Some of my regular readers (?) will recall a post I made on the first of February, titled “Import SaaS invoices into FreeAgent”. In this post, I outlined a Chrome Browser Extension I built that short circuits some of the effort needed to get invoices from your various online providers into FreeAgent. This little utility has been saving me time and hassle and I figured others might find it useful too.

I don’t use Chrome

After sharing it, I got some feedback from people saying a) they didn’t want to use Chrome, b) they didn’t want to have to visit lots of websites to get their invoices and c) they just use their inbox. On further questioning, I was surprised to discover that these users focus their efforts around email and spend time exporting and importing PDFs. This is an activity I perform once a month, since my accountant emails me an invoice.

I had considered email integration when I first started working on a solution to my invoice woes, but one of my concerns was privacy. I didn’t want to capture or store user’s information. This made a local browser extension an ideal solution since the data only leaves your computer when going to FreeAgent. That said, there seems to be a few people doing this mundane, repetitive task a few times a month.

Automate it!

I decided to see is this was something that could be automated, for everybody knows that computers love mundane, repetitive tasks (until they rise up and enslave us).  The idea was simple. Connect to your Gmail account, import emails that contain invoices and add those invoices to FreeAgent.

After a few hours reading the Gmail API documentation and screwing around with OAuth (!), I figured it was possible, so I got started.

After three weeks of coding for a few hours each evening, I’m proud to say that I got it all working. It’s not fully automatic, but enough to make the chore less annoying! MVP and all that.

Invoice Porter 0.1

This is Invoice Porter 0.1. Forgive the name. All the cool invoice related names are taken.

Setting up Invoice Porter is straight forward. You need to connect to both FreeAgent and Gmail. This is done use OAuth, so no messing around with passwords. Gmail access is Read Only, so Invoice Porter can’t alter your account or send emails. This is the settings screen.

image

Ignore the fact the Enabled switchs are off. It’s more for decoration.

You can see under the poorly titled “Connections” heading, that I’ve connected my Gmail account and that I’m using a Label called invoices. When you add the Gmail connection, you can choose any of your existing labels. Using a label means that Invoice Porter is only notified of email that’s tagged with that Label. This saves my backend code having to sift through all your email and it gives you more control over what invoices are actually processed.

Once hooked up Gmail, you just apply the “Invoices” label to emails as they arrive. I also think Gmail will let you do this automatically, but I don’t know. I should, but I don’t.

image

Once you start tagging emails, they will appear under the Invoices tab, automatically!

image

This screen isn’t great (who needs to see milliseconds?) and you’ve probably spotted the emails are from me (I’m forwarding them for testing purposes), but I hope you get the idea.

Clicking on an invoice opens the import screen.

image

On the right, you’ll see a preview of any PDF that has been attached. I’m using an evaluation library to render it as an image (hence the red text sprawled across it). The idea is that you’ll see the content of the invoice, giving you an easy to to copy it across into the relevant fields on the left. In the image above I’ve used a random PDF for demonstration purposes.

This should make it easy to import into FreeAgent. At present, this screen will create an explanation for the selected bank transaction, so you can use some of the details (such as date and amount) to prepopulate the fields even further. If you’re like me, lots of invoices come from the US, so they are in dollars, whereas the bank transaction is in pounds. Use the details from the transaction itself means you don’t need to worry about trying to guess the exchange rates.

The Tech

In terms of technology, InvoicePoter is written using ReactJS with a C# WebAPI backend, hosted on Azure. Data is persisted using Azure Table and Blob storage. Unfortunately, Table Storage isn’t really suited for storing a few rows per user, so I need to look at something else, maybe DocumentDB. Authentication is provided by Auth0. Pretty slick.

What’s next?

I’m quite keen to release this application onto the world. I have to clean a few rough edges in the UI and I need to move it from sandbox APIs to production APIs. I also have to sort out refreshing access tokens and renewing Gmail watches, but that should be straight forward enough.

I need your help

I really need to get this product & idea evaluated by real people, to be sure it’s helpful and something that saves you time. I was to eventually automate it, so that PDFs can be parsed automatically and explanations created with your direct input. To this, it needs to be generating revenue and I can only generate revenue by building a product that makes people’s lives easier.

If you’re somebody that’s currently saving their PDFs to disk before adding them to FreeAgent, I’d love for you to get in touch. My email is tomas@coldbear.co.uk.

If you’re not, but you know somebody who might be, could you please share this post with them?

As always, feedback is welcome. If you’ve any questions or comments, email me or use the comments section on the blog.

Thanks!

TestMDM 2.0 is now live!

It’s been two years since the release of TestMDM 1.0. Today, I unleash version 2.0 onto the world!

Whilst the aim and core functionality of TestMDM hasn’t changed, I’ve completely overhauled the UI, both from a visual perspective and a usability persepective.

Visual

TestMDM 1 used the popular Bootstrap CSS framework and relied on KnockoutJS for interactivity in the UI.

With version 2.0, I decided to use the opportunity to learn ReactJS. This provides what’s called a Single Page Application approach. When you open the dashboard, you should notice that opening a device is very fast and smooth. The UI is completely self contained and doesn’t reply on ASP.Net to generate it each time.

I’ve also opened for the CSS framework called Semantic-UI. Bootstrap is great, but I fancied a change and I like the clean lines and components offered by Semantic-UI.

Usability

The biggest change to TestMDM is the way you interact with it. In version 1.0, the focus was around commands. Creating them, sending them, waiting for them to be acknowledged. This was an effort to keep the app aligned with the actualy behaviour of the MDM protocol that underpins iOS.

Whilst it worked well and nobody complained, it always seemed a little repedative. For example, when you are testing configuration, you had to constantly select PList files and queue them, in spite of the fact you probably only made a tiny change to the configuration itself.

In version 2.0, I decidd to move the focus back to the devices and apps, which is what you actually work, rather than commands.

Devices are easier to add now, you only need to scan a QR code or send an SMS. This should make the process a whole lot easier

testmdm_barcode

Once the device has been added, you’ll see a dashboard.

image

The Device dashboard now shows some detail. You can see what apps are installed, delete the device or clear any pending commands (I’m going to get rid of this soon!).

This will be the place where you can also install configuration profiles and potentially alter other bits and pieces, depending on what you, the user, wants.

When you install an app, you’ll see a clear indication of what’s actually happening

image

 

 

 

 

This, I hope, will clear up any confusion about what’s going on and should the installation fail, you’ll get feedback pretty quickly. I should point out that this progress bar isn’t finished and does report some odd stuff, but I’m working on improving this.

When you select an app, you’ll now be taken to a dedicated app page, giving you a single place to manage configuration and feedback.

image

This let’s you tinker with the configuration directly, without needing to edit a file and resubmit.

image

In my own testing, this has been the biggest time saver of all.

Another benefit of having a the application broken out like this is the fact you can now bookmark pages for devices and even apps. This will it easy to get back to where you were and carry on testing.

What’s Next?

This is just the initial release, so some features are missing. I’ve turned off the VPP part, since I want to rework it in the same fashion, making it easier to understand (and hiding some of the complexity).

I’m also building an internal admin page for myself, which will let me respond to user issues with more speed.

With this tool proving pretty useful, I’ve got some ideas for exposing an external API and potentially creating an OS X Client so that builds of your IPA can be automatically passed to TestMDM for processing. Think of how TestFlight used to monitor for builds. I’ve never written an OS X app before, so that would be interesting, if nothing else.

All in all, I hope you like this update. Please keep the feedback coming.

Thanks for your support and custom!

TestMDM 2.0

As TestMDM has just had its second birthday (I can’t believe it either), I wanted to start sharing some of the changes I’ve made in version 2.0.

The core of the product remains the same with a few improvements to the code. The biggest change is that TestMDM will now wait for commands to be acknowledged (about 30 seconds), which should reduce the frustration of waiting for that spinner to finally do something!

The UI now uses SemanticUI instead of Bootstrap. The other major change is that part of the app is now written in ReactJS, so it should perform a little faster once you’ve opened the dashboard.

Here is a run through of the various screens.

Devices

I’ve not done much to this screen, just removed the clutter.

image

Adding Devices

I’ve flipped this process on its head. In version 1, you had to visit TestMDM from your mobile to install the profile. In 2.0, you can simple scan a QR code from a device or use an SMS. This should make the process easier.

Device Details

I’ve removed the whole “Commands” thing. As I’ve been using TestMDM for my own app testing, I found I usually use one device and focus on one app. I don’t hop between mutliple devices frequently, so it made sense to have a view per device.

image

This device screen will let you see what Managed Apps are installed and gives you options to remove the device and clear any pending commands (sorry this took so long!)

Installing Apps

This hasn’t fundamentally changed, but you will now be guided through the process. You still select the IPA (and configuration if desired).

image

Once you click install, you’ll now see the app’s progress.

image

This, I hope, will make it much clearer as to what’s actually happening. If the process fails, it will also give you more information as to what went wrong.

Once the app is installed, it will appear under the Device screen.

image

The UI needs a little work Smile

App Details

It’s now possible to open an App and view its details.

image

This screen will act as your one-stop-shop for configuration and feedback. Rather than opening the Command and selecting the device etc, you can just type, copy&paste or load existing configuration files. This will save time since you can amend the configuration directly and click “Send”

I’ve got some to clean up this UI a little since it’s not obvious where the text areas are and such.

Go and check it out!

Version 2 is live at https://testmdm.azurewebsites.net if you want to try it today. There are a few kinks and bugs, but it should be compatible with your existing devices etc. You should be able to switch back and forth between the two versions.

IIS 0x80070020 when starting a website

As a developer, I run IIS on my PC so that I can test my websites using ForwardHQ. Sometimes, however, I will have an issue starting a particular website and IIS will throw up this dialog.image

“The process cannot access the file because it is being used by another process”. Totally cryptic and totally useless.

Most of the time, I can get around this by doing one simple thing:

Kill Skype.

image

When I return to IIS and try to start my website, it starts without issue.

Worth a try next time you run into this issue.

Import SaaS invoices into FreeAgent

One of the major pains when dealing with SaaS providers, is importing their invoices.

We all know the drill:

  • You log into your SaaS application
  • You find their invoice section.
  • You create a new bill in FreeAgent and copy/paste your way through the details and being sure to account for the various currencies!
  • You download the PDF form of the invoice and attach to the bill.
  • You then explain a banking transaction with this new bill.
  • Repeat over and over again for the various SaaS providers that take your money Smile

There is no standard way of getting these invoices and each provider has their own way of presenting the bills.

Painful is an understatement!.

Thankfully, Free Agent offers a very powerful (and easy to understand API) that enables developers to create applications that can interact with your account. As both a developer and a FreeAgent user, i decided to try and solve this woe.

My first idea was create an online service that could simply connect to each of my SaaS proviers. scrape the HTML and download new invoices each month. Whilst this is possible, it would mean having my service credentials sitting up on a server. Not good.

My second idea was to have a local windows service that did something similar. This approach started well until I hit Github. I use Two Factor Authentication, which I recommend, which makes automation impossible. The price of safety I suppose.

Having resigned myself to the “manual” approach, I explored the idea of using a Chome extension. This meant not having to worry about the credentials as I simply log into the providers the normal way. I also don’t have to worry about cloud security since none of my data leaves Chrome except when sent to FreeAgent (over HTTPS of course).

The idea is simple. When you visit a supported website, the extension injects an import button into the appropriate parts of the page. CLicking the button opens a dialog, prepopulated as best as possible.  You can then set the contact and category and optionally select the bank transaction you want to explain. Here is a GIF showing the flow on a dummy provider I created.

i4mFz7VxBD

This works *really* well, but it’s not 100%. Not all SaaS providers give all the information on the screen (I’ve tried parsing the PDF, but it’s too brittle and I don’t like my data going out of Chrome). Companies like Microsoft also redirect you all over the place when trying to open the invoice PDF, so sometimes you have to take actions like opening a PDF so the security cookies are set.

That said, overall, it’s made a massive difference to my accounting workflow. I can visit four or five providers in the space of 15 minutes and import 15 invoices. The rate of error is much lower since the extension is handling it for me.

At this moment in time, the extension supports:

  • Github
  • Office 365
  • Microsoft Azure
  • Taxamo
  • Hover (without PDF invoices it’s a bit disgusting so I’m looking at taking a screenshot)
  • Google Adwords
  • Forward

I want to add some memory into the extension, so it will preselect the contact and category for particular sites and I’ve a lot of JavaScript to clean up.

I think this could benefit other FreeAgent users and I’d ultimately like to release it and charge a monthly subscription. This would help me support providers beyond those I use myself.

If this workflow of invoice importing sounds familiar and is something you dread, I’d love if you could get in touch. I really like a few beta testers that could try this extension out and see if it’s a help or a hinderance. Please leave a comment or drop me an email – tomas@coldbear.co.uk