D3 operating patterns

[I originally posted this to vox.com on 18 Nov 2008.]

Managing photographic exposures using ambient light involves managing a triad of sensitivity, shutter speed, and aperture.  Change the value of one element of the triad, and like the sides of a triangle, at least one of the other elements must also change, or the exposure becomes incorrect.

In the days of film, sensitivity was conceptually fixed at a particular ISO.  Thereafter, only two sides of the triangle could be adjusted.  Automation allowed one to adjust those two sides by moving their vertex.  The only choice (on a full-featured camera like the F5) was from which direction to approach the vertex:  aperture-priority or shutter-priority.  In practice, this was trivial.  I always chose aperture-priority because it's all my FE2s had.

In the world of digital photography, one can adjust sensitivity from frame to frame.  This is a great power with which comes additional conceptual responsibility.  One must develop new patterns for managing the triad.

I'm currently evaluating two different patterns of exposure management on the D3:  "P" and "M".  I'm not exploring any options that require manual ISO adjustments, because the D3's controls do not make it easy to identify the ISO button by touch alone -- especially when wearing gloves.  Whether I settle on just one pattern, or switch between the two depending on the situation, remains to be seen.

Pattern "P" is encouraged by the D3's default settings.  The disadvantage is that shutter speeds that would match (for handheld use) a zoom lens's shorter focal lengths will be less accessible:
  • P: Programmed Automatic mode.  I used to get hung up on a desire to return the camera to its standard program after using a command dial to deviate from it, but I finally realized that this was pointless.  All I was deviating from was the median compromise.  Big deal.
  • On every lens change, set the Auto-ISO Minimum Shutter Speed to match the lens's maximum focal length.  This is less of a hassle now that the firmware provides a better way to access frequently-changed menu options.
  • Adjust the aperture-shutter vertex via one command dial.
Pattern "M" requires more intervention on every shot and may allow more image noise than necessary, but eliminates changing menu settings and makes handheld shutter speeds fully accessible no matter what the current focal length:
  • Auto-ISO ON with Maximum sensitivity = Hi-2.  This provides maximum ISO flexibility.
  • M: Manual mode.  This is the only mode in which the camera will loosen its death grip on ISO 200.  In all other modes, the camera would rather reduce shutter speed to below hand-held range than increase ISO (and therefore noise).  I'm willing to accept the noise if it's the difference between getting a sharp shot or a blurry one.
  • Adjust aperture and shutter speed via two command dials.
Fortunately, switching between the two patterns is a simple matter of depressing the mode button and rotating a command dial.

When CSS changes don't seem to work

[I originally posted this to vox.com on 20 Aug 2008.]

Consider that the browser probably caches the CSS file(s) associated with a page.  I was stuck for quite a while before I realized that IE7 was using cached CSS instead of my just-modified CSS file.  Clear the browser's cache between tests.

Using scriptmanager.RegisterPostBackControl on a button control in a GridView

[I originally posted this to vox.com on 20 Aug 2008.]

...doesn't seem to work.  Instead, the client still seems to expect just a partial postback.  My solution was to fall back to DataGrid instead of GridView.

Making peace with the pool

This post is about lessons we've learned as we've installed new equipment.

Text rendered this way is obsolete for our system, but has been retained to help explain prior decisions or in case we revert back to a prior configuration.

Our system now includes an inground pool with a volume of somewhere between 30,000 and 36,000 about 24,000 gallons.  It was put in by the previous owner, and we don't have the original paperwork.  It is 10 8 feet deep at the diving board end and 3 to 3.5 feet deep at the shallow end.  It has one skimmer and no bottom drain.  It has side returns and a return at the bottom of the deep end.  All the other circulation components are mounted lower than the prevailing water level.  We have a Pentair IntelliFlo VF pump, a Pentair HiFlow 6WAY VALVE 1-1/2" multiport, a Nautilus FNS 60 Diatomaceous Earth (DE) Sparco Hi-Rate SD-60 sand filter (apparently comparable to a Pentair Tagelus TA60), and an AutoPilot SC-60 a Pentair IntelliChlor IC40 salt chlorine generator system with a Pool Pilot Digital controller.  Before going back underground to the pool, the return pipe splits, and on one side of the split we have a booster pump for our pre-1996 Letro Legend robotic cleaner.

We bought the IntelliFlo pump in 2008 and put a new digital control head on it in 2016, and we bought the multiport in 2008 and replaced it in 2016.  So far they both seem like huge improvements, but we've had to learn about them by trial and error.

The new algorithm for opening the pool now seems to be as follows:

BEGIN // opening of the pool

Clean as much debris and dirt off the pool cover as possible.

Remove the pool cover.

Set up the pool-filling garden hose and the level-sensing flow controller.  Turn water on to that hose.

Use the pole net to remove all coarse debris that may be floating on the water's surface.
Clean the skimmer and the pump strainer baskets.

Open the ballcock ahead of the pump, and open the return splitter valve (by moving the "OFF" indicator away from all pipes).

Set the multiport to Recirc.  This takes the filter out of the loop.  The filter is only for removing fine particulate matter, but first we must remove all coarse matter.

Set the pump to Filter mode and run it.  This is appropriate even though we are not using the filter, and the reason is that the IntelliFlo's Filter mode enables all of the pump's self-protection sensors.

WHILE (water is circulating) and (the bottom is not visible) DO
Shock it relentlessly.  Use shock that provides chemically-free chlorine and that includes chlorine stabilizer.  Shock it until you can see what's at the bottom of the pool. 
Clean the skimmer and pump strainer baskets frequently. 
Get the water tested and make any necessary pH adjustments and salt additions.  Also throw in some algicide. 
Use the pole net to collect coarse matter from the pool bottom. 
IF you haven't already completely cleaned the filter THEN
Open the air purge valve. 
Direct the drain sump hose to keep the foundation of the house dry. 
Open the drain and let the vessel empty. 
Open the pressure vessel. 
Hose off all accessible DE and dirt. 
Remove the air bypass stem. 
Wrangle the entire filter assembly off of the upright return pipe and out of the vessel.  Lay it on its side, out of the way. 
Hose out the pressure vessel.  Create a vortex to flush the maximum amount of DE and dirt out. 
Remove the metal retaining rods from the filter assembly. 
Remove the upper and lower plastic framework parts. 
Hose off each filter element.  Check it for tears and broken ribs and replace it if necessary. 
Hose off the plastic framework parts (inside and out, for the upper one). 
Put the upper plastic framework part upside down on the pool deck. 
Insert the clean filter elements into the upper plastic framework part one by one. 
Finagle the lower plastic framework part, upside-down, onto the filter elements. 
Secure the metal retaining rods. 
Stage the filter assembly next to the vessel, right side up, and hose it off again. 
Place the filter assembly back into the pressure vessel, using a rubber mallet to attach it to the upright return pipe. 
Close the pressure vessel. 
Close the pressure vessel's drain. 
Verify that the green is going away and the water is clear enough for the bottom to be seen.

IF (the water is too cloudy for the bottom to be seen) THEN
Turn the pump off. 
Set the multiport to Filter. 
Turn the pump on.
Add a loading dose of PHOSfree.
Skim aggressively until the water is clear.  This means adjusting the water level (using the automatic filler and the multiport's Waste position) so it's just above the skimmer "sill"; running the IntelliFlo pump in Manual mode; and setting the pump to an RPM that moves as much water as possible without also sucking air into the skimmer.  Try 1600 RPM.

Turn the pump off.

Set the multiport to Waste and direct the waste/backwash/rinse hose to keep the foundation of the house dry.

Attach and manually prime (by hand-over-hand hose submersion) the vacuum equipment.

Set the IntelliFlo to Vacuum mode.


Turn the pump off.

Clean the pump strainer basket.

Remove the vacuum equipment.

Clean and replace the skimmer basket.

Clean the chlorine generator cell manifold's union screen.

Set the multiport to Backwash, set the IntelliFlo to Backwash mode, and start the pump.

When water starts streaming out of the air purge valve, close it.

The pump will turn itself off when the programmed amount of time has elapsed.

Set the multiport to Rinse.  The IntelliFlo will know that this is a Rinse cycle.  Restart the pump and let it run for the programmed duration.

The above Backwash/Rinse procedure triggers the IntelliFlo to reset some of its monitoring parameters.

Bring fresh DE to a position adjacent to the skimmer.  DE charging must begin within two minutes of completion of the next step.

Set the multiport to Filter, set the IntelliFlo to Filter mode, and start the pump.

Slowly (at the rate of one pound per minute) dump six pounds of fresh DE into the skimmer.

When all DE has been added, wait five minutes, then Make a note of the pressure on the filter.  This is the optimum pressure.

Stow the drain and waste/backwash/rinse hoses.

Add a loading dose of PHOSfree.  Skim aggressively until the water is clear.

The robotic cleaner system includes a little screen where the system plugs into the pool wall.  Clean that screen.

Attach and activate the robotic cleaner.

Set the AutoPilot controller Intellichlor so that it knows the pump is on, and so that the chlorine generator's normal duty cycle will be 40%.  Put it in Boost mode (24 hour constant-on) by pressing both the Less and More buttons simultaneously or Superboost mode (72 hour constant-on, activated by pressing and holding the Boost button).

Bring a water sample to the pool shop and treat the water as necessary.


END // opening of the pool

If only that were all there were to it.  Alas, the filter will collect dirt, and eventually it will need attention, as follows:

When filter pressure reaches optimum pressure + 14 PSI, the IntelliFlo will display warning indications.  Perform a backwash/rinse procedure, recharge the filter with three pounds (not six!) of fresh DE, then resume normal filtered circulation, and after five minutes, note the new pressure on the filter.  If the new pressure is at least optimum pressure + 45 PSI, the next filter cleaning must involve thorough disassembly, etc chemical cleaning (see manual) -- not just a backwash and rinse.

Corruption of Windows ACLs by Cygwin and GnuWin32

[I originally posted this to vox.com on 10 May 2008.]

I've seen a couple of cases now where Cygwin or GnuWin32 programs that operate on existing files seem to corrupt the ACLs on those files.  This becomes apparent on subsequent attempts to use those target files under Windows.  For example:
  • I've found it necessary to run SETACL on machine.config before (to backup) and after (to restore) running GnuWin32 sed on it, otherwise IIS can't read it.
  • Running svn under Cygwin seems to corrupt the ACLs on the db/current file and on the latest revision file in db/revs.  Certain subsequent operations on the repository, taken under Windows, will fail until the following procedure is performed using the file's Properties/Security/Advanced dialog:
    1. Remove all existing ACEs.
    2. Re-apply inheritable parent permissions.

LyX doesn't like the pound sign ("#") in folder names

[I originally posted this to vox.com on 13 Apr 2008.]

I accidentally discovered that LyX 1.5.4 will incur fatal errors if you attempt to save (export) your work to a PDF file that resides in a folder whose name includes the pound/sharp ("#") sign.

Generating PDF files with nice fonts using LyX

[I originally posted this to vox.com on 13 Apr 2008.]

Huh?  It's as simple as that?

To get LyX to generate PDF files with fonts that look good on both paper and screen, just delete the "TeX encoding" field value on the Tools / Preferences... / Outputs / LaTeX dialog.  This applies at least to LyX 1.5.4.

As initially installed, that field contains the value "T1".  My understanding is, that value provides better international compatibility.  T1 encoding causes LyX to embed only Type 3 (bitmapped) fonts in PDF files.  You can verify this by checking the embedded fonts section of the document properties in the generated PDF files.

If you only plan to write in English, you most likely don't need T1 encoding.

The problem is that bitmapped fonts don't scale (grow and shrink) well.  Type 1 fonts, however, are "outline" fonts, which are scalable to any size.  If you delete the "TeX encoding" field value, LyX will embed Type 1 fonts into the PDF output, and your documents will look great.

I can't account for the nomenclature:  Why does the "T1" value generate "Type 3" fonts instead of "Type 1" fonts?  It's counterintuitive, isn't it?

I also can't account for why the LyX installer doesn't explain this and offer to adjust it at install-time.  It offers to set the default paper size to US Letter, and the default language to English.  It sure would have saved me a lot of time and aggravation if it would explain the situation and offer to null out the default TeX encoding.

Solving the "open DataReader" error

[I originally posted this to vox.com on 22 Feb 2008.]

Upon migrating an ASP.NET app from Borland Delphi 2006 to CodeGear RAD Studo 2007, from ASP.NET 1.x to 2.x, and from CoreLab BDP.NET MySQL Provider to MySQL Connector/NET, I started getting this error on attempts to commit a certain transaction:
There is already an open DataReader associated with this Connection which must be closed first.
The transaction was coded roughly like this:

    DataGrid(target).datasource := mysqlcommand.Create

    if a_condition then begin

The exception would be thrown on the Rollback after the Commit had failed.

Apparently DataBind does not close the mysqldatareader that is implcitly used as the datasource for the DataGrid.  This should not have surprised me, but prior to migrating my app, this transaction worked, so I was temporarily at a loss when this problem arose.

The solution was to explicitly close the mysqldatareader by inserting this line immediately after the DataBind call:


Three alarm fire on Hiawatha

[I originally posted this to vox.com on 10 Feb 2008.]

I was on Zone 7 and I assumed Medical Group Supervisor with ambulances 920R, 921R, 1621S, and Support 9. One building (8 residential units) will have to be demolished, and two other buildings were heavily damaged -- one of them all the way across Indian Lakes Boulevard. Winds were gusting to 30 mph.

Why setting my Nikon D3's Image Quality to TIFF is right for me

[I originally posted this to vox.com on 4 Feb 2008.]

Photo.net surveys the image file format landscape here.

The inescapable fact is that you can't ever display an image that contains all the information that Nikon's FX sensor gathers.

Sure, you can store the raw sensor data -- all four channels of it -- at either 12 or 14 bits per channel by setting the Image Quality to NEF, but every device capable of rendering your image can only render three of those channels -- the Red, Green, and Blue channels (thus RGB) -- at 8 bits per channel. This is true of the D3's built-in rear LCD, it's true of all computer monitors, it's true of any color TV, and it's true of any color printer. So by the time you see your image, you're going to lose 4 or 6 bits of information on the RGB channels, and you're going to lose the fourth channel altogether.

So why in the world did Nikon spend so many years developing a sensor that collects more information than any image rendering device viewer can ever display?  Because you can and usually do make use of that extra information during your "workflow" -- that is, when you adjust stuff like white balance, contrast, saturation, resizing, sharpening, etc. They are all lossy transformations.

Go ahead and take a moment now to embrace that horror.

The real issue is, are you going to perform those lossy transformations "in camera", using Nikon's firmware algorithms, or are you going to perform them after you get the information off the camera (ie, in Picture Window Pro, etc)?

If you favor -- and want to archive -- the D3's built-in transformations, and the control that the D3 gives you over them (collectively called Picture Controls by Nikon), then you must either base your workflow on Nikon-proprietary off-camera software such as ViewNX, CaptureNX, and their descendants; or allow the D3 to store the results of those transformations in either TIFF or JPEG format. TIFF storage does not introduce any *additional* loss. JPEG does.

If ending up -- permanently -- with just one size image, and more specifically one of the three sizes offered on the D3 (L, M, or S) is ok with you, just save in JPEG format. You can fit more pictures on your memory card that way.

But if, like me, you want the ability to generate JPEGs of arbitrary size (I publish my images in three standard sizes) using only standards-based software, then save in TIFF format.