• 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

    Handling text encoding in Perl

    Marco Pessotto

    By Marco Pessotto
    April 29, 2025

    Columns of Egyptian hieroglyphics carved into stone

    When we are dealing with legacy applications, it’s very possible that the code we are looking at does not deal with Unicode characters, instead assuming all text is ASCII. This will cause a myriad of glitches and visual errors.

    In 2025, after more than 30 years since Unicode was born, how is that possible that old applications still survive while ignoring or working around the whole issue?

    Well, if your audience is mainly English speaking, it’s possible that you just experience glitches sometimes, with some characters like typographical quotes, non breaking spaces, etc. which are not really mission-critical. If, on the contrary, you need to deal every day with diacritics or even different languages (say, Italian and Slovenian), your application simply won’t survive without a good understanding of encoding.

    In this article we are going to focus on Perl, but other languages face the same problems.

    Back to the bytes

    As we know, machines work with numbers and bytes. A string of text is made of bytes, and each of them is 8 bits (each bit is a 0 or a 1). So one byte allows 256 possible combinations of bits.

    Plain ASCII is made by 128 characters (7 bits), so it fits …


    perl unicode

    How to Migrate from Struts 2 to Struts 6

    Kürşat Kutlu Aydemir

    By Kürşat Kutlu Aydemir
    April 17, 2025

    Upgrade your walls. Close up of a paint roller balanced on top of a blue paint can, at a 45 degree angle from the camera.

    With the introduction of Struts 6, developers are provided enhanced features, security improvements, and modern practices that align with contemporary Java development. If you’re currently using Struts 2, migrating to Struts 6 is a worthwhile endeavor that can future-proof your application.

    Also, since Struts 2.5.x reached its end of life, there won’t be any security updates for this version. This guide will walk you through the key differences between Struts 2 and Struts 6, including some significant changes in Struts 6 with practical configuration and code examples.

    Getting Ready for Migration from Struts 2 to Struts 6

    Starting from Struts 6.0.0 the framework requires Java 8 at minimum. So, if you are running a Struts 2.x environment on an old version of Java, it needs to be upgraded to Java 8 at least. Check out the Struts 6.0.0 version notes for a list of changes.

    Config and Code Changes

    Servlet API Dependency

    Struts 6.0.0 requires Servlet API 3.1 or newer and won’t work with the older versions. The Maven dependency that you can use for this is below:

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api …

    java apache-struts frameworks migration

    Testing Ansible Automation with Molecule

    Kannan Ponnusamy

    By Kannan Ponnusamy
    March 28, 2025

    Photo of an open hard drive, with the data reading arm extended over the disc.
    Photo by Patrick Lindenberg

    1. Why Test with Molecule?

    Molecule is a test framework for Ansible roles. It supports testing with multiple instances, operating systems and distributions, virtualization providers, test frameworks, and testing scenarios.

    Molecule is useful because it increases confidence in your automation and ensures roles are reliable. It catches issues early in the development cycle, reducing production problems. It also ensures consistency across different environments and platforms.

    2. Install Prerequisites

    Make sure you have Python >= 3.6 and pip installed. Then install Ansible and Molecule using pip:

    pip install ansible
    pip install molecule
    

    Molecule uses the delegated driver by default. Other drivers can be installed separately from PyPI, most of them being included in the molecule-plugins package. We are going to use the Docker driver, so let’s install that by running:

    pip install "molecule[docker]"
    

    3. Ansible Monorepo Structure

    We use the Ansible monorepo structure. This means our playbooks, variables, scripts, roles, plugins, inventory scripts, and configuration all reside and are version controlled together in the same repository.

    Here is …


    sysadmin linux integration cloud devops

    Getting Output from jps with NRPE

    A mellow river winds across the image, with verdant trees reaching over the water.

    One of the tools our hosting team uses for server and site monitoring is Icinga (which is based on Nagios). When monitoring host resources, one of the tools we use is Nagios Remote Plugin Executor or NRPE.

    We encountered an issue when executing NRPE: though NRPE runs on the server being monitored, it wasn’t giving the same output as a script which was executed on the server itself. The NRPE-related call should have no issues be executed on the target server, as it is declared in the sudoers file (commonly /etc/sudoers). In this post, I will explain how to get the output from jps (Java Virtual Machine Process Status Tool), which can only be executed as root.

    Getting process information with jps

    Let’s say we have a “hello world” program named Hello.java. How do we get the process’s state from Icinga’s head server?

    First, let’s compile and run the program.

    public class Hello {
        public static void main(String[] args) {
            System.out.println("Hello, World!");
    
            try {
                Thread.sleep(3000);  // Sleep for 3 seconds
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    java …

    linux monitoring nagios java

    Introducing the End Point AI Portal for Our Customers

    Benjamin Goldstein

    By Benjamin Goldstein
    March 12, 2025

    A low angle view of a gridded ceiling, leading to a large stained glass cylindrical top, which is lined with multicolored stained glass in a highly varied arrangement.

    Today, End Point is opening up the End Point AI Portal for our customers to use. As a technology consulting company that gets in the trenches with our customers to integrate, manage, and support the information technology they need to operate and transform their businesses, we believe this is a great service for us to provide.

    We are offering our AI Portal to our customers at no charge. The price is certainly right, so we think our customers are very much going to want to use it. 🙂

    What’s in the Portal

    End Point’s AI Portal provides an interface to interact with many different LLM AI chatbot services all in one place. It even gives users the ability to simultaneously submit queries and instructions to multiple LLMs and see their responses side by side.

    Our Portal is a customized implementation of the Open WebUI AI interface and connects via APIs to various AI services. Because of this architecture, our analysis has shown that unless there is ongoing high-intensity usage, the cost per user will be very low — much lower than a typical end-user subscription to a single LLM provider. In the future we may implement an accounting system for the portal to pass usage costs onto our …


    artificial-intelligence company

    How to Analyze Application Logs and Extract Actionable Insights

    Edgar Mlowe

    By Edgar Mlowe
    February 28, 2025

    A side-on view of a large pile of wooden logs

    Photo by Timo C. Dinger on Unsplash

    Logs often accumulate unnoticed—until something breaks. Then, they suddenly become vital tools for diagnosing issues. By combining just a few command-line techniques, you can quickly spot recurring problems, identify suspicious activity, and strengthen your application’s defenses.

    Below is a sample error log we’ll reference in the examples:

    [2025-01-01 12:34:56] [client 192.168.1.1:12345] PHP Notice: Undefined variable $foo in /var/www/html/index.php on line 45 | referer: http://example.com/index.php
    [2025-01-01 12:34:56] [client 192.168.1.1:12345] PHP Notice: Undefined variable $foo in /var/www/html/index.php on line 45 | referer: http://example.com/index.php
    [2025-01-01 12:34:57] [client 192.168.1.1:12345] PHP Notice: Undefined variable $foo in /var/www/html/index.php on line 45 | referer: http://example.com/index.php
    [2025-01-01 12:35:00] [client 10.0.0.2:6789] PHP Warning: Division by zero in /var/www/html/script.php on line 23 | referer: http://example.com/script.php
    [2025-01-01 13:35:01] [client 10.0.0.2:6789] PHP Warning: Division by zero in /var/www/html/script.php on line 23 | referer: http://example.com/script.php
    [2025-01-01 13:36:10] …

    logging automation monitoring security php shell

    Resolving iptables Update Issues on Rocky Linux and Other RHEL-Based Systems

    Jeffry Johar

    By Jeffry Johar
    February 28, 2025

    Two elevators on either side of a hall, with orange construction plastic stretched out in front of the entrances. At the end of a hall is a window looking out over a city.

    If you are on iptables-legacy systems, you may encounter errors when attempting to perform an OS update involving iptables-libs-1.8.10-11.el9_5.x86_64 on Rocky Linux or other Red Hat-based operating systems:

    Error:
     Problem: cannot install both iptables-libs-1.8.10-11.el9_5.x86_64 from baseos and iptables-libs-1.8.10-4.el9_4.x86_64 from @System
      - package iptables-legacy-1.8.10-4.1.el9.x86_64 from @System requires (iptables-libs(x86-64) = 1.8.10-4.el9 or iptables-libs(x86-64) = 1.8.10-4.el9_4), but none of the providers can be installed
      - cannot install the best update candidate for package iptables-libs-1.8.10-4.el9_4.x86_64
      - cannot install the best update candidate for package iptables-legacy-1.8.10-4.1.el9.x86_64
    (try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
    

    Cause of the error

    The latest package, iptables-libs-1.8.10-11.el9_5.x86_64, is incompatible with iptables-legacy. To proceed with the update, you must remove iptables-legacy and transition to iptables-nft, which uses the nf_tables kernel API while maintaining …


    redhat iptables sysadmin

    The Case of the Mistimed Python Script

    Josh Williams

    By Josh Williams
    February 19, 2025

    A low-angle view of an old European church clock tower. The square tower with rounded corners is ornamented with gothic styling, and topped with a golden eagle.

    “Time isn’t working right!” said a message from a client on their internal chat.

    My efforts to catch a spot as an extra in a Doctor Who episode have thus far been fruitless, so I jumped in to reply to that message. Just in case.

    The follow-up had more detail: “I’ve set something to run at 7:30 AM every morning, but it runs at 2:30 AM instead. Time zone is right. I can’t figure out what’s wrong.”

    Dang, the screen debut will have to wait. But at least this is a mystery I can solve.

    The hypothesis offered up was that a Python script was getting the time wrong, but it turns out Python doesn’t do the scheduling here. Rather, it’s just plain ol’ cron, so all eyes are on that now.

    First, the obvious: It’s running early, not late. So it’s not a situation where it’s running for about 5 hours and appearing later than desired. I mean, it could possibly be taking 19 hours to run and finishing at 2:30 the next day, but at a glance it’s clearly not taking that long. It’s just running at the wrong time.

    Let’s double check what cron is actually set to do.

    30 7 * * * python3 /home/data/process/something.py
    

    Alright. So clearly cron is set for 7:30 but running that at the wrong time. That’s …


    sysadmin linux tools
    Page 1 of 219 • Next page