Our Blog

Ongoing observations by End Point people

Fix for cdparanoia segmentation fault

By Jon Jensen
August 27, 2019

Compact disc close-up Photo by Alberto Cabrera, cropped, CC BY 2.0

It had been a while since I last needed to rip a CD into audio files (and compress them), but the need recently arose. This particular disc was a language learning supplement to a book, and a CD was a reasonable way to distribute that.

(Even though audio file downloads and streaming have become a far more common way to distribute audio than physical CDs, electronic formats don’t preserve our same rights to resell, lend, and make backups. But that is a topic for another blog post!)

I was ripping the CD with abcde (A Better CD Encoder), a text-based CD ripping, tagging, and compressing front-end I have used often in the past. Unexpectedly I got an error, as shown in this terminal output:

Executing customizable pre-read function... done.
Getting CD track info... Querying the CD for audio tracks...
Grabbing entire CD - tracks:  01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
abcde: attempting to resume from /home/user/Music/abcde.2a0e162a..
Grabbing track 28: Track 28...
cdparanoia III release 10.2 (September 11, 2008)

Ripping from sector  131363 (track 28 [0:00.00])
          to sector  148524 (track 28 [3:48.61])

outputting to /home/user/Music/abcde.2a0e162a/track28.wav

 (== PROGRESS == [ ! !!--!V V   ! ! !   >       | 143137 00 ] == :-) 0 ==)   /bin/abcde: line 3560: 21658 Segmentation fault      (core dumped) nice $READNICE $CDROMREADER -"$CDPARANOIACDROMBUS" "$CDROM" "${READTRACKNUMS:-$UTRACKNUM}" "$FILEARG" 1>&2
[ERROR] abcde: The following commands failed to run:
readtrack-28: cdparanoia  returned code 139
Finished. Not cleaning /home/user/Music/abcde.2a0e162a.

The command that abcde was running when it died is:

cdparanoia -d /dev/cdrom 28 /home/user/Music/abcde.2a0e162a/track28.wav

Getting a segmentation fault suggests that the software has a bug, not necessarily that there is anything wrong with the disc, drive, or USB interface...

tips open-source audio

The Dollars and Sense of Hiring Software Consultants

By Elizabeth Garrett Christensen
August 16, 2019

Interview Photo by Nik MacMillan on Unsplash

I’m often asked by family and friends about End Point’s market and how software consulting fits into the business landscape and I thought I’d write up some thoughts for the general public in how hiring a consultant is actually the smartest thing to do for your business and it makes a ton of sense financially.

Let’s talk some math about hiring an in-house developer:

  • According to Glassdoor, the average software developer salary is around $50,000–$120,000. Let’s say $85,000 per year. You typically pay for health insurance, other benefits and overhead expenses, so let’s just round the total cost of hiring one person to $110,000 per year (I think that’s actually pretty conservative).

  • You’d probably need to hire two people to support anything essential to your business, since having a single developer is risky (illness/​vacation/​employment change, etc.).

  • Your total cost of getting two developers in-house is around ~$220,000 per year

Hiring your own developers Software consulting agency
Senior developers
Diverse skillset ?
Protection from staffing changes
Flexible budget
Staff up and down easily

Consulting Instead of Hiring

  • Spending less: You could spend $40,000–$50,000 a year in consulting and get excellent coverage, including new feature development and support for your project. Some of our customers even spend substantially less than that.

  • Skillset: Were you able to hire two people that know all of your software stack? Can they work on your CRM/​inventory system and do your website? Can they troubleshoot issues with your Windows Active Directory setup? Are they senior developers with a decade of experience? Or did you have to hire junior developers who need to train up on your project?

When you’re working with an End Point team, you’re able to get expert advice on the parts of your system that...

jobs company training

How to set up a local development environment for WordPress from scratch

By Kevin Campusano
August 7, 2019


I recently got pulled into a project for a client who wanted to have a new WordPress website developed for them. I started by setting up a development environment with the niceties that I’m used to from my other application development work. That is, a development server, interactive debugging, linting, and a good editor.

Another thing that I wanted was not to have to deal with LAMP or WAMP or XAMPP or any of that. I wanted a clean, from scratch installation where I knew and controlled everything that was there. I’ve got nothing against those packages, but I think that, by setting up everything manually, I’d be able to better learn the technology as I would know exactly how everything is set up under the hood. The shortcuts could come later.

Luckily for me, there aren’t many pieces when it comes to setting up a basic, running development environment for WordPress. You only need three things: 1. MySQL, 2. PHP, and 3. WordPress itself. I also wanted a few other goodies and we’ll get there.

Let’s go through the steps that I took to set all of this up:

1. Set up PHP

In Ubuntu, installing PHP is easy enough. Just run the following command:

sudo apt-get install php

After that’s done, run php -v to validate that it was successfully installed. It should result in something like this:

PHP 7.2.19-0ubuntu0.18.04.1 (cli) (built: Jun  4 2019 14:48:12) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.19-0ubuntu0.18.04.1, Copyright (c) 1999-2018, by Zend Technologies

There’s one particular PHP extension that we’re going to need. Let’s install it with:

sudo apt-get install php-mysql

The php-mysql extension is necessary for our PHP installation to interact with MySQL. That’s all that’s needed to run WordPress as far as PHP is concerned.

2. Set up MySQL

WordPress uses MySQL for all of its data storage concerns. So, let’s install it. Again, in Ubuntu, installing and setting up MySQL...

wordpress development mysql php ubuntu visual-studio-code xdebug composer

A Moon Landing and the Education of Our Children

By Jonathan Perlin
August 6, 2019

Cosmosphere Museum

As Liquid Galaxy flows from city to city, a big museum in small-town Kansas welcomes its newest exhibit to the collection. Amidst authentic NASA artifacts and real remnants of the space program, an array of seven screens glows in the shadow of the full-size replica of the lunar module that put man on the moon. In the wake of the 50th anniversary of the monumental mission, Liquid Galaxy arrives right on time to educate and awe patrons of all ages.

A family exploring the Liquid Galaxy

“Jim and I had a great time experimenting with it...and while we were doing so, we talked with three different guests—one couple and two singles—who said how much they appreciated us adding it. What Jim and I appreciated was the variety of content that we can see teachers using when they have classes here.” —Mimi Meredith, VP of Development, Cosmosphere Museum, Hutchinson, Kansas

In the initial stages of installation, passersby cocked their heads in curiosity as large displays were lifted onto their mounts and the form of Liquid Galaxy emerged. The scene dramatically changed as the screens came to life and images of Earth and the Moon flew across the screen to the delight of children and adults alike. Witnessing the joy and wonder of these museum guests was by far the most rewarding aspect of participating in the installation. But it also got me thinking about the education of our children. To see kids get excited about science, space travel, and engineering was refreshing and ultimately a wonderment to witness. Just as we had Liquid Galaxy up and running a crew of space camp cadets rounded the corner and we smiled as their eyes widened.

Immediately a barrage of questions: What is it? Where did it come from? How can you use it? Can we play games on it? But the biggest question I heard among the volley was: What can we learn from it?

This question not only overwhelmed me with a sense of joy, but also instilled a feeling of hope for our planet’s future. Inquisitive by nature, children remain...


Campendium v2019: A Summary of Recent Updates

By Steph Skardal
August 5, 2019

This year has brought a handful of exciting changes for Campendium, one of End Point’s long-time clients, by yours truly. Created by campers for campers, Campendium has thousands of listings of places to camp, from swanky RV parks to free remote destinations, vetted by a team of full-time travelers and reviewed by over 200,000 members. I thought I would take some time to summarize these recent updates.

Maps and Clustering

Campendium map clustering of campground locations

Campendium uses Mapbox for map rendering to display campgrounds and locations throughout North America. One of the new features added this year was clustering of campground locations, where campgrounds are grouped together and presented in a “cluster” with a size relative to how many campgrounds are in the cluster.

If a user is searching for campgrounds in a broad location, they can see where campgrounds might be more densely grouped by location. Once a user zooms in zoom in a couple of clicks, the campgrounds are no longer clustered and individual campgrounds locations can be seen. While working on this update, we spent a good amount of our time tweaking and troubleshooting the optimal clustering behavior to provide the most benefit to those searching for a campground. Mapbox GL JS works in parallel with ReactJS, and runs with a Ruby on Rails back-end.

Campendium map non-clustering of campground locations after zooming in

Advanced Filtering

Campendium advanced filtering

Another exciting was the introduction of advanced filtering in the search interface, presented in combination with map display. Users can filter campgrounds by category (e.g. Public Land, RV Parking, Parking, Dump Station), filter by price (with a slider), hookups, campground policy (e.g. age or pet restrictions), discounts, recreation, and facilities. All of this search filtering is driven by Sunspot, a Ruby on Rails gem for working with the popular Solr search engine. Results can be sorted by user provided reviews, price or distance from a specific GPS location. Here, much care was given to provide the best user interface for presenting this valuable functionality...

rails solr sunspot react maps javascript user-interface ruby clients

Prepare for .NET Core 3 and .NET 5

By Juan Pablo Ventoso
August 3, 2019

Prepare for .NET 5 Photo by Caspar Camille Rubin on Unsplash, edited by Juan Pablo Ventoso


It’s been a while now since .NET Core is out there: It was released back in June 2016 and it kept growing since then. The main advantages when comparing with .NET Framework is that .NET Core is free, open-source and cross-platform. It also has several performance improvements that gains up to 600% increase for some particular functions like converting elements to a string, or more than 200% for some LINQ queries, and a general performance boost in application startup.

But it also has drawbacks: Some third party libraries are still not fully supported, so while they can still be used, the compiled results will only be portable to Windows. Also, .NET Core 2.2 (the latest release to date) doesn’t yet have support for Windows Presentation Foundation (WPF) or Windows Forms applications... But it looks like this is going to change soon.

Next stop: .NET Core 3

In the 2019 Build Conference that took place in May, .NET Core 3 was announced: It’s expected to be released in November this year, and it will finally include support for Windows desktop development (WPF, UWP and Windows Forms). It will also include Entity Framework 6, since most existing Windows Forms and WPF applications use that framework to access data.

.NET Core 3 features and tools

.NET Core 3 will also include support for IoT (Internet-of-things) applications, aiming for internet-enabled devices like smart locks or glasses, and will allow AI development through ML.NET (an open-source machine learning framework built for .NET). For those who can’t wait and want to try it out before its release, previews are available to download.

Game changer: .NET 5

In the same conference, on May 7, Microsoft also announced that they are planning to release a new platform for building applications targetting all devices and operative systems in november 2020: .NET 5. And while it will be based on .NET Core, the word “core” will be removed because Microsoft is...


Ruby Gem Spotlight: DRG

By Patrick Lewis
July 31, 2019

Pins Photo by Ioan Sameli, used under CC BY-SA 2.0, cropped from original.

The DRG gem is “a Ruby utility to help automate dependency management using Bundler.” I use DRG to manage gem versions in all of my Rails projects and have found it to have several useful features for managing project dependencies in Gemfiles.

Pinning with 'drg:pin'

DRG works by adding a variety of Rake tasks for updating your Gemfile. I like to start with rake drg:pin:minor to pin a project’s Gemfile to the approximate minor version of the gems currently installed in a project’s Gemfile.lock. This fills in missing version information where needed, and updates the Gemfile to better reflect the state of the currently-installed gems.

Here’s an example of a Gemfile from a freshly generated Rails project before and after running rake drg:pin:minor:


gem 'bootsnap', '>= 1.1.0', require: false
gem 'drg'
gem 'puma', '~> 3.11'
gem 'rails', '~> 5.2.3'
gem 'sass-rails', '~> 5.0'
gem 'sqlite3'
gem 'uglifier', '>= 1.3.0'

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]


gem 'bootsnap', '~> 1.4', require: false
gem 'drg', '~> 1.5'
gem 'puma', '~> 3.12'
gem 'rails', '~> 5.2'
gem 'sass-rails', '~> 5.0'
gem 'sqlite3', '~> 1.4'
gem 'uglifier', '~> 4.1'

group :development, :test do
  gem 'byebug', '~> 11.0', platforms: [:mri, :mingw, :x64_mingw]

Unpinning with 'drg:unpin'

My preferred method for upgrading all of my project’s gems in bulk is to first unpin the entire Gemfile with bin/rails drg:unpin, run bundle update, and then re-pin the Gemfile with bin/rails drg:pin:minor.

After drg:unpin:

gem 'bootsnap', require: false
gem 'drg'
gem 'puma'
gem 'rails'
gem 'sass-rails'
gem 'sqlite3'
gem 'uglifier'

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]

After bundle update and drg:pin:minor:

gem 'bootsnap', '~> 1.4', require: false
gem 'drg', '~> 1.5'
gem 'puma', '~> 4.0'
gem 'rails', '~> 5.2'
gem 'sass-rails...


A tribute to Kyle Simpson’s JavaScript book series

By Árpád Lajos
July 24, 2019

You Don’t Know JS Photo by othree, used under CC BY 2.0

Inspired by the Ruby Fight Club, a group of us have been reading Kyle Simpson’s You Don’t Know JS series. These books are a great source of inspiration and available for free. I meet weekly with our small group to discuss chapters from these books. Each time we have a presenter who walks us through the chapter that we all read beforehand.

During these sessions we have learned a lot about JavaScript, but also about preparing presentations. The increasing quality level of the meetings was noticable each week. I think we all owe a large thanks to Kyle Simpson. In this article I will focus on the book “You Don’t Know JS: ES6 and Beyond”.

Past, present and future

ECMAScript (ES for short) was versioned with a small number up until now, like 5. ES1 and ES2 were not widely known or implemented. ES3 was used by Internet Exporer 6–8 and Android 2.x. ES4 never came out. ES5 came out in 2009. ES5.1 came out in 2011 and was widely used by Firefox, Chrome, Opera, Safari, etc.

Now, version names will be in the format ES, but it might change to a per-feature basis.

In the past JavaScript versions were based on major releases of ES. However, due to the importance of the language, it is too much of a hassle to wait till 20 features are ready and release them together. It is much better to make finished features available as soon as they are ready. As a result, we know what functionalities we’re gaining.

It’s good to reflect on just how important the language is. JavaScript is the lingua franca for web browsers. Web developers need to be aware of JavaScript to its slightest details. While the markup of a webpage is HTML and its design is CSS, the client-side programming is done via JavaScript, more or less in a standard manner.

Since JavaScript is almost completely standard for browsers, programmers would have a much easier life if they were writing JavaScript when coding on server-side as well. There is a mental leap when one works both...

javascript books programming
Previous page • Page 2 of 182 • Next page

Popular Tags


Search our blog