<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Antelope Love Fan</title>
	<atom:link href="http://mark.biek.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://mark.biek.org/blog</link>
	<description>Life, programming, &#38; general geekery by Mark Biek</description>
	<lastBuildDate>Mon, 02 Apr 2012 12:00:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Picasa data API fun: Creating albums and uploading images</title>
		<link>http://mark.biek.org/blog/2012/04/picasa-data-api-fun-creating-albums-and-uploading-images/</link>
		<comments>http://mark.biek.org/blog/2012/04/picasa-data-api-fun-creating-albums-and-uploading-images/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 12:00:06 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[googleapi]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[picasa]]></category>

		<guid isPermaLink="false">http://mark.biek.org/blog/?p=1319</guid>
		<description><![CDATA[Today, we’re going to have some fun with the Picasa Data API by learning how to create Picasa albums and upload photos to them. We’re going to do everything with vanilla-PHP and cURL but it’s worth mentioning that the Zend Framework has a set of classes for doing all of this stuff and more. While [...]]]></description>
			<content:encoded><![CDATA[<p>Today, we’re going to have some fun with the <a href="http://code.google.com/apis/picasaweb/overview.html" target="_blank">Picasa Data API</a> by learning how to create Picasa albums and upload photos to them.</p>
<p>We’re going to do everything with vanilla-PHP and cURL but it’s worth mentioning that the <a href="http://framework.zend.com/manual/en/zend.gdata.photos.html" target="_blank">Zend Framework</a> has a set of classes for doing all of this stuff and more.</p>
<p>While it does look like Google is moving in the direction of using <a href="http://oauth.net/" target="_blank">oAuth</a> for authentication, they still support username/password client logins which are, frankly, a <em>ton</em> easier to deal with.</p>
<p>I’ve written about <a href="http://mark.biek.org/blog/2009/01/google-client-logins/" target="_blank">Google client logins</a> before and the code I mentioned previously will still work with the Picasa Data API.  Basically, we provide a username and password to Google. They respond with an Auth token which we then pass as an HTTP header to all future requests to the API.</p>
<p>Like pretty much all Google Data APIs, doing things with Picasa mostly involves sending XML packets via HTTP POST. It’s just a matter of crafting the appropriate XML for what you’re trying to do.</p>
<h2>Creating a Picasa Album</h2>
<p>Here’s a simple example which creates an album called “Test album from PHP&#8221;. The below code assume we’re already authenticated and have a valid Auth token. You’ll also notice that we need to have the userId of the Picasa user we’re authenticated as.</p>
<pre name="code" class="php">
    $authHeader = 'Authorization:  GoogleLogin auth="' . $authToken . '"';
    $feedUrl = "https://picasaweb.google.com/data/feed/api/user/$userId";

    $rawXml = "&lt;entry xmlns='http://www.w3.org/2005/Atom'
                    xmlns:media='http://search.yahoo.com/mrss/'
                    xmlns:gphoto='http://schemas.google.com/photos/2007'>
                  &lt;title type='text'>Test album from PHP&lt;/title>
                  &lt;summary type='text'>This is a test album&lt;/summary>
                  &lt;gphoto:location>Louisville&lt;/gphoto:location>
                  &lt;gphoto:access>public&lt;/gphoto:access>
                  &lt;gphoto:timestamp>1152255600000&lt;/gphoto:timestamp>
                  &lt;category scheme='http://schemas.google.com/g/2005#kind'
                    term='http://schemas.google.com/photos/2007#album'>&lt;/category>
                &lt;/entry>";

    curl_setopt($ch, CURLOPT_URL, $feedUrl);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  

    $data = array($xml);

    $options = array(
                CURLOPT_SSL_VERIFYPEER=> false,
                CURLOPT_POST=> true,
                CURLOPT_RETURNTRANSFER=> true,
                CURLOPT_HEADER=> true,
                CURLOPT_FOLLOWLOCATION=> true,
                CURLOPT_POSTFIELDS=> $rawXml,
                CURLOPT_HTTPHEADER=> array('GData-Version:  2', $authHeader, 'Content-Type:  application/atom+xml')
            );
    curl_setopt_array($ch, $options);

    $ret = curl_exec($ch);
    curl_close($ch);
</pre>
<h2>Uploading an image <em>without</em> metadata</h2>
<p>Here’s an example that uploads an image to the album we created previously. You’ll notice that we also have to specify an albumId in addition to the userId. You can get album id by retrieving the list of albums for a particular user or at the time when you create a new album. Creating a new album returns an XML response with all kinds of detailed information about the album.</p>
<p>In this case, we don’t need any XML, just the URL to the album we want to load to.</p>
<p>Then it’s just a matter of getting the binary data of the image and sending it via POST to the album URL.</p>
<p><strong>NOTE: Don’t try to Base64-encode the image data. Just POST it as-is. Attempting to encode the image data will give you <em>Bad Request: Not an image</em> errors.</strong></p>
<pre name="code" class="php">
    $albumUrl = "https://picasaweb.google.com/data/feed/api/user/$userId/albumid/$albumId";
    $imgName = $_SERVER['DOCUMENT_ROOT'] . '/picasa/cute_baby_kitten.jpg';

    //Do a binary-read of the image file we want to upload.
    $fileSize = filesize($imgName);
    $fh = fopen($imgName, 'rb');
    $imgData = fread($fh, $fileSize);
    fclose($fh);

    //The Slug header is optional and is used to specify the name of the image in the album
    $header = array('GData-Version:  2', $authHeader, 'Content-Type: image/jpeg', 'Content-Length: ' . $fileSize, 'Slug: cute_baby_kitten.jpg');
    $data = $imgData;

    $ret = "";
    $ch  = curl_init($albumUrl);
    $options = array(
            CURLOPT_SSL_VERIFYPEER=> false,
            CURLOPT_POST=> true,
            CURLOPT_RETURNTRANSFER=> true,
            CURLOPT_HEADER=> true,
            CURLOPT_FOLLOWLOCATION=> true,
            CURLOPT_POSTFIELDS=> $data,
            CURLOPT_HTTPHEADER=> $header
        );
    curl_setopt_array($ch, $options);
    $ret = curl_exec($ch);
    curl_close($ch);
</pre>
<h2>Uploading an image <em>including</em> metadata</h2>
<p>This is a little tricker.</p>
<p>The documentation shows an example request as looking like this</p>
<pre name="code" class="php">
Content-Type: multipart/related; boundary="END_OF_PART"
Content-Length: 423478347
MIME-version: 1.0

Media multipart posting
--END_OF_PART
Content-Type: application/atom+xml

<entry xmlns='http://www.w3.org/2005/Atom'>
<summary>Real cat wants attention too.</summary>

  <category scheme="http://schemas.google.com/g/2005#kind"
    term="http://schemas.google.com/photos/2007#photo"/>
</entry>
--END_OF_PART
Content-Type: image/jpeg

...binary image data...
--END_OF_PART--
</pre>
<p>Unfortunately, they don’t give any clear examples about how to actually craft this kind of POST request.</p>
<p>Here’s the basics.  This bit?</p>
<pre name="code" class="php">
Content-Type: multipart/related; boundary="END_OF_PART"
Content-Length: 423478347
MIME-version: 1.0
</pre>
<p>That’s your HTTP header. The string <strong>END_OF_PART</strong> is just how you tell the server when one content section has ended and the next section starts. It just needs to be a unique string.</p>
<p>The <strong>Content-Length</strong> is also tricky. I just assumed that it was calculated by adding the length of the metadata XML and the image file size. I spent a fair amount of time banging my on that until I found this snippet from the <a href="https://developers.google.com/youtube/2.0/developers_guide_protocol_testing" target="_blank">YouTube Data API</a>.</p>
<p>Here’s the key takeaway:</p>
<blockquote><p>
To calculate the proper Content-Length, you need to count the full string length of the POST request. However, in addition to the XML component and the file binary, a direct upload request also defines a boundary string that separates the different parts of the request. <strong><em>So the calculation of the Content-Length needs to account for the size of the XML and file binary as well as of the inserted boundary strings and newlines.</em></strong>
</p></blockquote>
<p>Here’s a code example of uploading an image including metadata.</p>
<pre name="code" class="php">
    $albumUrl = "https://picasaweb.google.com/data/feed/api/user/$userId/albumid/$albumId";
    $imgName = $_SERVER['DOCUMENT_ROOT'] . '/picasa/cute_baby_kitten.jpg';

    $rawImgXml = '<entry xmlns="http://www.w3.org/2005/Atom">
<summary>Real cat wants attention too.</summary>

                  <category scheme="http://schemas.google.com/g/2005#kind"
                    term="http://schemas.google.com/photos/2007#photo"/>
                </entry>';

    $fileSize = filesize($imgName);
    $fh = fopen($imgName, 'rb');
    $imgData = fread($fh, $fileSize);
    fclose($fh);

    $dataLength = strlen($rawImgXml) + $fileSize;
    $data = "";
    $data .= "\nMedia multipart posting\n";
    $data .= "--P4CpLdIHZpYqNn7\n";
    $data .= "Content-Type: application/atom+xml\n\n";
    $data .= $rawImgXml . "\n";
    $data .= "--P4CpLdIHZpYqNn7\n";
    $data .= "Content-Type: image/jpeg\n\n";
    $data .= $imgData . "\n";
    $data .= "--P4CpLdIHZpYqNn7--";

    $header = array('GData-Version:  2', $authHeader, 'Content-Type: multipart/related; boundary=P4CpLdIHZpYqNn7;', 'Content-Length: ' . strlen($data), 'MIME-version: 1.0');

    $ret = "";
    $ch  = curl_init($albumUrl);
    $options = array(
            CURLOPT_SSL_VERIFYPEER=> false,
            CURLOPT_POST=> true,
            CURLOPT_RETURNTRANSFER=> true,
            CURLOPT_HEADER=> true,
            CURLOPT_FOLLOWLOCATION=> true,
            CURLOPT_POSTFIELDS=> $data,
            CURLOPT_HTTPHEADER=> $header
        );
    curl_setopt_array($ch, $options);
    $ret = curl_exec($ch);
    curl_close($ch);
</pre>
<p>The request headers look like this:</p>
<pre name="code" class="php">
Array
(
    [0] => GData-Version:  2
    [1] => Authorization:  GoogleLogin auth="THISISAVALIDAUTHCODE"
    [2] => Content-Type: multipart/related;boundary=P4CpLdIHZpYqNn7
    [3] => Content-Length: 179951
    [4] => MIME-version: 1.0
)
</pre>
<p>And the actual request body ends up looking like this:</p>
<pre name="code" class="php">
Media multipart posting
--P4CpLdIHZpYqNn7
Content-Type: application/atom+xml

<entry xmlns="http://www.w3.org/2005/Atom">
<summary>Real cat wants attention too.</summary>

              <category scheme="http://schemas.google.com/g/2005#kind"
                term="http://schemas.google.com/photos/2007#photo"/>
            </entry>
--P4CpLdIHZpYqNn7
Content-Type: image/jpeg

IMAGE DATA GOES HERE
--P4CpLdIHZpYqNn7--
</pre>
<p>Then, if all goes well, you’ll end up with something like this:</p>
<p><img src="http://i.imgur.com/2UgaW.png" alt="" /></p>
<p>There are <a href="http://code.google.com/apis/picasaweb/docs/2.0/developers_guide_protocol.html" target="_blank">lots of neat things</a> you can do with the Picasa data API.</p>
<p>Hopefully the above will be enough to get you rolling with them.</p>
]]></content:encoded>
			<wfw:commentRss>http://mark.biek.org/blog/2012/04/picasa-data-api-fun-creating-albums-and-uploading-images/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVN working copy is &#8220;nested&#8221;?</title>
		<link>http://mark.biek.org/blog/2012/03/svn-working-copy-is-nested/</link>
		<comments>http://mark.biek.org/blog/2012/03/svn-working-copy-is-nested/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 12:00:48 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://mark.biek.org/blog/?p=1315</guid>
		<description><![CDATA[Have you ever gone to commit something and TortoiseSVN tells you that part of your working copy is “nested&#8221;? You know what that means? It means that the nested folder contains the Subversion meta-information for a different working copy! I find this usually happens when you copy a directory into your working copy from somewhere [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever gone to commit something and TortoiseSVN tells you that part of your working copy is “nested&#8221;?</p>
<p><img src="http://i.imgur.com/SWQbq.png" alt="" /></p>
<p>You know what that means?</p>
<p>It means that the nested folder contains the Subversion meta-information for a <em>different working copy</em>! I find this usually happens when you copy a directory into your working copy from somewhere else and forget to delete all of the <strong>.svn</strong> directories.</p>
<p>The interesting thing is that, despite this warning, Subversion will happily commit <em>any</em> changes you’ve made in that directory.</p>
<p>The problem is that it commits them to whatever repository that directory came from, <strong>not</strong> to your repository.</p>
<p>We had a situation at work today where part of a working copy was nested and we thought we’d lost the only copy of a modified image as a result. Luckily we were able to pull the correct image from the revision log of the <em>other</em> working copy.</p>
<p>So how do you fix a nested working copy? It’s really easy.</p>
<p>1. Delete all of the <strong>.svn</strong> directories from the nested directory.<br />
2. Add the directory into subversion (svn add).<br />
3. Commit the add (svn ci).<br />
4.  Profit!</p>
]]></content:encoded>
			<wfw:commentRss>http://mark.biek.org/blog/2012/03/svn-working-copy-is-nested/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My one, feeble attempt at being a cracker of software.</title>
		<link>http://mark.biek.org/blog/2012/03/a-cracker-of-software/</link>
		<comments>http://mark.biek.org/blog/2012/03/a-cracker-of-software/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 12:00:42 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[cracking]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[macintosh]]></category>

		<guid isPermaLink="false">http://mark.biek.org/blog/?p=1306</guid>
		<description><![CDATA[Ah, the heady days of fall-1994. I was 16, hopelessly obsessed with my computer, and my dorm room had dial-up Internet access. This meant my roommates and I spent far more time hacking (in the good way), and downloading and playing Mac (System 7 for life!) games than attending class. The gaming went through a [...]]]></description>
			<content:encoded><![CDATA[<p>Ah, the heady days of fall-1994. I was 16, hopelessly obsessed with my computer, and my dorm room had dial-up Internet access.</p>
<p>This meant my roommates and I spent far more time hacking (in the good way), and downloading and playing Mac (System 7 for life!) games than attending class.</p>
<p>The gaming went through a number of phases.</p>
<p><strong>Phase 1:</strong> <a href="http://en.wikipedia.org/wiki/Myst" target="_blank">Myst</a>. There were four of us in the room and one of the four (not me) almost flunked out because of his Myst obsession.<br />
<img src="http://i.imgur.com/8bg5Y.png" alt="" /></p>
<p><strong>Phase 2:</strong> <a href="http://en.wikipedia.org/wiki/Civilization_(video_game)" target="_blank">Civilization</a>. I got hooked on this in high school. In the end, I think we all lost equal amounts of time to this one.<br />
<img src="http://i.imgur.com/cqRnV.jpg" alt="" /></p>
<p><strong>Phase 3:</strong> Network games of <a href="http://en.wikipedia.org/wiki/Spectre_(video_game)" target="_blank">Spectre</a>. 3D tanks! Virtual-reality-esque! This was back when <a href="http://www.imdb.com/title/tt0104692/" target="_blank">Lawnmower Man</a> was cool. (OK, Lawnmower Man was never cool but I still loved it).<br />
<img src="http://i.imgur.com/pyXhu.jpg" alt="" /></p>
<p><strong>Phase 4:</strong> Network games of <a href="http://en.wikipedia.org/wiki/Marathon_(video_game)" target="_blank">Marathon</a> (OK, technically this one didn’t come around until early 1995.)</p>
<p>For the network games, we bribed a facilities maintenance person to drill a hole through my closet so we could run Ethernet cable into the room next door.</p>
<p><strong>Phase 5:</strong> Emulation! I was mainly a fan of 8-bit Nintendo emulators with the occasional Sega Genesis* game thrown in for good measure.<br />
<img src="http://i.imgur.com/46vz0.jpg" alt="" width="240" height="120" /></p>
<p><small>*I loved my Sega Genesis in high school. I, unfortunately, sold it to my then-girlfriend’s little sister who proceeded to never pay me for it. When said-girlfriend and I parted ways, any hopes of collecting my money disappeared.</small></p>
<p>My preferred Nintendo emulator at the time was a little Macintosh shareware app called <strong>iNES</strong>. There’s still a iNES emulator in active development that’s cross platform, I have no idea if it’s the same one I used.</p>
<p>This old version, iNES 7.7, had a copy-protection scheme where it would lock itself down after a certain number of uses unless you paid for it.</p>
<p>Thanks to <a href="http://www.amazon.com/Zen-Art-Resource-Editing-Resedit/dp/1568302444/ref=sr_1_2?ie=UTF8&amp;qid=1331921782&amp;sr=8-2" target="_blank">Zen and the Art of Resource Editing</a>, I spent a fair amount of time poking around in the guts of my Macintosh LC and its various applications.</p>
<p>It turned out that the mechanism by which iNES locked itself was pretty simple. First, it made a modification to the iNES preferences file, then made the file locked and invisible. Second, it added a special resource to the resource fork of the iNES application which flagged it as “expired&#8221;.</p>
<p>After manually unlocking iNES a bunch of times using <a href="http://en.wikipedia.org/wiki/ResEdit" target="_blank">ResEdit</a>, I decided to learn enough Mac programming to write a little program to do the unlocking for me.</p>
<p>The app itself was pretty simple:</p>
<ol>
<li>Popup a File Open dialog so the iNES application can be located</li>
<li>Unlock and delete the preferences file. This was annoying because you had to reenter all of your prefs the next time you launched the program. My goal for phase two was try to preserve the existing prefs and just remove whatever bit it was that locked the app.</li>
<li>Open the resource fork of iNES and delete the offending resource. I was especially proud of the function that did this part because it was called <strong>URiNES()</strong>. You’re never too old for potty jokes, right?</li>
</ol>
<p>My first Macintosh application! I was very product of my 3l33t h4x0r skillz and, of course, wanted to show off.</p>
<p>I figured the best thing to do was to share the app with the guy who ran the emulator site where I had been downloading iNES (and ROMs) from. Little did I know that this same fellow was the guy who <strong><em>wrote and maintained</em></strong> iNES!</p>
<p>As you can imagine, he was less than thrilled with my accomplish and I, of course, felt like a giant moron.</p>
<p>In the end, I swore to him that I would never distribute my little crack to anyone and I also purchased a licensed copy of iNES.</p>
<p>Given that this was almost 20 years ago and that version of iNES doesn’t exist, I think it’s probably safe to share the source of my one and only attempt at being a software cracker.<br />
<strong>UnPirate iNES</strong>: <a href="http://pastebin.com/YJQd916j" target="_blank">http://pastebin.com/YJQd916j</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mark.biek.org/blog/2012/03/a-cracker-of-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Own Personal Daily WTF v1</title>
		<link>http://mark.biek.org/blog/2012/02/my-own-personal-daily-wtf-v1/</link>
		<comments>http://mark.biek.org/blog/2012/02/my-own-personal-daily-wtf-v1/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 19:31:45 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[wtf]]></category>

		<guid isPermaLink="false">http://mark.biek.org/blog/?p=1303</guid>
		<description><![CDATA[I’m sure most developers out there are familiar with The Daily WTF. I’m also sure most developers are aware of the dirty little secret that we all write bad code sometimes. This is a chance to share some of my own personal horror stories. It was 2000 and I was working at my second job [...]]]></description>
			<content:encoded><![CDATA[<p>I’m sure most developers out there are familiar with <a href="http://thedailywtf.com/" target="_blank">The Daily WTF</a>. I’m also sure most developers are aware of the <a href="http://worsethanfailure.com/Articles/Guest_Article_0x3a__Our_Dirty_Little_Secret.aspx" target="_blank">dirty little secret</a> that we <em>all</em> write bad code sometimes.</p>
<p>This is a chance to share some of my own personal horror stories.</p>
<p>It was 2000 and I was working at my second job after college. I was mostly coding for the PalmOS but dabbled a bit in Classic ASP (VBScript).</p>
<p>One day, I was given the task of writing a script to email several hundred people using an off-the-shelf COM object for email tasks.</p>
<p>The pseudo-code of the script went something like this:</p>
<pre>dim emailList
dim emailSender 'The 3rd-party component

emailSender.StartSession()

for each person in emailList
  emailSender.From = emailList.email
  emailSender.Subject = "Whatever"
  emailSender.Body = "Foo"

  emailSender.Send
next

emailSender.EndSession()</pre>
<p>Pretty straightforward, right?</p>
<p>What I didn’t realize was that, during a single session, setting the From address actually did an <strong>append</strong> rather than overwriting the current value.</p>
<p>That meant that, the first time through the loop, the email went to the first person. The second email went to the second person <em>and</em> the first person. The third email went to the third person, second person, and first person. And so on.</p>
<p>Luckily, I was on the list so I immediately noticed that I was getting multiple emails. Unfortunately it ran through half the list before I was able to get IIS stopped.<br />
As you can imagine, we had a lot of really pissed of replies.</p>
]]></content:encoded>
			<wfw:commentRss>http://mark.biek.org/blog/2012/02/my-own-personal-daily-wtf-v1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Get on your bike.  No excuses</title>
		<link>http://mark.biek.org/blog/2012/01/get-on-your-bike-no-excuses/</link>
		<comments>http://mark.biek.org/blog/2012/01/get-on-your-bike-no-excuses/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 13:00:10 +0000</pubDate>
		<dc:creator>mark</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[cycling]]></category>

		<guid isPermaLink="false">http://mark.biek.org/blog/?p=1296</guid>
		<description><![CDATA[Don’t worry about how your bike looks. Don’t worry about your clothes. Don’t worry about the weather. If it’s cold, you’ll warm up again. If it’s wet, you’ll get dry again. Just get on your bike and ride it. Go as fast as you can. Or as fast as you want to. You don’t need [...]]]></description>
			<content:encoded><![CDATA[<p>Don’t worry about how your bike looks.</p>
<p>Don’t worry about your clothes.</p>
<p>Don’t worry about the weather. If it’s cold, you’ll warm up again. If it’s wet, you’ll get dry again.</p>
<p>Just get on your bike and ride it. Go as fast as you can. Or as fast as you want to.</p>
<p>You don’t need headphones.</p>
<p>Listen to the sounds of the world. The wind whistling in your ears. The sound of your heart pounding in your chest.</p>
<p>If you see someone else on a bike, wave to them.</p>
<p>Don’t worry about mountain bike, road bike, fixie, used, new, fancy brand, department store bike.</p>
<p>People should wave to other people on bikes.</p>
<p>We are brothers and sisters of the wheel and should acknowledge each other as such.</p>
]]></content:encoded>
			<wfw:commentRss>http://mark.biek.org/blog/2012/01/get-on-your-bike-no-excuses/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  mark.biek.org/blog/feed/ ) in 0.12118 seconds, on May 20th, 2012 at 7:50 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 20th, 2012 at 8:50 pm UTC -->
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  mark.biek.org/blog/feed/ ) in 0.00039 seconds, on May 20th, 2012 at 8:17 pm UTC. -->
