I saw this quote on the Minimal Mac blog and it struck a chord.

"Here's a great rule of thumb: until you create something yourself and then actually ship it, try to first find the positive in the products around you. Those products are the result of someone?s passion, hard work and innate genius. When we compare them to our own twisted, entitlement-driven expectations, we do nothing but insult their creators." - Entitlement: Aaron Mahnke

There's nothing worse than pouring your heart and soul into something for months or even years, and then getting harsh criticism when you finally get the courage to show it to the world. It's OK not to like something, but just remember the thing you're attacking is someone's baby, their pride and joy. Be nice.

Posted
AuthorTodd Zarwell

​I've had a contact lens calculator on my EyeDock Web site for nearly 10 years now, and overall it's been very well received.  I was therefore pretty surprised to receive an email a few days ago taking issue with how I require the keratometry values to be entered.  The calculator gives these instructions:

Enter the keratometry measurements in this format: 45/43.25@90.
​keratometer image

When I made the calculator I was pretty pleased with myself for allowing my users to simply enter a string of text, as opposed to selecting each value from separate dropdown boxes.  However, ​to make it easier to parse the input I figured I better restrict the user to a certain format.  I decided to prohibit entries like this:

45.00 @ 180 / 43.25 @ 090​

Hence my instructions listed above.

Now, when I was​ at the Illinois College of Optometry we learned to record K's like this:

horizontal meridian power / vertical meridian power @ ​vertical meridian 
eg) 44.00 / 46.00 @ 090

This seemed about as simple as could be - on a manual keratometer you record it like so:

the drum on the left,/ the drum on the right @ the number on the axis wheel

After receiving the email regarding how I document K's I plunged into an abyss of self doubt.  Well, that's a little melodramatic, but I did start to wonder how other people deal with recording keratometry.  I took an informal poll of people I work with and the members of the OptcomList.  You know what I found out?  Some people actually do things differently than I do.  It seems that another popular convention is to record K's like this:  

steep power / flat power @ meridian of the flat power
eg) 46.00 / 44.00 @ 180

Well, you know what they say: There's two types of people in this world, people like me and weirdos.  Just kidding - there's more than one way to skin a cat. 

The optometrist who wrote was concerned that the differences in keratometry documentation could result in errors - for example, readings would be recorded 90 off and the calculations would therefore result in lenses that induced double the cylinder instead of corrected.  If this was happening I'm sure I would have heard about it, but it made me rethink how how I approached my calculators.

When I wrote these programs I spent a lot of time putting values on optical crosses because I found it was really easy to get confused. The trickiest part was keeping the axes that we use when describing a refraction separate from the meridians we use when describing keratometry.  I don't want to insult anyone's intelligence, but here's a quick illustration of that concept:

​axis and meridian diagram

​In short, optical power come from a curved surface, and a curved surface has an hypothetical axis that it rotates around.  If the power meridian is at a specific angle, the meridian is 90º away from that angle.

We record refractions like this:  -2.00 - 1.75 x 180, where the "-1.75 x 180" means the -1.75 of extra cyl power has an axis of 180º, which means this power resides in the 90º meridian.

When I record keratometry like this: 44.00 / 46.00 @ 090, I'm saying there is 46.00 D of power in the 90º meridian (which would actually be at axis 180º, but let's not confuse ourselves too much).  

Let's put these examples on an optical cross:

​optical cross diagrams

​Now, this diagram makes sense to me right off the bat.  Steeper meridians would be expected to be more myopic meridians: The more myopic 90º meridian is the steeper meridian, and the flatter 180º meridian is the less minus one. 

So, again, I would have document the K's like the first example (44/46@90) and others would have done it like the second (46/44@180).  However, it really doesn't matter as long as the meridian power is identified correctly with its proper meridian.

If I enter both of these into my calculator:

​eyedock calculator screenshot
​eyedock calculator screenshot

​. . . the results are the same, as they should be.

In summary, the calculator works by identifying the power of each meridian in the refraction and on the corneal curvature, and then perform the ​RGP calculation.  Although there are differing preferences related to recording keratometry, this calculator is essentially format agnostic, as long as you use the power1 / power2 @ power2's meridian format.  If you don't, well, you can't blame me for the consequences!

I'm still curious about these formats, though.  I've been doing it the same way for so long, and I I've thought so hard about optical crosses while building these calculators, that I'm used to taking my measurements and making snap fitting decisions.  

The people who use the other format implied that it's more intuitive, and I can see why:  the axis of the refraction (listed in minus cyl format) should match the meridian that's listed for the flat keratometry reading, eg) -2.00 -1.75 x 180 and 46.00 / 44.00 @ 180.  I have to admit, that's a good quick double-check that your measurements make sense.  However, I refract in plus cyl so I'd still have to do things a little differently.

I'd love to hear from others in the comments - which do you record keratometry, and why?​  

Posted
AuthorTodd Zarwell
2 CommentsPost a comment

​I wrote about how I was enjoying the Waze GPS app a couple weeks ago.  Now that I've been using it nearly every day since then I've noticed a new feature - it learns your patterns.  There's been a few times where I've jumped in the car in the morning and Waze popped up a message saying "are you going to day care?".  Why yes, I am!  And then, after picking my kids up after work, it asked "are you going home?".  Yes again!

Posted
AuthorTodd Zarwell
TagsApps

I've written a couple posts about using online services to automate tasks like creating RSS feeds from a site that doesn't provide them and using IFTTT to keep a journal.  Another popular tool for web automation is Yahoo Pipes.  From the Pipe's homepage:

Pipes is a powerful composition tool to aggregate, manipulate, and mashup content from around the web.

It may be an over-simplification, but Yahoo Pipes essentially grabs content from the web, usually in the form of RSS, and manipulates it in ways that you tell it to.

The problem to solve

I want to find out when new iPhone apps come into the ​iTunes store that might be of interest to me as an optometrist.  I sometimes read about new ones in my journals or, more likely, on my social networks.  However, maybe I want to be the FIRST person to hear about the latest and greatest eye care app.​

A solution

Apple has a page on their site that allows you to create RSS feeds to alert you when new media becomes available in iTunes.  It lets you do some customization, so I created an RSS feed that would be populated with new IOS apps.  I customized it like so:

​I decided to find apps in all genres.  An optometry app might be listed as medical, but when I submitted my apps I also considered listing them as reference or utility.  

Clicking the ​Generate button will give you an RSS feed URL:

http://itunes.apple.com/us/rss/newapplications/limit=300/xml

Copy this to your clipboard.​

However, there was some pretty severe limitations on how much we were able to customize this feed.  If you plug it into you favorite RSS reader (like Google Reader) you'll get probably get 250 listings for fart apps.  So, how can we customize this further?  Why, Yahoo Pipes, of course!

Go to Yahoo Pipes, log into your Yahoo account, and "Create a new pipe".  On the Pipes Editor page, drag the Fetch Feed ​resource from the left hand column into the workspace. Note:  If you're not seeing this column click the arrow button on the left hand side of the page (see circled item below).

​Paste the iTunes RSS URL into the text box in the Fetch Feed window.  To test the feed, click on the top of this window (it'll turn gold as it is in the image above) and the content of the feed will show up in the pane at the bottom of the page.  It's working, but there's a lot of apps unrelated to eye care!  We need to filter these results.

So, we go back to the tools in the left hand column and find filters - it's under the operators heading. Drag this tool under your Fetch Feed window.  We need to conned everything, so drag a  from the circle on the bottom of the Fetch Feed window to the circle on the top of the filters window - this will create a "pipe" connecting the two.  Do the same thing from the filters window to the pipe output window.  

​Now, let's add some filters. We'll have better results if we try permitting things that are eye care related than if we try to block all the things that are not eye care related, so we'll choose the permit option.  Make sure you choose the any option  - if you make a lot of rules it's unlikely that any of the feeds will meet all of them, and consequently nothing will pass through your filter. For my first rule I decided to permit items where the description contains the word optometry.  By clicking the (+) button I added similar filters for the words optometrist, ophthalmology, and ophthalmologist.

By clicking on the Pipe Output title ​you can see the results of your filter.  I did this and . . . got nothing.  Well, that's not totally unexpected - what are the odds that an app was released today with one of those keywords?  I decided to add a few more and came up with this:

I clicked the Pipe Output again and . . . got a hit!  The App For Learning Optics app passed through my filter.  Not only did something get through, it's fairly relevant!  Note: your results may vary depending on what is coming through the RSS feed when you test it.

Google Reader button​

Google Reader button​

So, what should we do with this?  Give it a title (Optometry Apps RSS), hit the save button​, then click the run pipe link.  This will take you to another page that shows the results of your pipe. It also gives you the ability to get the filtered data in multiple ways, including as an RSS feed.  I chose the Google Reader button and added it to, er, Google Reader.  When I go to Google Reader I see my Optometry Apps RSS feed complete with the result that made it through my filters.   Even better, it shows up in Flipboard on my iPad since I've connected that to my Google Reader account.

If you don't want to repeat this whole process, feel free to use the feed that I've created.

http://pipes.yahoo.com/pipes/pipe.run?_id=c7306982fb17d3464a8b00235179356b&_render=rss

​This was really meant to be an exercise in using Google Pipes and RSS (i'm not really desperate to immediately find out about new optometry apps).   But, is this practical or useful?  Only time will tell.   I'm not sure if my filters will catch the  IOS apps that I want it to.  It really depends on how well I set up my filters, which I'll probably have to experiment with for a while.  

Oh, for extra credit: If you really, really want to be the first person to find out about ​new IOS eye care apps, you could take this RSS feed and use IFTTT to alert yourself with a text message when a new app pops up in your feed. Or, get really creative and have a light turn on in your house.

Posted
AuthorTodd Zarwell
CategoriesTech

I've tried a few GPS apps on my iPhone, but​ I've always come away a little disappointed.  They're always a little more cumbersome to use than my dedicated Garmin GPS, slower to give me directions, and more likely to lose the GPS signal.  Furthermore, I use my iPhone to listen to podcasts and I get annoyed that the GPS app lady talks over what I'm listening to.  Furthermore, I sometimes have to switch apps to change to a new podcast, something I don't want to do when I'm driving.  Lastly, using the GPS is murder on your phone's battery.

The phone GPS apps do have a few advantages.  They're always up-to-date and  do a better job finding new restaurants, new roads, etc.  The user interface is usually better so it's easier to enter addresses or, even better, choose an address from amongst my contacts.  Also, there are ways I can send addresses from my computer to my phone so I don't even have to type anything. However, in my experience, the apps just didn't offer enough additional features to make me abandon my dedicated GPS.

However, a couple new apps have grabbed my attention.  One of them is Waze.  On the surface Waze works like most other GPS app: You search for or enter a location and it shows you a map and gives you visual and spoken directions.  What makes this app interesting s the fact that it uses data from all the other Waze users on the road.  It measures the speed of other cars on your route.  Even better, it allows users to report issues such as heavy traffic, accidents, and even police  (I think the spirit of this feature is to report police cars at accidents or pulled over vehicles but I'm sure people report speed traps too).  

I'd heard about Waze on a number of blogs and podcasts, although I was a little skeptical about how it would work for me.  After all, most the people I read and listent to are in large, tech savvy cities like San Francisco.   Was there going to be enough users in Madison WI to get the advantages of crowdsourcing?  I'm please to say that every time I fire it up it reports at least 45 people in the area using Waze.  That's proven to be very adequate: It's done a very good job of driving conditions on my commute to work.  And, when I encounter something unreported, I've made an effort to contribute to the cause and be the reporter (It's worth mentioning that Waze does a good job making this hands-free).

Here's a few screenshots.  I'd wish I'd gotten one of the alert telling me a stopped train was blocking my drive downtown...

The other app I've been liking is Twist.  It's not really a traditional GPS app.  It does give you an ETA and shows you a map of where you're going, but not in a way that's going to make you choose it over another app or a dedicated GPS.  No, the real purpose of Twist is to let other people know​ when you're going to arrive.  

Consider this : We take my kids to visit grandma and grandpa pretty often.  They only live 45 minutes away, so we make plans to get together on a lot of weekends.  We never set a real concrete time that we're coming over, and our time of departure is unpredictable due to the fact that two and four year olds lack punctuality.  Still, we'd like to give my parents a sense of when we'll arrive.  

That's where Twist comes in.  To "make a new Twist"​, you simply enter your destination (mom's house) and who you want to notify (mom).  Then, when you leave your house the GPS senses you're on the move and sends mom a text message, something like "Todd just left.  His ETA is 10:45 AM".   When you get close to your destination it sends another text message saying "Todd is about to arrive".  If you stop to get the kids some french fries en route and it takes too long another text message will be sent alerting mom of the delay.

Twist seems works best for trips that:

  1. You make on a regular basis
  2. Someone is waiting for you at your destination

I made one like the above example​, and I made one for the days where my wife gets home before me..   That way, when I leave work and pick up the kids from daycare, I can let her know I'm on the way home and when I'll arrive.  That way I know I'll have a hot gourmet meal just waiting for me when I arrive [insert wife's laugh here].

Posted
AuthorTodd Zarwell
CategoriesTech
TagsApps

About a month ago I wrote a post about how I was using IFTTT to keep a journal about cute things my kids say and do. A couple weeks later one of my favorite podcasts, Mac Power Users tweeted that they were looking for interesting IFTTT recipes for an upcoming show.

I wrote David Sparks a short email about how I'm using IFTTT web automation to keep my journal. Lo and behold, they actually mentioned it on their show - It's at about minute 55. David even calls me a "smart guy" at the end. That's kinda the nerd equivalent of having Aaron Rodgers say "nice arm" after watching you toss a piece of paper into a wastebasket.

So, I'm kinda famous.

Posted
AuthorTodd Zarwell
CategoriesTech

This site is hosted on Squarespace, an awesome service that allows you to host blogs, galleries, and websites. They have great tools for managing the look and the content of your site. Even cooler, they provide hosting that can give you more resources if you suddenly need them. For example, if I'm caught up in some scandle and CNN's breaking story links to this post, well, it won't crash. They also have really nice analytics tools, so I could see how many gawkers are coming to nerdiguy.com.

However, since Squarespace is one company of a long list of companies that do NOT financially support this blog, I'm not going to spend much more time singing their praises.

What I want to write about is Squarespace 6. This update came out a couple weeks ago, and, as is typical for a major software change, I have mixed feelings. It looks really cool. The tools to manage the site are incredible. However, some of the features that were present on the old site seem to be missing, and it's a little buggy. As someone who had spent years working on updates to a website, only to have users lament the loss of the old version, I'm very sympathetic to them. And I have the utmost confidence that the bugs will be worked out and the old features will trickle back in.

A few things have perplexed me since converting to Squarespace 6. For example, it doesn't seem like I have a lot flexibility for editing the structure of the templates. Also, I can't find an easy way to provide my readers (either one of them) with an RSS feed.

I also was struggling to embed Flash files on the site. I know, I know, Flash is going the way of the dodo. Still, I'd spent a fair amount of time programming in Flash in the past and I want to include a few of my creations here. Actually, my Oculus Invaders game seems to be the biggest reason people come to nerdiguy.com.

I had to do a little finagling with Squarespace 5 to get these Flash files embeded and working. I used swfobject and Squarespace 5 code injection, using this forum post as a guide.

However, when I upgraded to Squarespace 6 I was at a loss. I'm still getting the hang of the new version, and I initially saw no access to a file system to even store my Flash files, much less link to them or embed them. I contacted their customer support about this, and, and after several back and forth emails, got the impression that it was not possible. I was starting to get very disappointed with the new version and was wondering if I wanted the shiny new look of the new one or what appeared to be the more robust and feature rich old one.

I kept plugging away, though, and eventually figured out that you can upload and link to files (I knew it - how could you not!?). To do this, simply go to the page or journal entry where you want to appear and enter the editing mode. Clicking the "link" icon in the toolbar will give you the option of uploading a file. Clicking this will allow you to navigate to the file(s) on your computer and upload it. Once the file is uploaded you the text field will display an absolute path to your file - you'll want to copy this. If you uploaded multiple items you can hover over the "upload file button" and see all of your files. Clicking a name will display that file's path.

There.  Now all we have to do is embed it into our blog entry.  As I said earlier, I wanted to use swfobject because in my experience  this is the best way to embed Flash in a browser-independent way.  Alas, I could not make this work, even with code injection.  Instead, I took a simpler route.  I created my blog post with a little text in the beginning.  I then clicked the "Add Block" button to add a code block, then again to add some text at the end.

So essentially, the post is divided into three sections:

I added the standard object/embed Flash code in the code block and changed the language to Javascript. EDIT: Set the language to HTML, not Javascript.

<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" WIDTH="320" HEIGHT="240" id="Yourfilename" ALIGN="">
<PARAM NAME="movie" VALUE="Yourfilename.swf">
<PARAM NAME="quality" VALUE="high">
<PARAM NAME="bgcolor" VALUE="#333399">
<EMBED src="Yourfilename.swf" quality="high" bgcolor="#333399" WIDTH="320" HEIGHT="240" NAME="Yourfilename" ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>
</OBJECT>

Just make sure you change the two instances of *Yourfilename.swf*  to the link that you uploaded (the one I told you to copy earlier).  Set the width and height and to whatever you need, and change the background color if you desire.  

A couple more things.  For some reason, every time you I tried to edit my code block the  *display source* checkmark became checked.  This is pretty annoying, because if you save it that way it will just display your code (instead of running it when the page loads).

EDIT: Again, the image above shows the language as Javascript: It should be set to HTML. 

Lastly, when I was working on this my flash file was not working.  It didn't work in the editor, and it didn't work in the preview.  However, when I logged out and looked at my site, it worked!  You can see the results here and here.

Nothing too complicated for a real website developer.  However, with my disorientation with the new Squarespace site and the misinformation (perhaps *miscommunication* would be a fairer word) I  received from their support, I was starting to think this would not be possible.  Maybe posting my experience here will make the process easier for someone else.

Posted
AuthorTodd Zarwell
CategoriesTech
36 CommentsPost a comment