• Home

  • Custom Ecommerce
  • Application Development
  • Database Consulting
  • Cloud Hosting
  • Systems Integration
  • Legacy Business Systems
  • Security & Compliance
  • GIS

  • Expertise

  • About Us
  • Our Team
  • Clients
  • Blog
  • Careers

  • VisionPort

  • Contact
  • Our Blog

    Ongoing observations by End Point Dev people

    Testing user-defined functions with pgTAP

    Todor “Theo” Dimov

    By Todor “Theo” Dimov
    September 25, 2023

    An overhead shot of a market full of thousands of colorful DVD cases. Several people peruse the wares in an aisle

    For a great introduction to the pgTAP protocol, please read over my colleague Josh Tolley’s article, using pgTAP to automate database testing. Also check out Edgar Mlowe’s article on how to set up pgTAP for writing PostgreSQL database unit tests.

    As a protocol, pgTAP provides a great list of functions and commands to easily and clearly test all aspects of a database. As I’ve been tasked with more implementations of unit tests for user-defined functions, I thought it helpful to share some useful methods.

    First we’ll go over a few basic pgTAP functions that are useful in testing the existence of functions and procedures. Then we’ll use the PostgreSQL port of the Sakila sample database for MySQL, called Pagila. We’ll construct two functions and go over a single test case. Using basic Postgres tools, I’ll walk through a few methods of calling and testing our functions. Finally, we’ll go over a more concise way of testing all cases for said functions.

    Feel free to work alongside this article to hopefully leave with a comfortable idea of how to construct unit test files for your database.

    Functions:

    For this first example, remember to have the pgTAP extension in your schema …


    sql postgres database testing

    Ubuntu Touch on a Galaxy S7 & a Pixel 3a

    Seth Jensen

    By Seth Jensen
    August 29, 2023

    A dark print on very old paper shows an armored knight on a horse, surrounded completely by swirling floral patterns. In a few places the pattern evolves into a flower or what appears to be a curved, long bird head.

    I have a shoebox in my closet I call my “phone graveyard.” At times I’ve had five or more old phones in there, in various states of decay—some have fully shattered screens, some broken USB ports, etc. But some still have quite usable hardware, their main drawback being how slowly they run modern versions of Android or iOS, and the lack of support for modern features.

    It has always troubled me to have such incredible devices, with way more computing power than, say, a Raspberry Pi, gather dust because of software limitations. Even if I don’t use an old phone for daily use any more, what if I could use it as a DNS server (like a Pi-hole), or as a camera or media player?

    When I heard about Ubuntu Touch, it seemed like the perfect OS to bring back some long-term functionality to these old devices. Originally created by Canonical, it was soon abandoned but revived by UBports, who started community development in 2015. They actively maintain the OS for around 80 devices, including two I have in my phone graveyard: a Samsung Galaxy S7 and a Google Pixel 3a.

    Installation

    Installing Ubuntu Touch is quite straightforward; the UBports installer does most of the heavy …


    linux mobile ubuntu

    Upgrade Vue to TypeScript

    Nicholas Piano

    By Nicholas Piano
    August 28, 2023

    An expansive sky filled with faintly red clouds extends above a field turned red from the sunset. A layer of trees separates the field from the sky

    It’s important to keep your code up to date so that time can be dedicated to improving an application instead of version-related mishaps. This is especially true for web development as the landscape changes so quickly.

    I recently upgraded a Vue project to exclusively use Vuex. This was a great opportunity to also upgrade the project from JavaScript to TypeScript. This article will cover the steps I took.

    Some of the changes can be difficult to understand if you are not familiar with TypeScript. I recommend reading the TypeScript Handbook to become more familiar.

    Several features of Vue, originally written in JavaScript without types, are hard to convert to TypeScript. These include this.$parent, this.$refs, and this.$emit. These allow you to access the parent component, child components, and emit events respectively. We will make changes to these features along with adding types to the global state handler provided by Vuex.Store.

    Installation

    Before you begin, make sure the necessary dependencies are installed:

    ~$ vue add typescript
    

    Also make sure that Vuex is installed:

    ~$ yarn add vuex@next
    

    Convert your component files

    There are several changes that must be made to …


    vue typescript

    Synchronous work in asynchronous work environments

    Vincent Martin

    By Vincent Martin
    August 15, 2023

    A light green tree blows in strong winds, against a grey stormy sky.

    Co-authored by Trevor Slocum.

    As a team that spans the globe, asynchronous communication is a necessity for us. While we do use email, of course, we use internal text chat rooms for communication more frequently. These asynchronous tools are useful to have around, but they may not be the best fit for sharing an idea or some other information with others. Sometimes we need to speak with someone in a voice or video conference, or even share our screen and work together to solve a problem. In this article we will share some of the things we have learned while working in these situations.

    Solving problems together

    When pair programming, we solve problems together. This usually takes the form of one person sharing their screen while the other watches and provides guidance and feedback, but it also takes other forms which we will refer to later. Having someone critique our work in real time as we try to solve complex problems can be stressful. This is an entirely natural reaction to the situation, and happens to everyone who engages in pair programming and other collaborative work.

    If you find yourself feeling this way, our advice is to take a brief pause and talk it out with your …


    remote-work tips vscode

    How to use dependent dropdowns in Microsoft Excel

    Nicholas Piano

    By Nicholas Piano
    August 2, 2023

    Red leaves extend on thin branches towards the center of the image. Each is a different distance from the camera, so one, with white blossoms, is in focus, while some are blurred a little, and others so much that they are almost unrecognizable red splotches. There is a vaguely spherical distortion from the lens which gives a convex look to the image.

    Dropdowns are a way to constrain the input of a cell to a set of values. This can be useful for data validation, or for making a spreadsheet more user-friendly. In this article, we will look at how to create two types of dropdowns in Microsoft Excel: the basic dropdown and the dependent dropdown.

    Using this, we can expand to more complex dropdown dependencies and spreadsheet generation, including validation using the Axlsx gem in Ruby.

    The basic dropdown

    A dropdown takes its data from a list of values specified by a range. This could be a range of cells, or a named range. To create a dropdown, first select the cell you want to add the dropdown to. Then, go to the Data tab, and click on Data Validation.

    The data validation dialog. The leftmost section is selected, “Settings”. Under the single heading, “Validation criteria”, there are several options. “Ignore blank” and “In-cell drop-down” are checked, “Allow:” shows a dropdown set to “List”, and “Source” is empty. A “Data” dropdown is greyed out.
    Data Validation Menu

    Specify the range, e.g. =Sheet1!$A$1:$A$5. Then, select the “List” option under “Allow”. You can also specify an input message and error message, which will be displayed when the user selects the cell. Note that the range can come from another worksheet.

    An Excel column reading “R” has a cell reading “James”. A dropdown is open, showing options Harry, Tommy, George, John, Roger, James (highlighted), and Adrian. Cells in column S hold this list of names.
    Basic Range

    And that’s it! You can now constrain the input of the cell to the values in the range.

    The dependent dropdown

    Things get a little more complicated when we want to …


    tips ruby

    Text manipulation using regex replace in VS Code

    Kevin Quaranta Jr.

    By Kevin Quaranta Jr.
    July 31, 2023

    A blank white wall and ceiling, with regular rays of light casting striped shadows at an acute angle. As the light hits the ceiling, the angle changes and the strips of light appear vertical.

    Regular expressions are incredibly powerful tools that can make life easier for any developer. Being able to quickly and precisely parse text with the syntax you specify has kept regexes relevant from the ’80s through to today.

    Visual Studio Code is an excellent modern editor and development environment. According to the Stack Overflow Developer Survey of 2022, it was far and away the most popular IDE for both professional developers and those learning to code—more than twice as popular as the second-place choice.

    Like any great editor, VS Code supports using regexes to find and replace text. In this article, we’ll go over how to use this powerful regex mode.

    To demonstrate, we’ll extract code values from a JavaScript object so that we can query a SQL database for content that contains one of the code values. We can use standard SQL query WHERE clause multiple matching:

    WHERE code IN ('code1', 'code2', 'code3')
    

    Or we can add the values to a regex alternation group separated by pipes (vertical bars) that we can use as a string match:

    WHERE code ~ '^(?:code1|code2|code3)$'
    

    Each has different query plans and performance impacts in SQL, but for …


    regex vscode

    Achieving Healthcare Data Interoperability

    Jarrett Smolarkiewicz

    By Jarrett Smolarkiewicz
    July 28, 2023

    An impressionist watercolor scene of two red-roofed farm houses with a tree-lined path leading forward on the left side of the image. The brushstrokes are very loose.

    (Co-authored by Jon Jensen.)

    Background

    For many years, healthcare providers, public health experts, and software developers have been hard at work on standards and methods for interconnecting systems to share vast and ever-expanding patient and lab data.

    In the late 1980s the non-profit organization Health Level Seven International released the HL7 data standard. That was updated many times up to the year 2007 with HL7 v2.5.1 which is still widely used today.

    New healthcare data standards have emerged, including HL7 v3, the Consolidated Clinical Document Architecture (C-CDA), the Fast Healthcare Interoperability Resource (FHIR, pronounced “fire”), and more. These are not yet as broadly adopted as HL7 v2.5.1.

    Under the Health Insurance Portability and Accountability Act of 1996 (HIPAA), most of this data is classified as PII (personally identifiable information) and/or PHI (personal health information) and must be kept secure and protected at all times, so that it will not be accessed without proper authorization or patient consent.

    The data dilemma

    Healthcare data systems now routinely communicate in many ways, but there are sometimes incompatibilities when patient …


    casepointer epitrax emsa

    SSH and Old Servers

    Josh Ausborne

    By Josh Ausborne
    July 21, 2023

    A photo of a whole bivalve seashell lying open and flat on the sandy ground.

    We recently updated one of our backup servers from Oracle Linux 8 to Oracle Linux 9, a free rebuild of Red Hat Enterprise Linux 9, also known as RHEL 9. As with any newer OS, there are bound to be unexpected little differences which crop up and which need to be handled.

    In the case of our backup server, we found that it could no longer SSH to older servers, which includes a couple running CentOS 5 (yes, there really are a few of those out in the wild), some CentOS 6, and one Debian 8. We saw similar connection problems when we first went from CentOS 7 to Oracle Linux 8, and we addressed the issues by creating a Host entry for the servers in our ~/.ssh/config file.

    Here is an example of of the entry that we used previously:

    Host old-server-1 old-server-2 old-server-3
      User root
      Hostname %h.example.com
      KexAlgorithms +diffie-hellman-group-exchange-sha1
    

    This worked fine for a couple of years until we upgraded from Oracle Linux 8 to 9. At this point we started to see a different problem when trying to connect.

    Unable to negotiate with <nnn.nnn.nnn.nnn> port 22: no matching host key type found. Their
    offer: ssh-rsa,ssh-dss
    

    Troubleshooting

    One of the good troubleshooting …


    linux ssh sysadmin
    Previous page • Page 5 of 217 • Next page