May 14, 2016 - I can't believe I'm saying this: I'm considering buying a MacBook Pro

Comments

tl;dr:

Considering switching to a Mac because of the consistency of platform with the environments I frequently interact with (*nix systems), and MacBooks are some of the best performing laptops I've ever seen, able to handle my current needs. Though I still feel dirty even considering the platform switch.

Just as the title says, recently I've been considering replacing my personal laptop with a MacBook Pro, and it makes me feel dirty. People who have known me for a long time or who have been reading my blog for a while know that I have been ardently opposed to Apple products for a very long time. However, when I started working at PatientSafe Solutions, I was outfitted with a MacBook Pro to perform my work, mainly because our flagship product is a specialized iPhone and corresponding suite of apps for the hospital. This was the first time I'd had to work with a Mac, and it took a while to get used to. However, like my days with Windows, I eventually started to get used to the environment and began pushing the edges of customization to suit my needs: I started adding customizations around how I interact with the filesystem, and began adding more and more utility scripts to make my work system behave the way I needed it to accomplish the work I had to complete.

Personally, I enjoy working inside of Linux environments. They are more reliable, robust and cheaper to maintain and being that I work with them often both at home and at work, it is very familiar to me. However, with my hobbies I also need a robust UI environment that is consumer-friendly - one that responds quickly, has a multitude of features, and a large application library, both commercial and open-source. In my personal time, I also develop applications for *nix-based platforms (Linux, Android) in JVM-based languages (Java, Kotlin). I also do photography, using Photoshop to edit and compose my photos. And recently I have added flying drones to my set of personal hobbies (with a DJI Phantom 3 & other smaller drones, both for stunts and indoor flying). In all, my needs vary quite a bit, but a common theme exists in all cases: I need a fast system with quick access to various things, both through a UI and through the command-line.

Recently, I've also wanted an environment that is consistent with the environments I work with at work and at home, allowing me to "write-once- run-everywhere" both in tooling and workflows. Over the last few years I've been working a lot with Docker containers and have even started to use them with my own home server, allowing me to develop custom services locally and spin them up on my home server for "production" use, or even use services "off-the-shelf", and with the recent releases for Docker on Windows or Mac, working with containers locally is now even easier than ever before.

So this brings me to the rationale for considering the switch to a Mac: the OSX kernel is Unix-based (Mach to be specific), and contains at the heart of a system extremely close to that of a Linux-based system; it also has a very fast and un-intrusive UI with one feature that I have loved since I first worked it in very early versions of Windows and in most Linux UIs: multiple desktops. The other thing I have come to really appreciate about the MacBook I work with is its shear speed. Though I don't really like tight hardware integrations in general, on a laptop it only makes sense, and when the OS is designed & tested with specific hardware on a laptop in mind, the result can be very performant, and this is certainly the case with the MacBook I work with. And finally, I have been generally unimpressed with Microsoft recently.

They recently seem to be changing things for change-sake and not really improving things (much the same way Apple has been going about their offerings since Jobs passed away). In fact, its very telling that Microsoft is struggling as their flagship OS has undergone 3 major revisions in the span of time that I got the laptop I'm looking to replace, and I have yet to upgrade from Windows 7 on it since I've seen no benefit to doing so.

So, if I've been using Windows 7 since I got my last laptop and am still using it, why change at all at this point? Well, I'm starting to have problems: I'm having trouble with the power connector on the laptop and it just can't keep up anymore. On the power connector side, while the system is on and plugged in, the power connector applies power and disconnects a short time later, causing the system to speed-step up and down a lot. Moreover, because of this frequent power connected-disconnected cycling, I can no longer use the laptop for extended periods of time since the battery can no longer charge and/or run off the AC power while the laptop is on. On the performance front, it has become slow, and, despite my best efforts to increase speed, and applications I use on it thrash badly because core services are now consuming tons of memory (it has 8GB, but after startup I have only 4GB to use and I can't increase it further). Also, trying to view the recorded videos from my Phantom 3 is frustratingly difficult as none of the players I have on the machine (VLC included) can handle the HD video that the Phantom 3 can record (1080p@60fps). In fact, Ashley's Surface Pro 3 performs better than it now. Unfortunately, it is to be expected of a 4-year-old laptop.

So, you may be asking, why another laptop? Why not switch to a desktop platform? Because my life is very dynamic. I visit meetups where I need my laptop to work or demonstrate things. I also sometimes bring my laptop to family functions to demo things to other geeky family members, or sometimes even try to rush-edit family photos to allow me to distribute them to family members while they are physically there with me.

In conclusion, the reason I've been considering going to other other side isn't because everyone else is doing it or that the Apple offerings are superior or that its trendy. Its because my needs have grown, and currently Apple produces some of the most performant laptops I've seen to date - due greatly to the fact that the OSX operating system is tuned to work with the hardware, and vice versa. And though I lose the ability to use much of the application library I've amassed over the years, it would still end up losing it since some of the applications would no longer work on newer versions of Windows. But, for some of the major commercial applications I use (IntelliJ IDEA, Photoshop), I still have the ability to use them on OSX. As for Office? Well, Google Docs replaced that for me long ago. So unless I find a Windows-based laptop anytime soon that meets and exceeds my needs anytime soon, you might start seeing me sporting a Mac. But you won't see me donning a black turtleneck anytime soon - its just a means to an end, not a shift in preference. I still prefer Linux over anything else, but for UI and application library support, its frustratingly still not there. Though maybe my next laptop will finally be Linux through-and-through.

Jan 1, 2016 - The End of An Exciting Year

Comments

Its the last night of 2015, I have a drink of the alcoholic type origin and its time for me to write my annual post reminiscing about this past year. And quite the year it has been. I've said in past years that odd-numbered years have had quite significant changes for me. Last year was an exception, with a change in employer, but that only barely squeaked in toward the end of the year. This year set the pattern back on track, though.

In the last year, I think the most significant change in my life was the purchase of my first home. After just over 5 years, we moved out of our first apartment. Though it took me a while to get used to driving to a new place, I was (and still am) very excited to make our new place our home.

However, I should mention that it was not the only thing that happened this year. It was also a year where I felt I made a significant impact on things at work. This past year I have worked hard to find ways to improve the Interface Engine that I work on at work, and felt that I have made some pretty sizable contributions on that front. I've also been working hard with my colleagues to improve customer relations in regards to the Interface, and feel that we have made very big improvements there.

Most of this year was filled with work. But for the first time in a very long time, I don't feel exhausted. In fact, I actually feel empowered and excited to work at PatientSafe. Working with people who are truly talented, who truly care, I feel like I'm doing what I've wanted to do - help people through code. But I have also tried to balance my dedication at work with significant quality time with my family, as it finally has made sense that without the balance, my life is difficult and depressing.

Well, at this point, the alcohol is being overly effective in relaxing me on this eve to 2016, and it is now making it difficult to think clearly into this past year. With 2 hours left in the year, I think its time to git commit this and enjoy the remaining time with family. Maybe next year I'll actually post more technical stuff, like I said I would. Until then, Happy New Year!

Dec 4, 2015 - My First Android App

Comments

Since I purchased my first Android device, the much-loved Nexus One, I have had a desire to build and distribute my first app for the Android platform. Unfortunately, with each attempt on starting an app, I ran four of the most difficult roadblocks for a hobbyist developer: getting an idea for an app, finding the time to work on an app once an idea was found, not getting into paralyzing infinite loop of restarting the project each time the platform changed, and feature creep.

Finding good app ideas was never a hard thing for me, but finding one that I could work on in a short period of time and had a small scope that a single hobbyist developer could work on was another. Though I am certainly an experienced Java developer, working with the Android platform in itself has a small learning curve. Moreover, the ideas I had usually involved some sort of webservice as well, complicating the project in many ways. Questions like "What framework should I build it with?" and "What sync mechanism should I use?" to "How much is it going to cost to host this service?" and "What should I do about securing user data?" swam through my mind. The complications made the walls steep, and the first lines of code had not even been written yet. These questions usually discouraged progress, even though most of the answers to the questions were "Who cares? Deal with it later."

However, there were other times when I came across ideas for self-contained apps that were fairly simple. I've repeatedly had one such idea, which essentially was a way for me to stop using Google Forms to track some information and use an app instead. It had a well-defined scope, and allowed me to explore some of the most important parts of the Android platform. But after starting the project, making some progress, and pausing to spend time on the other things that my life demanded my attention on, I found it difficult to go back to the project and continue where I left off, mainly for my third roadblock.

Whenever I had time to return to my app projects, Google released a new version of the Android platform. In earlier versions (pre-Honeycomb), this usually wasn't a big deal since a lot of the changes were enhancements to the platform. However, after Honeycomb, there were a lot of UI-related changes: Fragments, Holo, then Material. I wanted the UI of my app to look-and-feel like it belonged on the platform. Rather than try to refactor the current code (which wasn't much), I figured I'd restart the project, using the new paradigms from the beginning. This caused me to restart the project quite a few times.

Then, with each platform update, I got more ideas that could be put into the project. And with each idea, I'd stop what I was doing and start on the new idea. Sometimes, the new ideas were changes to things that I had already done, causing me to rewrite pieces over and over again. Feature creep and refactoring hell were my enemies at this point and my projects were caught in a state of perpetual "IN PROGRESS".

It actually became a joke for me. I had been a part of the San Diego Android Developers Group for many years, practically from its start, but I hadn't finished a single app. Long-time members of the group knew me and knew the problem I had. It was't a technical problem, just a PEBCAK one. However, this past November, an app idea was sparked in me, with a small scope and with such limited UI (read: almost none) that it was nearly impossible for me to get caught up in the vicious stagnation cycles that paralyzed me in the past.

The idea stemmed from an annoyance I had with my fiancee's sister's (let's call her A) use of Instagram. Since she had a tight-knit family and I was a part of it, I wanted to be involved in family (having known her sister since they were pretty young). The issue was that A wanted to keep some pictures she came across on Instagram. In order to do this, she would reshare the original post, open the image and screenshot it, then delete the post. However, because I had post notifications for her, I'd see a post notification pop up on my phone, but when I tried to open it, Instagram would complain that the post had been deleted. It was rather annoying.

I also felt it was pretty annoying that Instagram didn't have a facility to save images to the device - but there were ways. I had had enough of the annoying notifications (she is a teenager, so you could imagine the volume of notifications I would receive), but didn't want to sacrifice not receiving the notifications for her. So, after doing a little bit of research into the capabilities of the Android platform, I found a quick solution that almost required no UI. After one spending some time one Saturday coding it up, I had not only a working prototype, but a nearly-finished app (yes, the requirements of the app were that small).

I finished the app, and knowing that in order to distribute updates to the app I needed to use the Play Store, I published my app (at the time of writing this, the app is in public beta) so that when I fixed problems or added features, she would automatically get them on her device. Unfortunately, the original name of the my app was already taken (ironically enough by another app that did pretty the same thing mine did), so the first submission was rejected by Google. However, after renaming it and retrying, it was accepted as Keepagram and published.

So, that's the long story behind my first app, Keepagram. It is embarrassingly simple, and in no way a shining example of the depth and breadth of my skills as as software engineer, but as someone who has been paralyzed by making my pet projects overly-complicated, I am very proud that after so many years I have finally been able to get something done.

If you'd like to join the public beta for the app, click here. I am definitely looking for feedback on it, so feel free to let me know what you think.