During the course of the day I encounter lots of challenges, some of which take minutes to solve and others that take much longer. My goal for this section is to keep track of these challenges and their solutions. I will turn the longer ones into articles, while the shorter ones will stay as blog entries. You can expect topics to range from very specific programming challenges to broader topics like life.
Below is a list of the recent blog entries. You can also browse the blog by using the tags on the right side, or if you know what you are looking for then you can use the search box at the top right.
I couldn’t resist the Tesla fever and finally took the plunge a few months ago. Since then, I have been absorbing the Tesla ecosystem and observing everything that it has to offer. I have been especially intrigued by the Autosteer (part of “Autopilot”) functionality because that’s one of the game-changing features that Tesla is offering. Here are a few odd behaviors of the system that I have observed so far. Note that most of the Autopilot features are currently in Beta, so I am always careful when using it, and I am also expecting that Tesla will work out these kinks as it continues to improve the system.
As a “prosumer” I have liked the Ubiquiti equipment because it’s not too expensive and at the same time provides advanced functionality that I like to tinker with. After switching to an EdgeRouter, I recently swapped one of my two access points with the UniFi nanoHD access point. The EdgeRouter works independently, but the UniFi HD provides a lot more options when controlled using the UniFi Controller. For this, I had a Raspberry Pi 3 lying around so instead of getting the UniFi Cloud Key, I decided to set up the controller on the Raspberry Pi.
I work from home most of the days and generally keep my office door closed to keep distractions to a minimum. I also tend to be on video and audio calls quite a bit. When I am talking on the calls, then it is easy for my family to know not to come in, but when I am listening, then they obviously cannot tell. There have been times when I am on video calls and have had a family member walk in, not knowing. Those can be awkward at times.
Now, what does this all have to do with the Raspberry Pi? In addition to the Raspberry Pi, I also had a 2.8″ Adafruit PiTFT lying around that I did not end up using in another project. I was planning on having the Raspberry Pi running all day for the UniFi Controller anyway, so why not give it another purpose? So, I decided to create a small digital sign that I could control remotely and put it outside my door for people to know what I was up to. Overkill? Why, yes it is, but it was also fun. Actually, the real overkill would have been this solution running on a rechargeable battery! I called this the “Entriway.”
I am generally excited to try out new software. This was the case when Apple announced the public betas for macOS Mojave recently. I was excited to try out the public beta, but I didn’t want to mess with my primary setup. Unfortunately, my older spare MacBook Pro is no longer supported by Mojave so my only option was using my primary MacBook Pro, which was a little scary. After looking around for a little bit, I learned that I could install Mojave on a new partition without messing much with the existing install.
I have lately been experimenting with Kubernetes and containers. As I was playing around with a few configurations I had the need for exploring a container’s contents interactively. Kubernetes’s dashboard has functionality to get into a container, but it assumes that you are using the bash shell. Unfortunately, any Apline Linux-based container images do not have bash installed so we have to resort to other options to get access.
Alpine uses the busybox provided ash shell (which basically a symbolic link to /bin/busybox). To get to the prompt you have to run.
I have recently been looking at using Ansible for managing some Windows-based web servers. Fortunately, I was able to get the authentication configured properly, but as soon as I got to downloading PHP, the Ansible win_get_url module started behaving oddly. It downloaded some other files as I would have expected, but it would download the PHP distributable as a 1KB file.
I recently needed to do some informal HealthDecision API concurrent session testing. I decided to try out the Apache benchmarking tool (ab). Given that I needed something quick, I started a new HealthDecision session in the browser and used Chrome Developer Tools’ copy as cUrl functionality to get the headers and the POST data. This obviously worked on the command line, but each request was taking close to six seconds when I used ab!
It didn’t make much sense at first sight because the exact same request was less than half a second every time. I tried running with output turned on (-v 4) and could see that it was waiting after it received the response from the server. After some more troubleshooting, I finally realized that it was the keep-alive header causing ab to wait for the connection to close!
Lesson learned, pay very close attention to the headers.
I switched to a trackball earlier this year because my wrist was getting tired after a few hours of using Microsoft’s Sculpt Ergonomic Mouse. After some search, it seemed that my only good option for a trackball was the predecessor to this trackball, the Logitech M570. I was a little disappointed in the build quality and the scroll wheel of the M570, so I was happy when Logitech announced the MX ERGO and pre-ordered it.
I used the M570 since July until the start of October when the MX ERGO arrived. Even though the MX ERGO cost almost twice what the M570 is going for, I am glad to see that the build quality is way better. The angle on this trackball also feels much more comfortable than the M570, which laid a lot flatter. I have now gotten used to the steeper angle on this and M570 now feels odd and a little “off.” Given how much time I spend using the trackball, I can easily justify the cost for myself.
I was looking forward to the inclusion of Bluetooth, but I was also a little concerned that it might not work as seamlessly as the proprietary Logitech adapter. After using it for a few weeks now, I am glad to report that it works just as well as the Logitech adapter and that now I don’t have to worry about connecting/disconnecting yet another USB device.
With Logitech’s new “Logitech Options” software for macOS, I have noticed that the forward/back buttons seem more reliable than the M570 buttons and that they now seem to work with more applications than their previous software/drivers. I have noticed that their Logitech Options Daemon software keeps using 1-2% CPU majority of the time. I am contemplating trying to use this mouse without the Logitech software, but I haven’t done it yet.
An additional benefit with Logitech’s new Options software is that I no longer have to run an additional application (called Scroll Reverser) to reverse the scroll direction. Their Options software has an “option” to reverse the scroll direction.
One thing that I am curious to see pan out over the next few months is the battery life. I did not use the M570 long enough, but I have heard that it easily lasts longer than a year. Logitech advertises the MX ERGO’s battery to last four months. My trackball shows about 2/3 battery still left to go after almost two-and-a-half weeks. Given that it’s sitting on the desk with easy access to plenty of micro-USB charging cables, I guess recharging this won’t be too big of a deal.
Overall, I am happy with my purchase and would recommend it.
Lately, I have been working on centralizing the logs from all of our servers and application layers. I decided to use Fluentd instead of Logstash because it claims better reliability without jumping through hoops (e.g. adding a kafka layer).
Anyways, working on the configuration, I noticed that it doesn’t have any default configs for PHP errors. My quick google search didn’t reveal anything either. So, I decided to write the regex myself. Here is what I ended up with. This also accounts for multiline stack traces.
#[03-Sep-2017 22:51:06 UTC] PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 65536 bytes) in Unknown on line 0
format_firstline /^\[(?<time>[^\]]*)\] (?<level>.+?):/
format1 /^\[(?<time>[^\]]*)\] (?<level>.+?):\s+(?<message>.*)/
time_format %d-%b-%Y %H:%M:%S %Z
read_from_head true # Read the file from the start.