<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2.1" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Logikal Blog</title>
	<link>http://logikalblog.com</link>
	<description>Just another WordPress weblog</description>
	<pubDate>Thu, 04 Dec 2008 20:31:36 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>
	<language>en</language>
			<item>
		<title>GM Must Fail</title>
		<link>http://logikalblog.com/2008/12/04/gm-must-fail/</link>
		<comments>http://logikalblog.com/2008/12/04/gm-must-fail/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 20:31:36 +0000</pubDate>
		<dc:creator>roland</dc:creator>
		
		<category><![CDATA[Information Technology]]></category>

		<guid isPermaLink="false">http://logikalblog.com/2008/12/04/gm-must-fail/</guid>
		<description><![CDATA[That must sound rather odd coming from someone who owns a couple of GM vehicles, but it is the truth none the less. GM Must fail and must be allowed to fail. No tax payer dollars must be offered up to save it. Why? GM was behind the root of our economic problems and because [...]]]></description>
			<content:encoded><![CDATA[<p>That must sound rather odd coming from someone who owns a couple of GM vehicles, but it is the truth none the less. GM Must fail and must be allowed to fail. No tax payer dollars must be offered up to save it. Why? GM was behind the root of our economic problems and because of that, must be allowed to fail.</p>
<p>Anyone who has actually read through this blog over the years will correctly agree. GM and EDS were if not the absolute root of IT off shoring, they were damned near it. The management involved at both of these companies was hallucinogenic enough to believe their would still be customers for $70,000 SUVs even after the IT jobs paying more than $100,000 per year were eliminated. There never was a shortage of IT workers, there was only a shortage of management willing to pay the actual market rate.</p>
<p>In their defense, GM and EDS didn&#8217;t expect _every_ big company to jump on the off shore bandwagon. It was supposed to be their little secret, until they found out just how much infrastructure had to be built off-shore to make use of that $10/day low quality labor source. Once they found out just how much it would cost, they had to turn to the industry&#8217;s largest marketing company, The Gartner Group. Yes, they want you to call them an &#8220;Industry Analyst&#8221; or &#8220;Think Tank&#8221; firm, but the only thinking they do is about what they&#8217;ve been paid to market. All you have to do is work in IT for about a decade to figure that out. The industry is used to buying what the Gartner Group is paid to sell this week, it has become a regular practice. Little wonder that when Gartner started marketing off shoring as the cure for world hunger, just like they marketed &#8220;right sizing&#8221; just in front of Y2K, the industry jumped in with both feet. The first domino fell in the economic downturn.</p>
<p>The mortgage fraud could have quietly been swept up as long as there were still people pulling down more than $100,000 per year playing &#8220;flip this house&#8221; and buying $70,000 SUVs. What hasn&#8217;t been widely reported is why the mortgage crisis exploded so dramatically, the group of people whose incomes made it possible were off shored. Once GEG (GM, EDS, and Gartner) took that pool of people out of the housing and car market, the train was sent down the mountain sideways. Nobody noticed the train wreck until those people who had been off shored started cashing in stocks and mutual funds so they could continue to eat and live in doors. The few remaining people in the &#8220;flip this house&#8221; game then got caught holding onto mortgages they couldn&#8217;t cover. More stock and mutual fund liquidations occurred as people tried to avoid total destruction.</p>
<p>Finally, the plight of the U.S. IT worker caused so much money to be pulled out of the financial markets, that it put a squeeze on the financial instruments used to bust up mortgages. With the flippers out of the market, other speculators started defaulting as home prices plateaued, then turned down. The most visible domino then fell. Mortgage backed financial instruments became near worthless and a rash of predatory mortgage practices started being exposed on the evening news.</p>
<p>Congress must not save GM. When you tunnel back through the carnage and feces, you find them very near the root of this problem.</p>
]]></content:encoded>
			<wfw:commentRss>http://logikalblog.com/2008/12/04/gm-must-fail/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A Tale of Two Market Segments</title>
		<link>http://logikalblog.com/2008/12/01/a-tale-of-two-market-segments/</link>
		<comments>http://logikalblog.com/2008/12/01/a-tale-of-two-market-segments/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 20:19:42 +0000</pubDate>
		<dc:creator>roland</dc:creator>
		
		<category><![CDATA[Information Technology]]></category>

		<guid isPermaLink="false">http://logikalblog.com/2008/12/01/a-tale-of-two-market-segments/</guid>
		<description><![CDATA[The following is an excerpt from &#8220;The Minimum You Need to Know About Qt and PostgreSQL&#8221;
	What is really the fundamental difference between the MAC market and the PC market?  Apple has completely tossed out prior architecture on more than one occasion, yet MAC is now the leading college campus computer.  Vista required such [...]]]></description>
			<content:encoded><![CDATA[<p>The following is an excerpt from &#8220;The Minimum You Need to Know About Qt and PostgreSQL&#8221;</p>
<p>	What is really the fundamental difference between the MAC market and the PC market?  Apple has completely tossed out prior architecture on more than one occasion, yet MAC is now the leading college campus computer.  Vista required such a massive hardware upgrade for most existing Windows users that most have refused to upgrade.  After officially dropping support for Windows XP, Microsoft began selling a “Business Edition” Vista license.  I purchased one of these computers for someone.  Do you want to know what the “Business Edition” really is?  It comes bootable media which will wipe Vista off your machine and install Windows XP Pro.  Microsoft counts this as a Vista license sale, but they really just sold another copy of Windows XP Pro.<br />
	How is it that the Apple customers are willing to endure this, but the Microsoft customers are not?  When Apple throws out the prior technology, they throw it out lock-stock-and-barrel.  A major improvement in both the operating system and the hardware shipping with it occurs.  There is a compelling reason to ditch the old stuff for the new.  Vista was not a major improvement.  Microsoft doesn&#8217;t control the computer hardware like Apple does.  Anyone who has seen any of the “I&#8217;m a MAC and I&#8217;m a PC” commercials where the PC user was rejoicing about being error free for nearly a week can get a good understanding of just how bad Vista has been.  So bad, Microsoft has come up with a new campaign where they won&#8217;t even use the name Vista anymore.<br />
	Over the course of its existence, Microsoft had managed to compel people and companies to upgrade and stay current with the latest toys.  That worked until the PC became a standard office supply.  Companies look to spend as little as possible when it comes to standard office supplies.  Windows XP pro became successful because it remained virtually unchanged for many years.  Companies developed a lot of software for it, and most employees already had some idea of how to check email and surf the Web on it when they were hired.  It is a Heritage system.  The very thing Microsoft (and most everybody trying to sell something new into IT) rails against, claiming it is holding people and companies back from reaching their full potential.  What the marketing types don&#8217;t understand is the reasons Heritage systems exist.  </p>
<p>1.They are a sunk cost.<br />
2.They do their job.<br />
3.Most companies don&#8217;t make money changing software or hardware platforms.</p>
<p>	Apple can get away with a complete redesign of their platform because they aren&#8217;t found on most office desks.  They occupy creative niches at companies and really are still personal machines.  The PC targeted the much wider “business tool” market.  What Microsoft  shareholders and leaders haven&#8217;t realized yet is that once a carpenter has a hammer they like, they need an incredibly compelling reason to buy a new one.  Vista was not compelling.</p>
]]></content:encoded>
			<wfw:commentRss>http://logikalblog.com/2008/12/01/a-tale-of-two-market-segments/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The End of POD Draws Near</title>
		<link>http://logikalblog.com/2008/11/29/the-end-of-pod-draws-near/</link>
		<comments>http://logikalblog.com/2008/11/29/the-end-of-pod-draws-near/#comments</comments>
		<pubDate>Sat, 29 Nov 2008 18:54:09 +0000</pubDate>
		<dc:creator>roland</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://logikalblog.com/2008/11/29/the-end-of-pod-draws-near/</guid>
		<description><![CDATA[For those of you unfamiliar with POD, it stands for Print On Demand. These are books printed with icky nasty toner. No matter how great the print quality is, the book still looks and feels cheap. Kind of like wheeling up to a Ferrari convention in a Yugo. It is true that laser printer technology [...]]]></description>
			<content:encoded><![CDATA[<p>For those of you unfamiliar with POD, it stands for Print On Demand. These are books printed with icky nasty toner. No matter how great the print quality is, the book still looks and feels cheap. Kind of like wheeling up to a Ferrari convention in a Yugo. It is true that laser printer technology has made amazing strides, but you can spot a toner printed book from quite a distance. You can also identify them blindfolded by simply dragging your fingertips down any given page. Feels kind of like a cross between Braille and 180 grit sandpaper.</p>
<p>POD falls into two categories.</p>
<p>1) a traditional printing house serving up toner printing for ARCs, Galleys, and out-of-print long tail books a publisher still wishes to keep in print. This is the ethical part of the business, and pretty much the only part of toner printing that makes any sense.</p>
<p>An ARC is an Advanced Reading Copy sent out to various professional reviewing services. Traditionally you will print 50-100 of these and they will have a special cover, if you are still entrenched in the business model which uses ARCs. Most people aren&#8217;t these days. Why? The pool of individuals requiring ARCs tend to be both unemployed and unemployable. If you have a reference or technical book, don&#8217;t bother submitting to a service which requires an ARC. If you do, your book will be handed off to someone holding a Phd. who has never worked an actual day in their chosen field of expertise. If it wasn&#8217;t for tenure, they wouldn&#8217;t have a job. In many cases they don&#8217;t. Anyone who has had to wade through a pool of recent graduates has had first hand experience with just how far out of touch college programs have become.</p>
<p>Galleys aren&#8217;t that much different from ARCs in this day and age. Some people still use them and some don&#8217;t. The major difference between an ARC and a galley is that a Galley is supposed to be what actually got sent off to the print shop. An ARC is assumed to still be a work in progress. I don&#8217;t know of anyone actually sending ARCs out to reviewers anymore. Galleys tend to get either a stamp or special cover indicating they are a galley. Everybody knows it is a cheap print job and they don&#8217;t ding you for it. Lead times for offset press can be measured in months, so a galley ensures there are some reviews ready to be posted with the book when it is released. In theory this helps your sales.</p>
<p>2) Vanity &#8220;Let us turn you into a published author&#8221; scam shops.</p>
<p>There is a large quantity of these companies on the market. Amazon.com even owns some of them. These shops offer &#8220;publishing packages&#8221; to the budding author/publisher. Generally they have come-ons like &#8220;be a published author for under $600&#8243;. The package includes one of their ISBN numbers (by definition they are the publisher, not you when it is their ISBN), some kind of on-line sales page, and an immediate listing on Amazon.com when your book is done. There is generally a minimum purchase requirement on the part of the author, so they have to pay the $600, then buy 48 books at list from the printing house which is actually the publisher.</p>
<p>In short, this is the absolute bottom of the industry. Vanity press titles don&#8217;t get listed in any major retail chain and all of that &#8220;marketing&#8221; you thought you were getting with the package won&#8217;t generate a single sale. The author generally doesn&#8217;t find this out until AFTER they&#8217;ve already &#8220;published&#8221; through this service and find the per unit print cost higher than the retail price most of their competitors list at on Amazon. Given they have to give a 65% discount to Amazon as part of the &#8220;package deal&#8221; their list price tends to be double that of their nearest competitor. This is the publishing industry equivalent of a dark alley filled with drug dealers and disease riddled hookers.</p>
<p>All of that is coming to an end.</p>
<p>The 3.0 version of OpenOffice is getting close to the Holy Grail, the ability to save directly to ePub format. The first step, being able to export to XHTML has already been delivered. Another team has been working on a PDF import functionality. Judging from the functionality chart and percentages of completion for those features, they are getting very close. Probably by version 4.0 (if not sooner) OpenOffice will be able to import PDF files from lessor Word Processors and save them directly to ePub format.</p>
<p>How is that bringing this to an end?</p>
<p>Sony is in the process of creating a publisher portal for self/small publishers. The portal is currently going to allow for Sony to do conversion services for those who simply don&#8217;t have the foresight to bail on the now dying Microsoft platform. Publishers who can provide an ePub format can move directly into being listed. The Sony eBookstore also feeds many partner sites. Instead of being raped by POD and Amazon, you can simply release your book in ePub format to generate revenue until you can do a quality printing with an ethical printer. Or, you can simply leave your work sitting out there generating revenue without any additional costs.<br />
As of today, you have to convert your book into ePub format. Rather than messing with this, I have been sending my files out to IT Global Solutions for conversion and loading into Sony. Very soon Stanza will have its own eCommerce site up and running for the Apple iPhone market which can also read ePub format.</p>
<p>Yes, the days of the POD scam artists are drawing to a close.</p>
]]></content:encoded>
			<wfw:commentRss>http://logikalblog.com/2008/11/29/the-end-of-pod-draws-near/feed/</wfw:commentRss>
		</item>
		<item>
		<title>When Will the Department of Labor and the Justice Department Get Involved?</title>
		<link>http://logikalblog.com/2008/11/26/when-will-the-department-of-labor-and-the-justice-department-get-involved/</link>
		<comments>http://logikalblog.com/2008/11/26/when-will-the-department-of-labor-and-the-justice-department-get-involved/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 16:56:05 +0000</pubDate>
		<dc:creator>roland</dc:creator>
		
		<category><![CDATA[Information Technology]]></category>

		<guid isPermaLink="false">http://logikalblog.com/2008/11/26/when-will-the-department-of-labor-and-the-justice-department-get-involved/</guid>
		<description><![CDATA[Reading quite a few discussions today (many of them in an obviously Gartner funded thread on Tech Republic about the IT shortage), I began to wonder just when both the Department of Labor and the Justice Department will get involved. Somewhere, the DOL has its own &#8220;average base salary&#8221; database. I&#8217;ve seen links to it [...]]]></description>
			<content:encoded><![CDATA[<p>Reading quite a few discussions today (many of them in an obviously Gartner funded thread on Tech Republic about the IT shortage), I began to wonder just when both the Department of Labor and the Justice Department will get involved. Somewhere, the DOL has its own &#8220;average base salary&#8221; database. I&#8217;ve seen links to it before, just didn&#8217;t go looking for it today. Instead, I went to Salary.com since it has a fairly good reputation for accurately gathering ranges in regions. (Who knows, they might even be repackaging the DOL information.)</p>
<p>Given today&#8217;s prior post, I searched for the title &#8220;Programmer Analyst&#8221; for the 63113 zipcode. I simply know the contract was somewhere in St. Louis and that was one of the many zipcodes listed for St. Louis. I cannot believe the surrounding zipcodes will have a massive fluctuation. How do I know this? I also looked up base salary ranges for a Chicago zipcode 60673 (again, one of many in the list).</p>
<p>Keep in mind these are base salaries for EMPLOYEES before benefits and bonuses are added in.</p>
<p>60673 somewhere in Chicago</p>
<p><strong>Programmer I</strong>	50,397 to 65,151<br />
<strong>Programmer II</strong>	59,859 to 75,286<br />
<strong>Programmer III</strong>	73,726 to 91,314<br />
<strong>Programmer V</strong>	98,300 to 118,161	(8 to 10 years of experience)</p>
<p>63113 somewhere in St. Louis</p>
<p><strong>Programmer I</strong>	46,957 to 60,711<br />
<strong>Programmer II</strong>	55,779 to 70,155<br />
<strong>Programmer III</strong>	68,701 to 85,090<br />
<strong>Programmer V</strong>	91,600 to 110,108	(8 to 10 years of experience)<br />
		95,504 to 115,744 if bonuses included</p>
<p>The rule with consulting is the rate which must be paid to obtain a qualified consultant is double the range of employee base salary for the same position. This has been the rule for many years. The consultant gets no bennies and there is a pimp taking a cut. So, we do some quick math using the bottom end of the salary range.</p>
<p>91,600 / 2000 = 45.8<br />
115744/2000 = 57.872</p>
<p>If your employee was paid hourly they would make $45.80/hour. Doubling that means the bottom end of a billing rate to consulting firms would be $91.60/hour. Since the client was specifically looking for candidates with 7-10 years of experience, we are working in the correct salary range.</p>
<p>What the client is doing is posting a billing rate to the pimps involved which is less than their internal employee cost. Eventually they will use the lack of respondents as proof there is a shortage of IT workers, so they should be able to bring in H1-B and thus open the door wider for terrorists looking to gain easy access to this country. Those who think such statements are racist obviously don&#8217;t know about all of the people Homeland Security is sending home AFTER they&#8217;ve gotten here to work in IT. One company in that general vicinity was playing this game and bringing in H1-B workers. A few short weeks into one new-hire&#8217;s stint, HR found Homeland Security waiting in their office when they got in to work. The conversation was very short and very simple &#8220;He&#8217;s leaving today and you are paying for the transportation.&#8221; By the time they got done paying for everything they had roughly the cost of two U.S. born workers into this &#8220;money saving venture&#8221;.</p>
<p>That all brings us to the question of when is Homeland Security going to force the Department of Labor to crack down on this practice by engaging the Justice Department? The obviously have enough data to prove it is a gaping hole in National Security. The couldn&#8217;t have already forgotten the arrest of these people could they?</p>
<p>http://news.bbc.co.uk/2/hi/americas/4438593.stm</p>
]]></content:encoded>
			<wfw:commentRss>http://logikalblog.com/2008/11/26/when-will-the-department-of-labor-and-the-justice-department-get-involved/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Vendor Management Systems = Price Fixing and Wire Fraud</title>
		<link>http://logikalblog.com/2008/11/26/vendor-management-systems-price-fixing-and-wire-fraud/</link>
		<comments>http://logikalblog.com/2008/11/26/vendor-management-systems-price-fixing-and-wire-fraud/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 15:13:04 +0000</pubDate>
		<dc:creator>roland</dc:creator>
		
		<category><![CDATA[Information Technology]]></category>

		<guid isPermaLink="false">http://logikalblog.com/2008/11/26/vendor-management-systems-price-fixing-and-wire-fraud/</guid>
		<description><![CDATA[Recently I had an interesting discussion with a pimp about a contract opening. They had posted the contract opening on Dice and tagged the entry as &#8220;market rate&#8221;, but when the called me, they were offering a billing rate well below half of market rate. Several other pimps had called about this same contract, all [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I had an interesting discussion with a pimp about a contract opening. They had posted the contract opening on Dice and tagged the entry as &#8220;market rate&#8221;, but when the called me, they were offering a billing rate well below half of market rate. Several other pimps had called about this same contract, all quoting a billing rate far below market, but this one tried the &#8220;chat to him a while and see if he changes his mind approach.&#8221;</p>
<p>During the discussion they stated the Vendor Management System didn&#8217;t allow them to present candidates outside of the quoted rate range. I informed them that is where the first crime happened. They were rather shocked to hear this, but not as shocked when I told them the second crime happened when they advertised the contract billing rate as &#8220;market&#8221;.</p>
<p>&#8220;What crime is that&#8221; they asked.</p>
<p>&#8220;Wire Fraud&#8221; I responded.</p>
<p>After a long silence they queried &#8220;How is that Wire Fraud?&#8221;</p>
<p>&#8220;I am not a lawyer, but I&#8217;ve chatted with some about this very topic. The position has been falsely advertised on the Internet. You put &#8216;market rate&#8217; as the billing rate even though you know very well $42/hr you are offering is less than half of the going billing rate for qualified candidates.&#8221;</p>
<p>&#8220;The client is only willing to pay this much&#8221; they responded.</p>
<p>&#8220;I am only willing to pay 50 cents for a gallon of gasoline at the pump, is that the current &#8216;market rate&#8217; for gasoline?&#8221;</p>
<p>&#8220;No.&#8221;</p>
<p>&#8220;There you go. By not allowing candidates to presented at the actual market rate, your client has engaged in price fixing. By participating in it, so have you and every other pimp advertising the opening as &#8216;market rate&#8217;. Had you actually put the maximum billing rate in the opening you would have been operating within the law. You would also not get a single qualified respondent.&#8221;</p>
<p>&#8220;How is that price fixing?&#8221;</p>
<p>&#8220;From what I&#8217;ve been told by people who actually work in the field of law, they engaged multiple companies in a single industry on a mission to cap a price. The companies willingly participated when they advertised the opening as &#8216;market rate&#8217; and all agreed (by method of the Vendor Management System) to not submit any candidates above that billing rate. The company has taken the childhood action of sticking their fingers in their ears and humming really loud to avoid hearing a truth they don&#8217;t wish to hear. The method they chose of accomplishing that, while a feature of their particular Vendor Management System, isn&#8217;t legal.&#8221;</p>
<p>&#8220;Oh. So you won&#8217;t consider taking the contract?&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://logikalblog.com/2008/11/26/vendor-management-systems-price-fixing-and-wire-fraud/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Your Very First Import to SourceForge</title>
		<link>http://logikalblog.com/2008/11/25/your-very-first-import-to-sourceforge/</link>
		<comments>http://logikalblog.com/2008/11/25/your-very-first-import-to-sourceforge/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 01:22:23 +0000</pubDate>
		<dc:creator>roland</dc:creator>
		
		<category><![CDATA[Information Technology]]></category>

		<guid isPermaLink="false">http://logikalblog.com/2008/11/25/your-very-first-import-to-sourceforge/</guid>
		<description><![CDATA[I recently created a project on SourceForge.net. The project is called xpnsqt. I don&#8217;t really expect anyone to work on it, nor do I care. I needed to write something to replace the expense tracking stuff I had developed in Lotus Approach years ago. Other than playing either &#8220;Starcraft&#8221; or &#8220;Lords of the Realm&#8221;, I [...]]]></description>
			<content:encoded><![CDATA[<p>I recently created a project on SourceForge.net. The project is called xpnsqt. I don&#8217;t really expect anyone to work on it, nor do I care. I needed to write something to replace the expense tracking stuff I had developed in Lotus Approach years ago. Other than playing either &#8220;Starcraft&#8221; or &#8220;Lords of the Realm&#8221;, I don&#8217;t boot Windows. I don&#8217;t often have the time or desire to play games anymore, so Windows doesn&#8217;t see much usage anymore.</p>
<p>Rewriting the Lotus Approach stuff kept getting put off. I kept waiting for some OpenSource product which would let me do what Lotus Approach had done. Total development time for the original application with Lotus Approach was roughly 45 minutes. I had never used Lotus Approach prior to that. The application itself is quite simple. There are three database tables: categories, payees, and expenses. The first two tables are foreign keys for the expense table. They help ensure I record expenses consistently for the report I generate and hand to my tax person. The report is a simple control break report. Select all expenses flag as being tax deductions/business expenses, sort them by category then date, dump off with totals for each category and a grand total at the end.</p>
<p>Qt seems to be all the rage with C++ development. Having written two books on the Zinc Application Framework many years ago, I&#8217;m not new to cross platform development. The difference with Qt is you get a free version of the product with your Ubuntu (or probably any other Linux) installation. I purchased a couple of books on Qt and set about redeveloping this application using Qt and Postgresql.</p>
<p>&#8220;Foundations of Qt Development&#8221; ISBN-13 978-1-59059-831-3</p>
<p>This is a tome you don&#8217;t want to wade into unless you want to spend an inordinate amount of time discussing lists and other theories you should have learned long ago in college. I made it a whopping 65 pages into this 500+ page tome and pretty much parked it on that book shelf which is almost impossible to get to in my office. If I have trouble sleeping some night I might pull it out rather than taking drugs.</p>
<p>&#8220;C++ GUI Programming with Qt 4&#8243; ISBN-13 978-0-13-235416-5</p>
<p>I made a good faith effort with this book. Like most seasoned developers, I learn by keying code in which was printed in the book, compiling it, debugging my typos, testing the run, then tweaking. This is the traditional learning path for every seasoned developer I have ever known. The first two chapters of this book allowed you to do just that. Then, it appears Prentice Hall&#8217;s design gestapo got into their act. The book made a dramatic switch to &#8220;snippets&#8221;. Yes, they provide a location to download the complete set of source code, but that is only useful if you are attempting to fix a problem and already know the product. It is not conducive to a learning experience. As a result, I was forced to use the book only for reference. The chapter on database access (yes, chapter) spends an inordinate amount of time showing you how to use a couple of SQL classes which simply aren&#8217;t ready for prime time. They don&#8217;t correctly handle an empty table condition. They didn&#8217;t at the time of writing either since the example program made a point of slamming data into the table before using those classes. In the end, I used little bits and spent a lot of time using the Yahoo search engine.</p>
<p>When it was all done, I had something serviceable. I&#8217;m not completely happy with the way the report was handled. You have to either spend a lot of time hacking your own HTML tags or you endure a broken print engine. I opted to endure a broken print engine.</p>
<p>Broken how you ask?</p>
<p>Old School. A standard 11 inch form has 66 lines at 6 lines per inch which was the standard print height. You kept track of your detail lines and made a point of not printing more than 55 of them before inserting a form feed and new page headings. When you printed, you dumped this file in raw ASCII to a printer. The printer (even today&#8217;s postcript printers) understand a stream in raw ASCII containing a form feed character.</p>
<p>QTextEdit class. No method of a raw ASCII dump. No matter how you set your printer object up, you cannot get there from here.</p>
<p>Result: I print one set of page headings and let form breaks happen wherever they happen without printing new headings. Why? Since the printing engine in the library is rendering things graphically, I cannot ASS-U-ME we will get 66 lines on the destination. I have no way of making the page break happen other than counting and spitting out a lot of blank lines. Those blank lines look really stupid when you are viewing the report in the QTextEdit class. The class does have built in PDF generation support, but ASS-U-MEs it is starting with the supported HTML subset. In other words, it isn&#8217;t smart enough to understand a form feed character either.</p>
<p>Sighhhhhhhhhhhhhhhhh</p>
<p>So. After entering all of my expenses thus far this year and otherwise exercising the application, I made the decision to create a SourceForge project out of it so that others may get some use from this code. Some young geek who actually likes adding code to spit out HTML tags might choose to fix the report. (Must not be a lot of those geeks because there are now several class libraries which are Qt extensions for reporting.)</p>
<p>Once I had been approved for a new project by SourceForge, they sent an email with instructions about doing some admin things. The link to the CVS page had links to CVS documentation. NOT ONE OF THESE LINKS ACTUALLY WORKED. I opened a trouble ticket with SourceForge and have been trading quite a few emails. Nothing actually solved the issue. I run 64-bit software, and judging from the responses I&#8217;m seeing, they are testing with 32-bit.</p>
<p>I&#8217;ve used quite a few version control systems in my day, but never CVS. Now I&#8217;m starting to understand why. After much Web searching I have concluded that either every person in the universe is using a dramatically different version of CVS than came with Ubuntu 8.10, or all the on-line doc is wrong. (Jury still out on SourceForge doc since it is unreachable.) Nearly ever piece of doc I found showed this example:</p>
<p>$ cd tc<br />
$ cvs import -m &#8220;Created directory structure&#8221; yoyodyne/dir yoyo start</p>
<p>It&#8217;s just plain wrong. It is missing a parameter. I changed the username to drunken_coder in the following example, but this is what you can expect when you have an SSH client installed along with CVS on your 64-bit Ubuntu 8.10 system.</p>
<p>roland@roland-desktop:~/junk/xpnsqt$ cvs -z3 -d:ext:drunken_coder@xpnsqt.cvs.sourceforge.net:/cvsroot/xpnsqt import -m &#8220;Initial Version&#8221; xpnsqt LOGIKAL V_1_0<br />
The authenticity of host &#8216;xpnsqt.cvs.sourceforge.net (216.34.181.110)&#8217; can&#8217;t be established.<br />
RSA key fingerprint is dc:a3:df:84:00:c6:65:b4:93:a6:2e:22:b1:d1:91:b8.<br />
Are you sure you want to continue connecting (yes/no)? yes<br />
Warning: Permanently added &#8216;xpnsqt.cvs.sourceforge.net,216.34.181.110&#8242; (RSA) to the list of known hosts.<br />
roland_hughes@xpnsqt.cvs.sourceforge.net&#8217;s password:<br />
N xpnsqt/ui_TaxYearDialog.h<br />
N xpnsqt/ReportBrowserDialog.h<br />
&#8230;<br />
No conflicts created by this import</p>
<p>Notice the parameters:</p>
<p>-z3<br />
	   <strong>because sourceforge said to use it.</strong></p>
<p>-d:ext:drunken_coder@xpnsqt.cvs.sourceforge.net:/cvsroot/xpnsqt	</p>
<p>                   <strong>cvs repository ext:username@repository:/root/path<br />
				the ext tells cvs to use ssh</strong></p>
<p>import<br />
         	   <strong>command</strong></p>
<p>-m &#8220;Initial Version&#8221;<br />
        	   <strong>log message</strong></p>
<p>xpnsqt<br />
		   <strong>module</strong></p>
<p>LOGIKAL<br />
		   <strong>vendor tag</strong></p>
<p>V_1_0<br />
		   <strong>release tag</strong></p>
<p>The module parameter is needed and ends up creating another directory under the repository path you listed. Now my repository has /cvsroot/xpnsqt/xpnsqt. Had I been a little more educated at the time I would have stopped with cvsroot so I dumped everything in the top, or used InitialRelase so everything was isolated off. Admittedly, I&#8217;m used to much more robust version control software. With CMS, we dump everything into one project repository and create classes which contain generations. When you don&#8217;t have an OS which implements file versioning, I guess this is the best you can do.</p>
<p>If anybody else is starting a new OpenSource project on SourceForge and is befuddled on how to do the very first import, hope this helps. As with most things in the Linux/Unix development world, it is expert friendly.</p>
]]></content:encoded>
			<wfw:commentRss>http://logikalblog.com/2008/11/25/your-very-first-import-to-sourceforge/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Why I&#8217;m Ditching XM Radio</title>
		<link>http://logikalblog.com/2008/11/18/why-im-ditching-xm-radio/</link>
		<comments>http://logikalblog.com/2008/11/18/why-im-ditching-xm-radio/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 14:03:59 +0000</pubDate>
		<dc:creator>roland</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://logikalblog.com/2008/11/18/why-im-ditching-xm-radio/</guid>
		<description><![CDATA[The recent merger of XM and Sirus has proven the more management inbreeds the more it becomes unfit to walk the earth. Prior to the merger XM had two channels which completely justified its existence: Fine Tuning &#038; Audio Visions. These channels were unique in their nature and examples to be held up showing what [...]]]></description>
			<content:encoded><![CDATA[<p>The recent merger of XM and Sirus has proven the more management inbreeds the more it becomes unfit to walk the earth. Prior to the merger XM had two channels which completely justified its existence: Fine Tuning &#038; Audio Visions. These channels were unique in their nature and examples to be held up showing what the human race can aspire to become. Their loss can only be said to prove those against the proposed merger were correct.</p>
<p>Fine Tuning used to have the widest variety of non-mainstream radio music I&#8217;d ever found. In the same 45 minutes they could play Bach, Genesis, Jethro Tull, and several other artists nobody would associate together and somehow make it all work. There were shows which aired regularly such as Emerald Voyage featuring Irish folk and dance music, and a show featuring music of any genre written by original native Americans. These shows were fascinating. Had it not been for this station I would have never discovered a group called the Mediaeval Baebes, or an artist known as Nils Lofgren. Fine Tuning was a truly astounding station.</p>
<p>Audio Visions was that perfect background music for writing books or software. Most of the music had no lyrics. Simply beautiful sounds that evened out the stress of the day and allowed you to drift away when you needed to.</p>
<p>These were nearly the only stations I ever tuned in. They enriched the human species. Sadly, they are gone now. Soon my XM subscription will be gone as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://logikalblog.com/2008/11/18/why-im-ditching-xm-radio/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Qt4 and Postgres quick example</title>
		<link>http://logikalblog.com/2008/11/12/qt4-and-postgres-quick-example/</link>
		<comments>http://logikalblog.com/2008/11/12/qt4-and-postgres-quick-example/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 02:34:40 +0000</pubDate>
		<dc:creator>roland</dc:creator>
		
		<category><![CDATA[Information Technology]]></category>

		<guid isPermaLink="false">http://logikalblog.com/2008/11/12/qt4-and-postgres-quick-example/</guid>
		<description><![CDATA[Just a quick example of some very fundamental Postgres database access with Qt4.  I was tracking down a problem all afternoon, so thought I would post this test.  The only important thing to learn is that bindValue() really does only stuff the current value into a temporary string.  This is NOT like [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick example of some very fundamental Postgres database access with Qt4.  I was tracking down a problem all afternoon, so thought I would post this test.  The only important thing to learn is that bindValue() really does only stuff the current value into a temporary string.  This is NOT like an SQL pre-compiler which binds the variable for life, saving you a lot of work.</p>
<p>tax_2138=# select * from expenses;<br />
 tran_dt | category | tax_ded | payee | amount<br />
&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;+&#8212;&#8212;-+&#8212;&#8212;&#8211;<br />
(0 rows)</p>
<p>#include <QtGui><br />
#include <QtSql><br />
#include <QtDebug></p>
<p>int main(int argc, char *argv[])<br />
{<br />
	//int i_x;<br />
        QString dbName, localCategory, localPayee;<br />
        double localAmount;<br />
        QDate localTranDt;<br />
        bool localTax_ded;</p>
<p>	QApplication app(argc, argv);</p>
<p>	{<br />
            QString driverName = &#8220;QPSQL&#8221;;</p>
<p>            //<br />
            //  Set up information for driver and see if driver is available<br />
            //<br />
            QSqlDatabase db = QSqlDatabase::addDatabase(driverName, &#8220;xpns&#8221;);<br />
            db.setHostName(&#8221;localhost&#8221;);<br />
            QString dbName = &#8220;tax_2138&#8243;;<br />
            db.setDatabaseName( dbName);<br />
            db.setUserName(&#8221;");                    // yes I deleted my username<br />
            db.setPassword(&#8221;" );                   // yes I deleted my password</p>
<p>            //<br />
            //  Have they been good little children and created our database already?<br />
            //<br />
            if (!db.open()) {<br />
                qDebug() << "database wasn't opened";<br />
                return 0;<br />
            }</p>
<p>            QSqlQuery query(db);<br />
            db.transaction();<br />
            query.exec("INSERT INTO expenses( tran_dt, category, tax_ded, payee, amount)"<br />
                        "VALUES ( '21380506', 'Software', 'Y', 'CDW', 3456.72)");<br />
            qDebug() << "Rows affected from text only insert: " << query.numRowsAffected();<br />
            db.commit();<br />
            qApp->processEvents();<br />
            QSqlQuery preparedQuery(db);<br />
            preparedQuery.prepare( &#8220;INSERT INTO expenses( category, tax_ded, payee, amount, tran_dt) &#8221;<br />
                    &#8220;VALUES  (:category, :tax_ded, :payee, :amount, :tran_dt)&#8221;);</p>
<p>            db.transaction();<br />
            localTranDt = QDate( 2138, 10, 11);<br />
            localCategory = &#8220;Hardware&#8221;;<br />
            localPayee = &#8220;3Com&#8221;;<br />
            localAmount = 876.54;<br />
            localTax_ded = true;</p>
<p>            preparedQuery.bindValue( &#8220;:tran_dt&#8221;, localTranDt);<br />
            preparedQuery.bindValue( &#8220;:category&#8221;, localCategory);<br />
            preparedQuery.bindValue( &#8220;:tax_ded&#8221;, localTax_ded);<br />
            preparedQuery.bindValue( &#8220;:payee&#8221;, localPayee);<br />
            preparedQuery.bindValue( &#8220;:amount&#8221;, localAmount);</p>
<p>            qApp->processEvents();</p>
<p>            preparedQuery.exec();<br />
            qApp->processEvents();<br />
            qDebug() << "Rows affected: " << preparedQuery.numRowsAffected()<br />
                << " Error text: " << query.lastError().text();<br />
            db.commit();</p>
<p>            db.transaction();</p>
<p>            //<br />
            //  Simply changing the variable values isn't enough.<br />
            //  Qt doesn't work like SQL compilers which bind variables for<br />
            //  the life of the program.  There is no real bind here,<br />
            //  simply things being forced into a command string.  You have<br />
            //  to both change the data and bind the value.  I guess that is why<br />
            //  it is "bindValue" not "bindVariable"<br />
            //<br />
            localTranDt = QDate( 2138, 6, 11);<br />
            localCategory = "Books";<br />
            localPayee = "Borders";<br />
            localAmount = 88.99;<br />
            localTax_ded = true;</p>
<p>            preparedQuery.bindValue( ":tran_dt", localTranDt);<br />
            preparedQuery.bindValue( ":category", localCategory);<br />
            preparedQuery.bindValue( ":tax_ded", localTax_ded);<br />
            preparedQuery.bindValue( ":payee", localPayee);<br />
            preparedQuery.bindValue( ":amount", localAmount);</p>
<p>            preparedQuery.exec();<br />
            qDebug() << "just wrote duplicate row"  << preparedQuery.numRowsAffected();<br />
            qApp->processEvents();<br />
            db.commit();</p>
<p>        }</p>
<p>        return 0;</p>
<p>}</p>
<p>roland@roland-desktop:~/qt_stuff/db$ ./db<br />
Rows affected from text only insert:  1<br />
Rows affected:  1  Error text:  &#8221; &#8221;<br />
just wrote duplicate row 1<br />
roland@roland-desktop:~/qt_stuff/db$ </p>
<p>tax_2138=# select * from expenses;<br />
  tran_dt   |         category          | tax_ded |                       payee                        | amount<br />
&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;<br />
 2138-05-06 | Software                  | t       | CDW                                                | 3456.72<br />
 2138-10-11 | Hardware                  | t       | 3Com                                               |  876.54<br />
 2138-06-11 | Books                     | t       | Borders                                            |   88.99<br />
(3 rows)</p>
]]></content:encoded>
			<wfw:commentRss>http://logikalblog.com/2008/11/12/qt4-and-postgres-quick-example/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java Rots Your Brain</title>
		<link>http://logikalblog.com/2008/11/11/java-rots-your-brain/</link>
		<comments>http://logikalblog.com/2008/11/11/java-rots-your-brain/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 22:21:15 +0000</pubDate>
		<dc:creator>roland</dc:creator>
		
		<category><![CDATA[Information Technology]]></category>

		<guid isPermaLink="false">http://logikalblog.com/2008/11/11/java-rots-your-brain/</guid>
		<description><![CDATA[For the past few months now, I have been doing more Java than normal. This week, I started working with Qt and re-writing a system I use to track my expenses for tax purposes. The prior system was in Lotus Approach using DBF files and I wanted something which would work with 64-bit Ubuntu. I [...]]]></description>
			<content:encoded><![CDATA[<p>For the past few months now, I have been doing more Java than normal. This week, I started working with Qt and re-writing a system I use to track my expenses for tax purposes. The prior system was in Lotus Approach using DBF files and I wanted something which would work with 64-bit Ubuntu. I now only boot Windows when I have a strong desire to play either Lords of the Realm or Starcraft. It has been a long time since a client has demanded I run Windows and use a software VPN. I assume eventually there will be SISCO VPN software for 64-bit (or at least 32-bit) Ubuntu since that OS seems to be making quite a few inroads on corporate desktops.</p>
<p>Qt shouldn&#8217;t be difficult for me. After all, I used Zinc for a good number of years writing stuff on OS/2 which cross compiled for DOS, Windows, and Mac. I even published a couple books on the product. Perhaps it is just because I&#8217;m getting older. Perhaps it is because book publishers have forgotten the learning process. For most developers of my era, a new tool or language is learned by actually typing the listings in from the book. The books I&#8217;ve found on Qt have devolved into printing just the &#8220;relevant snippets&#8221; and providing a download link to get the full source. A download link is well and good, so is a CD in the back of the book. It helps those who just want to look at the thing or steal some code for a project. It doesn&#8217;t help those who want to learn the product.</p>
<p>Back in my college days, we were told to use one notebook for notes during class, and a second notebook to study from. We were supposed to take quick short notes in class, then copy them cleanly into an official notebook with additional material from our text and other information sources. Some high school classes I had actually graded our notebooks. The reason this was done is the repetition and multiple sensory focus re-enforced the learning process. You don&#8217;t learn by simply compiling examples and running them. It is very difficult to talk yourself into re-keying something that is already displayed in a text editor window. Takes a real force of will that most people don&#8217;t have.</p>
<p>So, how do we get from problems with Qt learning to Java rotting your brain? Read on.</p>
<p>Database access examples provided by most books are quite pathetic. Since they are focusing on just the needed IO calls/commands, all access information tends to be hard coded in the example. Things like username, database name, password, etc. all hard coded strings. Not the kind of code anyone would want in a production system (but sadly, the kind of code actually existing in a lot of shops.)</p>
<p>The first piece of code you have to develop on your own is a simple logon dialog. Depending upon the toolset you are using this can either be a dialog which prompts for and returns the information, or it can actually take the extra step of validating the connection information and creating the database object. I opted to connect and validate since that allowed me to create a shiny new database if the one I wanted was missing. Silly boy! You want something to function correctly. This is the age of Microsoft, where nothing works and nothing is expected to work!</p>
<p>Once I had that working, I created a second dialog to allow for entry and editing of the expense table while using the category and payee tables as foreign key references. When I added that dialog and tested the simple test of navigating to the screen and exiting it I was greeted with the following error:</p>
<p>QSqlDatabasePrivate::removeDatabase: connection &#8216;xpns&#8217; is still in use, all queries will cease to work.</p>
<p>Spent around 4 hours searching around on-line and trying various things to eliminate this error. Found a lot of bad advice on how to mask the error and some people saying it was only a warning they could ignore. Well, it&#8217;s really neither. You&#8217;ve created a memory leak and at least this is letting you know about it.</p>
<p>Part of the problem is that QSqlDatabase objects are global to your process. No matter where they get created in your program, once created they are accessible by any function/method. I have mixed emotions about that, but it is what it is. The other part of the problem was my having worked with Java for a while then reading in the Qt 4 book about how all things derived from the QObject would be cleaned up by the Qt application when it closed. It&#8217;s true as far as it goes, but it doesn&#8217;t go far enough.</p>
<p>Granted, I should have created a container QWidget and added the login dialog to that, but, I also shouldn&#8217;t have been forced into that design since you can create dialogs wherever you want and they will get cleaned up&#8230;mostly. The &#8220;order&#8221; of cleanup leads to problems though. The other issue forcing my decision was the fact the form needed to know which tax year it was dealing with to be created appropriately.</p>
<p>I know, many of you Unix developers would simply put the second form in its own thread where it could run yet another instance of an application and all would be right with the world. I have a personal issue with launching a new thread from a parent thread and allowing the parent thread to die immediately after launching the child. This is EXACTLY what creates dangling threads on systems.</p>
<p>The problem doesn&#8217;t have anything to do with the QSqlDatabase class itself, other than it is reference counting since it is global. The problem has to do with the default parameter for a QDialog, most notably</p>
<p>XpnsLogonDialog( QWidget *parent = 0);</p>
<p>Ordinarily, this isn&#8217;t an issue. Creating an un-anchored dialog which connects to a database causes the problem. Were it anchored to a QWidget, the QWidget would die and take all its children before the other global things would be reclaimed.</p>
<p>Where I got into trouble was when the dialog needed parameters for its constructor other than a parent value. Those values needed to come from the logon dialog itself. Adding insult to injury was the fact I was looking at code &#8220;snippets&#8221; which were relying on having a parent QWidget to control life and death of the object holding the database reference. Life is really good some times.</p>
<p>    else {</p>
<p>        connectionStatus = true;<br />
        xpnsForm = new XpnsForm( -1, _tax_year);<br />
        xpnsForm->show();<br />
}</p>
<p>The above snippet, executed when the logon information provided parameters which resulted in a valid database connection is where the wheels started to come off the cart. &#8220;new&#8221; put the allocation on the heap instead of the stack. Due to the way QObject gets cleaned up, the reference counter was still set. I tried everything, closing the database, calling removeDatabase, every suggestion, and still the reference counter caused the warning message. I was thinking this cleanup happened the same way Java garbage collection does. The cleanup would make N passes through the list collecting everything flagged for garbage collection and flagging new list entries as it freed things up. It doesn&#8217;t.</p>
<p>When all else fails, you use brute force.</p>
<p>	XpnsLogonDialog *dialog = new XpnsLogonDialog();<br />
	dialog->show();<br />
	i_x = app.exec();<br />
	delete dialog;<br />
 	db.close();</p>
<p>In the XpnsLogonDialog I was forced to create a destructor as well.</p>
<p>XpnsLogonDialog::~XpnsLogonDialog()<br />
{<br />
    nuke_subforms();</p>
<p>}</p>
<p>void XpnsLogonDialog::nuke_subforms()<br />
{<br />
    if ( xpnsForm != 0) {<br />
        delete xpnsForm;<br />
        xpnsForm = 0;<br />
    }<br />
}</p>
<p>While it is true I didn&#8217;t need to break it out into its own function, doing that allowed me to test one other thing.</p>
<p>	    XpnsLogonDialog *dialog = new XpnsLogonDialog();<br />
	    dialog->show();<br />
	    i_x = app.exec();<br />
            //delete dialog;<br />
            dialog->nuke_subforms();<br />
            db.close();</p>
<p>Both methods free up the resources and clear the reference counter.</p>
<p>Spend much time working with Java, and you will stumble when coming back to C++. The same is also true if you spend a lot of time with C++ and try to jump back to Java. Admittedly, this problem surfaced because of someone trying to be nice and rolling their own garbage collection into an application framework. I suspect it solves more problems than it causes. I remember a lot of people having memory issues with their Zinc applications because there wasn&#8217;t newbie friendly documentation, just some example programs people copied from, whether they applied to their project or not.</p>
<p>One other major issue I have with the published examples have to do with the following code. This code is mine and I have fixed the issue.</p>
<p>    //<br />
    //  Actual database setup begins here.  Keep in mind we have already<br />
    //  established a connection to the database at this point so fieldIndex()<br />
    //  should work correctly.<br />
    //<br />
    tableModel = new QSqlRelationalTableModel(this, QSqlDatabase::database(&#8221;xpns&#8221;));<br />
    tableModel->setTable(&#8221;expenses&#8221;);<br />
    tableModel->setRelation(tableModel->fieldIndex(&#8221;category&#8221;),<br />
                            QSqlRelation(&#8221;categories&#8221;, &#8220;category&#8221;, &#8220;category&#8221;));<br />
    tableModel->setRelation(tableModel->fieldIndex(&#8221;payee&#8221;),<br />
                            QSqlRelation(&#8221;payees&#8221;, &#8220;payee&#8221;, &#8220;payee&#8221;));<br />
    tableModel->setSort(tableModel->fieldIndex(&#8221;tran_dt&#8221;), Qt::AscendingOrder);<br />
    tableModel->select();</p>
<p>In the published examples, the create an enum for the field number and pass in compiled values to these and other database calls. That is an extremely bad practice, especially since the library already has the tools you need. Above, you will see I called fieldIndex() to obtain the column number from the currently connected database table.</p>
<p>Can anyone tell me why using a compiled enum is a bad practice?</p>
<p>That&#8217;s right! The database layout could change over time and you don&#8217;t want to be married to it. A five column example table has little chance of that, but what about a production table? What if you are only using five fields out of a production table that has 20 and the DBAs have to drop a column occurring before the columns you use? Sometimes you don&#8217;t even know about a change. The DBAs aren&#8217;t usually send out change request email that most developers ignore. Sometimes for performance reasons, they need to change the structure of a database. They do an unload and a reload, only the new table they reload into has the fields in a different order. You find out at 3 a.m. on Monday morning when your application won&#8217;t start and production is held up.</p>
<p>Wow! A rant AND useful information.</p>
]]></content:encoded>
			<wfw:commentRss>http://logikalblog.com/2008/11/11/java-rots-your-brain/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Numbered Headings in OpenOffice</title>
		<link>http://logikalblog.com/2008/11/02/numbered-headings-in-openoffice/</link>
		<comments>http://logikalblog.com/2008/11/02/numbered-headings-in-openoffice/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 23:03:45 +0000</pubDate>
		<dc:creator>roland</dc:creator>
		
		<category><![CDATA[Information Technology]]></category>

		<guid isPermaLink="false">http://logikalblog.com/2008/11/02/numbered-headings-in-openoffice/</guid>
		<description><![CDATA[Don&#8217;t get me wrong, most of the time, I&#8217;m very happy with OpenOffice. The thing which infuriates me about it is the lack of control being exercised over the developers. It appears to be designed by committees which communicate haphazardly rather than with some Queen Bitch riding herd over them and directing their efforts.
The move [...]]]></description>
			<content:encoded><![CDATA[<p>Don&#8217;t get me wrong, most of the time, I&#8217;m very happy with OpenOffice. The thing which infuriates me about it is the lack of control being exercised over the developers. It appears to be designed by committees which communicate haphazardly rather than with some Queen Bitch riding herd over them and directing their efforts.</p>
<p>The move towards XML Style Sheets was not a high point for word processing in general. Something which should have been handled behind the scenes simply keeps rearing its head in the middle of the user interface. Today, I had to re-learn something I have done in every &#8220;The Minimum You Need to Know&#8221; book: How to get numbers into my headings. This is one shining place where the XML back end needlessly slipped forward into the user interface. First let me explain what I&#8217;m talking about.</p>
<p><strong>Chapter 9</strong><br />
<strong>Working With Stupid People</strong></p>
<p>9.1 They Don&#8217;t Know They Are Stupid</p>
<p>The Number&#8217;s I&#8217;m talking about are the chapter number in the chapter heading and, more importantly, the 9.1 in the secondary heading. What you want to have happen is the chapter number increments with each new chapter and the subheadings keep count.</p>
<p>Everybody beats their head against the exact same wall. You hit the F11 key to bring up the style menu and try desperately to modify both Heading 1 and Heading 2. That is the logical place for such a feature to exist from a user interface perspective. Well, you are not even close when you look there.  Why does everybody make this same mistake?  Because you only need to do it once for the document and it just rolls merrily along after that.  In the case of a book, it could well be a year before you need to know this again.</p>
<p>Hidden under the Tools menu is a menu item called &#8220;Outline Numbering&#8221;. You must click on this, then select &#8220;Heading 1&#8243; for level 1, insert &#8220;Chapter &#8221; in the _before_ field. (Don&#8217;t forget the space.) You must also choose 1,2,3 as the numbering format and tell it to start with 1. Next you click on the &#8220;2&#8243; entry to choose the style for the second level. Here one must choose &#8220;Heading 2&#8243;; &#8220;1,2,3&#8243;, and most importantly, set the sublevel value to 2 or more. If you don&#8217;t change this value, you don&#8217;t get the nice little &#8220;9.1&#8243;, you get &#8220;1&#8243;.</p>
<p>I understand why the developer put it there, but they were just plain wrong for doing it.</p>
<p>Perhaps some day OpenOffice will be able to generate ePub file formats for the Sony readers and iPhones out there. Then, and only then, will the word processor focus shift to XML based storage begin to pay back a tiny fraction of the frustration it has inflicted upon the world. OpenOffice isn&#8217;t alone in this XML move, but currently it is the only one I see which is letting the XML back end slip through to the front end.</p>
]]></content:encoded>
			<wfw:commentRss>http://logikalblog.com/2008/11/02/numbered-headings-in-openoffice/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
