1000 Miles or Bust!

Take a Hike…

Cute SVN tricks

Best procedure for importing an existing project into a new svn repository

This is the best procedure I’ve seen for importing an existing project into SVN. We first create a new svn repository (I prefer to use FSFS instead of BDB). Then we make an empty new directory inside that repository and checkout the empty working copy into the project’s root directory. An “add *” will then add everything into the project, and then a long initial commit imports the project into the new svn repository’s directory.  The killer feature is that this turns your existing code into a working copy.

svnadmin create --fs-type=fsfs /home/username/repos/projectname
svn mkdir file:///home/username/repos/projectname/project-root-dir -m "Make a directory in the repository to correspond to /project-root-dir"
cd /project-root-dir
svn checkout file:////repos/projectname/oproject-root-dir .
svn add *
svn commit -m "Initial version of projectname"

Removing all the SVN subdirectories in one bash command line

SVN’s most kludgey feature is that it uses multiple .svn directories inside every subdirectory in your project.  This makes it quite difficult to remove a copy from version control by deleting all the .svn subdirectories, particularly in a  large and complex project.  Very uncool compared to say, mercurial, which sensibly puts all its files inside one .hg directory tree at the project’s root level.

So here is a unix command to remove all the .svn directories from version control:

rm -rf `find . -name .svn`

Use FSFS instead of Berkeley DB

Another somewhat kludgey feature of svn is that it uses an antiquated db to store its files. But if you specify a FSFS repository in your create command, you can create your repository using the FSFS filesystem. FSFS  has two killer features–your svn repo will be portable without doing a database dump, and it makes backups simpler and more reliable.

svnadmin create --fs-type=fsfs /home/username/repos/projectname

Useful reference links

Submit to Digg

August 20th, 2008 Posted by Tim | Hacking | no comments

WordPress 0.62 released (security patch)

WordPress Spreadsheet 0.62 is a security patch release that fixes several SQL-injection holes. All users are strongly advised to update their plugin. As usual, you can download a zip file containing wpSS v0.62 from the WordPress SpreadSheet website.

Changes in this release:

  • Security patch. Fixed several security (SQL-injection) vulnerabilities

Submit to Digg

April 24th, 2008 Posted by Tim | Hacking | no comments

Switch from Yahoo Calendar to Google Calendar

I finally got around to switching my calendar from Yahoo to Google this weekend. It was, to say the least, an arduous process, and so I’ve written up some tips on syncing a Yahoo calendar with a Google calendar and the rest of the world’s iCalendar standard. Officially, Yahoo claims it will eventually provide its calendars in iCalendar format, someday… so I just hacked it, today.

I’ve been disappointed in the glacial pace of Yahoo’s web tools development for some time now, but I have been using Yahoo calendar for several years and I didn’t want to lose my appointment history, what with random phone numbers and emails and etc recorded in the entries. But since I abandoned Microsoft Outlook for Thunderbird mail a couple of years ago, I’ve been unable to sync my desktop calendar with my online calendar. In fact, I had pretty much given up bothering to keep a desktop calendar, although I had played with Mozilla’s Sunbird and felt it had promise. Now that the Lightning calendar extension for Thunderbird has finally become relatively mature (0.8 is due out shortly), I had decided to it was time to keep a synchronized desktop calendar again.

The process was not without pitfalls however, especially since Yahoo calendar does not export standard iCalendar files. It exports in a marginally useful CSV format that broke both the auto-import function in Google calendar and broke the automated Yahoo CSV to iCalendar convertor I link to in the resources section below. While in Google Calendar I just had to delete the erroneous calendar, Lightning hung so badly when importing the converted iCalendar file that I had to kill the process manually and the go into my Thunderbird profile directory and rename the (sql-lite) SDB file that Lightning uses to store calendar entries, losing the (mercifully few) entries I had put in by hand. I’m still not sure if the failures were due to the sheer quantity of entries (since the CSV file represents repeating events as single events, there are many more entries than in iCalendar format), or if the problem lies in the failure of the Yahoo CSV exporter to put a valid timestamp in certain fields (again apparently for repeating events), or something else, like problems with how Yahoo exported some long lists of tasks I had in the description field. In short, I had to edit the CSV file with OpenOffice before it was acceptable to Google Calendar or Lightning to import.

But all the difficulties are not just with Yahoo. There are also some quirks as to how Google Provider imports and works with with calendar files, particularly in that Google Provider doesn’t cache the online calendar locally and hence won’t fetch your calendar if you aren’t online (e.g., in an airplane). A more robust solution is to use the Java-based GCAL daemon to cache the calendar locally, and then just point Lightning to the synchronized ics (iCalendar) file.

While some useful links to my internet research follow later in the Resources section, first I’ll give a step-by-step synopsis of what actually worked.


  1. First I downloaded and installed the Thunderbird add-on extensions Lightning and Google Provider. Then restart Thunderbird. [Alternately to using Google Provider (which requires you to be online to see your calendar), you may prefer to run the GCAL daemon to sync to a local version of the iCalendar file with Google (note: it’s a Java ap). Also, GCAL can also sync with other calendar programs like Apple’s iCal. So if all you are looking to do is convert your Yahoo calendar to iCalendar format or into Google Calendar, you obviously won’t need to do this step.]
  2. Next I went to my Yahoo pages and exported my Yahoo calendar as a CSV file. Specifically I chose Yahoo Calendar–> Options–> Import/Export–> Export to Outlook as a CSV file.
  3. I’ll save you the trial and error that happened next by suggesting that you now open up the CSV file in OpenOffice Calc or Excel. The first thing I did was condense the file by deleting the 25 years or so of future repeating events at the bottom of the CSV file. After browsing through the bottom, I discovered my important future events ended with a conference I have scheduled in late 2009, and I just went through and edited out extraneous repeating events between today (March 2008) and the last important event I had actually scheduled. However, I made sure to leave one copy of each repeating event I wanted to keep so that I could set up the repeating properly in Google once I completed the transfer (see the last step).
  4. Next, I turned on the Data-> Autofilters functionality of the spreadsheet programs and then used the filters to inspect the remaining data. By setting the filters appropriately, I was able to delete some of the other potentially troublesome fields (e.g. lengthy task lists in the description field) or copiously repeating entries for past activities. Alternately you could do this by writing a quick “delete row if cell value equal this value” macro–that was much quicker for deleting really numerous entries.
  5. After saving the CSV file, I imported it using the Google calendar CSV import feature. To do that, I first created a new Google calendar called named “Old Yahoo Calendar” (from experience, I can tell you it is wise not to risk corrupting an existing calendar). Then choose the little drop down arrow to the right of the word “Add” in the My Calendars sidebar, and import the edited CSV file, making sure to direct it into the new empty calendar.
  6. Inspect the calendar and see if the calendar import has worked appropriately. You may still need to do more data massaging of the CSV file…I did.
  7. Next, Thunderbird must be setup to show your Google calendars. To use Google Provider (simpler), just choose File–> Create–> Calendar–> On the Network –> Google Calendar. The location field should be XML address of your Google calendar. You can find that by clicking on the little down arrow by the name of your calendar (e.g. “Old Yahoo Calendar”) in the My Calendars sidebar of the Google interface, and then clicking on Calendar Settings in the popup menu. Right click on the XML icon next to the private address and choose copy link. Paste that link into the location field on the Thunderbird/lightning setup page and you are good to go. [Alternately, if you are using the GCAL daemon, you’ll need to choose File–> Create–> Calendar–> On the Network –> iCalendar (ICS) and specify the location of the GCAL ics file.]
  8. Last, you will need to edit any repeating calendar entries to convert them from single events. To do this, I chose to copy the events out of my “Old Yahoo Calendar” and into my main Google calendar from within Google’s interface rather than from within Lightning’s, largely because Google’s copy event function seemed to pickup my default Google calendar preference to send me a reminder email one day in advance of a new event while Lightning didn’t. After I made sure each birthday, regular weekly or monthly meeting, future multi-day conference, upcoming trip out of town, etc., was set to repeat and notify me automatically, I deleted the future entries out of my old Yahoo calendar and was done. The past entries I simply kept in my old Yahoo calendar for reference.


Submit to Digg

March 9th, 2008 Posted by Tim | Hacking, Every last post | one comment

Floating a rounded corner box inside a WordPress post entry

How to apply div tags from within the WordPress RCE using the content filter in order to get a rounded corners, floated text box

The problems were:

  • that I and my client wanted to float a rounded corners pullquote box inside a WordPress post
  • but… the WordPress rich content editor TinyMCE strips out div tags and many other html tags, even when entered in the “code” view window
  • moreover… my client doesn’t want to type code and I would like the client to be able to write the post entirely by themselves

The solution for the client was to…

Submit to Digg

October 7th, 2007 Posted by Tim | Hacking, Every last post | one comment

Isabelle, O Isabelle

Lake Isabelle

A place that was once loved to death, Lake Isabelle looks well on the way to recovery. There are still too many hikers here, but most stop at lake and do not continue to the Glacier. Fools.

Bridge Below Lake Isabel

South St. Vrain Creek Above Lake Isabel

Colombine Patch


This is a photoessay: All photos should appear in higher resolution when clicked.

Submit to Digg

August 5th, 2007 Posted by Tim | 1000 miles, Every last post | 2 comments

WordPress Spreadsheet 0.61 released

WordPress Spreadsheet 0.61 is a maintenance release that fixes a bug when the plugin was run on WordPress installations that used custom permalinks. As usual, you can download a zip file containing wpSS v0.61 from the WordPress SpreadSheet website.

Changes in this release:

  • Bug fixes. Fixed bug caused by relative path addressing when used with WordPress permalinks.

Submit to Digg

August 4th, 2007 Posted by Tim | Hacking, Every last post | no comments

Crater Lake Backpack Trip

Makeshift Bridge over Cascade Creek

The gang and I went backpacking up to Crater Lake from the west side of the Indian Peaks. This is a photoessay: All photos should appear in higher resolution when clicked.

Cascade Falls

Lone Eagle Peak

Sunset on the Shoshone-Apache Ridge

Sunset on the tip of Lone Eagle Peak

Tim at Cascade Falls

Submit to Digg

July 29th, 2007 Posted by Tim | 1000 miles, Every last post | no comments

WordPress Spreadsheet (wpSS) version 0.6 released

WordPress Spreadsheet 0.6 is a new development release that offers numerous new features and bug fixes over the previous major version. As usual, you can download a zip file containing wpSS v0.6 from the WordPress SpreadSheet website.

Changes in this release:

  • Ranges. It is now possible to use the mouse to select a range of cells and perform most operation on cell ranges.
  • Cut, Copy and Paste. Ranges may be copied and pasted using the standard keys (ctrl-x, ctrl-c, and ctrl-v). Formulas in the ranges should automatically adjust.
  • Data Interchangeability. A range of cells may be copied to the clipboard and pasted into other spreadsheet programs, or the contents of the clipboard may be pasted into a cell and if it is a range of tab separated values it will paste the entire range into wpSS.
  • Increased AJAX Functionality. wpSS now accepts a wider variety of keyboard input, including pgUp, pgDown, ctrl-Home and ctrl-End for navigation within the spreadsheet. Ctrl-s saves the spreadsheet (when so permitted by the WordPress administrator).
  • Bug fixes. Several minor display bugs were fixed to standardize the height of the spreadsheet within a WordPress blog entry.

Please read the release notes for greater detail.

Submit to Digg

July 23rd, 2007 Posted by Tim | Hacking, Every last post | one comment

Chicory Bears on the Big Bluestem

Chicory Wildflowers On Big Bluestem Trail

Because of the heat lately, Francoise and I headed out on a 6 am hike this morning. Just our luck—we get up early but have cloud cover and cooler weather, but we still appreciated the early morning start. And it turned out to be a spectacular hike. As you can see from the photo, there were literally seas of chicory flowers shimmering on lower Big Bluestem this morning—making it clear how the trail gets its name. As it turns out, Chicory are day-bloomers—they rarely last into the heat of the afternoon, but hopefully the cloud cover will persist long enough for the build-up-a-thirst hike we have planned for tonight. In any case, they will probably be there the next few mornings, and are well worth the effort.

Early morning also proved to be the right time to see abundant wildlife. In addition to sundry deer and rabbits, we spotted a faun. But the wildlife highlight of the morning came a bit later when, near the junction of the Mesa trail and the northernmost Shadow Canyon cutoff, we almost walked straight into a large black bear (see photo). Large Black Bear On Big Bluestem TrailHe was placidly feeding on berries in the bottom of the draw, about twenty-five feet off the trail. He perked up his head, looked at us a moment, noted the absence of dogs, and resumed feeding. We stayed still long enough to get a few photos of him, and then as we approached closer he showed what he thought of us by turning around and taking a crap. And in the woods, no less…

Photos courtesy of FEC.

Submit to Digg

July 19th, 2007 Posted by Tim | 1000 miles, Every last post | one comment

Cottonwood Pass Peak Bagging

Atop North Jones Mountain
Homeward bound from a week of hiking from Eagle to Crested Butte, we stopped for one last quick jaunt up North Jones Mountain, daring the thunderstorms in the distance to outpace us. Ok, it wasn’t really that close. If it was, we would not have summited. But for a driving day, not a bad little hike. Of course, starting at a 12000 foot pass helps.

Submit to Digg

July 8th, 2007 Posted by Tim | 1000 miles, Every last post | no comments

Copper Creek Teaser

Copper Creek Falls

Copper Creek Trail

Today was a short hiking day as Paige and Seth were having their rehearsal dinner in Crested Butte, but we managed to make it to the mouth of a very intriguing valley up Copper Creek. When I was a bit younger and perhaps less wise, I and a couple of friends ski-backpacked up this valley, over Triangle Pass, and down to Conundrum Hot Springs. I haven’t back since. I must admit, I still wonder why. And today, I have to turn back too soon. But I will be back.

Submit to Digg

July 7th, 2007 Posted by Tim | 1000 miles, Every last post | no comments

Maroon Bells under the Maroon Bells: Stolen Shots in Rustler Park

Rustler Park (Maroon Bells dead ahead over that ridge)

Sometimes, if you are lucky, you get to take a day hike in a sublime paradise. Today was my day. With two large, unbridged creek crossings to keep the riff-raff out, this spectacular high alpine wildflower hike is simply beyond words. So I won’t bother, other than to put the occasional caption on this photoessay.

Maroon Bells Under The Maroon Bells

Red Bells

Orange Dazzlers

Dead Wood And Wildflowers

Precarious Peak at the head of Rustler Park

Precarious Peak marks the head of a sublime valley and the trail’s end for a spectacular day. All photos should appear at a higher resolution when clicked.

Submit to Digg

July 6th, 2007 Posted by Tim | 1000 miles, Every last post | no comments

Land of the Obvious

The Swamp Castles
They say that Ohio is a plain-spoken place. Off Ohio Pass, in a little known valley between that separates the West Elk, Storm Ridge and the Anthracite Range, a trail climbs to the base of the Anthracite massif before turning south toward Soapy Basin. To the southwest you can spot the Castles, or the Swamp Castles I prefer to think of them. Someone here had a dry, plain-spoken sense of humor, as you can no doubt tell from the picture of swamp flowers taken at the aptly named Swampy Pass. I am glad it was midday when I passed it by, though when I returned again at 3 I startled a family of ducks happily summering at 10000 feet. Swampy PassThe trail, which borders a slough on the pass for some yards, gave the appearance that I was chasing the ducklings, and so I was charged by a daffy duck, wings aflap, trying to distract me as if I were a predator while the little ones hid in the tall fronds.

Submit to Digg

July 4th, 2007 Posted by Tim | 1000 miles, Every last post | no comments

Beckwith Pass Beckons

Beckwith Pass Wildflowers
The biggest risk in starting the second hike of the day late, in the early evening, is that you will be seduced to linger too long, too late, to enjoy the interplay of the long light and creeping shadows. When that hike is replete with some of the most amazing wildflower meadows I have ever seen, as was Beckwith Pass, Beckwith Pass Wildflowers Bathed in Long Lightthat call becomes a siren among sirens, keeping you and your camera until you are sure to stumble back to camp long after dark. The part of me that is still a photographer can never regret a proper dusk hike though. There could never be enough time spent in the West Elk Wilderness, one of the least visited and most spectacular areas of the state. This is the first of a series of photoessays on the blog, meaning that you can click these photos and see a higher-resolution jpg to appreciate this amazing place.

Submit to Digg

July 3rd, 2007 Posted by Tim | 1000 miles, Every last post | no comments

Up On Crooked Creek

Crooked Creek Pass
Today was the first high peak summit of the year, the nearly 12000 foot high Mt Thomas, which is really just a minor peak on the enormous massif that divides the Frying Pan River from the Colorado River Valley above Eagle. A beautiful but fairly gentle climb with excellent views of both the Sawatch and the Elk Ranges Orange Mushroom from atop the 12000 foot ridgeline of Red Table Mountain, it would make an excellent early summer backpack someday (note to self). The wildflowers were amazing, but what really caught my eye was this little guy. A mycologist, however, I am not. Any suggestions as to what this orange fungus is called? He was over a foot long and six to eight inches across.

Submit to Digg

July 2nd, 2007 Posted by Tim | 1000 miles, Every last post | no comments

A Blurry Moose Lost on the Lake

Moose on Piney Ridge
Ah, those early morning hikes. We woke up early to try to get some miles in while the forest was still cool, even though we had camped at 8300 feet. Moose on Lost Lake TrailSetting off through swaths of mosquitoes, we surprised the elusive Central Colorado Moose taking an early morning mudbath in a wallow just off the Lost Lake Trail on Piney Ridge above Vail. Between the dim early morning light and camera shake resulting from having to shake off moose-sized mosquitoes, it was less than ideal photographic conditions. However you have to take your moose photos where you can–this is only second time I’ve ever seen moose in the state.

Submit to Digg

June 17th, 2007 Posted by Tim | 1000 miles, Every last post | no comments


Redundant Wilderness SignToday’s main hike was one of those picture perfect hikes on a picture perfect day days at a picture perfect place. For the aesthetically-impaired, I’ve composed this photograph. I still wonder who had the chutzpah to put up this sign–King Bluntman?

This photo was taken near Piney Lake on the Piney Creek trail outside of Vail, looking up into the Eagle’s Nest Wilderness. Wilderness it may be, but don’t expect solitude–at least until the trail gets steep a mile or two in! 6.25 miles on this hike–but one of three today on Piney Ridge.

Submit to Digg

June 16th, 2007 Posted by Tim | 1000 miles, Every last post | no comments

Gotta get away (from the ‘resort’)

Stag GulchI’m not one to spend much time at resorts. I dislike the encapsulated, packaged feel of ‘outdoor fun’ that one finds at such places. But Randi had a conference at Beaver Creek, and so up we went. After trying–and failing–to have any reasonably nice experience hiking right from the resort hotel, we went on a short drive down US 6 and found this marvelous trailhead at the end of a side road up a promising draw. A spectacular Friday afternoon with no other people on the trail, and certainly no trucks and front-end loaders sprucing up the resort for summer.

Submit to Digg

June 15th, 2007 Posted by Tim | 1000 miles, Every last post | no comments

Nextbus, but not the next RTD bus stop (Poor Design)

I’ll readily admit don’t ride the bus much. I much prefer point-to-point transportation, such as riding my bicycle. But occasionally I need to go to Denver for an event, and rather jump in my car and add to that single occupancy vehicle traffic jam known as the Boulder-Denver turnpike, a few months ago I thought I’d take try to take the bus.

There’s a nifty new web service called NextBus.com that offers realtime estimates of when the next bus will arrive for my local bus service provider, RTD. You just point your browser to the appropriate web page for your route and direction of travel, and bingo, an estimate of what time a bus will be at your stop. It’s even accessible from a cell phone browser. Great idea, right? But poorly designed.

NextBus screenshotYou can see from this screenshot that the NextBus service lists “Broadway at Ash Avenue” as a bus stop for the BX route (the Boulder-Denver express). But when I went to that bus “stop”, I watched a BX bus pass me by despite my attempts to flag it down. If a bus rider can’t figure out where to catch the bus, what good is a web service that tells you when it arrives there?

After an annoyed set of emails to RTD and NextBus about the matter, I discovered that “Broadway and Ash Ave” is not actually a bus stop for the BX or even the BL (Boulder-Denver Local) route, but only for other routes such as the Skip or AB. Apparently NextBus’s service only lists the time when the BX or BL bus passes a particular GPS location–not whether it is actually a bus stop for that particular route. So why is it listed as a bus stop on the BX/BL routes on NextBus?

The answer is poor design, particularly with respect to the interaction between the underlying information architecture and the user experience. One component of good user interface design is making sure that the information architecture of the system is accurate, and NextBus failed that test. Inaccurate information leads to a miserable user experience-such as having the bus you want to take pass you by and leave you stranded. That makes NextBus and RTD co-winners of the second Darwin Design Award for an interaction design that drives end-users nuts. I might have pulled back from giving them the award, but four months and several rounds of emails later they still haven’t bothered to fix the problem.

In fact, several more of the locations listed on the NextBus website “stop” selector are not actually located where the bus stops. So, for example, the stop at Broadway and 27th Way is probably the closest actual bus stop to the “Broadway at Baseline Rd” NextBus “stop”. However even that deduction remains uncertain, because the “Broadway at Service Rd” stop doesn’t even exist. Try googling such a location–or ask a native Boulderite like myself–there is no such intersection. Given that it is between “Broadway and Baseline Rd” and “Broadway at Ash Ave”, perhaps it refers to the old NIST (National Institute of Standards and Technology) entry across from Broadway and 27th Way, but the user is left twisting in the wind wondering how to interpret this nonsense.

There is an important lesson to be learned here, however. Mislabeling the GPS locator stations as “stops” is a great example of the mistake of conflating the user’s point of view and the back-end point of view. NextBus GPS location points are not ontologically equivalent to actual bus stops; they are are approximations which must be mapped. It illustrates how an ontological mistake in the underlying information architecture leads to a poor design that is useless for the end user.

A good interaction designer would pay attention to where the bus actually stops and how the stops are named in the real world of bus riders. Pushing real-time bus arrival information across the web to a browser or cell phone is a great idea. But unfortunately a great idea poorly designed risks dying early, earning the RTD NextBus system a Darwin Design Award.

Submit to Digg

June 15th, 2007 Posted by Tim | Poor Design, Every last post | one comment

Deepest Sender can’t login–fix

Recently my server seems to have updated their modsecurity rules so that my blogging client for Firefox, Deepest Sender, didn’t work, returning a cryptic “TypeError: node has no properties” message. It took me one confusing hour to figure it all out, as naturally I was writing a post that fell into another modsecurity trap. But there was a relatively easy solution.

The most drastic would be to turn off the SecFilter setting in your .htaccess file completely, as some forums advise (bad idea–you open yourself up to lots of security issues if you turn off filtering for all the nasties your webhost’s sysadmins are trying to protect you against with modsecurity.

A better solution is to just turn SecFilterInheritance off for only the file xmlrpc.php. That’s much more selective, but it still leaves a security hole right where attackers expect it. And, as any analysis of raw access logs will tell you, there are plenty of scripted attacks on yourdomain.com/xmlrpc.php, yourdomain.com/wordpress/xmlrpc.php and so forth.

An even better solution to combine that with the Purloined Letter method. Hiding the publicly accessible xmlrpc.php by renaming it is much more secure.

First, copy xmlrpc.php to yourownrandomname.php within your WordPress directory. (Copying the xmlrpc.php file rather than just renaming it reduces the chances that some other plugin will fail obscurely.)

Second, use the .htaccess modification method to point to your (hopefully) unique filename. Since they don’t know the filename, the script-kiddies won’t know what file to attack. Modify (or create) an .htaccess file in the wordpress directory with the text editor of your choice and insert the following directive:

<Files yourownrandomname.php>
SecFilterInheritance Off

Third, change DeepestSender or WindowsLiveWriter, Performancing or whatever blog client you use to point to yourdomain.com/yourwordpressdirectory/yourownrandomname.php rather than xmlrpc.php.

The only downside that I can think of is that you should repeat step 1 whenever you upgrade WordPress (if the xmlrpc.php file has been changed–and it is a target for attacks, so it does).

If you also run into Error 403/404 problems when posting content or comments containing filtered phrases like “xmlrpc.php” or “href=’javascript:’” as I did on another post, you may have to also modify the .htaccess settings for wp-admin/post.php or even wp-comments-post.php. Unfortunately it isn’t as simple to give a unique name to post.php as you’d have to change the filename throughout many WordPress program files. A better bet is to install WordPress in a non-obviously named subdirectory (not wordpress or blog or blogs or WordPress or so on and so forth…), but even then a script could pick up the install directory from the http_referrer variable, so a purloined letter solution isn’t as helpful for preventing spam attacks trying to exploit WordPress’s posting engine. So if this is a frequent problem, you’ll have to think of another solution–or just turn on and off security right before you post or edit a post containing the forbidden phrases.



Submit to Digg

June 12th, 2007 Posted by Tim | Hacking, Every last post | 4 comments