Phone Calls & Voicemails

Hi Josh, this is X from Y, give me a call back at [number], again my number is [number].

A voicemail from today

That example above was actually in my voicemail this morning. See, I let all numbers not in my phone go to voicemail. I’m not going to stop what I’m doing to play 20 questions with a telemarketer or deal with wrong numbers. If you reach my voicemail and I’m not the person you are trying to get ahold of you will find out then. If I am, then leave a good message.

“This is X from Y, call me back at [phone number], again my number is [phone number]” is not good enough.

“This is X from Y, call me back at [phone number], again my number is [phone number]” is not good enough. I want to know why you are calling me, even if it’s a generic reason like “a billing issue” or “to discuss how we can make our product better”. I stop what I’m doing to answer phone calls for two categories of people, family, and clients. If family calls and it’s not important I let them know I’ll call them back. If you are not family or a client and leave a message that gives me no reason, you will not hear from me.

Photo by Luis Villasmil on Unsplash

Today’s caller’s name doesn’t come up in a Google search with the phone number or company name. It came into my Google Voice number which is the number on file at the company he mentioned, but it’s also a company that people pretend to be with to scam people. I guess if it’s important he’ll call back & leave a better message or send me an email since it’s on file. Worst case scenario I spend an hour updating my Google Voice number with services.

Local businesses get this, a business I order from multiple times per year can leave me a message saying “Hi Josh, this is X at Y. The Z you ordered is in & ready for pickup.” or “Hi Josh, this is X at Y, can you give me a call at […], there’s an issue with your order.” If they can do that then big businesses can too.

If I could find local businesses like that for every service I need I would use them exclusively.

Article Header Photo by Icons8 team on Unsplash

Everything Failed

Several years ago I setup a clients web app for his training courses, it was a Django app and I was quite proud of it. In addition to his online training course he also wanted a mobile version, so an API was created and the mobile app pulls from that API.

Everything has worked fine with the occasional update required for Heroku to keep the web dyno running and to support new versions of iOS. Since the last app update also included changing over to Swift nothing except screenshots have been needed. Today everything failed.

I slept in today, most Saturdays I am up before 8am but today I had nothing to do. I finally got up around 10:30, I was awake before then thanks to emails popping in about Labor Day sales causing my phone to buzz across the nightstand, but still not ready to do anything prior to then. Just before 11am my client emails me, his app isn’t updating and the web training isn’t coming up.

Shit.

I logged into Heroku figuring the dyno needed a reboot for some reason. Hit reboot and nothing. Checked the logs and the dyno was failing to reboot. Why the hell wasn’t it rebooting? Googled the error code and discovered the reboot was taking longer than 75 seconds and timing out. Nothing has changed on this app in years, why is it slow to reboot?

Checked the Heroku status page, right after more reboot attempts and finally getting a reply saying reboots were disabled. The last thing I wanted to see was on the screen “Widespread Platform Issues”. I should have checked there first but I assumed it was something I was doing causing the server to not reboot. It had a stack update so I thought maybe the previous stack had hit its EOL and was requiring me to update before it would restart. Installing the Heroku CLI and trying to push a build to finish the stack update took a long time. It was actually the slow build that made me finally think to check the status page.

I started trying to pull down a copy of the database so I could attempt to spin up another copy on DigitalOcean. The database export was garbled. I’m not sure if it was because of the platform issues or if the format Heroku uses differs from the standard Postgres style. I started the process of setting up the DO server thinking better to get the app launched and then figure out the data than to eventually get the data and not be able to fix things immediately.

Shortly before 4pm when I had just finished getting the server setup I checked the Heroku status.

Our engineers have resolved the issue causing dynos to be unable to start. We are still monitoring for other impact, but the platform appears to have stabilized. We have re-enabled dyno restarts, including automatic cycling. Dynos that crashed or were otherwise restarted during this incident will automatically restart within the next few hours, or can be manually restarted with the following CLI command…

Back to the Heroku dashboard, restart dyno, and everything was back. Six hours after the issue started it was fixed and during that time I was unable to solve the issue even temporarily.

Last week this same client had a similar issue with his other app. In that case it runs on his web server and the issue was caused by a third-party migrating him to a new server and not bothering to ask any questions prior to the move. Last December he emailed me because he had someone doing WordPress work for him and wanted to make sure that nothing happened to the apps. I emailed the developer detailed information on what needed to be avoided to ensure the app did not go down.

They moved the site, setup a new database, and didn’t copy over the tables for the application. They then tried ramming in a new copy of CodeIgniter because the PHP version was moving to 7.x from 5.x and it was throwing errors. The worst part, I got the email about the issue on Sunday morning, emailed the developer and didn’t hear anything until Tuesday. I finally got everything working Tuesday afternoon after getting the access I wanted.

What now?

Seeing as both applications went down within a week of each other I need to make changes. The first change is I’m setting up database backups to my computer and my server on a daily basis. I’m building a new shared admin for the apps that can be switched over to on the next Apple update.

The apps are going to check the server for config files which will contain file URLs, last modified dates, and a md5 checksum of the files. If the last modified date and the checksum differ from the version on the app it will fetch down the updated files. If they have not or it fails to contact the server/fetch the files it will continue using the existing ones.

The admin, web training, and all app related data are moving over to a DigitalOcean droplet that routinely takes snapshots and utilizes a floating IP. If the server has issues a new one can be spun up from the latest snapshot and the floating IP can be pointed to it. No DNS worries and no 6 hour or multi-day downtime’s.

With these changes should DigitalOcean completely fail I can setup a new server somewhere else with the latest database backup, clone the repository, and update the config files to point the apps to the new server in minutes.

Zero Value

It’s interesting the world we live in, 12 years ago when I joined Twitter it seemed like a great place to bounce ideas off people, ask questions, and see what people are working on. Now it’s a highly politicized platform I can’t use without seeing some politician, celebrity, or influencer spouting their talking point or opinion, even if I don’t follow them. The news is the same way, I remember when the news presented the news in a balanced way.

I avoid discussing politics. I have my beliefs and everyone else has theirs. I have the intelligence to not post about politics because I never know where I am going to end up work wise. I can work with the most outspoken conservative or liberal as long as their political beliefs remain theirs and they don’t try to push them on me.

Twitter has lost its value to me, I’ll be deleting my existing account and leaving up a blank account to retain my username in case things ever go back to the way they used to be. I doubt they will, but you never know.

Sometimes Things Aren’t As Easy As They Seem

Azure has been around for nine years and I never had a reason to look into it, until August 2017. That month I was approached by a client I had done some BigCommerce theme updates for requesting a quote on taking over a product configurator project for their website. I looked through what they currently had and went over the RFP to see what their goals were and how to best accomplish them.

Everything looked straight-forward but there were two problems. Infor, the third-party they use for their internal configurator, has a web service that is Windows-based, uses SOAP for communication and doesn’t return every option at once. Infor instead expects a step-by-step configuration where the user selects a model and then has to select every option one at a time. One model might have a specific feature that another doesn’t so the steps change based on selections. This posed some problems as the client wanted everything presented on one screen but I was certain it could be done as the existing in development configurator had managed to do just that.


Making Friends with an Old Nemesis

The bigger problem was that I could not connect to the service using PHP. I looked all over the internet for a way to connect to Infor via PHP. It’s SOAP-based and PHP supports SOAP, yet all of my connection attempts failed. I would eventually discover that Infor expects specific headers and bindings for access. This left me to figure out what I could possibly do to achieve the client’s goals. Revisiting the existing code I was resigned to that fact that I would have to use C# to communicate with the service. The client wanted this on their website, not a subdomain and their website is running on WordPress.

The solution to this problem was to have WordPress only render a Vue.js single-page application that used AJAX to communicate with Azure. On the Azure side of things, I made use of their Functions solution which allowed me to write C# code to interact with Infor and return a response in JSON to Vue.js. This was a complicated and interesting experience but eventually, everything ended working exactly as the client wanted. There was a lot of trial and error as well as a lot of me sitting in front of a Windows computer writing and testing C# files.

Despite being thrown onto multiple ASP/.NET projects at a former job from 2007 to 2010, I actually like C# as a language and would use it in the future if I need to. Functions overall is a great service and much easier to get started with than Amazon’s Lambda offering, which I’ve used before but has so many more services tied into its usage than Azure.


Look at that Vue!

This project was also my first experience with Vue.js which I like a lot but had some issues getting everything working as I wanted it to. I attribute that to the Infor data though, if it had a nice clean REST-based API to work with I don’t think I would have struggled with certain features. The Single File Components method of building a Vue.js app was a nice experience. It made updating components easier, though I didn’t take advantage of the built-in CSS support, instead opting to build my CSS file from multiple SCSS files so I could take advantage of variables, mixins, and my normal build scripts.


This post’s featured photo is by Dominik Schröder on Unsplash


To make life easier for anyone who has to integrate with Infor’s Configure Price Quote product I’ve made available the Integration Guide PDF I have.

New Hobby

For the longest time, web development was my hobby, then it became my career and even though it now took up more of my time than ever before I still tried to find time to just build things I wanted for fun. I took advantage of free time to try and learn new frameworks or languages that I could use for future projects.

For the last two years, I’ve been working for the same client and while I’ve had the opportunity to learn some new things such as Vue.js, Microsoft Azure, and that Infor doesn’t make web services that I like to use. I just haven’t been able to do anything web related outside of the work because I needed a break from the computer. I picked up one new hobby that will hopefully lead to a few more related hobbies, but they are outdoor hobbies and in bad weather (too hot or cold, rain, snow) I don’t like participating in them. I need a decidedly indoor hobby that can be done regardless of what the weather is.

I’ve been thinking about what I want to do and while I attempted woodworking and still do it, it is also affected by the weather since I have a tiny less than one car garage and need to move tools into the driveway to use some of them. I need something that can be done inside or at least mostly inside and doesn’t require a large investment in tools or equipment. I think I’ve found the answer.

Leather Crafting

I’ve bought the bare essentials plus a few things that might not be essential at the moment but saves on shipping later. I’m in $280.42 so far with all of the tools and materials to make three dog collars. If this doesn’t work out 95% of the tools I can offload on eBay. If it turns out to be a fun hobby I can invest in larger pieces of leather and $30 more in tools to cut strips. The same tools needed for dog collars are used for belts so once I figure out dog collars I can make myself some belts. I have a hard time finding decent quality belts that I like so being able to make my own and know the quality.

I started considering leather crafting because it looks like a fun year-round hobby, the thing that pushed me towards it now is a bad purchase. I bought a leather item from a seller who touted their products as exceptionally high quality and found that it didn’t meet my expectation of quality. For an individual who has been doing this for many years, I expected quality as claimed, not splotches of stain on the back of the item.