Monthly Archives: August 2007

Another Long Weekend is here

At last we have a good forecast for the weekend weather so we are going to take advantage of it and take the boat out for probably its last long trip around Georgian Bay. Things are going well for us at the moment, we have just found out a couple of contracts have been signed for the RAP which should be installed and running before the end of the year. We have also made big strides in coding up the process to allow a single journal definition while still keeping the ability to automatically create all objects on the target. Should have the initial trials completed in the next few weeks with a PTF for Version 1 Release 1 by the end of next month. Version 2 will also support the technology until IBM brings out the expected changes in the APYJRNCHG command in V6R1 which removes the need. I have had some thoughts on the code we produced for the Data Queue display and we will build the next level which will allow the display to a panel group with a few nice additions. I will publish the code but also create a download for those who don’t have the C compiler available.

To all of those in North America Happy Labor day and have a great week end everyone…


i5 Blog posts without trawling every site

I have said this before but one site I would recommend you bookmark is the iPlanet site which updates regularly with all the posts which are posted and are i5 related.  I thought it was just trawling all the sites it has on its list but having watched it for a few weeks now and going back to the original blog sites I can see that it only collects posts which have i5 content.  It also collects the headings from the trade mags online which is also nice to find in one place.  You have to link back to the orginal site to get the full picture but it really saves a lot of time going back to check sites which have had no posts for some time.  Many Blog sites have an RSS feed, but that normally sends you the stuff you are not interested in as well.

Check it out…


No further on the LAMPS set up

I had hope to get the MySQL set up done and documented today but unfortunately I have been busy preparing for some other work related to the RAP product which required quite a bit of effort in moving the test environments to the i515. I also had to change quite a bit of code to esnure the install would work, strange how it works one day and not the next! Probably screwed things up while I was build the demo environment for the IBM systems and failed to correct it before I scrapped the images..

I have posted a few C snippets which I hope some find helpful, the Data Queues seem to be the forgotten step child as far as being able to understand how they were created so the DSPDQINF command and program have already seen quite a lot of use today!

I hope to be back to building the MySQL implementation next week, we have yet another long weekend this week! Yeah I know seems like I am never here! Still I hope those of you who come back to the site regularly find the content of interest, I seem to have lost contact with Terry who was doing the RPG posts so I hope he is OK?

I had been hoping to post some images of the screens and setup as it went along but unfortunately the camera I have FinePix S602Z seems to be giving up the ghost, some pictures ae pretty sharp while other are terrible! So I bit the bullet and ordered myself a new Nikon D80 today, I have an old Nikon F65 with Nikkor 70-300mm and Nikkor 28-100mm lenses so I wanted to make sure my next Digital SLR would take them on. It appears the only thing the lenses dont support is the 3d color something or other (being color blind I dont suppose I will miss it? :-) ). I had looked around but this seemed like the best camera for the dollar??? I will only know once I try to use it!


Slight change to previous code

I was playing around with the code a bit because the detail on the output seemed to be missing some data! I have to admit I was rushing the code as it didnt have to be that subtle, so I have now fixed a couple of problems where the printf statement was not printing the character variables. Just adjust the existing code to the following and it work OK now.. Basically had to de-reference the structure pointers to allow printf to work…

printf("Sequence = %cn",*Info1.Sequence);
printf("Include Sender ID = %cn",*Info1.Include_Sender_Id);
printf("Force Indicators = %cn",*Info1.Force_Indicators);
printf("Type = %cn",*Info1.Type);
printf("Auto Reclaim = %cn",*Info1.Automatic_Reclaim);


Displaying Data Queue Information

I am currently developing some code which requires the use use of DDM Data Queues, I was having problems because the data was not flowing between the Data Queues and I needed to see what was going on. After trying to find OS commands which would display the Data Queue information and having turned up nothing, I decided to write my own simple command which would display the detail out to a screen. The programs are very basic as I just needed to debug the process with them, if you need to put them into production I would suggest you improve the error checking etc to ensure the messages such as the Data Queue Doesnt exist, or the format used is incorrect are handled. For more information on the API used please see the documentation.

Here is the command which is fronting the program

/* Command name : DSPDQINF */
/* Author name..: Chris Hird */
/* Date created : Aug 30,2007 */
/* */
/* Purpose......: Display Data Queue Information */
/* CPP..........: DSPDQINF */
/* Revision log.: */
/* Date Author Revision */
/* */

CMD PROMPT(‘Display Data Queue Information’)
MIN( 1 ) +
PROMPT(‘Data queue’)
Queue Type’)

LEN(10) +
PROMPT(‘Library name:’)

Here is the program which processes the request

#include                           /* standard I/O */
#include                          /* standard I/O */
#include                           /* Record I/O */
#include                          /* memory and string*/
#include                        /* Data Queue*/

int main(int argc, char** argv) {
int Inf_Len;                                /* Info Len */
Qmh_Qrdqd_RDQD0200_t Info;                  /* DQ Info */
Qmh_Qrdqd_RDQD0100_t Info1;                 /* DQ Info */

Inf_Len = sizeof(Info);
if(memcmp(argv[2],"*DDM",4) == 0) {
   Inf_Len = sizeof(Info);

   printf("APPC Device = %.10sn",Info.APPC_Device);
   printf("Mode = %.8sn",Info.Mode);
   printf("Remote Location = %.8sn",Info.Remote_Location);
   printf("Local Location = %.8sn",Info.Local_Location);
   printf("Remote Network ID = %.8sn",Info.Remote_Network_ID);
   printf("Remote Data Queue Name = %.10sn",Info.Remote_Data_Queue_Name);
   printf("Remote Data Queue Lib = %.10sn",Info.Remote_Data_Queue_Library);
   printf("Data Queue Name = %.10sn",Info.Data_Queue_Name);
   printf("Data Queue Lib = %.10sn",Info.Data_Queue_Library);
   printf("Relational DB Entry = %.10sn",Info.Relational_Database);
else {
   Inf_Len = sizeof(Info1);
   printf("Message length = %dn",Info1.Message_Length);
   printf("Key length = %dn",Info1.Key_Length);
   printf("Sequence = %cn",Info1.Sequence);
   printf("Include Sender ID = %cn",Info1.Include_Sender_Id);
   printf("Force Indicators = %cn",Info1.Force_Indicators);
   printf("Text = %.50sn",Info1.Text);
   printf("Type = %cn",Info1.Type);
   printf("Auto Reclaim = %cn",Info1.Automatic_Reclaim);
   printf("Num Messages = %dn",Info1.Number_Messages);
   printf("Max Messages = %dn",Info1.Max_Number_Messages);
   printf("Name = %.10sn",Info1.Data_Queue_Name);
   printf("Library = %.10sn",Info1.Data_Queue_Library);
   printf("Max Entries = %dn",Info1.Max_Number_Entries_Allowed);
   printf("Initial Entries = %dn",Info1.Initial_Number_Entries);
   printf("Max Entries Specified = %dn",Info1.Max_Number_Entries_Specified);
return 1;

The output should be similar to the following for a DDM Data Queue

APPC Device =
Mode =
Remote Location = *RDB
Local Location =
Remote Network ID =
Remote Data Queue Name = AUDITQ
Remote Data Queue Lib = RAPTST
Data Queue Name = DDMAUDITQ
Data Queue Lib = RAPTST
Relational DB Entry = SHIELD2

And for a Standard Data Queue

Message length = 256
Key length = 0
Sequence =
Include Sender ID =
Force Indicators =
Text =
Type =
Auto Reclaim =
Num Messages = 0
Max Messages = 16
Library = RAPTST
Max Entries = 52368
Initial Entries = 16
Max Entries Specified = -1

If you need to understand the details of the output the descriptions provided in the documentation will give you a good idea.

Hope this is again useful?


Creating a qualified Object Name

One piece of code which I use a lot is one where I need to build a qualified name from and object name.  A qualified name takes the form of LIBRARY/OBJECT where as the object name is simply the Object name and library as two seperate elements of 10 characters. So to build the Qualified name you have to take the Object Name, strip off the blanks, append the ‘/’ character then append the Library with the blanks stripped off.  In CL this is very easy to do so you could write a CL program which returns the Qualified Name but I like to keep the code in C where possible.  To do this I created a function which I can call from any program passing in the OBJECT and LIBRARY Variables (20 characters) and return the Qualified name NULL terminated (I use strcat() a lot so it makes it easier). Many of the API’s will return the object name and library as 2 fields so this code helps me when I need to get a list of files in the library (QUSLOBJ API) and then open them for update etc….

Here is the Function code


int Crt_Q_Name(char *Name, char *Q_Name) {
int i,j,max;                                /* counter */

for(i = 0,j = 10; i < 10; i++,j++) {
   Q_Name[i] = (Name[j] == ' ') ? '' : Name[j];
   if(Name[j] == ' ')
max = strlen(Q_Name) + 10;
for(i = strlen(Q_Name),j = 0; i < max;j++, i++) {
   Q_Name[i] = (Name[j] == ' ') ? '' : Name[j];
   if(Name[j] == ' ')
      break ;
Q_Name[i] = '';
return 1;

To call the function all you have to do is pass in the Object Name and an address of the array to hold the qualified Name.

int some_function() {
char Name[20] = "MYOBJECT MYLIB ";
char QName[22] = {''};if(Crt_Q_Name(Name,QName) != 1) {
/* do something here */
/* you should get MYLIB/MYOBJECT back in the ARRAY */

I hope you find this helpfull..


New figures for RAP/400 with i515 target

In my previous posts I published the figures I had achieved in terms of apply rates using RAP on an couple of LPARS from a 570 16 way. As that system is not what I would expect many people to be using when looking at RAP I decided to try out the exact same test using my i520 to the i515. First of all here are the configs for the systems.

i520 is 0900 feature code, with 4 35GB disks unprotected and 2Gb of memory. Disk utilization is at 19% which is fairly low. I do have various products running but the activity level on the system is very low.

i515 is 8327 feature code, with 2 70GB disks running raid 0 (mirrored ) and 1GB of memory. Disk utilization is 25% which again is fairly low. I have nothing running on this system other than Zend Core which I installed earlier. The programs used for the data generation are the same as described in the previous post other than I adjusted the ADDREC program to only add 10,000 entries to each file in each library.

Here are the numbers I came up with.

RAPDTA1 17:47:10 17:51:00 18:14:14 18:14:32 50005
RAPDTA2 17:51:04 17:54:53 18:14:33 18:14:52 60011
RAPDTA3 17:55:02 17:58:46 18:14:52 18:15:08 60005
RAPDTA4 18:01:26 18:04:55 18:15:08 18:15:27 60011

The figures are skewed a little because of the delay job commands (approximately 25 seconds in each job) on the source plus I have two journals for RAPDTA2/4 libraries, they have object entries to apply. However the source program takes about 4 minutes to create the same number of records which the target applies in less than 15 seconds. This shows the APYJRNCHG Commands can process significant entries even on the small target system we have used. As with all results they have to be taken with a pinch of salt when trying to balance them against a production environment but as the target is likely to be just storing the data its not going to be running production jobs most of the time…. Looking at the numbers I have produced you should be able to switch systems in the event of a failure very quickly if you set up the journal to be changed with less than 5 million records in it, application of those entries should take apporximately 25 minutes (this is almost putting the HA products switch over times in reach as the other switch activities can be run at the same time as the data catch up done…)

Anyhow I thought this was an interesting exercise, if you need to understand more about the detail give me a call!

Just for Lukas, it seems like the box could be a very cheap and effective DR solution for many smaller companies with the need for journalled data and object object protection. I don’t think the smaller companies need a high spec system based on these results?? It seems to be acceptable in terms of data processing???


LAMPS here we go! Part I (ZendCore install)

OK the system is now up and running, we will now start to download all of the elements we need to create the LAMPS server set up as well as installing the Studio on a new PC. First place we visited was the Zend site to download the Studio, Core and Platform files.

I downloaded the latest versions which are

  • ZendCoreFori5_OS-2.0.1-pase (62.5MB)
  • ZendStudio_for_i5OS-5_5_0(63.5MB)
  • ZendPlatformFori5_OS-3.0.3-pase(66.2MB)

I checked the MD5 checksums against those posted on the website and started the install process. First thing we installed was of the Zend Core on the i5 server.

Here are the steps we took to install the Core product.

First we needed was the installation guide, this is available from the website. Or within the downloaded zip file ZendCorFori5_OS-2.0.1-pase.
Reviewing the content shows that we need to install a few extra IBM programs onto the system first. We had to install the following options

  • 5722SS1 Option 13
  • 5733SC1 Option *Base and 1

(Note: IBM 5733SC1 comes on a separate CD which is titled IBM Portable Utilities for i5OS and is not part of the media which is listed on the media report)

Once this was finished we copied the save file which is part of the downloaded zip file for Zend Core. You have to use a binary transfer to move the object and I simply used MiFiles for the FTP client to move the save file from my PC to the i5. Because I had previously set up the FTP server to use the *UNIX, *PATH options I could simply address the target directory as /qsys.lib/qgpl.lib and copy the object directly to the i5. It is 463.3MB unpacked so use a LAN connection to do the transfer if possible! If not you can unpack the Zip file using the utility GZIP which is available from directly on the i5.
(Note: I did have to rename the file on the PC to zendcore.savf to allow it to be moved to the i5 and be recognized as a save file object correctly)

After the save file is copied check it out to make sure its been copied correctly DSPSAVF command worked for us! Now we can install the licensed program.
You have the option of either using silent or interactive, silent is done using the SBMJOB command passing the RSTLICPGM command parameters, while interactive uses the RSTLICPGM command. We decided to use the RSTLICPGM command as we wanted to be able to set the passwords and Zend Network information.
Issuing the RSTLICPGM Command with the correct parameters starts the install, it goes off and checks out the installed options to ensure you have the right OS options installed then comes back with the a window screen. This does take some time (30 minutes) but a quick sysreq and display of the joblog does show the activity progressing. You will be presented with a few more screens such as accepting the license agreement, inputing the password for the Web Administration Console (you only get one field no check!) before you are asked for your Zend Network profile information. I already have a profile so I just entered it, if you dont you need to bring up the Zend website and request a Zend Network profile. Then enter the information you have set up. Again you only get one chance so make sure you get it right! although there are options to change it later if you do get it wrong. Finally you get the message that the installation went successfully (or at least we did!).

Thats all there is to installing the Zend Core, next we will install the Zend Platform.


Set a few more things on the i515

Now that I have the server up and running with everything that shipped already installed (eat your heart out Microsoft!) I now have to configure a few things which come as default and do not meet with our normal practices. The thing to remember here is the box is only accessible through the LAN locally, I don’t expose it to the internet at all so I can be a bit lax in some area’s of security (I know I shouldn’t but thats life!).

I created a profile for myself so I am not using QSECOFR all the time. I also want to ensure I can attach using Client Access so I had to configure the ethernet connection. This was fairly simple, just have to find the hardware resource WRKHDWRSC *CMN, identify the right resource (in my case CMN05) and create the line description CRTLINETH. Now I have the line configured I need to start it and allow auto configure to create the Controller and devices it needs running TCP/IP. After this was done I used the ADDTCPIFC command to create the interface to the resource. I just used a single interface address for this line so it was fairly simple to set up. Next I started the interface and ensured I could ping the IP address from the LAN. No problems so far! I was going to remove the mirrored disk and have no protection, but as this is not going to have lots of data being pushed to it I decided to leave it for now. I then set the Network Attributes using the CHGNETA command to allow DDM and set the system name that I had decided upon. I did change the local network ID but as I dont use APPC its not relevant. Important things to change are the DDM request access and Client request access to ensure RJ works. Once this was done I configured TCP as much as I needed to at the moment, set the FTP attributes to NAMEFMT *PATH CURDR *HOMEDIR and LISTFMT *UNIX, this is important when using a lot of client FTP applications and particularly the PHP studio we will be setting up later. I also changed the DDM server to use *VLDONLY for password checking plus autostart the server.

Once this was done I reviewed the main system values and changed them where necessary, the main changes I made was to QTIMZON (you can select the value after pressing PF4 which is much easier than trying to work out the format and values) The time was off somewhat as it was configured as UTC0000. QUSRASTLVL was changed to *ADVANCED, QCTLSBSD changed to QCTL and QLMTSECOFR set to OFF. I tried to change the password level and length values but they would not change so I have to look at that later.

I then shutdown the system while I moved it back into the computer room and connected the cables to the right places again. I don’t need the Ops Panel unless I loose the Ethernet connection so I can just connect it to any PC with a comms port.

Next was to make sure I get the latest fix packs ordered and install a couple of PTF’s which I needed for the watch API’s I use in the RAP product. Tried to use the iPTF (Fix Central) web solution with absolutely no luck at all. More Java Errors than I have had hot dinners! IBM really does have a screwed up web infrastructure. So I then had to go back to the old faithful and use SNDPTFORD from the command line. But before I could do that I needed to configure the server to allow the connection to IBM to work. First thing was to set the QRETSVRSEC system value to On so it retained the security data. Next I had to configure the service information which is reached from the main menu using Option 7 and then taking Option 4 “Work with support contact information”. Once all of the contact information is entered I set up the Server to allow direct connection via the internet connection CRTSRVCFG ROLE(*PRIMARY) CNNTYPE(*DIRECT).
Then issuing SNDPTFORD SF99540 started the download of the Cumulative package. It is only 1.2Gb (2 CD Images) but it would not allow me to order the CD’s by mail! So I will now have to install via this package??

Its now 8:30 and I have been installing since 2:30 so about 6 hours into it and I have the system up, running and PTF’s being installed. I cant set up a Microsoft Server in that time let alone have the latest fix packs on it. I also broke off for a few hours to get out of the office and do a few chores so its not really taken that long!

I will post more information as I progress tomorrow, this is not rocket science and not that interesting to a lot of people, but it does show how easy it is and is the building blocks for the LAMPS install and configuration we will be doing later.


IBM has probably the worst site ever!

I am trying to install the software and insert keys for the new i515. I received a nice note stating the keys no longer ship with the software but you have to go to the IBM website to download! So I follow the instructions to get into the site (I already have a sign in!) and try to get to the key files! For 45 minutes now I have been trying to get to the key files! the site is so slow its horrible! IBM should look at the site and somehow improve its response times and content, they should also be ashamed of the site!

This is the interface most people have to go through to get information and documentation on IBM products, the response times and content would put even the most loyal customer off! Come on IBM get your act together and put a website out there that shows what a great company you are and how good the technology you offer is!!!!