<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Click On Tyler</title>
	
	<link>http://clickontyler.com/blog</link>
	<description />
	<lastBuildDate>Tue, 23 Jun 2009 05:07:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/clickontyler" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Sosumi – A MobileMe Scraper</title>
		<link>http://clickontyler.com/blog/2009/06/sosumi-a-mobileme-scraper/</link>
		<comments>http://clickontyler.com/blog/2009/06/sosumi-a-mobileme-scraper/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 05:06:48 +0000</pubDate>
		<dc:creator>Tyler Hall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://clickontyler.com/blog/?p=377</guid>
		<description><![CDATA[Sosumi is a PHP script that scrapes MobileMe and exposes Apple&#8217;s Find My iPhone functionality to the command line or your own web application. This lets you pull your phone&#8217;s current location and push messages and alarms to the device.

Like my previous blog post that dealt with AT&#38;T&#8217;s Family Map service, my goal was to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/tylerhall/sosumi/tree/master">Sosumi</a> is a PHP script that scrapes MobileMe and exposes Apple&#8217;s <a href="http://www.apple.com/mobileme/whats-new/">Find My iPhone</a> functionality to the command line or your own web application. This lets you pull your phone&#8217;s current location and push messages and alarms to the device.</p>

<p>Like my <a href="http://clickontyler.com/blog/2009/04/persistant-location-updates-from-iphone-to-fire-eagle/">previous blog post</a> that dealt with AT&amp;T&#8217;s Family Map service, my goal was to connect my iPhone with <a href="http://fireeagle.yahoo.net/">Fire Eagle</a> by Yahoo!. There are a few iPhone Fire Eagle updaters available, but they&#8217;re all limited by Apple&#8217;s third-party application restrictions. Sosumi gets around those restrictions by running every few minutes on your own server rather than the device itself. In my case, I&#8217;ve setup a cron job to run the script every fifteen minutes and push my location to Fire Eagle.</p>

<p>Until Apple releases a location API for MobileMe (not likely, and not their job), this will have to do.</p>

<p><a href="http://github.com/tylerhall/sosumi/tree/master">Grab the code</a> on GitHub.</p>

<p>Example:</p>

<pre>
$ssm = new Sosumi('username', 'password');
$location_data = $ssm->locate();
$ssm->sendMessage('Daisy, daisy...');
</pre>
<img src="http://feeds.feedburner.com/~r/clickontyler/~4/iHxpOBqu5zU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://clickontyler.com/blog/2009/06/sosumi-a-mobileme-scraper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Persistant Location Updates From iPhone to Fire Eagle</title>
		<link>http://clickontyler.com/blog/2009/04/persistant-location-updates-from-iphone-to-fire-eagle/</link>
		<comments>http://clickontyler.com/blog/2009/04/persistant-location-updates-from-iphone-to-fire-eagle/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 19:25:40 +0000</pubDate>
		<dc:creator>Tyler Hall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://clickontyler.com/blog/?p=372</guid>
		<description><![CDATA[Location Based Services are hot. They add an extra layer of usefulness on top of the web sites and products we&#8217;re already using. The trick is keeping your location updated in the cloud as frequently, comfortably, and securely as possible.

Fire Eagle fulfills the security requirement &#8212; brokering your whereabouts only to parties you&#8217;ve authorized. And [...]]]></description>
			<content:encoded><![CDATA[<p>Location Based Services are hot. They add an extra layer of usefulness on top of the web sites and products we&#8217;re already using. The trick is keeping your location updated in the cloud as frequently, comfortably, and securely as possible.</p>

<p><a href="http://fireeagle.yahoo.net/">Fire Eagle</a> fulfills the security requirement &mdash; brokering your whereabouts only to parties you&#8217;ve authorized. And iPhone applications like <a href="http://clickontyler.com/sparrow/">Sparrow</a> and <a href="http://www.cristdrive.com/voila/">Voila</a> make it a cinch to update Fire Eagle on-the-go. But they&#8217;re limited to manual updates as they can&#8217;t run in the background. (And you wouldn&#8217;t want them to because of the drain GPS has on battery life.)</p>

<p>For me, the holy grail has always been a way to update your location persistently from iPhone. And until Apple offers their own solution (fingers crossed) I&#8217;d like to present mine. It&#8217;s a dirty hack (the best always are), and has the added benefit of working with any AT&amp;T phone &mdash; not just iPhone.</p>

<p>To do this, we&#8217;ll be scraping AT&amp;T&#8217;s new <a href="https://familymap.wireless.att.com/finder-att-family/welcome.htm">Family Map service</a> and then pushing the data we retrieve into Fire Eagle ourselves.</p>

<p>(Family Map is an overpriced add-on to your monthly plan that lets you track the phones on your account using AT&amp;T&#8217;s website. It&#8217;s limited, but surprisingly good considering it came from within the bowels of a cellphone company.)</p>

<p>There will be three parts to this hack.</p>

<ol>
<li>Scraping our location data from AT&amp;T&#8217;s website.</li>
<li>Pushing that data to Fire Eagle.</li>
<li>Making the script run automatically.</li>
</ol>

<p>Let&#8217;s get started.</p>

<h4>Scraping the Data</h4>

<p>The Family Map website uses Microsoft&#8217;s VirtualEarth maps plus some other AJAXy fanciness. I briefly poked around to see if there were any JSON or XML data sources I could hijack but didn&#8217;t see anything. Instead, I opted to directly scrape their <a href="https://familymap.att.com/finder-wap-att/">mobile website</a> as it&#8217;s plain vanilla HTML.</p>

<p>I won&#8217;t go into the details of scraping the data (you can <a href="http://github.com/tylerhall/att-family-map-scraper/blob/739ed83463c82bf7553feb0a35f2ddf99c0a61ab/lib/familymap.php">see the code</a> for yourself), but it was pretty simple. Login, send a &#8220;locate my phone&#8221; request, wait for the data, and parse out our coordinates.</p>

<h4>Pushing Data to Fire Eagle</h4>

<p>Fire Eagle is an excellent API to work with. They&#8217;ve got a clear spec and tons of example code. The only tricky part is handling the initial OAuth setup. I&#8217;ve included a simple web page (<code>setup.php</code>) you can use to do the authentication. It&#8217;s based on Fire Eagle&#8217;s PHP API kit example.</p>

<p>Once OAuth is setup, it&#8217;s only one line of code to publish our location.</p>

<h4>Making it Automatic</h4>

<p>Running this script automatically will vary depending on your setup. In my case, I&#8217;ve created a cron jon that runs the included <code>update.php</code> script every five minutes.</p>

<h4>Download the Code</h4>

<p>And that&#8217;s it. This code is only a few hours old, but it seems to work well so far. I watched as Fire Eagle was updated with my location this morning on the way to work. That said, it&#8217;s definitely not user friendly &mdash; clearly something only someone familiar with a command line would want to setup. But if you&#8217;re interested in developing a friendlier solution, <a href="http://clickontyler.com/contact/">let me know</a> and perhaps we can work together.</p>

<p><a href="http://github.com/tylerhall/att-family-map-scraper/tree/master">Grab the code from GitHub</a>.</p>
<img src="http://feeds.feedburner.com/~r/clickontyler/~4/8QtXIFIus5s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://clickontyler.com/blog/2009/04/persistant-location-updates-from-iphone-to-fire-eagle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Voice Dialer</title>
		<link>http://clickontyler.com/blog/2009/03/google-voice-dialer/</link>
		<comments>http://clickontyler.com/blog/2009/03/google-voice-dialer/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 18:31:02 +0000</pubDate>
		<dc:creator>Tyler Hall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://clickontyler.com/blog/?p=363</guid>
		<description><![CDATA[Last year I posted a PHP script that lets you dial phone numbers using Grand Central. I updated it this morning to support Google Voice as well.

The syntax is the same

$gv = new GoogleVoice('you@gmail.com', 'password');
$gv-&#62;call($your_number, $their_number);


You can grab the code from my google-voice-dialer project on GitHub.
]]></description>
			<content:encoded><![CDATA[<p>Last year I posted a PHP script that lets you <a href="http://clickontyler.com/blog/2008/08/dial-a-phone-number-using-grand-central-and-php/">dial phone numbers using Grand Central</a>. I updated it this morning to support <a href="http://www.google.com/voice/about">Google Voice</a> as well.</p>

<p>The syntax is the same</p>

<pre><code>$gv = new GoogleVoice('you@gmail.com', 'password');
$gv-&gt;call($your_number, $their_number);
</code></pre>

<p>You can grab the code from my <a href="http://github.com/tylerhall/google-voice-dialer/tree/master">google-voice-dialer project</a> on GitHub.</p>
<img src="http://feeds.feedburner.com/~r/clickontyler/~4/hLGIxwbNICk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://clickontyler.com/blog/2009/03/google-voice-dialer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VirtualHostX Free For Students</title>
		<link>http://clickontyler.com/blog/2009/03/virtualhostx-free-for-students/</link>
		<comments>http://clickontyler.com/blog/2009/03/virtualhostx-free-for-students/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 00:17:25 +0000</pubDate>
		<dc:creator>Tyler Hall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://clickontyler.com/blog/?p=361</guid>
		<description><![CDATA[I&#8217;ve been tossing this idea around for a while now and decided last night to just go ahead and do it. VirtualHostX is now free for students. All you need is a .edu email address and I&#8217;ll send you a license free of charge.

Um, why?

Good question. There&#8217;s no master plan or secret motive behind giving [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been tossing this idea around for a while now and decided last night to just go ahead and do it. VirtualHostX is now free for students. All you need is a .edu email address and <a href="http://clickontyler.com/virtualhostx/student/">I&#8217;ll send you a license</a> free of charge.</p>

<h4>Um, why?</h4>

<p>Good question. There&#8217;s no master plan or secret motive behind giving away free licenses. I do it <a href="http://twitter.com/vidluther/statuses/1187154708">all</a> <a href="http://twitter.com/fuzzyness/statuses/1125058997">the</a> <a href="http://twitter.com/patbrumfield/statuses/1220208930">time</a>, <a href="http://twitter.com/anima/statuses/1198550825">actually</a>. I just think that students have enough expenses on their plate without needing to fork over a few bucks for an app that, more than likely, is only used in their spare time until they graduate.</p>

<p>I&#8217;ve been programming for a long time &mdash; since I was ten. I started out writing small programs in <a href="http://en.wikipedia.org/wiki/GW-BASIC">GW</a> and <a href="http://en.wikipedia.org/wiki/QBasic">QBasic</a>. When I was thirteen I mowed lawns and saved money until I could afford a copy of <a href="http://en.wikipedia.org/wiki/Visual_Basic">Visual Basic 3</a>, but only because Microsoft offered an educational discount. I couldn&#8217;t have afforded it otherwise.</p>

<p>Now I&#8217;m not saying that if it weren&#8217;t for Microsoft and Visual Basic I wouldn&#8217;t have become a developer, but it definitely made the the trip easier.</p>

<p>So that&#8217;s what I&#8217;m trying to do here. If there are high school or college students just starting out in web development &mdash; maybe building small sites to help pay for books or beer &mdash; and VirtualHostX can help, that&#8217;s awesome. It&#8217;s the least I can do.</p>
<img src="http://feeds.feedburner.com/~r/clickontyler/~4/xXcwC72WKpk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://clickontyler.com/blog/2009/03/virtualhostx-free-for-students/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YUI App Theme</title>
		<link>http://clickontyler.com/blog/2009/03/yui-app-theme/</link>
		<comments>http://clickontyler.com/blog/2009/03/yui-app-theme/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 05:25:36 +0000</pubDate>
		<dc:creator>Tyler Hall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://clickontyler.com/blog/?p=333</guid>
		<description><![CDATA[Tonight I pushed a new project to GitHub called yui-app-theme. It&#8217;s a generic, skinnable layout designed for web applications &#8212; particularly admin areas &#8212; built using YUI Grids.

In other words, it&#8217;s a starting point.

Usually when doing freelance work for clients, unless you&#8217;re building on top of an existing CMS like WordPress or MiaCMS, you&#8217;ll have [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight I pushed a new project to GitHub called <a href="http://github.com/tylerhall/yui-app-theme/">yui-app-theme</a>. It&#8217;s a generic, skinnable layout designed for web applications &mdash; particularly admin areas &mdash; built using <a href="http://developer.yahoo.com/yui/grids/">YUI Grids</a>.</p>

<p>In other words, it&#8217;s a <em>starting point</em>.</p>

<p>Usually when doing freelance work for clients, unless you&#8217;re building on top of an existing CMS like <a href="http://wordpress.org/">WordPress</a> or <a href="http://miacms.org/">MiaCMS</a>, you&#8217;ll have to create an admin area for the client to login and manage their site. Or maybe you&#8217;re building a bug tracker or some other web application. Whatever the situation, yui-app-theme provides a solid foundation to start your work.</p>

<p>It offers a tabbed layout with many of the common UI elements that web apps need. Content blocks, tabbed modules, one and two-column forms, error messages, etc. But most importantly it&#8217;s built using YUI Grids so it&#8217;s semantically structured, cross-browser, and easy to extend. You can radically alter the layout with just a few quick changes. Try clicking through the layout options on the <a href="http://clickontyler.com/yui-app-theme/">demo page</a>.</p>

<p><a href="http://clickontyler.com/yui-app-theme/"><img src="http://cdn.clickontyler.com/blog/yuiapp-ss4.20090308235541.png" alt="YUI App Theme preview" /></a></p>

<p>I&#8217;ve done my best to keep things logical and easy to use. Here&#8217;s a quick example of how to use and extend the built-in content blocks.</p>

<p>A basic content block, or module, is created with the following markup</p>

<pre><code>&lt;div class="block"&gt;
    &lt;div class="hd"&gt;
        &lt;h2&gt;Your Header Content&lt;/h2&gt;
    &lt;/div&gt;
    &lt;div class="bd"&gt;
        &lt;p&gt;Your body content goes here.&lt;/p&gt;
    &lt;/div&gt;
&lt;/div&gt;
</code></pre>

<p>You have a containing <code>div</code> with a class name of <code>block</code> surrounding two inner <code>divs</code>, which make up the head and body content of the block. In the browser you&#8217;ll see</p>

<p><img src="http://cdn.clickontyler.com/blog/yuiapp-ss1.20090308235539.png" alt="YUI App Theme content block preview" /></p>

<p>Content blocks resize to fit their surroundings. That means you can take the same markup used for a body content block and move it into a sidebar &mdash; the block will automatically shrink to fit the smaller space.</p>

<p>We can also extend the block to have a tabbed appearance. To do this, we just need to add an extra <code>tabs</code> class and define our tabs using a &lt;ul&gt;.</p>

<pre><code>&lt;div class="block tabs"&gt;
    &lt;div class="hd"&gt;
        &lt;ul&gt;
            &lt;li class="active"&gt;&lt;a href="#"&gt;Tab 1&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Tab 2&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Tab 3&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
        &lt;div class="clear"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="bd"&gt;
        &lt;p&gt;Your body content goes here.&lt;/p&gt;
    &lt;/div&gt;
&lt;/div&gt;
</code></pre>

<p><img src="http://cdn.clickontyler.com/blog/yuiapp-ss2.20090308235540.png" alt="YUI App Theme content block with tabs preview" /></p>

<p>Easy.</p>

<p>However, you&#8217;ll notice than by using an unordered list to build our tabs, we had to remove the &lt;h2&gt; tag. In some situations we may want to keep that header around for SEO purposes &mdash; visible to search engines but hidden from users. yui-app-theme handles this situation automatically by hiding any &lt;h2&gt; and &lt;h3&gt; tags inside a content block&#8217;s header. (Technically, it applies an extreme negative left margin to move it outside the browser window.)</p>

<p>Let&#8217;s take this example one step further and change the appearance of the tabs by making them look separated. All we have to do is add a <code>spaces</code> class to the content block.</p>

<pre><code>&lt;div class="block tabs spaces"&gt;
    &lt;div class="hd"&gt;
        &lt;ul&gt;
            &lt;li class="active"&gt;&lt;a href="#"&gt;Tab 1&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Tab 2&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="#"&gt;Tab 3&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
        &lt;div class="clear"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="bd"&gt;
        &lt;p&gt;Your body content goes here.&lt;/p&gt;
    &lt;/div&gt;
&lt;/div&gt;
</code></pre>

<p>And we get</p>

<p><img src="http://cdn.clickontyler.com/blog/yuiapp-ss3.20090308235540.png" alt="YUI App Theme content block with separated tabs preview" /></p>

<p>It&#8217;s that simple. With the right CSS, minor HTML edits can create powerful changes when rendered.</p>

<p>If you <a href="http://clickontyler.com/yui-app-theme/">explore the demo</a> you&#8217;ll see that applies to the page layout as well. You can <em>very quickly</em> change the color scheme or page width. And even adjust the sidebar, move it to the opposite side, or switch the layout to a single column. It&#8217;s all possible because yui-app-theme, itself, is built on top of a solid foundation &mdash; <a href="http://developer.yahoo.com/yui/">YUI</a>.</p>

<p>I&#8217;ve already started using this template in my own projects and found it incredibly helpful to have my application layout up and running so quickly. I hope you can benefit from it, too. And, please, feel free to fork <a href="http://github.com/tylerhall/yui-app-theme/">yui-app-theme on GitHub</a> and contribute your own improvements.</p>
<img src="http://feeds.feedburner.com/~r/clickontyler/~4/C-sAaPf1IEY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://clickontyler.com/blog/2009/03/yui-app-theme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sparrow Now Free on the iTunes App Store</title>
		<link>http://clickontyler.com/blog/2009/03/sparrow-now-free-on-the-itunes-app-store/</link>
		<comments>http://clickontyler.com/blog/2009/03/sparrow-now-free-on-the-itunes-app-store/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 08:42:07 +0000</pubDate>
		<dc:creator>Tyler Hall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://clickontyler.com/blog/?p=289</guid>
		<description><![CDATA[In case you missed it, Sparrow, my iPhone Fire Eagle updater, is now available for free on the App Store.

In addition to the much improved price, Sparrow now updates your Twitter profile with your location name rather than your coordinates. So instead of something ugly like &#8220;37.321, -121.999&#8243;, you&#8217;ll get a much more attractive &#8220;1 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://cdn.clickontyler.com/blog/sparrowblogpic.png" style="float:right;" />In case you <a href="http://twitter.com/fireeagle/status/1197766369">missed it</a>, Sparrow, my <a href="http://clickontyler.com/sparrow/">iPhone Fire Eagle updater</a>, is now available for free on the App Store.</p>

<p>In addition to the much improved price, Sparrow now updates your Twitter profile with your <em>location name</em> rather than your <em>coordinates</em>. So instead of something ugly like &#8220;37.321, -121.999&#8243;, you&#8217;ll get a much more attractive &#8220;1 Infinite Loop, Cupertino, CA&#8221;.</p>

<p>But what if you don&#8217;t want your Twitter profile to show your exact address? Simple. Login to Fire Eagle and go to your <a href="http://fireeagle.yahoo.net/my/apps">My Applications</a> section. From there, you can edit Sparrow&#8217;s permissions and restrict it to your zip code, neighborhood, city, state, etc &mdash; whatever you feel comfortable sharing. It&#8217;s a great example of how flexible and, more importantly, empowering Fire Eagle&#8217;s security model is. It&#8217;s a web service that really does put its users first.</p>

<h4>I&#8217;d Like to Thank the Academy&#8230;</h4>

<p>Sparrow has gotten some great press in the past month. In an article about the privacy implications of Google&#8217;s new Latitude service, <a href="http://blog.wired.com/business/2009/02/gmails-new-add.html"><em>Wired</em></a> called out Sparrow as among the best mobile Fire Eagle updaters. And <a href="http://blog.programmableweb.com/2009/02/13/yahoos-fire-eagle-powers-the-iphone-locator-app-sparrow/">Programmable Web</a> chose Sparrow as their Mashup of the Day saying it&#8217;s &#8220;a good example of how a few web APIs can be elegantly implemented for use on a mobile device.&#8221;</p>

<p>So now that Sparrow is free, what are you waiting for? <a href="http://clickontyler.com/sparrow/itunes/">Download</a> your copy today and go, go, Fire Eagle!</p>
<img src="http://feeds.feedburner.com/~r/clickontyler/~4/a-fHbnXOtzk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://clickontyler.com/blog/2009/03/sparrow-now-free-on-the-itunes-app-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Wrapper for Yahoo! GeoPlanet</title>
		<link>http://clickontyler.com/blog/2009/02/php-wrapper-for-yahoo-geoplanet/</link>
		<comments>http://clickontyler.com/blog/2009/02/php-wrapper-for-yahoo-geoplanet/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 23:33:22 +0000</pubDate>
		<dc:creator>Tyler Hall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://clickontyler.com/blog/?p=315</guid>
		<description><![CDATA[Earlier this month I wrote a quick PHP wrapper for Yahoo!&#8217;s GeoPlanet API. It&#8217;s a super useful service for querying geographical information about nearly any place on earth &#8212; addresses, landmarks, colloquial locations, etc. Or, as the official description says


  GeoPlanet helps bridge the gap between the real and virtual worlds by providing an [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier this month I wrote a quick PHP wrapper for <a href="http://developer.yahoo.com/geo/">Yahoo!&#8217;s GeoPlanet API</a>. It&#8217;s a super useful service for querying geographical information about nearly any place on earth &mdash; addresses, landmarks, colloquial locations, etc. Or, as the official description says</p>

<blockquote>
  <p>GeoPlanet helps bridge the gap between the real and virtual worlds by providing an open, permanent, and intelligent infrastructure for geo-referencing data on the Internet.</p>
</blockquote>

<p>There were already Perl, Python, and Ruby wrappers. I figured I&#8217;d throw PHP into the mix.</p>

<p><a href="http://petewarden.typepad.com/">Pete Warden</a> has already written some <a href="http://petewarden.typepad.com/searchbrowser/2009/02/how-to-emulate-near-in-the-twitter-search-api-using-geoplanet.html">example code</a> that uses the wrapper to emulate Twitter&#8217;s nearby location search.</p>

<p>You can <a href="http://github.com/tylerhall/php-geoplanet/">download the source from GitHub</a>. As usual, it&#8217;s licensed under the MIT License and free to use in any way you like.</p>
<img src="http://feeds.feedburner.com/~r/clickontyler/~4/XVZCSSZDApM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://clickontyler.com/blog/2009/02/php-wrapper-for-yahoo-geoplanet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Serving Static Content on Amazon S3 with s3up</title>
		<link>http://clickontyler.com/blog/2009/02/serving-static-content-on-amazon-s3-with-s3up/</link>
		<comments>http://clickontyler.com/blog/2009/02/serving-static-content-on-amazon-s3-with-s3up/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 03:03:51 +0000</pubDate>
		<dc:creator>Tyler Hall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://clickontyler.com/blog/?p=263</guid>
		<description><![CDATA[I&#8217;ve written twice about using Amazon S3 to host your website&#8217;s static content. It&#8217;s a great solution for small websites without access to a real content delivery network. And now that Amazon has launched CloudFront on top of S3, it&#8217;s even better.

But there are still ways we can improve the performance. The trick is to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve <a href="http://clickontyler.com/blog/2008/05/building-a-better-website-with-yahoo/">written</a> <a href="http://clickontyler.com/blog/2008/05/using-amazon-s3-as-a-content-delivery-network/">twice</a> about using Amazon S3 to host your website&#8217;s static content. It&#8217;s a great solution for small websites without access to a real content delivery network. And now that Amazon has launched <a href="http://aws.amazon.com/cloudfront/">CloudFront</a> on top of S3, it&#8217;s even better.</p>

<p>But there are still ways we can improve the performance. The trick is to upload our files using custom headers so they&#8217;re served back with a proper expiration date and gzipped when possible &mdash; i.e., the techniques recommended by <a href="http://developer.yahoo.com/yslow/">YSlow</a>.</p>

<p>I&#8217;ve written a command line tool which simplifies this process called <a href="http://github.com/tylerhall/s3up/"><code>s3up</code></a>. The idea is simple. It uploads a single file to S3, sets a far future expiration date, gzips the content, and versions the file by combining the filename with a timestamp. Each of these actions are optional and can be controlled via the command line.</p>

<p>The basic syntax:</p>

<pre><code>s3up myS3bucket js/somefile.js somefile.js
</code></pre>

<p>would upload a local JavaScript file named <code>somefile.js</code> into your Amazon S3 bucket named <code>myS3bucket</code> inside the <code>js</code> folder.</p>

<p>We can build on this command by adding the <code>-x</code> flag, which tells <code>s3up</code> to set a far future expiration header. By default, it chooses a date ten years in the future:</p>

<pre><code>s3up -x myS3bucket js/somefile.js somefile.js
</code></pre>

<p>This lets the browser know to keep the file cached indefinitely.</p>

<p>Passing the <code>-z</code> flag uploads <em>two</em> copies of the file. One normally, and a second that is gzipped and renamed <code>filename.gz.extension</code>. You can then dynamically serve the compressed version to browsers that support it.</p>

<p>Finally, the <code>-t</code> flag uploads and renames the file <code>filename.YYYYmmddHHmmss.extension</code>. This lets you easily create versioned files when you need to update an existing file. (You need to use a new filename since the browser was told earlier to always load from the cache.)</p>

<p>Combining all three options we get:</p>

<pre><code>s3up -txz myS3bucket js/somefile.js somefile.js
</code></pre>

<p>This uploads your file, compresses it, sets the correct expiration date, and versions the filename &mdash; all in one easy step.</p>

<p>If you&#8217;d prefer to choose your own string for versioning, you can specify it with the <code>--version</code> flag:</p>

<pre><code>s3up -txz --version=v2 myS3bucket js/somefile.js somefile.js
</code></pre>

<p>In that example, the file would be stored in S3 as <code>somefilev2.js</code>.</p>

<p><code>s3up</code> also echoes the new filename so you can quickly paste it into your HTML. If you&#8217;re on a Mac, you can automatically copy the new name onto your clipboard by piping <code>s3up</code> to the <a href="http://developer.apple.com/DOCUMENTATION/Darwin/Reference/ManPages/man1/pbcopy.1.html"><code>pbcopy</code></a> command.</p>

<p>If you&#8217;d like to take this a step further and integrate <code>s3up</code> into your existing deploy scripts, you can leave off the filename argument and instead pipe the data to upload via stdin. So, if you&#8217;re using another tool like the <a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a> or <a href="http://wiki.brilaps.com/wikka.php?wakka=byuic">byuic</a>, you can run:</p>

<pre><code>somecommand | s3up -txz myS3bucket js/somefile.js | pbcopy
</code></pre>

<h4>Uploading Multiple Files</h4>

<p>A common task is uploading a whole folder of images. You can do this in one step by appending a slash (/) to the S3 filename and using wildcards to specify multiple local files. Example:</p>

<pre><code>s3up myS3bucket images/ /path/to/your/images/*.jpg
</code></pre>

<p>When <code>s3up</code> sees <code>images/</code> ending with a slash, it treats it like a directory and stores all of your files into it. <strong>Make sure you remember the slash</strong> on <code>images/</code>. That&#8217;s what triggers the special &#8220;directory&#8221; mode uploading.</p>

<h4>Download</h4>

<p>You can grab the latest copy of <code>s3up</code> from the its <a href="http://github.com/tylerhall/s3up/">GitHub project</a>.</p>
<img src="http://feeds.feedburner.com/~r/clickontyler/~4/N9udzyswUqw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://clickontyler.com/blog/2009/02/serving-static-content-on-amazon-s3-with-s3up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Download All of Your Flickr Photos and Sets</title>
		<link>http://clickontyler.com/blog/2009/01/download-all-of-your-flickr-photos-and-sets/</link>
		<comments>http://clickontyler.com/blog/2009/01/download-all-of-your-flickr-photos-and-sets/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 03:27:25 +0000</pubDate>
		<dc:creator>Tyler Hall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://clickontyler.com/blog/?p=261</guid>
		<description><![CDATA[iLife &#8216;09 was released today. And with it came a much improved version of iPhoto with facial recognition, geotagging, and Flickr and Facebook support. With so many new ways to slice and dice my photos, I wanted to start over with a clean slate and get everything organized in iPhoto before re-exporting my library back [...]]]></description>
			<content:encoded><![CDATA[<p>iLife &#8216;09 was released today. And with it came a much improved version of iPhoto with facial recognition, geotagging, and Flickr and Facebook support. With so many new ways to slice and dice my photos, I wanted to start over with a clean slate and get everything organized in iPhoto before re-exporting my library back to Flickr or wherever.</p>

<p>Before I could do that, I had to download all of my photos <em>out</em> of Flickr so I could import them into iPhoto. I wanted something simple that would also retain my photos in their correct sets when downloading. I found <a href="http://greggman.com/pages/flickrdown.htm">one program for Windows</a>, but nothing for Mac. (Did I missing something obvious?)</p>

<p>So here&#8217;s a simple PHP script that uses the <a href="http://phpflickr.com/">phpFlickr library</a> to download all of your photos. It creates a folder for each set plus an extra one for photos not in a set. This grabs your original, full-size photos &mdash; both public and private.</p>

<p>You can get the script from <a href="http://code.google.com/p/tylerhall/">my Google Code project</a> <a href="http://tylerhall.googlecode.com/svn/trunk/flickr/download-all.php">here</a>. You&#8217;ll also need to download and include a copy of the phpFlickr source from <a href="http://code.google.com/p/phpflickr/downloads/list">here</a>.</p>
<img src="http://feeds.feedburner.com/~r/clickontyler/~4/DPmeYECd7uE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://clickontyler.com/blog/2009/01/download-all-of-your-flickr-photos-and-sets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sync Your Adium Chat Logs With Dropbox</title>
		<link>http://clickontyler.com/blog/2009/01/sync-your-adium-chat-logs-with-dropbox/</link>
		<comments>http://clickontyler.com/blog/2009/01/sync-your-adium-chat-logs-with-dropbox/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 01:48:35 +0000</pubDate>
		<dc:creator>Tyler Hall</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://clickontyler.com/blog/?p=256</guid>
		<description><![CDATA[Here&#8217;s a handy trick that will let you sync your Adium chat logs across multiple Macs using Dropbox. From a command line, cd into your Dropbox folder

cd ~/Dropbox


and then

ln -s ~/Library/Application\ Support/Adium\ 2.0/Users/Default/Logs "Adium Logs"


That will create a symlink from your Dropbox folder to your Adium log directory. When syncing, Dropbox will follow this link [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a handy trick that will let you sync your <a href="http://adiumx.com">Adium</a> chat logs across multiple Macs using <a href="https://www.getdropbox.com/">Dropbox</a>. From a command line, <code>cd</code> into your Dropbox folder</p>

<pre><code>cd ~/Dropbox
</code></pre>

<p>and then</p>

<pre><code>ln -s ~/Library/Application\ Support/Adium\ 2.0/Users/Default/Logs "Adium Logs"
</code></pre>

<p>That will create a <a href="http://en.wikipedia.org/wiki/Symbolic_link">symlink</a> from your Dropbox folder to your Adium log directory. When syncing, Dropbox will follow this link and process your chat logs as if they were stored inside your Dropbox folder.</p>

<p>Do this on each Mac you want to sync. I have two Macs at home and another at work &mdash; it&#8217;s worked like a charm so far. But, be sure to <strong>backup your chat logs</strong> the first time you do this just in case something goes wrong.</p>
<img src="http://feeds.feedburner.com/~r/clickontyler/~4/kbYl1avv9lo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://clickontyler.com/blog/2009/01/sync-your-adium-chat-logs-with-dropbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.600 seconds --><!-- Cached page generated by WP-Super-Cache on 2009-07-10 03:53:46 -->
