<?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>Island 94 &#187; video</title>
	<atom:link href="http://www.island94.org/tag/video/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.island94.org</link>
	<description>Ben Sheldon&#039;s lost &#38; found</description>
	<lastBuildDate>Wed, 18 Jan 2012 17:04:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Geekout: Video on Maps for Cable Access TV</title>
		<link>http://www.island94.org/2007/08/geekout-video-on-maps-for-cable-access-tv/</link>
		<comments>http://www.island94.org/2007/08/geekout-video-on-maps-for-cable-access-tv/#comments</comments>
		<pubDate>Thu, 02 Aug 2007 21:31:21 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Cable Access]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[geekout]]></category>
		<category><![CDATA[portfolio]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<p><figure title=""><img src="http://www.island94.org/wp-content/uploads/2007/08/mediamap-600x448.jpg" class="attachment-h5bp-post-image wp-post-image" alt="mediamap" title="mediamap" /></figure></p>I recently did some Drupal development work for Cambridge Community Television. As part of the really amazing work they are doing combining new media with traditional Cable Access Television, CCTV has been mapping videos their members produce. They call this project the Mediamap. I was really excited to work on the Mediamap with CCTV because [...]<p><a href="http://www.island94.org/2007/08/geekout-video-on-maps-for-cable-access-tv/">&#9734; Permalink</a></p>


<strong>Related posts:</strong><ol><li><a href='http://www.island94.org/2011/03/the-48-hour-mobile-web-app-drunken-stumble/' rel='bookmark' title='The 48 hour mobile web app: Drunken Stumble'>The 48 hour mobile web app: Drunken Stumble</a> <small>Last weekend I participated in the Boston Hack Day Challenge, a 48 hour (so I’m not sure why they called...</small></li>
<li><a href='http://www.island94.org/2011/03/a-form-from-my-favorites/' rel='bookmark' title='A form from my favorites'>A form from my favorites</a> <small>Above is the signup form from Brompt, the blog reminder service I built a few years ago for undisciplined bloggers...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><figure title=""><img src="http://www.island94.org/wp-content/uploads/2007/08/mediamap-600x448.jpg" class="attachment-h5bp-post-image wp-post-image" alt="mediamap" title="mediamap" /></figure></p><p><img class="aligncenter size-medium wp-image-2572" title="mediamap" src="http://www.island94.org/wp-content/uploads/2007/08/mediamap-600x448.jpg" alt="" width="600" height="448" /></p>
<p>I recently did some <a href="http://drupal.org">Drupal</a> development work for <a href="http://cctvcambridge.org">Cambridge Community Television</a>.  As part of the really amazing work they are doing combining new media with traditional <a href="http://alliancecm.org">Cable Access Television</a>, CCTV has been mapping videos their members produce.  They call this project the <a href="http://cctvcambridge.org/mediamap">Mediamap</a>.</p>
<p>I was really excited to work on the Mediamap with CCTV because of my long <a href="http://island94.org/articles/future-cable-access">involvement</a> with Cable Access Television, most notably the now-defunct <a href="http://digitalbicycle.org">DigitalBicycle Project</a> and the community maintained directory of Cable Access Stations I built and administer: <a href="http://mappingaccess.com">MappingAccess.com</a>.</p>
<p>Despite CCTV running their website on Drupal, their first proof-of-concept version of the Mediamap was created manually, using the very capable <a href="http://mapbuilder.net">Mapbuilder.net</a> service and copy-and-pasted embedded flash video.  While simple from a technological standpoint, they were running to problems optimizing the workflow of updating the map; changes had to be made via the Mapbuilder.net interface, with a single username and password, then manually parsed to remove some coding irregularities, and finally copy and pasted whole into a page on their website.</p>
<p>I was asked to improve the workflow and ultimately take fuller advantage of Drupal's built-in user management and content management features.  For instance, taking advantage of CCTV's current member submitted video capabilities and flowing them into the map as an integrated report, not a separate and parallel system.</p>
<p>In my discussions with them, a couple of issues came up.  Foremost was that CCTV was running an older version of Drupal: 4.7.  While still quite powerful, many newer features and contributed modules were not available for this earlier release.  The current version of Drupal, 5.1, has many rich, well-developed utilities for creating reports and mapping them: <a href="http://drupal.org/project/cck">Content Construction Kit (CCK)</a> + <a href="http://drupal.org/project/views">Views</a> + <a href="http://drupal.org/project/gmap">Gmap</a> + <a href="http://drupal.org/project/location">Location</a>.  As it was though, with the older version, I would have to develop the additional functionality manually.</p>
<p>The following is a description, with code examples, of the functionality I created for the Mediamap.  Additionally, following this initial development, CCTV upgraded their Drupal installation to 5.1, giving me the opportunity to demonstrate the ease and power of Drupal's most recent release---rendering blissfully obsolete most of the custom coding I had done.</p>
<p>Location and Gmap was used in both versions for storing geographic data and hooking into the Google Map API.  One of Drupal's great strengths is the both the diversity of contributed modules, and the flexibility with which a developer can use them.</p>
<h3>Adding additional content fields</h3>
<p>CCTV already has a process in which member's can submit content nodes.  In 4.7, the easiest way to add additional data fields to these was with a custom <a href="http://api.drupal.org/api/file/nodeapi_example.module/4.7">NodeAPI module</a>.  CCTV was interested in using embedded flash video, primarily from <a href="http://blip.tv">Blip.tv</a>, but also Google Video or YouTube if the flexibility was needed.  To simplify the process, we decided on just adding the cut-and-paste embed code to a custom content field in existing nodes.</p>
<p>To do this, I created a new module that invoked hook_nodeapi:</p>
<p><code><br />
/**<br />
* Implementation of hook_nodeapi<br />
*/<br />
function cambridge_mediamap_nodeapi(&amp;$node, $op, $teaser, $page) {<br />
switch ($op) {</code></p>
<p><code>case 'validate':<br />
if (variable_get('cambridge_mediamap_'. $node-&gt;type, TRUE)) {<br />
if (user_access('modify node data')) {<br />
if ($node-&gt;cambridge_mediamap['display'] &amp;&amp; $node-&gt;cambridge_mediamap['embed'] == '') {<br />
form_set_error('cambridge_mediamap', t('Media Map: You must enter embed code or disable display of this node on the map'));<br />
}<br />
}<br />
}<br />
break;</code></p>
<p><code> </code></p>
<p><code>case 'load':<br />
$object = db_fetch_object(db_query('SELECT display, embed FROM {cambridge_mediamap} WHERE nid = %d', $node-&gt;nid));</code></p>
<p><code>$embed = $object-&gt;embed;<br />
$embed_resize = cambridge_mediamap_resize($embed);</p>
<p>return array(<br />
'cambridge_mediamap' =&gt; array(<br />
'display' =&gt; $object-&gt;display,<br />
'embed' =&gt; $embed,<br />
'embed_resize' =&gt; $embed_resize,<br />
)<br />
);<br />
break;</p>
<p>case 'insert':<br />
db_query("INSERT INTO {cambridge_mediamap} (nid, display, embed) VALUES (%d, %d, '%s')", $node-&gt;nid, $node-&gt;cambridge_mediamap['display'], $node-&gt;cambridge_mediamap['embed']);<br />
break;</p>
<p>case 'update':<br />
db_query('DELETE FROM {cambridge_mediamap} WHERE nid = %d', $node-&gt;nid);<br />
db_query("INSERT INTO {cambridge_mediamap} (nid, display, embed) VALUES (%d, %d, '%s')", $node-&gt;nid, $node-&gt;cambridge_mediamap['display'], $node-&gt;cambridge_mediamap['embed']);<br />
break;</p>
<p>case 'delete':<br />
db_query('DELETE FROM {cambridge_mediamap} WHERE nid = %d', $node-&gt;nid);<br />
break;</p>
<p></code></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><code> case 'view':<br />
break;<br />
}<br />
}<br />
</code></p>
<p>As you can see, there is a considerable amount of coding required, from defining the form, validating input and configuring database storage and retrieval calls.</p>
<p>Now that we have the glue for the custom field, we have to configure what node types that custom field appears on.  Additionally, we need to set up administrative settings to configure where that custom field will appear, and lastly insert that field into the node edit screen:</p>
<p><code><br />
/**<br />
* Implementation of hook_form_alter<br />
*/<br />
function cambridge_mediamap_form_alter($form_id, &amp;$form) {<br />
// We're only modifying node forms, if the type field isn't set we don't need<br />
// to bother.<br />
if (!isset($form['type'])) {<br />
return;<br />
}</code></p>
<p><code>//disable the Gmap module's location map for unauthorized users<br />
//unfortunately Gmap.module doesn't have this setting<br />
if (isset($form['coordinates'])) {<br />
if (!user_access('modify node data')) {<br />
unset($form['coordinates']);<br />
}<br />
}</code></p>
<p><code> </code></p>
<p><code>// Make a copy of the type to shorten up the code<br />
$type =  $form['type']['#value'];</code></p>
<p><code>// Is the map enabled for this content type?<br />
$enabled = variable_get('cambridge_mediamap_'. $type, 0);</p>
<p>switch ($form_id) {<br />
// We need to have a way for administrators to indicate which content<br />
// types should have the additional media map information added.<br />
case $type .'_node_settings':<br />
$form['workflow']['cambridge_mediamap_'. $type] = array(<br />
'#type' =&gt; 'radios',<br />
'#title' =&gt; t('Cambridge Mediamap setting'),<br />
'#default_value' =&gt; $enabled,<br />
'#options' =&gt; array(0 =&gt; t('Disabled'), 1 =&gt; t('Enabled')),<br />
'#description' =&gt; t('Allow the attaching of externally hosted imbedded video to be displayed in a map?'),<br />
);<br />
break;</p>
<p>case $type .'_node_form':</p>
<p>if ($enabled &amp;&amp; user_access('modify node data')) {<br />
//create the fieldset<br />
$form['cambridge_mediamap'] = array(<br />
'#type' =&gt; 'fieldset',<br />
'#title' =&gt; t('Media Map'),<br />
'#collapsible' =&gt; TRUE,<br />
'#collapsed' =&gt; FALSE,<br />
'#tree' =&gt; TRUE,<br />
);<br />
//insert the embed code<br />
$form['cambridge_mediamap']['embed'] = array(<br />
'#type' =&gt; 'textarea',<br />
'#title' =&gt; t('Video Embed Code'),<br />
'#default_value' =&gt;  $form['#node']-&gt;cambridge_mediamap['embed'],<br />
'#cols' =&gt; 60,<br />
'#rows' =&gt; 5,<br />
'#description' =&gt; t('Copy and paste the embed code from an external video or media hosting service'),<br />
);<br />
//enable or disable on map<br />
$form['cambridge_mediamap']['display'] = array(<br />
'#type' =&gt; 'select',<br />
'#title' =&gt; t('Display this node'),<br />
'#default_value' =&gt; $form['#node']-&gt;cambridge_mediamap['display'],<br />
'#options' =&gt; array(<br />
'0' =&gt; t('Disable display'),<br />
'1' =&gt; t('Enable display'),<br />
),<br />
);</p>
<p></code></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><code> }<br />
break;<br />
}<br />
}<br />
</code></p>
<p>As you can see, that's a lot of lines of code for what we essentially can do, in Drupal 5.1 with CCK.  CCK allows you, graphically through the Drupal web-interface, to create a new content field and add it to a node type; it takes about a minute.</p>
<h3>Building the Map</h3>
<p>The primary goal of rebuilding the Mediamap using native Drupal was workflow optimization: it was frustrating to submit information both within Drupal and then recreate it within Mapbuilder.  In essence, the map should be just another report of Drupal content: you may have a short bulleted list of the top five articles, a paginated history with teasers and author information, or a full-blown map, but most importantly, all of it is flowing dynamically out of the Drupal database.</p>
<p>The Gmap module provides many powerful ways to integrate the Google Map API with Drupal.  While Gmap for 4.7 provides a default map of content it would not provide the features or customizability we desired with the Mediamap.  Instead, one of the most powerful ways to use Gmap is to hook directly into the module's own API-like functions:</p>
<p><code><br />
/**<br />
* A page callback to draw the map<br />
*/<br />
function cambridge_mediamap_map() {<br />
$output = '';</code></p>
<p><code>//Collect the nodes to be displayed<br />
$results = db_query('SELECT embed, nid FROM {cambridge_mediamap} WHERE display = 1');</code></p>
<p><code> </code></p>
<p><code>//Initialize our marker array<br />
$markers = array();</code></p>
<p><code>//check to see what modules are enabled<br />
$location_enabled = module_exist('location');<br />
$gmap_location_enabled = module_exist('gmap_location');</p>
<p>//load each node and set it's attributes in the marker array<br />
while($item = db_fetch_object($results)) {<br />
$latitude = 0;<br />
$longitude = 0;<br />
//load the node<br />
$node = node_load(array('nid' =&gt; $item-&gt;nid));</p>
<p>//set the latitude and longitude<br />
//give location module data preference over gmap module data<br />
if ($location_enabled) {<br />
$latitude = $node-&gt;location['latitude'];<br />
$longitude = $node-&gt;location['longitude'];<br />
}<br />
elseif ($gmap_location_enabled) {<br />
$latitude = $node-&gt;gmap_location_latitude;<br />
$longitude = $node-&gt;gmap_location_longitude;<br />
}</p>
<p>if ($latitude &amp;&amp; $longitude) {<br />
$markers[] = array(<br />
'label' =&gt; theme('cambridge_mediamap_marker', $node),<br />
'latitude' =&gt; $latitude,<br />
'longitude' =&gt; $longitude,<br />
'markername' =&gt; variable_get('cambridge_mediamap_default_marker', 'marker'),<br />
);<br />
}<br />
}</p>
<p>$latlon = explode(',', variable_get('cambridge_mediamap_default_latlong','42.369452,-71.100426'));</p>
<p>$map=array(<br />
'id' =&gt; 'cambridge_mediamap',<br />
'latitude' =&gt; trim($latlon[0]),<br />
'longitude'=&gt; trim($latlon[1]),<br />
'width' =&gt; variable_get('cambridge_mediamap_default_width','100%'),<br />
'height' =&gt; variable_get('cambridge_mediamap_default_height','500px'),<br />
'zoom' =&gt; variable_get('cambridge_mediamap_default_zoom', 13),<br />
'control' =&gt; variable_get('cambridge_mediamap_default_control','Large'),<br />
'type' =&gt; variable_get('cambridge_mediamap_default_type','Satellite'),<br />
'markers' =&gt; $markers,<br />
);</p>
<p></code></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><code> return gmap_draw_map($map);<br />
}</code></p>
<p>As you can see, this is quite complicated.  Drupal 5.1 offers the powerful Views module, which allows one to define custom reports, once again graphically from the Drupal web-interface, in just a couple minutes of configuration.  The gmap_views module, which ships with Gmap, allows one to add those custom reports to a Google Map, which is incredibly useful and renders obsolete much of the development work I did.</p>
<h3>On displaying video in maps</h3>
<p>In my discussions with CCTV, we felt it most pragmatic to use the embedded video code provided by video hosting services such as Blip.tv.  While we could have used one of the Drupal video modules, we wanted the ability to host video offsite due to storage constraints.  While I was concerned about the danger of code injection via minimally validated inputs, we felt that this would be of small danger because the content would be maintained by CCTV staff and select members.</p>
<p>The markers were themed using the embedded video field pulled from the Drupal database, along with the title and a snippet of the description, all linking back to the full content node.</p>
<pre><code>/**
 * A theme function for our markers
 */

function theme_cambridge_mediamap_marker($node) {

  $output = '
<div class="mediamap-marker">';
  $output .= '
<div class="title">' . l($node-&gt;title, 'node/' . $node-&gt;nid) . '</div>

';
  $output .= '
<div class="embed">' . $node-&gt;cambridge_mediamap['embed_resize'] . '</div>

';
  $output .= '</div>

';

  return $output;
}</code></pre>
<p>With Drupal 5.1 and Views, we still had to override the standard marker themes, but this was simple and done through the standard methods.</p>
<p>One of the most helpful pieces was some code developed by <a href="http://circuitous.org">Rebecca White</a>, who I previously worked with on <a href="http://panlexicon.com">Panlexicon</a>.  She provided the critical pieces of code that parsed the embedded video code and resized it for display on small marker windows.</p>
<pre><code>/**
 * Returns a resized embed code
 */
function cambridge_mediamap_resize($embed = '') {
  if (!$embed) {
    return '';
  }

  list($width, $height) = cambridge_mediamap_get_embed_size($embed);

  //width/height ratio
  $width_to_height = $width / $height;

  $max_width = variable_get('cambridge_mediamap_embed_width','320');
  $max_height = variable_get('cambridge_mediamap_embed_height','240');

  //shrink down widths while maintaining proportion
  if ($width &gt;= $height) {
    if ($width &gt; $max_width) {
      $width = $max_width;
      $height = (1 / $width_to_height) * $width;
    }
    if ($height &gt; $max_height) {
      $height = $max_height;
      $width = ($width_to_height) * $height;
    }
  }
  else {
    if ($height &gt; $max_height) {
      $height = $max_height;
      $width = ($width_to_height) * $height;
    }
    if ($width &gt; $max_width) {
      $width = $max_width;
      $height = (1 / $width_to_height) * $width;
    }
  }

  return cambridge_mediamap_set_embed_size($embed, intval($width), intval($height));
}

/**
 * find out what size the embedded thing is
 */
function cambridge_mediamap_get_embed_size($html) {
	preg_match('/<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100" height="100" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><embed type="application/x-shockwave-flash" width="100" height="100"></embed></object>]*width(\s*=\s*"|:\s*)(\d+)/i', $html, $match_width);
	preg_match('/<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100" height="100" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><embed type="application/x-shockwave-flash" width="100" height="100"></embed></object>]*height(\s*=\s*"|:\s*)(\d+)/i', $html, $match_height);

	return array($match_width[2], $match_height[2]);
}

/**
 * set the size of the embeded thing
 */
function cambridge_mediamap_set_embed_size($html, $width, $height) {
	$html = preg_replace('/(&lt;(embed|object)\s[^&gt;]*width(\s*=\s*"|:\s*))(\d+)/i', '${1}' . $width, $html);
	$html = preg_replace('/(&lt;(embed|object)\s[^&gt;]*height(\s*=\s*"|:\s*))(\d+)/i', '${1}' . $height, $html);

	return $html;
}

/**
 * returns the base url of the src attribute.
 * youtube = www.youtube.com
 * blip = blip.tv
 * google video = video.google.com
 */
function cambridge_mediamap_get_embed_source($html) {
	preg_match('/<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100" height="100" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><embed type="application/x-shockwave-flash" width="100" height="100"></embed></object>]*src="http:\/\/([^\/"]+)/i', $html, $match_src);
	return $match_src[1];
}</code></pre>
<h3>The Wrap-Up</h3>
<p>While it may not seem so from the lines of code above, developing for Drupal is still relatively easy.  Drupal provides a rich set of features for developers, <a href="http://api.drupal.org">well documented features</a>, and strong <a href="http://drupal.org/coding-standards">coding standards</a>---making reading other people's code and learning from it incredibly productive.</p>
<p>Below is the entirety of the custom module I developed for the 4.7 version of the CCTV Media Map.  Because it was custom and intended to be used in-house, many important, release worthy functions were omitted, such as richer administrative options and module/function verifications.</p>
<pre><code> 'cambridge_mediamap',
      'title' =&gt; t('Mediamap'),
      'callback' =&gt; 'cambridge_mediamap_map',
      'access' =&gt; user_access('access mediamap'),
    );
  }
  return $items;
}

/**
 * Implementation of hook_nodeapi
 */
function cambridge_mediamap_nodeapi(&amp;$node, $op, $teaser, $page) {
  switch ($op) {

    case 'validate':
      if (variable_get('cambridge_mediamap_'. $node-&gt;type, TRUE)) {
        if (user_access('modify node data')) {
          if ($node-&gt;cambridge_mediamap['display'] &amp;&amp; $node-&gt;cambridge_mediamap['embed'] == '') {
            form_set_error('cambridge_mediamap', t('Media Map: You must enter embed code or disable display of this node on the map'));
          }
        }
      }
      break;

    case 'load':
      $object = db_fetch_object(db_query('SELECT display, embed FROM {cambridge_mediamap} WHERE nid = %d', $node-&gt;nid));

      $embed = $object-&gt;embed;
      $embed_resize = cambridge_mediamap_resize($embed);

      return array(
        'cambridge_mediamap' =&gt; array(
          'display' =&gt; $object-&gt;display,
          'embed' =&gt; $embed,
          'embed_resize' =&gt; $embed_resize,
         )
      );
      break;

    case 'insert':
      db_query("INSERT INTO {cambridge_mediamap} (nid, display, embed) VALUES (%d, %d, '%s')", $node-&gt;nid, $node-&gt;cambridge_mediamap['display'], $node-&gt;cambridge_mediamap['embed']);
      break;

    case 'update':
      db_query('DELETE FROM {cambridge_mediamap} WHERE nid = %d', $node-&gt;nid);
      db_query("INSERT INTO {cambridge_mediamap} (nid, display, embed) VALUES (%d, %d, '%s')", $node-&gt;nid, $node-&gt;cambridge_mediamap['display'], $node-&gt;cambridge_mediamap['embed']);
      break;

    case 'delete':
      db_query('DELETE FROM {cambridge_mediamap} WHERE nid = %d', $node-&gt;nid);
      break;

    case 'view':
      break;
  }
} 

/**
 * Returns a resized embed code
 */
function cambridge_mediamap_resize($embed = '') {
  if (!$embed) {
    return '';
  }

  list($width, $height) = cambridge_mediamap_get_embed_size($embed);

  //width/height ratio
  $width_to_height = $width / $height;

  $max_width = variable_get('cambridge_mediamap_embed_width','320');
  $max_height = variable_get('cambridge_mediamap_embed_height','240');

  //shrink down widths while maintaining proportion
  if ($width &gt;= $height) {
    if ($width &gt; $max_width) {
      $width = $max_width;
      $height = (1 / $width_to_height) * $width;
    }
    if ($height &gt; $max_height) {
      $height = $max_height;
      $width = ($width_to_height) * $height;
    }
  }
  else {
    if ($height &gt; $max_height) {
      $height = $max_height;
      $width = ($width_to_height) * $height;
    }
    if ($width &gt; $max_width) {
      $width = $max_width;
      $height = (1 / $width_to_height) * $width;
    }
  }

  return cambridge_mediamap_set_embed_size($embed, intval($width), intval($height));
}

/**
 * find out what size the embedded thing is
 */
function cambridge_mediamap_get_embed_size($html) {
	preg_match('/<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100" height="100" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><embed type="application/x-shockwave-flash" width="100" height="100"></embed></object>]*width(\s*=\s*"|:\s*)(\d+)/i', $html, $match_width);
	preg_match('/<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100" height="100" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><embed type="application/x-shockwave-flash" width="100" height="100"></embed></object>]*height(\s*=\s*"|:\s*)(\d+)/i', $html, $match_height);

	return array($match_width[2], $match_height[2]);
}

/**
 * set the size of the embeded thing
 */
function cambridge_mediamap_set_embed_size($html, $width, $height) {
	$html = preg_replace('/(&lt;(embed|object)\s[^&gt;]*width(\s*=\s*"|:\s*))(\d+)/i', '${1}' . $width, $html);
	$html = preg_replace('/(&lt;(embed|object)\s[^&gt;]*height(\s*=\s*"|:\s*))(\d+)/i', '${1}' . $height, $html);

	return $html;
}

/**
 * returns the base url of the src attribute.
 * youtube = www.youtube.com
 * blip = blip.tv
 * google video = video.google.com
 */
function cambridge_mediamap_get_embed_source($html) {
	preg_match('/<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="100" height="100" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><embed type="application/x-shockwave-flash" width="100" height="100"></embed></object>]*src="http:\/\/([^\/"]+)/i', $html, $match_src);
	return $match_src[1];
}

/**
 * Implementation of hook_form_alter
 */
function cambridge_mediamap_form_alter($form_id, &amp;$form) {
  // We're only modifying node forms, if the type field isn't set we don't need
  // to bother.
  if (!isset($form['type'])) {
    return;
  }

  //disable the Gmap module's location map for unauthorized users
  //unfortunately Gmap.module doesn't have this setting
  if (isset($form['coordinates'])) {
    if (!user_access('modify node data')) {
      unset($form['coordinates']);
    }
  }

  // Make a copy of the type to shorten up the code
  $type =  $form['type']['#value'];

  // Is the map enabled for this content type?
  $enabled = variable_get('cambridge_mediamap_'. $type, 0);

  switch ($form_id) {
    // We need to have a way for administrators to indicate which content
    // types should have the additional media map information added.
    case $type .'_node_settings':
      $form['workflow']['cambridge_mediamap_'. $type] = array(
        '#type' =&gt; 'radios',
        '#title' =&gt; t('Cambridge Mediamap setting'),
        '#default_value' =&gt; $enabled,
        '#options' =&gt; array(0 =&gt; t('Disabled'), 1 =&gt; t('Enabled')),
        '#description' =&gt; t('Allow the attaching of externally hosted imbedded video to be displayed in a map?'),
      );
      break;

    case $type .'_node_form':

      if ($enabled &amp;&amp; user_access('modify node data')) {
        //create the fieldset
        $form['cambridge_mediamap'] = array(
          '#type' =&gt; 'fieldset',
          '#title' =&gt; t('Media Map'),
          '#collapsible' =&gt; TRUE,
          '#collapsed' =&gt; FALSE,
          '#tree' =&gt; TRUE,
        );
        //insert the embed code
        $form['cambridge_mediamap']['embed'] = array(
          '#type' =&gt; 'textarea',
          '#title' =&gt; t('Video Embed Code'),
          '#default_value' =&gt;  $form['#node']-&gt;cambridge_mediamap['embed'],
          '#cols' =&gt; 60,
          '#rows' =&gt; 5,
          '#description' =&gt; t('Copy and paste the embed code from an external video or media hosting service'),
        );
        //enable or disable on map
        $form['cambridge_mediamap']['display'] = array(
          '#type' =&gt; 'select',
          '#title' =&gt; t('Display this node'),
          '#default_value' =&gt; $form['#node']-&gt;cambridge_mediamap['display'],
          '#options' =&gt; array(
            '0' =&gt; t('Disable display'),
            '1' =&gt; t('Enable display'),
          ),
        );

      }
      break;
  }
}

/**
 * A page callback to draw the map
 */
function cambridge_mediamap_map() {
  $output = '';

  //Collect the nodes to be displayed
  $results = db_query('SELECT embed, nid FROM {cambridge_mediamap} WHERE display = 1');

  //Initialize our marker array
  $markers = array();

  //check to see what modules are enabled
  $location_enabled = module_exist('location');
  $gmap_location_enabled = module_exist('gmap_location');

  //load each node and set it's attributes in the marker array
  while($item = db_fetch_object($results)) {
    $latitude = 0;
    $longitude = 0;
    //load the node
    $node = node_load(array('nid' =&gt; $item-&gt;nid));

    //set the latitude and longitude
    //give location module data preference over gmap module data
    if ($location_enabled) {
      $latitude = $node-&gt;location['latitude'];
      $longitude = $node-&gt;location['longitude'];
    }
    elseif ($gmap_location_enabled) {
      $latitude = $node-&gt;gmap_location_latitude;
      $longitude = $node-&gt;gmap_location_longitude;
    }

    if ($latitude &amp;&amp; $longitude) {
      $markers[] = array(
        'label' =&gt; theme('cambridge_mediamap_marker', $node),
        'latitude' =&gt; $latitude,
        'longitude' =&gt; $longitude,
        'markername' =&gt; variable_get('cambridge_mediamap_default_marker', 'marker'),
      );
    }
  }

  $latlon = explode(',', variable_get('cambridge_mediamap_default_latlong','42.369452,-71.100426'));

  $map=array(
    'id' =&gt; 'cambridge_mediamap',
    'latitude' =&gt; trim($latlon[0]),
    'longitude'=&gt; trim($latlon[1]),
    'width' =&gt; variable_get('cambridge_mediamap_default_width','100%'),
    'height' =&gt; variable_get('cambridge_mediamap_default_height','500px'),
    'zoom' =&gt; variable_get('cambridge_mediamap_default_zoom', 13),
    'control' =&gt; variable_get('cambridge_mediamap_default_control','Large'),
    'type' =&gt; variable_get('cambridge_mediamap_default_type','Satellite'),
    'markers' =&gt; $markers,
    );

  return gmap_draw_map($map);
}

/**
 * A theme function for our markers
 */

function theme_cambridge_mediamap_marker($node) {

  $output = '
<div class="mediamap-marker">';
  $output .= '
<div class="title">' . l($node-&gt;title, 'node/' . $node-&gt;nid) . '</div>

';
  $output .= '
<div class="embed">' . $node-&gt;cambridge_mediamap['embed_resize'] . '</div>

';
  $output .= '</div>

';

  return $output;
}

/**
 * Settings page
 */
function cambridge_mediamap_settings() {
   // Cambridge data
   //  latitude = 42.369452
   //  longitude = -71.100426

  $form['defaults']=array(
    '#type' =&gt; 'fieldset',
    '#title' =&gt; t('Default map settings'),
  );

  $form['defaults']['cambridge_mediamap_default_width'] = array(
    '#type' =&gt; 'textfield',
    '#title' =&gt; t('Default width'),
    '#default_value' =&gt; variable_get('cambridge_mediamap_default_width','100%'),
    '#size' =&gt; 25,
    '#maxlength' =&gt; 6,
    '#description' =&gt; t('The default width of a Google map. Either px or %'),
  );
  $form['defaults']['cambridge_mediamap_default_height'] = array(
    '#type' =&gt; 'textfield',
    '#title' =&gt; t('Default height'),
    '#default_value' =&gt; variable_get('cambridge_mediamap_default_height','500px'),
    '#size' =&gt; 25,
    '#maxlength' =&gt; 6,
    '#description' =&gt; t('The default height of Mediamap. In px.'),
  );
  $form['defaults']['cambridge_mediamap_default_latlong'] = array(
    '#type' =&gt; 'textfield',
    '#title' =&gt; t('Default center'),
    '#default_value' =&gt; variable_get('cambridge_mediamap_default_latlong','42.369452,-71.100426'),
    '#description' =&gt; 'The decimal latitude,longitude of the centre of the map.  The "." is used for decimal, and "," is used to separate latitude and longitude.',
    '#size' =&gt; 50,
    '#maxlength' =&gt; 255,
    '#description' =&gt; t('The default longitude, latitude of Mediamap.'),
  );
  $form['defaults']['cambridge_mediamap_default_zoom']=array(
    '#type'=&gt;'select',
    '#title'=&gt;t('Default zoom'),
    '#default_value'=&gt;variable_get('cambridge_mediamap_default_zoom', 13),
    '#options' =&gt; drupal_map_assoc(range(0, 17)),
    '#description'=&gt;t('The default zoom level of Mediamap.'),
  );
  $form['defaults']['cambridge_mediamap_default_control']=array(
    '#type'=&gt;'select',
    '#title'=&gt;t('Default control type'),
    '#default_value'=&gt;variable_get('cambridge_mediamap_default_control','Large'),
    '#options'=&gt;array('None'=&gt;t('None'),'Small'=&gt;t('Small'),'Large'=&gt;t('Large')),
  );
  $form['defaults']['cambridge_mediamap_default_type']=array(
    '#type'=&gt;'select',
    '#title'=&gt;t('Default map type'),
    '#default_value'=&gt;variable_get('cambridge_mediamap_default_type','Satellite'),
    '#options'=&gt;array('Map'=&gt;t('Map'),'Satellite'=&gt;t('Satellite'),'Hybrid'=&gt;t('Hybrid')),
  );

  $markers = gmap_get_markers();

  $form['defaults']['cambridge_mediamap_default_marker'] = array(
    '#type'=&gt;'select',
    '#title'=&gt;t('Marker'),
    '#default_value'=&gt;variable_get('cambridge_mediamap_default_marker', 'marker'),
    '#options'=&gt;$markers,
  );

  $form['embed']=array(
    '#type' =&gt; 'fieldset',
    '#title' =&gt; t('Default embedded video settings'),
  );

  $form['embed']['cambridge_mediamap_embed_width'] = array(
    '#type' =&gt; 'textfield',
    '#title' =&gt; t('Default width'),
    '#default_value' =&gt; variable_get('cambridge_mediamap_embed_width','320'),
    '#size' =&gt; 25,
    '#maxlength' =&gt; 6,
    '#description' =&gt; t('The maximum width of embedded video'),
  );
  $form['embed']['cambridge_mediamap_embed_height'] = array(
    '#type' =&gt; 'textfield',
    '#title' =&gt; t('Default height'),
    '#default_value' =&gt; variable_get('cambridge_mediamap_embed_height','240'),
    '#size' =&gt; 25,
    '#maxlength' =&gt; 6,
    '#description' =&gt; t('The maximum height of embedded video.'),
  );

  return $form;
}

/**
 * Prints human-readable (html) information about a variable.
 * Use: print debug($variable_name);
 * Or assign output to a variable.
 */
function debug($value) {
 return preg_replace("/\s/", " ", preg_replace("/\n/", "",
print_r($value, true)));
}</code></pre>


<p><strong>Related posts:</strong><ol><li><a href='http://www.island94.org/2011/03/the-48-hour-mobile-web-app-drunken-stumble/' rel='bookmark' title='The 48 hour mobile web app: Drunken Stumble'>The 48 hour mobile web app: Drunken Stumble</a> <small>Last weekend I participated in the Boston Hack Day Challenge, a 48 hour (so I’m not sure why they called...</small></li>
<li><a href='http://www.island94.org/2011/03/a-form-from-my-favorites/' rel='bookmark' title='A form from my favorites'>A form from my favorites</a> <small>Above is the signup form from Brompt, the blog reminder service I built a few years ago for undisciplined bloggers...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.island94.org/2007/08/geekout-video-on-maps-for-cable-access-tv/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Nonprofit Communications 2.0</title>
		<link>http://www.island94.org/2007/04/nonprofit-communications-2-0/</link>
		<comments>http://www.island94.org/2007/04/nonprofit-communications-2-0/#comments</comments>
		<pubDate>Fri, 13 Apr 2007 14:55:25 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[07ntc]]></category>
		<category><![CDATA[communications]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[nonprofit]]></category>
		<category><![CDATA[nptech]]></category>
		<category><![CDATA[nten]]></category>
		<category><![CDATA[strategy]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Last week I attended NTEN’s 2007 Nonprofit Technology Conference and sat in on a wonderful session entitled Nonprofit Communications 2.0: Seven Steps to Transform Your Organization. Led by Lauren-Glenn Davitian of the CCTV Center for Media and Democracy, the session provided a strong framework for nonprofits to better communicate in an increasingly networked society. I [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-8837019602624623626&#038;hl=en" flashvars=""> </embed></p>
</p>
<p>Last week I attended NTEN’s 2007 <a href="http://nten.org/ntc">Nonprofit Technology Conference</a> and sat in on a wonderful session entitled <strong>Nonprofit Communications 2.0: Seven Steps to Transform Your Organization.</strong> Led by <a href="http://www.cctv.org/index.php?SiteAlias=cctv&#038;PageAlias=CCTV_Staff#LG">Lauren-Glenn Davitian</a> of the <a href="http://www.cctv.org/">CCTV Center for Media and Democracy</a>, the session provided a strong framework for nonprofits to better communicate in an increasingly networked society.</p>
<p>I am also very lucky to serve with Lauren-Glenn on the  editorial board of the <a href="http://communitymediareview.org/">Community Media Review</a>.</p>
<p>The video itself is approximately 1 hour, 24 minutes long and worth every second, but I included my notes from the session below.</p>
<p><!--break--></p>
<blockquote><p>
Community building talent is the single most important resource in the modern world.
</p>
</blockquote>
<div class="attribution">Peter Drucker</div>
<h3>How to engage and mobilize members</h3>
<p>A Communications framework for thinking about how organizational objectives are met through interaction.  The correlating Development framework is in parenthesis.</p>
<ol>
<li><strong>Welcome</strong> (Prospect)</li>
<li><strong>Educate</strong> (Cultivation)</li>
<li><strong>Ask</strong> (Involvement)</li>
<li><strong>Thank</strong> (Stewardship)</li>
</ol>
<h3>The Seven Steps</h3>
<ol>
<li><strong>Assessment</strong>: Defining your goal (What behavior are you trying to change in undertaking a communications strategy?), audience (an explicit, targeted “who” and their values), evaluating your infrastructure (orthodoxies, structure, time, leadership)</li>
<li><strong>Awareness</strong>: Start by searching <a href="http://nten.org">NTEN</a>, <a href="http://techsoup.org">TechSoup</a>, <a href="http://www.idealware.org/">Idealware</a>, etc. (Link Research)</li>
<li><strong>Training</strong>: A discipline of doing things.  How are stories told, infrastructure built and actions communicated to regular people?</li>
<li><strong>Content Production</strong>: “The currency of the new world”</li>
<li><strong>Technical Support</strong>: An example: how to know when to build and when to buy</li>
<li><strong>Partnerships</strong>: Who is going to stand up for you?</li>
<li><strong>Planning</strong>: What are the components that revolve around your goal?</li>
</ol>
<h3>Other Links</h3>
<ul>
<li><a href="https://secure.spinproject.org/modinput4.php?modin=56">Strategic Communications Plan Generator</a> from The SPIN Project</li>
<li><a href="http://www.npowerseattle.org/education/resources/communications.htm">Tech Savvy Communications Toolkit</a> <strong style="display:none"><a href="http://time-travel.com/?aloha_scooby_doo">Aloha, Scooby-Doo rip</a></strong>  from NPower Seattle</li>
<li>Storytelling: <a href="http://www.agoodmanonline.com/">Andy Goodman</a>, <a href="http://sethgodin.typepad.com/">Seth Godin</a>, <a href="http://www.gilbert.org/">The Gilbert Center</a></li>
</ul>
<p><em>I shot this video with a <a href="http://www.amazon.com/Casio-Exilim-EX-S600-Digital-Optical/dp/B000E158D4">Casio EX-S600</a>, which shoots full-frame (640 x 480) MPEG-4 video.  With a two gigabyte SD Card it can shoot approximately an hour and a half of video at medium quality before its battery dies.  The Casio’s AVI wrapper is incompatible with iMovie (or any Quicktime decoder), so I first used <a href="http://www.techspansion.com/visualhub/">VisualHub</a> to repackage the video as an MP4 before importing into iMovie to add titles.  I exported from iMovie as DV and then converted that with VisualHub into MPEG-4.  Compressed and at quarter-frame (320 x 240) the entire video was 105 MB.  This time I uploaded to Google Video since <a href="http://blip.tv">Blip.tv</a> stalled out.</em></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.island94.org/2007/04/nonprofit-communications-2-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Airport Vehicles</title>
		<link>http://www.island94.org/2007/03/airport-vehicles/</link>
		<comments>http://www.island94.org/2007/03/airport-vehicles/#comments</comments>
		<pubDate>Thu, 15 Mar 2007 04:50:54 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[DC]]></category>
		<category><![CDATA[dulles]]></category>
		<category><![CDATA[paul]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[washingtonDC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Click To Play I had a two hour layover at Dulles Airport. Before I left, I was showing off my camera to my boss . It shoots full frame (640 x 480) mpeg-4 video; that’s over an hour of video on a two gigabyte card. My boss told me to make lots of videos. I [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p> <center>															<script type="text/javascript" src="http://blip.tv/scripts/pokkariPlayer.js"></script><script type="text/javascript" src="http://blip.tv/syndication/write_player?skin=js&#038;posts_id=174271&#038;source=3&#038;autoplay=true&#038;file_type=flv&#038;player_width=&#038;player_height=500"></script></p>
<div id="blip_movie_content_174271"><a href="http://blip.tv/file/get/Bensheldon-AirportVehicles233.flv" onclick="play_blip_movie_174271(); return false;"><img src="http://blip.tv/file/get/Bensheldon-AirportVehicles233.flv.jpg" border="0" title="Click To Play" /></a><br /><a href="http://blip.tv/file/get/Bensheldon-AirportVehicles233.flv" onclick="play_blip_movie_174271(); return false;">Click To Play</a></div>
<p>										</center></p>
<p>I had a two hour layover at Dulles Airport.  Before I left, I was showing off my camera to my boss .  It shoots full frame (640 x 480) mpeg-4 video; that’s over an hour of video on a two gigabyte card.  My boss told me to make lots of videos.</p>
<p>I shot and edited this entirely while waiting for my connecting flight.  I waited till my final destination to upload it though.</p>
<p>The video quality is a little poor from multiple compressions.  I edited it in iMovie and had to export and reimport the video in order to timelapse it to the speed I wanted.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.island94.org/2007/03/airport-vehicles/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
<enclosure url="http://blip.tv/file/get/Bensheldon-AirportVehicles233.flv" length="1835772" type="video/x-flv" />
		</item>
		<item>
		<title>Self-photography</title>
		<link>http://www.island94.org/2007/02/self-photography/</link>
		<comments>http://www.island94.org/2007/02/self-photography/#comments</comments>
		<pubDate>Thu, 01 Mar 2007 00:41:33 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[goofy]]></category>
		<category><![CDATA[photography]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[vlogarm]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Click To Play No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p><script src="http://blip.tv/scripts/pokkariPlayer.js" type="text/javascript"></script><script src="http://blip.tv/syndication/write_player?skin=js&amp;posts_id=162386&amp;source=3&amp;autoplay=true&amp;file_type=flv&amp;player_width=&amp;player_height=500" type="text/javascript"></script></p>
<div id="blip_movie_content_162386"><a onclick="play_blip_movie_162386(); return false;" href="http://blip.tv/file/get/Bensheldon-Selfphotography203.flv"><img title="Click To Play" src="http://blip.tv/file/get/Bensheldon-Selfphotography203.flv.jpg" border="0" alt="" /></a><br />
<a onclick="play_blip_movie_162386(); return false;" href="http://blip.tv/file/get/Bensheldon-Selfphotography203.flv">Click To Play</a></div>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.island94.org/2007/02/self-photography/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
<enclosure url="http://blip.tv/file/get/Bensheldon-Selfphotography203.flv" length="6215836" type="video/x-flv" />
		</item>
		<item>
		<title>The Future of Cable Access</title>
		<link>http://www.island94.org/2007/02/the-future-of-cable-access/</link>
		<comments>http://www.island94.org/2007/02/the-future-of-cable-access/#comments</comments>
		<pubDate>Mon, 26 Feb 2007 18:34:37 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Cable Access]]></category>
		<category><![CDATA[musings]]></category>
		<category><![CDATA[Television]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Click To Play Last Saturday was Beyond Broadcast 2007 and being a part of the The Future of Cable Access Working Group got my rear in gear to edit together some soundbites I shot at last November’s Alliance for Community Media Northeast Regional Conference. During the working group we got to hear the not-opposing viewpoints [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><center>															<script type="text/javascript" src="http://blip.tv/scripts/pokkariPlayer.js"></script><script type="text/javascript" src="http://blip.tv/syndication/write_player?skin=js&#038;posts_id=160857&#038;source=3&#038;autoplay=true&#038;file_type=flv&#038;player_width=&#038;player_height=500"></script></p>
<div id="blip_movie_content_160857"><a href="http://blip.tv/file/get/Bensheldon-WhatIsTheFutureOfCableAccessTV720.flv" onclick="play_blip_movie_160857(); return false;"><img src="http://blip.tv/file/get/Bensheldon-WhatIsTheFutureOfCableAccessTV720.flv.jpg" border="0" title="Click To Play" /></a><br /><a href="http://blip.tv/file/get/Bensheldon-WhatIsTheFutureOfCableAccessTV720.flv" onclick="play_blip_movie_160857(); return false;">Click To Play</a></div>
<p>										</center></p>
<div class="blip_description"></div>
<p>Last Saturday was <a href="http://beyondbroadcast.net/">Beyond Broadcast 2007</a> and being a part of the <em><a href="http://beyondbroadcast.net/wiki07/index.php?title=Working_Groups#The_Future_of_Public_Access_-_Held_in_The_Whitaker_Building_.28Bldg._56.29.2C_Room_169">The Future of Cable Access</a></em> Working Group got my rear in gear to edit together some soundbites I shot at last November’s Alliance for Community Media Northeast Regional Conference.</p>
<p>During the working group we got to hear the not-opposing viewpoints from <a href="http://citmedia.org/blog/2007/02/21/beyond-broadcast-future-of-public-access-tv">Dan Gillmor</a> and Jason Crowe:  Cable Access needs to change.  The question wasn’t even really what we want it to change into (the video lays it out pretty well), but <em>how can we bring about that change</em>.</p>
<p>I believe that the important part of Cable Access Television is <em>access</em>.  Access to:</p>
<ul>
<li>media production tools</li>
<li>media distribution systems</li>
<li>training to use them</li>
<li>media literacy education to understand them</li>
</ul>
<p>And all of this should be within the context of the needs of the local community.</p>
<p>Cable Access needs to embrace the internet, but it can’t do so as an end.  As gross simplification, Cable Access is television because 30 years ago, television was the dominant media model.  Today it is looking like the internet is about to become dominant.  But 30 years from now, will the internet (the current architecture/protocols) continue to be?</p>
<p><strong>Cable Access needs flexibility</strong>.  Cable Access should not become Internet Access, it must become <em>Media Access</em>.</p>
<p>Moving towards that vision is difficult.  The current state of Cable Access isn’t much of much of a state at all; it’s a series of thousands of isolated fiefdoms, linked together by nearly lone virtue that they took advantage of the same <a href="http://en.wikipedia.org/wiki/1984_Cable_Franchise_Policy_and_Communications_Act">legislation</a>.  A bad analogy: the First Amendment allows freedom of religion; that doesn’t mean that the church in your town talks to the one in mine.  Nobody even knows where all of them are, and our <a href="http://mappingaccess.com">attempts find them</a> aren’t yielding spectacular results.</p>
<p>But I also believe that that individualism and independence of stations and communities is a strength for the ideals of access.  Communities should be able to choose the tools and technologies that best serve their members: television, internet or beyond.</p>
</p>
<p>How can we support the independence and ability of Access to meet the needs of their individual communities, yet move forward technologically, logistically and ideologically?  This means moving towards the new technologies the internet (currently) affords, taking advantage of the economies of scale of thousands of media centers, and driving cooperation, communication and the idea that when it comes to <strong>media access</strong>—in any form and through any funding mechanism—“we’re in this together”.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.island94.org/2007/02/the-future-of-cable-access/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
<enclosure url="http://blip.tv/file/get/Bensheldon-WhatIsTheFutureOfCableAccessTV720.flv" length="7343945" type="video/x-flv" />
		</item>
		<item>
		<title>Happy Holidays 2006</title>
		<link>http://www.island94.org/2006/12/happy-holidays-2006/</link>
		<comments>http://www.island94.org/2006/12/happy-holidays-2006/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[buffoonery]]></category>
		<category><![CDATA[cheer]]></category>
		<category><![CDATA[goodwill]]></category>
		<category><![CDATA[holidays]]></category>
		<category><![CDATA[peace on earth]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Click To Play If you have problems with the flash video above, try this (mp4). No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p><center>															<script type="text/javascript" src="http://blip.tv/scripts/pokkariPlayer.js"></script><script type="text/javascript" src="http://blip.tv/syndication/write_player?skin=js&#038;posts_id=124303&#038;source=3&#038;autoplay=true&#038;file_type=flv&#038;player_width=&#038;player_height="></script>
<div id="blip_movie_content_124303"><a href="http://blip.tv/file/get/Bensheldon-HappyHolidays2006530.flv" onclick="play_blip_movie_124303(); return false;"><img src="http://blip.tv/file/get/Bensheldon-HappyHolidays2006530.flv.jpg" border="0" title="Click To Play" /></a><br /><a href="http://blip.tv/file/get/Bensheldon-HappyHolidays2006530.flv" onclick="play_blip_movie_124303(); return false;">Click To Play</a></div>
<p>If you have problems with the flash video above, <a href="http://blip.tv/file/get/Bensheldon-HappyHolidays2006530.mp4">try this</a> (mp4).</p>
<p></center>
<div class="blip_description"></div>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.island94.org/2006/12/happy-holidays-2006/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Happy Birthday Rebecca</title>
		<link>http://www.island94.org/2006/12/happy-birthday-rebecca/</link>
		<comments>http://www.island94.org/2006/12/happy-birthday-rebecca/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[birthday]]></category>
		<category><![CDATA[favorites]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[Rebecca]]></category>
		<category><![CDATA[recommendations]]></category>
		<category><![CDATA[sentence]]></category>
		<category><![CDATA[shadow]]></category>
		<category><![CDATA[song]]></category>
		<category><![CDATA[trees]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[My friend and coworker Rebecca made an extensive list of things she’d like for her birthday. I really like her rationale: my list is all about ‘you’ because I’m curious who will answer, what you will come up with, and because it will mean that on my birthday I’ll be thinking about people thinking about [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>My friend and coworker <a href="http://circuitous.org/rebecca/">Rebecca</a> made an extensive list of things she’d like for her <a href="http://circuitous.org/rebecca/2006/12/12/birthday-list/">birthday</a>.  I really like her rationale:</p>
<blockquote><p>my list is all about ‘you’ because I’m curious who will answer, what you will come up with, and because it will mean that on my birthday I’ll be thinking about people thinking about me, which is a cozy thing to think about.</p></blockquote>
<p>So here I am and all the best on your twenty-third…</p>
<h3>a picture of your shadow</h3>
<p><a href="http://www.flickr.com/photos/bensheldon/325591780/" title="Photo Sharing"><img src="http://static.flickr.com/140/325591780_9e96c6274f.jpg" width="500" height="375" alt="My shadow" /></a></p>
<p><!--break--></p>
<h3>a recording of you reading a poem, singing a song, or saying a sentence</h3>
<p><a href="/files/Ben_Pint-Pot-and-Billy.mp3">Pint Pot and Billy</a> From <em>Eureka: The songs that made Austrailia</em> compiled by Warrent Fahey.  Version as sung by Cyril Duncan of Hawthorne Queensland.  Recorded in one-track with Garageband and my MacBook’s built-in mic.</p>
<h3>a sentence with a word you like</h3>
<p><em>Seven</em> knights drove up to Flushing.</p>
<h3>a description of a tree you know</h3>
<p>I know a family of trees on a block along my jogging route in my neighborhood.  Jamaica Plain is known to be full of trees, but usually the varieties are pretty well mixed.  On this block though, a whole grove of Ginkgo trees grows, or as close to a grove as you can get in urban Boston.</p>
<p>The trees are all about 20 feet tall with rough gray bark.  In the spring and summer they are deep green.  In the Fall they all turn a self-conscious bright yellow, in contrast to the other trees’ reds and oranges.</p>
<p>One tree in the grove is set back off the street.  It has a wound on its sunset side.  The tree is also female, the only one, and is neighbor to the grove’s lone outsider: a juvenile Callery Pear that is always losing branches.</p>
<h3>an mp3 of a song you like</h3>
<p><a href="http://houseguest.org/MP3/electricpoliteness/GreatestGatsbees.mp3">Greatest Gatsbees</a>(mp3) by (famous band) <a href="http://houseguest.org">Houseguest</a>.  Goes great with <a href="http://clapyourhandssayyeah.com/">Clap Your Hands Say Yeah</a> and <a href="http://www.myspace.com/wolfparade">Wolf Parade</a>.</p>
<h3>a video of you eating a cookie</h3>
<p><a href="http://blip.tv/file/get/Bensheldon-EatingACookie489.mp4"><img src="http://blip.tv/uploadedFiles/Bensheldon-EatingACookie489-452.jpg" /><br />
</a></p>
<h3>a drawing of your mittens/gloves</h3>
<p><a href="http://www.flickr.com/photos/bensheldon/325664414/" title="Photo Sharing"><img src="http://static.flickr.com/140/325664414_d912306407.jpg" width="500" height="434" alt="My mittens" /></a></p>
<h3>the html hex or rgb of a color you like</h3>
<p><span style="padding: 10px; background: #14D44A; color: #fff; font-weight: bold">20 212 74 or #14D44A</div>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.island94.org/2006/12/happy-birthday-rebecca/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gone bicycling</title>
		<link>http://www.island94.org/2006/07/gone-bicycling/</link>
		<comments>http://www.island94.org/2006/07/gone-bicycling/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[bicycle]]></category>
		<category><![CDATA[Boston]]></category>
		<category><![CDATA[Jamaica Plain]]></category>
		<category><![CDATA[summer]]></category>
		<category><![CDATA[time lapse]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[The heatwave in Boston finally broke yesterday bringing some much needed coolness to the city. As soon as I got home from work, I hopped on my bike and took a nice relaxing ride. In Jamaica Plain, where I live, there is a long bike and walking path that follows the Orange Line subway nearly [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>The heatwave in Boston finally broke yesterday bringing some much needed coolness to the city. As soon as I got home from work, I hopped on my bike and took a nice relaxing ride.  In Jamaica Plain, where I live, there is a long bike and walking path that follows the Orange Line subway nearly into Downtown Boston.  The path runs from Forest Hills all the way to Back Bay Station near Copley Plaza.</p>
<div style="text-align:center";>
<p>	<a href="http://blip.tv/file/get/Bensheldon-GoneBicycling824.mp4?source=3"><img border="0" src="http://blip.tv/uploadedFiles/Bensheldon-GoneBicycling633.jpg" /></a><br />
	<br />
	<a href="http://blip.tv/file/get/Bensheldon-GoneBicycling824.mp4?source=3">Watch the Video</a></p>
</div>
<p>music by Mutandina<br />
“Juego“<br />
magnatune.com</p>
<p><!--break--><br />
I strapped the camera to my bike using some velcro cable ties and a sock for shock absorption.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.island94.org/2006/07/gone-bicycling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Making smoothies</title>
		<link>http://www.island94.org/2006/07/making-smoothies/</link>
		<comments>http://www.island94.org/2006/07/making-smoothies/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Boston]]></category>
		<category><![CDATA[Danielle]]></category>
		<category><![CDATA[food]]></category>
		<category><![CDATA[hot]]></category>
		<category><![CDATA[Saul]]></category>
		<category><![CDATA[smoothie]]></category>
		<category><![CDATA[strawberries]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[weather]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Another smoothie post… Boston is still scorching and nothing is better than some ground up fruit and ice. Sure, the storebought strawberries out here on the East coast are about as flavorful as a glass of water, but they add nice color. This is strawberry-peach-orange I believe. Watch the Video No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p><em>Another <a href="/taxonomy/term/126">smoothie post</a>…</em></p>
<p>Boston is still scorching and nothing is better than some ground up fruit and ice. Sure, the storebought strawberries out here on the East coast are about as flavorful as a glass of water, but they add nice color. This is strawberry-peach-orange I believe.</p>
<div style="text-align:center">
	<a href="http://blip.tv/file/get/Bensheldon-MakingSmoothies470.mp4?source=3"><img border="0" src="http://blip.tv/uploadedFiles/Bensheldon-MakingSmoothies470-837.jpg" /></a><br />
	<br />
	<a href="http://blip.tv/file/get/Bensheldon-MakingSmoothies470.mp4?source=3">Watch the Video</a></p>
</div>
<p><!--break--></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.island94.org/2006/07/making-smoothies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Two, two, two yolks in one</title>
		<link>http://www.island94.org/2006/07/two-two-two-yolks-in-one/</link>
		<comments>http://www.island94.org/2006/07/two-two-two-yolks-in-one/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Dean]]></category>
		<category><![CDATA[eggs]]></category>
		<category><![CDATA[food]]></category>
		<category><![CDATA[freaky]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[My roommate Dean created this video about some peculiarities in our store bought eggs: Watch the Video Now I’m not sure what these guy’s are doing with their chickens, but frankly the result is a little freaky. With a name like “Lally Farms,” I think anyone would be suspicious. I made some tacos tonight (eggs, [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>My roommate <a href="http://notthemessiah.net">Dean</a> created this video about some peculiarities in our store bought eggs:</p>
<p><a href="http://blip.tv/file/get/Deaner-2xYolk193.mp4?source=3"><img border="0" src="http://blip.tv/uploadedFiles/Deaner-SixEggsXTwoYolksTwelveYolks959.jpg" class="centered" /></a><br />
</p>
<div style="text-align:center"><a href="http://blip.tv/file/get/Deaner-2xYolk193.mp4?source=3" >Watch the Video</a></div>
<p>Now I’m not sure what these guy’s are doing with their chickens, but frankly the result is a little freaky.  With a name like “Lally Farms,” I think anyone would be suspicious.</p>
<p>I made some tacos tonight (eggs, grated carrot and some sliced red pepper on top) and was greeted to the doubly-yolked surprise.  Though honestly, the surprise has worn off since this has been going on for weeks with multiple cartons of eggs.  Now it’s just foreboding.</p>
<p>+Update: Checkout <a href="http://www.ranablog.com/archives/000331.php">this blog entry</a> from Notes on an Eclectic Mind about what double yolks may signify.+</p>
<p><!--break--></p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.island94.org/2006/07/two-two-two-yolks-in-one/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced

Served from: www.island94.org @ 2012-02-10 02:17:37 -->
