I decided I wanted a quick easy way to keep track of my EyeDock business expenses. I don't have a lot of expenses, it's mostly just software utilities to help me work more efficiently. Accounting software can do this of course, or I could just keep a spreadsheet. However, I wanted something that would be even faster to add entries and reference, even from my phone.

I decided to just maintain a text folder in Dropbox listing my expenses. The text file could be viewed or appended to in any number of iOS text editors such as Elements or Byword

However, to make things even easier, I once again made use of the Drafts app.  Drafts allows you to quickly enter some text and append it to a Dropbox document, which will work well for our needs today.  I wrote more about the Drafts app a while back so I won't dwell on its other features here.

To make a Dropbox action, click open the app and hit the settings icon (the gear). Scroll down to and click Dropbox Actions, then click the plus sign at the top to create a new action.

 

 

Give the action a name (I called mine EyeDock expenses), tell it the path to your text file. I have an EyeDock folder in Dropbox, and I decided to nest a 2013 folder in there so I can separate my expenses each year. The actual file name is expenses, and it's a text (.txt) file.

Setting up a Dropbox action in Drafts

Now, I can open up Drafts, type the date, the payee, the expense type, and the amount. When I'm through I click the EyeDock expense action I created and my text is appended to the expenses.txt file in Dropbox.

Entering text in Drafts and selecting the EyeDock expense action 

However, this is still too much work for me (I'm lazy). I don't want to have to enter the date - my phone already knows the date, why can't it do it? I only need a few categories, and I don't want to have to type them in. This sounds like the perfect place for Textexpander. If you're unfamiliar with Textexpander, it essentially allows you to create system-wide text macros. So, if you're sick of typing in your address, you can assign a text trigger, such as ".address", and every time you type that it'll insert your address. The macros you make on the Mac can sync (via Dropbox) with your iOS device, which can come in very handy.

Textexpander got even more useful a while back when they added fill-in snippets. They describe fill in snippets like this:

You can add fill-in fields to a snippet to make it easy to create customized boilerplate text at the time you expand an abbreviation.

I made a fill in snippet to automatically enter today's date, a blank field to enter a payee, a list of expense types (software, advertising, hardware), and a blank to enter an amount. I set the trigger to be ".exp", for "expense".

It looks like this, if you're interested:

 %m/%d/%y, %filltext:name=payee%, %fillpopup:name=type:default=software:advertising:hardware: %, $%filltext:name=amount%

So, I open Drafts, type ".exp", and it immediately takes me to the Textexpander fill-in. The date is already there, I type in my payee, select the type, and enter in an amount. I hit Done and return to Drafts. I hit the EyeDock Expense Dropbox action and I'm done.

Using a fill-in form in Textexpander

The output of the Textexpander fill-in snippet in Drafts

Opening the expenses.txt file in Dropbox I can see that the text was appended to the end of my document appropriately. 

The text appended to the expenses.txt file in Dropbox

In this case I'm basically creating a no-frills ledger. I like working with a simple text file because it's easy to open, read, and append to. However, the file is essentially a comma separated volume, which means that I can at any time change the extension to .csv and open it up in a spreadsheet. This might be helpful at the end of the year if I want to quickly SUM the expenses column.

 

Next I'll show you how I enter expenses while using my laptop.

 

 

Posted
AuthorTodd Zarwell

I downloaded the Drafts app to my iPhone quite a while ago, but it took me a while to get into the habit of using it. As time has passed I've started to incorporate it more and more into my workflow.

On the surface Drafts is incredibly simple. When you open the app you're presented with a blank screen that allows you to just start typing. So it's a notetaking app, you ask? Well, it can be, but it's so much more. After you've typed (or, better yet, dictated) your text, you can can take apply a large number of actions to it, such as emailing it, sending it out as a text message, a Facebook post or a Tweet, and a whole slew of other options. 

So why use Drafts as opposed to the email app, text messaging app, the Facebook app, etc.? Well, if you can make using Drafts a habit, it's very fast. When you use the same interface every time you want to enter text you become very efficient. In addition, this app presents you with a cursor and a keyboard a split second after you open it. Contrast that to the Facebook app, where you have to open the program, find the "status" button, then wait for the compose screen to pop up. This actually doesn't take that long, but I find that every app I use is set up a little differently. The "compose" buttons are in different places in my Facebook app, my email app, my text messaging app,  my Twitter client, my blogging app, etc. 

In essence, I feel that Drafts reverses my writing process. In a good way. When I have a brilliant thought, I capture it first, then send it where it needs to go. Without Drafts, I find the place where the thought needs to go, then I compose it.

It doesn't end there, though. The newest versions of Drafts added the ability to pass text on to files in Dropbox and Evernote. With these additions, and the fact that it can be heavily customized, Drafts starts to become an automation tool.  

In my next post I'll write up a little blurb about how I'm using Drafts to keep track of expenses.

Posted
AuthorTodd Zarwell

​While writing my recent post about Android development I meant to point out that big companies, such as Google, Yahoo, EA Sports, Zynga, etc can devote resources to developing on all platforms, whereas individual developers and small companies pretty much have to choose one platform or another.

However, it seems that even the big companies have issues with multi-platform development. ​For example, yesterday the BBC responded to a complaint that the British broadcaster prioritizes their iPhone app over the Android version. Their response? Yes, we do. And for logical reasons.  Their inquiry found that:

It noted that developing for Android was different from developing for iOS; while iOS provides a relatively homogenous environment, Android is fragmented with almost 4000 devices from around 600 manufacturers," the report said.

​This is the issue that really intimidates me. When I made the EyeDock iPhone app I had to design for one screen size, and I had to program for a couple versions of the OS. Eventually they made a larger iPhone screen, but you didn't necessarily have to change your app (I actually haven't yet).  As time has gone by new versions of iOS have been released, one of which forced me to make some changes for my app to work. It was a pain, and I can't imagine programming for (and providing support for) thousands of devices, all with their little idiosyncrasies.

Android development is complicated and expensive, even for a big company. For an individual, especially one that spends most of his day looking at eyeballs, it's nearly impossible.

Posted
AuthorTodd Zarwell

I made a little illustration for my son's third birthday. Overall I'm pretty happy with it...except for the face. I think I spent as much time working on that as I did on the whole rest of the picture.
Faces are so tough, and they have to be just perfect. If you draw something wrong on a truck, it's not that bad. If you screw up a face it just looks freaky.
I'm really in awe of people who can do this well.

iphone-20130526133442-0.jpg
Posted
AuthorTodd Zarwell

I get asked this question a lot. It's a very reasonable question. After all, I have an iPhone app, so why shouldn't there be an Android app?

​As much as I love my smartphone (OK, OK, it's an iPhone), I kind of wish they'd never been invented. And this isn't a new feeling - it actually started more than a decade ago...

Perhaps a little background will help. I'm an optometrist, for anyone who didn't know that. While I was in optometry school a funny thing happened: A little thing called the internet started getting popular. I thought it was fascinating, and I wanted to be part of it. I started reading beginner HTML books, then programming books, database books, whatever I felt would help me make the website I had in my head. 

At the time my wife was working as an OD in a retail setting, and I was working in a clinic. I had a lot of free time on my nights and weekends, and they were all spent developing the first version of EyeDock.

​Eventually I started showing people my little creation, and the feedback I received was very rewarding. However, it wasn't long before I received an email asking "where's the Palm version?" Whoa! Palm version? I'd never considered that, but it sounded cool. However, I didn't have a Palm pilot, didn't know how to program for it, but most importantly, I had so much more I wanted to do on the website.

​As more time past, the question changed. "Are you planning on making a Windows phone version?" "When is the BlackBerry version coming out?"

android.jpg

In 2007 the iPhone came out, and it was amazing. A year later I decided it was time to get my first smartphone, and I decided it was time to make my first iPhone app. I bought a book about programming in Objective-C, read the first four chapters, and . . . was really, really confused. By this time I'd learned Javascript, PHP, Actionscript (Flash), MYSQL, dabbled in Visual BASIC. Objective-C was a whole other animal. I knew I could figure it out. After all, I've learned a lot of difficult concepts in that I initially thought were insurmountable during my collegiate career.

In 2008, my life was starting to change in many ways. Most importantly, we had a son who quickly became the light of my life. Of course, spending my entire evenings and weekend maintaining a website and developing an iPhone app wasn't going to happen anymore. Still, I kept plugging away and, it took me about 18 months, but I finally published my iPhone app in iTunes. I was very proud of it: It was the most difficult programming task I'd undertaken.

While I was working on the iPhone app I started hearing rumors of a Google phone. Android was released, and the initial reviews were that it had potential but was laggy, didn't have the apps, and lacked the fit and finish of the iPhone. We all know what happened from there. Android got better fast. It became the number one mobile platform.

By this time, I was feeling like the time I'd spent on the iPhone app had caused me to neglect the web site for far too long. In addition, the upkeep had drastically increased. I had to maintain a database for the Web site and a slightly different one for the iPhone (some day I'd like to consolidate them - wish I'd figured out a way to do that the first time around). I had support emails because passwords with certain special characters didn't work on the app for some reason. Apple introduced a new version of iOS that totally broke how I was uploading my databases. That one happened around the time my second son was born - talk about stress!

​So, where's the Android app? There really deserves to be one, I know. I'd really love to make one. I think it would be easier to create than the iPhone app: I sorta have this mobile thing figured out now, and if I could learn Objective-C I'm pretty sure I could learn Java. 

So why isn't there one? Well, it's certainly not because I have a prejudice against Android. I'm amazed at the the passion people have for their phones. You're either an iPhone fanboy or a h8ter. I can't think of anything like it. Maybe Ford vs. Chevy trucks? Nah, not even close.

As you might have guessed from the novel that this blog post has become, the issue is time. I spend my life as a father (of three great little boys now). I spend days as an optometrist. At night, after the kids get to bed, I do programming, data entry, and answer support emails. I've also done things with nearly every vacation day I've taken since 2002.

After doing this for so long I've worked out a lot of efficiencies that allow me to make great use of my time. It's helped me keep quite productive as my free time has declined. However, the thought of learning a yet another programming language and developing another app that will only further subdivide my time is, well, very intimidating.

As a consequence, I've spent the last year concentrating on the website. Soon ​I'll be releasing some new features that I'm very excited about. I'm also trying to make it more mobile accessible and have been slowly removing things like Flash. I'm hoping I can make EyeDock very functional on iPhones, Blackberries, Android phones, the new Windows phones, and whatever comes next.

I can't put into words how thankful I've been for our users over the years. EyeDock is my baby, and my #1 goal has always been to make a great resource for eye care professionals. I love building things, especially things for my fellow optometrists. That would have never been possible for all this time without the support of the people using the site.

- Todd

​PS I think there may be one other question that may need to be addressed. Why can't I hire someone to make an Android app?

First of all, I've had some troubles contracting out EyeDock work in the past. As an OD, I know exactly how I want things to work. I've had a really hard time communicating this to non-OD programmers (let's call them eye-muggles). It's usually ended up being a mess, and I've either had to 1) spend an ungodly amount of time explaining how I want things to work or 2) I've just ended up doing it myself anyway.

Secondly, I actually did contact a large company that  does app development. They actually spent a lot of time trying to talk me out of an Android app - too many different screen sizes, too much fragmentation, etc. When I persisted they quoted a fee that I was, to put it mildly, unprepared for. The website does pay its bills, but being an optometrist is primarily how I make my living. EyeDock is my passion, but I have to make practical decisions.

Posted
AuthorTodd Zarwell
2 CommentsPost a comment

If you haven't seen the ​Jonathan Dong's (wahoo ICO!) Thrift Opt Video, you really need to check it out. I haven't done a lot of video editing, but I can recognize talent and hard work when I see it.

We are the optometrists... ...let us look deeply into your eyes... Jonathan Dong, Writing/Direction/Production [ http://jonathandong.com/ ] Featuring Rich Miller and the Illinois College of Optometry c/o 2016 [ http://www.ico.edu/ ] A Student Optometry School Parody based on "Thrift Shop" by Macklemore X Ryan Lewis, dir.

One of the first comments I heard about this video was "that guy has too much time on his hands". I'm a pretty laid back guy but this sort of attitude annoys the [redacted] out of me. 

This was also one of the first comments I received when I started showing off my EyeDock Web site 10+ years ago. My skin admittedly a little thin, but it was crushing to hear a response like this after dedicating a year's worth of free time to my passion.

I think that, if someone creates something great, it should be celebrated. I don't care what it is. I don't even care if you don't like it. That fact that someone poured their heart and soul into their project deserves your respect.

And free time? Some people don't like to watch TV. Some people can't understand how anyone could spend half a day golfing. And other people like to spend their time making things

Some people might say creating a something like EyeDock and producing a hip (do the kids still say that?) music video are totally different. After all, EyeDock generates some income (enough for me to justify spending the last decade working on it, anyway). However, I would disagree. I think developing a skill is always valuable.

Take, for example, Oculus Invaders, my "video game for optometrists".​ It really serves no practical purpose. By the time I finished it I felt it'd taken up way too much of my time and, when I put it on the Web site, I only received one comment - from an angry OD complaining that it was keeping his staff from doing their jobs.  Still, making this game was very helpful for me. I learned the ins and outs of programming in Flash and it allowed me to develop many new features for EyeDock over the years.​

The bottom line is, we all have some free time (except me - I have two jobs and three little kids!)​.  We can use that time to create something of value, even if the value is that it makes someone smile or it just gives you some satisfaction.  Or, we can spend two hours a night watching TV and complain about how other people have too much time on their hands.

. . .Then again, how did he do this while at ICO?​  Why, when I was a student, I studied 23 hours a day!

Posted
AuthorTodd Zarwell

As I've mentioned in previous posts I've really been trying adopt a paperless lifestyle. My Fujitsu Scansnap scanner and software like Hazel are sure making that easier.

I feel I've become very efficient at dealing with the paper that comes into my house, and whenever I get an email receipt I print to PDF and file it away. 

Many of my financial institutions have asked my if I want to be paperless. I've always said yes and, when I select that option, the stop sending me paper statements. I feel good about saving the trees, but there is a downfall: I don't have copies of these statements for myself. Sure, they're available online, but I've found I'm too lazy to undergo this process:

  1. Go to my bank's Web site
  2. Type in my username and password
  3. Navigate to the "documents" page
  4. Download the statement
  5. Repeat steps 1-4 for every IRA, student loan, college savings plan, mortgage, and car loan

In the end,​ just the process of logging in to all these sites was a chore, and I was finding myself wishing they just came in the mail so I could stick them in the scanner and be done with it.

I wanted to find some way to automate this process, at least simplify the whole ordeal of logging into 6-7 websites. I thought this might be a good job for Keyboard Maestro

​keyboard maestro icon

​Keyboard Maestro is something I'd been aware of for quite a while, but I never had a good understanding of what it actually did. In my limited understanding it was a way to create keyboard shortcuts. While I like keyboard shortcuts, I have a really tough time remembering most of them and the idea of adding more didn't sound very appealing. 

What I didn't understand is that Keyboard Maestro is a tool to create macros. Typing, clicking, opening programs and files, appending text, etc etc. You can string together multiple combinations of these things makes it a very powerful tool to automate repetitive tasks.​

​1Password logo

Of course, it wouldn't be a good idea to display all of my passwords to my financial institutions in a program like Keyboard Maestro, so I thought it would be helpful to add 1Password to the recipe. I've mentioned 1Password before, but, if you're not familiar with it, this is a great utility for managing your passwords. It allows you to use secure passwords (such as yas^hjr$@ds7) and access them with a master password. 

​Alfred icon

The last ingredient is Alfred.​ Alfred is a program launcher and so much more. I feel an app like this, or something comparable (like Launchbar or Quicksilver), is indispensable. 

The cool thing is, Alfred and 1Password work very well together.​ If you're logged into 1Password you can do things like this:

  1. Click the keyboard shortcut to open Alfred - in my case, command-space
  2. Start typing the name of a website, eg) wellsfargo
  3. Select the search result for 1Password: Wells Fargo - ​the one you want is usually the first result and you simply have to hit enter to select it.
  4. Sit back while Alfred and 1Password open your browser window, navigate to the website, enter your username and password, and log into the site.

​So, putting these things together, I created a Keyboard Maestro workflow that looks like this:

​To initiate it, I first make sure I'm logged into 1Password and then I like to open a clean browser window. Then I press the trigger hot key I assigned to this macro, control-option-command-B (B is for bank).

Keyboard Maestro starts with the first step, which is typing the control-space keys. This is my keyboard trigger to open up Alfred. On step two the text "wellsfargo" is pasted into Alfred. It is assumed that the top result will be the 1Password "open up and log into wellsfargo.com" action, so the macro will press the enter key to select it. Then, as described above, 1Password will log me into the wellsfargo.com. 

This may seem like a lot of work to log into a website, but the fact that it scales well becomes very helpful. By simply copy-and-pasting these four steps 6-7 times I can change the text in step two to all of my other financial institutions: "wells fargo dealership services", "prudential.com", "ING Direct", "student loan servicing center", etc., etc,.

I created a little pause in step 4 to give give Alfred / 1Password time to log in. The macro doesn't wait for a page to load before moving on to the next step, so I wanted to make sure it had time to load the site, enter login credentials, and hit "submit" before proceeding.

​So, now I set up a monthly reminder to download my bank statements. When it pops up, I log into 1Password and hit my keyboard trigger, then sit back and watch while I'm logged into six or seven websites. When It's done I click each tab, manually download my statement, and let hazel sort them into their appropriate folders by kind and date.

Is it perfect? No, sometimes a page doesn't load fast enough and I don't get logged in. However, in this case, all I need to do is click the 1Password extension in my browser and it logs me in.

Could this be better? Maybe. I originally created a much more involved macro that was customized for each site. It would search the page for the text, right-click it, choose "save as", navigate the finder to the appropriate folder, etc. It required a lot of precision and it also required the sites to not change their layouts. It was kind of like tumbling dominoes: Everything had to be perfect, and if one thing went wrong everything from that point onward wouldn't work. 

Some might still argue that this is too much work for what you get out of it. However, it's keeping me from putting off the task of downloading bank statements like it used to. Plus, it's nerdy, which is always a good thing.

Posted
AuthorTodd Zarwell

In my last post ​I wrote about how an extremely bloated PHP log file was taking up more than it's fair share of my hard drive. I found it and deleted it, but what's to keep it from happening again? If I were ambitious I could find all the code that's writing to that file and delete it. However, I do sometimes refer to these error messages while debugging my code, and I'd rather not eliminate this information. However, when I do read this log file I'm usually looking at the most recent entries. I don't need a 6 month old records of my mistakes.

I decided to use one of my favorite utilities, Hazel.​ Again, from their home page:

Create rules to automatically keep your files organized. Hazel watches whatever folders you tell it to, automatically organizing your files according to the rules you create.

I usually use Hazel to help automate a paperless workflow, mostly following the rules outlined in David Spark's Paperless book. I think I could write a book about ways to use Hazel (there's so many possibilities!) , but today I'll just show you how I addressed the problem of the swollen log files:

Hazel rule - click for larger image

In other words, I told Hazel to watch the directory with the log files. If any file gets larger than 1GB, move it into the trash.​ Easy-peasy.

Now I can make as many coding errors as I like without worrying about this file growing to occupy 1/5 of my hard drive.​

Posted
AuthorTodd Zarwell