Main menu:

Site search



MSEE thesis: The Automated Software Phase-Locked Loop

Several years ago I received a query from someone who had searched the web for information on software phase-locked loops and found my resume, which referenced my MSEE thesis. At the time I didn’t have access to the source files (on 5.25″ disk, Microsoft Word 2.0 format), so I wasn’t able to help them out. Since then I’ve found the sources and brought them into a modern format. On the off chance that someone is searching the web and would find this useful, here’s a PDF which has been lightly edited for brevity. The title, however, retains its grandiose verbosity.

Written in 1993-1994 at the University of Wisconsin – Madison.

Surprised by security vulnerabilities in my Debian desktop

I’ve been running Debian “Squeeze” (aka “stable”) on my desktop for years. With a single exception (Oracle’s VirtualBox) this computer only uses software packages from the Debian repositories, which in theory makes it simpler to keep the software up-to-date. I’ve trusted that periodic updates kept this software current and was surprised to find that the most vulnerable software — Java, the Flash plug-in, and a web browser — were not being updated.


This investigation started when Iceweasel (Debian’s rebranded Firefox) warned me that my Java plug-in was insecure. It turns out there are known exploits circulating for Sun’s Java version 1.6.0_32 and earlier, while Debian’s sun-java6 package remains at version 1.6.0_26 from June of 2011.

After version 1.6.0_26, Oracle changed their licensing terms which disallowed Debian’s redistribution of this software. Debian has removed this package from the next stable release (“Wheezy”) but decided to keep it in the repository for the current stable release (“Squeeze”). It’s unfortunate that users of this package do not see a warning when updating their system to alert them of the need to download the update from Oracle or to remove the package.

I considered filing a security bug against the package to this effect, but I then learned that software in Debian’s “non-free” and “contrib” repositories are not supported by the security team:

Q: How is security handled for contrib and non-free?

A: The short answer is: it’s not. Contrib and non-free aren’t official parts of the Debian Distribution and are not released, and thus not supported by the security team. Some non-free packages are distributed without source or without a license allowing the distribution of modified versions. In those cases no security fixes can be made at all. If it is possible to fix the problem, and the package maintainer or someone else provides correct updated packages, then the security team will generally process them and release an advisory.

An advisory sure would be nice even if it can’t be fixed.

Incidentally, to determine what software packages you’ve installed from the “non-free” or “contrib” repositories, install the Debian package “vrms” (which stands for “Virtual Richard M. Stallman”).

There’s also an inconsistency in how Sun’s Java is handled as compared to Adobe’s Flash plug-in, which has a similar restriction on its redistribution. To install Adobe’s Flash plug-in, a Debian user can install the package flashplugin-nonfree. This package will then download the Flash plug-in directly from Adobe to your computer. I find this to be very convenient and it’s a shame there is no such package available for Sun’s Java in the Debian repository.

However, if you are willing to trust a relatively unknown third-party repository, a volunteer has released a similar package which installs the latest version of Sun’s Java on Debian.


This led me to examine the other brower plug-ins on this system. I was also surprised to learn that my Adobe Flash plug-in was very old. What I learned here is that the flashplugin-nonfree package will install the latest version of Adobe Flash, but it only does that at the time the package is installed. There was a bug filed against flashplugin-nonfree to address this, and sadly that bug was tagged “security, wontfix.”

You can address this by running “update-flashplugin-nonfree –install” periodically. I added it to a maintenance script that runs weekly.

Chromium web browser

About six months ago I switched from Debian’s Iceweasel (rebranded Firefox) to Chromium (the open source version of Google Chrome). The Iceweasel in Debian’s “stable” repository is version 3.5 with added security patches, which is quite old but functional. The Chromium in the “stable” repository is version 6.0.472.63~r59945-5+squeeze6, which — because it’s in the “stable” repository — I assumed was also being updated with security patches. So while researching the above I was yet again surprised to see a long list of unfixed remotely exploitable bugs listed for chromium-browser in the security tracker for Debian stable. At this time it has been almost a year since the last update in the “stable” repository, which is a long time for a web browser, and the package information is showing a total of 274 open security issues.

Since Debian is a volunteer-based organization, the best solution would be for me to step up and help update this package. That is unfortunately not something I can do right now, so I uninstalled chromium-browser and switched back to Iceweasel.


I then stumbled upon, which maintains newer versions of Iceweasel than is present in the Debian “stable” repository. This is nice because Iceweasel 3.5 (think of it as Firefox 3.5) is getting a little long in the tooth. Following the instructions on that page, I added

deb squeeze-backports main
deb squeeze-backports iceweasel-release

to /etc/apt/sources.list, and ran

apt-get update; apt-get install -t squeeze-backports iceweasel

This upgraded Iceweasel from version 3.5 to version 10.0. Version 10 is the latest from, which on my system had a higher priority than To obtain version 14.0, I had to manually specify the highest version shown by “apt-cache policy iceweasel”, which is currently 14.0.1-1~bpo60+1:

apt-get install -t squeeze-backports iceweasel=14.0.1-1~bpo60+1

Since Iceweasel 3.5 received regular security updates, the upgrade to version 14.0 wasn’t strictly necessary. It’s much faster though.


This experience was rather eye-opening. Somewhere the way I’d picked up a set of erroneous assumptions about how software packages from the Debian repositories were supported from a security perspective, and I learned that I really need to keep a closer eye on my web browser and its plug-ins.

How to sauté an onion

Last year I began a tradition of cooking a heart-shaped pizza for Valentine’s day. This was ambitious because I don’t know the first thing about cooking.

As a novice, my biggest challenge is that cookbooks assume you already know how to cook. They’ll tell you to do things, like marinating meat, or sautéing an onion, without telling you how to do those things. And it’s not at all obvious to me where you can find that information if you don’t already have it.

So naturally I started searching the web. And I found that there were only three pages in all of google’s universe that contained the phrase, “how to saute an onion”. And none of those pages told you how. Disappointed in the usefulness of the web, I called Kay and she walked me through it by phone.

Fast-forward a year. Valentine’s day was two weeks ago, and I was reminded of this episode. While trying out GoodSearch, I found that the only page it returned for “how to saute an onion” was my own page, where I related the story about not being able to find instructions for sautéing an onion. That just didn’t seem right. I asked Kay to sauté an onion while I took pictures, so we could fix that situation.

Without further ado, here it is: How to sauté an onion.

1. You will need an onion.


2. Peel the onion. It’s easier if you cut the ends off first.

Peel the onion

3. Chop the onion according to what your recipe specifies.

Chop the onion

4. Put a little vegetable oil in your pan. Kay recommends olive oil for the best flavor.

Oil in pan

5. Heat the oil over medium-high heat.

Medium-high heat

6. When the oil begins to shimmer (or when it’s hot, but not smoking), add the onion.

Add the onion

7. Stir frequently so it cooks evenly.

Stir frequently

8. Most recipes want you to cook the onion until it is tender and slightly translucent. If the recipe calls for a caramelized onion, keep cooking until it starts to brown. This results in a sweeter onion flavor. Don’t believe the recipe if it says to sauté the onion until it is transparent. I can tell you from experience that this will NEVER HAPPEN.

Below is a nicely sautéd onion.

Sautéd onion

Adjusting the simmer flame on a gas stove

We recently installed a stove in our home. This stove required a conversion from natural gas to propane (LP). The installation instructions walked us through the process, which included changing the pressure of the regulator valve, installing smaller orifices in each of the burners, and adjusting the air flow for proper combustion.

When we were done, everything worked fine, except the range burners would not go lower than this:

Simmer flame before adjustment

This, the lowest flame, would still sustain a full boil in a large pot. That’s far too much heat for slow cooking for rice or stews.

I called Whirlpool to ask if there was any way to adjust the burners to give a lower flame. They asked a lot of questions about the conversion – had I changed the orifices, had I changed the regulator’s pressure, did I adjust the air flow – and suggested I call an appliance repair service to take a look at it.

While searching the web for answers, I came across this text on

One detail that’s commonly overlooked on these is the simmer settings. Each top burner valve has a small screw inside its shaft that can be adjusted to provide a low simmer. This adjustment must be made on each burner once the range has been converted, or ‘simmer’ settings will be far too high to be useful.

A small-bladed screwdriver is needed for most of these. If you can’t find one small enough, it’s possible to grind one down to fit. I’ve noticed some of the most recent ranges are using a larger screw that’s a lot easier to access, and that’s a welcome change.

You’d think if this were true for our stove, this information would have been in the installation instructions, or at the very least, that someone at Whirlpool would have mentioned that when I called. I had to pull off a knob and see for myself.

Remove the stove knob

What’s in the center of the shaft? It looks like a small, flat-head screw.

Simmer setting adjustment screw

Sure enough, none of our screwdrivers were narrow enough to fit into the shaft. I took a bench grinder to one that I wasn’t particularly attached to, and ground down the flared sides to make it fit into the shaft.

Narrow screwdriver

I put the knob back on the oven, lit the burner, turned the knob to its lowest setting, then pulled the knob and adjusted the screw. It didn’t take very much movement to significantly change the flame – maybe 1/2 turn from smallest to largest.

Adjusting the simmer flame

After the adjustment, the high flame is the same as before, but the low (simmer) flame is much, much lower.

Simmer flame after adjustment

CAUTION: If you set the simmer flame to be too low, the flame may go out. If this happens, the stove will continue to send a steady trickle of gas to the burner, which will not be burned. This is VERY DANGEROUS and could even lead to an explosion if it is allowed to continue. Make absolutely sure that the simmer flame will not extinguish, and monitor it closely while you are using it. A rule of thumb is to set the simmer flame so that it stays burning even if you blow on the burner (from a safe distance, of course). If you are able to extinguish the flame by blowing on it, it is probably set too low. If you are unsure, get a professional to make this adjustment for you.

Windows 2000 and Daylight Saving Time

For the last twenty years, most of the United States has observed Daylight Saving Time from 2:00 a.m. on the first Sunday of April until 2:00 a.m. on the last Sunday of October.

Starting in 2007, Daylight Saving Time will be extended so that it begins at 2:00 a.m. on the second Sunday of March and ends at 2:00 a.m. on the first Sunday of November.

Windows XP will have patches available through Windows Update to make this change. Windows Vista is so new that it will ship with the 2007 schedule.

There is a patch available for Windows 2000, but it’s only available to those who have purchased Extended Hotfix Support. I guess this is meant to encourage us to upgrade to Windows XP or Vista (or to punish us for not doing so already).

Instead, Microsoft has posted a page with instructions on how to change the Daylight Saving Time information manually. I thought their page was a little cryptic, especially for less technical users, so here are some simpler instructions.

1. Download the Time Zone Editor from Microsoft here. (If that fails, go to this page and scroll down to the link, “Download the Tzedit.exe utility package now.”) Save this file to your desktop or somewhere easy to find.

2. Locate the file you just downloaded. It should be named “tzedit.exe”. Double-click it to run the program.

3. The following window should appear:

First tzedit dialog box

Click the “Unzip” button. You should see the following message:

Second tzedit dialog box

Click the “OK” button to clear this window, then click the “Close” button in the original window (shown above).

4. Double-click the “My Computer” icon on your desktop. This is normally found in the upper left corner of your screen.

My Computer icon

5. Double-click on your C: drive, then double-click on the “Program Files” folder. If the “Program Files” folder comes up empty, you will need to click on the “Show Files” link shown below.

Show Files link

6. Double-click the “TZEdit” folder to open it. You should see two files. The appearance of the window might be different from the examples below, depending on your computer’s configuration. Don’t worry if it looks a little different. You should have one file named “TZEDIT” or “TZEDIT.EXE” that has a globe icon next to it, and another file named “TZEDIT” or “TZEDIT.HLP” next to a book with a question mark on the cover.

TZEdit folder contents

TZEdit folder, alternate view

7. Double-click the globe icon. The following window should appear. Yours may show a different time zone, if you don’t live in the Central time zone.

Time Zone Editor main dialog box

8. If the highlighted time zone is not correct for your area, click on the correct time zone to highlight it. If the highlighted time zone is correct, leave it alone.

9. Click the “Edit” button. The following window should appear. Again, if you don’t live in the Central time zone, some of the information may be different from what is shown here.

Using tzedit to change daylight saving time

10. Next to “Start Day,” click on the word “First” and then use the menu to change it to “Second.” Then click on the word “April” and use the menu to change it to “March.”

11. Next to “Last Day,” click on the word “Last” and then use the menu to change it to “First.” Then click on the word “October” and use the menu to change it to “November.”

Do not change anything else on this page. The “Start Day” and “Last Day” should now look like this:

Time zone editor with new daylight saving time information

12. Click “OK” to save these changes. The new start date and end date will be shown at the bottom of the main window:

Time zone editor main dialog box after edits

Click the “Close” button. You’re done!

BMW Motorcycle Batteries

With a lot of help from this page and various BMW motorcycle forums, I went looking for an inexpensive battery for my 1993 BMW K75/ABS. This bike comes with a 25 amp-hour battery from the factory, which is BMW part number 61 21 1 495 650. Other choices include:

Yuasa Yumimicron Y60-N24AL-B

Exide Edge Y60-N24AL-B

Wesco 12V28AP (maintenance-free)

Panasonic LC-X1228P or LC-X1228AP (maintenance-free)

All four of those are 28 amp-hour batteries. The Yuasa, Exide, and Wesco are in the $90-100 range. The Panasonic can be bought for $62 from Digi-Key. The Wesco is reportedly made by Panasonic and is the same as the LC-X1228AP.

The LC-X1228P and LC-X1228AP differ only in the type of battery terminals. The LC-X1228P has a flat post with a hole in it, suitable for connecting to a nut and bolt. The LC-X1228AP has a threaded receptacle.

I am not sure which of those two terminals are the right ones for unmodified bikes. I’ve seen both mentioned in BMW motorcycle forums. My bike was fitted with the less expensive and lighter 20 amp-hour LC-X1220P when I bought it, and it’s possible that the wiring was modified to use the nut-and-bolt terminals. I’ve never seen the stock battery so I have no idea what kind of terminals it has.

A lot of BMW motorcycles only have room for the narrower LC-X1220P, and that appears to be a fairly common battery choice. Many K75 and K100 bikes have a 5″ wide battery pan and can take either the LC-X1220P or LC-X1228P (or AP, depending on the terminal posts). I decided it was worth the extra $14.50 and the extra ten pounds to get the larger battery.

I read that the Panasonic battery isn’t designed or rated for motorcycle use, but enough people are using them – and my bike already has one, as it turns out – that it seems like a safe choice. However, since the battery isn’t made for motorcycle use, use this information at your own risk, do your own research and make your own decisions, etc.

If you buy the Panasonic battery from Digi-Key, you can get free shipping if you print out their order form (pdf) and send them a check.

The Panasonic batteries appear on this page (pdf) of the Digi-Key catalog. The data sheet is here (pdf).

If you’re reading this page much later than October, 2006, those links will probably not work. Search their home page for LC-X1228P (or whichever battery you want) instead, and view the printed catalog’s table of contents to find the order form.

UPDATE: More good information available here.

UPDATE 2: PLEASE TAKE NOTE. I received the LC-X1228P, and found that it is too tall for my 1993 BMW K75. In my research I found several sources that said either the LC-X1220P or the LC-X1228P would fit, as long as the battery tray was wide enough to accomodate the wider LC-X1228P. This is incorrect. On this motorcycle, the bracket which holds the battery down is also responsible for securing the coolant overflow tank. If the battery is too tall, the bracket does not touch the coolant overflow tank. In addition, the battery tray has a recessed space about three inches wide, allowing the narrower LC-X1220P to sit about 1/4″ lower than the wider LC-X1228P. With the LC-X1228P installed, the long bolts which secure the hold-down bracket don’t even reach the battery tray. I am returning the LC-X1228P and will purchase the LC-X1220P instead.

UPDATE 3: You may need to pay sales tax on your order from Digi-Key. I called their accounting department to find out what rate they wanted for my order (8.25% for Austin, Texas). If you don’t include sales tax, they’ll call you to make sure you approve the extra charge before they ship the battery.

Moving a Windows 2000 installation to a larger disk

One fine day I powered up a Windows 2000 computer and it didn’t find the hard drive. Not at all.

I booted from a Knoppix 4.0 CD that I keep on hand for this sort of situation, and it mounted my hard drive just fine. I checked a couple of files, and everything looked good. Strange.

I booted from a Windows 2000 CD and went into the recovery console. I tried the usual fixes – fixmbr, fixboot, chkdsk. There was no effect.

I searched the web for similar problems and found all sorts of potential causes – a bad disk, a bad disk controller, bad memory, BIOS corruption… ugh. It’s really a pain to troubleshoot these sorts of problems, especially when it’s a personal system and you don’t have spares on hand.

I reset the BIOS to its default settings, pulled and tested the CMOS battery, and ran a memory test (memtest86, on the Knoppix disk). No problems found, and no change.

Finally, just trying things at random, I changed the hard disk type in the BIOS from “AUTO” to “LBA”. And it worked! Go figure – AUTO had worked for the last two or three years.

By this time I’d already ordered a new 250 GB SATA disk from Newegg. Even though the computer was working again, the old disk was 120 GB and nearly full, so I went ahead with the upgrade. Here are the steps that worked for me:

  1. Back up the old disk. You never know when something will go wrong.
  2. Turn off the computer.
  3. Connect both the old and the new disk.
  4. Boot into the Knoppix CD. At the boot prompt, enter “knoppix dma” to enable DMA for faster copying.
  5. On the desktop, I see /dev/hda and /dev/sda. Those must be my two disks.
  6. From a shell prompt, I run “fdisk -s /dev/hda” and “fdisk -s /dev/sda”. The former tells me that /dev/hda is 120GB (my old disk) and /dev/sda is 250 GB (my new disk).
  7. I run “fdisk -u /dev/hda” and use “p” to display the information about this disk. The “-u” is to use sectors, instead of cylinders, in case the two disks have different geometries. Write down the start and end sectors. Note the partition type (NTFS in my case.) DON’T MAKE ANY CHANGES TO THIS DISK!
  8. Run “fdisk -u /dev/sda” and create a partition with the exact same start and end sectors as on /dev/hda. Change the type of this partition to NTFS. Toggle the bootable flag to make this partition bootable. Save these changes.
  9. Copy the boot code from the old disk to the new disk, with “dd if=/dev/hda of=/dev/sda bs=446 count=1”. (Recall that in my case, /dev/hda is the old disk, and /dev/sda is the new disk. You may have to change these. If you’re not familiar with disk devices under unix, you should probably use a commercial program like Drive Image or Norton Ghost.)
  10. Copy the data from the old disk to the new disk, with “dd if=/dev/hda1 of=/dev/sda1”. This may take a few hours, depending on the size of the disks and the speed of the computer.
  11. At this point the new disk should be bootable, but the partition will be the same size as the old disk. You could make a second partition on the new disk and use that space as a separate drive letter, but I wanted to use the entire disk as my C: drive. There are two ways to do this.
    • The graphical way: Run “qtparted”. Select the first partition on the new disk, /dev/sda1 in my case. Right-click and select “resize”, and change “space after” to zero. Use File->Commit from the pull-down menu to save the changes.
    • The command-line way: Run “fdisk -u /dev/sda” and delete the partition, then re-create the partition with the SAME STARTING SECTOR but with the ending sector set so the partition is the maximum size possible. Then run “ntfsresize /dev/sda1” to finish the job.
  12. Shut down Knoppix, turn off the computer, and remove the old disk.
  13. Turn on the computer, go into the BIOS, and make sure the new disk is properly detected and selected as the boot device.
  14. Share and enjoy.

In my case, I hit another snag. The new disk worked fine, but every so often Windows would give me the error: “The file or directory C: is corrupt and unreadable. Please run the chkdsk utility.” After that, the computer would refuse to boot. I booted into Knoppix, and the files looked fine. I booted from the Windows 2000 CD, and when I tried to run the command “DIR” from the recovery console, it gave me the error: “An error occurred during directory enumeration.” Huh?

It turns out that I had hit yet another size boundary. Apparently, not very long ago, the PC industry didn’t forsee disks reaching beyond 137 GB. And although my computer seemed to be working fine, when I filled the disk with more than 137 GB of data, it corrupted the disk.

To get past the 137 GB boundary, you need:

  1. A computer whose BIOS supports 48-bit LBA (logical block addressing). I couldn’t find definitive information about mine, an ECS 865G-M 5.0 with BIOS dated 2004, but it turns out that it does.
  2. A disk that supports 48-bit LBA – if the disk is larger than 137 GB this should be a given.
  3. An operating system that supports 48-bit LBA. This was the key.

By default, Windows 2000 does not support 48-bit LBA. But if you have service packs 3 or 4 installed, you can enable 48-bit LBA with a registry key. See the article 48-Bit LBA Support for ATAPI Disk Drives in Windows 2000 for details. Why this is not enabled by default is completely beyond me.

I ended up removing the new disk, installing the old disk, booting into Windows, making that registry change, and then repeating the above steps to move from the old disk to the new disk. This time, when I booted from the new disk, I was able to fill the disk beyond the 137 GB boundary. What fun…

I hope that by posting this I can save someone else some of that trouble.

Since this adventure I’ve upgraded to the DVD version of Knoppix 5.0 and have been really impressed by it. I highly recommend you keep the CD and DVD versions in your IT toolbox.

BMW K75 Rear Shock

My bike feels wiggly on the corners, and as far as I know it has 46,000 miles and 13 years on the original rear shock. I started to look at replacements. There’s really a large price range and no cheap options, as far as I can tell.

Ohlin and Wilbers both make highly regarded shocks for this bike but I didn’t see any for less than $500-600, which is about $400-500 more than I had hoped to spend.

I wasn’t able to find much information about Works shocks, except for one review that complained of poor fit & finish. I’ll update this if I come across more reliable information.

Koni used to be a popular maker of relatively inexpensive motorcycle shocks. Apparently now the same motorcycle shocks are manufactured under license from Koni by an Austrailian company named Ikon. Their 7614 shock is available for the K75 (part number 7614-1009), but the price doesn’t seem to be online anywhere. I’m waiting for a quote from one of their US distributors.

Probably the most popular and least expensive shocks are from Progressive. There are two for the K75 that I’m aware of, namely the Progressive 412-4015B and the Progressive 420-1001. I searched for online prices, and by far the cheapest source I found was a company called Motorcycle Accessory Warehouse. I’ve never done business with them, but the shocks were easily 20-30% less expensive there than elsewhere, with the 412-4015B for $183 and the 420-1001 for $334.

That’s still far from cheap, but it looks like that’s the best I can do. It’s a good thing this bike has only one shock absorber in the back.

UPDATE: Works has a price list for their shocks here. Their shock for the K75 retails for $429.

UPDATE 2: Adventure BMW quoted me $359.95 for the Ikon 7614-1009 shock.

BMW K75 Headlight Modulator

The BMW K75’s headlight is an H4 bulb, like lots of other motorcycles (and most older BMW’s). For example, the Visipath site lists the following BMW models with an H4 bulb:

RT850R, RT850RT, R100, R1100, R1100R, R1100RT, R1100RS, R1100GS, R1150R, R1150GS, R1150RS, R1150RT(2001 & older), R1200C, R1200CL, K75, K100LT, K100RS, K1100LT, K1200RS, F650, F650GS, F650CS, R90/6

I found the following choices for my K75:

1. Kisan P115W-S

The Kisan is highly regarded and at the higher end of the price range, at around $100 street price. There’s a write-up on the installation of this modulator on a K75 here. This appears to be the “safe” choice.

The P115W-S is the “short” version for bikes without a lot of room behind the headlight. My bike has a Pichler fairing with several inches between the fork and the headlight, so I could probably get by with the standard P115W model. Although, as far as I can tell, they’re the same price, in which case I might as well get the shorter model and have more flexibility on how I route the wires.

2. Kriss h44001s

This appears very similar to the Kisan and is about the same price. Like the Kisan, the h44001s is the “short” model. With the Pichler fairing I have, either the h44001s or the h44001 (standard size) should work for my bike. Again, I don’t see a price difference between the two sizes.

3. VisiPath, by comagination

This one is different from the above two, in that it’s significantly less expensive, and appears to have a lot more wire associated with it. So far, all of these choices are “plug-in” modulators, no splicing needed. It looks like the Kisan and Kriss put their electronics inside the H4 bulb connector, so you just sandwich their module in between your headlight and the wire that supplies power to the headlight. The VisiPath’s electronics are in a separate module, with two bundles of wires – one to connect to the headlight, and one to connect to the wire that supplies power to the headlight. It’s quite a bit cheaper, at $59.95 for the 75-watt sS75H4 and $69.95 for the 115-watt sS115H4. My bike has the stock headlight, so the sS75H4 will be sufficient. (I’ve also seen that on Ebay someone has been selling irregularly molded sS75H4’s for about $50, although there aren’t any at the moment.)

This is probably the model I’m going to buy. There is a lot of unused space in the Pichler fairing so I’m not concerned about the extra wire.

4) Splice-in models

I’m ignoring several models of headlight modulator that require splicing, because there are several “plug-in” models available for my bike, and I don’t see any splice-in models that are any cheaper than the VisiPath. Well, except for one, a $25.99 unit from (who else?) JC Whitney. I’m not sure that modulator is even legal, since it has no light sensor to prevent it from operating at night. It looks like it’s about a $5 part marked up to $25.99. No thanks.