Fenderologist Hate Him — This Guy’s One Quick Trick Makes Your Fenders Less Noisy

2013-11-17_14-04-19_72-sFor some bicycles, fenders are a large part of the bicycle’s style. For daily commuting bicycles which need to be ridden in more than just fair-weather pleasurable outings, fenders are a necessary evil. They rattle and they rub, so you adjust them, only have them impact something random, bending them so  they rub again.

Last fall, after many frustrations with plastic fenders, I decided to try pressed aluminium fenders which are designed to imitate hammered metal fenders. Although I haven’t measured, the aluminium fenders feel lighter than PVC plastic fenders, but are more rigid despite it. They are also a lot more stylish.

Thin aluminium fenders do have one downside though; when sturdily installed (so as not to rattle) they amplify and project any vibration of the frame. I am a person who wants their bicycle to be silent, with only the sound of rubber on the road and the breath of the wind to be heard. Thin metal fenders disturbe this peace of the ride.

I have discovered one simple solution to this problem. Application of a suitable sound dampening agent on the inside of the fenders removes almost all of the noise! What sort of applicable material would be suitable sound dampening? So far I have tried rubber seam sealer, roofing tar and automobile asphalt undercoating spray.

When applying a coating to the inside of the fender be careful not to get any on the outside of the fender as it will ruin the finish. Note any drilled holes for mounting. It may be important not to coat these areas in case the mounting bolts are not long enough to accommodate the additional thickness of the coating, and also so the coating does not go through and again ruin the outside finish. In general, only a thin coat is needed, say never more than 1mm in thickness.

I think the rubber seam sealer is best, but also the hardest to work with. I have a pair of rubber dish gloves which are reserved only for working with the stuff as it is very hard to get off things, especially fingers.

Asphalt undercoating is a little thin, and so requires many coats. If an aerosol undercoating is used, the whole of the outside of the fender will require masking.

Roofing tar seems to be a good compromise. Its slightly easier to work with than seam sealer, both being more malleable and taking longer to set. The catch is that it can take a day to completely set, so it isn’t appropriate for a rush fender job.

So there you have it, my simple trick for quieting fenders. I would be surprised if I were the first to think of this, but I have not heard of anyone else doing this, so I thought I would document my discovery.

Inside the Suntour New-Winner Freewheel

My touring freewheel: 13-16-18-20-24-34

Suntour is regarded to have made the best freewheel bodies of the 70-80s. Of the different freewheel designs, the New Winner is considered to have been one of the most robust. The New Winner was also unique from it’s Suntour siblings, being the only freewheel which had completely adjustable bearings, employing a cone and lock nut.

Most freewheels, Suntour or otherwise, employ a left-hand (reverse) threaded cone nut, tightened against the freewheel body with the bearing spacing adjusted by shims. The cone nut has to be left-hand-threaded for the same reason that left pedals and right bottom bracket cups are, mechanical precession. The New Winner, however, uses a pair of right-hand (conventional) threaded cone and lock nuts, allowing for bearing adjustment without the replacement of shims.

Because of this unique design, the usual procedure for freewheel disassembly will not work on a New Winner. When looking to disassemble the New Winner on my primary bicycle I did some quick research and was eventually able to find this post on bikeforums.net which describes the correct procedure for disassembling the New Winner without a special Suntour tool. The post does not include photos, so I decided to correct that here.

Many have commented that freewheel disassembly is a difficult and useless thing to do. After all, as Sheldon Brown noted, the freewheel is the only bearing to turn when it is not under load. Freewheel bearings have large diameter races filled with many tiny bearings. When opening a freewheel, all 60+ of them can spill out and disappear. Even if you do manage not to loose the bearings, reassembly is usually a tedious procedure, involving packing all the bearings, and then trying to insert the body in the shell while depressing the lock-up pawls. This is not a task for the impatient or clumsy.

I took my New Winner apart because wear had introduced play into the bearings. The New Winner shares a pawl design similar to it’s predecessors, with the two pawls being 180° apart engaging 16 ratchet teeth. Play in the bearings allows the freewheel shell to rattle from side to side on the two teeth when engaged. (The later Winner-Pro freewheel uses a different pawl design which stops this rattle, but is ultimately weaker.)

The other reasons I took my New Winner apart was to clean and repack it with fresh grease, and also out of curiosity.

NWN-diagramLooking at a New Winner from the front side there are four obvious concentric parts. The inner three are static with regard to the wheel. In order from innermost to outermost they are; the freewheel body (with the two removal notches), labelled “Suntour Japan, Patented NWN”; the lock-nut, labelled “Maeda Industries LTD. ←Unscrew XX” (where XX appears to be the datecode); and the cone nut. The forth and outermost part is the freewheel shell.

Loosening the lock nut.

To disassemble the freewheel, first the locknut must be loosened. Secure the freewheel body in a vice, making sure that the freewheel shell can still turn free. Alternately hammer the two notches of the lock-nut counter-clockwise with a chisel. This is a slightly delicate procedure, and requires a controlled application of suitable force. It’s important that the object used to contact the notches not dull the edge of the notches. It is also important to alternate the hammer blows between the two notches, even if it doesn’t appear that the notch has progressed; the force needs to be even to unscrew the lock-nut and not distort it.

Once the lock nut is off, remove the freewheel from the vise and place on your work surface, front side up. There is a washer between the cone and lock nut which can be pried up and then the cone nut should easily unscrew. Once the cone nut is removed, carefully hold the shell and body together and dump the front ball bearings into a bin. Once this is done, over a different bin, pull the shell and body apart to release the rear ball bearings. Partitioning the bearings into different helps you keep the front and rear ball bearing count correct. In my freewheel I counted 31 bearings in the front and 42 in the rear.

2013-11-07_23-00-04_654-sClean the assembly. To clean I used a toothbrush with degreaser, followed by a water rinse and then a small oven to dry them. Be careful if you disassemble the pawls. Once load has been removed from the whisker springs, the tiny pivots which hold them can fall out!

For reassembly, apply a coat of clean grease to the rear bearing cup in the shell and, with tweezers if necessary, repack each ball bearing. Once this is done, carefully insert the body. You will have to depress one pawl with a screwdriver to re-insert the body, and once one pawl is inside the lip, depress the other to get it in as well. Rotate the body until the pawl seat inside the ratchet teeth. After the rear bearing is packets, carefully hold the shell and body together and rotate the freewheel so you are looking at the front. Repack the front bearing and secure the cone nut. Adjust the cone nut, add the washer and tighten the lock nut. Use usual bearing adjustment technique. Like every cup-and-cone bearing, tightening the lock nut causes the cone nut to move inward against the bearings. As such, the cone nut should be seated and then backed-off about ⅛  a rotation before tightening the lock nut.

2013-11-07_23-00-57_313-sInterestingly, the cone and lock nuts engage with a conical rather than flat surface. I guess this is so both are accessible from the front, but it may also be to stop mechanical precession (which is why car lug nuts are conical.)

The Suntour New Winner is a beautifully made example of mechanical engineering. Japanese manufacture in the early 1980’s was excellent. Consumer grade cameras, cars, and bicycle parts where all precision made, with simplicity and function as the first concern.


Goodbye Bell Mobility

Bell Mobility, you have recently lost a loyal six-year mobility customer. I am no longer with Bell Mobility, and while my new provider provides me with more service than you did for the same amount, finances are not the reason that I left your service. I left because of your new privacy policy to take affect this coming November.

The following are excerpts from the email sent to me from Bell:

Starting on November 16, 2013, Bell will begin using certain information about your account and network usage for select purposes, such as continuing to improve network performance and product offers through new business and marketing reports, making some of the ads and marketing partner offers you see more relevant to you, and providing increased levels of fraud detection and prevention.

Bell will use the following categories of information

  • Network usage information, such as:
    • Web pages visited from your mobile device or your Internet access at home. This may include search terms that have been used.
    • Location
    • App and device feature usage
    • TV viewing
    • Calling patterns
  • Account information:
    • Information about your use of Bell products and services (such as device type, postal code, payment patterns and language preference)
    • Demographic information, such as gender or age range

It is possible for Bell customers to opt-out of relevant ads, but not the surveillance. Further, if you read the message again, it is unknown when such surveillance has or will have begun. I would suspect that Bell already has or tracks this information anyways, for either billing, law-enforcement record-keeping requirements or because information-is-the-new-garbage (collect it all, deal with it later.)

Honestly, relevant-ads seems like the only silver lining to all this. Take that away and all you have is a horrible rain cloud of surveillance exploitation.

Why has this angered me? Should not I be glad that Bell is being “innovative” in their field?

Firstly, it is the privacy issues. Consider that even if I trust Bell not to use this information about me and my habits in ways I would not like, what could happen to me if the information is stolen from Bell.

By correlating their information about me together, Bell has made it’s information more valuable for malicious parties and easier to exploit once obtained. Complete information security is very hard if not impossible. I work in the computing field and have read too many horror stories on industry security incompetence not to be cynical.

Secondly, it’s the gall of it. I’m a customer, and Bell mobility is a service, for which I payed money. The relationship between myself and Bell should include some level of respect. With this new privacy policy Bell has changed its outlook on this relationship. I am no longer a customer but a product. Bell has disrespected me by putting me in a box, and selling me to the highest bidder. I do not intend to pay you for you to sell me against my wishes as a commodity. Ethics seem not to matter much for you here.

So, goodbye Bell Mobility, you were not really that good anyways. I feel sorry for those people who signed multi-year contracts with you and now must face the bitter reality that they can’t leave in disgust without paying you a final ransom.

I hope in leaving you and telling people about it I can dissuade other providers, including my new one, from following you down your path of folly.

Interesting Links:


NAT-PMP (Network Address Translation, Port Mapping Protocol) is a simple UDP based protocol originally created by Apple for punching holes in a NATing router and currently an IETF draft. Unlike UPNP-IGD, which is a large protocol to do many things, NAT-PMP  restricts itself simply to public IP discovery and port mapping management. This has the advantages of being more secure and being, well, less ugly.

However, NAT-PMP still allows any user on your LAN to mess around with port mappings. With the increased prevalence of laptops and smart phones, these days being a good host for guests and friends includes granting wireless LAN access to questionably secured devices.

Enter NAT-APMP, or NAT authenticated port mapping protocol. The simple principle of it is that only guests which know a secret can preform NAT-PMP operations, and all NAT-PMP communication between the client and gateway device is encrypted.

NAT-APMP works by extending the NAT-PMP protocol to have an authenticated handshake and cipher initialization, then allowing for a encrypted NAT-PMP session.

Trying Out NAT-APMP

The both the sample client and modified miniupnpd daemon require libgcrypt and have only been tested on Linux.

The modified miniupnpd client requires that ENABLE_NATPMP_AUTH be defined in config.h prior to compliation. Note that running the genconfig.sh script with remove this definition. once configured, miniupnpd can be built as per usual. A new option is added to the miniupnpd.conf file of natpmp_secret which defines the shared secret between the client in server. (Future implementation work should go into have unique secrets for each client.)

The sample client can be compile by typing “make clean && make” in the source directory. The sample client is run using “nat-pmp-client <gateway addres> [port]”. Once running the client the secret must be typed into the client by using the “key” command. Once the key is entered, the “aip”, “atcpmap”, and “audpmap” commands become available.

The current sample implementation suffers from a vulnerability whereby a malicious user on the LAN can craft packets for another users authenticated session, which are then decrypted, modifying the state of the cipher. This know issue will not be resolved until a quick way to save and restore cipher stat is found.

Bacon: An OpenWRT Based Home Gateway/Router

What is Bacon

Bacon Wireless Router

Bacon is the name I gave to the wireless access point, gateway, router thing I built for myself back in 2005. Back then embedded Linux devices aimed at consumers were only just starting to appear on the market place. Specifically, the Linksys WRT-54gl was still pretty new.

In either case, at the time I was living in a place with a cordless phone which was on the 2.4Ghz spectrum, the same frequency band used by 802.11b/g wireless LAN. This particular cordless phone was particularly nasty and would make noise all over the 2.412Ghz to 2.462GHz frequencies of wireless LAN. The end result was that if the phone rang, wireless connectivity went down, and stayed down until someone hung up that phone.


In an attempt to remedy the solution I decided to purchase the most powerful non-licensed 2.4GHz wireless card on the market at the time, the Ubiquity Networks SuperRange2, which has a 200mW maximum transmit power. For antennas I bough hi-gain unidirectional antennas, complete with N-connectors.

For a router board, I purchased an all-in-one embedded x86 system designed and made by a small Swiss design shop called PC-Engines. The board I chose was the wrap1e103, which was based on the NSC (later purchased by AMD) Geode processor. AMD phased out the Geode line soon after I bough the board.

The high power board and antenna idea turned out not to work as planned, the wireless phone could still disrupt the wireless connectivity in the house. However, the major benefit of the system is its reliability and what I will call its “ease of hackability.”


OpenWRT is an awesome project, and the WRAP board runs it just fine. Running OpenWRT on the original Linksys WRT54GL seems to cause the hardware to lock up randomly, possibly from temperature issues. No such issue with the WRAP board. Further, with a removable compact flash card as the primary storage, there is no chance of “bricking” the box. If it is rendered unbootable, simply remove the compact flash, insert it into a computer and write a different system image to it. The serial-port console also makes recovery and diagnosis easy if the image doesn’t manage to get the network up.


Since I wrote this Bacon has now been upgraded to OpenWRT 12-rc1 Attitude Adjustment, and the radio card has been changed for a MikroTik R52nM, giving 802.11n with 2xMIMO performance.

Bacon WRAP Wireless Router

76 Green Apollo Rebuild

Back in July of 2011 both my and my friend’s bicycles were stolen at the same time. The bicycles were thankfully later returned. Before that happened though we hung posters up everywhere trying to get them back. An nice old couple saw one of our posters, and while they had not seen our bikes, they did have an old one sort-of like mine in their garage that they wanted to sell. The day I arranged to visit them I ended up leaving with not just one but three old bicycles; one was garage kept and clean, the others kept dry but outside and had rusted.

One of the rusted bikes is a green Apollo 10 speed from 1976 with 27″x1¼” tires. The frame on this bike is a massive 62cm. The bike, like almost every other bike in Canada’s west coast from the 60’s-70’s, has a “Fred Deeley Cycles Ltd” badge on the seat tube. Fred Deeley Cycles Ltd of Vancouver was the only importer and supplier of European and Asian bicycles in the province at the time.

The bicycle is made by a parade of Japanese manufacturers. Shifters, dérailleurs, freewheel and gears from Shimano, rims by Araya, cranks from Sugino, and brakes and stem from Taiwanese Dia-Compe. The rear dérailleurs is branded “Shimano 500,” while the front is “Shimano 50.” The brakes are top pull. The rig is either early or cheap Japanese, as the rear gears use a free a freewheel rather than a cassette, and the cranks are cottered. Everything on the bike was made of steel too; the rims, hubs, cranks and even the drop handlebars are steel.

The bike came with a lot of extras: “suicide” brake levers, dynamo and lights kit, chromed fenders, rat-trap rear rack, horn and a plastic Norco cable driven speedometer. The fenders were bent and rusty, the speedometer cable was broken, the horn’s rubber ball busted, but the dynamo still worked. I took all this stuff off as it was mostly useless.

76 Apollo – Original Condition
76 Apollo – Rusty Chrome
76 Apollo – Fred Deeley Cycles Badge

Having been kept outside, all of the chromed surfaces were rusting. Despite this rust issue, the bike seemed to ride well so I sold it to a roommate. He rode for a few weeks until the rear hub started to shrink. The hub was of a crimped-together multiple part body design. Rust had penetrated in between the crimps of the flanges, cups and spacing tube and the forces from cycling had crushed them into each other. The flanges ceased to be parallel and the wheel went way out of true.

I bought the bicycle back from my roommate and decided to rebuild it whenever I had time. After some months I set about the task this past February. When setting in, I decided that both the front and rear wheels were too rusted to be repairable. The freewheel and gears were in good shape, so I took the rear wheel to North Park Bicycle Shop to have the freewheel unscrewed. The hub, rim and spokes were so rusty they warned that it wasn’t safe to ride on… oops. After stripping the bike down I removed as much rust as I could from the frame with a wire brush, steel wool and 5000 grit wet-sandpaper. In the places where bare steel was exposed I used a spray-on clear acrylic to protect the metal.

76 Apollo – Cleaned Frame


For the rear wheel I decided to make one from some spare parts I had lying around. I had a wheel with an aluminium rim and crimped hub that had also rusted out in the same way, and a perfect steel Shimano hub from a 26″x1⅜” wheel which I had stolen the rim from for another project. As the rim flanges were the same diameter and distance apart, all I had to do was swap the hubs.

I’m not sure why wheel building isn’t very popular today. I have yet to meet someone who regularly builds wheels. Maybe it’s because a used but decent wheel is usually $25 while a set of 36 new spoke is $28. In either case, it isn’t that hard.

76 Apollo – Rebuild and Trued Rear Wheel
76 Apollo – Rear Rim Detail
76 Apollo – New Rear Hub Closeup
76 Apollo – New Rear Wheel and Freewheel
76 Apollo – New Wheels On

For the front wheel I decide to be lazy and got a used aluminium wheel with a quick-release axle.

I bought some Cat’s Eye brand front and rear LED lights. Cat’s Eyes are cheap, so you don’t care if someone steals them, but bright, easy to mount, easy to change batteries, and don’t turn off if you hit a bump (an uncommon feature in the cheap light range.)

The bar tape I got for this bike s faux-leather microfiber stuff with little holes in it like you would see on a tennis racket. I love it, it is neither too firm like plain vinyl, nor too soft like the thick faux-cork.

After a bit of assembly and tweaking, the photos bellow show the result. This is the first bicycle I’ve rebuilt not to have steel rims. I quite like this bike, it’s rather pretty in my opinion, but then all old road bikes are pretty to me, green is my favourite colour, and I had put 10+ hours into it. It rides very well, and the new chain makes it silent. The Shimano dérailleurs still work very well.

76 Apollo – Finished, Right Side
76 Apollo – Finished, Front
76 Apollo – Stem and Handlebars
76 Apollo – Rear Dérailleur
76 Apollo – Finished Rear Axle

The bicycle has now been sold and I hear that it is riding well!

[Gallery of all photos.] [Directory listing of all photos.]

TrackPointing with UDev

The TrackPoint pointing device pioneered by IBM and found on all ThinkPad laptops is awesome. My laptop only has a TrackPoint for a pointing device and I love it. They take about a week to learn, but once you do you will reach for it constantly, even when you have a mouse. Not having to move your hands is wonderful.

These devices have many configurable parameters to make them more comfortable. Under Linux, TrackPoint device configuration parameters are exposed as files in SysFS. For my system these can be found under /sys/bus/serio/devices/serio1, but that may varry depending on your ThinkPad’s hardware topography, and how much the Linux kernel has changed since this was written.

I like to change the parameters of my TrackPoint to be more sensitive. I used to do this using a script run directly by my system init scripts. This was messy and didn’t work reliably. If only there was some sort of userland system which received device events from the kernel and used them implement policy and userland functionality.

This is of course (part of) what UDev does. The following UDev rule can be placed in /etc/udev/rules.d/ and will initialize your TrackPoint to your preferred settings. (I’m in part posting this here so I can’t lose it.)

ACTION=="add|change", SUBSYSTEM=="input", ATTR{name}=="TPPS/2 IBM TrackPoint", ATTR{device/speed}="150", ATTR{device/sensitivity}="180"

You can set as many attributes as you like using the ATTR{<parameter name>}=”<value>” in the same line. Note that ‘=’ is an action of assignment while ‘==’ is a test of equality used in deciding if the rule applies (just like in C.)

RLWRAP — Making Bad Command Lines Better

GNU Readline is a wonderful library. It is easy to program with, takes care of what is a chore to implement properly and has a user configuration system that means all Readline using applications will have the same customizable behaviour.

I read somewhere that its nickname is “the GNU Trojan Horse.” Being so quick and easy to include in code, if often escapes notice that libreadline is license under the GNU GPL. The GNU-GPL, in contrast with the GNU-LGPL, requires that if libreadline is included your entire project must be licensed with the GPL in order to remain compliant with it.

I think it is for this licensing reason that some software does not use readline. A good example is the command `sqlplus`, the command line interface to Oracle database systems. `sqlplus` is part of the free-as-beer, closed source Oracle database tools. `sqlplus` has less command line features than DOS 5. At least in DOS 5 you could hit F3 to get the previous command recalled, and when you hit the cursor keys it didn’t insert crap into the line. For a command line where you are often trying out different SQL statements, often retrying or recomposing the same query, command history and command editing is a require feature. `sqlplus` is like a go-kart where to steer you have to get off and adjust the wheels with a wrench, then get back on. The task which is the tools main purpose of existence is very tedious to operate.

Enter the program `rlwrap`. `rlwrap` is an executable which places a readline proxy between what it reads from standard input and to what it sends to a command line program. Run a command like sqlplus through rlwrap by typing `rlwrap sqlplus` and bam, you have command line history, editing and filename completion. The best thing is that because `rlwrap` doesn’t modify binary executables to operate you can us it with any program, regardless of licence.

Any command which uses standard input as a command line can benefit; pacmd, xmodmap – both work.

Parallelized Vorbis Transcoding

Often I find myself transcoding large directories of multimedia files from one format to another. Usually a transcode is a single-threaded operation (not so for x264, but we’ll ignore that for now.) It’s rather inefficent to run only one transcode command at a time on a machine with multiple CPU’s as while the transcode with consume all of the CPU time of one of the processors, the remaining processors will be idle.

To use all processors at once we need to run jobs in parallel. Thankfully a tried and tested tool for building things based upon input things a rules with parallelization support already exists: the `make` command. Using make we can transcode as many files at once as we want.

There’s one catch though, Make is a little bit blind when it comes to files which have spaces in their names. I was surprised by this, but I couldn’t find a good way to escape spaces in Makefile syntax. As most media files contain many spaces this was a problem.

Undeterred, I came up with a way around the space problem; Create a symbolic link for each source file that is Make friendly, run Make and then rename the outputs back to something useful and delete the symbolic links.

The following script is the result. This script converts all the audio files passed as arguments to audio files in the Ogg Vorbis format. The actual transcoding is done by the `avconv` from libAV. I use libAV as it accepts many different input files, and it also converts the metadata when transcoding. The script is pretty generic, and it should be possible to easily change it to convert to formats other than Ogg Vorbis.


Quickly Changing Display Outputs

Please ignore the messy deskMultiple-monitor support for X11 has greatly improved from when I started using it. For starters, you no longer have to edit a root-owned text file and restart your Xserver. Now we have the X11 RandR 1.2 extenstion and you can used use the command line on-the-fly or one of the many GUIs to change your output configuration. (If you don’t think this feature is that amazing, fair enough.)

All the major desktop environments have GUIs for display output configuration. Many times these desktop environments attempt to set output configuration at login. My primary computer is a laptop. At home I have a dock with an external monitor. Thus, 90% of the time my display output is in one of the two configurations: single headed laptop panel, or dual-headed laptop panel and external monitor. All the functionality I require is to toggle these modes. In Windows one can use the keystroke Super+P to quickly do so. In Gnome, whatever key generates XF86Display does this as well (if the gnome-settings-daemon xrandr plugin is enabled, which it is by default.)

The catch is that sometimes Gnome’s display output applet gets things wrong, or annoyingly my hardware likes to the generate the XF86Display keystroke when pressing Fn+F7, Dock Eject, Lid Open, Lid Close… etc. This causes my display configuration to change when I shut the lid (annoying), put the machine to sleep (annoying) or when I eject it from my dock (annoying if it didn’t notice that the external monitor isn’t there anymore.) I often find myself going to the command line and doing my output configuration manually.

Then a thought occurred; since I really only use two xrandr commands, there has to be a way to automate the process. One shell script plus Zenity later and this is the result:

# multiple-monitors.sh: Quick-and-easy xrandr(1) arguments picker.
# (c) 2012 Arthur Taylor Permission is granted to any person to use, copy,
# modify, merge, publish, distribute, sublicense, and/or sell this script.
# This script is provided "as is", without warranty of any kind.


XRANDR_COMMAND[0]=" --output LVDS1 --mode 1440x900 --output VGA1 --off"
XRANDR_COMMAND[1]=" --output LVDS1 --mode 1440x900 --output VGA1 --mode 1280x1024 --right-of LVDS1"
XRANDR_COMMAND[2]=" --output LVDS1 --off --output VGA1 --mode 1280x1024"
XRANDR_COMMAND[3]=" --auto"

TO_RUN=`zenity --list --width=640 --height=240 --window-icon $ICON --title="XRandR Settings" --text="Pick (or edit) an XRandR configuration:" --column="command" --hide-header --editable "${XRANDR_COMMAND[@]}"`

if [ "$TO_RUN" != "" ]; then
    xrandr $TO_RUN

All this script does is take chose text from the chosen list entry and pass it as arguments to the xrandr command (see xrandr(1) man page.) I know this isn’t to most user-friendly method of changing display outputs, and it doesn’t provide failure feed-back, but is quicker than opening a terminal and typing it from scratch.

If you use Openbox, then a keboard shortcut for can be done by simply adding the following to your rc.xml keybindings section:

<keybind key="XF86Display">
  <action name="Execute">
    <execute>bash /the/path/to/multiple-monitors</execute>