IBM MQ Fix Pack 9.1.0.12 Released

IBM has just released Fix Pack 9.1.0.12 for IBM MQ V9.1 LTS:
https://www.ibm.com/support/pages/downloading-ibm-mq-91012

Regards,
Roger Lacroix
Capitalware Inc.

Fix Packs for MQ, IBM i (OS/400), IBM MQ, IBM MQ Appliance, Linux, Unix, Windows Comments Off on IBM MQ Fix Pack 9.1.0.12 Released

Time to Move to Windows 11

My current ASUS ZenBook Pro 15.6” laptop and desktop PC still work reasonable well but they cannot be upgraded to Windows 11 Pro. Sad but true (I only purchased them back in 2019).

Picking out a new desktop PC is easy because I simply tell Alan at Mega Computers what I want but for the laptop, it is much harder to get everything I want (and at a reasonable price).

I wanted to get another ASUS ZenBook Pro 15.6” laptop, the current specs were fine, nothing killer, but the reviews of the current model were not all that glowing. I decided to look at other ASUS models (and yes, I prefer ASUS laptops because I have never had any issues with them!).

After a bunch of searches and several days contemplating it, I decided to go with a monster laptop: ASUS ROG Zephyrus G15 15.6″ Gaming Laptop. Its a little more than I wanted to pay but I did get beast of a machine!!

ASUS ROG Zephyrus G15 15.6
Here are the ASUS ROG Zephyrus G15 15.6″ specs:
– 15.6″ 2560×1440
– AMD Ryzen 9 6900HS
– 32GB RAM DDR5
– 1TB SSD
– NVIDIA GeForce RTX 3070 Ti
– HDMI, USB-C, USB 3.1 ports & LAN port
– Wireless Wi-Fi 6E(802.11ax)
– Windows 11 Pro

As I said earlier, ordering a desktop PC is really easy. Last week, I sent an email to Alan at Mega Computers with the following specs:
– Intel Core i9-12900K 16-Core 5.2GHz
– ASUS Prime Z690-A motherboard
– ADATA XPG Lancer 64GB of DDR5 RAM
– Kingston Fury Rengeade M.2 PCIe 4.0 500GB SSD
– Kingston Fury Rengeade M.2 PCIe 4.0 2TB SSD
– LG WH16NS40 16x Blu-Ray Writer & 16x DVD Writer SATA
– Cougar MX330-G Glass Window Gaming Mid Tower Case
– No video card
– Windows 11 Pro
Cougar MX330-G Glass Window Gaming Mid Tower Case
I’m not a gamer, so I don’t need a fancy video card. I can use the onboard graphics that comes with the ASUS motherboard.

I don’t need new monitors because a year ago I replaced my 2 Samsung SA450 monitors with 2 new ASUS ProArt 27″ PA278QV monitors. They each have a resolution of 2560×1440 and the view/display are just gorgeous!!

And I don’t need a new keyboard either. Last winter I bought a new Redragon K551 MITRA Backlit Mechanical Keyboard with Blue Switches. It is old school style ‘clicky’ keyboard. I love it.

Now comes the pain of installing everything on both the desktop PC and the laptop. That’s the part I’m not looking forward to. 🙁 So, many applications/programs to install (on 2 machines). Plus now I have to learn where things were moved to under Windows 11 (vs Windows 10).

Regards,
Roger Lacroix
Capitalware Inc.

Capitalware, Windows Comments Off on Time to Move to Windows 11

IBM MQ Fix Pack 9.3.0.1 Released

IBM has just released Fix Pack 9.3.0.1 for IBM MQ V9.3 LTS:
https://www.ibm.com/support/pages/downloading-ibm-mq-9301

Regards,
Roger Lacroix
Capitalware Inc.

Fix Packs for MQ, IBM i (OS/400), IBM MQ, IBM MQ Appliance, Linux, Unix, Windows Comments Off on IBM MQ Fix Pack 9.3.0.1 Released

Java 19 Released

Oracle has just released Java 19.

Java Platform, Standard Edition (Java SE) lets you develop and deploy Java applications on desktops and servers, as well as in today’s demanding embedded environments. Java offers the rich user interface, performance, versatility, portability, and security that today’s applications require.

Regards,
Roger Lacroix
Capitalware Inc.

IBM i (OS/400), Java, JMS, Linux, macOS (Mac OS X), Programming, Raspberry Pi, Unix, Windows, z/OS Comments Off on Java 19 Released

IBM has announced IBM MQ for z/OS 9.3

IBM has just announced IBM MQ for z/OS 9.3:
https://www.ibm.com/common/ssi/ShowDoc.wss?docURL=/common/ssi/rep_ca/1/897/ENUS222-131/index.html

Or in a PDF file:
https://www.ibm.com/downloads/cas/US-ENUS222-131-CA/name/US-ENUS222-131-CA.PDF

IBM MQ for z/OS 9.3 became available for electronic download on July, 15, 2022.

Regards,
Roger Lacroix
Capitalware Inc.

IBM MQ, z/OS Comments Off on IBM has announced IBM MQ for z/OS 9.3

IBM MQ Fix Pack 9.2.0.6 Released

IBM has just released Fix Pack 9.2.0.6 for IBM MQ V9.2 LTS:
https://www.ibm.com/support/pages/downloading-ibm-mq-9206

Regards,
Roger Lacroix
Capitalware Inc.

Fix Packs for MQ, IBM i (OS/400), IBM MQ, IBM MQ Appliance, Linux, Unix, Windows Comments Off on IBM MQ Fix Pack 9.2.0.6 Released

Java/PCF Program to Delete an IBM MQ Channel

A couple of days ago, I posted a Java/PCF program that would create a IBM MQ channel. So, if you require creating a channel via Java/PCF then you probably will need to delete a channel via Java/PCF.

If you are used to deleting an IBM MQ channel using runmqsc command then the following simple Java/PCF program will delete a IBM MQ channel based on the following runmqsc command:

DELETE CHL('TEST.CHL')

You can download the source code from here.

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;

import com.ibm.mq.MQException;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.constants.MQConstants;
import com.ibm.mq.headers.MQDataException;
import com.ibm.mq.headers.pcf.PCFException;
import com.ibm.mq.headers.pcf.PCFMessage;
import com.ibm.mq.headers.pcf.PCFMessageAgent;

/**
 * Program Name
 *  MQDeleteChannel01
 *
 * Description
 *  This java class issues a PCF "delete channel" request message to delete a channel.
 *
 *  This PCF code is equivalent to issuing the runmqsc command of:
 *     DELETE CHL('TEST.CHL')
 *
 * Sample Command Line Parameters
 *  -m MQA1 -z Channel_Name_to_be_deleted -h 127.0.0.1 -p 1414 -c TEST.CHL -u UserID -x Password
 *
 * @author Roger Lacroix
 */
public class MQDeleteChannel01
{
   private static final SimpleDateFormat  LOGGER_TIMESTAMP = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");

   private Hashtable<String,String> params;
   private Hashtable<String,Object> mqht;

   public MQDeleteChannel01()
   {
      super();
      params = new Hashtable<String,String>();
      mqht = new Hashtable<String,Object>();
   }

   /**
    * Make sure the required parameters are present.
    * @return true/false
    */
   private boolean allParamsPresent()
   {
      boolean b = params.containsKey("-h") && params.containsKey("-p") &&
                  params.containsKey("-c") && params.containsKey("-m") &&
                  params.containsKey("-z") &&
                  params.containsKey("-u") && params.containsKey("-x");
      if (b)
      {
         try
         {
            Integer.parseInt((String) params.get("-p"));
         }
         catch (NumberFormatException e)
         {
            b = false;
         }
      }

      return b;
   }

   /**
    * Extract the command-line parameters and initialize the MQ HashTable.
    * @param args
    * @throws IllegalArgumentException
    */
   private void init(String[] args) throws IllegalArgumentException
   {
      int port = 1414;
      if (args.length > 0 && (args.length % 2) == 0)
      {
         for (int i = 0; i < args.length; i += 2)
         {
            params.put(args[i], args[i + 1]);
         }
      }
      else
      {
         throw new IllegalArgumentException();
      }

      if (allParamsPresent())
      {
         try
         {
            port = Integer.parseInt((String) params.get("-p"));
         }
         catch (NumberFormatException e)
         {
            port = 1414;
         }

         mqht.put(CMQC.CHANNEL_PROPERTY, params.get("-c"));
         mqht.put(CMQC.HOST_NAME_PROPERTY, params.get("-h"));
         mqht.put(CMQC.PORT_PROPERTY, new Integer(port));
         mqht.put(CMQC.USER_ID_PROPERTY, params.get("-u"));
         mqht.put(CMQC.PASSWORD_PROPERTY, params.get("-x"));

         // I don't want to see MQ exceptions at the console.
         MQException.log = null;
      }
      else
      {
         throw new IllegalArgumentException();
      }
   }

   /**
    * Handle connecting to the queue manager, issuing PCF command then
    * disconnect from the queue manager.
    */
   private void doPCF()
   {
      String qMgrName = (String) params.get("-m");
      String chlName  = (String) params.get("-z");

      MQQueueManager qMgr = null;
      PCFMessageAgent agent = null;
      PCFMessage   request = null;

      try
      {
         qMgr = new MQQueueManager(qMgrName, mqht);
         logger("successfully connected to "+ qMgrName);

         agent = new PCFMessageAgent(qMgr);
         logger("successfully created agent");

         // https://www.ibm.com/docs/en/ibm-mq/latest?topic=formats-mqcmd-delete-channel-delete-channel

         request = new PCFMessage(MQConstants.MQCMD_DELETE_CHANNEL);

         // Specify the channel name to be deleted.
         request.addParameter(MQConstants.MQCACH_CHANNEL_NAME, chlName);

         agent.send(request);

         logger("successfully deleted channel: " + chlName);
      }
      catch (PCFException pcfe)
      {
         if (pcfe.reasonCode == MQConstants.MQRC_UNKNOWN_OBJECT_NAME)
            logger("Error: The channel '" + chlName+ "' does not exists on the queue manager '" + qMgrName + "'.");
         else
            logger("CC=" +pcfe.completionCode +  " [" + MQConstants.lookupCompCode(pcfe.completionCode) + "] : RC=" + pcfe.reasonCode + " ["+MQConstants.lookupReasonCode(pcfe.reasonCode)+"]");
      }
      catch (MQException e)
      {
         logger("CC=" +e.completionCode +  " [" + MQConstants.lookupCompCode(e.completionCode) + "] : RC=" + e.reasonCode + " ["+MQConstants.lookupReasonCode(e.reasonCode)+"]");
      }
      catch (IOException e)
      {
         logger("IOException:" +e.getLocalizedMessage());
      }
      catch (MQDataException e)
      {
         logger("MQDataException:" +e.getLocalizedMessage());
      }
      catch (Exception e)
      {
         logger("Exception:" +e.getLocalizedMessage());
      }
      finally
      {
         try
         {
            if (agent != null)
            {
               agent.disconnect();
               logger("disconnected from agent");
            }
         }
         catch (MQDataException e)
         {
            logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
         }

         try
         {
            if (qMgr != null)
            {
               qMgr.disconnect();
               logger("disconnected from "+ qMgrName);
            }
         }
         catch (MQException e)
         {
            logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
         }
      }
   }

   /**
    * A simple logger method
    * @param data
    */
   public static void logger(String data)
   {
      String className = Thread.currentThread().getStackTrace()[2].getClassName();

      // Remove the package info.
      if ( (className != null) && (className.lastIndexOf('.') != -1) )
         className = className.substring(className.lastIndexOf('.')+1);

      System.out.println(LOGGER_TIMESTAMP.format(new Date())+" "+className+": "+Thread.currentThread().getStackTrace()[2].getMethodName()+": "+data);
   }

   public static void main(String[] args)
   {
      MQDeleteChannel01 mqcq = new MQDeleteChannel01();

      try
      {
         mqcq.init(args);
         mqcq.doPCF();
      }
      catch (IllegalArgumentException e)
      {
         logger("Usage: java MQDeleteChannel01 -m QueueManagerName -z Channel_Name_to_be_deleted -h host -p port -c channel -u UserID -x Password");
         System.exit(1);
      }

      System.exit(0);
   }
}

Regards,
Roger Lacroix
Capitalware Inc.

HPE NonStop, IBM i (OS/400), IBM MQ, IBM MQ Appliance, Java, Linux, macOS (Mac OS X), Open Source, PCF, Programming, Raspberry Pi, Unix, Windows, z/OS Comments Off on Java/PCF Program to Delete an IBM MQ Channel

FreeBSD v13.1 Released

The FreeBSD Release Engineering Team has just released FreeBSD v13.1.
https://www.freebsd.org/releases/13.1R/announce.html

FreeBSD is an advanced operating system for modern server, desktop, and embedded computer platforms. FreeBSD’s code base has undergone over thirty years of continuous development, improvement, and optimization. It is developed and maintained by a large team of individuals. FreeBSD provides advanced networking, impressive security features, and world class performance and is used by some of the world’s busiest web sites and most pervasive embedded networking and storage devices.

Regards,
Roger Lacroix
Capitalware Inc.

Open Source, Operating Systems Comments Off on FreeBSD v13.1 Released

Java/PCF Program to Create an IBM MQ SVRCONN Channel

A couple of weeks ago, I posted a Java/PCF Program to Create an IBM MQ Queue. So, today I thought I would create a Java/PCF program to create an IBM MQ SVRCONN channel

If you are used to creating an IBM MQ channel using runmqsc command then the following simple Java/PCF program will create a IBM MQ channel based on the following runmqsc command:

DEFINE CHL('ABC.CHL') MAXMSGL(10485760) SCYEXIT('C:\Capitalware\MQCCI\mqcci(CCI)') SCYDATA('mqcci.ini')

Note: For the channel security exit, I used Capitalware’s MQ Channel Connection Inspector (MQCCI) product. MQCCI is a solution that allows a company to track and/or audit what information a client application or remote queue manager is exchanging with the queue manager when a connection is made.

You can download the source code from here.

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;

import com.ibm.mq.MQException;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.constants.MQConstants;
import com.ibm.mq.headers.MQDataException;
import com.ibm.mq.headers.pcf.PCFException;
import com.ibm.mq.headers.pcf.PCFMessage;
import com.ibm.mq.headers.pcf.PCFMessageAgent;

/**
 * Program Name
 *  MQCreateChannel01
 *
 * Description
 *  This java class issues a PCF "create channel" request message that will create a SVRCONN channel 
 *  specifying max message length & channel security exit.  
 *  For the channel security exit, I used Capitalware's MQ Channel Connection Inspector (MQCCI) product.
 *  MQCCI is a solution that allows a company to track and/or audit what information a client application 
 *  or remote queue manager is exchanging with the queue manager when a connection is made. 
 *  
 *  This PCF code is equivalent to issuing the runmqsc command of:
 *     DEFINE CHL('ABC.CHL') MAXMSGL(10485760) SCYEXIT('C:\Capitalware\MQCCI\mqcci(CCI)') SCYDATA('mqcci.ini')
 *
 * Sample Command Line Parameters
 *  -m MQA1 -z TEST.CHL -h 127.0.0.1 -p 1414 -c TEST.CHL -u UserID -x Password
 *
 * @author Roger Lacroix
 */
public class MQCreateChannel01
{
   private static final SimpleDateFormat  LOGGER_TIMESTAMP = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");

   private Hashtable<String,String> params;
   private Hashtable<String,Object> mqht;

   public MQCreateChannel01()
   {
      super();
      params = new Hashtable<String,String>();
      mqht = new Hashtable<String,Object>();
   }

   /**
    * Make sure the required parameters are present.
    * @return true/false
    */
   private boolean allParamsPresent()
   {
      boolean b = params.containsKey("-h") && params.containsKey("-p") &&
                  params.containsKey("-c") && params.containsKey("-m") &&
                  params.containsKey("-z") &&
                  params.containsKey("-u") && params.containsKey("-x");
      if (b)
      {
         try
         {
            Integer.parseInt((String) params.get("-p"));
         }
         catch (NumberFormatException e)
         {
            b = false;
         }
      }

      return b;
   }

   /**
    * Extract the command-line parameters and initialize the MQ HashTable.
    * @param args
    * @throws IllegalArgumentException
    */
   private void init(String[] args) throws IllegalArgumentException
   {
      int port = 1414;
      if (args.length > 0 && (args.length % 2) == 0)
      {
         for (int i = 0; i < args.length; i += 2)
         {
            params.put(args[i], args[i + 1]);
         }
      }
      else
      {
         throw new IllegalArgumentException();
      }

      if (allParamsPresent())
      {
         try
         {
            port = Integer.parseInt((String) params.get("-p"));
         }
         catch (NumberFormatException e)
         {
            port = 1414;
         }
         
         mqht.put(CMQC.CHANNEL_PROPERTY, params.get("-c"));
         mqht.put(CMQC.HOST_NAME_PROPERTY, params.get("-h"));
         mqht.put(CMQC.PORT_PROPERTY, new Integer(port));
         mqht.put(CMQC.USER_ID_PROPERTY, params.get("-u"));
         mqht.put(CMQC.PASSWORD_PROPERTY, params.get("-x"));

         // I don't want to see MQ exceptions at the console.
         MQException.log = null;
      }
      else
      {
         throw new IllegalArgumentException();
      }
   }
   
   /**
    * Handle connecting to the queue manager, issuing PCF command then 
    * disconnect from the queue manager. 
    */
   private void doPCF()
   {
      String qMgrName = (String) params.get("-m");
      String chlName    = (String) params.get("-z");

      MQQueueManager qMgr = null;
      PCFMessageAgent agent = null;
      PCFMessage   request = null;
      
      try
      {
         qMgr = new MQQueueManager(qMgrName, mqht);
         logger("successfully connected to "+ qMgrName);

         agent = new PCFMessageAgent(qMgr);
         logger("successfully created agent");
      
         // https://www.ibm.com/docs/en/ibm-mq/latest?topic=formats-change-copy-create-channel
         
         request = new PCFMessage(MQConstants.MQCMD_CREATE_CHANNEL);

         // Specify the channel name to be created.
         request.addParameter(MQConstants.MQCACH_CHANNEL_NAME, chlName);
         
         // Add parameter to set channel type to be a SVRCONN channel
         request.addParameter(MQConstants.MQIACH_CHANNEL_TYPE, MQConstants.MQCHT_SVRCONN);
         
         // Add parameter to set the max message length to be 10MB
         request.addParameter(MQConstants.MQIACH_MAX_MSG_LENGTH, 10 * 1024 * 1024);
         
         // Add parameter to set the channel security exit name
         request.addParameter(MQConstants.MQCACH_SEC_EXIT_NAME, "C:\\Capitalware\\MQCCI\\mqcci(CCI)");
         
         // Add parameter to set the data parameter for channel security exit
         request.addParameter(MQConstants.MQCACH_SEC_EXIT_USER_DATA, "mqcci.ini");

         agent.send(request);
         
         logger("successfully created channel: " + chlName);
      }
      catch (PCFException pcfe) 
      {
         if (pcfe.reasonCode == MQConstants.MQRCCF_OBJECT_ALREADY_EXISTS) 
            logger("Error: The channel '" + chlName+ "' already exists on the queue manager '" + qMgrName + "'.");
         else
            logger("CC=" +pcfe.completionCode +  " [" + MQConstants.lookupCompCode(pcfe.completionCode) + "] : RC=" + pcfe.reasonCode + " ["+MQConstants.lookupReasonCode(pcfe.reasonCode)+"]");
      }
      catch (MQException e)
      {
         logger("CC=" +e.completionCode +  " [" + MQConstants.lookupCompCode(e.completionCode) + "] : RC=" + e.reasonCode + " ["+MQConstants.lookupReasonCode(e.reasonCode)+"]");
      }
      catch (IOException e)
      {
         logger("IOException:" +e.getLocalizedMessage());
      }
      catch (MQDataException e)
      {
         logger("MQDataException:" +e.getLocalizedMessage());
      }
      catch (Exception e)
      {
         logger("Exception:" +e.getLocalizedMessage());
      }
      finally
      {
         try
         {
            if (agent != null)
            {
               agent.disconnect();
               logger("disconnected from agent");
            }
         }
         catch (MQDataException e)
         {
            logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
         }

         try
         {
            if (qMgr != null)
            {
               qMgr.disconnect();
               logger("disconnected from "+ qMgrName);
            }
         }
         catch (MQException e)
         {
            logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
         }
      }
   }

   /**
    * A simple logger method
    * @param data
    */
   public static void logger(String data)
   {
      String className = Thread.currentThread().getStackTrace()[2].getClassName();

      // Remove the package info.
      if ( (className != null) && (className.lastIndexOf('.') != -1) )
         className = className.substring(className.lastIndexOf('.')+1);

      System.out.println(LOGGER_TIMESTAMP.format(new Date())+" "+className+": "+Thread.currentThread().getStackTrace()[2].getMethodName()+": "+data);
   }

   public static void main(String[] args)
   {
      MQCreateChannel01 mqcq = new MQCreateChannel01();
      
      try
      {
         mqcq.init(args);
         mqcq.doPCF();
      }
      catch (IllegalArgumentException e)
      {
         logger("Usage: java MQCreateChannel01 -m QueueManagerName -z Channel_Name -h host -p port -c channel -u UserID -x Password");
         System.exit(1);
      }

      System.exit(0);
   }
}

Regards,
Roger Lacroix
Capitalware Inc.

HPE NonStop, IBM i (OS/400), IBM MQ, IBM MQ Appliance, Java, Linux, macOS (Mac OS X), Open Source, PCF, Programming, Raspberry Pi, Unix, Windows, z/OS Comments Off on Java/PCF Program to Create an IBM MQ SVRCONN Channel

WTF GM?!

I have been a GM guy for a long, long time. My first ride was a used 1977 Pontiac Trans Am.

Pontiac Trans Am
In the 90’s, I had a used 4 door 1989 Chevy Cavalier. I used it to go back and forth to work with (great on gas).

Chevy Cavalier
In September 2003, I bought a brand new 2003 Chevy Avalanche. Back in the day, GM used to run “change” ads because of the versatility of the Avalanche. I had it for 11 years and it was a great vehicle. And yes, those are my kids in the bed of the truck that many of you met over the years at various conferences.

Chevy Avalanche
In the Summer of 2014, I decided to trade it in and get a new Chevy Avalanche. I found out that the production of the Chevy Avalanche ended in 2013 and the dealer could not find any new Chevy Avalanches in Ontario (Canada).

So, I looked around at the different trucks/SUVs that were available and decided to get a new 2014 Jeep Wrangler Sahara – Black out edition.

Jeep Wrangler Sahara
Yes, I know it is not a GM product but it was the coolest looking truck I could find.

So now to the point of my story.

Suddenly, I’m see ads for 2024 Chevy Silverado EV. At first, oh that’s cool. But I started to look closer, hey wait a minute, that’s not a Silverado, that’s an Avalanche!!! It even has a similar marketing tag line and VERY similar styling.

Chevy Silverado EV
And the multi-flex midgate:

Chevy Silverado EV

Chevy Silverado EV

Chevy Silverado EV
So, WTF GM?! Why did you call it Chevy Silverado EV?! It should have been called Chevy Avalanche EV!!!!

It really bugs me that the marketing people don’t know the history of the company they work for. Or was it some dumbass executive who thought it would be a great idea and copy Ford with their F150 Lighting naming convention!! Really GM, that is all you got in the tank? Either you don’t know where you come from or you just copy other ICE manufacturers? Sad. Truly sad.

Every Chevy Avalanche owner I ever talked to, loved their Avalanche. So, you clearly missed an opportunity bring them all back home!!! Dumb. Dumb. Dumb.

If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck. Hence, the Chevy Silverado EV looks like an Avalanche, has many features of an Avalanche then you should have called it Chevy Avalanche EV! Right!!

Regards,
Roger Lacroix

General Comments Off on WTF GM?!