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.

If you’re using Bitbucket together with Jira, you can easily resolve a ticket in Jira by adding a #resolve in your commit comment in Bitbucket. You can resolve multiple tickets, too; just add each ticket number per line with a #resolve right next to it, for example:

JCSW-561 #resolve
JCSW-560 #resolve
JCSW-559 #resolve
JCSW-558 #resolve
JCSW-557 #resolve
JCSW-549 #resolve

You’re welcome.

Scott Guthrie:

As part of this commitment I am pleased to announce today that Microsoft has signed an agreement to acquire Xamarin, a leading platform provider for mobile app development.

I expected this the moment Microsoft open-sourced .NET back in November 2014. I am actually surprised that it took them more than a year to do this. I think it’s a great move to expedite the adoption of .NET outside Windows. I suspect that Xamarin will be merged into the Visual Studio brand to avoid confusion amongst developers.

GMA Network will be covering the first leg of PiliPinas 2016 Debates today in Cagayan De Oro:

PiliPinas Debates 2016 is a debate show developed by the Commission on Elections (COMELEC). This will be the first COMELEC organized debate show in preparation for the May 9, 2016 general elections.

You can live stream the debate from Youtube. If you have a Chromecast, you can stream it directly to your television using the Google Cast plugin in Google Chrome. If you have an Apple TV, you can use Safari to Airplay the live stream to your television.

Alternatively, you can use the Youtube app which supports both Airplay and Google Cast.

If you’re a technology news junkie like me, you probably keep a list of tech news sources. Here’s my personal list of local technology news sources (independent blogs, local news outlet) that I have been collecting through the years.

ABS-CBN News | Gadgets and tech Site
GMA News Online / SciTech / Technology, Gadgets and Gaming RSS Site
Inquirer Technology^ RSS Site
mb.com.ph | Philippine News >> Technology RSS Site
MobileTechPinoy RSS Site
Newsbytes Philippines RSS Site
Rappler: Technology RSS Site
TechInAsia RSS Site
Techolo – Philippine Technology Outlook Blog RSS Site
Webgeek Philippines RSS Site
YugaTech | Philippines, Technology & Reviews RSS Site

I have included the RSS links for the old fogeys like me. I still enjoy my news in my favorite feed reader and coffee. Happy reading.