Archive

Archive for March, 2013

Bob Cancilla on IBM i › Why IBM Hates IBM i?

March 31st, 2013 Comments off

Does it sometimes seem that IBM wants to kill the AS/400, aka eServer iSeries, aka System i, aka IBM i on Power Systems?  

The real answer is that they absolutely do want to kill this system.  Lets back up and take a look at this system.  It was first introduce in June of 1987.  IBM had thousands of software vendors selling business application software for just about every industry you could imagine.  

Retailers bought small systems for their stores.  These systems attached to point of sale devices (fancy cash registers) throughout the store and maintained pricing, customer discounts, customer credit information, and inventory within the store.  The machines also connected to master machines located at distribution centers and corporate headquarters and tracked everything.

There were AS/400's in just about every hotel of any size in the country running the local hotel's operation and synchronizing with centralized reservation systems and other corporate management systems.

The same goes for just about any type of business you can name.  IBM shipped over 1 million of these machines from the time they introduced them until the present with prices ranging from about $10,000 for the smallest stripped down machine you could buy to about $1.5 Million for the high end machines.  

These were immensely popular machines!  In 1996 when the Internet was opened up for commercial use, the AS/400 was ready with a full suite of application servers, email servers, DNS, FTP, and just about every other server you could name or imagine to make the system immediately Internet ready!  Over the years with Java, WebSphere and many other middleware additions including a tremendous amount of free open source software, like PHP , Apache Tomcat, and the Apache HTTP Server.  

As the Internet matured, one IBM i base Power System (AS/400, iSeries, or System i) could do the work of many Linux, Unix, or Microsoft Windows based machines.  The system was also well known for its incredible reliability.

So, you say why on earth would IBM want to kill this golden goose?  

As always with a major company like IBM its all about money!  Yes, IBM made a lot of money selling these machines!  Unfortunately the features that made it popular with customers (all the integrated features like its built in DB2 database) made it horribly unpopular with IBM executives.

Lets look at some basic features of OS/400 or IBM i as the current Operating System is called.  It includes support for 5250 terminals.  There was a feature on IBM mainframes that you could not buy but had to pay a permanent perpetual monthly license of $1500 for a product called CICS that did exactly what the 5250 system did.  

There was a version of IBM's DB2 database bundled with OS/400 or IBM i that when sold on other platforms would cost upwards from $250,000 plus annual maintenance.  

There were many other features built-in to OS/400 including the language compilers and development tools that were sold separately on other IBM hardware platforms.  IBM Software Group truly hated OS/400 as they could not sell many of their products because much of what they sold was built into the system.

IBM just recently attempted to increase their annual maintenance fees by approximately 25% and were stopped by some major customers!  They offer free open source Linux on the same machines. They will not support the RPG programming language on any other platform even though it would take no more than 3 days to to port it to run on any machine IBM supports including Microsoft Windows based PC's!  RPG and every language running on the AS/400 or follow ons has always been hardware independent.  The compilers generate something called W-Code that is available on all IBM supported machines.  RPG, COBOL, BASIC, C, C++, PL1, etc. all generate W-Code which is then translated into machine code to run on the machine on which it is compiled.  There is a W-Code processor in existence for every IBM supported platform.

IBM i on Power and its predecessors alway seem to get in the way of selling IBM software, hardware, or services.  

Services is a huge revenue focus for IBM.  IBM has the world largest consulting practice of Microsoft system engineers!  No one can engineer a multiple server Microsoft based system better than IBM!  It will cost you an arm and leg, but they are the best in the world.  Same goes for Linux!  IBM can build you a server farm of Linux servers spread around the world and allow you to add or remove systems with no one other than a few administrators knowing about it.  Oh, yeah, it takes a bunch of expensive IBM engineers to put that together and make it work.  

With IBM i you roll in a system turn it on, load data, software, and use it.  There is no way you can justify expensive technical consultants!  It just does its thing! You do not even need a full time system administrator!

I mentioned hardware.  When you are building a complex network of IBM xSeries (Microsoft Intel based servers) scattered around the planet, you need a bunch of machines performing specialized tasks.  The same goes for Linux!  As your system grows you buy more Linux or windows based machines.

With LInux and Microsoft you need a bunch of consultants, a bunch of machines, and a ton of expensive IBM middleware.  You feed three divisions of IBM!  Sadly with IBM i on  Power System you buy a relatively low cost machine virtually no middleware (you really don't need any middleware), and no consulting.  

Also take a look at the cost of machines.  I entered the world of the AS/400 in 1990.  At that time my company had purchased the largest AS/400 that IBM made at the time for close to $1 Million dollars.  From that time, every time IBM shipped new hardware they added tremendous capacity and we moved from the top of the line machines to the middle, then into the lower end of the line of machines.  From 1990 to 2005 our machines dropped in price from $1 million to about $100,000 a drop of 1/10th of the original machine cost with processor speeds and overall throughput of at least 10 times the original machine.  

We did not need dozens of servers, we needed one!  We really splurged and added a second identical machine in a remote location with replication software to provide high availability.  We spun off virtual partitions for our test systems and did not need dedicated test machines.  

I just completed a project with a Linux based company where they bought about 30 Linux based Intel machines just to support our test environment!  

Are you getting the picture?  IBM i is just too cost effective and efficient.  It can be supported by too few people with no need to bring in high powered (and high cost) technical experts.  You don't need a bunch of middleware and can run your systems on basic IBM supplied software or free open source software.

Today the only thing you pay on an existing system is the annual maintenance fee in order to get support.  You only need that if you like talking to an IBM support rep on the telephone.  You can still get all of the IBM PTF's and fixes free by downloading them from IBM's web site.

When you upgrade, your IBM license clearly states that IBM cannot charge you for a new version of the operating system.  

Are you getting the picture?  IBM HATES IBM i with a passion!  It costs them millions of dollars of revenue in virtually every single area of the company!  So its not one or two IBM executives that hate IBM i but virtually every executive in Software Group, Server Group, and IBM Consulting!  


Read the original at Bob Cancilla on IBM i.

Categories: Blogs Tags:

Pete's Wordshop › Common Schedule Organizer 2013

March 29th, 2013 Comments off

Just in the nick of time, the Common Schedule Organizer, a free mobile app for Android, is now available!  There isn’t much new functionality (always willing to take suggestions) but it has been updated with the latest Phonegap libraries and the latest jQuery mobile.  It is still written for Android 2.1 devices and up so even that ancient Samsung Galaxy Spica I own can run the app.  It is still lean and mean and can be downloaded here.

If this is the first time you have used the app, you will be prompted for your email address that you use to access the Personal Grid on the Common website.  Your personal grid information will be pulled into the app but remember it is a one way street: As you add items to your schedule in the CSO they will NOT update your personal grid info (still working on the best way to handle it both ways).

Once you have entered that info and are on the main app screen, click on the “Load Schedule” button.  It will turn yellow and after 30 seconds or so you will see a “Loading” message appear and flash on the screen.  It took me about 2 minutes to download the initial schedule.  At that point the message should change to “Ready” and you are ready to go.  If you have personal grid items, go ahead and visit your schedule to make sure they downloaded.  From then on you can update the schedules, both the master schedule and the personal grid info and it will update the app with the latest and greatest.

If you have something other than an Android device, you can use the web application version of the app.  It will still save your stuff to the device you use so it is still plenty handy it just won’t be “native”.  You will find the web application available here.

If you have a question or a suggestion you can always email me (you know my name) at the company domain (valadd dot com).  I’ll try to get back to you and patch things as necessary.

See you at the conference!  Enjoy!


Read the original at Pete's Wordshop.

Categories: Blogs Tags:

Bob Cancilla on IBM i › Is Your Business At Risk?

March 29th, 2013 Comments off
If your business is still using IBM AS/400, eServer iSeries, System i, or IBM Power Systems with the IBM i operating system, your business may very well be at risk.

The following whitepaper:  Are Computers Putting You at Risk?  Identifies the issues you may be facing and why you need to conduct an objective assessment of your systems and IT staff.


Read the original at Bob Cancilla on IBM i.

Categories: Blogs Tags:

RPG and Programming › To Err Is Human

March 17th, 2013 Comments off

Sometime in your programming life you will get a reminder that you are human – unless, of course your ego is such that you will never admit to error. One of those times happened to me a few weeks ago.

I had finished a substantial system a short time before, a system with only one screen program, but with a number of batch processes to update data, print reports and notification letters (converting them to PDFs) and email them to users to send out, at their discretion, to customers. I created four or five new files and used Aaron Bartell’s excellent RPGMAIL program to produce and send the letters. It was all original programming, very much out of my largely maintenance/upgrade routine at a longtime IBM Midrange employer.

I had developed a very possessive feeling about “my” code. I tested and retested my code heavily, so I had a great deal of confidence in my code, and I felt there would be little more than trivial revisions or corrections from then on.

So it bothered me very much that a user had submitted a trouble ticket telling me that he was seeing instances of dates being pre-filled onto my display screens. The user is supposed to put in the date he notifies a customer about the issue being dealt with by the letter; but the user was telling me that the dates were being pre-filled by the system, and that they were in fact usually old dates, before the letter was even generated.

THIS could not be. The program was not designed to pre-fill dates. So it was not happening. It must be user error; he must be putting in erroneous dates and forgetting about it. MY program was not pre-filling dates. I double-checked my screen program code, then (fortunately, not out loud or in print so anyone else would know) dismissed the issue as user error and went on to other projects that were really more important.

But time went on and the problem persisted. It was brought to my attention again. It finally dawned on me that this was happening too much, and the pattern was too persistent, for it to be user error. So I decided to dig a little deeper and look at the file update programs.

And I found the problem. When I was building history records, I read the history file itself first to prepare for further processing. Then, when appropriate, I wrote a new history record. What I forgot to do was initialize the record format before writing a new record, or at least make sure I explicitly filled every field in the format before writing it. I missed a few fields – and one of those was the date displayed in the screen. The date needed to be initialized to zero, but I was writing the date from a previous read of the customer I was working with, or even another user entirely. So I fixed it, tested it, and notified the user to keep an eye on it.

No matter how skilled you are in programming, you must realize (hopefully, without being forced to do so by an irate user) that you are going to make stupid mistakes. When I started learning to program back in the late 1970’s, I heard and read a number of stories about programmers with massive ego problems. Usually, the story ended with an example of a big problem created by the programmer who thought he was a genius. Supposedly you have to be smart to learn how to program, but often smart people must learn that they are not as smart as they think they are.

So I am glad that I was reminded so gently that it is a smart programmer who learns from his mistakes and realizes how stupid he really is.


Read the original at RPG and Programming.

Categories: Blogs Tags: ,

Mike's IBM i PHP blog and more... › Who have you Mentored lately?

March 11th, 2013 Comments off


I’ve had a chance to visit customers literally around the world and they all similarly ask the same question as to how to get more people aware of the solutions available on IBM i.  In a phrase, educating the great unwashed.  Yes, the IBM i is a special animal in the world of computing.  High uptime, resilient object and file systems, integrated database and incredible native language for business in RPG is just the beginning of a radically different OS than Linux or Windows.  There is a lot to misunderstand about this platform and therefore education is essential. One customer who had been on the platform for over 20 years actually did not know what COMMON was!  Ouch!!!  By the way, we’ll be at the Annual Conference and Expo at the beginning of April with a booth and sessions and more!

Education of the team is the manager’s responsibility.  Another customer asked me about the kids today learning RPG and why there aren’t that many.  I mentioned Jim Buck’s program at Gateway and also we kicked around a number of anecdotal concepts.  So when we settled in to discuss what projects they were using for PHP they pointed to a very young member of the team who was primarily responsible for the PHP development.  He is a great guy with a good head on his shoulders for business, more on that in a minute.  But what struck me was that they were investing in his education of PHP and this makes perfect sense until I asked the question: “When do you start training him on RPG?”  You see, I thought after the previous discussion about bringing younger folks into the fold of RPG that this customer would have discovered this opportunity themselves.  They were a little shocked when I mentioned that having a younger person learn RPG until I reminded them of the previous discussion.  Once they considered what I had to say they acknowledged that it would make sense to help this young man learn RPG and that it could even make him more valuable as a resource in today’s economy.  

This brings up the primary position of my blog for the month.  What have you done to mentor someone today?  I remember when I was a budding RPG developer and I had two mentors who were essential in my success as an RPG programmer.  Sure I might have learned the same things over time, but not nearly as quickly or effectively.  In this day of “instant gratification” everyone is too busy to stop and help someone along the way like we used to in the 80’s and 90’s.  And certainly the Internet has come along way to make information much more available and easier to absorb.  But to hold someone by the hand and explain exactly why *INZSR is a useful subroutine or the different between packed decimal and an integer data type can effect storage is something I simply do not see that much of these days.  I challenge everyone out there who is responsible for the development team, in any role.  Go find an intern and teach them RPG.  

OK, so it will take time for them to learn RPG.  They may not like RPG once they’ve learned it (silly thought).  It’s not sexy like .Net or Java (so what!).  Then fuel the discussion with some other points like CASH, MOOLAH, DeNiro, COIN, Money, Geidis, scratch, and a myriad of other terms.  Folks, with nearly 8% unemployment (and higher when you consider those who quit looking) I gotta believe there is someone out there who is wiling to learn RPG in today’s shops.  But just as important, they must appreciate business.  Interns at local community colleges can come along with referrals from their college advisers.  Get in touch with the local college adviser and look for an intern who appreciates BUSINESS!  I have, somewhat provocatively, stated at several presentations that RPG programmers are not programmers at all.  They are business analysts who code RPG.  Therefore, it is essential that anyone you interview for a position to learn or work on IBM i that they understand and appreciate business.  That is not to say young developers who want to do cool, sexy things cannot help an IBM i shop.  But they will tend to get frustrated when you ask them the difference between a PO, a payable and a payment!  We are a VERY special breed as RPG developers because of the business influence and therefore we should be looking at this for future IBM i developers.  

One of the anticipated questions I run into is “well why would a younger person be interested in learning RPG?”  The obvious answer is they want a JOB!!!   But do you want to throw them into the deep end of RPG with no hope of leveraging any other technologies?  I think the reality is to get someone on deck who is will to learn RPG, but also leverage what they’ve learned in the college setting like HTML, JavaScript,  Ajax, PHP, etc.  Modernize your applications and leverage the more modern tools available in IBM i at the same time! 

See you soon!   


Read the original at Mike's IBM i PHP blog and more....

Categories: Blogs Tags:

Steve Pitcher › EPA Migrates 25,000 Lotus Notes Mail Files to Office 365…Without 14 Years of Historical Data?

March 10th, 2013 Comments off

http://gcn.com/articles/2013/03/08/million-message-mailboxes-complicate-epa-move-office-365.aspx

The US Environmental Protection Agency (EPA) was a Lotus Notes shop for about 15 years until their very recent move to Office 365, facilitated by Microsoft and Lockheed Martin.  Lynn Singleton, director of environment services for Lockheed Martin is featured in the article and provides much insight into the rapid migration schedule along with some of the struggles and successes.

A couple of things stand out in this article.  I've highlighted text for effect.

"But an unexpected hurdle was the size of many of the mailboxes that needed to be transitioned, which forced EPA and Lockheed to rethink how to approach the migration midway through the project."

The EPA "'didn’t have a size limit on mailboxes to trigger purging or archiving of information. Some of the larger mailboxes had over a million objects in them. In all, the mailboxes contained a very large universe of information, representing about 90 terabytes of data,' Singleton said."

"Initially, EPA wanted to transition all of the mailboxes along with their information to the cloud. 'But the throughput requirements of that, just the physical constraints, were such that we could not do it,'

"If the team proceeded as planned there would have been network latency problems.  Plus, the team determined that they could not handle the quantity of information with the migration tool they had selected." 

How did they solve the problem?  Well, it looks like they only migrated some of the data.

"So the team weeded out mailboxes with large attachments and archived legacy information that was older than a year."

OK, so they've got one year of live data in the cloud?  If that's the case is the other fourteen years of data existing within Lotus Domino databases on EPA servers?  Do EPA employees use Lotus Notes clients to access their mail archives?  What about the custom Lotus applications they have?  They aren't mentioned in the article.  I ask because the EPA had, as of 2010, twelve Domino servers labeled as "Lotus Notes Application Server" in this document.  It would be nice to know if they have plans for those.

I've sent a note to the author for clarification.


Read the original at Steve Pitcher.

Categories: Blogs Tags:

Bob Cancilla on IBM i › RPG Programmers a Vanishing Breed

March 9th, 2013 Comments off
I wanted to get an objective handle on the future of IBM i and RPG language.  I have been telling folks that it is time to move away from RPG or put your business at risk and of course the RPG folks are saying NO ITS NOT TRUE! 

The reality is that the RPG programming language represents a usage of less than 2% of all of the program code written and the population of people with skills to write RPG are equally narrow. 

Here are some statistics to back this up:

Tiobe Software Programming Community Index February 2013 -  RPG 0.247% of all languages
The Transparent Language Popularity Index - March 2013 —  RPG .175% of all languages
PYPL PopularitY of Programming Language Index —  RPG NOT LISTED
Programming Language Trends - O’Rielly  — RPG NOT LISTED
ComputerWeekely.com job listings   RPG NOT LISTED

 Note: COBOL is rated at .515% by Tiobe which is 5 X that of RPG!


The most popular languages are:


Language Data Sources
TIOBE The Transparent PYPL Job's
JAVA 18.387% 17.717% 27.100% 20.653%
C 17.080% 17.391% 8.300% 1.654%
Objective-C 9.803% 10.426% 6.100% 15.352%
C++ 8.758% 5.885% 9.400% 3.053%
C# 6.680% 4.708% 9.500% 6.361%
PHP 5.074% 4.583% 14.400% 22.434%
Python 4.949% 4.059% 9.600% 4.071%
Visual Basic 4.648% 6.605% 3.600%  
Perl 2.252% 2.158%    
Ruby 1.752% 1.954% 2.700% 8.736%
JavaScript 1.423% 1.271%   8.227%

 The message here should be crystal clear!  If you are using RPG based systems you need to replace or convert them quickly.  You have two big points of risk:

1.  a lack of RPG programmers in the market place with skills to maintain your systems,
2.  the probability that IBM will withdraw support in the near future and you will have no support.





 




Read the original at Bob Cancilla on IBM i.

Categories: Blogs Tags:

Steve Pitcher › Installing WebSphere Portal and IBM Web Content Manager

March 7th, 2013 Comments off
The installation instructions for WebSphere Portal on IBM i could be a little more clear.  I'll be submitting my suggestions to IBM to update them.  Here's what I did in order to install Portal and WCM on IBM i.  If you're not using IBM i, but want to do a silent installation using response files, you may still get some value out of this.

I downloaded the following images from IBM Passport Advantage.  All these images need to be consolidated in a single repository.  More on that below.

CI7N3ML     IBM WebSphere Portal and Web Content Manager Install V8.0 (1 of 5) Multiplatform Multilingual
CI7N4ML     IBM WebSphere Portal and Web Content Manager Install V8.0 (2 of 5) Multiplatform Multilingual
CI7N5ML     IBM WebSphere Portal and Web Content Manager Install V8.0 (3 of 5) Multiplatform Multilingual
CI7N6ML     IBM WebSphere Portal and Web Content Manager Install V8.0 (4 of 5) Multiplatform Multilingual
CI7N7ML     IBM WebSphere Portal and Web Content Manager Install V8.0 (5 of 5) Multiplatform Multilingual

In actuality, once downloaded these zip files are labeled as 1 of 7, 2 of 7 so there's some confusion there.  I spent some time wondering where the two I missed were.  I didn't.  There's only 5.

Then these two:
CI7VIML     IBM Web Content Manager Setup V8.0 (1 of 2) Multiplatform Multilingual
CI7VJML     IBM Web Content Manager Setup V8.0 (2 of 2) Multiplatform Multilingual

Then these three:
CI7N8ML     IBM WebSphere Application Server Network Deployment V8.0.0.3 (1 of 3) Multiplaform Multilingual
CI7N9ML     IBM WebSphere Application Server Network Deployment V8.0.0.3 (2 of 3) Multiplaform Multilingual
CI7NAML     IBM WebSphere Application Server Network Deployment V8.0.0.3 (3 of 3) Multiplaform Multilingual

Under CI7N3ML and CI7N4ML there are a Setup folders (containing one for Installation Manager, and WASFixes).  Also, under CI7VIML there is a Setup folder, that's for the WCM.

I created a Portal8 folder comprised of the different packages.  This is probably my biggest issue with the installation.  There is no documentation showing what the final installable directory should look like, so you may be left with a bit of trial and error, especially since you may be hesitant to combine directories.  Ideally, IBM could package these images in a nice and tidy format to minimize both confusion and customer effort.  Here's how I built my directory.




InstallableDirectory Source Media
Portal8/Portal/disk1 CI7N5ML
Portal8/Portal/disk2 CI7N6ML
Portal8/Portal/disk3 CI7N7ML
Portal8/WAS/disk1 CI7N8ML
Portal8/WAS/disk2 CI7N9ML
Portal8/WAS/disk3 CI7NAML
Portal8/WCM CI7VJML
Portal8/Setup/IIM CI7N3ML
Portal8/Setup/WASFixes     CI7N4ML and CI7VIML
Portal8/Setup/Components CI7VIML
Portal8/Setup/eimage CI7VIML
Portal8/Setup/IBMPU CI7VIML
Portal8/Setup/launchpad CI7VIML
Portal8/Setup/quickstart CI7VIML
Portal8/Setup/repository CI7VIML
Portal8/Setup/autorun.inf CI7VIML
Portal8/Setup/setup64.exe CI7VIML
Portal8/Setup/setup64.ini CI7VIML
Portal8/Setup/setup.exe CI7VIML
Portal8/Setup/setup.ini CI7VIML
Portal8/Setup/setup.sh CI7VIML
Portal8/Setup/responsefiles CI7VIML


Then, I created a folder on the IFS called InstallPortal, shared it via NetServer and pushed the customized Portal8 folder to it via drag/drop in Windows.

I then installed Installation Manager via the following steps.

Sign onto a 5250 session.
Start Qshell by typing Qsh on a command line and press enter.
Change working directory to the Installation Manager install directory:
cd /InstallPortal/Portal8/Setup/IIM/os400
Run the Installation Manager installer:
installc -acceptLicense

While in Qshell, change your working directory to the newly created Installation Manager directory and encrypt your wpadmin password.  Copy the password when the command finishes.

cd /qibm/proddata/InstallationManager/eclipse/tools 
imutilsc encryptString insertpasswordhere

Then I changed the response file /InstallPortal/Portal8/Setup/responsefiles/iseries/wcm_standalone_full.xml repository location parameters to point at /InstallPortal/Portal8/Setup/eimage/repository.config and /InstallPortal/Portal8/Setup/WASFixes/8.0.0.3-WS-WAS-i5OSPPC-IFPM59405.zip.

Also in there, I had to update two other parameters.  The first is the web address of the server.  Before changing this I created a new IP interface on IBM i, assigned a host table entry for www-2.scotsburn.com to it. If you have other web servers on your IBM i partition running HTTP/HTTPS then it's a good idea to give each web service a dedicated IP address so that you won't run into port conflicts.

The documentation also tells you to "ping yourserver.yourcompany.com" 
On IBM i, you actually ping rmtsys('yourserver.yourcompany.com') or ping 'yourserver.yourcompany.com' so you need to either qualify the parameter name by using the rmtsys parameter or just use single quotes to signify there's a parameter being sent to the PING program in IBM i.

Either way, once you have a pingable host, change the following parameter with that host address:
data key="user.wp.hostname,com.ibm.websphere.PORTAL.SERVER.v80" value="www-2.scotsburn.com" />

The 2nd parameter is for the encrypted password we created earlier.


Save the file.  Now we're ready to install Portal and WCM.

Back in Qshell, your directory should still be /qibm/proddata/InstallationManager/eclipse/tools so you can run the installation procedure from there:
imcl -acceptLicense input /InstallPortal/Portal8/Setup/responsefiles/iseries/wcm_standalone_full.xml -log /portal8install            

The install log will be a generated as the stream file /portal8install.  Kick back and grab some lunch because it may take a while to install all this stuff.

Good luck!


Read the original at Steve Pitcher.

Categories: Blogs Tags:

Bob Cancilla on IBM i › IBM Increasing IBM i Cost of Ownership

March 6th, 2013 Comments off
I wrote a short note about IBM increasing the cost of SWMA (Software Maintenance Agreement) for IBM i.  Now look at the cost of the Hardware and more importantly disk storage.  Compare that to Intel based hardware and DASD for those boxes.  You can buy 1 Terabyte Drives for Wintel machines for as little as $75 retail at Best Buy.  You will pay much less through commercial vendors.  These same drives cost you thousands for your IBM i based Power machine.

See:  http://www.itjungle.com/tfh/tfh030413-story01.html

Does your company really need an IBM Power System?  Would you be much better off looking a cloud computing and pay for what you actually use?


Read the original at Bob Cancilla on IBM i.

Categories: Blogs Tags:
css.php