[{"content":"","date":"1 December 2017","externalUrl":null,"permalink":"/blog/","section":"Blogs","summary":"","title":"Blogs","type":"blog"},{"content":"","date":"1 December 2017","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"1 December 2017","externalUrl":null,"permalink":"/","section":"Joe Sacher","summary":"","title":"Joe Sacher","type":"page"},{"content":"I ran into an interesting issue with my Windows development machine when trying to test a Flask web app. This was due to werkzeug running the simple web server for flask that is created when you us app.run().\nThe error had me confused at first, as it has nothing to do with what I was changing at the time:\nTypeError: OpenKey() argument 2 must be str without null characters or None, not str I tracked back through the stack to see that werkzeug is looking at the Windows Registry. So I open regedit to see what we have. From what I can tell everything is fine.\nFinding the bad keys # I found some uses of winreg and cobbled together a script to print all keys with NULL in string or with type not string. This is what the error seems to be suggesting.\nimport winreg as _winreg # This script will print all classes that have NULL in string. # Use SysInternals RegDelNull to delete these. hkcr = _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, \u0026#34;\u0026#34;) i = 0 try: while True: ctype = _winreg.EnumKey(hkcr, i) if \u0026#39;\\x00\u0026#39; in ctype: print(ctype) if not isinstance(ctype, str): print(\u0026#34;{} -\u0026gt; {}\u0026#34;.format(type(ctype), ctype)) i += 1 except WindowsError: # Will always go off the end of EnumKey to escape the while pass This is available to download from my Github.\nIf you run this and get any output, you have an issue. I did not see any instances where my ctype was not a str, but I had a mess of NULL characters in registry keys.\nYou will see NULL in my output as \\x00. This was at the end of typical {GUID}\\x00 keys for me. So I figured out what caused the error, but needed to fix it.\nFixing the bad keys # Knowing the key name that was problematic, I went back into RegEdit and did a search for a portion of the GUID. As soon as RedEdit highlighted the key, I received an error that the key could not be read.\nI tried to delete it. No joy there either. These NULL characters cause havok with RegEdit too. It was useless as a tool to fix my problems.\nAfter some more searching, I came across the SysInternals RegDelNull, a utility created for fixing this problem.\nRunning this in an Administrator Shell as RegDelNull HKLM -s (where HKLM is the appropriate problem area), prompts you to delete NULL filled keys.\nI had to clean up two branches of the registry. I\u0026rsquo;m not sure how they were created, but they are gone now.\nThis solved my issue and I could get back to bugs I created in my Flask code.\nRant time # Microsoft has created some good software. However, the Windows Registry is not one of them.\nThe Windows Registry is a single-file implementation of a file system. Not a good implementation. It is fragile, endian specific, slow and undocumented. It is tied to the data structures of the C version with which it was originally built.\nOK, really a memory dump of the 32-bit C structures from the heap. No, I\u0026rsquo;m not joking. Make sure you follow the conventions of memory packing from your early 1990s C compiler!\nThis just goes to show that data structures are usually more important than code. The structure they were looking for in this case is a database not a file system.\nThis all might have been fine if Windows kept it to themselves and stored their settings in it. But instead of allowing .ini files (which worked fine), every program gets to fill your registry full of junk.\nThe use of AppData is trying to get rid of the Registry, if everyone would stop using it. But even Windows versions are still using it. It is the terrible idea that will not die.\nSorry, thus endith my rant.\n","date":"1 December 2017","externalUrl":null,"permalink":"/blog/2017/12/01/nulls-in-winreg/","section":"Blogs","summary":"","title":"NULLs in the Windows Registry","type":"blog"},{"content":"","date":"1 December 2017","externalUrl":null,"permalink":"/tags/programming/","section":"Tags","summary":"","title":"Programming","type":"tags"},{"content":"","date":"1 December 2017","externalUrl":null,"permalink":"/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":"","date":"1 December 2017","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"1 December 2017","externalUrl":null,"permalink":"/categories/tech/","section":"Categories","summary":"","title":"Tech","type":"categories"},{"content":"","date":"1 December 2017","externalUrl":null,"permalink":"/tags/windows/","section":"Tags","summary":"","title":"Windows","type":"tags"},{"content":"","date":"28 October 2017","externalUrl":null,"permalink":"/series/burn-in-cart/","section":"Series","summary":"","title":"Burn-in Cart","type":"series"},{"content":"","date":"28 October 2017","externalUrl":null,"permalink":"/tags/raspberry-pi/","section":"Tags","summary":"","title":"Raspberry Pi","type":"tags"},{"content":"I\u0026rsquo;m using a Raspberry Pi 3 as the CPU in custom burn-in carts for cycling our Android tablets. It is hard to beat the 7\u0026quot; touch display using a Flask front end for quick development. The carts often have power connected and disconnected when moved around. We are also using a network inside of the carts for talking with tablets under test and need to bring this up each time we move carts and cycle power.\nGetting Valid IP # If you boot your RPi connected to an already established router, you probably don\u0026rsquo;t have to worry about getting an invalid IP address. Since power is being connected to the cart and all devices come online at once, my RPi boots faster than the Ubiquiti Edgerouter-X that is running the local network.\nIf you boot a RPi with no network connection, you will get an APIPA (Automatic Private Internet Protocal Addressing) IP address. This is shown with 169.254.x.x IP, with last two octets randomly chosen. I\u0026rsquo;m using this to determine that my address is bad.\nThe best method I found to release and renew IP address from the router is using subprocess to shutdown and start up the eth0 interface. This forces a DCHP lease request. I pause 10 seconds between these and allow 10 retries.\nBelow is my full IP address startup script.\nimport netifaces as nt from time import sleep import subprocess try_count = 10 def get_ip(): \u0026#34;\u0026#34;\u0026#34; Use netifaces to retrieve IP address for interface eth0 \u0026#34;\u0026#34;\u0026#34; ifaddresses = nt.ifaddresses(\u0026#39;eth0\u0026#39;)[nt.AF_INET] return ifaddresses[0][\u0026#39;addr\u0026#39;] def is_good_ip(ip_address): \u0026#34;\u0026#34;\u0026#34; Detect if IP starts with \u0026#39;169.254\u0026#39;, which indicates that RPi started up network prior to a solid DHCP access and chose an internal IP. :return: False if IP starts with \u0026#39;169.254\u0026#39; \u0026#34;\u0026#34;\u0026#34; return \u0026#39;169.254\u0026#39; != ip_address[:8] def cycle_eth0(): \u0026#34;\u0026#34;\u0026#34; Take down and bring up eth0 network interface to force DCHP retry. \u0026#34;\u0026#34;\u0026#34; my_cmd = \u0026#34;sudo ifdown eth0 \u0026amp;\u0026amp; sudo ifup eth0\u0026#34; proc = subprocess.Popen(my_cmd, shell=True, stdout=subprocess.PIPE) def get_valid_ip(): \u0026#34;\u0026#34;\u0026#34; Loop checking for valid IP and sleeping \u0026#34;\u0026#34;\u0026#34; for tries in range(try_count): try: if is_good_ip(get_ip()): break cycle_eth0() except: pass sleep(10) else: raise Exception(\u0026#39;IP Address did not assign correctly.\u0026#39;) if __name__ == \u0026#39;__main__\u0026#39;: get_valid_ip() But how do I run this on start of the Raspberry Pi?\nRun on Boot # I created a shell script launcher.sh in the root of pi home instead of directly calling the Python script, as I might want to do more in the future.\n#!/bin/sh cd /home/pi/agapao-cart sudo python3 boot.py You need to make it executable in terminal:\nchmod 755 launcher.sh I made a logs directory inside pi home:\nmkdir logs Add cron task for on reboot::\nsudo crontab -e Select Nano as editor if asked. Enter the following at bottom of file:\n@reboot sh /home/pi/launcher.sh \u0026gt;/home/pi/logs/cronlog 2\u0026gt;\u0026amp;1 This will run our launcher script and log any errors on our cronlog.\nNow our RPi will boot and retry until it gets a valid IP address. If this fails for some reason, we can show this on the display using the web server.\nBut how do we get the web display to startup?\nRun on GUI Load # To run a program when the GUI loads, I found the easiest is to add it to the ~/.config/lxsession/LXDE-pi/autostart file. I added the line below to the bottom of this file.\n@/usr/bin/python3 /home/pi/agapao-cart/on_gui_load.py Notice that I must be explicit with both the path to python3 and the full script path.\nThis script (on_gui_load.py) will open up our chromium browser, display in maximised full screen mode (\u0026ndash;kiosk) and load the localhost web server. Using (\u0026ndash;incognito) is the best way I have found to eliminate the \u0026lsquo;restore\u0026rsquo; prompt if the browser is closed with a system shutdown. (Which is how I always close it.)\nimport subprocess def start_web_browser_kiosk(): my_cmd = \u0026#34;chromium-browser --kiosk --incognito http://127.0.0.1\u0026#34; proc = subprocess.Popen(my_cmd, shell=True) if __name__ == \u0026#39;__main__\u0026#39;: start_web_browser_kiosk() The browser will load the Flask website being served as GUI for our 7\u0026quot; touchscreens.\nScreen Sleep and Mouse Pointer # The next thing you will notice is the screen will go black after a delay and your nice embedded display will require you to tap it to find status on your process. Not ideal.\nIf we edit /etc/lightdm/lightdm.conf and add the following lines to the [SeatDefaults] section, we can solve the issue.\n# don\u0026#39;t sleep the screen xserver-command=X -s 0 dpms If you have a touch screen and do not want a mouse cursor, also add the -nocursor flag.\n","date":"28 October 2017","externalUrl":null,"permalink":"/blog/2017/10/28/raspberry-pi-startup-ip-web/","section":"Blogs","summary":"","title":"RPi Startup IP and Web Display","type":"blog"},{"content":"","date":"28 October 2017","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","date":"14 October 2017","externalUrl":null,"permalink":"/tags/hardware/","section":"Tags","summary":"","title":"Hardware","type":"tags"},{"content":"","date":"14 October 2017","externalUrl":null,"permalink":"/tags/mock/","section":"Tags","summary":"","title":"Mock","type":"tags"},{"content":"","date":"14 October 2017","externalUrl":null,"permalink":"/tags/pytest/","section":"Tags","summary":"","title":"Pytest","type":"tags"},{"content":"Before I get to deeply into specific functionality and operation of our charging carts, I thought it would be good to take a detour into drivers for custom hardware. In addition I\u0026rsquo;ll cover mocking hardware devices to allow testing of your drivers and operating your system in a simulation with no hardware present. This allows you to flush out your hardware design with software before fabricating PCBs. (A PCB takes a long time to \u0026ldquo;compile\u0026rdquo;.)\nWhen the system is dependent on external devices, such as the 144 Android tablets that will be connected to it, a little Python code is much easier to write and refactor to simulate tablets than an separate Android app. With the Requests package, I can easily act like a tablet calling a web service. I can also prove my system before I interface with our programmers to know the problem shouldn\u0026rsquo;t be on my side. We will talk more about this in later articles.\nI cover hardware at first, because I want you to understand a little about it before I get to software, but this will be mostly software related article.\nHardware Interfaces # All Raspberry Pi logic is at the 3.3V level, so care must be taken to use 3.3V logic chips or use level converters. Those used to 5V capable chips, such as the Arduino, need to be careful. In the case of driving higher voltages, MOSFETs are common and must be specified with Vgs appropriate for logic levels. These are unsurprisingly called \u0026ldquo;Logic Level\u0026rdquo; MOSFETs. I use these to drive 12V logic from the 3.3V of the RPi.\nThere are a few hardware interfaces available on the Raspberry Pi, the most commonly used being GPIO and I2C bus.\nSMBus # On the RPi, the I2C bus is called SMbus. I2C and SMBus are essentially compatible at 100 KHz. I2C allows 400 KHz and 3.4 MHz interfacing that SMBus does not support. I named my packages to follow the smbus Python package. This type of bus has a clock line and a data line. Both are pulled up to 3.3V via a resistor and devices using the bus must pull them down to ground. It is a master/slave setup with multiple devices allowed on a given bus. All slaves have a 7-bit address number and must be unique on the bus. The Raspberry Pi is the master, which always starts communication.\nThe master will send an 8-bit value, with the first 7-bit the address and the last bit controlling if this is a read or write. The slave will respond that it received the info and the master will continue with more commands until the exchange is complete.\nI\u0026rsquo;m using the smbus interface for getting a silicon serial number, reading voltage and current across a shunt to determine power being used, and reading temperature of the board. These are three devices on the same bus, all with different addresses.\nThese chips can get fairly complex in functionality, but all use the same interfaces. So mocking the hardware will get harder with complexity. However, there may only get a few of the available smbus commands that you use and therefore must implement in your fake devices.\nGPIO # The GPIO interface is for General Purpose Input Output. These are single pins that you can use to send data to devices in an output mode or receive information from devices with an input mode. This is what I use to drive a chain of shift registers. Almost all pins are available for GPIO, unless you use them for other buses. GPIO 2 and 3 are used for SMBus. I could not use SMBus if these were allocated to GPIO. The same is true with reserved pins for SPI and UART buses. And important part of designing a hardware project is allocation of IO.\nFor a shift register, we need 4 outputs: clock, data, enable, and strobe. We clock data into the buffer and then strobe it from buffer directly to output. This keeps the bits from shifting down the actual outputs and only toggles them when we have shifted everything through.\nThis is a little different to mock in software, as you need to look at pin transitions. For example, the data line value is used when the clock line has a rising transition (goes from low to high). So my mock devices will need a hook to these transitions that are important and emulate functionality. Although writing tests for the objects helped me find a subtle issue with these callbacks that became important for simulation, as you will see below.\nSoftware Interfaces # When RPi.GPIO is imported, you get a global object that you can only setup once. If you try to start a new one before using .cleanup() on the existing one, you will get a warning. And if you try to share pins with multiple instances of GPIO, you are in uncharted (read: dangerous) territory. As I was mocking up the GPIO interface, I started trying to emulate this error condition. However, a properly structured Python project with only over one reference to GPIO, so this was overkill.\nAll of my RPi hardware drivers have an interface reference as the first argument, either for GPIO or SMBus. This allows me to easily pass in a reference to the single object that holds that interface. There is no worry about accidentally creating a second one. This also allows me to pass in a fake version of GPIO or SMBus for testing and simulation.\nMy imports for these interfaces looks like this: try: import RPi.GPIO as GPIO import smbus SIMULATION = False except ImportError: from rpi_hardware.mocked import GPIO from rpi_hardware.mocked import smbus SIMULATION = True\nWith the boolean SIMULATION variable, I can control if my system is running normally or in simulation. This is usually the difference between my running on the configured RPi or my local laptop. With PyCharm I can just change the interpreter reference and debug exactly the same either locally or over SSH on the RPi. That is worth the price of admission to the Professional version of PyCharm.\nFakeGPIO # In order to only allow a single GPIO, I used a singleton pattern by overriding __new__. This stores the instance in a class level attribute of __self__. The constructor needs to be defined as def _init() instead of def __init__(), as we are not creating new object each time. For break down between tests or to reset the object, the destroy() method is provided. This is what I call when I\u0026rsquo;m emulating the GPIO.cleanup().\nclass Singleton(object): def __new__(cls, *args, **kwds): self = \u0026#34;__self__\u0026#34; if not hasattr(cls, self): instance = object.__new__(cls) instance._init(*args, **kwds) setattr(cls, self, instance) return getattr(cls, self) def _init(self, *args, **kwargs): raise NotImplementedError(\u0026#39;must implement init method\u0026#39;) @classmethod def destroy(cls): self = \u0026#39;__self__\u0026#39; if hasattr(cls, self): instance = getattr(cls, self) del instance delattr(cls, self) The full FakeGPIO source can be viewed here, as it is too large to include inline. There is quite a bit of bookkeeping with constants and handling both BCM and BOARD based pin numbering schemes. All of the normal function are replacements for what your hardware driver would normally call. You can look through the object and see how things are working. I\u0026rsquo;m liberal with ValueError to help shake out issues with the bad hardware driver calls. It is easier to find these problems in software than when we are trying to interface with actual hardware.\nThe two major data structures in FakeGPIO are _pins and _edge_callback.\nThe _pins attribute of the FakeGPIO stores all GPIO pins direction and value as a 2 item list. The key is the BCM value for the pin. All internal values are BCM numbering and BOARD pin numbers are translated to BCM for use. For direction, we are using the defined constants of GPIO.IN and GPIO.OUT. All constants have been defined using the underlying C code values, in case a user is bad and calls with a number rather than referencing the constant.\nThe _edge_callback attribute is a defaultdict(list) that will store callback methods for each pin (again BCM naming). The value is a tuple with (edge_type, callback). This could possibly be done more efficiently with a tuple as key, such as (pin, edge_type). Then I could use the dictionary hash to find exact callbacks I need, instead of looking if I have the proper transition for a given pin. Although if you are pin heavy and callback light, the overhead of tuple building for key search might actually be slower than the loop when you have a 50-50 chance of a callback.\nThere are a few helper under functions, but the two that are important in use of FakeGPIO are _simulate_set_pin and _simulate_read_out_pin. When we have an input, we are expecting hardware to provide that value. The _simulate_set_pin method is how your virtual hardware provides an input. When we have an output, we expect hardware to read it and do something with it. The _simulate_read_out_pin method is where your virtual hardware can read those values. In the implementation of my fake HCF4904 shift register hardware, I\u0026rsquo;m using a callback function to tell me that the device has been clocked. But I use this _simulate_read_out_pin to get the value of the data pin at that point.\nHCF4094 Driver # This driver is for a shift register. This is a device that allows you to use a clock and data to serially shift out bits to be available parallel as 8-bits for each chip.\nThe logic on this is confusing sometimes, because making the RPi pin high (3.3V) turns on a MOSFET that pulls the high voltage output low. When the RPi pin is low, the MOSFET turns off, allowing the line to pull high (12V). This also makes mocking the hardware backwards.\nTo make things a little less confusing, I\u0026rsquo;ve defined _OUTPUT_HIGH and _OUTPUT_LOW that are already flipped.\n__init__ is fairly simple, just storing the 4 pins used by the device and setting up the 4 pins as GPIO.OUTPUT.\nclass HCF4094(object): \u0026#34;\u0026#34;\u0026#34; Drives HCF4094 shift register with external pull up resistors to high voltage and N-MOSFET pulling down to ground. HCF4094 is capable of higher voltages than RPi interface (I\u0026#39;m using 12V.) This allows a more robust signal line, but requires isolation with RPi. I\u0026#39;m driving base of DMN3404 N-MOSFET through 100R resistor. Base is pulled to Ground via 10K resistor. Drain is connected directly to output for each of the 4 pins and via 4.7K resistor to 12V. Source is connected to ground. I am chaining 6 boards with each having 6 HCF4094 devices. This allows 288 outputs. Chaining HCF4094 requires nothing different in software, with exception of larger data for shift_data. \u0026#34;\u0026#34;\u0026#34; # Due to N-MOSFET Pulling down, logic is reversed _OUTPUT_HIGH = 0 _OUTPUT_LOW = 1 def __init__(self, gpio_ref, data_gpio, clock_gpio, strobe_gpio, out_enable_gpio, enable_output_immediate=False): \u0026#34;\u0026#34;\u0026#34; Initialization :param gpio_ref: reference to RPi.GPIO object :param data_gpio: data pin number :param clock_gpio: clock pin number :param strobe_gpio: strobe pin number :param out_enable_gpio: output enable pin number :return: \u0026#34;\u0026#34;\u0026#34; self._gpio = gpio_ref self._data_pin = data_gpio self._clock_pin = clock_gpio self._strobe_pin = strobe_gpio self._out_enable_pin = out_enable_gpio self._gpio.setup(self._data_pin, self._gpio.OUT, initial=self._OUTPUT_LOW) self._gpio.setup(self._clock_pin, self._gpio.OUT, initial=self._OUTPUT_LOW) self._gpio.setup(self._out_enable_pin, self._gpio.OUT, initial=self._OUTPUT_LOW) self._gpio.setup(self._strobe_pin, self._gpio.OUT, initial=self._OUTPUT_LOW) if enable_output_immediate: self.set_output_enable(True) def set_output_enable(self, enable): \u0026#34;\u0026#34;\u0026#34; Set output enable pin :param enable: State of pin :return: None \u0026#34;\u0026#34;\u0026#34; output_val = self._OUTPUT_LOW if enable: output_val = self._OUTPUT_HIGH self._gpio.output(self._out_enable_pin, output_val) To send data out, we send an iterable of 0 or 1 values that are clocked out and then the whole data set is strobed to move from buffer to actual output.\nI\u0026rsquo;m using an OrderedDict as my internal storage so I can easily set bit values by dictionary key, but shift them out in the correct order to the proper pin on the shift registers. (Keeping track of bits is a big deal when your shift length is 288.)\ndef shift_data(self, data): \u0026#34;\u0026#34;\u0026#34; Shifts data out, in order of the list. :param data: Data to be shifted as list or tuple :return: Bits shifted count \u0026#34;\u0026#34;\u0026#34; shift_count = 0 self._gpio.output(self._strobe_pin, self._OUTPUT_LOW) for bit_value in data: # Inverting due to N-MOSFET inversion, also error if not 0/1. value = (HCF4094._OUTPUT_LOW, HCF4094._OUTPUT_HIGH)[bit_value] self._gpio.output(self._data_pin, value) self._gpio.output(self._clock_pin, self._OUTPUT_HIGH) self._gpio.output(self._clock_pin, self._OUTPUT_LOW) shift_count += 1 self._gpio.output(self._strobe_pin, self._OUTPUT_HIGH) return shift_count HCF4094 Fake Hardware # I call my fake hardware HCF4094Capture as I\u0026rsquo;m capturing the data that is sent out. In addition to the normal fields in HCF4094.__init__, I also have bit_list and callback. The bit_length is determined by len(bit_list). The callback will be sent a list of tuples with (pin_number, current_state) if any of the pins have changed since last strobe.\nI attach a callback to the FakeGPIO for a transition on the clock and strobe pin. This is a FALLING transition, even though I\u0026rsquo;m actually wanting a RISING transition at the HCF4094 chip. Again, this is due to the reversing on the MOSFETs. Data is buffered during the clock callback and toggled to output (and callback processed) with a strobe callback. I initially had this backwards and could not get my tests to pass. That is why we take the time to write tests.\nclass HCF4094Capture(object): \u0026#34;\u0026#34;\u0026#34; This class is used to emulate the data that is shifted to the HCF4094. A callback method is registered and will be called with a list of tuples (index, bit_state) for each output that has changed since last strobe. This allows you to simulate hardware that occurs when the bit state changes. An example of this would be if the bit is controlling power to a device. With a `1` bit state, you could simulate what actions occur when power is applied to the device. \u0026#34;\u0026#34;\u0026#34; def __init__(self, gpio_ref, data_gpio, clock_gpio, strobe_gpio, out_enable_gpio, bits_list, callback): \u0026#34;\u0026#34;\u0026#34; Initialization Callback method details: One argument is given to callback method, a list of tuples (index, 0 or 1). index: index of bits_list which has changed since last strobe event. 0 or 1: new state of bit. It is expected that you maintain old state to see if you need to trigger simulation events for what electrical event corresponds with that bit changing. :param gpio_ref: reference to Mock.GPIO object :param data_gpio: data pin number :param clock_gpio: clock pin number :param strobe_gpio: strobe pin number :param out_enable_gpio: output enable pin number :param bits_list: list of bit states for current output, order is furthest to nearest bit. As shifting occurs at index 0 and finished at index ``n``. This sets initial state to trigger callbacks and bit length Initial state usually all 0, so `[0] * bit_depth` might be easy initialization :param callback: method to call when bits change \u0026#34;\u0026#34;\u0026#34; self._gpio = gpio_ref self._data_pin = data_gpio self._clock_pin = clock_gpio self._strobe_pin = strobe_gpio self._out_enable_pin = out_enable_gpio test_list = [bit for bit in bits_list if bit not in (0, 1)] if len(test_list) != 0: raise ValueError(\u0026#39;bits_list may only contain 0 or 1. Found {}\u0026#39;.format(test_list)) self._bit_count = len(bits_list) self.current_data = tuple(bits_list) self._buffered_data = [] self._callback = callback # Register with Mock GPIO to call methods when clock or strobe occurs # We are using FALLING instead of RISING, because logic is backwards due to # MOSFET for output. self._gpio.add_event_callback(self._clock_pin, self._gpio.FALLING, self._clocked) self._gpio.add_event_callback(self._strobe_pin, self._gpio.FALLING, self._ strobed) These two methods are callbacks from GPIO. When a clock transition occurs, we push data (swapped due to negative logic) in the buffer. When the strobe occurs, we send data to attached callbacks.\nIf strobe is not brought low before data is transferred, it will strobe data down the outputs as you clock the shift. This can be useful in some situations for moving displays. However, I do not allow this in my driver, so I did not emulate in the virtual hardware. We could add this by testing for strobe state and calling _strobed if needed in _clocked.\ndef _clocked(self): # Have to reverse data, as MOSFET output is backwards bit_value = (1, 0)[self._gpio._simulate_read_out_pin(self._data_pin)] self._buffered_data.append(bit_value) def _strobed(self): self._send_data() My goal for the _send_data method is to build a tuple of index and value for pins that have changed.\nFirst I generate the new_data by adding buffered data to the end and taking the last bits that satisfy the _bit_count of our shift register system. Then I\u0026rsquo;m using a list comprehension with enumerate to generate my index and zip to give me an (old, new) tuple. The list comprehension only outputs if old != new.\nBefore sending to the callback, I update my current_data in case the callback decides to process the entire output data.\ndef _send_data(self): # Make list with last `self._bit_count` number of bits shifted. # May be called with only a few bits shifted, so need to include old data. new_data = (list(self.current_data) + self._buffered_data)[-self._bit_count:] changes = [(index, new) for (index, (old, new)) in enumerate(zip(self.current_data, new_data)) if old != new] self.current_data = tuple(new_data) self._callback(changes) Testing FakeGPIO # First we look at parts of the tests I wrote when building the FakeGPIO object. With my fixtures, I\u0026rsquo;m not returning any data. RPi.GPIO uses the global GPIO reference and I do the same. However, I\u0026rsquo;m using fixtures to reset the GPIO to three states: Initialized (raw), Using BCM numbering (bcm), and using Board numbering (board).\n@pytest.fixture def raw(): GPIO.cleanup() @pytest.fixture def bcm(): GPIO.cleanup() GPIO.setmode(GPIO.BCM) @pytest.fixture def board(): GPIO.cleanup() GPIO.setmode(GPIO.BOARD) I\u0026rsquo;ve previously talked about using the with pytest.raises(ExceptionType) as a method of proving error conditions are caught. I\u0026rsquo;m skipping some of these tests and simple functionality checks. You can see those at the full file link above.\nGPIO is capable of calling a method when a pin has a rising or falling transition. To catch this callback, I\u0026rsquo;m using the mock package. func = mock.Mock() provides a callback function that allows you to test what was sent to it or if it was even called.\nIn both of these methods, I\u0026rsquo;m creating the callback, configuring the pin so a transition will fire the callback, adding the callback, and triggering it with an output call. To test that it was called, I use func.assert_called_with(). I\u0026rsquo;m using no arguments, because GPIO callbacks have none. When we write tests for our HCF4094Capture fake object, you will see callbacks with an argument.\nNote: If you need many callbacks and only want to use one function, look at functools partial for freezing arguments in a function.\ndef test_rising_callback(board): func = mock.Mock() GPIO.setup(38, GPIO.OUT, initial=GPIO.LOW) GPIO.add_event_callback(38, GPIO.RISING, func) GPIO.output(38, GPIO.HIGH) func.assert_called_with() def test_falling_callback(bcm): func = mock.Mock() GPIO.setup(6, GPIO.OUT, initial=GPIO.HIGH) GPIO.add_event_callback(6, GPIO.FALLING, func) GPIO.output(6, GPIO.LOW) func.assert_called_with() Testing HCF4094 # Testing HCF4094 functionality is not too complex, because the main functionality we have with a shift register is to just shift out data. Like the GPIO testing above, we need to handle callbacks and will be using mock again.\nI define the 4 pins so I can share them between the driver and fake hardware, otherwise they won\u0026rsquo;t link up. I have one fixture that creates the FakeGPIO from mocked. Then I create a callback with mock.Mock(). We pass this into HCF4094Capture to get changed data back. Then I create the hardware driver HCF4094 and return everything needed in tests as a tuple.\nimport mock import pytest from rpi_hardware.mocked import GPIO from rpi_hardware.mocked import HCF4904Capture from rpi_hardware import HCF4094 OUT_EN = 20 STROBE = 19 CLOCK = 26 DATA = 21 @pytest.fixture def capture(): GPIO.cleanup() GPIO.setmode(GPIO.BCM) callback = mock.Mock() hcf_capture = HCF4904Capture(GPIO, DATA, CLOCK, STROBE, OUT_EN, [0]*16, callback) hcf = HCF4094(GPIO, DATA, CLOCK, STROBE, OUT_EN, True) return hcf_capture, hcf, callback In the first test, you can see how I\u0026rsquo;m using tuple unpacking to get at the objects sent in with the fixture. I want to test the callback functionality for the fake hardware, without bringing the hardware driver into the mix. So I reached inside the object and modified the internal attributes that would be created with clock callbacks and strobe callbacks. This allowed me to test functionality expected if those callbacks worked.\nNotice that we are again testing the fact that a call back occurred with the mock function by using callback.assert_called_with(expected arguments). In this scenario it isn\u0026rsquo;t just testing that a callback occurred, but doing essentially an assert [expected arguments] == [callback arguments received].\ndef test_hcf_capture_send_data_internal(capture): hcf_capture, hcf, callback = capture hcf_capture._buffered_data = [1] hcf_capture._send_data() callback.assert_called_with([(15, 1)]) hcf_capture._buffered_data = [1]*16 hcf_capture._send_data() callback.assert_called_with([(index, 1) for index in range(15)]) The value of writing the above function and testing just one piece became apparent when I was developing the callback structure for getting data from HCF4094. This test was to be a full up test of the HCF4094 hardware driver, sending pin changes through the FakeGPIO and triggering callbacks in HCF4094Capture which will trigger a callback for data changed. It is a complex chain. And it didn\u0026rsquo;t work. I received a failed test, because the callback was never called.\nThis is where I discovered that the callback I needed to register with FakeGPIO was FALLING instead of RISING, due to the reversed logic. I am a firm believer that tests do not take any more time than writing throw away code to test a method. And instances like this really help you find issues with your code.\ndef test_hcf4904_shift_data(capture): hcf_capture, hcf, callback = capture # Shift full set of 1\u0026#39;s should get all changes hcf.shift_data([1]*16) callback.assert_called_with([(index, 1) for index in range(16)]) # Partial shift hcf.shift_data([0, 1, 0, 1]) callback.assert_called_with([(12, 0), (14, 0)]) So these callbacks in HCF4094Capture are useful for testing operation of our hardware. But this is the hook to simulate the system. If we see a certain pin go to 1 then I know a tablet has been given charging power. I can start making the battery voltage go up and send a web service call indicating PowerApplied. I\u0026rsquo;ll cover simulation using these interfaces in another article.\nFake SMBus # Implementing fake hardware for SMBus is both easier and harder. The interface to the hardware is defined, so we can use actual method calls and don\u0026rsquo;t have to track pin transitions in a custom way for each device type. However, the device can be very complex and this would need to be implemented virtually for full simulation. Often you only need to use a certain subset of functionality to cover what you actually use for a device.\nHowever, if you have a full capabilities driver, then you need full capabilities simulator to integrate everything into tests. For the complex chips, I stub out the functionality I need for simulation and am doing much of the testing with the actual hardware. Everything is a tradeoff of effort vs return.\nI\u0026rsquo;m not going to go into SMBus with much detail, as the GPIO implementation was more complex in the topics I wanted to cover in this article. I have two objects in my mocked/smbus.py file: SMBus and FakeSMBDevice. To create a virtual SMBus device, you would inherit from FakeSMBDevice, which provides function stubs for functionality available in SMBus and registers the device with SMBus. You only need to implement what you use. If you get a NotImplementedError, then you use it and didn\u0026rsquo;t implement it.\nDS28CM00 Driver # The DS28CM00 chips is about as simple as an SMBus device gets. This is a silicon serial number. Its sole purpose is to give you a unique 6-byte serial number.\nWhy would you use something like this? It allows me to keep all software the same on each RPi and use this to load unique configurations from the DB at startup. So pushing updates to all carts is simply a multiple target SCP transfer of files, with no unique configuration data. This is very helpful.\nThis is a ROM with only 1-bit configurable (toggle between SMBus and I2C modes). Since I drive this at 100 KHz, I never need to touch this. I only need to read the serial number value and check the CRC on the data received. Then I provide this in a hex string format. Since calling hardware is slow and this will not change after being read, I cache the value and only call once.\nfrom .util.crc import crc8_check class DS28CM00(object): \u0026#34;\u0026#34;\u0026#34; I2C driver for DS28CM00 silicon serial number This is a simple chip that only gives you a unique serial number. It is useful if you want to load the same software on multiple systems and still have them able to determine who they are. I use this serial as the primary key in the DB. This allows the device to load config data from the DB at start up. \u0026#34;\u0026#34;\u0026#34; _ADDRESS = 0b1010000 def __init__(self, smbus_ref): \u0026#34;\u0026#34;\u0026#34; Initalize object and give proper smbus to use. :param smbus_ref: smbus object, as create with smbus.Smbus(bus_number) or mock smbus object. \u0026#34;\u0026#34;\u0026#34; self._smbus = smbus_ref self._serial_number = None self._serial_hex = None @property def serial_number(self): \u0026#34;\u0026#34;\u0026#34; Read silicon serial number. :return: 48-bit serial number as hex value :raises: ValueError if CRC check fails \u0026#34;\u0026#34;\u0026#34; if not self._serial_number: # Load it once and cache it self._smbus.write_byte(self._ADDRESS, 0x00) data = [self._smbus.read_byte(self._ADDRESS) for _ in range(8)] if not crc8_check(data[:-1], data[-1]): raise ValueError(\u0026#39;CRC validation failed for reading serial number.\u0026#39;) self._serial_number = 0 for byte_value in data[1:-1]: self._serial_number = (self._serial_number \u0026lt;\u0026lt; 8) + byte_value self._serial_hex = hex(self._serial_number) return self._serial_hex Fake DS28CM00 # As you see in the code above, I\u0026rsquo;m only using two methods on the SMBus object: write_byte and read_byte. So these are the only methods I need to implement for my FakeSMBusDevice.\nAt __init__, we pass in the serial number we want the device to have. I do some validation that we have the correct number of bits and values are within range. I used a list of integers, instead of bytes or bytearray as it eliminated conversions to do the CRC-8 calculation. This is transparent to the user of the DS28CM00 real device.\nI setup the memory into _data and also build a _write_map that only allows writing to the 8th byte (configuration register), but have not implemented this write. When reading an SMBus memory, it is common to write the address location then repeatedly call read_byte. So we have an internal _index that points to the next memory. Each call to read_byte increments this and wraps around if we get to the edge of memory.\nfrom .smbus import FakeSMBusDevice from rpi_hardware import DS28CM00 from rpi_hardware.util.crc import crc8_value class FakeDS28CM00(FakeSMBusDevice): \u0026#34;\u0026#34;\u0026#34; Fake Hardware for DS28CM00, to be talked to using DS28CM00 object for testing and simulation DS28CM00 is a silicon serial number. So we just have a simple memory device that is read with multiple byte calls. Note: Only implemented write for address selection. Not for writing of the one configuration bit, which would occur with a write of 0x08 followed by 0x00 or 0x01. \u0026#34;\u0026#34;\u0026#34; _ADDRESS = DS28CM00._ADDRESS def __init__(self, smbus, serial_number_byte_list): \u0026#34;\u0026#34;\u0026#34; Initalize object and give proper smbus to use. :param smbus: mock smbus object. :param serial_number_byte_list: 6 member list with bytes for serial number \u0026#34;\u0026#34;\u0026#34; if not len(serial_number_byte_list) == 6: raise ValueError(\u0026#39;serial_number_byte_list must be a list of 6 byte integers.\u0026#39;) if max(serial_number_byte_list) \u0026gt; 255 or min(serial_number_byte_list) \u0026lt; 0: raise ValueError(\u0026#39;serial_number_byte_list contains values not within range(256)\u0026#39;) # Memory is Family Code (0x70), 6 bytes of serial number, crc8, Control Register byte (0x01) data = [0x70] + serial_number_byte_list[:] self._data = data + [crc8_value(data)] + [0x01] self._write_map = [False] * 8 + [True] self._index = 0 super().__init__(smbus, self._ADDRESS) def _inc_index(self): self._index += 1 if self._index \u0026gt; 8: self._index = 0 def write_byte(self, byte): if -1 \u0026lt; byte \u0026lt; 9: self._index = byte else: raise ValueError(\u0026#39;Valid memory addresses for write at 0x00 to 0x08.\u0026#39;) def read_byte(self): value = self._data[self._index] self._inc_index() return value Testing DS28CM00 # Testing is straight forward, with a fixture to initialize the mocked.SMBus. I first test that bad values for serial number initialization are not allowed in FakeDS28CM00. Then test_straight_read is just a simple serial number read from FakeDS28CM00 through mocked.SMBus into DS28CM00 and validation that data in is the same a data out.\nimport pytest from rpi_hardware.mocked import smbus from rpi_hardware.mocked import FakeDS28CM00 from rpi_hardware import DS28CM00 @pytest.fixture def smb(): bus = smbus.SMBus(1) return bus def test_bad_byte_values(smb): bad_number_values = [1, 2, 3, 4, 5] with pytest.raises(ValueError): ds = FakeDS28CM00(smb, bad_number_values) bad_values = [0, -1, 256, 3, 19, 43] with pytest.raises(ValueError): ds = FakeDS28CM00(smb, bad_values) def test_straight_read(smb): serial_number = [15, 45, 120, 255, 0, 192] fds = FakeDS28CM00(smb, serial_number) rds = DS28CM00(smb) serial = 0 for byte in serial_number: serial = (serial \u0026lt;\u0026lt; 8) + byte assert hex(serial) == rds.serial_number Because a CRC is included to validate data and detect if transmission errors occurred, I could add in bad data functionality to my FakeDS28CM00 object and test my CRC errors in the main object. This would allow me to help validate all outcomes.\nSummary # This is one of my longer articles, but I hope it was of value for you. Let\u0026rsquo;s hit some bullet points of what we covered:\nRaspberry Pi common hardware interfaces How to implement a Singleton model in Python How to create a mocked replacement for both GPIO and SMBus How to structure imports to switch between real and fake interfaces How to implement drivers in a way that allows interface substitutions Testing with pytest and mock to verify callback functions Testing drivers with mocked hardware When I look at all of those, I can understand why this article is so long. In future articles for this series, I will discuss implementation of the cart workflow and web software and simulation, using these virtual devices.\n","date":"14 October 2017","externalUrl":null,"permalink":"/blog/2017/10/14/rpi-hardware-mocking/","section":"Blogs","summary":"","title":"Raspberry Pi Hardware Mocking","type":"blog"},{"content":"","date":"14 October 2017","externalUrl":null,"permalink":"/tags/testing/","section":"Tags","summary":"","title":"Testing","type":"tags"},{"content":"Over the last 5 years, I\u0026rsquo;ve been working on a very small team as the sole Engineer designing a ruggedized Android tablet. The only product option that met our needs would cost 10 times what we could afford. These are to be produced and distributed free of charge in developing nations as a missionary tool. Due to the cost and effort involved in getting them in country, our goal was a tablet with a 10 year service life.\nThrough many iterations of unique designs for case, battery, and other features, we believe we have accomplished this. The proof will be in the mortality rate, once units are in the field for a long duration.\nPart of this goal is to quickly identify issues with the tablets before shipping. In general, electronics will fail quickly or last for a long time. The goal of burn-in testing is to shake out this infant mortality and quickly get those back into rework and identify problems. To accomplish this task, I designed and built custom burn-in carts for our tablet production.\nIn this article, I\u0026rsquo;ll go over the general design goals and methodologies I chose to implement this system. Some parts of this system will just be interesting for readers, but others may address certain conditions that may be useful in building your own hardware or software projects. Future articles in the series will cover more detail on both hardware and software implementations.\nTablet Details # Our tablet design started as a USB charged tablet, because that was how things are done. However, in really looking at the problem we were trying to solve, we realized that a USB based infrastructure does not really exist where these are going. With no AC power, old 12V car batteries are often the normal voltage grid. An industry exists to get your battery charged for a reasonable fee. This combined with the low power transfer capable in USB cables, we moved to a 12V barrel plug configuration. For people who have not seen much technology, the barrel plug is easy and robust.\nTo fully cycle tablets automatically, we will need to provide 12V power and a method to activate the push button power switch. We will also need a method of communicating state back to the cart.\nCart Overview # The physical design is a rolling cart with 208V power and ethernet connectors on top. Each side holds 6 columns of 12 tablets for a total of 144 tablets in 12 columns of 12. We cannot pull enough power to charge every tablet at the same time, so I have individual power switching for each tablet. We also need to actuate the power button on the tablet. This makes for 288 data bits for power state and button state.\nThe main power for the cart is a 1.5KW (12V 125A) power supply. Each tablet charges at a max of 1.8A at 12V. This is over twice the power capability of normal micro-USB cables and ports. Charging every tablet at the same time, would require almost 260A of current. Discharge time is much longer than charging time, so we really don\u0026rsquo;t have any cycle time limitation with only being able to charge less than half the tablets at one time.\nThere is enough space to see the tablet screen at an angle while sitting horizontal in the cart. Early designs did consider having screens green for complete, red for error, and others for cycling. This has limitations of requiring a somewhat dark environment and an operator to walk up and down between the carts to check for issues.\nInitial tablet designs did not have WiFi capabilities in the tablet. However, once this was integrated in for other uses, we had a mechanism to communicate with the cart. Now we could have a WiFi access point in the cart and a single display with a 12x12 grid for the state of each tablet.\nAlthough I looked at larger HDMI and USB touch monitors at first, I settled on the Raspberry Pi 7\u0026quot; touch display. It sends display and gets touch over a single flat flex cable and is large enough to convey progress and error conditions for each tablet. This is the same cable used by the camera interface. I was able to test a 6 feet length of cable past some electrically noisy devices and still had solid touch and display.\nTablet Web Service Calls # Custom software runs on each tablet and calls to the cart\u0026rsquo;s web service for various conditions. If power is applied, power is removed, shut down started, boot up completed, or if 5 minutes has passed and it has not called the web service for other reasons. With each call, we receive data on the tablet and return a configuration for the tablet. This indicates the various settings and tasks the tablet should be operating.\nBy logging battery condition and temperatures, we can gather statistics for each cycle to see how this tablet measures against previous tablets. We can reject tablets if not within performance parameters and look to see if the issue is battery, display or PCB related.\nWeb Display and Web Service # Flask was chosen for the Python library to create the web service and web server. We do not need the extra overhead of a larger system, such as Django. The web service will accept a call from a tablet and dump it into a SQL Server database. The web server will have a overview page and a detail page for each tablet. This data is pulled directly from SQL Server.\nAt first I tested a few frameworks, such as circuits, to tie the web architecture to the workflow architecture. The complexity didn\u0026rsquo;t yield much gain. By storing data to be displayed on the cart in the DB, we lose a little in speed of update on the cart display. However, we are dealing with a system that will run for 48 hours at a time. Half a minute in screen refresh really doesn\u0026rsquo;t matter.\nBy having everything in a database, we can have an aggregating web server that displays the condition of one or all of our carts in progress. Instead of walking to check all carts, this can be done via each user\u0026rsquo;s desktop browser. This is a huge gain.\nWorkflow # The workflow process is just an continuous loop until every tablet in the cart is complete. A state machine is used to control the tablets process through the testing plans. This is the heart of the testing operation and fairly complex, so I\u0026rsquo;ll be dedicating at least one article to this.\nThat should give you enough of an overview of my goals to see how subsystems will work together. I\u0026rsquo;ll save any more to further articles in this series.\n","date":"6 October 2017","externalUrl":null,"permalink":"/blog/2017/10/06/burn-in-carts/","section":"Blogs","summary":"","title":"Burn-In Carts","type":"blog"},{"content":"When trying to implement a series sidebar and stand alone page in Hugo, I saw advantages of using the taxonomies structure in hugo.\nconfig.toml # To implement series as a taxonomy, I added it to my config.toml. That section now contains three taxonomies.\n[taxonomies] category = \u0026quot;categories\u0026quot; series = \u0026quot;series\u0026quot; tags = \u0026quot;tags\u0026quot; Front Matter # My only change to front matter from my previous series implementation was to change into an array style. Instead of series = \u0026quot;Hugo\u0026quot; I need to use series = [\u0026quot;Hugo\u0026quot;]. Taxonomies allow multiple membership, but I will only ever be using a single on with series.\nSeries Widget # I wanted to add various series to my sidebar. It was looking at categories display I already had that made this obvious why I should convert into taxonomies with series. In my theme, I created a new partials/widgets/series.html Below is the contents of this file. This gives the series name and the count of posts for each series. The results of this is visible in the sidebar.\n{{ if isset .Site.Taxonomies \u0026quot;series\u0026quot; }} {{ if not (eq (len .Site.Taxonomies.series) 0) }} \u0026lt;div class=\u0026quot;panel panel-default sidebar-menu\u0026quot;\u0026gt; \u0026lt;div class=\u0026quot;panel-heading\u0026quot;\u0026gt; \u0026lt;h3 class=\u0026quot;panel-title\u0026quot;\u0026gt;Blog Series\u0026lt;/h3\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026quot;panel-body\u0026quot;\u0026gt; \u0026lt;ul class=\u0026quot;nav nav-pills nav-stacked\u0026quot;\u0026gt; {{ range $name, $items := .Site.Taxonomies.series }} \u0026lt;li\u0026gt;\u0026lt;a href=\u0026quot;{{ $.Site.BaseURL }}series/{{ $name | urlize | lower }}\u0026quot; class=\u0026quot;text-uppercase\u0026quot;\u0026gt;{{ $name }} ({{ len $items }})\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; {{ end }} \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; {{ end }} {{ end }} Top Page Link # I created a template in partials to put a note at the top of the post, if this is part of a series. This is pretty simple (and you can see the results at the top of this post.) This partial is included in the page rendering just above {{ .Content }}.\n{{if .Params.series}} {{ $name := index .Params.series 0 }} \u0026lt;p class=\u0026quot;series_top_page\u0026quot;\u0026gt;This post is part of the \u0026lt;a href=\u0026quot;{{.Site.BaseURL}}/series/{{$name | urlize}}\u0026quot;\u0026gt;{{$name}}\u0026lt;/a\u0026gt; series.\u0026lt;/p\u0026gt; {{end}} By having this as a taxonomy, I did not have to generate the series page.\nBottom Page Links # This is the only functionality that existed previously. It was also the most difficult for figure out.\nTo understand this template, look in my previous series post in the Hugh series. I\u0026rsquo;ll just be discussing the changes here. {{ $series_name := index .Params.series 0 }} pulls the first (and only as we only have one) series from the array and stores in $series_name.\nI could not get the range where to function with the array style of series front matter, rather than just a value. I wound up having to loop all pages, then using an if to filter. The same basic functionality was done on the reversed one.\n{{ range .Site.RegularPages.ByDate }} {{ if in .Params.series $series_name }} Other than those, the functionality is exactly the same. Below is the full template to make the bottom links as you see on this page.\n{{- if .Params.series -}} {{- $series_name := index .Params.series 0 -}} {{- $.Scratch.Add \u0026quot;cur_page_num\u0026quot; 1 -}} {{- $.Scratch.Add \u0026quot;total_page_num\u0026quot; 0 -}} {{- range .Site.RegularPages.ByDate -}} {{- if in .Params.series $series_name -}} {{- $.Scratch.Add \u0026quot;total_page_num\u0026quot; 1 -}} {{- if gt $.Date.Unix .Date.Unix -}} {{- $.Scratch.Add \u0026quot;cur_page_num\u0026quot; 1 -}} {{- $.Scratch.Set \u0026quot;prev_link\u0026quot; .Permalink -}} {{- $.Scratch.Set \u0026quot;prev_title\u0026quot; .Title -}} {{- end -}} {{- end -}} {{- end -}} {{- range .Site.RegularPages.ByDate.Reverse -}} {{- if in .Params.series $series_name -}} {{- $.Scratch.Set \u0026quot;first_link\u0026quot; .Permalink -}} {{- if lt $.Date.Unix .Date.Unix -}} {{- $.Scratch.Set \u0026quot;next_link\u0026quot; .Permalink -}} {{- $.Scratch.Set \u0026quot;next_title\u0026quot; .Title -}} {{- end -}} {{- end -}} {{- end -}} {{- if or ($.Scratch.Get \u0026quot;next_link\u0026quot;) ($.Scratch.Get \u0026quot;prev_link\u0026quot;) -}} \u0026lt;hr/\u0026gt; \u0026lt;p\u0026gt;Part {{ $.Scratch.Get \u0026quot;cur_page_num\u0026quot; }} of {{ $.Scratch.Get \u0026quot;total_page_num\u0026quot; }} in the \u0026lt;b\u0026gt;{{- $series_name -}}\u0026lt;/b\u0026gt; series.\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt; {{- if $.Scratch.Get \u0026quot;prev_link\u0026quot; -}} {{- if ne ($.Scratch.Get \u0026quot;prev_link\u0026quot;) ($.Scratch.Get \u0026quot;first_link\u0026quot;) -}} \u0026lt;a href=\u0026quot;{{- $.Scratch.Get \u0026quot;first_link\u0026quot; -}}\u0026quot;\u0026gt;\u0026lt;i class=\u0026quot;fa fa-angle-left\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;Series Start\u0026lt;i class=\u0026quot;fa fa-angle-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/a\u0026gt; | {{ end -}} {{- if $.Scratch.Get \u0026quot;prev_link\u0026quot; -}} \u0026lt;a href=\u0026quot;{{- $.Scratch.Get \u0026quot;prev_link\u0026quot; -}}\u0026quot;\u0026gt;\u0026lt;i class=\u0026quot;fa fa-angle-double-left\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;{{- $.Scratch.Get \u0026quot;prev_title\u0026quot; -}}\u0026lt;/a\u0026gt; {{- end -}} {{- end -}} {{- if and ($.Scratch.Get \u0026quot;next_link\u0026quot;) ($.Scratch.Get \u0026quot;prev_link\u0026quot;) }} | {{ end -}} {{- if $.Scratch.Get \u0026quot;next_link\u0026quot; -}} \u0026lt;a href=\u0026quot;{{- $.Scratch.Get \u0026quot;next_link\u0026quot; -}}\u0026quot;\u0026gt;{{- $.Scratch.Get \u0026quot;next_title\u0026quot; -}}\u0026lt;i class=\u0026quot;fa fa-angle-double-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt; {{- end -}} {{- end -}} {{- end -}} At first, I wasn\u0026rsquo;t using the {{- and -}} where I could. With all this looping, I wound up with 1200+ blank lines in my html! View source to see what templates can be cleaned up.\nIf something on this doesn\u0026rsquo;t make sense, let me know and I\u0026rsquo;ll try to make it clearer.\n","date":"27 August 2017","externalUrl":null,"permalink":"/blog/2017/08/27/converting-series-to-taxonomy/","section":"Blogs","summary":"","title":"Changing my Series to Taxonomy","type":"blog"},{"content":"","date":"27 August 2017","externalUrl":null,"permalink":"/series/hugo/","section":"Series","summary":"","title":"Hugo","type":"series"},{"content":"","date":"27 August 2017","externalUrl":null,"permalink":"/tags/hugo/","section":"Tags","summary":"","title":"Hugo","type":"tags"},{"content":"","date":"27 August 2017","externalUrl":null,"permalink":"/tags/web/","section":"Tags","summary":"","title":"Web","type":"tags"},{"content":"","date":"25 August 2017","externalUrl":null,"permalink":"/series/python-to-rust/","section":"Series","summary":"","title":"Python to Rust","type":"series"},{"content":"Enums are new with Python 3.4 and PEP 435, but have been backported. At first, I saw more trouble than benefit from Python Enums. They are typically used for type safety, and this isn\u0026rsquo;t really enforceable in Python. But, since they are a class, you can add additional functionality to them. This gives them more usefulness than I previously thought.\nIt isn\u0026rsquo;t easy to store data with them in most languages. Until I saw how Rust does this, I never thought I would want to. There are some ways to make Python Enums have some of the capabilities of a Rust Enum. Karl Kuczmarski has a good post covering some of this entitled Actually, Python enums are pretty OK.\nWe will be getting into quite a bit of code this time, and you will see how Rust separates definitions for Enum and Struct with implementation of methods. In many other languages, such as Python, these are defined together.\nDirection Enum # Let\u0026rsquo;s make a simple Direction Enum. We will start with this in Python.\nfrom enum import Enum class Direction(Enum): North = 0 East = 1 South = 2 West = 3 def is_vertical(self): return self in (Direction.North, Direction.South) def is_horizontal(self): return self in (Direction.East, Direction.West) def to_vector(self): dirs = ((0, 1), (1, 0), (0, -1), (-1, 0)) return dirs[self.value] Lets do the same in Rust. This is a little longer, as I introduced tests for these are well. The next several code blocks are all the Rust source code. I\u0026rsquo;m breaking them into sections to discuss.\n#[derive(PartialEq)] enum Direction { North, East, South, West, } The derive statement is to allow Rust to implement a Trait automatically. This is possible when Enum or Structs are implemented with types that Rust knows how to handle. The PartialEq is required to use the equal == operator in code below. If we wanted to use the debug print {:?} we talked about in previous posts, we would include ,Debug after PartialEq.\nUnlike Python, the Enum isn\u0026rsquo;t required to assign a value. You have the option of doing what is considered a \u0026ldquo;C-type\u0026rdquo; by just assigning each entry to a value.\nimpl Direction { fn is_vertical(\u0026amp;self) -\u0026gt; bool { if *self == Direction::North || *self == Direction::South { true } else { false } } fn is_horizontal(\u0026amp;self) -\u0026gt; bool { if *self == Direction::East || *self == Direction::West { true } else { false } } fn to_vector(\u0026amp;self) -\u0026gt; (i32, i32) { match *self { Direction::North =\u0026gt; (0, 1), Direction::East =\u0026gt; (1, 0), Direction::South =\u0026gt; (0, -1), Direction::West =\u0026gt; (-1, 0), } } } In Rust, the impl block (for implementation) is the functionality and is separate from the Enum or Struct. This seems a little different at first, but makes more sense as Traits are implemented in later posts. Instead of automatically deriving the Debug trait, we could have a block that starts with impl Debug for Direction and methods required to implement the trait. Then the {:?} debug print would display what we defined. Rusts traits based objects are similar to interfaces in C# or Java. This is different from the object inheritance Python offers.\nReturn type of a function is indicated after the -\u0026gt;. The main function we saw in earlier posts had no return. The first two functions indicate that we are returning bool and the last function is returning a tuple of two i32. I would make this a Vector struct in a real program, but I\u0026rsquo;m keeping this simple and similar to the Python version. And we have not yet covered structs yet.\nAll of our functions have no arguments, except for the reference (\u0026amp;) to self as \u0026amp;self. In Python, every argument is by reference. Rust is much more like C in that you can specify lower level control of value or reference passing. Rust can automatically dereference (point back at the object) when it can tell which is required. With comparisons, Rust doesn\u0026rsquo;t know if we want to compare the reference or the object. So we must manually dereference with the * operator, as seen in the *self == Direction::East. The boolean operators in Rust are the same as in C. So instead of the Python or we have ||.\nThe is_vertical and is_horizontal functions have a simple if else structure. However, there is no return. In Rust, if the line ends in a semicolon, it is a statement with no value. If there is no semicolon, it is an expression. So the true or false are expressions and become return values.\nThe to_vector method introduces a new control flow type of match. This is something like a switch, but with some powerful options. Rust requires that all cases are handled. I have every Direction as an option in the match. If this were not the case, this code would not compile. I\u0026rsquo;m again using the expression at the end of the matching Direction to automatically return the tuple.\nOne thing I should mention is that all of these functions and the Enum are currently private. If I tried to use these in a program that imports this library, nothing would be available to reference. I must include a pub keyword in front of the enum and fn to make them available.\nWhile this is very simple and tests are a little over kill, I wanted to show how they are done in Rust. #[cfg(test)] mod tests { use Direction; #[test] fn is_vertical() { assert!(Direction::North.is_vertical()); assert!(Direction::South.is_vertical()); assert!(!Direction::East.is_vertical()); assert!(!Direction::West.is_vertical()); } #[test] fn is_horizontal() { assert!(!Direction::North.is_horizontal()); assert!(!Direction::South.is_horizontal()); assert!(Direction::East.is_horizontal()); assert!(Direction::West.is_horizontal()); } #[test] fn to_vector() { assert_eq!(Direction::North.to_vector(), (0, 1)); assert_eq!(Direction::East.to_vector(), (1, 0)); assert_eq!(Direction::South.to_vector(), (0, -1)); assert_eq!(Direction::West.to_vector(), (-1, 0)); } }\nThis creates a separate module for tests. A module is the unit of organization for Rust. This is similar to a Python package. It isn\u0026rsquo;t required to put tests in a module, all that is required is the function have #[test] above it. However, using a module is good practice. The #[cfg(test)] is used to only compile this code if we are testing by running cargo test. This reduces the binary size of the final result and reduces compile time.\nSince we made this a module, notice how we had to use Direction; at the top, to make Direction available inside the module.\nOur tests are just using the assert! macros with ! negation and checking all 4 cases of both functions. The to_vector test is comparing equality with the expected tuple.\nEnums with Values # The other thing I mentioned earlier is Rust\u0026rsquo;s ability to hold data in an Enum. Lets look at an Enum that might handle possible responses in a conversation.\nenum Interaction { // Normal Enum DoNothing, // Tuple based values Say(\u0026amp;\u0026#39;static str), Shout(\u0026amp;\u0026#39;static str, u32), // Structure Based Physical { action: \u0026amp;\u0026#39;static str, leave_after: bool }, } So we have DoNothing that requires no data, Say which has a str holding what to say, Shout with a str and a u32 for volume of shout, and a Physical response has named fields of action and leave_after.\nfn describe_interaction(inter: Interaction) { match inter { Interaction::DoNothing =\u0026gt; println!(\u0026#34;Doing Nothing\u0026#34;), Interaction::Say(s) =\u0026gt; println!(\u0026#34;Say: \u0026#39;{}\u0026#39;\u0026#34;, s), Interaction::Shout(s, v) =\u0026gt; println!(\u0026#34;Shout: \u0026#39;{}\u0026#39; at volume: {}\u0026#34;, s, v), Interaction::Physical { action, leave_after: leave } =\u0026gt; { println!(\u0026#34;You {} \u0026#34;, action); if leave { println!(\u0026#34;And leave.\u0026#34;); } else { println!(\u0026#34;And stay.\u0026#34;); } }, } } fn main() { let noth = Interaction::DoNothing; let say = Interaction::Say(\u0026#34;Hello\u0026#34;); let shout = Interaction::Shout(\u0026#34;I SAID HELLO!\u0026#34;, 12); let phys = Interaction::Physical { action: \u0026#34;Stomp Foot\u0026#34;, leave_after: true }; describe_interaction(noth); describe_interaction(say); describe_interaction(shout); describe_interaction(phys); } We will start from the bottom up. In main, we create 4 variables for the 4 types of Interaction Enum. Notice how the data is just added as part of the setting of the enums. We then call describe_interaction with each type. This method uses a match to identify a given enum and bind the data held with variables we can use.\nThe Say and Shout have unnamed values, that are assigned to s and v. These are just used with println! macro formatting. When getting data out of the named Physical data, I made use of a shortcut that doesn\u0026rsquo;t require you to name the parameter if the variable has the same name. So because action is our local variable and the name of the first piece of data, we don\u0026rsquo;t have to use action: action. Note that leave isn\u0026rsquo;t the same, so we need the full leave_after: leave.\nThe Physical match also displays the first complex scoped match we have seen. Everything in the curly braces is part of the match. This can get very complex and you can put as much as you want here. After a certain point, it is just unreadable. In this case, we are using the boolean leave, to determine what we print.\nThe following is the output from running this Rust code:\nDoing Nothing Say: 'Hello' Shout: 'I SAID HELLO!' at volume: 12 You Stomp Foot And leave. If you want to play with this code, here is a link to the Rust Playground with it loaded.\nSpecial Enums # There are two special Enums built into Rust: Option and Result. In discussing these, we will need to bring up the idea of generics. This eliminates the need to rewrite the same code to handle multiple types, without losing the type safety. You can define data structures and functions with the idea of some type T.\nEven though both of these are already defined, lets see what code is required to make them. I think this is important to understand how they work.\nOption # The Option Enum is a way of handling a return that may or may not have a value. An example might be, give me the index of a vector that is equal some value. You will either have an index, or no value because you didn\u0026rsquo;t find it. Python would use None, and trust that you check for the value being None before using it. If you don\u0026rsquo;t, things blow up.\nSince Rust requires all paths to be handled, you must handle a return that has Some value or None. If we look at the Option Enum, the code would look like this:\nenum Option\u0026lt;T\u0026gt; { Some(T), None, } The T is using the generic capability of Rust to allow Some to hold the type defined when the Option is created. If we use Option\u0026lt;i32\u0026gt;, this would be the same as if the Some was defined like Some(i32). You could have a scalar, tuple, or more complex data type and it would work with Option. The idea is just that you have Some data or None.\nfn get_optional_input() -\u0026gt; Option\u0026lt;i32\u0026gt; { if we_get_number_from_user { Some(number) } else { None } } fn main() { if let Some(num) = get_optional_input() { println!(\u0026#34;We received {}\u0026#34;, num); } else { println!(\u0026#34;Nothing\u0026#34;); } } The get_optional_input is psudo code that wouldn\u0026rsquo;t run, but gives you and idea of how you would make an Option return. In the main function, I\u0026rsquo;ve introduced a new assigment and control feature, the if let. This is true if the left side assignment can be made. Otherwise, the else clause will execute. This would be the same as the following match:\nmatch get_optional_input() { Some(num) =\u0026gt; println!(\u0026#34;We received {}\u0026#34;, num), _ =\u0026gt; println!(\u0026#34;Nothing\u0026#34;), } Note, I could have used None for the section expression, but used the _ catch all, because I had talked about it previously, but had not shown it before.\nResult # Rust has the ability to panic, when really bad things happen. This is done with the panic! macro and is not recoverable. The idea is to stop execution and minimize damage, because we are in an unknown and unhandled situation.\nThere are no thrown and caught errors or exceptions, as is common in Python. The reason for this is that Rust wants to be absolutely sure you are handling all cases of execution. As Python programmers, we are often too lax in checking for exceptions. In Rust, it isn\u0026rsquo;t optional.\nError conditions are returned from functions. The Result type is used for this. The Result has two possibilities, like Option, but both have their own type. So this is using generics with two types. If we were to create it ourselves, the code would look like this:\nenum Result\u0026lt;T, E\u0026gt; { Ok(T), Err(E), } The letters used with generics isn\u0026rsquo;t required to be anything, but by convention T is used for only one, as a shortcut for type. Here, T means type and E means error type.\nLet\u0026rsquo;s make a divide function.\nfn divide(num: i32, div: i32) -\u0026gt; Result\u0026lt;i32, \u0026amp;\u0026#39;static str\u0026gt; { if div == 0 { Err(\u0026#34;You can\u0026#39;t divide by zero.\u0026#34;) } else { Ok(num / div) } } fn divide_display(num: i32, div: i32) { match divide(num, div) { Ok(val) =\u0026gt; println!(\u0026#34;{}/{} = {}\u0026#34;, num, div, val), Err(err) =\u0026gt; println!(\u0026#34;{}\u0026#34;, err), } } fn main() { divide_display(20, 10); divide_display(10, 0); } As you should expect, the output is:\n20/10 = 2 You can't divide by zero. Quicker Handling # There are some helper methods to get values out of Option and Result without full blown matches or ifs. For example, unwrap() will give you the Some value, but panic is None is returned. While not safe, you will find this is example code, as it is quick and doesn\u0026rsquo;t pull the focus away from what they are trying to show. A better use might be unwrap_or which allows you to specify a default if None was returned.\nWith Result you might not care about the value, but just want to know if it is_ok() or is_err(). The ok() method is often used in iterators when you only want to continue if it is a good result.\nLook through the Option and Result documentation to see more functions and examples.\n","date":"25 August 2017","externalUrl":null,"permalink":"/blog/2017/08/25/ptr-enum/","section":"Blogs","summary":"","title":"Python to Rust: Enum","type":"blog"},{"content":"","date":"25 August 2017","externalUrl":null,"permalink":"/tags/rust/","section":"Tags","summary":"","title":"Rust","type":"tags"},{"content":"Python is a dynamically typed language. It is a somewhat strong typed language, with some edge cases. Rust is a static and very strong typed language. What do these mean and how does it affect you?\nIn a strong, dynamic typed language, it is the object that holds the type information, not the variable. In Python the strong typing means that we would not expect a string to become a number, without some work from us. When comparing this with JavaScript, which is both dynamic and weakly typed, we see behaviors we might not expect.\nStrong vs Weak # Python does not support adding a number and string:\n\u0026gt;\u0026gt;\u0026gt; 1 + \u0026quot;1\u0026quot; Traceback (most recent call last): File \u0026quot;\u0026lt;stdin\u0026gt;\u0026quot;, line 1, in \u0026lt;module\u0026gt; TypeError: unsupported operand type(s) for +: 'int' and 'str' If we try that in JavaScript, we may not know how the interpreter will automatically convert the values. When using ScratchPad in Firefox, I got the following:\n1 + \u0026#34;1\u0026#34;; /* 11 */ So JavaScript converted the number 1 to a string \u0026quot;1\u0026quot; and then appended the strings together. Since this happened automatically, we call the typing weak. It does not warn you before types change.\nAs a side note: If you have not seen the Wat lightning talk by Gary Bernhardt on crazy automatic type conversions, you need to take 4 minutes and enjoy it.\nThere is no complete definition of what \u0026ldquo;strong\u0026rdquo; means with referring to types. So it is a grouping with differences between those within groups.\nOne notable place where Python is not strongly typed is that everything evaluates to a boolean for use in while, if or other similar locations. This is a common shortcut for doing things if a list exists and is not empty. It is one of the time savers in Pythonic code, but it does open up bugs when you don\u0026rsquo;t fully think about how truthness operates.\nThere is functionality in Rust similar to this, but is explicit. See discussion of the boolean type below.\nIf we try to do this same addition in Rust, we can\u0026rsquo;t compile.\nfn main() { println!(\u0026#34;{}\u0026#34;, 1 + \u0026#34;1\u0026#34;); } The compiler complains to us, much like the Python interpreter did while running.\nerror[E0277]: the trait bound `{integer}: std::ops::Add\u0026lt;\u0026amp;str\u0026gt;` is not satisfied --\u0026gt; src/main.rs:2:22 | 2 | println!(\u0026quot;{}\u0026quot;, 1 + \u0026quot;1\u0026quot;); | ^ no implementation for `{integer} + \u0026amp;str` | = help: the trait `std::ops::Add\u0026lt;\u0026amp;str\u0026gt;` is not implemented for `{integer}` Rust has traits that can be shared between types. The compiler is complaining that std::ops::Add\u0026lt;\u0026amp;str\u0026gt; (the add functionality for integer) is not implemented for type \u0026amp;str (one of the two string types in Rust). In Python language, this would be similar to saying the __add__ method for a given type isn\u0026rsquo;t implemented.\nYou will generate many compile errors starting out. Much work has been done to make these errors understandable and often suggesting fixes.\nStatic vs Dynamic # Python strong types are associated with the object, not the variable. This is perfectly valid Python:\ncount = 12 # Strong Number Type count = \u0026#34;Dracula\u0026#34; # Strong String Type Rust looks like it can do the same thing at first.\nfn main() { let count = 12; let count = \u0026#34;Dracula\u0026#34;; } This compiles. Rust complains about the two unused variables we created. Unlike Python, Rust did not reuse the first count. It threw it away when we created the second count equal to \u0026quot;Dracula\u0026quot;. The let keyword is used only for variable definition. If assigning to a variable already defined, a normal var = value; is used.\nIn the follow code, we try to reassign count.\nfn main() { let count = 12; count = \u0026#34;Dracula\u0026#34;; } We have two problems, but only get the first one from the compiler.\nerror[E0308]: mismatched types --\u0026gt; src/main.rs:3:13 | 3 | count = \u0026quot;Dracula\u0026quot;; | ^^^^^^^^^ expected integral variable, found reference | = note: expected type `{integer}` found type `\u0026amp;'static str` = help: here are some functions which might fulfill your needs: - .len() We have mismatched types. It tells you the type it expected {integer} and the type you gave it \u0026amp;'static str. The compiler won\u0026rsquo;t allow non-compatible data to be stored there.\nNote: the 'static indicates that this will live for the life of the program. So location where \u0026quot;Dracula\u0026quot; is stored will be static for the life of the program. This is related to both Strings and Lifetimes that are coming later. You will continue to notice that Rust has much lower level control over data structures than Python.\nWe have a help message that gives us possible things we missed. Maybe we wanted to set it equal to the length of the string, with the .len() method. These won\u0026rsquo;t always say what you wanted to do, but a surprising number of times it is exactly right.\nMutability # Let\u0026rsquo;s go ahead and use the len() method to get a valid integer to assign.\nfn main() { let count = 12; count = \u0026#34;Dracula\u0026#34;.len(); } error[E0384]: re-assignment of immutable variable `count` --\u0026gt; src/main.rs:3:5 | 2 | let count = 12; | ----- first assignment to `count` 3 | count = \u0026quot;Dracula\u0026quot;.len(); | ^^^^^^^^^^^^^^^^^^^^^^^ re-assignment of immutable variable We no longer get the type error. But now we are trying to re-assign the value of an immutable variable. (This is the second error I mentioned above.)\nMutable means changeable and immutable means unchangeable. In Rust, variables are immutable by default. You only allow changes if you need to. In this code, let count = 12; means that within this scope, count can never equal anything other than 12.\nThis should be familiar to what you have seen in Python for the immutable tuple. Once a tuple is created, it cannot be changed. You would need to generate a new tuple with the new data, as we did at first with the new let count variable assignment.\nWe tell Rust that the variable is mutable with the mut keyword. I also added calls to the println! macro to display the two values as they change.\nfn main() { let mut count = 12; println!(\u0026#34;{}\u0026#34;, count); count = \u0026#34;Dracula\u0026#34;.len(); println!(\u0026#34;{}\u0026#34;, count); } Output:\n12 7 Scalar Types # Rust has 4 scalar types: integers, floating-point numbers, booleans, and characters. These are variables that hold one value, as apposed to an mroe complex type like array or list.\nIntegers # The integer type is defined by bit size and signer or unsigned. A signed integer type is prefixed by and i, as in i8, i16, i32, i64 or isize. An unsigned integer is prefixed by u, as in u8, u16, u32, u64 or usize. The size integers are dependent on the machine\u0026rsquo;s addressing. Most modern PCs and operating systems, this is 64-bit. However, an embedded microcontroller might be an 8-bit or 16-bit system. Older OSes are 32-bit systems.\nA signed integer of bit size n will have a number range from -(2^(n - 1)) to 2^(n - 1) - 1. So i8 would be -128 to 127. The method of storing the bits for signed integers is called 2\u0026rsquo;s compliment. We loose one power of 2 in number range between signed and unsigned, as that bit is used to show positive or negative.\nAn unsigned integer of bit size n will have a number range from 0 to 2^n - 1. For u8 we have 0 to 255.\nPython has two types of integers, a normal signed integer and a long number type. Where a Rust integer can overflow and throw a panic, Python just converts into a long number type for an unlimited sized integer (with a performance hit). This makes Python possible to solve some of the very long mathematical number problems, but at a slow speed. This capability is possible in Rust, but requires using an external big numbers crate.\nIn our examples so far, we have not explicitly stated the Rust types we are using. Default integer is i32, as this is usually the fastest (even on 64-bit systems). This was what Rust made the first count variable above, until we were assigning it to the len() of the string. Then it was made a usize type variable at compile. Any time you are indexing or getting data from an index, you will receive a usize, because the address range is dependent on the bit size the computer memory is operating.\nFloats # Python only has a single type of float. The size of it depends on if you used 32-bit or 64-bit Python. In Rust, this is explicitly defined with f32 and f64 types.\nBooleans # Python bool type was added in 2.3. Prior to this, the property that evaluates other types to boolean were used, so most commonly a 1 or 0 were the boolean variable values. Python\u0026rsquo;s boolean values are True and False, with the Rust equivalent of true and false.\nLets look at Booleans in Python a little closer:\n\u0026gt;\u0026gt;\u0026gt; type(False) \u0026lt;type 'bool'\u0026gt; Ok, so Python has a true boolean type, right?\n\u0026gt;\u0026gt;\u0026gt; False + 2 2 \u0026gt;\u0026gt;\u0026gt; type(False + 2) \u0026lt;type 'int'\u0026gt; Well soft of. It is a C subtype of the int type and equal to 1 or 0.\n\u0026gt;\u0026gt;\u0026gt; False == 0 True \u0026gt;\u0026gt;\u0026gt; True == 1 True \u0026gt;\u0026gt;\u0026gt; True - 1 == False True If you want to make enemies, add True = 0 and False = 1 into someone\u0026rsquo;s code.\nAs mentioned before, Python will evaluate the following as false: None, False, zero in various numerical formats, empty sets and collections: '', (), [], {}, set() and range(0).\nIn Rust, bool is a proper type with no automatic type changes:\nfn main() { println!(\u0026#34;{}\u0026#34;, true + 1); } error[E0369]: binary operation `+` cannot be applied to type `bool` --\u0026gt; src/main.rs:2:20 | 2 | println!(\u0026quot;{}\u0026quot;, true + 1); | ^^^^^^^^ | = note: an implementation of `std::ops::Add` might be missing for `bool` For testing empty collections, we must explicitly call methods on the type. However, since the type is both known and static, this is not an issue. An example of this is a vector (which is Rust\u0026rsquo;s version of a Python list). To convert to boolean, we would just use vector_variable.is_empty(). So you don\u0026rsquo;t lose functionality or increase code too much, but you gain very explicit code.\nI have introduced bugs into Python code by forgetting an explicit boolean expression I wanted in an if, and the automatic boolean conversion ran fine with incorrect logic. These subtle issues are not possible in Rust, due to the truly strong typing of boolean.\nCharacters # There is no character type in Python. There exists only strings of length 1. I don\u0026rsquo;t fully understand the Unicode in both Python 3 and Rust. Someone much smarter than me has made them to work, and I\u0026rsquo;ll just use them. But I know I can\u0026rsquo;t expect them to be ASCII. A character in Rust is a 4-byte Unicode Scalar Value. If you know it is an ASCII value, you can convert into ASCII codes for the typical number to character conversion sometimes used in A-Z looping.\nIt is also worth noting that a single Unicode code point in a Rust String may not fit into a single character. An example used on the Rust char documentation page is the emoticon ❤️having the value of two chars \\u{2764}\\u{fe0f}.\nOnce I start talking about iterators, we will see that we can iterate by chars(), similar to how Python allows iterators on a string with 1 character strings.\nI should also point out that for most things in Python, \u0026quot; amd ' are interchangeable. There are subtle differences, but they can often be swapped without any issue. In Rust, a char is represented by the single quote, such as 'A'. A string must use a double quote as in \u0026quot;This is a string.\u0026quot;.\nComplex Types # I will not go very detailed into the complex types, but want to mention a few and their equivalents.\nTuple # Python and Rust\u0026rsquo;s tuples are almost exactly the same. An immutable list with the capability of storing different types. Definition is also the same with parenthesis and commas. I will go into special cases in Rust of tuples in a separate post.\nRust Array # Rust has C-style fixed length arrays. These are of a single type and the length is defined at creation. Nothing exists for this in Python.\nWhile type notation did come to Python with 3.6, it is required in Rust when it cannot be inferred. For variable declaration, this comes with a colon after the variable name. For example, the code we wrote above with type inference would be the same as writing the explicit usize type after a :.\nfn main() { let mut count: usize = 12; count = \u0026#34;Dracula\u0026#34;.len(); } For the Rust Array, we use square brackets similar to C, with the type and number. Below we have x equal to a 5 member array of i32 integers, that is initialized to 5 different values. The array y is a boolean with 1000 values, and we initialize all 1000 of these values to true.\nlet x: [i32; 5] = [-1, 0, 1, 2, 3]; let y: [bool; 1000] = [true; 1000]; Python Array/List and Rust Vector # While most will get started with a list, Python does have an array type. This is a data structure with a single type, but dynamically allocated. This allows growth after creation, but only members of a given type.\nWhile it is common to use a Python list with a single data type, this is not a requirement of the list. It can capture all types of objects. This is not possible in Rust, without a little more advanced work.\nIf we assume a list full of integers, for simplicity. (For better performance, you could use the Python array instead.) In Python this is:\nl = [1, 2, 3] print(l) Output\n[1, 2, 3] In Rust, we would have:\nlet v = vec![1, 2, 3]; println!(\u0026#34;{:?}\u0026#34;, v); Output\n[1, 2, 3] We have a macro vec! that allows us to define a vector in very similar to Python notation otherwise. Rust probably picked the default i32 type, as we did not specify.\nNotice the {:?} in the println!. This is a debug formatter that is implemented with the Debug trait. This is similar to Python\u0026rsquo;s __repr__. We will cover this more in traits. However, it is useful to know if you want an object representation printed out.\nThis works for an empty list in Python, because type isn\u0026rsquo;t important.\nl = [] print(l) If we wanted to make an empty vector, would use a static method on the Vec struct: Vec::new().\nlet v = Vec::new(); However, with an empty vector the Rust compiler has no data from which to infer type.\n--\u0026gt; src/main.rs:2:13 | 2 | let v = Vec::new(); | - ^^^^^^^^ cannot infer type for `T` | | | consider giving `v` a type For many types, you will see the \u0026lt;T\u0026gt; notation for type. We are saying that v is a Vec holding type i32.\nlet v: Vec\u0026lt;i32\u0026gt; = Vec::new(); It would work to call the macro with no values, but best practices is to call the new constructor when you want an empty object. The double colon :: is only used on the static methods. Once you have a valid instance, you can use methods of the object.\nlet v: Vec\u0026lt;i32\u0026gt; = Vec::new(); println!(\u0026#34;{}\u0026#34;, v.len()); Output\n0 Python Dictionary and Rust HashMap # The functionality is similar between a Python Dictionary and the Rust HashMap. However, the big difference is that types of the key and value must be defined for Rust. Again, it is possible to work around this for values, but it is a little to complex to look at now and uses some thing we haven\u0026rsquo;t learned yet.\nHashMap isn\u0026rsquo;t automatically available in Rust. We will be using our first use statement, which is similar to Python\u0026rsquo;s import. This is part of Rust and not an external crate, it just isn\u0026rsquo;t automatically included.\nuse std::collections::HashMap; fn main() { let mut hm: HashMap\u0026lt;u32, \u0026amp;str\u0026gt; = HashMap::new(); hm.insert(1, \u0026#34;Joe\u0026#34;); hm.insert(8, \u0026#34;Amy\u0026#34;); println!(\u0026#34;{:?}\u0026#34;, hm); } From std::collections we are using HashMap. We create an empty HashMap\u0026lt;K, V\u0026gt; with key type of u32 and value type of \u0026amp;str, which is a string pointer. Look for the Strings post to cover strings in more detail. Since we have no macro for creation, like the vector\u0026rsquo;s vec!, we cannot use a simple notation for a single line dictionary creation and loading. So we make two calls to the HashMap insert method and provide key and values. Then use the Debug trait of the HashMap to display the structure.\nOutput is similar to Python\u0026rsquo;s dictionary notation.\n{8: \u0026quot;Amy\u0026quot;, 1: \u0026quot;Joe\u0026quot;} There are many more data structures in both languages, but hopefully this gives you a feel for the most common ones. We still have a few more topics to cover before we can start really writing code, but we are getting there.\n","date":"24 August 2017","externalUrl":null,"permalink":"/blog/2017/08/24/ptr-types/","section":"Blogs","summary":"","title":"Python to Rust: Types","type":"blog"},{"content":"This post will discuss Cargo, compare it a little with Python\u0026rsquo;s processes for dependencies, and explain how to use it in getting started.\nMany of the differences between pip and cargo are there due to the interpreted Python vs compiled Rust. To make separate environments to deal with incompatible dependencies in Python, you will create either a virtual environment or use a docker instance. Rust is compiling, so you just need a way to point to the proper source code you depend on.\nThere is a similar action where you use an import in Python or a use in Rust. Packages to make available are defined in the Cargo.toml file and they are made available in source code via extern crate [name] at the top of the source file. Cargo will automatically get the versions to build, in contrast to the more manual pip process. For those setting up project correctly in Python, this is more like using requirements.txt to setup the virtual environment.\nOne of the biggest differences that has potential to cause issues is Python only allowing a single version of a package to be installed. Rust can have dependencies that reference different versions of the same package, as cargo crawls up the dependency chains.\nThe only real problem I see with crates.io currently is the large number of package name squatting that is going on. Discussions have shown that those in control currently do not considered it a problem. However, we are seeing more people announce the name of a library as something strange \u0026ldquo;because other good names were being squatted.\u0026rdquo; Many of the squatted names are empty and registered 2 years ago. This will most likely need to be addressed in the future.\nStarting a new project # When installing rust, you also get the cargo command line utility in your path. While you can make a stand alone .rs source code file and compile it manually with rustc, I find it much easier to use cargo for everything. Even one file script programs.\nIn the terminal, navigate to the folder you want the source inside and type:\ncargo new my_library The default is to generate library code, as you will do that more than executables. On Windows, these would compile into .dll and on Linux or Mac, they would compile to .so.\nThis command will create the following in the current directory:\nmy_library └─── Cargo.toml └─── src └─── lib.rs To make an executable, you would add --bin to the end.\ncargo new my_program --bin This command will create the following in the current directory:\nmy_program └─── Cargo.toml └─── src └─── main.rs lib.rs and main.rs are your library and program source code files, respectively. You will see a main() function already created in main.rs and a testing module with a single empty test function in the lib.rs file.\nCargo.toml # This is what replaces the functionality of Python\u0026rsquo;s virtual environment and requirements.txt. It manages your link to dependencies and version of that code. It also can contain the data the you need if you decided to share your library on crates.io. It works as a one file version of the many setuptools used for packaging a PyPi project.\nThe Cargo.toml automatically created for my_library above, looks like this:\n[package] name = \u0026quot;my_library\u0026quot; version = \u0026quot;0.1.0\u0026quot; authors = [\u0026quot;sacherjj \u0026lt;sacherjj@gmail.com\u0026gt;\u0026quot;] [dependencies] The one for my_program is exactly the same, except for the name. These three field are mandatory, so this file would be the absolute minimum Cargo.toml that would be valid, if we removed the [dependencies] section. Using external dependencies is very common, so this is included to reduce programmer work.\nCargo uses Semantic Versioning with three numbers for [major].[minor].[patch]. In 0.x.x versions, anything goes. Try to be nice, but the interface is not baked in. Most developers treat minor version as increment on changes to the interface and patch as increment on non-breaking build.\nAt 1.0.0, you cannot make breaking changes without incrementing the major version. You also can not add new public interfaces structs, functions, types, etc., without incrementing the major version. This is true of Rust. For the most part, everything that compiled with Rust 1.0.0, still compiles. It is impressive with how rapid the release schedule is for the language. With every release, a tool is used that compiles all the code for all crates. This makes for a large test sample for prior version compatibility.\nYou may also only care about pointing to the major or minor versions. Using 1 would give you the latest version until 2.0.0. 1.1 would give you the latest version below either 1.2.0.\nYou can also specify a minimum version. ~1.0.0 would use any version \u0026gt;= 1.0.0 but less than 2.0.0. If you had a leading zero ~0.2.3, we would get any patch update \u0026gt;= 0.2.3 but less than 0.3.0.\nWildcards can also be used where 1.* has the same meaning as ~1.0.0. You can also use single and combined inequality operators, such as \u0026gt; 1.2 or \u0026gt;= 1.2 \u0026lt; 1.5.\nAdding Dependencies # If our project uses serialization and deserialization, we might want to include the serde library. You will notice at the top of that linked page, where is a Cargo.toml block with a copy button. You would then paste this into your file, so our library Cargo.toml file would look like:\n[package] name = \u0026quot;my_library\u0026quot; version = \u0026quot;0.1.0\u0026quot; authors = [\u0026quot;sacherjj \u0026lt;sacherjj@gmail.com\u0026gt;\u0026quot;] [dependencies] serde = \u0026quot;1.0.11\u0026quot; What happens when you are needing to reference a library you are developing or for some reason not on crates.io?\nLets use my two cargo projects as an example. I created both my_library and my_program in the same folder. So if I want to reference my_library from my_program, I would need to add the dependency like this:\n[dependencies] my_library = { path = \u0026quot;../my_library\u0026quot; } If I build my_program, I see the serde dependency that my_library has compiles first, then my_library compiles, and finally my_program compiles. (More on how to build in the next section.)\nUpdating registry `https://github.com/rust-lang/crates.io-index` Compiling serde v1.0.11 Compiling my_library v0.1.0 (file:///C:/Users/joesacher/Documents/Repositories/Personal/joesacher_com/scratch/my_library) Compiling my_program v0.1.0 (file:///C:/Users/joesacher/Documents/Repositories/Personal/joesacher_com/scratch/my_program) You may also reference a library directly from git (if this existed on github):\nmy_library = { git = \u0026quot;https://github.com/sacherjj/my_library.git\u0026quot;, rev = \u0026quot;1f8e324\u0026quot; } This can be useful if you are using features and a yet to be unpublished version, or just something that the author has not yet uploaded to crates.io. Notice how we can specify a rev to call out a specific commit.\nAdditional package fields # The documentation field under package can be set to the documentation URL for the package.\nexclude or include allows you to eliminate or include source files, using an array of paths with optional wildcards. exclude will be seeded into your .gitignore file. include must be exhaustive if it is used, or source code will not be included.\nRead through the entire manifest documentation for all the possible fields and configurations of your Cargo.toml file. This becomes more import as you fully flush out a libray for inclusion into crates.io. I have contributed to PyPi, but not yet to crates.io.\nBuilding and Running # To compile a program, you type cargo build. This builds in debug mode, which is much faster as performance optimizations are not being done. To both build and run, type cargo run. Either of these will fetch the dependencies and then compile everything.\nBelow is the output from a Lode Runner clone I\u0026rsquo;ve been working on to learn Rust. The first time a package has been referenced, you would see \u0026lsquo;Downloading\u0026rsquo; of the package as the first step, before compiling.\nCompiling rayon-core v1.2.1 Compiling heapsize v0.4.1 Compiling sdl2-sys v0.27.3 Compiling ole32-sys v0.2.0 Compiling kernel32-sys v0.2.2 Compiling shell32-sys v0.1.1 Compiling bzip2-sys v0.1.5 Compiling miniz-sys v0.1.9 Compiling gfx_gl v0.3.1 Compiling flate2 v0.2.19 Compiling app_dirs v1.1.1 Compiling time v0.1.38 Compiling cpal v0.4.5 Compiling sdl2 v0.29.1 Compiling euclid v0.15.1 Compiling rayon v0.8.2 Compiling rodio v0.5.1 Compiling msdos_time v0.1.5 Compiling bzip2 v0.3.2 Compiling lyon_bezier v0.7.1 Compiling lyon_core v0.7.0 Compiling zip v0.2.5 Compiling jpeg-decoder v0.1.13 Compiling lyon_path_iterator v0.7.0 Compiling lyon_path_builder v0.7.0 Compiling lyon_svg v0.7.0 Compiling lyon_path v0.7.0 Compiling lyon_extra v0.7.0 Compiling lyon_tessellation v0.7.1 Compiling image v0.15.0 Compiling lyon v0.7.1 Compiling gfx_device_gl v0.14.1 Compiling gfx_window_sdl v0.6.0 Compiling ggez v0.3.3 (file:///C:/Users/joesacher/Documents/Repositories/ggez) Compiling lode_ruster v0.1.0 (file:///C:/Users/joesacher/Documents/Repositories/lode_ruster) My only dependency is ggez, but cargo automatically downloaded and compiled the dependencies of ggez and the chain above that.\nIf you are working on a small program for solving a problem on something like Project Euler, you might want good performance each time. This means using the release option cargo run --release. This takes longer to compile, but runs significantly faster. This is of course what you want when you are done testing and releasing your library or program.\nCargo.lock # Once you have built your project, cargo writes a Cargo.lock file next to Cargo.toml. While Cargo.toml allows a little wiggle room, as far as versions of dependencies, Cargo.lock is a blueprint of exactly how the binary was created.\nFor our my_program from above, I get this Cargo.lock when compiling:\n[root] name = \u0026quot;my_program\u0026quot; version = \u0026quot;0.1.0\u0026quot; dependencies = [ \u0026quot;my_library 0.1.0\u0026quot;, ] [[package]] name = \u0026quot;my_library\u0026quot; version = \u0026quot;0.1.0\u0026quot; dependencies = [ \u0026quot;serde 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)\u0026quot;, ] [[package]] name = \u0026quot;serde\u0026quot; version = \u0026quot;1.0.11\u0026quot; source = \u0026quot;registry+https://github.com/rust-lang/crates.io-index\u0026quot; [metadata] \u0026quot;checksum serde 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)\u0026quot; = \u0026quot;f7726f29ddf9731b17ff113c461e362c381d9d69433f79de4f3dd572488823e9\u0026quot; I could have 1.* as my version for serde, but it would still have the full version in the Cargo.lock. Also notice the checksum that can be used to verify the library binary. This is all designed to allow you to get exactly what you got before if you code is exactly the same.\nBinary Crates # Much of the issues I run into with Python on Windows is due to packages with associates C or other dependencies. The default crates are pure Rust code. Cargo also has the ability to install binaries with the cargo install command. I have not used this yet, and just mention it if you come across something that needs it. I would assume this sits closer to the idea of wheels in PyPi. Binaries are used on Python for speed up or interfaces not easily accomplished in Python. There is much less need for binary in Rust for speed improvement.\n","date":"23 August 2017","externalUrl":null,"permalink":"/blog/2017/08/23/ptr-cargo-pip/","section":"Blogs","summary":"","title":"Python to Rust: PIP to Cargo","type":"blog"},{"content":" Why Rust for Me # I\u0026rsquo;ve been programming in Python for quite a few years. It is a great language for getting things done. There are so many modules and batteries included. You can do most things by selecting the right package. However, no one will tell you that it is fast. Unless you are talking about the speed to write code.\nI started looking at new languages to learn as a way of growing as a programmer. I began looking at both Go and Rust. In some ways these don\u0026rsquo;t compete at all and in other ways they directly compete. Both are C-like in syntax with braces. Rust is lower level and more complex.\nGo is a language that is meant to be easy to write and quick to code, but yield a much higher performance than Python. This was Google\u0026rsquo;s answer to better performance code from from fairly new programmers who are less experienced. In 2007, the bulk of Google code was C++, Java, and Python. As multiple processors come into play, Python\u0026rsquo;s GIL starts to have issues, as well as a performance disadvantage compared to C++ and Java. Java is very verbose and much more effort to write than a Python. C++ allows you to entirely crash systems or open security holes with poor code.\nGo wanted to get close to C++ speeds, with Python ease of programming. I think they largely succeeded with this. A goal was also to drastically reduce compile times. In fact, 45 minute compile times give you space to think about things like creating a new programming language. Or so the story goes about the history of Go.\nGo was not a language to break new ground in programming language design. It is all about making programmers more efficient and large systems work better together. This is done by having the language fairly small so you can have it in your mind at one time. This also helps with compilation speed. For Google and many others, this was a success.\nI starting solving problems on exercism.io in Python, then Go and Rust. I found that I enjoyed Rust better. It was harder to get a Rust program written, because I had to really think about what I was doing. But once it compiled, I was fairly sure it would work and the implementation was elegant. It did not have the runtime failures that are encountered in Python and Go. The other thing I was a real fan of is that much of Rust is written in Rust. There are only a few \u0026ldquo;blessed\u0026rdquo; types that you could not write in the language yourself. Go has many blessed types that are not creatable with standard data structures.\nIn general, when I see how something works in Rust, it makes sense from an elegant programming style. Things like the Option or Result types, which we will discuss later. Go almost gets there with the dual return for value and error. However, by allowing nil (like Python\u0026rsquo;s None) in the language, we keep open a range of errors where the programmer must explicitly check for value before using it. The iterators and general feel of how things are done in Rust resemble Python structure somewhat. It feels a little like home. Just an oddly looking and often complaining home.\nRust compiles slowly. This is a known issue and steps are being taken to improve. It will never be as fast as Go, as it is a much more complex language. However, the analysis and checks involved are like a more experienced programmer telling you what you did wrong (with usually excellent suggestions for improvement.) Rust\u0026rsquo;s idea of ownership and borrowing eliminates the need for garbage collection. This makes almost everything zero cost at runtime and easily multi-threaded.\nThe most important in my mind is that Rust provides guaranteed memory safety. This is as important for not crashing as it is for not leaking secure information due to a bug. There may be programmers that can write as secure code as Rust in C or C++, but the number is very small. Most C and C++ programmers spend not a small amount of time fixing bugs that Rust won\u0026rsquo;t even allow to exist. So some pain to get to these points is worthwhile in my mind.\nI know I would be much faster writing code in Go than Rust, at least to start out. However, my goal is to grow. Thus, my path switched to Rust. This will be a sequence of posts comparing and contrasting Rust from the view of a primarily Python programmer. Hopefully, it will help Python programmers try out Rust and go through the thought growth caused by the mental gymnastics required. I am also excited to get into some low level embedded use eventually and Python to Rust integration. I think Rust is a great language to mesh with Python, for faster implementations when needed, but without the dangers of C for the inexperienced.\nCommunity # One thing that Rust and Python share is a great community. I have been impressed with the attitude in general of letting Rust stand on its own merits and not allow disparaging of any other language choice. Also, many are very helpful with getting past the learning humps that everyone has to get past to become productive in Rust.\nThere is an established Code of Conduct for interaction on the Rust User forums and also enforced in the Rust subreddit. This is needed. Open Source Software suffers highly from pompous kings of their mountain. Some of it is understandable when they have decades of experience in software or Linux and repeatedly getting newbie questions. However, there is a difference between telling people to go to a certain site and learn, vs posting on Twitter with the \u0026ldquo;stupid pull request of the day\u0026rdquo;. You can educate or push off without belittling (and most likely eliminating that person from contributing in the future.)\nI\u0026rsquo;ve been using GitHub for years. But it was mostly solo or small team work without some of the branching and rebasing and all of that. When I started helping contribute some exercises for exercism.io in Rust, Peter Tseng was very helpful in just a little tutoring in Git commands for things I had not done. I learned more to make better pull requests for them and felt good about contributing to open source.\nRust gets many things right and Community is one of them. Conversation is respectful and disputes are resolved quickly, as most know if it usually a misunderstanding, rather than a true malevolence.\nCargo # It is easy for me to say that if Cargo is not the best package manager out there, it is tied for the best. Other than the slight issue currently of name squatting, everything handling Rust dependencies works great.\nPython has the idea of virtual environments and docker instances to deal with versioning issues of dependencies and the Python interpreter. This is completely handled in cargo, by just listing dependencies in a file. You will generally specify major and minor versions, but not patch number. Cargo.lock will store the exact versions you used to build the binary (library or executable). This is great if you find a breaking change in one of your dependencies.\nWe will talk more about cargo and uses as I get into actually running code. If you want to look at the crates available (the Rust term for a package), just browse through crates.io, which is the equivalent of Python\u0026rsquo;s Package Index.\nGetting Started # The first difference you will see as a Python programmer is the C-style syntax. There are many curly braces. This allows closures, chaining and anonymous functions that would become tedious in an indention based language like Python. And yes, there are semicolons again. I find myself deleting semicolons at the end of my Python code and forgetting them at the end of Rust code.\nThis is already a lengthy post, so I will just finish up with a brief look at an slightly advanced \u0026lsquo;hello_world\u0026rsquo;. This will show a little how Rust and Python feel similar and are different.\nThe following is Python code (obviously Python 3, I don\u0026rsquo;t use legacy Python unless I have to) that will set val to 0, 1, 2 and 3, as it consumes the iterator generated by range. For each of these, we are formatting a string value to print and inserting the number into it.\nfor val in range(4): print(\u0026#34;val is {}\u0026#34;.format(val)) This is the equivalent Rust code. Instead of def we use fn for the function definition. Our colon becomes braces for both the function and for loop. Our range iterator is created with 0..4 that is similar to Python\u0026rsquo;s list addressing in syntax. This will yield the same 0, 1, 2 and 3.\nThe exclamation point at the end of println! indicates that this is a macro. Rust uses macros to provide more advanced functionality not baked into the Rust language itself. In this instance it allows the compiler to validate issues with formatting instead of a runtime panic.\nfn main() { for val in 0..4 { println!(\u0026#34;val is {}\u0026#34;, val); } } We do not need the call to main, because every executable Rust project must have a main() function as the point of entry into running code. If this were a library, there would be no required start point, as it only executes when you call in.\nIDE # I use PyCharm for Python and started with that for Rust. The Rust plugin has updates almost weekly, it seems. I heard about the Rust Language Server (RLS) and decided to try that in VS Code. I used it for a few weeks and it was better. However, I didn\u0026rsquo;t realize that the Rust plugin had improved so much in that time as well. I\u0026rsquo;m now back using Rust in PyCharm. (This plugin works on any IntelliJ based IDE.)\nI should also mention that I do most of my Python and Rust on Windows. A large part of my day job involves expensive software that is only available on Windows. For the most part, Python has been a first class citizen on Windows and Rust works just as well. It looks like we are currently on the edge of debugging on Windows. As I learn how to do that, I will post about it.\nFollow along # If you wish to follow along in code, as I compare and contrast Python and Rust, you may want to install Rust. Once installed, updating to new versions is done with the rustup tool itself.\nYou also have the option of using the web based Rust Playground for running code on any system with a browser. You can also create a Gist from here and get a link back to the playground with the gist. This is a common way to ask for help with a given section of code, as it makes a runnable environment for those trying to help with no work on their part.\nIn addition to what I\u0026rsquo;m typing here, there are many great (much better than mine) learning resources for Rust. The Rust Book has both the 1st edition and in progress 2nd edition of the text. I also learned via Rust by Example.\n","date":"22 August 2017","externalUrl":null,"permalink":"/blog/2017/08/22/ptr-beginning/","section":"Blogs","summary":"","title":"Python to Rust: Beginning","type":"blog"},{"content":"","date":"21 August 2017","externalUrl":null,"permalink":"/categories/personal/","section":"Categories","summary":"","title":"Personal","type":"categories"},{"content":" I had been planning on driving down to see the eclipse for a few months. My wife\u0026rsquo;s aunt lives directly in the totality region. We were unsure until the last day if we could make the trip, but headed down on Sunday.\nWe were able to visit and have a nice slow Monday morning, before the big show. I didn\u0026rsquo;t bring a tripod or anything, as I wasn\u0026rsquo;t planning on shooting the eclipse at all. However, I decided to make a poor man\u0026rsquo;s camera filter for my Fuji 55-200mm lens, out of a spare pair of $1 eclipse glasses. My sun visible photographs were not great, because I had a slight light leak. They might be decent enough for a time lapse, but I\u0026rsquo;m not sure it is worth the work.\nDisassembly of eclipse glasses\nAll the parts of building a cheap filter.\nFilter taped to front of sun shade.\nAs we started the eclipse around 11:50 AM, the sun had finally heated the ground enough to cause thermals and make cumulus clouds. These occasionally drifted by, obscuring the sun. As the sun reached about 50% obscured by area, the cloud formation completely ceased. A few more minutes and the clouds were almost all dissipated.\nI had hoped to feel a more dramatic temperature swing, but the humidity in the air held the previously supplied heat tightly. The light started to turn towards a pre-sunset coloring, with midday shadows. Our eyes continued to adjust to the fading light and the light drop wasn\u0026rsquo;t really noticeable until 98-99% coverage.\nAs totality started, the character of the light and the brightness dropped to a 15 minutes after sunset level. All around us, there was a post sunset looking orange and pink glow. The totality width was around 70 miles, so at the center of the totality, the earth was lit only 35 miles away from us. Watching the corona and then noticing stars right next to the sun was incredible.\nThe corona of the burning gases leaving the sun.\nStreet lights turned on by sensors, as if night was falling.\nThe diamond ring effect of the sun just coming out of totality.\nI have not yet seen a photo or video that captures the look with the naked eye of the corona during totality. I hope someone captured one this time, with the video capability available now. It is really something to behold.\nWe did not head for home immediately after the eclipse. Both of us assumed that if we waited a few hours, it wouldn\u0026rsquo;t be too bad. Initially, Google Maps told us that we would be almost 3 hours, about 20 minutes longer than it should. However, as we progressed, we would drive a few minutes and our ETA would be a few minutes later. We started to wonder if everyone had the same idea as we did, to let the traffic die down.\nI joked with Amy that every fast food place is going to run out of food. When we pulled off to get a bite at Cave City, this turned out to be more true than I would have thought.\nExample of shot with my $1 filter.\nWe used all the capabilities of our smart phones. I was running Waze and Google Maps and surprised by Waze\u0026rsquo;s better predictions, thanks to real time feedback from people, instead of algorithms on car movement. At first, our route was mostly US-31, when it wasn\u0026rsquo;t I-65. Each time we can into view of I-65, we were at least doubling their speed. It was like solving a puzzle with a partner and quickly gathering as much data as possible before we had to make the next routing decision.\nWe seemed to keep ahead of the majority of the crowd, by choosing stranger and stranger paths. We passed the most tightly packed truck stop I have ever seen at SR-222 and I-65. This was just before we turned around and made a weird detour through a warehouse area and business park. This took us away from the I-65 and US-31, which became parking lots just south of Elizabethtown.\nIt was easy to see those using cell based data to make navigation choices and those just bumper to bumpering it on I-65 or US-31. I\u0026rsquo;ll take the same time driving further, if I can keep moving at 30 mph or better. It is less annoying than stop and go. We made it all the way over through Fort Know area and West Point. I-65 was a mess almost to the river, so we skipped jumping over to it on Gene Snyder and just took a drive through Iroquios area and across the 2nd St. Bridge.\nWe had just over 4 hours of moving travel time. Normally this would have been around 2.5 hours. If we had stayed on I-65, I guess it would have been closer to 6 hours. Getting to bed just before 1 AM, instead of 3 AM was nice, as I needed to be up at 5:30 AM for work.\nI wonder if there was any captured traffic number stats. I am curious how many people packed into the totality region. The eclipse was cool enough to make the effort driving down and back up worth it.\n","date":"21 August 2017","externalUrl":null,"permalink":"/blog/2017/08/21/solar-eclipse-2017/","section":"Blogs","summary":"","title":"Solar Eclipse 2017","type":"blog"},{"content":"Hugo\u0026rsquo;s watching web server is great for creating pages. Tweak a little and see the browser refresh. (Unless you break things and then it is still just a manual browser refresh away from back to the good state, once your page is unbroken.)\nAs I was developing local pages, I happened to have my realtime Google Anaytics open. I noticed I was hitting it. When I look back at yesterday\u0026rsquo;s stats, I have 124 visits to a page I was working on, but hadn\u0026rsquo;t published yet. That isn\u0026rsquo;t good.\nI would have assumed that it would be disabled if running locally. So I started searching around for the code that inserts the script, so I could disable similar to how Disqus is disabled locally. However, I couldn\u0026rsquo;t find this script anywhere.\nAfter some web searching, it turns out that this is in an internal template, compiled with hugo. I didn\u0026rsquo;t know that was a thing. Something to look out for when researching other template changes.\nTo find where this exists in your theme, look for {{ template \u0026quot;_internal/google_analytics.html\u0026quot; . }}. In the theme I am modifying for this site, it exists in partials/scripts.html. I\u0026rsquo;m not sure if this is common or not.\nI created a new file named partials/google_analytics.html with the following code:\n\u0026lt;!-- GOOGLE ANALYTICS --\u0026gt; \u0026lt;!-- Disabled when running locally --\u0026gt; {{ if not .Site.BuildDrafts }} {{ if .Site.GoogleAnalytics }} \u0026lt;script\u0026gt; (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', '{{ .Site.GoogleAnalytics }}', 'auto'); ga('send', 'pageview'); \u0026lt;/script\u0026gt; {{ end }} {{ end }} Then I replaced {{ template \u0026quot;_internal/google_analytics.html\u0026quot; . }} with {{ partial \u0026quot;google_analytics.html\u0026quot; . }}.\nNow running locally with the -D flag, the Google Analytics does not load and polute my real statistics. I typically run hugo -wD server in development.\n","date":"3 August 2017","externalUrl":null,"permalink":"/blog/2017/08/03/disable-google-analytics-for-local-hugo/","section":"Blogs","summary":"","title":"Disabling Analytics for Local Hugo","type":"blog"},{"content":"","date":"3 August 2017","externalUrl":null,"permalink":"/tags/google/","section":"Tags","summary":"","title":"Google","type":"tags"},{"content":"Note: This is the first method I used to create a series with Hugo. Later in the Hugo series, I changed to using taxonomies, which is a better way of accomplishing this. This post is left up for reference.\nGoal # In converting my Pelican blog over to Hugo, I needed to learn a new templating system. I miss a few things that Pelican did, like categories based on folders and not front matter. However, I can see advantages of allowing more organization in these folders, without affecting final position on the web.\nOne glaring miss was the idea of series links. I have been trying to add photos and complete conversion of my travel journal into posts for my Trans-Am bicycle trip in 2002. I wanted the bottom of the entry to allow the reader to jump to the next post.\nMy goal was to have something like this at the bottom of any series page:\nPart [Current Page Num] of [Total Series Page Count] in the [Series Name] series. \u0026lt; Series Start \u0026gt; | \u0026lt; [Previous Page Title] | [Next Page Title] \u0026gt; I would like \u0026lt; Series Start \u0026gt;, Previous Page Title, Next Page Title, and Series Name have hyperlinks to the relevant pages. I was able to accomplish all but the last. I\u0026rsquo;m not sure if I want to map the Series Name to category or make a page that lists all posts of a series.\nFor my Trans-Am, this would render like:\nPart 6 of 19 in the Trans-Am series. \u0026lt; Series Start \u0026gt; | \u0026lt; Day 2 - Sherwood Forest Plantation | Day 4 - Ashland to Lake Anna, VA \u0026gt; Implementation # The template I came up with seems very inefficient. Once I get more familiar with go templating, there may be a cleaner way of accomplishing this. If you have improvements, I\u0026rsquo;d really like to hear about them.\nThe first thing I need to do is detect if the page is part of a series and the name of that series. I\u0026rsquo;m printing this value out, so I need to make this to be ready to print. I\u0026rsquo;m using a series page variable in the front matter for this.\n+++ series = \u0026quot;Trans-Am\u0026quot; +++ In addition to this, I will be sorting based on date for page position in series. date is already a defined variable, so that is handled. I\u0026rsquo;m adding this functionality as part of my theme, in a new file: layouts/partials/series_link.html. I added a call to this in layouts/_default/single.html just below {{ .Content }} like the following:\n\u0026lt;div id=\u0026quot;post-content\u0026quot;\u0026gt; {{ .Content }} {{ partial \u0026quot;series_link.html\u0026quot; . }} \u0026lt;/div\u0026gt; This will put it directly after the main page content.\nseries_link.html # Complete source, which I will discuss in parts below:\n{{ if .Params.series }} {{ $.Scratch.Add \u0026quot;cur_page_num\u0026quot; 1 }} {{ $.Scratch.Add \u0026quot;total_page_num\u0026quot; 0 }} {{ range where .Site.RegularPages.ByDate \u0026quot;Params.series\u0026quot; .Params.series }} {{ $.Scratch.Add \u0026quot;total_page_num\u0026quot; 1 }} {{ if gt $.Date.Unix .Date.Unix }} {{ $.Scratch.Add \u0026quot;cur_page_num\u0026quot; 1 }} {{ $.Scratch.Set \u0026quot;prev_link\u0026quot; .Permalink }} {{ $.Scratch.Set \u0026quot;prev_title\u0026quot; .Title }} {{ end }} {{ end }} {{ range where .Site.RegularPages.ByDate.Reverse \u0026quot;Params.series\u0026quot; .Params.series }} {{ $.Scratch.Set \u0026quot;first_link\u0026quot; .Permalink }} {{ if lt $.Date.Unix .Date.Unix }} {{ $.Scratch.Set \u0026quot;next_link\u0026quot; .Permalink }} {{ $.Scratch.Set \u0026quot;next_title\u0026quot; .Title }} {{ end }} {{ end }} {{ if or ($.Scratch.Get \u0026quot;next_link\u0026quot;) ($.Scratch.Get \u0026quot;prev_link\u0026quot;) }} \u0026lt;hr/\u0026gt; \u0026lt;p\u0026gt;Part {{ $.Scratch.Get \u0026quot;cur_page_num\u0026quot; }} of {{ $.Scratch.Get \u0026quot;total_page_num\u0026quot; }} in the \u0026lt;b\u0026gt;{{ .Params.series }}\u0026lt;/b\u0026gt; series.\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt; {{ if $.Scratch.Get \u0026quot;prev_link\u0026quot; }} {{ if ne ($.Scratch.Get \u0026quot;prev_link\u0026quot;) ($.Scratch.Get \u0026quot;first_link\u0026quot;) }} \u0026lt;a href=\u0026quot;{{ $.Scratch.Get \u0026quot;first_link\u0026quot; }}\u0026quot;\u0026gt;\u0026lt;i class=\u0026quot;fa fa-angle-left\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;Series Start\u0026lt;i class=\u0026quot;fa fa-angle-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/a\u0026gt; | {{ end }} {{ if $.Scratch.Get \u0026quot;prev_link\u0026quot; }} \u0026lt;a href=\u0026quot;{{ $.Scratch.Get \u0026quot;prev_link\u0026quot; }}\u0026quot;\u0026gt;\u0026lt;i class=\u0026quot;fa fa-angle-double-left\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;{{ $.Scratch.Get \u0026quot;prev_title\u0026quot; }}\u0026lt;/a\u0026gt; {{ end }} {{ end }} {{ if and ($.Scratch.Get \u0026quot;next_link\u0026quot;) ($.Scratch.Get \u0026quot;prev_link\u0026quot;) }} | {{ end }} {{ if $.Scratch.Get \u0026quot;next_link\u0026quot; }} \u0026lt;a href=\u0026quot;{{ $.Scratch.Get \u0026quot;next_link\u0026quot; }}\u0026quot;\u0026gt;{{ $.Scratch.Get \u0026quot;next_title\u0026quot; }}\u0026lt;i class=\u0026quot;fa fa-angle-double-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt; {{ end }} {{ end }} {{ end }} Enabling # The outer if only allows this to run if series exists on a page:\n{{ if .Params.series }} ... {{ end }} Getting Data # Next I am defining page variables to hold the current page number of the series and the total pages in the series.\n{{ $.Scratch.Add \u0026quot;cur_page_num\u0026quot; 1 }} {{ $.Scratch.Add \u0026quot;total_page_num\u0026quot; 0 }} Here we are looping through pages by date (old to new), where the page\u0026rsquo;s series is the same as the current page\u0026rsquo;s series. total_page_num is incremented each loop, yielding a count of all pages that are in the series.\nOur if is true when the current page date is greater than the looping page. This will apply to all pages previous to the current page. So incrementing cur_page_num from 0 would make it the number of the previous page. This is why it is initialized to 1 above. I\u0026rsquo;m also saving the link and title of the page. This is set each page, but will last be set when it reaches the previous page, after which the if will be in a false state.\n{{ range where .Site.RegularPages.ByDate \u0026quot;Params.series\u0026quot; .Params.series }} {{ $.Scratch.Add \u0026quot;total_page_num\u0026quot; 1 }} {{ if gt $.Date.Unix .Date.Unix }} {{ $.Scratch.Add \u0026quot;cur_page_num\u0026quot; 1 }} {{ $.Scratch.Set \u0026quot;prev_link\u0026quot; .Permalink }} {{ $.Scratch.Set \u0026quot;prev_title\u0026quot; .Title }} {{ end }} {{ end }} The next loop is backwards, due to the .Reverse, so it gives pages by date (new to old). I\u0026rsquo;m setting first_link each time, so it will be the first in the series when complete.\nIf the current page is less than the page in the loop (meaning it is older), we set the link and title for the next page. This will end up with the page directly next of the current one, then the if is not true for the rest of the loop.\n{{ range where .Site.RegularPages.ByDate.Reverse \u0026quot;Params.series\u0026quot; .Params.series }} {{ $.Scratch.Set \u0026quot;first_link\u0026quot; .Permalink }} {{ if lt $.Date.Unix .Date.Unix }} {{ $.Scratch.Set \u0026quot;next_link\u0026quot; .Permalink }} {{ $.Scratch.Set \u0026quot;next_title\u0026quot; .Title }} {{ end }} {{ end }} Generating Display # Now we have all the data we need and we just have to display it on the rendering page.\nI don\u0026rsquo;t want to display anything if there is only one member of the series. So we have a wrapper if to require either a next or a previous link.\n{{ if or ($.Scratch.Get \u0026quot;next_link\u0026quot;) ($.Scratch.Get \u0026quot;prev_link\u0026quot;) }} ... {{ end }} I printing an \u0026lt;hr/\u0026gt; to seperate this a little from the bottom of the page. Next, I print the Part x of y in the [SeriesName] series. Since I\u0026rsquo;m just printing the .Params.series variable directly, it must be display ready as I mentioned above.\n\u0026lt;hr/\u0026gt; \u0026lt;p\u0026gt;Part {{ $.Scratch.Get \u0026quot;cur_page_num\u0026quot; }} of {{ $.Scratch.Get \u0026quot;total_page_num\u0026quot; }} in the \u0026lt;b\u0026gt;{{ .Params.series }}\u0026lt;/b\u0026gt; series.\u0026lt;/p\u0026gt; We only want to print a \u0026lt; Series Start \u0026gt; and/or \u0026lt; [Previous Title], if there is a previous link. So the outer if checks this.\nI want to display the previous title instead of just \u0026lt; Series Start \u0026gt; if they are the same thing. So I\u0026rsquo;m only showing the start link if prev_link and first_link are not equal (ne). Since if they are not equal, I know both exist, I include the | delimiter inside that if.\nThe second if just displays the previous link if it exists.\nSo for the first page in the series, this section is skipped with no prev_link set. For the second page in the series: prev_link == first_link, so the \u0026lt; Series Start \u0026gt; isn\u0026rsquo;t printed and we get a prev_title text link to the first page. For third and subsequent pages, we will get both of these links.\n{{ if $.Scratch.Get \u0026quot;prev_link\u0026quot; }} {{ if ne ($.Scratch.Get \u0026quot;prev_link\u0026quot;) ($.Scratch.Get \u0026quot;first_link\u0026quot;) }} \u0026lt;a href=\u0026quot;{{ $.Scratch.Get \u0026quot;first_link\u0026quot; }}\u0026quot;\u0026gt;\u0026lt;i class=\u0026quot;fa fa-angle-left\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;Series Start\u0026lt;i class=\u0026quot;fa fa-angle-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/a\u0026gt; | {{ end }} {{ if $.Scratch.Get \u0026quot;prev_link\u0026quot; }} \u0026lt;a href=\u0026quot;{{ $.Scratch.Get \u0026quot;prev_link\u0026quot; }}\u0026quot;\u0026gt;\u0026lt;i class=\u0026quot;fa fa-angle-double-left\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;{{ $.Scratch.Get \u0026quot;prev_title\u0026quot; }}\u0026lt;/a\u0026gt; {{ end }} {{ end }} This section prints the delimiting | between next_link and prev_link, only if both exist.\n{{ if and ($.Scratch.Get \u0026quot;next_link\u0026quot;) ($.Scratch.Get \u0026quot;prev_link\u0026quot;) }} {{ end }} The last section just prints the link to the next page, if next_link exists.\n{{ if $.Scratch.Get \u0026quot;next_link\u0026quot; }} \u0026lt;a href=\u0026quot;{{ $.Scratch.Get \u0026quot;next_link\u0026quot; }}\u0026quot;\u0026gt;{{ $.Scratch.Get \u0026quot;next_title\u0026quot; }}\u0026lt;i class=\u0026quot;fa fa-angle-double-right\u0026quot;\u0026gt;\u0026lt;/i\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt; {{ end }} That completes the template.\nYou can see this on any one of my Trans-Am pages, at the bottom of the page.\n","date":"3 August 2017","externalUrl":null,"permalink":"/blog/2017/08/03/implementing-series-in-hugo/","section":"Blogs","summary":"","title":"Implementing a Series in Hugo","type":"blog"},{"content":"I\u0026rsquo;ve used Python as my main programming language for a few years. When my Word Press was hacked and defaced yet again, I finally decided to rebuild my website with a static generator and host on GitHub. I leaned towards Pelican, due to the Python base that I thought I could modify if I needed. And I hoped that I could get it to work easily.\nI did get everything converted over to .rst format and rendering. I didn\u0026rsquo;t really like the template that I was able to get working, but the site was back up. I even created new content. Then I switched my main computers and had trouble getting Pelican to work again. For some things, Windows Python is a pain. I was able to get it rendering for some new content ealry this year, but it really was not a great experience and render times continue to climb.\nOver vacation, I looked at Go and Rust. These are often talked about like they are competing languages, but they really have mostly different domains. I think I would be more productive with Go, but it would not help me grow as a programmer. I also was a little annoyed that there were many blessed data types, that do things you are not allowed to do with the language. Rust has much less of this, as most of the language is implemented IN the language. However, it has an undeniably more difficult learning curve.\nWhen looking at static generators in both languages, I found immature ones in Rust and a mature and polished hugo. This is written in Go, but it really doesn\u0026rsquo;t matter as it is installed with a compiled binary. And it renders fast.\nIt took me a few days to get up to speed in Hugo and with Go Templates. Then I converted my .rst files to .md files and changed the front matter. With it not being as flexible in url pathing, I was happy to see alias, which are easy redirects for content. I can point my old category paths to current date paths with no loss of search engine results.\nThere are still a few warts, like the crazy ton of empty lines when you process a template. This is apparently going away with Go 1.6 that will be used for compiling the next version.\nNote: I later learned that the secret to eliminating all the rendering new lines is in the template coding. The changing of tags from {{ to {{- will eliminate the white space between the opening and closing tags. When I was looping through pages to build series, this was resulting in many spaces and newlines. That has been cleaned up and taken care of with the next generation of the site.\n","date":"1 August 2017","externalUrl":null,"permalink":"/blog/2017/08/01/pelican-to-hugo/","section":"Blogs","summary":"","title":"Moved from Pelican to Hugo","type":"blog"},{"content":"","date":"24 June 2017","externalUrl":null,"permalink":"/series/python-tips/","section":"Series","summary":"","title":"Python Tips","type":"series"},{"content":"You may have seen if __name__ == '__main__': at the bottom of a script. Why is this there and what does it mean?\nFirst, a python file is a module. They can be combined into a directory module and this is what is being done when you see an __init__.py file in the folder.\nWe will get there in a little while, but first we will cover a little more than just __name__. We have used dir() before, but how do you do this on the current script? To be honest, I\u0026rsquo;m not exactly sure. However, it is fairly simple to do this with an imported script, so lets start there. I\u0026rsquo;ll import the file I created when writing the decorators articles.\nimport decorators print(dir(decorators)) [\u0026#39;__builtins__\u0026#39;, \u0026#39;__cached__\u0026#39;, \u0026#39;__doc__\u0026#39;, \u0026#39;__file__\u0026#39;, \u0026#39;__loader__\u0026#39;, \u0026#39;__name__\u0026#39;, \u0026#39;__package__\u0026#39;, \u0026#39;__spec__\u0026#39;, \u0026#39;add_sugar\u0026#39;, \u0026#39;first\u0026#39;, \u0026#39;hold_function\u0026#39;, \u0026#39;my_decorator\u0026#39;, \u0026#39;my_func\u0026#39;, \u0026#39;my_function\u0026#39;, \u0026#39;outer\u0026#39;, \u0026#39;return_function\u0026#39;] All of the non-dunder output of dir are functions I wrote in the file. The others are generated by Python. Lets use them to look at values of current script and imported script.\nI joined these into a dictionary to cover both local script and imported script. I did not use an OrderedDict to keep these in order, because current implementation of the Python dict in CPython is actually an ordered dict, due to some optimizations that occurred recently. I\u0026rsquo;ll talk about this in a dictionary post in the future.\nWe will discuss each of these dunders and look at the differences between the local and imported script. I should also note that some of these are dependent on the specific implementation of Python.\nbuiltins # The local version luckily didn\u0026rsquo;t expand the module for us.\n__builtins__ \u0026lt;module \u0026#39;builtins\u0026#39; (built-in)\u0026gt; This is good, because the imported script gave enough for both of them:\nd.__builtins__ {\u0026#39;__name__\u0026#39;: \u0026#39;builtins\u0026#39;, \u0026#39;__doc__\u0026#39;: \u0026#34;Built-in functions, exceptions, and other objects.\\n\\nNoteworthy: None is the `nil\u0026#39; object; Ellipsis represents `...\u0026#39; in slices.\u0026#34;, \u0026#39;__package__\u0026#39;: \u0026#39;\u0026#39;, \u0026#39;__loader__\u0026#39;: \u0026lt;class \u0026#39;_frozen_importlib.BuiltinImporter\u0026#39;\u0026gt;, \u0026#39;__spec__\u0026#39;: ModuleSpec(name=\u0026#39;builtins\u0026#39;, loader=\u0026lt;class \u0026#39;_frozen_importlib.BuiltinImporter\u0026#39;\u0026gt;), \u0026#39;__build_class__\u0026#39;: \u0026lt;built-in function __build_class__\u0026gt;, \u0026#39;__import__\u0026#39;: \u0026lt;built-in function __import__\u0026gt;, \u0026#39;abs\u0026#39;: \u0026lt;built-in function abs\u0026gt;, \u0026#39;all\u0026#39;: \u0026lt;built-in function all\u0026gt;, \u0026#39;any\u0026#39;: \u0026lt;built-in function any\u0026gt;, \u0026#39;ascii\u0026#39;: \u0026lt;built-in function ascii\u0026gt;, \u0026#39;bin\u0026#39;: \u0026lt;built-in function bin\u0026gt;, \u0026#39;callable\u0026#39;: \u0026lt;built-in function callable\u0026gt;, \u0026#39;chr\u0026#39;: \u0026lt;built-in function chr\u0026gt;, \u0026#39;compile\u0026#39;: \u0026lt;built-in function compile\u0026gt;, \u0026#39;delattr\u0026#39;: \u0026lt;built-in function delattr\u0026gt;, \u0026#39;dir\u0026#39;: \u0026lt;built-in function dir\u0026gt;, \u0026#39;divmod\u0026#39;: \u0026lt;built-in function divmod\u0026gt;, \u0026#39;eval\u0026#39;: \u0026lt;built-in function eval\u0026gt;, \u0026#39;exec\u0026#39;: \u0026lt;built-in function exec\u0026gt;, \u0026#39;format\u0026#39;: \u0026lt;built-in function format\u0026gt;, \u0026#39;getattr\u0026#39;: \u0026lt;built-in function getattr\u0026gt;, \u0026#39;globals\u0026#39;: \u0026lt;built-in function globals\u0026gt;, \u0026#39;hasattr\u0026#39;: \u0026lt;built-in function hasattr\u0026gt;, \u0026#39;hash\u0026#39;: \u0026lt;built-in function hash\u0026gt;, \u0026#39;hex\u0026#39;: \u0026lt;built-in function hex\u0026gt;, \u0026#39;id\u0026#39;: \u0026lt;built-in function id\u0026gt;, \u0026#39;input\u0026#39;: \u0026lt;built-in function input\u0026gt;, \u0026#39;isinstance\u0026#39;: \u0026lt;built-in function isinstance\u0026gt;, \u0026#39;issubclass\u0026#39;: \u0026lt;built-in function issubclass\u0026gt;, \u0026#39;iter\u0026#39;: \u0026lt;built-in function iter\u0026gt;, \u0026#39;len\u0026#39;: \u0026lt;built-in function len\u0026gt;, \u0026#39;locals\u0026#39;: \u0026lt;built-in function locals\u0026gt;, \u0026#39;max\u0026#39;: \u0026lt;built-in function max\u0026gt;, \u0026#39;min\u0026#39;: \u0026lt;built-in function min\u0026gt;, \u0026#39;next\u0026#39;: \u0026lt;built-in function next\u0026gt;, \u0026#39;oct\u0026#39;: \u0026lt;built-in function oct\u0026gt;, \u0026#39;ord\u0026#39;: \u0026lt;built-in function ord\u0026gt;, \u0026#39;pow\u0026#39;: \u0026lt;built-in function pow\u0026gt;, \u0026#39;print\u0026#39;: \u0026lt;built-in function print\u0026gt;, \u0026#39;repr\u0026#39;: \u0026lt;built-in function repr\u0026gt;, \u0026#39;round\u0026#39;: \u0026lt;built-in function round\u0026gt;, \u0026#39;setattr\u0026#39;: \u0026lt;built-in function setattr\u0026gt;, \u0026#39;sorted\u0026#39;: \u0026lt;built-in function sorted\u0026gt;, \u0026#39;sum\u0026#39;: \u0026lt;built-in function sum\u0026gt;, \u0026#39;vars\u0026#39;: \u0026lt;built-in function vars\u0026gt;, \u0026#39;None\u0026#39;: None, \u0026#39;Ellipsis\u0026#39;: Ellipsis, \u0026#39;NotImplemented\u0026#39;: NotImplemented, \u0026#39;False\u0026#39;: False, \u0026#39;True\u0026#39;: True, \u0026#39;bool\u0026#39;: \u0026lt;class \u0026#39;bool\u0026#39;\u0026gt;, \u0026#39;memoryview\u0026#39;: \u0026lt;class \u0026#39;memoryview\u0026#39;\u0026gt;, \u0026#39;bytearray\u0026#39;: \u0026lt;class \u0026#39;bytearray\u0026#39;\u0026gt;, \u0026#39;bytes\u0026#39;: \u0026lt;class \u0026#39;bytes\u0026#39;\u0026gt;, \u0026#39;classmethod\u0026#39;: \u0026lt;class \u0026#39;classmethod\u0026#39;\u0026gt;, \u0026#39;complex\u0026#39;: \u0026lt;class \u0026#39;complex\u0026#39;\u0026gt;, \u0026#39;dict\u0026#39;: \u0026lt;class \u0026#39;dict\u0026#39;\u0026gt;, \u0026#39;enumerate\u0026#39;: \u0026lt;class \u0026#39;enumerate\u0026#39;\u0026gt;, \u0026#39;filter\u0026#39;: \u0026lt;class \u0026#39;filter\u0026#39;\u0026gt;, \u0026#39;float\u0026#39;: \u0026lt;class \u0026#39;float\u0026#39;\u0026gt;, \u0026#39;frozenset\u0026#39;: \u0026lt;class \u0026#39;frozenset\u0026#39;\u0026gt;, \u0026#39;property\u0026#39;: \u0026lt;class \u0026#39;property\u0026#39;\u0026gt;, \u0026#39;int\u0026#39;: \u0026lt;class \u0026#39;int\u0026#39;\u0026gt;, \u0026#39;list\u0026#39;: \u0026lt;class \u0026#39;list\u0026#39;\u0026gt;, \u0026#39;map\u0026#39;: \u0026lt;class \u0026#39;map\u0026#39;\u0026gt;, \u0026#39;object\u0026#39;: \u0026lt;class \u0026#39;object\u0026#39;\u0026gt;, \u0026#39;range\u0026#39;: \u0026lt;class \u0026#39;range\u0026#39;\u0026gt;, \u0026#39;reversed\u0026#39;: \u0026lt;class \u0026#39;reversed\u0026#39;\u0026gt;, \u0026#39;set\u0026#39;: \u0026lt;class \u0026#39;set\u0026#39;\u0026gt;, \u0026#39;slice\u0026#39;: \u0026lt;class \u0026#39;slice\u0026#39;\u0026gt;, \u0026#39;staticmethod\u0026#39;: \u0026lt;class \u0026#39;staticmethod\u0026#39;\u0026gt;, \u0026#39;str\u0026#39;: \u0026lt;class \u0026#39;str\u0026#39;\u0026gt;, \u0026#39;super\u0026#39;: \u0026lt;class \u0026#39;super\u0026#39;\u0026gt;, \u0026#39;tuple\u0026#39;: \u0026lt;class \u0026#39;tuple\u0026#39;\u0026gt;, \u0026#39;type\u0026#39;: \u0026lt;class \u0026#39;type\u0026#39;\u0026gt;, \u0026#39;zip\u0026#39;: \u0026lt;class \u0026#39;zip\u0026#39;\u0026gt;, \u0026#39;__debug__\u0026#39;: True, \u0026#39;BaseException\u0026#39;: \u0026lt;class \u0026#39;BaseException\u0026#39;\u0026gt;, \u0026#39;Exception\u0026#39;: \u0026lt;class \u0026#39;Exception\u0026#39;\u0026gt;, \u0026#39;TypeError\u0026#39;: \u0026lt;class \u0026#39;TypeError\u0026#39;\u0026gt;, \u0026#39;StopAsyncIteration\u0026#39;: \u0026lt;class \u0026#39;StopAsyncIteration\u0026#39;\u0026gt;, \u0026#39;StopIteration\u0026#39;: \u0026lt;class \u0026#39;StopIteration\u0026#39;\u0026gt;, \u0026#39;GeneratorExit\u0026#39;: \u0026lt;class \u0026#39;GeneratorExit\u0026#39;\u0026gt;, \u0026#39;SystemExit\u0026#39;: \u0026lt;class \u0026#39;SystemExit\u0026#39;\u0026gt;, \u0026#39;KeyboardInterrupt\u0026#39;: \u0026lt;class \u0026#39;KeyboardInterrupt\u0026#39;\u0026gt;, \u0026#39;ImportError\u0026#39;: \u0026lt;class \u0026#39;ImportError\u0026#39;\u0026gt;, \u0026#39;ModuleNotFoundError\u0026#39;: \u0026lt;class \u0026#39;ModuleNotFoundError\u0026#39;\u0026gt;, \u0026#39;OSError\u0026#39;: \u0026lt;class \u0026#39;OSError\u0026#39;\u0026gt;, \u0026#39;EnvironmentError\u0026#39;: \u0026lt;class \u0026#39;OSError\u0026#39;\u0026gt;, \u0026#39;IOError\u0026#39;: \u0026lt;class \u0026#39;OSError\u0026#39;\u0026gt;, \u0026#39;WindowsError\u0026#39;: \u0026lt;class \u0026#39;OSError\u0026#39;\u0026gt;, \u0026#39;EOFError\u0026#39;: \u0026lt;class \u0026#39;EOFError\u0026#39;\u0026gt;, \u0026#39;RuntimeError\u0026#39;: \u0026lt;class \u0026#39;RuntimeError\u0026#39;\u0026gt;, \u0026#39;RecursionError\u0026#39;: \u0026lt;class \u0026#39;RecursionError\u0026#39;\u0026gt;, \u0026#39;NotImplementedError\u0026#39;: \u0026lt;class \u0026#39;NotImplementedError\u0026#39;\u0026gt;, \u0026#39;NameError\u0026#39;: \u0026lt;class \u0026#39;NameError\u0026#39;\u0026gt;, \u0026#39;UnboundLocalError\u0026#39;: \u0026lt;class \u0026#39;UnboundLocalError\u0026#39;\u0026gt;, \u0026#39;AttributeError\u0026#39;: \u0026lt;class \u0026#39;AttributeError\u0026#39;\u0026gt;, \u0026#39;SyntaxError\u0026#39;: \u0026lt;class \u0026#39;SyntaxError\u0026#39;\u0026gt;, \u0026#39;IndentationError\u0026#39;: \u0026lt;class \u0026#39;IndentationError\u0026#39;\u0026gt;, \u0026#39;TabError\u0026#39;: \u0026lt;class \u0026#39;TabError\u0026#39;\u0026gt;, \u0026#39;LookupError\u0026#39;: \u0026lt;class \u0026#39;LookupError\u0026#39;\u0026gt;, \u0026#39;IndexError\u0026#39;: \u0026lt;class \u0026#39;IndexError\u0026#39;\u0026gt;, \u0026#39;KeyError\u0026#39;: \u0026lt;class \u0026#39;KeyError\u0026#39;\u0026gt;, \u0026#39;ValueError\u0026#39;: \u0026lt;class \u0026#39;ValueError\u0026#39;\u0026gt;, \u0026#39;UnicodeError\u0026#39;: \u0026lt;class \u0026#39;UnicodeError\u0026#39;\u0026gt;, \u0026#39;UnicodeEncodeError\u0026#39;: \u0026lt;class \u0026#39;UnicodeEncodeError\u0026#39;\u0026gt;, \u0026#39;UnicodeDecodeError\u0026#39;: \u0026lt;class \u0026#39;UnicodeDecodeError\u0026#39;\u0026gt;, \u0026#39;UnicodeTranslateError\u0026#39;: \u0026lt;class \u0026#39;UnicodeTranslateError\u0026#39;\u0026gt;, \u0026#39;AssertionError\u0026#39;: \u0026lt;class \u0026#39;AssertionError\u0026#39;\u0026gt;, \u0026#39;ArithmeticError\u0026#39;: \u0026lt;class \u0026#39;ArithmeticError\u0026#39;\u0026gt;, \u0026#39;FloatingPointError\u0026#39;: \u0026lt;class \u0026#39;FloatingPointError\u0026#39;\u0026gt;, \u0026#39;OverflowError\u0026#39;: \u0026lt;class \u0026#39;OverflowError\u0026#39;\u0026gt;, \u0026#39;ZeroDivisionError\u0026#39;: \u0026lt;class \u0026#39;ZeroDivisionError\u0026#39;\u0026gt;, \u0026#39;SystemError\u0026#39;: \u0026lt;class \u0026#39;SystemError\u0026#39;\u0026gt;, \u0026#39;ReferenceError\u0026#39;: \u0026lt;class \u0026#39;ReferenceError\u0026#39;\u0026gt;, \u0026#39;BufferError\u0026#39;: \u0026lt;class \u0026#39;BufferError\u0026#39;\u0026gt;, \u0026#39;MemoryError\u0026#39;: \u0026lt;class \u0026#39;MemoryError\u0026#39;\u0026gt;, \u0026#39;Warning\u0026#39;: \u0026lt;class \u0026#39;Warning\u0026#39;\u0026gt;, \u0026#39;UserWarning\u0026#39;: \u0026lt;class \u0026#39;UserWarning\u0026#39;\u0026gt;, \u0026#39;DeprecationWarning\u0026#39;: \u0026lt;class \u0026#39;DeprecationWarning\u0026#39;\u0026gt;, \u0026#39;PendingDeprecationWarning\u0026#39;: \u0026lt;class \u0026#39;PendingDeprecationWarning\u0026#39;\u0026gt;, \u0026#39;SyntaxWarning\u0026#39;: \u0026lt;class \u0026#39;SyntaxWarning\u0026#39;\u0026gt;, \u0026#39;RuntimeWarning\u0026#39;: \u0026lt;class \u0026#39;RuntimeWarning\u0026#39;\u0026gt;, \u0026#39;FutureWarning\u0026#39;: \u0026lt;class \u0026#39;FutureWarning\u0026#39;\u0026gt;, \u0026#39;ImportWarning\u0026#39;: \u0026lt;class \u0026#39;ImportWarning\u0026#39;\u0026gt;, \u0026#39;UnicodeWarning\u0026#39;: \u0026lt;class \u0026#39;UnicodeWarning\u0026#39;\u0026gt;, \u0026#39;BytesWarning\u0026#39;: \u0026lt;class \u0026#39;BytesWarning\u0026#39;\u0026gt;, \u0026#39;ResourceWarning\u0026#39;: \u0026lt;class \u0026#39;ResourceWarning\u0026#39;\u0026gt;, \u0026#39;ConnectionError\u0026#39;: \u0026lt;class \u0026#39;ConnectionError\u0026#39;\u0026gt;, \u0026#39;BlockingIOError\u0026#39;: \u0026lt;class \u0026#39;BlockingIOError\u0026#39;\u0026gt;, \u0026#39;BrokenPipeError\u0026#39;: \u0026lt;class \u0026#39;BrokenPipeError\u0026#39;\u0026gt;, \u0026#39;ChildProcessError\u0026#39;: \u0026lt;class \u0026#39;ChildProcessError\u0026#39;\u0026gt;, \u0026#39;ConnectionAbortedError\u0026#39;: \u0026lt;class \u0026#39;ConnectionAbortedError\u0026#39;\u0026gt;, \u0026#39;ConnectionRefusedError\u0026#39;: \u0026lt;class \u0026#39;ConnectionRefusedError\u0026#39;\u0026gt;, \u0026#39;ConnectionResetError\u0026#39;: \u0026lt;class \u0026#39;ConnectionResetError\u0026#39;\u0026gt;, \u0026#39;FileExistsError\u0026#39;: \u0026lt;class \u0026#39;FileExistsError\u0026#39;\u0026gt;, \u0026#39;FileNotFoundError\u0026#39;: \u0026lt;class \u0026#39;FileNotFoundError\u0026#39;\u0026gt;, \u0026#39;IsADirectoryError\u0026#39;: \u0026lt;class \u0026#39;IsADirectoryError\u0026#39;\u0026gt;, \u0026#39;NotADirectoryError\u0026#39;: \u0026lt;class \u0026#39;NotADirectoryError\u0026#39;\u0026gt;, \u0026#39;InterruptedError\u0026#39;: \u0026lt;class \u0026#39;InterruptedError\u0026#39;\u0026gt;, \u0026#39;PermissionError\u0026#39;: \u0026lt;class \u0026#39;PermissionError\u0026#39;\u0026gt;, \u0026#39;ProcessLookupError\u0026#39;: \u0026lt;class \u0026#39;ProcessLookupError\u0026#39;\u0026gt;, \u0026#39;TimeoutError\u0026#39;: \u0026lt;class \u0026#39;TimeoutError\u0026#39;\u0026gt;, \u0026#39;open\u0026#39;: \u0026lt;built-in function open\u0026gt;, \u0026#39;quit\u0026#39;: Use quit() or Ctrl-Z plus Return to exit, \u0026#39;exit\u0026#39;: Use exit() or Ctrl-Z plus Return to exit, \u0026#39;copyright\u0026#39;: Copyright (c) 2001-2017 Python Software Foundation. All Rights Reserved. Copyright (c) 2000 BeOpen.com. All Rights Reserved. Copyright (c) 1995-2001 Corporation for National Research Initiatives. All Rights Reserved. Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam. All Rights Reserved., \u0026#39;credits\u0026#39;: Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands for supporting Python development. See www.python.org for more information., \u0026#39;license\u0026#39;: Type license() to see the full license text, \u0026#39;help\u0026#39;: Type help() for interactive help, or help(object) for help about object.} Dictionaries are used all over Python and what we see here are all the elements that are built in to Python and can be called directly. This includes functions, exceptions, classes, etc. Take a look through and see False, None, all, any, and even what we used to get this: dir.\nOne thing I didn\u0026rsquo;t expect are the dual strings, like quit or exit. Open up a Python session and type \u0026rsquo;exit\u0026rsquo; and you will receive the text after it. So the same would work with copyright.\nTake a look through the functions and classes. Which ones have you not heard of before? Use your web search and learn about them. (Yes, I just assigned homework. But there will be no test.)\ncached # Here are the results from both local and imported:\n__cached__ None d.__cached__ C:\\Users\\micro\\repositories\\scratchpad\\__pycache__\\decorators.cpython-36.pyc If you look in one of your Python folders, chances are you will see .pyc files. These are compiled python bytecode. This speeds up running by caching this compilation effort. For the imported module we have run before, we have the path to the .pyc file.\ndoc # __doc__ None d.__doc__ None Ok, this is kind of sad. Maybe I should make some module documentation. I\u0026rsquo;ll put this at the top of my local script:\n\u0026#34;\u0026#34;\u0026#34; This is triple quoted documentation, right at the top of the script \u0026#34;\u0026#34;\u0026#34; What happens when we look at __doc__ again?\n__doc__ This is a triple quoted documentation right in the high level of the module d.__doc__ None Viola! (Wait, that is a stringed instrument.)\nVoilà! A module documentation string.\nfile # This gives you the filename of the script the module (or local) is running from. Pretty simple.\n__file__ C:\\Users\\micro\\repositories\\scratchpad\\dunder_name.py d.__file__ C:\\Users\\micro\\repositories\\scratchpad\\decorators.py loader # This stores the object used for loading the source file.\n__loader__ \u0026lt;_frozen_importlib_external.SourceFileLoader object at 0x04EC8370\u0026gt; d.__loader__ \u0026lt;_frozen_importlib_external.SourceFileLoader object at 0x050F26F0\u0026gt; If you want to learn how source files are loaded and parsed, take a look at the import system documentation.\nname # Finally! This is all I wanted to know, Joe. Why did you take so long to get here?\nWell if I just wrote this little section, it would be closer to a tweet than a post. What does __name__ contain?\n__name__ __main__ d__name__ decorators The imported script has the name that we imported decorators. The local script has the name __main__. So when we are checking if __name__ == '__main__': we are seeing if the script is being run by starting this script directly.\nCode can be put in here that will run if the script is run directly, but will not run if it is imported. I used to use this to write simple testing code. However, this ended with writing proper test pre-fixed or post-fixed function names that can be run automatically by pytest (if putting testing code in the same file.)\nThis is still useful for setup objects or other pieces that are needed for a library to be run on its own.\npackage # This is certainly not interesting. We have None for the local package, as we are running the script so it isn\u0026rsquo;t part of a package. The imported single script isn\u0026rsquo;t None but is an empty string.\n__package__ None d.__package__ Lets see what happens when we create a package. I made a joe folder that only contains an empty __init__.py file. This is the simplest package you can create. It is importable and does absolutely nothing. However, when you import it and execute print('j.__package__', joe.__package__), you get the following:\nj.__package__ joe This tells us what the package is named that the code comes from. I\u0026rsquo;m not sure if the value is only None for the local script.\nspec # This is the module specification that is used between the finder and loader when importing and running python modules. This is a combination of some we have seen before. origin is the place where the module is imported. This will be a python file or may be \u0026lsquo;builtin\u0026rsquo; for built in modules.\n__spec__ None d.__spec__ ModuleSpec(name=\u0026#39;decorators\u0026#39;, loader=\u0026lt;_frozen_importlib_external.SourceFileLoader object at 0x050B2730\u0026gt;, origin=\u0026#39;C:\\\\Users\\\\micro\\\\repositories\\\\scratchpad\\\\decorators.py\u0026#39;) Summary # For those of you that just skipped to the end, __name__ == '__main__' is true if the script was run directly. For those that wanted to learn more than just that, hopefully this was interesting.\nI was going to just write a small post on this, but decided to look at everything and even learned a little myself doing so. That is one of my measures for a good day. Until next post.\n","date":"24 June 2017","externalUrl":null,"permalink":"/blog/2017/06/24/dunder-name-main/","section":"Blogs","summary":"","title":"Python: Dunder name","type":"blog"},{"content":"Iterators and Generators are two mechanisms for providing data to cycle through in Python. The difference is if the data is already in memory and we iterate along it, or if we are generating it as we go. The names actually make sense. These turn out to be very similar and just differ in execution. One is better if you already have a class. The other is a little simpler.\nIterators # First we will look at how Python gives an iterator interface to built in objects, such as list and string.\nBoth of the for loops below will print the same thing.\nfor i in [1, 2, 3, 4, 5, 6]: print(i) for c in \u0026#39;123456\u0026#39;: print(c) If we use the dir function to take a look at the list object, we get this:\nl = [1, 2, 3, 4, 5, 6] print(dir(l)) [\u0026#39;__add__\u0026#39;, \u0026#39;__class__\u0026#39;, \u0026#39;__contains__\u0026#39;, \u0026#39;__delattr__\u0026#39;, \u0026#39;__delitem__\u0026#39;, \u0026#39;__dir__\u0026#39;, \u0026#39;__doc__\u0026#39;, \u0026#39;__eq__\u0026#39;, \u0026#39;__format__\u0026#39;, \u0026#39;__ge__\u0026#39;, \u0026#39;__getattribute__\u0026#39;, \u0026#39;__getitem__\u0026#39;, \u0026#39;__gt__\u0026#39;, \u0026#39;__hash__\u0026#39;, \u0026#39;__iadd__\u0026#39;, \u0026#39;__imul__\u0026#39;, \u0026#39;__init__\u0026#39;, \u0026#39;__init_subclass__\u0026#39;, \u0026#39;__iter__\u0026#39;, \u0026#39;__le__\u0026#39;, \u0026#39;__len__\u0026#39;, \u0026#39;__lt__\u0026#39;, \u0026#39;__mul__\u0026#39;, \u0026#39;__ne__\u0026#39;, \u0026#39;__new__\u0026#39;, \u0026#39;__reduce__\u0026#39;, \u0026#39;__reduce_ex__\u0026#39;, \u0026#39;__repr__\u0026#39;, \u0026#39;__reversed__\u0026#39;, \u0026#39;__rmul__\u0026#39;, \u0026#39;__setattr__\u0026#39;, \u0026#39;__setitem__\u0026#39;, \u0026#39;__sizeof__\u0026#39;, \u0026#39;__str__\u0026#39;, \u0026#39;__subclasshook__\u0026#39;, \u0026#39;append\u0026#39;, \u0026#39;clear\u0026#39;, \u0026#39;copy\u0026#39;, \u0026#39;count\u0026#39;, \u0026#39;extend\u0026#39;, \u0026#39;index\u0026#39;, \u0026#39;insert\u0026#39;, \u0026#39;pop\u0026#39;, \u0026#39;remove\u0026#39;, \u0026#39;reverse\u0026#39;, \u0026#39;sort\u0026#39;] If we do the same on the string, we get this:\ns = \u0026#39;123456\u0026#39; print(dir(s)) [\u0026#39;__add__\u0026#39;, \u0026#39;__class__\u0026#39;, \u0026#39;__contains__\u0026#39;, \u0026#39;__delattr__\u0026#39;, \u0026#39;__dir__\u0026#39;, \u0026#39;__doc__\u0026#39;, \u0026#39;__eq__\u0026#39;, \u0026#39;__format__\u0026#39;, \u0026#39;__ge__\u0026#39;, \u0026#39;__getattribute__\u0026#39;, \u0026#39;__getitem__\u0026#39;, \u0026#39;__getnewargs__\u0026#39;, \u0026#39;__gt__\u0026#39;, \u0026#39;__hash__\u0026#39;, \u0026#39;__init__\u0026#39;, \u0026#39;__init_subclass__\u0026#39;, \u0026#39;__iter__\u0026#39;, \u0026#39;__le__\u0026#39;, \u0026#39;__len__\u0026#39;, \u0026#39;__lt__\u0026#39;, \u0026#39;__mod__\u0026#39;, \u0026#39;__mul__\u0026#39;, \u0026#39;__ne__\u0026#39;, \u0026#39;__new__\u0026#39;, \u0026#39;__reduce__\u0026#39;, \u0026#39;__reduce_ex__\u0026#39;, \u0026#39;__repr__\u0026#39;, \u0026#39;__rmod__\u0026#39;, \u0026#39;__rmul__\u0026#39;, \u0026#39;__setattr__\u0026#39;, \u0026#39;__sizeof__\u0026#39;, \u0026#39;__str__\u0026#39;, \u0026#39;__subclasshook__\u0026#39;, \u0026#39;capitalize\u0026#39;, \u0026#39;casefold\u0026#39;, \u0026#39;center\u0026#39;, \u0026#39;count\u0026#39;, \u0026#39;encode\u0026#39;, \u0026#39;endswith\u0026#39;, \u0026#39;expandtabs\u0026#39;, \u0026#39;find\u0026#39;, \u0026#39;format\u0026#39;, \u0026#39;format_map\u0026#39;, \u0026#39;index\u0026#39;, \u0026#39;isalnum\u0026#39;, \u0026#39;isalpha\u0026#39;, \u0026#39;isdecimal\u0026#39;, \u0026#39;isdigit\u0026#39;, \u0026#39;isidentifier\u0026#39;, \u0026#39;islower\u0026#39;, \u0026#39;isnumeric\u0026#39;, \u0026#39;isprintable\u0026#39;, \u0026#39;isspace\u0026#39;, \u0026#39;istitle\u0026#39;, \u0026#39;isupper\u0026#39;, \u0026#39;join\u0026#39;, \u0026#39;ljust\u0026#39;, \u0026#39;lower\u0026#39;, \u0026#39;lstrip\u0026#39;, \u0026#39;maketrans\u0026#39;, \u0026#39;partition\u0026#39;, \u0026#39;replace\u0026#39;, \u0026#39;rfind\u0026#39;, \u0026#39;rindex\u0026#39;, \u0026#39;rjust\u0026#39;, \u0026#39;rpartition\u0026#39;, \u0026#39;rsplit\u0026#39;, \u0026#39;rstrip\u0026#39;, \u0026#39;split\u0026#39;, \u0026#39;splitlines\u0026#39;, \u0026#39;startswith\u0026#39;, \u0026#39;strip\u0026#39;, \u0026#39;swapcase\u0026#39;, \u0026#39;title\u0026#39;, \u0026#39;translate\u0026#39;, \u0026#39;upper\u0026#39;, \u0026#39;zfill\u0026#39;] This is a little more noise than I needed and I could have just explained that __iter__ is the dunder method that gives you an iterator. But I think it is important to show you how to drill down on Python objects with dir if you want to dig deeper and poke around.\nAs I mentioned, both of these share the important methods for iterating: __iter__. This will yield an iterator object. This object will have the dunder method __next__ which gives you values until it runs out.\nIterator Operation # Lets manually iterate and see what happens.\ns = \u0026#39;123\u0026#39; iter_obj = s.__iter__() print(iter_obj.__next__()) print(iter_obj.__next__()) print(iter_obj.__next__()) print(iter_obj.__next__()) 1 2 3 Traceback (most recent call last): File \u0026#34;C:/Users/micro/repositories/scratchpad/iterators-generators.py\u0026#34;, line 15, in \u0026lt;module\u0026gt; print(iter_obj.__next__()) StopIteration Process finished with exit code 1 I only had 3 items in the string to iterate, but called __next__ 4 times. The last call showed the method that Python uses to stop iteration, by raising a StopIteration exception. Much of Python is controlled with exceptions as terminating events.\nCreating an Iterator # As with many examples, we are replacing already present functionality for an easy example. However, as you start building more complex data structures, you will see how you can integrate this into your object.\nSo we initialize the object with the data we will iterate on. __iter__ sets position to -1 (as I will increment first thing) and sends a reference to itself. I should note that while I am returning self as the iterator object and thus can have the __next__ dunder in the same object, this isn\u0026rsquo;t always the case.\n__next__ will raise a StopIteration exception if we are at the end of the list, based on len. Otherwise, it will return the current item.\nclass MyIterator(object): \u0026#34;\u0026#34;\u0026#34; An example of an iterator over list, to show iterator basics \u0026#34;\u0026#34;\u0026#34; def __init__(self, my_list): self._my_list = my_list def __iter__(self): self._pos = -1 return self def __next__(self): self._pos += 1 if self._pos \u0026gt;= len(self._my_list): raise StopIteration return self._my_list[self._pos] for i in MyIterator([1, 2, 3]): print(i) Pretty simple right?\nI should note that in Python 2, the __next__ method was next. This made for possible collisions when this name was wanted for something other than iteration. If you run into older code that has this, or code that has __next__ just calling next for Python 3 compatibility, you now know what is going on.\nGenerators # Generators are easier to build than iterators, but have a limitation. Once they are consumed, they cannot be rewound. Iterating a list can happen multiple times. Iterating a generator is a one shot deal.\nThe creation of a generator doesn\u0026rsquo;t require defining a class and implementing the dunder methods for an iterator. The special sauce is in the yield keyword, which we saw before in context generator creation.\nMany of you have used the range function in a for loop. In Python 3, this is a generator function. Lets create a range function of our own and see how this would work.\nStarting out we will ignore many of the options in range. I store the start and step values, and then loop while start is less than end. Each time I yield the current start value. This replicates the call to range with one argument.\ndef my_simple_range(end): start = 0 step = 1 while start \u0026lt; end: yield start start += step iter_obj = my_simple_range(3) print(iter_obj.__next__()) print(iter_obj.__next__()) print(iter_obj.__next__()) print(iter_obj.__next__()) Traceback (most recent call last): 0 1 2 File \u0026#34;C:/Users/micro/repositories/scratchpad/iterators-generators.py\u0026#34;, line 81, in \u0026lt;module\u0026gt; print(iter_obj.__next__()) StopIteration That output looks familiar, doesn\u0026rsquo;t it? This behaves exactly like an iterator with the same termination condition. This happens because both are exposing the __next__ method. The generator just lets Python do more of the behind the scenes work for you.\nWhat if we wanted to implement a full range with arguments like range(start, stop, step)?\nWe can do that. However, we need to understand that this can count up and down, so we need to handle all cases. This is a little complicated. I\u0026rsquo;ll do the right thing and make some tests first.\nTests First # To test, we want to compare an iterator to a static list. Luckily for us, the list() creation can consume the iterator. This is a way to cache the values of a generator.\nThis is also a good opportunity to explain more advanced pytest functionality and show how parameters can save time making test cases.\nThe first test function is using the pytest parametrize capability. (That still seems like a weird word to me, but the functionality is awesome.) I give a string with argument names comma delimited. Then I give a list of tuples for the arguments.\nI\u0026rsquo;m using arguments to hold a tuple of my arguments to my_range. This allows me to send various combinations. The expected argument is a list of what I would get from the iterator. You can see in the assert that I\u0026rsquo;m using list() to consume the iterator for comparison.\nIn this test, I\u0026rsquo;m looking for functionality and not sending illegal count of arguments (that is the second test function.)\nFor test_my_range_operation, pytest will call the function 8 times. Once for each parameter. I could write 8 separate calls or complete testing functions, but that would just be annoying and offer no benefit.\nThe test_my_range_bad_argument_counts function is to assure that we provide a TypeError unless argument count is between 1 and 3 inclusive. This uses the pytest.raises context manager for holding code that generates the exception.\nimport pytest @pytest.mark.parametrize(\u0026#34;arguments,expected\u0026#34;, [ ((5, ), [0, 1, 2, 3, 4]), ((0, ), []), ((-3, ), []), ((0, 4), [0, 1, 2, 3]), ((3, 1), []), ((3, 6), [3, 4, 5]), ((0, 5, 1), [0, 1, 2, 3, 4]), ((5, 0, -1), [5, 4, 3, 2, 1]) ]) def test_my_range_operation(arguments, expected): # expanding arguments tuple to values for the call and consuming the iterator with list(). assert list(my_range(*arguments)) == expected def test_my_range_bad_argument_counts(): with pytest.raises(TypeError): my_range() # Requires more than 0 arguments with pytest.raises(TypeError): my_range(1, 2, 1, 5) # Requires less than 4 arguments When we run these on a shell my_range all will fail. Now we can code an implementation of my_range that passes the tests.\nmy_range implementation # I\u0026rsquo;m using *args and parsing, because the arguments change positions depending on number.\nWe start with raising TypeError for argument len outside of 1-3.\nNext we are initializing start and step to defaults, because we may never receive them. Then set step if available. Set start and end if available, else just end.\nOur while is a little different, because we need start \u0026gt; end only if step is positive. Otherwise, we need start \u0026lt; end if step is negative. This will also fall through is step is zero (instead of causing an infinite loop).\nAll that is left is to yield start and then increment by step.\ndef my_range(*args): \u0026#34;\u0026#34;\u0026#34; Generate function to return a range of numbers :param args: if one argument, use as upper limit with 0 start. if two arguments, use as lower, upper limits. if three arguments, use as lower, upper and step. :yields: value \u0026#34;\u0026#34;\u0026#34; arg_len = len(args) if arg_len \u0026gt; 3: raise TypeError(\u0026#39;{} arguments given and a max of 3 are allowed.\u0026#39;.format(arg_len)) if arg_len == 0: raise TypeError(\u0026#39;No arguments given and at least 1 is required.\u0026#39;) start = 0 step = 1 if arg_len == 3: step = args[2] if len(args) \u0026gt; 1: start = args[0] end = args[1] else: end = args[0] # Need to handle positive and negative steps while (start \u0026lt; end and step \u0026gt; 0) or (start \u0026gt; end and step \u0026lt; 0): yield start start += step This passes all our tests correctly.\nI wondered how Python handles a step of zero. When calling range(1, 4, 0) I get a ValueError stating that step can't be zero, instead of our silent fail. That would be easy to add, but otherwise we seem to have a decent version of range. And hopefully, you now know how iterators and generator function work.\n","date":"17 June 2017","externalUrl":null,"permalink":"/blog/2017/06/17/iterators-and-generators/","section":"Blogs","summary":"","title":"Python: Iterators and Generators","type":"blog"},{"content":"Context managers were added to Python with PEP 343. This allows proper handling of resources without worrying about missing something in your try/finally code. If you are not opening files using a context manager, you are most likely doing it wrong.\nLooking at opening a file and what could go wrong, will show how context managers make programming both more robust and simpler. The operation can be broken into 3 sections of code.\n(Setup) Opening the file and making it available for use in Python (Do Work) Reading from or writing to the file (Tear Down) Closing the file and returning the file allocator If we were to write this code manually, we would only want to proceed past step one, if everything went correctly in step one. Then we would want to make sure we completed step three, even if something happened in step two. If you have a larger block handling the file, then it is easy to overlook the handling of the close.\nTo open a file properly ourselves, we would need something like this:\nf = open(\u0026#39;test-file\u0026#39;, \u0026#39;r\u0026#39;) try: for line in f.readline(): # do something cool with line pass finally: f.close() This isn\u0026rsquo;t too bad, but if we forget to do it, we can be in trouble. If we get in the habit of using a context manager, it is barely more typing than doing it without error handling.\nUsing a Context Manager # When opening a file with a context manager, our code would look like this:\nwith open(\u0026#39;test-file\u0026#39;, \u0026#39;r\u0026#39;) as f: for line in f.readline(): # do something cool with line pass If an error occurs when opening the file, an exception is raised and the code inside the with block is not executed. If an error occurs inside the with block, proper break down still occurs on raising of the error. It really doesn\u0026rsquo;t matter the size of our block, as we don\u0026rsquo;t need to handle anything at the end. The with block sets up the equivalent of the finally with one line.\nIt is also possible to chain context managers. If you wanted something like this:\nwith outer_cm() as A: with inner_cm(A) as B: # Do stuff with A and/or B pass Notice how we can use the resource being managed by the outer with, in the opening of the inner with.\nIn Python 2.7+ or Python 3, you can simplify it to this:\nwith outer_cm() as A, inner_cm(A) as B: # Do stuff with A and/or B pass Context Manager as Class # If the implementation of open did not supply us with a context manager, we could create our own like this:\nclass RedundantFile(object): def __init__(self, filename, mode): self.filename = filename self.mode = mode self._file = None def __enter__(self): \u0026#34;\u0026#34;\u0026#34; Setup that occurs before your code in with \u0026#34;\u0026#34;\u0026#34; self._file = open(self.filename, self.mode) return self._file def __exit__(self, *args): \u0026#34;\u0026#34;\u0026#34; Break down code that occurs when we leave the with for any reason \u0026#34;\u0026#34;\u0026#34; self._file.close() Using the above class, we could do the following:\nwith RedundantFile(\u0026#39;test-file\u0026#39;, r) as f: for line in f.readline(): # do something cool with line pass The entire reason I called it redundant is that it just replaces the functionality that is built into the open function. However, if you have your own object, you can add the __enter__ and __exit__ methods and get context manager functionality.\nContext Manager as Generator # This is great of you have a whole class. What if you just want to make some simple functionality wrapping around code?\nEnter contextlib.\nHere is a block of code that doesn\u0026rsquo;t manage important resources, but is a quick helpful wrapper for timing functions.\nfrom contextlib import contextmanager import time @contextmanager def time_me(process_name): start = time.time() try: yield finally: print(\u0026#39;{} took {} seconds.\u0026#39;.format(process_name, time.time() - start)) with time_me(\u0026#39;sleep\u0026#39;): time.sleep(2) Using the contextmanager decorator allows use to define a function that provides the code for a class based __begin__ up until the yield, then code for a class based __exit__ after.\nWhat happens when we call this with exception throwing code?\nwith time_me(\u0026#39;errors\u0026#39;): print(\u0026#39;About to divide by zero\u0026#39;) bad = 1/0 Traceback (most recent call last): About to divide by zero File \u0026#34;C:/Users/micro/repositories/scratchpad/open-file-nightmare.py\u0026#34;, line 19, in \u0026lt;module\u0026gt; errors took 0.0 seconds. bad = 1/0 ZeroDivisionError: division by zero The finally code executes and we see that Python can throw an exception exceptionally fast at 0.0 seconds. (Sorry.)\nWe talked about the equivalents with a class based context manager, instead of using contextlib above. There is no reason to, other than to show you how these compare.\nclass TimeMe(object): def __init__(self, process_name): self.process_name = process_name def __enter__(self): self.start = time.time() def __exit__(self, exception_type, exception_value, traceback): print(\u0026#39;{} took {} seconds.\u0026#39;.format(self.process_name, time.time() - self.start)) So we instantiate the object with the process_name and store it in the class. When __etner__ occurs, we need to store the time. When __exit__ occurs, we print out the results. I also needed to change the name to a proper standards upper camelcase.\nDo the arguments to __exit__ look longer than before? Look back at the File class we created. Notice *args in there? DId you catch that the first time through and wonder about it. (If so, kudos. If not, you can act like you did and I won\u0026rsquo;t know. Seriously, I\u0026rsquo;m a static web page. I\u0026rsquo;m not that smart.)\nI broke them out into actual arguments here so you can tell what they are. If you do not have a catchall positional argument handler like *args or seperate fields like this, you will get an error as __exit__ will be called with 4 arguments. If no exception has occurred, these values will be None. This allows you to do additional or different things on break down if internal code raised an exception.\nLets do one more function based context manager with contextlib, and redo our redundant file manager. This is important to show, as our time_me implementation above did not show how to return a created object.\n@contextmanager def redundante_open(filename, mode): f = open(filename, mode) try: yield f finally: f.close() So this isn\u0026rsquo;t brain surgery, we just yield it, instead of yielding nothing. Pretty simple, but I wanted to make sure to show it.\nNow I\u0026rsquo;m wondering how much Python is used in brain surgery. Now you are too. Static web pages may be dumb, but they can plant crazy thoughts into your mind.\nPossible uses of Context Managers # If I did not have a common handler for hardware interfaces on an embedded Python project, a context manager would be great to use for this. For example, on a Raspberry Pi, you will get warnings and cause issues if you try to open the GPIO interface more than once. This would not be performant, unless your hardware access occurs only rarely.\nIf you are using threading in Python, safely and religiously acquiring and releasing the lock is the only way to keep your sanity. This is a good place to use a context manager.\nA database connection, serial connection, or network connection are just like a file. You generally don\u0026rsquo;t want to just leave open ones lying around.\nLook for context manager interfaces to libraries you use. Most we designed ones that have setup and breakdown have these created for them. If it doesn\u0026rsquo;t exist, you have the ability to create a wrapper to give you this functionality as we did for files.\n","date":"10 June 2017","externalUrl":null,"permalink":"/blog/2017/06/10/python-context-managers/","section":"Blogs","summary":"","title":"Python: Context Managers","type":"blog"},{"content":"There are a whole bunch of underscores in Python. If you are new to Python, this may seem weird. There is a reason behind the flatness. There are even special names for them, under when you have a single underscore and dunder when two underscores are used (for double underscore).\nUnders # There are many uses of single underscores in Python. We will hit a few common and easy to explain right away and get them over with.\nNaming # Python variable and function naming uses underscores to separate words. So a variable might be total_sales or number_of_semicolons. They should not be totalSales or numberOfSemicolons. Constants (which are just variables you don\u0026rsquo;t change) should be all caps and underscore separated like DATABSE_URL or FIREANTS_PER_POUND.\nFunctions should be exactly the same format as variable, such as save_humanity(method_to_use) or cause_destruction(method_to_use), depending on if you are a super hero or super villain.\nWeak Internal Hiding # If you prefix your class variable or method, this is a signal to those using your class that you are expecting them to behave as adults and leave it be. Modifying it could cause issues. The user can still call the method or set the variable, but can take note of possibly being bad.\nIf you are using @property methods in a class, I like using the name of the property with an underscore prefix.\nCollisions # When you must define a variable, method or function that is named the same as a Python keyword, it is common to use a trailing underscore. However, I find most situations can be handled better by being more descriptive instead. We type once and read many times. And good IDEs also allows auto complete.\nDunders # Strong Internal Hiding # We saw that we can tell uses of our class methods that they are off limits with a single underscore. However, we can assure that they can\u0026rsquo;t call them with double underscores. Ok, that is kind of a lie. You cannot call them directly, but if you understand how the name mangling works, you can make your call to it. This idea is that most people won\u0026rsquo;t do that. If they do, they deserve what they get.\nWanna know how name mangling works, so you can be bad too?\nIf you have a class named Bob, and a method named __weave(), calling Bob.__weave() will not work. However, Bob._Bob__weave() will work. But don\u0026rsquo;t do it unless you have a real reason.\n\u0026ldquo;Magic Methods\u0026rdquo; # There are tons of magic methods in Python. These look a little weird when defining classes and modules, but allow a way of making your objects easy to use and simple for users. These are called dunders. The reason why they are wrapped with duoble underscores, is that you might want to use the name for a standard method.\nLets cover how many of these methods work.\nCommon Class Methods # __init__ - We already covered this one, which handles initialization of an new instance.\n__new__ - This isn\u0026rsquo;t as common as __init__, but is called before and when you need to handle the creation of the instance.\n__del__ - This is technically a destructor, but you should not use it. Structure you code so you don\u0026rsquo;t need it. Python is not a language built for destructors, like C++. __del__ really should be gone (in my opinion). This is called when the GC decides to clean up your object, not when it goes out of scope. Exceptions raised in __del__ are ignored. One place that might be an OK use is if you are cleaning up ctypes. Much better to use a context manager if possible.\nContext Managers # __enter__ and __exit__ are required for creation of context managers. Look for an upcoming post on context managers.\nCallable Instance # The __call__ method allows your instance to be called. This is different than __init__ which allows you to call your class and create and instance.\nRepresentation # __str__ - String representation of the object.\n__repr__ - Allows you to return a representation of the class in a string format. Will be used in a print if __str__ does not exist.\nFor iteration # __len__ - Provide implementation for the len() function.\n__iter__ or __getitem__ - Returns item for iterator\n__next__ - Gets next item in iterator.\n__reversed__ - Allows reversing of an iterator\nComparison # Default comparison sometimes just works, but you can overload so that it works for the default data value of your object.\n__eq__ - True if equal to other\n__lt__ - True if self is less than other\nSummary # Despite them often being called magic methods, think of them as just dunder methods and tools. If you use them properly, your objects and modules will just feel more Pythonic to use.\nHopefully this has demystified the underscores of Python. They are not magical, just features of the language.\n","date":"3 June 2017","externalUrl":null,"permalink":"/blog/2017/06/03/unders-and-dunders/","section":"Blogs","summary":"","title":"Python: Unders and Dunders","type":"blog"},{"content":"If you came directly to this article, you might want to read my previous on in this series with the link at the bottom. We discussed the dangers of using mutable values for defaults in a function parameter. In this article I\u0026rsquo;ll discuss two things: using mutable defaults for good and decorators. In the end, combining these together.\nUsing the default mutable for good # In developing a Python workflow for a custom system, I\u0026rsquo;m interfacing with custom hardware to measure current and temperature. The hardware call is much slower than the normal software. These values will only change slowly compared to software (especially temperature).\nI am writing a workflow that starts cycling slowly and eventually speeds up to faster than 1 second. I\u0026rsquo;m going through 144 members of the workflow and could call these functions in each one. This is really a waste in processing time. What if I had a system to cache values and only really call hardware after a certain amount of time. This would be useful in not just hardware interfacing, but also in getting other expensive resources (like network queries) for something that doesn\u0026rsquo;t change rapidly.\nI could make some type of complex systems that manages calls to these hardware functions only when needed. Surely there is an easier way. (Programmers continually ask that. Usually it is a good thing.)\nWhat if the function itself could hold the call and only perform the expensive operations after a certain time? That would be pretty cool. Lets do that.\nimport time def get_time(immediate=False, _cached={\u0026#39;last_call\u0026#39;: 0, \u0026#39;value\u0026#39;: None}): \u0026#34;\u0026#34;\u0026#34; Only calls expensive code if not called in a while. Unless told to be immediate. :param immediate: If True, ignore timing and make call immedately Note: _cache is not mentioned, as we don\u0026#39;t want the uset to pass in anything for _cache and mess up things. \u0026#34;\u0026#34;\u0026#34; CALL_TIME = 1 # Make call if 1 second has passed cur_time = time.time() if immediate or (cur_time - _cached[\u0026#39;last_call\u0026#39;]) \u0026gt; CALL_TIME: _cached[\u0026#39;last_call\u0026#39;] = cur_time # simulate expensive call time.sleep(0.1) _cached[\u0026#39;value\u0026#39;] = time.time() return _cached[\u0026#39;value\u0026#39;] In the function definition, we have an immediate parameter that is used to bypass the time cache. This will call the expensive code now. The _cached parameter defines a dictionary that stores data with te function between calls. We have \u0026rsquo;last_call\u0026rsquo; that will store the time we last called the expensive code. I stare with 0, so any call will trigger a trip through expensive code. \u0026lsquo;value\u0026rsquo; will hold the result of the expensive call.\nCALL_TIME is a constant that sets the time we wait until next expensive call. Here we are doing the expensive call if 1 second has passed. I kept this short, so the tests run faster.\nThe if checks if we are calling in immediate mode or enough time has passed. Inside we update our cached call time and get the value. I\u0026rsquo;m using time.sleep for 1/10th of a second to simulate slow call. Then storing time. This is easy to see the value has changed.\nLets defined a test that checks for a cached value for a second call, tests immediate call and waits past the cached time and see if the value changes.\ndef test_cached_with_immediate(): time_a = get_time() # Should be current time_b = get_time() # Should be cached time_a assert time_a == time_b # Sleep past cache and see value change time.sleep(1) time_c = get_time() assert time_c \u0026gt; time_a # Ignore cache and get current value time_d = get_time(immediate=True) assert time_d \u0026gt; time_c This test passes and it one of the slowest tests I\u0026rsquo;ve written in a while. 1.33 seconds runtime. Aren\u0026rsquo;t we glad I didn\u0026rsquo;t make it 30 second cache. Testing would be a full commercial break.\nThis works how we want, but we need to add this caching to multiple hardware call. So we just copy all the parts of this to each function and move along, right?\nWoah, there. Any time you think about copy and pasting around code, you are doing things wrong. Python has a methodology to easily modify function called decoration. (Its not just for holidays anymore!)\nDecorators # I\u0026rsquo;m going to start simple and work up, because a decorator to add the above functionality is not simple. Functions in Python are first-class objects. You can use them as arguments and pass then around. You can also return them. So it is possible to make a function that creates and returns a function. Lets slowly work our way up in complexity.\nThis is a simple function and call. Nothing should be new here.\ndef first(value): return \u0026#39;first({})\u0026#39;.format(value) print(first(1)) first(1) This passes in a function and executes it inside of outer.\ndef outer(func, value): return func(value) print(outer(first, 2)) first(2) Here we show that you can define functions inside of hold_function. These can only be executed inside the function. But notice how they have access to variable defined outside their function definitions for value.\ndef hold_function(value): def inner_1(): return \u0026#39;inner_1({})\u0026#39;.format(value) def inner_2(): return \u0026#39;inner_2({})\u0026#39;.format(value) print(inner_1()) print(inner_2()) hold_function(3) inner_1(3) inner_2(3)\nHere return_function creates a function and returns it. We assign this to my_func and it becomes a callable function.\ndef return_function(): def internal_function(): return \u0026#39;internal_function\u0026#39; return internal_function my_func = return_function() print(my_func()) internal_function\nThis is the simplest version of a decorator. Calling my_decorator allows you to pass in a function and wraps code around it. We call my_function first and just get the single output. Then we reassign my_function to the internal wrapper function returned from my_decorator. Executing this shows the wrapping with the original call in the middle.\ndef my_decorator(func): def wrapper(*args): print(\u0026#34;Something is done before function call.\u0026#34;) func() print(\u0026#34;Something is done after function call\u0026#34;) return wrapper def my_function(): print(\u0026#34;Wheee!\u0026#34;) my_function() my_function = my_decorator(my_function) my_function() Wheee! Something is done before function call. Wheee! Something is done after function call This uses the same my_decorator as the previous example, but is using syntactic sugar in Python for using decorators. Using @my_decorator above a function definition is equivalent to add_sugar = my_decorator(add_sugar).\n@my_decorator def add_sugar(): print(\u0026#34;Syntactic Sugar\u0026#34;) add_sugar() Something is done before function call. Syntactic Sugar Something is done after function call Common decorators # The first decorators you run into with Python is generally in classes and object programming. Some examples are @classmethod indicating the method is at class level, @staticmethod indicating a method doesn\u0026rsquo;t require object state to run, and @property making the method act like a value of the class.\nA complex caching decorator # Now that we know what decorators are and how to make them, I\u0026rsquo;m going to throw a fairly complex one at you and try to explain it. I\u0026rsquo;ll include the full version of my decorators.py file in two parts and try to talk you throught it.\nI\u0026rsquo;m importing time and wraps for the next block of code. This simple_decorator decorator is used to copy the properties of the original function onto the one returned. This makes it behave a little better in various ways when in use. It isn\u0026rsquo;t specifically needed, but makes things nicer.\nimport time from functools import wraps def simple_decorator(decorator): \u0026#34;\u0026#34;\u0026#34; This decorator can be used to turn simple functions into well-behaved decorators, so long as the decorators are fairly simple. If a decorator expects a function and returns a function (no descriptors), and if it doesn\u0026#39;t modify function attributes or docstring, then it is eligible to use this. Simply apply @simple_decorator to your decorator and it will automatically preserve the docstring and function attributes of functions to which it is applied. \u0026#34;\u0026#34;\u0026#34; def new_decorator(f): g = decorator(f) g.__name__ = f.__name__ g.__doc__ = f.__doc__ g.__dict__.update(f.__dict__) return g # Now a few lines needed to make simple_decorator itself # be a well-behaved decorator. new_decorator.__name__ = decorator.__name__ new_decorator.__doc__ = decorator.__doc__ new_decorator.__dict__.update(decorator.__dict__) return new_decorator Here is our cached_with_immediate decorator definition. Since the timing of the cache will vary between uses, this is a passed in argument. You can see an example of use at the bottom of the doc string.\nThe _cached_with_immediate(main_func) is the function we are returning with the decorator. You can see this on the last line.\nThe _decorator function has *args to catch positional and **kwargs to catch named arguments to the original function. We are adding our _cached argument that we don\u0026rsquo;t expect anyone to call, and the immediate named parameter to allow cache-less call.\nThe code inside that function looks very similar to what we had up top. Because we do the same thing wrapped around the call to main_func(*args, **kwargs).\nThe functool.wraps call is used to get the name of the function proper, instead of using the inside function name.\ndef cached_with_immediate(call_time): \u0026#34;\u0026#34;\u0026#34; Decorator that only calls expensive operations if past last call time. Can specify immediate=True to make a call ignoring cached condition. This is useful for using value of long running hardware processes when immediate value is not normally needed. Such as a temperature conversion that can only vary much slower than code may call it. So a few millisecond hardware process returns much faster if called often, as the hardware query and conversion is skipped. Using property of default _cached dictionary staying with the function definition. Example: @decorators.cached_with_immediate(call_time=30) def long_time_to_run_normally(): return something_that_took_a_long_time_to_get call function with immediate=True to ignore caching \u0026#34;\u0026#34;\u0026#34; @simple_decorator def _cached_with_immediate(main_func): def _decorator(*args, _cached={\u0026#39;last_call\u0026#39;: 0, \u0026#39;value\u0026#39;: None}, immediate=False, **kwargs): cur_time = time.time() if immediate or (cur_time - _cached[\u0026#39;last_call\u0026#39;]) \u0026gt; call_time: _cached[\u0026#39;last_call\u0026#39;] = cur_time _cached[\u0026#39;value\u0026#39;] = main_func(*args, **kwargs) return _cached[\u0026#39;value\u0026#39;] return wraps(main_func)(_decorator) return _cached_with_immediate The reason this seems to have one more level of functions than previous decorators, is that the invocation of the decorator is actually a function call. (The use is @function() instead of @function. So the decorating creates a decorator using arguments given).\nIn operation, cached_with_immediate is called in defining the decorator with @cached_with_immediate(call_time=30). This returns the _cached_with_immediate function that is executed when the function is decorated. The act of decorating returns the _decorator function, which replaces the original main_func.\nMakes sense? Hopefully.\nTesting the decorator # Below is the code I\u0026rsquo;m using to test my decorator. Notice how this get_time function has the same operation as the function we defined at the top of this post, just using our decorator.\nI actually created it from this, by replacing the decorator functionality with native code. This is why the tests are exactly the same.\n@cached_with_immediate(call_time=1) # Will cache for 2 seconds def get_time(): time.sleep(0.01) # Assure time changes between calls return float(time.time()) @pytest.mark.slow def test_cached_with_immediate(): time_a = get_time() # Should be current time_b = get_time() # Should be cached time_a assert time_a == time_b # Sleep past cache and see value change time.sleep(1) time_c = get_time() assert time_c \u0026gt; time_a # Ignore cache and get current value time_d = get_time(immediate=True) assert time_d \u0026gt; time_c If you want to look at the code, this is part of my rpi-hardware project on GitHub. Testing is in tests/test_util.py and the decorator code is in src/rpi_hardware/util/decorators.py.\nThat is it for this one, hopefully it was helpful.\n","date":"20 May 2017","externalUrl":null,"permalink":"/blog/2017/05/20/mutable-defaults-and-decorators/","section":"Blogs","summary":"","title":"Python: Mutable Defaults and Decorators","type":"blog"},{"content":"Default arguments in Python allow you to make complex functions very easy to use. They can be called with mostly defaults or called with as much configuration as needed. This comes with a gotcha for those getting started in this. If you use mutable data structures as defaults, things don\u0026rsquo;t behave exactly as you would expect.\nHowever, before we start, lets cover some things you may not know that I will use in the code. And others that are just interesting and partially related.\nShort detour into *args and **kwargs # Once we get done with all the detours, you will see *items as a parameter in the code below. Prefixing an argument with a single * means that you will collect all unnamed parameters into an argument list. If you have single arguments you wish to capture outside of this, they just need to appear prior to the catch all variable. This is most commonly used with the term *args for arguments, which is fine if representing generic or various types of data. However, I prefer to make a clearer name when possible. So here is used *items as we are sending items of a list.\nWe are not using **kwargs, or the ** style, but this is used to expand key word arguments. So you can think of a dictionary being passed in. Here is a function that takes key word arguments and just prints them up. Notice how we are using .items() which is the same way to get (key, value) pairs out of a dictionary.\ndef my_function(**kwargs): for (key, value) in kwargs.items(): print(\u0026#39;{} - {}\u0026#39;.format(key, value)) We can call this with two arguments and look at the output:\nmy_function(joe=\u0026#39;corny\u0026#39;, amy=\u0026#39;amazing\u0026#39;) joe - corny amy - amazing Lets go a little crazier:\nmy_function(a=1, b=2, c=3, ddddddd=4, i=\u0026#39;am\u0026#39;, getting=\u0026#39;tired\u0026#39;, of=\u0026#39;arguments\u0026#39;) a - 1 b - 2 c - 3 ddddddd - 4 i - am getting - tired of - arguments More detour: Forcing named arguments # New with Python 3 is the ability to force named arguments. This means they must be entered with the name. This is easiest to show with a few examples.\ndef print_label(label_text, inverted, mirrored, flipped): \u0026#34;\u0026#34;\u0026#34; function for printing label with many boolean args \u0026#34;\u0026#34;\u0026#34; pass print_label(\u0026#39;My Text\u0026#39;, False, True, False) While I would define the print_label function with good defaults for the last three arguments, I didn\u0026rsquo;t want to here as I don\u0026rsquo;t want you to think that forcing named arguments requires arguments with defaults.\nIf you saw that print_label call somewhere in code, how easy would it be to figure out what is going on? Sure, you knew at the time you were coding as you just saw the definition or PyCharm popped up hints.\nJust reading through source code, it will be impossible to understand. This is bad.\ndef print_label(label_text, *, inverted, mirrored, flipped): \u0026#34;\u0026#34;\u0026#34; function for printing label with many boolean args \u0026#34;\u0026#34;\u0026#34; pass print_label(\u0026#39;My Text\u0026#39;, False, True, False) # Errors print_label(\u0026#39;My Text\u0026#39;, inverted=False, mirrored=True, flipped=False) I have added an * argument that indicates a split between the positional arguments and named arguments. If you are using a *args, you get this already. The change in Python 3 is allowing this functionality without allowing unlimited positional arguments, as *args use would allow.\nIn the first call to print_label above, we would receive a TypeError that tells us print_label() takes 1 positional argument but 4 were given. The second call will work properly.\nNotice how the requirement of named parameters combined with good names, makes this call self documenting. It is a little extra typing that is completely work the effort in readability. Source code is read many more times than it is written. All you are doing in the function definition is forcing programmers to be good source code citizens.\nLast detour, I promise # Since we talked about * and ** in receiving arguments to a function, I wanted to cover the idea of expanding lists and dictionaries. The syntax is the same. If you have a tuple with three items and wish to send those arguments into a function, you would just use *tuple_var. This expands them into separate arguments. Without this, you would be sending the tuple as the first argument. This works the same for a list as a tuple. For a dict, just use **dict_var to send named arguments in.\nBack to default mutability # That was a deeper rabbit whole than I planned, but it was a good time to cover some of those points. Lets build a function that allows you to add elements to a list, but create a fresh list if you don\u0026rsquo;t provide one. (Just act like the list.extend() method does not exist.)\nOur first pass if we are new to Python might looks like this:\ndef append_values(*items, to_list=[]): for item in items: to_list.append(item) return to_list list_a = append_values(1, 2) list_b = append_values(3, 4, to_list=[]) list_c = append_values(5, 6, to_list=[9, 10]) list_d = append_values(7, 8) Even people that don\u0026rsquo;t know the dangers of mutable defaults in parameters will be able to determine the values of lists a through c. However, many will not know what happens for list_d.\nlist_a passes in two values, but no list to append onto. So we start with the default empty list. The output is what we would expect as [1, 2].\nlist_b passes in both values and an empty starting list. So we would expect the output to be what it is: [3, 4].\nlist_c passes in a prepopulated list with values, so these are added at the end and we get [9, 10, 5, 6] as our output.\nlist_d seems like it is exactly the same as list_a, but with different values. We would expect to have an empty list as default and receive [7, 8] back. However, we receive [1, 2, 7, 8] from append_values.\nHow is this possible, with the default values of []? Here is the issue with using mutable types as defaults.\nWhen a function is created, Python keeps data related to it. The default arguments are created and stored. Each time the function is called, Python doesn\u0026rsquo;t recreate it. This would be wasteful. It just looks at the values and uses them. So this default list starts empty. However, in the list_a call, we are using it and appending 1 and 2 into it. list_b and list_c are not using the default, so these default values stay dormant. list_d again uses the default list, which is not empty but [1, 2] from the list_a call. This is why we get the values instead of an empty list.\nUsing inspect # Before we show how to keep this from happening, I want to show what is happening rather than forcing you to take my word for it. For this I\u0026rsquo;ll be using the inspect module that allows us to peek under the covers.\nThis is the same code as above, with a little more in it. I\u0026rsquo;m printing the values and displaying the values inside the function definition.\nimport inspect ​ def append_values(*items, to_list=[]): for item in items: to_list.append(item) return to_list print(inspect.getfullargspec(append_values)) FullArgSpec(args=[], varargs=\u0026#39;items\u0026#39;, varkw=None, defaults=None, kwonlyargs=[\u0026#39;to_list\u0026#39;], kwonlydefaults={\u0026#39;to_list\u0026#39;: []}, annotations={}) Before we start calling this function, I used inspect to print out the full argument specification just after the function was created.\nargs is empty, because we don\u0026rsquo;t have any positional arguments that are not handled via the *items variable. This is a list that would contain them otherwise. varargs is a string, as it can only hold one value (or be None). There is only one variable that collects all left over positional arguments. varkw is None, as we don\u0026rsquo;t have any ** style named argument catchalls. defaults for positional arguments is None as we don\u0026rsquo;t have any. kwonlyargs shows us our to_list keyword argument. kwonlydefaults is a dictionary that holds our default values for keywords. Notice how we have to_list with a default of []. annotations are functional annotations new in Python 3. These are defined in PEP 3107. I\u0026rsquo;m not going to talk about them, but feel free to take a look. So with the initial state after the function is created, our to_list is []. Lets follow this through the executions.\nlist_a = append_values(1, 2) print(list_a) print(inspect.getfullargspec(append_values)) [1, 2] FullArgSpec(args=[], varargs=\u0026#39;items\u0026#39;, varkw=None, defaults=None, kwonlyargs=[\u0026#39;to_list\u0026#39;], kwonlydefaults={\u0026#39;to_list\u0026#39;: [1, 2]}, annotations={}) We received [1, 2] as I discussed above for list_a. However, looks at kwonlydefault ins the srgspec. We are not [1, 2] instead of []. We have poisoned our pristine default.\nlist_b = append_values(3, 4, to_list=[]) print(list_b) print(inspect.getfullargspec(append_values)) [3, 4] FullArgSpec(args=[], varargs=\u0026#39;items\u0026#39;, varkw=None, defaults=None, kwonlyargs=[\u0026#39;to_list\u0026#39;], kwonlydefaults={\u0026#39;to_list\u0026#39;: [1, 2]}, annotations={}) list_c = append_values(5, 6, to_list=[9, 10]) print(list_a) print(inspect.getfullargspec(append_values)) [1, 2] FullArgSpec(args=[], varargs=\u0026#39;items\u0026#39;, varkw=None, defaults=None, kwonlyargs=[\u0026#39;to_list\u0026#39;], kwonlydefaults={\u0026#39;to_list\u0026#39;: [1, 2]}, annotations={}) Since we passed in the list for both list_b and list_c, default was not touched. However, we are still carrying around the mutated default to sting us in list_d.\nlist_d = append_values(7, 8) print(list_a) print(inspect.getfullargspec(append_values)) [1, 2, 7, 8] FullArgSpec(args=[], varargs=\u0026#39;items\u0026#39;, varkw=None, defaults=None, kwonlyargs=[\u0026#39;to_list\u0026#39;], kwonlydefaults={\u0026#39;to_list\u0026#39;: [1, 2, 7, 8]}, annotations={}) Not only did we pollute the output of list_d, but we have left more sunrises to any future callers. This is the reason you never unintentionally use mutable variables (lists, dicts, objects) as default arguments. They will be created once and continually mutated with calls.\nSo we have a major bug. We need to fix it. How will we know when we did?\nTest Driven Development # There is two ways to write code. Code, then try to see if it works. Or define what working is with tests, and code until it does work.\nYes, you read about how tests are good, but it is more work and you wind up just calling the function a few times with different data and calling it good. The problem is you delete that sample code and move on. How do we tell that it still works with changes?\nOr worse, you just write the function and assume it works as we did above. Now we have to figure out why we are getting weird bugs in production as almost everyone passes in a list, but occasionally they don\u0026rsquo;t.\nFor all but the smallest programs, testing is lower overall effort and improves code quality. Yes, it feels like more work, especially when deadlines are looming. And it may be very hard with existing software. However, untestable software is usually not modular enough for good code to begin with. Just the act of testing makes you structure code into smaller and more predictable functions with fewer inter-related \u0026lsquo;magic\u0026rsquo;. Getting in the habit early will make you a better developer.\nLecture over. Lets write some tests.\nFor many modules that are built into Python, there is a better version of that functionality available in PyPi. If you find an example for urllib2 looks for a better one using requests. unittest is built into Python. Do yourself a favor and install pytest instead.\npip3 install pytest See that was painless.\nLets use our examples and put those into tests. On a larger project, I would have a separate testing directory with tests. For simplicity, I\u0026rsquo;ll put everything in one file here. Below is what my default-mutable.py file looks like.\ndef append_values(*items, to_list=[]): for item in items: to_list.append(item) return to_list def test_with_default(): list_a = append_values(1, 2) assert list_a == [1, 2] list_d = append_values(7, 8) assert list_d == [7, 8] def test_with_list(): list_b = append_values(3, 4, to_list=[]) assert list_b == [3, 4] list_c = append_values(5, 6, to_list=[9, 10]) assert list_c == [9, 10, 5, 6] If I run this from the folder containing the file, I would use pytest default-mutable.py. Here is the output:\nC:\\Users\\micro\\repositories\\scratchpad\u0026gt;pytest default-mutable.py ============================= test session starts ============================= platform win32 -- Python 3.6.3, pytest-3.2.5, py-1.5.2, pluggy-0.4.0 rootdir: C:\\Users\\micro\\repositories\\scratchpad, inifile: collected 2 items default-mutable.py F. ================================== FAILURES =================================== ______________________________ test_with_default ______________________________ def test_with_default(): list_a = append_values(1, 2) assert list_a == [1, 2] list_d = append_values(7, 8) \u0026gt; assert list_d == [7, 8] E assert [1, 2, 7, 8] == [7, 8] E At index 0 diff: 1 != 7 E Left contains more items, first extra item: 7 E Use -v to get the full diff default-mutable.py:11: AssertionError ===================== 1 failed, 1 passed in 0.08 seconds ====================== We have an output of F. so we failed the first one and passed the second. Notice the code is shown for the test and we see [1, 2, 7, 8] == [7, 8] as the failed assert. This is what we saw with our manual testing. Now we have a failing test that covers our problem. Now lets fix the code and verify with passing tests.\nFixing the default mutable problem # The best method for a default argument value is something that is easy to determine between a list with items and no list. So if we use None as the default, it is easy to tell the difference. However it forces us to handle the situation inside the function.\nWe will update out function to be the following:\ndef append_values(*items, to_list=None): if to_list is None: to_list = [] for item in items: to_list.append(item) return to_list If we have None, we are just creating a new empty list. None is immutable, so it will not be polluted. Lets rerun our tests.\n============================= test session starts ============================= platform win32 -- Python 3.6.3, pytest-3.2.5, py-1.5.2, pluggy-0.4.0 collected 2 items default-mutable.py .. ========================== 2 passed in 0.03 seconds =========================== Well that certainly looks better.\nUsing the default mutable for good # Once you understand what is going on and how it works, this default mutable problem can be used for your goals.\nSince the post has gotten fairly long, I\u0026rsquo;m going to keep you hanging on this one until my next Python post. For most people who have arrived after the next is posted, that just means clicking the next link below.\n","date":"22 April 2017","externalUrl":null,"permalink":"/blog/2017/04/22/functions-and-mutable-defaults/","section":"Blogs","summary":"","title":"Python: Functions and Mutable Defaults","type":"blog"},{"content":" Python 3 Strings # The handling of strings was one of the major breaking change between Python 2 and 3. Python 2 was easy for English speaking folks that could live in 8-bit ASCII land. It was easy to use a string as a sequence of bytes when doing binary transfer. However, turning 8-bit ASCII into Unicode was a little daunting.\nWith Python 3, all strings are Unicode. To get a bytes object as a string would be in Python 2, you prefix a string with a b as in b'bytes object with \\xf4 \u0026lt;- high 8-bit character'.\nIf you haven\u0026rsquo;t seen a hexadecimal byte representation before, such as \\xf4, let me cover that quickly. One byte is 256 value, from 0 to 255. This corresponds to hexadecimal 0x00 to 0xff. The representation in a bytes string is \\x00 to \\xff. Python will print out bytes in this hex format when the characters are unprintable. You can also enter a bytes object the hard way. Defining b'\\x62\\x79\\x74\\x65\\x73' is the same thing as b'bytes'.\nWhen Unicode strings are transmitted or stored in files as binary, we need to send them as bytes. So we need to encode strings to bytes and decode bytes to strings. This is done with '.encode()' method on strings and '.decode()' on bytes. Both take encoding type as arguments. You will get errors if invalid values exist for either of these methods.\nNormalize bytes into unicode strings with decoding as soon as possible after receiving. Do not mix encodings. Things get ugly. UTF-8 will handle most things. Try to stay there.\nMethods # Some useful methods on string:\ns.upper() and s.lower() - returns uppercase and lowercase version of string\ns.strip() - remove whitespace from beginning or end\ns.isalpha() s.isdigit() - returns boolean if all characters are alpha or digits\ns.startswith(\u0026lsquo;begin string\u0026rsquo;) s.endswith(\u0026rsquo;end string\u0026rsquo;) - returns boolean if starts or ends string\ns.replace(\u0026lsquo;find\u0026rsquo;, \u0026lsquo;replace\u0026rsquo;) - replaces all occurrences of \u0026lsquo;find\u0026rsquo; with \u0026lsquo;replace\u0026rsquo;\ns.split(\u0026lsquo;delimiter\u0026rsquo;) - splits string into list of strings based on provided string\ns.join(list, \u0026lsquo;\u0026rsquo;) - joins list of strings into one string with second string in between each. More commonly used as \u0026lsquo;\u0026rsquo;.join(list)\nConcatenating Strings # Strings in Python are immutable. This doesn\u0026rsquo;t mean that you can change the value of a string variable. When you do, Python creates a new string and then points the variable to the new string. This costs processing time and memory until the garbage collector cleans it up.\nStrings can be joined with the + operator. The problem is that this creates and throws away strings often. If you are building up a string in many parts, there is a more efficient and pythonic method. Use a list. This keeps all string objects, until you create a large one and throw them away.\nHow do we know this is better? Python has a timeit module that allows you to run a method or code and test execution time. I tested naive appending with +, list build then join, and using a file-like object to hold data. Below is my test code and results:\nimport io import timeit number_max = 100000 # build a list of strings that are unique to_append = list([str(i) for i in range(number_max)]) def naive_method(): \u0026#34;\u0026#34;\u0026#34; Test using + appending \u0026#34;\u0026#34;\u0026#34; build_str = \u0026#39;\u0026#39; for val in to_append: build_str += val return build_str def list_join_method(): \u0026#34;\u0026#34;\u0026#34; Test using list build and join \u0026#34;\u0026#34;\u0026#34; build_list = [] for val in to_append: build_list.append(val) return \u0026#39;\u0026#39;.join(build_list) def pseudo_file_method(): \u0026#34;\u0026#34;\u0026#34; Test with pseudo file \u0026#34;\u0026#34;\u0026#34; with io.StringIO() as fake_file: for val in range(number_max): fake_file.write(\u0026#39;val\u0026#39;) return fake_file.getvalue() # timeit will run each function this number of times run_count = 200 print(\u0026#39;naive_method: {}\u0026#39;.format(timeit.timeit(naive_method, number=run_count))) # naive_method: 3.3670036327086508 print(\u0026#39;list_join_method: {}\u0026#39;.format(timeit.timeit(list_join_method, number=run_count))) # list_join_method: 2.0951417760739637 print(\u0026#39;pseudo_file_method: {}\u0026#39;.format(timeit.timeit(pseudo_file_method, number=run_count))) # pseudo_file_method: 2.514028840406624 List join method is 2.1 seconds, pseudo file is 2.5 seconds, and naive \u0026lsquo;+\u0026rsquo; method is 3.4 seconds.\nIf in doubt about which method of doing things is best, it is good to quickly test. However, performance isn\u0026rsquo;t always the most important, if it hampers readability and understanding of code. Otherwise, you would just write in a language where performance is first. Python is just as much about programmer performance as code performance.\nThe language has been developed so that typical pythonic methods are the fastest or close enough to not matter. Just like PEP-8, writing pythonic code is good practice as it creates a common grammar that allows programmers to more easily parse each other\u0026rsquo;s code.\n","date":"15 April 2017","externalUrl":null,"permalink":"/blog/2017/04/15/python-strings/","section":"Blogs","summary":"","title":"Python: Strings","type":"blog"},{"content":"In my current role, I don\u0026rsquo;t do much mentoring to other programmers at a language specific level. Most of my job is isolated somewhat and I\u0026rsquo;m the only serious Python programmer at the company. I can offer insight in architecture, DB design and other pieces relative to our Android, iOS, and Web applications, but not Python.\nSo I decided to capture some of my thoughts about what I would tell a new Python programmer, to help them progress into a successful Pythonista faster. I will be adding posts to this series, rather than a large article, so I can get them coming out as I think of them.\nPython 2 vs 3 # As of writing this, there are two current Python versions: 2.7 and 3.6. Python 3 is intentionally backwards incompatible with Python 2. There are many warts that existed in Python 2. Unicode was painful. Floor division was confusing. Other things were just messy. I\u0026rsquo;m still not convinced that the method used for the updates was the best, but it is where we are now.\nThe last version of Python 2 is 2.7. Python 2 was arguably better than Python 3 for a few years. Combined with lack of library support for some time and you get the fairly long conversion time for programmers to switch between Python 2 and 3.\nThe only reason to be using Python 2 these days is if your code base is large enough that conversion could not be done yet or your software conversion is waiting on vendor support for 3. There are a few industries whose Python support is lacking 3, but most are on their way. Python 3.6 is a superior version of Python than 2.7.\nI do not worry about Python 2 support at all with libraries I write. It is dead. Support is ending 2020. We need to move on.\nFor beginners, start using Python 3.6. Just do it. There are many articles on the differences between 2 and 3, but the future is 3.\nWith anything that has been around as long as Python, you will find far too much historical information online. This is more frustrating when articles have no date reference to understand \u0026ldquo;freshness\u0026rdquo;. You may find tutorials that are Python 2 related. Knowing the differences between 2 and 3 allows you to do these in Python 3. Hopefully this will become less and less.\nSome of the basics # Slices # Most Python programmers quickly learn slices. But I see many that don\u0026rsquo;t understand the 3 part of a slice. It is often taught just with start and end, and the step is not mentioned.\n# All three arguments. slicable[start:end:step] # Example list my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9] # Start begins slice inclusively (index is included) my_list[0:] # \u0026gt; [1, 2, 3, 4, 5, 6, 7, 8, 9] my_list[5:] # \u0026gt; [6, 7, 8, 9] my_list[14:] # \u0026gt; [] (start off end of list, makes empty list) # End stops slice before index my_list[1:5] # \u0026gt; [2, 3, 4, 5] my_list[4:200] # \u0026gt; [5, 6, 7, 8, 9] (only as long as list, same as missing end) # If start is left off, begin from 0 my_list[:5] # \u0026gt; [1, 2, 3, 4, 5] # If both left off, it is a copy my_list[:] # \u0026gt; [1, 2, 3, 4, 5, 6, 7, 8, 9] # We can use step with our without start and end value. my_list[1:5:1] # \u0026gt; [2, 3, 4, 5] (1 is default, so this is dumb) my_list[1:5:-1] # \u0026gt; [] (we can\u0026#39;t step backwards from 1 to 5) my_list[5:1:-1] # \u0026gt; [6, 5, 4, 3] (Notice we didn\u0026#39;t reverse [1:5:1], because start is inclusive, not end) my_list[::-1] # \u0026gt; [9, 8, 7, 6, 5, 4, 3, 2, 1] (simple reverse) my_list[::3} # \u0026gt; [1, 4, 7] (Step every 3) This is not just useful on lists and tuples. You can use on a string as well. Try this with many of the examples above.\n\u0026#39;Joe Sacher\u0026#39;[::-1] # \u0026gt; \u0026#39;rehcaS eoJ\u0026#39; Comprehensions # If you find you are building up lists, dictionaries, or sets with a loop, you are usually doing it wrong. When you understand how comprehensions work, they are just like a loop, but better performance.\nA comprehension is of the format:\n[output expression] [variable] [input sequences] [optional conditions]\nYou will see how this works as we create some.\nList Comprehension # We define a list with square brackets, such as [1, 2, 3, 4, 5]. What if you wanted to make a list of the squares of 1-9? Well you could do something like:\nmy_list = [] for i in range(1,10): my_list.append(i*i) # my_list = [1, 4, 9, 16, 25, 36, 49, 64, 81] That isn\u0026rsquo;t terrible, but takes a little looking to see what you are doing. Just like creating a list, you use square brackets for a list comprehension. For everything but the simplest comprehensions, I like breaking parts onto separate lines. I think it makes them quicker to see what is going on. I\u0026rsquo;ll do that here, even though these are simple enough for a single liner.\nIn this first example, we have the output exprress on line 1 and the variable and input sequence on line 2.\nmy_list = [i*i for i in range(1,10)] # my_list = [1, 4, 9, 16, 25, 36, 49, 64, 81] When you format it like this, it almost reads like a loop. But the first thing you see is what is being generated, then how. Now if we want to only do this for odd values in range, we need to use the conditional capability on line 3.\nmy_list = [i*i for i in range(1,10) if i % 2 == 1] # my_list = [1, 9, 25, 49, 81] It is possible to nest multiple comprehensions. If they are simple enough, this is fine. However, at a certain point, go ahead and loop or use multiple steps for list creation with possibly multiple comprehensions. The speed gain by being overly complicated is a waste of time if it is too hard to understand. Always remember that you will read code much more often than write it. Clever is not always a good thing. Often it is bad.\nSet Comprehension # A set comprehension is the same as a list comprehension, just using curly braces instead of square braces. If you are unfamiliar with a set, this is an unordered collection distinct items. You can keep adding the same value to it, but it will only exist once. Membership check is inexpensive, and math operations common to manipulating sets are possible.\nWe used range in list comprehensions, but it is common to start with a list and use a comprehension to create a different one. The other reason for using a list, is that I want to show the set retaining only one copy of distinct items.\nmy_set = {i for i in [1,2,4,5,3,5,3,2,4,5,1,2,3]} # my_set = {1, 2, 3, 4, 5} (note order might not be same) This is a little dumb, because we would have the same thing by wrapping the list in a set() call. So lets generate a set of the square of members of a list less than 5.\nmy_set = {i*i for i in [1,2,4,5,3,5,3,2,4,5,1,2,3] if i \u0026lt; 5} # my_set = {16, 1, 4, 5} (see what I said about order?) It was just coincidence that the first came out order for me in Python 3.6.\nDictionary Comprehension # A dict comprehension is a little more complex. It uses curly braces like a set, but the output expression in a key: value style is what determines between the two. Instead of just having one value, you can modify and process both the key and value. Variable assignment can use tuple unpacking in any comprehension. It is most likely used here.\nIf we want to take an existing dictionary and change it somehow, then we would get at both the key and value with dict.items(). Say we want to take a dictionary and square the value.\nd = {\u0026#39;a\u0026#39;: 1, \u0026#39;b\u0026#39;: 4, \u0026#39;c\u0026#39;: 2, \u0026#39;d\u0026#39;: 7} new_d = {key: value*value for (key, value) in d.items()} # new_d = {\u0026#39;a\u0026#39;: 1, \u0026#39;c\u0026#39;: 4, \u0026#39;b\u0026#39;: 16, \u0026#39;d\u0026#39;: 49} Conditional Output # So far we have processed the full input or filtered with a condition before processing the value. I over simplified comprehensions for the output. It is possible to include logic about what the output should be in the comprehension.\nLets do another arbitrary but simple example. For some reason we want to take a list and output a 0 if the value is less than 5 otherwise a 1.\nmy_list = [1, 6, 10, 3, 8, 2, 7, 20000, 3] filtered = [0 if i \u0026lt; 5 else 1 for i in my_list] # filtered = [0, 1, 1, 0, 1, 0, 1, 1, 0] enumerate # Coming from some languages, it can take a new Python programmer time to think about consuming items in a for loop. Python\u0026rsquo;s for works more like a for each in some languages. Even when it is doing a loop with a counter, it is consuming a generator of range(). This can take some adjustment to write loops simply and Pythonic.\nIf you find yourself writing code that looks anything like this:\ni = 0 for name in names: print(\u0026#34;Name #{} is {}\u0026#34;.format(i, name) i += 1 Or like this:\nfor i in range(len(names)): print(\u0026#34;Name #{} is {}\u0026#34;.format(i, names[i])) Stop. You are working far too hard and making those reading your code work hard trying to figure out what is going on. You are adding code where you can introduce errors for no good reason. Enumerate is used to maintain a counter for you.\nfor (i, name) in enumerate(names): print(\u0026#34;Name #{} is {}\u0026#34;.format(i, name) This is much easier to read and immediately know what is going on. There is no forgetting to increment a counter or get the range wrong.\nFinal Ideas # I\u0026rsquo;m getting pretty long on this post, so I\u0026rsquo;ll wrap this up with one thought:\nSimplify.\nWhen you start to write code, it may be 20 lines to get something done. As you start to understand how Python best practices work, you will eliminate that loop with a comprehension or enumeration. You will use .get for a dictionary, so you can specify a value if the item doesn\u0026rsquo;t exist. This makes your code shorter, better, and harder to get wrong.\nGood software engineering is about making things as simple as possible, but no more. Work on this as you write and refactor your code. If you have to write 4 times as many comments as code to explain what you are doing, you are being too clever. Stop it.\nHopefully this was helpful to you. I will be posting shorter Python specific tips in this series, with one or two subjects each.\n","date":"8 April 2017","externalUrl":null,"permalink":"/blog/2017/04/08/python-starting-tips/","section":"Blogs","summary":"","title":"Python: Starting Tips","type":"blog"},{"content":"","date":"9 April 2012","externalUrl":null,"permalink":"/tags/android/","section":"Tags","summary":"","title":"Android","type":"tags"},{"content":"My wife and I left webOS when HP flushed their 3 year plan to revamp webOS down the toilet. We tested both Android and Windows Phone. Android is a multitasking joke. Coming from webOS, it has a terrible UI. Windows Phone has very nice flowing UI. We decided to go to Windows Phone.\nMicrosoft representatives promised to get phones and development credits to webOS programmers. Despite many requests, it turned out to be a bunch of hot air. Sadly, this turned me off to all mobile development.\nWe slugged along with trying to make Windows Phone a viable mobile solution for 8 months. We are done trying. After two weeks of switching to Android, we know two things.\nAndroid is painful to use, compared to the grace of webOS. Android is LESS painful than Windows Phone. I enjoy podcasts. Trying to listen to them on Windows Phone is a complete nightmare. It is so bad that I stopped listening to podcasts completely. It was one of the many things I slowly gave up, because of the lack of usability on Windows Phone.\nI have a decent collection of audio books on mp3 format. There is only one way that I could make these work on Windows Phone:\nJoin all mp3s in the right order into one mp3 file Change the metadata to indicate podcast genre Go through Zune to get it on my phone Then if I want to listen to other things on the device, I get to lose my place.\nI used to subscribe to audio books on Audible. I stopped with webOS. This keeps getting promised for Windows Phone. This exists for Android. Which brings us into another factor: apps.\nI dealt with the lack of apps, lack of access to hardware, lack of many things on webOS, because the UI is still the best out there.\nTwo weeks on Android with access to some of the things I have been missing, makes up for a lot of bad UI.\nZune slowly changed from something I have to work through to get stuff on my phone, to something that drove me completely nuts. I setup WiFi sync, so that I didn\u0026rsquo;t have to constantly connect my phone to download podcasts and other things to it. My Windows Phone almost never correctly download these things on its own. Oh, how many times I watched my phone indicate pending downloads that would never come to pass. WiFi worked to finish the downloads when the software felt merciful and the moon was in the correct region of the sky.\nIf I wanted an annoying piece of software that was the gatekeeper for my device, I would just deal with the abomination that is iTunes.\nFile management is a joke. The process of getting a document on and off your phone involves crazy steps of using email, online syncs, and a bit of prayer. I miss the former days of a USB drive mode, where I could just copy files. Guess what? That is back with Android.\nWhile Windows Phone has the same multi-task pausing of the iPhone, it was easier to switch between apps than Android. However, if the app isn\u0026rsquo;t setup with the Mango resume, the pause before the app resumes is annoying. Really the two platforms are pretty much tied in this race. They both have barely left the starting blocks of usability, compared to webOS.\nI thought that the home screen of Android would be more annoying. It turns out to be less so than trying to fit all the apps you want to use on the start screen or looking them up each time in the alphabetical list.\nSo, what do I have with Android now?\nApps for my credit union, including deposit check via photo. Charging credit cards via a device on the headphone jack. Tethering via USB for free.\nNot quite the WiFi hot spot that webOS gave me, but I can have that too if I decide to root the phone. Edit: Found FoxFi, so WiFi hot spot is back.\nA video player that plays files I just drop on the phone via USB. No waiting 30 minutes to convert the files into the correct format.\nAmbling Book Player that takes an audio book with 250 files and handles it perfectly.\nBeyondPod which, while not as nice as Dr. Podder on webOS, can actually manager all my podcasting needs on the device.\nAudible. I have missed Audible.\nScummVM is now back on my phone. I was one of the backers for Double Fine\u0026rsquo;s Adventure game on Kickstarter. I enjoy these things. It was possible with webOS, and now is again.\nThings are far from perfect on my Android transition. I have to periodically hit the optimize button to close down rogue apps. I had to get a 3500 mAh battery to make my phone last a day. But things are better.\nP.S. I found out that Zune doesn\u0026rsquo;t want me to go. I cancelled our Zune Pass. Luckily, I had a card stolen and cancelled that card as well.\nNow I get an email periodically about how the card is bad. How they can\u0026rsquo;t charge a monthly fee for a service I cancelled over 2 weeks ago.\nZune, the relationship is over. We broke up.\n","date":"9 April 2012","externalUrl":null,"permalink":"/blog/2012/04/09/windows-experiment-is-over/","section":"Blogs","summary":"","title":"The Windows Phone Experiment is Over","type":"blog"},{"content":"","date":"9 April 2012","externalUrl":null,"permalink":"/tags/webos/","section":"Tags","summary":"","title":"Webos","type":"tags"},{"content":"","date":"9 April 2012","externalUrl":null,"permalink":"/tags/windows-phone/","section":"Tags","summary":"","title":"Windows Phone","type":"tags"},{"content":"","date":"21 September 2011","externalUrl":null,"permalink":"/tags/podcasts/","section":"Tags","summary":"","title":"Podcasts","type":"tags"},{"content":"Zune podcast functionality on Windows Phone Mango was obviously designed by someone who never listens to podcasts. I’ve tried to use it over the last three weeks and it is an exercise in futility. There is one glaring problems that needs to be addressed before it is close to usable. It all comes down to episode management. Unfortunately, this is the most important factor of any podcast solution.\nOrder is allowed, for either oldest first or newest first. This is great. What this means is that it will constantly download the oldest or the newest. Doesn’t matter how many times you have heard them. It doesn’t matter if you manually marked them as heard and manually deleted them.\nIf you have oldest selected, guess what is downloading back on the phone? Do you remember those old favorites that you have manually deleted 10 times already? Yeah, they\u0026rsquo;re back.\nHello old friends.\nIf you are caught up and always listen to the latest, the moment it comes out, then having the newest set and keeping the latest X on your devices works fine. Myself, I set almost everything to oldest, because if 2 episodes come out before I get back to that podcast, I want to hear them in order.\nThis isn’t that hard. When a feed is added, a piece of data is tracked for each episode. If you have downloaded and listened to a podcast, store the podcast filename or URL with a played flag. When you are listing episodes, you put a small indicator that this is old and listened to already. When syncing podcasts, download the oldest or newest that don’t have the listened to flag set. Done. This is programming, not rocket science. The user can manually redownload them if wanted, but otherwise they are dead to us.\nNow that we have a database that remembers which are played, can we mark them as played without downloading them? Pretty please? Some podcasts were online before you were even a glint in your compiler’s linked binaries. I’m at episode 140 of 200, but selecting oldest will only allow me to start at 1. Even if episodes were marked as listened correctly, I would have to download and mark all 139 prior episodes.\nNow, can we ask for another great feature? Add an auto delete after listening option. Wouldn’t that be great? You listen to an episode. It is marked as played in the DB and deleted. Now what happens? The next episode is automatically downloaded to get up to your keep at least number. It would be almost like the software was reading my mind.\nI’ve almost stopped listening to PodCasts on Windows Phone, because the management of episodes is more work than the enjoyment of listening to them. Maybe it is too easy to spot really crappy software after using really great software. If anyone wants to see really good software, look at drPodder on webOS. It is open source, take a look. It makes Zune’s implementation looks like a bad student programming project.\n","date":"21 September 2011","externalUrl":null,"permalink":"/blog/2011/09/21/zune-podcasts-a-rant/","section":"Blogs","summary":"","title":"Zune Podcasts - A Rant","type":"blog"},{"content":"","date":"8 September 2011","externalUrl":null,"permalink":"/categories/how-to/","section":"Categories","summary":"","title":"How-To","type":"categories"},{"content":"","date":"8 September 2011","externalUrl":null,"permalink":"/tags/projects/","section":"Tags","summary":"","title":"Projects","type":"tags"},{"content":"I have delusions of possibly making an embedded thermostat solution that tracks energy usage, inside and outside temperature and humidity and possibly online weather forecasts for setting house temperature. For this to work, I need to fully understand thermostat wiring. It took a bit of looking around the net to identify thermostat wire colors, thermostat terminals and functions, so I thought I would summarize it in a post.\nAll signals are 24 VAC controlled\nLabel Code Function Wire Color R Power (24 VAC) Red RC Power for Cooling Red RH Power for Heating Red (RC and RH may be jumped together) Y Cooling Power to Compressor Relay Yellow Y2 2nd Stage Cooling Power Varies (Lgt. Blue) W Heating (Gas, Oil, or Electric) White G Indoor Blower Fan Green C Common for 24VAC Transformer Black O/B Reversing Value for Heat Pump Varies O Energized in Cooling Mode Orange B Energized in Heating Mode Dark Blue or Blue (Rheem/Ruud) E Emergency Heat Varies X/Aux Back up for Heat Pump or Aux Heating Varies S1-S2 Shielded Outside Air Temp. Sensor Varies ","date":"8 September 2011","externalUrl":null,"permalink":"/blog/2011/09/08/thermostat-wiring/","section":"Blogs","summary":"","title":"Thermostat Wiring","type":"blog"},{"content":"I\u0026rsquo;m testing both Android and Windows Phone on Sprint. Both devices have free TeleNav service on Sprint, so the service using that application is roughly similar. Both phones also come with stock turn by turn directions. Android is a no holds barred knockout win.\nThe turn by turn directions in pre-Mango Windows Phone is a joke. You must tap the screen to move along, making it totally unusable for navigation when you are driving the car. The Mango update provides considerably increased driving instructions. If you follow the route given, the system works very well. If you do not, you will soon want to through your phone out your car window.\nI have used each phone\u0026rsquo;s direction solution to \u0026ldquo;find\u0026rdquo; my way to work. Due to heavy construction, the fastest route is not obvious. This is a good way of figuring out how annoying GPS software will be, by driving in a manner that it considers idiotic.\nMy first day was with Android 2.3.5. I started Navigation, tapped Speak Navigation, and rattled off my work address. It parsed the address correctly. I deviated from the proposed route no less than ten times. When I went off route, the phone didn\u0026rsquo;t utter a peep, it just recalculated a route faster than any mapping solution I have ever used. Voice prompts were there when needed, but not annoying at all. After determining that the routing works as well as TeleNav, this would be my preferred navigation solution on Android. TeleNav give you a speak destination option, but it does not parse the speech to text as well as Navigate. If you want to use TeleNav for the routing, you can let Navigate hear your location then select which you wish to use for GPS routing.\nMy second day was with Windows Phone 7.5 beta. I started Maps and tapped the directions arrow, then typed in my work address. Then I started navigating. No voice destination is available in Maps or TeleNav. The routing looks fine. Now I go off route. My phone tells me that I have gone off track and I can tap the screen to reroute. Excuse me? I have to tap the screen to reroute? Whoever came up with this idea is the same guy who puts 2 \u0026ldquo;Are you SURE you want to close this App?\u0026rdquo; dialogs, when you just want to get out of the program. So I held the phone in my hand, because I knew I would have to tap the screen after each mile or so leg, when it thinks I should get \u0026ldquo;back on track\u0026rdquo;.\nI wound up turning off Maps about halfway to work, to keep me from throwing the phone out the window. A complete and utter usability failure.\nAndroid wins this round. Still not sure if it is enough to get past the complete ease of use failure that is the Android system in general, so I\u0026rsquo;m still using both.\n\u0026hellip;and still missing webOS.\n","date":"7 September 2011","externalUrl":null,"permalink":"/blog/2011/09/07/encoding-videos-for-the-hp-touchpad/","section":"Blogs","summary":"","title":"Android vs Windows Phone Navigation","type":"blog"},{"content":"","date":"7 September 2011","externalUrl":null,"permalink":"/tags/navigation/","section":"Tags","summary":"","title":"Navigation","type":"tags"},{"content":"The \u0026ldquo;Mango\u0026rdquo; update for Windows Phone, or version 7.5 for those less fruity, adds many features. This article is dealing with the podcasting capabilities. On webOS, I made daily use of a brilliant piece of software called drPodder. Moving from this almost clairvoyant app to the integrated podcast ability of Windows Phone is quite jarring.\nI will be outlining the current successes and fails with Windows Phone which keep it from being an enjoyable podcasting experience.\nAdding podcasts # Adding podcasts from the device is only possible by searching the Zune podcast library. If the podcast does not exists in the library, you cannot add it from the phone. If you have an obscure podcast, you can add an rss feed through the Zune desktop software. Not at all ideal, but it does work.\nPlayback Order (Win) # When setting up a podcast, you can specify the number of episodes you wish to download to the phone at a time and the order (oldest or newest first.) This makes sense. Some podcasts are episodic and it would be confusing to listen to them in anything but chronological order. News podcasts might make more sense to listen to the latest first and the older if you have time.\nBut what happens when you want to listen to them from oldest to newest for a podcast that has been out for years? That brings us to\u0026hellip;\nEpisode Management (Fail) # I listen to many podcasts that have been around far before Windows Phone was a twinkle in a cell carrier\u0026rsquo;s eyes. So I setup a new podcast that I am up to episode 107 on my current device. I listen to it oldest first and set a sync of 3. My Windows Phone will download Episodes 1, 2, and 3. Then I can tap hold and mark as read. However, I cannot do this until the episode is downloaded. So the process of catching up is to download each episode and mark it as read.\nTap and hold an undownloaded, unplayed episode should have an option to mark as played. Ideally, there would be some functionality to \u0026ldquo;catch up\u0026rdquo; and mark all as played. This would be more useful in a majority of cases when you are transitioning from a device where you have been a loyal listener. If you set all to read and then have to reset the last 2 or 3 to unread, this is still a faster experience.\nVideo Support (Win) # The Windows Phone handles video podcasts very well. Playback is crisp in visuals and program performance and start up time. I don\u0026rsquo;\u0026rsquo;t see anything in video that is a problem, other than the problems also common to any style podcast in general.\nBookmarks (occasional Fail) # Podcasts are much longer than songs. It is not uncommon for them to pass 90 minutes. Most people won\u0026rsquo;\u0026rsquo;t listen to them at one sitting. The podcast player should remember time into each episode of each show to which a listener has progressed.\nBookmarks seem to work as expected in video podcasts. However, I have had mixed results with audio, with many times getting no bookmark. Instead of a complete oversight, which I originally assumed, it seems to be bugs in the process. What I am running is still beta code, so we will have to wait to see if this is addressed in the version of Mango sent down to phones. If you play from the main screen and are careful to pause, it seems to work. Time will tell.\nA2DP Bluetooth Support (Fail) # While Bluetooth support on Windows Phone is woefully lacking, the A2DP profile seems to work perfectly for any audio only component. When you bring video into the mix, nothing you do will make audio stream through your Bluetooth device. This affects video podcasts along with all video on the device, including YouTube, local videos, and Netflix.\nIf you will watch no video on the phone, you will find A2DP to satisfy you. But with only partial support, you have no choice other than to use wired headphones if you consume any video at all. This makes A2DP worthless.\nStreaming (Win) # If you want to listen to an episode that you have not downloaded, no problem. Streaming the episode worked great for both audio and video playback. As long as you used those wired headphones for the video, that is.\nControl from Other Apps (Win) # While Windows Phone is not anywhere close to the multitasking that was enjoyed in webOS, they control of audio playback while moving around other apps works well. If you at inside another application and wish to pause playback (or other controls, such as skipping a track) you simply hit either volume button. The first touch of a volume button does not change the volume, but drops down a media control panel. From here you can pause and go forward or back.\nSummary # After getting past the pain of catching up all the shows, it should work fine for steady state listening. Heaven help me if I ever get behind again and just want to catch up. I\u0026rsquo;ll be using this for my daily podcasts for a while and see how it goes. Sure wish I could get my missing podcasts back though.\n","date":"7 September 2011","externalUrl":null,"permalink":"/blog/2011/09/07/windows-phone-podcast-experience/","section":"Blogs","summary":"","title":"Windows Phone Podcast Experience","type":"blog"},{"content":"I\u0026rsquo;ve decided that I\u0026rsquo;ll be exploring both Android and Windows Phone as possible replacements for my nearly dead Palm Pre. HP killed future hardware and we need phones, bad. I purchased an HTC Arrive off eBay, slightly cheaper than I would get it from Sprint under contract. I\u0026rsquo;ve been using it as a WiFi only device for about a week. Wednesday night, I upgraded it to the developer\u0026rsquo;s release of Mango, the future update for Windows Phone. Last night, I added this phone to our third \u0026ldquo;testing\u0026rdquo; line on Sprint.\nThis article will detail the pain points that will exist on doing a webOS to Windows Phone (and specifically the HTC Arrive) transition. I will also highlight the cool things I see that aren\u0026rsquo;t possible on webOS (at least Sprint available webOS phones).\nMultiTasking vs MultiPausing # webOS is still the best multitasking platform for mobile, full stop. Windows Phone acts much like iOS, where apps are put into a pause state and resumed when reloaded. The Arrive has three \u0026ldquo;soft\u0026rdquo; buttons on the front for Back, Windows, and Search. These are needed to navigate and annoying at the same time. I can\u0026rsquo;t tell you how often I accidentally tapped search and was bounced into Bing search. Then a Back tap resumes where you were in a variably amount of time, depending on the app.\nIn the development documentation, there is a term for preparing your application for this pause: \u0026ldquo;Tombstoning\u0026rdquo;. Sit there and act dead and I\u0026rsquo;ll let you know when you can come out of the coffin. Mango supposedly has faster resume, but like the iOS transition a short while ago, the apps must be coded to use this for a faster resume. Most I\u0026rsquo;ve used have not been updated.\nHolding the back button takes you to a similar view as card mode on webOS. This isn\u0026rsquo;t nearly as nice, but I can work with it. The cards will be a list of the last 5 (or less) apps that you have opened. You will always start at the right and can swipe to the left in chronological order. webOS this sure isn\u0026rsquo;t, but I can deal. It isn\u0026rsquo;t as bad as I expected it would be.\nNotifications # This is another feature where webOS tops the mobile space. Others are getting close, but not there yet. Windows Phone uses live tiles on the home screen to display some of this information. However, there is not one place to go to see all that has happened. I can live with Windows Phone version, but it is vastly inferior. The unlock screen shows many of the \u0026ldquo;notifications\u0026rdquo;, which is slightly like the locked display on webOS.\nCalendars # When my wife and I purchased our webOS phones, over two years ago, we started expanding into the capabilities of webOS Synergy. I use a work Exchange calendar, Google personal, and my wife used two Google calendars for work and personal. All of these show up on my Pre with no effort other than linking my Google account. This is not the case with Windows Phone. It is not even possible to see multiple calendars for one account in the current release of Windows Phone. When I upgraded to Mango, this was possible, but only after a hack that I detailed in this article.\nSince you only have to do this once, I call the Calendar a draw (once Mango comes out, that is.) webOS has a few nicer features, but Windows Phone is 5x faster in getting through the info.\nTouchstone # The wireless charging setup for webOS phones and tablets is something that isn\u0026rsquo;t thought about, until you are plugging cabled into phones for the first time on two years. I have my Pre sitting right in front of my keyboard on a Touchstone, right now. When I leave my desk area, I just scoop it up. It is there to tap songs or quickly look at notifications. Just a handy setup. This will be missed.\nPodcasts # I have used drPodder for webOS, since early betas. It is a great app with the ability to download podcasts directly from your phone or stream them. It supports audio and video, as well as some advanced renaming features. The negatives of using drPodder are all related to the error filled media playing implementation of webOS 1.4.5, where my Pre is stuck. I just expect the last 6-10 seconds of a podcast to get cut off. It just happens. Starting a podcast playing back (even a downloaded one) can take up to 10 seconds. If my Pre starts getting hot for some reason, playback slows to 80% speed. But drPodder makes listening to and managing podcasts a breeze. After playing, the file can be auto deleted. You can play from bottom or top (oldest to newest or reverse).\nMango has added podcasts directly into the Zune media system. I was able to find a majority of the podcasts I listen to in the directory. I am not used to the immediate response of the software, when lags where just part of the game with webOS. The current setting is to download audio and video only when WiFi is connected, but this is configurable. I cannot find a way to manually add an RSS feed to a podcast not in the Zune directory. So immediately, I\u0026rsquo;m missing 3 of my normal podcasts.\nYou have options of how many of each podcast to download, if you should get oldest or newest first, and if you should play them from oldest or newest. So it seems to replace most functionality of drPodder. But not so fast.\nSome of the podcasts I listen to are nearly 90 minutes. I almost never listen to them at one sitting. On webOS, drPodder just keeps my last place and when I start that episode again, I\u0026rsquo;m just slightly before when I stopped. If I leave the podcast in Zune player, and go back to it in the future, I\u0026rsquo;m right back at the beginning. This has got to be a joke, right? They aren\u0026rsquo;t bookmarking audio podcasts? It looks like they are handled just like songs. This is a complete and utter fail and makes audio podcast listening impossible on the device.\nNow for video podcasts, they are storing the position for each one. I can pause 4 different episodes of a podcast, 3 different ones of another, and all will restore at the correct position. So I have to download video versions of the podcasts that have them and listen to that on my drive into work, when I will never be looking at the video. Have I been spoiled too much by drPodder?\nPodcasting on Windows Phone is a fail.\nVideo Playback # Be it video podcasts or video files that you loaded on the phone via Zune software (which encodes them), they all play great. However, I have not been able to figure out how to make sound for Video come out over A2DP headsets. Audio works great. However, once you start a video, it either comes out of the speaker or wired headphones. I\u0026rsquo;m not sure if this is an HTC Arrive fail or a Windows Phone issue in general. Why isn\u0026rsquo;t audio just audio. Just when I thought that I could used the video versions of a podcast to get past the bookmark issue, now I can\u0026rsquo;t use A2DP headphones for that. You seriously have to be kidding me. This is a major annoyance and needs to be addressed.\nWeb Browser # There is no way to describe the web browser in current Windows Phone, other than crap. It was really bad. The Mango update essentially loads IE9 onto your phone. While this is still a step back from the Chrome or Firefox that I\u0026rsquo;m used to on the desktop, it is a decent mobile browser. ACID3 test jumps from a 12 to a 95, between current WP and Mango. For most browse ability, the Windows Phone wins over my old Palm Pre. This is a combination of screen size and processor speed. However, there are sites which my Pre can open that Windows Phone Mango will not. For getting something done all over the web, webOS still wins here. For most use, the speed of the newer phone and clean OS is on top.\nCamera # If the Pre3 was released, I think this would be equal or slightly into webOS for functionality. Video editing on the Pre is pretty cool. However, my Pre cannot shoot a clear shot closer than 8 inches. Scanning barcodes with the phone? Don\u0026rsquo;t make me laugh.\nThe Arrive has a 5 MP autofocus camera, which allows me to shoot as close as 2-3 cm. Dedicated camera button that never seems to freeze for up to 20 seconds when I want to load it, as my aging Pre will do occasionally.\nThere is also automated uploads to SkyDrive (Microsoft\u0026rsquo;s cloud storage) if you desire. This is a hands down win for the HTC Arrive and Windows Phone. The uploads to Facebook and other upload features that a almost never using on the Pre are also available here.\nApps # The Windows Phone Marketplace isn\u0026rsquo;t iOS or Android level yet, but there are Apps. More and better games than available for webOS. The one missing app that I hope they get soon is Pandora. I have gotten used to listening to a mellow mix over A2DP headphones while I work. This will be missed.\nYou know one app that is pretty cool? Netflix. Streaming on my phone. Oh, yeah. These are the things that may push past any of the pain. The real apps we have been waiting for on webOS for two years. While there are some missing innovative apps that are unique to webOS, Windows Phone is walking to the finish line to win on this one. They have the apps that I hoped HP scale would bring to webOS.\nBing Search # Does Windows Phone have an app to identify songs? Yes, but with Mango it is baked into the OS itself. (This is also why Shazam has upped their price to $5.99 for Windows Phone, as they will be obsolete when the Mango update pushes out.) To search for music in Mango, tap the search button and tap the music icon at the bottom. Then let the phone listen. It does a decent job identifying music, with a link to the Zune marketplace if you want to purchase it.\nThey also have visual search, that allows you to photograph text with the camera and translate it into other languages, or pull up QR code, Microsoft Tags, UPCs for books, CDs, DVDs. It isn\u0026rsquo;t perfect with the text, but better than I expected.\nYou also have voice search. This works amazingly well.\nSpeech to Text and Text to Speech # I\u0026rsquo;m interested in trying this out on Android, as Molly Wood indicated that she uses it in more places than just searching. However, I found it very useful. If you hold down the windows key, you activate voice mode. I may say: \u0026ldquo;text Amy\u0026rdquo;, it will respond with which of my wife\u0026rsquo;s numbers I should text. I say \u0026ldquo;Google\u0026rdquo; for her Google Voice number. It then says \u0026ldquo;Texting Amy Sacher\u0026rdquo; and goes to the SMS composition mode. Then I say what I want to text. It gets it down fairly accurately and reads it back to me. I can say \u0026ldquo;Send\u0026rdquo;, \u0026ldquo;Try Again\u0026rdquo;, or \u0026ldquo;Cancel\u0026rdquo;.\n\u0026ldquo;Open\u0026rdquo; followed by any installed app name works to start up that app. \u0026ldquo;Call\u0026rdquo; followed by a phone number works as long as you say each digit and don\u0026rsquo;t call 18 \u0026ldquo;eighteen\u0026rdquo; instead of \u0026ldquo;one, eight\u0026rdquo;. If it doesn\u0026rsquo;t recognize a valid verb noun combo, it will bing search for the text you spoke. This blows away the functionality that I\u0026rsquo;ve played with on the Pre2.\nTrial Version # Windows Phone apps allow trial versions. This would be fairly simple to hack around in webOS and is possible, because the apps are compiled. I have tried many apps and it keeps be from buying bad apps, which is have done many times on webOS. This is good for keeping the collection of apps strong. If you try 3 apps to provide one service, download all the trials. Then buy the one you like, but review all three. This will reward good developers.\nI\u0026rsquo;m downloading all the trials of Instapaper apps right now. Let the best app win.\nTethering # Of all the features that I use on my webOS phone, tethering for free on Sprint is the most needed, due to now having the Touchpad. This is easy on both webOS and Android. I\u0026rsquo;m not sure if this is possible with the HTC Arrive and Windows Mobile, yet. I believe some type of tethering will be available with Mango, but if you can do it without the extra fee is yet to be seen. This may be the deal breaker that takes me to Android. But comparing webOS to Windows Phone, webOS knocks it out of the park.\nHomebrew # There is no debate on this one. webOS homebrew is the only thing that kept people on webOS in the dark days (1) before HP acquisition. It is also how people are staying on webOS with FrankenPre2s and other methods of staying on their carrier and getting through the dark days (2) after the HP cancellation. There is not a more open system than webOS, period.\nGetting Files on Device # There is no USB mode for Windows Phone. Like iTunes on iOS, you go through Zune. This is annoying. The only other real option is going through SkyDrive. This worked to edit an Office document on the phone from SkyDrive and push it back up there.\nWith webOS stock, you can connect your phone to your computer as a USB drive. Copy either way. All good. With a little WebOSInternals, you can SSH into the phone and SCP files with the phone just being on the same network. This is an easy webOS win and I have many \u0026ldquo;work arounds\u0026rdquo; to learn if I will be staying on Windows Phone.\nDevelopment # While this doesn\u0026rsquo;t affect strictly users, I see the development environment for each platform pretty well matched. There are cool things that webOS does where Windows Phone can\u0026rsquo;t match, and vice versa. We are still waiting for mic access and other hardware access on webOS. Both platforms are much nicer than trying to develop for Android. I\u0026rsquo;m looking into MonoGame to port apps to Android, iOS, Mac, Linux, and possibly webOS, in addition to the native support on Windows Phone, Windows, and XBox.\nThere is also a fun little scripting app on the phone called TouchDevelop. This exposes most if not all the phone\u0026rsquo;s capabilities for your little mini programs. I made a 4 line program that prompted me to talk, converted Speech to Text, then used Text to Speech to read it back to me. I\u0026rsquo;m sure I\u0026rsquo;ll mess with this more.\nConclusion # The only part that I will have trouble working past is if I can\u0026rsquo;t get tethering on my Windows Phone. I will be getting an Android phone via our two year upgrade discount, to test that platform as well (most likely a Nexus S). No conclusions what platform I\u0026rsquo;m landing on yet, still much more research to be done. Unlike webOS, the hardware is solid. Performance of individual apps blow away my aging webOS hardware. However, there are software fixes that are still needed. Since Mango will not hit for a month or more, these will be a while in coming.\n","date":"2 September 2011","externalUrl":null,"permalink":"/blog/2011/09/02/webos-to-windows-phone-whats-missing/","section":"Blogs","summary":"","title":"webOS to Windows Phone - What's Missing?","type":"blog"},{"content":"","date":"11 August 2011","externalUrl":null,"permalink":"/tags/calendars/","section":"Tags","summary":"","title":"Calendars","type":"tags"},{"content":" With webOS, Synergy just happened. (OK, it didn\u0026rsquo;t just happen. Many engineers spent many hours making this work seamlessly. But to the user, it \u0026ldquo;just happened\u0026rdquo;.) You don\u0026rsquo;t realize how nice this is, until you try a system that doesn\u0026rsquo;t really have it. Windows Phone 7 with NoDo (the current \u0026ldquo;up to date\u0026rdquo; version for the public) has this problem. The update due out September or October called Mango (or Windows phone 7.5) enables more Synergy like features, such as multiple calendars. However, Google doesn\u0026rsquo;t allow you to select more than one. But there\u0026rsquo;s a hack for that.\nFor most Windows Phone 7 users who are waiting for the Mango release, this won\u0026rsquo;t be useful yet. But you can go through the steps if you want, and it will magically show all your Google calendars when you get the OS update.\nGoogle is only selecting the primary calendar to sync to your WP7 calendar. In my situation, I have an Exchange Work calendar and a Google Personal calendar. Both of those showed up with WP7 NoDo. What was missing is my wife\u0026rsquo;s Google Work and Personal calendars. Here is how I enabled them.\nGoogle will allow you to configure the calendar to sync if it believes you are an iOS device. If you have access to an iOS device (iPhone, iPad, iPod Touch, etc.) you can use those to do this. Otherwise, we will just fake it.\nTo fake an iPhone, I used Google Chrome. You will want to start up the browser on the command line. So open up a Command Shell and cd (change directory) into the proper directory for chrome.exe. If you don\u0026rsquo;t know where this is, right-click on the shortcut in Windows and select Properties.\nYou will need to close down any Chrome browsers you may have open before you do this. We will paste the following into your command prompt to start Chrome as an iOS device.\nchrome.exe --user-agent=\u0026#34;Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7\u0026#34; Browse to http://m.google.com/sync. You should see something similar to this.\nClick on WindowsPhone and you will see your calendars.\nNotice only your main calendar is checked. No problem, check the others. But that doesn\u0026rsquo;t work. Google has blocked this with JavaScript. We just need to turn JavaScript off.\nClick on the wrench icon at the top right of Chrome and select Options. Now click Under the Hood on the left. Click the Content Settings button. Change JavaScript section to not allow any site to run JavaScript:\nNow you will be able to select the other calendars and click Save.\nGoing back to your Mango phone, you should be able to sync and see all calendars. Just remember to reselect JavaScript.\n","date":"11 August 2011","externalUrl":null,"permalink":"/blog/2011/08/11/multiple-google-calendars-on-windows-phone-mango/","section":"Blogs","summary":"","title":"Multiple Google Calendars on Windows Phone (Mango)","type":"blog"},{"content":"This post is for those who have ripped their DVDs and other video media and would like to load it onto their HP Touchpad. I started to encode videos for the HP Touchpad using HandBrake, which had given me success for video targeting my Palm Pre. I used iPad profiles, as the display size is exactly the same. It seemed that no matter what I tried, the files would not show up in Photos \u0026amp; Videos app. I tried quite a few options and then just gave up. Many issues that I had with encoding video for the Touchpad seem to have been fixed with the 3.0.2 webOS update.\nThe too long didn\u0026rsquo;t read version of this post is this: Download HandBrake, render using the iPad Preset and change frame rate to Same as Source. Upload to Touchpad and be happy. If you care about some of the testing I did, continue reading.\nI started with a high end HD video file, to take advantage of the full resolution of the Touchpad. The video I played with is a BluRay version of Pixar\u0026rsquo;s Partly Cloudy. This is a 1080p video (1920x1080), with 5.1 channel AC3 sound (48 kHz and 16 bit). This is most likely the highest video quality source that people will use for Touchpad encoding. Runtime is 5:48 with 23.976 frame rate.\nTwo pieces of software I used are Format Factory (now a dead link) and Handbrake (Windows, Mac, Linux. Tested on the Windows version).\nFirst render was in Format Factory with the iPad setting at 720x480 MPEG4. This rendered slightly faster than I had been seeing with HandBrake. There is a noticeable quality loss with stretching the 720 out to the Touchpad\u0026rsquo;s 1024 width, but the video is very watchable. If you did not have a 1024 width video to compare it to, you would not see an issue. File Size 47.0 Mb\nI took the same iPad setting and bumped the resolution to 1024x768, keeping all the other settings the same. What surprised me is the file size dropped to 46.6 Mb. Looking closer, I noticed that the video bit rate is fixed at 1000 kbs, rather than using HandBrake\u0026rsquo;s quality style setting.\nHandBrake has a video format for the iPad at 1024 width with aspect ratio set height (but steps width down to source video width if smaller than 1024). The only change I made before I ran this encoding was to set frame rate as Same as Source. (It was defaulted to 29.97.) The encoding takes longer than Format Factory (1.1-1.4x). The file size came out to 69.8 Mb.\nWhen you look at both 1024 wide videos on the Touchpad, you can see the difference between Format Factory\u0026rsquo;s 1120 kbs data rate and HandBrake\u0026rsquo;s 1672 kbs data rate. There was quite a bit of motion blocking artifacts with FF\u0026rsquo;s encode. The added time to render due to detecting quality of the frame dynamically is worth it.\nI upped the Format Factory setting to use 1500 kbs video data rate (for similar to HandBrake\u0026rsquo;s total data rate) to do an apples to apples comparison. File size came out to 67.9 Mb, so pretty close.\nWhen looking at the two on the Touchpad, they are very hard to tell apart most of the time. The biggest issues is with horizontal streaking on single color backgrounds for the Format Factory version. By going with a fixed bit rate, rather than the HandBrake\u0026rsquo;s quality based setting, you also get blocking during highly changing scenes. HandBrake will use less data during the static scenes, but more during dynamic scenes, resulting in a better encoding at the same overall file size.\nI rendered some of the files that I have ripped from my DVDs (most 640 x proper aspect ratio height) through HandBrake, using the iPad profile. These play great. The Touchpad had no issues with m4v or mp4 file extension for the H.264 MPEG 4 files these apps were generating. It will not display the Xvid based MPEG4 files that I have encoded for use with my media players and Boxee Box before H.264 was the standard.\nWatching video on the Touchpad just reminds you how great the audio on this thing sounds. Really a good video viewing experience. Do some transcoding and enjoy your moving picture shows.\n","date":"10 August 2011","externalUrl":null,"permalink":"/blog/2011/08/10/encoding-videos-for-the-hp-touchpad/","section":"Blogs","summary":"","title":"Encoding Videos for the HP Touchpad","type":"blog"},{"content":"","date":"10 August 2011","externalUrl":null,"permalink":"/tags/touchpad/","section":"Tags","summary":"","title":"Touchpad","type":"tags"},{"content":"","date":"10 August 2011","externalUrl":null,"permalink":"/tags/video/","section":"Tags","summary":"","title":"Video","type":"tags"},{"content":"","date":"6 August 2011","externalUrl":null,"permalink":"/tags/ebooks/","section":"Tags","summary":"","title":"Ebooks","type":"tags"},{"content":"If you feel like following my hacking example to load .mobi format books onto the Touchpad\u0026rsquo;s Kindle App, be ready to have to reload it. If the app has a problem parsing the book for any reason, you are done. With no back gesture on the Touchpad, there is no way to back out of the crashed book load. Each time you start the app, it will load the file into a crash situation. (This doesn\u0026rsquo;t crash the Touchpad, just the app.)\nThe solution is to delete the Kindle App and redownload. I\u0026rsquo;m poking in the source to see if there is a clearer way to test books against the hybrid components that parse the ebook files, without requiring this tedious reload. You have been warned.\n","date":"6 August 2011","externalUrl":null,"permalink":"/blog/2011/08/06/unrecoverable-problems-with-kindle-app-on-touchpad/","section":"Blogs","summary":"","title":"Hacking can be bad for your Kindle App's Health","type":"blog"},{"content":"While there is no doubt that software for the HP Touchpad is in its infancy, it is hard not to see the great usefulness and potential. There are a few good writing apps for the Touchpad, including those for WordPress blogging. I\u0026rsquo;m composing this in the WordPress App for WebOS tablet. Any of these are much easier to use with a hardware keyboard, than attempting to type quantity on a virtual keyboard. The HP Touchpad Keyboard is mostly a success. My largest annoyances with it can be addressed with software fixes in future WebOS updates.\nAt first I expected the chicklet keys to be annoying, compared to a full sized keyboard. It was surprising to me that they were not. The keys depress quickly, to give a feeling of depth, before stopping. I have no trouble typing as fast as I would on my laptop.\nThe Good # I am listening to music on the Touchpad as I type. When a song pops up that I\u0026rsquo;m not enjoying, I tap the FF button at the top of the keyboard and keep going. This is more handy than I expected, as most media keys on desktop keyboards have gone unused by me. Possibly it is the feeling that the Touchpad is just the monitor and you want to do everything on the keyboard as you are working. It works for me.\nI like the WebOS specific keys. In addition to being a very functional keyboard, it integrates well with WebOS for control of power, volume, playback, brightness, show/hide for virtual keyboard, immediate jump to Just Type, and dedicated \u0026ldquo;card view\u0026rdquo; button. Of these, Just Type is amazing. I\u0026rsquo;m typing something and think, \u0026ldquo;hmm, I wonder about subject x\u0026rdquo;. Tap the magnifying glass button above the 1 key, type \u0026ldquo;subject x\u0026rdquo; and tap enter. A web page with the Google search pops up. (Before writing this, I had no idea that Subject X was a character in a Marvel comic book. Learn something new every day.)\nThis article will have many points in the Bad and Ugly category below. This doesn\u0026rsquo;t mean that it isn\u0026rsquo;t a good keyboard. For the most part these failings are software that I hope are addressed in future WebOS versions. The hardware is good enough to make this a great keyboard experience with the right supporting code.\nThe Bad # Two hardware design issues can be seem by just observing the keyboard before even using it. These don\u0026rsquo;t detract terribly from the use of the keyboard, but if it isn\u0026rsquo;t intuitive or obvious, it is usually a design fail.\nFirst, there is no indication of how to change the batteries. Without reading the instructions, I did not know how to slide the battery cover. A simple arrow on the cover would completely solve this issue. The battery life is supposed to be good enough that batteries last for months. We won\u0026rsquo;t have the instructions by then, I hope I remember which direction to slide the cover.\nSecond, the power switch has two settings: black and slightly whiter black. It is difficult to know which setting is \u0026ldquo;on\u0026rdquo;. This goes away with training of what is the right direction, but a product should be designed to be able to be picked up and used. These problems could be fixed with a new battery cover, adding a 1 and 0 icon for power and the cover removal arrow.\nI\u0026rsquo;ve run into unintended key repeats twice in about 3 hours of typing. I was typing the word \u0026ldquo;most\u0026rdquo; and got mooooooooooost instead. This could be either a hardware or software problem. It doesn\u0026rsquo;t really feel like the key contacts are sticking, but it would be possible under the key without me seeing it. It would also be possible for the software to be hanging for just a bit.\nThe Touchpad has two styles of correction for words it thinks are wrong. First, if it is pretty sure that you are wrong and it knows what is right, it will do an auto correction. This replaces the word you typed with the \u0026ldquo;correct\u0026rdquo; one and underlines the word in gray. The second method is when the correct fix is not known, so the incorrect word is left underlined in red. The user may tap that word and select the correction or enter it into the dictionary if the word typed was actually correct.\nWhen a word is auto corrected and what you typed is correct, you press Delete and the original is restored. That is a great idea, but is only effective if you are a slow typist. With the Bluetooth keyboard, you are into the next word before you realize that it made a correction. After you have typed a new letter, you can no longer correct it quickly with Delete. You must delete the letter(s) you typed, delete the gray underlined word, retype the word, hit space, hit delete to undo the auto correction which will happen again, hit space again and continue. Optionally, you can tap the gray underlined word to restore the original word, but this takes you off the keyboard so it totally depends on the length of the word as to which is faster. This restored word will be underlined in red, so tapping it and adding to the dictionary will eliminate the problem with this word in the future. Otherwise the Touchpad will continue to replace it each time it is typed.\nYou do have the option of disabling Auto Correct in the Text Assist App in Settings. I disabled it while typing the last two paragraphs and made enough mistakes it would have auto corrected, that I lost time over what I saved fixing \u0026ldquo;good\u0026rdquo; words. I have it back on and will leave it that way. As you train the dictionary to the vernacular you use, this will be less and less of an issue.\nThe Ugly # WebOS is an elegant OS. That is part of what draws people into it. The operation is intuitive and clean. Sadly, this stops when a keyboard is introduced. There is a card view button, but you can\u0026rsquo;t do anything with it. It only saves you an up swipe. Here is how it should function:\nTap the card view button. Press left or right arrow to select different cards. Tap Enter or Down Arrow to bring the card to full screen. Maybe Control+Up would close the currently selected card. Nice. Elegant. WebOS-like.\nThe Just Type search key is great. From anywhere, I can jump to a system wide search. Then it fails to be like WebOS on the keyboard. Here is how it should function:\nTap the Just Type button. Type what you want to search. Then the Up and Down keys allow you to select different options from the default. Then press Enter to go to the one you selected. This is a situation where two key taps on down would be faster than reaching over to tap the screen. And to blow our minds with usefulness, how about Control+Left or Right to switch between All, Contacts, Content, or Actions. That would be awesome. Elegant.\nThe biggest of the ugly is the lack of expected functionality of the keyboard while you are typing. I ran into this over a dozen times and it makes using the Touchpad for final editing a frustrating experience.\nSelecting text should be possible by holding down Shift and using arrow keys. This works exactly as it should when you are either in a text area that has less than a screen full of text in it or is scrolled to the top of the text buffer. If you are in the middle of a multi screen document and try a selection with either Shift+Left/Right or Shift+Up/Down, you get a little highlighted and then the screen tries to scroll up or down with every arrow key push.\nI just deleted 6 words and retyped them, because I couldn\u0026rsquo;t do a Cut and Paste quicker. That is a big fail. It is unusable. I must resort to the tap and hold, tap Select, drag edges to region and Cut or Copy, so I only do this for sentence length or longer text sections.\nThis leads me into the second problem with productivity while editing on the Touchpad. Copy and Paste. Why doesn\u0026rsquo;t Control + X, C, and V function? It is inexcusable on a business class device that will be used for document editing. I have used it over a dozen times editing this post and follow it up with having to use the slower methods of the touch screen, as I remember that it doesn\u0026rsquo;t work. It is almost subconscious for anyone that has done editing on the computer. It is THE WAY to copy and paste if you are using a hardware keyboard, full stop. Fix this, HP.\nSo, there you have it, The Good, The Bad, and The Ugly of using the HP Touchpad Keyboard to actually do work on the Touchpad. In its current state, it is great for getting thoughts down. However, doing the final polishing is painful. I forced myself to use the Touchpad for this entire article. In reality, I will be switching back to the laptop for any final editing until the two major text editing issues are addressed, unless I don\u0026rsquo;t have a choice.\n","date":"6 August 2011","externalUrl":null,"permalink":"/blog/2011/08/06/hp-touchpad-keyboard-good-bad-and-ugly/","section":"Blogs","summary":"","title":"Touchpad Keyboard - Good, Bad, and Ugly","type":"blog"},{"content":" I have purchased many ebooks and created others manually in the .mobi format. This is very easy to load onto my Kindle device to read. Unfortunately, the current Kindle app on the Touchpad does not allow loading ebooks other than downloading from Amazon. This is unfortunate and makes the Touchpad a poor replacement for my Kindle.\nI did not know if the Kindle App on the Touchpad could even handle .mobi format files, if I could get them there. Amazon purchased MobiPocket and their original ebook format was only slightly modified .mobi file. I assumed that the reader plugin would understand the .mobi format and I was right.\nThe books for your Kindle app are stored in the /media/internal/.palmkindle directory. The book files have strange names such as B000JMLFLW_EBOK.azw. I\u0026rsquo;m not sure if this is the same on each device for a given book, but I would assume so. Best guess is that it is just the primary key for that book in Amazon\u0026rsquo;s DB. This is the file for a free book of Pride and Prejudice by Jane Austen.\nThere is a subdirectory holding the cover images, called appropriately \u0026ldquo;coverCache\u0026rdquo;. Inside there, you will find up to three files of the format: B000JMLFLW-[small|medium|large].jpg. Large does not exist for all books. Large is 333x500, Medium is 120x180, and Small is 52x78.\nI decided to try a copy of John Ringo\u0026rsquo;s When the Devil Dances that I had purchased from webscription.net. I replaced the original B000JMLFLW_EBOK.azw with the .mobi format of that book using the same name. Then I saved images for all three sizes with the same prefix. When I ejected the Touchpad, the ebook loaded correctly, but the cover image did not change for the thumbnail style of books display. When I changed to a list view, the image was correct. I had not gone into list mode before, so I am guessing that caching is used to only load images once. This makes sense, as the book cover is not a rapidly changing asset.\nAt this point I rebooted, to try to uncache the cover image. This worked. I now had a book that looked correct in the thumbnail view.\nTapping on the book loaded When the Devil Dances with an expected title up top of Pride and Prejudice.\nThe book had no issues being read. So all that is needed is updating the book database to correct the title. That would complete the hack. I have no idea how this will interface with Amazon syncing for distance read. I have turned off syncing before I started messing with this to keep from \u0026ldquo;mucking things up\u0026rdquo;.\nWhat this proves is that sideloading non-Amazon sourced books should be fairly trivial to add to the Kindle App. It would just require updating the database to show the new books and loading a .mobi file and cover images. Amazon doesn\u0026rsquo;t want to.\nPlease read this warning if you plan to attempt this.\n","date":"5 August 2011","externalUrl":null,"permalink":"/blog/2011/08/05/loading-mobi-books-into-touchpads-kindle-app/","section":"Blogs","summary":"","title":"Loading mobi books into Touchpad's Kindle App","type":"blog"},{"content":" I have just spent the last 30 minutes trying to get our complex 64 character WPA key into my HP Touchpad so I can start the setup procedure. The password field for the WiFi key is frustrating.\nThe last character is only shown for a second or two, then it too fades into the dots of obscurity. This is fine in normal use with passwords you are used to typing, but a WiFi key is complex and entered only once per new device.\nWhen you add to this a finiky WiFi network acceptance, you have time after time frustration. The key is entered and network selected (even with a check mark!), but for some reason the Touchpad won\u0026rsquo;t accept anything but Cancel.\nGuess who gets to type the key in again?\nI finally figured out how to view a key as I enter it and validate the key, so I can be sure the passcode part of the network acceptance is valid. If I had done this the first time I started to enter our complex key, I would have only had to type it once and been able to verify it easily. Typing 64 characters with only vision on the last one is a little too tough.\nHP, PLEASE make an option to show the passcode. All you have to do is change the enyo options of the text box. Entering a passcode for WiFi should not be this hard. If it must be secure by default, put a check box that allows \u0026ldquo;Show Passcode\u0026rdquo;.\nHere is my work around:\nWhen you have the WiFi network selection open, tap on the \u0026ldquo;+ Join Network\u0026rdquo;. The image was captured before the Touchpad located any WiFi networks. Normally, you will see your network and possibly others above the \u0026ldquo;+ Join Network\u0026rdquo; option.\nThis will open a dialog that is normally used for you to enter the SSID of a hidden WiFi network. Instead, we are typing our WiFi passcode in plain text (oh, glorious plain text).\nYou can now see all characters and scroll back and forth to verify everything is correct (just tap and drag to the left or right.) When it looks good, tap and hold to bring up the Select menu. Choose Select All.\nNow with everything selected, tap and hold again for the Copy menu. Select Copy and you have your WiFi key in your clipboard. Tap cancel and select your WiFi network.\nTap and hold in the passcode field and you can select Paste.\n","date":"2 August 2011","externalUrl":null,"permalink":"/blog/2011/08/02/hp-touchpad-wifi-setup-hidden-passcode-hell/","section":"Blogs","summary":"","title":"Touchpad WiFi - Hidden Passcode Hell","type":"blog"},{"content":"July 1st is the day that many WebOS users have been waiting for. The day that HP releases their first WebOS tablet, the Touchpad. I preordered through Amazon and was delivered my own spanking new HP Touchpad tablet this evening.\nOverall it is an amazing piece of technology. Slicker than any Android tablets that I have tried, but not quite as polished as an iPad. However, for me the usability is far above an iPad, whose \u0026ldquo;multitasking\u0026rdquo; is a joke compared to the Touchpad.\nI\u0026rsquo;ve been typing this in the Wordpress app on the Touchpad. Now to see how to post it.\n","date":"1 July 2011","externalUrl":null,"permalink":"/blog/2011/07/01/hp-touchpad/","section":"Blogs","summary":"","title":"HP Touchpad","type":"blog"},{"content":"","date":"23 May 2011","externalUrl":null,"permalink":"/tags/electronics/","section":"Tags","summary":"","title":"Electronics","type":"tags"},{"content":" The AVR ISP II is a device to program an AVR microcontroller using a 6 pin header in a circuit. It does not contain any capability to power the circuit being programmed. This could be very handy.\nDave Jones at the EEVBlog has a video about adding power to the ISP cable, using an LM317 to provide both 5V and 3.3V. The issue with this, as he stated, was that the 5V source was very close to the required dropout voltage of the regulator to get the 3.3V. In addition, resistors are needed to set the voltage. This is my version of hacking on the AVR ISP II.\nI decided to use a Low Drop Out regulator for 3.3V. The specific part I used was the BD33KA5 in a TO252-3 package (pdf). I started by soldering the tab of the LDO 3.3V regulator to the shield ground on the USB jack. My new $50 Atten 858D+ hot air rework station made this much easier than an iron. I had tried and failed with the iron before the 858D+ arrived. According to the data sheet, I needed a 1uF on both Vcc and 3.3V output pins. I used some tantalums that I had around.\n3.3V LDO Regulator soldered to USB jack\nConnection from the 5V pin of the USB to the 3.3V voltage regulator\nI soldered the Vcc side of the regulator directly to the USB 5V pin and also soldered a 5V wire from the regulator back to the switch.\nI decided that I would use a DPDT ON-OFF-ON switch to allow for 5V - 0V - 3.3V output options. I used a double pole, instead of a single pole, so I could use the other pole of the switch to power little LEDs beside the 5V and 3.3V labels. This will give an indication to make it harder to accidentally power into a live circuit. I decided to mess with surface mount LEDs. This would turn out to be a mistake.\nPowering both the SMD LED indicators\nSMD LEDs were too delecate for me\nWhen I got the LEDs from DigiKey, they were tiny. Like, stick to your soldering iron when trying to solder tiny. Like, Joe you are going to snap them in half a couple times. I soldered the LED to a 1/4W resistor and a wire. This allowed me to test the power. For 2mA, these were pretty decent. I snapped one LED during this, but resoldered on another one.\nAfter messing around with soldering those to the switch and trying to bend the resistors into place, I snapped both of them. I think it might have been possible with thin wire and would have looked good. But I was done with this SMD stuff for now. :)\nI grabbed some 3mm red LEDs that I have had since I was in middle school. These let me also fix the one problem I didn\u0026rsquo;t think about. My SMD LEDs were crossed, so the light would be illuminated the opposite direction of the switch toggle. I crossed the hookup for the 3mm LEDs. I had to change the current limiting resistors from 1.5k to 220. I figured about 16 mA for these LEDs and it turned out about right. (I am running the LEDs directly from the 5V power.)\nWith 5V and 3.3V soldered to each side of one pole, I wired the center down to pin 2 of the ISP header. Now we can power it with 5V, 3.3V or Nothing.\nChange to 3mm LEDs\nISP Power connection on Pin 2\nI connected the AVR ISP II to the ISP connector on an Arduino Uno board. With no power, the ISP should work as normal, if you power the Uno board.\nI then tried the 5V power to the Uno board and that looked good.\nConnected to Uno but with power off\nPowering the UNO with 5V ISP connection\nPowering the Uno with 3.3V ISP\nFinally I thought the Uno might run on 3.3V, even though I don\u0026rsquo;t think you are supposed to use up to 16 MHz with 3.3V. I didn\u0026rsquo;t try programming, but the power definitely works.\nI\u0026rsquo;m not terribly pleased with the results of hot gluing the LEDs. It spreads the light too much. If I was to do it again, I wouldn\u0026rsquo;t try to cover around the LED, I would have put a dab of hot glue and stuck the LED into the glue. I did find out that the 858D+ rework air iron was again helpful to fix my glue mess. By setting the temperature down to the minimum of 100 C, I was able to remelt the glue and push the LEDs in deeper with a flat screw driver, without hurting the plastic case at all.\nAnyhow, it is a test device, so it doesn\u0026rsquo;t have to look good. It just has to work. Work it does.\n","date":"23 May 2011","externalUrl":null,"permalink":"/blog/2011/05/23/enhancing-the-avr-isp-ii/","section":"Blogs","summary":"","title":"Enhancing the AVR ISP II","type":"blog"},{"content":"My father fought cancer for decades. He was the strongest man I have ever known. It was hard to see him wither with a body not able to do what his will desired. His suffering finally ended during the early morning of April 20th. Despite knowing that the cancer was terminal and preparing for it. Death is never easy. It tears a hole through you.\nThe storm was heavy. No matter what I did, I couldn\u0026rsquo;t keep the ship from going down. Long weekends driving down to be with Dad and doing anything I could to make him more comfortable, but the storm just grew. The ship was groaning, in so much pain. Then, faster than I could imagine, the ship is in splinters and I\u0026rsquo;m awash in the sea.\nI\u0026rsquo;m drowning with the ship\u0026rsquo;s wreckage all around me. Trying to be strong and put on a brave face for the others floating with me, but the waves of grief come fast and are towering. I gasp for breath and hope to survive. There is a piece of wreckage that I grab. A physical thing or two, a picture, memories of a certain time. But all around me is wreckage reminding me of the beauty of the ship that was and now is gone. For a while, all I can do is float. Survive.\nThe waves are shrinking. I know they\u0026rsquo;ll be less frequent. Some waves I\u0026rsquo;ll see coming for birthdays or while doing something we did together. Some will surprise me, unexpectantly filling my mouth with water and making me gasp. But I know I\u0026rsquo;ll get through them. I know I\u0026rsquo;ll survive.\nWe all know that Dad is now reaping his reward, for years of service to the Lord. That makes it easier to handle. I never knew my dad\u0026rsquo;s dad and my namesake. He died when my father was in his late teens. It was up to dad to teach me of grandpa through himself and now I will have the task of teaching my unborn children of dad through me. I hope I\u0026rsquo;m worthy of that task.\nThe one sure way to get dad to do something was to tell him it is impossible. This is one of the best lessons dad taught me, that I could do anything. I might have to learn something first and the worst that would happen is I would fail. So what? What happens most often is I didn\u0026rsquo;t. In a world full of people scared to try, this was a great gift.\nI never realized how many lives dad touched. With little notice, on a Thursday night, the largest funeral home in town was completely packed. The line was out the door for hours. Cars circled the lot to wait for someone to leave, just to have a spot. A dozen times that night, someone came up to me and told me how much dad meant to them, with a story they had to tell. So many things I never would have know he did. Something dad probably just did from his nature and without a second thought. Most would love to have touched that many lives when they are gone.\nI miss you, dad.\nAnd I hope the waves never stop.\n","date":"15 May 2011","externalUrl":null,"permalink":"/blog/2011/05/15/i-miss-you-dad/","section":"Blogs","summary":"","title":"I Miss You, Dad","type":"blog"},{"content":"","date":"15 May 2011","externalUrl":null,"permalink":"/tags/personal/","section":"Tags","summary":"","title":"Personal","type":"tags"},{"content":"","date":"1 March 2011","externalUrl":null,"permalink":"/tags/javascript/","section":"Tags","summary":"","title":"Javascript","type":"tags"},{"content":"I\u0026rsquo;ve been a developer, on many different platforms, for just under two decades. Like many code monkeys, I enjoy learning new architectures. I\u0026rsquo;m not exactly sure why, but programming for WebOS has me more excited than I\u0026rsquo;ve been since working with GCC on the Palm Personal. The idea of building apps with web technologies on a portable device sounded interesting. I knew that certain things would be easy and others hard. That is always the case with any platform.\nWith Word Whirl queued up for release in the App Catalog, I decided it might help others to describe some of the things I\u0026rsquo;ve learned. This is my way of giving back to all the PreCentral users that helped during the process of taking Word Whirl from a request post to a published application. Hopefully this will help some more make the leap from Homebrew to App Catalog and get more apps out there.\nDebugging # When developing on the Pre or in the Emulator, it is difficult to locate syntactical and functional errors in your code. You will save a great deal of time when trapping errors as close to the source as possible. I include try/catch blocks around any non trivial code. A typical setup function might look like this:\nMySceneAssistant.prototype.setup = function(){ try{ // My Code Mojo.Log.info(“Hey, I actually got here.”); } catch(e) { Mojo.Log.error(“myScene.setup error: %j”, e); } } When an error occurs, this will print a JSON encoded version of any JavaScript exception that occurs. For this to be useful, you need to read the /var/log/messages file. I generally only need to look at errors during initial development on the Emulator.\nFor the emulator, you ssh to port 5522 of localhost, using username/password of root/root. On a unix machine, type ssh -p 5522 root@localhost in a terminal and enter root when prompted for password. For Windows, you will use Putty, configured for ssh at port 5522, and enter username and password when prompted.\nOnce you have terminal access to the emulator, use the log command with your appId. Ex: log com.sachersoft.wordwhirl\nUse Ctrl+C to exit the log command when finished.\nAlso in the function above, I have a Mojo.Log.info command to write out non-error generated debug messages.\nYour messages will not show up unless you increase the logLevel. To do this, create a file named framework_config.json in the root of your application. Inside that file you need:\n{ \u0026#34;logLevel\u0026#34;:99, } Remember to set the value back to 0 before you release your app or you will fill the users messages file with all your debug information.\nIf you need to debug on the Pre, you can only use Mojo.Log.error to write to /var/log/messages. Follow the process to get terminal access (or incorrectly called “root your Pre”). You will find the log command missing. tail -f /var/log/messages will partially replace this. To perform more like log, pipe the output to grep with something like this:\ntail -f /var/log/messages | grep com.sachersoft.wordwhirl Obviously, replace com.sachersoft.wordwhirl with the proper appId for your application. Like log, you can terminate this command with Ctrl+C.\nStability and Efficiency # The biggest problem I have seen in WebOS homebrew code is missing cleanup for event handlers. This can cause an application to use more memory than it really needs and opens up the possibility of memory leaks which can make your app be responsible for the users phone getting progressively slower.\nA typical event handler statement in the setup function of a scene might look something like this:\nMySceneAssistant.prototype.setup = function(){ this.controller.listen(\u0026#39;MySuperBtn\u0026#39;, Mojo.Event.tap, this.tapButton.bind(this)); } This functions correctly, calling the tapButton function and all looks well. However, when the scene unloads the event handler isn\u0026rsquo;t cleaned up properly. Every event handler must be removed in the cleanup function with a stopListening call. This is impossible to do with how we created the event handler.\nEach time you call this.tapButton.bind(this), you will receive a different instance of a function, created by bind. (The same thing occurs with bindAsEventHandler.) We need to save the bound function instance, because the stopListening method requires the exact arguments given to the listen method.\nMySceneAssistant.prototype.setup = function(){ this.tabHndlr = this.tapButton.bind(this); this.controller.listen(\u0026#39;MySuperBtn\u0026#39;, Mojo.Event.tap, this.tapHndlr); this.controller.listen(\u0026#39;SecondBtn\u0026#39;, Mojo.Event.tap, this.tapHndlr); } Since the bind function call is stored, we can properly stop event listening. There is an added advantage if you have more than one user of the handler. Notice my new SecondBtn will use the same bound function as the first. This eliminates multiple instances of bound functions going to the same place, thereby saving memory. Now that we are creating event handlers properly, we need to remove them in the cleanup method.\nMySceneAssistant.prototype.cleanup = function(){ this.controller.stopListening(\u0026#39;MySuperBtn\u0026#39;, Mojo.Event.tap, this.tapHndlr); this.controller.stopListening(\u0026#39;SecondBtn\u0026#39;, Mojo.Event.tap, this.tapHndlr); } With the saved bound function this.tapHndlr, all arguments are the same as when listen was called and the event handlers will be properly disposed.\nScene Painting # On some of my scenes, I noticed the HTML elements flicker into place, when dynamic HTML changes were made in the activate scene. Since these changes can\u0026rsquo;t be performed in setup, how do we fix it? The answer is the little publicized aboutToActivate. In this example, I have a css class called “hidden” which is just:\n.hidden{ display:none; } I have a button I want to hide in certain cases. When this code was in activate, there was a short time that the button was visible before it disappeared. The flicker was very short, but it looked bad. By moving the code to aboutToActivate, this flicker is removed and replaced with just a slight bit more scene loading delay.\nMySceneAssistant.prototype.aboutToActivate = function(){ if(HideButton){ $(\u0026#39;MyButton\u0026#39;).addClassName(\u0026#39;hidden\u0026#39;); } } The aboutToActivate function can be useful when any dynamic HTML changes have to occur at the load of a scene. Go through your app and look for flashing or movement of the display when dynamic content is loaded. This can make it better.\nUse CSS3 Transitions # While some games require exacting animation with JavaScript timers and positioning code, that isn\u0026rsquo;t always the case. Almost all animations in Word Whirl are performed by CSS transitions. I define a base class for a given item. This class will define which styles to animate. Then I define as many classes as needed to represent the states I animate between. I set styles directly, instead of classes, when the values are more dynamic.\nFor the letters used to play in Word Whirl, I have a base class of letter-button. The positioning is absolute within my letter-board div. The other important pieces of this class are the two -webkit-transition styles:\n.letter-button{ position:absolute; width:45px; height:46px; background-image:url(\u0026#39;../images/ltrtile.png\u0026#39;); -webkit-transition-property: left, top; -webkit-transition-duration: 250ms, 250ms; } The -webkit-transition-property tells which styles the transitions should affect. -webkit-transition-duration defines the duration it takes to animate each property from start to stop value.\nIn addition, I have 6 home classes (home0 through home5) and 6 target classes (tar0 through tar5). These just define the left and top values for each location. Just the first two of each are listed below, as the others just use larger left values.\n.home0{ left:10px; top:50px; } .home1{ left:60px; top:50px; } .tar0{ left:10px; top:0px; } .tar1{ left:60px; top:0px; } The HTML for a letter block is defined below. The inside div with letter class is just to hold the letter used on the block and not important for the animation. The letter-button class gives the block its main properties. The home0 class places the block in the first home position.\n\u0026lt;div class=\u0026#34;letter-button home0\u0026#34; id=\u0026#34;but0\u0026#34;\u0026gt; \u0026lt;div id=\u0026#34;let0\u0026#34; class=\u0026#34;letter\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; Animating the block is now just a matter of removing and adding position classes. This code would move the block from the first home position (home0) to the second target position (tar1).\n$(\u0026#39;but0\u0026#39;).removeClassName(\u0026#39;home0\u0026#39;); $(\u0026#39;but0\u0026#39;).addClassName(\u0026#39;tar1\u0026#39;); The div will fly from the home0 to the tar1 position in a quarter of a second. The timing was controlled by the 250ms setting in the -webkit-transition-duration style.\nThat is how the letters fly around in Word Whirl. Obviously, the JavaScript to maintain the state, debounce the letters, and trigger the correct class changes is a little more complicated, but the two lines above is the only code doing the animation. As Palm enhances the webkit implementation, these animations will automatically improve with no changes to your code. Search for “webkit-transition” to see many examples available on the web, while keeping in mind that not all styles are supported yet in WebOS.\nDon\u0026rsquo;t be afraid to completely rewrite and refactor portions of your code. It took two major rewrites to get Word Whirl into a form that I finally liked. However, the lessons learned will be second nature to your next programs.\n","date":"1 March 2011","externalUrl":null,"permalink":"/blog/2011/03/01/webos-from-homebrew-to-catalog-tips-learned-in-the-process/","section":"Blogs","summary":"","title":"WebOS From Homebrew to Catalog: tips learned in the process","type":"blog"},{"content":"Precentral.net read through the initial TouchStone theory post I put up and asked HP about my theories. As they posted in this article on the site, HP confirmed the identification to work as I assumed.\nThe new TouchStones will use the 3.1 MHz frequency to pass a unique key to the new WebOS phones, which will enable them to know where it is docked. You will obviously have to tell the phone where each dock is located the first time you use it. Derek did a great job translating my geek speak into general WebOS fan digestible content.\nOnly a few errors with the wording in the document. He refers to a coil for each frequency. I believe that both frequencies will use the same coil. It is resonant on both the communication frequency (3.1 MHz) and the charging frequency (118.5 KHz), so there is no reason to add extra hardware to the mix. This isn\u0026rsquo;t really important to the end user, but just trying to be technically correct.\nSome have speculated that this 3.1 MHz frequency will allow the TouchStone to have a data USB cable. I don\u0026rsquo;t think this is possible. The data rate on a 3.1 MHz carrier is very low. The best that could be emulated is a old style serial connection (think phone line modem speeds). Nothing even close to the speed of even USB 1.0. It will most likely only be a method of establishing the connection via Bluetooth for major data transfer or for a stereo audio out functionality. Otherwise, it will just be used to exchange fairly short messages, like the URL example shown during the Feb. 9th event.\n","date":"22 February 2011","externalUrl":null,"permalink":"/blog/2011/02/22/touchstone-theories-confirmed/","section":"Blogs","summary":"","title":"TouchStone Theories Confirmed","type":"blog"},{"content":" When the Palm Pre was released, Palm also sold a unique inductive charger called the Touchstone. Inductive charging isn\u0026rsquo;t new, by any means. Electric toothbrushes and many other devices have used them in the past. This was a first for cell phones, I believe.\nWhen I purchased my Pre and eventually many Touchstones, I didn\u0026rsquo;t have a good oscilloscope to play around with the signals. Now I do. With the announcement of HP\u0026rsquo;s new phones and an expansion of the TouchStone coil functionality in the phone, I thought I would take a look.\nI guess I should start will a little explanation of Touchstone charging. The charger is a base with a coil embedded in it. The phone also has a coil embedded into the back. In addition, both have magnets to align the phone and base coils together. You slide the phone onto the Touchstone and the magnets pull it to the correct spot for alignment.\nA transformer is a set of two coils, used to transfer AC signals from one side to the other. They are most commonly used to reduce household voltages for use by devices (after rectification of the AC signal into DC). The transformer is the largest component in the big \u0026ldquo;wall wart plug\u0026rdquo; power supplies, supplied with so many electronic devices.\nTransformers are also used for isolation. Since only a changing magnetic field can induce a current in a wire, DC cannot be passed through a transformer. This is useful when a circuit had a DC bias, along with an AC signal, and you only want the AC signal. On a computer modem, you usually see a transformer used to interface with the phone line and isolate the delicate circuitry from a line that can have fairly high voltage on it. So they can be used for signals, not just power.\nThe side of the transformer that provides the power is called the primary, the coil in the Touchstone in this case. The receiving coil of the transformer is the secondary, the WebOS phone\u0026rsquo;s back. Since the Touchstone is powered by 5V 1A USB plug, it has its own oscillator to make a varying signal to drive the coil. But what does this signal look like?\nI used a simple two coil wire antenna around the base of my Touchstone, where it meets the Pre. This is acting as another secondary for the transformer. The voltage induced into the coil is proportional to the number of turns, so my coil has a very low voltage. However, the scope has enough sensitivity to sample the frequency and waveform characteristics of this small signal.\nScreen capture of my scope displaying the waveform.\nDisplayed on the upper right is the waveform frequency, which varied between 121-123 KHz. This is a higher frequency than I expected, as I remember that losses go up in transformers with frequency. I am not a radio frequency engineer, so I am sure they figured out that this frequency is best (and/or was a location on the RF band for which they could get permission from the FCC to operate.) Without having iron cores of typical power transformers, it must be more efficient to transfer power at these higher frequencies.\nThe reason I started looking at this were the frequencies from the FCC report, tweeted about by @WebOSInternals. The HP Veer\u0026rsquo;s Touchstone back has a receive frequency of 118.5 KHz and a transmit frequency of 3.1 MHz.\nI thought neither of these would be charging frequencies, as they both seem fairly high. I was wrong. With the analysis of the original Touchstone, it is obvious that the 118.5 KHz is the charging frequency of the new Touchstones. This is close enough in frequency that old WebOS phones will charge on new Touchstones and new WebOS phones will charge on old Touchstones. (HP\u0026rsquo;s presentation on the 9th actually showed a new device on an old Palm branded Touchstone.)\nIn radio antennas, there is a property call resonance. This is where the antenna is tuned such that the maximum amount of power is transferred to the antenna. Otherwise, energy is just lost in the circuitry before the antenna and the transmission power is lower than it could have been. Antennas resonate at multiples of a given frequency. So a coil antenna that is tuned to resonate at 118.5 KHz would also resonate at 26 times that frequency or 3.08 MHz. Now we know why these specific two frequencies were selected and why the Touchstone charging frequency has changed slightly.\nWhat is unknown is if new Touchstones will use the 3.1 MHz to communicate with the new devices. It would be a method of identifying exactly which Touchstone you are on if they told the phone a unique ID. This would be a great way for the phone to have different functionality at different locations, in the new exhibition mode. What is known is that new devices communicate with each other via the 3.1 MHz frequency over each device\u0026rsquo;s Touchstone charging coil.\nI can\u0026rsquo;t wait to put a new device and Touchstone on the scope and see what the data looks like.\n","date":"15 February 2011","externalUrl":null,"permalink":"/blog/2011/02/15/webos-touchstone-now-and-future/","section":"Blogs","summary":"","title":"WebOS Touchstone - Now and Future","type":"blog"},{"content":"I studied for a month or so and re-learned quite a bit of electronics for AC circuits. Resistance, Reactance, Polar Impedance. I took the test on the morning of February 5th and missed 1 out of 50. So now I am an Extra Class Licensed Ham Radio operator. No more tests to take. This is as high as it gets.\nI am still working on what type of antenna to put up. I will probably do an 80 meter dipole that I can tune to higher frequencies. I have built an 80m SSB Voice Transceiver and a 40m CW Morse Code radio. I don\u0026rsquo;t have any wire in the air to hook them up to, however. It will be cool to hear my first transmissions on radios I built.\n","date":"9 February 2011","externalUrl":null,"permalink":"/blog/2011/02/09/amateur-extra-class-no-more-tests/","section":"Blogs","summary":"","title":"Amateur Extra Class - No More Tests","type":"blog"},{"content":"","date":"9 February 2011","externalUrl":null,"permalink":"/tags/ham-radio/","section":"Tags","summary":"","title":"HAM Radio","type":"tags"},{"content":"The Bencode format is an interesting design. It is byte based, which makes it safe from big-endian and little-endian translations. Somewhere when reading about how torrents worked, I got looking at their file format.\nAs far as I know, the Bencode format isn\u0026rsquo;t used on anything but torrent files. The format is pretty simple, with only 4 different data structures: Byte String, Integer, List, and Dictionary.\nBencode Basics # Byte String # This is formatted as [integer length]:[byte string]. Simply read the length number of bytes following the colon.\nInteger # The integer type is structured as i[contents]e. Contents can be positive or negative integer, without leading zeros.\nValid examples: i-1234e i1234e\nList # The list type (or array if you like) is formatted as l[contents]e. Contents will be any valid Bencode types just appended together.\nDictionary # The dictionary type (also know as a hash or an associative array) is formatted as d[contents]e. Contents includes [key][value] pairs until termination. The key value must always be a byte string, but the value may be any Bencode type (even another dictionary).\nThe Code # It is possible to store complex structures with these simple types. I enjoyed learning the format by creating a Python class for encoding and decoding data in Bencode format.\nThe source code for this class is available on my github.\nI have been using Python for quite a while as a scripting language, but only recently started trying to create proper classes and develop more advanced OO designed applications with Python. I\u0026rsquo;m sure this isn\u0026rsquo;t purely Pythonic and would welcome any criticism and ways to improve.\nI wanted to call out a few things in the code that were good learning experiences for me.\nEncoding Methods # Functions are objects in Python and can be stored and referenced just like data. In the internal encoding function _local_encode, I\u0026rsquo;m storing the various data type encode methods in a dictonary with data type string as key. This allows me to get data type string with type(data).__name__. If the key exists in the dictonary, I envoke that method to process the data.\ndef _local_encode(self, data): \u0026#34;\u0026#34;\u0026#34; Returns the proper Bencoded string for data given \u0026#34;\u0026#34;\u0026#34; encoders = {\u0026#39;dict\u0026#39;: self._encode_dictionary, \u0026#39;list\u0026#39;: self._encode_list, \u0026#39;tuple\u0026#39;: self._encode_list, \u0026#39;str\u0026#39;: self._encode_string, \u0026#39;int\u0026#39;: self._encode_integer, \u0026#39;float\u0026#39;: self._encode_float} data_type = type(data).__name__ if data_type in encoders.keys(): return encoders[data_type](data) else: raise Exception(\u0026#39;Encoder is not defined for data type: %s\u0026#39; % data_type) String encoding is very simple, just joining length of the string with the data.\n@staticmethod def _encode_string(data): \u0026#34;\u0026#34;\u0026#34; Converts string to Bencoded Byte String \u0026#34;\u0026#34;\u0026#34; return \u0026#39;%d:%s\u0026#39; % (len(data), data) Encoding integer is just wrapping i and e around the string conversion of the integer. Since bencode does not encode floats, those are converted to ints.\n@staticmethod def _encode_integer(data): \u0026#34;\u0026#34;\u0026#34; Converts Integer to Bencoded Integer string \u0026#34;\u0026#34;\u0026#34; return \u0026#39;i%de\u0026#39; % data def _encode_float(self, data): \u0026#34;\u0026#34;\u0026#34; Converts Float to Bencoded Integer string \u0026#34;\u0026#34;\u0026#34; return self._encode_integer(int(data)) List encoding performs recursive calls into _local_encode as it loops through the list, just appending items. I optimised with lists instead of string concatenation. Originally, I built this with the ben variable as a string and += calls, which is terrible for memory performance.\ndef _encode_list(self, data): \u0026#34;\u0026#34;\u0026#34; Converts List or Tuple to Bencoded List string \u0026#34;\u0026#34;\u0026#34; ben = [\u0026#39;l\u0026#39;] for item in data: ben.append(self._local_encode(item)) ben.append(\u0026#39;e\u0026#39;) return \u0026#39;\u0026#39;.join(ben) Dictionary works the same way as list, just appending the generated values from _local_encode with the addition of a string in front. Again, this was changed from string concatenation to list append.\ndef _encode_dictionary(self, data): \u0026#34;\u0026#34;\u0026#34; Converts Dictionary to Bencoded Dictionary String \u0026#34;\u0026#34;\u0026#34; ben = [\u0026#39;d\u0026#39;] for key in sorted(data.keys()): ben.append(self._encode_string(key)) ben.append(self._local_encode(data[key])) ben.append(\u0026#39;e\u0026#39;) return\u0026#39;\u0026#39;.join(ben) This came out simpler and cleaner than I expected for encoding. But it is a really simple format, so it shouldn\u0026rsquo;t be too complex.\nDecoding Methods # For my external decode method, I\u0026rsquo;m using a class level pointer for the bencoded string and walking through it. I setup those two variables and call into _local_decode.\ndef decode(self, ben_string): \u0026#34;\u0026#34;\u0026#34; Returns the data structure defined by the Bencoded string \u0026#34;\u0026#34;\u0026#34; try: self._ben_string = ben_string self._pointer = 0 return self._local_decode() except IndexError as e: print(\u0026#34;Index Error at Pointer = %d of %d\\n%s\u0026#34; % (self._pointer, len(self._ben_string), str(e))) While I thought I might use the dictonary mapped methods again, I couldn\u0026rsquo;t find a clean way to handle the 11 possible cases for integer. So, I decided to just just go old school flow control. This is one situation that I would have used a switch statement with an else case if it was available in Python. If you have a more Pythonic way of doing this, please ley me know!\ndef _local_decode(self): \u0026#34;\u0026#34;\u0026#34; Detects and returns the proper Bencoded data type starting at current Pointer position \u0026#34;\u0026#34;\u0026#34; cur_char = self._ben_string[self._pointer] if cur_char == \u0026#39;i\u0026#39;: return self._parse_integer() elif cur_char == \u0026#39;l\u0026#39;: return self._parse_list() elif cur_char == \u0026#39;d\u0026#39;: return self._parse_dictionary() elif cur_char in (\u0026#39;-\u0026#39;, \u0026#39;0\u0026#39;, \u0026#39;1\u0026#39;, \u0026#39;2\u0026#39;, \u0026#39;3\u0026#39;, \u0026#39;4\u0026#39;, \u0026#39;5\u0026#39;, \u0026#39;6\u0026#39;, \u0026#39;7\u0026#39;, \u0026#39;8\u0026#39;, \u0026#39;9\u0026#39;): return self._parse_byte_string() else: raise Exception(\u0026#39;Invalid character detected at position %d : %s\u0026#39; % (self._pointer, str(cur_char))) Before we get into Integer and String decoding, we have a helper function. Both the Integer and the String will have a certain number of characters to parse into an integer. The only difference is the stop character. For the String, this is the length of the string with \u0026lsquo;:\u0026rsquo; end character. For the Integer, this is the actual data value with \u0026rsquo;e\u0026rsquo; end character. You will see this method called from both decode methods. Note that the int() parsing handles the leading \u0026lsquo;-\u0026rsquo; fine for negative integers.\ndef _get_number(self, end_char): \u0026#34;\u0026#34;\u0026#34; Returns number in string up to termination character given. \u0026#34;\u0026#34;\u0026#34; start_pointer = self._pointer while self._ben_string[self._pointer] != end_char: self._pointer += 1 num = int(self._ben_string[start_pointer:self._pointer]) # Parse int self._pointer += 1 # Consume the end_char return num The only job of the integer decode method is to consume the leading character that doesn\u0026rsquo;t exist in the string integer. Then all the work is turned over to the _get_number method above up to the \u0026rsquo;e\u0026rsquo; character.\ndef _parse_integer(self): \u0026#34;\u0026#34;\u0026#34; Parses a Bencoded Integer type of format i\u0026lt;number\u0026gt;e \u0026#34;\u0026#34;\u0026#34; self._pointer += 1 # Consume the \u0026#39;i\u0026#39; start character return self._get_number(\u0026#39;e\u0026#39;) The String decoding gets the length integer this the helper function up to the \u0026lsquo;:\u0026rsquo; character. Then it gets the string for return, and increments the pointer past the string.\ndef _parse_byte_string(self): \u0026#34;\u0026#34;\u0026#34; Parses a Bencoded Byte String type of format \u0026lt;len\u0026gt;:\u0026lt;byte string\u0026gt; \u0026#34;\u0026#34;\u0026#34; str_len = self._get_number(\u0026#39;:\u0026#39;) byte_string = self._ben_string[self._pointer:self._pointer + str_len] self._pointer += str_len # Consume the byte string return byte_string The list starts with \u0026rsquo;l\u0026rsquo; and ends with \u0026rsquo;e\u0026rsquo;. So we move the pointer to consume the \u0026rsquo;l\u0026rsquo;, then we loop until the current pointer character is an \u0026rsquo;e\u0026rsquo;. Each time through the while, the class level pointer might increment quite a bit, as data items are consumed. However, we are not at the end of the list until we see a letter \u0026rsquo;e\u0026rsquo;.\nFor each list item, much like the recursive encoding, we call _local_decode to return us whatever the data is.\nSince it is the responsibility of all the decoding methods to consume their bytes, we increment the pointer to move past the list termination \u0026rsquo;e\u0026rsquo; at the end.\ndef _parse_list(self): \u0026#34;\u0026#34;\u0026#34; Parses a Bencoded List type of format l\u0026lt;contents\u0026gt;e All members of the list as simply appended together in Bencode format to make up \u0026lt;contents\u0026gt; \u0026#34;\u0026#34;\u0026#34; self._pointer += 1 # Consume the \u0026#39;l\u0026#39; start character val = [] while self._ben_string[self._pointer] != \u0026#39;e\u0026#39;: val.append(self._local_decode()) self._pointer += 1 # Consume the \u0026#39;e\u0026#39; termination character return val This is very similar to list processing, with the addition of the key. We know that the key is required to be a byte string, so we call directly to that method.\ndef _parse_dictionary(self): \u0026#34;\u0026#34;\u0026#34; Parses a Bencoded Dictionary type of format d\u0026lt;pairs\u0026gt;e All pairs consist of ByteString key followed by any valid data type \u0026#34;\u0026#34;\u0026#34; self._pointer += 1 # Consume the \u0026#39;d\u0026#39; start character be_dict = {} while self._ben_string[self._pointer] != \u0026#39;e\u0026#39;: key = self._parse_byte_string() # Skipping local decode, because key must be a byte string val = self._local_decode() be_dict[key] = val self._pointer += 1 # Consume the \u0026#39;e\u0026#39; termination character return be_dict If you have a cleaner implementation you would like to share, please contact me. I found the few iterations on this to be enjoyable and a good learning experience.\nThe code is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License\n","date":"21 December 2010","externalUrl":null,"permalink":"/blog/2010/12/21/bencoding-encoding-of-a-.torrent-file/","section":"Blogs","summary":"","title":"Bencoding (encoding of a .torrent file)","type":"blog"},{"content":"Years ago, Dad and I attended meetings for Amateur Radio at the local Red Cross building in Jeffersonville. We both worked through passing the 5 words per minute Morse Code and test to get our Novice license and then studied and passed the test for Technician Class. I was licensed in 1990 and expired in 2000. Just when I was starting work in the \u0026ldquo;Real World\u0026rdquo;, outside of college. I didn\u0026rsquo;t bother renewing.\nA thread on a board I frequent about members who were HAMs (a nickname for Amateur Radio Operators) made me think it might be fun to get my license again. A test was being given in Franklin on the 18th (after the monthly meeting of the Mid-State Amateur Radio Club ). I decided to go for it.\nThe classes used to be Novice, Technician, General, Advanced, and Extra. And they required Morse Code (CW). Now the classes have been simplified to Technician, General and Extra. Code is no longer needed for any of the classes.\nI didn\u0026rsquo;t have too much time to study, but I went anyway. A large portion is electronics, so I hoped the Electrical Engineering degree would we worth something for that.\nI felt like I knew every answer. And it turned out that I did. 100%. Then they mentioned that you can take the next level test for free, because you had already paid the $15 exam fee for the day. Why not?\nThe General Class exam was also 35 questions and I didn\u0026rsquo;t get all of them correct. But I did get enough to pass. Surprise. \u0026ldquo;Do you want to take the Extra Class exam?\u0026rdquo; they asked.\nWell, why not?\nThe Extra had 50 questions and asked about many regulations of which I had no clue. I also tried to pull the knowledge of reactive power and polar coordinate description of complex power out of my mind\u0026rsquo;s archives. I missed 19. You had to miss only 13 to pass. I didn\u0026rsquo;t think it was going to be that close. It really would have been crazy to get through all the possible exams in one day, without studying much.\nBy the end of the week, I should be in the FCC database as a General Class Licensee. Now I feel like I should go ahead and take the Extra Class test with some studying. Why not do it before I really learn my new call sign? Then I don\u0026rsquo;t have to worry about it every changing again.\nI wonder when the next test is going to be\u0026hellip;\n","date":"18 December 2010","externalUrl":null,"permalink":"/blog/2010/12/18/im-such-a-ham/","section":"Blogs","summary":"","title":"I'm such a HAM...","type":"blog"},{"content":"Dark Chocolate Dipped Ginger Altoids. Yes, it sounds weird. I don’t understand how they made it through marketing. I don’t think they had any type of focus group for these. I have a rule that I will try anything once, as long as there isn’t a high likelihood of death. I think this is why blowfish is so expensive, for the malpractice insurance for those that die after eating it. I don’t plan on trying blowfish any time soon. But I’m game for Dark Chocolate Dipped Ginger Altoids.\nWarning: An Experience\nLet me see if I can take you through it. You pop this mint in your mouth pretty quick. See this isn’t an M\u0026amp;M. it will melt in your hand. So you have to pop it in quick. And if you wait too long, you might just lose your nerve.\nThe first flavor that you get is dark chocolate. Some people like dark chocolate, but I prefer milk chocolate. So I’m dealing with the chocolate when the other flavors start. Imagine that your are eating the most over-spiced pumpkin pie that you have ever tasted\u0026hellip; but it is covered in dark chocolate.\nThat was mildly strange. After some time, the chocolate has been sucked off and you are just sucking on a piece of pumpkin pie. Well sort of. But you have been desensitized to the spice, so it seems a little like pumpkin pie. But something is hiding there.\nThe heat starts to pour in. It makes sense. I had forgotten that these were Altoids. And they are curiously strong. I should have expected this. So the heat is building and I feel like I am eating a super hot radish. That is covered in ginger.\nNow, after you have had an Altoids, your breath is usually fresh. It has to be, because you have burned off a the top four layers of skin in your mouth.\nBut this is different. My breath smells worse. It is actually making me gag. A breath mint shouldn’t make your breath worse. My breath is like I left a pumkin pie in a hot car all day. A really old car. With a gym bag. Really bad breath.\nNow it should have been a clue when Julie put out the Altoids tin. She said that she tried a few and wasn’t sure about how they taste. They are now available for others to sample. I should have seen something there, because you protect the Altoids. You make sure that no one is around and sneak one out quick and then hide it again.\nAfter all of this, if you are offered a Dark Chocolate Dipped Ginger Altoids, try one. It is an experience. Maybe not a good one, but good lives are chains of experiences.\nBut please get a real mint before you come around me to breathe all your pumpkin pie breath on me.\n","date":"28 August 2008","externalUrl":null,"permalink":"/blog/2008/08/28/dark-chocolate-dipped-ginger-altoids/","section":"Blogs","summary":"","title":"Dark Chocolate Dipped Ginger Altoids","type":"blog"},{"content":"","date":"28 August 2008","externalUrl":null,"permalink":"/tags/humor/","section":"Tags","summary":"","title":"Humor","type":"tags"},{"content":"","date":"3 July 2008","externalUrl":null,"permalink":"/tags/book-review/","section":"Tags","summary":"","title":"Book Review","type":"tags"},{"content":"","date":"3 July 2008","externalUrl":null,"permalink":"/tags/nonfiction/","section":"Tags","summary":"","title":"Nonfiction","type":"tags"},{"content":"Recently I\u0026rsquo;ve started writing again. In the last few years, all my writing was on screenplay style for short films. Some of these we actually shot and produced, most just sit on my computer in final PDF form. Writing in screenplay format is different than novel, novella, or short story forms. Screenplay is all about dialog and character actions. There is no exposition of character thoughts. I think this experience makes you a stronger dialog writer, when you switch to fiction. I decided to read a few books on the subject of writing fiction before starting up again. Seeing good reviews on Stephen King\u0026rsquo;s On Writing, I decided to read it. I\u0026rsquo;m glad I did.\nThe book is broken into a few sections: C.V., Toolbox, On Writing, On Living: A Postscript, and a final edit example. C.V. or Curriculum Vitae is normally a list of job experience and education for use in an interview. At first, this seemed like a strange title for the section. After I finished reading, it was a logical name. The section is split into 38 mini-chapters or \u0026ldquo;snapshots\u0026rdquo; of times in history, as Stephen puts it. Descriptions of points in his life, which influenced his focus and style as a writer, help give perspective on all the rest of the book. King is very open with his battles with drugs and alcohol over the years. He laments about those books written while under the influence, with no lasting memory of the creative process.\nToolbox describes all those tools that you need in your collection as a writer. It isn\u0026rsquo;t a boring grammatical lessons, but covers those differences between what your English teacher tells you is correct grammar and how a novelist should actually write. One subject that King admits is more of a do what I say, rather than do what I do, is limiting adverbs. \u0026ldquo;I have a problem with this,\u0026rdquo; Joe said admittedly. Screenplay writing is actually a negative in the regard, especially when you are directing or at least participating on the crew side of something you write. I tend to see it in my head the production of the piece and write more stage direction than I should. This is even easier to do if the location is known while you are writing. These stage directions are the adverbs of a screenplay. Stephen states that this is just a sign that your writing isn\u0026rsquo;t strong enough for the reader to understand how a character would do something. There are many other worthwhile tips and some just opinions. But they are good opinions. I enjoyed the idea of writing as telekinesis. Your mind is controlling this little cast of characters. Just write down what they do. A very interesting perspective on the art of writing.\nOn Writing deals with using those tools and good habits to create a work. It is interesting to learn processes from different prospectives. Some use plot visualization or something like the snowflakes method, to complete the entire plot before they start writing. While this outline isn\u0026rsquo;t binding as to the direction the writing must take, I\u0026rsquo;m sure it has some limiting pull, if only subconsciously. King admits to having plotted once and hated it. He now just writes and lets the story take him where it will. The two styles yield different books. I have no doubt that a technical thriller, such as Tom Clancy, is well plotted and definitely well researched. The book is about the story. King\u0026rsquo;s books are more about the characters first, and story second. Perhaps that is the difference between the two methods. As King puts it, he just gets characters in a predicament and watches as they work themselves free. His plot for most books start with a simple What if? question. Taking two ideas and putting them together for a unique situation. I thought the idea of a book as a fossil was interesting. You can slowly brush away the dirt and find all the pieces unbroken, or use the plotted jackhammer to see what the fossils are faster, possibly breaking some. Interesting comparison.\nOn Living is a section about being hit by the van and nearly killed. I have not followed Stephen King very much at all, so the most I knew before this book was that he had an accident. I did not realize how close to dying he actually came. This is an appropriate book to hold this information, as the composition of On Writing bookended the accident. He had gained momentum on finishing the book, after a sizable delay, when the accident occurred. This was the book he worked on as he allowed writing to bring him back into life again. The very last information in the book is valuable as King shows the reader an original, first draft section of 1408. Then gives an corrected version, showing markup and giving references to why changes were done. A very good lesson in revision.\nWhile I have not read many Stephen King books, this was a worthwhile read. It would be enjoyable for those who are not writers, but just want to become better readers. I\u0026rsquo;ve found the same thing with films, after becoming a filmmaker. Fully understanding that art can allow you to enjoy it better, if it is good. It also allows you to notice when it is done poorly. My girlfriend is slightly annoyed when I dissect poor film making choices while watching a movie. Luckily, dissecting poor writing will only be done quietly inside my head.\n","date":"3 July 2008","externalUrl":null,"permalink":"/blog/2008/07/03/on-writing-by-stephen-king/","section":"Blogs","summary":"","title":"On Writing by Stephen King","type":"blog"},{"content":"","date":"3 July 2008","externalUrl":null,"permalink":"/categories/reviews/","section":"Categories","summary":"","title":"Reviews","type":"categories"},{"content":"","date":"3 July 2008","externalUrl":null,"permalink":"/tags/writing/","section":"Tags","summary":"","title":"Writing","type":"tags"},{"content":"","date":"18 March 2008","externalUrl":null,"permalink":"/tags/proposal/","section":"Tags","summary":"","title":"Proposal","type":"tags"},{"content":"Today I read of an engagement gone seriously wrong. Although, reading through the article I realized that had I been in that situation, things would have gone differently. Amy and I are a little different than the two in the article.\nThe incident started with a man concealing his $12,000 engagement ring in a helium balloon, with the idea of actually \u0026lsquo;popping\u0026rsquo; the question. I don\u0026rsquo;t understand why he had not attached the balloon to something of a greater weight than the buoyancy. Long story short, his plans of proposing went up, up, and away with the ring. After following it for a couple miles in the car, he lost the ring.\nTwo thoughts came to mind after reading this. First, I don\u0026rsquo;t remember a balloon clause in the Scheduled Insurance coverage I purchased to cover the ring I gave Amy. Would you be able to file a claim for it as if you just lost it? If you didn\u0026rsquo;t have some type of insurance on a $12k ring, you are a moron. Of course, if you let said ring fly off in a balloon you could also be classified a moron.\nSecond, a quote from the article. \u0026ldquo;But I had to tell her the story \u0026ndash; she went absolutely mad. Now she is refusing to speak to me until I get her a new ring.\u0026rdquo; All I think of is what a materialistic little brat she sounds like.\nIf the woman I hoped to propose to would no longer talk to me until I bought her another $12,000 ring, after losing the first, I would chock it up to a cheap lesson. For $12,000, I would have found out her true nature and start running (not walking) away. It would save much bigger losses in the future, both emotionally and monetarily. Perhaps she was just mad that he didn\u0026rsquo;t get a big enough ring to keep the balloon from flying away?\nIf this happened to me, Amy and I would share the sad laughter of the futility of the situation. I know at first I would probably tell her that she would have to work for her ring, then point to the balloon quickly gaining altitude and tell her it is in there. But I deal with stress by using humor. She would say yes anyway and I would go buy a duplicate ring in CZ until I could replace it with a real diamond.\nWhat else can I say, I think Amy is a better person than the woman in the article. That is why I picked her.\n","date":"18 March 2008","externalUrl":null,"permalink":"/blog/2008/03/18/what-an-engagement/","section":"Blogs","summary":"","title":"What an Engagement!","type":"blog"},{"content":"","date":"7 March 2008","externalUrl":null,"permalink":"/tags/cooking/","section":"Tags","summary":"","title":"Cooking","type":"tags"},{"content":"Hurray for me. Today is my birthday.\nLast night, I decided to make a German Chocolate Cake. Amy thought I shouldn\u0026rsquo;t have to make my own cake, but I wanted to try one from scratch. The cake used real melted chocolate and I folded in whipped egg whites. The frosting was pretty standard fare with egg yolks, evaporated milk, sugar, etc. I didn\u0026rsquo;t have a piece until tonight. I cooked the cake a little too much and it was slightly dry. It was a little large. Not really visible in the picture was the 7\u0026quot; height of the cake.\n","date":"7 March 2008","externalUrl":null,"permalink":"/blog/2008/03/07/happy-birthday-to-me/","section":"Blogs","summary":"","title":"Happy Birthday To Me","type":"blog"},{"content":"On September 24th, 2004, I met Amy for the first time on our date at Acapulco Joe’s in Downtown Indianapolis. Amy’s car broke down just before we met, so she was driving her dad’s old Ford Ranger. We have been seeing each other since. On Feb 26th, we were going to reach an obscure and geeky anniversary. We will have known each other for exactly 30,000 hours. About two months ago, I targeted this date for something I had been planning for almost a year. She said, “Yes.” I’m now engaged.\nHere is how it happened.\nFor the last few months, I’ve been very careful with how I didn’t give away surprises, while knowing I was giving them away. I knew I would need Amy to know my “tell”. The latest was my response to her asking if I had her favorite pizza place make a heart shaped pizza for Valentine’s Day. This was after I told her a food place was going to make dinner in a way they didn’t think about till I asked if they could. I kind of looked away and gave her a “no comment”, when she asked if I was having a pizza made in a heart. When the heart shaped pizza showed up, she already knew it.\nWhen I told Amy to reserve February 26th as a date night, she didn’t think anything of it. She didn’t know of any special date or anniversary for the 26th. Amy immediately tried to figure out what we were doing, but I gave no clues. After many days, she came across the idea of going out for a play or a movie. Here my months of “giving away” my secret plans had come into play. I “gave away” that I had no comment about that. Amy bought it hook, line and sinker. Now, I just had many things to prepare.\nThe most important piece was getting insurance for and picking up the ring. Without that, nothing happens. Since I work at an insurance company, I consulted some co-workers for best ideas about getting coverage for this ring. It wasn’t a cheap ring and would really hurt to lose it, damage it, have it stolen, etc. With all of those details taken care of, I picked up the ring in early February. I had to bring it to work on the day I picked it up, because of the way the timing worked out. I told the co-worker who helped with insurance advice that I had picked it up. She asked to see it. I said, “No. Men have died for less than showing someone an engagement before she gets it.” After thinking about it, she agreed. When I got home, I had to find a good hiding place. Just knowing that the ring was sitting there and I couldn’t say anything was tough.\nI also started preparations and tried to keep them secret. I was on a time crunch for making the CD and would up letting Amy know about it, just playing it off as a fun scavenger hunt to start the date. I didn’t finish it until the night before the “date.” It was really dorky, but I thought she would get a kick out if it.\nThe whole night was almost blown as we left work, a day before the big event. A co-worker who knew about my plans yelled, “Good Luck Joe!” I reacted with a quieter, “Its not tonight.” Then I shut up and hoped Amy didn’t hear anything. I learned later that she did, just didn’t think it was for anything special.\nFinally, the day was here and I gave Amy a note at 5:20, then left in her truck. It isn’t running very well and took some will power to get to the destination. She now drives a Passat and I use the truck when we need to haul things a short distance. The front of the note indicated that it shouldn’t be opened till 5:30. Then the note told Amy to get in my car (which I left in the driveway) and start it at exactly 5:40. By that time, I was almost to the restaurant. The parking spot I was looking for and hoping to be empty was empty. It is an important spot.\n“Amy Cox, this is your mission should you chose to accept it.” That audio greeted Amy as she started the car. The CD consisted of me being a dork and Mission Impossible music, with directions. At a few places where the timing was unknown, I had her skip to the next track once she reached various places. I figured that she would know where she was heading about half way there. It didn’t really matter if she found out. I had more planned.\nI had thought about standing outside, right were I was waiting for her on our first date. I decided not to for two reasons:\nShe would wonder why and possibly think it was a really special day (we couldn’t have that) It was REALLY COLD. I was willing to do it if I had not thought of #1 Amy arrived a little after 6 PM. I was sitting in the same booth we sat on our first date. This wasn’t an accident. I had come previously and made sure to have it reserved. However, I had done this once before on the anniversary of our first date, so nothing to shockingly new yet. After all, this was the 26th, not the 24th, and February, not September.\nDinner was nice. We chatted and Amy couldn’t figure out something special was going on. All according to plan. After dinner we ordered dessert. We had never eaten dessert at Acapulco Joe’s. Cheesecake was odd for a Mexican Restaurant, but the fried ice-cream felt at home. Amy took the cherry, but gave me the stem. I like seeing how fast I can tie them into a knot with my tongue. When we left the table, I slipped the tied stem into my pocket for something cheesy later.\nDuring dinner, Amy asked what I had to haul in the truck, because that was the reason I told her I was taking it. I wouldn’t tell. She worried that it was sitting in the back of the truck to be stolen. I told her that it fit in the cab. This made her ask why I didn’t just take the car. To that I said nothing and changed the subject. I couldn’t tell her that the cargo I was carrying in the truck was the most expensive thing that truck has ever carried. It wasn’t sitting in the truck, it was in my coat pocket.\nWe left at 6:54 PM. I told Amy that the rest of the night required the truck and we walked towards it. While crossing the street Amy mentioned, “Its funny. I drove the truck here on our first date and you drove the Maxima.” I resisted the urge to reply quickly and acted out my best thinking look for 10 seconds. Then I replied, “I guess so.”\nWe walked up the sidewalk towards the truck. When she spotted it, she said “That is about were I parked, too.” It was actually exactly where she parked. The last spot before the hydrant. “Really?” was all I said. I told her she needed to get in the truck, but she couldn’t find her keys in her purse. I opened the door for her. As she started to get in the truck I told her to turn around. I got down on one knee and said some of the things that I had written down throughout the week. I was nervous and don’t remember exactly what I said. The only part that I can really remember is that it was exactly 30,000 hours since we first met and I’ve loved spending a majority of those hours since then with her. I should have had the camera ready to capture her face when she realized what was going on. I placed the ring on her finger and she just stared at it. I let her enjoy it for a while before reaching in my pocket to get something to put in the box. Then I gave her the closed box and told her that wasn’t all. She opened the box and I said, “Here is the knot I tied on the night I asked you to tie the knot.” Cheezy, but she laughed.\nI know that she thought we were going to see a movie or play tonight, so I gave her the option of going to see a movie. She said that she didn’t know, but that sounded good. As we were walking to the truck, Amy had mentioned how cold it was. I offered to drive her back to the car in the truck. She mentioned that she didn’t feel cold any more. I just walked her back to the car.\nWe were to meet up just south of 465, then get in the car for the rest of the way. When I almost got there, my cell phone rang. It was Amy. She called her mom on the way home and was on auto pilot. She was almost home, instead of heading to where we were supposed to meet. I’m guessing shock was involved. She told me that she probably couldn’t stay still for a movie and wanted to tell everyone. I thought that would be the case, but she told me she wanted to go. I started driving back to her house. Amy spent the rest of the night and all day at work showing everyone her ring. I was glad that I was finally out of the “When you giving her a ring?” question. I didn’t know that it was immediately replaced with another question:\n“You two set a date yet?”\nNo. Not yet.\nEdit: We were married on June 6th, 2009\n","date":"26 February 2008","externalUrl":null,"permalink":"/blog/2008/02/26/30000-hours-later/","section":"Blogs","summary":"","title":"30,000 Hours Later...I'm Engaged","type":"blog"},{"content":"","date":"26 February 2008","externalUrl":null,"permalink":"/tags/marriage/","section":"Tags","summary":"","title":"Marriage","type":"tags"},{"content":"Unfortunately, I am easily bored.\nMy mind wandered during a meeting at work today as we were talking about leveraging your strengths. So I started drawing on my notepad.\n","date":"21 February 2008","externalUrl":null,"permalink":"/blog/2008/02/21/leveraging-your-strengths/","section":"Blogs","summary":"","title":"Leveraging Your Strengths","type":"blog"},{"content":"I\u0026rsquo;m a geek, no doubt about it. Only a geek would notice that today is special. The date is 2^1/2^2/2^3 or 2/4/08. At 4:32 PM or 16:32, we have a time of 2^4:2^5. Sadly there are not 64 seconds.\nYes, and I AM aware that most places that describe dates in a sane way (like everywhere but the US), will have this day in April. :) So enjoy a fun power of two date/time sequence that will not happen again for a hundred years.\n","date":"4 February 2008","externalUrl":null,"permalink":"/blog/2008/02/04/power-of-two-date-time/","section":"Blogs","summary":"","title":"2^1 / 2^2 / 2^3  2^4 : 2^5","type":"blog"},{"content":"","date":"27 January 2008","externalUrl":null,"permalink":"/categories/cooking/","section":"Categories","summary":"","title":"Cooking","type":"categories"},{"content":"For New York Style pizzas, you really need a stone. I have heard for people using unglazed tiles from a hardware store, but I am concerned with impurities that may come out of those tiles if I pick the incorrect one. I have purchased a thick stone, but it eventually cracked after some use , but no mis-use from me. I\u0026rsquo;m currently using a large round stone from Pampered Chef.\nThe trick for a great crust is to get the pizza into a hot oven onto a hot stone. By hot oven, I mean as hot as your oven will go hot. Mine is 500. If you can get 550, all the better. Get the stone in there and preheat at least 30 minutes. This gets the stone as hot as the oven. The stone makes the bottom crisp, with a nice soft center. To get the pizza in the oven, you use a device called a pizza peel. I made the mistake of getting two of the cheap wooden peels. These are fine for getting the pizza into the oven, but tougher to get the pizza out. I would recommend jumping immediately to aluminum peels. My wooden peels go unused now. The thinness of the aluminum makes a huge difference.\nOnce the dough is ready, it doesn\u0026rsquo;t really matter if you roll out the dough or hand toss. I like keeping a little thicker edge on the dough to give you a breadstick to eat after you finish the piece.\nTo slide a pizza into the oven, you need some ball bearings. Flour or corn meal are common. I prefer cornmeal. Sprinkle a little on the peel over the area that the pizza will cover. It makes the most sense to position the pizza as close to the front edge as possible. Shake the peel and make sure that the pizza dough moves around easily. Now make the pizza as quick as possible. The cornmeal will take moisture from the dough and will start to stick. Before trying to put the pizza in the oven, do another shake test. If it doesn\u0026rsquo;t move, you didn\u0026rsquo;t use enough corn meal. Get under the dough with a spatula or turner and sling some more cornmeal in there. You want to find out now, not when you are shaking the toppings onto the hot stone, with no pizza dough. It is better to error on the side of too much corn meal at first. However, the corn meal will burn when left on the stone.\nDo not try to get the pizza off with a quick jerk. This will also distribute toppings onto the stone. Put the peel in the oven at a 25 to 30 degree angle and touch down on the stone where the edge of the pizza should go. With small easy shakes, ease the pizza onto the stone.\nGetting the pizza out is where the aluminum peel really shines. It is 1/8th the thickness of a wood peel. The allows you to slide the peel under the pizza without kicking the pizza off the back of the stone and into the back of the oven, This makes a lot of mess and a lot of smoke. Getting the pizza out is where you want a quick action. If you did everything right, the pizza should not be attached to the stone at all.\nWhen it all goes wrong. Well, I\u0026rsquo;ve found a long metal turner made for outside grilling very handy. If you pizza sticks at all, you can scrape it off with this turner. It also help clean all the cheese that is on the stone from where you put on too much cheese and not enough corn meal and the first shake just tossed cheese and toppings onto the stone. It is gonna happen, just have fun.\nWhen messing around and cleaning the stone, it is a good idea to wear some oven mitts. I\u0026rsquo;ve managed to hit the oven rack or something a few times and a 500-550 degree oven makes burns happen fast.\n","date":"27 January 2008","externalUrl":null,"permalink":"/blog/2008/01/27/making-pizza/","section":"Blogs","summary":"","title":"Making Pizza","type":"blog"},{"content":"","date":"27 January 2008","externalUrl":null,"permalink":"/tags/pizza/","section":"Tags","summary":"","title":"Pizza","type":"tags"},{"content":"When I was looking at lathes, I talked with many people who had tried and liked either the Jet Mini or the PSI Turncrafter Pro lathes. I could not find many that had used both, to get an idea of the differences between them. Now owning a PSI Turncrafter Pro and having taken a class and used a Jet Mini for 5 hours or so, I decided to summarize the differences.\nBoth lathes look deceptively similar. The PSI is 4\u0026quot; longer in the bed at 18\u0026quot;, vs 14\u0026quot; for the Jet. The Jet also has one higher speed. The first 5 speed ranges seem to be very close. The beds look almost exactly the same, as do the banjo and steady rest. The motor height adjustment is almost exactly the same.\nQuality wise, the Jet has a nicer finish and features. By this, I mean the machining is a little better cleaned up and parts are more thought out. The threads on my PSI headstock looked like there were cut and never touched again. There are burrs and sharp edges that I will be dressing down. While the Jet lathe I was using had been in use at the classroom for a while, I haven\u0026rsquo;\u0026rsquo;t noticed this on Jet minis out on display at shops either.\nThe major difference, which will affect daily use, are the belt access doors. The Jet has a nice flip open door for both top and bottom access. Although the spring handle setup for the bottom door seems a little strange to me, it works fast once you get used to it. The access to the belts are in exactly the same spot, but the PSI has a thumb screw to undo and then a little plastic piece which is lifted and removed. This piece has slits on the bottom that sits on bolts screwed in below the opening. The piece would be set down for the change then replaced. It makes for a piece to lose and takes over twice as long to change the belt speed as on the Jet. I will be replacing my plastic pieces with doors that have a spring clip, similar to the Jet\u0026rsquo;s. Currently my access panels are off, because they are annoying to remove and replace.\nThe locking handle on the steady rest and the tail stock depth lock are both a plastic handles on the PSI. The operation is the same, both spring loaded handles which can be lifted to change position. The plastic handles don\u0026rsquo;t feel flimsy, but I doubt they will last quite as long as the metal handles on the Jet.\nPoint to point, my PSI is slightly off (1/32\u0026quot; tail is closer to me than the head point). While a thin shim under the tail will fix this, I\u0026rsquo;\u0026rsquo;m not sure if this is typical with PSI or not. My sample size is 1. I did not see this with the 4 Jet lathes I looked at.\nI am still happy with my PSI purchase. After I spend a little bit of time to polish off some of the rough edges and I will have a nice lathe for about $100 less than the Jet. I don\u0026rsquo;t see the loss of the high end (3800 rpm or so) on the Jet as too much of a problem. 3200 rpm is fast enough and both have the 500 rpm low end. But there is no doubt, the Jet is a better finished machine, with a few upgrades over the PSI. If I could have found the Jet on special for within $20-40 of the PSI, I would have paid the difference.\n","date":"26 December 2007","externalUrl":null,"permalink":"/blog/2007/12/26/a-lathe-comparison-jet-mini-vs-psi-turncrafter-pro/","section":"Blogs","summary":"","title":"Jet Mini vs PSI Turncrafter Pro","type":"blog"},{"content":"","date":"26 December 2007","externalUrl":null,"permalink":"/tags/lathes/","section":"Tags","summary":"","title":"Lathes","type":"tags"},{"content":"","date":"26 December 2007","externalUrl":null,"permalink":"/tags/woodworking/","section":"Tags","summary":"","title":"Woodworking","type":"tags"},{"content":"As soon as I realized that my recumbent would allow me to complete my dream of riding a bicycle across the country, I started research all over the web. While reading through the many trip reports of coast to coast touring cyclists, two things became clear.\nFirst, I would be riding the TransAmerica Trail created by Adventure Cycling in 1976 (the year of my birth).\nSecond, I should purchase, read, re-read, and take along Donna\u0026rsquo;s book.\nI have read through Donna\u0026rsquo;s book at least once. It is divided into 82 days worth of riding to cross the country, so I often will read a few of the day accounts at a time. Normally I read sections to compare and contrast them with other on-line travelogues, jotting notes in the book. Each day has a literary description of the ride, followed with turn by turn directions and points of interest. This book was published in 1996, so you should not take it as gospel that \u0026ldquo;Joe Blowe\u0026rsquo;s Convienient Mart\u0026rdquo; will still be there. As an adventure cyclist, you wouldn\u0026rsquo;t always want to know, would you?\nThis book can get you across the country without a problem, however, you should use it along with the excellent maps provided by Adventure Cycling. These maps are a cyclist dream, without all of the pitfalls contained in standard road maps. Do you wonder which of the nearest towns have a bike shop, or a post office, or a laundry mat? It\u0026rsquo;s on the map. The many Adventure Cycling trips across the country every year keep the maps as up to date as possible.\nI\u0026rsquo;m left in May of 2002, with this book in my bag, to spend 4 months riding across this great country of ours.\nWhen are you leaving?\nBicycling Coast to Coast: A Complete Route Guide Virginia to Oregon ISBN: 0898864682 at Amazon\n","date":"15 December 2007","externalUrl":null,"permalink":"/blog/2007/12/15/bicycling-coast-to-coast/","section":"Blogs","summary":"","title":"Bicycling Coast to Coast by Donna Ikenberry","type":"blog"},{"content":"","date":"15 December 2007","externalUrl":null,"permalink":"/tags/touring/","section":"Tags","summary":"","title":"Touring","type":"tags"},{"content":"","date":"11 December 2007","externalUrl":null,"permalink":"/tags/bicycle/","section":"Tags","summary":"","title":"Bicycle","type":"tags"},{"content":" I was unable to find a pannier set that works exactly as I needed for the under-seat rack on my RANS Rocket. I like the panniers made by Arkel of all the panniers I have looked at and used. However, I could not find a size that worked exactly for me.\nI decided to make my own set tailored (quite literally) exactly to my needs and I borrowed quite a bit from Arkel\u0026rsquo;s design work. Below is a description of the process for those who would like to do the same.\nDesign # Most bicycle panniers are designed for normal upright bicycles. Good panniers have been designed to never contact the rider\u0026rsquo;s feet. At the very least this interference would be annoying. At the worst, it could cause an accident. It is very important to check clearance in all odd positions you can encounter on your bicycle, as frame locations and distances vary with every bicycle. Does a fully turned front fork with the foot forward catch, etc. Since I am designing a bag for use under my seat on a recumbent, foot strike issues are not a factor.\nMaking of the grey pannier under my seat\nDining room table pannier production\nI first debated tapering the bottom of the bag. I couldn\u0026rsquo;t come up with a reason to do that. My previous panniers for the under-seat rack were Arkel GT-30\u0026rsquo;s. These are normally used as front panniers and are tall and skinny. My biggest problem with using them on the under-seat rack is the occasional dragging while turning at faster speeds (i.e. using more lean). I also wanted quite a bit more storage under the seat, to get as much weight low and forward as possible. A rectangular design will be the absolute easiest shape I can build. It also will be an efficient use of the space.\nI mocked up a pannier using a corrugated plastic back plate and paper, to check the size and clearance when the bike was leaned over to 45 degrees. I should never get that far over while turning, but it gives me a decent safety factor. I decided on a size of 18\u0026quot; long, 12.25\u0026quot; tall, and ~6\u0026quot; deep. The zipper sections have the most seams and allowances, so I wasn\u0026rsquo;t sure what the exact final depth would be. I planned on using a 1/2\u0026quot; allowance seams for everything, except for the specialized seams on the zipper.\nI can\u0026rsquo;t stress enough how much time I saved by spending the hour making the mock up. It does wonders in increase your confidence about actually creating this thing. I was able to finalize mounting hardware location as well, eliminating putting holes through the fabric in the wrong place with the final bag.\nWhen measuring that 45 degree clearance, give a generous 3-4\u0026quot; buffer from the ground. This is to take into account that the bag WILL sag under weight and more than you think. Read my postscript at the bottom and learn from my experiences.\nConstruction # I purchased most of my raw materials from The Rain Shed, which is a good source for outdoor patterns and fabrics. I would recommend anyone starting out making outdoor equipment to pick up Sew and Repair Your Outdoor Gear by Louise Lindgren. I ordered it along with my fabric from the Rain Shed and it was easily worth the $17.\nI am using a 1000 Denier Cordura for the main fabric of the pannier. The Cordura I used is the gray fabric in the pictures. I need 4 pieces of fabric for the main body of the pannier: The front of the pannier (which I define as the side facing away from the bike), the back and bottom, and the two pieces that make up the sides and top. Both of the side and top pieces run parallel with each other, with a zipper in between them. All this should make more sense as you start to see pictures.\nI started out with the side/top pieces, because they would take up most of the width of the fabric. I wanted the strength of the fabric (the warp) to be along the short dimension of the pieces, so they have to be cut with the long axis parallel to the weft. (Warp are the threads running the length of the fabric, Weft are those running \u0026ldquo;back and forth\u0026rdquo;.) The dimensions for my two side pieces are 7.5\u0026quot; x 44\u0026quot; and 1.5\u0026quot; x 44\u0026quot;.\nI should point out that the most important things to do with synthetics after cutting is heat sealing. You don\u0026rsquo;t want you bags to unravel during use and scatter all of my contents across the road! For most thin synthetics, you can use a good hot knife for both cutting and sealing. While I\u0026rsquo;ve used a hot knife for thin nylon, I would guess that it would be hard to cut fabric this thick without leaving a large hard edge of melted nylon. I used a cheap soldering iron for sealing the edges of the Cordura, after cutting out with very sharp sewing scissors. This didn\u0026rsquo;t leave hard edges, but secured the fibers well.\nUsing a cheap soldering iron to melt the threads together at the edge where the fabric was cut, to prevent unraveling.\nSide zipper seams from the outside, indicated in red. Notice first seam is inside the fold and second seam secures the fold.\nSide zipper seams from the inside, indicated in red. Notice the fabric just sticking out past the zipper from the first seam, before the fold.\nI\u0026rsquo;m using a YYK size 10 coil zipper for the pannier. The size 10 is about the largest you can get and should wear very well. The coil zipper will run around the curves of the pannier much better than a toothed zipper and the strengths are about equal.\nI started with the small side piece. The first seam is stitched with the wrong side of the zipper and fabric out. I used a zipper foot to stitch along the zipper, leaving enough room for the large sliders. After the first seam was finished, I pulled the fabric back, so the right side was facing up and stitched the second seam using the regular foot against the zipper (the spacing worked out just right).\nIn both of the pictures, you can see the two seams indicated with red lines. The first image is from the right side of the zipper and the second from the wrong side. Just above the red lines in the wrong side picture, you can see a little of the folded over fabric sticking out. I tried to line up the edges of the zipper and fabric for the first seam. This wandered just a little on me.\nFor all the seams in the pannier I used a nylon thread. From what I have read, cotton thread can rot and the nylon fibers of the Cordura will cut polyester thread. I used heavy duty nylon thread through out the pannier construction.\nSeam ripping the reflector off, because I sewed it on the wrong side.\nSide reflective tape combo picture, low light without flash fading into flash picture.\nBoth piece of the side/top of the pannier. These will run 3/4 of the way around the bag.\nThe first step for the larger side piece is sewing on the reflector strips, made from 3M reflective fabric tape. I located them so they would be halfway up the side. Also, don\u0026rsquo;t get distracted and sew the reflector on the wrong side. Surely no one would be that stupid.\nI was concerned about the exposed edge of the reflective tape at first. After sewing a piece to a scrap of fabric and scratching over it for quite a while with my fingernails, I was unable to get the tape to unravel any significant amount. I think it should hold up fine without rolling over the top edges. Any time the ends of the tape are exposed, however, they need to be folded under before being sewn. For these side pieces, both edges will be covered by edging on one side and a seam to the back on the other.\nI got a laugh out of the shot with the flash was on. The reflective tape seems to work!\nTo the left you can see the two side pieces. The smaller piece is finished, except for being joined to the front panel. While it looks like it curves, this is only because of the zipper seam pulled that edge of the zipper together, making it shorter. This will go away after you sew along the other side of the zipper.\nThe larger piece has both piece of reflector tape sewn in place (on the correct side!). One edge of the larger side piece will be exposed, because it is acts as a flap for the zipper. I used 3/4\u0026quot; cross-grain nylon ribbon to treat the edge. This looks much nicer than a raw edge and should also keep it from unraveling.\nSide parts showing edge detail for front and rear reflectors.\nBoth stitches on the large side piece.\nI found it easier to sew this edge when I folded the tape and ironed it, before sewing. By \u0026ldquo;I found it easier\u0026rdquo;, I mean by not ironing the ribbon in half, it is close to impossible to sew it nicely. With it ironed, it is just really difficult. I pined it in place every 6 inches or so, as I sewed the edge. You can\u0026rsquo;t pin too far ahead, because the tape adjusts length a little as you sew. This edge will also contain one of the exposed reflective tape ends.\nTo finish the large side piece, I ran a second stitch along the zipper. I again used the zipper foot for one and regular foot for the other, to maintain consistent spacing. I then installed the two zipper pulls. When the pannier is closed, the two pulls will be together. It will open like a back pack, with the two zippers pulling away from each other to make an opening.\nFinished side pieces, zipped together. The left side with the flap laying down as it will normally be to protect the zipper from debris and water. The right side has the flap lifted to show the zipper.\nFront sewn to small side piece and zipper half.\nThe next step is cutting out the front panel and joining it to the smaller of the side pieces. The dimensions for the front panel are 19\u0026quot; x 13.25\u0026quot; (18\u0026quot; x 12.25\u0026quot; finished). Again, you want to cut out the shorter dimension along the weft of the fabric, allowing the stronger warp threads to be vertical in the pannier.\nAfter the piece is cut out and heat sealed, you join it to the shorter side piece on three edges, leaving one of the longer edges exposed to join with the back/bottom piece. I lined up the pieces at the tip center, but sewed to as one long seam with two turns. See the image of the finished side and front joined together. All that is left is to sew in the back panel pouch, join the back on, cut the back panel, bent and install the aluminum support, and install the mounting hardware. In other words, we aren\u0026rsquo;t even half way there yet.\nI wanted to add a mesh pocket for holding things I need while riding and drying wet stuff. I could have done this along with the side seams to the front, but I wanted a smaller pocket. I also wanted the bottom of this pocket to be a few inches above the bottom of the pannier to keep it from sagging down and possibly dragging in turns. Both of these made sewing the pocket on a challenge.\nFront and Side zipped together.\nDetails of the dual zipper pulls, prior to joining the short side to the front panel.\nPinning the mesh pocket onto the outside prior to sewing.\nMy sister came over and got excited about the project. Ruth is more experienced at sewing than I am, but this the first \u0026ldquo;industrial\u0026rdquo; sewing project for either of us. She helped me figure out how to attach the mesh pocket. I used elastic across the top, folded over and stitched.\nShe sewed on the pocket with the same cross-grain ribbon I used on the zipper cover and mitered edges at the corner. There were a few places that\u0026hellip; umm\u0026hellip; missed the tape. But she re-did those. I\u0026rsquo;m going for functionality, not beauty. Beauty wouldn\u0026rsquo;t be bad though. I can\u0026rsquo;t say much, because she actually sewed them on the right side.\nIn all fairness, I was fairly tough with the low power of my machine. If I keep up this type of work, I\u0026rsquo;ll want to pick up a lightweight industrial machine. A machine that sews straight with plenty of power is the best option. We didn\u0026rsquo;t pull the elastic along the top enough with the first piece. Sewing down elastic takes out some of the retracting capability. One pocket will be slightly more loose than the other.\nThe other lesson learned is that it would have been easier to sew on the pocket before sewing the front to the sides. On my second bag, I sewed the netting along with the front and side/top seams. It turned out cleaner and was MUCH easier. It also yields a larger pocket.\nOne negative of this is the it sticks out a little more and can get damaged easier. I have a small tear in mine from a slight drag with a little too much weight in the mesh pocket.\nI cut back/bottom piece at 19\u0026quot; x 21\u0026quot; (finished 18\u0026quot; x 12.25\u0026quot; back and 18\u0026quot; x 7.75\u0026quot; bottom.) Again, this was heat sealed all around the edge. The warp ran along the 21\u0026quot; direction.\nBefore sewing onto the sides/top, I wanted to put in a pocked for the stiffener. This was cut from lightweight black nylon and sealed, 19\u0026quot; x 13\u0026quot;. The sides of the pocket will be sewn into the seams. I rolled over and hemmed the top to get a clean edge. I rolled over the bottom before sewing to the Cordura. The top remains open to load in the support panel.\nIf you have done much sewing, you know there is that one time when everything is going right. You have been fighting seams all day and this seam is the best one so far. It is straight and the fabric is laying perfectly. That only means one thing, you bobbin just ran out of thread.\nInternal pocket on the back side to hold the stiffener board. Where the black nylon ends at the bottom is the transition from back to bottom.\nSew all you want, but when the thread runs out in the bobbin you are just punching holes.\nPannier with sewing finished, before support hardware was added.\nThe sides of the back/bottom piece are sewn to the exposed edges of the front/sides/top piece. I centered the sides/top piece along the top of the back/bottom piece and sewed that first. This distributed the sides evenly.\nThese are all simple seams of keeping the fabric aligned and sewing at the right offset. However, because of all the hardware on the individual pieces, it takes some time.\nUnder the side pocket, you can see a small strip of reflective tape. Were I smart about it, I would have sewn this reflector along the entire edge of the front piece and into the seam at the side. This would be a larger reflecting surface and eliminate the need to fold over the ends of the tape to sew.\nThe attentive reader might also have figured out that these pannier could be made with a single piece for the back, bottom, and front. I had thought of this at first, but decided the likely hood of me lining everything up correctly with essentially two \u0026ldquo;U\u0026rdquo; shaped pieces of fabric (with the sides/top and the back/bottom/front) might be zero. My main concern was the unknown zipper seam offset. This would vary the thickness and make the bottom piece width vary. However, if you sewed together the side/top pieces and them measured the finished width, you could easily create a one piece back/bottom/front.\nI purchased a hook kit from Arkel for mounting the panniers to the bike. This consists of two hooks up top, with a cam locking mechanism that locks the hooks onto the rack rail. Then an elastic hook holds onto the bottom of the rack.\nUse of this mounting method requires support inside the pannier. My dad had a piece of 1/8\u0026quot; HDPE plastic that would work. I used some cardboard to prototype the support size before cutting plastic.\n1/8 inch HDPE plastic sheet for hook support mounting.\nTest fit in location on my RANS Rocket.\nRounding the corners with a jigsaw.\nI scored the plastic with a razor knife and then folded it over to break the edge, similar to cutting drywall. I used a jigsaw to round over the corners of the sheet, then I cleaned up the edges with sand paper.\nThe mounting requires two holes in the support panel. I locked the clips on the rack and positioned the bag where I wanted it to mark the hole positions. I used the soldering iron to melt through the back fabric and into the plastic, then drilled holes in the support. Last, I melted the hole in the back fabric to match the size of the drilled hole. I was careful to not melt into the nylon pocket material. After I tightened the nylock nuts for the hooks, I made sure to clean off any edges that might cut in the pocket.\nThe last design element I borrowed from Arkel is the support rod. This takes the force from the front of the pannier and distributes it to the back, where the hooks transfer the load to the bike. If this rod was not installed, the weight in the pannier would allow the outside edge of the bottom to drop until the contents stopped compressing and the top and front took up the weight.\nThe rod is 1/4\u0026quot; 6061 solid aluminum rod. We started bending at one edge. It is important to keep the edges that meet the top of the pannier well radius-ed to spread the load. First the piece that will go into the webbing pocket, next the section goes along the side, then the portion along the top, next the other side, finally the webbing pocket piece on the far side. The side edge length isn\u0026rsquo;t critical, as long as they are equal. They should be as long as possible, however, because that will reduce the angle it makes with the back. The greater this angle becomes, the more force is pushed into the bike, rather than just down on the hooks.\nSupport rod bent from 1/4 inch solid 6061 aluminum.\nTop rod holder sewed to the top/side. It is mounted back enough that the force in not on the zipper.\nOne side rod holder located at the bottom back. The other side is the same, but reversed.\nI sewed in the top rod holder first. This is the most critical one for positioning. For material, I use a light weight 200 Cordura, which I had on hand. It doesn\u0026rsquo;t match, but no one ever sees it. After cutting the piece, I rolled over and stitched the shorter edges before sewing it into place. Care should be taken to get this as parallel as possible with the back edge.\nMake sure that when the piece is pulled out firmly, it does not reach the zipper. If it does, extra force will be focused directly on the zipper. I\u0026rsquo;ve talked with zippers quite a bit, they don\u0026rsquo;t like this at all.\nThe bottom holder consists of 3/4\u0026quot; nylon webbing, which is folded over and stitched along the edge to form a pocket. You don\u0026rsquo;t have to get the exact length right, but you want to get the fold correct. Once you sew this portion, you can cut the overall length to leave just a small margin to sew it to the bag. To find the position for these, install the rod inside the top holder and mount the pannier on the bike. Fake some force in the pannier top and figure out where it needs to me positioned to get the top level with some force on it. If you didn\u0026rsquo;t get the two sides equal when bending the rod, here is where you correct any small problems. Just make sure to mark the rod so it goes in the same way each time.\nSince my bag is much wider than the pannier I modeled this after, I wanted to beef up the support. I cut and added the 45 degree webbing reinforcement when I sewed the pocket. With that, I was done. I put it on the bike and loaded it down to ride for a few days. I was worried that I would have to tie directly to the plastic sheet, but even after touring for months the attachment I used was sufficient.\nFinal seam of the bag.\nInspection\nPost Script # After my 70+ days on the bike, during my Trans-Am tour, I learned a few things. The overall design and construction was sound. The bags are pretty decent at shedding water and held up pretty well to carrying the bulk of my touring load. A few things didn\u0026rsquo;t work well.\nFirst, I under estimated the tilt angle that I might need to make on the bike, after the bags sagged slightly with heavy load. I would use 60 degrees as a measure next time, instead of 45 degrees. Obviously, if you make them shallower, this becomes less of a factor as well. This was augmented by the second problem, the bottom drooped. Not all loads I put in there were a flat 18\u0026quot; x 7\u0026quot; pieces of baggage. I don\u0026rsquo;t think any were. This causes the bag to get close enough to the ground that I did touch a few times at speed. Cordura fabric is considered abrasion resistant. However they aren\u0026rsquo;t talking about the type of abrasion that pavement gives at 40 mph on a downhill.\nIt might have been a little better to design the bag such that the bottom is level with the ground in the riding position. Notice in the loaded bike picture, the pannier is lower towards the rear than the front. If I gave the pannier a little more height in the front and less in the back, I would have a slightly more optimized design for this cycle, without the bag ground strike issues. Keep factors like that in mind as you design your custom bag.\nMy dad met me two times on tour and I had him bring some equipment to solve these problems. We glued some light aluminum sheet to the outside rear edge, where I occasionally touched down, to form skid plates. We also put some corrugated plastic sheet in the bottom of the pannier. I oriented the channels along the short axis to keep the bottom from curving as much as possible.\nThe entire process was a great learning experience that I would only do again if I couldn\u0026rsquo;t find something commercially available close to what I wanted. It is nice to personalize things, but these bags were a great deal of work.\n","date":"11 December 2007","externalUrl":null,"permalink":"/blog/2007/12/11/how-to-build-bicycle-panniers/","section":"Blogs","summary":"","title":"How To Build Bicycle Panniers","type":"blog"},{"content":"","date":"11 December 2007","externalUrl":null,"permalink":"/tags/pannier/","section":"Tags","summary":"","title":"Pannier","type":"tags"},{"content":"This book was an incredible read. Brian starts his trek by dipping his wheel in the Pacific Ocean and heading east.\nFollow Brian across the United States and learn of his internal conflicts and pressures that time alone on a bicycle set free. Raised in a fundimentalist Christian home, he is searching for the method of understanding his relationship with his father and his spirituality.You do not have to ride a bicycle to enjoy this book.\nI have not found a story that better describes the complex characteristics men use to shield and suppress their emotions. Towards the end, I was broken up as some of Brian\u0026rsquo;s relationship with his father mirrored mine. This book has been a catalyst in changing those parts of my relationship that were lacking.\nDon\u0026rsquo;t let me make you think that the entire book is a serious soul searching saga. The crisp description of this cross country experience is dotted with experiences and characters such as the First Church of the Absurb member, Brian runs into along the way.\nWhile there are some stories during the trip that I wish were more developed, I think you will enjoy reading through this deeply touching book.\n","date":"9 December 2007","externalUrl":null,"permalink":"/blog/2007/12/09/a-cyclists-journey-home/","section":"Blogs","summary":"","title":"A Crossing: A Cyclist's Journey Home by Brian Newhouse","type":"blog"},{"content":"","date":"6 December 2007","externalUrl":null,"permalink":"/tags/dessert/","section":"Tags","summary":"","title":"Dessert","type":"tags"},{"content":"","date":"6 December 2007","externalUrl":null,"permalink":"/tags/recipe/","section":"Tags","summary":"","title":"Recipe","type":"tags"},{"content":"This pie is a family tradition, always present at Christmas and Thanksgiving. It is similar to a Pecan Pie, but with a little more body.\nIngredients # 1 frozen pie shell 1 stick of butter, melted 2 eggs 1 teaspoon vinegar (Apple Cider type is best) 1 cup sugar 1 teaspoon vanilla extract 1/2 cup raisins (gold or regular) 1/2 cup chopped nuts (normally use pecans) 1/2 cup coconut (shredded) Directions # Blind bake the 9\u0026quot; pie shell, according to the package instructions. The pie is really moist and without this step, the crust doesn\u0026rsquo;t get done. The trick with blind baking is not burning the outer crust, when you finish the bake with the filling. You either don\u0026rsquo;t bake the crust as much, or use a Pie Crust Shield. Also be carefuly to watch the sides of the pie crust, as they tend to slide into the pie tin. I hand crimp the edges down, after thawing the frozen pie shell. (This also makes it look more like you made the shell too. Is that cheating?)\nFully mix melted butter and sugar Mix in vinegar, vanilla, eggs (make sure butter isn\u0026rsquo;t too hot, you don\u0026rsquo;t want to cook the eggs) Add the raisins, nuts and coconut and mix until uniform Dump everything into the pie shell and level it out. Bake at 300 degrees for 40-50 minutes. The top should be uniformly browned and the center firm. Notes # While this pie is great the day it is baked, it gets better if put inside a gallon sized ziploc freezer bag and frozen. Something with the freezing of the pie makes the flavors meld together better. For a really handy pie, cut it before freezing. Then you can grab it out of the freezer and take it when you need to bring a dessert. The pie is really hard to cut when frozen, but the pieces get soft very quickly when served. The pie doesn\u0026rsquo;t loose its flavor even after a few months in the deep freeze.\nVariations # The important parts of the recipe are the butter, sugar and egg. Just like a pecan pie, the egg cooks and gels the pie together. I tend to like a little more coconut than the recipe and a little more pecans. Variations on fruit such as dried cherries instead of raisins are interesting.\nI have also made this into a bar with a flat dough on parchment paper that it blind baked, then a layer of the filling on top. Let cool for a while before cutting. These turned out well and were a smaller portion of this rich dessert.\n","date":"6 December 2007","externalUrl":null,"permalink":"/blog/2007/12/06/recipe-japanese-fruit-pie/","section":"Blogs","summary":"","title":"Recipe - Japanese Fruit Pie","type":"blog"},{"content":"","date":"4 December 2007","externalUrl":null,"permalink":"/tags/bicycle-touring/","section":"Tags","summary":"","title":"Bicycle Touring","type":"tags"},{"content":"","date":"4 December 2007","externalUrl":null,"permalink":"/categories/trans-am/","section":"Categories","summary":"","title":"Trans-Am","type":"categories"},{"content":"","date":"4 December 2007","externalUrl":null,"permalink":"/series/trans-am/","section":"Series","summary":"","title":"Trans-Am","type":"series"},{"content":"I have been asked many times why I wanted to ride a bicycle across the county. Having completed the trip, the question became easy to answer. Before I left, I\u0026rsquo;m not sure I even could answer it.\nI am a bicentennial baby, born in 1976. This is the same year the Bikecentennial route was created as a celebration of our 200 years as a country. Thousands of cyclists rode across the country on that route during the inaugural year. Many thousands more have crossed the United States on the same route since. The route is still maintained by the same organization with a new name: Adventure Cycling. Their maps are extremely helpful for the bicycle tourist and have kept the same basic route, with slight changes as roads are modified over the years.\nAll of this is well and good, you say, but it still doesn\u0026rsquo;t answer the why. The truth is that I didn\u0026rsquo;t really know. I read a tour report on-line and thought it sounded interesting. Over the years it fermented into a strong desire. I wondered if this was something I could do. I started riding a Trek 520 touring bike in college. I was overweight. No nicer way to say it. Riding 50 miles in a day was a task. This wasn\u0026rsquo;t because I couldn\u0026rsquo;t physically do it, my butt just couldn\u0026rsquo;t handle the time on the bike. Yes, I had the real bike shorts. I tried three different seats. It just didn\u0026rsquo;t work. All season would be required before I could do two back to back 50 mile days. I couldn\u0026rsquo;t see myself riding across the country, when you are doing 50+ mile days, every day. The idea was put on the shelf.\nI started working at Office Depot as a Business Machine Specialist, while in High School. Lower hours during the school year and full weeks during the summer, I didn\u0026rsquo;t have much time off. When High School turned to college, I worked as much as I could to help pay for school. Added to that a challenging Engineering curriculum and there wasn\u0026rsquo;t much time off. Then I started work at a consulting company, pulling crazy hours and throwing myself into my work. The reality was that I needed to get a life, but I didn\u0026rsquo;t realize it at the time. I had work and not much else. Work was challenging and I enjoyed it, but I was burning myself out.\nIn 2001, I ran into a man on a recumbent bicycle. The man\u0026rsquo;s name was Pete, something I didn\u0026rsquo;t know until months later when we became friends. I asked him so many questions that he graciously answered. Soon after that encounter, I purchased my first recumbent. It would be the first of many to come.\nWith recumbents came pain free riding. They allow you to ride a bicycle, while you sit in a lazy boy recliner. I started easily riding 50 miles. I rode a century (100 miles) without much problem. I thought back to the first century I rode on an old mountain bike without road tires. That experience is currently in Webster\u0026rsquo;s as a definition for pain. I had trouble walking for a day or two after that. With the recumbent century, I just had sore legs and nothing else hurt. This was the way to ride.\nNow having a way to ride across the country, I began to seriously consider it. I didn\u0026rsquo;t know if I could actually make it all the way across, physically. That became another reason to do it, just to see if I could. This is the same reason people have climbed mountains and explored new realms.\nWhile the discovery of recumbents was occurring, I started consulting for an Internet startup in my day job. Working 6 and 7 days a week for 80+ hours each week can take a toll. It was challenging and I enjoyed the work, but I was getting further burned out. I needed a vacation that I didn\u0026rsquo;t feel like I\u0026rsquo;d had since High School. I had saved up so much vacation time, it was ridiculous.\nI finally set a date for the trip and told my boss that I would need 4 months off work. I told him that I would like to come back to work, but would take the time off regardless of a job waiting for me or not. I had over a month of vacation to use and knew I would get a few more paychecks during the trip, even if I was forced to quit. If I needed to find a new job when I got back, so be it. I wound up with two months paid leave (I could pull forward vacation time from the new PTO system in addition to my vacation) and two months without pay. Then I would return to work.\nYou would be bored with a description of all the small projects I was put on during the months before my departure. I couldn\u0026rsquo;t do a full term project, because I wouldn\u0026rsquo;t be around. As never happens (snicker), all the projects ran long. Instead of getting ready for the trip, I was working serious overtime again. I was getting burned out with a vengeance.\nSo why did I go? Had I known the serious and life changing effect this trip would have on me, I would have come up with a better answer. But the only answer I came up with is this: I had to go. I needed those hours of uninterrupted thought. I needed to figure out if I was doing what I wanted in life. I needed to change something. I needed to see if I could ride a bicycle across the country.\nI just had to go. So I went. And it changed my life.\nMy outlook on so many things is different. The definition of what you actually need to live. We think we need so much more than we do. When life is a bicycle and what you can carry, you have to simplify and ration your belongings. Each hill demands justification for every pound on the bike. For all but the most seasoned bicycle tourists, the first few towns\u0026rsquo; post office is a must stop location. You have been on tour for some days and you can\u0026rsquo;t for the life of you understand why you brought this heavy, useless [fill in the blank]. Then be prepared to do the same thing in another few days, when yet another piece of equipment is voted off of the bicycle. This is an event similar to backpackers, where common hostels and other meeting locations often have a place to leave things that others can take.\nThere isn\u0026rsquo;t a month that goes by that I don\u0026rsquo;t long to be out on the road again for a while. I am now over 5 years from my big trip and I still miss it. The challenge was almost too much for me at first. But it was an emotional triumph to persevere and conquer my weakness.\nThe experience isn\u0026rsquo;t the same for everyone. Many on the tour would have only goals in mind. Finishing the tour in a certain amont of time. This is often a necessity due to work schedules and other things. I didn\u0026rsquo;t finish the trip, due to an accident. But it didn\u0026rsquo;t matter, as my goal was touring.\nI was surprised when I would ask if others had seen the beautiful artesian well or stopped at the museum.\n\u0026ldquo;Nope. But we made our mileage in under 5 hours.\u0026rdquo;\nWho cares? How full of experiences were those miles?\nThe same is true with life. Are you living life to really live it or are to constantly striving ONLY towards goals and missing life? Is your job and crazy hours caused by the things you surround yourself with and who know rule you? Life can be as simple as a bicycle and being homeless. Everything else is gravy. But too much else is a millstone around your neck.\nLive with a purpose and justify all the drains in your life. Live simply. Live happy. Because doing otherwise isn\u0026rsquo;t really living.\nI learned that by riding a bicycle across the country.\n","date":"4 December 2007","externalUrl":null,"permalink":"/blog/2007/12/04/why-ride-a-bicycle-across-the-country/","section":"Blogs","summary":"","title":"Why Ride a Bicycle across the Country?","type":"blog"},{"content":" I searched without success for a lightweight, waterproof bag to protect my Martin Backpacker Guitar. Typical dry bags used for water sports are overbuilt for bicycle touring and backpacking use, where weight is a very large factor. They use clear vinyl or heavier vinyl coated cloth and weigh many pounds. This article describes the process I went through to make my own custom lightweight waterproof bags for touring and backpacking.\nI ordered a set of front panniers and some lightweight waterproof bags to use in the panniers from Arkel. You can see the \u0026ldquo;roll over and snap\u0026rdquo; type closure of the dry bags I received. In these bags, I saw the perfect material to produce a travel guitar dry bag. I asked Arkel about getting a custom bag made, but they turned me down. Their supplier did not have the flexibility for a custom project. The design of these bags is dead simple, so I decided to just make one.\nThis page is my first attempt at making the bag and shows a large collection of what not to do if you attempt the same thing. Hopefully there are enough tips that you will be successful. You should be able to follow this page to make waterproof bags for any shape you want to, even simple squares. Although, If Arkel carried the size I wanted, I would probably just purchase it from them as the cost for materials and time to build a bag makes their prices really reasonable. Just remember to leave the biggest side open!\nThe Fabric # I had posted to the phred.org touring group (no long around) about waterproof bag material and was referred to The Rain Shed. They turned out to be a very helpful resource on harder to find fabrics for outdoor gear. I started with the huge sample set, knowing I would soon need additional material for the custom bicycle panniers I also had planned. I purchased a small amount of some 70 Denier Taffeta and 200 Denier Oxford Heat Seal Fabrics.\nThe 200 was almost exactly the same weight as my existing dry bags, and the 70 looked a little too light and would be puncture too easily. It is more like a very thin jacket lining that would have addition reinforcement. My bag would not have that luxury. I ordered 2 yards of the 200, some 3/4\u0026quot; plastic side release buckles, and some 3/4\u0026quot; flat nylon webbing. The dry bags from Arkel used 1\u0026quot; buckles, but 3/4\u0026quot; is sufficient, as there really isn\u0026rsquo;t any load on them and the smaller size allows for a tighter roll. Get the thinnest webbing you can find. Again, no force is really involved here and thinner webbing is easier to sew.\nThe Template # I taped together some cardboard pieces to create a template for the guitar. The template is around 2 inches larger than the guitar. This extra area is need for both the material to seal and the thickness of the guitar. This was just a guess on my part, but make sure to guess bigger than needed. It is easier to seal in further and cut off excess than to start over.\nI used two small pieces of double stick tape to keep the template from shifting as I cut it. I would have produced a more even and cleaner cut if I used masking tape around the edges and cut through it. Just make sure when you cut the material that you don\u0026rsquo;t pull it. The more you let it lay without tension, the more accurate you can follow the template. Years later, I started woodworking and found out about carpet tape. This is a fiber backed extreme double stick tape. It is all I use for most projects, instead of the cheap foam tape shown in the pictures. You can find it at most big box stores, such as Lowes, Home Depot, etc.\nThe guitar looks just about right laying over the first side cut out. I set up for cutting the second side with my template same side up as it was in the last cut. DON\u0026rsquo;T DO IT THIS WAY! I was lucky that my template was fairly symmetrical, but I had to twist the bag at certain places to make the sides line up when sealing. If you flip it over when cutting the second side, they should like up perfectly. In other words, act like the template edge of the open side is a hinge when flipping the template.\nDry bag for inside panniers, purchased from Arkel\nCardboard template for dry bag\nDry bag material template beside guitar\nA few pieces are all you need\nStandard Foam Double-Stick tape\nFirst cut\nIf I did this again, I would make a half template and use that to create the full template. With the band saw I now have access to, I would make it out of cheap 1/8\u0026quot; material, allow me to cut it out with a hot soldering iron or hot knife. This would eliminate the need to seal the edges later, and I could have cranked out a couple and probably sold them (if the reaction to this tutorial is any judge of that.) My biggest mistake on this was not taking my time to make a good and symmetrical template.\nIt would also be useful to make a heat seal template that was 1/2\u0026quot; smaller all around. This would allow you to iron and press into the template and get a uniform seal (unlike my first failure.)\nSealing the Edge # I turned on my standard household iron and started sealing the bag. (It was happy to be used for a change. I love wash and wear fabrics and like to keep the iron on a shelf.) I had played with a few scrap pieces before I started and I recommend you do the same. The best setup I found was around 5 or 6 (my iron has 1-9) and moving a little slow. Be sure to practice the sock technique described below.\nAfter the first sealing attempt, I test fit the guitar. I couldn\u0026rsquo;t have done it better if I actually DID know what I was doing. I noticed some less than satisfactory seals. Forcing open the inside with your hand allows you to see how far in the seal has taken. The orange arrow points out a section not sealed almost all the way out to the edge. A good bit of this is because of the twisting that was required, because of the asymmetrical template. Taking time on the template construction or flipping over the template when cutting out these pieces will eliminate some of this. You are shooting for about a 1/2\u0026quot; of seal or better.\nGuitar over first cut\nMaking the second cut\nStandard iron to seal edges\nWhat the sealed edge looks like\nFirst test fit\nExample of a bad seal\nI had some problems getting the wrinkles to seal. The ironing board cover I was using is too soft and it didn\u0026rsquo;t hold the bottom sufficiently. I worked slowly over the entire edge and did the best I could.\nAfter I thought that bag was sealed perfectly, wanted to test it. How do you measure how much water gets into a bag holding something? That is pretty hard to do. But you can test how well it holds water. I took it to the bathroom and filled it with water. If it is can hold in water it should keep water out, right? As you can see, I had a problem. My haphazard method of sealing the edges needed some improvement. I hung up the bag to dry out and try again at the sealing.\nBack to the drawing board. There were two problems with my method of sealing. First, I couldn\u0026rsquo;t rub down the edge behind the iron, because the heat seal coating really retained heat and it burned my fingers. Solution: I just put a sock on my hand and rubbed directly behind the iron. Second, my ironing board is too soft and the bottom fabric isn\u0026rsquo;t forced up against the top to heat up its sealing material. Solution: I used a large piece of standard corrugated cardboard under the bag when ironing.\nI should also note that it is a good idea to do some tack seals. By that I mean do something similar to what welders do with tack welds. Lay the bag out and use the iron to seal small sections every couple inches. This keeps the edges from going out of alignment when you run the full \u0026ldquo;weld\u0026rdquo; down the edge. It was at this point I realized how skewed my bag was from making a bad template.\nNot quite there, bag is leaking\nDrying bag after water test\nUsing sock to rub down the hot edge\nRolling up bag to check length\nBefore doing the second sealing, I put in the guitar and trimmed the bag length down. You want to have enough length to be able to roll up the end three of four times and then make the ends touch. The bag will close like the first picture at the top of this page. It is safer to leave the bag a little longer.\nAfter completing a better seal, the bag was water tight. If I ran out of water bags, this would work in a pinch. I trimmed off where the two sides didn\u0026rsquo;t match up. This is yet another reason to take time on a good template. If you were perfect in cutting out and lining up your side, you can skip this part. That is an easier method by far, as it is much easier to judge the true seam width if both sides are lined up before sealing. The sizable pile of scraps when I finished up was a testimony to how poorly I did. Time to dry out the bag again.\nAttaching the Clips # While the bag dried, I cut webbing pieces for attaching the clips to the bag. With a low temperature soldering iron, I slightly melted the edges of the webbing to keep it from unraveling after the cut.\nTo attach, you just fold the webbing around the top edge of the dry bag and sew a zigzag stitch forward and backwards a few times. I tested out the setting with a spare piece of webbing and on of the dry bag section I had cut off. You need to get the length close., as your seam should be sew over the location where the bag is already sealed.\nIf you sew into the unsealed area, you reduce the opening size in the bag and introduce many pin holes where the bag can leak. This isn\u0026rsquo;t a large factor in the water tightness of the bag, because of the multiple rolls. However, I believe that having edges of a zig-zag stitch on the inside would be more likely to tear out than the uniform sealed edge. This is a place that will be stress each time the bag is open. It is safest to just keep the seam over the sealed region.\nWith both clips sew on, I am now finished. To use the bag, you just put the guitar in, roll down the top and clip the clips together. One thing I noticed when sewing the webbing on is the tendency for the bottom piece to walk, when the feet try to move the material. Start the first full section of stitches by hand to avoid this.\nMelting edges of webbing to keep from unraveling\nSewing the clip\nHow to attach the clip\nClip sewn on the bag\nFinished bag\nOver sealed, so now it won\u0026#39;t fit!\nI cut the bag for length before the second sealing. Didn\u0026rsquo;t try to fit it after the second sealing until after I sewed on the buckles. I was so concerned with water tightness that I sealed in almost an inch, instead of the 1/2\u0026quot; that I originally wanted. This created a serious problem, as my guitar will no longer slide in the bag all the way. I sealed it really good this time, so it doesn\u0026rsquo;t want to come apart.\nWhoops! I knew this first one wasn\u0026rsquo;t going to be pretty, but I assumed it would work. That is why I bought 2 yards. I have used less than a 1/2 yard so far and this first attempt can be turned into a waterproof cell phone case.\nPost Script # This article was written a few years ago. I wound up not taking the Backpacker guitar with me on my bike tour. I also no longer own this guitar or bag. This shouldn\u0026rsquo;t keep you from making your own, however. The one problem with this bag is the possibility of puncturing the bottom, there the neck inserts. Cut off strings are very sharp. My solution for this was to get a very thick wool sock that fit over the tuners. This did two things, first it protected the water proof integrity of the bag. This sock also protected the exposed tuners, a second unintended consequence. Good luck if you take on this project. With a little work, you can have a nice dry bag for any custom application that should last a long time.\n","date":"1 December 2007","externalUrl":null,"permalink":"/blog/2007/12/01/creating-a-dry-bag/","section":"Blogs","summary":"","title":"Creating a Dry Bag for my Martin Backpacker Guitar","type":"blog"},{"content":"","date":"1 December 2007","externalUrl":null,"permalink":"/tags/dry-bag/","section":"Tags","summary":"","title":"Dry-Bag","type":"tags"},{"content":"","date":"1 December 2007","externalUrl":null,"permalink":"/tags/sewing/","section":"Tags","summary":"","title":"Sewing","type":"tags"},{"content":"I have not found a way to better describe this book than the first sentence inside the dust cover. \u0026ldquo;It\u0026rsquo;s as if Dave Barry and Charles Kuralt squeezed together onto a bicycle to pedal across America and around the world, filing outrageous dispatches along the way.\u0026rdquo;\nIndeed, many times while reading I felt as if I was watching the well done Sunday morning stories where the common man or the small town are shown in all of their glory. Those stories that aren\u0026rsquo;t as touching will give you a great laugh.\nAs an aspiring bicycle tourist, this book was hard for me to put down. I can give a book no better compliment than to say that it followed me to lunch and dinner every day for a week. The only problem I had was trying to cope with the fact that I would not be able to start any serious bicycle touring until I left on my Trans-Am tour in May of 2002. This book made me want to be out on the road NOW!\nMetal Cowboy is a collection of short stories, which makes it very easy to read in small bites. You should ask yourself if you can really miss out on Joe accidentally tricking an entire town that he is Kiefer Sutherland. How do you outrun the Paparazzi on a bicycle? Or have you ever been attacked by killer geese while riding?\nI have been able to talk with Joe Kurmaskie over e-mail, as he is a member of the touring list (no longer around). There is good news for those interested in reading about more Metal Cowboy adventures. He asked me about the quote in my e-mail signature. Joe may be using it to open his next book. Here is part of an e-mail from Joe:\n\u0026ldquo;Glad to hear you\u0026rsquo;re enjoying my campfire stories\u0026hellip; I\u0026rsquo;m knee deep into completing edits and polishing the second collection in the continuing adventures of yours truly and the open road. This next batch, titled On Yere Bike, More Adventures With The Metal Cowboy takes us through Ireland, more Australia, Alaska and Yukon tales\u0026hellip; bounty hunters and vicious ping pong players in South America and a round of Mexican Jeopardy during intermission of a bull fight in La Paz Mexico, among other things.\u0026rdquo;\nI am sure that Joe has many more stories to tell and I know he can tell those stories with gusto. (Reposting this a few years after writing it, Joe now has 3 books out about adventures in cycling. I just ordered the two I haven\u0026rsquo;t read yet.)\n","date":"4 November 2007","externalUrl":null,"permalink":"/blog/2007/11/04/metal-cowboy-by-joe-kurmaskie/","section":"Blogs","summary":"","title":"Metal Cowboy by Joe Kurmaskie","type":"blog"},{"content":"I\u0026rsquo;m sorry, you can no longer win $15,000 by reading this book. It was the announcement of the solution to the 10 cipher challenges, located in the back of The Code Book, that made me aware of this book. Money aside, if you are interested in learning of the history of codes and ciphers, this book is for you!\nDid you know that Mary Queens of Scots was killed by Queen Elizabeth, because her code was not strong enough to foil the code breakers of the time. Have you ever heard of the Navajo Code Talkers that offered the US Marines a method of secure ground communications in World War II? (Probably more so after the Windtalkers movie.) Do you know the full story behind the breaking of the German\u0026rsquo;s Enigma Code in the same war? Do you know that the first computer was build in England, not the US?\nI knew most of the above facts before reading this book. However, as with most people\u0026rsquo;s understanding of history, my ideas were seriously flawed in the details. This book allows you to start out with the world\u0026rsquo;s earliest codes and learn how to do a little code breaking of your own. If you are at all interested in either the technical or historical history of code breaking, you will enjoy this book. This is the first technical history book that read like a good piece of fiction. When you realize that the action packed stories are historical fact, the book only shines more.\n","date":"23 March 2007","externalUrl":null,"permalink":"/blog/2007/03/23/the-code-book-by-simon-singh/","section":"Blogs","summary":"","title":"The Code Book by Simon Singh","type":"blog"},{"content":"I really wish I had ran into this book before I purchased my \u0026ldquo;utility\u0026rdquo; sewing machine. I got a no frills home machine with a few stitches. It was a floor model, but I would have been better to spend the money on a light weight industrial sewing machine with only a straight stitch. Louise was talking about me when she mentioned those who buy a machine with all of these cool stitches. They play with these stitches for a month and then only sew straight seams. I now wish I had a machine that just sews straight seams like a champ. I\u0026rsquo;m glad I got my machine pretty cheap, as I\u0026rsquo;ll most likely upgrade now that I am having fun making stuff.\nThis book is a great read for anyone who wants to build or maintain gear. The opening of the book goes something like: This is the book I wish I had when I started sewing and repairing outdoor gear many years ago. I am glad I did have it. It explains many things that I have always wondered about. I didn\u0026rsquo;t know if heat sealing and edge was better or worse than serging. She explains the reasons why most garments you purchase have certain seams. It is usually because that is the fastest seam to sew that is \u0026ldquo;good enough\u0026rdquo; for the application. If you take a little time at your home machine, you can make seams that rival commercially produced sewing.\nAs of writing this review, I have finished one pannier, using many of the techniques described in the book. I\u0026rsquo;m looking forward to a few more projects, including a couple from patterns in this book. There is a stuff bag pattern that is a simple rectangle of fabric sized based on the width and circumference of the equipment you want to stuff. I makes a square bottom and is much easier to make than the typical round bottom stuff bags.\nAll in all, if you are thinking about sewing outdoor gear, it is worth the $17 and your time to read through this book. This helped my create my own custom bike bags\n","date":"14 February 2007","externalUrl":null,"permalink":"/blog/2007/02/14/sew-and-repair-your-outdoor-gear-by-louise-lindgren/","section":"Blogs","summary":"","title":"Sew and Repair Your Outdoor Gear by Louise Lindgren","type":"blog"},{"content":"","date":"18 April 2006","externalUrl":null,"permalink":"/tags/inspiration/","section":"Tags","summary":"","title":"Inspiration","type":"tags"},{"content":"This is something often attributed to Paul Harvey. While Paul often read material from this author, he was not the author. This was written by Lee Pitts in People Who Live at the End of Dirt Roads that appeared in the 2000 Chicken Soup for the Golden Soul.\nFor my grandchildren, I\u0026rsquo;d like better. I\u0026rsquo;d really like for them to know about hand-me-down clothes, homemade ice-cream and meat loaf sandwiches. I really would.\nMy cherished grandson, I hope you learn humility by being humiliated, and that you learn honesty by being cheated. I hope you learn to make your bed and mow the lawn and wash the car. And I really hope nobody gives you a brand new car when you are sixteen. I hope you have a job by then.\nIt will be good if at least one time you can see a baby calf born and your old dog put to sleep. I hope you get a black eye fighting for something you believe in. I hope you have to share a bedroom with your younger brother. And it\u0026rsquo;s all right if you have to draw a line down the middle of the room, but when he wants to crawl under the covers with you because he\u0026rsquo;s scared, I hope you let him. When you want to see a Disney movie and your little brother wants to tag along, I hope you\u0026rsquo;ll let him.\nI hope you have to walk uphill to school with your friends and that you live in a town where you can do it safely. On rainy days when you have to catch a ride, I hope your driver doesn\u0026rsquo;t have to drop you two blocks away so you won\u0026rsquo;t be seen riding with someone as uncool as your mom. If you want a slingshot, I hope your dad teaches you to make one instead of buying one. I hope you learn to dig in the dirt and read books. When you learn to use those newfangled computers, I hope you also learn to add and subtract in your head.\nI hope you get razzed by your friends when you have your first crush on a girl, and when you talk back to your mother that you learn what Ivory soap taste like. May you skin your knee climbing a mountain, burn your hand on a stove and stick your tongue on a frozen flagpole. I hope you get sick when someone blows cigar smoke in your face. I don\u0026rsquo;t care if you try beer once, but I hope you don\u0026rsquo;t like it. And if a friend offers you dope or a joint, I hope you realize he\u0026rsquo;s not your friend.\nI sure hope you make time to sit on a porch with your grandpa and go fishing with your uncle. May you feel sorrow at a funeral and the joy of holidays. I hope your mother punishes you when you throw a baseball through the neighbors window and that she hugs you at Christmas time when you give her a plaster of Paris mold of your hand.\nThese things I wish for you - tough times and disappointment, hard work and happiness.\nWritten with a pen.\nLee Pitts\n","date":"18 April 2006","externalUrl":null,"permalink":"/blog/2006/04/18/these-things-i-wish-for-each-of-you/","section":"Blogs","summary":"","title":"These things I wish","type":"blog"},{"content":"","date":"31 May 2005","externalUrl":null,"permalink":"/tags/recumbent/","section":"Tags","summary":"","title":"Recumbent","type":"tags"},{"content":" I am almost fully equipped for touring on my Vision Recumbent with a BOB trailer for cargo. However, I really think a good camp seat would be nice. The only problem with that is the weight must go up the hills. The seat on the Vision is removable by loosening the back mount and removing the bottom pivot mount. This should take only a minute or so to do.\nI am toying with the idea of making a chair bottom for it. This would need to be 6061 aluminum to allow for the welding, but it still might weigh more than it is worth. Here is some early sketches that I am playing around with.\nQuick Prototype of Vision Seat \u0026#39;Camp Chair\u0026#39;\nFront Quarter view\nRear Quarter view\nThe seat bottom rear piece is a rectangle with the bottom a slightly oversized tube to allow it to pivot in the bottom triangle. This render shows the bottom folded how it would ride on the top of the BOB trailer.\nNote: This design never went past the 3D model stage. I now am using a RANS Rocket for touring, but I will keep this page here, in case someone else want to try this. Please let me know if you do!\n","date":"31 May 2005","externalUrl":null,"permalink":"/blog/2005/05/31/vision-seat-camp-chair/","section":"Blogs","summary":"","title":"Vision Seat Camp Chair","type":"blog"},{"content":"","date":"2 May 2005","externalUrl":null,"permalink":"/tags/film-making/","section":"Tags","summary":"","title":"Film Making","type":"tags"},{"content":"","date":"2 May 2005","externalUrl":null,"permalink":"/tags/safety/","section":"Tags","summary":"","title":"Safety","type":"tags"},{"content":" or How not to look Stupid and Burn Down a House # Note: This was an article written for a now defunct site about film making. Thus, the intended audience of the article were low budget independent filmmakers. I wrote this to address may of the problems I witnessed on various sets. However, this applies to everyone that uses extension cords for anything.\nThis article is going to be a little technical and possibly boring to some, but the subject is important. I’m an Electrical Engineer, who also works on films, so I tend to take all of this knowledge for granted. The math involved is really simple, so hopefully this will be more educational than painful for those of you who hate math.\nWhen lighting is used on a set, you must always be conscious of how the power is getting distributed. If not, possibilities include starting a fire, blowing fuses and breakers, or other dangerous and embarrassing things. It is all about the current.\nLights are rated in wattage, a measurement of electrical power. There is a relationship between Power, Current, and Voltage that states: the Power in Watts (W) is equal to the Current in Amps (A) times the Voltage in Volts (V).\nIn a formula this would be: Power = Voltage x Current or in units Watts = Volts x Amps.\nWe have all seen several voltages in the real world. AAA, AA, C, or D batteries are 1.5V, car batteries are 12V, and house wiring in the US is mostly 120V. Current is a measure of the flow volume of electrons and much less familiar to the average person. This is where we have to be careful, as too much current flow makes bad things happen.\nHere is how to find the current for a light: Above we learned that Watts = Volts x Amps. If we divide both sides by Volts, we see that Amps = Watts / Volts.\nLets use this in a few examples. A 100W bulb, plugged into a 120V socket would use 100W/120V or 0.83A of current. A 500W bulb would use 500W/120V or 4.2A of current. Now that we can calculate current, what should we do with it?\nMost of the people reading this article will be using lower wattage lamps (1000W and under) that plug into standard household sockets. These circuits are almost always rated at 15A. This means that if you plug in enough things to draw more than 15A, either a fuse or circuit breaker will blow. Assume that you are lighting a kitchen scene and you require three 500W hot lamps. (OK, I know that this would both light the scene AND cook the food, but just play along.) From the calculation above, we know that a single 500W lamp requires 4.2A and three lamps will pull three times as much or 12.6A.\nLooking at that value, you see that you can plug those into the outlets in the kitchen, because the lights draw less that 15A. The scene is lit up, and the actors are in place. “Action.” The dialog starts, just as the fridge kicks on and “BOOM.” The power goes out to the kitchen and all the lights go off. Since the refrigerator is on the same kitchen circuit, when the compressor kicked on, that circuit is now quite a bit over 15A and the breaker or fuse blows. This is embarrassing and annoying. It can also be a sign to the location owner that you really don’t know what you are doing.\nThe easiest solution to this is to run a couple extension cords (or “stingers” in movie vernacular) from other rooms. Typically, each room will have its own 15A circuit. If you are unsure, you can ask to see the fuse box or breaker panel. Hopefully the circuits will be listed in a readable format, where you can determine which circuits are separate. Occasionally you will find a breaker panel that is full of nothing but hieroglyphics. In this case, your best bet is to spread out the outlets used as much as possible.\nI’ll wrap up with a little advice on the use of stingers. When you purchase some extension cords for lighting, make sure to look at the possible current draws for which you will use it. In the US, wire size is specified by gauge. As the gauge number gets smaller, the wire diameter gets larger. While you will most likely be fine with cheaper cords for short runs inside, if you are using quite a few lights outside this is something you need to think about. When lighting up a scene outside, typically only one cord distributes the power out to all the lights. If this run is very long, you need to be careful. To the right is a table showing the extension cord gauge that must be used to safely power lights drawing different currents at different cord lengths.\nLength 10A 12A 15A 25' 16 ga. 14 ga. 14 ga. 50' 14 ga. 14 ga. 12 ga. 100' 12 ga. 12 ga. 10 ga. 150' 12 ga. 10 ga. 8 ga. 200' 10 ga. 8 ga. NO! If smaller cords (higher gauge numbers) are used, you have the possibility of overheating the wires and starting fires. This is much more dangerous than just blowing a circuit breaker. The circuit breaker will not blow on an overloaded extension cord, if the current is within the amperage allowed by the circuit breaker. It has no understanding that you tried to use a 100’ cord with 16 or 18 gauge to power 15A worth of lights. But, when you grab that cord it will be warm or possibly hot and that is not good at all.\nI don’t expect that everyone will bring a calculator to set to do power calculations, but I hope everyone takes away some respect for the problem. This same problem will cause numerous house fires this holiday season, when people decorating their homes or Christmas trees overload the cords. While Christmas lights don’t draw a great deal, they are also built with very small wire. If you chain enough of the lights together, the first light strand will carry all the current for all the lights. When this is next to wood or a Christmas tree, powered 24/7, it is a recipe for a fire. Everyone be careful out there.\n","date":"2 May 2005","externalUrl":null,"permalink":"/blog/2005/05/02/watts-volts-and-amps/","section":"Blogs","summary":"","title":"Watts, Volts, and Amps","type":"blog"},{"content":" We woke up at 5:30 and were ready to set out riding by 6:15. Scott was the only one of the group up yet and he was standing there to hand me a card. We got a chuckle that each of us had cards. He just completed an England to Singapore tour in 2001-2002, is currently on a Trans-Am for 2002, and plans a long tour through South America in 2002-2003. His website is http://members.fortunecity.com/zentack. I haven\u0026rsquo;t had a chance to look at it yet, but he said that some of his first tour are up there.\nAs we were leaving the park, dad went back to get another shirt for the downhills. It was fairly cool that early in the morning. We soon arrived in Everton, which has a small city park that parents missed last night. I don\u0026rsquo;t know if restrooms were available or not, and it was more fun where we stayed. The extra few miles in the morning weren\u0026rsquo;t too bad, but got tougher after leaving Everton. There were no services till Golden City. The 20 miles were hard at first, then eased to flatter and rolling hills.\nThe Road talking with its mouth full\nSaving a turtle\nFlash Flood Anyone?\nEarly hill\nIt was long\nAnother one\nFellow Tourists\nRolling Hills\nRolling Hills\nHello van\nDad taking a break\nSounds like a football play\nFields of harvested wheat\nAN intersection\nTurtle save\nAs we headed into town, I noticed Cookie\u0026rsquo;s Cafe. We were trying to decide if we wanted to get something at the grocery store or sit down for lunch. A couple came out of Cookie\u0026rsquo;s Cafe and told us that they had driven from Pittsburgh (about 45 miles) just for breakfast and to get a pie to take home. I decided that a meal sounded go and we headed into the cafe.\nWalking in, you pass so many pies. They are all homemade and looked very good. We both had the same lunch: beef brisket, cole slaw, potatoes, broccoli, and wheat bread. All the food was very good and the brisket was very tender.\nWe were trying to figure out where the name came from for this town: \u0026ldquo;Golden City\u0026rdquo;. My best guess was the name came from the golden wheat fields. As it turns out, the city is named after Mr. Golden. Not sure who he was, but there you go if you were wondering.\nI had a piece of pecan. It was great. Dad had rhubarb pie, which was as good as he had eaten in a long time. It was my first taste of it and I guess it was ok. :) I signed the cyclist book, noticing that Megan and Bill Pete went through about a week ago and also noticed an entry from the Holland couple. Also saw a fun entry with drawings from the family group I have seen in many logs.\nCooky\u0026#39;s Cafe\nCooky\u0026#39;s Cyclist Log\nCooky\u0026#39;s Cyclist Log\nCooky\u0026#39;s Cyclist Log\nCooky\u0026#39;s Cyclist Log\nCooky\u0026#39;s Cyclist Log\nCooky\u0026#39;s Cyclist Log\nCooky\u0026#39;s Cyclist Log\nMail Home Weight\nAs we were leaving, the Westbound group from Ash Grove came in. We headed over to the grocery on the way out, but it didn\u0026rsquo;t open till 12:30 on Sunday. The time was only 11:30. Looks like we would have eaten at Cookie\u0026rsquo;s Cafe even if we had decided to just hit the grocery store. Just then mother came into town and we recommended the brisket and pie.\nI took a photo of all the bicycle tourists at the post office, going through the well known ritual of mailing whatever they could home to save weight. I\u0026rsquo;ve done that many times myself.\nFirst Armadillo Road Kill\nGrow Big Flowers here\nWind was cranking\nHeading West gave us a bad crossing headwind to ride against. The northern ride into Golden City was great in the southern wind, even when climbing hills. We both stopped in the shade for a bit. When we started again, Dad began pulling a little ahead. I stopped to take pictures of a few things at the Prairie Reserve and some birds along the way. There was a really interesting bird with a crazy long tail. I wish I had better zoom on this camera.\nShade rest\nBethel Prairie\nBethel Prairie\nBethel Prairie\nLong tailed bird\nPretty Grassland\nAfter 10 or more miles, I came across the van. Dad was there. I looked at him quizzically, as I expected him to be further.\n\u0026ldquo;She tempted me with watermelon.\u0026rdquo;\nI also stopped to eat some. Mom had tried the beef brisket sandwich and bought a pie tin full of different flavors of pie from Cookie\u0026rsquo;s.\nAlmost to Kansas\nShade is good\nWe headed out again towards Pittsburg. Short while further, we noticed mother pulled over ahead and some cyclists around. We pulled over and said hello. They were locals from Pittsburg and we had an escort into town.\nCyclists doing a group ride\nCyclists doing a group ride\nCyclists doing a group ride\nWelcome to Kansas\nWe all drafted into town and stopped at the Kansas sign to get a picture with dad and I in front of it. We headed into town and started over to Tailwind Cycling. This is the bike shop owned by one of the riders. We stopped to talk to her sister on the way and I noticed an ice cream truck. I sprinted off and said, \u0026ldquo;I\u0026rsquo;ll be back.\u0026rdquo;\nWhen I got back, dad asked where their ice cream was hiding. I replied that I hadn\u0026rsquo;t seen them sprinting. Later dad told me that the three riders got a kick out of the whole ordeal and had a good chuckle when I first sprinted off.\nTailwind Cyclists\nMoon Bike\nSoon we arrived at Tailwind Cycling, where we purchased some 406 mm tubes and a screw for dad\u0026rsquo;s pedal that had recently fell out. In one side of the shop, there was a moon vehicle built by local high school students. Each wheel had individually articulated shocks, based on a typical rear mountain bike shock. The machine was heavy, but pretty decent for high school students.\nJim, one of the riders, escorted us over to the Aquatic park and gave us a short tour of town on the way. The park admission was reasonable, but the crowd was not. We asked how much just for showers, and the girl working the door said to go on in. We locked up the bikes outside and the showers felt good. After everyone was cleaned up, we headed into town in van.\nBike locked\nPittsburg Aquatic Center\nThe best bang for the tired cyclist buck was Western Sizzlin. We all had the buffet and I thought of tossing rolls to my parents, after I noticed the same roll pans used at Lambert\u0026rsquo;s Cafe.\nNext stop was Wal-Mart. I bought some things I needed and some things I wanted. I found a 4.9 oz spinning reel to go with my tiny little pole. I\u0026rsquo;ll have to see if I want to take the pole with me when I continue on without the van. However, it is a real nice setup for the money and I\u0026rsquo;m sure I\u0026rsquo;ll get some good use out of it while doing smaller tours in Indiana and while backpacking. I just started thinking of having to pay out of state fees for fishing, which is probably fairly expensive even for one day licenses. Hmm.. Dad picked up some interesting folding lawn chairs.\nLawn concert\nAudience\nCleaning beds for the night\nWe headed back to park, where the Pittsburg Community Band was having a concert. It was mostly big band and 40\u0026rsquo;s music, but I enjoyed a few songs before heading over to setup camp. A large group of Hispanic men were playing a spirited game of soccer and I wished I knew more Spanish to follow along with the calls and yells.\nThe park had a small section with ticket rides for the youngins. I talked with the lady running the ride area. I said that every city park I had camped at had a railroad track right next to it. This one didn\u0026rsquo;t, so they put in a little train. She said that she could run it by at 2 AM, if that was what we were used too. I told her that the little bell wouldn\u0026rsquo;t be the same, but she assured us that the little train had a serious whistle. We all had a chuckle.\nThe night was fair and we fell asleep under a picnic shelter with the occasional pre-July 4th firecracker going off.\nToday\u0026rsquo;s Numbers: 7 hours and 33 minutes, 72.7 miles, and 2,570 feet of climbing.\nPittsburg, KS\nSleeping Bag Site: 37 deg 25.063 min N, 94 deg 43.068 min W, elev 1027 ft.\nTrip Miles: 1663.1 miles\n","date":"30 June 2002","externalUrl":null,"permalink":"/blog/2002/06/30/day-42/","section":"Blogs","summary":"","title":"Day 42 - Ash Grove to Pittsburg, KS","type":"blog"},{"content":" Dad and I left the motel at 7:30. We hoped to get some miles in before the heat started baking. I took a photo of the breakfast spot from yesterday on the way out.\nRestaurant next to motel\nWhen I started to stop in Fair Grove, I noticed a Discount Sporting goods place across from the gas station I was initially going to pull into. Dad followed me and it was entertaining to see the various items inside. There were fun little signs, such as \u0026ldquo;I break it and I cry, you break it and you buy.\u0026rdquo; Another sign next to salt or pepper shakers with one mate proclaimed: \u0026ldquo;Here I sit all alone, if you have the mate then take me home.\u0026rdquo; While looking through odds and ends poles, I found a super-light collapsing rod. It would be great for backpacking or bike touring with one of those tiny 5 oz spinning reels. The price showed $6.50 and as I pondered it, the lady said that $5 would take it. I guess it pays to be patient. I was about to get it for the $6.50 price. With my new pole in the pannier, we headed across the street for a chicken salad sandwich and Gatorade.\nDiscount Sporting Goods\nDiscount Sporting Goods\nDiscount Sporting Goods\nIcenhower Grocery Stop\nFlat tire?\nBike 4 Parkinsons\nI got another flat and fixed that. We also ran into a cyclist with a BOB trailer doing a tour as a fundraiser for parkinsons. We chatted a while as we rested in the shade.\nThe next town was Walnut Grove. This isn\u0026rsquo;t the Walnut Grove of Little House on the Prairie, as a local told us that most cyclists think. We stopped in at a gas station/grocery store. While we ate some refreshments, we talked with a local retired trucker.\nHe had driven over 3 million miles without an incident attributed to him. He had three accidents during his career, but none were his fault. The first was when a drugged out motorcyclist drove up and on ramp and directly into the truck. The second was driving at night in Montana, where he noticed the pavement up ahead looking different, like it was a newly paved black. Then the pavement started moving. He immediately started gearing down and slowing the truck, but couldn\u0026rsquo;t get it stopped fast enough to keep from hitting a cow and sending it flying many feet through the air. The third event was when a storm got really bad. He kept trying to find a place to pull over and each place there were already cars on the side of the road. It was getting worse and worse, so he finally just stopped under the next underpass. Then the wind picked up and pushed the truck onto its side. A tornado had gone through about 1500 feet in front of the truck, which explains why the wind was strong enough to roll the trailer over. He had some interesting stories, but we had to head out to get down the road.\nGravel Bike Trail\nWalnut Grove\nLunch stop\nWe arrived in Ash Grove as the heat was continuing to build. We stopped to eat at Grant\u0026rsquo;s Restaurant. We called mother and she was still in Springfield. After our meal arrived and we were almost finished, a lady came in to eat. She started talking to herself and then quickly started talking to us. It was the kind of talking that you can only give the shortest answers as possible, as to not encourage her. She said that we should get up early and ride before the heat. Then she said, \u0026ldquo;No. You should get up late and go to church with me.\u0026rdquo;\nMother showed up and became another person to listen to the talking. We headed over to the city park. The pool and showers were open till 6 PM. Mom and dad went ahead to the next town (Everton) to see if it was a place where we could stay. Getting those 7 or 8 miles down would mean less tomorrow. I headed to Expressions for a hair wash, cut and a beard trim. I was looking pretty scruffy.\nWhen I rode back into the park, I started typing on the computer. A few minutes passed before Travis Kroeger pulled up. He has been traveling with a group of 6 or 7 cyclists, all going Westbound. Travis is from Vermillion, SD. He saw the pool and it took little encouragement. Jos Blom (pronounced Yos, like the start of Yosemite), from Holland, and Travis were traveling a little ahead of the rest and the others were going to try and catch up tonight. As they headed off to the pool and showers, I tried to type more.\nPretty soon, my parents were back from the town ahead and even if they had found a decent place to camp, we would have stayed here anyhow. Why pass up time to visit with fellow cycle tourists? They had met an Eastbound cyclist in Everton. Dad said that his eyes got real big when a description of pool and shower was mentioned. He made good time and pulled in just after the van arrived.\nI went swimming with dad and the cyclists, then showered before the pool closed at 6 PM. The pool was $2 admission, but when we tried to pay, the guy asked if we were cyclists. We answered in the affirmative. He informed us that cyclists swam for free. We said that it sounded good.\nAs expected, the others arrived about 30 minutes after the pool closed. We visited with everyone and broke out a watermelon mom had picked up. This is a treat, as no cycle tourist routinely carries groceries that heavy with them. They had run into a Tom\u0026rsquo;s delivery man a while back and were carrying some of the free chips that were just expired. They were telling us how funny two of them looked when they came back one night with pizza boxes strapped on the back of one bike and the huge box of free chips on the back of the other. Everyone was happy to help us eat most of the watermelon.\nHair Cut\nOther tourists\nOther tourists\nI\u0026rsquo;ve already told you of Travis and Jos, the whole group also consisted of Scott Zentack from Austin, TX, Corrin Warkentin from Columbus, OK, Mike Mitchell from Chicago, and Maria from Baltimore. I have forgotten Maria\u0026rsquo;s last name. Tomorrow would be Maria\u0026rsquo;s birthday and the group was taking a day off in Pittsburg.\nWhole Group\nTent City\nNot sure what was going on\nWe set up camp at one of the corners of the park, under a picnic shelter. We were planning on the standard picnic table sleeping, so we didn\u0026rsquo;t have to get our tents broken down in the morning. I called my sister and chatted for a while as I rode around the 1/4 mile track in the park. The other tourists got a kick out of my technical bike with me riding along chatting on a cell phone. While I was talking, some local kids started riding around the track with me. After the phone call, I stopped and talked with them for over 20 minutes. I answered so many questions about the bike and the trip. When I asked if they had access to the internet, they all said yes. I gave them cards for my site and they were seriously happy about it. It is funny how easy it is to make someone\u0026rsquo;s day.\nHome for the night\nYea haw\nHappy Birthday\nWe cooked dinner under our shelter and sat down for a meal. After eating, dad and I rode around the track a bit. We were showing the others our lighting setup and then we sprinted around the track for a bit of a race. You could tell that it wasn\u0026rsquo;t a real hard day. :) Mike came over and told us that they had a little cake for Maria and we were welcome to come over. Maria had made a joke about being a queen for the weekend, so I made her an aluminum foil tiara. We had a small, short little party and headed to bed.\nToday\u0026rsquo;s stat: 5 hours and 16 minutes, 53.7 miles, and 2,950 feet of climbing.\nAsh Grove, MO\nSleeping Bag Site: 37 deg 19.018 min N, 93 deg 34.763 min W, elev 1066 ft.\nTrip Miles: 1590.4 miles\n","date":"29 June 2002","externalUrl":null,"permalink":"/blog/2002/06/29/day-41/","section":"Blogs","summary":"","title":"Day 41 - Marshfield to Ash Grove","type":"blog"},{"content":" I had trouble sleeping through the snoring of two parents, and woke up tired. I had hoped to get some time in Springfield last night, but I arrived too late. If we pushed for Ash Grove, we could drive back into Springfield, but I wouldn\u0026rsquo;t get into there until late again. I decided to have a zero day and went to the office to pay for the second night in the room.\nHome for two nights\nDad driving\nSelfie\nWe headed over to the restaurant next to the motel and had a country sized breakfast. It was filling and good. I also picked up a can of opossum (road tenderized and only 20% or less of gravel, dirt and other contamination). I didn\u0026rsquo;t pick up anything major from Virginia, but I have Kentucky coal and Missouri opossum. :)\nWeird riding in car\nBass Pro\nEntrance\nThere were serious wrecks on I-44 heading into Springfield and we talked with some locals heading out of the restaurant. They told us some detailed directions for getting into town. The best part was just following some detailed directions and assuring us that it would get us into town fast he added, \u0026ldquo;I hope.\u0026rdquo; That gave us all a chuckle.\nThe first thing that I wanted to see was Bass Pro\u0026rsquo;s International Headquarters. This place is a sportsman\u0026rsquo;s paradise. There are way to many things to spend money on. We headed up to the mounted animals exhibit. They have many of the larger animals on North America, some serious fish and other animals from around the world. Most displays had information on the species and their past and current habitats. It was very informative, and you were able to see many animals up close that wouldn\u0026rsquo;t be possible or advisable, such as a wolverine. I filled up 3 memory cards for my digital camera and spent over an hour and a half walking through the exhibits.\nTwo Turkeys\nInsert head here\nCanoe Building\nCanoe\nMom lost the staring contest\nRhino\nLion\n160 lb Alligator Snapping Turtle\nSmaller Turtles\nNext, we headed down to the boat section. There was a 6 hp four-cycle outboard engine that was inside a water tank. It was amazingly quiet and had none of the typical two-cycle oil smoke. I\u0026rsquo;m sure it is also much more fuel efficient. I needed another pair of socks and headed over to the shoe department. I found a high priced pair of hiking socks and then we headed over to the large fish tank, for the fish feeding show. The show was very corny, but the fish were cool. There is an 80+ pound blue channel catfish in the tank that we were able to see, as well as many very large bass and other fish. The also have a 160 pound alligator snapping turtle.\nLambert\u0026#39;s Cafe\nYes, they throw rolls\nNever empty\nIf you see this, stop in.\nTyping journals for you\nStory of Lambert\u0026#39;s\nYum. Dinner\nRoll throw follow through\nBack to the room.\nWe left to catch The Sum Of All Fears at the local theater. It was a decent adaptation of one of Tom Clancy\u0026rsquo;s better novels. After the movie, we headed to Lamberts. This is a fun place where rolls are distributed by being thrown at you. When the rolls come out, you hold up your hand and get read to catch. I didn\u0026rsquo;t realize that they were as soft as they were and let the first roll squish between my fingers and bounce off my glasses. Too much to describe, you just have to go there and check it out. The three locations are available on their web site, which I think is: http://throwedrolls.com/\nMarshfield, IL\n","date":"28 June 2002","externalUrl":null,"permalink":"/blog/2002/06/28/day-40/","section":"Blogs","summary":"","title":"Day 40 - Layover Day in Marshfield and Springfield","type":"blog"},{"content":" I woke up at 8 AM, after less than 5 hours of sleep. Dad had left at 5:50, to get an early start on the day. He slept at least an hour more that I did, even leaving early. Probably closer to 2 more. I stopped early at a gas station and taco bell to get some sports drink just before 10.\nHome last night\nFirst stop for drinks\nYay, downhill coming\nOn the route into Ben Davis, I happened upon a fire tower about an hour later. That is generally a good sign that you are in a hilly area. I decided to climb up and take a look. It was was a decent hike, but slightly different muscles.\nPretty country\nFire tower\nShould I?\nView from above\nView from above\nView from above\nView from above\nUp from below\nBye fire tower\nI climbed up into Ben Davis and had a roast beef sandwich at the only place to stop. It was a gas station and grocery, which makes sandwiches. They have an Adventure Cycling Section 9 map on the wall. This is the section I have been using the past few days and shows the town of Ben Davis on map 106.\nPretty day\nAlice School\nBen Davis Country Store\nGetting a Sandwich\nTrans-Am Map on Wall\nWhen I headed into the restroom, I was startled by some serious banging. It stopped and I came out to sit down and eat my sandwich and chips. Pretty soon a local guy said that it will be loud, as he had to nail up a security sign. I chuckled to myself as I see him pick up a 16 penny nail and proceed to start pounding it into the siding. A 4 penny nail would be overkill for this sign, and the 16 penny is like going deer hunting with an Abrams Tank. The other thing that I noticed, when I was in the bathroom, was the concrete wall directly behind the area he was nailing. As I expected, the nail never penetrated past the 1/4\u0026quot; thickness of the paneling.\nNo swimming here\nNice scene\nI set off again and rode a good ways into Hartville. The heat was pretty bad and I had to push through it to make it into Marshfield before dark. I passed a Mill and the workers on the dock were making arm pumping motions. These are the type that you make to get a semi-truck to blow his air horns. I made the same motion, punctuating the down position with blasts from my air horn. The guys jumped back and started laughing.\nClosed. :()\nGetting Bananas\nYes, a bike can carry a 120 decibel air-horn. I wanted to stop for early dinner in Hartville, but both cafe\u0026rsquo;s were closed at 3. I headed back to the grocery I had passed. The Mill was just before and all the guys were now yelling, \u0026ldquo;You\u0026rsquo;re going the wrong way!\u0026rdquo;\nI picked up two bananas and headed to the restroom to fill my underseat water bottle. The faucet was about 5 inches above the drain, and my bottle was much taller. I took the bag that my bananas had been put in an rinsed it out. Then I filled it up with water and used my teeth to tear a section from one end. This poured nicely into my container and I was ready to head out of town.\nI had not been far enough out of town earlier, as I realized when the Subway appeared. It was very new and the employees were still working things out. I ordered a 6 inch chicken breast sandwich, chips and a drink. One of the girls there asked if I would like some of the cookies that were burned. She said they were not burned, burned, just burned.\nFree cookies\nHay bales\nThe road ahead\nDo touring cyclists turn down free cookies?\nIs it cool and comfortable in Missouri in the summer?\nNo and NO!\nOf course I\u0026rsquo;ll take some cookies. Usually Subway cookies are undercooked, to keep the cookies very moist. I like them a little more done and these were perfect. I sat down to eat and read my book.\nJust as I was finishing, mother came in. She had been to the Laura Engles Wilder Library in Mansfield (I think, I didn\u0026rsquo;t ride through here). This was the town where she wrote many of her books, although her experiences recorded in the books were about her time in states further north. I couldn\u0026rsquo;t figure how dad had made it in to town already, and expected almost 8 hours of riding time to get there. If he rode constantly, through the heat as I did, he might have made it by 2 PM, but it was some serious riding.\nI left mother and started on the more than 20 miles left to get into Marshfield. When I pulled into the first gas station in Marshfield, I gave dad\u0026rsquo;s cell phone a call. He told me what motel they had found, just past I-44 on the other side of town. He said that the office would have a key for me. They had gone into Springfield and would be back around 10:30.\nHigh Prairie Baptist Church\nSnack Stop\nDinner\nI headed through town and picked up dinner at the Taco Bell, just before the interstate. Then I headed over to the motel. The lady at the office gave me a key to room 23 and I headed over. When I opened the room, I wondered why they would drive into town and not leave me anything. I was too tired to really think about it, so I drank the Gatorade I was carrying and started to eat the burrito I had purchased. I couldn\u0026rsquo;t eat the Zesty Chicken Bowl, because I had forgotten to check if there was a fork in it at Taco Bell and my mess kit wasn\u0026rsquo;t with me on the bike. I just lay on the bed and tried to add some more sleep to last night\u0026rsquo;s less than 5 hour total.\nI woke up after 10 and looked out the window to see the van. I couldn\u0026rsquo;t figure why they parked it away from the door. I headed outside and saw dad walking back towards me with a bucket of ice. Then I watched him go in room 22 where all my stuff was sitting to be used by me when I arrived. I guess I should have figured that I had the wrong key, but I was tired and wasn\u0026rsquo;t thinking well. I guess that is what 8 hours in the serious heat will do to you. At least I had a cool place to take a nap.\nI also learned that dad did the smart thing today and got a ride into town. It was almost a 4000 feet climbing day and he stopped when his legs had enough and lay down in the shade. Then he figured he would get up and go slow until he could get a ride into town. Just as he got up, a truck started coming. Hit put out his thumb and the tires squealed to a stop. The guy was heading into Marshfield, which worked out perfectly. It also made me understand how he arrived in town more than 2 hours faster than I thought he would.\nToday\u0026rsquo;s numbers: 7 hours and 53 minutes, 67.3 miles, and 3990 feet of climbing.\nMarshfield, MO\nMotel: 37 deg 20.731 min N, 92 deg 55.782 min W, elev 1489 ft.\nTrip Miles: 1536.7 miles\n","date":"27 June 2002","externalUrl":null,"permalink":"/blog/2002/06/27/day-39/","section":"Blogs","summary":"","title":"Day 39 - Houston to Marshfield","type":"blog"},{"content":" Today was my first day alone in quite a while. While dad had ridden ahead some days, we eventually linked up. The thunderstorm that was threatening us during dinner last night never passed and all evening was dry. I started slow and was left by the van as I sat down to apply my sunscreen.\nEminence Sign\nEminence Sign\nTouring Group from Yale\nBy the time I had gotten started, the Habitat for Humanity crew had ridden from Ellington into Eminence. I headed into town to look at the historical marker and noticed a few of the Habitat riders and my parents. I took some pictures of the town and headed over to chat with the riders. Then I headed out of town. I noticed a Habitat rider behind me as I left town and she passed me when I stopped to take pictures of some wood carvings.\nCool Carvings\nCool Carvings\nCool Carvings\nCool Carvings\nCool Carvings\nCool Carvings\nI passed her again during a pretty good uphill. The grade wasn\u0026rsquo;t terrible, but it was long. She was sitting on the side of the road with her bike and I thought that something was wrong. When I asked if her bike was ok, she replied that she didn\u0026rsquo;t like hills much. I told her that I felt the same. I recommended that she cross the road to rest in the shade. She agreed.\nYale Tourist Climbing\nTurtle\nCarp\nPath down to creek\nPath down to creek\nPretty soon I came upon Jack\u0026rsquo;s Fork Creek, just before Alley Springs. It looked like a pretty clean stream and if you don\u0026rsquo;t mind swimming with a 16\u0026quot; diameter turtle, all is good. I found a place to climb down into the water over the bridge and it felt great. Pretty soon I notice these yellow Habitat jerseys crossing the bridge. They had seen my bike but didn\u0026rsquo;t know where I was. I yell up that they should come on in, the water is great. They snap their heads down and started grinning. I added that it was kinda tricky getting down, but it was worth it. They kept riding. I picked up an armadillo shell out of the water and looked at it a bit, before climbing the hill again to start riding.\nRest room\nMore hills\nRest stop\nI rode past a picnic area, where some of the Yale group were stopped. I pulled over, hit the restroom, and filled up my water bottles. I passed the Yale support van on the climb out and saw a bike in the repair stand getting adjusted. I also passed that rider that I had been climbing with earlier as she was standing by the van. I rode a few more miles and then pulled over at 1:30 to read for a bit in the shade. Every couple minutes I would hear a bike pass and one of the group yell something like, \u0026ldquo;That\u0026rsquo;s a great place to read a book.\u0026rdquo;\nI talked a little with another recumbent bike tourist on a RANS bike. It is the same make, but different model as mine. I believe it was a Tailwind, with the front wheel in from of the cranks instead of behind. Mine bike is called a SWB (Short Wheel Base) and his is an LWB (Long Wheel Base).\nMore hills\nRecumbent Tourer on a different RANS bike\nI got going after my cool down and headed into Summersville. I noticed the parent\u0026rsquo;s van and headed over to Pam\u0026rsquo;s Kitchen, a local restaurant that looked pretty good. As I was heading in, mom came out wondering if I saw them or something. I had not and was searching for food and AC. They had been at the library on the internet checking mail and catching up on my messages for hours. When I have time to type on my computer, they aren\u0026rsquo;t able to read what I have been writing. Pam\u0026rsquo;s Kitchen was really good food. Dad had asked if the potatoes were real or instant. Pam replied that they better be real, because she remembered pealing a bunch that morning. I ordered lunch and played two games of pool with dad, between bites of lunch. The potatoes were really good, as was everything else. After some rest and digestion, I headed out of town.\nI noticed a signature in the guest book from Adam. He left me a \u0026ldquo;Rock on Joe!\u0026rdquo; and has been pushing miles much more than my tourist pace. He went through here 11 days ago.\nLunch at Pam\u0026#39;s Kitchen\nGuestbook\nGuestbook\nGuestbook\nAll the Yale Equipment\nJust before leaving town, I noticed the Yale van almost pulling out. I had not seen the trailer before and stopped to take a picture of it. As I was snapping the picture, I noticed the same cyclist climbing in the passenger side. She waved and became part of the picture. She rode the into Houston from Summerville in the van. As she said earlier, \u0026ldquo;I don\u0026rsquo;t like hills.\u0026rdquo;\nI stopped in Eunice at a very small grocery and gas place. I\u0026rsquo;m talking a 12 by 20 feet store section. It was small. I asked if there was a bathroom and the owner moved some things to get the bathroom open for me in the back. She mentioned that this was the bathroom that the grandkids had been using and I told here it is fine and thank you. I used the bathroom and flushed the toilet. The toilet started filling up with water and not going down the drain. I pulled off the lid and stopped the flush action. The plunger next to the toilet was a pleasant sight and I plunged a little to hopefully clear the drain. Next flush went down properly and I was very relieved.\nTiny Grocery\nI mentioned it to the owner, just to let her know why the plunger was dripping dry on the toilet. She was apologetic, and I said everything was great and the restroom was wonderful even with the minor problems. I had one of those plastic tubes of frozen flavored sugar juice, to help cool down. I also chugged one of the two 32 ounce Fruit Punch Gatorades I had purchased. Then I headed into Houston.\nI pulled into town around 6:30 and met mom. She said that the pool was open until 7 for showers and told me how to get to the park. All this scouting ahead is nice, but it also eliminates some of the adventure. When you get to town late, however, I\u0026rsquo;ll take it. I just showered at the pool, but dad swam a few laps. He hadn\u0026rsquo;t ridden today and I guess he needed to get rid of some energy. Later I thought that might have been a good idea to loosen up the tired muscles.\nPretty Scenery\nPool\nWe headed out to dinner at the Spring Garden. I had some shrimp stir-fry. I hadn\u0026rsquo;t had Chinese food in a while and was glad that they prepared it lighter than many places. The soy sauce was a good source for the salt that I had sweated out during the day. After dinner, we headed back the Emmett Kelly Memorial Park, our home for the night.\nThe picnic shelter was half full of people when we arrived. I sat down next to the power plug and began typing. I also started some batteries charging. The people started leaving and we rolled out our sleeping pads and bags onto the tables that mom had just wiped off. Mother had talked about laying on the ground instead of the tables, because she was afraid she might roll off. When the hordes of roaches started coming into the shelter. She understood why I sleep on the picnic tables now. We decimated the park roach population with our feet. No big loss. (Next morning, all kinds of bugs were around eating on the dead roaches, scattering the picnic shelter floor.)\nAbode for the Night\nGetting Words Down\nSpooky Moon\nI laid down to try and sleep at about 11 PM. I didn\u0026rsquo;t know the spooky moon had an ominous warning about the night ahead.\nOn both sides I had parents giving me rendition of the Stereo Snoring Greatest Hits. I put on headphones and turned on music and set the sleep timer on my radio. I was almost asleep when the music kicked off, after 90 minutes of sleep timer. The music kicking off kind of woke me a bit and then I leaned over to look at the radio. I noticed a man trying the back door handle on the van. I watched him try to open the driver side and I assumed he had tried the other side before I saw him. We were hard to see in the shelter as we shaded from the outside lights.\n\u0026ldquo;You want keys, it is easier to get in that way.\u0026rdquo; I said to him from the darkness.\nHe looked around, trying to figure out where the voice was coming from.\nWhen he saw me, he said something really lame like, \u0026ldquo;Well, It\u0026rsquo;s my partner\u0026rsquo;s van and I was trying to get in it.\u0026rdquo;\n\u0026ldquo;Why does your partner\u0026rsquo;s van have my parent\u0026rsquo;s company logo on both sides and the rear window?\u0026rdquo;\nHe talked some more, mostly sounding out of it from being drunk or high on something. I told him to get out of the park as it was closed. You can only stay here with permission from the police, which we had obtained. He finally left. I had been talking with authority, which isn\u0026rsquo;t quiet. Both mom and dad had woken up pretty quickly into the exchange. I figured it was a local guy just a little too drunk and he would head home.\nI had trouble getting back to sleep, but dad was back snoring pretty quick. About 30 minutes later, he is back but much closer to the picnic shelter. He wasn\u0026rsquo;t all there mentally, either due to drugs or drinking. He asked if he could sleep under the shelter with us, as he didn\u0026rsquo;t have any place to stay. I told him that he had to ask permission from the police.\nHe kept saying, \u0026ldquo;Why would I want to do that and get arrested or something.\u0026rdquo; Then he went on to explain that he just got out of jail from some city and hitchhiked into town. Now he was instilling seriously positive vibes about him staying here. He didn\u0026rsquo;t scare me initially, but the fact that he came back after we told him to leave the first time. Then the whole ex-convict thing wasn\u0026rsquo;t sitting well. When he started pressing as to why we didn\u0026rsquo;t want him to stay, I told him that the first time I saw him he was trying to break into our van. How can we feel safe with him sleeping there?\nHe had no shirt and tattoos. I told him that a similar shelter was up the road 6 blocks at the pool. He left saying how he couldn\u0026rsquo;t believe how mean we were. I then called the local police and the cruiser showed up in less than a minute. It was pretty surprising response. He cruised around looking for the guy, but didn\u0026rsquo;t find him for a while. Needless to say, I was kind of wired again and didn\u0026rsquo;t sleep for a while. I finally dropped off past 3:30 AM. The police didn\u0026rsquo;t come by to tell us if they got him or not, so the sleep was uneasy.\nI did sleep with my bicycle pump and Halt! dog pepper spray close by. But there were not needed. This was the first sketchy night of the trip. If I had been solo, he probably would have kept wondering down the road as I was in the darkness. It was the van that stopped him.\nToday\u0026rsquo;s Numbers: Just under 5 hours riding time, with 44.8 miles and 3,120 feet of climbing.\nHouston, MO\nTent Site: 37 deg 19.499 min N, 91 deg 57.231 min W, elev 1230 ft.\nTrip Miles: 1469.4 miles\n","date":"26 June 2002","externalUrl":null,"permalink":"/blog/2002/06/26/day-38/","section":"Blogs","summary":"","title":"Day 38 - Eminence to Houston","type":"blog"},{"content":" When I finally got up, I was told that dad had ridden ahead. I started getting ready. I forgot to empty the camera\u0026rsquo;s memory cards and had to do that, along with several other things that I hadn\u0026rsquo;t thought of needing to do the night before. I didn\u0026rsquo;t get going until after I wanted.\nState Park Sign\nThere were some decent climbs all day. I rode into Centerville and noticed dad and mom sitting at the courthouse. Dad had come into town and rested while he had breakfast. It gave his legs a chance to recover from the hills that were challenging us into town. Without this rest, his legs would have mutinied much sooner. There is a stone fence around the court house where they are happy for cyclists to camp. The fire house next to the court house is a tiny little place. The court house had burned down in 1864 by the Confederates and it was rebuilt. Then it burned down in 1871 and was rebuilt in 1872. That is the building which now stands. A fellow in the court house was talking with dad earlier and he mentioned Blue Spring. He said it was right on the route, just a bit off the road, and we should definitely stop and see it.\nMark Twain National Forest\nArtifacts in Centerville\nArtifacts in Centerville\nArtifacts in Centerville\nArtifacts in Centerville\nArtifacts in Centerville\nArtifacts in Centerville\nArtifacts in Centerville\nArtifacts in Centerville\nMemorials\nSupplies\nFire House\nCourthouse\nClosed Market\nRoad Sign\nThe hills were along with us into Ellington, where we met mother for lunch. She had run right through a 4-way stop and was very apologetic to the officer that pulled her over. She didn\u0026rsquo;t know why he did, until he told her about it. She said that she didn\u0026rsquo;t see it and was looking for a place for \u0026ldquo;her bikers\u0026rdquo; to eat. He asked if she was with the large group who planned to stay at city hall tonight. She said that she was only with two who were stopping for lunch. He let her go with a warning. We ate at a local buffet place and sat out a little of the heat. I started up the computer and typed a little. With the parents along, my schedule has been messed up and I haven\u0026rsquo;t typed as much as I wanted. The food was decent, but the AC was great.\nRoad Ahead\nRoad Behind\nRoad Beside\nAfter we had started eating, a cyclist came in with an HBO 2002. I didn\u0026rsquo;t see any bags on his bike, so I didn\u0026rsquo;t know if he was touring or not. I stopped by to talk and found out that Mike is with a group of cyclists from Yale, who are riding across to California for Habitat for Humanity. They were staying in Ellington for the night.\nReynolds Co Sign\nReynolds Co Sign\nBeautiful\nLunch\nMike, unloaded touring from Yale\nAfter finishing lunch, dad and I headed for Blue Spring. The man in Centerville had said that the turn was about 1/2 mile past HH, before reaching Owls Bend. Mother had gone ahead and found out that having the van would be a good thing. When I noticed the Blue Spring 3 miles arrow, I would have kept going on a bike. We hid the bikes in the woods just a little ways and got in the van. It was worth the 3 mile drive in sometimes seriously washboarded gravel roads. If I had a loaded bike and wanted to see it, a better choice would be to walk and hitch a ride in and out if possible. There are many uphill and downhill locations where riding would be impossible and pushing a loaded touring bike difficult at the very least.\nCows\nCooler Cows\nCurrant River\nPretty Scene\nEmpty Stream\nThere is a 1/4 mile walk from the parking area into the spring. Signs told the story of the spring\u0026rsquo;s source. At one time, a dye was added to Logan Creek which dries up to nothing a some point when flowing downstream. A few days later, this water with dye came out of Blue Spring. The flow from the spring is 67 million gallons per day. The water was really running when we visited. There is a section of typical creek, but the vegetation is incredible. There must be some serious nutrients and other things that plants thrive on.\nWhen you reach the spring, the water is so clear that you can see down better than 20 feet. Some contents in the water give it an incredible blue color. The clarity of the water allow plants to grow far down the spring and bubbles of oxygen are constantly rising. The spring was a strange sight. Image a cliff face where a large flowing stream starts, but the beginning is just a 30 feet diameter hole where the water flows straight up out of the ground to start the stream. The water is like that of cave water which has flowed underground for miles. That is to say, very cold.\nBlue Spring Sign\nBlue Spring Sign\nBlue Spring Sign\nBlue Spring Sign\nBlue Spring\nMemorial\nAmazing Clear Water\nBlue Springs Sign\nAmazing Clear Water\nAmazing Clear Water\nBlue Springs Sign\nVan coming out.\nDad had mentioned to mom that he should get in the van at the springs. I didn\u0026rsquo;t know this so I didn\u0026rsquo;t stop mom as she left after dropping us off. He is a bit stubborn and won\u0026rsquo;t quit until he kills himself, sometimes. After we waited longer and longer at the top of some hills, I began to understand. I told him that I would send back the Calvary, but he continued on. Eventually, he stopped just past H and I told him I would send the van. I ran into mother a mile or better from the campground and told her where he could be found. We decided to get a campsite first and unload enough from the van to fit the bike in easier. As she pulled out of the campground and headed up the road, she was passed by dad. He said that he had hoped the hills stopped, but still had more than 800 feet of climbing. He said that he just walked those hills. He will be traveling in the van tomorrow. I think he is afraid that I would write that I rode him into the ground if he didn\u0026rsquo;t finish. He is lighter than me by a bunch, but he doesn\u0026rsquo;t have the 40,000 feet or more of climbing that I have been through so far.\nOzark National Scenic Riverway\nOzark National Scenic Riverway\nGreat place for a home\nEminence is a serious tourist trap. Everything had price. Campsites are sold by the person. $6 per person. $7 if we want electricity. Showers are run by quarters for each 2 minutes of water. With a better than $20 campsite, we pondered a motel, but the rooms are $55 plus $20 per person. $20 per person extra? I have never heard of more than $5-8 per person in Super 8 level motels. Tourist trap.\nMom had picked up some hotdogs and I had been wanting to do a campfire and hotdogs for a while, so that is what we did. The wood we purchased at the campsite was green. Once we got the fire going, you could see the sap oozing out the ends of the sticks. To get it started, dad showed me a little trick. Just pouring gas on the ground and lighting it didn\u0026rsquo;t give the wood enough time to catch. By putting a small pile of sand and dirt in the bottom and saturating it with gas made a much slower and longer burning fire starter. This did the trick and eventually we had enough coals to get the green wood to go up. While I started the baked beans and green beans on my cook stove, dad went out searching for sticks, which burned much better than the junk they sold. Then we grilled some hotdogs. Yum. Dad and I both had 4.\nTrying to get green wood to burn\nTarped Bikes\nDinner\nFire for Hot Dogs\nHot Dogs\nToday was long and hard, with the most climbing I have done in quite a while. Riding Stats: 6 hours 24 minutes of riding with 54.9 miles and 4,480 feet.\nEminence, MO\nTent Site: 37 deg 08.953 min N, 91 deg 20.953 min W, elev 660 ft.\nTrip Miles: 1424.6 miles\n","date":"25 June 2002","externalUrl":null,"permalink":"/blog/2002/06/25/day-37/","section":"Blogs","summary":"","title":"Day 37 - Johnson's Shut-In Park to Eminence","type":"blog"},{"content":" The Johnson\u0026rsquo;s Shut-Ins State Park is 8,470 acres around the East Fork of the Black River. The Shut-Ins are formed by blue-gray steel hard volcanic rock. These rocks were formed when violent volcanic eruptions exploded, causing material to avalanche down layer upon layer, forming the rocks exposed today. The rocks were covered with sedimentary such as limestone, sandstone and shale. After a major uplift that caused the Ozark region, the water covering this area (producing the sedimentary rocks) subsided. As streams cut through the area, it sliced down through the sedimentary rock, exposing the older igneous rocks. Swirling over and around these harder rocks, the river carves potholes, chutes, and canyon like gorges. Johnson\u0026rsquo;s Shut-Ins is Missouri\u0026rsquo;s best example of this occurrence.\nYou can climb among the rocks where the current creates almost waterslide like areas and great places to lay down for a neck massage or a thigh massage. There were many large tadpoles, crawdads, and fish to watch. It was a great place to be last night after riding.\nOur Campsite\nOur Campsite\nI wasn\u0026rsquo;t feeling very good in the morning and my legs wouldn\u0026rsquo;t mind a rest day, so we headed to the office to get another camp site. We got the last one left, but it wasn\u0026rsquo;t the same one as last night. We moved from 48 to 41, so I actually traveled about 0.2 miles on my bicycle today. :)\nWe did the same thing as yesterday and headed to the Shut-Ins after 6 PM. The sun isn\u0026rsquo;t too high and most of the people are gone.\nWe headed to sleep for an early start, but battened the hatches for rain. I heard the familiar sound of a guitar being harmonically tuned and listened to a little bit of some very well played fingerstyle guitar, while walking to the toilet. I miss playing and wonder how much I will have lost after 3 months on the road. The sound outside my tent was just loud talking until 11. Wish we camped closer to the Celtic guitar music. Thunder at 2 AM woke me from my sleep and I watched nature\u0026rsquo;s strobe lights flash for a good while. The rain finally came around 3 AM and I didn\u0026rsquo;t get back to sleep till almost 4.\nJohnson\u0026rsquo;s Shut-Ins State Park, MO\nTent Site: 37 deg 32.687 min N, 90 deg 50.637 min W, elev 921 ft.\nTrip Miles: 1369.7 miles\n","date":"24 June 2002","externalUrl":null,"permalink":"/blog/2002/06/24/day-36/","section":"Blogs","summary":"","title":"Day 36 - Layover Day at Johnson's Shut-In State Park","type":"blog"},{"content":" I found a few roads that took us back to the Trans-Am route at Doe Run. The GPS helps again. We headed into Pilot Knob (named for a local mountain peak.) Pilot Knob and Iron Mountain were both mined heavily for their Iron Ore in the early 1800\u0026rsquo;s. Before the railroad made it to the area, the ore was hauled out on horse and mule drawn wagons. This is a feat in itself. Eventually the railroad came in to haul out the ore. During the Civil War, this became a strategic location, due to the railroad to the North. Fort Davidson was built in Pilot Knob to help secure the area. This fort was the first command General Grant had upon becoming a General. The fort never came under attack during his time there.\nOur campsite in light\nDon\u0026#39;t mind the horse poop\nAnd horse tie area\nParents at breakfast\nDad at Equestrian Sign\nLater into the Civil War, Fort Davidson was attacked by Confederate forces. On September 27, 1864, Major General Sterling Price and 10 to 12 thousand Confederate troops attacked. This was one attack of the famous Price\u0026rsquo;s Raid, covering almost 1,500 miles and involving over 40 battles and engagements. The forces were repelled by 1,400 Union soldiers, including 50 members of the local black militia. General Price decided not to use cannons to weaken the Union forces and initially attacked with just infantry. After the first few failures, two cannons were positioned on a nearby hill, but accurate fire from the fort quickly put them out of service. By nightfall, the fort was surrounded by three groups of Confederate soldiers and the commanding officer decided to quietly evacuate the fort. At 2 AM all but a small detachment quietly left the fort, using hay filled sacks on their feet and various other tricks to keep the horses quiet. The small contingent of men set the fort\u0026rsquo;s ammunition depot to explode. When the Confederate forces heard the explosion (which was also heard by anyone within over 40 miles), they assumed that a dreadful accident occurred in the fort. The explosion was so large as to throw timbers from the fort\u0026rsquo;s walls over a half of a mile. The crater from the explosion is visible in the fort today. Luckily the Union forces leaving the fort were mistaken for Confederate troops as they marched directly past one of the Confederate camps. Confederate and Union soldier alike were buried in the South rifle pit next to the fort.\nWelcome to Pilot Knob\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nFort Davidson Photo\nThe talking slide show in the visitor\u0026rsquo;s center was a little cheesy, but explained a great deal about the area and the fort. There was also a very well done battle map with lights as I saw in Virginia. This was much more helpful in actually explaining the events of the battle. The visitor\u0026rsquo;s center also had many displays of clothing, weapons, rations, cannon and grenades from the conflict.\nLunch Stop\nAfter viewing everything, dad and I went over to the Fort Harrison Restaurant for lunch and a break from the heat. It was Sunday and the place was hopping. We had to wait a while for a table, but managed to get one next to a plug, so I typed a little.\nThe next stop was 5 or 6 climbing miles. Elephant Rock State Park is a little over a mile off route, but definitely worth the climb. The Elephant Rocks were formed when huge slabs of granite were forced out of the ground. Gradual erosion caused the large rocks to wear into smooth rounded shapes. The park starts out with a information kiosk with displays about the formation of the elephant rocks and techniques for harvesting granite. The town next to the park is aptly names Graniteville. The granite used to be sheared off by drilling holes (about as deep and round as a finger) and putting in two pieces of thin metal pieces and a wedge in the holes. The metal pieces make sure the wedge only puts side force in the hole. These holes are created every couple of inches and the wedges are gradually worked in until the rock splits. There were a many pieces of rock that showed the holes where they were split. One rock, just before climbing up top, showed what happens if you don\u0026rsquo;t split the rock with its grain. Like wood, rock had grain. This rock had the rows of holes, but when the split started, it angled away from the intended path. We ran into the large slab of granite, before we realized that there were stairs to the top. Maybe we just like the hard way. It took some rock climbing up 10 feet or so to get on top, and it isn\u0026rsquo;t the easiest to do with my Shimano biking sandals. I should have taken the route dad did an jumped the 3 feet crack. We both had a chuckle after we noticed the stairs up at the other side. This large slab of granite held the granite boulders for which this park is named. There are three huge rocks that look like circus elephants in a line. The largest being over 200 tons. All around up top there are places where names are carved. Some of the names also have dates, and many show serious wear. Once a worker reached the status of Master Stone Cutter, they were allowed to add their name to the rock.\nBikes at Elephant Rock State Park\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nElephant Rock Photo\nOne of the more interesting features of this park is the Braille path. The only sign that would be trouble is the first sign at the information center. It was in the direct sun and running my hand over the Braille was way too hot after the first line. Dad and I both walked part of the trail with our eyes closed. You can feel when you are headed off the path and correct accordingly. When you need guidance during a particularly tricky area, a green mat of Astroturf is in the path. It was amazing how easy it was to tell the change in texture of the ground. Once you hit a mat, you feel for a rope on your right side. If you come to a knot in the rope, there is an information sign directly ahead. The sign have printed words up higher and Braille of the same thing (I assume, not being fluent) below. All in all, it was a well done park. Of senses to loose, I think sight has to be the most devastating. Hopefully some people who have will get joy out of the park.\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nBraille Path\nAfter heading back downhill and rejoining the route, we had some lovely fast rolling hills into Johnson\u0026rsquo;s Shut-Ins State Park. The smart way to get into the park is to pay the $8 for a primitive campsite. The park only allows the people for the 52 campsites and 100 more cars in the park at a time. It is a good thing too. However, the people who have to wait hours to get in don\u0026rsquo;t like it . There is a recurring problem with organization and planning in the parks. Mom had to wait over an hour to get a campsite, because the campsites are registered in the office in the park. Without a campsite, you have to wait to get in the park to register. It seems like they would have some type of link to the office. A simple call on the telephone or radio would keep people from waiting for hours. We went down to swim in the Shut-Ins and then had a shower. I\u0026rsquo;ll discuss more about the actual Shut-Ins tomorrow. After showering, we headed back to camp for dinner and sleep.\nUpstream of Johnson Shut-In\nPreserved Beaver Chewing\nSwimming in Johnson Shut-In\nPretty Sunset\nWe didn\u0026rsquo;t ride far today, because there was so much to see and do. I rode even less tomorrow. But it is called touring, not riding. :)\nToday\u0026rsquo;s stats: 3:33 riding time, 36.3 miles, and 1,470 feet of climbing.\nJohnson\u0026rsquo;s Shut-Ins State Park, MO\nTent Site: 37 deg 32.821 min N, 90 deg 50.619 min W, elev 859 ft.\nTrip Miles: 1369.1 miles\n","date":"23 June 2002","externalUrl":null,"permalink":"/blog/2002/06/23/day-35/","section":"Blogs","summary":"","title":"Day 35 - Farmington to Johnson's Shut-In State Park","type":"blog"},{"content":" I woke up and heard dad tell mother that it was 7 o\u0026rsquo;clock, when I clearly knew it was 6. I woke back up when it was actually 7. They are still wrapping their mind around this whole different time zone thing. We packed up tents, hit the restrooms up the hill in the park and got moving. It took mother about 200 yards in front of us with the van to find a yard sale that looked interesting. :) This was good, because I forgot to see what snacks she had brought along. I picked up some beef jerky and some granola \u0026ldquo;Trail Mix\u0026rdquo; bars. A little plug for Nature\u0026rsquo;s Valley, their Fruit and Nut Trail Mix bars are really good. Dates, Pecans, Peanuts, Raisins, and other good stuff, in addition to the expected rolled oats.\nCool moth\nCampsite location\nCar Wash\nWe started on the route and passed the church where I had stopped to take a picture last night. The sign really cracked me up: \u0026ldquo;When the trumpet sounds, I\u0026rsquo;m out of here. So there.\u0026rdquo; What is that dear reader? You say I promised to explain the connection between Chester, IL and Popeye.\nPopeye Museum\nCloseup of sign\nOlive Oyl\nSwee\u0026#39;Pea\nHistoric Chester Sign\nCool mural\nYeah, yeah. I forgot. Chester was the town where Popeye\u0026rsquo;s creator was born. He based the characters of Popeye from people he knew around town. Was there a woman who lived in Chester that actually had the dimensions of a microphone stand? I don\u0026rsquo;t know. Kinda fun to think there was though\u0026hellip;\nMore info is in the photo of the plaque I took in Segar park.\nYesterday when riding into town I noticed a Popeye painting with some cheesy saying on the side of an auto body shop. I thought it strange, but later learned why this town is Popeye crazy. There is a memorabilia shop in downtown and a big mural on the side of the building. Heading out of town on Hwy 51, just before crossing the bridge to Missouri, there is a Segal Memorial Park where a statue of Popeye stands proudly.\nPopeye Statue Plaque\nPopeye Statue\nSegar Memorial Park\nAs I was taking a picture of the \u0026ldquo;Welcome to Illinois\u0026rdquo; sign (of which I was denied at the ferry) and noticed the cigarette bootlegging sign. Apparently Illinois has some serious taxes on cigarettes. I noticed packs in gas stations that were around $4. These same pack were less than $3 in Missouri. The cigarette bootlegging sign states that you cannot bring cigarettes into the state that have had the proper taxes paid on them. The penalties were stiff: $25,000 fine, up to 1 year in jail, and seizure of vehicle. Illinois wants its tax money, I guess.\nBridge across the Mississippi to Missouri\nChester Welcome Sign\nLooking back at Illinois welcome sign\nMississippi River Sign\nRiding the Bridge, Dad in the lead.\nWelcome to Missouri\nAfter crossing into Missouri, we pulled off at a gas station/convenience store. This is how I had the comparison in cigarette prices. We each picked up a Gatorade a headed off. The hills were nice and gentle, until we got near St. Mary. We saw Perry County Airport and looked for a place to change dad\u0026rsquo;s shorts. He started the day with untested shorts and the seam was hurting bad. He had his tried pair in the bag, but we hadn\u0026rsquo;t yet found a place to change. We headed into the Sabre Liner plant and were looking for a restroom. Most of the place looked like they didn\u0026rsquo;t like visitors. That\u0026rsquo;s fine, their jets were ugly anyway.\nWe headed past St. Mary and pulled off at an antique dealer. It wasn\u0026rsquo;t open on Saturday until 10 AM, but dad found enough cover to change his shorts. We rested a while and reapplied some sunscreen. We were just leaving as the owners arrived. They didn\u0026rsquo;t mind us taking advantage of their shade.\nCharacter Roads, like Iowa\nRest stop\nHuge dead bull frog\nFor those of you who have never been in Missouri, many roads are lettered. We started on H and turned onto Z. We were coming up with some seriously bad puns. Of course, on Z road you have to change into a German accent. Zee bikers are riding down Z road. N road ran into Ozora and we had to climb a mile to get into town. We sat down to cool down and eat. There was a descent buffet and we were able to get a table next to a wall plug. I typed up some of the day going into Carbondale. (Yes, I have been getting behind lately. Instead of typing before I go to sleep, I\u0026rsquo;m talking with my parents during dinner.) Just before 2 PM, we left town towards the church with nice big shade trees. There we laid down for almost an hour and slept a little. Well, I slept a little. Judging from dad\u0026rsquo;s snoring, he slept a good bit.\nLunch Stop\nTaking a break\nBefore turning on P, I had to take a picture of the PN junction. To those other Electrical Engineers out there, they will get a chuckle out of the bad diode joke. It won\u0026rsquo;t be that funny for the rest of you, so I won\u0026rsquo;t bother explaining. After you read the explanation, you would just say, \u0026ldquo;Um. OK.\u0026rdquo; Before we left P road, I had to pee on P road. Dad didn\u0026rsquo;t pee on P, he peed on B.\nNP Junction. (Electrical Engineers will get the joke, it is a diode.)\nIn Coffman, we switched from B to F. I stopped at a church and tried the frost proof water tap. Nothing. Dad said that we would probably find something in Cossman, but I broke the news that this was Coffman and we were heading out of town (it\u0026rsquo;s a little easier to keep track with the GPS too). We probably would be fine, but I always fill up when I can. A good bit further, I turned into another Antique store. They closed at 5, and it was 5:03. I went inside and they had a little snack bar. We had just caught them before closing. Dad had an orange juice, I had a lemonade and we split a package of chocolate chip cookies.\nWWF (now WWE) made me chuckle.\nCool wagon\nAntique shops everywhere\nJust as we were outside getting ready to leave, this van come flying past doing way too fast. Then it comes back the other direction and pulls into the lot. It was mother and she had been driving the route trying to find us. She had helped a lady get out of a ditch, after she drove in swerving away from a truck or something. She had other adventures and met a woman from Chester who visited the place where my dad works regularly and knows many people from Jeffersonville, IN. All of this took hours and she was worried about not beating us to town.\nMom went ahead to scout out town, and we kept cycling. She didn\u0026rsquo;t follow the bike route into town, but headed into the more modern part of town. We pulled into town and couldn\u0026rsquo;t find the van. We should have set a place to meet. My cell phone had service (Verizon) but we were not sure if her\u0026rsquo;s did (Sprint). After looking at things, we decided to split up. We could call each other and we would check in if either found her.\nI headed out of town towards Interstate 67, to find the Barbeque place that the group from Tucson said we MUST try. It was a couple tenths of a mile past the Interstate and had a sign for St. Joe\u0026rsquo;s State Park at the same turn. I got a call from dad and he said to watch for mother, as he was heading this way. I headed back to the interstate and met her about when dad rode up. We had been planning on camping in one of the two city parks, but people suggested that St. Joe\u0026rsquo;s had showers. We mulled this over in our mind as we ate.\nThe food was really good. The sign states that it takes from 4 to 15 hours to prepare some of the food and there is food until it runs out. If you complain, they will cheerfully ignore it. :) The sampler had pork and beef barbeque and ribs. We picked cole slaw and baked beans as our sides and a loaded potato. The potatoes are 1 pound and splitting the butter, sour cream and meat topping with the potato was sufficient for all. We ate it all, but were full enough.\nPeople told us that St. Joes was 3 or 4 miles, so we decided to go for it. After 4 miles, we ran across the Equestrian Campground. It had no showers and no office. We asked where the office was and everyone said up the road 3 miles. We headed back up the road. A few minutes later, we were passed by what looked like our van (it was dark and we were riding with head and tail lights). I mentioned that it looked like the van I and thought I heard \u0026ldquo;All full up\u0026rdquo; as she passed. I hoped I was wrong. She turned around and met us to repeat what she had said in passing.\nIt was Saturday night and there were no spots left up in the campground with showers. We had shown our hand by having her go ahead. Having the van on a bicycle touring trip makes things easier and makes things much harder. It is easier to get to camp on a small piece of ground when the campsite is full if you only have a bicycle. I doesn\u0026rsquo;t sound like these people would have cared though. We had cycled 7 miles to get to the showers and they said that we needed to camp at the campground 3 hilly miles back. No persuading that we had a hard day with 60 miles and nearly 4000 feet of climbing. They didn\u0026rsquo;t care. The guy said that this was the campground for the off-road vehicles. You know, dirt bikes and four wheelers. The campground for the bicycles was back 3 miles. You are only important if you have something that runs on gasoline.\nI don\u0026rsquo;t understand how a bicycle camper is supposed to register. Do you ride 7 miles to the office to find out that you have to ride back 3 miles to find a camp site, then ride back up 3 miles to give them a number and register? Then you get to take a shower and ride back 3 miles, climbing hills and getting sweaty to camp. It is a joke. Anyone going on the Trans-Am trail, eat in town and sleep in the city park. You will save yourself some trouble if you try to use the joke of an organization called St. Joe\u0026rsquo;s.\nThe line for the shower was 5 guys, so dad had me get in line as he ferried the first bike to camp. I was able to shower pretty quick, and it was shocking.\nLiterally shocking.\nYou step in the stall and it looks like a bad prop from a 1960\u0026rsquo;s science fiction movie. Then you see the 2 inches of water in the shower area that won\u0026rsquo;t drain. If you are smart, you don\u0026rsquo;t step into the water and plan on using the handicapped sprayer to wash while standing out of the water. This is a good thing, because you aren\u0026rsquo;t grounded as good when you grab the metal knob and notice the 60 Hz pulsing of AC power.\nNice. I\u0026rsquo;ll get clean but electrocuted. It felt like an induced current of some electrically running next to the plumbing. They have been trying to fix it for years, and say they are building a new shower house. Luckily the water was fairly pure and didn\u0026rsquo;t conduct very well, as you couldn\u0026rsquo;t feel the current through the water. Anything metal that you touched gave the familiar (to anyone that has had the misfortune of accidentally coming in contact with AC wiring) 60 Hz tingle.\nWe got back to the campsite with my bike this time and started setting up camp. You are supposed to setup your tents on the gravel pad with rocks sharp enough to cut through all of my tent bottom. That wasn\u0026rsquo;t going to happen. We found some small patches of grass where you keep the horses that wasn\u0026rsquo;t completely covered in droppings and went to sleep.\nI didn\u0026rsquo;t think I would say it on this trip. But, I don\u0026rsquo;t know if the shower was worth it. And showers are awesome.\nToday\u0026rsquo;s numbers: 6:39 riding time, 60.8 miles with 3,870 feet of climbing.\nFarmington, MO\nTent Site: 37 deg 46.895 min N, 90 deg 26.226 min W, elev 976 ft.\nTrip Miles: 1332.8 miles\n","date":"22 June 2002","externalUrl":null,"permalink":"/blog/2002/06/22/day-34/","section":"Blogs","summary":"","title":"Day 34 - Chester to Farmington","type":"blog"},{"content":" I woke up about 8 AM and wanted to take a look at the Weather Channel. I had it on for a bit while I hit the restroom, and soon all I heard was static on the television. I admit, it was better than the annoying elevator music that normally plays on the Weather Channel. The bad part was the visual data that was missing. Oh, well. Channel up gives more fuzz. About that time I hear \u0026ldquo;[knock], [knock], [knock], It\u0026rsquo;s us.\u0026rdquo;\nMy parents were in Carbondale and dad was quickly ready to ride. I was ready to have another hour of sleep. I should mention that dad and mom are hanging out with me for three weeks or so, during dad\u0026rsquo;s vacation. Mom will do whatever she wants with the van during the day and dad will ride with me. It is nice being unloaded for a while, but it doesn\u0026rsquo;t really change my overall load all that much. As the biggest load is still me.\nI started getting things together and we set out to have lunch at Ponderosa before starting out. We didn\u0026rsquo;t get on the road till late. To get back on route, we headed into town on Hwy 13. I deviated a few blocks south on 51 then came back north. The north and south lanes of 51 are separate streets and the bike shop I was heading towards was on the northbound street. At the turn around, I also picked up some cash at the ATM. I was starting to get low and that isn\u0026rsquo;t a good thing when you are heading away from populated areas. Then I hit the Bike Surgeon for some more patches. I\u0026rsquo;ve been going through them with my 9th (if the count is right) last night. They only had glueless patches and I\u0026rsquo;ll have to give them a try.\nDonna recommends taking Hwy 13 into Murphysboro, instead of the Adventure Cycling Route. It is flatter and shorter, both are good things. The climbing was manageable into town and we stopped at a gas station to get some Gatorade. Then we rode through town and figured out how to get back on the route. Pretty soon we found ourselves on 20th street, heading out of town.\nDad and I stopping for a break\nRiding with Dad\nRiding with Dad\nDonna recommends taking 149 out of Murphysboro and linking up with Hwy 3 at Grimsby. This would be a fine route, with minimal climbing, if it wasn\u0026rsquo;t for the traffic. We chose to ride the Adventure Cycling Mississippi Levee Alternate route, which is more miles than the primary route, but an enjoyably flat route. I assume that the normal route was the same as I have seen before and I enjoyed the scenery on the Mississippi flood plains.\nWe had some climbing to get into Sand Ridge, but entered Gorham and the Neunert without too much difficulty. Neunert is the only town on the Levee Alternate which has services. We stopped at the bar/restaurant to cool off. A man there was traveling back home to San Antonio, Texas. I asked the owner what type of sodas they had and ordered an orange soda. Dad said to make it two. The man said he would buy them for us. We all talked for a while and had a nice time cooling off. This was the first time all trip anyone has offered to pay for something I was getting, and it was a nice experience. Not because of the money, but just the gesture. He had offered to get us lunch, saying that the pizza was good, but we were only snacking in the heat.\nBottoms Up\nFixing a flat\nFixing a flat\nA few miles out of Neunert, I had to stop for a rear tire. I ran over something sharp that didn\u0026rsquo;t stick in the tire. Not sure where it happened, as the leak was really slow. While we were pulled over to a shady side of the road, a local farmer stopped to chat. He had many questions which he had wanted to ask cross-country cyclists, but never wanted to stop them to ask. We talked all while I patched the tube and then we headed out.\nThe route ran pretty close to the river, with only minor climbs (except the short climb up to the levee). I had hoped that we would see the Mississippi sooner, but we were off the levee without yet spotting the big river. After a little ways, we climbed back up to Levee Road and saw the mighty Mississippi River. There was a boat launch area, that had since run down. We rode our bikes down the gravel road and decided to go for a swim.\nThere was a nice beach on the side of the area and we started in the water. Just getting our legs in to the knees was a shock. Our bodies were so hot that the water felt like ice. Both of us began slowly splashing water up on our chest and face, to gradually get used to the water temperature. Pretty soon we were walking into the river and noticing the strong current. The river was flowing faster than 6 mph and the section where we walked in had an eddy. The downstream water was spinning around and it pushed you upstream at 1-2 mph. You had to swim a good bit downstream to keep in place. It was amazing how quick the sand dropped off, but this was due, no doubt, to the strong current moving all the sand some where else. The water was murky, but didn\u0026rsquo;t smell dirty. You couldn\u0026rsquo;t see down far at all. When you went under water, the light quickly ran out. At 3 feet down, the lights turned quickly off. It was actually pretty wild to do. Head underwater and watch it go black.\nMississippi River Valley\nMississippi River\nTime for a swim to cool off\nAfter a bit, I thought I heard a car door slam and dad theorized that it might have been his bike falling over. It turned out to be a truck, with an interesting fellow. We talked for a while and he stated that he wouldn\u0026rsquo;t swim in that river. When we asked why, he said that he had caught a 7 feet garr out of there and had heard of 15 feet garr. The is more like a crocodile than a fish. When dad asked where he did swim, he said that he didn\u0026rsquo;t swim much. Not sure what to take from that except the dip in the Mississippi was greatly refreshing after a hot, but nicely flat day of riding.\nDad had found some cloth and use grass to tie it on his legs. He had not been out in the sun for a month and his legs were getting cooked, despite sunscreen. It was just too hot to put on riding pants.\nDad\u0026#39;s physical sunscreen\nI had spotted some barges tied up river a ways and pretty soon after getting on the road, we saw a huge coal pile. This was where the barges with coal are off loaded and the coal is stored or transferred into the railroad cars on the tracks that ran in front of the pile. The huge pile is the most coal I have ever seen in one place. As we rode under the bridge for the conveyor, we could see it running and bouncing slightly as it worked to offload the coal from a barge.\nThe route joined Hwy 3 at Cora and the traffic picked up severely. On the Levee Route roads, we would be passed by a vehicle every 10 minutes or so. On Hwy 3, there were many per minute. I stopped at the Rockwood Trash or Treasure to take pictures of the many cool faces carved into the logs. Dad asked what was wrong when I caught up and I said I was taking pictures of the faces carved into logs. He hadn\u0026rsquo;t seen them, and was riding merrily along.\nCool carvings\nCool carvings\nCool carvings\nCool carvings\nCool carvings\nRockwood Trading Post, home of the carvings\nWe were met by mother on Hwy 3, a couple miles out of town. We pulled into Cole Memorial Park and looked for the pool and showers area. The pool was pretty empty and the water jets on the side worked well to massage our muscles. Today was mostly a flat endeavor, with climbing to start and to finish. However, my legs are still sore from the continuous days of hills to which they have been subjected.\nAfter a swim and a shower, we setup camp across from the pool area. We had heard of Reid\u0026rsquo;s Harvest House from a couple of people and Friday is Seafood Buffet Night . When we pulled up to the place, I noticed 4 familiar looking bikes. They were the crew from Tucson, AZ who I had first met at the Rough River Dam State Park. We were seated right next to then.\nBuffet, Yay\nGroup with Cassette Problems earlier\nWe talked a while, as we ate the pretty decent selection of seafood. I hadn\u0026rsquo;t had frog legs in quite a while and they where the light weight chicken that I remembered. After filling up best we could, we headed out to see the various Popeye pictures and statue. For those of you who know why there are Popeyes everywhere in Chester, IL, kudos to you. The others will have to wait till tomorrow.\nThis made me chuckle\nCole Memorial Park camp site\n4 hours and 50 minutes, 50.0 miles and 1430 feet of climbing.\nChester, IL\nTent Site: 37 deg 54.192 min N, 89 deg 48.937 min W, elev 505 ft.\nTrip Miles: 1272.0 miles\n","date":"21 June 2002","externalUrl":null,"permalink":"/blog/2002/06/21/day-33/","section":"Blogs","summary":"","title":"Day 33 - Carbondale to Chester","type":"blog"},{"content":" I woke up around 7 and started getting things together. I was feeling a little better that yesterday morning and I wanted to get started before the bad heat. I talked with a lady that was in the campground to bush-hog a little for the owner. The registration sign was asking for $18 to camp, which is pretty stiff for someone not using any of the horse facilities. I asked what they charge for people who arrive after 9 PM and leave before 8 AM. $18 dollars for less than twelve hours is terrible. She said that just overnights were $12, she thought. I was going to wait until the owner came to discuss, unless I was ready to go before then. The owner didn\u0026rsquo;t show before I left at 8:30, so I left $12 and a note about why it wasn\u0026rsquo;t $18.\nCampsite for last night\nOK. Good luck.\nThe road into Goreville wasn\u0026rsquo;t too bad and I arrived around 10 AM. I noticed the Late Bloomers Cafe as my stomach was pleading for food. The cafe is a nice local place where most of the people are known to all the employees.\nI ordered a 2x4 (2 eggs, 2 pancakes, 2 sausages, and 2 strips of bacon). As I read my book and sipped on water to let my food digest, I was greeted by the owner. She handed me a book to sign and announced that she offers a free dessert for those who are riding across the country and stop in for a meal. She asked me which I wanted. I ordered the Strawberry Shortcake. It actually had short cake (thin crust) with homemade strawberries. Yumm. Make sure to stop by in for a meal and your free dessert if you are pedaling a long way. If you arrive by car, you can still try the shortcake, it just isn\u0026rsquo;t free. :)\nLate Bloomer\u0026#39;s Restaurant\nLate Bloomer\u0026#39;s Restaurant\nI wanted to push into Carbondale before too late, so I hit the road again. The last service before entering the wilderness area around Devil\u0026rsquo;s Kitchen Lake and Little Grassy Lake was at Interstate 57. I didn\u0026rsquo;t stop, as it was just out of Goreville. The hills were decent for quite a while. I noticed a sign go by as I was peddling by as fast as I could to push up the approaching hill. The sign proclaimed quite simply: \u0026ldquo;Hilly Terrain\u0026rdquo;. I agree fully.\nThe hills were steep and numerous until I turned off along the lakes. I passed a sign that told motorists that a permit was required on the vehicle to enter. I hoped that this would reduce the already low traffic further and indeed it did. The roads were surrounded by pretty forests and the occasional view of one of the lakes. This is a public hunting land and there are loads of deer in this area. I noticed 3 white tailed does while riding near the lakes.\nHuge Horns\nPretty Lake\nAlong one of these roads, I was forced over by a driver in a truck. I dropped the rear wheel into a serious pothole. I normally attach my rear bag at the top of the seat and strap the bottom under the back of the rear rack. I had forgotten to strap it down today and the bag launched up to smack the head of a then airborne rider. Yeehaw. I stopped to pick up some batteries that had flown ahead. I\u0026rsquo;m glad nothing expensive was damaged by my hard noggin.\nI stopped with a spongy tire just past the turn for Springer Ridge Rd., off of Boskydell Rd. I think it was residual damage from the pothole, because it leaked out really slow. I just pumped it up and continued into town. At a gas station, where Pleasant Hill Rd hits Hwy 51, I stopped to cool down. It was just past 2:30 and I was hot. I picked up a Gatorade and a Strawberry Icee. Then I headed back outside in the shade, to let my body cool down slowly. I kept sucking the Icee dry, and adding Gatorade. Pretty soon it was more of a Fruit Punch Gatorade Icee than strawberry, but it was cold.\nBefore leaving, I had to pump up my tire again.\nIt was convenient\nClean Coal Technology\nClean Coal Technology\nHeading up 51, I noticed SIU (Southern Illinois University). I hadn\u0026rsquo;t realized that Carbondale was a college town, but getting into downtown it is instantly obvious. I stopped at the Coal Power Technology Center, where they have a very clean burning coal power plant. As I headed further up 51 I saw a sign for the Carbondale Labyrinth. It was much more intricate than the one Hope was building on Afton mountain, but the scenery wasn\u0026rsquo;t near as good. I walked all the way to the inside, but have to admit that I took a big step shortcut coming out. Made the out route 10 feet instead of a couple hundred.\nA Labyrinth\nNot as organic as the on in Afton, VA\nMaking Copies (Sorry, Adventure Cycling)\nUp a little further up 51 I stopped in a copy center to get some copies of the two maps that my dad and mom will be riding/driving along with me for the next 3 weeks. My dad is on vacation and he will be riding along. Although he might not ride all of the Ozarks in Missouri.\nAt the small 3 screen movie theater, I ran into Greg and Jennifer locking up their Cannondale tandem with a BOB Yak trailer. They are riding West to East, using the Western Express route. We talked for a while and they wanted me to come see the movie with them. I told them that I wanted to get a room out of town on 13 and would catch one out there. I had remembered reading about The Bike Surgeon at Carbondale in so many tour reports. I stopped and wanted to pull off the chain ring guard holder that had been on the bike since I had problems with it and removed the guard in Virginia. I pulled off my cranks and tried to remove the bottom bracket. The tool they had was pretty worn, and the bottom bracket was in much tighter than I had installed it. I wonder if the guard going up and down a few times had threaded it in tighter. Eventually I had to just put the cranks back on and forget it. Then I pumped up my rear wheel again, but with their nice floor pump.\nGreg and Jennifer\nCarbondale\u0026#39;s Bike Surgeon\nTouring Hotel Mess\nI headed out Hwy 13 and saw the Super 8 about 2 miles out of town. They have been nice motels and among the most reasonable, so I turned in. I was in a central location for shopping and such. I checked in and loaded the bike in the room. I had the room at the back, and it was pretty easy to get the entire rig in without taking the bags off. I cooled down and took a shower. The 8 screen theater had an address very close to the motel, so I knew it was just a few steps away. I called up the recording line and decided to see The Bourne Identity. I left the motel a little after 6 and started walking towards the theaters. I stopped in a Best Buy to get a better pair of headphones and was successful. Then I saw the movie and noticed a Taco Bell outside after it was over. I haven\u0026rsquo;t run to the border in a while and it sounded like a good idea. I grabbed a Zesty Chicken Bowl and a Chicken Grilled Stuffed Burrito and started walking back to the motel. I swung into a Barnes and Noble on the way to pick up another of Dale Brown\u0026rsquo;s books. I wish Clancy wrote more, but he makes ideas for other people to write books about. They aren\u0026rsquo;t as good.\nBack at the hotel, I relaxed and had dinner before falling asleep.\nDay Stats: 4 hours 36 minutes of riding, 40.4 miles. 2210 feet of climbing\nCarbondale, IL\nMotel: 37 deg 43.855 min N, 89 deg 11.696 min W, elev 405 ft\nTrip Miles: 1222.0 miles\n","date":"20 June 2002","externalUrl":null,"permalink":"/blog/2002/06/20/day-32/","section":"Blogs","summary":"","title":"Day 32 - Tunnel Hill to Carbondale","type":"blog"},{"content":" I still had some pangs of stomach pain when I fell asleep last night. I had figured whatever was bugging me would work itself out overnight. I had a beautiful nightlight of the moon on my naked tent, with the rain fly tucked neatly in a bag. The view out of the side windows was a wonderful way of preparing to sleep as my eyes strained to see more stars than were already consuming the sky. Surprisingly, and pleasantly so, the other campers were happy to be in bed also and the campground was nearly silent, save the sounds of nature, which would be around even without campers.\nI woke early and noticed a very slight brightening of the eastern horizon. My stomach felt worse and I went back to sleep. I was awaken again by the startlingly bright sun shining in my netting windows. The heat was already building at this early hour. More so was the building unrest in my digestive tract. I headed for the toilet. I had thought this would work itself out over night, but I felt terrible. I visited the toilet 4 more times this morning and was glad there were two. I took a book and enjoyed the time reading. I was happy to see most of the clothes totally dry by 9 AM.\nBreaking down camp\nSorting and packing\nI packed up camp in between my trips to the john and was sort of ready to head out by 10. I took out my underseat water bottle and was going to rinse it out and get fresh water. I opened up the cap and noticed little orange things that were not there before. I also noticed them, in a much lesser concentration, in my water bottle that was topped off by my underseat bottle. Hmm. I had taken probably one or two drinks from that bottle, but not much more. I washed them both out as good as possible and filled them with good water (I hoped.) This explains the stomach problems. This day will be interesting.\nMy flip-flops and bike sandals are the only pieces of footwear I have along for the trip. Neither offer any ankle support. I stepped in a hole and torqued my bad ankle walking out of the restroom. I caught it before it twisted bad, but I knew I had done something. I constantly have to watch this ankle and almost turned it earlier in the trip. I would be feeling this one for a few days. I hobbled back to my campsite and finished packing up. The pedaling didn\u0026rsquo;t hurt much and I think the lined up motion in the clip-less pedals helped it also.\nHuge fish\nLarge for tank size\nArtwork on wall\nDutton\u0026#39;s Cafe for brunch\nI passed the Dutton\u0026rsquo;s Cafe going out of town and noticed the best seafood in Southern Illinois sign. I was pretty hungry and figured I could find something that wouldn\u0026rsquo;t be too hard on my stomach. With how I was feeling, I might not have to keep it down there long anyway. The restaurant had the local charm that I have seen in many places along the way, where the owner or employees know everyone\u0026rsquo;s names and they are all talking when you step in.\nWhen a high school age kid stepped in, I heard, \u0026ldquo;What did you do now?\u0026rdquo; His head was clean shaven and I overheard the entire range of hairstyles that he had gone through the last little bit, from blond (he was a naturally dark haired guy) to purple, which faded to blue, then green, now shaved off. He was inquisitive about my trip and came out to take a picture of me in front of the cafe as I was leaving.\nThe first thing I noticed as I stepped into the cafe was the large fishtank and even larger fish. I\u0026rsquo;m not sure what kind it was, but it seemed cruel to keep it in such a small tank. It couldn\u0026rsquo;t fit in the tank from back to front without being curled a little, and this was a good sized tank. I ordered a basket of catfish fingers (boneless, fried catfish strips), which should be fine if their sign outside was true. The catfish was really good, with very little fishy flavor to upset my stomach. I finished up and headed towards E-town, some 13 miles away.\nIllinois is a state that is 90 percent covered in prairies. Luckily I\u0026rsquo;m riding through the other 10 percent, as I wouldn\u0026rsquo;t know what to do without hills to climb. It amazed me how much you can climb and descent being only a mile or two from the Ohio River. It truly is another type of shore here than I am used to back home. In the Louisville area, there are major problems during flooding of the river, as the land only slopes up from the river very slowly. Here there are many sheer cliffs and the land is quickly over 100 feet above the river just fractions of a mile inland. These Shawnee Hills are called the Illinois Ozarks. They have been harder to climb then most of Kentucky.\nHomemade Hydraulic Paddleboat\nHydralic pump drive\nMotor\nEnroute to Elizabethtown, I noticed a pontoon boat for sale. It seemed normal until I was almost passed and spied the paddle wheel. Hmm. I pulled the bike over and leaned it against the mail box. There was indeed a paddle wheel on the back of this thing. The 16 HP motor on one side ran a hydraulic pump, which pumped fluid to the other side where a hydraulic motor turned a small chain wheel. This was attached to a larger chainwheel on the paddle wheel. The hydraulic pump works as a serious reduction gear for the motor, turning the paddle at a low speed but with decent power. No doubt the boat would go faster with a decent 16 HP outboard, but the boat was unique and interesting.\nHosick Creek. Appropriate for today.\nI arrived in Elizabethtown a hot, tired, and hot cyclist. I said hot twice. I was that hot. I pulled into the Lee and Louise Town and Country Restaurant. Three lines of text on that sign. The AC worked great and I found a booth. We are still in serious tobacco country, and the smoke came and went with various customers. Being out of the heat was worth it. I sat and read my book while eating a cheeseburger. I killed almost an hour and a half, but got back on the road at 2 PM.\nLate Lunch Time\nThe Rose Hotel\nStill next to the Ohio River\nFront of my Lunch Stop\nMy thermometer was indicating 111 degrees out in the sun, and wouldn\u0026rsquo;t drop below 100 degrees after riding for more than 30 minutes. About 5 miles out of E-town, I was completely drenched in sweat from the heat and hills and pulled over to a grassy shaded area. I used my helmet as a pillow as I plopped down on the grass.\nResting in the shade\nMore hills\nI alternated between closing my eyes to rest and reading more of my book. All the time sucking down more water. I got back at it just after 3 PM and the thermometer indicated 88 degrees after sitting in the shade that long. Unfortunately, the roads offered not shade almost all of the day. My stomach had not gotten worst, although I couldn\u0026rsquo;t say it had improved much.\nI pulled into Eddyville around 6 PM. The route to the town had included a road that ran up a nice hill. I knew it was coming when I noticed the 750 and 500 ft contour lines nearly touching on the map. I walked most of that one. The gas station and grocery in Eddyville helped me cool down with the AC, Gatorade, and Popsicle. I talked with the locals hanging out and they verified the continued existence of the two campground on my map. One would be and easy reach by dark, the other a stretch. I talked for a while, as my core temperature lowered. They verified that about half of the road up ahead was fairly flat. This is better than my average for the day. I headed out for the campgrounds around 6:30. I knew it would be darkening around 8:30 and hoped the other half weren\u0026rsquo;t too bad of hills.\nStopping to cool down\nI passed Glendale and two possible campgrounds, deciding to push for the campground in another 12 miles or so. There were some good climbs and I was starting to get some weary legs. I felt a serious pain on my right arm and slapped away a huge horsefly. He must have communicated the slowly climbing meal and suddenly there were 4 or 5 of them buzzing all around me. I pushed harder up the hill and they were having no problem staying with me. As I crested, I started to accelerate. The road didn\u0026rsquo;t drop much and leveled out. I had built up some speed and was able to hold just about 20 mph.\nI noticed the flies finally gone and glanced in my rear view mirror.\nI thought I saw\u0026hellip;\nYes, I did.\nThere was this little black object darting around behind me. He would pull out of my draft, and get blown back then fall back in my draft and keep pursuing. I\u0026rsquo;ve never see a fly keep this kind of speed and was impressed. The view in my mirror was almost comical, as if I was watching a cartoon where two fly\u0026rsquo;s were playing the parts of old biplanes in a dogfight. I soon found a downhill and was able to push past 30 to finally lose him. He had stayed with me for almost a 1/4 mile, which was impressive. I must taste good. Although, thinking about what they normally eat, that is probably not a compliment.\nFirst snapper I stopped to help.\nPretty sunset.\nI managed to pull into the Cane Lake Campground before 9. The light held out long enough to setup the tent and get camp in order. Then I headed to the showers. This is a campground that caters to people with horses and it was empty except for myself.\nI must have smelled like a well exercised horse, \u0026lsquo;cause the horse flies came out with a mission. I tried to explain that it was no use and I had already bested their pal, but they didn\u0026rsquo;t seem to care. I headed for the showers, swatting occasionally. My first instinct was to wash my shorts and shirt, but I had a better idea. After cleaning up, I hung my still wet with sweat clothes on my line, next to the towel. It seemed to attract the horse flys better than my new clean self. I filled up the tent with my gear and then my body and worked hard for an hour to give you this fine update. Wonder what my cell coverage is like\u0026hellip;\nToday\u0026rsquo;s Stats: Climbed 3,300 feet in 48.9 miles. Riding time was 5 hours and 36 minutes.\nTunnel Hill, IL\nTent Site: 37 deg 29.995 min N, 88 deg 47.979 min W, elev. 606 ft.\nTrip Miles: 1181.6\n","date":"19 June 2002","externalUrl":null,"permalink":"/blog/2002/06/19/day-31/","section":"Blogs","summary":"","title":"Day 31 - Cave in Rock to Tunnel Hill","type":"blog"},{"content":" I climbed in my sleeping bag just after finishing the send for the evening. I listened to an episode of the Andy Griffith show on channel 7, whatever that is in Sebree. It got colder last night than I expected and I had to fully enclose my head in the mummy bag before I was really comfortable. I didn\u0026rsquo;t pull it tight, so I still had a few degrees of comfort left. I probably would have been fine with my skull cap on.\nI was initially woken up by the sunrise, but adjusted to it and tried to get one more hour of sleep. I was going on 7 and would have liked 8. This would have been all and good, except for an annoying little bird. I had climbed out of my sleeping bag, with the rising temperatures, but this annoying bird came in every 10 minutes with a maddening cry. Either he had a nest nearby and wasn\u0026rsquo;t happy with me or he just felt like being a jerk. I was not really sure which applied. It was almost a comical version of a snoozed alarm. He would come in and I would scare him away. 10 minutes later, he would come back and I would do the same thing.\nMy bedroom last night\nNot the normal black snake\nI got up at 7:15, after 45 minutes of bird alarm snoozing. The bathrooms were all locked and I decided that I could make it to Dixon before I needed a toilet. In her book, Donna had described today as relatively flat for the first half, then climbing during the second. That isn\u0026rsquo;t correct. I climbed almost 700 feet in the 12 or so miles into Dixon. Some were steep enough to require leg presses in my lowest gear. This isn\u0026rsquo;t my definition of relatively flat. I do agree with the climbing in the second half though.\nDixon Fire Department Pork Sandwiches\nTasted good and good cause.\nI pulled in Dixon looking for a place for Breakfast and the use of a Restroom. I was surprised to see a grill going at 9:30 in the morning and read the sign. They were selling pork chop sandwiches as a fund raiser for Hope. They smelled good and I was assured that they were. I asked for 2 and an RC Cola. I was told to take a chair and sat in the shade eating and talking to the guys. They were the best pork chops I have had so far in my short life. The sauce they used was great and they were done enough, without totally drying out.\nEventually someone wondered over to my bike and the questions started. I asked for a bathroom and was pointed to the fire house. The shower looked really good in there, but I resisted. I filled up my water bottles and under seat water carrier, before setting back on my way.\nThe road ahead, as I stop in the shade\nStopping for a rest\nOh, I verified what the Tyson trucks were hauling yesterday and today. It is indeed chicken feed (And not chicken poop). From the smells, I think that was just dumped on site.\nI didn\u0026rsquo;t see anything really interesting in Clay and still had half a pack of fig newtons if I needed a snack, so I rode through. I stopped in a little town not on my map, Deansville, I think. There was a historic sign and I stopped to read it and take a picture of the old building it was talking about. This was initially a Post Office in the early 1800s and was now a closed down General Store.\nDeanwood Post Office\nDeanwood General Store\nI waved towards a lady who was sitting on her back porch. Here two dogs were barking at me, but were not threatening. I took my underseat water carrier as I walked in her direction and asked if she had an outside tap where I could top off my water bottle. She offered to go inside and fill it up, as I tried to make friends with her dogs. The smaller and more feisty dog almost got close enough to sniff my hand, but never closer. He was barking all the while. I thanked here for the filled water container and headed on my way. I thought I had enough water with my two full bottles, but I was unsure of the number and slope of the many hills in the next 8-10 miles into Marion. Better safe than sorry. Nothing like trying to climb hills in the 95 degree heat while you try to make enough salvia to get your tongue to unstuck from the roof of your mouth. Been there once when my drinking bladder sprung a leak and I don\u0026rsquo;t want to be there again.\nNice to wet this down under helmet.\nLunch at Subway\nThe climbs were there all the way into Marion. I had to work on quite a few of them. It was getting on to 1 PM when I pulled into town and the temperature had reached 95 degrees on some of the climbs. I stated looking for a restaurant to get some lunch, but more so to get out of the heat for a while. I saw a McDonalds and kept looking. Then I spotted a Subway and pulled in. I had been carrying two full cards for over 1100 miles and it was time to use them. I kept it simple and ordered a foot-long tuna on wheat with cheese and my normal toppings. I eliminated banana peppers, because I was unsure of the effect they would have on my stomach in this heat. I had to get a drink with the cards, but it wasn\u0026rsquo;t a bad lunch for under $2. I had the Hawaiian Punch with a touch of Sprite, but didn\u0026rsquo;t notice it was \u0026ldquo;Light\u0026rdquo; until starting to fill the glass the third time. I don\u0026rsquo;t usually fare well with artificial sweeteners, even ignoring that fact that I want the sugar for energy. I read my book while eating slowly and cooled down. I got moving just before 3 and my stomach wasn\u0026rsquo;t quite right. I\u0026rsquo;m guessing it was the artificial sweetener, as I got like this last time I had a diet cola of some type. It finally went away about 4 miles out of town.\nRiding shot\nRiding shot\nSnack Stop\nThe hills towards the river were substantial. I had about 11 miles to the ferry and I had to work for all but about 1/2 mile. I kept expecting to crest the hill and see the river below. Each hill I climbed and descended was surely my last. Finally I was on a section of flat road.\nWhere is the ferry?\n2000 feet left\n1000 feet left\nI had still not seen the river when I started seeing signs: \u0026ldquo;Ferry 2000 ft\u0026rdquo;. It was kind of a letdown when I finally did see the river, as I was passing the place where the cars stopped and waited for the ferry. It was no more than a glorified boat ramp, but it was kind of strange to not be able to see the river until then. I just crested the hill as the ferry was pulling out. It gave me time to watch the operation once and I was impressed.\nThe tug boat was attached to the downriver side of the boat. He would back the ferry off of the ramp, and flip around. Then drive up to the next ramp on the other side. There was an area about twice as wide as the ramp where he could hit. Both times he drove it right up on the center lane. Another guy would get out front and hook chains around a cleat on each side. He had his technique down and could wrap four turns of the cleat by flicking the chain with his arm. The ferry would hit the ramp, and keep pressure on as he latched the first cleat, then the tug would force the ferry tight into the other side to allow him to secure that cleat. Then the pilot would back up slightly to pull the ramp back as much as they pushed it in while securing. This operation takes about 20-30 seconds after first contact and was impressive.\nMy single vehicle weight just makes it\nHere comes the ferry\nAlmost docking\nFerry about to empty\nMe on ferry\nIt was wild seeing the bus pull off the ferry and watching it go down and back up more than I expected. The chain man (not sure what else to call him) told me that it was nothing compared to an 18-wheeler.\nOn the short ride across, I had someone take my picture and talked with a few people. I would up giving out two cards to the web site, when they started asking questions about my trip. We were on the next side quickly and I exited after all the cars. I heard the tug pilot mention that it was ice cream time. That sounded good. I headed to the same little booth that he went to and ordered a strawberry slushy. This sounded better than ice cream to me. Something about milk and heat just down\u0026rsquo; work right in my anatomy. I sat under the shade and watched the ferry wait for a barge heading upriver. The girl running the booth came out to chat, and we talked while I rested. She was probably just out of high school and was a good looking girl until she fired up her cancer stick. I was just thinking about the irony that is Kentucky. Farmers making a living growing the stuff that kills so many of their own inhabitants. I\u0026rsquo;m curious if the smoking will be as rampant in Illinois as it is in Kentucky. Most of the places I have been in the state think a non-smoking section is a joke you made up.\nI only had one brain freeze before finishing up. I wonder how much it actually dropped my core temperature, but I\u0026rsquo;m sure not as much as it felt like. I climbed up the road, turned right and headed into Cave in Rock State Park. As I have come to expect in State Parks, the campground must legally be placed up the steepest hills in the park. Just entering the campground, I though something jumped on my leg. It was something. This is the second time on the trip that a bird took a dump on me.\nBird poop from bombing run as I rode into park.\nI passed a couple walking out of the camping area and we chatted for a while. I would up giving them a card to the web site and told them to enjoy their walk. I asked if they knew what the Lodge was like, but they hadn\u0026rsquo;t been there yet. I didn\u0026rsquo;t notice any place to stop and pay for the site, just a sign describing the prices. I initially headed for the tent camping spaces and found a decent site close to the pit toilets. I pulled out the tent and started to setup. Then I thought about showers. I didn\u0026rsquo;t want to walk a half mile to take a shower, as I had some clothes I had to wash too. So, I loaded everything but the tent back on the bike and headed over to the normal sites. These were $4 more, but had electric and nice grass to pitch a tent on instead of stick covered dirt. I found a spot a reasonable distance away from the showers and got off the bike. I then walked back to get my unpacked tent. It would have been a seriously annoying walk for a shower, plus I get electricity to run things. I setup the tent, opened up the Thermarest to inflate and headed for a shower and laundry.\nThe showers were there push button affairs that I had seen in Buckhorn Dam Park. The problem is that some steam producing super heat shower man adjusts the temperature. I want a cool shower after a long, hot day riding. I would rather the cold tap last night to this 105+ degrees of fire liquid. After getting done with my cleanup, it had only gotten hotter. I wound up using the handle sprayer (I was in the handicap stall) to wash the clothes. It was hot enough that I couldn\u0026rsquo;t hold my hands under it to wet the clothes for more than a few seconds. After washing 3 shirts, 3 pairs of socks, and two shorts, I headed back to camp. I was greeted by the couple that I passed coming into camp. They said that the Lodge was night and they had a fairly reasonable menu. I hung everything on the clothesline and packed up camp. It was getting near 6:30 and I wanted to see the Cave in Rock before the sun dropped too far.\nLaundry done in the shower\nCampsite\nI started out of the campground with my lightened fanny pack and headed for the cave. At one of the overlooks enroute, I was greeted with a nice view of the river. The ferry was operating below. I climbed around the overlooks and headed down to the cave. There is a history of bandits hiding out in this cave to attack traffic coming down the river. Many didn\u0026rsquo;t live to tell that tale back then.\nWay to the cave\nReached the opening\nIn cave\nFurther in with flash\nOpening above\nOhio River opening from inside the cave\nLooking in from opening\nOhio River from mouth of cave\nThe cave was deeper than I expected and the low level of the river helped the exploring. The entrance was probably 10 feet above the current river stage. As I reached the rear of the cave, I heard some strange noises. I thought it was the two guys I had passed coming in, entering a back way and making eerie sounds. Turns out that some pigeons decided to make the cave home and they have some strange sounds. There was a crack overhead towards the back that allows light in from the top. I couldn\u0026rsquo;t see what the rear looked like with my small LED flashlight, so I took a few flash photos and was able to see the cave via my pictures.\nI climbed up away from the cave and started towards the lodge. All along the way were picnic tables right on the river. There is a 100 feet cliff right at the edge of the river (even higher as you get towards the lodge), so each picnic spot had an amazing view. I finally reached the lodge after a decent walk up the road. They closed at 8, and it was 7:40. The earlier couple had mentioned that they closed at 10, but I think they were influenced by the \u0026ldquo;Park Closes at 10 PM\u0026rdquo; signs. I had a chicken stirfry and a salad. The stir-fry came with a roll and strawberry butter. I had never though of a butter with strawberry flavor, but it was great. It even beat the honey butters that some places have. The stir-fry was good and I ate outside watching the river. When traffic slowed, I read my book.\nSome Ohio river facts I didn\u0026rsquo;t know: It is 981 miles long, starting in Pittsburgh and emptying into the Mississippi. It is the second most used shipping river in the US (I assume the Mississippi is #1). Half of the barge tonnage shipped is coal. I saw two large coal barges while eating dinner.\nCave in Rock Restaurant in Park\nBarge on the Ohio River\nAfter dinner, I took a shortcut back to camp. I was hoping it was at least. It turned out that I was correct and ended up in the tent camping section, a much shorter walk than the roads. I\u0026rsquo;ve spent over an hour typing and my eyelids are getting heavy. I\u0026rsquo;ll send this off tomorrow.\nOh, one other thing. I came into my tent to type this, because the bugs were really annoying. This is the first time during the trip that they have been bad. One tip though, after quickly climbing into the tent, the white screen from your laptop attracts them. There to can wipe them out. The downside is the small streaks of bug\u0026rsquo;s guts on your screen. I guess it\u0026rsquo;s acceptable collateral damage.\nToday\u0026rsquo;s Stats: 3,050 feet climbing in 55.7 miles. Total riding time was exactly 6 hours.\nCave in Rock, IL\nTent Site: 37 deg 28.377 min N, 88 deg 09.504 min W, elev. 508 ft.\nTrip Miles: 1132.6 miles\n","date":"18 June 2002","externalUrl":null,"permalink":"/blog/2002/06/18/day-30/","section":"Blogs","summary":"","title":"Day 30 - Sebree to Cave in Rock","type":"blog"},{"content":" Today I entered Oklahoma!\nIt was only the crossing of two streets and I never saw the sign for the city, just the dot on the map, but I had to start that way for those of you out there who thought initially of the state (you know who you are, you\u0026rsquo;re not fooling anyone). Oklahoma, KY is much smaller than the state.\nI enjoyed my night at the airport last night. There was AC and I used it to work on my laptop. The short day allowed me to get up 3 more days of pictures. These are in the Journal portion of the site. After I sent my update yesterday, one of the four people I saw riding bicycles into the lodge area came by the airport. He noticed my bike outside and swung by to see it. The first thing he said was, \u0026ldquo;We\u0026rsquo;ve heard about you, man.\u0026rdquo;\nApparently a big guy on a strange bike leaves quite a trail. This guy was part of a group with two couples. They are staying at motels exclusively and therefore traveling really light. They have been on the road for five weeks or so. We have been leap-frogging each other for a while, as I started a week after them. He couldn\u0026rsquo;t remember where he heard about me, but it was a few different places. They rode with Adam for a bit, which was also a source for descriptions about my crazy bike. : )\nVery early morning shots in the fog\nVery early morning shots in the fog\nVery early morning shots in the fog\nI finished setting up my tent and took a shower. I had decided to put on the rain fly, due to the forecast of possible rain. I listened to the local TV news audio while falling asleep. I woke up a few times during the night and noticed some serious fog around 4 AM. It was tough to see the far end of the runway lights. I stepped out of the tent to hit the restroom and took a few pictures of the fog. It was dense enough to cover my rain fly with droplets. The fog wet down my rain fly more than a serious shower, as it was able to coat both sides. I slept until the fog had burned off, around 8:30. A note to the reader, all times here on out will be Central time. That is until time changes again. Today I decided to use the hour that I had accumulated with the time zone change a few counties ago. It means that I am typing this at 9:34 PM, but it is already dark being 10:34 PM Eastern. So that is a long way of saying that I slept in till 9:30, but got to call it 8:30.\nFog has cleared, drying tent on fence\nNice composite plane\nNice composite plane\nAirport building\nI was on the road by 10 PM, after hanging up everything to dry as best as I could. If I had packed up right off the bat, I would have been carrying pounds of extra water. All of today was work. There were never ending climbs and descents. Most were not close enough to call rolling and I had a good workout when I arrived in Fordsville after more than 1000 feet climbing in less than 20 miles. The welcome sign for Fordsville had a little sign under it that stated: \u0026ldquo;Home of The Diner\u0026rdquo;. In a one diner town, it is OK to call it \u0026ldquo;The Diner\u0026rdquo;. Everyone still knows what you are talking about. I sat my bike against that wall at The Diner and looked around.\nI noticed 4 bicycles similar to those I met last night and it was that group. They had left just before me from the lodge and were sitting at a garage (car mechanic type, not just a garage) working on a wheel. He had mentioned that his friend was having spoke problems. I went over and said hello, and noticed them trying to get the cassette locknut off with a pair of channel locks. The wheels were 700c rims with only 28 or 32 spokes. They were good racing wheels, but not up to the rigors of touring using only rear panniers with even a light guy. I told them I had \u0026ldquo;The Next Best Thing\u0026rdquo; in my tool bag, which is a knock-off of the no longer made Hypercracker. It allows you to use the bike chain to brake the cassette locknut loose, by inserting the tool in the dropouts of the frame with the wheel mounted and turning the pedals. I told them how to use it and said to drop it off when they were done. I went to eat in The Diner. It is good that much of my tour planning and carefully thought out tools help people. Because I have to carry them up all those hills!\nLunch at The Diner\nRear cassette problems\nUnfortunately The Diner was typical diner fare. I got a burger, fries and slaw. I was able to read a chapter of the novel I have been hauling around and got done around 12:30. I headed back over to the garage and they were finished with my tool. It looks like their wheel was back operational and I told them to have a good ride. They were trying for Sebree tonight, but would have to hitch a ride up to the closest motel. From talking with people in Sebree tonight, the closest is 20 miles north or 20 miles south. Seems like relying on just motels would be a major bummer for some portions of the trip. I didn\u0026rsquo;t see them at all the rest of the day, and I stayed on route all day. I don\u0026rsquo;t know if they made it to Sebree, but it was after 6:30, if they did.\nGood point\nBaptist Church\nBaptist Church\nI didn\u0026rsquo;t stop much today. I hadn\u0026rsquo;t started very early, due to the late clearing of the fog, and I knew I needed over 7 hours of saddle time to get to Sebree. I hadn\u0026rsquo;t expected the all day barrage of hills. They never ended until a 2 mile flat run into Sebree. I passed through Whitesville, where they are working for a better future. Not sure how, but that was what the sign said. Two miles out of Whitesville, I sped through Oklahoma.\nAbout an hour later, I stopped at a small grocery just before Hwy 231. I picked up a Gatorade and a Sunkist soda. I didn\u0026rsquo;t eat as much as I thought I should, but wasn\u0026rsquo;t hurting for energy throughout the day. I think the Gatorade helped me out there. I had fig newtons to chew on, but didn\u0026rsquo;t feel like having any all day. I passed through Utica about an hour after that and noticed the Elementary School park, where they let the Trans-Am cyclists camp. I still had 4 hours of sunlight left and only 30 miles to go, so I kept on riding.\nStop 2\nInteresting, umm, something\nDrinks and snacks\nBarn\nPretty Country\nPretty Country\nI didn\u0026rsquo;t run into very much until Beech Grove, a little under 10 miles from Sebree. I decided that I had enough water and passed through. I thought I would get food in Sebree or cook at the park. Under 3 miles out of town, I passed a touring cyclist. I wondered if he was doing the West to East Trans-Am, but he said that he was just looking for a motel. I told him that it was no a good shot during the miles I rode today, until you get to the Falls of Rough, just before the State Park. It turns out that he was just riding to West Louisville, a town about 15 miles North West of Utica. I think he had planned to ride it today, but ran out of juice. The fact that he wasn\u0026rsquo;t a Trans-Am cyclist was reinforced when he had the surprised and awed looked I get a lot when I answered his question of \u0026ldquo;Where are you heading?\u0026rdquo;\nRolling hills\nBarn\nGuessing we are getting close to a river for cooling water. Steam coal power plant.\nI entered Sebree and cruised up Main Street. I only saw a pizza place that was open, so I decided to cook at the park. I was prepared for the pool and showers and other nice things that Donna described in her book. I reached the park area to find some little league games going on and continued to the pool. When I got there, everything was locked up tight as a drum and the man there said that it closed at 5. He was just around letting his son play on the slide next to the picnic area. No pool and no showers. Bummer. I headed back to the baseball games and noticed a couple driving around in a golf cart. They were probably the park caretakers, so I followed them. I caught up with them after traversing most of the park, and found out that they just live close and use the carts to get from home to the park. They mentioned that the showers used to be left open, but they have had problems with vandals and couldn\u0026rsquo;t afford to do that anymore. It always is the annoying few that mess up things for the rest of us.\nThe open road\nCoal barges\nJust looking for a motel\nI rode my bike back over to the game in progress and noticed the concession stand. I asked what they had and was told: \u0026ldquo;Steak sandwiches, burgers, hot dogs, well it\u0026rsquo;s all on the sign.\u0026rdquo; I told them that sounded good. Give me a steak sandwich, a cheeseburger, and a hot dog. Not the best meal, but it means that I don\u0026rsquo;t have to cook tonight. I sat down in the \u0026ldquo;Guest\u0026rdquo; bleachers, which were empty. I wound up talking with one of the guest team\u0026rsquo;s players parents. The dad rides horses a good bit and said that some day he wants to ride a horse across the country. I told him that I had heard of it being done. He told me about a man that had come through a few years ago driving 4 mules in his covered wagon. He had rode 40 miles with him flagging traffic up ahead. The guy and his family rode the covered wagon from the Canadian border down to Florida. He said that the guy had written a book about it and he was supposed to get a copy. Sounds like it would be an interesting read.\nI watched the game until it wrapped up, the guests lost 5 to 2, and then headed back to the pool picnic area. The trains run right next to the other part of the park and I was told that they run 24 hours a day, every 30 minutes or so. From what I have heard so far, that is true. I planned to roll out my sleeping back on a picnic table. I started setting up \u0026ldquo;camp\u0026rdquo; and walked back down to the other section of the park when it got dark.\nWelcome to Sebree\nWish the pool was open\nGame Field\nI had noticed a water nozzle that was pointing up at an angle. I had tried it when leaving the park and it would meet my needs. I stripped down to my biking shorts and took a cold water nozzle shower. It was chilly, but I felt better. Not as good as a warm shower, but better than a sponge bath. I took a camera timer picture if this shower in progress, because it made me laugh. No, you cannot see it.\nThere was power in the picnic shelter, so I set some batteries to charge and don\u0026rsquo;t have to use my 12V battery on the bike. I was happy to notice the cell tower into town and have my first digital cell phone coverage in quite a while.\nI forgot to mention chickens. Today had a decided chicken theme. There where chicken houses everywhere. I even saw three more being built. I also passed the Tyson Hatchery just outside of Sebree. I had been passed by 18-wheeled Tyson trucks towards the evening that looked sort of like a fuel tanker, with a loading tube on top. I\u0026rsquo;m guessing they are for hauling either chicken feed or the end product of chicken feed. Not sure which.\nChicken House Construction\nChicken House Construction\nTyson\nTyson Hatchery\nToday\u0026rsquo;s stats: 3530 feet climbing, 75.4 miles in 7 hours an 25 minutes.\nSebree, KY\nSleeping Bag Site: 37 deg 35.701 min N, 87 deg 32.119 min W, elev. 515 ft.\nTrip Miles: 1076.3\n","date":"17 June 2002","externalUrl":null,"permalink":"/blog/2002/06/17/day-29/","section":"Blogs","summary":"","title":"Day 29 - Rough River Dam State Park to Sebree","type":"blog"},{"content":" I got a chance to sleep well last night. Paul, Grace and 3 of the 4 kids left headed home last night. Ruth and Noah had headed out Friday night, because Noah\u0026rsquo;s pinkeye was still contagious. The last night was just Dave (the owner of the cabin), Mark (Ruth\u0026rsquo;s husband), Daniel and I. Dave was up early to meet my dad at the airport. I was planning on stopping by the airport on my way out and catching dad before he left for flying back to Louisville.\nI started packing up my things and Mark and I started getting the cabin back in order. We had to sort through the food in the fridge and make sure that we had everything we brought. I looked around for a while to find my little camp pillow and I came up empty. I\u0026rsquo;m guessing that one of my sisters accidentally packed it up with their things. I\u0026rsquo;ll cope without it.\nMark put in \u0026ldquo;Leave It To Beaver\u0026rdquo; for Daniel to watch and we all sat down once we finished packing up. I had never seen the new version and it was funny how much they tried to mimic the older series. When we finally started to head out, it had started raining. It didn\u0026rsquo;t look like it would let up anytime soon, so I briefly considered another night at the cabin. A little mileage is better than none, so I started out anyway.\nWhat was a sprinkling shower quickly became a serious downpour and I started getting wet through my rain jacket. You either have a perfectly waterproof rain jacket and get saturated with your sweat, or a jacket with enough ventilation and get saturated with hard rain. It isn\u0026rsquo;t about staying dry, just staying warm. I stopped after 3 miles and put on my rain pants. I grabbed some lunch and snacks and continued on.\nGetting Food out of Rain\nJust before my bike computer stopped registering wheel turns\nAt airport\nMy cycle computer went out in the rain, so I have to rely on my GPS mileage. I\u0026rsquo;m going to have to figure out a good way to waterproof the connections. I finally arrived at the Rough River Dam State Park and turned in. I noticed the RV-6 (airplane) that my dad and Dave had built. Cool, I thought, I had caught him. But something didn\u0026rsquo;t look right. The prop was turning. Hmmm. I started to push hard for the parking lot, but witnessed the taxi and takeoff before I reached it. Dave saw me an let out a laugh, \u0026ldquo;You missed him by 30 seconds.\u0026rdquo; he said. I told him that I had seen and dad would be a little upset when he found out. I should have called, but I didn\u0026rsquo;t want to hold him up. I figured if he was gone before I got there, that was OK. If he wasn\u0026rsquo;t, I would sit in the room there and wait for him. I never thought it would be that close. Oh, well. I had to call him after he landed at home to say \u0026ldquo;Happy Father\u0026rsquo;s Day.\u0026rdquo;\nI had really wanted to ride further today, but it is amazing how being soaking wet for almost 2 hours takes away your desire to be on the bike. I\u0026rsquo;ll camp at the airport and get a good start tomorrow. There are hot showers and a nice room with AC, where I can work with the computer. I didn\u0026rsquo;t get as much done with the pictures and such, because of all the children to play with. My cell signal is strong here, so I\u0026rsquo;ll see what I can get done.\nStocking up groceries\nRestaurant for Dinner\nAnother touring cyclist\nI\u0026rsquo;m finishing supper at a little restaurant where dad left his cap at lunch. I found it and will be hauling it with me until dad meets up with me on Friday. He is on vacation and will be riding along for a while. Mom will be driving the van to the closest big town each day to do something. I won\u0026rsquo;t mind reducing my load somewhat, as we still have plenty of climbing until we reach Kansas.\nLooks like I just crossed 1000 miles in this endeavor.\nRough River Dam State Park Airport, KY\nTent Site: 87 deg 36.763 min N, 86 deg 30.289 min W, elev. 640 ft\nTrip Miles: 1000.9 miles\n","date":"16 June 2002","externalUrl":null,"permalink":"/blog/2002/06/16/day-28/","section":"Blogs","summary":"","title":"Day 28 - Cabin to Rough River Dam Airport","type":"blog"},{"content":" When Ruth, Daniel, Noah and I were heading around looking for a place to eat lunch on Friday, we passed the rider doing just Kentucky. I had Ruth get next to him and told him good luck. He was surprised to see me ahead of him and I explained about my 90+ mile day to get to the cabin on Thursday. Then we turned around and hit a Golden Corral in Litchfield.\nWonder what they were looking at...\nToo young to have old man pants\nOff for food\nMost respectable I\u0026#39;ve looked in weeks.\nUno?\nWatermelon\nNikon Coolpix 990 invented selfies\nI\u0026#39;m really incapable of growing a decent beard\nI spent two full days at the cabin and was able to visit with all my nephews and my niece. Both my sister\u0026rsquo;s families came down and we helped with the installation of the new bathtub and shower. I enjoyed seeing everyone, but I didn\u0026rsquo;t get as much rest as I wanted to get. Both nights I didn\u0026rsquo;t sleep well, because of getting to bed late and kids getting up early. It is hard to sleep in the living room when that is where the kids want to play in the morning.\nRough River Lake, KY\n","date":"14 June 2002","externalUrl":null,"permalink":"/blog/2002/06/14/day-26-27/","section":"Blogs","summary":"","title":"Day 26 and 27 - Rough River Lake","type":"blog"},{"content":" The party that started at 10:30 last night didn\u0026rsquo;t stop till well into 11, giving me an ear full of music that wasn\u0026rsquo;t intended to help you sleep. The traffic didn\u0026rsquo;t slow until past midnight. I assumed that with as little sleep as I had gotten in the Harrodsburg park, I would sleep deep and long. I must have been awaken by some little something every 2 hours or so. When I woke up at 8 AM, I was tired and it was again raining. I had originally planned to arrive at the Rough River Lake on Friday night. That would mean an overnight stop in Hodgenville. Last night I started wondering about a one day ride to the cabin at Rough River. This would mean that I needed to get going early and I wasn\u0026rsquo;t looking forward to breaking down the tent while it was raining. I went back to sleep.\nI woke again at 10 and noticed that the rain falling was residual rain from the trees. I stepped out of the tent and started getting things together. I shook off the rain fly as best I could and packed up the wet tent. The bike was loaded up by 11 and I mounted the beast to weave my way to the shower house for filling my water bottles. As I put my right foot on the pedal, I noticed my front wheel was entirely flat. We are talking 0 psi flat. Pancake. This is the first front tire flat I have had on the trip. I started to disconnect my generator hub and the wire for one of the plugs sheared off. It had been moving next to the solder joint and the metal finally fatigued. For those of you not totally fluent in my bike\u0026rsquo;s technology, I have a front hub that works as a generator. There are two connectors right at the axle to feed alternating current to my lights. This will give me light while riding above 6 mph. I pulled off the wheel and set the fork on the ground, with the damaged connector still attached. The bike seemed stable, so I headed over to a mostly dry picnic table to patch the tire. I couldn\u0026rsquo;t locate the leak or damage to the tire, so I put in a new tube. It seemed to hold pressure. I then mounted the wheel and got out my Leatherman to try and make a temp fix for the generator hub. I stripped the wire about an inch and twisted it around the connector. Then I flipped the switch, spun the front wheel and watched the head light give me a couple pulses of light. Good to go. Minutes later I began filling my bottles at the bath house.\nYay, another flat\nGenerator Hub Failure\nTemporary Connection\nDirect TV is required for camping\nNo Chainsaws, wonder what that story is...\nWonder what pickning is?\nWhile leaving the campground, I took pictures of the various things I had been observing: the DSS Satelite motor home, the campground rules sign with the explicit \u0026ldquo;No Chainsaws\u0026rdquo; (has that been a problem?), and the \u0026ldquo;No Pickning Reserved for Campers\u0026rdquo; signs. This morning I noticed my first Courier Journal newspaper box. That is a paper from Louisville and it meant that I really was close to home. I could ride a day north and forget this whole crazy adventure.\nI keep thinking back to a quote from \u0026ldquo;The Hunt For Red October\u0026rdquo; where Ramius tells his officers: \u0026ldquo;When Cortez reached the new world, he burned all his ships. Hence his men were well motivated.\u0026rdquo; Something close to that anyway. Web readers, you are my burned ships.\nGreenbrier Store\nThe road started moving under my bike just before noon. I figured that I would push hard and see if it still would be possible to reach the cabin at Rough River today. It may still be possible. The weather was cool, with the dark overcast rain clouds covering the sky. This was the best temperature at midday I have seen in weeks. I was lightly sprinkled on occasionally, but rode mostly dry enroute to Howardstown.\nHowardstown Mini Mart\nI stopped at a small store in Howardstown and was told that I should have ridden up 31E into Hodgenville. The road I had to go up now had a serious climb. Oh, well. This route was created by hill climbing masochists, so it shouldn\u0026rsquo;t surprise me. It started raining again as I left town. It was really coming down. I had trouble seeing for a while and pulled over for a few seconds during the worst of it. After 10 minutes, I had pushed through most of it. As soon as the rain stopped, the hill began. The climb wasn\u0026rsquo;t terrible, I could continue without doing leg presses in my smallest gear. The total climb was over 600 feet of elevation gain, so it wasn\u0026rsquo;t a walk in the park either. The sun had started to come out again, and humidity was still seriously high. Amazing how quickly it can go from 75 degrees and raining to 95 degrees and dripping wet air.\nY NOT STOP\nSign at Y NOT STOP\nAnother Flat\nBy 3 PM, I had reached Buffalo and had quite a ways to go. I stopped to get a little more to eat, knowing that lack of food would be the only real hindrance to today\u0026rsquo;s BHAG*. With only 30 miles down and 60 miles to go, I had some serious saddle time left. Just before reaching Hwy 357 I ran over something sharp. The front tire made an interesting \u0026ldquo;pssss blub psssss blub psssss blub\u0026rdquo; sound as I rolled along. I found a clean slice through the tire and tube. After a few minutes, I was patched and back on the road. I believe this is flat number 7.\nBig Hairy Audacious Goal I reached Sonora, where my route crosses I-65. I see this as the road home, because so many times I have headed down I-65 from Indianapolis to get home. I had less than an hour of car time to reach my parent\u0026rsquo;s place. Just past I-65, I saw my first horse drawn vehicle. It was a large flatbed with four men being pulled by two fine looking horses. Unfortunately, my bike is strange looking. I waved at the men in Amish style dress and received an equal reply. Then the horses saw my bike and bolted off the road. It might have been something else that spooked them, but I didn\u0026rsquo;t notice anything else around that they wouldn\u0026rsquo;t have been familiar with. Luckily the field was flat and freshly mowed, so no harm was done. I felt a little bad, but didn\u0026rsquo;t do anything to provoke them. Oh well, nothing I could really do but ride something more conservative. Yeah, right.\nHwy 84 has some strange 90 degree angles. It must have been an old road built around plots of land that was eventually turned into a major road. After the first right and left, I spotted a more traditional one horse Amish carriage. I didn\u0026rsquo;t pass the carriage, after the spooking that I gave the other horses. I did manage to get the camera out and snap a few pictures before they turned off the road.\nAmish Carriage\nSide Shot of Amish Carriage\nJust before Eastview, I stopped to have my second dinner and call my sister. She didn\u0026rsquo;t know that I was shooting for the cabin one day early and I had made up my mine to go for it. I was a little past 60 miles and I had under 30 miles to go.\nInteresting Round House\nInteresting Round House\nI was surprised how much my legs had left after 60 miles today. The sun was slowly setting and I began racing. Surely if I could ride fast enough to the West, the sun couldn\u0026rsquo;t set. The roads were rolling and I was enjoying the fading light. Everything was casting a long shadow of the evening sun. Some high level clouds formed a set of fingers that were a perfect hand, missing a thumb. The sun was a child\u0026rsquo;s eye playing peek-a-boo through the fingers of the cloud hand. As the cloud hand dispersed into a muddled overcast, the sun was muted. Gradually the clouds broke up and turned into a snake scale of purple, orange, red and pink. Then I noticed the sliver of a moon that was hanging high in the western sky, guarding over a planet just below. If anyone know which planet this was, let me know. It was too bright, too early in the evening to be anything else.\nLast food stop\nThere goes the sun\nTons of birds\nPretty sunset\nThe darkness fell and I began riding along the path of my headlights. The sounds were those of crickets signaling the drop in temperature and frogs spreading the latest gossip. I cruised along knowing I had less and less distance to go. Dropping into Hardin Springs, I knew there was a serious climb ahead of me. This was the first portion of the ride today that I had to walk. There were two really steep slopes before it started back to rolling hills again. Once I got on 401, I was home free. I hit 259 and was almost there. Then came 737 and I had 3 miles left. I waved to a person a mile or so down 737, but it turned out to be a statue. That explained why it didn\u0026rsquo;t wave back.\nAfter 3 miles, I wasn\u0026rsquo;t sure exactly where the cabin was and decided to ride one of the gravel roads. I turned into the exact one and noticed what looked like my car up ahead (which my sister had been using). I had arrived 5 minutes after my sister and nephews. We said our hellos and then carried everything inside the cabin. Time for some zero days and rest.\nToday\u0026rsquo;s stats: 93.0 miles in just under 9 hours of riding, with 3,260 feet of climbing. This is my longest day to date. Hopefully I won\u0026rsquo;t break this record in riding time, although I hope to do better than a century in the flat lands of Kansas in less time.\nMcDaniels, KY\nCabin Site: 37 deg 33.733 min N, 86 deg 20.980 min W, elev. 601 ft.\nTrip Miles: 975.9 miles\n","date":"13 June 2002","externalUrl":null,"permalink":"/blog/2002/06/13/day-25/","section":"Blogs","summary":"","title":"Day 25 - Bardstown to Rough River Lake","type":"blog"},{"content":" Photos taken at the Lincoln\u0026rsquo;s Homestead Site.\n","date":"12 June 2002","externalUrl":null,"permalink":"/blog/2002/06/12/day-24-lincoln-homestead/","section":"Blogs","summary":"","title":"Day 24 - Lincoln's Homestead","type":"blog"},{"content":" I rolled out my Thermarest at 11 PM last night. The park was pretty much empty, so I thought I was safe. By 11:30, I was inside my sheet bag, listening to the evenings news on the radio. I saw a car coming into the park. It passed the picnic shelter and headed further into the park. One of Harrodsburg\u0026rsquo;s finest in a standard marked cruiser. I turned off the radio and continued to play opossum. I had talked with the police earlier and they said that they overlook certain things, if there isn\u0026rsquo;t any trouble. I was sure that he saw me coming in, but he almost missed me altogether. As I saw him cruise by on his way out, I let out a sigh of relief. Then I saw brake lights and then reverse lights. He backed up and parked even with the shelter. I continued to play opossum. I saw him get out of his cruiser, and walk around. He couldn\u0026rsquo;t see the bicycle from his initial vantage point, and now was able to. I don\u0026rsquo;t know if he would have told me to get out if I had been \u0026ldquo;awake\u0026rdquo;. He didn\u0026rsquo;t seem to have the heart to wake up a poor, tired bicycle tourist and got back into his car. I noticed him coming by again after 1 AM, as the sound woke me up. But if he came by other than that, I didn\u0026rsquo;t notice. Sleeping does that to your awareness of your surroundings.\nI had gotten everything ready for rain before going to sleep, and rain did come. I woke up at 6:30, to the alarm on my little radio. I noticed the early morning joggers starting to hit the walking trail. I quickly packed up everything and checked the computer for it\u0026rsquo;s batch conversion job. I setup to computer to make a version of all the pictures I took so far in 400 x 300 size. These are much faster to preview and I should be able to upload more pictures faster doing this. As I am typing this, I am running a batch conversion of today\u0026rsquo;s images. This system may help me get more pictures up quicker. I still have to type in the captions, but we will see.\nIf anyone is interested, here is what I have planned for the rest of this week. I\u0026rsquo;ll be stopping somewhere between here and Rough River tomorrow night, and ride into Rough River on Friday. Dave (the same guy who flew Dad and I to the start of this trip) has a cabin on the lake and I will be taking a zero day on Saturday and spending time with my sister(s) (depending on who comes down.) I haven\u0026rsquo;t seen my niece and nephews in a while and I won\u0026rsquo;t get a chance to see them again until I finish the trip. I hope to get some picture pages completed then, but I don\u0026rsquo;t know if the cell phone coverage will be good enough to upload them.\nI left the park at 7 AM and headed down 127 into town. I only had one annoying motorist on the road, when I got in town and took a lane while waiting for a red light. The truck behind me was a large diesel pickup with a decent horn. He decides that I shouldn\u0026rsquo;t be in the lane or something and honks his horn. It wasn\u0026rsquo;t a bad horn, but it wasn\u0026rsquo;t as good as mine. I honk back, turn around with a broad smile (as if to say \u0026ldquo;I win!\u0026rdquo;) and waved. It really ticks them off when you are super nice back to them. :)\nBreakfast Stop\nTrans Am Sign\nI pulled into a gas station/deli/grocery and picked up a breakfast sandwich (egg, cheese and ham). I went outside and answered the typical questions, giving a card out for the web site to a really interested guy. Then I pulled out. About 1 block later, I saw the first 76 Bike Route sign I had noticed in Kentucky. It was looking pretty bad, so I pulled over for a picture. My batteries died trying, so I loaded another set in the camera.\nAbout then some car came past and the guy with teeth missing and stained from chewing tobacco said something as he pulled out. I made out \u0026ldquo;Yo, bob you gottcha gooble gobble ya habble ho bee yeee ahh. Laugh.\u0026rdquo; I\u0026rsquo;m normally pretty good with accents and southern slang, but this really threw me.\nThere had been a young woman sitting in a car with the window down, next to where I was taking pictures and I asked if she made that out. She shook her head no, not understanding the Martian language either. Evidently whatever he said was enjoyed by him, so kudos to you fine sir for enjoying yourself.\nThis was the old park. Yeah, not a great camping spot.\nI passed by the old park where they used to let Trans-Am\u0026rsquo;ers camp and agreed with the Police\u0026rsquo;s assessment of the place. The word dump is too kind. There was a small picnic shelter further back where it might be possible to get some rest and plenty of grass for pitching a tent. The empty pool, boarded up building and dug up yard didn\u0026rsquo;t look very hospitable. My choice last night was much better, even with the 4 miles of extra riding. I also passed some of the cheap motels. They looked like places where they may rent the rooms by the hour for the working girls. Shudder\u0026hellip; Not good at all. The park is the best part of the town I saw.\nThere were not many services today, so I cruised along without many stops. Heading out of town I put on the ear phones and started listening to more of The Horse Whisperer. I have found the audio books and sermons I brought along to pass the riding time better than music. With music, you listen to a song, then another, then another, passing time in 3 or 4 minute chunks. With listening to someone talk, you have to concentrate more and the time seems to fly by.\nSupported Tourist\nMost of today was rolling hills. Unfortunately, most of the time they didn\u0026rsquo;t roll close enough together to keep the energy and shoot over the next hill from the previous downhill. While climbing a hill about 4 miles from Springfield, I noticed a cyclist in my rear view. I pulled over and he stopped in the same driveway. At first I said that I didn\u0026rsquo;t know if he had bags when I saw him in my rear view mirror. When I saw the unloaded bike, I initially thought it was a local cyclist on a ride. Then I noticed the Adventure Cycling Trans-Am maps. He has a restaurant just outside of Louisville and is riding the Kentucky portion of the route, with his wife following in the van. A friend at work did his Trans-Am crossing this way and going unloaded makes the hills MUCH less of a struggle.\nI pulled into Springfield just before 11. I was about halfway to Bardstown. I asked for a good place to eat and was directed to a local diner. I had a pork tenderloin, green beans, a salad, and corn bread. It was all made there and really good. I got talked into a coconut cream pie, homemade by the lady who served it to me. It was extremely good. While I was eating, I noticed to guys really examining my touring rig outside. They had just left the diner for lunch. I went outside and answered some questions and gave them cards for the web site. When I came out the guy my size said that he expected some tiny little guy to be riding this, not someone his size. I laughed and told him that I hoped to be a tiny little guy by the time I hit Oregon. He agreed and said that you will look like him, pointing to his slim friend. I paid my bill and got on my way, starting slow to let the food digest.\nStatues\nI had passed a historical marker just before the dinner and took some pictures of the plaques. Apparently Tom Lincoln was married in Springfield, KY an their marriage was on file in the court house. I thought, \u0026ldquo;Well who is Tom Lincoln?\u0026rdquo; Then I was rewarded with the final sign that I looked at proclaiming him as President Lincoln\u0026rsquo;s father. The signs made a little more sense then. A few miles up the road (serious rolling hill miles, let me tell you), I reached the Lincoln Homestead State Park. This is mostly a golf course and lake, with a little section actually for the Lincoln Homestead. There is a replica of the cabin where Lincoln grew up (a tiny little place) and a replica of the cabin where his wife\u0026rsquo;s family lived. This was a two story and multiple roomed cabin with assorted displays. There also was a replica of the blacksmith\u0026rsquo;s shop where Tom Lincoln learned the trade. I took photos of the Lincoln history from England to Presidency and the family tree. A better deal than other places I had been to on this trip for the $1.50 it cost to tour the grounds. All pictures are in the next Trans-Am post.\nThere weren\u0026rsquo;t any services until Bardstown, but I didn\u0026rsquo;t mind. I wanted to ride into town a quickly as I could, as my aunt, grandmother, and cousins were coming down to visit me. I was worried about riding on Hwy 62 into town, but most of the traffic was running on the Blue Grass Parkway. I rode into town and was heading back out on Hwy 150 (bad busy road) towards My Old Kentucky Home campground. I noticed a Blue Caprice in my rear view, the vehicle they were going to be heading down in. I waved and they told me that they would pull over ahead. When I got there, I told them to head to the campground, only another mile or so further. I pulled in there just after 3 and started setting up camp. Once I got the tent setup and some things inside it, I went to take a shower. Then we left the campground and headed into town for dinner. Granny had decided that she would like to sleep out under the stars on a picnic table. I told her that she was welcome to, and she would enjoy the rain that was coming into town. We headed over to My Old Kentucky Home gift shop and were planning on looking at the house. However, we had about 5 minutes to get inside the gift shop before the storms rolled through. It really came down and I wondered how my tent was doing. After most of the rain passed, we left for the Talbern Tavern for dinner.\nThe atmosphere was nice, but the food wasn\u0026rsquo;t as good as I\u0026rsquo;ve had elsewhere for the same price. Everything was marinated in something. It worked for everything but the carrots. I don\u0026rsquo;t particularly like carrots that taste like bourbon. I think it might me against the law to cook anything in Bardstown without using some Maker\u0026rsquo;s Mark (a liquor made in Bardstown). I had never tasted fried green tomatoes before, so I ordered some to start. Granny said that they were too doctored and liked more simple fried green tomatoes. I thought they were good, and the sauce that was served with them was very complimentary. We did have a problem with some ripe green tomatoes. I guess it is hard to find unripened tomatoes these days. :)\nGranny and I\nI see you\nFried Green Tomatoes, yum\nGroup Photo\nDinner Location\nSue had found a coupon on the net for 2 free desserts with entrees. We couldn\u0026rsquo;t decide which to get and asked our waiter to describe their chess pie. He was a very unskilled waiter, but he tried hard. It was somewhat humorous when he ad to run back and ask some things. In this case it was great. He came out with a thin sliver of chess pie, and said that a picture was worth a thousand words and a sample even better. We all tried it and were impressed it was a rich custardy pie. Having tried that, we decided on the tavern pie (a secret recipe) and blackberry cobbler. Both were pretty good. The tavern pie was very similar to a derby pie, but better than any derby pie I have had. Verdict, only go there for dessert.\nWe headed back to the campground and said our goodbyes. I opened up the tent to see that the two side seams didn\u0026rsquo;t enjoy the serious downpour. I had a small puddle in each side of the tent. I managed to get it all out with my sock, but I\u0026rsquo;m going to have to figure out which seam is letting it in. This could be less than fun during overnight rain.\nTent for Night\nI walked over to the toilet/shower area to use the restroom and get some water. I noticed a tripod with a DSS digital satelite dish with a cable running into the motorhome.. I guess you can\u0026rsquo;t travel unless you can have 500 channels at your finger tip. Sheesh. I could myself lucky when my NOAA weather radio comes in.\nToday\u0026rsquo;s numbers: 54.8 miles, 3,170 feet of climbing, and 5:31 riding time.\nHow did it get to be 10 already. Man, time flies when you are typing, I guess. Wonder how good my Kentucky cell coverage is.\nBardstown, KY\nTent Site: 37 deg 47.853 min N, 85 deg 27.468 min W, elev. 762 ft.\nTrip Miles: 882.9 miles\n","date":"12 June 2002","externalUrl":null,"permalink":"/blog/2002/06/12/day-24/","section":"Blogs","summary":"","title":"Day 24 - Harrodsburg to Bardstown","type":"blog"},{"content":" I got to bed late again, after typing up yesterday\u0026rsquo;s travelogue. I was out of the room just before 11, and I headed over to Long John Silvers. I knew that it wouldn\u0026rsquo;t be the best food in the heat, but it sounded really good. Turns out that I didn\u0026rsquo;t eat that much fried stuff, and didn\u0026rsquo;t have a problem with it later in the day. Not the best diet, but I haven\u0026rsquo;t had Long John Silvers in quite a while and it was good.\nI took a picture of the motel key, which I thought was really interesting. However, it is also east to duplicate. I also wondered if it requires both open and blocked, or if all open or all blocked would work. Weird thoughts from an engineer.\nI photographed the vehicles and trailers that were used to haul in the Model-Ts to the area. I had not noticed them last night.\nInteresting Hotel Key\nTrailers for Model-Ts\nTrailers for Model-Ts\nI had thought that I stopped at 595 and I-75, but the cross street I stayed on was Hwy 21. I figure out a 2 mile route to get back on track and started out of Berea on Hwy 595. There is a whole bunch of historical places to stop in Berea, but as the tour has been going on, I have been leaning more away from the organized sites and more towards meeting people and enjoying the out of the way places.\nSnack stop\nThe road ahead\nInteresting Road Sign\nAgain I started seeing the groceries and restaurants closed along the way. I found a place open about 7 miles past Kirksville, just before turning onto 563. I picked up a Gatorade and cooled down a little. It was starting to get pretty hot. The hottest I saw was 95 degrees on a particularly sunny section. The roads today were constantly rolling, with many short but steep climbs. There usually wasn\u0026rsquo;t enough downhill to push and keep adding energy to the top. I worked my gears quite a bit, all day.\nI avoided the witch\nSecond Stop\nCashier\nFinally tried ALE-8\nALE-8 back label\nI stopped again at Bryantsville, just before getting on Hwy 27. They had an ALE-8, so I tried one. It is like a really sweet ginger-ale. I guess that is where the \u0026ldquo;ALE\u0026rdquo; in the name comes from. I think the best way to describe it is a mix between ginger-ale and mellow yellow. I didn\u0026rsquo;t particularly like it. Well, I can say I\u0026rsquo;ve tried it.\nLuckily the route only gets on Hwy 27 to go north a mile or so. It was a really bad road. The people at the store in Bryantsville told me that it was pretty flat into Harrodsville. I have learned to translate:\nThey say: They mean: It\u0026rsquo;s pretty flat There are no climbs over 200 feet. There are some hills There are some serious climbs It\u0026rsquo;s only a mile or so 2 to 10 miles Yellow bag, means rain covers in use\nHarrington Lake\nBoat ramp down\nBridge over Harrington Lake\nYou get the idea. It was up and down all the way into Harrodsburg. When I came up on Harrington Lake, it reminded me of the docks and boats at Lake Cumberland. The smell was the same too. About 2 miles out of Burgin, I thought I heard strange motor noises. I couldn\u0026rsquo;t see any weed eaters around. Pretty soon I caught movement out of the corner of my eye. I looked up expecting a bird and noticed where the sound was coming from. It was a trainer RC airplane flying around. Then I noticed the flying field and the two students being instructed. I stopped and took a break. I saw one student almost put his plane into the ground, but the instructor ripped the transmitter and saved the plane. I haven\u0026rsquo;t flow RC for almost a year and it was interesting visiting with them.\nRolling Hills\nHay Bales\nKeep Moooving\nBurgin only 4 miles out\nRoad Sign\nBurgin Church\nBurgin Church\nBurgin Church\nI got into Burgin and decided not to stop. I was trying for Harrodsburg only 4 more miles. It was some serious rolling hills for those 4 miles and even into town. The Adventure Cycling map has a blurb about camping in a park/pool about 1 mile W of town. The addendum states that there is no longer camping allowed. Since the original states that you should check with the Police, I decided to head to the Police Station and act dumb. (I can here you guys out there saying \u0026ldquo;That\u0026rsquo;s not hard for you.\u0026rdquo; Very funny.) Apparently the park is closed down and under repair. There are not restrooms or water or anything. They suggested a park about 2 miles out of town, with \u0026ldquo;a couple of soft ball fields.\u0026rdquo;\nA Police Department looking for lodging options\nSnack stop\nSo, I head north on Hwy 127 and reach a light. I noticed a Wendys and wonder if I should stop until it gets darker. I ask a crowd around a church about the park and they verify that it is about a mile up the road. I turn around and go into the Wendys. I found a seat next to a wall plug and begin typing this. About 8:15, I figure I better get up to this park and figure out where I\u0026rsquo;m gonna camp. I get on Hwy 127 and start seeing signs for this place. When I turn in, I was floored. I\u0026rsquo;m trying to have a low profile and this place if full of hundreds of people. Everyone that sees me say something to the effect, \u0026ldquo;Hey! look at that bike.\u0026rdquo; I took a picture of the map, which has the roads completely wrong. Anyway, there are 10 or so baseball diamonds, a coupe soccer fields, a Frisbee golf course, a huge running track, basketball courts, picnic shelters, playgrounds. This place is huge and FILLED with people.\nEntering park\nGames still on\nHome for the night, once I\u0026#39;m alone\nI have been trying to get to the picnic shelters at the back of the park, hoping that less people would be back there. The map shows roads that aren\u0026rsquo;t there. It is a map of future expansion or something and I\u0026rsquo;m guessing that the shelters aren\u0026rsquo;t even there. Anyhow, I have my bike hiding behind a dumpster. I don\u0026rsquo;t have a place that is totally hidden and those still walking on the track can see it. One of the close by softball games just finished and people are leaving. I hope I don\u0026rsquo;t have any problems tonight. The park is slowly starting to empty and is supposed to close at 11 PM. I probably won\u0026rsquo;t be able to setup inside a picnic shelter until after then. I\u0026rsquo;m hoping to just roll out my Thermarest and Sleeping bag and pray the bugs aren\u0026rsquo;t bad here.\nYay, power!\nHiding bike until after dark\nHome for night\nIt is now 10 PM and I am sitting inside a picnic shelter. My bike is still behind the dumpster laying on it\u0026rsquo;s side. I figure I\u0026rsquo;ll go ahead and send this, but I might have to change my night data below if I get run out. I love this guerrilla camping, puts a little excitement to sleeping at night. :)\nEverybody leave, it is after 11 PM. (Except me)\nToday\u0026rsquo;s stats: 53.9 miles, 3,410 feet of climbing, a few minutes over 6 hours travel time.\nOh, I forgot to mention rain. Towards the end of the afternoon, some serious cloud cover came up. It was great, as it reduced the temperature by 10 degrees. A few large rain clouds formed and I slowed down a few times to let them pass in front of me. I did get a little sprinkle, but I quickly put on my rain cover for my rear bag, knowing that it would stop the rain. It did. Had I have left off the rain cover, the rain would have started pouring. I\u0026rsquo;m sure of it.\nHarrodsburg, KY\nGuerrilla Camping Site: 37 deg 47.925 min N, 84 deg 50.550 min W, elev 895 ft.\nTrip Miles: 825.7 miles\n","date":"11 June 2002","externalUrl":null,"permalink":"/blog/2002/06/11/day-23/","section":"Blogs","summary":"","title":"Day 23 - Berea to Harrodsburg","type":"blog"},{"content":" Staying up to type past 1:30 AM this morning was not a great idea. I slept pretty late. The things I do for you guys\u0026hellip;\nAfter waking up at 10 or so, I started packing up and changing the front to the rear tire. Which I believe I talked about in yesterday\u0026rsquo;s flat summary. I changed my bad tire with the one I stole off the front of Dad\u0026rsquo;s bike. His Vision R40 has a 26\u0026quot; rear, but a compatible 20\u0026quot; front.\nHome for last night\nGetting ready to roll\nI finished off the Maple Pecan Crunch cereal and Rice Dream that I started last night. I didn\u0026rsquo;t realize how small those boxes are when I thought two servings would leave a bunch of cereal. Not so. It was mostly gone when I left the room. Speaking of leaving the room, checkout time was noon. When did I leave the room?\nA) 6 AM B) 10 AM C) 11 AM D) noon\nFor those of you who picked A, you are morons who need to invest in some reading comprehension classes where I said that I woke up after 10 AM. For those of you who picked D, you have been reading my travelogue and know that I like to use my time in the motel to the fullest. I only had 30 miles to ride today, so it wasn\u0026rsquo;t a problem.\nLeft this one alone, I like my fingers.\nWhile it is tradition, as the slowest thing on the road, for cyclists to help turtles across the road. However, I found one today who can fend for itself. I don\u0026rsquo;t help snapping turtles across. I really like my finger attached where they are, thank you very much.\nKentucky\u0026#39;s Soda\nClovers Bluebanks Grocery\nExterior shot\nI pulled into a small grocery at Wisemantown, and was surprised to see how sparse the shelves were. Turns out that the store is closing, due to health problems in the owners family. I purchased some fruit juice and some granola bars. Since I didn\u0026rsquo;t have any snack food left, it was good to get some food. The ride had some rolling hills with some steep climbs. There were enough hills that I would have gotten into Berea late and sore last night, had I taken the short-cut.\nI saw a new soft drink today: ALE8. I initially thought it was some type of beer when I saw it in the Wisemantown grocery. Then the machine outside had a sign about Kentucky\u0026rsquo;s own soda, or something to that affect. The clerks inside said that people come from around to get it. Not sure if I want to try it or not. They said something about it giving people heart attacks, but I\u0026rsquo;m sure that it has to be more of a total lifestyle thing that includes ALE8 soda. I think I\u0026rsquo;ll pick up one if I see it again, just for research. Then I get to see how well I can describe a taste in words. :)\nTree eating fence\nHorse Shoe Bend\nGreat Lunch\n3 miles before 421, I stopped at a gas station/deli/grocery. I didn\u0026rsquo;t realize how low my funds were getting. I thought I had another $20 than I had, so I didn\u0026rsquo;t get all that I was planning. Just a Sunkist soda and a roast beef sandwich. This was the best sandwich I have had all trip, so far. I would have liked whole wheat bread, but everything else was perfect. Purple onions, good lettuce, tomato, mayo, mustard, Colby cheese, roast beef, and pickles. Yum, yum. Much better than the typical burgers or fried chicken sandwich that are offered at the other places I had been through.\nBiker Log\nOne page back\nThey had a sign in book and I see that Bob and Mary came through yesterday. I think they are a full day ahead now. They pushed into Booneville, when I was in Buckhorn. This allowed them to use the shortcut and get into Berea yesterday. I\u0026rsquo;m still fine with my progress, given the time I have to complete the trip. They needed to be finished a few weeks ahead of me. Adam came through on the 7th, 3 days ago.\nI think I forgot to mention that I ran into my first West to East Trans-Am\u0026rsquo;ers yesterday. I think it was yesterday, but it might have been the day before. Amazing how things are blurring together into one transient existence. Anyhow, these two were moving fast at only 11 weeks out. They should be at the coast in another 2 weeks.\nI\u0026rsquo;m glad that I stopped and got a sandwich to eat. There I was told that Hwy 21 was closed for the next 2 days into Berea. I would have probably had to back track some if I continued without knowing this, but was able to pick my own route into the city. Hwy 21 probably had less climbing than the route I picked, but the GPS maps I used for routing were really handy. My first goal once I arrived in Berea was to find an ATM. It took a mile or so, but I got there eventually. I totally missed the first bank and turned into town. I asked someone if they knew were a nearby ATM was and headed to the bank they recommended.\nNon-operable ATM\nThis bank was 1/4 mile away and I found it fine. The lobby was closed and the repair crew at the ATM didn\u0026rsquo;t bode well. It was indeed down, and I was out of luck for this bank. The repair guy did recommend another bank. I headed back to see the bank that I missed coming into town. With some cash in my wallet, I felt much better.\nMy clothes needed this\nOn the wall\nFriendly Attendant\nTyping while I wait\nStrawberry Shake Source\nI headed up the street to hit a laundry mat. I had been planning on washing in Berea for a few days, so I didn\u0026rsquo;t do as much hand washing in the shower as normal. While my laundry was in the washer, I walked over to Sonic and picked up a strawberry shake. It is a good tasting way of cooling down the core temperature from the inside out. Temperature is still pretty high. The news was on at the laundry mat and we are still many degrees above normal. Hopefully this line of showers will work it\u0026rsquo;s was across Kentucky and bring some cooler weather.\nPool was nice!\nI finished up the laundry and headed over towards the campground just outside of town. On the way, I spotted a Wal-Mart. Some more of a kid in the candy store action. :) As I turned into the street leading to the Wal-Mart, I noticed a non-chain motel that looked like it might be reasonable. I swung in and asked about the rate. I looked the bedraggled biker and asked for the cheapest room they have. He told me he could give me the weekly special rate for just one night, of $38. I really should camp, but a Wal-Mart and pool and restaurants and \u0026hellip; OK, I\u0026rsquo;ll take it. I loaded the bike into the room and headed over to the pool. A couple were there relaxing and I got in the other side of the pool. Oh, that felt good on my tired legs. I shouldn\u0026rsquo;t have pushed hard to \u0026ldquo;buzz\u0026rdquo; Bill yesterday. I can feel it in my legs today. The treading water in the pool felt good.\nIt didn\u0026rsquo;t take long for the cars to start to arrive. And it made the motel room price, so much worth it. I would have totally missed this at the campground.\nAnother Model T\nAnother Model T\nAnother Model T\nAnother Model T\nAnother Model T\nInterior\nSign\nAnother Model T\nAnother Model T\nAnother Model T\nAnother Model T\nLooks like boat lights\nNice Seats\nAnother Model T\nAnother Model T\nThe couple I met at the pool were part of a group staying at the motel all week. They are all driving various types of Model-Ts on a hub tour. Each day they head out in a different loop from Berea to visit various historical places. We talked about the Model-T, my bike tour, airplanes, and other things. After a little while they left, but I gave them one of my web cards to follow along on the trip. After I got done swimming, I took a look at all the different Model-Ts. I was really happy that I decided to stay in the motel tonight.\nI had never really looked close at the Model-T before and they are really simple. The hood ornament has the water temperature thermometer and the inside has an amp meter. Some other the more advanced Model-Ts have odometers and speedometers. Most get around 14 miles per gallon, so they aren\u0026rsquo;t the most efficient engine. The ones I saw running have a battery to start and a magneto to run. A magneto is used on piston aircraft engines. It is a device to generate the spark for the plug via the engine\u0026rsquo;s rotation. This doesn\u0026rsquo;t require a battery for operation, unlike the modern car\u0026rsquo;s battery, ignition, and alternator setup.\nT-Shirt says it all\nAnother Model T\nAnother Model T\nModel T Enthusiasts\nSpeedometer and Odometer\nSteering Wheel\nBike Computer as accurate Speedometer\nAnother Model T\nInterior\nSpeedometer and Odometer\nModel T Brake and Shifter\nAnother Model T\nAnother Model T\nAnother Model T\nAnother Model T\nAnother Model T\nAnother Model T\nAnother Model T\nAs I was finishing with pictures and walking back to my room, Bob started up his Model-T and pulled out of the parking space. He asked if I had ever ridden in one and asked if I wanted to come on board. I quickly agreed. It was pretty cool. We headed down the road, towards the Wal-Mart until the engine started loosing it\u0026rsquo;s fuel supply. It stalled and I helped push the car the rest of the way into the McDonald\u0026rsquo;s parking lot. This was actually a great thing to happen, as I got to learn more about the engine. There is a drip under the gas tank to make sure the fuel is good (like an aircraft). The fuel wasn\u0026rsquo;t coming out, so Bob broke up a small stick and cleaned it out a little. I wondered how hard the front crank was, so he let my crank it around while he worked on getting fuel up front. You have to push in the handle to latch it onto the drive shaft. It isn\u0026rsquo;t terribly difficult to turn the engine over, so the compression can\u0026rsquo;t be really good, but modern standards. The engine on the Aeronica Champ I used to fly was harder to turn over using the longer lever of the aircraft prop. Once the fuel started to flow, Bob cranked the engine back to life. There are two settings on the ignition switch, Bat and Mag. This is in addition to Off, obviously. There is a small 12V battery (now a motorcycle battery, but possibly more of a dry cell \u0026ldquo;back in the day\u0026rdquo;), to help get the engine started. Once the engine is running, the engine is switched to Mag. I\u0026rsquo;m not sure exactly how this works, but it was different than I expected. When we got back to the motel, one of the others offered to take my picture, so I handed of my digital camera. Then I gave my thanks to everyone and headed back to my room.\nView out the front. Short windshield.\nMy Driver\nCranking to Start\nTroubleshooting\nEngine compartment\nSpeedometer take off\nEngine of Model-T\nMe in the Model-T\nI cleaned up and get ready to head out for some shopping at Wal-Mart. I remembered the partial eclipse we were having tonight and headed out at 8:30 to check it out. The moon was cutting off a bit of the sun and the clouds had dissipated enough for a good view. I walked over to the Model-T group and asked if they knew about it. None did and they thanked me for showing it to them. I took a few pictures that look like they turned out OK, then walked over to Wal-Mart.\nI again felt like a kid in the candy store. After living out of small groceries, it is amazing to see how much there is to choose from. I picked up bananas, strawberries, some rice mixes, 3 oz no-drain tuna envelopes, granola bars, beef jerky nuggets (Mmmm!), and chocolate milk chug. I normally don\u0026rsquo;t drink chocolate milk, but this is the second time I have craved it this trip. It was good. Looks like the chocolate milk and strawberries are gone, might have to do a little work on those beef jerky nuggets. I\u0026rsquo;m glad that Wal-Mart and Sams Club are in the same chain, that means that they carry the same jerky nuggets that Mom got at Sams for Dad to bring down for the weekend. It is the best beef jerky I have had. Might be related to the second ingredient being brown sugar.\nPartial Solar Eclipse\nResults of close Walmart\nMassive Strawberries\nI also had a little self inflicted torture today. The Halt! pepper spray that I use on really mean dogs did one eye in. If you have ever spray painted and held the tip of your finger over too far, you get what happened. I had two guard dogs come after me and got out the Halt! to hit both of them. It all happened fast and I didn\u0026rsquo;t position my finger perfectly. The dogs were hit it the face and quickly turned around. About 5 miles later, I got a little bug in my eye and used a finger to get it out.\nWhich finger, you ask? Oh, you know which finger.\nI first started to get a little burn of what I thought was some sunscreen in my eyes. Ouch. I tried to find a place to pull over, while I also tried to watch traffic. It is hard to use a helmet mounted mirror when you have to keep that eye closed. Anyhow, I pulled over and started washing my eye out with a water bottle. I\u0026rsquo;m starting to understand why those mean dogs stop being mean real quick. Your attention is on something else. The pain started to gradually fade and was gone in 10 minutes, as advertised. So it really gets your attention, but doesn\u0026rsquo;t do damage or linger too long.\nToday had around 1700 feet of climbing, 32.6 miles, and just over 3 1/2 hours of moving time.\nBerea, KY\nMotel: 37 deg 34.040 min N, 84 deg 18.582 min W, elev 984 ft.\nTrip Miles: 771.8 miles\n","date":"10 June 2002","externalUrl":null,"permalink":"/blog/2002/06/10/day-22/","section":"Blogs","summary":"","title":"Day 22 - Irvine to Berea, KY","type":"blog"},{"content":" Dad woke up early, and started fixing breakfast. Bill came by and told me it was 6:40. I told him to come back in 15 minutes, kind of a human snooze. We all sat down to some oatmeal and raisins, then started cleaning and packing up. We got everything into the van or on the bikes to get going. I started out a little ahead of Dad, just after 8.\nMe sleeping\nLow clouds to start the day\nI was riding slow to allow him to catch up, which he did in about a mile. We rode for a while, doing both rolling hills and some serious climbs. I know I mentioned this before, but it seems like the hills always top out at county borders. This was true in Virginia and the same thing has been holding true for Kentucky. It is nice to see those coming up on the map. It means that it at least levels off and usually goes downhill.\n98 years of service, commendable\nSign to Morris Fork\nAbout 3 miles out Dad told me that my rear tire looked like it was a little low, but wasn\u0026rsquo;t sure. It didn\u0026rsquo;t feel low yet, so we kept going. In a few miles, I could feel that it was low. We pulled over to check it out. I found a little sharp rock that had cut into my tube. Another day and another flat. I patched the tube and we got back on our way.\nRoadside dump\nThese were unfortunately not rare\nEastern Kentucky Sculpture\nWe passed our first roadside dump in Kentucky. I\u0026rsquo;d heard about this, but not seen one before. It was a pretty sad sight. Just a little after that, we ran into another one of the black snakes. Dad relocated it to the side of the road.\nWe saw many of these guys lately\nDad helping the snake of the street\nBicycle Tourist we passed\nA little later, Bill passed us in the van. He parked just into Booneville and started riding towards us. We met him a mile or two from the van and we rode into town. I decided that Berea was going to be a little far, and we stopped for brunch at Tom\u0026rsquo;s Diner. I call it brunch, because Dad and Bill got breakfast and I ordered lunch. There was only one lady working in the diner, so the food took a while to get made.\nTiny little guy I noticed\nTom\u0026#39;s Cafe for lunch\nTired Trio\nAfter eating an digesting a little, we started riding again at 12:30. We had pulled into the diner at 11. We were hoping for some rolling hills to aid with digestion, but were greeted with climbing in the heat. The temperature reached 100 degrees with the unshaded roads and rock sides. Bill climbed up to the top of the first hill before heading back. He had a bike with way to high of a low gear for these hills. It was often that you would find him doing S shaped curves along the road to \u0026ldquo;flatten the hill\u0026rdquo;. The cars were not sure what to make of the drunk biker, but he seemed to straighten up when the cars came. :) Dad took over for a while.\nDad getting some riding in\nRoad ahead\nAfter climbing up to Vincent, we had a nice rolling downhill on 399. Then we turned onto 587 and began climbing again. Bill came up in the van just as we were pulling over for a little rest. Dad\u0026rsquo;s legs were getting a little sore, so he loaded up in the van for a while. He picked a good place to pack it in for a while, as the constantly climbing rolling hills were tough. I was still wondering if Berea was possible today, but these hills made me readjust to Irvine. Bill came climbing up one of the hills and I passed him pretty fast on a downhill. They decided to go ahead to Irvine and look for lodging. That is one less thing I would have to do when I got into town.\nButterfly on flower\nButterfly on flower\nI was pushing pretty good today and making good time, despite the hills. After about 40 miles, the climbing hills turning back into some nice rolling hills. I was wondering what Donna was talking about in her book about today feeling like riding through a jungle until this rolling hill section. There were a few miles with trees and vines on each side up to the road. It really did have kind of a jungle feel to it.\nWe started seeing orioles today. These are small yellow and black birds that really stand out from the others. I probably saw over 4 dozen throughout the day. On time later in the day I rounded a curve to scare over a dozen orioles that were drinking in a puddle. They exploded like a firework with yellow wings floating all around me. It is an experience that you can\u0026rsquo;t capture in a picture or video.\nCool bridge\nAnother scene for the day\nI saw Dad up the road a little bit, around 9 miles from town. He and Bill had parked at the motel and ridden back towards me. Bill had stopped about 5 miles out, but dad kept coming. We ran into him about 7 miles out, but I was pushing good and he fell behind. It is hard to keep up with the reduced drag of our recumbents on rolling hills. My legs were still feeling good, so I was pushing some speed. I stopped to take some pictures and Bill passed us again. He was listening to music on his CD player and enjoying himself. As we got moving again, I put the hammer down and we blew past Bill at +10 or better mph. We were greeted with a \u0026ldquo;Wow\u0026rdquo; as we surprised him. Then after we got ahead, I started looking for a hidden driveway to pull into. We found one and pulled up it. Pretty soon Bill passed and we set out to blow past again. It takes a while to wrap up to 27 mph on the level and a good bit of power to keep it there. It was a better reaction this time, because Bill thought we were ahead of him.\nButterfly I noticed\nPretty Kentucky Scene\nBill fixing the tunes\nA few miles further, I felt like my rear wheel was a little wobbly. I stopped and saw that part of the sidewall was separating again. This is the second Tioga Comp Pool that has done that on the trip. I still think that it is from the excess rim heat from the serious downhills in Virginia. I stole Dad\u0026rsquo;s front tire of his bike and hope that will get me to Rough River to meet my family with some new tires from Valley Bikes. I hope I don\u0026rsquo;t have flat problems with the Primo Comets. That was always the case until I switched to Comp Pools.\nWe arrived at the motel just after 5. Today was a long day, with 60.2 miles and 3,940 feet climbing. My legs would have probably lasted into Berea, but I would have arrived really late. I started sorting out my things and getting them out of the van. Bill and Dad took a shower and packed up for the trip back home. Hopefully the 3 days of riding will make it shorter than the trip out. I didn\u0026rsquo;t realize how far into Kentucky we made it until I looked at the large map. It is always cool to make that discovery, because you rely on the small maps for so long that sometimes you loose your focus on the wide view. The wide view doesn\u0026rsquo;t really matter. It is just a day to day existence anyway, so who cares about the overview. It is fun to see what the next bend or hill holds.\nTomorrow I\u0026rsquo;ll have a short 30 mile day into Berea. My legs won\u0026rsquo;t mind a lighter day.\nIrvine, KY\nMotel: 37 deg 41.872 min N, 83 deg 59.442 min W, elev 738 ft.\nTrip Miles: 739.1\n","date":"9 June 2002","externalUrl":null,"permalink":"/blog/2002/06/09/day-21/","section":"Blogs","summary":"","title":"Day 21 - Buckhorn to Irvine","type":"blog"},{"content":" I got to bed after midnight, so I didn\u0026rsquo;t feel bad sleeping in past 9. Dad was up to hit the bathroom at 5:30 and ran into the owner of the Hostel where we were westing. (Sorry, that should say resting, but I kinda got caught up in the alliteration. It\u0026rsquo;s my report, so I get to type what I like.) He pulled in the bike to fix the computer wires that have been broken since Day 1. I didn\u0026rsquo;t know about it until I saw the computer spitting speeds and such at me when starting out today. Dad also has been doing quite a few other fixes. He implemented the aluminum stiffeners that we have been talking about over the phone for a while. This should keep the corners from pulling in and allowing the rear of the bag to drop down. We also added aluminum skid guards, so I hit aluminum and not bag if I lay the bike over too far in fast corners.\nThe ceiling is really low in the Hostel sleeping area. If I stand perfectly straight up, I touch my head. So the ceilings are 6\u0026rsquo; 5\u0026quot; or so. The door jams and misc. other things hang down lower. I brought tears to my eyes twice by smacking my head into something. Then I put my helmet on. I\u0026rsquo;m sure I looked like that hyper-active kid with a leash and a helmet, but I didn\u0026rsquo;t care. I smacked my head another few times without pain. I guess that is my style, dorky but functional. :)\nBill prepping to ride\nPippa Passes Hostel\nBill prepping to ride\nLove having my bags in the van\nFound the American Youth Hostel sign. Barely.\nIt has been nice to ride a few days unloaded. I got out of the Hostel and on the road just before 11. Bill rode the first miles with me and we had a decent climb or two followed by rolling hills. After a little time out, Dad came up in the van asking if we knew where the van keys were. He was driving it with the spare. We didn\u0026rsquo;t know, and he turned around to look some more. He later passed us and we gave him a thumbs up. He followed with a thumbs down. No keys. (Amazing how simple it is to communicate, isn\u0026rsquo;t it?) At night we found out that they were in Dad\u0026rsquo;s clothes that he was wearing before changing into riding clothes.\nWater and Snacks\nDad was driving, cause he is not drinking\nBill and I rode into Hindman, where I pulled over to get a few snacks and some Gatorade. They had ICE Strawberry Gatorade, yum yum. I also got some Nutragrain bars. The day rolled along with rolling hills for quite a while. There were some decent climbs, but not too bad. The van passed me a while out of Hindman and Bill was shaking my pump out the window. I gave them a thumbs up, meaning I want it. Seems like our simple communication isn\u0026rsquo;t as good as I thought. I kept rounding corners looking for the van to get my pump back. Running without the pump was making me nervous with the slew of flats I\u0026rsquo;ve been having lately. I finally caught up with the van and Dad was getting ready to ride. I pulled over for a little rest and got my pump back.\nDad and I rode along for quite a while with some decent climbs on 80 where there wasn\u0026rsquo;t much relief from the Sun. Hwy 80 is a 4 lane divided highway with wide shoulders. It is amazing how the tree lined roads are 10 degrees cooler than pavement laden highways. After some up and down and up and down on 80, we pulled off onto 15. This is a 4 lane highway with varying shoulders and more climbing. We stopped at a gas station to refill water and get some strawberry slushies. A bit up 15, we came across a water park where all the kids got a kick out of two recumbents riding up the street.\nA little further, we started seeing a guy on a dirt bike and two on four wheelers. They were riding wheelies down a side street and turning around to repeat. These guys were some serious Darwin Award candidate wannabes. About when we got to where this side street meets 15, the dirt bike and one of the four wheeler decided to ride on 15. They both head up one of the lanes and proceed to ride wheelies up one lane at 20 mph in a 55 mph road.\nThen the dirt bike rider drops the front wheel down and decides to go around the four wheeler. He does this move fast, without checking if anyone is there. Luckily the black truck is watching this idiot\u0026rsquo;s moves and hits the brakes instead of the bike. I was glad to see the outcome, but it was very close to something ugly. Unfortunately he probably didn\u0026rsquo;t learn anything from the encounter.\nConfederate Raid Sign\nMorgans Last Raid\nCoal on side of road\nCoal collecting route\nDinner stop\nWe all met up in Chavies for dinner. As with many places, the gas station had a little grill in the back and places to sit. The locals at the gas station told us that there was a few serious climbs on the way to Buckhorn.\nWe didn\u0026rsquo;t know if we could make Boonville tonight, but it was beginning to seem more unlikely. The climbs were pretty good, but they haven\u0026rsquo;t been as bad as many in Virginia. Just seems like there isn\u0026rsquo;t enough riding time in a day when you spend a good bit of it at 3.5 mph climbing hills. We pulled into the campground at Buckhorn Dam a little past 6:30. Today was around 55 miles with 3,440 feet climbing. I was moving for 5 1/2 hours, with a total time of 7 1/2 hours.\nLog Cathedral Church\nMurdoch of Buckhorn\nLog Cathedral Church Sign\nWe setup camp and started dinner. We had lentil soup and black beans and rice with tuna. That is two dishes, not one huge mixed together stew or something. Dad and Bill had discussed heading down to the boat ramp for swimming, and I decided to come along. When we got down there, it wasn\u0026rsquo;t pretty. There were huge piles of trash and drift, dragged to the ramp area by floating roped together railroad ties (or something similar). It looks like they will be bringing something in to lift all of the trash out of the water. Either way, the water was not as fit for swimming as the Ohio River (which is really bad). We nixed the swimming idea and headed back to camp for showers. It would have been nice to work out the muscles in the water, but oh well.\nHome for the night\nDad and Bill\nCampsite\nSaying the blessing for dinner\nWater was too nasty for swimming\nWhile Dad and Bill headed for showers, I started burning CDs with the CD Burner that Dad had brought with him. I have 4 CDs worth of pictures for this trip, so far, which I wanted to back up. Also, I guess my family want to look at them or something. Unfortunately, my little laptop is so slow that it took me over 4 hours to resize and type up the 3 days of pictures that I loaded onto the site. I\u0026rsquo;ll try to get more online, but only after I get these reports typed up. Anyhow, I burned 4 CDs and started typing up this day. I didn\u0026rsquo;t get far, before I sent yesterday\u0026rsquo;s report and went to bed. Again, I got to bed late. It was almost midnight and I told them to wake me up at 6 AM, yikes.\nThere is a shortcut on tomorrow\u0026rsquo;s route that cuts off around 12 miles. The catch is that you would have to ride 88 miles with more than 4000 feet climbing to get to Berea for the night. This was the reason for the early start. We will see what I feel like at mile 52, where the shortcut starts. If I\u0026rsquo;m not feeling up to Berea, it will be a night in Irvine.\nOh, sometimes important information is the lack of information. You will notice that today is the first day in the last few without a flat. I hope the starting of a trend.\nBuckhorn, KY\nTent Site: 37 deg 20.660 min N, 83 deg 28.214 min W, elev 817 ft.\nTrip Miles: 678.9\n","date":"8 June 2002","externalUrl":null,"permalink":"/blog/2002/06/08/day-20/","section":"Blogs","summary":"","title":"Day 20 - Pippa Passes to Buckhorn","type":"blog"},{"content":" Dad and Bill pulled up to the motel at just before midnight. I was sitting in a chair in the gravel parking lot, uploading pictures. The 1.6 MB of pictures and my two emails took over 40 minutes to upload.\nWe had some trouble with the motel manager about paying for 3 people to stay in the room. He kept repeating \u0026ldquo;2 people in a room.\u0026rdquo; He then told Dad and Bill to go up the street (we later learned this was because there were rooms with two beds up there.) When Bill asked if he could just get another room, the owner said that was fine. It seems like he could have just suggested this in the first place, rather than going off like they were some misfits that need to get off his property.\nWe started to get things unloaded and Dad decided he would crash on the floor with his air mattress. We laid down around 12:45, but probably didn\u0026rsquo;t get to sleep till after 1 AM, because we wouldn\u0026rsquo;t stop talking for a while.\nThe van\nDad copying route down\nDad and Bill going over route\nI failed to mention that I had another flat last night. I\u0026rsquo;ll do a flat rundown at the end of this message, but I\u0026rsquo;m up to 5 total from 0 only 4 days ago.\nToday was a good ride with some decent hills. There was an option to do 11 miles more, but leave out some hills. I took the shortcut, but should have picked the other route. Climbing hills at 3.5 mph can be much more work than making up 11 miles on rolling hills at 12 mph. Oh, well.\nWe left the motel a little after 11. Bill rode with me the first few miles. I think he did 12-15 miles, starting out with 8 nice rolling miles. I had my first flat of the day (3rd flat of the trip, see Flat Rundown later), about 2 miles before the turnoff. Bill helped me for a bit, then went ahead. He wanted to get a lead, knowing I would catch up. When we turned onto the main route (the shorter and hillier one) and started climbing, I wondered about my choice. I saw Bill turn and was around 200 feet behind him for a good part of the climb. It was a pretty good climb of over 700 vertical feet, with a nice steep section near the end. I walked a little of the steep part with Bill as we talked. Dad had been driving the van and he was going to stop up ahead.\nFirst shift is up\nPretty flowers\nPretty flower\nBill mentioned that he was probably going to stop at the top and switch with Dad to do the downhill. When we hit the top, we saw that this wasn\u0026rsquo;t the case. I left Bill in the dust on downhill, and shouted to Dad when I passed that it was downhill and Bill should make it fine. Well, that wasn\u0026rsquo;t the case. Just as he started the downhill, his rear tire blew out. The tires and tubes are really old on his bike and it wasn\u0026rsquo;t a surprise. I was up ahead at a turn-off, waiting to make sure they took the right turn onto 611 at Lookout, KY.\nDad waited for a while and went back to find Bill walking his bike down the hill. While I waited, I helped try to get some guy\u0026rsquo;s truck push started, but we never succeeded (remember, were entering deliverance country here in eastern Kentucky and some of these vehicles are pretty rough.) Just as I was going to get going, I see the van coming along. Dad remembered the right turn, and went ahead of me to start getting his bike out.\nSmall Stream\nLunch stop\nTurtle I could not help.\nDad and I rode along from Lookout till where the route joins 23/119, a 4 lane highway with shoulders. Just before 119, there was a small ice cream and sandwich stop. This was where Bill had pulled off, and we stopped for a break. We all ate lunch: cheese burgers, slaw, and fries (we all shared my order). Bill was going to head into a town south of us that had a Wal-Mart to get some tires and tubes. We decided to meet up at Melvin, some 20 miles ahead. Dad and I left around 3 PM.\nThe ride up 119 wasn\u0026rsquo;t bad, as the shoulder was wide. Unfortunately the shoulder was covered a bit with rocks and junk. The rumble strips were well designed, to not be unsafe for bicycles. They make the bones in your middle ear vibrate wildly when you ride on the rumble strips. It is a very interesting sensation. I still wonder if it would be possible to modulate the rumble strips to say stuff.\n[Deep throaty voice] \u0026ldquo;Welcome to our Town\u0026rdquo;.\nHow cool would that be? Anyhow, we cruised up 119 and turned onto 1469 toward Virgie. My back wheel started to feel funny and sure enough I had another flat. When changing the tires around to get the better one on the back, I noticed the front had been punctured too. Fun stuff.\nDad ahead on 119\nMiles counting down\nHelped this guy across\nWe rode for a while through nice rolling hills before starting a fun 3-4 mile climb up the hill. We took over an hour climbing and I told Dad that this was almost as bad as parts of Virginia. He can now see how some 30 mile days are an accomplishment. Once we got up to the top, there was another serious switchbacked downhill. I had to stop a few times to get the tires to cool off. Finally, the sight lines opened up a bit and I was able to let the bike run up to around 50 mph.\nStrawberry Dole Bar, yum.\nWe pulled off at a BP in Melvin and had a Strawberry Dole bar, waiting for Bill. After a while, we figured he would find us and headed on. Hwy 122 heads out for about 6 miles with some nice rolling hills. After this, we started climbing for a while. People said that it wasn\u0026rsquo;t as long as the last one, but steeper. That was a fair description. About 1/4 or the way up, Bill pulled up behind up.\nDad swapped with Bill and let Bill ride. I mean push the bike up the hill a ways (he doesn\u0026rsquo;t have touring gearing). Dad found a place to pull off and we started making plans for the evening. From what others had told us, there was another large climb between where we were at and Pippa Passes (besides the one I wasn\u0026rsquo;t up yet.) So, we initially planned that they would find lodging and I meet them after this hill where the route joins 7. I started up the hill some more, as they loaded Dad\u0026rsquo;s bike in the van. They passed me almost at the top. The top was a county line, similar to the way Virginia divided up counties along ridges.\nI made it to the bottom a few minutes behind them, as I ran the downhills up to 50 mph. I stopped just shy of the Hwy 7 intersection. I went into the gas station store to get some bananas and a chocolate milk (it was a strange craving, but the chocolate milk was good).\nBanana and Chocolate Milk, yum.\nWhile I was outside about to eat a banana, I saw a serious flapping in one of the trees across the street. I took the camera over to see what was going on and was greeted by yells and arm waves from the restaurant just past the intersection. It was Dad and Bill. The flapping in the tree was a rooster who got himself up in the tree and was shaking it all around. I went over to the restaurant and was told that the route to Pippa Passes was not as hilly as we thought. I had just read the same thing in Donna\u0026rsquo;s book. They made reservations for the Hostel and I started off for the last 15 miles, just before 8.\nFirst mine I saw\nLiterally where the line ends\nGentle climb in fading light\nSecond save of the day\nWith my lights on and a goal in mind, I started pushing my bike hard over the rolling hills. I stopped to take a picture of the first mine entrance I had seen so far, a place were the powerlines ended, and another turtle. I hadn\u0026rsquo;t mentioned it yet, but I was able to help two turtles across the street today. I was climbing up the hill around the college in Pippa Passes, when I see the van coming back at me. Apparently you can go through the college and eliminate this 200 feet climb and descent. Oh, well. What is one more hill. I made it in just before 9, so a decent 15 mph pace for the last hour.\nThis is the only good place to stay for miles, so most of the Trans-Am\u0026rsquo;ers ahead of me stayed here. The father and daughter couple I met in my first few days came through on the 1st. The Petes were through here on the 3rd. Adam and Mike were through here two days ago and the couple from Holland were here yesterday. Bob and Mary had stayed at the same motel as I did last night, but were seen in Hindman (a city about 10 miles down the route from here) around 4 PM today. I guess to use the dates above, I guess you need to know that today is the 7th of June.\nPippa Passes Registry\nPippa Passes Registry\nPippa Passes Registry\nSleeping Quarters\nKitchen\nSink\nFlat Rundown:\nDay 17 - First Flat coming into Breaks park, due to a little sharp rock that I left in the new tire.\nDay 18 - Second Flat, I thought caused by a second place where the rock damaged the tube.\nDay 19 - Third Flat, caused by a little piece of wire that was still in the tire. This is the actual cause of the flat on Day 18. Wire was found and removed from tire.\nDay 19 - Fourth Flat, caused by a bit of metal that cut into the tire. I switched the front and rear tires to get the better Tioga Comp Pool tire on the rear and move the spare up front. When mounting the rear wheel, I noticed a hissing sound. Looks like the front wheel would have been flat in a few miles if I had not swapped them. So we have the Fifth Flat.\nI hope the flats are over for a while. I\u0026rsquo;m getting sick of fixing them, and I\u0026rsquo;m running out of patches. It is after midnight. Bill and Dad have been sleeping for an hour as I typed. Enough for now.\nReproduction of today\u0026#39;s map\nPippa Passes, KY\nHostel Site: 37 deg 20.100 min N, 82 deg 52.846 min W, elev 1076 ft.\n","date":"7 June 2002","externalUrl":null,"permalink":"/blog/2002/06/07/day-19/","section":"Blogs","summary":"","title":"Day 19 - Elkhorn City to Pippa Passes","type":"blog"},{"content":" I woke up late and listened to the rain fall on the tent. I think it was residual rain from the trees. I laid in the tent for a while, and enjoyed the lack of motion. I was planning on staying in Elkhorn City at a $30 room, so my Dad would have an easy place to find me.\nI strung up a line to dry out my rain cover for the tent. I laid the bike on the picnic table and pulled off the rear time. When I pulled off the flat tire, I noticed the bonehead move I did yesterday. When I put on the spare, I didn\u0026rsquo;t wipe around the inside and check for rocks, etc. A small sharp rock had found it\u0026rsquo;s way in the tire and stayed in when I mounted the tire. I patched the tube and totally cleaned out the tire. I remounted the wheel and started packing things up. I heard the thunder coming and started packing faster. I got everything on the bike just before it really started to come down. I waited for a little while in the restroom, but the rain didn\u0026rsquo;t stop. I pulled out my rain gear and decided to go riding.\nWet tent. Warm Sleeping bag.\nBike in dry \u0026#39;front porch\u0026#39;\nCleaning rock out and patching tube.\nCampsite\nTire fixing\nMacro drops\nBugs\nStrange goo\nCompletely dirty rain fly\nTent Mascot\nDrying Fly\nI took selfies before they were a thing.\nAbout 1/4 of the way out of the park, I was hit with a flashing white light. It was Bob and Mary out for a walk and caught in the rain. They were under an information sign. We talked for a while and they told be that they too are heading for the motel in Elkhorn City, to wait out the rain and dry out gear.\nRock Slide\nFixed Rock Slide\nUnknown Soldier\nI headed out of the park and started into Elkhorn City. I wanted to get a picture of the Breaks park sign, but it was pouring. I also didn\u0026rsquo;t get a chance to get a picture of the state line sign. I rode up and down hills for a while, until I hit a rock slide. The rain had caused the rocks to drop in the road. After seeing a few cars almost hit them, I decided to clean the rocks off the road. Most were small rocks, under 60 pounds. There were two large ones (about 90 pounds) and one really large one (around 150 pounds). The last one I had to more roll than carry off the road. Proud of my work, I looked at my muddy gloves and started cleaning up in a little mud puddle. I couldn\u0026rsquo;t get them really clean, so I took them off for the rest of the ride to the motel. I passed the unknown soldier grave and stopped at the motel.\nBob and Mary making it in.\nDinner and Lodging for the Night\nMotel\nRestaurant\nRainy Clouds\nAfter checking in, I changed into dry clothes and headed over to the restaurant. I had a fish dinner with green beans, corn and coleslaw. Then I came back in the room and started working on my pictures. After a few hours of work, I have the first three days of pictures ready to put online. Hopefully I can get them uploaded to the website soon, but it depends on the cell signals around here.\nDrying Clothes\nComplex Fire Instructions\nFire Drill\nEditing Photos\nEvery rack is drying something\nI\u0026rsquo;ll see how much of this I can get online. Wish me luck and good cell signals.\nElkhorn City, KENTUCKY!\nMotel: 37 deg 18.246 min N, 82 deg 20.385 min W, elev 831 ft.\n","date":"6 June 2002","externalUrl":null,"permalink":"/blog/2002/06/06/day-18/","section":"Blogs","summary":"","title":"Day 18 - Breaks to Elkhorn City","type":"blog"},{"content":" I laid down on my Thermarest and sheet bag last night a little after 11:30. I was up just before 7 and started getting things together. I was the first one packed up and ready to go, which was a new thing with these early risers. I left just behind Bob and Mary. I was planning to do breakfast in Rosedale like them. Gerrúl and Meta had breakfast at the church hostel and we saw them ride by the gas station/grocery where we were eating.\nMy area from last night.\nGerrúl having breakfast as I left\nBob and Mary\nChurch in Daylight\nChurch Sign\nDead Snapping Turtle\nI saw my first turtle today. I guess I should explain something here. It is kind of a tradition for cycle tourists to rescue turtles across the road. We feel for them and their slow pace when surrounded by such fast vehicles. Others that I have run into were able to save a few. The first turtle I saw was a large snapper. It had a good 14\u0026quot; shell and was no longer in need of saving. Some car on I-19/I-80 into Rosedale had already flattened it. With a turtle that big, it must have been some kind of bump at 55+ mph.\nComing through Honaker, I decided that I wouldn\u0026rsquo;t mind a little more to eat. I had only snacked on some fig newtons and an apple juice for breakfast. I had a roast beef and cheddar. I was expecting cheddar cheese, but it was cheddar cheese sauce. All I have to say is Arby\u0026rsquo;s needs to learn from these folks how to make roast beef for sandwiches. None of this soy impregnated pressure cooked beef like loaf, it was thin sliced 100% American beef. It was really good.\nClimbing out of Honaker, I noticed Big A Mountain, with it\u0026rsquo;s many towers and antennas. I pulled over and checked my cell signal. 4 bars of analog will do nicely. There had been overcast all morning which has kept the temperature down to 72, which is great for 10 in the morning. I sat down and booted up my little laptop to fire off all the updates for my readers out there. (Psst. That\u0026rsquo;s you.) The sun had finished burning off the overcast and I put on some sunscreen before heading out.\nBreakfast\n44 miles to Breaks\nCheesy Roast Beef\nClose up of Bike\nNumber is going down.\nI stopped in a little shop just before Big A Mountain and filled up my water. I talked with the clerk there and she came out to see all the \u0026ldquo;features\u0026rdquo; of the bike. She told me about some of the local area and told me to have a good time. As with yesterday, I was offered many rides over the mountain. A couple people stopped during my 2 hour climb yesterday to ask if I wanted a ride up, and I was tempted. This mountain today wasn\u0026rsquo;t too bad and the more I get over the less I have to climb. It was a decent 7-800 feet climb to get over, then a long downhill into Council. I had to stop twice to get the rims cooled off on the way down. Both times the rims generated steam with the water from my bottles.\n76 Sign\nDownhills mean more climbing later...\nhigh speed wind blowing my mirror into my face...\nand more rim cooling.\nPretty road\nI headed through Council and hit a gas station in Davenport. I asked for the local restaurant and was directed another 1/2 mile up 80. That is where I have been typing this and enjoying the AC. It\u0026rsquo;s gonna be another cooker today. Looks like I have some miles ahead of decent rollers, so it shouldn\u0026rsquo;t be too bad. Well time to fill up my water bottles . I\u0026rsquo;ll get more in here tonight.\nTiny little restaurant\nHydrating and Typing in working AC\nSimple Menu\nThe ride was pretty nice into Haysi. No major climbs, but some decent rollers. The supermarket in Haysi is the best we have seen in days. I still had tuna and rice to use up, but got a snickers ice cream bar and some Gatorade. The day started out cool, but it got hot fast. At 4 PM, it was 94 degrees. There was a substantial climb up out of Haysi, then a fast downhill. Part way down the hill, by rear wheel started to shimmy like I broke a spoke. It was strange, because I didn\u0026rsquo;t feel the rim being out of true with the brakes. I pulled over to a shady area and unpacked all the stuff on the rear of my bike. I laid it over and pulled off the back wheel. The sidewall had partially failed making the tread of the tire at one location shift to the side.\nI initially thought that the damage was from some type of brake scrub, but the source of the failure was where the tire contacts the inner ridge of the rim. It looks like I didn\u0026rsquo;t stop and let my rims cool enough during the downhill, or the accumulated heat of the many downhills over the last few days gradually damaged the tire. I am glad I have been sticking to my policy of using the back brake more than the front.\nCritter trash protection\nLogging piles\nLogging truck\nMore 76 route signs\nHot rim caused tire separation\nTire and tube work.\nHardly warn tread, but this tire is dead.\nIf this sidewall totally blew out in the back, it would have been manageable. If it blew out on the front, it could have been ugly. I examined the front tire and it looks fine. I replaced the rear with my spare tire, and pumped it back up. I did not fully clean off the tube, as I will find out later tonight. I got the bike loaded back up and cleaned my hands the best I could.\nBack on the road, I had some other problems a little down the road. There was a front chain ring guard on my bike to keep it from damaging my tent when the bike was in the large vestibule. This guard was held in place by mounting it inside my bottom bracket cartridge bearing. As the paint wore off, the guard got loose. The guard kept falling around and rubbing on the chain, so I removed it. I shipped it home in one of the boxes I sent. There was still the mounting on the bike, as I didn\u0026rsquo;t have a crank and bottom bracket remover to get it removed. Now that you have the history, we can come back to real-time.\nI guess the mount rotated down and got caught on the chain. I was moving and adding power to the chain when it happened, so I was moving a good bit of chain. I wound up bending a bunch of stuff up front, including my derailleur cage and my jump stop. I stopped and loosened, tightened and manually bent parts. It looks like my front derailleur is working fine, so I guess I got everything back together good enough.\nEntry Sign for Breaks Park\nMill Rock Point Overlook\nAlmost there\nView from overlook\nView from overlook\nHike back up\nThere was a decent climb into Breaks Interstate Park. This park is located in both Virginia and Kentucky (that\u0026rsquo;s where the Interstate comes from in the name). I stopped at the overview and was able to walk down a bunch of stairs. My legs reminded me about their soreness. The overlook was cool. I climbed over the fence out on the rock for a better view. Looked like a pretty good 1000 feet drop, so I was careful. The pictures were better out past the fence.\nI reached the park entrance and noticed my rear tire felt strange. It was down to 40 psi. I pulled over and pumped it up, hoping that it would get me to the camp site. The campground was 1.3 miles into the park and up many hills. I got as far as the campground office, but had to walk the bike most of the way to the camp site. Looks like I get to change a tire tomorrow morning. (Remember about me not cleaning the tube well? This is what happens.)\nMy camp site was 3 away from the Holland couple and pretty soon, Bob and Mary walked up. They are in the other section of the campground. I setup my tent and took a shower. They were good showers. I cooked my rice and tuna. The rice was chicken and broccoli. When I ate it, the tuna fish seemed like chicken. I guess that is good.\nI called home and worked out more details about Dad and Bill coming up to meet me tomorrow night.\nGerrúl\u0026#39;s tools\nGerrúl\u0026#39;s tools\nGerrúl\u0026#39;s tools\nGerrúl\u0026#39;s tools\nGerrúl showed off some of the innovative handle sharing tools he had created. It is obvious that they have bicycle toured quite and bit and have heavily refined their process. It really makes sense as a way to shave off weight.\nI headed back to my campground and turned on the weather radio. I learned of storms coming in tonight, so I put on the rain cover for the tent. When I started to see lightning to the East, I packed everything up in the tent. The lightning didn\u0026rsquo;t come over camp, but we did get rain around 2:30 AM. I was under some tall trees, so I didn\u0026rsquo;t have to worry about high winds. I did have to worry about the rain taking a long time to end, thought.\nBreaks, VA\nTent Site: 37 deg 17.768 min N, 82 deg 18.100 min W, elev 1927 ft.\n","date":"5 June 2002","externalUrl":null,"permalink":"/blog/2002/06/05/day-17/","section":"Blogs","summary":"","title":"Day 17 - Rosedale to Breaks","type":"blog"},{"content":" Last night as I finished typing my daily entry, a couple came in late from the trail. Caesar and Maud, if I remember correctly. They have been hiking the AT really slow, starting in Maine around 11 months ago. They wanted to see the trail during all the seasons, and said that the winter in Pennsylvania wasn\u0026rsquo;t too bad. We talked quite a bit about bike touring and my recumbent setup. They want to get some recumbent trikes and bicycle tour around Cuba. I gave Caesar some web site addresses for learning more information about what he needs to proceed.\nI hope you are enjoying the tour reports, when they come in. It has been a struggle sometimes to get them typed up, when there is so much I could be doing. I didn\u0026rsquo;t get in the tent last night till after midnight, because I was catching up for all of you.\nI woke up around 7:45 and started packing up my stuff. Since the weather was nice, I was able to leave the tent well ventilated last night. This means that the rain fly had little, if any, condensation on the inside. The only part I had to dry out was the ground cloth bottom. It seems to always get moisture seeping up from the ground.\nCamping yard next to \u0026#39;The Place\u0026#39;\nFront of the Hostel\n\u0026#39;The Place\u0026#39; Sign\n\u0026#39;The Place\u0026#39; Sign\nVisitor Log\nWider View\nI headed towards the bike shop and picked up a can of Halt spray. I hope all I hear about the dogs in Kentucky isn\u0026rsquo;t true, but I don\u0026rsquo;t want to run out of this stuff. I left my junk sunscreen in \u0026ldquo;The Place\u0026rdquo; for some hiker to use if they want. I found some small tubes of the same sunscreen that has been working well for me in the local outfitters, except it is SPF 30 instead of SPF 48. Much better than nothing though. All my parts that are exposed are getting tanned well, so the SPF 48 isn\u0026rsquo;t a total requirement. By the way, if you want some really good sweat proof sunscreen, hook yourself up with some Coppertone Sport Ultra Sweatproof. It is in a blue bottle and has survived my serious volume of sweat up some of these hills. Can\u0026rsquo;t speak for it\u0026rsquo;s waterproofness while swimming, but I bet it does well.\nI have been hand washing laundry for all of the trip so far. It works for a few wearings, but then you need a real laundry. I hit the laundry mat that I passed coming in last night and started a load of wash. I headed across the street to get two chicken salad sandwiches on wheat and some chips. I went through and organized my bags, including change fishing. That is getting all the change that has found it\u0026rsquo;s way inside the various pockets of my rear \u0026ldquo;handlebar\u0026rdquo; bag and putting it all in one ziploc. I then through the load in the drier and started packing up to leave. A few hikers that I met last night at \u0026ldquo;The Place\u0026rdquo; were in to do a few loads. I packed up the dry laundry and got on the road a little after 11.\nLaundry Mat\nFresh drying clothes\nThere were some hills on the way to Meadowview, as I rode into and out of a few river valleys. By the time I got into Meadowview, it was seriously hot, getting hotter. My thermometer was indicating 105 degrees while I was riding over some newly laid really \u0026ldquo;black\u0026rdquo; top. I hit the diner in town to get out of the heat and get some water. The public works department had the great sense to work on the water main feeding the store during lunch hour, but luckily I got my one glass of ice water before the water quit. I had the lunch special of Meatloaf and two sides (green beans with corn and coleslaw). I ate slow and cooled down. A few of the locals were interested in my journey and we talked for a bit. By the time I was ready to leave, the water still wasn\u0026rsquo;t on. One if the patrons asked what direction I was heading and told me that there was a Grocery store out on 80 in about 3 miles. I headed out and stopped there.\nThe Little Diner (and Garage)\nSnavely Store\nI pulled into the grocery after riding past the crews fixing the water lines and a couple hills. I grabbed a Gatorade and sat down to look through some of the Arizona Highways sitting there. I read an interesting article about a guy\u0026rsquo;s ultralight type aircraft that he built for taking aerial photographs. He talked about the stability of the plane and how he flies with the stick hooked to his leg, as he uses both hands to shoot pictures. There were a few examples of his work and it was breathtaking. I can\u0026rsquo;t wait till I get out West and get some similar views. The bread man came around 2 PM. The bread guy was new and he ran his route a little different that the old one I guess. I didn\u0026rsquo;t see this as a big event. However, we revisited this at dinner.\nI left the lovely AC of the store and headed back into the heat. There was going to be a monster climb today, and I wanted to get started. I don\u0026rsquo;t climb real fast, so I need some time to get it over with. I had started listening to The Shipping News that I have on MP3 from the Indianapolis Libraries Books on CD collection. This looked like it might have been an interesting movie when the adds came out, but I haven\u0026rsquo;t seen it. The book is almost always supposed to be better. Listening to something makes the miles go by faster, when you aren\u0026rsquo;t in the mood to just think. (This is especially true during climbs, because all you are thinking is how steep, long, or hot it is\u0026hellip;)\nThe climb in question is 4 miles long with many switchbacks. The average grade is around 7%, or better than 1,500 foot climbing in 4 miles. It was really hard. I started up the climb at 2:30 and pulled over the top past 4:30. Unfortunately there weren\u0026rsquo;t any great views going up. All you could see were the trees lining the closest switchback. I walked about as much as I rode. Listening to the story unfold helped me pass the time, but I was constantly sweating the entire climb. I drank a great deal of water, but I am still dehydrated a little. I will be drinking water throughout the night to rehydrate.\nThe GPS doesn\u0026rsquo;t do mileage well with a non-straight path of travel. These switchback were anything but straight. I felt really beat up when I was at 3.1 miles up the climb and stopped for yet another rest. I wound up peaking at 3.2 miles on the GPS, but the others confirmed that the climb was 4 miles+. The top is at a county line and had a 76 bike route sign, not to mention the road seriously slanting away. I stopped the bike, gave a victory yell and walked back down the hill a ways for a picture.\nRiver flowing the wrong way means uphill\nFriendly Dog climbed with me\nTop of the hill!!!\nExample of switchback\nMotorcyle is much easier\nLooking where I climbed from\nI should mention the dog that climbed with me for a while. I\u0026rsquo;m not sure where he came from, but he was a friendly black Labrador. I met up with him at around 2 miles into the climb and he plodded along with my to the top. I tried to give him some water, but he didn\u0026rsquo;t like the whole shooting water near his head with my water bottles thing. I left him behind as I started down the hill, which was equally as steep and as switchbacked. I had to brake quite a bit because of bad sight lines and serious turns. I have learned the art of leaning way into the turns to keep the bike almost level. This reduces the chance of dragging bags in really fast corners. I have touched down a few times on each side, with minimal damage.\nThere was one serious switchback near the end of the hill where I had to really slow it down. I came to a full stop to shoot some water around my rims and was greeted with some instant steam. I\u0026rsquo;ve found the one disadvantage with my 20\u0026quot; rims. Although, I have stopped a few times on the descents and haven\u0026rsquo;t lost a tube to heat yet. One of the guys I\u0026rsquo;ve been camping with the last few days lost his front tube coming down off the Blue Ridge Parkway (which was a little steeper than today\u0026rsquo;s downhill.) He was going slow enough that he got it stopped ok, but admitted that it was pretty hairy for a little while.\nThere were a couple of decent climbs once the major decent stopped and my legs were not happy. They thought the 4 mile climb was a full days work and were not interested in any overtime. I pulled into the Elk Garden Methodist Church Hostel for the night. Under the picnic area were the two couples from the last few nights, but no Mike. He has to be finished by August 5th, so he probably did a couple more miles today. He was the first one out of \u0026ldquo;The Place\u0026rdquo; this morning.\nI got some water and started rehydrating. The supposed grocery before the hostel was no longer open. I was planning on digging into my reserves of another rice and tuna night, but was asked if I made it to the grocery. When I replied in the negative, I was told that they had food here. Like the Cookie Lady, it is covered by the donations of the cyclists. I asked if anyone had ate and none had. They had went to the store though. I noticed spaghetti and sauce in the available food, and suggested a pot of spaghetti.\nEveryone agreed and we started a large kind of potluck dinner. We had spaghetti, a salad (lettuce and corn with Thousand Island dressing), and some Vienna sausages for meatballs. it was great. We had a nice group dinner out at the picnic area using real plates and real silverware. Then we had some chocolate pudding for dessert. I was on the cooking crew, so I didn\u0026rsquo;t have to cleanup. I prefer cooking to the cleaning anyway.\nDuring the dinner conversation talk turned back to the store I stopped at, where the bread man showed up. (See, I told you I would come back to this.) Gerrúl and Meta had stopped there and wanted to get some bread. When he told me that they were unsuccessful in finding bread there, I told him that the bread guy had come at 2.\n\u0026ldquo;Two o\u0026rsquo;clock!\u0026rdquo; he said. \u0026ldquo;Two o\u0026rsquo;clock!\u0026rdquo;\nI wasn\u0026rsquo;t sure where he was going with it, maybe me getting there so late or something. He said that the store owner told them that it could come at any time and they waited a while for it. He was not happy with that much wasted time when the bread didn\u0026rsquo;t come for hours later.\nBob suggested that they could head back over there and pick some up now, but the look on his face suggested exectly what he thought of suggesting doing that climb again. Bread is only worth so much, I guess. :)\nI then got a chance to clean up in the bathroom. I filled the sink up with water and washed my shirt, then used it for a sponge bath. I also did the head dunk that I started in Troutville city park. You get the sink almost full of water then dunk your head in. You then let the water run and are able to clean the hair in the back too. It feels great. I then washed my shorts and socks and hung them up to dry.\nWe all sat around outside talking about various things. Bob (who I incorrectly labeled as John in earlier posts) works IT support for a large bank. We do some similar things and talked a bit about each others work. He has worked out a similar arrangement as I did for a leave of absence from work. I talked with Gerrúl about his work, before he retired. We got onto the subject of robotics and he explained how they used a robot to weld up 0.005 thick aluminum. It isn\u0026rsquo;t possible with a human hand. We are all three technical engineering types, which I found interesting. Adam and Mike were both in school for Computer Science degrees, so they both had talked with me previous nights about my job and the industry in general.\nWe continued talking out side and had tea and coffee. Then we started getting setup for bed. We are sleeping in the main room of the church. I\u0026rsquo;m setup just in front of the first set of pews. I headed outside to see if I could call home on that one bar of Analog cellular coverage that I had, but stopped short. I noticed 4 young raccoons walking across the yard. I went back inside and remembered that I was charging my batteries for my camera. I dug through my bag to get other batteries and quickly put them in and ran outside.\nIt was really dark and my flash isn\u0026rsquo;t too powerful. I took the first few, but wasn\u0026rsquo;t close enough to get any light for the picture. They started to the tree, and I was able to get some dark pictures. I was not quite ready to rush in close to them, because I didn\u0026rsquo;t see mommy around anywhere. I didn\u0026rsquo;t want her coming at me upset. Pretty soon I realized that there little whimpering cries were looking for mom. I wonder if she was taken by another animal or hit by a car or something.\nOrphan Raccoons\nOrphan Raccoons\nHiding in Tree\nHiding in Tree\nThen the friendly (to us) cocker spaniel came around the corner. He was looking to get some \u0026lsquo;coon. I scared the raccoons up the tree and the dog wasn\u0026rsquo;t able to initially get one. I was able to get some pictures of these guys now as I got in close. The dog was circling the tree and barking. This startled the raccoons even further and they started to climb higher. I heard a cry and a thump as one of the little guys fell out of the tree. The dog was on it real quick and was going for the kill. It looked like he died pretty quick, but the dog kept chewing on him to make sure for a few minutes. Pretty soon the \u0026lsquo;coons up in the tree quieted down and the dog didn\u0026rsquo;t focus much more on them. He sniffed around the tree a while then carried his kill back behind the house. I came back inside after neither party did anything else.\nDog pounces on fallen one\nMuch chewing\nThis guy was a goner\nThen I typed all this up. It\u0026rsquo;s now 11:30 and I need to get some sleep. It is amazing that these take an hour to get typed up. I know I will be glad to have them when I\u0026rsquo;m done with the trip and I hope you enjoy reading along (as soon as I get good enough cell coverage again to upload them!)\nRosedale, VA\nChurch Site: 36 deg 56.002 min N, 81 deg 57.944 min W, elev 2268 ft.\n","date":"4 June 2002","externalUrl":null,"permalink":"/blog/2002/06/04/day-16/","section":"Blogs","summary":"","title":"Day 16 - Damascus to Rosedale","type":"blog"},{"content":" I actually got up a little late at just before 8. There was heavy overcast, so I thought it was actually earlier, till I looked at a clock. I was kicking myself, because I just laid there for a while, when I could have been going. New rule, if there is light enough to see, get up. :)\nI went to the local Pharmacy for some sunscreen. I am getting low on my sunscreen and didn\u0026rsquo;t want to run out. I picked up the best they had to offer that was supposed to be waterproof and all that, but it is JUNK! It\u0026rsquo;s effectiveness goes away after an hour or two of my heavy sweat and it is useless. Hopefully I can pick up some decent stuff tomorrow morning.\nNow deserted home for last night.\nI\u0026#39;ve wanted a car ride a few times so far, but not like this.\nStop for Brunch\nDue to the shopping and such in the morning, I didn\u0026rsquo;t get out of Wytheville till after 10. I had a pretty decent climbing ride into Rural Retreat and stopped to get some food after 11. I had a grilled chicken sub and some water. There were more rolling hills later on that were far enough apart to make you work to climb up each one. By the time I got to Sugar Grove, I was worried about making my destination of Damascus. I was looking at the GPS and only seeing 25 or 30 miles of the almost 60 I wanted today. I had been climbing at 4-6 mph all day, it seemed like. Surely something would have to change to speed me up.\nAnother Church Sign\nStopped to take a closer look...\ndown the short grave path...\nto a pretty stream...\nGetting a cool drink is nice.\nThe change was the wrong direction. I climbed at 4 mph for over 4 miles, with 6 mph for 2 miles before that. When you add heat and direct sun to that, what you come up with isn\u0026rsquo;t fun. At this rate, I wouldn\u0026rsquo;t get to Damascus until way after dark, if my body held out. The book said that there was over 3000 climbing feet today, but I kept thinking I had done that much already. Hwy 16 finally turned southeast into Troutdale with a nice downhill. Of course, I had to sit for about 4 minutes waiting for the single lane road to get open. Some crews were cutting trees or something and a bicycle didn\u0026rsquo;t get important enough until 3 trucks showed up.\nAlong side the trail\nA trail head\nWeaver\u0026#39;s Grocery tried to make me not worry about hills.\nWeaver\u0026#39;s Exterior\nWeaver\u0026#39;s Sign\nThe ride out of Troutdale to Konnarock was flat to climbing, and my time worries continued. I stopped along a stream, because I thought I saw something. As I slowly got back to that spot on foot with my camera, the cotton mouth snake slid off it\u0026rsquo;s rock into the current. It was cool to see how he drifted down stream until he hit some rocks, then supported himself against the current as he raised his head out. I was able to get a few pictures of him with his head poking out of the water.\nCottonmouth in Stream\nNon-Digital Zoom of Cottonmouth\nI pulled into Konnarock at around 6. I figured the worst case was getting into Damascus after dark, using my headlights, so I kept on. I really wanted to stay a night at \u0026ldquo;The Place\u0026rdquo;, a hostel run by the Damascus United Methodist Church. Damascus is a town in a unique location. It is where the Trans-American trail crossed the Appalachian Trail (among others). People say you can usually find an interesting mix of people to talk to.\nHeading out of Konnarock, I started up some seriously switchbacked climbs. The climbs weren\u0026rsquo;t terribly steep, as I was able to push my 4th gear from the lowest this late in the day. There were very little sight lines, however. I rode most of the time in my rear view mirror ready to get off the road if someone was taking the roads way too fast behind me. The traffic was light and I didn\u0026rsquo;t have any problems.\nI had climbed to the highest point on the trail so far, a little before I dropped into Troutdale, at 3,700 feet. (Considering my \u0026lt; 2,300 ft elevation last night, you can see that I was telling the truth about climbing for literally hours.)\nAfter some more climbing, I finally hit the downhill into Damascus. This was better than a shower after a long sweaty ride. OK, not better but almost as good as a shower. There were some more serious switchbacks, and I had to hit the brakes quite a bit. I wish the downhill was a little less steep, so I could enjoy the scenery. There was a swift moving little stream next to the road, almost the entire way down. After turning a corner I heard some waterfalls, so I stopped the bike as fast as I could and grabbed the camera. I had to walk about 100 feet back up the hill, but got some pictures of the many waterfalls. It was a great way to end the day.\nI pulled into Damascus and headed to \u0026ldquo;The Place\u0026rdquo;. I was greeted with all the crew from last night\u0026rsquo;s camping group. All who had left before me and all who probably rode faster than me on the climbs. I\u0026rsquo;m the turtle in that old \u0026ldquo;Turtle and the Hare\u0026rdquo;. Except I\u0026rsquo;m not hoping to win, just finish in the time I have. : )\nWaterfall\nWaterfall\nFinally downhill\nStreams going the right way\nMy moving time on the bike for today is 6 hours and 40 minutes, with an 8.7 mph average. That is much better than I expected. It took over 9 and 1/2 hours between start and stop today. So far this is my longest day with just under 60 miles and over 3000 feet climbing.\nI have some serious climbing to do tomorrow, in and out of many river valleys. If all goes well during the next two days, I will be at the Kentucky border on Wednesday night. After all that climbing today, I\u0026rsquo;m over 300 feet lower than last night. I guess that is progress for you. I no longer was excited about that long downhill into town.\nI had two horn uses today. Both were people who came right up behind me, and waited patiently for the traffic to pass, then held down their horn for several seconds before pulling up next to me to add on a snide comment. I didn\u0026rsquo;t hear either of them, because they were drowned out with my 120 decibel air horn. Then I always smile and wave, like I assume it is some back country greeting. I always love when I time it right so the sound starts just when the passenger is opening his mouth to yell whatever they are going to yell. The way their eyes bug out a little from surprise is kinda cool. Just trying to greet you in the language you know.\nHow many cyclist does it take joke in the making.\nI also had a few dog races. One was during a section of downhill and the little dog really couldn\u0026rsquo;t keep up. I actually used the brakes a few times to make it sporting. Another time also on a downhill, the dog came almost next to me but was running along the ditch. His eyes were on me until he hit the high grass at the end of his yard and he went from 25 to 0 in a few seconds. The other dogs I ran into when not able to out run them were taken care of with a stern \u0026ldquo;Home\u0026rdquo; or \u0026ldquo;No\u0026rdquo;, while pointing to their home. Many, God bless their owners, had fully fenced in yards.\nDamascus, VA\nTent Site: 36 deg 38.023 min N, 81 deg 47.240 min W, elev 1930 ft.\n","date":"3 June 2002","externalUrl":null,"permalink":"/blog/2002/06/03/day-15/","section":"Blogs","summary":"","title":"Day 15 - Wytheville to Damascus","type":"blog"},{"content":" We didn\u0026rsquo;t have any problems last night. There was only minimal traffic past, so I got a decent nights sleep. We both got up just before 6 AM, and started packing up. Adam is going to try for 65+ miles today, to see if he can make it to the coast before school starts. We said our goodbyes and I finished packing my stuff up. I got out of there at 6:30, about 10 minutes behind Adam. I had told him to remember that it was Sunday, because many small mom and pop groceries might not be open.\nAdam heading out solo\nAnd pulling away\nI was on a mission, in search of a bathroom. I found one in Draper, about 8 miles out. I grabbed a Strawberry Ice Gatorade (good stuff!) and some breakfast snacks. For some reason, the smell from grilling bacon and ham was getting me sick, so I headed out to the front porch to eat breakfast. I talked with the local farming crew as they stopped in for some breakfast before church.\nWhen the talk turned to my trip, one of the guys told me that \u0026ldquo;You all (Trans-Am cyclists) have more guts than me!\u0026rdquo;\nThe other one agreed with a \u0026ldquo;Heck, Henry and Me couldn\u0026rsquo;t even WALK a mile.\u0026rdquo;\nFound a restroom\nAnd found breakfast\nI climbed quite a few pretty good hills out of Draper and stopped to give my parents a call. This gave me another chance to rest. I finished the climb up to I-81 and crossed over to the north side of the Interstate. I wasn\u0026rsquo;t really happy with the noise pollution, but didn\u0026rsquo;t mind it when I came across the truck stop. I went in wondering if there were showers. Yep, looked good. $4 gets you soap, a clean towel, a wash cloth and access to the showers. Count me in. Amazing what a shower does to you. I washed my clothes and changed into some cleaner clothes and sat down for a while. The heat was really coming on and the few minutes in the AC were great.\nI-81, loud even on a Sunday\nStill going the right way\nA new county. Can\u0026#39;t wait for a new state too!\nGreat way to spend $4\nJoe cleaning station\nThe traffic was friendlier than normal, which I guess is people\u0026rsquo;s Sunday conscience taking over their road rage. Seems like it isn\u0026rsquo;t right to drive mean and aggressive on your way to church. Apparently, those pulling boats to go fishing get to drive that way though.\nI got to Hwy 121 at 12:30, and decided to stop at a McDonalds. Not the best choice, but it looks like the only sure place for food and getting out of the heat for the next 12 miles into Wytheville. I had a grilled chicken sandwich and some Hi-C orange drink. They were able to plug in my extension cord, so I could charge my cell phone and my laptop. Might as well use the AC power if it\u0026rsquo;s there. I was able to catch up many day\u0026rsquo;s journals as I wait for my food to digest and the hot part of the day to get more over with.\nThe climb away from the McDonalds and I-81 was brutal. I was plodding along at 3.5 mph in direct sun with no shade and little wind. The rolling hills for most of the day were too far apart to use any of the energy from going down to get back up. The 10 mph headwind also helped loose whatever kinetic energy you had going down, before starting up. Having the wind helped a little with the heat. The wind quit for a while and I got really hot. My thermometer was stuck on 95 degrees for most of the afternoon. I finally laid under a shade tree to rest a while. I loaded up a sermon on my MP3 player, for my own little church service.\nGerrúl and Meta den Heÿer from Holland\nAbout 45 minutes later, I thought I heard voices. I turned to look and saw a couple on loaded touring bicycles. They were Gerrúl and Meta den Heÿer, from Holland, who were planning on camping at the city park in Wytheville. I had hoped to go a little farther for the day and I told them that I might see them there, but I wasn\u0026rsquo;t sure. Gerrúl asked me to lay back down, so they could have a picture like they found me. He said he wanted to be able to show people that it was really 95 degrees. (Actually he said something like 35 degrees, but I\u0026rsquo;m really good with all SI units, except temperature.)\nWythe County Poorhouse Farm\nWythe County Poorhouse Farm Sign\nPanorama from today\nThunderstorms started to build again and I got a little wet during the miles into Wytheville. It felt really good, but it was almost too light of a sprinkling to cool down much. As I was getting into Wytheville, I saw John and Mary coming up behind me. They had been traveling with the Holland couple and were debating a nice looking Super 8 Motel. I had decided that there really wasn\u0026rsquo;t anything decent for the night for atleast 15 miles and quite a few climbs, so I was going to stay at the city park.\nWhen I reached 4th Street, John and Mary caught up with me and we located the park. It is a nice place with trees around and a small stream flowing through the center. When we got here, there was a birthday party in full swing. I started my cook stove and got some rice going. Rice and tuna was the menu for tonight. As I finished cooking, someone from the party started offering leftover food. I guess I cooked a little too early. By the looks of things, my stomach will thank me for the less complex meal tomorrow.\nJohn and Mary setting up camp\nGerrúl and Meta setting up camp\nMy home for the night, with the rain fly over the bike.\nInto \u0026#39;civilian\u0026#39; clothes\nDoing some laundry\nI was planning on another night on a picnic table, without bothering to set up the tent. However, the sky started threatening rain and the roofs on the picnic areas are high. As I was getting in the tent to type this up, it started to sprinkle a little. I guess setting up the tent was worth it. My rain fly has a front area covered past the tent, that allows me to keep the bike mostly dry.\nGerrúl brought along a harmonica and a recorder. He was playing some little jigs earlier that were really kind of nice. I told him the only instrument I\u0026rsquo;m decent on is the guitar and its too big to carry. I was greeted with a snicker and a nod.\nI\u0026rsquo;m hoping to make it to Damascus tomorrow, which will be a hard ride. I would like to be at the Kentucky/Virginia border in three days. We will see how it goes. Things would be much easier if it wasn\u0026rsquo;t above 90 degrees between 11 AM and 4 PM.\nAfter our three tents were up, we were greeted by Mike. He is doing the Trans-Am solo and sleeping in a pretty cool tent he designed himself for hiking. It is kind of a rain shield over a netting bag.\nWytheville, VA\nTent Site: 36 deg 56.839 min N, 81 deg 04.940 min W, elev 2297 ft.\n","date":"2 June 2002","externalUrl":null,"permalink":"/blog/2002/06/02/day-14/","section":"Blogs","summary":"","title":"Day 14 - Newbern to Wytheville","type":"blog"},{"content":" We both woke up early, but slept in. It is hard to leave a cold, paid for motel room. We managed to get packed up and out by 10:30. The climb up into town was moderate, but much better than climbing Danger Hill. We were heading out of Christiansburg before noon.\nWe had thought that we left the 666 road back behind us, but that wasn\u0026rsquo;t so. We rode along 666 (Mud Pike Rd) for most of the way into Radford. About halfway into Radford, we stopped for lunch.\nNot sure why I took this. Um. Enjoy. :)\nRoad to hell?\nSure is hot enough lately for this to make sense\nThere was a little store with a grill. I had a hamburger \u0026ldquo;all the way\u0026rdquo; and some potato wedges. Adam had a cheese burger \u0026ldquo;all the way\u0026rdquo; and a hot dog (which came with chili.) If you are wondering about the \u0026ldquo;all the way\u0026rdquo;, we were too. I stifled my desire to say, \u0026ldquo;all the way to where\u0026rdquo; and just said \u0026ldquo;Ok.\u0026rdquo; So did Adam. I guess that is how you say \u0026ldquo;with everything\u0026rdquo; around here. I don\u0026rsquo;t think Adam realized that the hot dog came with chili, when he unwrapped it and said, \u0026ldquo;Well, here is one Pepcid AC gone.\u0026rdquo; (He had bought a pack of 6 to split in Troutville.)\nLunch stop\nLunch menu\nOh, I forgot to mention a big milestone. When we reached Christiansburg yesterday, we had fully completed section 12 of the route. Woo Hoo! We are now on section 11, map 138. 1 out of 12 sections and 11 out of 150 maps down.\nWe crossed the New River in Radford and then rode along with it for a few miles. Apparently the New River is the second-oldest river in the world and one of only a few that flows from south to north. How they know it is the second oldest, I have no clue. I\u0026rsquo;m guessing that those big satellite photographs from way back when only showed one river, then another showed up. They all said, \u0026ldquo;Wow, another river. This one is New, so lets call it New River.\u0026rdquo; Then they wrote down that this \u0026ldquo;New River\u0026rdquo; was the second river in the world. Otherwise, wouldn\u0026rsquo;t you call it \u0026ldquo;2nd Oldest River\u0026rdquo;? Calling it \u0026ldquo;New River\u0026rdquo; is really kind of mean, like calling the fat kid \u0026ldquo;slim\u0026rdquo;. I wish people would have more respect for the rivers.\nDonna\u0026rsquo;s book has a few paragraphs about the New River Trail State Park. This is Virginia\u0026rsquo;s only linear park. Being from Indiana and visiting Ohio, both of which have rail-to-trails, I see nothing interesting about this. It would be a pleasant ride, but somehow I don\u0026rsquo;t understand her suggesting that you pedal this trail if you want a break. I can see suggesting that you go canoeing or something for a break, but pedaling as a break from a bicycle tour is a little strange.\nAfter stopping for lunch, the sky had started to get overcast. I mentioned to Adam that this was probably the start of the line of storms we saw on the Weather Channel the night before. About half way to Newbern, the clouds started to get really bad looking behind us. I pulled over and told Adam that we needed to get things buttoned up. I put the rain cover over my rear \u0026ldquo;handlebar bag\u0026rdquo; and made sure my rain gear was ready. While he was finishing, I told him that I was going to ride ahead and look for a place to wait it out. I told him that we probably had 5 minutes before we started getting wet.\nAdam\u0026#39;s opinion of my car port idea\nSuited up an ready to ride in light rain\nWell, I needed a shower\nHe caught up with me in 3 minutes and the first sprinkles had started. I saw a lady getting out of her car and asked if we could use her car port for a few minutes. She said that it would be fine and we moved under there. The rain started pretty light, but quickly built, as did the lightning and thunder. Adam told me that he was glad that I asked to use this and I agreed. I was planning on knocking on the door to ask, if I hadn\u0026rsquo;t seen the lady going inside. The winds stated picking up and we were still getting wet inside the car port, so we both put on our rain gear. I managed to get it on a little quicker and didn\u0026rsquo;t get as wet. After the gust front finished coming through, it rained pretty hard for over a half hour. I pulled off my rear buckets so we could sit down. There were some really close lightning strikes (less than 1/4 second sound delay) and many under 3 seconds.\nJust as the rain finished and we were about to pull out on the road, another Trans-Am cyclist came up the road. He was traveling really light, probably mostly staying in hotels with only clothes and some emergency shelter. He had been doing 100 mile days, which is something even considering his light load. I asked if he had pulled over anywhere for the rain and he said that he had just rode through it and it was scary. Umm, yeah. It was bad weather under a car port. I guess he was trying to push towards a motel in Wytheville, originally our destination for today. We told him to enjoy his trip, as we wouldn\u0026rsquo;t be seeing him again (unless I bought a car).\nI put away my rain pants and jacket, then we started towards Newbern. We gradually rode back into the back end of the storms and I had to get my jacket back on. In Newbern, I was riding along and making mental notes of the places I could turn back to if it got bad again. We were heading out of Newbern, when the weather started coming again. We rode on for a little bit and saw a picnic shelter at a local church. We pulled inside and another bit of decent rain came down. Since we were under a cell tower (being right next to I-81), I pulled out my computer and cell phone. I showed Adam the animated radar for our area and we looked at our options. Waiting out the heavy rains had cut down our travel time. The only know place to stay before Wytheville (which would be hard to make today) was Draper. That was a free camping location, behind a store. We thought that the 8 miles gained would be quickly lost by packing up the wet tents. We were going to catch the edge of this storm front for a few hours, so we decided to stay at the picnic shelter.\nDinner time\nGreat sunset\nWe have tried to find someone associated with the church to see if it is OK, but have been unsuccessful. Hopefully it will be fine and we will leave a little something for the lodging in the morning. Service starts a 9:45 AM and we should be on the road by 7 AM at the latest. We headed down the street a 1/2 mile and ate at Shoneys. I was planning on cooking, but the outside tap of the church is not on. I wouldn\u0026rsquo;t have a place to easily clean up the dishes, and we had a few hours to kill. It was a good choice Since this is probably the last night I\u0026rsquo;ll be riding with Adam, I treated him to dinner.\nI should mention a little about that. Adam called home to find out when school started and it is mid-August. He had set his schedule around someone that pushed out the Trans-Am like our 100 mile guy. He is starting to realize that if he doesn\u0026rsquo;t push and average of 67 miles per day, he won\u0026rsquo;t get done. That is also without rest days. It will be really hard to make that happen, but more power too him if he can pull it off. I also showed him the Western Express route, which goes out to California from Pueblo, CO.\nOur (mostly dry) home for the night\nAdam looking at route for tommorrow\nI cuts 500 miles off the trip, but you get some tough roads and long distances between services.\nThe sunset was great tonight. We are finally staying at a place that has some type of horizon. Hopefully we won\u0026rsquo;t run into any problems sleeping here for the night. If anything interesting happens, you\u0026rsquo;ll get to hear about it.\nNewbern, VA\nTent Site: 37 deg 04.273 min N, 80 deg 41.811 min W, elev 2039 ft.\n","date":"1 June 2002","externalUrl":null,"permalink":"/blog/2002/06/01/day-13/","section":"Blogs","summary":"","title":"Day 13 - Christiansburg, VA to Newbern, VA","type":"blog"},{"content":" The alarm went off at 5:45 and we started getting things together. After looking at the route last night, we knew that today was going to be hard.\nWe rolled out of Troutville at 6:30 and Adam started in the wrong direction. I agreed with him, because my GPS was set to inside mode (GPS radio off) and was pointing west. We figured out our mistake in a half mile and turned around. Total mileage: 1 mile. Total progress: 0. So we started again at about 6:40.\nThe ride immediately greeted us with some difficult climbs and we were glad to have the cold temperatures of early morning. We stopped at a grocery store, just before turning Southwest. I had an egg salad sandwich and some Gatorade. Many people describe different things about the road to hell. We found it at that grocery store. By that I mean the country road 666 veered off to the right. We went to the left, but it wasn\u0026rsquo;t the last time we would meet CR-666\u0026hellip;\nRiding into Devil\u0026#39;s Country, I guess\nBeatiful scenery this morning\nAnd nice empty roads\nWe pulled into Catawba a little before 11, with about 18 miles under our belt. There we got the usual temperature reducing items: I had a cherry Popsicle and Adam had an ice cream Snickers. We also had them make roast beef sandwiches for each of us. One thing that has been interesting is the degree of similarity between what Adam and I are used to eating. He worked at Great Harvest back home, so he also enjoys a good whole wheat bread, rather than white bread packing material.\nWe had planned on riding till noon and stopping to eat, but we stopped around 11:20 in a nice shady area. Then we laid down for a little nap. It wasn\u0026rsquo;t the most comfortable, but it really helped get our legs refreshed after 20+ miles of some tough hills. We got back on the road at noon.\nThe road was a great deal of rolling hills that we could push through with kinetic energy, but not all. Some you just grind up a 3.5 mph. At least I do, Adam hits them faster and then catches his breath at the top. I\u0026rsquo;m more of the persuasion to ride my \u0026ldquo;all day\u0026rdquo; speed and take my time. We are riding good together. Adam pushes me on the more hilly area, and I push him in the rolling hills. We couldn\u0026rsquo;t have done these last two days as well, without both the challenges and emotional support we give each other. When you push for all you have to get to the top and turn the corner to find a longer and steeper hill, it really hurts your spirit. We will beat Virginia. It won\u0026rsquo;t best us. It doesn\u0026rsquo;t have a hill that we can\u0026rsquo;t handle. You just have to push through the pain.\nTook a photo of each of us next to this.\nInteresting mountain windmill\nLunch Stop\nThe 40 miles up to Ellett were tough, but we beat them. I was hoping that the worst was over, because my legs felt like they were reaching their limit. I walked quite a few hills today. I have no pride about hills I don\u0026rsquo;t ride. I know if I tried to force up all them hills, my legs would be totally finished much earlier. Anytime it is getting painful on a hill, I\u0026rsquo;ll walk the bad 100 feet or so. However, this started to become a theme later in the day.\nAfter Ellett, we started to really climb. That wasn\u0026rsquo;t the bad part, but most hills were hiding behind turns. You get almost up the hill and take a turn, then find a steeper and longer hill. 723 was a terrible road for riding. There were so many switchbacks for climbing, that the traffic didn\u0026rsquo;t have good sight lines. Intelligent drivers would actually drive a speed where they could stop in time if something, such as a rock slide, might force them to crash. Of course that never happens, because the drivers are to ignorant to realize that driving faster than you can see is pretty stupid. As is passing us on blind hills only to swerve back into our path when the inevitable car comes. Morons!\nThe traffic was bad, but on the bright side the climbing never stopped. We climbed around 1000 feet into Christiansburg. Each time I though I was finished, the climbing just got steeper. Adam was doing better than I was, so he would get to the top of the climb first. I would catch up and see the next hill and we would shake our heads. When the hills got just ridiculously steep, I started walking. I didn\u0026rsquo;t think that I would make it into town for a while. I was starting to hit the wall.\nOnce we climbed up to cross under 460, it became do-able. I had called the Super 8 and worked out a Trans-Am cyclist rate of $42. When split between us both, it was a great deal. We camped for free last night at the city park and will probably do so again tomorrow. This makes the occasional motel a great option. It makes the long day seem so much nicer.\nWe rode past the infamous \u0026ldquo;Danger Hill\u0026rdquo;, where Depot St turns right onto E. Main St. For some reason the route planners thought it would be a \u0026ldquo;fun\u0026rdquo; way through town (it is no longer on the Trans-Am route). Adam and I stopped at the bottom for a few pictures, but I was satisfied to ride 111 down to 11 and on to our hotel room.\nNext thing I know, I heard a rebel yell, than saw Adam climbing up it. I ran to get the digital camera, because I thought he would like to have pictures. This hill is the steepest climb on the route. I see him struggling and then he stops. The grade goes from crazy steep to insanely steep for the last 100 feet or so. He later told me that his brakes wouldn\u0026rsquo;t keep the bike from going backwards when he stopped. After reaching the top, he came back down. If he would have told me he was climbing, I would have told him to run down 11 and meet me at the motel. He\u0026rsquo;s just a little crazy. I guess we both are.\nPedalling up Danger Hill\nWalking up Danger Hill\nMore Walking up Danger Hill\nResting at the top of Danger Hill\nStart of the speed run\nFastest Adam rode today\nHe was very proud. :)\nThis trip seemed cool and a great thing to do, but both of us didn\u0026rsquo;t understand exactly what we were getting into. It is a huge amount of work riding day after day and climbing all these hills. I think we are both a little nuts.\nWe had to ride down under I-81 to get to the motel. It was 1/2 mile past a Cracker Barrel, so we found our location for dinner. After checking in, we loaded our bikes in the room. Actually the first thing we did was turn on the AC to full. That is standard operating procedure. Then I laid down for a few minutes to try and cool off. I also needed to rehydrate. I was sweating so much during the last bit that my stomach couldn\u0026rsquo;t get enough water digested to replace it.\nAdam jumped in the shower first, then I cleaned up. There is something about a shower after a hard day that is impossible to put into words. It is like you are wiping all the days effort down the drain. We headed over to Cracker Barrel before 6 and both had the Friday Fish Fry. We both ordered extra vegetables on the side and it turned out to be enough food. Now a couple hours later, I\u0026rsquo;m chewing on some Fig Newtons to cure that later night hunger. Ah, the joys of burning many, many thousands of calories per day.\nDinner\nI forgot to mention the horn today. I had to use it twice. First was just before getting to the grocery stop in the morning. A truck came behind us with no one in the other lane. Why can\u0026rsquo;t you just get over and be on with your day? Is it such a trouble to get slowed down 5 seconds? Anyhow, this truck gives me a long, short, short horn blast and comes around to yell something at us. He gets a 120 decibel air horn long, short, short reply. Didn\u0026rsquo;t hear the thing they were going to yell, but instead of buzzing us, we scared them out into a safe distance away from us. Adam was loving the horn. It is really the only great response to an ignorant, malicious horn honker. The other was the typical hold down the horn passer. In both cases, my horn won by better than 30 decibels. :)\nI fell asleep hurting. It was a long day, but satisfying.\nChristiansburg, VA\nMotel Site: 37 deg 08.340 min N, 80 deg 20.927 min W, elev 2213 ft.\n","date":"31 May 2002","externalUrl":null,"permalink":"/blog/2002/05/31/day-12/","section":"Blogs","summary":"","title":"Day 12 - Troutville, VA to Christiansburg, VA","type":"blog"},{"content":" Adam and I both woke up a few times and went back to sleep. We finally started getting up around 8:45. We grabbed our things and got out of the motel room at check-out time (11 AM). As the trash can indicates, we might have over done it a little, staying right next to a Wal-Mart.\nWalMart Triggered Glutonny\nParked outside the Post Office\nLexington\u0026#39;s Post Office\nWe carried out our bikes empty, then loaded everything on to them in the parking lot before starting back into town. We made it to the Post Office and began packaging our less needed things. As time goes on, you find that the weight up the hills doesn\u0026rsquo;t pay for the convenience of some items. Adam shipped a package back home to Omaha and I sent one to Jeffersonville.\nAround 1 PM, we left the Post Office on our way out of town.\nWe decided to take Hwy 11 to Natural Bridge, so we didn\u0026rsquo;t have to back track to see it. We had assumed that there would be a free exhibit, being that it is touted as a national marvel. We stopped at a fruit stand/store to take a break. The owner warned us that Natural Bridge was a tourist trap.\nIt was a tough ride to the Visitor\u0026rsquo;s Center, where we found that we could see the Natural Bridge for $10. We both thought that we could just swing by and see it. That will be one thing that we will miss on our trip. We saw another black snake, dead by the side of the road. According to the locals, black snakes are great. They eat copper heads and keep that population in check.\nPurchased some Fruit and Read many T-Shirts\nThis one felt appropriate.\nOverpriced Tourist Attraction\nI almost ran over one of these on a downhill\nMy camp stove is now full\nGas station break\nThe climb out of Natural Bridge was tough. You have to take Hwy 11 out of town and we had thought about taking it all the way to Troutville, our destination for the night. After the 2 miles, we decided to climb the extra hills, that traffic was just bad.\nWe were both glad with this decision after the beautiful scenery started. We were climbing, but it was a nice slow uphill for the most part. Of course, these were be punctuated with the occasional serious uphill. We took a break at a gas station with a little picnic area. I purchased $0.16 worth of gas purchase to fill up my camp stove. The smallest gas station purchase of my life.\nHanded Adam my Camera\nAnother Adam shot\nAfter a fast, but tough ride with a few hard hills, we made it into Buchanan for dinner at the Main Street Diner. Located not surprisingly on Main Street.\nToday\u0026rsquo;s ride contained many tough climbs. The route turned into some serious rolling hills, which you could climb with momentum, if you worked at it. This meant riding fast and pushing a little. It was interesting to follow the stream and rail road tracks, but it was the first time that we rode along a stream of any distance with the water flowing opposite of our direction of travel. Breaking the law of gravity takes energy.\nThe first picture below shows the after effect of my first heart stopping scare on the trip. I was riding along and suddenly something was chasing me behind making a terrible noise. I had no idea what it was. I saw nothing in my mirror and glanced back. Then I started laughing loudly. Adam stopped to see what was up as I was unhooking a huge branch from the side pocket of my panniers. The little piece of wood made a tremendous sound along the road. Heart back in chest, we continued on.\nWhen the branch hooked me, it sounded like something big was chasing me.\nTroutville was a satisfying end to the day. We rode over 45 miles and a over 2000 feet vertical. From leaving town at 1 PM. It was a hard day. This heat is a killer. Since we talked about stopping in Troutville, I hoped that the park had a picnic shelter. This allows you to roll out our sleeping pads and bags on the picnic tables and break camp fast in the morning. It turned out that we were able to do just that. The city park was really amazing, for a city that small. There is tennis, basketball, horse shoes, a running/walking track, and some seriously cool playground equipment (says the small child in me).\nWe arrived just after 7, so we went to the local store before it closed at 8. We picked up some heartburn medicine, as that has been a problem with both of us a few days so far. We are starting to figure out what to eat, but still learning. Drinking Gatorade or similar sugary energy drink without some fat or protein makes me digest it too fast and causes bad heartburn. Going to Wal-Mart yesterday was like a kid in the candy store. We both had bad gas all day for all the dairy products we decided to get. One of us would drop back to, umm, get rid of some up it, and then catch up using the added propulsion. It is really good that we are riding bicycles all day, and not working in close quarters.\nAt the store, we purchased some watermelon, Fig Newtons and bananas. I didn\u0026rsquo;t eat that much, as it seems like my body is working a little more efficiently. I haven\u0026rsquo;t been as hungry as the first few days.\nHome for the night\nWith power, so I stayed up typing.\nAdam asleep already as I\u0026#39;m about to turn in.\nSince the shelter had power, I was able to use my laptop quite a bit. My automatic email system had stopped deleting messages I sent it after processing. This caused emails to go out every couple hours. I deleted all the extra entries in the archive and typed up and sent Day 10, then turned off the email functionality. All this automatic stuff is cool, when it works. I had to update static web pages, instead of the automatic system for the rest of the tour. I don\u0026rsquo;t have time to deal with it right now and writing code and testing it over a slow analog cellular modem on an old Toshiba Libretto would be painful.\nWe got setup for bed and packed up everything for leaving early tomorrow. A finally got in the sleeping bag after 10:30. I must have slept only 30 minutes when the volunteer fire department alarm went off. The best I can figure is that this signal calls the people to the fire department. The reason I think this is that a few minutes later, just as I was falling back asleep, the sirens from the truck and ambulance started up as the vehicles went out. I almost got back to sleep when the train came through, 200 feet behind the park, with it\u0026rsquo;s whistle and rumbling diesel. The last time I looked at the clock was almost 1 AM. I finally got to sleep then.\nTroutville, VA\nTent Site: 37 deg 24.976 min N, 79 deg 52.537 min W, elev 1373 ft.\n","date":"30 May 2002","externalUrl":null,"permalink":"/blog/2002/05/30/day-11/","section":"Blogs","summary":"","title":"Day 11 - Lexington to Troutville, VA","type":"blog"},{"content":" I had gotten up and to on the rain fly, because the water in the stream and the trees blowing both sounded like rain at times. This gave me some comfort to sleep more soundly, but I still slept in a little. I started pedalling up and out of the Tye River Gap Campground just past 11 AM.\nNotice the Rain Fly?\nI got up and put it on.\nSaw this guy while packing up.\nIt took me quite a while to get down to Vesuvius. I had only filled two water bottles, because I figured that I wouldn\u0026rsquo;t need that much water on a long decent. I was wrong about that. With my braking on a 20\u0026quot; wheel, my rims got HOT. I used the rear as a drag brake until it started fading and then stopped with the front. A couple times, when I squirted water on the rear, I made a decent amount of steam.\nI rolled into Vesuvius right at noon, timed perfect to pass the church as the noon bell songs started. The beautiful music played for a minute or two, echoing through the mountains. Along the trip there are many \u0026ldquo;Wow!\u0026rdquo; moments. This certainly is one of them.\nLong, steep downhill\nAnother long steep downhill\nAnd finally flat.\nAt the bottom of the hill was the post office. I sent off a post card to my parents, with little on it. Most updates that needed to be sent were emailed. I just had to get a piece of mail with Vesuvius on it.\nI left the route to the north, towards Steeles Tavern, for about half a mile to get a sandwich and stock up on my food. I found Gertie\u0026rsquo;s Country Store and ordered a cheese burger. I was in time to meet with the local lunch crew and we talked for a while. They surmised that I was crazy too. I\u0026rsquo;m starting to agree with these people. After I finished the sandwich, I lathered on sun screen and started back to Vesuvius to pick up the trail. The best part was the front license plate: \u0026ldquo;Welcome to the South, Now Go Home!\u0026rdquo;\nCloser than my intended stop\nGood food and good company\nMy favorite license plate on the trip so far\nAbout a mile out of town, I saw a yellow flag flapping ahead. I wondered if it was Adam, so I gradually poured on some steam and caught up with him. Sure enough. He got his wheel fixed Monday, about halfway down the Blue Ridge Parkway yesterday, and was shooting for Lexington today. He was glad to run into me for moral support. He wanted to have his wheel gone over at the bike shop in Lexington, and we discussed sharing a cheap hotel.\nIt was not open. But still in good spirits\nMeandering stream = no hills\nWaterfalls = more work climbing\nWe climbed a little getting out of Vesuvius, then ran with the stream for about 10 miles. That was great. My legs took a beating on the Parkway, and it was nice to have a gentle rolling ride with beautiful vistas. We really started climbing into Lexington. I was hoping to stop at Natural Bridge or Buchanan by today, but like the idea of hooking up with Adam for a few days. We hit the bike shop in Lexington and dropped off his bike to get service. There was supposed to be a Thrifty Inn at the end of 11, going out of town. I rode up to where it should be and found a Lexington Lodge that will be re-opened in a couple months. Not good. I noticed a travel agency coming back, and I asked about local hotels. She was able to book us a room at Super 8 for $62 with tax. Not bad for $31 each.\nAdam hadn\u0026rsquo;t seen the new Star Wars, so we decided to go to the 7 PM showing. There was a Golden Corral going back into town, but we didn\u0026rsquo;t have time to take showers, eat there, and ride back into town for the 7 o\u0026rsquo;clock showing. Burger King it was. This is the first time I have eaten at a fast food joint on the trip and I really enjoyed the fries and grilled chicken sandwich.\nSince it was over a mile, with some decent hills back into town, we were going to ride our bikes instead of walking. We did however, unload them in the room before heading out. It is amazing to feel them with no baggage. You go from driving a Greyhound bus to a sports car. Very cool. We allowed ourselves 30 minutes to get back in town, and were able to do it in 15. Adam enjoyed the movie and I caught many things that I had not noticed the first time I viewed it before heading out on the trip. It is much better than Star Wars 1, but both still don\u0026rsquo;t compare to the originals.\nNice flat stretch\nAdam pushing up a hill\nWe really filled up the room\nAfter we got back to the hotel, we put the bikes in the room and walked over to Wal-Mart. It was like a kid in a candy store. We are stocked up for the next few days. We had tuna sandwiches with provolone and mustard, yogurt, and some granola bars when we got back to the room. We may have over done the milk products with cheese and 2-3 yogurts the we had each before we left in the morning.\nWe got to bed a little after midnight, after both of us went through our things and figured out what we were mailing home in Lexington. I\u0026rsquo;m sending home my big bike lock for two reasons. First, I picked up a slightly lighter and more compact lock at the bike shop. Second, and slightly more important, the tingling sound I heard on a downhill the other day was not a washer I ran over. The best I can figure it, the sound was the keys to my cable lock and my white LED flashlight bounching along the road. I had the spare green LED light, but I no longer have a key to open this heavy bike lock. Instead of being a trooper and carrying it to Kentucky, I\u0026rsquo;m relying on the whole no rain, no sleet, no dark of night, unstoppable organization to deliver it to Jeffersonville.\nLexington, VA\nHotel Site: 37 deg 48.196 min N, 79 deg 24.656 min W, elev 1112 ft.\n","date":"29 May 2002","externalUrl":null,"permalink":"/blog/2002/05/29/day-10/","section":"Blogs","summary":"","title":"Day 10 - Vesuvius to Lexington","type":"blog"},{"content":" I have been having the same basic conversation over and over again. I really thought that Trans-Am cyclists would have already answered them all before, but I guess there aren\u0026rsquo;t all that many of us. Well, not all that many of us that look like a cross between a wheel chair and a NASA satelite.\nA typical conversation might go something like this:\n\u0026ldquo;Is that thing solar powered?\u0026rdquo;\n\u0026ldquo;No, It\u0026rsquo;s \u0026lsquo;Joe powered\u0026rsquo;.\u0026rdquo;\n\u0026ldquo;Joe powered? It runs on coffee?\u0026rdquo;\n\u0026ldquo;Hi, I\u0026rsquo;m Joe.\u0026rdquo;\n\u0026ldquo;Oh.\u0026rdquo;\nPart wheel chair, part NASA satelite\n\u0026ldquo;The solar cell is used to charge my 12V battery, which then charges my cell phone, AAs for my digital camera and my little laptop.\u0026rdquo;\n\u0026ldquo;Where are you going?\u0026rdquo;\n\u0026ldquo;Oregon.\u0026rdquo;\n\u0026ldquo;Where is that?\u0026rdquo;\n\u0026ldquo;You know the State.\u0026rdquo;\n\u0026ldquo;What? That\u0026rsquo;s a long way.\u0026rdquo;\n\u0026ldquo;Yep. Over 4000 miles.\u0026rdquo;\n\u0026ldquo;You\u0026rsquo;re crazy, man.\u0026rdquo; (or something similar)\n\u0026ldquo;Most likely.\u0026rdquo;\n","date":"29 May 2002","externalUrl":null,"permalink":"/blog/2002/05/29/the-conversation/","section":"Blogs","summary":"","title":"The Conversation","type":"blog"},{"content":"The gain in self-confidence of having accomplished a tiresome labor is immense. \u0026ndash;Thomas Arnold Bennett\nI woke up at 6 AM, reset my alarm, and went back to sleep. Then I woke up a 7 AM and I felt a little better about it, so I didn\u0026rsquo;t reset the alarm and I got up. I had partially packed up last night, but left the panniers empty. I maneuvered the bike out of the bike house (not an easy task, but much easier when unloaded) and started filling panniers.\nI then did a once through the house and straightened up anything I had disturbed in my stay. I locked up the house and dropped off a note, a donation, and the key under June\u0026rsquo;s front porch mat. I started climbing just before 8. I stopped as I passed behind Hope and Jim\u0026rsquo;s house and got a better overall pictures of the labyrinth and a few shots of the view.\nWide shot of the fledgling labyrinth\nView off Afton mountain at edge of labyrinth\nAt the centef of the labyrinth\nThe hill going out was as bad as the 2 miles up to Afton. Luckily there wasn\u0026rsquo;t too much distance on 6 up to 250, where the grade lessened. Highway 250 climbs up into Rockfish Gap. There both the Blue Ridge Parkway starts to the South and Skyline Drive to the North. I stopped at the visitors center at 8:40, which opened at 9. I didn\u0026rsquo;t mind sitting, eating breakfast, and resting from my 2 mile, 3.5 mph climb. (This will be a recurring theme today. Climbing, not eating breakfast.)\nI\u0026rsquo;ve heard so many good things about The Blue Ridge Parkway. Mostly from people on motorcycles or cars or anything thing else with a motor. The reason for this is the views are great. However, the hills were not. Strong motors are a good thing, mine is a little weak.\nRockfish Gap Tourist Info Center\nMy GPS Position and bike computer (with a broken sensor wires still.)\nClever movable calendar\nJust at the entrance to The Blue Ridge Parkway\nLack of Commercial Traffic is nice.\nParkway Sign\nI stopped at Humpback Rocks Visitors Center and Farm Museum. There were some nice displays inside, regarding early farming and life in the Appalachian Mountains. After spending 20 minutes inside, I walked through the log cabins, barns, and other structures adjacent to the Visitor\u0026rsquo;s Center. I thought the spring house was interesting. Old day refrigerator.\nHumpback Rocks Visitor Center and Farm Museum\nThe rest of the day involved no more major stops, but many minor ones. Every hill you climb doesn\u0026rsquo;t seem like much of a victory, because you almost immediately head down hill. I did have one victory, passing the 45 mph speed limit on a bicycle. I met a Japanese family who were very interested in my trip. They asked if they could photograph me and then burned almost a complete roll. There were some fun places to climb and repel, but I had no gear to hook into the strapping.\nToday, I crossed the Appalachian Trail for the first time. This is a backpacking trail spanning many states and it crosses the Trans-Am bicycle route a few times in Virginia. I met my first hikers, where the trail crossed the Blue Ridge. Each time is stopped, the bugs really started coming out. I snapped one photo with all of them swarming around my head.\nPhotographing Flowers\nFirst AP Hikers I ran into on the trip.\nA decision time. Continue with the hills or...\ntake a detour for a campground.\nToday was tough. I passed up a few places I could stop to camp, because I would have to ride quite a bit to get back on route. I finally made it to a campground along the route, just after the route left the Blue Ridge Parkway. I won\u0026rsquo;t have too much riding to get back going, but it was a serious descent into the Tye River Gap Campground. I pitched the tent in a nice spot, next to a stream and left to take a shower. Then I cooked some food. In the process, I ran out of fuel. The noodles got done, but there wasn\u0026rsquo;t enough residual heat to activate the sauce, so it didn\u0026rsquo;t thicken. I\u0026rsquo;ll tell you, that was the best macaroni, tuna, and cheese juice I have ever eaten. I didn\u0026rsquo;t mind it a bit, I was that hungry! It is one serving for a cyclist that climbed the Blue Ridge all day.\nWhen there is no forecast for rain, I leave off the rain fly. This allows fresh air to cycle through the tent. There was one problem with this all night. A flowing stream sounds very similar to rain following through the high tree tops. I woke up a couple times fearing of rain. I finally just got up and put it on to ease me mind.\nTwo panoramas of points on The Blue Ridge Parkway I made from stitching together a bunch of shots.\nAfton Overlook panorama\nPanorama at bend in the road\n","date":"28 May 2002","externalUrl":null,"permalink":"/blog/2002/05/28/day-9/","section":"Blogs","summary":"","title":"Day 9 - Afton almost to Vesuvius, VA","type":"blog"},{"content":" This post is almost entirely pictures. I spent two days at the bike house and filled up my 1 GB memory cards more than a few times. Yes, yes. Those of you from the future are rolling your eyes at 1 GB. Even I am a little as I\u0026rsquo;m posting this to the new site. But 1 GB WAS big in 2002.\nThe bike house is really hard to describe. You can spend a full day trying to see everything in it and read all the notes and not get done. Luckily, some bad storms hit and I decided to stay. While it was hard to narrow all the pictures down to just one post, I hope this gives you just a little taste of how extraordinary it is to see the Cookie Lady Bike House \u0026ldquo;museum\u0026rdquo;.\nBicycle at the back room of the house\nClosed in porch entrance to the bike house\nActual Pacific Ocean and Sand, because June has never been there\nYou enter the house from the uphill side into a small entry room. This is a closed in, mostly weather proofed porch. The sign in book is here and this room is open, even if the bike house is locked.\nThe next room is filled with all sorts of hanging memorabilia. Items that cyclists have written on an left over the last 26 years. Here the polaroid photo books sit on a table along with address labels for June so you can write back.\nShe told me that she hasn\u0026rsquo;t ever been far from this mountain. But the world came to her. It was in this room that I stored my bike out of the rain on Memorial Day. You can see a shot through the door into this room at the beginning of my Day 8 journal.\nFollowing are photos of many things in this room.\nOriginal Sign put out for Cyclists\nThe rest of the house is two large rooms and the kitchen, which is stocked with enough food to feed a small army. The fridge also contains a variety of prepared drinks. I had a mix of food that I packed in and some from here over the two two nights I spent here.\nIt was great to have a variety without having to pack the weight. Pots and pans are there and a stove to use that you didn\u0026rsquo;t have to light.\nHungry? Not any more.\nThe middle room of the bike house is filled with an unfathomable number of post cards. There are also articles and cards. The final back room has a bicycle and other items all along the wall. I\u0026rsquo;ll let wide pictures of the two main rooms in the house do my talking.\nHopefully you enjoyed the virtual tour.\nPostscript # In early 2015, I flew into Charlottesville, VA for a one day business trip. We had planned to have a meeting around lunch, but the coworker that was meeting me there had connecting flight issues and was delayed. I had the rental car and had a few hours to kill. The only thing I could think of was to head to Afton and see the Bike House. Unfortunately, my camera was failing on my phone and it didn\u0026rsquo;t focus. I was able to find this photo of the memorial.\nPhoto of memorial outside bike house taken in 2015\nJune Curry passed away in July of 2012. I really had hoped to see her again, but never made it back to Afton. I met the new owner, who said that many cyclists had been by this season and even that day. When I stepped into the bike house, memories flooded back to me and it was almost as if I was back in 2002. It is something not to be missed on a Trans-Am tour.\nBut June will be missed.\n","date":"27 May 2002","externalUrl":null,"permalink":"/blog/2002/05/27/day-8-bike-house/","section":"Blogs","summary":"","title":"Day 8 - June Curry's Bike House","type":"blog"},{"content":" I woke up at around 8 AM, when June came into the bike house. She told me not to get up, but I told her to come on in. We sat and talked for an hour about some of the people that had come through before and about how modern times are so much different than old times. I was able to talk with June a couple of times throughout the day and had a good time during each conversation.\nJune at the famous water sign\nLooking at my bike in the bike house \u0026#39;lobby\u0026#39;\nQuite a bit of today was taking pictures of as much as I could in the bike house. There were many travel journals and books that I would like to read, but there just wouldn\u0026rsquo;t be enough time to read that much in a whole week. I started \u0026ldquo;copying\u0026rdquo; these by taking digital pictures of each page. It was a pretty quick process, but there were so many pages and articles that I wanted to read.\nI sat down again, dumped my memory cards to the laptop, and wrote in my journal. But the end of the day, I had taken over 1100 digital pictures from things in the house. This will take some time to sort out, but I will be glad that I get a chance to read some of them once the tour is over.\nI went up to visit Hope and look at the start of her Labyrinth. She is building it on top of a hill behind their house. The following is from an information sheet she left in the bike house:\nThe seven circuit labyrinth design is believed to be 4500 years old. The first example is found carved on the wall of a Neolithic tomb from ancient Sardinia. The design, however seems universal. It appears in many different cultures from all over the world. This same design appears on 3500 year old coins from Crete, tablets and pottery from both ancient Greece and Rome, an 11th century manuscript from India and labyrinths believed to be from the 12th century have been found carved in rock on Hopi reservations in Arizona.\nHope watering the new plants around the labrynth\nCenter of the labrynth\nFresh plants that will form the labrynth\nThe labyrinth represents the path each of us takes in our own lives. It winds and turns its way in on a unicursal line. This means that there are no false turns or dead ends - just one way into to the center and back out again by the same path. It is a walking meditation, a metaphor for the course of our lives, and a powerful tool for solving problems.\nAs you walk the labyrinth you turn this way, then that, shifting 180 degrees each time. It is thought that this is the reason it can induce receptive states of consciousness. As each physical shift occurs, your awareness changes from right brain to left brain, and there is an equal number of turns in each directions. Each person has a unique experience in the labyrinth. Some walk it for guidance, some for clearing the mind, others for centering and gathering their thoughts. Whatever the purpose, most find a connection to their spiritual core.\nView off the mountain at the labrynth\nI found it relaxing to walk the path. Before today, I didn\u0026rsquo;t know the difference between a labyrinth and a maze. I had always thought that they were different names for the same thing. A labyrinth only has one path in and out, where a maze has many paths and some of which are false.\nHope has started planting lavender around the labyrinth and will eventually complete the entire thing in lavender. Not only will it be pretty, but the fragrance should be amazing. The very center of the labyrinth is the first time I stopped looking down at the path and looked up. Wow. The mountain view is amazing. They did pick a perfect place for this.\nDistance photo of bike house, garage, and June\u0026#39;s house at top\nBen, Kami and Dove\u0026#39;s photo from June\u0026#39;s photo book\nMy bed for the two nights at the Bike House (and a nap)\nJune recently learned that a couple who had come through over a month ago were in an accident. They had an 11 month old, making her just over a year old at the time of the accident. Kami, Ben and their daughter Dove are all going to be fine. From what I understand, Ben was pulling a trailer with Dove and Kami was pulling a trailer with their gear when they were hit by some vehicle. Both bikes and trailers were ruined, but Dove didn\u0026rsquo;t have a scratch. The parents were a little banged up, but only bruises and some gravel rash and no broken bones. It is a blessing that no-one was seriously injured.\nI came in to the bike house and had a toaster pastry and tuna fish sandwiches. Then I sat down on the couch. I decided to lay down on the couch for a bit and was woken up by thunder. Looking outside, the thunderstorms and rain had started. I went back to the couch and dosed a little more.\nJune showing me around the bike house\nJune and I\nWater for cyclists, which means the world after a long, hot climb\nJune came in at around 3 PM and was taking a man and woman from the local cycling club through the house for the first time. I was able to record some of her explanations of some of the memorabilia and get pictures of what she was talking about. It was great to hear a few of these stories and imagine how many more stories were represented by all of the pictures, articles, post cards, and cycling gear in the house.\nI purchased one of her books with anecdotes about various people she has met. She is going to ship it to my parents, so I don\u0026rsquo;t have to carry it up the hills and mangle it in my panniers.\nI had planned on leaving for a short day, but the rain continued all evening. My legs were happy for my first day with no miles. I\u0026rsquo;m hoping the weather clears up for tomorrow, just so I can see the sights from the Blue Ridge Parkway. I\u0026rsquo;m going to try to get out of here before 7 AM for a decently long day tomorrow. I have about 2000 feet of climbing before I reach the peak of the Blue Ridge Parkway, then it is all up and down riding.\nJune assured me that the worst climb of the trip is the one up to Afton mountain. She said that those riding West to East comment on Virginia being the hardest state of all. This is even for those who are in shape after 3,500 miles of riding. Today I commented on my legs not liking the hills, June confused my physical soreness for my mental resolve and tried to assure me that I could make it across. I told her that I have no doubt in my mind that I can. My body is starting to morph into a hill climber. It isn\u0026rsquo;t there yet, but I can already feel the changes starting.\nI came back inside the house and started taking more pictures. I wound up shooting more than 1100 picutes of the bike house and page \u0026ldquo;copies\u0026rdquo; since I\u0026rsquo;ve been here. I had some Spaghetti O\u0026rsquo;s with Meatballs and some Peas. June keeps the bike house stocked with food for us bikers. She has a donation jar for optional donations. Those are the only thing that keeps this house going. I will be leaving her a sizable one for the two most enjoyable days of my tour so far.\nTrain tracks just down the hill from the bike house\nPolaroids of the Petes and myself to go in the bike log\nBike House log, with the Pete\u0026#39;s message above mine.\nI took photos of the Pete\u0026rsquo;s and my Polaroids and also the sign in sheet. The Pete\u0026rsquo;s left a note for Adam and I. After I signed, I also left a note for Adam. Sign in books are one great way of seeing how far ahead the faster cyclists are than you. I would start to see people who passed me and by the difference in dates, get an idea of how they were doing in progress.\nJim (Hope\u0026rsquo;s husband) came down into the bike house around 7 PM and invited me up to their home. June was up there having a hot dog roast. I had already eaten, so I didn\u0026rsquo;t have a hot dog, but I did really enjoy myself talking with them next to the clay pot fire.\nJune roasting a hot dog\nThe wonderful folks, with which I spent Memorial Day evening\nThey had a cool little clay fireplace that looks like a big pot with and opening and a chimney on top. It works really well for a small fire for roasting under their front porch. We sat enjoying the evening and listening to the rain fall through the trees. I roasted a marshmallow and had a piece of apple pie. The conversation was great and so were the mountain views. One of the best part of this trip was the many nice people I met along the way.\nI said my goodbyes as it got later. It was time to start packing up and getting ready to leave in the morning. I had to take my laptop down to the rail road bridge to get enough signal to send out my journal updates.\nIt is hard to believe that I\u0026rsquo;ve been on this trip for over a week now.\n","date":"27 May 2002","externalUrl":null,"permalink":"/blog/2002/05/27/day-8/","section":"Blogs","summary":"","title":"Day 8 - Memorial Day in Afton, VA","type":"blog"},{"content":" I adjusted my kickstand mount that was working loose this morning. Checkout time was noon and I got out of my room at 12:05. I actually had to rush to get packed up by noon. Then I got to wait about 10 minutes for an empty elevator going down. People were not agreeable to share an elevator with my bike and its 2 spare inches.\nI stopped for lunch at the same bagel place I ate at yesterday. I just wasn\u0026rsquo;t ready to get riding in the 90+ degree heat. It seems fine when you are already riding, but hard to get going when you have been in air conditioning for the morning. I think it is much like slowly raising the water temperature to boil a frog, where tossing them in a boiling pot will just make them jump out.\nTaking a break under some shade and getting some water\nAfter looking at the route, finishing lunch, and filling up my water bottles and extra water container, I was off. Man it was hot. I got about 0.2 of a mile on Main St. (US 250) out of town and pulled over to a sidewalk. I wanted to verify my route against the detailed Charlottesville map.\nI looked up and Adam was standing 100 feet in front of where I stopped. He was the guy on the mountain bike I passed a couple miles from the Willis United Methodist Church, riding down to Yorktown from DC to start. He met up with the Petes and they went to dinner last night. Turns out that his stock back wheel isn\u0026rsquo;t doing so well pulling the BOB YAK trailer. He broke one driver side and two non-driver side spokes. The bike shop isn\u0026rsquo;t open on Sunday, but it sounds like they might be able to help him on Monday. Seems like it would be closed on Memorial Day, though. I suggested that he have a good 36 spoke rear wheel made and mailed as General Delivery to some post office along the route. The BOB trailer really torques the wheels. I made my back wheel and had a front wheel made, just for the trip and stopped using a BOB trailer for touring after I broke two spokes on a weekend tour, getting ready for this trip.\nHe was happy to learn what I could tell him about downtown. Specifically that there were two movie theatres and many other things to do. I guess he was wondering how he would kill the time. I told him I would be looking for him in the following weeks and gave him a card for my web site.\nAbout 10 miles out of town, I stopped at a house that showed some activity. I was running low on water and wanted to fill up my 48 oz water container. I didn\u0026rsquo;t know what I had to look forward to getting into Whitehall. I sat in the shade and opened the can of sliced pineapple I was carrying. I drank out the juice and then ate almost all of it. I had to dump one ring across the street in the high grass, because I wanted to crush the empty can to make it easier to carry. I also made a water bottle of Gatorade and drank some of that. Feeling refreshed, I started peddling again to Whitehall.\nAfter turning onto 676, I ran into a man and woman out for a day ride. He did a U-turn to talk a little and then made sure that I knew where I was before continuing on. After he left I looked at my map again to see the next turn.\nIt was a left turn onto 839, only a 1/2 mile after my last turn. But I have been riding an talking happily along and was 3/4 of a mile past my last turn. Whoops. After a little under a 1/4 mile, I was back on route.\nAfter 3 miles of some challenging up and down riding, I came into Whitehall. There is a post office, community center, and the Wyant\u0026rsquo;s Store. Only the Wyant\u0026rsquo;s Store was open, but that was where I was heading.\nIt is currently owned by Larry Wyant, and has been in there family for over 100 years. It seemed to be a local community hangout, with seats inside and on the front porch. If cyclists get here late, they can camp at the community center across the street. I have an orange popsicle and purchased some supplies for the night ahead. And I made sure to fill up all my water containers.\nWyant\u0026#39;s Store for snacks and cool down\nWhitehall community center (camping is allowed here)\nLocal cyclist on a ride\nBefore crossing I-64, I climbed up to 1150 ft. Some parts of this was really challenging and I walked about 100 feet of a crazy grade. This was all and good, because I realized that I was going to get some altitude gain in the mountains. However, after passing under I-64, I lost over 400 feet. Talk about an empty victory.\nWhile stopping for a break, I saw a local rider. He was all about the climb and didn\u0026rsquo;t stop or wave. A little bit past I-64, I found a little mountain stream. I took off my shirt, saturated it, wet down my hair, and put on the oh so good feeling shirt.\nI started a slow climb up US 250 on my way to the 750 turnoff to Afton. After the turnoff, I know there were only 2 miles left. What I didn\u0026rsquo;t know was the last two miles were all up. So this is the tough climb that everyone is talking about in Afton.\nStream with cool flowing water\nCooler Joe after covering himself in stream water\nA shot I took while resting on the climb\nIt was tough. After I made it about a mile up, it seemed like it kept getting steeper. I am glad that you use different muscles to walk and ride. I started trading off riding and walking. Pretty soon I was at Hwy 6 and knew my destination was 0.1 mile ahead.\nFor over three years, I have wanted to see this place and now I was finally here. Any TransAm bicyclist (or those dreaming of riding this trail) already know what I am talking about. Afton, VA is the home of a legend of the TransAm trail. It is the home of June Curry, The Cookie Lady. She is the best known of the many good Samaritans along the TransAm trail. June and her father first started offering water to cyclists in the summer of 1976. At first, they didn\u0026rsquo;t know what to think about all these bicyclists riding by.\nFinally made it to my stop\nIt was cool to arrive here\nWhen the trail was established in 1976, there was a grocery store in Afton. However, that store went out of business just before the cyclists started their trip across the country. The cyclists would appear bedraggled after that steep hill and expecting a grocery. At first, June said that they though motorcycle gangs had switched to bicycles. A lady explained to her that that these groups were organized and riding the new Bikecentennial Trail as part of organized groups to celebrate the bi-centennial of our nation. At that time June and her dad started offering water to cyclists. Then, she said that she had to feed some of them, because they really were in need of the no longer open grocery.\nThat was 26 years ago and she is still hosting bikers. I was floored by the bike house as I walked inside. June had dinner guests and wasn\u0026rsquo;t able to show me the house herself, but I didn\u0026rsquo;t mind. You can feel the \u0026ldquo;can do\u0026rdquo; attitude of those who have ridden this route or even further. There is so much to view and read that I was up till after midnight reading through only a part of it. I finally decided that there is still tomorrow and went to sleep on one of the many couches.\nSee the Bike House page for many photos of this Trans-Am museum.\n","date":"26 May 2002","externalUrl":null,"permalink":"/blog/2002/05/26/day-7/","section":"Blogs","summary":"","title":"Day 7 - Charlottesville to Afton, VA","type":"blog"},{"content":" The jails in Palmyra, VA are pretty nice. The officer arrested me around 2 AM and confiscated all of my gear.\nJust kidding! I didn\u0026rsquo;t have any problems with camping at the boat ramp last night. Traffic on 15 started to slow around 10 PM and I fell asleep shortly after sending out my emails. I woke up just before 6 and started packing up. I left Palmyra at 6:30 and started my race with traffic to Charlottesville.\nThe route starts along 53, but takes back roads at Cunningham. I hoped to get a snack at the Cunningham Market, as it is always fun to stop in at the small markets. Unfortunately, it was closed for renovations. The sign stated that it was reopening soon, but the ants were there now. I don\u0026rsquo;t know if I\u0026rsquo;ve ever seen so many ants in one place. It was impressive.\nSmall store that unfortunately wasn\u0026#39;t open yet.\nAnts were the only thing active at the store\nThe route joins back up with 53 about 5 miles out of Charlottesville. I talked with some people last night who described the route and it seems like the worst part of 53 has to be ridden either way, so I decided to stay on 53 all the way in. This cuts off a few miles and many climbs, but more importantly, it gets me to the bad part of roads earlier in the morning.\nI was hoping that being a Saturday and holiday weekend would keep the commuting traffic low until later. I\u0026rsquo;m not sure how much traffic is usually on 53, but I think I made a good choice. The climbs on 53 were more that sufficient to satisfy my need for climbing. It also assured me that I made the right choice of stopping in Palmyra last night. My legs wouldn\u0026rsquo;t have gotten me into town in yesterday\u0026rsquo;s heat.\nA note for anyone heading Eastbound: You don\u0026rsquo;t want to ride 53, follow the route. There was a serious drop, with switchbacks, I went down that would be terrible to climb and very unsafe. I blended in with the car traffic at 45+ MPH during the entire section, which indicates the grade of the road. I quickly went back to my typical 4 MPH climbing speed on the uphills.\nI stopped at a small lunch shop where 732 runs into 53 (4 - 5 miles out of Charlottesville) to take a look at Carters Mountain. This is one of the two peaks you go between to get into town, the other being Wolfpit Mountain. A couple and their son were there having their typical Saturday morning snack at the store. They live next door. We talked for a while and they gave me their number in case I run into any problems near Charlottesville. Thanks Karen and Mike!\nBeing Saturday on Memorial Day weekend reduced the commuting time frame traffic, but it was crazy now. The Monticello Visitors Center is the first place I hit coming in on Highway 20. They called a few places and found me a room. All of the cheap motels are out of town on 29 were booked. Highway 29 is a major thru-way to DC, about 120 miles to the North. This road isn\u0026rsquo;t conducive to cycling and I wanted to be closer to downtown for touring Charlottesville, so no rooms wasn\u0026rsquo;t too bad of a problem. The room I reserved was at a Red Room Inn, almost in downtown. I really didn\u0026rsquo;t want to pay that much, but prices are up for the holiday weekend. My lodging expenses just went from $7 a night average up to over $25 per night. That will drop back down a again soon, once I get to town that allow camping in city parks.\nMy stay for the night\nI stopped for some lunch a The Chesapeake Bagel Bakery, adjacent to the Red Roof Inn. While I was typing up my ride notes, the Petes cruised by on their Tandem. They saw my bike and stopped. They had reservations at a motel down the road and also felt the need for a rest day. We both are wondering how we are getting our bikes into our rooms. I\u0026rsquo;m hoping to use a freight elevator in my hotel. They came up on 53 just after noon and said that it was really bad. This makes me much happier that I chose to ride in as early as I did. Check in time for the hotel was 2 PM, so I killed another half hour looking at the next few day\u0026rsquo;s routes. While relaxing, I thought about the changes in my surroundings. Charlottesville is definitely a hilly city.\nI checked in a little after 2. The bike fit into the elevator with about 2\u0026quot; to spare, after orienting it corner to corner. The best part was seeing the faces of the people waiting for the elevator when the doors opened. I was able to get a room right next to the elevator, which is really nice. The staff offered use of a fitness center for free. This made me chuckle. If I wanted to do that, I wouldn\u0026rsquo;t be taking a rest day today.\nTight fit in hotel elevator\nTight fit in hotel elevator\nTouring bikes explode when loaded into hotel rooms\nAfter getting in my room, my bike exploded. Somehow all the contents got scattered all around the room. I have read people\u0026rsquo;s accounts of this, but it is really kinda funny to do it yourself. I started sorting stuff and remembered that the tent was wet from breaking down covered in dew. The twin beds are good to hold a tent and still leave a bed to sleep. Then I sniff tested some laundry. Anything I have worn for anytime during riding the bike failed and hit the tub for laundry. I hand washed everything, then jumped into the shower, because I failed the sniff test too.\nAfter hanging everything to dry, I headed out to downtown Charlottesville. The walking mall in downtown was nice. Unfortunately the places are typical tourist trap fare with little practical value and high prices. I did go in a CVS and get some Potassium and Magnesium. I think these will be needed in the climbing days to come.\nThere was a cool book shop with rare books. I\u0026rsquo;ve heard of people collecting them, but never really saw a book worth 100\u0026rsquo;s of dollars. Many very old first editions. There were also displays with various old bonds or confederate currency and coins. I took some pictures, but this camera doesn\u0026rsquo;t do well with macro, natural light photos when it is this dark, so they are blurry.\nI had dinner at Baja Rapido, a decent chicken burrito and chips. While I ate, I had a good time playing around with the children of the owners. Then I went to see a movie and walked back to my room.\nTrying to show how hilly this city is\nCivil War era bullets and currency\nChildren having fun during dinner\nWalking mall in Charlottesville\nI confirmed my check-out time is noon. That is bad. It means I\u0026rsquo;ll be staying here till noon tomorrow. I\u0026rsquo;ll have to cut tomorrow shorter than my planned route. I guess it is fine though. I needed a rest day and I didn\u0026rsquo;t stop riding today till almost 12. So if I don\u0026rsquo;t start riding until 12 tomorrow, then I\u0026rsquo;ve had a rest day, right?\nMy thoughts were interesting as I tried to go to sleep tonight. The first one made me laugh out loud. I just caught myself thinking how few bugs there are around. Then I remembered that I was inside a hotel room. I thought about how I probably should have stocked up with stuff today, being that tomorrow is Sunday. I know many places might be closed on Sunday. It is a holiday weekend, so maybe not.\nSoon I was too tired to care anymore.\n","date":"25 May 2002","externalUrl":null,"permalink":"/blog/2002/05/25/day-6/","section":"Blogs","summary":"","title":"Day 6 - Palmyra to Charlottesville, VA","type":"blog"},{"content":" I woke up just before dawn cracked at 5:45. I had packed up everything but my sleeping gear before I went to bed, because I wanted to secure as much of it as I could from any animal or other visitors. I was out of the campground before 6. I still couldn\u0026rsquo;t find anyone to check in with, so I dropped off a couple singles in the slot near the closed sign, which I felt was far more than the accommodations were worth.\nDawn quietly cracking\nDelicious hot breakfast sandwiches\nEntering Mineral, VA.\nThe country store just out of the campground had hot biscuit sandwiches. I enjoyed a country ham, egg, and cheese biscuit as I hoped for the temperature to rise. It did not, so I geared up for the downhills in 40 degree wind and started peddaling.\nAfter 10 miles of riding with about 250 feet climbing, I entered Mineral, VA. This country is really pretty to ride through. I stopped to peal off a layer for the rising temperature and enjoy the sights.\nI found an interesting site just as I was leaving Mineral, VA: The Trevilians School House. It is a single room building, about 20 feet on each side, setup inside with period desks and such. Sambo Johnson owned both the property of the original location and where it now sits in Mineral. It is believed his mother or Aunt taught there and he moved and restored the school several years ago.\nAlthough it was locked, the front steps were perfect and shaded from the sun which had now warmed up the day. I sat down to type up a little of my ride journal, then I put on some sunscreen and got back on the road.\nThe Trevilians School House (1880-1924)\nLunch time at Johnny\u0026#39;s Quik Stop\nI stopped in Pendleton, the town 1 mile out of Mineral. There the gas station/mart had some newly prepared chicken fingers and potato wedges. I decided to partake in some of those and wasn\u0026rsquo;t disappointed. I talked with a few locals and one guy who lived on the route later in Kents Store, VA. He gave me a lay of the land and told me that I would be doing good to get to Palmyra today. It was only 10 AM and I already had 15 or so miles under my belt, so I wasn\u0026rsquo;t worried. But boy did those hills start coming.\nThere isn\u0026rsquo;t much to talk about today, I just road through some pretty countryside and climbed a bunch. Today was the first day I was able to see the landscape actually rolling, and I am definitely about to hit the real climbs soon.\nI pulled into the single store in Kents Store. (One wonders if this town was formed by Kent, who had a store. Hmm, I guess we\u0026rsquo;ll call it Kent\u0026rsquo;s Store.) I loved the air-conditioning. My thermometer was indicating 85-88 in the shaded grass and 92-98 on the sunlit road. Needless to say, I stayed in the AC for a while. The ice cream sandwich and cold Gatorade helped to lower my core temperature. When I went to the toilet, there was even a comics section from today. That was a nice diversion.\nAs I was visiting with people at the store, a man came by asking about the bike. He understood everything until I got to GPS.\n\u0026ldquo;What\u0026rsquo;s that?\u0026rdquo; he says.\nSo I explain about satellites and positioning and show him the map.\n\u0026ldquo;That\u0026rsquo;s what I need on my boat!\u0026rdquo;. Apparently he has gotten lost a time or too, and I agreed that it would be perfect. So I told him where to pick them up and gave him a few brands to check for.\nOld Stone Jail Sign in Palmyra.\nOld Stone Jail in Palmyra\nMonument for Confederate Soldiers of Fluvanna County\nAll in all, the people of Virginia have been really great. My left arm gets a little sore from returning all the waves I\u0026rsquo;m getting. But I do have two things to bring up about Virginia road signs. One is a gripe and one is a compliment.\nFirst, the gripe: What is up with numbering every road and then also giving it a name. I\u0026rsquo;ll ask someone about a road and they say, \u0026ldquo;There ain\u0026rsquo;t no 634 around here, you want to take Something Something Road.\u0026rdquo; Turns out that they are one and the same. This happens occasionally everywhere, but it seems like EVERY small road has this happening in Virginia. Strange.\nNow the compliment: Any road that dead end within a mile or so has a sign at the turn off to is \u0026ldquo;Road Ends 0.5 Miles\u0026rdquo; or whatever the value it needs. This is GREAT. I have been touring around Indiana and you assume some country road (say 400E or similar) keeps going over a stream or through a forested area, until you ride a mile and it dead ends. The best that you get is a \u0026ldquo;Dead End\u0026rdquo; sign after the last turnoff (maybe .9 miles in). Kudos to VDOT for these.\nI pulled into Palmyra around 3:30. I was totally spent. The Old Stone Jail Museum was interesting, but unfortunately closed. The hours didn\u0026rsquo;t really meet with my current situation, so I rode on.\nYoung girl fishing\nFather and daughter fishing from the shore\nHwy 15 bridge over Rivanna River\nI stopped at the cafe right at the turn onto 53. This is the same cafe that I have read of other TransAm cyclists camping behind. I had a milkshake, purely for medicinal purposes. (You know, that whole core temperature lowering thing.) I washed the shake down with a burger, wedges and cole slaw. Then I sat inside the AC and looked at my options.\nI have a 20+ miles ride, part on route and part off, over to Charlottesville\u0026rsquo;s KOA. This would then require more off route riding back. Or I could ride more than that into Charlottesville and get a motel. I want a rest day tomorrow, but I didn\u0026rsquo;t think I can hit either of those with my legs where they are at right then. So, I killed time in the AC and then went to setup camp behind the store. By killed time, I tried to debug why some email messages are not going out and wrote up travel journal.\nThe site is actually a boat launch for the Rivanna River. I noticed the sign after I setup camp that says only fishing and boat launching, no camping, alcoholic beverages, with penalty of arrest. Oh, well. I ain\u0026rsquo;t pedaling anywhere else today. Hopefully no ranger comes by to take me to jail.\nMy illegal campsite near the boat launch.\nSign indicating that I could be arrested tonight. Lets hope not.\nI\u0026rsquo;m beginning to wish my tent was closer to dark green rather that bright white. I\u0026rsquo;ve got the fly off and the windows open, so all you see is a white border. We will see what happens. I\u0026rsquo;d like to get up and out of here by 6:30, so I can ride straight into Charlottesville via 53 with the hopefully lesser Saturday morning traffic.\nMemorial Day weekend is making me second guess a bunch of things. This is my first night in a half open sky for star gazing, and I fell asleep looking at stars.\nThe sunset was beautiful.\nCurrently I am 167 miles along the Trans-Am trail and I have ridden just under 200 miles. Those side trips add up, I guess. Due to the rounding of corners by the GPS, this is probably just a little under actual travel distance.\nToday is brought to you by the letters C and H and by the number 9 and 5.\nC is for Climbing, 2000 feet today. H is for heat, I met along the way. 9 is a number when multiplied by ten. Then added to 5 is the temperature I'm in. Well, now we know why I\u0026rsquo;m a bicycle tourist and not a poet.\n","date":"24 May 2002","externalUrl":null,"permalink":"/blog/2002/05/24/day-5/","section":"Blogs","summary":"","title":"Day 5 - Lake Anna to Palmyra, VA","type":"blog"},{"content":" Before willing myself out of my warm sleeping bag, I snapped a picture of my view. I rose into the cold and decided on a cold breakfast to keep with the theme. I finished off my first pack of Fig Newtons and had a mug of Gatorade (my morning drink of choice for that last few days.) The early Gatorade seems to give my muscles what they need to start out. I knew I would be having an early lunch, as I planned to go into Ashland today.\nMy view while sleeping.\nMy tent\u0026#39;s view of me the last two nights.\nThe Petes getting ready to ride.\nI got a kick out of the simple parts of bicycle touring that the Pete\u0026rsquo;s and I shared. Cycling clothes that we washed last night while we showered, hanging out to dry. They may have used the on site laundry, I just didn\u0026rsquo;t have enough to justify it. A little time in the shower with some soap works just as well.\nI started out of the campground, hit the restroom, and did my bike pocket check. You know how you do the pocket slap for your keys and wallet? I do the same for my essentials on the bike after every stop. My water bottle slap came up empty. Megan Pete was holding them out as I rode a few feet back to camp. I made sure that they knew the short cut to get back on route which I had, through much effort, learned last night.\nPacking up and eating my breakfast.\nLunchtime for today\nThose are full sized paper plates. This is a big sub.\nI detoured off the route in Ashland to find a Radio Shack and a Post Office. On the way I stopped at a Jersey Mike\u0026rsquo;s Subs and got a Giant Club Supreme. They didn\u0026rsquo;t miss use the word giant! In the picture of it, the two paper plates it is spanning are normal large sized plates. I had them wrap up that last 1/4 to take with me. That made my little breakfast work out perfect.\nI was successful on finding both a Radio Shack and the Post Office. I purchased a 5 pack of spare fuses for the 12V battery. By the end of the day, my battery had charged fine via the solar cell. They didn\u0026rsquo;t have a loaner soldering iron and I figured that I could find a better solution than buying $30 worth of stuff to fix my bike computer wire, then immediately mailing it to my parents. I\u0026rsquo;ll be using the GPS as my only bike computer for a little while longer.\nSolar charging works after getting fuses.\nTime to drop some weight at the post office.\nDual railroad tracks running up the center of Ashland\nI rode up to the Post Office and started pulling out bags. The time honored tradition of elimination was upon me. I draped the laundry from yesterday that was still wet all over my bike. I went through every piece of equipment that I had on the bike and made each piece justify itself to me. I came up with about 8 pounds of stuff that I could live without. It should be in my parents house day after tomorrow, thanks to the fine people of the United States Postal Service. With that done, I headed out of town around 1:30.\nAshland has some history in railroad, as do many towns in this nation. Two main lines run right through town and made for some pretty scenes. The railroad depot was a nice place to sit on a bench and read a book. But alas, there are miles to go before I sleep and I had yet to purchase a book. Most of the books I brought are in MP3 format and located on CDs. Although, there has been enough to do that I haven\u0026rsquo;t yet pulled them out.\nAshland train station\nNot sure what bicycle route 1 is, but it might be closed.\nOn Blunt\u0026rsquo;s Bridge Road, I started hitting my first serious hills of the trip. Before, I had been able to climb them with some determined spinning. But these hills started to feel more like something from the Hilly Hundred in Bloomington, except I don\u0026rsquo;t have all this gear on my bike for the hilly. Now I feel like I\u0026rsquo;m moving into winch mode to get up the hills.\nAs I was struggling up this hill, I saw an older lady in front of me doing the same thing on foot. When I got to the top, I pulled over to get my heart back in my chest and chatted for a little bit. She told me that if she climbs that hill a few times a week, it just might get her some vigor back. Well her body and stamina was looking a lot younger that the years on her face, so I say kudos to you. I know a few people who need that kind of mindset.\nChurch Quarter log house.\nI noticed an old log cabin and pulled the bike over to check it out. At first I thought it might be someone\u0026rsquo;s home, but then read the plaque. It is one of the few surviving cabins with a certain style of construction. I took pictures all around and looked at the various construction details. Instead of flats, they used notches to lock in the logs. The door jam height was extremely low, by modern standards. I even took a timer shot to show the door jam height. I would bang my head a few times going in and out of this place.\nI found a water tap and it was pressurized. I assume it is city water, as I heard no pump start up. I let it run a little as I soaked my head and shirt, and filled up bottles before heading out again. That was a great way to escape the heat that started building today.\nCool Log Cabin I happened upon\nFront porch\nDoor height would stink\nAngled log locking\nMore log detail\nPorch attachment\nPorce detail\nBack door\nYay, good running water\nThat felt good\nI stayed on the route to Scotchtown (which is a couple miles longer than you would have to go on 738) and wasn\u0026rsquo;t too happy with the results. I climbed many, many hills and when I finally got to Scotchtown, I would have to ride a steep 1/2 mile downhill to get there. Sorry Patrick Henry, I know its your home and everything, but I\u0026rsquo;m not ready to optionally climb another hill that steep to see the house and 18 century antiques. There are too many hills to climb today and not enough hours to do it. I\u0026rsquo;ve seen too many tourist places already and want some simple bike touring.\nMy map clip and south slanted solar cell holder.\nMy \u0026#39;dashboard\u0026#39; view.\nI snapped a few photos of my \u0026ldquo;dashboard view\u0026rdquo; with the map and solar cell. I also took a blurry shot of my air horn, GPS, computer, headlight switches, and Halt dog spray. I stopped to take a look at the Fork Church historical marker and the current church building.\nJust after leaving the store, I ran into more road kill. Check out the teeth on this one. As I was snapping this photo, some people stopped an asked what I was doing. I just said, \u0026ldquo;taking a picture of road kill, the first one I\u0026rsquo;ve ever gotten with a bike.\u0026rdquo; They just looked at me strange and drove off. What? I thought it was funny.\nCheck out the teeth on this beaver.\nAfter a hard hill, buying this car sounded good.\nAt the top of a difficult hill, I saw a car for sale. As I crawled past it, finishing the hill, I thought that the price seemed reasonable. But a Taurus isn\u0026rsquo;t comfortable for me and I didn\u0026rsquo;t think my bike would fit in the back.\nBumpass Post Office\nNot sure which sylable you emphasise either.\nMany hills later, I road through Bumpass. I\u0026rsquo;m not sure what syllables to accentuate either, but it really gave me a chuckle. I\u0026rsquo;m guessing it is either a place where bums come to get across the mountains or a place where the road is bumpy and they want to warn you. I didn\u0026rsquo;t really get confirmation of either to determine the correct pronunciation. I couldn\u0026rsquo;t find any locals to ask either, and I\u0026rsquo;m guessing they have long sense been annoyed by questions about it.\nThe edge of Lake Anna\nShadow touring self-portrait\nCooking dinner for the night\nPast Buckner, I reached Lake Anna. This area has really reminded me of Lake Cumberland in Kentucky. The little country stores, the lovely farm views, and what else\u0026hellip; Oh yeah, never a flat road for miles. You are either going up or down. My leg muscles are going to need a day off soon or they are going on strike. I stopped at a large store for the area. After walking past the bait displays, I purchased some food for the evening.\nI got into the Lake Anna Family Campground after 8PM. What a joke. I\u0026rsquo;m sure it was in better condition when Donna wrote her book. I got there too late to check in, I guess. I wandered around for a for a while on the bike and couldn\u0026rsquo;t even find where I would check in. I just dropped my Thermarest on a picnic table at what I thought to be a site and threw my sleeping bag over it. Well, that is after I cleaned off the inch of pine needles and leaves that were residing on the table. It looked like this place hasn\u0026rsquo;t been used this year. It might actually be closed, but there seem to be a few permanent residents in little shack cabins and RVs scattered around.\nView up into the tree canopy over my \u0026#39;campsite\u0026#39;\nOutside of the rest room and showers.\nShower had water and was hot. Good enough.\nAfter cooking and eating some dinner, I walked up to the bath house to take care of business and get a shower. Seeing the toilets made me laugh. For some reason I thought of Goldilocks and the Three Bears. One toilet with a plunger, one toilet without a seat, one toilet that was just right. Well, not just right. More like, do you business quickly and just in the shower to make sure you don\u0026rsquo;t catch anything.\nThe shower was nice and hot and felt good after a day of riding. I gave my clothes from today a scrub, finally starting to get into what felt like a rhythm as a bicycle tourist. I filled up some water bottles and decided to brush my teeth at camp. I wanted another snack before bed.\nMy bed for the night\nI was anticipating mosquitoes to be a problem, but I didn\u0026rsquo;t use any spray. As I watched the moon rise behind the beautiful foliage, only 3 mosquitoes came to visit me. Those 3 are no longer with us.\nI knew the huge canopy of leaves would make dew not a problem, but it restricted my view of the stars. I guess there are always trade offs. I was surprised how much I enjoyed falling asleep, to the sounds of nature, in this little decrepit \u0026ldquo;Family Campground.\u0026rdquo;\n","date":"23 May 2002","externalUrl":null,"permalink":"/blog/2002/05/23/day-4/","section":"Blogs","summary":"","title":"Day 4 - Ashland to Lake Anna, VA","type":"blog"},{"content":" I didn\u0026rsquo;t get a chance to finish typing up my journal and answer emails before bed yesterday. While eating and writing, the temperature dove off a cliff. The food from my cook stove was warming for a while, but with the food and hot tea gone, night\u0026rsquo;s chill started winning the battle. Last night was cooler than my first night on tour. Not being near a big city might have been a factor.\nWillis Church Campsite in the Morning.\nWillis Church Building\nTent and Dogs warming in the sun.\nThis is the first night I used my full mummy bag. I\u0026rsquo;m talking near freezing, mummy bag pulled tight so only your mouth and nose is out kind of cold. That mummy bag was perfect. I woke up and didn\u0026rsquo;t want to get up. Unfortunately my bladder has a veto over what I want, so I stepped out into the cold.\nThe sun had my tent up to around 65 degrees, so I didn\u0026rsquo;t expect the 40 degree air. I started breakfast and began slowly breaking camp. I listened to NPR again and played with the dogs that came by. One belongs to Pastor Harrell and the other is the neighbor\u0026rsquo;s. Just for the record, the neighbor\u0026rsquo;s dog is all interested in the process of me eating oatmeal and raisins, but he doesn\u0026rsquo;t care for the stuff himself. Guess it needs some bullion cubes or something else meat flavored to get him interested.\nI started looking into all the shifting problems I had yesterday. It turns out to be a combination of factors. Most notably, is the fact than my cassette has worked loose. I\u0026rsquo;m not sure how exactly that happened, but it really explains most of the problems I was having. I torqued it down really tight. By doing that, Murphy has assured me that I should break a drive side spoke soon and have to take it back off to fix. (That is how it works, right?) The detailer hanger was also a little bent, but I was able to use the crescent wrench to get it back almost perfect. I\u0026rsquo;m guessing that this was caused by the travel in plane and van out to my starting point. After a few shifts to adjust the stops and get indexing centered, I was good as new.\nPastor Harrell visiting in the morning.\nSign inside Willis Church\nAs I was wrapping up the bike work, the Pastor came back out and we talked for quite a while. Then a friend came over and I got to explain all the bike\u0026rsquo;s \u0026ldquo;systems\u0026rdquo;. I seem to be doing that a lot. The large 12V NiCad battery pack in the front tube, the 14V solar panel charging the battery, the map dashboard with Off/Low/High beam switches for my headlight powered by the generator hub. I\u0026rsquo;m an engineer and a geek. I can\u0026rsquo;t help myself. The Garmin eMap GPS fits right in the center of my \u0026ldquo;dashboard\u0026rdquo;.\nToday the route was 156 North.\nI never did see the bull.\nSoon I was off. Again I passed numerous historical plaques. I got a kick out of the \u0026ldquo;Caution Bad Bull\u0026rdquo; sign I saw hanging on a fence, but never found the bull. They also have signs about the dangers of rail road crossings for trailers. They do seem to build the train track up higher than I would expect. I haven\u0026rsquo;t seen an American Flag outside of the historical places, but I have seen many, many rebel flags. While not south much geographically, I\u0026rsquo;m definitely in \u0026ldquo;The South.\u0026rdquo;\nI stopped at the Fasmart, to scrounge up some vittles for lunch. Not great fare, including a microwave burrito. However, they had some fresh fruit, so I left with two bananas in my mesh pocket, after consuming another.\nCrossing railroad tracks with trailers causes lightning.\nLunch is served.\nThere were many more historical signs. I read a few, but just snapped photos of many to read later. There weren\u0026rsquo;t as many touristy place to kill time with today. It was just standard bicycle touring, but I could tell that we are starting into the hills.\nI ran across the first historical monument group where you could easily pull over and read with a car, about Savage Station. I don\u0026rsquo;t know how they expect people to read others, except for stopping in the middle of the road. Or bicycle touring, I guess. It is amazing how much you would miss if you were traveling 30-40 mph faster.\nMy touring rig, fully loaded.\nI also took the time to shoot a photo of my touring rig, at the stop. You can see the charging circuit, under the solar panel. The 10 D-cell 12V NiCad battery pack (2 wide, 5 long) is attached forward of the front fork, on the main tube. The blue waterproof bag contains my sleeping bag and Thermorest. The smaller black bag under that is my tent. The last bag towards the back is my Mountainsmith pack. This comes with me everywhere. It is the bag that still allows me to get home if everything else is stolen.\nI photographed a few more historical markers about the Seven Days Battles.\nGarthright House Front\nGarthright House Rear\nI stopped by the Garthright House, used by both sides as a field hospital during the Battle of Cold Harbor. This is a restored house, but only available for viewing on the outside. There is no one here to offer tours. Near the house, soldiers were interned in the family cemetery. They were later moved to the Cold Harbor Cemetery, across the street.\nThe Cold Harbor Cemetery Enterance.\nThe Cold Harbor Cemetery contained bodies of soldiers from so many states. It is amazing how much death man can cause.\nThe withered rock of the tombstones did less to speak to the age of these graves than the single gravestone, consumed by a tree. I wondered if this was the only gravestone \u0026ldquo;eaten\u0026rdquo; by the tree. It certainly had the width to have completely hidden a stone in there.\nTombstone being consumed by a tree.\nCold Harbor Battlefield National Park\nI didn\u0026rsquo;t see the full historical significance until I reached the Cold Harbor visitors center and listened to the narrative of the battles and the serious loss of life here. It seems like more often than not, I\u0026rsquo;m hitting places in reverse order, due to the direction. Hopefully this will even out along the route.\nThe visitor\u0026rsquo;s center was very informative and really broke down the battle. One simple but effective display had animated LEDs along with a voice narrative. At first, it felt like a High School project, but its simplicity made for an easy to follow explanation, with different colors for each side of the battle.\nAnimated light display of battle with vocie narration.\nMeeting the Petes for the first time at Cold Harbor Battlefield\nI caught back up with the Petes after my detour.\nThe Petes pulled in on their tandem, towing a BOB YAK trailer, just as I was leaving the Cold Harbor Visitor\u0026rsquo;s Center. We were both heading for the same campground, so I told them that I would see them there. We talked a little about how their trailer was working. My first touring setup was a Vision R40 pulling a YAK trailer. That is the best option for a tandem like this, if you can\u0026rsquo;t get a touring tandem that can handle bags. I wanted to standardize on one tire size (dual 20\u0026quot; wheels now). My previous setup had 20\u0026quot; from=nt, 26\u0026quot; rear, and the 16\u0026quot; YAK wheel.\nAfter a bit more riding, I detoured to head into Mechanicsville. I needed to find a Radio Shack to fix my bike computer. I also found out yesterday that I have a blown fuse in battery pack lead, so the solar charger isn\u0026rsquo;t really doing anything. I have 4 at home, where they are sure to do me loads of good. Oh, I did bring spares. The wrong ones, as it turns out. Won\u0026rsquo;t even fit. The fuse probably did its job, limiting discharge when something shorted against the charger PCB in travel. So we didnt catch something on fire, but I have not battery pack functionality until I find a replacement fuse.\nI caught back up with the Petes on the way back to route after an unsuccessful quest for electronics parts. The traffic started to get pretty bad. We both pulled off every once in a while to let traffic past. I took a picture when waiting for a bit and you can barely see the Petes up ahead. I decided to take a few minutes to go over my route on the map and figure out dinner.\nI stopped at CVS for some groceries and started following the map to the campground. On the way, I passed the Petes\u0026rsquo; bicycle at a McDonalds. Awful tour food. Either eat at the local hole in the walls or cook your own. That is my plan. That means I\u0026rsquo;ll probably stop at a McDonalds in the future and make myself a hypocrit.\nI have learned to NEVER trust the placement of an icon on the maps. I pedaled down the roads that contained the icon for the campground and wound up asking for directions. After following bad directions, I wound up asking for more. How can people live 2 miles from a campground and not know it? I eventually made it to Americamp, my destination for the night.\nI received a site next to the Petes and found out that they were reading the book when I pasted them having dinner in McDonalds. If I refer to \u0026ldquo;the book\u0026rdquo;, I\u0026rsquo;ll almost always be talking about Bicycling Coast to Coast. The route is more explicit in the book. They took the shorter route (or as some might call it, the RIGHT route.) I told them the short cut I discovered to get back on route tomorrow, that I used to get back to the campground. I can also take it in the morning without feeling guilty, being that I will have ridden that part almost twice.\nOver all, more than 40 miles instead of the 32 miles I expected, with over a 1000 feet of climbing. My legs are going to need a rest day pretty soon, and I\u0026rsquo;m not sure if I can make the 52 miles with another 1000+ feet of climbing tomorrow. I\u0026rsquo;ll see what I feel like in the morning. I\u0026rsquo;m really wishing that my job didn\u0026rsquo;t kill me before I left and I actually had time to do some training rides. I\u0026rsquo;m getting in shape \u0026ldquo;on the job\u0026rdquo;. That is the beauty of a recumbent. You don\u0026rsquo;t have to get your body tuned to dealing with the saddle, just sit in your lawn chair and make your legs go. Until your legs don\u0026rsquo;t want to go.\nSmothering traffic towards the end of the day.\nMy campsite for the night at Americamp\nMy journaling setup with analog modem through StartTac cell phone.\nI included a shot of my laptop and cell phone setup. The keyboard of the Toshiba Libretto 110 is a little cramped, but usable. The StarTac connects with a PCMCIA analog modem. I\u0026rsquo;m starting to get faster typing on this smaller keyboard.\nWhile I sat at a picnic table under a mercury lamp with my power cord plugged into the pole, a few thoughts came into mind. It is a wonderful thing to find a shower after a day out riding, as I know days will come when they won\u0026rsquo;t be available. It is a handy thing to find a power outlet, especially when you battery pack is non-functional. It is amazing how hard a chocolate bar can be when it is this cold. It is harder to break and longer to get going in your mouth. But it still taste the same once it starts melting. Yummy.\n","date":"22 May 2002","externalUrl":null,"permalink":"/blog/2002/05/22/day-3/","section":"Blogs","summary":"","title":"Day 3 - Glendale to near Ashland, VA","type":"blog"},{"content":" Berkley Plantation was my second big stop of the day. I warn anyone wanting to try this route themselves that the 1/2 mile ride into Berkley is TERRIBLE. You see the sign that asks you to enjoy yourself for the next 1/2 mile of authentic Colonial road and you get to try as hard as you can to keep the bike upright. That is one of the toughest roads I have ever ridden on. It might be easier with more shift control in an upright bike. It might not.\nIt is a gravel road with very round rocks. The rocks vary in size from sand to 4 inches. Did I mention the 5-15 degrees of slope for drainage? That is good for flipping your back wheel out whenever it feels like it. Yee-haw, I have now surfed a bike and am immensely impressed with myself for not going down once. Despite the challenge getting in and out, I believe the ride was worth it.\nDrive into Berkley Plantation\nStones making up the wobbly road.\nThis is the site of the first official Thanksgiving in 1619. Benjamin Harrison IV built the mansion on the land in 1726 and married Anne Carter.\nThis was the birthplace of Benjamin Harrison V, a signer of the Declaration of Independence. This was also the birthplace of William Henry Harrison, the ninth president of the United States, and ancestral home of his grandson, Benjamin Harrison, the twenty-third President.\nDuring the Civil War, the plantation was occupied by General George McClellan\u0026rsquo;s Union troops. General Daniel Butterfield composed \u0026ldquo;Taps\u0026rdquo;, played by his bugler, O.W. Norton.\nThe architecture is original and the furnishings are of the period when it was built. The basement contains a mini museum, with paintings and exhibits describing the history of the plantation. This also was a tour worth seeing, given by enthusiastic guides in period outfits.\nThe tour guide mentioned that we take a look at the cement medallion on the side of the house placed by Benjamin Harrison IV when the mansion was built in 1726. I took a wide and close up picture of those. I took more pictures around the buildings on my way to see the landing site of the first Thanksgiving.\nShowing the date of construction for the residence, 1726.\nReplica of part of the Margaret.\nView out of the James River.\nSouth through the gardens and towards the James River, we come upon the monument, ship diagram, and part replica of the ship that carried 38 to land here in 1619. About 20 miles upstream of this point, Jamestown was established on May 14, 1607. More information is available in the signs I photographed below.\n","date":"21 May 2002","externalUrl":null,"permalink":"/blog/2002/05/21/day-2-berkley-plantation/","section":"Blogs","summary":"","title":"Day 2 - Berkley Plantation","type":"blog"},{"content":" Sherwood Forest was the first plantation I visited today along Hwy 5. It holds a few distinctions, such as the only private residence having been owned by two unrelated presidents. William Henry Harrison inherited the property in 1790 and sold it in 1793 without having every lived in the house.\nThis is where John Tyler, the tenth (1841-1845) President of the United States retired, after purchasing the property in 1842. Sherwood Forest Plantation has been owned by the Tyler family continuously, since John Tyler purchased it.\nSign from Hwy 5 (John Tyler Memorial Highway)\nCenter portion of the main house.\nRear center of the main house.\nOverseer\u0026#39;s House\nShot down the length of the house.\nIn a 1616 land grant, this plantation was called Smith\u0026rsquo;s Hundred. Sometime the name was changed to Walnut Grove, showing reference to many trees on the property. The house was built in 1720 and is a classic example of Virginia Tidewater design. This consists of a large house, small house, and kitchen. It had many owners until Tyler purchased the home and 1,600 acres in 1842.\nWhen he purchased the property from his cousin, Collier Minge, he was still in the White House. He renamed the plantation to \u0026ldquo;Sherwood Forest\u0026rdquo; as a reference to his reputation as a political outlaw by the Whig party.\nThe house originally had two separate out buildings, because doing wash and preparing food required fire. It is much nicer to have a kitchen or laundry burn down than lose the entire residence. These three buildings were eventually joined with great halls. Unfortunately, no photography is allowed inside the home. The tour contained many interesting artifacts, beautiful furniture, and grand rooms. It is definitely worth taking if you come to the property.\nHalf of the home is currently an actual residence, so you are not allowed to see the entire building. However, one hall is part of the tour and you can see how it was laid out to accommodate the popular dance of the time: the Virginia Reel. Due to these halls joining the home into one structure, it has the distinction of being one of the longest private residences in the country at 300 feet.\nJohn Tyler was the first vice president to fill the role of presidency after the death of William Henry Harrison. He was previously twice Governor or Virginia, a U.S. Senator, a member of the House of Representatives, a Virginia state senator, and Viriginia House delegate. He re-entered public service as a member of the Confederate Congress of the COnfederate States of America in 1861.\nSherwood Forest was damaged during the Civil War by Union soldiers in 1864.\nThe grounds holds more than eighty varieties of trees, in the 25 acres of serence woodlands, terraced gardens and lawn. Many trees are hundreds of years old and 29 not indigenous to the US. This includes a gingko tree given to Tyler by Captain Matthew Perry returning from the Orient in the 1850s. This retintroduced gingko trees to America. The walking tour of all the various species is a nice diversion around the grounds.\nThe Smoke House was used from 1740\u0026rsquo;s to mid 20th century for curing hams. The plantation provided all the food for the family, house servants, and field hands. At butchering time, meats were bedded in salt, hung from the rafters and smoked by smoldering hickory logs behind selaed doors.\nThis Shingle Maker was patented in 1878. Local cypress trees used to make shingles for all buildings on the plantation.\nThe Wine House was originally used for curing tobacco leaves. It was build around 1660.\nThe outhouse has three different seats. I guess women going to the bathroom in pairs goes back further than I thought.\nMilk House and interior\nLaw Office\n","date":"21 May 2002","externalUrl":null,"permalink":"/blog/2002/05/21/day-2-sherwood-forest-plantation/","section":"Blogs","summary":"","title":"Day 2 - Sherwood Forest Plantation","type":"blog"},{"content":" I had a good night\u0026rsquo;s sleep, despite the temperature. I thought about not bringing my 20 degree bag and purchasing a warmer weather bag to take up less space and weight. I\u0026rsquo;m thrilled that I didn\u0026rsquo;t talk myself into it. I needed every bit of that bag to stay warm last night. I woke just before 7, refreshed and with my headache gone. I\u0026rsquo;m sure that drinking water throughout the night helped counter the dehydration and altitude effects. I immediately went to get my $22 worth of hot shower.\nLoaded and ready to go, once I stow my drying shirt.\nFirst campsite of the trip.\nGetting my oatmeal breakfast going on my camp stove.\nThe light at my campsite for the first time assured me that I didn\u0026rsquo;t do too bad of a job picking it out in the dark. The layer of pine needles and leaves added a nice soft companion to my Thermorest air mattress. I setup my laptop and AA batteries to charge in the outlets along the wall of the restroom.\nThe sky was hard overcast in the early morning, so I wondered about today\u0026rsquo;s weather. I tuned in the local NOAA weather station and listened to the monotonous voice repeating the current and forecasted weather. The report kept using the phrase \u0026ldquo;unseasonably cool\u0026rdquo;. Yes, I\u0026rsquo;d agree with that. The forecast was partly cloudy with a chance of light showers.\nThe small radio I brought along with me can receive all NOAA weather radio stations, FM, AM, and TV station audio. I knew that I would be in some places far from civilization and thought it my best chance if getting useful information on the trip. Like my GPS, Camera, and CD/MP3 player it runs on AA\u0026rsquo;s. My 4 bay charger for the NiMH AA\u0026rsquo;s runs off of 12V, either directly from my large NiCd pack on the bike frame, or via an AC wall adapter. My Libretto laptop also charges off of 12V. I designed everything to be a common 12V, like a car.\nI switched to Morning Edition on NPR and started oatmeal on the stove. It was a cold morning and I didn\u0026rsquo;t move very fast, because I didn\u0026rsquo;t relish the thought of adding a 12 MPH wind chill to the current temperature when I started riding. I mixed a sports drink from some powder and wished I had thought to pack a tea bag or hot chocolate. But then I thought this was the start of summer and I would only want cool drinks. The oatmeal with raisins was tasty. Their addition of heat inside me was even better.\nI pre-packed some oatmeal in the snack sized Ziploc bags, before I left. This is the right size for a morning meal. As I left to clean up the pot, one of these bags full of oatmeal sat on the picnic table. I spent at most 3 minutes in the restroom, which was enough time for a crow to peck into a bag and start eating my oatmeal. Glad I still had the first bag, I dumped the remaining oatmeal in there and chuckled. A very fast opportunistic scavenger. He was able to get quite a bit down, and even more scattered around the table where he will surely be able to claim once I\u0026rsquo;m gone.\nEating breakfast and listening to NPR.\nPecked open hole in bag.\nI gradually finished breaking down camp and getting ready for the day. I left the campground just before 10, starting my first real touring day. I stopped at the camp store to pick up some snacks on the way out. The trick is to carry enough so you don\u0026rsquo;t go hungry, but every bit you carry is going up every hill you meet. However, you are unsure of services, so you error only slightly on the side of too many.\nMy route followed highway 5 towards Richmond for a majority of the day. I was still in a somewhat high population area and there was a considerable amount of dump truck and semi-truck traffic along the road in both directions.\nThis morning was the first time I noticed the 76 bike route signs, marking the Bikecentennial route I was riding (started in 1976). I started taking some pictures of the sign when I spotted them. I still have the chance to head back to Williamsburg, but I didn\u0026rsquo;t even consider it. I wanted to get further away from the traffic and on my way.\nEarly Morning Equine\nFirst Route 76 sign I saw during the trip.\nMost drivers were courteous, I\u0026rsquo;m sure having seen quite a few Trans-Am bicycle tourists over the years. A couple people passed when it wasn\u0026rsquo;t really safe, but a few always do. I waved at all the truckers I passed, trying to build up my trucker karma for those nasty coal trucks I keep hearing about in eastern Kentucky. I\u0026rsquo;m surprised that I haven\u0026rsquo;t seen a dog yet. In 80 miles of cycling that is pretty strange. I guess I will have to wait for those infamous eastern Kentucky dogs.\nI need to learn something positive about eastern Kentucky, as those are the only two things I know about it: terrible trucks with bad drivers and terrible dogs. That is the only thing bicycle tourists riding through there talk about. I\u0026rsquo;m determined to find something nice about the area. I have a whole state to cross while I think about it.\nSS Sub Shop\nLunch for the day.\nI had considered stopping to have a few of the snacks I picked up at the camp store and was happy to see the sub shop at 11:30. I devoured a pretty good hot turkey and cheese sub, fries and a Pepsi. I told myself I would eat better on this trip, but it was really good! With each stop, the basics are always handled. Fill up your water bottles and get rid of the water you drank during the last couple hours.\nRolling dow nthe road\nI\u0026#39;ve got a few miles to Richmond\nStopping for a break and photo\nI had seen the ABC ON, ABC OFF, ABC ON-OFF at restaurants and stores during my two days in Virginia. I wound up researching this after the trip was over and learned that it stands for Alcoholic Beverage Control. Apparently, after prohibition ended, states came up with various systems to tax and control alcoholic beverage sales. In an alcoholic beverage control state, the state is essentially a monopoly and operates stores where retailers can purchase their liquor to sell. ABC ON means the location has a license to sell alcohol for consumption on the premises. ABC OFF means the location can sell alcohol for you to take away. While interesting to figure out, this really didn\u0026rsquo;t concern me much, not being a drinker of much stronger than soda.\nNext stop was Sherwood Forest Plantation in Charles City County. This is the first of 4 major and many minor Plantations within 14 miles along highway 5. See the upcoming side trip post for more information and pictures. I spent about an hour touring the grounds before heading out again.\nCharles City County, perhaps one of the most confusing County names I\u0026#39;ve come across.\nHalf of the father/daughter team that passed me.\nPassing over a cool draw bridge\nI was passed by a father and daughter team, also doing the Trans-Am. They were running light for the first day, with no bags. They mentioned that a vehicle was bringing them. I didn\u0026rsquo;t gather if they were heading all the way unloaded, or just for the start. Either way, I will probably never catch back up with them. Loaded touring is much more effort than doing joined day rides.\nEvery time I see an adult on a bicycle, I no longer despair for the future of the human race.\n- H. G. Wells I then stopped at Berkley Plantation, directly on the James River. This land is home to many of America\u0026rsquo;s firsts, including the first Thanksgiving on Dec. 4th, 1619. See the side trip post for more details of this visit.\nI left the Berkley Plantation after 5:30 and headed to Glendale. I stopped on the way to pick up some food for dinner. This has been an interesting transition already. The grocery stores available are a far cry from the huge supermarkets we get used to in modern life. Tonight\u0026rsquo;s dinner was plucked from a small gas station and grocery. The selection was poor, but the cyclist was hungry. Hunger makes anything taste great.\nEn route to Willis United Methodist Church, I stopped at the location for the last of the Seven Days Battles, Malvern Hill. It is amazing how dense history is packed along this stretch of road. That was a large factor of why this route was chosen for the Trans-Am trail during the planning in 1974-5. What I am seeing is only a small fraction of what is around. While riding a bike, it is a simple thing to pull off and read a sign noting some historical significance. Nearly all of these would have been missed in a car and the small paragraph on each sign doesn\u0026rsquo;t come close to covering the historical significance of the location.\nThe residence of the Methodist minister, a landmark of the Battle of Malvern Hill.\nSeven Days Battles Information\nSeven Days Battles Information\nSeven Days Battles Information\nSeven Days Battles Information\nSeven Days Battles Information\nSeven Days Battles Information\nSeven Days Battles Information\nSeven Days Battles Information\nSeven Days Battles Information\nSeven Days Battles Information\nWillis Church Historical Plaque\nPastor Manning Harrell was a wonderful host, when I pulled into the Church around 8:30. We had a chance to chat, while I was setting up camp. He is retiring at the end of this month, and he has really enjoyed meeting all the cyclists in the five years he has been at the church. Apparently the new pastor is also excited about hosting cyclists, so this fine overnight stop on the trail will be going strong for some time.\nSome historical signs along the route today.\n","date":"21 May 2002","externalUrl":null,"permalink":"/blog/2002/05/21/day-2/","section":"Blogs","summary":"","title":"Day 2 - Jamestown to Glendale, VA","type":"blog"},{"content":" The bicycle tourist is greeted with two choices when starting their tour.: Do I ride away from my home or pack up everything and take alternate transportation to the start?\nFor local tours, the loop method is a good idea. Start off in one direction and ride in a big loop until you end up back home. If I had a year\u0026rsquo;s time, not just a couple months, I would enjoy a loop tour of the US. It would be ideal to leave Indiana, riding in the northern states during the warmer months and the southern states during the cooler months. I didn\u0026rsquo;t have the few extra weeks it would take to get to Virginia.\nFortunately, My dad has a good flying friend with access to a large enough plane to get me and my gear out to the start.\nDave and dad (right) about to pilot the Baron from Bowman Field\nAt cruising altitude in the Baron\nDave is a part owner of a Baron twin engine aircraft with enough space for Dave, my dad, me, and my gear. Dad and I arrived at Bowman Field in Louisville, KY around noon. We loaded up the plane as soon as Dave arrived. The local Air Traffic Controllers allowed us to depart a little past 1 PM.\nThe day had a dreary cast, under a solid fluffy blanket of clouds. An occasional mist hit the windshield and we sampled small rain showers, on the climb to our cruising altitude. Due to icing at our intended altitude of 11,000 feet, Dave asked for and was cleared up to 13,000 feet. The Baron is not a pressurized cabin, so air pressure inside is the same as the air pressure outside. This requires oxygen for the pilot, above 10,000 feet. Oxygen is required for other members of the plane for altitudes above 14,000 feet for short times and lower altitudes for longer durations. There were only two sets of oxygen, so Dad and I switched off. I went more without than with, because Dad wanted to do some of the flying.\nThis gave me a chance to practice a pressure breathing technique I had read about for those entering high altitude environments without supplemental oxygen. The problem isn\u0026rsquo;t with the percentage of oxygen in the air at higher altitudes; it is a problem with the pressure of the air in your lungs. The lower pressure means less total volume of air and therefore less total volume of oxygen. The low pressure also doesn\u0026rsquo;t pressing the oxygen molecules to the sides of your lungs to get it into your blood stream. The pressure of air in your lungs can be increased by forcing your lips together, while your diaphragm muscles force the air out. (This technique would later prove beneficial when climbing over Hoosier Pass in the Rocky Mountains.)\nIt helped things somewhat, but I was always ready for the oxygen when it was offered. There were a few times that I became slightly woozy, with just the very beginning stages of hypoxia. It was an interesting experience, which gave me a headache that would last the rest of the day. My slight dehydration was also a co-conspirator in my cranial crankiness.\nThe experience of flying over mountains I would soon see again was somewhat surreal. The entire trip out took around 2 hours by plane. The trip back to passing within 50 miles of home will take almost a month by bicycle. Just when we descended through the cloud layer and opened up many photo worth scenes, I realized my spare batteries were packed out of reach in the back. My camera went dead as Newport News Airport came within view.\nUnloading the plane at the Newport News Airport\nBike loaded and ready to tour\nThe shot I am most annoyed for missing was the giant aircraft carrier. It was a beautiful view and seemed bigger than the grass strip in Scottsburg, IN, where dad taught me how to land our Aeronica Champ. An F-18 is quite a different animal, with a stall speed nearly 5 times the speed we can get that Champ down to. But we didn\u0026rsquo;t have arrestor wires, just bouncy grass.\nWe landed at the Newport New Airport just past 3 PM. After taxiing to the FBO (Fixed Base Operator), the \u0026ldquo;gas station\u0026rdquo; of an airport, we began unloading my bike and gear. It took a few minutes to reassemble everything and get ready to ride over to the start.\nInstead of doing that, one of the FBO employees was nice enough to give me a ride to the Yorktown Visitor\u0026rsquo;s Center. So I loaded the bike into a van and went for a quick 9 mile drive. By the end of the day, I was really happy that I didn\u0026rsquo;t need to spend almost an hour doing this ride.\nAfter a second time assembling and loading the bike, then checking over everything, I was off to find the Victory Monument. This is the official start of the Trans-American trail.\nI stopped 100 feet later. I couldn\u0026rsquo;t get my bike computer to work. I hoped we just bumped the sensor just away from the magnet on the spoke. Any experienced cyclist has run into that one a few times. I moved the magnet until it made a slight \u0026ldquo;whack\u0026rdquo; sound on the sensor, then backed away every so slightly. But I still had no speed indicated, so that wasn\u0026rsquo;t the problem.\nI remembered having to unwind the handlebars after we set the bike down out of the van. Sure enough, the computer wires were ripped raggedly apart around the pivot point. I\u0026rsquo;ll be in need of my first repair sooner than expected. Anyone know where I can borrow a soldering iron, a little wire, and some heat shrink?\nTimer based shot at the Victory Monument\nTop of the Victory Monument.\nI took some pictures at the Monument before heading for Williamsburg. I attempted to get another tourist to take a picture of me, but could not locate anything when I reviewed the screen after they left. I set it all up and they just needed to press the button. I immediately saw the advantages of bringing a digital camera. Had I been shooting film, I would have assumed the picture would have already been taken at the monument. I used the self timer for the first time and a few seconds later I had the photo.\nSide of the Victory Monument\nSide of the Victory Monument\nSide of the Victory Monument\nSide of the Victory Monument\nPlaque at Victory Monument\nPlaque at Victory Monument\nPlaque at Victory Monument\nPlaque at Victory Monument\nJust past the Victory Monument, there is a road that doesn\u0026rsquo;t allow motor vehicles. I found the first benefit of bicycle touring. I rode along the 7 houses built over 200 years ago, when Yorktown was Virginia\u0026rsquo;s leading seaport. Cannon fire damaged many of the buildings during the Siege of Yorktown, the last major land battle of the Revolutionary War, which ended on October 19, 1781. Sorry, I didn\u0026rsquo;t take any photos for you.\nAfter riders start at the Victory Monument, it is ceremonial to dip your back wheel in the York River as the Atlantic Ocean representative body of water. I thought about that. I tried to lift my bike. I thought about carrying my bike over the sand and back. Then I considered unloading it and making that slightly easier. Then I just took another picture from a different angle and called it good. I probably would have done it, if I had more time in the day. But time was moving, so I needed to as well.\nDipping of the tire in the Atlantic... maybe just a photo.\nGeorge Washington Memorial Highway (Hwy 17) crossing over the York River.\nThe colonists named this river first Charles and then York, both as an honor to the Duke of York. It was known to the Indians of the region as Pamunkey, a name still used by a smaller tributary of the York River today. While only 26 miles in length, the tidal waters of the York River flow over the deepest natural channel of any Chesapeake Bay tributary.\nEntering Colonial Parkway\nMileage signs come so much slower than in a car, so I got excited each time I saw one.\nAcross the York River is the site of Werowocomoco, an Indian village that was Powhatan\u0026rsquo;s \u0026ldquo;chiefest habitation\u0026rdquo; in the early period of the Jamestown settlement. This was the location that John Smith was held prisoner in 1607.\nThe ride was really beautiful, but there were so many things to see that I needed to ride right past. It was after 4 o\u0026rsquo;clock, with only 4 hours of sunlight left, and I had no clue where I was going to stay tonight.\nViews of York River\nViews of York River\nViews of York River\nI would learn that it is often easier to find places to stay in less congested areas (other than motels and hotels). In the bigger cities, cars are king. So was it most places here. I pulled into the Williamsburg Visitor\u0026rsquo;s Center around 6:30, as everything was closing down. I received pointers to the lower priced hotels in the area and where the restaurants were hiding. My lunch wasn\u0026rsquo;t large before I left Jeffersonville and I was famished. I found a Golden Corral. There is a reason why there are few \u0026ldquo;All You Can Eat\u0026rdquo; buffets along the Trans-Am trail. A cyclist can burn thousands of extra calories a day. And buffets can go out of business.\nThe restaurant breathed tourists in and out as I ate and read about the route ahead. They all seemed to be taking their first gasps of vacation, after the school year finished. As long as the food doesn\u0026rsquo;t run out, the best you can hope for is a busy buffet. Food turned over faster, tastes better. Hunger also has that effect on food. While I enjoyed resting, reading, and people watching, I knew daylight was fading. My choices were hotel or not. The hotels were right here. If I stayed in a hotel or motel, I could ride back into Williamsburg for a visit tomorrow. But this is a bicycle tour, not a tourist trip. I wanted to be some miles under my belt and away from all the people and traffic, so off I rode into the fading daylight.\nI left the restaurant a little after 8, heading towards Jamestown. This was the best option I could come up with for the night. Soon the darkness pushed back the day and I stopped to rig for night riding. I turned on my rear lights and flipped the switch on my \u0026ldquo;dashboard\u0026rdquo; to enable the headlight. I knew these were going to be needed through out the trip, but didn\u0026rsquo;t think I\u0026rsquo;d be riding into the night during the first day out. I finally pulled into the campground after 9 and was greeted with a $22 campsite! That is quite a bit of dough for a plot of grass and the use of a shower and bathroom. Supply and demand was in full force in Jamestown. While I knew $22 wasn\u0026rsquo;t the most I would spend for a night, as I planned a few motel stays, I hoped it was the most I would ever spend for a campsite. Oh well, where else am I gonna go?\nFaking sleep to take a picture on my outfit for the night.\nWith my tent pitched and shower taken, I fired up my little Libretto laptop and started typing up today\u0026rsquo;s journal entry. This little laptop is about the size of a Disney packaged VHS movie. The keyboard is smaller than normal and I had not yet adjusted to it. The headache still hung around as I typed, so I constantly sipped on water. The color of my urine had assured me that I was still dehydrated or someone slipped a bunch of vitamin B into my food at the Golden Corral. I assumed the former. (Sorry if that was TMI.)\nThe night was unseasonably cold. Temperatures dropped to 34 over night. My 20 degree mummy bag felt nice over the small Thermarest air mattress. The full hood was too warm, but a small fleece cap was just right. With my water bottles available for sipping a few times through out the night, I slept well.\n","date":"20 May 2002","externalUrl":null,"permalink":"/blog/2002/05/20/day-1/","section":"Blogs","summary":"","title":"Day 1 - Yorktown to Jamestown, VA","type":"blog"},{"content":" All you need in this life is ignorance and confidence, and then success is sure.\n- Mark Twain Today I completely loaded up my RANS Rocket. I\u0026rsquo;ve built many custom components to make it into a cross-country touring machine. Unfortunately, I haven\u0026rsquo;t had as much time getting ready for the trip as I wanted. I took smaller projects, due to my fixed departure time, and all of these ran long. Due to this, both equipment and physical shape preparation was lacking. I will just have to get in shape by doing.\nUnfortunately, this lack of preparation chewed up almost two weeks of my time off. I spent a week getting my belongings into storage and moved out of my apartment. I spent another week finishing equipment builds and other touring preparation.\nSide view of touring rig\nRear view of touring rig\nFront view of touring rig\nI also finished up the code for my PHP based email journal and mailing list. It may be hard to connect over the analog modem through my Star-Tac cell phone, even just to send updates. So, hopefully I won\u0026rsquo;t have to fix code while on the road. I can currently compose updates as an email to a certain address, which will post and distribute them when the email is sent.\nTomorrow, I will be flying out to Newport News Airport and making my way to the start of this adventure. After more than two years of planning, it is really nice to get this started. Hopefully I will think the same thing a week or two into it.\nI\u0026rsquo;ll see you on the road.\n","date":"19 May 2002","externalUrl":null,"permalink":"/blog/2002/05/19/day-0/","section":"Blogs","summary":"","title":"Day 0 - Final Shakedown Ride","type":"blog"},{"content":"","date":"2 March 2002","externalUrl":null,"permalink":"/tags/cycling/","section":"Tags","summary":"","title":"Cycling","type":"tags"},{"content":"I have just finished building my first rear wheel using The Bicycle Wheel as a guide. This book will teach you the technical aspects of the bicycle wheel in both structural principles and practical methods. After a couple hundred miles on my new wheel, it is still true as an arrow.\nThis book debunks myths and gives you the confidence to repair, build, and rebuild wheels. I can honestly say that I no longer fear any wheel repairs. It has given me one less thing to worry about during my upcoming cross-country trip.\nThe only warning I can give is about Jobst Brandt, not his book. If you run across him in the Newsgroup or in person, you will quickly find out that he is a very opinionated person. Most of his opinions are correct, but don\u0026rsquo;\u0026rsquo;t ever argue with him. Jobst has to be one of the bigger know-it-all jerks I have seen on the Usenet. I guess everyone has their failings, but his book is first rate.\n","date":"2 March 2002","externalUrl":null,"permalink":"/blog/2002/03/02/the-bicycle-wheel-by-jobst-brandt/","section":"Blogs","summary":"","title":"The Bicycle Wheel by Jobst Brandt","type":"blog"}]