Books I’ve read in 2005 but have not yet reviewed

I didn’t plan on doing anything like this.  So I didn’t track everything  I read.  Luckily I was on a series binge in 2005.  So I could look up the most of them easily.  I’ll try to get reviews of each of these on here later. 

Here’s what I remember:

The Burglar in the Rye by Block, Lawrence.
The Burglar Who Studied Spinoza by Block, Lawrence.
The Burglar Who Traded Ted Williams by Block, Lawrence.
The Burglar Who Painted Like Mondrian by Block, Lawrence.
Burglars Can’t Be Choosers by Block, Lawrence.
The Burglar in the Closet by Block, Lawrence.
The Burglar Who Liked to Quote Kipling by Block, Lawrence.
The Burglar Who Thought He Was Bogart by Block, Lawrence.
Marker Cook, Robin.
Seizure by Cook, Robin.
Shock by Cook, Robin.
Saga of Seven Suns Book 1: Horizon Storms by Anderson, Kevin J.
Saga of Seven Suns Book 2: A Forest of Stars by Anderson, Kevin J.
Saga of Seven Suns Book 3: Hidden Empire by Anderson, Kevin J.
The Dark Tower I: The Gunslinger by King, Stephen.
The Dark Tower II: The Drawing of the Three by King, Stephen.
The Dark Tower III: The Waste Lands by King, Stephen.
The Dark Tower IV: Wizard and Glass by King, Stephen.
The Dark Tower V: Wolves of the Calla (title originally announced as The Crawling Shadow) by King, Stephen.
The Dark Tower VI: Song of Susannah by King, Stephen.
The Dark Tower VII: The Dark Tower by King, Stephen.
Anne of Green Gables by Montgomery, L. M.
Anne of Avonlea by Montgomery, L. M.
Anne of the Island by Montgomery, L. M.
Anne’s House of Dreams by Montgomery, L. M.
Vulcan’s Soul. Book I, Exodus Star Trek; by Sherman, Josepha.; Shwartz, Susan
Captains Corageous by Rudyard Kipling
Dagon’s Kin – Todd MaCaffery
Faith of the Fallen by Terry Goodkind
Left Behind: A Novel of the Earth’s Last Days by Tim F. LaHaye,Jerry B. Jenkins
Tribulation Force: The Continuing Drama of Those Left Behind by Tim F. LaHaye,Jerry B. Jenkins
Nicolae: The Rise of Antichrist by Tim F. LaHaye,Jerry B. Jenkins
Soul Harvest: The World Takes Sides by Tim F. LaHaye,Jerry B. Jenkins
Apollyon: The Destroyer Is Unleashed by Tim F. LaHaye,Jerry B. Jenkins
Assassins: Assignment: Jerusalem, Target: Antichrist by Tim F. LaHaye,Jerry B. Jenkins
The Indwelling: The Beast Takes Possession by Tim F. LaHaye,Jerry B. Jenkins
The Mark: The Beast Rules the World by Tim F. LaHaye,Jerry B. Jenkins
Desecration: Antichrist Takes the Throne by Tim F. LaHaye,Jerry B. Jenkins
The Remnant: On the Brink of Armageddon by Tim F. LaHaye,Jerry B. Jenkins
Armageddon The Cosmic Battle of the Ages by Tim F. LaHaye,Jerry B. Jenkins
Glorious Appearing: The End of Days by Tim F. LaHaye,Jerry B. Jenkins

Books I’ve read in 2006 but haven’t reviewed yet

Read in 2006
Saga of Seven Suns Book 4: Scattered Suns by Anderson, Kevin J.
The Da Vinci Code by Dan Brown
The Time Machine by Wells, H. G.
Califia’s Daughters by Richards, Leigh
Those Who Walk in Darkness by Ridley, John.
S is for Silence by Sue Grafton – Not yet completed

Angels and Demons by Dan Brown – Not yet completed

WordPress 2.0 themes are now available.

The first of the WordPress 2.0 themes are up! I’m trying out the new BinaryBlue theme.  But it has a BIG surprise waiting for non-localized blogs that try it.  It will crash your blog and your admin pages.

It is a localized theme. That means that you HAVE to have a special setting in your WP-Config .

You know that section in wp-config.php that most of us have ignored? the one that says:
[PHP]
// Change this to localize WordPress.  A corresponding MO file for the
// chosen language must be installed to wp-includes/languages.
// For example, install de.mo to wp-includes/languages and set WPLANG to ‘de’
// to enable German language support.
define (‘WPLANG’, ”);

[/PHP]
Well, if you don’t have a value in there when you choose the new Binary blue theme, you only get this :

Cannot instantiate non-existent class: cachedfilereader […]

on every page of what you had previously thought of as your blog…

Luckily, the fix is simple… change the define line in the config file to this:
[PHP]

define (‘WPLANG’, ‘en_US’);

[/PHP]

and your site will work again (after it does some initial chugging to apply the localization – give it half a  minute…)

Beyond that, the theme is wonderfully well organized.  The options page is a treat and the developer, and you can see from his comments , that he is helpful and seems to know his stuff.  I’d like my WP3.0 theme to be as well organized.  This theme, though still 1.0, sets the standard that many should follow.

I do wish there was a readme file that explained that step or that localization was turned off by default.

I also tried turning on the ie7 “fixes” feature that the author gets tripple Kudos for turning into a configurable option rather than just building it in, and it caused some of my posts to wrap the sidebars down to the end of the page.  So that option is off again.

I’ll try do a full review of it over the weekend.

Hey, Kevin should create a blog entry for theme reviews that we can all point our tracebacks to…   Good idea?

WordPress 2.0 Theme competion SLAMMED with entries

Justin innocently thought he would have a little competion to allow bloggers to compete with their WordPress 2.0 themes

Now in the last day his email box was flooded with entries.  A total of 188 themes were submitted!  Now the poor guy is left with no, if he ever had one, life for the next 6 months as he reviews these themes!

Ya gotta giggle: http://kcyap.com/competition/?p=24

Actually it makes me want to start a WordPress 3.0 them competition site right now. Then we’ll have a chance at having something organized by the time WordPress 3 is released in a few years!

Hiding an EXE or Virus inside a TXT file or JPG.

AKA: Alternate Data Streams – An introduction…

One of the members of a technical forum to which I belong had a virus detected in a dll that he could not find anywhere on his computer.  In the end, it was discovered that the file was embedded as Alternate Data Stream (ADS) attached to his System32 directory.  The full path to the file was something simlar to c:\windows\system32:dhht.dll.

I was not familiar with using streams in this manner; so I looked it up.  In short, any file or directory on an NTFS drive can any number of files piggy-backed onto it without affecting its reported file size.  These files remain intact through normal file copying and renaming actions as long as the file remains on an NTFS drive (or compatible archiver).

I’d never come across this before and thought I would share.
Summary/Demo….    (adjust paths as necessary)

  1. Create a directory off the root called test
    From the command prompt in your test directory type:
       [DOS]Echo a>test.txt[/DOS]
       That will create a nice 3 byte text file.
  2. Now type:
       [DOS]type c:\Windows\system32\notepad.exe>test.txt:notepad.exe[/DOS]
  3. Get another directory listing and notice that the size of test.txt remains 3 bytes though an additional ~70kb has been added to it.  The time has changed but that could be set back.
  4. Now, from the command prompt in your test directory, execute the hidden stream:
       [DOS]start \test\test.txt:Notepad.exe[/DOS]
       (You must use include the path to test.txt)

You are now running an exe that was hidden in 3 byte text file!
As far as Windows is concerned, that file takes up only enough space for three characters.  Yet it’s got this hidden back end on it.  That txt file could be taking up any amount of space.  Perhaps it is storing 5 gigs of pictures in it.  Who knows?
Windows supplies no tools to display this.  The zip file referenced in this article, includes an exe that does. 
The Task Manager shows the running proces in different ways depending upon your Windows version.  In SP2, the executable is listed as test.txt:Notepad.exe. However, in earlier versions of windows, only the host file is listed.  So, if you’d embeded Notepad.exe in calc.exe, calc.exe would be in the task list even though you’d be running Notepad.  Nifty huh?
Of course, you’ll have to find a transport/archiver that supports these streams, if you want to distribute them.  Outlook and WinZip do not seem to do so.
Apparently ADS are there for backwards compatibility with a Macintosh file system (HFS), but I’m not sure why we’d want/need that…  Some Windows apps use it for other things.  For example when you download an exe file through IE, MS helpfully edits the file for you and attaches an ADS that stores the Zone under which the file was downloaded.  As a result you are NEVER getting the same file that was on the internet.  Developers should be aware of this when they deploy software via a website. 

In short, while Alternative Data Streams do add some flexibility to the operating system, the incomplete implementation of the feature makes ADS more of an avenue for abuse than a feature.

Common mistake: Don’t rely on exception handling.

Steve Trefethen, Senior R&D Engineer Delphi/C#Builder for the Borland Software Corporation had an EXCELLENT post on his BLog. It emphasizes the cost of a mistake that I always see in example code on the web and in WordPress plug-ins as far as that goes.

Here’s the law that is always broken: “If you know an error is likely to occur in your code, check for that condition first.  DO NOT rely on exception handling detect it.”

This applies whether you are waiting for file access to fail  or an SQL insert statement to come back with an error.  Check to see if the condtion (or record) exists and then have your program handle it correctly.

Generic exception handling should only be used when you cannot predict or test for the condition. 

Newer versions (5+) of MySQL have a clause for inserts called ON DUPLICATE KEY.  Many MySQL programmers are starting to rely on it, but it too has a cost.  Even a single call that runs two insert queries with exception handling thrown in there is almost always going to be slower than checking for the record first and chosing what to do based upon the result of the read only select.  The ONLY reason I see for that call to exist is if it locks the database as it is running and therefore you KNOW the has not changed after your Select query is run. So it does have its application.

 Maybe this article will help others come around: 

BDS 2006, slow compile times and the cost of exceptions

While browsing the newsgroups I ran into a thread where a user had commented that BDS 2006 compiled his application incredibly slowly. A while ago I’d had a discussion with Mark Edington our resident performance maverick about this issue and it turns out that it’s a good reminder of the cost of raising an exception or in this case lots of them.

Since Mark debugged this issue he kindly provided me with a short write up of the specifc problem, it’s solution and a workaround.

Mark write:
In BDS 2006 in Delphi a performance issue arises when compiling projects in the IDE when the source files in the project are marked as read-only on disk. The more files in the project the more significant the delay. The problem only affects projects that have read-only source files. The root of the problem, is a callback procedure which is called by the compiler when compiling in the IDE. The callback is designed to open the file and return an IStream interface:

 


function OpenOSFile(const Name: string): IStream;
begin
  { try opening existing file so that read/write operations are
    possible }
  Result := nil;
  if FileExists(Name) then
  begin
    try
      Result := TOSFileStream.Create(Name, fmOpenReadWrite or 
        fmShareDenyNone);
    except
      on EFOpenError do
        Result := TOSFileStream.Create(Name, fmOpenRead or 
          fmShareDenyWrite);
    end;
  end;
end;

Notice the try/except block, since there is no parameter to the function that specifies what access rights to use when opening the file, the procedure tries to be accommodating and provide read/write access first and if that fails it resorts to to opening the file as read-only. Unfortunately, as written, it introduces a serious performance penalty for anything other than small projects. Interestingly enough, the performance issue isn’t from the fact that it takes 2 attempts to get a read-only file opened, it is actually caused by the exception that is raised when the first (read/write) TOSFileStream.Create call fails.

In the test case that was submitted for diagnosing this problem the RaiseException procedure (which is a Windows API call), was accounting for nearly 40% of the total compile time. Under a profiler it took nearly 50 seconds to execute that procedure about 1100 times. That works out to around 45 milliseconds per call which may not sound like that much, but when executed 1100+ times it adds up.

The solution was very straightforward: Rewrite the routine and remove the exception based fallback algorithm. The new version looks like this:


function OpenOSFile(const Name: string): IStream;
var
  Code: Integer;
begin
  Result := nil;
  Code := GetFileAttributes(PChar(Name));
  if (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code = 0) then
  begin
    if (FILE_ATTRIBUTE_READONLY and Code = 0) then
      Result := TOSFileStream.Create(Name, fmOpenReadWrite or
fmShareDenyNone)
    else
      Result := TOSFileStream.Create(Name, fmOpenRead or
fmShareDenyWrite);
  end;
end;

This version first checks to make sure the file is not marked as read-only before attempting to open it as read/write. The FileExists call that was replaced in the original version of the procedure is actually implemented using GetFileAttributes anyway, so there was no extra overhead introduced to make the check.

The moral of the story is avoid writing code that raises exceptions as part of the normal course of program execution. Exceptions are horrifically expensive to raise and handle and should be reserved for the truly “exceptional” events. If you have a medium to large Delphi project that has files marked as read-only the workaround for this issue is to mark them as read/write until this fix is made publicly available.

posted on Monday, February 27, 2006 3:51 PM

Graphics programming in Delphi

This was a brief introduction to Graphics programming that I wrote a few years back… The concepts are all good even if the links are not.  🙂  Many of the resources for Delphi graphics programming were disappearing even then.  So this article is now the only place to get some of these examples…

http://www.TheCodeCave.com/Queeg/GraphicsProgramming/index.htm

Brian Layman on .Net Programming

I’ve used this twice now.  So I’ll add it here.

Some PHP zealot stated that because PHP could be used in conjunction with AJAX, .NET was dead.  I should have just let him go, but he was being so arrogant that he could only be some 14 year old sitting in his parents house spouting “wisdom” for the masses despite his bragging of being a VB programmer with 20 years of experience.  And frankly I don’t see much difference between a 14 year old living with his parents and a Visual Basic programmer with 20 years of experience (so sorry ;p).

So, here is my response and more importantly my explanation of what .NET programming is and isn’t:

“[..] Microsoft is spouting that Win32 is dead not that .NET is dead.  While I agree that is not correct (Win32 is far from dead), it is not because .NET is going to leave the scene any time in the next 20 years.  .NET
programming is the only manner of programming MS’s new compilers allow. Really .NET isn’t a language at all.  It is a standard that can be used by any programming language to get your code into a third neutral language that will run on any platform. Basically you don’t compile into machine code anymore.  That way all of the tricks the hacker uses are eliminated.  No more reading areas of memory that don’t belong to you.  No more expanding your strings with binary code to put stuff where it doesn’t belong.  [No more grabbing initialized memory and accidentally getting the contents of an email that was just sent out.] The second level of compiling ensures none of that exists in the new final machine code.  Then the OS (Vienna?) will not allow anything that is not .NET compliant to run.

So, you write something in C or Delphi in a way that conforms to the .Net standard.  That compiler translates your code into a Common Intermediate Language that will be compiled again in a by a Common Language Runtime (CLR) to run on specific platforms (OSs).  MS’s .Net framework, the only.net “platform” that we have right now, is just the transition path to allow us to start writing applications now that will compatible with their future OS’s.  It’s a pretty smart plan really.  We are a long time away from having a OS that only supports programs written under the .NET specs (2009?), but MS is starting to make those programs the only type that can be written.”  

[continuing] 

And in that fashion Microsoft ensures their new OS standard will be adopted even when drop backwards compatibility to Windows Server 200x and Windows Vista and Windows XP by saying that their OS will  no longer allow 16 bit and Win32 bit programs to run.  The fact that no major programming languages, other than Delphi 2006, support Win32 programming ensures that by 2009 most apps that are less than 5 years old will be .NET and run on MS Vienna without a problem and MS can say that they have achieved 95% compatibility.  They have found a way achieve forward compatibility with an operating system half a decade into the future.

I have to say that is somewhat impressive. They definately do some things right.  Just don’t get me started about feature level de-activation in Windows Vista.

There are problems there. For instance, I changed some hardware in my computer. Outlook deactivated itself and required I put in the original disk to get it to work. Fine. I did that and ti was working again. But just now it deactivated itself again, because it suddenly decided I must be a thief. I’m connecting via Remote Desktop and some bug must have led it to determine that my hardware had changed again.  I AM VPNING IN HOW CAN I INSERT THE CD???? IT IS ON MY DESK AT HOME!!!! AAAGGHHH! I guess you take the good with the bad…

*UPDATE: AND NOW IT’S HAPPENED TWICE!!! but that’s for another post….

What is this Category?

What is this Category?

The WordPress-list-heirarchical-categories feature has a bug that means that parent categories must have at least one post or the categories underneath won’t be displayed.  SOOOOO….. Here’s the obligatory post for this category…

Here I will write about stuff I want to do – and maybe I’ll add a category specifically for stuff I’ve said I’ll do…