Announcing DMS Calc

A few years back, I was playing Kerbal Space Program and had the need to convert back and forth between decimal degrees and degrees-minutes-seconds. I found some online tools to do it, but they were naive and forgot that floating point numbers are still kind of tricky on a computer. I wrote a post about that, and I also wrote a simple web form with Javascript to do it the right way. Anyway, for reasons, I deleted that code early this year and then, a couple months later, I started playing with KSP again.

Two days ago, I ran into the decimal degrees to DMS problem again, and still the free tools are doing it wrong. So this time, I wrote an app and sent it up to the App Store.

I Wrote A Thing

Hey, I wrote an app and got it published on the App Store! It’s free and it only does one thing: it lets you slide a selector back and forth and show the equivalent temperature readings in Fahrenheit and Celsius. So, if that’s a thing that you want on your phone, go check it out!

So, I took this class on iOS development with Swift, because I’m fed up with Flutter and I really like being able to program the devices I own. I got to the end of the course and was thinking, “Okay, so that all makes sense, now, what do I even want to make my phone do?” And then I thought, “You know what toy application everyone wants you to write after Hello World? A unit converter.”

The problem I have with these unit converter examples, though, is that while they’re great for giving you an example of how to use list selection tools (what unit do you want to convert from/to) and detecting user input (when do you actually compute the conversion) and update the display, they’re terrible if you actually want to get the conversion value. I mean, I’m sitting in a car and the temperature is set in Celsius, and I know it’s too hot, but what is the right temperature? This is a problem with numeric displays; unless the number is on a scale that I’ve internalized, it doesn’t really mean anything to me. Also, I don’t want to have to spend a whole lot of time typing or, for that matter, waiting for my phone to ask Google’s server on the other side of the planet. This is a straightforward calculation that could be done right here, right now, with an actual thermometer if it had the scales printed on each side.

So, I present you with a dead simple app. It’s got a slider that you drag back and forth. It shows a Fahrenheit temperature and a Celsius temperature. It’s got buttons on the interface to let you step up and down if you want to go slower. And, because I wanted to learn how to make an app for the Apple Watch, there’s one of those, too, and it uses the digital crown to do scrolling up and down of the temperature.

Sounds Like a Job for Perl

In which I write a continuous build system for bagpipe music using Perl and a Makefile.

The problem: the band has sheet music that everyone is supposed to memorize, the membership is geographically dispersed and not everyone can make it to every practice, and during practices and workshops and after competitions the music can get edited to reflect feedback and (one hopes) improve the performance. How do we distribute the music to everyone?

Continue reading

Programming for the Ages

So this feels like the most Silicon Valley thing I’ve said in a few years, but the thing I’m working on right now is basically the same parts and programming language I was working on as a hobby back in 1997. Yes, the machine is in someone else’s data center, yes, the services it’s interacting with are running in still other data centers; even so, I am writing Perl CGI scripts and cron jobs to respond to automated messages and run intermittent build and release processes. What a blast from the past.

Missed Opportunities

I have had the same email address since 1995. I have been buying things online since that was available. These facts mean that my email address is on every spam list in the world, and that every merchant I’ve ever bought anything from as well as all the spammers and scammers send me at least one and often more than one email every day.

Multiple levels of filters and unsubscribe links mean that my morning inbox is only full, not bursting, but even so, I wind up just selecting everything and tossing it into the trash. I love the subject lines that tell me not to miss out on this opportunity, which is almost gone. I feel encouraged by them, and press delete even faster.

Yep, I Still Hate Your Framework

I have been writing a couple of mobile apps in Flutter for the past few months, and as I neared feature-complete ready-for-internal-beta I started getting frustrated by the framework’s limitations with the app stores. The build system won’t build an artifact that the Google Play Store will accept come August, and the iOS build has problems, too. I gave up and started working on a simple web game using flutter_web, only to find that it wouldn’t let me make a user interface that didn’t suck for typing. So, fine. I’m going back to Java. At least I can build and release a Java application that works right.

Greatness Abides

Okay, so when I looked at Google news this morning, this story was in the “For you…based on your interests” section: Gremlin Brings Chaos Monkey Testing to Spinnaker CD Platform. Now, I’m a respecter of Dev Ops, but I’m not really a practitioner of Dev Ops. So I think this is cool, but the coolest thing about it is that my amazing wife invented Chaos Monkey. And now Dev Ops people all over the place are using it and excited about it and it’s really quite valuable. This, right here, is another reason that tech needs women.

Continue reading

It Could Be Better

A long time ago, my housemate (who is one of the only people who reads this – Hi, Kurt!) had this great explanation for why his homework wouldn’t compile: “It was perfect, so I fixed it.” Man, that so describes every programmer I’ve ever worked with. (Incidentally and orthogonal to the point of this post, I suspect that this attribute of programmers coupled with the increase in the global number of active programmers accounts for so much of the frustration I experience with software nowadays.)

Continue reading

Things I Wish

I wish that Google provided an offline/dev version of Firebase so that I could work on my mobile app when I’m not actually online. Sort of like they offer a dev version of Datastore for App Engine development.

I wish that Google made their Flutter documentation available as a downloadable package so that I could refer to it while I’m not actually online.

I wish that I could test the capability of Flutter+Firebase to deal gracefully with network unavailability.

I wish that software development didn’t suck.

In 1984, I was able to write a FORTRAN IV program to do a bunch of math and then output bitmapped Mandelbrot graphs to a dot matrix printer because the language was stable, the hardware was stable, and the manuals were printed out and stuck in binders on the shelf over the computer desk. Today, I can write programs anywhere but the languages aren’t stable and the hardware isn’t stable and the manuals are online. If I write code in a stable language for stable hardware, nobody I know will be able to run it.

Progress.

Mobile Enterprise

So, I’m writing another mobile app. This one is a chore list for our household. And, since our household is not technologically homogenous, I’m writing it in Flutter so I can deploy it to All The Devices. Flutter’s idiom is lambda-heavy, and most of the tutorials and examples wind up embedding application logic in the UI, which I find hard to follow at times and which, as a practice, makes me itch and feel like I need a shower.

A helpful soul on StackOverflow pointed me at an example project that demonstrates how to build a functioning task list app using a variety of different frameworks. I decided to go with flutter_redux, which is pretty cool once I managed to understand how it works. You just treat your application as a giant state machine, you store all the state in a single state class, and everything that happens is an event/action that gets sent through a set of functions that you write and attach to the framework. All of which is ridiculously complicated, yet elegant at the same time. I wind up writing reams of code just to get the first screen to display. The marginal cost for additional screens, though, is tiny, and logic is nicely decoupled from presentation. It seems very FizzBuzzEnterprise, though, honestly.