This morning, I got a notification in my computer from Apple Photos. It says “Best of the Year 2017”. When I opened it, it was a nice collection of photos I took all through out 2017. Cycling competitions I joined, small dinners with friends, and some big milestones in my life. Most of them I haven’t posted in social media. It is such a delight. It’s akin to a friend showing you an old picture you have no idea about.

The value of photos has become disposable. People take photos, post it online, get some attention, and completely forget about them. The ease and abundance of capturing memories in our lives has reduced our ability to appreciate good ones. Everybody just wants new memories.

The real value of photos is serendipity—accidentally discovering an old photo, reminding you how it felt that time. Going in to that time capsule and remembering the moment.

Keep taking those pictures; not because someone has to “like” it but rather of how it will remind you of that moment when you accidentally discover them.

dev.to

We try to make things scalable when they don’t need to scale. We try to account for use cases that the user will never encounter. We try to make our code efficient, but end up adding too much complexity in order to save meaningless nanoseconds.

I agree with all of these except adding complexities. There are necessary complexities. In our case, we use an in-house framework that enforces conventions and patterns. This makes our codes readable, predictable, and easier to troubleshoot.

I try so hard not to fiddle with my phone while driving—it’s impossible. With the worsening traffic here in the metro, my phone keeps my road rage level down. So I decided to get a car mount so that it would at least take my phone off my hands.

I’ve seen magnetic car mounts before but I never really paid attention. I thought that it would never hold the phone as snug as expandable grips (which I’ve used). So I thought I’ll try a cheap one: Mypro Universal Air Vent Car Mount, it’s P299 in Lazada. This way if it doesn’t work out, at least it wouldn’t sting. It was a game changer.

Mounting. I use a silicone case for my phone so sticking the metal plate at the back of my phone that comes with the mount is required. This was gross. However, it didn’t bothered me as much as I thought it would. Mounting the phone is effortless. The magnet is strong enough that when it’s close, you’d get that satisfying “suck” from the magnet of the mount.

While driving. Once the phone is mounted, it really holds well even in potholes and road humps. I haven’t experienced my phone falling off the mount. There’s also no wobble when interacting with the phone.

Unmounting. You just pull the phone, that’s it. If you worry that the magnet is too strong that it would detach the mount from the air vent, it’s not.

Wireless charging. So all is well, I’m rocking this nice magnetic car mount, then it occured to me: what if there’s version of this that’s also a wireless charger. What if once I mount the phone, it would also start charging. Turns out, there is! There are lots actually. I looked around and found this—Nillkin Magnetic Wireless Charger Air Vent Car Mount Holder Pad For Phone—in Lazada for around P1500. Mounting, unmounting, and stability is pretty much the same as Mypro. I would say that Mypro’s magnet might be a bit stronger than Nillkin’s.

However, its wireless charging isn’t quite there yet. Mounting your phone and expecting the wireless charging to kick-in right away has 60-70% success rate. The reason is the horseshoe-shaped metal plate attached to your phone should be aligned to the four magnets of the mount. With enough repetition, your muscle memory should pick up the correct position. Another important thing to note is wireless charging isn’t as fast as cable charging. Depending on your phone’s power transfer, it could go from 5 watts to 7.5 watts only.

Wireless charger car mounts have clear use case but it needs to be further refined. Someone should make the Apple version of this device (*cough* Kenu *cough*).

 

Circa 2007, “watching something” inside the house would mean watching what’s on the cable TV. Now, it could mean that my two kids are watching a video in their tablet or my wife streaming a video in her phone or me sitting on the couch, enjoying a downloaded movie in a wide-screen TV. Media consumption has changed dramatically over the last decade.

Cable TV has never really worked for me. First, you need a mental schedule of what’s on; it is such a chore. There are hundreds of channels and thousands of shows, it’s impossible to keep track of anything. Stumbling on a show you’re interested in is almost serendipitous. Discovery of a new show is pretty much through flipping channels and hoping that you stumble in something. Second, cable TV is an island. The only way to watch it is through its archaic cable box. It doesn’t play well with its digital cousins (on-demand and streaming videos) which you can enjoy with any screen. But the main reason why I have given up on cable TV is because it’s been in a rot. Shows have become predictable and formulaic.

It took longer than I anticipated (specially here in the Philippines) but for more than a year now, we are officially a cord-cutter. Internet is now our primary source of entertainment.

You can find most, if not all of your content in the internet. You can watch news in Youtube (even live ones!), rent(or buy) movies in iTunes and Google Play, watch TV series in Netflix, iflix, or Fox+. In fact, internet offers all of the cable content plus so much more. For example, if you like short indie films, you can find them free in Viddsee. If you enjoy informative talks, there’s a million in Ted.

Binge watching is awesome.  There is some nostalgia in gathering everyone on the couch and waiting for your favorite show to come up but watching it in your own time is godsend. More importantly, catching up with your shows is no longer a chore.

Streaming videos often have better resolution.  With the proliferation of high-resolution screens, internet videos are first class high def citizen. Most of the streaming content providers have 720p or 1080p HD version. Some even has 4K.

Built-in DVR, intro-skipping, subtitles, and all the little things. Apps get updated all the time to get all these awesome features. Software is continuously improving this new TV. This is the holy grail. We are now starting to talk to our TVs, who knows where would that take us in the next decade.

One of the things I want to do this year is to make our house a little smarter. For the past three years, I have constantly improved (more of fiddled) our home network and computer setup. We have a centralised movie library (yes, on top of Netflix, Fox+, and iTunes) via NAS (Network Attached Storage). Our photos are backed up via iCloud Photo; we view them from any of the big screen in the house. We can also stream any video to any part of the house via Chromecast or Apple TV.

I practically ran out of things to tweak in our home, so that’s why Smart Home is my next project. I want nothing fancy, just functional. I already picked couple of areas to work on.

Smart Lock & Doorbell
Sleuthing around, the Ring Video Doorbell Pro looks like the best in class. It has great camera, good motion detection software, and tons of nifty features. For smart lock, I am looking at August Smart Lock. It looks beautiful and easy to install. Both of these are not available locally so I have to order them abroad.

Smart Lights & Switches
This one’s a little bit tricky. There are so many ready-to-use devices that you can purchase. Phillips Hue for smart lights, Belkin Wemo has so many stand alone smart plugs and sockets. However, what I want is built-in smart switches and plugs. This way, I can make it work with our existing analog appliances with it. Plus, it’s cheaper. For example, controlling your lights via wifi by buying multiple smart lights can get really expensive but installing a smart switch can also get the job done for a lot less. Plus, there’s a bazillion of them in Lazada!

Smart Appliances
This is where it can get crazy. There are some really fancy appliances out there like talking fridge or self-ordering washing machine. For now, all I want is a multi-room audio system. Being able to stream video to any TV is already awesome, this would be a perfect addition. There are so many options in the market right now. Sonos has great wireless speakers, Apple is about to launch Airplay 2 which would natively support multi-room audio, and Google seems to be using Chromecast for this purpose.

If I go with the Sonos speakers, they are available locally but they are really expensive. Apple is about to release Homepod, which will support Airplay 2 but is also expensive. However, since Airplay 2 is a protocol, there will be other, hopefully cheaper, speakers available. Chromecast is the cheapest way to go and it is available locally.

If you’re setting up a your own Smart Home, hit me up. I would love to share and consult ideas.

 

 

2017 has been a transformative year for me. I have become a sucker for self-improvement. So in the spirit of ATP’s Tech Thanksgiving, I am writing this one on the eve of New Year to pay homage to technologies (both software and gadgets) that helped me made some meaningful changes in my life.

Software
Strava
My appetite for cycling went astronomical this year. Last year, I biked 3,740 km—granted I started on the second quarter—but this year I hit 8,464km, more than doubling my stat last year. Using Strava, I have become very objective with all of my cycling regimen.

Apple Photos
I collected almost 21,949 photos and 352 videos to date. That’s a whopping 70.8 GB of memories with family and friends. I have photos as early as 2002 and they are always available with a quick search. Every time I get a new phone, I just key in  my Apple Id and viola! Everything’s there! It is chockfull of niceties that makes you appreciate the memories more like reminding you of photos you took nearby or sending you video of  pictures that belong together.

Messenger
I was skeptical to include this. I’m an iMessage guy. However, it’s impossible to deny how Messenger has become the de facto standard in communicating with friends and family. Everyone is just there, it’s ridiculous.

Office 365
My company has been using Office 365 since day 1 and I have had zero headache. The service is just phenomenal. The uptime is almost 100%. The apps are universal and such a pleasure to use.

Gadgets
iPhone
This is no surprise. I’ve been using an iPhone since 4s and I have every year’s model. I am heavily invested to Apple’s ecosystem: Apple Photos, Apple Music, and MacOS so this is just a natural pick for me. Moreover, iPhone just saves me the hassle of deciding. It’s a rock solid phone that you cannot go wrong with.

Bose QC35
Whenever I want to get into the zone and work, I would put this on and everything would just fade into the background. QC35’s noise-canceling feature is just amazing. The audio quality is also very good. The wireless connection is also a joy, it will spoil you that going back to wired headphones would sound ridiculous.

Macbook 2015
This is 3-year old laptop is my secondary machine and even though it’s not a performer, I still love it. The portability of this laptop is a killer. I can whip it out anywhere and I can pick up where I left off with my main machine.

Corratec CCT Evo
This is my first serious bike. This is also my first road bike. It changed my perception of distance. Long distance cycling used to be daunting but not anymore. This bike pushed me to my next level.

During late 90’s, calling on broadcast radio was huge. You pick up the phone, you dial the number, the DJ picks up your call on-air, and you can share whatever’s on your mind to the listeners. It was a platform. It was a way for anyone to be heard.

A decade and a half later, nobody calls the radio anymore. Facebook’s Newsfeed has become the platform for anyone to be heard. From mundane things like food we eat or occasions we celebrate to even deep-seated emotions, it’s crazy how people voluntarily share intimate details of their lives.

Our desperation to be heard is palpable. In Facebook we found solace.

I’ve been biking like crazy for five months now and it has been a very rewarding experience. I feel a lot better: I lost more than 30 kilos and my body mass index (BMI) has plummeted back to normal—I used to be a type II obese—yikes!

I am using Endomondo as my primary workout app. It records all sorts of data during workout: calories burned, distance travelled, altitude and so much more. At the end of the month, it sends a nice summary of how you did for the entire month. Just for fun, I whipped up some charts<!> plotting my monthly biking statistics.

KM Calories Hours
March 64.10 2,658.00 4.96
April 313.70 13,929.00 19.95
May 670.50 30,577.00 40.32
June 363.20 15,920.00 20.13
July 599.90 27,732.00 37.57
August 475.20 20,509.00 28.68
TOTAL 2,486.60 111,325.00 151.61
Distance Travelled / Month

Calories Burned / Month

Total Hours

I am using Fitbit Aria to monitor my weight loss. Here’s the money graph (extracted from Apple Health app):

I stumbled upon this question in Stackoverflow regarding software development productivity. It’s a hard question to answer. Of course, productivity cannot be measured by the volume of codes a novice developer writes. Nor it can be measured by the too few awesome codes an experienced developer writes. It’s the marriage of both: developer productivity = code quality * code frequency.

In NESV, we strive hard to ensure a productive developer environment. We invest on tools to help developers solve problems. These tools also help us track their work. Additionally, we adapt processes and conventions to create a foundation in solving problems. Lastly, together with tools and processes, we measure certain facets of development; we have our own key performance indicators (KPIs) to observe, track, and ultimately react to possible problems affecting developers’ productivity. Below are some of our KPIs and how we get the data:

Number of resolved (or missed) issues (tickets)
We use Jira for issue tracking religiously. We have a “no ticket, no movement” policy. This is how we can track with certainty the workload of a developer including the status of assigned tasks. That’s why resolved and missed tickets are among the pillars of our KPI. This gives us an overall picture of how a project or the team is performing.

Number of reopened tickets
Another critical data we pull from Jira is reopened tickets. This highlights several areas we want to measure: QA result, comfort level of the developer, severity of the ticket, handling time, blockers of the ticket, etc. This is important in measuring the quality of code that developers write.

Number of code commits
We use Git as our version management tool and Bitbucket as our code repository. We have implemented several checkpoints in Bitbucket to capture important data points. Arguably the most important, is the frequency of code commit. Instead of line of codes, we use code commit as one of the pointers to developer’s productivity. Coupled with code review (more below), it’s a very telling tool to track the amount and quality of work done.

Code review feedbacks (or lack thereof)
Our code review happens after a developer checks in their code to their branch (not to a main branch). Bitbucket has a facility to apply feedback on committed codes. Code reviewers strictly implement our code conventions. We also include code branching and versioning as part of the review.

Number of pull requests
Merging back to a main branch e.g. `developer` or `production` branch requires a pull request and pull request requires explicit approval. The purpose of this is two-fold: we can monitor how much of a developer’s code make it through the production and second, how much of those code that gets through we have to maintain.

 

When posting multiple types of data (image, JSON, querystring, etc) to an API, you can either create multiple requests and process each data type separately or you can roll them into one and post them altogether as a multipart request. For a project that I did recently, I chose the latter. There are several benefits of rolling everything into a single call:

  • Fewer server trips
  • Less code to tie each data together
  • More elegant

The second item is the most compelling reason to me. I needed to upload multiple files and save a corresponding metadata for each file. Uploading the files and posting the data separately would’ve been messy since I needed to write persistence code just to relate each file to its corresponding data. MultipartFormDataContent is just the thing I needed. Collecting the data is very straightforward. Reading it from the ASP.NET side can be tricky, however.

Sending from the Client 

Collecting the data is basically just adding them as part of MultipartFormDataContent‘s collection. It can have several types as long as they are derived from the HttpContent class.

            //Create a multi-part content
            var multiData = new MultipartFormDataContent();
 
            //Add all the attachments
            files.ToList()
                 .ForEach(file => {
                     var fileContent = new StreamContent(file.Open(FileMode.Open));
                     fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") {
                                                                 Name       = "files",
                                                                 FileName   = "\"" + file.Name + "\""
                                                             }; 
                     fileContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
                     multiData.Add(fileContent, "files");
                 });
 
            //Add the non-file data and serialise them
            multiData.Add(SerializeContent(disputes), "data");
 
            //Post altogether. Viola!
            return await Post<IEnumerable>("url/end-point", multiData);

Receiving the Data

As I mentioned, receiving the data can be a little tricky. There are several approach. One of them is to read the Request stream and parse it. I tried this and ended up following a series of requirements that would ultimately force me to upgrade multiple packages in my solution. It’s not an option so I kept poking.

Fortunately, ASP.NET makes it easy to access all content of a request. For example, posted files are exposed via Request.Files. It will also be automatically binded if you add an IEnumerable<HttpPostedFileBase> parameter to your handler. Additionally, you can access other data via Request.Form and Request.QueryString collections. In my case, the JSON data is accessible via the Request.Form[“data”] key.

        [HttpPost]
        public async Task ReceiveData(IEnumerable<HttpPostedFileBase> files) {
            try {
                return await Task.Run(() => {
                    //Get the files
                    files.ToList().ForEach(file => {
 
                        file.SaveAs(Path.Combine(savePath, filename));
                    });
 
                    //Get the data (which in the form of JSON)
                    var disputes = JsonConvert.DeserializeObject<IEnumerable>(Request.Form["data"]).ToList();
                    return Json(markedDisputes);
                });
            } catch (Exception exception) {
                return JsonError(exception.Message);
            }
        }

Lastly, I am trying to find a way through model binding so that data is automatically received as a parameter of the handler. I’ll do it in a separate post.