<?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/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Jeff Crouse &#187; mashup</title>
	<atom:link href="http://www.jeffcrouse.info/tag/mashup/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jeffcrouse.info</link>
	<description>Portfolio and news</description>
	<lastBuildDate>Mon, 28 Nov 2011 18:01:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
	<copyright>CreativeCommons Attribution-Noncommercial-Share Alike 2.5 </copyright>
	<managingEditor>jeff@jeffcrouse.info (Jeff Crouse)</managingEditor>
	<webMaster>jeff@jeffcrouse.info (Jeff Crouse)</webMaster>
	<category>mashup</category>
	<ttl>1440</ttl>
	<image>
		<url>http://4u.jeffcrouse.info/gs/podcast.jpg</url>
		<title>Jeff Crouse</title>
		<link>http://www.jeffcrouse.info</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:new-feed-url>http://www.jeffcrouse.info/category/music/feed/</itunes:new-feed-url>
	<itunes:subtitle>Musical treats from Jeff Crouse</itunes:subtitle>
	<itunes:summary>Musical treats from Jeffish</itunes:summary>
	<itunes:keywords></itunes:keywords>
	<itunes:category text="Music" />
	<itunes:category text="Arts" />
	<itunes:category text="Comedy" />
	<itunes:author>Jeff Crouse</itunes:author>
	<itunes:owner>
		<itunes:name>Jeff Crouse</itunes:name>
		<itunes:email>jeff@jeffcrouse.info</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://4u.jeffcrouse.info/gs/podcast.jpg" />
		<item>
		<title>YouThreeb</title>
		<link>http://www.jeffcrouse.info/projects/youthreeb/</link>
		<comments>http://www.jeffcrouse.info/projects/youthreeb/#comments</comments>
		<pubDate>Mon, 30 Jul 2007 23:00:15 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[eyebeam]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[mashup]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.jeffcrouse.info/?p=40</guid>
		<description><![CDATA[YouThreebe is a tool that allows users to make triptychs out of YouTube videos.   ]]></description>
			<content:encoded><![CDATA[<p><a href="http://beta.jeffcrouse.info/wp-content/uploads/2007/07/Screen-shot-2010-02-19-at-7.43.17-PM.png"><img class="alignright size-medium wp-image-1544" title="Screen shot 2010-02-19 at 7.43.17 PM" src="http://beta.jeffcrouse.info/wp-content/uploads/2007/07/Screen-shot-2010-02-19-at-7.43.17-PM-300x152.png" alt="" width="300" height="152" /></a>YouThreebe is a tool that allows users to make triptychs out of YouTube videos.</p>
<p>&#8220;Taken at face value, <a href="http://www.you3b.com/">You3b </a>is an absolutely horrible idea. &#8221;<br />
- <a href="http://www.downloadsquad.com/2007/08/06/you3b-because-life-is-too-short-to-watch-one-video-at-a-time/">downloadsquad.com</a></p>
<p>&#8220;If your Youtube addiction has you seeking out more and more videos, constantly, non-stop, perhaps you’d be satisfied once and for all with You3B.&#8221;<br />
<a href="http://www.killerstartups.com/Video-Music-Photo/you3b-com-youtube-times-three#ixzz0g23HXdhN">-killerstartups.com</a></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="590" height="443" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=4364387&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=ffffff&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="590" height="443" src="http://vimeo.com/moogaloop.swf?clip_id=4364387&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=ffffff&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffcrouse.info/projects/youthreeb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Earthify</title>
		<link>http://www.jeffcrouse.info/events/earthify/</link>
		<comments>http://www.jeffcrouse.info/events/earthify/#comments</comments>
		<pubDate>Fri, 02 Feb 2007 23:41:44 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mashup]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[screenscraping]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.jeffcrouse.info/?p=47</guid>
		<description><![CDATA[Earthify takes Craigslist posts and maps them onto Google Earth.]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-983 alignleft" style="margin-right: 10px;" title="earthify" src="http://beta.jeffcrouse.info/wp-content/uploads/2008/10/earthify-150x150.jpg" alt="" width="150" height="150" />Earthify takes a page of Craigslist posts and maps them on Google Earth. It has been tested with both search result pages and browse pages in several categories. The results are divided into &#8220;Earthifyable Listings&#8221; and &#8220;Un-Earthifyable Listings&#8221;, the un-earthifyable ones being those that could not be located based on the location provided by the user. In my tests, the listings are Earthifyable more often than not, but it really depends on how much information is in the posting.</p>
<p><span id="more-2587"></span></p>
<pre class="brush: php; title: ; notranslate">

/**
*	Represents one Craigslist page.
*	Can either be a page of results or a single listing page.
*/
class Craigslist extends PlacemarkSource {

private $url;

private $type;

const url_pattern = &quot;/craigslist/i&quot;;

private $regexes = array(
/**
*	This should match the URL of any single Craigslist listing page.
*	They will look like
*	http://montreal.craigslist.org/sub/298262212.html
*	http://newyork.craigslist.org/brk/sys/299139631.html
*/
'single_listing_url' =&gt; &quot;/craigslist.[a-z]{2,3}/(.+).html/i&quot;,

/**
*	This should match the URL of any page with multiple Craigslist pages
*	These pages may look like :
*	http://newyork.craigslist.org/search/bik/brk?query=&amp;amp;amp;amp;amp;amp;amp;minAsk=min&amp;amp;amp;amp;amp;amp;amp;maxAsk=200&amp;amp;amp;amp;amp;amp;amp;hasPic=1
*	OR
*	http://montreal.craigslist.org/sub/
*	http://newyork.craigslist.org/que/bik/
*	BUT NOT
*	http://montreal.craigslist.org/sub/298262212.html
*	http://newyork.craigslist.org/brk/sys/299139631.html
*/
'multiple_listing_page_url' =&gt; &quot;/craigslist.[a-z]{2,3}/i&quot;,

/**
*	This should match the URL of any Craigslist listing feed.
*	These pages should looke like:
*	http://philadelphia.craigslist.org/apa/index.rss
*	http://philadelphia.craigslist.org/search/apa?query=&amp;amp;amp;amp;amp;amp;amp;minAsk=&amp;amp;amp;amp;amp;amp;amp;maxAsk=200&amp;amp;amp;amp;amp;amp;amp;bedrooms=&amp;amp;amp;amp;amp;amp;amp;addTwo=purrr&amp;amp;amp;amp;amp;amp;amp;addThree=wooof&amp;amp;amp;amp;amp;amp;amp;hasPic=1&amp;amp;amp;amp;amp;amp;amp;format=rss
*/
'feed_url' =&gt; &quot;/craigslist.[a-z]{2,3}/(.+)(index.|format=)?(rss)/i&quot;,

/**
*	This Regex should match 1) URLs of listing pages 2) Titles of listings
*/
'get_listings' =&gt; &quot;/&lt;p&gt;(.*?)&lt;a href=&quot;(.*?)&quot;&gt;(.*?)&lt;/a&gt;&lt;font size=&quot;-1&quot;&gt; ((.*?))&lt;/font&gt;(.*?)?&lt;/p&gt;/i&quot;,

/**
*	In the pages of most Craigslist listings, the city that you are exploring is in a link at the top.
*	&lt;a href=&quot;http://philadelphia.craigslist.org&quot;&gt;philadelphia craigslist&lt;/a&gt;
*	or
*	&lt;a href=&quot;/&quot;&gt; new york craigslist&lt;/a&gt;
*/
'city_in_title' =&gt; &quot;/&lt;a href=&quot;(.+)?&quot;&gt;(.*?) craigslist&lt;/a&gt;/i&quot;
);

/*
*	The constructor for a Craigslist listing.
*	Most times, if you are parsing an entire page of listings, you will know the city
*	for every posting and the title along with the url before you construct them.  So if you
*	provide them, the constructor will go faster.
*/
function Craigslist($_url, $limit=null) {

$this-&gt;url = $_url;
$this-&gt;limit = $limit;

// First we will figure out what kind of page we are dealing with.
if(preg_match($this-&gt;regexes['single_listing_url'], $this-&gt;url)) {

$this-&gt;type = &quot;single&quot;; // an actual listing page.

} else if(preg_match($this-&gt;regexes['feed_url'], $this-&gt;url)) {

$this-&gt;type = &quot;feed&quot;;	// A feed of listings

} else if(preg_match($this-&gt;regexes['multiple_listing_page_url'], $this-&gt;url)) {

$this-&gt;type = &quot;multiple&quot;;  //  a search results or browse page

}
}

/**
*	Takes a relative URL from the current page and turns it into a full URL.
*/
function unrelativize($relative_url) {
$u = parse_url($this-&gt;url);
if(substr($relative_url, 0, 1) == '/') {
return &quot;http://&quot;.$u['host'].$relative_url;
} else {
return &quot;http://&quot;.$u['host'].dirname($u['path']).$relative_url;
}
}

/*
function parsePlacemarks() {
foreach($this-&gt;placemarks as $p) {
$p-&gt;parse();
}
}
*/

function getPlacemarks() {

switch($this-&gt;type) {

// It is a single listing, so just parse the current page.
case 'single':
$this-&gt;placemarks[] = new CraigsListing($this-&gt;url);
break;

// If if is a page of many listings, get all of the URLs.
case 'multiple':
$content = HttpClient::quickGet($this-&gt;url);

// The city appears in a link at the top.
preg_match($this-&gt;regexes['city_in_title'], $content, $matches);
$city = $matches[2];

//assert('$city!=null');

preg_match_all($this-&gt;regexes['get_listings'], $content, $matches);
$listing_urls = $matches[2];
$titles = $matches[3];
$locations = $matches[4];

foreach(array_keys($listing_urls) as $i) {
$listing_urls[$i] = $this-&gt;unrelativize($listing_urls[$i]);
}

if(count($listing_urls) == 0) {
trigger_error(&quot;Earthify couldn't find any listings on the page you provided.&quot;);
}

// Loop through all of the matches and make placemarks from them.
$max = isset($this-&gt;limit)
? min(count($listing_urls), $this-&gt;limit)
: count($listing_urls);

for($i=0; $i&lt;$max; $i++) {
// Check to make sure the link exists first
if(HttpClient::url_exists($listing_urls[$i])) {
$listing = new CraigsListing($listing_urls[$i]);
$listing-&gt;setTitle($titles[$i]);
$listing-&gt;setCity($city);
$this-&gt;placemarks[] = $listing;
} else {
trigger_error(&quot;{$listing_urls[$i]} returned a 200 or 302 status, which means that it doesn't exist.&quot;, E_USER_WARNING);
}
}
break;

// If this is the RSS feed from a particular kind Craigslist page, just parse the RSS
case 'feed':
$content = HttpClient::quickGet($this-&gt;url);

$xml = new SimpleXMLElement($content);

// The city name appears in the channel title.
preg_match(&quot;/&lt;title&gt;craigslist | (.*?) in (.+)&lt;/title&gt;/&quot;, $content, $matches);
$city = $matches[2];

//assert('$city!=null');

// Loop through all of the matches and make placemarks from them.
$max = isset($this-&gt;limit)
? min(count($xml-&gt;item), $this-&gt;limit)
: count($xml-&gt;item);

for($i=0; $i&lt;$max; $i++) {

$link =  (string)$xml-&gt;item[$i]-&gt;link;

// Check to make sure the URL exists first.
if(HttpClient::url_exists($link)) {
$listing = new CraigsListing($link);
$listing-&gt;title = (string)$xml-&gt;item[$i]-&gt;title;
$listing-&gt;city = $city;
$this-&gt;placemarks[] = $listing;
} else {
trigger_error(&quot;{$listing_urls[$i]} returned a 200 or 302 status, which means that it doesn't exist.&quot;, E_USER_WARNING);
}
}
break;
}

return $this-&gt;placemarks;
} // end getPlacemarks()
}
</pre>
<pre class="brush: php; title: ; notranslate">
/**************************
*
*	Serializer.php
*	Turns an array of Placemark objects into an Earthify KML script.
*
*	Written by Jeff Crouse at Eyebeam
*	February 8, 2007
*
***************************/
class KMLSerializer {

public static function serialize($placemarks) {

// Create the XML document and the root tag (kml)
$dom = new DomDocument('1.0', 'utf-8');
$root = $dom-&gt;createElement(&quot;kml&quot;);
$dom-&gt;appendChild($root);

// Create the Document tag
$doc = $dom-&gt;createElement(&quot;Document&quot;);
$root-&gt;appendChild($doc);

// Add a Earthify tag to the document tag.
$doc-&gt;appendChild($dom-&gt;createElement(&quot;name&quot;, &quot;Earthify&quot;));

// Make two folders within the document.  One for locatable items, one for lost ones
$found = $dom-&gt;createElement('Folder');
$found-&gt;appendChild($dom-&gt;createElement(&quot;name&quot;, &quot;Earthifyable Listings&quot;));
$doc-&gt;appendChild($found);

$lost = $dom-&gt;createElement('Folder');
$lost-&gt;appendChild($dom-&gt;createElement(&quot;name&quot;, &quot;Un-Earthifyable Listings&quot;));
$lost-&gt;appendChild($dom-&gt;createElement(&quot;description&quot;, &quot;Items whose coordinates could not be geocoded.&quot;));
$doc-&gt;appendChild($lost);

// Loop through all of the listings and add them to the document.
foreach($placemarks as $placemark) {
if($placemark instanceof Placemark) {

// Make the placemark tag in which all of this shit will go.
$placemark_dom = $dom-&gt;createElement(&quot;Placemark&quot;);
$placemark_dom-&gt;setAttribute(&quot;id&quot;, $placemark-&gt;getId());

// Make the name tag for the Placemark
$name = $dom-&gt;createElement(&quot;name&quot;, htmlspecialchars($placemark-&gt;getTitle()));
$placemark_dom-&gt;appendChild($name);

// Make the description tag for the placemark.
$description = $dom-&gt;createElement(&quot;description&quot;);
$cdata = $dom-&gt;createCDATASection($placemark-&gt;description());
$description-&gt;appendChild( $cdata );
$placemark_dom-&gt;appendChild($description);

// If we can't find any coordinates, add this item to the &quot;lost&quot; folder.
if($placemark-&gt;getCoords()) {
// Make the Point element for the placemark
$point = $dom-&gt;createElement(&quot;Point&quot;);
$coords = $dom-&gt;createElement(&quot;coordinates&quot;, $placemark-&gt;getCoords());
$point-&gt;appendChild($coords);
$placemark_dom-&gt;appendChild($point);

// Add the placemark to the &quot;Found&quot; folder
$found-&gt;appendChild($placemark_dom);
} else {
$lost-&gt;appendChild($placemark_dom);

}
} else {
trigger_error(&quot;KMLSerializer received something that wasn't a Placemark.&quot;, E_WARNING);
}
}

return $dom-&gt;saveXML();
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffcrouse.info/events/earthify/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Real-time Art</title>
		<link>http://www.jeffcrouse.info/projects/real-time-art/</link>
		<comments>http://www.jeffcrouse.info/projects/real-time-art/#comments</comments>
		<pubDate>Fri, 23 Jun 2006 19:09:40 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[mashup]]></category>
		<category><![CDATA[school]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webservices]]></category>
		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://www.jeffcrouse.info/?p=321</guid>
		<description><![CDATA[My MS thesis from Georgia Tech.]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-327" style="margin-right: 10px;" title="realtimeart" src="http://beta.jeffcrouse.info/wp-content/uploads/2008/08/realtimeart.png" alt="" width="150" height="150" /></p>
<p>This document is the written portion of my MS defense at Georgia Tech.  It is a survey of artworks that use live information sources, and a study of how emerging web technologies can encourage this type of art.  Finally, it proposes <a href="http://switchboard.sourceforge.net">Switchboard</a>, my library for real-time art, and discusses the design and implementation of it.</p>
<p><span id="more-321"></span></p>

]]></content:encoded>
			<wfw:commentRss>http://www.jeffcrouse.info/projects/real-time-art/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

