tag:blogger.com,1999:blog-109340282024-03-13T06:50:36.312-04:00Confessions of an iSeries PriestThis is the blog of a high priest in the decidedly low-brow minority religion of iSeries worship. Ours was once the envy of all the other dogmas, but now we toil in semi-darkness hoping that our lord Ib'm will bestow upon us some badly needed grace. This blog will consist of musings, complaints, questions, praise, prayers, non-sequitors, and links to free source code.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.comBlogger37125tag:blogger.com,1999:blog-10934028.post-31046321440896484762015-12-18T17:08:00.000-05:002015-12-18T17:57:42.749-05:00Read Everything!Some two decades ago, I didn't read the cover letter for a <acronym title="High Impact/Pervasive">HIPER</acronym> <a href="http://en.wikipedia.org/wiki/IBM_Program_temporary_fix" target="_blank">PTF</a>, so I was unaware of its special instructions, and almost a year after it was applied, my negligence caused a catastrophic failure in one system. Those unread directives compelled the reader to rebuild the storage directories, but since that wasn't done, an upgrade of the operating system caused every <acronym title="Direct Access Storage Device">DASD</acronym> page to be marked as free, and over a period of several hours, the AS/400 slowly ate its storage, one page at a time, damaging many objects before we were able to wrest control and recover.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8v_h4SszZdoITf_SOekq5Jc4W4jFdV7d4c1P0Wb1rMeQDBakr_KveIN2I7uoEXbZEsJ0CtAdvLWhgvaXX4w_rBVHGJjlzkaFGa8BXE1-OYnc7RMWsx8BFQDmYbZJAzKXWMlRn7w/s1600/IMG_20151215_121231778%255B2%255D.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8v_h4SszZdoITf_SOekq5Jc4W4jFdV7d4c1P0Wb1rMeQDBakr_KveIN2I7uoEXbZEsJ0CtAdvLWhgvaXX4w_rBVHGJjlzkaFGa8BXE1-OYnc7RMWsx8BFQDmYbZJAzKXWMlRn7w/s400/IMG_20151215_121231778%255B2%255D.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Image of the hung <acronym title="Graphical User Interface">GUI</acronym> that I uploaded with the <acronym title="Problem Management Record">PMR</acronym>.</td></tr>
</tbody></table>
Besides the refrain to <i>backup, backup backup</i>, the second most important task in computers is to read everything before-hand. This week I neglected to peruse the read-me page for the <acronym title="Hardware Management Console">HMC</acronym> PTF <a href="http://delivery04.dhe.ibm.com/sar/CMA/HMA/05sgp/1/MH01560.readme.html" target="_blank">MH01560</a>, mostly because, frankly, there is nothing more boring than an <acronym title="Hardware Management Console">HMC</acronym> read-me document. In all the years I've been installing them, there has never once been anything in their texts that would have caused me to deviate from the normal installation steps. However, in this read-me's "Installation" section there was one tiny sentence that read "This fix <u>must</u> be installed using the <acronym title="Hardware Management Console">HMC</acronym> <a href="http://www-01.ibm.com/support/knowledgecenter/P8ESS/p8edm/updhmc.html" target="_blank">updhmc</a> command; not the <acronym title="Graphical User Interface">GUI</acronym>." It doesn't relate why one must do that, just commandment to not.<br />
<br />
Though this bit of negligence was not as bad as my catastrophic faux-pas of the 90s, when the <acronym title="Graphical User Interface">GUI</acronym> got hung, I opened a <acronym title="Problem Management Record">PMR</acronym> and was politely informed by the support tech that, ahem, right here, sir, it say do not use the <acronym title="Graphical User Interface">GUI</acronym>. I have since closed the <acronym title="Problem Management Record">PMR</acronym> and asked them to please burn it, such was the level of my embarrassment. If there's one positive to this experience, it turns out the <acronym title="Command Line Interface">CLI</acronym> application is very fast and easy to use, and I'll probably use it over the <acronym title="Graphical User Interface">GUI</acronym> in the future.<br />
<br />
This article was supposed to be a heads up to those upgrading to v8r8.4.0 and applying required PTF MH01560 with the updhmc command, but it devolved into a confession of inadvertently providing support techs with material to laugh about during their coffee breaks. In any case, I hope you'll all have a safe holiday season, and maybe someday I'll write about the two <acronym title="Problem Management Record">PMR</acronym>s I opened a year apart for the same issue that were both <a href="http://www.acronymfinder.com/Problem-Between-Keyboard-and-Chair-(PBKC).html" target="_blank">PBKC</a>. Though both times, thankfully, it was someone else's KC.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com2tag:blogger.com,1999:blog-10934028.post-77284196509547993742013-06-02T23:53:00.000-04:002013-06-02T23:53:57.372-04:00AS/400 Gets a Mention<a href="http://www.thisamericanlife.org/radio-archives/episode/496/when-patents-attackpart-two" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDpugul_I1-yw5hhB7UvpdSHntB3tTdqoFfS2CxPCQ0HSwLCceArK_4NIUndrkl0pAyv5k-Kp05tA3rosLfDYXwzjEMdvzGxCETIp8cdM7CuzxMmbicTy_4GDXIXJbFuGclyeuzg/s200/WhenPatentsAttackPart2.jpg" width="200" /></a><p>My favorite radio show <a href="http://www.thisamericanlife.org/" target="_blank">This American Life</a> mentioned the AS/400, twice! (Be still my beating heart.) The name of this particular episode (#496) is <a href="http://www.thisamericanlife.org/radio-archives/episode/496/when-patents-attackpart-two" target="_blank">When Patents Attack, Part 2</a> and the small mention is in <a href="http://www.thisamericanlife.org/radio-archives/episode/496/when-patents-attackpart-two?act=2" target="_blank">2nd half</a> of the broadcast, which you can listen to at their website.</p>
<p>It starts around 38 minutes into the program. I was listening to the podcast when one of the commentators said "They decide they need a specific type of computer to backup all the data, something called an AS/400." I nearly fell off my chair. I don't know why, but I became not unlike a drooling fan-boy of an obscure band, and I've just heard my favorite song of theirs on the radio. It's too bad the AS/400 expert connected to the story is part of a <a href="https://en.wikipedia.org/wiki/Patent_troll" target="_blank">patent troll</a> operation, and one of the main subjects of the show. Despite all of that, I was giddy with delight and had to share.</p>Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com1tag:blogger.com,1999:blog-10934028.post-69107655182229665032012-09-29T00:21:00.001-04:002012-10-06T14:04:10.125-04:00Sound and Fury<table cellpadding="2" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td valign="top" style="text-align: center;"><a href="http://www.militaryfactory.com/smallarms/imgs/rpg-7_2.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="163" src="http://www.militaryfactory.com/smallarms/imgs/rpg-7_2.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">RPG</td></tr>
</tbody></table>
<p>On May 16, 2012 Mel Beckman wrote a piece in iProDeveloper called "<a href="http://www.iprodeveloper.com/article/opinion/is-rpg-dead-699217" target="_blank">Is RPG Dead?</a>" where he argued that it was. Readers of this blog will recall that it caused a huge firestorm within our community to the point that many were calling for Mel's head on a platter.</p>
<p>I was as shocked as the next RPG programmer that the language was dead, but all of the vociferous reactions left me cold. What was needed, I thought, were cooler heads and reasoned rebuttal; During this period a line from Macbeth, "full of sound and fury, signifying nothing", kept running through my head. One day a little poem came forth. I had originally posted it on Facebook on June 1st and now that the hub-bub has died down I thought I'd post it here:</p>
<p><i>There is much sound and fury in this tale whose hour upon the stage was spawned by Mel and the walking shadow RPG sits quietly in the mezzanine contemplating the maelstrom of which she is the subject. The poor players on the stage will strut and fret and expel their rage and in the end we all know that they will be heard no more, ultimately signifying nothing.</i></p>
<p>(Most of phrasing came from Macbeth's long winded response to the news, near the end of the play, that his wife was dead.)</p>
<p><b>Update 10/6/12</b></p>
<p>Once all of the initial shouting died down there were some very good posts written that rebutted Mel's assertions. I'd like to mention three of them here:</p>
<ul>
<li><a href="http://ibmsystemsmag.blogs.com/idevelop/2012/05/rpg-is-dead-long-live-rpg.html" target="_blank">RPG is Dead - Long Live RPG</a> and <a href="http://ibmsystemsmag.blogs.com/idevelop/2012/05/rpg-not-dead-yet.html" target="_blank">RPG: Not Dead Yet</a> by Jon Paris and Susan Gantner</li>
<li><a href="http://www.iprodeveloper.com/blog/scotts-iland-21/rpg-programming/rpg-dead-699362" target="_blank">RPG is Dead? Are You Serious?!</a> by Scott Klement</li>
</ul>Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com4tag:blogger.com,1999:blog-10934028.post-17192289896846452462012-09-27T10:02:00.000-04:002012-09-27T13:09:01.371-04:00Book of SBMJOB, Chapter on CMD<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 2em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA9w1DXuezfTc4TzrEo5gkStQq5Eu_KBDo2ADa7sOOZAGBx6v1jyHoEaq_B2TI6-z9I-D6aVybQwTrmVVZbLswoqbD82GLkeW9wP5zi_l3rzPHA4r_nw8hWK0leWUjrCjLjFiMGg/s1600/unclesam.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="366" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA9w1DXuezfTc4TzrEo5gkStQq5Eu_KBDo2ADa7sOOZAGBx6v1jyHoEaq_B2TI6-z9I-D6aVybQwTrmVVZbLswoqbD82GLkeW9wP5zi_l3rzPHA4r_nw8hWK0leWUjrCjLjFiMGg/s400/unclesam.jpg" width="264" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Read it <a href="http://www.iprodeveloper.com/article/rpg-programming/sbmjob-commands-cmd-parameter-cooperate-699450" target="_blank">here</a>.</td></tr>
</tbody></table>
<p>Years ago when I was a novice studying the liturgy of the 38 System, I started writing an early version of the book of <a href="http://www.iprodeveloper.com/article/systems-management/put-the-sbmjobalt-command-to-work-part-1-66186" target="_blank">SBMJOBALT</a> simply because it annoyed me that I couldn't prompt its Request Data (RQSDTA) chapter. Apparently, the development angels of our lord Ib'm found this frustrating too, because when the new testament of the 400 was released, the book of the SBMJOB had a new chapter named CMD that allowed prompting. That wasn't all, of course. Our most holy lord Ib'm blessed us all with two other wonderful verses for this chapter:</p>
<ol>
<li>If a CL program submits a CALL command, the program it calls will appear on the Display Program References (DSPPGMREF) output for the submitting program.</li>
<li>On the PARM parameter of those CALL commands, the CMD parameter can also handle data in CL variables so that you don't have to build a command string beforehand.</li>
</ol>
<p>Hallelujah!</p>
<p>Of course, every far-reaching testament has some annoying errors of omission. At the following link I describe two of them and my simple solutions for both: <a href="http://www.iprodeveloper.com/article/rpg-programming/sbmjob-commands-cmd-parameter-cooperate-699450" target="_blank">Get the SBMJOB Command's CMD Parameter to Cooperate</a></p>Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-86942954326594983102012-06-25T11:01:00.000-04:002012-06-25T23:15:04.168-04:00Spammer is a Meathead<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGWmalMtVCUfqiGD1Qwq63l1llJT495A_tlF204jRikHRVOsogbC5z-l_8LwVxaWajaQunTvZlL_Ij4uqSuMJ42Ib28i_uf6RS6i2tMJbSfF84UvXMOPibfgBB4VJHch5A7QPv6g/s1600/spam.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"><img border="0" height="315" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGWmalMtVCUfqiGD1Qwq63l1llJT495A_tlF204jRikHRVOsogbC5z-l_8LwVxaWajaQunTvZlL_Ij4uqSuMJ42Ib28i_uf6RS6i2tMJbSfF84UvXMOPibfgBB4VJHch5A7QPv6g/s320/spam.png" /></a>
<p>Of the many chores I do around the parish, one of them is dealing with the spam that comes across my desk. Of late I've been getting piles of stuff from what must be the most clueless spammer on record. My client won't display any of the contents because the entirety of each email is so malformed that it can't be deciphered. I have to edit it myself just to get <a href="http://www.spamcop.net" target="_blank">SpamCop</a> to interpret it. Check out this typical example of the piles of goo I've been getting from various locations around the world. (I've highlighted the most blatant bits of silliness):</p>
<hr/>
<blockquote>
<pre style="font-family: Courier New">
From - Mon Jun 25 09:30:16 2012
X-Account-Key: account9
X-UIDL: 1896-1135197712
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
X-Mozilla-Keys:
Return-path: <clueless@spammer.com>
Received: from mta34.srv.hcvlny.nowhere.com
(mta34.srv.hcvlny.nowhere.com [167.206.5.102]) by mstr13.srv.hcvlny.nowhere.com
(Sun Java System Messaging Server 6.2-9.20 (built Jul 15 2010))
with ESMTP id <0M6500F02Z6RUD90@mstr13.srv.hcvlny.nowhere.com> for
no.one@nowhere.com; Mon, 25 Jun 2012 04:20:51 -0400 (EDT)
Received: from SEMA (95.9.36.33.static.ttnet.com.tr [95.9.36.33])
by mta34.srv.hcvlny.nowhere.com
(Sun Java System Messaging Server 6.2-8.04 (built Feb 28 2007))
with ESMTP id <0M6500J6JZ5K9TL0@mta34.srv.hcvlny.nowhere.com> for
no.one@nowhere.com (ORCPT no.one@nowhere.com); Mon,
25 Jun 2012 04:20:51 -0400 (EDT)
Received: (qmail 7526 by uid 670); Mon,
25 Jun 2012 08:23:07 -0200<b>From:</b> "Enlargement pils Sample"
<clueless@spammer.com><b>To:</b> <formula1nut@nowhere.com><b>Subject:</b> Thrill her more
every night<b>Date:</b> Mon,
25 Jun 2012 08:06:40 -0200Message-ID: <005f01cd52c4$82452690$86cf73b0$@com><b>MIME-Version:</b>
1.0<b>Content-Type:</b> multipart/alternative;
boundary="----=_NextPart_000_005E_01CD52C4.82452690"<b>X-Mailer:</b> Microsoft Office
Outlook 12.0<b>Thread-Index:</b> AcjupAzv1ypgP1yJ50d8AifghGpFJw==<b>Content-Language:</b>
en-usThis is a multipart message in MIME
format.<b>------=_NextPart_000_005E_01CD52C4.82452690Content-Type:</b> text/plain;
charset="us-ascii"<b>Content-Transfer-Encoding:</b> 7bitJay Leno found taking
drugshttp://debatablecommerce.com/<b>------=_NextPart_000_005E_01CD52C4.82452690Content-Type:</b> text/html;
charset="us-ascii"<b>Content-Transfer-Encoding:</b> quoted-printable<b><html</b>
xmlns:v=3D"urn:schemas-microsoft-com:vml"
=xmlns:o=3D"urn:schemas-microsoft-com:office:office"
=xmlns:w=3D"urn:schemas-microsoft-com:office:word"
=xmlns:x=3D"urn:schemas-microsoft-com:office:excel"
=xmlns:p=3D"urn:schemas-microsoft-com:office:powerpoint"
=xmlns:a=3D"urn:schemas-microsoft-com:office:access"
=xmlns:dt=3D"uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
=xmlns:s=3D"uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
=xmlns:rs=3D"urn:schemas-microsoft-com:rowset" xmlns:z=3D"#RowsetSchema"
=xmlns:b=3D"urn:schemas-microsoft-com:office:publisher"
=xmlns:ss=3D"urn:schemas-microsoft-com:office:spreadsheet"
=xmlns:c=3D"urn:schemas-microsoft-com:office:component:spreadsheet"
=xmlns:odc=3D"urn:schemas-microsoft-com:office:odc"
=xmlns:oa=3D"urn:schemas-microsoft-com:office:activation"
=xmlns:html=3D"http://www.w3.org/TR/REC-html40"
=xmlns:q=3D"http://schemas.xmlsoap.org/soap/envelope/"
=xmlns:rtc=3D"http://microsoft.com/officenet/conferencing" =xmlns:D=3D"DAV:"
xmlns:Repl=3D"http://schemas.microsoft.com/repl/"
=xmlns:mt=3D"http://schemas.microsoft.com/sharepoint/soap/meetings/"
=xmlns:x2=3D"http://schemas.microsoft.com/office/excel/2003/xml"
=xmlns:ppda=3D"http://www.passport.com/NameSpace.xsd"
=xmlns:ois=3D"http://schemas.microsoft.com/sharepoint/soap/ois/"
=xmlns:dir=3D"http://schemas.microsoft.com/sharepoint/soap/directory/"
=xmlns:ds=3D"http://www.w3.org/2000/09/xmldsig#"
=xmlns:dsp=3D"http://schemas.microsoft.com/sharepoint/dsp"
=xmlns:udc=3D"http://schemas.microsoft.com/data/udc"
=xmlns:xsd=3D"http://www.w3.org/2001/XMLSchema"
=xmlns:sub=3D"http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/"=
xmlns:ec=3D"http://www.w3.org/2001/04/xmlenc#"
=xmlns:sp=3D"http://schemas.microsoft.com/sharepoint/"
=xmlns:sps=3D"http://schemas.microsoft.com/sharepoint/soap/"
=xmlns:xsi=3D"http://www.w3.org/2001/XMLSchema-instance"
=xmlns:udcs=3D"http://schemas.microsoft.com/data/udc/soap"
=xmlns:udcxf=3D"http://schemas.microsoft.com/data/udc/xmlfile"
=xmlns:udcp2p=3D"http://schemas.microsoft.com/data/udc/parttopart"
=xmlns:wf=3D"http://schemas.microsoft.com/sharepoint/soap/workflow/"
=xmlns:dsss=3D"http://schemas.microsoft.com/office/2006/digsig-setup"
=xmlns:dssi=3D"http://schemas.microsoft.com/office/2006/digsig"
=xmlns:mdssi=3D"http://schemas.openxmlformats.org/package/2006/digital-sig=nature"
=xmlns:mver=3D"http://schemas.openxmlformats.org/markup-compatibility/2006="
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml"
=xmlns:mrels=3D"http://schemas.openxmlformats.org/package/2006/relationshi=ps"
xmlns:spwp=3D"http://microsoft.com/sharepoint/webpartpages"
=xmlns:ex12t=3D"http://schemas.microsoft.com/exchange/services/2006/types"=
=xmlns:ex12m=3D"http://schemas.microsoft.com/exchange/services/2006/messag=es"
=xmlns:pptsl=3D"http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/="
=xmlns:spsl=3D"http://microsoft.com/webservices/SharePointPortalServer/Pub=lishedLinksService"
xmlns:Z=3D"urn:schemas-microsoft-com:" =xmlns:st=3D"=01"
xmlns=3D"http://www.w3.org/TR/REC-html40"><head><META
HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =charset=3Dus-ascii"><meta
name=3DGenerator content=3D"Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */ @font-face=09{font-family:"Cambria Math";=09panose-1:2
4 5 3 5 4 6 3 2 4;}@font-face=09{font-family:Calibri;=09panose-1:2 15 5 2 2 2
4 3 2 4;} /* Style Definitions */ p.MsoNormal, li.MsoNormal,
div.MsoNormal=09{margin:0in;=09margin-bottom:.0001pt;=09font-size:11.0pt;=09font-family:"Calibri","sans-serif";}a:link,
span.MsoHyperlink=09{mso-style-priority:99;=09color:blue;=09text-decoration:underline;}a:visited,
span.MsoHyperlinkFollowed=09{mso-style-priority:99;=09color:purple;=09text-decoration:underline;}span.EmailStyle17=09{mso-style-type:personal-compose;=09font-family:"Calibri","sans-serif";=09color:windowtext;}.MsoChpDefault=09{mso-style-type:export-only;}@page
Section1=09{size:8.5in 11.0in;=09margin:1.0in 1.0in 1.0in
1.0in;}div.Section1=09{page:Section1;}--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026"
></o:shapedefaults></xml><![endif]--><!--[if gte mso >9]><xml> <o:shapelayout
v:ext=3D"edit"> <o:idmap v:ext=3D"edit" data=3D"1" ></o:idmap>
</o:shapelayout</xml><![endif]--></head><body lang=3DEN-US link=3Dblue
vlink=3Dpurple><div class=3DSection1><p class=3DMsoNormal><o:p>Jay Leno found
taking drugs</o:p></p><p class=3DMsoNormal><o:p><a
=href=3D"http://debatablecommerce.com/">http://debatablecommerce.com/</a></o:p></p></div></body></html><b>------=_NextPart_000_005E_01CD52C4.82452690--</b>
Date: Mon, 25 Jun 2012 04:20:51 -0400 (EDT)
Date-warning: Date header was inserted by mta34.srv.hcvlny.nowhere.com
From: clueless@spammer.com
Message-id: <0M6500J6RZ5M9TL0@mta34.srv.hcvlny.nowhere.com>
Content-transfer-encoding: 7BIT
Sun-Java-System-SMTP-Warning: Lines longer than SMTP allows found and wrapped.
Original-recipient: rfc822;no.one@nowhere.com
</pre>
</blockquote>
<hr />
<p>See what I mean? There are no carriage-return/line-feeds (CRLF) before the header keywords (From:, To:, Subject:, X-Mailer:, etc.), the boundary separators, the envelope keywords, before the envelope's content, or most other areas that could benefit from a strategically placed CRLF. I haven't even bothered to try and figure out what's going on in the HTML envelope near the end, but it looks dreadful.</p>
<p>This has been going on for weeks and every email has a different link for a different "product". I can't believe this meat-head is actually getting paid for these malformed missives of debatable commerce. It has to be one person running some kind of scam and has no idea that almost none of it is actually being read by their "target audience".</p>Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-23079533500823686392012-04-14T13:33:00.000-04:002012-04-16T17:55:56.676-04:00A Call for Prayers to Solve the Problem of List Parameters and Variables in CL<span style="font-family: Verdana; font-size: x-small;"><b>Feature Requests and Requirements</b></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7UshexklW9kR5nToj41bYR7DugoX7FH9JVRduUG5srjiHpA0JVebrXCcTAWdnXz14EZzjA0SuhHd4huZap6FJuSXtfpJntzQr_E2mszKZlM7jwuVBODAyG9bngi1ZtEgwk1mnNg/s1600/ChurchOfIbmAndTheHolyi.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7UshexklW9kR5nToj41bYR7DugoX7FH9JVRduUG5srjiHpA0JVebrXCcTAWdnXz14EZzjA0SuhHd4huZap6FJuSXtfpJntzQr_E2mszKZlM7jwuVBODAyG9bngi1ZtEgwk1mnNg/s320/ChurchOfIbmAndTheHolyi.jpg" width="320" /></a></div>
Greetings worshipers of our lord Ib'm and the most holy "i". Today I would like to talk about an issue that has been with us since the days of the old testament. Yes, I'm talking about a chapter in the story of the land of System/38 and king CPF.<br />
<br />
Since those early days we who toiled in semi-darkness, right through to modern times, were bedeviled by specifying variables for list parameters in CL
programs. For every other parameter on the system, if we needed to specify
a variable we were good to go, but to this day, even with the most holy "i", we’ve never had a good way to specify a
variable with list parameters.<br />
<br />
I think I've hit upon what I consider to be a workable solution to this intractable conundrum, but it will require the minions of our lord Ib'm to make three changes. It will also require many prayers from the faithful to prod its angels to effect these modifications. Towards this end I recently wrote a piece for System i News called <a href="http://www.systeminetwork.com/blog/idigress-23/rpg-programming/solving-problem-list-parameters-variables-cl-699271" target="_blank"><i>Solving the Problem with List Parameters and Variables in CL</i></a>. If you agree with the arguments set forth in that post then please register your prayers for this change by going to the <a href="http://community.common.org/powerbase/fetch/" target="_blank">COMMON <i>Feature Requests and Requirements</i></a> page and voting for the following requirement requests:<br />
<ul>
<li><a href="http://community.common.org/powerbase/view/ideasIBM.htm?db=ideasIBM&Where=ID%20=%20212" target="_blank"><i>Arrays in CL</i> #212</a>: "Problem: The CL language does not have array support, which is something that would be very useful." Regular readers of this blog might recognize this as requirement #4 in my blog post <i><a href="http://iseriespriest.blogspot.com/2010/09/my-top-10-requirements-for-cl.html" target="_blank">Top Ten Requirements for CL Enhancements</a></i>.</li>
<li><a href="http://community.common.org/powerbase/view/ideasIBM.htm?db=ideasIBM&Where=ID%20=%20215" target="_blank"><i>Qualified data structures in CL</i> #215</a>: "Problem: Currently CL variables whose storage is defined inside another variable (known in RPG as a data structure) cannot be qualified to that variable. CL modules are getting more and more complex given the expanded features IBM has introduced. The number of variables are getting larger and so are the number of data structure sub-fields and they must have unique names within the module. It is getting harder and harder to devise self-documenting field names with only 10 characters to work with, which was the problem that RPG had for many years before IBM allowed for qualified data structures." Regular readers might also see some resemblance to requirement #10 in my aforementioned blog post <i><a href="http://iseriespriest.blogspot.com/2010/09/my-top-10-requirements-for-cl.html" target="_blank">Top Ten Requirements for CL Enhancements</a></i>, but of course it's been somewhat improved.</li>
<li><a href="http://community.common.org/powerbase/view/ideasIBM.htm?db=ideasIBM&Where=ID%20=%20216" target="_blank"><i>List Parameters and Variables in CL</i> #216</a>: "Problem: ...<span style="font-size: x-small;">(redundant verbiage redacted-see 2nd paragraph of this blog post)</span>... If you specify one list element you're OK, but that's rarely what is needed. Often times one needs to specify multiple list elements and you can never be sure how many will be needed at execution time. The current design of the command processing environment makes this difficult."</li>
</ul>
You will also be able to vote for these requests at the <a href="http://common.org/index.php/annualmeeting.html" target="_blank">COMMON Council of Anaheim</a> gathering next month. Unfortunately I won't be able to attend, but I will be there with you in spirit.<br />
<br />
In the name of the Corporation, the Power System, and holy "i", Amen.<br />
<ul>
</ul>Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-4301947050166886012012-04-11T22:45:00.000-04:002012-04-12T01:38:37.836-04:00Where in the name of Ib'm have I been...<br />
Greetings fellow worshipers of Ib'm and its most holy "i".<br />
<br />
I am writing today to explain my dearth of sermons of late, to expound on my general absence from the net-sphere (mostly blogs/Facebook/Twitter), and to make a confession of sorts. The truth be told my essays on this blog has been bereft because I have been submitting secular tomes for publication in another venue. The process of churning out said tomes, and other travails of life in 2011, has been arduous and has left little time for writing the free-wheeling missives that I've posted here over the years. While this state of affairs is rewarding, the blog, et al. has lain fallow.<br />
<br />
I'm unhappy with this situation to say the least and I'm going to be making a concerted effort to post more on the net in the future. It is the age-old problem, post theological treatises here so that they're freely available to all, for very little remuneration. -or- Submit other content to a profit-making journalistic organization, for personal monetary gain. As so often happens, subjects that would be perfect for this blog end up not getting written because the siren song of the <i>coin of the realm</i> is hard to resist.<br />
<br />
You might be asking yourself "which aforementioned organization does he shill for?" Well, to be blunt, my benefactor in this realm is the Penton Media Group, specifically System i News magazine, for whom I've written staid and professional sounding articles, tips, and (ironically) blog posts. Even more ironic is the fact that the writings on this particular blog that you're currently reading is what got me this great gig in the first place.<br />
<br />
If the next thing you're asking is "wait, I don't remember seeing anything written by Joe Code in the magazine or website", then you'd be correct. Father Joe Code is of course the <i>nom de plume</i> that I adopted for the purposes of anonymity when I first started out with the blog. I didn't know how people would react to someone writing theological treatises on the monotheistic worship of our most holy "i".<br />
<br />
<div style="float: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3F1A5UEcpSbITj-4MIRsbMHzEBW2lwtPMsd7LeNKNaGujMxjmIEziPz11y3eR-NV_eYLMncowvF9RjIL1S-9wuA7FqNfp06YrmWOnoY2NyfLZJRZe468W8XcDdJ6oMxb299sBbQ/s1600/HelloMyNameIsInigoMontoya.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Hello, my name is Inigo Montoya. You killed my father. Prepare to die." border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3F1A5UEcpSbITj-4MIRsbMHzEBW2lwtPMsd7LeNKNaGujMxjmIEziPz11y3eR-NV_eYLMncowvF9RjIL1S-9wuA7FqNfp06YrmWOnoY2NyfLZJRZe468W8XcDdJ6oMxb299sBbQ/s1600/HelloMyNameIsInigoMontoya.png" title="Hello, my name is Inigo Montoya. You killed my father. Prepare to die." /></a></div>
The more I wrote professionally the more the anonymity started becoming a hindrance to actually posting on the blog. Also, I couldn't comment on my articles. The most I would say about them was submitting a tweet saying "my friend and colleague has posted ..." on my Twitter feed. Of course doing so has had the unintended result that this supposed secret identity is now about as secret as Silverlake was back in the 80's.<br />
<br />
Believe it or not, the name <a href="http://www.catb.org/jargon/html/J/joe-code.html" target="_blank">Joe Code</a> actually came from the <a href="http://en.wikipedia.org/wiki/Jargon_File" target="_blank">Jargon File</a>. (Also, I liked the sound of "Father Joe" better than say, "Father Steve".) For the record, my real name is <a href="http://www.peterlevy.com/" target="_blank">Peter K. Levy</a> and I've been programming computers, first in college and then as a career, since late 1978. If you click the link on my name it will take you to my web site. There you can click on the "<a href="http://www.peterlevy.com/Writings.html" target="_blank">Writings</a>" link to view the secular articles that I've written to date.<br />
<br />
<span class="hw">The idea for an iSeries <a href="http://www.catb.org/jargon/html/P/priesthood.html" target="_blank">priest</a> also came from the Jargon File. I did and do feel as if we alone know how to write the words that make the bits flip, the numbers crunch, the disks spin, and the great waste of paper. We are the select few, who wear the cassocks of our high office; muttering prayers and incantations in languages that only we understand; to do the things that will impress the board of deacons, scare the lesser priests, and confuse the parishioners.</span><br />
<br />
<span class="hw">The dialect of this blog will not change. I am a proud and humble priest of the church of our lord Ib'm and its most holy "i". I will not shirk my responsibility to enliven the </span>ecclesiastic point of view<span class="hw"> that is so needed to enhance the meditative state necessary for enlightenment in our dank and fluorescent drenched cubicles.</span><br />
<br />
<span class="hw">Satire is important in all aspects of life and I should mention that in this blog I am not satirizing religion; I'm poking fun and satirizing our tendency as technicians to worship at the alter of one computer platform eschewing all other gods and idols. Many a flame war is the result of this tendency. We should all not judge those worshipers of false religions for they know not what they are missing out on.</span><br />
<br />
<span class="hw">Dominus</span>, <span class="hw">dominus</span>, dominus, you're all Ib'm-ists now. Bless your heathen souls. May the most holy "i" reign supreme forever or, at the very least, long enough until we can all retire. ;-)<br />
<br />
In the name of the Corporation, the Power System, and the holy "i", AmenFather Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-82217735618579368652011-05-13T22:38:00.006-04:002011-08-04T13:04:27.950-04:00I Use the Ib'm iIt seems that I've been forever reading blog, forums, articles, and tweets arguing one way or the other about what to call the latest incarnation of the pantheon that we all worship. It's gotten so bad that Cardinal <a href="http://www.scottklement.com/" target="_blank">Klement</a> had to write an <a href="http://systeminetwork.com/article/its-ibm-i-running-power-systems" target="_blank">encyclical</a> to set some ground rules as to the proper terminology. I've been watching this argument go on and on and on with no end in sight and I don't for a minute think that this blog post will put an end to the oodles of disk storage dedicated to its living spirit, but I do hope that this story might have some bearing on it.<br />
<br />
For years I was in the AS/400 camp. Meaning I was pissed off at our lord Ib'm for continually re-naming its liturgy and the damage it was continually causing to the AS/400 brand. That is, until I had a conversation with someone outside of our rarefied community. When he asked me what platform I worked on I told him it was the "Ib'm i". When he inevitably asked "what's that?" I told him it used to be called the AS/400. To which he asked: "Wasn't that the dinosaur platform that was supposed to be dead or dying?" I realized at that moment that the AS/400 brand was dead and it was never coming back. The whole world believes that the AS/400 is an old out-dated platform that is slowly withering away, like the HP 3000, or the DEC VAX.<br />
<br />
Yes, I know they're wrong, but in a way they're also right, because while the AS/400 platform is alive and well, it's the AS/400 <i>brand</i> that is a dead-end. It belongs to the world of 5250 terminals, Twin-axial cables, Token-Ring networks, SNA, and SNADS. A world dominated by libraries, physical & logical files, OPM, RPG-III, CLP, EPM-C, SEU, SDA, RLU, out-files, and Net.Data.<br />
<br />
Today there's a bright and shiny new <i>brand</i> that our lord Ib'm calls the "Power Systems running i", but since that's too much of a mouthful I like to use the much simplified version "Ib'm i". It belongs to a new world of PC clients, CAT5 cables, Ethernet & WiFi networks, TCP/IP, FTP, Apache, and NetServer. A world dominated by directories, relational databases (tables, indexes, views, triggers, constraints, etc.), SQL, ILE RPG (free-format), ILE CL, ILE C, C++, Java, API's, QSH, PASE, Eclipse, Rational, WebServices, XML, and PHP.<br />
<br />
We're on the cusp of a new dawn and if we play our cards right it will flower into a beautiful meadow. When the outside world is invited to sees how wonderful it really is they don't need to be reminded of the dusty over grown field behind them that was repeatedly sown with salt. I'm never going to say to anyone again that I work on an AS/400 and I encourage everyone who reads this to do the same. The "Power Systems running i" or "Ib'm i" is the platform I use.<br />
<br />
Say it with me now: "<b>I used to use the AS/400, yes that old dinosaur. It's true; it's gone, but it's been replaced by something better, something called the Ib'm i.</b>" Amen.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com6tag:blogger.com,1999:blog-10934028.post-42356545058122768122011-02-19T15:47:00.022-05:002011-06-07T23:26:20.748-04:00CL Program to Apply Technology Refresh PTFI had a deep sense of foreboding when I found that a HIPER PTF I downloaded came with technology refresh PTF <span style="font-family: "Courier New",Courier,monospace;">5770999-MF99002</span>. These things are a pain in the butt to apply as it requires one to do the following steps: <br />
<ol><li>Perform a full system save, like <span style="font-family: "Courier New",Courier,monospace;">GO<span style="font-family: Arial,Helvetica,sans-serif;"> </span>SAVE</span>, option 21. </li>
<li>Apply all microcode PTFs permanently.</li>
<li>Load the TR PTF<span style="font-family: "Courier New",Courier,monospace;"></span> and set it to be applied temporarily.</li>
<li>IPL the system.</li>
<li>Apply the TR PTF<span style="font-family: "Courier New",Courier,monospace;"></span> permanently.</li>
</ol>On our system there were two pre-requisite PTFs that were downloaded with <span style="font-family: "Courier New",Courier,monospace;">MF99002</span>; plus we already had a number of microcode PTFs that were set to be applied during the next IPL. I didn't want to permanently apply these new microcode PTFs, so I took the following steps:<br />
<ol><li>Unloaded the microcode PTFs set for delayed apply, except for those that were pre-requisites to <span style="font-family: "Courier New",Courier,monospace;">MF99002</span>.</li>
<li>Performed a full system save.</li>
<li>IPLed the system to apply the pre-requiste microcode PTFs.</li>
<li>Permanently applied all microcode PTFs.</li>
<li>Loaded <span style="font-family: "Courier New",Courier,monospace;">MF99002</span> and set it to delayed apply.</li>
<li>IPLed the system.</li>
<li>Permanently applied <span style="font-family: "Courier New",Courier,monospace;">MF99002</span>.</li>
<li>Loaded the rest of the microcode PTFs and set them to delayed apply.</li>
<li>IPLed the system.</li>
</ol>Our weekly "full system save and IPL" is full automated, so I needed some way to insert a CL program into this mix that would do the job. After finishing it I realized that others might be able to use it as well. It was designed to run in the <span style="font-family: "Courier New",Courier,monospace;">QSTRUPPGM</span> program, before it actually starts anything. It's assumed that the very first IPL, after the full system save, would first apply any PTFs that were pre-requisites of the TR PTF. All pending microcode PTFs to be applied, including the TR, would remain in a "Save file only" un-loaded state.<br />
<br />
After that first IPL it would find that the TR PTF wasn't loaded yet, so it would apply all microcode PTFs permanently, load the TR PTF, set it to delayed apply, and IPL. When the system came up again it would find that the TR PTF was applied. It would then permanently apply it, load the rest of the microcode PTFs sitting in <span style="font-family: "Courier New",Courier,monospace;">*SERVICE</span>, set them to be applied delayed, and IPL again.<br />
<br />
I've included the code below:<br />
<hr /><pre style="line-height: 1.1em;">/******************************************************************************/
/* Program....: APYTRPTF */
/* Description: Apply technology refresh PTF. */
/* Author.....: Joe Code */
/* Date.......: 02/18/2011 */
/* */
/* Create */
/* ------ */
/* CRTCLMOD DBGVIEW(*ALL) */
/* CRTPGM USRPRF(*OWNER) AUT(*EXCLUDE) */
/* CHGOBJOWN OBJTYPE(*PGM) NEWOWN(QSECOFR) */
/* GRTOBJAUT OBJTYPE(*PGM) USER(QPGMR) AUT(*USE) */
/* */
/* License */
/* ------- */
/* This library is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU Lesser General Public License as published by */
/* the Free Software Foundation; either version 2.1 of the License, or (at */
/* your option) any later version. (Unlike the normal GNU GPL, the "lesser" */
/* GPL allows libraries to be used in commercial/proprietary software.) */
/* */
/* This library is distributed in the hope that it will be useful, but */
/* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT- */
/* ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General */
/* Public License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with this library; if not, write to the Free Software Foundation, */
/* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
/* (http://www.gnu.org/licenses/lgpl.html#SEC3) */
/******************************************************************************/
PGM
COPYRIGHT TEXT('Copyright (c) 2011 Joe Code')
DCL VAR(&COUNT) TYPE(*DEC) LEN(3 0)
DCL VAR(&ERROR) TYPE(*LGL) VALUE('0')
DCL VAR(&RCVVARLEN) TYPE(*INT) LEN(4) VALUE(131)
DCL VAR(&PTFINFO) TYPE(*CHAR) LEN(50)
DCL VAR(&PTFID) TYPE(*CHAR) LEN(7) STG(*DEFINED) DEFVAR(&PTFINFO 1)
DCL VAR(&PRODID) TYPE(*CHAR) LEN(7) STG(*DEFINED) DEFVAR(&PTFINFO 8)
DCL VAR(&RLSLVL) TYPE(*CHAR) LEN(6) STG(*DEFINED) DEFVAR(&PTFINFO 15)
DCL VAR(&CCSID) TYPE(*INT) LEN(4) STG(*DEFINED) DEFVAR(&PTFINFO 21)
DCL VAR(&CLSPTFF) TYPE(*CHAR) LEN(1) STG(*DEFINED) DEFVAR(&PTFINFO 25)
DCL VAR(&RESERVED) TYPE(*CHAR) LEN(25) STG(*DEFINED) DEFVAR(&PTFINFO 26)
DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(131)
DCL VAR(&BYTESRTN) TYPE(*INT) LEN(4) STG(*DEFINED) DEFVAR(&RCVVAR 1)
DCL VAR(&BYTESAVL) TYPE(*INT) LEN(4) STG(*DEFINED) DEFVAR(&RCVVAR 5)
DCL VAR(&LOADEDSTS) TYPE(*CHAR) LEN(1) STG(*DEFINED) DEFVAR(&RCVVAR 41)
DCL VAR(&IPLACTION) TYPE(*CHAR) LEN(1) STG(*DEFINED) DEFVAR(&RCVVAR 66)
MONMSG MSGID(CPF0000 CEE0000 MCH0000) EXEC(GOTO CMDLBL(ERROR))
QSYS/CHKOBJ OBJ(QGPL/APYTRPTF) OBJTYPE(*DTAARA)
MONMSG MSGID(CPF9801) EXEC(QSYS/CRTDTAARA DTAARA(QGPL/APYTRPTF) +
TYPE(*DEC) LEN(3 0) VALUE(0) TEXT('Stop infinite loop if error +
applying TR PTF.'))
QSYS/RTVDTAARA DTAARA(QGPL/APYTRPTF) RTNVAR(&COUNT)
CHGVAR VAR(&COUNT) VALUE(&COUNT + 1)
QSYS/CHGDTAARA DTAARA(QGPL/APYTRPTF) VALUE(&COUNT)
CHGVAR VAR(&PTFID) VALUE('MF99002')
CHGVAR VAR(&PRODID) VALUE('5770999')
CHGVAR VAR(&RLSLVL) VALUE('V7R1M0')
CHGVAR VAR(&CCSID) VALUE(0) /* Use job's CCSID. */
CHGVAR VAR(&CLSPTFF) VALUE('0') /* Close PTF files afterwards. */
CHGVAR VAR(&RESERVED) VALUE(' ')
QSYS/CALL PGM(QSYS/QPZRTVFX) PARM(&RCVVAR &RCVVARLEN &PTFINFO +
'PTFR0100' X'00000000')
SELECT
WHEN COND(&BYTESRTN < &RCVVARLEN *OR &BYTESAVL < &RCVVARLEN) +
THEN(QSYS/SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('No data +
returned') TOPGMQ(*PRV (*PGMBDY)) MSGTYPE(*ESCAPE))
WHEN COND(&LOADEDSTS = '0') THEN(DO) /* Not loaded? */
IF COND(&COUNT = 1) THEN(DO)
QSYS/APYPTF LICPGM(5770999) APY(*PERM)
MONMSG MSGID(CPF3660) /* No PTFs identified. */
QSYS/LODPTF LICPGM(5770999) SELECT(MF99002)
QSYS/APYPTF LICPGM(5770999) SELECT(MF99002) DELAYED(*YES)
QSYS/PWRDWNSYS OPTION(*IMMED) RESTART(*YES) IPLSRC(B)
ENDDO
ENDDO
WHEN COND(&LOADEDSTS = '1') THEN(DO) /* Loaded, but not applied? */
IF COND(&COUNT = 1) THEN(DO)
QSYS/APYPTF LICPGM(5770999) APY(*PERM)
MONMSG MSGID(CPF3660) /* No PTFs identified. */
IF COND(&IPLACTION = '0') THEN(QSYS/APYPTF LICPGM(5770999) +
SELECT(MF99002) DELAYED(*YES)) /* IPL action isn't set? +
Then set it. */
QSYS/PWRDWNSYS OPTION(*IMMED) RESTART(*YES) IPLSRC(B)
ENDDO
ENDDO
WHEN COND(&LOADEDSTS = '2') THEN(DO) /* Temporarily applied? */
IF COND(&COUNT = 2) THEN(DO)
QSYS/APYPTF LICPGM(5770999) SELECT(MF99002) APY(*PERM)
QSYS/LODPTF LICPGM(5770999)
MONMSG MSGID(CPF35A8) /* No PTFs to be loaded. */
QSYS/APYPTF LICPGM(*ALL) DELAYED(*YES)
MONMSG MSGID(CPF3660) /* No PTFs identified. */
QSYS/PWRDWNSYS OPTION(*IMMED) RESTART(*YES) IPLSRC(B)
ENDDO
ENDDO
ENDSELECT
RETURN
/******************************************************************************/
/* */
ERROR: /* Global error handling section. */
/* */
/******************************************************************************/
IF COND(&ERROR) THEN(RETURN) /* Prevents an infinite loop if an error */
CHGVAR VAR(&ERROR) VALUE('1') /* occurs within the error handling section. */
QSYS/SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Unexpected error +
occurred. See previous messages') TOPGMQ(*PRV (*PGMBDY)) MSGTYPE(*ESCAPE)
ENDPGM
</pre><hr />On our small system this program added an extra two hours to the normal weekend backup/IPL. The only problem I ran into was that the microcode PTFs that I removed weren't loaded again. Apparently when you permanently remove a microcode PTF, it's also removed from the list of "*ALL PTFs in *SERVICE", meaning they can't be loaded when you specify LODPTF DEV(*SERVICE) SELECT(*ALL). You have to specifically name them in the SELECT parameter. Next week when I do this again I am going to load all of the microcode PTFs and leave the delayed apply flags shut off. (Except of course for the TR PTF's pre-requisites.)<br />
<br />
Looking at the program again this morning I realized that if there was a subtle problem with applying the TR PTF then it might cause an infinite loop of IPLing, which would be very bad. I've since changed the program to include a safety valve in the form of a data area used to count the number of IPLs. If the count doesn't match up with what is supposed to happen then it doesn't do anymore IPLs. This amended version of the program compiles, but I haven't tested it yet. If you want to wait, it will be tested again next weekend when I apply the TR PTF to another system in our network. I will update this post with the results.<br />
<br />
<b>Update (2011-02-28)</b>: This version of the program did it's job and applied the TR PTF without error.<br />
<br />
<b>Update (2011-06-07)</b>: IBM has since issued PTFs to make this task easier, so it would seem that the program above is obsolete.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-28163407139127315002011-01-03T00:15:00.002-05:002011-01-03T00:20:57.623-05:00Parallel LinesHad kind of a wild ride with this one liturgical conundrum, but I think it's resolved now. It was deep, but the ultimate solution was very simple.<br />
<br />
The main program is written in ILE RPG and it does all of it's I/O using SQL. The main result set consists of multiple sub-selects that are <span style="font-family: "Courier New",Courier,monospace;">UNION</span>ed together into one giant pile. In the <span style="font-family: "Courier New",Courier,monospace;">WHERE</span> and <span style="font-family: "Courier New",Courier,monospace;">HAVING</span> clauses of most of these sub-selects it utilizes a user defined function (UDF) that does some data massaging.<br />
<br />
This all ran perfectly fine on v5.4 of i5/OS, but after the upgrade to v7.1 of IBM i the job started behaving strangely. Sometimes it would work fine. Sometimes it would run inside the first <span style="font-family: "Courier New",Courier,monospace;">FETCH</span> statement all day long and take up huge amounts of CPU. Other times the UDF would function check because of invalid data in the strangest places, like on the <span style="font-family: "Courier New",Courier,monospace;">RETURN</span> statements.<br />
<br />
To try and stem the function checking I added <span style="font-family: "Courier New",Courier,monospace;">MONITOR</span>/<span style="font-family: "Courier New",Courier,monospace;">ENDMON</span> blocks to all of the <span style="font-family: "Courier New",Courier,monospace;">RETURN </span>statements in the UDF. When an error occurred they would return <span style="font-family: "Courier New",Courier,monospace;">*LOVAL</span> instead. Then it started function checking on the statements that were calling the functions with the aforementioned function checking <span style="font-family: "Courier New",Courier,monospace;">RETURN</span> statements. It was very weird.<br />
<br />
Over a two month period I was sending all kinds of traces, <span style="font-family: "Courier New",Courier,monospace;">SERVICEDOCS</span>, and job logs to Ib'm support angels. The last thing we did was set up a job watcher in iDoctor and the output found that when the <span style="font-family: "Courier New",Courier,monospace;">FETCH</span> was looping and it was doing so in one of the functions in the UDF. That's when they asked me if it the service program was specified to support multi-threading.<br />
<br />
Doh!<br />
<br />
As it turns out the SQL to create the functional stubs that called the RPG service program functions defaulted to <span style="font-family: "Courier New",Courier,monospace;">PARALLEL</span> while the program did not. So remember, if you're writing (or have written) an SQL UDF in a language other than SQL, don't forget that you might have to make your program or service program multi-thread capable. In RPG it means adding the keyword <span style="font-family: "Courier New",Courier,monospace;">THREAD</span> to the control specifications (aka H-specs) with either the <span style="font-family: "Courier New",Courier,monospace;">*CONCURRENT</span> or <span style="font-family: "Courier New",Courier,monospace;">*SERIALIZE</span> attribute. (<span style="font-family: "Courier New",Courier,monospace;">THREAD(*CONCURRENT)</span> did the trick for me.) Be sure also to thoroughly read the sections in the RPG and SQL manuals on multi-threaded processing.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-33338089591097611412010-11-26T23:49:00.009-05:002010-12-20T20:55:23.699-05:00Influencing the HeavensWhile it's a lot of fun hanging out with fellow priests discussing liturgy, I think the most fun I've ever had was walking the hallways of <a href="http://en.wikipedia.org/wiki/IBM_Rochester" title="IBM, 3605 Highway 52 North, Rochester, MN" target="_blank">mecca</a> itself and getting to talk to the angels and minions of our lord Ib'm. (Especially building 20, which is a football field size room filled with our lord's most holy systems.) It's also very satisfying to know that you've had an influence in such an august environment. My instance of influence was tiny, but no less satisfying.<br />
<br />
My support angel had arranged it all. I gave him a list of the subjects and problem areas I wanted to discuss and he set up all of the meetings. What I remember most clearly is that every angel or minion that I met said something along the lines of "this is great, we never get to speak to our ministerial brethren." After awhile I started to conclude that our lord Ib'm made it an unspoken policy to keep them all in darkness writing code away from the light of earthly interaction.<br />
<br />
I talked to a lot of people that day and it was a whole lot of years ago, so I don't remember everything that was discussed or every person I met. I do remember speaking to angels and minions involved with PTFs, command definitions, message handling, journaling, work management, CL programming, and request message processing. There are several salient areas that stood out.<br />
<br />
The Command Definition angel actually remembered my name because he'd worked on a lot of the PMR's I'd opened over the years. When I thought about it later I figured he was probably also the one that I had argued with on the phone for over an hour about a fix to command prompting that was made on the AS/400, but wasn't done quite as well on the System/38. (If you're reading this now, I'm sorry about that.)<br />
<br />
At one point I walked past some cubicles talking with another minion when the hairiest angel I'd ever seen poked his head above the wall and exclaimed "you're a priest? I've never seen a priest before." (It was the theme du jour.) I felt a small pang of jealously because I of course had to cut my hair to get a job. He seemed so happy to see me I had to go over and shake his hand. He said he wrote microcode and judging from his appearance and general demeanor I have to admit that I wasn't the least bit surprised. I'll bet his code was tighter than most.<br />
<br />
We'd been having a problem with <a href="http://www.visionsolutions.com/products/High-Availability-MIMIX.aspx" target="_blank">Mimix</a>ing file records to another system. We were using commitment control and therefore everything was journaled, but we were only Mimixing a small subset of files to the other system. Consequently when Mimix was plowing through the journal receivers looking for something to replicate, it got down deep into the microcode, took over the CPU, and didn't come up for air very often. (The minions of our lord Ib'm closed my APAR on that issue as "working as designed".)<br />
<br />
At that time a file could only be attached to one journal at a time and one of the requests I'd made of the journaling angel was for the ability to attach a file to more than one journal. With this feature we could journal those files being Mimixed to a 2nd journal and Mimix could then plow through that secondary journal and not take over the system. He said he thought it was a good idea, but he wouldn't say when or if it would ever be available.<br />
<br />
In a subsequent release that feature was made available. However with that release the AS/400 also supported two-phase commit and this new feature was a side-effect of that support, so I can't say that I had any influence on the decision. The journaling angel probably knew this support was coming, but wasn't able to reveal it to me at that time.<br />
<br />
I also remember speaking to an angel who was responsible for CL and Request Processing. I had designed a lot of applications that processed sub-file options using commands, so every program was a request processor similar <span style="font-family: "Courier New",Courier,monospace;">QCL</span> or <span style="font-family: "Courier New",Courier,monospace;">QCMD</span>. The problem I was having was that some commands had password parameters and I wasn't able to hide the parameter's contents using the <span style="font-family: "Courier New",Courier,monospace;">QCMDEXC</span> API in my request processors.<br />
<br />
I asked him if a CL API could be created where I'd give it the message ID of a logged request message and it would handle the execution, prompting, and redaction of sensitive data. He too said he thought it was a good idea, but of course wouldn't commit to it. In a future release the <span style="font-family: "Courier New",Courier,monospace;">QCAPCMD</span> API appeared and it was exactly what I needed to resolve my issue. Of course that API does a great many different things with various CL environments so I can't be sure that my request had any influence.<br />
<br />
The only request I made during that visit where I'm absolutely sure I had a direct influence was with the crew of Work Management minions that I met with. Unlike everyone else in the building they were all wearing ties. I couldn't resist asking them if their manager had made them put them on for my visit and they sheepishly admitted that he had. Meeting with them was fun and afterwards they took me on a tour of the fabled building 20.<br />
<br />
One of the Work Management problems my shop was having was with duplicate job names. An operator would enter <span style="font-family: "Courier New",Courier,monospace;">WRKJOB MYUSERID/MYJOBNAME</span> and the system would send 25 or 50 messages listing all of the jobs whose name and user ID were <span style="font-family: "Courier New",Courier,monospace;">MYUSERID/MYJOBNAME</span>. Then they'd have to search through the job log and write down the job number (this was in the age of dumb tubes, so copy/paste wasn't possible) and enter it on the command to view the job. Since the messages didn't say anything about when those jobs had been started the operators would invariably pick the wrong job number, and so they'd have go through the list again and pick another one, and on, and on, ad infinitum. It was a pain in the butt.<br />
<br />
The three of them didn't think there were any good solutions for this issue given how the commands were already set up. I asked if it was possible that when there were duplicate jobs the command could display a screen where the user could select the job they wanted from a list. One of them exclaimed "Oooh! That's a good idea" and immediately wrote it down. In the very next release the <span style="font-family: "Courier New",Courier,monospace;">DSPJOB</span> and <span style="font-family: "Courier New",Courier,monospace;">WRKJOB</span> commands both had a new parameter named <span style="font-family: "Courier New",Courier,monospace;">DUPJOBOPT</span> (Duplicate Job Option) whose default value was <span style="font-family: "Courier New",Courier,monospace;">*SELECT</span>. It's the only change to the system where I'm absolutely sure I had an influence.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-53053753143963444412010-11-21T00:35:00.007-05:002010-11-21T00:53:14.441-05:00ILE RPG %ALLOC() Built-in Function Can Fail with CEE0808I had an interesting problem with the ILE RPG <span style="font-family: "Courier New",Courier,monospace;">%ALLOC()</span> built-in function recently. In one particular spot in a single program, whenever I tried to allocate some storage it failed with <span style="font-family: "Courier New",Courier,monospace;">CEE0808</span> (requested storage size is not valid). The help text on the message said that the storage to be allocated was a negative number, but since it was a four byte unsigned integer that was impossible. Debugging it also showed that it was only trying to allocate a little over 3,100 bytes, so there was no issue with a signed number mapping over a huge unsigned number and mistaking it for a negative.<br />
<br />
Searching on this message in our lord Ib'm's support site found v7.1 APAR <a bitly="BITLY_PROCESSED" href="https://www-304.ibm.com/jct01003c/support/docview.wss?rs=0&context=SWG60&dc=DB550&uid=nas28fe940d8d38994ab8625778b003cbe66&loc=en_US&cs=utf-8&lang=" target="_blank"><span style="font-family: "Courier New",Courier,monospace;">SE44538</span></a>, which fixed several problems with the RPG compiler. One of them resolved an anomaly where <span style="font-family: "Courier New",Courier,monospace;">%ALLOC()</span> failed with <span style="font-family: "Courier New",Courier,monospace;">CEE0808</span> in programs that were optimized with <span style="font-family: "Courier New",Courier,monospace;">*FULL</span>, which my program was. The fixing PTF is <span style="font-family: "Courier New",Courier,monospace;">5770WDS-<a bitly="BITLY_PROCESSED" href="http://www-01.ibm.com/support/docview.wss?uid=nas37c5b8ef50cde00308625779a006ead59" target="_blank">SI41005</a></span>, which will require any problem programs to be re-compiled. There is a run-time PTF too that is a pre-requisite: <span style="font-family: "Courier New",Courier,monospace;">5770SS1-<a bitly="BITLY_PROCESSED" href="http://www-912.ibm.com/a_dir/as4ptf.NSF/b3cb9d42f672b70f86256739004afa0f/e9511209719a684e8625779a006ead4d?OpenDocument" target="_blank">SI41000</a></span>.<br />
<br />
It's not on any cum or group packs yet and it fixes several problem, not just mine. The text of the APAR makes it look like it's a hot fix (if not HIPER), so whether you use this built-in function or not you might want to download it.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-39987818714943302072010-10-31T16:03:00.021-04:002010-11-11T16:29:39.055-05:00Heads up for Those Installing v7.1This is a heads up to any priest or lay operator planning to install v7.1 with cumulative PTF package <span style="font-family: "Courier New",Courier,monospace;">C0229710</span> (or above). There is a chance that the initial IPL to apply <span style="font-family: "Courier New",Courier,monospace;">5770999-MF99001</span> (required technology refresh) could fail with SRC <span style="font-family: "Courier New",Courier,monospace;">B600-0102</span>. You would then be forced to drive to work and slip install LIC from your physical media.<br />
<br />
Our lord Ib'm's support angels have instructed that one must first load PTF <span style="font-family: "Courier New",Courier,monospace;">5770SS1-SI40878</span> from the HIPER group CD image and apply it immediately. Then load PTF <span style="font-family: "Courier New",Courier,monospace;">5770999-MF50003</span> from the cumulative PTF package (currently superseded by <span style="font-family: "Courier New",Courier,monospace;">MF50836</span> in the HIPER group PTF <span style="font-family: "Courier New",Courier,monospace;">SF99709</span>), set it to apply delayed, and IPL the system.<br />
<br />
When the system comes up you can start installing the PTF package again. Be forewarned that your attempt to load it will result in a failure message, but this is probably nothing to be alarmed about. View previous messages and most likely you'll find that it'll be because the system wants you to IPL now to install the <span style="font-family: "Courier New",Courier,monospace;">MF99001</span> PTF before anything else. Once this technology refresh PTF along with its pre and co-requisites have been applied you can continue loading and applying the rest of the cumulative PTF package. (Be sure the "initialize system is complete" message has been sent to <span style="font-family: "Courier New",Courier,monospace;">QSYSOPR</span> before IPLing the 2nd time.)<br />
<br />
I was very surprised that none of this was in the <a bitly="BITLY_PROCESSED" href="http://www-912.ibm.com/s_dir/sline003.nsf/2d3aff1c6b4d6ce086256453000d971e/f7c58524201bd6d18625770a005dc2f9?OpenDocument" target="_blank">instructions for the cumulative PTF package</a>. I think it would behoove our lord Ib'm if at the very least its minions added this information to the <a bitly="BITLY_PROCESSED" href="http://www-912.ibm.com/s_dir/sline003.nsf/2d3aff1c6b4d6ce086256453000d971e/da65fa217203e8a886257706005073b7?OpenDocument" target="_blank"">cumulative PTF package PSP document</a> as a heads up. For more information on the technical refresh PTF see this document: <a bitly="BITLY_PROCESSED" href="http://www-912.ibm.com/8625680A007CA5C6/1AC66549A21402188625680B0002037E/8B6761F2009EBA09862577A200502EAE" target="_blank">FAQ for Technical Refresh for R710</a>.<br />
<br />
<b>Update (Nov 11, 2010)</b>: The minions of our lord Ib'm have "re-saved" (or re-spun) the <span style="font-family: "Courier New",Courier,monospace;">I_BASE_01</span> <abbr title="Licensed Internal Code">LIC</abbr> installation disk, so that it now contains the <span style="font-family: "Courier New",Courier,monospace;">5770999-MF99001</span> technology refresh, among other things. They're designating it as <span style="font-family: "Courier New",Courier,monospace;">RS-710-B</span>. The above problems I experienced installing v7.1 on two separate systems were presumably because I was using the re-save designated as <span style="font-family: "Courier New",Courier,monospace;">RS-710-A</span>, but that hasn't been proven. In any case, anyone upgrading to v7.1 is advised to install from the new re-save disk as it will probably save some headaches. For more information see this web page: <a href="http://www-947.ibm.com/systems/support/i/planning/resave/v7r1.html" target="_blank">IBM i Resaves</a>.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com4tag:blogger.com,1999:blog-10934028.post-30313149631143342172010-10-12T23:55:00.009-04:002010-10-15T10:34:18.429-04:00Bug in Websphere Application Server v7.0 MigrationThis is a heads-up to all worshipers of our Lord Ib'm who also use the Java liturgy known as "Websphere Application Server" (WAS) -and- who are intending to migrate their applications to WAS v7.0.<br />
<br />
Our parish was using WAS v6.0 and we intended to upgrade the most holy O/S to v7.1. The "<a href="http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/topic/rzaq9/rzaq9.pdf" target="_blank" title="After the PDF opens search for 'Application Server V6.0'">Memo to Users</a>" encyclical warned us that WAS v6.0 wasn't supported under O/S v7.1. It does support WAS v6.1 and v7.0, so we decided to load the latest WAS version since it had been out for quite a while now.<br />
<br />
The migration process steps themselves are actually very easy. All you have to do is execute a pre-migration script for all of the instances (or profiles) with applications you'll be moving over. Then create matching profile names (with different blocks of port numbers) in the new version of WAS. Then you do a post-migration and -viola- it's done and it works. (Amazing!)<br />
<br />
Except in our case there was one problem with one of the application not "deploying" to the new version of WAS. I opened a PMR with the support minions of our Lord Ib'm and they requested all manner of logs. Then they had me zip up the pre-migration directory and send that in too.<br />
<br />
It turned that the offending application had single-quote(') characters in its description and the pre-migration script had unwittingly embedded a syntax error in the Jython code it had written. When the post-migration ran, it encountered the syntax problem and stopped the deployment for that application.<br />
<br />
The pre-migration should have "<a href="http://books.google.com/books?id=VnGkf92gQh4C&pg=PA33&q="\'+Single+quote(')"" target="_blank" title="Jython Essentials by Samuele Pedroni and Noel Rappin">escaped</a>" those single-quote(') characters in the description. The Ib'm minions manually corrected the Jython code and sent it back to me with instructions on how to run it. Thank the Lord Ib'm that my prayers to the support minions were heard because the corrected Jython code ran fine and deployed the problematic application.<br />
<br />
This problem with the Jython code generation is corrected in <a href="http://www-01.ibm.com/support/docview.wss?uid=swg27004980#ver70" target="_blank" title="Recommended fixes for WebSphere Application Server">v7.0.0.13</a> of WAS which is scheduled to be released for general availability on Oct 25th, 2010. If you have single-quote(') character(s) in the description(s) of your application(s) you should either remove them, or wait until you've had a chance to install that update to WAS, before attempting the migration.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-78428133263051495342010-10-05T18:22:00.005-04:002010-10-06T23:35:13.899-04:00Special *NULL CL Value Undocumented Since v6.1We've all heard about the <span style="font-family: "Courier New",Courier,monospace;">*NULL</span> special value in ILE RPG. It's a nifty little item associated with pointer fields. You can use it to assign <span style="font-family: "Courier New",Courier,monospace;">*NULL</span> to a pointer field or in a conditional statement to test if a pointer is null. Did you know that CL has had a <span style="font-family: "Courier New",Courier,monospace;">*NULL</span> special value since v6.1? I didn't know about it because it doesn't appear anywhere in the v6.1 or v7.1 Information Center. Nor does it appear in the PDF formatted version of the CL Programming Concepts Guide. I only learned about it recently and am a little embarrassed to admit that I had included a "<span style="font-family: "Courier New",Courier,monospace;">*NULL</span> Special Value" as one of <a bitly="BITLY_PROCESSED" href="http://iseriespriest.blogspot.com/2010/09/my-top-10-requirements-for-cl.html" target="_blank">My Top 10 Requirements for CL Enhancements</a>.<br />
<br />
I currently have a <a href="http://iseriespriest.blogspot.com/2010/09/ile-cl-does-something-weird.html" target="_blank">PMR</a> open with the support minions of our lord Ib'm for v7.1 concerning un-initialized pointer variables containing errant data at start-up time. (The problem doesn't occur on v5.4.) This has lead them to open an APAR <span style="font-family: "Courier New",Courier,monospace;">SE45175</span> which they said would be closed as PE (Programming Error). This is only related to the subject at hand because at one point I let the support minion know that I wouldn't have even known about this problem if CL had some kind of <span style="font-family: "Courier New",Courier,monospace;">*NULL</span> special value like RPG currently has. He passed this comment to the saints of development and they responded that it actually did and it's had it since v6.1. They even included a little program I could compile to prove it.<br />
<br />
After proving it I immediately re-scoured the "What's New in CL" sections of the Information Center for v6.1 and v7.1, but couldn't find anything. Then I searched the CL sections for both releases, but came up with nada. The support minion also searched through the Info Center and like me came up empty handed. He's since notified the powers that be to get that fixed but we might not see it documented until the next release.<br />
<br />
I also asked around and fellow high priest Father Jerome Hughes was kind enough to pass along this link to a <a href="http://www.omniuser.org/Downloads/CL%20Enhancements-V5R3%20V5R4%206.1%20and%207.1.PPT" target="_blank">Power-Point</a> presentation given by Ib'm saint Guy Vig at an <a href="http://www.omniuser.org/downloads.html#cat3" target="_blank">Omni User Group </a> ecumenical dinner. Discussion of the <span style="font-family: "Courier New",Courier,monospace;">*NULL</span> value can be found on slides 93 & 94.<br />
<br />
In any case here's the small program that the saints of development passed onto me:<br />
<pre>PGM
DCL VAR(&PTR1) TYPE(*PTR) ADDRESS(*NULL)
DCL VAR(&CHAR1) TYPE(*CHAR) LEN(1)
CHGVAR VAR(&PTR1) VALUE(%ADDR(&CHAR1))
CHGVAR VAR(&PTR1) VALUE(*NULL)
IF (&PTR1 *EQ *NULL) THEN(DO)
SNDPGMMSG MSG('The pointer is null')
ENDDO
ENDPGM
</pre>As you can see <span style="font-family: "Courier New",Courier,monospace;">*NULL</span> can be used to initialize declarations (<span style="font-family: "Courier New",Courier,monospace;">DCL</span>) assignments (<span style="font-family: "Courier New",Courier,monospace;">CHGVAR</span>) and in conditional statements (<span style="font-family: "Courier New",Courier,monospace;">IF</span>).<br />
<br />
<b>UPDATE</b> (10/06/10): Here's something pretty interesting. On a lark I compiled the program to <span style="font-family: "Courier New",Courier,monospace;">TGTRLS(V5R4M0)</span>. I had to remove the <span style="font-family: "Courier New",Courier,monospace;">ADDRESS(*NULL)</span> parameter from the <span style="font-family: "Courier New",Courier,monospace;">DCL</span> statement, but other than that it compiled. I installed the program object to a v5.4 system and it ran exactly like it did on the v7.1 system. However when I FTPed the source to that system and compiled it the compile failed saying the "<span style="font-family: "Courier New",Courier,monospace;">*NULL</span>" was incompatible with the variable.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-22750996610570291652010-10-01T23:49:00.008-04:002010-10-06T09:43:16.973-04:00The Cult of Ib'm and the Most Holy iSeriesMy sermon today concerns the deeper meaning of the cult of Ib'm and the future of its most holy computer, the iSeries.<br />
<br />
By using the word "cult" I of course don't mean some fringe religion with only a few adherent, although we are slowly becoming that (but I digress). I mean it in the way of the ancients when they worshiped temporal objects that helped them survive and/or gave their lives meaning. For example, everyone knows that among the ancient Egyptians there was a cult of cat worship. It got its start, not top-down with prophets, visions, and visitations from the cat god, but bottom-up because it was the cats that kept the rodents in their grain stores under control.<br />
<br />
In a recent <a href="http://blogs.systeminetwork.com/isnblogs/maxedout/2010/09/plenty_of_i_action_out_and_abo.html" target="_blank">Maxed Out blog post</a> Chris Maxcer wrote, among other interesting things, that my blog is "not trying to disparage any religion". Of course he's right. There is no intended disparagement of any religions. If there are any computer geeks out there who are also adherents to the <a href="http://en.wikipedia.org/wiki/Abrahamic_religions" target="_blank">Abrahamic religions</a>, please do not be offended by my conflation of the language of said religions with this little cult of ours. Outside of work many of us have pledged our souls to a deity (or pantheon of deities) of our choice, but at work our hearts belong to the lord Ib'm and its most holy computer, the iSeries; for not only does it help us survive but it gives our lives meaning.<br />
<br />
Most of the readers of this blog are well versed in the worship our lord Ib'm and its most holy computer, but computer geeks everywhere generally are priests in the temples of other idols at the same time. Unlike its behavior in the distant past, Ib'm will no longer get wrathful and send down plagues upon your systems and withhold service when one worships idols. In fact, the minions of lord Ib'm should probably, if they're on the ball, redouble their efforts to get people away from those false religions.<br />
<br />
It's nice when all of the worlds religions can play nice together and be worshiped at once, but life isn't always like that. In an earlier time and much larger parish than my current one, we had several of the most holy AS/400s. We even had a System/36 -and- there was some worship of the Sun god, the ancient pagan rites of the Unix daemons, and the goddess Sybase. I personally had nothing against the worship of these pagan deities in my parish. After all, the nature worship that is Unix is almost as old as the <a href="http://en.wikipedia.org/wiki/IBM_Future_Systems_project" target="_blank" title="IBM Future Systems Project">F.S. Project</a> itself and both grew out of that ancient tradition of geekdom's distance past where the command line interface (CLI) held supreme.<br />
<br />
Eventually some new <a href="http://en.wikipedia.org/wiki/Pointy-haired_Boss" target="_blank" title="Pointy Haired Boss">PHB</a>'s came on board and without warning there was an inundation of adherents to the twin gods Hewlett and Packard, and their object of worship, the HPUX O/S. Along with HPUX came the twin Mephistopheles of Unix faith everywhere; I am of course speaking of the foul beasts Oracle and NT. The houses of worship for these deities did not hold the CLI in high regard. Theirs was a world of graphical user interfaces (GUIs) that mesmerized and held the bean counters in a trance such that they couldn't resist these temptations.<br />
<br />
The most high and benevolent Ib'm and his many saints and angels were powerless to stem the tide of GUI worship amongst my flock. The temples to both the Sun god and the Sybase goddess were destroyed. The small System/36 cult was suppressed and the iSeries became a minority cult among this new tide. Attendance at my parish shrank, until finally there was no parish anymore. I too was tempted to abandon my faith, but it would have meant becoming a novice again after so many years as a high priest, so I chose to remain an iSeries adherent, but that also meant moving on.<br />
<br />
As our lord Ib'm has taught us time and again, change happens, and we've all had to get used to that. I can't say that it's been easy watching this transition take place in our community. I attend the ecumenical conventions and I'm struck by how few young people are there. It appears that we are all aging out and that gives me pause. In addition the holy of hollies itself is slowly being inundated with more and more aspects of the pagan Unix cults. So much so that one day we may find that our beloved iSeries has become a pSeries.<br />
<br />
Our lord Ib'm makes the light of the truth of the most holy iSeries, but we are its keepers. We have it in our hands to rise up and perpetuate this calling that gives our lives meaning. We cannot wait for Ib'm to come down from on high and preach to the masses the benefits of our faith. That's not going to happen, so we have to do it ourselves. In the same Maxed Out post Chris also wrote that Bishops Paris and Gantner were out teaching RPG to some VB acolytes and they most certainly have garnered more than a few converts. (You can read their blog post on the subject here: <a href="http://ibmsystemsmag.blogs.com/idevelop/2010/09/good-news-in-i-land.html" target="_blank">Good News in i Land</a>.) Our counterparts in Japan have taken up the reins of proselytizing the iSeries to the unwashed masses and doing very well from what I've read. If we all do the same there is so much we could potentially accomplish not only for our benefit, but for future generations.<br />
<br />
Amen.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-82880981734100900202010-09-24T21:35:00.010-04:002010-10-25T14:49:29.609-04:00ILE CL Does Something WeirdA little background:<br />
<br />
In v5.4 CL doesn't have a special value of <span style="font-family: "Courier New",Courier,monospace;">*NULL</span> or any way of representing a null value as a literal. (This was for many years one of my <a bitly="BITLY_PROCESSED" href="http://iseriespriest.blogspot.com/2010/09/my-top-10-requirements-for-cl.html" target="_blank">bones</a> to pick with our gracious lord Ib'm, but I digress.) To get around this I created a <span style="font-family: "Courier New",Courier,monospace;">*PTR</span> field named <span style="font-family: "Courier New",Courier,monospace;">&NULLPTR</span> and I never changed it so that it always contained a null pointer. This way I could compare pointer fields to <span style="font-family: "Courier New",Courier,monospace;">&NULLPTR</span> to see if they were null.<br />
<br />
A CL module of mine contains a <span style="font-family: "Courier New",Courier,monospace;">&NULLPTR</span> <span style="font-family: "Courier New",Courier,monospace;">*PTR</span> field. It was compiled last year under v5.4 and hard-linked into a couple of programs. The module has worked fine in both v5.4 and v7.1.<br />
<br />
Recently I had to change a couple of modules in one program, so I recompile them. This program also used the CL module, but that module didn't change. When I created the program I simply linked to the existing module object that was still stored in the source library that it was compiled into last year.<br />
<br />
The problem:<br />
<br />
For some reason when this same old hard-linked CL module is called within this re-created program, the <span style="font-family: "Courier New",Courier,monospace;">&NULLPTR</span> field isn't null anymore. It now contains a pointer, or at least it contains some kind of errant data. This causes the program to bomb out because when it tests for a null pointer the outcome of course turns out false when it should be true.<br />
<br />
If I create the program to run under v5.4 it bombs on v7.1 but not on v5.4. If I re-compile the CL module (to run under v5.4 or v7.1) then the problem goes away almost completely (that is, until you save and restore it to another system, then it start bombing again).<br />
<br />
The issue I have is that there are other modules compiled under v5.4 with <span style="font-family: "Courier New",Courier,monospace;">&NULLPTR</span> <span style="font-family: "Courier New",Courier,monospace;">*PTR</span> fields that might be re-linked into new programs in the future. I can't be sure the same thing isn't going to happen to them.<br />
<br />
I have sent prayers and made sacrifices to the patron saints of support that our lord Ib'm might provide insight as to what is going on. If you're having the same issue in your parish then please say a prayer for me and post a comment and let me know what you think.<br />
<br />
<b>Update</b> (10/25/2010): Our lord I'bm issued PTFs for this problem: v7.1: <span style="font-family: "Courier New",Courier,monospace;">SI41596</span>, v6.1: <span style="font-family: "Courier New",Courier,monospace;">SI41595</span>, and v5.4: <span style="font-family: "Courier New",Courier,monospace;">SI41594</span>.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com2tag:blogger.com,1999:blog-10934028.post-31686069256188282092010-09-05T23:49:00.017-04:002012-01-10T20:51:07.656-05:00My Top 10 Requirements for CL EnhancementsI've been noticing lately how our lord Ib'm, in its infinite wisdom, has seen fit to add many C-like features to the RPG language. There's even been talk of adding procedure overloading, which is a feature of O-O languages like C++. I, being a humble servant, am of course continually impressed by every improvement our most beneficent lord makes to RPG. Combining C-like functionality with the robust data/file handling features of RPG was a stroke of genius.<br />
<br />
On the other hand, CL had been lying fallow for many years, stuck in a functional rut reminiscent of RPG-II. Over a period of several releases it has gotten some improvements that now make it more or less reminiscent of RPG-III.<br />
<br />
Let's compare:<br />
<br />
<table border="1" cellpadding="2" cellspacing="2"><tbody>
<tr><th>Feature</th><th>Classic CL</th><th>Modern CL</th><th>RPG-II</th><th>RPG-III</th><th>RPG-IV</th></tr>
<tr><td>Conditional</td><td>✔</td><td>✔</td><td>✓<sup>1</sup></td><td>✔</td><td>✔</td></tr>
<tr><td>Looping</td><td></td><td>✔</td><td></td><td>✔</td><td>✔</td></tr>
<tr><td>Call Subroutines</td><td></td><td>✔</td><td>✔</td><td>✔</td><td>✔</td></tr>
<tr><td>Call Procedures</td><td></td><td>✓<sup>2</sup></td><td></td><td></td><td>✔</td></tr>
<tr><td>Include files</td><td></td><td>✔</td><td></td><td>✔</td><td>✔</td></tr>
<tr><td>Advanced Data Types</td><td></td><td></td><td></td><td></td><td>✔</td></tr>
<tr><td>Arrays</td><td></td><td></td><td>✔</td><td>✔</td><td>✔</td></tr>
<tr><td>Named constants</td><td></td><td></td><td></td><td>✔</td><td>✔</td></tr>
<tr><td>Expressions</td><td>✓<sup>3</sup></td><td>✓<sup>3</sup></td><td></td><td></td><td>✔</td></tr>
<tr><td>Data Pointers</td><td></td><td>✔</td><td></td><td></td><td>✔</td></tr>
<tr><td>Procedure Pointers</td><td></td><td></td><td></td><td></td><td>✔</td></tr>
<tr><td>Internal procedures</td><td></td><td></td><td></td><td></td><td>✔</td></tr>
<tr><td>Null field mapping</td><td></td><td></td><td></td><td></td><td>✔</td></tr>
</tbody></table>
<small>1-RPG-II didn't have <span style="font-family: "Courier New",Courier,monospace;">IF</span>/<span style="font-family: "Courier New",Courier,monospace;">ELSE</span> op-codes. Instead it had indicators, so while it did technically support conditional coding, it isn't exactly what most programmers have in mind.<br />
2-Calling procedures is only supported in ILE CL.<br />
3-Expressions are only supported in a few places, not everywhere. For instance you can't have an expression as one of the parameters in a built-in function like <span style="font-family: "Courier New",Courier,monospace;">%SST()</span>.</small><br />
<br />
I'm heartened by the fact that today CL also has support for data pointers and ILE function interfaces, which RPG-III never had. It bodes well that maybe, just maybe, CL might, over several releases, get some more of the same basic functionality that would make it reminiscent of RPG-IV.<br />
<br />
Towards this goal, and following in Brother Bob Cozzi's <a href="http://iseriespriest.blogspot.com/2009/10/brother-cozzis-top-ten-rpg-iv.html" target="_blank"">footsteps</a>, I'm laying out my top 10 items I'd like to see in ILE CL:<br />
<ol>
<li><b>Procedure pointers</b>: This is by far my number one annoyance. What were the minions of our lord Ib'm thinking when they gave us pointers but neglected procedure pointers? I used to envelope RPG programs with CL for file overrides. Now I find myself doing the opposite, enveloping CL programs with RPG, so that I can register abnormal termination procedures. (The latter can't be done in CL because it doesn't have a <span style="font-family: "Courier New",Courier,monospace;">*PPTR</span> type or a <span style="font-family: "Courier New",Courier,monospace;">%PADDR()</span> built-in function.)</li>
<li><b>Expressions everywhere</b>: This is my number two annoyance. Currently mathematical and string expressions are not allowed in the parameters of built-in functions and many commands. Why is that? It would be wonderful if I could code something like this: <span style="font-family: "Courier New",Courier,monospace;">CHGVAR VAR(&MYSTR) VALUE(%SST(&THATFIELD (&POS + &OFFSET) 10))</span>.</li>
<li><b><span style="font-family: "Courier New",Courier,monospace;">%PARMS()</span> built-in function</b>: I've been using the <span style="font-family: "Courier New",Courier,monospace;">CEETSTA()</span> (ILE Test Argument) function in CL modules to test whether a parameter has been omitted. If it wasn't passed then that function will get an error, which is a rather ugly way of doing things. It would be better if our most gracious lord Ib'm provided a <span style="font-family: "Courier New",Courier,monospace;">%PARMS()</span> built-in function.</li>
<li><b>Arrays</b>: I'm still trying to fathom how such a sophisticated scripting language has gone this long without any kind of array support. Prior to getting pointer support in CL I had to declare large fields, do a lot of calculating, and use <span style="font-family: "Courier New",Courier,monospace;">%SST()</span> functions. After wards I did the same calculations on large fields, but replaced the <span style="font-family: "Courier New",Courier,monospace;">%SST()</span> functions with pointers. Either way such machinations in CL can get really ugly. It'd be wonderful if a <span style="font-family: "Courier New",Courier,monospace;">DIM</span> parameter could be added to the <span style="font-family: "Courier New",Courier,monospace;">DCL</span> command. I also envision referencing the array elements with parentheses as is done in RPG: <span style="font-family: "Courier New",Courier,monospace;">&MYFIELD(1)</span>, <span style="font-family: "Courier New",Courier,monospace;">&THATFIELD(&I)</span>, etc.</li>
<li><b>Advanced data types</b>: When Cardinal Klement wrote an <a href="http://systeminetwork.com/article/how-cl-program-can-cope-floating-point" target="_blank">encyclical</a> on how to use the <span style="font-family: "Courier New",Courier,monospace;">CPYNV</span> MI instruction to convert floating-point data to decimal in CL, the minions of our lord Ib'm should have heard our prayers and provided support for advanced data types. That was back in '05; now it's '10 and our prayers have still gone unanswered. Basically anything that is supported by DB2 and the ILE CEE functions should be supported in CL. Not just floating point fields, but dates, times, timestamps, zoned decimal (especially for data structures), the larger decimals, and varying length fields too.</li>
<li><b>DB2 NULL field support</b>: I've been using null-capable fields now for quite a while and it's supremely annoying that I can't find out in CL whether fields just read in are null or not. In CL, is the <span style="font-family: "Courier New",Courier,monospace;">00.00.00</span> in a time field a null value or is it midnight? We can't know unless we have that support. I envision something similar to the <span style="font-family: "Courier New",Courier,monospace;">%NULLIND()</span> built-in function in RPG.</li>
<li><b><span style="font-family: "Courier New",Courier,monospace;">%CHAR()</span> built-in function</b>: Have you ever run an English statement through an English to French translator, then run the resulting French sentence through a French to English translator? Has the final result ever looked anything like what you originally put in? This problem also crops up with CL and the <span style="font-family: "Courier New",Courier,monospace;">CHGVAR</span> command. If you take a number stored in an alphanumeric variable, say "65", and assign to a 5,0 decimal variable it'll work fine. If you then take that decimal variable and move it back to the alphanumeric field it'll come out as "00065". This has always annoyed me. Over the years I've worked out various strategies to overcome this anomaly, but I was never completely satisfied with any of them. Recently I found the <span style="font-family: "Courier New",Courier,monospace;">CEE4JNTS</span> API and it works great, but it only works with an 8-byte integer, so numbers with decimal digits can't be converted. It would actually be perfect if the arc-angels of our lord Ib'm could perform a minor miracle and give us beleaguered IBM i faithful the <span style="font-family: "Courier New",Courier,monospace;">%CHAR()</span> built-in function that would work with not only decimal numbers, but all of the advanced data types.</li>
<li><b>Larger field names</b>: When RPG had 6 character field names I used to think that the 4 extra characters allowed in CL was a bonus. Now that RPG has joined the rest of the world's computer languages in allowing huge field names, the 10 character limitation in CL looks really out-dated. I've been using the larger names in RPG to write code that is more self-documenting, but it's pretty hard to do that in CL with only 10 characters at your disposal. Come on you minions of Ib'm, there's no reason that I can think of why CL can't have this support too.</li>
<li><b>Named constants</b>: Would be a very nice thing to have, especially in an include file that was copied in. It could be coded as: <span style="font-family: "Courier New",Courier,monospace;">DCL VAR(&MYCONST) TYPE(*CONST) VALUE('THIS VALUE')</span></li>
<li><b>Qualified fields</b>: CL already allows qualification of fields for files declared on <span style="font-family: "Courier New",Courier,monospace;">DCLF</span> commands so why not allow qualified fields on data structures too. It'd be relatively easy to add a new value to the <span style="font-family: "Courier New",Courier,monospace;">STG</span> parameter. One would code it thus: <span style="font-family: "Courier New",Courier,monospace;">DCL VAR(&MYSUBFIELD) TYPE(*CHAR) STG(<b>*QUALDEF</b>) LEN(10) DEFVAR(&MYFIELD 15)</span> and the field would be referenced as <span style="font-family: "Courier New",Courier,monospace;">&MYFIELD_MYSUBFIELD</span> just as record format fields are referenced now.</li>
</ol>
Bonus items. Not part of the top ten, but would be nice to have:<br />
<ol>
<li><b>Type definition (<span style="font-family: "Courier New",Courier,monospace;">typedef</span>, <span style="font-family: "Courier New",Courier,monospace;">TEMPLATE</span>, <span style="font-family: "Courier New",Courier,monospace;">LIKE()</span>, or <span style="font-family: "Courier New",Courier,monospace;">LIKEDS()</span>) support</b>: Really makes include files that much more useful if there's Type Definition support built into CL. One could create a template definition in the include file and have it referenced to declare actual variables. I haven't worked out all the kinks in my hypothesis yet because the way in which data structures are defined in CL and other languages are fundamentally different.</li>
<li><b>Commands for procedures</b>: Currently if a CL is calling a program with the <span style="font-family: "Courier New",Courier,monospace;">CALL</span> command you could instead write a command to call the program. It would help document the program's parameters and through help text would document the command itself. Why can't we do the same with procedures called with <span style="font-family: "Courier New",Courier,monospace;">CALLPRC</span>? It would provide the same documentation benefits and it could conceivably be relatively easy to implement. The commands that call procedures would only be allowed in CLLE programs. While commands that call programs would be needed at run-time to resolve the parameters and call the program. Commands that call procedures would only be needed at compile and program creation time to resolve the linkages and parameters. The <span style="font-family: "Courier New",Courier,monospace;">CRTCMD</span> command would have to be changed to allow service programs and the procedure within to be named as the C.P.P. The only issues to work out are how the parameter passing and the optional return value would be defined. The <span style="font-family: "Courier New",Courier,monospace;">PARM</span> definition statement could be enhanced to specify pass-by-reference, pass-by-value, or pass-by-reference-const. As to the return value I envision adding a parameter to the <span style="font-family: "Courier New",Courier,monospace;">CMD</span> definition statement to define it. Having a return value would allow these commands to appear in expressions, albeit inside a set of parentheses. If these commands appeared outside of expressions, like any other normal command, then the CL program would ignore the return value.</li>
<li><b>Procedure prototyping</b>: If we can't get commands for procedures then I'd settle for procedure prototyping similar to what is done to prototype programs and procedures in ILE RPG. It would save a lot of headaches.</li>
<li><b>Internal procedures</b>: Just like any other procedure based computer language, being able to define procedures in the same module would be an awesome addition to the CL pantheon. The <span style="font-family: "Courier New",Courier,monospace;">PGM</span> and <span style="font-family: "Courier New",Courier,monospace;">ENDPGM</span> statement would still be used to define the entry point of the program and the procedures would appear following the <span style="font-family: "Courier New",Courier,monospace;">ENDPGM</span> statement. I envision the procedure statement looking something like this: <span style="font-family: "Courier New",Courier,monospace;">PRC NAME(MYPROC) PARM((&ARG1 *BYREF) (&ARG2 *BYVALUE)) RTNVAL(&RTNCODE) EXPORT(*NO)</span> and the closing statement would be <span style="font-family: "Courier New",Courier,monospace;">ENDPRC</span>. If there was no <span style="font-family: "Courier New",Courier,monospace;">PGM</span>/<span style="font-family: "Courier New",Courier,monospace;">ENDPGM</span> at the beginning then the module would have no main entry point and could only be used as a service program or a module hard linked into another program.</li>
</ol>Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com4tag:blogger.com,1999:blog-10934028.post-35352683851461193432010-04-18T16:20:00.003-04:002010-09-28T00:01:15.968-04:00One of Many Forks in the JourneyI wanted today to write an entry in this blog to convey a little part of my history. It often amazes me the paths we all take in our journeys and there were many forks in mine. The reasons I took some had to do with actual contemplation of the possible outcomes and others were the paths of least resistance. This one fork I want to tell you about today was the first step towards my current career.<br />
<br />
Today I'm a self identified computer geek, but growing up my persona wasn't so firmly set. I didn't know it at the time, but my habits and delights did follow a pattern known to others by a rather dismissive name. I had a proclivity for math and science. I loved reading and watching anything science fiction, fantasy, Lord of the Rings. I was profoundly uncomfortable around people I didn't know, especially women. -AND- I played <a href="http://en.wikipedia.org/wiki/Dungeons_%26_Dragons" target="_blank">D&D</a>. It all but screamed NERD.<br />
<br />
Years ago I saw a BBC mini-series on PBS dramatizing the life of <a bitly="BITLY_PROCESSED" href="http://www.imdb.com/title/tt0216517/" target="_blank">Charles Darwin</a>. It went from his early college years through the aftermath of the publication of his ground-breaking book. I don't know if this is true or not, but in the first part he's depicted as being pretty aimless and not knowing what he wants to do with his life. I'm not trying to compare myself to his greatness, but at the time I felt the same way about my life.<br />
<br />
My father of course wanted me to join the family business and be a salesman. To spend my days calling florists in the region, trying to compel them to buy our flowers and supplies. -AND- I of course wanted to do anything but that. Firstly, I'm the oldest among my siblings, which meant that I was the practice child. I had issues with my dad at the time and we didn't get along that well. Second, I'm a nerd, who could barely speak to people and I would have to cold-call florists all day? Please. Finally, florists have to get up before their customers and wholesale florists have to get up before the florists, which of course means that I would spend my entire working life rising before 4:00 am every day, including Sundays. Those of you who know me are probably smiling at the thought of me getting up that early on a daily basis. I mean I have enough trouble getting to work by 9:00 am.<br />
<br />
Being rudderless I wasn't sure what to major in when I contemplated college. As it happened, I was a big fan of Frank Lloyd Wright and since it was math/science/engineering related I started out studying architecture at a small college in Rhode Island. I did excel at my technical course requirements, but something for me was lacking in architecture. I was to Frank Lloyd Wright what Salieri was to Mozart in the movie “Amadeus”. I loved architecture, but when it came right down to brass tacks I lacked the necessary talent.<br />
<br />
Two years in I decided to leave there with an associates degree and enroll in Rutgers to study civil engineering. However by the middle of the semester I knew that major was a mistake. I may have lacked the talent for architecture, but civil engineering was the total opposite. My first course in this discipline was on water: reservoirs, aquifers, aqueducts, dams, water and sewage treatment, etc. The math was both turgid & difficult and with all due respect to Civil Engineers everywhere, the subject matter bored me to death.<br />
<br />
There was however this one little introductory course that all of us TI-30 calculator types at Rutgers had to take: Intro to Computers for Engineers. They taught us how to use FORTRAN and we had to do our homework an IBM 370 mainframe. Our professor spent a couple of weeks acclimating us to the computer system and JCL using a pre-written “Hello World” program that we had to punch onto cards and run through the card reader. On the next assignment we had to write a new program all by ourselves and I have to admit that I was totally lost.<br />
<br />
Remember now that this was 1978. The Apple II computer had only been on the market for a year and a half and no one in my circle of friends had even seen one. (Years later I would learn that most of the computer greats, while their contemporaries were out riding bicycles or playing ball, spent their formative years trolling computer centers. But for me, aside from playing pong on my home TV, I'd never had any previous experience with computers.)<br />
<br />
In desperation I went to the professor's office asking for help. He tried to get me to see what I needed to do without actually writing the program for me. After much confusion on my part he finally revealed the missing pieces and I don't know what changed, but it just clicked inside my head. That moment changed my life and long story short I ended up acing the course, changing my major to computer science, and have spent my working life writing computer code.<br />
<br />
At the end of that mini-series on Darwin's life, he's an old man and the actor narrates that he was always thankful he took the job on the HMS Beagle because it gave him something to do with his life. At the time I thought it was an odd thing to say considering how his life's work changed the world, but today I understand what he actually meant. Even if he hadn't changed the world he still would have been thankful for the direction it gave his life and that's how I feel too. I'm thankful that I was able to take that introductory computer course because it really did give me something worthwhile to do with my life.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com2tag:blogger.com,1999:blog-10934028.post-57159707111965852202010-02-27T14:12:00.006-05:002011-04-04T23:38:29.025-04:00Yahoo Mail Spam Filters Block Efforts to Help Fight SpamI was wondering if any one else has had this problem. Over the past couple of weeks I've had issues with Yahoo mail blocking my admittedly small efforts to fight spam. Every day I'd forward the messages in my spam folder to organizations like SpamCop.net, spam@uce.gov, and coldrain.net. However this past week or two I'm only able to forward maybe one or two messages a day before it started to block me from doing so with the following message:<br />
<blockquote>Your message was not sent<br />
<br />
Your account has been temporarily blocked from sending messages. This block can be caused by sending messages that trigger our spam filters, or by having too many recipients in one email. We encourage you to review the contents and recipient list of your message, and try sending it at after an hour or two. Doing so will usually resolve the matter.<br />
If you are still unable to send messages after a 24-hour period, please read our <a href="http://help.yahoo.com/l/us/yahoo/mail/classic/abuse/mltatempblock.html" target="_blank">FAQ</a> for more information and to request Customer Care assistance.<br />
<br />
We apologize for the inconvenience.<br />
<br />
Thanks,<br />
<br />
The Yahoo! Mail Team</blockquote>Of course I've contacted "The Yahoo! Mail Team" multiple times and I've changed my password. So far nada and now the problem is starting up on another Yahoo mail account that I forward spam messages from.<br />
<br />
This issue is especially problematic with SpamCop because after 24 hours the timestamps in the headers of the spam messages become stale and SpamCop won't process them, so I end up deleting most of them. It's a sad irony that my endeavors to help in this fight against spam are being thwarted by the very Yahoo feature that is itself trying to protect email users by identifying spam sources within Yahoo mail. While I totally understand the purpose of this effort and applaud the work being done; In my case it's overreaching and needs to be tweaked in some way. Possibly if the the application could look at the recipient email list to see if they're being sent to spam fighting organizations first before deciding whether or not to block the account.<br />
<br />
Update (10/25/2010): After resolving the issue way-back-when the problem has re-appeared.<br />
<br />
Update (4/4/2011): After throwing up my hands and giving up I tried again a month later and the problem went away completely. Now I have a new problem with Yahoo Classic. It keeps fouling up the send saying "There was a problem! Not sure why, but our usually-reliable server goofed-up while sending this message. Please try again." and I try again and it doesn't work. Or if it does get sent it will fail to allow me to delete the email saying "There's a problem viewing this message. Are you trying to access a message that's been moved or deleted? Try going to the folder it's in (e.g., Inbox, Trash) and selecting the message from there. If you've tried this, and relaunching Yahoo! Mail doesn't work either, feel free to contact Customer Care about Error Code 4."Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com2tag:blogger.com,1999:blog-10934028.post-35939240657898916642010-02-17T13:06:00.003-05:002010-02-23T12:10:20.186-05:00Enterprise Extender PTFs AgainOnce again the list of v5.4 Enterprise Extender recommended PTFs has left off some important patches. MF47274 & MF47275 can cause HPR-IP controllers to remain in an unusable VARY ON PENDING state, and varying them off and on again doesn't fix it.<br />
<br />
Our lord Ib'm should have added MF47838 & MF47839 to the list. (Note that MF47838 supersedes MF47275). However there is still a problem because sometimes IPLing or restarting the system from a restricted state causes the controllers to again remain in a VARY ON PENDING state. Fortunately, this time it can be fixed by varying them off and then on again. Not a show-stopper, just an annoyance.<br />
<br />
Ib'm support tells me there are two test PTFs that will resolve that problem too and they're in the process of granting me access to them. My advice to the users of HPR-IP controllers is to ignore MF47274, MF47838, and MF47839 until these test PTFs become available.<br />
<br />
(Please see the comments for updates.)Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com3tag:blogger.com,1999:blog-10934028.post-24306981904115661042009-11-04T14:41:00.002-05:002009-11-04T14:44:27.276-05:00Linux Desktop for AS/400 DevelopersThis is a very cool idea: <a href="http://imho.midrange.com/2009/11/04/linuxdesktop4i/" target="_blank">Linux Desktop for IBM i Users</a>Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com1tag:blogger.com,1999:blog-10934028.post-75104711703381684612009-10-24T19:43:00.011-04:002009-11-04T14:49:09.885-05:00Brother Cozzi's "Top Ten RPG IV Requirements"Recently Brother Bob Cozzi, the eminent leader of the RPGers Order, published a list he called the <a href="http://systeminetwork.com/article/annual-top-ten-rpg-iv-requirements" target="_blank">Top Ten RPG IV Requirements</a>. I would like to respond to that list and proffer some of my own:<br />
<ol><li><b><span style="font-family: "Courier New",Courier,monospace;">%JOBLOG()</span>:</b> While I have the greatest respect for Brother Cozzi this requirement leaves me feeling,... feh. Our lord Ib'm saw fit to provide us with the <span style="font-family: "Courier New",Courier,monospace;">QMHSNDPM</span> API and I've been using it so long I know the parameters by heart.</li>
<li><b style="font-family: "Courier New",Courier,monospace;">%CONCAT()</b>: I can see this being kind of useful, kind of like the <span style="font-family: "Courier New",Courier,monospace;">sprintf()</span> function from the "C" run-time cannon, but there is a difficulty when it comes to numeric fields. What if you want some to keep the leading zeros. It seems to me that it would be easier to just string everything together in a character expression.</li>
<li><b><span style="font-family: "Courier New",Courier,monospace;">%GETENV</span> and <span style="font-family: "Courier New",Courier,monospace;">%PUTENV</span></b>: <strike>Great idea. Don't know why our Lord Ib'm hasn't implemented these built-ins yet. They would be very useful.</strike> What's the difference between this and using the Unix "<span style="font-family: "Courier New",Courier,monospace;">getenv</span>" and "<span style="font-family: "Courier New",Courier,monospace;">putenv</span>" functions to do the same thing? <span style="font-size: x-small;">[Thanks to Father Klement for reminding me about these two functions as I had completely forgotten about them.]</span><strike><br />
</strike></li>
<li><b style="font-family: "Courier New",Courier,monospace;">%STDOUT</b>: What's the difference between this and using the Unix "<span style="font-family: "Courier New",Courier,monospace;">open</span>" with the "<span style="font-family: "Courier New",Courier,monospace;">read</span>" and "<span style="font-family: "Courier New",Courier,monospace;">write</span>" functions to do the same thing? Am I missing something? (And by the way, what's wrong with switching to embedded SQL? I've been doing it now for a number of years and I love the fact that if you add a field to a record format you don't have to recompile everything.)</li>
<li><b style="font-family: "Courier New",Courier,monospace;">%REGEX</b>: Can't really comment 'cause I haven't used the APIs yet.</li>
<li><b><span style="font-family: "Courier New",Courier,monospace;">%TOLOWER</span> and <span style="font-family: "Courier New",Courier,monospace;">%TOUPPER</span></b>: This already exists and it's really easy. Two named constants and the <span style="font-family: "Courier New",Courier,monospace;">%XLATE()</span> built-in and you're done. I can't imagine our Lord Ib'm wasting his time on this.</li>
<li><b>Native Support for UTF8 (ASCII)</b>: This is a good one. I'd love to have a <span style="font-family: "Courier New",Courier,monospace;">CCSID</span> keyword to identify the data in the field and the internal support to convert the data as it's being moved into or out of the field.</li>
<li><b>3rd-party Add-On Library Support</b>: Great for developers, but I suspect that the vast majority of AS/400 programmers like myself won't care too much.</li>
<li><b>Reclamation; of columns 1 to 7 in free format syntax</b>: I don't mind the <span style="font-family: "Courier New",Courier,monospace;">/free</span> and <span style="font-family: "Courier New",Courier,monospace;">/end-free</span> requirement or the loss of columns 1 to 7 as I too use it to mark changed code. What has always bugged me is the requirement that the executable code ends at column 80. It's a 100 byte line and we should be able to use its full length if we want to. In free-format languages one isn't restricted to the end point of the file, so why should free-format RPG be that way too.</li>
<li><b>Port RPG IV to Windows 7 and Mac OS X and Linux</b>: Great idea as it will expose the followers of those false religions to the beauty of iSeries worship.</li>
</ol><hr />My top ten:<b> </b><br />
<ol><li><b>Free format everything in RPG</b> including the "D" and "F" specs and remove the end-of-line restriction at column 80.</li>
<li><b><span style="font-family: "Courier New",Courier,monospace;">%LEN</span> and <span style="font-family: "Courier New",Courier,monospace;">%DECPOS</span> should be compile-time BIFs when the parameter is a single field.</b> (When the parameter is an expression they can revert to being run-time BIFs.) I've got some routines where there are more named constants specifying <span style="font-family: "Courier New",Courier,monospace;">%LEN</span> and <span style="font-family: "Courier New",Courier,monospace;">%DECPOS</span> than local variables.</li>
<li><b>Null Terminated Fields</b>: I'd go further on item number 7 in Brother Cozzi's list by asking for an additional keyword that identifies a character field as null terminated. Every time you use it or change it the compiler would automatically handle the null terminator.<b> </b></li>
<li><b>Expand <span style="font-family: "Courier New",Courier,monospace;">*JOBRUN</span> date formats</b>: Currently restricted to <span style="font-family: "Courier New",Courier,monospace;">*MDY</span>, <span style="font-family: "Courier New",Courier,monospace;">*DMY</span>, <span style="font-family: "Courier New",Courier,monospace;">*YMD</span>, and <span style="font-family: "Courier New",Courier,monospace;">*JUL</span>. They should be expanded to <span style="font-family: "Courier New",Courier,monospace;">*EUR</span>, <span style="font-family: "Courier New",Courier,monospace;">*USA</span>, <span style="font-family: "Courier New",Courier,monospace;">*ISO</span>, <span style="font-family: "Courier New",Courier,monospace;">*JIS</span>, <span style="font-family: "Courier New",Courier,monospace;">*LONGJUL</span>, etc., which would also require the O/S folks in Rochester add these values to the <span style="font-family: "Courier New",Courier,monospace;">DATFMT</span> attribute of the job. I can't tell you how many times I've had to write code to get around this restriction in full date processing in an international environment.<b> </b></li>
<li><b>Expand date functionality</b> <b>to include date formats</b> required by such things as email headers, RSS, *DTS (internal date format for message fields), etc. The learning curve on the MI instructions and/or Unix API's for them all was daunting. </li>
<li><b>Fix Data Display Problems in Debug</b>: In debug, displaying the data at the end of a passed pointer has always had problems. I've got code all over the place where a structure pointer has been passed and it points to a space that contain pointers to other structures and the debug facilities in WDSCi and the green screen can't display the data they point to because of the underlying design of debugging data stored in the program object.</li>
<li><b>Multi-dimensional arrays</b>: Every other language I've ever worked with has had the facility for arrays with more than one index. How is it that RPG has survived all of these years with one index?</li>
<li><b>Dynamic arrays</b>: Many of us have written service programs that allow an RPG program to expand the size of an array on request and I think it's time that the RPG compiler got this feature. Instead of being a fixed size stored in the program it would be an allocated heap space. If I was designing this feature I'd add a new parameter to the <span style="font-family: "Courier New",Courier,monospace;">DIM</span> keyword that allows <span style="font-family: "Courier New",Courier,monospace;">*EXPAND</span> or <span style="font-family: "Courier New",Courier,monospace;">*FIXED</span> along with the dimension that would constitute the space allocated initially. Whenever a program specified an index that was out of bounds the run-time functions would simply re-allocate the space.</li>
<li><b>Parameter signatures in RPG procedures</b> (aka Procedure Overloading): This would be similar to what is currently available in O-O languages like Java and C++. We can do this with SQL UDFs, so why not with RPG procedures? This would also make it a lot easier to interface with C++ procedures. It would also be nice to not have to use <span style="font-family: "Courier New",Courier,monospace;">*OMIT</span> and <span style="font-family: "Courier New",Courier,monospace;">*NOPASS</span> if you didn't want to.<b> </b></li>
<li><b>RPG classes</b>: Another facet of Java and C++ that would be useful. It would also make it easier to interface with Java and C++ objects because the JNI hoops one must jump through now are too daunting to be useful.</li>
</ol>Lord Ib'm hear my prayer, please have your minions fix the problem with <span style="font-family: "Courier New",Courier,monospace;">READE</span> that locks the last record in a <span style="font-family: "Courier New",Courier,monospace;">STRCMTCTL LCKLVL(*ALL)</span> environment. (This is the record that hasn't been read in because it's the one that caused the end-of-file condition.) This has been a permanent restriction since the System/38 days because the O/S routines that RPG is using are the ones that are locking the record. Toronto and Rochester should finally put their heads together on this one and find a solution.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-55670943623570807682009-08-22T15:17:00.009-04:002009-08-22T17:00:26.611-04:00New PTFs to be Tested on DEV: 08/22/09<p>PTFs were loaded for the following reasons:</p><ul><li>Recomendations:<ul><li>High Impact Pervasive (HIPER).</li></ul></li><li>Group PTFs:<ul><li>SF99539 (Level 108)<sup><small>*</small></sup>: GROUP HIPER</li></ul></li></ul><p>The following PTFs were loaded for the above reasons:</p><p>5722SS1 (i5/OS):</p><ul><li>SI35859:<ul><li>SE38501: OSP-DB-OTHER-RC4-MSGSQ30082 SQ30082 RC4 IS RETURNED ON DRDA</li><li>SE38440: OSP-DB UNNAMED COLUMN DRDA PROBLEM</li></ul></li></ul><hr><p><sup><small>*</small></sup> <span style="font-size: 8pt">-Loading this group did not result in any new PTFs being installed (they were already applied individually to our systems on previous IPLs), so only the level number was changed.</span></p>Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0tag:blogger.com,1999:blog-10934028.post-31172570555341597712009-07-30T10:51:00.009-04:002009-08-04T13:01:12.513-04:00What are Lilian Days?If you've ever used the CEEDATE() or CEEDAYS() API's on the iSeries you know that they both reference a parameter called "Lilian Days". In case you're curious, it's named after Aloisius Lilius who was an adviser to Pope Gregory XIII and an important developer of the Gregorian Calendar.<br /><br />What I found most interesting (in the geeky sense) is that the concept of Lilian Days was invented by an Ib'm high priest named Bruce G. Ohms when his article "<a href="http://domino.watson.ibm.com/tchjr/journalindex.nsf/1be2fd38b451963885256547004c00c8/d4956498b54b7e7985256bfa00685bbf?OpenDocument" target="_blank">Computer Processing of Dates Outside the Twentieth Century</a>" was published in the Ib'm Systems Journal, Volume 25, in 1986.Father Joehttp://www.blogger.com/profile/12222525376419692861noreply@blogger.com0