Apple Watch Series 3 Review

I have been watching the Apple Watch for a couple of years now debating about whether I should get one or not. Initially they looked too limited. The battery life on the initial model was very short and then there was the whole lack of being able to get the watch wet, among other limitations. I decided to sit back and wait a few years and see how it evolved.

The Series 2 started looking interesting, but I still didn’t find it compelling enough to give up the freedom of nothing on my wrist. Finally they announced the series 3 last fall and it started to sound like something that might potentially work for me. First it is setup for swimming with. While I don’t swim very often, for me having a watch on in the pool was always a nice way to keep track of the time. Then factor in the ability to track your workout and get texts and take a call without having to get out and dry off, it starts to look really good for someone who is more active than I am.

I decided to buy a 38mm Series 3 for my wife for Christmas. It sounded like the battery life was getting decent and many of my initial complaints were addressed. My thinking was she doesn’t always have her phone on her when dealing with the kids, so with the watch she would always get my texts or could answer the phone if she wasn’t near her phone.

She used it for a bit, but in the end she found that the battery life still wasn’t quite long enough for her that she would forget to charge it and it would be dead, or if a call came in she couldn’t answer it on the watch anyway as the baby was napping, etc. Given this she decided that we should sell it and she would do something else with the money, so I was thinking well before I sell it I should try it out for a couple of days just to see if I found it interesting enough to get one for myself. Obviously if I were getting one I would go for the 42mm as I find the screen on the 38mm a little bit small, but for testing purposes it would work perfect for me.

In my use I found that I could get about 20 hours out of the battery. That isn’t terrible as it should keep going on your longest days, but in a perfect world I would really like to see the thing last about 3 days. Normally you can just charge it every night so the current battery life isn’t really a deal breaker, but if you wanted to use the watch for sleep tracking, you would have issues with the current battery life. That being said, I don’t think I would use it for sleep tracking as I think having the thing on when I was trying to sleep would just annoy me. I think if I decide to go that route I would rather look at something like the Nokia Sleep which looks much less invasive than wearing a watch all night. At this point with an infant I don’t think really want to track my sleep though as I think ignorance how much many interruptions I have at night is probably bliss at this point.

The integration between the watch and my iPhone X is pretty amazing. You start the music or podcast app and immediately have controls on your watch for what your phone is playing. So when I am out walking the dog, I don’t have to pull my phone out of my pocket to skip a song or to adjust the volume it is all right there on the watch. When I glance at the time on the face I have a watch face that shows me my next calendar event, so I can immediately see when my next meeting is without having to check my phone. All the health metrics (activity and heart monitoring) automatically show up in your health app.

Basically it does what I feel Apple does best, which is to erase the boundaries between their different products. A perfect example of this, is I have a Honeywell Lyric T5 Thermostat. One of the reasons I went with that model instead of a Nest or something else was that it supported Homekit and I wanted to play around with the native integration on my phone. Then when I bought an Apple TV 4K suddenly you can program automations on your Homekit stuff as it just hooks in with the other devices it finds on your network. Granted I could do that before with the Lyric T5 App, but now it is integrated natively in my phone.

The watch is the same way, it gives you tight integration with your phone, and removes more boundaries. The model I have is the Wifi only model. The LTE sounds interesting, but not at the price that AT&T charges for it. I don’t think it adds enough value in my life to justify $10 a month for the service. At $5 a month it could get interesting. My neighbor has one of the original watches and he said he likes how well it works with his airpods as well. So when he is walking he can be playing something through his phone controlling it on his watch all going to his ears with no wires involved and everything just works. If you had the LTE model and a subscription to Apple Music you could even leave the phone behind as you don’t need it anymore. But again I don’t see myself going that route. I own over 4,000 songs, so the idea of renting music doesn’t sound interesting to me as I mostly own everything I want.

The workout app is interesting. I don’t really work out, but I am trying to be a bit more active for health reasons. Most of my activity consists of taking my dog for a walk in the evening. There is an outdoor walk as one of the options in the workout app. Typically I track my walks by having my phone in my pocket and checking Activity under the health app. I usually check how many steps I have at the start of the walk and then see how many I have after my walk to have a rough guestimate of how many steps I walked. The watch still gives you all that, but in addition to that it will also give in real time your distance in miles as well as the time you have been doing that working and what your heart rate is. I find that when walking the dog if I am nearing the end of the walk and I am at 1.5 miles I will push myself a bit and make sure we go for more than 2 miles. I also found it to be useful to sort of push your pace and get your heart rate up, as opposed to just tracking steps, without tracking your speed. Once you end the workout it will also give you the average time it took you to go a mile, and some other stats like average heart rate.

Many of the apps I have automatically have a watch version. I found most of these I have no interest in having on the watch and removed almost all of them. I left the Nokia Health app on there though and it was cool that when I earned a new badge exercising one night on there that it showed the achievement on the watch as well. One thing I disliked is that to remove some of the apple built in apps you have to remove them on your phone. A perfect example of this is the News app and the Stock app. I want neither on the watch, I want the watch to be really focused and just do 3 or 4 things, but to remove those apps from the watch I have to delete them from the phone. Apple doesn’t give me an uninstall option like it does with 3rd party apps. That is pretty annoying as perhaps I want to check my stocks every now and then on my phone I just don’t want it cluttering up my watch app screen, yet I can’t use it in that way.

One of the things I most enjoyed about the watch was getting text notifications on it (you can also get facebook messenger and slack messages there too if you want them). Mostly for when I was driving and I feel a text come in. You can just glance at it quickly at a stop light without having to pick up your phone (or miss the message until later as I do many times now).

So after using it a couple of days do I find it interesting enough to buy? At this point the answer is no. I don’t quite see what the killer app is. It is nice, and somewhat useful, but mostly it just feels like a fun toy at this point. The heart monitoring I must admit I do like. I also like the activity app that sort of nudges you to stand some and be more active. Those are all good things for me. But ultimately it isn’t enough to justify the price.

So what would get me to buy one. Well if I got a gym membership and was swimming regularly I could see myself getting one to track that workout. I think a real killer feature for me would be if the thing could some how do glucose monitoring. I would love to have like real time monitoring of that so that when I ate food I could see how it spiked my blood sugar. I think that kind of tracking would nudge me into eating healthier and would ultimately be the killer app for me. I could also see the watch being a game changer for my friends that are serious about running. The way it gives you the altitude change, average time per mile, weather, and heart rate, would be pretty useful for tracking how your runs are going. My sister does a ton of cardio and I could see her getting a lot out of the watch as well. And with the activity sharing if all your friends are in the Apple Ecosystem it could be useful to try to get a little competitiveness to encourage you to go out and be more active. But in my case it is about 50/50 between the Apple and Android eco systems so maybe some of the people that you want in your activity group you couldn’t get.

Maybe the series 4 will finally deliver the killer feature that will get me into one, but for now I will remain on the sidelines. (There is a rumor that the 4 will offer an even larger screen than the 42mm which sounds nice as well).

Java 10, already!

Java 9 we hardly knew ye, yet here we are and today was the GA release of Java 10. This is especially true for those of us using Spring boot as we just got official Java 9 support a couple of weeks ago and now 10 is out. From my standpoint the big features of the release are the Root Certificates. Java 9 shipped without root certificates if you used OpenJDK which in my mind makes it less useable as now you have to with that, you can’t just run it and go. That is what was keeping me on Oracle’s releases of Java. Now in Java 10 there is no difference with the oracle JDK and the OpenJDK so I will probably just deploy my apps on OpenJDK in the future. That simplifies Linux installation as now you can just run apt-get install and go. Before I used to have to add the ppa for Oracles and install it and then deal with the strong crypto policy files. All those old pain points are gone.

The next big change is Parallel Full GC support in G1GC. In Java 9 they changed the default VM to G1 and now they have enhanced it so that if you have to run a full collection it will at least run in parallel and reduce the pause time for your application.

The feature all the developers are talking about is local variable type inference. So now you can write:

var list = new ArrayList<String>();

Instead of:

List<String> list = new ArrayList<>();

The thinking being the name of the variable is the most important part and this may make the code more readable. For me I am not completely sold on this change. I think in some circumstances it may make the code more readable, but in other cases it will be worse, so I am taking a wait and see approach with using this style.

The other small developer feature that looks good to me, are APIs to create unmodifiable collections. I could see myself using that a lot, and it will be nice to no longer need Guava for some of these things. Instead of thehorrible old:

List<String> list = new ArrayList<>();
list.add("String 1");
list.add("String 2");

return Collections.unmodifiableList(list);

And making sure that you aren’t leaking the original reference you can just do:

var list = List.of("String1", "String2");

or if you have the list shown in the first example and you want to lock it down you can use:

return List.copyOf(list);

which I think reads better than:

Collections.unmodifiableList(list);

and it is obvious that it is making a copy so you don’t have to worry about leaking the original reference.

Other than that there is better support for the VM to realize it is running in a docker container and only assume the resources assigned to the container instead of reading the OS values. Otherwise there isn’t a lot there. That being said if you have managed to get on Java 9 already in production you need to upgrade right away as 9 is no longer supported, and you need 10 to make sure that you have all the latest security fixes.

Finally I will leave you with this:

Java version text

The times they are a changing…

Let’s Encrypt Wildcard Certs

Recently Let’s Encrypt announced that they would be supporting wildcard certs. I was pretty excited to hear about this as many times I would like to get certs for machines that might not be accessible on the internet. Currently I didn’t see an easy way to do this. With the new certs you could get a cert on your web server for your domain and use that cert on all the other machines in your domain that need TLS as well.

I decided to try it out and see how easy it was to do. I updated my certbot client to version 0.22 and did some google around and found out that you have to specify the new acme version 2 servers on the client command line in order to generate the wildcard cert. So I found the command and fired it up:

./certbot-auto --server https://acme-v02.api.letsencrypt.org/directory -d *.haskovec.com --manual --preferred-challenges dns-01 certonly

The command runs and asks you a few questions and then presents a DNS challenge. They give you a TXT record that you need to update in your DNS server to prove that you control the domain. I added the record and waited a couple of minutes and next thing you know it generated my new cert.

I updated my NGINX config to point to the new cert restarted the server and hit my site. Next thing I see is an SSL error. It turns out if you only have *.haskovec.com in the cert that isn’t a valid server for the base domain of haskovec.com. So I reran the command again and specified the following:

 ./certbot-auto --server https://acme-v02.api.letsencrypt.org/directory -d haskovec.com -d *.haskovec.com --manual --preferred-challenges dns-01 certonly

This time it asked me if I want to expand my cert to include the new domain name. I said yes. Next it had 2 challenges that I needed to insert into my DNS TXT record. I added them both and finished generating the new cert. When I restarted NGINX my site was back. I ran the https://www.ssllabs.com/ security test on my site and I am still at an A+.

All in all a very easy process and I recommend people give it a try.

Java 9 Upgrade

After upgrading my test app to Spring Boot 2.0 yesterday I decided to see how difficult the Java 9 upgrade was from there. I am happy to report that it was fairly trivial. I upgraded my maven pom to set the Java version to 9 and did a mvn clean install.

Immediately I see some no class def exceptions around javax.transaction.Transaction. I did some quick google searching and discovered the problem seems to be in the Maven Surefire plugin. I found a work around that said to set the version to 2.20.1 and added a command line flag of –add-modules javax.transaction. After doing that I was seeing errors around java.xml.bind. Doing some more searching I then added a second –add-modules java.xml.bind. This fixed the issue. In the course of doing so I found a link to the issue on apache’s website. Reading through the comments I ended up with a final configuration of 2.21.0 with the following options:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <configuration>
                <argLine>--add-modules java.xml.bind</argLine>
            </configuration>
        </plugin>
    </plugins>
</build>
Once I dropped that configuration into my pom everything built and ran correctly. So once you get your app to Spring Boot 2.0 the jump to Java 9 is pretty seamless. My follow up change now will be to switch to the new factory methods on List and Set in the app to take full advantage of the features. Once Java 10 drops in a couple of weeks, I will take the App to 10 and see how that goes.

Spring Boot 2.0

Spring Boot 2.0 has finally arrived. Unfortunately we aren’t yet in a position at the office to be able to begin the upgrade so I decided to start playing around with it on one of my projects at home as I didn’t want to wait until we were ready to update our app.

The first thing I noticed about it they removed findOne() from CrudRepository. This to me is a bad change for all the users of the framework. It is one of the most commonly used methods in Spring Data, and not people either have to refactor their code to use findById() which returns an Optional<> of the type and deal with the optional instead of a null or you have to add a findOne with an @Query to all of your repositories. I have worked on projects in the past that have hundreds of tables and Repositories. This change is forcing them to update hundreds of classes just to upgrade to Spring Boot 2.0. It seems to me a better choice would have been to @Deprecated on findOne and encourage people to upgrade to the new findById method.

The next breaking change I found was also in Spring Data. They removed the delete() method from CrudRepository that takes an ID as the type. It has been replaced by a deleteById() call. There is no good reason for this change. In Java we have method overloading so the language can determine whether to invoke delete() with the Entity or delete() with an ID. It seems like they were trying to be consistent with findById() but they just end up breaking a bunch of code in the process. The only benefit that I can see with this change is groovy will get happier as it seems to be very poor at understand overloaded methods.

The next change I noticed was when calling new PageRequest(page, size) it was telling me that constructor was deprecated. To me this is the right way to handle the situation. I clicked into the method and it suggested to use PageRequest.of() instead. That was an easy fix that I made and seems more consistent with Effective Java about using static factory methods instead of constructors.

Finally I got all my unit tests updated to replace the findOne calls with the findById changes I had made and I went to launch the application and Hibernate fell over. It looks like the new version of Hibernate requires me to specify a GenerationType of Identity with MySQL where before it didn’t force me to specify it.

All in all it wasn’t too bad to upgrade my toy application. I am really looking forward to using Spring Boot 2.0 going forward, but a little disappointed by some of the Spring Data breaking changes. I feel like this could have been transitioned in to make it easier to upgrade existing Spring Boot 1.5.x applications. It is interesting that 2.0 is the first release to support running under Java 9, and it is finally released a month before Java 9 goes away and Java 10 is released. Up next for my test application will be switching it to Java 9 to see if I see any issues with that.

Upgrading to Java 9

Upgrading to Java 9

Ever since Java 9 was released last fall, I have been wanting to upgrade our software at work to the new platform. I am not interested in the new module stuff, mostly I just want the convenience methods like List.of(), and the platform improvements. I think G1 by default looks good, the new representation for strings to save memory looks like a huge win, and all the performance numbers that I have seen show it to be a big win. Unfortunately this is not as straight forward as one should hope.

Step 1 – Spring Support

Even though Spring 5.0 was released back in December I think which fully supports Java 9, Spring Boot 2.0 is not yet released. I believe it is in RC2 now and about to be released in the next week or so, but at this point we are less than a month away from Java 10, before we will have proper Spring Boot support in Java 9. All of our microservices are currently running on Spring Boot 1.5.10 except for one. It is still running on the 1.3.x version of Spring boot, which brings us to our second Spring issue to resolve. Some contractors that originally started that service did a hack to lazy load @Formula s in hibernate. While this worked in Hibernate 4.x in Hibernate 5 the hack no longer worked so we can’t even update this service until we refactor those entities and move that data into views. That is still a work in progress. The other microservices could be moved to 2.0 when it comes out, but I think their is a consensus that we don’t want to move to 2.0 until we have all our services to a place where we could do that.

Step 2 – Gradle

We are currently running gradle 3.5.1. Going to Java 9 is going to require Gradle 4.2 (which is also a requirement for the Spring Boot 2.0 Gradle plugin). Normally this is no big deal upgrade the gradle.build file edit the wrapper portion to the new version run ./gradlew wrapper and check in the new gradle wrapper. But in this case we still have a developer running on IntelliJ 2016.1 and another on 2016.2. They would have to upgrade to at least 2017.2 in order for the new gradle to work with their IDE. So we will need to convince the whole team to update their IDE if they haven’t already ideally at that point to 2018.1.

Step 3 – FlywayDB

We are currently using Flyway DB 4.2.0. This didn’t work with Java 9 when I was testing it, so we need to go to 5.0.x. Additionally Spring Boot 2.0 requires Flyway 5.0.x. Ideally we want to upgrade this ahead of Spring to minimize risk. Bring the new flyway into production and then once we are satisfied that it doesn’t break anything upgrade Spring Boot.

Step 4 – Docker Containers

Once we have all that software in place we then will have to update our docker containers to pull in the new JVM. It sounds like in Java 9 Linux, OpenJDK ships with an empty certificate store. So that means finding a Oracle or Azul docker container as our base. We then have to verify that New Relic works with Java 9 so we have our container monitoring. After doing all that we can update our base VM to be Java 9.

Step 5 – Update Jenkins

We will need to add a new VM to Jenkins so that as different builds switch to the new Java 9 container we also switch to compiling them with the Java 9 VM (though with the Java 8 flags still at this point).

Will the pain never end…

Finally after doing everything listed above we could change our compiler flags to 9 and start using the features. It is still a painful road to walk to get us there. At this point it feels like by the time we finish the work that needs to be done (as obviously we need to be shipping features and bug fixes, while we lay the foundation for this on the side) Java 11 will be out and we will be moving to that.

Even though Java 9 support is so close to being out in Spring Boot I still feel like I am at least 6 months away from getting to use any of it. This feels much more painful than when I moved an App from Java 7 -> 8. At that point I think it was just a matter of coordinating a JBoss container upgrade from 6.0.1 to 6.4. After we got that into production we updated the VM to Java 8 (still with everything compiling on 7). Then we upgraded our Jenkins machine to have Java 8 for the compiler, and finally we updated our maven pom to use source and target of 8. I wonder if anyone Spring shops will even make it to 9 or if everyone is holding out for 11 at this point (also to get the LTS release). While I really like the sound of the 6 month release cadence actually getting the dependencies in place and lined up to do an upgrade will probably mean most enterprises just end up going from LTS release to LTS release and I would guess that Java 9 and 10 see very little use running production code and mostly will just be things for developers to play with on their machines.

Themes for 2018

Introduction

As is tradition on this blog I always lay out some themes to focus on for the upcoming year. These were last years themes if you want to get an idea for the types of things I usually do. I haven’t spent as much time as usual pondering my list this year as I was very busy over my holiday break (at the start with sick kids, and at the end with lots of family activities). Given that today is my last day of vacation I decided it is time to get some things written down. Here are my themes for 2018.

Theme 1 – Health

I started out last year wanting to drop about 50 pounds by my birthday in July (just to get healthier before I turned 40). I managed to lose 30 before my birthday, and then sort of fell off on it in the second half of the year so about half of that came back. So I want to make the same push this year and try to get down to around 200 lbs by my birthday and I am working on my approach. Way back in the day I tried weight watchers and was very successful with it, but always felt hungry on it. Several years later I experimented with the primal diet and found it to be way more effective for me than weight watchers, but a challenge due to limits on foods that you can’t really eat. Last year I lost all that weight following slow carb diet from the 4 hour body. The big advantage of that diet is that you get a cheat day so anything that you really crave you can have once a week. I will probably be doing something between primal and slow carb.

Along that line of thinking one of the priest’s blogs that I follow is doing a program he is calling Nineveh 90 which is sort of his program for physical, mental and spiritual health. He launched it on January 1st and it goes up through March 31st (Holy Saturday). Kind of a lent on steroids. I decided I was going to adopt components of it myself, but not starting until today the 7th as I prefer to celebrate the Christmas feast for the entire 12 days of it.

The components related to physical health that I will be trying to follow in conjunction with eating better are:

  • Regular and Challenging exercise. Not sure I will hit the challenging part, but I will at least try to get close to my 10,000 steps in every day and maybe walk the dog more than usual.
  • At least 7 hours of sleep. I often get tempted to stay up late when reading or when working on some sort of problem and I will try to be diligent and get to bed by 11pm.
  • No alcohol – I enjoy a beer at night generally with my dinner, so I will be cutting this out (which should help cut carbs). I will still allow myself a drink if I am out, so that I can still participate in my neighborhood brew club and if I am out for my wife’s birthday or our anniversary or valentines day which will fall in there I can still have a drink. This should cut a lot of calories and carbs for me as with 4 little kids I don’t get out much.
  • No desserts & sweets – I don’t have much of a sweet tooth so giving up desserts & sweets until Easter is doable, though with the caveat of exceptions for birthdays, anniversary, and valentines day.
  • No eating between meals – This one is going to be more of a challenge. I have gotten into the bad habit of nibbling on a slice of cheese here or a little of this there. This should do a lot to cut out sort of bored snacking, and help me drop that extra holiday weight.
  • No soda or sweetened drinks – This also isn’t much of a challenge. Occasionally I enjoy a root beer float, but those are few and far between so no soda until Easter is easy (and I don’t sweeten my coffee).

So those are the physical health components to the Nineveh 90 stuff that I will be following. There are other aspects related to spiritual aspects as well. I will be adopting some of this as it seems like a good challenge for the start of the year and sort of an extended lent this year. In the original program you can relax the discipline on Sunday and Solemnities, but I will be relaxing the discipline instead as I noted above. The relaxed part sort of reminds me of the cheat day in slow carb, relax one day a week so you can keep it up the rest of the time. The final component he lays out is fasting on Wednesdays and Fridays. He suggests bread and water only if you are medically fit otherwise standard Catholic Lenten fast. I think I will probably fast and only do water and coffee on Wednesdays and maybe not eat until supper time on Friday (since Sofi and I usually eat something together on our Friday nights after we get the kids to bed).

Theme 2 – More blogging

This is sort of an annual one for me. But generally I try to make it a priority anyway. This does compete for a limited slice of time though. After work generally I Am busy with the kids for a couple of hours. After we get them to bed I still need to walk the dog and get some exercise in and hang out with my wife and try to read, and sometimes do a bit of work. So this one will continue to be bumped as it needs to, but I will try to stay in the habit and find some time on the weekend to work on a post here and there.

Theme 3 – Learning

This for me means lots of books and playing around with ideas on the computer. I have just started Effective Java 3rd Edition and it is great as expected. I haven’t quite gotten to the part about the updates for Lambdas and Streams, but I look forward to seeing the insights there. Other things I am playing around with on the learning side are messing around with a bit of Swift. I have a udemy course I was working on for iOS development under Swift. I did some over paternity leave and would like to play more with it. Also have been playing around with Kotlin some. I like most of what I see in that language. Maybe I will do a Java vs Groovy vs Kotlin type post about what I like or dislike about each of the languages. I think Kotlin gets nearly everything right, except for having classes final (not open) by default. I think that was a mistake. I have always been looking a bit at Node.js and Express just because of all the hype it is getting and I want to play around with the newer versions of Angular and the whole progressive web app concept, since I spend most of my time at work focusing on backend development.

Theme 4 – Architectural changes at work

I have already started some of these this fall. Part of this will be shifting more of our app to Java away from Groovy. I think Groovy in an enterprise app is a mistake. It is the opposite of fail fast, instead the compiler hides errors, and it just feels dated after using Java 8 / 9 features. Their closures are inferior to lambdas and streams, and the tooling around the language just isn’t that good.

Included in these architecture changes will be trying to get our services updated to Spring Boot 2.0 when it finally releases and then shift to the Java 9 or 10 platform (instead of 8). I would also like to look into rolling out the SonarQube build breaker to enforce our coding rules, that has worked well for us in previous companies that I have worked in.

Conclusion

I think working on these 4 areas will be plenty to keep me busy this year. If I am diligent about them it should also give me topics to blog on. I started this post on the 7th, but I had to finish it up tonight. My year is already starting out busy and I don’t expect it to slow down at all from here. Happy 2018 everyone!

2017 year end review

Recap for 2017

Now that I am off of work for the rest of the year I decided that it was a good time to work on my annual year end review for 2017 and see how my year went. This is the post I did at the start of the year for my plan on what I was going to focus on: Themes for 2017.

I am going to start with just an overview of my year and then I will drill down into my themes. 2017 was a whirlwind of a year. In the 4th quarter of 2016 we made a push to make Choose a profitable company. We achieved that by the beginning of the year and in my mind we were going to run hard for another year and really grow the revenue and hopefully sell the company in 2018. Instead the board decided to sell the company in May which led to major changes for me.

The new company decided that they didn’t want to keep a remote office and I was not in a position to be able to relocate my family so I knew that I would have to find a new role. As luck would have it on the day preceding the announcement of the acquisition I had received an email from a recruiter with a role that seemed like a perfect fit for me. The timing was perfect as my 4th child was 4 months away and that is a scary time to have the stress of job uncertainty. That ended up working out perfectly so I was able to transition into a new role by the end of July. The whole Choose experience was very bittersweet. One the one hand we did what we set out to do which was see a positive equity event for everyone. We built up a pretty amazing business and it was a wonderful experience to be a part of that. On the other hand it meant breaking up the strongest engineering team that I had worked on in my career, and it left me with a lot of what might have been if we could have run one more year. In my imagination I feel like with another year of growth we might have been able to go out at a valuation 3x higher, but perhaps instead the Hurricanes in south Texas would have completely killed our Texas business in our busy time of the year, so maybe we lucked out selling when we did.

The next major change in my life was the arrival of my 4th child. If you want to see anything kill blog updates take a new job and have a new born. It has definitely been a transition year to adjust to the new changes in our life. In sad news for 2017 my best friend has been fighting cancer this year. I am looking forward to the announcement in 2018 that he has finally beat it, and life can go back to normalcy.

On the stats side of thing I ended up with 20 blog posts for the year (including this post). That is actually only 1 worse than 2016, but in 2015 I had averaged about one post a week, and that is much more in line for where I would like to be. Given the change I was dealing with this year I am pleased that my post count wasn’t even lower than it was. I had a pretty good start at the beginning of the year which carried me through.

And now on to the themes:

Theme 1 – Update the blog

I am going to call this a fail. I was pretty much non existent the last part of the year. But there is always next year to do better. Sometimes life gets crazy busy.

Theme 2 – Regular reading

I would call this a win. I am sort of surprised that I was able to keep my reading up with a new born and the lack of sleep. My favorite technical book that I read in 2017 was Functional Programming in Java by Venkat Subramaniam. Of all the regular conference speakers Venkat is my favorite. He has a way of taking complex topics and breaking them down and making them very intuitive.

Another book that I really enjoyed this year was Angel by Jason Calacanis. I am very interested in the startup scene in general having worked at 3 startups now in my career. And I found this look from the investor side very fascinating as well. It really makes me want to focus on reaching accredited investor status in the next 5 years and start investing in some syndicates on AngelList. Then again with the trend this year of Initial Coin Offerings and people skipping the whole VC thing and going directly to the blockchain to raise money who knows what that space will look like in 5 years.

Back when I was in high school I used to read a lot of fiction, but these days I mostly just read non fiction. However I was talking about the Dark Tower series that I had read back in the day by Stephen King with a coworker and he mentioned that there was a book released between 4 and 5 a few years ago that I wasn’t aware of. I immediately had to buy it on my Kindle as that was one of my favorite series of books that I have read (though I hated the end). I read The Wind Through the Keyhole when I was out on paternity leave and it was perfect. I was too exhausted to taking on any heavy reading, but a little fiction in the downtime was really relaxing.

I also read Never split the difference by Chris Voss. Prior to this I had never really read anything about negotiation or looked into the topic. I wasn’t aware of the author or this book, but I heard him on a podcast interview. I was intrigued so I bought the book and read it, and found it to be very valuable. It is probably worth rereading that one in 2018. I actually put a few techniques from the book into practice this year in some negotiations and found them to be very effective. I would say I got my money and a lot more out of this book just by applying what I learned.

For 2018 the 2 technical books on my radar right now are: Effective Java 3rd Edition. The second edition of that book is one of the most timeless books for professional Java developers and is still extremely relevant after all these years. What I am looking forward to in the 3rd edition is ideas on best practices regarding Lambdas and Streams. I went ahead and preordered this book.

The other book I want to dive in more in 2018 is Domain Driven Design by Eric Evans. I started trying to dive into this over my paternity leave, but in the state of exhaustion I was in I found that I didn’t have the brain power to tackle this at that time. Now that I am getting better sleep again I would like to work on this book some more and play around with the design concepts in it.

And the third book I am planning on picking up in 2018 and working through is Learning Spring Boot 2.0 by Greg Turnquist. I have the first edition of Learning Spring Boot by Greg and the book was phenomenal. It got me up and running really quickly when I wanted to transition from the old Spring Monolith architecture to a microservices architecture, and I put the book into action when I joined Choose Energy. 2.0 dives into the new reactive programming model in Spring 5.0 and Spring Boot 2.0 which leads into the next theme…

Theme 3 – Learn about reactive programming

I would call this theme a failure. I did start playing around with reactive a bit in June around the end of Choose before I started my current role, but I didn’t get very far into it. I think I will use the book I mentioned above in 2018 to take a deeper dive and figure out if I see a role for this in our current service architecture.

Theme 4 – Architectural Changes at work

We did roll out service 3 at Choose, but unfortunately we didn’t get to build it to its full potential. We just had something interesting in place when the acquisition took place. This really only reached half of what we envisioned for it. I think it would have been a game changer for the company as we would have had a capability that no one in the energy market has which really would have increased stickiness of our site. I think that is part of my what might have been thinking earlier in this post about the acquisition.

Theme 5 – Master Angular / lodash

I definitely didn’t master angular. I will say I got more proficient as we were reworking the funnels quite a bit near the end of 2015 which started getting me more into the front end code. I figured with what we were doing at Choose that would have grown quite a bit, but after the new position, there has just been too much back end code to learn and understand to really dive into the front end yet. I started playing a tiny bit with angular and progressive web apps a bit on the side to get a feel for how that works, but I didn’t get a chance to dive too deeply into it.

Theme 6 – Healthier eating

I think I did a great job on this in the first half of the year and a poor job in the second half of the year. I dropped 30 pounds in the early part of the year using the slow carb diet out of the 4 Hour Body by Tim Ferriss. I neglected to mention this book above but it was clearly a great book for me as well as I saw a huge benefit out of it. Slow carb is interesting, in some ways it is easier to do that Primal since you get the cheat day each week. I think that makes it more sustainable long term as the things you really miss you know that at most you are just 6 days away from being able to eat. But even so I really only maintained this until I went into Intermittent fasting for lent. I have some new diet ideas I am playing around with to try out for 2018.

Conclusion

All in all 2017 was a great year. There were definitely a few lows and things that could have been better, but on the balance things were good. As always even if I don’t hit my themes I don’t get too upset about it. There are just too any unknowns to take it too seriously. The real goal of the themes are to challenge myself and to review just to hold myself accountable that I am trying new things and growing. The point is to avoid getting complacent. I am starting to kick around some ideas for new themes for 2018, and that is probably what the next blog post will be.

HTTP Location Header

I came across this blog post today about using the HTTP Location Header in REST API responses when creating a resource. I have been doing Web development now since 2008 and in all that time I have never actually seen anyone use this header on any of their endpoints.

That being said it makes a lot of sense, traditionally when I would create a new resource I would return the json for that object back in the response so the caller could pull the ID out of the object, but this seems like a better way to do it, as now you could just return your 200 like normal and set this header and not have to send the response body back when the caller knows what they just sent you.

So as is the purpose of this blog I share this partly just so I can refer to it myself to use in the future, but also to draw more attention to it for others as it seems like a great idea, and like the correct way to design your APIs. I also appreciated that they called it Polite HTTP API design, they are much better on their blog titles than I am, as that is a pretty good way to get some attention.

Bose QC-35 Product Review

Bose QC35 Box

Today I received my new Bose Quiet Comfort 35 headphones that I ordered, so I figured that I would do a review on them.

I have been a long time Bose Headphone user. It all started back in 2007. Sofi and I were about to fly out to Scotland to celebrate our wedding anniversary and I had recently received a small amount of inheritance money after the passing of a grand parent. Faced with an 8 hour flight to London (before we flew to Edinburgh) I was thinking man some noise cancelling headphones would be nice for the flight. So Sofi and I ran over to the Bose store at the mall in our area and bought 2 pairs of Bose Quiet Comfort 3 Headphones for our flight.  We quickly charged them until it was time to head to the airport. Previous to this I had never owned any premium headphones before, and I was immediately hooked. They were night and day better than anything I had ever used before. They cut out so much noise from the jet engines that I could actually play my iPod at a lower volume level that I would otherwise which lead to much more comfort when listening to music as well as much more comfort on the flight just having the headphones turned on with nothing playing. At that point I decided that these were the way to go going forward.

Fast forward a couple of years and Sofi knew how much I used my original headphones (I had replaced the earpieces on them a couple of times cause the leather wore out as well as buying a second battery and multiple cables), so she bought me a pair of Quiet Comfort 15 headphones to replace them for Fathers Day. Immediately I noticed the massive improvement in background noise cancellation, and these became my new go to headphones. I saw a couple of new models come out, but found no compelling reason to upgrade as these headphones outperformed anything that I had ever used, and were pretty comfortable (though I would say the QC3 were slightly more comfortable, but at less performance).

Then Apple got rid of their headphone jack on the iPhone 7. At that point I knew that whenever I decided to upgrade my iPhone 6, I would need to upgrade my headphones as well as my QC-15s were no longer going to get the job done. After seeing Apple’s iPhone X announcement I decided that it is time to upgrade my phone, which meant that it is time to upgrade my headphones. I decided to go with the Bose QC-35’s based on how happy I had been with my previous 2 Bose headphones and they looked like a compelling Bluetooth offering.

The first thing I will say is I am aware of the accusations of Bose spying on their users, but the beauty of these headphones is, you don’t need the stupid Bose app anyway so don’t bother downloading it. I turned my Head Phones on and then went to my BlueTooth settings on my iPhone 6 (iOS 10.3.3) and the headphones showed up in the list and I was quickly able to pair them. My phone asked if I wanted the Bose app, but I declined it.

After I had the headphones paired with my phone I tried to pair them with my MacBook Pro. I was able to do so in Sierra under the System Preferences / Bluetooth area. The Bose QC-35 headphones will pair with up to 2 devices at the same time. So I have mine connected to my laptop and phone all at once. However it will only stream audio from 1 device at a time. So if I have music playing on my phone I won’t hear any of the audio from my laptop and Vice Versa. In a perfect world I would love to see it mix the audio streams. Can you imagine how cool it would be to havve some cool song playing quietly in the background of a phone call. It would be like your own sound track to a conversation. The documentation says that they headphones will remember up to 8 devices that it pairs with.

The performance of the headphones is out of this world. They have really advanced the noise cancelling abilities since the QC-15 time frame. They also feel lighter weight when I am wearing them and feel more comfortable. The external noise is super quiet and the headphones work to take phone calls. I could see myself using them in the car just to take phone calls. I probably wouldn’t wear them in the neighborhood when I am out walking the dog though as the noise cancelling is so good I would feel a little bit too unaware of my surroundings.

I am still unsure of battery life since I just got them and I haven’t charged them yet, but Bose claims up to 20 hours on Bluetooth. When you first power them up they tell you what the percentage of battery life there is as well as which devices they are connecting to through the ear piece. They include a wire as well in case you are on an airplane and want to plug into the planes entertainment system. I would say the only knock I have against them so far other than their app (which I avoided) is that the included charger is a USB to micro USB cable. Given my MacBook Pro is all USB C it would be nice if they included a second cable for that option too, but I guess when they headphones were released a year ago, USB C was really just coming onto the scene. All in all I would recommend them, I suspect that I will get many years of use out of these headphones as I have my previous 2 pairs of Bose QuietComfort Headphones.